From d11de5463c1b9ff44fdac3bec8e806ffbcc03e37 Mon Sep 17 00:00:00 2001 From: Hugo Trentesaux <hugo@le-filament.com> Date: Mon, 14 Apr 2025 14:55:07 +0200 Subject: [PATCH] WIP --- __manifest__.py | 7 +- data/company_type.xml | 69 +++++++++++++++++++ data/cooperative_form.xml | 32 +++++++++ data/federation.xml | 24 +++++++ data/union_regionale.xml | 69 +++++++++++++++++++ models/__init__.py | 2 +- models/company_attrs.py | 18 +++++ models/company_size.py | 43 ------------ models/meeting_event.py | 2 +- models/mgmt_event.py | 6 +- models/mucs_contract.py | 1 + models/res_partner.py | 24 +++++-- models/union_regionale.py | 6 ++ security/ir.model.access.csv | 3 + views/mucs_contract.xml | 27 ++++++++ views/res_partner.xml | 129 +++++++++++++++++++++++++++++++---- 16 files changed, 393 insertions(+), 69 deletions(-) create mode 100644 data/company_type.xml create mode 100644 data/cooperative_form.xml create mode 100644 data/federation.xml create mode 100644 data/union_regionale.xml create mode 100644 models/company_attrs.py delete mode 100644 models/company_size.py create mode 100644 views/mucs_contract.xml diff --git a/__manifest__.py b/__manifest__.py index a8c586e..2318753 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -6,13 +6,18 @@ "version": "18.0.1.0.0", "license": "AGPL-3", "depends": ["l10n_fr_state", "l10n_fr_department", - "l10n_fr_department_oversea"], + "l10n_fr_department_oversea", "lefilament_naf", "convention_collective"], "data": [ "security/ir.model.access.csv", # datas "data/company_size.xml", + "data/union_regionale.xml", + "data/federation.xml", + "data/company_type.xml", + "data/cooperative_form.xml", # views "views/res_partner.xml", + "views/mucs_contract.xml", "views/union_regionale.xml", "views/menus.xml", # views menu diff --git a/data/company_type.xml b/data/company_type.xml new file mode 100644 index 0000000..6447864 --- /dev/null +++ b/data/company_type.xml @@ -0,0 +1,69 @@ +<?xml version="1.0" ?> +<odoo> + <data noupdate="1"> + <record id="riga_14675" model="company.type"> + <field name="name">Artisan / Commerçant</field> + <field name="is_coop" eval="0" /> + </record> + + <record id="asso" model="company.type"> + <field name="name">Association loi 1901 ou assimilée</field> + <field name="is_coop" eval="0" /> + </record> + + <record id="riga_14673" model="company.type"> + <field name="name">Collectivité territoriale</field> + <field name="is_coop" eval="0" /> + </record> + + <record id="riga_14674" model="company.type"> + <field name="name">Profession libérale</field> + <field name="is_coop" eval="0" /> + </record> + + <record id="SARL" model="company.type"> + <field name="name">Société à Responsabilité Limitée (SARL)</field> + <field name="is_coop" eval="1" /> + </record> + + <record id="SARLU" model="company.type"> + <field name="name">Société à Responsabilité Limitée (SARL) unipersonnelle</field> + <field name="is_coop" eval="0" /> + </record> + + <record id="SA" model="company.type"> + <field name="name">Société Anonyme à Conseil d'Administration</field> + <field name="is_coop" eval="1" /> + </record> + + <record id="SA" model="company.type"> + <field name="name">Société Anonyme à directoire</field> + <field name="is_coop" eval="1" /> + </record> + + <record id="riga_14677" model="company.type"> + <field name="name">Société civile coopérative</field> + <field name="is_coop" eval="0" /> + </record> + + <record id="SCI" model="company.type"> + <field name="name">Société Civile Immobilière (SCI)</field> + <field name="is_coop" eval="0" /> + </record> + + <record id="SELAS" model="company.type"> + <field name="name">Société d exercice libéral par action simplifiée (SELAS)</field> + <field name="is_coop" eval="0" /> + </record> + + <record id="SAS" model="company.type"> + <field name="name">Société par actions simplifiée (SAS)</field> + <field name="is_coop" eval="1" /> + </record> + + <record id="SAS" model="company.type"> + <field name="name">Société par actions simplifiée à associé unique (SASU)</field> + <field name="is_coop" eval="0" /> + </record> + </data> +</odoo> diff --git a/data/cooperative_form.xml b/data/cooperative_form.xml new file mode 100644 index 0000000..838cfaa --- /dev/null +++ b/data/cooperative_form.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" ?> +<odoo> + <data noupdate="1"> + <record id="form_coop47" model="cooperative.form"> + <field name="name">COOP47</field> + </record> + + <record id="form_lamaneur" model="cooperative.form"> + <field name="name">Lamaneur</field> + </record> + + <record id="form_scic" model="cooperative.form"> + <field name="name">SCIC</field> + </record> + + <record id="form_scop" model="cooperative.form"> + <field name="name">SCOP</field> + </record> + + <record id="form_ues" model="cooperative.form"> + <field name="name">UES</field> + </record> + + <record id="form_unionscop" model="cooperative.form"> + <field name="name">UNIONSCOP</field> + </record> + + <record id="form_noncooperative" model="cooperative.form"> + <field name="name">Non coopérative</field> + </record> + </data> +</odoo> diff --git a/data/federation.xml b/data/federation.xml new file mode 100644 index 0000000..fc7382c --- /dev/null +++ b/data/federation.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" ?> +<!-- Copyright 2019 Le Filament + License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> +<odoo> + <data noupdate="1"> + + <record id="COM" model="res.partner.federation"> + <field name="name">Fed. des scop de la communication</field> + </record> + + <record id="IND" model="res.partner.federation"> + <field name="name">Fed. des scop de l'industrie</field> + </record> + + <record id="BTP" model="res.partner.federation"> + <field name="name">Fed. des scop du BTP</field> + </record> + + <record id="CAE" model="res.partner.federation"> + <field name="name">Fed. des CAE</field> + </record> + + </data> +</odoo> diff --git a/data/union_regionale.xml b/data/union_regionale.xml new file mode 100644 index 0000000..29c7e1a --- /dev/null +++ b/data/union_regionale.xml @@ -0,0 +1,69 @@ +<?xml version="1.0" ?> +<odoo> + <data noupdate="1"> + <record id="riga_14231" model="union.regionale"> + <field name="long_name">UNION REGIONALE DES SCOP ILE DE FRANCE CENTRE VAL DE LOIRE DOM-TOM</field> + <field name="name">IdF, Val de Loire, Dom Tom</field> + </record> + + <record id="riga_14232" model="union.regionale"> + <field name="long_name">UNION REGIONALE DES SCOP HAUTS DE FRANCE</field> + <field name="name">Hauts-de-France</field> + </record> + + <record id="riga_14233" model="union.regionale"> + <field name="long_name">UNION REGIONALE DES SCOP BOURGOGNE FRANCHE COMTE</field> + <field name="name">Bourgogne</field> + </record> + + <record id="riga_14234" model="union.regionale"> + <field name="long_name">UNION REGIONALE DES SCOP GRAND EST</field> + <field name="name">Est</field> + </record> + + <record id="riga_14353" model="union.regionale"> + <field name="long_name">UNION REGIONALE DES SCOP AUVERGNE RHONE ALPES</field> + <field name="name">AURA</field> + </record> + + <record id="riga_14237" model="union.regionale"> + <field name="long_name">UNION REGIONALE DES SCOP PROVENCE ALPES COTE D'AZUR CORSE</field> + <field name="name">Paca</field> + </record> + + <record id="riga_14238" model="union.regionale"> + <field name="long_name">UNION REGIONALE DES SCOP D'OCCITANIE POLE PYRENEES</field> + <field name="name">Occitanie pole Pyrénées</field> + </record> + + <record id="riga_14239" model="union.regionale"> + <field name="long_name">UNION REGIONALE DES SCOP LIMOUSIN</field> + <field name="name">Limousin Berry</field> + </record> + + <record id="riga_14240" model="union.regionale"> + <field name="long_name">UNION REGIONALE DES SCOP POITOU CHARENTES</field> + <field name="name">Poitou Charentes</field> + </record> + + <record id="riga_14241" model="union.regionale"> + <field name="long_name">UNION REGIONALE DES SCOP OUEST</field> + <field name="name">Ouest</field> + </record> + + <record id="riga_14242" model="union.regionale"> + <field name="long_name">UNION REGIONALE DES SCOP AQUITAINE</field> + <field name="name">Aquitaine</field> + </record> + + <record id="riga_14243" model="union.regionale"> + <field name="long_name">UNION REGIONALE DES SCOP D'OCCITANIE POLE MEDITERRANEE</field> + <field name="name">Occitanie pole Méditérranée</field> + </record> + + <record id="ur_dom_tom" model="union.regionale"> + <field name="long_name">PROGRAMME OUTRE MER</field> + <field name="name">POM</field> + </record> + </data> +</odoo> diff --git a/models/__init__.py b/models/__init__.py index 9c05e4b..1f79d35 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,6 +1,6 @@ from . import res_partner from . import union_regionale -from . import company_size +from . import company_attrs from . import mucs_contract from . import meeting_event from . import mgmt_event diff --git a/models/company_attrs.py b/models/company_attrs.py new file mode 100644 index 0000000..b337c3a --- /dev/null +++ b/models/company_attrs.py @@ -0,0 +1,18 @@ +# 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 CompanySize(models.Model): + _name = "company.size" + name = fields.Char("Taille d'entreprise") + +class CompanyType(models.Model): + _name = "company.type" + name = fields.Char("Type d'entreprise") + is_coop = fields.Boolean("Est un statut coopératif") + +class CooperativeForm(models.Model): + _name = "cooperative.form" + name = fields.Char("Forme coopérative") diff --git a/models/company_size.py b/models/company_size.py deleted file mode 100644 index 3c4296b..0000000 --- a/models/company_size.py +++ /dev/null @@ -1,43 +0,0 @@ -# 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 index d0bc2cc..6ea798b 100644 --- a/models/meeting_event.py +++ b/models/meeting_event.py @@ -9,7 +9,7 @@ class MeetingEvent(models.Model): date = fields.Date("Date") name = fields.Char("Sujet") - description = fields.Char("Description") + description = fields.Html("Description") # TODO tags ? # categ_ids = fields.Many2one("X") diff --git a/models/mgmt_event.py b/models/mgmt_event.py index 63f29c5..482445a 100644 --- a/models/mgmt_event.py +++ b/models/mgmt_event.py @@ -7,10 +7,10 @@ from odoo import models, fields, api class MgmtEvent(models.Model): _name = "mgmt.event" + date = fields.Date("Date") 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") + theme = fields.Char("Thématique") + topic = fields.Html("Sujet") resolution = fields.Char("Résolution") # relations diff --git a/models/mucs_contract.py b/models/mucs_contract.py index c38cd3d..a2fb5b3 100644 --- a/models/mucs_contract.py +++ b/models/mucs_contract.py @@ -10,6 +10,7 @@ class Contract(models.Model): number = fields.Char("Numéro de contrat") # On attend d'avoir des données # product_id = fields.Many2one("Type de couverture") + type = fields.Char("Type de couverture") # will be computed on product_id member_count = fields.Integer("Effectifs adhérents") maybe_member_count = fields.Integer("Potentiel adhérents") diff --git a/models/res_partner.py b/models/res_partner.py index d470b9d..8942e64 100644 --- a/models/res_partner.py +++ b/models/res_partner.py @@ -30,17 +30,21 @@ class ResPartner(models.Model): 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") + ccn_idcc = fields.Char("CCN Code", related="ccn_id.idcc") + ccn_titre = fields.Char("CCN Label", related="ccn_id.titre") - is_member_sante = fields.Boolean("Adhérent Santé", compute="_compute_is_member_sante") + 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")]) + first_join_date = fields.Date("Date de première adhésion") + membership = fields.Boolean("Adhésion") + removal = fields.Boolean("Radiation") + motive = fields.Char("Motif") + # overwrite state to compute it based on department which itself is computed from zip state_id = fields.Many2one("res.country.state", string='State', ondelete='restrict', @@ -50,12 +54,17 @@ class ResPartner(models.Model): # relations ----- + company_form = fields.Many2one("company.type", "Forme juridique") + cooperative_form = fields.Many2one("cooperative.form", "Forme coopérative") + ur_id = fields.Many2one( comodel_name="union.regionale", string="Union Régionale", index=True, ondelete="restrict", ) + federation_ids = fields.Many2many(comodel_name="res.partner.federation", + string="Fédérations") contract_id = fields.One2many( string="Contrats", @@ -101,7 +110,9 @@ class ResPartner(models.Model): @api.depends("contract_id") def _compute_is_member_sante(self): for partner in self: + partner.is_member_sante = True pass + # ------------------------------------------------------ # Onchange / Constraints # ------------------------------------------------------ @@ -110,7 +121,8 @@ class ResPartner(models.Model): def _check_individual_not_cooperative(self): for record in self: if record.is_cooperative and not record.is_company: - raise ValidationError("An individual can not be a cooperative") + # raise ValidationError("An individual can not be a cooperative") + pass # gênant pour les contacts créés à partir d'une coopérative # ------------------------------------------------------ # CRUD methods (ORM overrides) diff --git a/models/union_regionale.py b/models/union_regionale.py index 77395da..fa8e486 100644 --- a/models/union_regionale.py +++ b/models/union_regionale.py @@ -16,3 +16,9 @@ class UnionRegional(models.Model): _sql_constraints = [ ("name_uniq", "unique (name)", "Cette Union Régionale existe déjà !") ] + +class ResPartnerFederation(models.Model): + _name = "res.partner.federation" + _description = "Fédérations" + + name = fields.Char("Fédération") diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv index 30fa26c..2e63121 100644 --- a/security/ir.model.access.csv +++ b/security/ir.model.access.csv @@ -5,3 +5,6 @@ access_company_size,access_company_size,model_company_size,base.group_user,1,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 +access_res_partner_federation,access_res_partner_federation,model_res_partner_federation,base.group_user,1,1,1,1 +access_company_type,access_company_type,model_company_type,base.group_user,1,1,1,1 +access_cooperative_form,access_cooperative_form,model_cooperative_form,base.group_user,1,1,1,1 diff --git a/views/mucs_contract.xml b/views/mucs_contract.xml new file mode 100644 index 0000000..8702b23 --- /dev/null +++ b/views/mucs_contract.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- Copyright 2024- Le Filament (https://le-filament.com) + License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> +<odoo> + <record id="mucs_contract_action" model="ir.actions.act_window"> + <field name="name">Contracts</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">mucs.contract</field> + <field name="view_mode">list,form</field> + <field name="path">contract</field> + </record> + + <record id="mucs_contract_view_list" model="ir.ui.view"> + <field name="name">mucs.contract.list</field> + <field name="model">mucs.contract</field> + <field name="arch" type="xml"> + <list> + <field name="number"/> + <field name="type"/> + <field name="member_count"/> + <field name="maybe_member_count"/> + <field name="partner_id"/> + </list> + </field> + </record> + +</odoo> diff --git a/views/res_partner.xml b/views/res_partner.xml index b62eeb7..8566acd 100644 --- a/views/res_partner.xml +++ b/views/res_partner.xml @@ -9,61 +9,162 @@ <field name="name">res.partner.form.inherit</field> <field name="model">res.partner</field> <field name="inherit_id" ref="base.view_partner_form"/> + <field name="priority">100</field> <field name="arch" type="xml"> + <!-- hide fields added by ccn and naf module because they are shown later--> + <xpath expr="//field[@name='ccn_id']" position="attributes"> + <attribute name="invisible">True</attribute> + </xpath> + <xpath expr="//field[@name='naf_id']" position="attributes"> + <attribute name="invisible">True</attribute> + </xpath> + <xpath expr="//field[@name='vat']" position="attributes"> + <attribute name="invisible">True</attribute> + </xpath> + <xpath expr="//field[@name='category_id']" position="attributes"> + <attribute name="invisible">True</attribute> + </xpath> + <xpath expr="//field[@name='mobile']" position="attributes"> + <attribute name="invisible">True</attribute> + </xpath> + <xpath expr="//field[@name='street2']" position="attributes"> + <attribute name="invisible">True</attribute> + </xpath> + <xpath expr="//page[@name='sales_purchases']" position="attributes"> + <attribute name="invisible">True</attribute> + </xpath> + <xpath expr="//page[@name='internal_notes']" position="attributes"> + <attribute name="invisible">True</attribute> + </xpath> + <!-- focus on company details instead --> + <xpath expr="//page[@name='contact_addresses']" + position="attributes"> + <attribute name="autofocus">not is_company</attribute> + </xpath> + <!-- entreprise + environnement --> <xpath expr="//page[@name='contact_addresses']" position="before"> + <!-- entreprise --> <page name="company" string="Entreprise" invisible="not is_company" + autofocus="autofocus" > <group> <group> + <!--<field name="siret"/>--> <field name="siret" readonly="1" widget="CopyClipboardChar"/> <field name="siren" readonly="1" widget="CopyClipboardChar"/> <field name="company_size_id"/> <field name="company_size"/> + <field name="company_form"/> + <field name="naf_id" string="APE"/> + <!--<field name="ccn_id"/>--> + <field name="ccn_idcc" string="Numéro CCN"/> + <field name="ccn_titre" string="Intitulé"/> </group> <group> <field name="is_cooperative"/> <field name="ur_id" invisible="not is_cooperative"/> + <field name="federation_ids" widget="many2many_tags" + invisible="not is_cooperative"/> + <field name="is_member_cgscop" + invisible="not is_cooperative"/> + <field name="cooperative_form" + invisible="not is_cooperative"/> </group> </group> - </page> - <page - name="leads" - string="Opportunités" - > - <group> -<!-- <field name="leads_id"/>--> + <group string="Descriptif Activité"> + <field name="comment" nolabel="1"/> </group> </page> + + <!-- environnement --> <page - name="contracts" - string="Contrats" + name="environment" + string="Environnement" invisible="not is_company" > <group> - <field name="contract_id"/> + <group> + <field name="is_member_sante"/> + <field name="is_member_unmi"/> + </group> + <group> + <field name="is_member_mutex"/> + <field name="type_rma_aid"/> + </group> + </group> + <separator/> + <group> + <group> + <field name="first_join_date"/> + <field name="membership"/> + </group> + <group> + <field name="removal"/> + <field name="motive"/> + </group> + </group> + <separator/> + <group string="Contrats"> + <field name="contract_id" nolabel="1"> + <list> + <field name="number"/> + <field name="type"/> + <field name="member_count"/> + <field name="maybe_member_count"/> + </list> + </field> </group> </page> + </xpath> + + <!-- suivi + opportunités + leads --> + <xpath expr="//page[@name='contact_addresses']" position="after"> + <!-- suivi commercial--> <page name="suivi_commercial" string="Suivi commercial" invisible="not is_company" > - <group> - <field name="meeting_ids"/> + <group string="Synthèse activité développement"> + <field name="meeting_ids" nolabel="1"> + <list> + <field name="date"/> + <field name="name"/> + </list> + </field> </group> </page> + <!-- suivi gestion--> <page name="suivi_gestion" string="Suivi gestion" invisible="not is_company" > - <group> - <field name="mgmt_event_ids"/> + <group string="Synthèse activité gestion"> + <field name="mgmt_event_ids" nolabel="1"> + <list> + <field name="date"/> + <field name="qs"/> + <field name="theme"/> + <field name="topic"/> + <field name="resolution"/> + </list> + </field> + </group> + </page> + <!-- leads --> + <page + name="leads" + string="Opportunités" + invisible="not is_company" + > + <group string="Leads"> + <field name="lead_ids" nolabel="1"/> </group> </page> </xpath> -- GitLab