feat: exclusive summary
Some checks failed
Build & Deploy iOS to TestFlight / build-and-deploy (push) Has been cancelled

This commit is contained in:
efrilm 2026-06-22 14:44:03 +07:00
parent 0b70194d8e
commit e236d811ce
26 changed files with 6510 additions and 161 deletions

View File

@ -0,0 +1,53 @@
import 'package:dartz/dartz.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:injectable/injectable.dart';
import '../../../domain/analytic/analytic.dart';
import '../../../domain/analytic/repositories/i_analytic_repository.dart';
part 'exclusive_summary_loader_event.dart';
part 'exclusive_summary_loader_state.dart';
part 'exclusive_summary_loader_bloc.freezed.dart';
@injectable
class ExclusiveSummaryLoaderBloc
extends Bloc<ExclusiveSummaryLoaderEvent, ExclusiveSummaryLoaderState> {
final IAnalyticRepository _repository;
ExclusiveSummaryLoaderBloc(this._repository)
: super(ExclusiveSummaryLoaderState.initial()) {
on<ExclusiveSummaryLoaderEvent>(_onEvent);
}
Future<void> _onEvent(
ExclusiveSummaryLoaderEvent event,
Emitter<ExclusiveSummaryLoaderState> emit,
) {
return event.map(
rangeDateChanged: (e) async {
emit(state.copyWith(dateFrom: e.dateFrom, dateTo: e.dateTo));
},
fetched: (e) async {
emit(
state.copyWith(
isFetching: true,
failureOption: none(),
),
);
final result = await _repository.getExclusiveSummary(
dateFrom: state.dateFrom,
dateTo: state.dateTo,
);
final data = result.fold(
(f) => state.copyWith(failureOption: optionOf(f)),
(summary) => state.copyWith(exclusiveSummary: summary),
);
emit(data.copyWith(isFetching: false));
},
);
}
}

View File

@ -0,0 +1,617 @@
// 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 'exclusive_summary_loader_bloc.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
T _$identity<T>(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 _$ExclusiveSummaryLoaderEvent {
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function(DateTime dateFrom, DateTime dateTo)
rangeDateChanged,
required TResult Function() fetched,
}) => throw _privateConstructorUsedError;
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function(DateTime dateFrom, DateTime dateTo)? rangeDateChanged,
TResult? Function()? fetched,
}) => throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function(DateTime dateFrom, DateTime dateTo)? rangeDateChanged,
TResult Function()? fetched,
required TResult orElse(),
}) => throw _privateConstructorUsedError;
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_RangeDateChanged value) rangeDateChanged,
required TResult Function(_Fetched value) fetched,
}) => throw _privateConstructorUsedError;
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_RangeDateChanged value)? rangeDateChanged,
TResult? Function(_Fetched value)? fetched,
}) => throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_RangeDateChanged value)? rangeDateChanged,
TResult Function(_Fetched value)? fetched,
required TResult orElse(),
}) => throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $ExclusiveSummaryLoaderEventCopyWith<$Res> {
factory $ExclusiveSummaryLoaderEventCopyWith(
ExclusiveSummaryLoaderEvent value,
$Res Function(ExclusiveSummaryLoaderEvent) then,
) =
_$ExclusiveSummaryLoaderEventCopyWithImpl<
$Res,
ExclusiveSummaryLoaderEvent
>;
}
/// @nodoc
class _$ExclusiveSummaryLoaderEventCopyWithImpl<
$Res,
$Val extends ExclusiveSummaryLoaderEvent
>
implements $ExclusiveSummaryLoaderEventCopyWith<$Res> {
_$ExclusiveSummaryLoaderEventCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of ExclusiveSummaryLoaderEvent
/// with the given fields replaced by the non-null parameter values.
}
/// @nodoc
abstract class _$$RangeDateChangedImplCopyWith<$Res> {
factory _$$RangeDateChangedImplCopyWith(
_$RangeDateChangedImpl value,
$Res Function(_$RangeDateChangedImpl) then,
) = __$$RangeDateChangedImplCopyWithImpl<$Res>;
@useResult
$Res call({DateTime dateFrom, DateTime dateTo});
}
/// @nodoc
class __$$RangeDateChangedImplCopyWithImpl<$Res>
extends
_$ExclusiveSummaryLoaderEventCopyWithImpl<$Res, _$RangeDateChangedImpl>
implements _$$RangeDateChangedImplCopyWith<$Res> {
__$$RangeDateChangedImplCopyWithImpl(
_$RangeDateChangedImpl _value,
$Res Function(_$RangeDateChangedImpl) _then,
) : super(_value, _then);
/// Create a copy of ExclusiveSummaryLoaderEvent
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({Object? dateFrom = null, Object? dateTo = null}) {
return _then(
_$RangeDateChangedImpl(
null == dateFrom
? _value.dateFrom
: dateFrom // ignore: cast_nullable_to_non_nullable
as DateTime,
null == dateTo
? _value.dateTo
: dateTo // ignore: cast_nullable_to_non_nullable
as DateTime,
),
);
}
}
/// @nodoc
class _$RangeDateChangedImpl implements _RangeDateChanged {
const _$RangeDateChangedImpl(this.dateFrom, this.dateTo);
@override
final DateTime dateFrom;
@override
final DateTime dateTo;
@override
String toString() {
return 'ExclusiveSummaryLoaderEvent.rangeDateChanged(dateFrom: $dateFrom, dateTo: $dateTo)';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$RangeDateChangedImpl &&
(identical(other.dateFrom, dateFrom) ||
other.dateFrom == dateFrom) &&
(identical(other.dateTo, dateTo) || other.dateTo == dateTo));
}
@override
int get hashCode => Object.hash(runtimeType, dateFrom, dateTo);
/// Create a copy of ExclusiveSummaryLoaderEvent
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$RangeDateChangedImplCopyWith<_$RangeDateChangedImpl> get copyWith =>
__$$RangeDateChangedImplCopyWithImpl<_$RangeDateChangedImpl>(
this,
_$identity,
);
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function(DateTime dateFrom, DateTime dateTo)
rangeDateChanged,
required TResult Function() fetched,
}) {
return rangeDateChanged(dateFrom, dateTo);
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function(DateTime dateFrom, DateTime dateTo)? rangeDateChanged,
TResult? Function()? fetched,
}) {
return rangeDateChanged?.call(dateFrom, dateTo);
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function(DateTime dateFrom, DateTime dateTo)? rangeDateChanged,
TResult Function()? fetched,
required TResult orElse(),
}) {
if (rangeDateChanged != null) {
return rangeDateChanged(dateFrom, dateTo);
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_RangeDateChanged value) rangeDateChanged,
required TResult Function(_Fetched value) fetched,
}) {
return rangeDateChanged(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_RangeDateChanged value)? rangeDateChanged,
TResult? Function(_Fetched value)? fetched,
}) {
return rangeDateChanged?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_RangeDateChanged value)? rangeDateChanged,
TResult Function(_Fetched value)? fetched,
required TResult orElse(),
}) {
if (rangeDateChanged != null) {
return rangeDateChanged(this);
}
return orElse();
}
}
abstract class _RangeDateChanged implements ExclusiveSummaryLoaderEvent {
const factory _RangeDateChanged(
final DateTime dateFrom,
final DateTime dateTo,
) = _$RangeDateChangedImpl;
DateTime get dateFrom;
DateTime get dateTo;
/// Create a copy of ExclusiveSummaryLoaderEvent
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
_$$RangeDateChangedImplCopyWith<_$RangeDateChangedImpl> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class _$$FetchedImplCopyWith<$Res> {
factory _$$FetchedImplCopyWith(
_$FetchedImpl value,
$Res Function(_$FetchedImpl) then,
) = __$$FetchedImplCopyWithImpl<$Res>;
}
/// @nodoc
class __$$FetchedImplCopyWithImpl<$Res>
extends _$ExclusiveSummaryLoaderEventCopyWithImpl<$Res, _$FetchedImpl>
implements _$$FetchedImplCopyWith<$Res> {
__$$FetchedImplCopyWithImpl(
_$FetchedImpl _value,
$Res Function(_$FetchedImpl) _then,
) : super(_value, _then);
/// Create a copy of ExclusiveSummaryLoaderEvent
/// with the given fields replaced by the non-null parameter values.
}
/// @nodoc
class _$FetchedImpl implements _Fetched {
const _$FetchedImpl();
@override
String toString() {
return 'ExclusiveSummaryLoaderEvent.fetched()';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType && other is _$FetchedImpl);
}
@override
int get hashCode => runtimeType.hashCode;
@override
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function(DateTime dateFrom, DateTime dateTo)
rangeDateChanged,
required TResult Function() fetched,
}) {
return fetched();
}
@override
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function(DateTime dateFrom, DateTime dateTo)? rangeDateChanged,
TResult? Function()? fetched,
}) {
return fetched?.call();
}
@override
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function(DateTime dateFrom, DateTime dateTo)? rangeDateChanged,
TResult Function()? fetched,
required TResult orElse(),
}) {
if (fetched != null) {
return fetched();
}
return orElse();
}
@override
@optionalTypeArgs
TResult map<TResult extends Object?>({
required TResult Function(_RangeDateChanged value) rangeDateChanged,
required TResult Function(_Fetched value) fetched,
}) {
return fetched(this);
}
@override
@optionalTypeArgs
TResult? mapOrNull<TResult extends Object?>({
TResult? Function(_RangeDateChanged value)? rangeDateChanged,
TResult? Function(_Fetched value)? fetched,
}) {
return fetched?.call(this);
}
@override
@optionalTypeArgs
TResult maybeMap<TResult extends Object?>({
TResult Function(_RangeDateChanged value)? rangeDateChanged,
TResult Function(_Fetched value)? fetched,
required TResult orElse(),
}) {
if (fetched != null) {
return fetched(this);
}
return orElse();
}
}
abstract class _Fetched implements ExclusiveSummaryLoaderEvent {
const factory _Fetched() = _$FetchedImpl;
}
/// @nodoc
mixin _$ExclusiveSummaryLoaderState {
ExclusiveSummary get exclusiveSummary => throw _privateConstructorUsedError;
Option<AnalyticFailure> get failureOption =>
throw _privateConstructorUsedError;
bool get isFetching => throw _privateConstructorUsedError;
DateTime get dateFrom => throw _privateConstructorUsedError;
DateTime get dateTo => throw _privateConstructorUsedError;
/// Create a copy of ExclusiveSummaryLoaderState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$ExclusiveSummaryLoaderStateCopyWith<ExclusiveSummaryLoaderState>
get copyWith => throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $ExclusiveSummaryLoaderStateCopyWith<$Res> {
factory $ExclusiveSummaryLoaderStateCopyWith(
ExclusiveSummaryLoaderState value,
$Res Function(ExclusiveSummaryLoaderState) then,
) =
_$ExclusiveSummaryLoaderStateCopyWithImpl<
$Res,
ExclusiveSummaryLoaderState
>;
@useResult
$Res call({
ExclusiveSummary exclusiveSummary,
Option<AnalyticFailure> failureOption,
bool isFetching,
DateTime dateFrom,
DateTime dateTo,
});
$ExclusiveSummaryCopyWith<$Res> get exclusiveSummary;
}
/// @nodoc
class _$ExclusiveSummaryLoaderStateCopyWithImpl<
$Res,
$Val extends ExclusiveSummaryLoaderState
>
implements $ExclusiveSummaryLoaderStateCopyWith<$Res> {
_$ExclusiveSummaryLoaderStateCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of ExclusiveSummaryLoaderState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? exclusiveSummary = null,
Object? failureOption = null,
Object? isFetching = null,
Object? dateFrom = null,
Object? dateTo = null,
}) {
return _then(
_value.copyWith(
exclusiveSummary: null == exclusiveSummary
? _value.exclusiveSummary
: exclusiveSummary // ignore: cast_nullable_to_non_nullable
as ExclusiveSummary,
failureOption: null == failureOption
? _value.failureOption
: failureOption // ignore: cast_nullable_to_non_nullable
as Option<AnalyticFailure>,
isFetching: null == isFetching
? _value.isFetching
: isFetching // ignore: cast_nullable_to_non_nullable
as bool,
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,
)
as $Val,
);
}
/// Create a copy of ExclusiveSummaryLoaderState
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$ExclusiveSummaryCopyWith<$Res> get exclusiveSummary {
return $ExclusiveSummaryCopyWith<$Res>(_value.exclusiveSummary, (value) {
return _then(_value.copyWith(exclusiveSummary: value) as $Val);
});
}
}
/// @nodoc
abstract class _$$ExclusiveSummaryLoaderStateImplCopyWith<$Res>
implements $ExclusiveSummaryLoaderStateCopyWith<$Res> {
factory _$$ExclusiveSummaryLoaderStateImplCopyWith(
_$ExclusiveSummaryLoaderStateImpl value,
$Res Function(_$ExclusiveSummaryLoaderStateImpl) then,
) = __$$ExclusiveSummaryLoaderStateImplCopyWithImpl<$Res>;
@override
@useResult
$Res call({
ExclusiveSummary exclusiveSummary,
Option<AnalyticFailure> failureOption,
bool isFetching,
DateTime dateFrom,
DateTime dateTo,
});
@override
$ExclusiveSummaryCopyWith<$Res> get exclusiveSummary;
}
/// @nodoc
class __$$ExclusiveSummaryLoaderStateImplCopyWithImpl<$Res>
extends
_$ExclusiveSummaryLoaderStateCopyWithImpl<
$Res,
_$ExclusiveSummaryLoaderStateImpl
>
implements _$$ExclusiveSummaryLoaderStateImplCopyWith<$Res> {
__$$ExclusiveSummaryLoaderStateImplCopyWithImpl(
_$ExclusiveSummaryLoaderStateImpl _value,
$Res Function(_$ExclusiveSummaryLoaderStateImpl) _then,
) : super(_value, _then);
/// Create a copy of ExclusiveSummaryLoaderState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? exclusiveSummary = null,
Object? failureOption = null,
Object? isFetching = null,
Object? dateFrom = null,
Object? dateTo = null,
}) {
return _then(
_$ExclusiveSummaryLoaderStateImpl(
exclusiveSummary: null == exclusiveSummary
? _value.exclusiveSummary
: exclusiveSummary // ignore: cast_nullable_to_non_nullable
as ExclusiveSummary,
failureOption: null == failureOption
? _value.failureOption
: failureOption // ignore: cast_nullable_to_non_nullable
as Option<AnalyticFailure>,
isFetching: null == isFetching
? _value.isFetching
: isFetching // ignore: cast_nullable_to_non_nullable
as bool,
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,
),
);
}
}
/// @nodoc
class _$ExclusiveSummaryLoaderStateImpl
implements _ExclusiveSummaryLoaderState {
const _$ExclusiveSummaryLoaderStateImpl({
required this.exclusiveSummary,
required this.failureOption,
this.isFetching = false,
required this.dateFrom,
required this.dateTo,
});
@override
final ExclusiveSummary exclusiveSummary;
@override
final Option<AnalyticFailure> failureOption;
@override
@JsonKey()
final bool isFetching;
@override
final DateTime dateFrom;
@override
final DateTime dateTo;
@override
String toString() {
return 'ExclusiveSummaryLoaderState(exclusiveSummary: $exclusiveSummary, failureOption: $failureOption, isFetching: $isFetching, dateFrom: $dateFrom, dateTo: $dateTo)';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$ExclusiveSummaryLoaderStateImpl &&
(identical(other.exclusiveSummary, exclusiveSummary) ||
other.exclusiveSummary == exclusiveSummary) &&
(identical(other.failureOption, failureOption) ||
other.failureOption == failureOption) &&
(identical(other.isFetching, isFetching) ||
other.isFetching == isFetching) &&
(identical(other.dateFrom, dateFrom) ||
other.dateFrom == dateFrom) &&
(identical(other.dateTo, dateTo) || other.dateTo == dateTo));
}
@override
int get hashCode => Object.hash(
runtimeType,
exclusiveSummary,
failureOption,
isFetching,
dateFrom,
dateTo,
);
/// Create a copy of ExclusiveSummaryLoaderState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$ExclusiveSummaryLoaderStateImplCopyWith<_$ExclusiveSummaryLoaderStateImpl>
get copyWith =>
__$$ExclusiveSummaryLoaderStateImplCopyWithImpl<
_$ExclusiveSummaryLoaderStateImpl
>(this, _$identity);
}
abstract class _ExclusiveSummaryLoaderState
implements ExclusiveSummaryLoaderState {
const factory _ExclusiveSummaryLoaderState({
required final ExclusiveSummary exclusiveSummary,
required final Option<AnalyticFailure> failureOption,
final bool isFetching,
required final DateTime dateFrom,
required final DateTime dateTo,
}) = _$ExclusiveSummaryLoaderStateImpl;
@override
ExclusiveSummary get exclusiveSummary;
@override
Option<AnalyticFailure> get failureOption;
@override
bool get isFetching;
@override
DateTime get dateFrom;
@override
DateTime get dateTo;
/// Create a copy of ExclusiveSummaryLoaderState
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
_$$ExclusiveSummaryLoaderStateImplCopyWith<_$ExclusiveSummaryLoaderStateImpl>
get copyWith => throw _privateConstructorUsedError;
}

