class SaleItem { final String productId; final String name; final double price; final int qty; final bool isReseller; SaleItem({ required this.productId, required this.name, required this.price, required this.qty, this.isReseller = false, }); double get subtotal => price * qty; factory SaleItem.fromJson(Map json) { return SaleItem( productId: json['product_id'] as String? ?? '', name: json['name'] as String, price: (json['price'] as num).toDouble(), qty: json['qty'] as int, isReseller: json['isReseller'] as bool? ?? false, ); } Map toJson() => { 'product_id': productId, 'name': name, 'price': price, 'qty': qty, 'isReseller': isReseller, }; } class Sale { final String id; final DateTime date; final String? userId; final List items; final double subtotal; final double discount; final double total; final double paid; final double change; final double totalCost; final bool isCancelled; final String paymentMethod; final String paymentStatus; final double dueAmount; final String? customerPhone; final Map? splitPayment; Sale({ required this.id, required this.date, this.userId, required this.items, required this.subtotal, required this.discount, required this.total, required this.paid, required this.change, required this.totalCost, this.isCancelled = false, this.paymentMethod = 'tunai', this.paymentStatus = 'paid', this.dueAmount = 0.0, this.customerPhone, this.splitPayment, }); factory Sale.fromJson(Map json) { return Sale( id: json['id'] as String, date: DateTime.parse(json['created_at'] as String), userId: json['user_id'] as String?, items: (json['items'] as List) .map((e) => SaleItem.fromJson(e as Map)) .toList(), subtotal: (json['subtotal'] as num).toDouble(), discount: (json['discount'] as num).toDouble(), total: (json['total'] as num).toDouble(), paid: (json['paid'] as num).toDouble(), change: (json['change'] as num).toDouble(), totalCost: (json['total_cost'] as num?)?.toDouble() ?? 0, isCancelled: json['is_cancelled'] as bool? ?? false, paymentMethod: json['payment_method'] as String? ?? 'tunai', paymentStatus: json['payment_status'] as String? ?? 'paid', dueAmount: (json['due_amount'] as num?)?.toDouble() ?? 0.0, customerPhone: json['customer_phone'] as String?, splitPayment: json['split_payment'] != null ? Map.from(json['split_payment'] as Map) : null, ); } Map toJson() => { 'id': id, 'created_at': date.toIso8601String(), 'user_id': userId, 'items': items.map((e) => e.toJson()).toList(), 'subtotal': subtotal, 'discount': discount, 'total': total, 'paid': paid, 'change': change, 'total_cost': totalCost, 'is_cancelled': isCancelled, 'payment_method': paymentMethod, 'payment_status': paymentStatus, 'due_amount': dueAmount, 'customer_phone': customerPhone, if (splitPayment != null && splitPayment!.isNotEmpty) 'split_payment': splitPayment, }; }