jbeficent
9 years ago
15 changed files with 693 additions and 0 deletions
-
141bank_statement_reconciliation_summary/README.rst
-
8bank_statement_reconciliation_summary/__init__.py
-
21bank_statement_reconciliation_summary/__openerp__.py
-
6bank_statement_reconciliation_summary/models/__init__.py
-
12bank_statement_reconciliation_summary/models/account_account.py
-
23bank_statement_reconciliation_summary/models/account_bank_statement.py
-
5bank_statement_reconciliation_summary/report/__init__.py
-
33bank_statement_reconciliation_summary/report/report.xml
-
63bank_statement_reconciliation_summary/report/summary_report.py
-
202bank_statement_reconciliation_summary/report/summary_report.xml
-
17bank_statement_reconciliation_summary/view/account_account_view.xml
-
34bank_statement_reconciliation_summary/view/account_bank_statement.xml
-
5bank_statement_reconciliation_summary/wizard/__init__.py
-
93bank_statement_reconciliation_summary/wizard/account_bank_unreconcile.py
-
30bank_statement_reconciliation_summary/wizard/account_bank_unreconcile_view.xml
@ -0,0 +1,141 @@ |
|||
.. 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 Statement Reconciliation Summary |
|||
===================================== |
|||
|
|||
The Bank Reconciliation Summary shows how your actual bank statement balance |
|||
and the balance of the bank account in Odoo match, after taking into account |
|||
any unreconciled items. |
|||
|
|||
This report is useful if your bank account's statement balance and balance |
|||
in Odoo do not match, and you need to check for duplicate or manually created |
|||
transactions that might cause the discrepancy. |
|||
|
|||
This report was created, inspired by Xero’s bank reconciliation summary, |
|||
https://help.xero.com/Report_BankRec, and from a basic explanation of the |
|||
bank statement reconciliation summary: |
|||
http://www.accountingcoach.com/bank-reconciliation/explanation. |
|||
|
|||
|
|||
Usage |
|||
===== |
|||
|
|||
Define Accounts |
|||
--------------- |
|||
There are three accounts associated to a bank account: |
|||
* Bank account view |
|||
* Bank Account. Matches the statement |
|||
* Bank Clearing Account. Is used for uncleared payments and receipts. The |
|||
Bank Clearing Account is a reconcilable account. |
|||
|
|||
In the definition of the bank account that is used to match with the bank |
|||
statement, define what will be the GL account used to record the uncleared |
|||
payments and receipts. |
|||
|
|||
Define Account Journals |
|||
----------------------- |
|||
Create the following journals: |
|||
* Journal for Bank Statement reconciliation |
|||
* Journal to enter Payments and Receipts that have not yet cleared to the bank |
|||
|
|||
|
|||
Enter payments and receipts |
|||
--------------------------- |
|||
Every time an invoice is paid, use the Journal to enter Payments and Receipts. |
|||
It will generate: |
|||
Dr. Accounts Payable |
|||
Cr. Bank Clearing Account |
|||
|
|||
Create a bank statement |
|||
----------------------- |
|||
Create a bank statement and select the Journal defined for bank statement |
|||
reconciliation. |
|||
|
|||
If you do not use a tool to integrate automatically the bank statement feed |
|||
into Odoo, you can press press the button “Import Payments and Receipts” |
|||
in order to add to the statements the payments and receipts that have been |
|||
generated, but that have not yet cleared the bank. |
|||
|
|||
Use the “Reconcile” button to reconcile the entries in the bank statement |
|||
with the payments and receipts that have already cleared the bank. |
|||
|
|||
If you chose to import the statement lines from uncleared payments and |
|||
receipts, this will be the moment where you will visually compare with the |
|||
online/paper bank statement, and reconcile the items that truly cleared the |
|||
bank. |
|||
|
|||
The Odoo Bank Reconciliation Wizard will be used by the user to specifically |
|||
create the Bank Account entries by linking the Bank Statement lines with the |
|||
Bank Clearing Account items. |
|||
|
|||
Dr. Bank Clearing Account |
|||
Cr. Bank Account |
|||
|
|||
Once you have completed this process, some statement lines may be left |
|||
unreconciled (because they were truly not present in the online/physical |
|||
statement). In that case you can press the button “Remove Unreconciled”. |
|||
|
|||
Print bank statement reconciliation summary |
|||
------------------------------------------- |
|||
It will report on the current balance of the Bank Account, and will show the |
|||
unreconciled entries of the Bank Clearing Account, classifying the them |
|||
between Outstanding Payments (that is, credits in the Bank Clearing Account) |
|||
and Outstanding Receipts (that is, debits in the Bank Clearing Account). |
|||
|
|||
The application will also show the bank statement lines that have not yet |
|||
been reconciled yet, if any exists. |
|||
|
|||
Once the user has fully processed the reconciliation with the bank clearing |
|||
account, all the entries in this bank clearing account should be reconciled, |
|||
and the bank account (used to match with the Statement) will truly |
|||
reflect the same information as the bank statement balance. |
|||
|
|||
From a bank account perspective, the total amount held in the bank is the |
|||
sum of the balances of the bank clearing account (which should normally |
|||
show undeposited checks, for example) and the bank account used to match |
|||
with the statement. |
|||
|
|||
|
|||
.. 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/8.0 |
|||
|
|||
|
|||
Known issues / Roadmap |
|||
====================== |
|||
|
|||
* For Odoo v9 there will be no need to use the clearing account. |
|||
|
|||
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 |
|||
`here <https://github.com/OCA/account-financial-reporting/issues/new?body=module:%20account_tax_report_no_zeroes%0Aversion:%208.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_. |
|||
|
|||
Credits |
|||
======= |
|||
|
|||
Contributors |
|||
------------ |
|||
|
|||
* Jordi Ballester Alomar <contact@eficent.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 http://odoo-community.org. |
@ -0,0 +1,8 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Eficent Business and IT Consulting Services S.L. |
|||
# © 2016 Serpent Consulting Services Pvt. Ltd. |
|||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
|||
|
|||
import models |
|||
import report |
|||
import wizard |
@ -0,0 +1,21 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Eficent Business and IT Consulting Services S.L. |
|||
# © 2016 Serpent Consulting Services Pvt. Ltd. |
|||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
|||
{ |
|||
'name': 'Bank Statement Reconciliation Summary', |
|||
'category': 'Account', |
|||
'summary': 'Bank Statement Reconciliation Summary', |
|||
'version': '8.0.1.0.0', |
|||
'author': 'Eficent Business and IT Consulting Services S.L., ' |
|||
'Serpent Consulting Services Pvt. Ltd.', |
|||
'depends': ['account'], |
|||
'data': [ |
|||
'report/summary_report.xml', |
|||
'report/report.xml', |
|||
'view/account_account_view.xml', |
|||
'wizard/account_bank_unreconcile_view.xml', |
|||
'view/account_bank_statement.xml', |
|||
], |
|||
'installable': True, |
|||
} |
@ -0,0 +1,6 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Eficent Business and IT Consulting Services S.L. |
|||
# © 2016 Serpent Consulting Services Pvt. Ltd. |
|||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
|||
from . import account_account |
|||
from . import account_bank_statement |
@ -0,0 +1,12 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Eficent Business and IT Consulting Services S.L. |
|||
# © 2016 Serpent Consulting Services Pvt. Ltd. |
|||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
|||
from openerp import models, fields |
|||
|
|||
|
|||
class AccountAccount(models.Model): |
|||
_inherit = 'account.account' |
|||
|
|||
clearing_account_id = fields.Many2one('account.account', |
|||
'Clearing Account') |
@ -0,0 +1,23 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Eficent Business and IT Consulting Services S.L. |
|||
# © 2016 Serpent Consulting Services Pvt. Ltd. |
|||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
|||
from openerp import api, fields, models |
|||
|
|||
|
|||
class AccountBankStatement(models.Model): |
|||
_inherit = 'account.bank.statement' |
|||
|
|||
@api.multi |
|||
def delete_unreconciled(self): |
|||
self.ensure_one() |
|||
for line in self.line_ids: |
|||
if not line.journal_entry_id: |
|||
line.unlink() |
|||
|
|||
|
|||
class AccountBankStatementLine(models.Model): |
|||
_inherit = 'account.bank.statement.line' |
|||
|
|||
clearing_move_line_id = fields.Many2one('account.move.line', |
|||
'Clearing Move Line') |
@ -0,0 +1,5 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Eficent Business and IT Consulting Services S.L. |
|||
# © 2016 Serpent Consulting Services Pvt. Ltd. |
|||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
|||
import summary_report |
@ -0,0 +1,33 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<openerp> |
|||
<data> |
|||
|
|||
<record id="summary_report_paperformat" model="report.paperformat"> |
|||
<field name="name">Bank Statement Reconcillation Summary Paperformat</field> |
|||
<field name="default" eval="True" /> |
|||
<field name="format">A4</field> |
|||
<field name="page_height">0</field> |
|||
<field name="page_width">0</field> |
|||
<field name="orientation">Portrait</field> |
|||
<field name="margin_top">0</field> |
|||
<field name="margin_bottom">0</field> |
|||
<field name="margin_left">5</field> |
|||
<field name="margin_right">5</field> |
|||
<field name="header_line" eval="False" /> |
|||
<field name="header_spacing">0</field> |
|||
<field name="dpi">90</field> |
|||
</record> |
|||
|
|||
<report id="report_bank_stmt_reconcile_summary" |
|||
string="Bank Statement Reconcillation Summary" |
|||
model="account.bank.statement" |
|||
report_type="qweb-pdf" |
|||
file="bank_statement_reconciliation_summary.summary_report" |
|||
name="bank_statement_reconciliation_summary.summary_report"/> |
|||
|
|||
<record id="report_bank_stmt_reconcile_summary" model="ir.actions.report.xml"> |
|||
<field name="paperformat_id" ref="summary_report_paperformat"/> |
|||
</record> |
|||
|
|||
</data> |
|||
</openerp> |
@ -0,0 +1,63 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Eficent Business and IT Consulting Services S.L. |
|||
# © 2016 Serpent Consulting Services Pvt. Ltd. |
|||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
|||
import time |
|||
from openerp import api, models |
|||
|
|||
|
|||
class SummaryReport(models.AbstractModel): |
|||
_name = 'report.bank_statement_reconciliation_summary.summary_report' |
|||
|
|||
@api.model |
|||
def _plus_outstanding_payments(self, journal_record): |
|||
account_id = journal_record.default_credit_account_id and\ |
|||
journal_record.default_credit_account_id.clearing_account_id and\ |
|||
journal_record.default_credit_account_id.clearing_account_id.id |
|||
account_move_line_records = self.env['account.move.line'].search([ |
|||
('account_id', '=', account_id), |
|||
('reconcile_id', '=', False), |
|||
('account_id.reconcile', '=', True), |
|||
('credit', '>', 0.00) |
|||
], order='date') |
|||
return account_move_line_records |
|||
|
|||
@api.model |
|||
def _less_outstanding_receipts(self, journal_record): |
|||
account_id = journal_record.default_credit_account_id and\ |
|||
journal_record.default_credit_account_id.clearing_account_id and\ |
|||
journal_record.default_credit_account_id.clearing_account_id.id |
|||
account_move_line_records = self.env['account.move.line'].search([ |
|||
('account_id', '=', account_id), |
|||
('reconcile_id', '=', False), |
|||
('account_id.reconcile', '=', True), |
|||
('debit', '>', 0.00) |
|||
], order='date') |
|||
return account_move_line_records |
|||
|
|||
@api.model |
|||
def _plus_unreconciled_statement_lines(self, statement): |
|||
statement_lines = self.env['account.bank.statement.line'].browse() |
|||
for line in statement.line_ids: |
|||
if not line.journal_entry_id: |
|||
statement_lines += line |
|||
return statement_lines or False |
|||
|
|||
@api.multi |
|||
def render_html(self, data=None): |
|||
Report = self.env['report'] |
|||
report_name = 'bank_statement_reconciliation_summary.summary_report' |
|||
report = Report._get_report_from_name(report_name) |
|||
records = self.env['account.bank.statement'].browse(self.ids) |
|||
docargs = { |
|||
'doc_ids': self.ids, |
|||
'doc_model': report.model, |
|||
'data': data, |
|||
'docs': records, |
|||
'time': time, |
|||
'plus_outstanding_payments': self._plus_outstanding_payments, |
|||
'less_outstanding_receipts': self._less_outstanding_receipts, |
|||
'plus_unreconciled_statement_lines': |
|||
self._plus_unreconciled_statement_lines |
|||
} |
|||
return self.env['report'].render(report_name, docargs) |
@ -0,0 +1,202 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<openerp> |
|||
<data> |
|||
|
|||
<template id="summary_report"> |
|||
<link rel='stylesheet' href='/web/static/lib/bootstrap/css/bootstrap.css'/> |
|||
<style> |
|||
.lines { |
|||
border-top: solid; |
|||
border-top-width: 2px; |
|||
border-top-color: #edf3f8; |
|||
color: #5993c0; |
|||
} |
|||
</style> |
|||
<t t-call="report.html_container"> |
|||
<div class="page"> |
|||
<div class='row' style='background-color: #e6ffe6;box-shadow: 0px 2px 2px #cccccc;'> |
|||
<div style='padding:5px;'> |
|||
<div class='col-xs-3'><h4>Date</h4></div> |
|||
<div class='col-xs-3'><h4>Description</h4></div> |
|||
<div class='col-xs-3'><h4>Reference</h4></div> |
|||
<div class='col-xs-3 text-right'><h4>Amount</h4></div> |
|||
</div> |
|||
</div> |
|||
<t t-foreach="docs" t-as="o"> |
|||
<div class='row mt16'> |
|||
<div class='col-xs-12'><h5><b><t t-esc='o.journal_id.name'/> - Balance in Odoo</b></h5> |
|||
</div> |
|||
</div> |
|||
<t t-set='total_bank_odoo' t-value='0.00'/> |
|||
<div class='row lines'> |
|||
<div class='col-xs-12'> |
|||
<div class='col-xs-3'><t t-esc='o.date'/></div> |
|||
<div class='col-xs-3'><t |
|||
t-esc='o.journal_id.default_credit_account_id.code'/>-<t t-esc='o.journal_id.default_credit_account_id.name'/></div> |
|||
<div class='col-xs-3'/> |
|||
<t t-set='total_bank_odoo' |
|||
t-value='o.journal_id.default_credit_account_id.balance'/> |
|||
<div class='col-xs-3 text-right'><t |
|||
t-esc='total_bank_odoo' |
|||
t-esc-options='{"widget": "monetary", "display_currency": "o.currency"}'/></div> |
|||
</div> |
|||
</div> |
|||
<t t-set='total_clearing_odoo' t-value='0.00'/> |
|||
<div class='row lines'> |
|||
<div class='col-xs-12'> |
|||
<div class='col-xs-3'><t t-esc='o.date'/></div> |
|||
<div class='col-xs-3'> |
|||
<t t-esc='o.journal_id.default_credit_account_id.clearing_account_id.code'/>-<t t-esc='o.journal_id.default_credit_account_id.clearing_account_id.name'/></div> |
|||
<div class='col-xs-3'/> |
|||
<t t-set='total_clearing_odoo' |
|||
t-value='o.journal_id.default_credit_account_id.clearing_account_id.balance'/> |
|||
<div class='col-xs-3 text-right'> |
|||
<t t-esc='total_clearing_odoo' |
|||
t-esc-options='{"widget": "monetary", "display_currency": "o.currency"}'/></div> |
|||
</div> |
|||
</div> |
|||
<t t-set='total_bank_clearing_odoo' t-value='0.00'/> |
|||
<div class='row' style='border-top: groove;'> |
|||
<div class='col-xs-12'> |
|||
<div class='col-xs-6'><h5><b>Total Balance in Odoo</b></h5></div> |
|||
<div class='col-xs-3'/> |
|||
<t t-set='total_bank_clearing_odoo' |
|||
t-value='o.journal_id.default_credit_account_id.balance + o.journal_id.default_credit_account_id.clearing_account_id.balance'/> |
|||
<div class='col-xs-3 text-right'> |
|||
<h5><b> |
|||
<t t-esc='total_bank_clearing_odoo' |
|||
t-esc-options='{"widget": "monetary", "display_currency": "o.currency"}'/> |
|||
</b></h5></div> |
|||
</div> |
|||
</div> |
|||
<t t-set='total_payment' t-value='0.00'/> |
|||
<t t-if='plus_outstanding_payments(o.journal_id)'> |
|||
<div class='row mt16'> |
|||
<div class='col-xs-12'><h5><b>Plus Outstanding Payments</b></h5></div> |
|||
</div> |
|||
<t t-foreach='plus_outstanding_payments(o.journal_id)' t-as='payment'> |
|||
<div class='row lines'> |
|||
<div class='col-xs-12'> |
|||
<div class='col-xs-3'><t t-esc='payment.date'/></div> |
|||
<div class='col-xs-3'><t t-esc='payment.name'/></div> |
|||
<div class='col-xs-3'><t t-esc='payment.ref'/></div> |
|||
<div class='col-xs-3 text-right'><t t-esc='payment.credit'/></div> |
|||
<t t-set='total_payment' t-value='total_payment + payment.credit' |
|||
t-esc-options='{"widget": "monetary", "display_currency": "o.currency"}'/> |
|||
</div> |
|||
</div> |
|||
</t> |
|||
|
|||
<div class='row' style='border-top: groove;'> |
|||
<div class='col-xs-12'> |
|||
<div class='col-xs-6'><h5><b>Total Outstanding Payments</b></h5></div> |
|||
<div class='col-xs-3 col-xs-offset-3 text-right'><h5><b><t t-esc='total_payment' |
|||
t-esc-options='{"widget": "monetary", "display_currency": "o.currency"}'/></b></h5></div> |
|||
</div> |
|||
</div> |
|||
</t> |
|||
<t t-set='total_receipt' t-value='0.00'/> |
|||
<t t-if='less_outstanding_receipts(o.journal_id)'> |
|||
<div class='row'> |
|||
<div class='col-xs-12'><h5><b>Less Outstanding Receipts</b></h5></div> |
|||
</div> |
|||
<t t-foreach='less_outstanding_receipts(o.journal_id)' t-as='receipt'> |
|||
<div class='row lines'> |
|||
<div class='col-xs-12'> |
|||
<div class='col-xs-3'><t t-esc='receipt.date'/></div> |
|||
<div class='col-xs-3'><t t-esc='receipt.name'/></div> |
|||
<div class='col-xs-3'><t t-esc='receipt.ref'/></div> |
|||
<div class='col-xs-3 text-right'><t t-esc='receipt.debit'/></div> |
|||
<t t-set='total_receipt' t-value='total_receipt + receipt.debit' |
|||
t-esc-options='{"widget": "monetary", "display_currency": "o.currency"}'/> |
|||
</div> |
|||
</div> |
|||
</t> |
|||
<div class='row' style='border-top: groove;'> |
|||
<div class='col-xs-12'> |
|||
<div class='col-xs-6'><h5><b>Total Outstanding Receipts</b></h5></div> |
|||
<div class='col-xs-3 col-xs-offset-3 text-right'><h5><b><t t-esc='total_receipt' |
|||
t-esc-options='{"widget": "monetary", "display_currency": "o.currency"}'/></b></h5></div> |
|||
</div> |
|||
</div> |
|||
</t> |
|||
<t t-set='bank_stmt_line_total' t-value='0.00'/> |
|||
<t t-if='plus_unreconciled_statement_lines(o)'> |
|||
<div class='row'> |
|||
<div class='col-xs-12'><h5><b>Plus Un-Reconciled Bank Statement Lines</b></h5></div> |
|||
</div> |
|||
<t t-foreach='plus_unreconciled_statement_lines(o)' t-as='line'> |
|||
<div class='row lines'> |
|||
<div class='col-xs-12'> |
|||
<div class='col-xs-3'><t t-esc='line.date'/></div> |
|||
<div class='col-xs-3'><t t-esc='line.name'/></div> |
|||
<div class='col-xs-3'><t t-esc='line.ref'/></div> |
|||
<div class='col-xs-3 text-right'><t t-esc='line.amount' |
|||
t-esc-options='{"widget": "monetary", "display_currency": "o.currency"}'/></div> |
|||
<t t-set='bank_stmt_line_total' t-value='bank_stmt_line_total + line.amount' |
|||
t-esc-options='{"widget": "monetary", "display_currency": "o.currency"}'/> |
|||
</div> |
|||
</div> |
|||
</t> |
|||
<div class='row' style='border-top: groove;'> |
|||
<div class='col-xs-12'> |
|||
<div class='col-xs-6'><h5><b>Total Un-Reconciled Bank Statement Lines</b></h5></div> |
|||
<div class='col-xs-3 col-xs-offset-3 text-right'><h5><b><t t-esc='bank_stmt_line_total' |
|||
t-esc-options='{"widget": "monetary", "display_currency": "o.currency"}'/></b></h5></div> |
|||
</div> |
|||
</div> |
|||
</t> |
|||
<t t-set='computed_statement_balance' t-value='total_bank_clearing_odoo + total_payment - total_receipt + bank_stmt_line_total'/> |
|||
<t t-if='(o.balance_end_real - computed_statement_balance) == 0.0'> |
|||
<div class='row mt8' style='border-top: solid;border-bottom: solid;'> |
|||
<div class='col-xs-3'><t t-esc='o.date'/></div> |
|||
<div class='col-xs-3'><h5><b>Statement Balance</b></h5></div> |
|||
<div class='col-xs-3'/> |
|||
<div class='col-xs-3 text-right'> |
|||
<t t-esc='computed_statement_balance' |
|||
t-esc-options='{"widget": "monetary", "display_currency": "o.currency"}'/></div> |
|||
</div> |
|||
</t> |
|||
<t t-if='(o.balance_end_real - computed_statement_balance) != 0.0'> |
|||
<div class='row mt16'> |
|||
<div class='col-xs-12'><h5><b>Statement Balance</b></h5> |
|||
</div> |
|||
</div> |
|||
<div class='row lines'> |
|||
<div class='col-xs-12'> |
|||
<div class='col-xs-3'><t t-esc='o.date'/></div> |
|||
<div class='col-xs-3'>Computed</div> |
|||
<div class='col-xs-3'/> |
|||
<div class='col-xs-3 text-right'> |
|||
<t t-esc='computed_statement_balance' |
|||
t-esc-options='{"widget": "monetary", "display_currency": "o.currency"}'/></div> |
|||
</div> |
|||
</div> |
|||
<div class='row lines'> |
|||
<div class='col-xs-12'> |
|||
<div class='col-xs-3'><t t-esc='o.date'/></div> |
|||
<div class='col-xs-3'>Actual</div> |
|||
<div class='col-xs-3'/> |
|||
<div class='col-xs-3 text-right'> |
|||
<t t-esc='o.balance_end_real' |
|||
t-esc-options='{"widget": "monetary", "display_currency": "o.currency"}'/></div> |
|||
</div> |
|||
</div> |
|||
<div class='row lines'> |
|||
<div class='col-xs-12'> |
|||
<div class='col-xs-3'><t t-esc='o.date'/></div> |
|||
<div class='col-xs-3'>Unencoded Statement Amount</div> |
|||
<div class='col-xs-3'/> |
|||
<div class='col-xs-3 text-right'> |
|||
<t t-esc='o.balance_end_real - computed_statement_balance' |
|||
t-esc-options='{"widget": "monetary", "display_currency": "o.currency"}'/></div> |
|||
</div> |
|||
</div> |
|||
</t> |
|||
</t> |
|||
</div> |
|||
</t> |
|||
</template> |
|||
|
|||
</data> |
|||
</openerp> |
@ -0,0 +1,17 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<openerp> |
|||
<data> |
|||
|
|||
<record id="view_account_form_inherit" model="ir.ui.view"> |
|||
<field name="name">inherit.account.form</field> |
|||
<field name="model">account.account</field> |
|||
<field name="inherit_id" ref="account.view_account_form"/> |
|||
<field name="arch" type="xml"> |
|||
<field name='active' position="after"> |
|||
<field name="clearing_account_id"/> |
|||
</field> |
|||
</field> |
|||
</record> |
|||
|
|||
</data> |
|||
</openerp> |
@ -0,0 +1,34 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<openerp> |
|||
<data> |
|||
|
|||
<record id="unreconcile_bank_statement_form_view" model="ir.ui.view"> |
|||
<field name="name">account.bank.statement.form.view</field> |
|||
<field name="model">account.bank.statement</field> |
|||
<field name="inherit_id" ref="account.view_bank_statement_form"/> |
|||
<field name="arch" type="xml"> |
|||
<button string="Import Invoice" position="before"> |
|||
<button type="action" |
|||
class="oe_inline oe_stat_button" |
|||
id="wiz_unreconcile" |
|||
icon="fa-pencil-square-o" |
|||
name="%(bank_statement_reconcile_action)d" |
|||
attrs="{'invisible': [('state', '!=', 'draft')]}" |
|||
style="width: 180px !important;"> |
|||
<div>Import<br/>Payments and Receipts</div> |
|||
</button> |
|||
<button type="object" |
|||
class="oe_inline oe_stat_button" |
|||
id="wiz_unreconcile" |
|||
icon="fa-strikethrough" |
|||
name="delete_unreconciled" |
|||
attrs="{'invisible': [('state', '=', 'confirm')]}" |
|||
style="width: 180px !important;"> |
|||
<div>Remove Unreconciled</div> |
|||
</button> |
|||
</button> |
|||
</field> |
|||
</record> |
|||
|
|||
</data> |
|||
</openerp> |
@ -0,0 +1,5 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Eficent Business and IT Consulting Services S.L. |
|||
# © 2016 Serpent Consulting Services Pvt. Ltd. |
|||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
|||
import account_bank_unreconcile |
@ -0,0 +1,93 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Eficent Business and IT Consulting Services S.L. |
|||
# © 2016 Serpent Consulting Services Pvt. Ltd. |
|||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
|||
from openerp import api, fields, models |
|||
from openerp.tools import misc |
|||
from openerp.exceptions import Warning |
|||
from openerp.tools.translate import _ |
|||
|
|||
|
|||
class SummaryReport(models.TransientModel): |
|||
_name = 'wiz.bank.unreconcile' |
|||
|
|||
@api.model |
|||
def _get_unreconcile_entries(self): |
|||
cr, uid, context = self.env.args |
|||
context = dict(context) |
|||
statement_line_obj = self.env['account.bank.statement.line'] |
|||
move_line_obj = self.env['account.move.line'] |
|||
bank_id = context.get('active_id') |
|||
self.env.args = cr, uid, misc.frozendict(context) |
|||
bank = self.env['account.bank.statement'].browse(bank_id) |
|||
clearing_account_id = bank.journal_id and\ |
|||
bank.journal_id.default_credit_account_id and\ |
|||
bank.journal_id.default_credit_account_id.clearing_account_id and\ |
|||
bank.journal_id.default_credit_account_id.clearing_account_id.id |
|||
if clearing_account_id: |
|||
to_add_move_lines = move_line_obj.browse() |
|||
account_move_line_records = self.env['account.move.line'].search([ |
|||
('account_id', '=', clearing_account_id), |
|||
('account_id.reconcile', '=', True), |
|||
'|', |
|||
('reconcile_id', '=', False), |
|||
('reconcile_partial_id', '!=', False) |
|||
], order='date') |
|||
statements = statement_line_obj.search( |
|||
[('statement_id', '=', bank_id), |
|||
('clearing_move_line_id', 'in', |
|||
account_move_line_records.ids)]) |
|||
in_statement_clearing_lines = [] |
|||
for statement in statements: |
|||
in_statement_clearing_lines += \ |
|||
statement.clearing_move_line_id |
|||
for move_line in account_move_line_records: |
|||
if move_line not in in_statement_clearing_lines: |
|||
to_add_move_lines += move_line |
|||
else: |
|||
raise Warning(_("Create an Clearing Account to get " |
|||
"the Unreconciled Journal Items.")) |
|||
return to_add_move_lines |
|||
|
|||
line_ids = fields.Many2many('account.move.line', |
|||
'wiz_unreconciles_move_line_rel', |
|||
'reconciles_id', 'accounts_id', |
|||
'Journal Items to Reconcile', |
|||
default=_get_unreconcile_entries) |
|||
|
|||
@api.multi |
|||
def process_wiz(self): |
|||
context = dict(self._context) |
|||
bank_stmt_obj = self.env['account.bank.statement'] |
|||
currency_obj = self.env['res.currency'] |
|||
statement = bank_stmt_obj.browse(context.get('active_ids')) |
|||
lines = [] |
|||
for line in self.line_ids: |
|||
currency_obj = currency_obj.with_context(date=statement.date) |
|||
amount = 0.0 |
|||
if line.debit > 0: |
|||
amount = line.debit |
|||
elif line.credit > 0: |
|||
amount = -line.credit |
|||
if line.amount_currency: |
|||
if line.company_id.currency_id.id != statement.currency.id: |
|||
amount = line.currency_id.with_context( |
|||
date=statement.date).compute(line.amount_currency, |
|||
statement.currency) |
|||
elif (line.currency_id and |
|||
line.currency_id.id != statement.currency.id): |
|||
amount = line.currency_id.with_context( |
|||
date=statement.date).compute(amount, |
|||
statement.currency) |
|||
lines.append((0, 0, { |
|||
'name': line.name or '?', |
|||
'ref': line.ref, |
|||
'partner_id': line.partner_id.id, |
|||
'amount': amount, |
|||
'date': line.date, |
|||
'amount_currency': line.amount_currency, |
|||
'currency_id': line.currency_id.id, |
|||
'clearing_move_line_id': line.id, |
|||
})) |
|||
statement.write({'line_ids': lines}) |
|||
return True |
@ -0,0 +1,30 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<openerp> |
|||
<data> |
|||
|
|||
<record id="account_bank_reconcile_form_view" model="ir.ui.view"> |
|||
<field name="name">wiz.bank.unreconcile.form</field> |
|||
<field name="model">wiz.bank.unreconcile</field> |
|||
<field name="arch" type="xml"> |
|||
<form string="Import"> |
|||
<field name="line_ids" |
|||
context="{'currency':True}"/> |
|||
<footer> |
|||
<button name="process_wiz" string="Import" type="object" class="oe_highlight"/> |
|||
or |
|||
<button string="Cancel" class="oe_link" special="cancel"/> |
|||
</footer> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
|
|||
<act_window name="Unreconcile Journal Items" |
|||
res_model="wiz.bank.unreconcile" |
|||
src_model="account.bank.statement" |
|||
view_mode="form" |
|||
view_type="form" |
|||
target="new" |
|||
id="bank_statement_reconcile_action"/> |
|||
|
|||
</data> |
|||
</openerp> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue