85 lines
2.9 KiB
Python
85 lines
2.9 KiB
Python
#This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
#this repository contains the full copyright notices and license terms.
|
|
from decimal import Decimal
|
|
from trytond.model import ModelView, ModelSQL, fields
|
|
from trytond.pyson import Eval
|
|
from trytond.pool import Pool
|
|
|
|
|
|
class Move(ModelSQL, ModelView):
|
|
_name = 'stock.move'
|
|
anglo_saxon_quantity = fields.Float('Anglo-Saxon Quantity',
|
|
digits=(16, Eval('unit_digits', 2)), depends=['unit_digits'])
|
|
|
|
def __init__(self):
|
|
super(Move, self).__init__()
|
|
self._sql_constraints += [
|
|
('check_anglo_saxon_quantity',
|
|
'CHECK(quantity >= anglo_saxon_quantity)',
|
|
'Anglo-Saxon quantity can not be greater than quantity!'),
|
|
]
|
|
|
|
def default_anglo_saxon_quantity(self):
|
|
return 0.0
|
|
|
|
def _get_anglo_saxon_move(self, moves, quantity):
|
|
'''
|
|
Generator of (move, qty) where move is the move to be consumed and qty
|
|
is the quantity (in the product default uom) to be consumed on this
|
|
move.
|
|
'''
|
|
uom_obj = Pool().get('product.uom')
|
|
|
|
consumed_qty = 0.0
|
|
for move in moves:
|
|
qty = uom_obj.compute_qty(move.uom,
|
|
move.quantity - move.anglo_saxon_quantity,
|
|
move.product.default_uom, round=False)
|
|
if qty <= 0.0:
|
|
continue
|
|
if qty > quantity - consumed_qty:
|
|
qty = quantity - consumed_qty
|
|
if consumed_qty >= quantity:
|
|
break
|
|
yield (move, qty)
|
|
|
|
def update_anglo_saxon_quantity_product_cost(self, product, moves,
|
|
quantity, uom, type_):
|
|
'''
|
|
Return the cost for quantity based on lines.
|
|
Update anglo_saxon_quantity on the concerned moves.
|
|
'''
|
|
uom_obj = Pool().get('product.uom')
|
|
|
|
for move in moves:
|
|
assert move.product == product, 'wrong product'
|
|
assert type_.startswith('in_') or type_.startswith('out_'), 'wrong type'
|
|
|
|
total_qty = uom_obj.compute_qty(uom, quantity, product.default_uom,
|
|
round=False)
|
|
|
|
cost = Decimal('0.0')
|
|
consumed_qty = 0.0
|
|
for move, move_qty in self._get_anglo_saxon_move(moves, total_qty):
|
|
consumed_qty += move_qty
|
|
|
|
if type_.startswith('in_'):
|
|
move_cost_price = uom_obj.compute_price(move.uom,
|
|
move.unit_price, move.product.default_uom)
|
|
else:
|
|
move_cost_price = move.cost_price
|
|
cost += move_cost_price * Decimal(str(move_qty))
|
|
|
|
self.write(move.id, {
|
|
'anglo_saxon_quantity': ((move.anglo_saxon_quantity or 0.0)
|
|
+ move_qty),
|
|
})
|
|
|
|
if consumed_qty < total_qty:
|
|
qty = total_qty - consumed_qty
|
|
consumed_qty += qty
|
|
cost += product.cost_price * Decimal(str(qty))
|
|
return cost
|
|
|
|
Move()
|