01.04.26
This commit is contained in:
@@ -394,16 +394,22 @@ class Sale(metaclass=PoolMeta):
|
||||
return ''
|
||||
|
||||
@property
|
||||
def report_delivery(self):
|
||||
del_date = 'PROMPT'
|
||||
if self.lines:
|
||||
if self.lines[0].estimated_date:
|
||||
delivery_date = [dd.estimated_date for dd in self.lines[0].estimated_date if dd.trigger=='deldate']
|
||||
if delivery_date:
|
||||
del_date = delivery_date[0]
|
||||
if del_date:
|
||||
del_date = format_date_en(del_date)
|
||||
return del_date
|
||||
def report_delivery(self):
|
||||
del_date = 'PROMPT'
|
||||
if self.lines:
|
||||
if self.lines[0].estimated_date:
|
||||
delivery_date = [dd.estimated_date for dd in self.lines[0].estimated_date if dd.trigger=='deldate']
|
||||
if delivery_date:
|
||||
del_date = delivery_date[0]
|
||||
if del_date:
|
||||
del_date = format_date_en(del_date)
|
||||
return del_date
|
||||
|
||||
@property
|
||||
def report_delivery_period_description(self):
|
||||
if self.lines and self.lines[0].del_period:
|
||||
return self.lines[0].del_period.description or ''
|
||||
return ''
|
||||
|
||||
@property
|
||||
def report_payment_date(self):
|
||||
@@ -547,12 +553,14 @@ class Sale(metaclass=PoolMeta):
|
||||
# OpenPosition = Pool().get('open.position')
|
||||
# OpenPosition.create_from_sale_line(line)
|
||||
|
||||
if line.price_type == 'basis' and line.lots: #line.price_pricing and line.price_components and
|
||||
unit_price = line.get_basis_price()
|
||||
if unit_price != line.unit_price:
|
||||
Line = Pool().get('sale.line')
|
||||
line.unit_price = unit_price
|
||||
Line.save([line])
|
||||
if line.price_type == 'basis' and line.lots: #line.price_pricing and line.price_components and
|
||||
previous_linked_price = line.linked_price
|
||||
line.sync_linked_price_from_basis()
|
||||
unit_price = line.get_basis_price()
|
||||
if unit_price != line.unit_price or line.linked_price != previous_linked_price:
|
||||
Line = Pool().get('sale.line')
|
||||
line.unit_price = unit_price
|
||||
Line.save([line])
|
||||
if line.price_type == 'efp':
|
||||
if line.derivatives:
|
||||
for d in line.derivatives:
|
||||
@@ -621,13 +629,14 @@ class SaleLine(metaclass=PoolMeta):
|
||||
# ('bci', 'BCI'),
|
||||
# ],"Certification",states={'readonly': (Eval('inherit_cer')),})
|
||||
inherit_cer = fields.Boolean("Inherit certification")
|
||||
enable_linked_currency = fields.Boolean("Linked currencies")
|
||||
linked_price = fields.Numeric("Price", digits='unit',states={
|
||||
'invisible': (~Eval('enable_linked_currency')),
|
||||
})
|
||||
linked_currency = fields.Many2One('currency.linked',"Currency",states={
|
||||
'invisible': (~Eval('enable_linked_currency')),
|
||||
})
|
||||
enable_linked_currency = fields.Boolean("Linked currencies")
|
||||
linked_price = fields.Numeric("Price", digits='unit',states={
|
||||
'invisible': (~Eval('enable_linked_currency')),
|
||||
'readonly': Eval('price_type') == 'basis',
|
||||
}, depends=['enable_linked_currency', 'price_type'])
|
||||
linked_currency = fields.Many2One('currency.linked',"Currency",states={
|
||||
'invisible': (~Eval('enable_linked_currency')),
|
||||
})
|
||||
linked_unit = fields.Many2One('product.uom', 'Unit',states={
|
||||
'invisible': (~Eval('enable_linked_currency')),
|
||||
})
|
||||
@@ -757,44 +766,132 @@ class SaleLine(metaclass=PoolMeta):
|
||||
if ps:
|
||||
return sum((e.progress if e.progress else 0) * (e.ratio if e.ratio else 0) / 100 for e in ps)
|
||||
|
||||
def getVirtualLot(self):
|
||||
if self.lots:
|
||||
return [l for l in self.lots if l.lot_type=='virtual'][0]
|
||||
|
||||
def get_price(self,lot_premium=0):
|
||||
return (self.unit_price + Decimal(lot_premium) + (self.premium if self.premium else Decimal(0))) if self.unit_price else Decimal(0)
|
||||
|
||||
def get_basis_price(self):
|
||||
price = Decimal(0)
|
||||
for pc in self.price_components:
|
||||
PP = Pool().get('sale.pricing.summary')
|
||||
pp = PP.search([('price_component','=',pc.id),('sale_line','=',self.id)])
|
||||
if pp:
|
||||
price += pp[0].price * (pc.ratio / 100)
|
||||
return round(price,4)
|
||||
|
||||
def get_price_linked_currency(self,lot_premium=0):
|
||||
if self.linked_unit:
|
||||
Uom = Pool().get('product.uom')
|
||||
qt = Uom.compute_qty(self.unit, float(1), self.linked_unit)
|
||||
return round(((self.linked_price + Decimal(lot_premium) + (self.premium if self.premium else Decimal(0))) * self.linked_currency.factor) * Decimal(qt), 4)
|
||||
else:
|
||||
return round((self.linked_price + Decimal(lot_premium) + (self.premium if self.premium else Decimal(0))) * self.linked_currency.factor, 4)
|
||||
|
||||
@fields.depends('id','unit','quantity','unit_price','price_pricing','price_type','price_components','premium','estimated_date','lots','fees','enable_linked_currency','linked_price','linked_currency','linked_unit')
|
||||
def on_change_with_unit_price(self, name=None):
|
||||
Date = Pool().get('ir.date')
|
||||
logger.info("ONCHANGEUNITPRICE:%s",self.unit_price)
|
||||
if self.price_type == 'basis' and self.lots: #self.price_pricing and self.price_components and
|
||||
logger.info("ONCHANGEUNITPRICE_IN:%s",self.get_basis_price())
|
||||
return self.get_basis_price()
|
||||
if self.enable_linked_currency and self.linked_price and self.linked_currency and self.price_type == 'priced':
|
||||
return self.get_price_linked_currency()
|
||||
if self.price_type == 'efp':
|
||||
if hasattr(self, 'derivatives') and self.derivatives:
|
||||
def getVirtualLot(self):
|
||||
if self.lots:
|
||||
return [l for l in self.lots if l.lot_type=='virtual'][0]
|
||||
|
||||
def _get_linked_unit_factor(self):
|
||||
if not (self.enable_linked_currency and self.linked_currency):
|
||||
return None
|
||||
factor = Decimal(self.linked_currency.factor or 0)
|
||||
if not factor:
|
||||
return None
|
||||
unit_factor = Decimal(1)
|
||||
if self.linked_unit:
|
||||
Uom = Pool().get('product.uom')
|
||||
unit_factor = Decimal(str(
|
||||
Uom.compute_qty(self.unit, float(1), self.linked_unit) or 0))
|
||||
return factor * unit_factor
|
||||
|
||||
def _linked_to_line_price(self, price):
|
||||
factor = self._get_linked_unit_factor()
|
||||
price = Decimal(price or 0)
|
||||
if not factor:
|
||||
return price
|
||||
return round(price * factor, 4)
|
||||
|
||||
def _line_to_linked_price(self, price):
|
||||
factor = self._get_linked_unit_factor()
|
||||
price = Decimal(price or 0)
|
||||
if not factor:
|
||||
return price
|
||||
return round(price / factor, 4)
|
||||
|
||||
def _get_premium_price(self):
|
||||
premium = Decimal(self.premium or 0)
|
||||
if not premium:
|
||||
return Decimal(0)
|
||||
if self.enable_linked_currency and self.linked_currency:
|
||||
return self._linked_to_line_price(premium)
|
||||
return premium
|
||||
|
||||
def get_price(self,lot_premium=0):
|
||||
return round(
|
||||
Decimal(self.unit_price or 0)
|
||||
+ Decimal(lot_premium or 0),
|
||||
4)
|
||||
|
||||
def _get_basis_component_price(self):
|
||||
price = Decimal(0)
|
||||
for pc in self.price_components:
|
||||
PP = Pool().get('sale.pricing.summary')
|
||||
pp = PP.search([('price_component','=',pc.id),('sale_line','=',self.id)])
|
||||
if pp:
|
||||
price += pp[0].price * (pc.ratio / 100)
|
||||
return round(price,4)
|
||||
|
||||
def get_basis_price(self):
|
||||
return round(self._get_basis_component_price(), 4)
|
||||
|
||||
def sync_linked_price_from_basis(self):
|
||||
if self.enable_linked_currency and self.linked_currency:
|
||||
self.linked_price = self._line_to_linked_price(
|
||||
self._get_basis_component_price())
|
||||
|
||||
def get_price_linked_currency(self,lot_premium=0):
|
||||
return round(
|
||||
self._linked_to_line_price(
|
||||
Decimal(self.linked_price or 0)
|
||||
+ Decimal(lot_premium or 0)),
|
||||
4)
|
||||
|
||||
@fields.depends('id','unit','quantity','unit_price','price_pricing','price_type','price_components','estimated_date','lots','fees','enable_linked_currency','linked_price','linked_currency','linked_unit')
|
||||
def on_change_with_unit_price(self, name=None):
|
||||
Date = Pool().get('ir.date')
|
||||
logger.info("ONCHANGEUNITPRICE:%s",self.unit_price)
|
||||
if self.price_type == 'basis':
|
||||
self.sync_linked_price_from_basis()
|
||||
logger.info("ONCHANGEUNITPRICE_IN:%s",self.get_basis_price())
|
||||
return self.get_basis_price()
|
||||
if self.enable_linked_currency and self.linked_price and self.linked_currency and self.price_type == 'priced':
|
||||
return self.get_price_linked_currency()
|
||||
if self.price_type == 'efp':
|
||||
if hasattr(self, 'derivatives') and self.derivatives:
|
||||
for d in self.derivatives:
|
||||
return d.price_index.get_price(Date.today(),self.unit,self.sale.currency,True)
|
||||
return self.get_price()
|
||||
return self.get_price()
|
||||
|
||||
@fields.depends(
|
||||
'type', 'quantity', 'unit_price', 'sale', '_parent_sale.currency',
|
||||
'premium', 'enable_linked_currency', 'linked_currency', 'linked_unit')
|
||||
def on_change_with_amount(self):
|
||||
if self.type == 'line':
|
||||
currency = self.sale.currency if self.sale else None
|
||||
amount = Decimal(str(self.quantity or 0)) * (
|
||||
Decimal(self.unit_price or 0) + self._get_premium_price())
|
||||
if currency:
|
||||
return currency.round(amount)
|
||||
return amount
|
||||
return Decimal(0)
|
||||
|
||||
@fields.depends(methods=['on_change_with_unit_price', 'on_change_with_amount'])
|
||||
def _recompute_trade_price_fields(self):
|
||||
self.unit_price = self.on_change_with_unit_price()
|
||||
self.amount = self.on_change_with_amount()
|
||||
|
||||
@fields.depends(methods=['_recompute_trade_price_fields'])
|
||||
def on_change_premium(self):
|
||||
self._recompute_trade_price_fields()
|
||||
|
||||
@fields.depends(methods=['_recompute_trade_price_fields'])
|
||||
def on_change_price_type(self):
|
||||
self._recompute_trade_price_fields()
|
||||
|
||||
@fields.depends(methods=['_recompute_trade_price_fields'])
|
||||
def on_change_enable_linked_currency(self):
|
||||
self._recompute_trade_price_fields()
|
||||
|
||||
@fields.depends(methods=['_recompute_trade_price_fields'])
|
||||
def on_change_linked_price(self):
|
||||
self._recompute_trade_price_fields()
|
||||
|
||||
@fields.depends(methods=['_recompute_trade_price_fields'])
|
||||
def on_change_linked_currency(self):
|
||||
self._recompute_trade_price_fields()
|
||||
|
||||
@fields.depends(methods=['_recompute_trade_price_fields'])
|
||||
def on_change_linked_unit(self):
|
||||
self._recompute_trade_price_fields()
|
||||
|
||||
def check_from_to(self,tr):
|
||||
if tr.pricing_period:
|
||||
|
||||
Reference in New Issue
Block a user