diff --git a/assets/local/localization_en.json b/assets/local/localization_en.json index 05fb5e4..dec1e6e 100644 --- a/assets/local/localization_en.json +++ b/assets/local/localization_en.json @@ -580,10 +580,14 @@ "pickup.edit.title":"Pickup", "pickup.pickup_number":"Pickup Number", "pickup.date":"Pickup Date", - "pickup.time":"Pickup Time", + "pickup.from_time":"From Time", + "pickup.to_time":"To Time", "pickup.status":"Status", "pickup.desc":"Description", "pickup.remark":"Remark", + "pickup.staff.name":"Staff", "pickup.edit.complete.btn":"Complete pickup", + "pickup.continue.btn":"Continue to complete", + "pickup.confirm.complete":"Complete confirm?", "Pickup End ===================================================================":"" } \ No newline at end of file diff --git a/assets/local/localization_mu.json b/assets/local/localization_mu.json index 09c17f3..73cfb65 100644 --- a/assets/local/localization_mu.json +++ b/assets/local/localization_mu.json @@ -573,15 +573,19 @@ "Processing End ================================================================":"", "Pickup Start ================================================================":"", - "pickup.title":"Pickups", - "pickup.info.title":"Pickup", - "pickup.edit.title":"Pickup", - "pickup.pickup_number":"Pickup Number", - "pickup.date":"Pickup Date", - "pickup.time":"Pickup Time", + "pickup.title":"ပို့ဆောင်ခြင်းများ", + "pickup.info.title":"ပို့ဆောင်ခြင်း", + "pickup.edit.title":"ပို့ဆောင်ခြင်း", + "pickup.pickup_number":"ပို့ဆောင်ခြင်း နံပါတ်", + "pickup.date":"ပို့ဆောင်ခြင်း ရက်စွဲ", + "pickup.from_time":"အချိန်(မှ)", + "pickup.to_time":"အချိန်(တွင်း)", "pickup.status":"အခြေအနေ", "pickup.desc":"ဖော်ပြချက်", "pickup.remark":"မှတ်ချက်", - "pickup.edit.complete.btn":"Complete pickup", + "pickup.staff.name":"ဝန်ထမ်း", + "pickup.edit.complete.btn":"ပို့ဆောင်ခြင်း ပြီးဆုံးသည်", + "pickup.continue.btn":"Continue to complete", + "pickup.confirm.complete":"Complete confirm?", "Pickup End ===================================================================":"" } \ No newline at end of file diff --git a/lib/domain/entities/pickup.dart b/lib/domain/entities/pickup.dart new file mode 100644 index 0000000..d462337 --- /dev/null +++ b/lib/domain/entities/pickup.dart @@ -0,0 +1,90 @@ +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:fcs/domain/entities/package.dart'; + +class Pickup { + String? id; + DateTime? pickupDate; + String? fromTime; + String? toTime; + //for consignee + String? userID; + String? userName; + String? userPhoneNumber; + + String? staffId; + String? staffName; + String? staffPhoneNumber; + //for shipper + String? fcsID; + String? shipperName; + String? shipperPhoneNumber; + String? status; + + List packages; + + Pickup( + {this.id, + this.userID, + this.userName, + this.userPhoneNumber, + this.staffId, + this.staffName, + this.staffPhoneNumber, + this.pickupDate, + this.fromTime, + this.toTime, + this.fcsID, + this.shipperName, + this.shipperPhoneNumber, + this.status, + this.packages = const []}); + + @override + bool operator ==(Object other) => other is Pickup && other.id == id; + + @override + int get hashCode => id.hashCode; + + bool isChangedForEdit(Pickup Pickup) { + return Pickup.userID != this.userID || + Pickup.fcsID != this.fcsID || + Pickup.packages != this.packages; + } + + factory Pickup.fromMap(Map map, String id) { + var _pickupDate = (map['pickup_date'] as Timestamp); + return Pickup( + id: id, + pickupDate: _pickupDate.toDate(), + fromTime: map['from_time'], + toTime: map['to_time'], + staffId: map['staff_id'], + staffName: map['staff_name'], + staffPhoneNumber: map['staff_phone_number'], + userID: map['user_id'], + userName: map['user_name'], + userPhoneNumber: map['user_phone_number'], + status: map['status']); + } + + Map toMap() { + return { + "id": id, + "pickup_date": pickupDate?.toUtc().toIso8601String(), + 'from_time': fromTime, + 'to_time': toTime, + 'staff_id': staffId, + 'staff_name': staffName, + "staff_phone_number": staffPhoneNumber, + 'user_id': userID, + 'user_name': userName, + 'user_phone_number': userPhoneNumber, + 'status': status, + }; + } + + @override + String toString() { + return 'Pickup{id: $id}'; + } +} diff --git a/lib/pages/pickup/model/pickup_model.dart b/lib/pages/pickup/model/pickup_model.dart new file mode 100644 index 0000000..c09821d --- /dev/null +++ b/lib/pages/pickup/model/pickup_model.dart @@ -0,0 +1,54 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:fcs/domain/entities/package.dart'; +import 'package:fcs/domain/entities/processing.dart'; +import 'package:fcs/pages/main/model/base_model.dart'; +import 'package:fcs/pagination/paginator_listener.dart'; +import 'package:logging/logging.dart'; + +class PickupModel extends BaseModel { + // List pickups = []; + final log = Logger('PickupModel'); + + StreamSubscription? listener; + + PaginatorListener? pickups; + + int _menuSelectedIndex = 1; + + set menuSelectedIndex(int index) { + _menuSelectedIndex = index; + + // _loadPackages(_menuSelectedIndex == 2); + // _loadCustomerPackages(_menuSelectedIndex == 2); + + notifyListeners(); + } + + int get menuSelectedIndex => _menuSelectedIndex; + + void initUser(user) { + super.initUser(user); + } + + void privilegeChanged() { + if (user != null) { + _initData(); + } + } + + Future _initData() async {} + + @override + logout() async { + if (listener != null) await listener!.cancel(); + if (pickups != null) pickups!.close(); + // pickups = []; + } + + Future createProcessing(Processing processing) async {} + + Future updateProcessing(Processing processing) async {} +} diff --git a/lib/pages/pickup/model/processing_model.dart b/lib/pages/pickup/model/processing_model.dart deleted file mode 100644 index 0977245..0000000 --- a/lib/pages/pickup/model/processing_model.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'dart:async'; -import 'dart:io'; - -import 'package:cloud_firestore/cloud_firestore.dart'; -import 'package:fcs/domain/entities/package.dart'; -import 'package:fcs/domain/entities/processing.dart'; -import 'package:fcs/pages/main/model/base_model.dart'; -import 'package:logging/logging.dart'; - -class ProcessingModel extends BaseModel { - List processings = []; - final log = Logger('ProcessingModel'); - - StreamSubscription? listener; - - void initUser(user) { - super.initUser(user); - } - - @override - logout() async { - if (listener != null) await listener!.cancel(); - - processings = []; - } - - Future createProcessing(Processing processing) async {} - - Future updateProcessing(Processing processing) async {} -} diff --git a/lib/pages/pickup/pickup_editor.dart b/lib/pages/pickup/pickup_editor.dart index 1f42a87..c3641b0 100644 --- a/lib/pages/pickup/pickup_editor.dart +++ b/lib/pages/pickup/pickup_editor.dart @@ -64,18 +64,17 @@ class _PickupEditorState extends State { Container( width: 150, child: DisplayText( - text: '', - labelTextKey: "pickup.time", - iconData: Icons.timer, + text: '9:00 AM', + labelTextKey: "pickup.from_time", + iconData: MaterialCommunityIcons.clock_start, ), ), Container( width: 150, child: DisplayText( - text: '', - labelTextKey: "pickup.time", - iconData: Icons.timer, - ), + text: '12:00 AM', + labelTextKey: "pickup.to_time", + iconData: MaterialCommunityIcons.clock_end), ) ], ); @@ -94,18 +93,25 @@ class _PickupEditorState extends State { final completeProcessingBtn = fcsButton( context, getLocalString(context, 'pickup.edit.complete.btn'), - callack: _completeProcessing, + callack: _confirmComplete, ); - final descBox = DisplayText( - text: _package!.desc ?? "", - labelTextKey: 'processing.desc', - iconData: MaterialCommunityIcons.message_text_outline, + + final staffNameBox = DisplayText( + text: _package != null ? _package!.userName : "", + labelTextKey: "pickup.staff.name", + iconData: Icons.perm_identity, ); final remarkBox = InputText( labelTextKey: 'pickup.remark', iconData: Entypo.new_message, controller: _remarkCtl); + final statusBox = DisplayText( + text: _package != null ? _package!.status : "", + labelTextKey: "pickup.status", + iconData: Icons.av_timer, + ); + final img = MultiImageFile( enabled: true, controller: multiImgController, @@ -144,7 +150,8 @@ class _PickupEditorState extends State { pickupNumberBox, pickupDateBox, timeBox, - descBox, + staffNameBox, + statusBox, remarkBox, img, _package!.status == 'packed' @@ -236,7 +243,7 @@ class _PickupEditorState extends State { ); } - _completeProcessing() async { + _completePickup() async { if (_user!.fcsID == null || _user!.fcsID == "") { showMsgDialog(context, "Error", "Expected FCS-ID"); return; @@ -247,12 +254,12 @@ class _PickupEditorState extends State { PackageModel packageModel = Provider.of(context, listen: false); try { - _package!.fcsID = _user!.fcsID; - _package!.desc = _descCtl.text; - _package!.remark = _remarkCtl.text; - _package!.market = selectedMarket!; - await packageModel.updateProcessing(_package!, - multiImgController.getAddedFile, multiImgController.getDeletedUrl); + // _package!.fcsID = _user!.fcsID; + // _package!.desc = _descCtl.text; + // _package!.remark = _remarkCtl.text; + // _package!.market = selectedMarket!; + // await packageModel.updateProcessing(_package!, + // multiImgController.getAddedFile, multiImgController.getDeletedUrl); Navigator.pop(context); } catch (e) { showMsgDialog(context, "Error", e.toString()); @@ -263,6 +270,12 @@ class _PickupEditorState extends State { } } + _confirmComplete() { + showConfirmDialog(context, "pickup.confirm.complete", () { + _completePickup(); + }); + } + isDataChanged() { if (isNew) { return _user!.fcsID != "" || diff --git a/lib/pages/pickup/pickup_info.dart b/lib/pages/pickup/pickup_info.dart index 18e23ca..04e678f 100644 --- a/lib/pages/pickup/pickup_info.dart +++ b/lib/pages/pickup/pickup_info.dart @@ -54,55 +54,29 @@ class _PickupInfoState extends State { @override Widget build(BuildContext context) { final pickupNumberBox = DisplayText( - text: _package != null ? _package!.trackingID : '', + text: _package != null ? '210502-ASDFRE' : '210502-ASDFRE', labelTextKey: "pickup.pickup_number", iconData: SimpleLineIcons.direction, ); - var fcsIDBox = DisplayText( - text: _package != null ? _package!.fcsID : "", - labelTextKey: "pickup.fcs.id", - icon: FcsIDIcon(), - ); - final phoneNumberBox = DisplayText( - text: _package != null ? _package!.phoneNumber : "", - labelTextKey: "pickup.phone", - iconData: Icons.phone, - ); - final customerNameBox = DisplayText( + + final staffNameBox = DisplayText( text: _package != null ? _package!.userName : "", - labelTextKey: "pickup.consignee.name", + labelTextKey: "pickup.staff.name", iconData: Icons.perm_identity, ); - var senderFcsIDBox = DisplayText( - text: _package != null ? _package!.senderFCSID : "", - labelTextKey: "pickup.fcs.id", - icon: FcsIDIcon(), - ); - final senderPhoneNumberBox = DisplayText( - text: _package != null ? _package!.senderPhoneNumber : "", - labelTextKey: "pickup.phone", - iconData: Icons.phone, - ); - final senderNameBox = DisplayText( - text: _package != null ? _package!.senderName : "", - labelTextKey: "pickup.shipper.name", - iconData: Icons.perm_identity, - ); - final marketBox = DisplayText( - text: _package != null ? _package!.market : "-", - labelTextKey: "pickup.market", - iconData: Icons.store, - ); - final descBox = DisplayText( - text: _package != null ? _package!.desc : "-", - labelTextKey: "pickup.desc", - iconData: MaterialCommunityIcons.message_text_outline, - ); + final remarkBox = DisplayText( text: _package != null ? _package!.remark : "-", labelTextKey: "pickup.remark", iconData: Entypo.new_message, ); + + final statusBox = DisplayText( + text: _package != null ? _package!.status : "", + labelTextKey: "pickup.status", + iconData: Icons.av_timer, + ); + final img = MultiImageFile( enabled: false, controller: multiImgController, @@ -115,39 +89,26 @@ class _PickupInfoState extends State { Container( width: 150, child: DisplayText( - text: '', - labelTextKey: "pickup.time", - iconData: Icons.timer, + text: '9:00 AM', + labelTextKey: "pickup.from_time", + iconData: MaterialCommunityIcons.clock_start, ), ), Container( width: 150, child: DisplayText( - text: '', - labelTextKey: "pickup.time", - iconData: Icons.timer, + text: '12:00 AM', + labelTextKey: "pickup.to_time", + iconData: MaterialCommunityIcons.clock_end, ), ) ], ); - final consigneeBox = Container( - child: Column( - children: [ - fcsIDBox, - phoneNumberBox, - customerNameBox, - ], - ), - ); - final shipperBox = Container( - child: Column( - children: [ - senderFcsIDBox, - senderPhoneNumberBox, - senderNameBox, - ], - ), + final continueBtn = fcsButton( + context, + getLocalString(context, 'pickup.continue.btn'), + callack: _gotoEditor, ); final pickupDateBox = DisplayText( @@ -173,16 +134,6 @@ class _PickupInfoState extends State { fontSize: 20, color: primaryColor, ), - actions: [ - IconButton( - icon: Icon(Icons.delete, color: primaryColor), - onPressed: _delete, - ), - IconButton( - icon: Icon(Icons.edit, color: primaryColor), - onPressed: _gotoEditor, - ), - ], ), body: Card( child: Column( @@ -194,12 +145,11 @@ class _PickupInfoState extends State { pickupNumberBox, pickupDateBox, timeBox, - descBox, + staffNameBox, remarkBox, + statusBox, _package!.photoUrls.length == 0 ? Container() : img, - StatusTree( - shipmentHistory: _package!.shipmentHistory, - currentStatus: _package!.status ?? ""), + _package!.status == "packed" ? continueBtn : Container(), SizedBox( height: 20, ) diff --git a/lib/pages/widgets/multi_img_file.dart b/lib/pages/widgets/multi_img_file.dart index 057869b..f2e1bb6 100644 --- a/lib/pages/widgets/multi_img_file.dart +++ b/lib/pages/widgets/multi_img_file.dart @@ -147,12 +147,12 @@ class _MultiImageFileState extends State { errorWidget: (context, url, error) => Icon(Icons.error), ) - : FittedBox( - fit: BoxFit.cover, - child: Image.file( - fileContainers[index].file!, - ), - ), + : Image.file( + fileContainers[index].file!, + width: 50, + height: 50, + fit: BoxFit.cover, + ), ), ), widget.enabled