diff --git a/__manifest__.py b/__manifest__.py index 22196e4470dc5f67c875a64aff6fc70c67131f74..32e73e588a95c8ce583090162c835382f6582940 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 4a21ef1333807ea28c47db0db38ce54a9afd2b33..9cac81a6b0c3b18fac83fbe705fb9c79f140c49e 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 99f2e86390719fefd065322720c38e93d1b0caf2..af19111faf0efa6eb3c94b3d14eac8e8657c62af 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 2db860f3e55ad009a0a26fa0a0fec525b71ca6d6..96fa0b62de6941ff782dc1ea14e019533c874e97 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 0000000000000000000000000000000000000000..0ef03db691f3cc2761e3fdeb8a6491112c3623fb --- /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 0000000000000000000000000000000000000000..c16e2dd36cadd3156c69b2092c7f50263c1c1feb --- /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 0000000000000000000000000000000000000000..ca4a97fc9621ed3a1343d9d15a078a71af882638 --- /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 0000000000000000000000000000000000000000..0656cb5e49c8ce77fcdc30126932a3d9095e97f0 --- /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 8c8b69f9cf030f87306ca03b1356090f53739fae..bf331d562c3e45173b1bd747ec9422204df58633 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"