From 1c2ec720c322f09fe867d47bffa0847ee387f942 Mon Sep 17 00:00:00 2001 From: brendaf Date: Fri, 19 Apr 2024 16:20:58 +0200 Subject: [PATCH 01/26] Donation new features: Certificate, Thanks Letter, Summary --- donation_certificate/__init__.py | 4 + donation_certificate/__manifest__.py | 27 +++ .../data/donation_sequence.xml | 12 + donation_certificate/data/mail_template.xml | 44 ++++ .../data/py3o_certificate_template.xml | 28 +++ donation_certificate/models/__init__.py | 4 + donation_certificate/models/donation.py | 70 ++++++ .../models/donation_tax_receipt.py | 90 +++++++ donation_certificate/models/py3o_report.py | 18 ++ donation_certificate/models/py3o_template.py | 34 +++ .../report/PDA34_Certificat_de_donacions.odt | Bin 0 -> 31258 bytes .../PDA34_Certificat_de_donacions_CAT.odt | Bin 0 -> 31258 bytes .../PDA34_Certificat_de_donacions_EN.odt | Bin 0 -> 30396 bytes .../PDA34_Certificat_de_donacions_ES.odt | Bin 0 -> 31870 bytes .../PDA34_Certificat_de_donacions_FR.odt | Bin 0 -> 29531 bytes .../security/ir.model.access.csv | 7 + .../static/description/icon.png | Bin 0 -> 19258 bytes .../views/donation_certificate_send_views.xml | 67 +++++ .../views/donation_send_cert_button.xml | 51 ++++ .../views/py3o_certificate_report.xml | 61 +++++ .../views/tax_receipt_donation.xml | 25 ++ donation_certificate/wizard/__init__.py | 3 + .../wizard/donation_certificate_send.py | 164 +++++++++++++ .../wizard/tax_receipt_annual_create.py | 18 ++ .../wizard/tax_receipt_annual_create_view.xml | 17 ++ .../wizard/tax_receipt_print.py | 46 ++++ .../wizard/tax_receipt_print_view.xml | 40 +++ donation_letter/__init__.py | 4 + donation_letter/__manifest__.py | 20 ++ donation_letter/data/mail_template.xml | 49 ++++ donation_letter/models/__init__.py | 1 + donation_letter/models/donation.py | 72 ++++++ donation_letter/security/ir.model.access.csv | 3 + donation_letter/static/description/icon.png | Bin 0 -> 19258 bytes .../views/donation_letter_send_views.xml | 67 +++++ .../views/donation_send_button.xml | 35 +++ donation_letter/wizard/__init__.py | 1 + .../wizard/donation_letter_send.py | 133 ++++++++++ donation_summary/__init__.py | 4 + donation_summary/__manifest__.py | 21 ++ donation_summary/data/mail_template.xml | 45 ++++ donation_summary/models/__init__.py | 2 + donation_summary/models/donation.py | 9 + donation_summary/models/donation_summary.py | 229 ++++++++++++++++++ donation_summary/report/donation_summary.xml | 13 + .../report/donation_summary_templates.xml | 81 +++++++ donation_summary/security/ir.model.access.csv | 4 + donation_summary/static/description/icon.png | Bin 0 -> 19258 bytes .../views/donation_summary_send_views.xml | 68 ++++++ .../views/donation_summary_views.xml | 114 +++++++++ donation_summary/wizard/__init__.py | 1 + .../wizard/donation_summary_send.py | 211 ++++++++++++++++ 52 files changed, 2017 insertions(+) create mode 100644 donation_certificate/__init__.py create mode 100644 donation_certificate/__manifest__.py create mode 100644 donation_certificate/data/donation_sequence.xml create mode 100644 donation_certificate/data/mail_template.xml create mode 100644 donation_certificate/data/py3o_certificate_template.xml create mode 100644 donation_certificate/models/__init__.py create mode 100644 donation_certificate/models/donation.py create mode 100644 donation_certificate/models/donation_tax_receipt.py create mode 100644 donation_certificate/models/py3o_report.py create mode 100644 donation_certificate/models/py3o_template.py create mode 100644 donation_certificate/report/PDA34_Certificat_de_donacions.odt create mode 100644 donation_certificate/report/PDA34_Certificat_de_donacions_CAT.odt create mode 100644 donation_certificate/report/PDA34_Certificat_de_donacions_EN.odt create mode 100644 donation_certificate/report/PDA34_Certificat_de_donacions_ES.odt create mode 100644 donation_certificate/report/PDA34_Certificat_de_donacions_FR.odt create mode 100644 donation_certificate/security/ir.model.access.csv create mode 100644 donation_certificate/static/description/icon.png create mode 100644 donation_certificate/views/donation_certificate_send_views.xml create mode 100644 donation_certificate/views/donation_send_cert_button.xml create mode 100644 donation_certificate/views/py3o_certificate_report.xml create mode 100644 donation_certificate/views/tax_receipt_donation.xml create mode 100644 donation_certificate/wizard/__init__.py create mode 100644 donation_certificate/wizard/donation_certificate_send.py create mode 100644 donation_certificate/wizard/tax_receipt_annual_create.py create mode 100644 donation_certificate/wizard/tax_receipt_annual_create_view.xml create mode 100644 donation_certificate/wizard/tax_receipt_print.py create mode 100644 donation_certificate/wizard/tax_receipt_print_view.xml create mode 100644 donation_letter/__init__.py create mode 100644 donation_letter/__manifest__.py create mode 100644 donation_letter/data/mail_template.xml create mode 100644 donation_letter/models/__init__.py create mode 100644 donation_letter/models/donation.py create mode 100644 donation_letter/security/ir.model.access.csv create mode 100644 donation_letter/static/description/icon.png create mode 100644 donation_letter/views/donation_letter_send_views.xml create mode 100644 donation_letter/views/donation_send_button.xml create mode 100644 donation_letter/wizard/__init__.py create mode 100644 donation_letter/wizard/donation_letter_send.py create mode 100644 donation_summary/__init__.py create mode 100644 donation_summary/__manifest__.py create mode 100644 donation_summary/data/mail_template.xml create mode 100644 donation_summary/models/__init__.py create mode 100644 donation_summary/models/donation.py create mode 100644 donation_summary/models/donation_summary.py create mode 100644 donation_summary/report/donation_summary.xml create mode 100644 donation_summary/report/donation_summary_templates.xml create mode 100644 donation_summary/security/ir.model.access.csv create mode 100644 donation_summary/static/description/icon.png create mode 100644 donation_summary/views/donation_summary_send_views.xml create mode 100644 donation_summary/views/donation_summary_views.xml create mode 100644 donation_summary/wizard/__init__.py create mode 100644 donation_summary/wizard/donation_summary_send.py diff --git a/donation_certificate/__init__.py b/donation_certificate/__init__.py new file mode 100644 index 000000000..082fa1746 --- /dev/null +++ b/donation_certificate/__init__.py @@ -0,0 +1,4 @@ +# Copyright +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import models +from . import wizard diff --git a/donation_certificate/__manifest__.py b/donation_certificate/__manifest__.py new file mode 100644 index 000000000..c2b69ca99 --- /dev/null +++ b/donation_certificate/__manifest__.py @@ -0,0 +1,27 @@ +# Copyright +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Donation Certificate", + "summary": "Donation Certificate", + "version": "16.0.1.0.0", + "category": "Custom", + "website": "https://www.qubiq.es", + "author": "Brenda Fernández Alayo", + "license": "AGPL-3", + "application": True, + "installable": True, + "depends": ['report_py3o', 'donation', 'donation_base', 'mail'], + "data": [ + "security/ir.model.access.csv", + "data/mail_template.xml", + "data/donation_sequence.xml", + 'data/py3o_certificate_template.xml', + 'views/donation_certificate_send_views.xml', + 'views/tax_receipt_donation.xml', + 'views/donation_send_cert_button.xml', + 'views/py3o_certificate_report.xml', + 'wizard/tax_receipt_annual_create_view.xml', + 'wizard/tax_receipt_print_view.xml' + ], +} diff --git a/donation_certificate/data/donation_sequence.xml b/donation_certificate/data/donation_sequence.xml new file mode 100644 index 000000000..2b76b9590 --- /dev/null +++ b/donation_certificate/data/donation_sequence.xml @@ -0,0 +1,12 @@ + + + + + Donation + donation.donation + DON-%(range_year)s- + 4 + + + + \ No newline at end of file diff --git a/donation_certificate/data/mail_template.xml b/donation_certificate/data/mail_template.xml new file mode 100644 index 000000000..43ac78c09 --- /dev/null +++ b/donation_certificate/data/mail_template.xml @@ -0,0 +1,44 @@ + + + + + + Donation: Certificate + + + {{ object.company_id.email }} + {{ object.partner_id.email }} + Donation Certificate + Donation Certificate + +
+

+ Dear + Donor name, +
+
+ We want to express our sincere gratitude for your generous donation of + $ 143,750.00 + to our organization. This contribution is a testament to your commitment and trust in our work. +
+
+ With this collaboration you help us move forward with our mission. We sincerely appreciate your support. +
+
+ Cordially, +
+
+ + -- +
+ Association name +
+

