import 'package:fcs/domain/constants.dart'; import 'package:fcs/domain/entities/cargo_type.dart'; import 'package:fcs/domain/entities/carton.dart'; import 'package:fcs/domain/entities/package.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/carton/carton_image_upload.dart'; import 'package:fcs/pages/carton/carton_submit.dart'; import 'package:fcs/pages/carton_size/model/carton_size_model.dart'; import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/package/model/package_model.dart'; import 'package:fcs/pages/rates/model/shipment_rate_model.dart'; import 'package:fcs/pages/widgets/display_text.dart'; import 'package:fcs/pages/widgets/local_app_bar.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/multi_img_controller.dart'; import 'package:fcs/pages/widgets/multi_img_file.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_vector_icons/flutter_vector_icons.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import 'carton_editor.dart'; import 'model/carton_model.dart'; final DateFormat dateFormat = DateFormat("d MMM yyyy"); final NumberFormat numberFormatter = NumberFormat("#,###"); class CartonInfo extends StatefulWidget { final Package? package; final Carton box; final String? billToValue; final CartonSubmit? cartonSubmit; CartonInfo( {required this.box, this.billToValue, this.package, this.cartonSubmit}); @override _CartonInfoState createState() => _CartonInfoState(); } class _CartonInfoState extends State { bool _isLoading = false; Carton? _box; CartonSubmit? _cartonSubmit; MultiImgController multiImgController = MultiImgController(); TextEditingController _widthController = new TextEditingController(); TextEditingController _heightController = new TextEditingController(); TextEditingController _lengthController = new TextEditingController(); TextEditingController _cartonSizeController = new TextEditingController(); double volumetricRatio = 0; double shipmentWeight = 0; String? selectMixBoxType; bool isMixBox = false; bool isFromShipments = false; bool isFromPackages = false; bool isSmallBag = false; bool isFromCartons = false; bool isEdiable = false; bool isCutomDuty=false; final List cargoTypes = []; final List surchareItems = []; final List cartons = []; @override void initState() { super.initState(); _box = widget.box; _box?.billToValue = "Bill to sender"; //initPackage(widget.package!); //for shipment weight volumetricRatio = Provider.of(context, listen: false) .rate .volumetricRatio; _lengthController.addListener(_calShipmentWeight); _widthController.addListener(_calShipmentWeight); _heightController.addListener(_calShipmentWeight); multiImgController.setImageUrls = _box!.photos; // _updateBoxData(); _loadPackages(); _loadMixCartons(); } _updateBoxData() { _widthController.text = _box!.width.toString(); _heightController.text = _box!.height.toString(); _lengthController.text = _box!.length.toString(); _cartonSizeController.text = _box!.cartonSizeName ?? ""; isMixBox = _box!.cartonType == carton_mix_box; isFromShipments = _box!.cartonType == carton_from_shipments; isFromPackages = _box!.cartonType == carton_from_packages; isSmallBag = _box!.cartonType == carton_small_bag; isFromCartons = _box!.cartonType == carton_from_cartons; isEdiable = (isFromPackages || isMixBox || isFromCartons) && _box!.status == carton_packed_status; selectMixBoxType = _box!.mixBoxType; getCartonSize(); } getCartonSize() { var cartonSizeModel = Provider.of(context, listen: false); cartonSizeModel.cartonSizes.forEach((c) { if (c.length == _box!.length && c.width == _box!.width && c.height == _box!.height) { setState(() { _cartonSizeController.text = c.name ?? ""; }); } }); } _loadPackages() async { if (!isFromPackages && !isSmallBag) return; // if (_box!.cartonType == carton_from_packages && _box!.userID == null) // return; PackageModel packageModel = Provider.of(context, listen: false); List packages = await packageModel.getPackages(_box!.userID ?? "", [ package_processed_status, package_packed_status, package_shipped_status, package_delivered_status ]); packages = packages.where((p) => _box!.packageIDs.contains(p.id)).toList(); packages.forEach((p) { p.isChecked = true; }); setState(() { _box!.packages = packages; }); } _loadMixCartons() async { if (_box!.cartonType != carton_mix_box) return; CartonModel cartonModel = Provider.of(context, listen: false); List catons = []; for (var id in _box!.mixCartonIDs) { Carton c = await cartonModel.getCarton(id); catons.add(c); } setState(() { _box!.mixCartons = catons; }); } _calShipmentWeight() { double l = double.tryParse(_lengthController.text) ?? 0; double w = double.tryParse(_widthController.text) ?? 0; double h = double.tryParse(_heightController.text) ?? 0; setState(() { shipmentWeight = l * w * h / volumetricRatio; }); } @override void dispose() { super.dispose(); } final DateFormat dateFormat = DateFormat("d MMM yyyy"); @override Widget build(BuildContext context) { double totalWeight = _box!.cargoTypes.fold(0, (sum, value) => sum + value.weight); double totalPieces = surchareItems.fold(0, (sum, value) => sum + value.qty); final cartonTypeBox = DisplayText( text: _box!.cartonNumber, labelTextKey: "box.number", ); final cartonQrBox = DisplayText( iconData: AntDesign.qrcode, ); final shipmentBox = DisplayText( text: _box!.fcsShipmentNumber, labelTextKey: "box.fcs_shipment_num", ); final deliveryBox = DisplayText( text: "Delivery Carton", labelTextKey: "box.delivery_type", ); final customerNameBox = DisplayText( text: _box!.userName == null ? "" : _box!.userName, subText: Text(_box!.fcsID ?? "", style: textStyle), labelTextKey: "box.name", ); final consigneeNameBox = DisplayText( text: _box!.senderName != null ? _box!.senderName : "", subText: Text(_box!.senderFCSID ?? "", style: textStyle), labelTextKey: "processing.consignee.name", ); final packageBox = DisplayText( labelTextKey: "box.package", ); final cartonBox = DisplayText( labelTextKey: "box.shipment.boxes", ); final cargosBox = Padding( padding: const EdgeInsets.only(top: 10), child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ LocalText(context, 'box.cargo.type', color: Colors.black54, fontSize: 16, fontWeight: FontWeight.normal), Padding( padding: EdgeInsets.only(right: 100), child: Text("${removeTrailingZeros(totalWeight)} lb", style: TextStyle(color: Colors.black54, fontSize: 15))) ], ), //), Container( child: Padding( padding: const EdgeInsets.only(right: 100), child: Column( children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: _box!.cargoTypes.map((e) { return Padding( padding: const EdgeInsets.symmetric(vertical: 3), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( e.name ?? "", style: TextStyle(color: Colors.black, fontSize: 15), ), Text("${removeTrailingZeros(e.weight)} lb", style: TextStyle( color: Colors.black, fontSize: 15)) ], ), ); }).toList()), const SizedBox(height: 10), ], ), ), ), ]), ); final surchargeItemBox = Padding( padding: const EdgeInsets.only(top: 10), child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ LocalText(context, 'box.surcharge.item', color: Colors.black54, fontSize: 16, fontWeight: FontWeight.normal), Padding( padding: EdgeInsets.only(right: 100), child: Text("${removeTrailingZeros(totalPieces)} pcs", style: TextStyle(color: Colors.black54, fontSize: 15))) ], ), //), Container( child: Padding( padding: const EdgeInsets.only(right: 100), child: Column( children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: surchareItems.map((e) { return Padding( padding: const EdgeInsets.symmetric(vertical: 3), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( e.name ?? "", style: TextStyle(color: Colors.black, fontSize: 15), ), Text( "${removeTrailingZeros((e.qty).toDouble())} pc", style: TextStyle( color: Colors.black, fontSize: 15)) ], ), ); }).toList()), const SizedBox(height: 10), Column( crossAxisAlignment: CrossAxisAlignment.start, children: surchareItems.map((e) { return Padding( padding: const EdgeInsets.symmetric(vertical: 3), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( e.name ?? "", style: TextStyle(color: labelColor, fontSize: 15), ), Text("${numberFormatter.format(e.qty)} pc", style: TextStyle(color: labelColor, fontSize: 15)) ], ), ); }).toList()), ], ), ), ), ]), ); final img = MultiImageFile( enabled: false, controller: multiImgController, title: "Receipt File", ); final consigneeBox=Container( child: Padding( padding: const EdgeInsets.only(left: 0), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ consigneeNameBox, ], ), ), _cartonSubmit?.billToValue == billToSender ? Expanded( child: Padding( padding: EdgeInsets.only(left: 0, top: 15), child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Icon(Ionicons.document_text_outline, color: primaryColor, size: 20), Text("Bill to", style: TextStyle( color: primaryColor, fontSize: 15)) ], ))) : const SizedBox() ], ), )); final customerBox= Container( child: Row( //crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ customerNameBox, ], ), ), _box?.billToValue == billToSender ? Expanded( child: Padding( padding: EdgeInsets.only(left: 0, top: 15), child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Icon(Ionicons.document_text_outline, color: primaryColor, size: 20), Text("Bill to", style: TextStyle( color: primaryColor, fontSize: 15)) ], ))) : const SizedBox() ], ), ); final billWidget = Expanded( child: Padding( padding: EdgeInsets.only(left: 0, top: 15), child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Icon(Ionicons.document_text_outline, color: primaryColor, size: 20), Text("Bill to", style: TextStyle(color: primaryColor, fontSize: 15)) ], ))); return LocalProgress( inAsyncCall: _isLoading, child: Scaffold( appBar: LocalAppBar( labelKey: "box.info.title", backgroundColor: Colors.white, labelColor: primaryColor, arrowColor: primaryColor, actions: isEdiable ? [ IconButton( icon: Icon(Icons.edit, color: primaryColor), onPressed: _gotoEditor, ), IconButton( icon: Icon(Icons.delete, color: primaryColor), onPressed: _delete, ), ] : [], ), body: Container( padding: const EdgeInsets.all(10.0), child: ListView(children: [ Row(children: [ Flexible(child: cartonTypeBox), Flexible( child: cartonQrBox, ), ]), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Flexible( child: shipmentBox, ), Flexible( child: deliveryBox, ), ], ), // isMixBox // ? // displayMixBox:Container(), isMixBox? Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Expanded( child: Row( //crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ customerNameBox, ], ), ), _box?.billToValue == billToSender ? billWidget : const SizedBox( height: 300.0,) ], ), ), Expanded( child: Padding( padding: const EdgeInsets.only(left: 0), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ consigneeNameBox, ], ), ), _cartonSubmit?.billToValue == billToSender ? billWidget : const SizedBox() ], ), )) ], ) // , // Row( // children: getPackageList(_box!.packages), // ), // ]) :Container(), isMixBox ? Column(children: [ packageBox, Row( children: getPackageList(_box!.packages), ), ],):Column( children: [ cartonBox, Row( children: getCartonList(_box!.mixCartons), ), ], ), isCutomDuty ? surchargeItemBox: cargosBox, Padding( padding: EdgeInsets.only(left: 200.0, right: 8.0), child: ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: Color(0xff272262), elevation: 3, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5.0)), minimumSize: Size(10, 35), //////// HERE ), onPressed: () { Navigator.push( context, CupertinoPageRoute( builder: (context) => CartonImageUpload(box: _box)), ); }, child: const Text('Upload Images'), ), ), img, Center( child: ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: Color(0xffff0606), elevation: 3, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(5.0)), minimumSize: Size(300, 45), //////// HERE ), onPressed: () {}, child: const Text('Delete Carton', style: TextStyle(fontSize: 20)), ), ), ])))); } _gotoEditor() async { _box!.mixCartons = _box!.mixCartons; bool? updated = await Navigator.push( context, CupertinoPageRoute(builder: (context) => CartonEditor(carton: _box)), ); if (updated ?? false) { var cartonModel = Provider.of(context, listen: false); var c = await cartonModel.getCarton(widget.box.id ?? ""); setState(() { _box = c; _loadPackages(); _loadMixCartons(); _updateBoxData(); }); } } _delete() { showConfirmDialog(context, "box.delete.confirm", () { _deleteCarton(); }); } _deleteCarton() async { setState(() { _isLoading = true; }); try { var cartonModel = Provider.of(context, listen: false); await cartonModel.deleteCarton(widget.box); Navigator.pop(context, true); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { setState(() { _isLoading = false; }); } } List getPackageList(List _p) { return _p.map((p) { return Container( padding: EdgeInsets.only(top: 0), child: Container( //padding: //EdgeInsets.only(top: 0.0), child: Row(children: [new Text(p.trackingID ?? '')]), )); }).toList(); } List getCartonList(List _c) { return _c.map((c) { return Container( padding: EdgeInsets.only(top: 0), child: Container( //padding: //EdgeInsets.only(top: 0.0), child: Row(children: [new Text(c.cartonNumber ?? '')]), )); }).toList(); } List getCargoList(List _c) { return _c.map((c) { return Container( padding: EdgeInsets.only(top: 0), child: Container( //padding: //EdgeInsets.only(top: 0.0), child: Row(children: [new Text(c.name ?? '')]), )); }).toList(); } }