create order with payment

This commit is contained in:
efrilm 2025-10-28 00:58:39 +07:00
parent 37f0008ec8
commit 137f3d9636
20 changed files with 2815 additions and 1086 deletions

View File

@ -66,6 +66,46 @@ class OrderFormBloc extends Bloc<OrderFormEvent, OrderFormState> {
.toList(),
);
failureOrOrder = await _repository.createOrderWithPayment(
request: request,
paymentMethodId: state.paymentMethod?.id ?? '',
);
emit(
state.copyWith(
isCreating: false,
failureOrCreateOrder: optionOf(failureOrOrder),
),
);
},
createOrder: (e) async {
Either<OrderFailure, Order> failureOrOrder;
emit(state.copyWith(isCreating: true, failureOrCreateOrder: none()));
final outlet = await _outletRepository.currentOutlet();
final request = OrderRequest(
outletId: outlet.id,
customerId: state.customer?.id ?? '',
tableNumber: e.table?.tableName ?? '',
tableId: e.table?.id ?? '',
orderType: e.orderType.name,
notes: '',
customerName: state.customerName ?? "",
orderItems: e.items
.map(
(item) => OrderItemRequest(
productId: item.product.id,
productVariantId: item.variant?.id ?? "",
quantity: item.quantity,
unitPrice: item.product.price.toInt(),
notes: item.notes,
),
)
.toList(),
);
failureOrOrder = await _repository.createOrder(request: request);
emit(

View File

@ -28,6 +28,12 @@ mixin _$OrderFormEvent {
Table? table,
)
createOrderWithPayment,
required TResult Function(
List<ProductQuantity> items,
OrderType orderType,
Table? table,
)
createOrder,
}) => throw _privateConstructorUsedError;
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
@ -40,6 +46,12 @@ mixin _$OrderFormEvent {
Table? table,
)?
createOrderWithPayment,
TResult? Function(
List<ProductQuantity> items,
OrderType orderType,
Table? table,
)?
createOrder,
}) => throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
@ -52,6 +64,12 @@ mixin _$OrderFormEvent {
Table? table,
)?
createOrderWithPayment,
TResult Function(
List<ProductQuantity> items,
OrderType orderType,
Table? table,
)?
createOrder,
required TResult orElse(),
}) => throw _privateConstructorUsedError;
@optionalTypeArgs
@ -61,6 +79,7 @@ mixin _$OrderFormEvent {
required TResult Function(_CustomerChanged value) customerChanged,
required TResult Function(_CreateOrderWithPayment value)
createOrderWithPayment,
required TResult Function(_CreateOrder value) createOrder,
}) => throw _privateConstructorUsedError;
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
@ -68,6 +87,7 @@ mixin _$OrderFormEvent {
TResult? Function(_PaymentMethodChanged value)? paymentMethodChanged,
TResult? Function(_CustomerChanged value)? customerChanged,
TResult? Function(_CreateOrderWithPayment value)? createOrderWithPayment,
TResult? Function(_CreateOrder value)? createOrder,
}) => throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
@ -75,6 +95,7 @@ mixin _$OrderFormEvent {
TResult Function(_PaymentMethodChanged value)? paymentMethodChanged,
TResult Function(_CustomerChanged value)? customerChanged,
TResult Function(_CreateOrderWithPayment value)? createOrderWithPayment,
TResult Function(_CreateOrder value)? createOrder,
required TResult orElse(),
}) => throw _privateConstructorUsedError;
}
@ -194,6 +215,12 @@ class _$CustomerNameChangedImpl
Table? table,
)
createOrderWithPayment,
required TResult Function(
List<ProductQuantity> items,
OrderType orderType,
Table? table,
)
createOrder,
}) {
return customerNameChanged(customerName);
}
@ -210,6 +237,12 @@ class _$CustomerNameChangedImpl
Table? table,
)?
createOrderWithPayment,
TResult? Function(
List<ProductQuantity> items,
OrderType orderType,
Table? table,
)?
createOrder,
}) {
return customerNameChanged?.call(customerName);
}
@ -226,6 +259,12 @@ class _$CustomerNameChangedImpl
Table? table,
)?
createOrderWithPayment,
TResult Function(
List<ProductQuantity> items,
OrderType orderType,
Table? table,
)?
createOrder,
required TResult orElse(),
}) {
if (customerNameChanged != null) {
@ -242,6 +281,7 @@ class _$CustomerNameChangedImpl
required TResult Function(_CustomerChanged value) customerChanged,
required TResult Function(_CreateOrderWithPayment value)
createOrderWithPayment,
required TResult Function(_CreateOrder value) createOrder,
}) {
return customerNameChanged(this);
}
@ -253,6 +293,7 @@ class _$CustomerNameChangedImpl
TResult? Function(_PaymentMethodChanged value)? paymentMethodChanged,
TResult? Function(_CustomerChanged value)? customerChanged,
TResult? Function(_CreateOrderWithPayment value)? createOrderWithPayment,
TResult? Function(_CreateOrder value)? createOrder,
}) {
return customerNameChanged?.call(this);
}
@ -264,6 +305,7 @@ class _$CustomerNameChangedImpl
TResult Function(_PaymentMethodChanged value)? paymentMethodChanged,
TResult Function(_CustomerChanged value)? customerChanged,
TResult Function(_CreateOrderWithPayment value)? createOrderWithPayment,
TResult Function(_CreateOrder value)? createOrder,
required TResult orElse(),
}) {
if (customerNameChanged != null) {
@ -391,6 +433,12 @@ class _$PaymentMethodChangedImpl
Table? table,
)
createOrderWithPayment,
required TResult Function(
List<ProductQuantity> items,
OrderType orderType,
Table? table,
)
createOrder,
}) {
return paymentMethodChanged(payment);
}
@ -407,6 +455,12 @@ class _$PaymentMethodChangedImpl
Table? table,
)?
createOrderWithPayment,
TResult? Function(
List<ProductQuantity> items,
OrderType orderType,
Table? table,
)?
createOrder,
}) {
return paymentMethodChanged?.call(payment);
}
@ -423,6 +477,12 @@ class _$PaymentMethodChangedImpl
Table? table,
)?
createOrderWithPayment,
TResult Function(
List<ProductQuantity> items,
OrderType orderType,
Table? table,
)?
createOrder,
required TResult orElse(),
}) {
if (paymentMethodChanged != null) {
@ -439,6 +499,7 @@ class _$PaymentMethodChangedImpl
required TResult Function(_CustomerChanged value) customerChanged,
required TResult Function(_CreateOrderWithPayment value)
createOrderWithPayment,
required TResult Function(_CreateOrder value) createOrder,
}) {
return paymentMethodChanged(this);
}
@ -450,6 +511,7 @@ class _$PaymentMethodChangedImpl
TResult? Function(_PaymentMethodChanged value)? paymentMethodChanged,
TResult? Function(_CustomerChanged value)? customerChanged,
TResult? Function(_CreateOrderWithPayment value)? createOrderWithPayment,
TResult? Function(_CreateOrder value)? createOrder,
}) {
return paymentMethodChanged?.call(this);
}
@ -461,6 +523,7 @@ class _$PaymentMethodChangedImpl
TResult Function(_PaymentMethodChanged value)? paymentMethodChanged,
TResult Function(_CustomerChanged value)? customerChanged,
TResult Function(_CreateOrderWithPayment value)? createOrderWithPayment,
TResult Function(_CreateOrder value)? createOrder,
required TResult orElse(),
}) {
if (paymentMethodChanged != null) {
@ -592,6 +655,12 @@ class _$CustomerChangedImpl
Table? table,
)
createOrderWithPayment,
required TResult Function(
List<ProductQuantity> items,
OrderType orderType,
Table? table,
)
createOrder,
}) {
return customerChanged(customer);
}
@ -608,6 +677,12 @@ class _$CustomerChangedImpl
Table? table,
)?
createOrderWithPayment,
TResult? Function(
List<ProductQuantity> items,
OrderType orderType,
Table? table,
)?
createOrder,
}) {
return customerChanged?.call(customer);
}
@ -624,6 +699,12 @@ class _$CustomerChangedImpl
Table? table,
)?
createOrderWithPayment,
TResult Function(
List<ProductQuantity> items,
OrderType orderType,
Table? table,
)?
createOrder,
required TResult orElse(),
}) {
if (customerChanged != null) {
@ -640,6 +721,7 @@ class _$CustomerChangedImpl
required TResult Function(_CustomerChanged value) customerChanged,
required TResult Function(_CreateOrderWithPayment value)
createOrderWithPayment,
required TResult Function(_CreateOrder value) createOrder,
}) {
return customerChanged(this);
}
@ -651,6 +733,7 @@ class _$CustomerChangedImpl
TResult? Function(_PaymentMethodChanged value)? paymentMethodChanged,
TResult? Function(_CustomerChanged value)? customerChanged,
TResult? Function(_CreateOrderWithPayment value)? createOrderWithPayment,
TResult? Function(_CreateOrder value)? createOrder,
}) {
return customerChanged?.call(this);
}
@ -662,6 +745,7 @@ class _$CustomerChangedImpl
TResult Function(_PaymentMethodChanged value)? paymentMethodChanged,
TResult Function(_CustomerChanged value)? customerChanged,
TResult Function(_CreateOrderWithPayment value)? createOrderWithPayment,
TResult Function(_CreateOrder value)? createOrder,
required TResult orElse(),
}) {
if (customerChanged != null) {
@ -831,6 +915,12 @@ class _$CreateOrderWithPaymentImpl
Table? table,
)
createOrderWithPayment,
required TResult Function(
List<ProductQuantity> items,
OrderType orderType,
Table? table,
)
createOrder,
}) {
return createOrderWithPayment(items, orderType, table);
}
@ -847,6 +937,12 @@ class _$CreateOrderWithPaymentImpl
Table? table,
)?
createOrderWithPayment,
TResult? Function(
List<ProductQuantity> items,
OrderType orderType,
Table? table,
)?
createOrder,
}) {
return createOrderWithPayment?.call(items, orderType, table);
}
@ -863,6 +959,12 @@ class _$CreateOrderWithPaymentImpl
Table? table,
)?
createOrderWithPayment,
TResult Function(
List<ProductQuantity> items,
OrderType orderType,
Table? table,
)?
createOrder,
required TResult orElse(),
}) {
if (createOrderWithPayment != null) {
@ -879,6 +981,7 @@ class _$CreateOrderWithPaymentImpl
required TResult Function(_CustomerChanged value) customerChanged,
required TResult Function(_CreateOrderWithPayment value)
createOrderWithPayment,
required TResult Function(_CreateOrder value) createOrder,
}) {
return createOrderWithPayment(this);
}
@ -890,6 +993,7 @@ class _$CreateOrderWithPaymentImpl
TResult? Function(_PaymentMethodChanged value)? paymentMethodChanged,
TResult? Function(_CustomerChanged value)? customerChanged,
TResult? Function(_CreateOrderWithPayment value)? createOrderWithPayment,
TResult? Function(_CreateOrder value)? createOrder,
}) {
return createOrderWithPayment?.call(this);
}
@ -901,6 +1005,7 @@ class _$CreateOrderWithPaymentImpl
TResult Function(_PaymentMethodChanged value)? paymentMethodChanged,
TResult Function(_CustomerChanged value)? customerChanged,
TResult Function(_CreateOrderWithPayment value)? createOrderWithPayment,
TResult Function(_CreateOrder value)? createOrder,
required TResult orElse(),
}) {
if (createOrderWithPayment != null) {
@ -928,6 +1033,263 @@ abstract class _CreateOrderWithPayment implements OrderFormEvent {
get copyWith => throw _privateConstructorUsedError;
}
/// @nodoc
abstract class _$$CreateOrderImplCopyWith<$Res> {
factory _$$CreateOrderImplCopyWith(
_$CreateOrderImpl value,
$Res Function(_$CreateOrderImpl) then,
) = __$$CreateOrderImplCopyWithImpl<$Res>;
@useResult
$Res call({List<ProductQuantity> items, OrderType orderType, Table? table});
$TableCopyWith<$Res>? get table;
}
/// @nodoc
class __$$CreateOrderImplCopyWithImpl<$Res>
extends _$OrderFormEventCopyWithImpl<$Res, _$CreateOrderImpl>
implements _$$CreateOrderImplCopyWith<$Res> {
__$$CreateOrderImplCopyWithImpl(
_$CreateOrderImpl _value,
$Res Function(_$CreateOrderImpl) _then,
) : super(_value, _then);
/// Create a copy of OrderFormEvent
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? items = null,
Object? orderType = null,
Object? table = freezed,
}) {
return _then(
_$CreateOrderImpl(
items: null == items
? _value._items
: items // ignore: cast_nullable_to_non_nullable
as List<ProductQuantity>,
orderType: null == orderType
? _value.orderType
: orderType // ignore: cast_nullable_to_non_nullable
as OrderType,
table: freezed == table
? _value.table
: table // ignore: cast_nullable_to_non_nullable
as Table?,
),
);
}
/// Create a copy of OrderFormEvent
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$TableCopyWith<$Res>? get table {
if (_value.table == null) {
return null;
}
return $TableCopyWith<$Res>(_value.table!, (value) {
return _then(_value.copyWith(table: value));
});
}
}
/// @nodoc
class _$CreateOrderImpl with DiagnosticableTreeMixin implements _CreateOrder {
const _$CreateOrderImpl({
required final List<ProductQuantity> items,
required this.orderType,
this.table,
}) : _items = items;
final List<ProductQuantity> _items;
@override
List<ProductQuantity> get items {
if (_items is EqualUnmodifiableListView) return _items;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(_items);
}
@override
final OrderType orderType;
@override
final Table? table;
@override
String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
return 'OrderFormEvent.createOrder(items: $items, orderType: $orderType, table: $table)';
}
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
super.debugFillProperties(properties);
properties
..add(DiagnosticsProperty('type', 'OrderFormEvent.createOrder'))
..add(DiagnosticsProperty('items', items))
..add(DiagnosticsProperty('orderType', orderType))
..add(DiagnosticsProperty('table', table));
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$CreateOrderImpl &&
const DeepCollectionEquality().equals(other._items, _items) &&
(identical(other.orderType, orderType) ||
other.orderType == orderType) &&
(identical(other.table, table) || other.table == table));
}
@override
int get hashCode => Object.hash(
runtimeType,
const DeepCollectionEquality().hash(_items),
orderType,
table,
);
/// Create a copy of OrderFormEvent
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$CreateOrderImplCopyWith<_$CreateOrderImpl> get copyWith =>
__$$CreateOrderImplCopyWithImpl<_$CreateOrderImpl>(this, _$identity);
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function(String customerName) customerNameChanged,
required TResult Function(PaymentMethod payment) paymentMethodChanged,
required TResult Function(Customer? customer) customerChanged,
required TResult Function(
List<ProductQuantity> items,
OrderType orderType,
Table? table,
)
createOrderWithPayment,
required TResult Function(
List<ProductQuantity> items,
OrderType orderType,
Table? table,
)
createOrder,
}) {
return createOrder(items, orderType, table);
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function(String customerName)? customerNameChanged,
TResult? Function(PaymentMethod payment)? paymentMethodChanged,
TResult? Function(Customer? customer)? customerChanged,
TResult? Function(
List<ProductQuantity> items,
OrderType orderType,
Table? table,
)?
createOrderWithPayment,
TResult? Function(
List<ProductQuantity> items,
OrderType orderType,
Table? table,
)?
createOrder,
}) {
return createOrder?.call(items, orderType, table);
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function(String customerName)? customerNameChanged,
TResult Function(PaymentMethod payment)? paymentMethodChanged,
TResult Function(Customer? customer)? customerChanged,
TResult Function(
List<ProductQuantity> items,
OrderType orderType,
Table? table,
)?
createOrderWithPayment,
TResult Function(
List<ProductQuantity> items,
OrderType orderType,
Table? table,
)?
createOrder,
required TResult orElse(),
}) {
if (createOrder != null) {
return createOrder(items, orderType, table);
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_CustomerNameChanged value) customerNameChanged,
required TResult Function(_PaymentMethodChanged value) paymentMethodChanged,
required TResult Function(_CustomerChanged value) customerChanged,
required TResult Function(_CreateOrderWithPayment value)
createOrderWithPayment,
required TResult Function(_CreateOrder value) createOrder,
}) {
return createOrder(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_CustomerNameChanged value)? customerNameChanged,
TResult? Function(_PaymentMethodChanged value)? paymentMethodChanged,
TResult? Function(_CustomerChanged value)? customerChanged,
TResult? Function(_CreateOrderWithPayment value)? createOrderWithPayment,
TResult? Function(_CreateOrder value)? createOrder,
}) {
return createOrder?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_CustomerNameChanged value)? customerNameChanged,
TResult Function(_PaymentMethodChanged value)? paymentMethodChanged,
TResult Function(_CustomerChanged value)? customerChanged,
TResult Function(_CreateOrderWithPayment value)? createOrderWithPayment,
TResult Function(_CreateOrder value)? createOrder,
required TResult orElse(),
}) {
if (createOrder != null) {
return createOrder(this);
}
return orElse();
}
}
abstract class _CreateOrder implements OrderFormEvent {
const factory _CreateOrder({
required final List<ProductQuantity> items,
required final OrderType orderType,
final Table? table,
}) = _$CreateOrderImpl;
List<ProductQuantity> get items;
OrderType get orderType;
Table? get table;
/// Create a copy of OrderFormEvent
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
_$$CreateOrderImplCopyWith<_$CreateOrderImpl> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
mixin _$OrderFormState {
PaymentMethod? get paymentMethod => throw _privateConstructorUsedError;
@ -935,7 +1297,10 @@ mixin _$OrderFormState {
Customer? get customer => throw _privateConstructorUsedError;
Option<Either<OrderFailure, Order>> get failureOrCreateOrder =>
throw _privateConstructorUsedError;
Option<Either<OrderFailure, Order>> get failureOrCreateOrderWithPayment =>
throw _privateConstructorUsedError;
bool get isCreating => throw _privateConstructorUsedError;
bool get isCreatingWithPayment => throw _privateConstructorUsedError;
/// Create a copy of OrderFormState
/// with the given fields replaced by the non-null parameter values.
@ -956,7 +1321,9 @@ abstract class $OrderFormStateCopyWith<$Res> {
String? customerName,
Customer? customer,
Option<Either<OrderFailure, Order>> failureOrCreateOrder,
Option<Either<OrderFailure, Order>> failureOrCreateOrderWithPayment,
bool isCreating,
bool isCreatingWithPayment,
});
$PaymentMethodCopyWith<$Res>? get paymentMethod;
@ -982,7 +1349,9 @@ class _$OrderFormStateCopyWithImpl<$Res, $Val extends OrderFormState>
Object? customerName = freezed,
Object? customer = freezed,
Object? failureOrCreateOrder = null,
Object? failureOrCreateOrderWithPayment = null,
Object? isCreating = null,
Object? isCreatingWithPayment = null,
}) {
return _then(
_value.copyWith(
@ -1002,10 +1371,19 @@ class _$OrderFormStateCopyWithImpl<$Res, $Val extends OrderFormState>
? _value.failureOrCreateOrder
: failureOrCreateOrder // ignore: cast_nullable_to_non_nullable
as Option<Either<OrderFailure, Order>>,
failureOrCreateOrderWithPayment:
null == failureOrCreateOrderWithPayment
? _value.failureOrCreateOrderWithPayment
: failureOrCreateOrderWithPayment // ignore: cast_nullable_to_non_nullable
as Option<Either<OrderFailure, Order>>,
isCreating: null == isCreating
? _value.isCreating
: isCreating // ignore: cast_nullable_to_non_nullable
as bool,
isCreatingWithPayment: null == isCreatingWithPayment
? _value.isCreatingWithPayment
: isCreatingWithPayment // ignore: cast_nullable_to_non_nullable
as bool,
)
as $Val,
);
@ -1054,7 +1432,9 @@ abstract class _$$OrderFormStateImplCopyWith<$Res>
String? customerName,
Customer? customer,
Option<Either<OrderFailure, Order>> failureOrCreateOrder,
Option<Either<OrderFailure, Order>> failureOrCreateOrderWithPayment,
bool isCreating,
bool isCreatingWithPayment,
});
@override
@ -1081,7 +1461,9 @@ class __$$OrderFormStateImplCopyWithImpl<$Res>
Object? customerName = freezed,
Object? customer = freezed,
Object? failureOrCreateOrder = null,
Object? failureOrCreateOrderWithPayment = null,
Object? isCreating = null,
Object? isCreatingWithPayment = null,
}) {
return _then(
_$OrderFormStateImpl(
@ -1101,10 +1483,18 @@ class __$$OrderFormStateImplCopyWithImpl<$Res>
? _value.failureOrCreateOrder
: failureOrCreateOrder // ignore: cast_nullable_to_non_nullable
as Option<Either<OrderFailure, Order>>,
failureOrCreateOrderWithPayment: null == failureOrCreateOrderWithPayment
? _value.failureOrCreateOrderWithPayment
: failureOrCreateOrderWithPayment // ignore: cast_nullable_to_non_nullable
as Option<Either<OrderFailure, Order>>,
isCreating: null == isCreating
? _value.isCreating
: isCreating // ignore: cast_nullable_to_non_nullable
as bool,
isCreatingWithPayment: null == isCreatingWithPayment
? _value.isCreatingWithPayment
: isCreatingWithPayment // ignore: cast_nullable_to_non_nullable
as bool,
),
);
}
@ -1120,7 +1510,9 @@ class _$OrderFormStateImpl
this.customerName,
this.customer,
required this.failureOrCreateOrder,
required this.failureOrCreateOrderWithPayment,
this.isCreating = false,
this.isCreatingWithPayment = false,
});
@override
@ -1132,12 +1524,17 @@ class _$OrderFormStateImpl
@override
final Option<Either<OrderFailure, Order>> failureOrCreateOrder;
@override
final Option<Either<OrderFailure, Order>> failureOrCreateOrderWithPayment;
@override
@JsonKey()
final bool isCreating;
@override
@JsonKey()
final bool isCreatingWithPayment;
@override
String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
return 'OrderFormState(paymentMethod: $paymentMethod, customerName: $customerName, customer: $customer, failureOrCreateOrder: $failureOrCreateOrder, isCreating: $isCreating)';
return 'OrderFormState(paymentMethod: $paymentMethod, customerName: $customerName, customer: $customer, failureOrCreateOrder: $failureOrCreateOrder, failureOrCreateOrderWithPayment: $failureOrCreateOrderWithPayment, isCreating: $isCreating, isCreatingWithPayment: $isCreatingWithPayment)';
}
@override
@ -1149,7 +1546,16 @@ class _$OrderFormStateImpl
..add(DiagnosticsProperty('customerName', customerName))
..add(DiagnosticsProperty('customer', customer))
..add(DiagnosticsProperty('failureOrCreateOrder', failureOrCreateOrder))
..add(DiagnosticsProperty('isCreating', isCreating));
..add(
DiagnosticsProperty(
'failureOrCreateOrderWithPayment',
failureOrCreateOrderWithPayment,
),
)
..add(DiagnosticsProperty('isCreating', isCreating))
..add(
DiagnosticsProperty('isCreatingWithPayment', isCreatingWithPayment),
);
}
@override
@ -1165,8 +1571,16 @@ class _$OrderFormStateImpl
other.customer == customer) &&
(identical(other.failureOrCreateOrder, failureOrCreateOrder) ||
other.failureOrCreateOrder == failureOrCreateOrder) &&
(identical(
other.failureOrCreateOrderWithPayment,
failureOrCreateOrderWithPayment,
) ||
other.failureOrCreateOrderWithPayment ==
failureOrCreateOrderWithPayment) &&
(identical(other.isCreating, isCreating) ||
other.isCreating == isCreating));
other.isCreating == isCreating) &&
(identical(other.isCreatingWithPayment, isCreatingWithPayment) ||
other.isCreatingWithPayment == isCreatingWithPayment));
}
@override
@ -1176,7 +1590,9 @@ class _$OrderFormStateImpl
customerName,
customer,
failureOrCreateOrder,
failureOrCreateOrderWithPayment,
isCreating,
isCreatingWithPayment,
);
/// Create a copy of OrderFormState
@ -1197,7 +1613,10 @@ abstract class _OrderFormState implements OrderFormState {
final String? customerName,
final Customer? customer,
required final Option<Either<OrderFailure, Order>> failureOrCreateOrder,
required final Option<Either<OrderFailure, Order>>
failureOrCreateOrderWithPayment,
final bool isCreating,
final bool isCreatingWithPayment,
}) = _$OrderFormStateImpl;
@override
@ -1209,7 +1628,11 @@ abstract class _OrderFormState implements OrderFormState {
@override
Option<Either<OrderFailure, Order>> get failureOrCreateOrder;
@override
Option<Either<OrderFailure, Order>> get failureOrCreateOrderWithPayment;
@override
bool get isCreating;
@override
bool get isCreatingWithPayment;
/// Create a copy of OrderFormState
/// with the given fields replaced by the non-null parameter values.

View File

@ -13,4 +13,10 @@ class OrderFormEvent with _$OrderFormEvent {
required OrderType orderType,
Table? table,
}) = _CreateOrderWithPayment;
const factory OrderFormEvent.createOrder({
required List<ProductQuantity> items,
required OrderType orderType,
Table? table,
}) = _CreateOrder;
}

