diff --git a/lib/data/datasources/order_remote_datasource.dart b/lib/data/datasources/order_remote_datasource.dart index e12cac7..36fd408 100644 --- a/lib/data/datasources/order_remote_datasource.dart +++ b/lib/data/datasources/order_remote_datasource.dart @@ -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> voidOrder({ + required String orderId, + required String reason, + String type = "ITEM", // TYPE: ALL, ITEM + required List 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'); + } + } } diff --git a/lib/presentation/home/bloc/order_form/order_form_bloc.dart b/lib/presentation/home/bloc/order_form/order_form_bloc.dart index 2b90749..15559cf 100644 --- a/lib/presentation/home/bloc/order_form/order_form_bloc.dart +++ b/lib/presentation/home/bloc/order_form/order_form_bloc.dart @@ -134,7 +134,7 @@ class OrderFormBloc extends Bloc { ); 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 { on<_ToggleSelectAll>((event, emit) { state.maybeWhen( - loaded: (order, _, __) { + loaded: (order, _, totalVoidOrRefund, __) { final items = event.selectAll ? (order.orderItems ?? []) : []; @@ -187,5 +187,20 @@ class OrderFormBloc extends Bloc { (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()), + ); + }); } } diff --git a/lib/presentation/home/bloc/order_form/order_form_bloc.freezed.dart b/lib/presentation/home/bloc/order_form/order_form_bloc.freezed.dart index 95916a2..6f3716b 100644 --- a/lib/presentation/home/bloc/order_form/order_form_bloc.freezed.dart +++ b/lib/presentation/home/bloc/order_form/order_form_bloc.freezed.dart @@ -30,6 +30,9 @@ mixin _$OrderFormEvent { required TResult Function( List items, String orderId, String reason) refund, + required TResult Function( + List 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 items, String orderId)? addToOrder, TResult? Function(List items, String orderId, String reason)? refund, + TResult? Function(List 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 items, String orderId)? addToOrder, TResult Function(List items, String orderId, String reason)? refund, + TResult Function(List 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 items, String orderId, String reason) refund, + required TResult Function( + List 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 items, String orderId)? addToOrder, TResult? Function(List items, String orderId, String reason)? refund, + TResult? Function(List 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 items, String orderId)? addToOrder, TResult Function(List items, String orderId, String reason)? refund, + TResult Function(List 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 items, String orderId, String reason) refund, + required TResult Function( + List 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 items, String orderId)? addToOrder, TResult? Function(List items, String orderId, String reason)? refund, + TResult? Function(List 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 items, String orderId)? addToOrder, TResult Function(List items, String orderId, String reason)? refund, + TResult Function(List 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 items, String orderId, String reason) refund, + required TResult Function( + List 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 items, String orderId)? addToOrder, TResult? Function(List items, String orderId, String reason)? refund, + TResult? Function(List 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 items, String orderId)? addToOrder, TResult Function(List items, String orderId, String reason)? refund, + TResult Function(List 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 items, String orderId, String reason) refund, + required TResult Function( + List 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 items, String orderId)? addToOrder, TResult? Function(List items, String orderId, String reason)? refund, + TResult? Function(List 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 items, String orderId)? addToOrder, TResult Function(List items, String orderId, String reason)? refund, + TResult Function(List 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 items, String orderId, String reason) refund, + required TResult Function( + List 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 items, String orderId)? addToOrder, TResult? Function(List items, String orderId, String reason)? refund, + TResult? Function(List 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 items, String orderId)? addToOrder, TResult Function(List items, String orderId, String reason)? refund, + TResult Function(List 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 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, + 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 items, + required this.orderId, + required this.reason}) + : _items = items; + + final List _items; + @override + List 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({ + required TResult Function(Order order) started, + required TResult Function(List items, String customerName, + OrderType orderType, TableModel table) + create, + required TResult Function(List items, String customerName, + OrderType orderType, TableModel table, PaymentMethod paymentMethod) + createWithPayment, + required TResult Function(List items, String orderId) + addToOrder, + required TResult Function( + List items, String orderId, String reason) + refund, + required TResult Function( + List 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? Function(Order order)? started, + TResult? Function(List items, String customerName, + OrderType orderType, TableModel table)? + create, + TResult? Function(List items, String customerName, + OrderType orderType, TableModel table, PaymentMethod paymentMethod)? + createWithPayment, + TResult? Function(List items, String orderId)? addToOrder, + TResult? Function(List items, String orderId, String reason)? + refund, + TResult? Function(List 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 Function(Order order)? started, + TResult Function(List items, String customerName, + OrderType orderType, TableModel table)? + create, + TResult Function(List items, String customerName, + OrderType orderType, TableModel table, PaymentMethod paymentMethod)? + createWithPayment, + TResult Function(List items, String orderId)? addToOrder, + TResult Function(List items, String orderId, String reason)? + refund, + TResult Function(List 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({ + 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? 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 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 items, + required final String orderId, + required final String reason}) = _$VoidOrderImpl; + + List 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 items, String orderId, String reason) refund, + required TResult Function( + List 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 items, String orderId)? addToOrder, TResult? Function(List items, String orderId, String reason)? refund, + TResult? Function(List 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 items, String orderId)? addToOrder, TResult Function(List items, String orderId, String reason)? refund, + TResult Function(List 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 items, String orderId, String reason) refund, + required TResult Function( + List 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 items, String orderId)? addToOrder, TResult? Function(List items, String orderId, String reason)? refund, + TResult? Function(List 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 items, String orderId)? addToOrder, TResult Function(List items, String orderId, String reason)? refund, + TResult Function(List 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({ required TResult Function() initial, required TResult Function() loading, - required TResult Function( - Order order, List selectedItems, bool isAllSelected) + required TResult Function(Order order, List 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? Function()? initial, TResult? Function()? loading, - TResult? Function( - Order order, List selectedItems, bool isAllSelected)? + TResult? Function(Order order, List selectedItems, + int totalVoidOrRefund, bool isAllSelected)? loaded, TResult? Function(Order order)? success, TResult? Function()? successMsg, @@ -1644,8 +1953,8 @@ mixin _$OrderFormState { TResult maybeWhen({ TResult Function()? initial, TResult Function()? loading, - TResult Function( - Order order, List selectedItems, bool isAllSelected)? + TResult Function(Order order, List selectedItems, + int totalVoidOrRefund, bool isAllSelected)? loaded, TResult Function(Order order)? success, TResult Function()? successMsg, @@ -1750,8 +2059,8 @@ class _$InitialImpl implements _Initial { TResult when({ required TResult Function() initial, required TResult Function() loading, - required TResult Function( - Order order, List selectedItems, bool isAllSelected) + required TResult Function(Order order, List 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? Function()? initial, TResult? Function()? loading, - TResult? Function( - Order order, List selectedItems, bool isAllSelected)? + TResult? Function(Order order, List 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 Function()? initial, TResult Function()? loading, - TResult Function( - Order order, List selectedItems, bool isAllSelected)? + TResult Function(Order order, List selectedItems, + int totalVoidOrRefund, bool isAllSelected)? loaded, TResult Function(Order order)? success, TResult Function()? successMsg, @@ -1885,8 +2194,8 @@ class _$LoadingImpl implements _Loading { TResult when({ required TResult Function() initial, required TResult Function() loading, - required TResult Function( - Order order, List selectedItems, bool isAllSelected) + required TResult Function(Order order, List 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? Function()? initial, TResult? Function()? loading, - TResult? Function( - Order order, List selectedItems, bool isAllSelected)? + TResult? Function(Order order, List 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 Function()? initial, TResult Function()? loading, - TResult Function( - Order order, List selectedItems, bool isAllSelected)? + TResult Function(Order order, List 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 selectedItems, bool isAllSelected}); + $Res call( + {Order order, + List 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, + 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 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({ required TResult Function() initial, required TResult Function() loading, - required TResult Function( - Order order, List selectedItems, bool isAllSelected) + required TResult Function(Order order, List 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? Function()? initial, TResult? Function()? loading, - TResult? Function( - Order order, List selectedItems, bool isAllSelected)? + TResult? Function(Order order, List 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 Function()? initial, TResult Function()? loading, - TResult Function( - Order order, List selectedItems, bool isAllSelected)? + TResult Function(Order order, List 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 selectedItems, + final int totalVoidOrRefund, final bool isAllSelected}) = _$LoadedImpl; Order get order; List get selectedItems; + int get totalVoidOrRefund; bool get isAllSelected; /// Create a copy of OrderFormState @@ -2253,8 +2583,8 @@ class _$SuccessImpl implements _Success { TResult when({ required TResult Function() initial, required TResult Function() loading, - required TResult Function( - Order order, List selectedItems, bool isAllSelected) + required TResult Function(Order order, List 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? Function()? initial, TResult? Function()? loading, - TResult? Function( - Order order, List selectedItems, bool isAllSelected)? + TResult? Function(Order order, List 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 Function()? initial, TResult Function()? loading, - TResult Function( - Order order, List selectedItems, bool isAllSelected)? + TResult Function(Order order, List selectedItems, + int totalVoidOrRefund, bool isAllSelected)? loaded, TResult Function(Order order)? success, TResult Function()? successMsg, @@ -2396,8 +2726,8 @@ class _$SuccessMsgImpl implements _SuccessMsg { TResult when({ required TResult Function() initial, required TResult Function() loading, - required TResult Function( - Order order, List selectedItems, bool isAllSelected) + required TResult Function(Order order, List 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? Function()? initial, TResult? Function()? loading, - TResult? Function( - Order order, List selectedItems, bool isAllSelected)? + TResult? Function(Order order, List 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 Function()? initial, TResult Function()? loading, - TResult Function( - Order order, List selectedItems, bool isAllSelected)? + TResult Function(Order order, List selectedItems, + int totalVoidOrRefund, bool isAllSelected)? loaded, TResult Function(Order order)? success, TResult Function()? successMsg, @@ -2558,8 +2888,8 @@ class _$ErrorImpl implements _Error { TResult when({ required TResult Function() initial, required TResult Function() loading, - required TResult Function( - Order order, List selectedItems, bool isAllSelected) + required TResult Function(Order order, List 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? Function()? initial, TResult? Function()? loading, - TResult? Function( - Order order, List selectedItems, bool isAllSelected)? + TResult? Function(Order order, List 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 Function()? initial, TResult Function()? loading, - TResult Function( - Order order, List selectedItems, bool isAllSelected)? + TResult Function(Order order, List selectedItems, + int totalVoidOrRefund, bool isAllSelected)? loaded, TResult Function(Order order)? success, TResult Function()? successMsg, diff --git a/lib/presentation/home/bloc/order_form/order_form_event.dart b/lib/presentation/home/bloc/order_form/order_form_event.dart index 0d2b49f..bfd030e 100644 --- a/lib/presentation/home/bloc/order_form/order_form_event.dart +++ b/lib/presentation/home/bloc/order_form/order_form_event.dart @@ -25,6 +25,11 @@ class OrderFormEvent with _$OrderFormEvent { required String orderId, required String reason, }) = _Refund; + const factory OrderFormEvent.voidOrder({ + required List items, + required String orderId, + required String reason, + }) = _VoidOrder; const factory OrderFormEvent.toggleItem(OrderItem item) = _ToggleItem; const factory OrderFormEvent.toggleSelectAll(bool selectAll) = _ToggleSelectAll; diff --git a/lib/presentation/home/bloc/order_form/order_form_state.dart b/lib/presentation/home/bloc/order_form/order_form_state.dart index 2e9ff5d..52e23d8 100644 --- a/lib/presentation/home/bloc/order_form/order_form_state.dart +++ b/lib/presentation/home/bloc/order_form/order_form_state.dart @@ -7,6 +7,7 @@ class OrderFormState with _$OrderFormState { const factory OrderFormState.loaded({ required Order order, @Default([]) List selectedItems, + @Default(0) int totalVoidOrRefund, @Default(false) bool isAllSelected, }) = _Loaded; const factory OrderFormState.success(Order order) = _Success; diff --git a/lib/presentation/sales/dialog/refund_dialog.dart b/lib/presentation/sales/dialog/refund_dialog.dart index 145d8b7..06df1b8 100644 --- a/lib/presentation/sales/dialog/refund_dialog.dart +++ b/lib/presentation/sales/dialog/refund_dialog.dart @@ -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 { 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, diff --git a/lib/presentation/sales/dialog/void_dialog.dart b/lib/presentation/sales/dialog/void_dialog.dart new file mode 100644 index 0000000..696fd1d --- /dev/null +++ b/lib/presentation/sales/dialog/void_dialog.dart @@ -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 selectedItems; + const VoidDialog( + {super.key, required this.order, required this.selectedItems}); + + @override + State createState() => _VoidDialogState(); +} + +class _VoidDialogState extends State { + 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( + listener: (context, state) { + state.maybeWhen( + orElse: () {}, + successMsg: () { + context.pop(); + AppFlushbar.showSuccess(context, 'Void berhasil!'); + context + .read() + .add(OrderLoaderEvent.getByStatus('pending')); + }, + error: (msg) { + AppFlushbar.showError(context, msg); + }, + ); + }, + child: BlocBuilder( + builder: (context, state) { + return state.maybeWhen( + orElse: () => Button.filled( + onPressed: () { + context.read().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, + ), + ), + ], + ); + } +} diff --git a/lib/presentation/sales/pages/sales_page.dart b/lib/presentation/sales/pages/sales_page.dart index b58e381..cd3f41a 100644 --- a/lib/presentation/sales/pages/sales_page.dart +++ b/lib/presentation/sales/pages/sales_page.dart @@ -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 { order: orderDetail, actionWidget: [ if (widget.status == 'pending') ...[ - Button.outlined( - onPressed: () {}, - label: 'Void', - icon: Icon(Icons.undo), - ), + BlocBuilder( + 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 { 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; } diff --git a/lib/presentation/sales/widgets/sales_list_order.dart b/lib/presentation/sales/widgets/sales_list_order.dart index 15d5a2b..daa186a 100644 --- a/lib/presentation/sales/widgets/sales_list_order.dart +++ b/lib/presentation/sales/widgets/sales_list_order.dart @@ -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() - .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() + .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, + ), + ), + ], ), ], ),