diff --git a/__manifest__.py b/__manifest__.py index 09e96df5398bb489d9cb21320540f9bbce31175a..5a7ef5bdb873a7de2bba9d177e8370afe9b2e76c 100755 --- a/__manifest__.py +++ b/__manifest__.py @@ -15,7 +15,9 @@ "data": [ "security/security_rules.xml", "security/ir.model.access.csv", + "datas/cron.xml", "datas/mail_data.xml", + "datas/mail_reminder_data.xml", "datas/ir_sequence_data.xml", "wizard/scop_cotisation_cg_regul_wizard.xml", "report/report_scop_bordereau.xml", diff --git a/datas/cron.xml b/datas/cron.xml new file mode 100644 index 0000000000000000000000000000000000000000..0074f350bed8ca46182ffde2b00515acbd12c732 --- /dev/null +++ b/datas/cron.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright 2021 Le Filament (<https://www.le-filament.com>) + License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). --> +<odoo> + <data noupdate="1"> + <record id="ir_cron_rappels_cotisations" model="ir.cron"> + <field name="name">CG Scop - Envois des rappels d'échéance de cotisations</field> + <field name="active" eval="False"/> + <field name="interval_number">1</field> + <field name="interval_type">days</field> + <field name="numbercall">-1</field> + <field name="nextcall">2021-12-01 12:30:00</field> + <field name="model_id" ref="model_scop_bordereau"/> + <field name="state">code</field> + <field name="code">model.send_reminder_cotiz()</field> + </record> + </data> +</odoo> diff --git a/datas/mail_reminder_data.xml b/datas/mail_reminder_data.xml new file mode 100644 index 0000000000000000000000000000000000000000..99d6c9c86c5892bd1eead7383f3f6621bb9c1733 --- /dev/null +++ b/datas/mail_reminder_data.xml @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + <data noupdate="0"> + + <!-- Template and notification section --> + + <record id="email_template_reminder_cotisation_cg" model="mail.template"> + <field name="name">Cotisation CG SCOP : Rappel date d’échéance de l’appel</field> + <field name="model_id" ref="cgscop_cotisation_cg.model_scop_bordereau"/> + <field name="email_from">${object.env.user.email_formatted |safe}</field> + <field name="partner_to">${object.get_recipients()}</field> + <field name="subject">Cotisation CG SCOP ${object.year}: Rappel date d’échéance de l’appel</field> + <field name="body_html" type="html"> + <div style="margin: 0px; padding: 0px;"> + <p style="margin: 0px; padding: 0px; font-size: 13px;"> + <p>Cher(e) Adhérent(e),</p> + + <p>Comme vous avez probablement pu le constater, notre mouvement a engagé depuis début janvier 2021 un vaste programme de digitalisation, incluant notamment les appels de cotisations.</p> + + <p>Nous souhaitons vous préciser et attirer votre attention sur quelques évolutions : + <ul> + <li> + Les modalités d’appels de vos cotisations ont été modifiées; vous ne recevez dorénavant <strong>qu’un seul appel cotisation annuel</strong> sur lequel figure votre <strong>échéancier de paiements trimestriels</strong>; en conséquence, lorsque vos règlements sont prévus par chèque ou virement vous ne recevez plus de bordereau trimestriel comme pour les années antérieures. + </li> + <li> + A terme, votre appel de cotisation sera disponible sur votre espace adhérent (https://extranet.scop.coop). + </li> + </ul> + </p> + <p> + Ce mail vise donc à vous sensibiliser à ce changement de mode de fonctionnement et à vous rappeler, si besoin, les échéances à venir : + <ul> + % for line in object.get_bordereau_move_line(): + <span style="margin-left:5px">${line.date_maturity}</span> + % endfor + </ul> + </p> + + <p> + Nous vous remercions de la prise en compte de ce changement de mode opératoire et par avance du prochain règlement et le cas échéant à cette occasion, de la régularisation des paiements précédents. + </p> + + <p>Restant à votre disposition pour toute information complémentaire.</p> + + <p>Bien coopérativement</p> + + <p>Direction administrative et exploitation</p> + <p>CG Scop</p> + </p> + </div> + </field> + <field name="lang">${object.partner_id.lang}</field> + <field name="user_signature" eval="False"/> + <field name="auto_delete" eval="False"/> + </record> + + </data> +</odoo> diff --git a/models/scop_bordereau_cg.py b/models/scop_bordereau_cg.py index 66ac9d91d22f6e7f954a1f78ba21a6a3f4bcdfc0..3006643d26905c31ab14b90b98d109998a396903 100644 --- a/models/scop_bordereau_cg.py +++ b/models/scop_bordereau_cg.py @@ -1,5 +1,6 @@ # © 2021 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from datetime import timedelta from odoo import fields, models, api, registry from odoo.exceptions import UserError @@ -590,3 +591,36 @@ class Bordereau(models.Model): bordereau.env.cr.commit() except Exception as e: _logger.exception(str(e)) + + # ------------------------------------------------------ + # Reminder cron + # ------------------------------------------------------ + @api.model + def send_reminder_cotiz(self, _logger=None): + today = fields.Date.today() + reminder_date = today + timedelta(days=7) + acc_move_line_ids = self.env['account.move.line'].search([ + ('account_id.reconcile', '=', True), + ('date_maturity', '=', reminder_date), + ]) + if acc_move_line_ids: + partner_ids = acc_move_line_ids.mapped('partner_id') + bordereau_ids = self.env['scop.bordereau'].search([ + ('year', '=', reminder_date.year), + ('partner_id', 'in', partner_ids.ids), + ('state', '=', 'validated'), + ], limit=10) + for bordereau in bordereau_ids: + template = \ + self.env.ref('cgscop_cotisation_cg.' + 'email_template_reminder_cotisation_cg') + lang = self.env.user.lang + if template: + template.with_context(lang=lang).\ + send_mail(bordereau.id, force_send=True) + else: + _logger.warning( + "Aucun modèle d'e-mail n'a été trouvé pour " + "envoyer les rappels") + else: + return False