View File

@ -7,9 +7,14 @@ class OrderFormState with _$OrderFormState {
String? customerName,
Customer? customer,
required Option<Either<OrderFailure, Order>> failureOrCreateOrder,
required Option<Either<OrderFailure, Order>>
failureOrCreateOrderWithPayment,
@Default(false) bool isCreating,
@Default(false) bool isCreatingWithPayment,
}) = _OrderFormState;
factory OrderFormState.initial() =>
OrderFormState(failureOrCreateOrder: none());
factory OrderFormState.initial() => OrderFormState(
failureOrCreateOrder: none(),
failureOrCreateOrderWithPayment: none(),
);
}

View File

@ -7,4 +7,5 @@ class ApiPath {
static const String customers = '/api/v1/customers';
static const String paymentMethods = '/api/v1/payment-methods';
static const String orders = '/api/v1/orders';
static const String payments = '/api/v1/payments';
}

View File

@ -39,7 +39,7 @@ class Order with _$Order {
required DateTime createdAt,
required DateTime updatedAt,
required List<OrderItem> orderItems,
required List<PaymentOrder> payments,
required List<Payment> payments,
required int totalPaid,
required int paymentCount,
required String splitType,
@ -115,40 +115,3 @@ class OrderItem with _$OrderItem {
paidQuantity: 0,
);
}
@freezed
class PaymentOrder with _$PaymentOrder {
const factory PaymentOrder({
required String id,
required String orderId,
required String paymentMethodId,
required String paymentMethodName,
required String paymentMethodType,
required int amount,
required String status,
required int splitNumber,
required int splitTotal,
required String splitDescription,
required int refundAmount,
required Map<String, dynamic> metadata,
required DateTime createdAt,
required DateTime updatedAt,
}) = _PaymentOrder;
factory PaymentOrder.empty() => PaymentOrder(
id: '',
orderId: '',
paymentMethodId: '',
paymentMethodName: '',
paymentMethodType: '',
amount: 0,
status: '',
splitNumber: 0,
splitTotal: 0,
splitDescription: '',
refundAmount: 0,
metadata: const {},
createdAt: DateTime(1970),
updatedAt: DateTime(1970),
);
}

