print ticket

This commit is contained in:
efrilm 2025-11-06 18:59:10 +07:00
parent 873dd7e224
commit 4eece81eb1
4 changed files with 95 additions and 28 deletions

View File

@ -143,6 +143,11 @@ class PrinterFormBloc extends Bloc<PrinterFormEvent, PrinterFormState> {
outlet: currentOutlet,
cashierName: 'Kasir Test',
);
} else if (e.code == 'ticket') {
printValue = await PrintUi().printTicket(
order: Order.mockOrder(),
outlet: currentOutlet,
);
}
final printer = Printer.fromTest(

View File

@ -240,4 +240,44 @@ class PrintUi {
return bytes;
}
Future<List<int>> printTicket({
required Order order,
required Outlet outlet,
int paper = 58,
}) async {
List<int> 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;
}
}

View File

@ -275,9 +275,7 @@ class ReceiptComponentBuilder {
}
/// Print barcode
// List<int> barcode(String data, {BarcodeType type = BarcodeType.code128}) {
// return generator.barcode(
// Barcode.code128(data),
// );
// }
List<int> barcode(String data) {
return generator.barcode(Barcode.code128(data.codeUnits));
}
}

View File

@ -29,29 +29,47 @@ class _SettingPrinterTicketState extends State<SettingPrinterTicket> {
@override
Widget build(BuildContext context) {
return BlocListener<PrinterFormBloc, PrinterFormState>(
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<PrinterLoaderBloc>().add(
const PrinterLoaderEvent.getByCode('ticket'),
);
}
return MultiBlocListener(
listeners: [
BlocListener<PrinterFormBloc, PrinterFormState>(
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<PrinterLoaderBloc>().add(
const PrinterLoaderEvent.getByCode('ticket'),
);
}
AppFlushbar.showSuccess(
context,
'Printer ticket berhasil dihapus',
);
},
),
);
},
AppFlushbar.showSuccess(
context,
'Printer ticket berhasil dihapus',
);
},
),
);
},
),
BlocListener<PrinterFormBloc, PrinterFormState>(
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<SettingPrinterTicket> {
isEdit = true;
});
},
onDelete: () => context.read<PrinterFormBloc>().add(
PrinterFormEvent.deleted(state.printer.id),
),
onTestPrint: () =>
context.read<PrinterFormBloc>().add(
PrinterFormEvent.printTest(
code: 'ticket',
macAccdress: state.printer.address,
),
),
),
(f) => f.maybeMap(
orElse: () => ErrorCard(