From ee586e8f4118fadc08414f10c33efc29182e2e0c Mon Sep 17 00:00:00 2001 From: sainw Date: Mon, 4 Jan 2021 17:19:01 +0630 Subject: [PATCH] fix rates --- assets/local/localization_en.json | 2 + assets/local/localization_mu.json | 2 + lib/data/provider/rate_data_provider.dart | 2 + lib/domain/entities/carton.dart | 21 ++++----- lib/domain/entities/rate.dart | 24 ++++++++--- lib/pages/rates/shipment_rates.dart | 8 ++++ lib/pages/rates/shipment_rates_calculate.dart | 43 +------------------ lib/pages/rates/shipment_rates_edit.dart | 30 ++++++++++--- pubspec.yaml | 1 + test/rate_test.dart | 33 ++++++++++++++ 10 files changed, 103 insertions(+), 63 deletions(-) create mode 100644 test/rate_test.dart diff --git a/assets/local/localization_en.json b/assets/local/localization_en.json index 3845365..2a43a4d 100644 --- a/assets/local/localization_en.json +++ b/assets/local/localization_en.json @@ -405,6 +405,8 @@ "rate.delivery_fee":"Delivery fees", "rate.total_estimated_amount":"Total estimated amount", "rate.volumetric_ratio":"Volumetric ratio", + "rate.diff_discount_weight":"Weight difference discount (lb)", + "rate.diff_weight_rate":"Weight difference rate", "rate.custom.form.title":"Custom", "rate.cutom.product_type":"Product type", "rate.custom.fee":"Fee", diff --git a/assets/local/localization_mu.json b/assets/local/localization_mu.json index e8f5154..c896d22 100644 --- a/assets/local/localization_mu.json +++ b/assets/local/localization_mu.json @@ -405,6 +405,8 @@ "rate.delivery_fee":"ပို့ဆောင်ခ", "rate.total_estimated_amount":"စုစုပေါင်းခန့်မှန်းပမာဏ", "rate.volumetric_ratio":"Volumetric Ratio", + "rate.diff_discount_weight":"Weight difference discount (lb)", + "rate.diff_weight_rate":"Weight difference rate", "rate.custom.form.title":"အကောက်ခွန်", "rate.cutom.product_type":"ကုန်ပစ္စည်းအမျိုးအစား", "rate.custom.fee":"အခကြေးငွေ", diff --git a/lib/data/provider/rate_data_provider.dart b/lib/data/provider/rate_data_provider.dart index 7d0529d..c01e863 100644 --- a/lib/data/provider/rate_data_provider.dart +++ b/lib/data/provider/rate_data_provider.dart @@ -92,6 +92,8 @@ class RateDataProvider { _rate.deliveryFee = rate.deliveryFee; _rate.freeDeliveryWeight = rate.freeDeliveryWeight; _rate.volumetricRatio = rate.volumetricRatio; + _rate.diffDiscountWeight = rate.diffDiscountWeight; + _rate.diffWeightRate = rate.diffWeightRate; controller.add(_rate); }); cargoListener = _cargoTypeStream().listen((cargoTypes) { diff --git a/lib/domain/entities/carton.dart b/lib/domain/entities/carton.dart index cccac21..995c57c 100644 --- a/lib/domain/entities/carton.dart +++ b/lib/domain/entities/carton.dart @@ -62,7 +62,7 @@ class Carton { double get actualWeight => cargoTypes == null ? 0 : cargoTypes.fold(0, (p, e) => e.weight + p); - double getShipmentWeight(double volumetricRatio) { + int getShipmentWeight(double volumetricRatio) { if (length == null || length <= 0 || width == null || @@ -71,8 +71,8 @@ class Carton { height <= 0 || volumetricRatio == null || volumetricRatio <= 0) return 0; - - return (length * width * height) / volumetricRatio; + + return ((length * width * height) / volumetricRatio).round(); } /// getCargoTypeForCalWeight returns carton with shipment weight @@ -95,25 +95,26 @@ class Carton { /// calAmount returns total amount double calAmount(Rate rate) { // get shipment weight - double volume = (length ?? 0) * (width ?? 0) * (height ?? 0); - double sw = volume / rate.volumetricRatio ?? 0; + int sw = getShipmentWeight(rate.volumetricRatio); // get actual weight double aw = cargoTypes.fold(0.0, (p, c) => p + c.weight); if (aw == 0 || sw == 0) return 0; - DiscountByWeight discountByWeight = - rate.getDiscountByWeight(sw > aw ? sw : aw); + 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 cargoWeight = aw > sw ? e.weight : e.weight / aw * sw; double r = e.rate - (discountByWeight != null ? discountByWeight.discount : 0); - double amount = cargoWeight * r; + double amount = e.weight * r; total += amount; }); - return total; + return total + wdAmount; } List shipmentHistory; diff --git a/lib/domain/entities/rate.dart b/lib/domain/entities/rate.dart index 3719978..3dadb79 100644 --- a/lib/domain/entities/rate.dart +++ b/lib/domain/entities/rate.dart @@ -8,6 +8,9 @@ class Rate { double freeDeliveryWeight; double volumetricRatio; + double diffDiscountWeight; + double diffWeightRate; + List cargoTypes; List customDuties; List discountByWeights; @@ -22,17 +25,20 @@ class Rate { ? null : cargoTypes.firstWhere((e) => e.name == "General"); - Rate({ - this.deliveryFee, - this.freeDeliveryWeight, - this.volumetricRatio, - }); + Rate( + {this.deliveryFee, + this.freeDeliveryWeight, + this.volumetricRatio, + this.diffDiscountWeight, + this.diffWeightRate}); factory Rate.fromMap(Map map) { return Rate( deliveryFee: (map['delivery_fee'] ?? 0).toDouble(), freeDeliveryWeight: (map['free_delivery_weight'] ?? 0).toDouble(), volumetricRatio: (map['volumetric_ratio'] ?? 0).toDouble(), + diffDiscountWeight: (map['diff_discount_weight'] ?? 0).toDouble(), + diffWeightRate: (map['diff_weight_rate'] ?? 0).toDouble(), ); } @@ -41,17 +47,21 @@ class Rate { "delivery_fee": deliveryFee, 'free_delivery_weight': freeDeliveryWeight, 'volumetric_ratio': volumetricRatio, + 'diff_discount_weight': diffDiscountWeight, + 'diff_weight_rate': diffWeightRate, }; } bool isChangedForEdit(Rate rate) { return rate.freeDeliveryWeight != this.freeDeliveryWeight || rate.deliveryFee != this.deliveryFee || - rate.volumetricRatio != this.volumetricRatio; + rate.volumetricRatio != this.volumetricRatio || + rate.diffDiscountWeight != this.diffDiscountWeight || + rate.diffWeightRate != this.diffWeightRate; } @override String toString() { - return 'Rate{deliveryFee:$deliveryFee,freeDeliveryWeight:$freeDeliveryWeight,volumetricRatio:$volumetricRatio}'; + return 'Rate{deliveryFee:$deliveryFee,freeDeliveryWeight:$freeDeliveryWeight,volumetricRatio:$volumetricRatio,diffDiscountWeight:$diffDiscountWeight,diffWeightRate:$diffWeightRate}'; } } diff --git a/lib/pages/rates/shipment_rates.dart b/lib/pages/rates/shipment_rates.dart index 8b5c535..0da9be3 100644 --- a/lib/pages/rates/shipment_rates.dart +++ b/lib/pages/rates/shipment_rates.dart @@ -145,6 +145,14 @@ class _ShipmentRatesState extends State { "Volumetric Ratio", "${rate.volumetricRatio.toStringAsFixed(2)}", "in3 per pound"), + _row( + "Weight difference discount", + "${rate.diffDiscountWeight.toStringAsFixed(2)}", + "pounds"), + _row( + "Weight difference rate", + "\$ ${rate.diffWeightRate.toStringAsFixed(2)}", + ""), Divider( color: Colors.grey, ), diff --git a/lib/pages/rates/shipment_rates_calculate.dart b/lib/pages/rates/shipment_rates_calculate.dart index 9af0d95..5406fc2 100644 --- a/lib/pages/rates/shipment_rates_calculate.dart +++ b/lib/pages/rates/shipment_rates_calculate.dart @@ -69,7 +69,7 @@ class _ShipmentRatesCalState extends State { _deliveryFee = effectiveWeight > rate.freeDeliveryWeight ? 0 : rate.deliveryFee; _amount = amount == null ? 0 : amount + _deliveryFee; - _shipmentWeight = shipmentWeight; + _shipmentWeight = shipmentWeight.toDouble(); }); } @@ -143,9 +143,7 @@ class _ShipmentRatesCalState extends State { leading: new IconButton( icon: new Icon(CupertinoIcons.back, color: primaryColor), onPressed: () { - showConfirmDialog(context, "back.button_confirm", () { - Navigator.of(context).pop(); - }); + Navigator.of(context).pop(); }, ), backgroundColor: Colors.white, @@ -197,41 +195,4 @@ class _ShipmentRatesCalState extends State { ), ); } - - _row(String desc, String price, String unit, String value, {bool input}) { - return Container( - padding: EdgeInsets.only(left: 25, top: 5, bottom: 5), - child: Row( - children: [ - Text('$desc ', style: TextStyle(fontSize: 15)), - Spacer(), - Column( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Padding( - padding: const EdgeInsets.only(bottom: 3.0), - child: Text( - '$price', - style: TextStyle(color: primaryColor, fontSize: 14), - ), - ), - Text( - '$unit', - style: TextStyle(color: Colors.grey, fontSize: 14), - ), - // TextFormField(), - ], - ), - SizedBox( - width: 50, - ), - Container( - width: 50, - child: TextFormField( - initialValue: value, - textAlign: TextAlign.end, - )), - ], - )); - } } diff --git a/lib/pages/rates/shipment_rates_edit.dart b/lib/pages/rates/shipment_rates_edit.dart index 49f338a..7d0cdb0 100644 --- a/lib/pages/rates/shipment_rates_edit.dart +++ b/lib/pages/rates/shipment_rates_edit.dart @@ -29,6 +29,9 @@ class _ShipmentRatesEditState extends State { TextEditingController _minWeight = new TextEditingController(); TextEditingController _deliveryFee = new TextEditingController(); TextEditingController _volumetricRatio = new TextEditingController(); + TextEditingController _diffDiscountWeight = new TextEditingController(); + TextEditingController _diffWeightRate = new TextEditingController(); + Rate rate; @override @@ -41,6 +44,8 @@ class _ShipmentRatesEditState extends State { _minWeight.text = rate.freeDeliveryWeight?.toStringAsFixed(2) ?? ""; _deliveryFee.text = rate.deliveryFee?.toStringAsFixed(2) ?? ""; _volumetricRatio.text = rate.volumetricRatio?.toStringAsFixed(2) ?? ""; + _diffDiscountWeight.text = rate.diffDiscountWeight?.toStringAsFixed(2) ?? ""; + _diffWeightRate.text = rate.diffWeightRate?.toStringAsFixed(2) ?? ""; } @override @@ -62,8 +67,16 @@ class _ShipmentRatesEditState extends State { controller: _deliveryFee); final ratioBox = InputText( labelTextKey: 'rate.volumetric_ratio', - iconData: Icons.attach_money, + iconData: FontAwesomeIcons.weightHanging, controller: _volumetricRatio); + final diffDiscountWeightBox = InputText( + labelTextKey: 'rate.diff_discount_weight', + iconData: FontAwesomeIcons.weightHanging, + controller: _diffDiscountWeight); + final diffWeightRateBox = InputText( + labelTextKey: 'rate.diff_weight_rate', + iconData: Icons.attach_money, + controller: _diffWeightRate); return LocalProgress( inAsyncCall: _isLoading, @@ -97,6 +110,8 @@ class _ShipmentRatesEditState extends State { minWigBox, feeBox, ratioBox, + diffDiscountWeightBox, + diffWeightRateBox, SizedBox(height: 10), ], ), @@ -121,7 +136,9 @@ class _ShipmentRatesEditState extends State { Rate _rate = new Rate( deliveryFee: double.parse(_deliveryFee.text), freeDeliveryWeight: double.parse(_minWeight.text), - volumetricRatio: double.parse(_volumetricRatio.text)); + volumetricRatio: double.parse(_volumetricRatio.text), + diffDiscountWeight: double.parse(_diffDiscountWeight.text), + diffWeightRate: double.parse(_diffWeightRate.text)); Rate r = new Rate(); print('_rate =>$r'); await shipmentRateModel.updateRate(_rate); @@ -137,9 +154,12 @@ class _ShipmentRatesEditState extends State { isDataChanged() { Rate _rate = new Rate( - deliveryFee: double.parse(_deliveryFee.text), - freeDeliveryWeight: double.parse(_minWeight.text), - volumetricRatio: double.parse(_volumetricRatio.text)); + deliveryFee: double.parse(_deliveryFee.text), + freeDeliveryWeight: double.parse(_minWeight.text), + volumetricRatio: double.parse(_volumetricRatio.text), + diffDiscountWeight: double.parse(_diffDiscountWeight.text), + diffWeightRate: double.parse(_diffWeightRate.text), + ); return rate.isChangedForEdit(_rate); } diff --git a/pubspec.yaml b/pubspec.yaml index b530941..3fc9f56 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -57,6 +57,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter + test: ^1.15.7 flutter: uses-material-design: true diff --git a/test/rate_test.dart b/test/rate_test.dart new file mode 100644 index 0000000..a373e2c --- /dev/null +++ b/test/rate_test.dart @@ -0,0 +1,33 @@ +import 'package:fcs/domain/entities/cargo_type.dart'; +import 'package:fcs/domain/entities/carton.dart'; +import 'package:fcs/domain/entities/discount_by_weight.dart'; +import 'package:fcs/domain/entities/rate.dart'; +import 'package:test/test.dart'; + +@TestOn('vm') +void main() { + var rate = Rate(); + rate.discountByWeights = [ + DiscountByWeight(weight: 25, discount: 0.25), + DiscountByWeight(weight: 50, discount: 0.5), + ]; + rate.volumetricRatio = 166.36; + rate.diffDiscountWeight = 5; + rate.diffWeightRate = 1.5; + + test('Calculate carton price 1', () { + var ct = CargoType(name: "General", weight: 10, rate: 6); + var carton = Carton(cargoTypes: [ct], length: 15, width: 15, height: 15); + expect(carton.calAmount(rate), equals(67.50)); + }); + test('Calculate carton price 2', () { + var ct = CargoType(name: "General", weight: 10, rate: 6); + var carton = Carton(cargoTypes: [ct], length: 10, width: 10, height: 10); + expect(carton.calAmount(rate), equals(60)); + }); + test('Calculate carton price 3', () { + var ct = CargoType(name: "General", weight: 10, rate: 6); + var carton = Carton(cargoTypes: [ct], length: 15, width: 15, height: 10); + expect(carton.calAmount(rate), equals(60)); + }); +}