Alexis de Lattre
3 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 806 additions and 0 deletions
-
64account_bank_reconciliation_summary_xlsx/README.rst
-
3account_bank_reconciliation_summary_xlsx/__init__.py
-
21account_bank_reconciliation_summary_xlsx/__manifest__.py
-
216account_bank_reconciliation_summary_xlsx/i18n/fr.po
-
1account_bank_reconciliation_summary_xlsx/models/__init__.py
-
13account_bank_reconciliation_summary_xlsx/models/account_move_line.py
-
1account_bank_reconciliation_summary_xlsx/readme/CONFIGURE.rst
-
1account_bank_reconciliation_summary_xlsx/readme/CONTRIBUTORS.rst
-
8account_bank_reconciliation_summary_xlsx/readme/DESCRIPTION.rst
-
5account_bank_reconciliation_summary_xlsx/readme/USAGE.rst
-
1account_bank_reconciliation_summary_xlsx/report/__init__.py
-
294account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py
-
18account_bank_reconciliation_summary_xlsx/report/report.xml
-
23account_bank_reconciliation_summary_xlsx/views/account_bank_statement.xml
-
32account_bank_reconciliation_summary_xlsx/views/account_journal.xml
-
18account_bank_reconciliation_summary_xlsx/views/account_move_line.xml
-
1account_bank_reconciliation_summary_xlsx/wizard/__init__.py
-
37account_bank_reconciliation_summary_xlsx/wizard/bank_reconciliation_report_wizard.py
-
42account_bank_reconciliation_summary_xlsx/wizard/bank_reconciliation_report_wizard_view.xml
-
1setup/account_bank_reconciliation_summary_xlsx/odoo/addons/account_bank_reconciliation_summary_xlsx
-
6setup/account_bank_reconciliation_summary_xlsx/setup.py
@ -0,0 +1,64 @@ |
|||||
|
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg |
||||
|
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html |
||||
|
:alt: License: AGPL-3 |
||||
|
|
||||
|
=============================== |
||||
|
Bank Reconciliation Report XLSX |
||||
|
=============================== |
||||
|
|
||||
|
This module adds a Bank Reconciliation Report in Odoo in XLSX format. For each bank journal, the report displays: |
||||
|
|
||||
|
1. The balance of the bank account in the accounting, |
||||
|
2. The list of journal items of the bank account not linked to any bank statement lines, |
||||
|
3. The list of draft bank statement lines not linked to any journal items, |
||||
|
4. The computed balance of the bank account at the bank. |
||||
|
|
||||
|
The last field (computed balance of the bank account at the bank) must be compared to the real bank account balance at the bank. If there is a difference, you need to find the error in the accounting. The field *Computed balance of the bank account at the bank* is a formula, so you can easily change its computation to try to find the difference with the real bank account balance at the bank. |
||||
|
|
||||
|
Configuration |
||||
|
============= |
||||
|
|
||||
|
This module doesn't require any configuration. |
||||
|
|
||||
|
Usage |
||||
|
===== |
||||
|
|
||||
|
You can launch the Bank Reconciliation Report wizard from: |
||||
|
|
||||
|
* the menu *Accounting > Reports > OCA accounting reports > Bank Reconciliation*, |
||||
|
* the form view of a bank statement: click on the button *Bank Reconciliation Report*. |
||||
|
|
||||
|
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas |
||||
|
:alt: Try me on Runbot |
||||
|
:target: https://runbot.odoo-community.org/runbot/91/10.0 |
||||
|
|
||||
|
Bug Tracker |
||||
|
=========== |
||||
|
|
||||
|
Bugs are tracked on `GitHub Issues |
||||
|
<https://github.com/OCA/account-financial-reporting/issues>`_. In case of trouble, please |
||||
|
check there if your issue has already been reported. If you spotted it first, |
||||
|
help us smashing it by providing a detailed and welcomed feedback. |
||||
|
|
||||
|
Credits |
||||
|
======= |
||||
|
|
||||
|
Contributors |
||||
|
------------ |
||||
|
|
||||
|
* Alexis de Lattre <alexis.delattre@akretion.com> |
||||
|
|
||||
|
Maintainer |
||||
|
---------- |
||||
|
|
||||
|
.. image:: https://odoo-community.org/logo.png |
||||
|
:alt: Odoo Community Association |
||||
|
:target: https://odoo-community.org |
||||
|
|
||||
|
This module is maintained by the OCA. |
||||
|
|
||||
|
OCA, or the Odoo Community Association, is a nonprofit organization whose |
||||
|
mission is to support the collaborative development of Odoo features and |
||||
|
promote its widespread use. |
||||
|
|
||||
|
To contribute to this module, please visit https://odoo-community.org. |
@ -0,0 +1,3 @@ |
|||||
|
from . import models |
||||
|
from . import report |
||||
|
from . import wizard |
@ -0,0 +1,21 @@ |
|||||
|
# Copyright 2017-2020 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). |
||||
|
|
||||
|
{ |
||||
|
"name": "Bank Reconciliation Report", |
||||
|
"version": "13.0.1.0.0", |
||||
|
"license": "AGPL-3", |
||||
|
"author": "Akretion,Odoo Community Association (OCA)", |
||||
|
"website": "https://github.com/OCA/account-financial-reporting", |
||||
|
"summary": "XLSX report to help on bank reconciliation", |
||||
|
"depends": ["account_financial_report", "report_xlsx"], |
||||
|
"data": [ |
||||
|
"report/report.xml", |
||||
|
"wizard/bank_reconciliation_report_wizard_view.xml", |
||||
|
"views/account_bank_statement.xml", |
||||
|
"views/account_move_line.xml", |
||||
|
"views/account_journal.xml", |
||||
|
], |
||||
|
"installable": True, |
||||
|
} |
@ -0,0 +1,216 @@ |
|||||
|
# Translation of Odoo Server. |
||||
|
# This file contains the translation of the following modules: |
||||
|
# * account_bank_reconciliation_summary_xlsx |
||||
|
# |
||||
|
msgid "" |
||||
|
msgstr "" |
||||
|
"Project-Id-Version: Odoo Server 10.0\n" |
||||
|
"Report-Msgid-Bugs-To: \n" |
||||
|
"POT-Creation-Date: 2018-12-04 10:29+0000\n" |
||||
|
"PO-Revision-Date: 2018-12-04 10:29+0000\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: account_bank_reconciliation_summary_xlsx |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:70 |
||||
|
#, python-format |
||||
|
msgid "%s - Bank Reconciliation" |
||||
|
msgstr "%s - Rapprochement bancaire" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: model:ir.ui.view,arch_db:account_bank_reconciliation_summary_xlsx.account_journal_dashboard_kanban_view |
||||
|
msgid "<span>Report</span>" |
||||
|
msgstr "<span>Rapport</span>" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:129 |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:182 |
||||
|
#, python-format |
||||
|
msgid "Amount" |
||||
|
msgstr "Montant" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:92 |
||||
|
#, python-format |
||||
|
msgid "Balance %s:" |
||||
|
msgstr "Balance %s:" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_bank_reconciliation_report_wizard_journal_ids |
||||
|
msgid "Bank Journals" |
||||
|
msgstr "Journaux de banque" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: model:ir.actions.act_window,name:account_bank_reconciliation_summary_xlsx.bank_reconciliation_report_wizard_action |
||||
|
#: model:ir.ui.menu,name:account_bank_reconciliation_summary_xlsx.bank_reconciliation_report_wizard_menu |
||||
|
#: model:ir.ui.view,arch_db:account_bank_reconciliation_summary_xlsx.account_journal_dashboard_kanban_view |
||||
|
msgid "Bank Reconciliation" |
||||
|
msgstr "Rapprochement bancaire" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: model:ir.ui.view,arch_db:account_bank_reconciliation_summary_xlsx.bank_reconciliation_report_wizard_form |
||||
|
#: model:ir.ui.view,arch_db:account_bank_reconciliation_summary_xlsx.view_bank_statement_form |
||||
|
msgid "Bank Reconciliation Report" |
||||
|
msgstr "Rapport rapprochement bancaire" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: model:ir.model,name:account_bank_reconciliation_summary_xlsx.model_bank_reconciliation_report_wizard |
||||
|
msgid "Bank Reconciliation Report Wizard" |
||||
|
msgstr "Wizard raport rapprochement bancaire" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: model:ir.actions.report.xml,name:account_bank_reconciliation_summary_xlsx.bank_reconciliation_xlsx |
||||
|
msgid "Bank Reconciliation XLSX" |
||||
|
msgstr "Rapprochement bancaire XLSX" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: model:ir.ui.view,arch_db:account_bank_reconciliation_summary_xlsx.bank_reconciliation_report_wizard_form |
||||
|
msgid "Cancel" |
||||
|
msgstr "Annuler" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:210 |
||||
|
#, python-format |
||||
|
msgid "Computed Bank Account Balance at the Bank:" |
||||
|
msgstr "Solde théorique du compte bancaire :" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:130 |
||||
|
#, python-format |
||||
|
msgid "Counter-part" |
||||
|
msgstr "Contre partie" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_bank_reconciliation_report_wizard_create_uid |
||||
|
msgid "Created by" |
||||
|
msgstr "Créé par" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_bank_reconciliation_report_wizard_create_date |
||||
|
msgid "Created on" |
||||
|
msgstr "Créé le" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:128 |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:181 |
||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_bank_reconciliation_report_wizard_date |
||||
|
#, python-format |
||||
|
msgid "Date" |
||||
|
msgstr "Date " |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:83 |
||||
|
#, python-format |
||||
|
msgid "Date:" |
||||
|
msgstr "Date :" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_bank_reconciliation_report_wizard_display_name |
||||
|
msgid "Display Name" |
||||
|
msgstr "Nom affiché" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:169 |
||||
|
#, python-format |
||||
|
msgid "Draft bank statement lines:" |
||||
|
msgstr "Lignes non validées du relevé bancaire :" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: model:ir.ui.view,arch_db:account_bank_reconciliation_summary_xlsx.bank_reconciliation_report_wizard_form |
||||
|
msgid "Export XLSX" |
||||
|
msgstr "Export XLSX" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_bank_reconciliation_report_wizard_id |
||||
|
msgid "ID" |
||||
|
msgstr "ID" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: model:ir.model,name:account_bank_reconciliation_summary_xlsx.model_account_move_line |
||||
|
msgid "Journal Item" |
||||
|
msgstr "Écriture comptable" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:113 |
||||
|
#, python-format |
||||
|
msgid "Journal items of account %s not linked to a bank statement line:" |
||||
|
msgstr "Ecritures comptables du compte %s non liées à une ligne de relevé bancaire :" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:128 |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:181 |
||||
|
#, python-format |
||||
|
msgid "Label" |
||||
|
msgstr "Libellé" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_bank_reconciliation_report_wizard___last_update |
||||
|
msgid "Last Modified on" |
||||
|
msgstr "Dernière modification le" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_bank_reconciliation_report_wizard_write_uid |
||||
|
msgid "Last Updated by" |
||||
|
msgstr "Mis à jour par" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_bank_reconciliation_report_wizard_write_date |
||||
|
msgid "Last Updated on" |
||||
|
msgstr "Mis à jour le" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:129 |
||||
|
#, python-format |
||||
|
msgid "Move Number" |
||||
|
msgstr "Numéro de pièce" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:124 |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:177 |
||||
|
#, python-format |
||||
|
msgid "NONE" |
||||
|
msgstr "Rien" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:215 |
||||
|
#, python-format |
||||
|
msgid "No Bank Journal" |
||||
|
msgstr "Pas de journal de banque" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:220 |
||||
|
#, python-format |
||||
|
msgid "No bank journal selected. This report is only for bank journals." |
||||
|
msgstr "Pas de journal de banque sélectionné. Ce rapport est uniquement pour les journaux de banque." |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:128 |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:182 |
||||
|
#, python-format |
||||
|
msgid "Partner" |
||||
|
msgstr "Partenaire" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:128 |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:181 |
||||
|
#, python-format |
||||
|
msgid "Ref." |
||||
|
msgstr "Ref." |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:129 |
||||
|
#: model:ir.model.fields,field_description:account_bank_reconciliation_summary_xlsx.field_account_move_line_statement_line_date |
||||
|
#, python-format |
||||
|
msgid "Statement Line Date" |
||||
|
msgstr "Date ligne relevé" |
||||
|
|
||||
|
#. module: account_bank_reconciliation_summary_xlsx |
||||
|
#: code:addons/account_bank_reconciliation_summary_xlsx/report/bank_reconciliation_xlsx.py:182 |
||||
|
#, python-format |
||||
|
msgid "Statement Ref." |
||||
|
msgstr "Ref. relevé" |
||||
|
|
@ -0,0 +1 @@ |
|||||
|
from . import account_move_line |
@ -0,0 +1,13 @@ |
|||||
|
# Copyright 2017-2020 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 AccountMoveLine(models.Model): |
||||
|
_inherit = "account.move.line" |
||||
|
|
||||
|
statement_line_date = fields.Date( |
||||
|
string="Statement Line Date", related="statement_line_id.date", store=True |
||||
|
) |
@ -0,0 +1 @@ |
|||||
|
This module doesn't require any configuration. |
@ -0,0 +1 @@ |
|||||
|
* Alexis de Lattre <alexis.delattre@akretion.com> |
@ -0,0 +1,8 @@ |
|||||
|
This module adds a Bank Reconciliation Report in Odoo in XLSX format. For each bank journal, the report displays: |
||||
|
|
||||
|
1. The balance of the bank account in the accounting, |
||||
|
2. The list of journal items of the bank account not linked to any bank statement lines, |
||||
|
3. The list of draft bank statement lines not linked to any journal items, |
||||
|
4. The computed balance of the bank account at the bank. |
||||
|
|
||||
|
The last field (computed balance of the bank account at the bank) must be compared to the real bank account balance at the bank. If there is a difference, you need to find the error in the accounting. The field *Computed balance of the bank account at the bank* is a formula, so you can easily change its computation to try to find the difference with the real bank account balance at the bank. |
@ -0,0 +1,5 @@ |
|||||
|
You can launch the Bank Reconciliation Report wizard from: |
||||
|
|
||||
|
* the menu *Invoicing > Reporting > OCA accounting reports > Bank Reconciliation*, |
||||
|
* the form view of a bank statement: click on the button *Bank Reconciliation Report*, |
||||
|
* the invoicing dashboard: on a bank journal, click on the options, then select *Bank Reconciliation*. |
@ -0,0 +1 @@ |
|||||
|
from . import bank_reconciliation_xlsx |
@ -0,0 +1,294 @@ |
|||||
|
# Copyright 2017-2020 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 BankReconciliationXlsx(models.AbstractModel): |
||||
|
_name = "report.bank.reconciliation.xlsx" |
||||
|
_description = "Bank Reconciliation XLSX Report" |
||||
|
_inherit = "report.report_xlsx.abstract" |
||||
|
|
||||
|
def _compute_account_balance(self, journal, date): |
||||
|
bank_account = journal.default_debit_account_id |
||||
|
# TODO: add support for bank accounts in foreign currency |
||||
|
# if not o.currency_id else 'amount_currency' |
||||
|
query = """ |
||||
|
SELECT sum(balance) FROM account_move_line |
||||
|
WHERE account_id=%s AND date <= %s""" |
||||
|
self.env.cr.execute(query, (bank_account.id, date)) |
||||
|
query_results = self.env.cr.dictfetchall() |
||||
|
if query_results: |
||||
|
account_bal = query_results[0].get("sum") or 0.0 |
||||
|
else: |
||||
|
account_bal = 0.0 |
||||
|
return account_bal |
||||
|
|
||||
|
def _prepare_move_lines(self, journal, date): |
||||
|
bank_account = journal.default_debit_account_id |
||||
|
mlines = self.env["account.move.line"].search( |
||||
|
[ |
||||
|
("account_id", "=", bank_account.id), |
||||
|
("journal_id", "=", journal.id), # to avoid initial line |
||||
|
("date", "<=", date), |
||||
|
"|", |
||||
|
("statement_line_date", "=", False), |
||||
|
("statement_line_date", ">", date), |
||||
|
] |
||||
|
) |
||||
|
res = [] |
||||
|
for mline in mlines: |
||||
|
move = mline.move_id |
||||
|
cpart = [] |
||||
|
for line in move.line_ids: |
||||
|
if ( |
||||
|
line.account_id != bank_account |
||||
|
and line.account_id.code not in cpart |
||||
|
): |
||||
|
cpart.append(line.account_id.code) |
||||
|
counterpart = " ,".join(cpart) |
||||
|
res.append( |
||||
|
{ |
||||
|
"date": mline.date, |
||||
|
"label": mline.name, |
||||
|
"ref": mline.ref or "", |
||||
|
"partner": mline.partner_id.display_name or "", |
||||
|
"amount": mline.balance, |
||||
|
"statement_line_date": mline.statement_line_date or "", |
||||
|
"move_number": move.name, |
||||
|
"counterpart": counterpart, |
||||
|
} |
||||
|
) |
||||
|
return res |
||||
|
|
||||
|
def _prepare_draft_statement_lines(self, journal, date): |
||||
|
blines = self.env["account.bank.statement.line"].search( |
||||
|
[ |
||||
|
("journal_entry_ids", "=", False), |
||||
|
("journal_id", "=", journal.id), |
||||
|
("date", "<=", date), |
||||
|
] |
||||
|
) |
||||
|
res = [] |
||||
|
for bline in blines: |
||||
|
res.append( |
||||
|
{ |
||||
|
"date": bline.date, |
||||
|
"label": bline.name, |
||||
|
"ref": bline.ref or "", |
||||
|
"partner": bline.partner_id.display_name or "", |
||||
|
"amount": bline.amount, |
||||
|
"statement_ref": bline.statement_id.display_name, |
||||
|
} |
||||
|
) |
||||
|
return res |
||||
|
|
||||
|
def generate_xlsx_report(self, workbook, data, wizard): |
||||
|
date = wizard.date |
||||
|
date_dt = fields.Date.from_string(date) |
||||
|
no_bank_journal = True |
||||
|
for o in wizard.journal_ids: |
||||
|
no_bank_journal = False |
||||
|
# Start styles |
||||
|
lang_code = self.env.user.lang |
||||
|
lang = False |
||||
|
if lang_code: |
||||
|
lang = self.env["res.lang"].search([("code", "=", lang_code)]) |
||||
|
if not lang: |
||||
|
lang = self.env["res.lang"].search([], limit=1) |
||||
|
xls_date_format = ( |
||||
|
lang.date_format.replace("%Y", "yyyy") |
||||
|
.replace("%m", "mm") |
||||
|
.replace("%d", "dd") |
||||
|
.replace("%y", "yy") |
||||
|
) |
||||
|
|
||||
|
doc_title = workbook.add_format({"bold": True, "font_size": 16}) |
||||
|
col_title = workbook.add_format( |
||||
|
{ |
||||
|
"bold": True, |
||||
|
"bg_color": "#e2e2fa", |
||||
|
"text_wrap": True, |
||||
|
"font_size": 10, |
||||
|
} |
||||
|
) |
||||
|
title_right = workbook.add_format( |
||||
|
{ |
||||
|
"bold": True, |
||||
|
"bg_color": "#e6e6fa", |
||||
|
"font_size": 10, |
||||
|
"align": "right", |
||||
|
} |
||||
|
) |
||||
|
title_date = workbook.add_format( |
||||
|
{ |
||||
|
"bg_color": "#f6f6ff", |
||||
|
"bold": True, |
||||
|
"num_format": xls_date_format, |
||||
|
"font_size": 10, |
||||
|
"align": "left", |
||||
|
} |
||||
|
) |
||||
|
label_bold = workbook.add_format( |
||||
|
{"bold": True, "text_wrap": False, "font_size": 10} |
||||
|
) |
||||
|
none = workbook.add_format( |
||||
|
{"bold": True, "font_size": 10, "align": "right"} |
||||
|
) |
||||
|
regular = workbook.add_format({"font_size": 10}) |
||||
|
if "%" in xls_date_format: |
||||
|
# fallback |
||||
|
xls_date_format = "yyyy-mm-dd" |
||||
|
regular_date = workbook.add_format( |
||||
|
{"num_format": xls_date_format, "font_size": 10, "align": "left"} |
||||
|
) |
||||
|
cur_format = u"#,##0.00 %s" % ( |
||||
|
o.company_id.currency_id.symbol or o.company_id.currency_id.name |
||||
|
) |
||||
|
# It seems that Excel replaces automatically the decimal |
||||
|
# and thousand separator by those of the language under which |
||||
|
# Excel runs |
||||
|
regular_currency = workbook.add_format( |
||||
|
{"num_format": cur_format, "font_size": 10} |
||||
|
) |
||||
|
regular_currency_bg = workbook.add_format( |
||||
|
{"num_format": cur_format, "font_size": 10, "bg_color": "#f6f6ff"} |
||||
|
) |
||||
|
# End styles |
||||
|
|
||||
|
sheet = workbook.add_worksheet(o.code or o.name) |
||||
|
sheet.write( |
||||
|
0, |
||||
|
0, |
||||
|
_("%s - %s - Bank Reconciliation") |
||||
|
% (o.company_id.name, o.display_name), |
||||
|
doc_title, |
||||
|
) |
||||
|
sheet.set_row(0, 26) |
||||
|
sheet.set_row(1, 25) |
||||
|
sheet.set_column(0, 0, 10) |
||||
|
sheet.set_column(1, 1, 40) |
||||
|
sheet.set_column(2, 2, 15) |
||||
|
sheet.set_column(3, 3, 25) |
||||
|
sheet.set_column(4, 4, 12) |
||||
|
sheet.set_column(5, 5, 18) |
||||
|
sheet.set_column(6, 6, 14) |
||||
|
sheet.set_column(7, 7, 14) |
||||
|
row = 2 |
||||
|
sheet.write(row, 0, _("Date:"), title_right) |
||||
|
sheet.write(row, 1, date_dt, title_date) |
||||
|
# 1) Show accounting balance of bank account |
||||
|
row += 2 |
||||
|
bank_account = o.default_debit_account_id |
||||
|
for col in range(3): |
||||
|
sheet.write(row, col, "", title_right) |
||||
|
sheet.write(row, 3, _("Balance %s:") % bank_account.code, title_right) |
||||
|
account_bal = self._compute_account_balance(o, date) |
||||
|
|
||||
|
sheet.write(row, 4, account_bal, regular_currency_bg) |
||||
|
bank_bal = account_bal |
||||
|
formula = "=E%d" % (row + 1) |
||||
|
# 2) Show account move line that are not linked to bank statement |
||||
|
# line or linked to a statement line after the date |
||||
|
row += 2 |
||||
|
sheet.write( |
||||
|
row, |
||||
|
0, |
||||
|
_("Journal items of account %s not linked to a bank " "statement line:") |
||||
|
% bank_account.code, |
||||
|
label_bold, |
||||
|
) |
||||
|
mlines = self._prepare_move_lines(o, date) |
||||
|
if not mlines: |
||||
|
sheet.write(row, 4, _("NONE"), none) |
||||
|
else: |
||||
|
row += 1 |
||||
|
col_labels = [ |
||||
|
_("Date"), |
||||
|
_("Label"), |
||||
|
_("Ref."), |
||||
|
_("Partner"), |
||||
|
_("Amount"), |
||||
|
_("Statement Line Date"), |
||||
|
_("Move Number"), |
||||
|
_("Counter-part"), |
||||
|
] |
||||
|
col = 0 |
||||
|
for col_label in col_labels: |
||||
|
sheet.write(row, col, col_label, col_title) |
||||
|
col += 1 |
||||
|
m_start_row = m_end_row = row + 1 |
||||
|
for mline in mlines: |
||||
|
row += 1 |
||||
|
m_end_row = row |
||||
|
bank_bal -= mline["amount"] |
||||
|
sheet.write(row, 0, mline["date"], regular_date) |
||||
|
sheet.write(row, 1, mline["label"], regular) |
||||
|
sheet.write(row, 2, mline["ref"], regular) |
||||
|
sheet.write(row, 3, mline["partner"], regular) |
||||
|
sheet.write(row, 4, mline["amount"], regular_currency) |
||||
|
sheet.write(row, 5, mline["statement_line_date"], regular_date) |
||||
|
sheet.write(row, 6, mline["move_number"], regular) |
||||
|
sheet.write(row, 7, mline["counterpart"], regular) |
||||
|
|
||||
|
formula += "-SUM(E%d:E%d)" % (m_start_row + 1, m_end_row + 1) |
||||
|
|
||||
|
# 3) Add draft bank statement lines |
||||
|
row += 2 # skip 1 line |
||||
|
sheet.write(row, 0, _("Draft bank statement lines:"), label_bold) |
||||
|
blines = self._prepare_draft_statement_lines(o, date) |
||||
|
if not blines: |
||||
|
sheet.write(row, 4, _("NONE"), none) |
||||
|
else: |
||||
|
row += 1 |
||||
|
col_labels = [ |
||||
|
_("Date"), |
||||
|
_("Label"), |
||||
|
_("Ref."), |
||||
|
_("Partner"), |
||||
|
_("Amount"), |
||||
|
_("Statement Ref."), |
||||
|
"", |
||||
|
"", |
||||
|
] |
||||
|
col = 0 |
||||
|
for col_label in col_labels: |
||||
|
sheet.write(row, col, col_label, col_title) |
||||
|
col += 1 |
||||
|
b_start_row = b_end_row = row + 1 |
||||
|
for bline in blines: |
||||
|
row += 1 |
||||
|
b_end_row = row |
||||
|
bank_bal += bline["amount"] |
||||
|
sheet.write(row, 0, bline["date"], regular_date) |
||||
|
sheet.write(row, 1, bline["label"], regular) |
||||
|
sheet.write(row, 2, bline["ref"], regular) |
||||
|
sheet.write(row, 3, bline["partner"], regular) |
||||
|
sheet.write(row, 4, bline["amount"], regular_currency) |
||||
|
sheet.write(row, 5, bline["statement_ref"], regular_currency) |
||||
|
formula += "+SUM(E%d:E%d)" % (b_start_row + 1, b_end_row + 1) |
||||
|
|
||||
|
# 4) Theoric bank account balance at the bank |
||||
|
row += 2 |
||||
|
for col in range(3): |
||||
|
sheet.write(row, col, "", title_right) |
||||
|
sheet.write( |
||||
|
row, 3, _("Computed Bank Account Balance at the Bank:"), title_right |
||||
|
) |
||||
|
sheet.write_formula(row, 4, formula, regular_currency_bg, bank_bal) |
||||
|
if no_bank_journal: |
||||
|
sheet = workbook.add_worksheet(_("No Bank Journal")) |
||||
|
sheet.set_row(0, 30) |
||||
|
warn_msg = workbook.add_format( |
||||
|
{"bold": True, "font_size": 16, "font_color": "#003b6f"} |
||||
|
) |
||||
|
sheet.write( |
||||
|
0, |
||||
|
0, |
||||
|
_( |
||||
|
"No bank journal selected. " |
||||
|
"This report is only for bank journals." |
||||
|
), |
||||
|
warn_msg, |
||||
|
) |
@ -0,0 +1,18 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8" ?> |
||||
|
<!-- |
||||
|
Copyright 2017-2020 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> |
||||
|
<report |
||||
|
id="bank_reconciliation_xlsx" |
||||
|
model="bank.reconciliation.report.wizard" |
||||
|
string="Bank Reconciliation XLSX" |
||||
|
report_type="xlsx" |
||||
|
name="bank.reconciliation.xlsx" |
||||
|
file="bank.reconciliation.xlsx" |
||||
|
print_report_name="'bank_reconciliation-%s' % (object.date)" |
||||
|
/> |
||||
|
<!-- print_report_name doesn't work here... --> |
||||
|
</odoo> |
@ -0,0 +1,23 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8" ?> |
||||
|
<!-- |
||||
|
Copyright 2017-2020 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">bank_rec_summary.account.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"> |
||||
|
<button name="check_confirm_bank" position="after"> |
||||
|
<button |
||||
|
name="%(bank_reconciliation_report_wizard_action)d" |
||||
|
type="action" |
||||
|
string="Bank Reconciliation Report" |
||||
|
context="{'default_journal_ids': [journal_id]}" |
||||
|
/> |
||||
|
</button> |
||||
|
</field> |
||||
|
</record> |
||||
|
</odoo> |
@ -0,0 +1,32 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8" ?> |
||||
|
<!-- |
||||
|
Copyright 2018-2020 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> |
||||
|
<!-- Accounting Dashboard --> |
||||
|
<record id="account_journal_dashboard_kanban_view" model="ir.ui.view"> |
||||
|
<field |
||||
|
name="name" |
||||
|
>bank_reconciliation_summarry.account_journal_dashboard</field> |
||||
|
<field name="model">account.journal</field> |
||||
|
<field name="inherit_id" ref="account.account_journal_dashboard_kanban_view" /> |
||||
|
<field name="arch" type="xml"> |
||||
|
<xpath expr="//div[@name='bank_cash_commands']/.." position="after"> |
||||
|
<div class="col-4 o_kanban_card_manage_section o_kanban_manage_new"> |
||||
|
<div class="o_kanban_card_manage_title"> |
||||
|
<span>Report</span> |
||||
|
</div> |
||||
|
<div name="bank_reconciliation_report"> |
||||
|
<a |
||||
|
name="%(bank_reconciliation_report_wizard_action)d" |
||||
|
type="action" |
||||
|
context="{'default_journal_ids': [active_id]}" |
||||
|
>Bank Reconciliation</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</xpath> |
||||
|
</field> |
||||
|
</record> |
||||
|
</odoo> |
@ -0,0 +1,18 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8" ?> |
||||
|
<!-- |
||||
|
Copyright 2017-2020 Akretion France (http://www.akretion.com/) |
||||
|
Alexis de Lattre <alexis.delattre@akretion.com> |
||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
||||
|
--> |
||||
|
<odoo> |
||||
|
<record id="view_move_line_form" model="ir.ui.view"> |
||||
|
<field name="name">bank_rec_summary.account_move_line_form</field> |
||||
|
<field name="model">account.move.line</field> |
||||
|
<field name="inherit_id" ref="account.view_move_line_form" /> |
||||
|
<field name="arch" type="xml"> |
||||
|
<field name="statement_id" position="after"> |
||||
|
<field name="statement_line_date" /> |
||||
|
</field> |
||||
|
</field> |
||||
|
</record> |
||||
|
</odoo> |
@ -0,0 +1 @@ |
|||||
|
from . import bank_reconciliation_report_wizard |
@ -0,0 +1,37 @@ |
|||||
|
# Copyright 2017-2020 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 BankReconciliationReportWizard(models.TransientModel): |
||||
|
_name = "bank.reconciliation.report.wizard" |
||||
|
_description = "Bank Reconciliation Report Wizard" |
||||
|
|
||||
|
@api.model |
||||
|
def _default_journal_ids(self): |
||||
|
journals = self.env["account.journal"].search( |
||||
|
[ |
||||
|
("type", "=", "bank"), |
||||
|
("bank_account_id", "!=", False), |
||||
|
("company_id", "=", self.env.user.company_id.id), |
||||
|
] |
||||
|
) |
||||
|
return journals |
||||
|
|
||||
|
date = fields.Date(required=True, default=fields.Date.context_today) |
||||
|
journal_ids = fields.Many2many( |
||||
|
"account.journal", |
||||
|
string="Bank Journals", |
||||
|
domain=[("type", "=", "bank")], |
||||
|
required=True, |
||||
|
default=lambda self: self._default_journal_ids(), |
||||
|
) |
||||
|
|
||||
|
def open_xlsx(self): |
||||
|
report = self.env.ref( |
||||
|
"account_bank_reconciliation_summary_xlsx." "bank_reconciliation_xlsx" |
||||
|
) |
||||
|
action = report.report_action(self) |
||||
|
return action |
@ -0,0 +1,42 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8" ?> |
||||
|
<!-- |
||||
|
Copyright 2017-2020 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="bank_reconciliation_report_wizard_form" model="ir.ui.view"> |
||||
|
<field name="name">bank.reconciliation.report.wizard.form</field> |
||||
|
<field name="model">bank.reconciliation.report.wizard</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form string="Bank Reconciliation Report"> |
||||
|
<group name="main"> |
||||
|
<field name="date" /> |
||||
|
<field name="journal_ids" widget="many2many_tags" /> |
||||
|
</group> |
||||
|
<footer> |
||||
|
<button |
||||
|
name="open_xlsx" |
||||
|
string="Export XLSX" |
||||
|
type="object" |
||||
|
class="btn-primary" |
||||
|
/> |
||||
|
<button special="cancel" string="Cancel" /> |
||||
|
</footer> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
<record id="bank_reconciliation_report_wizard_action" model="ir.actions.act_window"> |
||||
|
<field name="name">Bank Reconciliation</field> |
||||
|
<field name="res_model">bank.reconciliation.report.wizard</field> |
||||
|
<field name="view_mode">form</field> |
||||
|
<field name="target">new</field> |
||||
|
</record> |
||||
|
<menuitem |
||||
|
id="bank_reconciliation_report_wizard_menu" |
||||
|
action="bank_reconciliation_report_wizard_action" |
||||
|
parent="account_financial_report.menu_oca_reports" |
||||
|
groups="account.group_account_manager,account.group_account_user" |
||||
|
sequence="100" |
||||
|
/> |
||||
|
</odoo> |
@ -0,0 +1 @@ |
|||||
|
../../../../account_bank_reconciliation_summary_xlsx |
@ -0,0 +1,6 @@ |
|||||
|
import setuptools |
||||
|
|
||||
|
setuptools.setup( |
||||
|
setup_requires=['setuptools-odoo'], |
||||
|
odoo_addon=True, |
||||
|
) |
Write
Preview
Loading…
Cancel
Save
Reference in new issue