import 'dart:io'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:fcs/domain/vo/delivery_address.dart'; import 'package:fcs/domain/vo/shipment_status.dart'; class Package { String? id; String? trackingID; DateTime? currentStatusDate; List photoUrls; List shipmentHistory; List cartonIds; String? desc; String? status; String? fcsShipmentId; String? fcsShipmentNumber; String? userID; String? fcsID; String? userName; String? phoneNumber; String? senderFCSID; String? senderName; String? senderPhoneNumber; String? boxNumber; String? cargoDesc; String? market; bool isChecked; int rate; int weight; String? packageType; String? pickUpID; // List photos; String? remark; DateTime? arrivedDate; DeliveryAddress? deliveryAddress; //for packages in processing List photoFiles; int get amount => rate * weight; double get price => rate.toDouble() * weight; Package( {this.id, this.trackingID, this.userID, this.userName, this.fcsID, this.phoneNumber, this.fcsShipmentId, this.fcsShipmentNumber, this.senderFCSID, this.senderName, this.boxNumber, this.rate = 0, this.weight = 0, this.packageType, this.pickUpID, this.remark, this.status, this.arrivedDate, this.cargoDesc, this.market, this.shipmentHistory = const [], this.currentStatusDate, this.photoUrls = const [], this.desc, this.deliveryAddress, this.isChecked = false, this.photoFiles = const [], this.senderPhoneNumber, this.cartonIds = const []}); factory Package.fromMap(Map map, String docID) { var currentStatusDate = map['status_date'] != null ? (map['status_date'] as Timestamp) : null; List shipmentStatus = map['all_status'] == null ? [] : List.from(map['all_status']) .map((e) => ShipmentStatus.fromMap(Map.from(e))) .toList(); List photoUrls = map['photo_urls'] == null ? [] : List.from(map['photo_urls']); var deliveryAddress = map['delivery_address']; var da = deliveryAddress != null ? DeliveryAddress.fromMap(deliveryAddress, deliveryAddress["id"]) : null; List cartonIds = map['carton_ids'] == null ? [] : List.from(map['carton_ids']); return Package( id: docID, userID: map['user_id'] ?? "", fcsID: map['fcs_id'], trackingID: map['tracking_id'], market: map['market'] ?? "", userName: map['user_name'] ?? "", phoneNumber: map['phone_number'] ?? "", remark: map['remark'] ?? "", desc: map['desc'] ?? "", status: map['status'], senderFCSID: map['sender_fcs_id'] ?? "", senderName: map['sender_name'] ?? "", senderPhoneNumber: map['sender_phone_number'] ?? "", fcsShipmentId: map['fcs_shipment_id'] ?? "", fcsShipmentNumber: map['fcs_shipment_number'] ?? "", deliveryAddress: da, currentStatusDate: currentStatusDate?.toDate().toLocal(), photoUrls: photoUrls, shipmentHistory: shipmentStatus, cartonIds: cartonIds); } Map toJsonForReceiving() => { 'id': id, 'tracking_id': trackingID, 'fcs_id': fcsID, "remark": remark, "photo_urls": photoUrls }; Map toJsonForProcessing() => { 'id': id, 'fcs_id': fcsID, 'sender_fcs_id': senderFCSID, 'fcs_shipment_id': fcsShipmentId, 'tracking_id': trackingID, 'market': market, "desc": desc, "remark": remark, "photo_urls": photoUrls }; factory Package.fromJson(Map json) { return Package( id: json['id'], trackingID: json['tracking_id'], market: json['market'], userName: json['user_name'], phoneNumber: json['phone_number'], senderFCSID: json['sender_fcs_id'], senderName: json['sender_name'], senderPhoneNumber: json['sender_phone_number'], status: json['status'], currentStatusDate: DateTime.parse(json['status_date'])); } bool isChangedForEditReceiving(Package package) { return package.trackingID != trackingID || package.remark != remark || package.fcsID != fcsID; } bool isChangedForEditProcessing(Package package) { return package.fcsID != fcsID || package.senderFCSID != senderFCSID || package.market != market || package.desc != desc || package.remark != remark || package.photoUrls != photoUrls || package.fcsShipmentId != fcsShipmentId; } @override bool operator ==(Object other) => other is Package && other.id == id; @override int get hashCode => id.hashCode; @override String toString() { return 'Package{id: $id, status: $status, market:$market, trackingID: $trackingID,}'; } }