222 lines
9.9 KiB
Python
Executable File
222 lines
9.9 KiB
Python
Executable File
import stdnum.exceptions
|
|
from sql import Column, Literal
|
|
import datetime
|
|
from sql.aggregate import Count, Max, Min, Sum, Avg, BoolOr
|
|
from sql.conditionals import Case
|
|
from stdnum import get_cc_module
|
|
from sql.functions import CharLength, CurrentTimestamp, DateTrunc, Extract
|
|
from trytond.i18n import gettext
|
|
from trytond.model import (
|
|
DeactivableMixin, Index, ModelSQL, ModelView, MultiValueMixin, Unique,
|
|
ValueMixin, convert_from, fields, sequence_ordered)
|
|
from trytond.model.exceptions import AccessError
|
|
from trytond.pool import Pool
|
|
from trytond.pyson import Bool, Eval
|
|
from trytond.tools import is_full_text, lstrip_wildcard
|
|
from trytond.transaction import Transaction, inactive_records
|
|
from trytond.wizard import Button, StateTransition, StateView, Wizard
|
|
|
|
|
|
class PriceValue(
|
|
DeactivableMixin, ModelSQL, ModelView,
|
|
MultiValueMixin):
|
|
"Price Value"
|
|
__name__ = 'price.price_value'
|
|
|
|
price = fields.Many2One(
|
|
'price.price', "Price", required=True, ondelete='CASCADE',
|
|
states={
|
|
'readonly': Eval('id', 0) > 0,
|
|
})
|
|
|
|
price_index = fields.Function(fields.Char("Price index",
|
|
states={
|
|
'readonly': Eval('id', 0) > 0,
|
|
}), 'get_price_index')
|
|
|
|
price_date = fields.Date("Price date")
|
|
price_value = fields.Float("Price value")
|
|
open_price = fields.Float("Open price")
|
|
low_price = fields.Float("Low price")
|
|
high_price = fields.Float("High price")
|
|
|
|
def get_price_index(self, name):
|
|
if self.price:
|
|
return self.price.price_index
|
|
return None
|
|
|
|
class PriceValueReport(
|
|
ModelSQL, ModelView):
|
|
"Price Value Report"
|
|
__name__ = 'price.price_value.report'
|
|
|
|
r_price = fields.Many2One('price.price', "Price")
|
|
r_price_index = fields.Char("Price index")
|
|
r_price_desc = fields.Char("Description")
|
|
r_price_date = fields.Date("Price date")
|
|
r_price_value = fields.Float("Price")
|
|
r_open_price = fields.Float("Open price")
|
|
r_low_price = fields.Float("Low price")
|
|
r_high_price = fields.Float("High price")
|
|
|
|
@classmethod
|
|
def table_query(cls):
|
|
pool = Pool()
|
|
PriceValue = pool.get('price.price_value')
|
|
Price = pool.get('price.price')
|
|
pp = Price.__table__()
|
|
pv = PriceValue.__table__()
|
|
|
|
context = Transaction().context
|
|
dt = context.get('dt')
|
|
user = context.get('user')
|
|
|
|
wh = ((pp.price_area == 'platts') & (pv.price_date == dt - datetime.timedelta(1)))
|
|
#if user:
|
|
# wh &= ()
|
|
|
|
query = pv.join(pp, condition=pv.price == pp.id).select(
|
|
Literal(0).as_('create_uid'),
|
|
CurrentTimestamp().as_('create_date'),
|
|
Literal(None).as_('write_uid'),
|
|
Literal(None).as_('write_date'),
|
|
pv.id.as_('id'),
|
|
pv.price.as_('r_price'),
|
|
pp.price_index.as_('r_price_index'),
|
|
pp.price_desc.as_('r_price_desc'),
|
|
pv.price_date.as_('r_price_date'),
|
|
pv.price_value.as_('r_price_value'),
|
|
pv.open_price.as_('r_open_price'),
|
|
pv.low_price.as_('r_low_price'),
|
|
pv.high_price.as_('r_high_price'),
|
|
where=wh)
|
|
|
|
return query
|
|
|
|
class PVRContext(ModelView):
|
|
"Price Value Report Context"
|
|
__name__ = 'price.price_value.report.context'
|
|
|
|
dt = fields.Date("Value date")
|
|
user = fields.Many2One('res.user', "User")
|
|
|
|
@classmethod
|
|
def default_dt(cls):
|
|
pool = Pool()
|
|
Date = pool.get('ir.date')
|
|
return Date.today()#.replace(day=1,month=1,year=1999)
|
|
|
|
class PriceValueReport2(
|
|
ModelSQL, ModelView):
|
|
"Price Value Report"
|
|
__name__ = 'price.price_value.report2'
|
|
|
|
r_price = fields.Many2One('price.price', "Price")
|
|
r_price_index = fields.Char("Price index")
|
|
r_price_desc = fields.Char("Description")
|
|
r_price_date = fields.Date("Price date")
|
|
r_price_value = fields.Float("Price")
|
|
r_open_price = fields.Float("Open price")
|
|
r_low_price = fields.Float("Low price")
|
|
r_high_price = fields.Float("High price")
|
|
r_naphta_fob_low = fields.Float("Naph F Med l", digits=(1,2), help="Naphta Fob PAAAI00 low")
|
|
r_naphta_fob_high = fields.Float("Naph F Med h", digits=(1,2), help="Naphta Fob PAAAI00 high")
|
|
r_naphta_fob_mid = fields.Float("Naph F Med m", digits=(1,2), help="Naphta Fob PAAAI00 mid")
|
|
r_jet_fob_low = fields.Float("Jet F Ara l", digits=(1,2), help="Jet Fob AAIDL00 low")
|
|
r_jet_fob_high = fields.Float("Jet F Ara h", digits=(1,2), help="Jet Fob AAIDL00 high")
|
|
r_jet_fob_mid = fields.Float("Jet F Ara m", digits=(1,2), help="Jet Fob AAIDL00 mid")
|
|
r_naphta_cif_low = fields.Float("Naph C Med l", digits=(1,2), help="Naphta Cif PAAAH00 low")
|
|
r_naphta_cif_high = fields.Float("Naph C Med h", digits=(1,2), help="Naphta Cif PAAAH00 high")
|
|
r_naphta_cif_mid = fields.Float("Naph C Med m", digits=(1,2), help="Naphta Cif PAAAH00 mid")
|
|
r_jet_cif_low = fields.Float("Jet C Ara l", digits=(1,2), help="Naphta Cif AAZBN00 low")
|
|
r_jet_cif_high = fields.Float("Jet C Ara h", digits=(1,2), help="Naphta Cif AAZBN00 high")
|
|
r_jet_cif_mid = fields.Float("Jet C Ara m", digits=(1,2), help="Naphta Cif AAZBN00 mid")
|
|
r_eur_fob_low = fields.Float("Ebob F Rdm l", digits=(1,2), help="Eurobob Fob AAQZV00 low")
|
|
r_eur_fob_high = fields.Float("Ebob F Rdm h", digits=(1,2), help="Eurobob Fob AAQZV00 high")
|
|
r_eur_fob_mid = fields.Float("Ebob F Rdm m", digits=(1,2), help="Eurobob Fob AAQZV00 mid")
|
|
r_gaz_cif_low = fields.Float("Gas10 C Ara l", digits=(1,2), help="Gasoline Cif AAXFQ00 low")
|
|
r_gaz_cif_high = fields.Float("Gas10 C Ara h", digits=(1,2), help="Gasoline Cif AAXFQ00 high")
|
|
r_gaz_cif_mid = fields.Float("Gas10 C Ara m", digits=(1,2), help="Gasoline Cif AAXFQ00 mid")
|
|
r_brent_1 = fields.Float("Brent1 m", digits=(1,2), help="Brent AAYES00 mid")
|
|
r_brent_2 = fields.Float("Brent2 m", digits=(1,2), help="Brent AAYET00 mid")
|
|
|
|
@classmethod
|
|
def __setup__(cls):
|
|
super(PriceValueReport2, cls).__setup__()
|
|
cls._order.insert(0, ('r_price_date', 'DESC'))
|
|
|
|
@classmethod
|
|
def table_query(cls):
|
|
pool = Pool()
|
|
PriceValue = pool.get('price.price_value')
|
|
Price = pool.get('price.price')
|
|
pp = Price.__table__()
|
|
pv = PriceValue.__table__()
|
|
|
|
context = Transaction().context
|
|
dtfrom = context.get('dtfrom')
|
|
dtto = context.get('dtto')
|
|
#user = context.get('user')
|
|
|
|
wh = ((pp.price_area == 'platts') & (pv.price_date <= dtto) & (pv.price_date >= dtfrom))
|
|
|
|
query = pv.join(pp, condition=pv.price == pp.id).select(
|
|
Literal(0).as_('create_uid'),
|
|
CurrentTimestamp().as_('create_date'),
|
|
Literal(None).as_('write_uid'),
|
|
Literal(None).as_('write_date'),
|
|
Max(pv.id).as_('id'),
|
|
Max(pv.price).as_('r_price'),
|
|
Max(pp.price_index).as_('r_price_index'),
|
|
Max(pp.price_desc).as_('r_price_desc'),
|
|
pv.price_date.as_('r_price_date'),
|
|
Max(pv.price_value).as_('r_price_value'),
|
|
Max(pv.open_price).as_('r_open_price'),
|
|
Max(pv.low_price).as_('r_low_price'),
|
|
Max(pv.high_price).as_('r_high_price'),
|
|
Max(Case((pv.price==15, pv.low_price),else_=0)).as_('r_naphta_fob_low'),
|
|
Max(Case((pv.price==15, pv.high_price),else_=0)).as_('r_naphta_fob_high'),
|
|
Max(Case((pv.price==15, (pv.high_price-pv.low_price)/2 + pv.low_price),else_=0)).as_('r_naphta_fob_mid'),
|
|
Max(Case((pv.price==9, pv.low_price),else_=0)).as_('r_jet_fob_low'),
|
|
Max(Case((pv.price==9, pv.high_price),else_=0)).as_('r_jet_fob_high'),
|
|
Max(Case((pv.price==9, (pv.high_price-pv.low_price)/2 + pv.low_price),else_=0)).as_('r_jet_fob_mid'),
|
|
Max(Case((pv.price==16, pv.low_price),else_=0)).as_('r_naphta_cif_low'),
|
|
Max(Case((pv.price==16, pv.high_price),else_=0)).as_('r_naphta_cif_high'),
|
|
Max(Case((pv.price==16, (pv.high_price-pv.low_price)/2 + pv.low_price),else_=0)).as_('r_naphta_cif_mid'),
|
|
Max(Case((pv.price==17, pv.low_price),else_=0)).as_('r_jet_cif_low'),
|
|
Max(Case((pv.price==17, pv.high_price),else_=0)).as_('r_jet_cif_high'),
|
|
Max(Case((pv.price==17, (pv.high_price-pv.low_price)/2 + pv.low_price),else_=0)).as_('r_jet_cif_mid'),
|
|
Max(Case((pv.price==11, pv.low_price),else_=0)).as_('r_eur_fob_low'),
|
|
Max(Case((pv.price==11, pv.high_price),else_=0)).as_('r_eur_fob_high'),
|
|
Max(Case((pv.price==11, (pv.high_price-pv.low_price)/2 + pv.low_price),else_=0)).as_('r_eur_fob_mid'),
|
|
Max(Case((pv.price==18, pv.low_price),else_=0)).as_('r_gaz_cif_low'),
|
|
Max(Case((pv.price==18, pv.high_price),else_=0)).as_('r_gaz_cif_high'),
|
|
Max(Case((pv.price==18, (pv.high_price-pv.low_price)/2 + pv.low_price),else_=0)).as_('r_gaz_cif_mid'),
|
|
Max(Case((pv.price==19, (pv.high_price-pv.low_price)/2 + pv.low_price),else_=0)).as_('r_brent_1'),
|
|
Max(Case((pv.price==20, (pv.high_price-pv.low_price)/2 + pv.low_price),else_=0)).as_('r_brent_2'),
|
|
|
|
where=wh,
|
|
group_by=[pv.price_date])
|
|
|
|
return query
|
|
|
|
class PVRContext2(ModelView):
|
|
"Price Value Report Context"
|
|
__name__ = 'price.price_value.report.context2'
|
|
|
|
dtfrom = fields.Date("From")
|
|
dtto = fields.Date("To")
|
|
user = fields.Many2One('res.user', "User")
|
|
|
|
@classmethod
|
|
def default_dtto(cls):
|
|
pool = Pool()
|
|
Date = pool.get('ir.date')
|
|
return Date.today() - datetime.timedelta(1)#.replace(day=1,month=1,year=1999)
|
|
|
|
@classmethod
|
|
def default_dtfrom(cls):
|
|
pool = Pool()
|
|
Date = pool.get('ir.date')
|
|
return Date.today() - datetime.timedelta(30)#.replace(day=1,month=1,year=1999)
|