From c8b653f11ca788725b760ec1f7a81f77fcfb9a8a Mon Sep 17 00:00:00 2001 From: Remi <remi@le-filament.com> Date: Tue, 29 Oct 2019 16:43:03 +0100 Subject: [PATCH] Add adhesion period --- __manifest__.py | 2 + models/res_partner.py | 2 +- views/res_partner_cooperative.xml | 2 + wizard/__init__.py | 2 + wizard/scop_membership_out_wizard.py | 53 ++++++++++++++++++++++++ wizard/scop_membership_out_wizard.xml | 32 ++++++++++++++ wizard/scop_membership_period_wizard.py | 51 +++++++++++++++++++++++ wizard/scop_membership_period_wizard.xml | 33 +++++++++++++++ wizard/scop_period_wizard.py | 2 +- 9 files changed, 177 insertions(+), 2 deletions(-) create mode 100644 wizard/scop_membership_out_wizard.py create mode 100644 wizard/scop_membership_out_wizard.xml create mode 100644 wizard/scop_membership_period_wizard.py create mode 100644 wizard/scop_membership_period_wizard.xml diff --git a/__manifest__.py b/__manifest__.py index 22196e4..32e73e5 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -22,6 +22,8 @@ "views/assets.xml", "wizard/scop_period_wizard.xml", "wizard/scop_deces_wizard.xml", + "wizard/scop_membership_out_wizard.xml", + "wizard/scop_membership_period_wizard.xml", "views/res_company.xml", "views/res_users.xml", "views/res_partner.xml", diff --git a/models/res_partner.py b/models/res_partner.py index 4a21ef1..9cac81a 100644 --- a/models/res_partner.py +++ b/models/res_partner.py @@ -624,7 +624,7 @@ class ScopPartner(models.Model): and parent.cooperative_form_id.name == "SCIC"): partner.contact_legality = 'customer' - @api.depends('membership_period_ids') + @api.model def _compute_membership(self): for partner in self: type_cg = self.env['scop.membership.type'].search([ diff --git a/views/res_partner_cooperative.xml b/views/res_partner_cooperative.xml index 99f2e86..af19111 100644 --- a/views/res_partner_cooperative.xml +++ b/views/res_partner_cooperative.xml @@ -118,7 +118,9 @@ <form string="Cooperatives" attrs="{'readonly': [('project_status', '=', '5_cg')]}"> <header> <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="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"/> <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 (temp)" type="object" name="scop_valid_cg" class="btn-primary" attrs="{'invisible': ['|', ('write_date', '=', False), ('project_status', '!=', '5_cg')]}"/> <button string="Prospect Abandonne" type="object" name="scop_abandonne" attrs="{'invisible':[('project_status','in',('5_cg', '6_suivi', '7_abandonne'))]}"/> diff --git a/wizard/__init__.py b/wizard/__init__.py index 2db860f..96fa0b6 100644 --- a/wizard/__init__.py +++ b/wizard/__init__.py @@ -3,3 +3,5 @@ from . import scop_period_wizard from . import scop_deces_wizard +from . import scop_membership_period_wizard +from . import scop_membership_out_wizard diff --git a/wizard/scop_membership_out_wizard.py b/wizard/scop_membership_out_wizard.py new file mode 100644 index 0000000..0ef03db --- /dev/null +++ b/wizard/scop_membership_out_wizard.py @@ -0,0 +1,53 @@ +# © 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 ScopMembershipOutWizard(models.TransientModel): + _name = 'scop.membership.out.wizard' + _description = "Radiation" + + # Default functions + @api.model + def _default_partner_id(self): + return self.env.context.get('active_id') + + partner_id = fields.Integer('Partner', default=_default_partner_id) + type_id = fields.Many2one( + 'scop.membership.type', + string="Type d'adhésion", + ondelete='restrict', required=True) + end = fields.Date( + "Fin d'adhésion", required=True, default=fields.Date.today()) + end_reason_id = fields.Many2one( + 'scop.membership.reason.end', + string="Motif de fin d’adhésion", + on_delete='restrict', + required=True) + note = fields.Text('Commentaires') + + @api.multi + def member_out(self): + # Close previous period + for period in self: + last_period = self.env['scop.membership.period'].search( + [('partner_id', '=', period.partner_id), + ('end', '=', False), ('type_id', '=', period.type_id.id)], + limit=1) + if last_period: + if period.end >= last_period.start: + last_period.write({ + 'end': period.end, + 'end_reason_id': period.end_reason_id.id, + 'note': period.note, + }) + else: + raise ValidationError( + "La date de fin doit être postèrieure à la date de " + + "début de la dernière période: " + + str(last_period.start)) + else: + raise ValidationError( + "Il n'existe pas de période avec ce type à fermer.") diff --git a/wizard/scop_membership_out_wizard.xml b/wizard/scop_membership_out_wizard.xml new file mode 100644 index 0000000..c16e2dd --- /dev/null +++ b/wizard/scop_membership_out_wizard.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<odoo> + <!-- WIZARD FORM --> + <record id="scop_membership_out_wizard_view_form" model="ir.ui.view"> + <field name="name">scop.membership.out.wizard.form</field> + <field name="model">scop.membership.out.wizard</field> + <field name="arch" type="xml"> + <form string="Radiation"> + <group name="period" string="Radiation"> + <field name="type_id"/> + <field name="end"/> + <field name="end_reason_id"/> + <field name="note"/> + </group> + <footer> + <button class="btn btn-sm btn-primary" name="member_out" string="Créer" type="object" confirm="Êtes-vous sûr de vouloir clôturer la dernière période ?"/> + <button class="btn btn-sm btn-default" special="cancel" string="Close"/> + </footer> + </form> + </field> + </record> + + <record id="scop_membership_out_wizard_create_action" model="ir.actions.act_window"> + <field name="name">Radiation</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">scop.membership.out.wizard</field> + <field name="view_mode">form</field> + <field name="view_id" ref="scop_membership_out_wizard_view_form"/> + <field name="target">new</field> + </record> + +</odoo> diff --git a/wizard/scop_membership_period_wizard.py b/wizard/scop_membership_period_wizard.py new file mode 100644 index 0000000..ca4a97f --- /dev/null +++ b/wizard/scop_membership_period_wizard.py @@ -0,0 +1,51 @@ +# © 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 ScopMembershipPeriodWizard(models.TransientModel): + _name = 'scop.membership.period.wizard' + _description = "Création d'une nouvelle période d'adhésion" + + # Default functions + @api.model + def _default_partner_id(self): + return self.env.context.get('active_id') + + partner_id = fields.Integer('Partner', default=_default_partner_id) + type_id = fields.Many2one( + 'scop.membership.type', + string="Type d'adhésion", + ondelete='restrict', required=True) + start = fields.Date('Début d’adhésion', required=True, + default=fields.Date.today()) + number = fields.Char("No adhérent", required=True) + state = fields.Selection( + [("none", "Non Adhérent"), + ("ongoing", "Traitement de l'adhésion"), + ("approval", "Attente d'approbation"), + ("done", "Adhérent")], + string="Statut adhésion", default="none", required=True) + note = fields.Text('Commentaires') + + @api.multi + def create_period(self): + for period in self: + # Raise validation error if previous period exists + if self.env['scop.membership.period'].search( + [('partner_id', '=', period.partner_id), + ('end', '=', False), ('type_id', '=', period.type_id.id)], + limit=1): + raise ValidationError( + "Une période d'adhésion existe déjà pour ce type") + else: + self.env['scop.membership.period'].create({ + 'partner_id': period.partner_id, + 'type_id': period.type_id.id, + 'start': period.start, + 'number': period.number, + 'state': period.state, + 'note': period.note + }) diff --git a/wizard/scop_membership_period_wizard.xml b/wizard/scop_membership_period_wizard.xml new file mode 100644 index 0000000..0656cb5 --- /dev/null +++ b/wizard/scop_membership_period_wizard.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<odoo> + <!-- WIZARD FORM --> + <record id="scop_membership_period_wizard_view_form" model="ir.ui.view"> + <field name="name">scop.membership.period.wizard.form</field> + <field name="model">scop.membership.period.wizard</field> + <field name="arch" type="xml"> + <form string="Nouvelle Période d'Adhésion"> + <group name="period" string="Période" col="2"> + <field name="type_id"/> + <field name="start"/> + <field name="number"/> + <field name="state"/> + <field name="note"/> + </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 d'adhésion ?"/> + <button class="btn btn-sm btn-default" special="cancel" string="Close"/> + </footer> + </form> + </field> + </record> + + <record id="scop_membership_period_wizard_create_action" model="ir.actions.act_window"> + <field name="name">Nouvelle période d'adhésion</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">scop.membership.period.wizard</field> + <field name="view_mode">form</field> + <field name="view_id" ref="scop_membership_period_wizard_view_form"/> + <field name="target">new</field> + </record> + +</odoo> diff --git a/wizard/scop_period_wizard.py b/wizard/scop_period_wizard.py index 8c8b69f..bf331d5 100644 --- a/wizard/scop_period_wizard.py +++ b/wizard/scop_period_wizard.py @@ -5,7 +5,7 @@ from odoo import api, fields, models from odoo.exceptions import ValidationError -class ScopPeiodWizard(models.TransientModel): +class ScopPeriodWizard(models.TransientModel): _name = 'scop.period.wizard' _description = "Création d'une nouvelle période" -- GitLab