View File

@ -0,0 +1,11 @@
part of 'exclusive_summary_loader_bloc.dart';
@freezed
class ExclusiveSummaryLoaderEvent with _$ExclusiveSummaryLoaderEvent {
const factory ExclusiveSummaryLoaderEvent.rangeDateChanged(
DateTime dateFrom,
DateTime dateTo,
) = _RangeDateChanged;
const factory ExclusiveSummaryLoaderEvent.fetched() = _Fetched;
}

View File

@ -0,0 +1,22 @@
part of 'exclusive_summary_loader_bloc.dart';
@freezed
class ExclusiveSummaryLoaderState with _$ExclusiveSummaryLoaderState {
const factory ExclusiveSummaryLoaderState({
required ExclusiveSummary exclusiveSummary,
required Option<AnalyticFailure> failureOption,
@Default(false) bool isFetching,
required DateTime dateFrom,
required DateTime dateTo,
}) = _ExclusiveSummaryLoaderState;
factory ExclusiveSummaryLoaderState.initial() {
final now = DateTime.now();
return ExclusiveSummaryLoaderState(
exclusiveSummary: ExclusiveSummary.empty(),
failureOption: none(),
dateFrom: DateTime(now.year, now.month, 1),
dateTo: DateTime(now.year, now.month + 1, 0),
);
}
}

View File

@ -12,6 +12,8 @@ class ApiPath {
static const String paymentMethodAnalytic =
'/api/v1/analytics/paymentMethods';
static const String purchasingAnalytic = '/api/v1/analytics/purchasing';
static const String exclusiveSummaryAnalytic =
'/api/v1/analytics/exclusive-summary/period';
// Inventory
static const String inventoryReportDetail =

View File

@ -12,4 +12,5 @@ part 'entities/dashboard_analytic_entity.dart';
part 'entities/product_analytic_entity.dart';
part 'entities/payment_method_analytic_entity.dart';
part 'entities/purchasing_analytic_entity.dart';
part 'entities/exclusive_summary_entity.dart';
part 'failures/analytic_failure.dart';

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,119 @@
part of '../analytic.dart';
@freezed
class ExclusiveSummary with _$ExclusiveSummary {
const factory ExclusiveSummary({
required String organizationId,
required String outletId,
required ExclusiveSummaryPeriod period,
required ExclusiveSummarySummary summary,
required ExclusiveSummaryReimburse reimburse,
required List<ExclusiveSummaryBreakdown> hppBreakdown,
required List<ExclusiveSummaryBreakdown> operationalExpenseBreakdown,
required List<ExclusiveSummaryDaily> dailySummary,
required List<ExclusiveSummaryTransaction> dailyTransactions,
}) = _ExclusiveSummary;
factory ExclusiveSummary.empty() => ExclusiveSummary(
organizationId: '',
outletId: '',
period: ExclusiveSummaryPeriod.empty(),
summary: ExclusiveSummarySummary.empty(),
reimburse: ExclusiveSummaryReimburse.empty(),
hppBreakdown: [],
operationalExpenseBreakdown: [],
dailySummary: [],
dailyTransactions: [],
);
}
@freezed
class ExclusiveSummaryPeriod with _$ExclusiveSummaryPeriod {
const factory ExclusiveSummaryPeriod({
required DateTime dateFrom,
required DateTime dateTo,
}) = _ExclusiveSummaryPeriod;
factory ExclusiveSummaryPeriod.empty() => ExclusiveSummaryPeriod(
dateFrom: DateTime.fromMillisecondsSinceEpoch(0),
dateTo: DateTime.fromMillisecondsSinceEpoch(0),
);
}
@freezed
class ExclusiveSummarySummary with _$ExclusiveSummarySummary {
const factory ExclusiveSummarySummary({
required int sales,
required int hpp,
required int grossProfit,
required int salaryTotal,
required int salaryDw,
required int salaryStaff,
required int salaryOther,
required int otherOperationalExpenses,
required int operationalExpensesTotal,
required int totalCost,
required int netProfit,
}) = _ExclusiveSummarySummary;
factory ExclusiveSummarySummary.empty() => const ExclusiveSummarySummary(
sales: 0,
hpp: 0,
grossProfit: 0,
salaryTotal: 0,
salaryDw: 0,
salaryStaff: 0,
salaryOther: 0,
otherOperationalExpenses: 0,
operationalExpensesTotal: 0,
totalCost: 0,
netProfit: 0,
);
}
@freezed
class ExclusiveSummaryReimburse with _$ExclusiveSummaryReimburse {
const factory ExclusiveSummaryReimburse({
required int totalCost,
required int excludedSalaryStaff,
required int totalReimburse,
}) = _ExclusiveSummaryReimburse;
factory ExclusiveSummaryReimburse.empty() =>
const ExclusiveSummaryReimburse(
totalCost: 0,
excludedSalaryStaff: 0,
totalReimburse: 0,
);
}
@freezed
class ExclusiveSummaryBreakdown with _$ExclusiveSummaryBreakdown {
const factory ExclusiveSummaryBreakdown({
required String categoryCode,
required String categoryName,
required int amount,
required double percentage,
}) = _ExclusiveSummaryBreakdown;
}
@freezed
class ExclusiveSummaryDaily with _$ExclusiveSummaryDaily {
const factory ExclusiveSummaryDaily({
required DateTime date,
required int transactionCount,
required int totalCost,
}) = _ExclusiveSummaryDaily;
}
@freezed
class ExclusiveSummaryTransaction with _$ExclusiveSummaryTransaction {
const factory ExclusiveSummaryTransaction({
required DateTime date,
required String categoryCode,
required String categoryName,
required String description,
required int amount,
required String source,
}) = _ExclusiveSummaryTransaction;
}

View File

@ -51,4 +51,10 @@ abstract class IAnalyticRepository {
String? outletId,
String groupBy = 'day',
});
Future<Either<AnalyticFailure, ExclusiveSummary>> getExclusiveSummary({
required DateTime dateFrom,
required DateTime dateTo,
String? outletId,
});
}

View File

@ -13,3 +13,4 @@ part 'dto/dashboard_analytic_dto.dart';
part 'dto/product_analytic_dto.dart';
part 'dto/payment_method_analytic_dto.dart';
part 'dto/purchasing_analytic_dto.dart';
part 'dto/exclusive_summary_dto.dart';

File diff suppressed because it is too large Load Diff

View File

@ -789,3 +789,185 @@ Map<String, dynamic> _$$PurchasingVendorDataDtoImplToJson(
'ingredient_count': instance.ingredientCount,
'quantity': instance.quantity,
};
_$ExclusiveSummaryDtoImpl _$$ExclusiveSummaryDtoImplFromJson(
Map<String, dynamic> json,
) => _$ExclusiveSummaryDtoImpl(
organizationId: json['organization_id'] as String?,
outletId: json['outlet_id'] as String?,
period: json['period'] == null
? null
: ExclusiveSummaryPeriodDto.fromJson(
json['period'] as Map<String, dynamic>,
),
summary: json['summary'] == null
? null
: ExclusiveSummarySummaryDto.fromJson(
json['summary'] as Map<String, dynamic>,
),
reimburse: json['reimburse'] == null
? null
: ExclusiveSummaryReimburseDto.fromJson(
json['reimburse'] as Map<String, dynamic>,
),
hppBreakdown: (json['hpp_breakdown'] as List<dynamic>?)
?.map(
(e) => ExclusiveSummaryBreakdownDto.fromJson(e as Map<String, dynamic>),
)
.toList(),
operationalExpenseBreakdown:
(json['operational_expense_breakdown'] as List<dynamic>?)
?.map(
(e) => ExclusiveSummaryBreakdownDto.fromJson(
e as Map<String, dynamic>,
),
)
.toList(),
dailySummary: (json['daily_summary'] as List<dynamic>?)
?.map((e) => ExclusiveSummaryDailyDto.fromJson(e as Map<String, dynamic>))
.toList(),
dailyTransactions: (json['daily_transactions'] as List<dynamic>?)
?.map(
(e) =>
ExclusiveSummaryTransactionDto.fromJson(e as Map<String, dynamic>),
)
.toList(),
);
Map<String, dynamic> _$$ExclusiveSummaryDtoImplToJson(
_$ExclusiveSummaryDtoImpl instance,
) => <String, dynamic>{
'organization_id': instance.organizationId,
'outlet_id': instance.outletId,
'period': instance.period,
'summary': instance.summary,
'reimburse': instance.reimburse,
'hpp_breakdown': instance.hppBreakdown,
'operational_expense_breakdown': instance.operationalExpenseBreakdown,
'daily_summary': instance.dailySummary,
'daily_transactions': instance.dailyTransactions,
};
_$ExclusiveSummaryPeriodDtoImpl _$$ExclusiveSummaryPeriodDtoImplFromJson(
Map<String, dynamic> json,
) => _$ExclusiveSummaryPeriodDtoImpl(
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),
);
Map<String, dynamic> _$$ExclusiveSummaryPeriodDtoImplToJson(
_$ExclusiveSummaryPeriodDtoImpl instance,
) => <String, dynamic>{
'date_from': instance.dateFrom?.toIso8601String(),
'date_to': instance.dateTo?.toIso8601String(),
};
_$ExclusiveSummarySummaryDtoImpl _$$ExclusiveSummarySummaryDtoImplFromJson(
Map<String, dynamic> json,
) => _$ExclusiveSummarySummaryDtoImpl(
sales: json['sales'] as num?,
hpp: json['hpp'] as num?,
grossProfit: json['gross_profit'] as num?,
salaryTotal: json['salary_total'] as num?,
salaryDw: json['salary_dw'] as num?,
salaryStaff: json['salary_staff'] as num?,
salaryOther: json['salary_other'] as num?,
otherOperationalExpenses: json['other_operational_expenses'] as num?,
operationalExpensesTotal: json['operational_expenses_total'] as num?,
totalCost: json['total_cost'] as num?,
netProfit: json['net_profit'] as num?,
);
Map<String, dynamic> _$$ExclusiveSummarySummaryDtoImplToJson(
_$ExclusiveSummarySummaryDtoImpl instance,
) => <String, dynamic>{
'sales': instance.sales,
'hpp': instance.hpp,
'gross_profit': instance.grossProfit,
'salary_total': instance.salaryTotal,
'salary_dw': instance.salaryDw,
'salary_staff': instance.salaryStaff,
'salary_other': instance.salaryOther,
'other_operational_expenses': instance.otherOperationalExpenses,
'operational_expenses_total': instance.operationalExpensesTotal,
'total_cost': instance.totalCost,
'net_profit': instance.netProfit,
};
_$ExclusiveSummaryReimburseDtoImpl _$$ExclusiveSummaryReimburseDtoImplFromJson(
Map<String, dynamic> json,
) => _$ExclusiveSummaryReimburseDtoImpl(
totalCost: json['total_cost'] as num?,
excludedSalaryStaff: json['excluded_salary_staff'] as num?,
totalReimburse: json['total_reimburse'] as num?,
);
Map<String, dynamic> _$$ExclusiveSummaryReimburseDtoImplToJson(
_$ExclusiveSummaryReimburseDtoImpl instance,
) => <String, dynamic>{
'total_cost': instance.totalCost,
'excluded_salary_staff': instance.excludedSalaryStaff,
'total_reimburse': instance.totalReimburse,
};
_$ExclusiveSummaryBreakdownDtoImpl _$$ExclusiveSummaryBreakdownDtoImplFromJson(
Map<String, dynamic> json,
) => _$ExclusiveSummaryBreakdownDtoImpl(
categoryCode: json['category_code'] as String?,
categoryName: json['category_name'] as String?,
amount: json['amount'] as num?,
percentage: json['percentage'] as num?,
);
Map<String, dynamic> _$$ExclusiveSummaryBreakdownDtoImplToJson(
_$ExclusiveSummaryBreakdownDtoImpl instance,
) => <String, dynamic>{
'category_code': instance.categoryCode,
'category_name': instance.categoryName,
'amount': instance.amount,
'percentage': instance.percentage,
};
_$ExclusiveSummaryDailyDtoImpl _$$ExclusiveSummaryDailyDtoImplFromJson(
Map<String, dynamic> json,
) => _$ExclusiveSummaryDailyDtoImpl(
date: json['date'] == null ? null : DateTime.parse(json['date'] as String),
transactionCount: json['transaction_count'] as num?,
totalCost: json['total_cost'] as num?,
);
Map<String, dynamic> _$$ExclusiveSummaryDailyDtoImplToJson(
_$ExclusiveSummaryDailyDtoImpl instance,
) => <String, dynamic>{
'date': instance.date?.toIso8601String(),
'transaction_count': instance.transactionCount,
'total_cost': instance.totalCost,
};
_$ExclusiveSummaryTransactionDtoImpl
_$$ExclusiveSummaryTransactionDtoImplFromJson(Map<String, dynamic> json) =>
_$ExclusiveSummaryTransactionDtoImpl(
date: json['date'] == null
? null
: DateTime.parse(json['date'] as String),
categoryCode: json['category_code'] as String?,
categoryName: json['category_name'] as String?,
description: json['description'] as String?,
amount: json['amount'] as num?,
source: json['source'] as String?,
);
Map<String, dynamic> _$$ExclusiveSummaryTransactionDtoImplToJson(
_$ExclusiveSummaryTransactionDtoImpl instance,
) => <String, dynamic>{
'date': instance.date?.toIso8601String(),
'category_code': instance.categoryCode,
'category_name': instance.categoryName,
'description': instance.description,
'amount': instance.amount,
'source': instance.source,
};

View File

@ -264,4 +264,35 @@ class AnalyticRemoteDataProvider {
return DC.error(AnalyticFailure.serverError(e));
}
}
Future<DC<AnalyticFailure, ExclusiveSummaryDto>> fetchExclusiveSummary({
required DateTime dateFrom,
required DateTime dateTo,
String? outletId,
}) async {
try {
final Map<String, dynamic> params = {
'date_from': dateFrom.toServerDate,
'date_to': dateTo.toServerDate,
};
if (outletId != null) params['outlet_id'] = outletId;
final response = await _apiClient.get(
ApiPath.exclusiveSummaryAnalytic,
params: params,
headers: getAuthorizationHeader(),
);
if (response.data['data'] == null) {
return DC.error(AnalyticFailure.empty());
}
final dto = ExclusiveSummaryDto.fromJson(response.data['data']);
return DC.data(dto);
} on ApiFailure catch (e, s) {
log('fetchExclusiveSummaryError', name: _logName, error: e, stackTrace: s);
return DC.error(AnalyticFailure.serverError(e));
}
}
}

View File

