apskel-pos-flutter-v2/lib/domain/analytic/entities/product_analytic_entity.dart

98 lines
2.5 KiB
Dart
Raw Normal View History

2025-11-03 19:34:46 +07:00
part of '../analytic.dart';
@freezed
class ProductAnalytic with _$ProductAnalytic {
const ProductAnalytic._();
const factory ProductAnalytic({
required String organizationId,
required String outletId,
required DateTime dateFrom,
required DateTime dateTo,
required List<ProductAnalyticItem> data,
}) = _ProductAnalytic;
factory ProductAnalytic.empty() => ProductAnalytic(
organizationId: '',
outletId: '',
dateFrom: DateTime.now(),
dateTo: DateTime.now(),
data: const [],
);
ProductAnalyticItem get bestProduct {
if (data.isEmpty) {
return ProductAnalyticItem.empty();
}
return data.first;
}
List<ProductAnalyticCategoryItem> get categories {
final Map<String, ProductAnalyticCategoryItem> categoryMap = {};
for (final product in data) {
final key = product.categoryName;
if (categoryMap.containsKey(key)) {
final existing = categoryMap[key]!;
categoryMap[key] = existing.copyWith(
productCount: existing.productCount + 1,
totalRevenue: existing.totalRevenue + product.revenue,
);
} else {
categoryMap[key] = ProductAnalyticCategoryItem(
categoryName: product.categoryName,
productCount: 1,
totalRevenue: product.revenue,
);
}
}
final categorySummary = categoryMap.values.toList()
..sort((a, b) => b.totalRevenue.compareTo(a.totalRevenue));
return categorySummary;
}
}
@freezed
class ProductAnalyticItem with _$ProductAnalyticItem {
const factory ProductAnalyticItem({
required String productId,
required String productName,
required String categoryId,
required String categoryName,
required int quantitySold,
required int revenue,
required double averagePrice,
required int orderCount,
}) = _ProductAnalyticItem;
factory ProductAnalyticItem.empty() => const ProductAnalyticItem(
productId: '',
productName: '',
categoryId: '',
categoryName: '',
quantitySold: 0,
revenue: 0,
averagePrice: 0.0,
orderCount: 0,
);
}
@freezed
class ProductAnalyticCategoryItem with _$ProductAnalyticCategoryItem {
const factory ProductAnalyticCategoryItem({
required String categoryName,
required int productCount,
required int totalRevenue,
}) = _ProductAnalyticCategoryItem;
factory ProductAnalyticCategoryItem.empty() => ProductAnalyticCategoryItem(
categoryName: '',
productCount: 0,
totalRevenue: 0,
);
}