From 371162b5ddb34c907a0492a734e3b528adeddc7c Mon Sep 17 00:00:00 2001 From: Benjamin <benjamin@le-filament.com> Date: Thu, 26 Mar 2020 12:44:17 +0100 Subject: [PATCH] [#164] ajout d'un bouton pour changement d'adresse --- __manifest__.py | 1 + views/res_partner.xml | 1 + wizard/__init__.py | 1 + wizard/scop_address_wizard.py | 239 +++++++++++++++++++++++++++++++++ wizard/scop_address_wizard.xml | 53 ++++++++ 5 files changed, 295 insertions(+) create mode 100644 wizard/scop_address_wizard.py create mode 100644 wizard/scop_address_wizard.xml diff --git a/__manifest__.py b/__manifest__.py index 481c4d3..3217871 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -22,6 +22,7 @@ "security/security_rules.xml", "security/ir.model.access.csv", "views/assets.xml", + "wizard/scop_address_wizard.xml", "wizard/scop_period_wizard.xml", "wizard/scop_deces_wizard.xml", "wizard/scop_membership_out_wizard.xml", diff --git a/views/res_partner.xml b/views/res_partner.xml index 83c2dc3..6900d29 100644 --- a/views/res_partner.xml +++ b/views/res_partner.xml @@ -238,6 +238,7 @@ <xpath expr='//form/sheet' position="before"> <header attrs="{'invisible': [('is_cooperative', '=', False)]}"> <button string="Nouvelle période" type="action" name="%(cgscop_partner.scop_period_wizard_create_action)d" class="oe_highlight" attrs="{'invisible': ['|', ('write_date', '=', False), ('project_status', '!=', '6_suivi')]}" groups="cgscop_partner.group_add_period"/> + <button string="Changement d'adresse" type="action" name="%(cgscop_partner.scop_address_wizard_action)d" class="oe_highlight" attrs="{'invisible': ['|', ('write_date', '=', False), ('project_status', '!=', '6_suivi')]}" /> <button string="Nouvelle période d'adhésion" type="action" name="%(cgscop_partner.scop_membership_period_wizard_create_action)d" class="oe_highlight" attrs="{'invisible': ['|', ('write_date', '=', False), ('project_status', '!=', '6_suivi')]}" groups="cgscop_partner.group_add_period"/> <button string="Décès/Mise en sommeil" type="action" name="%(cgscop_partner.scop_deces_wizard_create_action)d" attrs="{'invisible': ['|', ('dissolution_reason_id', '!=', False), '|', ('write_date', '=', False), ('project_status', '!=', '6_suivi')]}" groups="cgscop_partner.group_add_period"/> <button string="Radiation" type="action" name="%(cgscop_partner.scop_membership_out_wizard_create_action)d" attrs="{'invisible': ['|', ('write_date', '=', False), ('project_status', '!=', '6_suivi')]}" groups="cgscop_partner.group_add_period"/> diff --git a/wizard/__init__.py b/wizard/__init__.py index 96fa0b6..14ef5e4 100644 --- a/wizard/__init__.py +++ b/wizard/__init__.py @@ -1,6 +1,7 @@ # © 2019 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from . import scop_address_wizard from . import scop_period_wizard from . import scop_deces_wizard from . import scop_membership_period_wizard diff --git a/wizard/scop_address_wizard.py b/wizard/scop_address_wizard.py new file mode 100644 index 0000000..d8af6e7 --- /dev/null +++ b/wizard/scop_address_wizard.py @@ -0,0 +1,239 @@ +# © 2019 Le Filament (<http://www.le-filament.com>) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models +from odoo.exceptions import ValidationError + + +class ScopPeriodWizard(models.TransientModel): + _name = 'scop.address.wizard' + _description = "Wizard changement d'adresse" + + # Default functions + @api.model + def _default_partner_id(self): + return self.env.context.get('active_id') + + @api.model + def _default_previous_period_id(self): + return self.env['scop.period'].search( + [('partner_id', '=', self.env.context.get('active_id')), + ('end', '=', False)], + limit=1).id + + @api.model + def _default_name(self): + return self.env['res.partner'].browse( + self.env.context.get('active_id')).name + + @api.model + def _default_cooperative_form_id(self): + return self.env['res.partner'].browse( + self.env.context.get('active_id')).cooperative_form_id + + @api.model + def _default_partner_company_type_id(self): + return self.env['res.partner'].browse( + self.env.context.get('active_id')).partner_company_type_id + + @api.model + def _default_siret(self): + return self.env['res.partner'].browse( + self.env.context.get('active_id')).siret + + @api.model + def _default_street(self): + return self.env['res.partner'].browse( + self.env.context.get('active_id')).street + + @api.model + def _default_street2(self): + return self.env['res.partner'].browse( + self.env.context.get('active_id')).street2 + + @api.model + def _default_street3(self): + return self.env['res.partner'].browse( + self.env.context.get('active_id')).street3 + + @api.model + def _default_zip(self): + return self.env['res.partner'].browse( + self.env.context.get('active_id')).zip + + @api.model + def _default_zip_id(self): + return self.env['res.partner'].browse( + self.env.context.get('active_id')).zip_id + + @api.model + def _default_city(self): + return self.env['res.partner'].browse( + self.env.context.get('active_id')).city + + @api.model + def _default_cedex(self): + return self.env['res.partner'].browse( + self.env.context.get('active_id')).cedex + + @api.model + def _default_state_id(self): + return self.env['res.partner'].browse( + self.env.context.get('active_id')).state_id + + @api.model + def _default_country_id(self): + return self.env['res.partner'].browse( + self.env.context.get('active_id')).country_id + + @api.model + def _default_naf_id(self): + return self.env['res.partner'].browse( + self.env.context.get('active_id')).naf_id + + @api.model + def _default_cae(self): + return self.env['res.partner'].browse( + self.env.context.get('active_id')).cae + + # Fields common + partner_id = fields.Integer('Partner', default=_default_partner_id) + + # Fields previous period + previous_period_id = fields.Integer(default=_default_previous_period_id) + end_reason = fields.Selection( + [('juri', "Modification de la forme juridique"), + ('form', "Changement de forme coopérative"), + ('acti', "Changement d'activité (NAF)"), + ('adr', "Changement d'adresse"), + ('nom', "Changement de dénomination sociale"), + ('autr', "Autres")], + string='Motif', + default='adr') + comments = fields.Text('Commentaires') + + # Fields new period + start = fields.Date('Début de validité', required=True, + default=fields.Date.today()) + name = fields.Char('Raison Sociale', required=True, default=_default_name) + cooperative_form_id = fields.Many2one( + 'res.partner.cooperative.form', + string="Cooperative form", + on_delete='restrict', required=True, + default=_default_cooperative_form_id) + partner_company_type_id = fields.Many2one( + comodel_name='res.partner.company.type', + string='Legal Form', + track_visibility='onchange', + on_delete='restrict', required=True, + default=_default_partner_company_type_id) + siret = fields.Char(string='SIRET', size=14, required=True, + default=_default_siret) + street = fields.Char(default=_default_street) + street2 = fields.Char(default=_default_street2) + street3 = fields.Char(default=_default_street3) + zip = fields.Char(default=_default_zip) + zip_id = fields.Many2one('res.city.zip', 'ZIP Location', + default=_default_zip_id) + city = fields.Char(default=_default_city) + cedex = fields.Char(default=_default_cedex) + state_id = fields.Many2one( + "res.country.state", + string='State', + ondelete='restrict', + domain="[('country_id', '=?', country_id)]", + default=_default_state_id) + country_id = fields.Many2one( + 'res.country', string='Country', ondelete='restrict', + default=_default_country_id) + naf_id = fields.Many2one( + 'res.partner.naf', + string='Code NAF', + on_delete='restrict', default=_default_naf_id) + cae = fields.Boolean("CAE", default=_default_cae) + + + # Action + @api.onchange('zip_id') + def _onchange_zip_id(self): + if self.zip_id: + self.zip = self.zip_id.name + self.city = self.zip_id.city_id.name + self.country_id = self.zip_id.city_id.country_id + self.state_id = self.zip_id.city_id.state_id + + @api.multi + def create_period(self): + for period in self: + partner_values = {} + partner = self.env['res.partner'].browse(period.partner_id) + + # Check changement de région + zip_id = self.env['res.city.zip'].search([ + ('name', '=', period.zip)]) + region = zip_id[0].city_id[0].state_id + if partner.region and region != partner.region: + raise ValidationError( + "Vous ne pouvez pas modifier l'adresse " + "dans une autre région.\n" + " - ancienne région : %s\n" + " - nouvelle région : %s" % (partner.region.name, region.name)) + + # Close previous period + previous_period = self.env['scop.period'].browse( + period.previous_period_id) + print(previous_period) + if previous_period: + if previous_period.end: + if period.start >= previous_period.end: + partner_values = { + 'dissolution_date': False, + } + else: + raise ValidationError( + "La nouvelle période ne peut commencer avant la " + + "fin de la période précédente : " + + str(previous_period.end)) + if period.start >= previous_period.start: + if not previous_period.end: + previous_period.sudo().write({ + 'end': period.start, + 'end_reason': period.end_reason, + 'comments': period.comments, + }) + else: + raise ValidationError( + "La nouvelle période ne peut commencer avant la " + + "période précédente : " + + str(previous_period.start)) + + # Create new period + period_values = { + 'start': period.start, + 'partner_id': period.partner_id + } + + values = { + 'name': period.name, + 'dissolution_reason_id': False, + 'cooperative_form_id': period.cooperative_form_id.id, + 'partner_company_type_id': period.partner_company_type_id.id, + 'siret': period.siret, + 'street': period.street, + 'street2': period.street2, + 'street3': period.street3, + 'zip': period.zip, + 'zip_id': period.zip_id.id, + 'city': period.city, + 'cedex': period.cedex, + 'state_id': period.state_id.id, + 'country_id': period.country_id.id, + 'naf_id': period.naf_id.id, + 'cae': period.cae + } + period_values.update(values) + self.env['scop.period'].sudo().create(period_values) + + # Update partner + partner_values.update(values) + partner.write(partner_values) diff --git a/wizard/scop_address_wizard.xml b/wizard/scop_address_wizard.xml new file mode 100644 index 0000000..a27f4d6 --- /dev/null +++ b/wizard/scop_address_wizard.xml @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="UTF-8"?> +<odoo> + <!-- WIZARD FORM --> + <record id="scop_address_wizard_view_form" model="ir.ui.view"> + <field name="name">scop.address.wizard.form</field> + <field name="model">scop.address.wizard</field> + <field name="arch" type="xml"> + <form string="Nouvelle Période"> + <group name="period" string="Période" col="2"> + <field name="start" required="1"/> + <field name="previous_period_id" invisible="1"/> + <field name="end_reason" attrs="{'required': [('previous_period_id', '!=', 0)], 'invisible': [('previous_period_id', '=', 0)]}" readonly="1"/> + <field name="comments" attrs="{'invisible': [('previous_period_id', '=', 0)]}"/> + </group> + <group col="2"> + <group> + <field name="name" readonly="1"/> + <field name="siret" required="1"/> + </group> + <group> + <label for='street' string="Adresse du siège social"/> + <div class="o_address_format" modifiers="{}"> + <field name="street" placeholder="Rue..." class="o_address_street" required="1"/> + <field name="street2" placeholder="Rue 2..." class="o_address_street"/> + <field name="street3" placeholder="Rue 3..." class="o_address_street"/> + <field name="zip_id" options="{'create_name_field': 'city', 'no_open': True, 'no_create': True}" placeholder="Location completion" + on_change="1" can_create="true" can_write="true"/> + <field name="zip" placeholder="Code postal" class="o_address_city" on_change="1" required="1"/> + <field name="city" placeholder="Ville" class="o_address_city" required="1"/> + <field name="cedex" placeholder="Cedex" class="o_address_city"/> + <field name="state_id" placeholder="État" invisible="1"/> + <field name="country_id" placeholder="Pays" invisible="1"/> + </div> + </group> + </group> + <footer> + <button class="btn btn-sm btn-primary" name="create_period" string="Créer" type="object" confirm="Êtes-vous sûr de vouloir créer une nouvelle période ?"/> + <button class="btn btn-sm btn-default" special="cancel" string="Close"/> + </footer> + </form> + </field> + </record> + + <record id="scop_address_wizard_action" model="ir.actions.act_window"> + <field name="name">Changement d'adresse</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">scop.address.wizard</field> + <field name="view_mode">form</field> + <field name="view_id" ref="scop_address_wizard_view_form"/> + <field name="target">new</field> + </record> + +</odoo> -- GitLab