@ -0,0 +1,181 @@
part of '../analytic_dtos.dart';
@freezed
class ExclusiveSummaryDto with _$ExclusiveSummaryDto {
const ExclusiveSummaryDto._();
const factory ExclusiveSummaryDto({
@JsonKey(name: 'organization_id') String? organizationId,
@JsonKey(name: 'outlet_id') String? outletId,
@JsonKey(name: 'period') ExclusiveSummaryPeriodDto? period,
@JsonKey(name: 'summary') ExclusiveSummarySummaryDto? summary,
@JsonKey(name: 'reimburse') ExclusiveSummaryReimburseDto? reimburse,
@JsonKey(name: 'hpp_breakdown')
List<ExclusiveSummaryBreakdownDto>? hppBreakdown,
@JsonKey(name: 'operational_expense_breakdown')
List<ExclusiveSummaryBreakdownDto>? operationalExpenseBreakdown,
@JsonKey(name: 'daily_summary')
List<ExclusiveSummaryDailyDto>? dailySummary,
@JsonKey(name: 'daily_transactions')
List<ExclusiveSummaryTransactionDto>? dailyTransactions,
}) = _ExclusiveSummaryDto;
factory ExclusiveSummaryDto.fromJson(Map<String, dynamic> json) =>
_$ExclusiveSummaryDtoFromJson(json);
ExclusiveSummary toDomain() => ExclusiveSummary(
organizationId: organizationId ?? '',
outletId: outletId ?? '',
period: period?.toDomain() ?? ExclusiveSummaryPeriod.empty(),
summary: summary?.toDomain() ?? ExclusiveSummarySummary.empty(),
reimburse: reimburse?.toDomain() ?? ExclusiveSummaryReimburse.empty(),
hppBreakdown: hppBreakdown?.map((e) => e.toDomain()).toList() ?? [],
operationalExpenseBreakdown:
operationalExpenseBreakdown?.map((e) => e.toDomain()).toList() ?? [],
dailySummary: dailySummary?.map((e) => e.toDomain()).toList() ?? [],
dailyTransactions:
dailyTransactions?.map((e) => e.toDomain()).toList() ?? [],
);
}
@freezed
class ExclusiveSummaryPeriodDto with _$ExclusiveSummaryPeriodDto {
const ExclusiveSummaryPeriodDto._();
const factory ExclusiveSummaryPeriodDto({
@JsonKey(name: 'date_from') DateTime? dateFrom,
@JsonKey(name: 'date_to') DateTime? dateTo,
}) = _ExclusiveSummaryPeriodDto;
factory ExclusiveSummaryPeriodDto.fromJson(Map<String, dynamic> json) =>
_$ExclusiveSummaryPeriodDtoFromJson(json);
ExclusiveSummaryPeriod toDomain() => ExclusiveSummaryPeriod(
dateFrom: dateFrom ?? DateTime.fromMillisecondsSinceEpoch(0),
dateTo: dateTo ?? DateTime.fromMillisecondsSinceEpoch(0),
);
}
@freezed
class ExclusiveSummarySummaryDto with _$ExclusiveSummarySummaryDto {
const ExclusiveSummarySummaryDto._();
const factory ExclusiveSummarySummaryDto({
@JsonKey(name: 'sales') num? sales,
@JsonKey(name: 'hpp') num? hpp,
@JsonKey(name: 'gross_profit') num? grossProfit,
@JsonKey(name: 'salary_total') num? salaryTotal,
@JsonKey(name: 'salary_dw') num? salaryDw,
@JsonKey(name: 'salary_staff') num? salaryStaff,
@JsonKey(name: 'salary_other') num? salaryOther,
@JsonKey(name: 'other_operational_expenses') num? otherOperationalExpenses,
@JsonKey(name: 'operational_expenses_total') num? operationalExpensesTotal,
@JsonKey(name: 'total_cost') num? totalCost,
@JsonKey(name: 'net_profit') num? netProfit,
}) = _ExclusiveSummarySummaryDto;
factory ExclusiveSummarySummaryDto.fromJson(Map<String, dynamic> json) =>
_$ExclusiveSummarySummaryDtoFromJson(json);
ExclusiveSummarySummary toDomain() => ExclusiveSummarySummary(
sales: sales?.toInt() ?? 0,
hpp: hpp?.toInt() ?? 0,
grossProfit: grossProfit?.toInt() ?? 0,
salaryTotal: salaryTotal?.toInt() ?? 0,
salaryDw: salaryDw?.toInt() ?? 0,
salaryStaff: salaryStaff?.toInt() ?? 0,
salaryOther: salaryOther?.toInt() ?? 0,
otherOperationalExpenses: otherOperationalExpenses?.toInt() ?? 0,
operationalExpensesTotal: operationalExpensesTotal?.toInt() ?? 0,
totalCost: totalCost?.toInt() ?? 0,
netProfit: netProfit?.toInt() ?? 0,
);
}
@freezed
class ExclusiveSummaryReimburseDto with _$ExclusiveSummaryReimburseDto {
const ExclusiveSummaryReimburseDto._();
const factory ExclusiveSummaryReimburseDto({
@JsonKey(name: 'total_cost') num? totalCost,
@JsonKey(name: 'excluded_salary_staff') num? excludedSalaryStaff,
@JsonKey(name: 'total_reimburse') num? totalReimburse,
}) = _ExclusiveSummaryReimburseDto;
factory ExclusiveSummaryReimburseDto.fromJson(Map<String, dynamic> json) =>
_$ExclusiveSummaryReimburseDtoFromJson(json);
ExclusiveSummaryReimburse toDomain() => ExclusiveSummaryReimburse(
totalCost: totalCost?.toInt() ?? 0,
excludedSalaryStaff: excludedSalaryStaff?.toInt() ?? 0,
totalReimburse: totalReimburse?.toInt() ?? 0,
);
}
@freezed
class ExclusiveSummaryBreakdownDto with _$ExclusiveSummaryBreakdownDto {
const ExclusiveSummaryBreakdownDto._();
const factory ExclusiveSummaryBreakdownDto({
@JsonKey(name: 'category_code') String? categoryCode,
@JsonKey(name: 'category_name') String? categoryName,
@JsonKey(name: 'amount') num? amount,
@JsonKey(name: 'percentage') num? percentage,
}) = _ExclusiveSummaryBreakdownDto;
factory ExclusiveSummaryBreakdownDto.fromJson(Map<String, dynamic> json) =>
_$ExclusiveSummaryBreakdownDtoFromJson(json);
ExclusiveSummaryBreakdown toDomain() => ExclusiveSummaryBreakdown(
categoryCode: categoryCode ?? '',
categoryName: categoryName ?? '',
amount: amount?.toInt() ?? 0,
percentage: percentage?.toDouble() ?? 0,
);
}
@freezed
class ExclusiveSummaryDailyDto with _$ExclusiveSummaryDailyDto {
const ExclusiveSummaryDailyDto._();
const factory ExclusiveSummaryDailyDto({
@JsonKey(name: 'date') DateTime? date,
@JsonKey(name: 'transaction_count') num? transactionCount,
@JsonKey(name: 'total_cost') num? totalCost,
}) = _ExclusiveSummaryDailyDto;
factory ExclusiveSummaryDailyDto.fromJson(Map<String, dynamic> json) =>
_$ExclusiveSummaryDailyDtoFromJson(json);
ExclusiveSummaryDaily toDomain() => ExclusiveSummaryDaily(
date: date ?? DateTime.fromMillisecondsSinceEpoch(0),
transactionCount: transactionCount?.toInt() ?? 0,
totalCost: totalCost?.toInt() ?? 0,
);
}
@freezed
class ExclusiveSummaryTransactionDto with _$ExclusiveSummaryTransactionDto {
const ExclusiveSummaryTransactionDto._();
const factory ExclusiveSummaryTransactionDto({
@JsonKey(name: 'date') DateTime? date,
@JsonKey(name: 'category_code') String? categoryCode,
@JsonKey(name: 'category_name') String? categoryName,
@JsonKey(name: 'description') String? description,
@JsonKey(name: 'amount') num? amount,
@JsonKey(name: 'source') String? source,
}) = _ExclusiveSummaryTransactionDto;
factory ExclusiveSummaryTransactionDto.fromJson(Map<String, dynamic> json) =>
_$ExclusiveSummaryTransactionDtoFromJson(json);
ExclusiveSummaryTransaction toDomain() => ExclusiveSummaryTransaction(
date: date ?? DateTime.fromMillisecondsSinceEpoch(0),
categoryCode: categoryCode ?? '',
categoryName: categoryName ?? '',
description: description ?? '',
amount: amount?.toInt() ?? 0,
source: source ?? '',
);
}

View File

@ -199,4 +199,25 @@ class AnalyticRepository implements IAnalyticRepository {
return left(const AnalyticFailure.unexpectedError());
}
}
@override
Future<Either<AnalyticFailure, ExclusiveSummary>> getExclusiveSummary({
required DateTime dateFrom,
required DateTime dateTo,
String? outletId,
}) async {
try {
final result = await _dataProvider.fetchExclusiveSummary(
dateFrom: dateFrom,
dateTo: dateTo,
outletId: _resolveOutletId(outletId),
);
if (result.hasError) return left(result.error!);
return right(result.data!.toDomain());
} catch (e, s) {
log('getExclusiveSummaryError', name: _logName, error: e, stackTrace: s);
return left(const AnalyticFailure.unexpectedError());
}
}
}

View File

@ -13,6 +13,8 @@ import 'package:apskel_owner_flutter/application/analytic/category_analytic_load
as _i1038;
import 'package:apskel_owner_flutter/application/analytic/dashboard_analytic_loader/dashboard_analytic_loader_bloc.dart'
as _i516;
import 'package:apskel_owner_flutter/application/analytic/exclusive_summary_loader/exclusive_summary_loader_bloc.dart'
as _i702;
import 'package:apskel_owner_flutter/application/analytic/inventory_analytic_loader/inventory_analytic_loader_bloc.dart'
as _i785;
import 'package:apskel_owner_flutter/application/analytic/payment_method_analytic_loader/payment_method_analytic_loader_bloc.dart'
@ -285,6 +287,9 @@ extension GetItInjectableX on _i174.GetIt {
gh.factory<_i516.DashboardAnalyticLoaderBloc>(
() => _i516.DashboardAnalyticLoaderBloc(gh<_i477.IAnalyticRepository>()),
);
gh.factory<_i702.ExclusiveSummaryLoaderBloc>(
() => _i702.ExclusiveSummaryLoaderBloc(gh<_i477.IAnalyticRepository>()),
);
gh.factory<_i945.AuthBloc>(
() => _i945.AuthBloc(gh<_i49.IAuthRepository>()),
);

View File

@ -431,5 +431,29 @@
"device": "Device",
"@device": {},
"profit_loss": "Laba Rugi",
"@profit_loss": {}
"@profit_loss": {},
"exclusive_summary": "Exclusive Summary",
"@exclusive_summary": {},
"hpp_breakdown": "HPP Breakdown",
"@hpp_breakdown": {},
"operational_expense_breakdown": "Operational Expense Breakdown",
"@operational_expense_breakdown": {},
"daily_summary": "Daily Summary",
"@daily_summary": {},
"daily_transactions": "Daily Transactions",
"@daily_transactions": {},
"reimburse_summary": "Reimburse Summary",
"@reimburse_summary": {},
"total_reimburse": "Total Reimburse",
"@total_reimburse": {},
"excluded_salary_staff": "Excluded Salary Staff",
"@excluded_salary_staff": {},
"hpp": "HPP",
"@hpp": {},
"salary_total": "Total Salary",
"@salary_total": {},
"operational_expenses": "Operational Expenses",
"@operational_expenses": {},
"total_cost": "Total Cost",
"@total_cost": {}
}

View File

@ -431,5 +431,29 @@
"device": "Perangkat",
"@device": {},
"profit_loss": "Laba Rugi",
"@profit_loss": {}
"@profit_loss": {},
"exclusive_summary": "Ringkasan Eksklusif",
"@exclusive_summary": {},
"hpp_breakdown": "Rincian HPP",
"@hpp_breakdown": {},
"operational_expense_breakdown": "Rincian Biaya Operasional",
"@operational_expense_breakdown": {},
"daily_summary": "Ringkasan Harian",
"@daily_summary": {},
"daily_transactions": "Transaksi Harian",
"@daily_transactions": {},
"reimburse_summary": "Ringkasan Reimburse",
"@reimburse_summary": {},
"total_reimburse": "Total Reimburse",
"@total_reimburse": {},
"excluded_salary_staff": "Gaji Staf (Dikecualikan)",
"@excluded_salary_staff": {},
"hpp": "HPP",
"@hpp": {},
"salary_total": "Total Gaji",
"@salary_total": {},
"operational_expenses": "Biaya Operasional",
"@operational_expenses": {},
"total_cost": "Total Biaya",
"@total_cost": {}
}

View File

