Initial commit: OCA Financial packages (186 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:04 +02:00
commit 3e0e8473fb
8757 changed files with 947473 additions and 0 deletions

View file

@ -0,0 +1,46 @@
# Account Liquidity Forecast
Odoo addon: account_liquidity_forecast
## Installation
```bash
pip install odoo-bringout-oca-account-financial-reporting-account_liquidity_forecast
```
## Dependencies
This addon depends on:
- account
- report_xlsx
- report_xlsx_helper
## Manifest Information
- **Name**: Account Liquidity Forecast
- **Version**: 16.0.1.0.0
- **Category**: Reporting
- **License**: AGPL-3
- **Installable**: True
## Source
Based on [OCA/account-financial-reporting](https://github.com/OCA/account-financial-reporting) branch 16.0, addon `account_liquidity_forecast`.
## License
This package maintains the original AGPL-3 license from the upstream Odoo project.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

View file

@ -0,0 +1,98 @@
.. image:: https://odoo-community.org/readme-banner-image
:target: https://odoo-community.org/get-involved?utm_source=readme
:alt: Odoo Community Association
==========================
Account Liquidity Forecast
==========================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:535f9c4100abae92d059f6746ff9d86907152187fa64c7aadb60263f4397ead0
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |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/16.0/account_liquidity_forecast
:alt: OCA/account-financial-reporting
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/account-financial-reporting-16-0/account-financial-reporting-16-0-account_liquidity_forecast
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/account-financial-reporting&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module provides a Liquidity Forecast Report based on user-defined parameters.
To launch the report wizard, navigate to Accounting/Invoicing > Reporting > Liquidity Forecast.
A configuration wizard will open, allowing you to define the parameters for the report.
The report begins from the current date and includes the following configurable options:
- Date To: Specifies the end date for the report. Data will be collected up to this date.
- Period Length (Month, Week, Day): Defines the granularity of the time intervals displayed in the report.
- Target Moves: Allows you to include or exclude draft journal entries in the report.
You can also add extra planning items representing expected cash inflows or outflows on specific dates.
To do this, go to Accounting/Invoicing > Accounting > Liquidity Forecast Planning Items.
This tool helps provide a clear and customizable view of your company's future liquidity position.
**Table of contents**
.. contents::
:local:
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/account-financial-reporting/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/account-financial-reporting/issues/new?body=module:%20account_liquidity_forecast%0Aversion:%2016.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.
Credits
=======
Authors
~~~~~~~
* ForgeFlow
Contributors
~~~~~~~~~~~~
* `ForgeFlow <https://www.forgeflow.com>`__:
* Jordi Ballester
* Jasmin Solanki
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/account-financial-reporting <https://github.com/OCA/account-financial-reporting/tree/16.0/account_liquidity_forecast>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1,3 @@
from . import models
from . import report
from . import wizards

View file

@ -0,0 +1,31 @@
# Copyright 2023 ForgeFlow S.L. (https://www.forgeflow.com)
{
"name": "Account Liquidity Forecast",
"version": "16.0.1.0.0",
"category": "Reporting",
"summary": "Account Liquidity Forecast",
"author": "ForgeFlow," "Odoo Community Association (OCA)",
"website": "https://github.com/OCA/account-financial-reporting",
"depends": ["account", "report_xlsx", "report_xlsx_helper"],
"data": [
"security/ir.model.access.csv",
"security/security.xml",
"wizards/account_liquidity_forecast_wizard_views.xml",
"views/report_liquidity_forecast_views.xml",
"views/account_liquidity_forecast_planning_item_views.xml",
"views/account_liquidity_forecast_planning_group_views.xml",
"menuitems.xml",
"reports.xml",
"report/templates/layouts.xml",
"report/templates/liquidity_forecast.xml",
],
"assets": {
"web.assets_backend": [
"account_liquidity_forecast/static/src/js/*",
],
},
"installable": True,
"application": True,
"auto_install": False,
"license": "AGPL-3",
}

View file

@ -0,0 +1,355 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_liquidity_forecast
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: account_liquidity_forecast
#: model:ir.model,name:account_liquidity_forecast.model_account_account
msgid "Account"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields.selection,name:account_liquidity_forecast.selection__account_liquidity_forecast_report_wizard__target_move__all
msgid "All Entries"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields.selection,name:account_liquidity_forecast.selection__account_liquidity_forecast_report_wizard__target_move__posted
msgid "All Posted Entries"
msgstr ""
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_filters
msgid "All entries"
msgstr ""
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_filters
msgid "All posted entries"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__amount
msgid "Amount"
msgstr ""
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "BEGINNING BALANCE"
msgstr ""
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "CASH INFLOWS"
msgstr ""
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "CASH OUTFLOWS"
msgstr ""
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.liquidity_forecast_wizard
msgid "Cancel"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__company_id
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__company_id
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__company_id
msgid "Company"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__company_currency_id
msgid "Company Currency"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__create_uid
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__create_uid
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__create_uid
msgid "Created by"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__create_date
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__create_date
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__create_date
msgid "Created on"
msgstr ""
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "Current %s"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__date
msgid "Date"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__date_to
msgid "Date To"
msgstr ""
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast_xlsx.py:0
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_filters
#, python-format
msgid "Date range filter"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields.selection,name:account_liquidity_forecast.selection__account_liquidity_forecast_report_wizard__period_length__days
msgid "Days"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__direction
msgid "Direction"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__display_name
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__display_name
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__display_name
msgid "Display Name"
msgstr ""
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "ENDING BALANCE"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__expiry_date
msgid "Expiry Date"
msgstr ""
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.liquidity_forecast_wizard
msgid "Export PDF"
msgstr ""
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.liquidity_forecast_wizard
msgid "Export XLSX"
msgstr ""
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "Forecast Planning Items"
msgstr ""
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_filters
msgid "From:"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__id
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__id
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__id
msgid "ID"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields.selection,name:account_liquidity_forecast.selection__account_liquidity_forecast_planning_item__direction__in
msgid "Incoming"
msgstr ""
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_lines_header
msgid "Items"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group____last_update
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item____last_update
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard____last_update
msgid "Last Modified on"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__write_uid
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__write_uid
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__write_uid
msgid "Last Updated by"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__write_date
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__write_date
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__write_date
msgid "Last Updated on"
msgstr ""
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast_xlsx.py:0
#: code:addons/account_liquidity_forecast/report/liquidity_forecast_xlsx.py:0
#: model:ir.actions.act_window,name:account_liquidity_forecast.action_liquidity_forecast_wizard
#: model:ir.actions.report,name:account_liquidity_forecast.action_report_liquidity_forecast_html
#: model:ir.actions.report,name:account_liquidity_forecast.action_report_liquidity_forecast_qweb
#: model:ir.actions.report,name:account_liquidity_forecast.report_liquidity_forecast_xlsx
#: model:ir.ui.menu,name:account_liquidity_forecast.menu_liquidity_forecast
#, python-format
msgid "Liquidity Forecast"
msgstr ""
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_base
msgid "Liquidity Forecast -"
msgstr ""
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast_xlsx.py:0
#, python-format
msgid "Liquidity Forecast - %(company_name)s - %(currency_name)s"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model,name:account_liquidity_forecast.model_account_liquidity_forecast_planning_group
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.account_liquidity_forecast_planning_group_view_form
msgid "Liquidity Forecast Planning Group"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.actions.act_window,name:account_liquidity_forecast.account_liquidity_forecast_planning_group_action
#: model:ir.actions.act_window,name:account_liquidity_forecast.account_liquidity_forecast_planning_item_action
#: model:ir.ui.menu,name:account_liquidity_forecast.account_liquidity_forecast_planning_group_menu
msgid "Liquidity Forecast Planning Groups"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model,name:account_liquidity_forecast.model_account_liquidity_forecast_planning_item
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.account_liquidity_forecast_planning_item_view_form
msgid "Liquidity Forecast Planning Item"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.ui.menu,name:account_liquidity_forecast.account_liquidity_forecast_planning_item_menu
msgid "Liquidity Forecast Planning Items"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model,name:account_liquidity_forecast.model_report_account_liquidity_forecast_liquidity_forecast
#: model:ir.model,name:account_liquidity_forecast.model_report_report_liquidity_forecast_xlsx
msgid "Liquidity Forecast Report"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model,name:account_liquidity_forecast.model_account_liquidity_forecast_report_wizard
msgid "Liquidity Forecast Report Wizard"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields.selection,name:account_liquidity_forecast.selection__account_liquidity_forecast_report_wizard__period_length__months
msgid "Months"
msgstr ""
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "NET CASH FLOW"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__name
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__name
msgid "Name"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields.selection,name:account_liquidity_forecast.selection__account_liquidity_forecast_planning_item__direction__out
msgid "Outgoing"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__period_length
msgid "Period Length"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__group_id
msgid "Planning Group"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model,name:account_liquidity_forecast.model_ir_actions_report
msgid "Report Action"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__target_move
msgid "Target Moves"
msgstr ""
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast_xlsx.py:0
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_filters
#, python-format
msgid "Target moves filter"
msgstr ""
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_filters
msgid "To"
msgstr ""
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "Total Cash Inflows"
msgstr ""
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "Total Cash Outflows"
msgstr ""
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.liquidity_forecast_wizard
msgid "View"
msgstr ""
#. module: account_liquidity_forecast
#: model:ir.model.fields.selection,name:account_liquidity_forecast.selection__account_liquidity_forecast_report_wizard__period_length__weeks
msgid "Weeks"
msgstr ""
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.liquidity_forecast_wizard
msgid "or"
msgstr ""

View file

@ -0,0 +1,355 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_liquidity_forecast
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: account_liquidity_forecast
#: model:ir.model,name:account_liquidity_forecast.model_account_account
msgid "Account"
msgstr "Konto"
#. module: account_liquidity_forecast
#: model:ir.model.fields.selection,name:account_liquidity_forecast.selection__account_liquidity_forecast_report_wizard__target_move__all
msgid "All Entries"
msgstr "Sve stavke"
#. module: account_liquidity_forecast
#: model:ir.model.fields.selection,name:account_liquidity_forecast.selection__account_liquidity_forecast_report_wizard__target_move__posted
msgid "All Posted Entries"
msgstr "Sve proknjižene stavke"
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_filters
msgid "All entries"
msgstr "Sve stavke"
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_filters
msgid "All posted entries"
msgstr "Sve proknjižene stavke"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__amount
msgid "Amount"
msgstr "Iznos"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "BEGINNING BALANCE"
msgstr "POČETNI SALDO"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "CASH INFLOWS"
msgstr "PRILIV GOTOVINE"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "CASH OUTFLOWS"
msgstr "ODLIV GOTOVINE"
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.liquidity_forecast_wizard
msgid "Cancel"
msgstr "Otkaži"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__company_id
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__company_id
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__company_id
msgid "Company"
msgstr "Preduzeće"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__company_currency_id
msgid "Company Currency"
msgstr "Valuta preduzeća"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__create_uid
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__create_uid
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__create_uid
msgid "Created by"
msgstr "Kreirao"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__create_date
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__create_date
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__create_date
msgid "Created on"
msgstr "Kreirano"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "Current %s"
msgstr "Trenutni %s"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__date
msgid "Date"
msgstr "Datum"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__date_to
msgid "Date To"
msgstr "Datum do"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast_xlsx.py:0
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_filters
#, python-format
msgid "Date range filter"
msgstr "Filter raspona datuma"
#. module: account_liquidity_forecast
#: model:ir.model.fields.selection,name:account_liquidity_forecast.selection__account_liquidity_forecast_report_wizard__period_length__days
msgid "Days"
msgstr "Dani"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__direction
msgid "Direction"
msgstr "Smjer"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__display_name
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__display_name
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__display_name
msgid "Display Name"
msgstr "Prikazani naziv"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "ENDING BALANCE"
msgstr "ZAVRŠNI SALDO"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__expiry_date
msgid "Expiry Date"
msgstr "Datum isteka"
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.liquidity_forecast_wizard
msgid "Export PDF"
msgstr "Izvoz PDF"
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.liquidity_forecast_wizard
msgid "Export XLSX"
msgstr "Izvoz XLSX"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "Forecast Planning Items"
msgstr "Stavke planiranja prognoze"
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_filters
msgid "From:"
msgstr "Od:"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__id
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__id
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__id
msgid "ID"
msgstr "ID"
#. module: account_liquidity_forecast
#: model:ir.model.fields.selection,name:account_liquidity_forecast.selection__account_liquidity_forecast_planning_item__direction__in
msgid "Incoming"
msgstr "Ulazni"
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_lines_header
msgid "Items"
msgstr "Stavke"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group____last_update
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item____last_update
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard____last_update
msgid "Last Modified on"
msgstr "Zadnje mijenjano"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__write_uid
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__write_uid
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__write_uid
msgid "Last Updated by"
msgstr "Zadnji ažurirao"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__write_date
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__write_date
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__write_date
msgid "Last Updated on"
msgstr "Zadnje ažurirano"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast_xlsx.py:0
#: code:addons/account_liquidity_forecast/report/liquidity_forecast_xlsx.py:0
#: model:ir.actions.act_window,name:account_liquidity_forecast.action_liquidity_forecast_wizard
#: model:ir.actions.report,name:account_liquidity_forecast.action_report_liquidity_forecast_html
#: model:ir.actions.report,name:account_liquidity_forecast.action_report_liquidity_forecast_qweb
#: model:ir.actions.report,name:account_liquidity_forecast.report_liquidity_forecast_xlsx
#: model:ir.ui.menu,name:account_liquidity_forecast.menu_liquidity_forecast
#, python-format
msgid "Liquidity Forecast"
msgstr "Prognoza likvidnosti"
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_base
msgid "Liquidity Forecast -"
msgstr "Prognoza likvidnosti -"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast_xlsx.py:0
#, python-format
msgid "Liquidity Forecast - %(company_name)s - %(currency_name)s"
msgstr "Prognoza likvidnosti - %(company_name)s - %(currency_name)s"
#. module: account_liquidity_forecast
#: model:ir.model,name:account_liquidity_forecast.model_account_liquidity_forecast_planning_group
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.account_liquidity_forecast_planning_group_view_form
msgid "Liquidity Forecast Planning Group"
msgstr "Grupa planiranja prognoze likvidnosti"
#. module: account_liquidity_forecast
#: model:ir.actions.act_window,name:account_liquidity_forecast.account_liquidity_forecast_planning_group_action
#: model:ir.actions.act_window,name:account_liquidity_forecast.account_liquidity_forecast_planning_item_action
#: model:ir.ui.menu,name:account_liquidity_forecast.account_liquidity_forecast_planning_group_menu
msgid "Liquidity Forecast Planning Groups"
msgstr "Grupe planiranja prognoze likvidnosti"
#. module: account_liquidity_forecast
#: model:ir.model,name:account_liquidity_forecast.model_account_liquidity_forecast_planning_item
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.account_liquidity_forecast_planning_item_view_form
msgid "Liquidity Forecast Planning Item"
msgstr "Stavka planiranja prognoze likvidnosti"
#. module: account_liquidity_forecast
#: model:ir.ui.menu,name:account_liquidity_forecast.account_liquidity_forecast_planning_item_menu
msgid "Liquidity Forecast Planning Items"
msgstr "Stavke planiranja prognoze likvidnosti"
#. module: account_liquidity_forecast
#: model:ir.model,name:account_liquidity_forecast.model_report_account_liquidity_forecast_liquidity_forecast
#: model:ir.model,name:account_liquidity_forecast.model_report_report_liquidity_forecast_xlsx
msgid "Liquidity Forecast Report"
msgstr "Izvještaj prognoze likvidnosti"
#. module: account_liquidity_forecast
#: model:ir.model,name:account_liquidity_forecast.model_account_liquidity_forecast_report_wizard
msgid "Liquidity Forecast Report Wizard"
msgstr "Čarobnjak izvještaja prognoze likvidnosti"
#. module: account_liquidity_forecast
#: model:ir.model.fields.selection,name:account_liquidity_forecast.selection__account_liquidity_forecast_report_wizard__period_length__months
msgid "Months"
msgstr "Mjeseci"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "NET CASH FLOW"
msgstr "NETO TOK GOTOVINE"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__name
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__name
msgid "Name"
msgstr "Naziv:"
#. module: account_liquidity_forecast
#: model:ir.model.fields.selection,name:account_liquidity_forecast.selection__account_liquidity_forecast_planning_item__direction__out
msgid "Outgoing"
msgstr "Odlazeći"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__period_length
msgid "Period Length"
msgstr "Trajanje perioda"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__group_id
msgid "Planning Group"
msgstr "Grupa planiranja"
#. module: account_liquidity_forecast
#: model:ir.model,name:account_liquidity_forecast.model_ir_actions_report
msgid "Report Action"
msgstr "Akcija izvještaja"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__target_move
msgid "Target Moves"
msgstr "Ciljane stavke"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast_xlsx.py:0
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_filters
#, python-format
msgid "Target moves filter"
msgstr "Filter ciljanih stavaka"
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_filters
msgid "To"
msgstr "Za"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "Total Cash Inflows"
msgstr "Ukupni priliv gotovine"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "Total Cash Outflows"
msgstr "Ukupni odliv gotovine"
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.liquidity_forecast_wizard
msgid "View"
msgstr "Pregled"
#. module: account_liquidity_forecast
#: model:ir.model.fields.selection,name:account_liquidity_forecast.selection__account_liquidity_forecast_report_wizard__period_length__weeks
msgid "Weeks"
msgstr "Sedmice"
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.liquidity_forecast_wizard
msgid "or"
msgstr "ili"

View file

@ -0,0 +1,358 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_liquidity_forecast
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-06-30 13:25+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
"Language-Team: none\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.10.4\n"
#. module: account_liquidity_forecast
#: model:ir.model,name:account_liquidity_forecast.model_account_account
msgid "Account"
msgstr "Conto"
#. module: account_liquidity_forecast
#: model:ir.model.fields.selection,name:account_liquidity_forecast.selection__account_liquidity_forecast_report_wizard__target_move__all
msgid "All Entries"
msgstr "Tutte le registrazioni"
#. module: account_liquidity_forecast
#: model:ir.model.fields.selection,name:account_liquidity_forecast.selection__account_liquidity_forecast_report_wizard__target_move__posted
msgid "All Posted Entries"
msgstr "Tutte le registrazioni confermate"
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_filters
msgid "All entries"
msgstr "Tutte le registrazioni"
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_filters
msgid "All posted entries"
msgstr "Tutte le registrazioni confermate"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__amount
msgid "Amount"
msgstr "Valore"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "BEGINNING BALANCE"
msgstr "SALDO INIZIALE"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "CASH INFLOWS"
msgstr "FLUSSO DI CASSA IN ENTRATA"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "CASH OUTFLOWS"
msgstr "FLUSSI DI CASSA IN USCITA"
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.liquidity_forecast_wizard
msgid "Cancel"
msgstr "Annulla"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__company_id
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__company_id
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__company_id
msgid "Company"
msgstr "Azienda"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__company_currency_id
msgid "Company Currency"
msgstr "Valuta aziendale"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__create_uid
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__create_uid
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__create_uid
msgid "Created by"
msgstr "Creato da"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__create_date
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__create_date
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__create_date
msgid "Created on"
msgstr "Creato il"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "Current %s"
msgstr "Attuale %s"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__date
msgid "Date"
msgstr "Data"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__date_to
msgid "Date To"
msgstr "Alla data"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast_xlsx.py:0
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_filters
#, python-format
msgid "Date range filter"
msgstr "Filtro intervallo di date"
#. module: account_liquidity_forecast
#: model:ir.model.fields.selection,name:account_liquidity_forecast.selection__account_liquidity_forecast_report_wizard__period_length__days
msgid "Days"
msgstr "Giorni"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__direction
msgid "Direction"
msgstr "Direzione"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__display_name
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__display_name
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__display_name
msgid "Display Name"
msgstr "Nome visualizzato"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "ENDING BALANCE"
msgstr "SALDO FINALE"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__expiry_date
msgid "Expiry Date"
msgstr "Data scadenza"
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.liquidity_forecast_wizard
msgid "Export PDF"
msgstr "Esporta PDF"
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.liquidity_forecast_wizard
msgid "Export XLSX"
msgstr "Esporta XLSX"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "Forecast Planning Items"
msgstr "Righe pianificazione previsionale"
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_filters
msgid "From:"
msgstr "Da:"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__id
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__id
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__id
msgid "ID"
msgstr "ID"
#. module: account_liquidity_forecast
#: model:ir.model.fields.selection,name:account_liquidity_forecast.selection__account_liquidity_forecast_planning_item__direction__in
msgid "Incoming"
msgstr "In entrata"
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_lines_header
msgid "Items"
msgstr "Righe"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group____last_update
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item____last_update
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard____last_update
msgid "Last Modified on"
msgstr "Ultima modifica il"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__write_uid
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__write_uid
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__write_uid
msgid "Last Updated by"
msgstr "Ultimo aggiornamento di"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__write_date
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__write_date
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__write_date
msgid "Last Updated on"
msgstr "Ultimo aggiornamento il"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast_xlsx.py:0
#: code:addons/account_liquidity_forecast/report/liquidity_forecast_xlsx.py:0
#: model:ir.actions.act_window,name:account_liquidity_forecast.action_liquidity_forecast_wizard
#: model:ir.actions.report,name:account_liquidity_forecast.action_report_liquidity_forecast_html
#: model:ir.actions.report,name:account_liquidity_forecast.action_report_liquidity_forecast_qweb
#: model:ir.actions.report,name:account_liquidity_forecast.report_liquidity_forecast_xlsx
#: model:ir.ui.menu,name:account_liquidity_forecast.menu_liquidity_forecast
#, python-format
msgid "Liquidity Forecast"
msgstr "Previsione liquidità"
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_base
msgid "Liquidity Forecast -"
msgstr "Previsione liquidità -"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast_xlsx.py:0
#, python-format
msgid "Liquidity Forecast - %(company_name)s - %(currency_name)s"
msgstr "Previsione liquidità - %(company_name)s - %(currency_name)s"
#. module: account_liquidity_forecast
#: model:ir.model,name:account_liquidity_forecast.model_account_liquidity_forecast_planning_group
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.account_liquidity_forecast_planning_group_view_form
msgid "Liquidity Forecast Planning Group"
msgstr "Gruppo pianificazione previsione liquidità"
#. module: account_liquidity_forecast
#: model:ir.actions.act_window,name:account_liquidity_forecast.account_liquidity_forecast_planning_group_action
#: model:ir.actions.act_window,name:account_liquidity_forecast.account_liquidity_forecast_planning_item_action
#: model:ir.ui.menu,name:account_liquidity_forecast.account_liquidity_forecast_planning_group_menu
msgid "Liquidity Forecast Planning Groups"
msgstr "Gruppi pianificazione previsione liquidità"
#. module: account_liquidity_forecast
#: model:ir.model,name:account_liquidity_forecast.model_account_liquidity_forecast_planning_item
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.account_liquidity_forecast_planning_item_view_form
msgid "Liquidity Forecast Planning Item"
msgstr "Riga pianificazione previsione liquidità"
#. module: account_liquidity_forecast
#: model:ir.ui.menu,name:account_liquidity_forecast.account_liquidity_forecast_planning_item_menu
msgid "Liquidity Forecast Planning Items"
msgstr "Righe pianificazione previsione liquidità"
#. module: account_liquidity_forecast
#: model:ir.model,name:account_liquidity_forecast.model_report_account_liquidity_forecast_liquidity_forecast
#: model:ir.model,name:account_liquidity_forecast.model_report_report_liquidity_forecast_xlsx
msgid "Liquidity Forecast Report"
msgstr "Resoconto previsione liquidità"
#. module: account_liquidity_forecast
#: model:ir.model,name:account_liquidity_forecast.model_account_liquidity_forecast_report_wizard
msgid "Liquidity Forecast Report Wizard"
msgstr "Procedura guidata resoconto previsione liquidità"
#. module: account_liquidity_forecast
#: model:ir.model.fields.selection,name:account_liquidity_forecast.selection__account_liquidity_forecast_report_wizard__period_length__months
msgid "Months"
msgstr "Mesi"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "NET CASH FLOW"
msgstr "FLUSSO DI CASSA NETTO"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_group__name
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__name
msgid "Name"
msgstr "Nome"
#. module: account_liquidity_forecast
#: model:ir.model.fields.selection,name:account_liquidity_forecast.selection__account_liquidity_forecast_planning_item__direction__out
msgid "Outgoing"
msgstr "In uscita"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__period_length
msgid "Period Length"
msgstr "Durata periodo"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_planning_item__group_id
msgid "Planning Group"
msgstr "Gruppo pianificazione"
#. module: account_liquidity_forecast
#: model:ir.model,name:account_liquidity_forecast.model_ir_actions_report
msgid "Report Action"
msgstr "Azione resoconto"
#. module: account_liquidity_forecast
#: model:ir.model.fields,field_description:account_liquidity_forecast.field_account_liquidity_forecast_report_wizard__target_move
msgid "Target Moves"
msgstr "Movimenti obiettivo"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast_xlsx.py:0
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_filters
#, python-format
msgid "Target moves filter"
msgstr "Filtro movimenti obiettivo"
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.report_liquidity_forecast_filters
msgid "To"
msgstr "A"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "Total Cash Inflows"
msgstr "Totale flusso di cassa in entrata"
#. module: account_liquidity_forecast
#. odoo-python
#: code:addons/account_liquidity_forecast/report/liquidity_forecast.py:0
#, python-format
msgid "Total Cash Outflows"
msgstr "Totale flusso di cassa in uscita"
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.liquidity_forecast_wizard
msgid "View"
msgstr "Vista"
#. module: account_liquidity_forecast
#: model:ir.model.fields.selection,name:account_liquidity_forecast.selection__account_liquidity_forecast_report_wizard__period_length__weeks
msgid "Weeks"
msgstr "Settimane"
#. module: account_liquidity_forecast
#: model_terms:ir.ui.view,arch_db:account_liquidity_forecast.liquidity_forecast_wizard
msgid "or"
msgstr "o"

View file

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<menuitem
parent="account.menu_finance_reports"
id="menu_liquidity_forecast"
action="action_liquidity_forecast_wizard"
name="Liquidity Forecast"
groups="account.group_account_user"
/>
<menuitem
name="Liquidity Forecast Planning Groups"
id="account_liquidity_forecast_planning_group_menu"
parent="account.account_account_menu"
action="account_liquidity_forecast_planning_group_action"
groups="account.group_account_manager"
/>
<menuitem
name="Liquidity Forecast Planning Items"
id="account_liquidity_forecast_planning_item_menu"
parent="account.menu_finance_entries_management"
action="account_liquidity_forecast_planning_item_action"
groups="account.group_account_user"
/>
</odoo>

View file

@ -0,0 +1,4 @@
from . import ir_actions_report
from . import account_account
from . import account_liquidity_forecast_planning_group
from . import account_liquidity_forecast_planning_item

View file

@ -0,0 +1,28 @@
# Copyright 2023 ForgeFlow S.L. (https://www.forgeflow.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import models
class AccountAccount(models.Model):
_inherit = "account.account"
def _get_open_items_at_date(self, date, only_posted_moves):
if not date or not self:
return []
move_states = ["posted"]
if not only_posted_moves:
move_states.append("draft")
amls = self.env["account.move.line"].search(
[
("reconciled", "=", False),
("account_id", "in", self.ids),
"|",
("date_maturity", "<=", date),
"&",
("date_maturity", "=", False),
("date", "<=", date),
("parent_state", "in", move_states),
]
)
return amls

View file

@ -0,0 +1,17 @@
# Copyright 2023 ForgeFlow S.L. (https://www.forgeflow.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import fields, models
class AccountLiquidityForecastPlanningGroup(models.Model):
_name = "account.liquidity.forecast.planning.group"
_description = "Liquidity Forecast Planning Group"
name = fields.Char(required=True, translate=True)
company_id = fields.Many2one(
"res.company",
string="Company",
required=True,
default=lambda self: self.env.company,
)

View file

@ -0,0 +1,37 @@
# Copyright 2023 ForgeFlow S.L. (https://www.forgeflow.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import fields, models
class AccountLiquidityForecastPlanningItem(models.Model):
_name = "account.liquidity.forecast.planning.item"
_description = "Liquidity Forecast Planning Item"
name = fields.Char(required=True)
group_id = fields.Many2one(
string="Planning Group",
comodel_name="account.liquidity.forecast.planning.group",
)
company_id = fields.Many2one(
"res.company",
string="Company",
required=True,
default=lambda self: self.env.company,
index=True,
)
company_currency_id = fields.Many2one(
string="Company Currency",
related="company_id.currency_id",
readonly=True,
store=True,
precompute=True,
)
amount = fields.Monetary(currency_field="company_currency_id")
direction = fields.Selection(
selection=[("in", "Incoming"), ("out", "Outgoing")],
default="in",
index=True,
)
date = fields.Date(index=True)
expiry_date = fields.Date(index=True)

View file

@ -0,0 +1,27 @@
# Copyright 2023 ForgeFlow S.L. (https://www.forgeflow.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import api, models
class IrActionsReport(models.Model):
_inherit = "ir.actions.report"
@api.model
def _prepare_liquidity_forecast_report_context(self, data):
lang = data and data.get("liquidity_forecast_report_lang") or ""
return dict(self.env.context or {}, lang=lang) if lang else False
@api.model
def _render_qweb_html(self, report_ref, docids, data=None):
context = self._prepare_liquidity_forecast_report_context(data)
obj = self.with_context(**context) if context else self
return super(IrActionsReport, obj)._render_qweb_html(
report_ref, docids, data=data
)
@api.model
def _render_xlsx(self, report_ref, docids, data=None):
context = self._prepare_liquidity_forecast_report_context(data)
obj = self.with_context(**context) if context else self
return super(IrActionsReport, obj)._render_xlsx(report_ref, docids, data=data)

View file

@ -0,0 +1,4 @@
* `ForgeFlow <https://www.forgeflow.com>`__:
* Jordi Ballester
* Jasmin Solanki

View file

@ -0,0 +1,16 @@
This module provides a Liquidity Forecast Report based on user-defined parameters.
To launch the report wizard, navigate to Accounting/Invoicing > Reporting > Liquidity Forecast.
A configuration wizard will open, allowing you to define the parameters for the report.
The report begins from the current date and includes the following configurable options:
- Date To: Specifies the end date for the report. Data will be collected up to this date.
- Period Length (Month, Week, Day): Defines the granularity of the time intervals displayed in the report.
- Target Moves: Allows you to include or exclude draft journal entries in the report.
You can also add extra planning items representing expected cash inflows or outflows on specific dates.
To do this, go to Accounting/Invoicing > Accounting > Liquidity Forecast Planning Items.
This tool helps provide a clear and customizable view of your company's future liquidity position.

View file

@ -0,0 +1,2 @@
from . import liquidity_forecast
from . import liquidity_forecast_xlsx

View file

@ -0,0 +1,525 @@
# Copyright 2023 ForgeFlow S.L. (https://www.forgeflow.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import calendar
import datetime
from odoo import _, fields, models
from odoo.tools.float_utils import float_is_zero
from odoo.tools.misc import format_date
class LiquidityForecastReport(models.AbstractModel):
_name = "report.account_liquidity_forecast.liquidity_forecast"
_description = "Liquidity Forecast Report"
def _init_period(self, line, period):
line["periods"][period["sequence"]] = {
"amount": 0.0,
"domain": "",
}
def _complete_liquidity_forecast_lines(
self, data, liquidity_forecast_lines, line, period, periods
):
if line["code"] == "cash_flow_line_out_payable":
self._init_period(line, period)
self._complete_cash_flow_lines_payable(
data, liquidity_forecast_lines, period, periods
)
if line["code"] == "beginning_balance":
self._init_period(line, period)
self._complete_beginning_balance(
data, liquidity_forecast_lines, line, period
)
if line["code"] == "ending_balance":
self._init_period(line, period)
self._complete_ending_balance(data, liquidity_forecast_lines, line, period)
if line["code"] == "total_cash_inflows":
self._init_period(line, period)
self._complete_total_cash_inflows(
data, liquidity_forecast_lines, line, period
)
if line["code"] == "total_cash_outflows":
self._init_period(line, period)
self._complete_total_cash_outflows(
data, liquidity_forecast_lines, line, period
)
if line["code"] == "net_cash_flow":
self._init_period(line, period)
self._complete_net_cash_flow(data, liquidity_forecast_lines, line, period)
return True
def _complete_beginning_balance(self, data, liquidity_forecast_lines, line, period):
if period["sequence"] == 0:
domain = [
("account_id.account_type", "=", "asset_cash"),
("company_id", "=", data["company_id"]),
]
if data["only_posted_moves"]:
domain += [("move_id.state", "=", "posted")]
else:
domain += [("move_id.state", "in", ["posted", "draft"])]
initial_balances = self.env["account.move.line"].read_group(
domain=domain,
fields=["balance:sum"],
groupby=["company_id"],
)
initial_balance_amount = 0.0
if initial_balances:
initial_balance = initial_balances[0]
initial_balance_amount = initial_balance["balance"]
line["periods"][period["sequence"]]["amount"] = initial_balance_amount
else:
ending_balance_line = list(
filter(
lambda d: d["code"] == "ending_balance", liquidity_forecast_lines
)
)
line["periods"][period["sequence"]]["amount"] = ending_balance_line[0][
"periods"
][period["sequence"] - 1]["amount"]
def _complete_ending_balance(self, data, liquidity_forecast_lines, line, period):
starting_balance_line = list(
filter(lambda d: d["code"] == "beginning_balance", liquidity_forecast_lines)
)[0]
net_cash_flow_line = list(
filter(lambda d: d["code"] == "net_cash_flow", liquidity_forecast_lines)
)[0]
line["periods"][period["sequence"]]["amount"] = (
starting_balance_line["periods"][period["sequence"]]["amount"]
+ net_cash_flow_line["periods"][period["sequence"]]["amount"]
)
def _complete_total_cash_inflows(
self, data, liquidity_forecast_lines, line, period
):
cash_inflow = 0.0
cash_inflow_lines = list(
filter(lambda d: "cash_flow_line_in" in d["code"], liquidity_forecast_lines)
)
for cash_inflow_line in cash_inflow_lines:
cash_inflow += cash_inflow_line["periods"][period["sequence"]]["amount"]
line["periods"][period["sequence"]]["amount"] = cash_inflow
def _complete_total_cash_outflows(
self, data, liquidity_forecast_lines, line, period
):
cash_outflow = 0.0
cash_outflow_lines = list(
filter(
lambda d: "cash_flow_line_out" in d["code"], liquidity_forecast_lines
)
)
for cash_outflow_line in cash_outflow_lines:
cash_outflow += cash_outflow_line["periods"][period["sequence"]]["amount"]
line["periods"][period["sequence"]]["amount"] = cash_outflow
def _complete_net_cash_flow(self, data, liquidity_forecast_lines, line, period):
cash_flow = 0.0
cash_flow_lines = list(
filter(lambda d: "cash_flow_line" in d["code"], liquidity_forecast_lines)
)
for cash_flow_line in cash_flow_lines:
cash_flow += cash_flow_line["periods"][period["sequence"]]["amount"]
line["periods"][period["sequence"]]["amount"] = cash_flow
def _prepare_cash_flow_lines(
self, data, liquidity_forecast_lines, period, periods, accounts, date_type
):
company_id = data.get("company_id", self.env.user.company_id.id)
company = self.env["res.company"].browse(company_id)
open_amls = accounts._get_open_items_at_date(
period["date_to"], data["only_posted_moves"]
)
period_open_amls = self.env["account.move.line"]
rounding = company.currency_id.rounding
for open_aml in open_amls:
date_due = open_aml[date_type] or open_aml["date"]
if (
(
(period["sequence"] == 0 and period["date_to"] >= date_due)
or not date_due
)
or (
period["sequence"] > 0
and period["date_to"] >= date_due >= period["date_from"]
)
) and not float_is_zero(
open_aml.amount_residual, precision_rounding=rounding
):
period_open_amls |= open_aml
in_flows = {}
out_flows = {}
for open_aml in period_open_amls:
account = open_aml.account_id
open_item_amount = open_aml.amount_residual
if open_item_amount > 0 and account not in in_flows.keys():
in_flows[account] = {"amount": 0.0, "move_line_ids": []}
if open_item_amount < 0 and account not in out_flows.keys():
out_flows[account] = {"amount": 0.0, "move_line_ids": []}
if open_item_amount > 0:
in_flows[account]["amount"] += open_item_amount
in_flows[account]["move_line_ids"].append(open_aml.id)
else:
out_flows[account]["amount"] += open_item_amount
out_flows[account]["move_line_ids"].append(open_aml.id)
for account in in_flows.keys():
in_cash_flow_lines = list(
filter(
lambda d: "cash_flow_line_%s_account_%s" % ("in", account.code)
in d["code"],
liquidity_forecast_lines,
)
)
if not in_cash_flow_lines:
in_cash_flow_line = {
"code": "cash_flow_line_%s_account_%s" % ("in", account.code),
"type": "amount",
"level": "detail",
"model": "account.move.line",
"title": account.display_name,
"periods": {},
"sequence": 1100,
}
for p in periods:
in_cash_flow_line["periods"][p["sequence"]] = {
"amount": 0.0,
"domain": "",
}
liquidity_forecast_lines.append(in_cash_flow_line)
else:
in_cash_flow_line = in_cash_flow_lines[0]
in_cash_flow_line["periods"][period["sequence"]]["amount"] += in_flows[
account
]["amount"]
in_cash_flow_line["periods"][period["sequence"]]["domain"] = [
("id", "in", in_flows[account]["move_line_ids"])
]
for account in out_flows.keys():
out_cash_flow_lines = list(
filter(
lambda d: "cash_flow_line_%s_account_%s" % ("out", account.code)
in d["code"],
liquidity_forecast_lines,
)
)
if not out_cash_flow_lines:
out_cash_flow_line = {
"code": "cash_flow_line_%s_account_%s" % ("out", account.code),
"type": "amount",
"level": "detail",
"model": "account.move.line",
"title": account.display_name,
"periods": {},
"sequence": 3100,
}
for p in periods:
out_cash_flow_line["periods"][p["sequence"]] = {
"amount": 0.0,
"domain": "",
}
liquidity_forecast_lines.append(out_cash_flow_line)
else:
out_cash_flow_line = out_cash_flow_lines[0]
out_cash_flow_line["periods"][period["sequence"]]["amount"] += out_flows[
account
]["amount"]
out_cash_flow_line["periods"][period["sequence"]]["domain"] = [
("id", "in", out_flows[account]["move_line_ids"])
]
def _prepare_cash_flow_lines_move_line(
self,
data,
liquidity_forecast_lines,
period,
periods,
):
accounts = self.env["account.account"].search(
[
("account_type", "in", ["asset_receivable", "liability_payable"]),
("company_id", "=", data["company_id"]),
]
)
self._prepare_cash_flow_lines(
data, liquidity_forecast_lines, period, periods, accounts, "date_maturity"
)
def _prepare_cash_flow_lines_payment(
self, data, liquidity_forecast_lines, period, periods
):
company_id = data.get("company_id", self.env.user.company_id.id)
company = self.env["res.company"].browse(company_id)
bank_journals = self.env["account.journal"].search(
[
("type", "=", "bank"),
("company_id", "=", company.id),
]
)
accounts = self.env["account.account"]
for bank_journal in bank_journals:
accounts += bank_journal._get_journal_inbound_outstanding_payment_accounts()
accounts += (
bank_journal._get_journal_outbound_outstanding_payment_accounts()
)
self._prepare_cash_flow_lines(
data, liquidity_forecast_lines, period, periods, accounts, "date"
)
def _prepare_cash_flow_lines_payment_planning_item(
self, data, liquidity_forecast_lines, period, periods, direction="in"
):
company_id = data.get("company_id", self.env.user.company_id.id)
domain = [
("company_id", "=", company_id),
("date", "<=", period["date_to"]),
("direction", "=", direction),
("expiry_date", ">=", fields.Date.today()),
]
if period["sequence"] > 0:
domain += [("date", ">=", period["date_from"])]
totals = self.env["account.liquidity.forecast.planning.item"].read_group(
domain=domain,
fields=["amount:sum"],
groupby=["group_id"],
)
for total in totals:
group_id = total["group_id"] and total["group_id"][0] or False
group_name = ""
group = self.env["account.liquidity.forecast.planning.group"]
if group_id:
group = self.env["account.liquidity.forecast.planning.group"].browse(
group_id
)
group_name = group and group.name or ""
title = group_name or _("Forecast Planning Items")
code = "cash_flow_line_%s_planned_item" % direction
if group:
code = "%s_%s" % (code, group_name)
cash_flow_lines = list(
filter(
lambda d: code in d["code"],
liquidity_forecast_lines,
)
)
if not cash_flow_lines:
cash_flow_line = {
"code": code,
"type": "amount",
"level": "detail",
"model": "account.liquidity.forecast.planning.item",
"title": title,
"periods": {},
}
if direction == "in":
cash_flow_line["sequence"] = 1200
else:
cash_flow_line["sequence"] = 3200
for p in periods:
cash_flow_line["periods"][p["sequence"]] = {
"amount": 0.0,
"domain": "",
}
liquidity_forecast_lines.append(cash_flow_line)
else:
cash_flow_line = cash_flow_lines[0]
sign = direction == "in" and 1 or -1
cash_flow_line["periods"][period["sequence"]]["amount"] += (
total["amount"] * sign
)
cash_flow_line["periods"][period["sequence"]]["domain"] = total["__domain"]
def _prepare_cash_flow_lines_payment_planning_item_in(
self, data, liquidity_forecast_lines, period, periods
):
self._prepare_cash_flow_lines_payment_planning_item(
data, liquidity_forecast_lines, period, periods, direction="in"
)
def _prepare_cash_flow_lines_payment_planning_item_out(
self, data, liquidity_forecast_lines, period, periods
):
self._prepare_cash_flow_lines_payment_planning_item(
data, liquidity_forecast_lines, period, periods, direction="out"
)
def _generate_periods(self, data):
date_from = fields.Date.from_string(data["date_from"])
date_to = fields.Date.from_string(data["date_to"])
period_length = data["period_length"]
periods = []
current_date = date_from
sequence = 0
while current_date <= date_to:
if period_length == "days":
name = format_date(self.env, current_date)
period_end = current_date
elif period_length == "weeks":
lang = self.env.company.partner_id.lang
lang_obj = self.env["res.lang"].search([("code", "=", lang)], limit=1)
week_start_day = int(lang_obj.week_start or "7")
days_from_week_start = (current_date.weekday() - week_start_day) % 7
week_start = current_date - datetime.timedelta(
days=days_from_week_start
)
week_end = week_start + datetime.timedelta(days=6)
period_end = week_end
current_date = week_start
week_number = week_start.isocalendar()[1]
name = (
f"Week {week_number} ({format_date(self.env, week_start)} -"
f" {format_date(self.env, week_end)})"
)
elif period_length == "months":
_x, last_day = calendar.monthrange(
current_date.year, current_date.month
)
period_end = datetime.date(
current_date.year, current_date.month, last_day
)
name = format_date(self.env, current_date, date_format="MMMM yyyy")
if sequence == 0:
name = _("Current %s") % name
period = {
"sequence": sequence,
"name": name,
"date_from": current_date,
"date_to": min(period_end, date_to),
}
periods.append(period)
sequence += 1
current_date = period["date_to"] + datetime.timedelta(days=1)
return periods
def _prepare_liquidity_forecast_lines_period(
self, data, liquidity_forecast_lines, period, periods
):
"""Extend with your own methods"""
self._prepare_cash_flow_lines_move_line(
data, liquidity_forecast_lines, period, periods
)
self._prepare_cash_flow_lines_payment(
data, liquidity_forecast_lines, period, periods
)
self._prepare_cash_flow_lines_payment_planning_item_in(
data, liquidity_forecast_lines, period, periods
)
self._prepare_cash_flow_lines_payment_planning_item_out(
data, liquidity_forecast_lines, period, periods
)
return True
def _prepare_liquidity_forecast_lines(self, data):
periods = self._generate_periods(data)
liquidity_forecast_lines = [
{
"code": "beginning_balance",
"type": "amount",
"level": "heading",
"model": "",
"title": _("BEGINNING BALANCE"),
"sequence": 10,
"periods": {},
},
{
"code": "cash_inflows",
"type": "text",
"level": "heading",
"model": "",
"title": _("CASH INFLOWS"),
"sequence": 1000,
"periods": {},
},
{
"code": "total_cash_inflows",
"type": "amount",
"level": "heading",
"model": "",
"title": _("Total Cash Inflows"),
"sequence": 2000,
"periods": {},
},
{
"code": "cash_outflows",
"type": "text",
"level": "heading",
"model": "",
"title": _("CASH OUTFLOWS"),
"sequence": 3000,
"periods": {},
},
{
"code": "total_cash_outflows",
"type": "amount",
"level": "heading",
"domain": "",
"model": "",
"title": _("Total Cash Outflows"),
"sequence": 4000,
"periods": {},
},
{
"code": "net_cash_flow",
"type": "amount",
"level": "heading",
"domain": "",
"model": "",
"title": _("NET CASH FLOW"),
"sequence": 5000,
"periods": {},
},
{
"code": "ending_balance",
"type": "amount",
"level": "heading",
"domain": "",
"model": "",
"title": _("ENDING BALANCE"),
"sequence": 6000,
"periods": {},
},
]
for period in periods:
self._prepare_liquidity_forecast_lines_period(
data, liquidity_forecast_lines, period, periods
)
for line in liquidity_forecast_lines:
self._complete_liquidity_forecast_lines(
data, liquidity_forecast_lines, line, period, periods
)
liquidity_forecast_lines = sorted(
liquidity_forecast_lines, key=lambda x: x["sequence"]
)
return liquidity_forecast_lines, periods
def _get_report_values(self, docids, data):
wizard_id = data["wizard_id"]
company = self.env["res.company"].browse(data["company_id"])
liquidity_forecast_lines, periods = self._prepare_liquidity_forecast_lines(data)
return {
"doc_ ids": [wizard_id],
"doc_model": "liquidity.forecast.report.wizard",
"docs": self.env["account.liquidity.forecast.report.wizard"].browse(
wizard_id
),
"company_name": company.display_name,
"company_currency": company.currency_id,
"currency_name": company.currency_id.name,
"date_from": data["date_from"],
"date_to": data["date_to"],
"only_posted_moves": data["only_posted_moves"],
"liquidity_forecast_lines": liquidity_forecast_lines,
"periods": periods,
}

View file

@ -0,0 +1,175 @@
# Author: Jasmin Solanki
# Copyright 2023 ForgeFlow S.L.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import _, models
from odoo.addons.report_xlsx_helper.report.report_xlsx_format import FORMATS
def copy_format(book, fmt):
properties = [f[4:] for f in dir(fmt) if f[0:4] == "set_"]
dft_fmt = book.add_format()
return book.add_format(
{
k: v
for k, v in fmt.__dict__.items()
if k in properties and dft_fmt.__dict__[k] != v
}
)
class LiquidityForecastXslx(models.AbstractModel):
_name = "report.report_liquidity_forecast_xlsx"
_description = "Liquidity Forecast Report"
_inherit = "report.report_xlsx.abstract"
def _get_report_name(self, report, data=False):
company_id = data.get("company_id", False)
report_name = _("Liquidity Forecast")
if company_id:
company = self.env["res.company"].browse(company_id)
suffix = " - {} - {}".format(company.name, company.currency_id.name)
report_name = report_name + suffix
return report_name
def excel_column_name(self, column_number):
alphabet = ""
while column_number > 0:
remainder = (column_number - 1) % 26
alphabet = chr(65 + remainder) + alphabet
column_number = (column_number - 1) // 26
return alphabet
def _size_columns(self, sheet, total_col_count, data):
for i in range(total_col_count + 1):
if i == 0:
sheet.set_column("A:A", 30)
else:
sheet.set_column(
"%(col)s:%(col)s" % ({"col": self.excel_column_name(i + 1)}), 15
)
def generate_xlsx_report(self, workbook, data, objects):
self._define_formats(workbook)
report_data = self.env[
"report.account_liquidity_forecast.liquidity_forecast"
]._get_report_values(objects.ids, data)
FORMATS["format_ws_title_center"] = workbook.add_format(
{"bold": True, "font_size": 14, "align": "center"}
)
company_id = data.get("company_id", False)
if company_id:
company = self.env["res.company"].browse(company_id)
else:
company = self.env.user.company_id
currency = report_data["company_currency"]
if currency.position == "after":
money_string = "#,##0.%s " % (
"0" * currency.decimal_places
) + "[${}]".format(currency.symbol)
elif currency.position == "before":
money_string = "[${}]".format(currency.symbol) + " #,##0.%s" % (
"0" * currency.decimal_places
)
FORMATS["money_format"] = workbook.add_format({"num_format": money_string})
FORMATS["money_format_bold"] = workbook.add_format(
{"num_format": money_string, "bold": True}
)
FORMATS["format_center_bold"].text_wrap = 1
FORMATS["format_center"].text_wrap = 1
sheet = workbook.add_worksheet(_("Liquidity Forecast"))
sheet.set_landscape()
total_col_count = len(report_data["periods"])
self._size_columns(sheet, total_col_count, data)
row_pos = 0
sheet.merge_range(
row_pos,
0,
row_pos,
4,
_("Liquidity Forecast - %(company_name)s - %(currency_name)s")
% (
{
"company_name": company.display_name,
"currency_name": report_data["currency_name"],
}
),
FORMATS["format_ws_title_center"],
)
row_pos += 1
sheet.merge_range(
row_pos,
0,
row_pos,
2,
_("Date range filter"),
FORMATS["format_theader_yellow_center"],
)
sheet.merge_range(
row_pos,
3,
row_pos,
4,
_("Target moves filter"),
FORMATS["format_theader_yellow_center"],
)
row_pos += 1
sheet.merge_range(
row_pos,
0,
row_pos,
2,
"From %s To %s" % (report_data["date_from"], report_data["date_to"]),
FORMATS["format_center"],
)
sheet.merge_range(
row_pos,
3,
row_pos,
4,
"All posted entries" if report_data["only_posted_moves"] else "All entries",
FORMATS["format_center"],
)
row_pos += 1
sheet.write(
row_pos,
0,
"Items",
FORMATS["format_center_bold"],
)
col = 1
for period in report_data["periods"]:
sheet.write(
row_pos,
col,
period["name"],
FORMATS["format_center_bold"],
)
col += 1
row_pos += 1
for line in report_data["liquidity_forecast_lines"]:
sheet.write(
row_pos,
0,
line["title"],
(
FORMATS["format_left_bold"]
if line.get("level") == "heading"
else FORMATS["format_left"]
),
)
col = 1
for period in line["periods"].values():
sheet.write(
row_pos,
col,
period["amount"],
(
FORMATS["money_format_bold"]
if line.get("level") == "heading"
else FORMATS["money_format"]
),
)
col += 1
row_pos += 1

View file

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<template id="account_liquidity_forecast.internal_layout">
<div class="article o_account_financial_reports_page">
<link
href="/account_liquidity_forecast/static/src/css/report.css"
rel="stylesheet"
/>
<t t-out="0" />
</div>
<div class="footer">
<div class="row">
<div class="col-6 custom_footer">
<span
t-esc="context_timestamp(datetime.datetime.now()).strftime('%Y-%m-%d %H:%M')"
/>
</div>
<div class="col-6 text-right custom_footer">
<ul class="list-inline">
<li class="list-inline-item">
<span class="page" />
</li>
<li class="list-inline-item">/</li>
<li class="list-inline-item">
<span class="topage" />
</li>
</ul>
</div>
</div>
</div>
</template>
</odoo>

View file

@ -0,0 +1,171 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<template id="liquidity_forecast">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="o">
<t t-call="account_liquidity_forecast.internal_layout">
<t
t-call="account_liquidity_forecast.report_liquidity_forecast_base"
/>
</t>
</t>
</t>
</template>
<template id="report_liquidity_forecast_base">
<!-- Defines global variables used by internal layout -->
<t t-set="title">
Liquidity Forecast -
<t t-out="company_name" />
-
<t t-out="currency_name" />
</t>
<t t-set="company_name" t-value="Company_Name" />
<t class="page">
<div class="row">
<h4
class="mt0"
t-esc="title or 'Odoo Report'"
style="text-align: center;"
/>
</div>
<!-- Display filters -->
<t t-call="account_liquidity_forecast.report_liquidity_forecast_filters" />
<div class="act_as_table list_table" style="margin-top: 10px;" />
<!-- Display lines -->
<div class="act_as_table data_table" style="width: 100%;">
<!-- Display header -->
<t
t-call="account_liquidity_forecast.report_liquidity_forecast_lines_header"
/>
<!-- Display lines -->
<t t-foreach="liquidity_forecast_lines" t-as="line">
<t t-set="style" t-value="'font-size:12px;'" />
<t
t-call="account_liquidity_forecast.report_liquidity_forecast_line"
/>
</t>
</div>
</t>
</template>
<template id="account_liquidity_forecast.report_liquidity_forecast_filters">
<div class="act_as_table data_table" style="width: 100%;">
<div class="act_as_row labels">
<div class="act_as_cell">Date range filter</div>
<div class="act_as_cell">Target moves filter</div>
</div>
<div class="act_as_row">
<div class="act_as_cell">
From:
<span t-esc="date_from" t-options="{'widget': 'date'}" />
To
<span t-esc="date_to" t-options="{'widget': 'date'}" />
</div>
<div class="act_as_cell">
<t t-if="only_posted_moves">All posted entries</t>
<t t-if="not only_posted_moves">All entries</t>
</div>
</div>
</div>
</template>
<template id="account_liquidity_forecast.report_liquidity_forecast_lines_header">
<!-- Calculate column width based on number of periods -->
<t t-set="period_count" t-value="len(periods)" />
<t t-set="items_width" t-value="15" />
<t t-set="period_width" t-value="(100 - items_width) / period_count" />
<!-- Display table headers for lines -->
<div class="act_as_thead">
<div class="act_as_row labels">
<!--## Items-->
<div
class="act_as_cell"
t-attf-style="width: #{items_width}%;"
>Items</div>
<t t-foreach="periods" t-as="period">
<!--## Periods-->
<div class="act_as_cell" t-attf-style="width: #{period_width}%;">
<t t-esc="period['name']" />
</div>
</t>
</div>
</div>
</template>
<template id="account_liquidity_forecast.report_liquidity_forecast_line">
<!-- Calculate column width based on number of periods -->
<t t-set="period_count" t-value="len(periods)" />
<t t-set="items_width" t-value="15" />
<t t-set="period_width" t-value="(100 - items_width) / period_count" />
<!-- # line -->
<t
t-set="line_class"
t-value="'act_as_row labels' if line['level'] == 'heading' else 'act_as_row'"
/>
<div t-att-class="line_class">
<!--## Items-->
<div
class="act_as_cell left"
t-attf-style="#{style} width: #{items_width}%;"
>
<t t-esc="line['title']" />
</div>
<!--## Period-->
<t t-foreach="periods" t-as="period">
<t t-if="line['type'] == 'amount'">
<div
class="act_as_cell right"
t-attf-style="#{style} width: #{period_width}%;"
>
<t t-if="line['periods'][period['sequence']]['domain']">
<t
t-set="domain"
t-value="line['periods'][period['sequence']]['domain']"
/>
<span t-att-domain="domain" t-att-res-model="line['model']">
<t
t-esc="line['periods'][period['sequence']]['amount']"
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"
/>
</span>
</t>
<t t-if="not line['periods'][period['sequence']]['domain']">
<t
t-esc="line['periods'][period['sequence']]['amount']"
t-options="{'widget': 'monetary', 'display_currency': res_company.currency_id}"
/>
</t>
</div>
</t>
<t t-if="line['type'] == 'text'">
<div
class="act_as_cell labels"
t-attf-style="#{style} width: #{period_width}%;"
/>
</t>
</t>
</div>
</template>
<template id="account_liquidity_forecast.report_liquidity_forecast_footer">
<!-- Calculate column width based on number of periods -->
<t t-set="period_count" t-value="len(periods)" />
<t t-set="items_width" t-value="15" />
<t t-set="period_width" t-value="(100 - items_width) / period_count" />
<!-- Display totals -->
<div class="act_as_table list_table" style="width: 100%;">
<div class="act_as_row labels" style="font-weight: bold;">
<!--## Items-->
<div class="act_as_cell amount" t-attf-style="width: #{items_width}%;">
<span t-esc="end_value" />
</div>
<!--## Period-->
<div class="act_as_cell amount" t-attf-style="width: #{period_width}%;">
<span t-esc="period" />
</div>
</div>
</div>
</template>
</odoo>

View file

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<!-- PDF REPORTS : paperformat -->
<record id="report_qweb_paperformat" model="report.paperformat">
<field name="name">Liquidity Forecast report qweb paperformat</field>
<field name="default" eval="True" />
<field name="format">custom</field>
<field name="page_height">297</field>
<field name="page_width">210</field>
<field name="orientation">Landscape</field>
<field name="margin_top">12</field>
<field name="margin_bottom">8</field>
<field name="margin_left">5</field>
<field name="margin_right">5</field>
<field name="header_line" eval="False" />
<field name="header_spacing">10</field>
<field name="dpi">110</field>
</record>
<record id="action_report_liquidity_forecast_qweb" model="ir.actions.report">
<field name="name">Liquidity Forecast</field>
<field name="model">liquidity.forecast.report.wizard</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">account_liquidity_forecast.liquidity_forecast</field>
<field name="report_file">account_liquidity_forecast.liquidity_forecast</field>
<field name="paperformat_id" ref="report_qweb_paperformat" />
</record>
<record id="action_report_liquidity_forecast_html" model="ir.actions.report">
<field name="name">Liquidity Forecast</field>
<field name="model">liquidity.forecast.report.wizard</field>
<field name="report_type">qweb-html</field>
<field name="report_name">account_liquidity_forecast.liquidity_forecast</field>
<field name="report_file">account_liquidity_forecast.liquidity_forecast</field>
</record>
<record id="report_liquidity_forecast_xlsx" model="ir.actions.report">
<field name="name">Liquidity Forecast</field>
<field name="model">account.liquidity.forecast.report.wizard</field>
<field name="report_name">report_liquidity_forecast_xlsx</field>
<field name="report_type">xlsx</field>
<field name="report_file">report_liquidity_forecast</field>
</record>
</odoo>

View file

@ -0,0 +1,5 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_liquidity_forecast_planning_group_user,access_liquidity_forecast_planning_group_user,model_account_liquidity_forecast_planning_group,account.group_account_user,1,0,0,0
access_liquidity_forecast_planning_group_manager,access_liquidity_forecast_planning_group_manager,model_account_liquidity_forecast_planning_group,account.group_account_manager,1,1,1,1
access_liquidity_forecast_planning_item,access_liquidity_forecast_planning_item,model_account_liquidity_forecast_planning_item,account.group_account_user,1,1,1,1
access_liquidity_forecast_report_wizard,access_liquidity_forecast_report_wizard,model_account_liquidity_forecast_report_wizard,account.group_account_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_liquidity_forecast_planning_group_user access_liquidity_forecast_planning_group_user model_account_liquidity_forecast_planning_group account.group_account_user 1 0 0 0
3 access_liquidity_forecast_planning_group_manager access_liquidity_forecast_planning_group_manager model_account_liquidity_forecast_planning_group account.group_account_manager 1 1 1 1
4 access_liquidity_forecast_planning_item access_liquidity_forecast_planning_item model_account_liquidity_forecast_planning_item account.group_account_user 1 1 1 1
5 access_liquidity_forecast_report_wizard access_liquidity_forecast_report_wizard model_account_liquidity_forecast_report_wizard account.group_account_user 1 1 1 1

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record id="account_liquidity_forecast_planning_item_comp_rule" model="ir.rule">
<field name="name">Liquidity Foreast Planning Item</field>
<field name="model_id" ref="model_account_liquidity_forecast_planning_item" />
<field
name="domain_force"
>['|',('company_id','=',False),('company_id', 'in', company_ids)]</field>
</record>
</odoo>

View file

@ -0,0 +1,444 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>README.rst</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic, pre.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document">
<a class="reference external image-reference" href="https://odoo-community.org/get-involved?utm_source=readme">
<img alt="Odoo Community Association" src="https://odoo-community.org/readme-banner-image" />
</a>
<div class="section" id="account-liquidity-forecast">
<h1>Account Liquidity Forecast</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:535f9c4100abae92d059f6746ff9d86907152187fa64c7aadb60263f4397ead0
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" 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 image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/license-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/account-financial-reporting/tree/16.0/account_liquidity_forecast"><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 image-reference" href="https://translation.odoo-community.org/projects/account-financial-reporting-16-0/account-financial-reporting-16-0-account_liquidity_forecast"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/account-financial-reporting&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module provides a Liquidity Forecast Report based on user-defined parameters.</p>
<p>To launch the report wizard, navigate to Accounting/Invoicing &gt; Reporting &gt; Liquidity Forecast.
A configuration wizard will open, allowing you to define the parameters for the report.</p>
<p>The report begins from the current date and includes the following configurable options:</p>
<ul class="simple">
<li>Date To: Specifies the end date for the report. Data will be collected up to this date.</li>
<li>Period Length (Month, Week, Day): Defines the granularity of the time intervals displayed in the report.</li>
<li>Target Moves: Allows you to include or exclude draft journal entries in the report.</li>
</ul>
<p>You can also add extra planning items representing expected cash inflows or outflows on specific dates.
To do this, go to Accounting/Invoicing &gt; Accounting &gt; Liquidity Forecast Planning Items.</p>
<p>This tool helps provide a clear and customizable view of your companys future liquidity position.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-1">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-2">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-3">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-4">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-5">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h2><a class="toc-backref" href="#toc-entry-1">Bug Tracker</a></h2>
<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.
If you spotted it first, help us to smash it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/account-financial-reporting/issues/new?body=module:%20account_liquidity_forecast%0Aversion:%2016.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>
</div>
<div class="section" id="credits">
<h2><a class="toc-backref" href="#toc-entry-2">Credits</a></h2>
<div class="section" id="authors">
<h3><a class="toc-backref" href="#toc-entry-3">Authors</a></h3>
<ul class="simple">
<li>ForgeFlow</li>
</ul>
</div>
<div class="section" id="contributors">
<h3><a class="toc-backref" href="#toc-entry-4">Contributors</a></h3>
<ul class="simple">
<li><a class="reference external" href="https://www.forgeflow.com">ForgeFlow</a>:<ul>
<li>Jordi Ballester</li>
<li>Jasmin Solanki</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h3><a class="toc-backref" href="#toc-entry-5">Maintainers</a></h3>
<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>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/account-financial-reporting/tree/16.0/account_liquidity_forecast">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>
</div>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,116 @@
a {
color: #00337b;
}
.act_as_table {
display: table !important;
background-color: white;
}
.act_as_row {
display: table-row !important;
page-break-inside: avoid;
}
.act_as_cell {
display: table-cell !important;
page-break-inside: avoid;
}
.act_as_thead {
display: table-header-group !important;
}
.act_as_tbody {
display: table-row-group !important;
}
.list_table,
.data_table,
.totals_table {
width: 100% !important;
}
.act_as_row.labels {
background-color: #f0f0f0 !important;
}
.list_table,
.data_table,
.totals_table,
.list_table .act_as_row {
border-left: 0px;
border-right: 0px;
text-align: center;
font-size: 10px;
padding-right: 3px;
padding-left: 3px;
padding-top: 2px;
padding-bottom: 2px;
border-collapse: collapse;
}
.totals_table {
font-weight: bold;
text-align: center;
}
.list_table .act_as_row.labels,
.list_table .act_as_row.initial_balance,
.list_table .act_as_row.lines {
border-color: grey !important;
border-bottom: 1px solid lightGrey !important;
}
.data_table .act_as_cell {
border: 1px solid lightGrey;
text-align: center;
}
.data_table .act_as_cell,
.list_table .act_as_cell,
.totals_table .act_as_cell {
word-wrap: break-word;
}
.data_table .act_as_row.labels,
.totals_table .act_as_row.labels {
font-weight: bold;
}
.initial_balance .act_as_cell {
font-style: italic;
}
.account_title {
font-size: 11px;
font-weight: bold;
}
.account_title.labels {
background-color: #f0f0f0 !important;
}
.act_as_cell.amount {
word-wrap: normal;
text-align: right;
}
.act_as_cell.left {
text-align: left;
}
.act_as_cell.right {
text-align: right;
}
/*.list_table .act_as_cell {*/
/* border-right:1px solid lightGrey; uncomment to active column lines */
/*}*/
.list_table .act_as_cell.first_column {
padding-left: 0px;
/* border-left:1px solid lightGrey; uncomment to active column lines */
}
.overflow_ellipsis {
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
.custom_footer {
font-size: 7px !important;
}
.page_break {
page-break-inside: avoid;
}
.button_row {
padding-bottom: 10px;
}
.o_account_financial_reports_page {
padding-top: 10px;
width: 90%;
margin-right: auto;
margin-left: auto;
font-family: Helvetica, Arial;
}

View file

@ -0,0 +1,73 @@
/** @odoo-module */
import {useComponent, useEffect} from "@odoo/owl";
function toTitleCase(str) {
return str
.replaceAll(".", " ")
.replace(
/\w\S*/g,
(txt) => `${txt.charAt(0).toUpperCase()}${txt.substr(1).toLowerCase()}`
);
}
function enrich(component, targetElement, selector, isIFrame = false) {
let doc = window.document;
let contentDocument = targetElement;
// If we are in an iframe, we need to take the right document
// both for the element and the doc
if (isIFrame) {
contentDocument = targetElement.contentDocument;
doc = contentDocument;
}
// If there are selector, we may have multiple blocks of code to enrich
const targets = [];
if (selector) {
targets.push(...contentDocument.querySelectorAll(selector));
} else {
targets.push(contentDocument);
}
// Search the elements with the selector, update them and bind an action.
for (const currentTarget of targets) {
const elementsToWrap = currentTarget.querySelectorAll("[res-model][domain]");
for (const element of elementsToWrap.values()) {
const wrapper = doc.createElement("a");
wrapper.setAttribute("href", "#");
wrapper.addEventListener("click", (ev) => {
ev.preventDefault();
component.env.services.action.doAction({
type: "ir.actions.act_window",
res_model: element.getAttribute("res-model"),
domain: element.getAttribute("domain"),
name: toTitleCase(element.getAttribute("res-model")),
views: [
[false, "list"],
[false, "form"],
],
});
});
element.parentNode.insertBefore(wrapper, element);
wrapper.appendChild(element);
}
}
}
export function useEnrichWithActionLinks(ref, selector = null) {
const comp = useComponent();
useEffect(
(element) => {
// If we get an iframe, we need to wait until everything is loaded
if (element.matches("iframe")) {
element.addEventListener("load", () =>
enrich(comp, element, selector, true)
);
} else {
enrich(comp, element, selector);
}
},
() => [ref.el]
);
}

View file

@ -0,0 +1,39 @@
/** @odoo-module **/
import {ReportAction} from "@web/webclient/actions/reports/report_action";
import {patch} from "web.utils";
import {useEnrichWithActionLinks} from "./report.esm";
const MODULE_NAME = "account_liquidity_forecast";
patch(ReportAction.prototype, "account_liquidity_forecast.ReportAction", {
setup() {
this._super.apply(this, arguments);
this.isAccountFinancialReport = this.props.report_name.startsWith(
`${MODULE_NAME}.`
);
useEnrichWithActionLinks(this.iframe);
},
export() {
this.action.doAction({
type: "ir.actions.report",
report_type: "xlsx",
report_name: this._get_xlsx_name(this.props.report_name),
report_file: this._get_xlsx_name(this.props.report_file),
data: this.props.data || {},
context: this.props.context || {},
display_name: this.title,
});
},
/**
* @param {String} str
* @returns {String}
*/
_get_xlsx_name(str) {
if (!_.isString(str)) {
return str;
}
return `report_liquidity_forecast_xlsx`;
},
});

View file

@ -0,0 +1 @@
from . import test_liquidity_forecast

View file

@ -0,0 +1,190 @@
from datetime import date, timedelta
from odoo.tests.common import TransactionCase
class TestLiquidityForecastReport(TransactionCase):
def setUp(self):
super().setUp()
self.report = self.env["report.account_liquidity_forecast.liquidity_forecast"]
self.company = self.env.user.company_id
self.today = date.today()
self.data = {
"company_id": self.company.id,
"date_from": (self.today - timedelta(days=30)).strftime("%Y-%m-%d"),
"date_to": self.today.strftime("%Y-%m-%d"),
"period_length": "days",
"only_posted_moves": True,
}
def test_generate_periods_days(self):
"""Test generation of daily periods with proper sequence and naming."""
# Test with a 5-day range
start_date = date(2024, 1, 1)
end_date = date(2024, 1, 5)
data = {
**self.data,
"date_from": start_date.strftime("%Y-%m-%d"),
"date_to": end_date.strftime("%Y-%m-%d"),
"period_length": "days",
}
periods = self.report._generate_periods(data)
self.assertEqual(len(periods), 5, "Should generate 5 daily periods")
# Check sequences are continuous starting from 0
sequences = [p["sequence"] for p in periods]
self.assertEqual(
sequences, [0, 1, 2, 3, 4], "Sequences should be continuous from 0"
)
def test_generate_periods_months(self):
"""Test generation of monthly periods with proper month boundaries."""
# Test across multiple months
start_date = date(2024, 1, 15)
end_date = date(2024, 3, 10)
data = {
**self.data,
"date_from": start_date.strftime("%Y-%m-%d"),
"date_to": end_date.strftime("%Y-%m-%d"),
"period_length": "months",
}
periods = self.report._generate_periods(data)
self.assertEqual(len(periods), 3, "Should generate 3 monthly periods")
self.assertIn(
"Current", periods[0]["name"], "First period should contain 'Current'"
)
self.assertEqual(periods[0]["date_from"], date(2024, 1, 15))
self.assertEqual(periods[0]["date_to"], date(2024, 1, 31))
self.assertEqual(periods[1]["date_from"], date(2024, 2, 1))
self.assertEqual(periods[1]["date_to"], date(2024, 2, 29))
self.assertEqual(periods[2]["date_from"], date(2024, 3, 1))
self.assertEqual(periods[2]["date_to"], date(2024, 3, 10))
def test_generate_periods_leap_year_february(self):
"""Test monthly periods handle leap year February correctly."""
# Test February in leap year
start_date = date(2024, 2, 1)
end_date = date(2024, 2, 29)
data = {
**self.data,
"date_from": start_date.strftime("%Y-%m-%d"),
"date_to": end_date.strftime("%Y-%m-%d"),
"period_length": "months",
}
periods = self.report._generate_periods(data)
self.assertEqual(len(periods), 1)
self.assertEqual(periods[0]["date_from"], date(2024, 2, 1))
self.assertEqual(periods[0]["date_to"], date(2024, 2, 29))
def test_generate_periods_non_leap_year_february(self):
"""Test monthly periods handle non-leap year February correctly."""
# Test February in non-leap year
start_date = date(2023, 2, 1)
end_date = date(2023, 2, 28)
data = {
**self.data,
"date_from": start_date.strftime("%Y-%m-%d"),
"date_to": end_date.strftime("%Y-%m-%d"),
"period_length": "months",
}
periods = self.report._generate_periods(data)
self.assertEqual(len(periods), 1)
self.assertEqual(periods[0]["date_from"], date(2023, 2, 1))
self.assertEqual(periods[0]["date_to"], date(2023, 2, 28))
def test_generate_periods_year_boundary(self):
"""Test periods generation across year boundaries."""
start_date = date(2023, 12, 15)
end_date = date(2024, 1, 15)
data = {
**self.data,
"date_from": start_date.strftime("%Y-%m-%d"),
"date_to": end_date.strftime("%Y-%m-%d"),
"period_length": "months",
}
periods = self.report._generate_periods(data)
self.assertEqual(
len(periods), 2, "Should generate 2 periods across year boundary"
)
# Check year boundary is handled correctly
self.assertEqual(periods[0]["date_from"].year, 2023)
self.assertEqual(periods[1]["date_from"].year, 2024)
def test_complete_beginning_balance_initial(self):
"""Test beginning balance computed and set as float for initial empty periods."""
periods = self.report._generate_periods(self.data)
period = periods[0]
period_seq = period["sequence"]
liquidity_forecast_lines = [
{"code": "beginning_balance", "periods": {period_seq: {}}}
]
self.report._complete_beginning_balance(
self.data, liquidity_forecast_lines, liquidity_forecast_lines[0], period
)
amount = liquidity_forecast_lines[0]["periods"][period_seq].get("amount")
self.assertIsInstance(
amount, float, "Beginning balance amount should be a float"
)
def test_complete_net_cash_flow(self):
"""Test net cash flow sums multiple cash flow lines correctly."""
periods = self.report._generate_periods(self.data)
period = periods[0]
period_seq = period["sequence"]
liquidity_forecast_lines = [
{
"code": "cash_flow_line_in_account_101",
"periods": {period_seq: {"amount": 200.0}},
},
{
"code": "cash_flow_line_out_account_202",
"periods": {period_seq: {"amount": -50.0}},
},
{"code": "net_cash_flow", "periods": {period_seq: {}}},
]
self.report._complete_net_cash_flow(
self.data, liquidity_forecast_lines, liquidity_forecast_lines[2], period
)
amount = liquidity_forecast_lines[2]["periods"][period_seq].get("amount")
self.assertEqual(
amount, 150.0, "Net cash flow should be sum of cash in and cash out"
)
def test_handle_zero_and_negative_amounts(self):
"""Test proper handling of zero and negative cash flows."""
periods = self.report._generate_periods(self.data)
period = periods[0]
period_seq = period["sequence"]
liquidity_forecast_lines = [
{
"code": "cash_flow_line_in_account_101",
"periods": {period_seq: {"amount": 0.0}},
},
{
"code": "cash_flow_line_out_account_202",
"periods": {period_seq: {"amount": -100.0}},
},
{"code": "net_cash_flow", "periods": {period_seq: {}}},
]
self.report._complete_net_cash_flow(
self.data, liquidity_forecast_lines, liquidity_forecast_lines[2], period
)
amount = liquidity_forecast_lines[2]["periods"][period_seq].get("amount")
self.assertEqual(
amount,
-100.0,
"Net cash flow should correctly handle zero and negative amounts",
)

View file

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="account_liquidity_forecast_planning_group_view_form" model="ir.ui.view">
<field name="name">Liquidity Forecast Planning Group Form</field>
<field name="model">account.liquidity.forecast.planning.group</field>
<field name="arch" type="xml">
<form>
<sheet string="Liquidity Forecast Planning Group">
<label for="name" />
<h1>
<field name="name" />
</h1>
<group>
<group name="company">
<field
name="company_id"
groups="base.group_multi_company"
options="{'no_create': True}"
/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="account_liquidity_forecast_planning_group_view_tree" model="ir.ui.view">
<field name="name">Liquidity Forecast Planning Group List</field>
<field name="model">account.liquidity.forecast.planning.group</field>
<field name="arch" type="xml">
<tree editable="top">
<field name="name" />
<field name="company_id" groups="base.group_multi_company" />
</tree>
</field>
</record>
<record
id='account_liquidity_forecast_planning_group_action'
model='ir.actions.act_window'
>
<field name="name">Liquidity Forecast Planning Groups</field>
<field name="res_model">account.liquidity.forecast.planning.group</field>
<field name="view_mode">tree,form</field>
</record>
</odoo>

View file

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="account_liquidity_forecast_planning_item_view_form" model="ir.ui.view">
<field name="name">Liquidity Forecast Planning Item Form</field>
<field name="model">account.liquidity.forecast.planning.item</field>
<field name="arch" type="xml">
<form>
<sheet string="Liquidity Forecast Planning Item">
<label for="name" />
<h1>
<field name="name" />
</h1>
<group>
<group name="company">
<field
name="company_id"
groups="base.group_multi_company"
options="{'no_create': True}"
/>
<field
name="company_currency_id"
groups="base.group_multi_currency"
/>
</group>
<group name="direction">
<field name="direction" />
</group>
<group name="dates">
<field name="date" />
<field name="expiry_date" />
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="account_liquidity_forecast_planning_item_view_tree" model="ir.ui.view">
<field name="name">Liquidity Forecast Planning Item List</field>
<field name="model">account.liquidity.forecast.planning.item</field>
<field name="arch" type="xml">
<tree editable="top">
<field name="name" />
<field name="group_id" />
<field name="direction" />
<field name="date" />
<field name="amount" />
<field name="expiry_date" />
<field name="company_id" groups="base.group_multi_company" />
</tree>
</field>
</record>
<record
id='account_liquidity_forecast_planning_item_action'
model='ir.actions.act_window'
>
<field name="name">Liquidity Forecast Planning Groups</field>
<field name="res_model">account.liquidity.forecast.planning.item</field>
<field name="view_mode">tree,form</field>
</record>
</odoo>

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<template id="report_liquidity_forecast">
<div class="o_account_liquidity_forecast_page">
<t t-call="account_liquidity_forecast.report_buttons" />
<t t-call="account_liquidity_forecast.report_liquidity_forecast_base" />
</div>
</template>
</odoo>

View file

@ -0,0 +1 @@
from . import account_liquidity_forecast_wizard

View file

@ -0,0 +1,81 @@
# Copyright 2023 ForgeFlow, S.L.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import fields, models
class LiquidityForecastReportWizard(models.TransientModel):
_name = "account.liquidity.forecast.report.wizard"
_description = "Liquidity Forecast Report Wizard"
company_id = fields.Many2one(
comodel_name="res.company",
default=lambda self: self.env.company.id,
required=False,
string="Company",
)
period_length = fields.Selection(
selection=[
("days", "Days"),
("weeks", "Weeks"),
("months", "Months"),
],
default="days",
required=True,
)
date_to = fields.Date(required=True, default=fields.Date.today)
target_move = fields.Selection(
[("posted", "All Posted Entries"), ("all", "All Entries")],
string="Target Moves",
required=True,
default="posted",
)
def button_export_html(self):
self.ensure_one()
report_type = "qweb-html"
return self._export(report_type)
def button_export_pdf(self):
self.ensure_one()
report_type = "qweb-pdf"
return self._export(report_type)
def button_export_xlsx(self):
self.ensure_one()
report_type = "xlsx"
return self._export(report_type)
def _export(self, report_type):
"""Default export is PDF."""
return self._print_report(report_type)
def _print_report(self, report_type):
self.ensure_one()
data = self._prepare_report_liquidity_forecast()
if report_type == "xlsx":
report_name = "report_liquidity_forecast_xlsx"
else:
report_name = "account_liquidity_forecast.liquidity_forecast"
return (
self.env["ir.actions.report"]
.search(
[("report_name", "=", report_name), ("report_type", "=", report_type)],
limit=1,
)
.report_action(self, data=data)
)
def _prepare_report_liquidity_forecast(self):
self.ensure_one()
return {
"wizard_id": self.id,
"date_from": fields.Date.today(),
"date_to": self.date_to,
"only_posted_moves": self.target_move == "posted",
"company_id": self.company_id.id,
"res_company": self.company_id,
"period_length": self.period_length,
"liquidity_forecast_report_lang": self.env.lang,
}

View file

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="liquidity_forecast_wizard" model="ir.ui.view">
<field name="name">Liquidity Forecast</field>
<field name="model">account.liquidity.forecast.report.wizard</field>
<field name="arch" type="xml">
<form>
<group name="main_info">
<field
name="company_id"
options="{'no_create': True}"
groups="base.group_multi_company"
/>
</group>
<div>
<group name="filters">
<group name="date_range">
<field name="date_to" />
<field name="period_length" />
</group>
<group name="other_filters">
<field name="target_move" widget="radio" />
</group>
</group>
</div>
<footer>
<div>
<button
name="button_export_html"
string="View"
type="object"
default_focus="1"
class="oe_highlight"
/>
or
<button
name="button_export_pdf"
string="Export PDF"
type="object"
/>
or
<button
name="button_export_xlsx"
string="Export XLSX"
type="object"
/>
or
<button string="Cancel" class="oe_link" special="cancel" />
</div>
</footer>
</form>
</field>
</record>
<record id="action_liquidity_forecast_wizard" model="ir.actions.act_window">
<field name="name">Liquidity Forecast</field>
<field name="res_model">account.liquidity.forecast.report.wizard</field>
<field name="view_mode">form</field>
<field name="view_id" ref="liquidity_forecast_wizard" />
<field name="target">new</field>
</record>
</odoo>

View file

@ -0,0 +1,32 @@
# Architecture
```mermaid
flowchart TD
U[Users] -->|HTTP| V[Views and QWeb Templates]
V --> C[Controllers]
V --> W[Wizards Transient Models]
C --> M[Models and ORM]
W --> M
M --> R[Reports]
DX[Data XML] --> M
S[Security ACLs and Groups] -. enforces .-> M
subgraph Account_liquidity_forecast Module - account_liquidity_forecast
direction LR
M:::layer
W:::layer
C:::layer
V:::layer
R:::layer
S:::layer
DX:::layer
end
classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px
```
Notes
- Views include tree/form/kanban templates and report templates.
- Controllers provide website/portal routes when present.
- Wizards are UI flows implemented with `models.TransientModel`.
- Data XML loads data/demo records; Security defines groups and access.

View file

@ -0,0 +1,3 @@
# Configuration
Refer to Odoo settings for account_liquidity_forecast. Configure related models, access rights, and options as needed.

View file

@ -0,0 +1,3 @@
# Controllers
This module does not define custom HTTP controllers.

View file

@ -0,0 +1,7 @@
# Dependencies
This addon depends on:
- [account](../../odoo-bringout-oca-ocb-account)
- [report_xlsx](../../odoo-bringout-oca-reporting-engine-report_xlsx)
- [report_xlsx_helper](../../odoo-bringout-oca-reporting-engine-report_xlsx_helper)

View file

@ -0,0 +1,4 @@
# FAQ
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
- Q: How to enable? A: Start server with --addon account_liquidity_forecast or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-account-financial-reporting-account_liquidity_forecast"
# or
uv pip install odoo-bringout-oca-account-financial-reporting-account_liquidity_forecast"
```

View file

@ -0,0 +1,15 @@
# Models
Detected core models and extensions in account_liquidity_forecast.
```mermaid
classDiagram
class account_liquidity_forecast_planning_group
class account_liquidity_forecast_planning_item
class account_account
class ir_actions_report
```
Notes
- Classes show model technical names; fields omitted for brevity.
- Items listed under _inherit are extensions of existing models.

View file

@ -0,0 +1,6 @@
# Overview
Packaged Odoo addon: account_liquidity_forecast. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon account_liquidity_forecast
- License: LGPL-3

View file

@ -0,0 +1,30 @@
# Reports
Report definitions and templates in account_liquidity_forecast.
```mermaid
classDiagram
class LiquidityForecastReport
AbstractModel <|-- LiquidityForecastReport
class LiquidityForecastXslx
AbstractModel <|-- LiquidityForecastXslx
```
## Available Reports
No named reports found in XML files.
## Report Files
- **__init__.py** (Python logic)
- **liquidity_forecast.py** (Python logic)
- **liquidity_forecast_xlsx.py** (Python logic)
- **layouts.xml** (XML template/definition)
- **liquidity_forecast.xml** (XML template/definition)
## Notes
- Named reports above are accessible through Odoo's reporting menu
- Python files define report logic and data processing
- XML files contain report templates, definitions, and formatting
- Reports are integrated with Odoo's printing and email systems

View file

@ -0,0 +1,41 @@
# Security
Access control and security definitions in account_liquidity_forecast.
## Access Control Lists (ACLs)
Model access permissions defined in:
- **[ir.model.access.csv](../account_liquidity_forecast/security/ir.model.access.csv)**
- 4 model access rules
## Record Rules
Row-level security rules defined in:
## Security Groups & Configuration
Security groups and permissions defined in:
- **[security.xml](../account_liquidity_forecast/security/security.xml)**
```mermaid
graph TB
subgraph "Security Layers"
A[Users] --> B[Groups]
B --> C[Access Control Lists]
C --> D[Models]
B --> E[Record Rules]
E --> F[Individual Records]
end
```
Security files overview:
- **[ir.model.access.csv](../account_liquidity_forecast/security/ir.model.access.csv)**
- Model access permissions (CRUD rights)
- **[security.xml](../account_liquidity_forecast/security/security.xml)**
- Security groups, categories, and XML-based rules
Notes
- Access Control Lists define which groups can access which models
- Record Rules provide row-level security (filter records by user/group)
- Security groups organize users and define permission sets
- All security is enforced at the ORM level by Odoo

View file

@ -0,0 +1,5 @@
# Troubleshooting
- Ensure Python and Odoo environment matches repo guidance.
- Check database connectivity and logs if startup fails.
- Validate that dependent addons listed in DEPENDENCIES.md are installed.

View file

@ -0,0 +1,7 @@
# Usage
Start Odoo including this addon (from repo root):
```bash
python3 scripts/nix_odoo_web_server.py --db-name mydb --addon account_liquidity_forecast
```

View file

@ -0,0 +1,3 @@
# Wizards
This module does not include UI wizards.

View file

@ -0,0 +1,44 @@
[project]
name = "odoo-bringout-oca-account-financial-reporting-account_liquidity_forecast"
version = "16.0.0"
description = "Account Liquidity Forecast - Account Liquidity Forecast"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-account>=16.0.0",
"odoo-bringout-oca-account-financial-reporting-report_xlsx>=16.0.0",
"odoo-bringout-oca-account-financial-reporting-report_xlsx_helper>=16.0.0",
"requests>=2.25.1"
]
readme = "README.md"
requires-python = ">= 3.11"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]
[project.urls]
homepage = "https://github.com/bringout/0"
repository = "https://github.com/bringout/0"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["account_liquidity_forecast"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]