Repository: OCA/donation (language: python)

Issue:
Preparing a big reorganisation of the code for v9
For v9, I'm preparing a big re-organisation of the code of the donation project. Let me explain the idea and what I plan to do.

**Main idea**

The donation module is based on dedicated objects donation and donation.line ; so a donation is not related to a sale order nor an invoice. There are several advantages for this approach:
- the user can encode both the donation and the related payment in a single form, so it's fast and easy.
- we can generate an accounting entry that go directly from the bank account to the revenue account, without going through a receivable account, which reduces the number of accounting entries and avoids reconciliation.
- the donation module only depends on the account module

In one of my new projects, I need to support:
- online donation paid by credit card
- mix of regular products (T-shirt, with VAT) and donations in the same order ; the whole order is paid by a single credit card transaction

For this, I need to support donations inside a sale.order (for the online shop, the basket is a draft sale.order in Odoo). So it is quite different from the current implementation and it's not easy to have those 2 implementations "compatible".

In fact, I think it is the same kind of problem between the "sale" module that provide the sale.order/sale.order.line objects and the "point_of_sale" module that provide the pos.order/pos.order.line objects. The sale.order and pos.order objects are technically independant but they are both related to the sale of goods to a customer. Why did the point_of_sale module created a dedicated object "pos.order" instead of using the "sale.order" object ? I guess it was for simplicity reasons: they wanted to have an object that could handle sale+payment+delivery at the same time (whereas the sale.order object only handles the sale and doesn't directly handle the payment and delivery).

So I plan to make this project evolve to the same kind of approach:
1) First solution: the donation/donation.line objects will be used when you have donation+payment at the same time (equivalent to the "point_of_sale"), because it is very simple and we can have a journal item that go directly from the bank account to the revenue account (no reconciliation because we don't use a receivable account).
2) Second solution: the sale.order/sale.order.line object will be used when you have a mix of products and donations in the same transaction and/or when you want to have donations in an online shop. In this solution, an invoice is generated so there are 2 journal items: one from the receivable account to the income account and a second one from the bank account to the receivable account and it require a reconciliation in the receivable account.
You should be able to use only the first solution or only the second solution... or use both ! But, if you use both, you will still have the constraints linked to the fact that donation.line and sale.order.line are different objects. The main difficulty will be to be able to handle annual tax receipts in the scenario where you use the 2 solutions.

**Proposed implementation**

So here are my plans for the code base of this project for v9:
- create a new module "donation_base" that will have the properties on the product object
- create a new module "donation_sale" that will depend on donation_base
- the "donation" module will depend on "donation_base"

I know that this change will introduce more modules and more complexity and I don't want to make this project too complex, so I propose the following simplification: the handling of tax receipts will not be handled in a separate module any more ; the handling of tax receipts will be made in the base module (the donation.tax.receipt object will be defined in the donation_base module). For associations that receive donations but are not allowed to generate tax receipts, the drawback is that they will have menu entries and object fields that they don't need ; so I plan to create a group "Donation Tax Receipt" and you will have to be in that group to see all tax-receipt related info (just like the group "Analytic Accounting").

Please give your feedback on this new idea NOW, because I'm starting the development on this new implementation tomorrow ! :)



Discussion / hints:

Fix patch:
diff --git a/donation/README.rst b/donation/README.rst
new file mode 100644
index 000000000..2627cab22
--- /dev/null
+++ b/donation/README.rst
@@ -0,0 +1,1 @@
+Will be auto-generated from the readme subdir
diff --git a/donation/__init__.py b/donation/__init__.py
new file mode 100644
index 000000000..7afd6210b
--- /dev/null
+++ b/donation/__init__.py
@@ -0,0 +1,4 @@
+from . import models
+from . import report
+from . import wizard
+from .post_install import update_account_payment_mode
diff --git a/donation/__manifest__.py b/donation/__manifest__.py
new file mode 100644
index 000000000..f408fcb54
--- /dev/null
+++ b/donation/__manifest__.py
@@ -0,0 +1,38 @@
+# Copyright 2014-2021 Barroux Abbey (http://www.barroux.org)
+# Copyright 2014-2021 Akretion France
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+{
+    "name": "Donation",
+    "version": "14.0.1.0.0",
+    "category": "Accounting",
+    "license": "AGPL-3",
+    "summary": "Manage donations",
+    "author": "Barroux Abbey, Akretion, Odoo Community Association (OCA)",
+    "maintainers": ["alexis-via"],
+    "website": "https://github.com/OCA/donation",
+    "depends": ["donation_base", "account_payment_mode"],
+    "data": [
+        "security/donation_security.xml",
+        "security/ir.model.access.csv",
+        "wizard/tax_receipt_option_switch_view.xml",
+        "wizard/donation_validate_view.xml",
+        "wizard/res_config_settings.xml",
+        "views/donation_tax_receipt.xml",
+        "views/donation.xml",
+        "data/donation_sequence.xml",
+        "views/account_payment_mode.xml",
+        "views/account_bank_statement.xml",
+        "views/donation_campaign.xml",
+        "views/donation_thanks_template.xml",
+        "views/res_users.xml",
+        "views/res_partner.xml",
+        "views/account_journal.xml",
+        "report/donation_report_view.xml",
+        "report/donation_thanks_view.xml",
+        "report/donation_thanks_report.xml",
+    ],
+    "post_init_hook": "update_account_payment_mode",
+    "demo": ["demo/donation_demo.xml"],
+    "installable": True,
+}
diff --git a/donation/data/donation_sequence.xml b/donation/data/donation_sequence.xml
new file mode 100644
index 000000000..37ab9ea2a
--- /dev/null
+++ b/donation/data/donation_sequence.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+  Copyright 2021 Akretion France (http://www.akretion.com/)
+  @author: Alexis de Lattre <alexis.delattre@akretion.com>
+  License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+-->
+<odoo noupdate="1">
+
+
+<record id="donation_seq" model="ir.sequence">
+    <field name="name">Donation</field>
+    <field name="code">donation.donation</field>
+    <field name="prefix">DON-%(year)s-</field>
+    <field name="padding">4</field>
+    <field name="use_date_range" eval="True" />
+    <field name="company_id" eval="False" />
+</record>
+
+
+</odoo>
diff --git a/donation/demo/donation_demo.xml b/donation/demo/donation_demo.xml
new file mode 100644
index 000000000..4196cc36b
--- /dev/null
+++ b/donation/demo/donation_demo.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<odoo noupdate="1">
+    <record id="quest_origin" model="donation.campaign">
+        <field name="code">Q1</field>
+        <field name="name">Quest Christmas 2015</field>
+    </record>
+    <record id="prospecting_origin" model="donation.campaign">
+        <field name="code">P1</field>
+        <field name="name">Prospecting 2016</field>
+    </record>
+    <record id="catalog_origin" model="donation.campaign">
+        <field name="code">C1</field>
+        <field name="name">Catalog Q1 2016</field>
+    </record>
+    <record id="base.user_demo" model="res.users">
+        <field name="groups_id" eval="[(4, ref('group_donation_user'))]" />
+    </record>
+    <record id="base.main_company" model="res.company">
+        <field
+            name="donation_credit_transfer_product_id"
+            ref="donation_base.product_product_donation"
+        />
+    </record>
+
+</odoo>
diff --git a/donation/i18n/de.po b/donation/i18n/de.po
new file mode 100644
index 000000000..8ed90ee91
--- /dev/null
+++ b/donation/i18n/de.po
@@ -0,0 +1,763 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# 	* donation
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 10.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2019-01-26 15:41+0000\n"
+"Last-Translator: kempleton <kimdoelling@gmail.com>\n"
+"Language-Team: none\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 3.3\n"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_res_partner_donation_count
+#: model:ir.model.fields,field_description:donation.field_res_users_donation_count
+msgid "# of Donations"
+msgstr "# an Spenden"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:450
+#, python-format
+msgid "A cancelled donation should not be linked to a tax receipt"
+msgstr ""
+"Eine abgebrochene Spende sollte nicht mit einer Spendenbescheinigung "
+"verknüpft sein"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:446
+#, python-format
+msgid "A cancelled donation should not be linked to an account move"
+msgstr ""
+"Abgebrochene Spenden sollten nicht mit einer Kontobewegung verknüpft sein"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_move_id
+msgid "Account Move"
+msgstr "Kontobewegung"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_amount
+#: model:ir.model.fields,field_description:donation.field_donation_report_amount_company_currency
+msgid "Amount"
+msgstr "Betrag"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_amount_total
+msgid "Amount Total"
+msgstr "Gesamtbetrag"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_amount_total_company_currency
+msgid "Amount Total in Company Currency"
+msgstr "Gesamtbetrag in Unternehmenswährung"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_amount_company_currency
+msgid "Amount in Company Currency"
+msgstr "Betrag in Unternehmenswährung"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_analytic_account_id
+msgid "Analytic Account"
+msgstr "Kostenstelle"
+
+#. module: donation
+#: selection:donation.donation,tax_receipt_option:0
+#: selection:donation.tax.receipt.option.switch,new_tax_receipt_option:0
+msgid "Annual Tax Receipt"
+msgstr "Sammelspendenbescheinigung"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Back to Draft"
+msgstr "Zurücksetzen auf Entwurf"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Campaign"
+msgstr "Kampagne"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+#: model:ir.ui.view,arch_db:donation.donation_tax_receipt_option_switch_form
+#: model:ir.ui.view,arch_db:donation.donation_validate_form
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#. module: donation
+#: selection:donation.donation,state:0
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Cancelled"
+msgstr "Abgebrochen"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:479
+#, python-format
+msgid "Cancelled Donation of %s"
+msgstr "Abgebrochene Spende von %s1"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:360
+#, python-format
+msgid "Cannot validate the donation of %s because it doesn't have any lines!"
+msgstr ""
+"Spende %s1 kann nicht bestätigt werden, da keine Zeilen vorhanden sind!"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:372
+#, python-format
+msgid "Cannot validate the donation of %s because it is not in draft state."
+msgstr ""
+"Die Spende %s1 kann nicht bestätigt werden, da sie sich im Entwurf-Status "
+"befindet."
+
+#. module: donation
+#: code:addons/donation/models/donation.py:367
+#, python-format
+msgid "Cannot validate the donation of %s because the total amount is 0 !"
+msgstr "Die Spende %s1 kann nicht bestätigt werden, da der Gesamtbetrag 0 ist!"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_report_product_categ_id
+msgid "Category of Product"
+msgstr "Produktkategorie"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Change"
+msgstr "Ändern"
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_tax_receipt_option_switch_action
+#: model:ir.ui.view,arch_db:donation.donation_tax_receipt_option_switch_form
+msgid "Change Tax Receipt Option"
+msgstr "Ändere Spendenbescheinigung"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_check_total
+msgid "Check Amount"
+msgstr "Überprüfe Betrag"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_code
+msgid "Code"
+msgstr "Code"
+
+#. module: donation
+#: model:ir.model,name:donation.model_donation_campaign
+msgid "Code attributed for a Donation Campaign"
+msgstr "Code für eine Spendenkampagne"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_company_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_company_id
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Company"
+msgstr "Unternehmen"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_company_currency_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_company_currency_id
+msgid "Company Currency"
+msgstr "Unternehmenswährung"
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donation_config_menu
+msgid "Configuration"
+msgstr "Konfiguration"
+
+#. module: donation
+#: model:ir.model,name:donation.model_res_partner
+msgid "Contact"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_country_id
+msgid "Country"
+msgstr "Land"
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.tax_receipt_annual_create_menu
+msgid "Create Annual Receipts"
+msgstr "Erstelle Sammelspendenbescheinigungen"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_create_uid
+#: model:ir.model.fields,field_description:donation.field_donation_donation_create_uid
+#: model:ir.model.fields,field_description:donation.field_donation_line_create_uid
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_create_uid
+#: model:ir.model.fields,field_description:donation.field_donation_validate_create_uid
+msgid "Created by"
+msgstr "Erstellt von"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_create_date
+#: model:ir.model.fields,field_description:donation.field_donation_donation_create_date
+#: model:ir.model.fields,field_description:donation.field_donation_line_create_date
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_create_date
+#: model:ir.model.fields,field_description:donation.field_donation_validate_create_date
+msgid "Created on"
+msgstr "Erstellt am"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_currency_id
+#: model:ir.model.fields,field_description:donation.field_donation_line_company_currency_id
+#: model:ir.model.fields,field_description:donation.field_donation_line_currency_id
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Currency"
+msgstr "Währung"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_res_users_context_donation_campaign_id
+msgid "Current Donation Campaign"
+msgstr "Aktuelle Spendenkampagne"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_res_users_context_donation_journal_id
+msgid "Current Donation Payment Method"
+msgstr "Aktuelle Zahlungsmethode"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Date"
+msgstr "Datum"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_display_name
+#: model:ir.model.fields,field_description:donation.field_donation_donation_display_name
+#: model:ir.model.fields,field_description:donation.field_donation_line_display_name
+#: model:ir.model.fields,field_description:donation.field_donation_report_display_name
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_display_name
+#: model:ir.model.fields,field_description:donation.field_donation_validate_display_name
+msgid "Display Name"
+msgstr "Anzeigename"
+
+#. module: donation
+#: model:ir.model,name:donation.model_donation_donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_donation_id
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_donation_id
+#: model:ir.module.category,name:donation.module_category_donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+#: model:ir.ui.view,arch_db:donation.donation_tree
+msgid "Donation"
+msgstr "Spende"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_campaign_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_campaign_id
+#: model:ir.ui.view,arch_db:donation.donation_campaign_form
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Donation Campaign"
+msgstr "Spendenkampagne"
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_campaign_action
+#: model:ir.ui.menu,name:donation.donation_campaign_menu
+#: model:ir.ui.view,arch_db:donation.donation_campaign_tree
+msgid "Donation Campaigns"
+msgstr "Spendenkampagnen"
+
+#. module: donation
+#: model:res.groups,name:donation.group_donation_check_total
+msgid "Donation Check Total"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_donation_date
+#: model:ir.model.fields,field_description:donation.field_donation_report_donation_date
+msgid "Donation Date"
+msgstr "Spendendatum"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_line_form
+#: model:ir.ui.view,arch_db:donation.donation_line_tree
+msgid "Donation Line"
+msgstr "Spendenzeile"
+
+#. module: donation
+#: model:ir.model,name:donation.model_donation_line
+#: model:ir.model.fields,field_description:donation.field_donation_donation_line_ids
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Donation Lines"
+msgstr "Spendenzeile"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_number
+msgid "Donation Number"
+msgstr "Spendennummer"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_account_journal_allow_donation
+msgid "Donation Payment Method"
+msgstr "Zahlungsmethode"
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donation_tax_receipt_menu
+msgid "Donation Tax Receipts"
+msgstr "Spendenbescheinigung"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:240
+#, python-format
+msgid "Donation of %s"
+msgstr "Spende von %s"
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_action
+#: model:ir.actions.act_window,name:donation.partner_donation_action
+#: model:ir.model.fields,field_description:donation.field_res_partner_donation_ids
+#: model:ir.model.fields,field_description:donation.field_res_users_donation_ids
+#: model:ir.ui.menu,name:donation.donation_menu
+#: model:ir.ui.menu,name:donation.donation_title_menu
+#: model:ir.ui.menu,name:donation.donation_top_menu
+#: model:ir.ui.view,arch_db:donation.donation_graph
+#: model:ir.ui.view,arch_db:donation.donation_pivot
+#: model:ir.ui.view,arch_db:donation.donation_report_tree
+#: model:ir.ui.view,arch_db:donation.view_partner_form
+msgid "Donations"
+msgstr "Spenden"
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_report_action
+#: model:ir.model,name:donation.model_donation_report
+#: model:ir.ui.menu,name:donation.donation_report_menu
+#: model:ir.ui.view,arch_db:donation.donation_report_graph
+#: model:ir.ui.view,arch_db:donation.donation_report_pivot
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Donations Analysis"
+msgstr "Spendenanalyse"
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_line_action
+msgid "Donations Lines"
+msgstr "Spendenzeilen"
+
+#. module: donation
+#: selection:donation.donation,state:0
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Done"
+msgstr "Erledigt"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_partner_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_partner_id
+msgid "Donor"
+msgstr "Spender"
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donor
+msgid "Donors"
+msgstr "Spender"
+
+#. module: donation
+#: selection:donation.donation,state:0
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Draft"
+msgstr "Entwurf"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:477
+#, python-format
+msgid "Draft Donation of %s"
+msgstr "Spendenentwurf von %s1"
+
+#. module: donation
+#: model:ir.model.fields,help:donation.field_donation_donation_tax_receipt_total
+msgid "Eligible Tax Receipt Sub-total in Company Currency"
+msgstr "berechtigte Zwischensumme Spendenbescheinigung"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_report_tax_receipt_ok
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Eligible for a Tax Receipt"
+msgstr "Geeignet für Spendenbescheinigung"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:499
+#, python-format
+msgid "Error:"
+msgstr "Fehler:"
+
+#. module: donation
+#: selection:donation.donation,tax_receipt_option:0
+#: selection:donation.tax.receipt.option.switch,new_tax_receipt_option:0
+msgid "For Each Donation"
+msgstr "Für jede Spende"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:397
+#, python-format
+msgid "Full in-kind donation: no account move generated"
+msgstr "komplette Sachspende: keine Kontobewegung generiert"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Group By"
+msgstr "Gruppieren nach"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_id
+#: model:ir.model.fields,field_description:donation.field_donation_donation_id
+#: model:ir.model.fields,field_description:donation.field_donation_line_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_id
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_id
+#: model:ir.model.fields,field_description:donation.field_donation_validate_id
+msgid "ID"
+msgstr "ID"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_in_kind
+#: model:ir.model.fields,field_description:donation.field_donation_report_in_kind
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "In Kind"
+msgstr "Sachspende"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_tax_receipt_ok
+msgid "Is Eligible for a Tax Receipt"
+msgstr "Ist geeignet für Spendenbescheinigung"
+
+#. module: donation
+#: model:ir.model,name:donation.model_account_journal
+msgid "Journal"
+msgstr "Jurnal"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign___last_update
+#: model:ir.model.fields,field_description:donation.field_donation_donation___last_update
+#: model:ir.model.fields,field_description:donation.field_donation_line___last_update
+#: model:ir.model.fields,field_description:donation.field_donation_report___last_update
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch___last_update
+#: model:ir.model.fields,field_description:donation.field_donation_validate___last_update
+msgid "Last Modified on"
+msgstr "Zuletzt geändert am"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_write_uid
+#: model:ir.model.fields,field_description:donation.field_donation_donation_write_uid
+#: model:ir.model.fields,field_description:donation.field_donation_line_write_uid
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_write_uid
+#: model:ir.model.fields,field_description:donation.field_donation_validate_write_uid
+msgid "Last Updated by"
+msgstr "Zuletzt aktualisiert von"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_write_date
+#: model:ir.model.fields,field_description:donation.field_donation_donation_write_date
+#: model:ir.model.fields,field_description:donation.field_donation_line_write_date
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_write_date
+#: model:ir.model.fields,field_description:donation.field_donation_validate_write_date
+msgid "Last Updated on"
+msgstr "Zuletzt aktualisiert am"
+
+#. module: donation
+#: model:ir.module.category,description:donation.module_category_donation
+msgid "Manage donations"
+msgstr "Verwalte Spenden"
+
+#. module: donation
+#: model:res.groups,name:donation.group_donation_manager
+msgid "Manager"
+msgstr "Manager"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:273
+#, python-format
+msgid "Missing Default Debit Account on journal '%s'."
+msgstr "Fehlender Default Passivsaldo im '%s1'-Jurnal."
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_name
+msgid "Name"
+msgstr "Name"
+
+#. module: donation
+#: selection:donation.donation,tax_receipt_option:0
+msgid "None"
+msgstr "Keine"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_nota
+msgid "Notes"
+msgstr "Notizen"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Other Information"
+msgstr "Weitere Informationen"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_commercial_partner_id
+msgid "Parent Donor"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Parent Partner"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Partner"
+msgstr "Parnter"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_report_country_id
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Partner Country"
+msgstr "Partner Land"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_journal_id
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Payment Method"
+msgstr "Zahlungsmethode"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_payment_ref
+msgid "Payment Reference"
+msgstr "Zahlungsreferenz"
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donation_tax_receipt_print_menu
+msgid "Print Receipts"
+msgstr "Drucke Bescheinigung"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_product_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_product_id
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Product"
+msgstr "Produkt"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Product Category"
+msgstr "Produktkategorie"
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_product_action
+#: model:ir.ui.menu,name:donation.donation_products
+msgid "Products"
+msgstr "Produkte"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_quantity
+msgid "Quantity"
+msgstr "Menge"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_donation_ids
+#: model:ir.ui.view,arch_db:donation.donation_tax_receipt_form
+msgid "Related Donations"
+msgstr "Verbundene Spenden"
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donation_report_title_menu
+msgid "Reports"
+msgstr "Berichte"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Save Default Values"
+msgstr "Speicher Default Werte"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Search Donations"
+msgstr "Suche Spenden"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_sequence
+msgid "Sequence"
+msgstr "Reihenfolge"
+
+#. module: donation
+#: model:ir.model.fields,help:donation.field_donation_line_tax_receipt_ok
+msgid "Specify if the product is eligible for a tax receipt"
+msgstr ""
+"Spezifizieren Sie hier, ob dieses Produkt für die Erstellung einer "
+"Spendenbescheinigung geeignet ist"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_start_date
+msgid "Start Date"
+msgstr "Anfangsdatum"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_state
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "State"
+msgstr "Status"
+
+#. module: donation
+#: model:ir.model,name:donation.model_donation_tax_receipt_option_switch
+msgid "Switch Donation Tax Receipt Option"
+msgstr "Ändere Spendenbescheinigung"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_tax_receipt_id
+#: model:ir.ui.view,arch_db:donation.donation_line_tree
+msgid "Tax Receipt"
+msgstr "Steuerbeleg"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_tax_receipt_total
+#: model:ir.model.fields,field_description:donation.field_donation_line_tax_receipt_amount
+#: model:ir.model.fields,field_description:donation.field_donation_report_tax_receipt_amount
+msgid "Tax Receipt Eligible Amount"
+msgstr "Berechtigter Spendenbescheinigungsbetrag"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_tax_receipt_option
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_new_tax_receipt_option
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Tax Receipt Option"
+msgstr "Spendenbescheinigung"
+
+#. module: donation
+#: model:ir.model,name:donation.model_donation_tax_receipt
+msgid "Tax Receipt for Donations"
+msgstr "Steuerbeleg für Spenden"
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donation_tax_title_menu
+msgid "Tax Receipts"
+msgstr "Spendenbescheinigungen"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:379
+#, python-format
+msgid ""
+"The amount of the donation of %s (%s) is different from the sum of the "
+"donation lines (%s)."
+msgstr ""
+"Der Betrag der Spende von %s1 (%s2) weicht von der Summe der Spendenzeilen "
+"(%s3) ab."
+
+#. module: donation
+#: code:addons/donation/models/donation.py:221
+#, python-format
+msgid ""
+"The date of the donation of %s should be today or in the past, not in the "
+"future!"
+msgstr "Das Datum der Spende von %s darf nicht in der Zukunft liegen!"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:458
+#, python-format
+msgid "The donation '%s' is in Done state, so you cannot delete it."
+msgstr ""
+"Die Spende '%s1 ist im Status 'Erledigt' und kann daher nicht gelöscht "
+"werden."
+
+#. module: donation
+#: code:addons/donation/models/donation.py:462
+#, python-format
+msgid ""
+"The donation '%s' is linked to an account move, so you cannot delete it."
+msgstr ""
+"Die Spende '%s1 ist mit einer Kontobewegung verknüpft und kann daher nicht "
+"gelöscht werden."
+
+#. module: donation
+#: code:addons/donation/models/donation.py:466
+#, python-format
+msgid ""
+"The donation '%s' is linked to the tax receipt %s, so you cannot delete it."
+msgstr ""
+"Die Spende '%s1' ist mit dem Steuerbeleg %s2 und kann daher nicht gelöscht "
+"werden."
+
+#. module: donation
+#: code:addons/donation/models/account.py:19
+#, python-format
+msgid ""
+"The journal '%s' has the option 'Donation Payment Method', so it's type "
+"should be 'Cash' or 'Bank and Checks'."
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_validate_form
+msgid "This wizard will validate all the draft donations selected."
+msgstr "Dieser Assistent bestätigt alle ausgewählten Spendenentwürfe."
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Total"
+msgstr "Gesamt"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_report_tree
+msgid "True"
+msgstr "Wahr"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_unit_price
+msgid "Unit Price"
+msgstr "Preis je Mengeneinheit"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_tax_receipt_option_switch_form
+msgid "Update"
+msgstr "Aktualisieren"
+
+#. module: donation
+#: model:res.groups,name:donation.group_donation_user
+msgid "User"
+msgstr "Nutzer"
+
+#. module: donation
+#: model:ir.model,name:donation.model_res_users
+msgid "Users"
+msgstr "Nutzer"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Validate"
+msgstr "Bestätigen"
+
+#. module: donation
+#: model:ir.model,name:donation.model_donation_validate
+#: model:ir.ui.view,arch_db:donation.donation_validate_form
+msgid "Validate Donations"
+msgstr "Bestätige Spenden"
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_validate_action
+msgid "Validate Draft Donations"
+msgstr "Bestätige Spenden Entwürfe"
+
+#. module: donation
+#: model:res.groups,name:donation.group_donation_viewer
+msgid "Viewer"
+msgstr "Betrachter"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:431
+#, python-format
+msgid ""
+"You cannot cancel this donation because it is linked to the tax receipt %s. "
+"You should first delete this tax receipt (but it may not be legally allowed)."
+msgstr ""
+"Sie können die Spende nicht abbrechen, weil sie mit dem Steuerbeleg  %s1 "
+"verbunden ist. Sie müssen zuerst diesen Steuerbeleg löschen (aber dies mag "
+"rechtlich nicht erlaubt sein)."
+
+#. module: donation
+#: code:addons/donation/models/donation.py:501
+#, python-format
+msgid "You cannot change the Tax Receipt Option when it is Annual."
+msgstr ""
+"Sie können nicht die Steuerbeleg Option ändern, wenn diese jährlich ist."
diff --git a/donation/i18n/donation.pot b/donation/i18n/donation.pot
new file mode 100644
index 000000000..46d4614ac
--- /dev/null
+++ b/donation/i18n/donation.pot
@@ -0,0 +1,731 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+#	* donation
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 11.0\n"
+"Report-Msgid-Bugs-To: \n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_res_partner_donation_count
+#: model:ir.model.fields,field_description:donation.field_res_users_donation_count
+msgid "# of Donations"
+msgstr ""
+
+#. module: donation
+#: code:addons/donation/models/donation.py:450
+#, python-format
+msgid "A cancelled donation should not be linked to a tax receipt"
+msgstr ""
+
+#. module: donation
+#: code:addons/donation/models/donation.py:446
+#, python-format
+msgid "A cancelled donation should not be linked to an account move"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_move_id
+msgid "Account Move"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_amount
+#: model:ir.model.fields,field_description:donation.field_donation_report_amount_company_currency
+msgid "Amount"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_amount_total
+msgid "Amount Total"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_amount_total_company_currency
+msgid "Amount Total in Company Currency"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_amount_company_currency
+msgid "Amount in Company Currency"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_analytic_account_id
+msgid "Analytic Account"
+msgstr ""
+
+#. module: donation
+#: selection:donation.donation,tax_receipt_option:0
+#: selection:donation.tax.receipt.option.switch,new_tax_receipt_option:0
+msgid "Annual Tax Receipt"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Back to Draft"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Campaign"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+#: model:ir.ui.view,arch_db:donation.donation_tax_receipt_option_switch_form
+#: model:ir.ui.view,arch_db:donation.donation_validate_form
+msgid "Cancel"
+msgstr ""
+
+#. module: donation
+#: selection:donation.donation,state:0
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Cancelled"
+msgstr ""
+
+#. module: donation
+#: code:addons/donation/models/donation.py:479
+#, python-format
+msgid "Cancelled Donation of %s"
+msgstr ""
+
+#. module: donation
+#: code:addons/donation/models/donation.py:360
+#, python-format
+msgid "Cannot validate the donation of %s because it doesn't have any lines!"
+msgstr ""
+
+#. module: donation
+#: code:addons/donation/models/donation.py:372
+#, python-format
+msgid "Cannot validate the donation of %s because it is not in draft state."
+msgstr ""
+
+#. module: donation
+#: code:addons/donation/models/donation.py:367
+#, python-format
+msgid "Cannot validate the donation of %s because the total amount is 0 !"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_report_product_categ_id
+msgid "Category of Product"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Change"
+msgstr ""
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_tax_receipt_option_switch_action
+#: model:ir.ui.view,arch_db:donation.donation_tax_receipt_option_switch_form
+msgid "Change Tax Receipt Option"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_check_total
+msgid "Check Amount"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_code
+msgid "Code"
+msgstr ""
+
+#. module: donation
+#: model:ir.model,name:donation.model_donation_campaign
+msgid "Code attributed for a Donation Campaign"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_company_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_company_id
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Company"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_company_currency_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_company_currency_id
+msgid "Company Currency"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donation_config_menu
+msgid "Configuration"
+msgstr ""
+
+#. module: donation
+#: model:ir.model,name:donation.model_res_partner
+msgid "Contact"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_country_id
+msgid "Country"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.tax_receipt_annual_create_menu
+msgid "Create Annual Receipts"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_create_uid
+#: model:ir.model.fields,field_description:donation.field_donation_donation_create_uid
+#: model:ir.model.fields,field_description:donation.field_donation_line_create_uid
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_create_uid
+#: model:ir.model.fields,field_description:donation.field_donation_validate_create_uid
+msgid "Created by"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_create_date
+#: model:ir.model.fields,field_description:donation.field_donation_donation_create_date
+#: model:ir.model.fields,field_description:donation.field_donation_line_create_date
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_create_date
+#: model:ir.model.fields,field_description:donation.field_donation_validate_create_date
+msgid "Created on"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_currency_id
+#: model:ir.model.fields,field_description:donation.field_donation_line_company_currency_id
+#: model:ir.model.fields,field_description:donation.field_donation_line_currency_id
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Currency"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_res_users_context_donation_campaign_id
+msgid "Current Donation Campaign"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_res_users_context_donation_journal_id
+msgid "Current Donation Payment Method"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Date"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_display_name
+#: model:ir.model.fields,field_description:donation.field_donation_donation_display_name
+#: model:ir.model.fields,field_description:donation.field_donation_line_display_name
+#: model:ir.model.fields,field_description:donation.field_donation_report_display_name
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_display_name
+#: model:ir.model.fields,field_description:donation.field_donation_validate_display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: donation
+#: model:ir.model,name:donation.model_donation_donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_donation_id
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_donation_id
+#: model:ir.module.category,name:donation.module_category_donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+#: model:ir.ui.view,arch_db:donation.donation_tree
+msgid "Donation"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_campaign_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_campaign_id
+#: model:ir.ui.view,arch_db:donation.donation_campaign_form
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Donation Campaign"
+msgstr ""
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_campaign_action
+#: model:ir.ui.menu,name:donation.donation_campaign_menu
+#: model:ir.ui.view,arch_db:donation.donation_campaign_tree
+msgid "Donation Campaigns"
+msgstr ""
+
+#. module: donation
+#: model:res.groups,name:donation.group_donation_check_total
+msgid "Donation Check Total"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_donation_date
+#: model:ir.model.fields,field_description:donation.field_donation_report_donation_date
+msgid "Donation Date"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_line_form
+#: model:ir.ui.view,arch_db:donation.donation_line_tree
+msgid "Donation Line"
+msgstr ""
+
+#. module: donation
+#: model:ir.model,name:donation.model_donation_line
+#: model:ir.model.fields,field_description:donation.field_donation_donation_line_ids
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Donation Lines"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_number
+msgid "Donation Number"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_account_journal_allow_donation
+msgid "Donation Payment Method"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donation_tax_receipt_menu
+msgid "Donation Tax Receipts"
+msgstr ""
+
+#. module: donation
+#: code:addons/donation/models/donation.py:240
+#, python-format
+msgid "Donation of %s"
+msgstr ""
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_action
+#: model:ir.actions.act_window,name:donation.partner_donation_action
+#: model:ir.model.fields,field_description:donation.field_res_partner_donation_ids
+#: model:ir.model.fields,field_description:donation.field_res_users_donation_ids
+#: model:ir.ui.menu,name:donation.donation_menu
+#: model:ir.ui.menu,name:donation.donation_title_menu
+#: model:ir.ui.menu,name:donation.donation_top_menu
+#: model:ir.ui.view,arch_db:donation.donation_graph
+#: model:ir.ui.view,arch_db:donation.donation_pivot
+#: model:ir.ui.view,arch_db:donation.donation_report_tree
+#: model:ir.ui.view,arch_db:donation.view_partner_form
+msgid "Donations"
+msgstr ""
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_report_action
+#: model:ir.model,name:donation.model_donation_report
+#: model:ir.ui.menu,name:donation.donation_report_menu
+#: model:ir.ui.view,arch_db:donation.donation_report_graph
+#: model:ir.ui.view,arch_db:donation.donation_report_pivot
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Donations Analysis"
+msgstr ""
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_line_action
+msgid "Donations Lines"
+msgstr ""
+
+#. module: donation
+#: selection:donation.donation,state:0
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Done"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_partner_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_partner_id
+msgid "Donor"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donor
+msgid "Donors"
+msgstr ""
+
+#. module: donation
+#: selection:donation.donation,state:0
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Draft"
+msgstr ""
+
+#. module: donation
+#: code:addons/donation/models/donation.py:477
+#, python-format
+msgid "Draft Donation of %s"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,help:donation.field_donation_donation_tax_receipt_total
+msgid "Eligible Tax Receipt Sub-total in Company Currency"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_report_tax_receipt_ok
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Eligible for a Tax Receipt"
+msgstr ""
+
+#. module: donation
+#: code:addons/donation/models/donation.py:499
+#, python-format
+msgid "Error:"
+msgstr ""
+
+#. module: donation
+#: selection:donation.donation,tax_receipt_option:0
+#: selection:donation.tax.receipt.option.switch,new_tax_receipt_option:0
+msgid "For Each Donation"
+msgstr ""
+
+#. module: donation
+#: code:addons/donation/models/donation.py:397
+#, python-format
+msgid "Full in-kind donation: no account move generated"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Group By"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_id
+#: model:ir.model.fields,field_description:donation.field_donation_donation_id
+#: model:ir.model.fields,field_description:donation.field_donation_line_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_id
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_id
+#: model:ir.model.fields,field_description:donation.field_donation_validate_id
+msgid "ID"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_in_kind
+#: model:ir.model.fields,field_description:donation.field_donation_report_in_kind
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "In Kind"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_tax_receipt_ok
+msgid "Is Eligible for a Tax Receipt"
+msgstr ""
+
+#. module: donation
+#: model:ir.model,name:donation.model_account_journal
+msgid "Journal"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign___last_update
+#: model:ir.model.fields,field_description:donation.field_donation_donation___last_update
+#: model:ir.model.fields,field_description:donation.field_donation_line___last_update
+#: model:ir.model.fields,field_description:donation.field_donation_report___last_update
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch___last_update
+#: model:ir.model.fields,field_description:donation.field_donation_validate___last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_write_uid
+#: model:ir.model.fields,field_description:donation.field_donation_donation_write_uid
+#: model:ir.model.fields,field_description:donation.field_donation_line_write_uid
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_write_uid
+#: model:ir.model.fields,field_description:donation.field_donation_validate_write_uid
+msgid "Last Updated by"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_write_date
+#: model:ir.model.fields,field_description:donation.field_donation_donation_write_date
+#: model:ir.model.fields,field_description:donation.field_donation_line_write_date
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_write_date
+#: model:ir.model.fields,field_description:donation.field_donation_validate_write_date
+msgid "Last Updated on"
+msgstr ""
+
+#. module: donation
+#: model:ir.module.category,description:donation.module_category_donation
+msgid "Manage donations"
+msgstr ""
+
+#. module: donation
+#: model:res.groups,name:donation.group_donation_manager
+msgid "Manager"
+msgstr ""
+
+#. module: donation
+#: code:addons/donation/models/donation.py:273
+#, python-format
+msgid "Missing Default Debit Account on journal '%s'."
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_name
+msgid "Name"
+msgstr ""
+
+#. module: donation
+#: selection:donation.donation,tax_receipt_option:0
+msgid "None"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_nota
+msgid "Notes"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Other Information"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_commercial_partner_id
+msgid "Parent Donor"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Parent Partner"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Partner"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_report_country_id
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Partner Country"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_journal_id
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Payment Method"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_payment_ref
+msgid "Payment Reference"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donation_tax_receipt_print_menu
+msgid "Print Receipts"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_product_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_product_id
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Product"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Product Category"
+msgstr ""
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_product_action
+#: model:ir.ui.menu,name:donation.donation_products
+msgid "Products"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_quantity
+msgid "Quantity"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_donation_ids
+#: model:ir.ui.view,arch_db:donation.donation_tax_receipt_form
+msgid "Related Donations"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donation_report_title_menu
+msgid "Reports"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Save Default Values"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Search Donations"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_sequence
+msgid "Sequence"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,help:donation.field_donation_line_tax_receipt_ok
+msgid "Specify if the product is eligible for a tax receipt"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_start_date
+msgid "Start Date"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_state
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "State"
+msgstr ""
+
+#. module: donation
+#: model:ir.model,name:donation.model_donation_tax_receipt_option_switch
+msgid "Switch Donation Tax Receipt Option"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_tax_receipt_id
+#: model:ir.ui.view,arch_db:donation.donation_line_tree
+msgid "Tax Receipt"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_tax_receipt_total
+#: model:ir.model.fields,field_description:donation.field_donation_line_tax_receipt_amount
+#: model:ir.model.fields,field_description:donation.field_donation_report_tax_receipt_amount
+msgid "Tax Receipt Eligible Amount"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_tax_receipt_option
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_new_tax_receipt_option
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Tax Receipt Option"
+msgstr ""
+
+#. module: donation
+#: model:ir.model,name:donation.model_donation_tax_receipt
+msgid "Tax Receipt for Donations"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donation_tax_title_menu
+msgid "Tax Receipts"
+msgstr ""
+
+#. module: donation
+#: code:addons/donation/models/donation.py:379
+#, python-format
+msgid "The amount of the donation of %s (%s) is different from the sum of the donation lines (%s)."
+msgstr ""
+
+#. module: donation
+#: code:addons/donation/models/donation.py:221
+#, python-format
+msgid "The date of the donation of %s should be today or in the past, not in the future!"
+msgstr ""
+
+#. module: donation
+#: code:addons/donation/models/donation.py:458
+#, python-format
+msgid "The donation '%s' is in Done state, so you cannot delete it."
+msgstr ""
+
+#. module: donation
+#: code:addons/donation/models/donation.py:462
+#, python-format
+msgid "The donation '%s' is linked to an account move, so you cannot delete it."
+msgstr ""
+
+#. module: donation
+#: code:addons/donation/models/donation.py:466
+#, python-format
+msgid "The donation '%s' is linked to the tax receipt %s, so you cannot delete it."
+msgstr ""
+
+#. module: donation
+#: code:addons/donation/models/account.py:19
+#, python-format
+msgid "The journal '%s' has the option 'Donation Payment Method', so it's type should be 'Cash' or 'Bank and Checks'."
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_validate_form
+msgid "This wizard will validate all the draft donations selected."
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Total"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_report_tree
+msgid "True"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_unit_price
+msgid "Unit Price"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_tax_receipt_option_switch_form
+msgid "Update"
+msgstr ""
+
+#. module: donation
+#: model:res.groups,name:donation.group_donation_user
+msgid "User"
+msgstr ""
+
+#. module: donation
+#: model:ir.model,name:donation.model_res_users
+msgid "Users"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Validate"
+msgstr ""
+
+#. module: donation
+#: model:ir.model,name:donation.model_donation_validate
+#: model:ir.ui.view,arch_db:donation.donation_validate_form
+msgid "Validate Donations"
+msgstr ""
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_validate_action
+msgid "Validate Draft Donations"
+msgstr ""
+
+#. module: donation
+#: model:res.groups,name:donation.group_donation_viewer
+msgid "Viewer"
+msgstr ""
+
+#. module: donation
+#: code:addons/donation/models/donation.py:431
+#, python-format
+msgid "You cannot cancel this donation because it is linked to the tax receipt %s. You should first delete this tax receipt (but it may not be legally allowed)."
+msgstr ""
+
+#. module: donation
+#: code:addons/donation/models/donation.py:501
+#, python-format
+msgid "You cannot change the Tax Receipt Option when it is Annual."
+msgstr ""
+
diff --git a/donation/i18n/es.po b/donation/i18n/es.po
new file mode 100644
index 000000000..704793ab8
--- /dev/null
+++ b/donation/i18n/es.po
@@ -0,0 +1,758 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * donation
+#
+# Translators:
+# enjolras <yo@miguelrevilla.com>, 2018
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 10.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-03-11 21:44+0000\n"
+"PO-Revision-Date: 2019-12-19 18:05+0000\n"
+"Last-Translator: Enric Tobella <etobella@creublanca.es>\n"
+"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 3.9.1\n"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_res_partner_donation_count
+#: model:ir.model.fields,field_description:donation.field_res_users_donation_count
+msgid "# of Donations"
+msgstr "# de Donativos"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:450
+#, python-format
+msgid "A cancelled donation should not be linked to a tax receipt"
+msgstr "Una donación cancelada no se puede unir a un recibo de impuestos"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:446
+#, python-format
+msgid "A cancelled donation should not be linked to an account move"
+msgstr "Una donación cancelada no se debe unir a un asiento contable"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_move_id
+msgid "Account Move"
+msgstr "Asiento contable"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_amount
+#: model:ir.model.fields,field_description:donation.field_donation_report_amount_company_currency
+msgid "Amount"
+msgstr "Importe"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_amount_total
+msgid "Amount Total"
+msgstr "Importe total"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_amount_total_company_currency
+msgid "Amount Total in Company Currency"
+msgstr "Importe total en moneda de la compañía"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_amount_company_currency
+msgid "Amount in Company Currency"
+msgstr "Importe en moneda de la Compañía"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_analytic_account_id
+msgid "Analytic Account"
+msgstr "Cuenta analítica"
+
+#. module: donation
+#: selection:donation.donation,tax_receipt_option:0
+#: selection:donation.tax.receipt.option.switch,new_tax_receipt_option:0
+msgid "Annual Tax Receipt"
+msgstr "Recibo de impuestos anual"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Back to Draft"
+msgstr "Devolver a Borrador"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Campaign"
+msgstr "Campaña"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+#: model:ir.ui.view,arch_db:donation.donation_tax_receipt_option_switch_form
+#: model:ir.ui.view,arch_db:donation.donation_validate_form
+msgid "Cancel"
+msgstr "Cancelar"
+
+#. module: donation
+#: selection:donation.donation,state:0
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Cancelled"
+msgstr "Cancelado"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:479
+#, python-format
+msgid "Cancelled Donation of %s"
+msgstr "Donación cancelada de %s"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:360
+#, python-format
+msgid "Cannot validate the donation of %s because it doesn't have any lines!"
+msgstr "No se puede validar la donación de %s porque no tiene líneas!"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:372
+#, python-format
+msgid "Cannot validate the donation of %s because it is not in draft state."
+msgstr ""
+"No se puede validar la donación de %s porque no está en estado borrador."
+
+#. module: donation
+#: code:addons/donation/models/donation.py:367
+#, python-format
+msgid "Cannot validate the donation of %s because the total amount is 0 !"
+msgstr "No se puede validar la donación %s por que el importe total es 0 !"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_report_product_categ_id
+msgid "Category of Product"
+msgstr "Categoría de producto"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Change"
+msgstr "Cambiar"
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_tax_receipt_option_switch_action
+#: model:ir.ui.view,arch_db:donation.donation_tax_receipt_option_switch_form
+msgid "Change Tax Receipt Option"
+msgstr "Cambiar la opción del recibo de impuestos"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_check_total
+msgid "Check Amount"
+msgstr "Comprobar importe"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_code
+msgid "Code"
+msgstr "Código"
+
+#. module: donation
+#: model:ir.model,name:donation.model_donation_campaign
+msgid "Code attributed for a Donation Campaign"
+msgstr "Código asignado a una campaña de donativos"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_company_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_company_id
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Company"
+msgstr "Compañía"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_company_currency_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_company_currency_id
+msgid "Company Currency"
+msgstr "Moneda de la Compañía"
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donation_config_menu
+msgid "Configuration"
+msgstr "Configuración"
+
+#. module: donation
+#: model:ir.model,name:donation.model_res_partner
+msgid "Contact"
+msgstr "Contacto"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_country_id
+msgid "Country"
+msgstr "País"
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.tax_receipt_annual_create_menu
+msgid "Create Annual Receipts"
+msgstr "Crear recibos anuales"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_create_uid
+#: model:ir.model.fields,field_description:donation.field_donation_donation_create_uid
+#: model:ir.model.fields,field_description:donation.field_donation_line_create_uid
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_create_uid
+#: model:ir.model.fields,field_description:donation.field_donation_validate_create_uid
+msgid "Created by"
+msgstr "Creado por"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_create_date
+#: model:ir.model.fields,field_description:donation.field_donation_donation_create_date
+#: model:ir.model.fields,field_description:donation.field_donation_line_create_date
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_create_date
+#: model:ir.model.fields,field_description:donation.field_donation_validate_create_date
+msgid "Created on"
+msgstr "Creado el"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_currency_id
+#: model:ir.model.fields,field_description:donation.field_donation_line_company_currency_id
+#: model:ir.model.fields,field_description:donation.field_donation_line_currency_id
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Currency"
+msgstr "Moneda"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_res_users_context_donation_campaign_id
+msgid "Current Donation Campaign"
+msgstr "Campaña actual de donativos"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_res_users_context_donation_journal_id
+msgid "Current Donation Payment Method"
+msgstr "Método de pago de la donación actual"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Date"
+msgstr "Fecha"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_display_name
+#: model:ir.model.fields,field_description:donation.field_donation_donation_display_name
+#: model:ir.model.fields,field_description:donation.field_donation_line_display_name
+#: model:ir.model.fields,field_description:donation.field_donation_report_display_name
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_display_name
+#: model:ir.model.fields,field_description:donation.field_donation_validate_display_name
+msgid "Display Name"
+msgstr "Nombre mostrado"
+
+#. module: donation
+#: model:ir.model,name:donation.model_donation_donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_donation_id
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_donation_id
+#: model:ir.module.category,name:donation.module_category_donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+#: model:ir.ui.view,arch_db:donation.donation_tree
+msgid "Donation"
+msgstr "Donativo"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_campaign_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_campaign_id
+#: model:ir.ui.view,arch_db:donation.donation_campaign_form
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Donation Campaign"
+msgstr "Campaña de donativo"
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_campaign_action
+#: model:ir.ui.menu,name:donation.donation_campaign_menu
+#: model:ir.ui.view,arch_db:donation.donation_campaign_tree
+msgid "Donation Campaigns"
+msgstr "Campañas de donativos"
+
+#. module: donation
+#: model:res.groups,name:donation.group_donation_check_total
+msgid "Donation Check Total"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_donation_date
+#: model:ir.model.fields,field_description:donation.field_donation_report_donation_date
+msgid "Donation Date"
+msgstr "Fecha de la donación"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_line_form
+#: model:ir.ui.view,arch_db:donation.donation_line_tree
+msgid "Donation Line"
+msgstr "Línea de donativos"
+
+#. module: donation
+#: model:ir.model,name:donation.model_donation_line
+#: model:ir.model.fields,field_description:donation.field_donation_donation_line_ids
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Donation Lines"
+msgstr "Líneas de donativos"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_number
+msgid "Donation Number"
+msgstr "Número de donativo"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_account_journal_allow_donation
+msgid "Donation Payment Method"
+msgstr "Método de pago del donativo"
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donation_tax_receipt_menu
+msgid "Donation Tax Receipts"
+msgstr "Recibo de impuestos de donativo"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:240
+#, python-format
+msgid "Donation of %s"
+msgstr "Donativo de %s"
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_action
+#: model:ir.actions.act_window,name:donation.partner_donation_action
+#: model:ir.model.fields,field_description:donation.field_res_partner_donation_ids
+#: model:ir.model.fields,field_description:donation.field_res_users_donation_ids
+#: model:ir.ui.menu,name:donation.donation_menu
+#: model:ir.ui.menu,name:donation.donation_title_menu
+#: model:ir.ui.menu,name:donation.donation_top_menu
+#: model:ir.ui.view,arch_db:donation.donation_graph
+#: model:ir.ui.view,arch_db:donation.donation_pivot
+#: model:ir.ui.view,arch_db:donation.donation_report_tree
+#: model:ir.ui.view,arch_db:donation.view_partner_form
+msgid "Donations"
+msgstr "Donativos"
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_report_action
+#: model:ir.model,name:donation.model_donation_report
+#: model:ir.ui.menu,name:donation.donation_report_menu
+#: model:ir.ui.view,arch_db:donation.donation_report_graph
+#: model:ir.ui.view,arch_db:donation.donation_report_pivot
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Donations Analysis"
+msgstr "Análisis de donativos"
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_line_action
+msgid "Donations Lines"
+msgstr "Líneas de donativos"
+
+#. module: donation
+#: selection:donation.donation,state:0
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Done"
+msgstr "Realizado"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_partner_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_partner_id
+msgid "Donor"
+msgstr "Donante"
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donor
+msgid "Donors"
+msgstr "Donantes"
+
+#. module: donation
+#: selection:donation.donation,state:0
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Draft"
+msgstr "Borrador"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:477
+#, python-format
+msgid "Draft Donation of %s"
+msgstr "Donación borrador de %s"
+
+#. module: donation
+#: model:ir.model.fields,help:donation.field_donation_donation_tax_receipt_total
+msgid "Eligible Tax Receipt Sub-total in Company Currency"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_report_tax_receipt_ok
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Eligible for a Tax Receipt"
+msgstr "Elegible para un recibo de impuestos"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:499
+#, python-format
+msgid "Error:"
+msgstr "Error:"
+
+#. module: donation
+#: selection:donation.donation,tax_receipt_option:0
+#: selection:donation.tax.receipt.option.switch,new_tax_receipt_option:0
+msgid "For Each Donation"
+msgstr "Por cada donación"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:397
+#, python-format
+msgid "Full in-kind donation: no account move generated"
+msgstr "Donación completamente en especie: no se genera asiento contable"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Group By"
+msgstr "Agrupar por"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_id
+#: model:ir.model.fields,field_description:donation.field_donation_donation_id
+#: model:ir.model.fields,field_description:donation.field_donation_line_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_id
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_id
+#: model:ir.model.fields,field_description:donation.field_donation_validate_id
+msgid "ID"
+msgstr "ID"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_in_kind
+#: model:ir.model.fields,field_description:donation.field_donation_report_in_kind
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "In Kind"
+msgstr "En especie"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_tax_receipt_ok
+msgid "Is Eligible for a Tax Receipt"
+msgstr "Es elegible para un recibo de impuestos"
+
+#. module: donation
+#: model:ir.model,name:donation.model_account_journal
+msgid "Journal"
+msgstr "Diario"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign___last_update
+#: model:ir.model.fields,field_description:donation.field_donation_donation___last_update
+#: model:ir.model.fields,field_description:donation.field_donation_line___last_update
+#: model:ir.model.fields,field_description:donation.field_donation_report___last_update
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch___last_update
+#: model:ir.model.fields,field_description:donation.field_donation_validate___last_update
+msgid "Last Modified on"
+msgstr "Última modificación el"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_write_uid
+#: model:ir.model.fields,field_description:donation.field_donation_donation_write_uid
+#: model:ir.model.fields,field_description:donation.field_donation_line_write_uid
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_write_uid
+#: model:ir.model.fields,field_description:donation.field_donation_validate_write_uid
+msgid "Last Updated by"
+msgstr "Última actualización por"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_write_date
+#: model:ir.model.fields,field_description:donation.field_donation_donation_write_date
+#: model:ir.model.fields,field_description:donation.field_donation_line_write_date
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_write_date
+#: model:ir.model.fields,field_description:donation.field_donation_validate_write_date
+msgid "Last Updated on"
+msgstr "Última actualización el"
+
+#. module: donation
+#: model:ir.module.category,description:donation.module_category_donation
+msgid "Manage donations"
+msgstr "Gestionar donativos"
+
+#. module: donation
+#: model:res.groups,name:donation.group_donation_manager
+msgid "Manager"
+msgstr "Gestor"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:273
+#, python-format
+msgid "Missing Default Debit Account on journal '%s'."
+msgstr "Falta la cuenta de débito por defecto del diario '%s'."
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_name
+msgid "Name"
+msgstr "Nombre"
+
+#. module: donation
+#: selection:donation.donation,tax_receipt_option:0
+msgid "None"
+msgstr "Ninguno"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_nota
+msgid "Notes"
+msgstr "Notas"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Other Information"
+msgstr "Otra información"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_commercial_partner_id
+msgid "Parent Donor"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Parent Partner"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Partner"
+msgstr "Empresa"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_report_country_id
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Partner Country"
+msgstr "País de la empresa"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_journal_id
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Payment Method"
+msgstr "Método de pago"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_payment_ref
+msgid "Payment Reference"
+msgstr "Referencia de pago"
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donation_tax_receipt_print_menu
+msgid "Print Receipts"
+msgstr "Imprimir recibos"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_product_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_product_id
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Product"
+msgstr "Producto"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Product Category"
+msgstr "Categoría de producto"
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_product_action
+#: model:ir.ui.menu,name:donation.donation_products
+msgid "Products"
+msgstr "Productos"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_quantity
+msgid "Quantity"
+msgstr "Cantidad"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_donation_ids
+#: model:ir.ui.view,arch_db:donation.donation_tax_receipt_form
+msgid "Related Donations"
+msgstr "Donaciones relacionadas"
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donation_report_title_menu
+msgid "Reports"
+msgstr "Informes"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Save Default Values"
+msgstr "Guardar valores por defecto"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Search Donations"
+msgstr "Buscar Donativos"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_sequence
+msgid "Sequence"
+msgstr "Sequencia"
+
+#. module: donation
+#: model:ir.model.fields,help:donation.field_donation_line_tax_receipt_ok
+msgid "Specify if the product is eligible for a tax receipt"
+msgstr "Especifica si el producto es elegible para un recibo de impuestos"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_start_date
+msgid "Start Date"
+msgstr "Fecha de inicio"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_state
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "State"
+msgstr "Estado"
+
+#. module: donation
+#: model:ir.model,name:donation.model_donation_tax_receipt_option_switch
+msgid "Switch Donation Tax Receipt Option"
+msgstr "Cambiar la opción del recibo de impuestos  de donaciones"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_tax_receipt_id
+#: model:ir.ui.view,arch_db:donation.donation_line_tree
+msgid "Tax Receipt"
+msgstr "Recibo de impuestos"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_tax_receipt_total
+#: model:ir.model.fields,field_description:donation.field_donation_line_tax_receipt_amount
+#: model:ir.model.fields,field_description:donation.field_donation_report_tax_receipt_amount
+msgid "Tax Receipt Eligible Amount"
+msgstr "Importe elegible para recibo de impuestos"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_tax_receipt_option
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_new_tax_receipt_option
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Tax Receipt Option"
+msgstr "Opción de recibo de impuestos"
+
+#. module: donation
+#: model:ir.model,name:donation.model_donation_tax_receipt
+msgid "Tax Receipt for Donations"
+msgstr "Recibo de impuestos para donaciones"
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donation_tax_title_menu
+msgid "Tax Receipts"
+msgstr "Recibo de donaciones"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:379
+#, python-format
+msgid ""
+"The amount of the donation of %s (%s) is different from the sum of the "
+"donation lines (%s)."
+msgstr ""
+"El importe de la donación de %s (%s) es diferente a la suma de las lineas de "
+"donaciones (%s)."
+
+#. module: donation
+#: code:addons/donation/models/donation.py:221
+#, python-format
+msgid ""
+"The date of the donation of %s should be today or in the past, not in the "
+"future!"
+msgstr ""
+"La fecha de la donación de %s debe ser hoy o en el pasado, no en el futuro!"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:458
+#, python-format
+msgid "The donation '%s' is in Done state, so you cannot delete it."
+msgstr "La donación '%s' está en el estado Realizado, no puede eliminarla."
+
+#. module: donation
+#: code:addons/donation/models/donation.py:462
+#, python-format
+msgid ""
+"The donation '%s' is linked to an account move, so you cannot delete it."
+msgstr ""
+"La donación '%s' está unida a un asiento contable, así que no puede ser "
+"eliminada."
+
+#. module: donation
+#: code:addons/donation/models/donation.py:466
+#, python-format
+msgid ""
+"The donation '%s' is linked to the tax receipt %s, so you cannot delete it."
+msgstr ""
+"La donación '%s' está unida al recibo de impuestos %s, así que no puede ser "
+"eliminada."
+
+#. module: donation
+#: code:addons/donation/models/account.py:19
+#, python-format
+msgid ""
+"The journal '%s' has the option 'Donation Payment Method', so it's type "
+"should be 'Cash' or 'Bank and Checks'."
+msgstr ""
+"El diario '%s' tiene la opción 'Método de Pago de Donativos', así que el "
+"tipo debe ser 'Efectivo' o 'Banco'."
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_validate_form
+msgid "This wizard will validate all the draft donations selected."
+msgstr "El asistente validará todas las donaciones en borrador seleccionadas."
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Total"
+msgstr "Total"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_report_tree
+msgid "True"
+msgstr "Verdadero"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_unit_price
+msgid "Unit Price"
+msgstr "Precio unitario"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_tax_receipt_option_switch_form
+msgid "Update"
+msgstr "Actualizar"
+
+#. module: donation
+#: model:res.groups,name:donation.group_donation_user
+msgid "User"
+msgstr "Usuario"
+
+#. module: donation
+#: model:ir.model,name:donation.model_res_users
+msgid "Users"
+msgstr "Usuarios"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Validate"
+msgstr "Validar"
+
+#. module: donation
+#: model:ir.model,name:donation.model_donation_validate
+#: model:ir.ui.view,arch_db:donation.donation_validate_form
+msgid "Validate Donations"
+msgstr "Validar donativos"
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_validate_action
+msgid "Validate Draft Donations"
+msgstr "Validar donativos en borrador"
+
+#. module: donation
+#: model:res.groups,name:donation.group_donation_viewer
+msgid "Viewer"
+msgstr "Visualizador"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:431
+#, python-format
+msgid ""
+"You cannot cancel this donation because it is linked to the tax receipt %s. "
+"You should first delete this tax receipt (but it may not be legally allowed)."
+msgstr ""
+"No puede cancelar la donación por que está unida al recibo de impuestos %s. "
+"Primero debe eliminar el recibo de impuestos (aunque puede que no sea legal)."
+
+#. module: donation
+#: code:addons/donation/models/donation.py:501
+#, python-format
+msgid "You cannot change the Tax Receipt Option when it is Annual."
+msgstr "No puede cambiar la opción del recibo de impuestos cuando es Anual."
diff --git a/donation/i18n/fr.po b/donation/i18n/fr.po
new file mode 100644
index 000000000..081c6f8d4
--- /dev/null
+++ b/donation/i18n/fr.po
@@ -0,0 +1,798 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# 	* donation
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 8.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-05-29 23:07+0000\n"
+"PO-Revision-Date: 2015-05-29 23:07+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_res_partner_donation_count
+#: model:ir.model.fields,field_description:donation.field_res_users_donation_count
+msgid "# of Donations"
+msgstr "Nombre de dons"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:450
+#, python-format
+msgid "A cancelled donation should not be linked to a tax receipt"
+msgstr "Un don annulé ne devrait pas être lié à un reçu fiscal"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:446
+#, python-format
+msgid "A cancelled donation should not be linked to an account move"
+msgstr "Un don annulé ne devrait pas être lié à une écriture comptable"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_move_id
+msgid "Account Move"
+msgstr "Ecriture comptable"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_amount
+#: model:ir.model.fields,field_description:donation.field_donation_report_amount_company_currency
+msgid "Amount"
+msgstr "Montant"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_amount_total
+msgid "Amount Total"
+msgstr "Montant total"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_amount_total_company_currency
+msgid "Amount Total in Company Currency"
+msgstr "Montant total dans la devise de la société"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_amount_company_currency
+msgid "Amount in Company Currency"
+msgstr "Montant dans la devise de la société"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_analytic_account_id
+msgid "Analytic Account"
+msgstr "Compte analytique"
+
+#. module: donation
+#: selection:donation.donation,tax_receipt_option:0
+#: selection:donation.tax.receipt.option.switch,new_tax_receipt_option:0
+msgid "Annual Tax Receipt"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Back to Draft"
+msgstr "Retour à l'état brouillon"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Campaign"
+msgstr "Campagne de don"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+#: model:ir.ui.view,arch_db:donation.donation_tax_receipt_option_switch_form
+#: model:ir.ui.view,arch_db:donation.donation_validate_form
+msgid "Cancel"
+msgstr "Annuler"
+
+#. module: donation
+#: selection:donation.donation,state:0
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Cancelled"
+msgstr "Annulé"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:479
+#, python-format
+msgid "Cancelled Donation of %s"
+msgstr "Don annulé de %s"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:360
+#, python-format
+msgid "Cannot validate the donation of %s because it doesn't have any lines!"
+msgstr ""
+"Impossible de valider le don de %s parce qu'il ne contient aucune ligne !"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:372
+#, python-format
+msgid "Cannot validate the donation of %s because it is not in draft state."
+msgstr ""
+"Impossible de valider le don de %s parce qu'il n'est pas à l'état brouillon."
+
+#. module: donation
+#: code:addons/donation/models/donation.py:367
+#, fuzzy, python-format
+msgid "Cannot validate the donation of %s because the total amount is 0 !"
+msgstr ""
+"Impossible de valider le don de %s parce qu'il ne contient aucune ligne !"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_report_product_categ_id
+msgid "Category of Product"
+msgstr "Catégorie de produit"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Change"
+msgstr ""
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_tax_receipt_option_switch_action
+#: model:ir.ui.view,arch_db:donation.donation_tax_receipt_option_switch_form
+msgid "Change Tax Receipt Option"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_check_total
+msgid "Check Amount"
+msgstr "Montant"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_code
+msgid "Code"
+msgstr "Code"
+
+#. module: donation
+#: model:ir.model,name:donation.model_donation_campaign
+msgid "Code attributed for a Donation Campaign"
+msgstr "Code attribué pour une campagne de don"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_company_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_company_id
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Company"
+msgstr "Société"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_company_currency_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_company_currency_id
+msgid "Company Currency"
+msgstr "Devise de la société"
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donation_config_menu
+msgid "Configuration"
+msgstr "Configuration"
+
+#. module: donation
+#: model:ir.model,name:donation.model_res_partner
+msgid "Contact"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_country_id
+msgid "Country"
+msgstr "Pays"
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.tax_receipt_annual_create_menu
+msgid "Create Annual Receipts"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_create_uid
+#: model:ir.model.fields,field_description:donation.field_donation_donation_create_uid
+#: model:ir.model.fields,field_description:donation.field_donation_line_create_uid
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_create_uid
+#: model:ir.model.fields,field_description:donation.field_donation_validate_create_uid
+msgid "Created by"
+msgstr "Créé par"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_create_date
+#: model:ir.model.fields,field_description:donation.field_donation_donation_create_date
+#: model:ir.model.fields,field_description:donation.field_donation_line_create_date
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_create_date
+#: model:ir.model.fields,field_description:donation.field_donation_validate_create_date
+msgid "Created on"
+msgstr "Créé le"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_currency_id
+#: model:ir.model.fields,field_description:donation.field_donation_line_company_currency_id
+#: model:ir.model.fields,field_description:donation.field_donation_line_currency_id
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Currency"
+msgstr "Devise"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_res_users_context_donation_campaign_id
+msgid "Current Donation Campaign"
+msgstr "Campagne de don courante"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_res_users_context_donation_journal_id
+msgid "Current Donation Payment Method"
+msgstr "Méthode de paiement actuelle"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Date"
+msgstr "Date"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_display_name
+#: model:ir.model.fields,field_description:donation.field_donation_donation_display_name
+#: model:ir.model.fields,field_description:donation.field_donation_line_display_name
+#: model:ir.model.fields,field_description:donation.field_donation_report_display_name
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_display_name
+#: model:ir.model.fields,field_description:donation.field_donation_validate_display_name
+msgid "Display Name"
+msgstr "Nom affiché"
+
+#. module: donation
+#: model:ir.model,name:donation.model_donation_donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_donation_id
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_donation_id
+#: model:ir.module.category,name:donation.module_category_donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+#: model:ir.ui.view,arch_db:donation.donation_tree
+msgid "Donation"
+msgstr "Don"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_campaign_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_campaign_id
+#: model:ir.ui.view,arch_db:donation.donation_campaign_form
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Donation Campaign"
+msgstr "Campagne de don"
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_campaign_action
+#: model:ir.ui.menu,name:donation.donation_campaign_menu
+#: model:ir.ui.view,arch_db:donation.donation_campaign_tree
+msgid "Donation Campaigns"
+msgstr "Campagnes de don"
+
+#. module: donation
+#: model:res.groups,name:donation.group_donation_check_total
+msgid "Donation Check Total"
+msgstr "Don : saisie du total"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_donation_date
+#: model:ir.model.fields,field_description:donation.field_donation_report_donation_date
+msgid "Donation Date"
+msgstr "Date du don"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_line_form
+#: model:ir.ui.view,arch_db:donation.donation_line_tree
+msgid "Donation Line"
+msgstr "Ligne de don"
+
+#. module: donation
+#: model:ir.model,name:donation.model_donation_line
+#: model:ir.model.fields,field_description:donation.field_donation_donation_line_ids
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Donation Lines"
+msgstr "Lignes de don"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_number
+msgid "Donation Number"
+msgstr "Numéro de don"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_account_journal_allow_donation
+msgid "Donation Payment Method"
+msgstr "Méthode de paiement de don"
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donation_tax_receipt_menu
+msgid "Donation Tax Receipts"
+msgstr "Reçus fiscaux"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:240
+#, python-format
+msgid "Donation of %s"
+msgstr "Don de %s"
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_action
+#: model:ir.actions.act_window,name:donation.partner_donation_action
+#: model:ir.model.fields,field_description:donation.field_res_partner_donation_ids
+#: model:ir.model.fields,field_description:donation.field_res_users_donation_ids
+#: model:ir.ui.menu,name:donation.donation_menu
+#: model:ir.ui.menu,name:donation.donation_title_menu
+#: model:ir.ui.menu,name:donation.donation_top_menu
+#: model:ir.ui.view,arch_db:donation.donation_graph
+#: model:ir.ui.view,arch_db:donation.donation_pivot
+#: model:ir.ui.view,arch_db:donation.donation_report_tree
+#: model:ir.ui.view,arch_db:donation.view_partner_form
+msgid "Donations"
+msgstr "Dons"
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_report_action
+#: model:ir.model,name:donation.model_donation_report
+#: model:ir.ui.menu,name:donation.donation_report_menu
+#: model:ir.ui.view,arch_db:donation.donation_report_graph
+#: model:ir.ui.view,arch_db:donation.donation_report_pivot
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Donations Analysis"
+msgstr "Analyse des dons"
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_line_action
+msgid "Donations Lines"
+msgstr "Lignes de dons"
+
+#. module: donation
+#: selection:donation.donation,state:0
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Done"
+msgstr "Validé"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_partner_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_partner_id
+msgid "Donor"
+msgstr "Donateur"
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donor
+msgid "Donors"
+msgstr "Donateurs"
+
+#. module: donation
+#: selection:donation.donation,state:0
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Draft"
+msgstr "Brouillon"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:477
+#, python-format
+msgid "Draft Donation of %s"
+msgstr "Don brouillon de %s"
+
+#. module: donation
+#: model:ir.model.fields,help:donation.field_donation_donation_tax_receipt_total
+msgid "Eligible Tax Receipt Sub-total in Company Currency"
+msgstr "Montant éligible au reçu fiscal dans la monnaie de la société"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_report_tax_receipt_ok
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Eligible for a Tax Receipt"
+msgstr ""
+
+#. module: donation
+#: code:addons/donation/models/donation.py:499
+#, python-format
+msgid "Error:"
+msgstr ""
+
+#. module: donation
+#: selection:donation.donation,tax_receipt_option:0
+#: selection:donation.tax.receipt.option.switch,new_tax_receipt_option:0
+msgid "For Each Donation"
+msgstr "Pour chaque don"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:397
+#, python-format
+msgid "Full in-kind donation: no account move generated"
+msgstr "Don en nature: aucune écriture comptable générée"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Group By"
+msgstr "Grouper par"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_id
+#: model:ir.model.fields,field_description:donation.field_donation_donation_id
+#: model:ir.model.fields,field_description:donation.field_donation_line_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_id
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_id
+#: model:ir.model.fields,field_description:donation.field_donation_validate_id
+msgid "ID"
+msgstr "ID"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_in_kind
+#: model:ir.model.fields,field_description:donation.field_donation_report_in_kind
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "In Kind"
+msgstr "En nature"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_tax_receipt_ok
+msgid "Is Eligible for a Tax Receipt"
+msgstr ""
+
+#. module: donation
+#: model:ir.model,name:donation.model_account_journal
+msgid "Journal"
+msgstr "Journal"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign___last_update
+#: model:ir.model.fields,field_description:donation.field_donation_donation___last_update
+#: model:ir.model.fields,field_description:donation.field_donation_line___last_update
+#: model:ir.model.fields,field_description:donation.field_donation_report___last_update
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch___last_update
+#: model:ir.model.fields,field_description:donation.field_donation_validate___last_update
+msgid "Last Modified on"
+msgstr "Dernière mise à jour le"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_write_uid
+#: model:ir.model.fields,field_description:donation.field_donation_donation_write_uid
+#: model:ir.model.fields,field_description:donation.field_donation_line_write_uid
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_write_uid
+#: model:ir.model.fields,field_description:donation.field_donation_validate_write_uid
+msgid "Last Updated by"
+msgstr "Dernière mise à jour par"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_write_date
+#: model:ir.model.fields,field_description:donation.field_donation_donation_write_date
+#: model:ir.model.fields,field_description:donation.field_donation_line_write_date
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_write_date
+#: model:ir.model.fields,field_description:donation.field_donation_validate_write_date
+msgid "Last Updated on"
+msgstr "Dernière mise à jour le"
+
+#. module: donation
+#: model:ir.module.category,description:donation.module_category_donation
+msgid "Manage donations"
+msgstr "Gérer les dons"
+
+#. module: donation
+#: model:res.groups,name:donation.group_donation_manager
+msgid "Manager"
+msgstr "Responsable"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:273
+#, python-format
+msgid "Missing Default Debit Account on journal '%s'."
+msgstr "Compte de débit par défaut manquant sur le journal '%s'."
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_name
+msgid "Name"
+msgstr "Nom"
+
+#. module: donation
+#: selection:donation.donation,tax_receipt_option:0
+msgid "None"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_nota
+msgid "Notes"
+msgstr "Notes"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Other Information"
+msgstr "Autres informations"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_commercial_partner_id
+msgid "Parent Donor"
+msgstr "Donateur parent"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Partner"
+msgstr "Partenaire"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_report_country_id
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Partner Country"
+msgstr "Pays du partenaire"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_journal_id
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Payment Method"
+msgstr "Méthode de paiement"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_payment_ref
+msgid "Payment Reference"
+msgstr "Référence du paiement"
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donation_tax_receipt_print_menu
+msgid "Print Receipts"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_product_id
+#: model:ir.model.fields,field_description:donation.field_donation_report_product_id
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Product"
+msgstr "Article"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_report_search
+msgid "Product Category"
+msgstr "Catégorie d'article"
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_product_action
+#: model:ir.ui.menu,name:donation.donation_products
+msgid "Products"
+msgstr "Articles"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_quantity
+msgid "Quantity"
+msgstr "Quantité"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_donation_ids
+#: model:ir.ui.view,arch_db:donation.donation_tax_receipt_form
+msgid "Related Donations"
+msgstr "Dons associés"
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donation_report_title_menu
+msgid "Reports"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Save Default Values"
+msgstr "Enregistrer les valeurs par défaut"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Search Donations"
+msgstr "Recherche des dons"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_sequence
+msgid "Sequence"
+msgstr "Séquence"
+
+#. module: donation
+#: model:ir.model.fields,help:donation.field_donation_line_tax_receipt_ok
+msgid "Specify if the product is eligible for a tax receipt"
+msgstr "Spécifie si le produit est éligible au reçu fiscal."
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_campaign_start_date
+msgid "Start Date"
+msgstr "Date de départ"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_state
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "State"
+msgstr "État"
+
+#. module: donation
+#: model:ir.model,name:donation.model_donation_tax_receipt_option_switch
+msgid "Switch Donation Tax Receipt Option"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_tax_receipt_id
+#: model:ir.ui.view,arch_db:donation.donation_line_tree
+msgid "Tax Receipt"
+msgstr "Reçu fiscal"
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_tax_receipt_total
+#: model:ir.model.fields,field_description:donation.field_donation_line_tax_receipt_amount
+#: model:ir.model.fields,field_description:donation.field_donation_report_tax_receipt_amount
+msgid "Tax Receipt Eligible Amount"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_donation_tax_receipt_option
+#: model:ir.model.fields,field_description:donation.field_donation_tax_receipt_option_switch_new_tax_receipt_option
+#: model:ir.ui.view,arch_db:donation.donation_search
+msgid "Tax Receipt Option"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.menu,name:donation.donation_tax_title_menu
+msgid "Tax Receipts"
+msgstr "Reçus fiscaux"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:379
+#, python-format
+msgid ""
+"The amount of the donation of %s (%s) is different from the sum of the "
+"donation lines (%s)."
+msgstr ""
+"Le montant du don de %s (%s) est différent de la somme des lignes de don "
+"(%s)."
+
+#. module: donation
+#: code:addons/donation/models/donation.py:221
+#, python-format
+msgid ""
+"The date of the donation of %s should be today or in the past, not in the "
+"future!"
+msgstr ""
+"La date du don de %s devrait être aujourd'hui ou dans le passé, pas dans le "
+"futur !"
+
+#. module: donation
+#: code:addons/donation/models/donation.py:458
+#, python-format
+msgid "The donation '%s' is in Done state, so you cannot delete it."
+msgstr "Le don '%s' est à l'état validé, donc vous ne pouvez pas le supprimer."
+
+#. module: donation
+#: code:addons/donation/models/donation.py:462
+#, python-format
+msgid ""
+"The donation '%s' is linked to an account move, so you cannot delete it."
+msgstr ""
+"Le don '%s' est lié à une écriture comptable, donc vous ne pouvez pas le "
+"supprimer."
+
+#. module: donation
+#: code:addons/donation/models/donation.py:466
+#, python-format
+msgid ""
+"The donation '%s' is linked to the tax receipt %s, so you cannot delete it."
+msgstr ""
+"Le don '%s' est lié au reçu fiscal %s, donc vous ne pouvez pas le "
+"supprimer."
+
+#. module: donation
+#: code:addons/donation/models/account.py:19
+#, python-format
+msgid ""
+"The journal '%s' has the option 'Donation Payment Method', so it's type "
+"should be 'Cash' or 'Bank and Checks'."
+msgstr ""
+"Le journal '%s' a l'option 'Méthode de paiement de don', donc il doit être "
+"de type 'Espèce' ou 'Banque et chèque'."
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_validate_form
+msgid "This wizard will validate all the draft donations selected."
+msgstr "Cet assistant validera tous les dons brouillons sélectionnés."
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Total"
+msgstr ""
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_report_tree
+msgid "True"
+msgstr ""
+
+#. module: donation
+#: model:ir.model.fields,field_description:donation.field_donation_line_unit_price
+msgid "Unit Price"
+msgstr "Prix unitaire"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_tax_receipt_option_switch_form
+msgid "Update"
+msgstr ""
+
+#. module: donation
+#: model:res.groups,name:donation.group_donation_user
+msgid "User"
+msgstr "Utilisateur"
+
+#. module: donation
+#: model:ir.model,name:donation.model_res_users
+msgid "Users"
+msgstr "Utilisateurs"
+
+#. module: donation
+#: model:ir.ui.view,arch_db:donation.donation_form
+msgid "Validate"
+msgstr "Valider"
+
+#. module: donation
+#: model:ir.model,name:donation.model_donation_validate
+#: model:ir.ui.view,arch_db:donation.donation_validate_form
+msgid "Validate Donations"
+msgstr "Valider les dons"
+
+#. module: donation
+#: model:ir.actions.act_window,name:donation.donation_validate_action
+msgid "Validate Draft Donations"
+msgstr "Valider les dons brouillons"
+
+#. module: donation
+#: model:res.groups,name:donation.group_donation_viewer
+msgid "Viewer"
+msgstr ""
+
+#. module: donation
+#: code:addons/donation/models/donation.py:431
+#, python-format
+msgid ""
+"You cannot cancel this donation because it is linked to the tax receipt %s. "
+"You should first delete this tax receipt (but it may not be legally allowed)."
+msgstr ""
+
+#. module: donation
+#: code:addons/donation/models/donation.py:501
+#, python-format
+msgid "You cannot change the Tax Receipt Option when it is Annual."
+msgstr ""
+
+#~ msgid "Date of the last message posted on the record."
+#~ msgstr "Date of the last message posted on the record."
+
+#~ msgid "Donation Validated"
+#~ msgstr "Don validé"
+
+#~ msgid "Followers"
+#~ msgstr "Followers"
+
+#~ msgid ""
+#~ "Holds the Chatter summary (number of messages, ...). This summary is "
+#~ "directly in html format in order to be inserted in kanban views."
+#~ msgstr ""
+#~ "Holds the Chatter summary (number of messages, ...). This summary is "
+#~ "directly in html format in order to be inserted in kanban views."
+
+#~ msgid "If checked new messages require your attention."
+#~ msgstr "If checked new messages require your attention."
+
+#~ msgid "In-Kind Donation"
+#~ msgstr "Don en nature"
+
+#~ msgid "Is a Follower"
+#~ msgstr "Is a Follower"
+
+#~ msgid "Last Message Date"
+#~ msgstr "Last Message Date"
+
+#~ msgid "Messages"
+#~ msgstr "Messages"
+
+#~ msgid "Messages and communication history"
+#~ msgstr "Messages and communication history"
+
+#~ msgid ""
+#~ "Missing income account on product '%s' or on it's related product category"
+#~ msgstr ""
+#~ "Compte de produit manquant sur l'article '%s' ou sur sa catégorie interne "
+#~ "associée"
+
+#~ msgid "Product Template"
+#~ msgstr "Modèle d'article"
+
+#~ msgid "Summary"
+#~ msgstr "Résumé"
+
+#~ msgid "This is a donation product."
+#~ msgstr "Ceci est un article de don."
+
+#~ msgid "Unread Messages"
+#~ msgstr "Unread Messages"
diff --git a/donation/models/__init__.py b/donation/models/__init__.py
new file mode 100644
index 000000000..ae7c0793e
--- /dev/null
+++ b/donation/models/__init__.py
@@ -0,0 +1,10 @@
+from . import donation
+from . import donation_tax_receipt
+from . import donation_campaign
+from . import account_payment_mode
+from . import account_journal
+from . import donation_thanks_template
+from . import account_bank_statement
+from . import res_partner
+from . import res_users
+from . import res_company
diff --git a/donation/models/account_bank_statement.py b/donation/models/account_bank_statement.py
new file mode 100644
index 000000000..70345be7b
--- /dev/null
+++ b/donation/models/account_bank_statement.py
@@ -0,0 +1,156 @@
+# Copyright 2014-2021 Barroux Abbey (http://www.barroux.org)
+# Copyright 2014-2021 Akretion France (http://www.akretion.com/)
+# @author: Alexis de Lattre <alexis.delattre@akretion.com>
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+import logging
+
+from odoo import _, fields, models
+from odoo.exceptions import UserError
+from odoo.tools.misc import format_date
+
+logger = logging.getLogger(__name__)
+
+
+class AccountBankStatement(models.Model):
+    _inherit = "account.bank.statement"
+
+    donation_ids = fields.One2many(
+        "donation.donation", "bank_statement_id", string="Donations", readonly=True
+    )
+    donation_count = fields.Integer(
+        compute="_compute_donation_count", string="# of Donations", compute_sudo=True
+    )
+
+    def _compute_donation_count(self):
+        rg_res = self.env["donation.donation"].read_group(
+            [("bank_statement_id", "in", self.ids)],
+            ["bank_statement_id"],
+            ["bank_statement_id"],
+        )
+        mapped_data = {
+            x["bank_statement_id"][0]: x["bank_statement_id_count"] for x in rg_res
+        }
+        for stmt in self:
+            stmt.donation_count = mapped_data.get(stmt.id, 0)
+
+    def _prepare_donation_vals(self, stline, move_line, payment_mode):
+        company = self.company_id
+        if not company.donation_credit_transfer_product_id:
+            raise UserError(
+                _(
+                    "Missing Product for Donations via Credit Transfer "
+                    "on company '%s'."
+                )
+                % company.display_name
+            )
+        if not payment_mode:
+            raise UserError(
+                _(
+                    "Missing inbound payment mode linked to the bank journal '%s' "
+                    "configured with 'Link to Bank Account' set to 'Fixed'."
+                )
+                % self.journal_id.display_name
+            )
+        amount = move_line.credit
+        line_vals = {
+            "product_id": company.donation_credit_transfer_product_id.id,
+            "quantity": 1,
+            "unit_price": amount,
+        }
+        partner = stline.partner_id
+        vals = {
+            "company_id": company.id,
+            "partner_id": partner.id,
+            "tax_receipt_option": partner.commercial_partner_id.tax_receipt_option,
+            "payment_mode_id": payment_mode.id,
+            "currency_id": company.currency_id.id,
+            "payment_ref": stline.payment_ref,
+            "check_total": amount,
+            "donation_date": stline.date,
+            "campaign_id": False,
+            "bank_statement_line_id": stline.id,
+            "line_ids": [(0, 0, line_vals)],
+        }
+        return vals
+
+    def create_donations(self):
+        self.ensure_one()
+        ddo = self.env["donation.donation"]
+        transit_account = self.journal_id.donation_account_id
+        company_cur = self.company_id.currency_id
+        logger.info(
+            "Trying to create donations for statement %s. Transit account=%s",
+            self.display_name,
+            transit_account.display_name,
+        )
+        if not transit_account:
+            logger.info(
+                "Journal %s doesn't have a donation transit account. "
+                "Skip creation of donations." % self.journal_id.display_name
+            )
+            return False
+        payment_mode = self.env["account.payment.mode"].search(
+            [
+                ("bank_account_link", "=", "fixed"),
+                ("company_id", "=", self.company_id.id),
+                ("payment_type", "=", "inbound"),
+                ("fixed_journal_id", "=", self.journal_id.id),
+            ],
+            limit=1,
+        )
+        for stline in self.line_ids:
+            if (
+                self.currency_id.compare_amounts(stline.amount, 0) > 0
+                and not stline.donation_ids
+                and stline.move_id
+            ):
+                for mline in stline.move_id.line_ids:
+                    if (
+                        mline.account_id == transit_account
+                        and company_cur.compare_amounts(mline.credit, 0) > 0
+                        and not mline.reconciled
+                    ):
+                        if not stline.partner_id:
+                            raise UserError(
+                                _(
+                                    "Missing partner on bank statement line "
+                                    "'%s' dated %s with amount %s."
+                                )
+                                % (stline.payment_ref, stline.date, stline.amount)
+                            )
+                        vals = self._prepare_donation_vals(stline, mline, payment_mode)
+                        donation = ddo.create(vals)
+                        self.message_post(
+                            body=_(
+                                "Donation <a href=# data-oe-model=donation.donation "
+                                "data-oe-id=%d>%s</a> dated %s created for partner "
+                                "<a href=# data-oe-model=res.partner "
+                                "data-oe-id=%d>%s</a>."
+                            )
+                            % (
+                                donation.id,
+                                donation.number,
+                                format_date(self.env, donation.donation_date),
+                                donation.partner_id.id,
+                                donation.partner_id.display_name,
+                            )
+                        )
+
+    def button_validate(self):
+        super().button_validate()
+        for stmt in self:
+            stmt.create_donations()
+
+    def show_donations(self):
+        action = self.env.ref("donation.donation_action").sudo().read([])[0]
+        action["domain"] = [("bank_statement_id", "in", self.ids)]
+        return action
+
+
+class AccountBankStatementLine(models.Model):
+    _inherit = "account.bank.statement.line"
+
+    donation_ids = fields.One2many(
+        "donation.donation", "bank_statement_line_id", string="Donations"
+    )
diff --git a/donation/models/account_journal.py b/donation/models/account_journal.py
new file mode 100644
index 000000000..5c47d0c2b
--- /dev/null
+++ b/donation/models/account_journal.py
@@ -0,0 +1,23 @@
+# Copyright 2021 Akretion France (http://www.akretion.com/)
+# @author: Alexis de Lattre <alexis.delattre@akretion.com>
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+
+from odoo import fields, models
+
+
+class AccountJournal(models.Model):
+    _inherit = "account.journal"
+
+    donation_account_id = fields.Many2one(
+        "account.account",
+        check_company=True,
+        copy=False,
+        ondelete="restrict",
+        domain="[('reconcile', '=', True), ('deprecated', '=', False), "
+        "('company_id', '=', company_id), "
+        "('id', 'not in', (default_account_id, suspense_account_id, "
+        "payment_credit_account_id, payment_debit_account_id))]",
+        string="Donation by Credit Transfer Account",
+        help="Transfer account for donations received by credit transfer. "
+        "Leave empty if you don't receive donations on this bank account.",
+    )
diff --git a/donation/models/account_payment_mode.py b/donation/models/account_payment_mode.py
new file mode 100644
index 000000000..00f9369d5
--- /dev/null
+++ b/donation/models/account_payment_mode.py
@@ -0,0 +1,37 @@
+# Copyright 2021 Akretion France (http://www.akretion.com/)
+# @author: Alexis de Lattre <alexis.delattre@akretion.com>
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
+
+from odoo import _, api, fields, models
+from odoo.exceptions import ValidationError
+
+
+class AccountPaymentMode(models.Model):
+    _inherit = "account.payment.mode"
+
+    donation = fields.Boolean(
+        string="Donation",
+        help="If enabled, this payment mode will be available on donations",
+    )
+
+    @api.constrains("donation")
+    def _check_donation(self):
+        for mode in self:
+            if mode.donation and mode.payment_type != "inbound":
+                raise ValidationError(
+                    _("Donation payment mode '%s' is not an inbound payment mode.")
+                    % mode.display_name
+                )
+            if mode.donation and mode.bank_account_link != "fixed":
+                raise ValidationError(
+                    _(
+                        "Donation payment mode '%s' must be configured with "
+                        "'Link to Bank Account' set to 'Fixed'."
+                    )
+                    % mode.display_name
+                )
+
+    @api.onchange("donation")
+    def donation_change(self):
+        if self.donation and self.bank_account_link != "fixed":
+            self.bank_account_link = "fixed"
diff --git a/donation/models/donation.py b/donation/models/donation.py
new file mode 100644
index 000000000..f170073c5
--- /dev/null
+++ b/donation/models/donation.py
@@ -0,0 +1,790 @@
+# Copyright 2014-2021 Barroux Abbey (http://www.barroux.org)
+# Copyright 2014-2021 Akretion France (http://www.akretion.com/)
+# @author: Alexis de Lattre <alexis.delattre@akretion.com>
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+import logging
+from collections import defaultdict
+
+from odoo import _, api, fields, models
+from odoo.exceptions import UserError
+from odoo.tools.misc import format_amount
+
+from odoo.addons.account import _auto_install_l10n
+
+logger = logging.getLogger(__name__)
+
+
+class DonationDonation(models.Model):
+    _name = "donation.donation"
+    _inherit = ["mail.thread", "mail.activity.mixin"]
+    _description = "Donation"
+    _order = "id desc"
+    _check_company_auto = True
+
+    @api.depends(
+        "line_ids.unit_price",
+        "line_ids.quantity",
+        "line_ids.product_id",
+        "donation_date",
+        "currency_id",
+        "company_id",
+    )
+    def _compute_total(self):
+        for donation in self:
+            total = tax_receipt_total = 0.0
+            for line in donation.line_ids:
+                line_total = line.quantity * line.unit_price
+                total += line_total
+                if line.tax_receipt_ok:
+                    tax_receipt_total += line_total
+
+            date = donation.donation_date or fields.Date.context_today(self)
+            donation.amount_total = total
+            donation_currency = donation.currency_id
+            company_currency = donation.company_id.currency_id
+            total_company_currency = donation_currency._convert(
+                total, company_currency, donation.company_id, date
+            )
+            tax_receipt_total_cc = donation_currency._convert(
+                tax_receipt_total,
+                company_currency,
+                donation.company_id,
+                date,
+            )
+            donation.amount_total_company_currency = total_company_currency
+            donation.tax_receipt_total = tax_receipt_total_cc
+
+    # We don't want a depends on partner_id.country_id, because if the partner
+    # moves to another country, we want to keep the old country for
+    # past donations to have good statistics
+    @api.depends("partner_id")
+    def _compute_country_id(self):
+        for donation in self:
+            donation.country_id = donation.partner_id.country_id
+
+    currency_id = fields.Many2one(
+        "res.currency",
+        string="Currency",
+        required=True,
+        states={"done": [("readonly", True)]},
+        tracking=True,
+        ondelete="restrict",
+        default=lambda self: self.env.company.currency_id,
+    )
+    partner_id = fields.Many2one(
+        "res.partner",
+        string="Donor",
+        required=True,
+        index=True,
+        states={"done": [("readonly", True)]},
+        tracking=True,
+        ondelete="restrict",
+    )
+    commercial_partner_id = fields.Many2one(
+        related="partner_id.commercial_partner_id",
+        string="Parent Donor",
+        store=True,
+        index=True,
+    )
+    # country_id is here to have stats per country
+    # WARNING : I can't put a related field, because when someone
+    # writes on the country_id of a partner, it will trigger a write
+    # on all it's donations, including donations in other companies
+    # which will be blocked by the record rule
+    country_id = fields.Many2one(
+        "res.country",
+        string="Country",
+        compute="_compute_country_id",
+        store=True,
+        readonly=True,
+    )
+    check_total = fields.Monetary(
+        string="Check Amount",
+        states={"done": [("readonly", True)]},
+        currency_field="currency_id",
+        tracking=True,
+    )
+    amount_total = fields.Monetary(
+        compute="_compute_total",
+        string="Amount Total",
+        currency_field="currency_id",
+        store=True,
+        readonly=True,
+        tracking=True,
+    )
+    amount_total_company_currency = fields.Monetary(
+        compute="_compute_total",
+        string="Amount Total in Company Currency",
+        currency_field="company_currency_id",
+        store=True,
+        readonly=True,
+    )
+    donation_date = fields.Date(
+        string="Donation Date",
+        required=True,
+        states={"done": [("readonly", True)]},
+        index=True,
+        tracking=True,
+    )
+    company_id = fields.Many2one(
+        "res.company",
+        string="Company",
+        required=True,
+        states={"done": [("readonly", True)]},
+        default=lambda self: self.env.company,
+    )
+    line_ids = fields.One2many(
+        "donation.line",
+        "donation_id",
+        string="Donation Lines",
+        states={"done": [("readonly", True)]},
+        copy=True,
+    )
+    move_id = fields.Many2one(
+        "account.move",
+        string="Account Move",
+        readonly=True,
+        copy=False,
+        check_company=True,
+    )
+    number = fields.Char(
+        required=True,
+        copy=False,
+        string="Donation Number",
+        index=True,
+        default=lambda self: _("New"),
+        readonly=True,
+        states={"draft": [("readonly", False)]},
+    )
+    payment_mode_id = fields.Many2one(
+        "account.payment.mode",
+        string="Payment Mode",
+        domain="[('company_id', '=', company_id), ('donation', '=', True)]",
+        copy=False,
+        tracking=True,
+        check_company=True,
+        states={"done": [("readonly", True)]},
+        default=lambda self: self.env.user.context_donation_payment_mode_id,
+    )
+    payment_ref = fields.Char(
+        string="Payment Reference", states={"done": [("readonly", True)]}
+    )
+    state = fields.Selection(
+        [("draft", "Draft"), ("done", "Done"), ("cancel", "Cancelled")],
+        string="State",
+        readonly=True,
+        copy=False,
+        default="draft",
+        index=True,
+        tracking=True,
+    )
+    company_currency_id = fields.Many2one(
+        related="company_id.currency_id",
+        string="Company Currency",
+        store=True,
+    )
+    campaign_id = fields.Many2one(
+        "donation.campaign",
+        string="Donation Campaign",
+        tracking=True,
+        check_company=True,
+        ondelete="restrict",
+        default=lambda self: self.env.user.context_donation_campaign_id,
+    )
+    tax_receipt_id = fields.Many2one(
+        "donation.tax.receipt",
+        string="Tax Receipt",
+        readonly=True,
+        copy=False,
+        tracking=True,
+        check_company=True,
+    )
+    tax_receipt_option = fields.Selection(
+        [
+            ("none", "None"),
+            ("each", "For Each Donation"),
+            ("annual", "Annual Tax Receipt"),
+        ],
+        string="Tax Receipt Option",
+        states={"done": [("readonly", True)]},
+        index=True,
+        tracking=True,
+    )
+    tax_receipt_total = fields.Monetary(
+        compute="_compute_total",
+        string="Tax Receipt Eligible Amount",
+        store=True,
+        readonly=True,
+        currency_field="company_currency_id",
+        help="Eligible Tax Receipt Sub-total in Company Currency",
+    )
+    bank_statement_line_id = fields.Many2one(
+        "account.bank.statement.line",
+        string="Source Bank Statement Line",
+        ondelete="restrict",
+        readonly=True,
+    )
+    bank_statement_id = fields.Many2one(
+        related="bank_statement_line_id.statement_id",
+        string="Bank Statement",
+        store=True,
+    )
+    thanks_printed = fields.Boolean(
+        string="Thanks Printed",
+        copy=False,
+        tracking=True,
+        help="This field automatically becomes active when "
+        "the thanks letter has been printed.",
+    )
+    thanks_template_id = fields.Many2one(
+        "donation.thanks.template",
+        string="Thanks Template",
+        ondelete="restrict",
+        copy=False,
+    )
+
+    _sql_constraints = [
+        (
+            "bank_statement_line_uniq",
+            "unique(bank_statement_line_id)",
+            "A donation already exists for this bank statement line.",
+        )
+    ]
+
+    @api.model
+    def create(self, vals):
+        if "company_id" in vals:
+            self = self.with_company(vals["company_id"])
+        if vals.get("number", _("New")) == _("New"):
+            vals["number"] = self.env["ir.sequence"].next_by_code(
+                "donation.donation", sequence_date=vals.get("donation_date")
+            ) or _("New")
+        return super().create(vals)
+
+    def _prepare_each_tax_receipt(self):
+        self.ensure_one()
+        vals = {
+            "company_id": self.company_id.id,
+            "currency_id": self.company_currency_id.id,
+            "donation_date": self.donation_date,
+            "amount": self.tax_receipt_total,
+            "type": "each",
+            "partner_id": self.commercial_partner_id.id,
+        }
+        return vals
+
+    def _prepare_counterpart_move_line(
+        self, total_company_cur, total_currency, journal
+    ):
+        self.ensure_one()
+        if not journal.payment_debit_account_id:
+            raise UserError(
+                _("Missing Outstanding Receipts Account on journal '%s'.")
+                % journal.display_name
+            )
+        if self.company_currency_id.compare_amounts(total_company_cur, 0) > 0:
+            debit = total_company_cur
+            credit = 0
+        else:
+            credit = -total_company_cur
+            debit = 0
+        if self.bank_statement_line_id:
+            account_id = journal.donation_account_id.id
+        else:
+            account_id = journal.payment_debit_account_id.id
+        vals = {
+            "debit": debit,
+            "credit": credit,
+            "account_id": account_id,
+            "partner_id": self.commercial_partner_id.id,
+            "currency_id": self.currency_id.id,
+            "amount_currency": total_currency,
+        }
+        return vals
+
+    def _prepare_donation_move(self):
+        self.ensure_one()
+        if not self.payment_mode_id.donation:
+            raise UserError(
+                _(
+                    "The payment mode '%s' selected on donation %s "
+                    "is not a donation payment mode."
+                )
+                % (self.payment_mode_id.display_name, self.number)
+            )
+        assert self.payment_mode_id.bank_account_link == "fixed"
+        journal = self.payment_mode_id.fixed_journal_id
+        assert journal
+
+        # Note : we can have negative donations for donors that use direct
+        # debit when their direct debit rejected by the bank
+        total_company_cur = 0.0
+        total_currency = 0.0
+
+        aml = defaultdict(float)
+        # key = (account_id, analytic_account_id)
+        # value = {'credit': ..., 'debit': ..., 'amount_currency': ...}
+        for line in self.line_ids:
+            if line.in_kind:
+                continue
+            if self.currency_id.is_zero(line.amount):
+                continue
+            account_id = line._get_account_id()
+            if not account_id:
+                raise UserError(
+                    _("Failed to get account for donation line with product '%s'.")
+                    % line.product_id.display_name
+                )
+            analytic_account_id = line._get_analytic_account_id()
+            aml[(account_id, analytic_account_id)] += line.amount
+
+        if not aml:
+            return False
+
+        vals = {
+            "company_id": self.company_id.id,
+            "journal_id": journal.id,
+            "date": self.donation_date,
+            "ref": self.payment_ref or self.number,
+            "line_ids": [],
+        }
+
+        for (account_id, analytic_account_id), amount in aml.items():
+            total_currency += amount
+            amount_cc = self.currency_id._convert(
+                amount, self.company_currency_id, self.company_id, self.donation_date
+            )
+            total_company_cur += amount_cc
+            if self.company_currency_id.compare_amounts(amount_cc, 0) > 0:
+                credit = amount_cc
+                debit = 0
+            else:
+                debit = -amount_cc
+                credit = 0
+            vals["line_ids"].append(
+                (
+                    0,
+                    0,
+                    {
+                        "credit": credit,
+                        "debit": debit,
+                        "account_id": account_id,
+                        "analytic_account_id": analytic_account_id,
+                        "partner_id": self.commercial_partner_id.id,
+                        "currency_id": self.currency_id.id,
+                        "amount_currency": -amount,
+                    },
+                )
+            )
+
+        # counter-part
+        ml_vals = self._prepare_counterpart_move_line(
+            total_company_cur, total_currency, journal
+        )
+        vals["line_ids"].append((0, 0, ml_vals))
+        return vals
+
+    def validate(self):
+        check_total = self.env["res.users"].has_group(
+            "donation.group_donation_check_total"
+        )
+        for donation in self:
+            if donation.donation_date > fields.Date.context_today(self):
+                raise UserError(
+                    _(
+                        "The date of donation %s should be today "
+                        "or in the past, not in the future!"
+                    )
+                    % donation.number
+                )
+            if not donation.line_ids:
+                raise UserError(
+                    _(
+                        "Cannot validate donation %s because it doesn't "
+                        "have any lines!"
+                    )
+                    % donation.number
+                )
+
+            if donation.currency_id.is_zero(donation.amount_total):
+                raise UserError(
+                    _("Cannot validate donation %s because the " "total amount is 0!")
+                    % donation.number
+                )
+
+            if donation.state != "draft":
+                raise UserError(
+                    _(
+                        "Cannot validate donation %s because it is not "
+                        "in draft state."
+                    )
+                    % donation.number
+                )
+
+            if check_total and donation.currency_id.compare_amounts(
+                donation.check_total, donation.amount_total
+            ):
+                raise UserError(
+                    _(
+                        "The amount of donation %s (%s) is different "
+                        "from the sum of the donation lines (%s)."
+                    )
+                    % (
+                        donation.number,
+                        format_amount(
+                            self.env, donation.check_total, donation.currency_id
+                        ),
+                        format_amount(
+                            self.env, donation.amount_total, donation.currency_id
+                        ),
+                    )
+                )
+            full_in_kind = all([line.in_kind for line in donation.line_ids])
+            if not donation.payment_mode_id and not full_in_kind:
+                raise UserError(
+                    _(
+                        "Payment Mode is not set on donation %s (only fully "
+                        "in-kind donations don't require a payment mode)."
+                    )
+                    % donation.number
+                )
+
+            vals = {"state": "done"}
+            if full_in_kind and donation.payment_mode_id:
+                vals["payment_mode_id"] = False
+
+            if not full_in_kind:
+                move_vals = donation._prepare_donation_move()
+                # when we have a full in-kind donation: no account move
+                if move_vals:
+                    move = self.env["account.move"].create(move_vals)
+                    move.action_post()
+                    vals["move_id"] = move.id
+            else:
+                donation.message_post(
+                    body=_("Full in-kind donation: no account move generated")
+                )
+
+            receipt = donation.generate_each_tax_receipt()
+            if receipt:
+                vals["tax_receipt_id"] = receipt.id
+
+            donation.write(vals)
+            if donation.bank_statement_line_id:
+                donation._reconcile_donation_from_bank_statement()
+            donation.partner_id._update_donor_rank()
+        return
+
+    def _reconcile_donation_from_bank_statement(self):
+        self.ensure_one()
+        mlines_to_reconcile = self.env["account.move.line"]
+        journal = self.payment_mode_id.fixed_journal_id
+        if not journal:
+            raise UserError(
+                _(
+                    "Donation %s is linked to a bank statement line, "
+                    "but its payment mode '%s' doesn't have a fixed link "
+                    "to a bank journal. This should never happen."
+                )
+                % (self.number, self.payment_mode_id.display_name)
+            )
+        transit_account = journal.donation_account_id
+        if not transit_account:
+            raise UserError(
+                _(
+                    "Donation %s is linked to a bank statement line, but "
+                    "the journal '%s' linked to its payment mode '%s' "
+                    "doesn't have a donation by credit transfer account. "
+                    "This should never happen."
+                )
+                % (self.number, journal.display_name, self.payment_mode_id.display_name)
+            )
+        if not transit_account.reconcile:
+            raise UserError(
+                _(
+                    "Donation %s is linked to a bank statement line, but "
+                    "the donation by credit transfer account '%s' configured on "
+                    "the journal '%s' linked to its payment mode '%s' "
+                    "is not reconciliable. This should never happen."
+                )
+                % (
+                    self.number,
+                    transit_account.display_name,
+                    journal.display_name,
+                    self.payment_mode_id.display_name,
+                )
+            )
+
+        for donation_mline in self.move_id.line_ids:
+            if (
+                donation_mline.account_id == transit_account
+                and not donation_mline.reconciled
+            ):
+                mlines_to_reconcile |= donation_mline
+                logger.info(
+                    "Found donation move line to reconcile ID=%d" % donation_mline.id
+                )
+                break
+        for statement_mline in self.bank_statement_line_id.move_id.line_ids:
+            if (
+                statement_mline.account_id == transit_account
+                and not statement_mline.reconciled
+            ):
+                mlines_to_reconcile |= statement_mline
+                logger.info(
+                    "Found bank statement move line to reconcile " "ID=%d",
+                    statement_mline.id,
+                )
+                break
+        if len(mlines_to_reconcile) == 2:
+            mlines_to_reconcile.reconcile()
+            logger.info(
+                "Successfull reconcilation between donation and " "bank statement."
+            )
+
+    def generate_each_tax_receipt(self):
+        self.ensure_one()
+        receipt = False
+        if (
+            self.tax_receipt_option == "each"
+            and not self.tax_receipt_id
+            and not self.company_currency_id.is_zero(self.tax_receipt_total)
+        ):
+            receipt_vals = self._prepare_each_tax_receipt()
+            receipt = self.env["donation.tax.receipt"].create(receipt_vals)
+        return receipt
+
+    def save_default_values(self):
+        self.ensure_one()
+        self.env.user.write(
+            {
+                "context_donation_payment_mode_id": self.payment_mode_id.id,
+                "context_donation_campaign_id": self.campaign_id.id,
+            }
+        )
+
+    def done2cancel(self):
+        """from Done state to Cancel state"""
+        for donation in self:
+            if donation.tax_receipt_id:
+                raise UserError(
+                    _(
+                        "You cannot cancel this donation because "
+                        "it is linked to the tax receipt %s. You should first "
+                        "delete this tax receipt (but it may not be legally "
+                        "allowed)."
+                    )
+                    % donation.tax_receipt_id.number
+                )
+            if donation.move_id:
+                donation.move_id.button_cancel()
+                donation.move_id.unlink()
+            donation.write({"state": "cancel"})
+            donation.partner_id._update_donor_rank()
+
+    def cancel2draft(self):
+        """from Cancel state to Draft state"""
+        for donation in self:
+            if donation.move_id:
+                raise UserError(
+                    _("A cancelled donation should not be linked to an account move")
+                )
+            if donation.tax_receipt_id:
+                raise UserError(
+                    _("A cancelled donation should not be linked to a tax receipt")
+                )
+        self.write({"state": "draft"})
+
+    def unlink(self):
+        for donation in self:
+            if donation.state == "done":
+                raise UserError(
+                    _("The donation '%s' is in Done state, so you cannot delete it.")
+                    % donation.display_name
+                )
+            if donation.move_id:
+                raise UserError(
+                    _(
+                        "The donation '%s' is linked to an account move, "
+                        "so you cannot delete it."
+                    )
+                    % donation.display_name
+                )
+            if donation.tax_receipt_id:
+                raise UserError(
+                    _(
+                        "The donation '%s' is linked to the tax receipt %s, "
+                        "so you cannot delete it."
+                    )
+                    % (donation.display_name, donation.tax_receipt_id.number)
+                )
+        return super().unlink()
+
+    @api.depends("state", "number")
+    def name_get(self):
+        res = []
+        for donation in self:
+            name = donation.number
+            if donation.state != "done":
+                display_state = donation._fields["state"].convert_to_export(
+                    donation.state, donation
+                )
+                name = "%s (%s)" % (name, display_state)
+            res.append((donation.id, name))
+        return res
+
+    @api.onchange("partner_id")
+    def partner_id_change(self):
+        if self.partner_id:
+            self.tax_receipt_option = (
+                self.partner_id.commercial_partner_id.tax_receipt_option
+            )
+
+    @api.onchange("tax_receipt_option")
+    def tax_receipt_option_change(self):
+        res = {}
+        if (
+            self.partner_id
+            and self.partner_id.commercial_partner_id.tax_receipt_option == "annual"
+            and self.tax_receipt_option != "annual"
+        ):
+            res = {
+                "warning": {
+                    "title": _("Error:"),
+                    "message": _(
+                        "You cannot change the Tax Receipt Option when it is Annual."
+                    ),
+                },
+            }
+            self.tax_receipt_option = "annual"
+        return res
+
+    def print_thanks(self):
+        self.ensure_one()
+        self.write({"thanks_printed": True})
+        action = (
+            self.env.ref("donation.report_thanks")
+            .with_context({"discard_logo_check": True})
+            .report_action(self)
+        )
+        return action
+
+    @api.model
+    def auto_install_l10n(self):
+        """Helper function for calling a method that is not accessible directly
+        from XML data.
+        """
+        _auto_install_l10n(self.env.cr, None)
+
+
+class DonationLine(models.Model):
+    _name = "donation.line"
+    _description = "Donation Lines"
+    _rec_name = "product_id"
+    _check_company_auto = True
+
+    @api.depends(
+        "unit_price",
+        "quantity",
+        "product_id",
+        "donation_id.currency_id",
+        "donation_id.donation_date",
+        "donation_id.company_id",
+    )
+    def _compute_amount(self):
+        for line in self:
+            amount = line.quantity * line.unit_price
+            line.amount = amount
+            donation_currency = line.donation_id.currency_id
+            date = line.donation_id.donation_date or fields.Date.context_today(self)
+            amount_company_currency = donation_currency._convert(
+                amount,
+                line.donation_id.company_id.currency_id,
+                line.donation_id.company_id,
+                date,
+            )
+            tax_receipt_amount_cc = 0.0
+            if line.product_id.tax_receipt_ok:
+                tax_receipt_amount_cc = amount_company_currency
+            line.amount_company_currency = amount_company_currency
+            line.tax_receipt_amount = tax_receipt_amount_cc
+
+    donation_id = fields.Many2one("donation.donation", "Donation", ondelete="cascade")
+    currency_id = fields.Many2one(
+        "res.currency",
+        related="donation_id.currency_id",
+    )
+    company_id = fields.Many2one(related="donation_id.company_id", store=True)
+    company_currency_id = fields.Many2one(
+        "res.currency",
+        related="donation_id.company_id.currency_id",
+        string="Company Currency",
+    )
+    product_id = fields.Many2one(
+        "product.product",
+        "Product",
+        required=True,
+        domain=[("donation", "=", True)],
+        ondelete="restrict",
+        check_company=True,
+    )
+    quantity = fields.Integer("Quantity", default=1)
+    unit_price = fields.Monetary(string="Unit Price", currency_field="currency_id")
+    amount = fields.Monetary(
+        compute="_compute_amount",
+        string="Amount",
+        currency_field="currency_id",
+        store=True,
+    )
+    amount_company_currency = fields.Monetary(
+        compute="_compute_amount",
+        string="Amount in Company Currency",
+        currency_field="company_currency_id",
+        store=True,
+    )
+    tax_receipt_amount = fields.Monetary(
+        compute="_compute_amount",
+        string="Tax Receipt Eligible Amount",
+        currency_field="company_currency_id",
+        store=True,
+    )
+    analytic_account_id = fields.Many2one(
+        "account.analytic.account",
+        "Analytic Account",
+        ondelete="restrict",
+        check_company=True,
+    )
+    sequence = fields.Integer("Sequence")
+    # for the fields tax_receipt_ok and in_kind, we made an important change
+    # between v8 and v9: in v8, it was a reglar field set by an onchange
+    # in v9, it is a related stored field
+    tax_receipt_ok = fields.Boolean(
+        related="product_id.tax_receipt_ok",
+        store=True,
+    )
+    in_kind = fields.Boolean(
+        related="product_id.in_kind_donation",
+        store=True,
+        string="In Kind",
+    )
+
+    @api.onchange("product_id")
+    def product_id_change(self):
+        for line in self:
+            if line.product_id and line.product_id.list_price:
+                # We should change that one day...
+                line.unit_price = line.product_id.list_price
+
+    def _get_analytic_account_id(self):
+        # Method designed to be inherited in custom module
+        self.ensure_one()
+        return self.analytic_account_id.id or False
+
+    def _get_account_id(self):
+        # Method designed to be inherited (in donation_mass for example)
+        self.ensure_one()
+        account = self.with_company(
+            self.company_id.id
+        ).product_id._get_product_accounts()["income"]
+        return account.id
diff --git a/donation/models/donation_campaign.py b/donation/models/donation_campaign.py
new file mode 100644
index 000000000..f66ed06ee
--- /dev/null
+++ b/donation/models/donation_campaign.py
@@ -0,0 +1,49 @@
+# Copyright 2014-2021 Barroux Abbey (http://www.barroux.org)
+# Copyright 2014-2021 Akretion France (http://www.akretion.com/)
+# @author: Alexis de Lattre <alexis.delattre@akretion.com>
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from odoo import api, fields, models
+
+
+class DonationCampaign(models.Model):
+    _name = "donation.campaign"
+    _description = "Code attributed for a Donation Campaign"
+    _order = "sequence, id"
+
+    @api.depends("code", "name")
+    def name_get(self):
+        res = []
+        for camp in self:
+            name = camp.name
+            if camp.code:
+                name = "[{}] {}".format(camp.code, name)
+            res.append((camp.id, name))
+        return res
+
+    active = fields.Boolean(default=True)
+    sequence = fields.Integer(default=10)
+    code = fields.Char("Code")
+    name = fields.Char("Name", required=True)
+    start_date = fields.Date("Start Date", default=fields.Date.context_today)
+    # company_id is NOT required, it is empty by default
+    company_id = fields.Many2one("res.company", string="Company", ondelete="cascade")
+    note = fields.Text("Notes")
+
+    _sql_constraints = [
+        (
+            "code_company_uniq",
+            "unique(code, company_id)",
+            "A campaign with the same code already exists!",
+        )
+    ]
+
+    @api.model
+    def name_search(self, name="", args=None, operator="ilike", limit=100):
+        if args is None:
+            args = []
+        if name and operator == "ilike":
+            recs = self.search([("code", "=", name)] + args, limit=limit)
+            if recs:
+                return recs.name_get()
+        return super().name_search(name=name, args=args, operator=operator, limit=limit)
diff --git a/donation/models/donation_tax_receipt.py b/donation/models/donation_tax_receipt.py
new file mode 100644
index 000000000..7ae7f1361
--- /dev/null
+++ b/donation/models/donation_tax_receipt.py
@@ -0,0 +1,49 @@
+# Copyright 2014-2021 Barroux Abbey (http://www.barroux.org)
+# Copyright 2014-2021 Akretion France (http://www.akretion.com/)
+# @author: Alexis de Lattre <alexis.delattre@akretion.com>
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from odoo import api, fields, models
+
+
+class DonationTaxReceipt(models.Model):
+    _inherit = "donation.tax.receipt"
+
+    donation_ids = fields.One2many(
+        "donation.donation", "tax_receipt_id", string="Related Donations"
+    )
+
+    @api.model
+    def update_tax_receipt_annual_dict(
+        self, tax_receipt_annual_dict, start_date, end_date, company
+    ):
+        super().update_tax_receipt_annual_dict(
+            tax_receipt_annual_dict, start_date, end_date, company
+        )
+        donations = self.env["donation.donation"].search(
+            [
+                ("donation_date", ">=", start_date),
+                ("donation_date", "<=", end_date),
+                ("tax_receipt_option", "=", "annual"),
+                ("tax_receipt_id", "=", False),
+                ("tax_receipt_total", "!=", 0),
+                ("company_id", "=", company.id),
+                ("state", "=", "done"),
+            ]
+        )
+        for donation in donations:
+            # tax_receipt_total is in company currency
+            tax_receipt_amount = donation.tax_receipt_total
+            if company.currency_id.is_zero(tax_receipt_amount):
+                continue
+            partner = donation.commercial_partner_id
+            if partner not in tax_receipt_annual_dict:
+                tax_receipt_annual_dict[partner] = {
+                    "amount": tax_receipt_amount,
+                    "extra_vals": {"donation_ids": [(6, 0, [donation.id])]},
+                }
+            else:
+                tax_receipt_annual_dict[partner]["amount"] += tax_receipt_amount
+                tax_receipt_annual_dict[partner]["extra_vals"]["donation_ids"][0][
+                    2
+                ].append(donation.id)
diff --git a/donation/models/donation_thanks_template.py b/donation/models/donation_thanks_template.py
new file mode 100644
index 000000000..56e6a7c2a
--- /dev/null
+++ b/donation/models/donation_thanks_template.py
@@ -0,0 +1,23 @@
+# Copyright 2019 Akretion France
+# @author: Alexis de Lattre <alexis.delattre@akretion.com>
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from odoo import fields, models
+
+
+class DonationThanksTemplate(models.Model):
+    _name = "donation.thanks.template"
+    _description = "Donation Thanks Letter Template"
+    _order = "sequence"
+
+    sequence = fields.Integer(default=10)
+    name = fields.Char(required=True)
+    active = fields.Boolean(default=True)
+    company_id = fields.Many2one(
+        "res.company",
+        string="Company",
+        ondelete="cascade",
+        default=lambda self: self.env.company,
+    )
+    text = fields.Text(translate=True)
+    image = fields.Binary(attachment=True)
diff --git a/donation/models/res_company.py b/donation/models/res_company.py
new file mode 100644
index 000000000..97c817b6c
--- /dev/null
+++ b/donation/models/res_company.py
@@ -0,0 +1,31 @@
+# Copyright 2014-2021 Barroux Abbey (http://www.barroux.org)
+# Copyright 2014-2021 Akretion France (http://www.akretion.com/)
+# @author: Alexis de Lattre <alexis.delattre@akretion.com>
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from odoo import _, api, fields, models
+from odoo.exceptions import ValidationError
+
+
+class ResCompany(models.Model):
+    _inherit = "res.company"
+
+    donation_credit_transfer_product_id = fields.Many2one(
+        "product.product",
+        string="Product for Donations via Credit Transfer",
+        domain=[("donation", "=", True)],
+        ondelete="restrict",
+    )
+
+    @api.constrains("donation_credit_transfer_product_id")
+    def company_donation_bank_statement_check(self):
+        for company in self:
+            product = company.donation_credit_transfer_product_id
+            if product and not product.donation:
+                raise ValidationError(
+                    _(
+                        "On the company %s, the Product for Donations "
+                        "via Credit Transfer (%s) is not a donation product !"
+                    )
+                    % (company.display_name, product.display_name)
+                )
diff --git a/donation/models/res_partner.py b/donation/models/res_partner.py
new file mode 100644
index 000000000..aef3696f4
--- /dev/null
+++ b/donation/models/res_partner.py
@@ -0,0 +1,33 @@
+# Copyright 2014-2021 Barroux Abbey (http://www.barroux.org)
+# Copyright 2014-2021 Akretion France (http://www.akretion.com/)
+# @author: Alexis de Lattre <alexis.delattre@akretion.com>
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from odoo import api, fields, models
+
+
+class ResPartner(models.Model):
+    _inherit = "res.partner"
+
+    @api.depends("donation_ids.partner_id")
+    def _compute_donation_count(self):
+        rg_res = self.env["donation.donation"].read_group(
+            [("partner_id", "in", self.ids), ("state", "=", "done")],
+            ["partner_id"],
+            ["partner_id"],
+        )
+        mapped_data = {x["partner_id"][0]: x["partner_id_count"] for x in rg_res}
+        for partner in self:
+            partner.donation_count = mapped_data.get(partner.id, 0)
+
+    donation_ids = fields.One2many(
+        "donation.donation", "partner_id", string="Donations", readonly=True
+    )
+    donation_count = fields.Integer(
+        compute="_compute_donation_count", string="# of Donations", compute_sudo=True
+    )
+
+    def _prepare_donor_rank(self):
+        rank = super()._prepare_donor_rank()
+        rank += self.donation_count
+        return rank
diff --git a/donation/models/res_users.py b/donation/models/res_users.py
new file mode 100644
index 000000000..e17302031
--- /dev/null
+++ b/donation/models/res_users.py
@@ -0,0 +1,21 @@
+# Copyright 2014-2021 Barroux Abbey (http://www.barroux.org)
+# Copyright 2014-2021 Akretion France (http://www.akretion.com/)
+# @author: Alexis de Lattre <alexis.delattre@akretion.com>
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from odoo import fields, models
+
+
+class ResUsers(models.Model):
+    _inherit = "res.users"
+
+    # begin with context_ to allow user to change it by himself
+    context_donation_campaign_id = fields.Many2one(
+        "donation.campaign", "Current Donation Campaign"
+    )
+    context_donation_payment_mode_id = fields.Many2one(
+        "account.payment.mode",
+        "Current Donation Payment Mode",
+        domain=[("donation", "=", True)],
+        company_dependent=True,
+    )
diff --git a/donation/post_install.py b/donation/post_install.py
new file mode 100644
index 000000000..30b00dff9
--- /dev/null
+++ b/donation/post_install.py
@@ -0,0 +1,15 @@
+# Copyright 2016-2021 Akretion France (http://www.akretion.com/)
+# @author: Alexis de Lattre <alexis.delattre@akretion.com>
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from odoo import SUPERUSER_ID, api
+
+
+def update_account_payment_mode(cr, registry):
+    with api.Environment.manage():
+        env = api.Environment(cr, SUPERUSER_ID, {})
+        modes = env["account.payment.mode"].search(
+            [("payment_type", "=", "inbound"), ("bank_account_link", "=", "fixed")]
+        )
+        modes.write({"donation": True})
+    return
diff --git a/donation/readme/CONFIGURE.rst b/donation/readme/CONFIGURE.rst
new file mode 100644
index 000000000..ca7d83139
--- /dev/null
+++ b/donation/readme/CONFIGURE.rst
@@ -0,0 +1,11 @@
+To configure this module, you need to:
+
+ * create donation products
+ * make sure you have an inbound payment mode for each payment mode used to receive donations. This payment mode must be configured with *Link to Bank Account* set to *Fixed* and with the donation option active.
+ * if you wish to have a control amount on the donation, add the users to the group *Donation Check Total*
+
+If you receive donations via credit transfer, you must also:
+
+* in the configuration page *Invoicing > Configuration > Settings*, in the *Donations* section, select the product that will be used for donations by credit transfer.
+* on the bank journals corresponding to the bank accounts on which you receive donations by credit transfer, in the *Payments Configuration* tab, select the *Donation by credit transfer account*. This account must allow reconciliation.
+* Make sure that the accountant that processes bank statements has *User* access level or higher on the *Donation* application.
diff --git a/donation/readme/CONTRIBUTORS.rst b/donation/readme/CONTRIBUTORS.rst
new file mode 100644
index 000000000..41affeb19
--- /dev/null
+++ b/donation/readme/CONTRIBUTORS.rst
@@ -0,0 +1,5 @@
+* Brother Bernard <informatique - at - barroux.org>
+* Brother Irénée (Barroux Abbey)
+* Alexis de Lattre <alexis.delattre@akretion.com>
+* Serpent Consulting Services Pvt. Ltd. <support@serpentcs.com>
+* Nikul Chaudhary <nikul.chaudhary.serpentcs@gmail.com>
diff --git a/donation/readme/DESCRIPTION.rst b/donation/readme/DESCRIPTION.rst
new file mode 100644
index 000000000..9d8dc5bc8
--- /dev/null
+++ b/donation/readme/DESCRIPTION.rst
@@ -0,0 +1,5 @@
+This module handles donations by cash, check or by credit transfer and generate the corresponding journal entries and tax receipts. Before Odoo v14, support for donations by credit transfer was added by a separate module *donation_bank_statement*.
+
+This module will assist you in writing a thanks letter (before Odoo v14, this feature was added by a separate module *donation_thanks*).
+
+This module also supports in-kind donations (in-kind donations don't generate any accounting entry but can generate a tax receipt).
diff --git a/donation/readme/USAGE.rst b/donation/readme/USAGE.rst
new file mode 100644
index 000000000..c6480a51e
--- /dev/null
+++ b/donation/readme/USAGE.rst
@@ -0,0 +1,11 @@
+This module handles donations by cash, check or by credit transfer:
+
+* for donation by cash or check, you should first create a new donation and validate it. Then, if you have the module *account_check_deposit* from the project `OCA/account-financial-tools <https://github.com/OCA/account-financial-tools>`_, you can create a check deposit.
+* for a donation by credit transfer, the process in inverted: first, import your bank statement file and process it. When you process a statement line that correspond to a donation by credit transfer, make sure that the partner is the good one and, in the *Manual Operations* tab, set the *Donation by credit transfer account* (configured on the corresponding bank journal) as counterpart. When you close the bank statement, Odoo will generate a draft donation for each statement line identified as a donation by credit transfer. Then you should verify and validate these draft donations.
+
+When you validate a donation:
+
+* it will create a journal entry that goes directly from the revenue account to the payment account without going through a receivable account.
+* if the tax receipt option of the donor is configured as *For Each Donation* and the product of the donation line is eligible to a tax receipt, it will generate the tax receipt.
+
+To have some statistics about the donations, go to the menu Donation > Reporting > Donations Analysis.
diff --git a/donation/report/__init__.py b/donation/report/__init__.py
new file mode 100644
index 000000000..cc7ec032c
--- /dev/null
+++ b/donation/report/__init__.py
@@ -0,0 +1,3 @@
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from . import donation_report
diff --git a/donation/report/donation_report.py b/donation/report/donation_report.py
new file mode 100644
index 000000000..218c6a1c1
--- /dev/null
+++ b/donation/report/donation_report.py
@@ -0,0 +1,116 @@
+# © 2014-2016 Barroux Abbey (http://www.barroux.org)
+# © 2014-2016 Akretion France (Alexis de Lattre <alexis.delattre@akretion.com>)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from psycopg2 import sql
+
+from odoo import fields, models, tools
+
+
+class DonationReport(models.Model):
+    _name = "donation.report"
+    _description = "Donations Analysis"
+    _auto = False
+    _rec_name = "donation_date"
+    _order = "donation_date desc"
+
+    donation_date = fields.Date("Donation Date", readonly=True)
+    product_id = fields.Many2one("product.product", "Product", readonly=True)
+    partner_id = fields.Many2one("res.partner", "Donor", readonly=True)
+    country_id = fields.Many2one("res.country", "Partner Country", readonly=True)
+    company_id = fields.Many2one("res.company", "Company", readonly=True)
+    product_categ_id = fields.Many2one(
+        "product.category", "Category of Product", readonly=True
+    )
+    campaign_id = fields.Many2one(
+        "donation.campaign", "Donation Campaign", readonly=True
+    )
+    payment_mode_id = fields.Many2one(
+        "account.payment.mode", string="Payment Mode", readonly=True
+    )
+    thanks_printed = fields.Boolean(string="Thanks Printed", readonly=True)
+    thanks_template_id = fields.Many2one(
+        "donation.thanks.template", string="Thanks Template", readonly=True
+    )
+    in_kind = fields.Boolean("In Kind")
+    tax_receipt_ok = fields.Boolean("Eligible for a Tax Receipt")
+    company_currency_id = fields.Many2one(
+        "res.currency", string="Company Currency", readonly=True
+    )
+    amount_company_currency = fields.Monetary(
+        "Amount", readonly=True, currency_field="company_currency_id"
+    )
+    tax_receipt_amount = fields.Monetary(
+        "Tax Receipt Eligible Amount",
+        readonly=True,
+        currency_field="company_currency_id",
+    )
+
+    def _select(self):
+        return sql.SQL(
+            """
+            SELECT min(l.id) AS id,
+                d.donation_date,
+                l.product_id,
+                l.in_kind,
+                l.tax_receipt_ok,
+                pt.categ_id AS product_categ_id,
+                d.company_id,
+                d.payment_mode_id,
+                d.partner_id,
+                d.country_id,
+                d.campaign_id,
+                d.company_currency_id,
+                d.thanks_printed,
+                d.thanks_template_id,
+                sum(l.amount_company_currency) AS amount_company_currency,
+                sum(l.tax_receipt_amount) AS tax_receipt_amount
+                """
+        )
+
+    def _from(self):
+        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)
+            """
+        )
+
+    def _where(self):
+        return sql.SQL(
+            """
+            WHERE d.state='done'
+            """
+        )
+
+    def _group_by(self):
+        return sql.SQL(
+            """
+            GROUP BY l.product_id,
+                l.in_kind,
+                l.tax_receipt_ok,
+                pt.categ_id,
+                d.donation_date,
+                d.partner_id,
+                d.country_id,
+                d.campaign_id,
+                d.company_id,
+                d.payment_mode_id,
+                d.thanks_printed,
+                d.thanks_template_id,
+                d.company_currency_id
+            """
+        )
+
+    def init(self):
+        tools.drop_view_if_exists(self._cr, self._table)
+        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/report/donation_report_view.xml b/donation/report/donation_report_view.xml
new file mode 100644
index 000000000..537debac0
--- /dev/null
+++ b/donation/report/donation_report_view.xml
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+  Copyright 2014-2021 Barroux Abbey (http://www.barroux.org)
+  Copyright 2014-2021 Akretion France (http://www.akretion.com/)
+  @author: Alexis de Lattre <alexis.delattre@akretion.com>
+  License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+-->
+<odoo>
+    <record id="donation_report_search" model="ir.ui.view">
+        <field name="name">donation.report.search</field>
+        <field name="model">donation.report</field>
+        <field name="arch" type="xml">
+            <search string="Donations Analysis">
+                <field name="partner_id" />
+                <field name="product_id" />
+                <field name="product_categ_id" />
+                <group string="Group By" name="groupby">
+                    <filter
+                        name="date_groupby"
+                        string="Date"
+                        context="{'group_by': 'donation_date'}"
+                    />
+                    <filter
+                        name="partner_groupby"
+                        string="Partner"
+                        context="{'group_by': 'partner_id'}"
+                    />
+                    <filter
+                        name="partner_country_groupby"
+                        string="Partner Country"
+                        context="{'group_by': 'country_id'}"
+                    />
+                    <filter
+                        name="company_groupby"
+                        string="Company"
+                        context="{'group_by': 'company_id'}"
+                    />
+                    <filter
+                        name="product_groupby"
+                        string="Product"
+                        context="{'group_by': 'product_id'}"
+                    />
+                    <filter
+                        name="tax_receipt_ok_groupby"
+                        string="Eligible for a Tax Receipt"
+                        context="{'group_by': 'tax_receipt_ok'}"
+                    />
+                    <filter
+                        name="in_kind_groupby"
+                        string="In Kind"
+                        context="{'group_by': 'in_kind'}"
+                    />
+                    <filter
+                        name="product_categ_groupby"
+                        string="Product Category"
+                        context="{'group_by': 'product_categ_id'}"
+                    />
+                    <filter
+                        name="campaign_groupby"
+                        string="Campaign"
+                        context="{'group_by': 'campaign_id'}"
+                    />
+                    <filter
+                        name="payment_mode_groupby"
+                        string="Payment Mode"
+                        context="{'group_by': 'payment_mode_id'}"
+                    />
+
+                </group>
+            </search>
+        </field>
+    </record>
+    <record id="donation_report_graph" model="ir.ui.view">
+        <field name="name">donation.report.graph</field>
+        <field name="model">donation.report</field>
+        <field name="arch" type="xml">
+            <graph string="Donations Analysis">
+                <field name="donation_date" />
+                <field name="amount_company_currency" type="measure" />
+            </graph>
+        </field>
+    </record>
+    <record id="donation_report_pivot" model="ir.ui.view">
+        <field name="name">donation.report.pivot</field>
+        <field name="model">donation.report</field>
+        <field name="arch" type="xml">
+            <pivot string="Donations Analysis">
+                <field name="donation_date" type="row" interval="month" />
+                <field name="product_id" type="col" />
+                <field name="amount_company_currency" type="measure" />
+            </pivot>
+        </field>
+    </record>
+    <!-- tree view used for drill-through -->
+    <record id="donation_report_tree" model="ir.ui.view">
+        <field name="name">donation.report.tree</field>
+        <field name="model">donation.report</field>
+        <field name="arch" type="xml">
+            <tree string="Donations">
+                <field name="partner_id" />
+                <field name="donation_date" />
+                <field name="country_id" />
+                <field name="payment_mode_id" />
+                <field name="campaign_id" />
+                <field name="product_id" />
+                <field name="tax_receipt_ok" />
+                <field name="in_kind" />
+                <field name="tax_receipt_amount" sum="True" />
+                <field name="amount_company_currency" sum="True" />
+                <field name="company_currency_id" invisible="1" />
+                <field name="company_id" groups="base.group_multi_company" />
+            </tree>
+        </field>
+    </record>
+    <record id="donation_report_action" model="ir.actions.act_window">
+        <field name="name">Donations Analysis</field>
+        <field name="res_model">donation.report</field>
+        <field name="view_mode">pivot,graph,tree</field>
+    </record>
+    <menuitem
+        id="donation_report_title_menu"
+        parent="donation_top_menu"
+        name="Reporting"
+        sequence="25"
+    />
+    <menuitem
+        id="donation_report_menu"
+        action="donation_report_action"
+        parent="donation_report_title_menu"
+        sequence="10"
+    />
+</odoo>
diff --git a/donation/report/donation_thanks_report.xml b/donation/report/donation_thanks_report.xml
new file mode 100644
index 000000000..79a79e76b
--- /dev/null
+++ b/donation/report/donation_thanks_report.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+  Copyright 2014-2021 Barroux Abbey (http://www.barroux.org)
+  Copyright 2014-2021 Akretion France (http://www.akretion.com/)
+  @author: Alexis de Lattre <alexis.delattre@akretion.com>
+  License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+-->
+<odoo>
+
+
+<record id="report_thanks" model="ir.actions.report">
+    <field name="name">Thanks Letter</field>
+    <field name="model">donation.donation</field>
+    <field name="report_name">donation.report_thanks</field>
+    <field name="report_file">donation.report_thanks</field>
+    <field name="report_type">qweb-pdf</field>
+    <field
+            name="print_report_name"
+        >'donation_thanks-%s%s' % (object.number, object.state == 'draft' and '-draft' or '')</field>
+    <field name="binding_model_id" ref="model_donation_donation" />
+</record>
+
+
+</odoo>
diff --git a/donation/report/donation_thanks_view.xml b/donation/report/donation_thanks_view.xml
new file mode 100644
index 000000000..284b60a61
--- /dev/null
+++ b/donation/report/donation_thanks_view.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+  Copyright 2021 Akretion (http://www.akretion.com)
+  @author: Alexis de Lattre <alexis.delattre@akretion.com>
+  License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+-->
+<odoo>
+    <template id="report_thanks">
+        <t t-call="web.html_container">
+            <t t-foreach="docs" t-as="o">
+                <t t-call="web.internal_layout">
+                        <div class="page">
+                                <div
+                            t-field="o.partner_id"
+                            t-options='{"widget": "contact", "fields": ["address", "name"], "no_marker": True}'
+                        />
+                        </div>
+                </t>
+            </t>
+        </t>
+    </template>
+</odoo>
diff --git a/donation/security/donation_security.xml b/donation/security/donation_security.xml
new file mode 100644
index 000000000..88f46e91d
--- /dev/null
+++ b/donation/security/donation_security.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+  Copyright 2014-2021 Barroux Abbey (www.barroux.org)
+  Copyright 2014-2021 Akretion France (www.akretion.com)
+  @author: Alexis de Lattre <alexis.delattre@akretion.com>
+  License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+-->
+<odoo>
+    <data noupdate="0">
+        <record id="module_category_donation" model="ir.module.category">
+            <field name="name">Donation</field>
+            <field name="description">Manage donations</field>
+            <field name="sequence">45</field>
+            <field name="parent_id" ref="base.module_category_accounting" />
+        </record>
+        <record id="group_donation_viewer" model="res.groups">
+            <field name="name">Viewer</field>
+            <field name="category_id" ref="module_category_donation" />
+        </record>
+        <record id="group_donation_user" model="res.groups">
+            <field name="name">User</field>
+            <field name="category_id" ref="module_category_donation" />
+            <field name="implied_ids" eval="[(4, ref('group_donation_viewer'))]" />
+        </record>
+        <record id="group_donation_manager" model="res.groups">
+            <field name="name">Manager</field>
+            <field name="category_id" ref="module_category_donation" />
+            <field name="implied_ids" eval="[(4, ref('group_donation_user'))]" />
+            <field name="users" eval="[(4, ref('base.user_root'))]" />
+        </record>
+        <record id="group_donation_check_total" model="res.groups">
+            <field name="name">Donation Check Total</field>
+            <field name="category_id" ref="base.module_category_hidden" />
+        </record>
+    </data>
+    <data noupdate="1">
+        <record id="base.default_user" model="res.users">
+            <field name="groups_id" eval="[(4, ref('group_donation_manager'))]" />
+    </record>
+            <record id="base.user_admin" model="res.users">
+        <field name="groups_id" eval="[(4, ref('group_donation_manager'))]" />
+    </record>
+        <!-- Multi-company Rules -->
+        <record id="donation_company_rule" model="ir.rule">
+            <field name="name">Donation Multi-company</field>
+            <field name="model_id" ref="model_donation_donation" />
+            <field name="domain_force">
+                [('company_id', 'in', company_ids)]</field>
+        </record>
+        <record id="donation_line_company_rule" model="ir.rule">
+            <field name="name">Donation Line Multi-company</field>
+            <field name="model_id" ref="model_donation_line" />
+            <field name="domain_force">
+                [('company_id', 'in', company_ids)]</field>
+        </record>
+
+        <record id="donation_report_company_rule" model="ir.rule">
+            <field name="name">Donation Report Multi-company</field>
+            <field name="model_id" ref="model_donation_report" />
+            <field name="domain_force">[('company_id', 'in', company_ids)]</field>
+        </record>
+        <record id="donation_thanks_template_company_rule" model="ir.rule">
+    <field name="name">Donation Thanks Template multi-company</field>
+    <field name="model_id" ref="model_donation_thanks_template" />
+    <field
+                name="domain_force"
+            >['|', ('company_id', '=', False), ('company_id', 'in', company_ids)]</field>
+</record>
+        <record id="donation_campaign_company_rule" model="ir.rule">
+    <field name="name">Donation Campaign multi-company</field>
+    <field name="model_id" ref="model_donation_campaign" />
+    <field
+                name="domain_force"
+            >['|', ('company_id', '=', False), ('company_id', 'in', company_ids)]</field>
+</record>
+
+    </data>
+</odoo>
diff --git a/donation/security/ir.model.access.csv b/donation/security/ir.model.access.csv
new file mode 100644
index 000000000..2a3f614bc
--- /dev/null
+++ b/donation/security/ir.model.access.csv
@@ -0,0 +1,21 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_donation_donation_viewer,Read access on donation.donation to Donation Viewer,model_donation_donation,group_donation_viewer,1,0,0,0
+access_donation_donation_user,Full access on donation.donation to Donation User,model_donation_donation,group_donation_user,1,1,1,1
+access_donation_campaign_manager,Full access on donation.campaign to Donation Manager,model_donation_campaign,group_donation_manager,1,1,1,1
+access_donation_campaign_viewer,Read access on donation.campaign to Donation Viewer,model_donation_campaign,group_donation_viewer,1,0,0,0
+access_donation_line_viewer,Read access on donation.line to Donation Viewer,model_donation_line,group_donation_viewer,1,0,0,0
+access_donation_line_user,Full access on donation.line to Donation User,model_donation_line,group_donation_user,1,1,1,1
+access_donation_donation_read,Read access on donation.donation to Employee grp,model_donation_donation,base.group_user,1,0,0,0
+access_donation_line_read,Read access on donation.line to Employee grp,model_donation_line,base.group_user,1,0,0,0
+access_account_journal_donation,Read access on account.journal,account.model_account_journal,group_donation_viewer,1,0,0,0
+access_account_move_donation,Full access on account.move,account.model_account_move,group_donation_user,1,1,1,1
+access_account_move_line_donation,Full access on account.move.line,account.model_account_move_line,group_donation_user,1,1,1,1
+access_account_analytic_line_donation,Full access on account.analytic.line to donation user,analytic.model_account_analytic_line,group_donation_user,1,1,1,1
+access_donation_report,Full access on donation.report to Donation Viewer,model_donation_report,group_donation_viewer,1,1,1,1
+access_donation_tax_receipt_viewer,Read access on donation.tax.receipt to Donation Viewer grp,model_donation_tax_receipt,donation.group_donation_viewer,1,0,0,0
+access_donation_tax_receipt,Create access on donation.tax.receipt to Donation User,model_donation_tax_receipt,donation.group_donation_user,1,0,1,0
+access_donation_tax_receipt_full,Full access on donation.tax.receipt to Donation Manager,model_donation_tax_receipt,donation.group_donation_manager,1,1,1,1
+access_donation_thanks_template_manager,Full access on donation.thanks.template to Donation Manager,model_donation_thanks_template,group_donation_manager,1,1,1,1
+access_donation_thanks_template_viewer,Read access on donation.thanks.template to Donation Viewer,model_donation_thanks_template,group_donation_viewer,1,0,0,0
+access_donation_validate,Full access on donation validate wizard,model_donation_validate,donation.group_donation_user,1,1,1,1
+access_donation_tax_receipt_option_switch,Full access on donation_tax_receipt_option_switch wizard,model_donation_tax_receipt_option_switch,donation.group_donation_user,1,1,1,1
diff --git a/donation/static/description/icon.png b/donation/static/description/icon.png
new file mode 100644
index 000000000..a9a295465
Binary files /dev/null and b/donation/static/description/icon.png differ
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 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="100mm"
+   height="100mm"
+   viewBox="0 0 100 100"
+   version="1.1"
+   id="svg8"
+   sodipodi:docname="icon.svg"
+   inkscape:version="0.92.4 (f8dce91, 2019-08-02)"
+   inkscape:export-filename="/home/jaime/Escritorio/icon.png"
+   inkscape:export-xdpi="91"
+   inkscape:export-ydpi="91">
+  <defs
+     id="defs2">
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4562">
+      <rect
+         ry="4.1577382"
+         y="13.040181"
+         x="-124.92113"
+         height="98.866074"
+         width="99.811012"
+         id="rect4564"
+         style="fill:#aa0000;stroke-width:0.26458332"
+         clip-path="none" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4578">
+      <rect
+         ry="4.1577382"
+         y="1.5119057"
+         x="-120.00744"
+         height="97.930626"
+         width="99.811012"
+         id="rect4580"
+         style="fill:#aa0000;stroke-width:0.26458332" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4578-3">
+      <rect
+         ry="4.1577382"
+         y="1.5119057"
+         x="-120.00744"
+         height="97.930626"
+         width="99.811012"
+         id="rect4580-6"
+         style="fill:#aa0000;stroke-width:0.26458332" />
+    </clipPath>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4"
+     inkscape:cx="72.826115"
+     inkscape:cy="127.25228"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer2"
+     showgrid="false"
+     inkscape:snap-page="true"
+     showguides="false"
+     inkscape:guide-bbox="true"
+     inkscape:window-width="1853"
+     inkscape:window-height="1025"
+     inkscape:window-x="67"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <sodipodi:guide
+       position="31.183035,81.453868"
+       orientation="-0.70710678,0.70710678"
+       id="guide4619"
+       inkscape:locked="false" />
+    <sodipodi:guide
+       position="65.956845,10.583333"
+       orientation="-0.70710678,0.70710678"
+       id="guide4621"
+       inkscape:locked="false" />
+    <sodipodi:guide
+       position="67.704985,78.09933"
+       orientation="-0.70710678,0.70710678"
+       id="guide4623"
+       inkscape:locked="false" />
+    <sodipodi:guide
+       position="62.407434,24.722431"
+       orientation="-0.70710678,0.70710678"
+       id="guide4625"
+       inkscape:locked="false" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata5">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Layer 3" />
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Layer 2"
+     style="display:inline">
+    <rect
+       y="0"
+       x="0"
+       height="25.164532"
+       width="100"
+       id="rect4535"
+       style="fill:#de8787;stroke-width:0.13272627"
+       ry="4.9136906"
+       inkscape:export-xdpi="91.327972"
+       inkscape:export-ydpi="91.327972" />
+    <rect
+       ry="4.9136906"
+       style="fill:#501616;stroke-width:0.13272627"
+       id="rect4566"
+       width="100"
+       height="25.164532"
+       x="0.18899068"
+       y="74.958138"
+       inkscape:export-xdpi="91.327972"
+       inkscape:export-ydpi="91.327972" />
+    <rect
+       style="fill:#800080;stroke-width:0.26458332"
+       id="rect914"
+       width="99.811012"
+       height="97.930626"
+       x="0.18898809"
+       y="1.1339295"
+       ry="4.1577382"
+       inkscape:export-xdpi="91.327972"
+       inkscape:export-ydpi="91.327972" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m -119.93657,64.635599 -0.25988,-14.100283 v 49.842664 l -0.10009,-17.197917 0.0986,0.188988 63.235934,-16.365413 -62.534814,16.120116 -0.84138,0.0091 57.369031,-57.747002 -9.386044,1.225775 -0.523352,-7.522118"
+       style="display:inline;opacity:0.5;fill:#0f000f;fill-opacity:0.75454544;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="path4576"
+       clip-path="url(#clipPath4578)"
+       transform="translate(120.21264,-0.31639914)"
+       inkscape:export-xdpi="91.327972"
+       inkscape:export-ydpi="91.327972"
+       sodipodi:nodetypes="ccccccccccc" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m -120.69252,82.40048 0.49609,-31.865164 v 49.842664 h 37.697532 l 5.579265,-0.944941 37.911526,-37.53208 c -39.824515,24.042545 -0.242948,0.516749 -4.21358,0.474115 -7.264003,-0.078 -37.597022,15.482201 -33.017329,12.255689 31.028683,-21.860511 4.494348,-15.920349 -0.174165,-18.219814 l 14.199994,-15.528114 -6.929198,-10.869463 -5.626031,6.085025"
+       style="display:inline;opacity:0.5;fill:#0f000f;fill-opacity:0.75294118;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="path4576-7"
+       clip-path="url(#clipPath4578-3)"
+       transform="translate(120.51819,0.47953594)"
+       inkscape:export-xdpi="91.327972"
+       inkscape:export-ydpi="91.327972"
+       sodipodi:nodetypes="ccccccsscccc" />
+    <path
+       style="fill:#000000;stroke-width:0.71428573;fill-opacity:0"
+       d="m 9.9291099,372.78181 c -3.3243104,-1.50995 -8.2615024,-6.88043 -7.6913163,-8.36632 0.2112108,-0.5504 0.1085589,-1.00163 -0.2281152,-1.00273 -0.3366742,-10e-4 -0.6121349,-25.03982 -0.6121349,-55.6416 V 252.13154 L 88.540401,163.21716 c 47.928569,-48.9029 87.185559,-88.873107 87.237739,-88.822673 0.0522,0.05043 -0.0682,2.548093 -0.26755,5.550352 l -0.36245,5.458652 -2.58958,0.430374 c -7.33955,1.219789 -15.15831,7.370133 -18.53946,14.583395 -1.59811,3.40938 -1.90727,5.05306 -1.90727,10.14035 0,5.20396 0.28579,6.65342 2.00026,10.14473 2.35095,4.78743 7.56285,9.75366 12.86245,12.25614 2.03979,0.96319 9.49443,3.25496 16.56586,5.09282 7.07143,1.83786 13.58036,3.8039 14.46429,4.36898 1.96695,1.25743 2.0642,3.21658 0.24152,4.86607 -1.2044,1.08997 -2.57462,1.19237 -11.60714,0.86747 -5.63284,-0.20261 -11.72551,-0.57718 -13.53927,-0.83237 -3.27994,-0.46148 -3.32622,-0.43844 -8.57143,4.26688 -6.00398,5.38599 -7.24201,7.51799 -6.163,10.61324 0.83704,2.40111 6.8498,5.60636 13.17057,7.02088 l 3.79017,0.84821 v 4.20752 c 0,4.30054 1.09503,7.375 3.27272,9.1886 0.78399,0.65292 3.63217,1.1478 7.92245,1.37655 l 6.6984,0.35714 -13.05392,13.62625 -13.05393,13.62626 -18.57143,0.39821 c -20.10746,0.43116 -23.54543,0.95475 -32.40523,4.93521 -5.50381,2.47271 -8.51616,4.60369 -21.565619,15.25583 l -10.081808,8.22967 h -12.4609 c -13.416673,0 -16.223795,0.55781 -18.39309,3.65491 -1.019424,1.45543 -1.164781,4.58911 -1.164781,25.11093 0,25.61654 0.150954,26.66485 4.073459,28.28857 1.483715,0.61418 23.416348,0.77796 85.212259,0.63632 l 83.21428,-0.19073 4.64286,-2.21371 c 3.26851,-1.55843 14.01419,-9.7717 36.30135,-27.74628 17.41216,-14.0429 31.76556,-25.42173 31.89642,-25.28628 0.13086,0.13545 -28.52003,29.57663 -63.66865,65.42484 l -63.90658,65.17857 -78.704127,-0.0157 c -74.913528,-0.0149 -78.843655,-0.0791 -81.6011331,-1.33155 z"
+       id="path4581"
+       inkscape:connector-curvature="0"
+       transform="scale(0.26458333)" />
+  </g>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-197)"
+     style="display:inline">
+    <path
+       transform="translate(0,197)"
+       inkscape:connector-curvature="0"
+       style="display:inline;fill:#ffffff;stroke-width:0.11765506"
+       d="m 45.73225,35.693232 6.364116,1.688027 a 1.0073293,1.0139958 0 0 1 0.777484,0.956154 c 0,0.543001 -0.479624,0.991567 -1.069481,0.991567 H 47.62964 A 3.5180301,3.5413125 0 0 1 46.317415,39.069284 C 45.702933,38.809587 44.994636,38.86861 44.52322,39.305371 l -2.228085,2.065766 a 1.3696864,1.3787509 0 0 0 -0.263853,0.313996 1.3391968,1.3480597 0 0 0 0.454999,1.858009 9.8235129,9.8885253 0 0 0 4.046907,1.357503 v 2.089374 c 0,1.038782 0.918206,1.888697 2.036939,1.888697 h 2.036939 c 1.119907,0 2.038113,-0.849915 2.038113,-1.888697 v -2.07757 c 3.861625,-0.424958 6.782764,-3.659356 6.273818,-7.436756 -0.369389,-2.715006 -2.63383,-4.875206 -5.45998,-5.630687 L 47.0949,30.156981 a 1.0073293,1.0139958 0 0 1 -0.777485,-0.956154 c 0,-0.543003 0.479625,-0.991568 1.069481,-0.991568 h 4.17473 a 3.5180301,3.5413125 0 0 1 1.316916,0.259696 c 0.613309,0.259696 1.322779,0.200675 1.794195,-0.236088 l 2.228086,-2.065765 a 1.3262973,1.3350748 0 0 0 0.254471,-0.306914 1.3403695,1.3492401 0 0 0 -0.450308,-1.86273 9.8293764,9.894427 0 0 0 -4.048081,-1.357503 v -2.091736 c 0,-1.038784 -0.917033,-1.888699 -2.036938,-1.888699 h -2.03694 c -1.119906,0 -2.036939,0.849915 -2.036939,1.888699 v 2.077571 c -3.856934,0.424957 -6.783935,3.659356 -6.274994,7.436756 0.368221,2.715006 2.639695,4.875207 5.461156,5.630686 z m 34.501321,21.696442 c -1.383757,-1.263066 -3.541485,-1.180437 -4.995603,0 L 64.402435,66.113105 A 7.4629144,7.512304 0 0 1 59.71173,67.765719 H 45.842482 a 1.8762835,1.8887007 0 0 1 0,-3.777397 h 9.180885 c 1.864556,0 3.601291,-1.286678 3.89915,-3.139963 a 3.6587513,3.682965 0 0 0 0.05394,-0.644525 3.7525655,3.7774 0 0 0 -3.752566,-3.770315 H 36.461068 a 13.797714,13.889027 0 0 0 -8.689535,3.103372 l -5.452946,4.451431 h -6.496629 a 1.8762827,1.8887 0 0 0 -1.876283,1.888699 v 11.3322 a 1.8762827,1.8887 0 0 0 1.876283,1.888699 h 41.837586 a 7.5051308,7.5547997 0 0 0 4.690707,-1.652615 L 80.084642,63.162011 a 3.7525655,3.7774 0 0 0 0.150103,-5.772337 z"
+       id="path2" />
+  </g>
+</svg>
diff --git a/donation/static/description/index.html b/donation/static/description/index.html
new file mode 100644
index 000000000..c2ddd3c76
--- /dev/null
+++ b/donation/static/description/index.html
@@ -0,0 +1,444 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
+<title>Donation</title>
+<style type="text/css">
+
+/*
+:Author: David Goodger (goodger@python.org)
+:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
+:Copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the HTML output of Docutils.
+
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+customize this style sheet.
+*/
+
+/* used to remove borders from tables and images */
+.borderless, table.borderless td, table.borderless th {
+  border: 0 }
+
+table.borderless td, table.borderless th {
+  /* Override padding for "table.docutils td" with "! important".
+     The right padding separates the table cells. */
+  padding: 0 0.5em 0 0 ! important }
+
+.first {
+  /* Override more specific margin styles with "! important". */
+  margin-top: 0 ! important }
+
+.last, .with-subtitle {
+  margin-bottom: 0 ! important }
+
+.hidden {
+  display: none }
+
+.subscript {
+  vertical-align: sub;
+  font-size: smaller }
+
+.superscript {
+  vertical-align: super;
+  font-size: smaller }
+
+a.toc-backref {
+  text-decoration: none ;
+  color: black }
+
+blockquote.epigraph {
+  margin: 2em 5em ; }
+
+dl.docutils dd {
+  margin-bottom: 0.5em }
+
+object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
+  overflow: hidden;
+}
+
+/* Uncomment (and remove this text!) to get bold-faced definition list terms
+dl.docutils dt {
+  font-weight: bold }
+*/
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract p.topic-title {
+  font-weight: bold ;
+  text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title, .code .error {
+  color: red ;
+  font-weight: bold ;
+  font-family: sans-serif }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+   compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+  margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+  margin-top: 0.5em }
+*/
+
+div.dedication {
+  margin: 2em 5em ;
+  text-align: center ;
+  font-style: italic }
+
+div.dedication p.topic-title {
+  font-weight: bold ;
+  font-style: normal }
+
+div.figure {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+div.footer, div.header {
+  clear: both;
+  font-size: smaller }
+
+div.line-block {
+  display: block ;
+  margin-top: 1em ;
+  margin-bottom: 1em }
+
+div.line-block div.line-block {
+  margin-top: 0 ;
+  margin-bottom: 0 ;
+  margin-left: 1.5em }
+
+div.sidebar {
+  margin: 0 0 0.5em 1em ;
+  border: medium outset ;
+  padding: 1em ;
+  background-color: #ffffee ;
+  width: 40% ;
+  float: right ;
+  clear: right }
+
+div.sidebar p.rubric {
+  font-family: sans-serif ;
+  font-size: medium }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset ;
+  padding: 1em }
+
+div.system-message p.system-message-title {
+  color: red ;
+  font-weight: bold }
+
+div.topic {
+  margin: 2em }
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+  margin-top: 0.4em }
+
+h1.title {
+  text-align: center }
+
+h2.subtitle {
+  text-align: center }
+
+hr.docutils {
+  width: 75% }
+
+img.align-left, .figure.align-left, object.align-left, table.align-left {
+  clear: left ;
+  float: left ;
+  margin-right: 1em }
+
+img.align-right, .figure.align-right, object.align-right, table.align-right {
+  clear: right ;
+  float: right ;
+  margin-left: 1em }
+
+img.align-center, .figure.align-center, object.align-center {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+table.align-center {
+  margin-left: auto;
+  margin-right: auto;
+}
+
+.align-left {
+  text-align: left }
+
+.align-center {
+  clear: both ;
+  text-align: center }
+
+.align-right {
+  text-align: right }
+
+/* reset inner alignment in figures */
+div.align-right {
+  text-align: inherit }
+
+/* div.align-center * { */
+/*   text-align: left } */
+
+.align-top    {
+  vertical-align: top }
+
+.align-middle {
+  vertical-align: middle }
+
+.align-bottom {
+  vertical-align: bottom }
+
+ol.simple, ul.simple {
+  margin-bottom: 1em }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.attribution {
+  text-align: right ;
+  margin-left: 50% }
+
+p.caption {
+  font-style: italic }
+
+p.credits {
+  font-style: italic ;
+  font-size: smaller }
+
+p.label {
+  white-space: nowrap }
+
+p.rubric {
+  font-weight: bold ;
+  font-size: larger ;
+  color: maroon ;
+  text-align: center }
+
+p.sidebar-title {
+  font-family: sans-serif ;
+  font-weight: bold ;
+  font-size: larger }
+
+p.sidebar-subtitle {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+p.topic-title {
+  font-weight: bold }
+
+pre.address {
+  margin-bottom: 0 ;
+  margin-top: 0 ;
+  font: inherit }
+
+pre.literal-block, pre.doctest-block, pre.math, pre.code {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+pre.code .ln { color: grey; } /* line numbers */
+pre.code, code { background-color: #eeeeee }
+pre.code .comment, code .comment { color: #5C6576 }
+pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
+pre.code .literal.string, code .literal.string { color: #0C5404 }
+pre.code .name.builtin, code .name.builtin { color: #352B84 }
+pre.code .deleted, code .deleted { background-color: #DEB0A1}
+pre.code .inserted, code .inserted { background-color: #A3D289}
+
+span.classifier {
+  font-family: sans-serif ;
+  font-style: oblique }
+
+span.classifier-delimiter {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+span.interpreted {
+  font-family: sans-serif }
+
+span.option {
+  white-space: nowrap }
+
+span.pre {
+  white-space: pre }
+
+span.problematic {
+  color: red }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80% }
+
+table.citation {
+  border-left: solid 1px gray;
+  margin-left: 1px }
+
+table.docinfo {
+  margin: 2em 4em }
+
+table.docutils {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
+
+table.footnote {
+  border-left: solid 1px black;
+  margin-left: 1px }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+  padding-left: 0.5em ;
+  padding-right: 0.5em ;
+  vertical-align: top }
+
+table.docutils th.field-name, table.docinfo th.docinfo-name {
+  font-weight: bold ;
+  text-align: left ;
+  white-space: nowrap ;
+  padding-left: 0 }
+
+/* "booktabs" style (no vertical lines) */
+table.docutils.booktabs {
+  border: 0px;
+  border-top: 2px solid;
+  border-bottom: 2px solid;
+  border-collapse: collapse;
+}
+table.docutils.booktabs * {
+  border: 0px;
+}
+table.docutils.booktabs th {
+  border-bottom: thin solid;
+  text-align: left;
+}
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+  font-size: 100% }
+
+ul.auto-toc {
+  list-style-type: none }
+
+</style>
+</head>
+<body>
+<div class="document" id="donation">
+<h1 class="title">Donation</h1>
+
+<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!! This file is generated by oca-gen-addon-readme !!
+!! changes will be overwritten.                   !!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
+<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/donation/tree/12.0/donation"><img alt="OCA/donation" src="https://img.shields.io/badge/github-OCA%2Fdonation-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/donation-12-0/donation-12-0-donation"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/180/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
+<p>This module handles donations, including in-kind donations. When you validate a donation,
+it will create the corresponding accounting entries.</p>
+<p><strong>Table of contents</strong></p>
+<div class="contents local topic" id="contents">
+<ul class="simple">
+<li><a class="reference internal" href="#configuration" id="id1">Configuration</a></li>
+<li><a class="reference internal" href="#usage" id="id2">Usage</a></li>
+<li><a class="reference internal" href="#bug-tracker" id="id3">Bug Tracker</a></li>
+<li><a class="reference internal" href="#credits" id="id4">Credits</a><ul>
+<li><a class="reference internal" href="#authors" id="id5">Authors</a></li>
+<li><a class="reference internal" href="#contributors" id="id6">Contributors</a></li>
+<li><a class="reference internal" href="#maintainers" id="id7">Maintainers</a></li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="section" id="configuration">
+<h1><a class="toc-backref" href="#id1">Configuration</a></h1>
+<p>To configure this module, you need to:</p>
+<blockquote>
+<ul class="simple">
+<li>create donation products</li>
+<li>activate the option <em>Donation Payment Method</em> on some bank/cash account journals</li>
+<li>if you wish to have a control amount on the donation, add the users to the group <em>Check Total on supplier invoices</em></li>
+</ul>
+</blockquote>
+</div>
+<div class="section" id="usage">
+<h1><a class="toc-backref" href="#id2">Usage</a></h1>
+<p>To use this module, go to the menu Donations &gt; Donations and start to register new donations.</p>
+<p>To have some statistics about the donations, go to the menu Reporting &gt; Donations &gt; Donations Analysis.</p>
+<a class="reference external image-reference" href="https://runbot.odoo-community.org/runbot/180/11.0"><img alt="Try me on Runbot" src="https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas" /></a>
+</div>
+<div class="section" id="bug-tracker">
+<h1><a class="toc-backref" href="#id3">Bug Tracker</a></h1>
+<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/donation/issues">GitHub Issues</a>.
+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
+<a class="reference external" href="https://github.com/OCA/donation/issues/new?body=module:%20donation%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
+<p>Do not contact contributors directly about support or help with technical issues.</p>
+</div>
+<div class="section" id="credits">
+<h1><a class="toc-backref" href="#id4">Credits</a></h1>
+<div class="section" id="authors">
+<h2><a class="toc-backref" href="#id5">Authors</a></h2>
+<ul class="simple">
+<li>Barroux Abbey</li>
+<li>Akretion</li>
+</ul>
+</div>
+<div class="section" id="contributors">
+<h2><a class="toc-backref" href="#id6">Contributors</a></h2>
+<ul class="simple">
+<li>Brother Bernard &lt;informatique - at - barroux.org&gt;</li>
+<li>Brother Irénée (Barroux Abbey)</li>
+<li>Alexis de Lattre &lt;<a class="reference external" href="mailto:alexis.delattre&#64;akretion.com">alexis.delattre&#64;akretion.com</a>&gt;</li>
+<li>Serpent Consulting Services Pvt. Ltd. &lt;<a class="reference external" href="mailto:support&#64;serpentcs.com">support&#64;serpentcs.com</a>&gt;</li>
+<li>Nikul Chaudhary &lt;<a class="reference external" href="mailto:nikul.chaudhary.serpentcs&#64;gmail.com">nikul.chaudhary.serpentcs&#64;gmail.com</a>&gt;</li>
+</ul>
+</div>
+<div class="section" id="maintainers">
+<h2><a class="toc-backref" href="#id7">Maintainers</a></h2>
+<p>This module is maintained by the OCA.</p>
+<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
+<p>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.</p>
+<p>This module is part of the <a class="reference external" href="https://github.com/OCA/donation/tree/12.0/donation">OCA/donation</a> project on GitHub.</p>
+<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
+</div>
+</div>
+</div>
+</body>
+</html>
diff --git a/donation/views/account_bank_statement.xml b/donation/views/account_bank_statement.xml
new file mode 100644
index 000000000..32069f8c9
--- /dev/null
+++ b/donation/views/account_bank_statement.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+  Copyright 2014-2021 Barroux Abbey (http://www.barroux.org)
+  Copyright 2014-2021 Akretion France (http://www.akretion.com/)
+  @author: Alexis de Lattre <alexis.delattre@akretion.com>
+  License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+-->
+<odoo>
+
+
+<record id="view_bank_statement_form" model="ir.ui.view">
+    <field name="name">donation.bank.statement.bank_statement_form</field>
+    <field name="model">account.bank.statement</field>
+    <field name="inherit_id" ref="account.view_bank_statement_form" />
+    <field name="arch" type="xml">
+        <div name="button_box" position="inside">
+            <button
+                    class="oe_stat_button"
+                    name="show_donations"
+                    type="object"
+                    icon="fa-heart-o"
+                    states="confirm"
+                >
+                <field string="Donations" name="donation_count" widget="statinfo" />
+            </button>
+        </div>
+    </field>
+</record>
+
+<record id="view_bank_statement_line_form" model="ir.ui.view">
+    <field name="name">donation.bank.statement.line.form</field>
+    <field name="model">account.bank.statement.line</field>
+    <field name="inherit_id" ref="account.view_bank_statement_line_form" />
+    <field name="arch" type="xml">
+        <xpath expr="//field[@name='date']/.." position="after">
+            <group
+                    name="donations"
+                    string="Related Donations"
+                    attrs="{'invisible': [('donation_ids', '=', [])]}"
+                >
+                <field name="donation_ids" nolabel="1" />
+            </group>
+        </xpath>
+    </field>
+</record>
+
+
+</odoo>
diff --git a/donation/views/account_journal.xml b/donation/views/account_journal.xml
new file mode 100644
index 000000000..8120b5816
--- /dev/null
+++ b/donation/views/account_journal.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<odoo>
+
+
+<record id="view_account_journal_form" model="ir.ui.view">
+    <field name="name">donation.account.journal.form</field>
+    <field name="model">account.journal</field>
+    <field name="inherit_id" ref="account.view_account_journal_form" />
+    <field name="arch" type="xml">
+        <field name="payment_debit_account_id" position="after">
+            <field
+                    name="donation_account_id"
+                    attrs="{'invisible': [('type', '!=', 'bank')]}"
+                />
+        </field>
+    </field>
+</record>
+
+
+</odoo>
diff --git a/donation/views/account_payment_mode.xml b/donation/views/account_payment_mode.xml
new file mode 100644
index 000000000..050f00fac
--- /dev/null
+++ b/donation/views/account_payment_mode.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<odoo>
+
+
+<record id="account_payment_mode_form" model="ir.ui.view">
+    <field name="name">donation.account.payment.mode.form</field>
+    <field name="model">account.payment.mode</field>
+    <field name="inherit_id" ref="account_payment_mode.account_payment_mode_form" />
+    <field name="arch" type="xml">
+        <field name="payment_type" position="after">
+            <field
+                    name="donation"
+                    attrs="{'invisible': [('payment_type', '!=', 'inbound')]}"
+                />
+        </field>
+    </field>
+</record>
+
+<record id="account_payment_mode_tree" model="ir.ui.view">
+    <field name="name">donation.account.payment.mode.tree</field>
+    <field name="model">account.payment.mode</field>
+    <field name="inherit_id" ref="account_payment_mode.account_payment_mode_tree" />
+    <field name="arch" type="xml">
+        <field name="payment_type" position="after">
+            <field name="donation" optional="hide" />
+        </field>
+    </field>
+</record>
+
+
+
+</odoo>
diff --git a/donation/views/donation.xml b/donation/views/donation.xml
new file mode 100644
index 000000000..f467974b0
--- /dev/null
+++ b/donation/views/donation.xml
@@ -0,0 +1,424 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+  Copyright 2014-2021 Barroux Abbey (http://www.barroux.org)
+  Copyright 2014-2021 Akretion France (http://www.akretion.com/)
+  @author: Alexis de Lattre <alexis.delattre@akretion.com>
+  License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+-->
+<odoo>
+    <record id="donation_form" model="ir.ui.view">
+        <field name="name">donation.form</field>
+        <field name="model">donation.donation</field>
+        <field name="arch" type="xml">
+            <form string="Donation">
+                <header>
+                    <button
+                        type="object"
+                        name="validate"
+                        string="Validate"
+                        class="oe_highlight"
+                        states="draft"
+                        groups="donation.group_donation_user"
+                        invisible="context.get('recurring_view')"
+                    />
+                    <button
+                        name="print_thanks"
+                        string="Print Thanks Letter"
+                        type="object"
+                        groups="donation.group_donation_user"
+                        attrs="{'invisible': ['|', ('thanks_printed', '=', True), ('state', '!=', 'done')]}"
+                        class="oe_highlight"
+                    />
+                    <button
+                        type="object"
+                        name="cancel2draft"
+                        string="Back to Draft"
+                        states="cancel"
+                        groups="donation.group_donation_user"
+                    />
+                    <button
+                        type="object"
+                        name="done2cancel"
+                        string="Cancel"
+                        groups="donation.group_donation_user"
+                        states="done"
+                        invisible="context.get('recurring_view')"
+                    />
+                    <button
+                        type="object"
+                        name="save_default_values"
+                        string="Save Default Values"
+                        groups="donation.group_donation_user"
+                        invisible="context.get('recurring_view')"
+                    />
+                    <field
+                        name="state"
+                        widget="statusbar"
+                        invisible="context.get('recurring_view')"
+                        statusbar_visible="draft,done"
+                    />
+                </header>
+                <sheet>
+                    <div class="oe_button_box" name="button_box" />
+                    <div class="oe_title">
+                        <h1>
+                            <field name="number" readonly="1" />
+                        </h1>
+                    </div>
+                    <group name="main">
+                        <group name="manual">
+                            <field name="partner_id" />
+                            <field name="commercial_partner_id" invisible="1" />
+                            <field name="payment_mode_id" widget="selection" />
+                            <field
+                                name="currency_id"
+                                groups="base.group_multi_currency"
+                            />
+                                <field name="company_currency_id" invisible="1" />
+                            <field
+                                name="check_total"
+                                groups="donation.group_donation_check_total"
+                            />
+                            <field name="payment_ref" />
+                            <field
+                                name="donation_date"
+                                options="{'datepicker': {'warn_future': true}}"
+                            />
+                            <field name="campaign_id" />
+                            <field name="thanks_template_id" widget="selection" />
+                        </group>
+                        <group name="auto">
+                            <field
+                                name="company_id"
+                                groups="base.group_multi_company"
+                            />
+                            <label for="tax_receipt_option" />
+                            <div name="tax_receipt_option">
+                                <field name="tax_receipt_option" class="oe_inline" />
+                                <button
+                                    name="%(donation_tax_receipt_option_switch_action)d"
+                                    string="Change"
+                                    type="action"
+                                    class="oe_link"
+                                    attrs="{'invisible': ['|', ('state', '!=', 'done'), ('tax_receipt_id', '!=', False)]}"
+                                />
+                            </div>
+                            <field name="tax_receipt_total" />
+                            <field name="tax_receipt_id" />
+                            <field name="thanks_printed" />
+                        </group>
+                    </group>
+                    <notebook>
+                        <page string="Donation Lines" name="lines">
+                            <field name="line_ids" nolabel="1" />
+                            <group name="subtotal" class="oe_subtotal_footer oe_right">
+                                <field
+                                    name="amount_total"
+                                    string="Total"
+                                    class="oe_subtotal_footer_separator"
+                                />
+                            </group>
+                        </page>
+                        <page string="Other Information" name="other">
+                            <group name="other">
+                            <group name="other-left">
+                                <field name="move_id" />
+                                <field name="bank_statement_line_id" />
+                                <field
+                                        name="amount_total_company_currency"
+                                        groups="base.group_multi_currency"
+                                    />
+                            </group>
+                            <group name="other-right">
+                            </group>
+                            </group>
+                        </page>
+                    </notebook>
+                </sheet>
+                <div class="oe_chatter">
+                    <field name="message_follower_ids" widget="mail_followers" />
+                    <field name="activity_ids" widget="mail_activity" />
+                    <field name="message_ids" widget="mail_thread" />
+                </div>
+            </form>
+        </field>
+    </record>
+    <record id="donation_tree" model="ir.ui.view">
+        <field name="name">donation.tree</field>
+        <field name="model">donation.donation</field>
+        <field name="arch" type="xml">
+            <tree string="Donation">
+                <header>
+                        <button
+                        name="%(donation_validate_action)d"
+                        type="action"
+                        string="Validate"
+                        groups="donation.group_donation_user"
+                        invisible="context.get('recurring_view')"
+                    />
+                    </header>
+                <field name="number" invisible="context.get('recurring_view')" />
+                <field name="partner_id" invisible="context.get('partner_view')" />
+                <field name="donation_date" />
+                <field name="amount_total_company_currency" sum="1" />
+                <field name="amount_total" optional="hide" />
+                <field name="currency_id" invisible="1" />
+                <field name="company_currency_id" invisible="1" />
+                <field name="payment_mode_id" />
+                <field
+                    name="tax_receipt_option"
+                    optional="hide"
+                    widget="badge"
+                    decoration-success="tax_receipt_option == 'each'"
+                    decoration-info="tax_receipt_option == 'annual'"
+                />
+                <field name="campaign_id" optional="show" />
+                <field name="thanks_template_id" optional="hide" />
+                <field name="payment_ref" optional="hide" />
+                <field
+                    name="company_id"
+                    groups="base.group_multi_company"
+                    optional="show"
+                />
+                <field
+                    name="state"
+                    invisible="context.get('recurring_view')"
+                    widget="badge"
+                    decoration-info="state == 'draft'"
+                    decoration-muted="state == 'cancel'"
+                    decoration-success="state == 'done'"
+                />
+            </tree>
+        </field>
+    </record>
+    <record id="donation_search" model="ir.ui.view">
+        <field name="name">donation.search</field>
+        <field name="model">donation.donation</field>
+        <field name="arch" type="xml">
+            <search string="Search Donations">
+                <field name="number" />
+                <field name="partner_id" />
+                <separator />
+                <filter
+                    name="draft"
+                    string="Draft"
+                    domain="[('state', '=', 'draft')]"
+                />
+                <filter name="done" string="Done" domain="[('state', '=', 'done')]" />
+                <filter
+                    name="cancel"
+                    string="Cancelled"
+                    domain="[('state', '=', 'cancel')]"
+                />
+                <separator />
+            <filter
+                    name="thanks_to_print"
+                    string="Thanks to Print"
+                    domain="[('thanks_printed', '=', False)]"
+                />
+                <group string="Group By" name="groupby">
+                    <filter
+                        name="date_groupby"
+                        string="Date"
+                        context="{'group_by': 'donation_date'}"
+                    />
+                    <filter
+                        name="partner_groupby"
+                        string="Donor"
+                        context="{'group_by': 'partner_id'}"
+                    />
+                    <filter
+                        name="commercial_partner_groupby"
+                        string="Parent Donor"
+                        context="{'group_by': 'commercial_partner_id'}"
+                    />
+                    <filter
+                        name="partner_country_groupby"
+                        string="Partner Country"
+                        context="{'group_by': 'country_id'}"
+                    />
+                    <filter
+                        name="state_groupby"
+                        string="State"
+                        context="{'group_by': 'state'}"
+                    />
+                    <filter
+                        name="campaign_groupby"
+                        string="Campaign"
+                        context="{'group_by': 'campaign_id'}"
+                    />
+                    <filter
+                        name="currency_groupby"
+                        string="Currency"
+                        context="{'group_by': 'currency_id'}"
+                    />
+                    <filter
+                        name="payment_mode_groupby"
+                        string="Payment Mode"
+                        context="{'group_by': 'payment_mode_id'}"
+                    />
+                    <filter
+                        name="tax_receipt_option_groupby"
+                        string="Tax Receipt Option"
+                        context="{'group_by': 'tax_receipt_option'}"
+                    />
+                </group>
+            </search>
+        </field>
+    </record>
+    <record id="donation_graph" model="ir.ui.view">
+        <field name="name">donation.graph</field>
+        <field name="model">donation.donation</field>
+        <field name="arch" type="xml">
+            <graph string="Donations">
+                <field name="donation_date" type="row" />
+                <field name="amount_total_company_currency" type="measure" />
+            </graph>
+        </field>
+    </record>
+    <record id="donation_pivot" model="ir.ui.view">
+        <field name="name">donation.pivot</field>
+        <field name="model">donation.donation</field>
+        <field name="arch" type="xml">
+            <pivot string="Donations">
+                <field name="donation_date" type="row" />
+                <field name="amount_total_company_currency" type="measure" />
+            </pivot>
+        </field>
+    </record>
+    <record id="donation_line_tree" model="ir.ui.view">
+        <field name="name">donation.line.tree</field>
+        <field name="model">donation.line</field>
+        <field name="arch" type="xml">
+            <tree string="Donation Line" editable="bottom">
+                <field name="sequence" widget="handle" />
+                <field
+                    name="donation_id"
+                    invisible="not context.get('donation_line_main_view')"
+                />
+                <field name="product_id" context="{'default_donation': True}" />
+                <field name="quantity" />
+                <field name="unit_price" />
+                <field
+                    name="analytic_account_id"
+                    groups="analytic.group_analytic_accounting"
+                />
+                <field name="amount" />
+                <field name="tax_receipt_ok" string="Tax Receipt" optional="show" />
+                <field name="in_kind" optional="hide" />
+                <field name="currency_id" invisible="1" />
+                <field name="company_id" invisible="1" />
+            </tree>
+        </field>
+    </record>
+    <record id="donation_line_form" model="ir.ui.view">
+        <field name="name">donation.line.form</field>
+        <field name="model">donation.line</field>
+        <field name="arch" type="xml">
+            <form string="Donation Line">
+                <group name="main">
+                    <field
+                        name="donation_id"
+                        invisible="not context.get('donation_line_main_view')"
+                    />
+                    <field name="product_id" />
+                    <field name="quantity" />
+                    <field name="unit_price" />
+                    <field
+                        name="analytic_account_id"
+                        groups="analytic.group_analytic_accounting"
+                    />
+                    <field name="amount" />
+                    <field name="tax_receipt_ok" />
+                    <field name="amount_company_currency" />
+                    <field name="in_kind" />
+                    <field name="currency_id" invisible="1" />
+                    <field name="company_currency_id" invisible="1" />
+                    <field name="company_id" invisible="1" />
+                </group>
+            </form>
+        </field>
+    </record>
+    <record id="donation_action" model="ir.actions.act_window">
+        <field name="name">Donations</field>
+        <field name="res_model">donation.donation</field>
+        <field name="view_mode">tree,form,pivot,graph</field>
+    </record>
+    <record id="donation_line_action" model="ir.actions.act_window">
+        <field name="name">Donations Lines</field>
+        <field name="res_model">donation.line</field>
+        <field name="view_mode">tree,form</field>
+    </record>
+    <menuitem
+        id="donation_top_menu"
+        sequence="38"
+        web_icon="donation,static/description/icon.png"
+        name="Donation"
+        groups="group_donation_viewer"
+    />
+    <menuitem
+        id="donation_title_menu"
+        parent="donation_top_menu"
+        sequence="15"
+        name="Donations"
+    />
+    <menuitem
+        id="donation_menu"
+        action="donation_action"
+        parent="donation_title_menu"
+        sequence="10"
+    />
+    <menuitem
+        id="donation_config_menu"
+        parent="donation_top_menu"
+        name="Configuration"
+        sequence="30"
+        groups="donation.group_donation_manager"
+    />
+    <menuitem
+        id="donor"
+        action="donation_base.res_partner_action_donor"
+        parent="donation_title_menu"
+        sequence="50"
+        name="Donors"
+    />
+    <record id="donation_product_action" model="ir.actions.act_window">
+        <field name="name">Products</field>
+        <field name="res_model">product.template</field>
+        <field name="view_mode">kanban,tree,form</field>
+        <field
+            name="context"
+        >{'search_default_filter_donation': 1, 'default_donation': 1}</field>
+    </record>
+    <menuitem
+        id="donation_products"
+        action="donation_product_action"
+        parent="donation_config_menu"
+    />
+    <menuitem
+        id="donation_tax_title_menu"
+        parent="donation.donation_top_menu"
+        sequence="20"
+        name="Tax Receipts"
+    />
+    <menuitem
+        id="donation_tax_receipt_menu"
+        action="donation_base.donation_tax_receipt_action"
+        parent="donation_tax_title_menu"
+        sequence="20"
+    />
+    <menuitem
+        id="tax_receipt_annual_create_menu"
+        sequence="45"
+        action="donation_base.tax_receipt_annual_create_action"
+        parent="donation_tax_title_menu"
+        groups="donation.group_donation_user"
+    />
+    <menuitem
+        id="donation_tax_receipt_print_menu"
+        sequence="40"
+        action="donation_base.donation_tax_receipt_print_action"
+        parent="donation_tax_title_menu"
+        groups="donation.group_donation_user"
+    />
+</odoo>
diff --git a/donation/views/donation_campaign.xml b/donation/views/donation_campaign.xml
new file mode 100644
index 000000000..3d724da4c
--- /dev/null
+++ b/donation/views/donation_campaign.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+  Copyright 2014-2021 Barroux Abbey (http://www.barroux.org)
+  Copyright 2014-2021 Akretion France (http://www.akretion.com/)
+  @author: Alexis de Lattre <alexis.delattre@akretion.com>
+  License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+-->
+<odoo>
+    <record id="donation_campaign_form" model="ir.ui.view">
+        <field name="name">donation.campaign.form</field>
+        <field name="model">donation.campaign</field>
+        <field name="arch" type="xml">
+            <form string="Donation Campaign">
+                    <widget
+                    name="web_ribbon"
+                    title="Archived"
+                    bg_color="bg-danger"
+                    attrs="{'invisible': [('active', '=', True)]}"
+                />
+                    <sheet>
+                <group name="main">
+                    <field name="name" />
+                    <field name="code" />
+                    <field name="company_id" groups="base.group_multi_company" />
+                    <field name="start_date" />
+                    <field name="note" />
+                    <field name="active" invisible="1" />
+                </group>
+        </sheet>
+            </form>
+        </field>
+    </record>
+    <record id="donation_campaign_tree" model="ir.ui.view">
+        <field name="name">donation.campaign.tree</field>
+        <field name="model">donation.campaign</field>
+        <field name="arch" type="xml">
+            <tree string="Donation Campaigns">
+                <field name="sequence" widget="handle" />
+                <field name="code" optional="show" />
+                <field name="name" />
+                <field name="start_date" optional="show" />
+                <field
+                    name="company_id"
+                    groups="base.group_multi_company"
+                    optional="show"
+                />
+            </tree>
+        </field>
+    </record>
+    <record id="donation_campaign_search" model="ir.ui.view">
+        <field name="name">donation.campaign.search</field>
+        <field name="model">donation.campaign</field>
+        <field name="arch" type="xml">
+            <search>
+                    <field
+                    name="name"
+                    filter_domain="['|', ('name', 'ilike', self), ('code', 'ilike', self)]"
+                    string="Name or Code"
+                />
+                    <field name="code" />
+                <separator />
+                <filter
+                    string="Archived"
+                    name="inactive"
+                    domain="[('active', '=', False)]"
+                />
+                        <group name="groupby">
+                                <filter
+                        name="company_groupby"
+                        string="Company"
+                        context="{'group_by': 'company_id'}"
+                    />
+                        </group>
+            </search>
+        </field>
+    </record>
+    <record id="donation_campaign_action" model="ir.actions.act_window">
+        <field name="name">Donation Campaigns</field>
+        <field name="res_model">donation.campaign</field>
+        <field name="view_mode">tree,form</field>
+    </record>
+    <menuitem
+        id="donation_campaign_menu"
+        action="donation_campaign_action"
+        parent="donation_config_menu"
+        sequence="30"
+    />
+</odoo>
diff --git a/donation/views/donation_tax_receipt.xml b/donation/views/donation_tax_receipt.xml
new file mode 100644
index 000000000..06ffe8530
--- /dev/null
+++ b/donation/views/donation_tax_receipt.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+  Copyright 2014-2021 Barroux Abbey (http://www.barroux.org)
+  Copyright 2014-2021 Akretion France (http://www.akretion.com/)
+  @author: Alexis de Lattre <alexis.delattre@akretion.com>
+  License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+-->
+<odoo>
+    <record id="donation_tax_receipt_form" model="ir.ui.view">
+        <field name="name">donation.donation.tax.receipt.form</field>
+        <field name="model">donation.tax.receipt</field>
+        <field name="inherit_id" ref="donation_base.donation_tax_receipt_form" />
+        <field name="arch" type="xml">
+            <group name="main" position="after">
+                <group name="donations" string="Related Donations">
+                    <field name="donation_ids" nolabel="1" />
+                </group>
+            </group>
+        </field>
+    </record>
+</odoo>
diff --git a/donation/views/donation_thanks_template.xml b/donation/views/donation_thanks_template.xml
new file mode 100644
index 000000000..f3808746b
--- /dev/null
+++ b/donation/views/donation_thanks_template.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+  Copyright 2019 Akretion France
+  @author: Alexis de Lattre <alexis.delattre@akretion.com>
+  License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+-->
+<odoo>
+
+
+<record id="donation_thanks_template_form" model="ir.ui.view">
+    <field name="model">donation.thanks.template</field>
+    <field name="arch" type="xml">
+        <form string="Donation Thanks Template">
+            <sheet>
+                <widget
+                        name="web_ribbon"
+                        title="Archived"
+                        bg_color="bg-danger"
+                        attrs="{'invisible': [('active', '=', True)]}"
+                    />
+                <group name="main">
+                    <field name="name" />
+                    <field name="text" />
+                    <field name="image" widget="image" />
+                    <field name="company_id" groups="base.group_multi_company" />
+                    <field name="active" invisible="1" />
+                </group>
+            </sheet>
+        </form>
+    </field>
+</record>
+
+<record id="donation_thanks_template_tree" model="ir.ui.view">
+    <field name="model">donation.thanks.template</field>
+    <field name="arch" type="xml">
+        <tree string="Donation Thanks Templates">
+            <field name="sequence" widget="handle" />
+            <field name="name" />
+            <field
+                    name="company_id"
+                    groups="base.group_multi_company"
+                    optional="show"
+                />
+        </tree>
+    </field>
+</record>
+
+<record id="donation_thanks_template_search" model="ir.ui.view">
+    <field name="model">donation.thanks.template</field>
+    <field name="arch" type="xml">
+        <search string="Search Donation Thanks Templates">
+            <field name="name" />
+            <filter
+                    string="Archived"
+                    name="inactive"
+                    domain="[('active', '=', False)]"
+                />
+        </search>
+    </field>
+</record>
+
+<record id="donation_thanks_template_action" model="ir.actions.act_window">
+    <field name="name">Thanks Letter Templates</field>
+    <field name="res_model">donation.thanks.template</field>
+    <field name="view_mode">tree,form</field>
+</record>
+
+<menuitem
+        id="donation_thanks_template_menu"
+        action="donation_thanks_template_action"
+        parent="donation.donation_config_menu"
+        sequence="50"
+    />
+
+</odoo>
diff --git a/donation/views/res_partner.xml b/donation/views/res_partner.xml
new file mode 100644
index 000000000..e916ec117
--- /dev/null
+++ b/donation/views/res_partner.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" ?>
+<!--
+  © 2014-2016 Barroux Abbey (http://www.barroux.org)
+  © 2014-2016 Akretion France (Alexis de Lattre <alexis.delattre@akretion.com>)
+  License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+-->
+<odoo>
+    <record id="partner_donation_action" model="ir.actions.act_window">
+        <field name="name">Donations</field>
+        <field name="res_model">donation.donation</field>
+        <field name="view_mode">tree,form,graph</field>
+        <field name="context">{'search_default_partner_id': active_id}</field>
+    </record>
+    <record id="view_partner_form" model="ir.ui.view">
+        <field name="name">donation.button.res.partner.form</field>
+        <field name="model">res.partner</field>
+        <field name="inherit_id" ref="base.view_partner_form" />
+        <field name="groups_id" eval="[(4, ref('donation.group_donation_viewer'))]" />
+        <field name="arch" type="xml">
+            <field name="category_id" position="after">
+                <field name="donor_rank" invisible="1" />
+            </field>
+            <xpath expr="//div[@name='button_box']" position="inside">
+                <button
+                    class="oe_stat_button"
+                    type="action"
+                    name="%(donation.partner_donation_action)d"
+                    attrs="{'invisible': [('donor_rank', '=', 0)]}"
+                    icon="fa-heart-o"
+                >
+                    <field string="Donations" name="donation_count" widget="statinfo" />
+                </button>
+            </xpath>
+        </field>
+    </record>
+</odoo>
diff --git a/donation/views/res_users.xml b/donation/views/res_users.xml
new file mode 100644
index 000000000..94a69aae7
--- /dev/null
+++ b/donation/views/res_users.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+  Copyright 2014-2021 Barroux Abbey (http://www.barroux.org)
+  Copyright 2014-2021 Akretion France (http://www.akretion.com/)
+  @author: Alexis de Lattre <alexis.delattre@akretion.com>
+  License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+-->
+<odoo>
+    <record id="view_users_form" model="ir.ui.view">
+        <field name="name">donation.res.users.form</field>
+        <field name="model">res.users</field>
+        <field name="inherit_id" ref="base.view_users_form" />
+        <field name="arch" type="xml">
+            <group name="preferences" position="inside">
+                <field name="context_donation_payment_mode_id" />
+                <field name="context_donation_campaign_id" />
+            </group>
+        </field>
+    </record>
+    <record id="view_users_form_simple_modif" model="ir.ui.view">
+        <field name="name">donation.preferences.res.users.form</field>
+        <field name="model">res.users</field>
+        <field name="inherit_id" ref="base.view_users_form_simple_modif" />
+        <field name="arch" type="xml">
+                <field name="tz" position="after">
+                <field
+                    name="context_donation_payment_mode_id"
+                    groups="donation.group_donation_user"
+                    readonly="0"
+                />
+                <field
+                    name="context_donation_campaign_id"
+                    groups="donation.group_donation_user"
+                    readonly="0"
+                />
+            </field>
+        </field>
+    </record>
+</odoo>
diff --git a/donation/wizard/__init__.py b/donation/wizard/__init__.py
new file mode 100644
index 000000000..4dd8fb569
--- /dev/null
+++ b/donation/wizard/__init__.py
@@ -0,0 +1,3 @@
+from . import donation_validate
+from . import tax_receipt_option_switch
+from . import res_config_settings
diff --git a/donation/wizard/donation_validate.py b/donation/wizard/donation_validate.py
new file mode 100644
index 000000000..e9da64c99
--- /dev/null
+++ b/donation/wizard/donation_validate.py
@@ -0,0 +1,22 @@
+# Copyright 2014-2016 Barroux Abbey (http://www.barroux.org)
+# Copyright 2014-2016 Akretion France
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from odoo import models
+
+
+class DonationValidate(models.TransientModel):
+    _name = "donation.validate"
+    _description = "Validate Donations"
+
+    def run(self):
+        self.ensure_one()
+        assert (
+            self.env.context.get("active_model") == "donation.donation"
+        ), "Source model must be donations"
+        assert self.env.context.get("active_ids"), "No donations selected"
+        donations = self.env["donation.donation"].browse(
+            self.env.context.get("active_ids")
+        )
+        donations.filtered(lambda x: x.state == "draft").validate()
+        return
diff --git a/donation/wizard/donation_validate_view.xml b/donation/wizard/donation_validate_view.xml
new file mode 100644
index 000000000..7522d0e75
--- /dev/null
+++ b/donation/wizard/donation_validate_view.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+  Copyright 2014-2016 Barroux Abbey (www.barroux.org)
+  Copyright 2014-2016 Akretion France (www.akretion.com)
+  @author: Alexis de Lattre <alexis.delattre@akretion.com>
+  License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+-->
+<odoo>
+    <record id="donation_validate_form" model="ir.ui.view">
+        <field name="name">donation_validate.form</field>
+        <field name="model">donation.validate</field>
+        <field name="arch" type="xml">
+            <form string="Validate Donations">
+                <p>
+                    This wizard will validate all the draft donations selected.
+                </p>
+                <footer>
+                    <button
+                        type="object"
+                        name="run"
+                        string="Validate"
+                        class="btn-primary"
+                    />
+                    <button special="cancel" string="Cancel" />
+                </footer>
+            </form>
+        </field>
+    </record>
+    <record id="donation_validate_action" model="ir.actions.act_window">
+        <field name="name">Validate Draft Donations</field>
+        <field name="res_model">donation.validate</field>
+        <field name="view_mode">form</field>
+        <field name="target">new</field>
+    </record>
+</odoo>
diff --git a/donation/wizard/res_config_settings.py b/donation/wizard/res_config_settings.py
new file mode 100644
index 000000000..18138c7dc
--- /dev/null
+++ b/donation/wizard/res_config_settings.py
@@ -0,0 +1,13 @@
+# Copyright 2016-2021 Akretion France (http://www.akretion.com/)
+# @author: Alexis de Lattre <alexis.delattre@akretion.com>
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from odoo import fields, models
+
+
+class ResConfigSettings(models.TransientModel):
+    _inherit = "res.config.settings"
+
+    donation_credit_transfer_product_id = fields.Many2one(
+        related="company_id.donation_credit_transfer_product_id", readonly=False
+    )
diff --git a/donation/wizard/res_config_settings.xml b/donation/wizard/res_config_settings.xml
new file mode 100644
index 000000000..4635d4637
--- /dev/null
+++ b/donation/wizard/res_config_settings.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+  Copyright 2021 Akretion France (http://www.akretion.com/)
+  @author: Alexis de Lattre <alexis.delattre@akretion.com>
+  License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+-->
+<odoo>
+    <record id="res_config_settings_donation" model="ir.ui.view">
+        <field name="name">donation.res.config.settings.form</field>
+        <field name="model">res.config.settings</field>
+        <field name="inherit_id" ref="account.res_config_settings_view_form" />
+        <field name="arch" type="xml">
+            <xpath expr="//div[@id='analytic']" position="after">
+                <h2>Donation</h2>
+                <div class="row mt16 o_settings_container" id="donation">
+                    <div class="col-12 col-lg-12 o_setting_box" id="donation-settings">
+                        <div class="o_setting_left_pane" />
+                        <div class="o_setting_right_pane">
+                            <div class="row" id="donation_credit_transfer_product_id">
+                                <label
+                                    for="donation_credit_transfer_product_id"
+                                    class="col-md-3"
+                                />
+                                <field name="donation_credit_transfer_product_id" />
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </xpath>
+        </field>
+    </record>
+</odoo>
diff --git a/donation/wizard/tax_receipt_option_switch.py b/donation/wizard/tax_receipt_option_switch.py
new file mode 100644
index 000000000..cd290857c
--- /dev/null
+++ b/donation/wizard/tax_receipt_option_switch.py
@@ -0,0 +1,32 @@
+# Copyright 2017 Barroux Abbey (www.barroux.org)
+# Copyright 2017 Akretion France (www.akretion.com)
+# @author Alexis de Lattre <alexis.delattre@akretion.com>
+
+from odoo import fields, models
+
+
+class DonationTaxReceiptOptionSwitch(models.TransientModel):
+    _name = "donation.tax.receipt.option.switch"
+    _description = "Switch Donation Tax Receipt Option"
+
+    donation_id = fields.Many2one(
+        "donation.donation",
+        string="Donation",
+        required=True,
+        default=lambda self: self._context.get("active_id"),
+    )
+    new_tax_receipt_option = fields.Selection(
+        [("each", "For Each Donation"), ("annual", "Annual Tax Receipt")],
+        string="Tax Receipt Option",
+        required=True,
+    )
+
+    def switch(self):
+        self.ensure_one()
+        assert self.donation_id, "Missing donation"
+        assert not self.donation_id.tax_receipt_id, "Already linked to a tax receipt"
+        self.donation_id.write({"tax_receipt_option": self.new_tax_receipt_option})
+        receipt = self.donation_id.generate_each_tax_receipt()
+        if receipt:
+            self.donation_id.write({"tax_receipt_id": receipt.id})
+        return
diff --git a/donation/wizard/tax_receipt_option_switch_view.xml b/donation/wizard/tax_receipt_option_switch_view.xml
new file mode 100644
index 000000000..cf0b73483
--- /dev/null
+++ b/donation/wizard/tax_receipt_option_switch_view.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+  Copyright 2017-2021 Barroux Abbey (www.barroux.org)
+  Copyright 2017-2021 Akretion France (www.akretion.com)
+  @author: Alexis de Lattre <alexis.delattre@akretion.com>
+  @author: Brother Bernard <informatique _at_ barroux.org>
+  License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+-->
+<odoo>
+    <record id="donation_tax_receipt_option_switch_form" model="ir.ui.view">
+        <field name="name">donation_tax_receipt_option_switch.form</field>
+        <field name="model">donation.tax.receipt.option.switch</field>
+        <field name="arch" type="xml">
+            <form string="Change Tax Receipt Option">
+                <group name="main">
+                    <field name="donation_id" readonly="1" />
+                    <field name="new_tax_receipt_option" />
+                </group>
+                <footer>
+                    <button
+                        type="object"
+                        name="switch"
+                        string="Update"
+                        class="btn-primary"
+                    />
+                    <button special="cancel" string="Cancel" />
+                </footer>
+            </form>
+        </field>
+    </record>
+    <record
+        id="donation_tax_receipt_option_switch_action"
+        model="ir.actions.act_window"
+    >
+        <field name="name">Change Tax Receipt Option</field>
+        <field name="res_model">donation.tax.receipt.option.switch</field>
+        <field name="view_mode">form</field>
+        <field name="target">new</field>
+    </record>
+</odoo>
diff --git a/setup/donation/odoo/addons/donation b/setup/donation/odoo/addons/donation
new file mode 120000
index 000000000..f23a64cfc
--- /dev/null
+++ b/setup/donation/odoo/addons/donation
@@ -0,0 +1,1 @@
+../../../../donation
\ No newline at end of file
diff --git a/setup/donation/setup.py b/setup/donation/setup.py
new file mode 100644
index 000000000..28c57bb64
--- /dev/null
+++ b/setup/donation/setup.py
@@ -0,0 +1,6 @@
+import setuptools
+
+setuptools.setup(
+    setup_requires=['setuptools-odoo'],
+    odoo_addon=True,
+)


Test patch:
diff --git a/donation/tests/__init__.py b/donation/tests/__init__.py
new file mode 100644
index 000000000..9bc50a42a
--- /dev/null
+++ b/donation/tests/__init__.py
@@ -0,0 +1,3 @@
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from . import test_donation
diff --git a/donation/tests/test_donation.py b/donation/tests/test_donation.py
new file mode 100644
index 000000000..82a496477
--- /dev/null
+++ b/donation/tests/test_donation.py
@@ -0,0 +1,337 @@
+# Copyright 2015-2021 Akretion France (http://www.akretion.com/)
+# @author: Alexis de Lattre <alexis.delattre@akretion.com>
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+import time
+
+from odoo import fields
+from odoo.tests.common import TransactionCase
+
+
+class TestDonation(TransactionCase):
+
+    at_install = False
+    post_install = True
+
+    def setUp(self):
+        super().setUp()
+        self.bank_journal = self.env["account.journal"].create(
+            {
+                "type": "bank",
+                "name": "test bank journal",
+            }
+        )
+        self.payment_mode = self.env["account.payment.mode"].create(
+            {
+                "name": "test_payment_mode",
+                "donation": True,
+                "bank_account_link": "fixed",
+                "fixed_journal_id": self.bank_journal.id,
+                "payment_method_id": self.env.ref(
+                    "account.account_payment_method_manual_in"
+                ).id,
+            }
+        )
+        today = time.strftime("%Y-%m-%d")
+        self.product = self.env.ref("donation_base.product_product_donation")
+        self.inkind_product = self.env.ref(
+            "donation_base.product_product_inkind_donation"
+        )
+        self.ddo = self.env["donation.donation"]
+        self.donor1 = self.env.ref("donation_base.donor1")
+        self.donor2 = self.env.ref("donation_base.donor2")
+        self.donor3 = self.env.ref("donation_base.donor3")
+
+        self.don1 = self.ddo.create(
+            {
+                "check_total": 100,
+                "partner_id": self.donor1.id,
+                "donation_date": today,
+                "payment_mode_id": self.payment_mode.id,
+                "tax_receipt_option": "each",
+                "line_ids": [
+                    (
+                        0,
+                        0,
+                        {
+                            "product_id": self.product.id,
+                            "quantity": 1,
+                            "unit_price": 100,
+                        },
+                    )
+                ],
+            }
+        )
+        self.don2 = self.ddo.create(
+            {
+                "check_total": 120,
+                "partner_id": self.donor2.id,
+                "donation_date": today,
+                "payment_mode_id": self.payment_mode.id,
+                "tax_receipt_option": "annual",
+                "line_ids": [
+                    (
+                        0,
+                        0,
+                        {
+                            "product_id": self.product.id,
+                            "quantity": 1,
+                            "unit_price": 120,
+                        },
+                    )
+                ],
+            }
+        )
+        self.don3 = self.ddo.create(
+            {
+                "check_total": 150,
+                "partner_id": self.donor3.id,
+                "donation_date": today,
+                "payment_mode_id": self.payment_mode.id,
+                "tax_receipt_option": "none",
+                "line_ids": [
+                    (
+                        0,
+                        0,
+                        {
+                            "product_id": self.product.id,
+                            "quantity": 1,
+                            "unit_price": 150,
+                        },
+                    )
+                ],
+            }
+        )
+        self.don4 = self.ddo.create(
+            {
+                "check_total": 1000,
+                "partner_id": self.donor1.id,
+                "donation_date": today,
+                "payment_mode_id": self.payment_mode.id,
+                "tax_receipt_option": "each",
+                "line_ids": [
+                    (
+                        0,
+                        0,
+                        {
+                            "product_id": self.inkind_product.id,
+                            "quantity": 1,
+                            "unit_price": 1000,
+                        },
+                    )
+                ],
+            }
+        )
+        self.don5 = self.ddo.create(
+            {
+                "check_total": 1200,
+                "partner_id": self.donor1.id,
+                "donation_date": today,
+                "payment_mode_id": self.payment_mode.id,
+                "tax_receipt_option": "each",
+                "line_ids": [
+                    (
+                        0,
+                        0,
+                        {
+                            "product_id": self.inkind_product.id,
+                            "quantity": 1,
+                            "unit_price": 800,
+                        },
+                    ),
+                    (
+                        0,
+                        0,
+                        {
+                            "product_id": self.product.id,
+                            "quantity": 1,
+                            "unit_price": 400,
+                        },
+                    ),
+                ],
+            }
+        )
+
+    def test_donation_1(self):
+        donations = [self.don1, self.don2, self.don3, self.don4, self.don5]
+        for donation in donations:
+            self.assertEqual(donation.state, "draft")
+            donation.validate()
+            self.assertEqual(donation.state, "done")
+            if donation == self.don4:  # full in-kind donation
+                self.assertFalse(donation.move_id)
+            else:
+                self.assertEqual(donation.move_id.state, "posted")
+                self.assertEqual(
+                    donation.payment_ref or donation.number, donation.move_id.ref
+                )
+                self.assertEqual(
+                    donation.payment_mode_id.fixed_journal_id,
+                    donation.move_id.journal_id,
+                )
+                self.assertEqual(donation.donation_date, donation.move_id.date)
+            if donation.tax_receipt_option == "each" and donation.tax_receipt_total:
+                self.assertTrue(donation.tax_receipt_id)
+                tax_receipt = donation.tax_receipt_id
+                self.assertEqual(tax_receipt.type, "each")
+                self.assertEqual(donation.commercial_partner_id, tax_receipt.partner_id)
+                self.assertEqual(donation.donation_date, tax_receipt.donation_date)
+                self.assertEqual(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"),
+                "payment_mode_id": self.payment_mode.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.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"]
+
+        partner_familly = self.res_partner.create(
+            {"name": "Famille Joly", "tax_receipt_option": "annual"}
+        )
+        partner_husband = self.res_partner.create(
+            {"parent_id": partner_familly.id, "name": "Xavier Joly"}
+        )
+        partner_wife = self.res_partner.create(
+            {"parent_id": partner_familly.id, "name": "Stéphanie Joly"}
+        )
+
+        partner_husband._compute_donation_count()
+        dons = self.create_donation_annual_receipt(
+            partner_husband, 40, 10, "CHQ FB 93283290"
+        )
+        dons += self.create_donation_annual_receipt(
+            partner_husband, 140, 60, "CHQ FB OPIE02"
+        )
+        dons += self.create_donation_annual_receipt(
+            partner_wife, 20, 5, "CHQ FB AZERTY1242"
+        )
+        dons.validate()
+        last_day_year = time.strftime("%Y-12-31")
+        wizard = self.env["tax.receipt.annual.create"].create(
+            {"start_date": time.strftime("%Y-01-01"), "end_date": last_day_year}
+        )
+        action = wizard.generate_annual_receipts()
+        tax_receipt_ids = action["domain"][0][2]
+        self.assertTrue(tax_receipt_ids)
+        dtro = self.env["donation.tax.receipt"]
+        tax_receipts = dtro.search(
+            [
+                ("partner_id", "=", partner_familly.id),
+                ("type", "=", "annual"),
+                ("id", "in", tax_receipt_ids),
+            ]
+        )
+        self.assertEqual(len(tax_receipts), 1)
+        tax_receipt = tax_receipts[0]
+        self.assertEqual(tax_receipt.amount, 200)
+        self.assertTrue(tax_receipt.number)
+        self.assertEqual(tax_receipt.date, fields.Date.from_string(last_day_year))
+        self.assertEqual(
+            tax_receipt.donation_date, fields.Date.from_string(last_day_year)
+        )
+        self.assertEqual(tax_receipt.currency_id, dons[0].company_id.currency_id)
+
+    def test_donation_campaign(self):
+        self.campaign_id = self.env.ref("donation.quest_origin")
+        self.campaign_id.name_get()
+
+        self.don8 = self.ddo.create(
+            {
+                "check_total": 1000,
+                "partner_id": self.donor1.id,
+                "donation_date": time.strftime("%Y-%m-%d"),
+                "payment_mode_id": self.payment_mode.id,
+                "tax_receipt_option": "each",
+                "line_ids": [
+                    (
+                        0,
+                        0,
+                        {
+                            "product_id": self.inkind_product.id,
+                            "quantity": 1,
+                            "unit_price": 1000,
+                        },
+                    )
+                ],
+            }
+        )
+
+        self.validate = self.env["donation.validate"]
+        wizard = self.validate.with_context(
+            {
+                "active_ids": self.don8.ids,
+                "active_model": "donation.donation",
+                "active_id": self.don8.id,
+            }
+        ).create({})
+        wizard.run()
+
+        self.option_switch = self.env["donation.tax.receipt.option.switch"]
+        wizard = self.option_switch.create(
+            {"donation_id": self.don8.id, "new_tax_receipt_option": "annual"}
+        )
+        self.don8.tax_receipt_id = False
+        wizard.switch()
+
+    def create_donation_annual_receipt(
+        self, partner, amount_tax_receipt, amount_no_tax_receipt, payment_ref
+    ):
+        donation = self.ddo.create(
+            {
+                "payment_mode_id": self.payment_mode.id,
+                "partner_id": partner.id,
+                "tax_receipt_option": "annual",
+                "donation_date": time.strftime("%Y-01-01"),
+                "payment_ref": payment_ref,
+                "line_ids": [
+                    (
+                        0,
+                        0,
+                        {
+                            "product_id": self.product.id,
+                            "quantity": 1,
+                            "unit_price": amount_tax_receipt,
+                        },
+                    ),
+                    (
+                        0,
+                        0,
+                        {
+                            "product_id": self.env.ref(
+                                "donation_base.product_product_donation_notaxreceipt"
+                            ).id,
+                            "quantity": 1,
+                            "unit_price": amount_no_tax_receipt,
+                        },
+                    ),
+                ],
+            }
+        )
+        return donation