diff --git a/__manifest__.py b/__manifest__.py index 02fb90eda988a6372364a0d7469ad1989bab433a..a8c586e8bbb3611a6a8fbfefa9249755214cfdfa 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 0000000000000000000000000000000000000000..e202706d3d1a3d7f47e05c6e186f6c5e8671182c --- /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 747285fc21d2cd732f42be536465ee2c6dad1191..9c05e4b56703ca629960c91b02f8aa2191a3f09f 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 0000000000000000000000000000000000000000..3c4296b8d6d7cae849235c5f33aa0b386a0caf33 --- /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 0000000000000000000000000000000000000000..d0bc2cc0c05b6e383f8de26ffcf8a6d6f0f38b45 --- /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 0000000000000000000000000000000000000000..63f29c515e4b2f9d34b6e787f6c411c56e559274 --- /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 0000000000000000000000000000000000000000..c38cd3daacb7e52b40b70f4a237a0279ab8dfc85 --- /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 75c014918dbc505bceafd4ae0f6c3d96e1a7e126..d470b9df3963d60009c9728b815687f45a1a9f35 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 bde96825517321a3a9d225f58846ea09fa827c43..30fa26c7bf756665584839a2770f068640b47598 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 3124f43d4374cd12651050fc0d88bda3c5e1e2cd..b62eeb77f28674927bcfb34d49b13dbb2de21a91 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>