hveficent
7 years ago
committed by
Jordi Ballester Alomar
43 changed files with 3233 additions and 290 deletions
-
8account_financial_report/README.rst
-
3account_financial_report/__manifest__.py
-
7account_financial_report/menuitems.xml
-
2account_financial_report/report/__init__.py
-
93account_financial_report/report/abstract_report_xlsx.py
-
2account_financial_report/report/aged_partner_balance.py
-
148account_financial_report/report/general_ledger.py
-
79account_financial_report/report/general_ledger_xlsx.py
-
810account_financial_report/report/journal_ledger.py
-
249account_financial_report/report/journal_ledger_xlsx.py
-
230account_financial_report/report/open_items.py
-
35account_financial_report/report/open_items_xlsx.py
-
199account_financial_report/report/templates/general_ledger.xml
-
463account_financial_report/report/templates/journal_ledger.xml
-
89account_financial_report/report/templates/open_items.xml
-
173account_financial_report/report/templates/trial_balance.xml
-
4account_financial_report/report/templates/vat_report.xml
-
61account_financial_report/report/trial_balance.py
-
67account_financial_report/report/trial_balance_xlsx.py
-
31account_financial_report/reports.xml
-
3account_financial_report/static/src/css/report.css
-
13account_financial_report/static/src/js/account_financial_report_backend.js
-
27account_financial_report/static/src/js/account_financial_report_widgets.js
-
2account_financial_report/tests/__init__.py
-
2account_financial_report/tests/abstract_test.py
-
78account_financial_report/tests/abstract_test_foreign_currency.py
-
5account_financial_report/tests/test_general_ledger.py
-
366account_financial_report/tests/test_journal_ledger.py
-
5account_financial_report/tests/test_open_items.py
-
6account_financial_report/tests/test_trial_balance.py
-
2account_financial_report/tests/test_vat_report.py
-
9account_financial_report/view/report_journal_ledger.xml
-
6account_financial_report/view/report_template.xml
-
1account_financial_report/wizard/__init__.py
-
2account_financial_report/wizard/aged_partner_balance_wizard.py
-
7account_financial_report/wizard/general_ledger_wizard.py
-
1account_financial_report/wizard/general_ledger_wizard_view.xml
-
142account_financial_report/wizard/journal_ledger_wizard.py
-
66account_financial_report/wizard/journal_ledger_wizard_view.xml
-
7account_financial_report/wizard/open_items_wizard.py
-
1account_financial_report/wizard/open_items_wizard_view.xml
-
8account_financial_report/wizard/trial_balance_wizard.py
-
1account_financial_report/wizard/trial_balance_wizard_view.xml
@ -0,0 +1,810 @@ |
|||||
|
# Copyright 2017 ACSONE SA/NV |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
||||
|
|
||||
|
from odoo import models, fields, api |
||||
|
|
||||
|
DIGITS = (16, 2) |
||||
|
|
||||
|
|
||||
|
class ReportJournalLedger(models.TransientModel): |
||||
|
|
||||
|
_name = 'report_journal_ledger' |
||||
|
|
||||
|
date_from = fields.Date( |
||||
|
required=True |
||||
|
) |
||||
|
date_to = fields.Date( |
||||
|
required=True |
||||
|
) |
||||
|
company_id = fields.Many2one( |
||||
|
comodel_name='res.company', |
||||
|
required=True, |
||||
|
ondelete='cascade' |
||||
|
) |
||||
|
move_target = fields.Selection( |
||||
|
selection='_get_move_targets', |
||||
|
default='all', |
||||
|
required=True, |
||||
|
) |
||||
|
sort_option = fields.Selection( |
||||
|
selection='_get_sort_options', |
||||
|
default='move_name', |
||||
|
required=True, |
||||
|
) |
||||
|
group_option = fields.Selection( |
||||
|
selection='_get_group_options', |
||||
|
default='journal', |
||||
|
required=True, |
||||
|
) |
||||
|
journal_ids = fields.Many2many( |
||||
|
comodel_name='account.journal', |
||||
|
required=True, |
||||
|
) |
||||
|
report_journal_ledger_ids = fields.One2many( |
||||
|
comodel_name='report_journal_ledger_journal', |
||||
|
inverse_name='report_id', |
||||
|
) |
||||
|
report_move_ids = fields.One2many( |
||||
|
comodel_name='report_journal_ledger_move', |
||||
|
inverse_name='report_id', |
||||
|
) |
||||
|
report_move_line_ids = fields.One2many( |
||||
|
comodel_name='report_journal_ledger_move_line', |
||||
|
inverse_name='report_id', |
||||
|
) |
||||
|
report_journal_ledger_tax_line_ids = fields.One2many( |
||||
|
comodel_name='report_journal_ledger_journal_tax_line', |
||||
|
inverse_name='report_id', |
||||
|
) |
||||
|
report_tax_line_ids = fields.One2many( |
||||
|
comodel_name='report_journal_ledger_report_tax_line', |
||||
|
inverse_name='report_id', |
||||
|
) |
||||
|
foreign_currency = fields.Boolean() |
||||
|
with_account_name = fields.Boolean() |
||||
|
|
||||
|
@api.model |
||||
|
def _get_move_targets(self): |
||||
|
return self.env['journal.ledger.report.wizard']._get_move_targets() |
||||
|
|
||||
|
@api.model |
||||
|
def _get_sort_options(self): |
||||
|
return self.env['journal.ledger.report.wizard']._get_sort_options() |
||||
|
|
||||
|
@api.model |
||||
|
def _get_group_options(self): |
||||
|
return self.env['journal.ledger.report.wizard']._get_group_options() |
||||
|
|
||||
|
@api.multi |
||||
|
def compute_data_for_report(self): |
||||
|
self.ensure_one() |
||||
|
self._inject_journal_values() |
||||
|
self._inject_move_values() |
||||
|
self._inject_move_line_values() |
||||
|
self._inject_journal_tax_values() |
||||
|
self._update_journal_report_total_values() |
||||
|
|
||||
|
if self.group_option == 'none': |
||||
|
self._inject_report_tax_values() |
||||
|
|
||||
|
# Refresh cache because all data are computed with SQL requests |
||||
|
self.invalidate_cache() |
||||
|
|
||||
|
@api.multi |
||||
|
def _inject_journal_values(self): |
||||
|
self.ensure_one() |
||||
|
sql = """ |
||||
|
DELETE |
||||
|
FROM report_journal_ledger_journal |
||||
|
WHERE report_id = %s |
||||
|
""" |
||||
|
params = ( |
||||
|
self.id, |
||||
|
) |
||||
|
self.env.cr.execute(sql, params) |
||||
|
sql = """ |
||||
|
INSERT INTO report_journal_ledger_journal ( |
||||
|
create_uid, |
||||
|
create_date, |
||||
|
report_id, |
||||
|
journal_id, |
||||
|
name, |
||||
|
code, |
||||
|
company_id, |
||||
|
currency_id |
||||
|
) |
||||
|
SELECT |
||||
|
%s as create_uid, |
||||
|
NOW() as create_date, |
||||
|
%s as report_id, |
||||
|
aj.id as journal_id, |
||||
|
aj.name as name, |
||||
|
aj.code as code, |
||||
|
aj.company_id as company_id, |
||||
|
COALESCE(aj.currency_id, company.currency_id) as currency_id |
||||
|
FROM |
||||
|
account_journal aj |
||||
|
LEFT JOIN |
||||
|
res_company company on (company.id = aj.company_id) |
||||
|
WHERE |
||||
|
aj.id in %s |
||||
|
AND |
||||
|
aj.company_id = %s |
||||
|
ORDER BY |
||||
|
aj.name |
||||
|
""" |
||||
|
params = ( |
||||
|
self.env.uid, |
||||
|
self.id, |
||||
|
tuple(self.journal_ids.ids), |
||||
|
self.company_id.id, |
||||
|
) |
||||
|
self.env.cr.execute(sql, params) |
||||
|
|
||||
|
@api.multi |
||||
|
def _inject_move_values(self): |
||||
|
self.ensure_one() |
||||
|
sql = """ |
||||
|
DELETE |
||||
|
FROM report_journal_ledger_move |
||||
|
WHERE report_id = %s |
||||
|
""" |
||||
|
params = ( |
||||
|
self.id, |
||||
|
) |
||||
|
self.env.cr.execute(sql, params) |
||||
|
sql = self._get_inject_move_insert() |
||||
|
sql += self._get_inject_move_select() |
||||
|
sql += self._get_inject_move_where_clause() |
||||
|
sql += self._get_inject_move_order_by() |
||||
|
params = self._get_inject_move_params() |
||||
|
self.env.cr.execute(sql, params) |
||||
|
|
||||
|
@api.multi |
||||
|
def _get_inject_move_insert(self): |
||||
|
return """ |
||||
|
INSERT INTO report_journal_ledger_move ( |
||||
|
create_uid, |
||||
|
create_date, |
||||
|
report_id, |
||||
|
report_journal_ledger_id, |
||||
|
move_id, |
||||
|
name, |
||||
|
company_id |
||||
|
) |
||||
|
""" |
||||
|
|
||||
|
@api.multi |
||||
|
def _get_inject_move_select(self): |
||||
|
return """ |
||||
|
SELECT |
||||
|
%s as create_uid, |
||||
|
NOW() as create_date, |
||||
|
rjqj.report_id as report_id, |
||||
|
rjqj.id as report_journal_ledger_id, |
||||
|
am.id as move_id, |
||||
|
am.name as name, |
||||
|
am.company_id as company_id |
||||
|
FROM |
||||
|
account_move am |
||||
|
INNER JOIN |
||||
|
report_journal_ledger_journal rjqj |
||||
|
on (rjqj.journal_id = am.journal_id) |
||||
|
""" |
||||
|
|
||||
|
@api.multi |
||||
|
def _get_inject_move_where_clause(self): |
||||
|
self.ensure_one() |
||||
|
where_clause = """ |
||||
|
WHERE |
||||
|
rjqj.report_id = %s |
||||
|
AND |
||||
|
am.date >= %s |
||||
|
AND |
||||
|
am.date <= %s |
||||
|
""" |
||||
|
if self.move_target != 'all': |
||||
|
where_clause += """ |
||||
|
AND |
||||
|
am.state = %s |
||||
|
""" |
||||
|
return where_clause |
||||
|
|
||||
|
@api.multi |
||||
|
def _get_inject_move_order_by(self): |
||||
|
self.ensure_one() |
||||
|
order_by = """ |
||||
|
ORDER BY |
||||
|
""" |
||||
|
if self.sort_option == 'move_name': |
||||
|
order_by += " am.name" |
||||
|
elif self.sort_option == 'date': |
||||
|
order_by += " am.date, am.name" |
||||
|
return order_by |
||||
|
|
||||
|
@api.multi |
||||
|
def _get_inject_move_params(self): |
||||
|
params = [ |
||||
|
self.env.uid, |
||||
|
self.id, |
||||
|
self.date_from, |
||||
|
self.date_to |
||||
|
] |
||||
|
|
||||
|
if self.move_target != 'all': |
||||
|
params.append(self.move_target) |
||||
|
|
||||
|
return tuple(params) |
||||
|
|
||||
|
@api.multi |
||||
|
def _inject_move_line_values(self): |
||||
|
self.ensure_one() |
||||
|
sql = """ |
||||
|
DELETE |
||||
|
FROM report_journal_ledger_move_line |
||||
|
WHERE report_id = %s |
||||
|
""" |
||||
|
params = ( |
||||
|
self.id, |
||||
|
) |
||||
|
self.env.cr.execute(sql, params) |
||||
|
sql = """ |
||||
|
INSERT INTO report_journal_ledger_move_line ( |
||||
|
create_uid, |
||||
|
create_date, |
||||
|
report_id, |
||||
|
report_journal_ledger_id, |
||||
|
report_move_id, |
||||
|
move_line_id, |
||||
|
account_id, |
||||
|
account, |
||||
|
account_code, |
||||
|
account_type, |
||||
|
partner_id, |
||||
|
partner, |
||||
|
date, |
||||
|
entry, |
||||
|
label, |
||||
|
debit, |
||||
|
credit, |
||||
|
company_currency_id, |
||||
|
amount_currency, |
||||
|
currency_id, |
||||
|
currency_name, |
||||
|
tax_id, |
||||
|
taxes_description, |
||||
|
company_id |
||||
|
) |
||||
|
SELECT |
||||
|
%s as create_uid, |
||||
|
NOW() as create_date, |
||||
|
rjqm.report_id as report_id, |
||||
|
rjqm.report_journal_ledger_id as report_journal_ledger_id, |
||||
|
rjqm.id as report_move_id, |
||||
|
aml.id as move_line_id, |
||||
|
aml.account_id as account_id, |
||||
|
aa.name as account, |
||||
|
aa.code as account_code, |
||||
|
aa.internal_type as account_type, |
||||
|
aml.partner_id as partner_id, |
||||
|
p.name as partner, |
||||
|
aml.date as date, |
||||
|
rjqm.name as entry, |
||||
|
aml.name as label, |
||||
|
aml.debit as debit, |
||||
|
aml.credit as credit, |
||||
|
aml.company_currency_id as currency_id, |
||||
|
aml.amount_currency as amount_currency, |
||||
|
aml.currency_id as currency_id, |
||||
|
currency.name as currency_name, |
||||
|
aml.tax_line_id as tax_id, |
||||
|
CASE |
||||
|
WHEN |
||||
|
aml.tax_line_id is not null |
||||
|
THEN |
||||
|
COALESCE(at.description, at.name) |
||||
|
WHEN |
||||
|
aml.tax_line_id is null |
||||
|
THEN |
||||
|
(SELECT |
||||
|
array_to_string( |
||||
|
array_agg(COALESCE(at.description, at.name) |
||||
|
), ', ') |
||||
|
FROM |
||||
|
account_move_line_account_tax_rel aml_at_rel |
||||
|
LEFT JOIN |
||||
|
account_tax at on (at.id = aml_at_rel.account_tax_id) |
||||
|
WHERE |
||||
|
aml_at_rel.account_move_line_id = aml.id) |
||||
|
ELSE |
||||
|
'' |
||||
|
END as taxes_description, |
||||
|
aml.company_id as company_id |
||||
|
FROM |
||||
|
account_move_line aml |
||||
|
INNER JOIN |
||||
|
report_journal_ledger_move rjqm |
||||
|
on (rjqm.move_id = aml.move_id) |
||||
|
LEFT JOIN |
||||
|
account_account aa |
||||
|
on (aa.id = aml.account_id) |
||||
|
LEFT JOIN |
||||
|
res_partner p |
||||
|
on (p.id = aml.partner_id) |
||||
|
LEFT JOIN |
||||
|
account_tax at |
||||
|
on (at.id = aml.tax_line_id) |
||||
|
LEFT JOIN |
||||
|
res_currency currency |
||||
|
on (currency.id = aml.currency_id) |
||||
|
WHERE |
||||
|
rjqm.report_id = %s |
||||
|
""" |
||||
|
params = ( |
||||
|
self.env.uid, |
||||
|
self.id, |
||||
|
) |
||||
|
self.env.cr.execute(sql, params) |
||||
|
|
||||
|
@api.multi |
||||
|
def _inject_report_tax_values(self): |
||||
|
self.ensure_one() |
||||
|
sql_distinct_tax_id = """ |
||||
|
SELECT |
||||
|
distinct(jrqjtl.tax_id) |
||||
|
FROM |
||||
|
report_journal_ledger_journal_tax_line jrqjtl |
||||
|
WHERE |
||||
|
jrqjtl.report_id = %s |
||||
|
""" |
||||
|
self.env.cr.execute(sql_distinct_tax_id, (self.id,)) |
||||
|
rows = self.env.cr.fetchall() |
||||
|
tax_ids = set([row[0] for row in rows]) |
||||
|
|
||||
|
sql = """ |
||||
|
INSERT INTO report_journal_ledger_report_tax_line ( |
||||
|
create_uid, |
||||
|
create_date, |
||||
|
report_id, |
||||
|
tax_id, |
||||
|
tax_name, |
||||
|
tax_code, |
||||
|
base_debit, |
||||
|
base_credit, |
||||
|
tax_debit, |
||||
|
tax_credit |
||||
|
) |
||||
|
SELECT |
||||
|
%s as create_uid, |
||||
|
NOW() as create_date, |
||||
|
%s as report_id, |
||||
|
%s as tax_id, |
||||
|
at.name as tax_name, |
||||
|
at.description as tax_code, |
||||
|
( |
||||
|
SELECT sum(base_debit) |
||||
|
FROM report_journal_ledger_journal_tax_line jrqjtl2 |
||||
|
WHERE jrqjtl2.report_id = %s |
||||
|
AND jrqjtl2.tax_id = %s |
||||
|
) as base_debit, |
||||
|
( |
||||
|
SELECT sum(base_credit) |
||||
|
FROM report_journal_ledger_journal_tax_line jrqjtl2 |
||||
|
WHERE jrqjtl2.report_id = %s |
||||
|
AND jrqjtl2.tax_id = %s |
||||
|
) as base_credit, |
||||
|
( |
||||
|
SELECT sum(tax_debit) |
||||
|
FROM report_journal_ledger_journal_tax_line jrqjtl2 |
||||
|
WHERE jrqjtl2.report_id = %s |
||||
|
AND jrqjtl2.tax_id = %s |
||||
|
) as tax_debit, |
||||
|
( |
||||
|
SELECT sum(tax_credit) |
||||
|
FROM report_journal_ledger_journal_tax_line jrqjtl2 |
||||
|
WHERE jrqjtl2.report_id = %s |
||||
|
AND jrqjtl2.tax_id = %s |
||||
|
) as tax_credit |
||||
|
FROM |
||||
|
report_journal_ledger_journal_tax_line jrqjtl |
||||
|
LEFT JOIN |
||||
|
account_tax at |
||||
|
on (at.id = jrqjtl.tax_id) |
||||
|
WHERE |
||||
|
jrqjtl.report_id = %s |
||||
|
AND |
||||
|
jrqjtl.tax_id = %s |
||||
|
""" |
||||
|
|
||||
|
for tax_id in tax_ids: |
||||
|
params = ( |
||||
|
self.env.uid, |
||||
|
self.id, |
||||
|
tax_id, |
||||
|
self.id, |
||||
|
tax_id, |
||||
|
self.id, |
||||
|
tax_id, |
||||
|
self.id, |
||||
|
tax_id, |
||||
|
self.id, |
||||
|
tax_id, |
||||
|
self.id, |
||||
|
tax_id, |
||||
|
) |
||||
|
self.env.cr.execute(sql, params) |
||||
|
|
||||
|
@api.multi |
||||
|
def _inject_journal_tax_values(self): |
||||
|
self.ensure_one() |
||||
|
sql = """ |
||||
|
DELETE |
||||
|
FROM report_journal_ledger_journal_tax_line |
||||
|
WHERE report_id = %s |
||||
|
""" |
||||
|
params = ( |
||||
|
self.id, |
||||
|
) |
||||
|
self.env.cr.execute(sql, params) |
||||
|
sql_distinct_tax_id = """ |
||||
|
SELECT |
||||
|
distinct(jrqml.tax_id) |
||||
|
FROM |
||||
|
report_journal_ledger_move_line jrqml |
||||
|
WHERE |
||||
|
jrqml.report_journal_ledger_id = %s |
||||
|
""" |
||||
|
|
||||
|
tax_ids_by_journal_id = {} |
||||
|
for report_journal in self.report_journal_ledger_ids: |
||||
|
if report_journal.id not in tax_ids_by_journal_id: |
||||
|
tax_ids_by_journal_id[report_journal.id] = [] |
||||
|
self.env.cr.execute(sql_distinct_tax_id, (report_journal.id,)) |
||||
|
rows = self.env.cr.fetchall() |
||||
|
tax_ids_by_journal_id[report_journal.id].extend([ |
||||
|
row[0] for row in rows if row[0] |
||||
|
]) |
||||
|
|
||||
|
sql = """ |
||||
|
INSERT INTO report_journal_ledger_journal_tax_line ( |
||||
|
create_uid, |
||||
|
create_date, |
||||
|
report_id, |
||||
|
report_journal_ledger_id, |
||||
|
tax_id, |
||||
|
tax_name, |
||||
|
tax_code, |
||||
|
base_debit, |
||||
|
base_credit, |
||||
|
tax_debit, |
||||
|
tax_credit |
||||
|
) |
||||
|
SELECT |
||||
|
%s as create_uid, |
||||
|
NOW() as create_date, |
||||
|
%s as report_id, |
||||
|
%s as report_journal_ledger_id, |
||||
|
%s as tax_id, |
||||
|
at.name as tax_name, |
||||
|
at.description as tax_code, |
||||
|
( |
||||
|
SELECT sum(debit) |
||||
|
FROM report_journal_ledger_move_line jrqml2 |
||||
|
WHERE jrqml2.report_journal_ledger_id = %s |
||||
|
AND ( |
||||
|
SELECT |
||||
|
count(*) |
||||
|
FROM |
||||
|
account_move_line_account_tax_rel aml_at_rel |
||||
|
WHERE |
||||
|
aml_at_rel.account_move_line_id = |
||||
|
jrqml2.move_line_id |
||||
|
AND |
||||
|
aml_at_rel.account_tax_id = %s |
||||
|
) > 0 |
||||
|
) as base_debit, |
||||
|
( |
||||
|
SELECT sum(credit) |
||||
|
FROM report_journal_ledger_move_line jrqml2 |
||||
|
WHERE jrqml2.report_journal_ledger_id = %s |
||||
|
AND ( |
||||
|
SELECT |
||||
|
count(*) |
||||
|
FROM |
||||
|
account_move_line_account_tax_rel aml_at_rel |
||||
|
WHERE |
||||
|
aml_at_rel.account_move_line_id = |
||||
|
jrqml2.move_line_id |
||||
|
AND |
||||
|
aml_at_rel.account_tax_id = %s |
||||
|
) > 0 |
||||
|
) as base_credit, |
||||
|
( |
||||
|
SELECT sum(debit) |
||||
|
FROM report_journal_ledger_move_line jrqml2 |
||||
|
WHERE jrqml2.report_journal_ledger_id = %s |
||||
|
AND jrqml2.tax_id = %s |
||||
|
) as tax_debit, |
||||
|
( |
||||
|
SELECT sum(credit) |
||||
|
FROM report_journal_ledger_move_line jrqml2 |
||||
|
WHERE jrqml2.report_journal_ledger_id = %s |
||||
|
AND jrqml2.tax_id = %s |
||||
|
) as tax_credit |
||||
|
FROM |
||||
|
report_journal_ledger_journal rjqj |
||||
|
LEFT JOIN |
||||
|
account_tax at |
||||
|
on (at.id = %s) |
||||
|
WHERE |
||||
|
rjqj.id = %s |
||||
|
""" |
||||
|
|
||||
|
for report_journal_ledger_id in tax_ids_by_journal_id: |
||||
|
tax_ids = tax_ids_by_journal_id[report_journal_ledger_id] |
||||
|
for tax_id in tax_ids: |
||||
|
params = ( |
||||
|
self.env.uid, |
||||
|
self.id, |
||||
|
report_journal_ledger_id, |
||||
|
tax_id, |
||||
|
report_journal_ledger_id, |
||||
|
tax_id, |
||||
|
report_journal_ledger_id, |
||||
|
tax_id, |
||||
|
report_journal_ledger_id, |
||||
|
tax_id, |
||||
|
report_journal_ledger_id, |
||||
|
tax_id, |
||||
|
tax_id, |
||||
|
report_journal_ledger_id, |
||||
|
) |
||||
|
self.env.cr.execute(sql, params) |
||||
|
|
||||
|
@api.multi |
||||
|
def _update_journal_report_total_values(self): |
||||
|
self.ensure_one() |
||||
|
sql = """ |
||||
|
UPDATE |
||||
|
report_journal_ledger_journal rjqj |
||||
|
SET |
||||
|
debit = ( |
||||
|
SELECT sum(rjqml.debit) |
||||
|
FROM report_journal_ledger_move_line rjqml |
||||
|
WHERE rjqml.report_journal_ledger_id = rjqj.id |
||||
|
), |
||||
|
credit = ( |
||||
|
SELECT sum(rjqml.credit) |
||||
|
FROM report_journal_ledger_move_line rjqml |
||||
|
WHERE rjqml.report_journal_ledger_id = rjqj.id |
||||
|
) |
||||
|
WHERE |
||||
|
rjqj.report_id = %s |
||||
|
""" |
||||
|
self.env.cr.execute(sql, (self.id,)) |
||||
|
|
||||
|
@api.multi |
||||
|
def print_report(self, report_type): |
||||
|
self.ensure_one() |
||||
|
if report_type == 'xlsx': |
||||
|
report_name = 'a_f_r.report_journal_ledger_xlsx' |
||||
|
else: |
||||
|
report_name = 'account_financial_report.' \ |
||||
|
'report_journal_ledger_qweb' |
||||
|
return self.env['ir.actions.report'].search( |
||||
|
[('report_name', '=', report_name), |
||||
|
('report_type', '=', report_type)], limit=1).report_action(self) |
||||
|
|
||||
|
def _get_html(self): |
||||
|
result = {} |
||||
|
rcontext = {} |
||||
|
context = dict(self.env.context) |
||||
|
report = self.browse(context.get('active_id')) |
||||
|
if report: |
||||
|
rcontext['o'] = report |
||||
|
result['html'] = self.env.ref( |
||||
|
'account_financial_report.report_journal_ledger').render( |
||||
|
rcontext) |
||||
|
return result |
||||
|
|
||||
|
@api.model |
||||
|
def get_html(self, given_context=None): |
||||
|
return self._get_html() |
||||
|
|
||||
|
|
||||
|
class ReportJournalLedgerJournal(models.TransientModel): |
||||
|
|
||||
|
_name = 'report_journal_ledger_journal' |
||||
|
|
||||
|
name = fields.Char( |
||||
|
required=True, |
||||
|
) |
||||
|
code = fields.Char() |
||||
|
report_id = fields.Many2one( |
||||
|
comodel_name='report_journal_ledger', |
||||
|
required=True, |
||||
|
ondelete='cascade' |
||||
|
) |
||||
|
journal_id = fields.Many2one( |
||||
|
comodel_name='account.journal', |
||||
|
required=True, |
||||
|
ondelete='cascade', |
||||
|
) |
||||
|
report_move_ids = fields.One2many( |
||||
|
comodel_name='report_journal_ledger_move', |
||||
|
inverse_name='report_journal_ledger_id', |
||||
|
) |
||||
|
report_tax_line_ids = fields.One2many( |
||||
|
comodel_name='report_journal_ledger_journal_tax_line', |
||||
|
inverse_name='report_journal_ledger_id', |
||||
|
) |
||||
|
debit = fields.Float( |
||||
|
digits=DIGITS, |
||||
|
) |
||||
|
credit = fields.Float( |
||||
|
digits=DIGITS, |
||||
|
) |
||||
|
company_id = fields.Many2one( |
||||
|
comodel_name='res.company', |
||||
|
required=True, |
||||
|
ondelete='cascade' |
||||
|
) |
||||
|
currency_id = fields.Many2one( |
||||
|
comodel_name='res.currency', |
||||
|
) |
||||
|
|
||||
|
|
||||
|
class ReportJournalLedgerMove(models.TransientModel): |
||||
|
|
||||
|
_name = 'report_journal_ledger_move' |
||||
|
|
||||
|
report_id = fields.Many2one( |
||||
|
comodel_name='report_journal_ledger', |
||||
|
required=True, |
||||
|
ondelete='cascade' |
||||
|
) |
||||
|
report_journal_ledger_id = fields.Many2one( |
||||
|
comodel_name='report_journal_ledger_journal', |
||||
|
required=True, |
||||
|
ondelete='cascade', |
||||
|
) |
||||
|
move_id = fields.Many2one( |
||||
|
comodel_name='account.move', |
||||
|
required=True, |
||||
|
ondelete='cascade', |
||||
|
) |
||||
|
report_move_line_ids = fields.One2many( |
||||
|
comodel_name='report_journal_ledger_move_line', |
||||
|
inverse_name='report_move_id', |
||||
|
) |
||||
|
name = fields.Char() |
||||
|
company_id = fields.Many2one( |
||||
|
comodel_name='res.company', |
||||
|
required=True, |
||||
|
ondelete='cascade' |
||||
|
) |
||||
|
|
||||
|
|
||||
|
class ReportJournalLedgerMoveLine(models.TransientModel): |
||||
|
|
||||
|
_name = 'report_journal_ledger_move_line' |
||||
|
_order = 'partner_id desc, account_id desc' |
||||
|
|
||||
|
report_id = fields.Many2one( |
||||
|
comodel_name='report_journal_ledger', |
||||
|
required=True, |
||||
|
ondelete='cascade' |
||||
|
) |
||||
|
report_journal_ledger_id = fields.Many2one( |
||||
|
comodel_name='report_journal_ledger_journal', |
||||
|
required=True, |
||||
|
ondelete='cascade', |
||||
|
) |
||||
|
report_move_id = fields.Many2one( |
||||
|
comodel_name='report_journal_ledger_move', |
||||
|
required=True, |
||||
|
ondelete='cascade', |
||||
|
) |
||||
|
move_line_id = fields.Many2one( |
||||
|
comodel_name='account.move.line', |
||||
|
required=True, |
||||
|
ondelete='cascade', |
||||
|
) |
||||
|
account_id = fields.Many2one( |
||||
|
comodel_name='account.account' |
||||
|
) |
||||
|
account = fields.Char() |
||||
|
account_code = fields.Char() |
||||
|
account_type = fields.Char() |
||||
|
partner = fields.Char() |
||||
|
partner_id = fields.Many2one( |
||||
|
comodel_name='res.partner', |
||||
|
) |
||||
|
date = fields.Date() |
||||
|
entry = fields.Char() |
||||
|
label = fields.Char() |
||||
|
debit = fields.Float( |
||||
|
digits=DIGITS, |
||||
|
) |
||||
|
credit = fields.Float( |
||||
|
digits=DIGITS, |
||||
|
) |
||||
|
company_currency_id = fields.Many2one( |
||||
|
comodel_name='res.currency', |
||||
|
) |
||||
|
amount_currency = fields.Monetary( |
||||
|
currency_field='currency_id', |
||||
|
) |
||||
|
currency_id = fields.Many2one( |
||||
|
comodel_name='res.currency', |
||||
|
) |
||||
|
currency_name = fields.Char() |
||||
|
taxes_description = fields.Char() |
||||
|
tax_id = fields.Many2one( |
||||
|
comodel_name='account.tax' |
||||
|
) |
||||
|
company_id = fields.Many2one( |
||||
|
comodel_name='res.company', |
||||
|
required=True, |
||||
|
ondelete='cascade' |
||||
|
) |
||||
|
|
||||
|
|
||||
|
class ReportJournalLedgerReportTaxLine(models.TransientModel): |
||||
|
|
||||
|
_name = 'report_journal_ledger_report_tax_line' |
||||
|
_order = 'tax_code' |
||||
|
|
||||
|
report_id = fields.Many2one( |
||||
|
comodel_name='report_journal_ledger', |
||||
|
required=True, |
||||
|
ondelete='cascade' |
||||
|
) |
||||
|
tax_id = fields.Many2one( |
||||
|
comodel_name='account.tax' |
||||
|
) |
||||
|
tax_name = fields.Char() |
||||
|
tax_code = fields.Char() |
||||
|
base_debit = fields.Float( |
||||
|
digits=DIGITS, |
||||
|
) |
||||
|
base_credit = fields.Float( |
||||
|
digits=DIGITS, |
||||
|
) |
||||
|
base_balance = fields.Float( |
||||
|
digits=DIGITS, |
||||
|
compute='_compute_base_balance', |
||||
|
) |
||||
|
tax_debit = fields.Float( |
||||
|
digits=DIGITS, |
||||
|
) |
||||
|
tax_credit = fields.Float( |
||||
|
digits=DIGITS, |
||||
|
) |
||||
|
tax_balance = fields.Float( |
||||
|
digits=DIGITS, |
||||
|
compute='_compute_tax_balance' |
||||
|
) |
||||
|
|
||||
|
@api.multi |
||||
|
def _compute_base_balance(self): |
||||
|
for rec in self: |
||||
|
rec.base_balance = rec.base_debit - rec.base_credit |
||||
|
|
||||
|
@api.multi |
||||
|
def _compute_tax_balance(self): |
||||
|
for rec in self: |
||||
|
rec.tax_balance = rec.tax_debit - rec.tax_credit |
||||
|
|
||||
|
|
||||
|
class ReportJournalLedgerJournalTaxLine(models.TransientModel): |
||||
|
|
||||
|
_name = 'report_journal_ledger_journal_tax_line' |
||||
|
_inherit = 'report_journal_ledger_report_tax_line' |
||||
|
_order = 'tax_code' |
||||
|
|
||||
|
report_journal_ledger_id = fields.Many2one( |
||||
|
comodel_name='report_journal_ledger_journal', |
||||
|
required=True, |
||||
|
ondelete='cascade', |
||||
|
) |
@ -0,0 +1,249 @@ |
|||||
|
# Author: Damien Crier |
||||
|
# Author: Julien Coux |
||||
|
# Copyright 2016 Camptocamp SA |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
||||
|
|
||||
|
from odoo import _, models |
||||
|
|
||||
|
|
||||
|
class JournalLedgerXslx(models.AbstractModel): |
||||
|
_name = 'report.a_f_r.report_journal_ledger_xlsx' |
||||
|
_inherit = 'report.account_financial_report.abstract_report_xlsx' |
||||
|
|
||||
|
def _get_report_name(self): |
||||
|
return _('Journal Ledger') |
||||
|
|
||||
|
def _get_report_columns(self, report): |
||||
|
columns = [ |
||||
|
{ |
||||
|
'header': _('Entry'), |
||||
|
'field': 'entry', |
||||
|
'width': 18 |
||||
|
}, |
||||
|
{ |
||||
|
'header': _('Date'), |
||||
|
'field': 'date', |
||||
|
'width': 11 |
||||
|
}, |
||||
|
{ |
||||
|
'header': _('Account'), |
||||
|
'field': 'account_code', |
||||
|
'width': 9 |
||||
|
}, |
||||
|
] |
||||
|
|
||||
|
if report.with_account_name: |
||||
|
columns.append({ |
||||
|
'header': _('Account Name'), |
||||
|
'field': 'account', |
||||
|
'width': 15 |
||||
|
}) |
||||
|
|
||||
|
columns += [ |
||||
|
{ |
||||
|
'header': _('Partner'), |
||||
|
'field': 'partner', |
||||
|
'width': 25 |
||||
|
}, |
||||
|
{ |
||||
|
'header': _('Ref - Label'), |
||||
|
'field': 'label', |
||||
|
'width': 40 |
||||
|
}, |
||||
|
{ |
||||
|
'header': _('Taxes'), |
||||
|
'field': 'taxes_description', |
||||
|
'width': 11 |
||||
|
}, |
||||
|
{ |
||||
|
'header': _('Debit'), |
||||
|
'field': 'debit', |
||||
|
'type': 'amount', |
||||
|
'width': 14, |
||||
|
}, |
||||
|
{ |
||||
|
'header': _('Credit'), |
||||
|
'field': 'credit', |
||||
|
'type': 'amount', |
||||
|
'width': 14 |
||||
|
} |
||||
|
] |
||||
|
|
||||
|
if report.foreign_currency: |
||||
|
columns += [ |
||||
|
{ |
||||
|
'header': _('Currency'), |
||||
|
'field': 'currency_id', |
||||
|
'type': 'many2one', |
||||
|
'width': 14 |
||||
|
}, |
||||
|
{ |
||||
|
'header': _('Amount Currency'), |
||||
|
'field': 'amount_currency', |
||||
|
'type': 'amount', |
||||
|
'width': 18 |
||||
|
}, |
||||
|
] |
||||
|
|
||||
|
columns_as_dict = {} |
||||
|
for i, column in enumerate(columns): |
||||
|
columns_as_dict[i] = column |
||||
|
return columns_as_dict |
||||
|
|
||||
|
def _get_journal_tax_columns(self, report): |
||||
|
return { |
||||
|
0: { |
||||
|
'header': _('Name'), |
||||
|
'field': 'tax_name', |
||||
|
'width': 35 |
||||
|
}, |
||||
|
1: { |
||||
|
'header': _('Description'), |
||||
|
'field': 'tax_code', |
||||
|
'width': 18 |
||||
|
}, |
||||
|
2: { |
||||
|
'header': _('Base Debit'), |
||||
|
'field': 'base_debit', |
||||
|
'type': 'amount', |
||||
|
'width': 14 |
||||
|
}, |
||||
|
3: { |
||||
|
'header': _('Base Credit'), |
||||
|
'field': 'base_credit', |
||||
|
'type': 'amount', |
||||
|
'width': 14 |
||||
|
}, |
||||
|
4: { |
||||
|
'header': _('Base Balance'), |
||||
|
'field': 'base_balance', |
||||
|
'type': 'amount', |
||||
|
'width': 14 |
||||
|
}, |
||||
|
5: { |
||||
|
'header': _('Tax Debit'), |
||||
|
'field': 'tax_debit', |
||||
|
'type': 'amount', |
||||
|
'width': 14 |
||||
|
}, |
||||
|
6: { |
||||
|
'header': _('Tax Credit'), |
||||
|
'field': 'tax_credit', |
||||
|
'type': 'amount', |
||||
|
'width': 14 |
||||
|
}, |
||||
|
7: { |
||||
|
'header': _('Tax Balance'), |
||||
|
'field': 'tax_balance', |
||||
|
'type': 'amount', |
||||
|
'width': 14 |
||||
|
}, |
||||
|
} |
||||
|
|
||||
|
def _get_col_count_filter_name(self): |
||||
|
return 2 |
||||
|
|
||||
|
def _get_col_count_filter_value(self): |
||||
|
return 3 |
||||
|
|
||||
|
def _get_report_filters(self, report): |
||||
|
target_label_by_value = { |
||||
|
value: label |
||||
|
for value, label in |
||||
|
self.env['journal.ledger.report.wizard']._get_move_targets() |
||||
|
} |
||||
|
|
||||
|
sort_option_label_by_value = { |
||||
|
value: label |
||||
|
for value, label in |
||||
|
self.env['journal.ledger.report.wizard']._get_sort_options() |
||||
|
} |
||||
|
|
||||
|
return [ |
||||
|
[ |
||||
|
_('Company'), |
||||
|
report.company_id.name |
||||
|
], |
||||
|
[ |
||||
|
_('Date range filter'), |
||||
|
_('From: %s To: %s') % (report.date_from, report.date_to) |
||||
|
], |
||||
|
[ |
||||
|
_('Target moves filter'), |
||||
|
_("%s") % target_label_by_value[report.move_target], |
||||
|
], |
||||
|
[ |
||||
|
_('Entries sorted by'), |
||||
|
_("%s") % sort_option_label_by_value[report.sort_option], |
||||
|
], |
||||
|
[ |
||||
|
_('Journals'), |
||||
|
', '.join([ |
||||
|
"%s - %s" % (report_journal.code, report_journal.name) |
||||
|
for report_journal in report.report_journal_ledger_ids |
||||
|
]) |
||||
|
|
||||
|
] |
||||
|
] |
||||
|
|
||||
|
def _generate_report_content(self, workbook, report): |
||||
|
group_option = report.group_option |
||||
|
if group_option == 'journal': |
||||
|
for report_journal in report.report_journal_ledger_ids: |
||||
|
self._generate_journal_content(workbook, report_journal) |
||||
|
elif group_option == 'none': |
||||
|
self._generate_no_group_content(workbook, report) |
||||
|
|
||||
|
def _generate_no_group_content(self, workbook, report): |
||||
|
self._generate_moves_content( |
||||
|
workbook, report, "Report", report.report_move_ids) |
||||
|
self._generate_no_group_taxes_summary(workbook, report) |
||||
|
|
||||
|
def _generate_journal_content(self, workbook, report_journal): |
||||
|
sheet_name = "%s (%s) - %s" % ( |
||||
|
report_journal.code, |
||||
|
report_journal.currency_id.name, |
||||
|
report_journal.name, |
||||
|
) |
||||
|
self._generate_moves_content( |
||||
|
workbook, report_journal.report_id, sheet_name, |
||||
|
report_journal.report_move_ids) |
||||
|
self._generate_journal_taxes_summary(workbook, report_journal) |
||||
|
|
||||
|
def _generate_no_group_taxes_summary(self, workbook, report): |
||||
|
self._generate_taxes_summary( |
||||
|
workbook, report, "Tax Report", report.report_tax_line_ids) |
||||
|
|
||||
|
def _generate_journal_taxes_summary(self, workbook, report_journal): |
||||
|
sheet_name = "Tax - %s (%s) - %s" % ( |
||||
|
report_journal.code, |
||||
|
report_journal.currency_id.name, |
||||
|
report_journal.name, |
||||
|
) |
||||
|
report = report_journal.report_id |
||||
|
self._generate_taxes_summary( |
||||
|
workbook, report, sheet_name, report_journal.report_tax_line_ids) |
||||
|
|
||||
|
def _generate_moves_content(self, workbook, report, sheet_name, moves): |
||||
|
self.workbook = workbook |
||||
|
self.sheet = workbook.add_worksheet(sheet_name) |
||||
|
self._set_column_width() |
||||
|
|
||||
|
self.row_pos = 1 |
||||
|
|
||||
|
self.write_array_title(sheet_name) |
||||
|
self.row_pos += 2 |
||||
|
|
||||
|
self.write_array_header() |
||||
|
for move in moves: |
||||
|
for line in move.report_move_line_ids: |
||||
|
self.write_line(line) |
||||
|
self.row_pos += 1 |
||||
|
|
||||
|
def _generate_taxes_summary(self, workbook, report, sheet_name, tax_lines): |
||||
|
self.workbook = workbook |
||||
|
self.sheet = workbook.add_worksheet(sheet_name) |
||||
|
|
||||
|
self.row_pos = 1 |
||||
|
self.write_array_title(sheet_name) |
||||
|
self.row_pos += 2 |
@ -0,0 +1,463 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
|
||||
|
<template id="report_journal_ledger_qweb"> |
||||
|
<t t-call="web.html_container"> |
||||
|
<t t-foreach="docs" t-as="o"> |
||||
|
<t t-call="account_financial_report.internal_layout"> |
||||
|
<t t-call="account_financial_report.report_journal_ledger_base"/> |
||||
|
</t> |
||||
|
</t> |
||||
|
</t> |
||||
|
</template> |
||||
|
|
||||
|
<template id="report_journal_ledger_base"> |
||||
|
<t t-set="title">Journal Ledger</t> |
||||
|
<t t-set="company_name" t-value="o.company_id.name"/> |
||||
|
<t t-set="display_currency" t-value="o.foreign_currency"/> |
||||
|
<t t-set="display_account_name" t-value="o.with_account_name"/> |
||||
|
|
||||
|
<div class="page"> |
||||
|
<t t-if="o.group_option == 'none'"> |
||||
|
<div class="page_break"> |
||||
|
<t t-call="account_financial_report.report_journal_all"/> |
||||
|
<br/> |
||||
|
<t t-call="account_financial_report.report_journal_all_taxes"/> |
||||
|
</div> |
||||
|
</t> |
||||
|
<t t-if="o.group_option == 'journal'"> |
||||
|
<t t-foreach="o.report_journal_ledger_ids" t-as="journal"> |
||||
|
<div class="page_break"> |
||||
|
<t t-call="account_financial_report.report_journal_ledger_journal"/> |
||||
|
<br/> |
||||
|
<t t-call="account_financial_report.report_journal_ledger_journal_taxes"/> |
||||
|
<br/> |
||||
|
</div> |
||||
|
</t> |
||||
|
</t> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<template id="account_financial_report.report_journal_all"> |
||||
|
<div class="act_as_table list_table" style="margin-top: 10px;"/> |
||||
|
<div class="act_as_table data_table" style="width: 100%;"> |
||||
|
<t t-call="account_financial_report.report_journal_ledger_journal_table_header"/> |
||||
|
<t t-foreach="o.report_move_ids" t-as="move"> |
||||
|
<t t-call="account_financial_report.report_journal_move"/> |
||||
|
</t> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<template id="account_financial_report.report_journal_ledger_journal"> |
||||
|
<div class="act_as_table list_table" style="margin-top: 10px;"/> |
||||
|
<div class="act_as_caption account_title" style="width: 100%;"> |
||||
|
<span t-field="journal.name"/> (<span t-field="journal.currency_id.display_name"/>) - <span t-field="o.date_from"/> to <span t-field="o.date_to"/> - <span t-field="o.move_target"/> Moves |
||||
|
</div> |
||||
|
|
||||
|
<div class="act_as_table data_table" style="width: 100%;"> |
||||
|
<t t-call="account_financial_report.report_journal_ledger_journal_table_header"/> |
||||
|
<t t-call="account_financial_report.report_journal_ledger_journal_first_line"/> |
||||
|
<t t-foreach="journal.report_move_ids" t-as="move"> |
||||
|
<t t-call="account_financial_report.report_journal_move"/> |
||||
|
</t> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<template id="account_financial_report.report_journal_ledger_journal_table_header"> |
||||
|
<t t-if="not display_account_name"> |
||||
|
<t t-set="account_column_style"> |
||||
|
width: 8.11%; |
||||
|
</t> |
||||
|
<t t-set="label_column_style"> |
||||
|
width: 38.92%; |
||||
|
</t> |
||||
|
</t> |
||||
|
<t t-else=""> |
||||
|
<t t-set="account_column_style"> |
||||
|
width: 23.78%; |
||||
|
</t> |
||||
|
<t t-set="label_column_style"> |
||||
|
width: 23.24%; |
||||
|
</t> |
||||
|
</t> |
||||
|
|
||||
|
<div class="act_as_thead"> |
||||
|
<div class="act_as_row labels"> |
||||
|
<div class="act_as_cell first_column" |
||||
|
name="entry" |
||||
|
style="width: 7.57%;"> |
||||
|
Entry |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="date" |
||||
|
style="width: 5.41%;"> |
||||
|
Date |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="account" t-att-style="account_column_style"> |
||||
|
Account |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="partner" |
||||
|
style="width: 15.14%;"> |
||||
|
Partner |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="label" t-att-style="label_column_style"> |
||||
|
Ref - Label |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="taxes" |
||||
|
style="width: 7.57%;"> |
||||
|
Taxes |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="debit" |
||||
|
style="width: 8.65%;"> |
||||
|
Debit |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="credit" |
||||
|
style="width: 8.65%;"> |
||||
|
Credit |
||||
|
</div> |
||||
|
<t t-if="display_currency"> |
||||
|
<div class="act_as_cell" |
||||
|
name="currency_name" |
||||
|
style="width: 2.16%;"> |
||||
|
Cur. |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="amount_currency" |
||||
|
style="width: 6.49%;"> |
||||
|
Amount Cur. |
||||
|
</div> |
||||
|
</t> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<template id="account_financial_report.report_journal_ledger_journal_first_line"> |
||||
|
<div class="act_as_row lines"> |
||||
|
<div class="act_as_cell" |
||||
|
name="entry"/> |
||||
|
<div class="act_as_cell" |
||||
|
name="date"/> |
||||
|
<div class="act_as_cell" |
||||
|
name="account"/> |
||||
|
<div class="act_as_cell" |
||||
|
name="partner"/> |
||||
|
<div class="act_as_cell" |
||||
|
name="label"/> |
||||
|
<div class="act_as_cell" |
||||
|
name="taxes"/> |
||||
|
<div class="act_as_cell amount" |
||||
|
name="debit"> |
||||
|
<b><span t-field="journal.debit"/></b> |
||||
|
</div> |
||||
|
<div class="act_as_cell amount" |
||||
|
name="credit"> |
||||
|
<b><span t-field="journal.credit"/></b> |
||||
|
</div> |
||||
|
<t t-if="display_currency"> |
||||
|
<div class="act_as_cell" |
||||
|
name="currency_name"> |
||||
|
</div> |
||||
|
<div class="act_as_cell amount" |
||||
|
name="amount_currency"> |
||||
|
</div> |
||||
|
</t> |
||||
|
</div> |
||||
|
<div style="width: 100%"/> |
||||
|
</template> |
||||
|
|
||||
|
<template id="account_financial_report.report_journal_move"> |
||||
|
<t t-set="display_move_info" t-value="True"/> |
||||
|
<t t-set="last_partner" t-eval="None"/> |
||||
|
<t t-set="display_partner" t-eval="True"/> |
||||
|
<t t-foreach="move.report_move_line_ids" t-as="move_line"> |
||||
|
<div class="act_as_row lines"> |
||||
|
<t t-set="current_partner" t-value="move_line.partner_id"/> |
||||
|
<t t-set="display_partner" t-value="current_partner != last_partner"/> |
||||
|
<t t-call="account_financial_report.report_journal_move_line"/> |
||||
|
<t t-set="last_partner" t-value="current_partner"/> |
||||
|
<t t-set="display_move_info" t-value="False"/> |
||||
|
</div> |
||||
|
</t> |
||||
|
</template> |
||||
|
|
||||
|
<template id="account_financial_report.report_journal_move_line"> |
||||
|
<div class="act_as_cell left" |
||||
|
name="entry"> |
||||
|
<span t-if="display_move_info" t-field="move_line.entry"/> |
||||
|
</div> |
||||
|
<div class="act_as_cell left" |
||||
|
name="date"> |
||||
|
<span t-if="display_move_info" t-field="move_line.date"/> |
||||
|
</div> |
||||
|
<div class="act_as_cell left" |
||||
|
name="account"> |
||||
|
<span t-field="move_line.account_code"/> |
||||
|
<span t-if="display_account_name"> |
||||
|
- <span t-field="move_line.account"/> |
||||
|
</span> |
||||
|
</div> |
||||
|
<div class="act_as_cell left" |
||||
|
name="partner"> |
||||
|
<span t-if="display_partner" t-field="move_line.partner"/> |
||||
|
</div> |
||||
|
<div class="act_as_cell left" |
||||
|
name="label"> |
||||
|
<span t-field="move_line.label"/> |
||||
|
</div> |
||||
|
<div class="act_as_cell left" |
||||
|
name="taxes"> |
||||
|
<span t-field="move_line.taxes_description"/> |
||||
|
</div> |
||||
|
<div class="act_as_cell amount" |
||||
|
name="debit"> |
||||
|
<t t-if="move_line.debit"> |
||||
|
<span t-field="move_line.debit"/> |
||||
|
</t> |
||||
|
</div> |
||||
|
<div class="act_as_cell amount" |
||||
|
name="credit"> |
||||
|
<t t-if="move_line.credit"> |
||||
|
<span t-field="move_line.credit"/> |
||||
|
</t> |
||||
|
</div> |
||||
|
<t t-if="display_currency"> |
||||
|
<div class="act_as_cell" |
||||
|
name="currency_name"> |
||||
|
<t t-if="move_line.currency_name"> |
||||
|
<span t-field="move_line.currency_name"/> |
||||
|
</t> |
||||
|
</div> |
||||
|
<div class="act_as_cell amount" |
||||
|
name="amount_currency"> |
||||
|
<t t-if="move_line.amount_currency"> |
||||
|
<span t-field="move_line.amount_currency"/> |
||||
|
</t> |
||||
|
</div> |
||||
|
</t> |
||||
|
</template> |
||||
|
|
||||
|
<template id="account_financial_report.report_journal_ledger_journal_taxes"> |
||||
|
<b>Taxes summary</b> |
||||
|
<div class="act_as_table data_table" style="width: 100%;"> |
||||
|
<div class="act_as_thead"> |
||||
|
<div class="act_as_row labels"> |
||||
|
<div class="act_as_cell first_column" |
||||
|
name="name" |
||||
|
style="width: 30.97%;"> |
||||
|
Name |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="description" |
||||
|
style="width: 13.27%;"> |
||||
|
Description |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="base_amount" |
||||
|
style="width: 27.88%;"> |
||||
|
Base Amount |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="tax_amount" |
||||
|
style="width: 27.88%;"> |
||||
|
Tax Amount |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="act_as_table data_table" style="width: 100%;"> |
||||
|
<div class="act_as_row labels"> |
||||
|
<div class="act_as_cell first_column" |
||||
|
name="name" |
||||
|
style="width: 30.97%;"/> |
||||
|
<div class="act_as_cell" |
||||
|
name="description" |
||||
|
style="width: 13.27%;"/> |
||||
|
<div class="act_as_cell" |
||||
|
name="base_debit" |
||||
|
style="width: 9.29%;"> |
||||
|
Debit |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="base_credit" |
||||
|
style="width: 9.29%;"> |
||||
|
Credit |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="base_balance" |
||||
|
style="width: 9.29%;"> |
||||
|
Balance |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="tax_debit" |
||||
|
style="width: 9.29%;"> |
||||
|
Debit |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="tax_credit" |
||||
|
style="width: 9.29%;"> |
||||
|
Credit |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="tax_balance" |
||||
|
style="width: 9.29%;"> |
||||
|
Balance |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<t t-foreach="journal.report_tax_line_ids" t-as="tax_line"> |
||||
|
<div class="act_as_row lines"> |
||||
|
<div class="act_as_cell left" |
||||
|
name="tax_name"> |
||||
|
<span t-field="tax_line.tax_name"/> |
||||
|
</div> |
||||
|
<div class="act_as_cell left" |
||||
|
name="tax_code"> |
||||
|
<span t-field="tax_line.tax_code"/> |
||||
|
</div> |
||||
|
<div class="act_as_cell amount" |
||||
|
name="base_debit"> |
||||
|
<span t-field="tax_line.base_debit"/> |
||||
|
</div> |
||||
|
<div class="act_as_cell amount" |
||||
|
name="base_credit"> |
||||
|
<span t-field="tax_line.base_credit"/> |
||||
|
</div> |
||||
|
<div class="act_as_cell amount" |
||||
|
name="base_balance"> |
||||
|
<span t-field="tax_line.base_balance"/> |
||||
|
</div> |
||||
|
<div class="act_as_cell amount" |
||||
|
name="tax_debit"> |
||||
|
<span t-field="tax_line.tax_debit"/> |
||||
|
</div> |
||||
|
<div class="act_as_cell amount" |
||||
|
name="tax_credit"> |
||||
|
<span t-field="tax_line.tax_credit"/> |
||||
|
</div> |
||||
|
<div class="act_as_cell amount" |
||||
|
name="tax_balance"> |
||||
|
<span t-field="tax_line.tax_balance"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</t> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<template id="account_financial_report.report_journal_all_taxes"> |
||||
|
<b>Taxes summary</b> |
||||
|
<div class="act_as_table data_table" style="width: 100%;"> |
||||
|
<div class="act_as_thead"> |
||||
|
<div class="act_as_row labels"> |
||||
|
<div class="act_as_cell first_column" |
||||
|
name="name" |
||||
|
style="width: 30.97%;"> |
||||
|
Name |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="description" |
||||
|
style="width: 13.27%;"> |
||||
|
Description |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="base_amount" |
||||
|
style="width: 27.88%;"> |
||||
|
Base Amount |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="tax_amount" |
||||
|
style="width: 27.88%;"> |
||||
|
Tax Amount |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="act_as_table data_table" style="width: 100%;">10 |
||||
|
<div class="act_as_row labels"> |
||||
|
<div class="act_as_cell first_column" |
||||
|
name="name" |
||||
|
style="width: 30.97%;"/> |
||||
|
<div class="act_as_cell" |
||||
|
name="description" |
||||
|
style="width: 13.27%;"/> |
||||
|
<div class="act_as_cell" |
||||
|
name="base_debit" |
||||
|
style="width: 9.29%;"> |
||||
|
Debit |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="base_credit" |
||||
|
style="width: 9.29%;"> |
||||
|
Credit |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="base_balance" |
||||
|
style="width: 9.29%;"> |
||||
|
Balance |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="tax_debit" |
||||
|
style="width: 9.29%;"> |
||||
|
Debit |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="tax_credit" |
||||
|
style="width: 9.29%;"> |
||||
|
Credit |
||||
|
</div> |
||||
|
<div class="act_as_cell" |
||||
|
name="tax_balance" |
||||
|
style="width: 9.29%;"> |
||||
|
Balance |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<t t-foreach="o.report_tax_line_ids" t-as="tax_line"> |
||||
|
<div class="act_as_row lines"> |
||||
|
<div class="act_as_cell left" |
||||
|
name="tax_name"> |
||||
|
<span t-field="tax_line.tax_name"/> |
||||
|
</div> |
||||
|
<div class="act_as_cell left" |
||||
|
name="tax_code"> |
||||
|
<span t-field="tax_line.tax_code"/> |
||||
|
</div> |
||||
|
<div class="act_as_cell amount" |
||||
|
name="base_debit"> |
||||
|
<span t-field="tax_line.base_debit"/> |
||||
|
</div> |
||||
|
<div class="act_as_cell amount" |
||||
|
name="base_credit"> |
||||
|
<span t-field="tax_line.base_credit"/> |
||||
|
</div> |
||||
|
<div class="act_as_cell amount" |
||||
|
name="base_balance"> |
||||
|
<span t-field="tax_line.base_balance"/> |
||||
|
</div> |
||||
|
<div class="act_as_cell amount" |
||||
|
name="tax_debit"> |
||||
|
<span t-field="tax_line.tax_debit"/> |
||||
|
</div> |
||||
|
<div class="act_as_cell amount" |
||||
|
name="tax_credit"> |
||||
|
<span t-field="tax_line.tax_credit"/> |
||||
|
</div> |
||||
|
<div class="act_as_cell amount" |
||||
|
name="tax_balance"> |
||||
|
<span t-field="tax_line.tax_balance"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</t> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
</odoo> |
@ -0,0 +1,78 @@ |
|||||
|
# Copyright 2018 Forest and Biomass Romania |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
||||
|
|
||||
|
import logging |
||||
|
from . import abstract_test |
||||
|
|
||||
|
_logger = logging.getLogger(__name__) |
||||
|
|
||||
|
|
||||
|
class AbstractTestForeignCurrency(abstract_test.AbstractTest): |
||||
|
"""Common technical tests for all reports.""" |
||||
|
|
||||
|
def _chart_template_create(self): |
||||
|
super(AbstractTestForeignCurrency, self)._chart_template_create() |
||||
|
# Account for foreign payments |
||||
|
self.account_type_other = self.env['account.account.type'].create( |
||||
|
{'name': 'foreign expenses', |
||||
|
'type': 'other', |
||||
|
}) |
||||
|
act = self.env['account.account.template'].create({ |
||||
|
'code': '0012', |
||||
|
'name': 'Foreign Expenses', |
||||
|
'user_type_id': self.account_type_other.id, |
||||
|
'chart_template_id': self.chart.id, |
||||
|
'currency_id': self.env.ref('base.EUR').id, |
||||
|
}) |
||||
|
self.env['ir.model.data'].create({ |
||||
|
'res_id': act.id, |
||||
|
'model': act._name, |
||||
|
'name': 'foreign expenses', |
||||
|
}) |
||||
|
return True |
||||
|
|
||||
|
def _add_chart_of_accounts(self): |
||||
|
super(AbstractTestForeignCurrency, self)._add_chart_of_accounts() |
||||
|
self.foreign_expense = self.env['account.account'].search( |
||||
|
[('currency_id', '=', self.env.ref('base.EUR').id)], limit=1) |
||||
|
self.foreign_currency_id = self.foreign_expense.currency_id |
||||
|
return True |
||||
|
|
||||
|
def _journals_create(self): |
||||
|
super(AbstractTestForeignCurrency, self)._journals_create() |
||||
|
self.journal_foreign_purchases = self.env['account.journal'].create({ |
||||
|
'company_id': self.company.id, |
||||
|
'name': 'Test journal for purchase', |
||||
|
'type': 'purchase', |
||||
|
'code': 'TFORPUR', |
||||
|
'default_debit_account_id': self.foreign_expense.id, |
||||
|
'default_credit_account_id': self.foreign_expense.id, |
||||
|
'currency_id': self.foreign_currency_id.id, |
||||
|
}) |
||||
|
return True |
||||
|
|
||||
|
def _invoice_create(self): |
||||
|
super(AbstractTestForeignCurrency, self)._invoice_create() |
||||
|
# vendor bill foreign currency |
||||
|
foreign_vendor_invoice_lines = [(0, False, { |
||||
|
'name': 'Test description #1', |
||||
|
'account_id': self.revenue.id, |
||||
|
'quantity': 1.0, |
||||
|
'price_unit': 100.0, |
||||
|
'currency_id': self.foreign_currency_id.id, |
||||
|
}), (0, False, { |
||||
|
'name': 'Test description #2', |
||||
|
'account_id': self.revenue.id, |
||||
|
'quantity': 2.0, |
||||
|
'price_unit': 25.0, |
||||
|
'currency_id': self.foreign_currency_id.id, |
||||
|
})] |
||||
|
self.foreign_invoice_in = self.env['account.invoice'].create({ |
||||
|
'partner_id': self.partner.id, |
||||
|
'type': 'in_invoice', |
||||
|
'invoice_line_ids': foreign_vendor_invoice_lines, |
||||
|
'account_id': self.partner.property_account_payable_id.id, |
||||
|
'journal_id': self.journal_foreign_purchases.id, |
||||
|
}) |
||||
|
self.foreign_invoice_in.action_invoice_open() |
||||
|
return True |
@ -0,0 +1,366 @@ |
|||||
|
# Copyright 2017 ACSONE SA/NV |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
||||
|
|
||||
|
import time |
||||
|
|
||||
|
from datetime import datetime |
||||
|
from dateutil.relativedelta import relativedelta |
||||
|
|
||||
|
from odoo.fields import Date |
||||
|
from odoo.tests.common import TransactionCase |
||||
|
|
||||
|
from . import abstract_test_foreign_currency as a_t_f_c |
||||
|
|
||||
|
|
||||
|
class TestJournalLedger(a_t_f_c.AbstractTestForeignCurrency): |
||||
|
""" |
||||
|
Technical tests for General Ledger Report. |
||||
|
""" |
||||
|
def _getReportModel(self): |
||||
|
return self.env['report_journal_ledger'] |
||||
|
|
||||
|
def _getQwebReportName(self): |
||||
|
return 'account_financial_report.report_journal_ledger_qweb' |
||||
|
|
||||
|
def _getXlsxReportName(self): |
||||
|
return 'a_f_r.report_journal_ledger_xlsx' |
||||
|
|
||||
|
def _getXlsxReportActionName(self): |
||||
|
return 'account_financial_report.' \ |
||||
|
'action_report_journal_ledger_xlsx' |
||||
|
|
||||
|
def _getReportTitle(self): |
||||
|
return 'Odoo' |
||||
|
|
||||
|
def _getBaseFilters(self): |
||||
|
return { |
||||
|
'date_from': time.strftime('%Y-01-01'), |
||||
|
'date_to': time.strftime('%Y-12-31'), |
||||
|
'company_id': self.company.id, |
||||
|
'journal_ids': [(6, 0, self.journal_sale.ids)] |
||||
|
} |
||||
|
|
||||
|
def _getAdditionalFiltersToBeTested(self): |
||||
|
return [ |
||||
|
{'move_target': "All", |
||||
|
'sort_option': "Date", |
||||
|
'group_option': "Journal", |
||||
|
'with_account_name': True, |
||||
|
'foreign_currency': True}, |
||||
|
] |
||||
|
|
||||
|
def test_02_generation_report_html(self): |
||||
|
"""Check if report HTML is correctly generated""" |
||||
|
|
||||
|
# Check if returned report action is correct |
||||
|
report_type = 'qweb-html' |
||||
|
report_action = self.report.print_report(report_type) |
||||
|
self.assertDictContainsSubset( |
||||
|
{ |
||||
|
'type': 'ir.actions.report', |
||||
|
'report_name': self.qweb_report_name, |
||||
|
'report_type': 'qweb-html', |
||||
|
}, |
||||
|
report_action |
||||
|
) |
||||
|
|
||||
|
# Check if report template is correct |
||||
|
report = self.env['ir.actions.report'].search( |
||||
|
[('report_name', '=', self.qweb_report_name), |
||||
|
('report_type', '=', report_type)], limit=1) |
||||
|
self.assertEqual(report.report_type, 'qweb-html') |
||||
|
|
||||
|
rep = report.render(self.report.ids, {}) |
||||
|
|
||||
|
self.assertTrue(self.report_title.encode('utf8') in rep[0]) |
||||
|
self.assertTrue( |
||||
|
self.report.journal_ids[0].name.encode('utf8') in rep[0] |
||||
|
) |
||||
|
|
||||
|
def test_04_compute_data(self): |
||||
|
return True |
||||
|
|
||||
|
|
||||
|
class TestJournalReport(TransactionCase): |
||||
|
|
||||
|
def setUp(self): |
||||
|
super(TestJournalReport, self).setUp() |
||||
|
self.AccountObj = self.env['account.account'] |
||||
|
self.InvoiceObj = self.env['account.invoice'] |
||||
|
self.JournalObj = self.env['account.journal'] |
||||
|
self.JournalReportObj = self.env['journal.ledger.report.wizard'] |
||||
|
self.MoveObj = self.env['account.move'] |
||||
|
self.ReportJournalLedger = self.env['report_journal_ledger'] |
||||
|
self.TaxObj = self.env['account.tax'] |
||||
|
|
||||
|
self.company = self.env.ref('base.main_company') |
||||
|
|
||||
|
today = datetime.today() |
||||
|
last_year = today - relativedelta(years=1) |
||||
|
|
||||
|
self.previous_fy_date_start = Date.to_string( |
||||
|
last_year.replace(month=1, day=1)) |
||||
|
self.previous_fy_date_end = Date.to_string( |
||||
|
last_year.replace(month=12, day=31)) |
||||
|
self.fy_date_start = Date.to_string( |
||||
|
today.replace(month=1, day=1)) |
||||
|
self.fy_date_end = Date.to_string( |
||||
|
today.replace(month=12, day=31)) |
||||
|
|
||||
|
self.receivable_account = self.AccountObj.search([ |
||||
|
('user_type_id.name', '=', 'Receivable') |
||||
|
], limit=1) |
||||
|
self.income_account = self.AccountObj.search([ |
||||
|
('user_type_id.name', '=', 'Income') |
||||
|
], limit=1) |
||||
|
self.payable_account = self.AccountObj.search([ |
||||
|
('user_type_id.name', '=', 'Payable') |
||||
|
], limit=1) |
||||
|
|
||||
|
self.journal_sale = self.JournalObj.create({ |
||||
|
'name': "Test journal sale", |
||||
|
'code': "TST-JRNL-S", |
||||
|
'type': 'sale', |
||||
|
'company_id': self.company.id, |
||||
|
}) |
||||
|
self.journal_purchase = self.JournalObj.create({ |
||||
|
'name': "Test journal purchase", |
||||
|
'code': "TST-JRNL-P", |
||||
|
'type': 'sale', |
||||
|
'company_id': self.company.id, |
||||
|
}) |
||||
|
|
||||
|
self.tax_15_s = self.TaxObj.create({ |
||||
|
'sequence': 30, |
||||
|
'name': 'Tax 15.0% (Percentage of Price)', |
||||
|
'amount': 15.0, |
||||
|
'amount_type': 'percent', |
||||
|
'include_base_amount': False, |
||||
|
'type_tax_use': 'sale', |
||||
|
}) |
||||
|
|
||||
|
self.tax_20_s = self.TaxObj.create({ |
||||
|
'sequence': 30, |
||||
|
'name': 'Tax 20.0% (Percentage of Price)', |
||||
|
'amount': 20.0, |
||||
|
'amount_type': 'percent', |
||||
|
'include_base_amount': False, |
||||
|
'type_tax_use': 'sale', |
||||
|
}) |
||||
|
|
||||
|
self.tax_15_p = self.TaxObj.create({ |
||||
|
'sequence': 30, |
||||
|
'name': 'Tax 15.0% (Percentage of Price)', |
||||
|
'amount': 15.0, |
||||
|
'amount_type': 'percent', |
||||
|
'include_base_amount': False, |
||||
|
'type_tax_use': 'purchase', |
||||
|
}) |
||||
|
|
||||
|
self.tax_20_p = self.TaxObj.create({ |
||||
|
'sequence': 30, |
||||
|
'name': 'Tax 20.0% (Percentage of Price)', |
||||
|
'amount': 20.0, |
||||
|
'amount_type': 'percent', |
||||
|
'include_base_amount': False, |
||||
|
'type_tax_use': 'purchase', |
||||
|
}) |
||||
|
|
||||
|
self.partner_2 = self.env.ref('base.res_partner_2') |
||||
|
|
||||
|
def _add_move( |
||||
|
self, date, journal, |
||||
|
receivable_debit, receivable_credit, income_debit, income_credit): |
||||
|
move_name = 'move name' |
||||
|
move_vals = { |
||||
|
'journal_id': journal.id, |
||||
|
'date': date, |
||||
|
'line_ids': [ |
||||
|
(0, 0, { |
||||
|
'name': move_name, |
||||
|
'debit': receivable_debit, |
||||
|
'credit': receivable_credit, |
||||
|
'account_id': self.receivable_account.id |
||||
|
}), |
||||
|
(0, 0, { |
||||
|
'name': move_name, |
||||
|
'debit': income_debit, |
||||
|
'credit': income_credit, |
||||
|
'account_id': self.income_account.id |
||||
|
}), |
||||
|
] |
||||
|
} |
||||
|
return self.MoveObj.create(move_vals) |
||||
|
|
||||
|
def check_report_journal_debit_credit( |
||||
|
self, report, expected_debit, expected_credit): |
||||
|
self.assertEqual( |
||||
|
expected_debit, |
||||
|
sum([journal.debit for journal in |
||||
|
report.report_journal_ledger_ids]) |
||||
|
) |
||||
|
|
||||
|
self.assertEqual( |
||||
|
expected_credit, |
||||
|
sum([journal.credit for journal in |
||||
|
report.report_journal_ledger_ids]) |
||||
|
) |
||||
|
|
||||
|
def check_report_journal_debit_credit_taxes( |
||||
|
self, report, |
||||
|
expected_base_debit, expected_base_credit, |
||||
|
expected_tax_debit, expected_tax_credit): |
||||
|
|
||||
|
self.assertEqual( |
||||
|
expected_base_debit, |
||||
|
sum([ |
||||
|
journal.base_debit |
||||
|
for journal in report.report_journal_ledger_tax_line_ids |
||||
|
]) |
||||
|
) |
||||
|
self.assertEqual( |
||||
|
expected_base_credit, |
||||
|
sum([ |
||||
|
journal.base_credit |
||||
|
for journal in report.report_journal_ledger_tax_line_ids |
||||
|
]) |
||||
|
) |
||||
|
self.assertEqual( |
||||
|
expected_tax_debit, |
||||
|
sum([ |
||||
|
journal.tax_debit |
||||
|
for journal in report.report_journal_ledger_tax_line_ids |
||||
|
]) |
||||
|
) |
||||
|
self.assertEqual( |
||||
|
expected_tax_credit, |
||||
|
sum([ |
||||
|
journal.tax_credit |
||||
|
for journal in report.report_journal_ledger_tax_line_ids |
||||
|
]) |
||||
|
) |
||||
|
|
||||
|
def test_01_test_total(self): |
||||
|
today_date = Date.today() |
||||
|
last_year_date = Date.to_string( |
||||
|
datetime.today() - relativedelta(years=1)) |
||||
|
|
||||
|
move1 = self._add_move( |
||||
|
today_date, self.journal_sale, |
||||
|
0, 100, 100, 0) |
||||
|
move2 = self._add_move( |
||||
|
last_year_date, self.journal_sale, |
||||
|
0, 100, 100, 0) |
||||
|
|
||||
|
report = self.ReportJournalLedger.create({ |
||||
|
'date_from': self.fy_date_start, |
||||
|
'date_to': self.fy_date_end, |
||||
|
'company_id': self.company.id, |
||||
|
'journal_ids': [(6, 0, self.journal_sale.ids)] |
||||
|
}) |
||||
|
report.compute_data_for_report() |
||||
|
|
||||
|
self.check_report_journal_debit_credit(report, 100, 100) |
||||
|
|
||||
|
move3 = self._add_move( |
||||
|
today_date, self.journal_sale, |
||||
|
0, 100, 100, 0) |
||||
|
|
||||
|
report.compute_data_for_report() |
||||
|
self.check_report_journal_debit_credit(report, 200, 200) |
||||
|
|
||||
|
report.move_target = 'posted' |
||||
|
report.compute_data_for_report() |
||||
|
self.check_report_journal_debit_credit(report, 0, 0) |
||||
|
|
||||
|
move1.post() |
||||
|
report.compute_data_for_report() |
||||
|
self.check_report_journal_debit_credit(report, 100, 100) |
||||
|
|
||||
|
move2.post() |
||||
|
report.compute_data_for_report() |
||||
|
self.check_report_journal_debit_credit(report, 100, 100) |
||||
|
|
||||
|
move3.post() |
||||
|
report.compute_data_for_report() |
||||
|
self.check_report_journal_debit_credit(report, 200, 200) |
||||
|
|
||||
|
report.date_from = self.previous_fy_date_start |
||||
|
report.compute_data_for_report() |
||||
|
self.check_report_journal_debit_credit(report, 300, 300) |
||||
|
|
||||
|
def test_02_test_taxes_out_invoice(self): |
||||
|
invoice_values = { |
||||
|
'journal_id': self.journal_sale.id, |
||||
|
'partner_id': self.partner_2.id, |
||||
|
'type': 'out_invoice', |
||||
|
'invoice_line_ids': [ |
||||
|
(0, 0, { |
||||
|
'quantity': 1.0, |
||||
|
'price_unit': 100, |
||||
|
'account_id': self.receivable_account.id, |
||||
|
'name': "Test", |
||||
|
'invoice_line_tax_ids': [(6, 0, [self.tax_15_s.id])], |
||||
|
}), |
||||
|
(0, 0, { |
||||
|
'quantity': 1.0, |
||||
|
'price_unit': 100, |
||||
|
'account_id': self.receivable_account.id, |
||||
|
'name': "Test", |
||||
|
'invoice_line_tax_ids': [(6, 0, [ |
||||
|
self.tax_15_s.id, self.tax_20_s.id |
||||
|
])], |
||||
|
}) |
||||
|
] |
||||
|
} |
||||
|
invoice = self.InvoiceObj.create(invoice_values) |
||||
|
invoice.action_invoice_open() |
||||
|
|
||||
|
report = self.ReportJournalLedger.create({ |
||||
|
'date_from': self.fy_date_start, |
||||
|
'date_to': self.fy_date_end, |
||||
|
'company_id': self.company.id, |
||||
|
'journal_ids': [(6, 0, self.journal_sale.ids)] |
||||
|
}) |
||||
|
report.compute_data_for_report() |
||||
|
|
||||
|
self.check_report_journal_debit_credit(report, 250, 250) |
||||
|
self.check_report_journal_debit_credit_taxes(report, 0, 300, 0, 50) |
||||
|
|
||||
|
def test_03_test_taxes_in_invoice(self): |
||||
|
invoice_values = { |
||||
|
'journal_id': self.journal_sale.id, |
||||
|
'partner_id': self.partner_2.id, |
||||
|
'type': 'in_invoice', |
||||
|
'invoice_line_ids': [ |
||||
|
(0, 0, { |
||||
|
'quantity': 1.0, |
||||
|
'price_unit': 100, |
||||
|
'account_id': self.payable_account.id, |
||||
|
'name': "Test", |
||||
|
'invoice_line_tax_ids': [(6, 0, [self.tax_15_p.id])], |
||||
|
}), |
||||
|
(0, 0, { |
||||
|
'quantity': 1.0, |
||||
|
'price_unit': 100, |
||||
|
'account_id': self.payable_account.id, |
||||
|
'name': "Test", |
||||
|
'invoice_line_tax_ids': [(6, 0, [ |
||||
|
self.tax_15_p.id, self.tax_20_p.id |
||||
|
])], |
||||
|
}) |
||||
|
] |
||||
|
} |
||||
|
invoice = self.InvoiceObj.create(invoice_values) |
||||
|
invoice.action_invoice_open() |
||||
|
|
||||
|
report = self.ReportJournalLedger.create({ |
||||
|
'date_from': self.fy_date_start, |
||||
|
'date_to': self.fy_date_end, |
||||
|
'company_id': self.company.id, |
||||
|
'journal_ids': [(6, 0, self.journal_sale.ids)] |
||||
|
}) |
||||
|
report.compute_data_for_report() |
||||
|
|
||||
|
self.check_report_journal_debit_credit(report, 250, 250) |
||||
|
self.check_report_journal_debit_credit_taxes(report, 300, 0, 50, 0) |
@ -0,0 +1,9 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<template id="report_journal_ledger"> |
||||
|
<div class="o_account_financial_reports_page"> |
||||
|
<t t-call="account_financial_report.report_buttons"/> |
||||
|
<t t-call="account_financial_report.report_journal_ledger_base"/> |
||||
|
</div> |
||||
|
</template> |
||||
|
</odoo> |
@ -1,5 +1,6 @@ |
|||||
from . import aged_partner_balance_wizard |
from . import aged_partner_balance_wizard |
||||
from . import general_ledger_wizard |
from . import general_ledger_wizard |
||||
|
from . import journal_ledger_wizard |
||||
from . import open_items_wizard |
from . import open_items_wizard |
||||
from . import trial_balance_wizard |
from . import trial_balance_wizard |
||||
from . import vat_report_wizard |
from . import vat_report_wizard |
@ -0,0 +1,142 @@ |
|||||
|
# Copyright 2017 ACSONE SA/NV |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
||||
|
|
||||
|
from odoo import api, fields, models, _ |
||||
|
from odoo.tools.safe_eval import safe_eval |
||||
|
from odoo.tools import pycompat |
||||
|
|
||||
|
|
||||
|
class JournalLedgerReportWizard(models.TransientModel): |
||||
|
"""Journal Ledger report wizard.""" |
||||
|
|
||||
|
_name = 'journal.ledger.report.wizard' |
||||
|
_description = "Journal Ledger Report Wizard" |
||||
|
|
||||
|
company_id = fields.Many2one( |
||||
|
comodel_name='res.company', |
||||
|
default=lambda self: self.env.user.company_id, |
||||
|
string='Company', |
||||
|
required=True, |
||||
|
ondelete='cascade', |
||||
|
) |
||||
|
date_range_id = fields.Many2one( |
||||
|
comodel_name='date.range', |
||||
|
string='Date range', |
||||
|
domain="['|', " |
||||
|
"('company_id', '=', False)," |
||||
|
"('company_id', '=', company_id)]", |
||||
|
) |
||||
|
date_from = fields.Date( |
||||
|
string="Start date", |
||||
|
required=True |
||||
|
) |
||||
|
date_to = fields.Date( |
||||
|
string="End date", |
||||
|
required=True |
||||
|
) |
||||
|
journal_ids = fields.Many2many( |
||||
|
comodel_name='account.journal', |
||||
|
string="Journals", |
||||
|
domain="[('company_id', '=', company_id)]", |
||||
|
required=True, |
||||
|
) |
||||
|
move_target = fields.Selection( |
||||
|
selection='_get_move_targets', |
||||
|
default='all', |
||||
|
required=True, |
||||
|
) |
||||
|
foreign_currency = fields.Boolean() |
||||
|
sort_option = fields.Selection( |
||||
|
selection='_get_sort_options', |
||||
|
string="Sort entries by", |
||||
|
default='move_name', |
||||
|
required=True, |
||||
|
) |
||||
|
group_option = fields.Selection( |
||||
|
selection='_get_group_options', |
||||
|
string="Group entries by", |
||||
|
default='journal', |
||||
|
required=True, |
||||
|
) |
||||
|
with_account_name = fields.Boolean( |
||||
|
default=False, |
||||
|
) |
||||
|
|
||||
|
@api.model |
||||
|
def _get_move_targets(self): |
||||
|
return [ |
||||
|
('all', _("All")), |
||||
|
('posted', _("Posted")), |
||||
|
('draft', _("Not Posted")) |
||||
|
] |
||||
|
|
||||
|
@api.model |
||||
|
def _get_sort_options(self): |
||||
|
return [ |
||||
|
('move_name', _("Entry number")), |
||||
|
('date', _("Date")), |
||||
|
] |
||||
|
|
||||
|
@api.model |
||||
|
def _get_group_options(self): |
||||
|
return [ |
||||
|
('journal', _("Journal")), |
||||
|
('none', _("No group")), |
||||
|
] |
||||
|
|
||||
|
@api.onchange('date_range_id') |
||||
|
def onchange_date_range_id(self): |
||||
|
self.date_from = self.date_range_id.date_start |
||||
|
self.date_to = self.date_range_id.date_end |
||||
|
|
||||
|
@api.multi |
||||
|
def button_export_html(self): |
||||
|
self.ensure_one() |
||||
|
action = self.env.ref( |
||||
|
'account_financial_report.action_report_journal_ledger') |
||||
|
vals = action.read()[0] |
||||
|
context1 = vals.get('context', {}) |
||||
|
if isinstance(context1, pycompat.string_types): |
||||
|
context1 = safe_eval(context1) |
||||
|
model = self.env['report_journal_ledger'] |
||||
|
report = model.create(self._prepare_report_journal_ledger()) |
||||
|
report.compute_data_for_report() |
||||
|
context1['active_id'] = report.id |
||||
|
context1['active_ids'] = report.ids |
||||
|
vals['context'] = context1 |
||||
|
return vals |
||||
|
|
||||
|
@api.multi |
||||
|
def button_export_pdf(self): |
||||
|
self.ensure_one() |
||||
|
report_type = 'qweb-pdf' |
||||
|
return self._export(report_type) |
||||
|
|
||||
|
@api.multi |
||||
|
def button_export_xlsx(self): |
||||
|
self.ensure_one() |
||||
|
report_type = 'xlsx' |
||||
|
return self._export(report_type) |
||||
|
|
||||
|
@api.multi |
||||
|
def _prepare_report_journal_ledger(self): |
||||
|
self.ensure_one() |
||||
|
return { |
||||
|
'date_from': self.date_from, |
||||
|
'date_to': self.date_to, |
||||
|
'move_target': self.move_target, |
||||
|
'foreign_currency': self.foreign_currency, |
||||
|
'company_id': self.company_id.id, |
||||
|
'journal_ids': [(6, 0, self.journal_ids.ids)], |
||||
|
'sort_option': self.sort_option, |
||||
|
'group_option': self.group_option, |
||||
|
'with_account_name': self.with_account_name, |
||||
|
} |
||||
|
|
||||
|
def _export(self, report_type): |
||||
|
"""Default export is PDF.""" |
||||
|
self.ensure_one() |
||||
|
model = self.env['report_journal_ledger'] |
||||
|
report = model.create(self._prepare_report_journal_ledger()) |
||||
|
report.compute_data_for_report() |
||||
|
return report.print_report(report_type) |
@ -0,0 +1,66 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<!-- Copyright 2017 ACSONE SA/NV |
||||
|
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). --> |
||||
|
|
||||
|
<odoo> |
||||
|
|
||||
|
|
||||
|
<record id="journal_ledger_wizard" model="ir.ui.view"> |
||||
|
<field name="name">Journal Ledger</field> |
||||
|
<field name="model">journal.ledger.report.wizard</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form> |
||||
|
<group> |
||||
|
<field name="company_id" groups="base.group_multi_company"/> |
||||
|
</group> |
||||
|
|
||||
|
<separator string="Periods"/> |
||||
|
<group> |
||||
|
<group> |
||||
|
<field name="date_range_id"/> |
||||
|
<field name="date_from"/> |
||||
|
<field name="date_to"/> |
||||
|
</group> |
||||
|
<group/> |
||||
|
</group> |
||||
|
|
||||
|
<separator string="Options"/> |
||||
|
<group name="options"> |
||||
|
<group> |
||||
|
<field name="move_target" widget="radio" options="{'horizontal': true}"/> |
||||
|
<field name="sort_option"/> |
||||
|
<field name="group_option"/> |
||||
|
<field name="foreign_currency"/> |
||||
|
<field name="with_account_name"/> |
||||
|
</group> |
||||
|
<group/> |
||||
|
</group> |
||||
|
|
||||
|
<separator string="Journals"/> |
||||
|
<group> |
||||
|
<field name="journal_ids" widget="many2many_tags"/> |
||||
|
</group> |
||||
|
|
||||
|
<footer> |
||||
|
<button name="button_export_html" string="View" |
||||
|
type="object" default_focus="1" class="oe_highlight"/> |
||||
|
or |
||||
|
<button name="button_export_pdf" string="Export PDF" type="object"/> |
||||
|
or |
||||
|
<button name="button_export_xlsx" string="Export XLSX" type="object"/> |
||||
|
or |
||||
|
<button string="Cancel" class="oe_link" special="cancel" /> |
||||
|
</footer> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<act_window id="action_journal_ledger_wizard" |
||||
|
name="Journal Ledger" |
||||
|
res_model="journal.ledger.report.wizard" |
||||
|
view_type="form" |
||||
|
view_mode="form" |
||||
|
view_id="journal_ledger_wizard" |
||||
|
target="new" /> |
||||
|
|
||||
|
</odoo> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue