Browse Source

[MIG] account_financial_report: Migration to 13.0

pull/663/head
Ernesto Tejeda 4 years ago
parent
commit
8d2b7752c6
  1. 28
      account_financial_report/README.rst
  2. 5
      account_financial_report/__manifest__.py
  3. 5
      account_financial_report/models/account_group.py
  4. 3
      account_financial_report/models/account_move_line.py
  5. 1
      account_financial_report/readme/CONTRIBUTORS.rst
  6. 2
      account_financial_report/readme/DESCRIPTION.rst
  7. 7
      account_financial_report/readme/ROADMAP.rst
  8. 26
      account_financial_report/report/abstract_report_xlsx.py
  9. 14
      account_financial_report/report/aged_partner_balance.py
  10. 1
      account_financial_report/report/aged_partner_balance_xlsx.py
  11. 7
      account_financial_report/report/general_ledger.py
  12. 18
      account_financial_report/report/general_ledger_xlsx.py
  13. 80
      account_financial_report/report/journal_ledger.py
  14. 7
      account_financial_report/report/journal_ledger_xlsx.py
  15. 29
      account_financial_report/report/open_items.py
  16. 1
      account_financial_report/report/open_items_xlsx.py
  17. 17
      account_financial_report/report/trial_balance.py
  18. 1
      account_financial_report/report/trial_balance_xlsx.py
  19. 20
      account_financial_report/report/vat_report.py
  20. 1
      account_financial_report/report/vat_report_xlsx.py
  21. 62
      account_financial_report/static/description/index.html
  22. 10
      account_financial_report/tests/test_general_ledger.py
  23. 156
      account_financial_report/tests/test_journal_ledger.py
  24. 59
      account_financial_report/tests/test_trial_balance.py
  25. 156
      account_financial_report/tests/test_vat_report.py
  26. 0
      account_financial_report/view/report_vat_report.xml
  27. 12
      account_financial_report/wizard/aged_partner_balance_wizard.py
  28. 1
      account_financial_report/wizard/aged_partner_balance_wizard_view.xml
  29. 38
      account_financial_report/wizard/general_ledger_wizard.py
  30. 4
      account_financial_report/wizard/general_ledger_wizard_view.xml
  31. 23
      account_financial_report/wizard/journal_ledger_wizard.py
  32. 1
      account_financial_report/wizard/journal_ledger_wizard_view.xml
  33. 6
      account_financial_report/wizard/open_items_wizard.py
  34. 4
      account_financial_report/wizard/open_items_wizard_view.xml
  35. 27
      account_financial_report/wizard/trial_balance_wizard.py
  36. 1
      account_financial_report/wizard/trial_balance_wizard_view.xml
  37. 7
      account_financial_report/wizard/vat_report_wizard.py
  38. 1
      account_financial_report/wizard/vat_report_wizard_view.xml
  39. 1
      oca_dependencies.txt

28
account_financial_report/README.rst

