/usr/share/pyshared/trytond/modules/product_cost_fifo/product.py is in tryton-modules-product-cost-fifo 3.0.0-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | #This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
import datetime
from trytond.transaction import Transaction
from trytond.pool import Pool, PoolMeta
__all__ = ['Template']
__metaclass__ = PoolMeta
class Template:
__name__ = 'product.template'
@classmethod
def __setup__(cls):
super(Template, cls).__setup__()
new_sel = ('fifo', 'FIFO')
if new_sel not in cls.cost_price_method.selection:
cls.cost_price_method.selection.append(new_sel)
def get_fifo_move(self, quantity=0.0):
'''
Return a list 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. The list contains the "first in"
moves for the given quantity.
'''
pool = Pool()
Move = pool.get('stock.move')
Uom = pool.get('product.uom')
Location = pool.get('stock.location')
Template = pool.get('product.template')
locations = Location.search([
('type', '=', 'storage'),
])
stock_date_end = datetime.date.today()
location_ids = [l.id for l in locations]
with Transaction().set_context(locations=location_ids,
stock_date_end=stock_date_end):
template = Template(self.id)
offset = 0
limit = Transaction().cursor.IN_MAX
avail_qty = template.quantity
fifo_moves = []
while avail_qty > 0.0:
moves = Move.search([
('product.template.id', '=', template.id),
('state', '=', 'done'),
('from_location.type', '=', 'supplier'),
], offset=offset, limit=limit,
order=[('effective_date', 'DESC'), ('id', 'DESC')])
if not moves:
break
offset += limit
for move in moves:
qty = Uom.compute_qty(move.uom,
move.quantity - move.fifo_quantity,
template.default_uom, round=False)
avail_qty -= qty
if avail_qty <= quantity:
if avail_qty > 0.0:
fifo_moves.append(
(move, min(qty, quantity - avail_qty)))
else:
fifo_moves.append(
(move, min(quantity, qty + avail_qty)))
break
fifo_moves.reverse()
return fifo_moves
|