diff --git a/lib/core/function/app_function.dart b/lib/core/function/app_function.dart index f62ac66..908d4ef 100644 --- a/lib/core/function/app_function.dart +++ b/lib/core/function/app_function.dart @@ -6,9 +6,11 @@ import 'package:enaklo_pos/core/extensions/string_ext.dart'; import 'package:enaklo_pos/core/utils/printer_service.dart'; import 'package:enaklo_pos/data/dataoutputs/print_dataoutputs.dart'; import 'package:enaklo_pos/data/datasources/auth_local_datasource.dart'; +import 'package:enaklo_pos/data/datasources/outlet_local_datasource.dart'; import 'package:enaklo_pos/data/datasources/product_local_datasource.dart'; import 'package:enaklo_pos/data/datasources/settings_local_datasource.dart'; import 'package:enaklo_pos/data/models/response/order_response_model.dart'; +import 'package:enaklo_pos/data/type/bussines_type.dart'; import 'package:enaklo_pos/presentation/home/models/product_quantity.dart'; import 'package:flutter/material.dart'; import 'package:barcode/barcode.dart'; @@ -19,78 +21,108 @@ Future onPrint( required List productQuantity, required Order order, }) async { - final checkerPrinter = - await ProductLocalDatasource.instance.getPrinterByCode('checker'); - final kitchenPrinter = - await ProductLocalDatasource.instance.getPrinterByCode('kitchen'); - final barPrinter = - await ProductLocalDatasource.instance.getPrinterByCode('bar'); + final outlet = await OutletLocalDatasource().get(); + if (outlet.businessType == BusinessType.restaurant) { + final checkerPrinter = + await ProductLocalDatasource.instance.getPrinterByCode('checker'); + final kitchenPrinter = + await ProductLocalDatasource.instance.getPrinterByCode('kitchen'); + final barPrinter = + await ProductLocalDatasource.instance.getPrinterByCode('bar'); - final authData = await AuthLocalDataSource().getAuthData(); + final authData = await AuthLocalDataSource().getAuthData(); - // Checker printer - if (checkerPrinter != null) { - try { - final printValue = await PrintDataoutputs.instance.printChecker( - productQuantity, - order.tableNumber ?? "", - order.orderNumber ?? "", - authData.user?.name ?? "", - checkerPrinter.paper.toIntegerFromText, - order.orderType ?? "", - ); + // Checker printer + if (checkerPrinter != null) { + try { + final printValue = await PrintDataoutputs.instance.printChecker( + productQuantity, + order.tableNumber ?? "", + order.orderNumber ?? "", + authData.user?.name ?? "", + checkerPrinter.paper.toIntegerFromText, + order.orderType ?? "", + ); - await PrinterService() - // ignore: use_build_context_synchronously - .printWithPrinter(checkerPrinter, printValue, context); - } catch (e) { - log("Error printing checker: $e"); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('Error printing checker: $e')), - ); + await PrinterService() + // ignore: use_build_context_synchronously + .printWithPrinter(checkerPrinter, printValue, context); + } catch (e) { + log("Error printing checker: $e"); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Error printing checker: $e')), + ); + } + } + + // Kitchen printer + if (kitchenPrinter != null) { + try { + final printValue = await PrintDataoutputs.instance.printKitchen( + productQuantity, + order.tableNumber!, + order.orderNumber ?? "", + authData.user?.name ?? "", + kitchenPrinter.paper.toIntegerFromText, + order.orderType ?? "", + ); + + await PrinterService() + .printWithPrinter(kitchenPrinter, printValue, context); + } catch (e) { + log("Error printing kitchen order: $e"); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Error printing kitchen order: $e')), + ); + } + } + + // Bar printer + if (barPrinter != null) { + try { + final printValue = await PrintDataoutputs.instance.printBar( + productQuantity, + order.tableNumber ?? "", + order.orderNumber ?? "", + authData.user?.name ?? "", + barPrinter.paper.toIntegerFromText, + order.orderType ?? "", + ); + + await PrinterService() + .printWithPrinter(barPrinter, printValue, context); + } catch (e) { + log("Error printing bar order: $e"); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Error printing bar order: $e')), + ); + } } } - // Kitchen printer - if (kitchenPrinter != null) { - try { - final printValue = await PrintDataoutputs.instance.printKitchen( - productQuantity, - order.tableNumber!, - order.orderNumber ?? "", - authData.user?.name ?? "", - kitchenPrinter.paper.toIntegerFromText, - order.orderType ?? "", - ); + if (outlet.businessType == BusinessType.ticketing) { + final ticketPrinter = + await ProductLocalDatasource.instance.getPrinterByCode('ticket'); - await PrinterService() - .printWithPrinter(kitchenPrinter, printValue, context); - } catch (e) { - log("Error printing kitchen order: $e"); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('Error printing kitchen order: $e')), - ); - } - } + final barcode = await generateBarcodeAsUint8List(order.orderNumber ?? ""); - // Bar printer - if (barPrinter != null) { - try { - final printValue = await PrintDataoutputs.instance.printBar( - productQuantity, - order.tableNumber ?? "", - order.orderNumber ?? "", - authData.user?.name ?? "", - barPrinter.paper.toIntegerFromText, - order.orderType ?? "", - ); + if (ticketPrinter != null) { + try { + final printValue = await PrintDataoutputs.instance.printTicket( + order.totalAmount ?? 0, + barcode, + ticketPrinter.paper.toIntegerFromText, + ); - await PrinterService().printWithPrinter(barPrinter, printValue, context); - } catch (e) { - log("Error printing bar order: $e"); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('Error printing bar order: $e')), - ); + await PrinterService() + // ignore: use_build_context_synchronously + .printWithPrinter(ticketPrinter, printValue, context); + } catch (e) { + log("Error printing ticket: $e"); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Error printing ticket: $e')), + ); + } } } } @@ -106,6 +138,7 @@ Future onPrintRecipt( await ProductLocalDatasource.instance.getPrinterByCode('receipt'); final authData = await AuthLocalDataSource().getAuthData(); final settings = await SettingsLocalDatasource().getTax(); + final outlet = await OutletLocalDatasource().get(); if (receiptPrinter != null) { try { @@ -117,6 +150,8 @@ Future onPrintRecipt( kembalian, settings.value, receiptPrinter.paper.toIntegerFromText, + order.orderType ?? "", + outlet, ); await PrinterService() .printWithPrinter(receiptPrinter, printValue, context); diff --git a/lib/data/dataoutputs/print_dataoutputs.dart b/lib/data/dataoutputs/print_dataoutputs.dart index eca3177..eba8df6 100644 --- a/lib/data/dataoutputs/print_dataoutputs.dart +++ b/lib/data/dataoutputs/print_dataoutputs.dart @@ -1,6 +1,7 @@ import 'dart:math'; import 'package:enaklo_pos/data/models/response/order_response_model.dart'; +import 'package:enaklo_pos/presentation/home/models/outlet_model.dart'; import 'package:esc_pos_utils_plus/esc_pos_utils_plus.dart'; import 'package:flutter/services.dart'; import 'package:enaklo_pos/core/extensions/int_ext.dart'; @@ -748,6 +749,8 @@ class PrintDataoutputs { int kembalian, int taxPercentage, int paper, + String orderType, + Outlet outlet, ) async { List bytes = []; @@ -757,7 +760,7 @@ class PrintDataoutputs { bytes += generator.reset(); - bytes += generator.text('Guapatlu Khas Bakmi Jambi', + bytes += generator.text(outlet.name ?? "", styles: const PosStyles( bold: true, align: PosAlign.center, @@ -765,9 +768,9 @@ class PrintDataoutputs { width: PosTextSize.size1, )); - bytes += generator.text('Gading Boulevard w2, No 25, Jakarta', + bytes += generator.text(outlet.address ?? "", styles: const PosStyles(bold: false, align: PosAlign.center)); - bytes += generator.text('085-77777-3839', + bytes += generator.text(outlet.phoneNumber ?? "", styles: const PosStyles(bold: false, align: PosAlign.center)); bytes += generator.text( @@ -855,7 +858,7 @@ class PrintDataoutputs { ? '------------------------------------------------' : '--------------------------------', styles: const PosStyles(bold: false, align: PosAlign.center)); - bytes += generator.text('Dine In', + bytes += generator.text(orderType, styles: const PosStyles(bold: true, align: PosAlign.center)); bytes += generator.text( paper == 80 diff --git a/lib/data/datasources/outlet_local_datasource.dart b/lib/data/datasources/outlet_local_datasource.dart index e5e73c9..fa1b6f1 100644 --- a/lib/data/datasources/outlet_local_datasource.dart +++ b/lib/data/datasources/outlet_local_datasource.dart @@ -8,6 +8,7 @@ class OutletLocalDatasource { try { final prefs = await SharedPreferences.getInstance(); await prefs.setString('outlet', outlet.toJson()); + log('Outlet Local Data: ${outlet.toJson()}'); } catch (e) { log('Error saving outlet: $e'); } @@ -22,7 +23,7 @@ class OutletLocalDatasource { final prefs = await SharedPreferences.getInstance(); final outlet = prefs.getString('outlet'); - log('Auth data: $outlet'); + log('Outlet Local Data: $outlet'); return Outlet.fromJson(outlet!); } diff --git a/lib/data/type/bussines_type.dart b/lib/data/type/bussines_type.dart new file mode 100644 index 0000000..58695bd --- /dev/null +++ b/lib/data/type/bussines_type.dart @@ -0,0 +1,17 @@ +enum BusinessType { + restaurant('restaurant'), + retail('retail'), + service('service'), + ticketing('ticketing'), + entertainment('entertainment'); + + final String value; + const BusinessType(this.value); + + static BusinessType fromString(String value) { + return BusinessType.values.firstWhere( + (type) => type.value == value, + orElse: () => BusinessType.restaurant, + ); + } +} diff --git a/lib/presentation/home/models/outlet_model.dart b/lib/presentation/home/models/outlet_model.dart index 1023328..6293af5 100644 --- a/lib/presentation/home/models/outlet_model.dart +++ b/lib/presentation/home/models/outlet_model.dart @@ -1,5 +1,7 @@ import 'dart:convert'; +import 'package:enaklo_pos/data/type/bussines_type.dart'; + class OutletResponse { final bool? success; final OutletData? data; @@ -101,7 +103,7 @@ class Outlet { final String? name; final String? address; final String? phoneNumber; - final String? businessType; + final BusinessType? businessType; final String? currency; final int? taxRate; final bool? isActive; @@ -128,7 +130,7 @@ class Outlet { name: json["name"], address: json["address"], phoneNumber: json["phone_number"], - businessType: json["business_type"], + businessType: BusinessType.fromString(json["business_type"]), currency: json["currency"], taxRate: json["tax_rate"], isActive: json["is_active"], @@ -146,7 +148,7 @@ class Outlet { "name": name, "address": address, "phone_number": phoneNumber, - "business_type": businessType, + "business_type": businessType?.value, "currency": currency, "tax_rate": taxRate, "is_active": isActive,