View File

@ -0,0 +1,38 @@
part of '../order.dart';
@freezed
class Payment with _$Payment {
const factory Payment({
required String id,
required String orderId,
required String paymentMethodId,
required String paymentMethodName,
required String paymentMethodType,
required int amount,
required String status,
required int splitNumber,
required int splitTotal,
required String splitDescription,
required int refundAmount,
required Map<String, dynamic> metadata,
required DateTime createdAt,
required DateTime updatedAt,
}) = _Payment;
factory Payment.empty() => Payment(
id: '',
orderId: '',
paymentMethodId: '',
paymentMethodName: '',
paymentMethodType: '',
amount: 0,
status: '',
splitNumber: 0,
splitTotal: 0,
splitDescription: '',
refundAmount: 0,
metadata: const {},
createdAt: DateTime(1970),
updatedAt: DateTime(1970),
);
}

View File

@ -0,0 +1,37 @@
part of '../order.dart';
@freezed
class PaymentRequest with _$PaymentRequest {
const factory PaymentRequest({
required String orderId,
required String paymentMethodId,
required int amount,
required String transactionId,
required int splitNumber,
required int splitTotal,
required String splitDescription,
required List<PaymentItemRequest> paymentOrderItems,
}) = _PaymentRequest;
factory PaymentRequest.empty() => const PaymentRequest(
orderId: '',
paymentMethodId: '',
amount: 0,
transactionId: '',
splitNumber: 0,
splitTotal: 0,
splitDescription: '',
paymentOrderItems: [],
);
}
@freezed
class PaymentItemRequest with _$PaymentItemRequest {
const factory PaymentItemRequest({
required String orderItemId,
required int amount,
}) = _PaymentItemRequest;
factory PaymentItemRequest.empty() =>
const PaymentItemRequest(orderItemId: '', amount: 0);
}

