trytond-patches/issue9637.diff

81 lines
3.6 KiB
Diff

diff --git a/production.py b/production.py
index 0e7cd86..3aab16d 100644
--- a/trytond/trytond/modules/production/production.py
+++ b/trytond/trytond/modules/production/production.py
@@ -10,8 +10,8 @@ from trytond.wizard import Wizard, StateTransition, StateView, Button
from trytond.pyson import Eval, Bool, If, Id
from trytond.pool import Pool
from trytond.transaction import Transaction
-
-from trytond.modules.product import price_digits
+from collections import defaultdict
+from trytond.modules.product import price_digits, round_price
from .exceptions import CostError
@@ -487,7 +487,37 @@ class Production(Workflow, ModelSQL, ModelView):
for production in productions:
sum_ = Decimal(0)
prices = {}
+ cost = production.cost
+
+ input_quantities = defaultdict(Decimal)
+ input_costs = defaultdict(Decimal)
+ for input_ in production.inputs:
+ if input_.cost_price is not None:
+ cost_price = input_.cost_price
+ else:
+ cost_price = input_.product.cost_price
+ input_quantities[input_.product] += (
+ Decimal(str(input_.internal_quantity)))
+ input_costs[input_.product] += (
+ Decimal(str(input_.internal_quantity)) * cost_price)
+ outputs = []
for output in production.outputs:
+ product = output.product
+ product = output.product
+ if input_quantities.get(output.product):
+ cost_price = (
+ input_costs[product] / input_quantities[product])
+ unit_price = round_price(Uom.compute_price(
+ product.default_uom, cost_price, output.uom))
+ if output.unit_price != unit_price:
+ output.unit_price = unit_price
+ moves.append(output)
+ cost -= min(
+ unit_price * Decimal(str(output.quantity)), cost)
+ else:
+ outputs.append(output)
+
+ for output in outputs:
product = output.product
with Transaction().set_context(production._list_price_context):
list_price = product.list_price_used
@@ -499,7 +529,7 @@ class Production(Workflow, ModelSQL, ModelView):
if not sum_ and production.product:
prices.clear()
- for output in production.outputs:
+ for output in outputs:
if output.product == production.product:
quantity = Uom.compute_qty(
output.uom, output.quantity,
@@ -508,14 +538,13 @@ class Production(Workflow, ModelSQL, ModelView):
prices[output] = quantity
sum_ += quantity
- for output in production.outputs:
+ for output in outputs:
if sum_:
ratio = prices.get(output, 0) / sum_
else:
- ratio = Decimal(1) / len(production.outputs)
+ ratio = Decimal(1) / len(outputs)
quantity = Decimal(str(output.quantity))
- unit_price = (
- production.cost * ratio / quantity).quantize(digits)
+ unit_price = round_price(cost * ratio / quantity)
if output.unit_price != unit_price:
output.unit_price = unit_price
moves.append(output)