enum OrderStatus { pending, assigned, accepted, enRoute, delivered, notDelivered, rescheduled, cancelled, rejected, } enum PaymentMethod { cash, yape, plin, transfer, credit, notCollected } class DeliveryOrderItem { const DeliveryOrderItem({ this.id, this.orderNoteItemId, this.itemId, this.presentationId, this.presentationDescription, this.presentationFactor, this.pointsEarn, this.pointsRedeem, this.pointRule, required this.name, required this.quantity, required this.unitPrice, required this.total, }); final String? id; final int? orderNoteItemId; final int? itemId; final int? presentationId; final String? presentationDescription; final double? presentationFactor; final double? pointsEarn; final double? pointsRedeem; final String? pointRule; final String name; final double quantity; final double unitPrice; final double total; factory DeliveryOrderItem.fromJson( Map json, ) => DeliveryOrderItem( id: json['id']?.toString(), orderNoteItemId: int.tryParse( '${json['order_note_item_id'] ?? json['id'] ?? ''}', ), itemId: int.tryParse('${json['item_id'] ?? ''}'), presentationId: int.tryParse('${json['item_unit_type_id'] ?? ''}'), presentationDescription: (json['presentation_description'] ?? json['presentation']?['description']) ?.toString(), presentationFactor: double.tryParse( '${json['presentation_factor'] ?? json['presentation']?['quantity_unit'] ?? ''}', ), pointsEarn: double.tryParse('${json['points_earn'] ?? ''}'), pointsRedeem: double.tryParse('${json['points_redeem'] ?? ''}'), pointRule: json['point_rule']?.toString(), name: '${json['name'] ?? 'Producto'}', quantity: double.tryParse('${json['quantity'] ?? 0}') ?? 0, unitPrice: double.tryParse('${json['unit_price'] ?? 0}') ?? 0, total: double.tryParse('${json['total'] ?? 0}') ?? 0, ); } extension OrderStatusLabel on OrderStatus { String get label => switch (this) { OrderStatus.pending => 'Pendiente', OrderStatus.assigned => 'Asignado', OrderStatus.accepted => 'Aceptado', OrderStatus.enRoute => 'En ruta', OrderStatus.delivered => 'Entregado', OrderStatus.notDelivered => 'No entregado', OrderStatus.rescheduled => 'Reprogramado', OrderStatus.cancelled => 'Cancelado', OrderStatus.rejected => 'Rechazado', }; } extension OrderStatusApiValue on OrderStatus { String get apiValue => switch (this) { OrderStatus.pending => 'pending', OrderStatus.assigned => 'assigned', OrderStatus.accepted => 'accepted', OrderStatus.enRoute => 'en_route', OrderStatus.delivered => 'delivered', OrderStatus.notDelivered => 'not_delivered', OrderStatus.rescheduled => 'rescheduled', OrderStatus.cancelled => 'cancelled', OrderStatus.rejected => 'rejected', }; } class DeliveryOrder { const DeliveryOrder({ required this.id, required this.number, required this.customer, required this.address, required this.total, required this.status, this.items = const [], this.deliveryAdjustments = const [], this.phone, this.paymentStatus, this.balanceDue, this.adjustmentStatus, this.reference, this.latitude, this.longitude, }); final String id; final String number; final String customer; final String address; final double total; final OrderStatus status; final List items; final List> deliveryAdjustments; final String? phone; final String? paymentStatus; final double? balanceDue; final String? adjustmentStatus; final String? reference; final double? latitude; final double? longitude; factory DeliveryOrder.fromJson(Map json) => DeliveryOrder( id: '${json['id'] ?? ''}', number: '${json['number'] ?? json['order_number'] ?? 'Pedido'}', customer: '${json['customer']?['name'] ?? json['customer_name'] ?? 'Cliente'}', address: '${json['address'] ?? json['delivery_address'] ?? 'Dirección no registrada'}', total: double.tryParse( '${json['final_total'] ?? json['delivery_total'] ?? json['total'] ?? 0}', ) ?? 0, status: _parseStatus( '${json['delivery_status'] ?? json['status'] ?? 'pending'}', ), items: (json['items'] is List) ? (json['items'] as List) .whereType>() .map(DeliveryOrderItem.fromJson) .toList() : const [], deliveryAdjustments: (json['delivery_adjustments'] is List) ? (json['delivery_adjustments'] as List) .whereType() .map((item) => item.cast()) .toList() : const [], phone: (json['phone'] ?? json['customer']?['phone'] ?? json['customer']?['number']) ?.toString(), paymentStatus: json['payment_status']?.toString(), balanceDue: double.tryParse( '${json['balance_due'] ?? json['final_total'] ?? json['delivery_total'] ?? json['total'] ?? 0}', ), adjustmentStatus: json['adjustment_status']?.toString(), reference: json['reference']?.toString(), latitude: double.tryParse('${json['latitude']}'), longitude: double.tryParse('${json['longitude']}'), ); static OrderStatus _parseStatus(String value) => switch (value.toLowerCase()) { 'assigned' => OrderStatus.assigned, 'accepted' => OrderStatus.accepted, 'en_route' || 'en-route' || 'en ruta' => OrderStatus.enRoute, 'delivered' || 'entregado' => OrderStatus.delivered, 'not_delivered' || 'no entregado' => OrderStatus.notDelivered, 'rescheduled' || 'reprogramado' => OrderStatus.rescheduled, 'cancelled' || 'canceled' || 'cancelado' => OrderStatus.cancelled, 'rejected' || 'rechazado' => OrderStatus.rejected, _ => OrderStatus.pending, }; DeliveryOrder copyWith({ OrderStatus? status, double? latitude, double? longitude, }) => DeliveryOrder( id: id, number: number, customer: customer, address: address, total: total, status: status ?? this.status, phone: phone, paymentStatus: paymentStatus, balanceDue: balanceDue, adjustmentStatus: adjustmentStatus, reference: reference, latitude: latitude ?? this.latitude, longitude: longitude ?? this.longitude, items: items, deliveryAdjustments: deliveryAdjustments, ); }