Skip to content

Commit 1c2ec72

Browse files
author
brendaf
committed
Donation new features: Certificate, Thanks Letter, Summary
1 parent 99b4186 commit 1c2ec72

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+2017
-0
lines changed

donation_certificate/__init__.py

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Copyright <YEAR(S)> <AUTHOR(S)>
2+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3+
from . import models
4+
from . import wizard

donation_certificate/__manifest__.py

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Copyright <YEAR(S)> <AUTHOR(S)>
2+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
3+
4+
{
5+
"name": "Donation Certificate",
6+
"summary": "Donation Certificate",
7+
"version": "16.0.1.0.0",
8+
"category": "Custom",
9+
"website": "https://www.qubiq.es",
10+
"author": "Brenda Fernández Alayo",
11+
"license": "AGPL-3",
12+
"application": True,
13+
"installable": True,
14+
"depends": ['report_py3o', 'donation', 'donation_base', 'mail'],
15+
"data": [
16+
"security/ir.model.access.csv",
17+
"data/mail_template.xml",
18+
"data/donation_sequence.xml",
19+
'data/py3o_certificate_template.xml',
20+
'views/donation_certificate_send_views.xml',
21+
'views/tax_receipt_donation.xml',
22+
'views/donation_send_cert_button.xml',
23+
'views/py3o_certificate_report.xml',
24+
'wizard/tax_receipt_annual_create_view.xml',
25+
'wizard/tax_receipt_print_view.xml'
26+
],
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<odoo noupdate="1">
3+
4+
<record id="donation_seq" model="ir.sequence">
5+
<field name="name">Donation</field>
6+
<field name="code">donation.donation</field>
7+
<field name="prefix">DON-%(range_year)s-</field>
8+
<field name="padding">4</field>
9+
<field name="use_date_range" eval="True" />
10+
</record>
11+
12+
</odoo>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?xml version="1.0" ?>
2+
<odoo>
3+
<data noupdate="1">
4+
<!-- Comments: Todavia no sé qué estructura debería tener, pero si hay algun sugerencia la añado -->
5+
<record id="email_template_donation_certificate" model="mail.template">
6+
<field name="name">Donation: Certificate</field>
7+
<field name="model_id" ref="donation.model_donation_tax_receipt" />
8+
<field name="auto_delete" eval="True"/>
9+
<field name="email_from">{{ object.company_id.email }}</field>
10+
<field name="email_to">{{ object.partner_id.email }}</field>
11+
<field name="subject">Donation Certificate</field>
12+
<field name="description">Donation Certificate</field>
13+
<field name="body_html" type="html">
14+
<div style="margin: 0px; padding: 0px;">
15+
<p style="margin: 0px; padding: 0px; font-size: 13px;">
16+
Dear
17+
<t t-out="object.partner_id.name or ''">Donor name</t>,
18+
<br />
19+
<br />
20+
We want to express our sincere gratitude for your generous donation of
21+
<span style="font-weight:bold;" t-out="format_amount(object.amount, object.currency_id) or ''">$ 143,750.00</span>
22+
to our organization. This contribution is a testament to your commitment and trust in our work.
23+
<br />
24+
<br />
25+
With this collaboration you help us move forward with our mission. We sincerely appreciate your support.
26+
<br />
27+
<br />
28+
Cordially,
29+
<br />
30+
<br />
31+
<t t-out="object.company_id.name or ''">
32+
--
33+
<br/>
34+
Association name
35+
</t>
36+
</p>
37+
</div>
38+
</field>
39+
40+
<field name="lang">{{ object.partner_id.lang }}</field>
41+
<field name="report_name">Donation Certificate</field>
42+
</record>
43+
</data>
44+
</odoo>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<odoo>
3+
4+
<record id="py3o_template_certificate_ES" model="py3o.template">
5+
<field name="name">Donation Certificate ES</field>
6+
<field name="filetype">odt</field>
7+
<field name="py3o_template_fallback">report/PDA34_Certificat_de_donacions_ES.odt</field>
8+
</record>
9+
10+
<record id="py3o_template_certificate_CAT" model="py3o.template">
11+
<field name="name">Donation Certificate CAT</field>
12+
<field name="filetype">odt</field>
13+
<field name="py3o_template_fallback">report/PDA34_Certificat_de_donacions_CAT.odt</field>
14+
</record>
15+
16+
<record id="py3o_template_certificate_FR" model="py3o.template">
17+
<field name="name">Donation Certificate FR</field>
18+
<field name="filetype">odt</field>
19+
<field name="py3o_template_fallback">report/PDA34_Certificat_de_donacions_FR.odt</field>
20+
</record>
21+
22+
<record id="py3o_template_certificate_EN" model="py3o.template">
23+
<field name="name">Donation Certificate EN</field>
24+
<field name="filetype">odt</field>
25+
<field name="py3o_template_fallback">report/PDA34_Certificat_de_donacions_EN.odt</field>
26+
</record>
27+
28+
</odoo>
+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
from . import py3o_report
2+
from . import py3o_template
3+
from . import donation
4+
from . import donation_tax_receipt
+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
from odoo import _, fields, models
2+
from odoo.exceptions import ValidationError
3+
from odoo.tools import get_lang
4+
5+
6+
class Donation(models.Model):
7+
_inherit = "donation.donation"
8+
9+
is_certificate_send = fields.Boolean(
10+
help="This field automatically becomes active when "
11+
"the thanks letter has been send.",
12+
)
13+
attachment_ids = fields.One2many(
14+
'ir.attachment',
15+
'res_id',
16+
domain=[('res_model', '=', 'donation.donation')],
17+
string='Attachments'
18+
)
19+
20+
def action_send_certificate(self):
21+
self.ensure_one()
22+
if not self.tax_receipt_id and self.tax_receipt_option == 'annual':
23+
raise ValidationError(_("Annual receipt has not been generated yet."))
24+
self.write({"is_certificate_send": True})
25+
template = self.env.ref(self._get_mail_template(), raise_if_not_found=False)
26+
lang = False
27+
if template:
28+
lang = template._render_lang(self.ids)[self.id]
29+
if not lang:
30+
lang = get_lang(self.env).code
31+
compose_form = self.env.ref('donation_certificate.donation_certificate_send_wizard_form', raise_if_not_found=False)
32+
ctx = dict(
33+
default_model='donation.tax.receipt',
34+
default_res_id=self.tax_receipt_id.id,
35+
default_res_model='donation.tax.receipt',
36+
default_use_template=bool(template),
37+
default_template_id=template and template.id or False,
38+
default_composition_mode='comment',
39+
mark_invoice_as_sent=True,
40+
default_email_layout_xmlid="mail.mail_notification_layout_with_responsible_signature",
41+
force_email=True,
42+
active_ids=self.tax_receipt_id.ids,
43+
)
44+
report_action = {
45+
'name': _('Send Certificate'),
46+
'type': 'ir.actions.act_window',
47+
'view_type': 'form',
48+
'view_mode': 'form',
49+
'res_model': 'donation.certificate.send',
50+
'views': [(compose_form.id, 'form')],
51+
'view_id': compose_form.id,
52+
'target': 'new',
53+
'context': ctx,
54+
}
55+
return report_action
56+
57+
def action_print_tax_receipt(self):
58+
""" Print the certificate and mark it as sent, so that we can see more
59+
easily the next step of the workflow
60+
"""
61+
self.filtered(lambda r: not r.is_certificate_send).write({'is_certificate_send': True})
62+
return self.env.ref('donation_certificate.donation_certificate_report_py3o').report_action(self)
63+
64+
def _get_mail_template(self):
65+
"""
66+
:return: the correct mail template based on the current move type
67+
"""
68+
return (
69+
'donation_certificate.email_template_donation_certificate'
70+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
from odoo import _, fields, models, api
2+
from odoo.tools import get_lang
3+
4+
5+
class DonationTaxReceipt(models.Model):
6+
_inherit = "donation.tax.receipt"
7+
8+
is_certificate_send = fields.Boolean(
9+
help="This field automatically becomes active when "
10+
"the thanks letter has been send.",
11+
)
12+
attachment_ids = fields.One2many('ir.attachment', 'res_id', domain=[('res_model', '=', 'donation.tax.receipt')], string='Attachments')
13+
amount_donation = fields.Monetary(tracking=True, compute="_compute_amounts")
14+
amount_donation_in_kind_consu = fields.Monetary(tracking=True, compute="_compute_amounts")
15+
amount_donation_in_kind_service = fields.Monetary(tracking=True, compute="_compute_amounts")
16+
17+
@api.depends('donation_ids')
18+
def _compute_amounts(self):
19+
for rec in self:
20+
amount_donation = 0
21+
amount_donation_in_kind_consu = 0
22+
amount_donation_in_kind_service = 0
23+
for donation in rec.donation_ids:
24+
for line in donation.line_ids:
25+
if line.product_id.detailed_type == 'donation':
26+
amount_donation = amount_donation + line.amount
27+
elif line.product_id.detailed_type == 'donation_in_kind_consu':
28+
amount_donation_in_kind_consu = amount_donation_in_kind_consu + line.amount
29+
else:
30+
amount_donation_in_kind_service = amount_donation_in_kind_service + line.amount
31+
rec.amount_donation = round(amount_donation, 2)
32+
rec.amount_donation_in_kind_consu = round(amount_donation_in_kind_consu, 2)
33+
rec.amount_donation_in_kind_service = round(amount_donation_in_kind_service, 2)
34+
35+
def action_send_tax_receipt(self):
36+
self.write({"is_certificate_send": True})
37+
template = self.env.ref(self._get_mail_template(), raise_if_not_found=False)
38+
compose_form = self.env.ref('donation_certificate.donation_certificate_send_wizard_form', raise_if_not_found=False)
39+
ctx = dict(
40+
default_model='donation.tax.receipt',
41+
default_res_model='donation.tax.receipt',
42+
default_use_template=bool(template),
43+
default_template_id=template and template.id or False,
44+
default_composition_mode='comment',
45+
mark_invoice_as_sent=True,
46+
default_email_layout_xmlid="mail.mail_notification_layout_with_responsible_signature",
47+
force_email=True,
48+
active_ids=self.ids,
49+
)
50+
report_action = {
51+
'name': _('Send Certificate'),
52+
'type': 'ir.actions.act_window',
53+
'view_type': 'form',
54+
'view_mode': 'form',
55+
'res_model': 'donation.certificate.send',
56+
'views': [(compose_form.id, 'form')],
57+
'view_id': compose_form.id,
58+
'target': 'new',
59+
'context': ctx,
60+
}
61+
return report_action
62+
63+
def get_ref_report_name(self, lang):
64+
report_names = {
65+
'es_ES': "donation_certificate.donation_certificate_report_py3o_ES",
66+
'ca_ES': "donation_certificate.donation_certificate_report_py3o_CAT",
67+
'fr_FR': "donation_certificate.donation_certificate_report_py3o_FR",
68+
'en_GB': "donation_certificate.donation_certificate_report_py3o_EN"
69+
}
70+
71+
return report_names.get(lang, "donation_certificate.donation_certificate_report_py3o_EN")
72+
73+
def action_print_tax_receipt(self):
74+
""" Print the certificate and mark it as sent, so that we can see more
75+
easily the next step of the workflow
76+
"""
77+
today = fields.Date.context_today(self)
78+
self.write({"print_date": today})
79+
self.filtered(lambda inv: not inv.is_certificate_send).write({'is_certificate_send': True})
80+
lang = get_lang(self.env).code
81+
report_action_py3o = self.get_ref_report_name(lang)
82+
return self.env.ref(report_action_py3o).report_action(self)
83+
84+
def _get_mail_template(self):
85+
"""
86+
:return: the correct mail template based on the current move type
87+
"""
88+
return (
89+
'donation_certificate.email_template_donation_certificate'
90+
)
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Copyright 2013 XCG Consulting (http://odoo.consulting)
2+
# Copyright 2016 ACSONE SA/NV
3+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
4+
from odoo import models
5+
6+
7+
class Py3oReport(models.TransientModel):
8+
_inherit = "py3o.report"
9+
10+
def _merge_results(self, reports_path):
11+
self.ensure_one()
12+
filetype = self.ir_actions_report_id.py3o_filetype
13+
if not reports_path:
14+
return False, False
15+
if len(reports_path) == 1:
16+
return reports_path[0], filetype
17+
else:
18+
return self._zip_results(reports_path), "zip"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from odoo import fields, models, api
2+
from base64 import b64encode
3+
# import sys
4+
import pkg_resources
5+
# import os
6+
7+
8+
class Py3oTemplate(models.Model):
9+
_inherit = "py3o.template"
10+
11+
py3o_template_fallback = fields.Char(
12+
"Fallback",
13+
size=128,
14+
help=(
15+
"If the user does not provide a template this will be used "
16+
"it should be a relative path to root of YOUR module "
17+
"or an absolute path on your server."
18+
),
19+
)
20+
21+
@api.model_create_multi
22+
def create(self, vals_list):
23+
module = "donation_certificate"
24+
vals = vals_list[0]
25+
if vals['py3o_template_fallback']:
26+
flbk_filename = pkg_resources.resource_filename(
27+
"odoo.addons.%s" % module, vals['py3o_template_fallback']
28+
)
29+
with open(flbk_filename, "rb") as tmpl:
30+
tmpl_data = b64encode(tmpl.read())
31+
vals['py3o_template_data'] = tmpl_data
32+
# if not rec.py3o_template_data:
33+
# rec.py3o_template_data = False
34+
return super().create([vals])
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
2+
access_donation_certificate_send,donation.certificate.send,donation_certificate.model_donation_certificate_send,base.group_user,1,1,1,1
3+
access_donation_donation,donation.donation,donation.model_donation_donation,base.group_user,1,1,1,1
4+
access_donation_tax_receipt,donation.tax.receipt,model_donation_tax_receipt,base.group_user,1,1,1,1
5+
access_tax_receipt_annual_create,tax.receipt.annual.create,model_tax_receipt_annual_create,base.group_user,1,1,1,1
6+
access_py3o_template,py3o.template,report_py3o.model_py3o_template,base.group_user,1,1,1,1
7+
access_donation_tax_receipt_print,donation.tax.receipt.print,donation_base.model_donation_tax_receipt_print,base.group_user,1,1,1,1
18.8 KB
Loading

0 commit comments

Comments
 (0)