feat: void order

This commit is contained in:
efrilm 2025-08-04 11:39:47 +07:00
parent cbfa1689ba
commit ee38b6218f
9 changed files with 824 additions and 114 deletions

View File

@ -418,7 +418,7 @@ class OrderRemoteDatasource {
'order_item_id': item.id,
"refund_quantity": item.quantity,
"refund_amount": item.totalPrice,
"reason": "Item was cold"
"reason": ""
})
.toList(),
'reason': reason,
@ -447,4 +447,52 @@ class OrderRemoteDatasource {
return const Left('Terjadi kesalahan tak terduga');
}
}
Future<Either<String, bool>> voidOrder({
required String orderId,
required String reason,
String type = "ITEM", // TYPE: ALL, ITEM
required List<OrderItem> orderItems,
}) async {
final authData = await AuthLocalDataSource().getAuthData();
final url = '${Variables.baseUrl}/api/v1/orders/void';
try {
final response = await dio.post(
url,
data: {
'order_id': orderId,
'type': orderItems.isEmpty ? "ALL" : type,
'reason': reason,
"items": orderItems
.map((item) => {
'order_item_id': item.id,
"quantity": item.quantity,
})
.toList(),
},
options: Options(
headers: {
'Authorization': 'Bearer ${authData.token}',
'Accept': 'application/json',
'Content-Type': 'application/json',
},
),
);
if (response.statusCode == 200) {
return Right(true);
} else {
return const Left('Gagal refund');
}
} on DioException catch (e) {
final errorMessage = e.response?.data['message'] ?? 'Kesalahan jaringan';
log("💥 Dio error: ${e.message}");
log("💥 Dio response: ${e.response?.data}");
return Left(errorMessage);
} catch (e) {
log("💥 Unexpected error: $e");
return const Left('Terjadi kesalahan tak terduga');
}
}
}

View File

