From 58d42ed3382d662e3ecc9d18a4c5a9cac900d5c5 Mon Sep 17 00:00:00 2001 From: jordan <jordan@le-filament.com> Date: Mon, 21 Feb 2022 17:48:49 +0100 Subject: [PATCH] [add] send mail when validate bordereau in mass --- models/scop_bordereau_cg.py | 88 ++++++++++++------- models/scop_cotisation_cg.py | 15 ++++ views/scop_bordereau_cg.xml | 2 +- wizard/scop_bordereau_validate_confirm.py | 26 +++++- .../scop_bordereau_validate_confirm_view.xml | 3 + 5 files changed, 97 insertions(+), 37 deletions(-) diff --git a/models/scop_bordereau_cg.py b/models/scop_bordereau_cg.py index 09771a5..331d265 100644 --- a/models/scop_bordereau_cg.py +++ b/models/scop_bordereau_cg.py @@ -3,9 +3,6 @@ from odoo import fields, models, api from odoo.exceptions import UserError -import logging - -_logger = logging.getLogger(__name__) class Bordereau(models.Model): @@ -381,18 +378,45 @@ class Bordereau(models.Model): else: inv.action_invoice_open() - def validate_bordereau(self): + def button_validate_bordereau(self): + """ + Appelle la fonction de validation du bordereau + """ + self.ensure_one() + return self.validate_bordereau() + + def validate_bordereau(self, **values_mail): """ - Affecte le nom du bordereau avec la séquence et valide les invoices + - Affecte le nom du bordereau avec la séquence + - Valide les invoices + - Envoie un mail """ self.ensure_one() + # Numéro de séquence if self.name == 'Brouillon': self.name = self.env['ir.sequence'].next_by_code('scop.bordereau') + # Validation des invoices self.validate_cotiz_cg() + # Envoi du mail + if values_mail: + model_id = self.env['ir.model'].search([ + ('model', '=', self._name) + ]).id + mail_template = self.env['mail.template'].create({ + 'model_id': model_id, + 'email_from': values_mail.get('email_from'), + 'subject': values_mail.get('subject'), + 'body_html': values_mail.get('body_html'), + }) + mail_template.send_mail( + self.id, + email_values={ + 'recipient_ids': [(6, 0, self.recipient_ids.ids)]} + ) return self.id @api.multi - def validate_bordereau_multi(self): + def validate_bordereau_multi(self, **values): """ Utilise job queue pour valider les bordereaux """ @@ -402,7 +426,7 @@ class Bordereau(models.Model): for bordereau in self: bordereau.with_context( job_batch=batch - ).with_delay().validate_bordereau() + ).with_delay().validate_bordereau(**values) batch.enqueue() @api.multi @@ -414,34 +438,32 @@ class Bordereau(models.Model): @api.multi def action_send_email(self): + self.ensure_one() template_id = self.env.ref( 'cgscop_cotisation_cg.email_template_cotisation_cg') - for bordereau in self: - # lm_publish_action = self._context.get('lm_publish_action', - # False) - ir_model_data = self.env['ir.model.data'] - try: - compose_form_id = ir_model_data.get_object_reference( - 'mail', 'email_compose_message_wizard_form')[1] - except ValueError: - compose_form_id = False - ctx = { - 'default_model': 'scop.bordereau', - 'default_res_id': bordereau.id, - 'default_use_template': True, - 'default_template_id': template_id.id, - 'default_composition_mode': 'comment', - } - return { - 'type': 'ir.actions.act_window', - 'view_type': 'form', - 'view_mode': 'form', - 'res_model': 'mail.compose.message', - 'views': [(compose_form_id, 'form')], - 'view_id': compose_form_id, - 'target': 'new', - 'context': ctx, - } + ir_model_data = self.env['ir.model.data'] + try: + compose_form_id = ir_model_data.get_object_reference( + 'mail', 'email_compose_message_wizard_form')[1] + except ValueError: + compose_form_id = False + ctx = { + 'default_model': 'scop.bordereau', + 'default_res_id': self.id, + 'default_use_template': True, + 'default_template_id': template_id.id, + 'default_composition_mode': 'comment', + } + return { + 'type': 'ir.actions.act_window', + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'mail.compose.message', + 'views': [(compose_form_id, 'form')], + 'view_id': compose_form_id, + 'target': 'new', + 'context': ctx, + } def update_bordereau_with_liasse(self): """ diff --git a/models/scop_cotisation_cg.py b/models/scop_cotisation_cg.py index 6ffd9f7..0ffa531 100644 --- a/models/scop_cotisation_cg.py +++ b/models/scop_cotisation_cg.py @@ -180,6 +180,9 @@ class ScopCotisation(models.Model): # Button functions # ------------------------------------------------------ def cotiz_generate(self): + """ + Open wizard to generate cotisations for renew members + """ if not self.env.user.company_id.is_contribution_cg: raise exceptions.UserError( "La cotisation CG Scop n'est pas configurée.") @@ -254,6 +257,9 @@ class ScopCotisation(models.Model): batch.enqueue() def cotiz_generate_wizard(self): + """ + Open wizard to generate cotisations for new members + """ if not self.trimester_1 or not self.trimester_2 or not self.trimester_3 or not self.trimester_4: raise exceptions.UserError( "Les trimestres doivent être configurés pour lancer les cotisations.") @@ -280,6 +286,9 @@ class ScopCotisation(models.Model): } def cotiz_view(self): + """ + Button to open view for Appels de cotisations + """ tree_id = self.env.ref( 'cgscop_cotisation.invoice_tree_scop_inherited').id form_id = self.env.ref( @@ -309,6 +318,9 @@ class ScopCotisation(models.Model): } def bordereaux_view(self): + """ + Button to open view for Bordereaux + """ return { 'name': "Bordereaux de cotisation " + str(self.year), 'type': 'ir.actions.act_window', @@ -356,6 +368,9 @@ class ScopCotisation(models.Model): return bordereau.id def bordereau_validate(self): + """ + Open wizard to validate all bordereaux from "base de cotisation" + """ bordereau_to_validate = self.bordereau_ids.filtered( lambda b: b.state == 'new' ) diff --git a/views/scop_bordereau_cg.xml b/views/scop_bordereau_cg.xml index 2b3bc49..53c34d8 100644 --- a/views/scop_bordereau_cg.xml +++ b/views/scop_bordereau_cg.xml @@ -12,7 +12,7 @@ <form create="false" string="Bordereaux"> <header> <field name="state" widget="statusbar" clickable="False" readonly="True"/> - <button name="validate_bordereau" class="oe_highlight" string="Valider le bordereau" type="object" + <button name="button_validate_bordereau" class="oe_highlight" string="Valider le bordereau" type="object" states="new" confirm="Confirmer la validation du bordereau ?"/> <button name="print_bordereau" string="Imprimer" type="object" states="validated,paid"/> <button name="action_send_email" string="Envoyer par mail" type="object" states="validated"/> diff --git a/wizard/scop_bordereau_validate_confirm.py b/wizard/scop_bordereau_validate_confirm.py index b210912..fdfb64b 100644 --- a/wizard/scop_bordereau_validate_confirm.py +++ b/wizard/scop_bordereau_validate_confirm.py @@ -1,7 +1,7 @@ # © 2021 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) -from odoo import models, api, _ +from odoo import models, api, fields, _ from odoo.exceptions import UserError @@ -9,10 +9,25 @@ class ScopBordereauValidate(models.TransientModel): """ This wizard will validate all the selected bordereaux """ - _name = "scop.bordereau.validate" _description = "Valider les bordereaux sélectionnés" + @api.model + def default_get(self, fields): + res = super(ScopBordereauValidate, self).default_get(fields) + template_id = self.env.ref( + 'cgscop_cotisation_cg.email_template_cotisation_cg') + res.update({ + 'email_from': template_id.email_from, + 'subject': template_id.subject, + 'body_html': template_id.body_html, + }) + return res + + email_from = fields.Char('De:', translate=True, sanitize=False) + subject = fields.Char('Objet:', translate=True, sanitize=False) + body_html = fields.Html('Corps du mail:', translate=True, sanitize=False) + @api.multi def bordereau_validate(self): context = dict(self._context or {}) @@ -26,6 +41,11 @@ class ScopBordereauValidate(models.TransientModel): raise UserError(_("Impossible de valider un bordereau qui " "n'est pas à l'état de brouillon")) else: - bordereau_ids.validate_bordereau_multi() + values = { + 'email_from': self.email_from, + 'subject': self.subject, + 'body_html': self.body_html, + } + bordereau_ids.validate_bordereau_multi(**values) return {'type': 'ir.actions.act_window_close'} diff --git a/wizard/scop_bordereau_validate_confirm_view.xml b/wizard/scop_bordereau_validate_confirm_view.xml index bd4fa85..04e7a80 100644 --- a/wizard/scop_bordereau_validate_confirm_view.xml +++ b/wizard/scop_bordereau_validate_confirm_view.xml @@ -10,6 +10,9 @@ <field name="model">scop.bordereau.validate</field> <field name="arch" type="xml"> <form string="Valider les bordereaux"> + <field name="subject"/> + <field name="body_html"/> + <hr/> <p class="oe_grey"> Une fois les bordereaux validés, vous ne pourrez plus les remettre en brouillon ! </p> -- GitLab