77 lines
4.1 KiB
Python
77 lines
4.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from datetime import timedelta
|
|
from odoo import api, fields, models, _
|
|
|
|
|
|
class SaleOrder(models.Model):
|
|
"""Add several date fields to Sale Orders, computed or user-entered"""
|
|
_inherit = 'sale.order'
|
|
|
|
commitment_date = fields.Datetime(compute='_compute_commitment_date', string='Commitment Date', store=True,
|
|
help="Date by which the products are sure to be delivered. This is "
|
|
"a date that you can promise to the customer, based on the "
|
|
"Product Lead Times.")
|
|
requested_date = fields.Datetime('Requested Date', readonly=True, states={'draft': [('readonly', False)],
|
|
'sent': [('readonly', False)]}, copy=False,
|
|
help="Date by which the customer has requested the items to be "
|
|
"delivered.\n"
|
|
"When this Order gets confirmed, the Delivery Order's "
|
|
"expected date will be computed based on this date and the "
|
|
"Company's Security Delay.\n"
|
|
"Leave this field empty if you want the Delivery Order to be "
|
|
"processed as soon as possible. In that case the expected "
|
|
"date will be computed using the default method: based on "
|
|
"the Product Lead Times and the Company's Security Delay.")
|
|
effective_date = fields.Date(compute='_compute_picking_ids', string='Effective Date', store=True,
|
|
help="Date on which the first Delivery Order was created.")
|
|
|
|
@api.depends('date_order', 'order_line.customer_lead')
|
|
def _compute_commitment_date(self):
|
|
"""Compute the commitment date"""
|
|
for order in self:
|
|
dates_list = []
|
|
order_datetime = fields.Datetime.from_string(order.date_order)
|
|
for line in order.order_line.filtered(lambda x: x.state != 'cancel'):
|
|
dt = order_datetime + timedelta(days=line.customer_lead or 0.0)
|
|
dates_list.append(dt)
|
|
if dates_list:
|
|
commit_date = min(dates_list) if order.picking_policy == 'direct' else max(dates_list)
|
|
order.commitment_date = fields.Datetime.to_string(commit_date)
|
|
|
|
def _compute_picking_ids(self):
|
|
super(SaleOrder, self)._compute_picking_ids()
|
|
for order in self:
|
|
dates_list = []
|
|
for pick in order.picking_ids:
|
|
dates_list.append(fields.Datetime.from_string(pick.date))
|
|
if dates_list:
|
|
order.effective_date = fields.Datetime.to_string(min(dates_list))
|
|
|
|
@api.onchange('requested_date')
|
|
def onchange_requested_date(self):
|
|
"""Warn if the requested dates is sooner than the commitment date"""
|
|
if (self.requested_date and self.commitment_date and self.requested_date < self.commitment_date):
|
|
return {'warning': {
|
|
'title': _('Requested date is too soon!'),
|
|
'message': _("The date requested by the customer is "
|
|
"sooner than the commitment date. You may be "
|
|
"unable to honor the customer's request.")
|
|
}
|
|
}
|
|
|
|
|
|
class SaleOrderLine(models.Model):
|
|
_inherit = 'sale.order.line'
|
|
|
|
@api.multi
|
|
def _prepare_order_line_procurement(self, group_id):
|
|
vals = super(SaleOrderLine, self)._prepare_order_line_procurement(group_id=group_id)
|
|
for line in self.filtered("order_id.requested_date"):
|
|
date_planned = fields.Datetime.from_string(line.order_id.requested_date) - timedelta(days=line.order_id.company_id.security_lead)
|
|
vals.update({
|
|
'date_planned': fields.Datetime.to_string(date_planned),
|
|
})
|
|
return vals
|