impression

This commit is contained in:
Stephane 2025-08-03 22:04:25 +03:00
parent 9fdf8d084f
commit 1207eeff13

View File

@ -71,223 +71,267 @@ class PlatformPrintService {
pdf.addPage( pdf.addPage(
pw.Page( pw.Page(
pageFormat: ticket58mmFormat, pageFormat: ticket58mmFormat,
margin: const pw.EdgeInsets.all(2), // 🔧 Marges minimales
build: (pw.Context context) { build: (pw.Context context) {
return pw.Column( return pw.Container(
crossAxisAlignment: pw.CrossAxisAlignment.center, width: double.infinity, // 🔧 Forcer la largeur complète
children: [ child: pw.Column(
// En-tête Restaurant (centré et compact) crossAxisAlignment:
pw.Text( pw.CrossAxisAlignment.start, // 🔧 Alignement à gauche
restaurantInfo['nom']!, children: [
style: pw.TextStyle( // En-tête Restaurant (centré et compact)
fontSize: titleSize, pw.Container(
fontWeight: pw.FontWeight.bold, width: double.infinity,
child: pw.Text(
restaurantInfo['nom']!,
style: pw.TextStyle(
fontSize: titleSize,
fontWeight: pw.FontWeight.bold,
),
textAlign: pw.TextAlign.center,
),
), ),
textAlign: pw.TextAlign.center,
),
pw.SizedBox(height: 1), pw.SizedBox(height: 1),
pw.Text( pw.Container(
restaurantInfo['adresse']!, width: double.infinity,
style: pw.TextStyle(fontSize: smallSize), child: pw.Text(
textAlign: pw.TextAlign.center, restaurantInfo['adresse']!,
), style: pw.TextStyle(fontSize: smallSize),
textAlign: pw.TextAlign.center,
),
),
pw.Text( pw.Container(
restaurantInfo['ville']!, width: double.infinity,
style: pw.TextStyle(fontSize: smallSize), child: pw.Text(
textAlign: pw.TextAlign.center, restaurantInfo['ville']!,
), style: pw.TextStyle(fontSize: smallSize),
textAlign: pw.TextAlign.center,
),
),
pw.Text( pw.Container(
'Tel: ${restaurantInfo['contact']!}', width: double.infinity,
style: pw.TextStyle(fontSize: smallSize), child: pw.Text(
textAlign: pw.TextAlign.center, 'Tel: ${restaurantInfo['contact']!}',
), style: pw.TextStyle(fontSize: smallSize),
textAlign: pw.TextAlign.center,
),
),
pw.SizedBox(height: 3), pw.SizedBox(height: 3),
// Ligne de séparation // Ligne de séparation
pw.Container( pw.Container(
width: double.infinity, width: double.infinity,
height: 0.5, height: 0.5,
color: PdfColors.black, color: PdfColors.black,
), ),
pw.SizedBox(height: 2), pw.SizedBox(height: 2),
// Informations ticket // Informations ticket
pw.Row( pw.Container(
mainAxisAlignment: pw.MainAxisAlignment.spaceBetween, width: double.infinity,
children: [ child: pw.Row(
pw.Text( mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,
'Ticket: $factureNumber', children: [
pw.Text(
'Ticket: $factureNumber',
style: pw.TextStyle(
fontSize: bodySize,
fontWeight: pw.FontWeight.bold,
),
),
],
),
),
pw.SizedBox(height: 1),
pw.Container(
width: double.infinity,
child: pw.Row(
mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,
children: [
pw.Text(
_formatDate(dateTime),
style: pw.TextStyle(fontSize: smallSize),
),
pw.Text(
_formatTime(dateTime),
style: pw.TextStyle(fontSize: smallSize),
),
],
),
),
pw.SizedBox(height: 2),
// Ligne de séparation
pw.Container(
width: double.infinity,
height: 0.5,
color: PdfColors.black,
),
pw.SizedBox(height: 2),
// Articles (format très compact)
...commande.items
.map(
(item) => pw.Container(
width: double.infinity, // 🔧 Largeur complète
margin: const pw.EdgeInsets.only(bottom: 1),
child: pw.Column(
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: [
// Nom du plat
pw.Container(
width: double.infinity,
child: pw.Text(
'${item.menuNom}',
style: pw.TextStyle(fontSize: bodySize),
maxLines: 2,
),
),
// Quantité, prix unitaire et total sur une ligne
pw.Container(
width: double.infinity,
child: pw.Row(
mainAxisAlignment:
pw.MainAxisAlignment.spaceBetween,
children: [
pw.Text(
'${item.quantite}x ${item.prixUnitaire.toStringAsFixed(2)}MGA',
style: pw.TextStyle(fontSize: smallSize),
),
pw.Text(
'${(item.prixUnitaire * item.quantite).toStringAsFixed(2)}MGA',
style: pw.TextStyle(
fontSize: bodySize,
fontWeight: pw.FontWeight.bold,
),
),
],
),
),
],
),
),
)
.toList(),
pw.SizedBox(height: 2),
// Ligne de séparation
pw.Container(
width: double.infinity,
height: 0.5,
color: PdfColors.black,
),
pw.SizedBox(height: 2),
// Total
pw.Container(
width: double.infinity,
child: pw.Row(
mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,
children: [
pw.Text(
'TOTAL',
style: pw.TextStyle(
fontSize: titleSize,
fontWeight: pw.FontWeight.bold,
),
),
pw.Text(
'${commande.totalTtc.toStringAsFixed(2)}MGA',
style: pw.TextStyle(
fontSize: titleSize,
fontWeight: pw.FontWeight.bold,
),
),
],
),
),
pw.SizedBox(height: 3),
// Mode de paiement
pw.Container(
width: double.infinity,
child: pw.Text(
'Paiement: ${paymentMethod.toLowerCase()}',
style: pw.TextStyle(fontSize: bodySize),
textAlign: pw.TextAlign.center,
),
),
pw.SizedBox(height: 3),
// Ligne de séparation
pw.Container(
width: double.infinity,
height: 0.5,
color: PdfColors.black,
),
pw.SizedBox(height: 2),
// Message de remerciement
pw.Container(
width: double.infinity,
child: pw.Text(
'Merci de votre visite !',
style: pw.TextStyle( style: pw.TextStyle(
fontSize: bodySize, fontSize: bodySize,
fontWeight: pw.FontWeight.bold, fontStyle: pw.FontStyle.italic,
), ),
textAlign: pw.TextAlign.center,
), ),
pw.Text(
'Via: ${commande.tablename ?? 'Table inconnue'}',
style: pw.TextStyle(fontSize: bodySize),
),
],
),
pw.SizedBox(height: 1),
pw.Row(
mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,
children: [
pw.Text(
_formatDate(dateTime),
style: pw.TextStyle(fontSize: smallSize),
),
pw.Text(
_formatTime(dateTime),
style: pw.TextStyle(fontSize: smallSize),
),
],
),
pw.SizedBox(height: 2),
// Ligne de séparation
pw.Container(
width: double.infinity,
height: 0.5,
color: PdfColors.black,
),
pw.SizedBox(height: 2),
// Articles (format très compact)
...commande.items
.map(
(item) => pw.Container(
margin: const pw.EdgeInsets.only(bottom: 1),
child: pw.Column(
crossAxisAlignment: pw.CrossAxisAlignment.start,
children: [
// Nom du plat
pw.Text(
'${item.menuNom}',
style: pw.TextStyle(fontSize: bodySize),
maxLines: 2,
),
// Quantité, prix unitaire et total sur une ligne
pw.Row(
mainAxisAlignment:
pw.MainAxisAlignment.spaceBetween,
children: [
pw.Text(
'${item.quantite}x ${item.prixUnitaire.toStringAsFixed(2)}MGA',
style: pw.TextStyle(fontSize: smallSize),
),
pw.Text(
'${(item.prixUnitaire * item.quantite).toStringAsFixed(2)}MGA',
style: pw.TextStyle(
fontSize: bodySize,
fontWeight: pw.FontWeight.bold,
),
),
],
),
],
),
),
)
.toList(),
pw.SizedBox(height: 2),
// Ligne de séparation
pw.Container(
width: double.infinity,
height: 0.5,
color: PdfColors.black,
),
pw.SizedBox(height: 2),
// Total
pw.Row(
mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,
children: [
pw.Text(
'TOTAL',
style: pw.TextStyle(
fontSize: titleSize,
fontWeight: pw.FontWeight.bold,
),
),
pw.Text(
'${commande.totalTtc.toStringAsFixed(2)}MGA',
style: pw.TextStyle(
fontSize: titleSize,
fontWeight: pw.FontWeight.bold,
),
),
],
),
pw.SizedBox(height: 3),
// Mode de paiement
pw.Text(
'Paiement: ${_getPaymentMethodText(paymentMethod)}',
style: pw.TextStyle(fontSize: bodySize),
textAlign: pw.TextAlign.center,
),
pw.SizedBox(height: 3),
// Ligne de séparation
pw.Container(
width: double.infinity,
height: 0.5,
color: PdfColors.black,
),
pw.SizedBox(height: 2),
// Message de remerciement
pw.Text(
'Merci de votre visite !',
style: pw.TextStyle(
fontSize: bodySize,
fontStyle: pw.FontStyle.italic,
), ),
textAlign: pw.TextAlign.center,
),
pw.Text( pw.Container(
'A bientôt !', width: double.infinity,
style: pw.TextStyle(fontSize: smallSize), child: pw.Text(
textAlign: pw.TextAlign.center, 'A bientôt !',
), style: pw.TextStyle(fontSize: smallSize),
textAlign: pw.TextAlign.center,
),
),
pw.SizedBox(height: 3), pw.SizedBox(height: 3),
// Code de suivi (optionnel) // Code de suivi (optionnel)
pw.Text( pw.Container(
'Code: ${factureNumber}', width: double.infinity,
style: pw.TextStyle(fontSize: smallSize), child: pw.Text(
textAlign: pw.TextAlign.center, 'Code: ${factureNumber}',
), style: pw.TextStyle(fontSize: smallSize),
textAlign: pw.TextAlign.center,
),
),
pw.SizedBox(height: 4), pw.SizedBox(height: 4),
// Ligne de découpe // Ligne de découpe
pw.Text( pw.Container(
'- - - - - - - - - - - - - - - -', width: double.infinity,
style: pw.TextStyle(fontSize: smallSize), child: pw.Text(
textAlign: pw.TextAlign.center, '- - - - - - - - - - - - - - - -',
), style: pw.TextStyle(fontSize: smallSize),
textAlign: pw.TextAlign.center,
),
),
pw.SizedBox(height: 2), pw.SizedBox(height: 2),
], ],
),
); );
}, },
), ),