From c84ab407d78b33f85a90f586c57e323871a84733 Mon Sep 17 00:00:00 2001 From: benjamin <benjamin@le-filament.com> Date: Mon, 3 Oct 2022 14:57:43 +0200 Subject: [PATCH] [add] emails for SDD --- __manifest__.py | 1 + datas/mail_data.xml | 39 +++++++++++++++++ models/account_payment_order.py | 75 ++++++++++++++++++++++++++++++++- views/account_payment_order.xml | 46 ++++++++++++++++++++ 4 files changed, 159 insertions(+), 2 deletions(-) create mode 100644 datas/mail_data.xml diff --git a/__manifest__.py b/__manifest__.py index 709413b..5828f6d 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -20,6 +20,7 @@ ], "data": [ "security/ir.model.access.csv", + "datas/mail_data.xml", "views/account_banking_mandate.xml", "views/account_move.xml", "views/account_payment_order.xml", diff --git a/datas/mail_data.xml b/datas/mail_data.xml new file mode 100644 index 0000000..700419b --- /dev/null +++ b/datas/mail_data.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8" ?> +<odoo> + <data> + <!-- Email d'avis de prélèvement --> + <record id="email_template_payment_order" model="mail.template"> + <field name="name">CG SCOP : Prélèvements</field> + <field + name="model_id" + ref="account_payment_order.model_account_payment_order" + /> + <field + name="email_from" + >"Confédération Générale des Scop et Scic" <administratif.cg@scop.coop></field> + <field + name="reply_to" + >"Confédération Générale des Scop et Scic" <administratif.cg@scop.coop></field> + <field name="partner_to">${object.get_recipients()}</field> + <field name="subject">CG SCOP : Avis de prélèvement</field> + <field name="body_html" type="html"> + <div style="margin: 0px; padding: 0px;"> + <p style="margin: 0px; padding: 0px; font-size: 13px;"> + <p>Chère Coopératrice, Cher Coopérateur,</p> + <p> </p> + <p + >Un prélèvement d'un montant de ${format_amount(object.get_email_values().get("total"), object.company_currency_id)} va être effectué en date du ${object.get_email_values().get("date").strftime('%d/%m/%Y')}.</p> + <p> </p> + <p + >Nous vous prions d'agréer, Chère Coopératrice, Cher Coopérateur, nos sentiments les meilleurs.</p> + <p> </p> + <p>L'équipe de la CGScop</p> + </p> + </div> + </field> + <field name="lang">fr_FR</field> + <field name="auto_delete" eval="False" /> + </record> + + </data> +</odoo> diff --git a/models/account_payment_order.py b/models/account_payment_order.py index 5ba2fdc..725ba32 100644 --- a/models/account_payment_order.py +++ b/models/account_payment_order.py @@ -1,8 +1,8 @@ # Copyright 2020 Le Filament # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import fields, models -from odoo.exceptions import ValidationError +from odoo import _, fields, models +from odoo.exceptions import UserError, ValidationError class AccountPaymentOrder(models.Model): @@ -20,6 +20,9 @@ class AccountPaymentOrder(models.Model): mandate_validity = fields.Boolean( "Mandats valides", compute="_compute_mandate_validity" ) + email_sent = fields.Boolean("Email envoyé aux coopératives", default=False) + email_datetime = fields.Datetime("Date email envoyé aux coopératives") + email_count = fields.Integer(string="Nombre de mails", compute="_compute_emails") # ------------------------------------------------------ # Compute fields @@ -52,6 +55,14 @@ class AccountPaymentOrder(models.Model): else: o.mandate_validity = True + # Emails + def _compute_emails(self): + for r in self: + email_ids = self.env["mail.mail"].search( + [("mail_message_id", "in", r.message_ids.ids)] + ) + r.email_count = len(email_ids) + # ------------------------------------------------------ # Button function # ------------------------------------------------------ @@ -107,6 +118,36 @@ class AccountPaymentOrder(models.Model): "domain": [["id", "in", mandate_ids.ids]], } + def action_send_email(self): + self.ensure_one() + try: + template = self.env.ref("cgscop_cotisation.email_template_payment_order") + except Exception: + raise UserError( + _( + "Aucun modèle d'e-mail n'a été trouvé pour envoyer un " + "e-mail à la DIRECCTE" + ) + ) + # Get partners + partner_ids = self.payment_line_ids.mapped("partner_id") + for partner in partner_ids: + template.with_context(partner_id=partner.id).send_mail( + self.id, + ) + self.email_sent = True + self.email_datetime = fields.Datetime.now() + + def action_show_emails(self): + return { + "name": "Etat des mails envoyés", + "type": "ir.actions.act_window", + "view_mode": "tree", + "views": [(False, "tree"), (False, "form")], + "res_model": "mail.mail", + "domain": [("mail_message_id", "in", self.message_ids.ids)], + } + # ------------------------------------------------------ # Common function # ------------------------------------------------------ @@ -130,6 +171,36 @@ class AccountPaymentOrder(models.Model): else: return True + # Email + def get_email_values(self): + self.ensure_one() + partner_id = self.env["res.partner"].browse(self.env.context.get("partner_id")) + partner_line_ids = self.payment_line_ids.filtered( + lambda l: l.partner_id == partner_id + ) + return { + "total": sum(partner_line_ids.mapped("amount_currency")), + "date": partner_line_ids.mapped("date")[0], + } + + def get_recipients(self): + recipients = ",".join(map(lambda x: str(x), self._get_recipient().ids)) + return recipients + + def _get_recipient(self): + partner_id = self.env["res.partner"].browse(self.env.context.get("partner_id")) + if partner_id: + tag_cotiz_id = self.env.company.tag_cotiz_id + child_ids = partner_id.child_ids.filtered( + lambda child: (tag_cotiz_id in child.category_id) and child.email + ) + if partner_id.email: + recipient_ids = partner_id + child_ids + else: + recipient_ids = child_ids + + return recipient_ids + # ------------------------------------------------------ # Override Parent # ------------------------------------------------------ diff --git a/views/account_payment_order.xml b/views/account_payment_order.xml index e608570..ea3afd9 100644 --- a/views/account_payment_order.xml +++ b/views/account_payment_order.xml @@ -13,6 +13,26 @@ /> <field name="priority">100</field> <field name="arch" type="xml"> + <!-- Header and buttons --> + <xpath expr="//button[@name='action_cancel']" position="after"> + <button + name="action_send_email" + type="object" + string="Envoyer un email aux coopératives" + class="btn-info" + groups="cgscop_partner.group_cg_administrative" + attrs="{'invisible': ['|', ('state', 'not in', ('generated', 'uploaded')), ('email_sent', '=', True)]}" + confirm="Valider l'envoi des emails ?" + /> + <button + name="action_send_email" + type="object" + string="Renvoyer un email aux coopératives" + groups="cgscop_partner.group_cg_administrative" + attrs="{'invisible': ['|', ('state', 'not in', ('generated', 'uploaded')), ('email_sent', '!=', True)]}" + confirm="Valider l'envoi des emails ?" + /> + </xpath> <xpath expr="//button[@name='action_cancel']" position="attributes"> <attribute name="groups" @@ -32,6 +52,32 @@ name="confirm" >Confirmer l'annulation de l'ordre de prélèvement ?</attribute> </xpath> + + <!-- Sheet --> + <!-- Button box --> + <xpath expr="//div[@name='button_box']" position="inside"> + <button + class="oe_stat_button" + name="action_show_emails" + type="object" + icon="fa-envelope-o" + > + <field string="Emails" name="email_count" widget="statinfo" /> + </button> + </xpath> + <!-- Alert --> + <xpath expr="//div[hasclass('oe_title')]" position="before"> + <field name="email_sent" invisible="1" /> + <div + class="alert alert-warning" + role="alert" + attrs="{'invisible': [('email_sent', '!=', True)]}" + > + Un email a été envoyé aux coopératives le + <field name="email_datetime" readonly="1" /> + </div> + </xpath> + <!-- Sheet Buttons --> <xpath expr="//field[@name='bank_line_count']" position="after"> <field name="payment_line_amount" /> <field name="bank_line_amount" /> -- GitLab