View File

@ -7,5 +7,7 @@ part 'order.freezed.dart';
part 'entities/order_entity.dart';
part 'entities/order_request_entity.dart';
part 'entities/payment_request_entity.dart';
part 'entities/payment_entity.dart';
part 'failures/order_failure.dart';
part 'repositories/i_order_repository.dart';

File diff suppressed because it is too large Load Diff

View File

@ -13,4 +13,9 @@ abstract class IOrderRepository {
Future<Either<OrderFailure, Order>> createOrder({
required OrderRequest request,
});
Future<Either<OrderFailure, Order>> createOrderWithPayment({
required OrderRequest request,
required String paymentMethodId,
});
}

View File

@ -83,4 +83,72 @@ class OrderRemoteDataProvider {
return DC.error(OrderFailure.serverError(e));
}
}
Future<DC<OrderFailure, OrderDto>> storeWithPaymentOrder({
required OrderRequestDto request,
required String paymentMethodId,
}) async {
try {
final response = await _apiClient.post(
ApiPath.orders,
data: request.toRequest(),
headers: getAuthorizationHeader(),
);
if (response.data['success'] == false) {
return DC.error(OrderFailure.unexpectedError());
} else {
final order = OrderDto.fromJson(
response.data['data'] as Map<String, dynamic>,
);
final paymentRequest = PaymentRequestDto(
orderId: order.id,
amount: order.totalAmount,
paymentMethodId: paymentMethodId,
splitNumber: 1,
splitTotal: 1,
splitDescription: '',
paymentOrderItems: order.orderItems
?.map(
(item) => PaymentItemRequestDto(
amount: item.totalPrice,
orderItemId: item.id,
),
)
.toList(),
);
storePayment(paymentRequest);
return DC.data(order);
}
} on ApiFailure catch (e, s) {
log('storeOrderError', name: _logName, error: e, stackTrace: s);
return DC.error(OrderFailure.serverError(e));
}
}
Future<DC<OrderFailure, PaymentDto>> storePayment(
PaymentRequestDto request,
) async {
try {
final response = await _apiClient.post(
ApiPath.payments,
data: request.toJson(),
headers: getAuthorizationHeader(),
);
if (response.data['success'] == false) {
return DC.error(OrderFailure.unexpectedError());
}
final payment = PaymentDto.fromJson(
response.data['data'] as Map<String, dynamic>,
);
return DC.data(payment);
} on ApiFailure catch (e, s) {
log('storePaymentError', name: _logName, error: e, stackTrace: s);
return DC.error(OrderFailure.serverError(e));
}
}
}

