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.

283 lines
9.8 KiB

# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.osv.expression import OR
from .ffck_structure_type import SCALES
class ResPartner(models.Model):
_inherit = "res.partner"
# Partner fields
ffck_network = fields.Boolean(string="FFCK network")
first_membership_date = fields.Date("Structure 1st membership")
# Structure typing
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",
)
partner_code = fields.Char(string="FFCK code", size=6, index=True)
partner_code_editable = fields.Boolean(string="FFCK code editable", default=True)
# FFCK
ffck_partner_id = fields.Many2one(
comodel_name="res.partner",
string="FFCK partner",
ondelete="restrict",
compute="_get_ffck_partner",
store=True,
)
ffck_partner_code = fields.Char(string="FFCK", default="0", readonly=True)
# CRCK
crck_partner_id = fields.Many2one(
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(
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
)
crck_partner_ids = fields.One2many(
comodel_name="res.partner",
inverse_name="ffck_partner_id",
domain=[("partner_scale", "=", "2")],
string="Regional Comittees",
)
cdck_partner_ids = fields.One2many(
comodel_name="res.partner",
inverse_name="crck_partner_id",
domain=[("partner_scale", "=", "3")],
string="Departmental Comittees",
)
local_partner_ids = fields.One2many(
comodel_name="res.partner",
inverse_name="cdck_partner_id",
domain=[("partner_scale", "=", "4")],
string="Local structures",
)
# Compute hierarchy for searchpanel
hierarchy_id = fields.Many2one(
comodel_name="res.partner.hierarchy",
string="Hierarchy element",
compute="_compute_partner_hierarchy",
store=True,
)
@api.depends("ffck_network", "partner_scale", "partner_code")
def _compute_partner_hierarchy(self):
for partner in self:
partner.hierarchy_id = (
partner.id
if partner.ffck_network
and int(partner.partner_scale) in range(1, 5)
and partner.partner_code
else False
)
@api.model
def name_search(self, name="", args=None, operator="ilike", limit=100):
"""Allow searching by sequence code by default."""
# Do not add any domain when user just clicked on search widget
if not (name == "" and operator == "ilike"):
# The dangling | is needed to combine with the domain added by super()
args = OR(
[
[
"&",
("ffck_network", "=", True),
("partner_code", "=like", name + "%"),
],
args or [],
]
)
return super().name_search(name, args, operator, limit)
@api.depends("name", "ref", "partner_code")
def name_get(self):
result = []
ffck_partners = self.filtered("ffck_network")
others = self - ffck_partners
for record in ffck_partners:
code = record.partner_code
ref = record.ref
result.append(
(
record.id,
"{}{}{}".format(
code and code + " - " or "",
ref and record.is_company and ref + " - " or "",
super(ResPartner, record).name_get()[0][1],
),
)
)
result += super(ResPartner, others).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.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.with_context(active_test=False).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) >= 2
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(
"is_company",
"ffck_network",
"partner_code",
"partner_scale",
"local_partner_id",
"local_partner_id.partner_code",
"country_department_id",
"country_department_id.code",
)
def _get_cdck_partner(self):
structures = self.filtered(
lambda rp: rp.is_company
and rp.ffck_network
and rp.partner_code
and len(rp.partner_code) >= 2
and int(rp.partner_scale) in (3, 4)
)
licensees = self.filtered(
lambda rp: not rp.is_company
and rp.ffck_network
and int(rp.partner_scale) == 5
and (
rp.local_partner_id
and rp.local_partner_id.cdck_partner_id
or rp.country_department_id
)
)
dept_codes = self.mapped(
lambda rp: rp.partner_code
and len(rp.partner_code) >= 2
and int(rp.partner_scale) in (3, 4)
and rp.partner_code[:2]
)
cdck_ok = self.with_context(active_test=False).search(
[
("ffck_network", "=", True),
("partner_scale", "=", "3"),
("partner_code", "in", ["{}00".format(code) for code in dept_codes]),
]
)
cdck_by_code = {cdck.partner_code[:2]: cdck for cdck in cdck_ok}
# Treat structures
for partner in structures:
partner.cdck_partner_id = cdck_by_code[partner.partner_code[:2]]
# Treat licensees
for partner in licensees:
dept = partner.country_department_id
local = partner.local_partner_id
local_cd = local.cdck_partner_id
partner.cdck_partner_id = (
local_cd if local and local_cd else cdck_by_code[dept.code]
)
# treat others
for partner in self - (structures | licensees):
partner.cdck_partner_id = False
@api.depends(
"ffck_network",
"partner_scale",
"ffck_partner_id",
"crck_partner_id",
"cdck_partner_id",
"local_partner_id",
)
def _get_ffck_parent(self):
field_by_scale = {
"2": "ffck_partner_id",
"3": "crck_partner_id",
"4": "cdck_partner_id",
"5": "local_partner_id",
}
for partner in self:
if partner.ffck_network and int(partner.partner_scale) in range(2, 6):
partner.ffck_parent_id = getattr(
partner, field_by_scale[partner.partner_scale]
)
else:
partner.ffck_parent_id = False
# ONCHANGES
@api.onchange("partner_code", "company_type", "ffck_network")
def onchange_partner_code(self):
if self.ffck_network and self.is_company == False:
code = self.partner_code or "000000"
if len(code) < 6:
self.update({"partner_code": code.zfill(6)})
elif len(code) > 6:
self.update({"partner_code": code[:-6]})
# CRUD
@api.model_create_multi
def create(self, vals_list):
for vals in vals_list:
vals.update({"partner_code_editable": False})
return super().create(vals_list)