diff --git a/__manifest__.py b/__manifest__.py index 7f3286bc8a02553906ba63cba52c2d1182c3f1c7..3dbaf4dc613098dd08cf4b0a18d215bfeef438d1 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -1,12 +1,11 @@ { "name": "CG SCOP - Gestion Contacts", "summary": "CG SCOP - Gestion des contacts", - "version": "12.0.1.1.0", + "version": "12.0.1.2.0", "development_status": "Production/Stable", "author": "Le Filament", "license": "AGPL-3", "application": False, - "installable": True, "depends": [ "cgscop_base", "l10n_fr_base_location_geonames_import_cedex", @@ -26,6 +25,7 @@ "wizard/scop_deces_wizard.xml", "wizard/scop_membership_out_wizard.xml", "wizard/scop_membership_period_wizard.xml", + "wizard/scop_status_wizard.xml", "views/res_company.xml", "views/res_users.xml", "views/res_partner.xml", @@ -35,6 +35,7 @@ "views/scop_period_views.xml", "views/scop_federation_activity.xml", "datas/union_regionale_data.xml", + "datas/res_country_state.xml", "datas/res_partner_certification_data.xml", "datas/res_partner_company_type_data.xml", "datas/res_partner_cooperative_form_data.xml", @@ -53,5 +54,7 @@ "datas/scop_membership_reason_end_data.xml", "datas/scop_membership_type_data.xml", "datas/scop_questionnaire_type_data.xml", - ] + ], + "installable": True, + 'auto_install': False, } diff --git a/datas/res_country_state.xml b/datas/res_country_state.xml new file mode 100644 index 0000000000000000000000000000000000000000..8a1e4dbafe20e3bcc7eeb6e307dea0098e445de3 --- /dev/null +++ b/datas/res_country_state.xml @@ -0,0 +1,10 @@ +<?xml version="1.0"?> +<odoo> + <data noupdate="1"> + <record id="domtom" model="res.country.state"> + <field name="name">DOM-TOM</field> + <field name="code">DT</field> + <field name="country_id" eval="75"/> + </record> + </data> +</odoo> diff --git a/models/res_partner.py b/models/res_partner.py index 4c269feb636d072afca8f5bf338c8adf85c9b61c..98ca172a4a07b8516ddaf8b785be3483e73eda6b 100644 --- a/models/res_partner.py +++ b/models/res_partner.py @@ -99,6 +99,7 @@ class ScopPartner(models.Model): facebook = fields.Char("Facebook") linkedin = fields.Char("LinkedIn") twitter = fields.Char("Twitter") + instagram = fields.Char("Instagram") # Infos générales / Suivi UR ur_id = fields.Many2one( @@ -118,6 +119,12 @@ class ScopPartner(models.Model): domain=[('active', '=', True)], on_delete='restrict', track_visibility='onchange') + support_delegate_id = fields.Many2one( + 'res.users', + string='Délégué en support', + domain=[('active', '=', True)], + on_delete='restrict', + track_visibility='onchange') segment_1_id = fields.Many2many('res.partner.segment1', column1='partner_id', column2='segment_id', @@ -135,6 +142,20 @@ class ScopPartner(models.Model): column2='segment_id', string='Segmentation 4') + segment_1_nb = fields.Integer( + string="Nb de segments 1", + compute="_compute_segment_nb") + segment_2_nb = fields.Integer( + string="Nb de segments 2", + compute="_compute_segment_nb") + segment_3_nb = fields.Integer( + string="Nb de segments 3", + compute="_compute_segment_nb") + segment_4_nb = fields.Integer( + string="Nb de segments 4", + compute="_compute_segment_nb") + + # Infos générales / Infos activité creation_origin_id = fields.Many2one( 'res.partner.creation.origin', @@ -213,16 +234,20 @@ class ScopPartner(models.Model): compute='_compute_federation', store=True, default=False) - activity_federation_com = fields.Many2one( + activity_federation_com_ids = fields.Many2many( comodel_name='scop.federation.com.activity', - string="Domaine d'activité", - help="Fédération de la Com - Domaine d'activité", - ondelete="set null") - activity_federation_indus = fields.Many2one( + relation='res_partner_federation_com_activity_rel', + column1='partner_id', + column2='com_activity_id', + string="Domaine d'activité Com", + help="Fédération de la Com - Domaine d'activité") + activity_federation_indus_ids = fields.Many2many( comodel_name='scop.federation.indus.activity', - string="Domaine d'activité", - help="Fédération de l'Industrie - Domaine d'activité", - ondelete="set null") + relation='res_partner_federation_indus_activity_rel', + column1='partner_id', + column2='indus_activity_id', + string="Domaine d'activité Industrie", + help="Fédération de l'Industrie - Domaine d'activité") # Contacts director_ids = fields.One2many( @@ -515,6 +540,15 @@ class ScopPartner(models.Model): + "que vous n'êtes pas en train de créer un" + " doublon"}} + @api.onchange('cooperative_form_id') + def onchange_siret(self): + if self.cooperative_form_id == self.env.ref('cgscop_partner.form_noncooperative'): + self.creation_origin_id = None + self.creation_suborigin_id = None + self.is_ag_constitution = None + self.date_1st_sign = None + self.first_closeout = None + # ------------------------------------------------------ # Common functions # ------------------------------------------------------ @@ -546,6 +580,7 @@ class ScopPartner(models.Model): # Creation d'une periode lorsque le statut passe en Phase de Suivi @api.multi def write(self, vals): + # Gestion casse des informations if vals.get('name'): vals['name'] = vals.get('name').title() if vals.get('lastname'): @@ -556,7 +591,16 @@ class ScopPartner(models.Model): vals['city'] = vals.get('city').upper() result = super(ScopPartner, self).write(vals) + + # Hack pour notification lors de la modification du logo + if 'image' in vals: + self.message_post( + body="Modification Logo", + subtype='cgscop_base.cg_values_change', + ) + for partner in self: + # Contrainte de tel ou mail lors de la modification d'un contact if (not partner.is_company and partner.type == 'contact' and not partner.user_ids): @@ -566,19 +610,24 @@ class ScopPartner(models.Model): "Vous devez saisir au moins un e-mail ou un téléphone\ pour " + partner.name) + # Création d'une période lors du changement de statut en Suivi if (vals.get('project_status') == '6_suivi' and not self.env.context.get('import_file')): partner._create_period(partner) + + # Ajout des followers de la fiche partners_to_subscribe = [ partner.followup_delegate_id.partner_id.id, partner.creation_delegate_id.partner_id.id ] partner.message_subscribe(partner_ids=partners_to_subscribe) + return result # Création d'une période lors de la création d'une coopérative @api.model_create_multi def create(self, vals_list): + # Gestion casse des informations for vals in vals_list: if vals.get('name'): vals['name'] = vals.get('name').title() @@ -588,13 +637,18 @@ class ScopPartner(models.Model): vals['firstname'] = vals.get('firstname').title() if vals.get('city'): vals['city'] = vals.get('city').upper() + partners = super(ScopPartner, self).create(vals_list) + + for vals in vals_list: + # Création d'une période si la coop est en statut en Suivi if vals.get('is_cooperative') and vals.get( 'project_status') == '6_suivi': for partner in partners: partner._create_period(partner) + # Ajout des followers de la fiche for partner in partners: partners_to_subscribe = [ partner.followup_delegate_id.partner_id.id, @@ -626,11 +680,14 @@ class ScopPartner(models.Model): + company.siret[6:9] + " " + company.siret[9:]) - @api.depends('zip') + @api.depends('zip', 'state_id') def _compute_num_departement(self): for company in self: if company.zip: - company.zip_departement = company.zip[:2] + if company.state_id == self.env.ref('cgscop_partner.domtom'): + company.zip_departement = company.zip[:3] + else: + company.zip_departement = company.zip[:2] @api.depends('zip') def _compute_region(self): @@ -757,6 +814,26 @@ class ScopPartner(models.Model): partner.staff_last = lm[0].staff_count partner.staff_last_date = lm[0].effective_date + @api.multi + def _compute_segment_nb(self): + for partner in self: + # Calcul nombre de segment 1 + seg1 = partner.env['res.partner.segment1'].search([ + ('ur_id', '=', self.env.user.ur_id.id)]) + partner.segment_1_nb = len(seg1) + # Calcul nombre de segment 2 + seg2 = partner.env['res.partner.segment2'].search([ + ('ur_id', '=', self.env.user.ur_id.id)]) + partner.segment_2_nb = len(seg2) + # Calcul nombre de segment 3 + seg3 = partner.env['res.partner.segment3'].search([ + ('ur_id', '=', self.env.user.ur_id.id)]) + partner.segment_3_nb = len(seg3) + # Calcul nombre de segment 4 + seg4 = partner.env['res.partner.segment4'].search([ + ('ur_id', '=', self.env.user.ur_id.id)]) + partner.segment_4_nb = len(seg4) + # ------------------------------------------------------ # Button Action # ------------------------------------------------------ diff --git a/models/scop_federation_activity.py b/models/scop_federation_activity.py index 0d8fb112665f269af24c82282fdd9f8579749a5a..98d132d818962ad7dba51e81a3821f46c4888e70 100644 --- a/models/scop_federation_activity.py +++ b/models/scop_federation_activity.py @@ -10,6 +10,13 @@ class ScopFederationComActivity(models.Model): _order = "name" name = fields.Char("Domaine d'activité", required=True) + partner_ids = fields.Many2many( + comodel_name='res.partner', + relation='res_partner_federation_com_activity_rel', + column1='com_activity_id', + column2='partner_id', + string="Cooperatives", + domain=[('is_cooperative', '=', True)]) class ScopFederationIndusActivity(models.Model): @@ -18,3 +25,10 @@ class ScopFederationIndusActivity(models.Model): _order = "name" name = fields.Char("Domaine d'activité", required=True,) + partner_ids = fields.Many2many( + comodel_name='res.partner', + relation='res_partner_federation_indus_activity_rel', + column1='indus_activity_id', + column2='partner_id', + string="Cooperatives", + domain=[('is_cooperative', '=', True)]) diff --git a/models/scop_period.py b/models/scop_period.py index bd54435718b39df7fd83bffeb2746b8852c6a2ec..25d756218de4d6e44c21fe6e0a19096432420e75 100644 --- a/models/scop_period.py +++ b/models/scop_period.py @@ -65,17 +65,28 @@ class ScopPeriod(models.Model): on_delete='restrict', track_visibility='onchange') + # ------------------------------------------------------ + # Override ORM + # ------------------------------------------------------ @api.multi def write(self, vals): for period in self: partner_vals = dict(vals) + # Suppression des valeurs à ne pas remonter à l'organisme partner_vals.pop('partner_id', False) partner_vals.pop('id_riga', False) partner_vals.pop('start', False) - partner_vals.pop('end', False) - partner_vals.pop('end_reason', False) partner_vals.pop('comments', False) - partner_vals.pop('dissolution_reason_id', False) + + # Si la date de fin est modifiée et que l'organisme est décédé + # on remonte la date de décès + if partner_vals.get('end', False): + if partner_vals.get('end_reason', False) == 'deces' or period.end_reason == 'deces': + partner_vals.update({ + 'dissolution_date': partner_vals.get('end') + }) + partner_vals.pop('end', False) + # Update partner period.partner_id.write(partner_vals) return super(ScopPeriod, self).write(vals) diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv index aeea36997cbdb0efb230171ab04c703f8616649a..37b04b712addef70cbf5ca701cdad2a9ba4da504 100644 --- a/security/ir.model.access.csv +++ b/security/ir.model.access.csv @@ -54,7 +54,7 @@ admin_scop_membership_period,admin_scop_membership_period,model_scop_membership_ admin_scop_membership_reason_end,admin_scop_membership_reason_end,model_scop_membership_reason_end,group_cg_administrator,1,1,1,1 admin_scop_membership_type,admin_scop_membership_type,model_scop_membership_type,group_cg_administrator,1,1,1,1 admin_scop_period,admin_scop_period,model_scop_period,group_cg_administrator,1,1,1,1 -administrative_scop_questionnaire,administrative_scop_questionnaire,model_scop_questionnaire,group_cg_administrative,1,1,1,1 +administrative_scop_questionnaire,administrative_scop_questionnaire,model_scop_questionnaire,group_questionnaire,1,1,1,1 admin_scop_questionnaire,admin_scop_questionnaire,model_scop_questionnaire,group_cg_administrator,1,1,1,1 admin_scop_questionnaire_type,admin_scop_questionnaire_type,model_scop_questionnaire_type,group_cg_administrator,1,1,1,1 admin_scop_revision_format,admin_scop_revision_format,model_scop_revision_format,group_cg_administrator,1,1,1,1 diff --git a/security/security_rules.xml b/security/security_rules.xml index 36131865e154d9a6541446f68eb5bcb8216cee52..45da392508120a4563a87f7a32e7073b3efd9e4c 100644 --- a/security/security_rules.xml +++ b/security/security_rules.xml @@ -16,9 +16,12 @@ <field name="name">Modification période</field> </record> + <record id="group_questionnaire" model="res.groups"> + <field name="name">Gestion Questionnaire</field> + </record> + <record id="group_cg_administrative" model="res.groups"> - <field name="name">Administratif CG</field> - <field name="implied_ids" eval="[(6, 0, [ref('cgscop_partner.group_add_period')])]"/> + <field name="name">Modification toutes URs</field> </record> <record id="group_cg_administrator" model="res.groups"> diff --git a/views/res_partner.xml b/views/res_partner.xml index ff871c2256134ef026d89c2a0f5010d2c497f8d4..2f04bba6a07eb7d2a76247cb6d26d8e416ea9602 100644 --- a/views/res_partner.xml +++ b/views/res_partner.xml @@ -127,13 +127,19 @@ </field> <xpath expr='//form/sheet/group/group[2]' position="replace"> <group name="partner_segment_info" attrs="{'invisible': [('is_company', '=', False)]}"> + <field name="segment_1_nb" invisible="1"/> + <field name="segment_2_nb" invisible="1"/> + <field name="segment_3_nb" invisible="1"/> + <field name="segment_4_nb" invisible="1"/> + <field name="certification_ids" widget="many2many_tags" options="{'color_field': 'color', 'no_create': True}" attrs="{'invisible': [('is_company', '=', False)]}"/> - <field name="segment_1_id" widget="many2many_tags" options="{'color_field': 'color', 'no_create': True}" domain="[('ur_id', '=', ur_id)]"/> - <field name="segment_2_id" widget="many2many_tags" options="{'color_field': 'color', 'no_create': True}" domain="[('ur_id', '=', ur_id)]"/> - <field name="segment_3_id" widget="many2many_tags" options="{'color_field': 'color', 'no_create': True}" domain="[('ur_id', '=', ur_id)]"/> - <field name="segment_4_id" widget="many2many_tags" options="{'color_field': 'color', 'no_create': True}" domain="[('ur_id', '=', ur_id)]"/> + <field name="segment_1_id" widget="many2many_tags" options="{'color_field': 'color', 'no_create': True}" domain="[('ur_id', '=', ur_id)]" attrs="{'invisible':[('segment_1_nb', '=', 0)]}" /> + <field name="segment_2_id" widget="many2many_tags" options="{'color_field': 'color', 'no_create': True}" domain="[('ur_id', '=', ur_id)]" attrs="{'invisible':[('segment_2_nb', '=', 0)]}"/> + <field name="segment_3_id" widget="many2many_tags" options="{'color_field': 'color', 'no_create': True}" domain="[('ur_id', '=', ur_id)]" attrs="{'invisible':[('segment_3_nb', '=', 0)]}"/> + <field name="segment_4_id" widget="many2many_tags" options="{'color_field': 'color', 'no_create': True}" domain="[('ur_id', '=', ur_id)]" attrs="{'invisible':[('segment_4_nb', '=', 0)]}"/> <field name="organization_subtype_id" attrs="{'invisible': ['|', ('is_company','=', False), ('type', '!=', 'contact')]}" domain="[('child_ids', '=', False)]" options="{'no_create': True, 'no_open': True}"/> <field name="organization_type_id" readonly="1" attrs="{'invisible': ['|', ('is_company', '=', False), ('type', '!=', 'contact')]}" options="{'no_create': True, 'no_open': True}"/> + <field name="followup_delegate_id" widget="res_partner_many2one" options="{'no_open': True, 'no_create': True}" domain="[('active', '=', True),('ur_id', '=', ur_id)]" attrs="{'invisible': ['|', ('is_company','=', False), ('type', '!=', 'contact')]}"/> </group> <group name="contact_segment_info" attrs="{'invisible': ['|', ('is_company', '=', True), ('type', '!=', 'contact')]}"> <field name="title" options='{"no_create": True, "no_open": True}' attrs="{'invisible': [('is_company','=', True)]}"/> @@ -248,7 +254,8 @@ <button string="Envoyer Dossier CG" type="object" name="scop_send_to_cg" class="btn-primary" attrs="{'invisible': ['|', ('write_date', '=', False), ('project_status', '!=', '4_adhesion')]}"/> <button string="Dossier créé CG" type="object" name="scop_valid_cg" class="btn-primary" attrs="{'invisible': ['|', ('write_date', '=', False), ('project_status', '!=', '5_cg')]}" groups="cgscop_partner.group_add_period"/> <button string="Prospect Abandonne" type="object" name="scop_abandonne" attrs="{'invisible':[('project_status','in',('5_cg', '6_suivi', '7_abandonne'))]}"/> - <button string="Projet d'adhésion" class="oe_read_only" type="object" name="scop_prj_adhesion" attrs="{'invisible':['|',('project_status','not in',('6_suivi')),('membership_status','in',('member'))]}" confirm="Êtes-vous sûr de vouloir basculer cette coopérative dans les projets ?"/>/> + <button string="Projet d'adhésion" class="oe_read_only" type="object" name="scop_prj_adhesion" attrs="{'invisible':['|',('project_status','not in',('6_suivi')),('membership_status','in',('member'))]}" confirm="Êtes-vous sûr de vouloir basculer cette coopérative dans les projets ?"/> + <button string="Modification statut projet" type="action" name="%(cgscop_partner.scop_status_wizard_action)d" groups="cgscop_partner.group_cg_administrator"/> <field name="project_status" widget="statusbar" clickable="True" statusbar_visible="1_information,2_pre-diagnostic,3_accompagnement,4_adhesion" attrs="{'invisible':[('project_status','in',('6_suivi'))]}"/> </header> </xpath> @@ -331,12 +338,13 @@ <field name="email" widget="email" string="E-mail"/> <field name="zip_departement" string="N° de département" /> <field name="region" /> - <field name="website" widget="url" attrs="{'invisible': [('project_status', 'in', ('1_information', '2_pre-diagnostic', '3_accompagnement'))]}"/> - <label for='facebook' class="oe_read_only" string="Réseaux sociaux" attrs="{'invisible':[('facebook','=',False),('linkedin','=',False),('twitter','=',False)]}"/> + <field name="website" widget="url" attrs="{'invisible': [('project_status', 'in', ('1_information', '2_pre-diagnostic'))]}"/> + <label for='facebook' class="oe_read_only" string="Réseaux sociaux" attrs="{'invisible':[('facebook','=',False),('linkedin','=',False),('twitter','=',False),('instagram','=',False)]}"/> <div > <button string="" class="btn-cgscop oe_read_only" name="open_facebook" type="object" icon="fa-facebook" attrs="{'invisible':['|', ('facebook','=',False), ('project_status', 'in', ('1_information', '2_pre-diagnostic'))]}"/> <button string="" class="btn-cgscop oe_read_only" name="open_linkedin" type="object" icon="fa-linkedin" attrs="{'invisible':['|', ('linkedin','=',False), ('project_status', 'in', ('1_information', '2_pre-diagnostic'))]}"/> <button string="" class="btn-cgscop oe_read_only" name="open_twitter" type="object" icon="fa-twitter" attrs="{'invisible':['|', ('twitter','=',False), ('project_status', 'in', ('1_information', '2_pre-diagnostic'))]}"/> + <button string="" class="btn-cgscop oe_read_only" name="open_instagram" type="object" icon="fa-instagram" attrs="{'invisible':['|', ('instagram','=',False), ('project_status', 'in', ('1_information', '2_pre-diagnostic'))]}"/> </div> <label for='facebook' string="Facebook" class="oe_edit_only" attrs="{'invisible': [('project_status', 'in', ('1_information', '2_pre-diagnostic'))]}"/> <div > @@ -350,6 +358,11 @@ <div > <field class="oe_edit_only" name="twitter" widget="url" attrs="{'invisible': [('project_status', 'in', ('1_information', '2_pre-diagnostic'))]}"/> </div> + <label class="oe_edit_only" for='instagram' string="Instagram" attrs="{'invisible': [('project_status', 'in', ('1_information', '2_pre-diagnostic'))]}"/> + <div > + <field class="oe_edit_only" name="instagram" widget="url" attrs="{'invisible': [('project_status', 'in', ('1_information', '2_pre-diagnostic'))]}"/> + </div> + <field name="id_riga" groups="cgscop_partner.group_cg_administrator"/> </group> <group string="Suivi UR"> @@ -357,18 +370,21 @@ <field name="creation_delegate_id" widget="res_partner_many2one" attrs="{'required':[('project_status','in',('3_accompagnement','4_adhesion', '5_cg'))], 'invisible':[('project_status', 'in', '6_suivi')]}" options="{'no_open': True, 'no_create': True}" domain="[('ur_id', '=', ur_id)]"/> <field name="followup_delegate_id" widget="res_partner_many2one" options="{'no_open': True, 'no_create': True}" domain="[('active', '=', True),('ur_id', '=', ur_id)]" attrs="{'invisible': [('project_status', 'in', ('1_information', '2_pre-diagnostic', '3_accompagnement'))]}"/> - <field name="segment_1_id" widget="many2many_tags" options="{'color_field': 'color', 'no_create': True}" domain="[('ur_id', '=', ur_id)]" attrs="{'invisible': [('project_status', 'in', ('1_information', '2_pre-diagnostic'))]}"/> - <field name="segment_2_id" widget="many2many_tags" options="{'color_field': 'color', 'no_create': True}" domain="[('ur_id', '=', ur_id)]" attrs="{'invisible': [('project_status', 'in', ('1_information', '2_pre-diagnostic'))]}"/> - <field name="segment_3_id" widget="many2many_tags" options="{'color_field': 'color', 'no_create': True}" domain="[('ur_id', '=', ur_id)]" attrs="{'invisible': [('project_status', 'in', ('1_information', '2_pre-diagnostic'))]}"/> - <field name="segment_4_id" widget="many2many_tags" options="{'color_field': 'color', 'no_create': True}" domain="[('ur_id', '=', ur_id)]" attrs="{'invisible': [('project_status', 'in', ('1_information', '2_pre-diagnostic'))]}"/> - <field name="activity_federation_com" groups="cgscop_partner.group_federation_com" options="{'no_open': True, 'no_create': True}"/> - <field name="activity_federation_indus" groups="cgscop_partner.group_federation_indus" options="{'no_open': True, 'no_create': True}"/> + <field name="support_delegate_id" widget="res_partner_many2one" options="{'no_open': True, 'no_create': True}" domain="[('active', '=', True),('ur_id', '=', ur_id)]" /> + <field name="segment_1_id" widget="many2many_tags" options="{'color_field': 'color', 'no_create': True}" domain="[('ur_id', '=', ur_id)]" attrs="{'invisible': ['|',('project_status', 'in', ('1_information')),('segment_1_nb', '=', 0)]}"/> + <field name="segment_2_id" widget="many2many_tags" options="{'color_field': 'color', 'no_create': True}" domain="[('ur_id', '=', ur_id)]" attrs="{'invisible': ['|',('project_status', 'in', ('1_information')),('segment_2_nb', '=', 0)]}"/> + <field name="segment_3_id" widget="many2many_tags" options="{'color_field': 'color', 'no_create': True}" domain="[('ur_id', '=', ur_id)]" attrs="{'invisible': ['|',('project_status', 'in', ('1_information')),('segment_3_nb', '=', 0)]}"/> + <field name="segment_4_id" widget="many2many_tags" options="{'color_field': 'color', 'no_create': True}" domain="[('ur_id', '=', ur_id)]" attrs="{'invisible': ['|',('project_status', 'in', ('1_information')),('segment_4_nb', '=', 0)]}"/> + <field name="is_federation_com" invisible="True"/> + <field name="is_federation_indus" invisible="True"/> + <field name="activity_federation_com_ids" groups="cgscop_partner.group_federation_com" options="{'no_open': True, 'no_create': True}" attrs="{'invisible': [('is_federation_com', '!=', True)]}" widget="many2many_tags"/> + <field name="activity_federation_indus_ids" groups="cgscop_partner.group_federation_indus" options="{'no_open': True, 'no_create': True}" attrs="{'invisible': [('is_federation_indus', '!=', True)]}" widget="many2many_tags"/> </group> <group string="Informations Activité"> - <field name="creation_origin_id" attrs="{'required': [('is_cooperative', '=', True)]}" options="{'no_open': True, 'no_create': True}"/> - <field name="creation_suborigin_id" domain="[('parent_id', '=', creation_origin_id), ('child_ids', '=', False)]" options="{'no_open': True, 'no_create': True}"/> - <field name="is_ag_constitution" attrs="{'invisible': [('project_status', '!=', '3_accompagnement')]}"/> - <field name="date_1st_sign" attrs="{'invisible': [('project_status', 'in', ('1_information', '2_pre-diagnostic', '3_accompagnement')), ('is_ag_constitution', '!=', True)], 'required': ['|', ('project_status', 'in', ('4_adhesion', '5_cg', '6_suivi')), ('is_ag_constitution', '=', True), ('is_cooperative', '=', True)]}"/> + <field name="creation_origin_id" attrs="{'invisible': [('cooperative_form_id', '=', %(cgscop_partner.form_noncooperative)d)], 'required': [('is_cooperative', '=', True), ('cooperative_form_id', '!=', %(cgscop_partner.form_noncooperative)d)]}" options="{'no_open': True, 'no_create': True}"/> + <field name="creation_suborigin_id" domain="[('parent_id', '=', creation_origin_id), ('child_ids', '=', False)]" options="{'no_open': True, 'no_create': True}" attrs="{'invisible': [('cooperative_form_id', '=', %(cgscop_partner.form_noncooperative)d)]}" /> + <field name="is_ag_constitution" attrs="{'invisible': ['|', ('project_status', '!=', '3_accompagnement'), ('cooperative_form_id', '=', %(cgscop_partner.form_noncooperative)d)]}"/> + <field name="date_1st_sign" attrs="{'invisible': ['|', '&', ('project_status', 'in', ('1_information', '2_pre-diagnostic', '3_accompagnement')), ('is_ag_constitution', '!=', True), ('cooperative_form_id', '=', %(cgscop_partner.form_noncooperative)d)], 'required': ['|', ('project_status', 'in', ('4_adhesion', '5_cg', '6_suivi')), ('is_ag_constitution', '=', True), ('is_cooperative', '=', True), ('cooperative_form_id', '!=', %(cgscop_partner.form_noncooperative)d)]}"/> <field name="registration_date" attrs="{'invisible': [('project_status', 'in', ('1_information', '2_pre-diagnostic', '3_accompagnement'))]}"/> <field name="social_object" attrs="{'required': [('is_cooperative', '=', True), ('project_status','in',('2_pre-diagnostic', '3_accompagnement','4_adhesion', '5_cg', '6_suivi'))]}"/> <field name="naf_id" attrs="{'readonly': [('write_date', '!=', False), ('project_status', '=', '6_suivi')], 'required':['|', ('project_status','in',('4_adhesion', '5_cg'), '&', ('write_date', '=', False), ('project_status', '=', '6_suivi'))], 'invisible': [('project_status', 'in', ('1_information', '2_pre-diagnostic', '3_accompagnement'))]}" options="{'no_open': True, 'no_create': True}"/> @@ -383,7 +399,7 @@ </div> <field name="siren" readonly="1" attrs="{'invisible': [('project_status', 'in', ('1_information', '2_pre-diagnostic', '3_accompagnement'))]}"/> <field name="capital" attrs="{'required':[('project_status','in',('4_adhesion', '5_cg', '6_suivi'))], 'invisible': [('project_status', 'in', ('1_information', '2_pre-diagnostic', '3_accompagnement'))]}" widget="monetary"/> - <field name="first_closeout" attrs="{'required':[('is_cooperative', '!=', False), ('project_status', 'in', ('4_adhesion', '5_cg', '6_suivi'))], 'invisible': [('project_status', 'in', ('1_information', '2_pre-diagnostic', '3_accompagnement'))]}"/> + <field name="first_closeout" attrs="{'required':[('is_cooperative', '!=', False), ('project_status', 'in', ('4_adhesion', '5_cg', '6_suivi')), ('cooperative_form_id', '!=', %(cgscop_partner.form_noncooperative)d)], 'invisible': ['|', ('project_status', 'in', ('1_information', '2_pre-diagnostic', '3_accompagnement')), ('cooperative_form_id', '=', %(cgscop_partner.form_noncooperative)d)]}"/> <field name="closeout_month" attrs="{'required':[('project_status','in',('4_adhesion', '5_cg', '6_suivi'))], 'invisible': [('project_status', 'in', ('1_information', '2_pre-diagnostic', '3_accompagnement'))]}"/> <field name="is_seed_scop" attrs="{'invisible': [('project_status', '=', '1_information')]}"/> <field name="seed_end" attrs="{'invisible': [('is_seed_scop', '!=', True)], 'required':[('project_status','in',('4_adhesion', '5_cg', '6_suivi')),('is_seed_scop', '=', True)]}"/> @@ -757,6 +773,11 @@ <field name="arch" type="xml"> <form string="Contact Dirigeant"> <sheet> + <div class="oe_button_box" name="button_box"> + <button name="toggle_active" type="object" class="oe_stat_button" icon="fa-archive"> + <field name="active" widget="boolean_button" options="{'terminology': 'archive'}"/> + </button> + </div> <field name="parent_id_onchange" invisible="1"/> <field name="parent_id" invisible="1"/> <group col="2"> @@ -782,7 +803,7 @@ </group> <field name="subscription_ids"> <tree string="Subscriptions" editable="bottom"> - <field name="newsletter_id"/> + <field name="newsletter_id" domain="[]"/> <field name="consent"/> </tree> </field> @@ -810,6 +831,11 @@ <field name="arch" type="xml"> <form string="Contacts / Addresses"> <sheet> + <div class="oe_button_box" name="button_box"> + <button name="toggle_active" type="object" class="oe_stat_button" icon="fa-archive"> + <field name="active" widget="boolean_button" options="{'terminology': 'archive'}"/> + </button> + </div> <field name="type" required="1" widget="radio" options="{'horizontal': true}"/> <field name="parent_id_onchange" invisible="1"/> <field name="parent_id" invisible="1"/> diff --git a/views/res_partner_cooperative.xml b/views/res_partner_cooperative.xml index c4c92ce6ecf63df8ba6dad3606c03c041673b6b4..b98856cd3101532cdae460e00d4bcab128e7c42b 100644 --- a/views/res_partner_cooperative.xml +++ b/views/res_partner_cooperative.xml @@ -91,7 +91,7 @@ <field name="name">organisme.tree</field> <field name="model">res.partner</field> <field name="arch" type="xml"> - <tree string="Organismes"> + <tree string="Organismes" create="0"> <field name="display_name" string="Raison Sociale"/> <field name="member_number_int"/> <field name="cooperative_form_id"/> diff --git a/wizard/__init__.py b/wizard/__init__.py index 14ef5e48de39ecbfd07497e8222d950179aaf0f9..0142c729b11252427835735f55280928f7125f8a 100644 --- a/wizard/__init__.py +++ b/wizard/__init__.py @@ -6,3 +6,4 @@ from . import scop_period_wizard from . import scop_deces_wizard from . import scop_membership_period_wizard from . import scop_membership_out_wizard +from . import scop_status_wizard diff --git a/wizard/scop_period_wizard.py b/wizard/scop_period_wizard.py index bf331d562c3e45173b1bd747ec9422204df58633..1fc0371731538b365e9d043de7b6396950456270 100644 --- a/wizard/scop_period_wizard.py +++ b/wizard/scop_period_wizard.py @@ -220,7 +220,16 @@ class ScopPeriodWizard(models.TransientModel): period_values.update(values) self.env['scop.period'].create(period_values) + # Gestion du cas des non coopératives adhérentes + non_coop = self.env.ref('cgscop_partner.form_noncooperative') + if period.cooperative_form_id == non_coop: + partner_values.update({ + 'creation_origin_id': None, + 'date_1st_sign': None, + 'first_closeout': None + }) # Update partner partner_values.update(values) + partner = self.env['res.partner'].browse(period.partner_id) partner.write(partner_values) diff --git a/wizard/scop_status_wizard.py b/wizard/scop_status_wizard.py new file mode 100644 index 0000000000000000000000000000000000000000..4b21de59d50b30c106d32595e9a1838740ff0f21 --- /dev/null +++ b/wizard/scop_status_wizard.py @@ -0,0 +1,48 @@ +# © 2019 Le Filament (<http://www.le-filament.com>) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models, api + + +PROJECT_STATUS = [ + ('1_information', "Phase d'information"), + ('2_pre-diagnostic', 'Phase de pré-diagnostic'), + ('3_accompagnement', "Phase d'accompagnement projet"), + ('4_adhesion', "Phase d'adhésion"), + ('5_cg', 'Soumis CGScop'), + ('6_suivi', 'Phase de suivi'), + ('7_abandonne', 'Projet abandonné')] + + +class ScopStatusWizard(models.TransientModel): + _name = 'scop.status.wizard' + _description = "Wizard changement de statut projet" + + # Default functions + @api.model + def _default_partner_id(self): + return self.env.context.get('active_id') + + @api.model + def _default_project_status(self): + return self.env['res.partner'].browse( + self.env.context.get('active_id')).project_status + + # Fields common + partner_id = fields.Many2one( + comodel_name='res.partner', + string='Partner', + default=_default_partner_id) + + # Informations Bandeau + project_status = fields.Selection( + selection=PROJECT_STATUS, + string='Statut projet actuel', + default=_default_project_status) + project_status_new = fields.Selection( + selection=PROJECT_STATUS, + string='Statut projet nouveau',) + + def change_project_status(self): + self.partner_id.write( + {'project_status': self.project_status_new}) diff --git a/wizard/scop_status_wizard.xml b/wizard/scop_status_wizard.xml new file mode 100644 index 0000000000000000000000000000000000000000..f11e2371bf4eb6548dc17dc1976246afc4acb57a --- /dev/null +++ b/wizard/scop_status_wizard.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<odoo> + <!-- WIZARD FORM --> + <record id="scop_status_wizard_view_form" model="ir.ui.view"> + <field name="name">scop.status.wizard.form</field> + <field name="model">scop.status.wizard</field> + <field name="arch" type="xml"> + <form string="Changement statut projet"> + <group name="period" string="Période" col="2"> + <field name="partner_id" readonly="1"/> + <field name="project_status" readonly="1"/> + <field name="project_status_new" required="1"/> + </group> + <footer> + <button class="btn btn-sm btn-primary" name="change_project_status" string="Modifier statut projet" type="object"/> + <button class="btn btn-sm btn-default" special="cancel" string="Close"/> + </footer> + </form> + </field> + </record> + + <record id="scop_status_wizard_action" model="ir.actions.act_window"> + <field name="name">Modification statut projet</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">scop.status.wizard</field> + <field name="view_mode">form</field> + <field name="view_id" ref="scop_status_wizard_view_form"/> + <field name="target">new</field> + </record> + +</odoo>