View File

@ -51,7 +51,7 @@ class OrderDto with _$OrderDto {
@JsonKey(name: "created_at") String? createdAt,
@JsonKey(name: "updated_at") String? updatedAt,
@JsonKey(name: "order_items") List<OrderItemDto>? orderItems,
@JsonKey(name: "payments") List<PaymentOrderDto>? payments,
@JsonKey(name: "payments") List<PaymentDto>? payments,
@JsonKey(name: "total_paid") int? totalPaid,
@JsonKey(name: "payment_count") int? paymentCount,
@JsonKey(name: "split_type") String? splitType,
@ -137,46 +137,3 @@ class OrderItemDto with _$OrderItemDto {
paidQuantity: paidQuantity ?? 0,
);
}
@freezed
class PaymentOrderDto with _$PaymentOrderDto {
const PaymentOrderDto._();
const factory PaymentOrderDto({
@JsonKey(name: "id") String? id,
@JsonKey(name: "order_id") String? orderId,
@JsonKey(name: "payment_method_id") String? paymentMethodId,
@JsonKey(name: "payment_method_name") String? paymentMethodName,
@JsonKey(name: "payment_method_type") String? paymentMethodType,
@JsonKey(name: "amount") int? amount,
@JsonKey(name: "status") String? status,
@JsonKey(name: "split_number") int? splitNumber,
@JsonKey(name: "split_total") int? splitTotal,
@JsonKey(name: "split_description") String? splitDescription,
@JsonKey(name: "refund_amount") int? refundAmount,
@JsonKey(name: "metadata") Map<String, dynamic>? metadata,
@JsonKey(name: "created_at") String? createdAt,
@JsonKey(name: "updated_at") String? updatedAt,
}) = _PaymentOrderDto;
factory PaymentOrderDto.fromJson(Map<String, dynamic> json) =>
_$PaymentOrderDtoFromJson(json);
// Optional mapper ke domain entity
PaymentOrder toDomain() => PaymentOrder(
id: id ?? '',
orderId: orderId ?? '',
paymentMethodId: paymentMethodId ?? '',
paymentMethodName: paymentMethodName ?? '',
paymentMethodType: paymentMethodType ?? '',
amount: amount ?? 0,
status: status ?? '',
splitNumber: splitNumber ?? 0,
splitTotal: splitTotal ?? 0,
splitDescription: splitDescription ?? '',
refundAmount: refundAmount ?? 0,
metadata: metadata ?? const {},
createdAt: createdAt != null ? DateTime.parse(createdAt!) : DateTime(1970),
updatedAt: updatedAt != null ? DateTime.parse(updatedAt!) : DateTime(1970),
);
}

