diff --git a/models/res_partner.py b/models/res_partner.py index 85a556b47988c4ff08107e4b35eaa8872f6d132f..d8a31aac4c24f12095157566351089d7fafeb388 100644 --- a/models/res_partner.py +++ b/models/res_partner.py @@ -297,13 +297,27 @@ class ScopPartner(models.Model): revision_type = fields.Selection( [('1y', "Annuelle"), ('5y', 'Quinquennale'), - ('5ys', "Quinquennale séquencée")], + ('5ys', "Quinquennale séquencée (annuel)"), + ('5ys23', "Quinquennale séquencée (2 ans et 3 ans)")], string='Périodicité de la révision') - revision_next_date = fields.Date("Prochain exercice révisable") + revision_next_date = fields.Date("Prochain exercice révisable (old)") revision_format_id = fields.Many2one( 'scop.revision.format', string='Format de révision', on_delete='restrict') + revision_tarif = fields.Integer("Tarif de vente", + related='revision_format_id.tarif', + store=False) + + revision_next_exercice = fields.Integer("Prochain exercice révisable", + compute='_compute_revision_next_exercice', + inverse='_inverse_revision_next_exercice', + store=True) + + revision_next_year = fields.Integer("Année prochaine révision", + compute='_compute_revision_next_year', + inverse='_inverse_revision_next_year', + store=True) revision_ids = fields.One2many( comodel_name='scop.revision', @@ -851,6 +865,57 @@ class ScopPartner(models.Model): else: partner.is_administrative = False + + @api.depends('revision_next_exercice') + def _compute_revision_next_year(self): + for partner in self: + partner.revision_next_year = partner.revision_next_exercice + 1 + + def _inverse_revision_next_year(self): + for expense in self: + return + + @api.depends('revision_type', 'revision_ids', 'revision_ids.revision_result_year', 'first_closeout') + @api.multi + def _compute_revision_next_exercice(self): + for partner in self: + # Si aucune périodicité de défini, on n'insiste pas + if (partner.revision_type == False): + return + # On commence par regarder si l'on a des révisions + last_rev = partner.revision_ids.sorted(key=lambda r: r.revision_result_year, reverse=True) + + if (len(last_rev) > 0): + # On a déjà révisé un exercice + # Cas d'une révision annuelle + if (partner.revision_type == '1y'): + partner.revision_next_exercice = last_rev[0].revision_result_year + 1 + # Cas d'une révision quinquénnale + if (partner.revision_type == '5y'): + partner.revision_next_exercice = last_rev[0].revision_result_year + 5 + # Cas d'une révision quinquénnale séquencée (annuelle) + if (partner.revision_type == '5ys'): + partner.revision_next_exercice = last_rev[0].revision_result_year + 1 + # Cas d'une révision quinquénnale séquencée (2 et 3) + if (partner.revision_type == '5ys23'): + # On doit regarder l'écart avec la révision précédente + if(len(last_rev)>1): + # On a une réunion précédente, il faut regarder l'écart entre les deux + ex1 = last_rev[0].revision_result_year + ex2 = last_rev[1].revision_result_year + # le prochain exercie est donc 5 moins la durée de la précédente révision + partner.revision_next_exercice = last_rev[0].revision_result_year + (5 - (ex1-ex2)) + else: + # Pas de révision précédente + partner.revision_next_exercice = last_rev[0].revision_result_year + 2 + else: + # On n'a pas révisé d'exercice alors il faut révise le 1er exercice + partner.revision_next_exercice = partner.first_closeout.year + + def _inverse_revision_next_exercice(self): + for expense in self: + return + # ------------------------------------------------------ # Button Action # ------------------------------------------------------ diff --git a/models/scop_revision.py b/models/scop_revision.py index 42578c14670f4dd53891b6e4be98611406ad2e06..b4682de507033f9458eb5992369eadc8bbf8e3f5 100644 --- a/models/scop_revision.py +++ b/models/scop_revision.py @@ -35,6 +35,8 @@ class ScopRevision(models.Model): ('demeure', 'Mise en demeure')], string='Suivi après révision') note = fields.Text("Commentaire") + facture = fields.Text("Facture", track_visibility='onchange') + facture_reglee = fields.Boolean("Réglée", track_visibility='onchange') class ScopRevisionFormat(models.Model): @@ -52,3 +54,4 @@ class ScopRevisionFormat(models.Model): index=True, on_delete='restrict', default=_default_ur) + tarif = fields.Integer("Tarif de vente") diff --git a/views/res_partner.xml b/views/res_partner.xml index 1d0dd4e67d0d228f4639579f90ddcf388f559e76..da5f2912de85ecccfd2fc2f7a1c03cc133044fe6 100644 --- a/views/res_partner.xml +++ b/views/res_partner.xml @@ -591,8 +591,8 @@ </field> </page> <page name='scop_revision' string="Révisions" attrs="{'invisible': ['|', ('is_cooperative', '!=', True), ('project_status', '!=', '6_suivi')]}"> - <group string="Informations de révision"> - <group> + <group col="3"> + <group string="Contrat de révision"> <field name="revision_contract"/> <field name="revision_company_id" options="{'no_create': True}"/> <field name="revision_backup_company_id" options="{'no_create': True}"/> @@ -600,19 +600,27 @@ <field name="revision_certified_person_id" options="{'no_open': True, 'no_create': True}"/> <field name="revision_person_assign_date"/> </group> - <group> - <field name="revision_type"/> - <field name="revision_next_date"/> - <field name="revision_format_id" options="{'no_open': True, 'no_create': True}" domain="[('ur_id', '=', ur_id)]"/> + + <group string="Caractéristiques de la révision"> + <field name="revision_format_id" options="{'no_open': True, 'no_create': True}" domain="[('ur_id', '=', ur_id)]" attrs="{'required': [('revision_contract','!=', False)]}"/> + <field name="revision_tarif" widget="monetary"/> + <field name="revision_type" attrs="{'required': [('revision_contract','!=', False)]}" /> </group> + + <group string="Prochaine révision"> + <field name="revision_next_exercice" attrs="{'required': [('revision_contract','!=', False)]}"/> + <field name="revision_next_year" attrs="{'required': [('revision_contract','!=', False)]}"/> + </group> + </group> <field name="revision_ids" widget="one2many"> <tree string="Révisions" editable="top"> - <field name="date"/> - <field name="delegate_id" options="{'no_open': True, 'no_create': True}" /> - <field name="revision_result_year"/> - <field name="revision_format_id" options="{'no_open': True, 'no_create': True}"/> - <field name="revision_followup"/> + <field name="date" required="1"/> + <field name="delegate_id" required="1" options="{'no_open': True, 'no_create': True}" /> + <field name="revision_result_year" required="1"/> + <field name="revision_followup" required="1"/> + <field name="facture" /> + <field name="facture_reglee" widget="boolean_toggle"/> <field name="note"/> </tree> </field> diff --git a/views/scop_config_lists_views.xml b/views/scop_config_lists_views.xml index 45633dae805b9033c92cd82fc0e2d6846a335166..57233a608deb97416d546723c94062cbb33d5b78 100644 --- a/views/scop_config_lists_views.xml +++ b/views/scop_config_lists_views.xml @@ -68,6 +68,7 @@ <field name="arch" type="xml"> <tree string="Revision Formats" editable="top"> <field name="name"/> + <field name="tarif" widget="monetary"/> <field name="ur_id" options="{'no_open': True, 'no_create': True}"/> </tree> </field>