@ -1306,6 +1306,78 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'Laba Rugi'**
String get profit_loss;
/// No description provided for @exclusive_summary.
///
/// In en, this message translates to:
/// **'Exclusive Summary'**
String get exclusive_summary;
/// No description provided for @hpp_breakdown.
///
/// In en, this message translates to:
/// **'HPP Breakdown'**
String get hpp_breakdown;
/// No description provided for @operational_expense_breakdown.
///
/// In en, this message translates to:
/// **'Operational Expense Breakdown'**
String get operational_expense_breakdown;
/// No description provided for @daily_summary.
///
/// In en, this message translates to:
/// **'Daily Summary'**
String get daily_summary;
/// No description provided for @daily_transactions.
///
/// In en, this message translates to:
/// **'Daily Transactions'**
String get daily_transactions;
/// No description provided for @reimburse_summary.
///
/// In en, this message translates to:
/// **'Reimburse Summary'**
String get reimburse_summary;
/// No description provided for @total_reimburse.
///
/// In en, this message translates to:
/// **'Total Reimburse'**
String get total_reimburse;
/// No description provided for @excluded_salary_staff.
///
/// In en, this message translates to:
/// **'Excluded Salary Staff'**
String get excluded_salary_staff;
/// No description provided for @hpp.
///
/// In en, this message translates to:
/// **'HPP'**
String get hpp;
/// No description provided for @salary_total.
///
/// In en, this message translates to:
/// **'Total Salary'**
String get salary_total;
/// No description provided for @operational_expenses.
///
/// In en, this message translates to:
/// **'Operational Expenses'**
String get operational_expenses;
/// No description provided for @total_cost.
///
/// In en, this message translates to:
/// **'Total Cost'**
String get total_cost;
}
class _AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> {

View File

@ -621,4 +621,40 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get profit_loss => 'Laba Rugi';
@override
String get exclusive_summary => 'Exclusive Summary';
@override
String get hpp_breakdown => 'HPP Breakdown';
@override
String get operational_expense_breakdown => 'Operational Expense Breakdown';
@override
String get daily_summary => 'Daily Summary';
@override
String get daily_transactions => 'Daily Transactions';
@override
String get reimburse_summary => 'Reimburse Summary';
@override
String get total_reimburse => 'Total Reimburse';
@override
String get excluded_salary_staff => 'Excluded Salary Staff';
@override
String get hpp => 'HPP';
@override
String get salary_total => 'Total Salary';
@override
String get operational_expenses => 'Operational Expenses';
@override
String get total_cost => 'Total Cost';
}

View File

@ -621,4 +621,40 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get profit_loss => 'Laba Rugi';
@override
String get exclusive_summary => 'Ringkasan Eksklusif';
@override
String get hpp_breakdown => 'Rincian HPP';
@override
String get operational_expense_breakdown => 'Rincian Biaya Operasional';
@override
String get daily_summary => 'Ringkasan Harian';
@override
String get daily_transactions => 'Transaksi Harian';
@override
String get reimburse_summary => 'Ringkasan Reimburse';
@override
String get total_reimburse => 'Total Reimburse';
@override
String get excluded_salary_staff => 'Gaji Staf (Dikecualikan)';
@override
String get hpp => 'HPP';
@override
String get salary_total => 'Total Gaji';
@override
String get operational_expenses => 'Biaya Operasional';
@override
String get total_cost => 'Total Biaya';
}

View File