View File

@ -0,0 +1,44 @@
part of '../order_dtos.dart';
@freezed
class PaymentDto with _$PaymentDto {
const PaymentDto._();
const factory PaymentDto({
@JsonKey(name: "id") String? id,
@JsonKey(name: "order_id") String? orderId,
@JsonKey(name: "payment_method_id") String? paymentMethodId,
@JsonKey(name: "payment_method_name") String? paymentMethodName,
@JsonKey(name: "payment_method_type") String? paymentMethodType,
@JsonKey(name: "amount") int? amount,
@JsonKey(name: "status") String? status,
@JsonKey(name: "split_number") int? splitNumber,
@JsonKey(name: "split_total") int? splitTotal,
@JsonKey(name: "split_description") String? splitDescription,
@JsonKey(name: "refund_amount") int? refundAmount,
@JsonKey(name: "metadata") Map<String, dynamic>? metadata,
@JsonKey(name: "created_at") String? createdAt,
@JsonKey(name: "updated_at") String? updatedAt,
}) = _PaymentOrderDto;
factory PaymentDto.fromJson(Map<String, dynamic> json) =>
_$PaymentDtoFromJson(json);
// Optional mapper ke domain entity
Payment toDomain() => Payment(
id: id ?? '',
orderId: orderId ?? '',
paymentMethodId: paymentMethodId ?? '',
paymentMethodName: paymentMethodName ?? '',
paymentMethodType: paymentMethodType ?? '',
amount: amount ?? 0,
status: status ?? '',
splitNumber: splitNumber ?? 0,
splitTotal: splitTotal ?? 0,
splitDescription: splitDescription ?? '',
refundAmount: refundAmount ?? 0,
metadata: metadata ?? const {},
createdAt: createdAt != null ? DateTime.parse(createdAt!) : DateTime(1970),
updatedAt: updatedAt != null ? DateTime.parse(updatedAt!) : DateTime(1970),
);
}

