From 79e1ad759a4c485db00a906222a207bd78b64524 Mon Sep 17 00:00:00 2001 From: Flectra Community Bot Date: Sun, 19 Dec 2021 03:13:27 +0000 Subject: [PATCH 1/5] Automatic Update form OCA2FC Migrator --- .gitlab-ci.yml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1e6cec5..0c1e063 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -25,7 +25,9 @@ test_all_modules: - apt-get install -y p7zip-full - apt-get install -y expect-dev - su - flectra -c "mkdir ~/others" + - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-analytic.git ~/others/account-analytic" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-closing.git ~/others/account-closing" + - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-financial-tools.git ~/others/account-financial-tools" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-invoicing.git ~/others/account-invoicing" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-payment.git ~/others/account-payment" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/bank-payment.git ~/others/bank-payment" @@ -62,7 +64,7 @@ test_all_modules: - mv ${CI_PROJECT_DIR}/ci_data/filestore /opt/flectra/.local/share/filestore/test_all - chown -R flectra.flectra /opt/flectra/.local/share/filestore/test_all - su - flectra -c "/opt/flectra/flectra-bin - --addons-path ${CI_PROJECT_DIR},~/others/account-closing,~/others/account-invoicing,~/others/account-payment,~/others/bank-payment,~/others/brand,~/others/community-data-files,~/others/connector,~/others/edi,~/others/partner-contact,~/others/product-attribute,~/others/queue,~/others/report-print-send,~/others/reporting-engine,~/others/rest-framework,~/others/sale-workflow,~/others/server-auth,~/others/server-env,~/others/server-tools,~/others/server-ux,~/others/social,~/others/stock-logistics-transport,~/others/stock-logistics-warehouse,~/others/stock-logistics-workflow,~/others/storage,~/others/web,~/others/wms + --addons-path ${CI_PROJECT_DIR},~/others/account-analytic,~/others/account-closing,~/others/account-financial-tools,~/others/account-invoicing,~/others/account-payment,~/others/bank-payment,~/others/brand,~/others/community-data-files,~/others/connector,~/others/edi,~/others/partner-contact,~/others/product-attribute,~/others/queue,~/others/report-print-send,~/others/reporting-engine,~/others/rest-framework,~/others/sale-workflow,~/others/server-auth,~/others/server-env,~/others/server-tools,~/others/server-ux,~/others/social,~/others/stock-logistics-transport,~/others/stock-logistics-warehouse,~/others/stock-logistics-workflow,~/others/storage,~/others/web,~/others/wms --db_host psql --db_port 5432 --db_user flectra @@ -88,7 +90,9 @@ test_module_mis_builder_budget: - apt-get install -y p7zip-full - apt install -y expect-dev - su - flectra -c "mkdir ~/others" + - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-analytic.git ~/others/account-analytic" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-closing.git ~/others/account-closing" + - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-financial-tools.git ~/others/account-financial-tools" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-invoicing.git ~/others/account-invoicing" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-payment.git ~/others/account-payment" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/bank-payment.git ~/others/bank-payment" @@ -125,7 +129,7 @@ test_module_mis_builder_budget: - mv ${CI_PROJECT_DIR}/ci_data/filestore /opt/flectra/.local/share/filestore/test_mis_builder_budget - chown -R flectra.flectra /opt/flectra/.local/share/filestore/test_mis_builder_budget - su - flectra -c "/opt/flectra/flectra-bin - --addons-path ${CI_PROJECT_DIR},~/others/account-closing,~/others/account-invoicing,~/others/account-payment,~/others/bank-payment,~/others/brand,~/others/community-data-files,~/others/connector,~/others/edi,~/others/partner-contact,~/others/product-attribute,~/others/queue,~/others/report-print-send,~/others/reporting-engine,~/others/rest-framework,~/others/sale-workflow,~/others/server-auth,~/others/server-env,~/others/server-tools,~/others/server-ux,~/others/social,~/others/stock-logistics-transport,~/others/stock-logistics-warehouse,~/others/stock-logistics-workflow,~/others/storage,~/others/web,~/others/wms + --addons-path ${CI_PROJECT_DIR},~/others/account-analytic,~/others/account-closing,~/others/account-financial-tools,~/others/account-invoicing,~/others/account-payment,~/others/bank-payment,~/others/brand,~/others/community-data-files,~/others/connector,~/others/edi,~/others/partner-contact,~/others/product-attribute,~/others/queue,~/others/report-print-send,~/others/reporting-engine,~/others/rest-framework,~/others/sale-workflow,~/others/server-auth,~/others/server-env,~/others/server-tools,~/others/server-ux,~/others/social,~/others/stock-logistics-transport,~/others/stock-logistics-warehouse,~/others/stock-logistics-workflow,~/others/storage,~/others/web,~/others/wms --db_host psql --db_port 5432 --db_user flectra @@ -146,7 +150,9 @@ test_module_mis_builder: - apt-get install -y p7zip-full - apt install -y expect-dev - su - flectra -c "mkdir ~/others" + - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-analytic.git ~/others/account-analytic" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-closing.git ~/others/account-closing" + - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-financial-tools.git ~/others/account-financial-tools" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-invoicing.git ~/others/account-invoicing" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-payment.git ~/others/account-payment" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/bank-payment.git ~/others/bank-payment" @@ -183,7 +189,7 @@ test_module_mis_builder: - mv ${CI_PROJECT_DIR}/ci_data/filestore /opt/flectra/.local/share/filestore/test_mis_builder - chown -R flectra.flectra /opt/flectra/.local/share/filestore/test_mis_builder - su - flectra -c "/opt/flectra/flectra-bin - --addons-path ${CI_PROJECT_DIR},~/others/account-closing,~/others/account-invoicing,~/others/account-payment,~/others/bank-payment,~/others/brand,~/others/community-data-files,~/others/connector,~/others/edi,~/others/partner-contact,~/others/product-attribute,~/others/queue,~/others/report-print-send,~/others/reporting-engine,~/others/rest-framework,~/others/sale-workflow,~/others/server-auth,~/others/server-env,~/others/server-tools,~/others/server-ux,~/others/social,~/others/stock-logistics-transport,~/others/stock-logistics-warehouse,~/others/stock-logistics-workflow,~/others/storage,~/others/web,~/others/wms + --addons-path ${CI_PROJECT_DIR},~/others/account-analytic,~/others/account-closing,~/others/account-financial-tools,~/others/account-invoicing,~/others/account-payment,~/others/bank-payment,~/others/brand,~/others/community-data-files,~/others/connector,~/others/edi,~/others/partner-contact,~/others/product-attribute,~/others/queue,~/others/report-print-send,~/others/reporting-engine,~/others/rest-framework,~/others/sale-workflow,~/others/server-auth,~/others/server-env,~/others/server-tools,~/others/server-ux,~/others/social,~/others/stock-logistics-transport,~/others/stock-logistics-warehouse,~/others/stock-logistics-workflow,~/others/storage,~/others/web,~/others/wms --db_host psql --db_port 5432 --db_user flectra @@ -204,7 +210,9 @@ test_module_mis_builder_demo: - apt-get install -y p7zip-full - apt install -y expect-dev - su - flectra -c "mkdir ~/others" + - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-analytic.git ~/others/account-analytic" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-closing.git ~/others/account-closing" + - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-financial-tools.git ~/others/account-financial-tools" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-invoicing.git ~/others/account-invoicing" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-payment.git ~/others/account-payment" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/bank-payment.git ~/others/bank-payment" @@ -241,7 +249,7 @@ test_module_mis_builder_demo: - mv ${CI_PROJECT_DIR}/ci_data/filestore /opt/flectra/.local/share/filestore/test_mis_builder_demo - chown -R flectra.flectra /opt/flectra/.local/share/filestore/test_mis_builder_demo - su - flectra -c "/opt/flectra/flectra-bin - --addons-path ${CI_PROJECT_DIR},~/others/account-closing,~/others/account-invoicing,~/others/account-payment,~/others/bank-payment,~/others/brand,~/others/community-data-files,~/others/connector,~/others/edi,~/others/partner-contact,~/others/product-attribute,~/others/queue,~/others/report-print-send,~/others/reporting-engine,~/others/rest-framework,~/others/sale-workflow,~/others/server-auth,~/others/server-env,~/others/server-tools,~/others/server-ux,~/others/social,~/others/stock-logistics-transport,~/others/stock-logistics-warehouse,~/others/stock-logistics-workflow,~/others/storage,~/others/web,~/others/wms + --addons-path ${CI_PROJECT_DIR},~/others/account-analytic,~/others/account-closing,~/others/account-financial-tools,~/others/account-invoicing,~/others/account-payment,~/others/bank-payment,~/others/brand,~/others/community-data-files,~/others/connector,~/others/edi,~/others/partner-contact,~/others/product-attribute,~/others/queue,~/others/report-print-send,~/others/reporting-engine,~/others/rest-framework,~/others/sale-workflow,~/others/server-auth,~/others/server-env,~/others/server-tools,~/others/server-ux,~/others/social,~/others/stock-logistics-transport,~/others/stock-logistics-warehouse,~/others/stock-logistics-workflow,~/others/storage,~/others/web,~/others/wms --db_host psql --db_port 5432 --db_user flectra From fb2ec2af2baa8496c24d731001cc824dc288906e Mon Sep 17 00:00:00 2001 From: Flectra Community Bot Date: Sun, 26 Dec 2021 03:13:34 +0000 Subject: [PATCH 2/5] Automatic Update form OCA2FC Migrator --- .gitlab-ci.yml | 4 ---- README.md | 2 +- mis_builder/__manifest__.py | 2 +- mis_builder/models/mis_report.py | 13 +++++++++---- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0c1e063..e7b99e9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -23,7 +23,6 @@ test_all_modules: entrypoint: ["/bin/sh", "-c"] script: - apt-get install -y p7zip-full - - apt-get install -y expect-dev - su - flectra -c "mkdir ~/others" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-analytic.git ~/others/account-analytic" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-closing.git ~/others/account-closing" @@ -88,7 +87,6 @@ test_module_mis_builder_budget: entrypoint: ["/bin/sh", "-c"] script: - apt-get install -y p7zip-full - - apt install -y expect-dev - su - flectra -c "mkdir ~/others" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-analytic.git ~/others/account-analytic" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-closing.git ~/others/account-closing" @@ -148,7 +146,6 @@ test_module_mis_builder: entrypoint: ["/bin/sh", "-c"] script: - apt-get install -y p7zip-full - - apt install -y expect-dev - su - flectra -c "mkdir ~/others" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-analytic.git ~/others/account-analytic" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-closing.git ~/others/account-closing" @@ -208,7 +205,6 @@ test_module_mis_builder_demo: entrypoint: ["/bin/sh", "-c"] script: - apt-get install -y p7zip-full - - apt install -y expect-dev - su - flectra -c "mkdir ~/others" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-analytic.git ~/others/account-analytic" - su - flectra -c "git clone --branch 20-fixed --depth 1 https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/flectra-community/account-closing.git ~/others/account-closing" diff --git a/README.md b/README.md index f7bcbfd..7cff853 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Available addons addon | version | summary --- | --- | --- [mis_builder_budget](mis_builder_budget/) | 2.0.3.5.1| Create budgets for MIS reports -[mis_builder](mis_builder/) | 2.0.3.6.7| Build 'Management Information System' Reports and Dashboards +[mis_builder](mis_builder/) | 2.0.3.6.8| Build 'Management Information System' Reports and Dashboards [mis_builder_demo](mis_builder_demo/) | 2.0.3.1.3| Demo addon for MIS Builder diff --git a/mis_builder/__manifest__.py b/mis_builder/__manifest__.py index d720d3b..6f5d5fa 100644 --- a/mis_builder/__manifest__.py +++ b/mis_builder/__manifest__.py @@ -3,7 +3,7 @@ { "name": "MIS Builder", - "version": "2.0.3.6.7", + "version": "2.0.3.6.8", "category": "Reporting", "summary": """ Build 'Management Information System' Reports and Dashboards diff --git a/mis_builder/models/mis_report.py b/mis_builder/models/mis_report.py index 2a7109a..c794bf2 100644 --- a/mis_builder/models/mis_report.py +++ b/mis_builder/models/mis_report.py @@ -13,7 +13,12 @@ import pytz from flectra import _, api, fields, models from flectra.exceptions import UserError, ValidationError from flectra.models import expression as osv_expression -from flectra.tools.safe_eval import safe_eval +from flectra.tools.safe_eval import ( + datetime as safe_datetime, + dateutil as safe_dateutil, + safe_eval, + time as safe_time, +) from .accounting_none import AccountingNone from .aep import AccountingExpressionProcessor as AEP @@ -583,9 +588,9 @@ class MisReport(models.Model): model = self.env[query.model_id.model] eval_context = { "env": self.env, - "time": time, - "datetime": datetime, - "dateutil": dateutil, + "time": safe_time, + "datetime": safe_datetime, + "dateutil": safe_dateutil, # deprecated "uid": self.env.uid, "context": self.env.context, From d5a39714b6de233626984770a7bac15ff99220a7 Mon Sep 17 00:00:00 2001 From: Flectra Community Bot Date: Sun, 9 Jan 2022 03:14:09 +0000 Subject: [PATCH 3/5] Automatic Update form OCA2FC Migrator --- README.md | 4 +- mis_builder/COPYRIGHT | 1 + mis_builder/README.rst | 31 +++ mis_builder/__manifest__.py | 2 +- mis_builder/i18n/ca.po | 54 +++-- mis_builder/i18n/de.po | 39 +-- mis_builder/i18n/el.po | 39 +-- mis_builder/i18n/el_GR.po | 39 +-- mis_builder/i18n/es.po | 54 +++-- mis_builder/i18n/fr.po | 56 +++-- mis_builder/i18n/hr.po | 42 ++-- mis_builder/i18n/it.po | 52 ++-- mis_builder/i18n/mis_builder.pot | 38 +-- mis_builder/i18n/nl.po | 56 +++-- mis_builder/i18n/nl_NL.po | 56 +++-- mis_builder/i18n/pt.po | 42 ++-- mis_builder/i18n/pt_BR.po | 56 +++-- mis_builder/i18n/sv.po | 152 +++++++----- mis_builder/models/aep.py | 47 ++-- mis_builder/models/expression_evaluator.py | 3 - mis_builder/models/mis_report.py | 56 +++-- mis_builder/models/mis_report_instance.py | 55 +++-- mis_builder/models/mis_report_style.py | 5 +- mis_builder/security/mis_builder_security.xml | 3 +- mis_builder/static/description/index.html | 226 ++++++++++-------- mis_builder/tests/__init__.py | 1 + mis_builder/tests/test_aep.py | 30 +-- mis_builder/tests/test_mis_report_instance.py | 41 +++- mis_builder/tests/test_multi_company_aep.py | 1 - mis_builder/tests/test_target_move.py | 36 +++ mis_builder/views/mis_report_instance.xml | 11 +- mis_builder/wizard/mis_builder_dashboard.py | 3 +- mis_builder_budget/README.rst | 14 ++ mis_builder_budget/__manifest__.py | 2 +- mis_builder_budget/i18n/ca.po | 27 +++ mis_builder_budget/i18n/de.po | 27 +++ mis_builder_budget/i18n/es.po | 27 +++ mis_builder_budget/i18n/fr.po | 27 +++ mis_builder_budget/i18n/hr.po | 27 +++ mis_builder_budget/i18n/hr_HR.po | 27 +++ mis_builder_budget/i18n/it.po | 18 +- .../i18n/mis_builder_budget.pot | 15 ++ mis_builder_budget/i18n/nl.po | 27 +++ mis_builder_budget/i18n/nl_NL.po | 27 +++ mis_builder_budget/i18n/pt.po | 27 +++ mis_builder_budget/i18n/pt_BR.po | 27 +++ .../models/mis_budget_by_account.py | 3 + .../models/mis_budget_by_account_item.py | 21 +- .../models/mis_report_instance.py | 1 - .../models/mis_report_instance_period.py | 2 +- .../static/description/index.html | 104 ++++---- .../tests/test_mis_budget_by_account.py | 8 + .../views/mis_budget_by_account.xml | 1 + .../views/mis_budget_by_account_item.xml | 2 + 54 files changed, 1245 insertions(+), 547 deletions(-) create mode 100644 mis_builder/tests/test_target_move.py diff --git a/README.md b/README.md index 7cff853..6683d95 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,8 @@ Available addons addon | version | summary --- | --- | --- -[mis_builder_budget](mis_builder_budget/) | 2.0.3.5.1| Create budgets for MIS reports -[mis_builder](mis_builder/) | 2.0.3.6.8| Build 'Management Information System' Reports and Dashboards +[mis_builder_budget](mis_builder_budget/) | 2.0.4.0.0| Create budgets for MIS reports +[mis_builder](mis_builder/) | 2.0.4.0.0| Build 'Management Information System' Reports and Dashboards [mis_builder_demo](mis_builder_demo/) | 2.0.3.1.3| Demo addon for MIS Builder diff --git a/mis_builder/COPYRIGHT b/mis_builder/COPYRIGHT index 9da0237..20a9299 100644 --- a/mis_builder/COPYRIGHT +++ b/mis_builder/COPYRIGHT @@ -13,6 +13,7 @@ Most of the files are Copyright 2019 ACSONE SA/NV () Copyright 2020 ACSONE SA/NV Copyright 2020 ACSONE SA/NV () + Copyright 2020 CorporateHub (https://corporatehub.eu) Copyright 2018 Flectra Community Many files also contain contributions from third diff --git a/mis_builder/README.rst b/mis_builder/README.rst index e60fe33..5413279 100644 --- a/mis_builder/README.rst +++ b/mis_builder/README.rst @@ -97,7 +97,35 @@ be found on GitHub. Changelog ========= +14.0.4.0.0 (2022-01-08) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Features** + +- Remove various field size limits. (`#332 `_) + + +**Bugfixes** + +- Support for the Odoo 13+ multi-company model. In multi-company mode, several allowed + companies can be declared on MIS Report instances, and the report operates on the + intersection of report companies and companies selected in the user context. (`#327 `_) +- The ``get_additional_query_filter`` argument of ``evaluate()`` is now propagated + correctly. (`#375 `_) +- Use the ``parent_state`` field of ``account.move.line`` to filter entries in ``posted`` + and ``draft`` state only. Before, when reporting in draft mode, all entries were used + (i.e. there was no filter), and that started including the cancelled entries/invoices in + Odoo 13.+. + + This change also contains a **breaking change** in the internal API. For quite a while + the ``target_move argument`` of AEP and other methods was not used by MIS Builder itself + and was kept for backward compatibility. To avoid rippling effects of the necessary + change to use ``parent_state``, we now remove this argument. (`#377 `_) + + 14.0.3.6.7 (2021-06-02) +~~~~~~~~~~~~~~~~~~~~~~~ + **Bugfixes** - When on a MIS Report Instance, if you wanted to generate a new line of type comparison, you couldn't currently select any existing period to compare. @@ -570,6 +598,9 @@ Contributors * Arnaud Pineux * Ernesto Tejeda * Pedro M. Baeza +* `CorporateHub `__ + + * Alexey Pelykh Maintainers ~~~~~~~~~~~ diff --git a/mis_builder/__manifest__.py b/mis_builder/__manifest__.py index 6f5d5fa..9a3f71f 100644 --- a/mis_builder/__manifest__.py +++ b/mis_builder/__manifest__.py @@ -3,7 +3,7 @@ { "name": "MIS Builder", - "version": "2.0.3.6.8", + "version": "2.0.4.0.0", "category": "Reporting", "summary": """ Build 'Management Information System' Reports and Dashboards diff --git a/mis_builder/i18n/ca.po b/mis_builder/i18n/ca.po index d113c45..96fbeeb 100644 --- a/mis_builder/i18n/ca.po +++ b/mis_builder/i18n/ca.po @@ -292,6 +292,16 @@ msgstr "Tots els assentaments assentats" msgid "Allowed Cmpcol" msgstr "" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids +msgid "Allowed companies" +msgstr "" + +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id +msgid "Allowed company" +msgstr "" + #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_kpi_data__amount msgid "Amount" @@ -411,10 +421,8 @@ msgstr "Cancel·lar" #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__multi_company -msgid "" -"Check if you wish to specify children companies to be searched for data." +msgid "Check if you wish to specify several companies to be searched for data." msgstr "" -"Comprovi si desitja especificar companyies filles per a buscar-hi dades." #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form @@ -465,21 +473,11 @@ msgstr "Columnes a sumar" msgid "Columns {} and {} are not comparable" msgstr "Les columnes {} i {} no són comparables" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids -msgid "Companies" -msgstr "Companyies" - #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__query_company_ids msgid "Companies for which data will be searched." msgstr "Companyies per a les que es buscaran dades." -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id -msgid "Company" -msgstr "Companyia" - #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period__source_cmpcol_to_id msgid "Compare" @@ -685,6 +683,11 @@ msgstr "" msgid "Duration" msgstr "Durada" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids +msgid "Effective companies" +msgstr "" + #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "Enter expression here, for example balp[70%]. See also help tab." @@ -1389,11 +1392,6 @@ msgstr "Imprimeix" msgid "Queries" msgstr "Consultes" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids -msgid "Query Company" -msgstr "Companyia de la consulta" - #. module: mis_builder #: code:addons/mis_builder/models/mis_report.py:0 #, fuzzy, python-format @@ -1716,6 +1714,12 @@ msgstr "Per (calculat)" msgid "Unexpected accumulation method %s for %s." msgstr "Mètode d'acumulació %s no esperat per a %s." +#. module: mis_builder +#: code:addons/mis_builder/models/mis_report.py:0 +#, python-format +msgid "Unexpected value %s for target_move." +msgstr "" + #. module: mis_builder #: code:addons/mis_builder/models/prorata_read_group_mixin.py:0 #, python-format @@ -1837,6 +1841,20 @@ msgstr "extra-súper-gran" msgid "xx-small" msgstr "extra-súper-petita" +#~ msgid "" +#~ "Check if you wish to specify children companies to be searched for data." +#~ msgstr "" +#~ "Comprovi si desitja especificar companyies filles per a buscar-hi dades." + +#~ msgid "Companies" +#~ msgstr "Companyies" + +#~ msgid "Company" +#~ msgstr "Companyia" + +#~ msgid "Query Company" +#~ msgstr "Companyia de la consulta" + #~ msgid "" #~ "AccountingNone: a null value that behaves as 0 in arithmetic " #~ "operations." diff --git a/mis_builder/i18n/de.po b/mis_builder/i18n/de.po index 6417ae9..b16cf26 100644 --- a/mis_builder/i18n/de.po +++ b/mis_builder/i18n/de.po @@ -277,6 +277,16 @@ msgstr "" msgid "Allowed Cmpcol" msgstr "" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids +msgid "Allowed companies" +msgstr "" + +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id +msgid "Allowed company" +msgstr "" + #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_kpi_data__amount msgid "Amount" @@ -394,8 +404,7 @@ msgstr "" #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__multi_company -msgid "" -"Check if you wish to specify children companies to be searched for data." +msgid "Check if you wish to specify several companies to be searched for data." msgstr "" #. module: mis_builder @@ -447,21 +456,11 @@ msgstr "" msgid "Columns {} and {} are not comparable" msgstr "" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids -msgid "Companies" -msgstr "" - #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__query_company_ids msgid "Companies for which data will be searched." msgstr "" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id -msgid "Company" -msgstr "" - #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period__source_cmpcol_to_id msgid "Compare" @@ -659,6 +658,11 @@ msgstr "" msgid "Duration" msgstr "" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids +msgid "Effective companies" +msgstr "" + #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "Enter expression here, for example balp[70%]. See also help tab." @@ -1339,11 +1343,6 @@ msgstr "" msgid "Queries" msgstr "" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids -msgid "Query Company" -msgstr "" - #. module: mis_builder #: code:addons/mis_builder/models/mis_report.py:0 #, python-format @@ -1658,6 +1657,12 @@ msgstr "" msgid "Unexpected accumulation method %s for %s." msgstr "" +#. module: mis_builder +#: code:addons/mis_builder/models/mis_report.py:0 +#, python-format +msgid "Unexpected value %s for target_move." +msgstr "" + #. module: mis_builder #: code:addons/mis_builder/models/prorata_read_group_mixin.py:0 #, python-format diff --git a/mis_builder/i18n/el.po b/mis_builder/i18n/el.po index f341dc4..6ea1168 100644 --- a/mis_builder/i18n/el.po +++ b/mis_builder/i18n/el.po @@ -273,6 +273,16 @@ msgstr "" msgid "Allowed Cmpcol" msgstr "" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids +msgid "Allowed companies" +msgstr "" + +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id +msgid "Allowed company" +msgstr "" + #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_kpi_data__amount msgid "Amount" @@ -390,8 +400,7 @@ msgstr "" #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__multi_company -msgid "" -"Check if you wish to specify children companies to be searched for data." +msgid "Check if you wish to specify several companies to be searched for data." msgstr "" #. module: mis_builder @@ -443,21 +452,11 @@ msgstr "" msgid "Columns {} and {} are not comparable" msgstr "" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids -msgid "Companies" -msgstr "" - #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__query_company_ids msgid "Companies for which data will be searched." msgstr "" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id -msgid "Company" -msgstr "" - #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period__source_cmpcol_to_id msgid "Compare" @@ -655,6 +654,11 @@ msgstr "" msgid "Duration" msgstr "" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids +msgid "Effective companies" +msgstr "" + #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "Enter expression here, for example balp[70%]. See also help tab." @@ -1335,11 +1339,6 @@ msgstr "" msgid "Queries" msgstr "" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids -msgid "Query Company" -msgstr "" - #. module: mis_builder #: code:addons/mis_builder/models/mis_report.py:0 #, python-format @@ -1654,6 +1653,12 @@ msgstr "" msgid "Unexpected accumulation method %s for %s." msgstr "" +#. module: mis_builder +#: code:addons/mis_builder/models/mis_report.py:0 +#, python-format +msgid "Unexpected value %s for target_move." +msgstr "" + #. module: mis_builder #: code:addons/mis_builder/models/prorata_read_group_mixin.py:0 #, python-format diff --git a/mis_builder/i18n/el_GR.po b/mis_builder/i18n/el_GR.po index bc39319..d7c7857 100644 --- a/mis_builder/i18n/el_GR.po +++ b/mis_builder/i18n/el_GR.po @@ -273,6 +273,16 @@ msgstr "" msgid "Allowed Cmpcol" msgstr "" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids +msgid "Allowed companies" +msgstr "" + +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id +msgid "Allowed company" +msgstr "" + #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_kpi_data__amount msgid "Amount" @@ -390,8 +400,7 @@ msgstr "" #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__multi_company -msgid "" -"Check if you wish to specify children companies to be searched for data." +msgid "Check if you wish to specify several companies to be searched for data." msgstr "" #. module: mis_builder @@ -443,21 +452,11 @@ msgstr "" msgid "Columns {} and {} are not comparable" msgstr "" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids -msgid "Companies" -msgstr "" - #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__query_company_ids msgid "Companies for which data will be searched." msgstr "" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id -msgid "Company" -msgstr "" - #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period__source_cmpcol_to_id msgid "Compare" @@ -655,6 +654,11 @@ msgstr "" msgid "Duration" msgstr "" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids +msgid "Effective companies" +msgstr "" + #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "Enter expression here, for example balp[70%]. See also help tab." @@ -1335,11 +1339,6 @@ msgstr "" msgid "Queries" msgstr "" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids -msgid "Query Company" -msgstr "" - #. module: mis_builder #: code:addons/mis_builder/models/mis_report.py:0 #, python-format @@ -1654,6 +1653,12 @@ msgstr "" msgid "Unexpected accumulation method %s for %s." msgstr "" +#. module: mis_builder +#: code:addons/mis_builder/models/mis_report.py:0 +#, python-format +msgid "Unexpected value %s for target_move." +msgstr "" + #. module: mis_builder #: code:addons/mis_builder/models/prorata_read_group_mixin.py:0 #, python-format diff --git a/mis_builder/i18n/es.po b/mis_builder/i18n/es.po index 61dd1cc..69735ec 100644 --- a/mis_builder/i18n/es.po +++ b/mis_builder/i18n/es.po @@ -294,6 +294,16 @@ msgstr "Todos los asientos asentados" msgid "Allowed Cmpcol" msgstr "" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids +msgid "Allowed companies" +msgstr "" + +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id +msgid "Allowed company" +msgstr "" + #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_kpi_data__amount msgid "Amount" @@ -413,10 +423,8 @@ msgstr "Cancelar" #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__multi_company -msgid "" -"Check if you wish to specify children companies to be searched for data." +msgid "Check if you wish to specify several companies to be searched for data." msgstr "" -"Compruebe si desea especificar compañías hijas para buscar datos en ellas." #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form @@ -467,21 +475,11 @@ msgstr "Columnas a sumar" msgid "Columns {} and {} are not comparable" msgstr "Las columnas {} and {} no son comparables" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids -msgid "Companies" -msgstr "Compañías" - #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__query_company_ids msgid "Companies for which data will be searched." msgstr "Compañías para las que se buscarán datos." -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id -msgid "Company" -msgstr "Compañía" - #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period__source_cmpcol_to_id msgid "Compare" @@ -688,6 +686,11 @@ msgstr "" msgid "Duration" msgstr "Duración" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids +msgid "Effective companies" +msgstr "" + #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "Enter expression here, for example balp[70%]. See also help tab." @@ -1386,11 +1389,6 @@ msgstr "Imprimir" msgid "Queries" msgstr "Consultas" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids -msgid "Query Company" -msgstr "Compañía de la consulta" - #. module: mis_builder #: code:addons/mis_builder/models/mis_report.py:0 #, python-format @@ -1713,6 +1711,12 @@ msgstr "Para (calculado)" msgid "Unexpected accumulation method %s for %s." msgstr "Método de acumulación %s no esperado para %s." +#. module: mis_builder +#: code:addons/mis_builder/models/mis_report.py:0 +#, python-format +msgid "Unexpected value %s for target_move." +msgstr "" + #. module: mis_builder #: code:addons/mis_builder/models/prorata_read_group_mixin.py:0 #, python-format @@ -1834,6 +1838,20 @@ msgstr "extra-súper-grande" msgid "xx-small" msgstr "extra-súper-pequeña" +#~ msgid "" +#~ "Check if you wish to specify children companies to be searched for data." +#~ msgstr "" +#~ "Compruebe si desea especificar compañías hijas para buscar datos en ellas." + +#~ msgid "Companies" +#~ msgstr "Compañías" + +#~ msgid "Company" +#~ msgstr "Compañía" + +#~ msgid "Query Company" +#~ msgstr "Compañía de la consulta" + #~ msgid "" #~ "AccountingNone: a null value that behaves as 0 in arithmetic " #~ "operations." diff --git a/mis_builder/i18n/fr.po b/mis_builder/i18n/fr.po index b189ed6..483e965 100644 --- a/mis_builder/i18n/fr.po +++ b/mis_builder/i18n/fr.po @@ -288,6 +288,16 @@ msgstr "Écritures comptabilisées seulement" msgid "Allowed Cmpcol" msgstr "" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids +msgid "Allowed companies" +msgstr "" + +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id +msgid "Allowed company" +msgstr "" + #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_kpi_data__amount msgid "Amount" @@ -407,11 +417,8 @@ msgstr "Annuler" #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__multi_company -msgid "" -"Check if you wish to specify children companies to be searched for data." +msgid "Check if you wish to specify several companies to be searched for data." msgstr "" -"Vérifiez si vous souhaitez spécifier des sociétés enfants dont les données " -"seront recherchées." #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form @@ -462,21 +469,11 @@ msgstr "Colonnes à additionner" msgid "Columns {} and {} are not comparable" msgstr "Les colonnes {} et {} ne sont pas comparables" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids -msgid "Companies" -msgstr "Sociétés" - #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__query_company_ids msgid "Companies for which data will be searched." msgstr "Sociétés pour lesquelles les données seront recherchées." -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id -msgid "Company" -msgstr "Société" - #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period__source_cmpcol_to_id msgid "Compare" @@ -682,6 +679,11 @@ msgstr "" msgid "Duration" msgstr "Durée" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids +msgid "Effective companies" +msgstr "" + #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "Enter expression here, for example balp[70%]. See also help tab." @@ -1377,11 +1379,6 @@ msgstr "Imprimer" msgid "Queries" msgstr "Requêtes" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids -msgid "Query Company" -msgstr "Société de la requête" - #. module: mis_builder #: code:addons/mis_builder/models/mis_report.py:0 #, fuzzy, python-format @@ -1709,6 +1706,12 @@ msgstr "" msgid "Unexpected accumulation method %s for %s." msgstr "Méthode d'accumulation inattendue %s pour %s." +#. module: mis_builder +#: code:addons/mis_builder/models/mis_report.py:0 +#, python-format +msgid "Unexpected value %s for target_move." +msgstr "" + #. module: mis_builder #: code:addons/mis_builder/models/prorata_read_group_mixin.py:0 #, python-format @@ -1830,6 +1833,21 @@ msgstr "xx-grand" msgid "xx-small" msgstr "xx-petit" +#~ msgid "" +#~ "Check if you wish to specify children companies to be searched for data." +#~ msgstr "" +#~ "Vérifiez si vous souhaitez spécifier des sociétés enfants dont les " +#~ "données seront recherchées." + +#~ msgid "Companies" +#~ msgstr "Sociétés" + +#~ msgid "Company" +#~ msgstr "Société" + +#~ msgid "Query Company" +#~ msgstr "Société de la requête" + #~ msgid "" #~ "AccountingNone: a null value that behaves as 0 in arithmetic " #~ "operations." diff --git a/mis_builder/i18n/hr.po b/mis_builder/i18n/hr.po index c487840..b4aacef 100644 --- a/mis_builder/i18n/hr.po +++ b/mis_builder/i18n/hr.po @@ -285,6 +285,16 @@ msgstr "Sve proknjižene stavke" msgid "Allowed Cmpcol" msgstr "" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids +msgid "Allowed companies" +msgstr "" + +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id +msgid "Allowed company" +msgstr "" + #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_kpi_data__amount msgid "Amount" @@ -404,8 +414,7 @@ msgstr "Otkaži" #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__multi_company -msgid "" -"Check if you wish to specify children companies to be searched for data." +msgid "Check if you wish to specify several companies to be searched for data." msgstr "" #. module: mis_builder @@ -457,21 +466,11 @@ msgstr "" msgid "Columns {} and {} are not comparable" msgstr "" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids -msgid "Companies" -msgstr "" - #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__query_company_ids msgid "Companies for which data will be searched." msgstr "" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id -msgid "Company" -msgstr "Tvrtka" - #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period__source_cmpcol_to_id msgid "Compare" @@ -669,6 +668,11 @@ msgstr "" msgid "Duration" msgstr "" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids +msgid "Effective companies" +msgstr "" + #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "Enter expression here, for example balp[70%]. See also help tab." @@ -1349,11 +1353,6 @@ msgstr "" msgid "Queries" msgstr "" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids -msgid "Query Company" -msgstr "" - #. module: mis_builder #: code:addons/mis_builder/models/mis_report.py:0 #, python-format @@ -1668,6 +1667,12 @@ msgstr "" msgid "Unexpected accumulation method %s for %s." msgstr "" +#. module: mis_builder +#: code:addons/mis_builder/models/mis_report.py:0 +#, python-format +msgid "Unexpected value %s for target_move." +msgstr "" + #. module: mis_builder #: code:addons/mis_builder/models/prorata_read_group_mixin.py:0 #, python-format @@ -1789,6 +1794,9 @@ msgstr "" msgid "xx-small" msgstr "" +#~ msgid "Company" +#~ msgstr "Tvrtka" + #~ msgid "" #~ "AccountingNone: a null value that behaves as 0 in arithmetic " #~ "operations." diff --git a/mis_builder/i18n/it.po b/mis_builder/i18n/it.po index a753323..ce8cdf1 100644 --- a/mis_builder/i18n/it.po +++ b/mis_builder/i18n/it.po @@ -276,6 +276,16 @@ msgstr "Tutte le registrazioni confermate" msgid "Allowed Cmpcol" msgstr "" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids +msgid "Allowed companies" +msgstr "" + +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id +msgid "Allowed company" +msgstr "" + #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_kpi_data__amount msgid "Amount" @@ -393,10 +403,8 @@ msgstr "Annulla" #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__multi_company -msgid "" -"Check if you wish to specify children companies to be searched for data." +msgid "Check if you wish to specify several companies to be searched for data." msgstr "" -"Spuntare se si desidera specificare le aziende figlie da ricercare per dati." #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form @@ -447,21 +455,11 @@ msgstr "Colonne da sommare" msgid "Columns {} and {} are not comparable" msgstr "Le colonne {} e {} non sono confrontabili" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids -msgid "Companies" -msgstr "Aziende" - #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__query_company_ids msgid "Companies for which data will be searched." msgstr "Società dalla quali i dati verranno ricercati." -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id -msgid "Company" -msgstr "Azienda" - #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period__source_cmpcol_to_id msgid "Compare" @@ -665,6 +663,11 @@ msgstr "" msgid "Duration" msgstr "Durata" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids +msgid "Effective companies" +msgstr "" + #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "Enter expression here, for example balp[70%]. See also help tab." @@ -1347,11 +1350,6 @@ msgstr "Stampa" msgid "Queries" msgstr "Domande" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids -msgid "Query Company" -msgstr "" - #. module: mis_builder #: code:addons/mis_builder/models/mis_report.py:0 #, python-format @@ -1672,6 +1670,12 @@ msgstr "A (calcolato)" msgid "Unexpected accumulation method %s for %s." msgstr "Metodo di accumulo imprevisto %s for %s." +#. module: mis_builder +#: code:addons/mis_builder/models/mis_report.py:0 +#, python-format +msgid "Unexpected value %s for target_move." +msgstr "" + #. module: mis_builder #: code:addons/mis_builder/models/prorata_read_group_mixin.py:0 #, python-format @@ -1792,3 +1796,15 @@ msgstr "" #: model:ir.model.fields.selection,name:mis_builder.selection__mis_report_style__font_size__xx-small msgid "xx-small" msgstr "" + +#~ msgid "" +#~ "Check if you wish to specify children companies to be searched for data." +#~ msgstr "" +#~ "Spuntare se si desidera specificare le aziende figlie da ricercare per " +#~ "dati." + +#~ msgid "Companies" +#~ msgstr "Aziende" + +#~ msgid "Company" +#~ msgstr "Azienda" diff --git a/mis_builder/i18n/mis_builder.pot b/mis_builder/i18n/mis_builder.pot index c0848ad..9e8eaa8 100644 --- a/mis_builder/i18n/mis_builder.pot +++ b/mis_builder/i18n/mis_builder.pot @@ -252,6 +252,16 @@ msgstr "" msgid "Allowed Cmpcol" msgstr "" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids +msgid "Allowed companies" +msgstr "" + +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id +msgid "Allowed company" +msgstr "" + #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_kpi_data__amount msgid "Amount" @@ -371,7 +381,7 @@ msgstr "" #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__multi_company msgid "" -"Check if you wish to specify children companies to be searched for data." +"Check if you wish to specify several companies to be searched for data." msgstr "" #. module: mis_builder @@ -423,21 +433,11 @@ msgstr "" msgid "Columns {} and {} are not comparable" msgstr "" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids -msgid "Companies" -msgstr "" - #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__query_company_ids msgid "Companies for which data will be searched." msgstr "" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id -msgid "Company" -msgstr "" - #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period__source_cmpcol_to_id msgid "Compare" @@ -631,6 +631,11 @@ msgstr "" msgid "Duration" msgstr "" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids +msgid "Effective companies" +msgstr "" + #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "Enter expression here, for example balp[70%]. See also help tab." @@ -1311,11 +1316,6 @@ msgstr "" msgid "Queries" msgstr "" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids -msgid "Query Company" -msgstr "" - #. module: mis_builder #: code:addons/mis_builder/models/mis_report.py:0 #, python-format @@ -1627,6 +1627,12 @@ msgstr "" msgid "Unexpected accumulation method %s for %s." msgstr "" +#. module: mis_builder +#: code:addons/mis_builder/models/mis_report.py:0 +#, python-format +msgid "Unexpected value %s for target_move." +msgstr "" + #. module: mis_builder #: code:addons/mis_builder/models/prorata_read_group_mixin.py:0 #, python-format diff --git a/mis_builder/i18n/nl.po b/mis_builder/i18n/nl.po index 6e743bf..b52b22d 100644 --- a/mis_builder/i18n/nl.po +++ b/mis_builder/i18n/nl.po @@ -288,6 +288,16 @@ msgstr "Alle Geboekte Regels" msgid "Allowed Cmpcol" msgstr "" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids +msgid "Allowed companies" +msgstr "" + +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id +msgid "Allowed company" +msgstr "" + #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_kpi_data__amount msgid "Amount" @@ -407,11 +417,8 @@ msgstr "Annuleer" #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__multi_company -msgid "" -"Check if you wish to specify children companies to be searched for data." +msgid "Check if you wish to specify several companies to be searched for data." msgstr "" -"Controleer of u dochterbedrijven wilt selecteren waarvan de data moet worden " -"meegenomen." #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form @@ -462,21 +469,11 @@ msgstr "Op te sommen kolommen" msgid "Columns {} and {} are not comparable" msgstr "Kolommen {} en {} zijn niet vergelijkbaar" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids -msgid "Companies" -msgstr "Bedrijven" - #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__query_company_ids msgid "Companies for which data will be searched." msgstr "Bedrijven waarvoor de data wordt doorzocht." -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id -msgid "Company" -msgstr "Bedrijf" - #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period__source_cmpcol_to_id msgid "Compare" @@ -684,6 +681,11 @@ msgstr "" msgid "Duration" msgstr "Duur" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids +msgid "Effective companies" +msgstr "" + #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "Enter expression here, for example balp[70%]. See also help tab." @@ -1381,11 +1383,6 @@ msgstr "Print" msgid "Queries" msgstr "Queries" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids -msgid "Query Company" -msgstr "Query Bedrijf" - #. module: mis_builder #: code:addons/mis_builder/models/mis_report.py:0 #, fuzzy, python-format @@ -1710,6 +1707,12 @@ msgstr "" msgid "Unexpected accumulation method %s for %s." msgstr "Onverwachte accumulatiemethode %s voor %s." +#. module: mis_builder +#: code:addons/mis_builder/models/mis_report.py:0 +#, python-format +msgid "Unexpected value %s for target_move." +msgstr "" + #. module: mis_builder #: code:addons/mis_builder/models/prorata_read_group_mixin.py:0 #, python-format @@ -1831,6 +1834,21 @@ msgstr "XXL" msgid "xx-small" msgstr "XXS" +#~ msgid "" +#~ "Check if you wish to specify children companies to be searched for data." +#~ msgstr "" +#~ "Controleer of u dochterbedrijven wilt selecteren waarvan de data moet " +#~ "worden meegenomen." + +#~ msgid "Companies" +#~ msgstr "Bedrijven" + +#~ msgid "Company" +#~ msgstr "Bedrijf" + +#~ msgid "Query Company" +#~ msgstr "Query Bedrijf" + #~ msgid "" #~ "AccountingNone: a null value that behaves as 0 in arithmetic " #~ "operations." diff --git a/mis_builder/i18n/nl_NL.po b/mis_builder/i18n/nl_NL.po index 1e78a7c..cd05165 100644 --- a/mis_builder/i18n/nl_NL.po +++ b/mis_builder/i18n/nl_NL.po @@ -291,6 +291,16 @@ msgstr "Alle Geboekte Regels" msgid "Allowed Cmpcol" msgstr "" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids +msgid "Allowed companies" +msgstr "" + +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id +msgid "Allowed company" +msgstr "" + #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_kpi_data__amount msgid "Amount" @@ -410,11 +420,8 @@ msgstr "Annuleer" #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__multi_company -msgid "" -"Check if you wish to specify children companies to be searched for data." +msgid "Check if you wish to specify several companies to be searched for data." msgstr "" -"Controleer of u dochterbedrijven wilt selecteren waarvan de data moet worden " -"meegenomen." #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form @@ -465,21 +472,11 @@ msgstr "Op te sommen kolommen" msgid "Columns {} and {} are not comparable" msgstr "Kolommen {} en {} zijn niet vergelijkbaar" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids -msgid "Companies" -msgstr "Bedrijven" - #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__query_company_ids msgid "Companies for which data will be searched." msgstr "Bedrijven waarvoor de data wordt doorzocht." -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id -msgid "Company" -msgstr "Bedrijf" - #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period__source_cmpcol_to_id msgid "Compare" @@ -687,6 +684,11 @@ msgstr "" msgid "Duration" msgstr "Duur" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids +msgid "Effective companies" +msgstr "" + #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "Enter expression here, for example balp[70%]. See also help tab." @@ -1384,11 +1386,6 @@ msgstr "Afdrukken" msgid "Queries" msgstr "Query's" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids -msgid "Query Company" -msgstr "Query Bedrijf" - #. module: mis_builder #: code:addons/mis_builder/models/mis_report.py:0 #, fuzzy, python-format @@ -1713,6 +1710,12 @@ msgstr "" msgid "Unexpected accumulation method %s for %s." msgstr "Onverwachte accumulatiemethode %s voor %s." +#. module: mis_builder +#: code:addons/mis_builder/models/mis_report.py:0 +#, python-format +msgid "Unexpected value %s for target_move." +msgstr "" + #. module: mis_builder #: code:addons/mis_builder/models/prorata_read_group_mixin.py:0 #, python-format @@ -1834,6 +1837,21 @@ msgstr "XXL" msgid "xx-small" msgstr "XXS" +#~ msgid "" +#~ "Check if you wish to specify children companies to be searched for data." +#~ msgstr "" +#~ "Controleer of u dochterbedrijven wilt selecteren waarvan de data moet " +#~ "worden meegenomen." + +#~ msgid "Companies" +#~ msgstr "Bedrijven" + +#~ msgid "Company" +#~ msgstr "Bedrijf" + +#~ msgid "Query Company" +#~ msgstr "Query Bedrijf" + #~ msgid "" #~ "AccountingNone: a null value that behaves as 0 in arithmetic " #~ "operations." diff --git a/mis_builder/i18n/pt.po b/mis_builder/i18n/pt.po index f0269d3..a2f85ba 100644 --- a/mis_builder/i18n/pt.po +++ b/mis_builder/i18n/pt.po @@ -277,6 +277,16 @@ msgstr "Todos os lançamentos publicados" msgid "Allowed Cmpcol" msgstr "" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids +msgid "Allowed companies" +msgstr "" + +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id +msgid "Allowed company" +msgstr "" + #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_kpi_data__amount msgid "Amount" @@ -394,8 +404,7 @@ msgstr "Cancelar" #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__multi_company -msgid "" -"Check if you wish to specify children companies to be searched for data." +msgid "Check if you wish to specify several companies to be searched for data." msgstr "" #. module: mis_builder @@ -447,21 +456,11 @@ msgstr "" msgid "Columns {} and {} are not comparable" msgstr "" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids -msgid "Companies" -msgstr "" - #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__query_company_ids msgid "Companies for which data will be searched." msgstr "" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id -msgid "Company" -msgstr "Empresa" - #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period__source_cmpcol_to_id msgid "Compare" @@ -659,6 +658,11 @@ msgstr "" msgid "Duration" msgstr "" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids +msgid "Effective companies" +msgstr "" + #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "Enter expression here, for example balp[70%]. See also help tab." @@ -1339,11 +1343,6 @@ msgstr "" msgid "Queries" msgstr "" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids -msgid "Query Company" -msgstr "" - #. module: mis_builder #: code:addons/mis_builder/models/mis_report.py:0 #, python-format @@ -1658,6 +1657,12 @@ msgstr "" msgid "Unexpected accumulation method %s for %s." msgstr "" +#. module: mis_builder +#: code:addons/mis_builder/models/mis_report.py:0 +#, python-format +msgid "Unexpected value %s for target_move." +msgstr "" + #. module: mis_builder #: code:addons/mis_builder/models/prorata_read_group_mixin.py:0 #, python-format @@ -1778,3 +1783,6 @@ msgstr "" #: model:ir.model.fields.selection,name:mis_builder.selection__mis_report_style__font_size__xx-small msgid "xx-small" msgstr "" + +#~ msgid "Company" +#~ msgstr "Empresa" diff --git a/mis_builder/i18n/pt_BR.po b/mis_builder/i18n/pt_BR.po index c254d05..8ff211b 100644 --- a/mis_builder/i18n/pt_BR.po +++ b/mis_builder/i18n/pt_BR.po @@ -289,6 +289,16 @@ msgstr "Todas as Entradas Postadas" msgid "Allowed Cmpcol" msgstr "" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids +msgid "Allowed companies" +msgstr "" + +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id +msgid "Allowed company" +msgstr "" + #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_kpi_data__amount msgid "Amount" @@ -408,11 +418,8 @@ msgstr "Cancelar" #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__multi_company -msgid "" -"Check if you wish to specify children companies to be searched for data." +msgid "Check if you wish to specify several companies to be searched for data." msgstr "" -"Verifique se deseja especificar empresas filhas para serem pesquisadas por " -"dados." #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form @@ -463,21 +470,11 @@ msgstr "Colunas para somar" msgid "Columns {} and {} are not comparable" msgstr "Colunas {} e {} não são comparáveis" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids -msgid "Companies" -msgstr "Empresas" - #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__query_company_ids msgid "Companies for which data will be searched." msgstr "Empresas para as quais os dados serão pesquisados." -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id -msgid "Company" -msgstr "Empresa" - #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period__source_cmpcol_to_id msgid "Compare" @@ -682,6 +679,11 @@ msgstr "" msgid "Duration" msgstr "Duração" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids +msgid "Effective companies" +msgstr "" + #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "Enter expression here, for example balp[70%]. See also help tab." @@ -1376,11 +1378,6 @@ msgstr "Imprimir" msgid "Queries" msgstr "Consultas" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids -msgid "Query Company" -msgstr "Empresa de Consulta" - #. module: mis_builder #: code:addons/mis_builder/models/mis_report.py:0 #, fuzzy, python-format @@ -1703,6 +1700,12 @@ msgstr "Para (computado)" msgid "Unexpected accumulation method %s for %s." msgstr "Método de acumulação %s não esperado para %s." +#. module: mis_builder +#: code:addons/mis_builder/models/mis_report.py:0 +#, python-format +msgid "Unexpected value %s for target_move." +msgstr "" + #. module: mis_builder #: code:addons/mis_builder/models/prorata_read_group_mixin.py:0 #, python-format @@ -1824,6 +1827,21 @@ msgstr "grandíssimo" msgid "xx-small" msgstr "Pequeníssimo" +#~ msgid "" +#~ "Check if you wish to specify children companies to be searched for data." +#~ msgstr "" +#~ "Verifique se deseja especificar empresas filhas para serem pesquisadas " +#~ "por dados." + +#~ msgid "Companies" +#~ msgstr "Empresas" + +#~ msgid "Company" +#~ msgstr "Empresa" + +#~ msgid "Query Company" +#~ msgstr "Empresa de Consulta" + #~ msgid "" #~ "AccountingNone: a null value that behaves as 0 in arithmetic " #~ "operations." diff --git a/mis_builder/i18n/sv.po b/mis_builder/i18n/sv.po index 826f629..d1e38cf 100644 --- a/mis_builder/i18n/sv.po +++ b/mis_builder/i18n/sv.po @@ -29,9 +29,11 @@ msgid "" "\n" " balp[('user_type_id', '=',\n" " ref('account.\n" -" data_account_type_receivable').id)][]\n" +" data_account_type_receivable')." +"id)][]\n" " \n" -" : variation of the balance of all receivable\n" +" : variation of the balance of " +"all receivable\n" " accounts over the period." msgstr "" @@ -39,10 +41,13 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "" "\n" -" balp[][('tax_line_id.tag_ids', '=',\n" -" ref('l10n_be.tax_tag_56').id)]\n" +" balp[][('tax_line_id." +"tag_ids', '=',\n" +" ref('l10n_be.tax_tag_56')." +"id)]\n" " \n" -" : balance of move lines related to tax grid\n" +" : balance of move lines related " +"to tax grid\n" " 56." msgstr "" @@ -50,10 +55,12 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "" "\n" -" debp[55%][('journal_id.code', '=',\n" +" debp[55%][('journal_id." +"code', '=',\n" " 'BNK1')]\n" " \n" -" : sum of all debits on accounts 55 and\n" +" : sum of all debits on accounts " +"55 and\n" " journal BNK1 during the period." msgstr "" @@ -61,7 +68,8 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "" "AccountingNone\n" -" : a null value that behaves as 0 in\n" +" : a null value that behaves as 0 " +"in\n" " arithmetic operations." msgstr "" @@ -69,7 +77,8 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "" "bal, crd, deb, pbal, nbal\n" -" : balance, debit, credit, positive balance,\n" +" : balance, debit, credit, " +"positive balance,\n" " negative balance." msgstr "" @@ -77,15 +86,18 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "" "bal[70]\n" -" : variation of the balance of account 70\n" -" over the period (it is the same as balp[70]." +" : variation of the balance of " +"account 70\n" +" over the period (it is the same " +"as balp[70]." msgstr "" #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "" "bale[1%]\n" -" : balance of accounts starting with 1 at end\n" +" : balance of accounts starting " +"with 1 at end\n" " of period." msgstr "" @@ -93,15 +105,18 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "" "bali[70,60]\n" -" : initial balance of accounts 70 and 60." +" : initial balance of accounts 70 " +"and 60." msgstr "" #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "" "balu[]\n" -" : (u for unallocated) is a special\n" -" expression that shows the unallocated\n" +" : (u for unallocated) is a " +"special\n" +" expression that shows the " +"unallocated\n" " profit/loss of previous\n" " fiscal years." msgstr "" @@ -110,7 +125,8 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "" "crdp[40%]\n" -" : sum of all credits on accounts starting\n" +" : sum of all credits on accounts " +"starting\n" " with 40 during the period." msgstr "" @@ -118,7 +134,8 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "" "date_from, date_to\n" -" : beginning and end date of the period." +" : beginning and end date of the " +"period." msgstr "" #. module: mis_builder @@ -132,7 +149,8 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "" "p, i, e\n" -" : respectively variation over the period,\n" +" : respectively variation over " +"the period,\n" " initial balance, ending balance" msgstr "" @@ -140,7 +158,8 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "" "pbale[55%]\n" -" : sum of all ending balances of accounts\n" +" : sum of all ending balances of " +"accounts\n" " starting with 55 whose\n" " ending balance is positive." msgstr "" @@ -149,22 +168,23 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "" "sum, min, max, len, avg\n" -" : behave as expected, very similar to the\n" +" : behave as expected, very " +"similar to the\n" " python builtins." msgstr "" #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance_period__source_aml_model_id msgid "" -"A 'move line like' model, ie having at least debit, credit, date, account_id" -" and company_id fields." +"A 'move line like' model, ie having at least debit, credit, date, account_id " +"and company_id fields." msgstr "" #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report__move_lines_source msgid "" -"A 'move line like' model, ie having at least debit, credit, date, account_id" -" and company_id fields. This model is the data source for column Actuals." +"A 'move line like' model, ie having at least debit, credit, date, account_id " +"and company_id fields. This model is the data source for column Actuals." msgstr "" #. module: mis_builder @@ -187,9 +207,8 @@ msgstr "" #: code:addons/mis_builder/models/mis_report_instance.py:0 #, python-format msgid "" -"Actual (alternative) models used in columns must have the same account model" -" in the Account field and must be the same defined in the report template: " -"%s" +"Actual (alternative) models used in columns must have the same account model " +"in the Account field and must be the same defined in the report template: %s" msgstr "" #. module: mis_builder @@ -206,7 +225,8 @@ msgstr "" #: model:ir.model.fields,help:mis_builder.field_mis_report_instance_period__source msgid "" "Actuals: current data, from accounting and other queries.\n" -"Actuals (alternative): current data from an alternative source (eg a database view providing look-alike account move lines).\n" +"Actuals (alternative): current data from an alternative source (eg a " +"database view providing look-alike account move lines).\n" "Sum columns: summation (+/-) of other columns.\n" "Compare to column: compare to other column.\n" msgstr "" @@ -255,6 +275,16 @@ msgstr "Alla bokförda poster" msgid "Allowed Cmpcol" msgstr "" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids +msgid "Allowed companies" +msgstr "" + +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id +msgid "Allowed company" +msgstr "" + #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_kpi_data__amount msgid "Amount" @@ -263,8 +293,8 @@ msgstr "" #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_kpi__style_expression msgid "" -"An expression that returns a style depending on the KPI value. Such style is" -" applied on top of the row style." +"An expression that returns a style depending on the KPI value. Such style is " +"applied on top of the row style." msgstr "" #. module: mis_builder @@ -327,7 +357,6 @@ msgstr "" #. module: mis_builder #: code:addons/mis_builder/models/mis_report.py:0 -#: code:addons/mis_builder/models/mis_report.py:0 #: model:ir.model.fields.selection,name:mis_builder.selection__mis_report_kpi__accumulation_method__avg #: model:ir.model.fields.selection,name:mis_builder.selection__mis_report_query__aggregate__avg #, python-format @@ -373,8 +402,7 @@ msgstr "" #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__multi_company -msgid "" -"Check if you wish to specify children companies to be searched for data." +msgid "Check if you wish to specify several companies to be searched for data." msgstr "" #. module: mis_builder @@ -426,21 +454,11 @@ msgstr "" msgid "Columns {} and {} are not comparable" msgstr "" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_ids -msgid "Companies" -msgstr "" - #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_instance__query_company_ids msgid "Companies for which data will be searched." msgstr "" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__company_id -msgid "Company" -msgstr "Bolag" - #. module: mis_builder #: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period__source_cmpcol_to_id msgid "Compare" @@ -558,8 +576,12 @@ msgstr "Beskrivning" #. module: mis_builder #: model:ir.model.fields,help:mis_builder.field_mis_report_kpi__accumulation_method msgid "" -"Determines how values of this kpi spanning over a time period are transformed to match the reporting period. Sum: values of shorter period are added, values of longest or partially overlapping periods are adjusted pro-rata temporis.\n" -"Average: values of included period are averaged with a pro-rata temporis weight." +"Determines how values of this kpi spanning over a time period are " +"transformed to match the reporting period. Sum: values of shorter period are " +"added, values of longest or partially overlapping periods are adjusted pro-" +"rata temporis.\n" +"Average: values of included period are averaged with a pro-rata temporis " +"weight." msgstr "" #. module: mis_builder @@ -634,6 +656,11 @@ msgstr "" msgid "Duration" msgstr "" +#. module: mis_builder +#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids +msgid "Effective companies" +msgstr "" + #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "Enter expression here, for example balp[70%]. See also help tab." @@ -676,7 +703,8 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "" "Expressions can involve other KPI, sub KPI and\n" -" query results by name (eg kpi1 + kpi2,\n" +" query results by name (eg kpi1 + " +"kpi2,\n" " kpi2.subkpi1, query1.field1)." msgstr "" @@ -895,7 +923,8 @@ msgid "" "This can be fixed by either:\n" "\t- Changing the KPI value to a tuple of length {}\n" "or\n" -"\t- Changing the KPI to `multi` mode and giving an explicit value for each sub-KPI." +"\t- Changing the KPI to `multi` mode and giving an explicit value for each " +"sub-KPI." msgstr "" #. module: mis_builder @@ -1201,7 +1230,6 @@ msgstr "" #. module: mis_builder #: code:addons/mis_builder/models/mis_report.py:0 -#: code:addons/mis_builder/models/mis_report.py:0 #: model:ir.model.fields.selection,name:mis_builder.selection__mis_report_kpi__accumulation_method__none #: model:ir.model.fields.selection,name:mis_builder.selection__mis_report_kpi__compare_method__none #, python-format @@ -1248,7 +1276,6 @@ msgstr "" #. module: mis_builder #: code:addons/mis_builder/models/mis_report.py:0 -#: code:addons/mis_builder/models/mis_report.py:0 #: model:ir.model.fields.selection,name:mis_builder.selection__mis_report_kpi__compare_method__pct #: model:ir.model.fields.selection,name:mis_builder.selection__mis_report_kpi__type__pct #, python-format @@ -1314,11 +1341,6 @@ msgstr "Skriv ut" msgid "Queries" msgstr "" -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance__query_company_ids -msgid "Query Company" -msgstr "" - #. module: mis_builder #: code:addons/mis_builder/models/mis_report.py:0 #, python-format @@ -1532,7 +1554,6 @@ msgstr "" #. module: mis_builder #: code:addons/mis_builder/models/mis_report.py:0 -#: code:addons/mis_builder/models/mis_report.py:0 #: model:ir.model.fields.selection,name:mis_builder.selection__mis_report_kpi__accumulation_method__sum #: model:ir.model.fields.selection,name:mis_builder.selection__mis_report_query__aggregate__sum #, python-format @@ -1588,7 +1609,8 @@ msgstr "" msgid "" "The\n" " account selector\n" -" is a like expression on the account code (eg\n" +" is a like expression on the " +"account code (eg\n" " 70%, etc)." msgstr "" @@ -1597,16 +1619,19 @@ msgstr "" msgid "" "The\n" " journal items domain\n" -" is an Odoo domain filter on journal items." +" is an Odoo domain filter on " +"journal items." msgstr "" #. module: mis_builder #: model_terms:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form msgid "" "The following special elements are recognized in\n" -" the expressions to compute accounting data:\n" +" the expressions to compute " +"accounting data:\n" " \n" -" {bal|crd|deb|pbal|nbal}{pieu}[account\n" +" {bal|crd|deb|pbal|nbal}{pieu}" +"[account\n" " selector][journal items domain]\n" " \n" " ." @@ -1630,6 +1655,12 @@ msgstr "" msgid "Unexpected accumulation method %s for %s." msgstr "" +#. module: mis_builder +#: code:addons/mis_builder/models/mis_report.py:0 +#, python-format +msgid "Unexpected value %s for target_move." +msgstr "" + #. module: mis_builder #: code:addons/mis_builder/models/prorata_read_group_mixin.py:0 #, python-format @@ -1750,3 +1781,6 @@ msgstr "" #: model:ir.model.fields.selection,name:mis_builder.selection__mis_report_style__font_size__xx-small msgid "xx-small" msgstr "" + +#~ msgid "Company" +#~ msgstr "Bolag" diff --git a/mis_builder/models/aep.py b/mis_builder/models/aep.py index 83995f4..9eb07d8 100644 --- a/mis_builder/models/aep.py +++ b/mis_builder/models/aep.py @@ -22,7 +22,7 @@ _DOMAIN_START_RE = re.compile(r"\(|(['\"])[!&|]\1") def _is_domain(s): - """ Test if a string looks like an Flectra domain """ + """Test if a string looks like an Flectra domain""" return _DOMAIN_START_RE.match(s) @@ -189,7 +189,7 @@ class AccountingExpressionProcessor(object): self._map_account_ids[key].add(acc_domain) def done_parsing(self): - """ Replace account domains by account ids in map """ + """Replace account domains by account ids in map""" for key, acc_domains in self._map_account_ids.items(): all_account_ids = set() for acc_domain in acc_domains: @@ -217,9 +217,7 @@ class AccountingExpressionProcessor(object): account_ids.update(self._account_ids_by_acc_domain[acc_domain]) return account_ids - def get_aml_domain_for_expr( - self, expr, date_from, date_to, target_move, account_id=None - ): + def get_aml_domain_for_expr(self, expr, date_from, date_to, account_id=None): """Get a domain on account.move.line for an expression. Prerequisite: done_parsing() must have been invoked. @@ -248,14 +246,14 @@ class AccountingExpressionProcessor(object): aml_domains.append(expression.normalize_domain(aml_domain)) if mode not in date_domain_by_mode: date_domain_by_mode[mode] = self.get_aml_domain_for_dates( - date_from, date_to, mode, target_move + date_from, date_to, mode ) assert aml_domains # TODO we could do this for more precision: # AND(OR(aml_domains[mode]), date_domain[mode]) for each mode return expression.OR(aml_domains) + expression.OR(date_domain_by_mode.values()) - def get_aml_domain_for_dates(self, date_from, date_to, mode, target_move): + def get_aml_domain_for_dates(self, date_from, date_to, mode): if mode == self.MODE_VARIATION: domain = [("date", ">=", date_from), ("date", "<=", date_to)] elif mode in (self.MODE_INITIAL, self.MODE_END): @@ -288,8 +286,6 @@ class AccountingExpressionProcessor(object): ("date", "<", fields.Date.to_string(fy_date_from)), ("account_id.user_type_id.include_initial_balance", "=", False), ] - if target_move == "posted": - domain.append(("move_id.state", "=", "posted")) return expression.normalize_domain(domain) def _get_company_rates(self, date): @@ -308,7 +304,6 @@ class AccountingExpressionProcessor(object): self, date_from, date_to, - target_move="posted", additional_move_line_filter=None, aml_model=None, ): @@ -335,7 +330,7 @@ class AccountingExpressionProcessor(object): continue if mode not in domain_by_mode: domain_by_mode[mode] = self.get_aml_domain_for_dates( - date_from, date_to, mode, target_move + date_from, date_to, mode ) domain = list(domain) + domain_by_mode[mode] domain.append(("account_id", "in", self._map_account_ids[key])) @@ -472,7 +467,7 @@ class AccountingExpressionProcessor(object): yield account_id, [self._ACC_RE.sub(f, expr) for expr in exprs] @classmethod - def _get_balances(cls, mode, companies, date_from, date_to, target_move="posted"): + def _get_balances(cls, mode, companies, date_from, date_to): expr = "deb{mode}[], crd{mode}[]".format(mode=mode) aep = AccountingExpressionProcessor(companies) # disable smart_end to have the data at once, instead @@ -480,11 +475,11 @@ class AccountingExpressionProcessor(object): aep.smart_end = False aep.parse_expr(expr) aep.done_parsing() - aep.do_queries(date_from, date_to, target_move) + aep.do_queries(date_from, date_to) return aep._data[((), mode)] @classmethod - def get_balances_initial(cls, companies, date, target_move="posted"): + def get_balances_initial(cls, companies, date): """A convenience method to obtain the initial balances of all accounts at a given date. @@ -492,14 +487,13 @@ class AccountingExpressionProcessor(object): :param companies: :param date: - :param target_move: if 'posted', consider only posted moves Returns a dictionary: {account_id, (debit, credit)} """ - return cls._get_balances(cls.MODE_INITIAL, companies, date, date, target_move) + return cls._get_balances(cls.MODE_INITIAL, companies, date, date) @classmethod - def get_balances_end(cls, companies, date, target_move="posted"): + def get_balances_end(cls, companies, date): """A convenience method to obtain the ending balances of all accounts at a given date. @@ -507,43 +501,34 @@ class AccountingExpressionProcessor(object): :param companies: :param date: - :param target_move: if 'posted', consider only posted moves Returns a dictionary: {account_id, (debit, credit)} """ - return cls._get_balances(cls.MODE_END, companies, date, date, target_move) + return cls._get_balances(cls.MODE_END, companies, date, date) @classmethod - def get_balances_variation( - cls, companies, date_from, date_to, target_move="posted" - ): + def get_balances_variation(cls, companies, date_from, date_to): """A convenience method to obtain the variation of the balances of all accounts over a period. :param companies: :param date: - :param target_move: if 'posted', consider only posted moves Returns a dictionary: {account_id, (debit, credit)} """ - return cls._get_balances( - cls.MODE_VARIATION, companies, date_from, date_to, target_move - ) + return cls._get_balances(cls.MODE_VARIATION, companies, date_from, date_to) @classmethod - def get_unallocated_pl(cls, companies, date, target_move="posted"): + def get_unallocated_pl(cls, companies, date): """A convenience method to obtain the unallocated profit/loss of the previous fiscal years at a given date. :param companies: :param date: - :param target_move: if 'posted', consider only posted moves Returns a tuple (debit, credit) """ # TODO shoud we include here the accounts of type "unaffected" # or leave that to the caller? - bals = cls._get_balances( - cls.MODE_UNALLOCATED, companies, date, date, target_move - ) + bals = cls._get_balances(cls.MODE_UNALLOCATED, companies, date, date) return tuple(map(sum, zip(*bals.values()))) diff --git a/mis_builder/models/expression_evaluator.py b/mis_builder/models/expression_evaluator.py index a98ac4e..94ff403 100644 --- a/mis_builder/models/expression_evaluator.py +++ b/mis_builder/models/expression_evaluator.py @@ -15,14 +15,12 @@ class ExpressionEvaluator(object): aep, date_from, date_to, - target_move=None, additional_move_line_filter=None, aml_model=None, ): self.aep = aep self.date_from = date_from self.date_to = date_to - self.target_move = target_move self.additional_move_line_filter = additional_move_line_filter self.aml_model = aml_model self._aep_queries_done = False @@ -32,7 +30,6 @@ class ExpressionEvaluator(object): self.aep.do_queries( self.date_from, self.date_to, - self.target_move, self.additional_move_line_filter, self.aml_model, ) diff --git a/mis_builder/models/mis_report.py b/mis_builder/models/mis_report.py index c794bf2..423d6ee 100644 --- a/mis_builder/models/mis_report.py +++ b/mis_builder/models/mis_report.py @@ -1,4 +1,5 @@ # Copyright 2014 ACSONE SA/NV () +# Copyright 2020 CorporateHub (https://corporatehub.eu) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). import datetime @@ -77,7 +78,7 @@ class MisReportKpi(models.Model): _name = "mis.report.kpi" _description = "MIS Report KPI" - name = fields.Char(size=32, required=True, string="Name") + name = fields.Char(required=True, string="Name") description = fields.Char(required=True, string="Description", translate=True) multi = fields.Boolean() expression = fields.Char( @@ -215,7 +216,7 @@ class MisReportKpi(models.Model): @api.onchange("description") def _onchange_description(self): - """ construct name from description """ + """construct name from description""" if self.description and not self.name: self.name = _python_var(self.description) @@ -262,7 +263,7 @@ class MisReportSubkpi(models.Model): report_id = fields.Many2one( comodel_name="mis.report", required=True, ondelete="cascade" ) - name = fields.Char(size=32, required=True, string="Name") + name = fields.Char(required=True, string="Name") description = fields.Char(required=True, string="Description", translate=True) expression_ids = fields.One2many("mis.report.kpi.expression", "subkpi_id") @@ -278,7 +279,7 @@ class MisReportSubkpi(models.Model): @api.onchange("description") def _onchange_description(self): - """ construct name from description """ + """construct name from description""" if self.description and not self.name: self.name = _python_var(self.description) @@ -373,7 +374,7 @@ class MisReportQuery(models.Model): field_names = [field.name for field in record.field_ids] record.field_names = ", ".join(field_names) - name = fields.Char(size=32, required=True, string="Name") + name = fields.Char(required=True, string="Name") model_id = fields.Many2one( "ir.model", required=True, string="Model", ondelete="cascade" ) @@ -796,7 +797,6 @@ class MisReport(models.Model): aep, date_from, date_to, - target_move, subkpis_filter=None, get_additional_move_line_filter=None, get_additional_query_filter=None, @@ -812,7 +812,6 @@ class MisReport(models.Model): aep, date_from, date_to, - target_move, get_additional_move_line_filter() if get_additional_move_line_filter else None, @@ -906,7 +905,7 @@ class MisReport(models.Model): ) def get_kpis_by_account_id(self, company): - """ Return { account_id: set(kpi) } """ + """Return { account_id: set(kpi) }""" aep = self._prepare_aep(company) res = defaultdict(set) for kpi in self.kpi_ids: @@ -918,6 +917,31 @@ class MisReport(models.Model): res[account_id].add(kpi) return res + @api.model + def _supports_target_move_filter(self, aml_model_name): + return "parent_state" in self.env[aml_model_name]._fields + + @api.model + def _get_target_move_domain(self, target_move, aml_model_name): + """ + Obtain a domain to apply on a move-line-like model, to get posted + entries or return all of them (always excluding cancelled entries). + + :param: target_move: all|posted + :param: aml_model_name: an optional move-line-like model name + (defaults to accaount.move.line) + """ + if not self._supports_target_move_filter(aml_model_name): + return [] + + if target_move == "posted": + return [("parent_state", "=", "posted")] + elif target_move == "all": + # all (in Flectra 13+, there is also the cancel state that we must ignore) + return [("parent_state", "in", ("posted", "draft"))] + else: + raise UserError(_("Unexpected value %s for target_move.") % (target_move,)) + def evaluate( self, aep, @@ -936,7 +960,7 @@ class MisReport(models.Model): :param date_from, date_to: the starting and ending date :param target_move: all|posted :param aml_model: the name of a model that is compatible with - account.move.line + account.move.line (default: account.move.line) :param subkpis_filter: a list of subkpis to include in the evaluation (if empty, use all subkpis) :param get_additional_move_line_filter: a bound method that takes @@ -952,17 +976,21 @@ class MisReport(models.Model): these should be ignored as they might be removed in the future. """ + additional_move_line_filter = self._get_target_move_domain( + target_move, aml_model or "account.move.line" + ) + if get_additional_move_line_filter: + additional_move_line_filter.extend(get_additional_move_line_filter()) expression_evaluator = ExpressionEvaluator( aep, date_from, date_to, - target_move, - get_additional_move_line_filter() - if get_additional_move_line_filter - else None, + additional_move_line_filter, aml_model, ) - return self._evaluate(expression_evaluator, subkpis_filter) + return self._evaluate( + expression_evaluator, subkpis_filter, get_additional_query_filter + ) def _evaluate( self, diff --git a/mis_builder/models/mis_report_instance.py b/mis_builder/models/mis_report_instance.py index 8ba21ff..3a1847d 100644 --- a/mis_builder/models/mis_report_instance.py +++ b/mis_builder/models/mis_report_instance.py @@ -1,4 +1,5 @@ # Copyright 2014 ACSONE SA/NV () +# Copyright 2020 CorporateHub (https://corporatehub.eu) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). import datetime @@ -174,7 +175,7 @@ class MisReportInstancePeriod(models.Model): _name = "mis.report.instance.period" _description = "MIS Report Instance Period" - name = fields.Char(size=32, required=True, string="Label", translate=True) + name = fields.Char(required=True, string="Label", translate=True) mode = fields.Selection( [ (MODE_FIX, "Fixed dates"), @@ -411,11 +412,13 @@ class MisReportInstancePeriod(models.Model): compatible with account.move.line.""" self.ensure_one() domain = self._get_filter_domain_from_context() - if ( - self._get_aml_model_name() == "account.move.line" - and self.report_instance_id.target_move == "posted" - ): - domain.extend([("move_id.state", "=", "posted")]) + aml_model_name = self._get_aml_model_name() + if aml_model_name: + domain.extend( + self.report_id._get_target_move_domain( + self.report_instance_id.target_move, aml_model_name + ) + ) if self.analytic_account_id: domain.append(("analytic_account_id", "=", self.analytic_account_id.id)) if self.analytic_group_id: @@ -527,22 +530,22 @@ class MisReportInstance(models.Model): ) company_id = fields.Many2one( comodel_name="res.company", - string="Company", + string="Allowed company", default=lambda self: self.env.company, - required=True, + required=False, ) multi_company = fields.Boolean( string="Multiple companies", - help="Check if you wish to specify " - "children companies to be searched for data.", + help="Check if you wish to specify several companies to be searched for data.", default=False, ) company_ids = fields.Many2many( comodel_name="res.company", - string="Companies", + string="Allowed companies", help="Select companies for which data will be searched.", ) query_company_ids = fields.Many2many( + string="Effective companies", comodel_name="res.company", compute="_compute_query_company_ids", help="Companies for which data will be searched.", @@ -578,22 +581,36 @@ class MisReportInstance(models.Model): ) hide_analytic_filters = fields.Boolean(default=True) - @api.onchange("company_id", "multi_company") + @api.onchange("multi_company") def _onchange_company(self): - if self.company_id and self.multi_company: - self.company_ids = self.env["res.company"].search( - [("id", "child_of", self.company_id.id)] - ) + if self.multi_company: + self.company_ids |= self.company_id + self.company_id = False else: + prev = self.company_ids.ids + company = False + if self.env.company.id in prev: + company = self.env.company + else: + for c_id in prev: + if c_id in self.env.companies.ids: + company = self.env["res.company"].browse(c_id) + break + + self.company_id = company self.company_ids = False @api.depends("multi_company", "company_id", "company_ids") + @api.depends_context("allowed_company_ids") def _compute_query_company_ids(self): for rec in self: if rec.multi_company: - rec.query_company_ids = rec.company_ids or rec.company_id + if not rec.company_ids: + rec.query_company_ids = self.env.companies + else: + rec.query_company_ids = rec.company_ids & self.env.companies else: - rec.query_company_ids = rec.company_id + rec.query_company_ids = rec.company_id or self.env.company @api.model def get_filter_descriptions_from_context(self): @@ -776,7 +793,6 @@ class MisReportInstance(models.Model): aep, period.date_from, period.date_to, - None, # target_move now part of additional_move_line_filter period._get_additional_move_line_filter(), period._get_aml_model_name(), ) @@ -870,7 +886,6 @@ class MisReportInstance(models.Model): expr, period.date_from, period.date_to, - None, # target_move now part of additional_move_line_filter account_id, ) domain.extend(period._get_additional_move_line_filter()) diff --git a/mis_builder/models/mis_report_style.py b/mis_builder/models/mis_report_style.py index 6fac240..a486cf7 100644 --- a/mis_builder/models/mis_report_style.py +++ b/mis_builder/models/mis_report_style.py @@ -1,5 +1,6 @@ # Copyright 2016 Therp BV () # Copyright 2016 ACSONE SA/NV () +# Copyright 2020 CorporateHub (https://corporatehub.eu) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). import sys @@ -111,9 +112,9 @@ class MisReportKpiStyle(models.Model): indent_level = fields.Integer() # number format prefix_inherit = fields.Boolean(default=True) - prefix = fields.Char(size=16, string="Prefix") + prefix = fields.Char(string="Prefix") suffix_inherit = fields.Boolean(default=True) - suffix = fields.Char(size=16, string="Suffix") + suffix = fields.Char(string="Suffix") dp_inherit = fields.Boolean(default=True) dp = fields.Integer(string="Rounding", default=0) divider_inherit = fields.Boolean(default=True) diff --git a/mis_builder/security/mis_builder_security.xml b/mis_builder/security/mis_builder_security.xml index f755665..cf4d64b 100644 --- a/mis_builder/security/mis_builder_security.xml +++ b/mis_builder/security/mis_builder_security.xml @@ -4,7 +4,8 @@ Mis Report Instance multi company - ['|',('company_id','=',False),('company_id','in',company_ids)] + ['|',('company_id','=',False),('company_id','in',company_ids), '|', + ('company_ids', '=', False), ('company_ids', 'in', company_ids)] diff --git a/mis_builder/static/description/index.html b/mis_builder/static/description/index.html index 9d39660..b8c0cc2 100644 --- a/mis_builder/static/description/index.html +++ b/mis_builder/static/description/index.html @@ -376,49 +376,51 @@ can be added to Odoo dashboards.

Table of contents

-

Installation

+

Installation

Your preferred way to install addons will work with MIS Builder.

An easy way to install it with all its dependencies is using pip:

    @@ -428,7 +430,7 @@ the MIS Builder application.
-

Usage

+

Usage

To configure this module, you need to:

  • Go to Accounting > Configuration > MIS Reporting > MIS Report Templates where @@ -454,7 +456,7 @@ and export it to PDF or Excel.
-

Development

+

Development

A typical extension is to provide a mechanism to filter reports on analytic dimensions or operational units. To implement this, you can override _get_additional_move_line_filter and _get_additional_filter to further filter move lines or queries based on a user @@ -463,29 +465,57 @@ or even on mis.report.instance.period if you want different columns to show diff analytic accounts.

-

Known issues / Roadmap

+

Known issues / Roadmap

The mis_builder roadmap and known issues can be found on GitHub.

-

Changelog

-

14.0.3.6.7 (2021-06-02) -Bugfixes

+

Changelog

+
+

14.0.4.0.0 (2022-01-08)

+

Features

+
    +
  • Remove various field size limits. (#332)
  • +
+

Bugfixes

+
    +
  • Support for the Odoo 13+ multi-company model. In multi-company mode, several allowed +companies can be declared on MIS Report instances, and the report operates on the +intersection of report companies and companies selected in the user context. (#327)

    +
  • +
  • The get_additional_query_filter argument of evaluate() is now propagated +correctly. (#375)

    +
  • +
  • Use the parent_state field of account.move.line to filter entries in posted +and draft state only. Before, when reporting in draft mode, all entries were used +(i.e. there was no filter), and that started including the cancelled entries/invoices in +Odoo 13.+.

    +

    This change also contains a breaking change in the internal API. For quite a while +the target_move argument of AEP and other methods was not used by MIS Builder itself +and was kept for backward compatibility. To avoid rippling effects of the necessary +change to use parent_state, we now remove this argument. (#377)

    +
  • +
+
+
+

14.0.3.6.7 (2021-06-02)

+

Bugfixes

  • When on a MIS Report Instance, if you wanted to generate a new line of type comparison, you couldn’t currently select any existing period to compare. This happened because the field domain was searching in a NewId context, thus not finding a correct period. Changing the domain and making it use a computed field with a search for the _origin record solves the problem. (#361)
- +
+

14.0.3.6.6 (2021-04-23)

Bugfixes

  • Fix drilldown action name when the account model has been customized. (#350)
-
-

14.0.3.6.5 (2021-04-23)

+
+

14.0.3.6.5 (2021-04-23)

Bugfixes

  • While duplicating a MIS report instance, comparison columns are ignored because @@ -493,8 +523,8 @@ they would raise an error otherwise, as they keep the old source_cmpcol_from_id and source_cmpcol_to_id from the original record. (#343)
-
-

14.0.3.6.4 (2021-04-06)

+
+

14.0.3.6.4 (2021-04-06)

Features

  • The drilldown action name displayed on the breadcrumb has been revised. @@ -504,8 +534,8 @@ of the kpi’s technical definition. (#320)
-
-

13.0.3.6.3 (2020-08-28)

+
+

13.0.3.6.3 (2020-08-28)

Bugfixes

  • Having a “Compare columns” added on a KPI with an associated style using a @@ -517,23 +547,23 @@ when exporting to XLSX. (#280, #296
-
-

13.0.3.6.2 (2020-04-22)

+
+

13.0.3.6.2 (2020-04-22)

Bugfixes

  • The “Settings” button is now displayed for users with the “Show full accounting features” right when previewing a report. (#281)
-
-

13.0.3.6.1 (2020-04-22)

+
+

13.0.3.6.1 (2020-04-22)

Bugfixes

  • Fix TypeError: 'module' object is not iterable when using budgets by account. (#276)
-
-

13.0.3.6.0 (2020-03-28)

+
+

13.0.3.6.0 (2020-03-28)

Features

  • Add column-level filters on analytic account and analytic tags. @@ -548,12 +578,12 @@ Sheet” to create new KPI’s for the ratios (e.g. balance_sheet.current_assets balance_sheet.total_assets). (#155)
-
-

13.0.3.5.0 (2020-01-??)

+
+

13.0.3.5.0 (2020-01-??)

Migration to odoo 13.0.

-
-

12.0.3.5.0 (2019-10-26)

+
+

12.0.3.5.0 (2019-10-26)

Features

  • The account_id field of the model selected in ‘Move lines source’ @@ -583,8 +613,8 @@ style. (#220)
-
-

12.0.3.4.0 (2019-07-09)

+
+

12.0.3.4.0 (2019-07-09)

Features

  • New year-to-date mode for defining periods. (#165)
  • @@ -602,8 +632,8 @@ non-multi expressions yield tuples of incorrect lenght. (#192)
-
-

12.0.3.3.0 (2019-01-26)

+
+

12.0.3.3.0 (2019-01-26)

Features

Dynamic analytic filters in report preview are not yet available in 11, this requires an update to the JS widget that proved difficult to implement @@ -643,8 +673,8 @@ is checked, as for all other syle elements. (#121 <https://github.com/O

If you use Actuals (alternative) data source in combination with analytic filters, the underlying model must now have an analytic_account_id field.

-
-

11.0.3.2.2 (2018-06-30)

+
+

11.0.3.2.2 (2018-06-30)

  • [FIX] Fix bug in company_default_get call returning id instead of recordset @@ -655,16 +685,16 @@ need to be displayed). (#46)
-
-

11.0.3.2.1 (2018-05-29)

+
+

11.0.3.2.1 (2018-05-29)

  • [FIX] Missing comparison operator for AccountingNone leading to errors in pbal computations (#93)
-
-

10.0.3.2.0 (2018-05-02)

+
+

10.0.3.2.0 (2018-05-02)

  • [FIX] make subkpi ordering deterministic (#71)
  • @@ -678,13 +708,13 @@ resp positive balances) (#86)
-
-

11.0.3.1.2 (2018-02-04)

+
+

11.0.3.1.2 (2018-02-04)

Migration to Odoo 11. No new feature. (#67)

-
-

10.0.3.1.1 (2017-11-14)

+
+

10.0.3.1.1 (2017-11-14)

New features:

  • [ADD] month and year relative periods, easier to use than @@ -721,24 +751,24 @@ created (not yet saved) report instances.
  • Alternative move line data sources must have a company_id field.
-
-

10.0.3.0.4 (2017-10-14)

+
+

10.0.3.0.4 (2017-10-14)

Bug fix:

  • [FIX] issue with initial balance rounding. #30
-
-

10.0.3.0.3 (2017-10-03)

+
+

10.0.3.0.3 (2017-10-03)

Bug fix:

  • [FIX] fix error saving KPI on newly created reports. #18
-
-

10.0.3.0.2 (2017-10-01)

+
+

10.0.3.0.2 (2017-10-01)

New features:

  • [ADD] Alternative move line source per report column. @@ -782,7 +812,7 @@ expressions were used in a KPI
-

10.0.2.0.3 (unreleased)

+

10.0.2.0.3 (unreleased)

  • [IMP] more robust behaviour in presence of missing expressions
  • [FIX] indent style
  • @@ -794,23 +824,23 @@ reports with no objects
  • [IMP] provide full access to mis builder style for group Adviser.
-
-

9.0.2.0.2 (2016-09-27)

+
+

9.0.2.0.2 (2016-09-27)

  • [IMP] Add refresh button in mis report preview.
  • [IMP] Widget code changes to allow to add fields in the widget more easily.
-
-

9.0.2.0.1 (2016-05-26)

+
+

9.0.2.0.1 (2016-05-26)

  • [IMP] remove unused argument in declare_and_compute_period() for a cleaner API. This is a breaking API changing merged in urgency before it is used by other modules.
-
-

9.0.2.0.0 (2016-05-24)

+
+

9.0.2.0.0 (2016-05-24)

Part of the work for this release has been done at the Sorrento sprint April 26-29, 2016. The rest (ie a major refactoring) has been done in the weeks after.

@@ -857,8 +887,8 @@ flexible alternative to fiscal periods consolidation accounts have been removed
-
-

8.0.1.0.0 (2016-04-27)

+
+

8.0.1.0.0 (2016-04-27)

-
-

8.0.0.2.0

+
+

8.0.0.2.0

Pre-history. Or rather, you need to look at the git log.

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed @@ -896,15 +926,15 @@ If you spotted it first, help us smashing it by providing a detailed and welcome

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • ACSONE SA/NV
-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association

OCA, or the Odoo Community Association, is a nonprofit organization whose diff --git a/mis_builder/tests/__init__.py b/mis_builder/tests/__init__.py index 1174376..4263953 100644 --- a/mis_builder/tests/__init__.py +++ b/mis_builder/tests/__init__.py @@ -13,4 +13,5 @@ from . import test_mis_safe_eval from . import test_period_dates from . import test_render from . import test_simple_array +from . import test_target_move from . import test_utc_midnight diff --git a/mis_builder/tests/test_aep.py b/mis_builder/tests/test_aep.py index add3b06..9d5e167 100644 --- a/mis_builder/tests/test_aep.py +++ b/mis_builder/tests/test_aep.py @@ -132,7 +132,6 @@ class TestAEP(common.TransactionCase): self.aep.do_queries( date_from=fields.Date.to_string(date_from), date_to=fields.Date.to_string(date_to), - target_move="posted", ) def _eval(self, expr): @@ -264,9 +263,7 @@ class TestAEP(common.TransactionCase): self.assertEqual(end, {self.account_ar.id: 900, self.account_in.id: -800}) def test_aep_convenience_methods(self): - initial = AEP.get_balances_initial( - self.company, time.strftime("%Y") + "-03-01", "posted" - ) + initial = AEP.get_balances_initial(self.company, time.strftime("%Y") + "-03-01") self.assertEqual( initial, {self.account_ar.id: (400, 0), self.account_in.id: (0, 300)} ) @@ -274,19 +271,16 @@ class TestAEP(common.TransactionCase): self.company, time.strftime("%Y") + "-03-01", time.strftime("%Y") + "-03-31", - "posted", ) self.assertEqual( variation, {self.account_ar.id: (500, 0), self.account_in.id: (0, 500)} ) - end = AEP.get_balances_end( - self.company, time.strftime("%Y") + "-03-31", "posted" - ) + end = AEP.get_balances_end(self.company, time.strftime("%Y") + "-03-31") self.assertEqual( end, {self.account_ar.id: (900, 0), self.account_in.id: (0, 800)} ) unallocated = AEP.get_unallocated_pl( - self.company, time.strftime("%Y") + "-03-15", "posted" + self.company, time.strftime("%Y") + "-03-15" ) self.assertEqual(unallocated, (0, 100)) @@ -300,9 +294,7 @@ class TestAEP(common.TransactionCase): debit_acc=self.account_in, credit_acc=self.account_ar, ) - initial = AEP.get_balances_initial( - self.company, time.strftime("%Y") + "-01-01", "posted" - ) + initial = AEP.get_balances_initial(self.company, time.strftime("%Y") + "-01-01") self.assertEqual(initial, {self.account_ar.id: (100.00, 100.01)}) # make initial balance at Jan 1st equal to 0.001 self._create_move( @@ -311,9 +303,7 @@ class TestAEP(common.TransactionCase): debit_acc=self.account_ar, credit_acc=self.account_in, ) - initial = AEP.get_balances_initial( - self.company, time.strftime("%Y") + "-01-01", "posted" - ) + initial = AEP.get_balances_initial(self.company, time.strftime("%Y") + "-01-01") # epsilon initial balances is reported as empty self.assertEqual(initial, {}) @@ -332,24 +322,18 @@ class TestAEP(common.TransactionCase): def test_get_aml_domain_for_expr(self): self.aep.done_parsing() expr = "balp[700IN]" - domain = self.aep.get_aml_domain_for_expr( - expr, "2017-01-01", "2017-03-31", target_move="posted" - ) + domain = self.aep.get_aml_domain_for_expr(expr, "2017-01-01", "2017-03-31") self.assertEqual( domain, [ ("account_id", "in", (self.account_in.id,)), "&", - "&", ("date", ">=", "2017-01-01"), ("date", "<=", "2017-03-31"), - ("move_id.state", "=", "posted"), ], ) expr = "debi[700IN] - crdi[400AR]" - domain = self.aep.get_aml_domain_for_expr( - expr, "2017-02-01", "2017-03-31", target_move="draft" - ) + domain = self.aep.get_aml_domain_for_expr(expr, "2017-02-01", "2017-03-31") self.assertEqual( domain, [ diff --git a/mis_builder/tests/test_mis_report_instance.py b/mis_builder/tests/test_mis_report_instance.py index 2c8a4a1..c991128 100644 --- a/mis_builder/tests/test_mis_report_instance.py +++ b/mis_builder/tests/test_mis_report_instance.py @@ -494,6 +494,32 @@ class TestMisReportInstance(common.HttpCase): r = self.env["mis.report.kpi.expression"].name_search("k4") self.assertEqual([i[1] for i in r], ["kpi 4 (k4)"]) + def test_query_company_ids(self): + # sanity check single company mode + assert not self.report_instance.multi_company + assert self.report_instance.company_id + assert self.report_instance.query_company_ids == self.report_instance.company_id + # create a second company + c1 = self.report_instance.company_id + c2 = self.env["res.company"].create( + dict( + name="company 2", + ) + ) + self.report_instance.write(dict(multi_company=True, company_id=False)) + self.report_instance.company_ids |= c1 + self.report_instance.company_ids |= c2 + assert len(self.report_instance.company_ids) == 2 + assert self.report_instance.query_company_ids == self.env.companies + # In a user context where there is only one company, ensure + # query_company_ids only has one company too. + assert ( + self.report_instance.with_context( + allowed_company_ids=(c1.id,) + ).query_company_ids + == c1 + ) + def test_multi_company_onchange(self): # not multi company self.assertTrue(self.report_instance.company_id) @@ -506,25 +532,22 @@ class TestMisReportInstance(common.HttpCase): self.env["res.company"].create( dict(name="company 2", parent_id=self.report_instance.company_id.id) ) - companies = self.env["res.company"].search( - [("id", "child_of", self.report_instance.company_id.id)] - ) self.report_instance.multi_company = True # multi company, company_ids not set - self.assertEqual( - self.report_instance.query_company_ids[0], self.report_instance.company_id - ) + self.assertEqual(self.report_instance.query_company_ids, self.env.companies) # set company_ids + previous_company = self.report_instance.company_id self.report_instance._onchange_company() + self.assertFalse(self.report_instance.company_id) self.assertTrue(self.report_instance.multi_company) - self.assertEqual(self.report_instance.company_ids, companies) - self.assertEqual(self.report_instance.query_company_ids, companies) + self.assertEqual(self.report_instance.company_ids, previous_company) + self.assertEqual(self.report_instance.query_company_ids, previous_company) # reset single company mode self.report_instance.multi_company = False + self.report_instance._onchange_company() self.assertEqual( self.report_instance.query_company_ids[0], self.report_instance.company_id ) - self.report_instance._onchange_company() self.assertFalse(self.report_instance.company_ids) def test_mis_report_analytic_filters(self): diff --git a/mis_builder/tests/test_multi_company_aep.py b/mis_builder/tests/test_multi_company_aep.py index 39c7969..e5cd0e0 100644 --- a/mis_builder/tests/test_multi_company_aep.py +++ b/mis_builder/tests/test_multi_company_aep.py @@ -139,7 +139,6 @@ class TestMultiCompanyAEP(common.TransactionCase): aep.do_queries( date_from=fields.Date.to_string(date_from), date_to=fields.Date.to_string(date_to), - target_move="posted", ) return aep diff --git a/mis_builder/tests/test_target_move.py b/mis_builder/tests/test_target_move.py new file mode 100644 index 0000000..cd2e18e --- /dev/null +++ b/mis_builder/tests/test_target_move.py @@ -0,0 +1,36 @@ +# Copyright 2016 ACSONE SA/NV () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +import flectra.tests.common as common + + +class TestMisReportInstance(common.TransactionCase): + def test_supports_target_move_filter(self): + self.assertTrue( + self.env["mis.report"]._supports_target_move_filter("account.move.line") + ) + + def test_supports_target_move_filter_no_parent_state(self): + self.assertFalse( + self.env["mis.report"]._supports_target_move_filter("account.move") + ) + + def test_target_move_domain_posted(self): + self.assertEqual( + self.env["mis.report"]._get_target_move_domain( + "posted", "account.move.line" + ), + [("parent_state", "=", "posted")], + ) + + def test_target_move_domain_all(self): + self.assertEqual( + self.env["mis.report"]._get_target_move_domain("all", "account.move.line"), + [("parent_state", "in", ("posted", "draft"))], + ) + + def test_target_move_domain_no_parent_state(self): + """Test get_target_move_domain on a model that has no parent_state.""" + self.assertEqual( + self.env["mis.report"]._get_target_move_domain("all", "account.move"), [] + ) diff --git a/mis_builder/views/mis_report_instance.xml b/mis_builder/views/mis_report_instance.xml index 18f6063..a54a602 100644 --- a/mis_builder/views/mis_report_instance.xml +++ b/mis_builder/views/mis_report_instance.xml @@ -161,20 +161,25 @@ + ) +# Copyright 2020 CorporateHub (https://corporatehub.eu) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from lxml import etree @@ -10,7 +11,7 @@ class AddMisReportInstanceDashboard(models.TransientModel): _name = "add.mis.report.instance.dashboard.wizard" _description = "MIS Report Add to Dashboard Wizard" - name = fields.Char("Name", size=32, required=True) + name = fields.Char("Name", required=True) dashboard_id = fields.Many2one( "ir.actions.act_window", diff --git a/mis_builder_budget/README.rst b/mis_builder_budget/README.rst index fff0712..b7430ae 100644 --- a/mis_builder_budget/README.rst +++ b/mis_builder_budget/README.rst @@ -85,6 +85,20 @@ be found on GitHub. Changelog ========= +14.0.4.0.0 (2022-01-08) +~~~~~~~~~~~~~~~~~~~~~~~ + +**Features** + +- A label field has been added to MIS Budget by Account items. When overlap between budget + items is allowed this allows creating a budget with several contributions for a given + account. (`#382 `_) +- The balance field on MIS Budget by Account items is now writeable. This allows for + easier data entry and import. (`#383 `_) +- MIS Budget by Account can now be configured to allow budget items with overlapping + dates. Each overlapping item contributes to the budget of the corresponding period. (`#384 `_) + + 14.0.3.5.1 (2021-04-06) ~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/mis_builder_budget/__manifest__.py b/mis_builder_budget/__manifest__.py index edc7f6e..4e77152 100644 --- a/mis_builder_budget/__manifest__.py +++ b/mis_builder_budget/__manifest__.py @@ -5,7 +5,7 @@ "name": "MIS Builder Budget", "summary": """ Create budgets for MIS reports""", - "version": "2.0.3.5.1", + "version": "2.0.4.0.0", "license": "AGPL-3", "author": "ACSONE SA/NV, " "Odoo Community Association (OCA)", "website": "https://gitlab.com/flectra-community/mis-builder", diff --git a/mis_builder_budget/i18n/ca.po b/mis_builder_budget/i18n/ca.po index e122c68..3a34e92 100644 --- a/mis_builder_budget/i18n/ca.po +++ b/mis_builder_budget/i18n/ca.po @@ -68,6 +68,11 @@ msgstr "" "Suma columnes: suma (+/-) d'altres columnes.\n" "Compara amb columna: compara amb una altra columna.\n" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "Allow Items Overlap" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__amount msgid "Amount" @@ -235,6 +240,10 @@ msgstr "Descripció" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__display_name #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__display_name #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression__display_name msgid "Display Name" msgstr "Nom mostrat" @@ -289,6 +298,10 @@ msgstr "Des del" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__id #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__id #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression__id msgid "ID" msgstr "ID" @@ -302,6 +315,11 @@ msgstr "ID" msgid "If checked, new messages require your attention." msgstr "Si es marca, els missatges nous requereixen la vostra atenció." +#. module: mis_builder_budget +#: model:ir.model.fields,help:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "If checked, overlap between budget items is allowed" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_error #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_sms_error @@ -335,6 +353,11 @@ msgstr "KPI" msgid "KPI Sequence" msgstr "Seqüència de KPI" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__name +msgid "Label" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_abstract____last_update @@ -342,6 +365,10 @@ msgstr "Seqüència de KPI" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression____last_update msgid "Last Modified on" msgstr "Última modificació el" diff --git a/mis_builder_budget/i18n/de.po b/mis_builder_budget/i18n/de.po index 0111b99..4f61ea7 100644 --- a/mis_builder_budget/i18n/de.po +++ b/mis_builder_budget/i18n/de.po @@ -64,6 +64,11 @@ msgid "" "Compare to column: compare to other column.\n" msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "Allow Items Overlap" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__amount msgid "Amount" @@ -231,6 +236,10 @@ msgstr "" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__display_name #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__display_name #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression__display_name msgid "Display Name" msgstr "" @@ -285,6 +294,10 @@ msgstr "" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__id #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__id #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression__id msgid "ID" msgstr "" @@ -298,6 +311,11 @@ msgstr "" msgid "If checked, new messages require your attention." msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,help:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "If checked, overlap between budget items is allowed" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_error #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_sms_error @@ -331,6 +349,11 @@ msgstr "" msgid "KPI Sequence" msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__name +msgid "Label" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_abstract____last_update @@ -338,6 +361,10 @@ msgstr "" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression____last_update msgid "Last Modified on" msgstr "" diff --git a/mis_builder_budget/i18n/es.po b/mis_builder_budget/i18n/es.po index 95ebaa0..9d3e475 100644 --- a/mis_builder_budget/i18n/es.po +++ b/mis_builder_budget/i18n/es.po @@ -71,6 +71,11 @@ msgstr "" "Columnas de suma: suma (+/-) de otras columnas.\n" "Comparar con columna: comparar con otra columna.\n" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "Allow Items Overlap" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__amount msgid "Amount" @@ -238,6 +243,10 @@ msgstr "Descripción" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__display_name #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__display_name #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression__display_name msgid "Display Name" msgstr "Nombre mostrado" @@ -294,6 +303,10 @@ msgstr "Desde" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__id #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__id #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression__id msgid "ID" msgstr "ID" @@ -307,6 +320,11 @@ msgstr "ID" msgid "If checked, new messages require your attention." msgstr "Si está marcado, los nuevos mensajes requieren su atención." +#. module: mis_builder_budget +#: model:ir.model.fields,help:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "If checked, overlap between budget items is allowed" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_error #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_sms_error @@ -340,6 +358,11 @@ msgstr "KPI" msgid "KPI Sequence" msgstr "KPI de Secuencia" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__name +msgid "Label" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_abstract____last_update @@ -347,6 +370,10 @@ msgstr "KPI de Secuencia" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression____last_update msgid "Last Modified on" msgstr "Última modificación en" diff --git a/mis_builder_budget/i18n/fr.po b/mis_builder_budget/i18n/fr.po index c886b73..1813a1a 100644 --- a/mis_builder_budget/i18n/fr.po +++ b/mis_builder_budget/i18n/fr.po @@ -66,6 +66,11 @@ msgid "" "Compare to column: compare to other column.\n" msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "Allow Items Overlap" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__amount msgid "Amount" @@ -237,6 +242,10 @@ msgstr "Description" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__display_name #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__display_name #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression__display_name msgid "Display Name" msgstr "Nom affiché" @@ -291,6 +300,10 @@ msgstr "De" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__id #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__id #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression__id msgid "ID" msgstr "ID" @@ -304,6 +317,11 @@ msgstr "ID" msgid "If checked, new messages require your attention." msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,help:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "If checked, overlap between budget items is allowed" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_error #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_sms_error @@ -337,6 +355,11 @@ msgstr "KPI" msgid "KPI Sequence" msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__name +msgid "Label" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_abstract____last_update @@ -344,6 +367,10 @@ msgstr "" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression____last_update msgid "Last Modified on" msgstr "Dernière modification le" diff --git a/mis_builder_budget/i18n/hr.po b/mis_builder_budget/i18n/hr.po index e115944..26b0684 100644 --- a/mis_builder_budget/i18n/hr.po +++ b/mis_builder_budget/i18n/hr.po @@ -61,6 +61,11 @@ msgid "" "Compare to column: compare to other column.\n" msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "Allow Items Overlap" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__amount msgid "Amount" @@ -228,6 +233,10 @@ msgstr "" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__display_name #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__display_name #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression__display_name msgid "Display Name" msgstr "" @@ -282,6 +291,10 @@ msgstr "" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__id #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__id #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression__id msgid "ID" msgstr "" @@ -295,6 +308,11 @@ msgstr "" msgid "If checked, new messages require your attention." msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,help:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "If checked, overlap between budget items is allowed" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_error #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_sms_error @@ -328,6 +346,11 @@ msgstr "" msgid "KPI Sequence" msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__name +msgid "Label" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_abstract____last_update @@ -335,6 +358,10 @@ msgstr "" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression____last_update msgid "Last Modified on" msgstr "" diff --git a/mis_builder_budget/i18n/hr_HR.po b/mis_builder_budget/i18n/hr_HR.po index 5aea75b..d6f6e58 100644 --- a/mis_builder_budget/i18n/hr_HR.po +++ b/mis_builder_budget/i18n/hr_HR.po @@ -66,6 +66,11 @@ msgid "" "Compare to column: compare to other column.\n" msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "Allow Items Overlap" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__amount msgid "Amount" @@ -235,6 +240,10 @@ msgstr "" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__display_name #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__display_name #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression__display_name msgid "Display Name" msgstr "Naziv " @@ -289,6 +298,10 @@ msgstr "" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__id #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__id #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression__id msgid "ID" msgstr "ID" @@ -302,6 +315,11 @@ msgstr "ID" msgid "If checked, new messages require your attention." msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,help:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "If checked, overlap between budget items is allowed" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_error #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_sms_error @@ -335,6 +353,11 @@ msgstr "" msgid "KPI Sequence" msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__name +msgid "Label" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_abstract____last_update @@ -342,6 +365,10 @@ msgstr "" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression____last_update msgid "Last Modified on" msgstr "" diff --git a/mis_builder_budget/i18n/it.po b/mis_builder_budget/i18n/it.po index 4e61e2b..4fb034c 100644 --- a/mis_builder_budget/i18n/it.po +++ b/mis_builder_budget/i18n/it.po @@ -54,11 +54,17 @@ msgstr "" #: model:ir.model.fields,help:mis_builder_budget.field_mis_report_instance_period__source msgid "" "Actuals: current data, from accounting and other queries.\n" -"Actuals (alternative): current data from an alternative source (eg a database view providing look-alike account move lines).\n" +"Actuals (alternative): current data from an alternative source (eg a " +"database view providing look-alike account move lines).\n" "Sum columns: summation (+/-) of other columns.\n" "Compare to column: compare to other column.\n" msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "Allow Items Overlap" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__amount msgid "Amount" @@ -301,6 +307,11 @@ msgstr "" msgid "If checked, new messages require your attention." msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,help:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "If checked, overlap between budget items is allowed" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_error #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_sms_error @@ -334,6 +345,11 @@ msgstr "" msgid "KPI Sequence" msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__name +msgid "Label" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_abstract____last_update diff --git a/mis_builder_budget/i18n/mis_builder_budget.pot b/mis_builder_budget/i18n/mis_builder_budget.pot index d024be3..2be4a66 100644 --- a/mis_builder_budget/i18n/mis_builder_budget.pot +++ b/mis_builder_budget/i18n/mis_builder_budget.pot @@ -58,6 +58,11 @@ msgid "" "Compare to column: compare to other column.\n" msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "Allow Items Overlap" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__amount msgid "Amount" @@ -300,6 +305,11 @@ msgstr "" msgid "If checked, new messages require your attention." msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,help:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "If checked, overlap between budget items is allowed" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_error #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_sms_error @@ -333,6 +343,11 @@ msgstr "" msgid "KPI Sequence" msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__name +msgid "Label" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_abstract____last_update diff --git a/mis_builder_budget/i18n/nl.po b/mis_builder_budget/i18n/nl.po index 19a45b0..67777a8 100644 --- a/mis_builder_budget/i18n/nl.po +++ b/mis_builder_budget/i18n/nl.po @@ -64,6 +64,11 @@ msgid "" "Compare to column: compare to other column.\n" msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "Allow Items Overlap" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__amount msgid "Amount" @@ -233,6 +238,10 @@ msgstr "Omschrijving" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__display_name #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__display_name #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression__display_name msgid "Display Name" msgstr "Weergavenaam" @@ -287,6 +296,10 @@ msgstr "Van" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__id #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__id #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression__id msgid "ID" msgstr "ID" @@ -300,6 +313,11 @@ msgstr "ID" msgid "If checked, new messages require your attention." msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,help:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "If checked, overlap between budget items is allowed" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_error #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_sms_error @@ -333,6 +351,11 @@ msgstr "KPI" msgid "KPI Sequence" msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__name +msgid "Label" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_abstract____last_update @@ -340,6 +363,10 @@ msgstr "" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression____last_update msgid "Last Modified on" msgstr "Voor het laatst aangepast op" diff --git a/mis_builder_budget/i18n/nl_NL.po b/mis_builder_budget/i18n/nl_NL.po index 9aaa50a..c68005c 100644 --- a/mis_builder_budget/i18n/nl_NL.po +++ b/mis_builder_budget/i18n/nl_NL.po @@ -67,6 +67,11 @@ msgid "" "Compare to column: compare to other column.\n" msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "Allow Items Overlap" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__amount msgid "Amount" @@ -240,6 +245,10 @@ msgstr "Omschrijving" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__display_name #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__display_name #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression__display_name msgid "Display Name" msgstr "Weergavenaam" @@ -294,6 +303,10 @@ msgstr "Van" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__id #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__id #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression__id msgid "ID" msgstr "ID" @@ -307,6 +320,11 @@ msgstr "ID" msgid "If checked, new messages require your attention." msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,help:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "If checked, overlap between budget items is allowed" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_error #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_sms_error @@ -340,6 +358,11 @@ msgstr "KPI" msgid "KPI Sequence" msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__name +msgid "Label" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_abstract____last_update @@ -347,6 +370,10 @@ msgstr "" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression____last_update msgid "Last Modified on" msgstr "Voor het laatst aangepast op" diff --git a/mis_builder_budget/i18n/pt.po b/mis_builder_budget/i18n/pt.po index 771cb5e..63ca3a4 100644 --- a/mis_builder_budget/i18n/pt.po +++ b/mis_builder_budget/i18n/pt.po @@ -64,6 +64,11 @@ msgid "" "Compare to column: compare to other column.\n" msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "Allow Items Overlap" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__amount msgid "Amount" @@ -233,6 +238,10 @@ msgstr "" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__display_name #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__display_name #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression__display_name msgid "Display Name" msgstr "Nome a exibir" @@ -287,6 +296,10 @@ msgstr "" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__id #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__id #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression__id msgid "ID" msgstr "ID" @@ -300,6 +313,11 @@ msgstr "ID" msgid "If checked, new messages require your attention." msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,help:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "If checked, overlap between budget items is allowed" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_error #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_sms_error @@ -333,6 +351,11 @@ msgstr "" msgid "KPI Sequence" msgstr "" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__name +msgid "Label" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_abstract____last_update @@ -340,6 +363,10 @@ msgstr "" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression____last_update msgid "Last Modified on" msgstr "Última Modificação em" diff --git a/mis_builder_budget/i18n/pt_BR.po b/mis_builder_budget/i18n/pt_BR.po index 374a760..a88c7f2 100644 --- a/mis_builder_budget/i18n/pt_BR.po +++ b/mis_builder_budget/i18n/pt_BR.po @@ -69,6 +69,11 @@ msgstr "" "Soma colunas: somatório (+/-) de outras colunas.\n" "Comparar à coluna: comparar com outra coluna.\n" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "Allow Items Overlap" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__amount msgid "Amount" @@ -239,6 +244,10 @@ msgstr "Descrição" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__display_name #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__display_name #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi__display_name +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression__display_name msgid "Display Name" msgstr "Nome de Exibição" @@ -293,6 +302,10 @@ msgstr "De" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__id #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item__id #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi__id +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression__id msgid "ID" msgstr "ID" @@ -306,6 +319,11 @@ msgstr "ID" msgid "If checked, new messages require your attention." msgstr "Se selecionado, novas mensagens exigirão sua atenção." +#. module: mis_builder_budget +#: model:ir.model.fields,help:mis_builder_budget.field_mis_budget_by_account__allow_items_overlap +msgid "If checked, overlap between budget items is allowed" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_error #: model:ir.model.fields,help:mis_builder_budget.field_mis_budget__message_has_sms_error @@ -339,6 +357,11 @@ msgstr "KPI" msgid "KPI Sequence" msgstr "Sequência KPI" +#. module: mis_builder_budget +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item__name +msgid "Label" +msgstr "" + #. module: mis_builder_budget #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_abstract____last_update @@ -346,6 +369,10 @@ msgstr "Sequência KPI" #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_by_account_item____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item____last_update #: model:ir.model.fields,field_description:mis_builder_budget.field_mis_budget_item_abstract____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_instance_period____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi____last_update +#: model:ir.model.fields,field_description:mis_builder_budget.field_mis_report_kpi_expression____last_update msgid "Last Modified on" msgstr "Última Modificação em" diff --git a/mis_builder_budget/models/mis_budget_by_account.py b/mis_builder_budget/models/mis_budget_by_account.py index c0fb090..169bef6 100644 --- a/mis_builder_budget/models/mis_budget_by_account.py +++ b/mis_builder_budget/models/mis_budget_by_account.py @@ -14,3 +14,6 @@ class MisBudgetByAccount(models.Model): comodel_name="mis.budget.by.account.item", inverse_name="budget_id", copy=True ) company_id = fields.Many2one(required=True) + allow_items_overlap = fields.Boolean( + help="If checked, overlap between budget items is allowed" + ) diff --git a/mis_builder_budget/models/mis_budget_by_account_item.py b/mis_builder_budget/models/mis_budget_by_account_item.py index b14a219..3d7f895 100644 --- a/mis_builder_budget/models/mis_budget_by_account_item.py +++ b/mis_builder_budget/models/mis_budget_by_account_item.py @@ -11,11 +11,15 @@ class MisBudgetByAccountItem(models.Model): _description = "MIS Budget Item (by Account)" _order = "budget_id, date_from, account_id" + name = fields.Char(string="Label") budget_id = fields.Many2one(comodel_name="mis.budget.by.account") debit = fields.Monetary(default=0.0, currency_field="company_currency_id") credit = fields.Monetary(default=0.0, currency_field="company_currency_id") balance = fields.Monetary( - compute="_compute_balance", store=True, currency_field="company_currency_id" + compute="_compute_balance", + inverse="_inverse_balance", + store=True, + currency_field="company_currency_id", ) company_id = fields.Many2one( "res.company", @@ -60,6 +64,12 @@ class MisBudgetByAccountItem(models.Model): def _prepare_overlap_domain(self): """Prepare a domain to check for overlapping budget items.""" + if self.budget_id.allow_items_overlap: + # Trick mis.budget.abstract._check_dates into never seeing + # overlapping budget items. This "hack" is necessary because, for now, + # overlapping budget items is only possible for budget by account items + # and kpi budget items. + return [("id", "=", 0)] domain = super(MisBudgetByAccountItem, self)._prepare_overlap_domain() domain.extend([("account_id", "=", self.account_id.id)]) return domain @@ -75,3 +85,12 @@ class MisBudgetByAccountItem(models.Model): ) def _check_dates(self): super(MisBudgetByAccountItem, self)._check_dates() + + def _inverse_balance(self): + for rec in self: + if rec.balance < 0: + rec.credit = -rec.balance + rec.debit = 0 + else: + rec.credit = 0 + rec.debit = rec.balance diff --git a/mis_builder_budget/models/mis_report_instance.py b/mis_builder_budget/models/mis_report_instance.py index af9bb64..e0612b5 100644 --- a/mis_builder_budget/models/mis_report_instance.py +++ b/mis_builder_budget/models/mis_report_instance.py @@ -16,7 +16,6 @@ class MisBudgetAwareExpressionEvaluator(ExpressionEvaluator): aep=None, date_from=date_from, date_to=date_to, - target_move=None, additional_move_line_filter=additional_move_line_filter, aml_model=None, ) diff --git a/mis_builder_budget/models/mis_report_instance_period.py b/mis_builder_budget/models/mis_report_instance_period.py index 22d1fc1..502cec3 100644 --- a/mis_builder_budget/models/mis_report_instance_period.py +++ b/mis_builder_budget/models/mis_report_instance_period.py @@ -54,7 +54,7 @@ class MisReportInstancePeriod(models.Model): [(field_name, {'value': value, 'operator': operator})] This default filter is the same as the one set by - _get_additional_move_line_filter on mis.report.instance, so + _get_additional_move_line_filter on mis.report.instance.period, so a budget.item is expected to have the same analytic fields as a move line. diff --git a/mis_builder_budget/static/description/index.html b/mis_builder_budget/static/description/index.html index 56ec6f4..f1dfa65 100644 --- a/mis_builder_budget/static/description/index.html +++ b/mis_builder_budget/static/description/index.html @@ -377,32 +377,33 @@ show the budgeted values for each KPI, adjusted for the period of the column.

Table of contents

-

Usage

+

Usage

There are two ways to use this module: create budgets by KPI or budgets by GL accounts. Currently, the two methods cannot be combined in the same budget.

Budget by KPIs

@@ -431,22 +432,35 @@ to the reporting period when displayed. Columns can be compared by adding a column of type “comparison” or “sum”.

-

Known issues / Roadmap

+

Known issues / Roadmap

The mis_builder roadmap and known issues can be found on GitHub.

-

Changelog

+

Changelog

-

14.0.3.5.1 (2021-04-06)

+

14.0.4.0.0 (2022-01-08)

+

Features

+
    +
  • A label field has been added to MIS Budget by Account items. When overlap between budget +items is allowed this allows creating a budget with several contributions for a given +account. (#382)
  • +
  • The balance field on MIS Budget by Account items is now writeable. This allows for +easier data entry and import. (#383)
  • +
  • MIS Budget by Account can now be configured to allow budget items with overlapping +dates. Each overlapping item contributes to the budget of the corresponding period. (#384)
  • +
+
+
+

14.0.3.5.1 (2021-04-06)

Bugfixes

  • Fix incorrect budget by account multi company security rules. (#347)
-
-

13.0.3.5.0 (2020-03-28)

+
+

13.0.3.5.0 (2020-03-28)

Features

  • Budget by GL account: allow budgeting by GL account in addition to the @@ -455,12 +469,12 @@ date, and when reporting a pro-rata temporis adjustment is made to match the reporting period. (#259)
-
-

13.0.3.4.0 (2020-01-??)

+
+

13.0.3.4.0 (2020-01-??)

Migration to odoo 13.0.

-
-

12.0.3.4.0 (2019-10-26)

+
+

12.0.3.4.0 (2019-10-26)

Bugfixes

  • Consider analytic tags too when detecting overlapping budget items. @@ -468,48 +482,48 @@ Previously only analytic account was considered, and this overlap detection mechanism was overlooked when analytic tags were added to budget items. (#241)
-
-

11.0.3.3.0 (2019-01-13)

+
+

11.0.3.3.0 (2019-01-13)

Features

  • Support analytic filters. (#15)
-
-

11.0.3.2.1 (2018-06-30)

+
+

11.0.3.2.1 (2018-06-30)

  • [IMP] Support analytic tags in budget items (#100)
-
-

11.0.3.2.0 (2018-05-02)

+
+

11.0.3.2.0 (2018-05-02)

  • [FIX] #NAME error in out-of-order computation of non budgetable items in budget columns (#68)
-
-

11.0.3.1.1 (2018-02-04)

+
+

11.0.3.1.1 (2018-02-04)

Migration to Odoo 11. No new feature. (#67)

-
-

10.0.3.1.0 (2017-11-14)

+
+

10.0.3.1.0 (2017-11-14)

New features:

  • [ADD] multi-company record rule for MIS Budgets (#27)
-
-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed @@ -517,15 +531,15 @@ If you spotted it first, help us smashing it by providing a detailed and welcome

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • ACSONE SA/NV
-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association

OCA, or the Odoo Community Association, is a nonprofit organization whose diff --git a/mis_builder_budget/tests/test_mis_budget_by_account.py b/mis_builder_budget/tests/test_mis_budget_by_account.py index 9fde72b..b39dccd 100644 --- a/mis_builder_budget/tests/test_mis_budget_by_account.py +++ b/mis_builder_budget/tests/test_mis_budget_by_account.py @@ -126,3 +126,11 @@ class TestMisBudgetByAccount(SavepointCase): self.assertEqual(self.budget.state, "cancelled") self.budget.action_draft() self.assertEqual(self.budget.state, "draft") + + def test_budget_item_balance(self): + item = self.budget.item_ids[0] + item.balance = 100 + self.assertEqual(item.debit, 100) + item.balance = -100 + self.assertEqual(item.debit, 0) + self.assertEqual(item.credit, 100) diff --git a/mis_builder_budget/views/mis_budget_by_account.xml b/mis_builder_budget/views/mis_budget_by_account.xml index 701a5e3..7432327 100644 --- a/mis_builder_budget/views/mis_budget_by_account.xml +++ b/mis_builder_budget/views/mis_budget_by_account.xml @@ -48,6 +48,7 @@ +

diff --git a/mis_builder_budget/views/mis_budget_by_account_item.xml b/mis_builder_budget/views/mis_budget_by_account_item.xml index 7328fbe..5b30bcc 100644 --- a/mis_builder_budget/views/mis_budget_by_account_item.xml +++ b/mis_builder_budget/views/mis_budget_by_account_item.xml @@ -24,12 +24,14 @@ + + Date: Tue, 14 Dec 2021 10:55:02 +0100 Subject: [PATCH 4/5] =?UTF-8?q?=E2=9C=A8=20Import=20/=20Export=20of=20MIS?= =?UTF-8?q?=20Builder=20Templates=20and=20Styles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mis_builder_expimp/__init__.py | 1 + mis_builder_expimp/__manifest__.py | 17 ++ .../security/ir.model.access.csv | 3 + .../static/description/icon.png | Bin 0 -> 4770 bytes .../static/description/index.html | 69 +++++++ .../static/description/screenshot.png | Bin 0 -> 73830 bytes mis_builder_expimp/wizards/__init__.py | 2 + .../wizards/mis_builder_export_views.xml | 45 +++++ .../wizards/mis_builder_export_wizard.py | 178 ++++++++++++++++++ .../wizards/mis_builder_import_views.xml | 34 ++++ .../wizards/mis_builder_import_wizard.py | 166 ++++++++++++++++ mis_builder_expimp_budget/__init__.py | 1 + mis_builder_expimp_budget/__manifest__.py | 14 ++ .../security/ir.model.access.csv | 3 + .../static/description/icon.png | Bin 0 -> 4770 bytes .../static/description/index.html | 69 +++++++ .../static/description/screenshot.png | Bin 0 -> 73830 bytes mis_builder_expimp_budget/wizards/__init__.py | 1 + .../wizards/mis_builder_export_wizard.py | 33 ++++ 19 files changed, 636 insertions(+) create mode 100644 mis_builder_expimp/__init__.py create mode 100644 mis_builder_expimp/__manifest__.py create mode 100644 mis_builder_expimp/security/ir.model.access.csv create mode 100644 mis_builder_expimp/static/description/icon.png create mode 100644 mis_builder_expimp/static/description/index.html create mode 100644 mis_builder_expimp/static/description/screenshot.png create mode 100644 mis_builder_expimp/wizards/__init__.py create mode 100644 mis_builder_expimp/wizards/mis_builder_export_views.xml create mode 100644 mis_builder_expimp/wizards/mis_builder_export_wizard.py create mode 100644 mis_builder_expimp/wizards/mis_builder_import_views.xml create mode 100644 mis_builder_expimp/wizards/mis_builder_import_wizard.py create mode 100644 mis_builder_expimp_budget/__init__.py create mode 100644 mis_builder_expimp_budget/__manifest__.py create mode 100644 mis_builder_expimp_budget/security/ir.model.access.csv create mode 100644 mis_builder_expimp_budget/static/description/icon.png create mode 100644 mis_builder_expimp_budget/static/description/index.html create mode 100644 mis_builder_expimp_budget/static/description/screenshot.png create mode 100644 mis_builder_expimp_budget/wizards/__init__.py create mode 100644 mis_builder_expimp_budget/wizards/mis_builder_export_wizard.py diff --git a/mis_builder_expimp/__init__.py b/mis_builder_expimp/__init__.py new file mode 100644 index 0000000..326c3db --- /dev/null +++ b/mis_builder_expimp/__init__.py @@ -0,0 +1 @@ +from . import wizards \ No newline at end of file diff --git a/mis_builder_expimp/__manifest__.py b/mis_builder_expimp/__manifest__.py new file mode 100644 index 0000000..ee9971c --- /dev/null +++ b/mis_builder_expimp/__manifest__.py @@ -0,0 +1,17 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "MIS Builder Import / Export", + "summary": """Import / Export Reports with all dependencies""", + "version": "2.0.1.0.0", + "license": "AGPL-3", + "author": "Jamotion GmbH", + "website": "https://gitlab.com/flectra-community/mis-builder", + "depends": ["mis_builder"], + "data": [ + "wizards/mis_builder_export_views.xml", + "wizards/mis_builder_import_views.xml", + "security/ir.model.access.csv", + ], + "installable": True, +} diff --git a/mis_builder_expimp/security/ir.model.access.csv b/mis_builder_expimp/security/ir.model.access.csv new file mode 100644 index 0000000..2408cf4 --- /dev/null +++ b/mis_builder_expimp/security/ir.model.access.csv @@ -0,0 +1,3 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +access_mis_builder_import_wizard,access_mis_builder_import_wizard,model_mis_builder_import_wizard,account.group_account_manager,1,1,1,1 +access_mis_builder_export_wizard,access_mis_builder_export_wizard,model_mis_builder_export_wizard,account.group_account_manager,1,1,1,1 \ No newline at end of file diff --git a/mis_builder_expimp/static/description/icon.png b/mis_builder_expimp/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1afa781fabb8088818f3940ef56711e6281bd31e GIT binary patch literal 4770 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 +
+
+
+ +

MIS Builder - Import / Export

+

Function to import / export MIS Report Templates

+
+
+
+ +
+
+

Full export and import of report template

+
+ +
+
+

+ When exporting a report, all related data are exported too: +

+
    +
  • KPIs
  • +
  • SubKPIs
  • +
  • Expressions
  • +
  • Queries
  • +
  • Sub Reports
  • +
  • Styles
  • +
+
+
+
+ +
+
+

Quick Start

+
+

Installation

+
+

+ There are no dependencies other than flectra base modules, so you can simply install the module. +

+
+
+
+

Configuration

+
+

+ No configuration options available. +

+
+
+
+

Usage

+
+

+ You will find two new menu items at Finance -> Configuration -> MIS Reporting: +

+
    +
  • Export MIS Report -> shows a PopUp to select the report to export
  • +
  • Import MIS Report -> shows a PopUp to select the file of exported report to import
  • +
+
+
+ +
+
+ +
\ No newline at end of file diff --git a/mis_builder_expimp/static/description/screenshot.png b/mis_builder_expimp/static/description/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..9cbb176a16c35c0e6a21bf092b8ffc9ddccb8aaa GIT binary patch literal 73830 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 z5f=ae0000001+1e00000000pe00000000ni0RR910000GaRC4T000005ODzj00000 z01$Bj00000000ni0RR910000H7XSbN000005f=ae0000001+1e00000000pe00000 z000ni0RR910000GaRC4T000005ODzj0000001$Bj00000000s9me3XL-@N*8o)+Z_ z00000004KK=;q$WsW0#R{b)&(DF&;+2gmob_wo%A+e%Tcw^@CCJqiH;00000;MPQ3 zA~IR|#EgydG>2Y}BO(gy-5-St00000004JG#I3EZRVtModoRm3|dya^7)#)k6(h92eBy#fU)4#93f+3=slcZ z000000Kk12aWxtZ5p_7_w#TF{$j}ZPHO^CEtj*fHYj2jzBVCl@vI_@txUk_5`zeeS zM|N&Ind1@bFC`)}R_0#ud2r-7I}u-ad`nVF?$`mooNL5{$0CGyd*%4HR5sF6#!!8B z(veH{k;CFVtu@7`4;&gl*{U_9NDz#I1v$P?R$)T zu$z60IT*(-p&oJ~o>Thy*&ZmXqAp6kbFWeH#BoH#*tt7M(^Wbm;o4o^t9v&)5fQQO z{$6}?c|Gr|WEz%KnZEaAZQ#(sZXB`d;!AbTy@q%yIU(Px+9hEGhld(y;NLseD$g8Yzjm5xrdJB1V)c>YZ#}Q zw^B&0{G-Q4`EngvBLDyZ0002oCoJC=S0&s3b+?R(t=l}o!0001hrKZ!{mv4zk9uU^M zD0%z(6r;?+yGOSksb>-rWseLBvYfvSg=aEK4OFppeKHXdapK-XCv>s%jfqwtO-bC8 zR8KOcclXHda_mR|000000AS|Mo!j*JjodT{ZU)cu7N_vdnHm|5Mx)VaGMNkpgYdYt zv~lVVW>00000004l93jhEB0001hhzkG!00000fQSnK z000000Dy=K00000008$g5sKh`P(307h0t+!+fUrWrRj9KPFfBUi3F7a00000Iv2F! z0ssI20000YE&u=k00000A}#;`0000003t2`00000001H`00000001E30ssI20000W z;sO8w00000AmRc50000003hN500000001H`Kxbtb_=(4FU)jo8UK*$T?I#C0>b7O7 zKRF_=)5%YzyF&a_BRWmAbG>;KaO3g))8^Ok&~WzD%y!br33%~002P5 zg_|JeUs>+lGrjKhhbpe9$t_AY_hY9ig@wPIy94Vsc@B{e(W}?)>iAnE8Q+w@u&ikU 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 z&T&!8#y8Wi6qxI5>l~k1l@wYEkbR?EW?H?tF&ULY!Lf(WYL-b0Cjq->PlN#&0 zGwmxq3Yukk7jk=U`#1Kol;Ce-~5>C&h6WV56)RtqFSGH^1?CG00000 z0I-kj{9Ig76n8u6RIDRorMGETd&nkkDVEk&e0*GdoXFG4XwQT@EJc3h4#wNfXSH!7s z`~d&}0000E5cb(;pKX1;`-cVrJdM}uWgIWdL`1SIZ+szHmN#F@B-7fO&t{87bpZeX z006*lOiaw`bZTP67$ahgF~*2!^DCq61C^0)0RR91003a05>N%OkNEwV@EQOB007{C z5XF~2@h^vJ1poj5004l40TCAf0000001$Bj00000000ni0RR910000GaRC4T00000 z5ODzj0000001+1e00000000pe000000000H7XSbN000005f=ae000005ODzj00000 z01$Bj00000000ni0RR910000GaRC4T000005ODzj0000001+1e00000000pe00000 z0000H7XSbN000005f=ae000005ODzj0000001$Bj00000003Ss0aXA1000MuEX(WP zFvd_D003_w^x^^l0KkEYxV5#{L!r=S)&&3nMBIHT*ni`TZ(F9GzQC&U@|W!kIOG5T z00)>PNevBmYiqCj{XV2z0Dw2puNeFKm)x*N&rc2*Hkdxnj|EQVq zzQLbtah|KiZyx*zV!A0BgPwk_#NDF54I z4uMGaOn2UCxISS1I8(pdh-*o!u>7hwBCRbf`*dgv00007#hp8MDk>@jL8z)as#2+t zasdDkai32XVjb$4`xE|5he$+hc4$x&?_ks3ZA-c*XI5-Q1@T5ABCX|6&2iPTMziBO ziRXEqCnAF_%dT&qU!_bv5lM6X^(|c!t3f74CzV!J*>ps->in^RPmh}I8Cz8)zkRmS z-T0q9(I1`4)DUsOx!wk6_v}i5L_=Efv7)5)pv?T!9ar!4FZd+2#a?x!(xT$V?)>k& z;{i#U`{Iih;x*+L-*vFX?uPpN(`zAKh_M$}mZi%Nu3Q;Qc=u$sk{B&_T>7~u^Xw;C zCL)UT-}rpg_R*{@9&k2xjV|~}5pBz^ zC_8Kr7`gj?uA5D?1_npnk`&e@K3o_8003TCYHI53+qbK$s|7((R#t(O3jlzKy9*L$ zO|^6nj|Uv-Dv}llrxnTN`r#cSt|lf*+uYtb!sjPi)I3F$W_#>&*3AW%$0j|-R09!l zfyq0!@A*qlerz|&bDg!f?{u6wo3Cd?(#*hc{Hb?7G6_UP?#-VLjMUv}Hx!@y&~B9G zI&R*&I$-)RO;1F=krB_4lNW93$UwvQb9aQ003`B#P$3AZnt||mJs#&=L`~N@s3ni_n<#5N0{%Q71Q(8G`!PdNoD7yPS^eV z9~ykJHagapnw^stqugOh?PSw8Upk4TNKldzO3$U~iHJ=N4HL5S5DSH z`I)XHNlXfReg3ehjwyNjQzDrtDcMvvJ{z{#{8O{RoZ`&>zEMw(Sv5bhtk0-cbH1Sm zYnFnOHa$M)RT0tR$XMWTO;(hOhzuD;Sr2XuEXWCFBI1nM*;XYH z@#f?NQ{BQMrN^U%0ssKKxNtbk^L#-;!7so3a_ZD6K@f_IipP-iU}RiXsth zO}V?tw?rhV;xb~LwNt(v)#$L!aZ$_0cV3X!q!b=aDP&U6y)-@9*>W39f&q6csxpYM*CK)aoDh_Q^_d zvoBQCiVp*^g6COer+tki6rD_Sxo&;e<`=Ya$%l&z(hY(-KGD)Qz92<;CM5fjM90d# zYtz0W-Nd*)@okZ@MNhyt+VI8a4VyI+XOVVZ74!K*;Rio_-nzL#RqXnHFoj0_a8G%q zK;8(NCjbDzuOdm3BuRoGl$V$P_~Vb~&z~0rAwNGKDHj0Xjfl8Uq}*NR+w~}BNwtOt zCZ|+$Vrrg-LOcJNnH?R~CONcB=9Rh_dsbz5{JY^fDQo*|$q`bk54#MPuu&)$!e|6zv!08!V?j3e)l5jOd_M*4$D?W=Tx1}sfzfQXS-Xj z-|dY%muoO4q$~P|r^Z)VLaA0TJFKi@d`dsZk`L>NWVKeMb{u)HDw%)&s?=&xRr>bs zr_llc0Du=24u=In5CnmUjvhVw_19m2@WBUyAmrraC=?2$TmXOr?9ojr>&f;-@+}dO z9P7wf>1~?T98AW0$r@@QxOv?12A(>;}J<5O2D;$I%@pAJUF z7>Fp=k-E}dH?$Za;`|HuZ{4})e%52|B(*IgYRTC;>XwKLE)U(k@$=BiGjlpG%B#~0 zzTndAf?tmG-}=k#z8SyFiF%_!$?-f9$)r!RE2o`3E3t`DMB$i}kymM{0Z;X10XvbAWIg(U8&0X_8B9ayd8*X<`OK67x001wOBuU|LI2>Mo z79pKJefoq*JQoD*MqDm+`=5K1L{iew$ z^ZKZavSa#ZfB33OK6=F0;Jo@}eSjAYX~pNWOwU+4BE;q7YHwZr_A6!d;p1<`q~@0{ zI2$jw`XpWvZ7ZzESWo=A#CS#5uqD|@L^6wZ#8c;@&Au_|@x~T!ep%-wQJ<7uo~tmJIOD-92@U;l_)mgS8vB+K&VOPOR^Tl3j$v8XNp0C
    ^D8bn+G001~> z)*l+Qu&{9F&Yi#eyTAK~fB1(#{pn9dMMWx=isLw*=M@S?BoaZy1pqjB@C zBuSc>m^gFh%pd>w$EBsEfBeUP^!a=o$2lC1jEs!b)YO=m801?307P5>004k}V0?W1 z-FM&B>2zkZ`QQHS-&88qAOHBr-rim!QYw|AC@K^Rj>A>u&*@uj7u@$vBvhr?>M z{`yquR2KjMyxfQzA0MyN>6A(($8n4? zolX}U8#^~Qmy?s@a5%JDEhd@*0NAJ8ZjVx_z;kf{007_(invOpa`UQ(hy+1MOG`^i zN@9#D6bj^90DyxH5f=ae01i~dePSpwV@wbPLBKT+0Kgjo_u>Ko0000003t2`00000 z001H`000000000YE&u=k00000A}#;`00000AmRc50000003hN500000001E30ssI2 z0000W;sO8w00000A}#;`0000003t2`00000001H`000000000YE&u=k00000BJOW$ zx&G2ueQwkP000000KiKm>}iVoewcHdzgTTz>m|Hz@ane>!*S(*dm>#$v|NAbn)&3% znR+7Pf(!l4uI{Ntx5TTXtf@sMg%kY&|HDpLPQi88*#@b#7wVl%dO#su|@6SV<~2l5s^Nnyhb%1 zGVQ!?GSBloBjUA5nQ2{DN0;SXD`VuHZmMq_o%cx!by8k=X@*rvTwwUdmGSsYe&oSI zP?93i>17o;RwWS;7o6*DaCXnG1W42;WmlAD#PGxghOb|pve^QCgY(PQoYLja_T_Mx zu71%=Azj+33#IX!`#`2Nht@eb6Smj{BBJ2*$c!enNWY6UFImg~P;KA(j`)?)=H|Ac z1z%91H|LhsWLi{2jJ#9MhNh9lV1yGC`sA7mMJ9oWq`Ch3mad7_AQPjLN~@}DIwD$i z{&-t<#4h$t`s5I=PpmjnX;GnZ0{{R3001KHOB4wh?Wr@(_ZMV~nel6*54@J#Lu_nY z#FYh8tYNLw^}v*CPc*2ANEe^@+_i@nCq_IPi=GjYySwh@isjhFlQzZLME%X1Et(Ij zZE7OUH_@?D_0GjA4F#8*u72OB`Q0&xiUK2bciIhQ=RUL<$URzj^M@AArxi9ek-RqA z7C3t0qZ1k;qO5r5<)4MB-xZj5Nbkvx_+N%bC0i;_Twt%O}kz5R)Jw>+qC`Y z#naKkVt?)R#+LXCNAye@XuL6Jdh6oJc-}p5{c6+5N|DLT1t#y@zUMDJ`LW$7&vn+` zzSD8$Y`&fmNsA+6_EYb?ZxZCm=1XTc{FbT00000K*W7{0-QeGuKa3f?x;D| zKR!C0kaLC~-ahbGCjFtejqDpFP zdY)v`r1LGc<^lWuuRS{ogRgz5l)Kt^WvDGk{RZ~Ml#+={VjRFx_@=6m&u8*(f zXX%MZPR!0S2}H!jI}+uld9R#&5bp|}oSei-3jhEB0B|rQBqZ#!h)cw2lO2}pLo<@j zGwQLG#PNaQofD&INv}MWP89Jk&yV%B*8Mzv^u1Ho?f2qp;%iQoo0zZr)@64_wZkY7 zksS8>Jfm0s`}2oONrEj&S`W{n`r)0rvQn*OAzw&l0neJK)$^O1)@oSL87kkMdkjaQ!=_C_bz#j^|kf=Kufz0002IdGV#vGdu-fqNw%nnIMEcFQC_h$`_t44S+|c6=9#D!MW!w&%l-aV z-9*w^n~Io9RO^#YUN~lYJVS42S%@4zDGnvig<_Z zo~z-95t&!&?WO0lOhhDzA|+IPe8Qo6^#>B(c(P1Gqp6Lqih<$Os?vs2$F8AH00000 z;B~X-&&8EVlj0EPojofFj`*kTgm13Dx%TJQ;RSzCl7jx3zK*G2bgb@Ks}*7jixXCz zt_g``(x=3P6RdOKU;T%>3#O>0OnO5xqL-dN7;du=7Op0&C`YKCrs#_xl5Kz~fPv z5@Ynd6qxMkSq@8*L_`anoeR0=KKkgRkKey|wkS!z{$sI@)RpeKp~V0Z=U=#g>(0H6 zM<@a8p-@P0wio|j|M&m-Uw{6e_a9`2!$PC00@VTl00025p;yuQr$|iJy1Jts(N9}I z(xtw2Mre24yLIWVPvVt^==l5-HMZx>3Cxm;D*C^#>zMtxC|1llTH~*G{rJ^&i4@WH z{EE2sAC{RlKgr#8`HO`RuT01~Rk7axsY*V2#Mj`w`el89SLl=S-YMOAV}^{}jGIm0 zf8EBXl)MvT*mftaGBMRse|sYSOv1x@-0hl;j%0If-CxF1j(k{}S7g3j`_=!7D710e z`I+YC`k(4*E>@@7RX4x+qJ<|So>wRm@{d=iN2wCZj`^EfYQJgn$-F))qwE+S!wY+9 z)oo~MEpv60czur^K+Tw3Uet)n0RR91fY%WF?6c1f>U-k?!&fhjB!5zqw*U4$Fm~fc ze^$*&tD1c8`Gs9oVM(bKw007{%g^2q)l1ZOcn(uC{{mvOA;y8mjwc=QT7GsiO4|%+r*3P2lw(^x#!`5=U zZLFfCAuFSY<8b3Q00000AmaXZBC3>=pQP;5o#!oSRcF)CK;adbo{ej6E90Dy=K0I#(`P}$X!SKm@OzZkQ%Ji$6uQQVk&xRd82s3iaZ002P51%TJu;&PO$ zqok#+#2*kh3pq|scl1}5G^QpGqKW_j0000H7XV&&qZ9T0000$#07xYS~$#i-_O0%R6RTY*dvHzq8CaFn@jRt3PlLD1ONa40EoB% z@LF@P>6{&}V9n}sT6FgL5Ss6ozDuD9p_Tvu007_(OcRK>@cJa%&Ed+J zQu(ReYdU8~X_Kqm>r-#3J=tL&swi&EOzUH)JOBUy0C-bV#iI*khKLKVOVC9%>}+y6 zzR^|L*^?WIaGQlHWiU6Zv#PWqCVC!K1ONa40Pu`1A4FW(^X9kHEK`_z>M@eU_dYn( z;H(;(NZeW;ZCWbMca|19MU@}51ONa40PrwPJhc!J7xuF0F_Ptt@yU$ITSh4phT5+4 zc(tvag-xyHt8T;Aa=UG;qNE`!qle@0SpWb40002(lq1&1DsPNfUjK@S3$H%(q6?RZ zXnNM#+*aCguOJk9bQ%hRlyj)Ny6jGzWfoNg00000@YG=Ols+>=T-d{A_p~VcFzCLC zWSR91WHh=e21io2mg{wEB?Zp%q9%>ni>3nr0002+qTzP^e-UxvRklU>P42=C1XZn_ zg$>Ti|w-RuD|sCFy}abvD&n;HQqOP_1lKwxbnX}k**?IuD^86eDdQ= zJrQxih5lw&_tc_W;?+^s)S{9?i~7koL(5&?{n+l7Hv)pel2Te#VO8(lTks9sxh>_K z%{1-wpOSaDv$<<%+7px&+Gu-jSy4(9Peddv_I}r|s;O{jh=`QN#N>2^QT3*_z^6~A z{6-8^9-Xk)H6H03$k_URwHj|xUTaxllhLq>Us3=70000l7%}J>lPd3NFD|FkL`Fvz zt4-$h*P-!|MXf=%!;W}|YinB#MQ>fSMR5_&WXG-AtG>6+SDCl%9@E?3K38R8L{ea~ z^VXfZt_!Dg#k~qkq2;AjLE8Df&9wjGT1crnSsAP2{fk3)>wdT^e|XHHA!7dJg|+C- zB{gY9m1u_#M=7s&=Wh1#PD~ukNtGl?F*sV>e(%iEO8nMxbJRq3#;x>}MnMRzxoORf zh5-No008i!(PH!K4r7(~cA&C0DS?d-%@vp}L_~qH5qE4t%=EU7D;8cDThtytmSPqe z5$RLPYgFSQ)6V-Q^E}TpB3_%6nbrYkAei5Eb#z(IwK7KD>8AR|(RrVwP$%V;mu6U% z#07?LTp5qgFO7~6w;-gx=^|`thgssY7an-U$L$us<`O45L zCk=l0MXStA+2_xu^nL%cQ1!b4^OGrPuD`yeYhpFX#OS2bsw$iAcj?Rr001ANNkljZw{vYe81 zuQ2CUlCA$?54IA&n*aa+0N{-etL$kn88LboU$>^&?E{r*%aeo{+uMj62^j6EGtKuG zWQ&>cYoiammfS;ZY+J;Y1yihHt<&|ulxt5ksE9}xpZMIhhZiSCJQ|Ch5s|yQ?&gZ+ z*u|4J#o9#u&6_Qn536lzBF;C_u~PNU#VQR2mz%DB->CWBF^7r*BXxJ$4Q1y(v>C`f zT6gn@7R{#>HZ_sFHrf_Adf}rJ8X}^sc<1FE(YVxqLo?TsURexgOqQ$%UD#}W~l z$}j#Oi4FhR6aB%dObrnc?Kl*b3rya*ea~Nd@?*PEp6jf=eW&Bh*?j$h9J{+YR{4qP zrndI$Zr-fRh{;T58)5fh@|Lz?(BSGYuE9(SFrc7ZLU5*p#fiLss1mJ14s*uYC0-PfU_Rye6jPc#f7aS{@$t+sX?QL?)9y zsU*kp)6g{897JJe%E(Pxzb7`jAUpB$;7HJsB~A1%MU~Xp^gPL=Pbtqy{NcewsV$v| zm?@(mL9?4U7<&|DnMrYolXrso6PcF}v=WV^c#z#+={VjRFx_@=6m&u8*(f zXXy`OvfcPJMc(@A;p|geCZpO6v+GS-X2jN4Ad~#GWc$2M-B%GNC5ay#&2@FwOwT+v zkC;)vkek(zmsPJ)`jBh^0002s4I@7{%5J-MXIrkCAB9`mHlfrLgOi_Fgv6aN}f#DsOi-?x=%2Vk?5&!c1SYK=1&(lZWJ7wK|FRmuO=2W?f`MPgi zc4t&Oi~;Wa6RM^g%!6m&05PjEeT-*{QWqLXMfy z*%TK=_?6`w>|_YoSD{MT5uyKdK$m200000;Eg7;7rap4jId8c*4=#b z*n0Ln;>x5+aftVvJpo%){8N_Ud~^NHuGYoU>Z}BlfyPBtmJe7qRW*rxD zPjvQA8*D}VM%EEM3p4(pWp!1Kjd^T^A)jZ}?-Lc;SVyYMRX1cj>WEhR7kZj{rK0NW zgLp6Q){fk#q}(UJ*$lVrQMhGK4oTkHv-_$tt}L^m(X7_aqoWfUTg$bY)x7M+qTD)B z<=xwC4FCWD0I)w|fV}(b^T+PPec_<{WY!g4!Mjr=CTm^Y(T?b+EgO#Qc*?!_jMh!9~Z@nIY(>!^{yYkx-O9-+MZt#r`q`Jz?z@r zZoB-&LWox;WSy#5?=@8=A3fr0a9;hgKENyVNqO&-?z}NWMsCK2Y0Ti=cZiR7@|xY_u}ppZrM{aEqetKHy9GT zdP`j$$5!2s4MmT$j2GqIIh@|gaTt>f00000@StNw|3sr_P$(t zG%R^D_&(8*`|zgR7mTleUBqQ08`+QxO0F0001f zb$oat>poHPv_9MIFA;I!H%__q#N<-jvMxPql=90L3MqT~id>yX<`?6(mdD0S7Unc$ zA94vo2nQDc0001Bcailu3+_7W?)K$Dj<^w3%E?bs(7ayfluNWd=x%MG+XF3=<(Gb5 zZCLXd+V7RS+N=Em&6btOsmZ-11$UAYA3W_m1ONa40D!Ijiu($mJ7W1caTmR~@ah8Z z_E`J0p!@K|U{5&{UUFaV%&g7XaipieFcRT53zdpMZdOZaL7maCgo6hF0002+0+;^J z?-gRZ_`&Cf+a1<}hzond>si~9RCh?E@>4$8k!AUn?W82}Lu2`E-6yAKQ?`~H^>g{z zx3V+q6+(cBd|n(+00000fLEWB+3w3X3lVW)PeesU?IycEJJ9Z3-1T^M?cGI9trhOI zt&cmVq=eD(;`*$N9>yX>8X^r2B>(^b0Kjh^Yj+cF5pm&FH`eWub+b9{m}Z~dzJFZ+ zo|=hwb(VG9D-4GpHGV+|XJ>X-m)*9QXK|ze00000eyb4sqCc|zzYuZZH%_^`$-002 zxgpD}e=xJDwQ_JIb!)j!>nYWxtXf$$Z7q+Fo2)2q%st$}aS8xqPQ_Lt&gG0761SM000pe;59cj6W`Ka(%xMV4nJzQf)LI* zbni%cU2M!8st5o80000H7vQxf%dBr8qtR6{IFh=xT(5JN6u2si8`Yu@wFCeF0001p zxbRx@2UKlch4n2}E33w>D|+0~QR;H;cmh}l{mA2(fE(2}3su26(gO8@`>004l93$L}Mkc7%B+>00000UdxCpxW4d@dA62Fg`cXDwR^EG zCe6rq2SdlI6i?j~K62t?rEw!dasEE(m%5HU7SNOmr;`+%#AaOKhM$Ag7nM;@W@niU(((6HMn)v@ zGws3V8^O~Tl&U@JgF=qM4J@)qwO9P<7gR|Gq4OJ`kgZtmk-Py}(#ko<6gI

    7LQW{;^0RpbalwIb?KqbzOT!B!NfA>PSCq#qh={o0jNIA~o?niT zNC}0k;E=!((HgsTBW#Oh0|OBufoG%s)i6)rhWlAWo5`K5di}?j`va=BuEP43s+Cpa z*75}FR7G)PUREc^MR58700000z*|pXrSUoy5k+E?pWFA$ zEsur0T24zur0BchT}@)A&nXnEoa?%`Q^ytCiHP}!gR95+Qzv)|DBG|2+H_o*gOQIp zZ}_#zVf&JdR=HdM zuf!2WA|cKo=bun&7^9W&L@-iRpi(iJjB;*{qP9OwcAkjHM2Av%A|jQXl_Om34~HBo zX)Ls4VHI|cBbkhHLB8U8e>mT+;7BH3PRr*N`=%wyG8-OqG`Xt!2Q$|D@7L+Hp2FO= z@}fqA-i`AO000000QPajl`_sM9s2d}Rf^5nBSbRt_~F`M>bt5(H?Q&}Zkc6Qqa?SN zD9ro;+45)_C#F-A*GCjZ#FHq#P~48#()qgsQjV6J@W}b`Ebw5*H&Ss%VPrzzHJ>MoPl_TUlKpaEm9PEJ@aAHCqP#vJm#InIc(bxX zWSn0P$y{(PBI?+~Zem%bT`wmU5h+Pj?Ta=P45_+$@|s+g^NW_P^6UJMDj&n-QdhnCTwdt|RnIz~h+;E^LDQ?Ll9?HM#dlc}r^YAWkp<008*^+q;wCD6;&HHdB~hpNn1nJ@qGboj-~d zNqwzHw?rgqJo|f=s>fPl^SMf0gEN$n&M(a8T^a36j4z6aHrgwt-uT zg{X+A(_OJihmz}G<3yT6v6ho_%j&|o8C!4V;WRbmQhIt4IVI~Qdo?m)bzU%f`jWAj zBxCCIeRCovS>9J&qn4vp1hwuviKJMv#g^~Vdb-RNL&VUAn~k2qXT6zIdV0)+D9Ht- ztJ}!hX0uCD582aat)9MQ^6BYMuS(R=${$vOr?TaXofDarxhjq$K=Xm72V#-Bt2z!3DYauZe`+%Bj$5 zN)!v!lg0e=V-+60FuL3)h^(O%|2gTW*-2wI&M=Yw3RNHRs#UE}lwSYQ>(e zm+NEN?maATX*)DImGjl@8R;|ot6OWz+wJzah{R+3X8`~J0C)qGzx(@t*c4Iw4`;>T z??8>eSnzrC4~Ywx-o4#f_fEt4{Z*~cw=ONGwRa!5(^ zS(#H*4FCWD01+3P&c*8|Qu$WI%1od6;!#;^`&&b!ga(gQ-L93T<+QIh*c$3PP}8zw`$I*sUVSKTR0aS50PsdI ziwhBv%S|Vq=UWj;Ce`Qp)@C!xcXij+v}6Y+C=>ty001H`Hg~?g(Qu>n$m;FhwD7*F z*1eT&Zr3tZ0ssI2K*Ysncd6;b&9(Bah=hWJH5KGr00000e=xM8_4QQYN9)SXw{P4! zy58QYne5KHdv!gUmoxgU4r`i*-EOD600000h`87wSDTMFwH$kO8^g5sKG``k7Anji z)SXcxE&u=kfX$2>m4Bob!#=w$aiac$!yXrr)Ej{8_PC~*Hk)D73{^=w95E5m^{Apq zsu=(P000nivFZ4{i-!(0Q3n73002KEDkT5_0000GaRC4T007uTY&MOQi|-ka?E(M* z0C*$Fw*UYD001H`0000007P5>00000h`0a%0000GaRC4T002Z>000000EoB%00000 z5ODzj0000W;sO8w004-%0000001$Bj00000AmRc50000$#03BV007`A+v_{@eDk@B znQy@w=xF`IXcbE%K!C7|6&vI?sX>@9iLzC|lZpZsEI(Ydq2^PqDi zW|~uH&fF2rU3>bEi}jbf;Rywm;l8P=%z%hUY-k{y9n2bET$NjmnW0(Ft|MDBbwxzH zTWjl`!wLV|g|akF(-aZS6WX!8r*UxJD$i9ESs8C_zBM=$bZTBV@VxoIPd+PR=W@)0v`Y$z(<>$v9J(-@*E!#hT zw`<-or18uHNu+IWcyE6mgBJh*001^V;)+NzGIBq5_)kw4rp0HvKEL?8{`9hjpC0tt z;$L3-uUox2KiQowB4RE)eiCXpaoTT_g(uf8Uc2dg_mE$S-n)8nHgM!reNaye>XL@KuSH=Y|P`k;RMI$eluDcm-3`{9fg$W*kY!N)6s@}0`i zs)%dZ{Mo*xyX}wt<%I=4r--EG6@2Xl8nYt<%kF?z5s~n{rYj49Bd6caw=az}U%7I} z{j)>)E)g{{(!Fr-)aiq6iO;t-p11%=s*le5oSB?|WJPR*BY*;ZYY92}TcB>Z?Vnp0gJ)D;njcURROYvkdK^)!wa zR8;uCX-bc&-jYJcK;M*zM282*gT;B8tiJKr67SCAM=RCAuEziQ&DnG3FE`&CUozG_ zq7@#!@X^_`XFob~=07j>%D%VCJc=Uo{e#i`z12Zou{3XJUs+(HZ#)%)6@O`Y$Soq` z$f(*=FxfW{7cDZ7n8+HW9ImXk>Zt!hihx^Xs$ahs>9YU^!eKB@szjN^E&a_jtAEr}ns&_)5YOMJ&TZ%7FOfNEU0RR91V71Nl(jeQm zZT?4B&owQXx<6QZEcFgsy{x`I+T8xhZ?Bu0EvvBRNcEcOG-=BzEB9P${P-hB#;&8s zGxfDE&0bLCX}_0IoUvXX%(QLCe`4!uzkluA&4{Tvd>MI_$LjN)ukN`Ls;TQe-_$+% zeoeMscDO#;-2UlDmrSu|6js*dq<(BExs{=C=O<@o5}G5pyP>YwDI(%5I{ZhGmbS*T z%`wgH4ON`lzxK&|rRAkpTF?J?r?z$9sVpDQ=mG!$0Km)9?86T~+$3FD{6Vi6tj1ow z;PVg4%F2q{O$G-5006Mz$%_&I00000h`0a%0001NBAe(&W&B`pqcQ*h0Dw1wSzG`B z0000H7XSbN001H`0000007P5>00000h`0a%0000YE&u=k002Z>000000EoB%00000 z5ODzj0000#LN>!pQUw42006)b0JFFN00000A}#;`0000)TmS$7004-%0000001$Bj z00000L|gy>0001pxBvhE003+d+bj0{A( z>3EiM0RR910C-~&H=Z zH7hEcmNgNJj3lC~Cu#S%y!9FR)ms9-sJK_G$}NHVjNl%Z_vIsqHIj%<#8wO|Nx1<4 z00025kL|ntEXVGw@@3`ep7E)<-`{LAO!J+?2lBErs;sQAkr-O%mSz9|00019pKtnJ zTvbt=%8SOi4p&h3Dx$RC@2#!adE%|Ty#phPC_&wu=X7hLq?$PuHT9(KkAyYx@OJa9 z?y1<<6f-{2+j{e6@07s+1ONa4fbY*Yoy9G8`AR+h%X6c%M#8D6={9F7yJn?t8Jn6d zF37E`+?7hgTkK9 + + + + mis.builder.export.wizard.view + mis.builder.export.wizard + +

    + + +
    +

    This wizard will export a MIS Report including all dependencies. +
    After export you can import this file in another system to have the same MIS Report. +

    +
    + + + + + + + + +
    +
    + +
    + + + Export MIS Report + ir.actions.act_window + mis.builder.export.wizard + form + new + + + + \ No newline at end of file diff --git a/mis_builder_expimp/wizards/mis_builder_export_wizard.py b/mis_builder_expimp/wizards/mis_builder_export_wizard.py new file mode 100644 index 0000000..1cc8cbe --- /dev/null +++ b/mis_builder_expimp/wizards/mis_builder_export_wizard.py @@ -0,0 +1,178 @@ +# Copyright 2014 ACSONE SA/NV () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +import base64 +import json + +from lxml import etree + +from flectra import api, fields, models, _ + +QUERY_FIELDS = ['name', 'model_id', 'field_ids', 'aggregate', 'date_field', 'query_context', 'domain'] + +REPORT_FIELDS = ['name', 'description', 'account_model', 'subreport_ids'] + +KPI_FIELDS = [ + 'name', 'description', 'multi', 'auto_expand_accounts', 'style_expression', + 'type', 'compare_method', 'accumulation_method', 'sequence', + 'expression' +] + +STYLE_FIELDS = [ + 'name', + 'color_inherit', 'color', + 'background_color_inherit', 'background_color', + 'font_style_inherit', 'font_style', + 'font_weight_inherit', 'font_weight', + 'font_size_inherit', 'font_size', + 'indent_level_inherit', 'indent_level', + 'prefix_inherit', 'prefix', + 'suffix_inherit', 'suffix', + 'dp_inherit', 'dp', + 'divider_inherit', 'divider', + 'hide_empty_inherit', 'hide_empty', + 'hide_always_inherit', 'hide_always', +] + + +class MisBuilderExportWizard(models.TransientModel): + _name = "mis.builder.export.wizard" + _description = "Export MIS Builder Report" + + report_id = fields.Many2one( + comodel_name='mis.report', + string='Report', + required=True, + ) + + name = fields.Char( + string='File Name', + default='mis_report.json', + ) + + file_save = fields.Binary( + string='Settings File', + readonly=True, + ) + + state = fields.Selection([ + ('draft', 'Draft'), + ('download', 'Download') + ], default='draft') + + def export(self): + self.ensure_one() + + report_data = self._read_subreport_data(self.report_id.subreport_ids) + report_data.append(self._read_report_data(self.report_id)) + + json_data = json.dumps(report_data, indent=2) + # change state of the wizard + self.write({ + 'name': '%s.json' % self.report_id.name, + 'file_save': base64.b64encode(json_data.encode()), + 'state': 'download' + }) + + return { + 'name': _('Save'), + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': self._name, + 'type': 'ir.actions.act_window', + 'target': 'new', + 'res_id': self.id, + } + + @api.model + def _read_subreport_data(self, subreport_ids): + report_data = [] + for subreport_id in subreport_ids: + report_data.extend(self._read_subreport_data(subreport_id.subreport_id.subreport_ids)) + report_data.append(self._read_report_data(subreport_id.subreport_id)) + + return report_data + + @api.model + def _read_report_data(self, report_id): + report_data = report_id.read(self._get_report_fields())[0] + del report_data['id'] + report_data['extid'] = '__export__.mis_report_%s' % report_id.id + report_data['move_lines_source'] = report_id.move_lines_source.model + if report_id.style_id: + report_data['style_id'] = report_id.style_id.read(self._get_style_fields())[0] + del report_data['style_id']['id'] + report_data['style_id']['extid'] = '__export__.mis_report_style_%s' % report_id.style_id.id + if report_id.query_ids: + report_data['query_ids'] = [] + for query_id in report_id.query_ids: + query_data = query_id.read(self._get_query_fields())[0] + del query_data['id'] + query_data['model_id'] = query_id.model_id.model + query_data['field_ids'] = query_id.field_ids.mapped('name') + query_data['extid'] = '__export__.mis_report_query_%s' % query_id.id + report_data['query_ids'].append(query_data) + if report_id.kpi_ids: + report_data['kpi_ids'] = [] + last_kpi_sequence = -1 + for kpi_id in report_id.kpi_ids.sorted(key=lambda s: s.sequence): + kpi_data = kpi_id.read(self._get_kpi_fields())[0] + # Fix of sequences to be unique - otherwise there are problems on importing reports with subkpis + if kpi_id.sequence <= last_kpi_sequence: + kpi_data['sequence'] = last_kpi_sequence + 1 + last_kpi_sequence = kpi_data['sequence'] + del kpi_data['id'] + if kpi_id.style_id: + kpi_data['style_id'] = kpi_id.style_id.read(self._get_style_fields())[0] + del kpi_data['style_id']['id'] + kpi_data['style_id']['extid'] = '__export__.mis_report_style_%s' % kpi_id.style_id.id + if kpi_id.auto_expand_accounts_style_id: + kpi_data['auto_expand_accounts_style_id'] = kpi_id.auto_expand_accounts_style_id.read(self._get_style_fields())[0] + del kpi_data['auto_expand_accounts_style_id']['id'] + kpi_data['auto_expand_accounts_style_id'][ + 'extid'] = '__export__.mis_report_style_%s' % kpi_id.auto_expand_accounts_style_id.id + kpi_data['extid'] = '__export__.mis_report_kpi_%s' % kpi_id.id + kpi_data['expression_ids'] = [] + for expression_id in kpi_id.expression_ids: + expression_data = expression_id.read(['sequence', 'name'])[0] + del expression_data['id'] + expression_data['extid'] = '__export__.mis_report_kpi_expression_%s' % expression_id.id + kpi_data['expression_ids'].append(expression_data) + report_data['kpi_ids'].append(kpi_data) + if report_id.subkpi_ids: + report_data['subkpi_ids'] = [] + for subkpi_id in report_id.subkpi_ids: + subkpi_data = subkpi_id.read(['sequence', 'name', 'description'])[0] + del subkpi_data['id'] + subkpi_data['extid'] = '__export__.mis_report_subkpi_%s' % subkpi_id.id + subkpi_data['expression_ids'] = [] + for expression_id in subkpi_id.expression_ids: + expression_data = expression_id.read(['sequence', 'name'])[0] + del expression_data['id'] + expression_data['kpi_id'] = '__export__.mis_report_kpi_%s' % expression_id.kpi_id.id + expression_data['extid'] = '__export__.mis_report_kpi_expression_%s' % expression_id.id + subkpi_data['expression_ids'].append(expression_data) + report_data['subkpi_ids'].append(subkpi_data) + if report_id.subreport_ids: + report_data['subreport_ids'] = [] + for subreport_id in report_id.subreport_ids: + subreport_data = subreport_id.read(['name'])[0] + del subreport_data['id'] + subreport_data['subreport_id'] = '__export__.mis_report_%s' % subreport_id.subreport_id.id + report_data['subreport_ids'].append(subreport_data) + return report_data + + @api.model + def _get_query_fields(self): + return QUERY_FIELDS + + @api.model + def _get_report_fields(self): + return REPORT_FIELDS + + @api.model + def _get_kpi_fields(self): + return KPI_FIELDS + + @api.model + def _get_style_fields(self): + return STYLE_FIELDS diff --git a/mis_builder_expimp/wizards/mis_builder_import_views.xml b/mis_builder_expimp/wizards/mis_builder_import_views.xml new file mode 100644 index 0000000..b2f57ab --- /dev/null +++ b/mis_builder_expimp/wizards/mis_builder_import_views.xml @@ -0,0 +1,34 @@ + + + + + mis.builder.import.wizard.view + mis.builder.import.wizard + +
    +
    +

    This wizard will import a MIS report from json File.

    +
    + +
    +
    + +
    +
    + + Import MIS Report + ir.actions.act_window + mis.builder.import.wizard + form + new + + +
    +
    \ No newline at end of file diff --git a/mis_builder_expimp/wizards/mis_builder_import_wizard.py b/mis_builder_expimp/wizards/mis_builder_import_wizard.py new file mode 100644 index 0000000..ce6d5d6 --- /dev/null +++ b/mis_builder_expimp/wizards/mis_builder_import_wizard.py @@ -0,0 +1,166 @@ +import copy +import json +import logging +import subprocess +import sys +from io import StringIO +from pathlib import Path + +from flectra import models, fields, api, _ +from flectra.tools import config, etree, base64, convert_xml_import, tempfile + +import os + +from flectra.exceptions import ValidationError + +_logger = logging.getLogger(__name__) + + +class MisBuilderImportWizard(models.TransientModel): + # Private attributes + _name = "mis.builder.import.wizard" + _description = "Import MIS Builder Report" + + file = fields.Binary( + string='Settings File', + required=True, + ) + + def __int__(self): + super(MisBuilderImportWizard, self).__int__() + + def import_report(self): + self.ensure_one() + + json_data = base64.b64decode(self.file) + report_data = json.loads(json_data) + + for report_entry in report_data: + report_values = self.__prepare_report_values(report_entry) + + self.__prepare_style_values(report_entry, report_values) + + self.__prepare_subreport_values(report_entry, report_values) + + self.__prepare_query_values(report_values) + + self.__prepare_kpi_values(report_values) + + subkpi_values = [] + if report_values.get('subkpi_ids'): + for subkpi_value in report_values['subkpi_ids']: + subkpi_values.append(subkpi_value) + del report_values['subkpi_ids'] + + new_report = self.env['mis.report'].create(report_values) + self._create_external_reference(new_report, report_entry['extid']) + + self.__update_subkpi_values(new_report, report_entry, subkpi_values) + + def __prepare_style_values(self, report_entry, report_values): + if report_entry.get('style_id'): + report_values['style_id'] = self._create_style(report_values['style_id']).id + + def __prepare_report_values(self, report_entry): + result = self.env['ir.model.data'].xmlid_to_res_id(report_entry['extid']) + if result: + raise ValidationError('Report already exists! Please delete it first before importing') + report_values = copy.deepcopy(report_entry) + + del report_values['extid'] + for kpi in report_values['kpi_ids']: + del kpi['extid'] + for expr in kpi['expression_ids']: + del expr['extid'] + + for kpi in report_values['subkpi_ids']: + del kpi['extid'] + for expr in kpi['expression_ids']: + del expr['extid'] + report_values['move_lines_source'] = self.env['ir.model'].search([('model', '=', report_values['move_lines_source'])]).id + return report_values + + def __update_subkpi_values(self, new_report, report_entry, subkpi_values): + temporary_extids = self.env['ir.model.data'] + subkpi_updates = [] + if subkpi_values: + for kpi_id in new_report.kpi_ids: + for kpi_data in report_entry['kpi_ids']: + if kpi_id.sequence == kpi_data['sequence']: + temporary_extids |= self._create_external_reference(kpi_id, kpi_data['extid']) + for subkpi_value in subkpi_values: + expression_updates = [] + for expression_value in subkpi_value['expression_ids']: + expression_value['kpi_id'] = self.env.ref(expression_value['kpi_id']).id + expression_updates.append((0, False, expression_value)) + subkpi_value['expression_ids'] = expression_updates + subkpi_updates.append((0, False, subkpi_value)) + if subkpi_updates: + new_report.write({'subkpi_ids': subkpi_updates}) + if temporary_extids: + temporary_extids.unlink() + + def __prepare_kpi_values(self, report_values): + if report_values.get('kpi_ids'): + kpi_values = [] + for kpi_value in report_values['kpi_ids']: + self.__prepare_style_values(kpi_value, kpi_value) + if kpi_value.get('auto_expand_accounts_style_id'): + kpi_value['auto_expand_accounts_style_id'] = self._create_style(kpi_value['auto_expand_accounts_style_id']).id + if report_values.get('subkpi_ids'): + del kpi_value['expression'] + del kpi_value['expression_ids'] + else: + if kpi_value.get('expression_ids'): + expression_values = [(0, False, v) for v in kpi_value['expression_ids']] + kpi_value['expression_ids'] = expression_values + kpi_values.append((0, False, kpi_value)) + report_values['kpi_ids'] = kpi_values + + def __prepare_query_values(self, report_values): + if report_values.get('query_ids'): + query_values = [] + for query_value in report_values['query_ids']: + query_model = self.env['ir.model'].search([('model', '=', query_value['model_id'])]) + query_value['model_id'] = query_model.id + query_value['field_ids'] = [(6, 0, [f.id for f in query_model.field_id if f.name in query_value['field_ids']])] + query_values.append((0, False, query_value)) + report_values['query_ids'] = query_values + + def __prepare_subreport_values(self, report_entry, report_values): + if report_entry.get('subreport_ids'): + subreport_values = [] + for subreport_value in report_entry['subreport_ids']: + subreport_value['subreport_id'] = self.env.ref(subreport_value['subreport_id']).id + subreport_values.append((0, False, subreport_value)) + report_values['subreport_ids'] = subreport_values + + @api.model + def _create_style(self, style_data): + exit_id = style_data['extid'] + result = self.env['ir.model.data'].xmlid_to_object(exit_id) + if result: + return result + + del style_data['extid'] + new_style = self.env['mis.report.style'].create(style_data) + self._create_external_reference(new_style, exit_id) + return new_style + + def _create_external_reference(self, obj, extid, temporary=False): + module, name = extid.split('.', 1) + existing = self.env['ir.model.data'].search([ + ('module', '=', module), + ('model', '=', obj._name), + ('name', '=', name), + ], limit=1) + if existing: + existing.res_id = obj.id + return existing + + return self.env['ir.model.data'].create({ + 'module': module, + 'model': obj._name, + 'name': name, + 'res_id': obj.id, + }) diff --git a/mis_builder_expimp_budget/__init__.py b/mis_builder_expimp_budget/__init__.py new file mode 100644 index 0000000..326c3db --- /dev/null +++ b/mis_builder_expimp_budget/__init__.py @@ -0,0 +1 @@ +from . import wizards \ No newline at end of file diff --git a/mis_builder_expimp_budget/__manifest__.py b/mis_builder_expimp_budget/__manifest__.py new file mode 100644 index 0000000..d44c2a4 --- /dev/null +++ b/mis_builder_expimp_budget/__manifest__.py @@ -0,0 +1,14 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "MIS Builder Import / Export", + "summary": """Import / Export Reports with all dependencies""", + "version": "2.0.1.0.0", + "license": "AGPL-3", + "author": "Jamotion GmbH", + "website": "https://gitlab.com/flectra-community/mis-builder", + "depends": ["mis_builder_expimp", "mis_builder_budget"], + "data": [], + "installable": True, + "auto_install": True, +} diff --git a/mis_builder_expimp_budget/security/ir.model.access.csv b/mis_builder_expimp_budget/security/ir.model.access.csv new file mode 100644 index 0000000..2408cf4 --- /dev/null +++ b/mis_builder_expimp_budget/security/ir.model.access.csv @@ -0,0 +1,3 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +access_mis_builder_import_wizard,access_mis_builder_import_wizard,model_mis_builder_import_wizard,account.group_account_manager,1,1,1,1 +access_mis_builder_export_wizard,access_mis_builder_export_wizard,model_mis_builder_export_wizard,account.group_account_manager,1,1,1,1 \ No newline at end of file diff --git a/mis_builder_expimp_budget/static/description/icon.png b/mis_builder_expimp_budget/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1afa781fabb8088818f3940ef56711e6281bd31e GIT binary patch literal 4770 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 +
    +
    +
    + +

    MIS Builder - Import / Export

    +

    Function to import / export MIS Report Templates

    +
    +
    +
    + +
    +
    +

    Full export and import of report template

    +
    + +
    +
    +

    + When exporting a report, all related data are exported too: +

    +
      +
    • KPIs
    • +
    • SubKPIs
    • +
    • Expressions
    • +
    • Queries
    • +
    • Sub Reports
    • +
    • Styles
    • +
    +
    +
    +
    + +
    +
    +

    Quick Start

    +
    +

    Installation

    +
    +

    + There are no dependencies other than flectra base modules, so you can simply install the module. +

    +
    +
    +
    +

    Configuration

    +
    +

    + No configuration options available. +

    +
    +
    +
    +

    Usage

    +
    +

    + You will find two new menu items at Finance -> Configuration -> MIS Reporting: +

    +
      +
    • Export MIS Report -> shows a PopUp to select the report to export
    • +
    • Import MIS Report -> shows a PopUp to select the file of exported report to import
    • +
    +
    +
    + +
    +
    + +
\ No newline at end of file diff --git a/mis_builder_expimp_budget/static/description/screenshot.png b/mis_builder_expimp_budget/static/description/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..9cbb176a16c35c0e6a21bf092b8ffc9ddccb8aaa GIT binary patch literal 73830 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 z5f=ae0000001+1e00000000pe00000000ni0RR910000GaRC4T000005ODzj00000 z01$Bj00000000ni0RR910000H7XSbN000005f=ae0000001+1e00000000pe00000 z000ni0RR910000GaRC4T000005ODzj0000001$Bj00000000s9me3XL-@N*8o)+Z_ z00000004KK=;q$WsW0#R{b)&(DF&;+2gmob_wo%A+e%Tcw^@CCJqiH;00000;MPQ3 zA~IR|#EgydG>2Y}BO(gy-5-St00000004JG#I3EZRVtModoRm3|dya^7)#)k6(h92eBy#fU)4#93f+3=slcZ z000000Kk12aWxtZ5p_7_w#TF{$j}ZPHO^CEtj*fHYj2jzBVCl@vI_@txUk_5`zeeS zM|N&Ind1@bFC`)}R_0#ud2r-7I}u-ad`nVF?$`mooNL5{$0CGyd*%4HR5sF6#!!8B z(veH{k;CFVtu@7`4;&gl*{U_9NDz#I1v$P?R$)T zu$z60IT*(-p&oJ~o>Thy*&ZmXqAp6kbFWeH#BoH#*tt7M(^Wbm;o4o^t9v&)5fQQO z{$6}?c|Gr|WEz%KnZEaAZQ#(sZXB`d;!AbTy@q%yIU(Px+9hEGhld(y;NLseD$g8Yzjm5xrdJB1V)c>YZ#}Q zw^B&0{G-Q4`EngvBLDyZ0002oCoJC=S0&s3b+?R(t=l}o!0001hrKZ!{mv4zk9uU^M zD0%z(6r;?+yGOSksb>-rWseLBvYfvSg=aEK4OFppeKHXdapK-XCv>s%jfqwtO-bC8 zR8KOcclXHda_mR|000000AS|Mo!j*JjodT{ZU)cu7N_vdnHm|5Mx)VaGMNkpgYdYt zv~lVVW>00000004l93jhEB0001hhzkG!00000fQSnK z000000Dy=K00000008$g5sKh`P(307h0t+!+fUrWrRj9KPFfBUi3F7a00000Iv2F! z0ssI20000YE&u=k00000A}#;`0000003t2`00000001H`00000001E30ssI20000W z;sO8w00000AmRc50000003hN500000001H`Kxbtb_=(4FU)jo8UK*$T?I#C0>b7O7 zKRF_=)5%YzyF&a_BRWmAbG>;KaO3g))8^Ok&~WzD%y!br33%~002P5 zg_|JeUs>+lGrjKhhbpe9$t_AY_hY9ig@wPIy94Vsc@B{e(W}?)>iAnE8Q+w@u&ikU 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 z&T&!8#y8Wi6qxI5>l~k1l@wYEkbR?EW?H?tF&ULY!Lf(WYL-b0Cjq->PlN#&0 zGwmxq3Yukk7jk=U`#1Kol;Ce-~5>C&h6WV56)RtqFSGH^1?CG00000 z0I-kj{9Ig76n8u6RIDRorMGETd&nkkDVEk&e0*GdoXFG4XwQT@EJc3h4#wNfXSH!7s z`~d&}0000E5cb(;pKX1;`-cVrJdM}uWgIWdL`1SIZ+szHmN#F@B-7fO&t{87bpZeX z006*lOiaw`bZTP67$ahgF~*2!^DCq61C^0)0RR91003a05>N%OkNEwV@EQOB007{C z5XF~2@h^vJ1poj5004l40TCAf0000001$Bj00000000ni0RR910000GaRC4T00000 z5ODzj0000001+1e00000000pe000000000H7XSbN000005f=ae000005ODzj00000 z01$Bj00000000ni0RR910000GaRC4T000005ODzj0000001+1e00000000pe00000 z0000H7XSbN000005f=ae000005ODzj0000001$Bj00000003Ss0aXA1000MuEX(WP zFvd_D003_w^x^^l0KkEYxV5#{L!r=S)&&3nMBIHT*ni`TZ(F9GzQC&U@|W!kIOG5T z00)>PNevBmYiqCj{XV2z0Dw2puNeFKm)x*N&rc2*Hkdxnj|EQVq zzQLbtah|KiZyx*zV!A0BgPwk_#NDF54I z4uMGaOn2UCxISS1I8(pdh-*o!u>7hwBCRbf`*dgv00007#hp8MDk>@jL8z)as#2+t zasdDkai32XVjb$4`xE|5he$+hc4$x&?_ks3ZA-c*XI5-Q1@T5ABCX|6&2iPTMziBO ziRXEqCnAF_%dT&qU!_bv5lM6X^(|c!t3f74CzV!J*>ps->in^RPmh}I8Cz8)zkRmS z-T0q9(I1`4)DUsOx!wk6_v}i5L_=Efv7)5)pv?T!9ar!4FZd+2#a?x!(xT$V?)>k& z;{i#U`{Iih;x*+L-*vFX?uPpN(`zAKh_M$}mZi%Nu3Q;Qc=u$sk{B&_T>7~u^Xw;C zCL)UT-}rpg_R*{@9&k2xjV|~}5pBz^ zC_8Kr7`gj?uA5D?1_npnk`&e@K3o_8003TCYHI53+qbK$s|7((R#t(O3jlzKy9*L$ zO|^6nj|Uv-Dv}llrxnTN`r#cSt|lf*+uYtb!sjPi)I3F$W_#>&*3AW%$0j|-R09!l zfyq0!@A*qlerz|&bDg!f?{u6wo3Cd?(#*hc{Hb?7G6_UP?#-VLjMUv}Hx!@y&~B9G zI&R*&I$-)RO;1F=krB_4lNW93$UwvQb9aQ003`B#P$3AZnt||mJs#&=L`~N@s3ni_n<#5N0{%Q71Q(8G`!PdNoD7yPS^eV z9~ykJHagapnw^stqugOh?PSw8Upk4TNKldzO3$U~iHJ=N4HL5S5DSH z`I)XHNlXfReg3ehjwyNjQzDrtDcMvvJ{z{#{8O{RoZ`&>zEMw(Sv5bhtk0-cbH1Sm zYnFnOHa$M)RT0tR$XMWTO;(hOhzuD;Sr2XuEXWCFBI1nM*;XYH z@#f?NQ{BQMrN^U%0ssKKxNtbk^L#-;!7so3a_ZD6K@f_IipP-iU}RiXsth zO}V?tw?rhV;xb~LwNt(v)#$L!aZ$_0cV3X!q!b=aDP&U6y)-@9*>W39f&q6csxpYM*CK)aoDh_Q^_d zvoBQCiVp*^g6COer+tki6rD_Sxo&;e<`=Ya$%l&z(hY(-KGD)Qz92<;CM5fjM90d# zYtz0W-Nd*)@okZ@MNhyt+VI8a4VyI+XOVVZ74!K*;Rio_-nzL#RqXnHFoj0_a8G%q zK;8(NCjbDzuOdm3BuRoGl$V$P_~Vb~&z~0rAwNGKDHj0Xjfl8Uq}*NR+w~}BNwtOt zCZ|+$Vrrg-LOcJNnH?R~CONcB=9Rh_dsbz5{JY^fDQo*|$q`bk54#MPuu&)$!e|6zv!08!V?j3e)l5jOd_M*4$D?W=Tx1}sfzfQXS-Xj z-|dY%muoO4q$~P|r^Z)VLaA0TJFKi@d`dsZk`L>NWVKeMb{u)HDw%)&s?=&xRr>bs zr_llc0Du=24u=In5CnmUjvhVw_19m2@WBUyAmrraC=?2$TmXOr?9ojr>&f;-@+}dO z9P7wf>1~?T98AW0$r@@QxOv?12A(>;}J<5O2D;$I%@pAJUF z7>Fp=k-E}dH?$Za;`|HuZ{4})e%52|B(*IgYRTC;>XwKLE)U(k@$=BiGjlpG%B#~0 zzTndAf?tmG-}=k#z8SyFiF%_!$?-f9$)r!RE2o`3E3t`DMB$i}kymM{0Z;X10XvbAWIg(U8&0X_8B9ayd8*X<`OK67x001wOBuU|LI2>Mo z79pKJefoq*JQoD*MqDm+`=5K1L{iew$ z^ZKZavSa#ZfB33OK6=F0;Jo@}eSjAYX~pNWOwU+4BE;q7YHwZr_A6!d;p1<`q~@0{ zI2$jw`XpWvZ7ZzESWo=A#CS#5uqD|@L^6wZ#8c;@&Au_|@x~T!ep%-wQJ<7uo~tmJIOD-92@U;l_)mgS8vB+K&VOPOR^Tl3j$v8XNp0C
    ^D8bn+G001~> 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 +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +import base64 +import json + +from lxml import etree + +from flectra import api, fields, models, _ + + +class MisBuilderExportWizard(models.TransientModel): + _inherit = "mis.builder.export.wizard" + + @api.model + def _get_query_fields(self): + result = super(MisBuilderExportWizard, self)._get_query_fields() + return result + + @api.model + def _get_report_fields(self): + result = super(MisBuilderExportWizard, self)._get_report_fields() + return result + + @api.model + def _get_kpi_fields(self): + result = super(MisBuilderExportWizard, self)._get_kpi_fields() + result.append('budgetable') + return result + + @api.model + def _get_style_fields(self): + result = super(MisBuilderExportWizard, self)._get_style_fields() + return result From e3008bb2fc667a0ba82dd850068961c49a00b32c Mon Sep 17 00:00:00 2001 From: Renzo Meister Date: Tue, 14 Dec 2021 11:58:03 +0100 Subject: [PATCH 5/5] =?UTF-8?q?=E2=9C=A8=20Import=20/=20Export=20of=20MIS?= =?UTF-8?q?=20Builder=20Templates=20and=20Styles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mis_builder_expimp/wizards/mis_builder_import_wizard.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mis_builder_expimp/wizards/mis_builder_import_wizard.py b/mis_builder_expimp/wizards/mis_builder_import_wizard.py index ce6d5d6..8ed5626 100644 --- a/mis_builder_expimp/wizards/mis_builder_import_wizard.py +++ b/mis_builder_expimp/wizards/mis_builder_import_wizard.py @@ -68,14 +68,14 @@ class MisBuilderImportWizard(models.TransientModel): report_values = copy.deepcopy(report_entry) del report_values['extid'] - for kpi in report_values['kpi_ids']: + for kpi in report_values.get('kpi_ids', []): del kpi['extid'] - for expr in kpi['expression_ids']: + for expr in kpi.get('expression_ids', []): del expr['extid'] - for kpi in report_values['subkpi_ids']: + for kpi in report_values.get('subkpi_ids', []): del kpi['extid'] - for expr in kpi['expression_ids']: + for expr in kpi.get('expression_ids', []): del expr['extid'] report_values['move_lines_source'] = self.env['ir.model'].search([('model', '=', report_values['move_lines_source'])]).id return report_values