From 4eece81eb1046364a0365fac4d5a4cd65a8fb596 Mon Sep 17 00:00:00 2001 From: efrilm Date: Thu, 6 Nov 2025 18:59:10 +0700 Subject: [PATCH] print ticket --- .../printer_form/printer_form_bloc.dart | 5 ++ .../components/print/print_ui.dart | 40 +++++++++++ .../print/receipt_component_builder.dart | 8 +-- .../printer/setting_printer_ticket.dart | 70 +++++++++++++------ 4 files changed, 95 insertions(+), 28 deletions(-) diff --git a/lib/application/printer/printer_form/printer_form_bloc.dart b/lib/application/printer/printer_form/printer_form_bloc.dart index d634a05..d8e3e1d 100644 --- a/lib/application/printer/printer_form/printer_form_bloc.dart +++ b/lib/application/printer/printer_form/printer_form_bloc.dart @@ -143,6 +143,11 @@ class PrinterFormBloc extends Bloc { outlet: currentOutlet, cashierName: 'Kasir Test', ); + } else if (e.code == 'ticket') { + printValue = await PrintUi().printTicket( + order: Order.mockOrder(), + outlet: currentOutlet, + ); } final printer = Printer.fromTest( diff --git a/lib/presentation/components/print/print_ui.dart b/lib/presentation/components/print/print_ui.dart index ee97e86..b2823a5 100644 --- a/lib/presentation/components/print/print_ui.dart +++ b/lib/presentation/components/print/print_ui.dart @@ -240,4 +240,44 @@ class PrintUi { return bytes; } + + Future> printTicket({ + required Order order, + required Outlet outlet, + int paper = 58, + }) async { + List bytes = []; + + final profile = await CapabilityProfile.load(); + final generator = Generator( + paper == 58 ? PaperSize.mm58 : PaperSize.mm80, + profile, + ); + final builder = ReceiptComponentBuilder( + generator: generator, + paperSize: 58, + ); + + bytes += generator.reset(); + + bytes += builder.header( + outletName: outlet.name, + address: outlet.address, + phoneNumber: outlet.phoneNumber, + ); + + bytes += builder.dateTime(DateTime.now()); + bytes += builder.row2Columns('Code No.', order.orderNumber); + bytes += builder.separator(); + + bytes += builder.emptyLines(2); + bytes += builder.qrCode('1267128127182182'); + bytes += builder.emptyLines(1); + bytes += builder.textCenter('1267128127182182'); + bytes += builder.emptyLines(2); + + bytes += builder.footer(); + + return bytes; + } } diff --git a/lib/presentation/components/print/receipt_component_builder.dart b/lib/presentation/components/print/receipt_component_builder.dart index fdb8eed..91a7752 100644 --- a/lib/presentation/components/print/receipt_component_builder.dart +++ b/lib/presentation/components/print/receipt_component_builder.dart @@ -275,9 +275,7 @@ class ReceiptComponentBuilder { } /// Print barcode - // List barcode(String data, {BarcodeType type = BarcodeType.code128}) { - // return generator.barcode( - // Barcode.code128(data), - // ); - // } + List barcode(String data) { + return generator.barcode(Barcode.code128(data.codeUnits)); + } } diff --git a/lib/presentation/pages/main/pages/setting/sections/printer/setting_printer_ticket.dart b/lib/presentation/pages/main/pages/setting/sections/printer/setting_printer_ticket.dart index f692c71..f0ea2d6 100644 --- a/lib/presentation/pages/main/pages/setting/sections/printer/setting_printer_ticket.dart +++ b/lib/presentation/pages/main/pages/setting/sections/printer/setting_printer_ticket.dart @@ -29,29 +29,47 @@ class _SettingPrinterTicketState extends State { @override Widget build(BuildContext context) { - return BlocListener( - listenWhen: (p, c) => - p.failureOrDeleteSuccess != c.failureOrDeleteSuccess, - listener: (context, state) { - state.failureOrDeleteSuccess.fold( - () => null, - (either) => either.fold( - (f) => AppFlushbar.showPrinterFailureToast(context, f), - (_) { - if (context.mounted) { - context.read().add( - const PrinterLoaderEvent.getByCode('ticket'), - ); - } + return MultiBlocListener( + listeners: [ + BlocListener( + listenWhen: (p, c) => + p.failureOrDeleteSuccess != c.failureOrDeleteSuccess, + listener: (context, state) { + state.failureOrDeleteSuccess.fold( + () => null, + (either) => either.fold( + (f) => AppFlushbar.showPrinterFailureToast(context, f), + (_) { + if (context.mounted) { + context.read().add( + const PrinterLoaderEvent.getByCode('ticket'), + ); + } - AppFlushbar.showSuccess( - context, - 'Printer ticket berhasil dihapus', - ); - }, - ), - ); - }, + AppFlushbar.showSuccess( + context, + 'Printer ticket berhasil dihapus', + ); + }, + ), + ); + }, + ), + BlocListener( + listenWhen: (p, c) => p.failureOrPrintTest != c.failureOrPrintTest, + listener: (context, state) { + state.failureOrPrintTest.fold( + () => null, + (either) => either.fold( + (f) => AppFlushbar.showPrinterFailureToast(context, f), + (either) { + AppFlushbar.showSuccess(context, 'Printer test berhasil'); + }, + ), + ); + }, + ), + ], child: Material( color: AppColor.background, child: SingleChildScrollView( @@ -101,10 +119,16 @@ class _SettingPrinterTicketState extends State { isEdit = true; }); }, - onDelete: () => context.read().add( PrinterFormEvent.deleted(state.printer.id), ), + onTestPrint: () => + context.read().add( + PrinterFormEvent.printTest( + code: 'ticket', + macAccdress: state.printer.address, + ), + ), ), (f) => f.maybeMap( orElse: () => ErrorCard(