print on sales

This commit is contained in:
efrilm 2025-09-19 18:49:55 +07:00
parent 7b12793618
commit 6acfbdc4ca
2 changed files with 53 additions and 0 deletions

View File

@ -1,5 +1,8 @@
import 'dart:convert'; import 'dart:convert';
import 'package:enaklo_pos/data/models/response/product_response_model.dart';
import 'package:enaklo_pos/presentation/home/models/product_quantity.dart';
class OrderDetailResponseModel { class OrderDetailResponseModel {
final bool? success; final bool? success;
final Order? data; final Order? data;
@ -380,3 +383,21 @@ class Payment {
}; };
} }
} }
extension OrderItemListExtension on List<OrderItem> {
List<ProductQuantity> toProductQuantities() => map((e) => ProductQuantity(
product: Product(
id: e.productId,
name: e.productName,
price: e.unitPrice,
printerType: e.printerType,
),
variant: ProductVariant(
id: e.productVariantId,
name: e.productVariantName,
productId: e.productId,
),
notes: e.notes ?? '',
quantity: e.quantity ?? 0,
)).toList();
}

View File

@ -1,6 +1,7 @@
import 'package:enaklo_pos/core/components/buttons.dart'; import 'package:enaklo_pos/core/components/buttons.dart';
import 'package:enaklo_pos/core/components/spaces.dart'; import 'package:enaklo_pos/core/components/spaces.dart';
import 'package:enaklo_pos/core/extensions/build_context_ext.dart'; import 'package:enaklo_pos/core/extensions/build_context_ext.dart';
import 'package:enaklo_pos/core/function/app_function.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/presentation/home/bloc/order_form/order_form_bloc.dart'; import 'package:enaklo_pos/presentation/home/bloc/order_form/order_form_bloc.dart';
import 'package:enaklo_pos/presentation/payment/pages/payment_page.dart'; import 'package:enaklo_pos/presentation/payment/pages/payment_page.dart';
@ -256,6 +257,37 @@ class _SalesPageState extends State<SalesPage> {
label: 'Refund', label: 'Refund',
icon: Icon(Icons.autorenew), icon: Icon(Icons.autorenew),
), ),
SpaceWidth(8),
Button.outlined(
onPressed: () {
if (widget.status == 'completed') {
onPrintRecipt(
context,
order: orderDetail!,
paymentMethod: orderDetail!.payments
?.map((p) => p.paymentMethodName)
.join(', ') ??
"",
nominalBayar: orderDetail?.totalPaid ?? 0,
kembalian: 0,
productQuantity: orderDetail!.orderItems!
.toProductQuantities(),
);
} else {
onPrint(
context,
productQuantity: orderDetail!.orderItems!
.toProductQuantities(),
order: orderDetail!,
);
}
},
label: 'Print',
icon: Icon(
Icons.print,
),
),
SpaceWidth(8),
], ],
), ),
Expanded( Expanded(