class StockInItem { final int? orderId; final int productId; final double quantity; final double unitPrice; final double totalPrice; final String? batchNo; final String? productionDate; // Denormalized for display final String? productName; final String? productCode; final String? productSeries; final String? productSpec; final String? productUnit; final String? productOrigin; final String? productShelfLife; final String? productStorage; const StockInItem({ this.orderId, required this.productId, required this.quantity, required this.unitPrice, required this.totalPrice, this.batchNo, this.productionDate, this.productName, this.productCode, this.productSeries, this.productSpec, this.productUnit, this.productOrigin, this.productShelfLife, this.productStorage, }); factory StockInItem.fromJson(Map json) => StockInItem( orderId: json['order_id'] != null ? (json['order_id'] as num).toInt() : null, productId: (json['product_id'] as num).toInt(), quantity: (json['quantity'] as num).toDouble(), unitPrice: (json['unit_price'] as num).toDouble(), totalPrice: (json['total_price'] as num).toDouble(), batchNo: json['batch_no'] as String?, productionDate: json['production_date'] as String?, productName: (json['product'] as Map?)?['name'] as String?, productCode: (json['product'] as Map?)?['code'] as String?, productSeries: (json['product'] as Map?)?['series'] as String?, productSpec: (json['product'] as Map?)?['spec'] as String?, productUnit: (json['product'] as Map?)?['unit'] as String?, productOrigin: ((json['product'] as Map?)?['origin'] as Map?)?['name'] as String?, productShelfLife: ((json['product'] as Map?)?['shelf_life'] as Map?)?['name'] as String?, productStorage: ((json['product'] as Map?)?['storage'] as Map?)?['name'] as String?, ); Map toJson() => { 'product_id': productId, 'quantity': quantity, 'unit_price': unitPrice, 'total_price': totalPrice, if (batchNo != null) 'batch_no': batchNo, if (productionDate != null) 'production_date': productionDate, }; } class StockInOrder { final int id; final String orderNo; final String? type; final int warehouseId; final String? warehouseName; final int? partnerId; final String? partnerName; final int? operatorId; final String? operatorName; final int? reviewerId; final String? reviewerName; final String status; // draft | pending | approved | rejected final String? orderDate; final String? reviewedAt; final double? totalAmount; final String? remark; final List items; const StockInOrder({ required this.id, required this.orderNo, this.type, required this.warehouseId, this.warehouseName, this.partnerId, this.partnerName, this.operatorId, this.operatorName, this.reviewerId, this.reviewerName, required this.status, this.orderDate, this.reviewedAt, this.totalAmount, this.remark, this.items = const [], }); factory StockInOrder.fromJson(Map json) => StockInOrder( id: (json['id'] as num).toInt(), orderNo: json['order_no'] as String, type: json['type'] as String?, warehouseId: (json['warehouse_id'] as num).toInt(), warehouseName: (json['warehouse'] as Map?)?['name'] as String?, partnerId: json['partner_id'] != null ? (json['partner_id'] as num).toInt() : null, partnerName: (json['partner'] as Map?)?['name'] as String?, operatorId: json['operator_id'] != null ? (json['operator_id'] as num).toInt() : null, operatorName: (json['operator'] as Map?)?['real_name'] as String?, reviewerId: json['reviewer_id'] != null ? (json['reviewer_id'] as num).toInt() : null, reviewerName: (json['reviewer'] as Map?)?['real_name'] as String?, status: json['status'] as String, orderDate: json['order_date'] as String?, reviewedAt: json['reviewed_at'] as String?, totalAmount: json['total_amount'] != null ? (json['total_amount'] as num).toDouble() : null, remark: json['remark'] as String?, items: json['items'] != null ? (json['items'] as List) .map((e) => StockInItem.fromJson(e as Map)) .toList() : [], ); }