issue9637.diff # [production] production: Keep cost of unused input products
This commit is contained in:
parent
80e155515f
commit
135de10d59
|
@ -0,0 +1,78 @@
|
|||
diff --git a/production.py b/production.py
|
||||
index 867f0ea..c0ed28b 100644
|
||||
--- a/trytond/trytond/modules/production/production.py
|
||||
+++ b/trytond/trytond/modules/production/production.py
|
||||
@@ -10,7 +10,7 @@ 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 collections import defaultdict
|
||||
from trytond.modules.product import price_digits
|
||||
|
||||
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)
|
2
series
2
series
|
@ -81,4 +81,4 @@ issue7280.diff # [account_invoice_stock] + [account_stock_landed_cost] Update un
|
|||
issue9616.diff # [analytic_invoice] Analytic move is not created when closing an asset
|
||||
|
||||
issue9603.diff # [currency] get today when date in the context is None
|
||||
|
||||
issue9637.diff # [production] production: Keep cost of unused input products
|
||||
|
|
Loading…
Reference in New Issue