You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
3.9 KiB
123 lines
3.9 KiB
# Copyright 2019 Camptocamp SA
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
import logging
|
|
|
|
from odoo import api, fields, models
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class SaleOrder(models.Model):
|
|
_inherit = "sale.order"
|
|
|
|
agreement_type_id = fields.Many2one(
|
|
'agreement.type',
|
|
string='Agreement Type',
|
|
required=True,
|
|
copy=True,
|
|
default=lambda s: s.env['agreement.type'].search([], limit=1),
|
|
)
|
|
agreement_id = fields.Many2one(
|
|
domain=[
|
|
('is_template', '=', False),
|
|
('is_customer_requirement', '=', False),
|
|
],
|
|
readonly=True,
|
|
)
|
|
|
|
@api.onchange('agreement_type_id')
|
|
def onchange_agreement_type(self):
|
|
self._update_agreement()
|
|
|
|
@api.onchange('partner_id')
|
|
def onchange_partner_for_agreement(self):
|
|
if self.partner_id.default_agreement_type_id:
|
|
partner_agreement_type = self.partner_id.default_agreement_type_id
|
|
if self.agreement_type_id != partner_agreement_type:
|
|
self.agreement_type_id = partner_agreement_type
|
|
self._update_agreement()
|
|
|
|
def _prepare_sale_agreement_values(self):
|
|
return {
|
|
'name': self.agreement_type_id.name,
|
|
'partner_id': self.partner_id.id,
|
|
'agreement_type_id': self.agreement_type_id.id,
|
|
'is_template': False,
|
|
'is_customer_requirement': False,
|
|
}
|
|
|
|
def _update_agreement(self):
|
|
if not self.partner_id:
|
|
return
|
|
if not self.agreement_id and self.partner_id:
|
|
self.agreement_id = self.env['agreement'].create(
|
|
self._prepare_sale_agreement_values()
|
|
)
|
|
agreement_template = self.agreement_type_id.default_agreement_id
|
|
agreement_values = {}
|
|
if agreement_template:
|
|
if not agreement_template.is_template:
|
|
_logger.warn(
|
|
'The default agreement of the agreement type %s '
|
|
'is not a template agreement',
|
|
self.agreement_type_id)
|
|
else:
|
|
agreement_values = \
|
|
agreement_template.template_prepare_agreement_values(
|
|
self
|
|
)
|
|
self.agreement_id.write(agreement_values)
|
|
|
|
@api.model
|
|
def create(self, vals):
|
|
rec = super().create(vals)
|
|
if rec.agreement_id and not rec.agreement_id.code:
|
|
rec.agreement_id.code = rec.name
|
|
return rec
|
|
|
|
@api.multi
|
|
def unlink(self):
|
|
agreements = self.mapped('agreement_id')
|
|
res = super().unlink()
|
|
agreements.sudo().unlink()
|
|
return res
|
|
|
|
@api.multi
|
|
def _action_confirm(self):
|
|
self.filtered(lambda r: not r.agreement_id)._update_agreement()
|
|
result = super()._action_confirm()
|
|
self._apply_agreement()
|
|
return result
|
|
|
|
@api.multi
|
|
def copy_data(self, default=None):
|
|
if default is None:
|
|
default = {}
|
|
if 'agreement_id' not in default and self.agreement_id:
|
|
new_agreement = self.agreement_id.copy()
|
|
default['agreement_id'] = new_agreement.id
|
|
return super().copy_data(default=default)
|
|
|
|
def _apply_agreement(self):
|
|
# Nothing to do for now on the SO itself
|
|
return
|
|
|
|
@api.multi
|
|
def _prepare_invoice(self):
|
|
values = super()._prepare_invoice()
|
|
values['agreement_id'] = self.agreement_id.id
|
|
return values
|
|
|
|
|
|
class SaleOrderLine(models.Model):
|
|
_inherit = 'sale.order.line'
|
|
|
|
def _prepare_procurement_values(self, group_id=False):
|
|
agreement = self.order_id.agreement_id
|
|
values = super()._prepare_procurement_values(group_id=group_id)
|
|
values['agreement_id'] = agreement.id
|
|
# if agreement.delivery_date:
|
|
# values['date_planned'] = agreement.delivery_date - timedelta(
|
|
# days=self.order_id.company_id.security_lead
|
|
# )
|
|
return values
|