+
+
+ + {{ object.partner_id.lang }} + Donation Certificate +
+
+
diff --git a/donation_certificate/data/py3o_certificate_template.xml b/donation_certificate/data/py3o_certificate_template.xml new file mode 100644 index 000000000..b257f0cb4 --- /dev/null +++ b/donation_certificate/data/py3o_certificate_template.xml @@ -0,0 +1,28 @@ + + + + + Donation Certificate ES + odt + report/PDA34_Certificat_de_donacions_ES.odt + + + + Donation Certificate CAT + odt + report/PDA34_Certificat_de_donacions_CAT.odt + + + + Donation Certificate FR + odt + report/PDA34_Certificat_de_donacions_FR.odt + + + + Donation Certificate EN + odt + report/PDA34_Certificat_de_donacions_EN.odt + + + diff --git a/donation_certificate/models/__init__.py b/donation_certificate/models/__init__.py new file mode 100644 index 000000000..bf2ad5dc1 --- /dev/null +++ b/donation_certificate/models/__init__.py @@ -0,0 +1,4 @@ +from . import py3o_report +from . import py3o_template +from . import donation +from . import donation_tax_receipt diff --git a/donation_certificate/models/donation.py b/donation_certificate/models/donation.py new file mode 100644 index 000000000..db341dac5 --- /dev/null +++ b/donation_certificate/models/donation.py @@ -0,0 +1,70 @@ +from odoo import _, fields, models +from odoo.exceptions import ValidationError +from odoo.tools import get_lang + + +class Donation(models.Model): + _inherit = "donation.donation" + + is_certificate_send = fields.Boolean( + help="This field automatically becomes active when " + "the thanks letter has been send.", + ) + attachment_ids = fields.One2many( + 'ir.attachment', + 'res_id', + domain=[('res_model', '=', 'donation.donation')], + string='Attachments' + ) + + def action_send_certificate(self): + self.ensure_one() + if not self.tax_receipt_id and self.tax_receipt_option == 'annual': + raise ValidationError(_("Annual receipt has not been generated yet.")) + self.write({"is_certificate_send": True}) + template = self.env.ref(self._get_mail_template(), raise_if_not_found=False) + lang = False + if template: + lang = template._render_lang(self.ids)[self.id] + if not lang: + lang = get_lang(self.env).code + compose_form = self.env.ref('donation_certificate.donation_certificate_send_wizard_form', raise_if_not_found=False) + ctx = dict( + default_model='donation.tax.receipt', + default_res_id=self.tax_receipt_id.id, + default_res_model='donation.tax.receipt', + default_use_template=bool(template), + default_template_id=template and template.id or False, + default_composition_mode='comment', + mark_invoice_as_sent=True, + default_email_layout_xmlid="mail.mail_notification_layout_with_responsible_signature", + force_email=True, + active_ids=self.tax_receipt_id.ids, + ) + report_action = { + 'name': _('Send Certificate'), + 'type': 'ir.actions.act_window', + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'donation.certificate.send', + 'views': [(compose_form.id, 'form')], + 'view_id': compose_form.id, + 'target': 'new', + 'context': ctx, + } + return report_action + + def action_print_tax_receipt(self): + """ Print the certificate and mark it as sent, so that we can see more + easily the next step of the workflow + """ + self.filtered(lambda r: not r.is_certificate_send).write({'is_certificate_send': True}) + return self.env.ref('donation_certificate.donation_certificate_report_py3o').report_action(self) + + def _get_mail_template(self): + """ + :return: the correct mail template based on the current move type + """ + return ( + 'donation_certificate.email_template_donation_certificate' + ) diff --git a/donation_certificate/models/donation_tax_receipt.py b/donation_certificate/models/donation_tax_receipt.py new file mode 100644 index 000000000..bb0fe87f9 --- /dev/null +++ b/donation_certificate/models/donation_tax_receipt.py @@ -0,0 +1,90 @@ +from odoo import _, fields, models, api +from odoo.tools import get_lang + + +class DonationTaxReceipt(models.Model): + _inherit = "donation.tax.receipt" + + is_certificate_send = fields.Boolean( + help="This field automatically becomes active when " + "the thanks letter has been send.", + ) + attachment_ids = fields.One2many('ir.attachment', 'res_id', domain=[('res_model', '=', 'donation.tax.receipt')], string='Attachments') + amount_donation = fields.Monetary(tracking=True, compute="_compute_amounts") + amount_donation_in_kind_consu = fields.Monetary(tracking=True, compute="_compute_amounts") + amount_donation_in_kind_service = fields.Monetary(tracking=True, compute="_compute_amounts") + + @api.depends('donation_ids') + def _compute_amounts(self): + for rec in self: + amount_donation = 0 + amount_donation_in_kind_consu = 0 + amount_donation_in_kind_service = 0 + for donation in rec.donation_ids: + for line in donation.line_ids: + if line.product_id.detailed_type == 'donation': + amount_donation = amount_donation + line.amount + elif line.product_id.detailed_type == 'donation_in_kind_consu': + amount_donation_in_kind_consu = amount_donation_in_kind_consu + line.amount + else: + amount_donation_in_kind_service = amount_donation_in_kind_service + line.amount + rec.amount_donation = round(amount_donation, 2) + rec.amount_donation_in_kind_consu = round(amount_donation_in_kind_consu, 2) + rec.amount_donation_in_kind_service = round(amount_donation_in_kind_service, 2) + + def action_send_tax_receipt(self): + self.write({"is_certificate_send": True}) + template = self.env.ref(self._get_mail_template(), raise_if_not_found=False) + compose_form = self.env.ref('donation_certificate.donation_certificate_send_wizard_form', raise_if_not_found=False) + ctx = dict( + default_model='donation.tax.receipt', + default_res_model='donation.tax.receipt', + default_use_template=bool(template), + default_template_id=template and template.id or False, + default_composition_mode='comment', + mark_invoice_as_sent=True, + default_email_layout_xmlid="mail.mail_notification_layout_with_responsible_signature", + force_email=True, + active_ids=self.ids, + ) + report_action = { + 'name': _('Send Certificate'), + 'type': 'ir.actions.act_window', + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'donation.certificate.send', + 'views': [(compose_form.id, 'form')], + 'view_id': compose_form.id, + 'target': 'new', + 'context': ctx, + } + return report_action + + def get_ref_report_name(self, lang): + report_names = { + 'es_ES': "donation_certificate.donation_certificate_report_py3o_ES", + 'ca_ES': "donation_certificate.donation_certificate_report_py3o_CAT", + 'fr_FR': "donation_certificate.donation_certificate_report_py3o_FR", + 'en_GB': "donation_certificate.donation_certificate_report_py3o_EN" + } + + return report_names.get(lang, "donation_certificate.donation_certificate_report_py3o_EN") + + def action_print_tax_receipt(self): + """ Print the certificate and mark it as sent, so that we can see more + easily the next step of the workflow + """ + today = fields.Date.context_today(self) + self.write({"print_date": today}) + self.filtered(lambda inv: not inv.is_certificate_send).write({'is_certificate_send': True}) + lang = get_lang(self.env).code + report_action_py3o = self.get_ref_report_name(lang) + return self.env.ref(report_action_py3o).report_action(self) + + def _get_mail_template(self): + """ + :return: the correct mail template based on the current move type + """ + return ( + 'donation_certificate.email_template_donation_certificate' + ) diff --git a/donation_certificate/models/py3o_report.py b/donation_certificate/models/py3o_report.py new file mode 100644 index 000000000..5af5a5a40 --- /dev/null +++ b/donation_certificate/models/py3o_report.py @@ -0,0 +1,18 @@ +# Copyright 2013 XCG Consulting (http://odoo.consulting) +# Copyright 2016 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) +from odoo import models + + +class Py3oReport(models.TransientModel): + _inherit = "py3o.report" + + def _merge_results(self, reports_path): + self.ensure_one() + filetype = self.ir_actions_report_id.py3o_filetype + if not reports_path: + return False, False + if len(reports_path) == 1: + return reports_path[0], filetype + else: + return self._zip_results(reports_path), "zip" diff --git a/donation_certificate/models/py3o_template.py b/donation_certificate/models/py3o_template.py new file mode 100644 index 000000000..b94c0e01d --- /dev/null +++ b/donation_certificate/models/py3o_template.py @@ -0,0 +1,34 @@ +from odoo import fields, models, api +from base64 import b64encode +# import sys +import pkg_resources +# import os + + +class Py3oTemplate(models.Model): + _inherit = "py3o.template" + + py3o_template_fallback = fields.Char( + "Fallback", + size=128, + help=( + "If the user does not provide a template this will be used " + "it should be a relative path to root of YOUR module " + "or an absolute path on your server." + ), + ) + + @api.model_create_multi + def create(self, vals_list): + module = "donation_certificate" + vals = vals_list[0] + if vals['py3o_template_fallback']: + flbk_filename = pkg_resources.resource_filename( + "odoo.addons.%s" % module, vals['py3o_template_fallback'] + ) + with open(flbk_filename, "rb") as tmpl: + tmpl_data = b64encode(tmpl.read()) + vals['py3o_template_data'] = tmpl_data + # if not rec.py3o_template_data: + # rec.py3o_template_data = False + return super().create([vals]) diff --git a/donation_certificate/report/PDA34_Certificat_de_donacions.odt b/donation_certificate/report/PDA34_Certificat_de_donacions.odt new file mode 100644 index 0000000000000000000000000000000000000000..a8f19eb27cccab875cfa9c89080eb7033365a475 GIT binary patch literal 31258 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 literal 0 HcmV?d00001 diff --git a/donation_certificate/report/PDA34_Certificat_de_donacions_CAT.odt b/donation_certificate/report/PDA34_Certificat_de_donacions_CAT.odt new file mode 100644 index 0000000000000000000000000000000000000000..a8f19eb27cccab875cfa9c89080eb7033365a475 GIT binary patch literal 31258 zcmbTd1B|Cl(>FRZJI0Rf*|BHGwr%S_wr$(CZQHiJW82o*`}y*IIp4{1?&O?KI;pFZ zUsrW^RduDhE;-2`peR53@fStjw&89Nlb<^lfb|%?$J% z&1|gcoUILMZS)jy5)y0DXJ9|92G5e?jRR7#LX^{hh?--;h}U1!-$z>ty>^R;PdA_}}FG2lDT7 z{x@#_tj<>7+Q{->xZ(d7Db1|(O^h7q1k4<*^lcsf1^nNbIymY(IywBiu>Wm|#+Ekv zjz<5sq5thDZ0&7K?2R1$Z~P!3A^)RCf7kWD8|+`oO5fVd*vP?=*51%~Dq+exfF2?6 znk&d?dX{48g2zgmQGJGwFBQXgkDqQ10G ziOGP1WL(U&>6D72gSM?`gJXTQnF>E0_tre1D2KA$#hQ{`H#vxg71na5A)nke{hmv< zlc;Zr%}xwQzUcy!x7g#xJA7r)8aYV_$i`>W zc`#rgpnxAhK>y1I{@eEb#|(`e^=VzLETaA`yT| zS{`>^IiTV|m^iEr;6x+#*3Oy-hnj~RD&A-Vj=i*?jZ3u2IaJh-aX6EWnZzBwC;Pj7 zASpt%HM8t*Tz!BI#7QN>r)ILh7p#Enk@{WX!3$4x@~sV8^uGJ%l~QZ<(OuT!{BIk} zPhn;i?+jqR`QO46A2*6%vIU$U>xm)1W2|Eb^rmdaxXH(p6EnC15RQkM38WVQlc9+u zYqiNuZG3P87^*wfx+H9H(MD0f1Cc}HD^~>t90YDzXeNGVLPyBJ-7~aN*(&R(P>AG;&z{)zqtEOhhR-p;Z3!hNYf!(Pp@C^-543m zXQ@3)Fikb)csR8Z&M7xkHdwM%18363&8gWHG1ixUU?8=oIK%M^ENiTv7;;h4ZT7mJ zJV4XPVFt8=(8&OIK5i_1|2=UC$c2TUkCT5jpz&Wd;2#5WFmiM>vo>+~M+=%XtsK_b z5Wc*7@&}$1V-M`177l__W@kzLfbG-HS@r2e(ADq6?4iEDoQ(t(wvBKsHRsSmeWG$IK3 z`+O$ThM>lR14BMUkvlMEJa{rl?Ow zl+)G3e2Vai;q z_S6UlN;lqPShlC#luY&>3TH?br!>7?6MD&>QoswwifJ+(K@wLK*?j{;$&Ke%ab^DU z=?!;xmUw#>>%vB#?3HpLWfde&XjzOdr_z6DWl2`q7+DkFNRc(;0=pC?sV+4Nb2b{ET{6pxGamc%U^f$)GHBZEpG*@V z!z^W_r|3+MpC~5;Y@u1EJR?4Op>spyr>+KOQtxsTZ{IlL7dX?#JHh(r3aHyp#l_|X zl=@-cAhiAm;@iU>?(SN>K}5zioMCqJ*q__eO1d~n!mK62{H0w-18~6H3z*Yqz{OQmhGwAKSdoOO z<@=cZmV4YAx!{yKO7$n+?~i%$sV6<+a}NB?1Km}p4NWgw4#OB+6bKL38aX2%opy4> ztqIcF)h7p@<`WJ6hEt&gG30P|^|FqLl&S#@F^CJmPyyMMkfcBv_07850NoRE1%Bm9 zKs z9e*tNd&3_BBX6M+wh6XR4boxgV3M*IkwWkfr60PfjdM@?Or@;zRgoK06Sm~^k46Fo z#Q(A_t>m~X5a|`8DGgKY8UimPfqntn=Kqj<47?rh2eS^7WYb-2954jJi$#NLHWzZY zJwWX#y4%pr%1NPW^AEF^nFS`~0+m+frr6MjB9S0!2{`pJCJ5Q6Dv`LWj}H#v9S`sm zauUPtDrEk>+u_AA99fi13MvWvXDCcNK3>qR1O#4aK!3>@^pLiWbi{aAG624G?P|bs z`m?)m_--wpWunuT)5q|)Q9tvrR~Zg)KZTY2gof2@Vd{%%6yC#QAYhr}Mv-9wahv12 zd{1wq2^=a>DU&MZ>+nXe+T};bJirXJ1ssM8$##f1g`P z=v@qiCRaLok>Ht%6jOmgExE(~S=LiX@yNw0VaLq8&QmAb?XQM=mSz9J#y{*UdHE$m z5roD91hE-}dTG=&L@$R$baFRf5VU(AkE?(FnC*jgM*WyV_OK-+L4_+kS94=bR=o2~ z(|*&9;EcR2CndXz`ANwA2)|;YT6&mthtYuiI1yj+kp7_zjeH=+(t#AGT{UKnjInnO z@v0ccm0-StsB7n%;^N6vtaKOM6?2@<5p~`mi+`T3k&g)pVl2$0ag~uWJ4Bhs>15*i ztcHjws~!Gxm@=hIVk!%kq`xJn@X{4{vs=LXya=~5AFo<;H=qDHu5e%xY%{}&8S<*9 zMEW&TgQ&szeO;eKlK)JUb2CLVv#*M!*Ve%O>4*>pEI=&*O1{8N2A~an{w`{<<7);OWP^10Qp%mvjV@o=Yw)Mqq za5aR#j4RyS19eJ@nL`ua6S>q#Lq@kCdm%j4NSi}DpC>mv^&1P_3!N2O3&_`2m5D_2 zEE}CHFsSi(tW*6x_u1ayceMhieQk|!X-O%gRnMs5d`%*wRf$`?K~kKxBnnmT#1uGD z&8*|RC`(Th+fj8u3$108&W1DHWMz_TcMqzLC#6E-Xx)~`AejLz#zdgz<5-zD4vNxR4jwg zATKDt(c;Wa<4UjU77_uGdHszOY-SGxdKr_@P`B~}^34Nxp5^ohyc7Z6D`jSofoXg~kYcIwQYvfD~ zo4(&i#V$|{85vD=09Y8XM(BA{2&{Rt49!VnVGXD$i|I82DkJV&hJSi}1}Lils_h`V zz;~s_(1J+9M`g86vOPeZ)OR8|YMW#BaIZhuc+y%NaIU>FcP=R=bqjiR6?6x<>D+`i zdnEJr_YC(|hp(@h1U#dOkiMIRNO-ubITJC?{_L@}$y`@!;s;Acrw+^Zw#(N;Zz`@< z_SdhOe;RSFO;J)i^*J|Mnp`THIxLB^iM%X!jk`LZFGtU34LIw+>Dexa;RE(#X!exJ zbA-C#L?NT(%6AaoWo~94)gZ1m9r2l??$=xx7?J_*u0itz8MG70jB(2-!r0rmV(S+s zjQ%K*PMA_PX;^jwW1O&zX}-OUyDR$@r=Z$!u*oR`;b@@chDX#Yw1e~ETGzQ02|`e^ zvI2nmoCeBUa5qB}|3(Ix$&d^`W}FU9tKDve)Lx;{KsN@KeaJTYGDg@ae35#RTsINE>0=6ymOzwOABG0unD@|Nc6|**LWtMl z3ZgeeA~yLewo* zX=yF5c_Hdo6U(~cDzTJeaKtI8Z59m*;hAR23(Qdr7!-zAy=f*o$+IYuR*(ic^mMP4 z#3sn20S0$>t3L3D&B!Dln!f!`;mbE;!XE)J359_I9orv;QsKy{>8aQBa4^uSY3cOx ze0g~N4idvU3ebeV@zQYWFFr+*4ME2IS9llM8-jv?cpdkuOq>2FpAOgDsS0m@(~rJ4 z2Qp~;in0&nE*qsFM3U6?i=of81#+}3X|a1>3_ILMBmSGWW{B2F?E?oVV8RAk1^9dPNS zz>U%{DM<&k!;6Anq6>zovA{ChTCI^BIA#b2I%at7I}}i_;375?QHCSs3H6B#+9yO` zv>Z@5LMct0;42W!M~PPF4}e!loN8~qNZC%nx*)?NRuF7WIH=3buF1%on|S9Z!@3nB zSSHwnD79+4y=!%%k8V7%zNB%i$eK)a8SNlrV|IRSx@BqiL7LJiBL&LEEDsN8JKPNg zk_%K$46k1`(WCNDMXbsy*>>|z#&rWS-Foi@CZXhGXr{g{l>`uHmsw$X{HiGPJb8TK zxk`DSQ2H#6kvv)z0*g?PMmnJcd1@XKm6)Fc!w8+}PH_C$bXK)JTYMjDPX`TGD(yjB zXBdx~vE+Kv&Y@o#&hzRgE1@&yGpkkvB*NUgj02;JI|LJ#l^GmMi~k*Fy5nEk%I)x+OW?$6a{smcXMt<}bam`=}68i9zA z1{7hxc#@nN>rsvg1yGZ)N}{+qcp6*N-iFI%l3c%l98x~;b6{RcpxcQct92`IgLAEvKB45Z4e==o83mttbe^v z@Kv;f*bC4{-j+q^=yizrth&^JeC0KU?QkE%P|=R}IK^1DXshfNY`V!G(mKT3=wWW-)VV7;|uLxb^(%-<-UQ6GL0L`I!F|3vv^L_3e$9L=4^yLg&1-F@jUiwAIB4PeQL6ptKuP5vy-}?1zH_uj$WdT@8(? zivdFy&yRx_Nt2$MQkSf$O%JJ|8boD8F?VBB04ght4Yai*l^K=`*VGas>L`cPS+FhK z8B~VU8jKC5Xot%&EVe8wU;n|-q(?QiVpOCjYS5^cJyN7qXel-7iy`3*;1FuPo-=78 zD}xy~|7;{8*5^H^Ha4;F*lUXOKq*Ys-9E%O8d{xP*(FLnNjeJ!<9BunY9h-?GI(=N zK?u=F@a@*&TjOdFqxFlH-nTDyEeN{Kr$u|+%b(^@|J8=Nnm1lK39mh_%V0zS6-r`S zvze%X)9x{KZ~?JVZ*^Qn!oHON1Zun>a%(BDEb!X*W6g4R?#GbihiJU(>SGIJCKXT! znrdWyd=-BBWzofFKeOrCs|9aZ8*u$RGl|(Ct9xr~TmB?uO(dP@5dOKys!a;5zTZ_7rK~A;b^;_6;tsv%)idkk zNdyceJYP>&V@)ORH%Hk@I|6zd1G1XaGZE50%NEI)DB!smkhM zk~2*o@w(FdPiFnSxEUIAlxVvFDd=m-pa)&u7UTZKR%xs@G3{d2EamT; z?^oV-WxEgauQIfcZFe;urDcz4h3l8(=ZMxK!lTGN=>k}ioyH_B4~{0KYD>rN>jexs zI~^9D0qUK!q(67Z@WjX;VqLwp*NXf*AY8!OSV^$O;Fq!67}Pe_X%L~5EtuN0D`z5q zKF?}w&r$JMD)6|MZjURSrN}g?=&YG?W-ou5b-nFVV6hxJlt|m-e9!6}SDpSNU-cIH zj}3f|dXt6y-Y9NI$N9R+VF+n=jGI#IrYyLZKxq8TChC`*Uo(7Rkk*_(%h^*DVe6lM zrAjBE^4I)`vDw0N8o7z=3KzUyq`hP=cV?a13}F{k<-J;7@q5FE;XF)S&gj6Z=V{Aw z*WN#|=+bc^o3{Rgb>>Y#_Hi<;#gjCGu0k`ejcj$<=O>Jk-B*)Df#YGS?wpK!0|FH_ z4PdkQvoxwEhkro2Xwox4zOhA!qM*xLCS8SPf(7`ns85!da?V5LkBDx zz>>0uN7U;>H9#vqhmcGYp+IB^+^8F-TOj%renG)@fz5`q^1$8aU)p?9>;i_AIFX@^x@E#??)psikloTgotxeP90}2rjQ35oWf-KH)01xlsK%F+z(7WuYHTY z0kDUtDBhxHwugY!xi36<^j=WnkG;nj-S1P@O?Cfz!TsoXl6*F1gcWSe?m7~F5S$h% zheCN^O!x~C1!wtRPis)E{7+Vbw`az+;_>9&cu~$Bo3lkHDMi>nwG$&hVq<7>2XkrV z9-Sm)Z0WLH7&Rf`P1*4}DMRJvMLu}X0L3kxzgoo;k!J4^3B1f}9bQJI5ts$@S=A+L z8jieIh<6G5U;(+=I?Wi^(~bZsoPq4ed(^1Q{ASZ16W_q{;S_99IwA`W-{Ck4N)Bh7(a zAn$b&Zt#53J)Eh|*riKZ&nA1_EW!6h0XJ2$248{unqRS@SSv8HZ1zY6YSl^le~1GP zLNas|c*zfF4j?Xn{|+A@(s@L^6;0Nln1(o{POtzwBn~0TdPr(C%n$JQ{-J{!TdEy= zIwzz2mbCJjd8oIsz1h`fW##VdNv(u;G{?fr+x}`ZUUQb&_PF6WyfXilU-TKrQl{1J6#6My#xrRvxIM_)yMmxs)B~P|fOXDEWC8#@jRp{jO*(g^RvnS7X-xn79yL z%{HxUB3{OM>8u`7I~24})BdSrGYiK%Qgs|nUIekNaQu_L!yb`@(IVm`K=>jCYVFb8 zt8STH{POOue&TvqTKbpSF?jZnW||1PW-8)+$9m9m)J8SEaQ;VKvstp|n<>=5D0Yd5 z;s>8FXG8O8cebP?G5v-6suNfG&Td{4Imt3wB8BwigQH?+hqX1oV-EuOiMKp~yFnP2 zeyQs|P3D}GmPDsrdkb!*@hWmQPd@oCQ~DIAvaU*Qfw~lP>qHjTSR>-7<2_?ou192x zbk42u8AdXKx$EGT76fY6w+ULCL@`*kKcy`#Vq9~7pe%u)I#ma$y>076S7{7ytrw~g zn;#LXB->`)wUZ)t*VdAx}6i z>1SDZ)=U=k8SUOL|rT;TzVAwSCvrd|Ht zM6sup&`QeZ^@umz_vc}Myc%jBb$h&?`_%SO*O^G)v442*2tOH1Yq}PvRcOr0UiX{- z@aF3xbN$R1B=XcPapSiBUNm}EI@;^NZZM9$WNdTIiUN`e0&_p+hz1t8ec3$d#{mF4 zMZ;F6uhxE?&j^MjX{q$jNNK5N(Q*6tO7yahz^M$n|Iw0lF>+Z1Yv%9X>E$vBx~M{< z%>zHV;r8#IRCNRsvq&<1x7d4cGJCF=^M0VvSt9&GtskBI#lFbuqLKNI{{taYHpEN% z_0#Gnat_hTE$@aos*brTZZqUjnJ{zrS;RT6ACMm%(l`Wx_UM{ShoD}wU_A!2+m?C7 z+RrgAgNjMbg5N<5#{!de!6C_%1r($z{8#C{(?9W0WYUqaseH)wZAuRLUo`FE;|7%M z3xwB#nC^&4`Lr#sHuIf$+M_|B8*&HbUfINfdVOpd-m{Wt!&4pOLeTK+Q*Pl}d(U7# z0uM%(AXcz-2FcJ1W2lqYDi-Y+SB!ra zQF9%n2>N%f-}3!1EbESd)xl2tH8Ike16E#4YbVBc{>Zbdst$pgyaF~Ti*R0dz>ahA z-dke$Rr*E`J85_6YV6(^gVE8u0*tma`6a>0u4J?N848O(ak2HnRa+9f1FO?FY z{8U*a&onQd0#Df@lSqfn5uB?>nVBQw?f0s>o?mQA&9Ggj(1=|E#4t7u+5NG@#T;>- z34}*g5HLKh5zI)AENC?vRed9UMxWcn`ArBx0>_45sbRPaK`0a7oS708e!ERVTk8Xf zu6DLU+jv`=ZnF@qzKy0{lIkFtspc~g_DFKGpgCmo?OA8FoK>0lj4EnuYiNkI5GZhs z{XQ@GrFbT(C_^hz*TTJFIO13MDHmUP%$f72I*gP2ER!i!tSw>}IEbSXu^lCxri`m7 z^~Mtf*Q2YO2R|kl$ux2r6iywc1_&3U*N_@`^F=C`6BaAso?p;bB&Eq1g;||Y43c|E z80M6{!~|VhY*22GAG6QYM9N~+GaAM7x|(a zL8+P#o8>T{h<}KNSZLN-`Pfoe&iJuoShKqoE@~pL_3)}`5+`8dG>0ivBvvle+2M~# z5dxC42IYh2FYD>4<_zbFhzDf}HwE(+&>M4sra*^Cr7vZ}CZT2Pt~|iFV>@6o%Gx;E zh=uIpvX#{50?jFJ6J)#r+I&1;eRFoWA*^-r9I9%QW2OOVT_04TM#`x=B6sjfuj4WD z$D)}9l}SO+mUqWcnBvB7HinxG8c;6Q8xmjc16o(S+GDh82|kZes|PMqi)CI=038(l z`jk5MQpD>=kWtB};8k#o%T58NuxalNe4Ai4L`kMBH&V7eyZ5v{Mj18F86DxEqU6f~ zFxo0~d~d;~XT{v$E`8|9alBrWEE%$AJkqZ z7*uB=)8;y8?U%*kWUcNvRlb$@){*KQYVhKsb@zWMLWvk!Po;V$XU4JVE6Ex@6p1O z{-hRw`jnNx=9~>8K$7CYcTQNhNk5Z(8U}LJ%E+VPZ*#3}(aW=UG3X7cSZ6Uyh@sW` zAs9@2bUY9C#B>Da`9sSmq~A-rL{A9K?lF}>_o6*i;YPF7YTychF;K^-&_km#XVRY* zKL%7$Y5jQ>9chDj_ZjwBojPlOIklv%J37=dgUL-m8s_Mj|MZtmZdF|7#8IA(cIlwo!yA*je=nkb_7V9pPIz(%n3f*Lo1@dy7+q2qj~ zC2_RIgxRs?l_W559=BM5X59d9+6a4m>c3o>J}&%1rzo8vtVN4&3T7vWKcf>H-4YMN z#W+Z^lPC#CnFHbpP9gN<=Qkjzj3RqTZszK`M>4dwMuxDCIt#pid-3`uQv6g7sHaqM zqY~BldAx^8Wm7ncp+KMFAtWlUV5HqS0WFtZf4&ZV$0EN0B`De*O9Fmdt-t@XD|$5`{e;*6JSS!Oiu=8 z(^(-VA+!w~BK$hxnwKj|9iO~&i`N1wdm}8Gk;^1!lDjx}9jfz?jHb_?li!+fqDF=z z@RLvZbLM05G0?LQIAu+VNlRsIa|z>uf0aVQX$knOz6k%VeR+;Xo%a5Dgen| z-|MGkG5au54OIv3xbPu6%B^X&c<0=$GdX(fkzD4CyDP1rJZ~OX17e z=)!ZW{tdlLAjkL&?O&%zJ8jlA(S;S(X=&M?3kwArvYSon-1y=v8QFqshD!HPb@9^J zr#p5^_fs%Nouk3i`{^}&v0hZCm#s$@VBxGrg@^RjuaMqQRP%t+S5q%2s$XIlMRH}Y zY93Hj$d>(-tR|mo3cteRfnh0AqebClX=m2piP(ucFaANR0|3r%i?7ETZB_dBNI9S0j{wUAmQeq6D0Q zwI<|0VYD19R&yj9&|xIZDHpGTZb(-x z6|gg050c}a2_@39tk)8`@>W1kr|uHlf~S!n$7mjP52p@_wt{G0A4BG3g({Wo{5t*L%e>(m%zz*>Y{uer?l@MzlqIr^`+%-|gTz zKF$f!=tFEhFiW*uGV1g(Q!5Q6Omb7glq>(@^ZM>15el9S@ibEQ7DE+kgjMifbh=yO zlU(Wv?R*kem$>+AJE!|c_fh`J!b6|X!aH)a61u!hGE{T>Qi+B@>EZ2MI2g{QVrv8< zCqWq}VB3qh+0BHl86PKrUama^G2KCg7zjQWQeCJM(s4pXh!rPHR9~Ltuwx={v$Nw< z9>@N5$Fd&IdiP6}IsoL!PuW%%7WIeRZBpsB@ntaLI0QD?V1LH2vgq~21N^tkge%_P z8mG>bLy#+XY@P9w^8xNuxM9GLM~GWKF*jd~(|sldtp2-R8Aq$rUAI#71?!Z_8lF!= z+Y=LZN`a3K(<#Ud$9iI$)fKz-)U8Jk7t5Q{G45Nap`&G&+7FV>VU1#sE`zQoF-%Z` z0h8#LxLBO0(<{*V-Ime7gYAz)n{NVAP5U$jjDyo2PmT$U>7I2uG9zb(fk4~B-M96#2uX#56=IfbW{_P zYVns^4Ehz_3Hm0HC~$GXlp+aLr_P{zHuN71vzggkU2^6=bYhlT7NF5(e?io~h5KO7xOb6C=Lx$c({yWp-#vdbTpL+Q3Ns>Un=uz8;l-r$=pqvD09GJXLLE zD2tUH)(ZzL69ueUP-oQZ{8C{oH)O7lbInj;WUs&})1?x{YT6@gu4pFPp#uke<%eF6 zZwXp#diatl)mG_k4}tfYoH#jCe$?=UT1>xGddBKZK#a{Ok0%$vWimbpU{1qdg&h0_ zyAg~ulA2zF8+!Mui9UhFmG9CMgWz=@u;2n(TaeX*7I#;Ov@Gu8+I$H$bLUuyaV0>i}@XZ^0U3)$sJucH&ToRekPjVSIn|?)HUQMF4%0 z!fePRP(2r41n7v-61%?w|Mb$$3$oJgMn{L^0~Vtnf%#JtFGw&}onC!uU2*yAi$9#r zH`sJ1k9s$odbg$!lJ^s|dpvfN9w#}cdhQw0guG+7)nopVgB@3s@c@u1=9(oiT%qz| zf%4W-#(1A0yKDFMl5mOv48y8qJBsq9^Ns&cDrh}b24VhhDyV$!e^NpJ^Zy3d!^kR! z01(hW{hvC2B~vFWfVIAvr30Pg|B$q{)+S+cGNN$MSpO6c!HJ6rDF6Whn*#xX073pO zLV!6A23$3=$a#2@3%d6CDEzlNO%<4~3kA5*>;HpNfeD zos^7%f{KZfft`hll#z;=je&}tofC^*gp5U$f=7XgLxho6nU|lJO<0*%Mvqs~LgY8L zC>y017qcP{xdJb<7>~H50K19+jfx1Xx*QKcn%zu+M@&RaL{eEsPC`OnQ(00}QAR;i zK~hCoSx6cnreZ3l<)Erzq^9Mlt*pcqX@KPXslDeIOd3G=P2118M#K$1SiNu#;7%>ek;$jiqCPY zOtJ%JdG%LCB$q{%Hk8z-1KRvl-;+D%r;G2b}TIStZnz5okDzq!(HkZ zwE|X5BiF3r*X?39+|u^Ff|G-tOJY5b{Ct7}1A`+IV`5{%<1-Q>g45%|Qd3iXqjSUj zI)hV6LbDpvL)w!w3v*(-BlBA_^2?G++p`)v%F-i?;@Zmc(_8W*+e(v5OG}F@8>?!o z%j?@3t4ivsYuoC}n_HSA;-}K8rqgTp%F_p1+Lz1Q54wAMs(Pm?dY9S<##=^Ky60Bf zC(pNni-zknhFVI8x|-&@%a22Xcf)c{W24SelfMH4_u|X3DpR9h|ZJwN*9G%~vKc1gGy+58GKVCe%J)V7ief>3o@9*#84XPC& zAOaw9A$}#-^~){~EzOmz6KpaoOOrjeu=`eL1+tt34mcLjp*(MTJxI*-VqBp0d;zvc4>B8Ok|o3S+E7r9O~07K zlGOS%x8}b-9egY#cU1q7R!uP(fAVR1)Qs3zc|Fh1+gx^eTWkU=9f@D%LXw+@r$Y-% z%PZ!UQvClVDN&gJXNLdJWKe!_DaDy4Vb4q7^Y>-A;O_Qr%XUbN_f3GV=k>S}{wGn> z{nmH;?-w%OZolQUYaao5-Cw+J`z1YI_c?Ui_^ScH{&}# zZ(DGS(D;KCXBG!FU#L4R-%vfC`?E2-WH#NeRRIt^&l3SXY_2z)yquu;p65F)ykR{~ zH&eRb7d!k489vS@Q#PLn-u5R^K4j`XZYNVM-9P^F+j-ufuUsz2*!> z{W==y|NfY&`2zde_370tEDFW{D7#tV{kYk&@%Feujz8WGwDFSdwFtWPd7SCr{%}3= z@xJSU@8kVI_{zy4I`jFczPT67>2wJV{Cter|GvEi5v9TTpdbo_hxdMe5Ba(z3mF7I zNP!Su^q~q(A^h5U-hRQqc`gJd4E(+g>EU|$Z274_IobDI2mFc}{CQ!sTl0nc_4SSR z^$D^4ruky=k)7Lr?{i;M`nghieGKuMgTwK1c@NVC>;|K`f&aNV*|*&*dXvy2ou6H` zWb;AQ`Hau|wxv~-&Hj>eQ-%Naq$lvA)+zA~{C&fX^d!4YSi1d|l7la?v(#U4*We?# zsMcXerNi+O1MmG<<)eO5YV!3pWz%zO@lwLt{W&}W`Zxpsbx)_zl>Ysica8Tp_099J zoU!ePA2xL#v-R?%`;D;Wey{11(p&KTJlnGU!PDt-QYF|Up8vJkXXA6Ox7QNV?Qyfx z!|D3vV&jRu;iFIiPx4j6+U;?|Tc-Wl2NAd-+8Xs8jN?u0354%MfH&xqK>%zT35g#% zya9pl^ME)OR}aM7@0cn_fan_79C3rK6tEoPdj<*{m;TL-qg|s%1NQkUXQOW8wbwf9nEK4R zRO9AYzq^RLj;GssOOL;V6Ks;q2$cL*a~?R%BGB}=67<7nBX1=CmcL{e2D#`b{|`TN zkSG>W*e%r>A%0%1)B9w3pQRr8bf77=O0Nt~KMd zTcFIJax^JDgSPWKLcr)z{?t@WfSc6*11^M!>}w zDEHhi{?c>ptiR~rGdP!if5Y5leNuJ#Qz5((RyUrGpxwJ-;i;;kez&dj@tDct67~|TOXT1) zov*$68Jg_gmja7*-#y zd1>JGw`E0Fqso6A-~ZEX{V%UXm(j>)#p|Y8Hp=4vj{iJ0%&<~)1XwXb*UfqGs_q~5 zct@i*C#@&j!*Ll_g5JrbSKd2}vjrs-&Ft4<(f{RQ|7#k9_y*N(`Dqv+g9M}%D6JC( zSpbTlhGCKb-Nn#L3}Ufg0!VTAZRsC0+RHZtB2oo;9ro}DPf$Yf>ihAT0&#FG2~HWU zvMLe%bY+yt!p`?WvZ3>(yrJV-CcCDqsjy)&fHHz|kcLcNf->?1lvyM9vzv5F*QZKX z1|`eKP0!_fi^{$mDh3SQ#AeVRilPpb4$!G-L@UW~)r+tojgs8z+NW8cWDa4Un<1n4BHhe*9A zp{dhgFtm{}qau`$Yq$%~Y`R#Koa`6jhHPHj^n+%Z-|o+*^E2q;f_=E#4^X5DppT7h zVY{70!wwW1V#~omiEbJ!j+btT65`YC$23Fq(I)gav!apmKN-qI9n1VIq)4H&gdxsX zXo~f@g$LVC^iTrizVu5AUrvzhU0MECmK?hH(vpx$hAvN)RGZ6pcVmI;9&_2B25IJd zu`8K6lKPzbl${EuKUg)Eyxf>oLezC&9|U5Uaiv7PiX;RX7Wr{)9yy-3Kqi``~ce8R?EhY0i(k`YXYe^$iRA3?*bqHVTy}Zl% z75eEBb)t6JiAKFmiTul!!Si#@V*>7(d#6I9&Qfs&_uby{nf6qRlIyY8U=HGX8`S5u z_fFE~_7y&MZoDMfka|zoRj(`5olI%7CH#ARouo?hYH`z`{Ty+i-UxT*&zhgA_3LNQ z!ZWX$IRAvW-EF?(OF#eV{Q9>1(0fZX$NQeoBx zL~X%NKhDGMl$#9FymGhb`MleBrDlXlZ7c+AA>FH>B2=Q3+EWDLS;{+TTY=V*S3Yoj z_#uLJb0|33U%BhyscOkcu0f)w`#i3CWY+>$ml+PMI71}`*wgCeKrk@kozS)TW2>1E zAM=eP!kvQjXFDEu)60V(0$TT;F0@nV8+JQ9dRvMHcOA+ZA=Pu!ZuN-pVnv89c?GpS z;h8MDpz&GFL z*pGT@E5z@~aOKWWth;N?KBUFG4$W)*7A~zO%c0`g&6ft>H<%eN*X^%}h+9=4!3No_ zO-Gk?Bqay^viGY-PMZzzKr9cXztP{DGos+L`$yW*-zbbu_C0;m<+7y79nWwmB%;mZ zjr{N6as6Cp;qaDcX!qkl5z1p{Xhhd4ta)~R_al*Z8(=6rY2zQLUmnBA;4HDQbO${O zGirEx{ug5cB>kSE_ECGC2$V|X7g0HF&sXgr5zJI|v+%*eFCV3PmuR)}0WM`=1pG`m zW$hG)o%IO8VU>8o)#(}K8(;H0I3pYOr#rr|dg3F;pN-_1c1iK|3 zqDqvc#R{&vS3aUkFgIb)EuzY({z!~)O5_YOhd6R!s)Z!QlyS%-(YNsjL3I>Vph_qd z@=t)DfBG4ep~`7@ZDaH^VPKo~JcTX)h)^DI2G|K#As-a7^eoVgmPoiBDuvbC00|Tw2JNfm;cTiG95 zgubcGTjXvpyD+KqCN;s5i)#+Tj*5ro0%=O#ty3U80+-?@Zs?$PfrBf3!XP*qHjid+=TTGEmG59aSa?O=mOhEL0eLE_ZIQ?@pHP9Hiq~?9nZ*{ycT>Ifzjf z<}#o?|I9SECR_CKaM7jn7~;LfHG014DwC^U%LpgV;4bs!-n+$%|BwJ{U>~~aD&tD| z;S4{k@xS$<*j}@sdfC+2Mop+mb?CuWdw>?gnU%?b-=9?nz8bKvZ1DbRjL=MCwF~ur zO#PT1=nv7q$5_4LM&4nYLVYcRM(PQaognFV4-|-N*f-qz*FT!BrT+NH6Sg%Ag^*o@ zNs0-|D0oJBeCds8Ta(ABQFa3(Xwx#wM)fSX*RX(c^&rASc2DHYdP}E>Kar|L*O58$-7=X*Pz z7{lgehq`!4Gz((9PhLX$iHKgiy!X?4I?ZOgq|xo< zwy*^HFIa)YY~Q$U(mRkHQiPS^S((UV&h<7;p@pUal$#N-yR2SoBI8-!}1+yBum*Jbq`D*gEaJEib zG3?E97XLT?1Ig#b_P}l>&AXVxhK{#Toh<3Cp3GoPymLaIEIa=3J6^%@G67LS>rhli zcP=SffQ49njVY}o=4^@W>;Nr*6wXzW(4}&9Y`=z}nOyIv&cnC8=Katr)258*a~hO& zoTV^Np?4%;Pf5pnZ*NQ%@H94HCFutLlj?^3XGZ`k4AB_VZ>W{C3Zz-j zfQP4mOS%(&Z`+-}!Q(o5A5htK<7Xd0LA%NcTS63uJ!H9dY=emzb{PBH#I)^J*;Mq6$d+Yc{Xn zdPIaeKYn2i%n-3n5eBiMmMI7#>yzT#;3uj0KPRHph{{drLo6GhruFL{TGS4C%}=1@ zeKKt5sf4K3P_kxB1w&jU#}1M z&LxG%}lo8+=k<}9Jq zTilxrqwPk^P2;ts3R!G_5isD=#gnDm`(C&bd2Zog;#haMb4o;c!zInphIu znL6c&hvHnnXdBvdfH8ljU8N}Gn`}{Z!mbiWqQ)7)oP?}_=HK^u`kiX?Gt2K6*)dxWuQo6uhJdx7gk=}~ELn=s??G9be4%7&5I zZFZfC>-N>NKYo*=y^_T^YLXBGA7vtpuBg26CUPg!j>#gp_RAY*ty#JXyXWhH!l<)= zsi=1&0V*s%#ox**Zx9WCwgY7uRTEdjJ#;TD*9nh4H5biAJbd2=z%IZ2DnxF)tN2gtO2RPY9zKhiz{Er z!-1o^BjHzF7oj-uvSLNaz|19&&X669A<0zsg^f25EQ(%_Ei|-zGDlj`bGUv@{|Wf_V#5TfKl#30yVb-)w-s8Kpasq_2rZH7V5yMzp0mVG#F=-P-Vb;@Znv;ZZ-P%Q8tdH1EEctjLv zPKSeKvkBn7Ga>Fo(Q8p6VvEbC%C=2O24Z4t8wZF4yFSWfvhuX1PlU>jP@-e)G!#=S zU&MR0xqP9oM|OSS7G3Op{sj~jjfE2R{NLsPSCUSkR_f~J-Dn?YmmI$w?}DyZF|s@s zMw{_v*j!`LO;25!Atm25jeRwEc9IT84@WR>*jip*ON3lc98Zr|&6Bk2=+5et_E-1* zNRO@@5Zu5%d9Vp&8O-*6T`7Q!OZ_P!BU+HBED&{?$rLZ&V7*gA%bFI};FM=BiFCTG z{wU&5GRQvK;)-n`_9$H$@&rTJ12^1Smr$8hVeQQl05c>Z@ol)!H|@)O^dZC2s%q-w zC+mf6>EMsHVf@XE`XTbOt>0^)C%0IKXkX;xsM~>^UoKf@)UqE0qIzJ(-~DVoGVYMn ziOo;v_vTl7GgpKj9m}YmOzW5U9*;&B*=(i170}cTJ`Fp5Ehjbb-PCg?ef$lQ2&w!e zDsInLN2HF4qetn9gf`qd{bju_f;yJt#G*AUNE*{%?}6|1BP^<3`nu(-Nuwi|)+n#9 z8TZsxgHjp2E6u^&&S^}1C~;#3Y}0Fx7*;6<235i0P+ z#ZB{Q7-V_T{%+Z4k1wFDT(E)UOAk*gZr+U^i$(;)$eCJYXriG*(j*Y_wP?AH;ylu9%!>u0~+^9E)gtSwyPpUM}_*tr4fMR(Ox|k5uO3Z&`D#S+lkl|`-!o9v2BL4^{ zn;eHr1nTXH^C}c0lJFIZM6Jgp5?Vi)KbWDsl6!{7ScNxMvw{=ZzR>n$l{qd)~$pH=Spi&h20w!k))C zUr-BQK=e3P7jq9XG>5p*eO%6Sf#Vs%lvKGqg&M`sj zN-S!G|K_mjD5O6oLKR6*&Q;NV$3*{xD0_vqGwyP>egqZnCdzG~)nb=vp9^_e!LBX)5Ot3+Fg9VwL2}l*ukUT#<_AfheTcl+SI~0bMa%+64qFwtT zEu|0YI3BIN+1~WXEc#GiM+v`S-+o7FI7qDox)Gw*JW_onYu?81SL`ZDcOx&`eC2v9 zD)OBPtZ4Q*E#Go6L1$EH{D;rp@elrzmJV?@(0m)-m%>v(eb=kmC{ixUannPFx*yFf zq=i|Gffde2m5PdQ5n6p%!n;|eLyb-e%a|rDTW+&MYwOo+zf!zMsf?vBiZ& zB;pyKH_#Z?_N2|LsnH)2VZe#n7#fvh*;KvqqEY9eFT8CWi!St?zCpcy8*7e`CTH90 zMx0n0MOh_cZc8*xTxkysn)X`>jzS5J_$+kfBeQY}&9;lJtD2;72eXlvHFI&&uJD_F}Di^m^~6AdMv8qB!%F6TMR}-aF!WMU;eA2E zN87}6e0$+!*@d(MKpnyzigo(&YkGh%ut`=+ESUzvkZ+Jh%Y_>W*4J)zYo=N7l#CaU zLsB)3`TJsmbyV)kRfKZ7z;~JHmbm|P`>T36nxv`g>zr>gjz{>-!=*?lDsS%AXy>-d zp}z$IwTUIN64C4VCSbEuF|N=1STztm3@EaD$$A}~sAHI@;7z4MhJ9X&IEhViAl_&KhGS*qoD_JsiSs&F$ELMExAU zQWz;&3PBTRcC6mdcExufoR;6hf0t4U7$vkrSj@|Z$id@j3;cI^?8Z_3WOJ!TqWd!_AeYD^19|*M zBl;jtYK-}?@rEL=)ch`;)p4H6uQI@6<^SfJlvVFJgx6rI(c*PQFV`?H(Nvk>F?AoI z>=-Omm;CJA?FHw~-Wob4HNNHL;!Wv6VvQ7leffg*Ly}=E7-7(`sZ@>G#@?_GK>T&r zkTLD>g)TC7N;7Y;h;c3tJZ$GGV`m&*&v@j@$Mx=yZ^Ig{dyzWWQV|ReXw$Kzycw|u zz3xl9@$ldo77M%y=%!~7#2H^1@hk-N4;dSsYn}B}%sGin40^nI9Py~0;hWmnvN0}x zZ*n;_dZ*Gc`|K@fihHS7WU3plRp0I4{@7h)jEYYh1R@|cFR&?AYL%-`xHA9|O3+9u z5g7*%26xXiqrNewK`S%9@}%uEVUIOsM{a~x4%osj5)H2@_DXv4I8&DFr%Kn^gCcPq zQGcm!ABj!%e!V<#kb+XPvu898U$XlVH*8sEu~ZyV-7`o4bLpOm)bF3K`F2iVopmq- zu~9>qSr=0|`3r8q#gE_!osTsM0pRWx?}~3=4$9^e&?n9o&Da=5cr>}!@b7^LNrCU1 z&N_U)m=_lHF;bqX@+bLL8;>{L%tu^Dt3#4IR2>^&t{8#dy5|DyQ`N_+H;kS(@rgb; zTGFo|c z5g)j1OhTMhN%m;Q36~r^w>V0kG|Nbe1tm0H(TsTT{q+25suA7er0Dp$jzdxc zQRXw!PnoZJ1zb~@G>3?MGU#I)c58=7C}`C2q27Z!?R7?tAw;y)doCJHN!AsAv|Ani zOY-~iOxJXZ*QZsh4gSW+yDo4Jc&bs917U|)v(iTb?P5U!oh7U|4(vSSv5@)f+F5$ zS&Nd8s!z?6907Hgf21H;^;S-=@sMTEkmbs0h8PbsQ2eshy9X&8(U~~6soUU^9q!&h zfh6|rXMf%&?d$XOt113lZ{NCg8IZ)?R|fQI>5V!6f&I^nafa_39ll7uM@W6mt`Lj< zYMpiIS%Y0|rx~>Z!^Fi^ATx8sqBU)kpOx~>fZ>3qgkF)EN7Bsw`(Sx>(b#Q`B9%rG zD8W5lqg9#94l1hXSBbco!4ZUDCH`&N_xsaAP2HuiWm>Go7)!Mb$_V~cd0SrWguO`+ z2JuX-F`JnSEZhd8t-gwN3?ncrE?$R@Dt~|q-f(vVKY`)VhW$nE`};v$%#{|~4szhq zN`7TBa+p`{yX5C_E299bk{L8ANZ3|8e*t4ZSTB{DdTWOb**a-NryvwyG?J_n(vTU* z;5gX`hlMV%m*iR<+>DeksE`@3vCMmIHE1z%t5i2#e~3zb$CtZE(Zf!9TJ#LqSv1kG(5s<6!v*UsbAP6a9?2>Qw7_NP73 zb?(t}wZY9rf~mFopk!WpRHDDqE_zvAzU4!HAB>SWvc3YtC196nskB;uN>%vid}7CrTd3GtLV1<92O_KAH?;1DRiY*4&D#}WkYTPl<>Rh8pq;t8z! z!OuEkTvI^UFKGLuDF&g{*z>45fbdVbA8*{YhG&X4PsJq?`>oo}y zE+tF`z!_?{q*MV6jlk8ZYJ68Vd^P>I)8uTjore3y;BMf@XrRH`MYXJBI`V=YGm~%0 zlUk5lqpaMVRCfIz%4Cu_7WuPw+GLVudASnAvxcMG)CQZp$ab9qt=T!VMo$3aH?92n zi>Z(U$5D>b6>*P2KGRbeQ-hcJWuKlNM?cM|&xcI3UwqpN<>qUF)UO~kk^o>lr zMWUC-IPxLzZDbqiIQpT=qU2ii-iw_5-_;dT_DfSP)4ug6@$*-Y-C`c08EiR zMY0}3AVO^h3rY{Jozw?m6?7!*iE^=OH-XCmmK0CE14|tC6eWiM=GJ#p$lKieDI~5m zyFYSc>Ge0(9qIbmf8>WQWY$lfeUmKxE{9(I&D&IyZ&qS2d)Xvhlp!+rE=o0B77SxP zb5il4W5-JNX9`K9&l7EiXsHQR?S(fGfBqFV+p4^DT*;Ma1dwY$Lrv_Z;NEQKmA1~Fe+)ff_-0H z#R-{BgvEz;ovaa*oJ5J#$O<7jy8dDeEX1I4_q0#L2~a3ivpNX zx#p^OI`czQD#?K*Xu^@I%H>L(K4VBx5t^l8QX|T9vQK0ls0BN0>UlKQ9vAg?Qq|p_ z(sKy0d}-OHLx0`Lfymr=EDZN)^o-np zp^vKr5tTSV&?`6;pQ=)+&T+c8+$|PcsKX$*G@h@yfDfIuwORc7ya%72n__!Rc)0vC zUy>l$U^^!N65594;T)(S5*0%m&9{xv^#t|~UV?W6*1WL3RYP*bQM-Bh@-pJJdLR<6 zw&8@E@C#Z3u!$_xr=<${(kpfbCdXi=EYf%1yQT1b4A zXnyFFT@r(5t{2|{o*JbWW)e+8(GOMacyER+CN*V&BY&C)g2u7e3ipIX1~QXH5s9WM zD$_Q}e2t|(tmP`D;+1i%Jcp_B*LwA|zAJs7E((cBmWoMM#L=6z?OO{C^$ySKkPY5U zR%9oNt?CU`An2F*Yv;78`JXstYY%p)4c%qt7Y?%hCwTMgZ{_=#`y(p2NH1T=TSrf; z?2-d7*@@#}a$0ddY(?+2b~}yYGKxUqqs)4R{@#m7uh|B5>?w}|IuQE6`YqB)s3vwb zw7hG%L!r#|`Ah4|EM*W)>IM&O7`>uc;3 z#ya+l8pW?~sTWvpivAg`M4RTkJ@USF*8wq7MeYpz{hJt2}18g>u0D zj3E43=p2qW^_Fg5FB|ck4YSWTI#OT@h1X#cn-;Yj4mm;i77iV`2P3VBum|bl6`!H= zs+b?eHkuqeO%us9rC(ltc2ewVa@I>JkkId1#zV%SXB$ckJly0m1eb;`bmSG28C->= zKOe;Zbe)JvbmUh(`l3lxK^ltEm;9~dK1g^i z;F3OA?`xgj8oHgOXCAT88s_%}YFZ+?`pgqr1%;Hu27OMlbWzSwp%Zf2x=gc*4-X<< zmB;|N$wso0x1C%C@#kP%1erpIImh;GBhgvDzdhgNb|Sgmh1rKj^vEmY8bkOl?G2-< z06`UX%7nIarvOg$Mj{og=Nj#jP<(Nm>U9JJF#r?g66o7^JndF{7m_f8TOyHUSa|Zd z38nE)EPJ65;i+O@e0(LTaE@^c6Z#@^wJ!mN8v|F`_8AxjcE8G(1RwEH#S)7R$0U?8 zEin-k+|jX$8;O@=c6cB`Z@Ex>}Zgi#eT5fhNd4T9t$3Fb}@e)-b0>I^%ge z9XnhB7$RJEVAsvkZ|tg{QqN_5Q|N9HW4A|{ICsxhHY^GW)_=S)GdT8z*S7$6?UVW> zQ?4|wwRm!7AjBWraQoH3xN`VqzR`5kZ(YuqjdMp*gjUSO7&6Me7i0dYN_9wY)_#7a zGmjgToU*q>`{g+|;rM2lN7|Zultx)5x!JBT#1{{kDP^X(Sf6_&Ucyv>3&1r4Ue%VJ z#Ws}ljL^8!Qy?o_X6ez6WB2`gTe`DD2%KHNlgu=}|exiU9VKQ5~A!%e$M1OZD;4nE69j4MrW9_TLe!DPJ2bc#PNrIJ6Vn*WEj)5ZIzY11Of7f21PWyP9h!o{xi%%C z`%|e|sZm}+fUsK>K||_!5ZookjjEi!)O^3_O<23$P?kn_w|$Zl`bMTV$6HE~Zv9EP3`fDS-eS#ZA|XtE@~` z2%h+OX}Lgtk;O*Q0Q?LFaG6302tzGSJieA%SlW4vh_Y9*O(#1@_mYB>=e#GRUJR*{c8y4=1H& zdPc|Wu(%+<=gmS|r|ThyQ_7v@Pve^OAY5(C*cj@W4`cWQ$1_myqxk|mb`t+`9Q&{^ zYJIGm8=q!okJw;od?AFuPOD*uE?ae%*&rlwdG5akh=B)*%Y9rQbdIabz=L};$D+Tu zggLEQXZSS)SHf3YK_=3(QO(`)vC3i!pVQxf!JKPqn5e0muxV%r%Q77Zu+d?NjPolp zXbU)DdKCgpOLWJTHU-VCw9M_Y2uOVAn-N6DesJnYt$wqyPB z5zDlY)b6=WVCyFIW~DSX9vawehk%k0{9BP-Gs-Bk6yYqPah+MIQvo#&=2VDehlNt0s`S1r$U4 z{REc}P5TmwY4Q$PE+y-0KA*7~4Y54}310>+U94iJ-bGnCF6ZTaP1?6?RXLh74|{_L zn|I;x{Wx#aX`N%Zu@|Kubn;UjJSmsnZ8d!(tk|>Id#%+0ViE_*W17ae_W>LhL;0vNdb7+9n%_fpO zthTM3X_FPdQmAKL>a3MX$PC&-jkT7(z3n>`DbC`9rd~mDbD~hgS&XCuVJo1S9XGI3 zn>sZQAx)u4o5WNSo>2i^PHwr|ipE=LdJ{0P3#jLhGD2f#n>FHk1d(ki8@XJVKBe}f zfpb@0X$cTgyW~V@*J>!DbA{t?tF`wdW7{m6;>~G$EYMy>okZ=|%&nrH8IVMyaVb0q z*SIH)gs1gLN;mcl8DicDdw#$8%Mc9b zX`eg&SpsB_w`{7bwuje*J|G`1&h&H>qw`jQGVk+D6x%m@YGV7+><(0iiwza8D}oPY zw6XK;up?p!GM>iof{&(AHq4$OYvf`Y9$i`Nw`sQv7l_zgoxiw$B`nymK_#eMANYDs zIDmV6?u`Vj7|((p6o>j0bTWH_=Vvp+8A5(ivjI$ZxW0=zKP5126hD?%y{nD-*lS!L z8jQS0X6XHycatmH`1KxPXa+m{`A8=*4b+ zNg)+fA+rO)55A^@nAC?~FXR^#7kC^&YpACWhsIoI?p6Wz#KccxT9K?cE{9&r%lWC4 zg>wRSZ-5`i=;*|wFn0Wr12BR-P{eo*!l2+hP!!H#SO+#kICDgy?kLjEBDbZb@30U8 zUI%!8%O2!J7Vwd-V~KqHrQQ}6K2$!|2lEz!dtQGTSf4~$ z-zF_BL768=p<2b989iOqB+g!ouIb08@JNBDg=$pHPlRNNj%SsP!eFKL2RBjQexQr; zLE}c&1f=~ZQG(Woah}F~6-S^w9iMZtuG>4F zEI#OBS1-8qaTUpNEkK5dIQcolId5v}l^J!i;as`Y9>?w4MNFOWQ@mnoh}h{2mccjJ z*z;?6Q#9#l9ET4w<15{Czs{>D{>Gv<NRjv6@6B9`;vk8ZYtRLX=v?B`gK1kwwRT)n+|BvySp#{eii#RSjbBI5!7qv z=7o5|&KO20C+Xnn<3TD@?Jq%`vv?w}QJ-;L`6PB?@?l0g>NcFB_NPeZNDN$rMY~q{ z#!c)g%!SZx?5IC*`&QCg7xJ|Q(AZYrDP(4QDGH{XIx!D z;1_DT^aDZSwHqIk_xmnPcFXO zX0?t4-dJntR#*KNou>5Yro9)y1o(D5ul98^@GZo8k%P3aDuN#|P0~H?N##_K13kWSg0~e;j zKvYeVUewn{bA@TD1&69o2gSHV6Nbd3lWjGUj~n3{+HrA_im`o%2$wKWZv`hN=${N! z;|$_s0erz4$NVS@H?5Hakm}|6h-ym}@InIHYWuc^<`czoJ+#3Wt$fDp28UKH6%Hrr zc|MEoG0f=1S3eTop>(T;OT{N}Im6^o^wWu}>NiA7P`~YwuOT^LqG?H#XU!!g-wod3 zFUgMrI){Ct$yLud2;xvu~@*8R{j&=PcJ#Vgnpp!Ld4m;olSDvINo#CvHjVd z%cBEr$_ae%bx3Tzt-3@-StDktrU`QkE0;f}`T?(6D+P=xOj5c?%b+@x3 zoiwM2_w7!vKh>$CLFnzlsc^fJo99IkD-sa89jzGLOw5$99y>XHOB3QnA`OASQgRZe z5n3Y*mG2r?FRlK1yq;O@EDg5M&}W+Mi)rQ>9UmW|Y`pHq4RILJD_*#vMh7|lZUagh0C96_iDOnRV-C>J<57UJ-zs1uYGHuhS!0V-z z%B@Xc`k8ajc4umcD`a_y*;;kd?2(Xeha;NLOEPM9&+Zdo%nqmB>MZ0WS*F~ZVAXAA zoUxZIPJhy+$r@%}#n(|))D&{CR2vO!^3s_v6__hTDsUt-zdpIabHFhsLk~&^!d@iaK3w5QF%LTWWnX)9TvCDm;~=GnR?vu zX@KGk1A2*_FTK1DB4R2L^H-?!P0WVbUUtXLmlq)%weI~Hy;?Ut;aVi)E+%w5o-O{t z5*&O1p?bNTaUEw-&*0adfr5v7sv!b2X9lTX#tB}n&FA$w33jz~gI@2Zlhm(?|C~!j9-9t1{^6)LgGUOU-rQt{u`xjCe ztgzYPP}r#`^<**R8znt*tL!)yfi%+o!v0w(MpAI~{Xzjb$X>kNy{eF$HOg)>bHQXN zGAxpF(I~-h(t15~RMEa-luHMZVuIbYSSivxiQ6pUfhp3xSb=~qEVL|f+(h*WUl8%P zc_SV)o{CkFgMMuX|3KJpQViagQLuh}=o#<4i*w_XSKR2;#Sf<+%p@VtjPbu5h5sfS z|5Bvzf6W}`pYPnW*&upi2#?Pj;-O?D6vV4UjRO9is1W!0EO`kv5oQ?$N!I@oK0bqx zRwjtp^-^F+eB%r5Z+cUBQY`9N2Zmr5BIMqFq1c4(#^`TmZQ5E?$9TWXG7_7bwB)!ehFPX9mqbZSy+vxRJ(O`O!s33t&TZWcj zsKbxG*uwAXPxEtrblPQw8K$G2ahbnGZgpw|sZhU1Qn{)t;>#9g>ZY{zK?66}&XeoMq%ZpisakkEh?>1bz`gN*3AKd)w|*};2+Sfc#(O>}JR@;uD2%TCZF zf~x)I{o)hIs)c-Vk4&-jQN-K^hm*N=@HV>7rR)WJrsb%@)8pK?Pru+j(r=%bn4Vby zY2kjsdqBhBK>a&G>#s-iTmGbL{b#S=XZ!&R^835|bMxPMS^s|R-@Txqe$j#cmcZxc zKehawr}f`8{h~4bEuGKJe`@+GZ|lG7`2~0KTW+44|J3uF$MxT}{QYhipP#}%wfvRW z_22dUVs`y4rvF3F|Ht$C@5=suQ@Q^`*i^C-%>m_|KkyCCmIpiuzkZpHXX`d5Zs!BK4oW z{>q~D_v?kf_&crUKYRWaaQPQd&TlD3{VV6zKl}X^o#z)E^KWT1^lnmFrPo>&qgQ5_1Cxm2mO-PKmY&$ literal 0 HcmV?d00001 diff --git a/donation_certificate/report/PDA34_Certificat_de_donacions_EN.odt b/donation_certificate/report/PDA34_Certificat_de_donacions_EN.odt new file mode 100644 index 0000000000000000000000000000000000000000..90ae410291b29d04151d31d8ab8abff24d652dd0 GIT binary patch literal 30396 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 YH)ur}NT^@kP~SdgZ<~&Y^RJ`-0T&+u)Bpeg literal 0 HcmV?d00001 diff --git a/donation_certificate/report/PDA34_Certificat_de_donacions_ES.odt b/donation_certificate/report/PDA34_Certificat_de_donacions_ES.odt new file mode 100644 index 0000000000000000000000000000000000000000..2c99a2b1ae57e63a4c77185fee4745ff2612e6bb GIT binary patch literal 31870 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 literal 0 HcmV?d00001 diff --git a/donation_certificate/report/PDA34_Certificat_de_donacions_FR.odt b/donation_certificate/report/PDA34_Certificat_de_donacions_FR.odt new file mode 100644 index 0000000000000000000000000000000000000000..0710ff783a794df28c558bc23b80c554d7f1e13c GIT binary patch literal 29531 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 IcMZw>5Aqi&82|tP literal 0 HcmV?d00001 diff --git a/donation_certificate/views/donation_certificate_send_views.xml b/donation_certificate/views/donation_certificate_send_views.xml new file mode 100644 index 000000000..1070813b8 --- /dev/null +++ b/donation_certificate/views/donation_certificate_send_views.xml @@ -0,0 +1,67 @@ + + + + donation.certificate.send.form + donation.certificate.send + + +
+ + + + + +
+ + + +
+ Preview as a PDF +
+
+
+ + + +
+
+ +
+
+
+ + + +
+ + + + + + + + +
+
+
+ +
+
+
diff --git a/donation_certificate/views/donation_send_cert_button.xml b/donation_certificate/views/donation_send_cert_button.xml new file mode 100644 index 000000000..c67f1f933 --- /dev/null +++ b/donation_certificate/views/donation_send_cert_button.xml @@ -0,0 +1,51 @@ + + + + + donation.form.view.form.inherit + donation.donation + + + + + + + + + + + + + + Send Certificate + + + + code + + if records: + action = records.action_send_tax_receipt() + + + + + donation.donation.tree.inherited + donation.donation + + + + + + + + diff --git a/donation_certificate/views/py3o_certificate_report.xml b/donation_certificate/views/py3o_certificate_report.xml new file mode 100644 index 000000000..69948e3ea --- /dev/null +++ b/donation_certificate/views/py3o_certificate_report.xml @@ -0,0 +1,61 @@ + + + + + Donation Tax Receipt ES + donation.tax.receipt + py3o_donation_certificate_ES + py3o + pdf + + 'Fiscal_receipt-'+(object.number or '').replace('/','') + + + + + + Donation Tax Receipt CAT + donation.tax.receipt + py3o_donation_certificate_CAT + py3o + pdf + + 'Fiscal_receipt-'+(object.number or '').replace('/','') + + + + + Donation Tax Receipt FR + donation.tax.receipt + py3o_donation_certificate_FR + py3o + pdf + + 'Fiscal_receipt-'+(object.number or '').replace('/','') + + + + + Donation Tax Receipt EN + donation.tax.receipt + py3o_donation_certificate_EN + py3o + pdf + + 'Fiscal_receipt-'+(object.number or '').replace('/','') + + + + + py3o.template.view.form.inherit + py3o.template + + + + + + + + + + diff --git a/donation_certificate/views/tax_receipt_donation.xml b/donation_certificate/views/tax_receipt_donation.xml new file mode 100644 index 000000000..0b816fd58 --- /dev/null +++ b/donation_certificate/views/tax_receipt_donation.xml @@ -0,0 +1,25 @@ + + + + + donation.tax.receipt.view.form.inherit + donation.tax.receipt + + +
+
+
+
+ + + donation.tax.receipt.view.form.inherit + donation.tax.receipt + + + + 1 + + + +
diff --git a/donation_certificate/wizard/__init__.py b/donation_certificate/wizard/__init__.py new file mode 100644 index 000000000..9dae7f968 --- /dev/null +++ b/donation_certificate/wizard/__init__.py @@ -0,0 +1,3 @@ +from . import donation_certificate_send +from . import tax_receipt_annual_create +from . import tax_receipt_print diff --git a/donation_certificate/wizard/donation_certificate_send.py b/donation_certificate/wizard/donation_certificate_send.py new file mode 100644 index 000000000..6eaad7256 --- /dev/null +++ b/donation_certificate/wizard/donation_certificate_send.py @@ -0,0 +1,164 @@ +from odoo import api, fields, models, _ +from odoo.addons.mail.wizard.mail_compose_message import _reopen +from odoo.exceptions import UserError +from odoo.tools.misc import get_lang + + +class DonationCertificateSend(models.TransientModel): + _name = 'donation.certificate.send' + _inherits = {'mail.compose.message': 'composer_id'} + _description = 'Donation Certificate Send' + + is_email = fields.Boolean('Email', default=lambda self: self.env.company.invoice_is_email) + donation_without_email = fields.Text(compute='_compute_donation_without_email', string='Donation(s) that will not be sent') + is_print = fields.Boolean('Print', default=lambda self: self.env.company.invoice_is_print) + printed = fields.Boolean('Is Printed', default=False) + tax_receipt_ids = fields.Many2many('donation.tax.receipt', 'donation_tax_receipt_donation_certificate_send_rel', string='Donations Tax Receipt') + composer_id = fields.Many2one('mail.compose.message', required=True, ondelete='cascade') + template_id = fields.Many2one('mail.template', 'Use template', domain="[('model', '=', 'donation.tax.receipt'), ]", default=lambda self: self._get_report_template()) + + def _get_report_template(self): + template = self.env.ref('donation_certificate.email_template_donation_certificate', raise_if_not_found=False) + return template.id or False + + @api.model + def default_get(self, fields): + res = super(DonationCertificateSend, self).default_get(fields) + res_ids = self._context.get('active_ids') + + tax_receipts = self.env['donation.tax.receipt'].browse(res_ids) + if not tax_receipts: + raise UserError(_("You can only send invoices.")) + + composer = self.env['mail.compose.message'].create({ + 'composition_mode': 'comment' if len(res_ids) == 1 else 'mass_mail', + }) + res.update({ + 'tax_receipt_ids': res_ids, + 'composer_id': composer.id, + }) + return res + + @api.onchange('tax_receipt_ids') + def _compute_composition_mode(self): + for wizard in self: + wizard.composer_id.composition_mode = 'comment' if len(wizard.tax_receipt_ids) == 1 else 'mass_mail' + + def get_ref_report_name(self, wizard_template_id_lang): + lang = list(wizard_template_id_lang.values())[0] + report_names = { + 'es_ES': "donation_certificate.donation_certificate_report_py3o_ES", + 'ca_ES': "donation_certificate.donation_certificate_report_py3o_CAT", + 'fr_FR': "donation_certificate.donation_certificate_report_py3o_FR", + 'en_GB': "donation_certificate.donation_certificate_report_py3o_EN" + } + report_name = report_names.get(lang, "donation_certificate.donation_certificate_report_py3o_EN") + + return self.env.ref(report_name, raise_if_not_found=False).id + + @api.onchange('template_id') + def onchange_template_id(self): + for wizard in self: + if wizard.composer_id: + # Hay que mirar porque el archivo se llama igual que el ID + # Get different report depending on the lang + lang_object = wizard.template_id.lang + render_model = wizard.template_id.render_model + res_ids = wizard.tax_receipt_ids.ids + lang = wizard.template_id._render_template(lang_object, render_model, res_ids) + + wizard.template_id.report_template = self.get_ref_report_name(lang) + wizard.composer_id.template_id = wizard.template_id.id + # Get different report depending on the lang + wizard.composer_id.template_id.report_template = self.get_ref_report_name(lang) + wizard._compute_composition_mode() + wizard.composer_id._onchange_template_id_wrapper() + + @api.onchange('is_email') + def onchange_is_email(self): + if self.is_email: + res_ids = self._context.get('active_ids') + data = { + 'composition_mode': 'comment' if len(res_ids) == 1 else 'mass_mail', + 'template_id': self.template_id.id + } + if not self.composer_id: + self.composer_id = self.env['mail.compose.message'].create(data) + else: + self.composer_id.write(data) + self._compute_composition_mode() + self.composer_id._onchange_template_id_wrapper() + + @api.onchange('is_email') + def _compute_donation_without_email(self): + for wizard in self: + if wizard.is_email and len(wizard.tax_receipt_ids) > 1: + tax_receipts = self.env['donation.tax.receipt'].search([ + ('id', 'in', self.env.context.get('active_ids')), + ('partner_id.email', '=', False) + ]) + if tax_receipts: + wizard.donation_without_email = "%s\n%s" % ( + _("The following donation(s) will not be sent by email, because the customers don't have email address."), + "\n".join([i.number for i in tax_receipts])) + else: + wizard.donation_without_email = False + else: + wizard.donation_without_email = False + + def _send_email(self): + if self.is_email: + self.composer_id.with_context(no_new_invoice=True, + mail_notify_author=self.env.user.partner_id in self.composer_id.partner_ids, + mailing_document_based=True, + )._action_send_mail() + for tax_receipt in self.tax_receipt_ids: + prioritary_attachments = tax_receipt.attachment_ids.filtered(lambda x: x.mimetype.endswith('pdf')) + if prioritary_attachments: + tax_receipt.with_context(tracking_disable=True).sudo().write({'message_main_attachment_id': prioritary_attachments[0].id}) + + def _print_certificate_document(self): + """ to override for each type of models that will use this composer.""" + self.ensure_one() + action = self.tax_receipt_ids.action_print_tax_receipt() + + action.update({'close_on_report_download': True}) + return action + + def send_and_print_action(self): + self.ensure_one() + # Send the mails in the correct language by splitting the ids per lang. + # This should ideally be fixed in mail_compose_message, so when a fix is made there this whole commit should be reverted. + # basically self.body (which could be manually edited) extracts self.template_id, + # which is then not translated for each customer. + if self.composition_mode == 'mass_mail' and self.template_id: + active_ids = self.env.context.get('active_ids', self.res_id) + active_records = self.env[self.model].browse(active_ids) + langs = set(active_records.mapped('partner_id.lang')) + for lang in langs: + active_ids_lang = active_records.filtered(lambda r: r.partner_id.lang == lang).ids + self_lang = self.with_context(active_ids=active_ids_lang, lang=get_lang(self.env, lang).code) + self_lang.onchange_template_id() + self_lang._send_email() + else: + active_record = self.env[self.model].browse(self.res_id) + lang = get_lang(self.env, active_record.partner_id.lang).code + self.with_context(lang=lang)._send_email() + if self.is_print: + return self._print_document() + return {'type': 'ir.actions.act_window_close'} + + def save_as_template(self): + self.ensure_one() + self.composer_id.action_save_as_template() + self.template_id = self.composer_id.template_id.id + action = _reopen(self, self.id, self.model, context=self._context) + action.update({'name': _('Send Certificate')}) + return action + + def _print_document(self): + """ to override for each type of models that will use this composer.""" + self.ensure_one() + action = self.tax_receipt_ids.action_print_tax_receipt() + action.update({'close_on_report_download': True}) + return action diff --git a/donation_certificate/wizard/tax_receipt_annual_create.py b/donation_certificate/wizard/tax_receipt_annual_create.py new file mode 100644 index 000000000..c328811da --- /dev/null +++ b/donation_certificate/wizard/tax_receipt_annual_create.py @@ -0,0 +1,18 @@ +from odoo import models + + +class TaxReceiptAnnualCreate(models.TransientModel): + _inherit = "tax.receipt.annual.create" + """ + Clase creada para cuando se me pida cambiar la vista o funcionamiento de + 'Crear recibos anuales', de momento no hace nada. + """ + + # @api.model + # def _prepare_annual_tax_receipt(self, partner, partner_dict): + # # wdb.set_trace() + # super()._prepare_annual_tax_receipt(partner, partner_dict) + + # def generate_annual_receipts(self): + # # wdb.set_trace() + # super().generate_annual_receipts() diff --git a/donation_certificate/wizard/tax_receipt_annual_create_view.xml b/donation_certificate/wizard/tax_receipt_annual_create_view.xml new file mode 100644 index 000000000..3c2e04257 --- /dev/null +++ b/donation_certificate/wizard/tax_receipt_annual_create_view.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/donation_certificate/wizard/tax_receipt_print.py b/donation_certificate/wizard/tax_receipt_print.py new file mode 100644 index 000000000..70a2c53ea --- /dev/null +++ b/donation_certificate/wizard/tax_receipt_print.py @@ -0,0 +1,46 @@ +# Copyright 2014-2021 Barroux Abbey (http://www.barroux.org) +# Copyright 2014-2021 Akretion France (http://www.akretion.com/) +# @author: Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, fields, models +from odoo.exceptions import UserError +from odoo.tools import get_lang +import wdb + + +class DonationTaxReceiptPrint(models.TransientModel): + _inherit = "donation.tax.receipt.print" + _description = "Print Donation Tax Receipts" + + lang = fields.Selection( + [("es_ES", "Spanish"), ("ca_ES", "Catalan"), ("fr_FR", "French"), ("en_GB", "English")], + # readonly=True, + # copy=False, + # default="draft", + # index=True, + # tracking=True, + ) + + def print_receipts(self): + self.ensure_one() + if not self.receipt_ids: + raise UserError(_("There are no tax receipts to print.")) + today = fields.Date.context_today(self) + self.receipt_ids.write({"print_date": today}) + if self.lang: + lang = self.lang + else: + lang = get_lang(self.env).code + report_action_py3o = self.get_ref_report_name(lang) + return self.env.ref(report_action_py3o).report_action(self.receipt_ids) + + def get_ref_report_name(self, lang): + report_names = { + 'es_ES': "donation_certificate.donation_certificate_report_py3o_ES", + 'ca_ES': "donation_certificate.donation_certificate_report_py3o_CAT", + 'fr_FR': "donation_certificate.donation_certificate_report_py3o_FR", + 'en_GB': "donation_certificate.donation_certificate_report_py3o_EN" + } + + return report_names.get(lang, "donation_certificate.donation_certificate_report_py3o_EN") diff --git a/donation_certificate/wizard/tax_receipt_print_view.xml b/donation_certificate/wizard/tax_receipt_print_view.xml new file mode 100644 index 000000000..fd19b4a56 --- /dev/null +++ b/donation_certificate/wizard/tax_receipt_print_view.xml @@ -0,0 +1,40 @@ + + + + + donation_tax_receipt_print.form.inherit + donation.tax.receipt.print + + + + 1 + + + + + + + + + + + + + + + + + + + + diff --git a/donation_letter/__init__.py b/donation_letter/__init__.py new file mode 100644 index 000000000..082fa1746 --- /dev/null +++ b/donation_letter/__init__.py @@ -0,0 +1,4 @@ +# Copyright +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import models +from . import wizard diff --git a/donation_letter/__manifest__.py b/donation_letter/__manifest__.py new file mode 100644 index 000000000..07b66164f --- /dev/null +++ b/donation_letter/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Donation Thanks Letter", + "summary": "Donation Thanks Letter", + "version": "16.0.1.0.0", + "category": "Custom", + "website": "https://www.qubiq.es", + "author": "Brenda Fernández Alayo", + "license": "AGPL-3", + "installable": True, + "depends": ['donation', 'account', 'mail', 'donation_base'], + "data": [ + "security/ir.model.access.csv", + "data/mail_template.xml", + "views/donation_letter_send_views.xml", + "views/donation_send_button.xml", + ], +} diff --git a/donation_letter/data/mail_template.xml b/donation_letter/data/mail_template.xml new file mode 100644 index 000000000..8a6c9bdc4 --- /dev/null +++ b/donation_letter/data/mail_template.xml @@ -0,0 +1,49 @@ + + + + + Donation: Thanks Letter by email + + + {{ object.company_id.email }} + {{ object.partner_id.email }} + Thank you for your donation + Letter of appreciation + +
+

