fix rates

This commit is contained in:
2021-01-04 17:19:01 +06:30
parent 3fdcb851ed
commit ee586e8f41
10 changed files with 103 additions and 63 deletions

View File

@@ -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<ShipmentStatus> shipmentHistory;

View File

@@ -8,6 +8,9 @@ class Rate {
double freeDeliveryWeight;
double volumetricRatio;
double diffDiscountWeight;
double diffWeightRate;
List<CargoType> cargoTypes;
List<CustomDuty> customDuties;
List<DiscountByWeight> 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<String, dynamic> 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}';
}
}