@ -14,19 +14,19 @@ Account Financial Reports
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3 :alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Faccount--financial--reporting-lightgray.png?logo=github .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Faccount--financial--reporting-lightgray.png?logo=github
:target: https://github.com/OCA/account-financial-reporting/tree/12.0/account_financial_report
:target: https://github.com/OCA/account-financial-reporting/tree/13.0/account_financial_report
:alt: OCA/account-financial-reporting :alt: OCA/account-financial-reporting
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/account-financial-reporting-12-0/account-financial-reporting-12-0-account_financial_report
:target: https://translation.odoo-community.org/projects/account-financial-reporting-13-0/account-financial-reporting-13-0-account_financial_report
:alt: Translate me on Weblate :alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/91/12.0
:target: https://runbot.odoo-community.org/runbot/91/13.0
:alt: Try me on Runbot :alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5| |badge1| |badge2| |badge3| |badge4| |badge5|
This module adds a set of financial reports. They are accessible under This module adds a set of financial reports. They are accessible under
Accounting / Reporting / OCA Reports.
Invoicing / Reporting / OCA accounting reports.
- General ledger - General ledger
- Trial Balance - Trial Balance
@ -47,6 +47,14 @@ currency balances are not available.
.. contents:: .. contents::
:local: :local:
Known issues / Roadmap
======================
* 'VAT Report' is valid only for cases where it's met that for each
Tax defined: all the "Account tags" of all the
'Repartition for Invoices' or 'Repartition for Credit Notes'
are different.
Changelog Changelog
========= =========
@ -76,7 +84,7 @@ Bug Tracker
Bugs are tracked on `GitHub Issues <https://github.com/OCA/account-financial-reporting/issues>`_. Bugs are tracked on `GitHub Issues <https://github.com/OCA/account-financial-reporting/issues>`_.
In case of trouble, please check there if your issue has already been reported. In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed If you spotted it first, help us smashing it by providing a detailed and welcomed
`feedback <https://github.com/OCA/account-financial-reporting/issues/new?body=module:%20account_financial_report%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
`feedback <https://github.com/OCA/account-financial-reporting/issues/new?body=module:%20account_financial_report%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues. Do not contact contributors directly about support or help with technical issues.
@ -89,12 +97,12 @@ Authors
* Camptocamp SA * Camptocamp SA
* initOS GmbH * initOS GmbH
* redCOR AG * redCOR AG
* Eficent
* ForgeFlow
Contributors Contributors
~~~~~~~~~~~~ ~~~~~~~~~~~~
* Jordi Ballester <jordi.ballester@eficient.com>
* Jordi Ballester <jordi.ballester@forgeflow.com>
* Yannick Vaucher <yannick.vaucher@camptocamp.com> * Yannick Vaucher <yannick.vaucher@camptocamp.com>
* Simone Orsi <simone.orsi@abstract.com> * Simone Orsi <simone.orsi@abstract.com>
* Leonardo Pistone <leonardo.pistone@camptocamp.com> * Leonardo Pistone <leonardo.pistone@camptocamp.com>
@ -110,11 +118,13 @@ Contributors
* Akim Juillerat <akim.juillerat@camptocamp.com> * Akim Juillerat <akim.juillerat@camptocamp.com>
* Alexis de Lattre <alexis@via.ecp.fr> * Alexis de Lattre <alexis@via.ecp.fr>
* Mihai Fekete <feketemihai@gmail.com> * Mihai Fekete <feketemihai@gmail.com>
* Miquel Raïch <miquel.raich@eficent.com>
* Miquel Raïch <miquel.raich@forgeflow.com>
* Joan Sisquella <joan.sisquella@forgeflow.com>
* `Tecnativa <https://www.tecnativa.com>`__: * `Tecnativa <https://www.tecnativa.com>`__:
* Pedro M. Baeza * Pedro M. Baeza
* Sergio Teruel * Sergio Teruel
* Ernesto Tejeda
Much of the work in this module was done at a sprint in Sorrento, Italy in Much of the work in this module was done at a sprint in Sorrento, Italy in
April 2016. April 2016.
@ -132,6 +142,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and mission is to support the collaborative development of Odoo features and
promote its widespread use. promote its widespread use.
This module is part of the `OCA/account-financial-reporting <https://github.com/OCA/account-financial-reporting/tree/12.0/account_financial_report>`_ project on GitHub.
This module is part of the `OCA/account-financial-reporting <https://github.com/OCA/account-financial-reporting/tree/13.0/account_financial_report>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

5
account_financial_report/__manifest__.py

@ -5,7 +5,7 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
{ {
"name": "Account Financial Reports", "name": "Account Financial Reports",
"version": "12.0.2.0.0",
"version": "13.0.1.0.0",
"category": "Reporting", "category": "Reporting",
"summary": "OCA Financial Reports", "summary": "OCA Financial Reports",
"author": "Camptocamp SA," "author": "Camptocamp SA,"
@ -14,7 +14,7 @@
"ForgeFlow," "ForgeFlow,"
"Odoo Community Association (OCA)", "Odoo Community Association (OCA)",
"website": "https://odoo-community.org/", "website": "https://odoo-community.org/",
"depends": ["account", "date_range", "report_xlsx",],
"depends": ["account", "date_range", "report_xlsx"],
"data": [ "data": [
"wizard/aged_partner_balance_wizard_view.xml", "wizard/aged_partner_balance_wizard_view.xml",
"wizard/general_ledger_wizard_view.xml", "wizard/general_ledger_wizard_view.xml",
@ -40,7 +40,6 @@
"view/report_aged_partner_balance.xml", "view/report_aged_partner_balance.xml",
"view/report_vat_report.xml", "view/report_vat_report.xml",
], ],
"external_dependencies": {"python": ["natsort", "pandas",],},
"installable": True, "installable": True,
"application": True, "application": True,
"auto_install": False, "auto_install": False,

5
account_financial_report/models/account_group.py

@ -36,13 +36,11 @@ class AccountGroup(models.Model):
""" Forms complete code of location from parent location to child location. """ """ Forms complete code of location from parent location to child location. """
if self.parent_id.complete_code: if self.parent_id.complete_code:
self.complete_code = "{}/{}".format( self.complete_code = "{}/{}".format(
self.parent_id.complete_code,
self.code_prefix,
self.parent_id.complete_code, self.code_prefix
) )
else: else:
self.complete_code = self.code_prefix self.complete_code = self.code_prefix
@api.multi
@api.depends("parent_id", "parent_id.level") @api.depends("parent_id", "parent_id.level")
def _compute_level(self): def _compute_level(self):
for group in self: for group in self:
@ -51,7 +49,6 @@ class AccountGroup(models.Model):
else: else:
group.level = group.parent_id.level + 1 group.level = group.parent_id.level + 1
@api.multi
@api.depends( @api.depends(
"code_prefix", "code_prefix",
"account_ids", "account_ids",

3
account_financial_report/models/account_move_line.py

@ -1,12 +1,11 @@
# Copyright 2019 ACSONE SA/NV (<http://acsone.eu>) # Copyright 2019 ACSONE SA/NV (<http://acsone.eu>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).- # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).-
from odoo import api, models
from odoo import models
class AccountMoveLine(models.Model): class AccountMoveLine(models.Model):
_inherit = "account.move.line" _inherit = "account.move.line"
@api.model_cr
def init(self): def init(self):
""" """
The join between accounts_partners subquery and account_move_line The join between accounts_partners subquery and account_move_line

1
account_financial_report/readme/CONTRIBUTORS.rst

@ -20,6 +20,7 @@
* Pedro M. Baeza * Pedro M. Baeza
* Sergio Teruel * Sergio Teruel
* Ernesto Tejeda
Much of the work in this module was done at a sprint in Sorrento, Italy in Much of the work in this module was done at a sprint in Sorrento, Italy in
April 2016. April 2016.

2
account_financial_report/readme/DESCRIPTION.rst

@ -1,5 +1,5 @@
This module adds a set of financial reports. They are accessible under This module adds a set of financial reports. They are accessible under
Accounting / Reporting / OCA Reports.
Invoicing / Reporting / OCA accounting reports.
- General ledger - General ledger
- Trial Balance - Trial Balance

7
account_financial_report/readme/ROADMAP.rst

@ -0,0 +1,7 @@
* 'VAT Report' is valid only for cases where it's met that for each
Tax defined: all the "Account tags" of all the
'Repartition for Invoices' or 'Repartition for Credit Notes'
are different.
* It would be nice to have in reports a column indicating the
state of the entries when the option "All Entries" is selected
in "Target Moves" field in a wizard

26
account_financial_report/report/abstract_report_xlsx.py

@ -6,6 +6,7 @@ from odoo import models
class AbstractReportXslx(models.AbstractModel): class AbstractReportXslx(models.AbstractModel):
_name = "report.account_financial_report.abstract_report_xlsx" _name = "report.account_financial_report.abstract_report_xlsx"
_description = "Abstract XLSX Account Financial Report"
_inherit = "report.report_xlsx.abstract" _inherit = "report.report_xlsx.abstract"
def __init__(self, pool, cr): def __init__(self, pool, cr):
@ -255,7 +256,7 @@ class AbstractReportXslx(models.AbstractModel):
and not isinstance(value, bool) and not isinstance(value, bool)
and not isinstance(value, int) and not isinstance(value, int)
): ):
value = value.strftime("%d/%m/%Y")
value = value and value.strftime("%d/%m/%Y")
self.sheet.write_string(self.row_pos, col_pos, value or "") self.sheet.write_string(self.row_pos, col_pos, value or "")
elif cell_type == "amount": elif cell_type == "amount":
if ( if (
@ -444,10 +445,10 @@ class AbstractReportXslx(models.AbstractModel):
def _get_currency_amt_format(self, line_object): def _get_currency_amt_format(self, line_object):
""" Return amount format specific for each currency. """ """ Return amount format specific for each currency. """
if hasattr(line_object, "account_group_id") and line_object.account_group_id: if hasattr(line_object, "account_group_id") and line_object.account_group_id:
format_amt = getattr(self, "format_amount_bold")
format_amt = self.format_amount_bold
field_prefix = "format_amount_bold" field_prefix = "format_amount_bold"
else: else:
format_amt = getattr(self, "format_amount")
format_amt = self.format_amount
field_prefix = "format_amount" field_prefix = "format_amount"
if line_object.currency_id: if line_object.currency_id:
field_name = "{}_{}".format(field_prefix, line_object.currency_id.name) field_name = "{}_{}".format(field_prefix, line_object.currency_id.name)
@ -455,7 +456,7 @@ class AbstractReportXslx(models.AbstractModel):
format_amt = getattr(self, field_name) format_amt = getattr(self, field_name)
else: else:
format_amt = self.workbook.add_format() format_amt = self.workbook.add_format()
setattr(self, "field_name", format_amt)
self.field_name = format_amt
format_amount = "#,##0." + ( format_amount = "#,##0." + (
"0" * line_object.currency_id.decimal_places "0" * line_object.currency_id.decimal_places
) )
@ -465,10 +466,10 @@ class AbstractReportXslx(models.AbstractModel):
def _get_currency_amt_format_dict(self, line_dict): def _get_currency_amt_format_dict(self, line_dict):
""" Return amount format specific for each currency. """ """ Return amount format specific for each currency. """
if line_dict.get("account_group_id", False) and line_dict["account_group_id"]: if line_dict.get("account_group_id", False) and line_dict["account_group_id"]:
format_amt = getattr(self, "format_amount_bold")
format_amt = self.format_amount_bold
field_prefix = "format_amount_bold" field_prefix = "format_amount_bold"
else: else:
format_amt = getattr(self, "format_amount")
format_amt = self.format_amount
field_prefix = "format_amount" field_prefix = "format_amount"
if line_dict.get("currency_id", False) and line_dict["currency_id"]: if line_dict.get("currency_id", False) and line_dict["currency_id"]:
currency = self.env["res.currency"].browse([line_dict["currency_id"]]) currency = self.env["res.currency"].browse([line_dict["currency_id"]])
@ -477,14 +478,14 @@ class AbstractReportXslx(models.AbstractModel):
format_amt = getattr(self, field_name) format_amt = getattr(self, field_name)
else: else:
format_amt = self.workbook.add_format() format_amt = self.workbook.add_format()
setattr(self, "field_name", format_amt)
self.field_name = format_amt
format_amount = "#,##0." + ("0" * currency.decimal_places) format_amount = "#,##0." + ("0" * currency.decimal_places)
format_amt.set_num_format(format_amount) format_amt.set_num_format(format_amount)
return format_amt return format_amt
def _get_currency_amt_header_format(self, line_object): def _get_currency_amt_header_format(self, line_object):
""" Return amount header format for each currency. """ """ Return amount header format for each currency. """
format_amt = getattr(self, "format_header_amount")
format_amt = self.format_header_amount
if line_object.currency_id: if line_object.currency_id:
field_name = "format_header_amount_%s" % line_object.currency_id.name field_name = "format_header_amount_%s" % line_object.currency_id.name
if hasattr(self, field_name): if hasattr(self, field_name):
@ -493,7 +494,7 @@ class AbstractReportXslx(models.AbstractModel):
format_amt = self.workbook.add_format( format_amt = self.workbook.add_format(
{"bold": True, "border": True, "bg_color": "#FFFFCC"} {"bold": True, "border": True, "bg_color": "#FFFFCC"}
) )
setattr(self, "field_name", format_amt)
self.field_name = format_amt
format_amount = "#,##0." + ( format_amount = "#,##0." + (
"0" * line_object.currency_id.decimal_places "0" * line_object.currency_id.decimal_places
) )
@ -502,7 +503,7 @@ class AbstractReportXslx(models.AbstractModel):
def _get_currency_amt_header_format_dict(self, line_object): def _get_currency_amt_header_format_dict(self, line_object):
""" Return amount header format for each currency. """ """ Return amount header format for each currency. """
format_amt = getattr(self, "format_header_amount")
format_amt = self.format_header_amount
if line_object["currency_id"]: if line_object["currency_id"]:
field_name = "format_header_amount_%s" % line_object["currency_name"] field_name = "format_header_amount_%s" % line_object["currency_name"]
if hasattr(self, field_name): if hasattr(self, field_name):
@ -511,7 +512,7 @@ class AbstractReportXslx(models.AbstractModel):
format_amt = self.workbook.add_format( format_amt = self.workbook.add_format(
{"bold": True, "border": True, "bg_color": "#FFFFCC"} {"bold": True, "border": True, "bg_color": "#FFFFCC"}
) )
setattr(self, "field_name", format_amt)
self.field_name = format_amt
format_amount = "#,##0." + ( format_amount = "#,##0." + (
"0" * line_object["currency_id"].decimal_places "0" * line_object["currency_id"].decimal_places
) )
@ -527,8 +528,7 @@ class AbstractReportXslx(models.AbstractModel):
def _get_report_complete_name(self, report, prefix, data=None): def _get_report_complete_name(self, report, prefix, data=None):
if report.company_id: if report.company_id:
suffix = " - {} - {}".format( suffix = " - {} - {}".format(
report.company_id.name,
report.company_id.currency_id.name,
report.company_id.name, report.company_id.currency_id.name
) )
return prefix + suffix return prefix + suffix
return prefix return prefix

14
account_financial_report/report/aged_partner_balance.py

@ -4,14 +4,13 @@
from datetime import date, datetime, timedelta from datetime import date, datetime, timedelta
import pandas as pd
from odoo import api, models from odoo import api, models
from odoo.tools import float_is_zero from odoo.tools import float_is_zero
class AgedPartnerBalanceReport(models.AbstractModel): class AgedPartnerBalanceReport(models.AbstractModel):
_name = "report.account_financial_report.aged_partner_balance" _name = "report.account_financial_report.aged_partner_balance"
_description = "Aged Partner Balance Report"
@api.model @api.model
def _initialize_account(self, ag_pb_data, acc_id): def _initialize_account(self, ag_pb_data, acc_id):
@ -122,7 +121,7 @@ class AgedPartnerBalanceReport(models.AbstractModel):
credit_amount[credit_move_id] = 0.0 credit_amount[credit_move_id] = 0.0
credit_amount[credit_move_id] += account_partial_reconcile_data["amount"] credit_amount[credit_move_id] += account_partial_reconcile_data["amount"]
account_partial_reconcile_data.update( account_partial_reconcile_data.update(
{"debit_move_id": debit_move_id, "credit_move_id": credit_move_id,}
{"debit_move_id": debit_move_id, "credit_move_id": credit_move_id}
) )
return accounts_partial_reconcile, debit_amount, credit_amount return accounts_partial_reconcile, debit_amount, credit_amount
@ -215,7 +214,6 @@ class AgedPartnerBalanceReport(models.AbstractModel):
move_lines = self.env["account.move.line"].search_read( move_lines = self.env["account.move.line"].search_read(
domain=domain, fields=ml_fields domain=domain, fields=ml_fields
) )
ml_ids = set(pd.DataFrame(move_lines).id.to_list())
journals_ids = set() journals_ids = set()
partners_ids = set() partners_ids = set()
partners_data = {} partners_data = {}
@ -227,9 +225,9 @@ class AgedPartnerBalanceReport(models.AbstractModel):
credit_amount, credit_amount,
) = self._get_account_partial_reconciled(company_id, date_at_object) ) = self._get_account_partial_reconciled(company_id, date_at_object)
if acc_partial_rec: if acc_partial_rec:
acc_partial_rec_data = pd.DataFrame(acc_partial_rec)
debit_ids = set(acc_partial_rec_data.debit_move_id.to_list())
credit_ids = set(acc_partial_rec_data.credit_move_id.to_list())
ml_ids = map(lambda r: r["id"], move_lines)
debit_ids = map(lambda r: r["debit_move_id"], acc_partial_rec)
credit_ids = map(lambda r: r["credit_move_id"], acc_partial_rec)
move_lines = self._recalculate_move_lines( move_lines = self._recalculate_move_lines(
move_lines, move_lines,
debit_ids, debit_ids,
@ -414,7 +412,6 @@ class AgedPartnerBalanceReport(models.AbstractModel):
) )
return aged_partner_data return aged_partner_data
@api.multi
def _get_report_values(self, docids, data): def _get_report_values(self, docids, data):
wizard_id = data["wizard_id"] wizard_id = data["wizard_id"]
company = self.env["res.company"].browse(data["company_id"]) company = self.env["res.company"].browse(data["company_id"])
@ -423,6 +420,7 @@ class AgedPartnerBalanceReport(models.AbstractModel):
partner_ids = data["partner_ids"] partner_ids = data["partner_ids"]
date_at = data["date_at"] date_at = data["date_at"]
date_at_object = datetime.strptime(date_at, "%Y-%m-%d").date() date_at_object = datetime.strptime(date_at, "%Y-%m-%d").date()
only_posted_moves = data["only_posted_moves"] only_posted_moves = data["only_posted_moves"]
show_move_line_details = data["show_move_line_details"] show_move_line_details = data["show_move_line_details"]
( (

1
account_financial_report/report/aged_partner_balance_xlsx.py

@ -7,6 +7,7 @@ from odoo import _, models
class AgedPartnerBalanceXslx(models.AbstractModel): class AgedPartnerBalanceXslx(models.AbstractModel):
_name = "report.a_f_r.report_aged_partner_balance_xlsx" _name = "report.a_f_r.report_aged_partner_balance_xlsx"
_description = "Aged Partner Balance XLSL Report"
_inherit = "report.account_financial_report.abstract_report_xlsx" _inherit = "report.account_financial_report.abstract_report_xlsx"
def _get_report_name(self, report, data=False): def _get_report_name(self, report, data=False):

7
account_financial_report/report/general_ledger.py

@ -4,15 +4,13 @@
import calendar import calendar
import datetime import datetime
from operator import itemgetter
from natsort import natsorted
from odoo import api, models from odoo import api, models
class GeneralLedgerReport(models.AbstractModel): class GeneralLedgerReport(models.AbstractModel):
_name = "report.account_financial_report.general_ledger" _name = "report.account_financial_report.general_ledger"
_description = "General Ledger Report"
def _get_accounts_data(self, account_ids): def _get_accounts_data(self, account_ids):
accounts = self.env["account.account"].browse(account_ids) accounts = self.env["account.account"].browse(account_ids)
@ -601,7 +599,6 @@ class GeneralLedgerReport(models.AbstractModel):
list_centralized_ml += list(centralized_ml[jnl_id].values()) list_centralized_ml += list(centralized_ml[jnl_id].values())
return list_centralized_ml return list_centralized_ml
@api.multi
def _get_report_values(self, docids, data): def _get_report_values(self, docids, data):
wizard_id = data["wizard_id"] wizard_id = data["wizard_id"]
company = self.env["res.company"].browse(data["company_id"]) company = self.env["res.company"].browse(data["company_id"])
@ -669,7 +666,7 @@ class GeneralLedgerReport(models.AbstractModel):
account["move_lines"] = centralized_ml account["move_lines"] = centralized_ml
account["partners"] = False account["partners"] = False
del account["list_partner"] del account["list_partner"]
general_ledger = natsorted(general_ledger, key=itemgetter("code"))
general_ledger = sorted(general_ledger, key=lambda k: k["code"])
return { return {
"doc_ids": [wizard_id], "doc_ids": [wizard_id],
"doc_model": "general.ledger.report.wizard", "doc_model": "general.ledger.report.wizard",

18
account_financial_report/report/general_ledger_xlsx.py

@ -8,6 +8,7 @@ from odoo import _, models
class GeneralLedgerXslx(models.AbstractModel): class GeneralLedgerXslx(models.AbstractModel):
_name = "report.a_f_r.report_general_ledger_xlsx" _name = "report.a_f_r.report_general_ledger_xlsx"
_description = "General Ledger XLSL Report"
_inherit = "report.account_financial_report.abstract_report_xlsx" _inherit = "report.account_financial_report.abstract_report_xlsx"
def _get_report_name(self, report, data=False): def _get_report_name(self, report, data=False):
@ -93,7 +94,7 @@ class GeneralLedgerXslx(models.AbstractModel):
_("Account balance at 0 filter"), _("Account balance at 0 filter"),
_("Hide") if report.hide_account_at_0 else _("Show"), _("Hide") if report.hide_account_at_0 else _("Show"),
], ],
[_("Centralize filter"), _("Yes") if report.centralize else _("No"),],
[_("Centralize filter"), _("Yes") if report.centralize else _("No")],
[ [
_("Show analytic tags"), _("Show analytic tags"),
_("Yes") if report.show_analytic_tags else _("No"), _("Yes") if report.show_analytic_tags else _("No"),
@ -119,6 +120,7 @@ class GeneralLedgerXslx(models.AbstractModel):
def _get_col_pos_final_balance_label(self): def _get_col_pos_final_balance_label(self):
return 5 return 5
# flake8: noqa: C901
def _generate_report_content(self, workbook, report, data): def _generate_report_content(self, workbook, report, data):
res_data = self.env[ res_data = self.env[
"report.account_financial_report.general_ledger" "report.account_financial_report.general_ledger"
@ -152,7 +154,7 @@ class GeneralLedgerXslx(models.AbstractModel):
) )
if foreign_currency: if foreign_currency:
account.update( account.update(
{"initial_bal_curr": account["init_bal"]["bal_curr"],}
{"initial_bal_curr": account["init_bal"]["bal_curr"]}
) )
self.write_initial_balance_from_dict(account) self.write_initial_balance_from_dict(account)
@ -184,7 +186,7 @@ class GeneralLedgerXslx(models.AbstractModel):
for tag_id in line["tag_ids"]: for tag_id in line["tag_ids"]:
tags += tags_data[tag_id]["name"] + " " tags += tags_data[tag_id]["name"] + " "
line.update( line.update(
{"taxes_description": taxes_description, "tags": tags,}
{"taxes_description": taxes_description, "tags": tags}
) )
self.write_line_from_dict(line) self.write_line_from_dict(line)
@ -210,7 +212,7 @@ class GeneralLedgerXslx(models.AbstractModel):
) )
if foreign_currency: if foreign_currency:
partner.update( partner.update(
{"initial_bal_culrr": partner["init_bal"]["bal_curr"],}
{"initial_bal_culrr": partner["init_bal"]["bal_curr"]}
) )
self.write_initial_balance_from_dict(partner) self.write_initial_balance_from_dict(partner)
@ -235,7 +237,7 @@ class GeneralLedgerXslx(models.AbstractModel):
for tag_id in line["tag_ids"]: for tag_id in line["tag_ids"]:
tags += tags_data[tag_id]["name"] + " " tags += tags_data[tag_id]["name"] + " "
line.update( line.update(
{"taxes_description": taxes_description, "tags": tags,}
{"taxes_description": taxes_description, "tags": tags}
) )
self.write_line_from_dict(line) self.write_line_from_dict(line)
@ -249,7 +251,7 @@ class GeneralLedgerXslx(models.AbstractModel):
) )
if foreign_currency: if foreign_currency:
partner.update( partner.update(
{"final_bal_curr": partner["fin_bal"]["bal_curr"],}
{"final_bal_curr": partner["fin_bal"]["bal_curr"]}
) )
self.write_ending_balance_from_dict(partner) self.write_ending_balance_from_dict(partner)
@ -266,9 +268,7 @@ class GeneralLedgerXslx(models.AbstractModel):
} }
) )
if foreign_currency: if foreign_currency:
account.update(
{"final_bal_curr": account["fin_bal"]["bal_curr"],}
)
account.update({"final_bal_curr": account["fin_bal"]["bal_curr"]})
self.write_ending_balance_from_dict(account) self.write_ending_balance_from_dict(account)
# 2 lines break # 2 lines break

80
account_financial_report/report/journal_ledger.py

@ -4,11 +4,12 @@
import itertools import itertools
import operator import operator
from odoo import api, models
from odoo import models
class JournalLedgerReport(models.AbstractModel): class JournalLedgerReport(models.AbstractModel):
_name = "report.account_financial_report.journal_ledger" _name = "report.account_financial_report.journal_ledger"
_description = "Journal Ledger Report"
def _get_journal_ledger_data(self, journal): def _get_journal_ledger_data(self, journal):
return { return {
@ -79,9 +80,7 @@ class JournalLedgerReport(models.AbstractModel):
def _get_move_lines_domain(self, move_ids, wizard, journal_ids): def _get_move_lines_domain(self, move_ids, wizard, journal_ids):
return [
("move_id", "in", move_ids),
]
return [("move_id", "in", move_ids)]
def _get_move_lines_order(self, move_ids, wizard, journal_ids): def _get_move_lines_order(self, move_ids, wizard, journal_ids):
return "" return ""
@ -140,9 +139,7 @@ class JournalLedgerReport(models.AbstractModel):
return data return data
def _get_partner_id_data(self, partner): def _get_partner_id_data(self, partner):
return {
"name": partner.name,
}
return {"name": partner.name}
def _get_currency_data(self, currencies): def _get_currency_data(self, currencies):
data = {} data = {}
@ -151,9 +148,7 @@ class JournalLedgerReport(models.AbstractModel):
return data return data
def _get_currency_id_data(self, currency): def _get_currency_id_data(self, currency):
return {
"name": currency.name,
}
return {"name": currency.name}
def _get_tax_line_data(self, taxes): def _get_tax_line_data(self, taxes):
data = {} data = {}
@ -162,10 +157,7 @@ class JournalLedgerReport(models.AbstractModel):
return data return data
def _get_tax_line_id_data(self, tax): def _get_tax_line_id_data(self, tax):
return {
"name": tax.name,
"description": tax.description,
}
return {"name": tax.name, "description": tax.description}
def _get_query_taxes(self): def _get_query_taxes(self):
return """ return """
@ -178,33 +170,32 @@ class JournalLedgerReport(models.AbstractModel):
""" """
def _get_query_taxes_params(self, move_lines): def _get_query_taxes_params(self, move_lines):
return {
"move_line_ids": tuple(move_lines.ids),
}
return {"move_line_ids": tuple(move_lines.ids)}
def _get_move_lines(self, move_ids, wizard, journal_ids): def _get_move_lines(self, move_ids, wizard, journal_ids):
move_lines = self.env["account.move.line"].search( move_lines = self.env["account.move.line"].search(
self._get_move_lines_domain(move_ids, wizard, journal_ids), self._get_move_lines_domain(move_ids, wizard, journal_ids),
order=self._get_move_lines_order(move_ids, wizard, journal_ids), order=self._get_move_lines_order(move_ids, wizard, journal_ids),
) )
# Get the taxes ids for the move lines
query_taxes_params = self._get_query_taxes_params(move_lines)
query_taxes = self._get_query_taxes()
move_line_ids_taxes_data = {} move_line_ids_taxes_data = {}
self.env.cr.execute(query_taxes, query_taxes_params)
# Fetch the taxes associated to the move line
for (
move_line_id,
account_tax_id,
tax_description,
tax_name,
) in self.env.cr.fetchall():
if move_line_id not in move_line_ids_taxes_data.keys():
move_line_ids_taxes_data[move_line_id] = {}
move_line_ids_taxes_data[move_line_id][account_tax_id] = {
"name": tax_name,
"description": tax_description,
}
if move_lines:
# Get the taxes ids for the move lines
query_taxes_params = self._get_query_taxes_params(move_lines)
query_taxes = self._get_query_taxes()
self.env.cr.execute(query_taxes, query_taxes_params)
# Fetch the taxes associated to the move line
for (
move_line_id,
account_tax_id,
tax_description,
tax_name,
) in self.env.cr.fetchall():
if move_line_id not in move_line_ids_taxes_data.keys():
move_line_ids_taxes_data[move_line_id] = {}
move_line_ids_taxes_data[move_line_id][account_tax_id] = {
"name": tax_name,
"description": tax_description,
}
Move_Lines = {} Move_Lines = {}
accounts = self.env["account.account"] accounts = self.env["account.account"]
partners = self.env["res.partner"] partners = self.env["res.partner"]
@ -292,7 +283,6 @@ class JournalLedgerReport(models.AbstractModel):
] ]
return journals_taxes_data_2 return journals_taxes_data_2
@api.multi
def _get_report_values(self, docids, data): def _get_report_values(self, docids, data):
wizard_id = data["wizard_id"] wizard_id = data["wizard_id"]
wizard = self.env["journal.ledger.report.wizard"].browse(wizard_id) wizard = self.env["journal.ledger.report.wizard"].browse(wizard_id)
@ -313,15 +303,12 @@ class JournalLedgerReport(models.AbstractModel):
partner_ids_data partner_ids_data
) = currency_ids_data = tax_line_ids_data = move_line_ids_taxes_data = {} ) = currency_ids_data = tax_line_ids_data = move_line_ids_taxes_data = {}
if move_ids: if move_ids:
(
move_line_ids,
move_lines_data,
account_ids_data,
partner_ids_data,
currency_ids_data,
tax_line_ids_data,
move_line_ids_taxes_data,
) = self._get_move_lines(move_ids, wizard, journal_ids)
move_lines = self._get_move_lines(move_ids, wizard, journal_ids)
move_lines_data = move_lines[1]
account_ids_data = move_lines[2]
partner_ids_data = move_lines[3]
currency_ids_data = move_lines[4]
tax_line_ids_data = move_lines[5]
for move_data in moves_data: for move_data in moves_data:
move_id = move_data["move_id"] move_id = move_data["move_id"]
move_data["report_move_lines"] = [] move_data["report_move_lines"] = []
@ -338,10 +325,7 @@ class JournalLedgerReport(models.AbstractModel):
for move_line_data in move_lines_data[move_id]: for move_line_data in move_lines_data[move_id]:
journal_id = move_line_data["journal_id"] journal_id = move_line_data["journal_id"]
if journal_id not in journal_totals.keys(): if journal_id not in journal_totals.keys():
journal_totals[journal_id] = {
"debit": 0.0,
"credit": 0.0,
}
journal_totals[journal_id] = {"debit": 0.0, "credit": 0.0}
for item in ["debit", "credit"]: for item in ["debit", "credit"]:
journal_totals[journal_id][item] += move_line_data[item] journal_totals[journal_id][item] += move_line_data[item]
for journal_ledger_data in journal_ledgers_data: for journal_ledger_data in journal_ledgers_data:

7
account_financial_report/report/journal_ledger_xlsx.py

@ -8,6 +8,7 @@ from odoo import _, models
class JournalLedgerXslx(models.AbstractModel): class JournalLedgerXslx(models.AbstractModel):
_name = "report.a_f_r.report_journal_ledger_xlsx" _name = "report.a_f_r.report_journal_ledger_xlsx"
_description = "Journal Ledger XLSX Report"
_inherit = "report.account_financial_report.abstract_report_xlsx" _inherit = "report.account_financial_report.abstract_report_xlsx"
def _get_report_name(self, report, data=False): def _get_report_name(self, report, data=False):
@ -35,7 +36,7 @@ class JournalLedgerXslx(models.AbstractModel):
{"header": _("Partner"), "field": "partner", "width": 25}, {"header": _("Partner"), "field": "partner", "width": 25},
{"header": _("Ref - Label"), "field": "label", "width": 40}, {"header": _("Ref - Label"), "field": "label", "width": 40},
{"header": _("Taxes"), "field": "taxes_description", "width": 11}, {"header": _("Taxes"), "field": "taxes_description", "width": 11},
{"header": _("Debit"), "field": "debit", "type": "amount", "width": 14,},
{"header": _("Debit"), "field": "debit", "type": "amount", "width": 14},
{"header": _("Credit"), "field": "credit", "type": "amount", "width": 14}, {"header": _("Credit"), "field": "credit", "type": "amount", "width": 14},
] ]
@ -188,7 +189,9 @@ class JournalLedgerXslx(models.AbstractModel):
and journal.currency_id.name and journal.currency_id.name
or journal.company_id.currency_id.name or journal.company_id.currency_id.name
) )
sheet_name = "Tax - {} ({}) - {}".format(journal.code, currency_name, journal.name)
sheet_name = "Tax - {} ({}) - {}".format(
journal.code, currency_name, journal.name
)
self._generate_taxes_summary(workbook, sheet_name, ledger["tax_lines"]) self._generate_taxes_summary(workbook, sheet_name, ledger["tax_lines"])
def _generate_moves_content(self, workbook, sheet_name, report, res_data, moves): def _generate_moves_content(self, workbook, sheet_name, report, res_data, moves):

29
account_financial_report/report/open_items.py

@ -4,8 +4,6 @@
from datetime import date, datetime from datetime import date, datetime
import pandas as pd
from odoo import api, models from odoo import api, models
from odoo.osv import expression from odoo.osv import expression
from odoo.tools import float_is_zero from odoo.tools import float_is_zero
@ -13,6 +11,7 @@ from odoo.tools import float_is_zero
class OpenItemsReport(models.AbstractModel): class OpenItemsReport(models.AbstractModel):
_name = "report.account_financial_report.open_items" _name = "report.account_financial_report.open_items"
_description = "Open Items Report"
@api.model @api.model
def get_html(self, given_context=None): def get_html(self, given_context=None):
@ -63,7 +62,7 @@ class OpenItemsReport(models.AbstractModel):
credit_move_id credit_move_id
] += account_partial_reconcile_data["amount"] ] += account_partial_reconcile_data["amount"]
account_partial_reconcile_data.update( account_partial_reconcile_data.update(
{"debit_move_id": debit_move_id, "credit_move_id": credit_move_id,}
{"debit_move_id": debit_move_id, "credit_move_id": credit_move_id}
) )
return ( return (
accounts_partial_reconcile, accounts_partial_reconcile,
@ -188,6 +187,7 @@ class OpenItemsReport(models.AbstractModel):
journals_data.update({journal.id: {"id": journal.id, "code": journal.code}}) journals_data.update({journal.id: {"id": journal.id, "code": journal.code}})
return journals_data return journals_data
# flake8: noqa: C901
def _get_data( def _get_data(
self, self,
account_ids, account_ids,
@ -201,12 +201,11 @@ class OpenItemsReport(models.AbstractModel):
account_ids, partner_ids, date_at_object, target_move, company_id, date_from account_ids, partner_ids, date_at_object, target_move, company_id, date_from
) )
self._cr.execute(query) self._cr.execute(query)
move_lines_data = pd.DataFrame(self._cr.dictfetchall())
account_ids = set(move_lines_data.account_id.to_list())
move_lines_data = self._cr.dictfetchall()
account_ids = map(lambda r: r["account_id"], move_lines_data)
accounts_data = self._get_accounts_data(list(account_ids)) accounts_data = self._get_accounts_data(list(account_ids))
journal_ids = set(move_lines_data.journal_id.to_list())
journal_ids = map(lambda r: r["journal_id"], move_lines_data)
journals_data = self._get_journals_data(list(journal_ids)) journals_data = self._get_journals_data(list(journal_ids))
move_lines_data = move_lines_data.fillna(0).to_dict(orient="records")
if date_at_object < date.today(): if date_at_object < date.today():
( (
@ -215,12 +214,11 @@ class OpenItemsReport(models.AbstractModel):
credit_accounts_partial_amount, credit_accounts_partial_amount,
) = self._get_account_partial_reconciled(move_lines_data, date_at_object) ) = self._get_account_partial_reconciled(move_lines_data, date_at_object)
if accounts_partial_reconcile: if accounts_partial_reconcile:
accounts_partial_reconcile_data = pd.DataFrame(
accounts_partial_reconcile
debit_ids = map(
operator.itemgetter("debit_move_id"), accounts_partial_reconcile
) )
debit_ids = set(accounts_partial_reconcile_data.debit_move_id.to_list())
credit_ids = set(
accounts_partial_reconcile_data.credit_move_id.to_list()
credit_ids = map(
operator.itemgetter("credit_move_id"), accounts_partial_reconcile
) )
for move_line in move_lines_data: for move_line in move_lines_data:
if move_line["id"] in debit_ids: if move_line["id"] in debit_ids:
@ -245,7 +243,7 @@ class OpenItemsReport(models.AbstractModel):
for move_line in move_lines_data: for move_line in move_lines_data:
no_partner = True no_partner = True
# Partners data # Partners data
if move_line["partner_id"] and not pd.isna(move_line["partner_id"]):
if move_line["partner_id"]:
no_partner = False no_partner = False
partners_data.update( partners_data.update(
{ {
@ -270,11 +268,11 @@ class OpenItemsReport(models.AbstractModel):
original = move_line["credit"] * (-1) original = move_line["credit"] * (-1)
if not float_is_zero(move_line["debit"], precision_digits=2): if not float_is_zero(move_line["debit"], precision_digits=2):
original = move_line["debit"] original = move_line["debit"]
move_line.update( move_line.update(
{ {
"date": move_line["date"].strftime("%d/%m/%Y"), "date": move_line["date"].strftime("%d/%m/%Y"),
"date_maturity": move_line["date_maturity"].strftime("%d/%m/%Y"),
"date_maturity": move_line["date_maturity"]
and move_line["date_maturity"].strftime("%d/%m/%Y"),
"original": original, "original": original,
"partner_id": 0 if no_partner else move_line["partner_id"], "partner_id": 0 if no_partner else move_line["partner_id"],
"partner_name": "" if no_partner else move_line["partner_name"], "partner_name": "" if no_partner else move_line["partner_name"],
@ -325,7 +323,6 @@ class OpenItemsReport(models.AbstractModel):
total_amount[account_id]["residual"] += move_line["amount_residual"] total_amount[account_id]["residual"] += move_line["amount_residual"]
return total_amount return total_amount
@api.multi
def _get_report_values(self, docids, data): def _get_report_values(self, docids, data):
wizard_id = data["wizard_id"] wizard_id = data["wizard_id"]
company = self.env["res.company"].browse(data["company_id"]) company = self.env["res.company"].browse(data["company_id"])

1
account_financial_report/report/open_items_xlsx.py

@ -7,6 +7,7 @@ from odoo import _, models
class OpenItemsXslx(models.AbstractModel): class OpenItemsXslx(models.AbstractModel):
_name = "report.a_f_r.report_open_items_xlsx" _name = "report.a_f_r.report_open_items_xlsx"
_description = "Open Items XLSX Report"
_inherit = "report.account_financial_report.abstract_report_xlsx" _inherit = "report.account_financial_report.abstract_report_xlsx"
def _get_report_name(self, report, data=False): def _get_report_name(self, report, data=False):

17
account_financial_report/report/trial_balance.py

@ -5,13 +5,12 @@
from operator import itemgetter from operator import itemgetter
from natsort import natsorted
from odoo import api, models from odoo import api, models
class TrialBalanceReport(models.AbstractModel): class TrialBalanceReport(models.AbstractModel):
_name = "report.account_financial_report.trial_balance" _name = "report.account_financial_report.trial_balance"
_description = "Trial Balance Report"
@api.model @api.model
def get_html(self, given_context=None): def get_html(self, given_context=None):
@ -203,6 +202,7 @@ class TrialBalanceReport(models.AbstractModel):
pl_initial_currency_balance += initial_balance["amount_currency"] pl_initial_currency_balance += initial_balance["amount_currency"]
return pl_initial_balance, pl_initial_currency_balance return pl_initial_balance, pl_initial_currency_balance
# flake8: noqa: C901
def _get_data( def _get_data(
self, self,
account_ids, account_ids,
@ -343,7 +343,7 @@ class TrialBalanceReport(models.AbstractModel):
prt_id = tb["partner_id"][0] prt_id = tb["partner_id"][0]
if tb["partner_id"] not in partners_ids: if tb["partner_id"] not in partners_ids:
partners_data.update( partners_data.update(
{prt_id: {"id": prt_id, "name": tb["partner_id"][1],}}
{prt_id: {"id": prt_id, "name": tb["partner_id"][1]}}
) )
total_amount[acc_id][prt_id] = {} total_amount[acc_id][prt_id] = {}
total_amount[acc_id][prt_id]["credit"] = tb["credit"] total_amount[acc_id][prt_id]["credit"] = tb["credit"]
@ -363,7 +363,7 @@ class TrialBalanceReport(models.AbstractModel):
prt_id = tb["partner_id"][0] prt_id = tb["partner_id"][0]
if tb["partner_id"] not in partners_ids: if tb["partner_id"] not in partners_ids:
partners_data.update( partners_data.update(
{prt_id: {"id": prt_id, "name": tb["partner_id"][1],}}
{prt_id: {"id": prt_id, "name": tb["partner_id"][1]}}
) )
if acc_id not in total_amount.keys(): if acc_id not in total_amount.keys():
total_amount[acc_id][prt_id] = {} total_amount[acc_id][prt_id] = {}
@ -620,7 +620,6 @@ class TrialBalanceReport(models.AbstractModel):
] += total_amount[acc_id]["ending_currency_balance"] ] += total_amount[acc_id]["ending_currency_balance"]
return groups_data return groups_data
@api.multi
def _get_report_values(self, docids, data): def _get_report_values(self, docids, data):
show_partner_details = data["show_partner_details"] show_partner_details = data["show_partner_details"]
wizard_id = data["wizard_id"] wizard_id = data["wizard_id"]
@ -682,9 +681,7 @@ class TrialBalanceReport(models.AbstractModel):
) )
trial_balance = list(groups_data.values()) trial_balance = list(groups_data.values())
trial_balance += list(accounts_data.values()) trial_balance += list(accounts_data.values())
trial_balance = natsorted(
trial_balance, key=itemgetter("complete_code", "code")
)
trial_balance = sorted(trial_balance, key=lambda k: k["complete_code"])
for trial in trial_balance: for trial in trial_balance:
counter = trial["complete_code"].count("/") counter = trial["complete_code"].count("/")
trial["level"] = counter trial["level"] = counter
@ -694,10 +691,10 @@ class TrialBalanceReport(models.AbstractModel):
) )
trial_balance = list(groups_data.values()) trial_balance = list(groups_data.values())
trial_balance += list(accounts_data.values()) trial_balance += list(accounts_data.values())
trial_balance = natsorted(trial_balance, key=itemgetter("code"))
trial_balance = sorted(trial_balance, key=lambda k: k["code"])
if hierarchy_on == "none": if hierarchy_on == "none":
trial_balance = list(accounts_data.values()) trial_balance = list(accounts_data.values())
trial_balance = natsorted(trial_balance, key=itemgetter("code"))
trial_balance = sorted(trial_balance, key=lambda k: k["code"])
else: else:
if foreign_currency: if foreign_currency:
for account_id in accounts_data.keys(): for account_id in accounts_data.keys():

1
account_financial_report/report/trial_balance_xlsx.py

@ -8,6 +8,7 @@ from odoo import _, models
class TrialBalanceXslx(models.AbstractModel): class TrialBalanceXslx(models.AbstractModel):
_name = "report.a_f_r.report_trial_balance_xlsx" _name = "report.a_f_r.report_trial_balance_xlsx"
_description = "Trial Balance XLSX Report"
_inherit = "report.account_financial_report.abstract_report_xlsx" _inherit = "report.account_financial_report.abstract_report_xlsx"
def _get_report_name(self, report, data=False): def _get_report_name(self, report, data=False):

20
account_financial_report/report/vat_report.py

@ -7,6 +7,7 @@ from odoo import api, models
class VATReport(models.AbstractModel): class VATReport(models.AbstractModel):
_name = "report.account_financial_report.vat_report" _name = "report.account_financial_report.vat_report"
_description = "Vat Report Report"
def _get_tax_data(self, tax_ids): def _get_tax_data(self, tax_ids):
taxes = self.env["account.tax"].browse(tax_ids) taxes = self.env["account.tax"].browse(tax_ids)
@ -18,7 +19,6 @@ class VATReport(models.AbstractModel):
"id": tax.id, "id": tax.id,
"name": tax.name, "name": tax.name,
"tax_group_id": tax.tax_group_id.id, "tax_group_id": tax.tax_group_id.id,
"tags_ids": tax.tag_ids.ids,
} }
} }
) )
@ -42,15 +42,19 @@ class VATReport(models.AbstractModel):
"tax_base_amount", "tax_base_amount",
"balance", "balance",
"tax_line_id", "tax_line_id",
"tax_repartition_line_id",
"analytic_tag_ids", "analytic_tag_ids",
] ]
tax_move_lines = self.env["account.move.line"].search_read( tax_move_lines = self.env["account.move.line"].search_read(
domain=domain, fields=ml_fields,
domain=domain, fields=ml_fields
) )
vat_data = {} vat_data = {}
tax_ids = set() tax_ids = set()
for tax_move_line in tax_move_lines: for tax_move_line in tax_move_lines:
tax_ml_id = tax_move_line["id"] tax_ml_id = tax_move_line["id"]
repartition = self.env["account.tax.repartition.line"].browse(
tax_move_line["tax_repartition_line_id"][0]
)
vat_data[tax_ml_id] = {} vat_data[tax_ml_id] = {}
vat_data[tax_ml_id].update( vat_data[tax_ml_id].update(
{ {
@ -60,6 +64,7 @@ class VATReport(models.AbstractModel):
if tax_move_line["balance"] > 0 if tax_move_line["balance"] > 0
else (-1) * tax_move_line["balance"], else (-1) * tax_move_line["balance"],
"tax_line_id": tax_move_line["tax_line_id"], "tax_line_id": tax_move_line["tax_line_id"],
"tags_ids": repartition.tag_ids.ids,
} }
) )
tax_ids.add(tax_move_line["tax_line_id"][0]) tax_ids.add(tax_move_line["tax_line_id"][0])
@ -90,11 +95,11 @@ class VATReport(models.AbstractModel):
vat_report[tax_group_id] = {} vat_report[tax_group_id] = {}
vat_report[tax_group_id]["net"] = 0.0 vat_report[tax_group_id]["net"] = 0.0
vat_report[tax_group_id]["tax"] = 0.0 vat_report[tax_group_id]["tax"] = 0.0
vat_report[tax_group_id][tax_id] = tax_data[tax_id]
vat_report[tax_group_id][tax_id] = dict(tax_data[tax_id])
vat_report[tax_group_id][tax_id].update({"net": 0.0, "tax": 0.0}) vat_report[tax_group_id][tax_id].update({"net": 0.0, "tax": 0.0})
else: else:
if tax_id not in vat_report[tax_group_id].keys(): if tax_id not in vat_report[tax_group_id].keys():
vat_report[tax_group_id][tax_id] = tax_data[tax_id]
vat_report[tax_group_id][tax_id] = dict(tax_data[tax_id])
vat_report[tax_group_id][tax_id].update({"net": 0.0, "tax": 0.0}) vat_report[tax_group_id][tax_id].update({"net": 0.0, "tax": 0.0})
vat_report[tax_group_id]["net"] += tax_move_line["net"] vat_report[tax_group_id]["net"] += tax_move_line["net"]
vat_report[tax_group_id]["tax"] += tax_move_line["tax"] vat_report[tax_group_id]["tax"] += tax_move_line["tax"]
@ -126,18 +131,18 @@ class VATReport(models.AbstractModel):
vat_report = {} vat_report = {}
for tax_move_line in vat_report_data.values(): for tax_move_line in vat_report_data.values():
tax_id = tax_move_line["tax_line_id"][0] tax_id = tax_move_line["tax_line_id"][0]
tags_ids = tax_data[tax_id]["tags_ids"]
tags_ids = tax_move_line["tags_ids"]
if tags_ids: if tags_ids:
for tag_id in tags_ids: for tag_id in tags_ids:
if tag_id not in vat_report.keys(): if tag_id not in vat_report.keys():
vat_report[tag_id] = {} vat_report[tag_id] = {}
vat_report[tag_id]["net"] = 0.0 vat_report[tag_id]["net"] = 0.0
vat_report[tag_id]["tax"] = 0.0 vat_report[tag_id]["tax"] = 0.0
vat_report[tag_id][tax_id] = tax_data[tax_id]
vat_report[tag_id][tax_id] = dict(tax_data[tax_id])
vat_report[tag_id][tax_id].update({"net": 0.0, "tax": 0.0}) vat_report[tag_id][tax_id].update({"net": 0.0, "tax": 0.0})
else: else:
if tax_id not in vat_report[tag_id].keys(): if tax_id not in vat_report[tag_id].keys():
vat_report[tag_id][tax_id] = tax_data[tax_id]
vat_report[tag_id][tax_id] = dict(tax_data[tax_id])
vat_report[tag_id][tax_id].update({"net": 0.0, "tax": 0.0}) vat_report[tag_id][tax_id].update({"net": 0.0, "tax": 0.0})
vat_report[tag_id][tax_id]["net"] += tax_move_line["net"] vat_report[tag_id][tax_id]["net"] += tax_move_line["net"]
vat_report[tag_id][tax_id]["tax"] += tax_move_line["tax"] vat_report[tag_id][tax_id]["tax"] += tax_move_line["tax"]
@ -156,7 +161,6 @@ class VATReport(models.AbstractModel):
vat_report_list.append(vat_report[tag_id]) vat_report_list.append(vat_report[tag_id])
return vat_report_list return vat_report_list
@api.multi
def _get_report_values(self, docids, data): def _get_report_values(self, docids, data):
wizard_id = data["wizard_id"] wizard_id = data["wizard_id"]
company = self.env["res.company"].browse(data["company_id"]) company = self.env["res.company"].browse(data["company_id"])

1
account_financial_report/report/vat_report_xlsx.py

@ -6,6 +6,7 @@ from odoo import _, models
class VATReportXslx(models.AbstractModel): class VATReportXslx(models.AbstractModel):
_name = "report.a_f_r.report_vat_report_xlsx" _name = "report.a_f_r.report_vat_report_xlsx"
_description = "Vat Report XLSX Report"
_inherit = "report.account_financial_report.abstract_report_xlsx" _inherit = "report.account_financial_report.abstract_report_xlsx"
def _get_report_name(self, report, data): def _get_report_name(self, report, data):

62
account_financial_report/static/description/index.html

@ -367,9 +367,9 @@ ul.auto-toc {
!! This file is generated by oca-gen-addon-readme !! !! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !! !! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/account-financial-reporting/tree/12.0/account_financial_report"><img alt="OCA/account-financial-reporting" src="https://img.shields.io/badge/github-OCA%2Faccount--financial--reporting-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/account-financial-reporting-12-0/account-financial-reporting-12-0-account_financial_report"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/91/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/account-financial-reporting/tree/13.0/account_financial_report"><img alt="OCA/account-financial-reporting" src="https://img.shields.io/badge/github-OCA%2Faccount--financial--reporting-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/account-financial-reporting-13-0/account-financial-reporting-13-0-account_financial_report"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/91/13.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This module adds a set of financial reports. They are accessible under <p>This module adds a set of financial reports. They are accessible under
Accounting / Reporting / OCA Reports.</p>
Invoicing / Reporting / OCA accounting reports.</p>
<ul class="simple"> <ul class="simple">
<li>General ledger</li> <li>General ledger</li>
<li>Trial Balance</li> <li>Trial Balance</li>
@ -386,31 +386,41 @@ currency balances are not available.</p>
<p><strong>Table of contents</strong></p> <p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents"> <div class="contents local topic" id="contents">
<ul class="simple"> <ul class="simple">
<li><a class="reference internal" href="#changelog" id="id4">Changelog</a><ul>
<li><a class="reference internal" href="#id1" id="id5">11.0.2.5.0 (2019-04-26)</a></li>
<li><a class="reference internal" href="#id2" id="id6">11.0.2.4.1 (2019-01-08)</a></li>
<li><a class="reference internal" href="#id3" id="id7">11.0.2.3.1 (2018-11-29)</a></li>
<li><a class="reference internal" href="#known-issues-roadmap" id="id4">Known issues / Roadmap</a></li>
<li><a class="reference internal" href="#changelog" id="id5">Changelog</a><ul>
<li><a class="reference internal" href="#id1" id="id6">11.0.2.5.0 (2019-04-26)</a></li>
<li><a class="reference internal" href="#id2" id="id7">11.0.2.4.1 (2019-01-08)</a></li>
<li><a class="reference internal" href="#id3" id="id8">11.0.2.3.1 (2018-11-29)</a></li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#bug-tracker" id="id8">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id9">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id10">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id11">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id12">Maintainers</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id9">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id10">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id11">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id12">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id13">Maintainers</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
</div> </div>
<div class="section" id="known-issues-roadmap">
<h1><a class="toc-backref" href="#id4">Known issues / Roadmap</a></h1>
<ul class="simple">
<li>‘VAT Report’ is valid only for cases where it’s met that for each
Tax defined: all the “Account tags” of all the
‘Repartition for Invoices’ or ‘Repartition for Credit Notes’
are different.</li>
</ul>
</div>
<div class="section" id="changelog"> <div class="section" id="changelog">
<h1><a class="toc-backref" href="#id4">Changelog</a></h1>
<h1><a class="toc-backref" href="#id5">Changelog</a></h1>
<div class="section" id="id1"> <div class="section" id="id1">
<h2><a class="toc-backref" href="#id5">11.0.2.5.0 (2019-04-26)</a></h2>
<h2><a class="toc-backref" href="#id6">11.0.2.5.0 (2019-04-26)</a></h2>
<ul class="simple"> <ul class="simple">
<li>In the Trial Balance you have an option to hide parent hierarchy levels</li> <li>In the Trial Balance you have an option to hide parent hierarchy levels</li>
</ul> </ul>
</div> </div>
<div class="section" id="id2"> <div class="section" id="id2">
<h2><a class="toc-backref" href="#id6">11.0.2.4.1 (2019-01-08)</a></h2>
<h2><a class="toc-backref" href="#id7">11.0.2.4.1 (2019-01-08)</a></h2>
<ul class="simple"> <ul class="simple">
<li>Handle better multicompany behaviour</li> <li>Handle better multicompany behaviour</li>
<li>Improve how title appears in the reports</li> <li>Improve how title appears in the reports</li>
@ -418,7 +428,7 @@ currency balances are not available.</p>
</ul> </ul>
</div> </div>
<div class="section" id="id3"> <div class="section" id="id3">
<h2><a class="toc-backref" href="#id7">11.0.2.3.1 (2018-11-29)</a></h2>
<h2><a class="toc-backref" href="#id8">11.0.2.3.1 (2018-11-29)</a></h2>
<ul class="simple"> <ul class="simple">
<li>In the Trial Balance you can apply a filter by hierarchy levels</li> <li>In the Trial Balance you can apply a filter by hierarchy levels</li>
<li>In the General Ledger you can apply a filter by Analytic Tag</li> <li>In the General Ledger you can apply a filter by Analytic Tag</li>
@ -427,28 +437,28 @@ currency balances are not available.</p>
</div> </div>
</div> </div>
<div class="section" id="bug-tracker"> <div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id8">Bug Tracker</a></h1>
<h1><a class="toc-backref" href="#id9">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/account-financial-reporting/issues">GitHub Issues</a>. <p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/account-financial-reporting/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported. In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed If you spotted it first, help us smashing it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/account-financial-reporting/issues/new?body=module:%20account_financial_report%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<a class="reference external" href="https://github.com/OCA/account-financial-reporting/issues/new?body=module:%20account_financial_report%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p> <p>Do not contact contributors directly about support or help with technical issues.</p>
</div> </div>
<div class="section" id="credits"> <div class="section" id="credits">
<h1><a class="toc-backref" href="#id9">Credits</a></h1>
<h1><a class="toc-backref" href="#id10">Credits</a></h1>
<div class="section" id="authors"> <div class="section" id="authors">
<h2><a class="toc-backref" href="#id10">Authors</a></h2>
<h2><a class="toc-backref" href="#id11">Authors</a></h2>
<ul class="simple"> <ul class="simple">
<li>Camptocamp SA</li> <li>Camptocamp SA</li>
<li>initOS GmbH</li> <li>initOS GmbH</li>
<li>redCOR AG</li> <li>redCOR AG</li>
<li>Eficent</li>
<li>ForgeFlow</li>
</ul> </ul>
</div> </div>
<div class="section" id="contributors"> <div class="section" id="contributors">
<h2><a class="toc-backref" href="#id11">Contributors</a></h2>
<h2><a class="toc-backref" href="#id12">Contributors</a></h2>
<ul class="simple"> <ul class="simple">
<li>Jordi Ballester &lt;<a class="reference external" href="mailto:jordi.ballester&#64;eficient.com">jordi.ballester&#64;eficient.com</a>&gt;</li>
<li>Jordi Ballester &lt;<a class="reference external" href="mailto:jordi.ballester&#64;forgeflow.com">jordi.ballester&#64;forgeflow.com</a>&gt;</li>
<li>Yannick Vaucher &lt;<a class="reference external" href="mailto:yannick.vaucher&#64;camptocamp.com">yannick.vaucher&#64;camptocamp.com</a>&gt;</li> <li>Yannick Vaucher &lt;<a class="reference external" href="mailto:yannick.vaucher&#64;camptocamp.com">yannick.vaucher&#64;camptocamp.com</a>&gt;</li>
<li>Simone Orsi &lt;<a class="reference external" href="mailto:simone.orsi&#64;abstract.com">simone.orsi&#64;abstract.com</a>&gt;</li> <li>Simone Orsi &lt;<a class="reference external" href="mailto:simone.orsi&#64;abstract.com">simone.orsi&#64;abstract.com</a>&gt;</li>
<li>Leonardo Pistone &lt;<a class="reference external" href="mailto:leonardo.pistone&#64;camptocamp.com">leonardo.pistone&#64;camptocamp.com</a>&gt;</li> <li>Leonardo Pistone &lt;<a class="reference external" href="mailto:leonardo.pistone&#64;camptocamp.com">leonardo.pistone&#64;camptocamp.com</a>&gt;</li>
@ -464,10 +474,12 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
<li>Akim Juillerat &lt;<a class="reference external" href="mailto:akim.juillerat&#64;camptocamp.com">akim.juillerat&#64;camptocamp.com</a>&gt;</li> <li>Akim Juillerat &lt;<a class="reference external" href="mailto:akim.juillerat&#64;camptocamp.com">akim.juillerat&#64;camptocamp.com</a>&gt;</li>
<li>Alexis de Lattre &lt;<a class="reference external" href="mailto:alexis&#64;via.ecp.fr">alexis&#64;via.ecp.fr</a>&gt;</li> <li>Alexis de Lattre &lt;<a class="reference external" href="mailto:alexis&#64;via.ecp.fr">alexis&#64;via.ecp.fr</a>&gt;</li>
<li>Mihai Fekete &lt;<a class="reference external" href="mailto:feketemihai&#64;gmail.com">feketemihai&#64;gmail.com</a>&gt;</li> <li>Mihai Fekete &lt;<a class="reference external" href="mailto:feketemihai&#64;gmail.com">feketemihai&#64;gmail.com</a>&gt;</li>
<li>Miquel Raïch &lt;<a class="reference external" href="mailto:miquel.raich&#64;eficent.com">miquel.raich&#64;eficent.com</a>&gt;</li>
<li>Miquel Raïch &lt;<a class="reference external" href="mailto:miquel.raich&#64;forgeflow.com">miquel.raich&#64;forgeflow.com</a>&gt;</li>
<li>Joan Sisquella &lt;<a class="reference external" href="mailto:joan.sisquella&#64;forgeflow.com">joan.sisquella&#64;forgeflow.com</a>&gt;</li>
<li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul> <li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
<li>Pedro M. Baeza</li> <li>Pedro M. Baeza</li>
<li>Sergio Teruel</li> <li>Sergio Teruel</li>
<li>Ernesto Tejeda</li>
</ul> </ul>
</li> </li>
</ul> </ul>
@ -475,13 +487,13 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
April 2016.</p> April 2016.</p>
</div> </div>
<div class="section" id="maintainers"> <div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id12">Maintainers</a></h2>
<h2><a class="toc-backref" href="#id13">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p> <p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a> <a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose <p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and mission is to support the collaborative development of Odoo features and
promote its widespread use.</p> promote its widespread use.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/account-financial-reporting/tree/12.0/account_financial_report">OCA/account-financial-reporting</a> project on GitHub.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/account-financial-reporting/tree/13.0/account_financial_report">OCA/account-financial-reporting</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p> <p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div> </div>
</div> </div>

10
account_financial_report/tests/test_general_ledger.py

@ -18,6 +18,7 @@ class TestGeneralLedgerReport(common.TransactionCase):
self.previous_fy_date_end = fields.Date.from_string("2015-12-31") self.previous_fy_date_end = fields.Date.from_string("2015-12-31")
self.fy_date_start = fields.Date.from_string("2016-01-01") self.fy_date_start = fields.Date.from_string("2016-01-01")
self.fy_date_end = fields.Date.from_string("2016-12-31") self.fy_date_end = fields.Date.from_string("2016-12-31")
self.receivable_account = self.env["account.account"].search( self.receivable_account = self.env["account.account"].search(
[("user_type_id.name", "=", "Receivable")], limit=1 [("user_type_id.name", "=", "Receivable")], limit=1
) )
@ -46,19 +47,16 @@ class TestGeneralLedgerReport(common.TransactionCase):
unaffected_debit=0, unaffected_debit=0,
unaffected_credit=0, unaffected_credit=0,
): ):
move_name = "expense accrual"
journal = self.env["account.journal"].search([], limit=1) journal = self.env["account.journal"].search([], limit=1)
partner = self.env.ref("base.res_partner_12") partner = self.env.ref("base.res_partner_12")
move_vals = { move_vals = {
"journal_id": journal.id, "journal_id": journal.id,
"name": move_name,
"date": date, "date": date,
"line_ids": [ "line_ids": [
( (
0, 0,
0, 0,
{ {
"name": move_name,
"debit": receivable_debit, "debit": receivable_debit,
"credit": receivable_credit, "credit": receivable_credit,
"account_id": self.receivable_account.id, "account_id": self.receivable_account.id,
@ -69,7 +67,6 @@ class TestGeneralLedgerReport(common.TransactionCase):
0, 0,
0, 0,
{ {
"name": move_name,
"debit": income_debit, "debit": income_debit,
"credit": income_credit, "credit": income_credit,
"account_id": self.income_account.id, "account_id": self.income_account.id,
@ -80,7 +77,6 @@ class TestGeneralLedgerReport(common.TransactionCase):
0, 0,
0, 0,
{ {
"name": move_name,
"debit": unaffected_debit, "debit": unaffected_debit,
"credit": unaffected_credit, "credit": unaffected_credit,
"account_id": self.unaffected_account.id, "account_id": self.unaffected_account.id,
@ -678,9 +674,7 @@ class TestGeneralLedgerReport(common.TransactionCase):
def test_validate_date(self): def test_validate_date(self):
company_id = self.env.ref("base.main_company") company_id = self.env.ref("base.main_company")
company_id.write(
{"fiscalyear_last_day": 31, "fiscalyear_last_month": 12,}
)
company_id.write({"fiscalyear_last_day": 31, "fiscalyear_last_month": "12"})
user = self.env.ref("base.user_root").with_context(company_id=company_id.id) user = self.env.ref("base.user_root").with_context(company_id=company_id.id)
wizard = self.env["general.ledger.report.wizard"].with_context(user=user.id) wizard = self.env["general.ledger.report.wizard"].with_context(user=user.id)
self.assertEqual(wizard._init_date_from(), time.strftime("%Y") + "-01-01") self.assertEqual(wizard._init_date_from(), time.strftime("%Y") + "-01-01")

156
account_financial_report/tests/test_journal_ledger.py

@ -7,14 +7,14 @@ from datetime import datetime
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
from odoo.fields import Date from odoo.fields import Date
from odoo.tests.common import TransactionCase
from odoo.tests.common import Form, TransactionCase
class TestJournalReport(TransactionCase): class TestJournalReport(TransactionCase):
def setUp(self): def setUp(self):
super(TestJournalReport, self).setUp() super(TestJournalReport, self).setUp()
self.AccountObj = self.env["account.account"] self.AccountObj = self.env["account.account"]
self.InvoiceObj = self.env["account.invoice"]
self.InvoiceObj = self.env["account.move"]
self.JournalObj = self.env["account.journal"] self.JournalObj = self.env["account.journal"]
self.MoveObj = self.env["account.move"] self.MoveObj = self.env["account.move"]
self.TaxObj = self.env["account.tax"] self.TaxObj = self.env["account.tax"]
@ -24,6 +24,8 @@ class TestJournalReport(TransactionCase):
"report.account_financial_report.journal_ledger" "report.account_financial_report.journal_ledger"
] ]
self.company = self.env.ref("base.main_company") self.company = self.env.ref("base.main_company")
self.company.account_sale_tax_id = False
self.company.account_purchase_tax_id = False
today = datetime.today() today = datetime.today()
last_year = today - relativedelta(years=1) last_year = today - relativedelta(years=1)
@ -39,6 +41,9 @@ class TestJournalReport(TransactionCase):
self.income_account = self.AccountObj.search( self.income_account = self.AccountObj.search(
[("user_type_id.name", "=", "Income")], limit=1 [("user_type_id.name", "=", "Income")], limit=1
) )
self.expense_account = self.AccountObj.search(
[("user_type_id.name", "=", "Expenses")], limit=1
)
self.payable_account = self.AccountObj.search( self.payable_account = self.AccountObj.search(
[("user_type_id.name", "=", "Payable")], limit=1 [("user_type_id.name", "=", "Payable")], limit=1
) )
@ -55,7 +60,7 @@ class TestJournalReport(TransactionCase):
{ {
"name": "Test journal purchase", "name": "Test journal purchase",
"code": "TST-JRNL-P", "code": "TST-JRNL-P",
"type": "sale",
"type": "purchase",
"company_id": self.company.id, "company_id": self.company.id,
} }
) )
@ -194,6 +199,7 @@ class TestJournalReport(TransactionCase):
"date_to": self.fy_date_end, "date_to": self.fy_date_end,
"company_id": self.company.id, "company_id": self.company.id,
"journal_ids": [(6, 0, self.journal_sale.ids)], "journal_ids": [(6, 0, self.journal_sale.ids)],
"move_target": "all",
} }
) )
data = wiz._prepare_report_journal_ledger() data = wiz._prepare_report_journal_ledger()
@ -227,39 +233,26 @@ class TestJournalReport(TransactionCase):
self.check_report_journal_debit_credit(res_data, 300, 300) self.check_report_journal_debit_credit(res_data, 300, 300)
def test_02_test_taxes_out_invoice(self): 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()
move_form = Form(
self.env["account.move"].with_context(default_type="out_invoice")
)
move_form.partner_id = self.partner_2
move_form.journal_id = self.journal_sale
with move_form.invoice_line_ids.new() as line_form:
line_form.name = "test"
line_form.quantity = 1.0
line_form.price_unit = 100
line_form.account_id = self.income_account
line_form.tax_ids.add(self.tax_15_s)
with move_form.invoice_line_ids.new() as line_form:
line_form.name = "test"
line_form.quantity = 1.0
line_form.price_unit = 100
line_form.account_id = self.income_account
line_form.tax_ids.add(self.tax_15_s)
line_form.tax_ids.add(self.tax_20_s)
invoice = move_form.save()
invoice.post()
wiz = self.JournalLedgerReportWizard.create( wiz = self.JournalLedgerReportWizard.create(
{ {
@ -267,6 +260,7 @@ class TestJournalReport(TransactionCase):
"date_to": self.fy_date_end, "date_to": self.fy_date_end,
"company_id": self.company.id, "company_id": self.company.id,
"journal_ids": [(6, 0, self.journal_sale.ids)], "journal_ids": [(6, 0, self.journal_sale.ids)],
"move_target": "all",
} }
) )
data = wiz._prepare_report_journal_ledger() data = wiz._prepare_report_journal_ledger()
@ -275,46 +269,68 @@ class TestJournalReport(TransactionCase):
self.check_report_journal_debit_credit_taxes(res_data, 0, 300, 0, 50) self.check_report_journal_debit_credit_taxes(res_data, 0, 300, 0, 50)
def test_03_test_taxes_in_invoice(self): 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()
# invoice_values = {
# "journal_id": self.journal_purchase.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",
# "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",
# "tax_ids": [
# (6, 0, [self.tax_15_p.id, self.tax_20_p.id])
# ],
# },
# ),
# ],
# }
# invoice = self.InvoiceObj.create(invoice_values)
# invoice.post()
move_form = Form(
self.env["account.move"].with_context(default_type="in_invoice")
)
move_form.partner_id = self.partner_2
move_form.journal_id = self.journal_purchase
with move_form.invoice_line_ids.new() as line_form:
line_form.name = "test"
line_form.quantity = 1.0
line_form.price_unit = 100
line_form.account_id = self.expense_account
line_form.tax_ids.add(self.tax_15_p)
with move_form.invoice_line_ids.new() as line_form:
line_form.name = "test"
line_form.quantity = 1.0
line_form.price_unit = 100
line_form.account_id = self.expense_account
line_form.tax_ids.add(self.tax_15_p)
line_form.tax_ids.add(self.tax_20_p)
invoice = move_form.save()
invoice.post()
wiz = self.JournalLedgerReportWizard.create( wiz = self.JournalLedgerReportWizard.create(
{ {
"date_from": self.fy_date_start, "date_from": self.fy_date_start,
"date_to": self.fy_date_end, "date_to": self.fy_date_end,
"company_id": self.company.id, "company_id": self.company.id,
"journal_ids": [(6, 0, self.journal_sale.ids)],
"journal_ids": [(6, 0, self.journal_purchase.ids)],
"move_target": "all",
} }
) )
data = wiz._prepare_report_journal_ledger() data = wiz._prepare_report_journal_ledger()

59
account_financial_report/tests/test_trial_balance.py

@ -92,19 +92,16 @@ class TestTrialBalanceReport(common.TransactionCase):
unaffected_debit=0, unaffected_debit=0,
unaffected_credit=0, unaffected_credit=0,
): ):
move_name = "expense accrual"
journal = self.env["account.journal"].search([], limit=1) journal = self.env["account.journal"].search([], limit=1)
partner = self.env.ref("base.res_partner_12") partner = self.env.ref("base.res_partner_12")
move_vals = { move_vals = {
"journal_id": journal.id, "journal_id": journal.id,
"name": move_name,
"date": date, "date": date,
"line_ids": [ "line_ids": [
( (
0, 0,
0, 0,
{ {
"name": move_name,
"debit": receivable_debit, "debit": receivable_debit,
"credit": receivable_credit, "credit": receivable_credit,
"partner_id": partner.id, "partner_id": partner.id,
@ -115,7 +112,6 @@ class TestTrialBalanceReport(common.TransactionCase):
0, 0,
0, 0,
{ {
"name": move_name,
"debit": income_debit, "debit": income_debit,
"credit": income_credit, "credit": income_credit,
"partner_id": partner.id, "partner_id": partner.id,
@ -126,7 +122,6 @@ class TestTrialBalanceReport(common.TransactionCase):
0, 0,
0, 0,
{ {
"name": move_name,
"debit": unaffected_debit, "debit": unaffected_debit,
"credit": unaffected_credit, "credit": unaffected_credit,
"partner_id": partner.id, "partner_id": partner.id,
@ -137,7 +132,6 @@ class TestTrialBalanceReport(common.TransactionCase):
0, 0,
0, 0,
{ {
"name": move_name,
"debit": receivable_debit, "debit": receivable_debit,
"credit": receivable_credit, "credit": receivable_credit,
"partner_id": partner.id, "partner_id": partner.id,
@ -148,7 +142,6 @@ class TestTrialBalanceReport(common.TransactionCase):
0, 0,
0, 0,
{ {
"name": move_name,
"debit": receivable_credit, "debit": receivable_credit,
"credit": receivable_debit, "credit": receivable_debit,
"partner_id": partner.id, "partner_id": partner.id,
@ -240,8 +233,8 @@ class TestTrialBalanceReport(common.TransactionCase):
return total return total
def test_00_account_group(self): def test_00_account_group(self):
self.assertGreaterEqual(len(self.group1.compute_account_ids), 19)
self.assertGreaterEqual(len(self.group2.compute_account_ids), 9)
self.assertTrue(self.account100 in self.group1.compute_account_ids)
self.assertTrue(self.account200 in self.group2.compute_account_ids)
def test_01_account_balance_computed(self): def test_01_account_balance_computed(self):
# Make sure there's no account of type "Current Year Earnings" in the # Make sure there's no account of type "Current Year Earnings" in the
@ -660,32 +653,20 @@ class TestTrialBalanceReport(common.TransactionCase):
def test_04_undistributed_pl(self): def test_04_undistributed_pl(self):
# Add a P&L Move in the previous FY # Add a P&L Move in the previous FY
move_name = "current year pl move"
journal = self.env["account.journal"].search([], limit=1) journal = self.env["account.journal"].search([], limit=1)
move_vals = { move_vals = {
"journal_id": journal.id, "journal_id": journal.id,
"name": move_name,
"date": self.previous_fy_date_end, "date": self.previous_fy_date_end,
"line_ids": [ "line_ids": [
( (
0, 0,
0, 0,
{
"name": move_name,
"debit": 0.0,
"credit": 1000.0,
"account_id": self.account300.id,
},
{"debit": 0.0, "credit": 1000.0, "account_id": self.account300.id},
), ),
( (
0, 0,
0, 0,
{
"name": move_name,
"debit": 1000.0,
"credit": 0.0,
"account_id": self.account100.id,
},
{"debit": 1000.0, "credit": 0.0, "account_id": self.account100.id},
), ),
], ],
} }
@ -724,32 +705,20 @@ class TestTrialBalanceReport(common.TransactionCase):
self.assertEqual(unaffected_lines["credit"], 0) self.assertEqual(unaffected_lines["credit"], 0)
self.assertEqual(unaffected_lines["final_balance"], -1000) self.assertEqual(unaffected_lines["final_balance"], -1000)
# Add a P&L Move to the current FY # Add a P&L Move to the current FY
move_name = "current year pl move"
journal = self.env["account.journal"].search([], limit=1) journal = self.env["account.journal"].search([], limit=1)
move_vals = { move_vals = {
"journal_id": journal.id, "journal_id": journal.id,
"name": move_name,
"date": self.date_start, "date": self.date_start,
"line_ids": [ "line_ids": [
( (
0, 0,
0, 0,
{
"name": move_name,
"debit": 0.0,
"credit": 1000.0,
"account_id": self.account300.id,
},
{"debit": 0.0, "credit": 1000.0, "account_id": self.account300.id},
), ),
( (
0, 0,
0, 0,
{
"name": move_name,
"debit": 1000.0,
"credit": 0.0,
"account_id": self.account100.id,
},
{"debit": 1000.0, "credit": 0.0, "account_id": self.account100.id},
), ),
], ],
} }
@ -788,32 +757,20 @@ class TestTrialBalanceReport(common.TransactionCase):
self.assertEqual(unaffected_lines["credit"], 0) self.assertEqual(unaffected_lines["credit"], 0)
self.assertEqual(unaffected_lines["final_balance"], -1000) self.assertEqual(unaffected_lines["final_balance"], -1000)
# Add a Move including Unaffected Earnings to the current FY # Add a Move including Unaffected Earnings to the current FY
move_name = "current year unaffected earnings move"
journal = self.env["account.journal"].search([], limit=1) journal = self.env["account.journal"].search([], limit=1)
move_vals = { move_vals = {
"journal_id": journal.id, "journal_id": journal.id,
"name": move_name,
"date": self.date_start, "date": self.date_start,
"line_ids": [ "line_ids": [
( (
0, 0,
0, 0,
{
"name": move_name,
"debit": 0.0,
"credit": 1000.0,
"account_id": self.account110.id,
},
{"debit": 0.0, "credit": 1000.0, "account_id": self.account110.id},
), ),
( (
0, 0,
0, 0,
{
"name": move_name,
"debit": 1000.0,
"credit": 0.0,
"account_id": self.account100.id,
},
{"debit": 1000.0, "credit": 0.0, "account_id": self.account100.id},
), ),
], ],
} }

156
account_financial_report/tests/test_vat_report.py

@ -45,13 +45,25 @@ class TestVATReport(common.TransactionCase):
[("type", "=", "bank"), ("company_id", "=", self.company.id)], limit=1 [("type", "=", "bank"), ("company_id", "=", self.company.id)], limit=1
) )
self.tax_tag_01 = self.env["account.account.tag"].create( self.tax_tag_01 = self.env["account.account.tag"].create(
{"name": "Tag 01", "applicability": "taxes"}
{
"name": "Tag 01",
"applicability": "taxes",
"country_id": self.company.country_id.id,
}
) )
self.tax_tag_02 = self.env["account.account.tag"].create( self.tax_tag_02 = self.env["account.account.tag"].create(
{"name": "Tag 02", "applicability": "taxes"}
{
"name": "Tag 02",
"applicability": "taxes",
"country_id": self.company.country_id.id,
}
) )
self.tax_tag_03 = self.env["account.account.tag"].create( self.tax_tag_03 = self.env["account.account.tag"].create(
{"name": "Tag 03", "applicability": "taxes"}
{
"name": "Tag 03",
"applicability": "taxes",
"country_id": self.company.country_id.id,
}
) )
self.tax_group_10 = self.env["account.tax.group"].create( self.tax_group_10 = self.env["account.tax.group"].create(
{"name": "Tax 10%", "sequence": 1} {"name": "Tax 10%", "sequence": 1}
@ -65,11 +77,35 @@ class TestVATReport(common.TransactionCase):
"amount": 10.0, "amount": 10.0,
"amount_type": "percent", "amount_type": "percent",
"type_tax_use": "sale", "type_tax_use": "sale",
"account_id": self.tax_account.id,
"company_id": self.company.id, "company_id": self.company.id,
"refund_account_id": self.tax_account.id,
"tax_group_id": self.tax_group_10.id, "tax_group_id": self.tax_group_10.id,
"tag_ids": [(6, 0, [self.tax_tag_01.id, self.tax_tag_02.id])],
"invoice_repartition_line_ids": [
(0, 0, {"factor_percent": 100, "repartition_type": "base"}),
(
0,
0,
{
"factor_percent": 100,
"repartition_type": "tax",
"account_id": self.tax_account.id,
"tag_ids": [
(6, 0, [self.tax_tag_01.id, self.tax_tag_02.id])
],
},
),
],
"refund_repartition_line_ids": [
(0, 0, {"factor_percent": 100, "repartition_type": "base"}),
(
0,
0,
{
"factor_percent": 100,
"repartition_type": "tax",
"account_id": self.tax_account.id,
},
),
],
} }
) )
self.tax_20 = self.env["account.tax"].create( self.tax_20 = self.env["account.tax"].create(
@ -79,67 +115,65 @@ class TestVATReport(common.TransactionCase):
"amount": 20.0, "amount": 20.0,
"amount_type": "percent", "amount_type": "percent",
"type_tax_use": "sale", "type_tax_use": "sale",
"tax_exigibility": "on_payment",
"account_id": self.tax_account.id,
"company_id": self.company.id, "company_id": self.company.id,
"refund_account_id": self.tax_account.id,
"cash_basis_account_id": self.tax_account.id,
"cash_basis_transition_account_id": self.tax_account.id,
"tax_group_id": self.tax_group_20.id, "tax_group_id": self.tax_group_20.id,
"tag_ids": [(6, 0, [self.tax_tag_02.id, self.tax_tag_03.id])],
}
)
invoice = self.env["account.invoice"].create(
{
"partner_id": self.env.ref("base.res_partner_2").id,
"account_id": self.receivable_account.id,
"company_id": self.company.id,
"date_invoice": time.strftime("%Y-%m-03"),
"type": "out_invoice",
}
)
self.env["account.invoice.line"].create(
{
"product_id": self.env.ref("product.product_product_4").id,
"quantity": 1.0,
"price_unit": 100.0,
"invoice_id": invoice.id,
"name": "product",
"account_id": self.income_account.id,
"invoice_line_tax_ids": [(6, 0, [self.tax_10.id])],
}
)
invoice.compute_taxes()
invoice.action_invoice_open()
self.cbinvoice = self.env["account.invoice"].create(
{
"partner_id": self.env.ref("base.res_partner_2").id,
"account_id": self.receivable_account.id,
"company_id": self.company.id,
"date_invoice": time.strftime("%Y-%m-05"),
"type": "out_invoice",
"invoice_repartition_line_ids": [
(0, 0, {"factor_percent": 100, "repartition_type": "base"}),
(
0,
0,
{
"factor_percent": 100,
"repartition_type": "tax",
"account_id": self.tax_account.id,
"tag_ids": [
(6, 0, [self.tax_tag_02.id, self.tax_tag_03.id])
],
},
),
],
"refund_repartition_line_ids": [
(0, 0, {"factor_percent": 100, "repartition_type": "base"}),
(
0,
0,
{
"factor_percent": 100,
"repartition_type": "tax",
"account_id": self.tax_account.id,
},
),
],
} }
) )
self.env["account.invoice.line"].create(
{
"product_id": self.env.ref("product.product_product_4").id,
"quantity": 1.0,
"price_unit": 500.0,
"invoice_id": self.cbinvoice.id,
"name": "product",
"account_id": self.income_account.id,
"invoice_line_tax_ids": [(6, 0, [self.tax_20.id])],
}
)
self.cbinvoice.compute_taxes()
self.cbinvoice.action_invoice_open()
move_form = common.Form(
self.env["account.move"].with_context(default_type="out_invoice")
)
move_form.partner_id = self.env.ref("base.res_partner_2")
move_form.invoice_date = time.strftime("%Y-%m-03")
with move_form.invoice_line_ids.new() as line_form:
line_form.product_id = self.env.ref("product.product_product_4")
line_form.quantity = 1.0
line_form.price_unit = 100.0
line_form.account_id = self.income_account
line_form.tax_ids.add(self.tax_10)
invoice = move_form.save()
invoice.post()
self.cbinvoice.pay_and_reconcile(
self.bank_journal.id, 300, date(date.today().year, date.today().month, 10)
)
move_form = common.Form(
self.env["account.move"].with_context(default_type="out_invoice")
)
move_form.partner_id = self.env.ref("base.res_partner_2")
with move_form.invoice_line_ids.new() as line_form:
line_form.product_id = self.env.ref("product.product_product_4")
line_form.quantity = 1.0
line_form.price_unit = 250.0
line_form.account_id = self.income_account
line_form.tax_ids.add(self.tax_20)
self.cbinvoice = move_form.save()
self.cbinvoice.post()
def _get_report_lines(self, taxgroups=False): def _get_report_lines(self, taxgroups=False):
based_on = "taxtags" based_on = "taxtags"

0
account_financial_report/view/report_vat_report.xml

12
account_financial_report/wizard/aged_partner_balance_wizard.py

@ -24,16 +24,14 @@ class AgedPartnerBalanceWizard(models.TransientModel):
[("posted", "All Posted Entries"), ("all", "All Entries")], [("posted", "All Posted Entries"), ("all", "All Entries")],
string="Target Moves", string="Target Moves",
required=True, required=True,
default="all",
default="posted",
) )
account_ids = fields.Many2many( account_ids = fields.Many2many(
comodel_name="account.account", string="Filter accounts",
comodel_name="account.account", string="Filter accounts"
) )
receivable_accounts_only = fields.Boolean() receivable_accounts_only = fields.Boolean()
payable_accounts_only = fields.Boolean() payable_accounts_only = fields.Boolean()
partner_ids = fields.Many2many(
comodel_name="res.partner", string="Filter partners",
)
partner_ids = fields.Many2many(comodel_name="res.partner", string="Filter partners")
show_move_line_details = fields.Boolean() show_move_line_details = fields.Boolean()
@api.onchange("company_id") @api.onchange("company_id")
@ -73,7 +71,6 @@ class AgedPartnerBalanceWizard(models.TransientModel):
domain += [("reconcile", "=", True)] domain += [("reconcile", "=", True)]
self.account_ids = self.env["account.account"].search(domain) self.account_ids = self.env["account.account"].search(domain)
@api.multi
def _print_report(self, report_type): def _print_report(self, report_type):
self.ensure_one() self.ensure_one()
data = self._prepare_report_aged_partner_balance() data = self._prepare_report_aged_partner_balance()
@ -90,19 +87,16 @@ class AgedPartnerBalanceWizard(models.TransientModel):
.report_action(self, data=data) .report_action(self, data=data)
) )
@api.multi
def button_export_html(self): def button_export_html(self):
self.ensure_one() self.ensure_one()
report_type = "qweb-html" report_type = "qweb-html"
return self._export(report_type) return self._export(report_type)
@api.multi
def button_export_pdf(self): def button_export_pdf(self):
self.ensure_one() self.ensure_one()
report_type = "qweb-pdf" report_type = "qweb-pdf"
return self._export(report_type) return self._export(report_type)
@api.multi
def button_export_xlsx(self): def button_export_xlsx(self):
self.ensure_one() self.ensure_one()
report_type = "xlsx" report_type = "xlsx"

1
account_financial_report/wizard/aged_partner_balance_wizard_view.xml

@ -73,7 +73,6 @@
id="action_aged_partner_balance_wizard" id="action_aged_partner_balance_wizard"
name="Aged Partner Balance" name="Aged Partner Balance"
res_model="aged.partner.balance.report.wizard" res_model="aged.partner.balance.report.wizard"
view_type="form"
view_mode="form" view_mode="form"
view_id="aged_partner_balance_wizard" view_id="aged_partner_balance_wizard"
target="new" target="new"

38
account_financial_report/wizard/general_ledger_wizard.py

@ -34,10 +34,10 @@ class GeneralLedgerReportWizard(models.TransientModel):
[("posted", "All Posted Entries"), ("all", "All Entries")], [("posted", "All Posted Entries"), ("all", "All Entries")],
string="Target Moves", string="Target Moves",
required=True, required=True,
default="all",
default="posted",
) )
account_ids = fields.Many2many( account_ids = fields.Many2many(
comodel_name="account.account", string="Filter accounts",
comodel_name="account.account", string="Filter accounts"
) )
centralize = fields.Boolean(string="Activate centralization", default=True) centralize = fields.Boolean(string="Activate centralization", default=True)
hide_account_at_0 = fields.Boolean( hide_account_at_0 = fields.Boolean(
@ -47,7 +47,7 @@ class GeneralLedgerReportWizard(models.TransientModel):
"If partners are filtered, " "If partners are filtered, "
"debits and credits totals will not match the trial balance.", "debits and credits totals will not match the trial balance.",
) )
show_analytic_tags = fields.Boolean(string="Show analytic tags",)
show_analytic_tags = fields.Boolean(string="Show analytic tags")
receivable_accounts_only = fields.Boolean() receivable_accounts_only = fields.Boolean()
payable_accounts_only = fields.Boolean() payable_accounts_only = fields.Boolean()
partner_ids = fields.Many2many( partner_ids = fields.Many2many(
@ -56,13 +56,13 @@ class GeneralLedgerReportWizard(models.TransientModel):
default=lambda self: self._default_partners(), default=lambda self: self._default_partners(),
) )
analytic_tag_ids = fields.Many2many( analytic_tag_ids = fields.Many2many(
comodel_name="account.analytic.tag", string="Filter analytic tags",
comodel_name="account.analytic.tag", string="Filter analytic tags"
) )
account_journal_ids = fields.Many2many( account_journal_ids = fields.Many2many(
comodel_name="account.journal", string="Filter journals",
comodel_name="account.journal", string="Filter journals"
) )
cost_center_ids = fields.Many2many( cost_center_ids = fields.Many2many(
comodel_name="account.analytic.account", string="Filter cost centers",
comodel_name="account.analytic.account", string="Filter cost centers"
) )
not_only_one_unaffected_earnings_account = fields.Boolean( not_only_one_unaffected_earnings_account = fields.Boolean(
@ -79,27 +79,29 @@ class GeneralLedgerReportWizard(models.TransientModel):
def _init_date_from(self): def _init_date_from(self):
"""set start date to begin of current year if fiscal year running""" """set start date to begin of current year if fiscal year running"""
today = fields.Date.context_today(self) today = fields.Date.context_today(self)
cur_month = fields.Date.from_string(today).month
cur_day = fields.Date.from_string(today).day
last_fsc_month = self.env.user.company_id.fiscalyear_last_month last_fsc_month = self.env.user.company_id.fiscalyear_last_month
last_fsc_day = self.env.user.company_id.fiscalyear_last_day last_fsc_day = self.env.user.company_id.fiscalyear_last_day
if ( if (
cur_month < last_fsc_month
or cur_month == last_fsc_month
and cur_day <= last_fsc_day
today.month < int(last_fsc_month)
or today.month == int(last_fsc_month)
and today.day <= last_fsc_day
): ):
return time.strftime("%Y-01-01") return time.strftime("%Y-01-01")
else:
return False
def _default_foreign_currency(self): def _default_foreign_currency(self):
return self.env.user.has_group("base.group_multi_currency") return self.env.user.has_group("base.group_multi_currency")
@api.depends("date_from") @api.depends("date_from")
def _compute_fy_start_date(self): def _compute_fy_start_date(self):
for wiz in self.filtered("date_from"):
date = fields.Datetime.from_string(wiz.date_from)
res = self.company_id.compute_fiscalyear_dates(date)
wiz.fy_start_date = fields.Date.to_string(res["date_from"])
for wiz in self:
if wiz.date_from:
res = self.company_id.compute_fiscalyear_dates(wiz.date_from)
wiz.fy_start_date = res["date_from"]
else:
wiz.fy_start_date = False
@api.onchange("company_id") @api.onchange("company_id")
def onchange_company_id(self): def onchange_company_id(self):
@ -171,7 +173,6 @@ class GeneralLedgerReportWizard(models.TransientModel):
self.date_from = self.date_range_id.date_start self.date_from = self.date_range_id.date_start
self.date_to = self.date_range_id.date_end self.date_to = self.date_range_id.date_end
@api.multi
@api.constrains("company_id", "date_range_id") @api.constrains("company_id", "date_range_id")
def _check_company_id_date_range_id(self): def _check_company_id_date_range_id(self):
for rec in self.sudo(): for rec in self.sudo():
@ -210,7 +211,6 @@ class GeneralLedgerReportWizard(models.TransientModel):
else: else:
self.receivable_accounts_only = self.payable_accounts_only = False self.receivable_accounts_only = self.payable_accounts_only = False
@api.multi
@api.depends("company_id") @api.depends("company_id")
def _compute_unaffected_earnings_account(self): def _compute_unaffected_earnings_account(self):
account_type = self.env.ref("account.data_unaffected_earnings") account_type = self.env.ref("account.data_unaffected_earnings")
@ -228,7 +228,6 @@ class GeneralLedgerReportWizard(models.TransientModel):
store=True, store=True,
) )
@api.multi
def _print_report(self, report_type): def _print_report(self, report_type):
self.ensure_one() self.ensure_one()
data = self._prepare_report_general_ledger() data = self._prepare_report_general_ledger()
@ -245,19 +244,16 @@ class GeneralLedgerReportWizard(models.TransientModel):
.report_action(self, data=data) .report_action(self, data=data)
) )
@api.multi
def button_export_html(self): def button_export_html(self):
self.ensure_one() self.ensure_one()
report_type = "qweb-html" report_type = "qweb-html"
return self._export(report_type) return self._export(report_type)
@api.multi
def button_export_pdf(self): def button_export_pdf(self):
self.ensure_one() self.ensure_one()
report_type = "qweb-pdf" report_type = "qweb-pdf"
return self._export(report_type) return self._export(report_type)
@api.multi
def button_export_xlsx(self): def button_export_xlsx(self):
self.ensure_one() self.ensure_one()
report_type = "xlsx" report_type = "xlsx"

4
account_financial_report/wizard/general_ledger_wizard_view.xml

@ -124,7 +124,6 @@
id="action_general_ledger_wizard" id="action_general_ledger_wizard"
name="General Ledger" name="General Ledger"
res_model="general.ledger.report.wizard" res_model="general.ledger.report.wizard"
view_type="form"
view_mode="form" view_mode="form"
view_id="general_ledger_wizard" view_id="general_ledger_wizard"
target="new" target="new"
@ -134,14 +133,13 @@
id="act_action_general_ledger_wizard_partner_relation" id="act_action_general_ledger_wizard_partner_relation"
name="General Ledger" name="General Ledger"
res_model="general.ledger.report.wizard" res_model="general.ledger.report.wizard"
src_model="res.partner"
binding_model="res.partner"
view_mode="form" view_mode="form"
context="{ context="{
'default_receivable_accounts_only':1, 'default_receivable_accounts_only':1,
'default_payable_accounts_only':1, 'default_payable_accounts_only':1,
}" }"
groups="account.group_account_manager" groups="account.group_account_manager"
key2="client_action_multi"
target="new" target="new"
/> />
</odoo> </odoo>

23
account_financial_report/wizard/journal_ledger_wizard.py

@ -17,14 +17,14 @@ class JournalLedgerReportWizard(models.TransientModel):
required=False, required=False,
ondelete="cascade", ondelete="cascade",
) )
date_range_id = fields.Many2one(comodel_name="date.range", string="Date range",)
date_range_id = fields.Many2one(comodel_name="date.range", string="Date range")
date_from = fields.Date(string="Start date", required=True) date_from = fields.Date(string="Start date", required=True)
date_to = fields.Date(string="End date", required=True) date_to = fields.Date(string="End date", required=True)
journal_ids = fields.Many2many( journal_ids = fields.Many2many(
comodel_name="account.journal", string="Journals", required=False,
comodel_name="account.journal", string="Journals", required=False
) )
move_target = fields.Selection( move_target = fields.Selection(
selection="_get_move_targets", default="all", required=True,
selection="_get_move_targets", default="posted", required=True
) )
foreign_currency = fields.Boolean() foreign_currency = fields.Boolean()
sort_option = fields.Selection( sort_option = fields.Selection(
@ -39,7 +39,7 @@ class JournalLedgerReportWizard(models.TransientModel):
default="journal", default="journal",
required=True, required=True,
) )
with_account_name = fields.Boolean(default=False,)
with_account_name = fields.Boolean(default=False)
@api.model @api.model
def _get_move_targets(self): def _get_move_targets(self):
@ -47,17 +47,11 @@ class JournalLedgerReportWizard(models.TransientModel):
@api.model @api.model
def _get_sort_options(self): def _get_sort_options(self):
return [
("move_name", _("Entry number")),
("date", _("Date")),
]
return [("move_name", _("Entry number")), ("date", _("Date"))]
@api.model @api.model
def _get_group_options(self): def _get_group_options(self):
return [
("journal", _("Journal")),
("none", _("No group")),
]
return [("journal", _("Journal")), ("none", _("No group"))]
@api.onchange("date_range_id") @api.onchange("date_range_id")
def onchange_date_range_id(self): def onchange_date_range_id(self):
@ -84,7 +78,6 @@ class JournalLedgerReportWizard(models.TransientModel):
res["domain"]["journal_ids"] += [("company_id", "=", self.company_id.id)] res["domain"]["journal_ids"] += [("company_id", "=", self.company_id.id)]
return res return res
@api.multi
def _print_report(self, report_type): def _print_report(self, report_type):
self.ensure_one() self.ensure_one()
data = self._prepare_report_journal_ledger() data = self._prepare_report_journal_ledger()
@ -101,24 +94,20 @@ class JournalLedgerReportWizard(models.TransientModel):
.report_action(self, data=data) .report_action(self, data=data)
) )
@api.multi
def button_export_html(self): def button_export_html(self):
self.ensure_one() self.ensure_one()
report_type = "qweb-html" report_type = "qweb-html"
return self._export(report_type) return self._export(report_type)
@api.multi
def button_export_pdf(self): def button_export_pdf(self):
report_type = "qweb-pdf" report_type = "qweb-pdf"
return self._export(report_type) return self._export(report_type)
@api.multi
def button_export_xlsx(self): def button_export_xlsx(self):
self.ensure_one() self.ensure_one()
report_type = "xlsx" report_type = "xlsx"
return self._export(report_type) return self._export(report_type)
@api.multi
def _prepare_report_journal_ledger(self): def _prepare_report_journal_ledger(self):
self.ensure_one() self.ensure_one()
journals = self.journal_ids journals = self.journal_ids

1
account_financial_report/wizard/journal_ledger_wizard_view.xml

@ -68,7 +68,6 @@
id="action_journal_ledger_wizard" id="action_journal_ledger_wizard"
name="Journal Ledger" name="Journal Ledger"
res_model="journal.ledger.report.wizard" res_model="journal.ledger.report.wizard"
view_type="form"
view_mode="form" view_mode="form"
view_id="journal_ledger_wizard" view_id="journal_ledger_wizard"
target="new" target="new"

6
account_financial_report/wizard/open_items_wizard.py

@ -25,7 +25,7 @@ class OpenItemsReportWizard(models.TransientModel):
[("posted", "All Posted Entries"), ("all", "All Entries")], [("posted", "All Posted Entries"), ("all", "All Entries")],
string="Target Moves", string="Target Moves",
required=True, required=True,
default="all",
default="posted",
) )
account_ids = fields.Many2many( account_ids = fields.Many2many(
comodel_name="account.account", comodel_name="account.account",
@ -95,7 +95,6 @@ class OpenItemsReportWizard(models.TransientModel):
domain += [("reconcile", "=", True)] domain += [("reconcile", "=", True)]
self.account_ids = self.env["account.account"].search(domain) self.account_ids = self.env["account.account"].search(domain)
@api.multi
def _print_report(self, report_type): def _print_report(self, report_type):
self.ensure_one() self.ensure_one()
data = self._prepare_report_open_items() data = self._prepare_report_open_items()
@ -112,19 +111,16 @@ class OpenItemsReportWizard(models.TransientModel):
.report_action(self, data=data) .report_action(self, data=data)
) )
@api.multi
def button_export_html(self): def button_export_html(self):
self.ensure_one() self.ensure_one()
report_type = "qweb-html" report_type = "qweb-html"
return self._export(report_type) return self._export(report_type)
@api.multi
def button_export_pdf(self): def button_export_pdf(self):
self.ensure_one() self.ensure_one()
report_type = "qweb-pdf" report_type = "qweb-pdf"
return self._export(report_type) return self._export(report_type)
@api.multi
def button_export_xlsx(self): def button_export_xlsx(self):
self.ensure_one() self.ensure_one()
report_type = "xlsx" report_type = "xlsx"

4
account_financial_report/wizard/open_items_wizard_view.xml

@ -74,7 +74,6 @@
id="action_open_items_wizard" id="action_open_items_wizard"
name="Open Items" name="Open Items"
res_model="open.items.report.wizard" res_model="open.items.report.wizard"
view_type="form"
view_mode="form" view_mode="form"
view_id="open_items_wizard" view_id="open_items_wizard"
target="new" target="new"
@ -84,14 +83,13 @@
id="act_action_open_items_wizard_partner_relation" id="act_action_open_items_wizard_partner_relation"
name="Open Items Partner" name="Open Items Partner"
res_model="open.items.report.wizard" res_model="open.items.report.wizard"
src_model="res.partner"
binding_model="res.partner"
view_mode="form" view_mode="form"
context="{ context="{
'default_receivable_accounts_only':1, 'default_receivable_accounts_only':1,
'default_payable_accounts_only':1, 'default_payable_accounts_only':1,
}" }"
groups="account.group_account_manager" groups="account.group_account_manager"
key2="client_action_multi"
target="new" target="new"
/> />
</odoo> </odoo>

27
account_financial_report/wizard/trial_balance_wizard.py

@ -29,7 +29,7 @@ class TrialBalanceReportWizard(models.TransientModel):
[("posted", "All Posted Entries"), ("all", "All Entries")], [("posted", "All Posted Entries"), ("all", "All Entries")],
string="Target Moves", string="Target Moves",
required=True, required=True,
default="all",
default="posted",
) )
hierarchy_on = fields.Selection( hierarchy_on = fields.Selection(
[ [
@ -52,7 +52,7 @@ class TrialBalanceReportWizard(models.TransientModel):
"Do not display parent levels", default=False "Do not display parent levels", default=False
) )
account_ids = fields.Many2many( account_ids = fields.Many2many(
comodel_name="account.account", string="Filter accounts",
comodel_name="account.account", string="Filter accounts"
) )
hide_account_at_0 = fields.Boolean( hide_account_at_0 = fields.Boolean(
string="Hide accounts at 0", string="Hide accounts at 0",
@ -64,10 +64,8 @@ class TrialBalanceReportWizard(models.TransientModel):
receivable_accounts_only = fields.Boolean() receivable_accounts_only = fields.Boolean()
payable_accounts_only = fields.Boolean() payable_accounts_only = fields.Boolean()
show_partner_details = fields.Boolean() show_partner_details = fields.Boolean()
partner_ids = fields.Many2many(
comodel_name="res.partner", string="Filter partners",
)
journal_ids = fields.Many2many(comodel_name="account.journal",)
partner_ids = fields.Many2many(comodel_name="res.partner", string="Filter partners")
journal_ids = fields.Many2many(comodel_name="account.journal")
not_only_one_unaffected_earnings_account = fields.Boolean( not_only_one_unaffected_earnings_account = fields.Boolean(
readonly=True, string="Not only one unaffected earnings account" readonly=True, string="Not only one unaffected earnings account"
@ -80,7 +78,6 @@ class TrialBalanceReportWizard(models.TransientModel):
"will display initial and final balance in that currency.", "will display initial and final balance in that currency.",
) )
@api.multi
@api.constrains("hierarchy_on", "show_hierarchy_level") @api.constrains("hierarchy_on", "show_hierarchy_level")
def _check_show_hierarchy_level(self): def _check_show_hierarchy_level(self):
for rec in self: for rec in self:
@ -91,10 +88,12 @@ class TrialBalanceReportWizard(models.TransientModel):
@api.depends("date_from") @api.depends("date_from")
def _compute_fy_start_date(self): def _compute_fy_start_date(self):
for wiz in self.filtered("date_from"):
date = fields.Datetime.from_string(wiz.date_from)
res = self.company_id.compute_fiscalyear_dates(date)
wiz.fy_start_date = fields.Date.to_string(res["date_from"])
for wiz in self:
if wiz.date_from:
res = self.company_id.compute_fiscalyear_dates(wiz.date_from)
wiz.fy_start_date = res["date_from"]
else:
wiz.fy_start_date = False
@api.onchange("company_id") @api.onchange("company_id")
def onchange_company_id(self): def onchange_company_id(self):
@ -155,7 +154,6 @@ class TrialBalanceReportWizard(models.TransientModel):
self.date_from = self.date_range_id.date_start self.date_from = self.date_range_id.date_start
self.date_to = self.date_range_id.date_end self.date_to = self.date_range_id.date_end
@api.multi
@api.constrains("company_id", "date_range_id") @api.constrains("company_id", "date_range_id")
def _check_company_id_date_range_id(self): def _check_company_id_date_range_id(self):
for rec in self.sudo(): for rec in self.sudo():
@ -194,7 +192,6 @@ class TrialBalanceReportWizard(models.TransientModel):
else: else:
self.receivable_accounts_only = self.payable_accounts_only = False self.receivable_accounts_only = self.payable_accounts_only = False
@api.multi
@api.depends("company_id") @api.depends("company_id")
def _compute_unaffected_earnings_account(self): def _compute_unaffected_earnings_account(self):
account_type = self.env.ref("account.data_unaffected_earnings") account_type = self.env.ref("account.data_unaffected_earnings")
@ -212,7 +209,6 @@ class TrialBalanceReportWizard(models.TransientModel):
store=True, store=True,
) )
@api.multi
def _print_report(self, report_type): def _print_report(self, report_type):
self.ensure_one() self.ensure_one()
data = self._prepare_report_trial_balance() data = self._prepare_report_trial_balance()
@ -229,19 +225,16 @@ class TrialBalanceReportWizard(models.TransientModel):
.report_action(self, data=data) .report_action(self, data=data)
) )
@api.multi
def button_export_html(self): def button_export_html(self):
self.ensure_one() self.ensure_one()
report_type = "qweb-html" report_type = "qweb-html"
return self._export(report_type) return self._export(report_type)
@api.multi
def button_export_pdf(self): def button_export_pdf(self):
self.ensure_one() self.ensure_one()
report_type = "qweb-pdf" report_type = "qweb-pdf"
return self._export(report_type) return self._export(report_type)
@api.multi
def button_export_xlsx(self): def button_export_xlsx(self):
self.ensure_one() self.ensure_one()
report_type = "xlsx" report_type = "xlsx"

1
account_financial_report/wizard/trial_balance_wizard_view.xml

@ -133,7 +133,6 @@
id="action_trial_balance_wizard" id="action_trial_balance_wizard"
name="Trial Balance" name="Trial Balance"
res_model="trial.balance.report.wizard" res_model="trial.balance.report.wizard"
view_type="form"
view_mode="form" view_mode="form"
view_id="trial_balance_wizard" view_id="trial_balance_wizard"
target="new" target="new"

7
account_financial_report/wizard/vat_report_wizard.py

@ -34,7 +34,7 @@ class VATReportWizard(models.TransientModel):
and self.date_range_id.company_id != self.company_id and self.date_range_id.company_id != self.company_id
): ):
self.date_range_id = False self.date_range_id = False
res = {"domain": {"date_range_id": [],}}
res = {"domain": {"date_range_id": []}}
if not self.company_id: if not self.company_id:
return res return res
else: else:
@ -51,7 +51,6 @@ class VATReportWizard(models.TransientModel):
self.date_from = self.date_range_id.date_start self.date_from = self.date_range_id.date_start
self.date_to = self.date_range_id.date_end self.date_to = self.date_range_id.date_end
@api.multi
@api.constrains("company_id", "date_range_id") @api.constrains("company_id", "date_range_id")
def _check_company_id_date_range_id(self): def _check_company_id_date_range_id(self):
for rec in self.sudo(): for rec in self.sudo():
@ -67,7 +66,6 @@ class VATReportWizard(models.TransientModel):
) )
) )
@api.multi
def _print_report(self, report_type): def _print_report(self, report_type):
self.ensure_one() self.ensure_one()
data = self._prepare_vat_report() data = self._prepare_vat_report()
@ -84,19 +82,16 @@ class VATReportWizard(models.TransientModel):
.report_action(self, data=data) .report_action(self, data=data)
) )
@api.multi
def button_export_html(self): def button_export_html(self):
self.ensure_one() self.ensure_one()
report_type = "qweb-html" report_type = "qweb-html"
return self._export(report_type) return self._export(report_type)
@api.multi
def button_export_pdf(self): def button_export_pdf(self):
self.ensure_one() self.ensure_one()
report_type = "qweb-pdf" report_type = "qweb-pdf"
return self._export(report_type) return self._export(report_type)
@api.multi
def button_export_xlsx(self): def button_export_xlsx(self):
self.ensure_one() self.ensure_one()
report_type = "xlsx" report_type = "xlsx"

1
account_financial_report/wizard/vat_report_wizard_view.xml

@ -53,7 +53,6 @@
id="action_vat_report_wizard" id="action_vat_report_wizard"
name="VAT Report" name="VAT Report"
res_model="vat.report.wizard" res_model="vat.report.wizard"
view_type="form"
view_mode="form" view_mode="form"
view_id="vat_report_wizard" view_id="vat_report_wizard"
target="new" target="new"

1
oca_dependencies.txt

@ -1 +1,2 @@
server-ux server-ux
reporting-engine
Loading…
Cancel
Save