+ Dear + + Brandon Freeman + ( + Azure Interior + ), + + + Donor name, + +
+
+ We want to express our sincere gratitude for your generous donation of + $ 143,750.00 + to our organization. This contribution is a testament to your commitment and trust in our work. +
+
+ With this collaboration you help us move forward with our mission. We sincerely appreciate your support. +
+
+ Cordially, +
+
+ + -- +
+ Association name +
+

+
+
+ {{ object.partner_id.lang }} +
+
+
diff --git a/donation_letter/models/__init__.py b/donation_letter/models/__init__.py new file mode 100644 index 000000000..b1847a5ab --- /dev/null +++ b/donation_letter/models/__init__.py @@ -0,0 +1 @@ +from . import donation diff --git a/donation_letter/models/donation.py b/donation_letter/models/donation.py new file mode 100644 index 000000000..6505c5e15 --- /dev/null +++ b/donation_letter/models/donation.py @@ -0,0 +1,72 @@ +from odoo import _, fields, models +from odoo.tools import get_lang + + +class Donation(models.Model): + _inherit = "donation.donation" + + is_thanks_letter_send = fields.Boolean( + default=False, + help="This field automatically becomes active when " + "the thanks letter has been send.", + ) + attachment_ids = fields.One2many( + comodel_name='ir.attachment', + inverse_name='res_id', + domain=[('res_model', '=', 'donation.donation')], + string='Attachments' + ) + + def action_send_thanks(self): + template = self.env.ref(self._get_mail_template(), raise_if_not_found=False) + lang = False + + if len(self) == 1: + lang = template._render_lang(self.ids)[self.id] + + if not lang: + lang = get_lang(self.env).code + + compose_form = self.env.ref('donation_letter.donation_letter_send_wizard_form', raise_if_not_found=False) + + ctx = { + 'default_model': 'donation.donation', + 'default_res_model': 'donation.donation', + 'default_use_template': bool(template), + 'default_template_id': template and template.id or False, + 'default_composition_mode': 'comment', + 'mark_invoice_as_sent': True, + 'default_email_layout_xmlid': "mail.mail_notification_layout_with_responsible_signature", + 'force_email': True, + 'active_ids': self.ids, + } + + report_action = { + 'name': _('Send Thanks Letter'), + 'type': 'ir.actions.act_window', + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'donation.letter.send', + 'views': [(compose_form.id, 'form')], + 'view_id': compose_form.id, + 'target': 'new', + 'context': ctx, + } + + return report_action + + + def action_donation_print(self): + """ Print the donation and mark it as sent, so that we can see more + easily the next step of the workflow + """ + self.filtered(lambda inv: not inv.is_thanks_letter_send).write({'is_thanks_letter_send': True}) + return self.env.ref('donation.report_thanks').report_action(self) + + def _get_mail_template(self): + """ + :return: the correct mail template based on the current move type + """ + return ( + 'donation_letter.email_template_thanks_letter' + ) diff --git a/donation_letter/security/ir.model.access.csv b/donation_letter/security/ir.model.access.csv new file mode 100644 index 000000000..c9a16cb5e --- /dev/null +++ b/donation_letter/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_donation_letter_send,donation.letter.send,donation_letter.model_donation_letter_send,base.group_user,1,1,1,1 +access_donation_donation,donation.donation,donation.model_donation_donation,base.group_user,1,1,1,1 diff --git a/donation_letter/static/description/icon.png b/donation_letter/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e8f0fcf0fe7feb21033ff0c0cf2211e073885444 GIT binary patch literal 19258 zcmV*EKx@B=P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 IcMZw>5Aqi&82|tP literal 0 HcmV?d00001 diff --git a/donation_letter/views/donation_letter_send_views.xml b/donation_letter/views/donation_letter_send_views.xml new file mode 100644 index 000000000..bb931ecc7 --- /dev/null +++ b/donation_letter/views/donation_letter_send_views.xml @@ -0,0 +1,67 @@ + + + + donation.letter.send.form + donation.letter.send + + +
+ + + + + +
+ + + +
+ Preview as a PDF +
+
+
+ + + +
+
+ +
+
+
+ + + +
+ + + + + + + + +
+
+
+ +
+
+
diff --git a/donation_letter/views/donation_send_button.xml b/donation_letter/views/donation_send_button.xml new file mode 100644 index 000000000..6e84f3471 --- /dev/null +++ b/donation_letter/views/donation_send_button.xml @@ -0,0 +1,35 @@ + + + + donation.form.view.form.inherit + donation.donation + + + + + + + + 1 + + + + + + Send Thanks Letter + + + code + + if records: + action = records.action_send_thanks() + + + diff --git a/donation_letter/wizard/__init__.py b/donation_letter/wizard/__init__.py new file mode 100644 index 000000000..434c36ddc --- /dev/null +++ b/donation_letter/wizard/__init__.py @@ -0,0 +1 @@ +from . import donation_letter_send diff --git a/donation_letter/wizard/donation_letter_send.py b/donation_letter/wizard/donation_letter_send.py new file mode 100644 index 000000000..844bac6d0 --- /dev/null +++ b/donation_letter/wizard/donation_letter_send.py @@ -0,0 +1,133 @@ +from odoo import api, fields, models, _ +from odoo.addons.mail.wizard.mail_compose_message import _reopen +from odoo.exceptions import UserError +from odoo.tools.misc import get_lang + + +class DonationLeterSend(models.TransientModel): + _name = 'donation.letter.send' + _inherits = {'mail.compose.message': 'composer_id'} + _description = 'Donation Thanks Letter Send' + + is_email = fields.Boolean('Email', default=lambda self: self.env.company.invoice_is_email) + donation_without_email = fields.Text(compute='_compute_donation_without_email', string='donation(s) that will not be sent') + is_print = fields.Boolean('Print', default=lambda self: self.env.company.invoice_is_print) + printed = fields.Boolean('Is Printed', default=False) + donation_ids = fields.Many2many('donation.donation', 'donation_donation_donation_letter_send_rel', string='Donations') + composer_id = fields.Many2one('mail.compose.message', string='Composer', required=True, ondelete='cascade') + template_id = fields.Many2one('mail.template', 'Use template', domain="[('model', '=', 'donation.donation')]") + + @api.model + def default_get(self, fields): + res = super(DonationLeterSend, self).default_get(fields) + res_ids = self._context.get('active_ids') + + donations = self.env['donation.donation'].browse(res_ids) + if not donations: + raise UserError(_("You can only send invoices.")) + + composer = self.env['mail.compose.message'].create({ + 'composition_mode': 'comment' if len(res_ids) == 1 else 'mass_mail', + }) + res.update({ + 'donation_ids': res_ids, + 'composer_id': composer.id, + }) + return res + + @api.onchange('donation_ids') + def _compute_composition_mode(self): + for wizard in self: + wizard.composer_id.composition_mode = 'comment' if len(wizard.donation_ids) == 1 else 'mass_mail' + + @api.onchange('template_id') + def onchange_template_id(self): + for wizard in self: + if wizard.composer_id: + wizard.composer_id.template_id = wizard.template_id.id + wizard._compute_composition_mode() + wizard.composer_id._onchange_template_id_wrapper() + + @api.onchange('is_email') + def onchange_is_email(self): + if self.is_email: + res_ids = self._context.get('active_ids') + if not self.composer_id: + self.composer_id = self.env['mail.compose.message'].create({ + 'composition_mode': 'comment' if len(res_ids) == 1 else 'mass_mail', + 'template_id': self.template_id.id + }) + else: + self.composer_id.composition_mode = 'comment' if len(res_ids) == 1 else 'mass_mail' + self.composer_id.template_id = self.template_id.id + self._compute_composition_mode() + self.composer_id._onchange_template_id_wrapper() + + @api.onchange('is_email') + def _compute_donation_without_email(self): + for wizard in self: + if wizard.is_email and len(wizard.donation_ids) > 1: + donations = self.env['donation.donation'].search([ + ('id', 'in', self.env.context.get('active_ids')), + ('partner_id.email', '=', False) + ]) + if donations: + wizard.donation_without_email = "%s\n%s" % ( + _("The following donation(s) will not be sent by email, because the customers don't have email address."), + "\n".join([i.name for i in donations])) + else: + wizard.donation_without_email = False + else: + wizard.donation_without_email = False + + def _send_email(self): + if self.is_email: + # with_context : we don't want to reimport the file we just exported. + self.composer_id.with_context(no_new_invoice=True, + mail_notify_author=self.env.user.partner_id in self.composer_id.partner_ids, + mailing_document_based=True, + )._action_send_mail() + for donation in self.donation_ids: + prioritary_attachments = donation.attachment_ids.filtered(lambda x: x.mimetype.endswith('pdf')) + if prioritary_attachments: + donation.with_context(tracking_disable=True).sudo().write({'message_main_attachment_id': prioritary_attachments[0].id}) + donation.sudo().write({"is_thanks_letter_send": True}) + + def _print_document(self): + """ to override for each type of models that will use this composer.""" + self.ensure_one() + action = self.donation_ids.action_donation_print() + + action.update({'close_on_report_download': True}) + return action + + def send_and_print_action(self): + self.ensure_one() + # Send the mails in the correct language by splitting the ids per lang. + # This should ideally be fixed in mail_compose_message, so when a fix is made there this whole commit should be reverted. + # basically self.body (which could be manually edited) extracts self.template_id, + # which is then not translated for each customer. + if self.composition_mode == 'mass_mail' and self.template_id: + active_ids = self.env.context.get('active_ids', self.res_id) + active_records = self.env[self.model].browse(active_ids) + langs = set(active_records.mapped('partner_id.lang')) + for lang in langs: + active_ids_lang = active_records.filtered(lambda r: r.partner_id.lang == lang).ids + self_lang = self.with_context(active_ids=active_ids_lang, lang=get_lang(self.env, lang).code) + self_lang.onchange_template_id() + self_lang._send_email() + else: + active_record = self.env[self.model].browse(self.res_id) + lang = get_lang(self.env, active_record.partner_id.lang).code + self.with_context(lang=lang)._send_email() + if self.is_print: + return self._print_document() + return {'type': 'ir.actions.act_window_close'} + + def save_as_template(self): + self.ensure_one() + self.composer_id.action_save_as_template() + self.template_id = self.composer_id.template_id.id + action = _reopen(self, self.id, self.model, context=self._context) + action.update({'name': _('Send Thanks Letter')}) + return action diff --git a/donation_summary/__init__.py b/donation_summary/__init__.py new file mode 100644 index 000000000..082fa1746 --- /dev/null +++ b/donation_summary/__init__.py @@ -0,0 +1,4 @@ +# Copyright +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import models +from . import wizard diff --git a/donation_summary/__manifest__.py b/donation_summary/__manifest__.py new file mode 100644 index 000000000..b9d1c7738 --- /dev/null +++ b/donation_summary/__manifest__.py @@ -0,0 +1,21 @@ +# Copyright +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Donation Summary", + "summary": "Make summary donations", + "version": "16.0.1.0.0", + "category": "Custom", + "website": "https://www.qubiq.es", + "author": "Brenda Fernández Alayo", + "license": "AGPL-3", + "depends": ['donation', 'donation_base', 'mail', 'donation_certificate'], + "data": [ + "security/ir.model.access.csv", + 'report/donation_summary.xml', + 'report/donation_summary_templates.xml', + 'views/donation_summary_views.xml', + 'views/donation_summary_send_views.xml', + 'data/mail_template.xml' + ], +} diff --git a/donation_summary/data/mail_template.xml b/donation_summary/data/mail_template.xml new file mode 100644 index 000000000..53081b886 --- /dev/null +++ b/donation_summary/data/mail_template.xml @@ -0,0 +1,45 @@ + + + + + Donation: Send Summary + + + {{ object.company_id.email }} + {{ object.partner_id.email }} + Summary of Your Donations + Donation Summary + +
+

