class DashboardAnalyticResponseModel { final bool success; final DashboardAnalyticData data; final dynamic errors; DashboardAnalyticResponseModel({ required this.success, required this.data, this.errors, }); /// Khusus untuk JSON string factory DashboardAnalyticResponseModel.fromJson(Map json) => DashboardAnalyticResponseModel.fromMap(json); /// Untuk menerima Map biasa (bukan dari JSON string) factory DashboardAnalyticResponseModel.fromMap(Map map) { return DashboardAnalyticResponseModel( success: map['success'] ?? false, data: DashboardAnalyticData.fromMap(map['data'] ?? {}), errors: map['errors'], ); } Map toJson() => toMap(); Map toMap() => { 'success': success, 'data': data.toMap(), 'errors': errors, }; } class DashboardAnalyticData { final String organizationId; final String outletId; final String dateFrom; final String dateTo; final DashboardOverview overview; final List topProducts; final List paymentMethods; final List recentSales; DashboardAnalyticData({ required this.organizationId, required this.outletId, required this.dateFrom, required this.dateTo, required this.overview, required this.topProducts, required this.paymentMethods, required this.recentSales, }); factory DashboardAnalyticData.fromMap(Map map) => DashboardAnalyticData( organizationId: map['organization_id'], outletId: map['outlet_id'], dateFrom: map['date_from'], dateTo: map['date_to'], overview: DashboardOverview.fromMap(map['overview']), topProducts: List.from( map['top_products']?.map((x) => TopProduct.fromMap(x))), paymentMethods: List.from(map['payment_methods'] ?.map((x) => PaymentMethodAnalytic.fromMap(x))), recentSales: List.from( map['recent_sales']?.map((x) => RecentSale.fromMap(x))), ); Map toMap() => { 'organization_id': organizationId, 'outlet_id': outletId, 'date_from': dateFrom, 'date_to': dateTo, 'overview': overview.toMap(), 'top_products': topProducts.map((x) => x.toMap()).toList(), 'payment_methods': paymentMethods.map((x) => x.toMap()).toList(), 'recent_sales': recentSales.map((x) => x.toMap()).toList(), }; } class DashboardOverview { final int totalSales; final int totalOrders; final double averageOrderValue; final int totalCustomers; final int voidedOrders; final int refundedOrders; DashboardOverview({ required this.totalSales, required this.totalOrders, required this.averageOrderValue, required this.totalCustomers, required this.voidedOrders, required this.refundedOrders, }); factory DashboardOverview.fromMap(Map map) => DashboardOverview( totalSales: map['total_sales'], totalOrders: map['total_orders'], averageOrderValue: map['average_order_value']?.toDouble() ?? 0.0, totalCustomers: map['total_customers'], voidedOrders: map['voided_orders'], refundedOrders: map['refunded_orders'], ); Map toMap() => { 'total_sales': totalSales, 'total_orders': totalOrders, 'average_order_value': averageOrderValue, 'total_customers': totalCustomers, 'voided_orders': voidedOrders, 'refunded_orders': refundedOrders, }; } class TopProduct { final String productId; final String productName; final String categoryId; final String categoryName; final int quantitySold; final int revenue; final double averagePrice; final int orderCount; TopProduct({ required this.productId, required this.productName, required this.categoryId, required this.categoryName, required this.quantitySold, required this.revenue, required this.averagePrice, required this.orderCount, }); factory TopProduct.fromMap(Map map) => TopProduct( productId: map['product_id'], productName: map['product_name'], categoryId: map['category_id'], categoryName: map['category_name'], quantitySold: map['quantity_sold'], revenue: map['revenue'], averagePrice: map['average_price']?.toDouble() ?? 0.0, orderCount: map['order_count'], ); Map toMap() => { 'product_id': productId, 'product_name': productName, 'category_id': categoryId, 'category_name': categoryName, 'quantity_sold': quantitySold, 'revenue': revenue, 'average_price': averagePrice, 'order_count': orderCount, }; } class PaymentMethodAnalytic { final String paymentMethodId; final String paymentMethodName; final String paymentMethodType; final int totalAmount; final int orderCount; final int paymentCount; final double percentage; PaymentMethodAnalytic({ required this.paymentMethodId, required this.paymentMethodName, required this.paymentMethodType, required this.totalAmount, required this.orderCount, required this.paymentCount, required this.percentage, }); factory PaymentMethodAnalytic.fromMap(Map map) => PaymentMethodAnalytic( paymentMethodId: map['payment_method_id'], paymentMethodName: map['payment_method_name'], paymentMethodType: map['payment_method_type'], totalAmount: map['total_amount'], orderCount: map['order_count'], paymentCount: map['payment_count'], percentage: map['percentage']?.toDouble() ?? 0.0, ); Map toMap() => { 'payment_method_id': paymentMethodId, 'payment_method_name': paymentMethodName, 'payment_method_type': paymentMethodType, 'total_amount': totalAmount, 'order_count': orderCount, 'payment_count': paymentCount, 'percentage': percentage, }; } class RecentSale { final String date; final int sales; final int orders; final int items; final int tax; final int discount; final int netSales; RecentSale({ required this.date, required this.sales, required this.orders, required this.items, required this.tax, required this.discount, required this.netSales, }); factory RecentSale.fromMap(Map map) => RecentSale( date: map['date'], sales: map['sales'], orders: map['orders'], items: map['items'], tax: map['tax'], discount: map['discount'], netSales: map['net_sales'], ); Map toMap() => { 'date': date, 'sales': sales, 'orders': orders, 'items': items, 'tax': tax, 'discount': discount, 'net_sales': netSales, }; }