From 2aadad282acd1cdd885fb0a31500903287b69ba7 Mon Sep 17 00:00:00 2001 From: Hugo Trentesaux <hugo@le-filament.com> Date: Tue, 8 Apr 2025 19:07:28 +0200 Subject: [PATCH] wip --- __manifest__.py | 1 + data/company_size.xml | 20 +++++++++++ models/__init__.py | 5 +++ models/company_size.py | 43 +++++++++++++++++++++++ models/meeting_event.py | 49 ++++++++++++++++++++++++++ models/mgmt_event.py | 49 ++++++++++++++++++++++++++ models/mucs_contract.py | 49 ++++++++++++++++++++++++++ models/res_partner.py | 47 ++++++++++++++++++++++--- security/ir.model.access.csv | 4 +++ views/res_partner.xml | 67 ++++++++++++++++++++++++++---------- 10 files changed, 311 insertions(+), 23 deletions(-) create mode 100644 data/company_size.xml create mode 100644 models/company_size.py create mode 100644 models/meeting_event.py create mode 100644 models/mgmt_event.py create mode 100644 models/mucs_contract.py diff --git a/__manifest__.py b/__manifest__.py index 02fb90e..a8c586e 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -10,6 +10,7 @@ "data": [ "security/ir.model.access.csv", # datas + "data/company_size.xml", # views "views/res_partner.xml", "views/union_regionale.xml", diff --git a/data/company_size.xml b/data/company_size.xml new file mode 100644 index 0000000..e202706 --- /dev/null +++ b/data/company_size.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + <data noupdate="1"> + <record id="1-5" model="company.size"> + <field name="name">1 à 5</field> + </record> + <record id="5-15" model="company.size"> + <field name="name">5 à 15</field> + </record> + <record id="15-50" model="company.size"> + <field name="name">15 à 50</field> + </record> + <record id="50-100" model="company.size"> + <field name="name">50 à 100</field> + </record> + <record id="+100" model="company.size"> + <field name="name">plus de 100</field> + </record> + </data> +</odoo> diff --git a/models/__init__.py b/models/__init__.py index 747285f..9c05e4b 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,2 +1,7 @@ from . import res_partner from . import union_regionale +from . import company_size +from . import mucs_contract +from . import meeting_event +from . import mgmt_event + diff --git a/models/company_size.py b/models/company_size.py new file mode 100644 index 0000000..3c4296b --- /dev/null +++ b/models/company_size.py @@ -0,0 +1,43 @@ +# Copyright 2024- Le Filament (https://le-filament.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +from odoo import models, fields, api +from odoo.exceptions import ValidationError + + +class CompanySize(models.Model): + _name = "company.size" + + # ------------------------------------------------------ + # Fields declaration + # ------------------------------------------------------ + + name = fields.Char("Taille d'entreprise") + + # ------------------------------------------------------ + # SQL Constraints + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Default methods + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Computed fields / Search Fields + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Onchange / Constraints + # ------------------------------------------------------ + + # ------------------------------------------------------ + # CRUD methods (ORM overrides) + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Actions + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Business methods + # ------------------------------------------------------ diff --git a/models/meeting_event.py b/models/meeting_event.py new file mode 100644 index 0000000..d0bc2cc --- /dev/null +++ b/models/meeting_event.py @@ -0,0 +1,49 @@ +# Copyright 2024- Le Filament (https://le-filament.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +from odoo import models, fields, api + + +class MeetingEvent(models.Model): + _name = "meeting.event" + + date = fields.Date("Date") + name = fields.Char("Sujet") + description = fields.Char("Description") + # TODO tags ? + # categ_ids = fields.Many2one("X") + + # relations + partner_id = fields.Many2one(comodel_name="res.partner") + + # ------------------------------------------------------ + # Fields declaration + # ------------------------------------------------------ + + # ------------------------------------------------------ + # SQL Constraints + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Default methods + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Computed fields / Search Fields + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Onchange / Constraints + # ------------------------------------------------------ + + # ------------------------------------------------------ + # CRUD methods (ORM overrides) + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Actions + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Business methods + # ------------------------------------------------------ diff --git a/models/mgmt_event.py b/models/mgmt_event.py new file mode 100644 index 0000000..63f29c5 --- /dev/null +++ b/models/mgmt_event.py @@ -0,0 +1,49 @@ +# Copyright 2024- Le Filament (https://le-filament.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +from odoo import models, fields, api + + +class MgmtEvent(models.Model): + _name = "mgmt.event" + + qs = fields.Selection(string="Qualité de service", selection=[("s", "Satisfait")]) + # TODO catégories ? + # theme = fields.Many2one(string="Thématique", comodel_name="") + topic = fields.Char("Sujet") + resolution = fields.Char("Résolution") + + # relations + partner_id = fields.Many2one(comodel_name="res.partner") + + # ------------------------------------------------------ + # Fields declaration + # ------------------------------------------------------ + + # ------------------------------------------------------ + # SQL Constraints + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Default methods + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Computed fields / Search Fields + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Onchange / Constraints + # ------------------------------------------------------ + + # ------------------------------------------------------ + # CRUD methods (ORM overrides) + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Actions + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Business methods + # ------------------------------------------------------ diff --git a/models/mucs_contract.py b/models/mucs_contract.py new file mode 100644 index 0000000..c38cd3d --- /dev/null +++ b/models/mucs_contract.py @@ -0,0 +1,49 @@ +# Copyright 2024- Le Filament (https://le-filament.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +from odoo import models, fields, api + + +class Contract(models.Model): + _name = "mucs.contract" + + number = fields.Char("Numéro de contrat") + # On attend d'avoir des données + # product_id = fields.Many2one("Type de couverture") + member_count = fields.Integer("Effectifs adhérents") + maybe_member_count = fields.Integer("Potentiel adhérents") + + # relations + partner_id = fields.Many2one(comodel_name="res.partner") + + # ------------------------------------------------------ + # Fields declaration + # ------------------------------------------------------ + + # ------------------------------------------------------ + # SQL Constraints + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Default methods + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Computed fields / Search Fields + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Onchange / Constraints + # ------------------------------------------------------ + + # ------------------------------------------------------ + # CRUD methods (ORM overrides) + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Actions + # ------------------------------------------------------ + + # ------------------------------------------------------ + # Business methods + # ------------------------------------------------------ diff --git a/models/res_partner.py b/models/res_partner.py index 75c0149..d470b9d 100644 --- a/models/res_partner.py +++ b/models/res_partner.py @@ -14,11 +14,12 @@ class ResPartner(models.Model): is_cooperative = fields.Boolean("Est une coopérative") is_member_cgscop = fields.Boolean("Est adhérent à la CG SCOP") - size_group = fields.Selection( - [("1-5", "1 à 5"), ("5-15", "5 à 15"), ("15-50", "15 à 50"), - ("50-100", "50 à 100"), ("+100", "plus de 100")], - string="Tranche d'effectif") + company_size_id = fields.Many2one("company.size", + string="Tranche d'effectif") + company_size = fields.Integer(string="Effectif approximatif") + # Note : peut-être utiliser l10n-france/l10n_fr_siret_lookup + # en 18.0 qui gère la récupération des codes APE et forme juridique siret = fields.Char(index=True, tracking=True, copy=False) siren = fields.Char( string="SIREN", @@ -28,6 +29,17 @@ class ResPartner(models.Model): copy=False, tracking=True ) + # Note : pour l'instant str, à changer vers m2o quand on y verra plus clair + ape = fields.Char("APE Code") + ape_label = fields.Char("APE Label") + ccn = fields.Char("CCN Code") + ccn_label = fields.Char("CCN Label") + + is_member_sante = fields.Boolean("Adhérent Santé", compute="_compute_is_member_sante") + is_member_unmi = fields.Boolean("Adhérent UNMI") + is_member_mutex = fields.Boolean("Adhérent MUTEX") + type_rma_aid = fields.Selection(string="Assistance RMA", + selection=[("base", "Base")]) # overwrite state to compute it based on department which itself is computed from zip state_id = fields.Many2one("res.country.state", string='State', @@ -45,6 +57,28 @@ class ResPartner(models.Model): ondelete="restrict", ) + contract_id = fields.One2many( + string="Contrats", + comodel_name="mucs.contract", + inverse_name="partner_id", + ) + # child_ids (odoo) Contacts + lead_ids = fields.One2many( + string="Opportunités", + comodel_name="crm.lead", + inverse_name="partner_id", + ) + meeting_ids = fields.One2many( + string="Suivi commercial", + comodel_name="meeting.event", + inverse_name="partner_id", + ) + mgmt_event_ids = fields.One2many( + string="Suivi de gestion", + comodel_name="mgmt.event", + inverse_name="partner_id", + ) + # ------------------------------------------------------ # SQL Constraints # ------------------------------------------------------ @@ -63,6 +97,11 @@ class ResPartner(models.Model): if partner.siret: partner.siren = partner.siret.replace(" ", "")[0:9] + # TODO compute this + @api.depends("contract_id") + def _compute_is_member_sante(self): + for partner in self: + pass # ------------------------------------------------------ # Onchange / Constraints # ------------------------------------------------------ diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv index bde9682..30fa26c 100644 --- a/security/ir.model.access.csv +++ b/security/ir.model.access.csv @@ -1,3 +1,7 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink access_union_regionale,access_union_regionale,model_union_regionale,base.group_user,1,0,0,0 admin_union_regionale,admin_union_regionale,model_union_regionale,base.group_erp_manager,1,1,1,1 +access_company_size,access_company_size,model_company_size,base.group_user,1,0,0,0 +access_mucs_contract,access_mucs_contract,model_mucs_contract,base.group_user,1,1,1,1 +access_meeting_event,access_meeting_event,model_meeting_event,base.group_user,1,1,1,1 +access_mgmt_event,access_mgmt_event,model_mgmt_event,base.group_user,1,1,1,1 diff --git a/views/res_partner.xml b/views/res_partner.xml index 3124f43..b62eeb7 100644 --- a/views/res_partner.xml +++ b/views/res_partner.xml @@ -10,31 +10,60 @@ <field name="model">res.partner</field> <field name="inherit_id" ref="base.view_partner_form"/> <field name="arch" type="xml"> - <xpath expr="//h1" position="before"> - <span invisible="not is_company"> - <label for="is_cooperative" string="Coopérative"/> - <field name="is_cooperative"/> - </span> - </xpath> - <xpath expr="//h1" position="after"> - <group invisible="not is_company"> - <group> - <field name="ur_id" invisible="not is_cooperative"/> - <field name="size_group"/> - </group> - </group> - </xpath> - <xpath expr="//field[@name='vat']" position="after"> - <field name="siret" readonly="1" widget="CopyClipboardChar"/> - <field name="siren" readonly="1" widget="CopyClipboardChar"/> - </xpath> <xpath expr="//page[@name='contact_addresses']" position="before"> <page name="company" - string="Company" + string="Entreprise" + invisible="not is_company" + > + <group> + <group> + <field name="siret" readonly="1" + widget="CopyClipboardChar"/> + <field name="siren" readonly="1" + widget="CopyClipboardChar"/> + <field name="company_size_id"/> + <field name="company_size"/> + </group> + <group> + <field name="is_cooperative"/> + <field name="ur_id" invisible="not is_cooperative"/> + </group> + </group> + </page> + <page + name="leads" + string="Opportunités" + > + <group> +<!-- <field name="leads_id"/>--> + </group> + </page> + <page + name="contracts" + string="Contrats" + invisible="not is_company" + > + <group> + <field name="contract_id"/> + </group> + </page> + <page + name="suivi_commercial" + string="Suivi commercial" + invisible="not is_company" + > + <group> + <field name="meeting_ids"/> + </group> + </page> + <page + name="suivi_gestion" + string="Suivi gestion" invisible="not is_company" > <group> + <field name="mgmt_event_ids"/> </group> </page> </xpath> -- GitLab