Dear + Brandon Freeman,
+
We want to express our sincere gratitude for your suport and generosity towards our mission. +
We are pleased to inform you that attached you will find a detailed summary of all + the donations you have made from 01/01/2023 + to 31/12/2023. +
+
This summary includes the date and amount of each contribution, allowing you to have a + clear overview of your impact on our organization. +
+
The total amount of your donations during this period add up to $ + 143,750.00. +
+
+
If you would like more details or have any questions about your donation history, + please fell free to contact us.
+
Cordially,
+
+ + Association name +

+
+
+ {{ object.partner_id.lang }} + + RDS_{{ (object.name or '') }} +
+
+
\ No newline at end of file diff --git a/donation_summary/models/__init__.py b/donation_summary/models/__init__.py new file mode 100644 index 000000000..c450dab14 --- /dev/null +++ b/donation_summary/models/__init__.py @@ -0,0 +1,2 @@ +from . import donation +from . import donation_summary diff --git a/donation_summary/models/donation.py b/donation_summary/models/donation.py new file mode 100644 index 000000000..5165ed4a4 --- /dev/null +++ b/donation_summary/models/donation.py @@ -0,0 +1,9 @@ +from odoo import fields, models + + +class Donation(models.Model): + _inherit = "donation.donation" + + donation_summary_id = fields.Many2one( + string="Donation Summary", + comodel_name='donation.summary') diff --git a/donation_summary/models/donation_summary.py b/donation_summary/models/donation_summary.py new file mode 100644 index 000000000..7b33a4f9f --- /dev/null +++ b/donation_summary/models/donation_summary.py @@ -0,0 +1,229 @@ +from odoo import _, fields, models, api +from odoo.exceptions import UserError +from odoo.tools.misc import get_lang +import datetime + + +class DonationSummary(models.Model): + _name = "donation.summary" + _inherit = ["mail.thread", "mail.activity.mixin"] + + @api.model + def _default_end_date(self): + return datetime.date(fields.Date.context_today(self).year - 1, 12, 31) + + @api.model + def _default_start_date(self): + return datetime.date(fields.Date.context_today(self).year - 1, 1, 1) + + name = fields.Char(compute="_compute_name") + + is_summary_send = fields.Boolean( + help="This field automatically becomes active when " + "the summary has been send.", + ) + partner_id = fields.Many2one( + "res.partner", + string="Donor", + index=True, + states={"sent": [("readonly", True)]}, + tracking=True, + ondelete="restrict", + domain="[('donation_ids', '!=', False)]" + ) + start_date = fields.Date( + required=True, default=lambda self: self._default_start_date(), + states={"sent": [("readonly", True)]} + ) + end_date = fields.Date( + required=True, default=lambda self: self._default_end_date(), + states={"sent": [("readonly", True)]} + ) + + donation_ids = fields.One2many( + "donation.donation", + "donation_summary_id", + string="Related Donations", + compute="_compute_donation_ids", + required=True, + states={"sent": [("readonly", True)]}, + ) + + state = fields.Selection( + [("draft", "Draft"), ("sent", "Sent")], + readonly=True, + copy=False, + default="draft", + index=True, + tracking=True, + ) + company_id = fields.Many2one( + "res.company", + string="Company", + ondelete="cascade", + default=lambda self: self.env.company, + ) + amount_total = fields.Monetary( + tracking=True, + compute="_compute_amounts", + states={"sent": [("readonly", True)]}, + ) + currency_id = fields.Many2one( + "res.currency", + required=True, + states={"sent": [("readonly", True)]}, + tracking=True, + ondelete="restrict", + default=lambda self: self.env.company.currency_id, + ) + attachment_ids = fields.One2many( + 'ir.attachment', + 'res_id', + domain=[('res_model', '=', 'donation.summary')], + string='Attachments' + ) + + def _compute_name(self): + for rec in self: + rec.name = (rec.partner_id.name).replace(" ", "") + "_" + str(rec.start_date).replace("-", "") + "_" + str(rec.end_date).replace("-", "") if rec.partner_id else "" + + def _prepare_donation_summary(self, existing_donation_ids): + vals = { + "partner_id": existing_donation_ids.partner_id.id, + "start_date": self.start_date, + "end_date": self.end_date, + "state": 'draft', + "is_summary_send": False + } + return vals + + def massive_creation(self): + d_sum = self.env["donation.summary"] + donation_summary_ids = [] + for partner in self.donation_ids.partner_id.ids: + donations = self.donation_ids.filtered(lambda donation: donation.partner_id.id == partner) + values = self._prepare_donation_summary(donations) + donation_summary_ids.append(values) + if not len(donation_summary_ids): + raise UserError(_("No annual tax receipt to generate")) + + self.unlink() + + for new_summary_vals in donation_summary_ids: + d_sum.create(new_summary_vals) + + # Redireccionar a la vista tree + return { + 'name': _('Donations Summary'), + 'type': 'ir.actions.act_window', + 'res_model': 'donation.summary', + 'view_type': 'tree', + 'view_mode': 'tree,form', + 'target': 'main', + 'context': self.env.context, + } + + @api.depends('donation_ids') + def _compute_amounts(self): + for rec in self: + amount = 0 + for don in rec.donation_ids: + amount += don.amount_total_company_currency + rec.amount_total = amount + + @api.depends('partner_id', 'start_date', 'end_date') + def _compute_donation_ids(self): + for rec in self: + domain = [('state', '=', 'done'), ('donation_summary_id', '=', False)] + if rec.partner_id: + domain += [ + ('partner_id', '=', rec.partner_id.id) + ] + if rec.start_date and rec.end_date: + domain += [ + ('donation_date', '>=', rec.start_date), + ('donation_date', '<=', rec.end_date) + ] + donations = self.env["donation.donation"].search(domain) + if not donations: + raise UserError("There must be at least one donation in the summary.") + rec.donation_ids = donations + + def massive_send_summary(self): + template = self.env.ref(self._get_mail_template(), raise_if_not_found=False) + compose_form = self.env.ref('donation_summary.donation_summary_send_wizard_form', raise_if_not_found=False) + ctx = dict( + default_model='donation.summary', + # For the sake of consistency we need a default_res_model if + # default_res_id is set. Not renaming default_model as it can + # create many side-effects. + default_res_model='donation.summary', + default_use_template=bool(template), + default_template_id=template and template.id or False, + default_composition_mode='comment', + mark_invoice_as_sent=True, + default_email_layout_xmlid="mail.mail_notification_layout_with_responsible_signature", + force_email=True, + active_ids=self.ids, + ) + report_action = { + 'name': _('Send Donation Summary'), + 'type': 'ir.actions.act_window', + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'donation.summary.send', + 'views': [(compose_form.id, 'form')], + 'view_id': compose_form.id, + 'target': 'new', + 'context': ctx, + } + return report_action + + def send_summary(self): + template = self.env.ref(self._get_mail_template(), raise_if_not_found=False) + lang = False + if template: + lang = template._render_lang(self.ids)[self.id] + if not lang: + lang = get_lang(self.env).code + compose_form = self.env.ref('donation_summary.donation_summary_send_wizard_form', raise_if_not_found=False) + ctx = dict( + default_model='donation.summary', + default_res_id=self.id, + default_res_model='donation.summary', + default_use_template=bool(template), + default_template_id=template and template.id or False, + default_composition_mode='comment', + mark_invoice_as_sent=True, + default_email_layout_xmlid="mail.mail_notification_layout_with_responsible_signature", + force_email=True, + active_ids=self.ids, + ) + report_action = { + 'name': _('Send Donation Summary'), + 'type': 'ir.actions.act_window', + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'donation.summary.send', + 'views': [(compose_form.id, 'form')], + 'view_id': compose_form.id, + 'target': 'new', + 'context': ctx, + } + + return report_action + + def _get_mail_template(self): + """ + :return: the correct mail template based on the current move type + """ + return ( + 'donation_summary.email_template_donation_summary' + ) + + def action_print_donation_summary(self): + """ Print the certificate and mark it as sent, so that we can see more + easily the next step of the workflow + """ + self.filtered(lambda sum: not sum.is_summary_send).write({'is_summary_send': True}) + return self.env.ref('donation_summary.report_donation_summary').report_action(self) diff --git a/donation_summary/report/donation_summary.xml b/donation_summary/report/donation_summary.xml new file mode 100644 index 000000000..6c54cc69d --- /dev/null +++ b/donation_summary/report/donation_summary.xml @@ -0,0 +1,13 @@ + + + + Request for Donation Summary + donation.summary + qweb-pdf + donation_summary.report_donationsummary + donation_summary.report_donationsummary + 'Request for Donation Summary - %s' %(object.partner_id.name) + + report + + \ No newline at end of file diff --git a/donation_summary/report/donation_summary_templates.xml b/donation_summary/report/donation_summary_templates.xml new file mode 100644 index 000000000..cbed6a9dd --- /dev/null +++ b/donation_summary/report/donation_summary_templates.xml @@ -0,0 +1,81 @@ + + + + + + \ No newline at end of file diff --git a/donation_summary/security/ir.model.access.csv b/donation_summary/security/ir.model.access.csv new file mode 100644 index 000000000..e1e9d2149 --- /dev/null +++ b/donation_summary/security/ir.model.access.csv @@ -0,0 +1,4 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_donation_summary,donation.summary,donation_summary.model_donation_summary,base.group_user,1,1,1,1 +access_donation_donation,donation.donation,donation.model_donation_donation,base.group_user,1,1,1,1 +access_donation_summary_send,donation.summary.send,donation_summary.model_donation_summary_send,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/donation_summary/static/description/icon.png b/donation_summary/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e8f0fcf0fe7feb21033ff0c0cf2211e073885444 GIT binary patch literal 19258 zcmV*EKx@B=P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 IcMZw>5Aqi&82|tP literal 0 HcmV?d00001 diff --git a/donation_summary/views/donation_summary_send_views.xml b/donation_summary/views/donation_summary_send_views.xml new file mode 100644 index 000000000..069a90d08 --- /dev/null +++ b/donation_summary/views/donation_summary_send_views.xml @@ -0,0 +1,68 @@ + + + + donation.summary.send.form + donation.summary.send + + +
+ + + + + +
+ + + +
+ Preview as a PDF +
+
+
+ + + +
+
+ +
+
+
+ + + +
+ + + + + + + + + +
+
+
+ +
+
+
diff --git a/donation_summary/views/donation_summary_views.xml b/donation_summary/views/donation_summary_views.xml new file mode 100644 index 000000000..8802fd519 --- /dev/null +++ b/donation_summary/views/donation_summary_views.xml @@ -0,0 +1,114 @@ + + + + Donations Summary + donation.summary + tree,form + +

