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

# 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