134 lines
5.2 KiB
Python
Executable File
134 lines
5.2 KiB
Python
Executable File
import stdnum.exceptions
|
|
import logging
|
|
from sql import Column, Literal
|
|
from sql.aggregate import Min
|
|
from sql.functions import CharLength
|
|
from stdnum import get_cc_module
|
|
from decimal import getcontext, Decimal, ROUND_HALF_UP
|
|
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
|
|
from datetime import date, timedelta, datetime
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
class Price(
|
|
DeactivableMixin, ModelSQL, ModelView,
|
|
MultiValueMixin):
|
|
"Price"
|
|
__name__ = 'price.price'
|
|
_rec_name = 'price_index'
|
|
price = fields.Many2One('price.price',"Composite")
|
|
price_index = fields.Char("Price index", required=True)
|
|
price_desc = fields.Char("Description", required=True)
|
|
price_period = fields.Many2One('product.month',"Period")
|
|
price_curve_type = fields.Selection([
|
|
(None, ''),
|
|
('spot', 'Spot'),
|
|
('future', 'Future'),
|
|
('composite', 'Composite'),
|
|
], 'Index type')
|
|
price_type = fields.Many2One('price.fixtype', "Fixation type")
|
|
price_unit = fields.Many2One('product.uom', "Unit")
|
|
price_currency = fields.Many2One('currency.currency', "Currency")
|
|
price_area = fields.Many2One('price.area',"Market area")
|
|
price_calendar = fields.Many2One('price.calendar',"Calendar")
|
|
price_values = fields.One2Many('price.price_value', 'price', "Prices Values")
|
|
price_composite = fields.One2Many('price.composite','price',"Composites")
|
|
price_product = fields.One2Many('price.product', 'price', "Product")
|
|
price_ct_size = fields.Numeric("Ct size")
|
|
|
|
def get_qt(self,nb_ct,unit):
|
|
Uom = Pool().get('product.uom')
|
|
return round(Decimal(Uom.compute_qty(self.price_unit, float(self.price_ct_size * nb_ct), unit)),2)
|
|
|
|
def get_price_per_qt(self,price,unit,currency):
|
|
price_qt = float(0)
|
|
Uom = Pool().get('product.uom')
|
|
Currency = Pool().get('currency.currency')
|
|
rates = Currency._get_rate([self.price_currency])
|
|
if rates[self.price_currency.id]:
|
|
price_qt = float(price) * Uom.compute_qty(unit, float(1), self.price_unit) * float(rates[self.price_currency.id])
|
|
return round(price_qt,2)
|
|
|
|
def get_amount_nb_ct(self,price,nb_ct,unit,currency):
|
|
amount = Decimal(0)
|
|
Uom = Pool().get('product.uom')
|
|
if price:
|
|
amount = Decimal(self.get_price_per_qt(price,unit,currency)) * Decimal(Uom.compute_qty(self.price_unit, float(self.price_ct_size * nb_ct), unit))
|
|
return round(amount,2)
|
|
|
|
def get_price(self,dt,unit,currency,last=False):
|
|
price = float(0)
|
|
PV = Pool().get('price.price_value')
|
|
if self.price_values:
|
|
dt = dt.strftime("%Y-%m-%d")
|
|
pv = PV.search([('price','=',self.id),('price_date','=',dt)])
|
|
if not pv and last:
|
|
pv = PV.search([('price','=',self.id)],order=[('price_date', 'DESC')])
|
|
if pv:
|
|
price = self.get_price_per_qt(pv[0].price_value,unit,currency)
|
|
return round(price,2)
|
|
|
|
class FixType(ModelSQL,ModelView):
|
|
"Fixation type"
|
|
__name__ = 'price.fixtype'
|
|
name = fields.Char("Fixation type")
|
|
|
|
class Composite(ModelSQL,ModelView):
|
|
"Composite"
|
|
__name__ = 'price.composite'
|
|
price = fields.Many2One(
|
|
'price.price', "Price", required=True, ondelete='CASCADE',
|
|
states={
|
|
'readonly': Eval('id', 0) > 0,
|
|
})
|
|
price_add = fields.Many2One('price.price',"Price index")
|
|
ratio = fields.Numeric("%")
|
|
|
|
class MarketArea(ModelSQL,ModelView):
|
|
"Market Area"
|
|
__name__ = 'price.area'
|
|
name = fields.Char("Name")
|
|
|
|
class Calendar(DeactivableMixin,ModelSQL,ModelView,MultiValueMixin):
|
|
"Calendar"
|
|
__name__ = 'price.calendar'
|
|
name = fields.Char("Name")
|
|
calendar_line = fields.One2Many('price.calendar.line','calendar',"Calendar lines")
|
|
|
|
def IsQuote(self,dt):
|
|
CL = Pool().get('price.calendar.line')
|
|
if self.calendar_line:
|
|
dt = dt.strftime("%Y-%m-%d")
|
|
cl = CL.search([('calendar','=',self.id),('price_date','=',dt)])
|
|
if cl:
|
|
logger.info("ISQUOTE:%s",cl)
|
|
return False
|
|
else:
|
|
return True
|
|
|
|
class CalendarLine(DeactivableMixin,ModelSQL,ModelView,MultiValueMixin):
|
|
"Calendar line"
|
|
__name__ = 'price.calendar.line'
|
|
calendar = fields.Many2One('price.calendar',"Calendar")
|
|
price_date = fields.Date("Date")
|
|
price_state = fields.Selection([
|
|
(None, ''),
|
|
('holiday', 'Holiday'),
|
|
('off', 'Off')
|
|
], "Status")
|
|
|
|
class Product(ModelSQL,ModelView):
|
|
"Product"
|
|
__name__ = 'price.product'
|
|
price = fields.Many2One('price.price',"Price index")
|
|
product = fields.Many2One('product.product',"Product")
|