feat: sales analytic

This commit is contained in:
efrilm
2025-08-17 10:10:31 +07:00
parent e7525238fe
commit f84090c0e6
21 changed files with 3703 additions and 407 deletions
+8
View File
@@ -0,0 +1,8 @@
import 'package:freezed_annotation/freezed_annotation.dart';
import '../../common/api/api_failure.dart';
part 'analytic.freezed.dart';
part 'entities/sales_analytic_entity.dart';
part 'failures/analytic_failure.dart';
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,70 @@
part of '../analytic.dart';
@freezed
class SalesAnalytic with _$SalesAnalytic {
const factory SalesAnalytic({
required String organizationId,
required String outletId,
required DateTime dateFrom,
required DateTime dateTo,
required String groupBy,
required SalesAnalyticSummary summary,
required List<SalesAnalyticData> data,
}) = _SalesAnalytic;
factory SalesAnalytic.empty() => SalesAnalytic(
organizationId: '',
outletId: '',
dateFrom: DateTime.fromMillisecondsSinceEpoch(0),
dateTo: DateTime.fromMillisecondsSinceEpoch(0),
groupBy: '',
summary: SalesAnalyticSummary.empty(),
data: [],
);
}
@freezed
class SalesAnalyticSummary with _$SalesAnalyticSummary {
const factory SalesAnalyticSummary({
required int totalSales,
required int totalOrders,
required int totalItems,
required double averageOrderValue,
required int totalTax,
required int totalDiscount,
required int netSales,
}) = _SalesAnalyticSummary;
factory SalesAnalyticSummary.empty() => const SalesAnalyticSummary(
totalSales: 0,
totalOrders: 0,
totalItems: 0,
averageOrderValue: 0,
totalTax: 0,
totalDiscount: 0,
netSales: 0,
);
}
@freezed
class SalesAnalyticData with _$SalesAnalyticData {
const factory SalesAnalyticData({
required DateTime date,
required int sales,
required int orders,
required int items,
required int tax,
required int discount,
required int netSales,
}) = _SalesAnalyticData;
factory SalesAnalyticData.empty() => SalesAnalyticData(
date: DateTime.fromMillisecondsSinceEpoch(0),
sales: 0,
orders: 0,
items: 0,
tax: 0,
discount: 0,
netSales: 0,
);
}
@@ -0,0 +1,10 @@
part of '../analytic.dart';
@freezed
sealed class AnalyticFailure with _$AnalyticFailure {
const factory AnalyticFailure.serverError(ApiFailure failure) = _ServerError;
const factory AnalyticFailure.unexpectedError() = _UnexpectedError;
const factory AnalyticFailure.empty() = _Empty;
const factory AnalyticFailure.dynamicErrorMessage(String erroMessage) =
_DynamicErrorMessage;
}
@@ -0,0 +1,10 @@
import 'package:dartz/dartz.dart';
import '../analytic.dart';
abstract class IAnalyticRepository {
Future<Either<AnalyticFailure, SalesAnalytic>> getSales({
required DateTime dateFrom,
required DateTime dateTo,
});
}