split struct

This commit is contained in:
efrilm 2025-11-10 13:28:18 +07:00
parent c5673a147c
commit f5256fb33d
10 changed files with 405 additions and 56 deletions

View File

@ -80,6 +80,22 @@ class PrintStruckBloc extends Bloc<PrintStruckEvent, PrintStruckState> {
order: e.order, order: e.order,
); );
emit(
state.copyWith(
isPrinting: false,
failureOrPrintStruck: optionOf(failureOrSuccess),
),
);
},
splitBill: (e) async {
Either<PrinterFailure, Unit> failureOrSuccess;
emit(state.copyWith(isPrinting: true, failureOrPrintStruck: none()));
failureOrSuccess = await _printerRepository.printStruckSplitBill(
order: e.order,
);
emit( emit(
state.copyWith( state.copyWith(
isPrinting: false, isPrinting: false,

View File

@ -24,6 +24,7 @@ mixin _$PrintStruckEvent {
required TResult Function(Order order) cashier, required TResult Function(Order order) cashier,
required TResult Function(Order order) payment, required TResult Function(Order order) payment,
required TResult Function(Order order) voided, required TResult Function(Order order) voided,
required TResult Function(Order order) splitBill,
}) => throw _privateConstructorUsedError; }) => throw _privateConstructorUsedError;
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
@ -31,6 +32,7 @@ mixin _$PrintStruckEvent {
TResult? Function(Order order)? cashier, TResult? Function(Order order)? cashier,
TResult? Function(Order order)? payment, TResult? Function(Order order)? payment,
TResult? Function(Order order)? voided, TResult? Function(Order order)? voided,
TResult? Function(Order order)? splitBill,
}) => throw _privateConstructorUsedError; }) => throw _privateConstructorUsedError;
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
@ -38,6 +40,7 @@ mixin _$PrintStruckEvent {
TResult Function(Order order)? cashier, TResult Function(Order order)? cashier,
TResult Function(Order order)? payment, TResult Function(Order order)? payment,
TResult Function(Order order)? voided, TResult Function(Order order)? voided,
TResult Function(Order order)? splitBill,
required TResult orElse(), required TResult orElse(),
}) => throw _privateConstructorUsedError; }) => throw _privateConstructorUsedError;
@optionalTypeArgs @optionalTypeArgs
@ -46,6 +49,7 @@ mixin _$PrintStruckEvent {
required TResult Function(_Cashier value) cashier, required TResult Function(_Cashier value) cashier,
required TResult Function(_Payment value) payment, required TResult Function(_Payment value) payment,
required TResult Function(_Voided value) voided, required TResult Function(_Voided value) voided,
required TResult Function(_SplitBill value) splitBill,
}) => throw _privateConstructorUsedError; }) => throw _privateConstructorUsedError;
@optionalTypeArgs @optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({ TResult? mapOrNull<TResult extends Object?>({
@ -53,6 +57,7 @@ mixin _$PrintStruckEvent {
TResult? Function(_Cashier value)? cashier, TResult? Function(_Cashier value)? cashier,
TResult? Function(_Payment value)? payment, TResult? Function(_Payment value)? payment,
TResult? Function(_Voided value)? voided, TResult? Function(_Voided value)? voided,
TResult? Function(_SplitBill value)? splitBill,
}) => throw _privateConstructorUsedError; }) => throw _privateConstructorUsedError;
@optionalTypeArgs @optionalTypeArgs
TResult maybeMap<TResult extends Object?>({ TResult maybeMap<TResult extends Object?>({
@ -60,6 +65,7 @@ mixin _$PrintStruckEvent {
TResult Function(_Cashier value)? cashier, TResult Function(_Cashier value)? cashier,
TResult Function(_Payment value)? payment, TResult Function(_Payment value)? payment,
TResult Function(_Voided value)? voided, TResult Function(_Voided value)? voided,
TResult Function(_SplitBill value)? splitBill,
required TResult orElse(), required TResult orElse(),
}) => throw _privateConstructorUsedError; }) => throw _privateConstructorUsedError;
@ -198,6 +204,7 @@ class _$OrderImpl implements _Order {
required TResult Function(Order order) cashier, required TResult Function(Order order) cashier,
required TResult Function(Order order) payment, required TResult Function(Order order) payment,
required TResult Function(Order order) voided, required TResult Function(Order order) voided,
required TResult Function(Order order) splitBill,
}) { }) {
return order(this.order); return order(this.order);
} }
@ -209,6 +216,7 @@ class _$OrderImpl implements _Order {
TResult? Function(Order order)? cashier, TResult? Function(Order order)? cashier,
TResult? Function(Order order)? payment, TResult? Function(Order order)? payment,
TResult? Function(Order order)? voided, TResult? Function(Order order)? voided,
TResult? Function(Order order)? splitBill,
}) { }) {
return order?.call(this.order); return order?.call(this.order);
} }
@ -220,6 +228,7 @@ class _$OrderImpl implements _Order {
TResult Function(Order order)? cashier, TResult Function(Order order)? cashier,
TResult Function(Order order)? payment, TResult Function(Order order)? payment,
TResult Function(Order order)? voided, TResult Function(Order order)? voided,
TResult Function(Order order)? splitBill,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (order != null) { if (order != null) {
@ -235,6 +244,7 @@ class _$OrderImpl implements _Order {
required TResult Function(_Cashier value) cashier, required TResult Function(_Cashier value) cashier,
required TResult Function(_Payment value) payment, required TResult Function(_Payment value) payment,
required TResult Function(_Voided value) voided, required TResult Function(_Voided value) voided,
required TResult Function(_SplitBill value) splitBill,
}) { }) {
return order(this); return order(this);
} }
@ -246,6 +256,7 @@ class _$OrderImpl implements _Order {
TResult? Function(_Cashier value)? cashier, TResult? Function(_Cashier value)? cashier,
TResult? Function(_Payment value)? payment, TResult? Function(_Payment value)? payment,
TResult? Function(_Voided value)? voided, TResult? Function(_Voided value)? voided,
TResult? Function(_SplitBill value)? splitBill,
}) { }) {
return order?.call(this); return order?.call(this);
} }
@ -257,6 +268,7 @@ class _$OrderImpl implements _Order {
TResult Function(_Cashier value)? cashier, TResult Function(_Cashier value)? cashier,
TResult Function(_Payment value)? payment, TResult Function(_Payment value)? payment,
TResult Function(_Voided value)? voided, TResult Function(_Voided value)? voided,
TResult Function(_SplitBill value)? splitBill,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (order != null) { if (order != null) {
@ -359,6 +371,7 @@ class _$CashierImpl implements _Cashier {
required TResult Function(Order order) cashier, required TResult Function(Order order) cashier,
required TResult Function(Order order) payment, required TResult Function(Order order) payment,
required TResult Function(Order order) voided, required TResult Function(Order order) voided,
required TResult Function(Order order) splitBill,
}) { }) {
return cashier(this.order); return cashier(this.order);
} }
@ -370,6 +383,7 @@ class _$CashierImpl implements _Cashier {
TResult? Function(Order order)? cashier, TResult? Function(Order order)? cashier,
TResult? Function(Order order)? payment, TResult? Function(Order order)? payment,
TResult? Function(Order order)? voided, TResult? Function(Order order)? voided,
TResult? Function(Order order)? splitBill,
}) { }) {
return cashier?.call(this.order); return cashier?.call(this.order);
} }
@ -381,6 +395,7 @@ class _$CashierImpl implements _Cashier {
TResult Function(Order order)? cashier, TResult Function(Order order)? cashier,
TResult Function(Order order)? payment, TResult Function(Order order)? payment,
TResult Function(Order order)? voided, TResult Function(Order order)? voided,
TResult Function(Order order)? splitBill,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (cashier != null) { if (cashier != null) {
@ -396,6 +411,7 @@ class _$CashierImpl implements _Cashier {
required TResult Function(_Cashier value) cashier, required TResult Function(_Cashier value) cashier,
required TResult Function(_Payment value) payment, required TResult Function(_Payment value) payment,
required TResult Function(_Voided value) voided, required TResult Function(_Voided value) voided,
required TResult Function(_SplitBill value) splitBill,
}) { }) {
return cashier(this); return cashier(this);
} }
@ -407,6 +423,7 @@ class _$CashierImpl implements _Cashier {
TResult? Function(_Cashier value)? cashier, TResult? Function(_Cashier value)? cashier,
TResult? Function(_Payment value)? payment, TResult? Function(_Payment value)? payment,
TResult? Function(_Voided value)? voided, TResult? Function(_Voided value)? voided,
TResult? Function(_SplitBill value)? splitBill,
}) { }) {
return cashier?.call(this); return cashier?.call(this);
} }
@ -418,6 +435,7 @@ class _$CashierImpl implements _Cashier {
TResult Function(_Cashier value)? cashier, TResult Function(_Cashier value)? cashier,
TResult Function(_Payment value)? payment, TResult Function(_Payment value)? payment,
TResult Function(_Voided value)? voided, TResult Function(_Voided value)? voided,
TResult Function(_SplitBill value)? splitBill,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (cashier != null) { if (cashier != null) {
@ -520,6 +538,7 @@ class _$PaymentImpl implements _Payment {
required TResult Function(Order order) cashier, required TResult Function(Order order) cashier,
required TResult Function(Order order) payment, required TResult Function(Order order) payment,
required TResult Function(Order order) voided, required TResult Function(Order order) voided,
required TResult Function(Order order) splitBill,
}) { }) {
return payment(this.order); return payment(this.order);
} }
@ -531,6 +550,7 @@ class _$PaymentImpl implements _Payment {
TResult? Function(Order order)? cashier, TResult? Function(Order order)? cashier,
TResult? Function(Order order)? payment, TResult? Function(Order order)? payment,
TResult? Function(Order order)? voided, TResult? Function(Order order)? voided,
TResult? Function(Order order)? splitBill,
}) { }) {
return payment?.call(this.order); return payment?.call(this.order);
} }
@ -542,6 +562,7 @@ class _$PaymentImpl implements _Payment {
TResult Function(Order order)? cashier, TResult Function(Order order)? cashier,
TResult Function(Order order)? payment, TResult Function(Order order)? payment,
TResult Function(Order order)? voided, TResult Function(Order order)? voided,
TResult Function(Order order)? splitBill,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (payment != null) { if (payment != null) {
@ -557,6 +578,7 @@ class _$PaymentImpl implements _Payment {
required TResult Function(_Cashier value) cashier, required TResult Function(_Cashier value) cashier,
required TResult Function(_Payment value) payment, required TResult Function(_Payment value) payment,
required TResult Function(_Voided value) voided, required TResult Function(_Voided value) voided,
required TResult Function(_SplitBill value) splitBill,
}) { }) {
return payment(this); return payment(this);
} }
@ -568,6 +590,7 @@ class _$PaymentImpl implements _Payment {
TResult? Function(_Cashier value)? cashier, TResult? Function(_Cashier value)? cashier,
TResult? Function(_Payment value)? payment, TResult? Function(_Payment value)? payment,
TResult? Function(_Voided value)? voided, TResult? Function(_Voided value)? voided,
TResult? Function(_SplitBill value)? splitBill,
}) { }) {
return payment?.call(this); return payment?.call(this);
} }
@ -579,6 +602,7 @@ class _$PaymentImpl implements _Payment {
TResult Function(_Cashier value)? cashier, TResult Function(_Cashier value)? cashier,
TResult Function(_Payment value)? payment, TResult Function(_Payment value)? payment,
TResult Function(_Voided value)? voided, TResult Function(_Voided value)? voided,
TResult Function(_SplitBill value)? splitBill,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (payment != null) { if (payment != null) {
@ -681,6 +705,7 @@ class _$VoidedImpl implements _Voided {
required TResult Function(Order order) cashier, required TResult Function(Order order) cashier,
required TResult Function(Order order) payment, required TResult Function(Order order) payment,
required TResult Function(Order order) voided, required TResult Function(Order order) voided,
required TResult Function(Order order) splitBill,
}) { }) {
return voided(this.order); return voided(this.order);
} }
@ -692,6 +717,7 @@ class _$VoidedImpl implements _Voided {
TResult? Function(Order order)? cashier, TResult? Function(Order order)? cashier,
TResult? Function(Order order)? payment, TResult? Function(Order order)? payment,
TResult? Function(Order order)? voided, TResult? Function(Order order)? voided,
TResult? Function(Order order)? splitBill,
}) { }) {
return voided?.call(this.order); return voided?.call(this.order);
} }
@ -703,6 +729,7 @@ class _$VoidedImpl implements _Voided {
TResult Function(Order order)? cashier, TResult Function(Order order)? cashier,
TResult Function(Order order)? payment, TResult Function(Order order)? payment,
TResult Function(Order order)? voided, TResult Function(Order order)? voided,
TResult Function(Order order)? splitBill,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (voided != null) { if (voided != null) {
@ -718,6 +745,7 @@ class _$VoidedImpl implements _Voided {
required TResult Function(_Cashier value) cashier, required TResult Function(_Cashier value) cashier,
required TResult Function(_Payment value) payment, required TResult Function(_Payment value) payment,
required TResult Function(_Voided value) voided, required TResult Function(_Voided value) voided,
required TResult Function(_SplitBill value) splitBill,
}) { }) {
return voided(this); return voided(this);
} }
@ -729,6 +757,7 @@ class _$VoidedImpl implements _Voided {
TResult? Function(_Cashier value)? cashier, TResult? Function(_Cashier value)? cashier,
TResult? Function(_Payment value)? payment, TResult? Function(_Payment value)? payment,
TResult? Function(_Voided value)? voided, TResult? Function(_Voided value)? voided,
TResult? Function(_SplitBill value)? splitBill,
}) { }) {
return voided?.call(this); return voided?.call(this);
} }
@ -740,6 +769,7 @@ class _$VoidedImpl implements _Voided {
TResult Function(_Cashier value)? cashier, TResult Function(_Cashier value)? cashier,
TResult Function(_Payment value)? payment, TResult Function(_Payment value)? payment,
TResult Function(_Voided value)? voided, TResult Function(_Voided value)? voided,
TResult Function(_SplitBill value)? splitBill,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (voided != null) { if (voided != null) {
@ -763,6 +793,173 @@ abstract class _Voided implements PrintStruckEvent {
throw _privateConstructorUsedError; 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<TResult extends Object?>({
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 extends Object?>({
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 extends Object?>({
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<TResult extends Object?>({
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 extends Object?>({
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 extends Object?>({
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 /// @nodoc
mixin _$PrintStruckState { mixin _$PrintStruckState {
Option<Either<PrinterFailure, Unit>> get failureOrPrintStruck => Option<Either<PrinterFailure, Unit>> get failureOrPrintStruck =>

View File

@ -6,4 +6,5 @@ class PrintStruckEvent with _$PrintStruckEvent {
const factory PrintStruckEvent.cashier(Order order) = _Cashier; const factory PrintStruckEvent.cashier(Order order) = _Cashier;
const factory PrintStruckEvent.payment(Order order) = _Payment; const factory PrintStruckEvent.payment(Order order) = _Payment;
const factory PrintStruckEvent.voided(Order order) = _Voided; const factory PrintStruckEvent.voided(Order order) = _Voided;
const factory PrintStruckEvent.splitBill(Order order) = _SplitBill;
} }

View File

@ -26,4 +26,7 @@ abstract class IPrinterRepository {
required Order order, required Order order,
}); });
Future<Either<PrinterFailure, Unit>> printStruckVoid({required Order order}); Future<Either<PrinterFailure, Unit>> printStruckVoid({required Order order});
Future<Either<PrinterFailure, Unit>> printStruckSplitBill({
required Order order,
});
} }

View File

@ -498,6 +498,15 @@ class PrinterRepository implements IPrinterRepository {
return _printVoid(order: order, outlet: outlet, cashieName: user.name); return _printVoid(order: order, outlet: outlet, cashieName: user.name);
} }
@override
Future<Either<PrinterFailure, Unit>> 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 @override
Future<Either<PrinterFailure, Unit>> printStruckPayment({ Future<Either<PrinterFailure, Unit>> printStruckPayment({
required Order order, required Order order,
@ -823,4 +832,57 @@ class PrinterRepository implements IPrinterRepository {
); );
} }
} }
Future<Either<PrinterFailure, Unit>> _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'),
);
}
}
} }

View File

@ -414,4 +414,62 @@ class PrintUi {
return bytes; return bytes;
} }
Future<List<int>> printSplit({
required Order order,
required Outlet outlet,
required String cashierName,
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.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;
}
} }

View File

@ -241,7 +241,9 @@ class ReceiptComponentBuilder {
List<int> bytes = []; List<int> bytes = [];
bytes += separator(); bytes += separator();
bytes += row2Columns('Total Item', totalItems.toString()); if (totalItems > 0) {
bytes += row2Columns('Total Item', totalItems.toString());
}
bytes += row2Columns('Subtotal', subtotal); bytes += row2Columns('Subtotal', subtotal);
bytes += row2Columns('Diskon', discount); bytes += row2Columns('Diskon', discount);
bytes += separator(); bytes += separator();

View File

@ -3,10 +3,12 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../../../application/order/order_loader/order_loader_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 '../../../../../common/theme/theme.dart';
import '../../../../../injection.dart'; import '../../../../../injection.dart';
import '../../../../components/error/order_loader_error_state_widget.dart'; import '../../../../components/error/order_loader_error_state_widget.dart';
import '../../../../components/loader/loader_with_text.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_left_panel.dart';
import 'widgets/payment_success_split_bill_right_panel.dart'; import 'widgets/payment_success_split_bill_right_panel.dart';
@ -18,49 +20,64 @@ class PaymentSuccessSplitBillPage extends StatelessWidget
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return BlocListener<PrintStruckBloc, PrintStruckState>(
backgroundColor: AppColor.background, listenWhen: (previous, current) =>
body: SafeArea( previous.failureOrPrintStruck != current.failureOrPrintStruck,
child: BlocBuilder<OrderLoaderBloc, OrderLoaderState>( listener: (context, state) {
builder: (context, state) { state.failureOrPrintStruck.fold(
if (state.isFetchingById) { () {},
return const Center(child: LoaderWithText()); (either) => either.fold(
} (f) => AppFlushbar.showPrinterFailureToast(context, f),
return state.failureOptionGetById.fold( (success) {
() => Container( AppFlushbar.showSuccess(context, "Struck berhasil dicetak");
padding: const EdgeInsets.all(24.0), },
child: Row( ),
children: [ );
// Left Panel - Success Message & Order Info },
Expanded( child: Scaffold(
flex: 35, backgroundColor: AppColor.background,
child: PaymentSuccessSplitBillLeftPanel( body: SafeArea(
order: state.order, child: BlocBuilder<OrderLoaderBloc, OrderLoaderState>(
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 // Right Panel - Order Details
Expanded( Expanded(
flex: 65, flex: 65,
child: PaymentSuccessSplitBillRightPanel( child: PaymentSuccessSplitBillRightPanel(
order: state.order, order: state.order,
),
), ),
), ],
], ),
), ),
), (f) => OrderLoaderErrorStateWidget(
(f) => OrderLoaderErrorStateWidget( failure: f,
failure: f, onRefresh: () {
onRefresh: () { context.read<OrderLoaderBloc>().add(
context.read<OrderLoaderBloc>().add( OrderLoaderEvent.getById(orderId),
OrderLoaderEvent.getById(orderId), );
); },
}, ),
), );
); },
}, ),
), ),
), ),
); );

View File

@ -1,6 +1,8 @@
import 'package:auto_route/auto_route.dart'; import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.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/extension/extension.dart';
import '../../../../../../common/theme/theme.dart'; import '../../../../../../common/theme/theme.dart';
import '../../../../../../domain/order/order.dart'; import '../../../../../../domain/order/order.dart';
@ -166,22 +168,9 @@ class PaymentSuccessSplitBillLeftPanel extends StatelessWidget {
Expanded( Expanded(
child: AppElevatedButton.filled( child: AppElevatedButton.filled(
onPressed: () { onPressed: () {
// onPrintRecipt( context.read<PrintStruckBloc>().add(
// context, PrintStruckEvent.splitBill(order),
// 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,
// );
}, },
label: 'Cetak Struk', label: 'Cetak Struk',
icon: Icon(Icons.print_rounded, color: AppColor.white), icon: Icon(Icons.print_rounded, color: AppColor.white),

View File

@ -193,7 +193,11 @@ class PaymentSuccessSplitBillRightPanel extends StatelessWidget {
], ],
), ),
child: Text( child: Text(
(order.payments.last.amount).toString().currencyFormatRpV2, order.payments.isNotEmpty
? (order.payments.last.amount)
.toString()
.currencyFormatRpV2
: 0.currencyFormatRpV2,
style: AppStyle.xl.copyWith( style: AppStyle.xl.copyWith(
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: Colors.white, color: Colors.white,