+ Create a new custom field in your donation summary record +

+

+ Odoo helps you easily track all custom fields related to a donation summary. +

+
+
+ + + donation.summary.view.tree + donation.summary + + + + + + + + + + + + + + + donation.summary.view.form + donation.summary + +
+
+
+ + + + + + + + + + +
+ + + +
+
+
+
+ + + donation.summary.view.tree.inherit + donation.summary + + + +
+
+
+
+
+ + donation.summary.view..search + donation.summary + + + + + + + + +
\ No newline at end of file diff --git a/donation_summary/wizard/__init__.py b/donation_summary/wizard/__init__.py new file mode 100644 index 000000000..e3da7d70a --- /dev/null +++ b/donation_summary/wizard/__init__.py @@ -0,0 +1 @@ +from . import donation_summary_send diff --git a/donation_summary/wizard/donation_summary_send.py b/donation_summary/wizard/donation_summary_send.py new file mode 100644 index 000000000..71949f648 --- /dev/null +++ b/donation_summary/wizard/donation_summary_send.py @@ -0,0 +1,211 @@ +from odoo import api, fields, models, _ +from odoo.addons.mail.wizard.mail_compose_message import _reopen +from odoo.exceptions import UserError +from odoo.tools.misc import get_lang + + +class DonationSummarySend(models.TransientModel): + _name = "donation.summary.send" + _inherits = {"mail.compose.message": "composer_id"} + _description = "Donation Summary Send" + + is_email = fields.Boolean( + "Email", default=lambda self: self.env.company.invoice_is_email + ) + summary_without_email = fields.Text( + compute="_compute_donation_without_email", + string="Summary(s) that will not be sent", + ) + is_print = fields.Boolean( + "Print", default=lambda self: self.env.company.invoice_is_print + ) + printed = fields.Boolean("Is Printed", default=False) + donation_summary_ids = fields.Many2many( + "donation.summary", + "donation_summary_donation_summary_send_rel", + string="Donations Summary", + ) + composer_id = fields.Many2one( + "mail.compose.message", required=True, ondelete="cascade" + ) + template_id = fields.Many2one( + "mail.template", + "Use template", + default=lambda self: self._get_report_template(), + ) + # template_id = fields.Many2one('mail.template', 'Use template', domain="[('model', '=', 'donation.summary'), ]", default=lambda self: self._get_report_template()) + + def _get_report_template(self): + template = self.env.ref( + "donation_summary.email_template_donation_summary", raise_if_not_found=False + ) + return template.id or False + + @api.model + def default_get(self, fields): + res = super(DonationSummarySend, self).default_get(fields) + res_ids = self._context.get("active_ids") + + donation_summary = self.env["donation.summary"].browse(res_ids) + if not donation_summary: + raise UserError(_("You can only send invoices.")) + + composer = self.env["mail.compose.message"].create( + { + "composition_mode": "comment" if len(res_ids) == 1 else "mass_mail", + } + ) + res.update( + { + "donation_summary_ids": res_ids, + "composer_id": composer.id, + } + ) + return res + + @api.onchange("donation_summary_ids") + def _compute_composition_mode(self): + for wizard in self: + wizard.composer_id.composition_mode = ( + "comment" if len(wizard.donation_summary_ids) == 1 else "mass_mail" + ) + + def get_ref_report_name(self, wizard_template_id_lang): + lang = ( + list(wizard_template_id_lang.values())[0] + if wizard_template_id_lang + else "XX" + ) + report_names = { + "es_ES": "donation_certificate.donation_certificate_report_py3o_ES", + "ca_ES": "donation_certificate.donation_certificate_report_py3o_CAT", + "fr_FR": "donation_certificate.donation_certificate_report_py3o_FR", + "en_GB": "donation_certificate.donation_certificate_report_py3o_EN", + } + report_name = report_names.get( + lang, "donation_certificate.donation_certificate_report_py3o_EN" + ) + + return self.env.ref(report_name, raise_if_not_found=False).id + + @api.onchange("template_id") + def onchange_template_id(self): + for wizard in self: + if wizard.composer_id: + # Hay que mirar porque el archivo se llama igual que el ID + # Get different report depending on the lang + # lang_object = wizard.template_id.lang + # render_model = wizard.template_id.render_model + # res_ids = wizard.donation_summary_ids.ids + # lang = wizard.template_id._render_template(lang_object, render_model, res_ids) + # wizard.template_id.report_template = self.get_ref_report_name(lang) + wizard.composer_id.template_id = wizard.template_id.id + # Get different report depending on the lang + # wizard.composer_id.template_id.report_template = self.get_ref_report_name(lang) + wizard._compute_composition_mode() + wizard.composer_id._onchange_template_id_wrapper() + + @api.onchange("is_email") + def onchange_is_email(self): + if self.is_email: + res_ids = self._context.get("active_ids") + data = { + "composition_mode": "comment" if len(res_ids) == 1 else "mass_mail", + "template_id": self.template_id.id, + } + if not self.composer_id: + self.composer_id = self.env["mail.compose.message"].create(data) + else: + self.composer_id.write(data) + self._compute_composition_mode() + self.composer_id._onchange_template_id_wrapper() + + @api.onchange("is_email") + def _compute_donation_without_email(self): + for wizard in self: + if wizard.is_email and len(wizard.donation_summary_ids) > 1: + don_summary = self.env["donation.summary"].search( + [ + ("id", "in", self.env.context.get("active_ids")), + ("partner_id.email", "=", False), + ] + ) + if don_summary: + wizard.summary_without_email = "%s\n%s" % ( + _( + "The following donation(s) will not be sent by email, because the customers don't have email address." + ), + "\n".join([i.name for i in don_summary]), + ) + else: + wizard.summary_without_email = False + else: + wizard.summary_without_email = False + + def _send_email(self): + if self.is_email: + self.composer_id.with_context( + no_new_invoice=True, + mail_notify_author=self.env.user.partner_id + in self.composer_id.partner_ids, + mailing_document_based=True, + )._action_send_mail() + for don_summary in self.donation_summary_ids: + prioritary_attachments = don_summary.attachment_ids.filtered( + lambda x: x.mimetype.endswith("pdf") + ) + if prioritary_attachments: + don_summary.with_context(tracking_disable=True).sudo().write( + {"message_main_attachment_id": prioritary_attachments[0].id} + ) + + # def _print_certificate_document(self): + # """ to override for each type of models that will use this composer.""" + # self.ensure_one() + # action = self.donation_summary_ids.action_print_tax_receipt() + + # action.update({'close_on_report_download': True}) + # return action + + def send_and_print_action(self): + self.ensure_one() + # Send the mails in the correct language by splitting the ids per lang. + # This should ideally be fixed in mail_compose_message, so when a fix is made there this whole commit should be reverted. + # basically self.body (which could be manually edited) extracts self.template_id, + # which is then not translated for each customer. + if self.composition_mode == "mass_mail" and self.template_id: + active_ids = self.env.context.get("active_ids", self.res_id) + active_records = self.env[self.model].browse(active_ids) + langs = set(active_records.mapped("partner_id.lang")) + for lang in langs: + active_ids_lang = active_records.filtered( + lambda r: r.partner_id.lang == lang + ).ids + self_lang = self.with_context( + active_ids=active_ids_lang, lang=get_lang(self.env, lang).code + ) + self_lang.onchange_template_id() + self_lang._send_email() + else: + active_record = self.env[self.model].browse(self.res_id) + lang = get_lang(self.env, active_record.partner_id.lang).code + self.with_context(lang=lang)._send_email() + if self.is_print: + return self._print_document() + self.donation_summary_ids.write({"state": "sent"}) + return {"type": "ir.actions.act_window_close"} + + def save_as_template(self): + self.ensure_one() + self.composer_id.action_save_as_template() + self.template_id = self.composer_id.template_id.id + action = _reopen(self, self.id, self.model, context=self._context) + action.update({"name": _("Send Summary")}) + return action + + def _print_document(self): + """to override for each type of models that will use this composer.""" + self.ensure_one() + action = self.donation_summary_ids.action_print_donation_summary() + action.update({"close_on_report_download": True}) + return action From 4c31059ec1b8ff447a6c2d2ad3c1229b5adc0c98 Mon Sep 17 00:00:00 2001 From: brendaf Date: Fri, 19 Apr 2024 17:59:58 +0200 Subject: [PATCH 02/26] fix pretty --- donation_certificate/__manifest__.py | 18 +-- .../data/donation_sequence.xml | 4 +- donation_certificate/data/mail_template.xml | 9 +- .../data/py3o_certificate_template.xml | 18 ++- donation_certificate/models/donation.py | 55 ++++--- .../models/donation_tax_receipt.py | 81 ++++++---- donation_certificate/models/py3o_template.py | 8 +- .../views/donation_certificate_send_views.xml | 117 +++++++++++--- .../views/donation_send_cert_button.xml | 12 +- .../views/py3o_certificate_report.xml | 39 +++-- .../views/tax_receipt_donation.xml | 19 ++- .../wizard/donation_certificate_send.py | 149 ++++++++++------- .../wizard/tax_receipt_print.py | 20 ++- .../wizard/tax_receipt_print_view.xml | 14 +- donation_letter/__manifest__.py | 2 +- donation_letter/data/mail_template.xml | 17 +- donation_letter/models/donation.py | 63 ++++---- .../views/donation_letter_send_views.xml | 117 +++++++++++--- .../views/donation_send_button.xml | 30 ++-- .../wizard/donation_letter_send.py | 151 +++++++++++------- donation_summary/data/mail_template.xml | 38 +++-- donation_summary/models/donation.py | 4 +- donation_summary/models/donation_summary.py | 150 +++++++++-------- donation_summary/report/donation_summary.xml | 8 +- .../report/donation_summary_templates.xml | 26 +-- donation_summary/security/ir.model.access.csv | 2 +- .../views/donation_summary_send_views.xml | 128 +++++++++++---- .../views/donation_summary_views.xml | 30 ++-- .../wizard/donation_summary_send.py | 5 +- 29 files changed, 873 insertions(+), 461 deletions(-) diff --git a/donation_certificate/__manifest__.py b/donation_certificate/__manifest__.py index c2b69ca99..02891da39 100644 --- a/donation_certificate/__manifest__.py +++ b/donation_certificate/__manifest__.py @@ -6,22 +6,22 @@ "summary": "Donation Certificate", "version": "16.0.1.0.0", "category": "Custom", - "website": "https://www.qubiq.es", + "website": "https://github.com/OCA/donation", "author": "Brenda Fernández Alayo", "license": "AGPL-3", "application": True, "installable": True, - "depends": ['report_py3o', 'donation', 'donation_base', 'mail'], + "depends": ["report_py3o", "donation", "donation_base", "mail"], "data": [ "security/ir.model.access.csv", "data/mail_template.xml", "data/donation_sequence.xml", - 'data/py3o_certificate_template.xml', - 'views/donation_certificate_send_views.xml', - 'views/tax_receipt_donation.xml', - 'views/donation_send_cert_button.xml', - 'views/py3o_certificate_report.xml', - 'wizard/tax_receipt_annual_create_view.xml', - 'wizard/tax_receipt_print_view.xml' + "data/py3o_certificate_template.xml", + "views/donation_certificate_send_views.xml", + "views/tax_receipt_donation.xml", + "views/donation_send_cert_button.xml", + "views/py3o_certificate_report.xml", + "wizard/tax_receipt_annual_create_view.xml", + "wizard/tax_receipt_print_view.xml" ], } diff --git a/donation_certificate/data/donation_sequence.xml b/donation_certificate/data/donation_sequence.xml index 2b76b9590..a890f273f 100644 --- a/donation_certificate/data/donation_sequence.xml +++ b/donation_certificate/data/donation_sequence.xml @@ -1,4 +1,4 @@ - + @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/donation_certificate/data/mail_template.xml b/donation_certificate/data/mail_template.xml index 43ac78c09..03d34514f 100644 --- a/donation_certificate/data/mail_template.xml +++ b/donation_certificate/data/mail_template.xml @@ -5,7 +5,7 @@ Donation: Certificate - + {{ object.company_id.email }} {{ object.partner_id.email }} Donation Certificate @@ -18,7 +18,10 @@