View File

@ -0,0 +1,51 @@
part of '../order_dtos.dart';
@freezed
class PaymentRequestDto with _$PaymentRequestDto {
const PaymentRequestDto._();
const factory PaymentRequestDto({
@JsonKey(name: "order_id") String? orderId,
@JsonKey(name: "payment_method_id") String? paymentMethodId,
@JsonKey(name: "amount") int? amount,
@JsonKey(name: "transaction_id") String? transactionId,
@JsonKey(name: "split_number") int? splitNumber,
@JsonKey(name: "split_total") int? splitTotal,
@JsonKey(name: "split_description") String? splitDescription,
@JsonKey(name: "payment_order_items")
List<PaymentItemRequestDto>? paymentOrderItems,
}) = _PaymentRequestDto;
factory PaymentRequestDto.fromJson(Map<String, dynamic> json) =>
_$PaymentRequestDtoFromJson(json);
// Optional mapper ke domain
PaymentRequest toDomain() => PaymentRequest(
orderId: orderId ?? '',
paymentMethodId: paymentMethodId ?? '',
amount: amount ?? 0,
transactionId: transactionId ?? '',
splitNumber: splitNumber ?? 0,
splitTotal: splitTotal ?? 0,
splitDescription: splitDescription ?? '',
paymentOrderItems:
paymentOrderItems?.map((e) => e.toDomain()).toList() ?? const [],
);
}
@freezed
class PaymentItemRequestDto with _$PaymentItemRequestDto {
const PaymentItemRequestDto._();
const factory PaymentItemRequestDto({
@JsonKey(name: "order_item_id") String? orderItemId,
@JsonKey(name: "amount") int? amount,
}) = _PaymentItemRequestDto;
factory PaymentItemRequestDto.fromJson(Map<String, dynamic> json) =>
_$PaymentItemRequestDtoFromJson(json);
// Optional: mapper ke domain entity
PaymentItemRequest toDomain() =>
PaymentItemRequest(orderItemId: orderItemId ?? '', amount: amount ?? 0);
}

View File

@ -7,3 +7,5 @@ part 'order_dtos.g.dart';
part 'dtos/order_dto.dart';
part 'dtos/order_request_dto.dart';
part 'dtos/payment_request_dto.dart';
part 'dtos/payment_dto.dart';

File diff suppressed because it is too large Load Diff

View File

