mirror of
https://github.com/NaN-tic/trytond-stock_number_of_packages.git
synced 2023-12-14 07:52:52 +01:00
107 lines
3.8 KiB
Python
107 lines
3.8 KiB
Python
# The COPYRIGHT file at the top level of this repository contains the full
|
|
# copyright notices and license terms.
|
|
from trytond.model import ModelSQL, ModelView, fields
|
|
from trytond.pool import Pool, PoolMeta
|
|
from trytond.transaction import Transaction
|
|
|
|
__all__ = ['Period', 'PeriodCache', 'PeriodCacheLot', 'PeriodCachePackage']
|
|
|
|
|
|
class NumberOfPackagesCacheMixin(object):
|
|
number_of_packages = fields.Integer('Number of packages', readonly=True)
|
|
|
|
@classmethod
|
|
def compute_number_of_packages(cls, vlist, grouping):
|
|
pool = Pool()
|
|
Period = pool.get('stock.period')
|
|
Product = pool.get('product.product')
|
|
|
|
vlist_by_period_location = {}
|
|
for values in vlist:
|
|
vlist_by_period_location.setdefault(values['period'], {})\
|
|
.setdefault(values['location'], []).append(values)
|
|
|
|
vlist = []
|
|
for period_id, vlist_by_location in \
|
|
vlist_by_period_location.items():
|
|
period = Period(period_id)
|
|
with Transaction().set_context(
|
|
stock_date_end=period.date,
|
|
stock_date_start=None,
|
|
stock_assign=False,
|
|
forecast=False,
|
|
stock_destinations=None,
|
|
number_of_packages=True,
|
|
):
|
|
|
|
llist=[x for x in vlist_by_location]
|
|
pbl = Product.products_by_location(
|
|
llist, grouping=grouping)
|
|
for location_id, location_vlist in vlist_by_location.items():
|
|
for values in location_vlist:
|
|
key = tuple([location_id] + [values[x] for x in grouping])
|
|
values['number_of_packages'] = int(pbl.get(key, 0.0))
|
|
vlist.append(values)
|
|
return vlist
|
|
|
|
|
|
class Period(metaclass=PoolMeta):
|
|
__name__ = 'stock.period'
|
|
|
|
package_caches = fields.One2Many('stock.period.cache.package', 'period',
|
|
'Package Caches', readonly=True)
|
|
|
|
@classmethod
|
|
def groupings(cls):
|
|
return super(Period, cls).groupings() + [('product', 'package')]
|
|
|
|
@classmethod
|
|
def get_cache(cls, grouping):
|
|
pool = Pool()
|
|
Cache = super(Period, cls).get_cache(grouping)
|
|
if grouping == ('product', 'package'):
|
|
return pool.get('stock.period.cache.package')
|
|
return Cache
|
|
|
|
|
|
class PeriodCache(NumberOfPackagesCacheMixin, metaclass=PoolMeta):
|
|
__name__ = 'stock.period.cache'
|
|
|
|
@classmethod
|
|
def create(cls, vlist):
|
|
vlist = cls.compute_number_of_packages(vlist, ('product',))
|
|
return super(PeriodCache, cls).create(vlist)
|
|
|
|
|
|
class PeriodCacheLot(NumberOfPackagesCacheMixin, metaclass=PoolMeta):
|
|
__name__ = 'stock.period.cache.lot'
|
|
|
|
@classmethod
|
|
def create(cls, vlist):
|
|
vlist = cls.compute_number_of_packages(vlist, ('product', 'lot'))
|
|
return super(PeriodCacheLot, cls).create(vlist)
|
|
|
|
|
|
class PeriodCachePackage(ModelSQL, ModelView, NumberOfPackagesCacheMixin):
|
|
'''
|
|
Stock Period Cache per Package
|
|
|
|
It is used to store cached computation of stock quantities per package.
|
|
'''
|
|
__name__ = 'stock.period.cache.package'
|
|
period = fields.Many2One('stock.period', 'Period', required=True,
|
|
readonly=True, select=True, ondelete='CASCADE')
|
|
location = fields.Many2One('stock.location', 'Location', required=True,
|
|
readonly=True, select=True, ondelete='CASCADE')
|
|
product = fields.Many2One('product.product', 'Product', required=True,
|
|
readonly=True, ondelete='CASCADE')
|
|
package = fields.Many2One('product.pack', 'Package', readonly=True,
|
|
ondelete='CASCADE')
|
|
internal_quantity = fields.Float('Internal Quantity', readonly=True)
|
|
|
|
@classmethod
|
|
def create(cls, vlist):
|
|
vlist = cls.compute_number_of_packages(vlist,
|
|
('product', 'package'))
|
|
return super(PeriodCachePackage, cls).create(vlist)
|