Browse Source
[DEL] remove account_financial_report_webkit from the 9.0 branch
[DEL] remove account_financial_report_webkit from the 9.0 branch
superseded by account_financial_report_qwebpull/230/head
Stéphane Bidoul (ACSONE)
8 years ago
93 changed files with 0 additions and 23827 deletions
-
23account_financial_report_webkit/__init__.py
-
207account_financial_report_webkit/__openerp__.py
-
47account_financial_report_webkit/account.py
-
77account_financial_report_webkit/account_move_line.py
-
17account_financial_report_webkit/account_view.xml
-
409account_financial_report_webkit/data/financial_webkit_header.xml
-
1523account_financial_report_webkit/i18n/account_financial_report_webkit.pot
-
1327account_financial_report_webkit/i18n/de.po
-
1327account_financial_report_webkit/i18n/en_US.po
-
1374account_financial_report_webkit/i18n/es.po
-
1587account_financial_report_webkit/i18n/fr.po
-
1373account_financial_report_webkit/i18n/it.po
-
1535account_financial_report_webkit/i18n/lt.po
-
1327account_financial_report_webkit/i18n/nl.po
-
BINaccount_financial_report_webkit/images/ledger.png
-
41account_financial_report_webkit/migrations/7.0.1.0.2/post-migration.py
-
12account_financial_report_webkit/report/__init__.py
-
429account_financial_report_webkit/report/aged_partner_balance.py
-
355account_financial_report_webkit/report/common_balance_reports.py
-
359account_financial_report_webkit/report/common_partner_balance_reports.py
-
378account_financial_report_webkit/report/common_partner_reports.py
-
600account_financial_report_webkit/report/common_reports.py
-
243account_financial_report_webkit/report/general_ledger.py
-
268account_financial_report_webkit/report/open_invoices.py
-
101account_financial_report_webkit/report/partner_balance.py
-
218account_financial_report_webkit/report/partners_ledger.py
-
168account_financial_report_webkit/report/print_journal.py
-
158account_financial_report_webkit/report/report.xml
-
243account_financial_report_webkit/report/templates/account_report_general_ledger.mako
-
85account_financial_report_webkit/report/templates/account_report_open_invoices.mako
-
291account_financial_report_webkit/report/templates/account_report_partner_balance.mako
-
290account_financial_report_webkit/report/templates/account_report_partners_ledger.mako
-
170account_financial_report_webkit/report/templates/account_report_print_journal.mako
-
211account_financial_report_webkit/report/templates/account_report_profit_loss.mako
-
218account_financial_report_webkit/report/templates/account_report_trial_balance.mako
-
155account_financial_report_webkit/report/templates/aged_trial_webkit.mako
-
173account_financial_report_webkit/report/templates/grouped_by_curr_open_invoices_inclusion.mako.html
-
183account_financial_report_webkit/report/templates/open_invoices_inclusion.mako.html
-
93account_financial_report_webkit/report/trial_balance.py
-
279account_financial_report_webkit/report/webkit_parser_header_fix.py
-
42account_financial_report_webkit/report_menus.xml
-
BINaccount_financial_report_webkit/static/description/icon.png
-
3account_financial_report_webkit/tests/account_move_line.yml
-
56account_financial_report_webkit/tests/aged_trial_balance.yml
-
65account_financial_report_webkit/tests/general_ledger.yml
-
60account_financial_report_webkit/tests/open_invoices.yml
-
67account_financial_report_webkit/tests/partner_balance.yml
-
60account_financial_report_webkit/tests/partner_ledger.yml
-
67account_financial_report_webkit/tests/trial_balance.yml
-
30account_financial_report_webkit/wizard/__init__.py
-
90account_financial_report_webkit/wizard/aged_partner_balance_wizard.py
-
75account_financial_report_webkit/wizard/aged_partner_balance_wizard.xml
-
408account_financial_report_webkit/wizard/balance_common.py
-
11account_financial_report_webkit/wizard/balance_common_view.xml
-
156account_financial_report_webkit/wizard/general_ledger_wizard.py
-
88account_financial_report_webkit/wizard/general_ledger_wizard_view.xml
-
148account_financial_report_webkit/wizard/open_invoices_wizard.py
-
75account_financial_report_webkit/wizard/open_invoices_wizard_view.xml
-
64account_financial_report_webkit/wizard/partner_balance_wizard.py
-
84account_financial_report_webkit/wizard/partner_balance_wizard_view.xml
-
140account_financial_report_webkit/wizard/partners_ledger_wizard.py
-
70account_financial_report_webkit/wizard/partners_ledger_wizard_view.xml
-
131account_financial_report_webkit/wizard/print_journal.py
-
89account_financial_report_webkit/wizard/print_journal_view.xml
-
39account_financial_report_webkit/wizard/trial_balance_wizard.py
-
76account_financial_report_webkit/wizard/trial_balance_wizard_view.xml
-
4account_financial_report_webkit/wizard/wizard.xml
-
29account_financial_report_webkit_xls/__init__.py
-
54account_financial_report_webkit_xls/__openerp__.py
-
27account_financial_report_webkit_xls/report/__init__.py
-
347account_financial_report_webkit_xls/report/general_ledger_xls.py
-
828account_financial_report_webkit_xls/report/open_invoices_xls.py
-
461account_financial_report_webkit_xls/report/partner_ledger_xls.py
-
432account_financial_report_webkit_xls/report/partners_balance_xls.py
-
324account_financial_report_webkit_xls/report/trial_balance_xls.py
-
BINaccount_financial_report_webkit_xls/static/description/icon.png
-
556account_financial_report_webkit_xls/static/description/icon.svg
-
65account_financial_report_webkit_xls/tests/general_ledger.yml
-
60account_financial_report_webkit_xls/tests/open_invoices.yml
-
67account_financial_report_webkit_xls/tests/partner_balance.yml
-
60account_financial_report_webkit_xls/tests/partner_ledger.yml
-
67account_financial_report_webkit_xls/tests/trial_balance.yml
-
27account_financial_report_webkit_xls/wizard/__init__.py
-
44account_financial_report_webkit_xls/wizard/general_ledger_wizard.py
-
26account_financial_report_webkit_xls/wizard/general_ledger_wizard_view.xml
-
44account_financial_report_webkit_xls/wizard/open_invoices_wizard.py
-
26account_financial_report_webkit_xls/wizard/open_invoices_wizard_view.xml
-
45account_financial_report_webkit_xls/wizard/partners_balance_wizard.py
-
26account_financial_report_webkit_xls/wizard/partners_balance_wizard_view.xml
-
44account_financial_report_webkit_xls/wizard/partners_ledger_wizard.py
-
26account_financial_report_webkit_xls/wizard/partners_ledger_wizard_view.xml
-
44account_financial_report_webkit_xls/wizard/trial_balance_wizard.py
-
26account_financial_report_webkit_xls/wizard/trial_balance_wizard_view.xml
@ -1,23 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Author: Nicolas Bessi. Copyright Camptocamp SA |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
from . import account |
|
||||
from . import wizard |
|
||||
from . import report |
|
||||
from . import account_move_line |
|
@ -1,207 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Authors: Nicolas Bessi, Guewen Baconnier |
|
||||
# Copyright Camptocamp SA 2011 |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
{ |
|
||||
'name': 'Financial Reports - Webkit', |
|
||||
'description': """ |
|
||||
Financial Reports - Webkit |
|
||||
========================== |
|
||||
|
|
||||
This module adds or replaces the following standard OpenERP financial reports: |
|
||||
- General ledger |
|
||||
- Trial Balance (simple or comparative view) |
|
||||
- Partner ledger |
|
||||
- Partner balance |
|
||||
- Open invoices report |
|
||||
- Aged Partner Balance |
|
||||
|
|
||||
Main improvements per report: |
|
||||
----------------------------- |
|
||||
|
|
||||
The General ledger: details of all entries posted in your books sorted by |
|
||||
account. |
|
||||
|
|
||||
* Filter by account is available in the wizard (no need to go to the |
|
||||
Chart of Accounts to do this anymore) or by View account (the report |
|
||||
will display all regular children accounts) i.e. you can select all |
|
||||
P&L accounts. |
|
||||
* The report only prints accounts with moves OR with a non |
|
||||
null balance. No more endless report with empty accounts (field: |
|
||||
display account is hidden) |
|
||||
* initial balance computation on the fly if no open entry posted |
|
||||
* Thanks to a new checkbox in the account form, you will have the |
|
||||
possibility to centralize any account you like. This means you do |
|
||||
not want to see all entries posted under the account ‘VAT on sales’; |
|
||||
you will only see aggregated amounts by periods. |
|
||||
* Counterpart account is displayed for each transaction (3 accounts max.) |
|
||||
to ease searching. |
|
||||
* Better ergonomy on the wizard: important information is displayed in |
|
||||
the top part, filters are in the middle, and options are in the |
|
||||
bottom or on a separate tab. There is more specific filtering on |
|
||||
separate tabs. No more unique wizard layout for all financial |
|
||||
reports (we have removed the journal tab for the GL report) |
|
||||
* improved report style |
|
||||
|
|
||||
The partner ledger: details of entries relative to payable & |
|
||||
receivable accounts posted in your books sorted by account and |
|
||||
partner. |
|
||||
|
|
||||
* Filter by partner now available |
|
||||
* Now you can see Accounts then Partner with subtotals for each |
|
||||
account allowing you to check you data with trial balance and |
|
||||
partner balance for instance. Accounts are ordered in the same way as |
|
||||
in the Chart of account |
|
||||
* Period have been added (date only is not filled in since date can be |
|
||||
outside period) |
|
||||
* Reconciliation code added |
|
||||
* Subtotal by account |
|
||||
* Alphabetical sorting (same as in partner balance) |
|
||||
|
|
||||
Open invoice report : other version of the partner ledger showing |
|
||||
unreconciled / partially reconciled entries. |
|
||||
|
|
||||
* Possibility to print unreconciled transactions only at any date in |
|
||||
the past (thanks to the new field: `last_rec_date` which computes |
|
||||
the last move line reconciliation date). No more pain to get open |
|
||||
invoices at the last closing date. |
|
||||
* no initial balance computed because the report shows open invoices |
|
||||
from previous years. |
|
||||
|
|
||||
The Trial balance: list of accounts with balances |
|
||||
|
|
||||
* You can either see the columns: initial balance, debit, credit, |
|
||||
end balance or compare balances over 4 periods of your choice |
|
||||
* You can select the "opening" filter to get the opening trial balance |
|
||||
only |
|
||||
* If you create an extra virtual chart (using consolidated account) of |
|
||||
accounts for your P&L and your balance sheet, you can print your |
|
||||
statutory accounts (with comparison over years for instance) |
|
||||
* If you compare 2 periods, you will get the differences in values and |
|
||||
in percent |
|
||||
|
|
||||
The Partner balance: list of account with balances |
|
||||
|
|
||||
* Subtotal by account and partner |
|
||||
* Alphabetical sorting (same as in partner balance) |
|
||||
|
|
||||
|
|
||||
Aged Partner Balance: Summary of aged open amount per partner |
|
||||
|
|
||||
This report is an accounting tool helping in various tasks. |
|
||||
You can credit control or partner balance provisions computation for instance. |
|
||||
|
|
||||
The aged balance report allows you to print balances per partner |
|
||||
like the trial balance but add an extra information : |
|
||||
|
|
||||
* It will split balances into due amounts |
|
||||
(due date not reached à the end date of the report) and overdue amounts |
|
||||
Overdue data are also split by period. |
|
||||
* For each partner following columns will be displayed: |
|
||||
|
|
||||
* Total balance (all figures must match with same date partner balance |
|
||||
report). |
|
||||
This column equals the sum of all following columns) |
|
||||
|
|
||||
* Due |
|
||||
* Overdue <= 30 days |
|
||||
* Overdue <= 60 days |
|
||||
* Overdue <= 90 days |
|
||||
* Overdue <= 120 days |
|
||||
* Older |
|
||||
|
|
||||
Hypothesis / Contraints of aged partner balance |
|
||||
|
|
||||
* Overdues columns will be by default be based on 30 days range fix number of |
|
||||
days. This can be changed by changes the RANGES constraint |
|
||||
* All data will be displayed in company currency |
|
||||
* When partial payments, the payment must appear in the same colums than the |
|
||||
invoice (Except if multiple payment terms) |
|
||||
* Data granularity: partner (will not display figures at invoices level) |
|
||||
* The report aggregate data per account with sub-totals |
|
||||
* Initial balance must be calculated the same way that |
|
||||
the partner balance / Ignoring the opening entry |
|
||||
in special period (idem open invoice report) |
|
||||
* Only accounts with internal type payable or receivable are considered |
|
||||
(idem open invoice report) |
|
||||
* If maturity date is null then use move line date |
|
||||
|
|
||||
|
|
||||
Limitations: |
|
||||
------------ |
|
||||
|
|
||||
In order to run properly this module makes sure you have installed the |
|
||||
library `wkhtmltopdf` for the pdf rendering (the library path must be |
|
||||
set in a System Parameter `webkit_path`). |
|
||||
|
|
||||
Initial balances in these reports are based either on opening entry |
|
||||
posted in the opening period or computed on the fly. So make sure |
|
||||
that your past accounting opening entries are in an opening period. |
|
||||
Initials balances are not computed when using the Date filter (since a |
|
||||
date can be outside its logical period and the initial balance could |
|
||||
be different when computed by data or by initial balance for the |
|
||||
period). The opening period is assumed to be the Jan. 1st of the year |
|
||||
with an opening flag and the first period of the year must start also |
|
||||
on Jan 1st. |
|
||||
|
|
||||
Totals for amounts in currencies are effective if the partner belongs to |
|
||||
an account with a secondary currency. |
|
||||
|
|
||||
HTML headers and footers are deactivated for these reports because of |
|
||||
an issue in wkhtmltopdf |
|
||||
(http://code.google.com/p/wkhtmltopdf/issues/detail?id=656) Instead, |
|
||||
the header and footer are created as text with arguments passed to |
|
||||
wkhtmltopdf. The texts are defined inside the report classes. |
|
||||
""", |
|
||||
'version': '8.0.1.1.0', |
|
||||
'author': "Camptocamp,Odoo Community Association (OCA)", |
|
||||
'license': 'AGPL-3', |
|
||||
'category': 'Finance', |
|
||||
'website': 'http://www.camptocamp.com', |
|
||||
'images': [ |
|
||||
'images/ledger.png', ], |
|
||||
'depends': ['account', |
|
||||
'report_webkit'], |
|
||||
'demo': [], |
|
||||
'data': ['account_view.xml', |
|
||||
'data/financial_webkit_header.xml', |
|
||||
'report/report.xml', |
|
||||
'wizard/wizard.xml', |
|
||||
'wizard/balance_common_view.xml', |
|
||||
'wizard/general_ledger_wizard_view.xml', |
|
||||
'wizard/partners_ledger_wizard_view.xml', |
|
||||
'wizard/trial_balance_wizard_view.xml', |
|
||||
'wizard/partner_balance_wizard_view.xml', |
|
||||
'wizard/open_invoices_wizard_view.xml', |
|
||||
'wizard/aged_partner_balance_wizard.xml', |
|
||||
'wizard/print_journal_view.xml', |
|
||||
'report_menus.xml', |
|
||||
], |
|
||||
# tests order matter |
|
||||
'test': ['tests/general_ledger.yml', |
|
||||
'tests/partner_ledger.yml', |
|
||||
'tests/trial_balance.yml', |
|
||||
'tests/partner_balance.yml', |
|
||||
'tests/open_invoices.yml', |
|
||||
'tests/aged_trial_balance.yml'], |
|
||||
# 'tests/account_move_line.yml' |
|
||||
'active': False, |
|
||||
'installable': False, |
|
||||
'application': True, |
|
||||
} |
|
@ -1,47 +0,0 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Copyright (c) 2011 Camptocamp SA (http://www.camptocamp.com) |
|
||||
# |
|
||||
# Author: Guewen Baconnier (Camptocamp) |
|
||||
# |
|
||||
# WARNING: This program as such is intended to be used by professional |
|
||||
# programmers who take the whole responsability of assessing all potential |
|
||||
# consequences resulting from its eventual inadequacies and bugs |
|
||||
# End users who are looking for a ready-to-use solution with commercial |
|
||||
# garantees and support are strongly adviced to contract a Free Software |
|
||||
# Service Company |
|
||||
# |
|
||||
# This program is Free Software; you can redistribute it and/or |
|
||||
# modify it under the terms of the GNU General Public License |
|
||||
# as published by the Free Software Foundation; either version 2 |
|
||||
# of the License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU General Public License |
|
||||
# along with this program; if not, write to the Free Software |
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
from openerp.osv import fields, orm |
|
||||
|
|
||||
|
|
||||
class AccountAccount(orm.Model): |
|
||||
_inherit = 'account.account' |
|
||||
|
|
||||
_columns = { |
|
||||
'centralized': fields.boolean( |
|
||||
'Centralized', |
|
||||
help="If flagged, no details will be displayed in " |
|
||||
"the General Ledger report (the webkit one only), " |
|
||||
"only centralized amounts per period."), |
|
||||
} |
|
||||
|
|
||||
_defaults = { |
|
||||
'centralized': False, |
|
||||
} |
|
@ -1,77 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Author: Nicolas Bessi. |
|
||||
# Copyright Camptocamp SA 2011 |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU General Public License as published by |
|
||||
# the Free Software Foundation, either version 3 of the License, or |
|
||||
# (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
from openerp.osv import fields, orm |
|
||||
|
|
||||
|
|
||||
class AccountMoveLine(orm.Model): |
|
||||
|
|
||||
"""Overriding Account move line in order to add last_rec_date. |
|
||||
Last rec date is the date of the last reconciliation (full or partial) |
|
||||
account move line""" |
|
||||
_inherit = 'account.move.line' |
|
||||
|
|
||||
def _get_move_line_from_line_rec(self, cr, uid, ids, context=None): |
|
||||
moves = [] |
|
||||
for reconcile in self.pool['account.move.reconcile'].browse( |
|
||||
cr, uid, ids, context=context): |
|
||||
for move_line in reconcile.line_partial_ids: |
|
||||
moves.append(move_line.id) |
|
||||
for move_line in reconcile.line_id: |
|
||||
moves.append(move_line.id) |
|
||||
return list(set(moves)) |
|
||||
|
|
||||
def _get_last_rec_date(self, cursor, uid, ids, name, args, context=None): |
|
||||
if not isinstance(ids, list): |
|
||||
ids = [ids] |
|
||||
res = {} |
|
||||
for line in self.browse(cursor, uid, ids, context): |
|
||||
res[line.id] = {'last_rec_date': False} |
|
||||
rec = line.reconcile_id or line.reconcile_partial_id or False |
|
||||
if rec: |
|
||||
# we use cursor in order to gain some perfs. |
|
||||
# also, important point: LIMIT 1 is not used due to |
|
||||
# performance issues when in conjonction with "OR" |
|
||||
# (one backwards index scan instead of 2 scans and a sort) |
|
||||
cursor.execute('SELECT date from account_move_line' |
|
||||
' WHERE reconcile_id = %s' |
|
||||
' OR reconcile_partial_id = %s' |
|
||||
' ORDER BY date DESC', |
|
||||
(rec.id, rec.id)) |
|
||||
res_set = cursor.fetchone() |
|
||||
if res_set: |
|
||||
res[line.id] = {'last_rec_date': res_set[0]} |
|
||||
return res |
|
||||
|
|
||||
_columns = { |
|
||||
'last_rec_date': fields.function( |
|
||||
_get_last_rec_date, |
|
||||
method=True, |
|
||||
string='Last reconciliation date', |
|
||||
store={'account.move.line': (lambda self, cr, uid, ids, c={}: ids, |
|
||||
['date'], 20), |
|
||||
'account.move.reconcile': (_get_move_line_from_line_rec, |
|
||||
None, 20)}, |
|
||||
type='date', |
|
||||
multi='all', |
|
||||
help="the date of the last reconciliation (full or partial) \ |
|
||||
account move line"), |
|
||||
} |
|
@ -1,17 +0,0 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||
<openerp> |
|
||||
<data> |
|
||||
<record id="view_account_form_webkit" model="ir.ui.view"> |
|
||||
<field name="name">account.account.form.webkit</field> |
|
||||
<field name="model">account.account</field> |
|
||||
<field name="inherit_id" ref="account.view_account_form"/> |
|
||||
<field name="arch" type="xml"> |
|
||||
<data> |
|
||||
<field name="active" position="after"> |
|
||||
<field name="centralized" groups="account.group_account_manager"/> |
|
||||
</field> |
|
||||
</data> |
|
||||
</field> |
|
||||
</record> |
|
||||
</data> |
|
||||
</openerp> |
|
@ -1,409 +0,0 @@ |
|||||
<?xml version="1.0" ?> |
|
||||
<openerp> |
|
||||
<data noupdate="1"> |
|
||||
<record id="financial_landscape_header" model="ir.header_webkit"> |
|
||||
<field name="footer_html"><![CDATA[ |
|
||||
<html> |
|
||||
<head> |
|
||||
<meta content="text/html; charset=UTF-8" http-equiv="content-type"/> |
|
||||
<script> |
|
||||
function subst() { |
|
||||
var vars={}; |
|
||||
var x=document.location.search.substring(1).split('&'); |
|
||||
for(var i in x) {var z=x[i].split('=',2);vars[z[0]] = unescape(z[1]);} |
|
||||
var x=['frompage','topage','page','webpage','section','subsection','subsubsection']; |
|
||||
for(var i in x) { |
|
||||
var y = document.getElementsByClassName(x[i]); |
|
||||
for(var j=0; j<y.length; ++j) y[j].textContent = vars[x[i]]; |
|
||||
} |
|
||||
} |
|
||||
</script> |
|
||||
</head> |
|
||||
<% import datetime %> |
|
||||
<body style="border:0; margin: 0;" onload="subst()"> |
|
||||
<table style="border-top: 1px solid black; width: 1080px"> |
|
||||
<tr style="border-collapse:collapse;"> |
|
||||
<td style="text-align:left;font-size:10;width:350px;">${formatLang( str(datetime.datetime.today()), date_time=True)}</td> |
|
||||
<td style="text-align:center;font-size:10;width:350px;">${user.name}</td> |
|
||||
<td style="text-align:right;font-size:10;width:350px;">Page <span class="page"/></td> |
|
||||
<td style="text-align:left;font-size:10;width:30px"> of <span class="topage"/></td> |
|
||||
</tr> |
|
||||
</table> |
|
||||
</body> |
|
||||
</html>]]></field> |
|
||||
<field name="orientation">Landscape</field> |
|
||||
<field name="format">A4</field> |
|
||||
<field name="html"><![CDATA[ |
|
||||
<html> |
|
||||
<head> |
|
||||
<meta content="text/html; charset=UTF-8" http-equiv="content-type"/> |
|
||||
<script> |
|
||||
function subst() { |
|
||||
var vars={}; |
|
||||
var x=document.location.search.substring(1).split('&'); |
|
||||
for(var i in x) {var z=x[i].split('=',2);vars[z[0]] = unescape(z[1]);} |
|
||||
var x=['frompage','topage','page','webpage','section','subsection','subsubsection']; |
|
||||
for(var i in x) { |
|
||||
var y = document.getElementsByClassName(x[i]); |
|
||||
for(var j=0; j<y.length; ++j) y[j].textContent = vars[x[i]]; |
|
||||
} |
|
||||
} |
|
||||
</script> |
|
||||
<style type="text/css"> |
|
||||
${css} |
|
||||
</style> |
|
||||
</head> |
|
||||
<body style="border:0; margin: 0;" onload="subst()"> |
|
||||
<table class="header" style="border-bottom: 0px solid black; width: 100%"> |
|
||||
<tr> |
|
||||
<td style="text-align:left; font-size:11px; font-weight: bold;"><span style="text-transform:uppercase; font-size:12px;">${report_name}</span> - ${company.partner_id.name | entity} - ${company.currency_id.name | entity}</td> |
|
||||
</tr> |
|
||||
</table> ${_debug or ''|n} </body> |
|
||||
</html>]]> |
|
||||
</field> |
|
||||
<field eval="0.0" name="margin_top"/> |
|
||||
<field name="css"><![CDATA[ |
|
||||
|
|
||||
body, table, td, span, div { |
|
||||
font-family: Helvetica, Arial; |
|
||||
} |
|
||||
|
|
||||
.act_as_table { |
|
||||
display: table; |
|
||||
} |
|
||||
.act_as_row { |
|
||||
display: table-row; |
|
||||
} |
|
||||
.act_as_cell { |
|
||||
display: table-cell; |
|
||||
} |
|
||||
.act_as_thead { |
|
||||
display: table-header-group; |
|
||||
} |
|
||||
.act_as_tbody { |
|
||||
display: table-row-group; |
|
||||
} |
|
||||
.act_as_tfoot { |
|
||||
display: table-footer-group; |
|
||||
} |
|
||||
.act_as_caption { |
|
||||
display: table-caption; |
|
||||
} |
|
||||
act_as_colgroup { |
|
||||
display: table-column-group; |
|
||||
} |
|
||||
|
|
||||
.list_table, .data_table { |
|
||||
width: 1080px; |
|
||||
table-layout: fixed |
|
||||
} |
|
||||
|
|
||||
.bg, .act_as_row.labels { |
|
||||
background-color:#F0F0F0; |
|
||||
} |
|
||||
|
|
||||
.list_table, .data_table, .list_table .act_as_row { |
|
||||
border-left:0px; |
|
||||
border-right:0px; |
|
||||
text-align:left; |
|
||||
font-size:9px; |
|
||||
padding-right:3px; |
|
||||
padding-left:3px; |
|
||||
padding-top:2px; |
|
||||
padding-bottom:2px; |
|
||||
border-collapse:collapse; |
|
||||
} |
|
||||
|
|
||||
.list_table .act_as_row.labels, .list_table .act_as_row.initial_balance, .list_table .act_as_row.lines { |
|
||||
border-color:gray; |
|
||||
border-bottom:1px solid lightGrey; |
|
||||
} |
|
||||
|
|
||||
.data_table .act_as_cell { |
|
||||
border: 1px solid lightGrey; |
|
||||
text-align: center; |
|
||||
} |
|
||||
|
|
||||
.data_table .act_as_cell, .list_table .act_as_cell { |
|
||||
word-wrap: break-word; |
|
||||
} |
|
||||
|
|
||||
.data_table .act_as_row.labels { |
|
||||
font-weight: bold; |
|
||||
} |
|
||||
|
|
||||
.initial_balance .act_as_cell { |
|
||||
font-style:italic; |
|
||||
} |
|
||||
|
|
||||
.account_title { |
|
||||
font-size:10px; |
|
||||
font-weight:bold; |
|
||||
page-break-after: avoid; |
|
||||
} |
|
||||
|
|
||||
.act_as_cell.amount { |
|
||||
word-wrap:normal; |
|
||||
text-align:right; |
|
||||
} |
|
||||
|
|
||||
.list_table .act_as_cell{ |
|
||||
padding-left: 5px; |
|
||||
/* border-right:1px solid lightGrey; uncomment to active column lines */ |
|
||||
} |
|
||||
.list_table .act_as_cell.first_column { |
|
||||
padding-left: 0px; |
|
||||
/* border-left:1px solid lightGrey; uncomment to active column lines */ |
|
||||
} |
|
||||
|
|
||||
.sep_left { |
|
||||
border-left: 1px solid lightGrey; |
|
||||
} |
|
||||
|
|
||||
.overflow_ellipsis { |
|
||||
text-overflow: ellipsis; |
|
||||
overflow: hidden; |
|
||||
white-space: nowrap; |
|
||||
} |
|
||||
|
|
||||
.open_invoice_previous_line { |
|
||||
font-style: italic; |
|
||||
} |
|
||||
|
|
||||
.clearance_line { |
|
||||
font-style: italic; |
|
||||
} |
|
||||
|
|
||||
]]> |
|
||||
</field> |
|
||||
<field name="name">Financial Landscape Header</field> |
|
||||
</record> |
|
||||
|
|
||||
<record id="financial_portrait_header" model="ir.header_webkit"> |
|
||||
<field name="footer_html"><![CDATA[ |
|
||||
<html> |
|
||||
<head> |
|
||||
<meta content="text/html; charset=UTF-8" http-equiv="content-type"/> |
|
||||
<script> |
|
||||
function subst() { |
|
||||
var vars={}; |
|
||||
var x=document.location.search.substring(1).split('&'); |
|
||||
for(var i in x) {var z=x[i].split('=',2);vars[z[0]] = unescape(z[1]);} |
|
||||
var x=['frompage','topage','page','webpage','section','subsection','subsubsection']; |
|
||||
for(var i in x) { |
|
||||
var y = document.getElementsByClassName(x[i]); |
|
||||
for(var j=0; j<y.length; ++j) y[j].textContent = vars[x[i]]; |
|
||||
} |
|
||||
} |
|
||||
</script> |
|
||||
</head> |
|
||||
<% import datetime %> |
|
||||
<body style="border:0; margin: 0;" onload="subst()"> |
|
||||
<table style="border-top: 1px solid black; width: 1080px"> |
|
||||
<tr style="border-collapse:collapse;"> |
|
||||
<td style="text-align:left;font-size:10;width:350px;">${formatLang( str(datetime.datetime.today()), date_time=True)}</td> |
|
||||
<td style="text-align:center;font-size:10;width:350px;">${user.name}</td> |
|
||||
<td style="text-align:right;font-size:10;width:350px;">Page <span class="page"/></td> |
|
||||
<td style="text-align:left;font-size:10;width:30px"> of <span class="topage"/></td> |
|
||||
</tr> |
|
||||
</table> |
|
||||
</body> |
|
||||
</html>]]></field> |
|
||||
<field name="orientation">Portrait</field> |
|
||||
<field name="format">A4</field> |
|
||||
<field name="html"><![CDATA[ |
|
||||
<html> |
|
||||
<head> |
|
||||
<meta content="text/html; charset=UTF-8" http-equiv="content-type"/> |
|
||||
<script> |
|
||||
function subst() { |
|
||||
var vars={}; |
|
||||
var x=document.location.search.substring(1).split('&'); |
|
||||
for(var i in x) {var z=x[i].split('=',2);vars[z[0]] = unescape(z[1]);} |
|
||||
var x=['frompage','topage','page','webpage','section','subsection','subsubsection']; |
|
||||
for(var i in x) { |
|
||||
var y = document.getElementsByClassName(x[i]); |
|
||||
for(var j=0; j<y.length; ++j) y[j].textContent = vars[x[i]]; |
|
||||
} |
|
||||
} |
|
||||
</script> |
|
||||
<style type="text/css"> |
|
||||
${css} |
|
||||
</style> |
|
||||
</head> |
|
||||
<body style="border:0; margin: 0;" onload="subst()"> |
|
||||
<table class="header" style="border-bottom: 0px solid black; width: 100%"> |
|
||||
<tr> |
|
||||
<td style="text-align:left; font-size:11px; font-weight: bold;"><span style="text-transform:uppercase; font-size:12px;">${report_name}</span> - ${company.partner_id.name | entity} - ${company.currency_id.name | entity}</td> |
|
||||
</tr> |
|
||||
</table> ${_debug or ''|n} </body> |
|
||||
</html>]]> |
|
||||
</field> |
|
||||
<field eval="17.0" name="margin_top"/> |
|
||||
<field eval="15.0" name="margin_bottom"/> |
|
||||
<field name="css"><![CDATA[ |
|
||||
|
|
||||
body, table, td, span, div { |
|
||||
font-family: Helvetica, Arial; |
|
||||
} |
|
||||
|
|
||||
.act_as_table { |
|
||||
display: table; |
|
||||
} |
|
||||
.act_as_row { |
|
||||
display: table-row; |
|
||||
} |
|
||||
.act_as_cell { |
|
||||
display: table-cell; |
|
||||
} |
|
||||
.act_as_thead { |
|
||||
display: table-header-group; |
|
||||
} |
|
||||
.act_as_tbody { |
|
||||
display: table-row-group; |
|
||||
} |
|
||||
.act_as_tfoot { |
|
||||
display: table-footer-group; |
|
||||
} |
|
||||
.act_as_caption { |
|
||||
display: table-caption; |
|
||||
} |
|
||||
act_as_colgroup { |
|
||||
display: table-column-group; |
|
||||
} |
|
||||
|
|
||||
.list_table, .data_table { |
|
||||
width: 690px; |
|
||||
table-layout: fixed |
|
||||
} |
|
||||
|
|
||||
.bg, .act_as_row.labels { |
|
||||
background-color:#F0F0F0; |
|
||||
} |
|
||||
|
|
||||
.list_table, .data_table, .list_table .act_as_row { |
|
||||
border-left:0px; |
|
||||
border-right:0px; |
|
||||
text-align:left; |
|
||||
font-size:9px; |
|
||||
padding-right:3px; |
|
||||
padding-left:3px; |
|
||||
padding-top:2px; |
|
||||
padding-bottom:2px; |
|
||||
border-collapse:collapse; |
|
||||
} |
|
||||
|
|
||||
.list_table .act_as_row.labels, .list_table .act_as_row.initial_balance, .list_table .act_as_row.lines { |
|
||||
border-color:gray; |
|
||||
border-bottom:1px solid lightGrey; |
|
||||
} |
|
||||
|
|
||||
.data_table .act_as_cell { |
|
||||
border: 1px solid lightGrey; |
|
||||
text-align: center; |
|
||||
} |
|
||||
|
|
||||
.data_table .act_as_cell, .list_table .act_as_cell { |
|
||||
word-wrap: break-word; |
|
||||
} |
|
||||
|
|
||||
.data_table .act_as_row.labels { |
|
||||
font-weight: bold; |
|
||||
} |
|
||||
|
|
||||
.initial_balance .act_as_cell { |
|
||||
font-style:italic; |
|
||||
} |
|
||||
|
|
||||
.account_title { |
|
||||
font-size:10px; |
|
||||
font-weight:bold; |
|
||||
page-break-after: avoid; |
|
||||
} |
|
||||
|
|
||||
.act_as_cell.amount { |
|
||||
word-wrap:normal; |
|
||||
text-align:right; |
|
||||
} |
|
||||
|
|
||||
.list_table .act_as_cell{ |
|
||||
padding-left: 5px; |
|
||||
/* border-right:1px solid lightGrey; uncomment to active column lines */ |
|
||||
} |
|
||||
.list_table .act_as_cell.first_column { |
|
||||
padding-left: 0px; |
|
||||
/* border-left:1px solid lightGrey; uncomment to active column lines */ |
|
||||
} |
|
||||
|
|
||||
.sep_left { |
|
||||
border-left: 1px solid lightGrey; |
|
||||
} |
|
||||
|
|
||||
.account_level_1 { |
|
||||
text-transform: uppercase; |
|
||||
/*font-weight: bold;*/ |
|
||||
font-size: 15px; |
|
||||
background-color:#F0F0F0; |
|
||||
} |
|
||||
|
|
||||
/* |
|
||||
.account_level_1 .act_as_cell { |
|
||||
height: 30px; |
|
||||
vertical-align: bottom; |
|
||||
} |
|
||||
*/ |
|
||||
|
|
||||
.account_level_2 { |
|
||||
/*text-transform: uppercase; |
|
||||
font-weight: bold;*/ |
|
||||
font-size: 12px; |
|
||||
background-color:#F0F0F0; |
|
||||
} |
|
||||
|
|
||||
/* |
|
||||
.account_level_2 .act_as_cell { |
|
||||
height: 20px; |
|
||||
vertical-align: bottom; |
|
||||
} |
|
||||
|
|
||||
.account_level_3 { |
|
||||
text-transform: uppercase; |
|
||||
font-weight: bold; |
|
||||
font-size: 11px; |
|
||||
background-color:#FAFAFA; |
|
||||
} |
|
||||
|
|
||||
.account_level_4 { |
|
||||
font-weight: bold; |
|
||||
font-size: 11px; |
|
||||
} |
|
||||
*/ |
|
||||
|
|
||||
.account_level_5 { |
|
||||
|
|
||||
} |
|
||||
|
|
||||
.regular_account_type { |
|
||||
font-weight: normal; |
|
||||
} |
|
||||
|
|
||||
.view_account_type { |
|
||||
font-weight: bold; |
|
||||
|
|
||||
.account_level_consol { |
|
||||
font-weight: normal; |
|
||||
font-style: italic; |
|
||||
} |
|
||||
|
|
||||
.overflow_ellipsis { |
|
||||
text-overflow: ellipsis; |
|
||||
overflow: hidden; |
|
||||
white-space: nowrap; |
|
||||
} |
|
||||
|
|
||||
]]> |
|
||||
</field> |
|
||||
<field name="name">Financial Portrait Header</field> |
|
||||
</record> |
|
||||
</data> |
|
||||
</openerp> |
|
1523
account_financial_report_webkit/i18n/account_financial_report_webkit.pot
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1327
account_financial_report_webkit/i18n/de.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1327
account_financial_report_webkit/i18n/en_US.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1374
account_financial_report_webkit/i18n/es.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1587
account_financial_report_webkit/i18n/fr.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1373
account_financial_report_webkit/i18n/it.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1535
account_financial_report_webkit/i18n/lt.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1327
account_financial_report_webkit/i18n/nl.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
Before Width: 1553 | Height: 271 | Size: 54 KiB |
@ -1,41 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Author: Nicolas Bessi. |
|
||||
# Copyright Camptocamp SA 2011 |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU General Public License as published by |
|
||||
# the Free Software Foundation, either version 3 of the License, or |
|
||||
# (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
|
|
||||
def migrate(cr, version): |
|
||||
if not version: |
|
||||
# only run at first install |
|
||||
cr.execute("UPDATE account_move_line as acm " |
|
||||
" SET last_rec_date =" |
|
||||
" (SELECT date from account_move_line" |
|
||||
" WHERE reconcile_id = acm.reconcile_id" |
|
||||
" AND reconcile_id IS NOT NULL" |
|
||||
" ORDER BY date DESC LIMIT 1)" |
|
||||
" WHERE last_rec_date is null;") |
|
||||
|
|
||||
cr.execute("UPDATE account_move_line as acm " |
|
||||
" SET last_rec_date =" |
|
||||
" (SELECT date from account_move_line" |
|
||||
" WHERE reconcile_partial_id" |
|
||||
" = acm.reconcile_partial_id" |
|
||||
" AND reconcile_partial_id IS NOT NULL" |
|
||||
" ORDER BY date DESC LIMIT 1)" |
|
||||
" WHERE last_rec_date is null;") |
|
@ -1,12 +0,0 @@ |
|||||
from . import common_reports |
|
||||
from . import common_partner_reports |
|
||||
from . import common_balance_reports |
|
||||
from . import common_partner_balance_reports |
|
||||
from . import general_ledger |
|
||||
from . import partners_ledger |
|
||||
from . import webkit_parser_header_fix |
|
||||
from . import trial_balance |
|
||||
from . import partner_balance |
|
||||
from . import open_invoices |
|
||||
from . import print_journal |
|
||||
from . import aged_partner_balance |
|
@ -1,429 +0,0 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Author: Nicolas Bessi |
|
||||
# Copyright 2014 Camptocamp SA |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
from __future__ import division |
|
||||
from datetime import datetime |
|
||||
|
|
||||
from openerp import pooler |
|
||||
from openerp.tools import DEFAULT_SERVER_DATE_FORMAT |
|
||||
from openerp.tools.translate import _ |
|
||||
from .open_invoices import PartnersOpenInvoicesWebkit |
|
||||
from .webkit_parser_header_fix import HeaderFooterTextWebKitParser |
|
||||
|
|
||||
|
|
||||
def make_ranges(top, offset): |
|
||||
"""Return sorted days ranges |
|
||||
|
|
||||
:param top: maximum overdue day |
|
||||
:param offset: offset for ranges |
|
||||
|
|
||||
:returns: list of sorted ranges tuples in days |
|
||||
eg. [(-100000, 0), (0, offset), |
|
||||
(offset, n*offset), ... (top, 100000)] |
|
||||
""" |
|
||||
ranges = [(n, min(n + offset, top)) for n in xrange(0, top, offset)] |
|
||||
ranges.insert(0, (-100000000000, 0)) |
|
||||
ranges.append((top, 100000000000)) |
|
||||
return ranges |
|
||||
|
|
||||
# list of overdue ranges |
|
||||
RANGES = make_ranges(120, 30) |
|
||||
|
|
||||
|
|
||||
def make_ranges_titles(): |
|
||||
"""Generates title to be used by mako""" |
|
||||
titles = [_('Due')] |
|
||||
titles += [_(u'Overdue ≤ %s d.') % x[1] for x in RANGES[1:-1]] |
|
||||
titles.append(_('Older')) |
|
||||
return titles |
|
||||
|
|
||||
# list of overdue ranges title |
|
||||
RANGES_TITLES = make_ranges_titles() |
|
||||
# list of payable journal types |
|
||||
REC_PAY_TYPE = ('purchase', 'sale') |
|
||||
# list of refund payable type |
|
||||
REFUND_TYPE = ('purchase_refund', 'sale_refund') |
|
||||
INV_TYPE = REC_PAY_TYPE + REFUND_TYPE |
|
||||
|
|
||||
|
|
||||
class AccountAgedTrialBalanceWebkit(PartnersOpenInvoicesWebkit): |
|
||||
|
|
||||
"""Compute Aged Partner Balance based on result of Open Invoices""" |
|
||||
|
|
||||
def __init__(self, cursor, uid, name, context=None): |
|
||||
"""Constructor, |
|
||||
refer to :class:`openerp.report.report_sxw.rml_parse`""" |
|
||||
super(AccountAgedTrialBalanceWebkit, self).__init__(cursor, uid, name, |
|
||||
context=context) |
|
||||
self.pool = pooler.get_pool(self.cr.dbname) |
|
||||
self.cursor = self.cr |
|
||||
company = self.pool.get('res.users').browse(self.cr, uid, uid, |
|
||||
context=context).company_id |
|
||||
|
|
||||
header_report_name = ' - '.join((_('Aged Partner Balance'), |
|
||||
company.currency_id.name)) |
|
||||
|
|
||||
footer_date_time = self.formatLang(str(datetime.today()), |
|
||||
date_time=True) |
|
||||
|
|
||||
self.localcontext.update({ |
|
||||
'cr': cursor, |
|
||||
'uid': uid, |
|
||||
'company': company, |
|
||||
'ranges': self._get_ranges(), |
|
||||
'ranges_titles': self._get_ranges_titles(), |
|
||||
'report_name': _('Aged Partner Balance'), |
|
||||
'additional_args': [ |
|
||||
('--header-font-name', 'Helvetica'), |
|
||||
('--footer-font-name', 'Helvetica'), |
|
||||
('--header-font-size', '10'), |
|
||||
('--footer-font-size', '6'), |
|
||||
('--header-left', header_report_name), |
|
||||
('--header-spacing', '2'), |
|
||||
('--footer-left', footer_date_time), |
|
||||
('--footer-right', |
|
||||
' '.join((_('Page'), '[page]', _('of'), '[topage]'))), |
|
||||
('--footer-line',), |
|
||||
], |
|
||||
}) |
|
||||
|
|
||||
def _get_ranges(self): |
|
||||
""":returns: :cons:`RANGES`""" |
|
||||
return RANGES |
|
||||
|
|
||||
def _get_ranges_titles(self): |
|
||||
""":returns: :cons: `RANGES_TITLES`""" |
|
||||
return RANGES_TITLES |
|
||||
|
|
||||
def set_context(self, objects, data, ids, report_type=None): |
|
||||
"""Populate aged_lines, aged_balance, aged_percents attributes |
|
||||
|
|
||||
on each account browse record that will be used by mako template |
|
||||
The browse record are store in :attr:`objects` |
|
||||
|
|
||||
The computation are based on the ledger_lines attribute set on account |
|
||||
contained by :attr:`objects` |
|
||||
|
|
||||
:attr:`objects` values were previously set by parent class |
|
||||
:class: `.open_invoices.PartnersOpenInvoicesWebkit` |
|
||||
|
|
||||
:returns: parent :class:`.open_invoices.PartnersOpenInvoicesWebkit` |
|
||||
call to set_context |
|
||||
|
|
||||
""" |
|
||||
|
|
||||
res = super(AccountAgedTrialBalanceWebkit, self).set_context( |
|
||||
objects, |
|
||||
data, |
|
||||
ids, |
|
||||
report_type=report_type |
|
||||
) |
|
||||
|
|
||||
agged_lines_accounts = {} |
|
||||
agged_totals_accounts = {} |
|
||||
agged_percents_accounts = {} |
|
||||
|
|
||||
for acc in self.objects: |
|
||||
agged_lines_accounts[acc.id] = {} |
|
||||
agged_totals_accounts[acc.id] = {} |
|
||||
agged_percents_accounts[acc.id] = {} |
|
||||
|
|
||||
for part_id, partner_lines in\ |
|
||||
self.localcontext['ledger_lines'][acc.id].items(): |
|
||||
|
|
||||
aged_lines = self.compute_aged_lines(part_id, |
|
||||
partner_lines, |
|
||||
data) |
|
||||
if aged_lines: |
|
||||
agged_lines_accounts[acc.id][part_id] = aged_lines |
|
||||
agged_totals_accounts[acc.id] = totals = self.compute_totals( |
|
||||
agged_lines_accounts[acc.id].values()) |
|
||||
agged_percents_accounts[acc.id] = self.compute_percents(totals) |
|
||||
|
|
||||
self.localcontext.update({ |
|
||||
'agged_lines_accounts': agged_lines_accounts, |
|
||||
'agged_totals_accounts': agged_totals_accounts, |
|
||||
'agged_percents_accounts': agged_percents_accounts, |
|
||||
}) |
|
||||
|
|
||||
# Free some memory |
|
||||
del(self.localcontext['ledger_lines']) |
|
||||
return res |
|
||||
|
|
||||
def compute_aged_lines(self, partner_id, ledger_lines, data): |
|
||||
"""Add property aged_lines to accounts browse records |
|
||||
|
|
||||
contained in :attr:`objects` for a given partner |
|
||||
|
|
||||
:param: partner_id: current partner |
|
||||
:param ledger_lines: generated by parent |
|
||||
:class:`.open_invoices.PartnersOpenInvoicesWebkit` |
|
||||
|
|
||||
:returns: dict of computed aged lines |
|
||||
eg {'balance': 1000.0, |
|
||||
'aged_lines': {(90, 120): 0.0, ...} |
|
||||
|
|
||||
""" |
|
||||
lines_to_age = self.filter_lines(partner_id, ledger_lines) |
|
||||
res = {} |
|
||||
end_date = self._get_end_date(data) |
|
||||
aged_lines = dict.fromkeys(RANGES, 0.0) |
|
||||
reconcile_lookup = self.get_reconcile_count_lookup(lines_to_age) |
|
||||
res['aged_lines'] = aged_lines |
|
||||
for line in lines_to_age: |
|
||||
compute_method = self.get_compute_method(reconcile_lookup, |
|
||||
partner_id, |
|
||||
line) |
|
||||
delay = compute_method(line, end_date, ledger_lines) |
|
||||
classification = self.classify_line(partner_id, delay) |
|
||||
aged_lines[classification] += line['debit'] - line['credit'] |
|
||||
self.compute_balance(res, aged_lines) |
|
||||
return res |
|
||||
|
|
||||
def _get_end_date(self, data): |
|
||||
"""Retrieve end date to be used to compute delay. |
|
||||
|
|
||||
:param data: data dict send to report contains form dict |
|
||||
|
|
||||
:returns: end date to be used to compute overdue delay |
|
||||
|
|
||||
""" |
|
||||
end_date = None |
|
||||
date_to = data['form']['date_to'] |
|
||||
period_to_id = data['form']['period_to'] |
|
||||
fiscal_to_id = data['form']['fiscalyear_id'] |
|
||||
if date_to: |
|
||||
end_date = date_to |
|
||||
elif period_to_id: |
|
||||
period_to = self.pool['account.period'].browse(self.cr, |
|
||||
self.uid, |
|
||||
period_to_id) |
|
||||
end_date = period_to.date_stop |
|
||||
elif fiscal_to_id: |
|
||||
fiscal_to = self.pool['account.fiscalyear'].browse(self.cr, |
|
||||
self.uid, |
|
||||
fiscal_to_id) |
|
||||
end_date = fiscal_to.date_stop |
|
||||
else: |
|
||||
raise ValueError('End date and end period not available') |
|
||||
return end_date |
|
||||
|
|
||||
def _compute_delay_from_key(self, key, line, end_date): |
|
||||
"""Compute overdue delay delta in days for line using attribute in key |
|
||||
|
|
||||
delta = end_date - date of key |
|
||||
|
|
||||
:param line: current ledger line |
|
||||
:param key: date key to be used to compute delta |
|
||||
:param end_date: end_date computed for wizard data |
|
||||
|
|
||||
:returns: delta in days |
|
||||
""" |
|
||||
from_date = datetime.strptime(line[key], DEFAULT_SERVER_DATE_FORMAT) |
|
||||
end_date = datetime.strptime(end_date, DEFAULT_SERVER_DATE_FORMAT) |
|
||||
delta = end_date - from_date |
|
||||
return delta.days |
|
||||
|
|
||||
def compute_delay_from_maturity(self, line, end_date, ledger_lines): |
|
||||
"""Compute overdue delay delta in days for line using attribute in key |
|
||||
|
|
||||
delta = end_date - maturity date |
|
||||
|
|
||||
:param line: current ledger line |
|
||||
:param end_date: end_date computed for wizard data |
|
||||
:param ledger_lines: generated by parent |
|
||||
:class:`.open_invoices.PartnersOpenInvoicesWebkit` |
|
||||
|
|
||||
:returns: delta in days |
|
||||
""" |
|
||||
return self._compute_delay_from_key('date_maturity', |
|
||||
line, |
|
||||
end_date) |
|
||||
|
|
||||
def compute_delay_from_date(self, line, end_date, ledger_lines): |
|
||||
"""Compute overdue delay delta in days for line using attribute in key |
|
||||
|
|
||||
delta = end_date - date |
|
||||
|
|
||||
:param line: current ledger line |
|
||||
:param end_date: end_date computed for wizard data |
|
||||
:param ledger_lines: generated by parent |
|
||||
:class:`.open_invoices.PartnersOpenInvoicesWebkit` |
|
||||
|
|
||||
:returns: delta in days |
|
||||
""" |
|
||||
return self._compute_delay_from_key('ldate', |
|
||||
line, |
|
||||
end_date) |
|
||||
|
|
||||
def compute_delay_from_partial_rec(self, line, end_date, ledger_lines): |
|
||||
"""Compute overdue delay delta in days for the case where move line |
|
||||
|
|
||||
is related to a partial reconcile with more than one reconcile line |
|
||||
|
|
||||
:param line: current ledger line |
|
||||
:param end_date: end_date computed for wizard data |
|
||||
:param ledger_lines: generated by parent |
|
||||
:class:`.open_invoices.PartnersOpenInvoicesWebkit` |
|
||||
|
|
||||
:returns: delta in days |
|
||||
""" |
|
||||
sale_lines = [ |
|
||||
x for x in ledger_lines if x['jtype'] in REC_PAY_TYPE and |
|
||||
line['rec_id'] == x['rec_id'] |
|
||||
] |
|
||||
refund_lines = [ |
|
||||
x for x in ledger_lines if x['jtype'] in REFUND_TYPE and |
|
||||
line['rec_id'] == x['rec_id'] |
|
||||
] |
|
||||
if len(sale_lines) == 1: |
|
||||
reference_line = sale_lines[0] |
|
||||
elif len(refund_lines) == 1: |
|
||||
reference_line = refund_lines[0] |
|
||||
else: |
|
||||
reference_line = line |
|
||||
key = 'date_maturity' if reference_line.get( |
|
||||
'date_maturity') else 'ldate' |
|
||||
return self._compute_delay_from_key(key, |
|
||||
reference_line, |
|
||||
end_date) |
|
||||
|
|
||||
def get_compute_method(self, reconcile_lookup, partner_id, line): |
|
||||
"""Get the function that should compute the delay for a given line |
|
||||
|
|
||||
:param reconcile_lookup: dict of reconcile group by id and count |
|
||||
{rec_id: count of line related to reconcile} |
|
||||
:param partner_id: current partner_id |
|
||||
:param line: current ledger line generated by parent |
|
||||
:class:`.open_invoices.PartnersOpenInvoicesWebkit` |
|
||||
|
|
||||
:returns: function bounded to :class:`.AccountAgedTrialBalanceWebkit` |
|
||||
|
|
||||
""" |
|
||||
if reconcile_lookup.get(line['rec_id'], 0.0) > 1: |
|
||||
return self.compute_delay_from_partial_rec |
|
||||
elif line['jtype'] in INV_TYPE and line.get('date_maturity'): |
|
||||
return self.compute_delay_from_maturity |
|
||||
else: |
|
||||
return self.compute_delay_from_date |
|
||||
|
|
||||
def line_is_valid(self, partner_id, line): |
|
||||
"""Predicate hook that allows to filter line to be treated |
|
||||
|
|
||||
:param partner_id: current partner_id |
|
||||
:param line: current ledger line generated by parent |
|
||||
:class:`.open_invoices.PartnersOpenInvoicesWebkit` |
|
||||
|
|
||||
:returns: boolean True if line is allowed |
|
||||
""" |
|
||||
return True |
|
||||
|
|
||||
def filter_lines(self, partner_id, lines): |
|
||||
"""Filter ledger lines that have to be treated |
|
||||
|
|
||||
:param partner_id: current partner_id |
|
||||
:param lines: ledger_lines related to current partner |
|
||||
and generated by parent |
|
||||
:class:`.open_invoices.PartnersOpenInvoicesWebkit` |
|
||||
|
|
||||
:returns: list of allowed lines |
|
||||
|
|
||||
""" |
|
||||
return [x for x in lines if self.line_is_valid(partner_id, x)] |
|
||||
|
|
||||
def classify_line(self, partner_id, overdue_days): |
|
||||
"""Return the overdue range for a given delay |
|
||||
|
|
||||
We loop from smaller range to higher |
|
||||
This should be the most effective solution as generaly |
|
||||
customer tend to have one or two month of delay |
|
||||
|
|
||||
:param overdue_days: delay in days |
|
||||
:param partner_id: current partner_id |
|
||||
|
|
||||
:returns: the correct range in :const:`RANGES` |
|
||||
|
|
||||
""" |
|
||||
for drange in RANGES: |
|
||||
if overdue_days <= drange[1]: |
|
||||
return drange |
|
||||
return drange |
|
||||
|
|
||||
def compute_balance(self, res, aged_lines): |
|
||||
"""Compute the total balance of aged line |
|
||||
for given account""" |
|
||||
res['balance'] = sum(aged_lines.values()) |
|
||||
|
|
||||
def compute_totals(self, aged_lines): |
|
||||
"""Compute the totals for an account |
|
||||
|
|
||||
:param aged_lines: dict of aged line taken from the |
|
||||
property added to account record |
|
||||
|
|
||||
:returns: dict of total {'balance':1000.00, (30, 60): 3000,...} |
|
||||
|
|
||||
""" |
|
||||
totals = {} |
|
||||
totals['balance'] = sum(x.get('balance', 0.0) for |
|
||||
x in aged_lines) |
|
||||
aged_ranges = [x.get('aged_lines', {}) for x in aged_lines] |
|
||||
for drange in RANGES: |
|
||||
totals[drange] = sum(x.get(drange, 0.0) for x in aged_ranges) |
|
||||
return totals |
|
||||
|
|
||||
def compute_percents(self, totals): |
|
||||
percents = {} |
|
||||
base = totals['balance'] or 1.0 |
|
||||
for drange in RANGES: |
|
||||
percents[drange] = (totals[drange] / base) * 100.0 |
|
||||
return percents |
|
||||
|
|
||||
def get_reconcile_count_lookup(self, lines): |
|
||||
"""Compute an lookup dict |
|
||||
|
|
||||
It contains has partial reconcile id as key and the count of lines |
|
||||
related to the reconcile id |
|
||||
|
|
||||
:param: a list of ledger lines generated by parent |
|
||||
:class:`.open_invoices.PartnersOpenInvoicesWebkit` |
|
||||
|
|
||||
:retuns: lookup dict {ṛec_id: count} |
|
||||
|
|
||||
""" |
|
||||
# possible bang if l_ids is really long. |
|
||||
# We have the same weakness in common_report ... |
|
||||
# but it seems not really possible for a partner |
|
||||
# So I'll keep that option. |
|
||||
l_ids = tuple(x['id'] for x in lines) |
|
||||
sql = ("SELECT reconcile_partial_id, COUNT(*) FROM account_move_line" |
|
||||
" WHERE reconcile_partial_id IS NOT NULL" |
|
||||
" AND id in %s" |
|
||||
" GROUP BY reconcile_partial_id") |
|
||||
self.cr.execute(sql, (l_ids,)) |
|
||||
res = self.cr.fetchall() |
|
||||
return dict((x[0], x[1]) for x in res) |
|
||||
|
|
||||
HeaderFooterTextWebKitParser( |
|
||||
'report.account.account_aged_trial_balance_webkit', |
|
||||
'account.account', |
|
||||
'addons/account_financial_report_webkit/report/templates/\ |
|
||||
aged_trial_webkit.mako', |
|
||||
parser=AccountAgedTrialBalanceWebkit, |
|
||||
) |
|
@ -1,355 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Author: Guewen Baconnier |
|
||||
# Copyright Camptocamp SA 2011 |
|
||||
# SQL inspired from OpenERP original code |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
from operator import add |
|
||||
|
|
||||
from .common_reports import CommonReportHeaderWebkit |
|
||||
|
|
||||
|
|
||||
class CommonBalanceReportHeaderWebkit(CommonReportHeaderWebkit): |
|
||||
|
|
||||
"""Define common helper for balance (trial balance, P&L, BS oriented |
|
||||
financial report""" |
|
||||
|
|
||||
def _get_numbers_display(self, data): |
|
||||
return self._get_form_param('numbers_display', data) |
|
||||
|
|
||||
@staticmethod |
|
||||
def find_key_by_value_in_list(dic, value): |
|
||||
return [key for key, val in dic.iteritems() if value in val][0] |
|
||||
|
|
||||
def _get_account_details(self, account_ids, target_move, fiscalyear, |
|
||||
main_filter, start, stop, initial_balance_mode, |
|
||||
context=None): |
|
||||
""" |
|
||||
Get details of accounts to display on the report |
|
||||
@param account_ids: ids of accounts to get details |
|
||||
@param target_move: selection filter for moves (all or posted) |
|
||||
@param fiscalyear: browse of the fiscalyear |
|
||||
@param main_filter: selection filter period / date or none |
|
||||
@param start: start date or start period browse instance |
|
||||
@param stop: stop date or stop period browse instance |
|
||||
@param initial_balance_mode: False: no calculation, |
|
||||
'opening_balance': from the opening period, |
|
||||
'initial_balance': computed from previous year / periods |
|
||||
@return: dict of list containing accounts details, keys are |
|
||||
the account ids |
|
||||
""" |
|
||||
if context is None: |
|
||||
context = {} |
|
||||
|
|
||||
account_obj = self.pool.get('account.account') |
|
||||
period_obj = self.pool.get('account.period') |
|
||||
use_period_ids = main_filter in ( |
|
||||
'filter_no', 'filter_period', 'filter_opening') |
|
||||
|
|
||||
if use_period_ids: |
|
||||
if main_filter == 'filter_opening': |
|
||||
period_ids = [start.id] |
|
||||
else: |
|
||||
period_ids = period_obj.build_ctx_periods( |
|
||||
self.cursor, self.uid, start.id, stop.id) |
|
||||
# never include the opening in the debit / credit amounts |
|
||||
period_ids = self.exclude_opening_periods(period_ids) |
|
||||
|
|
||||
init_balance = False |
|
||||
if initial_balance_mode == 'opening_balance': |
|
||||
init_balance = self._read_opening_balance(account_ids, start) |
|
||||
elif initial_balance_mode: |
|
||||
init_balance = self._compute_initial_balances( |
|
||||
account_ids, start, fiscalyear) |
|
||||
|
|
||||
ctx = context.copy() |
|
||||
ctx.update({'state': target_move, |
|
||||
'all_fiscalyear': True}) |
|
||||
|
|
||||
if use_period_ids: |
|
||||
ctx.update({'periods': period_ids}) |
|
||||
elif main_filter == 'filter_date': |
|
||||
ctx.update({'date_from': start, |
|
||||
'date_to': stop}) |
|
||||
|
|
||||
accounts = account_obj.read( |
|
||||
self.cursor, |
|
||||
self.uid, |
|
||||
account_ids, |
|
||||
['type', 'code', 'name', 'debit', 'credit', |
|
||||
'balance', 'parent_id', 'level', 'child_id'], |
|
||||
context=ctx) |
|
||||
|
|
||||
accounts_by_id = {} |
|
||||
for account in accounts: |
|
||||
if init_balance: |
|
||||
# sum for top level views accounts |
|
||||
child_ids = account_obj._get_children_and_consol( |
|
||||
self.cursor, self.uid, account['id'], ctx) |
|
||||
if child_ids: |
|
||||
child_init_balances = [ |
|
||||
init_bal['init_balance'] |
|
||||
for acnt_id, init_bal in init_balance.iteritems() |
|
||||
if acnt_id in child_ids] |
|
||||
top_init_balance = reduce(add, child_init_balances) |
|
||||
account['init_balance'] = top_init_balance |
|
||||
else: |
|
||||
account.update(init_balance[account['id']]) |
|
||||
account['balance'] = account['init_balance'] + \ |
|
||||
account['debit'] - account['credit'] |
|
||||
accounts_by_id[account['id']] = account |
|
||||
return accounts_by_id |
|
||||
|
|
||||
def _get_comparison_details(self, data, account_ids, target_move, |
|
||||
comparison_filter, index): |
|
||||
""" |
|
||||
|
|
||||
@param data: data of the wizard form |
|
||||
@param account_ids: ids of the accounts to get details |
|
||||
@param comparison_filter: selected filter on the form for |
|
||||
the comparison (filter_no, filter_year, filter_period, |
|
||||
filter_date) |
|
||||
@param index: index of the fields to get |
|
||||
(ie. comp1_fiscalyear_id where 1 is the index) |
|
||||
@return: dict of account details (key = account id) |
|
||||
""" |
|
||||
fiscalyear = self._get_info( |
|
||||
data, "comp%s_fiscalyear_id" % (index,), 'account.fiscalyear') |
|
||||
start_period = self._get_info( |
|
||||
data, "comp%s_period_from" % (index,), 'account.period') |
|
||||
stop_period = self._get_info( |
|
||||
data, "comp%s_period_to" % (index,), 'account.period') |
|
||||
start_date = self._get_form_param("comp%s_date_from" % (index,), data) |
|
||||
stop_date = self._get_form_param("comp%s_date_to" % (index,), data) |
|
||||
init_balance = self.is_initial_balance_enabled(comparison_filter) |
|
||||
|
|
||||
accounts_by_ids = {} |
|
||||
comp_params = {} |
|
||||
details_filter = comparison_filter |
|
||||
if comparison_filter != 'filter_no': |
|
||||
start_period, stop_period, start, stop = \ |
|
||||
self._get_start_stop_for_filter( |
|
||||
comparison_filter, fiscalyear, start_date, stop_date, |
|
||||
start_period, stop_period) |
|
||||
if comparison_filter == 'filter_year': |
|
||||
details_filter = 'filter_no' |
|
||||
|
|
||||
initial_balance_mode = init_balance \ |
|
||||
and self._get_initial_balance_mode(start) or False |
|
||||
accounts_by_ids = self._get_account_details( |
|
||||
account_ids, target_move, fiscalyear, details_filter, |
|
||||
start, stop, initial_balance_mode) |
|
||||
comp_params = { |
|
||||
'comparison_filter': comparison_filter, |
|
||||
'fiscalyear': fiscalyear, |
|
||||
'start': start, |
|
||||
'stop': stop, |
|
||||
'initial_balance': init_balance, |
|
||||
'initial_balance_mode': initial_balance_mode, |
|
||||
} |
|
||||
|
|
||||
return accounts_by_ids, comp_params |
|
||||
|
|
||||
def _get_diff(self, balance, previous_balance): |
|
||||
""" |
|
||||
@param balance: current balance |
|
||||
@param previous_balance: last balance |
|
||||
@return: dict of form {'diff': difference, |
|
||||
'percent_diff': diff in percentage} |
|
||||
""" |
|
||||
diff = balance - previous_balance |
|
||||
|
|
||||
obj_precision = self.pool.get('decimal.precision') |
|
||||
precision = obj_precision.precision_get( |
|
||||
self.cursor, self.uid, 'Account') |
|
||||
# round previous balance with account precision to avoid big numbers |
|
||||
# if previous balance is 0.0000001 or a any very small number |
|
||||
if round(previous_balance, precision) == 0: |
|
||||
percent_diff = False |
|
||||
else: |
|
||||
percent_diff = round(diff / previous_balance * 100, precision) |
|
||||
|
|
||||
return {'diff': diff, 'percent_diff': percent_diff} |
|
||||
|
|
||||
def _comp_filters(self, data, comparison_number): |
|
||||
""" |
|
||||
@param data: data of the report |
|
||||
@param comparison_number: number of comparisons |
|
||||
@return: list of comparison filters, nb of comparisons used and |
|
||||
comparison mode (no_comparison, single, multiple) |
|
||||
""" |
|
||||
comp_filters = [] |
|
||||
for index in range(comparison_number): |
|
||||
comp_filters.append( |
|
||||
self._get_form_param("comp%s_filter" % (index,), data, |
|
||||
default='filter_no')) |
|
||||
|
|
||||
nb_comparisons = len( |
|
||||
[comp_filter for comp_filter in comp_filters |
|
||||
if comp_filter != 'filter_no']) |
|
||||
if not nb_comparisons: |
|
||||
comparison_mode = 'no_comparison' |
|
||||
elif nb_comparisons > 1: |
|
||||
comparison_mode = 'multiple' |
|
||||
else: |
|
||||
comparison_mode = 'single' |
|
||||
return comp_filters, nb_comparisons, comparison_mode |
|
||||
|
|
||||
def _get_start_stop_for_filter(self, main_filter, fiscalyear, start_date, |
|
||||
stop_date, start_period, stop_period): |
|
||||
if main_filter in ('filter_no', 'filter_year'): |
|
||||
start_period = self.get_first_fiscalyear_period(fiscalyear) |
|
||||
stop_period = self.get_last_fiscalyear_period(fiscalyear) |
|
||||
elif main_filter == 'filter_opening': |
|
||||
opening_period = self._get_st_fiscalyear_period( |
|
||||
fiscalyear, special=True) |
|
||||
start_period = stop_period = opening_period |
|
||||
if main_filter == 'filter_date': |
|
||||
start = start_date |
|
||||
stop = stop_date |
|
||||
else: |
|
||||
start = start_period |
|
||||
stop = stop_period |
|
||||
|
|
||||
return start_period, stop_period, start, stop |
|
||||
|
|
||||
def compute_balance_data(self, data, filter_report_type=None): |
|
||||
new_ids = data['form']['account_ids'] or data[ |
|
||||
'form']['chart_account_id'] |
|
||||
max_comparison = self._get_form_param( |
|
||||
'max_comparison', data, default=0) |
|
||||
main_filter = self._get_form_param('filter', data, default='filter_no') |
|
||||
|
|
||||
comp_filters, nb_comparisons, comparison_mode = self._comp_filters( |
|
||||
data, max_comparison) |
|
||||
|
|
||||
fiscalyear = self.get_fiscalyear_br(data) |
|
||||
|
|
||||
start_period = self.get_start_period_br(data) |
|
||||
stop_period = self.get_end_period_br(data) |
|
||||
|
|
||||
target_move = self._get_form_param('target_move', data, default='all') |
|
||||
start_date = self._get_form_param('date_from', data) |
|
||||
stop_date = self._get_form_param('date_to', data) |
|
||||
chart_account = self._get_chart_account_id_br(data) |
|
||||
|
|
||||
start_period, stop_period, start, stop = \ |
|
||||
self._get_start_stop_for_filter(main_filter, fiscalyear, |
|
||||
start_date, stop_date, |
|
||||
start_period, stop_period) |
|
||||
|
|
||||
init_balance = self.is_initial_balance_enabled(main_filter) |
|
||||
initial_balance_mode = init_balance and self._get_initial_balance_mode( |
|
||||
start) or False |
|
||||
|
|
||||
# Retrieving accounts |
|
||||
account_ids = self.get_all_accounts( |
|
||||
new_ids, only_type=filter_report_type) |
|
||||
|
|
||||
# get details for each accounts, total of debit / credit / balance |
|
||||
accounts_by_ids = self._get_account_details( |
|
||||
account_ids, target_move, fiscalyear, main_filter, start, stop, |
|
||||
initial_balance_mode) |
|
||||
|
|
||||
comparison_params = [] |
|
||||
comp_accounts_by_ids = [] |
|
||||
for index in range(max_comparison): |
|
||||
if comp_filters[index] != 'filter_no': |
|
||||
comparison_result, comp_params = self._get_comparison_details( |
|
||||
data, account_ids, target_move, comp_filters[index], index) |
|
||||
comparison_params.append(comp_params) |
|
||||
comp_accounts_by_ids.append(comparison_result) |
|
||||
|
|
||||
objects = self.pool.get('account.account').browse(self.cursor, |
|
||||
self.uid, |
|
||||
account_ids) |
|
||||
|
|
||||
to_display_accounts = dict.fromkeys(account_ids, True) |
|
||||
init_balance_accounts = dict.fromkeys(account_ids, False) |
|
||||
comparisons_accounts = dict.fromkeys(account_ids, []) |
|
||||
debit_accounts = dict.fromkeys(account_ids, False) |
|
||||
credit_accounts = dict.fromkeys(account_ids, False) |
|
||||
balance_accounts = dict.fromkeys(account_ids, False) |
|
||||
|
|
||||
for account in objects: |
|
||||
if not account.parent_id: # hide top level account |
|
||||
continue |
|
||||
if account.type == 'consolidation': |
|
||||
to_display_accounts.update( |
|
||||
dict([(a.id, False) for a in account.child_consol_ids])) |
|
||||
elif account.type == 'view': |
|
||||
to_display_accounts.update( |
|
||||
dict([(a.id, True) for a in account.child_id])) |
|
||||
debit_accounts[account.id] = \ |
|
||||
accounts_by_ids[account.id]['debit'] |
|
||||
credit_accounts[account.id] = \ |
|
||||
accounts_by_ids[account.id]['credit'] |
|
||||
balance_accounts[account.id] = \ |
|
||||
accounts_by_ids[account.id]['balance'] |
|
||||
init_balance_accounts[account.id] = \ |
|
||||
accounts_by_ids[account.id].get('init_balance', 0.0) |
|
||||
|
|
||||
# if any amount is != 0 in comparisons, we have to display the |
|
||||
# whole account |
|
||||
display_account = False |
|
||||
comp_accounts = [] |
|
||||
for comp_account_by_id in comp_accounts_by_ids: |
|
||||
values = comp_account_by_id.get(account.id) |
|
||||
values.update( |
|
||||
self._get_diff(account.balance, values['balance'])) |
|
||||
display_account = any((values.get('credit', 0.0), |
|
||||
values.get('debit', 0.0), |
|
||||
values.get('balance', 0.0), |
|
||||
values.get('init_balance', 0.0))) |
|
||||
comp_accounts.append(values) |
|
||||
comparisons_accounts[account.id] = comp_accounts |
|
||||
# we have to display the account if a comparison as an amount or |
|
||||
# if we have an amount in the main column |
|
||||
# we set it as a property to let the data in the report if someone |
|
||||
# want to use it in a custom report |
|
||||
display_account = display_account\ |
|
||||
or any((debit_accounts[account.id], |
|
||||
credit_accounts[account.id], |
|
||||
balance_accounts[account.id], |
|
||||
init_balance_accounts[account.id])) |
|
||||
to_display_accounts.update( |
|
||||
{account.id: display_account and |
|
||||
to_display_accounts[account.id]}) |
|
||||
|
|
||||
context_report_values = { |
|
||||
'fiscalyear': fiscalyear, |
|
||||
'start_date': start_date, |
|
||||
'stop_date': stop_date, |
|
||||
'start_period': start_period, |
|
||||
'stop_period': stop_period, |
|
||||
'chart_account': chart_account, |
|
||||
'comparison_mode': comparison_mode, |
|
||||
'nb_comparison': nb_comparisons, |
|
||||
'initial_balance': init_balance, |
|
||||
'initial_balance_mode': initial_balance_mode, |
|
||||
'comp_params': comparison_params, |
|
||||
'to_display_accounts': to_display_accounts, |
|
||||
'init_balance_accounts': init_balance_accounts, |
|
||||
'comparisons_accounts': comparisons_accounts, |
|
||||
'debit_accounts': debit_accounts, |
|
||||
'credit_accounts': credit_accounts, |
|
||||
'balance_accounts': balance_accounts, |
|
||||
} |
|
||||
|
|
||||
return objects, new_ids, context_report_values |
|
@ -1,359 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Author: Guewen Baconnier |
|
||||
# Copyright Camptocamp SA 2011 |
|
||||
# SQL inspired from OpenERP original code |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
from collections import defaultdict |
|
||||
from operator import add |
|
||||
|
|
||||
from .common_balance_reports import CommonBalanceReportHeaderWebkit |
|
||||
from .common_partner_reports import CommonPartnersReportHeaderWebkit |
|
||||
|
|
||||
|
|
||||
class CommonPartnerBalanceReportHeaderWebkit(CommonBalanceReportHeaderWebkit, |
|
||||
CommonPartnersReportHeaderWebkit): |
|
||||
|
|
||||
"""Define common helper for balance (trial balance, P&L, |
|
||||
BS oriented financial report""" |
|
||||
|
|
||||
def _get_account_partners_details(self, account_by_ids, main_filter, |
|
||||
target_move, start, stop, |
|
||||
initial_balance_mode, |
|
||||
partner_filter_ids=False): |
|
||||
res = {} |
|
||||
filter_from = False |
|
||||
if main_filter in ('filter_period', 'filter_no', 'filter_opening'): |
|
||||
filter_from = 'period' |
|
||||
elif main_filter == 'filter_date': |
|
||||
filter_from = 'date' |
|
||||
|
|
||||
partners_init_balances_by_ids = {} |
|
||||
for account_id, account_details in account_by_ids.iteritems(): |
|
||||
partners_init_balances_by_ids.update( |
|
||||
self._get_partners_initial_balances( |
|
||||
account_id, start, initial_balance_mode, |
|
||||
partner_filter_ids=partner_filter_ids, |
|
||||
# we'll never exclude reconciled entries in the legal |
|
||||
# reports |
|
||||
exclude_reconcile=False)) |
|
||||
opening_mode = 'exclude_opening' |
|
||||
if main_filter == 'filter_opening': |
|
||||
opening_mode = 'include_opening' |
|
||||
# get credit and debit for partner |
|
||||
details = self._get_partners_totals_account( |
|
||||
filter_from, |
|
||||
account_id, |
|
||||
start, |
|
||||
stop, |
|
||||
target_move, |
|
||||
partner_filter_ids=partner_filter_ids, |
|
||||
mode=opening_mode) |
|
||||
|
|
||||
# merge initial balances in partner details |
|
||||
if partners_init_balances_by_ids.get(account_id): |
|
||||
for partner_id, initial_balances in \ |
|
||||
partners_init_balances_by_ids[account_id].iteritems(): |
|
||||
if initial_balances.get('init_balance'): |
|
||||
details[partner_id].update( |
|
||||
{'init_balance': initial_balances['init_balance']}) |
|
||||
|
|
||||
# compute balance for the partner |
|
||||
for partner_id, partner_details in details.iteritems(): |
|
||||
details[partner_id]['balance'] = details[partner_id].\ |
|
||||
get('init_balance', 0.0) + \ |
|
||||
details[partner_id].get('debit', 0.0) - \ |
|
||||
details[partner_id].get('credit', 0.0) |
|
||||
res[account_id] = details |
|
||||
|
|
||||
return res |
|
||||
|
|
||||
def _get_partners_initial_balances(self, account_ids, start_period, |
|
||||
initial_balance_mode, |
|
||||
partner_filter_ids=None, |
|
||||
exclude_reconcile=False): |
|
||||
# we get the initial balance from the opening period (opening_balance) |
|
||||
# when the opening period is included in the start period and |
|
||||
# when there is at least one entry in the opening period. Otherwise we |
|
||||
# compute it from previous periods |
|
||||
if initial_balance_mode == 'opening_balance': |
|
||||
opening_period_selected = self.get_included_opening_period( |
|
||||
start_period) |
|
||||
res = self._compute_partners_initial_balances( |
|
||||
account_ids, start_period, partner_filter_ids, |
|
||||
force_period_ids=opening_period_selected, |
|
||||
exclude_reconcile=exclude_reconcile) |
|
||||
elif initial_balance_mode == 'initial_balance': |
|
||||
res = self._compute_partners_initial_balances( |
|
||||
account_ids, start_period, partner_filter_ids, |
|
||||
exclude_reconcile=exclude_reconcile) |
|
||||
else: |
|
||||
res = {} |
|
||||
return res |
|
||||
|
|
||||
def _get_partners_totals_account(self, filter_from, account_id, start, |
|
||||
stop, target_move, |
|
||||
partner_filter_ids=None, |
|
||||
mode='exclude_opening'): |
|
||||
final_res = defaultdict(dict) |
|
||||
|
|
||||
sql_select = """ |
|
||||
SELECT account_move_line.partner_id, |
|
||||
sum(account_move_line.debit) AS debit, |
|
||||
sum(account_move_line.credit) AS credit |
|
||||
FROM account_move_line""" |
|
||||
sql_joins = '' |
|
||||
sql_where = "WHERE account_move_line.account_id = %(account_id)s \ |
|
||||
AND account_move_line.state = 'valid' " |
|
||||
method = getattr(self, '_get_query_params_from_' + filter_from + 's') |
|
||||
sql_conditions, search_params = method(start, stop, mode=mode) |
|
||||
sql_where += sql_conditions |
|
||||
|
|
||||
if partner_filter_ids: |
|
||||
sql_where += " AND account_move_line.partner_id \ |
|
||||
in %(partner_ids)s" |
|
||||
search_params.update({'partner_ids': tuple(partner_filter_ids)}) |
|
||||
|
|
||||
if target_move == 'posted': |
|
||||
sql_joins += "INNER JOIN account_move \ |
|
||||
ON account_move_line.move_id = account_move.id" |
|
||||
sql_where += " AND account_move.state = %(target_move)s" |
|
||||
search_params.update({'target_move': target_move}) |
|
||||
|
|
||||
sql_groupby = "GROUP BY account_move_line.partner_id" |
|
||||
|
|
||||
search_params.update({'account_id': account_id}) |
|
||||
query = ' '.join((sql_select, sql_joins, sql_where, sql_groupby)) |
|
||||
|
|
||||
self.cursor.execute(query, search_params) |
|
||||
res = self.cursor.dictfetchall() |
|
||||
if res: |
|
||||
for row in res: |
|
||||
final_res[row['partner_id']] = row |
|
||||
return final_res |
|
||||
|
|
||||
def _get_filter_type(self, result_selection): |
|
||||
filter_type = ('payable', 'receivable') |
|
||||
if result_selection == 'customer': |
|
||||
filter_type = ('receivable',) |
|
||||
if result_selection == 'supplier': |
|
||||
filter_type = ('payable',) |
|
||||
return filter_type |
|
||||
|
|
||||
def _get_partners_comparison_details(self, data, account_ids, target_move, |
|
||||
comparison_filter, index, |
|
||||
partner_filter_ids=False): |
|
||||
""" |
|
||||
|
|
||||
@param data: data of the wizard form |
|
||||
@param account_ids: ids of the accounts to get details |
|
||||
@param comparison_filter: selected filter on the form for |
|
||||
the comparison (filter_no, filter_year, filter_period, filter_date) |
|
||||
@param index: index of the fields to get (ie. comp1_fiscalyear_id |
|
||||
where 1 is the index) |
|
||||
@param partner_filter_ids: list of ids of partners to select |
|
||||
@return: dict of account details (key = account id) |
|
||||
""" |
|
||||
fiscalyear = self._get_info( |
|
||||
data, "comp%s_fiscalyear_id" % (index,), 'account.fiscalyear') |
|
||||
start_period = self._get_info( |
|
||||
data, "comp%s_period_from" % (index,), 'account.period') |
|
||||
stop_period = self._get_info( |
|
||||
data, "comp%s_period_to" % (index,), 'account.period') |
|
||||
start_date = self._get_form_param("comp%s_date_from" % (index,), data) |
|
||||
stop_date = self._get_form_param("comp%s_date_to" % (index,), data) |
|
||||
init_balance = self.is_initial_balance_enabled(comparison_filter) |
|
||||
|
|
||||
comp_params = {} |
|
||||
accounts_details_by_ids = defaultdict(dict) |
|
||||
if comparison_filter != 'filter_no': |
|
||||
start_period, stop_period, start, stop = \ |
|
||||
self._get_start_stop_for_filter( |
|
||||
comparison_filter, fiscalyear, start_date, stop_date, |
|
||||
start_period, stop_period) |
|
||||
details_filter = comparison_filter |
|
||||
if comparison_filter == 'filter_year': |
|
||||
details_filter = 'filter_no' |
|
||||
|
|
||||
initial_balance_mode = init_balance \ |
|
||||
and self._get_initial_balance_mode(start) or False |
|
||||
|
|
||||
accounts_by_ids = self._get_account_details( |
|
||||
account_ids, target_move, fiscalyear, details_filter, start, |
|
||||
stop, initial_balance_mode) |
|
||||
|
|
||||
partner_details_by_ids = self._get_account_partners_details( |
|
||||
accounts_by_ids, details_filter, |
|
||||
target_move, start, stop, initial_balance_mode, |
|
||||
partner_filter_ids=partner_filter_ids) |
|
||||
|
|
||||
for account_id in account_ids: |
|
||||
accounts_details_by_ids[account_id][ |
|
||||
'account'] = accounts_by_ids[account_id] |
|
||||
accounts_details_by_ids[account_id][ |
|
||||
'partners_amounts'] = partner_details_by_ids[account_id] |
|
||||
|
|
||||
comp_params = { |
|
||||
'comparison_filter': comparison_filter, |
|
||||
'fiscalyear': fiscalyear, |
|
||||
'start': start, |
|
||||
'stop': stop, |
|
||||
'initial_balance_mode': initial_balance_mode, |
|
||||
} |
|
||||
|
|
||||
return accounts_details_by_ids, comp_params |
|
||||
|
|
||||
def compute_partner_balance_data(self, data, filter_report_type=None): |
|
||||
new_ids = data['form']['account_ids'] or data[ |
|
||||
'form']['chart_account_id'] |
|
||||
max_comparison = self._get_form_param( |
|
||||
'max_comparison', data, default=0) |
|
||||
main_filter = self._get_form_param('filter', data, default='filter_no') |
|
||||
|
|
||||
comp_filters, nb_comparisons, comparison_mode = self._comp_filters( |
|
||||
data, max_comparison) |
|
||||
|
|
||||
fiscalyear = self.get_fiscalyear_br(data) |
|
||||
|
|
||||
start_period = self.get_start_period_br(data) |
|
||||
stop_period = self.get_end_period_br(data) |
|
||||
target_move = self._get_form_param('target_move', data, default='all') |
|
||||
start_date = self._get_form_param('date_from', data) |
|
||||
stop_date = self._get_form_param('date_to', data) |
|
||||
chart_account = self._get_chart_account_id_br(data) |
|
||||
result_selection = self._get_form_param('result_selection', data) |
|
||||
partner_ids = self._get_form_param('partner_ids', data) |
|
||||
|
|
||||
filter_type = self._get_filter_type(result_selection) |
|
||||
|
|
||||
start_period, stop_period, start, stop = \ |
|
||||
self._get_start_stop_for_filter( |
|
||||
main_filter, fiscalyear, start_date, stop_date, start_period, |
|
||||
stop_period) |
|
||||
|
|
||||
initial_balance = self.is_initial_balance_enabled(main_filter) |
|
||||
initial_balance_mode = initial_balance \ |
|
||||
and self._get_initial_balance_mode(start) or False |
|
||||
|
|
||||
# Retrieving accounts |
|
||||
account_ids = self.get_all_accounts( |
|
||||
new_ids, only_type=filter_type, |
|
||||
filter_report_type=filter_report_type) |
|
||||
|
|
||||
# get details for each accounts, total of debit / credit / balance |
|
||||
accounts_by_ids = self._get_account_details( |
|
||||
account_ids, target_move, fiscalyear, main_filter, start, stop, |
|
||||
initial_balance_mode) |
|
||||
|
|
||||
partner_details_by_ids = self._get_account_partners_details( |
|
||||
accounts_by_ids, main_filter, target_move, start, stop, |
|
||||
initial_balance_mode, partner_filter_ids=partner_ids) |
|
||||
|
|
||||
comparison_params = [] |
|
||||
comp_accounts_by_ids = [] |
|
||||
for index in range(max_comparison): |
|
||||
if comp_filters[index] != 'filter_no': |
|
||||
comparison_result, comp_params = self.\ |
|
||||
_get_partners_comparison_details( |
|
||||
data, account_ids, |
|
||||
target_move, |
|
||||
comp_filters[index], |
|
||||
index, |
|
||||
partner_filter_ids=partner_ids) |
|
||||
comparison_params.append(comp_params) |
|
||||
comp_accounts_by_ids.append(comparison_result) |
|
||||
objects = self.pool.get('account.account').browse(self.cursor, |
|
||||
self.uid, |
|
||||
account_ids) |
|
||||
|
|
||||
init_balance_accounts = {} |
|
||||
comparisons_accounts = {} |
|
||||
partners_order_accounts = {} |
|
||||
partners_amounts_accounts = {} |
|
||||
debit_accounts = {} |
|
||||
credit_accounts = {} |
|
||||
balance_accounts = {} |
|
||||
|
|
||||
for account in objects: |
|
||||
if not account.parent_id: # hide top level account |
|
||||
continue |
|
||||
debit_accounts[account.id] = accounts_by_ids[account.id]['debit'] |
|
||||
credit_accounts[account.id] = accounts_by_ids[account.id]['credit'] |
|
||||
balance_accounts[account.id] = \ |
|
||||
accounts_by_ids[account.id]['balance'] |
|
||||
init_balance_accounts[account.id] = accounts_by_ids[ |
|
||||
account.id].get('init_balance', 0.0) |
|
||||
partners_amounts_accounts[account.id] =\ |
|
||||
partner_details_by_ids[account.id] |
|
||||
comp_accounts = [] |
|
||||
for comp_account_by_id in comp_accounts_by_ids: |
|
||||
values = comp_account_by_id.get(account.id) |
|
||||
|
|
||||
values['account'].update( |
|
||||
self._get_diff(account.balance, |
|
||||
values['account'].get('balance', 0.0))) |
|
||||
comp_accounts.append(values) |
|
||||
|
|
||||
for partner_id, partner_values in \ |
|
||||
values['partners_amounts'].copy().iteritems(): |
|
||||
partners_amounts_account =\ |
|
||||
partners_amounts_accounts[account.id] |
|
||||
base_partner_balance =\ |
|
||||
partners_amounts_account[partner_id]['balance']\ |
|
||||
if partners_amounts_accounts.get(account.id)\ |
|
||||
and partners_amounts_accounts.get(account.id)\ |
|
||||
.get(partner_id) else 0.0 |
|
||||
partner_values.update(self._get_diff( |
|
||||
base_partner_balance, |
|
||||
partner_values.get('balance', 0.0))) |
|
||||
values['partners_amounts'][ |
|
||||
partner_id].update(partner_values) |
|
||||
|
|
||||
comparisons_accounts[account.id] = comp_accounts |
|
||||
|
|
||||
all_partner_ids = reduce(add, [comp['partners_amounts'].keys() |
|
||||
for comp in comp_accounts], |
|
||||
partners_amounts_accounts[account.id] |
|
||||
.keys()) |
|
||||
|
|
||||
partners_order_accounts[account.id] = \ |
|
||||
self._order_partners(all_partner_ids) |
|
||||
|
|
||||
context_report_values = { |
|
||||
'fiscalyear': fiscalyear, |
|
||||
'start_date': start_date, |
|
||||
'stop_date': stop_date, |
|
||||
'start_period': start_period, |
|
||||
'stop_period': stop_period, |
|
||||
'chart_account': chart_account, |
|
||||
'comparison_mode': comparison_mode, |
|
||||
'nb_comparison': nb_comparisons, |
|
||||
'comp_params': comparison_params, |
|
||||
'initial_balance_mode': initial_balance_mode, |
|
||||
'compute_diff': self._get_diff, |
|
||||
'init_balance_accounts': init_balance_accounts, |
|
||||
'comparisons_accounts': comparisons_accounts, |
|
||||
'partners_order_accounts': partners_order_accounts, |
|
||||
'partners_amounts_accounts': partners_amounts_accounts, |
|
||||
'debit_accounts': debit_accounts, |
|
||||
'credit_accounts': credit_accounts, |
|
||||
'balance_accounts': balance_accounts, |
|
||||
} |
|
||||
|
|
||||
return objects, new_ids, context_report_values |
|
@ -1,378 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Author: Nicolas Bessi, Guewen Baconnier |
|
||||
# Copyright Camptocamp SA 2011 |
|
||||
# SQL inspired from OpenERP original code |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
# TODO refactor helper in order to act more like mixin |
|
||||
# By using properties we will have a more simple signature in fuctions |
|
||||
|
|
||||
from collections import defaultdict |
|
||||
from datetime import datetime |
|
||||
|
|
||||
from openerp.tools import DEFAULT_SERVER_DATE_FORMAT |
|
||||
from .common_reports import CommonReportHeaderWebkit |
|
||||
|
|
||||
|
|
||||
class CommonPartnersReportHeaderWebkit(CommonReportHeaderWebkit): |
|
||||
|
|
||||
"""Define common helper for partner oriented financial report""" |
|
||||
|
|
||||
###################################### |
|
||||
# Account move line retrieval helper # |
|
||||
###################################### |
|
||||
|
|
||||
def get_partners_move_lines_ids(self, account_id, main_filter, start, stop, |
|
||||
target_move, |
|
||||
exclude_reconcile=False, |
|
||||
partner_filter=False): |
|
||||
filter_from = False |
|
||||
if main_filter in ('filter_period', 'filter_no'): |
|
||||
filter_from = 'period' |
|
||||
elif main_filter == 'filter_date': |
|
||||
filter_from = 'date' |
|
||||
if filter_from: |
|
||||
return self._get_partners_move_line_ids( |
|
||||
filter_from, account_id, start, stop, target_move, |
|
||||
exclude_reconcile=exclude_reconcile, |
|
||||
partner_filter=partner_filter) |
|
||||
|
|
||||
def _get_first_special_period(self): |
|
||||
""" |
|
||||
Returns the browse record of the period with the `special` flag, which |
|
||||
is the special period of the first fiscal year used in the accounting. |
|
||||
|
|
||||
i.e. it searches the first fiscal year with at least one journal entry, |
|
||||
and it returns the id of the first period for which `special` is True |
|
||||
in this fiscal year. |
|
||||
|
|
||||
It is used for example in the partners reports, where we have to |
|
||||
include the first, and only the first opening period. |
|
||||
|
|
||||
:return: browse record of the first special period. |
|
||||
""" |
|
||||
move_line_obj = self.pool.get('account.move.line') |
|
||||
first_entry_id = move_line_obj.search( |
|
||||
self.cr, self.uid, [], order='date ASC', limit=1) |
|
||||
# it means there is no entry at all, that's unlikely to happen, but |
|
||||
# it may so |
|
||||
if not first_entry_id: |
|
||||
return |
|
||||
first_entry = move_line_obj.browse( |
|
||||
self.cr, self.uid, first_entry_id[0]) |
|
||||
fiscalyear = first_entry.period_id.fiscalyear_id |
|
||||
special_periods = [ |
|
||||
period for period in fiscalyear.period_ids if period.special] |
|
||||
# so, we have no opening period on the first year, nothing to return |
|
||||
if not special_periods: |
|
||||
return |
|
||||
return min(special_periods, |
|
||||
key=lambda p: datetime.strptime(p.date_start, |
|
||||
DEFAULT_SERVER_DATE_FORMAT)) |
|
||||
|
|
||||
def _get_period_range_from_start_period(self, start_period, |
|
||||
include_opening=False, |
|
||||
fiscalyear=False, |
|
||||
stop_at_previous_opening=False): |
|
||||
"""We retrieve all periods before start period""" |
|
||||
periods = super(CommonPartnersReportHeaderWebkit, self).\ |
|
||||
_get_period_range_from_start_period( |
|
||||
start_period, |
|
||||
include_opening=include_opening, |
|
||||
fiscalyear=fiscalyear, |
|
||||
stop_at_previous_opening=stop_at_previous_opening) |
|
||||
first_special = self._get_first_special_period() |
|
||||
if first_special and first_special.id not in periods: |
|
||||
periods.append(first_special.id) |
|
||||
return periods |
|
||||
|
|
||||
def _get_query_params_from_periods(self, period_start, period_stop, |
|
||||
mode='exclude_opening'): |
|
||||
""" |
|
||||
Build the part of the sql "where clause" which filters on the selected |
|
||||
periods. |
|
||||
|
|
||||
:param browse_record period_start: first period of the report to print |
|
||||
:param browse_record period_stop: last period of the report to print |
|
||||
:param str mode: deprecated |
|
||||
""" |
|
||||
# we do not want opening period so we exclude opening |
|
||||
periods = self.pool.get('account.period').build_ctx_periods( |
|
||||
self.cr, self.uid, period_start.id, period_stop.id) |
|
||||
if not periods: |
|
||||
return [] |
|
||||
|
|
||||
if mode != 'include_opening': |
|
||||
periods = self.exclude_opening_periods(periods) |
|
||||
|
|
||||
search_params = {'period_ids': tuple(periods), |
|
||||
'date_stop': period_stop.date_stop} |
|
||||
|
|
||||
sql_conditions = "" |
|
||||
if periods: |
|
||||
sql_conditions = " AND account_move_line.period_id in \ |
|
||||
%(period_ids)s" |
|
||||
|
|
||||
return sql_conditions, search_params |
|
||||
|
|
||||
def _get_query_params_from_dates(self, date_start, date_stop, **args): |
|
||||
""" |
|
||||
Build the part of the sql where clause based on the dates to print. |
|
||||
|
|
||||
:param str date_start: start date of the report to print |
|
||||
:param str date_stop: end date of the report to print |
|
||||
""" |
|
||||
|
|
||||
periods = self._get_opening_periods() |
|
||||
if not periods: |
|
||||
periods = (-1,) |
|
||||
|
|
||||
search_params = {'period_ids': tuple(periods), |
|
||||
'date_start': date_start, |
|
||||
'date_stop': date_stop} |
|
||||
|
|
||||
sql_conditions = " AND account_move_line.period_id not \ |
|
||||
in %(period_ids)s \ |
|
||||
AND account_move_line.date between \ |
|
||||
date(%(date_start)s) and date((%(date_stop)s))" |
|
||||
|
|
||||
return sql_conditions, search_params |
|
||||
|
|
||||
def _get_partners_move_line_ids(self, filter_from, account_id, start, stop, |
|
||||
target_move, |
|
||||
opening_mode='exclude_opening', |
|
||||
exclude_reconcile=False, |
|
||||
partner_filter=None): |
|
||||
""" |
|
||||
|
|
||||
:param str filter_from: "periods" or "dates" |
|
||||
:param int account_id: id of the account where to search move lines |
|
||||
:param str or browse_record start: start date or start period |
|
||||
:param str or browse_record stop: stop date or stop period |
|
||||
:param str target_move: 'posted' or 'all' |
|
||||
:param opening_mode: deprecated |
|
||||
:param boolean exclude_reconcile: wether the reconciled entries are |
|
||||
filtred or not |
|
||||
:param list partner_filter: list of partner ids, will filter on their |
|
||||
move lines |
|
||||
""" |
|
||||
|
|
||||
final_res = defaultdict(list) |
|
||||
|
|
||||
sql_select = "SELECT account_move_line.id, \ |
|
||||
account_move_line.partner_id FROM account_move_line" |
|
||||
sql_joins = '' |
|
||||
sql_where = " WHERE account_move_line.account_id = %(account_ids)s " \ |
|
||||
" AND account_move_line.state = 'valid' " |
|
||||
|
|
||||
method = getattr(self, '_get_query_params_from_' + filter_from + 's') |
|
||||
sql_conditions, search_params = method(start, stop) |
|
||||
|
|
||||
sql_where += sql_conditions |
|
||||
|
|
||||
if exclude_reconcile: |
|
||||
sql_where += (" AND ((account_move_line.reconcile_id IS NULL)" |
|
||||
" OR (account_move_line.reconcile_id IS NOT NULL \ |
|
||||
AND account_move_line.last_rec_date > \ |
|
||||
date(%(date_stop)s)))") |
|
||||
|
|
||||
if partner_filter: |
|
||||
sql_where += " AND account_move_line.partner_id \ |
|
||||
in %(partner_ids)s" |
|
||||
|
|
||||
if target_move == 'posted': |
|
||||
sql_joins += "INNER JOIN account_move \ |
|
||||
ON account_move_line.move_id = account_move.id" |
|
||||
sql_where += " AND account_move.state = %(target_move)s" |
|
||||
search_params.update({'target_move': target_move}) |
|
||||
|
|
||||
search_params.update({ |
|
||||
'account_ids': account_id, |
|
||||
'partner_ids': tuple(partner_filter), |
|
||||
}) |
|
||||
|
|
||||
sql = ' '.join((sql_select, sql_joins, sql_where)) |
|
||||
self.cursor.execute(sql, search_params) |
|
||||
res = self.cursor.dictfetchall() |
|
||||
if res: |
|
||||
for row in res: |
|
||||
final_res[row['partner_id']].append(row['id']) |
|
||||
return final_res |
|
||||
|
|
||||
def _get_clearance_move_line_ids(self, move_line_ids, date_stop, |
|
||||
date_until): |
|
||||
if not move_line_ids: |
|
||||
return [] |
|
||||
move_line_obj = self.pool.get('account.move.line') |
|
||||
# we do not use orm in order to gain perfo |
|
||||
# In this case I have to test the effective gain over an itteration |
|
||||
# Actually ORM does not allows distinct behavior |
|
||||
sql = "Select distinct reconcile_id from account_move_line \ |
|
||||
where id in %s" |
|
||||
self.cursor.execute(sql, (tuple(move_line_ids),)) |
|
||||
rec_ids = self.cursor.fetchall() |
|
||||
if rec_ids: |
|
||||
rec_ids = [x[0] for x in rec_ids] |
|
||||
l_ids = move_line_obj.search(self.cursor, |
|
||||
self.uid, |
|
||||
[('reconcile_id', 'in', rec_ids), |
|
||||
('date', '>=', date_stop), |
|
||||
('date', '<=', date_until)]) |
|
||||
return l_ids |
|
||||
else: |
|
||||
return [] |
|
||||
|
|
||||
############################################## |
|
||||
# Initial Partner Balance helper # |
|
||||
############################################## |
|
||||
|
|
||||
def _tree_move_line_ids(self, move_lines_data, key=None): |
|
||||
""" |
|
||||
move_lines_data must be a list of dict which contains at least keys : |
|
||||
- account_id |
|
||||
- partner_id |
|
||||
- other keys with values of the line |
|
||||
- if param key is defined, only this key will be inserted in the tree |
|
||||
returns a tree like |
|
||||
res[account_id.1][partner_id.1][move_line.1, |
|
||||
move_line.2] |
|
||||
[partner_id.2][move_line.3] |
|
||||
res[account_id.2][partner_id.1][move_line.4] |
|
||||
""" |
|
||||
res = defaultdict(dict) |
|
||||
for row in move_lines_data[:]: |
|
||||
account_id = row.pop('account_id') |
|
||||
partner_id = row.pop('partner_id') |
|
||||
if key: |
|
||||
res[account_id].setdefault(partner_id, []).append(row[key]) |
|
||||
else: |
|
||||
res[account_id][partner_id] = row |
|
||||
return res |
|
||||
|
|
||||
def _partners_initial_balance_line_ids(self, account_ids, start_period, |
|
||||
partner_filter, |
|
||||
exclude_reconcile=False, |
|
||||
force_period_ids=False, |
|
||||
date_stop=None): |
|
||||
# take ALL previous periods |
|
||||
period_ids = force_period_ids \ |
|
||||
if force_period_ids \ |
|
||||
else self._get_period_range_from_start_period( |
|
||||
start_period, fiscalyear=False, include_opening=False) |
|
||||
|
|
||||
if not period_ids: |
|
||||
period_ids = [-1] |
|
||||
search_param = { |
|
||||
'date_start': start_period.date_start, |
|
||||
'period_ids': tuple(period_ids), |
|
||||
'account_ids': tuple(account_ids), |
|
||||
} |
|
||||
sql = ("SELECT ml.id, ml.account_id, ml.partner_id " |
|
||||
"FROM account_move_line ml " |
|
||||
"INNER JOIN account_account a " |
|
||||
"ON a.id = ml.account_id " |
|
||||
"WHERE ml.period_id in %(period_ids)s " |
|
||||
"AND ml.account_id in %(account_ids)s ") |
|
||||
if exclude_reconcile: |
|
||||
if not date_stop: |
|
||||
raise Exception( |
|
||||
"Missing \"date_stop\" to compute the open invoices.") |
|
||||
search_param.update({'date_stop': date_stop}) |
|
||||
sql += ("AND ((ml.reconcile_id IS NULL) " |
|
||||
"OR (ml.reconcile_id IS NOT NULL \ |
|
||||
AND ml.last_rec_date > date(%(date_stop)s))) ") |
|
||||
if partner_filter: |
|
||||
sql += "AND ml.partner_id in %(partner_ids)s " |
|
||||
search_param.update({'partner_ids': tuple(partner_filter)}) |
|
||||
|
|
||||
self.cursor.execute(sql, search_param) |
|
||||
return self.cursor.dictfetchall() |
|
||||
|
|
||||
def _compute_partners_initial_balances(self, account_ids, start_period, |
|
||||
partner_filter=None, |
|
||||
exclude_reconcile=False, |
|
||||
force_period_ids=False): |
|
||||
"""We compute initial balance. |
|
||||
If form is filtered by date all initial balance are equal to 0 |
|
||||
This function will sum pear and apple in currency amount if account |
|
||||
as no secondary currency""" |
|
||||
if isinstance(account_ids, (int, long)): |
|
||||
account_ids = [account_ids] |
|
||||
move_line_ids = self._partners_initial_balance_line_ids( |
|
||||
account_ids, start_period, partner_filter, |
|
||||
exclude_reconcile=exclude_reconcile, |
|
||||
force_period_ids=force_period_ids) |
|
||||
if not move_line_ids: |
|
||||
move_line_ids = [{'id': -1}] |
|
||||
sql = ("SELECT ml.account_id, ml.partner_id," |
|
||||
" sum(ml.debit) as debit, sum(ml.credit) as credit," |
|
||||
" sum(ml.debit-ml.credit) as init_balance," |
|
||||
" CASE WHEN a.currency_id ISNULL THEN 0.0\ |
|
||||
ELSE sum(ml.amount_currency) \ |
|
||||
END as init_balance_currency, " |
|
||||
" c.name as currency_name " |
|
||||
"FROM account_move_line ml " |
|
||||
"INNER JOIN account_account a " |
|
||||
"ON a.id = ml.account_id " |
|
||||
"LEFT JOIN res_currency c " |
|
||||
"ON c.id = a.currency_id " |
|
||||
"WHERE ml.id in %(move_line_ids)s " |
|
||||
"GROUP BY ml.account_id, ml.partner_id, a.currency_id, c.name") |
|
||||
search_param = { |
|
||||
'move_line_ids': tuple([move_line['id'] for move_line in |
|
||||
move_line_ids])} |
|
||||
self.cursor.execute(sql, search_param) |
|
||||
res = self.cursor.dictfetchall() |
|
||||
return self._tree_move_line_ids(res) |
|
||||
|
|
||||
############################################################ |
|
||||
# Partner specific helper # |
|
||||
############################################################ |
|
||||
|
|
||||
def _order_partners(self, *args): |
|
||||
"""We get the partner linked to all current accounts that are used. |
|
||||
We also use ensure that partner are ordered by name |
|
||||
args must be list""" |
|
||||
res = [] |
|
||||
partner_ids = [] |
|
||||
for arg in args: |
|
||||
if arg: |
|
||||
partner_ids += arg |
|
||||
if not partner_ids: |
|
||||
return [] |
|
||||
|
|
||||
existing_partner_ids = [ |
|
||||
partner_id for partner_id in partner_ids if partner_id] |
|
||||
if existing_partner_ids: |
|
||||
# We may use orm here as the performance optimization is not that |
|
||||
# big |
|
||||
sql = ("SELECT name|| ' ' ||CASE WHEN ref IS NOT NULL \ |
|
||||
THEN '('||ref||')' \ |
|
||||
ELSE '' END, id, ref, name" |
|
||||
" FROM res_partner \ |
|
||||
WHERE id IN %s ORDER BY LOWER(name), ref") |
|
||||
self.cursor.execute(sql, (tuple(set(existing_partner_ids)),)) |
|
||||
res = self.cursor.fetchall() |
|
||||
|
|
||||
# move lines without partners, set None for empty partner |
|
||||
if not all(partner_ids): |
|
||||
res.append((None, None, None, None)) |
|
||||
|
|
||||
if not res: |
|
||||
return [] |
|
||||
return res |
|
@ -1,600 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Author: Nicolas Bessi, Guewen Baconnier |
|
||||
# Copyright Camptocamp SA 2011 |
|
||||
# SQL inspired from OpenERP original code |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
# TODO refactor helper in order to act more like mixin |
|
||||
# By using properties we will have a more simple signature in fuctions |
|
||||
|
|
||||
import logging |
|
||||
|
|
||||
from openerp.osv import osv |
|
||||
from openerp.tools.translate import _ |
|
||||
from openerp.addons.account.report.common_report_header \ |
|
||||
import common_report_header |
|
||||
|
|
||||
_logger = logging.getLogger('financial.reports.webkit') |
|
||||
|
|
||||
MAX_MONSTER_SLICE = 50000 |
|
||||
|
|
||||
|
|
||||
class CommonReportHeaderWebkit(common_report_header): |
|
||||
|
|
||||
"""Define common helper for financial report""" |
|
||||
|
|
||||
###################################################################### |
|
||||
# From getter helper # |
|
||||
###################################################################### |
|
||||
|
|
||||
def get_start_period_br(self, data): |
|
||||
return self._get_info(data, 'period_from', 'account.period') |
|
||||
|
|
||||
def get_end_period_br(self, data): |
|
||||
return self._get_info(data, 'period_to', 'account.period') |
|
||||
|
|
||||
def get_fiscalyear_br(self, data): |
|
||||
return self._get_info(data, 'fiscalyear_id', 'account.fiscalyear') |
|
||||
|
|
||||
def _get_chart_account_id_br(self, data): |
|
||||
return self._get_info(data, 'chart_account_id', 'account.account') |
|
||||
|
|
||||
def _get_accounts_br(self, data): |
|
||||
return self._get_info(data, 'account_ids', 'account.account') |
|
||||
|
|
||||
def _get_info(self, data, field, model): |
|
||||
info = data.get('form', {}).get(field) |
|
||||
if info: |
|
||||
return self.pool.get(model).browse(self.cursor, self.uid, info) |
|
||||
return False |
|
||||
|
|
||||
def _get_journals_br(self, data): |
|
||||
return self._get_info(data, 'journal_ids', 'account.journal') |
|
||||
|
|
||||
def _get_display_account(self, data): |
|
||||
val = self._get_form_param('display_account', data) |
|
||||
if val == 'bal_all': |
|
||||
return _('All accounts') |
|
||||
elif val == 'bal_mix': |
|
||||
return _('With transactions or non zero balance') |
|
||||
else: |
|
||||
return val |
|
||||
|
|
||||
def _get_display_partner_account(self, data): |
|
||||
val = self._get_form_param('result_selection', data) |
|
||||
if val == 'customer': |
|
||||
return _('Receivable Accounts') |
|
||||
elif val == 'supplier': |
|
||||
return _('Payable Accounts') |
|
||||
elif val == 'customer_supplier': |
|
||||
return _('Receivable and Payable Accounts') |
|
||||
else: |
|
||||
return val |
|
||||
|
|
||||
def _get_display_target_move(self, data): |
|
||||
val = self._get_form_param('target_move', data) |
|
||||
if val == 'posted': |
|
||||
return _('All Posted Entries') |
|
||||
elif val == 'all': |
|
||||
return _('All Entries') |
|
||||
else: |
|
||||
return val |
|
||||
|
|
||||
def _get_display_account_raw(self, data): |
|
||||
return self._get_form_param('display_account', data) |
|
||||
|
|
||||
def _get_filter(self, data): |
|
||||
return self._get_form_param('filter', data) |
|
||||
|
|
||||
def _get_target_move(self, data): |
|
||||
return self._get_form_param('target_move', data) |
|
||||
|
|
||||
def _get_initial_balance(self, data): |
|
||||
return self._get_form_param('initial_balance', data) |
|
||||
|
|
||||
def _get_amount_currency(self, data): |
|
||||
return self._get_form_param('amount_currency', data) |
|
||||
|
|
||||
def _get_date_from(self, data): |
|
||||
return self._get_form_param('date_from', data) |
|
||||
|
|
||||
def _get_date_to(self, data): |
|
||||
return self._get_form_param('date_to', data) |
|
||||
|
|
||||
def _get_form_param(self, param, data, default=False): |
|
||||
return data.get('form', {}).get(param, default) |
|
||||
|
|
||||
############################################# |
|
||||
# Account and account line filter helper # |
|
||||
############################################# |
|
||||
|
|
||||
def sort_accounts_with_structure(self, root_account_ids, account_ids, |
|
||||
context=None): |
|
||||
"""Sort accounts by code respecting their structure""" |
|
||||
|
|
||||
def recursive_sort_by_code(accounts, parent): |
|
||||
sorted_accounts = [] |
|
||||
# add all accounts with same parent |
|
||||
level_accounts = [ |
|
||||
account for account in accounts |
|
||||
if account['parent_id'] and |
|
||||
account['parent_id'][0] == parent['id']] |
|
||||
# add consolidation children of parent, as they are logically on |
|
||||
# the same level |
|
||||
if parent.get('child_consol_ids'): |
|
||||
level_accounts.extend([account for account in accounts |
|
||||
if account['id'] |
|
||||
in parent['child_consol_ids']]) |
|
||||
# stop recursion if no children found |
|
||||
if not level_accounts: |
|
||||
return [] |
|
||||
|
|
||||
level_accounts = sorted(level_accounts, key=lambda a: a['code']) |
|
||||
|
|
||||
for level_account in level_accounts: |
|
||||
sorted_accounts.append(level_account['id']) |
|
||||
sorted_accounts.extend( |
|
||||
recursive_sort_by_code(accounts, parent=level_account)) |
|
||||
return sorted_accounts |
|
||||
|
|
||||
if not account_ids: |
|
||||
return [] |
|
||||
|
|
||||
accounts_data = self.pool.get('account.account').read( |
|
||||
self.cr, self.uid, account_ids, |
|
||||
['id', 'parent_id', 'level', 'code', 'child_consol_ids'], |
|
||||
context=context) |
|
||||
|
|
||||
sorted_accounts = [] |
|
||||
|
|
||||
root_accounts_data = [account_data for account_data in accounts_data |
|
||||
if account_data['id'] in root_account_ids] |
|
||||
for root_account_data in root_accounts_data: |
|
||||
sorted_accounts.append(root_account_data['id']) |
|
||||
sorted_accounts.extend( |
|
||||
recursive_sort_by_code(accounts_data, root_account_data)) |
|
||||
|
|
||||
# fallback to unsorted accounts when sort failed |
|
||||
# sort fails when the levels are miscalculated by account.account |
|
||||
# check lp:783670 |
|
||||
if len(sorted_accounts) != len(account_ids): |
|
||||
_logger.warn('Webkit financial reports: Sort of accounts failed.') |
|
||||
sorted_accounts = account_ids |
|
||||
|
|
||||
return sorted_accounts |
|
||||
|
|
||||
def get_all_accounts(self, account_ids, exclude_type=None, only_type=None, |
|
||||
filter_report_type=None, context=None): |
|
||||
"""Get all account passed in params with their childrens |
|
||||
|
|
||||
@param exclude_type: list of types to exclude (view, receivable, |
|
||||
payable, consolidation, other) |
|
||||
@param only_type: list of types to filter on (view, receivable, |
|
||||
payable, consolidation, other) |
|
||||
@param filter_report_type: list of report type to filter on |
|
||||
""" |
|
||||
context = context or {} |
|
||||
accounts = [] |
|
||||
if not isinstance(account_ids, list): |
|
||||
account_ids = [account_ids] |
|
||||
acc_obj = self.pool.get('account.account') |
|
||||
for account_id in account_ids: |
|
||||
accounts.append(account_id) |
|
||||
accounts += acc_obj._get_children_and_consol( |
|
||||
self.cursor, self.uid, account_id, context=context) |
|
||||
res_ids = list(set(accounts)) |
|
||||
res_ids = self.sort_accounts_with_structure( |
|
||||
account_ids, res_ids, context=context) |
|
||||
|
|
||||
if exclude_type or only_type or filter_report_type: |
|
||||
sql_filters = {'ids': tuple(res_ids)} |
|
||||
sql_select = "SELECT a.id FROM account_account a" |
|
||||
sql_join = "" |
|
||||
sql_where = "WHERE a.id IN %(ids)s" |
|
||||
if exclude_type: |
|
||||
sql_where += " AND a.type not in %(exclude_type)s" |
|
||||
sql_filters.update({'exclude_type': tuple(exclude_type)}) |
|
||||
if only_type: |
|
||||
sql_where += " AND a.type IN %(only_type)s" |
|
||||
sql_filters.update({'only_type': tuple(only_type)}) |
|
||||
if filter_report_type: |
|
||||
sql_join += "INNER JOIN account_account_type t" \ |
|
||||
" ON t.id = a.user_type" |
|
||||
sql_join += " AND t.report_type IN %(report_type)s" |
|
||||
sql_filters.update({'report_type': tuple(filter_report_type)}) |
|
||||
|
|
||||
sql = ' '.join((sql_select, sql_join, sql_where)) |
|
||||
self.cursor.execute(sql, sql_filters) |
|
||||
fetch_only_ids = self.cursor.fetchall() |
|
||||
if not fetch_only_ids: |
|
||||
return [] |
|
||||
only_ids = [only_id[0] for only_id in fetch_only_ids] |
|
||||
# keep sorting but filter ids |
|
||||
res_ids = [res_id for res_id in res_ids if res_id in only_ids] |
|
||||
return res_ids |
|
||||
|
|
||||
########################################## |
|
||||
# Periods and fiscal years helper # |
|
||||
########################################## |
|
||||
|
|
||||
def _get_opening_periods(self): |
|
||||
"""Return the list of all journal that can be use to create opening |
|
||||
entries. |
|
||||
We actually filter on this instead of opening period as older version |
|
||||
of OpenERP did not have this notion""" |
|
||||
return self.pool.get('account.period').search(self.cursor, self.uid, |
|
||||
[('special', '=', True)]) |
|
||||
|
|
||||
def exclude_opening_periods(self, period_ids): |
|
||||
period_obj = self.pool.get('account.period') |
|
||||
return period_obj.search(self.cr, self.uid, [['special', '=', False], |
|
||||
['id', 'in', period_ids]]) |
|
||||
|
|
||||
def get_included_opening_period(self, period): |
|
||||
"""Return the opening included in normal period we use the assumption |
|
||||
that there is only one opening period per fiscal year""" |
|
||||
period_obj = self.pool.get('account.period') |
|
||||
return period_obj.search(self.cursor, self.uid, |
|
||||
[('special', '=', True), |
|
||||
('date_start', '>=', period.date_start), |
|
||||
('date_stop', '<=', period.date_stop), |
|
||||
('company_id', '=', period.company_id.id)], |
|
||||
limit=1) |
|
||||
|
|
||||
def periods_contains_move_lines(self, period_ids): |
|
||||
if not period_ids: |
|
||||
return False |
|
||||
mv_line_obj = self.pool.get('account.move.line') |
|
||||
if isinstance(period_ids, (int, long)): |
|
||||
period_ids = [period_ids] |
|
||||
return mv_line_obj.search(self.cursor, self.uid, |
|
||||
[('period_id', 'in', period_ids)], limit=1) \ |
|
||||
and True or False |
|
||||
|
|
||||
def _get_period_range_from_periods(self, start_period, stop_period, |
|
||||
mode=None): |
|
||||
""" |
|
||||
Deprecated. We have to use now the build_ctx_periods of period_obj |
|
||||
otherwise we'll have inconsistencies, because build_ctx_periods does |
|
||||
never filter on the the special |
|
||||
""" |
|
||||
period_obj = self.pool.get('account.period') |
|
||||
search_period = [('date_start', '>=', start_period.date_start), |
|
||||
('date_stop', '<=', stop_period.date_stop)] |
|
||||
|
|
||||
if mode == 'exclude_opening': |
|
||||
search_period += [('special', '=', False)] |
|
||||
res = period_obj.search(self.cursor, self.uid, search_period) |
|
||||
return res |
|
||||
|
|
||||
def _get_period_range_from_start_period(self, start_period, |
|
||||
include_opening=False, |
|
||||
fiscalyear=False, |
|
||||
stop_at_previous_opening=False): |
|
||||
"""We retrieve all periods before start period""" |
|
||||
opening_period_id = False |
|
||||
past_limit = [] |
|
||||
period_obj = self.pool.get('account.period') |
|
||||
mv_line_obj = self.pool.get('account.move.line') |
|
||||
# We look for previous opening period |
|
||||
if stop_at_previous_opening: |
|
||||
opening_search = [('special', '=', True), |
|
||||
('date_stop', '<', start_period.date_start)] |
|
||||
if fiscalyear: |
|
||||
opening_search.append(('fiscalyear_id', '=', fiscalyear.id)) |
|
||||
|
|
||||
opening_periods = period_obj.search(self.cursor, self.uid, |
|
||||
opening_search, |
|
||||
order='date_stop desc') |
|
||||
for opening_period in opening_periods: |
|
||||
validation_res = mv_line_obj.search(self.cursor, |
|
||||
self.uid, |
|
||||
[('period_id', '=', |
|
||||
opening_period)], |
|
||||
limit=1) |
|
||||
if validation_res: |
|
||||
opening_period_id = opening_period |
|
||||
break |
|
||||
if opening_period_id: |
|
||||
# we also look for overlapping periods |
|
||||
opening_period_br = period_obj.browse( |
|
||||
self.cursor, self.uid, opening_period_id) |
|
||||
past_limit = [ |
|
||||
('date_start', '>=', opening_period_br.date_stop)] |
|
||||
|
|
||||
periods_search = [('date_stop', '<=', start_period.date_stop)] |
|
||||
periods_search += past_limit |
|
||||
|
|
||||
if not include_opening: |
|
||||
periods_search += [('special', '=', False)] |
|
||||
|
|
||||
if fiscalyear: |
|
||||
periods_search.append(('fiscalyear_id', '=', fiscalyear.id)) |
|
||||
periods = period_obj.search(self.cursor, self.uid, periods_search) |
|
||||
if include_opening and opening_period_id: |
|
||||
periods.append(opening_period_id) |
|
||||
periods = list(set(periods)) |
|
||||
if start_period.id in periods: |
|
||||
periods.remove(start_period.id) |
|
||||
return periods |
|
||||
|
|
||||
def get_first_fiscalyear_period(self, fiscalyear): |
|
||||
return self._get_st_fiscalyear_period(fiscalyear) |
|
||||
|
|
||||
def get_last_fiscalyear_period(self, fiscalyear): |
|
||||
return self._get_st_fiscalyear_period(fiscalyear, order='DESC') |
|
||||
|
|
||||
def _get_st_fiscalyear_period(self, fiscalyear, special=False, |
|
||||
order='ASC'): |
|
||||
period_obj = self.pool.get('account.period') |
|
||||
p_id = period_obj.search(self.cursor, |
|
||||
self.uid, |
|
||||
[('special', '=', special), |
|
||||
('fiscalyear_id', '=', fiscalyear.id)], |
|
||||
limit=1, |
|
||||
order='date_start %s' % (order,)) |
|
||||
if not p_id: |
|
||||
raise osv.except_osv(_('No period found'), '') |
|
||||
return period_obj.browse(self.cursor, self.uid, p_id[0]) |
|
||||
|
|
||||
############################### |
|
||||
# Initial Balance helper # |
|
||||
############################### |
|
||||
|
|
||||
def _compute_init_balance(self, account_id=None, period_ids=None, |
|
||||
mode='computed', default_values=False): |
|
||||
if not isinstance(period_ids, list): |
|
||||
period_ids = [period_ids] |
|
||||
res = {} |
|
||||
|
|
||||
if not default_values: |
|
||||
if not account_id or not period_ids: |
|
||||
raise Exception('Missing account or period_ids') |
|
||||
try: |
|
||||
self.cursor.execute("SELECT sum(debit) AS debit, " |
|
||||
" sum(credit) AS credit, " |
|
||||
" sum(debit)-sum(credit) AS balance, " |
|
||||
" sum(amount_currency) AS curr_balance" |
|
||||
" FROM account_move_line" |
|
||||
" WHERE period_id in %s" |
|
||||
" AND account_id = %s", |
|
||||
(tuple(period_ids), account_id)) |
|
||||
res = self.cursor.dictfetchone() |
|
||||
|
|
||||
except Exception: |
|
||||
self.cursor.rollback() |
|
||||
raise |
|
||||
|
|
||||
return {'debit': res.get('debit') or 0.0, |
|
||||
'credit': res.get('credit') or 0.0, |
|
||||
'init_balance': res.get('balance') or 0.0, |
|
||||
'init_balance_currency': res.get('curr_balance') or 0.0, |
|
||||
'state': mode} |
|
||||
|
|
||||
def _read_opening_balance(self, account_ids, start_period): |
|
||||
""" Read opening balances from the opening balance |
|
||||
""" |
|
||||
opening_period_selected = self.get_included_opening_period( |
|
||||
start_period) |
|
||||
if not opening_period_selected: |
|
||||
raise osv.except_osv( |
|
||||
_('Error'), |
|
||||
_('No opening period found to compute the opening balances.\n' |
|
||||
'You have to configure a period on the first of January' |
|
||||
' with the special flag.')) |
|
||||
|
|
||||
res = {} |
|
||||
for account_id in account_ids: |
|
||||
res[account_id] = self._compute_init_balance( |
|
||||
account_id, opening_period_selected, mode='read') |
|
||||
return res |
|
||||
|
|
||||
def _compute_initial_balances(self, account_ids, start_period, fiscalyear): |
|
||||
"""We compute initial balance. |
|
||||
If form is filtered by date all initial balance are equal to 0 |
|
||||
This function will sum pear and apple in currency amount if account as |
|
||||
no secondary currency""" |
|
||||
# if opening period is included in start period we do not need to |
|
||||
# compute init balance we just read it from opening entries |
|
||||
res = {} |
|
||||
# PNL and Balance accounts are not computed the same way look for |
|
||||
# attached doc We include opening period in pnl account in order to see |
|
||||
# if opening entries were created by error on this account |
|
||||
pnl_periods_ids = self._get_period_range_from_start_period( |
|
||||
start_period, fiscalyear=fiscalyear, include_opening=True) |
|
||||
bs_period_ids = self._get_period_range_from_start_period( |
|
||||
start_period, include_opening=True, stop_at_previous_opening=True) |
|
||||
opening_period_selected = self.get_included_opening_period( |
|
||||
start_period) |
|
||||
|
|
||||
for acc in self.pool.get('account.account').browse(self.cursor, |
|
||||
self.uid, |
|
||||
account_ids): |
|
||||
res[acc.id] = self._compute_init_balance(default_values=True) |
|
||||
if acc.user_type.close_method == 'none': |
|
||||
# we compute the initial balance for close_method == none only |
|
||||
# when we print a GL during the year, when the opening period |
|
||||
# is not included in the period selection! |
|
||||
if pnl_periods_ids and not opening_period_selected: |
|
||||
res[acc.id] = self._compute_init_balance( |
|
||||
acc.id, pnl_periods_ids) |
|
||||
else: |
|
||||
res[acc.id] = self._compute_init_balance(acc.id, bs_period_ids) |
|
||||
return res |
|
||||
|
|
||||
################################################ |
|
||||
# Account move retrieval helper # |
|
||||
################################################ |
|
||||
def _get_move_ids_from_periods(self, account_id, period_start, period_stop, |
|
||||
target_move): |
|
||||
move_line_obj = self.pool.get('account.move.line') |
|
||||
period_obj = self.pool.get('account.period') |
|
||||
periods = period_obj.build_ctx_periods( |
|
||||
self.cursor, self.uid, period_start.id, period_stop.id) |
|
||||
if not periods: |
|
||||
return [] |
|
||||
search = [ |
|
||||
('period_id', 'in', periods), ('account_id', '=', account_id)] |
|
||||
if target_move == 'posted': |
|
||||
search += [('move_id.state', '=', 'posted')] |
|
||||
return move_line_obj.search(self.cursor, self.uid, search) |
|
||||
|
|
||||
def _get_move_ids_from_dates(self, account_id, date_start, date_stop, |
|
||||
target_move, mode='include_opening'): |
|
||||
# TODO imporve perfomance by setting opening period as a property |
|
||||
move_line_obj = self.pool.get('account.move.line') |
|
||||
search_period = [('date', '>=', date_start), |
|
||||
('date', '<=', date_stop), |
|
||||
('account_id', '=', account_id)] |
|
||||
|
|
||||
# actually not used because OpenERP itself always include the opening |
|
||||
# when we get the periods from january to december |
|
||||
if mode == 'exclude_opening': |
|
||||
opening = self._get_opening_periods() |
|
||||
if opening: |
|
||||
search_period += ['period_id', 'not in', opening] |
|
||||
|
|
||||
if target_move == 'posted': |
|
||||
search_period += [('move_id.state', '=', 'posted')] |
|
||||
|
|
||||
return move_line_obj.search(self.cursor, self.uid, search_period) |
|
||||
|
|
||||
def get_move_lines_ids(self, account_id, main_filter, start, stop, |
|
||||
target_move, mode='include_opening'): |
|
||||
"""Get account move lines base on form data""" |
|
||||
if mode not in ('include_opening', 'exclude_opening'): |
|
||||
raise osv.except_osv( |
|
||||
_('Invalid query mode'), |
|
||||
_('Must be in include_opening, exclude_opening')) |
|
||||
|
|
||||
if main_filter in ('filter_period', 'filter_no'): |
|
||||
return self._get_move_ids_from_periods(account_id, start, stop, |
|
||||
target_move) |
|
||||
|
|
||||
elif main_filter == 'filter_date': |
|
||||
return self._get_move_ids_from_dates(account_id, start, stop, |
|
||||
target_move) |
|
||||
else: |
|
||||
raise osv.except_osv( |
|
||||
_('No valid filter'), _('Please set a valid time filter')) |
|
||||
|
|
||||
def _get_move_line_datas(self, move_line_ids, |
|
||||
order='per.special DESC, l.date ASC, \ |
|
||||
per.date_start ASC, m.name ASC'): |
|
||||
# Possible bang if move_line_ids is too long |
|
||||
# We can not slice here as we have to do the sort. |
|
||||
# If slice has to be done it means that we have to reorder in python |
|
||||
# after all is finished. That quite crapy... |
|
||||
# We have a defective desing here (mea culpa) that should be fixed |
|
||||
# |
|
||||
# TODO improve that by making a better domain or if not possible |
|
||||
# by using python sort |
|
||||
if not move_line_ids: |
|
||||
return [] |
|
||||
if not isinstance(move_line_ids, list): |
|
||||
move_line_ids = [move_line_ids] |
|
||||
monster = """ |
|
||||
SELECT l.id AS id, |
|
||||
l.date AS ldate, |
|
||||
j.code AS jcode , |
|
||||
j.type AS jtype, |
|
||||
l.currency_id, |
|
||||
l.account_id, |
|
||||
l.amount_currency, |
|
||||
l.ref AS lref, |
|
||||
l.name AS lname, |
|
||||
COALESCE(l.debit, 0.0) - COALESCE(l.credit, 0.0) AS balance, |
|
||||
l.debit, |
|
||||
l.credit, |
|
||||
l.period_id AS lperiod_id, |
|
||||
per.code as period_code, |
|
||||
per.special AS peropen, |
|
||||
l.partner_id AS lpartner_id, |
|
||||
p.name AS partner_name, |
|
||||
m.name AS move_name, |
|
||||
COALESCE(partialrec.name, fullrec.name, '') AS rec_name, |
|
||||
COALESCE(partialrec.id, fullrec.id, NULL) AS rec_id, |
|
||||
m.id AS move_id, |
|
||||
c.name AS currency_code, |
|
||||
i.id AS invoice_id, |
|
||||
i.type AS invoice_type, |
|
||||
i.number AS invoice_number, |
|
||||
l.date_maturity |
|
||||
FROM account_move_line l |
|
||||
JOIN account_move m on (l.move_id=m.id) |
|
||||
LEFT JOIN res_currency c on (l.currency_id=c.id) |
|
||||
LEFT JOIN account_move_reconcile partialrec |
|
||||
on (l.reconcile_partial_id = partialrec.id) |
|
||||
LEFT JOIN account_move_reconcile fullrec on (l.reconcile_id = fullrec.id) |
|
||||
LEFT JOIN res_partner p on (l.partner_id=p.id) |
|
||||
LEFT JOIN account_invoice i on (m.id =i.move_id) |
|
||||
LEFT JOIN account_period per on (per.id=l.period_id) |
|
||||
JOIN account_journal j on (l.journal_id=j.id) |
|
||||
WHERE l.id in %s""" |
|
||||
monster += (" ORDER BY %s" % (order,)) |
|
||||
try: |
|
||||
self.cursor.execute(monster, (tuple(move_line_ids),)) |
|
||||
res = self.cursor.dictfetchall() |
|
||||
except Exception: |
|
||||
self.cursor.rollback() |
|
||||
raise |
|
||||
return res or [] |
|
||||
|
|
||||
def _get_moves_counterparts(self, move_ids, account_id, limit=3): |
|
||||
if not move_ids: |
|
||||
return {} |
|
||||
if not isinstance(move_ids, list): |
|
||||
move_ids = [move_ids] |
|
||||
sql = """ |
|
||||
SELECT account_move.id, |
|
||||
array_to_string( |
|
||||
ARRAY(SELECT DISTINCT a.code |
|
||||
FROM account_move_line m2 |
|
||||
LEFT JOIN account_account a ON (m2.account_id=a.id) |
|
||||
WHERE m2.move_id =account_move_line.move_id |
|
||||
AND m2.account_id<>%s limit %s) , ', ') |
|
||||
|
|
||||
FROM account_move |
|
||||
JOIN account_move_line |
|
||||
on (account_move_line.move_id = account_move.id) |
|
||||
JOIN account_account |
|
||||
on (account_move_line.account_id = account_account.id) |
|
||||
WHERE move_id in %s""" |
|
||||
|
|
||||
try: |
|
||||
self.cursor.execute(sql, (account_id, limit, tuple(move_ids))) |
|
||||
res = self.cursor.fetchall() |
|
||||
except Exception: |
|
||||
self.cursor.rollback() |
|
||||
raise |
|
||||
return res and dict(res) or {} |
|
||||
|
|
||||
def is_initial_balance_enabled(self, main_filter): |
|
||||
if main_filter not in ('filter_no', 'filter_year', 'filter_period'): |
|
||||
return False |
|
||||
return True |
|
||||
|
|
||||
def _get_initial_balance_mode(self, start_period): |
|
||||
opening_period_selected = self.get_included_opening_period( |
|
||||
start_period) |
|
||||
opening_move_lines = self.periods_contains_move_lines( |
|
||||
opening_period_selected) |
|
||||
if opening_move_lines: |
|
||||
return 'opening_balance' |
|
||||
else: |
|
||||
return 'initial_balance' |
|
@ -1,243 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Author: Nicolas Bessi, Guewen Baconnier |
|
||||
# Copyright Camptocamp SA 2011 |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
from operator import itemgetter |
|
||||
from itertools import groupby |
|
||||
from datetime import datetime |
|
||||
|
|
||||
from openerp.report import report_sxw |
|
||||
from openerp import pooler |
|
||||
from openerp.tools.translate import _ |
|
||||
from .common_reports import CommonReportHeaderWebkit |
|
||||
from .webkit_parser_header_fix import HeaderFooterTextWebKitParser |
|
||||
|
|
||||
|
|
||||
class GeneralLedgerWebkit(report_sxw.rml_parse, CommonReportHeaderWebkit): |
|
||||
|
|
||||
def __init__(self, cursor, uid, name, context): |
|
||||
super(GeneralLedgerWebkit, self).__init__( |
|
||||
cursor, uid, name, context=context) |
|
||||
self.pool = pooler.get_pool(self.cr.dbname) |
|
||||
self.cursor = self.cr |
|
||||
|
|
||||
company = self.pool.get('res.users').browse( |
|
||||
self.cr, uid, uid, context=context).company_id |
|
||||
header_report_name = ' - '.join( |
|
||||
(_('GENERAL LEDGER'), company.name, company.currency_id.name)) |
|
||||
|
|
||||
footer_date_time = self.formatLang( |
|
||||
str(datetime.today()), date_time=True) |
|
||||
|
|
||||
self.localcontext.update({ |
|
||||
'cr': cursor, |
|
||||
'uid': uid, |
|
||||
'report_name': _('General Ledger'), |
|
||||
'display_account': self._get_display_account, |
|
||||
'display_account_raw': self._get_display_account_raw, |
|
||||
'filter_form': self._get_filter, |
|
||||
'target_move': self._get_target_move, |
|
||||
'initial_balance': self._get_initial_balance, |
|
||||
'amount_currency': self._get_amount_currency, |
|
||||
'display_target_move': self._get_display_target_move, |
|
||||
'accounts': self._get_accounts_br, |
|
||||
'additional_args': [ |
|
||||
('--header-font-name', 'Helvetica'), |
|
||||
('--footer-font-name', 'Helvetica'), |
|
||||
('--header-font-size', '10'), |
|
||||
('--footer-font-size', '6'), |
|
||||
('--header-left', header_report_name), |
|
||||
('--header-spacing', '2'), |
|
||||
('--footer-left', footer_date_time), |
|
||||
('--footer-right', |
|
||||
' '.join((_('Page'), '[page]', _('of'), '[topage]'))), |
|
||||
('--footer-line',), |
|
||||
], |
|
||||
}) |
|
||||
|
|
||||
def set_context(self, objects, data, ids, report_type=None): |
|
||||
"""Populate a ledger_lines attribute on each browse record that will be |
|
||||
used by mako template""" |
|
||||
new_ids = data['form']['account_ids'] or data[ |
|
||||
'form']['chart_account_id'] |
|
||||
|
|
||||
# Account initial balance memoizer |
|
||||
init_balance_memoizer = {} |
|
||||
|
|
||||
# Reading form |
|
||||
main_filter = self._get_form_param('filter', data, default='filter_no') |
|
||||
target_move = self._get_form_param('target_move', data, default='all') |
|
||||
start_date = self._get_form_param('date_from', data) |
|
||||
stop_date = self._get_form_param('date_to', data) |
|
||||
do_centralize = self._get_form_param('centralize', data) |
|
||||
start_period = self.get_start_period_br(data) |
|
||||
stop_period = self.get_end_period_br(data) |
|
||||
fiscalyear = self.get_fiscalyear_br(data) |
|
||||
chart_account = self._get_chart_account_id_br(data) |
|
||||
|
|
||||
if main_filter == 'filter_no': |
|
||||
start_period = self.get_first_fiscalyear_period(fiscalyear) |
|
||||
stop_period = self.get_last_fiscalyear_period(fiscalyear) |
|
||||
|
|
||||
# computation of ledger lines |
|
||||
if main_filter == 'filter_date': |
|
||||
start = start_date |
|
||||
stop = stop_date |
|
||||
else: |
|
||||
start = start_period |
|
||||
stop = stop_period |
|
||||
|
|
||||
initial_balance = self.is_initial_balance_enabled(main_filter) |
|
||||
initial_balance_mode = initial_balance \ |
|
||||
and self._get_initial_balance_mode(start) or False |
|
||||
|
|
||||
# Retrieving accounts |
|
||||
accounts = self.get_all_accounts(new_ids, exclude_type=['view']) |
|
||||
if initial_balance_mode == 'initial_balance': |
|
||||
init_balance_memoizer = self._compute_initial_balances( |
|
||||
accounts, start, fiscalyear) |
|
||||
elif initial_balance_mode == 'opening_balance': |
|
||||
init_balance_memoizer = self._read_opening_balance(accounts, start) |
|
||||
|
|
||||
ledger_lines_memoizer = self._compute_account_ledger_lines( |
|
||||
accounts, init_balance_memoizer, main_filter, target_move, start, |
|
||||
stop) |
|
||||
objects = self.pool.get('account.account').browse(self.cursor, |
|
||||
self.uid, |
|
||||
accounts) |
|
||||
|
|
||||
init_balance = {} |
|
||||
ledger_lines = {} |
|
||||
for account in objects: |
|
||||
if do_centralize and account.centralized \ |
|
||||
and ledger_lines_memoizer.get(account.id): |
|
||||
ledger_lines[account.id] = self._centralize_lines( |
|
||||
main_filter, ledger_lines_memoizer.get(account.id, [])) |
|
||||
else: |
|
||||
ledger_lines[account.id] = ledger_lines_memoizer.get( |
|
||||
account.id, []) |
|
||||
init_balance[account.id] = init_balance_memoizer.get(account.id, |
|
||||
{}) |
|
||||
|
|
||||
self.localcontext.update({ |
|
||||
'fiscalyear': fiscalyear, |
|
||||
'start_date': start_date, |
|
||||
'stop_date': stop_date, |
|
||||
'start_period': start_period, |
|
||||
'stop_period': stop_period, |
|
||||
'chart_account': chart_account, |
|
||||
'initial_balance_mode': initial_balance_mode, |
|
||||
'init_balance': init_balance, |
|
||||
'ledger_lines': ledger_lines, |
|
||||
}) |
|
||||
|
|
||||
return super(GeneralLedgerWebkit, self).set_context( |
|
||||
objects, data, new_ids, report_type=report_type) |
|
||||
|
|
||||
def _centralize_lines(self, filter, ledger_lines, context=None): |
|
||||
""" Group by period in filter mode 'period' or on one line in filter |
|
||||
mode 'date' ledger_lines parameter is a list of dict built |
|
||||
by _get_ledger_lines""" |
|
||||
def group_lines(lines): |
|
||||
if not lines: |
|
||||
return {} |
|
||||
sums = reduce(lambda line, memo: |
|
||||
dict((key, value + memo[key]) for key, value |
|
||||
in line.iteritems() if key in |
|
||||
('balance', 'debit', 'credit')), lines) |
|
||||
|
|
||||
res_lines = { |
|
||||
'balance': sums['balance'], |
|
||||
'debit': sums['debit'], |
|
||||
'credit': sums['credit'], |
|
||||
'lname': _('Centralized Entries'), |
|
||||
'account_id': lines[0]['account_id'], |
|
||||
} |
|
||||
return res_lines |
|
||||
|
|
||||
centralized_lines = [] |
|
||||
if filter == 'filter_date': |
|
||||
# by date we centralize all entries in only one line |
|
||||
centralized_lines.append(group_lines(ledger_lines)) |
|
||||
|
|
||||
else: # by period |
|
||||
# by period we centralize all entries in one line per period |
|
||||
period_obj = self.pool.get('account.period') |
|
||||
# we need to sort the lines per period in order to use groupby |
|
||||
# unique ids of each used period id in lines |
|
||||
period_ids = list( |
|
||||
set([line['lperiod_id'] for line in ledger_lines])) |
|
||||
# search on account.period in order to sort them by date_start |
|
||||
sorted_period_ids = period_obj.search( |
|
||||
self.cr, self.uid, [('id', 'in', period_ids)], |
|
||||
order='special desc, date_start', context=context) |
|
||||
sorted_ledger_lines = sorted( |
|
||||
ledger_lines, key=lambda x: sorted_period_ids. |
|
||||
index(x['lperiod_id'])) |
|
||||
|
|
||||
for period_id, lines_per_period_iterator in groupby( |
|
||||
sorted_ledger_lines, itemgetter('lperiod_id')): |
|
||||
lines_per_period = list(lines_per_period_iterator) |
|
||||
if not lines_per_period: |
|
||||
continue |
|
||||
group_per_period = group_lines(lines_per_period) |
|
||||
group_per_period.update({ |
|
||||
'lperiod_id': period_id, |
|
||||
# period code is anyway the same on each line per period |
|
||||
'period_code': lines_per_period[0]['period_code'], |
|
||||
}) |
|
||||
centralized_lines.append(group_per_period) |
|
||||
|
|
||||
return centralized_lines |
|
||||
|
|
||||
def _compute_account_ledger_lines(self, accounts_ids, |
|
||||
init_balance_memoizer, main_filter, |
|
||||
target_move, start, stop): |
|
||||
res = {} |
|
||||
for acc_id in accounts_ids: |
|
||||
move_line_ids = self.get_move_lines_ids( |
|
||||
acc_id, main_filter, start, stop, target_move) |
|
||||
if not move_line_ids: |
|
||||
res[acc_id] = [] |
|
||||
continue |
|
||||
|
|
||||
lines = self._get_ledger_lines(move_line_ids, acc_id) |
|
||||
res[acc_id] = lines |
|
||||
return res |
|
||||
|
|
||||
def _get_ledger_lines(self, move_line_ids, account_id): |
|
||||
if not move_line_ids: |
|
||||
return [] |
|
||||
res = self._get_move_line_datas(move_line_ids) |
|
||||
# computing counter part is really heavy in term of ressouces |
|
||||
# consuption looking for a king of SQL to help me improve it |
|
||||
move_ids = [x.get('move_id') for x in res] |
|
||||
counter_parts = self._get_moves_counterparts(move_ids, account_id) |
|
||||
for line in res: |
|
||||
line['counterparts'] = counter_parts.get(line.get('move_id'), '') |
|
||||
return res |
|
||||
|
|
||||
|
|
||||
HeaderFooterTextWebKitParser( |
|
||||
'report.account.account_report_general_ledger_webkit', |
|
||||
'account.account', |
|
||||
'addons/account_financial_report_webkit/report/templates/\ |
|
||||
account_report_general_ledger.mako', |
|
||||
parser=GeneralLedgerWebkit) |
|
@ -1,268 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Author: Nicolas Bessi, Guewen Baconnier |
|
||||
# Copyright Camptocamp SA 2011 |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
from collections import defaultdict |
|
||||
from datetime import datetime |
|
||||
from itertools import groupby |
|
||||
from operator import itemgetter |
|
||||
from mako.template import Template |
|
||||
|
|
||||
|
|
||||
from openerp import pooler |
|
||||
from openerp.osv import osv |
|
||||
from openerp.report import report_sxw |
|
||||
from openerp.tools.translate import _ |
|
||||
from openerp.addons.report_webkit import report_helper |
|
||||
from .common_partner_reports import CommonPartnersReportHeaderWebkit |
|
||||
from .webkit_parser_header_fix import HeaderFooterTextWebKitParser |
|
||||
from openerp.modules.module import get_module_resource |
|
||||
|
|
||||
|
|
||||
def get_mako_template(obj, *args): |
|
||||
template_path = get_module_resource(*args) |
|
||||
return Template(filename=template_path, input_encoding='utf-8') |
|
||||
|
|
||||
report_helper.WebKitHelper.get_mako_template = get_mako_template |
|
||||
|
|
||||
|
|
||||
class PartnersOpenInvoicesWebkit(report_sxw.rml_parse, |
|
||||
CommonPartnersReportHeaderWebkit): |
|
||||
|
|
||||
def __init__(self, cursor, uid, name, context): |
|
||||
super(PartnersOpenInvoicesWebkit, self).__init__( |
|
||||
cursor, uid, name, context=context) |
|
||||
self.pool = pooler.get_pool(self.cr.dbname) |
|
||||
self.cursor = self.cr |
|
||||
|
|
||||
company = self.pool.get('res.users').browse( |
|
||||
self.cr, uid, uid, context=context).company_id |
|
||||
header_report_name = ' - '.join((_('OPEN INVOICES REPORT'), |
|
||||
company.name, |
|
||||
company.currency_id.name)) |
|
||||
|
|
||||
footer_date_time = self.formatLang( |
|
||||
str(datetime.today()), date_time=True) |
|
||||
|
|
||||
self.localcontext.update({ |
|
||||
'cr': cursor, |
|
||||
'uid': uid, |
|
||||
'report_name': _('Open Invoices Report'), |
|
||||
'display_account_raw': self._get_display_account_raw, |
|
||||
'filter_form': self._get_filter, |
|
||||
'target_move': self._get_target_move, |
|
||||
'amount_currency': self._get_amount_currency, |
|
||||
'display_partner_account': self._get_display_partner_account, |
|
||||
'display_target_move': self._get_display_target_move, |
|
||||
'additional_args': [ |
|
||||
('--header-font-name', 'Helvetica'), |
|
||||
('--footer-font-name', 'Helvetica'), |
|
||||
('--header-font-size', '10'), |
|
||||
('--footer-font-size', '6'), |
|
||||
('--header-left', header_report_name), |
|
||||
('--header-spacing', '2'), |
|
||||
('--footer-left', footer_date_time), |
|
||||
('--footer-right', |
|
||||
' '.join((_('Page'), '[page]', _('of'), '[topage]'))), |
|
||||
('--footer-line',), |
|
||||
], |
|
||||
}) |
|
||||
|
|
||||
def _group_lines_by_currency(self, account_br): |
|
||||
account_br.grouped_ledger_lines = {} |
|
||||
if not account_br.ledger_lines: |
|
||||
return |
|
||||
for part_id, plane_lines in account_br.ledger_lines.items(): |
|
||||
account_br.grouped_ledger_lines[part_id] = [] |
|
||||
plane_lines.sort(key=itemgetter('currency_code')) |
|
||||
for curr, lines in groupby(plane_lines, |
|
||||
key=itemgetter('currency_code')): |
|
||||
tmp = [x for x in lines] |
|
||||
account_br.grouped_ledger_lines[part_id].append( |
|
||||
(curr, tmp)) # I want to reiter many times |
|
||||
|
|
||||
def set_context(self, objects, data, ids, report_type=None): |
|
||||
"""Populate a ledger_lines attribute on each browse record that will |
|
||||
be used by mako template""" |
|
||||
new_ids = data['form']['chart_account_id'] |
|
||||
# Account initial balance memoizer |
|
||||
init_balance_memoizer = {} |
|
||||
# Reading form |
|
||||
main_filter = self._get_form_param('filter', data, default='filter_no') |
|
||||
target_move = self._get_form_param('target_move', data, default='all') |
|
||||
start_date = self._get_form_param('date_from', data) |
|
||||
stop_date = self._get_form_param('date_to', data) |
|
||||
start_period = self.get_start_period_br(data) |
|
||||
stop_period = self.get_end_period_br(data) |
|
||||
fiscalyear = self.get_fiscalyear_br(data) |
|
||||
partner_ids = self._get_form_param('partner_ids', data) |
|
||||
result_selection = self._get_form_param('result_selection', data) |
|
||||
date_until = self._get_form_param('until_date', data) |
|
||||
chart_account = self._get_chart_account_id_br(data) |
|
||||
group_by_currency = self._get_form_param('group_by_currency', data) |
|
||||
|
|
||||
if main_filter == 'filter_no' and fiscalyear: |
|
||||
start_period = self.get_first_fiscalyear_period(fiscalyear) |
|
||||
stop_period = self.get_last_fiscalyear_period(fiscalyear) |
|
||||
|
|
||||
# Retrieving accounts |
|
||||
filter_type = ('payable', 'receivable') |
|
||||
if result_selection == 'customer': |
|
||||
filter_type = ('receivable',) |
|
||||
if result_selection == 'supplier': |
|
||||
filter_type = ('payable',) |
|
||||
|
|
||||
account_ids = self.get_all_accounts( |
|
||||
new_ids, exclude_type=['view'], only_type=filter_type) |
|
||||
|
|
||||
if not account_ids: |
|
||||
raise osv.except_osv(_('Error'), _('No accounts to print.')) |
|
||||
|
|
||||
# computation of ledeger lines |
|
||||
if main_filter == 'filter_date': |
|
||||
start = start_date |
|
||||
stop = stop_date |
|
||||
else: |
|
||||
start = start_period |
|
||||
stop = stop_period |
|
||||
ledger_lines_memoizer = self._compute_open_transactions_lines( |
|
||||
account_ids, main_filter, target_move, start, stop, date_until, |
|
||||
partner_filter=partner_ids) |
|
||||
objects = self.pool.get('account.account').browse(self.cursor, |
|
||||
self.uid, |
|
||||
account_ids) |
|
||||
|
|
||||
ledger_lines = {} |
|
||||
init_balance = {} |
|
||||
partners_order = {} |
|
||||
for account in objects: |
|
||||
ledger_lines[account.id] = ledger_lines_memoizer.get(account.id, |
|
||||
{}) |
|
||||
init_balance[account.id] = init_balance_memoizer.get(account.id, |
|
||||
{}) |
|
||||
# we have to compute partner order based on inital balance |
|
||||
# and ledger line as we may have partner with init bal |
|
||||
# that are not in ledger line and vice versa |
|
||||
ledg_lines_pids = ledger_lines_memoizer.get(account.id, {}).keys() |
|
||||
non_null_init_balances = dict([ |
|
||||
(ib, amounts) for ib, amounts |
|
||||
in init_balance[account.id].iteritems() |
|
||||
if amounts['init_balance'] or |
|
||||
amounts['init_balance_currency']]) |
|
||||
init_bal_lines_pids = non_null_init_balances.keys() |
|
||||
|
|
||||
partners_order[account.id] = self._order_partners( |
|
||||
ledg_lines_pids, init_bal_lines_pids) |
|
||||
ledger_lines[account.id] = ledger_lines_memoizer.get(account.id, |
|
||||
{}) |
|
||||
if group_by_currency: |
|
||||
self._group_lines_by_currency(account) |
|
||||
|
|
||||
self.localcontext.update({ |
|
||||
'fiscalyear': fiscalyear, |
|
||||
'start_date': start_date, |
|
||||
'stop_date': stop_date, |
|
||||
'start_period': start_period, |
|
||||
'stop_period': stop_period, |
|
||||
'date_until': date_until, |
|
||||
'partner_ids': partner_ids, |
|
||||
'chart_account': chart_account, |
|
||||
'ledger_lines': ledger_lines, |
|
||||
'init_balance': init_balance, |
|
||||
'partners_order': partners_order |
|
||||
}) |
|
||||
|
|
||||
return super(PartnersOpenInvoicesWebkit, self).set_context( |
|
||||
objects, data, new_ids, report_type=report_type) |
|
||||
|
|
||||
def _compute_open_transactions_lines(self, accounts_ids, main_filter, |
|
||||
target_move, start, stop, |
|
||||
date_until=False, |
|
||||
partner_filter=False): |
|
||||
res = defaultdict(dict) |
|
||||
|
|
||||
# we check if until date and date stop have the same value |
|
||||
if main_filter in ('filter_period', 'filter_no'): |
|
||||
date_stop = stop.date_stop |
|
||||
date_until_match = (date_stop == date_until) |
|
||||
|
|
||||
elif main_filter == 'filter_date': |
|
||||
date_stop = stop |
|
||||
date_until_match = (stop == date_until) |
|
||||
|
|
||||
else: |
|
||||
raise osv.except_osv(_('Unsuported filter'), |
|
||||
_('Filter has to be in filter date, period, \ |
|
||||
or none')) |
|
||||
|
|
||||
initial_move_lines_per_account = {} |
|
||||
if main_filter in ('filter_period', 'filter_no'): |
|
||||
initial_move_lines_per_account = self._tree_move_line_ids( |
|
||||
self._partners_initial_balance_line_ids(accounts_ids, |
|
||||
start, |
|
||||
partner_filter, |
|
||||
exclude_reconcile=True, |
|
||||
force_period_ids=False, |
|
||||
date_stop=date_stop), |
|
||||
key='id') |
|
||||
|
|
||||
for account_id in accounts_ids: |
|
||||
initial_move_lines_ids_per_partner = \ |
|
||||
initial_move_lines_per_account.get(account_id, {}) |
|
||||
|
|
||||
# We get the move line ids of the account |
|
||||
move_line_ids_per_partner = self.get_partners_move_lines_ids( |
|
||||
account_id, main_filter, start, stop, target_move, |
|
||||
exclude_reconcile=True, partner_filter=partner_filter) |
|
||||
|
|
||||
if not initial_move_lines_ids_per_partner \ |
|
||||
and not move_line_ids_per_partner: |
|
||||
continue |
|
||||
for partner_id in list( |
|
||||
set(initial_move_lines_ids_per_partner.keys() + |
|
||||
move_line_ids_per_partner.keys())): |
|
||||
partner_line_ids = ( |
|
||||
move_line_ids_per_partner.get(partner_id, []) + |
|
||||
initial_move_lines_ids_per_partner.get(partner_id, [])) |
|
||||
|
|
||||
clearance_line_ids = [] |
|
||||
if date_until and not date_until_match and partner_line_ids: |
|
||||
clearance_line_ids = self._get_clearance_move_line_ids( |
|
||||
partner_line_ids, date_stop, date_until) |
|
||||
partner_line_ids += clearance_line_ids |
|
||||
|
|
||||
lines = self._get_move_line_datas(list(set(partner_line_ids))) |
|
||||
for line in lines: |
|
||||
if line['id'] in initial_move_lines_ids_per_partner.\ |
|
||||
get(partner_id, []): |
|
||||
line['is_from_previous_periods'] = True |
|
||||
if line['id'] in clearance_line_ids: |
|
||||
line['is_clearance_line'] = True |
|
||||
|
|
||||
res[account_id][partner_id] = lines |
|
||||
return res |
|
||||
|
|
||||
|
|
||||
HeaderFooterTextWebKitParser( |
|
||||
'report.account.account_report_open_invoices_webkit', |
|
||||
'account.account', |
|
||||
'addons/account_financial_report_webkit/report/templates/\ |
|
||||
account_report_open_invoices.mako', |
|
||||
parser=PartnersOpenInvoicesWebkit) |
|
@ -1,101 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Author: Guewen Baconnier |
|
||||
# Copyright Camptocamp SA 2011 |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
|
|
||||
from datetime import datetime |
|
||||
|
|
||||
from openerp import pooler |
|
||||
from openerp.report import report_sxw |
|
||||
from openerp.tools.translate import _ |
|
||||
from .common_partner_balance_reports \ |
|
||||
import CommonPartnerBalanceReportHeaderWebkit |
|
||||
from .webkit_parser_header_fix import HeaderFooterTextWebKitParser |
|
||||
|
|
||||
|
|
||||
class PartnerBalanceWebkit(report_sxw.rml_parse, |
|
||||
CommonPartnerBalanceReportHeaderWebkit): |
|
||||
|
|
||||
def __init__(self, cursor, uid, name, context): |
|
||||
super(PartnerBalanceWebkit, self).__init__( |
|
||||
cursor, uid, name, context=context) |
|
||||
self.pool = pooler.get_pool(self.cr.dbname) |
|
||||
self.cursor = self.cr |
|
||||
|
|
||||
company = self.pool.get('res.users').browse( |
|
||||
self.cr, uid, uid, context=context).company_id |
|
||||
header_report_name = ' - '.join((_('PARTNER BALANCE'), |
|
||||
company.name, |
|
||||
company.currency_id.name)) |
|
||||
|
|
||||
footer_date_time = self.formatLang( |
|
||||
str(datetime.today()), date_time=True) |
|
||||
|
|
||||
self.localcontext.update({ |
|
||||
'cr': cursor, |
|
||||
'uid': uid, |
|
||||
'report_name': _('Partner Balance'), |
|
||||
'display_account': self._get_display_account, |
|
||||
'display_account_raw': self._get_display_account_raw, |
|
||||
'filter_form': self._get_filter, |
|
||||
'target_move': self._get_target_move, |
|
||||
'display_target_move': self._get_display_target_move, |
|
||||
'display_partner_account': self._get_display_partner_account, |
|
||||
'accounts': self._get_accounts_br, |
|
||||
'additional_args': [ |
|
||||
('--header-font-name', 'Helvetica'), |
|
||||
('--footer-font-name', 'Helvetica'), |
|
||||
('--header-font-size', '10'), |
|
||||
('--footer-font-size', '6'), |
|
||||
('--header-left', header_report_name), |
|
||||
('--header-spacing', '2'), |
|
||||
('--footer-left', footer_date_time), |
|
||||
('--footer-right', |
|
||||
' '.join((_('Page'), '[page]', _('of'), '[topage]'))), |
|
||||
('--footer-line',), |
|
||||
], |
|
||||
}) |
|
||||
|
|
||||
def _get_initial_balance_mode(self, start_period): |
|
||||
""" Force computing of initial balance for the partner balance, |
|
||||
because we cannot use the entries generated by |
|
||||
OpenERP in the opening period. |
|
||||
|
|
||||
OpenERP allows to reconcile move lines between different partners, |
|
||||
so the generated entries in the opening period are unreliable. |
|
||||
""" |
|
||||
return 'initial_balance' |
|
||||
|
|
||||
def set_context(self, objects, data, ids, report_type=None): |
|
||||
"""Populate a ledger_lines attribute on each browse record that will |
|
||||
be used by mako template""" |
|
||||
objects, new_ids, context_report_values = self.\ |
|
||||
compute_partner_balance_data(data) |
|
||||
|
|
||||
self.localcontext.update(context_report_values) |
|
||||
return super(PartnerBalanceWebkit, self).set_context( |
|
||||
objects, data, new_ids, report_type=report_type) |
|
||||
|
|
||||
HeaderFooterTextWebKitParser( |
|
||||
'report.account.account_report_partner_balance_webkit', |
|
||||
'account.account', |
|
||||
'addons/account_financial_report_webkit/report/templates/\ |
|
||||
account_report_partner_balance.mako', |
|
||||
parser=PartnerBalanceWebkit) |
|
@ -1,218 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Author: Nicolas Bessi, Guewen Baconnier |
|
||||
# Copyright Camptocamp SA 2011 |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
from collections import defaultdict |
|
||||
from datetime import datetime |
|
||||
|
|
||||
from openerp import pooler |
|
||||
from openerp.osv import osv |
|
||||
from openerp.report import report_sxw |
|
||||
from openerp.tools.translate import _ |
|
||||
from .common_partner_reports import CommonPartnersReportHeaderWebkit |
|
||||
from .webkit_parser_header_fix import HeaderFooterTextWebKitParser |
|
||||
|
|
||||
|
|
||||
class PartnersLedgerWebkit(report_sxw.rml_parse, |
|
||||
CommonPartnersReportHeaderWebkit): |
|
||||
|
|
||||
def __init__(self, cursor, uid, name, context): |
|
||||
super(PartnersLedgerWebkit, self).__init__( |
|
||||
cursor, uid, name, context=context) |
|
||||
self.pool = pooler.get_pool(self.cr.dbname) |
|
||||
self.cursor = self.cr |
|
||||
|
|
||||
company = self.pool.get('res.users').browse( |
|
||||
self.cr, uid, uid, context=context).company_id |
|
||||
header_report_name = ' - '.join((_('PARTNER LEDGER'), |
|
||||
company.name, |
|
||||
company.currency_id.name)) |
|
||||
|
|
||||
footer_date_time = self.formatLang( |
|
||||
str(datetime.today()), date_time=True) |
|
||||
|
|
||||
self.localcontext.update({ |
|
||||
'cr': cursor, |
|
||||
'uid': uid, |
|
||||
'report_name': _('Partner Ledger'), |
|
||||
'display_account_raw': self._get_display_account_raw, |
|
||||
'filter_form': self._get_filter, |
|
||||
'target_move': self._get_target_move, |
|
||||
'initial_balance': self._get_initial_balance, |
|
||||
'amount_currency': self._get_amount_currency, |
|
||||
'display_partner_account': self._get_display_partner_account, |
|
||||
'display_target_move': self._get_display_target_move, |
|
||||
'additional_args': [ |
|
||||
('--header-font-name', 'Helvetica'), |
|
||||
('--footer-font-name', 'Helvetica'), |
|
||||
('--header-font-size', '10'), |
|
||||
('--footer-font-size', '6'), |
|
||||
('--header-left', header_report_name), |
|
||||
('--header-spacing', '2'), |
|
||||
('--footer-left', footer_date_time), |
|
||||
('--footer-right', |
|
||||
' '.join((_('Page'), '[page]', _('of'), '[topage]'))), |
|
||||
('--footer-line',), |
|
||||
], |
|
||||
}) |
|
||||
|
|
||||
def _get_initial_balance_mode(self, start_period): |
|
||||
""" Force computing of initial balance for the partner ledger, |
|
||||
because we cannot use the entries generated by |
|
||||
OpenERP in the opening period. |
|
||||
|
|
||||
OpenERP allows to reconcile move lines between different partners, |
|
||||
so the generated entries in the opening period are unreliable. |
|
||||
""" |
|
||||
return 'initial_balance' |
|
||||
|
|
||||
def set_context(self, objects, data, ids, report_type=None): |
|
||||
"""Populate a ledger_lines attribute on each browse record that will |
|
||||
be used by mako template""" |
|
||||
new_ids = data['form']['chart_account_id'] |
|
||||
|
|
||||
# account partner memoizer |
|
||||
# Reading form |
|
||||
main_filter = self._get_form_param('filter', data, default='filter_no') |
|
||||
target_move = self._get_form_param('target_move', data, default='all') |
|
||||
start_date = self._get_form_param('date_from', data) |
|
||||
stop_date = self._get_form_param('date_to', data) |
|
||||
start_period = self.get_start_period_br(data) |
|
||||
stop_period = self.get_end_period_br(data) |
|
||||
fiscalyear = self.get_fiscalyear_br(data) |
|
||||
partner_ids = self._get_form_param('partner_ids', data) |
|
||||
result_selection = self._get_form_param('result_selection', data) |
|
||||
chart_account = self._get_chart_account_id_br(data) |
|
||||
|
|
||||
if main_filter == 'filter_no' and fiscalyear: |
|
||||
start_period = self.get_first_fiscalyear_period(fiscalyear) |
|
||||
stop_period = self.get_last_fiscalyear_period(fiscalyear) |
|
||||
|
|
||||
# Retrieving accounts |
|
||||
filter_type = ('payable', 'receivable') |
|
||||
if result_selection == 'customer': |
|
||||
filter_type = ('receivable',) |
|
||||
if result_selection == 'supplier': |
|
||||
filter_type = ('payable',) |
|
||||
|
|
||||
accounts = self.get_all_accounts(new_ids, exclude_type=['view'], |
|
||||
only_type=filter_type) |
|
||||
|
|
||||
if not accounts: |
|
||||
raise osv.except_osv(_('Error'), _('No accounts to print.')) |
|
||||
|
|
||||
if main_filter == 'filter_date': |
|
||||
start = start_date |
|
||||
stop = stop_date |
|
||||
else: |
|
||||
start = start_period |
|
||||
stop = stop_period |
|
||||
|
|
||||
# when the opening period is included in the selected range of periods |
|
||||
# and the opening period contains move lines, we must not compute the |
|
||||
# initial balance from previous periods but only display the move lines |
|
||||
# of the opening period we identify them as: |
|
||||
# - 'initial_balance' means compute the sums of move lines from |
|
||||
# previous periods |
|
||||
# - 'opening_balance' means display the move lines of the opening |
|
||||
# period |
|
||||
init_balance = main_filter in ('filter_no', 'filter_period') |
|
||||
initial_balance_mode = init_balance and self._get_initial_balance_mode( |
|
||||
start) or False |
|
||||
|
|
||||
initial_balance_lines = {} |
|
||||
if initial_balance_mode == 'initial_balance': |
|
||||
initial_balance_lines = self._compute_partners_initial_balances( |
|
||||
accounts, start_period, partner_filter=partner_ids, |
|
||||
exclude_reconcile=False) |
|
||||
|
|
||||
ledger_lines = self._compute_partner_ledger_lines( |
|
||||
accounts, main_filter, target_move, start, stop, |
|
||||
partner_filter=partner_ids) |
|
||||
objects = self.pool.get('account.account').browse(self.cursor, |
|
||||
self.uid, |
|
||||
accounts) |
|
||||
|
|
||||
init_balance = {} |
|
||||
ledger_lines_dict = {} |
|
||||
partners_order = {} |
|
||||
for account in objects: |
|
||||
ledger_lines_dict[account.id] = ledger_lines.get(account.id, {}) |
|
||||
init_balance[account.id] = initial_balance_lines.get(account.id, |
|
||||
{}) |
|
||||
# we have to compute partner order based on inital balance |
|
||||
# and ledger line as we may have partner with init bal |
|
||||
# that are not in ledger line and vice versa |
|
||||
ledg_lines_pids = ledger_lines.get(account.id, {}).keys() |
|
||||
if initial_balance_mode: |
|
||||
non_null_init_balances = dict( |
|
||||
[(ib, amounts) for ib, amounts |
|
||||
in init_balance[account.id].iteritems() |
|
||||
if amounts['init_balance'] or |
|
||||
amounts['init_balance_currency']]) |
|
||||
init_bal_lines_pids = non_null_init_balances.keys() |
|
||||
else: |
|
||||
init_balance[account.id] = {} |
|
||||
init_bal_lines_pids = [] |
|
||||
|
|
||||
partners_order[account.id] = self._order_partners( |
|
||||
ledg_lines_pids, init_bal_lines_pids) |
|
||||
|
|
||||
self.localcontext.update({ |
|
||||
'fiscalyear': fiscalyear, |
|
||||
'start_date': start_date, |
|
||||
'stop_date': stop_date, |
|
||||
'start_period': start_period, |
|
||||
'stop_period': stop_period, |
|
||||
'partner_ids': partner_ids, |
|
||||
'chart_account': chart_account, |
|
||||
'initial_balance_mode': initial_balance_mode, |
|
||||
'init_balance': init_balance, |
|
||||
'ledger_lines': ledger_lines_dict, |
|
||||
'partners_order': partners_order |
|
||||
}) |
|
||||
|
|
||||
return super(PartnersLedgerWebkit, self).set_context( |
|
||||
objects, data, new_ids, report_type=report_type) |
|
||||
|
|
||||
def _compute_partner_ledger_lines(self, accounts_ids, main_filter, |
|
||||
target_move, start, stop, |
|
||||
partner_filter=False): |
|
||||
res = defaultdict(dict) |
|
||||
|
|
||||
for acc_id in accounts_ids: |
|
||||
move_line_ids = self.get_partners_move_lines_ids( |
|
||||
acc_id, main_filter, start, stop, target_move, |
|
||||
exclude_reconcile=False, partner_filter=partner_filter) |
|
||||
if not move_line_ids: |
|
||||
continue |
|
||||
for partner_id in move_line_ids: |
|
||||
partner_line_ids = move_line_ids.get(partner_id, []) |
|
||||
lines = self._get_move_line_datas(list(set(partner_line_ids))) |
|
||||
res[acc_id][partner_id] = lines |
|
||||
return res |
|
||||
|
|
||||
|
|
||||
HeaderFooterTextWebKitParser( |
|
||||
'report.account.account_report_partners_ledger_webkit', |
|
||||
'account.account', |
|
||||
'addons/account_financial_report_webkit/report/templates/\ |
|
||||
account_report_partners_ledger.mako', |
|
||||
parser=PartnersLedgerWebkit) |
|
@ -1,168 +0,0 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# account_financial_report_webkit module for OpenERP, Webkit based |
|
||||
# extended report financial report |
|
||||
# Copyright (C) 2012 SYLEAM Info Services (<http://www.syleam.fr/>) |
|
||||
# Sebastien LANGE <sebastien.lange@syleam.fr> |
|
||||
# |
|
||||
# This file is a part of account_financial_report_webkit |
|
||||
# |
|
||||
# account_financial_report_webkit is free software: you can redistribute it |
|
||||
# and/or modify it under the terms of the GNU Affero General Public License |
|
||||
# as published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# account_financial_report_webkit is distributed in the hope that it will be |
|
||||
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
from openerp.report import report_sxw |
|
||||
from openerp.tools.translate import _ |
|
||||
from openerp import pooler |
|
||||
from datetime import datetime |
|
||||
|
|
||||
from .common_reports import CommonReportHeaderWebkit |
|
||||
from .webkit_parser_header_fix import HeaderFooterTextWebKitParser |
|
||||
|
|
||||
|
|
||||
class PrintJournalWebkit(report_sxw.rml_parse, CommonReportHeaderWebkit): |
|
||||
|
|
||||
def __init__(self, cursor, uid, name, context): |
|
||||
super(PrintJournalWebkit, self).__init__(cursor, uid, name, |
|
||||
context=context) |
|
||||
self.pool = pooler.get_pool(self.cr.dbname) |
|
||||
self.cursor = self.cr |
|
||||
|
|
||||
company_obj = self.pool.get('res.company') |
|
||||
|
|
||||
company_id = company_obj._company_default_get(self.cr, uid, |
|
||||
'res.users', |
|
||||
context=context) |
|
||||
company = company_obj.browse(self.cr, uid, company_id, context=context) |
|
||||
header_report_name = ' - '.join((_('JOURNALS'), company.name, |
|
||||
company.currency_id.name)) |
|
||||
|
|
||||
footer_date_time = self.formatLang(str(datetime.today()), |
|
||||
date_time=True) |
|
||||
|
|
||||
self.localcontext.update({ |
|
||||
'cr': cursor, |
|
||||
'uid': uid, |
|
||||
'report_name': _('Journals'), |
|
||||
'display_account_raw': self._get_display_account_raw, |
|
||||
'filter_form': self._get_filter, |
|
||||
'target_move': self._get_target_move, |
|
||||
'initial_balance': self._get_initial_balance, |
|
||||
'amount_currency': self._get_amount_currency, |
|
||||
'display_partner_account': self._get_display_partner_account, |
|
||||
'display_target_move': self._get_display_target_move, |
|
||||
'journals': self._get_journals_br, |
|
||||
'additional_args': [ |
|
||||
('--header-font-name', 'Helvetica'), |
|
||||
('--footer-font-name', 'Helvetica'), |
|
||||
('--header-font-size', '10'), |
|
||||
('--footer-font-size', '6'), |
|
||||
('--header-left', header_report_name), |
|
||||
('--header-spacing', '2'), |
|
||||
('--footer-left', footer_date_time), |
|
||||
('--footer-right', ' '.join((_('Page'), '[page]', _('of'), |
|
||||
'[topage]'))), |
|
||||
('--footer-line',), |
|
||||
], |
|
||||
}) |
|
||||
|
|
||||
def set_context(self, objects, data, ids, report_type=None): |
|
||||
"""Populate a ledger_lines attribute on each browse record that will |
|
||||
be used by mako template""" |
|
||||
|
|
||||
# Reading form |
|
||||
main_filter = self._get_form_param('filter', data, default='filter_no') |
|
||||
target_move = self._get_form_param('target_move', data, default='all') |
|
||||
start_date = self._get_form_param('date_from', data) |
|
||||
stop_date = self._get_form_param('date_to', data) |
|
||||
start_period = self.get_start_period_br(data) |
|
||||
stop_period = self.get_end_period_br(data) |
|
||||
fiscalyear = self.get_fiscalyear_br(data) |
|
||||
journal_ids = self._get_form_param('journal_ids', data) |
|
||||
chart_account = self._get_chart_account_id_br(data) |
|
||||
account_period_obj = self.pool.get('account.period') |
|
||||
|
|
||||
domain = [('journal_id', 'in', journal_ids)] |
|
||||
if main_filter == 'filter_no': |
|
||||
domain += [ |
|
||||
('date', '>=', |
|
||||
self.get_first_fiscalyear_period(fiscalyear).date_start), |
|
||||
('date', '<=', |
|
||||
self.get_last_fiscalyear_period(fiscalyear).date_stop), |
|
||||
] |
|
||||
# computation of move lines |
|
||||
elif main_filter == 'filter_date': |
|
||||
domain += [ |
|
||||
('date', '>=', start_date), |
|
||||
('date', '<=', stop_date), |
|
||||
] |
|
||||
elif main_filter == 'filter_period': |
|
||||
period_ids = account_period_obj.build_ctx_periods(self.cursor, |
|
||||
self.uid, |
|
||||
start_period.id, |
|
||||
stop_period.id) |
|
||||
domain = [ |
|
||||
('period_id', 'in', period_ids), |
|
||||
] |
|
||||
if target_move == 'posted': |
|
||||
domain += [('state', '=', 'posted')] |
|
||||
account_journal_period_obj = self.pool.get('account.journal.period') |
|
||||
new_ids = account_journal_period_obj.search(self.cursor, self.uid, [ |
|
||||
('journal_id', 'in', journal_ids), |
|
||||
('period_id', 'in', period_ids), |
|
||||
]) |
|
||||
objects = account_journal_period_obj.browse(self.cursor, self.uid, |
|
||||
new_ids) |
|
||||
# Sort by journal and period |
|
||||
objects.sorted(key=lambda a: (a.journal_id.code, |
|
||||
a.period_id.date_start)) |
|
||||
move_obj = self.pool.get('account.move') |
|
||||
moves = {} |
|
||||
for journal_period in objects: |
|
||||
domain_arg = [ |
|
||||
('journal_id', '=', journal_period.journal_id.id), |
|
||||
('period_id', '=', journal_period.period_id.id), |
|
||||
] |
|
||||
if target_move == 'posted': |
|
||||
domain_arg += [('state', '=', 'posted')] |
|
||||
move_ids = move_obj.search(self.cursor, self.uid, domain_arg, |
|
||||
order="name") |
|
||||
moves[journal_period.id] = move_obj.browse(self.cursor, self.uid, |
|
||||
move_ids) |
|
||||
# Sort account move line by account accountant |
|
||||
for move in moves[journal_period.id]: |
|
||||
move.line_id.sorted(key=lambda a: (a.date, a.account_id.code)) |
|
||||
|
|
||||
self.localcontext.update({ |
|
||||
'fiscalyear': fiscalyear, |
|
||||
'start_date': start_date, |
|
||||
'stop_date': stop_date, |
|
||||
'start_period': start_period, |
|
||||
'stop_period': stop_period, |
|
||||
'chart_account': chart_account, |
|
||||
'moves': moves, |
|
||||
}) |
|
||||
|
|
||||
return super(PrintJournalWebkit, self).set_context( |
|
||||
objects, data, new_ids, report_type=report_type) |
|
||||
|
|
||||
HeaderFooterTextWebKitParser( |
|
||||
'report.account.account_report_print_journal_webkit', |
|
||||
'account.journal.period', |
|
||||
'addons/account_financial_report_webkit/report/templates/\ |
|
||||
account_report_print_journal.mako', |
|
||||
parser=PrintJournalWebkit) |
|
||||
|
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: |
|
@ -1,158 +0,0 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||
<openerp> |
|
||||
<data> |
|
||||
<!-- we do not use report tag has we can not set header ref --> |
|
||||
<record id="account_report_general_ledger_webkit" model="ir.actions.report.xml"> |
|
||||
<field name="report_type">webkit</field> |
|
||||
<field name="report_name">account.account_report_general_ledger_webkit</field> |
|
||||
<field eval="[(6,0,[])]" name="groups_id"/> |
|
||||
<field eval="0" name="multi"/> |
|
||||
<field eval="0" name="auto"/> |
|
||||
<field eval="1" name="header"/> |
|
||||
<field name="model">account.account</field> |
|
||||
<field name="type">ir.actions.report.xml</field> |
|
||||
<field name="name">General Ledger Webkit</field> |
|
||||
<field name="report_rml">account_financial_report_webkit/report/templates/account_report_general_ledger.mako</field> |
|
||||
<field name="report_file">account_financial_report_webkit/report/templates/account_report_general_ledger.mako</field> |
|
||||
</record> |
|
||||
|
|
||||
<record id="property_account_report_general_ledger_webkit" model="ir.property"> |
|
||||
<field name="name">account_report_general_ledger_webkit</field> |
|
||||
<field name="fields_id" ref="report_webkit.field_ir_act_report_xml_webkit_header"/> |
|
||||
<field eval="'ir.header_webkit,'+str(ref('account_financial_report_webkit.financial_landscape_header'))" model="ir.header_webkit" name="value"/> |
|
||||
<field eval="'ir.actions.report.xml,'+str(ref('account_financial_report_webkit.account_report_general_ledger_webkit'))" model="ir.actions.report.xml" name="res_id"/> |
|
||||
</record> |
|
||||
|
|
||||
<!-- we do not use report tag has we can not set header ref --> |
|
||||
<record id="account_report_partners_ledger_webkit" model="ir.actions.report.xml"> |
|
||||
<field name="report_type">webkit</field> |
|
||||
<field name="report_name">account.account_report_partners_ledger_webkit</field> |
|
||||
<field eval="[(6,0,[])]" name="groups_id"/> |
|
||||
<field eval="0" name="multi"/> |
|
||||
<field eval="0" name="auto"/> |
|
||||
<field eval="1" name="header"/> |
|
||||
<field name="model">account.account</field> |
|
||||
<field name="type">ir.actions.report.xml</field> |
|
||||
<field name="name">Partner Ledger Webkit</field> |
|
||||
<field name="report_rml">account_financial_report_webkit/report/templates/account_report_partners_ledger.mako</field> |
|
||||
<field name="report_file">account_financial_report_webkit/report/templates/account_report_partners_ledger.mako</field> |
|
||||
</record> |
|
||||
|
|
||||
<record id="property_account_report_partners_ledger_webkit" model="ir.property"> |
|
||||
<field name="name">account_report_partners_ledger_webkit</field> |
|
||||
<field name="fields_id" ref="report_webkit.field_ir_act_report_xml_webkit_header"/> |
|
||||
<field eval="'ir.header_webkit,'+str(ref('account_financial_report_webkit.financial_landscape_header'))" model="ir.header_webkit" name="value"/> |
|
||||
<field eval="'ir.actions.report.xml,'+str(ref('account_financial_report_webkit.account_report_partners_ledger_webkit'))" model="ir.actions.report.xml" name="res_id"/> |
|
||||
</record> |
|
||||
|
|
||||
<record id="account_report_trial_balance_webkit" model="ir.actions.report.xml"> |
|
||||
<field name="report_type">webkit</field> |
|
||||
<field name="report_name">account.account_report_trial_balance_webkit</field> |
|
||||
<field eval="[(6,0,[])]" name="groups_id"/> |
|
||||
<field eval="0" name="multi"/> |
|
||||
<field eval="0" name="auto"/> |
|
||||
<field eval="1" name="header"/> |
|
||||
<field name="model">account.account</field> |
|
||||
<field name="type">ir.actions.report.xml</field> |
|
||||
<field name="name">Trial Balance Webkit</field> |
|
||||
<field name="report_rml">account_financial_report_webkit/report/templates/account_report_trial_balance.mako</field> |
|
||||
<field name="report_file">account_financial_report_webkit/report/templates/account_report_trial_balance.mako</field> |
|
||||
</record> |
|
||||
|
|
||||
<record id="property_account_report_trial_balance_webkit" model="ir.property"> |
|
||||
<field name="name">account_report_trial_balance_webkit</field> |
|
||||
<field name="fields_id" ref="report_webkit.field_ir_act_report_xml_webkit_header"/> |
|
||||
<field eval="'ir.header_webkit,'+str(ref('account_financial_report_webkit.financial_portrait_header'))" model="ir.header_webkit" name="value"/> |
|
||||
<field eval="'ir.actions.report.xml,'+str(ref('account_financial_report_webkit.account_report_trial_balance_webkit'))" model="ir.actions.report.xml" name="res_id"/> |
|
||||
</record> |
|
||||
|
|
||||
<record id="account_report_partner_balance_webkit" model="ir.actions.report.xml"> |
|
||||
<field name="report_type">webkit</field> |
|
||||
<field name="report_name">account.account_report_partner_balance_webkit</field> |
|
||||
<field eval="[(6,0,[])]" name="groups_id"/> |
|
||||
<field eval="0" name="multi"/> |
|
||||
<field eval="0" name="auto"/> |
|
||||
<field eval="1" name="header"/> |
|
||||
<field name="model">account.account</field> |
|
||||
<field name="type">ir.actions.report.xml</field> |
|
||||
<field name="name">Partner Balance Webkit</field> |
|
||||
<field name="report_rml">account_financial_report_webkit/report/templates/account_report_partner_balance.mako</field> |
|
||||
<field name="report_file">account_financial_report_webkit/report/templates/account_report_partner_balance.mako</field> |
|
||||
</record> |
|
||||
|
|
||||
<record id="property_account_report_partner_balance_webkit" model="ir.property"> |
|
||||
<field name="name">account_report_partner_balance_webkit</field> |
|
||||
<field name="fields_id" ref="report_webkit.field_ir_act_report_xml_webkit_header"/> |
|
||||
<field eval="'ir.header_webkit,'+str(ref('account_financial_report_webkit.financial_portrait_header'))" model="ir.header_webkit" name="value"/> |
|
||||
<field eval="'ir.actions.report.xml,'+str(ref('account_financial_report_webkit.account_report_partner_balance_webkit'))" model="ir.actions.report.xml" name="res_id"/> |
|
||||
</record> |
|
||||
|
|
||||
<record id="account_report_open_invoices_webkit" model="ir.actions.report.xml"> |
|
||||
<field name="report_type">webkit</field> |
|
||||
<field name="report_name">account.account_report_open_invoices_webkit</field> |
|
||||
<field eval="[(6,0,[])]" name="groups_id"/> |
|
||||
<field eval="0" name="multi"/> |
|
||||
<field eval="0" name="auto"/> |
|
||||
<field eval="1" name="header"/> |
|
||||
<field name="model">account.account</field> |
|
||||
<field name="type">ir.actions.report.xml</field> |
|
||||
<field name="name">Open Invoices Report</field> |
|
||||
<field name="report_rml">account_financial_report_webkit/report/templates/account_report_open_invoices.mako</field> |
|
||||
<field name="report_file">account_financial_report_webkit/report/templates/account_report_open_invoices.mako</field> |
|
||||
</record> |
|
||||
|
|
||||
<record id="property_account_report_open_invoices_webkit" model="ir.property"> |
|
||||
<field name="name">account_report_open_invoices_webkit</field> |
|
||||
<field name="fields_id" ref="report_webkit.field_ir_act_report_xml_webkit_header"/> |
|
||||
<field eval="'ir.header_webkit,'+str(ref('account_financial_report_webkit.financial_landscape_header'))" model="ir.header_webkit" name="value"/> |
|
||||
<field eval="'ir.actions.report.xml,'+str(ref('account_financial_report_webkit.account_report_open_invoices_webkit'))" model="ir.actions.report.xml" name="res_id"/> |
|
||||
</record> |
|
||||
|
|
||||
<record id="account_report_aged_trial_blanance_webkit" model="ir.actions.report.xml"> |
|
||||
<field name="report_type">webkit</field> |
|
||||
<field name="report_name">account.account_aged_trial_balance_webkit</field> |
|
||||
<field eval="[(6,0,[])]" name="groups_id"/> |
|
||||
<field eval="0" name="multi"/> |
|
||||
<field eval="0" name="auto"/> |
|
||||
<field eval="1" name="header"/> |
|
||||
<field name="model">account.account</field> |
|
||||
<field name="type">ir.actions.report.xml</field> |
|
||||
<field name="name">Aged Partner Balance</field> |
|
||||
<field name="report_rml">account_financial_report_webkit/report/templates/aged_trial_webkit.mako</field> |
|
||||
<field name="report_file">account_financial_report_webkit/report/templates/aged_trial_webkit.mako</field> |
|
||||
</record> |
|
||||
|
|
||||
<record id="property_account_report_aged_trial_balance_webkit" model="ir.property"> |
|
||||
<field name="name">account_aged_trial_balance_webkit</field> |
|
||||
<field name="fields_id" ref="report_webkit.field_ir_act_report_xml_webkit_header"/> |
|
||||
<field eval="'ir.header_webkit,'+str(ref('account_financial_report_webkit.financial_landscape_header'))" |
|
||||
model="ir.header_webkit" |
|
||||
name="value"/> |
|
||||
<field eval="'ir.actions.report.xml,'+str(ref('account_financial_report_webkit.account_report_aged_trial_blanance_webkit'))" |
|
||||
model="ir.actions.report.xml" |
|
||||
name="res_id"/> |
|
||||
</record> |
|
||||
|
|
||||
<record id="account_report_print_journal_webkit" model="ir.actions.report.xml"> |
|
||||
<field name="report_type">webkit</field> |
|
||||
<field name="report_name">account.account_report_print_journal_webkit</field> |
|
||||
<field eval="[(6,0,[])]" name="groups_id"/> |
|
||||
<field eval="0" name="multi"/> |
|
||||
<field eval="0" name="auto"/> |
|
||||
<field eval="1" name="header"/> |
|
||||
<field name="model">account.move</field> |
|
||||
<field name="type">ir.actions.report.xml</field> |
|
||||
<field name="name">Journals</field> |
|
||||
<field name="report_rml">account_financial_report_webkit/report/templates/account_report_print_journal.mako</field> |
|
||||
<field name="report_file">account_financial_report_webkit/report/templates/account_report_print_journal.mako</field> |
|
||||
</record> |
|
||||
|
|
||||
<record id="property_account_report_print_journal_webkit" model="ir.property"> |
|
||||
<field name="name">account_report_print_journal_webkit</field> |
|
||||
<field name="fields_id" ref="report_webkit.field_ir_act_report_xml_webkit_header"/> |
|
||||
<field eval="'ir.header_webkit,'+str(ref('account_financial_report_webkit.financial_landscape_header'))" model="ir.header_webkit" name="value"/> |
|
||||
<field eval="'ir.actions.report.xml,'+str(ref('account_financial_report_webkit.account_report_print_journal_webkit'))" model="ir.actions.report.xml" name="res_id"/> |
|
||||
</record> |
|
||||
|
|
||||
</data> |
|
||||
</openerp> |
|
@ -1,243 +0,0 @@ |
|||||
## -*- coding: utf-8 -*- |
|
||||
<!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
|
||||
<html xmlns="http://www.w3.org/1999/xhtml"> |
|
||||
<head> |
|
||||
<style type="text/css"> |
|
||||
.overflow_ellipsis { |
|
||||
text-overflow: ellipsis; |
|
||||
overflow: hidden; |
|
||||
white-space: nowrap; |
|
||||
} |
|
||||
${css} |
|
||||
</style> |
|
||||
</head> |
|
||||
<body> |
|
||||
<%! |
|
||||
def amount(text): |
|
||||
return text.replace('-', '‑') # replace by a non-breaking hyphen (it will not word-wrap between hyphen and numbers) |
|
||||
%> |
|
||||
|
|
||||
<%setLang(user.lang)%> |
|
||||
|
|
||||
<% |
|
||||
initial_balance_text = {'initial_balance': _('Computed'), 'opening_balance': _('Opening Entries'), False: _('No')} |
|
||||
%> |
|
||||
|
|
||||
%if amount_currency(data): |
|
||||
<div class="act_as_table data_table" style="width: 1205px;"> |
|
||||
%else: |
|
||||
<div class="act_as_table data_table" style="width: 1100px;"> |
|
||||
%endif |
|
||||
<div class="act_as_row labels"> |
|
||||
<div class="act_as_cell">${_('Chart of Account')}</div> |
|
||||
<div class="act_as_cell">${_('Fiscal Year')}</div> |
|
||||
<div class="act_as_cell"> |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${_('Dates Filter')} |
|
||||
%else: |
|
||||
${_('Periods Filter')} |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell">${_('Accounts Filter')}</div> |
|
||||
<div class="act_as_cell">${_('Target Moves')}</div> |
|
||||
<div class="act_as_cell">${_('Initial Balance')}</div> |
|
||||
</div> |
|
||||
<div class="act_as_row"> |
|
||||
<div class="act_as_cell">${ chart_account.name }</div> |
|
||||
<div class="act_as_cell">${ fiscalyear.name if fiscalyear else '-' }</div> |
|
||||
<div class="act_as_cell"> |
|
||||
${_('From:')} |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${formatLang(start_date, date=True) if start_date else u'' } |
|
||||
%else: |
|
||||
${start_period.name if start_period else u''} |
|
||||
%endif |
|
||||
${_('To:')} |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${ formatLang(stop_date, date=True) if stop_date else u'' } |
|
||||
%else: |
|
||||
${stop_period.name if stop_period else u'' } |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell"> |
|
||||
%if accounts(data): |
|
||||
${', '.join([account.code for account in accounts(data)])} |
|
||||
%else: |
|
||||
${_('All')} |
|
||||
%endif |
|
||||
|
|
||||
</div> |
|
||||
<div class="act_as_cell">${ display_target_move(data) }</div> |
|
||||
<div class="act_as_cell">${ initial_balance_text[initial_balance_mode] }</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
<!-- we use div with css instead of table for tabular data because div do not cut rows at half at page breaks --> |
|
||||
%for account in objects: |
|
||||
<% |
|
||||
display_initial_balance = init_balance[account.id] and (init_balance[account.id].get('debit') != 0.0 or init_balance[account.id].get('credit', 0.0) != 0.0) |
|
||||
display_ledger_lines = ledger_lines[account.id] |
|
||||
%> |
|
||||
%if display_account_raw(data) == 'all' or (display_ledger_lines or display_initial_balance): |
|
||||
<% |
|
||||
cumul_debit = 0.0 |
|
||||
cumul_credit = 0.0 |
|
||||
cumul_balance = 0.0 |
|
||||
cumul_balance_curr = 0.0 |
|
||||
%> |
|
||||
<div class="act_as_table list_table" style="margin-top: 10px;"> |
|
||||
|
|
||||
<div class="act_as_caption account_title"> |
|
||||
${account.code} - ${account.name} |
|
||||
</div> |
|
||||
<div class="act_as_thead"> |
|
||||
<div class="act_as_row labels"> |
|
||||
## date |
|
||||
<div class="act_as_cell first_column" style="width: 50px;">${_('Date')}</div> |
|
||||
## period |
|
||||
<div class="act_as_cell" style="width: 50px;">${_('Period')}</div> |
|
||||
## move |
|
||||
<div class="act_as_cell" style="width: 100px;">${_('Entry')}</div> |
|
||||
## journal |
|
||||
<div class="act_as_cell" style="width: 70px;">${_('Journal')}</div> |
|
||||
## account code |
|
||||
<div class="act_as_cell" style="width: 65px;">${_('Account')}</div> |
|
||||
## partner |
|
||||
<div class="act_as_cell" style="width: 140px;">${_('Partner')}</div> |
|
||||
## move reference |
|
||||
<div class="act_as_cell" style="width: 140px;">${_('Reference')}</div> |
|
||||
## label |
|
||||
<div class="act_as_cell" style="width: 160px;">${_('Label')}</div> |
|
||||
## counterpart |
|
||||
<div class="act_as_cell" style="width: 100px;">${_('Counter part')}</div> |
|
||||
## debit |
|
||||
<div class="act_as_cell amount" style="width: 75px;">${_('Debit')}</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount" style="width: 75px;">${_('Credit')}</div> |
|
||||
## balance cumulated |
|
||||
<div class="act_as_cell amount" style="width: 75px;">${_('Cumul. Bal.')}</div> |
|
||||
%if amount_currency(data): |
|
||||
## currency balance |
|
||||
<div class="act_as_cell amount sep_left" style="width: 75px;">${_('Curr. Balance')}</div> |
|
||||
## curency code |
|
||||
<div class="act_as_cell amount" style="width: 30px; text-align: right;">${_('Curr.')}</div> |
|
||||
%endif |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
<div class="act_as_tbody"> |
|
||||
%if display_initial_balance: |
|
||||
<% |
|
||||
cumul_debit = init_balance[account.id].get('debit') or 0.0 |
|
||||
cumul_credit = init_balance[account.id].get('credit') or 0.0 |
|
||||
cumul_balance = init_balance[account.id].get('init_balance') or 0.0 |
|
||||
cumul_balance_curr = init_balance[account.id].get('init_balance_currency') or 0.0 |
|
||||
%> |
|
||||
<div class="act_as_row initial_balance"> |
|
||||
## date |
|
||||
<div class="act_as_cell first_column"></div> |
|
||||
## period |
|
||||
<div class="act_as_cell"></div> |
|
||||
## move |
|
||||
<div class="act_as_cell"></div> |
|
||||
## journal |
|
||||
<div class="act_as_cell"></div> |
|
||||
## account code |
|
||||
<div class="act_as_cell"></div> |
|
||||
## partner |
|
||||
<div class="act_as_cell"></div> |
|
||||
## move reference |
|
||||
<div class="act_as_cell"></div> |
|
||||
## label |
|
||||
<div class="act_as_cell">${_('Initial Balance')}</div> |
|
||||
## counterpart |
|
||||
<div class="act_as_cell"></div> |
|
||||
## debit |
|
||||
<div class="act_as_cell amount">${formatLang(init_balance[account.id].get('debit')) | amount}</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount">${formatLang(init_balance[account.id].get('credit')) | amount}</div> |
|
||||
## balance cumulated |
|
||||
<div class="act_as_cell amount" style="padding-right: 1px;">${formatLang(cumul_balance) | amount }</div> |
|
||||
%if amount_currency(data): |
|
||||
## currency balance |
|
||||
<div class="act_as_cell amount sep_left">${formatLang(cumul_balance_curr) | amount }</div> |
|
||||
## curency code |
|
||||
<div class="act_as_cell amount"></div> |
|
||||
%endif |
|
||||
|
|
||||
</div> |
|
||||
%endif |
|
||||
%for line in ledger_lines[account.id]: |
|
||||
<% |
|
||||
cumul_debit += line.get('debit') or 0.0 |
|
||||
cumul_credit += line.get('credit') or 0.0 |
|
||||
cumul_balance_curr += line.get('amount_currency') or 0.0 |
|
||||
cumul_balance += line.get('balance') or 0.0 |
|
||||
label_elements = [line.get('lname') or ''] |
|
||||
if line.get('invoice_number'): |
|
||||
label_elements.append("(%s)" % (line['invoice_number'],)) |
|
||||
label = ' '.join(label_elements) |
|
||||
%> |
|
||||
|
|
||||
<div class="act_as_row lines"> |
|
||||
## date |
|
||||
<div class="act_as_cell first_column">${formatLang(line.get('ldate') or '', date=True)}</div> |
|
||||
## period |
|
||||
<div class="act_as_cell">${line.get('period_code') or ''}</div> |
|
||||
## move |
|
||||
<div class="act_as_cell">${line.get('move_name') or ''}</div> |
|
||||
## journal |
|
||||
<div class="act_as_cell">${line.get('jcode') or ''}</div> |
|
||||
## account code |
|
||||
<div class="act_as_cell">${account.code}</div> |
|
||||
## partner |
|
||||
<div class="act_as_cell overflow_ellipsis">${line.get('partner_name') or ''}</div> |
|
||||
## move reference |
|
||||
<div class="act_as_cell">${line.get('lref') or ''}</div> |
|
||||
## label |
|
||||
<div class="act_as_cell">${label}</div> |
|
||||
## counterpart |
|
||||
<div class="act_as_cell">${line.get('counterparts') or ''}</div> |
|
||||
## debit |
|
||||
<div class="act_as_cell amount">${ formatLang(line.get('debit', 0.0)) | amount }</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount">${ formatLang(line.get('credit', 0.0)) | amount }</div> |
|
||||
## balance cumulated |
|
||||
<div class="act_as_cell amount" style="padding-right: 1px;">${ formatLang(cumul_balance) | amount }</div> |
|
||||
%if amount_currency(data): |
|
||||
## currency balance |
|
||||
<div class="act_as_cell amount sep_left">${formatLang(line.get('amount_currency') or 0.0) | amount }</div> |
|
||||
## curency code |
|
||||
<div class="act_as_cell amount" style="text-align: right;">${line.get('currency_code') or ''}</div> |
|
||||
%endif |
|
||||
</div> |
|
||||
%endfor |
|
||||
</div> |
|
||||
<div class="act_as_table list_table"> |
|
||||
<div class="act_as_row labels" style="font-weight: bold;"> |
|
||||
## date |
|
||||
<div class="act_as_cell first_column" style="width: 615px;">${account.code} - ${account.name}</div> |
|
||||
<div class="act_as_cell" style="width: 260px;">${_("Cumulated Balance on Account")}</div> |
|
||||
## debit |
|
||||
<div class="act_as_cell amount" style="width: 75px;">${ formatLang(cumul_debit) | amount }</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount" style="width: 75px;">${ formatLang(cumul_credit) | amount }</div> |
|
||||
## balance cumulated |
|
||||
<div class="act_as_cell amount" style="width: 75px; padding-right: 1px;">${ formatLang(cumul_balance) | amount }</div> |
|
||||
%if amount_currency(data): |
|
||||
%if account.currency_id: |
|
||||
## currency balance |
|
||||
<div class="act_as_cell amount sep_left" style="width: 75px;">${formatLang(cumul_balance_curr) | amount }</div> |
|
||||
%else: |
|
||||
<div class="act_as_cell amount sep_left" style="width: 75px;">-</div> |
|
||||
%endif |
|
||||
## curency code |
|
||||
<div class="act_as_cell amount" style="width: 30px; text-align: right;"></div> |
|
||||
%endif |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
%endif |
|
||||
%endfor |
|
||||
</body> |
|
||||
</html> |
|
@ -1,85 +0,0 @@ |
|||||
## -*- coding: utf-8 -*- |
|
||||
<!DOCTYPE html SYSTEM |
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
|
||||
<html xmlns="http://www.w3.org/1999/xhtml"> |
|
||||
<head> |
|
||||
<style type="text/css"> |
|
||||
.overflow_ellipsis { |
|
||||
text-overflow: ellipsis; |
|
||||
overflow: hidden; |
|
||||
white-space: nowrap; |
|
||||
} |
|
||||
|
|
||||
.open_invoice_previous_line { |
|
||||
font-style: italic; |
|
||||
} |
|
||||
|
|
||||
.clearance_line { |
|
||||
font-style: italic; |
|
||||
} |
|
||||
${css} |
|
||||
</style> |
|
||||
</head> |
|
||||
<body> |
|
||||
|
|
||||
<% template1 = helper.get_mako_template('account_financial_report_webkit','report', 'templates', 'open_invoices_inclusion.mako.html') %> |
|
||||
<% context.lookup.put_template('open_invoices_inclusion.mako.html', template1) %> |
|
||||
<% template2 = helper.get_mako_template('account_financial_report_webkit','report', 'templates', 'grouped_by_curr_open_invoices_inclusion.mako.html') %> |
|
||||
<% context.lookup.put_template('grouped_by_curr_open_invoices_inclusion.mako.html', template2) %> |
|
||||
<%setLang(user.lang)%> |
|
||||
|
|
||||
<div class="act_as_table data_table"> |
|
||||
<div class="act_as_row labels"> |
|
||||
<div class="act_as_cell">${_('Chart of Account')}</div> |
|
||||
<div class="act_as_cell">${_('Fiscal Year')}</div> |
|
||||
<div class="act_as_cell"> |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${_('Dates Filter')} |
|
||||
%else: |
|
||||
${_('Periods Filter')} |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell">${_('Clearance Date')}</div> |
|
||||
<div class="act_as_cell">${_('Accounts Filter')}</div> |
|
||||
<div class="act_as_cell">${_('Target Moves')}</div> |
|
||||
|
|
||||
</div> |
|
||||
<div class="act_as_row"> |
|
||||
<div class="act_as_cell">${ chart_account.name }</div> |
|
||||
<div class="act_as_cell">${ fiscalyear.name if fiscalyear else '-' }</div> |
|
||||
<div class="act_as_cell"> |
|
||||
${_('From:')} |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${formatLang(start_date, date=True) if start_date else u'' } |
|
||||
%else: |
|
||||
${start_period.name if start_period else u''} |
|
||||
%endif |
|
||||
${_('To:')} |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${ formatLang(stop_date, date=True) if stop_date else u'' } |
|
||||
%else: |
|
||||
${stop_period.name if stop_period else u'' } |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell">${ formatLang(date_until, date=True) }</div> |
|
||||
<div class="act_as_cell"> |
|
||||
%if partner_ids: |
|
||||
${_('Custom Filter')} |
|
||||
%else: |
|
||||
${ display_partner_account(data) } |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell">${ display_target_move(data) }</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
%for acc in objects: |
|
||||
%if 'grouped_ledger_lines' in acc: |
|
||||
<% fl = formatLang %> |
|
||||
<%include file="grouped_by_curr_open_invoices_inclusion.mako.html" args="account=acc,formatLang=fl"/> |
|
||||
%else: |
|
||||
<% fl = formatLang %> |
|
||||
<%include file="open_invoices_inclusion.mako.html" args="account=acc,formatLang=fl"/> |
|
||||
%endif |
|
||||
%endfor |
|
||||
</body> |
|
||||
</html> |
|
@ -1,291 +0,0 @@ |
|||||
## -*- coding: utf-8 -*- |
|
||||
<!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
|
||||
<html xmlns="http://www.w3.org/1999/xhtml"> |
|
||||
<head> |
|
||||
<style type="text/css"> |
|
||||
${css} |
|
||||
|
|
||||
.list_table .act_as_row { |
|
||||
margin-top: 10px; |
|
||||
margin-bottom: 10px; |
|
||||
font-size:10px; |
|
||||
} |
|
||||
|
|
||||
.account_line { |
|
||||
font-weight: bold; |
|
||||
font-size: 15px; |
|
||||
background-color:#F0F0F0; |
|
||||
} |
|
||||
|
|
||||
.account_line .act_as_cell { |
|
||||
height: 30px; |
|
||||
vertical-align: bottom; |
|
||||
} |
|
||||
|
|
||||
</style> |
|
||||
</head> |
|
||||
<body> |
|
||||
<%! |
|
||||
def amount(text): |
|
||||
return text.replace('-', '‑') # replace by a non-breaking hyphen (it will not word-wrap between hyphen and numbers) |
|
||||
|
|
||||
def display_line(all_comparison_lines): |
|
||||
return any([line.get('balance') for line in all_comparison_lines]) |
|
||||
%> |
|
||||
|
|
||||
<%setLang(user.lang)%> |
|
||||
|
|
||||
<% |
|
||||
initial_balance_text = {'initial_balance': _('Computed'), 'opening_balance': _('Opening Entries'), False: _('No')} |
|
||||
%> |
|
||||
|
|
||||
<div class="act_as_table data_table"> |
|
||||
<div class="act_as_row labels"> |
|
||||
<div class="act_as_cell">${_('Chart of Account')}</div> |
|
||||
<div class="act_as_cell">${_('Fiscal Year')}</div> |
|
||||
<div class="act_as_cell"> |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${_('Dates Filter')} |
|
||||
%else: |
|
||||
${_('Periods Filter')} |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell">${_('Accounts Filter')}</div> |
|
||||
<div class="act_as_cell">${_('Partners Filter')}</div> |
|
||||
<div class="act_as_cell">${_('Target Moves')}</div> |
|
||||
<div class="act_as_cell">${_('Initial Balance')}</div> |
|
||||
</div> |
|
||||
<div class="act_as_row"> |
|
||||
<div class="act_as_cell">${ chart_account.name }</div> |
|
||||
<div class="act_as_cell">${ fiscalyear.name if fiscalyear else '-' }</div> |
|
||||
<div class="act_as_cell"> |
|
||||
${_('From:')} |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${formatLang(start_date, date=True) if start_date else u'' } |
|
||||
%else: |
|
||||
${start_period.name if start_period else u''} |
|
||||
%endif |
|
||||
${_('To:')} |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${ formatLang(stop_date, date=True) if stop_date else u'' } |
|
||||
%else: |
|
||||
${stop_period.name if stop_period else u'' } |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell"> |
|
||||
%if accounts(data): |
|
||||
${', '.join([account.code for account in accounts(data)])} |
|
||||
%else: |
|
||||
${_('All')} |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell">${display_partner_account(data)}</div> |
|
||||
<div class="act_as_cell">${ display_target_move(data) }</div> |
|
||||
<div class="act_as_cell">${ initial_balance_text[initial_balance_mode] }</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
%for index, params in enumerate(comp_params): |
|
||||
<div class="act_as_table data_table"> |
|
||||
<div class="act_as_row"> |
|
||||
<div class="act_as_cell">${_('Comparison %s') % (index + 1,)} (${"C%s" % (index + 1,)})</div> |
|
||||
<div class="act_as_cell"> |
|
||||
%if params['comparison_filter'] == 'filter_date': |
|
||||
${_('Dates Filter:')} ${formatLang(params['start'], date=True) } - ${formatLang(params['stop'], date=True) } |
|
||||
%elif params['comparison_filter'] == 'filter_period': |
|
||||
${_('Periods Filter:')} ${params['start'].name} - ${params['stop'].name} |
|
||||
%else: |
|
||||
${_('Fiscal Year :')} ${params['fiscalyear'].name} |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell">${ _('Initial Balance:')} ${ initial_balance_text[params['initial_balance_mode']] }</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
%endfor |
|
||||
|
|
||||
%for current_account in objects: |
|
||||
<% |
|
||||
partners_order = partners_order_accounts[current_account.id] |
|
||||
|
|
||||
# do not display accounts without partners |
|
||||
if not partners_order: |
|
||||
continue |
|
||||
|
|
||||
comparisons = comparisons_accounts[current_account.id] |
|
||||
|
|
||||
# in multiple columns mode, we do not want to print accounts without any rows |
|
||||
if comparison_mode in ('single', 'multiple'): |
|
||||
all_comparison_lines = [comp['partners_amounts'][partner_id[1]] |
|
||||
for partner_id in partners_order |
|
||||
for comp in comparisons] |
|
||||
if not display_line(all_comparison_lines): |
|
||||
continue |
|
||||
|
|
||||
current_partner_amounts = partners_amounts_accounts[current_account.id] |
|
||||
|
|
||||
total_initial_balance = 0.0 |
|
||||
total_debit = 0.0 |
|
||||
total_credit = 0.0 |
|
||||
total_balance = 0.0 |
|
||||
if comparison_mode in ('single', 'multiple'): |
|
||||
comparison_total = {} |
|
||||
for i, comp in enumerate(comparisons): |
|
||||
comparison_total[i] = {'balance': 0.0} |
|
||||
%> |
|
||||
|
|
||||
<div class="account_title bg" style="margin-top: 20px; font-size: 12px; width: 690px;">${current_account.code} - ${current_account.name}</div> |
|
||||
|
|
||||
<div class="act_as_table list_table"> |
|
||||
|
|
||||
<div class="act_as_thead"> |
|
||||
<div class="act_as_row labels"> |
|
||||
## account name |
|
||||
<div class="act_as_cell" style="width: 80px;">${_('Account / Partner Name')}</div> |
|
||||
## code |
|
||||
<div class="act_as_cell first_column" style="width: 20px;">${_('Code / Ref')}</div> |
|
||||
%if comparison_mode == 'no_comparison': |
|
||||
%if initial_balance_mode: |
|
||||
## initial balance |
|
||||
<div class="act_as_cell amount" style="width: 30px;">${_('Initial Balance')}</div> |
|
||||
%endif |
|
||||
## debit |
|
||||
<div class="act_as_cell amount" style="width: 30px;">${_('Debit')}</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount" style="width: 30px;">${_('Credit')}</div> |
|
||||
%endif |
|
||||
## balance |
|
||||
<div class="act_as_cell amount" style="width: 30px;"> |
|
||||
%if comparison_mode == 'no_comparison' or not fiscalyear: |
|
||||
${_('Balance')} |
|
||||
%else: |
|
||||
${_('Balance %s') % (fiscalyear.name,)} |
|
||||
%endif |
|
||||
</div> |
|
||||
%if comparison_mode in ('single', 'multiple'): |
|
||||
%for index in range(nb_comparison): |
|
||||
<div class="act_as_cell amount" style="width: 30px;"> |
|
||||
%if comp_params[index]['comparison_filter'] == 'filter_year' and comp_params[index].get('fiscalyear', False): |
|
||||
${_('Balance %s') % (comp_params[index]['fiscalyear'].name,)} |
|
||||
%else: |
|
||||
${_('Balance C%s') % (index + 1,)} |
|
||||
%endif |
|
||||
</div> |
|
||||
%if comparison_mode == 'single': ## no diff in multiple comparisons because it shows too data |
|
||||
<div class="act_as_cell amount" style="width: 30px;">${_('Difference')}</div> |
|
||||
<div class="act_as_cell amount" style="width: 30px;">${_('% Difference')}</div> |
|
||||
%endif |
|
||||
%endfor |
|
||||
%endif |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
<div class="act_as_tbody"> |
|
||||
|
|
||||
%for (partner_code_name, partner_id, partner_ref, partner_name) in partners_order: |
|
||||
<% |
|
||||
partner = current_partner_amounts.get(partner_id, {}) |
|
||||
|
|
||||
# in single mode, we have to display all the partners |
|
||||
# even if their balance is 0.0 because the initial balance |
|
||||
# should match with the previous year closings |
|
||||
|
|
||||
# in multiple columns mode, we do not want to print partners |
|
||||
# which have a balance at 0.0 in each comparison column |
|
||||
if comparison_mode in ('single', 'multiple'): |
|
||||
all_comparison_lines = [comp['partners_amounts'][partner_id] |
|
||||
for comp in comparisons |
|
||||
if comp['partners_amounts'].get(partner_id)] |
|
||||
if not display_line(all_comparison_lines): |
|
||||
continue |
|
||||
|
|
||||
total_initial_balance += partner.get('init_balance', 0.0) |
|
||||
total_debit += partner.get('debit', 0.0) |
|
||||
total_credit += partner.get('credit', 0.0) |
|
||||
total_balance += partner.get('balance', 0.0) |
|
||||
%> |
|
||||
<div class="act_as_row lines"> |
|
||||
<div class="act_as_cell">${partner_name if partner_name else _('Unallocated') }</div> |
|
||||
<div class="act_as_cell first_column">${partner_ref if partner_ref else ''}</div> |
|
||||
%if comparison_mode == 'no_comparison': |
|
||||
%if initial_balance_mode: |
|
||||
<div class="act_as_cell amount">${formatLang(partner.get('init_balance', 0.0)) | amount}</div> |
|
||||
%endif |
|
||||
<div class="act_as_cell amount">${formatLang(partner.get('debit', 0.0)) | amount}</div> |
|
||||
<div class="act_as_cell amount">${formatLang(partner.get('credit', 0.0)) | amount}</div> |
|
||||
%endif |
|
||||
<div class="act_as_cell amount">${formatLang(partner['balance'] if partner else 0.0) | amount}</div> |
|
||||
|
|
||||
%if comparison_mode in ('single', 'multiple'): |
|
||||
%for i, comp in enumerate(comparisons): |
|
||||
<% |
|
||||
comp_partners = comp['partners_amounts'] |
|
||||
balance = diff = percent_diff = 0 |
|
||||
if comp_partners.get(partner_id): |
|
||||
balance = comp_partners[partner_id]['balance'] |
|
||||
diff = comp_partners[partner_id]['diff'] |
|
||||
percent_diff = comp_partners[partner_id]['percent_diff'] |
|
||||
comparison_total[i]['balance'] += balance |
|
||||
%> |
|
||||
<div class="act_as_cell amount">${formatLang(balance) | amount}</div> |
|
||||
%if comparison_mode == 'single': ## no diff in multiple comparisons because it shows too data |
|
||||
<div class="act_as_cell amount">${formatLang(diff) | amount}</div> |
|
||||
<div class="act_as_cell amount"> |
|
||||
%if percent_diff is False: |
|
||||
${ '-' } |
|
||||
%else: |
|
||||
${int(round(percent_diff)) | amount} % |
|
||||
%endif |
|
||||
</div> |
|
||||
%endif |
|
||||
%endfor |
|
||||
%endif |
|
||||
</div> |
|
||||
%endfor |
|
||||
|
|
||||
</div> |
|
||||
<div class="act_as_tfoot" style="margin-top:5px;"> |
|
||||
<div class="act_as_row labels" style="font-weight: bold; font-size: 11x;"> |
|
||||
## account name |
|
||||
<div class="act_as_cell">${current_account.name}</div> |
|
||||
## code |
|
||||
<div class="act_as_cell first_column">${current_account.code}</div> |
|
||||
%if comparison_mode == 'no_comparison': |
|
||||
%if initial_balance_mode: |
|
||||
## opening balance |
|
||||
<div class="act_as_cell amount">${formatLang(total_initial_balance) | amount}</div> |
|
||||
%endif |
|
||||
## debit |
|
||||
<div class="act_as_cell amount">${formatLang(total_debit) | amount}</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount">${formatLang(total_credit and total_credit * -1 or 0.0) | amount}</div> |
|
||||
%endif |
|
||||
## balance |
|
||||
<div class="act_as_cell amount">${formatLang(total_balance) | amount}</div> |
|
||||
|
|
||||
%if comparison_mode in ('single', 'multiple'): |
|
||||
%for i, comp in enumerate(comparisons): |
|
||||
<% |
|
||||
comp_account = comp['account'] |
|
||||
diffs = compute_diff(total_balance, comparison_total[i]['balance']) |
|
||||
%> |
|
||||
<div class="act_as_cell amount">${formatLang(comparison_total[i]['balance']) | amount}</div> |
|
||||
%if comparison_mode == 'single': ## no diff in multiple comparisons because it shows too data |
|
||||
<div class="act_as_cell amount">${formatLang(diffs['diff']) | amount}</div> |
|
||||
<div class="act_as_cell amount"> |
|
||||
%if diffs['percent_diff'] is False: |
|
||||
${ '-' } |
|
||||
%else: |
|
||||
${int(round(diffs['percent_diff'])) | amount} % |
|
||||
%endif |
|
||||
</div> |
|
||||
%endif |
|
||||
%endfor |
|
||||
%endif |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
%endfor |
|
||||
|
|
||||
</body> |
|
||||
</html> |
|
@ -1,290 +0,0 @@ |
|||||
## -*- coding: utf-8 -*- |
|
||||
<!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
|
||||
<html xmlns="http://www.w3.org/1999/xhtml"> |
|
||||
<head> |
|
||||
<style type="text/css"> |
|
||||
.overflow_ellipsis { |
|
||||
text-overflow: ellipsis; |
|
||||
overflow: hidden; |
|
||||
white-space: nowrap; |
|
||||
} |
|
||||
|
|
||||
${css} |
|
||||
</style> |
|
||||
</head> |
|
||||
<body> |
|
||||
<%! |
|
||||
def amount(text): |
|
||||
return text.replace('-', '‑') # replace by a non-breaking hyphen (it will not word-wrap between hyphen and numbers) |
|
||||
%> |
|
||||
|
|
||||
<%setLang(user.lang)%> |
|
||||
|
|
||||
<% |
|
||||
initial_balance_text = {'initial_balance': _('Computed'), 'opening_balance': _('Opening Entries'), False: _('No')} |
|
||||
%> |
|
||||
|
|
||||
<div class="act_as_table data_table"> |
|
||||
<div class="act_as_row labels"> |
|
||||
<div class="act_as_cell">${_('Chart of Account')}</div> |
|
||||
<div class="act_as_cell">${_('Fiscal Year')}</div> |
|
||||
<div class="act_as_cell"> |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${_('Dates Filter')} |
|
||||
%else: |
|
||||
${_('Periods Filter')} |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell">${_('Accounts Filter')}</div> |
|
||||
<div class="act_as_cell">${_('Target Moves')}</div> |
|
||||
<div class="act_as_cell">${_('Initial Balance')}</div> |
|
||||
</div> |
|
||||
<div class="act_as_row"> |
|
||||
<div class="act_as_cell">${ chart_account.name }</div> |
|
||||
<div class="act_as_cell">${ fiscalyear.name if fiscalyear else '-' }</div> |
|
||||
<div class="act_as_cell"> |
|
||||
${_('From:')} |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${formatLang(start_date, date=True) if start_date else u'' } |
|
||||
%else: |
|
||||
${start_period.name if start_period else u''} |
|
||||
%endif |
|
||||
${_('To:')} |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${ formatLang(stop_date, date=True) if stop_date else u'' } |
|
||||
%else: |
|
||||
${stop_period.name if stop_period else u'' } |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell"> |
|
||||
%if partner_ids: |
|
||||
${_('Custom Filter')} |
|
||||
%else: |
|
||||
${ display_partner_account(data) } |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell">${ display_target_move(data) }</div> |
|
||||
<div class="act_as_cell">${ initial_balance_text[initial_balance_mode] }</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
%for account in objects: |
|
||||
%if ledger_lines[account.id] or init_balance[account.id]: |
|
||||
<% |
|
||||
if not partners_order[account.id]: |
|
||||
continue |
|
||||
account_total_debit = 0.0 |
|
||||
account_total_credit = 0.0 |
|
||||
account_balance_cumul = 0.0 |
|
||||
account_balance_cumul_curr = 0.0 |
|
||||
%> |
|
||||
|
|
||||
<div class="account_title bg" style="width: 1080px; margin-top: 20px; font-size: 12px;">${account.code} - ${account.name}</div> |
|
||||
|
|
||||
%for partner_name, p_id, p_ref, p_name in partners_order[account.id]: |
|
||||
<% |
|
||||
total_debit = 0.0 |
|
||||
total_credit = 0.0 |
|
||||
cumul_balance = 0.0 |
|
||||
cumul_balance_curr = 0.0 |
|
||||
|
|
||||
part_cumul_balance = 0.0 |
|
||||
part_cumul_balance_curr = 0.0 |
|
||||
%> |
|
||||
<div class="act_as_table list_table" style="margin-top: 5px;"> |
|
||||
<div class="act_as_caption account_title"> |
|
||||
${partner_name or _('No Partner')} |
|
||||
</div> |
|
||||
<div class="act_as_thead"> |
|
||||
<div class="act_as_row labels"> |
|
||||
## date |
|
||||
<div class="act_as_cell first_column" style="width: 50px;">${_('Date')}</div> |
|
||||
## period |
|
||||
<div class="act_as_cell" style="width: 70px;">${_('Period')}</div> |
|
||||
## move |
|
||||
<div class="act_as_cell" style="width: 100px;">${_('Entry')}</div> |
|
||||
## journal |
|
||||
<div class="act_as_cell" style="width: 70px;">${_('Journal')}</div> |
|
||||
## partner |
|
||||
<div class="act_as_cell" style="width: 100px;">${_('Partner')}</div> |
|
||||
## move reference |
|
||||
<div class="act_as_cell" style="width: 60px;">${_('Reference')}</div> |
|
||||
## label |
|
||||
<div class="act_as_cell" style="width: 280px;">${_('Label')}</div> |
|
||||
## reconcile |
|
||||
<div class="act_as_cell" style="width: 80px;">${_('Rec.')}</div> |
|
||||
## debit |
|
||||
<div class="act_as_cell amount" style="width: 80px;">${_('Debit')}</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount" style="width: 80px;">${_('Credit')}</div> |
|
||||
## balance cumulated |
|
||||
<div class="act_as_cell amount" style="width: 80px;">${_('Cumul. Bal.')}</div> |
|
||||
%if amount_currency(data): |
|
||||
## currency balance |
|
||||
<div class="act_as_cell amount sep_left" style="width: 80px;">${_('Curr. Balance')}</div> |
|
||||
## curency code |
|
||||
<div class="act_as_cell amount" style="width: 30px; text-align: right;">${_('Curr.')}</div> |
|
||||
%endif |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="act_as_tbody"> |
|
||||
<% |
|
||||
total_debit = init_balance[account.id].get(p_id, {}).get('debit') or 0.0 |
|
||||
total_credit =init_balance[account.id].get(p_id, {}).get('credit') or 0.0 |
|
||||
%> |
|
||||
%if initial_balance_mode and (total_debit or total_credit): |
|
||||
<% |
|
||||
part_cumul_balance = init_balance[account.id].get(p_id, {}).get('init_balance') or 0.0 |
|
||||
part_cumul_balance_curr = init_balance[account.id].get(p_id, {}).get('init_balance_currency') or 0.0 |
|
||||
balance_forward_currency = init_balance[account.id].get(p_id, {}).get('currency_name') or '' |
|
||||
|
|
||||
cumul_balance += part_cumul_balance |
|
||||
cumul_balance_curr += part_cumul_balance_curr |
|
||||
%> |
|
||||
<div class="act_as_row initial_balance"> |
|
||||
## date |
|
||||
<div class="act_as_cell first_column"></div> |
|
||||
## period |
|
||||
<div class="act_as_cell"></div> |
|
||||
## move |
|
||||
<div class="act_as_cell"></div> |
|
||||
## journal |
|
||||
<div class="act_as_cell"></div> |
|
||||
## partner |
|
||||
<div class="act_as_cell"></div> |
|
||||
## move reference |
|
||||
<div class="act_as_cell"></div> |
|
||||
## label |
|
||||
<div class="act_as_cell" >${_('Initial Balance')}</div> |
|
||||
## reconcile |
|
||||
<div class="act_as_cell"></div> |
|
||||
## debit |
|
||||
<div class="act_as_cell amount">${formatLang(total_debit) | amount }</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount">${formatLang(total_credit) | amount }</div> |
|
||||
## balance cumulated |
|
||||
<div class="act_as_cell amount" style="padding-right: 1px;">${formatLang(part_cumul_balance) | amount }</div> |
|
||||
%if amount_currency(data): |
|
||||
## currency balance |
|
||||
<div class="act_as_cell sep_left amount">${formatLang(part_cumul_balance_curr) | amount }</div> |
|
||||
## curency code |
|
||||
<div class="act_as_cell">${balance_forward_currency}</div> |
|
||||
%endif |
|
||||
|
|
||||
</div> |
|
||||
%endif |
|
||||
|
|
||||
%for line in ledger_lines[account.id].get(p_id, []): |
|
||||
<% |
|
||||
total_debit += line.get('debit') or 0.0 |
|
||||
total_credit += line.get('credit') or 0.0 |
|
||||
|
|
||||
label_elements = [line.get('lname') or ''] |
|
||||
if line.get('invoice_number'): |
|
||||
label_elements.append("(%s)" % (line['invoice_number'],)) |
|
||||
label = ' '.join(label_elements) |
|
||||
%> |
|
||||
<div class="act_as_row lines"> |
|
||||
## date |
|
||||
<div class="act_as_cell first_column">${formatLang(line.get('ldate') or '', date=True)}</div> |
|
||||
## period |
|
||||
<div class="act_as_cell">${line.get('period_code') or ''}</div> |
|
||||
## move |
|
||||
<div class="act_as_cell">${line.get('move_name') or ''}</div> |
|
||||
## journal |
|
||||
<div class="act_as_cell">${line.get('jcode') or ''}</div> |
|
||||
## partner |
|
||||
<div class="act_as_cell overflow_ellipsis">${line.get('partner_name') or ''}</div> |
|
||||
## move reference |
|
||||
<div class="act_as_cell">${line.get('lref') or ''}</div> |
|
||||
## label |
|
||||
<div class="act_as_cell">${label}</div> |
|
||||
## reconcile |
|
||||
<div class="act_as_cell">${line.get('rec_name') or ''}</div> |
|
||||
## debit |
|
||||
<div class="act_as_cell amount">${formatLang(line.get('debit') or 0.0) | amount }</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount">${formatLang(line.get('credit') or 0.0) | amount }</div> |
|
||||
## balance cumulated |
|
||||
<% cumul_balance += line.get('balance') or 0.0 %> |
|
||||
<div class="act_as_cell amount" style="padding-right: 1px;">${formatLang(cumul_balance) | amount }</div> |
|
||||
%if amount_currency(data): |
|
||||
## currency balance |
|
||||
<div class="act_as_cell sep_left amount">${formatLang(line.get('amount_currency') or 0.0) | amount }</div> |
|
||||
## curency code |
|
||||
<div class="act_as_cell" style="text-align: right; ">${line.get('currency_code') or ''}</div> |
|
||||
%endif |
|
||||
</div> |
|
||||
%endfor |
|
||||
<div class="act_as_row lines labels"> |
|
||||
## date |
|
||||
<div class="act_as_cell first_column"></div> |
|
||||
## period |
|
||||
<div class="act_as_cell"></div> |
|
||||
## move |
|
||||
<div class="act_as_cell"></div> |
|
||||
## journal |
|
||||
<div class="act_as_cell"></div> |
|
||||
## partner |
|
||||
<div class="act_as_cell"></div> |
|
||||
## move reference |
|
||||
<div class="act_as_cell"></div> |
|
||||
## label |
|
||||
<div class="act_as_cell">${_('Cumulated Balance on Partner')}</div> |
|
||||
## reconcile |
|
||||
<div class="act_as_cell"></div> |
|
||||
## debit |
|
||||
<div class="act_as_cell amount">${formatLang(total_debit) | amount }</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount">${formatLang(total_credit) | amount }</div> |
|
||||
## balance cumulated |
|
||||
<div class="act_as_cell amount" style="padding-right: 1px;">${formatLang(cumul_balance) | amount }</div> |
|
||||
%if amount_currency(data): |
|
||||
## currency balance |
|
||||
%if account.currency_id: |
|
||||
<div class="act_as_cell amount sep_left">${formatLang(cumul_balance_curr) | amount }</div> |
|
||||
%else: |
|
||||
<div class="act_as_cell sep_left amount">${ u'-' }</div> |
|
||||
%endif |
|
||||
## currency code |
|
||||
<div class="act_as_cell" style="text-align: right; padding-right: 1px;">${ account.currency_id.name if account.currency_id else u'' }</div> |
|
||||
%endif |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
<% |
|
||||
account_total_debit += total_debit |
|
||||
account_total_credit += total_credit |
|
||||
account_balance_cumul += cumul_balance |
|
||||
account_balance_cumul_curr += cumul_balance_curr |
|
||||
%> |
|
||||
%endfor |
|
||||
|
|
||||
<div class="act_as_table list_table" style="margin-top:5px;"> |
|
||||
<div class="act_as_row labels" style="font-weight: bold; font-size: 12px;"> |
|
||||
<div class="act_as_cell first_column" style="width: 450px;">${account.code} - ${account.name}</div> |
|
||||
## label |
|
||||
<div class="act_as_cell" style="width: 360px;">${_("Cumulated Balance on Account")}</div> |
|
||||
## debit |
|
||||
<div class="act_as_cell amount" style="width: 80px;">${ formatLang(account_total_debit) | amount }</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount" style="width: 80px;">${ formatLang(account_total_credit) | amount }</div> |
|
||||
## balance cumulated |
|
||||
<div class="act_as_cell amount" style="width: 80px; padding-right: 1px;">${ formatLang(account_balance_cumul) | amount }</div> |
|
||||
%if amount_currency(data): |
|
||||
## currency balance |
|
||||
%if account.currency_id: |
|
||||
<div class="act_as_cell amount sep_left" style="width: 80px;">${ formatLang(account_balance_cumul_curr) | amount }</div> |
|
||||
%else: |
|
||||
<div class="act_as_cell amount sep_left" style="width: 80px;">${ u'-' }</div> |
|
||||
%endif |
|
||||
## curency code |
|
||||
<div class="act_as_cell amount" style="width: 30px; text-align: right; padding-right: 1px;">${ account.currency_id.name if account.currency_id else u'' }</div> |
|
||||
%endif |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
%endif |
|
||||
%endfor |
|
||||
</body> |
|
||||
</html> |
|
@ -1,170 +0,0 @@ |
|||||
## -*- coding: utf-8 -*- |
|
||||
<!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
|
||||
<html xmlns="http://www.w3.org/1999/xhtml"> |
|
||||
<head> |
|
||||
<style type="text/css"> |
|
||||
.overflow_ellipsis { |
|
||||
text-overflow: ellipsis; |
|
||||
overflow: hidden; |
|
||||
white-space: nowrap; |
|
||||
} |
|
||||
${css} |
|
||||
</style> |
|
||||
</head> |
|
||||
<body> |
|
||||
<%! |
|
||||
def amount(text): |
|
||||
return text.replace('-', '‑') # replace by a non-breaking hyphen (it will not word-wrap between hyphen and numbers) |
|
||||
%> |
|
||||
|
|
||||
<%setLang(user.lang)%> |
|
||||
|
|
||||
<div class="act_as_table data_table"> |
|
||||
<div class="act_as_row labels"> |
|
||||
<div class="act_as_cell">${_('Chart of Account')}</div> |
|
||||
<div class="act_as_cell">${_('Fiscal Year')}</div> |
|
||||
<div class="act_as_cell"> |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${_('Dates Filter')} |
|
||||
%else: |
|
||||
${_('Periods Filter')} |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell">${_('Journal Filter')}</div> |
|
||||
<div class="act_as_cell">${_('Target Moves')}</div> |
|
||||
</div> |
|
||||
<div class="act_as_row"> |
|
||||
<div class="act_as_cell">${ chart_account.name }</div> |
|
||||
<div class="act_as_cell">${ fiscalyear.name if fiscalyear else '-' }</div> |
|
||||
<div class="act_as_cell"> |
|
||||
${_('From:')} |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${formatLang(start_date, date=True) if start_date else u'' } |
|
||||
%else: |
|
||||
${start_period.name if start_period else u''} |
|
||||
%endif |
|
||||
${_('To:')} |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${ formatLang(stop_date, date=True) if stop_date else u'' } |
|
||||
%else: |
|
||||
${stop_period.name if stop_period else u'' } |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell"> |
|
||||
%if journals(data): |
|
||||
${', '.join([journal.name for journal in journals(data)])} |
|
||||
%else: |
|
||||
${_('All')} |
|
||||
%endif |
|
||||
|
|
||||
</div> |
|
||||
<div class="act_as_cell">${ display_target_move(data) }</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
%for journal_period in objects: |
|
||||
<% |
|
||||
account_total_debit = 0.0 |
|
||||
account_total_credit = 0.0 |
|
||||
account_total_currency = 0.0 |
|
||||
%> |
|
||||
|
|
||||
<div class="account_title bg" style="width: 1080px; margin-top: 20px; font-size: 12px;">${journal_period.journal_id.name} - ${journal_period.period_id.name}</div> |
|
||||
|
|
||||
<!-- we use div with css instead of table for tabular data because div do not cut rows at half at page breaks --> |
|
||||
<div class="act_as_table list_table" style="margin-top: 5px;"> |
|
||||
<div class="act_as_thead"> |
|
||||
<div class="act_as_row labels"> |
|
||||
## date |
|
||||
<div class="act_as_cell first_column">${_('Date')}</div> |
|
||||
## move |
|
||||
<div class="act_as_cell">${_('Entry')}</div> |
|
||||
## account code |
|
||||
<div class="act_as_cell">${_('Account')}</div> |
|
||||
## date |
|
||||
<div class="act_as_cell">${_('Due Date')}</div> |
|
||||
## partner |
|
||||
<div class="act_as_cell" style="width: 280px;">${_('Partner')}</div> |
|
||||
## label |
|
||||
<div class="act_as_cell" style="width: 310px;">${_('Label')}</div> |
|
||||
## debit |
|
||||
<div class="act_as_cell amount">${_('Debit')}</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount">${_('Credit')}</div> |
|
||||
%if amount_currency(data): |
|
||||
## currency balance |
|
||||
<div class="act_as_cell amount sep_left">${_('Curr. Balance')}</div> |
|
||||
## curency code |
|
||||
<div class="act_as_cell amount" style="text-align: right;">${_('Curr.')}</div> |
|
||||
%endif |
|
||||
</div> |
|
||||
</div> |
|
||||
%for move in moves[journal_period.id]: |
|
||||
<% |
|
||||
new_move = True |
|
||||
%> |
|
||||
|
|
||||
%for line in move.line_id: |
|
||||
<div class="act_as_tbody"> |
|
||||
<% |
|
||||
account_total_debit += line.debit or 0.0 |
|
||||
account_total_credit += line.credit or 0.0 |
|
||||
%> |
|
||||
<div class="act_as_row lines"> |
|
||||
## date |
|
||||
<div class="act_as_cell first_column">${formatLang(move.date, date=True) if new_move else ''}</div> |
|
||||
## move |
|
||||
<div class="act_as_cell">${move.name if new_move else ''}</div> |
|
||||
## account code |
|
||||
<div class="act_as_cell">${line.account_id.code}</div> |
|
||||
## date |
|
||||
<div class="act_as_cell">${formatLang(line.date_maturity or '', date=True)}</div> |
|
||||
## partner |
|
||||
<div class="act_as_cell overflow_ellipsis" style="width: 280px;">${line.partner_id.name if new_move else ''}</div> |
|
||||
## label |
|
||||
<div class="act_as_cell overflow_ellipsis" style="width: 310px;">${line.name}</div> |
|
||||
## debit |
|
||||
<div class="act_as_cell amount">${formatLang(line.debit) if line.debit else ''}</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount">${formatLang(line.credit) if line.credit else ''}</div> |
|
||||
%if amount_currency(data): |
|
||||
## currency balance |
|
||||
<div class="act_as_cell amount sep_left">${formatLang(line.amount_currency) if line.amount_currency else ''}</div> |
|
||||
## curency code |
|
||||
<div class="act_as_cell amount" style="text-align: right;">${line.currency_id.symbol or ''}</div> |
|
||||
%endif |
|
||||
</div> |
|
||||
<% |
|
||||
new_move = False |
|
||||
%> |
|
||||
</div> |
|
||||
%endfor |
|
||||
%endfor |
|
||||
<div class="act_as_row lines labels"> |
|
||||
## date |
|
||||
<div class="act_as_cell first_column"></div> |
|
||||
## move |
|
||||
<div class="act_as_cell"></div> |
|
||||
## account code |
|
||||
<div class="act_as_cell"></div> |
|
||||
## date |
|
||||
<div class="act_as_cell"></div> |
|
||||
## partner |
|
||||
<div class="act_as_cell" style="width: 280px;"></div> |
|
||||
## label |
|
||||
<div class="act_as_cell" style="width: 310px;"></div> |
|
||||
## debit |
|
||||
<div class="act_as_cell amount">${formatLang(account_total_debit) | amount }</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount">${formatLang(account_total_credit) | amount }</div> |
|
||||
%if amount_currency(data): |
|
||||
## currency balance |
|
||||
<div class="act_as_cell amount sep_left"></div> |
|
||||
## currency code |
|
||||
<div class="act_as_cell" style="text-align: right; right;"></div> |
|
||||
%endif |
|
||||
</div> |
|
||||
</div> |
|
||||
%endfor |
|
||||
</body> |
|
||||
</html> |
|
@ -1,211 +0,0 @@ |
|||||
## -*- coding: utf-8 -*- |
|
||||
<!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
|
||||
<html xmlns="http://www.w3.org/1999/xhtml"> |
|
||||
<head> |
|
||||
<style type="text/css"> |
|
||||
${css} |
|
||||
|
|
||||
.list_table .act_as_row { |
|
||||
margin-top: 10px; |
|
||||
margin-bottom: 10px; |
|
||||
font-size:10px; |
|
||||
} |
|
||||
</style> |
|
||||
</head> |
|
||||
<body> |
|
||||
<%! |
|
||||
|
|
||||
def amount(text): |
|
||||
return text.replace('-', '‑') # replace by a non-breaking hyphen (it will not word-wrap between hyphen and numbers) |
|
||||
%> |
|
||||
|
|
||||
<%def name="format_amount(amount, display_option=None)"> |
|
||||
<% |
|
||||
output = amount |
|
||||
if display_option == 'normal': |
|
||||
output = amount |
|
||||
elif display_option == 'round': |
|
||||
output = u"%.0f" % round(amount) |
|
||||
elif display_option == 'kilo': |
|
||||
if amount: |
|
||||
output = u"%.2fK" % (amount / 1000,) |
|
||||
%> |
|
||||
${output} |
|
||||
</%def> |
|
||||
|
|
||||
<%setLang(user.lang)%> |
|
||||
|
|
||||
<div class="act_as_table data_table"> |
|
||||
<div class="act_as_row labels"> |
|
||||
<div class="act_as_cell">${_('Chart of Account')}</div> |
|
||||
<div class="act_as_cell">${_('Fiscal Year')}</div> |
|
||||
<div class="act_as_cell"> |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${_('Dates')} |
|
||||
%else: |
|
||||
${_('Periods')} |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell">${_('Displayed Accounts')}</div> |
|
||||
<div class="act_as_cell">${_('Target Moves')}</div> |
|
||||
<div class="act_as_cell">${_('Initial Balance')}</div> |
|
||||
</div> |
|
||||
<div class="act_as_row"> |
|
||||
<div class="act_as_cell">${ chart_account.name }</div> |
|
||||
<div class="act_as_cell">${ fiscalyear.name if fiscalyear else '-' }</div> |
|
||||
<div class="act_as_cell"> |
|
||||
${_('From:')} |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${formatLang(start_date, date=True) if start_date else u'' } |
|
||||
%else: |
|
||||
${start_period.name if start_period else u''} |
|
||||
%endif |
|
||||
${_('To:')} |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${ formatLang(stop_date, date=True) if stop_date else u'' } |
|
||||
%else: |
|
||||
${stop_period.name if stop_period else u'' } |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell"> |
|
||||
%if accounts(data): |
|
||||
${', '.join([account.code for account in accounts(data)])} |
|
||||
%else: |
|
||||
${_('All')} |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell">${ display_target_move(data) }</div> |
|
||||
<div class="act_as_cell">${ _('Yes') if initial_balance else _('No') }</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
%for index, params in enumerate(comp_params): |
|
||||
<div class="act_as_table data_table"> |
|
||||
<div class="act_as_row"> |
|
||||
<div class="act_as_cell">${_('Comparison %s') % (index + 1,)} (${"C%s" % (index + 1,)})</div> |
|
||||
<div class="act_as_cell"> |
|
||||
%if params['comparison_filter'] == 'filter_date': |
|
||||
${_('Dates : ')} ${formatLang(params['start'], date=True) } - ${formatLang(params['stop'], date=True) } |
|
||||
%elif params['comparison_filter'] == 'filter_period': |
|
||||
${_('Periods : ')} ${params['start'].name} - ${params['stop'].name} |
|
||||
%else: |
|
||||
${_('Fiscal Year : ')} ${params['fiscalyear'].name} |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell">${_('Initial Balance:')} ${ _('Yes') if params['initial_balance'] else _('No') }</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
%endfor |
|
||||
|
|
||||
<div class="act_as_table list_table" style="margin-top: 20px;"> |
|
||||
|
|
||||
<div class="act_as_thead"> |
|
||||
<div class="act_as_row labels"> |
|
||||
## account name |
|
||||
<div class="act_as_cell" style="width: 80px;">${_('Account')}</div> |
|
||||
%if comparison_mode == 'no_comparison': |
|
||||
%if initial_balance: |
|
||||
## initial balance |
|
||||
<div class="act_as_cell amount" style="width: 30px;">${_('Initial Balance')}</div> |
|
||||
%endif |
|
||||
## debit |
|
||||
<div class="act_as_cell amount" style="width: 30px;">${_('Debit')}</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount" style="width: 30px;">${_('Credit')}</div> |
|
||||
%endif |
|
||||
## balance |
|
||||
<div class="act_as_cell amount" style="width: 30px;"> |
|
||||
%if comparison_mode == 'no_comparison' or not fiscalyear: |
|
||||
${_('Balance')} |
|
||||
%else: |
|
||||
${_('Balance %s') % (fiscalyear.name,)} |
|
||||
%endif |
|
||||
</div> |
|
||||
%if comparison_mode in ('single', 'multiple'): |
|
||||
%for index in range(nb_comparison): |
|
||||
<div class="act_as_cell amount" style="width: 30px;"> |
|
||||
%if comp_params[index]['comparison_filter'] == 'filter_year' and comp_params[index].get('fiscalyear', False): |
|
||||
${_('Balance %s') % (comp_params[index]['fiscalyear'].name,)} |
|
||||
%else: |
|
||||
${_('Balance C%s') % (index + 1,)} |
|
||||
%endif |
|
||||
</div> |
|
||||
%if comparison_mode == 'single': ## no diff in multiple comparisons because it shows too data |
|
||||
<div class="act_as_cell amount" style="width: 30px;">${_('Difference')}</div> |
|
||||
<div class="act_as_cell amount" style="width: 30px;">${_('% Difference')}</div> |
|
||||
%endif |
|
||||
%endfor |
|
||||
%endif |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
<div class="act_as_tbody"> |
|
||||
%for account_at in objects: |
|
||||
<% |
|
||||
current_account = account_at['current'] |
|
||||
level = current_account['level'] |
|
||||
%> |
|
||||
%if level_print(data, level): ## how to manage levels? |
|
||||
<% |
|
||||
styles = [] |
|
||||
if level_bold(data, level): |
|
||||
styles.append('font-weight: bold;') |
|
||||
else: |
|
||||
styles.append('font-weight: normal;') |
|
||||
|
|
||||
if level_italic(data, level): |
|
||||
styles.append('font-style: italic;') |
|
||||
else: |
|
||||
styles.append('font-style: normal;') |
|
||||
|
|
||||
if level_underline(data, level): |
|
||||
styles.append('text-decoration: underline;') |
|
||||
else: |
|
||||
styles.append('text-decoration: none;') |
|
||||
|
|
||||
if level_uppercase(data, level): |
|
||||
styles.append('text-transform: uppercase;') |
|
||||
else: |
|
||||
styles.append('font-decoration: none;') |
|
||||
|
|
||||
styles.append("font-size: %spx;" % (level_size(data, level),)) |
|
||||
|
|
||||
%> |
|
||||
<div class="act_as_row lines ${"account_level_%s" % (current_account['level'])}" styles="${' '.join(styles)}"> |
|
||||
## account name |
|
||||
<div class="act_as_cell" style="padding-left: ${current_account.get('level', 0) * 5}px; ${' '.join(styles)}">${current_account['name']}</div> |
|
||||
%if comparison_mode == 'no_comparison': |
|
||||
%if initial_balance: |
|
||||
## opening balance |
|
||||
<div class="act_as_cell amount" style="${' '.join(styles)}">${format_amount(current_account['init_balance'], numbers_display(data)) | amount}</div> |
|
||||
%endif |
|
||||
## debit |
|
||||
<div class="act_as_cell amount" style="${' '.join(styles)}">${format_amount(current_account['debit'], numbers_display(data)) | amount}</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount" style="${' '.join(styles)}">${format_amount(current_account['credit'] * -1, numbers_display(data)) if current_account['credit'] else 0.0 | amount}</div> |
|
||||
%endif |
|
||||
## balance |
|
||||
<div class="act_as_cell amount" style="${' '.join(styles)}">${format_amount(current_account['balance'], numbers_display(data)) | amount}</div> |
|
||||
|
|
||||
%if comparison_mode in ('single', 'multiple'): |
|
||||
%for comp_account in account_at['comparisons']: |
|
||||
<div class="act_as_cell amount" style="${' '.join(styles)}">${format_amount(comp_account['balance'], numbers_display(data)) | amount}</div> |
|
||||
%if comparison_mode == 'single': ## no diff in multiple comparisons because it shows too data |
|
||||
<div class="act_as_cell amount" style="${' '.join(styles)}">${format_amount(comp_account['diff'], numbers_display(data)) | amount}</div> |
|
||||
<div class="act_as_cell amount" style="${' '.join(styles)}"> |
|
||||
%if comp_account['percent_diff'] is False: |
|
||||
${ '-' } |
|
||||
%else: |
|
||||
${comp_account['percent_diff'] | amount} % |
|
||||
%endif |
|
||||
</div> |
|
||||
%endif |
|
||||
%endfor |
|
||||
%endif |
|
||||
</div> |
|
||||
%endif |
|
||||
%endfor |
|
||||
</div> |
|
||||
</div> |
|
||||
</body> |
|
||||
</html> |
|
@ -1,218 +0,0 @@ |
|||||
## -*- coding: utf-8 -*- |
|
||||
<!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
|
||||
<html xmlns="http://www.w3.org/1999/xhtml"> |
|
||||
<head> |
|
||||
<style type="text/css"> |
|
||||
.account_level_1 { |
|
||||
text-transform: uppercase; |
|
||||
font-size: 15px; |
|
||||
background-color:#F0F0F0; |
|
||||
} |
|
||||
|
|
||||
.account_level_2 { |
|
||||
font-size: 12px; |
|
||||
background-color:#F0F0F0; |
|
||||
} |
|
||||
|
|
||||
.regular_account_type { |
|
||||
font-weight: normal; |
|
||||
} |
|
||||
|
|
||||
.view_account_type { |
|
||||
font-weight: bold; |
|
||||
} |
|
||||
|
|
||||
.account_level_consol { |
|
||||
font-weight: normal; |
|
||||
font-style: italic; |
|
||||
} |
|
||||
|
|
||||
${css} |
|
||||
|
|
||||
.list_table .act_as_row { |
|
||||
margin-top: 10px; |
|
||||
margin-bottom: 10px; |
|
||||
font-size:10px; |
|
||||
} |
|
||||
</style> |
|
||||
</head> |
|
||||
<body> |
|
||||
<%! |
|
||||
def amount(text): |
|
||||
return text.replace('-', '‑') # replace by a non-breaking hyphen (it will not word-wrap between hyphen and numbers) |
|
||||
%> |
|
||||
|
|
||||
<%setLang(user.lang)%> |
|
||||
|
|
||||
<% |
|
||||
initial_balance_text = {'initial_balance': _('Computed'), 'opening_balance': _('Opening Entries'), False: _('No')} |
|
||||
%> |
|
||||
|
|
||||
<div class="act_as_table data_table"> |
|
||||
<div class="act_as_row labels"> |
|
||||
<div class="act_as_cell">${_('Chart of Account')}</div> |
|
||||
<div class="act_as_cell">${_('Fiscal Year')}</div> |
|
||||
<div class="act_as_cell"> |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${_('Dates Filter')} |
|
||||
%else: |
|
||||
${_('Periods Filter')} |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell">${_('Accounts Filter')}</div> |
|
||||
<div class="act_as_cell">${_('Target Moves')}</div> |
|
||||
<div class="act_as_cell">${_('Initial Balance')}</div> |
|
||||
</div> |
|
||||
<div class="act_as_row"> |
|
||||
<div class="act_as_cell">${ chart_account.name }</div> |
|
||||
<div class="act_as_cell">${ fiscalyear.name if fiscalyear else '-' }</div> |
|
||||
<div class="act_as_cell"> |
|
||||
${_('From:')} |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${formatLang(start_date, date=True) if start_date else u'' } |
|
||||
%else: |
|
||||
${start_period.name if start_period else u''} |
|
||||
%endif |
|
||||
${_('To:')} |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${ formatLang(stop_date, date=True) if stop_date else u'' } |
|
||||
%else: |
|
||||
${stop_period.name if stop_period else u'' } |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell"> |
|
||||
%if accounts(data): |
|
||||
${', '.join([account.code for account in accounts(data)])} |
|
||||
%else: |
|
||||
${_('All')} |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell">${ display_target_move(data) }</div> |
|
||||
<div class="act_as_cell">${ initial_balance_text[initial_balance_mode] }</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
%for index, params in enumerate(comp_params): |
|
||||
<div class="act_as_table data_table"> |
|
||||
<div class="act_as_row"> |
|
||||
<div class="act_as_cell">${_('Comparison %s') % (index + 1,)} (${"C%s" % (index + 1,)})</div> |
|
||||
<div class="act_as_cell"> |
|
||||
%if params['comparison_filter'] == 'filter_date': |
|
||||
${_('Dates Filter:')} ${formatLang(params['start'], date=True) } - ${formatLang(params['stop'], date=True) } |
|
||||
%elif params['comparison_filter'] == 'filter_period': |
|
||||
${_('Periods Filter:')} ${params['start'].name} - ${params['stop'].name} |
|
||||
%else: |
|
||||
${_('Fiscal Year :')} ${params['fiscalyear'].name} |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell">${_('Initial Balance:')} ${ initial_balance_text[params['initial_balance_mode']] }</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
%endfor |
|
||||
|
|
||||
<div class="act_as_table list_table" style="margin-top: 20px;"> |
|
||||
|
|
||||
<div class="act_as_thead"> |
|
||||
<div class="act_as_row labels"> |
|
||||
## code |
|
||||
<div class="act_as_cell first_column" style="width: 20px;">${_('Code')}</div> |
|
||||
## account name |
|
||||
<div class="act_as_cell" style="width: 80px;">${_('Account')}</div> |
|
||||
%if comparison_mode == 'no_comparison': |
|
||||
%if initial_balance_mode: |
|
||||
## initial balance |
|
||||
<div class="act_as_cell amount" style="width: 30px;">${_('Initial Balance')}</div> |
|
||||
%endif |
|
||||
## debit |
|
||||
<div class="act_as_cell amount" style="width: 30px;">${_('Debit')}</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount" style="width: 30px;">${_('Credit')}</div> |
|
||||
%endif |
|
||||
## balance |
|
||||
<div class="act_as_cell amount" style="width: 30px;"> |
|
||||
%if comparison_mode == 'no_comparison' or not fiscalyear: |
|
||||
${_('Balance')} |
|
||||
%else: |
|
||||
${_('Balance %s') % (fiscalyear.name,)} |
|
||||
%endif |
|
||||
</div> |
|
||||
%if comparison_mode in ('single', 'multiple'): |
|
||||
%for index in range(nb_comparison): |
|
||||
<div class="act_as_cell amount" style="width: 30px;"> |
|
||||
%if comp_params[index]['comparison_filter'] == 'filter_year' and comp_params[index].get('fiscalyear', False): |
|
||||
${_('Balance %s') % (comp_params[index]['fiscalyear'].name,)} |
|
||||
%else: |
|
||||
${_('Balance C%s') % (index + 1,)} |
|
||||
%endif |
|
||||
</div> |
|
||||
%if comparison_mode == 'single': ## no diff in multiple comparisons because it shows too data |
|
||||
<div class="act_as_cell amount" style="width: 30px;">${_('Difference')}</div> |
|
||||
<div class="act_as_cell amount" style="width: 30px;">${_('% Difference')}</div> |
|
||||
%endif |
|
||||
%endfor |
|
||||
%endif |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
<div class="act_as_tbody"> |
|
||||
<% |
|
||||
last_child_consol_ids = [] |
|
||||
last_level = False |
|
||||
%> |
|
||||
%for current_account in objects: |
|
||||
<% |
|
||||
if not to_display_accounts[current_account.id]: |
|
||||
continue |
|
||||
|
|
||||
comparisons = comparisons_accounts[current_account.id] |
|
||||
|
|
||||
if current_account.id in last_child_consol_ids: |
|
||||
# current account is a consolidation child of the last account: use the level of last account |
|
||||
level = last_level |
|
||||
level_class = "account_level_consol" |
|
||||
else: |
|
||||
# current account is a not a consolidation child: use its own level |
|
||||
level = current_account.level or 0 |
|
||||
level_class = "account_level_%s" % (level,) |
|
||||
last_child_consol_ids = [child_consol_id.id for child_consol_id in current_account.child_consol_ids] |
|
||||
last_level = current_account.level |
|
||||
%> |
|
||||
<div class="act_as_row lines ${level_class} ${"%s_account_type" % (current_account.type,)}"> |
|
||||
## code |
|
||||
<div class="act_as_cell first_column">${current_account.code}</div> |
|
||||
## account name |
|
||||
<div class="act_as_cell" style="padding-left: ${level * 5}px;">${current_account.name}</div> |
|
||||
%if comparison_mode == 'no_comparison': |
|
||||
%if initial_balance_mode: |
|
||||
## opening balance |
|
||||
<div class="act_as_cell amount">${formatLang(init_balance_accounts[current_account.id]) | amount}</div> |
|
||||
%endif |
|
||||
## debit |
|
||||
<div class="act_as_cell amount">${formatLang(debit_accounts[current_account.id]) | amount}</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount">${formatLang(credit_accounts[current_account.id]) | amount}</div> |
|
||||
%endif |
|
||||
## balance |
|
||||
<div class="act_as_cell amount">${formatLang(balance_accounts[current_account.id]) | amount}</div> |
|
||||
|
|
||||
%if comparison_mode in ('single', 'multiple'): |
|
||||
%for comp_account in comparisons: |
|
||||
<div class="act_as_cell amount">${formatLang(comp_account['balance']) | amount}</div> |
|
||||
%if comparison_mode == 'single': ## no diff in multiple comparisons because it shows too data |
|
||||
<div class="act_as_cell amount">${formatLang(comp_account['diff']) | amount}</div> |
|
||||
<div class="act_as_cell amount"> |
|
||||
%if comp_account['percent_diff'] is False: |
|
||||
${ '-' } |
|
||||
%else: |
|
||||
${int(round(comp_account['percent_diff'])) | amount} % |
|
||||
%endif |
|
||||
</div> |
|
||||
%endif |
|
||||
%endfor |
|
||||
%endif |
|
||||
</div> |
|
||||
%endfor |
|
||||
</div> |
|
||||
</div> |
|
||||
</body> |
|
||||
</html> |
|
@ -1,155 +0,0 @@ |
|||||
## -*- coding: utf-8 -*- |
|
||||
<!DOCTYPE html SYSTEM |
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
|
||||
<html xmlns="http://www.w3.org/1999/xhtml"> |
|
||||
<head> |
|
||||
<style type="text/css"> |
|
||||
.overflow_ellipsis { |
|
||||
text-overflow: ellipsis; |
|
||||
overflow: hidden; |
|
||||
white-space: nowrap; |
|
||||
} |
|
||||
|
|
||||
.open_invoice_previous_line { |
|
||||
font-style: italic; |
|
||||
} |
|
||||
|
|
||||
.percent_line { |
|
||||
font-style: italic; |
|
||||
} |
|
||||
|
|
||||
.amount { |
|
||||
text-align:right; |
|
||||
} |
|
||||
|
|
||||
.classif_title { |
|
||||
text-align:right; |
|
||||
} |
|
||||
|
|
||||
.classif{ |
|
||||
width: ${700/len(ranges)}px; |
|
||||
} |
|
||||
.total{ |
|
||||
font-weight:bold; |
|
||||
} |
|
||||
${css} |
|
||||
</style> |
|
||||
</head> |
|
||||
|
|
||||
<%! |
|
||||
def amount(text): |
|
||||
# replace by a non-breaking hyphen (it will not word-wrap between hyphen and numbers) |
|
||||
return text.replace('-', '‑') |
|
||||
%> |
|
||||
<body> |
|
||||
<%setLang(user.lang)%> |
|
||||
|
|
||||
<div class="act_as_table data_table"> |
|
||||
<div class="act_as_row labels"> |
|
||||
<div class="act_as_cell">${_('Chart of Account')}</div> |
|
||||
<div class="act_as_cell">${_('Fiscal Year')}</div> |
|
||||
<div class="act_as_cell"> |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${_('Dates Filter')} |
|
||||
%else: |
|
||||
${_('Periods Filter')} |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell">${_('Clearance Date')}</div> |
|
||||
<div class="act_as_cell">${_('Accounts Filter')}</div> |
|
||||
<div class="act_as_cell">${_('Target Moves')}</div> |
|
||||
|
|
||||
</div> |
|
||||
<div class="act_as_row"> |
|
||||
<div class="act_as_cell">${ chart_account.name }</div> |
|
||||
<div class="act_as_cell">${ fiscalyear.name if fiscalyear else '-' }</div> |
|
||||
<div class="act_as_cell"> |
|
||||
${_('From:')} |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${formatLang(start_date, date=True) if start_date else u'' } |
|
||||
%else: |
|
||||
${start_period.name if start_period else u''} |
|
||||
%endif |
|
||||
${_('To:')} |
|
||||
%if filter_form(data) == 'filter_date': |
|
||||
${ formatLang(stop_date, date=True) if stop_date else u'' } |
|
||||
%else: |
|
||||
${stop_period.name if stop_period else u'' } |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell">${ formatLang(date_until, date=True) }</div> |
|
||||
<div class="act_as_cell"> |
|
||||
%if partner_ids: |
|
||||
${_('Custom Filter')} |
|
||||
%else: |
|
||||
${ display_partner_account(data) } |
|
||||
%endif |
|
||||
</div> |
|
||||
<div class="act_as_cell">${ display_target_move(data) }</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
%for acc in objects: |
|
||||
%if agged_lines_accounts[acc.id]: |
|
||||
<div class="account_title bg" style="width: 1080px; margin-top: 20px; font-size: 12px;">${acc.code} - ${acc.name}</div> |
|
||||
|
|
||||
|
|
||||
|
|
||||
<div class="act_as_table list_table" style="margin-top: 5px;"> |
|
||||
<div class="act_as_thead"> |
|
||||
<div class="act_as_row labels"> |
|
||||
## partner |
|
||||
<div class="act_as_cell first_column" style="width: 60px;">${_('Partner')}</div> |
|
||||
## code |
|
||||
<div class="act_as_cell" style="width: 70px;">${_('code')}</div> |
|
||||
## balance |
|
||||
<div class="act_as_cell classif_title" style="width: 70px;">${_('balance')}</div> |
|
||||
## Classifications |
|
||||
%for title in ranges_titles: |
|
||||
<div class="act_as_cell classif classif_title">${title}</div> |
|
||||
%endfor |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="act_as_tbody"> |
|
||||
%for partner_name, p_id, p_ref, p_name in partners_order[acc.id]: |
|
||||
%if agged_lines_accounts[acc.id].get(p_id): |
|
||||
<div class="act_as_row lines"> |
|
||||
<%line = agged_lines_accounts[acc.id][p_id]%> |
|
||||
<%percents = agged_percents_accounts[acc.id]%> |
|
||||
<%totals = agged_totals_accounts[acc.id]%> |
|
||||
<div class="act_as_cell first_column">${partner_name}</div> |
|
||||
<div class="act_as_cell">${p_ref or ''}</div> |
|
||||
|
|
||||
<div class="act_as_cell amount">${formatLang(line.get('balance') or 0.0) | amount}</div> |
|
||||
%for classif in ranges: |
|
||||
<div class="act_as_cell classif amount"> |
|
||||
${formatLang(line['aged_lines'][classif] or 0.0) | amount} |
|
||||
</div> |
|
||||
%endfor |
|
||||
</div> |
|
||||
%endif |
|
||||
%endfor |
|
||||
<div class="act_as_row labels"> |
|
||||
<div class="act_as_cell total">${_('Total')}</div> |
|
||||
<div class="act_as_cell"></div> |
|
||||
<div class="act_as_cell amount classif total">${formatLang(totals['balance']) | amount}</div> |
|
||||
%for classif in ranges: |
|
||||
<div class="act_as_cell amount classif total">${formatLang(totals[classif]) | amount}</div> |
|
||||
%endfor |
|
||||
</div> |
|
||||
|
|
||||
<div class="act_as_row"> |
|
||||
<div class="act_as_cell"><b>${_('Percents')}</b></div> |
|
||||
<div class="act_as_cell"></div> |
|
||||
<div class="act_as_cell"></div> |
|
||||
%for classif in ranges: |
|
||||
<div class="act_as_cell amount percent_line classif">${formatLang(percents[classif]) | amount}%</div> |
|
||||
%endfor |
|
||||
</div> |
|
||||
</div> |
|
||||
<br/> |
|
||||
|
|
||||
%endif |
|
||||
%endfor |
|
||||
</div> |
|
||||
</body> |
|
||||
</html> |
|
@ -1,173 +0,0 @@ |
|||||
## -*- coding: utf-8 -*- |
|
||||
<%page args="account, formatLang" /> |
|
||||
%if account.grouped_ledger_lines and partners_order[account.id]: |
|
||||
<% |
|
||||
account_total_debit = 0.0 |
|
||||
account_total_credit = 0.0 |
|
||||
account_balance_cumul = 0.0 |
|
||||
account_balance_cumul_curr = 0.0 |
|
||||
%> |
|
||||
%for partner_name, p_id, p_ref, p_name in partners_order[account.id]: |
|
||||
<div class="account_title bg" style="width: 1080px; margin-top: |
|
||||
20px; font-size: 12px;">${account.code} - ${account.name} -- ${partner_name or _('No Partner')} </div> |
|
||||
|
|
||||
|
|
||||
|
|
||||
%for curr, grouped_lines in account.grouped_ledger_lines.get(p_id, []): |
|
||||
<% |
|
||||
total_debit = 0.0 |
|
||||
total_credit = 0.0 |
|
||||
cumul_balance = 0.0 |
|
||||
cumul_balance_curr = 0.0 |
|
||||
|
|
||||
part_cumul_balance = 0.0 |
|
||||
part_cumul_balance_curr = 0.0 |
|
||||
%> |
|
||||
<div class="act_as_table list_table" style="margin-top: 5px;"> |
|
||||
<div class="act_as_caption account_title"> |
|
||||
<b>${curr or company.currency_id.name}</b> |
|
||||
</div> |
|
||||
<div class="act_as_thead"> |
|
||||
<div class="act_as_row labels"> |
|
||||
## date |
|
||||
<div class="act_as_cell first_column" style="width: 60px;">${_('Date')}</div> |
|
||||
## period |
|
||||
<div class="act_as_cell" style="width: 70px;">${_('Period')}</div> |
|
||||
## move |
|
||||
<div class="act_as_cell" style="width: 100px;">${_('Entry')}</div> |
|
||||
## journal |
|
||||
<div class="act_as_cell" style="width: 70px;">${_('Journal')}</div> |
|
||||
## move reference |
|
||||
<div class="act_as_cell" style="width: 100px;">${_('Reference')}</div> |
|
||||
## label |
|
||||
<div class="act_as_cell" style="width: 180px;">${_('Label')}</div> |
|
||||
## reconcile |
|
||||
<div class="act_as_cell" style="width: 80px;">${_('Rec.')}</div> |
|
||||
## maturity |
|
||||
<div class="act_as_cell" style="width: 60px;">${_('Due Date')}</div> |
|
||||
## debit |
|
||||
<div class="act_as_cell amount" style="width: 80px;">${_('Debit')}</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount" style="width: 80px;">${_('Credit')}</div> |
|
||||
## balance cumulated |
|
||||
<div class="act_as_cell amount" style="width: 80px;">${_('Cumul. Bal.')}</div> |
|
||||
## currency balance |
|
||||
<div class="act_as_cell amount sep_left" style="width: 80px;">${_('Curr. Balance')}</div> |
|
||||
## curency code |
|
||||
<div class="act_as_cell amount" style="width: 30px; text-align: right;">${_('Curr.')}</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="act_as_tbody"> |
|
||||
<% |
|
||||
total_debit = 0.0 |
|
||||
total_credit = 0.0 |
|
||||
%> |
|
||||
<%! |
|
||||
def amount(text): |
|
||||
return text.replace('-', '‑') # replace by a non-breaking hyphen (it will not word-wrap between hyphen and numbers) |
|
||||
%> |
|
||||
%for line in grouped_lines: |
|
||||
<% |
|
||||
total_debit += line.get('debit') or 0.0 |
|
||||
total_credit += line.get('credit') or 0.0 |
|
||||
|
|
||||
label_elements = [line.get('lname') or ''] |
|
||||
if line.get('invoice_number'): |
|
||||
label_elements.append("(%s)" % (line['invoice_number'],)) |
|
||||
label = ' '.join(label_elements) |
|
||||
%> |
|
||||
<div class="act_as_row lines ${line.get('is_from_previous_periods') and 'open_invoice_previous_line' or ''} ${line.get('is_clearance_line') and 'clearance_line' or ''}"> |
|
||||
## date |
|
||||
<div class="act_as_cell first_column">${formatLang(line.get('ldate') or '', date=True)}</div> |
|
||||
## period |
|
||||
<div class="act_as_cell">${line.get('period_code') or ''}</div> |
|
||||
## move |
|
||||
<div class="act_as_cell">${line.get('move_name') or ''}</div> |
|
||||
## journal |
|
||||
<div class="act_as_cell">${line.get('jcode') or ''}</div> |
|
||||
## move reference |
|
||||
<div class="act_as_cell">${line.get('lref') or ''}</div> |
|
||||
## label |
|
||||
<div class="act_as_cell">${label}</div> |
|
||||
## reconcile |
|
||||
<div class="act_as_cell">${line.get('rec_name') or ''}</div> |
|
||||
## maturity date |
|
||||
<div class="act_as_cell">${formatLang(line.get('date_maturity') or '', date=True)}</div> |
|
||||
## debit |
|
||||
<div class="act_as_cell amount">${formatLang(line.get('debit') or 0.0) | amount }</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount">${formatLang(line.get('credit') or 0.0) | amount }</div> |
|
||||
## balance cumulated |
|
||||
<% cumul_balance += line.get('balance') or 0.0 %> |
|
||||
<div class="act_as_cell amount" style="padding-right: 1px;">${formatLang(cumul_balance) | amount }</div> |
|
||||
## currency balance |
|
||||
<div class="act_as_cell sep_left amount">${formatLang(line.get('amount_currency') or 0.0) | amount }</div> |
|
||||
## curency code |
|
||||
<div class="act_as_cell" style="text-align: right; ">${line.get('currency_code') or ''}</div> |
|
||||
</div> |
|
||||
%endfor |
|
||||
<div class="act_as_row lines labels"> |
|
||||
## date |
|
||||
<div class="act_as_cell first_column"></div> |
|
||||
## period |
|
||||
<div class="act_as_cell"></div> |
|
||||
## move |
|
||||
<div class="act_as_cell"></div> |
|
||||
## journal |
|
||||
<div class="act_as_cell"></div> |
|
||||
## move reference |
|
||||
<div class="act_as_cell"></div> |
|
||||
## label |
|
||||
<div class="act_as_cell">${_('Cumulated Balance on Partner')}</div> |
|
||||
## reconcile |
|
||||
<div class="act_as_cell"></div> |
|
||||
## maturity date |
|
||||
<div class="act_as_cell"></div> |
|
||||
## debit |
|
||||
<div class="act_as_cell amount">${formatLang(total_debit) | amount }</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount">${formatLang(total_credit) | amount }</div> |
|
||||
## balance cumulated |
|
||||
<div class="act_as_cell amount" style="padding-right: 1px;">${formatLang(cumul_balance) | amount }</div> |
|
||||
%if account.currency_id: |
|
||||
## currency balance |
|
||||
<div class="act_as_cell sep_left amount" style="padding-right: 1px;">${formatLang(cumul_balance_curr) | amount }</div> |
|
||||
%else: |
|
||||
<div class="act_as_cell sep_left amount" style="padding-right: 1px;">${ u'-' }</div> |
|
||||
%endif |
|
||||
## curency code |
|
||||
<div class="act_as_cell" style="text-align: right; ">${ account.currency_id.name if account.currency_id else u'' }</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
<% |
|
||||
account_total_debit += total_debit |
|
||||
account_total_credit += total_credit |
|
||||
account_balance_cumul += cumul_balance |
|
||||
account_balance_cumul_curr += cumul_balance_curr |
|
||||
%> |
|
||||
%endfor |
|
||||
%endfor |
|
||||
<div class="act_as_table list_table" style="margin-top:5px;"> |
|
||||
<div class="act_as_row labels" style="font-weight: bold; font-size: 12px;"> |
|
||||
<div class="act_as_cell first_column" style="width: 450px;">${account.code} - ${account.name}</div> |
|
||||
## label |
|
||||
<div class="act_as_cell" style="width: 320px;">${_("Cumulated Balance on Account")}</div> |
|
||||
## debit |
|
||||
<div class="act_as_cell amount" style="width: 80px;">${ formatLang(account_total_debit) | amount }</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount" style="width: 80px;">${ formatLang(account_total_credit) | amount }</div> |
|
||||
## balance cumulated |
|
||||
<div class="act_as_cell amount" style="width: 80px; ">${ formatLang(account_balance_cumul) | amount }</div> |
|
||||
## currency balance cumulated |
|
||||
%if account.currency_id: |
|
||||
<div class="act_as_cell amount sep_left" style="width: 80px;">${ formatLang(account_balance_cumul_curr) | amount }</div> |
|
||||
%else: |
|
||||
<div class="act_as_cell amount sep_left" style="width: 80px; padding-right: 1px;">${ u'-' }</div> |
|
||||
%endif |
|
||||
## curency code |
|
||||
<div class="act_as_cell amount" style="width: 30px; text-align: right;">${ account.currency_id.name if account.currency_id else u'' }</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
%endif |
|
@ -1,183 +0,0 @@ |
|||||
## -*- coding: utf-8 -*- |
|
||||
<%page args="account, formatLang" /> |
|
||||
%if ledger_lines[account.id] and partners_order[account.id]: |
|
||||
<% |
|
||||
account_total_debit = 0.0 |
|
||||
account_total_credit = 0.0 |
|
||||
account_balance_cumul = 0.0 |
|
||||
account_balance_cumul_curr = 0.0 |
|
||||
%> |
|
||||
|
|
||||
<div class="account_title bg" style="width: 1080px; margin-top: 20px; font-size: 12px;">${account.code} - ${account.name}</div> |
|
||||
|
|
||||
%for partner_name, p_id, p_ref, p_name in partners_order[account.id]: |
|
||||
<% |
|
||||
total_debit = 0.0 |
|
||||
total_credit = 0.0 |
|
||||
cumul_balance = 0.0 |
|
||||
cumul_balance_curr = 0.0 |
|
||||
|
|
||||
part_cumul_balance = 0.0 |
|
||||
part_cumul_balance_curr = 0.0 |
|
||||
%> |
|
||||
<div class="act_as_table list_table" style="margin-top: 5px;"> |
|
||||
<div class="act_as_caption account_title"> |
|
||||
${partner_name or _('No Partner')} |
|
||||
</div> |
|
||||
<div class="act_as_thead"> |
|
||||
<div class="act_as_row labels"> |
|
||||
## date |
|
||||
<div class="act_as_cell first_column" style="width: 60px;">${_('Date')}</div> |
|
||||
## period |
|
||||
<div class="act_as_cell" style="width: 70px;">${_('Period')}</div> |
|
||||
## move |
|
||||
<div class="act_as_cell" style="width: 100px;">${_('Entry')}</div> |
|
||||
## journal |
|
||||
<div class="act_as_cell" style="width: 70px;">${_('Journal')}</div> |
|
||||
## partner |
|
||||
<div class="act_as_cell" style="width: 120px;">${_('Partner')}</div> |
|
||||
## move reference |
|
||||
<div class="act_as_cell" style="width: 100px;">${_('Reference')}</div> |
|
||||
## label |
|
||||
<div class="act_as_cell" style="width: 180px;">${_('Label')}</div> |
|
||||
## reconcile |
|
||||
<div class="act_as_cell" style="width: 80px;">${_('Rec.')}</div> |
|
||||
## maturity |
|
||||
<div class="act_as_cell" style="width: 60px;">${_('Due Date')}</div> |
|
||||
## debit |
|
||||
<div class="act_as_cell amount" style="width: 80px;">${_('Debit')}</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount" style="width: 80px;">${_('Credit')}</div> |
|
||||
## balance cumulated |
|
||||
<div class="act_as_cell amount" style="width: 80px;">${_('Cumul. Bal.')}</div> |
|
||||
%if amount_currency(data): |
|
||||
## currency balance |
|
||||
<div class="act_as_cell amount sep_left" style="width: 80px;">${_('Curr. Balance')}</div> |
|
||||
## curency code |
|
||||
<div class="act_as_cell amount" style="width: 30px; text-align: right;">${_('Curr.')}</div> |
|
||||
%endif |
|
||||
</div> |
|
||||
</div> |
|
||||
<div class="act_as_tbody"> |
|
||||
<% |
|
||||
total_debit = 0.0 |
|
||||
total_credit = 0.0 |
|
||||
%> |
|
||||
<%! |
|
||||
def amount(text): |
|
||||
return text.replace('-', '‑') # replace by a non-breaking hyphen (it will not word-wrap between hyphen and numbers) |
|
||||
%> |
|
||||
%for line in ledger_lines[account.id].get(p_id, []): |
|
||||
<% |
|
||||
total_debit += line.get('debit') or 0.0 |
|
||||
total_credit += line.get('credit') or 0.0 |
|
||||
|
|
||||
label_elements = [line.get('lname') or ''] |
|
||||
if line.get('invoice_number'): |
|
||||
label_elements.append("(%s)" % (line['invoice_number'],)) |
|
||||
label = ' '.join(label_elements) |
|
||||
%> |
|
||||
<div class="act_as_row lines ${line.get('is_from_previous_periods') and 'open_invoice_previous_line' or ''} ${line.get('is_clearance_line') and 'clearance_line' or ''}"> |
|
||||
## date |
|
||||
<div class="act_as_cell first_column">${formatLang(line.get('ldate') or '', date=True)}</div> |
|
||||
## period |
|
||||
<div class="act_as_cell">${line.get('period_code') or ''}</div> |
|
||||
## move |
|
||||
<div class="act_as_cell">${line.get('move_name') or ''}</div> |
|
||||
## journal |
|
||||
<div class="act_as_cell">${line.get('jcode') or ''}</div> |
|
||||
## partner |
|
||||
<div class="act_as_cell overflow_ellipsis">${line.get('partner_name') or ''}</div> |
|
||||
## move reference |
|
||||
<div class="act_as_cell">${line.get('lref') or ''}</div> |
|
||||
## label |
|
||||
<div class="act_as_cell">${label}</div> |
|
||||
## reconcile |
|
||||
<div class="act_as_cell">${line.get('rec_name') or ''}</div> |
|
||||
## maturity date |
|
||||
<div class="act_as_cell">${formatLang(line.get('date_maturity') or '', date=True)}</div> |
|
||||
## debit |
|
||||
<div class="act_as_cell amount">${formatLang(line.get('debit') or 0.0) | amount }</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount">${formatLang(line.get('credit') or 0.0) | amount }</div> |
|
||||
## balance cumulated |
|
||||
<% cumul_balance += line.get('balance') or 0.0 %> |
|
||||
<div class="act_as_cell amount" style="padding-right: 1px;">${formatLang(cumul_balance) | amount }</div> |
|
||||
%if amount_currency(data): |
|
||||
## currency balance |
|
||||
<div class="act_as_cell sep_left amount">${formatLang(line.get('amount_currency') or 0.0) | amount }</div> |
|
||||
## curency code |
|
||||
<div class="act_as_cell" style="text-align: right; ">${line.get('currency_code') or ''}</div> |
|
||||
%endif |
|
||||
</div> |
|
||||
%endfor |
|
||||
<div class="act_as_row lines labels"> |
|
||||
## date |
|
||||
<div class="act_as_cell first_column"></div> |
|
||||
## period |
|
||||
<div class="act_as_cell"></div> |
|
||||
## move |
|
||||
<div class="act_as_cell"></div> |
|
||||
## journal |
|
||||
<div class="act_as_cell"></div> |
|
||||
## partner |
|
||||
<div class="act_as_cell"></div> |
|
||||
## move reference |
|
||||
<div class="act_as_cell"></div> |
|
||||
## label |
|
||||
<div class="act_as_cell">${_('Cumulated Balance on Partner')}</div> |
|
||||
## reconcile |
|
||||
<div class="act_as_cell"></div> |
|
||||
## maturity date |
|
||||
<div class="act_as_cell"></div> |
|
||||
## debit |
|
||||
<div class="act_as_cell amount">${formatLang(total_debit) | amount }</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount">${formatLang(total_credit) | amount }</div> |
|
||||
## balance cumulated |
|
||||
<div class="act_as_cell amount" style="padding-right: 1px;">${formatLang(cumul_balance) | amount }</div> |
|
||||
%if amount_currency(data): |
|
||||
%if account.currency_id: |
|
||||
## currency balance |
|
||||
<div class="act_as_cell sep_left amount" style="padding-right: 1px;">${formatLang(cumul_balance_curr) | amount }</div> |
|
||||
%else: |
|
||||
<div class="act_as_cell sep_left amount" style="padding-right: 1px;">${ u'-' }</div> |
|
||||
%endif |
|
||||
## curency code |
|
||||
<div class="act_as_cell" style="text-align: right; ">${ account.currency_id.name if account.currency_id else u'' }</div> |
|
||||
%endif |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
<% |
|
||||
account_total_debit += total_debit |
|
||||
account_total_credit += total_credit |
|
||||
account_balance_cumul += cumul_balance |
|
||||
account_balance_cumul_curr += cumul_balance_curr |
|
||||
%> |
|
||||
%endfor |
|
||||
<div class="act_as_table list_table" style="margin-top:5px;"> |
|
||||
<div class="act_as_row labels" style="font-weight: bold; font-size: 12px;"> |
|
||||
<div class="act_as_cell first_column" style="width: 520px;">${account.code} - ${account.name}</div> |
|
||||
## label |
|
||||
<div class="act_as_cell" style="width: 320px;">${_("Cumulated Balance on Account")}</div> |
|
||||
## debit |
|
||||
<div class="act_as_cell amount" style="width: 80px;">${ formatLang(account_total_debit) | amount }</div> |
|
||||
## credit |
|
||||
<div class="act_as_cell amount" style="width: 80px;">${ formatLang(account_total_credit) | amount }</div> |
|
||||
## balance cumulated |
|
||||
<div class="act_as_cell amount" style="width: 80px; ">${ formatLang(account_balance_cumul) | amount }</div> |
|
||||
%if amount_currency(data): |
|
||||
## currency balance cumulated |
|
||||
%if account.currency_id: |
|
||||
<div class="act_as_cell amount sep_left" style="width: 80px;">${ formatLang(account_balance_cumul_curr) | amount }</div> |
|
||||
%else: |
|
||||
<div class="act_as_cell amount sep_left" style="width: 80px; padding-right: 1px;">${ u'-' }</div> |
|
||||
%endif |
|
||||
## curency code |
|
||||
<div class="act_as_cell amount" style="width: 30px; text-align: right;">${ account.currency_id.name if account.currency_id else u'' }</div> |
|
||||
%endif |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
%endif |
|
@ -1,93 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Author: Guewen Baconnier |
|
||||
# Copyright Camptocamp SA 2011 |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
|
|
||||
from datetime import datetime |
|
||||
|
|
||||
from openerp import pooler |
|
||||
from openerp.report import report_sxw |
|
||||
from openerp.tools.translate import _ |
|
||||
from .common_balance_reports import CommonBalanceReportHeaderWebkit |
|
||||
from .webkit_parser_header_fix import HeaderFooterTextWebKitParser |
|
||||
|
|
||||
|
|
||||
def sign(number): |
|
||||
return cmp(number, 0) |
|
||||
|
|
||||
|
|
||||
class TrialBalanceWebkit(report_sxw.rml_parse, |
|
||||
CommonBalanceReportHeaderWebkit): |
|
||||
|
|
||||
def __init__(self, cursor, uid, name, context): |
|
||||
super(TrialBalanceWebkit, self).__init__(cursor, uid, name, |
|
||||
context=context) |
|
||||
self.pool = pooler.get_pool(self.cr.dbname) |
|
||||
self.cursor = self.cr |
|
||||
|
|
||||
company = self.pool.get('res.users').browse(self.cr, uid, uid, |
|
||||
context=context).company_id |
|
||||
header_report_name = ' - '.join((_('TRIAL BALANCE'), company.name, |
|
||||
company.currency_id.name)) |
|
||||
|
|
||||
footer_date_time = self.formatLang(str(datetime.today()), |
|
||||
date_time=True) |
|
||||
|
|
||||
self.localcontext.update({ |
|
||||
'cr': cursor, |
|
||||
'uid': uid, |
|
||||
'report_name': _('Trial Balance'), |
|
||||
'display_account': self._get_display_account, |
|
||||
'display_account_raw': self._get_display_account_raw, |
|
||||
'filter_form': self._get_filter, |
|
||||
'target_move': self._get_target_move, |
|
||||
'display_target_move': self._get_display_target_move, |
|
||||
'accounts': self._get_accounts_br, |
|
||||
'additional_args': [ |
|
||||
('--header-font-name', 'Helvetica'), |
|
||||
('--footer-font-name', 'Helvetica'), |
|
||||
('--header-font-size', '10'), |
|
||||
('--footer-font-size', '6'), |
|
||||
('--header-left', header_report_name), |
|
||||
('--header-spacing', '2'), |
|
||||
('--footer-left', footer_date_time), |
|
||||
('--footer-right', ' '.join((_('Page'), '[page]', _('of'), |
|
||||
'[topage]'))), |
|
||||
('--footer-line',), |
|
||||
], |
|
||||
}) |
|
||||
|
|
||||
def set_context(self, objects, data, ids, report_type=None): |
|
||||
"""Populate a ledger_lines attribute on each browse record that will |
|
||||
be used by mako template""" |
|
||||
objects, new_ids, context_report_values = self.\ |
|
||||
compute_balance_data(data) |
|
||||
|
|
||||
self.localcontext.update(context_report_values) |
|
||||
|
|
||||
return super(TrialBalanceWebkit, self).set_context( |
|
||||
objects, data, new_ids, report_type=report_type) |
|
||||
|
|
||||
HeaderFooterTextWebKitParser( |
|
||||
'report.account.account_report_trial_balance_webkit', |
|
||||
'account.account', |
|
||||
'addons/account_financial_report_webkit/report/templates/\ |
|
||||
account_report_trial_balance.mako', |
|
||||
parser=TrialBalanceWebkit) |
|
@ -1,279 +0,0 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Copyright (c) 2011 Camptocamp SA (http://www.camptocamp.com) |
|
||||
# |
|
||||
# Author: Guewen Baconnier (Camptocamp) |
|
||||
# |
|
||||
# WARNING: This program as such is intended to be used by professional |
|
||||
# programmers who take the whole responsability of assessing all potential |
|
||||
# consequences resulting from its eventual inadequacies and bugs |
|
||||
# End users who are looking for a ready-to-use solution with commercial |
|
||||
# garantees and support are strongly adviced to contract a Free Software |
|
||||
# Service Company |
|
||||
# |
|
||||
# This program is Free Software; you can redistribute it and/or |
|
||||
# modify it under the terms of the GNU General Public License |
|
||||
# as published by the Free Software Foundation; either version 2 |
|
||||
# of the License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU General Public License |
|
||||
# along with this program; if not, write to the Free Software |
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
|
||||
# |
|
||||
############################################################################## |
|
||||
from mako.template import Template |
|
||||
from mako.lookup import TemplateLookup |
|
||||
|
|
||||
import os |
|
||||
import subprocess |
|
||||
import tempfile |
|
||||
import logging |
|
||||
from functools import partial |
|
||||
|
|
||||
|
|
||||
from mako import exceptions |
|
||||
from openerp.osv.orm import except_orm |
|
||||
from openerp.tools.translate import _ |
|
||||
from openerp import pooler |
|
||||
from openerp import tools |
|
||||
from openerp.addons.report_webkit import webkit_report |
|
||||
from openerp.addons.report_webkit.report_helper import WebKitHelper |
|
||||
from openerp.modules.module import get_module_resource |
|
||||
|
|
||||
_logger = logging.getLogger('financial.reports.webkit') |
|
||||
|
|
||||
# Class used only as a workaround to bug: |
|
||||
# http://code.google.com/p/wkhtmltopdf/issues/detail?id=656 |
|
||||
|
|
||||
# html headers and footers do not work on big files (hundreds of pages) so we |
|
||||
# replace them by text headers and footers passed as arguments to wkhtmltopdf |
|
||||
# this class has to be removed once the bug is fixed |
|
||||
|
|
||||
# in your report class, to print headers and footers as text, you have to add |
|
||||
# them in the localcontext with a key 'additional_args' |
|
||||
# for instance: |
|
||||
# header_report_name = _('PARTNER LEDGER') |
|
||||
# footer_date_time = self.formatLang(str(datetime.today()), |
|
||||
# date_time=True) |
|
||||
# self.localcontext.update({ |
|
||||
# 'additional_args': [ |
|
||||
# ('--header-font-name', 'Helvetica'), |
|
||||
# ('--footer-font-name', 'Helvetica'), |
|
||||
# ('--header-font-size', '10'), |
|
||||
# ('--footer-font-size', '7'), |
|
||||
# ('--header-left', header_report_name), |
|
||||
# ('--footer-left', footer_date_time), |
|
||||
# ('--footer-right', ' '.join((_('Page'), '[page]', _('of'), |
|
||||
# '[topage]'))), |
|
||||
# ('--footer-line',), |
|
||||
# ], |
|
||||
# }) |
|
||||
|
|
||||
|
|
||||
# redefine mako_template as this is overriden by jinja since saas-1 |
|
||||
# from openerp.addons.report_webkit.webkit_report import mako_template |
|
||||
|
|
||||
|
|
||||
def mako_template(text): |
|
||||
"""Build a Mako template. |
|
||||
|
|
||||
This template uses UTF-8 encoding |
|
||||
""" |
|
||||
tmp_lookup = TemplateLookup( |
|
||||
) # we need it in order to allow inclusion and inheritance |
|
||||
return Template(text, input_encoding='utf-8', output_encoding='utf-8', |
|
||||
lookup=tmp_lookup) |
|
||||
|
|
||||
|
|
||||
class HeaderFooterTextWebKitParser(webkit_report.WebKitParser): |
|
||||
|
|
||||
def generate_pdf(self, comm_path, report_xml, header, footer, html_list, |
|
||||
webkit_header=False, parser_instance=False): |
|
||||
"""Call webkit in order to generate pdf""" |
|
||||
if not webkit_header: |
|
||||
webkit_header = report_xml.webkit_header |
|
||||
fd, out_filename = tempfile.mkstemp(suffix=".pdf", |
|
||||
prefix="webkit.tmp.") |
|
||||
file_to_del = [out_filename] |
|
||||
if comm_path: |
|
||||
command = [comm_path] |
|
||||
else: |
|
||||
command = ['wkhtmltopdf'] |
|
||||
|
|
||||
command.append('--quiet') |
|
||||
# default to UTF-8 encoding. Use <meta charset="latin-1"> to override. |
|
||||
command.extend(['--encoding', 'utf-8']) |
|
||||
|
|
||||
if webkit_header.margin_top: |
|
||||
command.extend( |
|
||||
['--margin-top', |
|
||||
str(webkit_header.margin_top).replace(',', '.')]) |
|
||||
if webkit_header.margin_bottom: |
|
||||
command.extend( |
|
||||
['--margin-bottom', |
|
||||
str(webkit_header.margin_bottom).replace(',', '.')]) |
|
||||
if webkit_header.margin_left: |
|
||||
command.extend( |
|
||||
['--margin-left', |
|
||||
str(webkit_header.margin_left).replace(',', '.')]) |
|
||||
if webkit_header.margin_right: |
|
||||
command.extend( |
|
||||
['--margin-right', |
|
||||
str(webkit_header.margin_right).replace(',', '.')]) |
|
||||
if webkit_header.orientation: |
|
||||
command.extend( |
|
||||
['--orientation', |
|
||||
str(webkit_header.orientation).replace(',', '.')]) |
|
||||
if webkit_header.format: |
|
||||
command.extend( |
|
||||
['--page-size', |
|
||||
str(webkit_header.format).replace(',', '.')]) |
|
||||
|
|
||||
if parser_instance.localcontext.get('additional_args', False): |
|
||||
for arg in parser_instance.localcontext['additional_args']: |
|
||||
command.extend(arg) |
|
||||
|
|
||||
count = 0 |
|
||||
for html in html_list: |
|
||||
with tempfile.NamedTemporaryFile(suffix="%d.body.html" % count, |
|
||||
delete=False) as html_file: |
|
||||
count += 1 |
|
||||
html_file.write(self._sanitize_html(html)) |
|
||||
file_to_del.append(html_file.name) |
|
||||
command.append(html_file.name) |
|
||||
command.append(out_filename) |
|
||||
stderr_fd, stderr_path = tempfile.mkstemp(text=True) |
|
||||
file_to_del.append(stderr_path) |
|
||||
try: |
|
||||
status = subprocess.call(command, stderr=stderr_fd) |
|
||||
os.close(stderr_fd) # ensure flush before reading |
|
||||
stderr_fd = None # avoid closing again in finally block |
|
||||
fobj = open(stderr_path, 'r') |
|
||||
error_message = fobj.read() |
|
||||
fobj.close() |
|
||||
if not error_message: |
|
||||
error_message = _('No diagnosis message was provided') |
|
||||
else: |
|
||||
error_message = _( |
|
||||
'The following diagnosis message was provided:\n') + \ |
|
||||
error_message |
|
||||
if status: |
|
||||
raise except_orm(_('Webkit error'), |
|
||||
_("The command 'wkhtmltopdf' failed with \ |
|
||||
error code = %s. Message: %s") % |
|
||||
(status, error_message)) |
|
||||
with open(out_filename, 'rb') as pdf_file: |
|
||||
pdf = pdf_file.read() |
|
||||
os.close(fd) |
|
||||
finally: |
|
||||
if stderr_fd is not None: |
|
||||
os.close(stderr_fd) |
|
||||
for f_to_del in file_to_del: |
|
||||
try: |
|
||||
os.unlink(f_to_del) |
|
||||
except (OSError, IOError), exc: |
|
||||
_logger.error('cannot remove file %s: %s', f_to_del, exc) |
|
||||
return pdf |
|
||||
|
|
||||
# override needed to keep the attachments' storing procedure |
|
||||
def create_single_pdf(self, cursor, uid, ids, data, report_xml, |
|
||||
context=None): |
|
||||
"""generate the PDF""" |
|
||||
|
|
||||
if context is None: |
|
||||
context = {} |
|
||||
htmls = [] |
|
||||
if report_xml.report_type != 'webkit': |
|
||||
return super(HeaderFooterTextWebKitParser, self |
|
||||
).create_single_pdf(cursor, uid, ids, data, |
|
||||
report_xml, context=context) |
|
||||
|
|
||||
parser_instance = self.parser(cursor, |
|
||||
uid, |
|
||||
self.name2, |
|
||||
context=context) |
|
||||
|
|
||||
self.pool = pooler.get_pool(cursor.dbname) |
|
||||
objs = self.getObjects(cursor, uid, ids, context) |
|
||||
parser_instance.set_context(objs, data, ids, report_xml.report_type) |
|
||||
|
|
||||
template = False |
|
||||
|
|
||||
if report_xml.report_file: |
|
||||
path = get_module_resource( |
|
||||
*report_xml.report_file.split(os.path.sep)) |
|
||||
if os.path.exists(path): |
|
||||
template = file(path).read() |
|
||||
if not template and report_xml.report_webkit_data: |
|
||||
template = report_xml.report_webkit_data |
|
||||
if not template: |
|
||||
raise except_orm( |
|
||||
_('Error!'), _('Webkit Report template not found !')) |
|
||||
header = report_xml.webkit_header.html |
|
||||
|
|
||||
if not header and report_xml.header: |
|
||||
raise except_orm( |
|
||||
_('No header defined for this Webkit report!'), |
|
||||
_('Please set a header in company settings.') |
|
||||
) |
|
||||
|
|
||||
css = report_xml.webkit_header.css |
|
||||
if not css: |
|
||||
css = '' |
|
||||
|
|
||||
translate_call = partial(self.translate_call, parser_instance) |
|
||||
# default_filters=['unicode', 'entity'] can be used to set global |
|
||||
# filter |
|
||||
body_mako_tpl = mako_template(template) |
|
||||
helper = WebKitHelper(cursor, uid, report_xml.id, context) |
|
||||
if report_xml.precise_mode: |
|
||||
for obj in objs: |
|
||||
parser_instance.localcontext['objects'] = [obj] |
|
||||
try: |
|
||||
html = body_mako_tpl.render(helper=helper, |
|
||||
css=css, |
|
||||
_=translate_call, |
|
||||
**parser_instance.localcontext) |
|
||||
htmls.append(html) |
|
||||
except Exception: |
|
||||
msg = exceptions.text_error_template().render() |
|
||||
_logger.error(msg) |
|
||||
raise except_orm(_('Webkit render'), msg) |
|
||||
else: |
|
||||
try: |
|
||||
html = body_mako_tpl.render(helper=helper, |
|
||||
css=css, |
|
||||
_=translate_call, |
|
||||
**parser_instance.localcontext) |
|
||||
htmls.append(html) |
|
||||
except Exception: |
|
||||
msg = exceptions.text_error_template().render() |
|
||||
_logger.error(msg) |
|
||||
raise except_orm(_('Webkit render'), msg) |
|
||||
|
|
||||
# NO html footer and header because we write them as text with |
|
||||
# wkhtmltopdf |
|
||||
head = foot = False |
|
||||
|
|
||||
if report_xml.webkit_debug: |
|
||||
try: |
|
||||
deb = body_mako_tpl.render(helper=helper, |
|
||||
css=css, |
|
||||
_debug=tools.ustr("\n".join(htmls)), |
|
||||
_=translate_call, |
|
||||
**parser_instance.localcontext) |
|
||||
except Exception: |
|
||||
msg = exceptions.text_error_template().render() |
|
||||
_logger.error(msg) |
|
||||
raise except_orm(_('Webkit render'), msg) |
|
||||
return (deb, 'html') |
|
||||
bin = self.get_lib(cursor, uid) |
|
||||
pdf = self.generate_pdf(bin, report_xml, head, foot, htmls, |
|
||||
parser_instance=parser_instance) |
|
||||
return (pdf, 'pdf') |
|
@ -1,42 +0,0 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||
<openerp> |
|
||||
<data> |
|
||||
|
|
||||
<menuitem icon="STOCK_PRINT" name="General Ledger" |
|
||||
parent="account.final_accounting_reports" action="action_account_general_ledger_menu_webkit" |
|
||||
groups="account.group_account_manager,account.group_account_user" id="account.menu_general_ledger"/> |
|
||||
|
|
||||
<menuitem icon="STOCK_PRINT" name="Trial Balance" |
|
||||
parent="account.final_accounting_reports" action="action_account_trial_balance_menu_webkit" |
|
||||
groups="account.group_account_manager,account.group_account_user" id="account.menu_general_Balance_report"/> |
|
||||
|
|
||||
<menuitem icon="STOCK_PRINT" name="Partner Ledger" |
|
||||
parent="account.next_id_22" action="action_account_partners_ledger_menu_webkit" |
|
||||
groups="account.group_account_manager,account.group_account_user" id="account.menu_account_partner_ledger"/> |
|
||||
|
|
||||
<menuitem icon="STOCK_PRINT" name="Partner Balance" |
|
||||
parent="account.next_id_22" action="action_account_partner_balance_menu_webkit" |
|
||||
groups="account.group_account_manager,account.group_account_user" id="account.menu_account_partner_balance_report"/> |
|
||||
|
|
||||
<menuitem icon="STOCK_PRINT" name="Aged Partner Balance" |
|
||||
parent="account.next_id_22" action="action_account_aged_trial_balance_menu_webkit" |
|
||||
groups="account.group_account_manager,account.group_account_user" id="account.menu_aged_trial_balance"/> |
|
||||
|
|
||||
<menuitem icon="STOCK_PRINT" name="Open Invoices" |
|
||||
parent="account.next_id_22" action="action_account_open_invoices_menu_webkit" |
|
||||
groups="account.group_account_manager,account.group_account_user" id="menu_account_open_invoices"/> |
|
||||
|
|
||||
<menuitem icon="STOCK_PRINT" name="Journals" |
|
||||
parent="account.menu_journals_report" action="action_account_print_journal_menu_webkit" |
|
||||
groups="account.group_account_manager,account.group_account_user" id="account.menu_account_print_journal"/> |
|
||||
|
|
||||
<!-- |
|
||||
Hide Sale / Purchase Journals menu, replaced by a unique |
|
||||
"Journals" menu |
|
||||
--> |
|
||||
<record id="account.menu_account_print_sale_purchase_journal" model="ir.ui.menu"> |
|
||||
<field name="groups_id" eval="[(4, ref('base.group_no_one')), ]"/> |
|
||||
</record> |
|
||||
|
|
||||
</data> |
|
||||
</openerp> |
|
Before Width: 256 | Height: 256 | Size: 15 KiB |
@ -1,3 +0,0 @@ |
|||||
- |
|
||||
In order to test the last_rec_date behavior we will create a move and reconcile it |
|
||||
- |
|
@ -1,56 +0,0 @@ |
|||||
- |
|
||||
In order to test the PDF Aged Partner Balance Report webkit wizard I will print report with default setting |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'until_date': '%s-12-31' %(datetime.now().year), |
|
||||
'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'period_from': ref('account.period_1'), |
|
||||
'period_to': ref('account.period_12')} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_aged_trial_balance_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF Aged Partner Balance Report webkit wizard I will print report with filters and currency |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'until_date': '%s-12-31' %(datetime.now().year), 'target_move': 'posted', |
|
||||
'amount_currency': True, 'result_selection': 'customer_supplier', |
|
||||
'period_from': ref('account.period_1'), |
|
||||
'period_to': ref('account.period_12')} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_aged_trial_balance_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF Aged Partner Balance Report webkit wizard I will print report with filters on partners |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'until_date': '%s-12-31' %(datetime.now().year), 'target_move': 'posted', |
|
||||
'amount_currency': True, 'result_selection': 'customer_supplier', |
|
||||
'partner_ids': [ref('base.res_partner_2'), ref('base.res_partner_1')], |
|
||||
'period_from': ref('account.period_1'), |
|
||||
'period_to': ref('account.period_12')} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_aged_trial_balance_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF Aged Partner Balance Report webkit wizard I will print report with filters on periods |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'until_date': '%s-12-31' %(datetime.now().year), 'target_move': 'posted', |
|
||||
'amount_currency': True, 'result_selection': 'customer_supplier', |
|
||||
'filter': 'filter_period', |
|
||||
'period_from': ref('account.period_1'), |
|
||||
'period_to': ref('account.period_12')} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_aged_trial_balance_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
@ -1,65 +0,0 @@ |
|||||
- |
|
||||
In order to test the PDF General Ledger webkit wizard I will print report with default setting |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0')} |
|
||||
ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')],'active_id':ref('account.chart0')}) |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_general_ledger_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF General Ledger webkit wizard I will print report with posted move |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'target_move': 'posted'} |
|
||||
ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')],'active_id':ref('account.chart0')}) |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_general_ledger_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF General Ledger webkit wizard I will print report with transactions or non zero balance |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'display_account': 'bal_mix'} |
|
||||
ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')],'active_id':ref('account.chart0')}) |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_general_ledger_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF General Ledger webkit wizard I will print report with inital balance and currency ammount |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'amount_currency': 1} |
|
||||
ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')],'active_id':ref('account.chart0')}) |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_general_ledger_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
#Filter by date |
|
||||
- |
|
||||
In order to test the PDF General Ledger webkit wizard I will print report with inital balance and currency ammount and I filter by date of the first tree month |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'),'amount_currency': 1, 'chart_account_id': 1, 'date_from': '%s-01-01' %(datetime.now().year), |
|
||||
'date_to':'%s-04-01' %(datetime.now().year), 'display_account': 'bal_all', 'filter': 'filter_date',} |
|
||||
ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')],'active_id':ref('account.chart0')}) |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_general_ledger_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF General Ledger webkit wizard I will print report with inital balance and currency ammount and I filter by date of the first tree month |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'),'amount_currency': 1, 'chart_account_id': 1, 'date_from': '%s-01-01' %(datetime.now().year), |
|
||||
'date_to':'%s-04-01' %(datetime.now().year), 'display_account': 'bal_all', 'filter': 'filter_date',} |
|
||||
ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')],'active_id':ref('account.chart0')}) |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_general_ledger_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
# I still have to parse report content but for this I need accounting data on multiple exercises and faor all fiscal year |
|
@ -1,60 +0,0 @@ |
|||||
- |
|
||||
In order to test the PDF Open Invoices Report webkit wizard I will print report with default setting |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'until_date': '%s-12-31' %(datetime.now().year)} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_open_invoices_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF Open Invoices Report webkit wizard I will print report with filters and currency |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'until_date': '%s-12-31' %(datetime.now().year), 'target_move': 'posted', |
|
||||
'amount_currency': True, 'result_selection': 'customer_supplier'} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_open_invoices_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF Open Invoices Report webkit wizard I will print report with filters on partners |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'until_date': '%s-12-31' %(datetime.now().year), 'target_move': 'posted', |
|
||||
'amount_currency': True, 'result_selection': 'customer_supplier', |
|
||||
'partner_ids': [ref('base.res_partner_2'), ref('base.res_partner_1')]} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_open_invoices_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF Open Invoices Report webkit wizard I will print report with filters on periods |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'until_date': '%s-12-31' %(datetime.now().year), 'target_move': 'posted', |
|
||||
'amount_currency': True, 'result_selection': 'customer_supplier', |
|
||||
'filter': 'filter_period', 'period_from': ref('account.period_1'), 'period_to': ref('account.period_12')} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_open_invoices_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF Open Invoices Report webkit wizard I will print report with filters on dates |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'until_date': '%s-12-31' %(datetime.now().year), 'target_move': 'posted', |
|
||||
'amount_currency': True, 'result_selection': 'customer_supplier', |
|
||||
'filter': 'filter_date', 'date_from': '%s-01-01' %(datetime.now().year), 'date_to': '%s-12-31' %(datetime.now().year)} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_open_invoices_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
@ -1,67 +0,0 @@ |
|||||
- |
|
||||
In order to test the PDF Partner Balance webkit wizard I will print report with default setting |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0')} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_partner_balance_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF Partner Balance webkit wizard I will print report as if we print it from an account |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0')} |
|
||||
ctx.update({'model': 'account.account','active_ids':[ref('account.assets_view'), ref('account.liabilities_view')],'active_id': ref('account.assets_view')}) |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_partner_balance_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF Partner Balance webkit wizard I will print report with filters on period |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'filter': 'filter_period', 'period_from': ref('account.period_1'), 'period_to': ref('account.period_12')} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_partner_balance_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF Partner Balance webkit wizard I will print report with filters on dates |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'filter': 'filter_date', 'date_from': '%s-01-01' %(datetime.now().year), 'date_to': '%s-12-31' %(datetime.now().year)} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_partner_balance_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF Partner Balance webkit wizard I will print report with one comparison filtered by year |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'comp0_filter': 'filter_year', 'comp0_fiscalyear_id': ref('account.data_fiscalyear')} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_partner_balance_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF Partner Balance webkit wizard I will print report with all comparisons filtered by year, period and date |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'comp0_filter': 'filter_year', 'comp0_fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'comp1_filter': 'filter_period', 'comp1_period_from': ref('account.period_1'), 'comp1_period_to': ref('account.period_12'), |
|
||||
'comp2_filter': 'filter_date', 'comp2_date_from': '%s-01-01' %(datetime.now().year), 'comp2_date_to': '%s-12-31' %(datetime.now().year) |
|
||||
} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_partner_balance_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
@ -1,60 +0,0 @@ |
|||||
- |
|
||||
In order to test the PDF Partner Ledger webkit wizard I will print report with default setting |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'until_date': '%s-12-31' %(datetime.now().year)} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_partners_ledger_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF Partner Ledger webkit wizard I will print report with filters and currency |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'until_date': '%s-12-31' %(datetime.now().year), 'target_move': 'posted', |
|
||||
'amount_currency': True, 'result_selection': 'customer_supplier'} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_partners_ledger_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF Partner Ledger webkit wizard I will print report with filters on partners |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'until_date': '%s-12-31' %(datetime.now().year), 'target_move': 'posted', |
|
||||
'amount_currency': True, 'result_selection': 'customer_supplier', |
|
||||
'partner_ids': [ref('base.res_partner_2'), ref('base.res_partner_1')]} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_partners_ledger_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF Partner Ledger webkit wizard I will print report with filters on periods |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'until_date': '%s-12-31' %(datetime.now().year), 'target_move': 'posted', |
|
||||
'amount_currency': True, 'result_selection': 'customer_supplier', |
|
||||
'filter': 'filter_period', 'period_from': ref('account.period_1'), 'period_to': ref('account.period_12')} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_partners_ledger_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF Partner Ledger webkit wizard I will print report with filters on dates |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'until_date': '%s-12-31' %(datetime.now().year), 'target_move': 'posted', |
|
||||
'amount_currency': True, 'result_selection': 'customer_supplier', |
|
||||
'filter': 'filter_date', 'date_from': '%s-01-01' %(datetime.now().year), 'date_to': '%s-12-31' %(datetime.now().year)} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_partners_ledger_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
@ -1,67 +0,0 @@ |
|||||
- |
|
||||
In order to test the PDF Trial Balance webkit wizard I will print report with default setting |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0')} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_trial_balance_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF Trial Balance webkit wizard I will print report as if we print it from an account |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0')} |
|
||||
ctx.update({'model': 'account.account','active_ids':[ref('account.assets_view'), ref('account.liabilities_view')],'active_id': ref('account.assets_view')}) |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_trial_balance_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF Trial Balance webkit wizard I will print report with filters on period |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'filter': 'filter_period', 'period_from': ref('account.period_1'), 'period_to': ref('account.period_12')} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_trial_balance_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF Trial Balance webkit wizard I will print report with filters on dates |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'filter': 'filter_date', 'date_from': '%s-01-01' %(datetime.now().year), 'date_to': '%s-12-31' %(datetime.now().year)} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_trial_balance_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF Trial Balance webkit wizard I will print report with one comparison filtered by year |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'comp0_filter': 'filter_year', 'comp0_fiscalyear_id': ref('account.data_fiscalyear')} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_trial_balance_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
||||
|
|
||||
- |
|
||||
In order to test the PDF Trial Balance webkit wizard I will print report with all comparisons filtered by year, period and date |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'comp0_filter': 'filter_year', 'comp0_fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'comp1_filter': 'filter_period', 'comp1_period_from': ref('account.period_1'), 'comp1_period_to': ref('account.period_12'), |
|
||||
'comp2_filter': 'filter_date', 'comp2_date_from': '%s-01-01' %(datetime.now().year), 'comp2_date_to': '%s-12-31' %(datetime.now().year) |
|
||||
} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'action_account_trial_balance_menu_webkit',wiz_data=data_dict, context=ctx, our_module='account_financial_report_webkit') |
|
@ -1,30 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Author: Nicolas Bessi. Copyright Camptocamp SA |
|
||||
# Copyright (C) 2012 SYLEAM Info Services (<http://www.syleam.fr/>) |
|
||||
# Sebastien LANGE <sebastien.lange@syleam.fr> |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
from . import balance_common |
|
||||
from . import general_ledger_wizard |
|
||||
from . import partners_ledger_wizard |
|
||||
from . import trial_balance_wizard |
|
||||
from . import partner_balance_wizard |
|
||||
from . import open_invoices_wizard |
|
||||
from . import print_journal |
|
||||
from . import aged_partner_balance_wizard |
|
@ -1,90 +0,0 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Author: Nicolas Bessi |
|
||||
# Copyright 2014 Camptocamp SA |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
from datetime import date |
|
||||
from openerp.osv import orm, fields |
|
||||
from openerp.tools import DEFAULT_SERVER_DATE_FORMAT as DATE_FORMAT |
|
||||
|
|
||||
|
|
||||
class AccountAgedTrialBalance(orm.TransientModel): |
|
||||
"""Will launch age partner balance report. |
|
||||
This report is based on Open Invoice Report |
|
||||
and share a lot of knowledge with him |
|
||||
""" |
|
||||
|
|
||||
_inherit = "open.invoices.webkit" |
|
||||
_name = "account.aged.trial.balance.webkit" |
|
||||
_description = "Aged partner balanced" |
|
||||
|
|
||||
def _get_current_fiscalyear(self, cr, uid, context=None): |
|
||||
user_obj = self.pool['res.users'] |
|
||||
company = user_obj.browse(cr, uid, uid, context=context).company_id |
|
||||
fyear_obj = self.pool['account.period'] |
|
||||
today = date.today().strftime(DATE_FORMAT) |
|
||||
fyear_ids = fyear_obj.search( |
|
||||
cr, uid, |
|
||||
[('date_start', '>=', today), |
|
||||
('date_stop', '<=', today), |
|
||||
('company_id', '=', company.id)], |
|
||||
limit=1, |
|
||||
context=context) |
|
||||
if fyear_ids: |
|
||||
return fyear_ids[0] |
|
||||
|
|
||||
_columns = { |
|
||||
'filter': fields.selection( |
|
||||
[('filter_period', 'Periods')], |
|
||||
"Filter by", |
|
||||
required=True), |
|
||||
'fiscalyear_id': fields.many2one( |
|
||||
'account.fiscalyear', |
|
||||
'Fiscal Year', |
|
||||
required=True), |
|
||||
'period_to': fields.many2one('account.period', 'End Period', |
|
||||
required=True), |
|
||||
} |
|
||||
|
|
||||
_defaults = { |
|
||||
'filter': 'filter_period', |
|
||||
'fiscalyear_id': _get_current_fiscalyear, |
|
||||
} |
|
||||
|
|
||||
def onchange_fiscalyear(self, cr, uid, ids, fiscalyear=False, |
|
||||
period_id=False, date_to=False, until_date=False, |
|
||||
context=None): |
|
||||
res = super(AccountAgedTrialBalance, self).onchange_fiscalyear( |
|
||||
cr, uid, ids, fiscalyear=fiscalyear, period_id=period_id, |
|
||||
date_to=date_to, until_date=until_date, context=context |
|
||||
) |
|
||||
filters = self.onchange_filter(cr, uid, ids, filter='filter_period', |
|
||||
fiscalyear_id=fiscalyear, |
|
||||
context=context) |
|
||||
res['value'].update({ |
|
||||
'period_from': filters['value']['period_from'], |
|
||||
'period_to': filters['value']['period_to'], |
|
||||
}) |
|
||||
return res |
|
||||
|
|
||||
def _print_report(self, cr, uid, ids, data, context=None): |
|
||||
# we update form with display account value |
|
||||
data = self.pre_print_report(cr, uid, ids, data, context=context) |
|
||||
return {'type': 'ir.actions.report.xml', |
|
||||
'report_name': 'account.account_aged_trial_balance_webkit', |
|
||||
'datas': data} |
|
@ -1,75 +0,0 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||
<openerp> |
|
||||
<data> |
|
||||
|
|
||||
<record id="account_aged_trial_balance_webkit" model="ir.ui.view"> |
|
||||
<field name="name">Aged Partner Balance Report</field> |
|
||||
<field name="model">account.aged.trial.balance.webkit</field> |
|
||||
<field name="inherit_id" ref="account.account_common_report_view"/> |
|
||||
<field name="arch" type="xml"> |
|
||||
<data> |
|
||||
|
|
||||
<xpath expr="/form/label[@string='']" position="replace"> |
|
||||
<separator string="Aged Partner Balance" colspan="4"/> |
|
||||
<label nolabel="1" |
|
||||
colspan="4" |
|
||||
string="This report list partner open balances and indicate when payment is (or was) supposed to be completed"/> |
|
||||
</xpath> |
|
||||
<field name="chart_account_id" position='attributes'> |
|
||||
<attribute name="colspan">4</attribute> |
|
||||
</field> |
|
||||
<xpath expr="//field[@name='target_move']" position="after"> |
|
||||
<newline/> |
|
||||
<field name="result_selection" colspan="4"/> |
|
||||
</xpath> |
|
||||
<xpath expr="/form/notebook[1]" position="after"> |
|
||||
<separator string="Clearance Analysis Options" colspan="4"/> |
|
||||
<newline/> |
|
||||
<field name="until_date"/> |
|
||||
</xpath> |
|
||||
<page name="filters" position="after"> |
|
||||
<page string="Partners Filters" name="partners"> |
|
||||
<separator string="Print only" colspan="4"/> |
|
||||
<field name="partner_ids" colspan="4" nolabel="1"/> |
|
||||
</page> |
|
||||
</page> |
|
||||
<page name="filters" position="attributes"> |
|
||||
<attribute name="string">Time Filters</attribute> |
|
||||
</page> |
|
||||
<page name="journal_ids" position="attributes"> |
|
||||
<attribute name="invisible">True</attribute> |
|
||||
</page> |
|
||||
<field name="fiscalyear_id" position="attributes"> |
|
||||
<attribute name="on_change">onchange_fiscalyear(fiscalyear_id, period_to, date_to, until_date)</attribute> |
|
||||
</field> |
|
||||
<field name="filter" position="attributes"> |
|
||||
<attribute name="invisible">True</attribute> |
|
||||
</field> |
|
||||
<field name="period_from" position="attributes"> |
|
||||
<attribute name="invisible">True</attribute> |
|
||||
</field> |
|
||||
<field name="period_to" position="attributes"> |
|
||||
<attribute name="on_change">onchange_period_to(fiscalyear_id, period_to, date_to, until_date)</attribute> |
|
||||
</field> |
|
||||
<field name="period_to" position="attributes"> |
|
||||
<attribute name="String">At the end of</attribute> |
|
||||
</field> |
|
||||
<field name="period_to" position="attributes"> |
|
||||
<attribute name="domain">[('fiscalyear_id', '=', fiscalyear_id), ('special', '=', False)]</attribute> |
|
||||
</field> |
|
||||
</data> |
|
||||
</field> |
|
||||
</record> |
|
||||
|
|
||||
<record id="action_account_aged_trial_balance_menu_webkit" |
|
||||
model="ir.actions.act_window"> |
|
||||
<field name="name">Aged partner balance</field> |
|
||||
<field name="type">ir.actions.act_window</field> |
|
||||
<field name="res_model">account.aged.trial.balance.webkit</field> |
|
||||
<field name="view_type">form</field> |
|
||||
<field name="view_mode">form</field> |
|
||||
<field name="view_id" ref="account_aged_trial_balance_webkit"/> |
|
||||
<field name="target">new</field> |
|
||||
</record> |
|
||||
</data> |
|
||||
</openerp> |
|
@ -1,408 +0,0 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Copyright (c) 2011 Camptocamp SA (http://www.camptocamp.com) |
|
||||
# |
|
||||
# Author: Guewen Baconnier (Camptocamp) |
|
||||
# |
|
||||
# WARNING: This program as such is intended to be used by professional |
|
||||
# programmers who take the whole responsability of assessing all potential |
|
||||
# consequences resulting from its eventual inadequacies and bugs |
|
||||
# End users who are looking for a ready-to-use solution with commercial |
|
||||
# garantees and support are strongly adviced to contract a Free Software |
|
||||
# Service Company |
|
||||
# |
|
||||
# This program is Free Software; you can redistribute it and/or |
|
||||
# modify it under the terms of the GNU General Public License |
|
||||
# as published by the Free Software Foundation; either version 2 |
|
||||
# of the License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU General Public License |
|
||||
# along with this program; if not, write to the Free Software |
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
import time |
|
||||
|
|
||||
from lxml import etree |
|
||||
from datetime import datetime |
|
||||
from openerp.osv import fields, orm |
|
||||
from openerp.tools.translate import _ |
|
||||
|
|
||||
|
|
||||
def previous_year_date(date, nb_prev=1): |
|
||||
if not date: |
|
||||
return False |
|
||||
parsed_date = datetime.strptime(date, '%Y-%m-%d') |
|
||||
previous_date = datetime(year=parsed_date.year - nb_prev, |
|
||||
month=parsed_date.month, |
|
||||
day=parsed_date.day) |
|
||||
return previous_date |
|
||||
|
|
||||
|
|
||||
class AccountBalanceCommonWizard(orm.TransientModel): |
|
||||
|
|
||||
"""Will launch trial balance report and pass required args""" |
|
||||
|
|
||||
_inherit = "account.common.account.report" |
|
||||
_name = "account.common.balance.report" |
|
||||
_description = "Common Balance Report" |
|
||||
|
|
||||
# an update module should be done if changed |
|
||||
# in order to create fields in db |
|
||||
COMPARISON_LEVEL = 3 |
|
||||
|
|
||||
COMPARE_SELECTION = [('filter_no', 'No Comparison'), |
|
||||
('filter_year', 'Fiscal Year'), |
|
||||
('filter_date', 'Date'), |
|
||||
('filter_period', 'Periods'), |
|
||||
('filter_opening', 'Opening Only')] |
|
||||
|
|
||||
M2O_DYNAMIC_FIELDS = [f % index for f in ["comp%s_fiscalyear_id", |
|
||||
"comp%s_period_from", |
|
||||
"comp%s_period_to"] |
|
||||
for index in range(COMPARISON_LEVEL)] |
|
||||
SIMPLE_DYNAMIC_FIELDS = [f % index for f in ["comp%s_filter", |
|
||||
"comp%s_date_from", |
|
||||
"comp%s_date_to"] |
|
||||
for index in range(COMPARISON_LEVEL)] |
|
||||
DYNAMIC_FIELDS = M2O_DYNAMIC_FIELDS + SIMPLE_DYNAMIC_FIELDS |
|
||||
|
|
||||
def _get_account_ids(self, cr, uid, context=None): |
|
||||
res = False |
|
||||
if context.get('active_model', False) == 'account.account' \ |
|
||||
and context.get('active_ids', False): |
|
||||
res = context['active_ids'] |
|
||||
return res |
|
||||
|
|
||||
_columns = { |
|
||||
'account_ids': fields.many2many( |
|
||||
'account.account', string='Filter on accounts', |
|
||||
help="Only selected accounts will be printed. Leave empty to \ |
|
||||
print all accounts."), |
|
||||
'filter': fields.selection( |
|
||||
[('filter_no', 'No Filters'), |
|
||||
('filter_date', 'Date'), |
|
||||
('filter_period', 'Periods'), |
|
||||
('filter_opening', 'Opening Only')], |
|
||||
"Filter by", |
|
||||
required=True, |
|
||||
help='Filter by date: no opening balance will be displayed. ' |
|
||||
'(opening balance can only be computed based on period to be \ |
|
||||
correct).'), |
|
||||
} |
|
||||
|
|
||||
for index in range(COMPARISON_LEVEL): |
|
||||
_columns.update( |
|
||||
{"comp%s_filter" % index: |
|
||||
fields.selection( |
|
||||
COMPARE_SELECTION, string='Compare By', required=True), |
|
||||
"comp%s_fiscalyear_id" % index: |
|
||||
fields.many2one('account.fiscalyear', 'Fiscal Year'), |
|
||||
"comp%s_period_from" % index: |
|
||||
fields.many2one('account.period', 'Start Period'), |
|
||||
"comp%s_period_to" % index: |
|
||||
fields.many2one('account.period', 'End Period'), |
|
||||
"comp%s_date_from" % index: |
|
||||
fields.date("Start Date"), |
|
||||
"comp%s_date_to" % index: |
|
||||
fields.date("End Date")}) |
|
||||
|
|
||||
_defaults = { |
|
||||
'account_ids': _get_account_ids, |
|
||||
} |
|
||||
|
|
||||
def _check_fiscalyear(self, cr, uid, ids, context=None): |
|
||||
obj = self.read( |
|
||||
cr, uid, ids[0], ['fiscalyear_id', 'filter'], context=context) |
|
||||
if not obj['fiscalyear_id'] and obj['filter'] == 'filter_no': |
|
||||
return False |
|
||||
return True |
|
||||
|
|
||||
_constraints = [ |
|
||||
(_check_fiscalyear, |
|
||||
'When no Fiscal year is selected, you must choose to filter by \ |
|
||||
periods or by date.', ['filter']), |
|
||||
] |
|
||||
|
|
||||
def default_get(self, cr, uid, fields, context=None): |
|
||||
""" |
|
||||
To get default values for the object. |
|
||||
|
|
||||
@param self: The object pointer. |
|
||||
@param cr: A database cursor |
|
||||
@param uid: ID of the user currently logged in |
|
||||
@param fields: List of fields for which we want default values |
|
||||
@param context: A standard dictionary |
|
||||
|
|
||||
@return: A dictionary which of fields with values. |
|
||||
|
|
||||
""" |
|
||||
res = super(AccountBalanceCommonWizard, self).default_get( |
|
||||
cr, uid, fields, context=context) |
|
||||
for index in range(self.COMPARISON_LEVEL): |
|
||||
field = "comp%s_filter" % (index,) |
|
||||
if not res.get(field, False): |
|
||||
res[field] = 'filter_no' |
|
||||
return res |
|
||||
|
|
||||
def fields_view_get(self, cr, uid, view_id=None, view_type='form', |
|
||||
context=None, toolbar=False, submenu=False): |
|
||||
res = super(AccountBalanceCommonWizard, self).fields_view_get( |
|
||||
cr, uid, view_id, view_type, context=context, toolbar=toolbar, |
|
||||
submenu=submenu) |
|
||||
|
|
||||
res['fields'].update(self.fields_get(cr, uid, |
|
||||
allfields=self.DYNAMIC_FIELDS, |
|
||||
context=context, write_access=True)) |
|
||||
|
|
||||
eview = etree.fromstring(res['arch']) |
|
||||
placeholder = eview.xpath("//page[@name='placeholder']") |
|
||||
if placeholder: |
|
||||
placeholder = placeholder[0] |
|
||||
for index in range(self.COMPARISON_LEVEL): |
|
||||
page = etree.Element( |
|
||||
'page', |
|
||||
{'name': "comp%s" % index, |
|
||||
'string': _("Comparison %s") % (index + 1, )}) |
|
||||
group = etree.Element('group') |
|
||||
page.append(group) |
|
||||
|
|
||||
def modifiers_and_append(elem): |
|
||||
orm.setup_modifiers(elem) |
|
||||
group.append(elem) |
|
||||
|
|
||||
modifiers_and_append(etree.Element( |
|
||||
'field', |
|
||||
{'name': "comp%s_filter" % index, |
|
||||
'on_change': "onchange_comp_filter(%(index)s, filter,\ |
|
||||
comp%(index)s_filter, fiscalyear_id, date_from, date_to)" |
|
||||
% {'index': index}})) |
|
||||
modifiers_and_append(etree.Element( |
|
||||
'field', |
|
||||
{'name': "comp%s_fiscalyear_id" % index, |
|
||||
'attrs': |
|
||||
"{'required': [('comp%(index)s_filter','in',\ |
|
||||
('filter_year','filter_opening'))]," |
|
||||
" 'invisible': [('comp%(index)s_filter','not in',\ |
|
||||
('filter_year','filter_opening'))]}" % {'index': index}})) |
|
||||
|
|
||||
dates_attrs = "{'required': [('comp%(index)s_filter','=',\ |
|
||||
'filter_date')], " \ |
|
||||
" 'invisible': [('comp%(index)s_filter','!=',\ |
|
||||
'filter_date')]}" % { |
|
||||
'index': index} |
|
||||
modifiers_and_append(etree.Element( |
|
||||
'separator', |
|
||||
{'string': _('Dates'), |
|
||||
'colspan': '4', |
|
||||
'attrs': dates_attrs})) |
|
||||
modifiers_and_append(etree.Element( |
|
||||
'field', |
|
||||
{'name': "comp%s_date_from" % index, |
|
||||
'attrs': dates_attrs})) |
|
||||
modifiers_and_append(etree.Element( |
|
||||
'field', |
|
||||
{'name': "comp%s_date_to" % index, |
|
||||
'attrs': dates_attrs})) |
|
||||
|
|
||||
periods_attrs = "{'required': [('comp%(index)s_filter','=',\ |
|
||||
'filter_period')]," \ |
|
||||
" 'invisible': [('comp%(index)s_filter','!=',\ |
|
||||
'filter_period')]}" % { |
|
||||
'index': index} |
|
||||
periods_domain = "[('special', '=', False)]" |
|
||||
modifiers_and_append(etree.Element( |
|
||||
'separator', |
|
||||
{'string': _('Periods'), |
|
||||
'colspan': '4', |
|
||||
'attrs': periods_attrs})) |
|
||||
modifiers_and_append(etree.Element( |
|
||||
'field', |
|
||||
{'name': "comp%s_period_from" % index, |
|
||||
'attrs': periods_attrs, |
|
||||
'domain': periods_domain})) |
|
||||
modifiers_and_append(etree.Element( |
|
||||
'field', |
|
||||
{'name': "comp%s_period_to" % index, |
|
||||
'attrs': periods_attrs, |
|
||||
'domain': periods_domain})) |
|
||||
|
|
||||
placeholder.addprevious(page) |
|
||||
placeholder.getparent().remove(placeholder) |
|
||||
res['arch'] = etree.tostring(eview) |
|
||||
return res |
|
||||
|
|
||||
def onchange_filter(self, cr, uid, ids, filter='filter_no', |
|
||||
fiscalyear_id=False, context=None): |
|
||||
res = {} |
|
||||
if filter == 'filter_no': |
|
||||
res['value'] = {'period_from': False, |
|
||||
'period_to': False, |
|
||||
'date_from': False, |
|
||||
'date_to': False} |
|
||||
if filter == 'filter_date': |
|
||||
if fiscalyear_id: |
|
||||
fyear = self.pool.get('account.fiscalyear').browse( |
|
||||
cr, uid, fiscalyear_id, context=context) |
|
||||
date_from = fyear.date_start |
|
||||
date_to = fyear.date_stop > time.strftime( |
|
||||
'%Y-%m-%d') and time.strftime('%Y-%m-%d') \ |
|
||||
or fyear.date_stop |
|
||||
else: |
|
||||
date_from, date_to = time.strftime( |
|
||||
'%Y-01-01'), time.strftime('%Y-%m-%d') |
|
||||
res['value'] = {'period_from': False, 'period_to': |
|
||||
False, 'date_from': date_from, 'date_to': date_to} |
|
||||
if filter == 'filter_period' and fiscalyear_id: |
|
||||
start_period = end_period = False |
|
||||
cr.execute(''' |
|
||||
SELECT * FROM (SELECT p.id |
|
||||
FROM account_period p |
|
||||
LEFT JOIN account_fiscalyear f |
|
||||
ON (p.fiscalyear_id = f.id) |
|
||||
WHERE f.id = %s |
|
||||
AND COALESCE(p.special, FALSE) = FALSE |
|
||||
ORDER BY p.date_start ASC |
|
||||
LIMIT 1) AS period_start |
|
||||
UNION ALL |
|
||||
SELECT * FROM (SELECT p.id |
|
||||
FROM account_period p |
|
||||
LEFT JOIN account_fiscalyear f |
|
||||
ON (p.fiscalyear_id = f.id) |
|
||||
WHERE f.id = %s |
|
||||
AND p.date_start < NOW() |
|
||||
AND COALESCE(p.special, FALSE) = FALSE |
|
||||
ORDER BY p.date_stop DESC |
|
||||
LIMIT 1) AS period_stop''', |
|
||||
(fiscalyear_id, fiscalyear_id)) |
|
||||
periods = [i[0] for i in cr.fetchall()] |
|
||||
if periods: |
|
||||
start_period = end_period = periods[0] |
|
||||
if len(periods) > 1: |
|
||||
end_period = periods[1] |
|
||||
res['value'] = {'period_from': start_period, 'period_to': |
|
||||
end_period, 'date_from': False, 'date_to': False} |
|
||||
return res |
|
||||
|
|
||||
def onchange_comp_filter(self, cr, uid, ids, index, |
|
||||
main_filter='filter_no', comp_filter='filter_no', |
|
||||
fiscalyear_id=False, start_date=False, |
|
||||
stop_date=False, context=None): |
|
||||
res = {} |
|
||||
fy_obj = self.pool.get('account.fiscalyear') |
|
||||
last_fiscalyear_id = False |
|
||||
if fiscalyear_id: |
|
||||
fiscalyear = fy_obj.browse(cr, uid, fiscalyear_id, context=context) |
|
||||
last_fiscalyear_ids = fy_obj.search( |
|
||||
cr, uid, [('date_stop', '<', fiscalyear.date_start)], |
|
||||
limit=self.COMPARISON_LEVEL, order='date_start desc', |
|
||||
context=context) |
|
||||
if last_fiscalyear_ids: |
|
||||
if len(last_fiscalyear_ids) > index: |
|
||||
# first element for the comparison 1, second element for |
|
||||
# the comparison 2 |
|
||||
last_fiscalyear_id = last_fiscalyear_ids[index] |
|
||||
|
|
||||
fy_id_field = "comp%s_fiscalyear_id" % (index,) |
|
||||
period_from_field = "comp%s_period_from" % (index,) |
|
||||
period_to_field = "comp%s_period_to" % (index,) |
|
||||
date_from_field = "comp%s_date_from" % (index,) |
|
||||
date_to_field = "comp%s_date_to" % (index,) |
|
||||
|
|
||||
if comp_filter == 'filter_no': |
|
||||
res['value'] = { |
|
||||
fy_id_field: False, |
|
||||
period_from_field: False, |
|
||||
period_to_field: False, |
|
||||
date_from_field: False, |
|
||||
date_to_field: False |
|
||||
} |
|
||||
if comp_filter in ('filter_year', 'filter_opening'): |
|
||||
res['value'] = { |
|
||||
fy_id_field: last_fiscalyear_id, |
|
||||
period_from_field: False, |
|
||||
period_to_field: False, |
|
||||
date_from_field: False, |
|
||||
date_to_field: False |
|
||||
} |
|
||||
if comp_filter == 'filter_date': |
|
||||
dates = {} |
|
||||
if main_filter == 'filter_date': |
|
||||
dates = { |
|
||||
'date_start': previous_year_date(start_date, index + 1). |
|
||||
strftime('%Y-%m-%d'), |
|
||||
'date_stop': previous_year_date(stop_date, index + 1). |
|
||||
strftime('%Y-%m-%d'), |
|
||||
} |
|
||||
elif last_fiscalyear_id: |
|
||||
dates = fy_obj.read( |
|
||||
cr, uid, last_fiscalyear_id, ['date_start', 'date_stop'], |
|
||||
context=context) |
|
||||
|
|
||||
res['value'] = {fy_id_field: False, |
|
||||
period_from_field: False, |
|
||||
period_to_field: False, |
|
||||
date_from_field: dates.get('date_start', False), |
|
||||
date_to_field: dates.get('date_stop', False)} |
|
||||
if comp_filter == 'filter_period' and last_fiscalyear_id: |
|
||||
start_period = end_period = False |
|
||||
cr.execute(''' |
|
||||
SELECT * FROM (SELECT p.id |
|
||||
FROM account_period p |
|
||||
LEFT JOIN account_fiscalyear f |
|
||||
ON (p.fiscalyear_id = f.id) |
|
||||
WHERE f.id = %(fiscalyear)s |
|
||||
AND COALESCE(p.special, FALSE) = FALSE |
|
||||
ORDER BY p.date_start ASC |
|
||||
LIMIT 1) AS period_start |
|
||||
UNION ALL |
|
||||
SELECT * FROM (SELECT p.id |
|
||||
FROM account_period p |
|
||||
LEFT JOIN account_fiscalyear f |
|
||||
ON (p.fiscalyear_id = f.id) |
|
||||
WHERE f.id = %(fiscalyear)s |
|
||||
AND p.date_start < NOW() |
|
||||
AND COALESCE(p.special, FALSE) = FALSE |
|
||||
ORDER BY p.date_stop DESC |
|
||||
LIMIT 1) AS period_stop''', |
|
||||
{'fiscalyear': last_fiscalyear_id}) |
|
||||
periods = [i[0] for i in cr.fetchall()] |
|
||||
if periods and len(periods) > 1: |
|
||||
start_period = end_period = periods[0] |
|
||||
if len(periods) > 1: |
|
||||
end_period = periods[1] |
|
||||
res['value'] = {fy_id_field: False, |
|
||||
period_from_field: start_period, |
|
||||
period_to_field: end_period, |
|
||||
date_from_field: False, |
|
||||
date_to_field: False} |
|
||||
return res |
|
||||
|
|
||||
def pre_print_report(self, cr, uid, ids, data, context=None): |
|
||||
data = super(AccountBalanceCommonWizard, self).pre_print_report( |
|
||||
cr, uid, ids, data, context) |
|
||||
if context is None: |
|
||||
context = {} |
|
||||
|
|
||||
# will be used to attach the report on the main account |
|
||||
data['ids'] = [data['form']['chart_account_id']] |
|
||||
|
|
||||
fields_to_read = ['account_ids', ] |
|
||||
fields_to_read += self.DYNAMIC_FIELDS |
|
||||
vals = self.read(cr, uid, ids, fields_to_read, context=context)[0] |
|
||||
|
|
||||
# extract the id from the m2o tuple (id, name) |
|
||||
for field in self.M2O_DYNAMIC_FIELDS: |
|
||||
if isinstance(vals[field], tuple): |
|
||||
vals[field] = vals[field][0] |
|
||||
|
|
||||
vals['max_comparison'] = self.COMPARISON_LEVEL |
|
||||
data['form'].update(vals) |
|
||||
return data |
|
@ -1,11 +0,0 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||
<openerp> |
|
||||
<data> |
|
||||
|
|
||||
<!-- inheriting views from more than 2 differents inherited models like |
|
||||
trial.balance.webkit -> account.common.balance.report -> account.common.account.report |
|
||||
is not supported so we have to copy paste the same view for trial balance, balance sheet |
|
||||
--> |
|
||||
|
|
||||
</data> |
|
||||
</openerp> |
|
@ -1,156 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Author: Nicolas Bessi, Guewen Baconnier |
|
||||
# Copyright Camptocamp SA 2011 |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
import time |
|
||||
|
|
||||
from openerp.osv import fields, orm |
|
||||
|
|
||||
|
|
||||
class AccountReportGeneralLedgerWizard(orm.TransientModel): |
|
||||
|
|
||||
"""Will launch general ledger report and pass required args""" |
|
||||
|
|
||||
_inherit = "account.common.account.report" |
|
||||
_name = "general.ledger.webkit" |
|
||||
_description = "General Ledger Report" |
|
||||
|
|
||||
def _get_account_ids(self, cr, uid, context=None): |
|
||||
res = False |
|
||||
if context.get('active_model', False) == 'account.account' \ |
|
||||
and context.get('active_ids', False): |
|
||||
res = context['active_ids'] |
|
||||
return res |
|
||||
|
|
||||
_columns = { |
|
||||
'amount_currency': fields.boolean("With Currency", |
|
||||
help="It adds the currency column"), |
|
||||
|
|
||||
'display_account': fields.selection( |
|
||||
[('bal_all', 'All'), |
|
||||
('bal_mix', 'With transactions or non zero balance')], |
|
||||
'Display accounts', |
|
||||
required=True), |
|
||||
'account_ids': fields.many2many( |
|
||||
'account.account', string='Filter on accounts', |
|
||||
help="""Only selected accounts will be printed. Leave empty to |
|
||||
print all accounts."""), |
|
||||
'centralize': fields.boolean( |
|
||||
'Activate Centralization', |
|
||||
help='Uncheck to display all the details of centralized accounts.') |
|
||||
} |
|
||||
_defaults = { |
|
||||
'amount_currency': False, |
|
||||
'display_account': 'bal_mix', |
|
||||
'account_ids': _get_account_ids, |
|
||||
'centralize': True, |
|
||||
} |
|
||||
|
|
||||
def _check_fiscalyear(self, cr, uid, ids, context=None): |
|
||||
obj = self.read( |
|
||||
cr, uid, ids[0], ['fiscalyear_id', 'filter'], context=context) |
|
||||
if not obj['fiscalyear_id'] and obj['filter'] == 'filter_no': |
|
||||
return False |
|
||||
return True |
|
||||
|
|
||||
_constraints = [ |
|
||||
(_check_fiscalyear, |
|
||||
'When no Fiscal year is selected, you must choose to filter by \ |
|
||||
periods or by date.', ['filter']), |
|
||||
] |
|
||||
|
|
||||
def pre_print_report(self, cr, uid, ids, data, context=None): |
|
||||
data = super(AccountReportGeneralLedgerWizard, self).pre_print_report( |
|
||||
cr, uid, ids, data, context) |
|
||||
# will be used to attach the report on the main account |
|
||||
data['ids'] = [data['form']['chart_account_id']] |
|
||||
vals = self.read(cr, uid, ids, |
|
||||
['amount_currency', |
|
||||
'display_account', |
|
||||
'account_ids', |
|
||||
'centralize'], |
|
||||
context=context)[0] |
|
||||
data['form'].update(vals) |
|
||||
return data |
|
||||
|
|
||||
def onchange_filter(self, cr, uid, ids, filter='filter_no', |
|
||||
fiscalyear_id=False, context=None): |
|
||||
res = {} |
|
||||
if filter == 'filter_no': |
|
||||
res['value'] = { |
|
||||
'period_from': False, |
|
||||
'period_to': False, |
|
||||
'date_from': False, |
|
||||
'date_to': False, |
|
||||
} |
|
||||
if filter == 'filter_date': |
|
||||
if fiscalyear_id: |
|
||||
fyear = self.pool.get('account.fiscalyear').browse( |
|
||||
cr, uid, fiscalyear_id, context=context) |
|
||||
date_from = fyear.date_start |
|
||||
date_to = fyear.date_stop > time.strftime( |
|
||||
'%Y-%m-%d') and time.strftime('%Y-%m-%d') \ |
|
||||
or fyear.date_stop |
|
||||
else: |
|
||||
date_from, date_to = time.strftime( |
|
||||
'%Y-01-01'), time.strftime('%Y-%m-%d') |
|
||||
res['value'] = { |
|
||||
'period_from': False, |
|
||||
'period_to': False, |
|
||||
'date_from': date_from, |
|
||||
'date_to': date_to |
|
||||
} |
|
||||
if filter == 'filter_period' and fiscalyear_id: |
|
||||
start_period = end_period = False |
|
||||
cr.execute(''' |
|
||||
SELECT * FROM (SELECT p.id |
|
||||
FROM account_period p |
|
||||
LEFT JOIN account_fiscalyear f |
|
||||
ON (p.fiscalyear_id = f.id) |
|
||||
WHERE f.id = %s |
|
||||
AND COALESCE(p.special, FALSE) = FALSE |
|
||||
ORDER BY p.date_start ASC |
|
||||
LIMIT 1) AS period_start |
|
||||
UNION ALL |
|
||||
SELECT * FROM (SELECT p.id |
|
||||
FROM account_period p |
|
||||
LEFT JOIN account_fiscalyear f |
|
||||
ON (p.fiscalyear_id = f.id) |
|
||||
WHERE f.id = %s |
|
||||
AND p.date_start < NOW() |
|
||||
AND COALESCE(p.special, FALSE) = FALSE |
|
||||
ORDER BY p.date_stop DESC |
|
||||
LIMIT 1) AS period_stop''', |
|
||||
(fiscalyear_id, fiscalyear_id)) |
|
||||
periods = [i[0] for i in cr.fetchall()] |
|
||||
if periods: |
|
||||
start_period = end_period = periods[0] |
|
||||
if len(periods) > 1: |
|
||||
end_period = periods[1] |
|
||||
res['value'] = {'period_from': start_period, 'period_to': |
|
||||
end_period, 'date_from': False, 'date_to': False} |
|
||||
return res |
|
||||
|
|
||||
def _print_report(self, cursor, uid, ids, data, context=None): |
|
||||
# we update form with display account value |
|
||||
data = self.pre_print_report(cursor, uid, ids, data, context=context) |
|
||||
return {'type': 'ir.actions.report.xml', |
|
||||
'report_name': 'account.account_report_general_ledger_webkit', |
|
||||
'datas': data} |
|
@ -1,88 +0,0 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||
<openerp> |
|
||||
<data> |
|
||||
|
|
||||
<record id="account_report_general_ledger_view_webkit" model="ir.ui.view"> |
|
||||
<field name="name">General Ledger</field> |
|
||||
<field name="model">general.ledger.webkit</field> |
|
||||
<field name="inherit_id" ref="account.account_common_report_view"/> |
|
||||
<field name="arch" type="xml"> |
|
||||
<data> |
|
||||
<xpath expr="/form/label[@string='']" position="replace"> |
|
||||
<separator string="General Ledger" colspan="4"/> |
|
||||
<label nolabel="1" colspan="4" string="This report allows you to print or generate a pdf of your general ledger with details of all your account journals"/> |
|
||||
</xpath> |
|
||||
<field name="chart_account_id" position='attributes'> |
|
||||
<attribute name="colspan">4</attribute> |
|
||||
</field> |
|
||||
<form position="inside"> |
|
||||
<field name="display_account" invisible="True"/> |
|
||||
</form> |
|
||||
<page name="filters" position="after"> |
|
||||
<page string="Accounts Filters" name="accounts"> |
|
||||
<separator string="Print only" colspan="4"/> |
|
||||
<field name="account_ids" colspan="4" nolabel="1"> |
|
||||
<tree> |
|
||||
<field name="code"/> |
|
||||
<field name="name"/> |
|
||||
<field name="type"/> |
|
||||
<field name="company_id"/> |
|
||||
</tree> |
|
||||
</field> |
|
||||
</page> |
|
||||
<page string="Layout Options" name="layout_options"> |
|
||||
<group colspan="4" col="2"> |
|
||||
<field name="amount_currency"/> |
|
||||
<field name="centralize"/> |
|
||||
</group> |
|
||||
</page> |
|
||||
</page> |
|
||||
<page name="journal_ids" position="attributes"> |
|
||||
<attribute name="invisible">True</attribute> |
|
||||
</page> |
|
||||
<page name="filters" position="attributes"> |
|
||||
<attribute name="string">Time Filters</attribute> |
|
||||
</page> |
|
||||
<field name="period_from" position="attributes"> |
|
||||
<attribute name="domain">[('fiscalyear_id', '=', fiscalyear_id), ('special', '=', False)]</attribute> |
|
||||
</field> |
|
||||
<field name="period_to" position="attributes"> |
|
||||
<attribute name="domain">[('fiscalyear_id', '=', fiscalyear_id), ('special', '=', False)]</attribute> |
|
||||
</field> |
|
||||
</data> |
|
||||
</field> |
|
||||
</record> |
|
||||
|
|
||||
<record id="account_report_general_ledger_view_inherit" model="ir.ui.view"> |
|
||||
<field name="name">General Ledger</field> |
|
||||
<field name="model">general.ledger.webkit</field> |
|
||||
<field name="inherit_id" ref="account.account_report_general_ledger_view"/> |
|
||||
<field name="arch" type="xml"> |
|
||||
<field name="fiscalyear_id" position="replace"> |
|
||||
<field name="fiscalyear_id" on_change="onchange_fiscalyear(fiscalyear_id)"/> |
|
||||
</field> |
|
||||
</field> |
|
||||
</record> |
|
||||
|
|
||||
<record id="action_account_general_ledger_menu_webkit" model="ir.actions.act_window"> |
|
||||
<field name="name">General Ledger</field> |
|
||||
<field name="type">ir.actions.act_window</field> |
|
||||
<field name="res_model">general.ledger.webkit</field> |
|
||||
<field name="view_type">form</field> |
|
||||
<field name="view_mode">form</field> |
|
||||
<field name="view_id" ref="account_report_general_ledger_view_webkit"/> |
|
||||
<field name="target">new</field> |
|
||||
</record> |
|
||||
|
|
||||
<record model="ir.values" id="action_account_general_ledger_values_webkit"> |
|
||||
<field name="model_id" ref="account.model_account_account"/> |
|
||||
<field name="name">General Ledger</field> |
|
||||
<field name="key2">client_print_multi</field> |
|
||||
<field name="value" |
|
||||
eval="'ir.actions.act_window,' +str(ref('action_account_general_ledger_menu_webkit'))"/> |
|
||||
<field name="key">action</field> |
|
||||
<field name="model">account.account</field> |
|
||||
</record> |
|
||||
|
|
||||
</data> |
|
||||
</openerp> |
|
@ -1,148 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Author: Guewen Baconnier |
|
||||
# Copyright Camptocamp SA 2012 |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
from openerp.osv import fields, orm |
|
||||
|
|
||||
|
|
||||
class AccountReportOpenInvoicesWizard(orm.TransientModel): |
|
||||
|
|
||||
"""Will launch partner ledger report and pass required args""" |
|
||||
|
|
||||
_inherit = "partners.ledger.webkit" |
|
||||
_name = "open.invoices.webkit" |
|
||||
_description = "Open Invoices Report" |
|
||||
|
|
||||
_columns = { |
|
||||
'group_by_currency': fields.boolean('Group Partner by currency'), |
|
||||
'until_date': fields.date( |
|
||||
"Clearance date", |
|
||||
required=True, |
|
||||
help="""The clearance date is essentially a tool used for debtors |
|
||||
provisionning calculation. |
|
||||
|
|
||||
By default, this date is equal to the the end date (ie: 31/12/2011 if you |
|
||||
select fy 2011). |
|
||||
|
|
||||
By amending the clearance date, you will be, for instance, able to answer the |
|
||||
question : 'based on my last year end debtors open invoices, which invoices |
|
||||
are still unpaid today (today is my clearance date)?' |
|
||||
""")} |
|
||||
|
|
||||
def _check_until_date(self, cr, uid, ids, context=None): |
|
||||
def get_key_id(obj, field): |
|
||||
return obj.get(field) and obj[field][0] or False |
|
||||
|
|
||||
obj = self.read(cr, uid, ids[0], [ |
|
||||
'fiscalyear_id', 'period_to', 'date_to', 'until_date'], |
|
||||
context=context) |
|
||||
min_date = self.default_until_date(cr, uid, ids, |
|
||||
get_key_id(obj, 'fiscalyear_id'), |
|
||||
get_key_id(obj, 'period_to'), |
|
||||
obj['date_to'], |
|
||||
context=context) |
|
||||
if min_date and obj['until_date'] < min_date: |
|
||||
return False |
|
||||
return True |
|
||||
|
|
||||
_constraints = [ |
|
||||
(_check_until_date, 'Clearance date must be the very last date of the \ |
|
||||
last period or later.', ['until_date']), |
|
||||
] |
|
||||
|
|
||||
def default_until_date(self, cr, uid, ids, fiscalyear_id=False, |
|
||||
period_id=False, date_to=False, context=None): |
|
||||
res_date = False |
|
||||
# first priority: period or date filters |
|
||||
if period_id: |
|
||||
res_date = self.pool.get('account.period').read( |
|
||||
cr, uid, period_id, ['date_stop'], |
|
||||
context=context)['date_stop'] |
|
||||
elif date_to: |
|
||||
res_date = date_to |
|
||||
elif fiscalyear_id: |
|
||||
res_date = self.pool.get('account.fiscalyear').read( |
|
||||
cr, uid, fiscalyear_id, ['date_stop'], |
|
||||
context=context)['date_stop'] |
|
||||
return res_date |
|
||||
|
|
||||
def onchange_fiscalyear(self, cr, uid, ids, fiscalyear=False, |
|
||||
period_id=False, date_to=False, until_date=False, |
|
||||
context=None): |
|
||||
res = {'value': {}} |
|
||||
res['value']['until_date'] = self.default_until_date( |
|
||||
cr, uid, ids, |
|
||||
fiscalyear_id=fiscalyear, |
|
||||
period_id=period_id, |
|
||||
date_to=date_to, |
|
||||
context=context) |
|
||||
return res |
|
||||
|
|
||||
def onchange_date_to(self, cr, uid, ids, fiscalyear=False, period_id=False, |
|
||||
date_to=False, until_date=False, context=None): |
|
||||
res = {'value': {}} |
|
||||
res['value']['until_date'] = self.default_until_date( |
|
||||
cr, uid, ids, |
|
||||
fiscalyear_id=fiscalyear, |
|
||||
period_id=period_id, |
|
||||
date_to=date_to, |
|
||||
context=context) |
|
||||
return res |
|
||||
|
|
||||
def onchange_period_to(self, cr, uid, ids, fiscalyear=False, |
|
||||
period_id=False, date_to=False, until_date=False, |
|
||||
context=None): |
|
||||
res = {'value': {}} |
|
||||
res['value']['until_date'] = self.default_until_date( |
|
||||
cr, uid, ids, |
|
||||
fiscalyear_id=fiscalyear, |
|
||||
period_id=period_id, |
|
||||
date_to=date_to, |
|
||||
context=context) |
|
||||
return res |
|
||||
|
|
||||
def onchange_filter(self, cr, uid, ids, filter='filter_no', |
|
||||
fiscalyear_id=False, context=None): |
|
||||
res = super(AccountReportOpenInvoicesWizard, self).onchange_filter( |
|
||||
cr, uid, ids, filter=filter, fiscalyear_id=fiscalyear_id, |
|
||||
context=context) |
|
||||
if res.get('value', False): |
|
||||
res['value']['until_date'] = self.default_until_date( |
|
||||
cr, uid, ids, |
|
||||
fiscalyear_id=fiscalyear_id, |
|
||||
period_id=res['value'].get('period_to', False), |
|
||||
date_to=res['value'].get('date_to', False), |
|
||||
context=context) |
|
||||
return res |
|
||||
|
|
||||
def pre_print_report(self, cr, uid, ids, data, context=None): |
|
||||
data = super(AccountReportOpenInvoicesWizard, self).pre_print_report( |
|
||||
cr, uid, ids, data, context) |
|
||||
vals = self.read(cr, uid, ids, |
|
||||
['until_date', 'group_by_currency'], |
|
||||
context=context)[0] |
|
||||
data['form'].update(vals) |
|
||||
return data |
|
||||
|
|
||||
def _print_report(self, cr, uid, ids, data, context=None): |
|
||||
# we update form with display account value |
|
||||
data = self.pre_print_report(cr, uid, ids, data, context=context) |
|
||||
return {'type': 'ir.actions.report.xml', |
|
||||
'report_name': 'account.account_report_open_invoices_webkit', |
|
||||
'datas': data} |
|
@ -1,75 +0,0 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||
<openerp> |
|
||||
<data> |
|
||||
|
|
||||
<record id="account_open_invoices_view_webkit" model="ir.ui.view"> |
|
||||
<field name="name">Open Invoices Report</field> |
|
||||
<field name="model">open.invoices.webkit</field> |
|
||||
<field name="inherit_id" ref="account.account_common_report_view"/> |
|
||||
<field name="arch" type="xml"> |
|
||||
<data> |
|
||||
<xpath expr="/form/label[@string='']" position="replace"> |
|
||||
<separator string="Open Invoices" colspan="4"/> |
|
||||
<label nolabel="1" colspan="4" string="This report allows you to print or generate a pdf of your open invoices per partner with details of all your payable/receivable account. Exclude full reconciled journal items."/> |
|
||||
</xpath> |
|
||||
<field name="chart_account_id" position='attributes'> |
|
||||
<attribute name="colspan">4</attribute> |
|
||||
</field> |
|
||||
<xpath expr="//field[@name='target_move']" position="after"> |
|
||||
<newline/> |
|
||||
<field name="result_selection" colspan="4"/> |
|
||||
</xpath> |
|
||||
<xpath expr="/form/notebook[1]" position="after"> |
|
||||
<separator string="Clearance Analysis Options" colspan="4"/> |
|
||||
<newline/> |
|
||||
<field name="until_date"/> |
|
||||
</xpath> |
|
||||
<page name="filters" position="after"> |
|
||||
<page string="Partners Filters" name="partners"> |
|
||||
<separator string="Print only" colspan="4"/> |
|
||||
<field name="partner_ids" colspan="4" nolabel="1"/> |
|
||||
</page> |
|
||||
<page string="Layout Options" name="layout_options"> |
|
||||
<group> |
|
||||
<field name="amount_currency"/> |
|
||||
<field name="group_by_currency"/> |
|
||||
</group> |
|
||||
</page> |
|
||||
</page> |
|
||||
<page name="filters" position="attributes"> |
|
||||
<attribute name="string">Time Filters</attribute> |
|
||||
</page> |
|
||||
<page name="journal_ids" position="attributes"> |
|
||||
<attribute name="invisible">True</attribute> |
|
||||
</page> |
|
||||
<field name="fiscalyear_id" position="attributes"> |
|
||||
<attribute name="on_change">onchange_fiscalyear(fiscalyear_id, period_to, date_to, until_date)</attribute> |
|
||||
</field> |
|
||||
<field name="date_to" position="attributes"> |
|
||||
<attribute name="on_change">onchange_date_to(fiscalyear_id, period_to, date_to, until_date)</attribute> |
|
||||
</field> |
|
||||
<field name="period_to" position="attributes"> |
|
||||
<attribute name="on_change">onchange_period_to(fiscalyear_id, period_to, date_to, until_date)</attribute> |
|
||||
</field> |
|
||||
<field name="period_from" position="attributes"> |
|
||||
<attribute name="domain">[('fiscalyear_id', '=', fiscalyear_id), ('special', '=', False)]</attribute> |
|
||||
</field> |
|
||||
<field name="period_to" position="attributes"> |
|
||||
<attribute name="domain">[('fiscalyear_id', '=', fiscalyear_id), ('special', '=', False)]</attribute> |
|
||||
</field> |
|
||||
</data> |
|
||||
</field> |
|
||||
</record> |
|
||||
|
|
||||
<record id="action_account_open_invoices_menu_webkit" model="ir.actions.act_window"> |
|
||||
<field name="name">Open Invoices Report</field> |
|
||||
<field name="type">ir.actions.act_window</field> |
|
||||
<field name="res_model">open.invoices.webkit</field> |
|
||||
<field name="view_type">form</field> |
|
||||
<field name="view_mode">form</field> |
|
||||
<field name="view_id" ref="account_open_invoices_view_webkit"/> |
|
||||
<field name="target">new</field> |
|
||||
</record> |
|
||||
|
|
||||
</data> |
|
||||
</openerp> |
|
@ -1,64 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Author: Guewen Baconnier |
|
||||
# Copyright Camptocamp SA 2011 |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
from openerp.osv import fields, orm |
|
||||
|
|
||||
|
|
||||
class AccountPartnerBalanceWizard(orm.TransientModel): |
|
||||
|
|
||||
"""Will launch partner balance report and pass required args""" |
|
||||
|
|
||||
_inherit = "account.common.balance.report" |
|
||||
_name = "partner.balance.webkit" |
|
||||
_description = "Partner Balance Report" |
|
||||
|
|
||||
_columns = { |
|
||||
'result_selection': fields.selection( |
|
||||
[('customer', 'Receivable Accounts'), |
|
||||
('supplier', 'Payable Accounts'), |
|
||||
('customer_supplier', 'Receivable and Payable Accounts')], |
|
||||
"Partner's", required=True), |
|
||||
'partner_ids': fields.many2many( |
|
||||
'res.partner', string='Filter on partner', |
|
||||
help="Only selected partners will be printed. \ |
|
||||
Leave empty to print all partners."), |
|
||||
} |
|
||||
|
|
||||
_defaults = { |
|
||||
'result_selection': 'customer_supplier', |
|
||||
} |
|
||||
|
|
||||
def pre_print_report(self, cr, uid, ids, data, context=None): |
|
||||
data = super(AccountPartnerBalanceWizard, self).\ |
|
||||
pre_print_report(cr, uid, ids, data, context) |
|
||||
vals = self.read(cr, uid, ids, |
|
||||
['result_selection', 'partner_ids'], |
|
||||
context=context)[0] |
|
||||
data['form'].update(vals) |
|
||||
return data |
|
||||
|
|
||||
def _print_report(self, cursor, uid, ids, data, context=None): |
|
||||
# we update form with display account value |
|
||||
data = self.pre_print_report(cursor, uid, ids, data, context=context) |
|
||||
|
|
||||
return {'type': 'ir.actions.report.xml', |
|
||||
'report_name': 'account.account_report_partner_balance_webkit', |
|
||||
'datas': data} |
|
@ -1,84 +0,0 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||
<openerp> |
|
||||
<data> |
|
||||
|
|
||||
<!-- inheriting views from more than 2 differents inherited models like |
|
||||
partner.balance.webkit -> account.common.balance.report -> account.common.account.report |
|
||||
is not supported so we have to copy paste the same view for partner balance, balance sheet |
|
||||
--> |
|
||||
<record id="account_partner_balance_view_webkit" model="ir.ui.view"> |
|
||||
<field name="name">Partner Balance</field> |
|
||||
<field name="model">partner.balance.webkit</field> |
|
||||
<field name="inherit_id" ref="account.account_common_report_view"/> |
|
||||
<field name="arch" type="xml"> |
|
||||
<data> |
|
||||
<xpath expr="/form/label[@string='']" position="replace"> |
|
||||
<separator string="Partner Balance" colspan="4"/> |
|
||||
<label nolabel="1" colspan="4" string="This report is an analysis done by a partner, It is a PDF report containing one line per partner representing the cumulative credit balance"/> |
|
||||
</xpath> |
|
||||
<field name="chart_account_id" position='attributes'> |
|
||||
<attribute name="colspan">4</attribute> |
|
||||
</field> |
|
||||
<field name="target_move" position="after"> |
|
||||
<newline/> |
|
||||
<field name="result_selection" colspan="4"/> |
|
||||
</field> |
|
||||
<page name="filters" position="after"> |
|
||||
<page string="Accounts Filters" name="accounts"> |
|
||||
<separator string="Print only" colspan="4"/> |
|
||||
<field name="account_ids" colspan="4" nolabel="1" domain="[('type', 'in', ['receivable', 'payable'])]"> |
|
||||
<tree> |
|
||||
<field name="code"/> |
|
||||
<field name="name"/> |
|
||||
<field name="type"/> |
|
||||
<field name="company_id"/> |
|
||||
</tree> |
|
||||
</field> |
|
||||
</page> |
|
||||
<page string="Partners Filters" name="accounts"> |
|
||||
<separator string="Print only" colspan="4"/> |
|
||||
<field name="partner_ids" colspan="4" nolabel="1"/> |
|
||||
</page> |
|
||||
<page name="placeholder"/> |
|
||||
</page> |
|
||||
<page name="journal_ids" position="attributes"> |
|
||||
<attribute name="invisible">True</attribute> |
|
||||
</page> |
|
||||
<page name="filters" position="attributes"> |
|
||||
<attribute name="string">Time Filters</attribute> |
|
||||
</page> |
|
||||
<field name="period_from" position="attributes"> |
|
||||
<attribute name="domain">[('fiscalyear_id', '=', fiscalyear_id), ('special', '=', False)]</attribute> |
|
||||
</field> |
|
||||
<field name="period_to" position="attributes"> |
|
||||
<attribute name="domain">[('fiscalyear_id', '=', fiscalyear_id), ('special', '=', False)]</attribute> |
|
||||
</field> |
|
||||
<field name="fiscalyear_id" position="attributes"> |
|
||||
<attribute name="attrs">{'required': [('filter', '=', 'filter_opening')]}</attribute> |
|
||||
</field> |
|
||||
</data> |
|
||||
</field> |
|
||||
</record> |
|
||||
|
|
||||
<record id="action_account_partner_balance_menu_webkit" model="ir.actions.act_window"> |
|
||||
<field name="name">Partner Balance</field> |
|
||||
<field name="type">ir.actions.act_window</field> |
|
||||
<field name="res_model">partner.balance.webkit</field> |
|
||||
<field name="view_type">form</field> |
|
||||
<field name="view_mode">form</field> |
|
||||
<field name="view_id" ref="account_partner_balance_view_webkit"/> |
|
||||
<field name="target">new</field> |
|
||||
</record> |
|
||||
|
|
||||
<record model="ir.values" id="action_account_partner_balance_values_webkit"> |
|
||||
<field name="model_id" ref="account.model_account_account"/> |
|
||||
<field name="name">Partner Balance</field> |
|
||||
<field name="key2">client_print_multi</field> |
|
||||
<field name="value" |
|
||||
eval="'ir.actions.act_window,' +str(ref('action_account_partner_balance_menu_webkit'))"/> |
|
||||
<field name="key">action</field> |
|
||||
<field name="model">account.account</field> |
|
||||
</record> |
|
||||
|
|
||||
</data> |
|
||||
</openerp> |
|
@ -1,140 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Author: Nicolas Bessi, Guewen Baconnier |
|
||||
# Copyright Camptocamp SA 2011 |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
import time |
|
||||
|
|
||||
from openerp.osv import fields, orm |
|
||||
|
|
||||
|
|
||||
class AccountReportPartnersLedgerWizard(orm.TransientModel): |
|
||||
|
|
||||
"""Will launch partner ledger report and pass required args""" |
|
||||
|
|
||||
_inherit = "account.common.partner.report" |
|
||||
_name = "partners.ledger.webkit" |
|
||||
_description = "Partner Ledger Report" |
|
||||
|
|
||||
_columns = { |
|
||||
'amount_currency': fields.boolean("With Currency", |
|
||||
help="It adds the currency column"), |
|
||||
'partner_ids': fields.many2many( |
|
||||
'res.partner', |
|
||||
string='Filter on partner', |
|
||||
help="Only selected partners will be printed. " |
|
||||
"Leave empty to print all partners."), |
|
||||
'filter': fields.selection( |
|
||||
[('filter_no', 'No Filters'), |
|
||||
('filter_date', 'Date'), |
|
||||
('filter_period', 'Periods')], "Filter by", required=True, |
|
||||
help='Filter by date: no opening balance will be displayed. ' |
|
||||
'(opening balance can only be computed based on period to be \ |
|
||||
correct).'), |
|
||||
} |
|
||||
_defaults = { |
|
||||
'amount_currency': False, |
|
||||
'result_selection': 'customer_supplier', |
|
||||
} |
|
||||
|
|
||||
def _check_fiscalyear(self, cr, uid, ids, context=None): |
|
||||
obj = self.read( |
|
||||
cr, uid, ids[0], ['fiscalyear_id', 'filter'], context=context) |
|
||||
if not obj['fiscalyear_id'] and obj['filter'] == 'filter_no': |
|
||||
return False |
|
||||
return True |
|
||||
|
|
||||
_constraints = [ |
|
||||
(_check_fiscalyear, |
|
||||
'When no Fiscal year is selected, you must choose to ' |
|
||||
'filter by periods or by date.', |
|
||||
['filter']), |
|
||||
] |
|
||||
|
|
||||
def onchange_filter(self, cr, uid, ids, filter='filter_no', |
|
||||
fiscalyear_id=False, context=None): |
|
||||
res = {} |
|
||||
if filter == 'filter_no': |
|
||||
res['value'] = {'period_from': False, |
|
||||
'period_to': False, |
|
||||
'date_from': False, |
|
||||
'date_to': False} |
|
||||
|
|
||||
if filter == 'filter_date': |
|
||||
if fiscalyear_id: |
|
||||
fyear = self.pool.get('account.fiscalyear').browse( |
|
||||
cr, uid, fiscalyear_id, context=context) |
|
||||
date_from = fyear.date_start |
|
||||
date_to = fyear.date_stop > time.strftime( |
|
||||
'%Y-%m-%d') and time.strftime('%Y-%m-%d') \ |
|
||||
or fyear.date_stop |
|
||||
else: |
|
||||
date_from, date_to = time.strftime( |
|
||||
'%Y-01-01'), time.strftime('%Y-%m-%d') |
|
||||
res['value'] = {'period_from': False, 'period_to': |
|
||||
False, 'date_from': date_from, 'date_to': date_to} |
|
||||
if filter == 'filter_period' and fiscalyear_id: |
|
||||
start_period = end_period = False |
|
||||
cr.execute(''' |
|
||||
SELECT * FROM (SELECT p.id |
|
||||
FROM account_period p |
|
||||
LEFT JOIN account_fiscalyear f |
|
||||
ON (p.fiscalyear_id = f.id) |
|
||||
WHERE f.id = %s |
|
||||
AND COALESCE(p.special, FALSE) = FALSE |
|
||||
ORDER BY p.date_start ASC |
|
||||
LIMIT 1) AS period_start |
|
||||
UNION ALL |
|
||||
SELECT * FROM (SELECT p.id |
|
||||
FROM account_period p |
|
||||
LEFT JOIN account_fiscalyear f |
|
||||
ON (p.fiscalyear_id = f.id) |
|
||||
WHERE f.id = %s |
|
||||
AND p.date_start < NOW() |
|
||||
AND COALESCE(p.special, FALSE) = FALSE |
|
||||
ORDER BY p.date_stop DESC |
|
||||
LIMIT 1) AS period_stop''', |
|
||||
(fiscalyear_id, fiscalyear_id)) |
|
||||
periods = [i[0] for i in cr.fetchall()] |
|
||||
if periods: |
|
||||
start_period = end_period = periods[0] |
|
||||
if len(periods) > 1: |
|
||||
end_period = periods[1] |
|
||||
res['value'] = {'period_from': start_period, 'period_to': |
|
||||
end_period, 'date_from': False, 'date_to': False} |
|
||||
return res |
|
||||
|
|
||||
def pre_print_report(self, cr, uid, ids, data, context=None): |
|
||||
data = super(AccountReportPartnersLedgerWizard, self).pre_print_report( |
|
||||
cr, uid, ids, data, context) |
|
||||
if context is None: |
|
||||
context = {} |
|
||||
# will be used to attach the report on the main account |
|
||||
data['ids'] = [data['form']['chart_account_id']] |
|
||||
vals = self.read(cr, uid, ids, |
|
||||
['amount_currency', 'partner_ids'], |
|
||||
context=context)[0] |
|
||||
data['form'].update(vals) |
|
||||
return data |
|
||||
|
|
||||
def _print_report(self, cursor, uid, ids, data, context=None): |
|
||||
# we update form with display account value |
|
||||
data = self.pre_print_report(cursor, uid, ids, data, context=context) |
|
||||
return {'type': 'ir.actions.report.xml', |
|
||||
'report_name': 'account.account_report_partners_ledger_webkit', |
|
||||
'datas': data} |
|
@ -1,70 +0,0 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||
<openerp> |
|
||||
<data> |
|
||||
|
|
||||
<record id="account_partner_ledger_view_webkit" model="ir.ui.view"> |
|
||||
<field name="name">Partner Ledger</field> |
|
||||
<field name="model">partners.ledger.webkit</field> |
|
||||
<field name="inherit_id" ref="account.account_common_report_view"/> |
|
||||
<field name="arch" type="xml"> |
|
||||
<data> |
|
||||
<xpath expr="/form/label[@string='']" position="replace"> |
|
||||
<separator string="Partner Ledger" colspan="4"/> |
|
||||
<label nolabel="1" colspan="4" string="This report allows you to print or generate a pdf of your partner ledger with details of all your payable/receivable account"/> |
|
||||
</xpath> |
|
||||
<field name="chart_account_id" position='attributes'> |
|
||||
<attribute name="colspan">4</attribute> |
|
||||
</field> |
|
||||
<xpath expr="//field[@name='target_move']" position="after"> |
|
||||
<newline/> |
|
||||
<field name="result_selection" colspan="4"/> |
|
||||
</xpath> |
|
||||
<page name="filters" position="after"> |
|
||||
<page string="Partners Filters" name="partners"> |
|
||||
<separator string="Print only" colspan="4"/> |
|
||||
<field name="partner_ids" colspan="4" nolabel="1"/> |
|
||||
</page> |
|
||||
<page string="Layout Options" name="layout_options"> |
|
||||
<group colspan="4" col="2"> |
|
||||
<field name="amount_currency"/> |
|
||||
</group> |
|
||||
</page> |
|
||||
</page> |
|
||||
<page name="filters" position="attributes"> |
|
||||
<attribute name="string">Time Filters</attribute> |
|
||||
</page> |
|
||||
<page name="journal_ids" position="attributes"> |
|
||||
<attribute name="invisible">True</attribute> |
|
||||
</page> |
|
||||
<field name="period_from" position="attributes"> |
|
||||
<attribute name="domain">[('fiscalyear_id', '=', fiscalyear_id), ('special', '=', False)]</attribute> |
|
||||
</field> |
|
||||
<field name="period_to" position="attributes"> |
|
||||
<attribute name="domain">[('fiscalyear_id', '=', fiscalyear_id), ('special', '=', False)]</attribute> |
|
||||
</field> |
|
||||
</data> |
|
||||
</field> |
|
||||
</record> |
|
||||
|
|
||||
<record id="action_account_partners_ledger_menu_webkit" model="ir.actions.act_window"> |
|
||||
<field name="name">Partner Ledger</field> |
|
||||
<field name="type">ir.actions.act_window</field> |
|
||||
<field name="res_model">partners.ledger.webkit</field> |
|
||||
<field name="view_type">form</field> |
|
||||
<field name="view_mode">form</field> |
|
||||
<field name="view_id" ref="account_partner_ledger_view_webkit"/> |
|
||||
<field name="target">new</field> |
|
||||
</record> |
|
||||
|
|
||||
<record model="ir.values" id="action_account_partners_ledger_values_webkit"> |
|
||||
<field name="model_id" ref="account.model_account_account"/> |
|
||||
<field name="name">Partner Ledger</field> |
|
||||
<field name="key2">client_print_multi</field> |
|
||||
<field name="value" |
|
||||
eval="'ir.actions.act_window,' +str(ref('action_account_partners_ledger_menu_webkit'))"/> |
|
||||
<field name="key">action</field> |
|
||||
<field name="model">account.account</field> |
|
||||
</record> |
|
||||
|
|
||||
</data> |
|
||||
</openerp> |
|
@ -1,131 +0,0 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# account_financial_report_webkit module for OpenERP |
|
||||
# Copyright (C) 2012 SYLEAM Info Services (<http://www.syleam.fr/>) |
|
||||
# Sebastien LANGE <sebastien.lange@syleam.fr> |
|
||||
# |
|
||||
# This file is a part of account_financial_report_webkit |
|
||||
# |
|
||||
# account_financial_report_webkit is free software: you can redistribute it |
|
||||
# and/or modify it under the terms of the GNU Affero General Public License |
|
||||
# as published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# account_financial_report_webkit is distributed in the hope that it will be |
|
||||
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
from openerp.osv import fields, orm |
|
||||
import time |
|
||||
|
|
||||
|
|
||||
class AccountReportPrintJournalWizard(orm.TransientModel): |
|
||||
|
|
||||
"""Will launch print journal report and pass requiered args""" |
|
||||
|
|
||||
_inherit = "account.common.account.report" |
|
||||
_name = "print.journal.webkit" |
|
||||
_description = "Journals Report" |
|
||||
|
|
||||
_columns = { |
|
||||
'amount_currency': fields.boolean("With Currency", |
|
||||
help="It adds the currency column"), |
|
||||
} |
|
||||
|
|
||||
_defaults = { |
|
||||
'amount_currency': False, |
|
||||
'journal_ids': False, |
|
||||
'filter': 'filter_period', |
|
||||
} |
|
||||
|
|
||||
def _check_fiscalyear(self, cr, uid, ids, context=None): |
|
||||
obj = self.read(cr, uid, ids[0], ['fiscalyear_id', 'filter'], |
|
||||
context=context) |
|
||||
if not obj['fiscalyear_id'] and obj['filter'] == 'filter_no': |
|
||||
return False |
|
||||
return True |
|
||||
|
|
||||
_constraints = [ |
|
||||
(_check_fiscalyear, 'When no Fiscal year is selected, you must choose \ |
|
||||
to filter by periods or by date.', ['filter']), |
|
||||
] |
|
||||
|
|
||||
def pre_print_report(self, cr, uid, ids, data, context=None): |
|
||||
data = super(AccountReportPrintJournalWizard, self).\ |
|
||||
pre_print_report(cr, uid, ids, data, context) |
|
||||
# will be used to attach the report on the main account |
|
||||
data['ids'] = [data['form']['chart_account_id']] |
|
||||
vals = self.read(cr, uid, ids, |
|
||||
['amount_currency', |
|
||||
'display_account', |
|
||||
'journal_ids'], |
|
||||
context=context)[0] |
|
||||
data['form'].update(vals) |
|
||||
return data |
|
||||
|
|
||||
def onchange_filter(self, cr, uid, ids, filter='filter_no', |
|
||||
fiscalyear_id=False, context=None): |
|
||||
res = {} |
|
||||
if filter == 'filter_no': |
|
||||
res['value'] = {'period_from': False, |
|
||||
'period_to': False, |
|
||||
'date_from': False, |
|
||||
'date_to': False} |
|
||||
if filter == 'filter_date': |
|
||||
if fiscalyear_id: |
|
||||
fyear = self.pool.get('account.fiscalyear').browse( |
|
||||
cr, uid, fiscalyear_id, context=context) |
|
||||
date_from = fyear.date_start |
|
||||
date_to = fyear.date_stop > time.strftime( |
|
||||
'%Y-%m-%d') and time.strftime('%Y-%m-%d') \ |
|
||||
or fyear.date_stop |
|
||||
else: |
|
||||
date_from, date_to = time.strftime( |
|
||||
'%Y-01-01'), time.strftime('%Y-%m-%d') |
|
||||
res['value'] = {'period_from': False, 'period_to': |
|
||||
False, 'date_from': date_from, 'date_to': date_to} |
|
||||
if filter == 'filter_period' and fiscalyear_id: |
|
||||
start_period = end_period = False |
|
||||
cr.execute(''' |
|
||||
SELECT * FROM (SELECT p.id |
|
||||
FROM account_period p |
|
||||
LEFT JOIN account_fiscalyear f |
|
||||
ON (p.fiscalyear_id = f.id) |
|
||||
WHERE f.id = %s |
|
||||
AND COALESCE(p.special, FALSE) = FALSE |
|
||||
ORDER BY p.date_start ASC |
|
||||
LIMIT 1) AS period_start |
|
||||
UNION ALL |
|
||||
SELECT * FROM (SELECT p.id |
|
||||
FROM account_period p |
|
||||
LEFT JOIN account_fiscalyear f |
|
||||
ON (p.fiscalyear_id = f.id) |
|
||||
WHERE f.id = %s |
|
||||
AND p.date_start < NOW() |
|
||||
AND COALESCE(p.special, FALSE) = FALSE |
|
||||
ORDER BY p.date_stop DESC |
|
||||
LIMIT 1) AS period_stop''', |
|
||||
(fiscalyear_id, fiscalyear_id)) |
|
||||
periods = [i[0] for i in cr.fetchall()] |
|
||||
if periods: |
|
||||
start_period = end_period = periods[0] |
|
||||
if len(periods) > 1: |
|
||||
end_period = periods[1] |
|
||||
res['value'] = {'period_from': start_period, 'period_to': |
|
||||
end_period, 'date_from': False, 'date_to': False} |
|
||||
return res |
|
||||
|
|
||||
def _print_report(self, cursor, uid, ids, data, context=None): |
|
||||
context = context or {} |
|
||||
# we update form with display account value |
|
||||
data = self.pre_print_report(cursor, uid, ids, data, context=context) |
|
||||
return {'type': 'ir.actions.report.xml', |
|
||||
'report_name': 'account.account_report_print_journal_webkit', |
|
||||
'datas': data} |
|
@ -1,89 +0,0 @@ |
|||||
<?xml version="1.0" encoding="UTF-8"?> |
|
||||
<openerp> |
|
||||
<data> |
|
||||
############################################################################## |
|
||||
# |
|
||||
# account_financial_report_webkit module for OpenERP, Webkit based extended report financial report |
|
||||
# Copyright (C) 2012 SYLEAM Info Services ([http://www.syleam.fr/]) |
|
||||
# Sebastien LANGE [sebastien.lange@syleam.fr] |
|
||||
# |
|
||||
# This file is a part of account_financial_report_webkit |
|
||||
# |
|
||||
# account_financial_report_webkit is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as published by |
|
||||
# the Free Software Foundation, either version 3 of the License, or |
|
||||
# (at your option) any later version. |
|
||||
# |
|
||||
# account_financial_report_webkit is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see [http://www.gnu.org/licenses/]. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
<record id="account_report_print_journal_view_webkit" model="ir.ui.view"> |
|
||||
<field name="name">Journals</field> |
|
||||
<field name="model">print.journal.webkit</field> |
|
||||
<field name="type">form</field> |
|
||||
<field name="inherit_id" ref="account.account_common_report_view"/> |
|
||||
<field name="arch" type="xml"> |
|
||||
<data> |
|
||||
<xpath expr="/form/label[@string='']" position="replace"> |
|
||||
<separator string="Journals" colspan="4"/> |
|
||||
<label nolabel="1" colspan="4" string="This report allows you to print or generate a pdf of your print journal with details of all your account journals"/> |
|
||||
</xpath> |
|
||||
<xpath expr="//field[@name='target_move']" position="after"> |
|
||||
<field name="amount_currency"/> |
|
||||
<newline/> |
|
||||
<field name="filter" on_change="onchange_filter(filter, fiscalyear_id)" colspan="4" invisible="1"/> |
|
||||
<separator string="Periods" colspan="4"/> |
|
||||
<field name="period_from" domain="[('fiscalyear_id', '=', fiscalyear_id)]" required="1" colspan="4"/> |
|
||||
<field name="period_to" domain="[('fiscalyear_id', '=', fiscalyear_id)]" required="1" colspan="4"/> |
|
||||
<separator string="Journals" colspan="4"/> |
|
||||
<field name="journal_ids" colspan="4" nolabel="1"/> |
|
||||
</xpath> |
|
||||
<xpath expr="//page[@name='filters']" position="replace"> |
|
||||
</xpath> |
|
||||
<xpath expr="//page[@name='journal_ids']" position="replace"> |
|
||||
</xpath> |
|
||||
</data> |
|
||||
</field> |
|
||||
</record> |
|
||||
|
|
||||
<record id="account_report_print_journal_view_inherit" model="ir.ui.view"> |
|
||||
<field name="name">Journals</field> |
|
||||
<field name="model">print.journal.webkit</field> |
|
||||
<field name="type">form</field> |
|
||||
<field name="inherit_id" ref="account.account_report_print_journal"/> |
|
||||
<field name="arch" type="xml"> |
|
||||
<field name="fiscalyear_id" position="replace"> |
|
||||
<field name="fiscalyear_id" on_change="onchange_fiscalyear(fiscalyear_id)"/> |
|
||||
</field> |
|
||||
</field> |
|
||||
</record> |
|
||||
|
|
||||
<record id="action_account_print_journal_menu_webkit" model="ir.actions.act_window"> |
|
||||
<field name="name">Journals</field> |
|
||||
<field name="type">ir.actions.act_window</field> |
|
||||
<field name="res_model">print.journal.webkit</field> |
|
||||
<field name="view_type">form</field> |
|
||||
<field name="view_mode">form</field> |
|
||||
<field name="view_id" ref="account_report_print_journal_view_webkit"/> |
|
||||
<field name="target">new</field> |
|
||||
</record> |
|
||||
|
|
||||
<record model="ir.values" id="action_account_print_journal_values_webkit"> |
|
||||
<field name="model_id" ref="account.model_account_account"/> |
|
||||
<field name="name">Journals</field> |
|
||||
<field name="key2">client_print_multi</field> |
|
||||
<field name="value" |
|
||||
eval="'ir.actions.act_window,' +str(ref('action_account_print_journal_menu_webkit'))"/> |
|
||||
<field name="key">action</field> |
|
||||
<field name="model">account.journal.period</field> |
|
||||
</record> |
|
||||
|
|
||||
</data> |
|
||||
</openerp> |
|
@ -1,39 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# Author: Guewen Baconnier |
|
||||
# Copyright Camptocamp SA 2011 |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
from openerp.osv import orm |
|
||||
|
|
||||
|
|
||||
class AccountTrialBalanceWizard(orm.TransientModel): |
|
||||
"""Will launch trial balance report and pass required args""" |
|
||||
|
|
||||
_inherit = "account.common.balance.report" |
|
||||
_name = "trial.balance.webkit" |
|
||||
_description = "Trial Balance Report" |
|
||||
|
|
||||
def _print_report(self, cursor, uid, ids, data, context=None): |
|
||||
context = context or {} |
|
||||
# we update form with display account value |
|
||||
data = self.pre_print_report(cursor, uid, ids, data, context=context) |
|
||||
|
|
||||
return {'type': 'ir.actions.report.xml', |
|
||||
'report_name': 'account.account_report_trial_balance_webkit', |
|
||||
'datas': data} |
|
@ -1,76 +0,0 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||
<openerp> |
|
||||
<data> |
|
||||
|
|
||||
<!-- inheriting views from more than 2 differents inherited models like |
|
||||
trial.balance.webkit -> account.common.balance.report -> account.common.account.report |
|
||||
is not supported so we have to copy paste the same view for trial balance, balance sheet |
|
||||
--> |
|
||||
<record id="account_trial_balance_view_webkit" model="ir.ui.view"> |
|
||||
<field name="name">Trial Balance</field> |
|
||||
<field name="model">trial.balance.webkit</field> |
|
||||
<field name="inherit_id" ref="account.account_common_report_view"/> |
|
||||
<field name="arch" type="xml"> |
|
||||
<data> |
|
||||
<xpath expr="/form/label[@string='']" position="replace"> |
|
||||
<separator string="Trial Balance" colspan="4"/> |
|
||||
<label nolabel="1" colspan="4" string="This report allows you to print or generate a pdf of your trial balance allowing you to quickly check the balance of each of your accounts in a single report"/> |
|
||||
</xpath> |
|
||||
<field name="chart_account_id" position='attributes'> |
|
||||
<attribute name="colspan">4</attribute> |
|
||||
</field> |
|
||||
<page name="filters" position="after"> |
|
||||
<page string="Accounts Filters" name="accounts"> |
|
||||
<separator string="Print only" colspan="4"/> |
|
||||
<field name="account_ids" colspan="4" nolabel="1" domain="[('type', '=', 'view')]"> |
|
||||
<tree> |
|
||||
<field name="code"/> |
|
||||
<field name="name"/> |
|
||||
<field name="type"/> |
|
||||
<field name="company_id"/> |
|
||||
</tree> |
|
||||
</field> |
|
||||
</page> |
|
||||
<page name="placeholder"/> |
|
||||
</page> |
|
||||
<page name="journal_ids" position="attributes"> |
|
||||
<attribute name="invisible">True</attribute> |
|
||||
</page> |
|
||||
<page name="filters" position="attributes"> |
|
||||
<attribute name="string">Time Filters</attribute> |
|
||||
</page> |
|
||||
<field name="period_from" position="attributes"> |
|
||||
<attribute name="domain">[('fiscalyear_id', '=', fiscalyear_id), ('special', '=', False)]</attribute> |
|
||||
</field> |
|
||||
<field name="period_to" position="attributes"> |
|
||||
<attribute name="domain">[('fiscalyear_id', '=', fiscalyear_id), ('special', '=', False)]</attribute> |
|
||||
</field> |
|
||||
<field name="fiscalyear_id" position="attributes"> |
|
||||
<attribute name="attrs">{'required': [('filter', '=', 'filter_opening')]}</attribute> |
|
||||
</field> |
|
||||
</data> |
|
||||
</field> |
|
||||
</record> |
|
||||
|
|
||||
<record id="action_account_trial_balance_menu_webkit" model="ir.actions.act_window"> |
|
||||
<field name="name">Trial Balance</field> |
|
||||
<field name="type">ir.actions.act_window</field> |
|
||||
<field name="res_model">trial.balance.webkit</field> |
|
||||
<field name="view_type">form</field> |
|
||||
<field name="view_mode">form</field> |
|
||||
<field name="view_id" ref="account_trial_balance_view_webkit"/> |
|
||||
<field name="target">new</field> |
|
||||
</record> |
|
||||
|
|
||||
<record model="ir.values" id="action_account_trial_balance_values_webkit"> |
|
||||
<field name="model_id" ref="account.model_account_account"/> |
|
||||
<field name="name">Trial Balance</field> |
|
||||
<field name="key2">client_print_multi</field> |
|
||||
<field name="value" |
|
||||
eval="'ir.actions.act_window,' +str(ref('action_account_trial_balance_menu_webkit'))"/> |
|
||||
<field name="key">action</field> |
|
||||
<field name="model">account.account</field> |
|
||||
</record> |
|
||||
|
|
||||
</data> |
|
||||
</openerp> |
|
@ -1,4 +0,0 @@ |
|||||
<?xml version="1.0" ?> |
|
||||
<openerp> |
|
||||
<data> </data> |
|
||||
</openerp> |
|
@ -1,29 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# OpenERP, Open Source Management Solution |
|
||||
# |
|
||||
# Copyright (c) 2013 Noviat nv/sa (www.noviat.com). All rights reserved. |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
try: |
|
||||
from . import wizard |
|
||||
from . import report |
|
||||
except ImportError: |
|
||||
import logging |
|
||||
logging.getLogger('openerp.module').warning('''report_xls not available in |
|
||||
addons path. account_financial_report_webkit_xls will not be usable''') |
|
@ -1,54 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# OpenERP, Open Source Management Solution |
|
||||
# |
|
||||
# Copyright (c) 2013 Noviat nv/sa (www.noviat.com). All rights reserved. |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
{ |
|
||||
'name': 'Add XLS export to accounting reports', |
|
||||
'version': '8.0.0.4.0', |
|
||||
'license': 'AGPL-3', |
|
||||
'author': "Noviat,Odoo Community Association (OCA)", |
|
||||
'category': 'Generic Modules/Accounting', |
|
||||
'description': """ |
|
||||
|
|
||||
This module adds XLS export to the following accounting reports: |
|
||||
- general ledger |
|
||||
- trial balance |
|
||||
- partner ledger |
|
||||
- partner balance |
|
||||
- open invoices |
|
||||
|
|
||||
""", |
|
||||
'depends': ['report_xls', 'account_financial_report_webkit'], |
|
||||
'demo': [], |
|
||||
'data': [ |
|
||||
'wizard/general_ledger_wizard_view.xml', |
|
||||
'wizard/trial_balance_wizard_view.xml', |
|
||||
'wizard/partners_ledger_wizard_view.xml', |
|
||||
'wizard/partners_balance_wizard_view.xml', |
|
||||
'wizard/open_invoices_wizard_view.xml', |
|
||||
], |
|
||||
'test': ['tests/general_ledger.yml', |
|
||||
'tests/partner_ledger.yml', |
|
||||
'tests/trial_balance.yml', |
|
||||
'tests/partner_balance.yml', |
|
||||
'tests/open_invoices.yml'], |
|
||||
'active': False, |
|
||||
'installable': False, |
|
||||
} |
|
@ -1,27 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# OpenERP, Open Source Management Solution |
|
||||
# |
|
||||
# Copyright (c) 2013 Noviat nv/sa (www.noviat.com). All rights reserved. |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
from . import general_ledger_xls |
|
||||
from . import trial_balance_xls |
|
||||
from . import partners_balance_xls |
|
||||
from . import partner_ledger_xls |
|
||||
from . import open_invoices_xls |
|
@ -1,347 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# OpenERP, Open Source Management Solution |
|
||||
# |
|
||||
# Copyright (c) 2013 Noviat nv/sa (www.noviat.com). All rights reserved. |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
import xlwt |
|
||||
from datetime import datetime |
|
||||
from openerp.addons.report_xls.report_xls import report_xls |
|
||||
from openerp.addons.report_xls.utils import rowcol_to_cell |
|
||||
from openerp.addons.account_financial_report_webkit.report.general_ledger \ |
|
||||
import GeneralLedgerWebkit |
|
||||
from openerp.tools.translate import _ |
|
||||
# import logging |
|
||||
# _logger = logging.getLogger(__name__) |
|
||||
|
|
||||
_column_sizes = [ |
|
||||
('date', 12), |
|
||||
('period', 12), |
|
||||
('move', 20), |
|
||||
('journal', 12), |
|
||||
('account_code', 12), |
|
||||
('partner', 30), |
|
||||
('label', 45), |
|
||||
('counterpart', 30), |
|
||||
('debit', 15), |
|
||||
('credit', 15), |
|
||||
('cumul_bal', 15), |
|
||||
('curr_bal', 15), |
|
||||
('curr_code', 7), |
|
||||
] |
|
||||
|
|
||||
|
|
||||
class general_ledger_xls(report_xls): |
|
||||
column_sizes = [x[1] for x in _column_sizes] |
|
||||
|
|
||||
def generate_xls_report(self, _p, _xs, data, objects, wb): |
|
||||
|
|
||||
ws = wb.add_sheet(_p.report_name[:31]) |
|
||||
ws.panes_frozen = True |
|
||||
ws.remove_splits = True |
|
||||
ws.portrait = 0 # Landscape |
|
||||
ws.fit_width_to_pages = 1 |
|
||||
row_pos = 0 |
|
||||
|
|
||||
# set print header/footer |
|
||||
ws.header_str = self.xls_headers['standard'] |
|
||||
ws.footer_str = self.xls_footers['standard'] |
|
||||
|
|
||||
# cf. account_report_general_ledger.mako |
|
||||
initial_balance_text = {'initial_balance': _('Computed'), |
|
||||
'opening_balance': _('Opening Entries'), |
|
||||
False: _('No')} |
|
||||
|
|
||||
# Title |
|
||||
cell_style = xlwt.easyxf(_xs['xls_title']) |
|
||||
report_name = ' - '.join([_p.report_name.upper(), |
|
||||
_p.company.partner_id.name, |
|
||||
_p.company.currency_id.name]) |
|
||||
c_specs = [ |
|
||||
('report_name', 1, 0, 'text', report_name), |
|
||||
] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, row_style=cell_style) |
|
||||
|
|
||||
# write empty row to define column sizes |
|
||||
c_sizes = self.column_sizes |
|
||||
c_specs = [('empty%s' % i, 1, c_sizes[i], 'text', None) |
|
||||
for i in range(0, len(c_sizes))] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, set_column_size=True) |
|
||||
|
|
||||
# Header Table |
|
||||
cell_format = _xs['bold'] + _xs['fill_blue'] + _xs['borders_all'] |
|
||||
cell_style = xlwt.easyxf(cell_format) |
|
||||
cell_style_center = xlwt.easyxf(cell_format + _xs['center']) |
|
||||
c_specs = [ |
|
||||
('coa', 2, 0, 'text', _('Chart of Account')), |
|
||||
('fy', 1, 0, 'text', _('Fiscal Year')), |
|
||||
('df', 3, 0, 'text', _p.filter_form(data) == |
|
||||
'filter_date' and _('Dates Filter') or _('Periods Filter')), |
|
||||
('af', 1, 0, 'text', _('Accounts Filter')), |
|
||||
('tm', 2, 0, 'text', _('Target Moves')), |
|
||||
('ib', 2, 0, 'text', _('Initial Balance')), |
|
||||
|
|
||||
] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, row_style=cell_style_center) |
|
||||
|
|
||||
cell_format = _xs['borders_all'] |
|
||||
cell_style = xlwt.easyxf(cell_format) |
|
||||
cell_style_center = xlwt.easyxf(cell_format + _xs['center']) |
|
||||
c_specs = [ |
|
||||
('coa', 2, 0, 'text', _p.chart_account.name), |
|
||||
('fy', 1, 0, 'text', _p.fiscalyear.name if _p.fiscalyear else '-'), |
|
||||
] |
|
||||
df = _('From') + ': ' |
|
||||
if _p.filter_form(data) == 'filter_date': |
|
||||
df += _p.start_date if _p.start_date else u'' |
|
||||
else: |
|
||||
df += _p.start_period.name if _p.start_period else u'' |
|
||||
df += ' ' + _('To') + ': ' |
|
||||
if _p.filter_form(data) == 'filter_date': |
|
||||
df += _p.stop_date if _p.stop_date else u'' |
|
||||
else: |
|
||||
df += _p.stop_period.name if _p.stop_period else u'' |
|
||||
c_specs += [ |
|
||||
('df', 3, 0, 'text', df), |
|
||||
('af', 1, 0, 'text', _p.accounts(data) and ', '.join( |
|
||||
[account.code for account in _p.accounts(data)]) or _('All')), |
|
||||
('tm', 2, 0, 'text', _p.display_target_move(data)), |
|
||||
('ib', 2, 0, 'text', initial_balance_text[ |
|
||||
_p.initial_balance_mode]), |
|
||||
] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, row_style=cell_style_center) |
|
||||
ws.set_horz_split_pos(row_pos) |
|
||||
row_pos += 1 |
|
||||
|
|
||||
# Column Title Row |
|
||||
cell_format = _xs['bold'] |
|
||||
c_title_cell_style = xlwt.easyxf(cell_format) |
|
||||
|
|
||||
# Column Header Row |
|
||||
cell_format = _xs['bold'] + _xs['fill'] + _xs['borders_all'] |
|
||||
c_hdr_cell_style = xlwt.easyxf(cell_format) |
|
||||
c_hdr_cell_style_right = xlwt.easyxf(cell_format + _xs['right']) |
|
||||
c_hdr_cell_style_center = xlwt.easyxf(cell_format + _xs['center']) |
|
||||
c_hdr_cell_style_decimal = xlwt.easyxf( |
|
||||
cell_format + _xs['right'], |
|
||||
num_format_str=report_xls.decimal_format) |
|
||||
|
|
||||
# Column Initial Balance Row |
|
||||
cell_format = _xs['italic'] + _xs['borders_all'] |
|
||||
c_init_cell_style = xlwt.easyxf(cell_format) |
|
||||
c_init_cell_style_decimal = xlwt.easyxf( |
|
||||
cell_format + _xs['right'], |
|
||||
num_format_str=report_xls.decimal_format) |
|
||||
|
|
||||
c_specs = [ |
|
||||
('date', 1, 0, 'text', _('Date'), None, c_hdr_cell_style), |
|
||||
('period', 1, 0, 'text', _('Period'), None, c_hdr_cell_style), |
|
||||
('move', 1, 0, 'text', _('Entry'), None, c_hdr_cell_style), |
|
||||
('journal', 1, 0, 'text', _('Journal'), None, c_hdr_cell_style), |
|
||||
('account_code', 1, 0, 'text', |
|
||||
_('Account'), None, c_hdr_cell_style), |
|
||||
('partner', 1, 0, 'text', _('Partner'), None, c_hdr_cell_style), |
|
||||
('label', 1, 0, 'text', _('Label'), None, c_hdr_cell_style), |
|
||||
('counterpart', 1, 0, 'text', |
|
||||
_('Counterpart'), None, c_hdr_cell_style), |
|
||||
('debit', 1, 0, 'text', _('Debit'), None, c_hdr_cell_style_right), |
|
||||
('credit', 1, 0, 'text', _('Credit'), |
|
||||
None, c_hdr_cell_style_right), |
|
||||
('cumul_bal', 1, 0, 'text', _('Cumul. Bal.'), |
|
||||
None, c_hdr_cell_style_right), |
|
||||
] |
|
||||
if _p.amount_currency(data): |
|
||||
c_specs += [ |
|
||||
('curr_bal', 1, 0, 'text', _('Curr. Bal.'), |
|
||||
None, c_hdr_cell_style_right), |
|
||||
('curr_code', 1, 0, 'text', _('Curr.'), |
|
||||
None, c_hdr_cell_style_center), |
|
||||
] |
|
||||
c_hdr_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
|
|
||||
# cell styles for ledger lines |
|
||||
ll_cell_format = _xs['borders_all'] |
|
||||
ll_cell_style = xlwt.easyxf(ll_cell_format) |
|
||||
ll_cell_style_center = xlwt.easyxf(ll_cell_format + _xs['center']) |
|
||||
ll_cell_style_date = xlwt.easyxf( |
|
||||
ll_cell_format + _xs['left'], |
|
||||
num_format_str=report_xls.date_format) |
|
||||
ll_cell_style_decimal = xlwt.easyxf( |
|
||||
ll_cell_format + _xs['right'], |
|
||||
num_format_str=report_xls.decimal_format) |
|
||||
|
|
||||
cnt = 0 |
|
||||
for account in objects: |
|
||||
|
|
||||
display_initial_balance = _p['init_balance'][account.id] and \ |
|
||||
(_p['init_balance'][account.id].get( |
|
||||
'debit', 0.0) != 0.0 or |
|
||||
_p['init_balance'][account.id].get('credit', 0.0) != 0.0) |
|
||||
display_ledger_lines = _p['ledger_lines'][account.id] |
|
||||
|
|
||||
if _p.display_account_raw(data) == 'all' or \ |
|
||||
(display_ledger_lines or display_initial_balance): |
|
||||
# TO DO : replace cumul amounts by xls formulas |
|
||||
cnt += 1 |
|
||||
cumul_debit = 0.0 |
|
||||
cumul_credit = 0.0 |
|
||||
cumul_balance = 0.0 |
|
||||
cumul_balance_curr = 0.0 |
|
||||
c_specs = [ |
|
||||
('acc_title', 11, 0, 'text', |
|
||||
' - '.join([account.code, account.name])), |
|
||||
] |
|
||||
row_data = self.xls_row_template( |
|
||||
c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, c_title_cell_style) |
|
||||
row_pos = self.xls_write_row(ws, row_pos, c_hdr_data) |
|
||||
row_start = row_pos |
|
||||
|
|
||||
if display_initial_balance: |
|
||||
init_balance = _p['init_balance'][account.id] |
|
||||
cumul_debit = init_balance.get('debit') or 0.0 |
|
||||
cumul_credit = init_balance.get('credit') or 0.0 |
|
||||
cumul_balance = init_balance.get('init_balance') or 0.0 |
|
||||
cumul_balance_curr = init_balance.get( |
|
||||
'init_balance_currency') or 0.0 |
|
||||
c_specs = [('empty%s' % x, 1, 0, 'text', None) |
|
||||
for x in range(6)] |
|
||||
c_specs += [ |
|
||||
('init_bal', 1, 0, 'text', _('Initial Balance')), |
|
||||
('counterpart', 1, 0, 'text', None), |
|
||||
('debit', 1, 0, 'number', cumul_debit, |
|
||||
None, c_init_cell_style_decimal), |
|
||||
('credit', 1, 0, 'number', cumul_credit, |
|
||||
None, c_init_cell_style_decimal), |
|
||||
('cumul_bal', 1, 0, 'number', cumul_balance, |
|
||||
None, c_init_cell_style_decimal), |
|
||||
] |
|
||||
if _p.amount_currency(data): |
|
||||
c_specs += [ |
|
||||
('curr_bal', 1, 0, 'number', cumul_balance_curr, |
|
||||
None, c_init_cell_style_decimal), |
|
||||
('curr_code', 1, 0, 'text', None), |
|
||||
] |
|
||||
row_data = self.xls_row_template( |
|
||||
c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, c_init_cell_style) |
|
||||
|
|
||||
for line in _p['ledger_lines'][account.id]: |
|
||||
|
|
||||
cumul_debit += line.get('debit') or 0.0 |
|
||||
cumul_credit += line.get('credit') or 0.0 |
|
||||
cumul_balance_curr += line.get('amount_currency') or 0.0 |
|
||||
cumul_balance += line.get('balance') or 0.0 |
|
||||
label_elements = [line.get('lname') or ''] |
|
||||
if line.get('invoice_number'): |
|
||||
label_elements.append( |
|
||||
"(%s)" % (line['invoice_number'],)) |
|
||||
label = ' '.join(label_elements) |
|
||||
|
|
||||
if line.get('ldate'): |
|
||||
c_specs = [ |
|
||||
('ldate', 1, 0, 'date', datetime.strptime( |
|
||||
line['ldate'], '%Y-%m-%d'), None, |
|
||||
ll_cell_style_date), |
|
||||
] |
|
||||
else: |
|
||||
c_specs = [ |
|
||||
('ldate', 1, 0, 'text', None), |
|
||||
] |
|
||||
c_specs += [ |
|
||||
('period', 1, 0, 'text', |
|
||||
line.get('period_code') or ''), |
|
||||
('move', 1, 0, 'text', line.get('move_name') or ''), |
|
||||
('journal', 1, 0, 'text', line.get('jcode') or ''), |
|
||||
('account_code', 1, 0, 'text', account.code), |
|
||||
('partner', 1, 0, 'text', |
|
||||
line.get('partner_name') or ''), |
|
||||
('label', 1, 0, 'text', label), |
|
||||
('counterpart', 1, 0, 'text', |
|
||||
line.get('counterparts') or ''), |
|
||||
('debit', 1, 0, 'number', line.get('debit', 0.0), |
|
||||
None, ll_cell_style_decimal), |
|
||||
('credit', 1, 0, 'number', line.get('credit', 0.0), |
|
||||
None, ll_cell_style_decimal), |
|
||||
('cumul_bal', 1, 0, 'number', cumul_balance, |
|
||||
None, ll_cell_style_decimal), |
|
||||
] |
|
||||
if _p.amount_currency(data): |
|
||||
c_specs += [ |
|
||||
('curr_bal', 1, 0, 'number', line.get( |
|
||||
'amount_currency') or 0.0, None, |
|
||||
ll_cell_style_decimal), |
|
||||
('curr_code', 1, 0, 'text', line.get( |
|
||||
'currency_code') or '', None, |
|
||||
ll_cell_style_center), |
|
||||
] |
|
||||
row_data = self.xls_row_template( |
|
||||
c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, ll_cell_style) |
|
||||
|
|
||||
debit_start = rowcol_to_cell(row_start, 8) |
|
||||
debit_end = rowcol_to_cell(row_pos - 1, 8) |
|
||||
debit_formula = 'SUM(' + debit_start + ':' + debit_end + ')' |
|
||||
credit_start = rowcol_to_cell(row_start, 9) |
|
||||
credit_end = rowcol_to_cell(row_pos - 1, 9) |
|
||||
credit_formula = 'SUM(' + credit_start + ':' + credit_end + ')' |
|
||||
balance_debit = rowcol_to_cell(row_pos, 8) |
|
||||
balance_credit = rowcol_to_cell(row_pos, 9) |
|
||||
balance_formula = balance_debit + '-' + balance_credit |
|
||||
c_specs = [ |
|
||||
('acc_title', 7, 0, 'text', |
|
||||
' - '.join([account.code, account.name])), |
|
||||
('cum_bal', 1, 0, 'text', |
|
||||
_('Cumulated Balance on Account'), |
|
||||
None, c_hdr_cell_style_right), |
|
||||
('debit', 1, 0, 'number', None, |
|
||||
debit_formula, c_hdr_cell_style_decimal), |
|
||||
('credit', 1, 0, 'number', None, |
|
||||
credit_formula, c_hdr_cell_style_decimal), |
|
||||
('balance', 1, 0, 'number', None, |
|
||||
balance_formula, c_hdr_cell_style_decimal), |
|
||||
] |
|
||||
if _p.amount_currency(data): |
|
||||
if account.currency_id: |
|
||||
c_specs += [('curr_bal', 1, 0, 'number', |
|
||||
cumul_balance_curr, None, |
|
||||
c_hdr_cell_style_decimal)] |
|
||||
else: |
|
||||
c_specs += [('curr_bal', 1, 0, 'text', None)] |
|
||||
c_specs += [('curr_code', 1, 0, 'text', None)] |
|
||||
row_data = self.xls_row_template( |
|
||||
c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, c_hdr_cell_style) |
|
||||
row_pos += 1 |
|
||||
|
|
||||
general_ledger_xls('report.account.account_report_general_ledger_xls', |
|
||||
'account.account', |
|
||||
parser=GeneralLedgerWebkit) |
|
@ -1,828 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# OpenERP, Open Source Management Solution |
|
||||
# |
|
||||
# Copyright (c) 2013 Noviat nv/sa (www.noviat.com). All rights reserved. |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
import xlwt |
|
||||
from datetime import datetime |
|
||||
from openerp.addons.report_xls.report_xls import report_xls |
|
||||
from openerp.addons.report_xls.utils import rowcol_to_cell |
|
||||
from openerp.addons.account_financial_report_webkit.report.open_invoices \ |
|
||||
import PartnersOpenInvoicesWebkit |
|
||||
from openerp.tools.translate import _ |
|
||||
# import logging |
|
||||
# _logger = logging.getLogger(__name__) |
|
||||
|
|
||||
|
|
||||
class open_invoices_xls(report_xls): |
|
||||
column_sizes = [12, 12, 20, 15, 30, 30, 14, 14, 14, 14, 14, 14, 10] |
|
||||
|
|
||||
def global_initializations(self, wb, _p, xlwt, _xs, objects, data): |
|
||||
# this procedure will initialise variables and Excel cell styles and |
|
||||
# return them as global ones |
|
||||
self.ws = wb.add_sheet(_p.report_name[:31]) |
|
||||
self.ws.panes_frozen = True |
|
||||
self.ws.remove_splits = True |
|
||||
self.ws.portrait = 0 # Landscape |
|
||||
self.ws.fit_width_to_pages = 1 |
|
||||
self.ws.header_str = self.xls_headers['standard'] |
|
||||
self.ws.footer_str = self.xls_footers['standard'] |
|
||||
# ------------------------------------------------------- |
|
||||
# number of columns is 11 in case of normal report, 13 in case the |
|
||||
# option currency is selected and 12 in case of the regroup by currency |
|
||||
# option is checked |
|
||||
group_lines = False |
|
||||
# search if the regroup option is selected by browsing the accounts |
|
||||
# defined in objects - see account_report_open_invoices.mako |
|
||||
for acc in objects: |
|
||||
if hasattr(acc, 'grouped_ledger_lines'): |
|
||||
group_lines = True |
|
||||
if group_lines: |
|
||||
self.nbr_columns = 12 |
|
||||
elif _p.amount_currency(data) and not group_lines: |
|
||||
self.nbr_columns = 13 |
|
||||
else: |
|
||||
self.nbr_columns = 11 |
|
||||
# ------------------------------------------------------- |
|
||||
# cell style for report title |
|
||||
self.style_font12 = xlwt.easyxf(_xs['xls_title']) |
|
||||
# ------------------------------------------------------- |
|
||||
self.style_default = xlwt.easyxf(_xs['borders_all']) |
|
||||
# ------------------------------------------------------- |
|
||||
self.style_default_italic = xlwt.easyxf( |
|
||||
_xs['borders_all'] + _xs['italic']) |
|
||||
# ------------------------------------------------------- |
|
||||
self.style_bold = xlwt.easyxf(_xs['bold'] + _xs['borders_all']) |
|
||||
# ------------------------------------------------------- |
|
||||
# cell style for header titles: 'Chart of accounts' - 'Fiscal year' ... |
|
||||
self.style_bold_blue_center = xlwt.easyxf( |
|
||||
_xs['bold'] + _xs['fill_blue'] + _xs['borders_all'] + |
|
||||
_xs['center']) |
|
||||
# ------------------------------------------------------- |
|
||||
# cell style for header data: 'Chart of accounts' - 'Fiscal year' ... |
|
||||
self.style_center = xlwt.easyxf( |
|
||||
_xs['borders_all'] + _xs['wrap'] + _xs['center']) |
|
||||
# ------------------------------------------------------- |
|
||||
# cell style for columns titles 'Date'- 'Period' - 'Entry'... |
|
||||
self.style_yellow_bold = xlwt.easyxf( |
|
||||
_xs['bold'] + _xs['fill'] + _xs['borders_all']) |
|
||||
# ------------------------------------------------------- |
|
||||
# cell style for columns titles 'Date'- 'Period' - 'Entry'... |
|
||||
self.style_yellow_bold_right = xlwt.easyxf( |
|
||||
_xs['bold'] + _xs['fill'] + _xs['borders_all'] + _xs['right']) |
|
||||
# ------------------------------------------------------- |
|
||||
self.style_right = xlwt.easyxf(_xs['borders_all'] + _xs['right']) |
|
||||
# ------------------------------------------------------- |
|
||||
self.style_right_italic = xlwt.easyxf( |
|
||||
_xs['borders_all'] + _xs['right'] + _xs['italic']) |
|
||||
# ------------------------------------------------------- |
|
||||
self.style_decimal = xlwt.easyxf( |
|
||||
_xs['borders_all'] + _xs['right'], |
|
||||
num_format_str=report_xls.decimal_format) |
|
||||
# ------------------------------------------------------- |
|
||||
self.style_decimal_italic = xlwt.easyxf( |
|
||||
_xs['borders_all'] + _xs['right'] + _xs['italic'], |
|
||||
num_format_str=report_xls.decimal_format) |
|
||||
# ------------------------------------------------------- |
|
||||
self.style_date = xlwt.easyxf( |
|
||||
_xs['borders_all'] + _xs['left'], |
|
||||
num_format_str=report_xls.date_format) |
|
||||
# ------------------------------------------------------- |
|
||||
self.style_date_italic = xlwt.easyxf( |
|
||||
_xs['borders_all'] + _xs['left'] + _xs['italic'], |
|
||||
num_format_str=report_xls.date_format) |
|
||||
# ------------------------------------------------------- |
|
||||
cell_format = _xs['xls_title'] + _xs['bold'] + \ |
|
||||
_xs['fill'] + _xs['borders_all'] |
|
||||
self.style_account_title = xlwt.easyxf(cell_format) |
|
||||
self.style_account_title_right = xlwt.easyxf( |
|
||||
cell_format + _xs['right']) |
|
||||
self.style_account_title_decimal = xlwt.easyxf( |
|
||||
cell_format + _xs['right'], |
|
||||
num_format_str=report_xls.decimal_format) |
|
||||
# ------------------------------------------------------- |
|
||||
cell_format = _xs['bold'] |
|
||||
self.style_partner_row = xlwt.easyxf(cell_format) |
|
||||
# ------------------------------------------------------- |
|
||||
cell_format = _xs['bold'] + _xs['fill'] + _xs['borders_all'] |
|
||||
self.style_partner_cumul = xlwt.easyxf(cell_format) |
|
||||
self.style_partner_cumul_right = xlwt.easyxf( |
|
||||
cell_format + _xs['right']) |
|
||||
self.style_partner_cumul_decimal = xlwt.easyxf( |
|
||||
cell_format + _xs['right'], |
|
||||
num_format_str=report_xls.decimal_format) |
|
||||
|
|
||||
# print the first line "OPEN INVOICE REPORT - db name - Currency |
|
||||
def print_title(self, _p, row_position): |
|
||||
report_name = ' - '.join([_p.report_name.upper(), |
|
||||
_p.company.partner_id.name, |
|
||||
_p.company.currency_id.name]) |
|
||||
c_specs = [('report_name', self.nbr_columns, 0, 'text', report_name), ] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_position = self.xls_write_row( |
|
||||
self.ws, row_position, row_data, row_style=self.style_font12) |
|
||||
return row_position |
|
||||
|
|
||||
# send an empty row to the Excel document |
|
||||
def print_empty_row(self, row_position): |
|
||||
c_sizes = self.column_sizes |
|
||||
c_specs = [('empty%s' % i, 1, c_sizes[i], 'text', None) |
|
||||
for i in range(0, len(c_sizes))] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_position = self.xls_write_row( |
|
||||
self.ws, row_position, row_data, set_column_size=True) |
|
||||
return row_position |
|
||||
|
|
||||
# Fill in the titles of the header summary tables: Chart of account - |
|
||||
# Fiscal year - ... |
|
||||
def print_header_titles(self, _p, data, row_position): |
|
||||
c_specs = [ |
|
||||
('coa', 2, 0, 'text', _('Chart of Account'), |
|
||||
None, self.style_bold_blue_center), |
|
||||
('fy', 2, 0, 'text', _('Fiscal Year'), |
|
||||
None, self.style_bold_blue_center), |
|
||||
('df', 2, 0, 'text', _p.filter_form(data) == 'filter_date' and _( |
|
||||
'Dates Filter') or _('Periods Filter'), None, |
|
||||
self.style_bold_blue_center), |
|
||||
('cd', 1 if self.nbr_columns == 11 else 2, 0, 'text', |
|
||||
_('Clearance Date'), None, self.style_bold_blue_center), |
|
||||
('af', 2, 0, 'text', _('Accounts Filter'), |
|
||||
None, self.style_bold_blue_center), |
|
||||
('tm', 3 if self.nbr_columns == 13 else 2, 0, 'text', |
|
||||
_('Target Moves'), None, self.style_bold_blue_center), |
|
||||
] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_position = self.xls_write_row( |
|
||||
self.ws, row_position, row_data, |
|
||||
row_style=self.style_bold_blue_center) |
|
||||
return row_position |
|
||||
|
|
||||
# Fill in the data of the header summary tables: Chart of account - Fiscal |
|
||||
# year - ... |
|
||||
def print_header_data(self, _p, data, row_position): |
|
||||
c_specs = [ |
|
||||
('coa', 2, 0, 'text', _p.chart_account.name, |
|
||||
None, self.style_center), |
|
||||
('fy', 2, 0, 'text', _p.fiscalyear.name if _p.fiscalyear else '-', |
|
||||
None, self.style_center), |
|
||||
] |
|
||||
df = _('From') + ': ' |
|
||||
if _p.filter_form(data) == 'filter_date': |
|
||||
df += _p.start_date if _p.start_date else u'' |
|
||||
else: |
|
||||
df += _p.start_period.name if _p.start_period else u'' |
|
||||
df += ' ' + _('To') + ': ' |
|
||||
if _p.filter_form(data) == 'filter_date': |
|
||||
df += _p.stop_date if _p.stop_date else u'' |
|
||||
else: |
|
||||
df += _p.stop_period.name if _p.stop_period else u'' |
|
||||
c_specs += [ |
|
||||
('df', 2, 0, 'text', df, None, self.style_center), |
|
||||
('cd', 1 if self.nbr_columns == 11 else 2, 0, 'text', |
|
||||
_p.date_until, None, self.style_center), # clearance date |
|
||||
('af', 2, 0, 'text', _('Custom Filter') |
|
||||
if _p.partner_ids else _p.display_partner_account(data), None, |
|
||||
self.style_center), |
|
||||
('tm', 3 if self.nbr_columns == 13 else 2, 0, 'text', |
|
||||
_p.display_target_move(data), None, self.style_center), |
|
||||
] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_position = self.xls_write_row( |
|
||||
self.ws, row_position, row_data, row_style=self.style_center) |
|
||||
return row_position |
|
||||
|
|
||||
# Fill in a row with the titles of the columns for the invoice lines: Date |
|
||||
# - Period - Entry -... |
|
||||
def print_columns_title(self, _p, row_position, data, group_lines=False): |
|
||||
c_specs = [ |
|
||||
('date', 1, 0, 'text', _('Date'), None, self.style_yellow_bold), |
|
||||
('period', 1, 0, 'text', _('Period'), |
|
||||
None, self.style_yellow_bold), |
|
||||
('entry', 1, 0, 'text', _('Entry'), None, self.style_yellow_bold), |
|
||||
('journal', 1, 0, 'text', _('Journal'), |
|
||||
None, self.style_yellow_bold), |
|
||||
] |
|
||||
if not group_lines: |
|
||||
c_specs += [('partner', 1, 0, 'text', _('Partner'), |
|
||||
None, self.style_yellow_bold), ] |
|
||||
c_specs += [ |
|
||||
('label', 1, 0, 'text', _('Label'), None, self.style_yellow_bold), |
|
||||
('rec', 1, 0, 'text', _('Rec.'), None, self.style_yellow_bold), |
|
||||
('due_date', 1, 0, 'text', _('Due Date'), |
|
||||
None, self.style_yellow_bold), |
|
||||
('debit', 1, 0, 'text', _('Debit'), |
|
||||
None, self.style_yellow_bold_right), |
|
||||
('credit', 1, 0, 'text', _('Credit'), |
|
||||
None, self.style_yellow_bold_right), |
|
||||
('cumul', 1, 0, 'text', _('Cumul. Bal.'), |
|
||||
None, self.style_yellow_bold_right), |
|
||||
] |
|
||||
if group_lines: |
|
||||
c_specs += [ |
|
||||
('currbal', 1, 0, 'text', _('Curr. Balance'), |
|
||||
None, self.style_yellow_bold_right), |
|
||||
('curr', 1, 0, 'text', _('Curr.'), |
|
||||
None, self.style_yellow_bold_right), |
|
||||
] |
|
||||
else: |
|
||||
if _p.amount_currency(data): |
|
||||
c_specs += [ |
|
||||
('currbal', 1, 0, 'text', _('Curr. Balance'), |
|
||||
None, self.style_yellow_bold_right), |
|
||||
('curr', 1, 0, 'text', _('Curr.'), |
|
||||
None, self.style_yellow_bold_right), |
|
||||
] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_position = self.xls_write_row( |
|
||||
self.ws, row_position, row_data, row_style=self.style_yellow_bold) |
|
||||
return row_position |
|
||||
|
|
||||
# Fill in a row with the code and the name of an account + the partner |
|
||||
# name in case of currency regrouping |
|
||||
def print_row_code_account(self, regroupmode, account, row_position, |
|
||||
partner_name): |
|
||||
if regroupmode == "regroup": |
|
||||
c_specs = [('acc_title', self.nbr_columns, 0, 'text', |
|
||||
' - '.join([account.code, |
|
||||
account.name, |
|
||||
partner_name or _('No partner')])), ] |
|
||||
else: |
|
||||
c_specs = [ |
|
||||
('acc_title', self.nbr_columns, 0, 'text', ' - '. |
|
||||
join([account.code, account.name])), ] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_position = self.xls_write_row( |
|
||||
self.ws, row_position, row_data, self.style_account_title) |
|
||||
return row_position + 1 |
|
||||
|
|
||||
def print_row_partner(self, row_position, partner_name): |
|
||||
c_specs = [ |
|
||||
('partner', self.nbr_columns, 0, 'text', |
|
||||
partner_name or _('No partner')), ] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_position = self.xls_write_row( |
|
||||
self.ws, row_position, row_data, self.style_partner_row) |
|
||||
return row_position |
|
||||
|
|
||||
def print_group_currency(self, row_position, curr, _p): |
|
||||
c_specs = [ |
|
||||
('curr', self.nbr_columns, 0, 'text', |
|
||||
curr or _p.company.currency_id.name), ] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_position = self.xls_write_row( |
|
||||
self.ws, row_position, row_data, self.style_bold) |
|
||||
return row_position |
|
||||
|
|
||||
# Fill in rows of invoice line |
|
||||
def print_lines(self, row_position, account, line, _p, data, line_number): |
|
||||
|
|
||||
label_elements = [line.get('lname') or ''] |
|
||||
if line.get('invoice_number'): |
|
||||
label_elements.append("(%s)" % (line['invoice_number'],)) |
|
||||
label = ' '.join(label_elements) |
|
||||
|
|
||||
# Mako: <div class="act_as_row lines |
|
||||
# ${line.get('is_from_previous_periods') and |
|
||||
# 'open_invoice_previous_line' or ''} ${line.get('is_clearance_line') |
|
||||
# and 'clearance_line' or ''}"> |
|
||||
if line.get('is_from_previous_periods') \ |
|
||||
or line.get('is_clearance_line'): |
|
||||
style_line_default = self.style_default_italic |
|
||||
style_line_right = self.style_right_italic |
|
||||
style_line_date = self.style_date_italic |
|
||||
style_line_decimal = self.style_decimal_italic |
|
||||
else: |
|
||||
style_line_default = self.style_default |
|
||||
style_line_right = self.style_right |
|
||||
style_line_date = self.style_date |
|
||||
style_line_decimal = self.style_decimal |
|
||||
if line.get('ldate'): |
|
||||
c_specs = [('date', 1, 0, 'date', datetime.strptime( |
|
||||
line['ldate'], '%Y-%m-%d'), None, style_line_date)] |
|
||||
else: |
|
||||
c_specs = [('date', 1, 0, 'text', None)] |
|
||||
c_specs += [ |
|
||||
('period_code', 1, 0, 'text', line.get('period_code') or ''), |
|
||||
('entry', 1, 0, 'text', line.get('move_name') or ''), |
|
||||
('journal', 1, 0, 'text', line.get('jcode') or ''), |
|
||||
('partner', 1, 0, 'text', line.get('partner_name') or ''), |
|
||||
('label', 1, 0, 'text', label), |
|
||||
('rec', 1, 0, 'text', line.get('rec_name') or ''), |
|
||||
] |
|
||||
if line.get('date_maturity'): |
|
||||
c_specs += [('datedue', 1, 0, 'date', |
|
||||
datetime.strptime(line['date_maturity'], '%Y-%m-%d'), |
|
||||
None, style_line_date)] |
|
||||
else: |
|
||||
c_specs += [('datedue', 1, 0, 'text', None)] |
|
||||
c_specs += [ |
|
||||
('debit', 1, 0, 'number', line.get('debit') or 0.0, None, |
|
||||
style_line_decimal), |
|
||||
('credit', 1, 0, 'number', line.get('credit') or 0.0, None, |
|
||||
style_line_decimal), |
|
||||
] |
|
||||
|
|
||||
# determine the formula of the cumulated balance |
|
||||
debit_cell = rowcol_to_cell(row_position, 8) |
|
||||
credit_cell = rowcol_to_cell(row_position, 9) |
|
||||
previous_balance = rowcol_to_cell(row_position - 1, 10) |
|
||||
|
|
||||
# if it is the first line, the balance is only debit - credit |
|
||||
if line_number == 1: |
|
||||
cumul_balance = debit_cell + '-' + credit_cell |
|
||||
# cumulate debit - credit and balance of previous line |
|
||||
else: |
|
||||
cumul_balance = debit_cell + '-' + \ |
|
||||
credit_cell + '+' + previous_balance |
|
||||
|
|
||||
c_specs += [('cumul', 1, 0, 'number', None, |
|
||||
cumul_balance, style_line_decimal)] |
|
||||
|
|
||||
if _p.amount_currency(data): |
|
||||
if account.currency_id: |
|
||||
c_specs += [ |
|
||||
('curramount', 1, 0, 'number', |
|
||||
line.get('amount_currency') or 0.0, None, |
|
||||
style_line_decimal), |
|
||||
('currcode', 1, 0, 'text', line[ |
|
||||
'currency_code'], None, style_line_right), |
|
||||
] |
|
||||
else: |
|
||||
c_specs += [ |
|
||||
('curramount', 1, 0, 'text', '-', None, style_line_right), |
|
||||
('currcode', 1, 0, 'text', '', None, style_line_right), |
|
||||
] |
|
||||
|
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_position = self.xls_write_row( |
|
||||
self.ws, row_position, row_data, style_line_default) |
|
||||
return row_position |
|
||||
|
|
||||
# Fill in rows of invoice line when the option currency regroup is |
|
||||
# selecself.wsd |
|
||||
def print_group_lines(self, row_position, account, line, _p, line_number): |
|
||||
|
|
||||
label_elements = [line.get('lname') or ''] |
|
||||
if line.get('invoice_number'): |
|
||||
label_elements.append("(%s)" % (line['invoice_number'],)) |
|
||||
label = ' '.join(label_elements) |
|
||||
# Mako: <div class="act_as_row lines |
|
||||
# ${line.get('is_from_previous_periods') and |
|
||||
# 'open_invoice_previous_line' or ''} ${line.get('is_clearance_line') |
|
||||
# and 'clearance_line' or ''}"> |
|
||||
if line.get('is_from_previous_periods') or \ |
|
||||
line.get('is_clearance_line'): |
|
||||
style_line_default = self.style_default_italic |
|
||||
style_line_right = self.style_right_italic |
|
||||
style_line_date = self.style_date_italic |
|
||||
style_line_decimal = self.style_decimal_italic |
|
||||
else: |
|
||||
style_line_default = self.style_default |
|
||||
style_line_right = self.style_right |
|
||||
style_line_date = self.style_date |
|
||||
style_line_decimal = self.style_decimal |
|
||||
|
|
||||
debit_cell = rowcol_to_cell(row_position, 7) |
|
||||
credit_cell = rowcol_to_cell(row_position, 8) |
|
||||
previous_balance = rowcol_to_cell(row_position - 1, 9) |
|
||||
|
|
||||
# if it is the first line, the balance is only debit - credit |
|
||||
if line_number == 1: |
|
||||
cumul_balance = debit_cell + '-' + credit_cell |
|
||||
# cumulate devit - credit and balance of previous line |
|
||||
else: |
|
||||
cumul_balance = debit_cell + '-' + \ |
|
||||
credit_cell + '+' + previous_balance |
|
||||
|
|
||||
if line.get('ldate'): |
|
||||
c_specs = [('date', 1, 0, 'date', datetime.strptime( |
|
||||
line['ldate'], '%Y-%m-%d'), None, style_line_date)] |
|
||||
else: |
|
||||
c_specs = [('date', 1, 0, 'text', None)] |
|
||||
c_specs += [ |
|
||||
('period_code', 1, 0, 'text', line.get('period_code') or ''), |
|
||||
('entry', 1, 0, 'text', line.get('move_name') or ''), |
|
||||
('journal', 1, 0, 'text', line.get('jcode') or ''), |
|
||||
('label', 1, 0, 'text', label), |
|
||||
('rec', 1, 0, 'text', line.get('rec_name') or ''), |
|
||||
] |
|
||||
if line.get('date_maturity'): |
|
||||
c_specs += [('datedue', 1, 0, 'date', |
|
||||
datetime.strptime(line['date_maturity'], '%Y-%m-%d'), |
|
||||
None, style_line_date)] |
|
||||
else: |
|
||||
c_specs += [('datedue', 1, 0, 'text', None)] |
|
||||
c_specs += [ |
|
||||
('debit', 1, 0, 'number', line.get('debit') or 0.0, None, |
|
||||
style_line_decimal), |
|
||||
('credit', 1, 0, 'number', line.get('credit') or 0.0, None, |
|
||||
style_line_decimal), |
|
||||
('cumul', 1, 0, 'number', None, cumul_balance, style_line_decimal), |
|
||||
] |
|
||||
if account.currency_id: |
|
||||
c_specs += [ |
|
||||
('curramount', 1, 0, 'number', |
|
||||
line.get('amount_currency') or 0.0, None, style_line_decimal), |
|
||||
('currcode', 1, 0, 'text', |
|
||||
line.get('currency_code') or '', None, style_line_right), |
|
||||
] |
|
||||
else: |
|
||||
c_specs += [ |
|
||||
('curramount', 1, 0, 'text', '-', None, style_line_right), |
|
||||
('currcode', 1, 0, 'text', '', None, style_line_right), |
|
||||
] |
|
||||
|
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_position = self.xls_write_row( |
|
||||
self.ws, row_position, row_data, style_line_default) |
|
||||
return (row_position, cumul_balance) |
|
||||
|
|
||||
# print by partner the totals and cumulated balance (Excel formulas) |
|
||||
def print_cumul_partner(self, row_position, row_start_partner, account, _p, |
|
||||
data): |
|
||||
|
|
||||
# the text "Cumulated Balance on Partner starts in column 4 when |
|
||||
# selecting the option regroup by currency, 5 in the other case |
|
||||
start_col = 5 |
|
||||
|
|
||||
debit_partner_start = rowcol_to_cell(row_start_partner, start_col + 3) |
|
||||
debit_partner_end = rowcol_to_cell(row_position - 1, start_col + 3) |
|
||||
debit_partner_total = 'SUM(' + debit_partner_start + \ |
|
||||
':' + debit_partner_end + ')' |
|
||||
|
|
||||
credit_partner_start = rowcol_to_cell(row_start_partner, start_col + 4) |
|
||||
credit_partner_end = rowcol_to_cell(row_position - 1, start_col + 4) |
|
||||
credit_partner_total = 'SUM(' + credit_partner_start + \ |
|
||||
':' + credit_partner_end + ')' |
|
||||
|
|
||||
bal_curr_start = rowcol_to_cell(row_start_partner, start_col + 6) |
|
||||
bal_curr_end = rowcol_to_cell(row_position - 1, start_col + 6) |
|
||||
cumul_balance_curr = 'SUM(' + bal_curr_start + ':' + bal_curr_end + ')' |
|
||||
|
|
||||
bal_partner_debit = rowcol_to_cell(row_position, start_col + 3) |
|
||||
bal_partner_credit = rowcol_to_cell(row_position, start_col + 4) |
|
||||
bal_partner_total = bal_partner_debit + '-' + bal_partner_credit |
|
||||
|
|
||||
c_specs = [('empty%s' % x, 1, 0, 'text', None) |
|
||||
for x in range(start_col)] |
|
||||
|
|
||||
c_specs += [ |
|
||||
('init_bal', 1, 0, 'text', _('Cumulated Balance on Partner')), |
|
||||
('rec', 1, 0, 'text', None), |
|
||||
('empty5', 1, 0, 'text', None), |
|
||||
('debit', 1, 0, 'number', None, |
|
||||
debit_partner_total, self.style_partner_cumul_decimal), |
|
||||
('credit', 1, 0, 'number', None, |
|
||||
credit_partner_total, self.style_partner_cumul_decimal), |
|
||||
('cumul_bal', 1, 0, 'number', None, |
|
||||
bal_partner_total, self.style_partner_cumul_decimal), |
|
||||
] |
|
||||
if _p.amount_currency(data): |
|
||||
if account.currency_id: |
|
||||
c_specs += [('cumul_bal_curr', 1, 0, 'number', None, |
|
||||
cumul_balance_curr, |
|
||||
self.style_partner_cumul_decimal), |
|
||||
('curr_name', 1, 0, 'text', |
|
||||
account.currency_id.name, |
|
||||
None, self.style_partner_cumul_right), |
|
||||
] |
|
||||
else: |
|
||||
c_specs += [('cumul_bal_curr', 1, 0, 'text', '-', None, |
|
||||
self.style_partner_cumul_right), |
|
||||
('curr_name', 1, 0, 'text', '', |
|
||||
None, self.style_partner_cumul_right) |
|
||||
] |
|
||||
|
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_position = self.xls_write_row( |
|
||||
self.ws, row_position, row_data, self.style_partner_cumul) |
|
||||
return row_position + 1 |
|
||||
|
|
||||
# print by partner the totals and cumulated balance (Excel formulas) when |
|
||||
# the option currency regroup is selected |
|
||||
def print_group_cumul_partner(self, row_position, row_start_partner, |
|
||||
account, _p, data): |
|
||||
|
|
||||
# the text "Cumulated Balance on Partner starts in column 4 when |
|
||||
# selecting the option regroup by currency, 5 in the other case |
|
||||
start_col = 4 |
|
||||
|
|
||||
debit_partner_start = rowcol_to_cell(row_start_partner, start_col + 3) |
|
||||
debit_partner_end = rowcol_to_cell(row_position - 1, start_col + 3) |
|
||||
debit_partner_total = 'SUM(' + debit_partner_start + \ |
|
||||
':' + debit_partner_end + ')' |
|
||||
|
|
||||
credit_partner_start = rowcol_to_cell(row_start_partner, start_col + 4) |
|
||||
credit_partner_end = rowcol_to_cell(row_position - 1, start_col + 4) |
|
||||
credit_partner_total = 'SUM(' + credit_partner_start + \ |
|
||||
':' + credit_partner_end + ')' |
|
||||
|
|
||||
bal_curr_start = rowcol_to_cell(row_start_partner, start_col + 5) |
|
||||
bal_curr_end = rowcol_to_cell(row_position - 1, start_col + 5) |
|
||||
cumul_balance_curr = 'SUM(' + bal_curr_start + ':' + bal_curr_end + ')' |
|
||||
|
|
||||
bal_partner_debit = rowcol_to_cell(row_position, start_col + 3) |
|
||||
bal_partner_credit = rowcol_to_cell(row_position, start_col + 4) |
|
||||
bal_partner_total = bal_partner_debit + '-' + bal_partner_credit |
|
||||
|
|
||||
c_specs = [('empty%s' % x, 1, 0, 'text', None) |
|
||||
for x in range(start_col)] |
|
||||
|
|
||||
c_specs += [ |
|
||||
# , style_bold_italic), |
|
||||
('init_bal', 1, 0, 'text', _('Cumulated Balance on Partner')), |
|
||||
('rec', 1, 0, 'text', None), |
|
||||
('empty5', 1, 0, 'text', None), |
|
||||
('debit', 1, 0, 'number', None, |
|
||||
debit_partner_total, self.style_partner_cumul_decimal), |
|
||||
('credit', 1, 0, 'number', None, |
|
||||
credit_partner_total, self.style_partner_cumul_decimal), |
|
||||
('cumul_bal', 1, 0, 'number', None, |
|
||||
bal_partner_total, self.style_partner_cumul_decimal), |
|
||||
] |
|
||||
if account.currency_id: |
|
||||
c_specs += [ |
|
||||
('cumul_bal_curr', 1, 0, 'number', None, |
|
||||
cumul_balance_curr, self.style_partner_cumul_decimal), |
|
||||
('curr_name', 1, 0, 'text', account.currency_id.name, |
|
||||
None, self.style_partner_cumul_right), |
|
||||
] |
|
||||
else: |
|
||||
c_specs += [ |
|
||||
('cumul_bal_curr', 1, 0, 'text', "-", |
|
||||
None, self.style_partner_cumul_right), |
|
||||
('curr_name', 1, 0, 'text', "", |
|
||||
None, self.style_partner_cumul_right), |
|
||||
] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_position = self.xls_write_row( |
|
||||
self.ws, row_position, row_data, self.style_partner_cumul) |
|
||||
return row_position + 1 |
|
||||
|
|
||||
# print by account the totals of the credit and debit + balance calculation |
|
||||
def print_cumul_account(self, row_position, row_start_account, account, _p, |
|
||||
data): |
|
||||
|
|
||||
# This procedure will create an Excel sumif function that will check |
|
||||
# in the column "label" for the "Cumulated Balance.." string and make a |
|
||||
# sum of the debit & credit data |
|
||||
# the text "Cumulated Balance on Partner starts in column 4 when |
|
||||
# selecting the option regroup by currency, 5 in the other case |
|
||||
start_col = 5 |
|
||||
|
|
||||
# range in which we search for the text "Cumulated Balance on Partner" |
|
||||
reference_start = rowcol_to_cell(row_start_account, start_col) |
|
||||
reference_stop = rowcol_to_cell(row_position - 1, start_col) |
|
||||
|
|
||||
# range in which we make the sum of all the cumulated balance lines |
|
||||
# (debit) |
|
||||
range_debit_start = rowcol_to_cell(row_start_account, start_col + 3) |
|
||||
range_debit_stop = rowcol_to_cell(row_position - 1, start_col + 3) |
|
||||
|
|
||||
# range in which we make the sum of all the cumulated balance lines |
|
||||
# (crebit) |
|
||||
range_credit_start = rowcol_to_cell(row_start_account, start_col + 4) |
|
||||
range_credit_stop = rowcol_to_cell(row_position - 1, start_col + 4) |
|
||||
|
|
||||
search_key = _('Cumulated Balance on Partner') |
|
||||
total_debit_account = 'SUMIF(' + reference_start + ':' + \ |
|
||||
reference_stop + ';"' + search_key + '";' + range_debit_start + \ |
|
||||
':' + range_debit_stop + ')' |
|
||||
total_credit_account = 'SUMIF(' + reference_start + ':' + \ |
|
||||
reference_stop + ';"' + search_key + '";' + range_credit_start + \ |
|
||||
':' + range_credit_stop + ')' |
|
||||
|
|
||||
bal_account_debit = rowcol_to_cell(row_position, start_col + 3) |
|
||||
bal_account_credit = rowcol_to_cell(row_position, start_col + 4) |
|
||||
bal_account_total = bal_account_debit + '-' + bal_account_credit |
|
||||
|
|
||||
bal_curr_start = rowcol_to_cell(row_start_account, start_col + 6) |
|
||||
bal_curr_end = rowcol_to_cell(row_position - 1, start_col + 6) |
|
||||
cumul_balance_curr = 'SUMIF(' + reference_start + ':' + \ |
|
||||
reference_stop + ';"' + search_key + '";' + \ |
|
||||
bal_curr_start + ':' + bal_curr_end + ')' |
|
||||
|
|
||||
c_specs = [ |
|
||||
('acc_title', start_col, 0, 'text', |
|
||||
' - '.join([account.code, account.name])), |
|
||||
('init_bal', 2, 0, 'text', |
|
||||
_('Cumulated Balance on Account')), |
|
||||
('empty2', 1, 0, 'text', None), |
|
||||
('debit', 1, 0, 'number', None, |
|
||||
total_debit_account, self.style_account_title_decimal), |
|
||||
('credit', 1, 0, 'number', None, |
|
||||
total_credit_account, self.style_account_title_decimal), |
|
||||
('balance', 1, 0, 'number', None, |
|
||||
bal_account_total, self.style_account_title_decimal), |
|
||||
] |
|
||||
if _p.amount_currency(data): |
|
||||
if account.currency_id: |
|
||||
c_specs += [('cumul_bal_curr', 1, 0, 'number', None, |
|
||||
cumul_balance_curr), |
|
||||
('curr_name', 1, 0, 'text', |
|
||||
account.currency_id.name, |
|
||||
None, self.style_account_title_right), |
|
||||
] |
|
||||
else: |
|
||||
c_specs += [('cumul_bal_curr', 1, 0, 'text', "-", None, |
|
||||
self.style_account_title_right), |
|
||||
('curr_name', 1, 0, 'text', "", |
|
||||
None, self.style_account_title_right) |
|
||||
] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_position = self.xls_write_row( |
|
||||
self.ws, row_position, row_data, self.style_account_title) |
|
||||
return row_position + 1 |
|
||||
|
|
||||
# print by account the totals of the credit and debit + balance calculation |
|
||||
def print_group_cumul_account(self, row_position, row_start_account, |
|
||||
account): |
|
||||
# This procedure will create an Excel sumif function that will check |
|
||||
# in the column "label" for the "Cumulated Balance.." string and make a |
|
||||
# sum of the debit & credit data |
|
||||
# the text "Cumulated Balance on Partner starts in column 4 when |
|
||||
# selecting the option regroup by currency, 5 in the other case |
|
||||
start_col = 4 |
|
||||
|
|
||||
# range in which we search for the text "Cumulated Balance on Partner" |
|
||||
reference_start = rowcol_to_cell(row_start_account, start_col) |
|
||||
reference_stop = rowcol_to_cell(row_position - 1, start_col) |
|
||||
|
|
||||
# range in which we make the sum of all the cumulated balance lines |
|
||||
# (debit) |
|
||||
range_debit_start = rowcol_to_cell(row_start_account, start_col + 3) |
|
||||
range_debit_stop = rowcol_to_cell(row_position - 1, start_col + 3) |
|
||||
|
|
||||
# range in which we make the sum of all the cumulated balance lines |
|
||||
# (crebit) |
|
||||
range_credit_start = rowcol_to_cell(row_start_account, start_col + 4) |
|
||||
range_credit_stop = rowcol_to_cell(row_position - 1, start_col + 4) |
|
||||
|
|
||||
search_key = _('Cumulated Balance on Partner') |
|
||||
total_debit_account = 'SUMIF(' + reference_start + ':' + \ |
|
||||
reference_stop + ';"' + search_key + '";' + range_debit_start + \ |
|
||||
':' + range_debit_stop + ')' |
|
||||
total_credit_account = 'SUMIF(' + reference_start + ':' + \ |
|
||||
reference_stop + ';"' + search_key + '";' + range_credit_start + \ |
|
||||
':' + range_credit_stop + ')' |
|
||||
|
|
||||
bal_account_debit = rowcol_to_cell(row_position, start_col + 3) |
|
||||
bal_account_credit = rowcol_to_cell(row_position, start_col + 4) |
|
||||
bal_account_total = bal_account_debit + '-' + bal_account_credit |
|
||||
|
|
||||
bal_curr_start = rowcol_to_cell(row_start_account, start_col + 6) |
|
||||
bal_curr_end = rowcol_to_cell(row_position - 1, start_col + 6) |
|
||||
cumul_balance_curr = 'SUMIF(' + reference_start + ':' + \ |
|
||||
reference_stop + ';"' + search_key + '";' + \ |
|
||||
bal_curr_start + ':' + bal_curr_end + ')' |
|
||||
|
|
||||
c_specs = [ |
|
||||
('acc_title', start_col, 0, 'text', |
|
||||
' - '.join([account.code, account.name])), |
|
||||
('init_bal', 2, 0, 'text', |
|
||||
_('Cumulated Balance on Account')), |
|
||||
('empty2', 1, 0, 'text', None), |
|
||||
('debit', 1, 0, 'number', None, |
|
||||
total_debit_account, self.style_account_title_decimal), |
|
||||
('credit', 1, 0, 'number', None, |
|
||||
total_credit_account, self.style_account_title_decimal), |
|
||||
('balance', 1, 0, 'number', None, |
|
||||
bal_account_total, self.style_account_title_decimal), |
|
||||
] |
|
||||
if account.currency_id: |
|
||||
c_specs += [('cumul_bal_curr', 1, 0, 'number', None, |
|
||||
cumul_balance_curr, self.style_account_title_decimal), |
|
||||
('curr_name', 1, 0, 'text', account.currency_id.name, |
|
||||
None, self.style_account_title_decimal), |
|
||||
] |
|
||||
else: |
|
||||
c_specs += [('cumul_bal_curr', 1, 0, 'text', "-", None, |
|
||||
self.style_account_title_right), |
|
||||
('curr_name', 1, 0, 'text', "", |
|
||||
None, self.style_account_title_right) |
|
||||
] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_position = self.xls_write_row( |
|
||||
self.ws, row_position, row_data, self.style_account_title) |
|
||||
return row_position + 1 |
|
||||
|
|
||||
# export the invoice AR/AP lines when the option currency regroup is |
|
||||
# selected |
|
||||
def print_grouped_line_report(self, row_pos, account, _xs, xlwt, _p, data): |
|
||||
|
|
||||
if account.grouped_ledger_lines and \ |
|
||||
_p['partners_order'][account.id]: |
|
||||
row_start_account = row_pos |
|
||||
|
|
||||
for partner_name, p_id, p_ref, p_name \ |
|
||||
in _p['partners_order'][account.id]: |
|
||||
row_pos = self.print_row_code_account( |
|
||||
"regroup", account, row_pos, partner_name) |
|
||||
|
|
||||
for curr, grouped_lines in account.grouped_ledger_lines.\ |
|
||||
get(p_id, []): |
|
||||
|
|
||||
row_pos = self.print_group_currency(row_pos, curr, _p) |
|
||||
# Print row: Titles "Date-Period-Entry-Journal..." |
|
||||
row_pos = self.print_columns_title( |
|
||||
_p, row_pos, data, group_lines=True) |
|
||||
|
|
||||
row_pos_start = row_pos |
|
||||
line_number = 0 |
|
||||
for line in grouped_lines: |
|
||||
line_number += 1 |
|
||||
row_pos, cumul_balance = self.print_group_lines( |
|
||||
row_pos, account, line, _p, line_number) |
|
||||
row_pos = self.print_group_cumul_partner( |
|
||||
row_pos, row_pos_start, account, _p, data) |
|
||||
|
|
||||
row_pos = self.print_group_cumul_account( |
|
||||
row_pos, row_start_account, account) |
|
||||
|
|
||||
return row_pos |
|
||||
|
|
||||
# export the invoice AR/AP lines |
|
||||
def print_ledger_lines(self, row_pos, account, _xs, xlwt, _p, data): |
|
||||
|
|
||||
if _p['ledger_lines'][account.id] \ |
|
||||
and _p['partners_order'][account.id]: |
|
||||
|
|
||||
row_start_account = row_pos |
|
||||
|
|
||||
# Print account line: code - account |
|
||||
row_pos = self.print_row_code_account( |
|
||||
"noregroup", account, row_pos, "") |
|
||||
for partner_name, p_id, p_ref, p_name \ |
|
||||
in _p['partners_order'][account.id]: |
|
||||
|
|
||||
# Print partner row |
|
||||
row_pos = self.print_row_partner(row_pos, partner_name) |
|
||||
# Print row: Titles "Date-Period-Entry-Journal..." |
|
||||
row_pos = self.print_columns_title( |
|
||||
_p, row_pos, data, group_lines=False) |
|
||||
|
|
||||
row_pos_start = row_pos |
|
||||
line_number = 0 |
|
||||
for line in _p['ledger_lines'][account.id].get(p_id, []): |
|
||||
line_number += 1 |
|
||||
# print ledger lines |
|
||||
row_pos = self.print_lines( |
|
||||
row_pos, account, line, _p, data, line_number) |
|
||||
row_pos = self.print_cumul_partner( |
|
||||
row_pos, row_pos_start, account, _p, data) |
|
||||
|
|
||||
row_pos = self.print_cumul_account( |
|
||||
row_pos, row_start_account, account, _p, data) |
|
||||
|
|
||||
return row_pos |
|
||||
|
|
||||
def generate_xls_report(self, _p, _xs, data, objects, wb): # main function |
|
||||
|
|
||||
# Initializations |
|
||||
self.global_initializations(wb, _p, xlwt, _xs, objects, data) |
|
||||
row_pos = 0 |
|
||||
# Print Title |
|
||||
row_pos = self.print_title(_p, row_pos) |
|
||||
# Print empty row to define column sizes |
|
||||
row_pos = self.print_empty_row(row_pos) |
|
||||
# Print Header Table titles (Fiscal Year - Accounts Filter - Periods |
|
||||
# Filter...) |
|
||||
row_pos = self.print_header_titles(_p, data, row_pos) |
|
||||
# Print Header Table data |
|
||||
row_pos = self.print_header_data(_p, data, row_pos) |
|
||||
# Freeze the line |
|
||||
self.ws.set_horz_split_pos(row_pos) |
|
||||
# Print empty row |
|
||||
row_pos = self.print_empty_row(row_pos) |
|
||||
|
|
||||
for acc in objects: |
|
||||
if hasattr(acc, 'grouped_ledger_lines'): |
|
||||
# call xls equivalent of |
|
||||
# "grouped_by_curr_open_invoices_inclusion.mako.html" |
|
||||
row_pos = self.print_grouped_line_report( |
|
||||
row_pos, acc, _xs, xlwt, _p, data) |
|
||||
else: |
|
||||
# call xls equivalent of "open_invoices_inclusion.mako.html" |
|
||||
row_pos = self.print_ledger_lines( |
|
||||
row_pos, acc, _xs, xlwt, _p, data) |
|
||||
row_pos += 1 |
|
||||
|
|
||||
open_invoices_xls('report.account.account_report_open_invoices_xls', |
|
||||
'account.account', parser=PartnersOpenInvoicesWebkit) |
|
@ -1,461 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# OpenERP, Open Source Management Solution |
|
||||
# |
|
||||
# Copyright (c) 2013 Noviat nv/sa (www.noviat.com). All rights reserved. |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
import xlwt |
|
||||
from datetime import datetime |
|
||||
from openerp.addons.report_xls.report_xls import report_xls |
|
||||
from openerp.addons.report_xls.utils import rowcol_to_cell |
|
||||
from openerp.addons.account_financial_report_webkit.report.partners_ledger \ |
|
||||
import PartnersLedgerWebkit |
|
||||
from openerp.tools.translate import _ |
|
||||
# import logging |
|
||||
# _logger = logging.getLogger(__name__) |
|
||||
|
|
||||
_column_sizes = [ |
|
||||
('date', 12), |
|
||||
('period', 12), |
|
||||
('move', 20), |
|
||||
('journal', 12), |
|
||||
('partner', 30), |
|
||||
('label', 58), |
|
||||
('rec', 12), |
|
||||
('debit', 15), |
|
||||
('credit', 15), |
|
||||
('cumul_bal', 15), |
|
||||
('curr_bal', 15), |
|
||||
('curr_code', 7), |
|
||||
] |
|
||||
|
|
||||
|
|
||||
class partner_ledger_xls(report_xls): |
|
||||
column_sizes = [x[1] for x in _column_sizes] |
|
||||
|
|
||||
def generate_xls_report(self, _p, _xs, data, objects, wb): |
|
||||
|
|
||||
ws = wb.add_sheet(_p.report_name[:31]) |
|
||||
ws.panes_frozen = True |
|
||||
ws.remove_splits = True |
|
||||
ws.portrait = 0 # Landscape |
|
||||
ws.fit_width_to_pages = 1 |
|
||||
row_pos = 0 |
|
||||
|
|
||||
# set print header/footer |
|
||||
ws.header_str = self.xls_headers['standard'] |
|
||||
ws.footer_str = self.xls_footers['standard'] |
|
||||
|
|
||||
# cf. account_report_partner_ledger.mako |
|
||||
initial_balance_text = {'initial_balance': _('Computed'), |
|
||||
'opening_balance': _('Opening Entries'), |
|
||||
False: _('No')} |
|
||||
|
|
||||
# Title |
|
||||
cell_style = xlwt.easyxf(_xs['xls_title']) |
|
||||
report_name = ' - '.join([_p.report_name.upper(), |
|
||||
_p.company.partner_id.name, |
|
||||
_p.company.currency_id.name]) |
|
||||
c_specs = [ |
|
||||
('report_name', 1, 0, 'text', report_name), |
|
||||
] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, row_style=cell_style) |
|
||||
|
|
||||
# write empty row to define column sizes |
|
||||
c_sizes = self.column_sizes |
|
||||
c_specs = [('empty%s' % i, 1, c_sizes[i], 'text', None) |
|
||||
for i in range(0, len(c_sizes))] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, set_column_size=True) |
|
||||
|
|
||||
# Header Table |
|
||||
nbr_columns = 10 |
|
||||
if _p.amount_currency(data): |
|
||||
nbr_columns = 12 |
|
||||
cell_format = _xs['bold'] + _xs['fill_blue'] + _xs['borders_all'] |
|
||||
cell_style = xlwt.easyxf(cell_format) |
|
||||
cell_style_center = xlwt.easyxf(cell_format + _xs['center']) |
|
||||
c_specs = [ |
|
||||
('coa', 2, 0, 'text', _('Chart of Account')), |
|
||||
('fy', 1, 0, 'text', _('Fiscal Year')), |
|
||||
('df', 2, 0, 'text', _p.filter_form(data) == |
|
||||
'filter_date' and _('Dates Filter') or _('Periods Filter')), |
|
||||
('af', 1, 0, 'text', _('Accounts Filter')), |
|
||||
('tm', 2, 0, 'text', _('Target Moves')), |
|
||||
('ib', nbr_columns - 8, 0, 'text', _('Initial Balance')), |
|
||||
|
|
||||
] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, row_style=cell_style_center) |
|
||||
|
|
||||
cell_format = _xs['borders_all'] |
|
||||
cell_style = xlwt.easyxf(cell_format) |
|
||||
cell_style_center = xlwt.easyxf(cell_format + _xs['center']) |
|
||||
c_specs = [ |
|
||||
('coa', 2, 0, 'text', _p.chart_account.name), |
|
||||
('fy', 1, 0, 'text', _p.fiscalyear.name if _p.fiscalyear else '-'), |
|
||||
] |
|
||||
df = _('From') + ': ' |
|
||||
if _p.filter_form(data) == 'filter_date': |
|
||||
df += _p.start_date if _p.start_date else u'' |
|
||||
else: |
|
||||
df += _p.start_period.name if _p.start_period else u'' |
|
||||
df += ' ' + _('To') + ': ' |
|
||||
if _p.filter_form(data) == 'filter_date': |
|
||||
df += _p.stop_date if _p.stop_date else u'' |
|
||||
else: |
|
||||
df += _p.stop_period.name if _p.stop_period else u'' |
|
||||
c_specs += [ |
|
||||
('df', 2, 0, 'text', df), |
|
||||
('af', 1, 0, 'text', _('Custom Filter') |
|
||||
if _p.partner_ids else _p.display_partner_account(data)), |
|
||||
('tm', 2, 0, 'text', _p.display_target_move(data)), |
|
||||
('ib', nbr_columns - 8, 0, 'text', |
|
||||
initial_balance_text[_p.initial_balance_mode]), |
|
||||
] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, row_style=cell_style_center) |
|
||||
ws.set_horz_split_pos(row_pos) |
|
||||
row_pos += 1 |
|
||||
|
|
||||
# Account Title Row |
|
||||
cell_format = _xs['xls_title'] + _xs['bold'] + \ |
|
||||
_xs['fill'] + _xs['borders_all'] |
|
||||
account_cell_style = xlwt.easyxf(cell_format) |
|
||||
account_cell_style_right = xlwt.easyxf(cell_format + _xs['right']) |
|
||||
account_cell_style_decimal = xlwt.easyxf( |
|
||||
cell_format + _xs['right'], |
|
||||
num_format_str=report_xls.decimal_format) |
|
||||
|
|
||||
# Column Title Row |
|
||||
cell_format = _xs['bold'] |
|
||||
c_title_cell_style = xlwt.easyxf(cell_format) |
|
||||
|
|
||||
# Column Header Row |
|
||||
cell_format = _xs['bold'] + _xs['fill'] + _xs['borders_all'] |
|
||||
c_hdr_cell_style = xlwt.easyxf(cell_format) |
|
||||
c_hdr_cell_style_right = xlwt.easyxf(cell_format + _xs['right']) |
|
||||
c_hdr_cell_style_center = xlwt.easyxf(cell_format + _xs['center']) |
|
||||
|
|
||||
# Column Initial Balance Row |
|
||||
cell_format = _xs['italic'] + _xs['borders_all'] |
|
||||
c_init_cell_style = xlwt.easyxf(cell_format) |
|
||||
c_init_cell_style_decimal = xlwt.easyxf( |
|
||||
cell_format + _xs['right'], |
|
||||
num_format_str=report_xls.decimal_format) |
|
||||
|
|
||||
# Column Cumulated balance Row |
|
||||
cell_format = _xs['bold'] + _xs['fill'] + _xs['borders_all'] |
|
||||
c_cumul_cell_style = xlwt.easyxf(cell_format) |
|
||||
c_cumul_cell_style_right = xlwt.easyxf(cell_format + _xs['right']) |
|
||||
c_cumul_cell_style_center = xlwt.easyxf(cell_format + _xs['center']) |
|
||||
c_cumul_cell_style_decimal = xlwt.easyxf( |
|
||||
cell_format + _xs['right'], |
|
||||
num_format_str=report_xls.decimal_format) |
|
||||
|
|
||||
# Column Partner Row |
|
||||
cell_format = _xs['bold'] |
|
||||
c_part_cell_style = xlwt.easyxf(cell_format) |
|
||||
|
|
||||
c_specs = [ |
|
||||
('date', 1, 0, 'text', _('Date'), None, c_hdr_cell_style), |
|
||||
('period', 1, 0, 'text', _('Period'), None, c_hdr_cell_style), |
|
||||
('move', 1, 0, 'text', _('Entry'), None, c_hdr_cell_style), |
|
||||
('journal', 1, 0, 'text', _('Journal'), None, c_hdr_cell_style), |
|
||||
('partner', 1, 0, 'text', _('Partner'), None, c_hdr_cell_style), |
|
||||
('label', 1, 0, 'text', _('Label'), None, c_hdr_cell_style), |
|
||||
('rec', 1, 0, 'text', _('Rec.'), None, c_hdr_cell_style), |
|
||||
('debit', 1, 0, 'text', _('Debit'), None, c_hdr_cell_style_right), |
|
||||
('credit', 1, 0, 'text', _('Credit'), |
|
||||
None, c_hdr_cell_style_right), |
|
||||
('cumul_bal', 1, 0, 'text', _('Cumul. Bal.'), |
|
||||
None, c_hdr_cell_style_right), |
|
||||
] |
|
||||
if _p.amount_currency(data): |
|
||||
c_specs += [ |
|
||||
('curr_bal', 1, 0, 'text', _('Curr. Bal.'), |
|
||||
None, c_hdr_cell_style_right), |
|
||||
('curr_code', 1, 0, 'text', _('Curr.'), |
|
||||
None, c_hdr_cell_style_center), |
|
||||
] |
|
||||
c_hdr_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
|
|
||||
# cell styles for ledger lines |
|
||||
ll_cell_format = _xs['borders_all'] |
|
||||
ll_cell_style = xlwt.easyxf(ll_cell_format) |
|
||||
ll_cell_style_center = xlwt.easyxf(ll_cell_format + _xs['center']) |
|
||||
ll_cell_style_date = xlwt.easyxf( |
|
||||
ll_cell_format + _xs['left'], |
|
||||
num_format_str=report_xls.date_format) |
|
||||
ll_cell_style_decimal = xlwt.easyxf( |
|
||||
ll_cell_format + _xs['right'], |
|
||||
num_format_str=report_xls.decimal_format) |
|
||||
|
|
||||
cnt = 0 |
|
||||
for account in objects: |
|
||||
if _p['ledger_lines'].get(account.id, False) or \ |
|
||||
_p['init_balance'].get(account.id, False): |
|
||||
if not _p['partners_order'].get(account.id, False): |
|
||||
continue |
|
||||
cnt += 1 |
|
||||
account_total_debit = 0.0 |
|
||||
account_total_credit = 0.0 |
|
||||
account_balance_cumul = 0.0 |
|
||||
account_balance_cumul_curr = 0.0 |
|
||||
c_specs = [ |
|
||||
('acc_title', nbr_columns, 0, 'text', |
|
||||
' - '.join([account.code, account.name]), None, |
|
||||
account_cell_style), |
|
||||
] |
|
||||
row_data = self.xls_row_template( |
|
||||
c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, c_title_cell_style) |
|
||||
row_pos += 1 |
|
||||
|
|
||||
for partner_name, p_id, p_ref, p_name in \ |
|
||||
_p['partners_order'][account.id]: |
|
||||
|
|
||||
total_debit = 0.0 |
|
||||
total_credit = 0.0 |
|
||||
cumul_balance = 0.0 |
|
||||
cumul_balance_curr = 0.0 |
|
||||
part_cumul_balance = 0.0 |
|
||||
part_cumul_balance_curr = 0.0 |
|
||||
c_specs = [ |
|
||||
('partner_title', nbr_columns, 0, 'text', |
|
||||
partner_name or _('No Partner'), None, |
|
||||
c_part_cell_style), |
|
||||
] |
|
||||
row_data = self.xls_row_template( |
|
||||
c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, c_title_cell_style) |
|
||||
row_pos = self.xls_write_row(ws, row_pos, c_hdr_data) |
|
||||
row_start_partner = row_pos |
|
||||
|
|
||||
total_debit = _p['init_balance'][account.id].get( |
|
||||
p_id, {}).get('debit') or 0.0 |
|
||||
total_credit = _p['init_balance'][account.id].get( |
|
||||
p_id, {}).get('credit') or 0.0 |
|
||||
|
|
||||
init_line = False |
|
||||
if _p.initial_balance_mode and \ |
|
||||
(total_debit or total_credit): |
|
||||
init_line = True |
|
||||
|
|
||||
part_cumul_balance = \ |
|
||||
_p['init_balance'][account.id].get( |
|
||||
p_id, {}).get('init_balance') or 0.0 |
|
||||
part_cumul_balance_curr = \ |
|
||||
_p['init_balance'][account.id].get( |
|
||||
p_id, {}).get('init_balance_currency') or 0.0 |
|
||||
balance_forward_currency = \ |
|
||||
_p['init_balance'][account.id].get( |
|
||||
p_id, {}).get('currency_name') or '' |
|
||||
|
|
||||
cumul_balance += part_cumul_balance |
|
||||
cumul_balance_curr += part_cumul_balance_curr |
|
||||
|
|
||||
debit_cell = rowcol_to_cell(row_pos, 7) |
|
||||
credit_cell = rowcol_to_cell(row_pos, 8) |
|
||||
init_bal_formula = debit_cell + '-' + credit_cell |
|
||||
|
|
||||
# Print row 'Initial Balance' by partn |
|
||||
c_specs = [('empty%s' % x, 1, 0, 'text', None) |
|
||||
for x in range(5)] |
|
||||
c_specs += [ |
|
||||
('init_bal', 1, 0, 'text', _('Initial Balance')), |
|
||||
('rec', 1, 0, 'text', None), |
|
||||
('debit', 1, 0, 'number', total_debit, |
|
||||
None, c_init_cell_style_decimal), |
|
||||
('credit', 1, 0, 'number', total_credit, |
|
||||
None, c_init_cell_style_decimal), |
|
||||
('cumul_bal', 1, 0, 'number', None, |
|
||||
init_bal_formula, c_init_cell_style_decimal), |
|
||||
] |
|
||||
if _p.amount_currency(data): |
|
||||
c_specs += [ |
|
||||
('curr_bal', 1, 0, 'number', |
|
||||
part_cumul_balance_curr, |
|
||||
None, c_init_cell_style_decimal), |
|
||||
('curr_code', 1, 0, 'text', |
|
||||
balance_forward_currency), |
|
||||
] |
|
||||
row_data = self.xls_row_template( |
|
||||
c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, c_init_cell_style) |
|
||||
|
|
||||
for line in _p['ledger_lines'][account.id].get(p_id, []): |
|
||||
|
|
||||
total_debit += line.get('debit') or 0.0 |
|
||||
total_credit += line.get('credit') or 0.0 |
|
||||
|
|
||||
label_elements = [line.get('lname') or ''] |
|
||||
if line.get('invoice_number'): |
|
||||
label_elements.append( |
|
||||
"(%s)" % (line['invoice_number'],)) |
|
||||
label = ' '.join(label_elements) |
|
||||
cumul_balance += line.get('balance') or 0.0 |
|
||||
|
|
||||
if init_line or row_pos > row_start_partner: |
|
||||
cumbal_formula = rowcol_to_cell( |
|
||||
row_pos - 1, 9) + '+' |
|
||||
else: |
|
||||
cumbal_formula = '' |
|
||||
debit_cell = rowcol_to_cell(row_pos, 7) |
|
||||
credit_cell = rowcol_to_cell(row_pos, 8) |
|
||||
cumbal_formula += debit_cell + '-' + credit_cell |
|
||||
# Print row ledger line data # |
|
||||
|
|
||||
if line.get('ldate'): |
|
||||
c_specs = [ |
|
||||
('ldate', 1, 0, 'date', datetime.strptime( |
|
||||
line['ldate'], '%Y-%m-%d'), None, |
|
||||
ll_cell_style_date), |
|
||||
] |
|
||||
else: |
|
||||
c_specs = [ |
|
||||
('ldate', 1, 0, 'text', None), |
|
||||
] |
|
||||
c_specs += [ |
|
||||
('period', 1, 0, 'text', |
|
||||
line.get('period_code') or ''), |
|
||||
('move', 1, 0, 'text', |
|
||||
line.get('move_name') or ''), |
|
||||
('journal', 1, 0, 'text', line.get('jcode') or ''), |
|
||||
('partner', 1, 0, 'text', |
|
||||
line.get('partner_name') or ''), |
|
||||
('label', 1, 0, 'text', label), |
|
||||
('rec_name', 1, 0, 'text', |
|
||||
line.get('rec_name') or ''), |
|
||||
('debit', 1, 0, 'number', line.get('debit'), |
|
||||
None, ll_cell_style_decimal), |
|
||||
('credit', 1, 0, 'number', line.get('credit'), |
|
||||
None, ll_cell_style_decimal), |
|
||||
('cumul_bal', 1, 0, 'number', None, |
|
||||
cumbal_formula, ll_cell_style_decimal), |
|
||||
] |
|
||||
if _p.amount_currency(data): |
|
||||
c_specs += [ |
|
||||
('curr_bal', 1, 0, 'number', line.get( |
|
||||
'amount_currency') or 0.0, None, |
|
||||
ll_cell_style_decimal), |
|
||||
('curr_code', 1, 0, 'text', line.get( |
|
||||
'currency_code') or '', None, |
|
||||
ll_cell_style_center), |
|
||||
] |
|
||||
row_data = self.xls_row_template( |
|
||||
c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, ll_cell_style) |
|
||||
# end for line |
|
||||
|
|
||||
# Print row Cumulated Balance by partner # |
|
||||
debit_partner_start = rowcol_to_cell(row_start_partner, 7) |
|
||||
debit_partner_end = rowcol_to_cell(row_pos - 1, 7) |
|
||||
debit_partner_total = 'SUM(' + debit_partner_start + \ |
|
||||
':' + debit_partner_end + ')' |
|
||||
|
|
||||
credit_partner_start = rowcol_to_cell(row_start_partner, 8) |
|
||||
credit_partner_end = rowcol_to_cell(row_pos - 1, 8) |
|
||||
credit_partner_total = 'SUM(' + credit_partner_start + \ |
|
||||
':' + credit_partner_end + ')' |
|
||||
|
|
||||
bal_partner_debit = rowcol_to_cell(row_pos, 7) |
|
||||
bal_partner_credit = rowcol_to_cell(row_pos, 8) |
|
||||
bal_partner_total = bal_partner_debit + \ |
|
||||
'-' + bal_partner_credit |
|
||||
|
|
||||
c_specs = [('empty%s' % x, 1, 0, 'text', None) |
|
||||
for x in range(5)] |
|
||||
c_specs += [ |
|
||||
('init_bal', 1, 0, 'text', |
|
||||
_('Cumulated balance on Partner')), |
|
||||
('rec', 1, 0, 'text', None), |
|
||||
('debit', 1, 0, 'number', None, |
|
||||
debit_partner_total, c_cumul_cell_style_decimal), |
|
||||
('credit', 1, 0, 'number', None, |
|
||||
credit_partner_total, c_cumul_cell_style_decimal), |
|
||||
('cumul_bal', 1, 0, 'number', None, |
|
||||
bal_partner_total, c_cumul_cell_style_decimal), |
|
||||
] |
|
||||
if _p.amount_currency(data): |
|
||||
if account.currency_id: |
|
||||
c_specs += [('curr_bal', 1, 0, 'number', |
|
||||
cumul_balance_curr or 0.0, None, |
|
||||
c_cumul_cell_style_decimal)] |
|
||||
else: |
|
||||
c_specs += [('curr_bal', 1, 0, 'text', |
|
||||
'-', None, c_cumul_cell_style_right)] |
|
||||
c_specs += [('curr_code', 1, 0, 'text', |
|
||||
account.currency_id.name if |
|
||||
account.currency_id else u'', None, |
|
||||
c_cumul_cell_style_center)] |
|
||||
row_data = self.xls_row_template( |
|
||||
c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, c_cumul_cell_style) |
|
||||
row_pos += 1 |
|
||||
account_total_debit += total_debit |
|
||||
account_total_credit += total_credit |
|
||||
account_balance_cumul += cumul_balance |
|
||||
account_balance_cumul_curr += cumul_balance_curr |
|
||||
|
|
||||
# Print row Cumulated Balance by account # |
|
||||
c_specs = [ |
|
||||
('acc_title', 5, 0, 'text', ' - '. |
|
||||
join([account.code, account.name])), ] |
|
||||
c_specs += [ |
|
||||
('label', 1, 0, 'text', _('Cumulated balance on Account')), |
|
||||
('rec', 1, 0, 'text', None), |
|
||||
('debit', 1, 0, 'number', account_total_debit, |
|
||||
None, account_cell_style_decimal), |
|
||||
('credit', 1, 0, 'number', account_total_credit, |
|
||||
None, account_cell_style_decimal), |
|
||||
('cumul_bal', 1, 0, 'number', account_balance_cumul, |
|
||||
None, account_cell_style_decimal), |
|
||||
] |
|
||||
if _p.amount_currency(data): |
|
||||
if account.currency_id: |
|
||||
c_specs += [('curr_bal', 1, 0, 'number', |
|
||||
account_balance_cumul_curr or 0.0, None, |
|
||||
account_cell_style_decimal)] |
|
||||
else: |
|
||||
c_specs += [('curr_bal', 1, 0, 'text', |
|
||||
'-', None, account_cell_style_right)] |
|
||||
c_specs += [('curr_code', 1, 0, 'text', |
|
||||
account.currency_id.name if |
|
||||
account.currency_id else u'', None, |
|
||||
account_cell_style)] |
|
||||
row_data = self.xls_row_template( |
|
||||
c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, account_cell_style) |
|
||||
row_pos += 2 |
|
||||
|
|
||||
partner_ledger_xls('report.account.account_report_partner_ledger_xls', |
|
||||
'account.account', |
|
||||
parser=PartnersLedgerWebkit) |
|
@ -1,432 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# OpenERP, Open Source Management Solution |
|
||||
# |
|
||||
# Copyright (c) 2013 Noviat nv/sa (www.noviat.com). All rights reserved. |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
import xlwt |
|
||||
from openerp.addons.report_xls.report_xls import report_xls |
|
||||
from openerp.addons.report_xls.utils import rowcol_to_cell |
|
||||
from openerp.addons.account_financial_report_webkit.report.partner_balance \ |
|
||||
import PartnerBalanceWebkit |
|
||||
from openerp.tools.translate import _ |
|
||||
# import logging |
|
||||
# _logger = logging.getLogger(__name__) |
|
||||
|
|
||||
|
|
||||
def display_line(all_comparison_lines): |
|
||||
return any([line.get('balance') for line in all_comparison_lines]) |
|
||||
|
|
||||
|
|
||||
class partners_balance_xls(report_xls): |
|
||||
column_sizes = [12, 40, 25, 17, 17, 17, 17, 17] |
|
||||
|
|
||||
def print_title(self, ws, _p, row_position, xlwt, _xs): |
|
||||
cell_style = xlwt.easyxf(_xs['xls_title']) |
|
||||
report_name = ' - '.join([_p.report_name.upper(), |
|
||||
_p.company.partner_id.name, |
|
||||
_p.company.currency_id.name]) |
|
||||
c_specs = [ |
|
||||
('report_name', 1, 0, 'text', report_name), |
|
||||
] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_position = self.xls_write_row( |
|
||||
ws, row_position, row_data, row_style=cell_style) |
|
||||
return row_position |
|
||||
|
|
||||
def print_empty_row(self, ws, row_position): |
|
||||
c_sizes = self.column_sizes |
|
||||
c_specs = [('empty%s' % i, 1, c_sizes[i], 'text', None) |
|
||||
for i in range(0, len(c_sizes))] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_position = self.xls_write_row( |
|
||||
ws, row_position, row_data, set_column_size=True) |
|
||||
return row_position |
|
||||
|
|
||||
def print_header_titles(self, ws, _p, data, row_position, xlwt, _xs): |
|
||||
cell_format = _xs['bold'] + _xs['fill_blue'] + _xs['borders_all'] |
|
||||
cell_style = xlwt.easyxf(cell_format) |
|
||||
cell_style_center = xlwt.easyxf(cell_format + _xs['center']) |
|
||||
|
|
||||
c_specs = [ |
|
||||
('fy', 1, 0, 'text', _('Fiscal Year'), None, cell_style_center), |
|
||||
('af', 1, 0, 'text', _('Accounts Filter'), |
|
||||
None, cell_style_center), |
|
||||
('df', 1, 0, 'text', _p.filter_form(data) == 'filter_date' and _( |
|
||||
'Dates Filter') or _('Periods Filter'), None, |
|
||||
cell_style_center), |
|
||||
('pf', 1, 0, 'text', _('Partners Filter'), |
|
||||
None, cell_style_center), |
|
||||
('tm', 1, 0, 'text', _('Target Moves'), None, cell_style_center), |
|
||||
('ib', 1, 0, 'text', _('Initial Balance'), |
|
||||
None, cell_style_center), |
|
||||
('coa', 1, 0, 'text', _('Chart of Account'), |
|
||||
None, cell_style_center), |
|
||||
] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_position = self.xls_write_row( |
|
||||
ws, row_position, row_data, row_style=cell_style) |
|
||||
return row_position |
|
||||
|
|
||||
def print_header_data(self, ws, _p, data, row_position, xlwt, _xs, |
|
||||
initial_balance_text): |
|
||||
cell_format = _xs['borders_all'] + _xs['wrap'] + _xs['top'] |
|
||||
cell_style = xlwt.easyxf(cell_format) |
|
||||
cell_style_center = xlwt.easyxf(cell_format + _xs['center']) |
|
||||
c_specs = [ |
|
||||
('fy', 1, 0, 'text', _p.fiscalyear.name if _p.fiscalyear else '-', |
|
||||
None, cell_style_center), |
|
||||
('af', 1, 0, 'text', _p.accounts(data) and ', '.join( |
|
||||
[account.code for account in _p.accounts(data)]) or _('All'), |
|
||||
None, cell_style_center), |
|
||||
] |
|
||||
df = _('From') + ': ' |
|
||||
if _p.filter_form(data) == 'filter_date': |
|
||||
df += _p.start_date if _p.start_date else u'' |
|
||||
else: |
|
||||
df += _p.start_period.name if _p.start_period else u'' |
|
||||
df += ' ' + _('\nTo') + ': ' |
|
||||
if _p.filter_form(data) == 'filter_date': |
|
||||
df += _p.stop_date if _p.stop_date else u'' |
|
||||
else: |
|
||||
df += _p.stop_period.name if _p.stop_period else u'' |
|
||||
c_specs += [ |
|
||||
('df', 1, 0, 'text', df, None, cell_style_center), |
|
||||
('tm', 1, 0, 'text', _p.display_partner_account( |
|
||||
data), None, cell_style_center), |
|
||||
('pf', 1, 0, 'text', _p.display_target_move( |
|
||||
data), None, cell_style_center), |
|
||||
('ib', 1, 0, 'text', initial_balance_text[ |
|
||||
_p.initial_balance_mode], None, cell_style_center), |
|
||||
('coa', 1, 0, 'text', _p.chart_account.name, |
|
||||
None, cell_style_center), |
|
||||
] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_position = self.xls_write_row( |
|
||||
ws, row_position, row_data, row_style=cell_style) |
|
||||
return row_position |
|
||||
|
|
||||
def print_comparison_header(self, _xs, xlwt, row_position, _p, ws, |
|
||||
initial_balance_text): |
|
||||
cell_format_ct = _xs['bold'] + _xs['fill_blue'] + _xs['borders_all'] |
|
||||
cell_style_ct = xlwt.easyxf(cell_format_ct) |
|
||||
c_specs = [('ct', 7, 0, 'text', _('Comparisons'))] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_position = self.xls_write_row( |
|
||||
ws, row_position, row_data, row_style=cell_style_ct) |
|
||||
cell_format = _xs['borders_all'] + _xs['wrap'] + _xs['top'] |
|
||||
cell_style_center = xlwt.easyxf(cell_format) |
|
||||
for index, params in enumerate(_p.comp_params): |
|
||||
c_specs = [ |
|
||||
('c', 2, 0, 'text', _('Comparison') + str(index + 1) + |
|
||||
' (C' + str(index + 1) + ')')] |
|
||||
if params['comparison_filter'] == 'filter_date': |
|
||||
c_specs += [ |
|
||||
('f', 2, 0, 'text', |
|
||||
_('Dates Filter') + ': ' + |
|
||||
_p.formatLang(params['start'], date=True) + ' - ' + |
|
||||
_p.formatLang(params['stop'], date=True))] |
|
||||
elif params['comparison_filter'] == 'filter_period': |
|
||||
c_specs += [('f', 2, 0, 'text', _('Periods Filter') + |
|
||||
': ' + params['start'].name + ' - ' + |
|
||||
params['stop'].name)] |
|
||||
else: |
|
||||
c_specs += [('f', 2, 0, 'text', _('Fiscal Year') + |
|
||||
': ' + params['fiscalyear'].name)] |
|
||||
c_specs += [('ib', 2, 0, 'text', _('Initial Balance') + |
|
||||
': ' + |
|
||||
initial_balance_text[params['initial_balance_mode']])] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_position = self.xls_write_row( |
|
||||
ws, row_position, row_data, row_style=cell_style_center) |
|
||||
return row_position |
|
||||
|
|
||||
def print_account_header(self, ws, _p, _xs, xlwt, row_position): |
|
||||
cell_format = _xs['bold'] + _xs['fill'] + \ |
|
||||
_xs['borders_all'] + _xs['wrap'] + _xs['top'] |
|
||||
cell_style = xlwt.easyxf(cell_format) |
|
||||
cell_style_right = xlwt.easyxf(cell_format + _xs['right']) |
|
||||
cell_style_center = xlwt.easyxf(cell_format + _xs['center']) |
|
||||
if len(_p.comp_params) == 2: |
|
||||
account_span = 3 |
|
||||
else: |
|
||||
account_span = _p.initial_balance_mode and 2 or 3 |
|
||||
c_specs = [ |
|
||||
('account', account_span, 0, 'text', _('Account / Partner Name')), |
|
||||
('code', 1, 0, 'text', _('Code / Ref')), |
|
||||
] |
|
||||
if _p.comparison_mode == 'no_comparison': |
|
||||
if _p.initial_balance_mode: |
|
||||
c_specs += [('init_bal', 1, 0, 'text', |
|
||||
_('Initial Balance'), None, cell_style_right)] |
|
||||
c_specs += [ |
|
||||
('debit', 1, 0, 'text', _('Debit'), None, cell_style_right), |
|
||||
('credit', 1, 0, 'text', _('Credit'), None, cell_style_right), |
|
||||
] |
|
||||
|
|
||||
if _p.comparison_mode == 'no_comparison' or not _p.fiscalyear: |
|
||||
c_specs += [('balance', 1, 0, 'text', |
|
||||
_('Balance'), None, cell_style_right)] |
|
||||
else: |
|
||||
c_specs += [('balance_fy', 1, 0, 'text', _('Balance %s') % |
|
||||
_p.fiscalyear.name, None, cell_style_right)] |
|
||||
if _p.comparison_mode in ('single', 'multiple'): |
|
||||
for index in range(_p.nb_comparison): |
|
||||
if _p.comp_params[index][ |
|
||||
'comparison_filter'] == 'filter_year' \ |
|
||||
and _p.comp_params[index].get('fiscalyear', False): |
|
||||
c_specs += [('balance_%s' % index, 1, 0, 'text', |
|
||||
_('Balance %s') % |
|
||||
_p.comp_params[index]['fiscalyear'].name, |
|
||||
None, cell_style_right)] |
|
||||
else: |
|
||||
c_specs += [('balance_%s' % index, 1, 0, 'text', |
|
||||
_('Balance C%s') % (index + 1), None, |
|
||||
cell_style_right)] |
|
||||
if _p.comparison_mode == 'single': |
|
||||
c_specs += [ |
|
||||
('diff', 1, 0, 'text', _('Difference'), |
|
||||
None, cell_style_right), |
|
||||
('diff_percent', 1, 0, 'text', |
|
||||
_('% Difference'), None, cell_style_center), |
|
||||
] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_position = self.xls_write_row( |
|
||||
ws, row_position, row_data, row_style=cell_style) |
|
||||
return row_position |
|
||||
|
|
||||
def print_row_code_account(self, ws, current_account, row_position, _xs, |
|
||||
xlwt): |
|
||||
cell_format = _xs['xls_title'] + _xs['bold'] + \ |
|
||||
_xs['fill'] + _xs['borders_all'] |
|
||||
cell_style = xlwt.easyxf(cell_format) |
|
||||
c_specs = [ |
|
||||
('acc_title', 7, 0, 'text', ' - '.join([current_account.code, |
|
||||
current_account.name])), ] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_position = self.xls_write_row( |
|
||||
ws, row_position, row_data, cell_style) |
|
||||
return row_position |
|
||||
|
|
||||
def print_account_totals(self, _xs, xlwt, ws, row_start_account, |
|
||||
row_position, current_account, _p): |
|
||||
cell_format = _xs['bold'] + _xs['fill'] + \ |
|
||||
_xs['borders_all'] + _xs['wrap'] + _xs['top'] |
|
||||
cell_style = xlwt.easyxf(cell_format) |
|
||||
cell_style_decimal = xlwt.easyxf( |
|
||||
cell_format + _xs['right'], |
|
||||
num_format_str=report_xls.decimal_format) |
|
||||
c_specs = [ |
|
||||
('acc_title', 2, 0, 'text', current_account.name), |
|
||||
('code', 1, 0, 'text', current_account.code), |
|
||||
] |
|
||||
for column in range(3, 7): |
|
||||
# in case of one single comparison, the column 6 will contain |
|
||||
# percentages |
|
||||
if (_p.comparison_mode == 'single' and column == 6): |
|
||||
total_diff = rowcol_to_cell(row_position, column - 1) |
|
||||
total_balance = rowcol_to_cell(row_position, column - 2) |
|
||||
account_formula = 'Round(' + total_diff + \ |
|
||||
'/' + total_balance + '*100;0)' |
|
||||
else: |
|
||||
account_start = rowcol_to_cell(row_start_account, column) |
|
||||
account_end = rowcol_to_cell(row_position - 1, column) |
|
||||
account_formula = 'Round(SUM(' + \ |
|
||||
account_start + ':' + account_end + ');2)' |
|
||||
c_specs += [('total%s' % column, 1, 0, 'text', None, |
|
||||
account_formula, None, cell_style_decimal)] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_position = self.xls_write_row( |
|
||||
ws, row_position, row_data, cell_style) |
|
||||
return row_position + 1 |
|
||||
|
|
||||
def generate_xls_report(self, _p, _xs, data, objects, wb): |
|
||||
|
|
||||
# Initialisations |
|
||||
ws = wb.add_sheet(_p.report_name[:31]) |
|
||||
ws.panes_frozen = True |
|
||||
ws.remove_splits = True |
|
||||
ws.portrait = 0 # Landscape |
|
||||
ws.fit_width_to_pages = 1 |
|
||||
row_pos = 0 |
|
||||
ws.header_str = self.xls_headers['standard'] |
|
||||
ws.footer_str = self.xls_footers['standard'] |
|
||||
|
|
||||
# Print Title |
|
||||
row_pos = self.print_title(ws, _p, row_pos, xlwt, _xs) |
|
||||
# Print empty row to define column sizes |
|
||||
row_pos = self.print_empty_row(ws, row_pos) |
|
||||
# Print Header Table titles (Fiscal Year - Accounts Filter - Periods |
|
||||
# Filter...) |
|
||||
row_pos = self.print_header_titles(ws, _p, data, row_pos, xlwt, _xs) |
|
||||
|
|
||||
initial_balance_text = { |
|
||||
'initial_balance': _('Computed'), |
|
||||
'opening_balance': _('Opening Entries'), |
|
||||
False: _('No')} # cf. account_report_partner_balance.mako |
|
||||
# Print Header Table data |
|
||||
row_pos = self.print_header_data( |
|
||||
ws, _p, data, row_pos, xlwt, _xs, initial_balance_text) |
|
||||
# Print comparison header table |
|
||||
if _p.comparison_mode in ('single', 'multiple'): |
|
||||
row_pos += 1 |
|
||||
row_pos = self.print_comparison_header( |
|
||||
_xs, xlwt, row_pos, _p, ws, initial_balance_text) |
|
||||
|
|
||||
# Freeze the line |
|
||||
ws.set_horz_split_pos(row_pos) |
|
||||
|
|
||||
# cell styles for account data |
|
||||
regular_cell_format = _xs['borders_all'] |
|
||||
regular_cell_style = xlwt.easyxf(regular_cell_format) |
|
||||
regular_cell_style_decimal = xlwt.easyxf( |
|
||||
regular_cell_format + _xs['right'], |
|
||||
num_format_str=report_xls.decimal_format) |
|
||||
|
|
||||
row_pos += 1 |
|
||||
for current_account in objects: |
|
||||
|
|
||||
partners_order = _p['partners_order_accounts']\ |
|
||||
.get(current_account.id, False) |
|
||||
|
|
||||
# do not display accounts without partners |
|
||||
if not partners_order: |
|
||||
continue |
|
||||
|
|
||||
comparisons = _p['comparisons_accounts']\ |
|
||||
.get(current_account.id, False) |
|
||||
|
|
||||
# in multiple columns mode, we do not want to print accounts |
|
||||
# without any rows |
|
||||
if _p.comparison_mode in ('single', 'multiple'): |
|
||||
all_comparison_lines = [comp['partners_amounts'][partner_id[1]] |
|
||||
for partner_id in partners_order |
|
||||
for comp in comparisons] |
|
||||
if not display_line(all_comparison_lines): |
|
||||
continue |
|
||||
|
|
||||
current_partner_amounts = _p['partners_amounts_accounts']\ |
|
||||
.get(current_account.id, False) |
|
||||
|
|
||||
if _p.comparison_mode in ('single', 'multiple'): |
|
||||
comparison_total = {} |
|
||||
for i, comp in enumerate(comparisons): |
|
||||
comparison_total[i] = {'balance': 0.0} |
|
||||
|
|
||||
# print row: Code - Account name |
|
||||
row_pos = self.print_row_code_account( |
|
||||
ws, current_account, row_pos, _xs, xlwt) |
|
||||
row_account_start = row_pos |
|
||||
# Print row: Titles "Account/Partner Name-Code/ref-Initial |
|
||||
# Balance-Debit-Credit-Balance" or "Account/Partner |
|
||||
# Name-Code/ref-Balance Year-Balance Year2-Balance C2-Balance C3" |
|
||||
row_pos = self.print_account_header(ws, _p, _xs, xlwt, row_pos) |
|
||||
|
|
||||
for (partner_code_name, partner_id, partner_ref, partner_name) \ |
|
||||
in partners_order: |
|
||||
partner = current_partner_amounts.get(partner_id, {}) |
|
||||
# in single mode, we have to display all the partners even if |
|
||||
# their balance is 0.0 because the initial balance should match |
|
||||
# with the previous year closings |
|
||||
# in multiple columns mode, we do not want to print partners |
|
||||
# which have a balance at 0.0 in each comparison column |
|
||||
if _p.comparison_mode in ('single', 'multiple'): |
|
||||
all_comparison_lines = [comp['partners_amounts'] |
|
||||
[partner_id] |
|
||||
for comp in comparisons |
|
||||
if comp['partners_amounts']. |
|
||||
get(partner_id)] |
|
||||
if not display_line(all_comparison_lines): |
|
||||
continue |
|
||||
|
|
||||
# display data row |
|
||||
if len(_p.comp_params) == 2: |
|
||||
account_span = 3 |
|
||||
else: |
|
||||
account_span = _p.initial_balance_mode and 2 or 3 |
|
||||
|
|
||||
c_specs = [('acc_title', account_span, 0, 'text', |
|
||||
partner_name if partner_name else |
|
||||
_('Unallocated'))] |
|
||||
c_specs += [('partner_ref', 1, 0, 'text', |
|
||||
partner_ref if partner_ref else '')] |
|
||||
if _p.comparison_mode == 'no_comparison': |
|
||||
bal_formula = '' |
|
||||
if _p.initial_balance_mode: |
|
||||
init_bal_cell = rowcol_to_cell(row_pos, 3) |
|
||||
bal_formula = init_bal_cell + '+' |
|
||||
debit_col = 4 |
|
||||
c_specs += [ |
|
||||
('init_bal', 1, 0, 'number', partner.get( |
|
||||
'init_balance', 0.0), None, |
|
||||
regular_cell_style_decimal), |
|
||||
] |
|
||||
else: |
|
||||
debit_col = 3 |
|
||||
c_specs += [ |
|
||||
('debit', 1, 0, 'number', partner.get('debit', 0.0), |
|
||||
None, regular_cell_style_decimal), |
|
||||
('credit', 1, 0, 'number', partner.get('credit', 0.0), |
|
||||
None, regular_cell_style_decimal), |
|
||||
] |
|
||||
debit_cell = rowcol_to_cell(row_pos, debit_col) |
|
||||
credit_cell = rowcol_to_cell(row_pos, debit_col + 1) |
|
||||
bal_formula += debit_cell + '-' + credit_cell |
|
||||
c_specs += [('bal', 1, 0, 'number', None, |
|
||||
bal_formula, regular_cell_style_decimal), ] |
|
||||
else: |
|
||||
c_specs += [('bal', 1, 0, 'number', partner.get('balance', |
|
||||
0.0), |
|
||||
None, regular_cell_style_decimal), ] |
|
||||
|
|
||||
if _p.comparison_mode in ('single', 'multiple'): |
|
||||
for i, comp in enumerate(comparisons): |
|
||||
comp_partners = comp['partners_amounts'] |
|
||||
balance = diff = percent_diff = 0 |
|
||||
if comp_partners.get(partner_id): |
|
||||
balance = comp_partners[partner_id]['balance'] |
|
||||
diff = comp_partners[partner_id]['diff'] |
|
||||
percent_diff = comp_partners[ |
|
||||
partner_id]['percent_diff'] |
|
||||
comparison_total[i]['balance'] += balance |
|
||||
c_specs += [('balance_%s' % i, 1, 0, 'number', |
|
||||
balance, None, |
|
||||
regular_cell_style_decimal), ] |
|
||||
# no diff in multiple comparisons because it shows too much |
|
||||
# data |
|
||||
if _p.comparison_mode == 'single': |
|
||||
c_specs += [('balance_diff', 1, 0, 'number', |
|
||||
diff, None, regular_cell_style_decimal), ] |
|
||||
if percent_diff is False: |
|
||||
c_specs += [('balance', 1, 0, 'number', |
|
||||
diff, None, regular_cell_style_decimal), ] |
|
||||
else: |
|
||||
c_specs += [('perc_diff', 1, 0, 'number', |
|
||||
int(round(percent_diff))), ] |
|
||||
row_data = self.xls_row_template( |
|
||||
c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, regular_cell_style) |
|
||||
|
|
||||
row_pos = self.print_account_totals( |
|
||||
_xs, xlwt, ws, row_account_start, row_pos, current_account, _p) |
|
||||
|
|
||||
partners_balance_xls('report.account.account_report_partner_balance_xls', |
|
||||
'account.account', |
|
||||
parser=PartnerBalanceWebkit) |
|
@ -1,324 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# OpenERP, Open Source Management Solution |
|
||||
# |
|
||||
# Copyright (c) 2013 Noviat nv/sa (www.noviat.com). All rights reserved. |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
import xlwt |
|
||||
from openerp.addons.report_xls.report_xls import report_xls |
|
||||
from openerp.addons.report_xls.utils import rowcol_to_cell |
|
||||
from openerp.addons.account_financial_report_webkit.report.trial_balance \ |
|
||||
import TrialBalanceWebkit |
|
||||
from openerp.tools.translate import _ |
|
||||
# import logging |
|
||||
# _logger = logging.getLogger(__name__) |
|
||||
|
|
||||
|
|
||||
class trial_balance_xls(report_xls): |
|
||||
column_sizes = [12, 60, 17, 17, 17, 17, 17, 17] |
|
||||
|
|
||||
def generate_xls_report(self, _p, _xs, data, objects, wb): |
|
||||
|
|
||||
ws = wb.add_sheet(_p.report_name[:31]) |
|
||||
ws.panes_frozen = True |
|
||||
ws.remove_splits = True |
|
||||
ws.portrait = 0 # Landscape |
|
||||
ws.fit_width_to_pages = 1 |
|
||||
row_pos = 0 |
|
||||
|
|
||||
# set print header/footer |
|
||||
ws.header_str = self.xls_headers['standard'] |
|
||||
ws.footer_str = self.xls_footers['standard'] |
|
||||
|
|
||||
# cf. account_report_trial_balance.mako |
|
||||
initial_balance_text = {'initial_balance': _('Computed'), |
|
||||
'opening_balance': _('Opening Entries'), |
|
||||
False: _('No')} |
|
||||
|
|
||||
# Title |
|
||||
cell_style = xlwt.easyxf(_xs['xls_title']) |
|
||||
report_name = ' - '.join([_p.report_name.upper(), |
|
||||
_p.company.partner_id.name, |
|
||||
_p.company.currency_id.name]) |
|
||||
c_specs = [ |
|
||||
('report_name', 1, 0, 'text', report_name), |
|
||||
] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, row_style=cell_style) |
|
||||
|
|
||||
# write empty row to define column sizes |
|
||||
c_sizes = self.column_sizes |
|
||||
c_specs = [('empty%s' % i, 1, c_sizes[i], 'text', None) |
|
||||
for i in range(0, len(c_sizes))] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, set_column_size=True) |
|
||||
|
|
||||
# Header Table |
|
||||
cell_format = _xs['bold'] + _xs['fill_blue'] + _xs['borders_all'] |
|
||||
cell_style = xlwt.easyxf(cell_format) |
|
||||
cell_style_center = xlwt.easyxf(cell_format + _xs['center']) |
|
||||
c_specs = [ |
|
||||
('fy', 1, 0, 'text', _('Fiscal Year')), |
|
||||
('af', 2, 0, 'text', _('Accounts Filter')), |
|
||||
('df', 1, 0, 'text', _p.filter_form(data) == |
|
||||
'filter_date' and _('Dates Filter') or _('Periods Filter')), |
|
||||
('tm', 2, 0, 'text', _('Target Moves'), None, cell_style_center), |
|
||||
('ib', 1, 0, 'text', _('Initial Balance'), |
|
||||
None, cell_style_center), |
|
||||
('coa', 1, 0, 'text', _('Chart of Account'), |
|
||||
None, cell_style_center), |
|
||||
] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, row_style=cell_style) |
|
||||
|
|
||||
cell_format = _xs['borders_all'] + _xs['wrap'] + _xs['top'] |
|
||||
cell_style = xlwt.easyxf(cell_format) |
|
||||
cell_style_center = xlwt.easyxf(cell_format + _xs['center']) |
|
||||
c_specs = [ |
|
||||
('fy', 1, 0, 'text', _p.fiscalyear.name if _p.fiscalyear else '-'), |
|
||||
('af', 2, 0, 'text', _p.accounts(data) and ', '.join( |
|
||||
[account.code for account in _p.accounts(data)]) or _('All')), |
|
||||
] |
|
||||
df = _('From') + ': ' |
|
||||
if _p.filter_form(data) == 'filter_date': |
|
||||
df += _p.start_date if _p.start_date else u'' |
|
||||
else: |
|
||||
df += _p.start_period.name if _p.start_period else u'' |
|
||||
df += ' ' + _('\nTo') + ': ' |
|
||||
if _p.filter_form(data) == 'filter_date': |
|
||||
df += _p.stop_date if _p.stop_date else u'' |
|
||||
else: |
|
||||
df += _p.stop_period.name if _p.stop_period else u'' |
|
||||
c_specs += [ |
|
||||
('df', 1, 0, 'text', df), |
|
||||
('tm', 2, 0, 'text', _p.display_target_move( |
|
||||
data), None, cell_style_center), |
|
||||
('ib', 1, 0, 'text', initial_balance_text[ |
|
||||
_p.initial_balance_mode], None, cell_style_center), |
|
||||
('coa', 1, 0, 'text', _p.chart_account.name, |
|
||||
None, cell_style_center), |
|
||||
] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, row_style=cell_style) |
|
||||
|
|
||||
# comparison header table |
|
||||
if _p.comparison_mode in ('single', 'multiple'): |
|
||||
row_pos += 1 |
|
||||
cell_format_ct = _xs['bold'] + \ |
|
||||
_xs['fill_blue'] + _xs['borders_all'] |
|
||||
cell_style_ct = xlwt.easyxf(cell_format_ct) |
|
||||
c_specs = [('ct', 8, 0, 'text', _('Comparisons'))] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, row_style=cell_style_ct) |
|
||||
cell_style_center = xlwt.easyxf(cell_format) |
|
||||
for index, params in enumerate(_p.comp_params): |
|
||||
c_specs = [ |
|
||||
('c', 3, 0, 'text', _('Comparison') + str(index + 1) + |
|
||||
' (C' + str(index + 1) + ')')] |
|
||||
if params['comparison_filter'] == 'filter_date': |
|
||||
c_specs += [('f', 3, 0, 'text', _('Dates Filter') + ': ' + |
|
||||
_p.formatLang( |
|
||||
params['start'], date=True) + ' - ' + |
|
||||
_p.formatLang(params['stop'], date=True))] |
|
||||
elif params['comparison_filter'] == 'filter_period': |
|
||||
c_specs += [('f', 3, 0, 'text', _('Periods Filter') + |
|
||||
': ' + params['start'].name + ' - ' + |
|
||||
params['stop'].name)] |
|
||||
else: |
|
||||
c_specs += [('f', 3, 0, 'text', _('Fiscal Year') + |
|
||||
': ' + params['fiscalyear'].name)] |
|
||||
c_specs += [('ib', 2, 0, 'text', _('Initial Balance') + |
|
||||
': ' + |
|
||||
initial_balance_text[ |
|
||||
params['initial_balance_mode']])] |
|
||||
row_data = self.xls_row_template( |
|
||||
c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, row_style=cell_style_center) |
|
||||
|
|
||||
row_pos += 1 |
|
||||
|
|
||||
# Column Header Row |
|
||||
cell_format = _xs['bold'] + _xs['fill_blue'] + \ |
|
||||
_xs['borders_all'] + _xs['wrap'] + _xs['top'] |
|
||||
cell_style = xlwt.easyxf(cell_format) |
|
||||
cell_style_right = xlwt.easyxf(cell_format + _xs['right']) |
|
||||
cell_style_center = xlwt.easyxf(cell_format + _xs['center']) |
|
||||
if len(_p.comp_params) == 2: |
|
||||
account_span = 3 |
|
||||
else: |
|
||||
account_span = _p.initial_balance_mode and 2 or 3 |
|
||||
c_specs = [ |
|
||||
('code', 1, 0, 'text', _('Code')), |
|
||||
('account', account_span, 0, 'text', _('Account')), |
|
||||
] |
|
||||
if _p.comparison_mode == 'no_comparison': |
|
||||
if _p.initial_balance_mode: |
|
||||
c_specs += [('init_bal', 1, 0, 'text', |
|
||||
_('Initial Balance'), None, cell_style_right)] |
|
||||
c_specs += [ |
|
||||
('debit', 1, 0, 'text', _('Debit'), None, cell_style_right), |
|
||||
('credit', 1, 0, 'text', _('Credit'), None, cell_style_right), |
|
||||
] |
|
||||
|
|
||||
if _p.comparison_mode == 'no_comparison' or not _p.fiscalyear: |
|
||||
c_specs += [('balance', 1, 0, 'text', |
|
||||
_('Balance'), None, cell_style_right)] |
|
||||
else: |
|
||||
c_specs += [('balance_fy', 1, 0, 'text', _('Balance %s') % |
|
||||
_p.fiscalyear.name, None, cell_style_right)] |
|
||||
if _p.comparison_mode in ('single', 'multiple'): |
|
||||
for index in range(_p.nb_comparison): |
|
||||
if _p.comp_params[index][ |
|
||||
'comparison_filter'] == 'filter_year' \ |
|
||||
and _p.comp_params[index].get('fiscalyear', False): |
|
||||
c_specs += [('balance_%s' % index, 1, 0, 'text', |
|
||||
_('Balance %s') % |
|
||||
_p.comp_params[index]['fiscalyear'].name, |
|
||||
None, cell_style_right)] |
|
||||
else: |
|
||||
c_specs += [('balance_%s' % index, 1, 0, 'text', |
|
||||
_('Balance C%s') % (index + 1), None, |
|
||||
cell_style_right)] |
|
||||
if _p.comparison_mode == 'single': |
|
||||
c_specs += [ |
|
||||
('diff', 1, 0, 'text', _('Difference'), |
|
||||
None, cell_style_right), |
|
||||
('diff_percent', 1, 0, 'text', |
|
||||
_('% Difference'), None, cell_style_center), |
|
||||
] |
|
||||
c_specs += [('type', 1, 0, 'text', _('Type'), None, cell_style_center)] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, row_style=cell_style) |
|
||||
ws.set_horz_split_pos(row_pos) |
|
||||
|
|
||||
last_child_consol_ids = [] |
|
||||
|
|
||||
# cell styles for account data |
|
||||
view_cell_format = _xs['bold'] + _xs['fill'] + _xs['borders_all'] |
|
||||
view_cell_style = xlwt.easyxf(view_cell_format) |
|
||||
view_cell_style_center = xlwt.easyxf(view_cell_format + _xs['center']) |
|
||||
view_cell_style_decimal = xlwt.easyxf( |
|
||||
view_cell_format + _xs['right'], |
|
||||
num_format_str=report_xls.decimal_format) |
|
||||
view_cell_style_pct = xlwt.easyxf( |
|
||||
view_cell_format + _xs['center'], num_format_str='0') |
|
||||
regular_cell_format = _xs['borders_all'] |
|
||||
regular_cell_style = xlwt.easyxf(regular_cell_format) |
|
||||
regular_cell_style_center = xlwt.easyxf( |
|
||||
regular_cell_format + _xs['center']) |
|
||||
regular_cell_style_decimal = xlwt.easyxf( |
|
||||
regular_cell_format + _xs['right'], |
|
||||
num_format_str=report_xls.decimal_format) |
|
||||
regular_cell_style_pct = xlwt.easyxf( |
|
||||
regular_cell_format + _xs['center'], num_format_str='0') |
|
||||
|
|
||||
for current_account in objects: |
|
||||
|
|
||||
if not _p['to_display_accounts'][current_account.id]: |
|
||||
continue |
|
||||
|
|
||||
if current_account.type == 'view': |
|
||||
cell_style = view_cell_style |
|
||||
cell_style_center = view_cell_style_center |
|
||||
cell_style_decimal = view_cell_style_decimal |
|
||||
cell_style_pct = view_cell_style_pct |
|
||||
else: |
|
||||
cell_style = regular_cell_style |
|
||||
cell_style_center = regular_cell_style_center |
|
||||
cell_style_decimal = regular_cell_style_decimal |
|
||||
cell_style_pct = regular_cell_style_pct |
|
||||
|
|
||||
comparisons = _p['comparisons_accounts'][current_account.id] |
|
||||
|
|
||||
if current_account.id not in last_child_consol_ids: |
|
||||
# current account is a not a consolidation child: use its own |
|
||||
# level |
|
||||
last_child_consol_ids = [ |
|
||||
child_consol_id.id for child_consol_id in |
|
||||
current_account.child_consol_ids] |
|
||||
|
|
||||
c_specs = [ |
|
||||
('code', 1, 0, 'text', current_account.code), |
|
||||
('account', account_span, 0, 'text', current_account.name), |
|
||||
] |
|
||||
if _p.comparison_mode == 'no_comparison': |
|
||||
|
|
||||
debit_cell = rowcol_to_cell(row_pos, 4) |
|
||||
credit_cell = rowcol_to_cell(row_pos, 5) |
|
||||
bal_formula = debit_cell + '-' + credit_cell |
|
||||
|
|
||||
if _p.initial_balance_mode: |
|
||||
init_cell = rowcol_to_cell(row_pos, 3) |
|
||||
debit_cell = rowcol_to_cell(row_pos, 4) |
|
||||
credit_cell = rowcol_to_cell(row_pos, 5) |
|
||||
bal_formula = init_cell + '+' + \ |
|
||||
debit_cell + '-' + credit_cell |
|
||||
c_specs += [('init_bal', 1, 0, 'number', |
|
||||
_p['init_balance_' |
|
||||
'accounts'][current_account.id], |
|
||||
None, |
|
||||
cell_style_decimal)] |
|
||||
c_specs += [ |
|
||||
('debit', 1, 0, 'number', |
|
||||
_p['debit_accounts'][current_account.id], |
|
||||
None, cell_style_decimal), |
|
||||
('credit', 1, 0, 'number', |
|
||||
_p['credit_accounts'][current_account.id], |
|
||||
None, cell_style_decimal), |
|
||||
] |
|
||||
c_specs += [('balance', 1, 0, 'number', None, |
|
||||
bal_formula, cell_style_decimal)] |
|
||||
else: |
|
||||
c_specs += [('balance', 1, 0, 'number', |
|
||||
_p['balance_accounts'][current_account.id], |
|
||||
None, cell_style_decimal)] |
|
||||
|
|
||||
if _p.comparison_mode in ('single', 'multiple'): |
|
||||
c = 1 |
|
||||
for comp_account in comparisons: |
|
||||
c_specs += [('balance_%s' % c, 1, 0, 'number', |
|
||||
comp_account['balance'], None, |
|
||||
cell_style_decimal)] |
|
||||
c += 1 |
|
||||
if _p.comparison_mode == 'single': |
|
||||
c_specs += [ |
|
||||
('diff', 1, 0, 'number', comp_account[ |
|
||||
'diff'], None, cell_style_decimal), |
|
||||
('diff_percent', 1, 0, 'number', comp_account[ |
|
||||
'percent_diff'] and |
|
||||
comp_account['percent_diff'] or 0, None, |
|
||||
cell_style_pct), |
|
||||
] |
|
||||
|
|
||||
c_specs += [('type', 1, 0, 'text', |
|
||||
current_account.type, None, cell_style_center)] |
|
||||
row_data = self.xls_row_template(c_specs, [x[0] for x in c_specs]) |
|
||||
row_pos = self.xls_write_row( |
|
||||
ws, row_pos, row_data, row_style=cell_style) |
|
||||
|
|
||||
trial_balance_xls('report.account.account_report_trial_balance_xls', |
|
||||
'account.account', |
|
||||
parser=TrialBalanceWebkit) |
|
Before Width: 128 | Height: 128 | Size: 22 KiB |
556
account_financial_report_webkit_xls/static/description/icon.svg
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,65 +0,0 @@ |
|||||
- |
|
||||
In order to test the Excel General Ledger webkit wizard I will print report with default setting |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0')} |
|
||||
ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')],'active_id':ref('account.chart0')}) |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_general_ledger_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export',our_module='account_financial_report_webkit_xls') |
|
||||
|
|
||||
- |
|
||||
In order to test the Excel General Ledger webkit wizard I will print report with posted move |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'target_move': 'posted'} |
|
||||
ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')],'active_id':ref('account.chart0')}) |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_general_ledger_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export',our_module='account_financial_report_webkit_xls') |
|
||||
|
|
||||
- |
|
||||
In order to test the Excel General Ledger webkit wizard I will print report with transactions or non zero balance |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'display_account': 'bal_mix'} |
|
||||
ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')],'active_id':ref('account.chart0')}) |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_general_ledger_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export',our_module='account_financial_report_webkit_xls') |
|
||||
|
|
||||
- |
|
||||
In order to test the Excel General Ledger webkit wizard I will print report with inital balance and currency ammount |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'amount_currency': 1} |
|
||||
ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')],'active_id':ref('account.chart0')}) |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_general_ledger_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export',our_module='account_financial_report_webkit_xls') |
|
||||
|
|
||||
#Filter by date |
|
||||
- |
|
||||
In order to test the Excel General Ledger webkit wizard I will print report with inital balance and currency ammount and I filter by date of the first tree month |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'),'amount_currency': 1, 'chart_account_id': 1, 'date_from': '%s-01-01' %(datetime.now().year), |
|
||||
'date_to':'%s-04-01' %(datetime.now().year), 'display_account': 'bal_all', 'filter': 'filter_date',} |
|
||||
ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')],'active_id':ref('account.chart0')}) |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_general_ledger_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export',our_module='account_financial_report_webkit_xls') |
|
||||
|
|
||||
- |
|
||||
In order to test the Excel General Ledger webkit wizard I will print report with inital balance and currency ammount and I filter by date of the first tree month |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'),'amount_currency': 1, 'chart_account_id': 1, 'date_from': '%s-01-01' %(datetime.now().year), |
|
||||
'date_to':'%s-04-01' %(datetime.now().year), 'display_account': 'bal_all', 'filter': 'filter_date',} |
|
||||
ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')],'active_id':ref('account.chart0')}) |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_general_ledger_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export',our_module='account_financial_report_webkit_xls') |
|
||||
# I still have to parse report content but for this I need accounting data on multiple exercises and faor all fiscal year |
|
@ -1,60 +0,0 @@ |
|||||
- |
|
||||
In order to test the Excel Open Invoices Report webkit wizard I will print report with default setting |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'until_date': '%s-12-31' %(datetime.now().year)} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_open_invoices_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export',our_module='account_financial_report_webkit_xls') |
|
||||
|
|
||||
- |
|
||||
In order to test the Excel Open Invoices Report webkit wizard I will print report with filters and currency |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'until_date': '%s-12-31' %(datetime.now().year), 'target_move': 'posted', |
|
||||
'amount_currency': True, 'result_selection': 'customer_supplier'} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_open_invoices_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export',our_module='account_financial_report_webkit_xls') |
|
||||
|
|
||||
- |
|
||||
In order to test the Excel Open Invoices Report webkit wizard I will print report with filters on partners |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'until_date': '%s-12-31' %(datetime.now().year), 'target_move': 'posted', |
|
||||
'amount_currency': True, 'result_selection': 'customer_supplier', |
|
||||
'partner_ids': [ref('base.res_partner_2'), ref('base.res_partner_1')]} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_open_invoices_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export',our_module='account_financial_report_webkit_xls') |
|
||||
|
|
||||
- |
|
||||
In order to test the Excel Open Invoices Report webkit wizard I will print report with filters on periods |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'until_date': '%s-12-31' %(datetime.now().year), 'target_move': 'posted', |
|
||||
'amount_currency': True, 'result_selection': 'customer_supplier', |
|
||||
'filter': 'filter_period', 'period_from': ref('account.period_1'), 'period_to': ref('account.period_12')} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_open_invoices_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export',our_module='account_financial_report_webkit_xls') |
|
||||
|
|
||||
- |
|
||||
In order to test the Excel Open Invoices Report webkit wizard I will print report with filters on dates |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'until_date': '%s-12-31' %(datetime.now().year), 'target_move': 'posted', |
|
||||
'amount_currency': True, 'result_selection': 'customer_supplier', |
|
||||
'filter': 'filter_date', 'date_from': '%s-01-01' %(datetime.now().year), 'date_to': '%s-12-31' %(datetime.now().year)} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_open_invoices_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export',our_module='account_financial_report_webkit_xls') |
|
@ -1,67 +0,0 @@ |
|||||
- |
|
||||
In order to test the Excel Partner Balance webkit wizard I will print report with default setting |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0')} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_partner_balance_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export', our_module='account_financial_report_webkit_xls') |
|
||||
|
|
||||
- |
|
||||
In order to test the Excel Partner Balance webkit wizard I will print report as if we print it from an account |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0')} |
|
||||
ctx.update({'model': 'account.account','active_ids':[ref('account.assets_view'), ref('account.liabilities_view')],'active_id': ref('account.assets_view')}) |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_partner_balance_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export', our_module='account_financial_report_webkit_xls') |
|
||||
|
|
||||
- |
|
||||
In order to test the Excel Partner Balance webkit wizard I will print report with filters on period |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'filter': 'filter_period', 'period_from': ref('account.period_1'), 'period_to': ref('account.period_12')} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_partner_balance_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export', our_module='account_financial_report_webkit_xls') |
|
||||
|
|
||||
- |
|
||||
In order to test the Excel Partner Balance webkit wizard I will print report with filters on dates |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'filter': 'filter_date', 'date_from': '%s-01-01' %(datetime.now().year), 'date_to': '%s-12-31' %(datetime.now().year)} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_partner_balance_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export', our_module='account_financial_report_webkit_xls') |
|
||||
|
|
||||
- |
|
||||
In order to test the Excel Partner Balance webkit wizard I will print report with one comparison filtered by year |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'comp0_filter': 'filter_year', 'comp0_fiscalyear_id': ref('account.data_fiscalyear')} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_partner_balance_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export', our_module='account_financial_report_webkit_xls') |
|
||||
|
|
||||
- |
|
||||
In order to test the Excel Partner Balance webkit wizard I will print report with all comparisons filtered by year, period and date |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'comp0_filter': 'filter_year', 'comp0_fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'comp1_filter': 'filter_period', 'comp1_period_from': ref('account.period_1'), 'comp1_period_to': ref('account.period_12'), |
|
||||
'comp2_filter': 'filter_date', 'comp2_date_from': '%s-01-01' %(datetime.now().year), 'comp2_date_to': '%s-12-31' %(datetime.now().year) |
|
||||
} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_partner_balance_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export',our_module='account_financial_report_webkit_xls') |
|
@ -1,60 +0,0 @@ |
|||||
- |
|
||||
In order to test the Excel Partner Ledger webkit wizard I will print report with default setting |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'until_date': '%s-12-31' %(datetime.now().year)} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_partners_ledger_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export',our_module='account_financial_report_webkit_xls') |
|
||||
|
|
||||
- |
|
||||
In order to test the Excel Partner Ledger webkit wizard I will print report with filters and currency |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'until_date': '%s-12-31' %(datetime.now().year), 'target_move': 'posted', |
|
||||
'amount_currency': True, 'result_selection': 'customer_supplier'} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_partners_ledger_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export',our_module='account_financial_report_webkit_xls') |
|
||||
|
|
||||
- |
|
||||
In order to test the Excel Partner Ledger webkit wizard I will print report with filters on partners |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'until_date': '%s-12-31' %(datetime.now().year), 'target_move': 'posted', |
|
||||
'amount_currency': True, 'result_selection': 'customer_supplier', |
|
||||
'partner_ids': [ref('base.res_partner_2'), ref('base.res_partner_1')]} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_partners_ledger_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export',our_module='account_financial_report_webkit_xls') |
|
||||
|
|
||||
- |
|
||||
In order to test the Excel Partner Ledger webkit wizard I will print report with filters on periods |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'until_date': '%s-12-31' %(datetime.now().year), 'target_move': 'posted', |
|
||||
'amount_currency': True, 'result_selection': 'customer_supplier', |
|
||||
'filter': 'filter_period', 'period_from': ref('account.period_1'), 'period_to': ref('account.period_12')} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_partners_ledger_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export',our_module='account_financial_report_webkit_xls') |
|
||||
|
|
||||
- |
|
||||
In order to test the Excel Partner Ledger webkit wizard I will print report with filters on dates |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'until_date': '%s-12-31' %(datetime.now().year), 'target_move': 'posted', |
|
||||
'amount_currency': True, 'result_selection': 'customer_supplier', |
|
||||
'filter': 'filter_date', 'date_from': '%s-01-01' %(datetime.now().year), 'date_to': '%s-12-31' %(datetime.now().year)} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_partners_ledger_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export',our_module='account_financial_report_webkit_xls') |
|
@ -1,67 +0,0 @@ |
|||||
- |
|
||||
In order to test the Excel Trial Balance webkit wizard I will print report with default setting |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0')} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_trial_balance_menu_webkit',wiz_data=data_dict, wiz_buttons='xls_export', context=ctx, our_module='') |
|
||||
|
|
||||
- |
|
||||
In order to test the Excel Trial Balance webkit wizard I will print report as if we print it from an account |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0')} |
|
||||
ctx.update({'model': 'account.account','active_ids':[ref('account.assets_view'), ref('account.liabilities_view')],'active_id': ref('account.assets_view')}) |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_trial_balance_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export', our_module='account_financial_report_webkit_xls') |
|
||||
|
|
||||
- |
|
||||
In order to test the Excel Trial Balance webkit wizard I will print report with filters on period |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'filter': 'filter_period', 'period_from': ref('account.period_1'), 'period_to': ref('account.period_12')} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_trial_balance_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export', our_module='account_financial_report_webkit_xls') |
|
||||
|
|
||||
- |
|
||||
In order to test the Excel Trial Balance webkit wizard I will print report with filters on dates |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'filter': 'filter_date', 'date_from': '%s-01-01' %(datetime.now().year), 'date_to': '%s-12-31' %(datetime.now().year)} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_trial_balance_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export', our_module='account_financial_report_webkit_xls') |
|
||||
|
|
||||
- |
|
||||
In order to test the Excel Trial Balance webkit wizard I will print report with one comparison filtered by year |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'comp0_filter': 'filter_year', 'comp0_fiscalyear_id': ref('account.data_fiscalyear')} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_trial_balance_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export', our_module='account_financial_report_webkit_xls') |
|
||||
|
|
||||
- |
|
||||
In order to test the Excel Trial Balance webkit wizard I will print report with all comparisons filtered by year, period and date |
|
||||
- |
|
||||
!python {model: account.account}: | |
|
||||
from datetime import datetime |
|
||||
ctx={'xls_export':1} |
|
||||
data_dict = {'chart_account_id':ref('account.chart0'), 'fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'comp0_filter': 'filter_year', 'comp0_fiscalyear_id': ref('account.data_fiscalyear'), |
|
||||
'comp1_filter': 'filter_period', 'comp1_period_from': ref('account.period_1'), 'comp1_period_to': ref('account.period_12'), |
|
||||
'comp2_filter': 'filter_date', 'comp2_date_from': '%s-01-01' %(datetime.now().year), 'comp2_date_to': '%s-12-31' %(datetime.now().year) |
|
||||
} |
|
||||
from openerp.tools import test_reports |
|
||||
test_reports.try_report_action(cr, uid, 'account_financial_report_webkit.action_account_trial_balance_menu_webkit',wiz_data=data_dict, context=ctx, wiz_buttons='xls_export', our_module='account_financial_report_webkit_xls') |
|
@ -1,27 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# OpenERP, Open Source Management Solution |
|
||||
# |
|
||||
# Copyright (c) 2013 Noviat nv/sa (www.noviat.com). All rights reserved. |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
from . import general_ledger_wizard |
|
||||
from . import trial_balance_wizard |
|
||||
from . import partners_balance_wizard |
|
||||
from . import partners_ledger_wizard |
|
||||
from . import open_invoices_wizard |
|
@ -1,44 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# OpenERP, Open Source Management Solution |
|
||||
# |
|
||||
# Copyright (c) 2013 Noviat nv/sa (www.noviat.com). All rights reserved. |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
from openerp.osv import orm |
|
||||
# import logging |
|
||||
# _logger = logging.getLogger(__name__) |
|
||||
|
|
||||
|
|
||||
class general_ledger_webkit_wizard(orm.TransientModel): |
|
||||
_inherit = 'general.ledger.webkit' |
|
||||
|
|
||||
def xls_export(self, cr, uid, ids, context=None): |
|
||||
return self.check_report(cr, uid, ids, context=context) |
|
||||
|
|
||||
def _print_report(self, cr, uid, ids, data, context=None): |
|
||||
context = context or {} |
|
||||
if context.get('xls_export'): |
|
||||
# we update form with display account value |
|
||||
data = self.pre_print_report(cr, uid, ids, data, context=context) |
|
||||
return {'type': 'ir.actions.report.xml', |
|
||||
'report_name': 'account.account_report_general_ledger_xls', |
|
||||
'datas': data} |
|
||||
else: |
|
||||
return super(general_ledger_webkit_wizard, self)._print_report( |
|
||||
cr, uid, ids, data, context=context) |
|
@ -1,26 +0,0 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||
<openerp> |
|
||||
<data> |
|
||||
|
|
||||
<record id="general_ledger_webkit_xls_wizard_view" model="ir.ui.view"> |
|
||||
<field name="name">general.ledger.webkit.xls</field> |
|
||||
<field name="model">general.ledger.webkit</field> |
|
||||
<field name="type">form</field> |
|
||||
<field name="inherit_id" ref="account_financial_report_webkit.account_report_general_ledger_view_webkit"/> |
|
||||
<field name="arch" type="xml"> |
|
||||
<data> |
|
||||
<xpath expr="/form/label[contains(@string,'generate a pdf')]" position="replace"> |
|
||||
<label nolabel="1" colspan="4" string="This report allows you to generate a pdf or xls of your general ledger with details of all your account journals"/> |
|
||||
</xpath> |
|
||||
<xpath expr="/form/group[@col='4']" position='attributes'> |
|
||||
<attribute name="col">6</attribute> |
|
||||
</xpath> |
|
||||
<button string="Print" position="after"> |
|
||||
<button icon="gtk-execute" name="xls_export" string="Export" type="object" context="{'xls_export':1}" colspan="2"/> |
|
||||
</button> |
|
||||
</data> |
|
||||
</field> |
|
||||
</record> |
|
||||
|
|
||||
</data> |
|
||||
</openerp> |
|
@ -1,44 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# OpenERP, Open Source Management Solution |
|
||||
# |
|
||||
# Copyright (c) 2013 Noviat nv/sa (www.noviat.com). All rights reserved. |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
from openerp.osv import orm |
|
||||
# import logging |
|
||||
# _logger = logging.getLogger(__name__) |
|
||||
|
|
||||
|
|
||||
class open_invoices_webkit_wizard(orm.TransientModel): |
|
||||
_inherit = 'open.invoices.webkit' |
|
||||
|
|
||||
def xls_export(self, cr, uid, ids, context=None): |
|
||||
return self.check_report(cr, uid, ids, context=context) |
|
||||
|
|
||||
def _print_report(self, cr, uid, ids, data, context=None): |
|
||||
context = context or {} |
|
||||
if context.get('xls_export'): |
|
||||
# we update form with display account value |
|
||||
data = self.pre_print_report(cr, uid, ids, data, context=context) |
|
||||
return {'type': 'ir.actions.report.xml', |
|
||||
'report_name': 'account.account_report_open_invoices_xls', |
|
||||
'datas': data} |
|
||||
else: |
|
||||
return super(open_invoices_webkit_wizard, self)._print_report( |
|
||||
cr, uid, ids, data, context=context) |
|
@ -1,26 +0,0 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||
<openerp> |
|
||||
<data> |
|
||||
|
|
||||
<record id="open_invoices_webkit_xls_wizard_view" model="ir.ui.view"> |
|
||||
<field name="name">open.invoices.webkit.xls</field> |
|
||||
<field name="model">open.invoices.webkit</field> |
|
||||
<field name="type">form</field> |
|
||||
<field name="inherit_id" ref="account_financial_report_webkit.account_open_invoices_view_webkit"/> |
|
||||
<field name="arch" type="xml"> |
|
||||
<data> |
|
||||
<xpath expr="/form/label[contains(@string,'generate a pdf')]" position="replace"> |
|
||||
<label nolabel="1" colspan="4" string="This report allows you to generate a pdf or xls of your open invoices per partner with details of all your payable/receivable account. Exclude full reconciled journal items."/> |
|
||||
</xpath> |
|
||||
<xpath expr="/form/group[@col='4']" position='attributes'> |
|
||||
<attribute name="col">6</attribute> |
|
||||
</xpath> |
|
||||
<button string="Print" position="after"> |
|
||||
<button icon="gtk-execute" name="xls_export" string="Export" type="object" context="{'xls_export':1}" colspan="2"/> |
|
||||
</button> |
|
||||
</data> |
|
||||
</field> |
|
||||
</record> |
|
||||
|
|
||||
</data> |
|
||||
</openerp> |
|
@ -1,45 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# OpenERP, Open Source Management Solution |
|
||||
# |
|
||||
# Copyright (c) 2013 Noviat nv/sa (www.noviat.com). All rights reserved. |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
from openerp.osv import orm |
|
||||
# import logging |
|
||||
# _logger = logging.getLogger(__name__) |
|
||||
|
|
||||
|
|
||||
class partner_balance_wizard(orm.TransientModel): |
|
||||
_inherit = 'partner.balance.webkit' |
|
||||
|
|
||||
def xls_export(self, cr, uid, ids, context=None): |
|
||||
return self.check_report(cr, uid, ids, context=context) |
|
||||
|
|
||||
def _print_report(self, cr, uid, ids, data, context=None): |
|
||||
context = context or {} |
|
||||
if context.get('xls_export'): |
|
||||
# we update form with display account value |
|
||||
data = self.pre_print_report(cr, uid, ids, data, context=context) |
|
||||
return { |
|
||||
'type': 'ir.actions.report.xml', |
|
||||
'report_name': 'account.account_report_partner_balance_xls', |
|
||||
'datas': data} |
|
||||
else: |
|
||||
return super(partner_balance_wizard, self)._print_report( |
|
||||
cr, uid, ids, data, context=context) |
|
@ -1,26 +0,0 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||
<openerp> |
|
||||
<data> |
|
||||
|
|
||||
<record id="partners_balance_webkit_xls_wizard_view" model="ir.ui.view"> |
|
||||
<field name="name">partner.balance.webkit.xls</field> |
|
||||
<field name="model">partner.balance.webkit</field> |
|
||||
<field name="type">form</field> |
|
||||
<field name="inherit_id" ref="account_financial_report_webkit.account_partner_balance_view_webkit"/> |
|
||||
<field name="arch" type="xml"> |
|
||||
<data> |
|
||||
<xpath expr="/form/label[contains(@string,'is an analysis')]" position="replace"> |
|
||||
<label nolabel="1" colspan="4" string="This report allows you to generate a pdf or xls of your partner balance allowing you to quickly check the balance of each of your accounts in a single report"/> |
|
||||
</xpath> |
|
||||
<xpath expr="/form/group[@col='4']" position='attributes'> |
|
||||
<attribute name="col">6</attribute> |
|
||||
</xpath> |
|
||||
<button string="Print" position="after"> |
|
||||
<button icon="gtk-execute" name="xls_export" string="Export" type="object" context="{'xls_export':1}" colspan="2"/> |
|
||||
</button> |
|
||||
</data> |
|
||||
</field> |
|
||||
</record> |
|
||||
|
|
||||
</data> |
|
||||
</openerp> |
|
@ -1,44 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# OpenERP, Open Source Management Solution |
|
||||
# |
|
||||
# Copyright (c) 2013 Noviat nv/sa (www.noviat.com). All rights reserved. |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
from openerp.osv import orm |
|
||||
# import logging |
|
||||
# _logger = logging.getLogger(__name__) |
|
||||
|
|
||||
|
|
||||
class partner_ledger_webkit_wizard(orm.TransientModel): |
|
||||
_inherit = 'partners.ledger.webkit' |
|
||||
|
|
||||
def xls_export(self, cr, uid, ids, context=None): |
|
||||
return self.check_report(cr, uid, ids, context=context) |
|
||||
|
|
||||
def _print_report(self, cr, uid, ids, data, context=None): |
|
||||
context = context or {} |
|
||||
if context.get('xls_export'): |
|
||||
# we update form with display account value |
|
||||
data = self.pre_print_report(cr, uid, ids, data, context=context) |
|
||||
return {'type': 'ir.actions.report.xml', |
|
||||
'report_name': 'account.account_report_partner_ledger_xls', |
|
||||
'datas': data} |
|
||||
else: |
|
||||
return super(partner_ledger_webkit_wizard, self)._print_report( |
|
||||
cr, uid, ids, data, context=context) |
|
@ -1,26 +0,0 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||
<openerp> |
|
||||
<data> |
|
||||
|
|
||||
<record id="partner_ledger_webkit_xls_wizard_view" model="ir.ui.view"> |
|
||||
<field name="name">partners.ledger.webkit.xls</field> |
|
||||
<field name="model">partners.ledger.webkit</field> |
|
||||
<field name="type">form</field> |
|
||||
<field name="inherit_id" ref="account_financial_report_webkit.account_partner_ledger_view_webkit"/> |
|
||||
<field name="arch" type="xml"> |
|
||||
<data> |
|
||||
<xpath expr="/form/label[contains(@string,'generate a pdf')]" position="replace"> |
|
||||
<label nolabel="1" colspan="4" string="This report allows you to generate a pdf or xls of your partner ledger with details of all your account journals"/> |
|
||||
</xpath> |
|
||||
<xpath expr="/form/group[@col='4']" position='attributes'> |
|
||||
<attribute name="col">6</attribute> |
|
||||
</xpath> |
|
||||
<button string="Print" position="after"> |
|
||||
<button icon="gtk-execute" name="xls_export" string="Export" type="object" context="{'xls_export':1}" colspan="2"/> |
|
||||
</button> |
|
||||
</data> |
|
||||
</field> |
|
||||
</record> |
|
||||
|
|
||||
</data> |
|
||||
</openerp> |
|
@ -1,44 +0,0 @@ |
|||||
# -*- encoding: utf-8 -*- |
|
||||
############################################################################## |
|
||||
# |
|
||||
# OpenERP, Open Source Management Solution |
|
||||
# |
|
||||
# Copyright (c) 2013 Noviat nv/sa (www.noviat.com). All rights reserved. |
|
||||
# |
|
||||
# This program is free software: you can redistribute it and/or modify |
|
||||
# it under the terms of the GNU Affero General Public License as |
|
||||
# published by the Free Software Foundation, either version 3 of the |
|
||||
# License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU Affero General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU Affero General Public License |
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################## |
|
||||
|
|
||||
from openerp.osv import orm |
|
||||
# import logging |
|
||||
# _logger = logging.getLogger(__name__) |
|
||||
|
|
||||
|
|
||||
class trial_balance_wizard(orm.TransientModel): |
|
||||
_inherit = 'trial.balance.webkit' |
|
||||
|
|
||||
def xls_export(self, cr, uid, ids, context=None): |
|
||||
return self.check_report(cr, uid, ids, context=context) |
|
||||
|
|
||||
def _print_report(self, cr, uid, ids, data, context=None): |
|
||||
context = context or {} |
|
||||
if context.get('xls_export'): |
|
||||
# we update form with display account value |
|
||||
data = self.pre_print_report(cr, uid, ids, data, context=context) |
|
||||
return {'type': 'ir.actions.report.xml', |
|
||||
'report_name': 'account.account_report_trial_balance_xls', |
|
||||
'datas': data} |
|
||||
else: |
|
||||
return super(trial_balance_wizard, self)._print_report( |
|
||||
cr, uid, ids, data, context=context) |
|
@ -1,26 +0,0 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||
<openerp> |
|
||||
<data> |
|
||||
|
|
||||
<record id="trial_balance_webkit_xls_wizard_view" model="ir.ui.view"> |
|
||||
<field name="name">trial.balance.webkit.xls</field> |
|
||||
<field name="model">trial.balance.webkit</field> |
|
||||
<field name="type">form</field> |
|
||||
<field name="inherit_id" ref="account_financial_report_webkit.account_trial_balance_view_webkit"/> |
|
||||
<field name="arch" type="xml"> |
|
||||
<data> |
|
||||
<xpath expr="/form/label[contains(@string,'generate a pdf')]" position="replace"> |
|
||||
<label nolabel="1" colspan="4" string="This report allows you to generate a pdf or xls of your trial balance allowing you to quickly check the balance of each of your accounts in a single report"/> |
|
||||
</xpath> |
|
||||
<xpath expr="/form/group[@col='4']" position='attributes'> |
|
||||
<attribute name="col">6</attribute> |
|
||||
</xpath> |
|
||||
<button string="Print" position="after"> |
|
||||
<button icon="gtk-execute" name="xls_export" string="Export" type="object" context="{'xls_export':1}" colspan="2"/> |
|
||||
</button> |
|
||||
</data> |
|
||||
</field> |
|
||||
</record> |
|
||||
|
|
||||
</data> |
|
||||
</openerp> |
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue