diff --git a/ffck_commons/__manifest__.py b/ffck_commons/__manifest__.py index 3cd42b9..e4fd078 100644 --- a/ffck_commons/__manifest__.py +++ b/ffck_commons/__manifest__.py @@ -11,16 +11,16 @@ "category": "Technical", "depends": [ "base", + "contacts", "l10n_fr_association", - "partner_contact_email2", - "partner_contact_phones2", - "partner_firstname", - "partner_multi_relation", "partner_contact_age_range", "partner_contact_birthdate", "partner_contact_gender", + "partner_contact_email2", "partner_contact_nationality", "partner_contact_personal_information_page", + "partner_contact_phones2", + "partner_firstname", ], "data": [ # Base data @@ -30,6 +30,7 @@ "security/ir.model.access.csv", # Views "views/res_partner.xml", + "views/ffck_structure_type.xml", # Wizards # 'wizards/ir_model_wizard.xml', # Reports diff --git a/ffck_commons/data/ffck_structure_type.xml b/ffck_commons/data/ffck_structure_type.xml index b7f80c8..1fdd133 100644 --- a/ffck_commons/data/ffck_structure_type.xml +++ b/ffck_commons/data/ffck_structure_type.xml @@ -3,50 +3,50 @@ - FFCK + Fédération FFCK - nat + 1 - CRCK + Regional Committee CRCK - reg + 2 - CDCK + Departmental Committee CDCK - dep + 3 Affiliate member CLUB - loc + 4 Type A agreed member AGRA - loc + 4 Type B agreed member AGRB - loc + 4 Conventioned member CONV - loc + 4 diff --git a/ffck_commons/data/res_partner.xml b/ffck_commons/data/res_partner.xml index 7a02642..1af8345 100644 --- a/ffck_commons/data/res_partner.xml +++ b/ffck_commons/data/res_partner.xml @@ -20,7 +20,7 @@ 78572437800050 0 - nat + 1 diff --git a/ffck_commons/i18n/fr.po b/ffck_commons/i18n/fr.po index 4a63bea..c077431 100644 --- a/ffck_commons/i18n/fr.po +++ b/ffck_commons/i18n/fr.po @@ -134,6 +134,12 @@ msgstr "Informations licencié" msgid "Local" msgstr "Locale" +#. module: ffck_commons +#: model:ir.model.fields,field_description:ffck_commons.field_res_partner__license_partner_id +#: model:ir.model.fields,field_description:ffck_commons.field_res_users__license_partner_id +msgid "Local partner" +msgstr "Structure Locale" + #. module: ffck_commons #: model:ir.model.fields,field_description:ffck_commons.field_ffck_structure_type__name msgid "Name" diff --git a/ffck_commons/models/ffck_structure_type.py b/ffck_commons/models/ffck_structure_type.py index 7dfa950..1f867a9 100644 --- a/ffck_commons/models/ffck_structure_type.py +++ b/ffck_commons/models/ffck_structure_type.py @@ -1,13 +1,21 @@ # -*- coding: utf-8 -*- from odoo import models, fields -from .res_partner import SCALES + +SCALES = [ + ("1", "National"), + ("2", "Regional"), + ("3", "Departmental"), + ("4", "Local"), + ("5", "Licensee"), +] class FfckStructureType(models.Model): _name = "ffck.structure.type" _description = "FFCK structure type" + _order = "scale, short, name, id" - name = fields.Char("Name", required=True) + name = fields.Char("Name", required=True, translate=True) short = fields.Char("Short", required=True, index=True) scale = fields.Selection(SCALES, string="Scale", required=True) active = fields.Boolean(string="Active", default=True) diff --git a/ffck_commons/models/res_partner.py b/ffck_commons/models/res_partner.py index 27a8828..d03e8b9 100644 --- a/ffck_commons/models/res_partner.py +++ b/ffck_commons/models/res_partner.py @@ -1,29 +1,12 @@ # -*- coding: utf-8 -*- from odoo import models, fields, api - -SCALES = [ - ("nat", "National"), - ("reg", "Regional"), - ("dep", "Departmental"), - ("loc", "Local"), - ("lic", "Licensee"), -] +from odoo.osv.expression import OR +from .ffck_structure_type import SCALES class ResPartner(models.Model): _inherit = "res.partner" - @api.model - def _get_ffck_partner(self): - ffck = self.env.ref("ffck_commons.res_partner_ffck", raise_if_not_found=False) - main = self.env.ref("base.main_partner") - if main.ref == "FFCK": - if ffck.active: - ffck.write({"active": False}) - return main - else: - return ffck - # Partner fields ffck_network = fields.Boolean(string="FFCK network") first_membership_date = fields.Date("Structure 1st membership") @@ -31,6 +14,8 @@ class ResPartner(models.Model): partner_scale = fields.Selection( selection=SCALES, string="Scale", + compute="_get_partner_scale", + store=True, ) ffck_structure_type_id = fields.Many2one( comodel_name="ffck.structure.type", string="Structure type" @@ -39,28 +24,43 @@ class ResPartner(models.Model): # partner_code_editable = fields.Boolean(string="FFCK code editable", compute="_can_edit_partner_code") # FFCK ffck_partner_id = fields.Many2one( - "res.partner", + comodel_name="res.partner", string="FFCK partner", - default=_get_ffck_partner, ondelete="restrict", + compute="_get_ffck_partner", + store=False, ) ffck_partner_code = fields.Char(string="FFCK", default="0", readonly=True) # CRCK crck_partner_id = fields.Many2one( - "res.partner", + comodel_name="res.partner", string="CRCK partner", index=True, ondelete="restrict", + compute="_get_crck_partner", + store=True, ) crck_partner_code = fields.Char(related="crck_partner_id.partner_code", store=True) # CDCK cdck_partner_id = fields.Many2one( - "res.partner", + comodel_name="res.partner", string="CDCK partner", index=True, ondelete="restrict", + compute="_get_cdck_partner", + store=True, ) cdck_partner_code = fields.Char(related="cdck_partner_id.partner_code", store=True) + local_partner_id = fields.Many2one( + comodel_name="res.partner", + string="Local partner", + index=True, + ondelete="restrict", + domain=[("ffck_network", "=", True), ("partner_scale", "=", 4)], + ) + local_partner_code = fields.Char( + related="local_partner_id.partner_code", store=True + ) @api.model def name_search(self, name="", args=None, operator="ilike", limit=100): @@ -102,22 +102,85 @@ class ResPartner(models.Model): result += super(ResPartner, record).name_get() return result + # COMPUTES + + @api.depends("company_type", "ffck_structure_type_id") + def _get_partner_scale(self): + for partner in self: + if partner.company_type == "individual": + partner.partner_scale = "5" + else: + partner.partner_scale = ( + partner.ffck_structure_type_id + and partner.ffck_structure_type_id.scale + ) + + def _get_ffck_partner(self): + ffck = self.env.ref("ffck_commons.res_partner_ffck", raise_if_not_found=False) + main = self.env.ref("base.main_partner") + for partner in self: + if main.ref == "FFCK": + if ffck and ffck.active: + ffck.write({"active": False}) + partner.ffck_partner_id = main + else: + partner.ffck_partner_id = ffck + + @api.depends("state_id", "ffck_network", "partner_scale") + def _get_crck_partner(self): + states = self.mapped("state_id") + crck_ok = self.search( + [ + ("ffck_network", "=", True), + ("partner_scale", "=", "2"), + ("state_id", "in", states.ids), + ] + ) + crck_by_state = {(crck.state_id, crck) for crck in crck_ok} + states_ok = states - crck_ok.mapped("state_id") + concerned = self.filtered( + lambda rp: rp.ffck_network + and int(rp.partner_scale) >= 3 + and rp.state_id in states_ok + ) + for partner in concerned: + state = partner.state_id + partner.crck_partner_id = crck_by_state[state] + # treat unconcerned + for partner in self - concerned: + partner.crck_partner_id = False + + @api.depends("country_department_id", "ffck_network", "partner_scale") + def _get_cdck_partner(self): + depts = self.mapped("country_department_id") + cdck_ok = self.search( + [ + ("ffck_network", "=", True), + ("partner_scale", "=", "4"), + ("country_department_id", "in", depts.ids), + ] + ) + cdck_by_dept = {(cdck.country_department_id, cdck) for cdck in cdck_ok} + depts_ok = depts - cdck_ok.mapped("country_department_id") + concerned = self.filtered( + lambda rp: rp.ffck_network + and int(rp.partner_scale) >= 4 + and rp.country_department_id in depts_ok + ) + for partner in concerned: + dept = partner.country_department_id + partner.cdck_partner_id = cdck_by_dept[dept] + # treat unconcerned + for partner in self - concerned: + partner.cdck_partner_id = False + # ONCHANGES @api.onchange("partner_code", "company_type", "ffck_network") def onchange_partner_code(self): - if self.ffck_network and self.company_type == "individual": + if self.ffck_network and self.is_company == False: code = self.partner_code if len(code) < 6: self.update({"partner_code": code.zfill(6)}) elif len(code) > 6: self.update({"partner_code": code[:-6]}) - - @api.onchange("company_type", "partner_scale", "ffck_structure_type_id") - def onchange_comp_type(self): - if self.company_type == "individual": - self.update({"partner_scale": "lic"}) - elif self.partner_scale == "lic": - self.update({"partner_scale": False}) - elif self.ffck_structure_type_id: - self.update({"partner_scale": self.ffck_structure_type_id.scale}) diff --git a/ffck_commons/views/ffck_structure_type.xml b/ffck_commons/views/ffck_structure_type.xml new file mode 100644 index 0000000..93bccc3 --- /dev/null +++ b/ffck_commons/views/ffck_structure_type.xml @@ -0,0 +1,52 @@ + + + + + ffck.structure.type.view.form + ffck.structure.type + +
+ +
+ +
+ + + + + +
+
+
+
+ + + ffck.structure.type.view.tree + ffck.structure.type + + + + + + + + + + + + FFCK structure types + ffck.structure.type + tree,form + [] + {} + + + + +
\ No newline at end of file diff --git a/ffck_commons/views/res_partner.xml b/ffck_commons/views/res_partner.xml index 96036a3..78ed4f1 100644 --- a/ffck_commons/views/res_partner.xml +++ b/ffck_commons/views/res_partner.xml @@ -22,7 +22,8 @@ attrs="{'invisible': [('is_company','=',True)]}" />