@ -0,0 +1,890 @@
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:line_icons/line_icons.dart';
import 'package:shimmer/shimmer.dart';
import '../../../application/analytic/exclusive_summary_loader/exclusive_summary_loader_bloc.dart';
import '../../../common/extension/extension.dart';
import '../../../common/theme/theme.dart';
import '../../../domain/analytic/analytic.dart';
import '../../../injection.dart';
import '../../components/appbar/appbar.dart';
import '../../components/field/date_range_picker_field.dart';
import '../../components/spacer/spacer.dart';
@RoutePage()
class ExclusiveSummaryPage extends StatefulWidget
implements AutoRouteWrapper {
const ExclusiveSummaryPage({super.key});
@override
State<ExclusiveSummaryPage> createState() => _ExclusiveSummaryPageState();
@override
Widget wrappedRoute(BuildContext context) => BlocProvider(
create: (context) => getIt<ExclusiveSummaryLoaderBloc>()
..add(ExclusiveSummaryLoaderEvent.fetched()),
child: this,
);
}
class _ExclusiveSummaryPageState extends State<ExclusiveSummaryPage>
with TickerProviderStateMixin {
late AnimationController _fadeController;
late AnimationController _slideController;
late Animation<double> _fadeAnimation;
late Animation<Offset> _slideAnimation;
@override
void initState() {
super.initState();
_fadeController = AnimationController(
duration: const Duration(milliseconds: 800),
vsync: this,
);
_slideController = AnimationController(
duration: const Duration(milliseconds: 900),
vsync: this,
);
_fadeAnimation = Tween<double>(begin: 0.0, end: 1.0).animate(
CurvedAnimation(parent: _fadeController, curve: Curves.easeOut),
);
_slideAnimation =
Tween<Offset>(begin: const Offset(0, 0.3), end: Offset.zero).animate(
CurvedAnimation(parent: _slideController, curve: Curves.easeOutCubic),
);
_fadeController.forward();
_slideController.forward();
}
@override
void dispose() {
_fadeController.dispose();
_slideController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColor.background,
body: BlocListener<ExclusiveSummaryLoaderBloc,
ExclusiveSummaryLoaderState>(
listenWhen: (prev, curr) =>
prev.dateFrom != curr.dateFrom || prev.dateTo != curr.dateTo,
listener: (context, state) {
context
.read<ExclusiveSummaryLoaderBloc>()
.add(ExclusiveSummaryLoaderEvent.fetched());
},
child: BlocBuilder<ExclusiveSummaryLoaderBloc,
ExclusiveSummaryLoaderState>(
builder: (context, state) {
return RefreshIndicator(
color: AppColor.primary,
onRefresh: () async {
context
.read<ExclusiveSummaryLoaderBloc>()
.add(ExclusiveSummaryLoaderEvent.fetched());
await context
.read<ExclusiveSummaryLoaderBloc>()
.stream
.firstWhere((s) => !s.isFetching);
},
child: CustomScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
// App Bar
SliverAppBar(
expandedHeight: 120,
floating: false,
pinned: true,
backgroundColor: AppColor.primary,
flexibleSpace: CustomAppBar(
title: context.lang.exclusive_summary,
),
),
// Date Range Picker
SliverToBoxAdapter(
child: FadeTransition(
opacity: _fadeAnimation,
child: Padding(
padding: const EdgeInsets.all(16),
child: DateRangePickerField(
maxDate: DateTime.now(),
startDate: state.dateFrom,
endDate: state.dateTo,
onChanged: (startDate, endDate) {
context.read<ExclusiveSummaryLoaderBloc>().add(
ExclusiveSummaryLoaderEvent.rangeDateChanged(
startDate!,
endDate!,
),
);
},
),
),
),
),
// Content
SliverToBoxAdapter(
child: SlideTransition(
position: _slideAnimation,
child: FadeTransition(
opacity: _fadeAnimation,
child: state.isFetching
? _buildShimmer()
: _buildContent(state.exclusiveSummary),
),
),
),
const SliverToBoxAdapter(child: SpaceHeight(80)),
],
),
);
},
),
),
);
}
// SHIMMER
Widget _buildShimmer() {
return Padding(
padding: const EdgeInsets.all(16),
child: Column(
children: [
_shimmerBox(height: 160),
const SpaceHeight(16),
Row(children: [
Expanded(child: _shimmerBox(height: 100)),
const SpaceWidth(12),
Expanded(child: _shimmerBox(height: 100)),
]),
const SpaceHeight(16),
_shimmerBox(height: 200),
const SpaceHeight(16),
_shimmerBox(height: 150),
],
),
);
}
Widget _shimmerBox({required double height}) {
return Shimmer.fromColors(
baseColor: Colors.grey[300]!,
highlightColor: Colors.grey[100]!,
child: Container(
height: height,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16),
),
),
);
}
// CONTENT
Widget _buildContent(ExclusiveSummary data) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildNetProfitCard(data.summary),
const SpaceHeight(16),
_buildSummaryGrid(data.summary),
const SpaceHeight(16),
_buildReimburseCard(data.reimburse),
const SpaceHeight(16),
if (data.hppBreakdown.isNotEmpty) ...[
_buildBreakdownSection(
title: context.lang.hpp_breakdown,
icon: LineIcons.shoppingBag,
color: AppColor.error,
items: data.hppBreakdown,
),
const SpaceHeight(16),
],
if (data.operationalExpenseBreakdown.isNotEmpty) ...[
_buildBreakdownSection(
title: context.lang.operational_expense_breakdown,
icon: LineIcons.receipt,
color: AppColor.warning,
items: data.operationalExpenseBreakdown,
),
const SpaceHeight(16),
],
if (data.dailySummary.isNotEmpty) ...[
_buildDailySummarySection(data.dailySummary),
const SpaceHeight(16),
],
if (data.dailyTransactions.isNotEmpty) ...[
_buildTransactionsSection(data.dailyTransactions),
const SpaceHeight(16),
],
],
),
);
}
// NET PROFIT HERO CARD
Widget _buildNetProfitCard(ExclusiveSummarySummary summary) {
final isPositive = summary.netProfit >= 0;
final gradientColors = isPositive
? AppColor.successGradient
: [AppColor.error, AppColor.error.withOpacity(0.7)];
return TweenAnimationBuilder<double>(
tween: Tween(begin: 0.0, end: 1.0),
duration: const Duration(milliseconds: 900),
curve: Curves.elasticOut,
builder: (context, value, _) => Transform.scale(
scale: value.clamp(0.0, 1.0),
child: Container(
width: double.infinity,
padding: const EdgeInsets.all(24),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: gradientColors,
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
borderRadius: BorderRadius.circular(20),
boxShadow: [
BoxShadow(
color: (isPositive ? AppColor.success : AppColor.error)
.withOpacity(0.3),
blurRadius: 20,
offset: const Offset(0, 8),
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Container(
padding: const EdgeInsets.all(10),
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.2),
borderRadius: BorderRadius.circular(12),
),
child: Icon(
isPositive ? LineIcons.lineChart : LineIcons.arrowDown,
color: Colors.white,
size: 22,
),
),
const SpaceWidth(12),
Text(
context.lang.net_profit,
style: const TextStyle(
color: Colors.white,
fontSize: 16,
fontWeight: FontWeight.w600,
),
),
],
),
const SpaceHeight(16),
Text(
summary.netProfit.currencyFormatRp,
style: const TextStyle(
color: Colors.white,
fontSize: 32,
fontWeight: FontWeight.bold,
letterSpacing: -0.5,
),
),
const SpaceHeight(8),
Row(
children: [
_buildHeroStat(
context.lang.total_sales,
summary.sales.currencyFormatRp,
),
const SpaceWidth(24),
_buildHeroStat(
context.lang.total_cost,
summary.totalCost.currencyFormatRp,
),
],
),
],
),
),
),
);
}
Widget _buildHeroStat(String label, String value) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
label,
style: TextStyle(
color: Colors.white.withOpacity(0.8),
fontSize: 12,
),
),
Text(
value,
style: const TextStyle(
color: Colors.white,
fontSize: 15,
fontWeight: FontWeight.bold,
),
),
],
);
}
// SUMMARY GRID
Widget _buildSummaryGrid(ExclusiveSummarySummary summary) {
return Column(
children: [
Row(
children: [
Expanded(
child: _buildStatCard(
icon: LineIcons.arrowUp,
label: context.lang.gross_profit,
value: summary.grossProfit.currencyFormatRp,
color: AppColor.success,
),
),
const SpaceWidth(12),
Expanded(
child: _buildStatCard(
icon: LineIcons.shoppingBag,
label: context.lang.hpp,
value: summary.hpp.currencyFormatRp,
color: AppColor.error,
),
),
],
),
const SpaceHeight(12),
Row(
children: [
Expanded(
child: _buildStatCard(
icon: LineIcons.users,
label: context.lang.salary_total,
value: summary.salaryTotal.currencyFormatRp,
color: AppColor.info,
),
),
const SpaceWidth(12),
Expanded(
child: _buildStatCard(
icon: LineIcons.receipt,
label: context.lang.operational_expenses,
value: summary.operationalExpensesTotal.currencyFormatRp,
color: AppColor.warning,
),
),
],
),
],
);
}
Widget _buildStatCard({
required IconData icon,
required String label,
required String value,
required Color color,
}) {
return Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: AppColor.white,
borderRadius: BorderRadius.circular(16),
boxShadow: [
BoxShadow(
color: color.withOpacity(0.08),
blurRadius: 12,
offset: const Offset(0, 4),
),
],
border: Border.all(color: color.withOpacity(0.12)),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: color.withOpacity(0.1),
borderRadius: BorderRadius.circular(10),
),
child: Icon(icon, color: color, size: 18),
),
const SpaceHeight(10),
Text(
label,
style: AppStyle.sm.copyWith(color: AppColor.textSecondary),
),
const SpaceHeight(4),
Text(
value,
style: AppStyle.md.copyWith(
color: AppColor.textPrimary,
fontWeight: FontWeight.bold,
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
],
),
);
}
// REIMBURSE CARD
Widget _buildReimburseCard(ExclusiveSummaryReimburse reimburse) {
return Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: AppColor.white,
borderRadius: BorderRadius.circular(16),
boxShadow: [
BoxShadow(
color: AppColor.primary.withOpacity(0.08),
blurRadius: 12,
offset: const Offset(0, 4),
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Container(
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: AppColor.primary.withOpacity(0.1),
borderRadius: BorderRadius.circular(10),
),
child: const Icon(
LineIcons.moneyBill,
color: AppColor.primary,
size: 18,
),
),
const SpaceWidth(10),
Text(
context.lang.reimburse_summary,
style: AppStyle.lg.copyWith(fontWeight: FontWeight.bold),
),
],
),
const SpaceHeight(16),
_buildReimburseRow(
context.lang.total_cost,
reimburse.totalCost.currencyFormatRp,
),
const Divider(height: 20),
_buildReimburseRow(
context.lang.excluded_salary_staff,
reimburse.excludedSalaryStaff.currencyFormatRp,
),
const Divider(height: 20),
_buildReimburseRow(
context.lang.total_reimburse,
reimburse.totalReimburse.currencyFormatRp,
isHighlighted: true,
),
],
),
);
}
Widget _buildReimburseRow(
String label,
String value, {
bool isHighlighted = false,
}) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
label,
style: AppStyle.sm.copyWith(
color: isHighlighted
? AppColor.textPrimary
: AppColor.textSecondary,
fontWeight:
isHighlighted ? FontWeight.bold : FontWeight.normal,
),
),
Text(
value,
style: AppStyle.sm.copyWith(
color: isHighlighted ? AppColor.primary : AppColor.textPrimary,
fontWeight:
isHighlighted ? FontWeight.bold : FontWeight.w600,
),
),
],
);
}
// BREAKDOWN SECTION
Widget _buildBreakdownSection({
required String title,
required IconData icon,
required Color color,
required List<ExclusiveSummaryBreakdown> items,
}) {
return Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: AppColor.white,
borderRadius: BorderRadius.circular(16),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.04),
blurRadius: 10,
offset: const Offset(0, 4),
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Container(
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: color.withOpacity(0.1),
borderRadius: BorderRadius.circular(10),
),
child: Icon(icon, color: color, size: 18),
),
const SpaceWidth(10),
Expanded(
child: Text(
title,
style: AppStyle.lg.copyWith(fontWeight: FontWeight.bold),
),
),
],
),
const SpaceHeight(16),
...items.map((item) => _buildBreakdownItem(item, color)),
],
),
);
}
Widget _buildBreakdownItem(
ExclusiveSummaryBreakdown item,
Color color,
) {
return Padding(
padding: const EdgeInsets.only(bottom: 12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Text(
item.categoryName,
style: AppStyle.sm.copyWith(
fontWeight: FontWeight.w600,
color: AppColor.textPrimary,
),
),
),
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Text(
item.amount.currencyFormatRp,
style: AppStyle.sm.copyWith(
fontWeight: FontWeight.bold,
color: color,
),
),
Text(
'${item.percentage.toStringAsFixed(1)}%',
style: AppStyle.xs.copyWith(
color: AppColor.textSecondary,
),
),
],
),
],
),
const SpaceHeight(6),
ClipRRect(
borderRadius: BorderRadius.circular(4),
child: TweenAnimationBuilder<double>(
tween: Tween(begin: 0.0, end: item.percentage / 100),
duration: const Duration(milliseconds: 800),
curve: Curves.easeOutCubic,
builder: (context, value, _) => LinearProgressIndicator(
value: value.clamp(0.0, 1.0),
backgroundColor: color.withOpacity(0.1),
valueColor: AlwaysStoppedAnimation<Color>(color),
minHeight: 6,
),
),
),
],
),
);
}
// DAILY SUMMARY
Widget _buildDailySummarySection(List<ExclusiveSummaryDaily> items) {
return Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: AppColor.white,
borderRadius: BorderRadius.circular(16),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.04),
blurRadius: 10,
offset: const Offset(0, 4),
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Container(
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: AppColor.info.withOpacity(0.1),
borderRadius: BorderRadius.circular(10),
),
child: const Icon(
LineIcons.calendar,
color: AppColor.info,
size: 18,
),
),
const SpaceWidth(10),
Text(
context.lang.daily_summary,
style: AppStyle.lg.copyWith(fontWeight: FontWeight.bold),
),
],
),
const SpaceHeight(16),
ListView.separated(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemCount: items.length,
separatorBuilder: (_, __) => const Divider(height: 16),
itemBuilder: (context, index) {
final item = items[index];
return Row(
children: [
Container(
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: AppColor.primary.withOpacity(0.08),
borderRadius: BorderRadius.circular(8),
),
child: Text(
'${item.date.day}',
style: AppStyle.md.copyWith(
color: AppColor.primary,
fontWeight: FontWeight.bold,
),
),
),
const SpaceWidth(12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
item.date.toDate,
style: AppStyle.sm.copyWith(
fontWeight: FontWeight.w600,
),
),
Text(
'${item.transactionCount} ${context.lang.transactions}',
style: AppStyle.xs.copyWith(
color: AppColor.textSecondary,
),
),
],
),
),
Text(
item.totalCost.currencyFormatRp,
style: AppStyle.sm.copyWith(
fontWeight: FontWeight.bold,
color: AppColor.error,
),
),
],
);
},
),
],
),
);
}
// DAILY TRANSACTIONS
Widget _buildTransactionsSection(
List<ExclusiveSummaryTransaction> items) {
return Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: AppColor.white,
borderRadius: BorderRadius.circular(16),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.04),
blurRadius: 10,
offset: const Offset(0, 4),
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Container(
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: AppColor.secondary.withOpacity(0.1),
borderRadius: BorderRadius.circular(10),
),
child: const Icon(
LineIcons.list,
color: AppColor.secondary,
size: 18,
),
),
const SpaceWidth(10),
Text(
context.lang.daily_transactions,
style: AppStyle.lg.copyWith(fontWeight: FontWeight.bold),
),
],
),
const SpaceHeight(16),
ListView.separated(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemCount: items.length,
separatorBuilder: (_, __) => const Divider(height: 16),
itemBuilder: (context, index) {
final tx = items[index];
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding: const EdgeInsets.symmetric(
horizontal: 8,
vertical: 4,
),
decoration: BoxDecoration(
color: _sourceColor(tx.source).withOpacity(0.1),
borderRadius: BorderRadius.circular(8),
),
child: Text(
_sourceLabel(tx.source),
style: AppStyle.xs.copyWith(
color: _sourceColor(tx.source),
fontWeight: FontWeight.w600,
),
),
),
const SpaceWidth(10),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
tx.description,
style: AppStyle.sm.copyWith(
fontWeight: FontWeight.w600,
),
),
Text(
'${tx.categoryName} · ${tx.date.toShortDate}',
style: AppStyle.xs.copyWith(
color: AppColor.textSecondary,
),
),
],
),
),
Text(
tx.amount.currencyFormatRp,
style: AppStyle.sm.copyWith(
fontWeight: FontWeight.bold,
color: AppColor.error,
),
),
],
);
},
),
],
),
);
}
Color _sourceColor(String source) {
switch (source) {
case 'purchase_order':
return AppColor.info;
case 'salary':
return AppColor.warning;
case 'operational':
return AppColor.secondary;
default:
return AppColor.primary;
}
}
String _sourceLabel(String source) {
switch (source) {
case 'purchase_order':
return 'PO';
case 'salary':
return 'Gaji';
case 'operational':
return 'Ops';
default:
return source;
}
}
}

View File

@ -52,9 +52,9 @@ class HomeFeature extends StatelessWidget {
onTap: () => context.router.push(FinanceRoute()),
),
HomeFeatureTile(
title: context.lang.product,
iconPath: Assets.icons.icReportProduct.path,
onTap: () => context.router.push(ProductAnalyticRoute()),
title: context.lang.exclusive_summary,
iconPath: Assets.icons.icReportExclusiveSummary.path,
onTap: () => context.router.push(ExclusiveSummaryRoute()),
),
// HomeFeatureTile(
// title: context.lang.inventory,

View File