@ -53,7 +53,7 @@ _$OrderDtoImpl _$$OrderDtoImplFromJson(Map<String, dynamic> json) =>
?.map((e) => OrderItemDto.fromJson(e as Map<String, dynamic>))
.toList(),
payments: (json['payments'] as List<dynamic>?)
?.map((e) => PaymentOrderDto.fromJson(e as Map<String, dynamic>))
?.map((e) => PaymentDto.fromJson(e as Map<String, dynamic>))
.toList(),
totalPaid: (json['total_paid'] as num?)?.toInt(),
paymentCount: (json['payment_count'] as num?)?.toInt(),
@ -130,44 +130,6 @@ Map<String, dynamic> _$$OrderItemDtoImplToJson(_$OrderItemDtoImpl instance) =>
'paid_quantity': instance.paidQuantity,
};
_$PaymentOrderDtoImpl _$$PaymentOrderDtoImplFromJson(
Map<String, dynamic> json,
) => _$PaymentOrderDtoImpl(
id: json['id'] as String?,
orderId: json['order_id'] as String?,
paymentMethodId: json['payment_method_id'] as String?,
paymentMethodName: json['payment_method_name'] as String?,
paymentMethodType: json['payment_method_type'] as String?,
amount: (json['amount'] as num?)?.toInt(),
status: json['status'] as String?,
splitNumber: (json['split_number'] as num?)?.toInt(),
splitTotal: (json['split_total'] as num?)?.toInt(),
splitDescription: json['split_description'] as String?,
refundAmount: (json['refund_amount'] as num?)?.toInt(),
metadata: json['metadata'] as Map<String, dynamic>?,
createdAt: json['created_at'] as String?,
updatedAt: json['updated_at'] as String?,
);
Map<String, dynamic> _$$PaymentOrderDtoImplToJson(
_$PaymentOrderDtoImpl instance,
) => <String, dynamic>{
'id': instance.id,
'order_id': instance.orderId,
'payment_method_id': instance.paymentMethodId,
'payment_method_name': instance.paymentMethodName,
'payment_method_type': instance.paymentMethodType,
'amount': instance.amount,
'status': instance.status,
'split_number': instance.splitNumber,
'split_total': instance.splitTotal,
'split_description': instance.splitDescription,
'refund_amount': instance.refundAmount,
'metadata': instance.metadata,
'created_at': instance.createdAt,
'updated_at': instance.updatedAt,
};
_$OrderRequestDtoImpl _$$OrderRequestDtoImplFromJson(
Map<String, dynamic> json,
) => _$OrderRequestDtoImpl(
@ -215,3 +177,83 @@ Map<String, dynamic> _$$OrderItemRequestDtoImplToJson(
'unit_price': instance.unitPrice,
'notes': instance.notes,
};
_$PaymentRequestDtoImpl _$$PaymentRequestDtoImplFromJson(
Map<String, dynamic> json,
) => _$PaymentRequestDtoImpl(
orderId: json['order_id'] as String?,
paymentMethodId: json['payment_method_id'] as String?,
amount: (json['amount'] as num?)?.toInt(),
transactionId: json['transaction_id'] as String?,
splitNumber: (json['split_number'] as num?)?.toInt(),
splitTotal: (json['split_total'] as num?)?.toInt(),
splitDescription: json['split_description'] as String?,
paymentOrderItems: (json['payment_order_items'] as List<dynamic>?)
?.map((e) => PaymentItemRequestDto.fromJson(e as Map<String, dynamic>))
.toList(),
);
Map<String, dynamic> _$$PaymentRequestDtoImplToJson(
_$PaymentRequestDtoImpl instance,
) => <String, dynamic>{
'order_id': instance.orderId,
'payment_method_id': instance.paymentMethodId,
'amount': instance.amount,
'transaction_id': instance.transactionId,
'split_number': instance.splitNumber,
'split_total': instance.splitTotal,
'split_description': instance.splitDescription,
'payment_order_items': instance.paymentOrderItems,
};
_$PaymentItemRequestDtoImpl _$$PaymentItemRequestDtoImplFromJson(
Map<String, dynamic> json,
) => _$PaymentItemRequestDtoImpl(
orderItemId: json['order_item_id'] as String?,
amount: (json['amount'] as num?)?.toInt(),
);
Map<String, dynamic> _$$PaymentItemRequestDtoImplToJson(
_$PaymentItemRequestDtoImpl instance,
) => <String, dynamic>{
'order_item_id': instance.orderItemId,
'amount': instance.amount,
};
_$PaymentOrderDtoImpl _$$PaymentOrderDtoImplFromJson(
Map<String, dynamic> json,
) => _$PaymentOrderDtoImpl(
id: json['id'] as String?,
orderId: json['order_id'] as String?,
paymentMethodId: json['payment_method_id'] as String?,
paymentMethodName: json['payment_method_name'] as String?,
paymentMethodType: json['payment_method_type'] as String?,
amount: (json['amount'] as num?)?.toInt(),
status: json['status'] as String?,
splitNumber: (json['split_number'] as num?)?.toInt(),
splitTotal: (json['split_total'] as num?)?.toInt(),
splitDescription: json['split_description'] as String?,
refundAmount: (json['refund_amount'] as num?)?.toInt(),
metadata: json['metadata'] as Map<String, dynamic>?,
createdAt: json['created_at'] as String?,
updatedAt: json['updated_at'] as String?,
);
Map<String, dynamic> _$$PaymentOrderDtoImplToJson(
_$PaymentOrderDtoImpl instance,
) => <String, dynamic>{
'id': instance.id,
'order_id': instance.orderId,
'payment_method_id': instance.paymentMethodId,
'payment_method_name': instance.paymentMethodName,
'payment_method_type': instance.paymentMethodType,
'amount': instance.amount,
'status': instance.status,
'split_number': instance.splitNumber,
'split_total': instance.splitTotal,
'split_description': instance.splitDescription,
'refund_amount': instance.refundAmount,
'metadata': instance.metadata,
'created_at': instance.createdAt,
'updated_at': instance.updatedAt,
};

View File

@ -65,4 +65,27 @@ class OrderRepository implements IOrderRepository {
return left(const OrderFailure.unexpectedError());
}
}
@override
Future<Either<OrderFailure, Order>> createOrderWithPayment({
required OrderRequest request,
required String paymentMethodId,
}) async {
try {
final result = await _dataProvider.storeWithPaymentOrder(
request: OrderRequestDto.fromDomain(request),
paymentMethodId: paymentMethodId,
);
if (result.hasError) {
return left(result.error!);
}
final order = result.data!.toDomain();
return right(order);
} catch (e) {
log('createOrderError', name: _logName, error: e);
return left(const OrderFailure.unexpectedError());
}
}
}

View File

@ -40,7 +40,7 @@ class OrderListPayment extends StatelessWidget {
(index) => Padding(
padding: const EdgeInsets.only(bottom: 8.0),
child: _buildPaymentItem(
order?.payments[index] ?? PaymentOrder.empty(),
order?.payments[index] ?? Payment.empty(),
),
),
),
@ -124,7 +124,7 @@ class OrderListPayment extends StatelessWidget {
}
}
Row _buildPaymentItem(PaymentOrder payment) {
Row _buildPaymentItem(Payment payment) {
return Row(
children: [
Container(