dev #1

Merged
aefril merged 128 commits from dev into main 2025-08-13 17:19:48 +00:00
2 changed files with 138 additions and 106 deletions
Showing only changes of commit b1a1303a40 - Show all commits

View File

@ -19,11 +19,13 @@ class PaymentPage extends StatefulWidget {
final Order order; final Order order;
final bool isSplit; final bool isSplit;
final String? splitType; final String? splitType;
final String? customerId;
const PaymentPage({ const PaymentPage({
super.key, super.key,
required this.order, required this.order,
this.isSplit = false, this.isSplit = false,
this.splitType, this.splitType,
this.customerId,
}); });
@override @override
@ -462,7 +464,7 @@ class _PaymentPageState extends State<PaymentPage> {
} else { } else {
final request = PaymentSplitBillRequest( final request = PaymentSplitBillRequest(
amount: widget.order.totalAmount ?? 0, amount: widget.order.totalAmount ?? 0,
customerId: '', customerId: widget.customerId ?? "",
items: itemPending items: itemPending
?.map((item) => SplitItem( ?.map((item) => SplitItem(
orderItemId: item.id ?? "", orderItemId: item.id ?? "",

View File

@ -2,7 +2,9 @@ import 'dart:developer';
import 'package:enaklo_pos/core/components/flushbar.dart'; import 'package:enaklo_pos/core/components/flushbar.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/data/models/response/customer_response_model.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/widgets/customer_auto_complete_field.dart';
import 'package:enaklo_pos/presentation/payment/pages/payment_page.dart'; import 'package:enaklo_pos/presentation/payment/pages/payment_page.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -26,6 +28,9 @@ class SplitBillPage extends StatefulWidget {
} }
class _SplitBillPageState extends State<SplitBillPage> { class _SplitBillPageState extends State<SplitBillPage> {
final customerController = TextEditingController();
Customer? selectedCustomer;
int selectedSplitType = 0; // 0 = Per Product, 1 = Per Amount int selectedSplitType = 0; // 0 = Per Product, 1 = Per Amount
// Per Product Split Data // Per Product Split Data
@ -186,64 +191,70 @@ class _SplitBillPageState extends State<SplitBillPage> {
flex: 3, flex: 3,
child: Container( child: Container(
padding: EdgeInsets.all(24), padding: EdgeInsets.all(24),
child: Column( child: SingleChildScrollView(
crossAxisAlignment: CrossAxisAlignment.start, child: Column(
children: [ crossAxisAlignment: CrossAxisAlignment.start,
Text( children: [
'Bagi Bill', Text(
style: TextStyle( 'Bagi Bill',
fontSize: 24, style: TextStyle(
fontWeight: FontWeight.bold, fontSize: 24,
color: AppColorSplitBill.textPrimary, fontWeight: FontWeight.bold,
color: AppColorSplitBill.textPrimary,
),
), ),
), SizedBox(height: 24),
SizedBox(height: 24),
// Split Type Selection _buildCustomer(context),
Row(
children: [
_buildSplitTypeButton('Per Produk', 0),
SizedBox(width: 16),
_buildSplitTypeButton('Per Jumlah', 1),
],
),
SizedBox(height: 32), SizedBox(height: 24),
// Split Content // Split Type Selection
Expanded( Row(
child: selectedSplitType == 0 children: [
? _buildPerProductSplit() _buildSplitTypeButton('Per Produk', 0),
: _buildPerAmountSplit(), SizedBox(width: 16),
), _buildSplitTypeButton('Per Jumlah', 1),
],
),
SizedBox(height: 24), SizedBox(height: 32),
// Action Buttons // Split Content
Row( Container(
children: [ child: selectedSplitType == 0
Expanded( ? _buildPerProductSplit()
child: _buildActionButton( : _buildPerAmountSplit(),
'Batal', ),
AppColorSplitBill.textSecondary,
Colors.transparent, SizedBox(height: 24),
() => Navigator.pop(context),
// Action Buttons
Row(
children: [
Expanded(
child: _buildActionButton(
'Batal',
AppColorSplitBill.textSecondary,
Colors.transparent,
() => Navigator.pop(context),
),
), ),
), SizedBox(width: 16),
SizedBox(width: 16), Expanded(
Expanded( child: _buildActionButton(
child: _buildActionButton( 'Konfirmasi Split',
'Konfirmasi Split', Colors.white,
Colors.white, AppColorSplitBill.primary,
AppColorSplitBill.primary, () {
() { _confirmSplit();
_confirmSplit(); },
}, ),
), ),
), ],
], ),
), ],
], ),
), ),
), ),
), ),
@ -252,6 +263,26 @@ class _SplitBillPageState extends State<SplitBillPage> {
); );
} }
Widget _buildCustomer(BuildContext context) {
return Container(
padding: EdgeInsets.all(16),
decoration: BoxDecoration(
color: AppColorSplitBill.cardBackground,
border: Border.all(color: AppColorSplitBill.border),
borderRadius: BorderRadius.circular(8),
),
child: CustomerAutocomplete(
controller: customerController,
selectedCustomer: selectedCustomer,
onSelected: (customer) {
setState(() {
selectedCustomer = customer;
});
},
),
);
}
Widget _buildOrderItem(OrderItem item) { Widget _buildOrderItem(OrderItem item) {
return Container( return Container(
padding: EdgeInsets.symmetric(vertical: 12), padding: EdgeInsets.symmetric(vertical: 12),
@ -347,64 +378,61 @@ class _SplitBillPageState extends State<SplitBillPage> {
), ),
), ),
SizedBox(height: 16), SizedBox(height: 16),
Expanded( Container(
child: Container( padding: EdgeInsets.all(16),
padding: EdgeInsets.all(16), decoration: BoxDecoration(
decoration: BoxDecoration( color: AppColorSplitBill.cardBackground,
color: AppColorSplitBill.cardBackground, border: Border.all(color: AppColorSplitBill.border),
border: Border.all(color: AppColorSplitBill.border), borderRadius: BorderRadius.circular(8),
borderRadius: BorderRadius.circular(8), ),
), child: Column(
child: Column( crossAxisAlignment: CrossAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start, children: [
children: [ Text(
Text( 'Split Bill',
'Split Bill', style: TextStyle(
style: TextStyle( fontSize: 16,
fontSize: 16, fontWeight: FontWeight.bold,
fontWeight: FontWeight.bold, color: AppColorSplitBill.primary,
color: AppColorSplitBill.primary,
),
), ),
SizedBox(height: 16), ),
Expanded( SizedBox(height: 16),
child: ListView.builder( ListView.builder(
itemCount: getOrderItemPending().length, itemCount: getOrderItemPending().length,
itemBuilder: (context, index) { shrinkWrap: true,
return _buildProductSplitItem( physics: NeverScrollableScrollPhysics(),
getOrderItemPending()[index]); itemBuilder: (context, index) {
}, return _buildProductSplitItem(getOrderItemPending()[index]);
), },
), ),
Container( Container(
width: double.infinity, width: double.infinity,
height: 1, height: 1,
color: AppColorSplitBill.border, color: AppColorSplitBill.border,
margin: EdgeInsets.symmetric(vertical: 12), margin: EdgeInsets.symmetric(vertical: 12),
), ),
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
'Total Split:', 'Total Split:',
style: TextStyle( style: TextStyle(
fontSize: 16, fontSize: 16,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
color: AppColorSplitBill.textPrimary, color: AppColorSplitBill.textPrimary,
),
), ),
Text( ),
'Rp ${_formatCurrency(_calculateSplitTotal())}', Text(
style: TextStyle( 'Rp ${_formatCurrency(_calculateSplitTotal())}',
fontSize: 16, style: TextStyle(
fontWeight: FontWeight.w600, fontSize: 16,
color: AppColorSplitBill.primary, fontWeight: FontWeight.w600,
), color: AppColorSplitBill.primary,
), ),
], ),
), ],
], ),
), ],
), ),
), ),
], ],
@ -764,6 +792,7 @@ class _SplitBillPageState extends State<SplitBillPage> {
order: splitOrder, order: splitOrder,
isSplit: true, isSplit: true,
splitType: 'ITEM', splitType: 'ITEM',
customerId: selectedCustomer?.id,
)); ));
} else { } else {
AppFlushbar.showError(context, "Pilih minimal satu produk untuk split"); AppFlushbar.showError(context, "Pilih minimal satu produk untuk split");
@ -790,6 +819,7 @@ class _SplitBillPageState extends State<SplitBillPage> {
order: splitOrder, order: splitOrder,
isSplit: true, isSplit: true,
splitType: 'AMOUNT', splitType: 'AMOUNT',
customerId: selectedCustomer?.id,
), ),
); );
} else if (splitAmount > totalAmount) { } else if (splitAmount > totalAmount) {