From 5a7892aa998046f818a0c2523af94a5d9d4a284a Mon Sep 17 00:00:00 2001 From: efrilm Date: Mon, 3 Nov 2025 20:32:46 +0700 Subject: [PATCH] report payment method --- .../payment_method_analytic_loader_bloc.dart | 59 ++ ...t_method_analytic_loader_bloc.freezed.dart | 487 +++++++++ .../payment_method_analytic_loader_event.dart | 9 + .../payment_method_analytic_loader_state.dart | 16 + lib/common/url/api_path.dart | 2 + lib/domain/analytic/analytic.dart | 1 + lib/domain/analytic/analytic.freezed.dart | 830 +++++++++++++++ .../payment_method_analytic_entity.dart | 65 ++ .../repositories/i_analytic_repository.dart | 4 + .../analytic/analytic_dtos.dart | 1 + .../analytic/analytic_dtos.freezed.dart | 972 ++++++++++++++++++ .../analytic/analytic_dtos.g.dart | 78 ++ .../datasources/remote_data_provider.dart | 29 + .../dtos/payment_method_analytic_dto.dart | 82 ++ .../repositories/analytic_repository.dart | 24 + lib/injection.config.dart | 7 + .../pages/main/pages/report/report_page.dart | 33 +- .../report_payment_method_section.dart | 240 +++++ 18 files changed, 2938 insertions(+), 1 deletion(-) create mode 100644 lib/application/analytic/payment_method_analytic_loader/payment_method_analytic_loader_bloc.dart create mode 100644 lib/application/analytic/payment_method_analytic_loader/payment_method_analytic_loader_bloc.freezed.dart create mode 100644 lib/application/analytic/payment_method_analytic_loader/payment_method_analytic_loader_event.dart create mode 100644 lib/application/analytic/payment_method_analytic_loader/payment_method_analytic_loader_state.dart create mode 100644 lib/domain/analytic/entities/payment_method_analytic_entity.dart create mode 100644 lib/infrastructure/analytic/dtos/payment_method_analytic_dto.dart create mode 100644 lib/presentation/pages/main/pages/report/sections/report_payment_method_section.dart diff --git a/lib/application/analytic/payment_method_analytic_loader/payment_method_analytic_loader_bloc.dart b/lib/application/analytic/payment_method_analytic_loader/payment_method_analytic_loader_bloc.dart new file mode 100644 index 0000000..09d3b04 --- /dev/null +++ b/lib/application/analytic/payment_method_analytic_loader/payment_method_analytic_loader_bloc.dart @@ -0,0 +1,59 @@ +import 'package:bloc/bloc.dart'; +import 'package:dartz/dartz.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:injectable/injectable.dart'; + +import '../../../domain/analytic/analytic.dart'; + +part 'payment_method_analytic_loader_event.dart'; +part 'payment_method_analytic_loader_state.dart'; +part 'payment_method_analytic_loader_bloc.freezed.dart'; + +@injectable +class PaymentMethodAnalyticLoaderBloc + extends + Bloc< + PaymentMethodAnalyticLoaderEvent, + PaymentMethodAnalyticLoaderState + > { + final IAnalyticRepository _analyticRepository; + PaymentMethodAnalyticLoaderBloc(this._analyticRepository) + : super(PaymentMethodAnalyticLoaderState.initial()) { + on(_onPaymentMethodAnalyticLoaderEvent); + } + + Future _onPaymentMethodAnalyticLoaderEvent( + PaymentMethodAnalyticLoaderEvent event, + Emitter emit, + ) { + return event.map( + fetched: (e) async { + emit(state.copyWith(isFetching: true, failureOption: none())); + + final result = await _analyticRepository.getPaymentMethod( + dateFrom: e.startDate, + dateTo: e.endDate, + ); + + await result.fold( + (failure) async { + emit( + state.copyWith( + isFetching: false, + failureOption: optionOf(failure), + ), + ); + }, + (paymentMethod) async { + emit( + state.copyWith( + isFetching: false, + paymentMethodAnalytic: paymentMethod, + ), + ); + }, + ); + }, + ); + } +} diff --git a/lib/application/analytic/payment_method_analytic_loader/payment_method_analytic_loader_bloc.freezed.dart b/lib/application/analytic/payment_method_analytic_loader/payment_method_analytic_loader_bloc.freezed.dart new file mode 100644 index 0000000..79b52f0 --- /dev/null +++ b/lib/application/analytic/payment_method_analytic_loader/payment_method_analytic_loader_bloc.freezed.dart @@ -0,0 +1,487 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'payment_method_analytic_loader_bloc.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models', +); + +/// @nodoc +mixin _$PaymentMethodAnalyticLoaderEvent { + DateTime get startDate => throw _privateConstructorUsedError; + DateTime get endDate => throw _privateConstructorUsedError; + @optionalTypeArgs + TResult when({ + required TResult Function(DateTime startDate, DateTime endDate) fetched, + }) => throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(DateTime startDate, DateTime endDate)? fetched, + }) => throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(DateTime startDate, DateTime endDate)? fetched, + required TResult orElse(), + }) => throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map({ + required TResult Function(_Fetched value) fetched, + }) => throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Fetched value)? fetched, + }) => throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Fetched value)? fetched, + required TResult orElse(), + }) => throw _privateConstructorUsedError; + + /// Create a copy of PaymentMethodAnalyticLoaderEvent + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $PaymentMethodAnalyticLoaderEventCopyWith + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $PaymentMethodAnalyticLoaderEventCopyWith<$Res> { + factory $PaymentMethodAnalyticLoaderEventCopyWith( + PaymentMethodAnalyticLoaderEvent value, + $Res Function(PaymentMethodAnalyticLoaderEvent) then, + ) = + _$PaymentMethodAnalyticLoaderEventCopyWithImpl< + $Res, + PaymentMethodAnalyticLoaderEvent + >; + @useResult + $Res call({DateTime startDate, DateTime endDate}); +} + +/// @nodoc +class _$PaymentMethodAnalyticLoaderEventCopyWithImpl< + $Res, + $Val extends PaymentMethodAnalyticLoaderEvent +> + implements $PaymentMethodAnalyticLoaderEventCopyWith<$Res> { + _$PaymentMethodAnalyticLoaderEventCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of PaymentMethodAnalyticLoaderEvent + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({Object? startDate = null, Object? endDate = null}) { + return _then( + _value.copyWith( + startDate: null == startDate + ? _value.startDate + : startDate // ignore: cast_nullable_to_non_nullable + as DateTime, + endDate: null == endDate + ? _value.endDate + : endDate // ignore: cast_nullable_to_non_nullable + as DateTime, + ) + as $Val, + ); + } +} + +/// @nodoc +abstract class _$$FetchedImplCopyWith<$Res> + implements $PaymentMethodAnalyticLoaderEventCopyWith<$Res> { + factory _$$FetchedImplCopyWith( + _$FetchedImpl value, + $Res Function(_$FetchedImpl) then, + ) = __$$FetchedImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({DateTime startDate, DateTime endDate}); +} + +/// @nodoc +class __$$FetchedImplCopyWithImpl<$Res> + extends _$PaymentMethodAnalyticLoaderEventCopyWithImpl<$Res, _$FetchedImpl> + implements _$$FetchedImplCopyWith<$Res> { + __$$FetchedImplCopyWithImpl( + _$FetchedImpl _value, + $Res Function(_$FetchedImpl) _then, + ) : super(_value, _then); + + /// Create a copy of PaymentMethodAnalyticLoaderEvent + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({Object? startDate = null, Object? endDate = null}) { + return _then( + _$FetchedImpl( + startDate: null == startDate + ? _value.startDate + : startDate // ignore: cast_nullable_to_non_nullable + as DateTime, + endDate: null == endDate + ? _value.endDate + : endDate // ignore: cast_nullable_to_non_nullable + as DateTime, + ), + ); + } +} + +/// @nodoc + +class _$FetchedImpl implements _Fetched { + const _$FetchedImpl({required this.startDate, required this.endDate}); + + @override + final DateTime startDate; + @override + final DateTime endDate; + + @override + String toString() { + return 'PaymentMethodAnalyticLoaderEvent.fetched(startDate: $startDate, endDate: $endDate)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$FetchedImpl && + (identical(other.startDate, startDate) || + other.startDate == startDate) && + (identical(other.endDate, endDate) || other.endDate == endDate)); + } + + @override + int get hashCode => Object.hash(runtimeType, startDate, endDate); + + /// Create a copy of PaymentMethodAnalyticLoaderEvent + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$FetchedImplCopyWith<_$FetchedImpl> get copyWith => + __$$FetchedImplCopyWithImpl<_$FetchedImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function(DateTime startDate, DateTime endDate) fetched, + }) { + return fetched(startDate, endDate); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function(DateTime startDate, DateTime endDate)? fetched, + }) { + return fetched?.call(startDate, endDate); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(DateTime startDate, DateTime endDate)? fetched, + required TResult orElse(), + }) { + if (fetched != null) { + return fetched(startDate, endDate); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(_Fetched value) fetched, + }) { + return fetched(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(_Fetched value)? fetched, + }) { + return fetched?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(_Fetched value)? fetched, + required TResult orElse(), + }) { + if (fetched != null) { + return fetched(this); + } + return orElse(); + } +} + +abstract class _Fetched implements PaymentMethodAnalyticLoaderEvent { + const factory _Fetched({ + required final DateTime startDate, + required final DateTime endDate, + }) = _$FetchedImpl; + + @override + DateTime get startDate; + @override + DateTime get endDate; + + /// Create a copy of PaymentMethodAnalyticLoaderEvent + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$FetchedImplCopyWith<_$FetchedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$PaymentMethodAnalyticLoaderState { + PaymentMethodAnalytic get paymentMethodAnalytic => + throw _privateConstructorUsedError; + Option get failureOption => + throw _privateConstructorUsedError; + bool get isFetching => throw _privateConstructorUsedError; + + /// Create a copy of PaymentMethodAnalyticLoaderState + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $PaymentMethodAnalyticLoaderStateCopyWith + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $PaymentMethodAnalyticLoaderStateCopyWith<$Res> { + factory $PaymentMethodAnalyticLoaderStateCopyWith( + PaymentMethodAnalyticLoaderState value, + $Res Function(PaymentMethodAnalyticLoaderState) then, + ) = + _$PaymentMethodAnalyticLoaderStateCopyWithImpl< + $Res, + PaymentMethodAnalyticLoaderState + >; + @useResult + $Res call({ + PaymentMethodAnalytic paymentMethodAnalytic, + Option failureOption, + bool isFetching, + }); + + $PaymentMethodAnalyticCopyWith<$Res> get paymentMethodAnalytic; +} + +/// @nodoc +class _$PaymentMethodAnalyticLoaderStateCopyWithImpl< + $Res, + $Val extends PaymentMethodAnalyticLoaderState +> + implements $PaymentMethodAnalyticLoaderStateCopyWith<$Res> { + _$PaymentMethodAnalyticLoaderStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of PaymentMethodAnalyticLoaderState + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? paymentMethodAnalytic = null, + Object? failureOption = null, + Object? isFetching = null, + }) { + return _then( + _value.copyWith( + paymentMethodAnalytic: null == paymentMethodAnalytic + ? _value.paymentMethodAnalytic + : paymentMethodAnalytic // ignore: cast_nullable_to_non_nullable + as PaymentMethodAnalytic, + failureOption: null == failureOption + ? _value.failureOption + : failureOption // ignore: cast_nullable_to_non_nullable + as Option, + isFetching: null == isFetching + ? _value.isFetching + : isFetching // ignore: cast_nullable_to_non_nullable + as bool, + ) + as $Val, + ); + } + + /// Create a copy of PaymentMethodAnalyticLoaderState + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $PaymentMethodAnalyticCopyWith<$Res> get paymentMethodAnalytic { + return $PaymentMethodAnalyticCopyWith<$Res>(_value.paymentMethodAnalytic, ( + value, + ) { + return _then(_value.copyWith(paymentMethodAnalytic: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$PaymentMethodAnalyticLoaderStateImplCopyWith<$Res> + implements $PaymentMethodAnalyticLoaderStateCopyWith<$Res> { + factory _$$PaymentMethodAnalyticLoaderStateImplCopyWith( + _$PaymentMethodAnalyticLoaderStateImpl value, + $Res Function(_$PaymentMethodAnalyticLoaderStateImpl) then, + ) = __$$PaymentMethodAnalyticLoaderStateImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({ + PaymentMethodAnalytic paymentMethodAnalytic, + Option failureOption, + bool isFetching, + }); + + @override + $PaymentMethodAnalyticCopyWith<$Res> get paymentMethodAnalytic; +} + +/// @nodoc +class __$$PaymentMethodAnalyticLoaderStateImplCopyWithImpl<$Res> + extends + _$PaymentMethodAnalyticLoaderStateCopyWithImpl< + $Res, + _$PaymentMethodAnalyticLoaderStateImpl + > + implements _$$PaymentMethodAnalyticLoaderStateImplCopyWith<$Res> { + __$$PaymentMethodAnalyticLoaderStateImplCopyWithImpl( + _$PaymentMethodAnalyticLoaderStateImpl _value, + $Res Function(_$PaymentMethodAnalyticLoaderStateImpl) _then, + ) : super(_value, _then); + + /// Create a copy of PaymentMethodAnalyticLoaderState + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? paymentMethodAnalytic = null, + Object? failureOption = null, + Object? isFetching = null, + }) { + return _then( + _$PaymentMethodAnalyticLoaderStateImpl( + paymentMethodAnalytic: null == paymentMethodAnalytic + ? _value.paymentMethodAnalytic + : paymentMethodAnalytic // ignore: cast_nullable_to_non_nullable + as PaymentMethodAnalytic, + failureOption: null == failureOption + ? _value.failureOption + : failureOption // ignore: cast_nullable_to_non_nullable + as Option, + isFetching: null == isFetching + ? _value.isFetching + : isFetching // ignore: cast_nullable_to_non_nullable + as bool, + ), + ); + } +} + +/// @nodoc + +class _$PaymentMethodAnalyticLoaderStateImpl + implements _PaymentMethodAnalyticLoaderState { + _$PaymentMethodAnalyticLoaderStateImpl({ + required this.paymentMethodAnalytic, + required this.failureOption, + this.isFetching = false, + }); + + @override + final PaymentMethodAnalytic paymentMethodAnalytic; + @override + final Option failureOption; + @override + @JsonKey() + final bool isFetching; + + @override + String toString() { + return 'PaymentMethodAnalyticLoaderState(paymentMethodAnalytic: $paymentMethodAnalytic, failureOption: $failureOption, isFetching: $isFetching)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$PaymentMethodAnalyticLoaderStateImpl && + (identical(other.paymentMethodAnalytic, paymentMethodAnalytic) || + other.paymentMethodAnalytic == paymentMethodAnalytic) && + (identical(other.failureOption, failureOption) || + other.failureOption == failureOption) && + (identical(other.isFetching, isFetching) || + other.isFetching == isFetching)); + } + + @override + int get hashCode => Object.hash( + runtimeType, + paymentMethodAnalytic, + failureOption, + isFetching, + ); + + /// Create a copy of PaymentMethodAnalyticLoaderState + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$PaymentMethodAnalyticLoaderStateImplCopyWith< + _$PaymentMethodAnalyticLoaderStateImpl + > + get copyWith => + __$$PaymentMethodAnalyticLoaderStateImplCopyWithImpl< + _$PaymentMethodAnalyticLoaderStateImpl + >(this, _$identity); +} + +abstract class _PaymentMethodAnalyticLoaderState + implements PaymentMethodAnalyticLoaderState { + factory _PaymentMethodAnalyticLoaderState({ + required final PaymentMethodAnalytic paymentMethodAnalytic, + required final Option failureOption, + final bool isFetching, + }) = _$PaymentMethodAnalyticLoaderStateImpl; + + @override + PaymentMethodAnalytic get paymentMethodAnalytic; + @override + Option get failureOption; + @override + bool get isFetching; + + /// Create a copy of PaymentMethodAnalyticLoaderState + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$PaymentMethodAnalyticLoaderStateImplCopyWith< + _$PaymentMethodAnalyticLoaderStateImpl + > + get copyWith => throw _privateConstructorUsedError; +} diff --git a/lib/application/analytic/payment_method_analytic_loader/payment_method_analytic_loader_event.dart b/lib/application/analytic/payment_method_analytic_loader/payment_method_analytic_loader_event.dart new file mode 100644 index 0000000..1c27822 --- /dev/null +++ b/lib/application/analytic/payment_method_analytic_loader/payment_method_analytic_loader_event.dart @@ -0,0 +1,9 @@ +part of 'payment_method_analytic_loader_bloc.dart'; + +@freezed +class PaymentMethodAnalyticLoaderEvent with _$PaymentMethodAnalyticLoaderEvent { + const factory PaymentMethodAnalyticLoaderEvent.fetched({ + required DateTime startDate, + required DateTime endDate, + }) = _Fetched; +} diff --git a/lib/application/analytic/payment_method_analytic_loader/payment_method_analytic_loader_state.dart b/lib/application/analytic/payment_method_analytic_loader/payment_method_analytic_loader_state.dart new file mode 100644 index 0000000..d99913c --- /dev/null +++ b/lib/application/analytic/payment_method_analytic_loader/payment_method_analytic_loader_state.dart @@ -0,0 +1,16 @@ +part of 'payment_method_analytic_loader_bloc.dart'; + +@freezed +class PaymentMethodAnalyticLoaderState with _$PaymentMethodAnalyticLoaderState { + factory PaymentMethodAnalyticLoaderState({ + required PaymentMethodAnalytic paymentMethodAnalytic, + required Option failureOption, + @Default(false) bool isFetching, + }) = _PaymentMethodAnalyticLoaderState; + + factory PaymentMethodAnalyticLoaderState.initial() => + PaymentMethodAnalyticLoaderState( + paymentMethodAnalytic: PaymentMethodAnalytic.empty(), + failureOption: none(), + ); +} diff --git a/lib/common/url/api_path.dart b/lib/common/url/api_path.dart index 172e640..53a622f 100644 --- a/lib/common/url/api_path.dart +++ b/lib/common/url/api_path.dart @@ -11,4 +11,6 @@ class ApiPath { static const String analyticDashboard = '/api/v1/analytics/dashboard'; static const String analyticSales = '/api/v1/analytics/sales'; static const String analyticProducts = '/api/v1/analytics/products'; + static const String analyticPaymentMethods = + '/api/v1/analytics/payment-methods'; } diff --git a/lib/domain/analytic/analytic.dart b/lib/domain/analytic/analytic.dart index 80e02e0..e7ea3bf 100644 --- a/lib/domain/analytic/analytic.dart +++ b/lib/domain/analytic/analytic.dart @@ -8,5 +8,6 @@ part 'analytic.freezed.dart'; part 'entities/dashboard_entity.dart'; part 'entities/sales_entity.dart'; part 'entities/product_analytic_entity.dart'; +part 'entities/payment_method_analytic_entity.dart'; part 'failures/analytic_failure.dart'; part 'repositories/i_analytic_repository.dart'; diff --git a/lib/domain/analytic/analytic.freezed.dart b/lib/domain/analytic/analytic.freezed.dart index 4c34010..f391dd7 100644 --- a/lib/domain/analytic/analytic.freezed.dart +++ b/lib/domain/analytic/analytic.freezed.dart @@ -3093,6 +3093,836 @@ abstract class _ProductAnalyticCategoryItem get copyWith => throw _privateConstructorUsedError; } +/// @nodoc +mixin _$PaymentMethodAnalytic { + String get organizationId => throw _privateConstructorUsedError; + String get outletId => throw _privateConstructorUsedError; + DateTime get dateFrom => throw _privateConstructorUsedError; + DateTime get dateTo => throw _privateConstructorUsedError; + String get groupBy => throw _privateConstructorUsedError; + PaymentMethodAnalyticSummary get summary => + throw _privateConstructorUsedError; + List get data => + throw _privateConstructorUsedError; + + /// Create a copy of PaymentMethodAnalytic + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $PaymentMethodAnalyticCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $PaymentMethodAnalyticCopyWith<$Res> { + factory $PaymentMethodAnalyticCopyWith( + PaymentMethodAnalytic value, + $Res Function(PaymentMethodAnalytic) then, + ) = _$PaymentMethodAnalyticCopyWithImpl<$Res, PaymentMethodAnalytic>; + @useResult + $Res call({ + String organizationId, + String outletId, + DateTime dateFrom, + DateTime dateTo, + String groupBy, + PaymentMethodAnalyticSummary summary, + List data, + }); + + $PaymentMethodAnalyticSummaryCopyWith<$Res> get summary; +} + +/// @nodoc +class _$PaymentMethodAnalyticCopyWithImpl< + $Res, + $Val extends PaymentMethodAnalytic +> + implements $PaymentMethodAnalyticCopyWith<$Res> { + _$PaymentMethodAnalyticCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of PaymentMethodAnalytic + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? organizationId = null, + Object? outletId = null, + Object? dateFrom = null, + Object? dateTo = null, + Object? groupBy = null, + Object? summary = null, + Object? data = null, + }) { + return _then( + _value.copyWith( + organizationId: null == organizationId + ? _value.organizationId + : organizationId // ignore: cast_nullable_to_non_nullable + as String, + outletId: null == outletId + ? _value.outletId + : outletId // ignore: cast_nullable_to_non_nullable + as String, + dateFrom: null == dateFrom + ? _value.dateFrom + : dateFrom // ignore: cast_nullable_to_non_nullable + as DateTime, + dateTo: null == dateTo + ? _value.dateTo + : dateTo // ignore: cast_nullable_to_non_nullable + as DateTime, + groupBy: null == groupBy + ? _value.groupBy + : groupBy // ignore: cast_nullable_to_non_nullable + as String, + summary: null == summary + ? _value.summary + : summary // ignore: cast_nullable_to_non_nullable + as PaymentMethodAnalyticSummary, + data: null == data + ? _value.data + : data // ignore: cast_nullable_to_non_nullable + as List, + ) + as $Val, + ); + } + + /// Create a copy of PaymentMethodAnalytic + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $PaymentMethodAnalyticSummaryCopyWith<$Res> get summary { + return $PaymentMethodAnalyticSummaryCopyWith<$Res>(_value.summary, (value) { + return _then(_value.copyWith(summary: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$PaymentMethodAnalyticImplCopyWith<$Res> + implements $PaymentMethodAnalyticCopyWith<$Res> { + factory _$$PaymentMethodAnalyticImplCopyWith( + _$PaymentMethodAnalyticImpl value, + $Res Function(_$PaymentMethodAnalyticImpl) then, + ) = __$$PaymentMethodAnalyticImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({ + String organizationId, + String outletId, + DateTime dateFrom, + DateTime dateTo, + String groupBy, + PaymentMethodAnalyticSummary summary, + List data, + }); + + @override + $PaymentMethodAnalyticSummaryCopyWith<$Res> get summary; +} + +/// @nodoc +class __$$PaymentMethodAnalyticImplCopyWithImpl<$Res> + extends + _$PaymentMethodAnalyticCopyWithImpl<$Res, _$PaymentMethodAnalyticImpl> + implements _$$PaymentMethodAnalyticImplCopyWith<$Res> { + __$$PaymentMethodAnalyticImplCopyWithImpl( + _$PaymentMethodAnalyticImpl _value, + $Res Function(_$PaymentMethodAnalyticImpl) _then, + ) : super(_value, _then); + + /// Create a copy of PaymentMethodAnalytic + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? organizationId = null, + Object? outletId = null, + Object? dateFrom = null, + Object? dateTo = null, + Object? groupBy = null, + Object? summary = null, + Object? data = null, + }) { + return _then( + _$PaymentMethodAnalyticImpl( + organizationId: null == organizationId + ? _value.organizationId + : organizationId // ignore: cast_nullable_to_non_nullable + as String, + outletId: null == outletId + ? _value.outletId + : outletId // ignore: cast_nullable_to_non_nullable + as String, + dateFrom: null == dateFrom + ? _value.dateFrom + : dateFrom // ignore: cast_nullable_to_non_nullable + as DateTime, + dateTo: null == dateTo + ? _value.dateTo + : dateTo // ignore: cast_nullable_to_non_nullable + as DateTime, + groupBy: null == groupBy + ? _value.groupBy + : groupBy // ignore: cast_nullable_to_non_nullable + as String, + summary: null == summary + ? _value.summary + : summary // ignore: cast_nullable_to_non_nullable + as PaymentMethodAnalyticSummary, + data: null == data + ? _value._data + : data // ignore: cast_nullable_to_non_nullable + as List, + ), + ); + } +} + +/// @nodoc + +class _$PaymentMethodAnalyticImpl implements _PaymentMethodAnalytic { + const _$PaymentMethodAnalyticImpl({ + required this.organizationId, + required this.outletId, + required this.dateFrom, + required this.dateTo, + required this.groupBy, + required this.summary, + required final List data, + }) : _data = data; + + @override + final String organizationId; + @override + final String outletId; + @override + final DateTime dateFrom; + @override + final DateTime dateTo; + @override + final String groupBy; + @override + final PaymentMethodAnalyticSummary summary; + final List _data; + @override + List get data { + if (_data is EqualUnmodifiableListView) return _data; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_data); + } + + @override + String toString() { + return 'PaymentMethodAnalytic(organizationId: $organizationId, outletId: $outletId, dateFrom: $dateFrom, dateTo: $dateTo, groupBy: $groupBy, summary: $summary, data: $data)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$PaymentMethodAnalyticImpl && + (identical(other.organizationId, organizationId) || + other.organizationId == organizationId) && + (identical(other.outletId, outletId) || + other.outletId == outletId) && + (identical(other.dateFrom, dateFrom) || + other.dateFrom == dateFrom) && + (identical(other.dateTo, dateTo) || other.dateTo == dateTo) && + (identical(other.groupBy, groupBy) || other.groupBy == groupBy) && + (identical(other.summary, summary) || other.summary == summary) && + const DeepCollectionEquality().equals(other._data, _data)); + } + + @override + int get hashCode => Object.hash( + runtimeType, + organizationId, + outletId, + dateFrom, + dateTo, + groupBy, + summary, + const DeepCollectionEquality().hash(_data), + ); + + /// Create a copy of PaymentMethodAnalytic + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$PaymentMethodAnalyticImplCopyWith<_$PaymentMethodAnalyticImpl> + get copyWith => + __$$PaymentMethodAnalyticImplCopyWithImpl<_$PaymentMethodAnalyticImpl>( + this, + _$identity, + ); +} + +abstract class _PaymentMethodAnalytic implements PaymentMethodAnalytic { + const factory _PaymentMethodAnalytic({ + required final String organizationId, + required final String outletId, + required final DateTime dateFrom, + required final DateTime dateTo, + required final String groupBy, + required final PaymentMethodAnalyticSummary summary, + required final List data, + }) = _$PaymentMethodAnalyticImpl; + + @override + String get organizationId; + @override + String get outletId; + @override + DateTime get dateFrom; + @override + DateTime get dateTo; + @override + String get groupBy; + @override + PaymentMethodAnalyticSummary get summary; + @override + List get data; + + /// Create a copy of PaymentMethodAnalytic + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$PaymentMethodAnalyticImplCopyWith<_$PaymentMethodAnalyticImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$PaymentMethodAnalyticItem { + String get paymentMethodId => throw _privateConstructorUsedError; + String get paymentMethodName => throw _privateConstructorUsedError; + String get paymentMethodType => throw _privateConstructorUsedError; + int get totalAmount => throw _privateConstructorUsedError; + int get orderCount => throw _privateConstructorUsedError; + int get paymentCount => throw _privateConstructorUsedError; + num get percentage => throw _privateConstructorUsedError; + + /// Create a copy of PaymentMethodAnalyticItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $PaymentMethodAnalyticItemCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $PaymentMethodAnalyticItemCopyWith<$Res> { + factory $PaymentMethodAnalyticItemCopyWith( + PaymentMethodAnalyticItem value, + $Res Function(PaymentMethodAnalyticItem) then, + ) = _$PaymentMethodAnalyticItemCopyWithImpl<$Res, PaymentMethodAnalyticItem>; + @useResult + $Res call({ + String paymentMethodId, + String paymentMethodName, + String paymentMethodType, + int totalAmount, + int orderCount, + int paymentCount, + num percentage, + }); +} + +/// @nodoc +class _$PaymentMethodAnalyticItemCopyWithImpl< + $Res, + $Val extends PaymentMethodAnalyticItem +> + implements $PaymentMethodAnalyticItemCopyWith<$Res> { + _$PaymentMethodAnalyticItemCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of PaymentMethodAnalyticItem + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? paymentMethodId = null, + Object? paymentMethodName = null, + Object? paymentMethodType = null, + Object? totalAmount = null, + Object? orderCount = null, + Object? paymentCount = null, + Object? percentage = null, + }) { + return _then( + _value.copyWith( + paymentMethodId: null == paymentMethodId + ? _value.paymentMethodId + : paymentMethodId // ignore: cast_nullable_to_non_nullable + as String, + paymentMethodName: null == paymentMethodName + ? _value.paymentMethodName + : paymentMethodName // ignore: cast_nullable_to_non_nullable + as String, + paymentMethodType: null == paymentMethodType + ? _value.paymentMethodType + : paymentMethodType // ignore: cast_nullable_to_non_nullable + as String, + totalAmount: null == totalAmount + ? _value.totalAmount + : totalAmount // ignore: cast_nullable_to_non_nullable + as int, + orderCount: null == orderCount + ? _value.orderCount + : orderCount // ignore: cast_nullable_to_non_nullable + as int, + paymentCount: null == paymentCount + ? _value.paymentCount + : paymentCount // ignore: cast_nullable_to_non_nullable + as int, + percentage: null == percentage + ? _value.percentage + : percentage // ignore: cast_nullable_to_non_nullable + as num, + ) + as $Val, + ); + } +} + +/// @nodoc +abstract class _$$PaymentMethodAnalyticItemImplCopyWith<$Res> + implements $PaymentMethodAnalyticItemCopyWith<$Res> { + factory _$$PaymentMethodAnalyticItemImplCopyWith( + _$PaymentMethodAnalyticItemImpl value, + $Res Function(_$PaymentMethodAnalyticItemImpl) then, + ) = __$$PaymentMethodAnalyticItemImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({ + String paymentMethodId, + String paymentMethodName, + String paymentMethodType, + int totalAmount, + int orderCount, + int paymentCount, + num percentage, + }); +} + +/// @nodoc +class __$$PaymentMethodAnalyticItemImplCopyWithImpl<$Res> + extends + _$PaymentMethodAnalyticItemCopyWithImpl< + $Res, + _$PaymentMethodAnalyticItemImpl + > + implements _$$PaymentMethodAnalyticItemImplCopyWith<$Res> { + __$$PaymentMethodAnalyticItemImplCopyWithImpl( + _$PaymentMethodAnalyticItemImpl _value, + $Res Function(_$PaymentMethodAnalyticItemImpl) _then, + ) : super(_value, _then); + + /// Create a copy of PaymentMethodAnalyticItem + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? paymentMethodId = null, + Object? paymentMethodName = null, + Object? paymentMethodType = null, + Object? totalAmount = null, + Object? orderCount = null, + Object? paymentCount = null, + Object? percentage = null, + }) { + return _then( + _$PaymentMethodAnalyticItemImpl( + paymentMethodId: null == paymentMethodId + ? _value.paymentMethodId + : paymentMethodId // ignore: cast_nullable_to_non_nullable + as String, + paymentMethodName: null == paymentMethodName + ? _value.paymentMethodName + : paymentMethodName // ignore: cast_nullable_to_non_nullable + as String, + paymentMethodType: null == paymentMethodType + ? _value.paymentMethodType + : paymentMethodType // ignore: cast_nullable_to_non_nullable + as String, + totalAmount: null == totalAmount + ? _value.totalAmount + : totalAmount // ignore: cast_nullable_to_non_nullable + as int, + orderCount: null == orderCount + ? _value.orderCount + : orderCount // ignore: cast_nullable_to_non_nullable + as int, + paymentCount: null == paymentCount + ? _value.paymentCount + : paymentCount // ignore: cast_nullable_to_non_nullable + as int, + percentage: null == percentage + ? _value.percentage + : percentage // ignore: cast_nullable_to_non_nullable + as num, + ), + ); + } +} + +/// @nodoc + +class _$PaymentMethodAnalyticItemImpl implements _PaymentMethodAnalyticItem { + const _$PaymentMethodAnalyticItemImpl({ + required this.paymentMethodId, + required this.paymentMethodName, + required this.paymentMethodType, + required this.totalAmount, + required this.orderCount, + required this.paymentCount, + required this.percentage, + }); + + @override + final String paymentMethodId; + @override + final String paymentMethodName; + @override + final String paymentMethodType; + @override + final int totalAmount; + @override + final int orderCount; + @override + final int paymentCount; + @override + final num percentage; + + @override + String toString() { + return 'PaymentMethodAnalyticItem(paymentMethodId: $paymentMethodId, paymentMethodName: $paymentMethodName, paymentMethodType: $paymentMethodType, totalAmount: $totalAmount, orderCount: $orderCount, paymentCount: $paymentCount, percentage: $percentage)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$PaymentMethodAnalyticItemImpl && + (identical(other.paymentMethodId, paymentMethodId) || + other.paymentMethodId == paymentMethodId) && + (identical(other.paymentMethodName, paymentMethodName) || + other.paymentMethodName == paymentMethodName) && + (identical(other.paymentMethodType, paymentMethodType) || + other.paymentMethodType == paymentMethodType) && + (identical(other.totalAmount, totalAmount) || + other.totalAmount == totalAmount) && + (identical(other.orderCount, orderCount) || + other.orderCount == orderCount) && + (identical(other.paymentCount, paymentCount) || + other.paymentCount == paymentCount) && + (identical(other.percentage, percentage) || + other.percentage == percentage)); + } + + @override + int get hashCode => Object.hash( + runtimeType, + paymentMethodId, + paymentMethodName, + paymentMethodType, + totalAmount, + orderCount, + paymentCount, + percentage, + ); + + /// Create a copy of PaymentMethodAnalyticItem + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$PaymentMethodAnalyticItemImplCopyWith<_$PaymentMethodAnalyticItemImpl> + get copyWith => + __$$PaymentMethodAnalyticItemImplCopyWithImpl< + _$PaymentMethodAnalyticItemImpl + >(this, _$identity); +} + +abstract class _PaymentMethodAnalyticItem implements PaymentMethodAnalyticItem { + const factory _PaymentMethodAnalyticItem({ + required final String paymentMethodId, + required final String paymentMethodName, + required final String paymentMethodType, + required final int totalAmount, + required final int orderCount, + required final int paymentCount, + required final num percentage, + }) = _$PaymentMethodAnalyticItemImpl; + + @override + String get paymentMethodId; + @override + String get paymentMethodName; + @override + String get paymentMethodType; + @override + int get totalAmount; + @override + int get orderCount; + @override + int get paymentCount; + @override + num get percentage; + + /// Create a copy of PaymentMethodAnalyticItem + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$PaymentMethodAnalyticItemImplCopyWith<_$PaymentMethodAnalyticItemImpl> + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +mixin _$PaymentMethodAnalyticSummary { + int get totalAmount => throw _privateConstructorUsedError; + int get totalOrders => throw _privateConstructorUsedError; + int get totalPayments => throw _privateConstructorUsedError; + double get averageOrderValue => throw _privateConstructorUsedError; + + /// Create a copy of PaymentMethodAnalyticSummary + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $PaymentMethodAnalyticSummaryCopyWith + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $PaymentMethodAnalyticSummaryCopyWith<$Res> { + factory $PaymentMethodAnalyticSummaryCopyWith( + PaymentMethodAnalyticSummary value, + $Res Function(PaymentMethodAnalyticSummary) then, + ) = + _$PaymentMethodAnalyticSummaryCopyWithImpl< + $Res, + PaymentMethodAnalyticSummary + >; + @useResult + $Res call({ + int totalAmount, + int totalOrders, + int totalPayments, + double averageOrderValue, + }); +} + +/// @nodoc +class _$PaymentMethodAnalyticSummaryCopyWithImpl< + $Res, + $Val extends PaymentMethodAnalyticSummary +> + implements $PaymentMethodAnalyticSummaryCopyWith<$Res> { + _$PaymentMethodAnalyticSummaryCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of PaymentMethodAnalyticSummary + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? totalAmount = null, + Object? totalOrders = null, + Object? totalPayments = null, + Object? averageOrderValue = null, + }) { + return _then( + _value.copyWith( + totalAmount: null == totalAmount + ? _value.totalAmount + : totalAmount // ignore: cast_nullable_to_non_nullable + as int, + totalOrders: null == totalOrders + ? _value.totalOrders + : totalOrders // ignore: cast_nullable_to_non_nullable + as int, + totalPayments: null == totalPayments + ? _value.totalPayments + : totalPayments // ignore: cast_nullable_to_non_nullable + as int, + averageOrderValue: null == averageOrderValue + ? _value.averageOrderValue + : averageOrderValue // ignore: cast_nullable_to_non_nullable + as double, + ) + as $Val, + ); + } +} + +/// @nodoc +abstract class _$$PaymentMethodAnalyticSummaryImplCopyWith<$Res> + implements $PaymentMethodAnalyticSummaryCopyWith<$Res> { + factory _$$PaymentMethodAnalyticSummaryImplCopyWith( + _$PaymentMethodAnalyticSummaryImpl value, + $Res Function(_$PaymentMethodAnalyticSummaryImpl) then, + ) = __$$PaymentMethodAnalyticSummaryImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({ + int totalAmount, + int totalOrders, + int totalPayments, + double averageOrderValue, + }); +} + +/// @nodoc +class __$$PaymentMethodAnalyticSummaryImplCopyWithImpl<$Res> + extends + _$PaymentMethodAnalyticSummaryCopyWithImpl< + $Res, + _$PaymentMethodAnalyticSummaryImpl + > + implements _$$PaymentMethodAnalyticSummaryImplCopyWith<$Res> { + __$$PaymentMethodAnalyticSummaryImplCopyWithImpl( + _$PaymentMethodAnalyticSummaryImpl _value, + $Res Function(_$PaymentMethodAnalyticSummaryImpl) _then, + ) : super(_value, _then); + + /// Create a copy of PaymentMethodAnalyticSummary + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? totalAmount = null, + Object? totalOrders = null, + Object? totalPayments = null, + Object? averageOrderValue = null, + }) { + return _then( + _$PaymentMethodAnalyticSummaryImpl( + totalAmount: null == totalAmount + ? _value.totalAmount + : totalAmount // ignore: cast_nullable_to_non_nullable + as int, + totalOrders: null == totalOrders + ? _value.totalOrders + : totalOrders // ignore: cast_nullable_to_non_nullable + as int, + totalPayments: null == totalPayments + ? _value.totalPayments + : totalPayments // ignore: cast_nullable_to_non_nullable + as int, + averageOrderValue: null == averageOrderValue + ? _value.averageOrderValue + : averageOrderValue // ignore: cast_nullable_to_non_nullable + as double, + ), + ); + } +} + +/// @nodoc + +class _$PaymentMethodAnalyticSummaryImpl + implements _PaymentMethodAnalyticSummary { + const _$PaymentMethodAnalyticSummaryImpl({ + required this.totalAmount, + required this.totalOrders, + required this.totalPayments, + required this.averageOrderValue, + }); + + @override + final int totalAmount; + @override + final int totalOrders; + @override + final int totalPayments; + @override + final double averageOrderValue; + + @override + String toString() { + return 'PaymentMethodAnalyticSummary(totalAmount: $totalAmount, totalOrders: $totalOrders, totalPayments: $totalPayments, averageOrderValue: $averageOrderValue)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$PaymentMethodAnalyticSummaryImpl && + (identical(other.totalAmount, totalAmount) || + other.totalAmount == totalAmount) && + (identical(other.totalOrders, totalOrders) || + other.totalOrders == totalOrders) && + (identical(other.totalPayments, totalPayments) || + other.totalPayments == totalPayments) && + (identical(other.averageOrderValue, averageOrderValue) || + other.averageOrderValue == averageOrderValue)); + } + + @override + int get hashCode => Object.hash( + runtimeType, + totalAmount, + totalOrders, + totalPayments, + averageOrderValue, + ); + + /// Create a copy of PaymentMethodAnalyticSummary + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$PaymentMethodAnalyticSummaryImplCopyWith< + _$PaymentMethodAnalyticSummaryImpl + > + get copyWith => + __$$PaymentMethodAnalyticSummaryImplCopyWithImpl< + _$PaymentMethodAnalyticSummaryImpl + >(this, _$identity); +} + +abstract class _PaymentMethodAnalyticSummary + implements PaymentMethodAnalyticSummary { + const factory _PaymentMethodAnalyticSummary({ + required final int totalAmount, + required final int totalOrders, + required final int totalPayments, + required final double averageOrderValue, + }) = _$PaymentMethodAnalyticSummaryImpl; + + @override + int get totalAmount; + @override + int get totalOrders; + @override + int get totalPayments; + @override + double get averageOrderValue; + + /// Create a copy of PaymentMethodAnalyticSummary + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$PaymentMethodAnalyticSummaryImplCopyWith< + _$PaymentMethodAnalyticSummaryImpl + > + get copyWith => throw _privateConstructorUsedError; +} + /// @nodoc mixin _$AnalyticFailure { @optionalTypeArgs diff --git a/lib/domain/analytic/entities/payment_method_analytic_entity.dart b/lib/domain/analytic/entities/payment_method_analytic_entity.dart new file mode 100644 index 0000000..15b1405 --- /dev/null +++ b/lib/domain/analytic/entities/payment_method_analytic_entity.dart @@ -0,0 +1,65 @@ +part of '../analytic.dart'; + +@freezed +class PaymentMethodAnalytic with _$PaymentMethodAnalytic { + const factory PaymentMethodAnalytic({ + required String organizationId, + required String outletId, + required DateTime dateFrom, + required DateTime dateTo, + required String groupBy, + required PaymentMethodAnalyticSummary summary, + required List data, + }) = _PaymentMethodAnalytic; + + factory PaymentMethodAnalytic.empty() => PaymentMethodAnalytic( + organizationId: '', + outletId: '', + dateFrom: DateTime.now(), + dateTo: DateTime.now(), + groupBy: '', + summary: PaymentMethodAnalyticSummary.empty(), + data: const [], + ); +} + +@freezed +class PaymentMethodAnalyticItem with _$PaymentMethodAnalyticItem { + const factory PaymentMethodAnalyticItem({ + required String paymentMethodId, + required String paymentMethodName, + required String paymentMethodType, + required int totalAmount, + required int orderCount, + required int paymentCount, + required num percentage, + }) = _PaymentMethodAnalyticItem; + + factory PaymentMethodAnalyticItem.empty() => const PaymentMethodAnalyticItem( + paymentMethodId: '', + paymentMethodName: '', + paymentMethodType: '', + totalAmount: 0, + orderCount: 0, + paymentCount: 0, + percentage: 0, + ); +} + +@freezed +class PaymentMethodAnalyticSummary with _$PaymentMethodAnalyticSummary { + const factory PaymentMethodAnalyticSummary({ + required int totalAmount, + required int totalOrders, + required int totalPayments, + required double averageOrderValue, + }) = _PaymentMethodAnalyticSummary; + + factory PaymentMethodAnalyticSummary.empty() => + const PaymentMethodAnalyticSummary( + totalAmount: 0, + totalOrders: 0, + totalPayments: 0, + averageOrderValue: 0.0, + ); +} diff --git a/lib/domain/analytic/repositories/i_analytic_repository.dart b/lib/domain/analytic/repositories/i_analytic_repository.dart index b75cdf6..10a3dad 100644 --- a/lib/domain/analytic/repositories/i_analytic_repository.dart +++ b/lib/domain/analytic/repositories/i_analytic_repository.dart @@ -13,4 +13,8 @@ abstract class IAnalyticRepository { required DateTime dateFrom, required DateTime dateTo, }); + Future> getPaymentMethod({ + required DateTime dateFrom, + required DateTime dateTo, + }); } diff --git a/lib/infrastructure/analytic/analytic_dtos.dart b/lib/infrastructure/analytic/analytic_dtos.dart index 925a625..6d7fc76 100644 --- a/lib/infrastructure/analytic/analytic_dtos.dart +++ b/lib/infrastructure/analytic/analytic_dtos.dart @@ -8,3 +8,4 @@ part 'analytic_dtos.g.dart'; part 'dtos/dashboard_dto.dart'; part 'dtos/sales_dto.dart'; part 'dtos/product_analytic_dto.dart'; +part 'dtos/payment_method_analytic_dto.dart'; diff --git a/lib/infrastructure/analytic/analytic_dtos.freezed.dart b/lib/infrastructure/analytic/analytic_dtos.freezed.dart index d19cd9f..cfdf56e 100644 --- a/lib/infrastructure/analytic/analytic_dtos.freezed.dart +++ b/lib/infrastructure/analytic/analytic_dtos.freezed.dart @@ -3374,3 +3374,975 @@ abstract class _ProductAnalyticItemDto extends ProductAnalyticItemDto { _$$ProductAnalyticItemDtoImplCopyWith<_$ProductAnalyticItemDtoImpl> get copyWith => throw _privateConstructorUsedError; } + +PaymentMethodAnalyticDto _$PaymentMethodAnalyticDtoFromJson( + Map json, +) { + return _PaymentMethodAnalyticDto.fromJson(json); +} + +/// @nodoc +mixin _$PaymentMethodAnalyticDto { + @JsonKey(name: "organization_id") + String? get organizationId => throw _privateConstructorUsedError; + @JsonKey(name: "outlet_id") + String? get outletId => throw _privateConstructorUsedError; + @JsonKey(name: "date_from") + DateTime? get dateFrom => throw _privateConstructorUsedError; + @JsonKey(name: "date_to") + DateTime? get dateTo => throw _privateConstructorUsedError; + @JsonKey(name: "group_by") + String? get groupBy => throw _privateConstructorUsedError; + @JsonKey(name: "summary") + PaymentMethodAnalyticSummaryDto? get summary => + throw _privateConstructorUsedError; + @JsonKey(name: "data") + List? get data => + throw _privateConstructorUsedError; + + /// Serializes this PaymentMethodAnalyticDto to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of PaymentMethodAnalyticDto + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $PaymentMethodAnalyticDtoCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $PaymentMethodAnalyticDtoCopyWith<$Res> { + factory $PaymentMethodAnalyticDtoCopyWith( + PaymentMethodAnalyticDto value, + $Res Function(PaymentMethodAnalyticDto) then, + ) = _$PaymentMethodAnalyticDtoCopyWithImpl<$Res, PaymentMethodAnalyticDto>; + @useResult + $Res call({ + @JsonKey(name: "organization_id") String? organizationId, + @JsonKey(name: "outlet_id") String? outletId, + @JsonKey(name: "date_from") DateTime? dateFrom, + @JsonKey(name: "date_to") DateTime? dateTo, + @JsonKey(name: "group_by") String? groupBy, + @JsonKey(name: "summary") PaymentMethodAnalyticSummaryDto? summary, + @JsonKey(name: "data") List? data, + }); + + $PaymentMethodAnalyticSummaryDtoCopyWith<$Res>? get summary; +} + +/// @nodoc +class _$PaymentMethodAnalyticDtoCopyWithImpl< + $Res, + $Val extends PaymentMethodAnalyticDto +> + implements $PaymentMethodAnalyticDtoCopyWith<$Res> { + _$PaymentMethodAnalyticDtoCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of PaymentMethodAnalyticDto + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? organizationId = freezed, + Object? outletId = freezed, + Object? dateFrom = freezed, + Object? dateTo = freezed, + Object? groupBy = freezed, + Object? summary = freezed, + Object? data = freezed, + }) { + return _then( + _value.copyWith( + organizationId: freezed == organizationId + ? _value.organizationId + : organizationId // ignore: cast_nullable_to_non_nullable + as String?, + outletId: freezed == outletId + ? _value.outletId + : outletId // ignore: cast_nullable_to_non_nullable + as String?, + dateFrom: freezed == dateFrom + ? _value.dateFrom + : dateFrom // ignore: cast_nullable_to_non_nullable + as DateTime?, + dateTo: freezed == dateTo + ? _value.dateTo + : dateTo // ignore: cast_nullable_to_non_nullable + as DateTime?, + groupBy: freezed == groupBy + ? _value.groupBy + : groupBy // ignore: cast_nullable_to_non_nullable + as String?, + summary: freezed == summary + ? _value.summary + : summary // ignore: cast_nullable_to_non_nullable + as PaymentMethodAnalyticSummaryDto?, + data: freezed == data + ? _value.data + : data // ignore: cast_nullable_to_non_nullable + as List?, + ) + as $Val, + ); + } + + /// Create a copy of PaymentMethodAnalyticDto + /// with the given fields replaced by the non-null parameter values. + @override + @pragma('vm:prefer-inline') + $PaymentMethodAnalyticSummaryDtoCopyWith<$Res>? get summary { + if (_value.summary == null) { + return null; + } + + return $PaymentMethodAnalyticSummaryDtoCopyWith<$Res>(_value.summary!, ( + value, + ) { + return _then(_value.copyWith(summary: value) as $Val); + }); + } +} + +/// @nodoc +abstract class _$$PaymentMethodAnalyticDtoImplCopyWith<$Res> + implements $PaymentMethodAnalyticDtoCopyWith<$Res> { + factory _$$PaymentMethodAnalyticDtoImplCopyWith( + _$PaymentMethodAnalyticDtoImpl value, + $Res Function(_$PaymentMethodAnalyticDtoImpl) then, + ) = __$$PaymentMethodAnalyticDtoImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({ + @JsonKey(name: "organization_id") String? organizationId, + @JsonKey(name: "outlet_id") String? outletId, + @JsonKey(name: "date_from") DateTime? dateFrom, + @JsonKey(name: "date_to") DateTime? dateTo, + @JsonKey(name: "group_by") String? groupBy, + @JsonKey(name: "summary") PaymentMethodAnalyticSummaryDto? summary, + @JsonKey(name: "data") List? data, + }); + + @override + $PaymentMethodAnalyticSummaryDtoCopyWith<$Res>? get summary; +} + +/// @nodoc +class __$$PaymentMethodAnalyticDtoImplCopyWithImpl<$Res> + extends + _$PaymentMethodAnalyticDtoCopyWithImpl< + $Res, + _$PaymentMethodAnalyticDtoImpl + > + implements _$$PaymentMethodAnalyticDtoImplCopyWith<$Res> { + __$$PaymentMethodAnalyticDtoImplCopyWithImpl( + _$PaymentMethodAnalyticDtoImpl _value, + $Res Function(_$PaymentMethodAnalyticDtoImpl) _then, + ) : super(_value, _then); + + /// Create a copy of PaymentMethodAnalyticDto + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? organizationId = freezed, + Object? outletId = freezed, + Object? dateFrom = freezed, + Object? dateTo = freezed, + Object? groupBy = freezed, + Object? summary = freezed, + Object? data = freezed, + }) { + return _then( + _$PaymentMethodAnalyticDtoImpl( + organizationId: freezed == organizationId + ? _value.organizationId + : organizationId // ignore: cast_nullable_to_non_nullable + as String?, + outletId: freezed == outletId + ? _value.outletId + : outletId // ignore: cast_nullable_to_non_nullable + as String?, + dateFrom: freezed == dateFrom + ? _value.dateFrom + : dateFrom // ignore: cast_nullable_to_non_nullable + as DateTime?, + dateTo: freezed == dateTo + ? _value.dateTo + : dateTo // ignore: cast_nullable_to_non_nullable + as DateTime?, + groupBy: freezed == groupBy + ? _value.groupBy + : groupBy // ignore: cast_nullable_to_non_nullable + as String?, + summary: freezed == summary + ? _value.summary + : summary // ignore: cast_nullable_to_non_nullable + as PaymentMethodAnalyticSummaryDto?, + data: freezed == data + ? _value._data + : data // ignore: cast_nullable_to_non_nullable + as List?, + ), + ); + } +} + +/// @nodoc +@JsonSerializable() +class _$PaymentMethodAnalyticDtoImpl extends _PaymentMethodAnalyticDto { + const _$PaymentMethodAnalyticDtoImpl({ + @JsonKey(name: "organization_id") this.organizationId, + @JsonKey(name: "outlet_id") this.outletId, + @JsonKey(name: "date_from") this.dateFrom, + @JsonKey(name: "date_to") this.dateTo, + @JsonKey(name: "group_by") this.groupBy, + @JsonKey(name: "summary") this.summary, + @JsonKey(name: "data") final List? data, + }) : _data = data, + super._(); + + factory _$PaymentMethodAnalyticDtoImpl.fromJson(Map json) => + _$$PaymentMethodAnalyticDtoImplFromJson(json); + + @override + @JsonKey(name: "organization_id") + final String? organizationId; + @override + @JsonKey(name: "outlet_id") + final String? outletId; + @override + @JsonKey(name: "date_from") + final DateTime? dateFrom; + @override + @JsonKey(name: "date_to") + final DateTime? dateTo; + @override + @JsonKey(name: "group_by") + final String? groupBy; + @override + @JsonKey(name: "summary") + final PaymentMethodAnalyticSummaryDto? summary; + final List? _data; + @override + @JsonKey(name: "data") + List? get data { + final value = _data; + if (value == null) return null; + if (_data is EqualUnmodifiableListView) return _data; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + @override + String toString() { + return 'PaymentMethodAnalyticDto(organizationId: $organizationId, outletId: $outletId, dateFrom: $dateFrom, dateTo: $dateTo, groupBy: $groupBy, summary: $summary, data: $data)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$PaymentMethodAnalyticDtoImpl && + (identical(other.organizationId, organizationId) || + other.organizationId == organizationId) && + (identical(other.outletId, outletId) || + other.outletId == outletId) && + (identical(other.dateFrom, dateFrom) || + other.dateFrom == dateFrom) && + (identical(other.dateTo, dateTo) || other.dateTo == dateTo) && + (identical(other.groupBy, groupBy) || other.groupBy == groupBy) && + (identical(other.summary, summary) || other.summary == summary) && + const DeepCollectionEquality().equals(other._data, _data)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash( + runtimeType, + organizationId, + outletId, + dateFrom, + dateTo, + groupBy, + summary, + const DeepCollectionEquality().hash(_data), + ); + + /// Create a copy of PaymentMethodAnalyticDto + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$PaymentMethodAnalyticDtoImplCopyWith<_$PaymentMethodAnalyticDtoImpl> + get copyWith => + __$$PaymentMethodAnalyticDtoImplCopyWithImpl< + _$PaymentMethodAnalyticDtoImpl + >(this, _$identity); + + @override + Map toJson() { + return _$$PaymentMethodAnalyticDtoImplToJson(this); + } +} + +abstract class _PaymentMethodAnalyticDto extends PaymentMethodAnalyticDto { + const factory _PaymentMethodAnalyticDto({ + @JsonKey(name: "organization_id") final String? organizationId, + @JsonKey(name: "outlet_id") final String? outletId, + @JsonKey(name: "date_from") final DateTime? dateFrom, + @JsonKey(name: "date_to") final DateTime? dateTo, + @JsonKey(name: "group_by") final String? groupBy, + @JsonKey(name: "summary") final PaymentMethodAnalyticSummaryDto? summary, + @JsonKey(name: "data") final List? data, + }) = _$PaymentMethodAnalyticDtoImpl; + const _PaymentMethodAnalyticDto._() : super._(); + + factory _PaymentMethodAnalyticDto.fromJson(Map json) = + _$PaymentMethodAnalyticDtoImpl.fromJson; + + @override + @JsonKey(name: "organization_id") + String? get organizationId; + @override + @JsonKey(name: "outlet_id") + String? get outletId; + @override + @JsonKey(name: "date_from") + DateTime? get dateFrom; + @override + @JsonKey(name: "date_to") + DateTime? get dateTo; + @override + @JsonKey(name: "group_by") + String? get groupBy; + @override + @JsonKey(name: "summary") + PaymentMethodAnalyticSummaryDto? get summary; + @override + @JsonKey(name: "data") + List? get data; + + /// Create a copy of PaymentMethodAnalyticDto + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$PaymentMethodAnalyticDtoImplCopyWith<_$PaymentMethodAnalyticDtoImpl> + get copyWith => throw _privateConstructorUsedError; +} + +PaymentMethodAnalyticItemDto _$PaymentMethodAnalyticItemDtoFromJson( + Map json, +) { + return _PaymentMethodAnalyticItemDto.fromJson(json); +} + +/// @nodoc +mixin _$PaymentMethodAnalyticItemDto { + @JsonKey(name: "payment_method_id") + String? get paymentMethodId => throw _privateConstructorUsedError; + @JsonKey(name: "payment_method_name") + String? get paymentMethodName => throw _privateConstructorUsedError; + @JsonKey(name: "payment_method_type") + String? get paymentMethodType => throw _privateConstructorUsedError; + @JsonKey(name: "total_amount") + int? get totalAmount => throw _privateConstructorUsedError; + @JsonKey(name: "order_count") + int? get orderCount => throw _privateConstructorUsedError; + @JsonKey(name: "payment_count") + int? get paymentCount => throw _privateConstructorUsedError; + @JsonKey(name: "percentage") + num? get percentage => throw _privateConstructorUsedError; + + /// Serializes this PaymentMethodAnalyticItemDto to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of PaymentMethodAnalyticItemDto + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $PaymentMethodAnalyticItemDtoCopyWith + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $PaymentMethodAnalyticItemDtoCopyWith<$Res> { + factory $PaymentMethodAnalyticItemDtoCopyWith( + PaymentMethodAnalyticItemDto value, + $Res Function(PaymentMethodAnalyticItemDto) then, + ) = + _$PaymentMethodAnalyticItemDtoCopyWithImpl< + $Res, + PaymentMethodAnalyticItemDto + >; + @useResult + $Res call({ + @JsonKey(name: "payment_method_id") String? paymentMethodId, + @JsonKey(name: "payment_method_name") String? paymentMethodName, + @JsonKey(name: "payment_method_type") String? paymentMethodType, + @JsonKey(name: "total_amount") int? totalAmount, + @JsonKey(name: "order_count") int? orderCount, + @JsonKey(name: "payment_count") int? paymentCount, + @JsonKey(name: "percentage") num? percentage, + }); +} + +/// @nodoc +class _$PaymentMethodAnalyticItemDtoCopyWithImpl< + $Res, + $Val extends PaymentMethodAnalyticItemDto +> + implements $PaymentMethodAnalyticItemDtoCopyWith<$Res> { + _$PaymentMethodAnalyticItemDtoCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of PaymentMethodAnalyticItemDto + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? paymentMethodId = freezed, + Object? paymentMethodName = freezed, + Object? paymentMethodType = freezed, + Object? totalAmount = freezed, + Object? orderCount = freezed, + Object? paymentCount = freezed, + Object? percentage = freezed, + }) { + return _then( + _value.copyWith( + paymentMethodId: freezed == paymentMethodId + ? _value.paymentMethodId + : paymentMethodId // ignore: cast_nullable_to_non_nullable + as String?, + paymentMethodName: freezed == paymentMethodName + ? _value.paymentMethodName + : paymentMethodName // ignore: cast_nullable_to_non_nullable + as String?, + paymentMethodType: freezed == paymentMethodType + ? _value.paymentMethodType + : paymentMethodType // ignore: cast_nullable_to_non_nullable + as String?, + totalAmount: freezed == totalAmount + ? _value.totalAmount + : totalAmount // ignore: cast_nullable_to_non_nullable + as int?, + orderCount: freezed == orderCount + ? _value.orderCount + : orderCount // ignore: cast_nullable_to_non_nullable + as int?, + paymentCount: freezed == paymentCount + ? _value.paymentCount + : paymentCount // ignore: cast_nullable_to_non_nullable + as int?, + percentage: freezed == percentage + ? _value.percentage + : percentage // ignore: cast_nullable_to_non_nullable + as num?, + ) + as $Val, + ); + } +} + +/// @nodoc +abstract class _$$PaymentMethodAnalyticItemDtoImplCopyWith<$Res> + implements $PaymentMethodAnalyticItemDtoCopyWith<$Res> { + factory _$$PaymentMethodAnalyticItemDtoImplCopyWith( + _$PaymentMethodAnalyticItemDtoImpl value, + $Res Function(_$PaymentMethodAnalyticItemDtoImpl) then, + ) = __$$PaymentMethodAnalyticItemDtoImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({ + @JsonKey(name: "payment_method_id") String? paymentMethodId, + @JsonKey(name: "payment_method_name") String? paymentMethodName, + @JsonKey(name: "payment_method_type") String? paymentMethodType, + @JsonKey(name: "total_amount") int? totalAmount, + @JsonKey(name: "order_count") int? orderCount, + @JsonKey(name: "payment_count") int? paymentCount, + @JsonKey(name: "percentage") num? percentage, + }); +} + +/// @nodoc +class __$$PaymentMethodAnalyticItemDtoImplCopyWithImpl<$Res> + extends + _$PaymentMethodAnalyticItemDtoCopyWithImpl< + $Res, + _$PaymentMethodAnalyticItemDtoImpl + > + implements _$$PaymentMethodAnalyticItemDtoImplCopyWith<$Res> { + __$$PaymentMethodAnalyticItemDtoImplCopyWithImpl( + _$PaymentMethodAnalyticItemDtoImpl _value, + $Res Function(_$PaymentMethodAnalyticItemDtoImpl) _then, + ) : super(_value, _then); + + /// Create a copy of PaymentMethodAnalyticItemDto + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? paymentMethodId = freezed, + Object? paymentMethodName = freezed, + Object? paymentMethodType = freezed, + Object? totalAmount = freezed, + Object? orderCount = freezed, + Object? paymentCount = freezed, + Object? percentage = freezed, + }) { + return _then( + _$PaymentMethodAnalyticItemDtoImpl( + paymentMethodId: freezed == paymentMethodId + ? _value.paymentMethodId + : paymentMethodId // ignore: cast_nullable_to_non_nullable + as String?, + paymentMethodName: freezed == paymentMethodName + ? _value.paymentMethodName + : paymentMethodName // ignore: cast_nullable_to_non_nullable + as String?, + paymentMethodType: freezed == paymentMethodType + ? _value.paymentMethodType + : paymentMethodType // ignore: cast_nullable_to_non_nullable + as String?, + totalAmount: freezed == totalAmount + ? _value.totalAmount + : totalAmount // ignore: cast_nullable_to_non_nullable + as int?, + orderCount: freezed == orderCount + ? _value.orderCount + : orderCount // ignore: cast_nullable_to_non_nullable + as int?, + paymentCount: freezed == paymentCount + ? _value.paymentCount + : paymentCount // ignore: cast_nullable_to_non_nullable + as int?, + percentage: freezed == percentage + ? _value.percentage + : percentage // ignore: cast_nullable_to_non_nullable + as num?, + ), + ); + } +} + +/// @nodoc +@JsonSerializable() +class _$PaymentMethodAnalyticItemDtoImpl extends _PaymentMethodAnalyticItemDto { + const _$PaymentMethodAnalyticItemDtoImpl({ + @JsonKey(name: "payment_method_id") this.paymentMethodId, + @JsonKey(name: "payment_method_name") this.paymentMethodName, + @JsonKey(name: "payment_method_type") this.paymentMethodType, + @JsonKey(name: "total_amount") this.totalAmount, + @JsonKey(name: "order_count") this.orderCount, + @JsonKey(name: "payment_count") this.paymentCount, + @JsonKey(name: "percentage") this.percentage, + }) : super._(); + + factory _$PaymentMethodAnalyticItemDtoImpl.fromJson( + Map json, + ) => _$$PaymentMethodAnalyticItemDtoImplFromJson(json); + + @override + @JsonKey(name: "payment_method_id") + final String? paymentMethodId; + @override + @JsonKey(name: "payment_method_name") + final String? paymentMethodName; + @override + @JsonKey(name: "payment_method_type") + final String? paymentMethodType; + @override + @JsonKey(name: "total_amount") + final int? totalAmount; + @override + @JsonKey(name: "order_count") + final int? orderCount; + @override + @JsonKey(name: "payment_count") + final int? paymentCount; + @override + @JsonKey(name: "percentage") + final num? percentage; + + @override + String toString() { + return 'PaymentMethodAnalyticItemDto(paymentMethodId: $paymentMethodId, paymentMethodName: $paymentMethodName, paymentMethodType: $paymentMethodType, totalAmount: $totalAmount, orderCount: $orderCount, paymentCount: $paymentCount, percentage: $percentage)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$PaymentMethodAnalyticItemDtoImpl && + (identical(other.paymentMethodId, paymentMethodId) || + other.paymentMethodId == paymentMethodId) && + (identical(other.paymentMethodName, paymentMethodName) || + other.paymentMethodName == paymentMethodName) && + (identical(other.paymentMethodType, paymentMethodType) || + other.paymentMethodType == paymentMethodType) && + (identical(other.totalAmount, totalAmount) || + other.totalAmount == totalAmount) && + (identical(other.orderCount, orderCount) || + other.orderCount == orderCount) && + (identical(other.paymentCount, paymentCount) || + other.paymentCount == paymentCount) && + (identical(other.percentage, percentage) || + other.percentage == percentage)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash( + runtimeType, + paymentMethodId, + paymentMethodName, + paymentMethodType, + totalAmount, + orderCount, + paymentCount, + percentage, + ); + + /// Create a copy of PaymentMethodAnalyticItemDto + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$PaymentMethodAnalyticItemDtoImplCopyWith< + _$PaymentMethodAnalyticItemDtoImpl + > + get copyWith => + __$$PaymentMethodAnalyticItemDtoImplCopyWithImpl< + _$PaymentMethodAnalyticItemDtoImpl + >(this, _$identity); + + @override + Map toJson() { + return _$$PaymentMethodAnalyticItemDtoImplToJson(this); + } +} + +abstract class _PaymentMethodAnalyticItemDto + extends PaymentMethodAnalyticItemDto { + const factory _PaymentMethodAnalyticItemDto({ + @JsonKey(name: "payment_method_id") final String? paymentMethodId, + @JsonKey(name: "payment_method_name") final String? paymentMethodName, + @JsonKey(name: "payment_method_type") final String? paymentMethodType, + @JsonKey(name: "total_amount") final int? totalAmount, + @JsonKey(name: "order_count") final int? orderCount, + @JsonKey(name: "payment_count") final int? paymentCount, + @JsonKey(name: "percentage") final num? percentage, + }) = _$PaymentMethodAnalyticItemDtoImpl; + const _PaymentMethodAnalyticItemDto._() : super._(); + + factory _PaymentMethodAnalyticItemDto.fromJson(Map json) = + _$PaymentMethodAnalyticItemDtoImpl.fromJson; + + @override + @JsonKey(name: "payment_method_id") + String? get paymentMethodId; + @override + @JsonKey(name: "payment_method_name") + String? get paymentMethodName; + @override + @JsonKey(name: "payment_method_type") + String? get paymentMethodType; + @override + @JsonKey(name: "total_amount") + int? get totalAmount; + @override + @JsonKey(name: "order_count") + int? get orderCount; + @override + @JsonKey(name: "payment_count") + int? get paymentCount; + @override + @JsonKey(name: "percentage") + num? get percentage; + + /// Create a copy of PaymentMethodAnalyticItemDto + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$PaymentMethodAnalyticItemDtoImplCopyWith< + _$PaymentMethodAnalyticItemDtoImpl + > + get copyWith => throw _privateConstructorUsedError; +} + +PaymentMethodAnalyticSummaryDto _$PaymentMethodAnalyticSummaryDtoFromJson( + Map json, +) { + return _PaymentMethodAnalyticSummaryDto.fromJson(json); +} + +/// @nodoc +mixin _$PaymentMethodAnalyticSummaryDto { + @JsonKey(name: "total_amount") + int? get totalAmount => throw _privateConstructorUsedError; + @JsonKey(name: "total_orders") + int? get totalOrders => throw _privateConstructorUsedError; + @JsonKey(name: "total_payments") + int? get totalPayments => throw _privateConstructorUsedError; + @JsonKey(name: "average_order_value") + double? get averageOrderValue => throw _privateConstructorUsedError; + + /// Serializes this PaymentMethodAnalyticSummaryDto to a JSON map. + Map toJson() => throw _privateConstructorUsedError; + + /// Create a copy of PaymentMethodAnalyticSummaryDto + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + $PaymentMethodAnalyticSummaryDtoCopyWith + get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $PaymentMethodAnalyticSummaryDtoCopyWith<$Res> { + factory $PaymentMethodAnalyticSummaryDtoCopyWith( + PaymentMethodAnalyticSummaryDto value, + $Res Function(PaymentMethodAnalyticSummaryDto) then, + ) = + _$PaymentMethodAnalyticSummaryDtoCopyWithImpl< + $Res, + PaymentMethodAnalyticSummaryDto + >; + @useResult + $Res call({ + @JsonKey(name: "total_amount") int? totalAmount, + @JsonKey(name: "total_orders") int? totalOrders, + @JsonKey(name: "total_payments") int? totalPayments, + @JsonKey(name: "average_order_value") double? averageOrderValue, + }); +} + +/// @nodoc +class _$PaymentMethodAnalyticSummaryDtoCopyWithImpl< + $Res, + $Val extends PaymentMethodAnalyticSummaryDto +> + implements $PaymentMethodAnalyticSummaryDtoCopyWith<$Res> { + _$PaymentMethodAnalyticSummaryDtoCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of PaymentMethodAnalyticSummaryDto + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? totalAmount = freezed, + Object? totalOrders = freezed, + Object? totalPayments = freezed, + Object? averageOrderValue = freezed, + }) { + return _then( + _value.copyWith( + totalAmount: freezed == totalAmount + ? _value.totalAmount + : totalAmount // ignore: cast_nullable_to_non_nullable + as int?, + totalOrders: freezed == totalOrders + ? _value.totalOrders + : totalOrders // ignore: cast_nullable_to_non_nullable + as int?, + totalPayments: freezed == totalPayments + ? _value.totalPayments + : totalPayments // ignore: cast_nullable_to_non_nullable + as int?, + averageOrderValue: freezed == averageOrderValue + ? _value.averageOrderValue + : averageOrderValue // ignore: cast_nullable_to_non_nullable + as double?, + ) + as $Val, + ); + } +} + +/// @nodoc +abstract class _$$PaymentMethodAnalyticSummaryDtoImplCopyWith<$Res> + implements $PaymentMethodAnalyticSummaryDtoCopyWith<$Res> { + factory _$$PaymentMethodAnalyticSummaryDtoImplCopyWith( + _$PaymentMethodAnalyticSummaryDtoImpl value, + $Res Function(_$PaymentMethodAnalyticSummaryDtoImpl) then, + ) = __$$PaymentMethodAnalyticSummaryDtoImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({ + @JsonKey(name: "total_amount") int? totalAmount, + @JsonKey(name: "total_orders") int? totalOrders, + @JsonKey(name: "total_payments") int? totalPayments, + @JsonKey(name: "average_order_value") double? averageOrderValue, + }); +} + +/// @nodoc +class __$$PaymentMethodAnalyticSummaryDtoImplCopyWithImpl<$Res> + extends + _$PaymentMethodAnalyticSummaryDtoCopyWithImpl< + $Res, + _$PaymentMethodAnalyticSummaryDtoImpl + > + implements _$$PaymentMethodAnalyticSummaryDtoImplCopyWith<$Res> { + __$$PaymentMethodAnalyticSummaryDtoImplCopyWithImpl( + _$PaymentMethodAnalyticSummaryDtoImpl _value, + $Res Function(_$PaymentMethodAnalyticSummaryDtoImpl) _then, + ) : super(_value, _then); + + /// Create a copy of PaymentMethodAnalyticSummaryDto + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? totalAmount = freezed, + Object? totalOrders = freezed, + Object? totalPayments = freezed, + Object? averageOrderValue = freezed, + }) { + return _then( + _$PaymentMethodAnalyticSummaryDtoImpl( + totalAmount: freezed == totalAmount + ? _value.totalAmount + : totalAmount // ignore: cast_nullable_to_non_nullable + as int?, + totalOrders: freezed == totalOrders + ? _value.totalOrders + : totalOrders // ignore: cast_nullable_to_non_nullable + as int?, + totalPayments: freezed == totalPayments + ? _value.totalPayments + : totalPayments // ignore: cast_nullable_to_non_nullable + as int?, + averageOrderValue: freezed == averageOrderValue + ? _value.averageOrderValue + : averageOrderValue // ignore: cast_nullable_to_non_nullable + as double?, + ), + ); + } +} + +/// @nodoc +@JsonSerializable() +class _$PaymentMethodAnalyticSummaryDtoImpl + extends _PaymentMethodAnalyticSummaryDto { + const _$PaymentMethodAnalyticSummaryDtoImpl({ + @JsonKey(name: "total_amount") this.totalAmount, + @JsonKey(name: "total_orders") this.totalOrders, + @JsonKey(name: "total_payments") this.totalPayments, + @JsonKey(name: "average_order_value") this.averageOrderValue, + }) : super._(); + + factory _$PaymentMethodAnalyticSummaryDtoImpl.fromJson( + Map json, + ) => _$$PaymentMethodAnalyticSummaryDtoImplFromJson(json); + + @override + @JsonKey(name: "total_amount") + final int? totalAmount; + @override + @JsonKey(name: "total_orders") + final int? totalOrders; + @override + @JsonKey(name: "total_payments") + final int? totalPayments; + @override + @JsonKey(name: "average_order_value") + final double? averageOrderValue; + + @override + String toString() { + return 'PaymentMethodAnalyticSummaryDto(totalAmount: $totalAmount, totalOrders: $totalOrders, totalPayments: $totalPayments, averageOrderValue: $averageOrderValue)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$PaymentMethodAnalyticSummaryDtoImpl && + (identical(other.totalAmount, totalAmount) || + other.totalAmount == totalAmount) && + (identical(other.totalOrders, totalOrders) || + other.totalOrders == totalOrders) && + (identical(other.totalPayments, totalPayments) || + other.totalPayments == totalPayments) && + (identical(other.averageOrderValue, averageOrderValue) || + other.averageOrderValue == averageOrderValue)); + } + + @JsonKey(includeFromJson: false, includeToJson: false) + @override + int get hashCode => Object.hash( + runtimeType, + totalAmount, + totalOrders, + totalPayments, + averageOrderValue, + ); + + /// Create a copy of PaymentMethodAnalyticSummaryDto + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$PaymentMethodAnalyticSummaryDtoImplCopyWith< + _$PaymentMethodAnalyticSummaryDtoImpl + > + get copyWith => + __$$PaymentMethodAnalyticSummaryDtoImplCopyWithImpl< + _$PaymentMethodAnalyticSummaryDtoImpl + >(this, _$identity); + + @override + Map toJson() { + return _$$PaymentMethodAnalyticSummaryDtoImplToJson(this); + } +} + +abstract class _PaymentMethodAnalyticSummaryDto + extends PaymentMethodAnalyticSummaryDto { + const factory _PaymentMethodAnalyticSummaryDto({ + @JsonKey(name: "total_amount") final int? totalAmount, + @JsonKey(name: "total_orders") final int? totalOrders, + @JsonKey(name: "total_payments") final int? totalPayments, + @JsonKey(name: "average_order_value") final double? averageOrderValue, + }) = _$PaymentMethodAnalyticSummaryDtoImpl; + const _PaymentMethodAnalyticSummaryDto._() : super._(); + + factory _PaymentMethodAnalyticSummaryDto.fromJson(Map json) = + _$PaymentMethodAnalyticSummaryDtoImpl.fromJson; + + @override + @JsonKey(name: "total_amount") + int? get totalAmount; + @override + @JsonKey(name: "total_orders") + int? get totalOrders; + @override + @JsonKey(name: "total_payments") + int? get totalPayments; + @override + @JsonKey(name: "average_order_value") + double? get averageOrderValue; + + /// Create a copy of PaymentMethodAnalyticSummaryDto + /// with the given fields replaced by the non-null parameter values. + @override + @JsonKey(includeFromJson: false, includeToJson: false) + _$$PaymentMethodAnalyticSummaryDtoImplCopyWith< + _$PaymentMethodAnalyticSummaryDtoImpl + > + get copyWith => throw _privateConstructorUsedError; +} diff --git a/lib/infrastructure/analytic/analytic_dtos.g.dart b/lib/infrastructure/analytic/analytic_dtos.g.dart index ad65b56..f937fa1 100644 --- a/lib/infrastructure/analytic/analytic_dtos.g.dart +++ b/lib/infrastructure/analytic/analytic_dtos.g.dart @@ -269,3 +269,81 @@ Map _$$ProductAnalyticItemDtoImplToJson( 'average_price': instance.averagePrice, 'order_count': instance.orderCount, }; + +_$PaymentMethodAnalyticDtoImpl _$$PaymentMethodAnalyticDtoImplFromJson( + Map json, +) => _$PaymentMethodAnalyticDtoImpl( + organizationId: json['organization_id'] as String?, + outletId: json['outlet_id'] as String?, + dateFrom: json['date_from'] == null + ? null + : DateTime.parse(json['date_from'] as String), + dateTo: json['date_to'] == null + ? null + : DateTime.parse(json['date_to'] as String), + groupBy: json['group_by'] as String?, + summary: json['summary'] == null + ? null + : PaymentMethodAnalyticSummaryDto.fromJson( + json['summary'] as Map, + ), + data: (json['data'] as List?) + ?.map( + (e) => PaymentMethodAnalyticItemDto.fromJson(e as Map), + ) + .toList(), +); + +Map _$$PaymentMethodAnalyticDtoImplToJson( + _$PaymentMethodAnalyticDtoImpl instance, +) => { + 'organization_id': instance.organizationId, + 'outlet_id': instance.outletId, + 'date_from': instance.dateFrom?.toIso8601String(), + 'date_to': instance.dateTo?.toIso8601String(), + 'group_by': instance.groupBy, + 'summary': instance.summary, + 'data': instance.data, +}; + +_$PaymentMethodAnalyticItemDtoImpl _$$PaymentMethodAnalyticItemDtoImplFromJson( + Map json, +) => _$PaymentMethodAnalyticItemDtoImpl( + paymentMethodId: json['payment_method_id'] as String?, + paymentMethodName: json['payment_method_name'] as String?, + paymentMethodType: json['payment_method_type'] as String?, + totalAmount: (json['total_amount'] as num?)?.toInt(), + orderCount: (json['order_count'] as num?)?.toInt(), + paymentCount: (json['payment_count'] as num?)?.toInt(), + percentage: json['percentage'] as num?, +); + +Map _$$PaymentMethodAnalyticItemDtoImplToJson( + _$PaymentMethodAnalyticItemDtoImpl instance, +) => { + 'payment_method_id': instance.paymentMethodId, + 'payment_method_name': instance.paymentMethodName, + 'payment_method_type': instance.paymentMethodType, + 'total_amount': instance.totalAmount, + 'order_count': instance.orderCount, + 'payment_count': instance.paymentCount, + 'percentage': instance.percentage, +}; + +_$PaymentMethodAnalyticSummaryDtoImpl +_$$PaymentMethodAnalyticSummaryDtoImplFromJson(Map json) => + _$PaymentMethodAnalyticSummaryDtoImpl( + totalAmount: (json['total_amount'] as num?)?.toInt(), + totalOrders: (json['total_orders'] as num?)?.toInt(), + totalPayments: (json['total_payments'] as num?)?.toInt(), + averageOrderValue: (json['average_order_value'] as num?)?.toDouble(), + ); + +Map _$$PaymentMethodAnalyticSummaryDtoImplToJson( + _$PaymentMethodAnalyticSummaryDtoImpl instance, +) => { + 'total_amount': instance.totalAmount, + 'total_orders': instance.totalOrders, + 'total_payments': instance.totalPayments, + 'average_order_value': instance.averageOrderValue, +}; diff --git a/lib/infrastructure/analytic/datasources/remote_data_provider.dart b/lib/infrastructure/analytic/datasources/remote_data_provider.dart index 6d15524..b6a9d83 100644 --- a/lib/infrastructure/analytic/datasources/remote_data_provider.dart +++ b/lib/infrastructure/analytic/datasources/remote_data_provider.dart @@ -105,4 +105,33 @@ class AnalyticRemoteDataProvider { return DC.error(AnalyticFailure.serverError(e)); } } + + Future> fetchPaymentMethod({ + required DateTime dateFrom, + required DateTime dateTo, + }) async { + try { + final response = await _apiClient.get( + ApiPath.analyticPaymentMethods, + params: { + 'date_from': dateFrom.toServerDate(), + 'date_to': dateTo.toServerDate(), + }, + headers: getAuthorizationHeader(), + ); + + if (response.data['success'] == false) { + return DC.error(AnalyticFailure.unexpectedError()); + } + + final paymentMethods = PaymentMethodAnalyticDto.fromJson( + response.data['data'] as Map, + ); + + return DC.data(paymentMethods); + } on ApiFailure catch (e, s) { + log('fetchPaymentMethod', name: _logName, error: e, stackTrace: s); + return DC.error(AnalyticFailure.serverError(e)); + } + } } diff --git a/lib/infrastructure/analytic/dtos/payment_method_analytic_dto.dart b/lib/infrastructure/analytic/dtos/payment_method_analytic_dto.dart new file mode 100644 index 0000000..b03079c --- /dev/null +++ b/lib/infrastructure/analytic/dtos/payment_method_analytic_dto.dart @@ -0,0 +1,82 @@ +part of '../analytic_dtos.dart'; + +@freezed +class PaymentMethodAnalyticDto with _$PaymentMethodAnalyticDto { + const PaymentMethodAnalyticDto._(); + + const factory PaymentMethodAnalyticDto({ + @JsonKey(name: "organization_id") String? organizationId, + @JsonKey(name: "outlet_id") String? outletId, + @JsonKey(name: "date_from") DateTime? dateFrom, + @JsonKey(name: "date_to") DateTime? dateTo, + @JsonKey(name: "group_by") String? groupBy, + @JsonKey(name: "summary") PaymentMethodAnalyticSummaryDto? summary, + @JsonKey(name: "data") List? data, + }) = _PaymentMethodAnalyticDto; + + factory PaymentMethodAnalyticDto.fromJson(Map json) => + _$PaymentMethodAnalyticDtoFromJson(json); + + // Optional mapper ke domain + PaymentMethodAnalytic toDomain() => PaymentMethodAnalytic( + organizationId: organizationId ?? '', + outletId: outletId ?? '', + dateFrom: dateFrom ?? DateTime.now(), + dateTo: dateTo ?? DateTime.now(), + groupBy: groupBy ?? '', + summary: summary?.toDomain() ?? PaymentMethodAnalyticSummary.empty(), + data: data?.map((e) => e.toDomain()).toList() ?? [], + ); +} + +@freezed +class PaymentMethodAnalyticItemDto with _$PaymentMethodAnalyticItemDto { + const PaymentMethodAnalyticItemDto._(); + + const factory PaymentMethodAnalyticItemDto({ + @JsonKey(name: "payment_method_id") String? paymentMethodId, + @JsonKey(name: "payment_method_name") String? paymentMethodName, + @JsonKey(name: "payment_method_type") String? paymentMethodType, + @JsonKey(name: "total_amount") int? totalAmount, + @JsonKey(name: "order_count") int? orderCount, + @JsonKey(name: "payment_count") int? paymentCount, + @JsonKey(name: "percentage") num? percentage, + }) = _PaymentMethodAnalyticItemDto; + + factory PaymentMethodAnalyticItemDto.fromJson(Map json) => + _$PaymentMethodAnalyticItemDtoFromJson(json); + + // Optional mapper ke domain + PaymentMethodAnalyticItem toDomain() => PaymentMethodAnalyticItem( + paymentMethodId: paymentMethodId ?? '', + paymentMethodName: paymentMethodName ?? '', + paymentMethodType: paymentMethodType ?? '', + totalAmount: totalAmount ?? 0, + orderCount: orderCount ?? 0, + paymentCount: paymentCount ?? 0, + percentage: percentage ?? 0, + ); +} + +@freezed +class PaymentMethodAnalyticSummaryDto with _$PaymentMethodAnalyticSummaryDto { + const PaymentMethodAnalyticSummaryDto._(); + + const factory PaymentMethodAnalyticSummaryDto({ + @JsonKey(name: "total_amount") int? totalAmount, + @JsonKey(name: "total_orders") int? totalOrders, + @JsonKey(name: "total_payments") int? totalPayments, + @JsonKey(name: "average_order_value") double? averageOrderValue, + }) = _PaymentMethodAnalyticSummaryDto; + + factory PaymentMethodAnalyticSummaryDto.fromJson(Map json) => + _$PaymentMethodAnalyticSummaryDtoFromJson(json); + + // Optional mapping ke domain entity + PaymentMethodAnalyticSummary toDomain() => PaymentMethodAnalyticSummary( + totalAmount: totalAmount ?? 0, + totalOrders: totalOrders ?? 0, + totalPayments: totalPayments ?? 0, + averageOrderValue: averageOrderValue ?? 0.0, + ); +} diff --git a/lib/infrastructure/analytic/repositories/analytic_repository.dart b/lib/infrastructure/analytic/repositories/analytic_repository.dart index de2f2c5..cad51b0 100644 --- a/lib/infrastructure/analytic/repositories/analytic_repository.dart +++ b/lib/infrastructure/analytic/repositories/analytic_repository.dart @@ -85,4 +85,28 @@ class AnalyticRepository implements IAnalyticRepository { return left(const AnalyticFailure.unexpectedError()); } } + + @override + Future> getPaymentMethod({ + required DateTime dateFrom, + required DateTime dateTo, + }) async { + try { + final result = await _dataProvider.fetchPaymentMethod( + dateFrom: dateFrom, + dateTo: dateTo, + ); + + if (result.hasError) { + return left(result.error!); + } + + final paymentMethod = result.data!.toDomain(); + + return right(paymentMethod); + } catch (e) { + log('getPaymentMethodError', name: _logName, error: e); + return left(const AnalyticFailure.unexpectedError()); + } + } } diff --git a/lib/injection.config.dart b/lib/injection.config.dart index 67681aa..218a3f2 100644 --- a/lib/injection.config.dart +++ b/lib/injection.config.dart @@ -11,6 +11,8 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:apskel_pos_flutter_v2/application/analytic/dashboard_analytic_loader/dashboard_analytic_loader_bloc.dart' as _i80; +import 'package:apskel_pos_flutter_v2/application/analytic/payment_method_analytic_loader/payment_method_analytic_loader_bloc.dart' + as _i733; import 'package:apskel_pos_flutter_v2/application/analytic/product_analytic_loader/product_analytic_loader_bloc.dart' as _i268; import 'package:apskel_pos_flutter_v2/application/analytic/sales_analytic_loader/sales_analytic_loader_bloc.dart' @@ -303,6 +305,11 @@ extension GetItInjectableX on _i174.GetIt { gh.factory<_i268.ProductAnalyticLoaderBloc>( () => _i268.ProductAnalyticLoaderBloc(gh<_i346.IAnalyticRepository>()), ); + gh.factory<_i733.PaymentMethodAnalyticLoaderBloc>( + () => _i733.PaymentMethodAnalyticLoaderBloc( + gh<_i346.IAnalyticRepository>(), + ), + ); return this; } } diff --git a/lib/presentation/pages/main/pages/report/report_page.dart b/lib/presentation/pages/main/pages/report/report_page.dart index f89c41a..8644f23 100644 --- a/lib/presentation/pages/main/pages/report/report_page.dart +++ b/lib/presentation/pages/main/pages/report/report_page.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../../../../../application/analytic/dashboard_analytic_loader/dashboard_analytic_loader_bloc.dart'; +import '../../../../../application/analytic/payment_method_analytic_loader/payment_method_analytic_loader_bloc.dart'; import '../../../../../application/analytic/product_analytic_loader/product_analytic_loader_bloc.dart'; import '../../../../../application/analytic/sales_analytic_loader/sales_analytic_loader_bloc.dart'; import '../../../../../application/report/report_bloc.dart'; @@ -15,6 +16,7 @@ import '../../../../components/picker/date_range_picker.dart'; import '../../../../components/spaces/space.dart'; import '../../../../router/app_router.gr.dart'; import 'sections/report_dashboard_section.dart'; +import 'sections/report_payment_method_section.dart'; import 'sections/report_product_section.dart'; import 'sections/report_sales_section.dart'; import 'widgets/report_menu_card.dart'; @@ -151,7 +153,20 @@ class ReportPage extends StatelessWidget implements AutoRouteWrapper { ); }, ), - 4 => Text(state.title), + 4 => + BlocBuilder< + PaymentMethodAnalyticLoaderBloc, + PaymentMethodAnalyticLoaderState + >( + builder: (context, paymentMethod) { + return ReportPaymentMethodSection( + menu: reportMenus[state.selectedMenu], + state: paymentMethod, + startDate: state.startDate, + endDate: state.endDate, + ); + }, + ), 5 => Text(state.title), 6 => Text(state.title), 7 => Text(state.title), @@ -195,6 +210,13 @@ class ReportPage extends StatelessWidget implements AutoRouteWrapper { ), ); case 4: + return context.read().add( + PaymentMethodAnalyticLoaderEvent.fetched( + startDate: state.startDate, + endDate: state.endDate, + ), + ); + case 5: case 6: case 7: @@ -234,6 +256,15 @@ class ReportPage extends StatelessWidget implements AutoRouteWrapper { ), ), ), + BlocProvider( + create: (context) => getIt() + ..add( + PaymentMethodAnalyticLoaderEvent.fetched( + startDate: DateTime.now().subtract(const Duration(days: 30)), + endDate: DateTime.now(), + ), + ), + ), ], child: this, ); diff --git a/lib/presentation/pages/main/pages/report/sections/report_payment_method_section.dart b/lib/presentation/pages/main/pages/report/sections/report_payment_method_section.dart new file mode 100644 index 0000000..1e7277f --- /dev/null +++ b/lib/presentation/pages/main/pages/report/sections/report_payment_method_section.dart @@ -0,0 +1,240 @@ +import 'package:flutter/material.dart'; + +import '../../../../../../application/analytic/payment_method_analytic_loader/payment_method_analytic_loader_bloc.dart'; +import '../../../../../../common/data/report_menu.dart'; +import '../../../../../../common/extension/extension.dart'; +import '../../../../../../common/theme/theme.dart'; +import '../../../../../../domain/analytic/analytic.dart'; +import '../../../../../components/loader/loader_with_text.dart'; +import '../../../../../components/spaces/space.dart'; +import '../../../../../components/widgets/report/report_header.dart'; +import '../../../../../components/widgets/report/report_summary_card.dart'; + +class ReportPaymentMethodSection extends StatelessWidget { + final ReportMenu menu; + final PaymentMethodAnalyticLoaderState state; + final DateTime startDate; + final DateTime endDate; + const ReportPaymentMethodSection({ + super.key, + required this.menu, + required this.state, + required this.startDate, + required this.endDate, + }); + + @override + Widget build(BuildContext context) { + if (state.isFetching) { + return const Center(child: LoaderWithText()); + } + + return ListView( + padding: EdgeInsets.all(16), + children: [ + ReportHeader(menu: menu, endDate: endDate, startDate: startDate), + _buildSummary(), + Container( + padding: const EdgeInsets.all(12), + margin: EdgeInsets.only(top: 16), + decoration: BoxDecoration( + color: AppColor.white, + borderRadius: BorderRadius.circular(14), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Rincian Metode Pembayaran', + style: AppStyle.lg.copyWith( + fontWeight: FontWeight.w600, + color: AppColor.textPrimary, + ), + ), + + SpaceHeight(16), + + ...List.generate(state.paymentMethodAnalytic.data.length, ( + index, + ) { + final item = state.paymentMethodAnalytic.data[index]; + return Padding( + padding: const EdgeInsets.only(bottom: 16), + child: _buildPaymentCard(item), + ); + }), + ], + ), + ), + ], + ); + } + + Container _buildPaymentCard(PaymentMethodAnalyticItem item) { + return Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.border, width: 1), + ), + child: Row( + children: [ + // Payment Method Icon + Container( + width: 40, + height: 40, + decoration: BoxDecoration( + color: AppColor.primary, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.primary, width: 1), + ), + child: Icon(Icons.money, color: AppColor.white, size: 20), + ), + + SpaceWidth(16), + + // Payment Method Details + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + item.paymentMethodName, + style: AppStyle.md.copyWith( + fontWeight: FontWeight.w600, + color: AppColor.textPrimary, + ), + ), + Text( + "${item.percentage}%", + style: AppStyle.md.copyWith( + fontWeight: FontWeight.bold, + color: AppColor.primary, + ), + ), + ], + ), + + SpaceHeight(8), + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + item.totalAmount.currencyFormatRpV2, + style: AppStyle.md.copyWith( + fontWeight: FontWeight.w500, + color: AppColor.textSecondary, + ), + ), + Text( + '${item.orderCount} Pesanan', + style: AppStyle.md.copyWith( + fontWeight: FontWeight.w500, + color: AppColor.textSecondary, + ), + ), + ], + ), + + SpaceHeight(8), + + // Progress Bar + Container( + width: double.infinity, + height: 6, + decoration: BoxDecoration( + color: Colors.grey.shade200, + borderRadius: BorderRadius.circular(3), + ), + child: FractionallySizedBox( + alignment: Alignment.centerLeft, + widthFactor: (item.percentage / 100), // 100% + child: Container( + decoration: BoxDecoration( + color: AppColor.primary, + borderRadius: BorderRadius.circular(3), + ), + ), + ), + ), + ], + ), + ), + ], + ), + ); + } + + Padding _buildSummary() { + return Padding( + padding: const EdgeInsets.only(top: 16), + child: Column( + children: [ + Row( + children: [ + Expanded( + child: ReportSummaryCard( + color: AppColor.success, + icon: Icons.trending_up, + title: "Pendapatan Total", + value: state + .paymentMethodAnalytic + .summary + .totalAmount + .currencyFormatRpV2, + ), + ), + SpaceWidth(12), + Expanded( + child: ReportSummaryCard( + color: AppColor.info, + icon: Icons.shopping_cart_outlined, + title: 'Jumlah Pesanan', + value: state + .paymentMethodAnalytic + .summary + .totalOrders + .currencyFormatRpV2, + ), + ), + ], + ), + SpaceHeight(12), + Row( + children: [ + Expanded( + child: ReportSummaryCard( + color: AppColor.success, + icon: Icons.attach_money_outlined, + title: "Nilai Rata Rata", + value: state + .paymentMethodAnalytic + .summary + .averageOrderValue + .currencyFormatRpV2, + ), + ), + SpaceWidth(12), + Expanded( + child: ReportSummaryCard( + color: AppColor.info, + icon: Icons.wallet_outlined, + title: 'Jumlah Pembayaran', + value: state + .paymentMethodAnalytic + .summary + .totalPayments + .currencyFormatRpV2, + ), + ), + ], + ), + ], + ), + ); + } +}