feat: update print

This commit is contained in:
efrilm 2025-08-07 22:03:05 +07:00
parent 203eda75e4
commit de22251440
5 changed files with 129 additions and 71 deletions

View File

@ -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/core/utils/printer_service.dart';
import 'package:enaklo_pos/data/dataoutputs/print_dataoutputs.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/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/product_local_datasource.dart';
import 'package:enaklo_pos/data/datasources/settings_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/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:enaklo_pos/presentation/home/models/product_quantity.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:barcode/barcode.dart'; import 'package:barcode/barcode.dart';
@ -19,78 +21,108 @@ Future<void> onPrint(
required List<ProductQuantity> productQuantity, required List<ProductQuantity> productQuantity,
required Order order, required Order order,
}) async { }) async {
final checkerPrinter = final outlet = await OutletLocalDatasource().get();
await ProductLocalDatasource.instance.getPrinterByCode('checker'); if (outlet.businessType == BusinessType.restaurant) {
final kitchenPrinter = final checkerPrinter =
await ProductLocalDatasource.instance.getPrinterByCode('kitchen'); await ProductLocalDatasource.instance.getPrinterByCode('checker');
final barPrinter = final kitchenPrinter =
await ProductLocalDatasource.instance.getPrinterByCode('bar'); await ProductLocalDatasource.instance.getPrinterByCode('kitchen');
final barPrinter =
await ProductLocalDatasource.instance.getPrinterByCode('bar');
final authData = await AuthLocalDataSource().getAuthData(); final authData = await AuthLocalDataSource().getAuthData();
// Checker printer // Checker printer
if (checkerPrinter != null) { if (checkerPrinter != null) {
try { try {
final printValue = await PrintDataoutputs.instance.printChecker( final printValue = await PrintDataoutputs.instance.printChecker(
productQuantity, productQuantity,
order.tableNumber ?? "", order.tableNumber ?? "",
order.orderNumber ?? "", order.orderNumber ?? "",
authData.user?.name ?? "", authData.user?.name ?? "",
checkerPrinter.paper.toIntegerFromText, checkerPrinter.paper.toIntegerFromText,
order.orderType ?? "", order.orderType ?? "",
); );
await PrinterService() await PrinterService()
// ignore: use_build_context_synchronously // ignore: use_build_context_synchronously
.printWithPrinter(checkerPrinter, printValue, context); .printWithPrinter(checkerPrinter, printValue, context);
} catch (e) { } catch (e) {
log("Error printing checker: $e"); log("Error printing checker: $e");
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Error printing checker: $e')), 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 (outlet.businessType == BusinessType.ticketing) {
if (kitchenPrinter != null) { final ticketPrinter =
try { await ProductLocalDatasource.instance.getPrinterByCode('ticket');
final printValue = await PrintDataoutputs.instance.printKitchen(
productQuantity,
order.tableNumber!,
order.orderNumber ?? "",
authData.user?.name ?? "",
kitchenPrinter.paper.toIntegerFromText,
order.orderType ?? "",
);
await PrinterService() final barcode = await generateBarcodeAsUint8List(order.orderNumber ?? "");
.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 (ticketPrinter != null) {
if (barPrinter != null) { try {
try { final printValue = await PrintDataoutputs.instance.printTicket(
final printValue = await PrintDataoutputs.instance.printBar( order.totalAmount ?? 0,
productQuantity, barcode,
order.tableNumber ?? "", ticketPrinter.paper.toIntegerFromText,
order.orderNumber ?? "", );
authData.user?.name ?? "",
barPrinter.paper.toIntegerFromText,
order.orderType ?? "",
);
await PrinterService().printWithPrinter(barPrinter, printValue, context); await PrinterService()
} catch (e) { // ignore: use_build_context_synchronously
log("Error printing bar order: $e"); .printWithPrinter(ticketPrinter, printValue, context);
ScaffoldMessenger.of(context).showSnackBar( } catch (e) {
SnackBar(content: Text('Error printing bar order: $e')), log("Error printing ticket: $e");
); ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Error printing ticket: $e')),
);
}
} }
} }
} }
@ -106,6 +138,7 @@ Future<void> onPrintRecipt(
await ProductLocalDatasource.instance.getPrinterByCode('receipt'); await ProductLocalDatasource.instance.getPrinterByCode('receipt');
final authData = await AuthLocalDataSource().getAuthData(); final authData = await AuthLocalDataSource().getAuthData();
final settings = await SettingsLocalDatasource().getTax(); final settings = await SettingsLocalDatasource().getTax();
final outlet = await OutletLocalDatasource().get();
if (receiptPrinter != null) { if (receiptPrinter != null) {
try { try {
@ -117,6 +150,8 @@ Future<void> onPrintRecipt(
kembalian, kembalian,
settings.value, settings.value,
receiptPrinter.paper.toIntegerFromText, receiptPrinter.paper.toIntegerFromText,
order.orderType ?? "",
outlet,
); );
await PrinterService() await PrinterService()
.printWithPrinter(receiptPrinter, printValue, context); .printWithPrinter(receiptPrinter, printValue, context);

View File

@ -1,6 +1,7 @@
import 'dart:math'; import 'dart:math';
import 'package:enaklo_pos/data/models/response/order_response_model.dart'; 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:esc_pos_utils_plus/esc_pos_utils_plus.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:enaklo_pos/core/extensions/int_ext.dart'; import 'package:enaklo_pos/core/extensions/int_ext.dart';
@ -748,6 +749,8 @@ class PrintDataoutputs {
int kembalian, int kembalian,
int taxPercentage, int taxPercentage,
int paper, int paper,
String orderType,
Outlet outlet,
) async { ) async {
List<int> bytes = []; List<int> bytes = [];
@ -757,7 +760,7 @@ class PrintDataoutputs {
bytes += generator.reset(); bytes += generator.reset();
bytes += generator.text('Guapatlu Khas Bakmi Jambi', bytes += generator.text(outlet.name ?? "",
styles: const PosStyles( styles: const PosStyles(
bold: true, bold: true,
align: PosAlign.center, align: PosAlign.center,
@ -765,9 +768,9 @@ class PrintDataoutputs {
width: PosTextSize.size1, 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)); 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)); styles: const PosStyles(bold: false, align: PosAlign.center));
bytes += generator.text( bytes += generator.text(
@ -855,7 +858,7 @@ class PrintDataoutputs {
? '------------------------------------------------' ? '------------------------------------------------'
: '--------------------------------', : '--------------------------------',
styles: const PosStyles(bold: false, align: PosAlign.center)); 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)); styles: const PosStyles(bold: true, align: PosAlign.center));
bytes += generator.text( bytes += generator.text(
paper == 80 paper == 80

View File

@ -8,6 +8,7 @@ class OutletLocalDatasource {
try { try {
final prefs = await SharedPreferences.getInstance(); final prefs = await SharedPreferences.getInstance();
await prefs.setString('outlet', outlet.toJson()); await prefs.setString('outlet', outlet.toJson());
log('Outlet Local Data: ${outlet.toJson()}');
} catch (e) { } catch (e) {
log('Error saving outlet: $e'); log('Error saving outlet: $e');
} }
@ -22,7 +23,7 @@ class OutletLocalDatasource {
final prefs = await SharedPreferences.getInstance(); final prefs = await SharedPreferences.getInstance();
final outlet = prefs.getString('outlet'); final outlet = prefs.getString('outlet');
log('Auth data: $outlet'); log('Outlet Local Data: $outlet');
return Outlet.fromJson(outlet!); return Outlet.fromJson(outlet!);
} }

View File

@ -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,
);
}
}

View File

@ -1,5 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'package:enaklo_pos/data/type/bussines_type.dart';
class OutletResponse { class OutletResponse {
final bool? success; final bool? success;
final OutletData? data; final OutletData? data;
@ -101,7 +103,7 @@ class Outlet {
final String? name; final String? name;
final String? address; final String? address;
final String? phoneNumber; final String? phoneNumber;
final String? businessType; final BusinessType? businessType;
final String? currency; final String? currency;
final int? taxRate; final int? taxRate;
final bool? isActive; final bool? isActive;
@ -128,7 +130,7 @@ class Outlet {
name: json["name"], name: json["name"],
address: json["address"], address: json["address"],
phoneNumber: json["phone_number"], phoneNumber: json["phone_number"],
businessType: json["business_type"], businessType: BusinessType.fromString(json["business_type"]),
currency: json["currency"], currency: json["currency"],
taxRate: json["tax_rate"], taxRate: json["tax_rate"],
isActive: json["is_active"], isActive: json["is_active"],
@ -146,7 +148,7 @@ class Outlet {
"name": name, "name": name,
"address": address, "address": address,
"phone_number": phoneNumber, "phone_number": phoneNumber,
"business_type": businessType, "business_type": businessType?.value,
"currency": currency, "currency": currency,
"tax_rate": taxRate, "tax_rate": taxRate,
"is_active": isActive, "is_active": isActive,