We want to express our sincere gratitude for your generous donation of - $ 143,750.00 + $ 143,750.00 to our organization. This contribution is a testament to your commitment and trust in our work.

@@ -30,7 +33,7 @@
-- -
+
Association name

diff --git a/donation_certificate/data/py3o_certificate_template.xml b/donation_certificate/data/py3o_certificate_template.xml index b257f0cb4..4fe9247a1 100644 --- a/donation_certificate/data/py3o_certificate_template.xml +++ b/donation_certificate/data/py3o_certificate_template.xml @@ -1,28 +1,36 @@ - + Donation Certificate ES odt - report/PDA34_Certificat_de_donacions_ES.odt + report/PDA34_Certificat_de_donacions_ES.odt Donation Certificate CAT odt - report/PDA34_Certificat_de_donacions_CAT.odt + report/PDA34_Certificat_de_donacions_CAT.odt Donation Certificate FR odt - report/PDA34_Certificat_de_donacions_FR.odt + report/PDA34_Certificat_de_donacions_FR.odt Donation Certificate EN odt - report/PDA34_Certificat_de_donacions_EN.odt + report/PDA34_Certificat_de_donacions_EN.odt diff --git a/donation_certificate/models/donation.py b/donation_certificate/models/donation.py index db341dac5..7ccf6a18c 100644 --- a/donation_certificate/models/donation.py +++ b/donation_certificate/models/donation.py @@ -11,15 +11,15 @@ class Donation(models.Model): "the thanks letter has been send.", ) attachment_ids = fields.One2many( - 'ir.attachment', - 'res_id', - domain=[('res_model', '=', 'donation.donation')], - string='Attachments' + "ir.attachment", + "res_id", + domain=[("res_model", "=", "donation.donation")], + string="Attachments", ) def action_send_certificate(self): self.ensure_one() - if not self.tax_receipt_id and self.tax_receipt_option == 'annual': + if not self.tax_receipt_id and self.tax_receipt_option == "annual": raise ValidationError(_("Annual receipt has not been generated yet.")) self.write({"is_certificate_send": True}) template = self.env.ref(self._get_mail_template(), raise_if_not_found=False) @@ -28,43 +28,48 @@ def action_send_certificate(self): lang = template._render_lang(self.ids)[self.id] if not lang: lang = get_lang(self.env).code - compose_form = self.env.ref('donation_certificate.donation_certificate_send_wizard_form', raise_if_not_found=False) + compose_form = self.env.ref( + "donation_certificate.donation_certificate_send_wizard_form", + raise_if_not_found=False, + ) ctx = dict( - default_model='donation.tax.receipt', + default_model="donation.tax.receipt", default_res_id=self.tax_receipt_id.id, - default_res_model='donation.tax.receipt', + default_res_model="donation.tax.receipt", default_use_template=bool(template), default_template_id=template and template.id or False, - default_composition_mode='comment', + default_composition_mode="comment", mark_invoice_as_sent=True, default_email_layout_xmlid="mail.mail_notification_layout_with_responsible_signature", force_email=True, active_ids=self.tax_receipt_id.ids, ) report_action = { - 'name': _('Send Certificate'), - 'type': 'ir.actions.act_window', - 'view_type': 'form', - 'view_mode': 'form', - 'res_model': 'donation.certificate.send', - 'views': [(compose_form.id, 'form')], - 'view_id': compose_form.id, - 'target': 'new', - 'context': ctx, + "name": _("Send Certificate"), + "type": "ir.actions.act_window", + "view_type": "form", + "view_mode": "form", + "res_model": "donation.certificate.send", + "views": [(compose_form.id, "form")], + "view_id": compose_form.id, + "target": "new", + "context": ctx, } return report_action def action_print_tax_receipt(self): - """ Print the certificate and mark it as sent, so that we can see more - easily the next step of the workflow + """Print the certificate and mark it as sent, so that we can see more + easily the next step of the workflow """ - self.filtered(lambda r: not r.is_certificate_send).write({'is_certificate_send': True}) - return self.env.ref('donation_certificate.donation_certificate_report_py3o').report_action(self) + self.filtered(lambda r: not r.is_certificate_send).write( + {"is_certificate_send": True} + ) + return self.env.ref( + "donation_certificate.donation_certificate_report_py3o" + ).report_action(self) def _get_mail_template(self): """ :return: the correct mail template based on the current move type """ - return ( - 'donation_certificate.email_template_donation_certificate' - ) + return 'donation_certificate.email_template_donation_certificate' diff --git a/donation_certificate/models/donation_tax_receipt.py b/donation_certificate/models/donation_tax_receipt.py index bb0fe87f9..e73a03015 100644 --- a/donation_certificate/models/donation_tax_receipt.py +++ b/donation_certificate/models/donation_tax_receipt.py @@ -1,4 +1,4 @@ -from odoo import _, fields, models, api +from odoo import _, api, fields, models from odoo.tools import get_lang @@ -9,12 +9,21 @@ class DonationTaxReceipt(models.Model): help="This field automatically becomes active when " "the thanks letter has been send.", ) - attachment_ids = fields.One2many('ir.attachment', 'res_id', domain=[('res_model', '=', 'donation.tax.receipt')], string='Attachments') + attachment_ids = fields.One2many( + "ir.attachment", + "res_id", + domain=[("res_model", "=", "donation.tax.receipt")], + string="Attachments", + ) amount_donation = fields.Monetary(tracking=True, compute="_compute_amounts") - amount_donation_in_kind_consu = fields.Monetary(tracking=True, compute="_compute_amounts") - amount_donation_in_kind_service = fields.Monetary(tracking=True, compute="_compute_amounts") + amount_donation_in_kind_consu = fields.Monetary( + tracking=True, compute="_compute_amounts" + ) + amount_donation_in_kind_service = fields.Monetary( + tracking=True, compute="_compute_amounts" + ) - @api.depends('donation_ids') + @api.depends("donation_ids") def _compute_amounts(self): for rec in self: amount_donation = 0 @@ -22,61 +31,70 @@ def _compute_amounts(self): amount_donation_in_kind_service = 0 for donation in rec.donation_ids: for line in donation.line_ids: - if line.product_id.detailed_type == 'donation': + if line.product_id.detailed_type == "donation": amount_donation = amount_donation + line.amount - elif line.product_id.detailed_type == 'donation_in_kind_consu': + elif line.product_id.detailed_type == "donation_in_kind_consu": amount_donation_in_kind_consu = amount_donation_in_kind_consu + line.amount else: amount_donation_in_kind_service = amount_donation_in_kind_service + line.amount rec.amount_donation = round(amount_donation, 2) rec.amount_donation_in_kind_consu = round(amount_donation_in_kind_consu, 2) - rec.amount_donation_in_kind_service = round(amount_donation_in_kind_service, 2) + rec.amount_donation_in_kind_service = round( + amount_donation_in_kind_service, 2 + ) def action_send_tax_receipt(self): self.write({"is_certificate_send": True}) template = self.env.ref(self._get_mail_template(), raise_if_not_found=False) - compose_form = self.env.ref('donation_certificate.donation_certificate_send_wizard_form', raise_if_not_found=False) + compose_form = self.env.ref( + "donation_certificate.donation_certificate_send_wizard_form", + raise_if_not_found=False, + ) ctx = dict( - default_model='donation.tax.receipt', - default_res_model='donation.tax.receipt', + default_model="donation.tax.receipt", + default_res_model="donation.tax.receipt", default_use_template=bool(template), default_template_id=template and template.id or False, - default_composition_mode='comment', + default_composition_mode="comment", mark_invoice_as_sent=True, default_email_layout_xmlid="mail.mail_notification_layout_with_responsible_signature", force_email=True, active_ids=self.ids, ) report_action = { - 'name': _('Send Certificate'), - 'type': 'ir.actions.act_window', - 'view_type': 'form', - 'view_mode': 'form', - 'res_model': 'donation.certificate.send', - 'views': [(compose_form.id, 'form')], - 'view_id': compose_form.id, - 'target': 'new', - 'context': ctx, + "name": _("Send Certificate"), + "type": "ir.actions.act_window", + "view_type": "form", + "view_mode": "form", + "res_model": "donation.certificate.send", + "views": [(compose_form.id, "form")], + "view_id": compose_form.id, + "target": "new", + "context": ctx, } return report_action def get_ref_report_name(self, lang): report_names = { - 'es_ES': "donation_certificate.donation_certificate_report_py3o_ES", - 'ca_ES': "donation_certificate.donation_certificate_report_py3o_CAT", - 'fr_FR': "donation_certificate.donation_certificate_report_py3o_FR", - 'en_GB': "donation_certificate.donation_certificate_report_py3o_EN" + "es_ES": "donation_certificate.donation_certificate_report_py3o_ES", + "ca_ES": "donation_certificate.donation_certificate_report_py3o_CAT", + "fr_FR": "donation_certificate.donation_certificate_report_py3o_FR", + "en_GB": "donation_certificate.donation_certificate_report_py3o_EN", } - return report_names.get(lang, "donation_certificate.donation_certificate_report_py3o_EN") + return report_names.get( + lang, "donation_certificate.donation_certificate_report_py3o_EN" + ) def action_print_tax_receipt(self): - """ Print the certificate and mark it as sent, so that we can see more - easily the next step of the workflow + """Print the certificate and mark it as sent, so that we can see more + easily the next step of the workflow """ today = fields.Date.context_today(self) self.write({"print_date": today}) - self.filtered(lambda inv: not inv.is_certificate_send).write({'is_certificate_send': True}) + self.filtered(lambda inv: not inv.is_certificate_send).write( + {"is_certificate_send": True} + ) lang = get_lang(self.env).code report_action_py3o = self.get_ref_report_name(lang) return self.env.ref(report_action_py3o).report_action(self) @@ -85,6 +103,5 @@ def _get_mail_template(self): """ :return: the correct mail template based on the current move type """ - return ( - 'donation_certificate.email_template_donation_certificate' - ) + return "donation_certificate.email_template_donation_certificate" + \ No newline at end of file diff --git a/donation_certificate/models/py3o_template.py b/donation_certificate/models/py3o_template.py index b94c0e01d..23959d5b5 100644 --- a/donation_certificate/models/py3o_template.py +++ b/donation_certificate/models/py3o_template.py @@ -1,7 +1,7 @@ -from odoo import fields, models, api from base64 import b64encode # import sys import pkg_resources +from odoo import api, fields, models # import os @@ -22,13 +22,13 @@ class Py3oTemplate(models.Model): def create(self, vals_list): module = "donation_certificate" vals = vals_list[0] - if vals['py3o_template_fallback']: + if vals["py3o_template_fallback"]: flbk_filename = pkg_resources.resource_filename( - "odoo.addons.%s" % module, vals['py3o_template_fallback'] + "odoo.addons.%s" % module, vals["py3o_template_fallback"] ) with open(flbk_filename, "rb") as tmpl: tmpl_data = b64encode(tmpl.read()) - vals['py3o_template_data'] = tmpl_data + vals["py3o_template_data"] = tmpl_data # if not rec.py3o_template_data: # rec.py3o_template_data = False return super().create([vals]) diff --git a/donation_certificate/views/donation_certificate_send_views.xml b/donation_certificate/views/donation_certificate_send_views.xml index 1070813b8..b7bf48f92 100644 --- a/donation_certificate/views/donation_certificate_send_views.xml +++ b/donation_certificate/views/donation_certificate_send_views.xml @@ -1,29 +1,33 @@ - + donation.certificate.send.form donation.certificate.send - +
- - + + - +
- -
+
Preview as a PDF
-
@@ -32,34 +36,99 @@
- - -
+
+ +
- - + + - +
-
diff --git a/donation_certificate/views/donation_send_cert_button.xml b/donation_certificate/views/donation_send_cert_button.xml index c67f1f933..6f274f805 100644 --- a/donation_certificate/views/donation_send_cert_button.xml +++ b/donation_certificate/views/donation_send_cert_button.xml @@ -1,13 +1,13 @@ - + donation.form.view.form.inherit donation.donation - + - + @@ -28,8 +28,8 @@ Send Certificate - - + + code @@ -41,7 +41,7 @@ donation.donation.tree.inherited donation.donation - + diff --git a/donation_certificate/views/py3o_certificate_report.xml b/donation_certificate/views/py3o_certificate_report.xml index 69948e3ea..9532c8cfc 100644 --- a/donation_certificate/views/py3o_certificate_report.xml +++ b/donation_certificate/views/py3o_certificate_report.xml @@ -1,4 +1,4 @@ - + @@ -7,9 +7,11 @@ py3o_donation_certificate_ES py3o pdf - - 'Fiscal_receipt-'+(object.number or '').replace('/','') - + + 'Fiscal_receipt-'+(object.number or '').replace('/','') + @@ -19,9 +21,11 @@ py3o_donation_certificate_CAT py3o pdf - - 'Fiscal_receipt-'+(object.number or '').replace('/','') - + + 'Fiscal_receipt-'+(object.number or '').replace('/','') + @@ -30,9 +34,11 @@ py3o_donation_certificate_FR py3o pdf - - 'Fiscal_receipt-'+(object.number or '').replace('/','') - + + 'Fiscal_receipt-'+(object.number or '').replace('/','') + @@ -41,15 +47,20 @@ py3o_donation_certificate_EN py3o pdf - - 'Fiscal_receipt-'+(object.number or '').replace('/','') - + + 'Fiscal_receipt-'+(object.number or '').replace('/','') + py3o.template.view.form.inherit py3o.template - + diff --git a/donation_certificate/views/tax_receipt_donation.xml b/donation_certificate/views/tax_receipt_donation.xml index 0b816fd58..2981bfe85 100644 --- a/donation_certificate/views/tax_receipt_donation.xml +++ b/donation_certificate/views/tax_receipt_donation.xml @@ -1,13 +1,19 @@ - + donation.tax.receipt.view.form.inherit donation.tax.receipt - +
-
@@ -15,9 +21,12 @@ donation.tax.receipt.view.form.inherit donation.tax.receipt - + - + 1 diff --git a/donation_certificate/wizard/donation_certificate_send.py b/donation_certificate/wizard/donation_certificate_send.py index 6eaad7256..975cdba20 100644 --- a/donation_certificate/wizard/donation_certificate_send.py +++ b/donation_certificate/wizard/donation_certificate_send.py @@ -1,62 +1,88 @@ -from odoo import api, fields, models, _ -from odoo.addons.mail.wizard.mail_compose_message import _reopen +from odoo import _, api, fields, models from odoo.exceptions import UserError from odoo.tools.misc import get_lang +from odoo.addons.mail.wizard.mail_compose_message import _reopen + class DonationCertificateSend(models.TransientModel): - _name = 'donation.certificate.send' - _inherits = {'mail.compose.message': 'composer_id'} - _description = 'Donation Certificate Send' - - is_email = fields.Boolean('Email', default=lambda self: self.env.company.invoice_is_email) - donation_without_email = fields.Text(compute='_compute_donation_without_email', string='Donation(s) that will not be sent') - is_print = fields.Boolean('Print', default=lambda self: self.env.company.invoice_is_print) - printed = fields.Boolean('Is Printed', default=False) - tax_receipt_ids = fields.Many2many('donation.tax.receipt', 'donation_tax_receipt_donation_certificate_send_rel', string='Donations Tax Receipt') - composer_id = fields.Many2one('mail.compose.message', required=True, ondelete='cascade') - template_id = fields.Many2one('mail.template', 'Use template', domain="[('model', '=', 'donation.tax.receipt'), ]", default=lambda self: self._get_report_template()) + _name = "donation.certificate.send" + _inherits = {"mail.compose.message": "composer_id"} + _description = "Donation Certificate Send" + + is_email = fields.Boolean( + "Email", default=lambda self: self.env.company.invoice_is_email + ) + donation_without_email = fields.Text( + compute="_compute_donation_without_email", + string="Donation(s) that will not be sent", + ) + is_print = fields.Boolean( + "Print", default=lambda self: self.env.company.invoice_is_print + ) + printed = fields.Boolean("Is Printed", default=False) + tax_receipt_ids = fields.Many2many( + "donation.tax.receipt", + "donation_tax_receipt_donation_certificate_send_rel", + string="Donations Tax Receipt", + ) + composer_id = fields.Many2one( + "mail.compose.message", required=True, ondelete="cascade" + ) + template_id = fields.Many2one( + "mail.template", + "Use template", + domain="[("model", "=", "donation.tax.receipt"), ]", + default=lambda self: self._get_report_template(), + ) def _get_report_template(self): - template = self.env.ref('donation_certificate.email_template_donation_certificate', raise_if_not_found=False) + template = self.env.ref( + "donation_certificate.email_template_donation_certificate", + raise_if_not_found=False, + ) return template.id or False @api.model def default_get(self, fields): res = super(DonationCertificateSend, self).default_get(fields) - res_ids = self._context.get('active_ids') + res_ids = self._context.get("active_ids") - tax_receipts = self.env['donation.tax.receipt'].browse(res_ids) + tax_receipts = self.env["donation.tax.receipt"].browse(res_ids) if not tax_receipts: raise UserError(_("You can only send invoices.")) - composer = self.env['mail.compose.message'].create({ - 'composition_mode': 'comment' if len(res_ids) == 1 else 'mass_mail', + composer = self.env["mail.compose.message"].create({ + "composition_mode": "comment" if len(res_ids) == 1 else "mass_mail", }) res.update({ - 'tax_receipt_ids': res_ids, - 'composer_id': composer.id, + "tax_receipt_ids": res_ids, + "composer_id": composer.id, }) return res - @api.onchange('tax_receipt_ids') + @api.onchange("tax_receipt_ids") def _compute_composition_mode(self): for wizard in self: - wizard.composer_id.composition_mode = 'comment' if len(wizard.tax_receipt_ids) == 1 else 'mass_mail' + wizard.composer_id.composition_mode = ( + "comment" if len(wizard.tax_receipt_ids) == 1 else "mass_mail" + ) def get_ref_report_name(self, wizard_template_id_lang): lang = list(wizard_template_id_lang.values())[0] report_names = { - 'es_ES': "donation_certificate.donation_certificate_report_py3o_ES", - 'ca_ES': "donation_certificate.donation_certificate_report_py3o_CAT", - 'fr_FR': "donation_certificate.donation_certificate_report_py3o_FR", - 'en_GB': "donation_certificate.donation_certificate_report_py3o_EN" + "es_ES": "donation_certificate.donation_certificate_report_py3o_ES", + "ca_ES": "donation_certificate.donation_certificate_report_py3o_CAT", + "fr_FR": "donation_certificate.donation_certificate_report_py3o_FR", + "en_GB": "donation_certificate.donation_certificate_report_py3o_EN" } - report_name = report_names.get(lang, "donation_certificate.donation_certificate_report_py3o_EN") + report_name = report_names.get( + lang, "donation_certificate.donation_certificate_report_py3o_EN" + ) return self.env.ref(report_name, raise_if_not_found=False).id - @api.onchange('template_id') + @api.onchange("template_id") def onchange_template_id(self): for wizard in self: if wizard.composer_id: @@ -65,42 +91,49 @@ def onchange_template_id(self): lang_object = wizard.template_id.lang render_model = wizard.template_id.render_model res_ids = wizard.tax_receipt_ids.ids - lang = wizard.template_id._render_template(lang_object, render_model, res_ids) + lang = wizard.template_id._render_template( + lang_object, render_model, res_ids + ) wizard.template_id.report_template = self.get_ref_report_name(lang) wizard.composer_id.template_id = wizard.template_id.id # Get different report depending on the lang - wizard.composer_id.template_id.report_template = self.get_ref_report_name(lang) + wizard.composer_id.template_id.report_template = ( + self.get_ref_report_name(lang) + ) wizard._compute_composition_mode() wizard.composer_id._onchange_template_id_wrapper() - @api.onchange('is_email') + @api.onchange("is_email") def onchange_is_email(self): if self.is_email: - res_ids = self._context.get('active_ids') + res_ids = self._context.get("active_ids") data = { - 'composition_mode': 'comment' if len(res_ids) == 1 else 'mass_mail', - 'template_id': self.template_id.id + "composition_mode": "comment" if len(res_ids) == 1 else "mass_mail", + "template_id": self.template_id.id } if not self.composer_id: - self.composer_id = self.env['mail.compose.message'].create(data) + self.composer_id = self.env["mail.compose.message"].create(data) else: self.composer_id.write(data) self._compute_composition_mode() self.composer_id._onchange_template_id_wrapper() - @api.onchange('is_email') + @api.onchange("is_email") def _compute_donation_without_email(self): for wizard in self: if wizard.is_email and len(wizard.tax_receipt_ids) > 1: - tax_receipts = self.env['donation.tax.receipt'].search([ - ('id', 'in', self.env.context.get('active_ids')), - ('partner_id.email', '=', False) + tax_receipts = self.env["donation.tax.receipt"].search([ + ("id", "in", self.env.context.get("active_ids")), + ("partner_id.email", "=", False) ]) if tax_receipts: wizard.donation_without_email = "%s\n%s" % ( - _("The following donation(s) will not be sent by email, because the customers don't have email address."), - "\n".join([i.number for i in tax_receipts])) + _( + "The following donation(s) will not be sent by email, because the customers don't have email address." + ), + "\n".join([i.number for i in tax_receipts]), + ) else: wizard.donation_without_email = False else: @@ -108,21 +141,27 @@ def _compute_donation_without_email(self): def _send_email(self): if self.is_email: - self.composer_id.with_context(no_new_invoice=True, - mail_notify_author=self.env.user.partner_id in self.composer_id.partner_ids, - mailing_document_based=True, - )._action_send_mail() + self.composer_id.with_context( + no_new_invoice=True, + mail_notify_author=self.env.user.partner_id + in self.composer_id.partner_ids, + mailing_document_based=True, + )._action_send_mail() for tax_receipt in self.tax_receipt_ids: - prioritary_attachments = tax_receipt.attachment_ids.filtered(lambda x: x.mimetype.endswith('pdf')) + prioritary_attachments = tax_receipt.attachment_ids.filtered( + lambda x: x.mimetype.endswith("pdf") + ) if prioritary_attachments: - tax_receipt.with_context(tracking_disable=True).sudo().write({'message_main_attachment_id': prioritary_attachments[0].id}) + tax_receipt.with_context(tracking_disable=True).sudo().write( + {"message_main_attachment_id": prioritary_attachments[0].id} + ) def _print_certificate_document(self): - """ to override for each type of models that will use this composer.""" + """to override for each type of models that will use this composer.""" self.ensure_one() action = self.tax_receipt_ids.action_print_tax_receipt() - action.update({'close_on_report_download': True}) + action.update({"close_on_report_download": True}) return action def send_and_print_action(self): @@ -131,10 +170,10 @@ def send_and_print_action(self): # This should ideally be fixed in mail_compose_message, so when a fix is made there this whole commit should be reverted. # basically self.body (which could be manually edited) extracts self.template_id, # which is then not translated for each customer. - if self.composition_mode == 'mass_mail' and self.template_id: - active_ids = self.env.context.get('active_ids', self.res_id) + if self.composition_mode == "mass_mail" and self.template_id: + active_ids = self.env.context.get("active_ids", self.res_id) active_records = self.env[self.model].browse(active_ids) - langs = set(active_records.mapped('partner_id.lang')) + langs = set(active_records.mapped("partner_id.lang")) for lang in langs: active_ids_lang = active_records.filtered(lambda r: r.partner_id.lang == lang).ids self_lang = self.with_context(active_ids=active_ids_lang, lang=get_lang(self.env, lang).code) @@ -146,19 +185,19 @@ def send_and_print_action(self): self.with_context(lang=lang)._send_email() if self.is_print: return self._print_document() - return {'type': 'ir.actions.act_window_close'} + return {"type": "ir.actions.act_window_close"} def save_as_template(self): self.ensure_one() self.composer_id.action_save_as_template() self.template_id = self.composer_id.template_id.id action = _reopen(self, self.id, self.model, context=self._context) - action.update({'name': _('Send Certificate')}) + action.update({"name": _("Send Certificate")}) return action def _print_document(self): """ to override for each type of models that will use this composer.""" self.ensure_one() action = self.tax_receipt_ids.action_print_tax_receipt() - action.update({'close_on_report_download': True}) + action.update({"close_on_report_download": True}) return action diff --git a/donation_certificate/wizard/tax_receipt_print.py b/donation_certificate/wizard/tax_receipt_print.py index 70a2c53ea..f2df9b3f6 100644 --- a/donation_certificate/wizard/tax_receipt_print.py +++ b/donation_certificate/wizard/tax_receipt_print.py @@ -6,7 +6,6 @@ from odoo import _, fields, models from odoo.exceptions import UserError from odoo.tools import get_lang -import wdb class DonationTaxReceiptPrint(models.TransientModel): @@ -14,7 +13,12 @@ class DonationTaxReceiptPrint(models.TransientModel): _description = "Print Donation Tax Receipts" lang = fields.Selection( - [("es_ES", "Spanish"), ("ca_ES", "Catalan"), ("fr_FR", "French"), ("en_GB", "English")], + [ + ("es_ES", "Spanish"), + ("ca_ES", "Catalan"), + ("fr_FR", "French"), + ("en_GB", "English"), + ], # readonly=True, # copy=False, # default="draft", @@ -37,10 +41,12 @@ def print_receipts(self): def get_ref_report_name(self, lang): report_names = { - 'es_ES': "donation_certificate.donation_certificate_report_py3o_ES", - 'ca_ES': "donation_certificate.donation_certificate_report_py3o_CAT", - 'fr_FR': "donation_certificate.donation_certificate_report_py3o_FR", - 'en_GB': "donation_certificate.donation_certificate_report_py3o_EN" + "es_ES": "donation_certificate.donation_certificate_report_py3o_ES", + "ca_ES": "donation_certificate.donation_certificate_report_py3o_CAT", + "fr_FR": "donation_certificate.donation_certificate_report_py3o_FR", + "en_GB": "donation_certificate.donation_certificate_report_py3o_EN", } - return report_names.get(lang, "donation_certificate.donation_certificate_report_py3o_EN") + return report_names.get( + lang, "donation_certificate.donation_certificate_report_py3o_EN" + ) diff --git a/donation_certificate/wizard/tax_receipt_print_view.xml b/donation_certificate/wizard/tax_receipt_print_view.xml index fd19b4a56..3a3217aee 100644 --- a/donation_certificate/wizard/tax_receipt_print_view.xml +++ b/donation_certificate/wizard/tax_receipt_print_view.xml @@ -9,22 +9,22 @@ donation_tax_receipt_print.form.inherit donation.tax.receipt.print - + 1 - + - - - - - + + + + + diff --git a/donation_letter/__manifest__.py b/donation_letter/__manifest__.py index 07b66164f..27fad26db 100644 --- a/donation_letter/__manifest__.py +++ b/donation_letter/__manifest__.py @@ -10,7 +10,7 @@ "author": "Brenda Fernández Alayo", "license": "AGPL-3", "installable": True, - "depends": ['donation', 'account', 'mail', 'donation_base'], + "depends": ["donation", "account", "mail", "donation_base"], "data": [ "security/ir.model.access.csv", "data/mail_template.xml", diff --git a/donation_letter/data/mail_template.xml b/donation_letter/data/mail_template.xml index 8a6c9bdc4..9400e6968 100644 --- a/donation_letter/data/mail_template.xml +++ b/donation_letter/data/mail_template.xml @@ -4,7 +4,7 @@ Donation: Thanks Letter by email - + {{ object.company_id.email }} {{ object.partner_id.email }} Thank you for your donation @@ -14,9 +14,11 @@

Dear - Brandon Freeman - ( - Azure Interior + Brandon Freeman + ( + Azure Interior ), @@ -25,7 +27,10 @@

We want to express our sincere gratitude for your generous donation of - $ 143,750.00 + $ 143,750.00 to our organization. This contribution is a testament to your commitment and trust in our work.

@@ -37,7 +42,7 @@
-- -
+
Association name

diff --git a/donation_letter/models/donation.py b/donation_letter/models/donation.py index 6505c5e15..6d021ccdb 100644 --- a/donation_letter/models/donation.py +++ b/donation_letter/models/donation.py @@ -11,10 +11,10 @@ class Donation(models.Model): "the thanks letter has been send.", ) attachment_ids = fields.One2many( - comodel_name='ir.attachment', - inverse_name='res_id', - domain=[('res_model', '=', 'donation.donation')], - string='Attachments' + comodel_name="ir.attachment", + inverse_name="res_id", + domain=[("res_model", "=", "donation.donation")], + string="Attachments", ) def action_send_thanks(self): @@ -27,46 +27,47 @@ def action_send_thanks(self): if not lang: lang = get_lang(self.env).code - compose_form = self.env.ref('donation_letter.donation_letter_send_wizard_form', raise_if_not_found=False) - + compose_form = self.env.ref( + "donation_letter.donation_letter_send_wizard_form", raise_if_not_found=False + ) ctx = { - 'default_model': 'donation.donation', - 'default_res_model': 'donation.donation', - 'default_use_template': bool(template), - 'default_template_id': template and template.id or False, - 'default_composition_mode': 'comment', - 'mark_invoice_as_sent': True, - 'default_email_layout_xmlid': "mail.mail_notification_layout_with_responsible_signature", - 'force_email': True, - 'active_ids': self.ids, + "default_model": "donation.donation", + "default_res_model": "donation.donation", + "default_use_template": bool(template), + "default_template_id": template and template.id or False, + "default_composition_mode": "comment", + "mark_invoice_as_sent": True, + "default_email_layout_xmlid": "mail.mail_notification_layout_with_responsible_signature", + "force_email": True, + "active_ids": self.ids, } report_action = { - 'name': _('Send Thanks Letter'), - 'type': 'ir.actions.act_window', - 'view_type': 'form', - 'view_mode': 'form', - 'res_model': 'donation.letter.send', - 'views': [(compose_form.id, 'form')], - 'view_id': compose_form.id, - 'target': 'new', - 'context': ctx, + "name": _("Send Thanks Letter"), + "type": "ir.actions.act_window", + "view_type": "form", + "view_mode": "form", + "res_model": "donation.letter.send", + "views": [(compose_form.id, "form")], + "view_id": compose_form.id, + "target": "new", + "context": ctx, } return report_action def action_donation_print(self): - """ Print the donation and mark it as sent, so that we can see more - easily the next step of the workflow + """Print the donation and mark it as sent, so that we can see more + easily the next step of the workflow """ - self.filtered(lambda inv: not inv.is_thanks_letter_send).write({'is_thanks_letter_send': True}) - return self.env.ref('donation.report_thanks').report_action(self) + self.filtered(lambda inv: not inv.is_thanks_letter_send).write( + {"is_thanks_letter_send": True} + ) + return self.env.ref("donation.report_thanks").report_action(self) def _get_mail_template(self): """ :return: the correct mail template based on the current move type """ - return ( - 'donation_letter.email_template_thanks_letter' - ) + return "donation_letter.email_template_thanks_letter" diff --git a/donation_letter/views/donation_letter_send_views.xml b/donation_letter/views/donation_letter_send_views.xml index bb931ecc7..4c50798fe 100644 --- a/donation_letter/views/donation_letter_send_views.xml +++ b/donation_letter/views/donation_letter_send_views.xml @@ -1,4 +1,4 @@ - + donation.letter.send.form @@ -7,59 +7,132 @@
- - + + - +
- -
+
Preview as a PDF
-
-
+
- - +
- - + + - - +
-
diff --git a/donation_letter/views/donation_send_button.xml b/donation_letter/views/donation_send_button.xml index 6e84f3471..34753e6e1 100644 --- a/donation_letter/views/donation_send_button.xml +++ b/donation_letter/views/donation_send_button.xml @@ -1,22 +1,26 @@ - + donation.form.view.form.inherit donation.donation - + - - - + 1 @@ -24,8 +28,8 @@ Send Thanks Letter - - + + code if records: diff --git a/donation_letter/wizard/donation_letter_send.py b/donation_letter/wizard/donation_letter_send.py index 844bac6d0..7faded77a 100644 --- a/donation_letter/wizard/donation_letter_send.py +++ b/donation_letter/wizard/donation_letter_send.py @@ -1,46 +1,68 @@ -from odoo import api, fields, models, _ -from odoo.addons.mail.wizard.mail_compose_message import _reopen +from odoo import _, api, fields, models from odoo.exceptions import UserError from odoo.tools.misc import get_lang +from odoo.addons.mail.wizard.mail_compose_message import _reopen + class DonationLeterSend(models.TransientModel): - _name = 'donation.letter.send' - _inherits = {'mail.compose.message': 'composer_id'} - _description = 'Donation Thanks Letter Send' - - is_email = fields.Boolean('Email', default=lambda self: self.env.company.invoice_is_email) - donation_without_email = fields.Text(compute='_compute_donation_without_email', string='donation(s) that will not be sent') - is_print = fields.Boolean('Print', default=lambda self: self.env.company.invoice_is_print) - printed = fields.Boolean('Is Printed', default=False) - donation_ids = fields.Many2many('donation.donation', 'donation_donation_donation_letter_send_rel', string='Donations') - composer_id = fields.Many2one('mail.compose.message', string='Composer', required=True, ondelete='cascade') - template_id = fields.Many2one('mail.template', 'Use template', domain="[('model', '=', 'donation.donation')]") + _name = "donation.letter.send" + _inherits = {"mail.compose.message": "composer_id"} + _description = "Donation Thanks Letter Send" + + is_email = fields.Boolean( + "Email", default=lambda self: self.env.company.invoice_is_email + ) + donation_without_email = fields.Text( + compute="_compute_donation_without_email", + string="donation(s) that will not be sent", + ) + is_print = fields.Boolean( + "Print", default=lambda self: self.env.company.invoice_is_print + ) + printed = fields.Boolean("Is Printed", default=False) + donation_ids = fields.Many2many( + "donation.donation", + "donation_donation_donation_letter_send_rel", + string="Donations", + ) + composer_id = fields.Many2one( + "mail.compose.message", string="Composer", required=True, ondelete="cascade" + ) + template_id = fields.Many2one( + "mail.template", "Use template", domain="[('model', '=', 'donation.donation')]" + ) @api.model def default_get(self, fields): res = super(DonationLeterSend, self).default_get(fields) - res_ids = self._context.get('active_ids') + res_ids = self._context.get("active_ids") - donations = self.env['donation.donation'].browse(res_ids) + donations = self.env["donation.donation"].browse(res_ids) if not donations: raise UserError(_("You can only send invoices.")) - composer = self.env['mail.compose.message'].create({ - 'composition_mode': 'comment' if len(res_ids) == 1 else 'mass_mail', - }) - res.update({ - 'donation_ids': res_ids, - 'composer_id': composer.id, - }) + composer = self.env["mail.compose.message"].create( + { + "composition_mode": "comment" if len(res_ids) == 1 else "mass_mail", + } + ) + res.update( + { + "donation_ids": res_ids, + "composer_id": composer.id, + } + ) return res - @api.onchange('donation_ids') + @api.onchange("donation_ids") def _compute_composition_mode(self): for wizard in self: - wizard.composer_id.composition_mode = 'comment' if len(wizard.donation_ids) == 1 else 'mass_mail' + wizard.composer_id.composition_mode = ( + "comment" if len(wizard.donation_ids) == 1 else "mass_mail" + ) - @api.onchange('template_id') + @api.onchange("template_id") def onchange_template_id(self): for wizard in self: if wizard.composer_id: @@ -48,33 +70,44 @@ def onchange_template_id(self): wizard._compute_composition_mode() wizard.composer_id._onchange_template_id_wrapper() - @api.onchange('is_email') + @api.onchange("is_email") def onchange_is_email(self): if self.is_email: - res_ids = self._context.get('active_ids') + res_ids = self._context.get("active_ids") if not self.composer_id: - self.composer_id = self.env['mail.compose.message'].create({ - 'composition_mode': 'comment' if len(res_ids) == 1 else 'mass_mail', - 'template_id': self.template_id.id - }) + self.composer_id = self.env["mail.compose.message"].create( + { + "composition_mode": "comment" + if len(res_ids) == 1 + else "mass_mail", + "template_id": self.template_id.id, + } + ) else: - self.composer_id.composition_mode = 'comment' if len(res_ids) == 1 else 'mass_mail' + self.composer_id.composition_mode = ( + "comment" if len(res_ids) == 1 else "mass_mail" + ) self.composer_id.template_id = self.template_id.id self._compute_composition_mode() self.composer_id._onchange_template_id_wrapper() - @api.onchange('is_email') + @api.onchange("is_email") def _compute_donation_without_email(self): for wizard in self: if wizard.is_email and len(wizard.donation_ids) > 1: - donations = self.env['donation.donation'].search([ - ('id', 'in', self.env.context.get('active_ids')), - ('partner_id.email', '=', False) - ]) + donations = self.env["donation.donation"].search( + [ + ("id", "in", self.env.context.get("active_ids")), + ("partner_id.email", "=", False), + ] + ) if donations: wizard.donation_without_email = "%s\n%s" % ( - _("The following donation(s) will not be sent by email, because the customers don't have email address."), - "\n".join([i.name for i in donations])) + _( + "The following donation(s) will not be sent by email, because the customers don't have email address." + ), + "\n".join([i.name for i in donations]), + ) else: wizard.donation_without_email = False else: @@ -83,22 +116,28 @@ def _compute_donation_without_email(self): def _send_email(self): if self.is_email: # with_context : we don't want to reimport the file we just exported. - self.composer_id.with_context(no_new_invoice=True, - mail_notify_author=self.env.user.partner_id in self.composer_id.partner_ids, - mailing_document_based=True, - )._action_send_mail() + self.composer_id.with_context( + no_new_invoice=True, + mail_notify_author=self.env.user.partner_id + in self.composer_id.partner_ids, + mailing_document_based=True, + )._action_send_mail() for donation in self.donation_ids: - prioritary_attachments = donation.attachment_ids.filtered(lambda x: x.mimetype.endswith('pdf')) + prioritary_attachments = donation.attachment_ids.filtered( + lambda x: x.mimetype.endswith("pdf") + ) if prioritary_attachments: - donation.with_context(tracking_disable=True).sudo().write({'message_main_attachment_id': prioritary_attachments[0].id}) + donation.with_context(tracking_disable=True).sudo().write( + {"message_main_attachment_id": prioritary_attachments[0].id} + ) donation.sudo().write({"is_thanks_letter_send": True}) def _print_document(self): - """ to override for each type of models that will use this composer.""" + """to override for each type of models that will use this composer.""" self.ensure_one() action = self.donation_ids.action_donation_print() - action.update({'close_on_report_download': True}) + action.update({"close_on_report_download": True}) return action def send_and_print_action(self): @@ -107,13 +146,17 @@ def send_and_print_action(self): # This should ideally be fixed in mail_compose_message, so when a fix is made there this whole commit should be reverted. # basically self.body (which could be manually edited) extracts self.template_id, # which is then not translated for each customer. - if self.composition_mode == 'mass_mail' and self.template_id: - active_ids = self.env.context.get('active_ids', self.res_id) + if self.composition_mode == "mass_mail" and self.template_id: + active_ids = self.env.context.get("active_ids", self.res_id) active_records = self.env[self.model].browse(active_ids) - langs = set(active_records.mapped('partner_id.lang')) + langs = set(active_records.mapped("partner_id.lang")) for lang in langs: - active_ids_lang = active_records.filtered(lambda r: r.partner_id.lang == lang).ids - self_lang = self.with_context(active_ids=active_ids_lang, lang=get_lang(self.env, lang).code) + active_ids_lang = active_records.filtered( + lambda r: r.partner_id.lang == lang + ).ids + self_lang = self.with_context( + active_ids=active_ids_lang, lang=get_lang(self.env, lang).code + ) self_lang.onchange_template_id() self_lang._send_email() else: @@ -122,12 +165,12 @@ def send_and_print_action(self): self.with_context(lang=lang)._send_email() if self.is_print: return self._print_document() - return {'type': 'ir.actions.act_window_close'} + return {"type": "ir.actions.act_window_close"} def save_as_template(self): self.ensure_one() self.composer_id.action_save_as_template() self.template_id = self.composer_id.template_id.id action = _reopen(self, self.id, self.model, context=self._context) - action.update({'name': _('Send Thanks Letter')}) + action.update({"name": _("Send Thanks Letter")}) return action diff --git a/donation_summary/data/mail_template.xml b/donation_summary/data/mail_template.xml index 53081b886..79c09829c 100644 --- a/donation_summary/data/mail_template.xml +++ b/donation_summary/data/mail_template.xml @@ -11,35 +11,43 @@ Donation Summary
-

Dear - Brandon Freeman,
-
We want to express our sincere gratitude for your suport and generosity towards our mission. -
We are pleased to inform you that attached you will find a detailed summary of all - the donations you have made from 01/01/2023 - to 31/12/2023. +

Dear + Brandon Freeman,
+
We want to express our sincere gratitude for your suport and generosity towards our mission. +
We are pleased to inform you that attached you will find a detailed summary of all + the donations you have made from 01/01/2023 + to 31/12/2023.
-
This summary includes the date and amount of each contribution, allowing you to have a - clear overview of your impact on our organization. +
This summary includes the date and amount of each contribution, allowing you to have a + clear overview of your impact on our organization.
-
The total amount of your donations during this period add up to The total amount of your donations during this period add up to $ + t-out="format_amount(object.amount_total, object.currency_id) or ''" + >$ 143,750.00.

-
If you would like more details or have any questions about your donation history, +
If you would like more details or have any questions about your donation history, please fell free to contact us.

Cordially,

- + Association name

{{ object.partner_id.lang }} - + RDS_{{ (object.name or '') }}
-
\ No newline at end of file + diff --git a/donation_summary/models/donation.py b/donation_summary/models/donation.py index 5165ed4a4..ab40f82cf 100644 --- a/donation_summary/models/donation.py +++ b/donation_summary/models/donation.py @@ -5,5 +5,5 @@ class Donation(models.Model): _inherit = "donation.donation" donation_summary_id = fields.Many2one( - string="Donation Summary", - comodel_name='donation.summary') + string="Donation Summary", comodel_name="donation.summary" + ) diff --git a/donation_summary/models/donation_summary.py b/donation_summary/models/donation_summary.py index 7b33a4f9f..b259e7a03 100644 --- a/donation_summary/models/donation_summary.py +++ b/donation_summary/models/donation_summary.py @@ -1,7 +1,9 @@ -from odoo import _, fields, models, api +import datetime + +from odoo import _, api, fields, models from odoo.exceptions import UserError from odoo.tools.misc import get_lang -import datetime + class DonationSummary(models.Model): @@ -29,15 +31,17 @@ def _default_start_date(self): states={"sent": [("readonly", True)]}, tracking=True, ondelete="restrict", - domain="[('donation_ids', '!=', False)]" + domain="[('donation_ids', '!=', False)]", ) start_date = fields.Date( - required=True, default=lambda self: self._default_start_date(), - states={"sent": [("readonly", True)]} + required=True, + default=lambda self: self._default_start_date(), + states={"sent": [("readonly", True)]}, ) end_date = fields.Date( - required=True, default=lambda self: self._default_end_date(), - states={"sent": [("readonly", True)]} + required=True, + default=lambda self: self._default_end_date(), + states={"sent": [("readonly", True)]}, ) donation_ids = fields.One2many( @@ -77,23 +81,31 @@ def _default_start_date(self): default=lambda self: self.env.company.currency_id, ) attachment_ids = fields.One2many( - 'ir.attachment', - 'res_id', - domain=[('res_model', '=', 'donation.summary')], - string='Attachments' + "ir.attachment", + "res_id", + domain=[("res_model", "=", "donation.summary")], + string="Attachments", ) def _compute_name(self): for rec in self: - rec.name = (rec.partner_id.name).replace(" ", "") + "_" + str(rec.start_date).replace("-", "") + "_" + str(rec.end_date).replace("-", "") if rec.partner_id else "" + rec.name = ( + (rec.partner_id.name).replace(" ", "") + + "_" + + str(rec.start_date).replace("-", "") + + "_" + + str(rec.end_date).replace("-", "") + if rec.partner_id + else "" + ) def _prepare_donation_summary(self, existing_donation_ids): vals = { "partner_id": existing_donation_ids.partner_id.id, "start_date": self.start_date, "end_date": self.end_date, - "state": 'draft', - "is_summary_send": False + "state": "draft", + "is_summary_send": False, } return vals @@ -101,29 +113,31 @@ def massive_creation(self): d_sum = self.env["donation.summary"] donation_summary_ids = [] for partner in self.donation_ids.partner_id.ids: - donations = self.donation_ids.filtered(lambda donation: donation.partner_id.id == partner) + donations = self.donation_ids.filtered( + lambda donation: donation.partner_id.id == partner + ) values = self._prepare_donation_summary(donations) donation_summary_ids.append(values) if not len(donation_summary_ids): raise UserError(_("No annual tax receipt to generate")) - + self.unlink() - + for new_summary_vals in donation_summary_ids: d_sum.create(new_summary_vals) - + # Redireccionar a la vista tree return { - 'name': _('Donations Summary'), - 'type': 'ir.actions.act_window', - 'res_model': 'donation.summary', - 'view_type': 'tree', - 'view_mode': 'tree,form', - 'target': 'main', - 'context': self.env.context, + "name": _("Donations Summary"), + "type": "ir.actions.act_window", + "res_model": "donation.summary", + "view_type": "tree", + "view_mode": "tree,form", + "target": "main", + "context": self.env.context, } - @api.depends('donation_ids') + @api.depends("donation_ids") def _compute_amounts(self): for rec in self: amount = 0 @@ -131,18 +145,16 @@ def _compute_amounts(self): amount += don.amount_total_company_currency rec.amount_total = amount - @api.depends('partner_id', 'start_date', 'end_date') + @api.depends("partner_id", "start_date", "end_date") def _compute_donation_ids(self): for rec in self: - domain = [('state', '=', 'done'), ('donation_summary_id', '=', False)] + domain = [("state", "=", "done"), ("donation_summary_id", "=", False)] if rec.partner_id: - domain += [ - ('partner_id', '=', rec.partner_id.id) - ] + domain += [("partner_id", "=", rec.partner_id.id)] if rec.start_date and rec.end_date: domain += [ - ('donation_date', '>=', rec.start_date), - ('donation_date', '<=', rec.end_date) + ("donation_date", ">=", rec.start_date), + ("donation_date", "<=", rec.end_date), ] donations = self.env["donation.donation"].search(domain) if not donations: @@ -151,31 +163,34 @@ def _compute_donation_ids(self): def massive_send_summary(self): template = self.env.ref(self._get_mail_template(), raise_if_not_found=False) - compose_form = self.env.ref('donation_summary.donation_summary_send_wizard_form', raise_if_not_found=False) + compose_form = self.env.ref( + "donation_summary.donation_summary_send_wizard_form", + raise_if_not_found=False, + ) ctx = dict( - default_model='donation.summary', + default_model="donation.summary", # For the sake of consistency we need a default_res_model if # default_res_id is set. Not renaming default_model as it can # create many side-effects. - default_res_model='donation.summary', + default_res_model="donation.summary", default_use_template=bool(template), default_template_id=template and template.id or False, - default_composition_mode='comment', + default_composition_mode="comment", mark_invoice_as_sent=True, default_email_layout_xmlid="mail.mail_notification_layout_with_responsible_signature", force_email=True, active_ids=self.ids, ) report_action = { - 'name': _('Send Donation Summary'), - 'type': 'ir.actions.act_window', - 'view_type': 'form', - 'view_mode': 'form', - 'res_model': 'donation.summary.send', - 'views': [(compose_form.id, 'form')], - 'view_id': compose_form.id, - 'target': 'new', - 'context': ctx, + "name": _("Send Donation Summary"), + "type": "ir.actions.act_window", + "view_type": "form", + "view_mode": "form", + "res_model": "donation.summary.send", + "views": [(compose_form.id, "form")], + "view_id": compose_form.id, + "target": "new", + "context": ctx, } return report_action @@ -186,29 +201,32 @@ def send_summary(self): lang = template._render_lang(self.ids)[self.id] if not lang: lang = get_lang(self.env).code - compose_form = self.env.ref('donation_summary.donation_summary_send_wizard_form', raise_if_not_found=False) + compose_form = self.env.ref( + "donation_summary.donation_summary_send_wizard_form", + raise_if_not_found=False, + ) ctx = dict( - default_model='donation.summary', + default_model="donation.summary", default_res_id=self.id, - default_res_model='donation.summary', + default_res_model="donation.summary", default_use_template=bool(template), default_template_id=template and template.id or False, - default_composition_mode='comment', + default_composition_mode="comment", mark_invoice_as_sent=True, default_email_layout_xmlid="mail.mail_notification_layout_with_responsible_signature", force_email=True, active_ids=self.ids, ) report_action = { - 'name': _('Send Donation Summary'), - 'type': 'ir.actions.act_window', - 'view_type': 'form', - 'view_mode': 'form', - 'res_model': 'donation.summary.send', - 'views': [(compose_form.id, 'form')], - 'view_id': compose_form.id, - 'target': 'new', - 'context': ctx, + "name": _("Send Donation Summary"), + "type": "ir.actions.act_window", + "view_type": "form", + "view_mode": "form", + "res_model": "donation.summary.send", + "views": [(compose_form.id, "form")], + "view_id": compose_form.id, + "target": "new", + "context": ctx, } return report_action @@ -217,13 +235,15 @@ def _get_mail_template(self): """ :return: the correct mail template based on the current move type """ - return ( - 'donation_summary.email_template_donation_summary' - ) + return "donation_summary.email_template_donation_summary" def action_print_donation_summary(self): - """ Print the certificate and mark it as sent, so that we can see more + """Print the certificate and mark it as sent, so that we can see more easily the next step of the workflow """ - self.filtered(lambda sum: not sum.is_summary_send).write({'is_summary_send': True}) - return self.env.ref('donation_summary.report_donation_summary').report_action(self) + self.filtered(lambda sum: not sum.is_summary_send).write( + {"is_summary_send": True} + ) + return self.env.ref("donation_summary.report_donation_summary").report_action( + self + ) diff --git a/donation_summary/report/donation_summary.xml b/donation_summary/report/donation_summary.xml index 6c54cc69d..51c25ffc3 100644 --- a/donation_summary/report/donation_summary.xml +++ b/donation_summary/report/donation_summary.xml @@ -1,4 +1,4 @@ - + Request for Donation Summary @@ -6,8 +6,10 @@ qweb-pdf donation_summary.report_donationsummary donation_summary.report_donationsummary - 'Request for Donation Summary - %s' %(object.partner_id.name) + 'Request for Donation Summary - %s' %(object.partner_id.name) report - \ No newline at end of file + diff --git a/donation_summary/report/donation_summary_templates.xml b/donation_summary/report/donation_summary_templates.xml index cbed6a9dd..660d9f102 100644 --- a/donation_summary/report/donation_summary_templates.xml +++ b/donation_summary/report/donation_summary_templates.xml @@ -1,17 +1,21 @@ - +