diff --git a/lib/domain/constants.dart b/lib/domain/constants.dart index f7cb5cf..865a62a 100644 --- a/lib/domain/constants.dart +++ b/lib/domain/constants.dart @@ -69,6 +69,7 @@ const privilege_delivery = "deli"; const privilege_invoice = "inv"; const privilege_processing = "pr"; const privilege_receiving = "rc"; +const privilege_pickup = "pku"; // Pickup types const shipment_local_pickup = "Local pickup"; diff --git a/lib/domain/entities/carton.dart b/lib/domain/entities/carton.dart index 22254ac..c17940e 100644 --- a/lib/domain/entities/carton.dart +++ b/lib/domain/entities/carton.dart @@ -64,9 +64,8 @@ class Carton { // String get packageNumber => // shipmentNumber + "-" + receiverNumber + " #" + boxNumber; - double get actualWeight => cargoTypes == null - ? 0 - : cargoTypes.fold(0, (p, e) => e.weight + p); + double get actualWeight => + cargoTypes == null ? 0 : cargoTypes.fold(0, (p, e) => e.weight + p); int getShipmentWeight(double volumetricRatio) { if (length == null || @@ -110,13 +109,12 @@ class Carton { double wd = sw - aw; wd = wd - rate.diffDiscountWeight; double wdAmount = wd > 0 ? wd * rate.diffWeightRate : 0; - DiscountByWeight discountByWeight = rate.getDiscountByWeight(aw); double total = 0; cargoTypes.forEach((e) { - double r = e.rate - - (discountByWeight != null ? (discountByWeight.discount) : 0); + double r = + e.rate - (discountByWeight != null ? (discountByWeight.discount) : 0); double amount = e.weight * r; total += amount; }); @@ -194,7 +192,8 @@ class Carton { } factory Carton.fromMap(Map map, String docID) { - var _arrivedDate = (map['arrived_date'] as Timestamp); + var _arrivedDate = + map['arrived_date'] == null ? null : (map['arrived_date'] as Timestamp); var da = map['delivery_address']; var _da = da != null ? DeliveryAddress.fromMap(da, da["id"]) : null; var cargoTypesMaps = diff --git a/lib/domain/entities/rate.dart b/lib/domain/entities/rate.dart index 54442e8..50f0f8c 100644 --- a/lib/domain/entities/rate.dart +++ b/lib/domain/entities/rate.dart @@ -16,10 +16,12 @@ class Rate { DiscountByWeight getDiscountByWeight(double weight) { discountByWeights.sort((d1, d2) => d2.weight.compareTo(d1.weight)); - return discountByWeights.firstWhere((e) => e.weight < weight); + return discountByWeights.firstWhere((e) => e.weight < weight, + orElse: () => DiscountByWeight()); } - CargoType get defaultCargoType => cargoTypes.firstWhere((e) => e.name == "General"); + CargoType get defaultCargoType => + cargoTypes.firstWhere((e) => e.name == "General"); Rate( {this.deliveryFee = 0, diff --git a/lib/domain/vo/privilege.dart b/lib/domain/vo/privilege.dart index 85907a2..1a59a71 100644 --- a/lib/domain/vo/privilege.dart +++ b/lib/domain/vo/privilege.dart @@ -43,6 +43,8 @@ class Privilege { iconData = FontAwesome.dropbox; } else if (this.id == privilege_receiving) { iconData = MaterialCommunityIcons.inbox_arrow_down; + } else if (this.id == privilege_pickup) { + iconData = FontAwesome.dropbox; } else { iconData = MaterialCommunityIcons.account_question; } diff --git a/lib/pages/delivery/model/delivery_model.dart b/lib/pages/delivery/model/delivery_model.dart index 235f820..97da1e9 100644 --- a/lib/pages/delivery/model/delivery_model.dart +++ b/lib/pages/delivery/model/delivery_model.dart @@ -4,17 +4,17 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:fcs/data/services/services.dart'; import 'package:fcs/domain/constants.dart'; import 'package:fcs/domain/entities/carton.dart'; -import 'package:fcs/domain/vo/message.dart'; import 'package:fcs/helpers/paginator.dart'; import 'package:fcs/pages/main/model/base_model.dart'; import 'package:logging/logging.dart'; class DeliveryModel extends BaseModel { final log = Logger('DeliveryModel'); - List get cartons => - _selectedIndex == 1 ? _cartons : List.from(_delivered.values); + List get cartons => _selectedIndex == 1 + ? _cartons + : List.from(_delivered?.values ?? []); - late Paginator _delivered; + Paginator? _delivered; int _selectedIndex = 1; bool isLoading = false; List _cartons = []; @@ -31,9 +31,9 @@ class DeliveryModel extends BaseModel { _selectedIndex = 1; _loadCartons(); - if (_delivered != null) _delivered.close(); + if (_delivered != null) _delivered!.close(); _delivered = _getDelivered(); - _delivered.load(); + _delivered!.load(); } Future _loadCartons() async { @@ -57,7 +57,8 @@ class DeliveryModel extends BaseModel { _cartons.clear(); _cartons = snapshot.docs.map((documentSnapshot) { var s = Carton.fromMap( - documentSnapshot.data as Map, documentSnapshot.id); + documentSnapshot.data as Map, + documentSnapshot.id); return s; }).toList(); notifyListeners(); @@ -82,10 +83,10 @@ class DeliveryModel extends BaseModel { } Future loadMore() async { - if (_delivered.ended || _selectedIndex == 1) return; + if (_delivered!.ended || _selectedIndex == 1) return; isLoading = true; notifyListeners(); - await _delivered.load(onFinished: () { + await _delivered!.load(onFinished: () { isLoading = false; notifyListeners(); }); @@ -94,7 +95,7 @@ class DeliveryModel extends BaseModel { Future refresh() async { if (_selectedIndex == 1) return; - await _delivered.refresh(onFinished: () { + await _delivered!.refresh(onFinished: () { notifyListeners(); }); } @@ -106,7 +107,7 @@ class DeliveryModel extends BaseModel { @override logout() async { if (listener != null) await listener!.cancel(); - if (_delivered != null) _delivered.close(); + if (_delivered != null) _delivered!.close(); _cartons = []; } diff --git a/lib/pages/processing/processing_info.dart b/lib/pages/processing/processing_info.dart index d15d0c9..2f15404 100644 --- a/lib/pages/processing/processing_info.dart +++ b/lib/pages/processing/processing_info.dart @@ -39,7 +39,8 @@ class _ProcessingInfoState extends State { initPackage(widget.package!); } - initPackage(Package package) { + initPackage(Package? package) { + if (package == null) return; setState(() { _package = package; multiImgController.setImageUrls = package.photoUrls; @@ -69,37 +70,37 @@ class _ProcessingInfoState extends State { iconData: Icons.phone, ); final customerNameBox = DisplayText( - text:_package!=null? _package!.userName:"", + text: _package != null ? _package!.userName : "", labelTextKey: "processing.consignee.name", iconData: Icons.perm_identity, ); var senderFcsIDBox = DisplayText( - text:_package!=null? _package!.senderFCSID:"", + text: _package != null ? _package!.senderFCSID : "", labelTextKey: "processing.fcs.id", icon: FcsIDIcon(), ); final senderPhoneNumberBox = DisplayText( - text: _package!=null?_package!.senderPhoneNumber:"", + text: _package != null ? _package!.senderPhoneNumber : "", labelTextKey: "processing.phone", iconData: Icons.phone, ); final senderNameBox = DisplayText( - text:_package!=null? _package!.senderName:"", + text: _package != null ? _package!.senderName : "", labelTextKey: "processing.shipper.name", iconData: Icons.perm_identity, ); final marketBox = DisplayText( - text:_package!=null? _package!.market : "-", + text: _package != null ? _package!.market : "-", labelTextKey: "processing.market", iconData: Icons.store, ); final descBox = DisplayText( - text:_package!=null? _package!.desc : "-", + text: _package != null ? _package!.desc : "-", labelTextKey: "processing.desc", iconData: MaterialCommunityIcons.message_text_outline, ); final remarkBox = DisplayText( - text:_package!=null? _package!.remark : "-", + text: _package != null ? _package!.remark : "-", labelTextKey: "processing.remark", iconData: Entypo.new_message, ); @@ -175,7 +176,7 @@ class _ProcessingInfoState extends State { _package!.photoUrls.length == 0 ? Container() : img, StatusTree( shipmentHistory: _package!.shipmentHistory, - currentStatus: _package!.status??""), + currentStatus: _package!.status ?? ""), SizedBox( height: 20, ) @@ -223,7 +224,7 @@ class _ProcessingInfoState extends State { PackageModel packageModel = Provider.of(context, listen: false); Package? p = await packageModel.getPackage(_package!.id!); - initPackage(p!); + initPackage(p); } } } diff --git a/lib/pages/receiving/receiving_info.dart b/lib/pages/receiving/receiving_info.dart index d029bf8..eba05cb 100644 --- a/lib/pages/receiving/receiving_info.dart +++ b/lib/pages/receiving/receiving_info.dart @@ -40,7 +40,8 @@ class _ReceivingInfoState extends State { initPackage(widget.package!); } - initPackage(Package package) { + initPackage(Package? package) { + if (package == null) return; multiImgController.setImageUrls = package.photoUrls; setState(() { _package = package; @@ -150,7 +151,7 @@ class _ReceivingInfoState extends State { PackageModel packageModel = Provider.of(context, listen: false); var pkg = await packageModel.getPackage(widget.package!.id!); - initPackage(pkg!); + initPackage(pkg); } _delete() { diff --git a/lib/pages/widgets/my_data_table.dart b/lib/pages/widgets/my_data_table.dart index f86925f..f198e21 100644 --- a/lib/pages/widgets/my_data_table.dart +++ b/lib/pages/widgets/my_data_table.dart @@ -622,7 +622,6 @@ class MyDataTable extends StatelessWidget { final List tableColumns = (columns.length + (showCheckboxColumn ? 1 : 0)) as List; - final List tableRows = List.generate( rows.length + 1, // the +1 is for the header row (int index) {