@ -134,7 +134,7 @@ class OrderFormBloc extends Bloc<OrderFormEvent, OrderFormState> {
);
on<_ToggleItem>((event, emit) {
state.maybeWhen(
loaded: (order, selectedItems, _) {
loaded: (order, selectedItems, totalVoidOrRefund, _) {
final newList = [...selectedItems];
final exists = newList.any((e) => e.id == event.item.id);
@ -158,7 +158,7 @@ class OrderFormBloc extends Bloc<OrderFormEvent, OrderFormState> {
on<_ToggleSelectAll>((event, emit) {
state.maybeWhen(
loaded: (order, _, __) {
loaded: (order, _, totalVoidOrRefund, __) {
final items = event.selectAll
? (order.orderItems ?? <OrderItem>[])
: <OrderItem>[];
@ -187,5 +187,20 @@ class OrderFormBloc extends Bloc<OrderFormEvent, OrderFormState> {
(success) => emit(_SuccessMsg()),
);
});
on<_VoidOrder>((event, emit) async {
emit(const OrderFormState.loading());
final result = await _orderRemoteDatasource.voidOrder(
orderId: event.orderId,
reason: event.reason,
orderItems: event.items,
);
result.fold(
(error) => emit(_Error(error)),
(success) => emit(_SuccessMsg()),
);
});
}
}

View File

@ -30,6 +30,9 @@ mixin _$OrderFormEvent {
required TResult Function(
List<OrderItem> items, String orderId, String reason)
refund,
required TResult Function(
List<OrderItem> items, String orderId, String reason)
voidOrder,
required TResult Function(OrderItem item) toggleItem,
required TResult Function(bool selectAll) toggleSelectAll,
}) =>
@ -46,6 +49,8 @@ mixin _$OrderFormEvent {
TResult? Function(List<ProductQuantity> items, String orderId)? addToOrder,
TResult? Function(List<OrderItem> items, String orderId, String reason)?
refund,
TResult? Function(List<OrderItem> items, String orderId, String reason)?
voidOrder,
TResult? Function(OrderItem item)? toggleItem,
TResult? Function(bool selectAll)? toggleSelectAll,
}) =>
@ -62,6 +67,8 @@ mixin _$OrderFormEvent {
TResult Function(List<ProductQuantity> items, String orderId)? addToOrder,
TResult Function(List<OrderItem> items, String orderId, String reason)?
refund,
TResult Function(List<OrderItem> items, String orderId, String reason)?
voidOrder,
TResult Function(OrderItem item)? toggleItem,
TResult Function(bool selectAll)? toggleSelectAll,
required TResult orElse(),
@ -74,6 +81,7 @@ mixin _$OrderFormEvent {
required TResult Function(_CreateWithPaymentMethod value) createWithPayment,
required TResult Function(_AddToOrder value) addToOrder,
required TResult Function(_Refund value) refund,
required TResult Function(_VoidOrder value) voidOrder,
required TResult Function(_ToggleItem value) toggleItem,
required TResult Function(_ToggleSelectAll value) toggleSelectAll,
}) =>
@ -85,6 +93,7 @@ mixin _$OrderFormEvent {
TResult? Function(_CreateWithPaymentMethod value)? createWithPayment,
TResult? Function(_AddToOrder value)? addToOrder,
TResult? Function(_Refund value)? refund,
TResult? Function(_VoidOrder value)? voidOrder,
TResult? Function(_ToggleItem value)? toggleItem,
TResult? Function(_ToggleSelectAll value)? toggleSelectAll,
}) =>
@ -96,6 +105,7 @@ mixin _$OrderFormEvent {
TResult Function(_CreateWithPaymentMethod value)? createWithPayment,
TResult Function(_AddToOrder value)? addToOrder,
TResult Function(_Refund value)? refund,
TResult Function(_VoidOrder value)? voidOrder,
TResult Function(_ToggleItem value)? toggleItem,
TResult Function(_ToggleSelectAll value)? toggleSelectAll,
required TResult orElse(),
@ -204,6 +214,9 @@ class _$StartedImpl implements _Started {
required TResult Function(
List<OrderItem> items, String orderId, String reason)
refund,
required TResult Function(
List<OrderItem> items, String orderId, String reason)
voidOrder,
required TResult Function(OrderItem item) toggleItem,
required TResult Function(bool selectAll) toggleSelectAll,
}) {
@ -223,6 +236,8 @@ class _$StartedImpl implements _Started {
TResult? Function(List<ProductQuantity> items, String orderId)? addToOrder,
TResult? Function(List<OrderItem> items, String orderId, String reason)?
refund,
TResult? Function(List<OrderItem> items, String orderId, String reason)?
voidOrder,
TResult? Function(OrderItem item)? toggleItem,
TResult? Function(bool selectAll)? toggleSelectAll,
}) {
@ -242,6 +257,8 @@ class _$StartedImpl implements _Started {
TResult Function(List<ProductQuantity> items, String orderId)? addToOrder,
TResult Function(List<OrderItem> items, String orderId, String reason)?
refund,
TResult Function(List<OrderItem> items, String orderId, String reason)?
voidOrder,
TResult Function(OrderItem item)? toggleItem,
TResult Function(bool selectAll)? toggleSelectAll,
required TResult orElse(),
@ -260,6 +277,7 @@ class _$StartedImpl implements _Started {
required TResult Function(_CreateWithPaymentMethod value) createWithPayment,
required TResult Function(_AddToOrder value) addToOrder,
required TResult Function(_Refund value) refund,
required TResult Function(_VoidOrder value) voidOrder,
required TResult Function(_ToggleItem value) toggleItem,
required TResult Function(_ToggleSelectAll value) toggleSelectAll,
}) {
@ -274,6 +292,7 @@ class _$StartedImpl implements _Started {
TResult? Function(_CreateWithPaymentMethod value)? createWithPayment,
TResult? Function(_AddToOrder value)? addToOrder,
TResult? Function(_Refund value)? refund,
TResult? Function(_VoidOrder value)? voidOrder,
TResult? Function(_ToggleItem value)? toggleItem,
TResult? Function(_ToggleSelectAll value)? toggleSelectAll,
}) {
@ -288,6 +307,7 @@ class _$StartedImpl implements _Started {
TResult Function(_CreateWithPaymentMethod value)? createWithPayment,
TResult Function(_AddToOrder value)? addToOrder,
TResult Function(_Refund value)? refund,
TResult Function(_VoidOrder value)? voidOrder,
TResult Function(_ToggleItem value)? toggleItem,
TResult Function(_ToggleSelectAll value)? toggleSelectAll,
required TResult orElse(),
@ -437,6 +457,9 @@ class _$CreateImpl implements _Create {
required TResult Function(
List<OrderItem> items, String orderId, String reason)
refund,
required TResult Function(
List<OrderItem> items, String orderId, String reason)
voidOrder,
required TResult Function(OrderItem item) toggleItem,
required TResult Function(bool selectAll) toggleSelectAll,
}) {
@ -456,6 +479,8 @@ class _$CreateImpl implements _Create {
TResult? Function(List<ProductQuantity> items, String orderId)? addToOrder,
TResult? Function(List<OrderItem> items, String orderId, String reason)?
refund,
TResult? Function(List<OrderItem> items, String orderId, String reason)?
voidOrder,
TResult? Function(OrderItem item)? toggleItem,
TResult? Function(bool selectAll)? toggleSelectAll,
}) {
@ -475,6 +500,8 @@ class _$CreateImpl implements _Create {
TResult Function(List<ProductQuantity> items, String orderId)? addToOrder,
TResult Function(List<OrderItem> items, String orderId, String reason)?
refund,
TResult Function(List<OrderItem> items, String orderId, String reason)?
voidOrder,
TResult Function(OrderItem item)? toggleItem,
TResult Function(bool selectAll)? toggleSelectAll,
required TResult orElse(),
@ -493,6 +520,7 @@ class _$CreateImpl implements _Create {
required TResult Function(_CreateWithPaymentMethod value) createWithPayment,
required TResult Function(_AddToOrder value) addToOrder,
required TResult Function(_Refund value) refund,
required TResult Function(_VoidOrder value) voidOrder,
required TResult Function(_ToggleItem value) toggleItem,
required TResult Function(_ToggleSelectAll value) toggleSelectAll,
}) {
@ -507,6 +535,7 @@ class _$CreateImpl implements _Create {
TResult? Function(_CreateWithPaymentMethod value)? createWithPayment,
TResult? Function(_AddToOrder value)? addToOrder,
TResult? Function(_Refund value)? refund,
TResult? Function(_VoidOrder value)? voidOrder,
TResult? Function(_ToggleItem value)? toggleItem,
TResult? Function(_ToggleSelectAll value)? toggleSelectAll,
}) {
@ -521,6 +550,7 @@ class _$CreateImpl implements _Create {
TResult Function(_CreateWithPaymentMethod value)? createWithPayment,
TResult Function(_AddToOrder value)? addToOrder,
TResult Function(_Refund value)? refund,
TResult Function(_VoidOrder value)? voidOrder,
TResult Function(_ToggleItem value)? toggleItem,
TResult Function(_ToggleSelectAll value)? toggleSelectAll,
required TResult orElse(),
@ -692,6 +722,9 @@ class _$CreateWithPaymentMethodImpl implements _CreateWithPaymentMethod {
required TResult Function(
List<OrderItem> items, String orderId, String reason)
refund,
required TResult Function(
List<OrderItem> items, String orderId, String reason)
voidOrder,
required TResult Function(OrderItem item) toggleItem,
required TResult Function(bool selectAll) toggleSelectAll,
}) {
@ -712,6 +745,8 @@ class _$CreateWithPaymentMethodImpl implements _CreateWithPaymentMethod {
TResult? Function(List<ProductQuantity> items, String orderId)? addToOrder,
TResult? Function(List<OrderItem> items, String orderId, String reason)?
refund,
TResult? Function(List<OrderItem> items, String orderId, String reason)?
voidOrder,
TResult? Function(OrderItem item)? toggleItem,
TResult? Function(bool selectAll)? toggleSelectAll,
}) {
@ -732,6 +767,8 @@ class _$CreateWithPaymentMethodImpl implements _CreateWithPaymentMethod {
TResult Function(List<ProductQuantity> items, String orderId)? addToOrder,
TResult Function(List<OrderItem> items, String orderId, String reason)?
refund,
TResult Function(List<OrderItem> items, String orderId, String reason)?
voidOrder,
TResult Function(OrderItem item)? toggleItem,
TResult Function(bool selectAll)? toggleSelectAll,
required TResult orElse(),
@ -751,6 +788,7 @@ class _$CreateWithPaymentMethodImpl implements _CreateWithPaymentMethod {
required TResult Function(_CreateWithPaymentMethod value) createWithPayment,
required TResult Function(_AddToOrder value) addToOrder,
required TResult Function(_Refund value) refund,
required TResult Function(_VoidOrder value) voidOrder,
required TResult Function(_ToggleItem value) toggleItem,
required TResult Function(_ToggleSelectAll value) toggleSelectAll,
}) {
@ -765,6 +803,7 @@ class _$CreateWithPaymentMethodImpl implements _CreateWithPaymentMethod {
TResult? Function(_CreateWithPaymentMethod value)? createWithPayment,
TResult? Function(_AddToOrder value)? addToOrder,
TResult? Function(_Refund value)? refund,
TResult? Function(_VoidOrder value)? voidOrder,
TResult? Function(_ToggleItem value)? toggleItem,
TResult? Function(_ToggleSelectAll value)? toggleSelectAll,
}) {
@ -779,6 +818,7 @@ class _$CreateWithPaymentMethodImpl implements _CreateWithPaymentMethod {
TResult Function(_CreateWithPaymentMethod value)? createWithPayment,
TResult Function(_AddToOrder value)? addToOrder,
TResult Function(_Refund value)? refund,
TResult Function(_VoidOrder value)? voidOrder,
TResult Function(_ToggleItem value)? toggleItem,
TResult Function(_ToggleSelectAll value)? toggleSelectAll,
required TResult orElse(),
@ -909,6 +949,9 @@ class _$AddToOrderImpl implements _AddToOrder {
required TResult Function(
List<OrderItem> items, String orderId, String reason)
refund,
required TResult Function(
List<OrderItem> items, String orderId, String reason)
voidOrder,
required TResult Function(OrderItem item) toggleItem,
required TResult Function(bool selectAll) toggleSelectAll,
}) {
@ -928,6 +971,8 @@ class _$AddToOrderImpl implements _AddToOrder {
TResult? Function(List<ProductQuantity> items, String orderId)? addToOrder,
TResult? Function(List<OrderItem> items, String orderId, String reason)?
refund,
TResult? Function(List<OrderItem> items, String orderId, String reason)?
voidOrder,
TResult? Function(OrderItem item)? toggleItem,
TResult? Function(bool selectAll)? toggleSelectAll,
}) {
@ -947,6 +992,8 @@ class _$AddToOrderImpl implements _AddToOrder {
TResult Function(List<ProductQuantity> items, String orderId)? addToOrder,
TResult Function(List<OrderItem> items, String orderId, String reason)?
refund,
TResult Function(List<OrderItem> items, String orderId, String reason)?
voidOrder,
TResult Function(OrderItem item)? toggleItem,
TResult Function(bool selectAll)? toggleSelectAll,
required TResult orElse(),
@ -965,6 +1012,7 @@ class _$AddToOrderImpl implements _AddToOrder {
required TResult Function(_CreateWithPaymentMethod value) createWithPayment,
required TResult Function(_AddToOrder value) addToOrder,
required TResult Function(_Refund value) refund,
required TResult Function(_VoidOrder value) voidOrder,
required TResult Function(_ToggleItem value) toggleItem,
required TResult Function(_ToggleSelectAll value) toggleSelectAll,
}) {
@ -979,6 +1027,7 @@ class _$AddToOrderImpl implements _AddToOrder {
TResult? Function(_CreateWithPaymentMethod value)? createWithPayment,
TResult? Function(_AddToOrder value)? addToOrder,
TResult? Function(_Refund value)? refund,
TResult? Function(_VoidOrder value)? voidOrder,
TResult? Function(_ToggleItem value)? toggleItem,
TResult? Function(_ToggleSelectAll value)? toggleSelectAll,
}) {
@ -993,6 +1042,7 @@ class _$AddToOrderImpl implements _AddToOrder {
TResult Function(_CreateWithPaymentMethod value)? createWithPayment,
TResult Function(_AddToOrder value)? addToOrder,
TResult Function(_Refund value)? refund,
TResult Function(_VoidOrder value)? voidOrder,
TResult Function(_ToggleItem value)? toggleItem,
TResult Function(_ToggleSelectAll value)? toggleSelectAll,
required TResult orElse(),
@ -1126,6 +1176,9 @@ class _$RefundImpl implements _Refund {
required TResult Function(
List<OrderItem> items, String orderId, String reason)
refund,
required TResult Function(
List<OrderItem> items, String orderId, String reason)
voidOrder,
required TResult Function(OrderItem item) toggleItem,
required TResult Function(bool selectAll) toggleSelectAll,
}) {
@ -1145,6 +1198,8 @@ class _$RefundImpl implements _Refund {
TResult? Function(List<ProductQuantity> items, String orderId)? addToOrder,
TResult? Function(List<OrderItem> items, String orderId, String reason)?
refund,
TResult? Function(List<OrderItem> items, String orderId, String reason)?
voidOrder,
TResult? Function(OrderItem item)? toggleItem,
TResult? Function(bool selectAll)? toggleSelectAll,
}) {
@ -1164,6 +1219,8 @@ class _$RefundImpl implements _Refund {
TResult Function(List<ProductQuantity> items, String orderId)? addToOrder,
TResult Function(List<OrderItem> items, String orderId, String reason)?
refund,
TResult Function(List<OrderItem> items, String orderId, String reason)?
voidOrder,
TResult Function(OrderItem item)? toggleItem,
TResult Function(bool selectAll)? toggleSelectAll,
required TResult orElse(),
@ -1182,6 +1239,7 @@ class _$RefundImpl implements _Refund {
required TResult Function(_CreateWithPaymentMethod value) createWithPayment,
required TResult Function(_AddToOrder value) addToOrder,
required TResult Function(_Refund value) refund,
required TResult Function(_VoidOrder value) voidOrder,
required TResult Function(_ToggleItem value) toggleItem,
required TResult Function(_ToggleSelectAll value) toggleSelectAll,
}) {
@ -1196,6 +1254,7 @@ class _$RefundImpl implements _Refund {
TResult? Function(_CreateWithPaymentMethod value)? createWithPayment,
TResult? Function(_AddToOrder value)? addToOrder,
TResult? Function(_Refund value)? refund,
TResult? Function(_VoidOrder value)? voidOrder,
TResult? Function(_ToggleItem value)? toggleItem,
TResult? Function(_ToggleSelectAll value)? toggleSelectAll,
}) {
@ -1210,6 +1269,7 @@ class _$RefundImpl implements _Refund {
TResult Function(_CreateWithPaymentMethod value)? createWithPayment,
TResult Function(_AddToOrder value)? addToOrder,
TResult Function(_Refund value)? refund,
TResult Function(_VoidOrder value)? voidOrder,
TResult Function(_ToggleItem value)? toggleItem,
TResult Function(_ToggleSelectAll value)? toggleSelectAll,
required TResult orElse(),
@ -1238,6 +1298,235 @@ abstract class _Refund implements OrderFormEvent {
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class _$$VoidOrderImplCopyWith<$Res> {
factory _$$VoidOrderImplCopyWith(
_$VoidOrderImpl value, $Res Function(_$VoidOrderImpl) then) =
__$$VoidOrderImplCopyWithImpl<$Res>;
@useResult
$Res call({List<OrderItem> items, String orderId, String reason});
}
/// @nodoc
class __$$VoidOrderImplCopyWithImpl<$Res>
extends _$OrderFormEventCopyWithImpl<$Res, _$VoidOrderImpl>
implements _$$VoidOrderImplCopyWith<$Res> {
__$$VoidOrderImplCopyWithImpl(
_$VoidOrderImpl _value, $Res Function(_$VoidOrderImpl) _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? orderId = null,
Object? reason = null,
}) {
return _then(_$VoidOrderImpl(
items: null == items
? _value._items
: items // ignore: cast_nullable_to_non_nullable
as List<OrderItem>,
orderId: null == orderId
? _value.orderId
: orderId // ignore: cast_nullable_to_non_nullable
as String,
reason: null == reason
? _value.reason
: reason // ignore: cast_nullable_to_non_nullable
as String,
));
}
}
/// @nodoc
class _$VoidOrderImpl implements _VoidOrder {
const _$VoidOrderImpl(
{required final List<OrderItem> items,
required this.orderId,
required this.reason})
: _items = items;
final List<OrderItem> _items;
@override
List<OrderItem> get items {
if (_items is EqualUnmodifiableListView) return _items;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(_items);
}
@override
final String orderId;
@override
final String reason;
@override
String toString() {
return 'OrderFormEvent.voidOrder(items: $items, orderId: $orderId, reason: $reason)';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$VoidOrderImpl &&
const DeepCollectionEquality().equals(other._items, _items) &&
(identical(other.orderId, orderId) || other.orderId == orderId) &&
(identical(other.reason, reason) || other.reason == reason));
}
@override
int get hashCode => Object.hash(runtimeType,
const DeepCollectionEquality().hash(_items), orderId, reason);
/// 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')
_$$VoidOrderImplCopyWith<_$VoidOrderImpl> get copyWith =>
__$$VoidOrderImplCopyWithImpl<_$VoidOrderImpl>(this, _$identity);
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function(Order order) started,
required TResult Function(List<ProductQuantity> items, String customerName,
OrderType orderType, TableModel table)
create,
required TResult Function(List<ProductQuantity> items, String customerName,
OrderType orderType, TableModel table, PaymentMethod paymentMethod)
createWithPayment,
required TResult Function(List<ProductQuantity> items, String orderId)
addToOrder,
required TResult Function(
List<OrderItem> items, String orderId, String reason)
refund,
required TResult Function(
List<OrderItem> items, String orderId, String reason)
voidOrder,
required TResult Function(OrderItem item) toggleItem,
required TResult Function(bool selectAll) toggleSelectAll,
}) {
return voidOrder(items, orderId, reason);
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function(Order order)? started,
TResult? Function(List<ProductQuantity> items, String customerName,
OrderType orderType, TableModel table)?
create,
TResult? Function(List<ProductQuantity> items, String customerName,
OrderType orderType, TableModel table, PaymentMethod paymentMethod)?
createWithPayment,
TResult? Function(List<ProductQuantity> items, String orderId)? addToOrder,
TResult? Function(List<OrderItem> items, String orderId, String reason)?
refund,
TResult? Function(List<OrderItem> items, String orderId, String reason)?
voidOrder,
TResult? Function(OrderItem item)? toggleItem,
TResult? Function(bool selectAll)? toggleSelectAll,
}) {
return voidOrder?.call(items, orderId, reason);
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function(Order order)? started,
TResult Function(List<ProductQuantity> items, String customerName,
OrderType orderType, TableModel table)?
create,
TResult Function(List<ProductQuantity> items, String customerName,
OrderType orderType, TableModel table, PaymentMethod paymentMethod)?
createWithPayment,
TResult Function(List<ProductQuantity> items, String orderId)? addToOrder,
TResult Function(List<OrderItem> items, String orderId, String reason)?
refund,
TResult Function(List<OrderItem> items, String orderId, String reason)?
voidOrder,
TResult Function(OrderItem item)? toggleItem,
TResult Function(bool selectAll)? toggleSelectAll,
required TResult orElse(),
}) {
if (voidOrder != null) {
return voidOrder(items, orderId, reason);
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_Started value) started,
required TResult Function(_Create value) create,
required TResult Function(_CreateWithPaymentMethod value) createWithPayment,
required TResult Function(_AddToOrder value) addToOrder,
required TResult Function(_Refund value) refund,
required TResult Function(_VoidOrder value) voidOrder,
required TResult Function(_ToggleItem value) toggleItem,
required TResult Function(_ToggleSelectAll value) toggleSelectAll,
}) {
return voidOrder(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_Started value)? started,
TResult? Function(_Create value)? create,
TResult? Function(_CreateWithPaymentMethod value)? createWithPayment,
TResult? Function(_AddToOrder value)? addToOrder,
TResult? Function(_Refund value)? refund,
TResult? Function(_VoidOrder value)? voidOrder,
TResult? Function(_ToggleItem value)? toggleItem,
TResult? Function(_ToggleSelectAll value)? toggleSelectAll,
}) {
return voidOrder?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_Started value)? started,
TResult Function(_Create value)? create,
TResult Function(_CreateWithPaymentMethod value)? createWithPayment,
TResult Function(_AddToOrder value)? addToOrder,
TResult Function(_Refund value)? refund,
TResult Function(_VoidOrder value)? voidOrder,
TResult Function(_ToggleItem value)? toggleItem,
TResult Function(_ToggleSelectAll value)? toggleSelectAll,
required TResult orElse(),
}) {
if (voidOrder != null) {
return voidOrder(this);
}
return orElse();
}
}
abstract class _VoidOrder implements OrderFormEvent {
const factory _VoidOrder(
{required final List<OrderItem> items,
required final String orderId,
required final String reason}) = _$VoidOrderImpl;
List<OrderItem> get items;
String get orderId;
String get reason;
/// Create a copy of OrderFormEvent
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
_$$VoidOrderImplCopyWith<_$VoidOrderImpl> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class _$$ToggleItemImplCopyWith<$Res> {
factory _$$ToggleItemImplCopyWith(
@ -1318,6 +1607,9 @@ class _$ToggleItemImpl implements _ToggleItem {
required TResult Function(
List<OrderItem> items, String orderId, String reason)
refund,
required TResult Function(
List<OrderItem> items, String orderId, String reason)
voidOrder,
required TResult Function(OrderItem item) toggleItem,
required TResult Function(bool selectAll) toggleSelectAll,
}) {
@ -1337,6 +1629,8 @@ class _$ToggleItemImpl implements _ToggleItem {
TResult? Function(List<ProductQuantity> items, String orderId)? addToOrder,
TResult? Function(List<OrderItem> items, String orderId, String reason)?
refund,
TResult? Function(List<OrderItem> items, String orderId, String reason)?
voidOrder,
TResult? Function(OrderItem item)? toggleItem,
TResult? Function(bool selectAll)? toggleSelectAll,
}) {
@ -1356,6 +1650,8 @@ class _$ToggleItemImpl implements _ToggleItem {
TResult Function(List<ProductQuantity> items, String orderId)? addToOrder,
TResult Function(List<OrderItem> items, String orderId, String reason)?
refund,
TResult Function(List<OrderItem> items, String orderId, String reason)?
voidOrder,
TResult Function(OrderItem item)? toggleItem,
TResult Function(bool selectAll)? toggleSelectAll,
required TResult orElse(),
@ -1374,6 +1670,7 @@ class _$ToggleItemImpl implements _ToggleItem {
required TResult Function(_CreateWithPaymentMethod value) createWithPayment,
required TResult Function(_AddToOrder value) addToOrder,
required TResult Function(_Refund value) refund,
required TResult Function(_VoidOrder value) voidOrder,
required TResult Function(_ToggleItem value) toggleItem,
required TResult Function(_ToggleSelectAll value) toggleSelectAll,
}) {
@ -1388,6 +1685,7 @@ class _$ToggleItemImpl implements _ToggleItem {
TResult? Function(_CreateWithPaymentMethod value)? createWithPayment,
TResult? Function(_AddToOrder value)? addToOrder,
TResult? Function(_Refund value)? refund,
TResult? Function(_VoidOrder value)? voidOrder,
TResult? Function(_ToggleItem value)? toggleItem,
TResult? Function(_ToggleSelectAll value)? toggleSelectAll,
}) {
@ -1402,6 +1700,7 @@ class _$ToggleItemImpl implements _ToggleItem {
TResult Function(_CreateWithPaymentMethod value)? createWithPayment,
TResult Function(_AddToOrder value)? addToOrder,
TResult Function(_Refund value)? refund,
TResult Function(_VoidOrder value)? voidOrder,
TResult Function(_ToggleItem value)? toggleItem,
TResult Function(_ToggleSelectAll value)? toggleSelectAll,
required TResult orElse(),
@ -1507,6 +1806,9 @@ class _$ToggleSelectAllImpl implements _ToggleSelectAll {
required TResult Function(
List<OrderItem> items, String orderId, String reason)
refund,
required TResult Function(
List<OrderItem> items, String orderId, String reason)
voidOrder,
required TResult Function(OrderItem item) toggleItem,
required TResult Function(bool selectAll) toggleSelectAll,
}) {
@ -1526,6 +1828,8 @@ class _$ToggleSelectAllImpl implements _ToggleSelectAll {
TResult? Function(List<ProductQuantity> items, String orderId)? addToOrder,
TResult? Function(List<OrderItem> items, String orderId, String reason)?
refund,
TResult? Function(List<OrderItem> items, String orderId, String reason)?
voidOrder,
TResult? Function(OrderItem item)? toggleItem,
TResult? Function(bool selectAll)? toggleSelectAll,
}) {
@ -1545,6 +1849,8 @@ class _$ToggleSelectAllImpl implements _ToggleSelectAll {
TResult Function(List<ProductQuantity> items, String orderId)? addToOrder,
TResult Function(List<OrderItem> items, String orderId, String reason)?
refund,
TResult Function(List<OrderItem> items, String orderId, String reason)?
voidOrder,
TResult Function(OrderItem item)? toggleItem,
TResult Function(bool selectAll)? toggleSelectAll,
required TResult orElse(),
@ -1563,6 +1869,7 @@ class _$ToggleSelectAllImpl implements _ToggleSelectAll {
required TResult Function(_CreateWithPaymentMethod value) createWithPayment,
required TResult Function(_AddToOrder value) addToOrder,
required TResult Function(_Refund value) refund,
required TResult Function(_VoidOrder value) voidOrder,
required TResult Function(_ToggleItem value) toggleItem,
required TResult Function(_ToggleSelectAll value) toggleSelectAll,
}) {
@ -1577,6 +1884,7 @@ class _$ToggleSelectAllImpl implements _ToggleSelectAll {
TResult? Function(_CreateWithPaymentMethod value)? createWithPayment,
TResult? Function(_AddToOrder value)? addToOrder,
TResult? Function(_Refund value)? refund,
TResult? Function(_VoidOrder value)? voidOrder,
TResult? Function(_ToggleItem value)? toggleItem,
TResult? Function(_ToggleSelectAll value)? toggleSelectAll,
}) {
@ -1591,6 +1899,7 @@ class _$ToggleSelectAllImpl implements _ToggleSelectAll {
TResult Function(_CreateWithPaymentMethod value)? createWithPayment,
TResult Function(_AddToOrder value)? addToOrder,
TResult Function(_Refund value)? refund,
TResult Function(_VoidOrder value)? voidOrder,
TResult Function(_ToggleItem value)? toggleItem,
TResult Function(_ToggleSelectAll value)? toggleSelectAll,
required TResult orElse(),
@ -1620,8 +1929,8 @@ mixin _$OrderFormState {
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(
Order order, List<OrderItem> selectedItems, bool isAllSelected)
required TResult Function(Order order, List<OrderItem> selectedItems,
int totalVoidOrRefund, bool isAllSelected)
loaded,
required TResult Function(Order order) success,
required TResult Function() successMsg,
@ -1632,8 +1941,8 @@ mixin _$OrderFormState {
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(
Order order, List<OrderItem> selectedItems, bool isAllSelected)?
TResult? Function(Order order, List<OrderItem> selectedItems,
int totalVoidOrRefund, bool isAllSelected)?
loaded,
TResult? Function(Order order)? success,
TResult? Function()? successMsg,
@ -1644,8 +1953,8 @@ mixin _$OrderFormState {
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(
Order order, List<OrderItem> selectedItems, bool isAllSelected)?
TResult Function(Order order, List<OrderItem> selectedItems,
int totalVoidOrRefund, bool isAllSelected)?
loaded,
TResult Function(Order order)? success,
TResult Function()? successMsg,
@ -1750,8 +2059,8 @@ class _$InitialImpl implements _Initial {
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(
Order order, List<OrderItem> selectedItems, bool isAllSelected)
required TResult Function(Order order, List<OrderItem> selectedItems,
int totalVoidOrRefund, bool isAllSelected)
loaded,
required TResult Function(Order order) success,
required TResult Function() successMsg,
@ -1765,8 +2074,8 @@ class _$InitialImpl implements _Initial {
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(
Order order, List<OrderItem> selectedItems, bool isAllSelected)?
TResult? Function(Order order, List<OrderItem> selectedItems,
int totalVoidOrRefund, bool isAllSelected)?
loaded,
TResult? Function(Order order)? success,
TResult? Function()? successMsg,
@ -1780,8 +2089,8 @@ class _$InitialImpl implements _Initial {
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(
Order order, List<OrderItem> selectedItems, bool isAllSelected)?
TResult Function(Order order, List<OrderItem> selectedItems,
int totalVoidOrRefund, bool isAllSelected)?
loaded,
TResult Function(Order order)? success,
TResult Function()? successMsg,
@ -1885,8 +2194,8 @@ class _$LoadingImpl implements _Loading {
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(
Order order, List<OrderItem> selectedItems, bool isAllSelected)
required TResult Function(Order order, List<OrderItem> selectedItems,
int totalVoidOrRefund, bool isAllSelected)
loaded,
required TResult Function(Order order) success,
required TResult Function() successMsg,
@ -1900,8 +2209,8 @@ class _$LoadingImpl implements _Loading {
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(
Order order, List<OrderItem> selectedItems, bool isAllSelected)?
TResult? Function(Order order, List<OrderItem> selectedItems,
int totalVoidOrRefund, bool isAllSelected)?
loaded,
TResult? Function(Order order)? success,
TResult? Function()? successMsg,
@ -1915,8 +2224,8 @@ class _$LoadingImpl implements _Loading {
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(
Order order, List<OrderItem> selectedItems, bool isAllSelected)?
TResult Function(Order order, List<OrderItem> selectedItems,
int totalVoidOrRefund, bool isAllSelected)?
loaded,
TResult Function(Order order)? success,
TResult Function()? successMsg,
@ -1983,7 +2292,11 @@ abstract class _$$LoadedImplCopyWith<$Res> {
_$LoadedImpl value, $Res Function(_$LoadedImpl) then) =
__$$LoadedImplCopyWithImpl<$Res>;
@useResult
$Res call({Order order, List<OrderItem> selectedItems, bool isAllSelected});
$Res call(
{Order order,
List<OrderItem> selectedItems,
int totalVoidOrRefund,
bool isAllSelected});
}
/// @nodoc
@ -2001,6 +2314,7 @@ class __$$LoadedImplCopyWithImpl<$Res>
$Res call({
Object? order = null,
Object? selectedItems = null,
Object? totalVoidOrRefund = null,
Object? isAllSelected = null,
}) {
return _then(_$LoadedImpl(
@ -2012,6 +2326,10 @@ class __$$LoadedImplCopyWithImpl<$Res>
? _value._selectedItems
: selectedItems // ignore: cast_nullable_to_non_nullable
as List<OrderItem>,
totalVoidOrRefund: null == totalVoidOrRefund
? _value.totalVoidOrRefund
: totalVoidOrRefund // ignore: cast_nullable_to_non_nullable
as int,
isAllSelected: null == isAllSelected
? _value.isAllSelected
: isAllSelected // ignore: cast_nullable_to_non_nullable
@ -2026,6 +2344,7 @@ class _$LoadedImpl implements _Loaded {
const _$LoadedImpl(
{required this.order,
final List<OrderItem> selectedItems = const [],
this.totalVoidOrRefund = 0,
this.isAllSelected = false})
: _selectedItems = selectedItems;
@ -2040,13 +2359,16 @@ class _$LoadedImpl implements _Loaded {
return EqualUnmodifiableListView(_selectedItems);
}
@override
@JsonKey()
final int totalVoidOrRefund;
@override
@JsonKey()
final bool isAllSelected;
@override
String toString() {
return 'OrderFormState.loaded(order: $order, selectedItems: $selectedItems, isAllSelected: $isAllSelected)';
return 'OrderFormState.loaded(order: $order, selectedItems: $selectedItems, totalVoidOrRefund: $totalVoidOrRefund, isAllSelected: $isAllSelected)';
}
@override
@ -2057,13 +2379,19 @@ class _$LoadedImpl implements _Loaded {
(identical(other.order, order) || other.order == order) &&
const DeepCollectionEquality()
.equals(other._selectedItems, _selectedItems) &&
(identical(other.totalVoidOrRefund, totalVoidOrRefund) ||
other.totalVoidOrRefund == totalVoidOrRefund) &&
(identical(other.isAllSelected, isAllSelected) ||
other.isAllSelected == isAllSelected));
}
@override
int get hashCode => Object.hash(runtimeType, order,
const DeepCollectionEquality().hash(_selectedItems), isAllSelected);
int get hashCode => Object.hash(
runtimeType,
order,
const DeepCollectionEquality().hash(_selectedItems),
totalVoidOrRefund,
isAllSelected);
/// Create a copy of OrderFormState
/// with the given fields replaced by the non-null parameter values.
@ -2078,14 +2406,14 @@ class _$LoadedImpl implements _Loaded {
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(
Order order, List<OrderItem> selectedItems, bool isAllSelected)
required TResult Function(Order order, List<OrderItem> selectedItems,
int totalVoidOrRefund, bool isAllSelected)
loaded,
required TResult Function(Order order) success,
required TResult Function() successMsg,
required TResult Function(String message) error,
}) {
return loaded(order, selectedItems, isAllSelected);
return loaded(order, selectedItems, totalVoidOrRefund, isAllSelected);
}
@override
@ -2093,14 +2421,14 @@ class _$LoadedImpl implements _Loaded {
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(
Order order, List<OrderItem> selectedItems, bool isAllSelected)?
TResult? Function(Order order, List<OrderItem> selectedItems,
int totalVoidOrRefund, bool isAllSelected)?
loaded,
TResult? Function(Order order)? success,
TResult? Function()? successMsg,
TResult? Function(String message)? error,
}) {
return loaded?.call(order, selectedItems, isAllSelected);
return loaded?.call(order, selectedItems, totalVoidOrRefund, isAllSelected);
}
@override
@ -2108,8 +2436,8 @@ class _$LoadedImpl implements _Loaded {
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(
Order order, List<OrderItem> selectedItems, bool isAllSelected)?
TResult Function(Order order, List<OrderItem> selectedItems,
int totalVoidOrRefund, bool isAllSelected)?
loaded,
TResult Function(Order order)? success,
TResult Function()? successMsg,
@ -2117,7 +2445,7 @@ class _$LoadedImpl implements _Loaded {
required TResult orElse(),
}) {
if (loaded != null) {
return loaded(order, selectedItems, isAllSelected);
return loaded(order, selectedItems, totalVoidOrRefund, isAllSelected);
}
return orElse();
}
@ -2170,10 +2498,12 @@ abstract class _Loaded implements OrderFormState {
const factory _Loaded(
{required final Order order,
final List<OrderItem> selectedItems,
final int totalVoidOrRefund,
final bool isAllSelected}) = _$LoadedImpl;
Order get order;
List<OrderItem> get selectedItems;
int get totalVoidOrRefund;
bool get isAllSelected;
/// Create a copy of OrderFormState
@ -2253,8 +2583,8 @@ class _$SuccessImpl implements _Success {
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(
Order order, List<OrderItem> selectedItems, bool isAllSelected)
required TResult Function(Order order, List<OrderItem> selectedItems,
int totalVoidOrRefund, bool isAllSelected)
loaded,
required TResult Function(Order order) success,
required TResult Function() successMsg,
@ -2268,8 +2598,8 @@ class _$SuccessImpl implements _Success {
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(
Order order, List<OrderItem> selectedItems, bool isAllSelected)?
TResult? Function(Order order, List<OrderItem> selectedItems,
int totalVoidOrRefund, bool isAllSelected)?
loaded,
TResult? Function(Order order)? success,
TResult? Function()? successMsg,
@ -2283,8 +2613,8 @@ class _$SuccessImpl implements _Success {
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(
Order order, List<OrderItem> selectedItems, bool isAllSelected)?
TResult Function(Order order, List<OrderItem> selectedItems,
int totalVoidOrRefund, bool isAllSelected)?
loaded,
TResult Function(Order order)? success,
TResult Function()? successMsg,
@ -2396,8 +2726,8 @@ class _$SuccessMsgImpl implements _SuccessMsg {
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(
Order order, List<OrderItem> selectedItems, bool isAllSelected)
required TResult Function(Order order, List<OrderItem> selectedItems,
int totalVoidOrRefund, bool isAllSelected)
loaded,
required TResult Function(Order order) success,
required TResult Function() successMsg,
@ -2411,8 +2741,8 @@ class _$SuccessMsgImpl implements _SuccessMsg {
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(
Order order, List<OrderItem> selectedItems, bool isAllSelected)?
TResult? Function(Order order, List<OrderItem> selectedItems,
int totalVoidOrRefund, bool isAllSelected)?
loaded,
TResult? Function(Order order)? success,
TResult? Function()? successMsg,
@ -2426,8 +2756,8 @@ class _$SuccessMsgImpl implements _SuccessMsg {
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(
Order order, List<OrderItem> selectedItems, bool isAllSelected)?
TResult Function(Order order, List<OrderItem> selectedItems,
int totalVoidOrRefund, bool isAllSelected)?
loaded,
TResult Function(Order order)? success,
TResult Function()? successMsg,
@ -2558,8 +2888,8 @@ class _$ErrorImpl implements _Error {
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(
Order order, List<OrderItem> selectedItems, bool isAllSelected)
required TResult Function(Order order, List<OrderItem> selectedItems,
int totalVoidOrRefund, bool isAllSelected)
loaded,
required TResult Function(Order order) success,
required TResult Function() successMsg,
@ -2573,8 +2903,8 @@ class _$ErrorImpl implements _Error {
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(
Order order, List<OrderItem> selectedItems, bool isAllSelected)?
TResult? Function(Order order, List<OrderItem> selectedItems,
int totalVoidOrRefund, bool isAllSelected)?
loaded,
TResult? Function(Order order)? success,
TResult? Function()? successMsg,
@ -2588,8 +2918,8 @@ class _$ErrorImpl implements _Error {
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(
Order order, List<OrderItem> selectedItems, bool isAllSelected)?
TResult Function(Order order, List<OrderItem> selectedItems,
int totalVoidOrRefund, bool isAllSelected)?
loaded,
TResult Function(Order order)? success,
TResult Function()? successMsg,

View File

@ -25,6 +25,11 @@ class OrderFormEvent with _$OrderFormEvent {
required String orderId,
required String reason,
}) = _Refund;
const factory OrderFormEvent.voidOrder({
required List<OrderItem> items,
required String orderId,
required String reason,
}) = _VoidOrder;
const factory OrderFormEvent.toggleItem(OrderItem item) = _ToggleItem;
const factory OrderFormEvent.toggleSelectAll(bool selectAll) =
_ToggleSelectAll;

View File

@ -7,6 +7,7 @@ class OrderFormState with _$OrderFormState {
const factory OrderFormState.loaded({
required Order order,
@Default([]) List<OrderItem> selectedItems,
@Default(0) int totalVoidOrRefund,
@Default(false) bool isAllSelected,
}) = _Loaded;
const factory OrderFormState.success(Order order) = _Success;

View File

@ -5,6 +5,7 @@ import 'package:enaklo_pos/core/components/flushbar.dart';
import 'package:enaklo_pos/core/components/spaces.dart';
import 'package:enaklo_pos/core/constants/colors.dart';
import 'package:enaklo_pos/core/extensions/build_context_ext.dart';
import 'package:enaklo_pos/core/extensions/date_time_ext.dart';
import 'package:enaklo_pos/core/extensions/string_ext.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';
@ -30,29 +31,87 @@ class _RefundDialogState extends State<RefundDialog> {
return CustomModalDialog(
title: 'Refund',
subtitle: 'Pengembalian dana',
minWidth: context.deviceWidth * 0.5,
contentPadding:
const EdgeInsets.symmetric(horizontal: 16.0, vertical: 24.0),
child: Column(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('No. Pesanan'),
Text(
'Pesanan yang akan di refund',
style: const TextStyle(
widget.order.orderNumber ?? '',
style: TextStyle(
color: AppColors.black,
fontSize: 14,
fontWeight: FontWeight.w600,
color: AppColors.black,
),
),
SpaceHeight(12),
Column(
children: widget.selectedItems
.map((item) => _item(context, item))
.toList(),
],
),
SpaceHeight(8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('Tanggal'),
Text(
(widget.order.createdAt ?? DateTime.now()).toFormattedDate2(),
style: TextStyle(
color: AppColors.black,
fontSize: 14,
fontWeight: FontWeight.w600,
),
),
],
),
SpaceHeight(8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('Tagihan'),
Text(
widget.selectedItems.isEmpty
? widget.order.totalAmount.toString().currencyFormatRpV2
: widget.selectedItems
.fold(
0,
(sum, item) =>
sum +
((item.unitPrice ?? 0) * (item.quantity ?? 0)),
)
.toString()
.currencyFormatRpV2,
style: TextStyle(
color: AppColors.black,
fontSize: 14,
fontWeight: FontWeight.w600,
),
),
],
),
Padding(
padding: const EdgeInsets.only(top: 16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Pesanan yang akan di refund',
style: const TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
color: AppColors.black,
),
),
SpaceHeight(12),
Column(
children: widget.selectedItems
.map((item) => _item(context, item))
.toList(),
),
],
),
),
SpaceHeight(16),
CustomTextField(
controller: _reasonController,

View File

@ -0,0 +1,204 @@
import 'package:enaklo_pos/core/components/buttons.dart';
import 'package:enaklo_pos/core/components/custom_modal_dialog.dart';
import 'package:enaklo_pos/core/components/custom_text_field.dart';
import 'package:enaklo_pos/core/components/flushbar.dart';
import 'package:enaklo_pos/core/components/spaces.dart';
import 'package:enaklo_pos/core/constants/colors.dart';
import 'package:enaklo_pos/core/extensions/build_context_ext.dart';
import 'package:enaklo_pos/core/extensions/date_time_ext.dart';
import 'package:enaklo_pos/core/extensions/string_ext.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/sales/blocs/order_loader/order_loader_bloc.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
class VoidDialog extends StatefulWidget {
final Order order;
final List<OrderItem> selectedItems;
const VoidDialog(
{super.key, required this.order, required this.selectedItems});
@override
State<VoidDialog> createState() => _VoidDialogState();
}
class _VoidDialogState extends State<VoidDialog> {
final TextEditingController _reasonController = TextEditingController();
@override
Widget build(BuildContext context) {
return CustomModalDialog(
title: 'Void',
minWidth: context.deviceWidth * 0.5,
contentPadding:
const EdgeInsets.symmetric(horizontal: 16.0, vertical: 24.0),
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('No. Pesanan'),
Text(
widget.order.orderNumber ?? '',
style: TextStyle(
color: AppColors.black,
fontSize: 14,
fontWeight: FontWeight.w600,
),
),
],
),
SpaceHeight(8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('Tanggal'),
Text(
(widget.order.createdAt ?? DateTime.now()).toFormattedDate2(),
style: TextStyle(
color: AppColors.black,
fontSize: 14,
fontWeight: FontWeight.w600,
),
),
],
),
SpaceHeight(8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('Tagihan'),
Text(
widget.selectedItems.isEmpty
? widget.order.totalAmount.toString().currencyFormatRpV2
: widget.selectedItems
.fold(
0,
(sum, item) =>
sum +
((item.unitPrice ?? 0) * (item.quantity ?? 0)),
)
.toString()
.currencyFormatRpV2,
style: TextStyle(
color: AppColors.black,
fontSize: 14,
fontWeight: FontWeight.w600,
),
),
],
),
if (widget.selectedItems.isNotEmpty)
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Pesanan yang akan di void',
style: const TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
color: AppColors.black,
),
),
SpaceHeight(12),
Column(
children: widget.selectedItems
.map((item) => _item(context, item))
.toList(),
),
],
),
SpaceHeight(16),
CustomTextField(
controller: _reasonController,
label: 'Alasan',
),
SpaceHeight(24),
BlocListener<OrderFormBloc, OrderFormState>(
listener: (context, state) {
state.maybeWhen(
orElse: () {},
successMsg: () {
context.pop();
AppFlushbar.showSuccess(context, 'Void berhasil!');
context
.read<OrderLoaderBloc>()
.add(OrderLoaderEvent.getByStatus('pending'));
},
error: (msg) {
AppFlushbar.showError(context, msg);
},
);
},
child: BlocBuilder<OrderFormBloc, OrderFormState>(
builder: (context, state) {
return state.maybeWhen(
orElse: () => Button.filled(
onPressed: () {
context.read<OrderFormBloc>().add(
OrderFormEvent.voidOrder(
orderId: widget.order.id ?? '',
reason: _reasonController.text,
items: widget.selectedItems,
),
);
},
label: 'Refund',
),
loading: () => Center(
child: const CircularProgressIndicator(),
),
);
},
),
),
],
),
);
}
Row _item(
BuildContext context,
OrderItem product,
) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
SizedBox(
width: context.deviceWidth * 0.1,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
product.productName ?? '',
style: const TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
),
),
Text(
(product.unitPrice ?? 0).toString().currencyFormatRpV2,
style: const TextStyle(
fontSize: 14,
),
),
],
),
),
Text(
'X${product.quantity}',
style: const TextStyle(
fontSize: 14,
),
),
Text(
(product.totalPrice ?? 0).toString().currencyFormatRpV2,
style: const TextStyle(
fontSize: 14,
),
),
],
);
}
}

View File

@ -7,6 +7,7 @@ import 'package:enaklo_pos/presentation/sales/blocs/day_sales/day_sales_bloc.dar
import 'package:enaklo_pos/presentation/sales/blocs/order_loader/order_loader_bloc.dart';
import 'package:enaklo_pos/presentation/sales/dialog/payment_dialog.dart';
import 'package:enaklo_pos/presentation/sales/dialog/refund_dialog.dart';
import 'package:enaklo_pos/presentation/sales/dialog/void_dialog.dart';
import 'package:enaklo_pos/presentation/sales/widgets/sales_detail.dart';
import 'package:enaklo_pos/presentation/sales/widgets/sales_list_order.dart';
import 'package:enaklo_pos/presentation/sales/widgets/sales_order_information.dart';
@ -171,11 +172,29 @@ class _SalesPageState extends State<SalesPage> {
order: orderDetail,
actionWidget: [
if (widget.status == 'pending') ...[
Button.outlined(
onPressed: () {},
label: 'Void',
icon: Icon(Icons.undo),
),
BlocBuilder<OrderFormBloc, OrderFormState>(
builder: (context, state) {
return state.maybeWhen(
orElse: () => Button.outlined(
onPressed: () {},
label: 'Void',
icon: Icon(Icons.undo),
),
loaded: (order, selectedItems,
totalVoidOrRefund, isAllSelected) =>
Button.outlined(
onPressed: () => showDialog(
context: context,
builder: (context) => VoidDialog(
order: orderDetail!,
selectedItems: selectedItems,
),
),
label: 'Void',
icon: Icon(Icons.undo),
),
);
}),
SpaceWidth(8),
Button.outlined(
onPressed: () => showDialog(
@ -197,14 +216,13 @@ class _SalesPageState extends State<SalesPage> {
label: 'Refund',
icon: Icon(Icons.autorenew),
),
loaded:
(order, selectedItems, isAllSelected) =>
Button.outlined(
loaded: (order, selectedItems,
totalVoidOrRefund, isAllSelected) =>
Button.outlined(
onPressed: () {
if (selectedItems.isEmpty) {
AppFlushbar.showError(context,
'Silahkan pilih item yang ingin di refund.');
return;
}

View File

@ -23,7 +23,8 @@ class SalesListOrder extends StatelessWidget {
builder: (context, state) {
return state.maybeWhen(
orElse: () => const SizedBox.shrink(),
loaded: (orderX, selectedItems, isAllSelected) => Column(
loaded: (orderX, selectedItems, totalVoidOrRefund, isAllSelected) =>
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
@ -83,54 +84,83 @@ class SalesListOrder extends StatelessWidget {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16)
.copyWith(top: 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
child: Column(
children: [
SizedBox(
width: context.deviceWidth * 0.2,
child: Row(
children: [
Checkbox(
value: isSelected,
activeColor: AppColors.primary,
onChanged: (_) {
context
.read<OrderFormBloc>()
.add(OrderFormEvent.toggleItem(product));
},
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
Align(
alignment: Alignment.centerRight,
child: Text(
product.status == "pending"
? "Pending"
: product.status == "cancelled"
? "Batal"
: product.status == 'refund'
? "Refund"
: "Selesai",
style: TextStyle(
fontSize: 10,
fontWeight: FontWeight.w600,
color: product.status == "pending"
? Colors.blue
: product.status == "cancelled"
? Colors.red
: product.status == 'refund'
? Colors.red
: Colors.green,
),
),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
SizedBox(
width: context.deviceWidth * 0.2,
child: Row(
children: [
Text(
product.productName ?? '',
style: const TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
),
Checkbox(
value: isSelected,
activeColor: AppColors.primary,
onChanged: (_) {
context
.read<OrderFormBloc>()
.add(OrderFormEvent.toggleItem(product));
},
),
Text(
(product.unitPrice ?? 0).toString().currencyFormatRpV2,
style: const TextStyle(
fontSize: 14,
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
product.productName ?? '',
style: const TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
),
),
Text(
(product.unitPrice ?? 0)
.toString()
.currencyFormatRpV2,
style: const TextStyle(
fontSize: 14,
),
),
],
),
],
),
],
),
),
Text(
'X${product.quantity}',
style: const TextStyle(
fontSize: 14,
),
),
Text(
(product.totalPrice ?? 0).toString().currencyFormatRpV2,
style: const TextStyle(
fontSize: 14,
),
),
Text(
'X${product.quantity}',
style: const TextStyle(
fontSize: 14,
),
),
Text(
(product.totalPrice ?? 0).toString().currencyFormatRpV2,
style: const TextStyle(
fontSize: 14,
),
),
],
),
],
),