@ -50,6 +50,9 @@ class AppRouter extends RootStackRouter {
// Finance page
AutoRoute(page: FinanceRoute.page),
// Exclusive Summary
AutoRoute(page: ExclusiveSummaryRoute.page),
// Order
AutoRoute(page: OrderDetailRoute.page),

View File

@ -9,12 +9,12 @@
// coverage:ignore-file
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'package:apskel_owner_flutter/domain/order/order.dart' as _i28;
import 'package:apskel_owner_flutter/domain/user/user.dart' as _i29;
import 'package:apskel_owner_flutter/domain/order/order.dart' as _i29;
import 'package:apskel_owner_flutter/domain/user/user.dart' as _i30;
import 'package:apskel_owner_flutter/presentation/pages/about_app/about_app_page.dart'
as _i1;
import 'package:apskel_owner_flutter/presentation/pages/auth/login/login_page.dart'
as _i11;
as _i12;
import 'package:apskel_owner_flutter/presentation/pages/coming_soon/coming_soon_page.dart'
as _i2;
import 'package:apskel_owner_flutter/presentation/pages/customer/customer_page.dart'
@ -23,56 +23,58 @@ import 'package:apskel_owner_flutter/presentation/pages/download/download_report
as _i5;
import 'package:apskel_owner_flutter/presentation/pages/error/error_page.dart'
as _i6;
import 'package:apskel_owner_flutter/presentation/pages/finance/finance_page.dart'
import 'package:apskel_owner_flutter/presentation/pages/exclusive_summary/exclusive_summary_page.dart'
as _i7;
import 'package:apskel_owner_flutter/presentation/pages/finance/finance_page.dart'
as _i8;
import 'package:apskel_owner_flutter/presentation/pages/form/daily_task_form_page.dart'
as _i4;
import 'package:apskel_owner_flutter/presentation/pages/home/home_page.dart'
as _i8;
import 'package:apskel_owner_flutter/presentation/pages/inventory/inventory_page.dart'
as _i9;
import 'package:apskel_owner_flutter/presentation/pages/language/language_page.dart'
import 'package:apskel_owner_flutter/presentation/pages/inventory/inventory_page.dart'
as _i10;
import 'package:apskel_owner_flutter/presentation/pages/language/language_page.dart'
as _i11;
import 'package:apskel_owner_flutter/presentation/pages/main/main_page.dart'
as _i12;
import 'package:apskel_owner_flutter/presentation/pages/order/order_detail/order_detail_page.dart'
as _i13;
import 'package:apskel_owner_flutter/presentation/pages/order/order_list/order_page.dart'
import 'package:apskel_owner_flutter/presentation/pages/order/order_detail/order_detail_page.dart'
as _i14;
import 'package:apskel_owner_flutter/presentation/pages/outlet/outlet_information_page.dart'
import 'package:apskel_owner_flutter/presentation/pages/order/order_list/order_page.dart'
as _i15;
import 'package:apskel_owner_flutter/presentation/pages/product/product_analytic/product_analytic_page.dart'
import 'package:apskel_owner_flutter/presentation/pages/outlet/outlet_information_page.dart'
as _i16;
import 'package:apskel_owner_flutter/presentation/pages/product/product_list/product_page.dart'
import 'package:apskel_owner_flutter/presentation/pages/product/product_analytic/product_analytic_page.dart'
as _i17;
import 'package:apskel_owner_flutter/presentation/pages/profile/pages/profile_change_password/profile_change_password_page.dart'
import 'package:apskel_owner_flutter/presentation/pages/product/product_list/product_page.dart'
as _i18;
import 'package:apskel_owner_flutter/presentation/pages/profile/pages/profile_edit/profile_edit_page.dart'
import 'package:apskel_owner_flutter/presentation/pages/profile/pages/profile_change_password/profile_change_password_page.dart'
as _i19;
import 'package:apskel_owner_flutter/presentation/pages/profile/profile_page.dart'
import 'package:apskel_owner_flutter/presentation/pages/profile/pages/profile_edit/profile_edit_page.dart'
as _i20;
import 'package:apskel_owner_flutter/presentation/pages/purchase/purchase_page.dart'
import 'package:apskel_owner_flutter/presentation/pages/profile/profile_page.dart'
as _i21;
import 'package:apskel_owner_flutter/presentation/pages/report/report_page.dart'
import 'package:apskel_owner_flutter/presentation/pages/purchase/purchase_page.dart'
as _i22;
import 'package:apskel_owner_flutter/presentation/pages/sales/sales_page.dart'
import 'package:apskel_owner_flutter/presentation/pages/report/report_page.dart'
as _i23;
import 'package:apskel_owner_flutter/presentation/pages/schedule/schedule_page.dart'
import 'package:apskel_owner_flutter/presentation/pages/sales/sales_page.dart'
as _i24;
import 'package:apskel_owner_flutter/presentation/pages/splash/splash_page.dart'
import 'package:apskel_owner_flutter/presentation/pages/schedule/schedule_page.dart'
as _i25;
import 'package:auto_route/auto_route.dart' as _i26;
import 'package:flutter/material.dart' as _i27;
import 'package:apskel_owner_flutter/presentation/pages/splash/splash_page.dart'
as _i26;
import 'package:auto_route/auto_route.dart' as _i27;
import 'package:flutter/material.dart' as _i28;
/// generated route for
/// [_i1.AboutAppPage]
class AboutAppRoute extends _i26.PageRouteInfo<void> {
const AboutAppRoute({List<_i26.PageRouteInfo>? children})
class AboutAppRoute extends _i27.PageRouteInfo<void> {
const AboutAppRoute({List<_i27.PageRouteInfo>? children})
: super(AboutAppRoute.name, initialChildren: children);
static const String name = 'AboutAppRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
return const _i1.AboutAppPage();
@ -82,13 +84,13 @@ class AboutAppRoute extends _i26.PageRouteInfo<void> {
/// generated route for
/// [_i2.ComingSoonPage]
class ComingSoonRoute extends _i26.PageRouteInfo<void> {
const ComingSoonRoute({List<_i26.PageRouteInfo>? children})
class ComingSoonRoute extends _i27.PageRouteInfo<void> {
const ComingSoonRoute({List<_i27.PageRouteInfo>? children})
: super(ComingSoonRoute.name, initialChildren: children);
static const String name = 'ComingSoonRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
return const _i2.ComingSoonPage();
@ -98,29 +100,29 @@ class ComingSoonRoute extends _i26.PageRouteInfo<void> {
/// generated route for
/// [_i3.CustomerPage]
class CustomerRoute extends _i26.PageRouteInfo<void> {
const CustomerRoute({List<_i26.PageRouteInfo>? children})
class CustomerRoute extends _i27.PageRouteInfo<void> {
const CustomerRoute({List<_i27.PageRouteInfo>? children})
: super(CustomerRoute.name, initialChildren: children);
static const String name = 'CustomerRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
return _i26.WrappedRoute(child: const _i3.CustomerPage());
return _i27.WrappedRoute(child: const _i3.CustomerPage());
},
);
}
/// generated route for
/// [_i4.DailyTasksFormPage]
class DailyTasksFormRoute extends _i26.PageRouteInfo<void> {
const DailyTasksFormRoute({List<_i26.PageRouteInfo>? children})
class DailyTasksFormRoute extends _i27.PageRouteInfo<void> {
const DailyTasksFormRoute({List<_i27.PageRouteInfo>? children})
: super(DailyTasksFormRoute.name, initialChildren: children);
static const String name = 'DailyTasksFormRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
return const _i4.DailyTasksFormPage();
@ -130,32 +132,32 @@ class DailyTasksFormRoute extends _i26.PageRouteInfo<void> {
/// generated route for
/// [_i5.DownloadReportPage]
class DownloadReportRoute extends _i26.PageRouteInfo<void> {
const DownloadReportRoute({List<_i26.PageRouteInfo>? children})
class DownloadReportRoute extends _i27.PageRouteInfo<void> {
const DownloadReportRoute({List<_i27.PageRouteInfo>? children})
: super(DownloadReportRoute.name, initialChildren: children);
static const String name = 'DownloadReportRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
return _i26.WrappedRoute(child: const _i5.DownloadReportPage());
return _i27.WrappedRoute(child: const _i5.DownloadReportPage());
},
);
}
/// generated route for
/// [_i6.ErrorPage]
class ErrorRoute extends _i26.PageRouteInfo<ErrorRouteArgs> {
class ErrorRoute extends _i27.PageRouteInfo<ErrorRouteArgs> {
ErrorRoute({
_i27.Key? key,
_i28.Key? key,
String? title,
String? message,
_i27.VoidCallback? onRetry,
_i27.VoidCallback? onBack,
_i28.VoidCallback? onRetry,
_i28.VoidCallback? onBack,
String? errorCode,
_i27.IconData? errorIcon,
List<_i26.PageRouteInfo>? children,
_i28.IconData? errorIcon,
List<_i27.PageRouteInfo>? children,
}) : super(
ErrorRoute.name,
args: ErrorRouteArgs(
@ -172,7 +174,7 @@ class ErrorRoute extends _i26.PageRouteInfo<ErrorRouteArgs> {
static const String name = 'ErrorRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
final args = data.argsAs<ErrorRouteArgs>(
@ -202,19 +204,19 @@ class ErrorRouteArgs {
this.errorIcon,
});
final _i27.Key? key;
final _i28.Key? key;
final String? title;
final String? message;
final _i27.VoidCallback? onRetry;
final _i28.VoidCallback? onRetry;
final _i27.VoidCallback? onBack;
final _i28.VoidCallback? onBack;
final String? errorCode;
final _i27.IconData? errorIcon;
final _i28.IconData? errorIcon;
@override
String toString() {
@ -223,108 +225,124 @@ class ErrorRouteArgs {
}
/// generated route for
/// [_i7.FinancePage]
class FinanceRoute extends _i26.PageRouteInfo<void> {
const FinanceRoute({List<_i26.PageRouteInfo>? children})
/// [_i7.ExclusiveSummaryPage]
class ExclusiveSummaryRoute extends _i27.PageRouteInfo<void> {
const ExclusiveSummaryRoute({List<_i27.PageRouteInfo>? children})
: super(ExclusiveSummaryRoute.name, initialChildren: children);
static const String name = 'ExclusiveSummaryRoute';
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
return _i27.WrappedRoute(child: const _i7.ExclusiveSummaryPage());
},
);
}
/// generated route for
/// [_i8.FinancePage]
class FinanceRoute extends _i27.PageRouteInfo<void> {
const FinanceRoute({List<_i27.PageRouteInfo>? children})
: super(FinanceRoute.name, initialChildren: children);
static const String name = 'FinanceRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
return _i26.WrappedRoute(child: const _i7.FinancePage());
return _i27.WrappedRoute(child: const _i8.FinancePage());
},
);
}
/// generated route for
/// [_i8.HomePage]
class HomeRoute extends _i26.PageRouteInfo<void> {
const HomeRoute({List<_i26.PageRouteInfo>? children})
/// [_i9.HomePage]
class HomeRoute extends _i27.PageRouteInfo<void> {
const HomeRoute({List<_i27.PageRouteInfo>? children})
: super(HomeRoute.name, initialChildren: children);
static const String name = 'HomeRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
return _i26.WrappedRoute(child: const _i8.HomePage());
return _i27.WrappedRoute(child: const _i9.HomePage());
},
);
}
/// generated route for
/// [_i9.InventoryPage]
class InventoryRoute extends _i26.PageRouteInfo<void> {
const InventoryRoute({List<_i26.PageRouteInfo>? children})
/// [_i10.InventoryPage]
class InventoryRoute extends _i27.PageRouteInfo<void> {
const InventoryRoute({List<_i27.PageRouteInfo>? children})
: super(InventoryRoute.name, initialChildren: children);
static const String name = 'InventoryRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
return _i26.WrappedRoute(child: const _i9.InventoryPage());
return _i27.WrappedRoute(child: const _i10.InventoryPage());
},
);
}
/// generated route for
/// [_i10.LanguagePage]
class LanguageRoute extends _i26.PageRouteInfo<void> {
const LanguageRoute({List<_i26.PageRouteInfo>? children})
/// [_i11.LanguagePage]
class LanguageRoute extends _i27.PageRouteInfo<void> {
const LanguageRoute({List<_i27.PageRouteInfo>? children})
: super(LanguageRoute.name, initialChildren: children);
static const String name = 'LanguageRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
return const _i10.LanguagePage();
return const _i11.LanguagePage();
},
);
}
/// generated route for
/// [_i11.LoginPage]
class LoginRoute extends _i26.PageRouteInfo<void> {
const LoginRoute({List<_i26.PageRouteInfo>? children})
/// [_i12.LoginPage]
class LoginRoute extends _i27.PageRouteInfo<void> {
const LoginRoute({List<_i27.PageRouteInfo>? children})
: super(LoginRoute.name, initialChildren: children);
static const String name = 'LoginRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
return _i26.WrappedRoute(child: const _i11.LoginPage());
return _i27.WrappedRoute(child: const _i12.LoginPage());
},
);
}
/// generated route for
/// [_i12.MainPage]
class MainRoute extends _i26.PageRouteInfo<void> {
const MainRoute({List<_i26.PageRouteInfo>? children})
/// [_i13.MainPage]
class MainRoute extends _i27.PageRouteInfo<void> {
const MainRoute({List<_i27.PageRouteInfo>? children})
: super(MainRoute.name, initialChildren: children);
static const String name = 'MainRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
return const _i12.MainPage();
return const _i13.MainPage();
},
);
}
/// generated route for
/// [_i13.OrderDetailPage]
class OrderDetailRoute extends _i26.PageRouteInfo<OrderDetailRouteArgs> {
/// [_i14.OrderDetailPage]
class OrderDetailRoute extends _i27.PageRouteInfo<OrderDetailRouteArgs> {
OrderDetailRoute({
_i27.Key? key,
required _i28.Order order,
List<_i26.PageRouteInfo>? children,
_i28.Key? key,
required _i29.Order order,
List<_i27.PageRouteInfo>? children,
}) : super(
OrderDetailRoute.name,
args: OrderDetailRouteArgs(key: key, order: order),
@ -333,11 +351,11 @@ class OrderDetailRoute extends _i26.PageRouteInfo<OrderDetailRouteArgs> {
static const String name = 'OrderDetailRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
final args = data.argsAs<OrderDetailRouteArgs>();
return _i13.OrderDetailPage(key: args.key, order: args.order);
return _i14.OrderDetailPage(key: args.key, order: args.order);
},
);
}
@ -345,9 +363,9 @@ class OrderDetailRoute extends _i26.PageRouteInfo<OrderDetailRouteArgs> {
class OrderDetailRouteArgs {
const OrderDetailRouteArgs({this.key, required this.order});
final _i27.Key? key;
final _i28.Key? key;
final _i28.Order order;
final _i29.Order order;
@override
String toString() {
@ -356,92 +374,92 @@ class OrderDetailRouteArgs {
}
/// generated route for
/// [_i14.OrderPage]
class OrderRoute extends _i26.PageRouteInfo<void> {
const OrderRoute({List<_i26.PageRouteInfo>? children})
/// [_i15.OrderPage]
class OrderRoute extends _i27.PageRouteInfo<void> {
const OrderRoute({List<_i27.PageRouteInfo>? children})
: super(OrderRoute.name, initialChildren: children);
static const String name = 'OrderRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
return _i26.WrappedRoute(child: const _i14.OrderPage());
return _i27.WrappedRoute(child: const _i15.OrderPage());
},
);
}
/// generated route for
/// [_i15.OutletInformationPage]
class OutletInformationRoute extends _i26.PageRouteInfo<void> {
const OutletInformationRoute({List<_i26.PageRouteInfo>? children})
/// [_i16.OutletInformationPage]
class OutletInformationRoute extends _i27.PageRouteInfo<void> {
const OutletInformationRoute({List<_i27.PageRouteInfo>? children})
: super(OutletInformationRoute.name, initialChildren: children);
static const String name = 'OutletInformationRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
return _i26.WrappedRoute(child: const _i15.OutletInformationPage());
return _i27.WrappedRoute(child: const _i16.OutletInformationPage());
},
);
}
/// generated route for
/// [_i16.ProductAnalyticPage]
class ProductAnalyticRoute extends _i26.PageRouteInfo<void> {
const ProductAnalyticRoute({List<_i26.PageRouteInfo>? children})
/// [_i17.ProductAnalyticPage]
class ProductAnalyticRoute extends _i27.PageRouteInfo<void> {
const ProductAnalyticRoute({List<_i27.PageRouteInfo>? children})
: super(ProductAnalyticRoute.name, initialChildren: children);
static const String name = 'ProductAnalyticRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
return _i26.WrappedRoute(child: const _i16.ProductAnalyticPage());
return _i27.WrappedRoute(child: const _i17.ProductAnalyticPage());
},
);
}
/// generated route for
/// [_i17.ProductPage]
class ProductRoute extends _i26.PageRouteInfo<void> {
const ProductRoute({List<_i26.PageRouteInfo>? children})
/// [_i18.ProductPage]
class ProductRoute extends _i27.PageRouteInfo<void> {
const ProductRoute({List<_i27.PageRouteInfo>? children})
: super(ProductRoute.name, initialChildren: children);
static const String name = 'ProductRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
return _i26.WrappedRoute(child: const _i17.ProductPage());
return _i27.WrappedRoute(child: const _i18.ProductPage());
},
);
}
/// generated route for
/// [_i18.ProfileChangePasswordPage]
class ProfileChangePasswordRoute extends _i26.PageRouteInfo<void> {
const ProfileChangePasswordRoute({List<_i26.PageRouteInfo>? children})
/// [_i19.ProfileChangePasswordPage]
class ProfileChangePasswordRoute extends _i27.PageRouteInfo<void> {
const ProfileChangePasswordRoute({List<_i27.PageRouteInfo>? children})
: super(ProfileChangePasswordRoute.name, initialChildren: children);
static const String name = 'ProfileChangePasswordRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
return _i26.WrappedRoute(child: const _i18.ProfileChangePasswordPage());
return _i27.WrappedRoute(child: const _i19.ProfileChangePasswordPage());
},
);
}
/// generated route for
/// [_i19.ProfileEditPage]
class ProfileEditRoute extends _i26.PageRouteInfo<ProfileEditRouteArgs> {
/// [_i20.ProfileEditPage]
class ProfileEditRoute extends _i27.PageRouteInfo<ProfileEditRouteArgs> {
ProfileEditRoute({
_i27.Key? key,
required _i29.User user,
List<_i26.PageRouteInfo>? children,
_i28.Key? key,
required _i30.User user,
List<_i27.PageRouteInfo>? children,
}) : super(
ProfileEditRoute.name,
args: ProfileEditRouteArgs(key: key, user: user),
@ -450,12 +468,12 @@ class ProfileEditRoute extends _i26.PageRouteInfo<ProfileEditRouteArgs> {
static const String name = 'ProfileEditRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
final args = data.argsAs<ProfileEditRouteArgs>();
return _i26.WrappedRoute(
child: _i19.ProfileEditPage(key: args.key, user: args.user),
return _i27.WrappedRoute(
child: _i20.ProfileEditPage(key: args.key, user: args.user),
);
},
);
@ -464,9 +482,9 @@ class ProfileEditRoute extends _i26.PageRouteInfo<ProfileEditRouteArgs> {
class ProfileEditRouteArgs {
const ProfileEditRouteArgs({this.key, required this.user});
final _i27.Key? key;
final _i28.Key? key;
final _i29.User user;
final _i30.User user;
@override
String toString() {
@ -475,97 +493,97 @@ class ProfileEditRouteArgs {
}
/// generated route for
/// [_i20.ProfilePage]
class ProfileRoute extends _i26.PageRouteInfo<void> {
const ProfileRoute({List<_i26.PageRouteInfo>? children})
/// [_i21.ProfilePage]
class ProfileRoute extends _i27.PageRouteInfo<void> {
const ProfileRoute({List<_i27.PageRouteInfo>? children})
: super(ProfileRoute.name, initialChildren: children);
static const String name = 'ProfileRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
return _i26.WrappedRoute(child: const _i20.ProfilePage());
return _i27.WrappedRoute(child: const _i21.ProfilePage());
},
);
}
/// generated route for
/// [_i21.PurchasePage]
class PurchaseRoute extends _i26.PageRouteInfo<void> {
const PurchaseRoute({List<_i26.PageRouteInfo>? children})
/// [_i22.PurchasePage]
class PurchaseRoute extends _i27.PageRouteInfo<void> {
const PurchaseRoute({List<_i27.PageRouteInfo>? children})
: super(PurchaseRoute.name, initialChildren: children);
static const String name = 'PurchaseRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
return _i26.WrappedRoute(child: const _i21.PurchasePage());
return _i27.WrappedRoute(child: const _i22.PurchasePage());
},
);
}
/// generated route for
/// [_i22.ReportPage]
class ReportRoute extends _i26.PageRouteInfo<void> {
const ReportRoute({List<_i26.PageRouteInfo>? children})
/// [_i23.ReportPage]
class ReportRoute extends _i27.PageRouteInfo<void> {
const ReportRoute({List<_i27.PageRouteInfo>? children})
: super(ReportRoute.name, initialChildren: children);
static const String name = 'ReportRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
return _i26.WrappedRoute(child: const _i22.ReportPage());
return _i27.WrappedRoute(child: const _i23.ReportPage());
},
);
}
/// generated route for
/// [_i23.SalesPage]
class SalesRoute extends _i26.PageRouteInfo<void> {
const SalesRoute({List<_i26.PageRouteInfo>? children})
/// [_i24.SalesPage]
class SalesRoute extends _i27.PageRouteInfo<void> {
const SalesRoute({List<_i27.PageRouteInfo>? children})
: super(SalesRoute.name, initialChildren: children);
static const String name = 'SalesRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
return _i26.WrappedRoute(child: const _i23.SalesPage());
return _i27.WrappedRoute(child: const _i24.SalesPage());
},
);
}
/// generated route for
/// [_i24.SchedulePage]
class ScheduleRoute extends _i26.PageRouteInfo<void> {
const ScheduleRoute({List<_i26.PageRouteInfo>? children})
/// [_i25.SchedulePage]
class ScheduleRoute extends _i27.PageRouteInfo<void> {
const ScheduleRoute({List<_i27.PageRouteInfo>? children})
: super(ScheduleRoute.name, initialChildren: children);
static const String name = 'ScheduleRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
return const _i24.SchedulePage();
return const _i25.SchedulePage();
},
);
}
/// generated route for
/// [_i25.SplashPage]
class SplashRoute extends _i26.PageRouteInfo<void> {
const SplashRoute({List<_i26.PageRouteInfo>? children})
/// [_i26.SplashPage]
class SplashRoute extends _i27.PageRouteInfo<void> {
const SplashRoute({List<_i27.PageRouteInfo>? children})
: super(SplashRoute.name, initialChildren: children);
static const String name = 'SplashRoute';
static _i26.PageInfo page = _i26.PageInfo(
static _i27.PageInfo page = _i27.PageInfo(
name,
builder: (data) {
return const _i25.SplashPage();
return const _i26.SplashPage();
},
);
}

View File

@ -3,7 +3,7 @@ description: "A new Flutter project."
publish_to: "none"
version: 1.0.2+7
version: 1.0.3+8
environment:
sdk: ^3.8.1