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