import 'dart:typed_data'; import 'package:pdf/pdf.dart'; import 'package:pdf/widgets.dart' as pw; import '../../models/models.dart'; import 'package:printing/printing.dart'; import 'package:flutter/services.dart' show rootBundle; // Future generateTicket(Pedido pedido) async { // final pdf = pw.Document(); // final image = pw.MemoryImage( // (await rootBundle.load('assets/JoshiLogo-BN.png')).buffer.asUint8List(), // ); // pdf.addPage( // pw.Page( // pageFormat: PdfPageFormat.roll57, // build: (pw.Context context) { // return pw.Column( // crossAxisAlignment: pw.CrossAxisAlignment.center, // children: [ // pw.Center(child: pw.Image(image, width: 50, height: 50)), // pw.SizedBox(height: 10), // pw.Text('Joshi Papas Tu Sabor tu Estilo', // style: // pw.TextStyle(fontSize: 12, fontWeight: pw.FontWeight.bold)), // pw.SizedBox(height: 10), // pw.Text('RFC: XXXX0000', style: pw.TextStyle(fontSize: 9)), // pw.Text('Dirección: Calle Falsa 123', // style: pw.TextStyle(fontSize: 9)), // pw.Text('Ciudad: Ciudad Ejemplo', style: pw.TextStyle(fontSize: 9)), // pw.Text('Régimen: General de Ley', // style: pw.TextStyle(fontSize: 9)), // pw.SizedBox(height: 10), // pw.Text('Folio: ${pedido.folio}', // style: // pw.TextStyle(fontWeight: pw.FontWeight.bold, fontSize: 10)), // pw.SizedBox(height: 10), // ...pedido.productos.map( // (producto) => pw.Row( // mainAxisAlignment: pw.MainAxisAlignment.spaceBetween, // children: [ // pw.Expanded( // flex: 2, // child: pw.Text( // producto.producto?.nombre ?? "Producto no especificado", // style: pw.TextStyle(fontSize: 7)), // ), // pw.Expanded( // flex: 1, // child: pw.Text('x${producto.cantidad}', // style: pw.TextStyle(fontSize: 9)), // ), // pw.Expanded( // flex: 1, // child: pw.Text('\$${producto.producto?.precio}', // style: pw.TextStyle(fontSize: 9)), // ), // ], // ), // ), // pw.Divider(), // pw.Row( // mainAxisAlignment: pw.MainAxisAlignment.spaceBetween, // children: [ // pw.Text('Total:', // style: pw.TextStyle( // fontWeight: pw.FontWeight.bold, fontSize: 9)), // pw.Padding( // padding: pw.EdgeInsets.only(right: 20), // child: pw.Text( // '\$${pedido.productos.fold(0.0, (sum, p) => sum + (double.parse(p.producto?.precio ?? '0') * (p.cantidad ?? 1)))}', // style: pw.TextStyle( // fontWeight: pw.FontWeight.bold, fontSize: 9)), // ), // ], // ), // pw.SizedBox(height: 5), // pw.Text('¡GRACIAS POR SU COMPRA!', // style: // pw.TextStyle(fontSize: 8, fontWeight: pw.FontWeight.bold)), // pw.SizedBox(height: 20), // pw.Divider(), // pw.SizedBox(height: 10), // // Existing Ticket Content // pw.Text('Folio: ${pedido.folio}', // style: // pw.TextStyle(fontWeight: pw.FontWeight.bold, fontSize: 9)), // pw.SizedBox(height: 10), // pw.Text('Cliente: ${pedido.nombreCliente}', // style: // pw.TextStyle(fontWeight: pw.FontWeight.bold, fontSize: 9)), // pw.SizedBox(height: 10), // ...pedido.productos.map( // (producto) => pw.Row( // mainAxisAlignment: pw.MainAxisAlignment.start, // children: [ // pw.Expanded( // flex: 3, // child: pw.Text( // producto.producto?.nombre ?? "Producto no especificado", // style: pw.TextStyle(fontSize: 9)), // ), // pw.Expanded( // flex: 1, // child: pw.Text('x${producto.cantidad}', // style: pw.TextStyle(fontSize: 9)), // ), // ], // ), // ), // pw.SizedBox(height: 80), // ], // ); // }, // ), // ); // return Uint8List.fromList(await pdf.save()); // } Future primerTicket(Pedido pedido) async { final pdf = pw.Document(); final image = pw.MemoryImage( (await rootBundle.load('assets/JoshiLogo-BN.png')).buffer.asUint8List(), ); pdf.addPage(pw.Page( pageFormat: PdfPageFormat.roll57, build: (pw.Context context) { return pw.Column( crossAxisAlignment: pw.CrossAxisAlignment.center, children: [ pw.Padding( padding: const pw.EdgeInsets.only(right: 20), child: pw.Center(child: pw.Image(image, width: 50, height: 50))), pw.SizedBox(height: 10), pw.Padding( padding: const pw.EdgeInsets.only(right: 15), child: pw.Column(children: [ pw.Text('Joshi Papas Tu Sabor tu Estilo', style: pw.TextStyle( fontSize: 12, fontWeight: pw.FontWeight.bold)), pw.SizedBox(height: 10), pw.Text('Fecha: ${pedido.peticion}', style: const pw.TextStyle(fontSize: 9)), pw.Text('RFC: XXXX0000', style: const pw.TextStyle(fontSize: 9)), pw.Text('Dirección: Calle Falsa 123', style: const pw.TextStyle(fontSize: 9)), pw.Text('Ciudad: Ciudad Ejemplo', style: const pw.TextStyle(fontSize: 9)), pw.Text('Régimen: General de Ley', style: const pw.TextStyle(fontSize: 9)), ])), pw.SizedBox(height: 10), pw.Text('Folio: ${pedido.folio}', style: pw.TextStyle( fontWeight: pw.FontWeight.bold, fontSize: 10)), pw.SizedBox(height: 10), ...pedido.productos.map( (producto) => pw.Row( mainAxisAlignment: pw.MainAxisAlignment.spaceBetween, children: [ pw.Expanded( flex: 2, child: pw.Text( producto.producto?.nombre ?? "Producto no especificado", style: const pw.TextStyle(fontSize: 7)), ), pw.Expanded( flex: 1, child: pw.Text('x${producto.cantidad}', style: const pw.TextStyle(fontSize: 9)), ), pw.Expanded( flex: 1, child: pw.Text('\$${producto.producto?.precio}', style: const pw.TextStyle(fontSize: 9)), ), ], ), ), pw.Divider(), pw.Row( mainAxisAlignment: pw.MainAxisAlignment.spaceBetween, children: [ pw.Text('Total:', style: pw.TextStyle( fontWeight: pw.FontWeight.bold, fontSize: 9)), pw.Padding( padding: const pw.EdgeInsets.only(right: 20), child: pw.Text( '\$${pedido.productos.fold(0.0, (sum, p) => sum + (double.parse(p.producto?.precio ?? '0') * (p.cantidad ?? 1)))}', style: pw.TextStyle( fontWeight: pw.FontWeight.bold, fontSize: 9)), ), ], ), pw.SizedBox(height: 5), pw.Padding( padding: const pw.EdgeInsets.only(right: 15), child: pw.Text('¡GRACIAS POR SU COMPRA!', style: pw.TextStyle( fontSize: 8, fontWeight: pw.FontWeight.bold))), pw.SizedBox(height: 20), pw.Divider(), ]); })); return Uint8List.fromList(await pdf.save()); } Future segundoTicket(Pedido pedido) async { final pdf = pw.Document(); pdf.addPage(pw.Page( pageFormat: PdfPageFormat.roll57, build: (pw.Context context) { List content = [ pw.SizedBox(height: 10), pw.Padding( padding: const pw.EdgeInsets.only(right: 15), child: pw.Text('Fecha: ${pedido.peticion}', style: pw.TextStyle( fontSize: 9, fontWeight: pw.FontWeight.bold))), pw.SizedBox(height: 5), pw.Text('Folio: ${pedido.folio}', style: pw.TextStyle(fontWeight: pw.FontWeight.bold, fontSize: 9)), pw.SizedBox(height: 10), pw.Text('Cliente: ${pedido.nombreCliente}', style: pw.TextStyle(fontWeight: pw.FontWeight.bold, fontSize: 9)), pw.SizedBox(height: 10), ]; content.addAll(pedido.productos.map((producto) => pw.Row( mainAxisAlignment: pw.MainAxisAlignment.start, children: [ pw.Expanded( flex: 3, child: pw.Text( producto.producto?.nombre ?? "Producto no especificado", style: const pw.TextStyle(fontSize: 9)), ), pw.Expanded( flex: 1, child: pw.Text('x${producto.cantidad}', style: const pw.TextStyle(fontSize: 9)), ), ], ))); if (pedido.comentarios != null && pedido.comentarios!.isNotEmpty) { content.add(pw.SizedBox(height: 10)); content.add(pw.Text('Comentarios:', style: pw.TextStyle(fontWeight: pw.FontWeight.bold, fontSize: 9))); content.add(pw.Padding( padding: const pw.EdgeInsets.only(right: 15), child: pw.Text(pedido.comentarios!, style: const pw.TextStyle(fontSize: 9)), )); } content.add( pw.SizedBox(height: 20)); // Some spacing before finalizing the page return pw.Column( crossAxisAlignment: pw.CrossAxisAlignment.center, children: content); })); return Uint8List.fromList(await pdf.save()); } Future printPdf(Uint8List pdfBytes) async { await Printing.layoutPdf( onLayout: (PdfPageFormat format) => pdfBytes, ); } void printTickets(Pedido pedido) async { Uint8List firstTicket = await primerTicket(pedido); await printPdf(firstTicket); Uint8List secondTicket = await segundoTicket(pedido); await printPdf(secondTicket); }