78 lines
3.5 KiB
Python
78 lines
3.5 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||
|
|
||
|
import datetime
|
||
|
|
||
|
from odoo import api, fields, models
|
||
|
from odoo.tools.sql import column_exists, create_column
|
||
|
|
||
|
|
||
|
class StockMoveLine(models.Model):
|
||
|
_inherit = "stock.move.line"
|
||
|
|
||
|
expiration_date = fields.Datetime(
|
||
|
string='Expiration Date', compute='_compute_expiration_date', store=True,
|
||
|
help='This is the date on which the goods with this Serial Number may'
|
||
|
' become dangerous and must not be consumed.')
|
||
|
is_expired = fields.Boolean(related='lot_id.product_expiry_alert')
|
||
|
use_expiration_date = fields.Boolean(
|
||
|
string='Use Expiration Date', related='product_id.use_expiration_date')
|
||
|
|
||
|
def _auto_init(self):
|
||
|
""" Create column for 'expiration_date' here to avoid MemoryError when letting
|
||
|
the ORM compute it after module installation. Since both 'lot_id.expiration_date'
|
||
|
and 'product_id.use_expiration_date' are new fields introduced in this module,
|
||
|
there is no need for an UPDATE statement here.
|
||
|
"""
|
||
|
if not column_exists(self._cr, "stock_move_line", "expiration_date"):
|
||
|
create_column(self._cr, "stock_move_line", "expiration_date", "timestamp")
|
||
|
return super()._auto_init()
|
||
|
|
||
|
@api.depends('product_id', 'lot_id.expiration_date', 'picking_id.scheduled_date')
|
||
|
def _compute_expiration_date(self):
|
||
|
for move_line in self:
|
||
|
if move_line.lot_id.expiration_date:
|
||
|
move_line.expiration_date = move_line.lot_id.expiration_date
|
||
|
elif move_line.picking_type_use_create_lots:
|
||
|
if move_line.product_id.use_expiration_date:
|
||
|
if not move_line.expiration_date:
|
||
|
from_date = move_line.picking_id.scheduled_date or fields.Datetime.today()
|
||
|
move_line.expiration_date = from_date + datetime.timedelta(days=move_line.product_id.expiration_time)
|
||
|
else:
|
||
|
move_line.expiration_date = False
|
||
|
|
||
|
@api.onchange('lot_id')
|
||
|
def _onchange_lot_id(self):
|
||
|
if not self.picking_type_use_existing_lots or not self.product_id.use_expiration_date:
|
||
|
return
|
||
|
if self.lot_id:
|
||
|
self.expiration_date = self.lot_id.expiration_date
|
||
|
else:
|
||
|
self.expiration_date = False
|
||
|
|
||
|
@api.onchange('product_id', 'product_uom_id', 'picking_id')
|
||
|
def _onchange_product_id(self):
|
||
|
res = super()._onchange_product_id()
|
||
|
if self.picking_type_use_create_lots:
|
||
|
if self.product_id.use_expiration_date:
|
||
|
from_date = self.picking_id.scheduled_date or fields.Datetime.today()
|
||
|
self.expiration_date = from_date + datetime.timedelta(days=self.product_id.expiration_time)
|
||
|
else:
|
||
|
self.expiration_date = False
|
||
|
return res
|
||
|
|
||
|
def _assign_production_lot(self, lot):
|
||
|
super()._assign_production_lot(lot)
|
||
|
self.lot_id._update_date_values(self[0].expiration_date)
|
||
|
|
||
|
def _get_value_production_lot(self):
|
||
|
res = super()._get_value_production_lot()
|
||
|
if self.expiration_date:
|
||
|
res.update({
|
||
|
'expiration_date': self.expiration_date,
|
||
|
'use_date': self.expiration_date - datetime.timedelta(days=self.product_id.use_time),
|
||
|
'removal_date': self.expiration_date - datetime.timedelta(days=self.product_id.removal_time),
|
||
|
'alert_date': self.expiration_date - datetime.timedelta(days=self.product_id.alert_time),
|
||
|
})
|
||
|
return res
|