diff --git a/lib/application/printer/print_struck/print_struck_bloc.dart b/lib/application/printer/print_struck/print_struck_bloc.dart index 5b8d0ad..63ccdee 100644 --- a/lib/application/printer/print_struck/print_struck_bloc.dart +++ b/lib/application/printer/print_struck/print_struck_bloc.dart @@ -80,6 +80,22 @@ class PrintStruckBloc extends Bloc { order: e.order, ); + emit( + state.copyWith( + isPrinting: false, + failureOrPrintStruck: optionOf(failureOrSuccess), + ), + ); + }, + splitBill: (e) async { + Either failureOrSuccess; + + emit(state.copyWith(isPrinting: true, failureOrPrintStruck: none())); + + failureOrSuccess = await _printerRepository.printStruckSplitBill( + order: e.order, + ); + emit( state.copyWith( isPrinting: false, diff --git a/lib/application/printer/print_struck/print_struck_bloc.freezed.dart b/lib/application/printer/print_struck/print_struck_bloc.freezed.dart index 79f0686..856f8fd 100644 --- a/lib/application/printer/print_struck/print_struck_bloc.freezed.dart +++ b/lib/application/printer/print_struck/print_struck_bloc.freezed.dart @@ -24,6 +24,7 @@ mixin _$PrintStruckEvent { required TResult Function(Order order) cashier, required TResult Function(Order order) payment, required TResult Function(Order order) voided, + required TResult Function(Order order) splitBill, }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? whenOrNull({ @@ -31,6 +32,7 @@ mixin _$PrintStruckEvent { TResult? Function(Order order)? cashier, TResult? Function(Order order)? payment, TResult? Function(Order order)? voided, + TResult? Function(Order order)? splitBill, }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeWhen({ @@ -38,6 +40,7 @@ mixin _$PrintStruckEvent { TResult Function(Order order)? cashier, TResult Function(Order order)? payment, TResult Function(Order order)? voided, + TResult Function(Order order)? splitBill, required TResult orElse(), }) => throw _privateConstructorUsedError; @optionalTypeArgs @@ -46,6 +49,7 @@ mixin _$PrintStruckEvent { required TResult Function(_Cashier value) cashier, required TResult Function(_Payment value) payment, required TResult Function(_Voided value) voided, + required TResult Function(_SplitBill value) splitBill, }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? mapOrNull({ @@ -53,6 +57,7 @@ mixin _$PrintStruckEvent { TResult? Function(_Cashier value)? cashier, TResult? Function(_Payment value)? payment, TResult? Function(_Voided value)? voided, + TResult? Function(_SplitBill value)? splitBill, }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeMap({ @@ -60,6 +65,7 @@ mixin _$PrintStruckEvent { TResult Function(_Cashier value)? cashier, TResult Function(_Payment value)? payment, TResult Function(_Voided value)? voided, + TResult Function(_SplitBill value)? splitBill, required TResult orElse(), }) => throw _privateConstructorUsedError; @@ -198,6 +204,7 @@ class _$OrderImpl implements _Order { required TResult Function(Order order) cashier, required TResult Function(Order order) payment, required TResult Function(Order order) voided, + required TResult Function(Order order) splitBill, }) { return order(this.order); } @@ -209,6 +216,7 @@ class _$OrderImpl implements _Order { TResult? Function(Order order)? cashier, TResult? Function(Order order)? payment, TResult? Function(Order order)? voided, + TResult? Function(Order order)? splitBill, }) { return order?.call(this.order); } @@ -220,6 +228,7 @@ class _$OrderImpl implements _Order { TResult Function(Order order)? cashier, TResult Function(Order order)? payment, TResult Function(Order order)? voided, + TResult Function(Order order)? splitBill, required TResult orElse(), }) { if (order != null) { @@ -235,6 +244,7 @@ class _$OrderImpl implements _Order { required TResult Function(_Cashier value) cashier, required TResult Function(_Payment value) payment, required TResult Function(_Voided value) voided, + required TResult Function(_SplitBill value) splitBill, }) { return order(this); } @@ -246,6 +256,7 @@ class _$OrderImpl implements _Order { TResult? Function(_Cashier value)? cashier, TResult? Function(_Payment value)? payment, TResult? Function(_Voided value)? voided, + TResult? Function(_SplitBill value)? splitBill, }) { return order?.call(this); } @@ -257,6 +268,7 @@ class _$OrderImpl implements _Order { TResult Function(_Cashier value)? cashier, TResult Function(_Payment value)? payment, TResult Function(_Voided value)? voided, + TResult Function(_SplitBill value)? splitBill, required TResult orElse(), }) { if (order != null) { @@ -359,6 +371,7 @@ class _$CashierImpl implements _Cashier { required TResult Function(Order order) cashier, required TResult Function(Order order) payment, required TResult Function(Order order) voided, + required TResult Function(Order order) splitBill, }) { return cashier(this.order); } @@ -370,6 +383,7 @@ class _$CashierImpl implements _Cashier { TResult? Function(Order order)? cashier, TResult? Function(Order order)? payment, TResult? Function(Order order)? voided, + TResult? Function(Order order)? splitBill, }) { return cashier?.call(this.order); } @@ -381,6 +395,7 @@ class _$CashierImpl implements _Cashier { TResult Function(Order order)? cashier, TResult Function(Order order)? payment, TResult Function(Order order)? voided, + TResult Function(Order order)? splitBill, required TResult orElse(), }) { if (cashier != null) { @@ -396,6 +411,7 @@ class _$CashierImpl implements _Cashier { required TResult Function(_Cashier value) cashier, required TResult Function(_Payment value) payment, required TResult Function(_Voided value) voided, + required TResult Function(_SplitBill value) splitBill, }) { return cashier(this); } @@ -407,6 +423,7 @@ class _$CashierImpl implements _Cashier { TResult? Function(_Cashier value)? cashier, TResult? Function(_Payment value)? payment, TResult? Function(_Voided value)? voided, + TResult? Function(_SplitBill value)? splitBill, }) { return cashier?.call(this); } @@ -418,6 +435,7 @@ class _$CashierImpl implements _Cashier { TResult Function(_Cashier value)? cashier, TResult Function(_Payment value)? payment, TResult Function(_Voided value)? voided, + TResult Function(_SplitBill value)? splitBill, required TResult orElse(), }) { if (cashier != null) { @@ -520,6 +538,7 @@ class _$PaymentImpl implements _Payment { required TResult Function(Order order) cashier, required TResult Function(Order order) payment, required TResult Function(Order order) voided, + required TResult Function(Order order) splitBill, }) { return payment(this.order); } @@ -531,6 +550,7 @@ class _$PaymentImpl implements _Payment { TResult? Function(Order order)? cashier, TResult? Function(Order order)? payment, TResult? Function(Order order)? voided, + TResult? Function(Order order)? splitBill, }) { return payment?.call(this.order); } @@ -542,6 +562,7 @@ class _$PaymentImpl implements _Payment { TResult Function(Order order)? cashier, TResult Function(Order order)? payment, TResult Function(Order order)? voided, + TResult Function(Order order)? splitBill, required TResult orElse(), }) { if (payment != null) { @@ -557,6 +578,7 @@ class _$PaymentImpl implements _Payment { required TResult Function(_Cashier value) cashier, required TResult Function(_Payment value) payment, required TResult Function(_Voided value) voided, + required TResult Function(_SplitBill value) splitBill, }) { return payment(this); } @@ -568,6 +590,7 @@ class _$PaymentImpl implements _Payment { TResult? Function(_Cashier value)? cashier, TResult? Function(_Payment value)? payment, TResult? Function(_Voided value)? voided, + TResult? Function(_SplitBill value)? splitBill, }) { return payment?.call(this); } @@ -579,6 +602,7 @@ class _$PaymentImpl implements _Payment { TResult Function(_Cashier value)? cashier, TResult Function(_Payment value)? payment, TResult Function(_Voided value)? voided, + TResult Function(_SplitBill value)? splitBill, required TResult orElse(), }) { if (payment != null) { @@ -681,6 +705,7 @@ class _$VoidedImpl implements _Voided { required TResult Function(Order order) cashier, required TResult Function(Order order) payment, required TResult Function(Order order) voided, + required TResult Function(Order order) splitBill, }) { return voided(this.order); } @@ -692,6 +717,7 @@ class _$VoidedImpl implements _Voided { TResult? Function(Order order)? cashier, TResult? Function(Order order)? payment, TResult? Function(Order order)? voided, + TResult? Function(Order order)? splitBill, }) { return voided?.call(this.order); } @@ -703,6 +729,7 @@ class _$VoidedImpl implements _Voided { TResult Function(Order order)? cashier, TResult Function(Order order)? payment, TResult Function(Order order)? voided, + TResult Function(Order order)? splitBill, required TResult orElse(), }) { if (voided != null) { @@ -718,6 +745,7 @@ class _$VoidedImpl implements _Voided { required TResult Function(_Cashier value) cashier, required TResult Function(_Payment value) payment, required TResult Function(_Voided value) voided, + required TResult Function(_SplitBill value) splitBill, }) { return voided(this); } @@ -729,6 +757,7 @@ class _$VoidedImpl implements _Voided { TResult? Function(_Cashier value)? cashier, TResult? Function(_Payment value)? payment, TResult? Function(_Voided value)? voided, + TResult? Function(_SplitBill value)? splitBill, }) { return voided?.call(this); } @@ -740,6 +769,7 @@ class _$VoidedImpl implements _Voided { TResult Function(_Cashier value)? cashier, TResult Function(_Payment value)? payment, TResult Function(_Voided value)? voided, + TResult Function(_SplitBill value)? splitBill, required TResult orElse(), }) { if (voided != null) { @@ -763,6 +793,173 @@ abstract class _Voided implements PrintStruckEvent { throw _privateConstructorUsedError; } +/// @nodoc +abstract class _$$SplitBillImplCopyWith<$Res> + implements $PrintStruckEventCopyWith<$Res> { + factory _$$SplitBillImplCopyWith( + _$SplitBillImpl value, + $Res Function(_$SplitBillImpl) then, + ) = __$$SplitBillImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({Order order}); + + @override + $OrderCopyWith<$Res> get order; +} + +/// @nodoc +class __$$SplitBillImplCopyWithImpl<$Res> + extends _$PrintStruckEventCopyWithImpl<$Res, _$SplitBillImpl> + implements _$$SplitBillImplCopyWith<$Res> { + __$$SplitBillImplCopyWithImpl( + _$SplitBillImpl _value, + $Res Function(_$SplitBillImpl) _then, + ) : super(_value, _then); + + /// Create a copy of PrintStruckEvent + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({Object? order = null}) { + return _then( + _$SplitBillImpl( + null == order + ? _value.order + : order // ignore: cast_nullable_to_non_nullable + as Order, + ), + ); + } +} + +/// @nodoc + +class _$SplitBillImpl implements _SplitBill { + const _$SplitBillImpl(this.order); + + @override + final Order order; + + @override + String toString() { + return 'PrintStruckEvent.splitBill(order: $order)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$SplitBillImpl && + (identical(other.order, order) || other.order == order)); + } + + @override + int get hashCode => Object.hash(runtimeType, order); + + /// Create a copy of PrintStruckEvent + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$SplitBillImplCopyWith<_$SplitBillImpl> get copyWith => + __$$SplitBillImplCopyWithImpl<_$SplitBillImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function(Order order) order, + required TResult Function(Order order) cashier, + required TResult Function(Order order) payment, + required TResult Function(Order order) voided, + required TResult Function(Order order) splitBill, + }) { + return splitBill(this.order); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(Order order)? order, + TResult? Function(Order order)? cashier, + TResult? Function(Order order)? payment, + TResult? Function(Order order)? voided, + TResult? Function(Order order)? splitBill, + }) { + return splitBill?.call(this.order); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(Order order)? order, + TResult Function(Order order)? cashier, + TResult Function(Order order)? payment, + TResult Function(Order order)? voided, + TResult Function(Order order)? splitBill, + required TResult orElse(), + }) { + if (splitBill != null) { + return splitBill(this.order); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Order value) order, + required TResult Function(_Cashier value) cashier, + required TResult Function(_Payment value) payment, + required TResult Function(_Voided value) voided, + required TResult Function(_SplitBill value) splitBill, + }) { + return splitBill(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Order value)? order, + TResult? Function(_Cashier value)? cashier, + TResult? Function(_Payment value)? payment, + TResult? Function(_Voided value)? voided, + TResult? Function(_SplitBill value)? splitBill, + }) { + return splitBill?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Order value)? order, + TResult Function(_Cashier value)? cashier, + TResult Function(_Payment value)? payment, + TResult Function(_Voided value)? voided, + TResult Function(_SplitBill value)? splitBill, + required TResult orElse(), + }) { + if (splitBill != null) { + return splitBill(this); + } + return orElse(); + } +} + +abstract class _SplitBill implements PrintStruckEvent { + const factory _SplitBill(final Order order) = _$SplitBillImpl; + + @override + Order get order; + + /// Create a copy of PrintStruckEvent + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$SplitBillImplCopyWith<_$SplitBillImpl> get copyWith => + throw _privateConstructorUsedError; +} + /// @nodoc mixin _$PrintStruckState { Option> get failureOrPrintStruck => diff --git a/lib/application/printer/print_struck/print_struck_event.dart b/lib/application/printer/print_struck/print_struck_event.dart index a2d8368..5ee6061 100644 --- a/lib/application/printer/print_struck/print_struck_event.dart +++ b/lib/application/printer/print_struck/print_struck_event.dart @@ -6,4 +6,5 @@ class PrintStruckEvent with _$PrintStruckEvent { const factory PrintStruckEvent.cashier(Order order) = _Cashier; const factory PrintStruckEvent.payment(Order order) = _Payment; const factory PrintStruckEvent.voided(Order order) = _Voided; + const factory PrintStruckEvent.splitBill(Order order) = _SplitBill; } diff --git a/lib/domain/printer/repositories/i_printer_repository.dart b/lib/domain/printer/repositories/i_printer_repository.dart index f8375a0..61860f7 100644 --- a/lib/domain/printer/repositories/i_printer_repository.dart +++ b/lib/domain/printer/repositories/i_printer_repository.dart @@ -26,4 +26,7 @@ abstract class IPrinterRepository { required Order order, }); Future> printStruckVoid({required Order order}); + Future> printStruckSplitBill({ + required Order order, + }); } diff --git a/lib/infrastructure/printer/repositories/printer_repository.dart b/lib/infrastructure/printer/repositories/printer_repository.dart index 8276c12..76f5354 100644 --- a/lib/infrastructure/printer/repositories/printer_repository.dart +++ b/lib/infrastructure/printer/repositories/printer_repository.dart @@ -498,6 +498,15 @@ class PrinterRepository implements IPrinterRepository { return _printVoid(order: order, outlet: outlet, cashieName: user.name); } + @override + Future> printStruckSplitBill({ + required Order order, + }) async { + final outlet = await _outletLocalDatasource.currentOutlet(); + final user = await _authLocalDataProvider.currentUser(); + return _printSplitBill(order: order, outlet: outlet, cashieName: user.name); + } + @override Future> printStruckPayment({ required Order order, @@ -823,4 +832,57 @@ class PrinterRepository implements IPrinterRepository { ); } } + + Future> _printSplitBill({ + required Order order, + required Outlet outlet, + required String cashieName, + }) async { + log('Starting to print splitBill', name: _logName); + final splitBillPrinter = await _localDataProvider.findPrinterByCode( + 'receipt', + ); + if (splitBillPrinter.hasData) { + try { + final printer = splitBillPrinter.data!.toDomain(); + + final printValue = await PrintUi().printSplit( + order: order, + outlet: outlet, + cashierName: cashieName, + ); + + await printStruct(printer, printValue); + + log('Finished printed splitBill', name: _logName); + + return right(unit); + } catch (e, stackTrace) { + FirebaseCrashlytics.instance.recordError( + 'Print Struck SplitBill Error: $e', + stackTrace, + reason: + 'Print struck splitBill error / Printer not setting in printer page', + information: ['Order ID: ${order.id}'], + ); + log("Error printing splitBill", name: _logName, error: e); + return left( + const PrinterFailure.dynamicErrorMessage( + 'Error printing splitBill order', + ), + ); + } + } else { + FirebaseCrashlytics.instance.recordError( + 'SplitBill printer not found', + null, + reason: + 'SplitBill printer not found / Printer not setting in printer page', + information: ['Order ID: ${order.id}'], + ); + return left( + const PrinterFailure.dynamicErrorMessage('SplitBill printer not found'), + ); + } + } } diff --git a/lib/presentation/components/print/print_ui.dart b/lib/presentation/components/print/print_ui.dart index ee292f5..004c040 100644 --- a/lib/presentation/components/print/print_ui.dart +++ b/lib/presentation/components/print/print_ui.dart @@ -414,4 +414,62 @@ class PrintUi { return bytes; } + + Future> printSplit({ + required Order order, + required Outlet outlet, + required String cashierName, + 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.orderInfo( + orderNumber: order.orderNumber, + customerName: order.metadata['customer_name'] ?? 'John Doe', + cashierName: cashierName, + paymentMethod: order.payments.isEmpty + ? null + : order.payments.last.paymentMethodName, + tableNumber: order.tableNumber, + ); + + bytes += builder.orderType('Split'); + + bytes += builder.row2Columns( + 'Split', + '${order.payments.last.splitNumber} / ${order.payments.last.splitTotal}', + ); + + bytes += builder.summary( + totalItems: 0, + subtotal: order.payments.last.amount.currencyFormatRpV2, + discount: 0.currencyFormatRpV2, + total: order.payments.last.amount.currencyFormatRpV2, + paid: order.payments.last.amount.currencyFormatRpV2, + ); + + bytes += builder.footer(message: 'Kasir'); + + return bytes; + } } diff --git a/lib/presentation/components/print/receipt_component_builder.dart b/lib/presentation/components/print/receipt_component_builder.dart index 91a7752..77bcf74 100644 --- a/lib/presentation/components/print/receipt_component_builder.dart +++ b/lib/presentation/components/print/receipt_component_builder.dart @@ -241,7 +241,9 @@ class ReceiptComponentBuilder { List bytes = []; bytes += separator(); - bytes += row2Columns('Total Item', totalItems.toString()); + if (totalItems > 0) { + bytes += row2Columns('Total Item', totalItems.toString()); + } bytes += row2Columns('Subtotal', subtotal); bytes += row2Columns('Diskon', discount); bytes += separator(); diff --git a/lib/presentation/pages/payment/pages/payment_success_split_bill/payment_success_split_bill_page.dart b/lib/presentation/pages/payment/pages/payment_success_split_bill/payment_success_split_bill_page.dart index 1f5db9b..f285ce1 100644 --- a/lib/presentation/pages/payment/pages/payment_success_split_bill/payment_success_split_bill_page.dart +++ b/lib/presentation/pages/payment/pages/payment_success_split_bill/payment_success_split_bill_page.dart @@ -3,10 +3,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../../../../../application/order/order_loader/order_loader_bloc.dart'; +import '../../../../../application/printer/print_struck/print_struck_bloc.dart'; import '../../../../../common/theme/theme.dart'; import '../../../../../injection.dart'; import '../../../../components/error/order_loader_error_state_widget.dart'; import '../../../../components/loader/loader_with_text.dart'; +import '../../../../components/toast/flushbar.dart'; import 'widgets/payment_success_split_bill_left_panel.dart'; import 'widgets/payment_success_split_bill_right_panel.dart'; @@ -18,49 +20,64 @@ class PaymentSuccessSplitBillPage extends StatelessWidget @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: AppColor.background, - body: SafeArea( - child: BlocBuilder( - builder: (context, state) { - if (state.isFetchingById) { - return const Center(child: LoaderWithText()); - } - return state.failureOptionGetById.fold( - () => Container( - padding: const EdgeInsets.all(24.0), - child: Row( - children: [ - // Left Panel - Success Message & Order Info - Expanded( - flex: 35, - child: PaymentSuccessSplitBillLeftPanel( - order: state.order, + return BlocListener( + listenWhen: (previous, current) => + previous.failureOrPrintStruck != current.failureOrPrintStruck, + listener: (context, state) { + state.failureOrPrintStruck.fold( + () {}, + (either) => either.fold( + (f) => AppFlushbar.showPrinterFailureToast(context, f), + (success) { + AppFlushbar.showSuccess(context, "Struck berhasil dicetak"); + }, + ), + ); + }, + child: Scaffold( + backgroundColor: AppColor.background, + body: SafeArea( + child: BlocBuilder( + builder: (context, state) { + if (state.isFetchingById) { + return const Center(child: LoaderWithText()); + } + return state.failureOptionGetById.fold( + () => Container( + padding: const EdgeInsets.all(24.0), + child: Row( + children: [ + // Left Panel - Success Message & Order Info + Expanded( + flex: 35, + child: PaymentSuccessSplitBillLeftPanel( + order: state.order, + ), ), - ), - const SizedBox(width: 16), + const SizedBox(width: 16), - // Right Panel - Order Details - Expanded( - flex: 65, - child: PaymentSuccessSplitBillRightPanel( - order: state.order, + // Right Panel - Order Details + Expanded( + flex: 65, + child: PaymentSuccessSplitBillRightPanel( + order: state.order, + ), ), - ), - ], + ], + ), ), - ), - (f) => OrderLoaderErrorStateWidget( - failure: f, - onRefresh: () { - context.read().add( - OrderLoaderEvent.getById(orderId), - ); - }, - ), - ); - }, + (f) => OrderLoaderErrorStateWidget( + failure: f, + onRefresh: () { + context.read().add( + OrderLoaderEvent.getById(orderId), + ); + }, + ), + ); + }, + ), ), ), ); diff --git a/lib/presentation/pages/payment/pages/payment_success_split_bill/widgets/payment_success_split_bill_left_panel.dart b/lib/presentation/pages/payment/pages/payment_success_split_bill/widgets/payment_success_split_bill_left_panel.dart index f92aa23..b0acd19 100644 --- a/lib/presentation/pages/payment/pages/payment_success_split_bill/widgets/payment_success_split_bill_left_panel.dart +++ b/lib/presentation/pages/payment/pages/payment_success_split_bill/widgets/payment_success_split_bill_left_panel.dart @@ -1,6 +1,8 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import '../../../../../../application/printer/print_struck/print_struck_bloc.dart'; import '../../../../../../common/extension/extension.dart'; import '../../../../../../common/theme/theme.dart'; import '../../../../../../domain/order/order.dart'; @@ -166,22 +168,9 @@ class PaymentSuccessSplitBillLeftPanel extends StatelessWidget { Expanded( child: AppElevatedButton.filled( onPressed: () { - // onPrintRecipt( - // context, - // order: widget.order, - // paymentMethod: widget.paymentMethod, - // nominalBayar: widget.paymentMethod == "Cash" - // ? widget.nominalBayar - // : widget.order.totalAmount ?? 0, - // kembalian: widget.nominalBayar - - // (widget.order.totalAmount ?? 0), - // productQuantity: widget.productQuantity, - // ); - // onPrint( - // context, - // productQuantity: widget.productQuantity, - // order: widget.order, - // ); + context.read().add( + PrintStruckEvent.splitBill(order), + ); }, label: 'Cetak Struk', icon: Icon(Icons.print_rounded, color: AppColor.white), diff --git a/lib/presentation/pages/payment/pages/payment_success_split_bill/widgets/payment_success_split_bill_right_panel.dart b/lib/presentation/pages/payment/pages/payment_success_split_bill/widgets/payment_success_split_bill_right_panel.dart index d9e0785..43a7104 100644 --- a/lib/presentation/pages/payment/pages/payment_success_split_bill/widgets/payment_success_split_bill_right_panel.dart +++ b/lib/presentation/pages/payment/pages/payment_success_split_bill/widgets/payment_success_split_bill_right_panel.dart @@ -193,7 +193,11 @@ class PaymentSuccessSplitBillRightPanel extends StatelessWidget { ], ), child: Text( - (order.payments.last.amount).toString().currencyFormatRpV2, + order.payments.isNotEmpty + ? (order.payments.last.amount) + .toString() + .currencyFormatRpV2 + : 0.currencyFormatRpV2, style: AppStyle.xl.copyWith( fontWeight: FontWeight.bold, color: Colors.white,