From 54c9346ad092458bca7114a1ef2511a1aa77d17f Mon Sep 17 00:00:00 2001 From: Jaime Arroyo Date: Thu, 12 Mar 2020 11:21:12 +0100 Subject: [PATCH] [IMP] donation: finish migration --- donation/README.rst | 66 +++++++-- donation/models/donation.py | 30 ++-- donation/models/donation_campaign.py | 2 +- donation/post_install.py | 1 - donation/report/donation_report.py | 35 ++--- donation/static/description/icon.png | Bin 14015 -> 11202 bytes donation/static/description/icon.svg | 196 +++++++++++++++++++++++++++ donation/tests/test_donation.py | 62 +++++---- donation/views/donation.xml | 5 +- 9 files changed, 325 insertions(+), 72 deletions(-) create mode 100644 donation/static/description/icon.svg diff --git a/donation/README.rst b/donation/README.rst index d07d376ac..403e28372 100644 --- a/donation/README.rst +++ b/donation/README.rst @@ -1,14 +1,39 @@ -.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg - :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html - :alt: License: AGPL-3 - ======== Donation ======== +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fdonation-lightgray.png?logo=github + :target: https://github.com/OCA/donation/tree/12.0/donation + :alt: OCA/donation +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/donation-12-0/donation-12-0-donation + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/180/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + This module handles donations, including in-kind donations. When you validate a donation, it will create the corresponding accounting entries. + +**Table of contents** + +.. contents:: + :local: + Configuration ============= @@ -18,6 +43,7 @@ To configure this module, you need to: * activate the option *Donation Payment Method* on some bank/cash account journals * if you wish to have a control amount on the donation, add the users to the group *Check Total on supplier invoices* + Usage ===== @@ -29,19 +55,28 @@ To have some statistics about the donations, go to the menu Reporting > Donation :alt: Try me on Runbot :target: https://runbot.odoo-community.org/runbot/180/11.0 + Bug Tracker =========== -Bugs are tracked on `GitHub Issues -`_. In case of trouble, please -check there if your issue has already been reported. If you spotted it first, -help us smashing it by providing a detailed and welcomed feedback. +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. Credits ======= +Authors +~~~~~~~ + +* Barroux Abbey +* Akretion + Contributors ------------- +~~~~~~~~~~~~ * Brother Bernard * Brother Irénée (Barroux Abbey) @@ -49,17 +84,20 @@ Contributors * Serpent Consulting Services Pvt. Ltd. * Nikul Chaudhary -Maintainer ----------- + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. .. image:: https://odoo-community.org/logo.png :alt: Odoo Community Association :target: https://odoo-community.org -This module is maintained by the OCA. - OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -To contribute to this module, please visit https://odoo-community.org. +This module is part of the `OCA/donation `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/donation/models/donation.py b/donation/models/donation.py index 69aa4e7aa..45674f6c4 100644 --- a/donation/models/donation.py +++ b/donation/models/donation.py @@ -20,7 +20,6 @@ class DonationDonation(models.Model): def _compute_total(self): for donation in self: total = tax_receipt_total = 0.0 - donation_currency = donation.currency_id for line in donation.line_ids: line_total = line.quantity * line.unit_price total += line_total @@ -31,10 +30,18 @@ def _compute_total(self): donation_currency =\ donation.currency_id.with_context(date=donation.donation_date) company_currency = donation.company_currency_id - total_company_currency = donation_currency.compute( - total, company_currency) - tax_receipt_total_cc = donation_currency.compute( - tax_receipt_total, company_currency) + total_company_currency = donation_currency._convert( + total, + company_currency, + donation.company_id, + donation.donation_date + ) + tax_receipt_total_cc = donation_currency._convert( + tax_receipt_total, + company_currency, + donation.company_id, + donation.donation_date + ) donation.amount_total_company_currency = total_company_currency donation.tax_receipt_total = tax_receipt_total_cc @@ -349,7 +356,7 @@ def validate(self): raise UserError(_( 'The date of the donation of %s should be today ' 'or in the past, not in the future!') - % donation.partner_id.name) + % donation.partner_id.name) if not donation.line_ids: raise UserError(_( "Cannot validate the donation of %s because it doesn't " @@ -521,8 +528,12 @@ def _compute_amount(self): line.amount = amount donation_currency = line.donation_id.currency_id.with_context( date=line.donation_id.donation_date) - amount_company_currency = donation_currency.compute( - amount, line.donation_id.company_id.currency_id) + amount_company_currency = donation_currency._convert( + amount, + line.donation_id.company_id.currency_id, + line.donation_id.company_id, + line.donation_id.donation_date + ) tax_receipt_amount_cc = 0.0 if line.product_id.tax_receipt_ok: tax_receipt_amount_cc = amount_company_currency @@ -544,7 +555,8 @@ def _compute_amount(self): 'res.currency', related='donation_id.company_id.currency_id', readonly=True, - compute_sudo=True + compute_sudo=True, + string="Company Currency" ) product_id = fields.Many2one( 'product.product', diff --git a/donation/models/donation_campaign.py b/donation/models/donation_campaign.py index 70a3638a4..3e6a1b8b8 100644 --- a/donation/models/donation_campaign.py +++ b/donation/models/donation_campaign.py @@ -29,4 +29,4 @@ def name_get(self): 'Start Date', default=fields.Date.context_today ) - note = fields.Text('Notes') + note = fields.Text('Notes', oldname='nota') diff --git a/donation/post_install.py b/donation/post_install.py index 77ee427dc..9a7c1b017 100644 --- a/donation/post_install.py +++ b/donation/post_install.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2016 Akretion (Alexis de Lattre ) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). diff --git a/donation/report/donation_report.py b/donation/report/donation_report.py index 089198c8b..8c25a4949 100644 --- a/donation/report/donation_report.py +++ b/donation/report/donation_report.py @@ -4,6 +4,7 @@ from odoo import tools from odoo import models, fields +from psycopg2 import sql class DonationReport(models.Model): @@ -66,7 +67,7 @@ class DonationReport(models.Model): ) def _select(self): - select = """ + return sql.SQL(""" SELECT min(l.id) AS id, d.donation_date AS donation_date, l.product_id AS product_id, @@ -80,26 +81,23 @@ def _select(self): d.company_currency_id AS company_currency_id, sum(l.amount_company_currency) AS amount_company_currency, sum(l.tax_receipt_amount) AS tax_receipt_amount - """ - return select + """) def _from(self): - from_sql = """ + return sql.SQL(""" donation_line l LEFT JOIN donation_donation d ON (d.id=l.donation_id) LEFT JOIN product_product pp ON (l.product_id=pp.id) LEFT JOIN product_template pt ON (pp.product_tmpl_id=pt.id) - """ - return from_sql + """) def _where(self): - where = """ + return sql.SQL(""" WHERE d.state='done' - """ - return where + """) def _group_by(self): - group_by = """ + return sql.SQL(""" GROUP BY l.product_id, l.in_kind, l.tax_receipt_ok, @@ -110,12 +108,17 @@ def _group_by(self): d.campaign_id, d.company_id, d.company_currency_id - """ - return group_by + """) def init(self): tools.drop_view_if_exists(self._cr, self._table) - sql = "CREATE OR REPLACE VIEW %s AS (%s FROM %s %s %s)" % ( - self._table, self._select(), self._from(), - self._where(), self._group_by()) - self._cr.execute(sql) + query = sql.SQL( + "CREATE OR REPLACE VIEW {0} AS ({1} FROM {2} {3} {4})" + ).format( + sql.Identifier(self._table), + self._select(), + self._from(), + self._where(), + self._group_by(), + ) # pylint: disable=sql-injection + self._cr.execute(query) diff --git a/donation/static/description/icon.png b/donation/static/description/icon.png index f443e075f44b834719b2d55035f1acc07ff12fcf..a9a29546567960489ed0cc91e4442038578ebbb4 100644 GIT binary patch literal 11202 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 B2Fm~d literal 14015 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 diff --git a/donation/static/description/icon.svg b/donation/static/description/icon.svg new file mode 100644 index 000000000..6b8d94559 --- /dev/null +++ b/donation/static/description/icon.svg @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/donation/tests/test_donation.py b/donation/tests/test_donation.py index a564baa94..203ac8063 100644 --- a/donation/tests/test_donation.py +++ b/donation/tests/test_donation.py @@ -3,7 +3,7 @@ import time from odoo.tests.common import TransactionCase -from odoo import tools +from odoo import fields, tools from odoo.modules.module import get_resource_path from odoo.exceptions import ValidationError @@ -101,7 +101,7 @@ def setUp(self): ], }) - def test_donation(self): + def test_donation_1(self): donations = [self.don1, self.don2, self.don3, self.don4, self.don5] for donation in donations: self.assertEquals(donation.state, 'draft') @@ -129,6 +129,31 @@ def test_donation(self): self.assertEquals( donation.tax_receipt_total, tax_receipt.amount) + def test_donation_2(self): + self.donation_id = self.ddo.create({ + 'check_total': 1000, + 'partner_id': self.donor1.id, + 'donation_date': time.strftime('%Y-%m-%d'), + 'journal_id': self.bank_journal.id, + 'tax_receipt_option': 'each', + 'line_ids': [(0, 0, { + 'product_id': self.inkind_product.id, + 'quantity': 1, + 'unit_price': 1000, + })], + }) + self.donation_id.name_get() + self.donation_id.save_default_values() + self.donation_id.partner_id_change() + self.donation_id.tax_receipt_option_change() + self.donation_id.validate() + self.donation_id.line_ids[0]._compute_amount() + self.donation_id.line_ids[0].product_id_change() + self.donation_id.tax_receipt_id = False + self.donation_id.done2cancel() + self.donation_id.cancel2draft() + self.donation_id.unlink() + def test_annual_tax_receipt(self): self.res_partner = self.env['res.partner'] @@ -167,8 +192,12 @@ def test_annual_tax_receipt(self): tax_receipt = tax_receipts[0] self.assertEquals(tax_receipt.amount, 200) self.assertTrue(tax_receipt.number) - self.assertEquals(tax_receipt.date, last_day_year) - self.assertEquals(tax_receipt.donation_date, last_day_year) + self.assertEquals( + tax_receipt.date, fields.Date.from_string(last_day_year) + ) + self.assertEquals( + tax_receipt.donation_date, fields.Date.from_string(last_day_year) + ) self.assertEquals( tax_receipt.currency_id, dons[0].company_id.currency_id) @@ -212,31 +241,6 @@ def test_donation_campaign(self): self.don8.tax_receipt_id = False wizard.switch() - def test_donation(self): - self.donation_id = self.ddo.create({ - 'check_total': 1000, - 'partner_id': self.donor1.id, - 'donation_date': time.strftime('%Y-%m-%d'), - 'journal_id': self.bank_journal.id, - 'tax_receipt_option': 'each', - 'line_ids': [(0, 0, { - 'product_id': self.inkind_product.id, - 'quantity': 1, - 'unit_price': 1000, - })], - }) - self.donation_id.name_get() - self.donation_id.save_default_values() - self.donation_id.partner_id_change() - self.donation_id.tax_receipt_option_change() - self.donation_id.validate() - self.donation_id.line_ids[0]._compute_amount() - self.donation_id.line_ids[0].product_id_change() - self.donation_id.tax_receipt_id = False - self.donation_id.done2cancel() - self.donation_id.cancel2draft() - self.donation_id.unlink() - def create_donation_annual_receipt( self, partner, amount_tax_receipt, amount_no_tax_receipt, payment_ref): diff --git a/donation/views/donation.xml b/donation/views/donation.xml index 6c87caf49..60caf7206 100644 --- a/donation/views/donation.xml +++ b/donation/views/donation.xml @@ -202,8 +202,9 @@ tree,form - +