apskel-pos-flutter-v2/lib/infrastructure/analytic/dtos/inventory_analytic_dto.dart
2025-11-04 00:21:15 +07:00

147 lines
5.6 KiB
Dart

part of '../analytic_dtos.dart';
@freezed
class InventoryAnalyticDto with _$InventoryAnalyticDto {
const InventoryAnalyticDto._();
const factory InventoryAnalyticDto({
@JsonKey(name: "summary") InventoryAnalyticSummaryDto? summary,
@JsonKey(name: "products") List<InventoryAnalyticProductItemDto>? products,
@JsonKey(name: "ingredients")
List<InventoryAnalyticIngredientItemDto>? ingredients,
}) = _InventoryAnalyticDto;
factory InventoryAnalyticDto.fromJson(Map<String, dynamic> json) =>
_$InventoryAnalyticDtoFromJson(json);
// Mapper ke domain (opsional)
InventoryAnalytic toDomain() => InventoryAnalytic(
summary: summary?.toDomain() ?? InventoryAnalyticSummary.empty(),
products: products?.map((e) => e.toDomain()).toList() ?? [],
ingredients: ingredients?.map((e) => e.toDomain()).toList() ?? [],
);
}
@freezed
class InventoryAnalyticSummaryDto with _$InventoryAnalyticSummaryDto {
const InventoryAnalyticSummaryDto._();
const factory InventoryAnalyticSummaryDto({
@JsonKey(name: "total_products") int? totalProducts,
@JsonKey(name: "total_ingredients") int? totalIngredients,
@JsonKey(name: "total_value") int? totalValue,
@JsonKey(name: "low_stock_products") int? lowStockProducts,
@JsonKey(name: "low_stock_ingredients") int? lowStockIngredients,
@JsonKey(name: "zero_stock_products") int? zeroStockProducts,
@JsonKey(name: "zero_stock_ingredients") int? zeroStockIngredients,
@JsonKey(name: "total_sold_products") int? totalSoldProducts,
@JsonKey(name: "total_sold_ingredients") int? totalSoldIngredients,
@JsonKey(name: "outlet_id") String? outletId,
@JsonKey(name: "outlet_name") String? outletName,
@JsonKey(name: "generated_at") DateTime? generatedAt,
}) = _InventoryAnalyticSummaryDto;
factory InventoryAnalyticSummaryDto.fromJson(Map<String, dynamic> json) =>
_$InventoryAnalyticSummaryDtoFromJson(json);
// Optional mapper ke entity
InventoryAnalyticSummary toDomain() => InventoryAnalyticSummary(
totalProducts: totalProducts ?? 0,
totalIngredients: totalIngredients ?? 0,
totalValue: totalValue ?? 0,
lowStockProducts: lowStockProducts ?? 0,
lowStockIngredients: lowStockIngredients ?? 0,
zeroStockProducts: zeroStockProducts ?? 0,
zeroStockIngredients: zeroStockIngredients ?? 0,
totalSoldProducts: totalSoldProducts ?? 0,
totalSoldIngredients: totalSoldIngredients ?? 0,
outletId: outletId ?? '',
outletName: outletName ?? '',
generatedAt: generatedAt ?? DateTime.now(),
);
}
@freezed
class InventoryAnalyticProductItemDto with _$InventoryAnalyticProductItemDto {
const InventoryAnalyticProductItemDto._();
const factory InventoryAnalyticProductItemDto({
@JsonKey(name: "id") String? id,
@JsonKey(name: "product_id") String? productId,
@JsonKey(name: "product_name") String? productName,
@JsonKey(name: "category_name") String? categoryName,
@JsonKey(name: "quantity") int? quantity,
@JsonKey(name: "reorder_level") int? reorderLevel,
@JsonKey(name: "unit_cost") num? unitCost,
@JsonKey(name: "total_value") int? totalValue,
@JsonKey(name: "total_in") int? totalIn,
@JsonKey(name: "total_out") int? totalOut,
@JsonKey(name: "is_low_stock") bool? isLowStock,
@JsonKey(name: "is_zero_stock") bool? isZeroStock,
@JsonKey(name: "updated_at") DateTime? updatedAt,
}) = _InventoryAnalyticProductItemDto;
factory InventoryAnalyticProductItemDto.fromJson(Map<String, dynamic> json) =>
_$InventoryAnalyticProductItemDtoFromJson(json);
// Mapper ke domain (opsional)
InventoryAnalyticProductItem toDomain() => InventoryAnalyticProductItem(
id: id ?? '',
productId: productId ?? '',
productName: productName ?? '',
categoryName: categoryName ?? '',
quantity: quantity ?? 0,
reorderLevel: reorderLevel ?? 0,
unitCost: unitCost ?? 0,
totalValue: totalValue ?? 0,
totalIn: totalIn ?? 0,
totalOut: totalOut ?? 0,
isLowStock: isLowStock ?? false,
isZeroStock: isZeroStock ?? false,
updatedAt: updatedAt ?? DateTime.now(),
);
}
@freezed
class InventoryAnalyticIngredientItemDto
with _$InventoryAnalyticIngredientItemDto {
const InventoryAnalyticIngredientItemDto._();
const factory InventoryAnalyticIngredientItemDto({
@JsonKey(name: "id") String? id,
@JsonKey(name: "ingredient_id") String? ingredientId,
@JsonKey(name: "ingredient_name") String? ingredientName,
@JsonKey(name: "unit_name") String? unitName,
@JsonKey(name: "quantity") int? quantity,
@JsonKey(name: "reorder_level") int? reorderLevel,
@JsonKey(name: "unit_cost") num? unitCost,
@JsonKey(name: "total_value") int? totalValue,
@JsonKey(name: "total_in") int? totalIn,
@JsonKey(name: "total_out") int? totalOut,
@JsonKey(name: "is_low_stock") bool? isLowStock,
@JsonKey(name: "is_zero_stock") bool? isZeroStock,
@JsonKey(name: "updated_at") DateTime? updatedAt,
}) = _InventoryAnalyticIngredientItemDto;
factory InventoryAnalyticIngredientItemDto.fromJson(
Map<String, dynamic> json,
) => _$InventoryAnalyticIngredientItemDtoFromJson(json);
// Mapper ke domain (opsional)
InventoryAnalyticIngredientItem toDomain() => InventoryAnalyticIngredientItem(
id: id ?? '',
ingredientId: ingredientId ?? '',
ingredientName: ingredientName ?? '',
unitName: unitName ?? '',
quantity: quantity ?? 0,
reorderLevel: reorderLevel ?? 0,
unitCost: unitCost ?? 0,
totalValue: totalValue ?? 0,
totalIn: totalIn ?? 0,
totalOut: totalOut ?? 0,
isLowStock: isLowStock ?? false,
isZeroStock: isZeroStock ?? false,
updatedAt: updatedAt ?? DateTime.now(),
);
}