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.
 
 
 

135 lines
4.8 KiB

# Copyright 2019 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import _, api, exceptions, fields, models
class Agreement(models.Model):
_inherit = 'agreement'
code = fields.Char(required=False)
sale_ids = fields.One2many(
'sale.order', 'agreement_id', string="Sale Orders"
)
is_sale_agreement = fields.Boolean(
'Sale Agreement?', compute='_compute_is_sale_agreement', store=True
)
is_customer_requirement = fields.Boolean('Customer requirement?')
@api.depends('sale_ids')
def _compute_is_sale_agreement(self):
for rec in self:
rec.is_sale_agreement = bool(rec.sale_ids)
@api.model
def _get_customer_agreement_fields(self):
"""return a list of field names which are related to customer preferences"""
# extend the list in modules implementing specific conditions
return []
@api.model
def _get_sale_agreement_fields(self):
"""return a list of field names which are related to sale conditions"""
# extend the list in modules implementing specific conditions
return []
def _get_agreement_fields(self):
return self._get_sale_agreement_fields() + \
self._get_customer_agreement_fields()
def template_prepare_agreement_values(self, sale_order):
self.ensure_one()
assert self.is_template, \
(
'Programming error: '
'this method must only be called on a template agreement'
)
fields = ['agreement_type_id'] + self._get_sale_agreement_fields()
tmpl_values = self.read(fields, load='_classic_write')[0]
del tmpl_values['id']
tmpl_values.update(
{
'name': self.agreement_type_id.name,
'is_template': False,
'is_customer_requirement': False
}
)
partner = sale_order.partner_id
customer_settings = partner.customer_agreement_settings_id
assert not customer_settings or \
customer_settings.is_customer_requirement, \
'customer_settings must be a customer requirement agreement'
if customer_settings:
fields = self._get_customer_agreement_fields()
cust_vals = customer_settings.read(
fields, load='_classic_write'
)[0]
del cust_vals['id']
tmpl_values.update(cust_vals)
tmpl_values['name'] = self.agreement_type.name
return tmpl_values
@api.multi
def write(self, values):
res = super().write(values)
if values.get('agreement_type_id'):
self._check_agreement_type_default_agreement()
return res
@api.model_create_multi
@api.returns('self', lambda value: value.id)
def create(self, vals_list):
res = super().create(vals_list)
res._check_agreement_type_default_agreement()
return res
def _check_agreement_type_default_agreement(self):
# if we are setting an agreement type on a template agreement then the
# template agreement becomes the default agreement of the agreement
# type
template_agreements = self.filtered('is_template')
for template in template_agreements:
agreement_type = template.agreement_type_id
if not agreement_type.default_agreement_id:
agreement_type.default_agreement_id = template
elif agreement_type.default_agreement_id == template:
continue
else:
raise exceptions.UserError(
_('It is forbidden to have 2 templates in the '
'same agreement type.')
)
def _values_for_clear_defaults(self):
values = {}
for field in self._get_customer_agreement_fields():
values[field] = False
return values
@api.onchange('is_template')
def onchange_is_template(self):
if self.is_template:
self.unset_customer_defaults()
self.partner_id = False
def unset_customer_defaults(self):
values = self._values_for_clear_defaults()
for rec in self:
rec.update(values)
@api.onchange('is_customer_requirement')
def onchange_is_customer(self):
if self.is_customer_requirement:
self.is_template = False
self.set_customer_defaults()
def _get_customer_defaults_values(self):
ParameterValue = self.env['agreement.parameter.value']
values = {}
for field in self._get_customer_agreement_fields():
values[field] = ParameterValue.get_default(field)
return values
def set_customer_defaults(self):
values = self._get_customer_defaults_values()
for rec in self:
rec.update(values)