feat: product analytic

This commit is contained in:
efrilm
2025-08-06 12:32:53 +07:00
parent 648a4f5eb4
commit 91335ad8db
10 changed files with 749 additions and 204 deletions
@@ -1,6 +1,6 @@
import 'package:enaklo_pos/data/datasources/analytic_remote_datasource.dart';
import 'package:enaklo_pos/data/models/response/product_analytic_response_model.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:enaklo_pos/data/datasources/order_item_remote_datasource.dart';
import 'package:enaklo_pos/data/models/response/product_sales_response_model.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'product_sales_event.dart';
@@ -8,14 +8,16 @@ part 'product_sales_state.dart';
part 'product_sales_bloc.freezed.dart';
class ProductSalesBloc extends Bloc<ProductSalesEvent, ProductSalesState> {
final OrderItemRemoteDatasource datasource;
final AnalyticRemoteDatasource datasource;
ProductSalesBloc(
this.datasource,
) : super(const _Initial()) {
on<_GetProductSales>((event, emit) async {
emit(const _Loading());
final result = await datasource.getProductSalesByRangeDate(
event.startDate, event.endDate);
final result = await datasource.getProduct(
dateFrom: event.startDate,
dateTo: event.endDate,
);
result.fold((l) => emit(_Error(l)), (r) => emit(_Success(r.data!)));
});
}
@@ -19,19 +19,20 @@ mixin _$ProductSalesEvent {
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() started,
required TResult Function(String startDate, String endDate) getProductSales,
required TResult Function(DateTime startDate, DateTime endDate)
getProductSales,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? started,
TResult? Function(String startDate, String endDate)? getProductSales,
TResult? Function(DateTime startDate, DateTime endDate)? getProductSales,
}) =>
throw _privateConstructorUsedError;
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? started,
TResult Function(String startDate, String endDate)? getProductSales,
TResult Function(DateTime startDate, DateTime endDate)? getProductSales,
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
@@ -119,7 +120,8 @@ class _$StartedImpl implements _Started {
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() started,
required TResult Function(String startDate, String endDate) getProductSales,
required TResult Function(DateTime startDate, DateTime endDate)
getProductSales,
}) {
return started();
}
@@ -128,7 +130,7 @@ class _$StartedImpl implements _Started {
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? started,
TResult? Function(String startDate, String endDate)? getProductSales,
TResult? Function(DateTime startDate, DateTime endDate)? getProductSales,
}) {
return started?.call();
}
@@ -137,7 +139,7 @@ class _$StartedImpl implements _Started {
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? started,
TResult Function(String startDate, String endDate)? getProductSales,
TResult Function(DateTime startDate, DateTime endDate)? getProductSales,
required TResult orElse(),
}) {
if (started != null) {
@@ -188,7 +190,7 @@ abstract class _$$GetProductSalesImplCopyWith<$Res> {
$Res Function(_$GetProductSalesImpl) then) =
__$$GetProductSalesImplCopyWithImpl<$Res>;
@useResult
$Res call({String startDate, String endDate});
$Res call({DateTime startDate, DateTime endDate});
}
/// @nodoc
@@ -211,11 +213,11 @@ class __$$GetProductSalesImplCopyWithImpl<$Res>
null == startDate
? _value.startDate
: startDate // ignore: cast_nullable_to_non_nullable
as String,
as DateTime,
null == endDate
? _value.endDate
: endDate // ignore: cast_nullable_to_non_nullable
as String,
as DateTime,
));
}
}
@@ -226,9 +228,9 @@ class _$GetProductSalesImpl implements _GetProductSales {
const _$GetProductSalesImpl(this.startDate, this.endDate);
@override
final String startDate;
final DateTime startDate;
@override
final String endDate;
final DateTime endDate;
@override
String toString() {
@@ -261,7 +263,8 @@ class _$GetProductSalesImpl implements _GetProductSales {
@optionalTypeArgs
TResult when<TResult extends Object?>({
required TResult Function() started,
required TResult Function(String startDate, String endDate) getProductSales,
required TResult Function(DateTime startDate, DateTime endDate)
getProductSales,
}) {
return getProductSales(startDate, endDate);
}
@@ -270,7 +273,7 @@ class _$GetProductSalesImpl implements _GetProductSales {
@optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? started,
TResult? Function(String startDate, String endDate)? getProductSales,
TResult? Function(DateTime startDate, DateTime endDate)? getProductSales,
}) {
return getProductSales?.call(startDate, endDate);
}
@@ -279,7 +282,7 @@ class _$GetProductSalesImpl implements _GetProductSales {
@optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({
TResult Function()? started,
TResult Function(String startDate, String endDate)? getProductSales,
TResult Function(DateTime startDate, DateTime endDate)? getProductSales,
required TResult orElse(),
}) {
if (getProductSales != null) {
@@ -321,11 +324,11 @@ class _$GetProductSalesImpl implements _GetProductSales {
}
abstract class _GetProductSales implements ProductSalesEvent {
const factory _GetProductSales(final String startDate, final String endDate) =
_$GetProductSalesImpl;
const factory _GetProductSales(
final DateTime startDate, final DateTime endDate) = _$GetProductSalesImpl;
String get startDate;
String get endDate;
DateTime get startDate;
DateTime get endDate;
/// Create a copy of ProductSalesEvent
/// with the given fields replaced by the non-null parameter values.
@@ -340,7 +343,7 @@ mixin _$ProductSalesState {
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(List<ProductSales> productSales) success,
required TResult Function(ProductAnalyticData product) success,
required TResult Function(String message) error,
}) =>
throw _privateConstructorUsedError;
@@ -348,7 +351,7 @@ mixin _$ProductSalesState {
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(List<ProductSales> productSales)? success,
TResult? Function(ProductAnalyticData product)? success,
TResult? Function(String message)? error,
}) =>
throw _privateConstructorUsedError;
@@ -356,7 +359,7 @@ mixin _$ProductSalesState {
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(List<ProductSales> productSales)? success,
TResult Function(ProductAnalyticData product)? success,
TResult Function(String message)? error,
required TResult orElse(),
}) =>
@@ -452,7 +455,7 @@ class _$InitialImpl implements _Initial {
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(List<ProductSales> productSales) success,
required TResult Function(ProductAnalyticData product) success,
required TResult Function(String message) error,
}) {
return initial();
@@ -463,7 +466,7 @@ class _$InitialImpl implements _Initial {
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(List<ProductSales> productSales)? success,
TResult? Function(ProductAnalyticData product)? success,
TResult? Function(String message)? error,
}) {
return initial?.call();
@@ -474,7 +477,7 @@ class _$InitialImpl implements _Initial {
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(List<ProductSales> productSales)? success,
TResult Function(ProductAnalyticData product)? success,
TResult Function(String message)? error,
required TResult orElse(),
}) {
@@ -569,7 +572,7 @@ class _$LoadingImpl implements _Loading {
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(List<ProductSales> productSales) success,
required TResult Function(ProductAnalyticData product) success,
required TResult Function(String message) error,
}) {
return loading();
@@ -580,7 +583,7 @@ class _$LoadingImpl implements _Loading {
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(List<ProductSales> productSales)? success,
TResult? Function(ProductAnalyticData product)? success,
TResult? Function(String message)? error,
}) {
return loading?.call();
@@ -591,7 +594,7 @@ class _$LoadingImpl implements _Loading {
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(List<ProductSales> productSales)? success,
TResult Function(ProductAnalyticData product)? success,
TResult Function(String message)? error,
required TResult orElse(),
}) {
@@ -649,7 +652,7 @@ abstract class _$$SuccessImplCopyWith<$Res> {
_$SuccessImpl value, $Res Function(_$SuccessImpl) then) =
__$$SuccessImplCopyWithImpl<$Res>;
@useResult
$Res call({List<ProductSales> productSales});
$Res call({ProductAnalyticData product});
}
/// @nodoc
@@ -665,13 +668,13 @@ class __$$SuccessImplCopyWithImpl<$Res>
@pragma('vm:prefer-inline')
@override
$Res call({
Object? productSales = null,
Object? product = null,
}) {
return _then(_$SuccessImpl(
null == productSales
? _value._productSales
: productSales // ignore: cast_nullable_to_non_nullable
as List<ProductSales>,
null == product
? _value.product
: product // ignore: cast_nullable_to_non_nullable
as ProductAnalyticData,
));
}
}
@@ -679,20 +682,14 @@ class __$$SuccessImplCopyWithImpl<$Res>
/// @nodoc
class _$SuccessImpl implements _Success {
const _$SuccessImpl(final List<ProductSales> productSales)
: _productSales = productSales;
const _$SuccessImpl(this.product);
final List<ProductSales> _productSales;
@override
List<ProductSales> get productSales {
if (_productSales is EqualUnmodifiableListView) return _productSales;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(_productSales);
}
final ProductAnalyticData product;
@override
String toString() {
return 'ProductSalesState.success(productSales: $productSales)';
return 'ProductSalesState.success(product: $product)';
}
@override
@@ -700,13 +697,11 @@ class _$SuccessImpl implements _Success {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$SuccessImpl &&
const DeepCollectionEquality()
.equals(other._productSales, _productSales));
(identical(other.product, product) || other.product == product));
}
@override
int get hashCode => Object.hash(
runtimeType, const DeepCollectionEquality().hash(_productSales));
int get hashCode => Object.hash(runtimeType, product);
/// Create a copy of ProductSalesState
/// with the given fields replaced by the non-null parameter values.
@@ -721,10 +716,10 @@ class _$SuccessImpl implements _Success {
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(List<ProductSales> productSales) success,
required TResult Function(ProductAnalyticData product) success,
required TResult Function(String message) error,
}) {
return success(productSales);
return success(product);
}
@override
@@ -732,10 +727,10 @@ class _$SuccessImpl implements _Success {
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(List<ProductSales> productSales)? success,
TResult? Function(ProductAnalyticData product)? success,
TResult? Function(String message)? error,
}) {
return success?.call(productSales);
return success?.call(product);
}
@override
@@ -743,12 +738,12 @@ class _$SuccessImpl implements _Success {
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(List<ProductSales> productSales)? success,
TResult Function(ProductAnalyticData product)? success,
TResult Function(String message)? error,
required TResult orElse(),
}) {
if (success != null) {
return success(productSales);
return success(product);
}
return orElse();
}
@@ -792,9 +787,9 @@ class _$SuccessImpl implements _Success {
}
abstract class _Success implements ProductSalesState {
const factory _Success(final List<ProductSales> productSales) = _$SuccessImpl;
const factory _Success(final ProductAnalyticData product) = _$SuccessImpl;
List<ProductSales> get productSales;
ProductAnalyticData get product;
/// Create a copy of ProductSalesState
/// with the given fields replaced by the non-null parameter values.
@@ -873,7 +868,7 @@ class _$ErrorImpl implements _Error {
TResult when<TResult extends Object?>({
required TResult Function() initial,
required TResult Function() loading,
required TResult Function(List<ProductSales> productSales) success,
required TResult Function(ProductAnalyticData product) success,
required TResult Function(String message) error,
}) {
return error(message);
@@ -884,7 +879,7 @@ class _$ErrorImpl implements _Error {
TResult? whenOrNull<TResult extends Object?>({
TResult? Function()? initial,
TResult? Function()? loading,
TResult? Function(List<ProductSales> productSales)? success,
TResult? Function(ProductAnalyticData product)? success,
TResult? Function(String message)? error,
}) {
return error?.call(message);
@@ -895,7 +890,7 @@ class _$ErrorImpl implements _Error {
TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial,
TResult Function()? loading,
TResult Function(List<ProductSales> productSales)? success,
TResult Function(ProductAnalyticData product)? success,
TResult Function(String message)? error,
required TResult orElse(),
}) {
@@ -4,7 +4,7 @@ part of 'product_sales_bloc.dart';
class ProductSalesEvent with _$ProductSalesEvent {
const factory ProductSalesEvent.started() = _Started;
const factory ProductSalesEvent.getProductSales(
String startDate,
String endDate,
DateTime startDate,
DateTime endDate,
) = _GetProductSales;
}
@@ -6,7 +6,7 @@ class ProductSalesState with _$ProductSalesState {
const factory ProductSalesState.loading() = _Loading;
const factory ProductSalesState.success(List<ProductSales> productSales) =
const factory ProductSalesState.success(ProductAnalyticData product) =
_Success;
const factory ProductSalesState.error(String message) = _Error;