83 lines
3.0 KiB
Python
83 lines
3.0 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 collections import defaultdict
|
|
from itertools import groupby
|
|
|
|
from sql import Null
|
|
from sql.aggregate import Sum
|
|
from sql.conditionals import Coalesce
|
|
|
|
from trytond.model import fields
|
|
from trytond.pool import Pool, PoolMeta
|
|
from trytond.transaction import Transaction
|
|
|
|
|
|
class Production(metaclass=PoolMeta):
|
|
__name__ = 'production'
|
|
|
|
ethanol_volume = fields.Function(
|
|
fields.Float(
|
|
"Alcohol Volume", digits='ethanol_volume_unit',
|
|
help="The volume of ethanol/alcohol gained or lost."),
|
|
'get_ethanol_volume')
|
|
ethanol_volume_unit = fields.Function(
|
|
fields.Many2One('product.uom', "Alcohol Volume UoM"),
|
|
'get_ethanol_volume_unit')
|
|
|
|
@classmethod
|
|
def get_ethanol_volume(cls, productions, name):
|
|
pool = Pool()
|
|
Configuration = pool.get('stock.configuration')
|
|
configuration = Configuration(1)
|
|
UoM = pool.get('product.uom')
|
|
ModelData = pool.get('ir.model.data')
|
|
Move = pool.get('stock.move')
|
|
|
|
move = Move.__table__()
|
|
cursor = Transaction().connection.cursor()
|
|
|
|
liter = UoM(ModelData.get_id('product', 'uom_liter'))
|
|
production = Coalesce(move.production_input, move.production_output)
|
|
query = move.select(
|
|
production,
|
|
Coalesce(Sum(
|
|
move.internal_ethanol_volume,
|
|
filter_=move.production_output != Null), 0)
|
|
- Coalesce(Sum(
|
|
move.internal_ethanol_volume,
|
|
filter_=move.production_input != Null), 0),
|
|
group_by=[production])
|
|
|
|
ethanol_volumes = defaultdict(int)
|
|
production_ids = [p.id for p in productions]
|
|
query.where = (
|
|
fields.SQL_OPERATORS['in'](move.production_input, production_ids)
|
|
| fields.SQL_OPERATORS['in'](
|
|
move.production_output, production_ids))
|
|
cursor.execute(*query)
|
|
ethanol_volumes.update(cursor)
|
|
|
|
for company, production in groupby(
|
|
productions, key=lambda p: p.company):
|
|
uom = configuration.get_multivalue(
|
|
'ethanol_volume_uom', company=company.id)
|
|
for production in productions:
|
|
ethanol_volumes[production.id] = UoM.compute_qty(
|
|
liter, ethanol_volumes[production.id], uom)
|
|
return ethanol_volumes
|
|
|
|
@classmethod
|
|
def get_ethanol_volume_unit(cls, productions, name):
|
|
pool = Pool()
|
|
Configuration = pool.get('stock.configuration')
|
|
configuration = Configuration(1)
|
|
units = {}
|
|
for company, productions in groupby(
|
|
productions, key=lambda m: m.company):
|
|
uom = configuration.get_multivalue(
|
|
'ethanol_volume_uom', company=company.id)
|
|
for production in productions:
|
|
units[production.id] = uom.id
|
|
return units
|