diff --git a/modules/purchase_trade/purchase.py b/modules/purchase_trade/purchase.py
index 83d77ee..394eae8 100755
--- a/modules/purchase_trade/purchase.py
+++ b/modules/purchase_trade/purchase.py
@@ -731,7 +731,7 @@ class AssayLine(ModelSQL, ModelView):
element = fields.Many2One('assay.element', "Element")
- value = fields.Float("Value")
+ value = fields.Numeric("Value")
unit = fields.Many2One('assay.unit', "Unit")
@@ -813,15 +813,14 @@ class PenaltyRuleTier(ModelSQL, ModelView):
deduction_per_unit = fields.Numeric("Deduction / unit")
penalty_value = fields.Numeric("Penalty Value (USD/DMT)")
- def compute_tier_penalty(self, grade, dry_weight_dmt):
+ def compute_tier_penalty(self, grade):
"""
Retourne la pénalité USD pour ce palier uniquement.
grade : Decimal – teneur brute de l'élément
dry_weight_dmt: Decimal – poids sec en DMT
"""
grade = Decimal(str(grade))
- dry_weight_dmt = Decimal(str(dry_weight_dmt))
-
+
# Grade en dessous du seuil bas → ce palier ne s'applique pas
if grade <= self.threshold_from:
return Decimal(0)
@@ -831,7 +830,7 @@ class PenaltyRuleTier(ModelSQL, ModelView):
excess = excess_top - self.threshold_from
# USD/DMT × DMT
- return (excess * self.penalty_value * dry_weight_dmt).quantize(Decimal('0.01'))
+ return (excess * self.penalty_value).quantize(Decimal('0.01'))
class PenaltyRule(ModelSQL, ModelView):
@@ -841,18 +840,17 @@ class PenaltyRule(ModelSQL, ModelView):
element = fields.Many2One('assay.element', "Element")
tiers = fields.One2Many('penalty.rule.tier', 'rule', "Tiers")
- def compute_penalty(self, grade, dry_weight_dmt):
+ def compute_penalty(self, grade):
"""
Retourne la pénalité totale USD en cumulant tous les paliers traversés.
grade : Decimal – teneur brute de l'élément
dry_weight_dmt: Decimal – poids sec en DMT
"""
grade = Decimal(str(grade))
- dry_weight_dmt = Decimal(str(dry_weight_dmt))
-
+
total = Decimal(0)
for tier in self.tiers:
- total += tier.compute_tier_penalty(grade, dry_weight_dmt)
+ total += tier.compute_tier_penalty(grade)
return total.quantize(Decimal('0.01'))
@@ -873,7 +871,7 @@ class ConcentrateTerm(ModelSQL, ModelView):
)
manual_price = fields.Numeric(
- "Manual Price",
+ "Price",
digits=(16, 6)
)
@@ -1325,16 +1323,30 @@ class Line(metaclass=PoolMeta):
TR = Pool().get('pricing.trigger')
TR.save([tr])
+ def get_element_grade(self, state, element):
+ if self.assays:
+ for assay in self.assays:
+ if assay.type == state:
+ for line in assay.lines:
+ if line.element == element:
+ return line.value
+
def check_pricing(self):
if self.terms and self.update_pricing:
- Pricing = Pool().get('pricing.component')
- pricings = Pricing.search(['line','=',self.id])
- if pricings:
- Pricing.delete(pricings)
+ Concentrate = Pool().get('concentrate.term')
for t in self.terms:
- pc = Pricing()
- pc.curve = t.curve
-
+ if not t.component:
+ grade = self.get_element_grade(self.assay_state,t.element)
+ logger.info("GRADE:%s",grade)
+ if grade:
+ cp = [c for c in self.price_summary if c.price_component == t.component]
+ if cp:
+ cp = cp[0]
+ price = cp.get_last_price()
+ logger.info("PRICE:%s",price)
+ t.manual_price = t.payable_rule.compute_payable_quantity(grade) * price / Decimal(100) - t.penalty_rules.compute_penalty(grade,self.quantity)
+ Concentrate.save([t])
+
if self.price_components:
for pc in self.price_components:
if not pc.auto:
diff --git a/modules/purchase_trade/view/concentrate_tree.xml b/modules/purchase_trade/view/concentrate_tree.xml
index be11b80..0cac679 100644
--- a/modules/purchase_trade/view/concentrate_tree.xml
+++ b/modules/purchase_trade/view/concentrate_tree.xml
@@ -3,4 +3,7 @@
+
+
+
\ No newline at end of file