From a4568427c8cfd5dbae518e72e94b08675bdfb9d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul=20=28ACSONE=29?= Date: Sat, 30 Sep 2017 16:40:55 +0200 Subject: [PATCH] [DEL] mis_builder moved to OCA/mis-builder --- mis_builder/CHANGES.rst | 108 -- mis_builder/README.rst | 128 -- mis_builder/__init__.py | 7 - mis_builder/__manifest__.py | 46 - mis_builder/datas/ir_cron.xml | 18 - mis_builder/i18n/es.po | 1097 ----------------- mis_builder/i18n/fr.po | 1088 ---------------- mis_builder/i18n/hr_HR.po | 1097 ----------------- mis_builder/i18n/nl_NL.po | 1097 ----------------- mis_builder/i18n/pt.po | 1097 ----------------- mis_builder/models/__init__.py | 8 - mis_builder/models/accounting_none.py | 191 --- mis_builder/models/aep.py | 442 ------- mis_builder/models/aggregate.py | 129 -- mis_builder/models/data_error.py | 15 - mis_builder/models/mis_report.py | 1043 ---------------- mis_builder/models/mis_report_instance.py | 422 ------- mis_builder/models/mis_report_style.py | 280 ----- mis_builder/models/mis_safe_eval.py | 33 - mis_builder/models/simple_array.py | 131 -- mis_builder/report/__init__.py | 6 - .../report/mis_report_instance_qweb.py | 24 - .../report/mis_report_instance_qweb.xml | 89 -- .../report/mis_report_instance_xlsx.py | 142 --- .../report/mis_report_instance_xlsx.xml | 15 - mis_builder/security/ir.model.access.csv | 17 - mis_builder/security/mis_builder_security.xml | 13 - .../static/description/ex_dashboard.png | Bin 35232 -> 0 bytes mis_builder/static/description/ex_report.png | Bin 83314 -> 0 bytes .../static/description/ex_report_template.png | Bin 100819 -> 0 bytes mis_builder/static/description/icon.png | Bin 9455 -> 0 bytes mis_builder/static/description/icon.svg | 79 -- mis_builder/static/description/index.html | 75 -- mis_builder/static/src/css/custom.css | 30 - mis_builder/static/src/css/report.css | 45 - mis_builder/static/src/img/icon.png | Bin 3464 -> 0 bytes mis_builder/static/src/js/mis_builder.js | 173 --- mis_builder/static/src/xml/mis_widget.xml | 57 - mis_builder/tests/__init__.py | 13 - mis_builder/tests/mis.report.csv | 2 - mis_builder/tests/mis.report.instance.csv | 2 - .../tests/mis.report.instance.period.csv | 2 - mis_builder/tests/mis.report.kpi.csv | 2 - mis_builder/tests/mis.report.query.csv | 2 - mis_builder/tests/test_accounting_none.py | 12 - mis_builder/tests/test_aep.py | 226 ---- mis_builder/tests/test_aggregate.py | 12 - mis_builder/tests/test_fetch_query.py | 40 - mis_builder/tests/test_mis_report_instance.py | 141 --- mis_builder/tests/test_mis_safe_eval.py | 27 - mis_builder/tests/test_render.py | 158 --- mis_builder/tests/test_simple_array.py | 12 - mis_builder/tests/test_utc_midnight.py | 25 - mis_builder/views/mis_report.xml | 172 --- mis_builder/views/mis_report_instance.xml | 213 ---- mis_builder/views/mis_report_style.xml | 80 -- mis_builder/wizard/__init__.py | 5 - mis_builder/wizard/mis_builder_dashboard.py | 66 - mis_builder/wizard/mis_builder_dashboard.xml | 33 - mis_builder_demo/README.rst | 46 - mis_builder_demo/__init__.py | 23 - mis_builder_demo/__manifest__.py | 53 - mis_builder_demo/mis.report.csv | 3 - mis_builder_demo/mis.report.instance.csv | 3 - .../mis.report.instance.period.csv | 8 - mis_builder_demo/mis.report.kpi.csv | 10 - mis_builder_demo/mis.report.query.csv | 3 - setup/mis_builder/odoo/__init__.py | 1 - setup/mis_builder/odoo/addons/__init__.py | 1 - setup/mis_builder/odoo/addons/mis_builder | 1 - setup/mis_builder/setup.py | 6 - 71 files changed, 10645 deletions(-) delete mode 100644 mis_builder/CHANGES.rst delete mode 100644 mis_builder/README.rst delete mode 100644 mis_builder/__init__.py delete mode 100644 mis_builder/__manifest__.py delete mode 100644 mis_builder/datas/ir_cron.xml delete mode 100644 mis_builder/i18n/es.po delete mode 100644 mis_builder/i18n/fr.po delete mode 100644 mis_builder/i18n/hr_HR.po delete mode 100644 mis_builder/i18n/nl_NL.po delete mode 100644 mis_builder/i18n/pt.po delete mode 100644 mis_builder/models/__init__.py delete mode 100644 mis_builder/models/accounting_none.py delete mode 100644 mis_builder/models/aep.py delete mode 100644 mis_builder/models/aggregate.py delete mode 100644 mis_builder/models/data_error.py delete mode 100644 mis_builder/models/mis_report.py delete mode 100644 mis_builder/models/mis_report_instance.py delete mode 100644 mis_builder/models/mis_report_style.py delete mode 100644 mis_builder/models/mis_safe_eval.py delete mode 100644 mis_builder/models/simple_array.py delete mode 100644 mis_builder/report/__init__.py delete mode 100644 mis_builder/report/mis_report_instance_qweb.py delete mode 100644 mis_builder/report/mis_report_instance_qweb.xml delete mode 100644 mis_builder/report/mis_report_instance_xlsx.py delete mode 100644 mis_builder/report/mis_report_instance_xlsx.xml delete mode 100644 mis_builder/security/ir.model.access.csv delete mode 100644 mis_builder/security/mis_builder_security.xml delete mode 100644 mis_builder/static/description/ex_dashboard.png delete mode 100644 mis_builder/static/description/ex_report.png delete mode 100644 mis_builder/static/description/ex_report_template.png delete mode 100644 mis_builder/static/description/icon.png delete mode 100644 mis_builder/static/description/icon.svg delete mode 100644 mis_builder/static/description/index.html delete mode 100644 mis_builder/static/src/css/custom.css delete mode 100644 mis_builder/static/src/css/report.css delete mode 100644 mis_builder/static/src/img/icon.png delete mode 100644 mis_builder/static/src/js/mis_builder.js delete mode 100644 mis_builder/static/src/xml/mis_widget.xml delete mode 100644 mis_builder/tests/__init__.py delete mode 100644 mis_builder/tests/mis.report.csv delete mode 100644 mis_builder/tests/mis.report.instance.csv delete mode 100644 mis_builder/tests/mis.report.instance.period.csv delete mode 100644 mis_builder/tests/mis.report.kpi.csv delete mode 100644 mis_builder/tests/mis.report.query.csv delete mode 100644 mis_builder/tests/test_accounting_none.py delete mode 100644 mis_builder/tests/test_aep.py delete mode 100644 mis_builder/tests/test_aggregate.py delete mode 100644 mis_builder/tests/test_fetch_query.py delete mode 100644 mis_builder/tests/test_mis_report_instance.py delete mode 100644 mis_builder/tests/test_mis_safe_eval.py delete mode 100644 mis_builder/tests/test_render.py delete mode 100644 mis_builder/tests/test_simple_array.py delete mode 100644 mis_builder/tests/test_utc_midnight.py delete mode 100644 mis_builder/views/mis_report.xml delete mode 100644 mis_builder/views/mis_report_instance.xml delete mode 100644 mis_builder/views/mis_report_style.xml delete mode 100644 mis_builder/wizard/__init__.py delete mode 100644 mis_builder/wizard/mis_builder_dashboard.py delete mode 100644 mis_builder/wizard/mis_builder_dashboard.xml delete mode 100644 mis_builder_demo/README.rst delete mode 100644 mis_builder_demo/__init__.py delete mode 100644 mis_builder_demo/__manifest__.py delete mode 100644 mis_builder_demo/mis.report.csv delete mode 100644 mis_builder_demo/mis.report.instance.csv delete mode 100644 mis_builder_demo/mis.report.instance.period.csv delete mode 100644 mis_builder_demo/mis.report.kpi.csv delete mode 100644 mis_builder_demo/mis.report.query.csv delete mode 100644 setup/mis_builder/odoo/__init__.py delete mode 100644 setup/mis_builder/odoo/addons/__init__.py delete mode 120000 setup/mis_builder/odoo/addons/mis_builder delete mode 100644 setup/mis_builder/setup.py diff --git a/mis_builder/CHANGES.rst b/mis_builder/CHANGES.rst deleted file mode 100644 index 4f75eda8..00000000 --- a/mis_builder/CHANGES.rst +++ /dev/null @@ -1,108 +0,0 @@ -Changelog ---------- - -.. Future (?) -.. ~~~~~~~~~~ -.. -.. * - -10.0.2.0.3 (unreleased) -~~~~~~~~~~~~~~~~~~~~~~~ - -* [IMP] more robust behaviour in presence of missing expressions -* [FIX] indent style -* [FIX] local variable 'ctx' referenced before assignment when generating - reports with no objects -* [IMP] use fontawesome icons -* [MIG] migrate to 10.0 -* [FIX] unicode error when exporting to Excel -* [IMP] provide full access to mis builder style for group Adviser. - -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) -~~~~~~~~~~~~~~~~~~~~~~ - -* [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) -~~~~~~~~~~~~~~~~~~~~~~ - -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. - -* [IMP] hide button box in edit mode on the report instance settings form -* [FIX] Fix sum aggregation of non-stored fields (issue #178) -* [IMP] There is now a default style at the report level -* [CHG] Number display properties (rounding, prefix, suffix, factor) are - now defined in styles -* [CHG] Percentage difference are rounded to 1 digit instead of the kpi's - rounding, as the KPI rounding does not make sense in this case -* [CHG] The divider suffix (k, M, etc) is not inserted automatically anymore - because it is inconsistent when working with prefixes; you need to add it - manually in the suffix -* [IMP] AccountingExpressionProcessor now supports 'balu' expressions - to obtain the unallocated profit/loss of previous fiscal years; - get_unallocated_pl is the corresponding convenience method -* [IMP] AccountingExpressionProcessor now has easy methods to obtain - balances by account: get_balances_initial, get_balances_end, - get_balances_variation -* [IMP] there is now an auto-expand feature to automatically display - a detail by account for selected kpis -* [IMP] the kpi and period lists are now manipulated through forms instead - of directly in the tree views -* [IMP] it is now possible to create a report through a wizard, such - reports are deemed temporary and available through a "Last Reports Generated" - menu, they are garbaged collected automatically, unless saved permanently, - which can be done using a Save button -* [IMP] there is now a beginner mode to configure simple reports with - only one period -* [IMP] it is now easier to configure periods with fixed start/end dates -* [IMP] the new sub-kpi mechanism allows the creation of columns - with multiple values, or columns with different values -* [IMP] thanks to the new style model, the Excel export is now styled -* [IMP] a new style model is now used to centralize style configuration -* [FIX] use =like instead of like to search for accounts, because - the % are added by the user in the expressions -* [FIX] Correctly compute the initial balance of income and expense account - based on the start of the fiscal year -* [IMP] Support date ranges (from OCA/server-tools/date_range) as a more - flexible alternative to fiscal periods -* v9 migration: fiscal periods are removed, account charts are removed, - consolidation accounts have been removed - -8.0.1.0.0 (2016-04-27) -~~~~~~~~~~~~~~~~~~~~~~ - -* The copy of a MIS Report Instance now copies period. - https://github.com/OCA/account-financial-reporting/pull/181 -* The copy of a MIS Report Template now copies KPIs and queries. - https://github.com/OCA/account-financial-reporting/pull/177 -* Usability: the default view for MIS Report instances is now the rendered preview, - and the settings are accessible through a gear icon in the list view and - a button in the preview. - https://github.com/OCA/account-financial-reporting/pull/170 -* Display blank cells instead of 0.0 when there is no data. - https://github.com/OCA/account-financial-reporting/pull/169 -* Usability: better layout of the MIS Report periods settings on small screens. - https://github.com/OCA/account-financial-reporting/pull/167 -* Include the download buttons inside the MIS Builder widget, and refactor - the widget to open the door to analytic filtering in the previews. - https://github.com/OCA/account-financial-reporting/pull/151 -* Add KPI rendering prefixes (so you can print $ in front of the value). - https://github.com/OCA/account-financial-reporting/pull/158 -* Add hooks for analytic filtering. - https://github.com/OCA/account-financial-reporting/pull/128 - https://github.com/OCA/account-financial-reporting/pull/131 - -8.0.0.2.0 -~~~~~~~~~ - -Pre-history. Or rather, you need to look at the git log. diff --git a/mis_builder/README.rst b/mis_builder/README.rst deleted file mode 100644 index c9d14826..00000000 --- a/mis_builder/README.rst +++ /dev/null @@ -1,128 +0,0 @@ -.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg - :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html - :alt: License: AGPL-3 - -=========== -MIS Builder -=========== - -This module allows you to build Management Information Systems dashboards. -Such style of reports presents KPI in rows and time periods in columns. -Reports mainly fetch data from account moves, but can also combine data coming -from arbitrary Odoo models. Reports can be exported to PDF, Excel and they -can be added to Odoo dashboards. - -Installation -============ - -There is no specific installation procedure for this module. - -Configuration and Usage -======================= - -To configure this module, you need to: - -* Go to Accounting > Configuration > Financial Reports > MIS Report Templates where - you can create report templates by defining KPI's. KPI's constitute the rows of your - reports. Such report templates are time independent. - -.. figure:: static/description/ex_report_template.png - :scale: 80 % - :alt: Sample report template - -* Then in Accounting > Reporting > MIS Reports you can create report instance by - binding the templates to time period, hence defining the columns of your reports. - -.. figure:: static/description/ex_report.png - :alt: Sample report configuration - -* From the MIS Report view, you can preview the report, add it to and Odoo dashboard, - and export it to PDF or Excel. - -.. figure:: static/description/ex_dashboard.png - :alt: Sample dashboard view - -.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas - :alt: Try me on Runbot - :target: https://runbot.odoo-community.org/runbot/91/10.0 - -Developer notes -=============== - -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 -selection. A typical use case could be to add an analytic account field on mis.report.instance, -or even on mis.report.instance.period if you want different columns to show different -analytic accounts. - -Known issues / Roadmap -====================== - -* V9 thoughts: - - * select accounts by tag (see also select accounts by type below) - * how to handle multi-company consolidation now that consolidation children are gone? - * what replaces root accounts / account charts in v9? nothing it seems, so - we are limited to one chart of accounts per company; - * for multi-company consolidation, must we replace the consolidation chart - of account by a list of companies? - -* Allow selecting accounts by type. This is currently possible by expressing - a query such as balp[][('account_id.user_type.code', '=', ...)]. This will work - but would be more efficient if one could write balp[user_type=...], as it would - involve much less queries to the database. - Possible syntax could be balp[code:60%,70%], balp[type:...], balp[tag:...], - with code: being optional and the default. - -* More tests should be added. The first part is creating test data, then it will be - easier. At the minimum, We need the following test data: - - * one account charts with a few normal accounts and view accounts, - * two fiscal years, - * an opening entry in the second fiscal year, - * to test multi-company consolidation, we need a second company with it's own - account chart and two fiscal years, but without opening entry; we also need - a third company which is the parent of the other two and has a consolidation - chart of account. - -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 feedback -`here `_. - -Credits -======= - -Contributors ------------- - -* Stéphane Bidoul -* Laetitia Gangloff -* Adrien Peiffer -* Alexis de Lattre -* Alexandre Fayolle -* Jordi Ballester -* Thomas Binsfeld -* Giovanni Capalbo -* Marco Calcagni -* Sébastien Beau -* Laurent Mignon - -Maintainer ----------- - -.. image:: https://odoo-community.org/logo.png - :alt: Odoo Community Association - :target: https://odoo-community.org - -This module is maintained by the OCA. - -OCA, or the Odoo Community Association, is a nonprofit organization whose -mission is to support the collaborative development of Odoo features and -promote its widespread use. - -To contribute to this module, please visit http://odoo-community.org. diff --git a/mis_builder/__init__.py b/mis_builder/__init__.py deleted file mode 100644 index 409475d8..00000000 --- a/mis_builder/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2014-2015 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -from . import models -from . import wizard -from . import report diff --git a/mis_builder/__manifest__.py b/mis_builder/__manifest__.py deleted file mode 100644 index d0355f0a..00000000 --- a/mis_builder/__manifest__.py +++ /dev/null @@ -1,46 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2014-2015 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -{ - 'name': 'MIS Builder', - 'version': '10.0.2.0.2', - 'category': 'Reporting', - 'summary': """ - Build 'Management Information System' Reports and Dashboards - """, - 'author': 'ACSONE SA/NV,' - 'Odoo Community Association (OCA)', - 'website': 'http://acsone.eu', - 'depends': [ - 'account', - 'board', - 'report_xlsx', # OCA/reporting-engine - 'date_range', # OCA/server-tools - 'web_widget_color', # OCA/web - ], - 'data': [ - 'wizard/mis_builder_dashboard.xml', - 'views/mis_report.xml', - 'views/mis_report_instance.xml', - 'views/mis_report_style.xml', - 'datas/ir_cron.xml', - 'security/ir.model.access.csv', - 'security/mis_builder_security.xml', - 'report/mis_report_instance_qweb.xml', - 'report/mis_report_instance_xlsx.xml', - ], - 'demo': [ - 'tests/mis.report.kpi.csv', - 'tests/mis.report.query.csv', - 'tests/mis.report.csv', - 'tests/mis.report.instance.period.csv', - 'tests/mis.report.instance.csv', - ], - 'qweb': [ - 'static/src/xml/*.xml' - ], - 'installable': True, - 'application': True, - 'license': 'AGPL-3', -} diff --git a/mis_builder/datas/ir_cron.xml b/mis_builder/datas/ir_cron.xml deleted file mode 100644 index 800020e2..00000000 --- a/mis_builder/datas/ir_cron.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - Vacuum temporary reports - 4 - hours - -1 - - - - - - - - - diff --git a/mis_builder/i18n/es.po b/mis_builder/i18n/es.po deleted file mode 100644 index 7fef5ea0..00000000 --- a/mis_builder/i18n/es.po +++ /dev/null @@ -1,1097 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * mis_builder -# -# Translators: -# OCA Transbot , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-05-01 12:35+0000\n" -"PO-Revision-Date: 2017-05-01 12:35+0000\n" -"Last-Translator: OCA Transbot , 2017\n" -"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: es\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:796 -#: code:addons/mis_builder/models/mis_report_instance.py:262 -#, python-format -msgid "%s (copy)" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "" -"'accounts' is a comma-separated list of account codes, possibly containing %" -" wildcards" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "" -"'domain' is an optional filter on move lines (eg to filter on analytic " -"accounts or journal)" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* bal for balance (debit - credit)" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "" -"* bal[70]: variation of the balance of account 70 over the period (it is the" -" same as balp[70]);" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* bale[1%]: balance of accounts starting with 1 at end of period." -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* bali[70,60]: initial balance of accounts 70 and 60;" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* crd for credit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* deb for debit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* e: at the end of the period" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* i: at the beginning of the period" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* nothing or p: variation over the period" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.mis_report_instance_add_to_dashboard_action -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_add_to_dashboard_form_view -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -msgid "Add to dashboard" -msgstr "Añadir al tablero" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_period_view_form -msgid "Advanced" -msgstr "Avanzado" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_aggregate -msgid "Aggregate" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.instance,target_move:0 -msgid "All Entries" -msgstr "Todos los asientos" - -#. module: mis_builder -#: selection:mis.report.instance,target_move:0 -msgid "All Posted Entries" -msgstr "Todos los asientos asentados" - -#. 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." -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Auto expand" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:697 -#: selection:mis.report.query,aggregate:0 -#, python-format -msgid "Average" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_background_color -msgid "Background color" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_style_background_color -msgid "Background color in valid RGB code (from #000000 to #FFFFFF)" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_background_color_inherit -msgid "Background color inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_date -msgid "Base date" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_weight:0 -msgid "Bold" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:537 -#, python-format -msgid "Can not update a multi kpi from the kpi line" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_add_to_dashboard_form_view -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -msgid "Cancel" -msgstr "Cancelar" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Color" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_color_inherit -msgid "Color inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -msgid "Columns" -msgstr "Columnas" - -#. 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_comparison_column_ids -msgid "Compare with" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_compare_method -msgid "Comparison Method" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_comparison_mode -msgid "Comparison mode" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_create_uid -msgid "Created by" -msgstr "Creado por" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_create_date -msgid "Created on" -msgstr "Creado en" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_dashboard_id -msgid "Dashboard" -msgstr "Tablero" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_instance.py:92 -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_date_range_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_date_range_id -#: selection:mis.report.instance.period,type:0 -#, python-format -msgid "Date Range" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_date_range_type_id -msgid "Date Range Type" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_date_field -msgid "Date field" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_period_view_form -msgid "Dates" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_instance.py:90 -#: selection:mis.report.instance.period,type:0 -#, python-format -msgid "Day" -msgstr "Día" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_description -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_description -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_description -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_description -msgid "Description" -msgstr "Descripción" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:489 -#: selection:mis.report.kpi,compare_method:0 -#, python-format -msgid "Difference" -msgstr "Diferencia" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_display_name -msgid "Display Name" -msgstr "Nombre a mostrar" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_auto_expand_accounts -msgid "Display details by account" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_divider_inherit -msgid "Divider inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_domain -msgid "Domain" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_dp_inherit -msgid "Dp inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_duration -msgid "Duration" -msgstr "Duración" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Examples" -msgstr "Ejemplos" - -#. module: mis_builder -#. openerp-web -#: code:addons/mis_builder/static/src/xml/mis_widget.xml:9 -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_tree -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -#, python-format -msgid "Export" -msgstr "Exportar" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_name -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Expression" -msgstr "Expresión" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_ids -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_expression_ids -msgid "Expression ids" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Expressions are of the form [accounts][domain]" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_normalize_factor -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_divider -msgid "Factor" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Factor inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_instance_period_normalize_factor -msgid "Factor to use to normalize the period (used in comparison" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_field_names -msgid "Fetched fields name" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_field_ids -msgid "Fields to fetch" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.instance.period,mode:0 -msgid "Fixed dates" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Font" -msgstr "Fuente" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_size -msgid "Font size" -msgstr "Tamaño de fuente" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_size_inherit -msgid "Font size inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_style -msgid "Font style" -msgstr "Estilo de fuente" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_style_inherit -msgid "Font style inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_weight -msgid "Font weight" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_weight_inherit -msgid "Font weight inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_date_from -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_date_from -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_manual_date_from -msgid "From" -msgstr "Desde" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_id -msgid "ID" -msgstr "ID" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Indent" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_indent_level -msgid "Indent level" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_indent_level_inherit -msgid "Indent level inherit" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_style.py:52 -#, python-format -msgid "Indent level must be greater than or equal to 0" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_style:0 -msgid "Italic" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_ids -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -msgid "KPI's" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_kpi_id -msgid "Kpi id" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_landscape_pdf -msgid "Landscape PDF" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi___last_update -msgid "Last Modified on" -msgstr "Última modificación en" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.last_mis_report_instance_view_action -#: model:ir.ui.menu,name:mis_builder.last_wizard_mis_report_instance_view_menu -msgid "Last Reports Generated" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_write_uid -msgid "Last Updated by" -msgstr "Última modificación por" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_write_date -msgid "Last Updated on" -msgstr "Última actualización en" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Legend (for kpi expressions)" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -msgid "MIS Report" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -msgid "MIS Report Instance" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_tree -msgid "MIS Report Instances" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "MIS Report KPI" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_result_view_form -msgid "MIS Report Result" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "MIS Report Style" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.mis_report_style_view_action -#: model:ir.ui.menu,name:mis_builder.mis_report_style_view_menu -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_tree -msgid "MIS Report Styles" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.mis_report_view_action -#: model:ir.ui.menu,name:mis_builder.mis_report_view_menu -msgid "MIS Report Templates" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.menu,name:mis_builder.mis_report_conf_menu -#: model:ir.ui.menu,name:mis_builder.mis_report_finance_menu -msgid "MIS Reporting" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.mis_report_instance_view_action -#: model:ir.ui.menu,name:mis_builder.mis_report_instance_view_menu -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_tree -msgid "MIS Reports" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.report.xml,name:mis_builder.qweb_pdf_export -msgid "MIS report instance QWEB PDF report" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.report.xml,name:mis_builder.xls_export -msgid "MIS report instance XLS report" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:699 -#: selection:mis.report.query,aggregate:0 -#, python-format -msgid "Max" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:698 -#: selection:mis.report.query,aggregate:0 -#, python-format -msgid "Min" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_mode -msgid "Mode" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_model_id -msgid "Model" -msgstr "Modelo" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_multi -msgid "Multi" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_name -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_period_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -msgid "Name" -msgstr "Nombre" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:491 -#: selection:mis.report.kpi,compare_method:0 -#, python-format -msgid "None" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_style:0 -#: selection:mis.report.style,font_weight:0 -msgid "Normal" -msgstr "Normal" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Number" -msgstr "Número" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_instance_period_duration -msgid "Number of periods" -msgstr "Número de periodos" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:483 -#: selection:mis.report.kpi,type:0 -#, python-format -msgid "Numeric" -msgstr "Numérico" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_offset -msgid "Offset" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_instance_period_offset -msgid "Offset from current period" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:484 -#: code:addons/mis_builder/models/mis_report.py:490 -#: selection:mis.report.kpi,compare_method:0 selection:mis.report.kpi,type:0 -#, python-format -msgid "Percentage" -msgstr "Porcentaje" - -#. module: mis_builder -#: sql_constraint:mis.report.instance.period:0 -msgid "Period name should be unique by report" -msgstr "El nombre del periodo debe ser único en cada informe." - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_type -msgid "Period type" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_ids -msgid "Periods" -msgstr "Periodos" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_pivot_date -msgid "Pivot date" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Possible values for 'field' can be:" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Possible values for 'mode' are:" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_prefix -msgid "Prefix" -msgstr "Prefijo" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_prefix_inherit -msgid "Prefix inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -msgid "Preview" -msgstr "Previo" - -#. module: mis_builder -#. openerp-web -#: code:addons/mis_builder/static/src/xml/mis_widget.xml:8 -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_tree -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -#, python-format -msgid "Print" -msgstr "Imprimir" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:1002 -#, python-format -msgid "" -"Probably not your fault... but I'm really curious to know how you managed to" -" raise this error so I can handle one more corner case!" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_ids -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -msgid "Queries" -msgstr "" - -#. module: mis_builder -#. openerp-web -#: code:addons/mis_builder/static/src/xml/mis_widget.xml:7 -#, python-format -msgid "Refresh" -msgstr "Actualizar" - -#. module: mis_builder -#: selection:mis.report.instance.period,mode:0 -msgid "Relative to report base date" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_report -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_report_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_report_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_report_id -msgid "Report" -msgstr "Informe" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_report_instance_id -msgid "Report Instance" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_instance_date -msgid "Report base date (leave empty to use current date)" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_report_id -msgid "Report id" -msgstr "Informe" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_dp -msgid "Rounding" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Rounding inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -msgid "Save" -msgstr "Guardar" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_sequence -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_sequence -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_sequence -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_sequence -msgid "Sequence" -msgstr "Secuancia" - -#. module: mis_builder -#. openerp-web -#: code:addons/mis_builder/static/src/xml/mis_widget.xml:10 -#, python-format -msgid "Settings" -msgstr "Opciones" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:485 -#: selection:mis.report.kpi,type:0 -#, python-format -msgid "String" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_style_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_id_3806 -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Style" -msgstr "Estil" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_style_expression -msgid "Style expression" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_auto_expand_accounts_style_id -msgid "Style for account detail rows" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_name -msgid "Style name" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_ids -msgid "Sub KPI" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_subkpi_ids -msgid "Sub KPI Filter" -msgstr "" - -#. module: mis_builder -#: sql_constraint:mis.report.kpi.expression:0 -msgid "Sub KPI must be used once and only once for each KPI" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -msgid "Sub KPI's" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_subkpi_id -msgid "Subkpi id" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_suffix -msgid "Suffix" -msgstr "Sufijo" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_suffix_inherit -msgid "Suffix inherit" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:696 -#: selection:mis.report.query,aggregate:0 -#, python-format -msgid "Sum" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_target_move -msgid "Target Moves" -msgstr "Movimientos destino" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_tree -msgid "Template" -msgstr "Modelo" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_temporary -msgid "Temporary" -msgstr "" - -#. module: mis_builder -#: model:mis.report,name:mis_builder.mis_report_test -msgid "Test report" -msgstr "" - -#. module: mis_builder -#: model:mis.report.instance,name:mis_builder.mis_report_instance_test -msgid "Test-report-instance without company" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_color -msgid "Text color" -msgstr "Color del texto" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_style_color -msgid "Text color in valid RGB code (from #000000 to #FFFFFF)" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:506 -#: code:addons/mis_builder/models/mis_report.py:622 -#: code:addons/mis_builder/models/mis_report.py:715 -#, python-format -msgid "The name must be a valid python identifier" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_date_to -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_date_to -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_manual_date_to -msgid "To" -msgstr "a" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_valid -msgid "Valid" -msgstr "Válido" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_type -msgid "Value type" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_instance.py:91 -#: selection:mis.report.instance.period,type:0 -#, python-format -msgid "Week" -msgstr "Semana" - -#. module: mis_builder -#: sql_constraint:mis.report.instance.period:0 -msgid "Wrong duration, it must be positive!" -msgstr "¡Duración incorrecta, debe ser positiva!" - -#. module: mis_builder -#: sql_constraint:mis.report.instance.period:0 -msgid "Wrong normalize factor, it must be positive!" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_add_mis_report_instance_dashboard_wizard -msgid "add.mis.report.instance.dashboard.wizard" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_instance.py:370 -#, python-format -msgid "from %s to %s" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "large" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "medium" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report -msgid "mis.report" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_instance -msgid "mis.report.instance" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_instance_period -msgid "mis.report.instance.period" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_kpi -msgid "mis.report.kpi" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_kpi_expression -msgid "mis.report.kpi.expression" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_query -msgid "mis.report.query" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_style -msgid "mis.report.style" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_subkpi -msgid "mis.report.subkpi" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_add_to_dashboard_form_view -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -msgid "or" -msgstr "o" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_style.py:210 -#, python-format -msgid "pp" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "small" -msgstr "" - -#. module: mis_builder -#: model:mis.report.instance.period,name:mis_builder.mis_report_instance_period_test -msgid "today" -msgstr "" - -#. module: mis_builder -#: model:mis.report.kpi,description:mis_builder.mis_report_kpi_test -msgid "total test" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "x-large" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "x-small" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "xx-large" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "xx-small" -msgstr "" diff --git a/mis_builder/i18n/fr.po b/mis_builder/i18n/fr.po deleted file mode 100644 index 0df6430a..00000000 --- a/mis_builder/i18n/fr.po +++ /dev/null @@ -1,1088 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * mis_builder -# -# Translators: -# OCA Transbot , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-11 01:36+0000\n" -"PO-Revision-Date: 2017-01-11 01:36+0000\n" -"Last-Translator: OCA Transbot , 2017\n" -"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: fr\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:780 -#: code:addons/mis_builder/models/mis_report_instance.py:261 -#, python-format -msgid "%s (copy)" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "" -"'accounts' is a comma-separated list of account codes, possibly containing %" -" wildcards" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "" -"'domain' is an optional filter on move lines (eg to filter on analytic " -"accounts or journal)" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* bal for balance (debit - credit)" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "" -"* bal[70]: variation of the balance of account 70 over the period (it is the" -" same as balp[70]);" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* bale[1%]: balance of accounts starting with 1 at end of period." -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* bali[70,60]: initial balance of accounts 70 and 60;" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* crd for credit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* deb for debit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* e: at the end of the period" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* i: at the beginning of the period" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* nothing or p: variation over the period" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.mis_report_instance_add_to_dashboard_action -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_add_to_dashboard_form_view -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -msgid "Add to dashboard" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_aggregate -msgid "Aggregate" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.instance,target_move:0 -msgid "All Entries" -msgstr "Écritures comptabilisées + non-comptabilisées" - -#. module: mis_builder -#: selection:mis.report.instance,target_move:0 -msgid "All Posted Entries" -msgstr "Écritures comptabilisées seulement" - -#. 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." -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Auto expand" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:681 -#: selection:mis.report.query,aggregate:0 -#, python-format -msgid "Average" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_background_color -msgid "Background color" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_style_background_color -msgid "Background color in valid RGB code (from #000000 to #FFFFFF)" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_background_color_inherit -msgid "Background color inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_date -msgid "Base date" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_weight:0 -msgid "Bold" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:536 -#, python-format -msgid "Can not update a multi kpi from the kpi line" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_add_to_dashboard_form_view -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -msgid "Cancel" -msgstr "Annuler" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Color" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_color_inherit -msgid "Color inherit" -msgstr "" - -#. 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_comparison_column_ids -msgid "Compare with" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -msgid "Comparison" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_compare_method -msgid "Comparison Method" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_comparison_mode -msgid "Comparison mode" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_create_uid -msgid "Created by" -msgstr "Créé par" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_create_date -msgid "Created on" -msgstr "Créé le" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_dashboard_id -msgid "Dashboard" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_instance.py:91 -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_date_range_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_date_range_id -#: selection:mis.report.instance.period,type:0 -#, python-format -msgid "Date Range" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_date_range_type_id -msgid "Date Range Type" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_date_field -msgid "Date field" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_instance.py:89 -#: selection:mis.report.instance.period,type:0 -#, python-format -msgid "Day" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_description -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_description -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_description -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_description -msgid "Description" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:489 -#: selection:mis.report.kpi,compare_method:0 -#, python-format -msgid "Difference" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_display_name -msgid "Display Name" -msgstr "Nom affiché" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_auto_expand_accounts -msgid "Display details by account" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_divider_inherit -msgid "Divider inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_domain -msgid "Domain" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_dp_inherit -msgid "Dp inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_duration -msgid "Duration" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Examples" -msgstr "" - -#. module: mis_builder -#. openerp-web -#: code:addons/mis_builder/static/src/xml/mis_widget.xml:9 -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_tree -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -#, python-format -msgid "Export" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_name -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Expression" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_ids -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_expression_ids -msgid "Expression ids" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Expressions are of the form [accounts][domain]" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_normalize_factor -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_divider -msgid "Factor" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Factor inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_instance_period_normalize_factor -msgid "Factor to use to normalize the period (used in comparison" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_field_names -msgid "Fetched fields name" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_field_ids -msgid "Fields to fetch" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.instance.period,mode:0 -msgid "Fix" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Font" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_size -msgid "Font size" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_size_inherit -msgid "Font size inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_style -msgid "Font style" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_style_inherit -msgid "Font style inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_weight -msgid "Font weight" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_weight_inherit -msgid "Font weight inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_date_from -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_date_from -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_manual_date_from -msgid "From" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_id -msgid "ID" -msgstr "ID" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Indent" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_indent_level -msgid "Indent level" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_indent_level_inherit -msgid "Indent level inherit" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_style.py:52 -#, python-format -msgid "Indent level must be greater than or equal to 0" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_style:0 -msgid "Italic" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_ids -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_period_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -msgid "KPI's" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_kpi_id -msgid "Kpi id" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_landscape_pdf -msgid "Landscape PDF" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi___last_update -msgid "Last Modified on" -msgstr "Dernière modification le" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.last_mis_report_instance_view_action -#: model:ir.ui.menu,name:mis_builder.last_wizard_mis_report_instance_view_menu -msgid "Last Reports Generated" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_write_uid -msgid "Last Updated by" -msgstr "Dernière mise à jour par" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_write_date -msgid "Last Updated on" -msgstr "Dernière mise à jour le" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Legend (for kpi expressions)" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -msgid "MIS Report" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -msgid "MIS Report Instance" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_tree -msgid "MIS Report Instances" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "MIS Report KPI" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_result_view_form -msgid "MIS Report Result" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "MIS Report Style" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.mis_report_style_view_action -#: model:ir.ui.menu,name:mis_builder.mis_report_style_view_menu -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_tree -msgid "MIS Report Styles" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.mis_report_view_action -#: model:ir.ui.menu,name:mis_builder.mis_report_view_menu -msgid "MIS Report Templates" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.menu,name:mis_builder.mis_report_conf_menu -#: model:ir.ui.menu,name:mis_builder.mis_report_finance_menu -msgid "MIS Reporting" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.mis_report_instance_view_action -#: model:ir.ui.menu,name:mis_builder.mis_report_instance_view_menu -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_tree -msgid "MIS Reports" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.report.xml,name:mis_builder.qweb_pdf_export -msgid "MIS report instance QWEB PDF report" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.report.xml,name:mis_builder.xls_export -msgid "MIS report instance XLS report" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:683 -#: selection:mis.report.query,aggregate:0 -#, python-format -msgid "Max" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:682 -#: selection:mis.report.query,aggregate:0 -#, python-format -msgid "Min" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_mode -msgid "Mode" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_model_id -msgid "Model" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_multi -msgid "Multi" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_name -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_period_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -msgid "Name" -msgstr "Nom" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:491 -#: selection:mis.report.kpi,compare_method:0 -#, python-format -msgid "None" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_style:0 -#: selection:mis.report.style,font_weight:0 -msgid "Normal" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Number" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_instance_period_duration -msgid "Number of periods" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:483 -#: selection:mis.report.kpi,type:0 -#, python-format -msgid "Numeric" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_offset -msgid "Offset" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_instance_period_offset -msgid "Offset from current period" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:484 -#: code:addons/mis_builder/models/mis_report.py:490 -#: selection:mis.report.kpi,compare_method:0 selection:mis.report.kpi,type:0 -#, python-format -msgid "Percentage" -msgstr "" - -#. module: mis_builder -#: sql_constraint:mis.report.instance.period:0 -msgid "Period name should be unique by report" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_type -msgid "Period type" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_ids -msgid "Periods" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_pivot_date -msgid "Pivot date" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Possible values for 'field' can be:" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Possible values for 'mode' are:" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_prefix -msgid "Prefix" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_prefix_inherit -msgid "Prefix inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -msgid "Preview" -msgstr "" - -#. module: mis_builder -#. openerp-web -#: code:addons/mis_builder/static/src/xml/mis_widget.xml:8 -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_tree -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -#, python-format -msgid "Print" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:991 -#, python-format -msgid "" -"Probably not your fault... but I'm really curious to know how you managed to" -" raise this error so I can handle one more corner case!" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_ids -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -msgid "Queries" -msgstr "" - -#. module: mis_builder -#. openerp-web -#: code:addons/mis_builder/static/src/xml/mis_widget.xml:7 -#, python-format -msgid "Refresh" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.instance.period,mode:0 -msgid "Relative" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_report -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_report_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_report_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_report_id -msgid "Report" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_report_instance_id -msgid "Report Instance" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_instance_date -msgid "Report base date (leave empty to use current date)" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_report_id -msgid "Report id" -msgstr "Report id" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_dp -msgid "Rounding" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Rounding inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -msgid "Save" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_sequence -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_sequence -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_sequence -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_sequence -msgid "Sequence" -msgstr "" - -#. module: mis_builder -#. openerp-web -#: code:addons/mis_builder/static/src/xml/mis_widget.xml:10 -#, python-format -msgid "Settings" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:485 -#: selection:mis.report.kpi,type:0 -#, python-format -msgid "String" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_style_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_id_3759 -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Style" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_style_expression -msgid "Style expression" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_auto_expand_accounts_style_id -msgid "Style for account detail rows" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_name -msgid "Style name" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_ids -msgid "Sub KPI" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_subkpi_ids -msgid "Sub KPI Filter" -msgstr "" - -#. module: mis_builder -#: sql_constraint:mis.report.kpi.expression:0 -msgid "Sub KPI must be used once and only once for each KPI" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -msgid "Sub KPI's" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_subkpi_id -msgid "Subkpi id" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_suffix -msgid "Suffix" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_suffix_inherit -msgid "Suffix inherit" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:680 -#: selection:mis.report.query,aggregate:0 -#, python-format -msgid "Sum" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_target_move -msgid "Target Moves" -msgstr "Écritures ciblées" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_tree -msgid "Template" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_temporary -msgid "Temporary" -msgstr "" - -#. module: mis_builder -#: model:mis.report,name:mis_builder.mis_report_test -msgid "Test report" -msgstr "" - -#. module: mis_builder -#: model:mis.report.instance,name:mis_builder.mis_report_instance_test -msgid "Test-report-instance without company" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_color -msgid "Text color" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_style_color -msgid "Text color in valid RGB code (from #000000 to #FFFFFF)" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:506 -#: code:addons/mis_builder/models/mis_report.py:606 -#: code:addons/mis_builder/models/mis_report.py:699 -#, python-format -msgid "The name must be a valid python identifier" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_date_to -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_date_to -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_manual_date_to -msgid "To" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_valid -msgid "Valid" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_type -msgid "Value type" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_instance.py:90 -#: selection:mis.report.instance.period,type:0 -#, python-format -msgid "Week" -msgstr "" - -#. module: mis_builder -#: sql_constraint:mis.report.instance.period:0 -msgid "Wrong duration, it must be positive!" -msgstr "" - -#. module: mis_builder -#: sql_constraint:mis.report.instance.period:0 -msgid "Wrong normalize factor, it must be positive!" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_add_mis_report_instance_dashboard_wizard -msgid "add.mis.report.instance.dashboard.wizard" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_instance.py:369 -#, python-format -msgid "from %s to %s" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "large" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "medium" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report -msgid "mis.report" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_instance -msgid "mis.report.instance" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_instance_period -msgid "mis.report.instance.period" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_kpi -msgid "mis.report.kpi" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_kpi_expression -msgid "mis.report.kpi.expression" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_query -msgid "mis.report.query" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_style -msgid "mis.report.style" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_subkpi -msgid "mis.report.subkpi" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_add_to_dashboard_form_view -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -msgid "or" -msgstr "ou" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_style.py:210 -#, python-format -msgid "pp" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "small" -msgstr "" - -#. module: mis_builder -#: model:mis.report.instance.period,name:mis_builder.mis_report_instance_period_test -msgid "today" -msgstr "" - -#. module: mis_builder -#: model:mis.report.kpi,description:mis_builder.mis_report_kpi_test -msgid "total test" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "x-large" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "x-small" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "xx-large" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "xx-small" -msgstr "" diff --git a/mis_builder/i18n/hr_HR.po b/mis_builder/i18n/hr_HR.po deleted file mode 100644 index 91ace9c0..00000000 --- a/mis_builder/i18n/hr_HR.po +++ /dev/null @@ -1,1097 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * mis_builder -# -# Translators: -# Bole , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-05-01 13:07+0000\n" -"PO-Revision-Date: 2017-05-01 13:07+0000\n" -"Last-Translator: Bole , 2017\n" -"Language-Team: Croatian (Croatia) (https://www.transifex.com/oca/teams/23907/hr_HR/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: hr_HR\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:796 -#: code:addons/mis_builder/models/mis_report_instance.py:262 -#, python-format -msgid "%s (copy)" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "" -"'accounts' is a comma-separated list of account codes, possibly containing %" -" wildcards" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "" -"'domain' is an optional filter on move lines (eg to filter on analytic " -"accounts or journal)" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* bal for balance (debit - credit)" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "" -"* bal[70]: variation of the balance of account 70 over the period (it is the" -" same as balp[70]);" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* bale[1%]: balance of accounts starting with 1 at end of period." -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* bali[70,60]: initial balance of accounts 70 and 60;" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* crd for credit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* deb for debit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* e: at the end of the period" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* i: at the beginning of the period" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* nothing or p: variation over the period" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.mis_report_instance_add_to_dashboard_action -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_add_to_dashboard_form_view -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -msgid "Add to dashboard" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_period_view_form -msgid "Advanced" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_aggregate -msgid "Aggregate" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.instance,target_move:0 -msgid "All Entries" -msgstr "Sve stavke" - -#. module: mis_builder -#: selection:mis.report.instance,target_move:0 -msgid "All Posted Entries" -msgstr "Sve proknjižene stavke" - -#. 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." -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Auto expand" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:697 -#: selection:mis.report.query,aggregate:0 -#, python-format -msgid "Average" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_background_color -msgid "Background color" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_style_background_color -msgid "Background color in valid RGB code (from #000000 to #FFFFFF)" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_background_color_inherit -msgid "Background color inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_date -msgid "Base date" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_weight:0 -msgid "Bold" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:537 -#, python-format -msgid "Can not update a multi kpi from the kpi line" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_add_to_dashboard_form_view -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -msgid "Cancel" -msgstr "Otkaži" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Color" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_color_inherit -msgid "Color inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -msgid "Columns" -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_comparison_column_ids -msgid "Compare with" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_compare_method -msgid "Comparison Method" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_comparison_mode -msgid "Comparison mode" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_create_uid -msgid "Created by" -msgstr "Kreirao" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_create_date -msgid "Created on" -msgstr "Kreirano" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_dashboard_id -msgid "Dashboard" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_instance.py:92 -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_date_range_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_date_range_id -#: selection:mis.report.instance.period,type:0 -#, python-format -msgid "Date Range" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_date_range_type_id -msgid "Date Range Type" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_date_field -msgid "Date field" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_period_view_form -msgid "Dates" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_instance.py:90 -#: selection:mis.report.instance.period,type:0 -#, python-format -msgid "Day" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_description -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_description -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_description -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_description -msgid "Description" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:489 -#: selection:mis.report.kpi,compare_method:0 -#, python-format -msgid "Difference" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_display_name -msgid "Display Name" -msgstr "Naziv " - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_auto_expand_accounts -msgid "Display details by account" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_divider_inherit -msgid "Divider inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_domain -msgid "Domain" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_dp_inherit -msgid "Dp inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_duration -msgid "Duration" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Examples" -msgstr "" - -#. module: mis_builder -#. openerp-web -#: code:addons/mis_builder/static/src/xml/mis_widget.xml:9 -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_tree -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -#, python-format -msgid "Export" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_name -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Expression" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_ids -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_expression_ids -msgid "Expression ids" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Expressions are of the form [accounts][domain]" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_normalize_factor -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_divider -msgid "Factor" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Factor inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_instance_period_normalize_factor -msgid "Factor to use to normalize the period (used in comparison" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_field_names -msgid "Fetched fields name" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_field_ids -msgid "Fields to fetch" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.instance.period,mode:0 -msgid "Fixed dates" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Font" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_size -msgid "Font size" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_size_inherit -msgid "Font size inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_style -msgid "Font style" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_style_inherit -msgid "Font style inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_weight -msgid "Font weight" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_weight_inherit -msgid "Font weight inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_date_from -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_date_from -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_manual_date_from -msgid "From" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_id -msgid "ID" -msgstr "ID" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Indent" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_indent_level -msgid "Indent level" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_indent_level_inherit -msgid "Indent level inherit" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_style.py:52 -#, python-format -msgid "Indent level must be greater than or equal to 0" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_style:0 -msgid "Italic" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_ids -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -msgid "KPI's" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_kpi_id -msgid "Kpi id" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_landscape_pdf -msgid "Landscape PDF" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi___last_update -msgid "Last Modified on" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.last_mis_report_instance_view_action -#: model:ir.ui.menu,name:mis_builder.last_wizard_mis_report_instance_view_menu -msgid "Last Reports Generated" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_write_uid -msgid "Last Updated by" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_write_date -msgid "Last Updated on" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Legend (for kpi expressions)" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -msgid "MIS Report" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -msgid "MIS Report Instance" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_tree -msgid "MIS Report Instances" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "MIS Report KPI" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_result_view_form -msgid "MIS Report Result" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "MIS Report Style" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.mis_report_style_view_action -#: model:ir.ui.menu,name:mis_builder.mis_report_style_view_menu -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_tree -msgid "MIS Report Styles" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.mis_report_view_action -#: model:ir.ui.menu,name:mis_builder.mis_report_view_menu -msgid "MIS Report Templates" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.menu,name:mis_builder.mis_report_conf_menu -#: model:ir.ui.menu,name:mis_builder.mis_report_finance_menu -msgid "MIS Reporting" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.mis_report_instance_view_action -#: model:ir.ui.menu,name:mis_builder.mis_report_instance_view_menu -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_tree -msgid "MIS Reports" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.report.xml,name:mis_builder.qweb_pdf_export -msgid "MIS report instance QWEB PDF report" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.report.xml,name:mis_builder.xls_export -msgid "MIS report instance XLS report" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:699 -#: selection:mis.report.query,aggregate:0 -#, python-format -msgid "Max" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:698 -#: selection:mis.report.query,aggregate:0 -#, python-format -msgid "Min" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_mode -msgid "Mode" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_model_id -msgid "Model" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_multi -msgid "Multi" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_name -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_period_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -msgid "Name" -msgstr "Naziv" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:491 -#: selection:mis.report.kpi,compare_method:0 -#, python-format -msgid "None" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_style:0 -#: selection:mis.report.style,font_weight:0 -msgid "Normal" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Number" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_instance_period_duration -msgid "Number of periods" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:483 -#: selection:mis.report.kpi,type:0 -#, python-format -msgid "Numeric" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_offset -msgid "Offset" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_instance_period_offset -msgid "Offset from current period" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:484 -#: code:addons/mis_builder/models/mis_report.py:490 -#: selection:mis.report.kpi,compare_method:0 selection:mis.report.kpi,type:0 -#, python-format -msgid "Percentage" -msgstr "" - -#. module: mis_builder -#: sql_constraint:mis.report.instance.period:0 -msgid "Period name should be unique by report" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_type -msgid "Period type" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_ids -msgid "Periods" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_pivot_date -msgid "Pivot date" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Possible values for 'field' can be:" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Possible values for 'mode' are:" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_prefix -msgid "Prefix" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_prefix_inherit -msgid "Prefix inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -msgid "Preview" -msgstr "" - -#. module: mis_builder -#. openerp-web -#: code:addons/mis_builder/static/src/xml/mis_widget.xml:8 -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_tree -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -#, python-format -msgid "Print" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:1002 -#, python-format -msgid "" -"Probably not your fault... but I'm really curious to know how you managed to" -" raise this error so I can handle one more corner case!" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_ids -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -msgid "Queries" -msgstr "" - -#. module: mis_builder -#. openerp-web -#: code:addons/mis_builder/static/src/xml/mis_widget.xml:7 -#, python-format -msgid "Refresh" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.instance.period,mode:0 -msgid "Relative to report base date" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_report -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_report_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_report_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_report_id -msgid "Report" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_report_instance_id -msgid "Report Instance" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_instance_date -msgid "Report base date (leave empty to use current date)" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_report_id -msgid "Report id" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_dp -msgid "Rounding" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Rounding inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -msgid "Save" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_sequence -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_sequence -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_sequence -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_sequence -msgid "Sequence" -msgstr "" - -#. module: mis_builder -#. openerp-web -#: code:addons/mis_builder/static/src/xml/mis_widget.xml:10 -#, python-format -msgid "Settings" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:485 -#: selection:mis.report.kpi,type:0 -#, python-format -msgid "String" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_style_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_id_3806 -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Style" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_style_expression -msgid "Style expression" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_auto_expand_accounts_style_id -msgid "Style for account detail rows" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_name -msgid "Style name" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_ids -msgid "Sub KPI" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_subkpi_ids -msgid "Sub KPI Filter" -msgstr "" - -#. module: mis_builder -#: sql_constraint:mis.report.kpi.expression:0 -msgid "Sub KPI must be used once and only once for each KPI" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -msgid "Sub KPI's" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_subkpi_id -msgid "Subkpi id" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_suffix -msgid "Suffix" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_suffix_inherit -msgid "Suffix inherit" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:696 -#: selection:mis.report.query,aggregate:0 -#, python-format -msgid "Sum" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_target_move -msgid "Target Moves" -msgstr "Ciljane stavke" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_tree -msgid "Template" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_temporary -msgid "Temporary" -msgstr "" - -#. module: mis_builder -#: model:mis.report,name:mis_builder.mis_report_test -msgid "Test report" -msgstr "" - -#. module: mis_builder -#: model:mis.report.instance,name:mis_builder.mis_report_instance_test -msgid "Test-report-instance without company" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_color -msgid "Text color" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_style_color -msgid "Text color in valid RGB code (from #000000 to #FFFFFF)" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:506 -#: code:addons/mis_builder/models/mis_report.py:622 -#: code:addons/mis_builder/models/mis_report.py:715 -#, python-format -msgid "The name must be a valid python identifier" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_date_to -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_date_to -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_manual_date_to -msgid "To" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_valid -msgid "Valid" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_type -msgid "Value type" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_instance.py:91 -#: selection:mis.report.instance.period,type:0 -#, python-format -msgid "Week" -msgstr "" - -#. module: mis_builder -#: sql_constraint:mis.report.instance.period:0 -msgid "Wrong duration, it must be positive!" -msgstr "" - -#. module: mis_builder -#: sql_constraint:mis.report.instance.period:0 -msgid "Wrong normalize factor, it must be positive!" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_add_mis_report_instance_dashboard_wizard -msgid "add.mis.report.instance.dashboard.wizard" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_instance.py:370 -#, python-format -msgid "from %s to %s" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "large" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "medium" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report -msgid "mis.report" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_instance -msgid "mis.report.instance" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_instance_period -msgid "mis.report.instance.period" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_kpi -msgid "mis.report.kpi" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_kpi_expression -msgid "mis.report.kpi.expression" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_query -msgid "mis.report.query" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_style -msgid "mis.report.style" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_subkpi -msgid "mis.report.subkpi" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_add_to_dashboard_form_view -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -msgid "or" -msgstr "ili" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_style.py:210 -#, python-format -msgid "pp" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "small" -msgstr "" - -#. module: mis_builder -#: model:mis.report.instance.period,name:mis_builder.mis_report_instance_period_test -msgid "today" -msgstr "" - -#. module: mis_builder -#: model:mis.report.kpi,description:mis_builder.mis_report_kpi_test -msgid "total test" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "x-large" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "x-small" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "xx-large" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "xx-small" -msgstr "" diff --git a/mis_builder/i18n/nl_NL.po b/mis_builder/i18n/nl_NL.po deleted file mode 100644 index e59d7b5f..00000000 --- a/mis_builder/i18n/nl_NL.po +++ /dev/null @@ -1,1097 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * mis_builder -# -# Translators: -# Peter Hageman , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-06-23 22:18+0000\n" -"PO-Revision-Date: 2017-06-23 22:18+0000\n" -"Last-Translator: Peter Hageman , 2017\n" -"Language-Team: Dutch (Netherlands) (https://www.transifex.com/oca/teams/23907/nl_NL/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: nl_NL\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:796 -#: code:addons/mis_builder/models/mis_report_instance.py:262 -#, python-format -msgid "%s (copy)" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "" -"'accounts' is a comma-separated list of account codes, possibly containing %" -" wildcards" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "" -"'domain' is an optional filter on move lines (eg to filter on analytic " -"accounts or journal)" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* bal for balance (debit - credit)" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "" -"* bal[70]: variation of the balance of account 70 over the period (it is the" -" same as balp[70]);" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* bale[1%]: balance of accounts starting with 1 at end of period." -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* bali[70,60]: initial balance of accounts 70 and 60;" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* crd for credit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* deb for debit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* e: at the end of the period" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* i: at the beginning of the period" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* nothing or p: variation over the period" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.mis_report_instance_add_to_dashboard_action -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_add_to_dashboard_form_view -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -msgid "Add to dashboard" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_period_view_form -msgid "Advanced" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_aggregate -msgid "Aggregate" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.instance,target_move:0 -msgid "All Entries" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.instance,target_move:0 -msgid "All Posted Entries" -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." -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Auto expand" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:697 -#: selection:mis.report.query,aggregate:0 -#, python-format -msgid "Average" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_background_color -msgid "Background color" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_style_background_color -msgid "Background color in valid RGB code (from #000000 to #FFFFFF)" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_background_color_inherit -msgid "Background color inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_date -msgid "Base date" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_weight:0 -msgid "Bold" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:537 -#, python-format -msgid "Can not update a multi kpi from the kpi line" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_add_to_dashboard_form_view -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -msgid "Cancel" -msgstr "Annuleer" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Color" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_color_inherit -msgid "Color inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -msgid "Columns" -msgstr "" - -#. 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_comparison_column_ids -msgid "Compare with" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_compare_method -msgid "Comparison Method" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_comparison_mode -msgid "Comparison mode" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_create_uid -msgid "Created by" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_create_date -msgid "Created on" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_dashboard_id -msgid "Dashboard" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_instance.py:92 -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_date_range_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_date_range_id -#: selection:mis.report.instance.period,type:0 -#, python-format -msgid "Date Range" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_date_range_type_id -msgid "Date Range Type" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_date_field -msgid "Date field" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_period_view_form -msgid "Dates" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_instance.py:90 -#: selection:mis.report.instance.period,type:0 -#, python-format -msgid "Day" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_description -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_description -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_description -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_description -msgid "Description" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:489 -#: selection:mis.report.kpi,compare_method:0 -#, python-format -msgid "Difference" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_display_name -msgid "Display Name" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_auto_expand_accounts -msgid "Display details by account" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_divider_inherit -msgid "Divider inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_domain -msgid "Domain" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_dp_inherit -msgid "Dp inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_duration -msgid "Duration" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Examples" -msgstr "" - -#. module: mis_builder -#. openerp-web -#: code:addons/mis_builder/static/src/xml/mis_widget.xml:9 -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_tree -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -#, python-format -msgid "Export" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_name -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Expression" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_ids -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_expression_ids -msgid "Expression ids" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Expressions are of the form [accounts][domain]" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_normalize_factor -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_divider -msgid "Factor" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Factor inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_instance_period_normalize_factor -msgid "Factor to use to normalize the period (used in comparison" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_field_names -msgid "Fetched fields name" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_field_ids -msgid "Fields to fetch" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.instance.period,mode:0 -msgid "Fixed dates" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Font" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_size -msgid "Font size" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_size_inherit -msgid "Font size inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_style -msgid "Font style" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_style_inherit -msgid "Font style inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_weight -msgid "Font weight" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_weight_inherit -msgid "Font weight inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_date_from -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_date_from -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_manual_date_from -msgid "From" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_id -msgid "ID" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Indent" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_indent_level -msgid "Indent level" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_indent_level_inherit -msgid "Indent level inherit" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_style.py:52 -#, python-format -msgid "Indent level must be greater than or equal to 0" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_style:0 -msgid "Italic" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_ids -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -msgid "KPI's" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_kpi_id -msgid "Kpi id" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_landscape_pdf -msgid "Landscape PDF" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi___last_update -msgid "Last Modified on" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.last_mis_report_instance_view_action -#: model:ir.ui.menu,name:mis_builder.last_wizard_mis_report_instance_view_menu -msgid "Last Reports Generated" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_write_uid -msgid "Last Updated by" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_write_date -msgid "Last Updated on" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Legend (for kpi expressions)" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -msgid "MIS Report" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -msgid "MIS Report Instance" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_tree -msgid "MIS Report Instances" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "MIS Report KPI" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_result_view_form -msgid "MIS Report Result" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "MIS Report Style" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.mis_report_style_view_action -#: model:ir.ui.menu,name:mis_builder.mis_report_style_view_menu -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_tree -msgid "MIS Report Styles" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.mis_report_view_action -#: model:ir.ui.menu,name:mis_builder.mis_report_view_menu -msgid "MIS Report Templates" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.menu,name:mis_builder.mis_report_conf_menu -#: model:ir.ui.menu,name:mis_builder.mis_report_finance_menu -msgid "MIS Reporting" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.mis_report_instance_view_action -#: model:ir.ui.menu,name:mis_builder.mis_report_instance_view_menu -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_tree -msgid "MIS Reports" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.report.xml,name:mis_builder.qweb_pdf_export -msgid "MIS report instance QWEB PDF report" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.report.xml,name:mis_builder.xls_export -msgid "MIS report instance XLS report" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:699 -#: selection:mis.report.query,aggregate:0 -#, python-format -msgid "Max" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:698 -#: selection:mis.report.query,aggregate:0 -#, python-format -msgid "Min" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_mode -msgid "Mode" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_model_id -msgid "Model" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_multi -msgid "Multi" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_name -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_period_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -msgid "Name" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:491 -#: selection:mis.report.kpi,compare_method:0 -#, python-format -msgid "None" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_style:0 -#: selection:mis.report.style,font_weight:0 -msgid "Normal" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Number" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_instance_period_duration -msgid "Number of periods" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:483 -#: selection:mis.report.kpi,type:0 -#, python-format -msgid "Numeric" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_offset -msgid "Offset" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_instance_period_offset -msgid "Offset from current period" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:484 -#: code:addons/mis_builder/models/mis_report.py:490 -#: selection:mis.report.kpi,compare_method:0 selection:mis.report.kpi,type:0 -#, python-format -msgid "Percentage" -msgstr "" - -#. module: mis_builder -#: sql_constraint:mis.report.instance.period:0 -msgid "Period name should be unique by report" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_type -msgid "Period type" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_ids -msgid "Periods" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_pivot_date -msgid "Pivot date" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Possible values for 'field' can be:" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Possible values for 'mode' are:" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_prefix -msgid "Prefix" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_prefix_inherit -msgid "Prefix inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -msgid "Preview" -msgstr "" - -#. module: mis_builder -#. openerp-web -#: code:addons/mis_builder/static/src/xml/mis_widget.xml:8 -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_tree -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -#, python-format -msgid "Print" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:1002 -#, python-format -msgid "" -"Probably not your fault... but I'm really curious to know how you managed to" -" raise this error so I can handle one more corner case!" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_ids -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -msgid "Queries" -msgstr "" - -#. module: mis_builder -#. openerp-web -#: code:addons/mis_builder/static/src/xml/mis_widget.xml:7 -#, python-format -msgid "Refresh" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.instance.period,mode:0 -msgid "Relative to report base date" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_report -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_report_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_report_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_report_id -msgid "Report" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_report_instance_id -msgid "Report Instance" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_instance_date -msgid "Report base date (leave empty to use current date)" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_report_id -msgid "Report id" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_dp -msgid "Rounding" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Rounding inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -msgid "Save" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_sequence -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_sequence -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_sequence -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_sequence -msgid "Sequence" -msgstr "" - -#. module: mis_builder -#. openerp-web -#: code:addons/mis_builder/static/src/xml/mis_widget.xml:10 -#, python-format -msgid "Settings" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:485 -#: selection:mis.report.kpi,type:0 -#, python-format -msgid "String" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_style_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_id_3806 -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Style" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_style_expression -msgid "Style expression" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_auto_expand_accounts_style_id -msgid "Style for account detail rows" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_name -msgid "Style name" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_ids -msgid "Sub KPI" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_subkpi_ids -msgid "Sub KPI Filter" -msgstr "" - -#. module: mis_builder -#: sql_constraint:mis.report.kpi.expression:0 -msgid "Sub KPI must be used once and only once for each KPI" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -msgid "Sub KPI's" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_subkpi_id -msgid "Subkpi id" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_suffix -msgid "Suffix" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_suffix_inherit -msgid "Suffix inherit" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:696 -#: selection:mis.report.query,aggregate:0 -#, python-format -msgid "Sum" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_target_move -msgid "Target Moves" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_tree -msgid "Template" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_temporary -msgid "Temporary" -msgstr "" - -#. module: mis_builder -#: model:mis.report,name:mis_builder.mis_report_test -msgid "Test report" -msgstr "" - -#. module: mis_builder -#: model:mis.report.instance,name:mis_builder.mis_report_instance_test -msgid "Test-report-instance without company" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_color -msgid "Text color" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_style_color -msgid "Text color in valid RGB code (from #000000 to #FFFFFF)" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:506 -#: code:addons/mis_builder/models/mis_report.py:622 -#: code:addons/mis_builder/models/mis_report.py:715 -#, python-format -msgid "The name must be a valid python identifier" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_date_to -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_date_to -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_manual_date_to -msgid "To" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_valid -msgid "Valid" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_type -msgid "Value type" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_instance.py:91 -#: selection:mis.report.instance.period,type:0 -#, python-format -msgid "Week" -msgstr "" - -#. module: mis_builder -#: sql_constraint:mis.report.instance.period:0 -msgid "Wrong duration, it must be positive!" -msgstr "" - -#. module: mis_builder -#: sql_constraint:mis.report.instance.period:0 -msgid "Wrong normalize factor, it must be positive!" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_add_mis_report_instance_dashboard_wizard -msgid "add.mis.report.instance.dashboard.wizard" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_instance.py:370 -#, python-format -msgid "from %s to %s" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "large" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "medium" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report -msgid "mis.report" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_instance -msgid "mis.report.instance" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_instance_period -msgid "mis.report.instance.period" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_kpi -msgid "mis.report.kpi" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_kpi_expression -msgid "mis.report.kpi.expression" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_query -msgid "mis.report.query" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_style -msgid "mis.report.style" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_subkpi -msgid "mis.report.subkpi" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_add_to_dashboard_form_view -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -msgid "or" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_style.py:210 -#, python-format -msgid "pp" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "small" -msgstr "" - -#. module: mis_builder -#: model:mis.report.instance.period,name:mis_builder.mis_report_instance_period_test -msgid "today" -msgstr "" - -#. module: mis_builder -#: model:mis.report.kpi,description:mis_builder.mis_report_kpi_test -msgid "total test" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "x-large" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "x-small" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "xx-large" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "xx-small" -msgstr "" diff --git a/mis_builder/i18n/pt.po b/mis_builder/i18n/pt.po deleted file mode 100644 index d1573a22..00000000 --- a/mis_builder/i18n/pt.po +++ /dev/null @@ -1,1097 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * mis_builder -# -# Translators: -# Pedro Castro Silva , 2017 -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 10.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-05-31 05:59+0000\n" -"PO-Revision-Date: 2017-05-31 05:59+0000\n" -"Last-Translator: Pedro Castro Silva , 2017\n" -"Language-Team: Portuguese (https://www.transifex.com/oca/teams/23907/pt/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Language: pt\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:796 -#: code:addons/mis_builder/models/mis_report_instance.py:262 -#, python-format -msgid "%s (copy)" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "" -"'accounts' is a comma-separated list of account codes, possibly containing %" -" wildcards" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "" -"'domain' is an optional filter on move lines (eg to filter on analytic " -"accounts or journal)" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* bal for balance (debit - credit)" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "" -"* bal[70]: variation of the balance of account 70 over the period (it is the" -" same as balp[70]);" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* bale[1%]: balance of accounts starting with 1 at end of period." -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* bali[70,60]: initial balance of accounts 70 and 60;" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* crd for credit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* deb for debit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* e: at the end of the period" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* i: at the beginning of the period" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "* nothing or p: variation over the period" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.mis_report_instance_add_to_dashboard_action -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_add_to_dashboard_form_view -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -msgid "Add to dashboard" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_period_view_form -msgid "Advanced" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_aggregate -msgid "Aggregate" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.instance,target_move:0 -msgid "All Entries" -msgstr "Todos os lançamentos" - -#. module: mis_builder -#: selection:mis.report.instance,target_move:0 -msgid "All Posted Entries" -msgstr "Todos os lançamentos publicados" - -#. 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." -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Auto expand" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:697 -#: selection:mis.report.query,aggregate:0 -#, python-format -msgid "Average" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_background_color -msgid "Background color" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_style_background_color -msgid "Background color in valid RGB code (from #000000 to #FFFFFF)" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_background_color_inherit -msgid "Background color inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_date -msgid "Base date" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_weight:0 -msgid "Bold" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:537 -#, python-format -msgid "Can not update a multi kpi from the kpi line" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_add_to_dashboard_form_view -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -msgid "Cancel" -msgstr "Cancelar" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Color" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_color_inherit -msgid "Color inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -msgid "Columns" -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_comparison_column_ids -msgid "Compare with" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_compare_method -msgid "Comparison Method" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_comparison_mode -msgid "Comparison mode" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_create_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_create_uid -msgid "Created by" -msgstr "Criado por" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_create_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_create_date -msgid "Created on" -msgstr "Criado em" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_dashboard_id -msgid "Dashboard" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_instance.py:92 -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_date_range_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_date_range_id -#: selection:mis.report.instance.period,type:0 -#, python-format -msgid "Date Range" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_date_range_type_id -msgid "Date Range Type" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_date_field -msgid "Date field" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_period_view_form -msgid "Dates" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_instance.py:90 -#: selection:mis.report.instance.period,type:0 -#, python-format -msgid "Day" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_description -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_description -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_description -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_description -msgid "Description" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:489 -#: selection:mis.report.kpi,compare_method:0 -#, python-format -msgid "Difference" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_display_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_display_name -msgid "Display Name" -msgstr "Nome a exibir" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_auto_expand_accounts -msgid "Display details by account" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_divider_inherit -msgid "Divider inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_domain -msgid "Domain" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_dp_inherit -msgid "Dp inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_duration -msgid "Duration" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Examples" -msgstr "" - -#. module: mis_builder -#. openerp-web -#: code:addons/mis_builder/static/src/xml/mis_widget.xml:9 -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_tree -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -#, python-format -msgid "Export" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_name -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Expression" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_ids -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_expression_ids -msgid "Expression ids" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Expressions are of the form [accounts][domain]" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_normalize_factor -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_divider -msgid "Factor" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Factor inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_instance_period_normalize_factor -msgid "Factor to use to normalize the period (used in comparison" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_field_names -msgid "Fetched fields name" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_field_ids -msgid "Fields to fetch" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.instance.period,mode:0 -msgid "Fixed dates" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Font" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_size -msgid "Font size" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_size_inherit -msgid "Font size inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_style -msgid "Font style" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_style_inherit -msgid "Font style inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_weight -msgid "Font weight" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_font_weight_inherit -msgid "Font weight inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_date_from -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_date_from -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_manual_date_from -msgid "From" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_id -msgid "ID" -msgstr "ID" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Indent" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_indent_level -msgid "Indent level" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_indent_level_inherit -msgid "Indent level inherit" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_style.py:52 -#, python-format -msgid "Indent level must be greater than or equal to 0" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_style:0 -msgid "Italic" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_ids -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -msgid "KPI's" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_kpi_id -msgid "Kpi id" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_landscape_pdf -msgid "Landscape PDF" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style___last_update -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi___last_update -msgid "Last Modified on" -msgstr "Última Modificação em" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.last_mis_report_instance_view_action -#: model:ir.ui.menu,name:mis_builder.last_wizard_mis_report_instance_view_menu -msgid "Last Reports Generated" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_write_uid -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_write_uid -msgid "Last Updated by" -msgstr "Última atualização por" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_write_date -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_write_date -msgid "Last Updated on" -msgstr "Última atualização em" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Legend (for kpi expressions)" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -msgid "MIS Report" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -msgid "MIS Report Instance" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_tree -msgid "MIS Report Instances" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "MIS Report KPI" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_result_view_form -msgid "MIS Report Result" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "MIS Report Style" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.mis_report_style_view_action -#: model:ir.ui.menu,name:mis_builder.mis_report_style_view_menu -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_tree -msgid "MIS Report Styles" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.mis_report_view_action -#: model:ir.ui.menu,name:mis_builder.mis_report_view_menu -msgid "MIS Report Templates" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.menu,name:mis_builder.mis_report_conf_menu -#: model:ir.ui.menu,name:mis_builder.mis_report_finance_menu -msgid "MIS Reporting" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.act_window,name:mis_builder.mis_report_instance_view_action -#: model:ir.ui.menu,name:mis_builder.mis_report_instance_view_menu -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_tree -msgid "MIS Reports" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.report.xml,name:mis_builder.qweb_pdf_export -msgid "MIS report instance QWEB PDF report" -msgstr "" - -#. module: mis_builder -#: model:ir.actions.report.xml,name:mis_builder.xls_export -msgid "MIS report instance XLS report" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:699 -#: selection:mis.report.query,aggregate:0 -#, python-format -msgid "Max" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:698 -#: selection:mis.report.query,aggregate:0 -#, python-format -msgid "Min" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_mode -msgid "Mode" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_model_id -msgid "Model" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_multi -msgid "Multi" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_add_mis_report_instance_dashboard_wizard_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_name -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_name -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_period_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -msgid "Name" -msgstr "Nome" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:491 -#: selection:mis.report.kpi,compare_method:0 -#, python-format -msgid "None" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_style:0 -#: selection:mis.report.style,font_weight:0 -msgid "Normal" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Number" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_instance_period_duration -msgid "Number of periods" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:483 -#: selection:mis.report.kpi,type:0 -#, python-format -msgid "Numeric" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_offset -msgid "Offset" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_instance_period_offset -msgid "Offset from current period" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:484 -#: code:addons/mis_builder/models/mis_report.py:490 -#: selection:mis.report.kpi,compare_method:0 selection:mis.report.kpi,type:0 -#, python-format -msgid "Percentage" -msgstr "" - -#. module: mis_builder -#: sql_constraint:mis.report.instance.period:0 -msgid "Period name should be unique by report" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_type -msgid "Period type" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_ids -msgid "Periods" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_pivot_date -msgid "Pivot date" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Possible values for 'field' can be:" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_kpi_form -msgid "Possible values for 'mode' are:" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_prefix -msgid "Prefix" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_prefix_inherit -msgid "Prefix inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -msgid "Preview" -msgstr "" - -#. module: mis_builder -#. openerp-web -#: code:addons/mis_builder/static/src/xml/mis_widget.xml:8 -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_tree -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -#, python-format -msgid "Print" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:1002 -#, python-format -msgid "" -"Probably not your fault... but I'm really curious to know how you managed to" -" raise this error so I can handle one more corner case!" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_ids -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -msgid "Queries" -msgstr "" - -#. module: mis_builder -#. openerp-web -#: code:addons/mis_builder/static/src/xml/mis_widget.xml:7 -#, python-format -msgid "Refresh" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.instance.period,mode:0 -msgid "Relative to report base date" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_report -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_report_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_report_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_query_report_id -msgid "Report" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_report_instance_id -msgid "Report Instance" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_instance_date -msgid "Report base date (leave empty to use current date)" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_report_id -msgid "Report id" -msgstr "Id do relatório" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_dp -msgid "Rounding" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Rounding inherit" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -msgid "Save" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_sequence -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_sequence -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_sequence -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_sequence -msgid "Sequence" -msgstr "" - -#. module: mis_builder -#. openerp-web -#: code:addons/mis_builder/static/src/xml/mis_widget.xml:10 -#, python-format -msgid "Settings" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:485 -#: selection:mis.report.kpi,type:0 -#, python-format -msgid "String" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_style_id -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_id_3806 -#: model:ir.ui.view,arch_db:mis_builder.mis_report_style_view_form -msgid "Style" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_style_expression -msgid "Style expression" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_auto_expand_accounts_style_id -msgid "Style for account detail rows" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_name -msgid "Style name" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_subkpi_ids -msgid "Sub KPI" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_subkpi_ids -msgid "Sub KPI Filter" -msgstr "" - -#. module: mis_builder -#: sql_constraint:mis.report.kpi.expression:0 -msgid "Sub KPI must be used once and only once for each KPI" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_view_form -msgid "Sub KPI's" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_expression_subkpi_id -msgid "Subkpi id" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_suffix -msgid "Suffix" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_suffix_inherit -msgid "Suffix inherit" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:696 -#: selection:mis.report.query,aggregate:0 -#, python-format -msgid "Sum" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_target_move -msgid "Target Moves" -msgstr "Movimentos alvo" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_form -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_view_tree -msgid "Template" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_temporary -msgid "Temporary" -msgstr "" - -#. module: mis_builder -#: model:mis.report,name:mis_builder.mis_report_test -msgid "Test report" -msgstr "" - -#. module: mis_builder -#: model:mis.report.instance,name:mis_builder.mis_report_instance_test -msgid "Test-report-instance without company" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_style_color -msgid "Text color" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,help:mis_builder.field_mis_report_style_color -msgid "Text color in valid RGB code (from #000000 to #FFFFFF)" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report.py:506 -#: code:addons/mis_builder/models/mis_report.py:622 -#: code:addons/mis_builder/models/mis_report.py:715 -#, python-format -msgid "The name must be a valid python identifier" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_date_to -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_date_to -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_manual_date_to -msgid "To" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_instance_period_valid -msgid "Valid" -msgstr "" - -#. module: mis_builder -#: model:ir.model.fields,field_description:mis_builder.field_mis_report_kpi_type -msgid "Value type" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_instance.py:91 -#: selection:mis.report.instance.period,type:0 -#, python-format -msgid "Week" -msgstr "" - -#. module: mis_builder -#: sql_constraint:mis.report.instance.period:0 -msgid "Wrong duration, it must be positive!" -msgstr "" - -#. module: mis_builder -#: sql_constraint:mis.report.instance.period:0 -msgid "Wrong normalize factor, it must be positive!" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_add_mis_report_instance_dashboard_wizard -msgid "add.mis.report.instance.dashboard.wizard" -msgstr "" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_instance.py:370 -#, python-format -msgid "from %s to %s" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "large" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "medium" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report -msgid "mis.report" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_instance -msgid "mis.report.instance" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_instance_period -msgid "mis.report.instance.period" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_kpi -msgid "mis.report.kpi" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_kpi_expression -msgid "mis.report.kpi.expression" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_query -msgid "mis.report.query" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_style -msgid "mis.report.style" -msgstr "" - -#. module: mis_builder -#: model:ir.model,name:mis_builder.model_mis_report_subkpi -msgid "mis.report.subkpi" -msgstr "" - -#. module: mis_builder -#: model:ir.ui.view,arch_db:mis_builder.mis_report_instance_add_to_dashboard_form_view -#: model:ir.ui.view,arch_db:mis_builder.wizard_mis_report_instance_view_form -msgid "or" -msgstr "ou" - -#. module: mis_builder -#: code:addons/mis_builder/models/mis_report_style.py:210 -#, python-format -msgid "pp" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "small" -msgstr "" - -#. module: mis_builder -#: model:mis.report.instance.period,name:mis_builder.mis_report_instance_period_test -msgid "today" -msgstr "" - -#. module: mis_builder -#: model:mis.report.kpi,description:mis_builder.mis_report_kpi_test -msgid "total test" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "x-large" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "x-small" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "xx-large" -msgstr "" - -#. module: mis_builder -#: selection:mis.report.style,font_size:0 -msgid "xx-small" -msgstr "" diff --git a/mis_builder/models/__init__.py b/mis_builder/models/__init__.py deleted file mode 100644 index e632fa44..00000000 --- a/mis_builder/models/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2014-2015 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -from . import mis_report -from . import mis_report_instance -from . import mis_report_style -from . import aep diff --git a/mis_builder/models/accounting_none.py b/mis_builder/models/accounting_none.py deleted file mode 100644 index de65ac1f..00000000 --- a/mis_builder/models/accounting_none.py +++ /dev/null @@ -1,191 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2016 Thomas Binsfeld -# © 2016 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -""" -Provides the AccountingNone singleton. - -AccountingNone is a null value that dissolves in basic arithmetic operations, -as illustrated in the examples below. In comparisons, AccountingNone behaves -the same as zero. - ->>> 1 + 1 -2 ->>> 1 + AccountingNone -1 ->>> AccountingNone + 1 -1 ->>> AccountingNone + None -AccountingNone ->>> None + AccountingNone -AccountingNone ->>> +AccountingNone -AccountingNone ->>> -AccountingNone -AccountingNone ->>> -(AccountingNone) -AccountingNone ->>> AccountingNone - 1 --1 ->>> 1 - AccountingNone -1 ->>> abs(AccountingNone) -AccountingNone ->>> AccountingNone - None -AccountingNone ->>> None - AccountingNone -AccountingNone ->>> AccountingNone / 2 -0.0 ->>> 2 / AccountingNone -Traceback (most recent call last): - ... -ZeroDivisionError ->>> AccountingNone / AccountingNone -AccountingNone ->>> AccountingNone // 2 -0.0 ->>> 2 // AccountingNone -Traceback (most recent call last): - ... -ZeroDivisionError ->>> AccountingNone // AccountingNone -AccountingNone ->>> AccountingNone * 2 -0.0 ->>> 2 * AccountingNone -0.0 ->>> AccountingNone * AccountingNone -AccountingNone ->>> AccountingNone * None -AccountingNone ->>> None * AccountingNone -AccountingNone ->>> str(AccountingNone) -'' ->>> bool(AccountingNone) -False ->>> AccountingNone > 0 -False ->>> AccountingNone < 0 -False ->>> AccountingNone < 1 -True ->>> AccountingNone > 1 -False ->>> 0 < AccountingNone -False ->>> 0 > AccountingNone -False ->>> 1 < AccountingNone -False ->>> 1 > AccountingNone -True ->>> AccountingNone == 0 -True ->>> AccountingNone == 0.0 -True ->>> AccountingNone == None -True -""" - -__all__ = ['AccountingNone'] - - -class AccountingNoneType(object): - - def __add__(self, other): - if other is None: - return AccountingNone - return other - - __radd__ = __add__ - - def __sub__(self, other): - if other is None: - return AccountingNone - return -other - - def __rsub__(self, other): - if other is None: - return AccountingNone - return other - - def __iadd__(self, other): - if other is None: - return AccountingNone - return other - - def __isub__(self, other): - if other is None: - return AccountingNone - return -other - - def __abs__(self): - return self - - def __pos__(self): - return self - - def __neg__(self): - return self - - def __div__(self, other): - if other is AccountingNone: - return AccountingNone - return 0.0 - - def __rdiv__(self, other): - raise ZeroDivisionError - - def __floordiv__(self, other): - if other is AccountingNone: - return AccountingNone - return 0.0 - - def __rfloordiv__(self, other): - raise ZeroDivisionError - - def __truediv__(self, other): - if other is AccountingNone: - return AccountingNone - return 0.0 - - def __rtruediv__(self, other): - raise ZeroDivisionError - - def __mul__(self, other): - if other is None or other is AccountingNone: - return AccountingNone - return 0.0 - - __rmul__ = __mul__ - - def __repr__(self): - return 'AccountingNone' - - def __str__(self): - return '' - - def __nonzero__(self): - return False - - def __bool__(self): - return False - - def __eq__(self, other): - return other == 0 or other is None or other is AccountingNone - - def __lt__(self, other): - return 0 < other - - def __gt__(self, other): - return 0 > other - - -AccountingNone = AccountingNoneType() - - -if __name__ == '__main__': - import doctest - doctest.testmod() diff --git a/mis_builder/models/aep.py b/mis_builder/models/aep.py deleted file mode 100644 index b79276c7..00000000 --- a/mis_builder/models/aep.py +++ /dev/null @@ -1,442 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2014-2015 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -import re -from collections import defaultdict -from itertools import izip - -from odoo import fields -from odoo.models import expression -from odoo.tools.safe_eval import safe_eval -from odoo.tools.float_utils import float_is_zero -from .accounting_none import AccountingNone - - -class AccountingExpressionProcessor(object): - """ Processor for accounting expressions. - - Expressions of the form [accounts][optional move line domain] - are supported, where: - * field is bal, crd, deb - * mode is i (initial balance), e (ending balance), - p (moves over period) - * there is also a special u mode (unallocated P&L) which computes - the sum from the beginning until the beginning of the fiscal year - of the period; it is only meaningful for P&L accounts - * accounts is a list of accounts, possibly containing % wildcards - * an optional domain on move lines allowing filters on eg analytic - accounts or journal - - Examples: - * bal[70]: variation of the balance of moves on account 70 - over the period (it is the same as balp[70]); - * bali[70,60]: balance of accounts 70 and 60 at the start of period; - * bale[1%]: balance of accounts starting with 1 at end of period. - - How to use: - * repeatedly invoke parse_expr() for each expression containing - accounting variables as described above; this lets the processor - group domains and modes and accounts; - * when all expressions have been parsed, invoke done_parsing() - to notify the processor that it can prepare to query (mainly - search all accounts - children, consolidation - that will need to - be queried; - * for each period, call do_queries(), then call replace_expr() for each - expression to replace accounting variables with their resulting value - for the given period. - - How it works: - * by accumulating the expressions before hand, it ensures to do the - strict minimum number of queries to the database (for each period, - one query per domain and mode); - * it queries using the orm read_group which reduces to a query with - sum on debit and credit and group by on account_id (note: it seems - the orm then does one query per account to fetch the account - name...); - * additionally, one query per view/consolidation account is done to - discover the children accounts. - """ - MODE_VARIATION = 'p' - MODE_INITIAL = 'i' - MODE_END = 'e' - MODE_UNALLOCATED = 'u' - - _ACC_RE = re.compile(r"(?P\bbal|\bcrd|\bdeb)" - r"(?P[piseu])?" - r"(?P_[a-zA-Z0-9]+|\[.*?\])" - r"(?P\[.*?\])?") - - def __init__(self, company): - self.company = company - self.dp = company.currency_id.decimal_places - # before done_parsing: {(domain, mode): set(account_codes)} - # after done_parsing: {(domain, mode): list(account_ids)} - self._map_account_ids = defaultdict(set) - # {account_code: account_id} where account_code can be - # - None for all accounts - # - NNN% for a like - # - NNN for a code with an exact match - self._account_ids_by_code = defaultdict(set) - # smart ending balance (returns AccountingNone if there - # are no moves in period and 0 initial balance), implies - # a first query to get the initial balance and another - # to get the variation, so it's a bit slower - self.smart_end = True - - def _load_account_codes(self, account_codes): - account_model = self.company.env['account.account'] - exact_codes = set() - for account_code in account_codes: - if account_code in self._account_ids_by_code: - continue - if account_code is None: - # None means we want all accounts - account_ids = account_model.\ - search([('company_id', '=', self.company.id)]).ids - self._account_ids_by_code[account_code].update(account_ids) - elif '%' in account_code: - account_ids = account_model.\ - search([('code', '=like', account_code), - ('company_id', '=', self.company.id)]).ids - self._account_ids_by_code[account_code].update(account_ids) - else: - # search exact codes after the loop to do less queries - exact_codes.add(account_code) - for account in account_model.\ - search([('code', 'in', list(exact_codes)), - ('company_id', '=', self.company.id)]): - self._account_ids_by_code[account.code].add(account.id) - - def _parse_match_object(self, mo): - """Split a match object corresponding to an accounting variable - - Returns field, mode, [account codes], (domain expression). - """ - field, mode, account_codes, domain = mo.groups() - if not mode: - mode = self.MODE_VARIATION - elif mode == 's': - mode = self.MODE_END - if account_codes.startswith('_'): - account_codes = account_codes[1:] - else: - account_codes = account_codes[1:-1] - if account_codes.strip(): - account_codes = [a.strip() for a in account_codes.split(',')] - else: - account_codes = [None] # None means we want all accounts - domain = domain or '[]' - domain = tuple(safe_eval(domain)) - return field, mode, account_codes, domain - - def parse_expr(self, expr): - """Parse an expression, extracting accounting variables. - - Domains and accounts are extracted and stored in the map - so when all expressions have been parsed, we know which - account codes to query for each domain and mode. - """ - for mo in self._ACC_RE.finditer(expr): - _, mode, account_codes, domain = self._parse_match_object(mo) - if mode == self.MODE_END and self.smart_end: - modes = (self.MODE_INITIAL, self.MODE_VARIATION, self.MODE_END) - else: - modes = (mode, ) - for mode in modes: - key = (domain, mode) - self._map_account_ids[key].update(account_codes) - - def done_parsing(self): - """Load account codes and replace account codes by - account ids in map.""" - for key, account_codes in self._map_account_ids.items(): - # TODO _load_account_codes could be done - # for all account_codes at once (also in v8) - self._load_account_codes(account_codes) - account_ids = set() - for account_code in account_codes: - account_ids.update(self._account_ids_by_code[account_code]) - self._map_account_ids[key] = list(account_ids) - - @classmethod - def has_account_var(cls, expr): - """Test if an string contains an accounting variable.""" - return bool(cls._ACC_RE.search(expr)) - - def get_aml_domain_for_expr(self, expr, - date_from, date_to, - target_move, - account_id=None): - """ Get a domain on account.move.line for an expression. - - Prerequisite: done_parsing() must have been invoked. - - Returns a domain that can be used to search on account.move.line. - """ - aml_domains = [] - date_domain_by_mode = {} - for mo in self._ACC_RE.finditer(expr): - field, mode, account_codes, domain = self._parse_match_object(mo) - aml_domain = list(domain) - account_ids = set() - for account_code in account_codes: - account_ids.update(self._account_ids_by_code[account_code]) - if not account_id: - aml_domain.append(('account_id', 'in', tuple(account_ids))) - else: - # filter on account_id - if account_id in account_ids: - aml_domain.append(('account_id', '=', account_id)) - else: - continue - if field == 'crd': - aml_domain.append(('credit', '>', 0)) - elif field == 'deb': - aml_domain.append(('debit', '>', 0)) - 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) - assert aml_domains - 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): - if mode == self.MODE_VARIATION: - domain = [('date', '>=', date_from), ('date', '<=', date_to)] - elif mode in (self.MODE_INITIAL, self.MODE_END): - # for income and expense account, sum from the beginning - # of the current fiscal year only, for balance sheet accounts - # sum from the beginning of time - date_from_date = fields.Date.from_string(date_from) - fy_date_from = \ - self.company.\ - compute_fiscalyear_dates(date_from_date)['date_from'] - domain = ['|', - ('date', '>=', fields.Date.to_string(fy_date_from)), - ('user_type_id.include_initial_balance', '=', True)] - if mode == self.MODE_INITIAL: - domain.append(('date', '<', date_from)) - elif mode == self.MODE_END: - domain.append(('date', '<=', date_to)) - elif mode == self.MODE_UNALLOCATED: - date_from_date = fields.Date.from_string(date_from) - fy_date_from = \ - self.company.\ - compute_fiscalyear_dates(date_from_date)['date_from'] - domain = [('date', '<', fields.Date.to_string(fy_date_from)), - ('user_type_id.include_initial_balance', '=', False)] - if target_move == 'posted': - domain.append(('move_id.state', '=', 'posted')) - return expression.normalize_domain(domain) - - def do_queries(self, date_from, date_to, - target_move='posted', additional_move_line_filter=None): - """Query sums of debit and credit for all accounts and domains - used in expressions. - - This method must be executed after done_parsing(). - """ - aml_model = self.company.env['account.move.line'] - # {(domain, mode): {account_id: (debit, credit)}} - self._data = defaultdict(dict) - domain_by_mode = {} - ends = [] - for key in self._map_account_ids: - domain, mode = key - if mode == self.MODE_END and self.smart_end: - # postpone computation of ending balance - ends.append((domain, mode)) - 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) - domain = list(domain) + domain_by_mode[mode] - domain.append(('account_id', 'in', self._map_account_ids[key])) - if additional_move_line_filter: - domain.extend(additional_move_line_filter) - # fetch sum of debit/credit, grouped by account_id - accs = aml_model.read_group(domain, - ['debit', 'credit', 'account_id'], - ['account_id']) - for acc in accs: - debit = acc['debit'] or 0.0 - credit = acc['credit'] or 0.0 - if mode in (self.MODE_INITIAL, self.MODE_UNALLOCATED) and \ - float_is_zero(debit-credit, - precision_rounding=self.dp): - # in initial mode, ignore accounts with 0 balance - continue - self._data[key][acc['account_id'][0]] = (debit, credit) - # compute ending balances by summing initial and variation - for key in ends: - domain, mode = key - initial_data = self._data[(domain, self.MODE_INITIAL)] - variation_data = self._data[(domain, self.MODE_VARIATION)] - account_ids = set(initial_data.keys()) | set(variation_data.keys()) - for account_id in account_ids: - di, ci = initial_data.get(account_id, - (AccountingNone, AccountingNone)) - dv, cv = variation_data.get(account_id, - (AccountingNone, AccountingNone)) - self._data[key][account_id] = (di + dv, ci + cv) - - def replace_expr(self, expr): - """Replace accounting variables in an expression by their amount. - - Returns a new expression string. - - This method must be executed after do_queries(). - """ - def f(mo): - field, mode, account_codes, domain = self._parse_match_object(mo) - key = (domain, mode) - account_ids_data = self._data[key] - v = AccountingNone - for account_code in account_codes: - account_ids = self._account_ids_by_code[account_code] - for account_id in account_ids: - debit, credit = \ - account_ids_data.get(account_id, - (AccountingNone, AccountingNone)) - if field == 'bal': - v += debit - credit - elif field == 'deb': - v += debit - elif field == 'crd': - v += credit - # in initial balance mode, assume 0 is None - # as it does not make sense to distinguish 0 from "no data" - if v is not AccountingNone and \ - mode in (self.MODE_INITIAL, self.MODE_UNALLOCATED) and \ - float_is_zero(v, precision_rounding=self.dp): - v = AccountingNone - return '(' + repr(v) + ')' - - return self._ACC_RE.sub(f, expr) - - def replace_exprs_by_account_id(self, exprs): - """Replace accounting variables in a list of expression - by their amount, iterating by accounts involved in the expression. - - yields account_id, replaced_expr - - This method must be executed after do_queries(). - """ - def f(mo): - field, mode, account_codes, domain = self._parse_match_object(mo) - key = (domain, mode) - account_ids_data = self._data[key] - debit, credit = \ - account_ids_data.get(account_id, - (AccountingNone, AccountingNone)) - if field == 'bal': - v = debit - credit - elif field == 'deb': - v = debit - elif field == 'crd': - v = credit - # in initial balance mode, assume 0 is None - # as it does not make sense to distinguish 0 from "no data" - if v is not AccountingNone and \ - mode in (self.MODE_INITIAL, self.MODE_UNALLOCATED) and \ - float_is_zero(v, precision_rounding=self.dp): - v = AccountingNone - return '(' + repr(v) + ')' - - account_ids = set() - for expr in exprs: - for mo in self._ACC_RE.finditer(expr): - field, mode, account_codes, domain = \ - self._parse_match_object(mo) - key = (domain, mode) - account_ids_data = self._data[key] - for account_code in account_codes: - for account_id in self._account_ids_by_code[account_code]: - if account_id in account_ids_data: - account_ids.add(account_id) - - for account_id in account_ids: - yield account_id, [self._ACC_RE.sub(f, expr) for expr in exprs] - - @classmethod - def _get_balances(cls, mode, company, date_from, date_to, - target_move='posted'): - expr = 'deb{mode}[], crd{mode}[]'.format(mode=mode) - aep = AccountingExpressionProcessor(company) - # disable smart_end to have the data at once, instead - # of initial + variation - aep.smart_end = False - aep.parse_expr(expr) - aep.done_parsing() - aep.do_queries(date_from, date_to, target_move) - return aep._data[((), mode)] - - @classmethod - def get_balances_initial(cls, company, date, target_move='posted'): - """ A convenience method to obtain the initial balances of all accounts - at a given date. - - It is the same as get_balances_end(date-1). - - :param company: - :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, company, - date, date, target_move) - - @classmethod - def get_balances_end(cls, company, date, target_move='posted'): - """ A convenience method to obtain the ending balances of all accounts - at a given date. - - It is the same as get_balances_initial(date+1). - - :param company: - :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, company, - date, date, target_move) - - @classmethod - def get_balances_variation(cls, company, date_from, date_to, - target_move='posted'): - """ A convenience method to obtain the variation of the - balances of all accounts over a period. - - :param company: - :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, company, - date_from, date_to, target_move) - - @classmethod - def get_unallocated_pl(cls, company, date, target_move='posted'): - """ A convenience method to obtain the unallocated profit/loss - of the previous fiscal years at a given date. - - :param company: - :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, company, - date, date, target_move) - return tuple(map(sum, izip(*bals.values()))) diff --git a/mis_builder/models/aggregate.py b/mis_builder/models/aggregate.py deleted file mode 100644 index bd2aa3c3..00000000 --- a/mis_builder/models/aggregate.py +++ /dev/null @@ -1,129 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2014-2015 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - - -def _sum(l): - """ Same as stdlib sum but returns None instead of 0 - in case of empty sequence. - - >>> sum([1]) - 1 - >>> _sum([1]) - 1 - >>> sum([1, 2]) - 3 - >>> _sum([1, 2]) - 3 - >>> sum([]) - 0 - >>> _sum([]) - """ - if not l: - return None - return sum(l) - - -def _avg(l): - """ Arithmetic mean of a sequence. Returns None in case of empty sequence. - - >>> _avg([1]) - 1.0 - >>> _avg([1, 2]) - 1.5 - >>> _avg([]) - """ - if not l: - return None - return sum(l) / float(len(l)) - - -def _min(*args): - """ Same as stdlib min but returns None instead of exception - in case of empty sequence. - - >>> min(1, 2) - 1 - >>> _min(1, 2) - 1 - >>> min([1, 2]) - 1 - >>> _min([1, 2]) - 1 - >>> min(1) - Traceback (most recent call last): - File "", line 1, in ? - TypeError: 'int' object is not iterable - >>> _min(1) - Traceback (most recent call last): - File "", line 1, in ? - TypeError: 'int' object is not iterable - >>> min([1]) - 1 - >>> _min([1]) - 1 - >>> min() - Traceback (most recent call last): - File "", line 1, in ? - TypeError: min expected 1 arguments, got 0 - >>> _min() - Traceback (most recent call last): - File "", line 1, in ? - TypeError: min expected 1 arguments, got 0 - >>> min([]) - Traceback (most recent call last): - File "", line 1, in ? - ValueError: min() arg is an empty sequence - >>> _min([]) - """ - if len(args) == 1 and not args[0]: - return None - return min(*args) - - -def _max(*args): - """ Same as stdlib max but returns None instead of exception - in case of empty sequence. - - >>> max(1, 2) - 2 - >>> _max(1, 2) - 2 - >>> max([1, 2]) - 2 - >>> _max([1, 2]) - 2 - >>> max(1) - Traceback (most recent call last): - File "", line 1, in ? - TypeError: 'int' object is not iterable - >>> _max(1) - Traceback (most recent call last): - File "", line 1, in ? - TypeError: 'int' object is not iterable - >>> max([1]) - 1 - >>> _max([1]) - 1 - >>> max() - Traceback (most recent call last): - File "", line 1, in ? - TypeError: max expected 1 arguments, got 0 - >>> _max() - Traceback (most recent call last): - File "", line 1, in ? - TypeError: max expected 1 arguments, got 0 - >>> max([]) - Traceback (most recent call last): - File "", line 1, in ? - ValueError: max() arg is an empty sequence - >>> _max([]) - """ - if len(args) == 1 and not args[0]: - return None - return max(*args) - - -if __name__ == "__main__": - import doctest - doctest.testmod() diff --git a/mis_builder/models/data_error.py b/mis_builder/models/data_error.py deleted file mode 100644 index e2869c5a..00000000 --- a/mis_builder/models/data_error.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2016 ACSONE SA/NV () -# © 2016 Akretion () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - - -class DataError(Exception): - - def __init__(self, name, msg): - self.name = name - self.msg = msg - - -class NameDataError(DataError): - pass diff --git a/mis_builder/models/mis_report.py b/mis_builder/models/mis_report.py deleted file mode 100644 index 3604182c..00000000 --- a/mis_builder/models/mis_report.py +++ /dev/null @@ -1,1043 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2014-2016 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -from collections import defaultdict, OrderedDict -import datetime -import dateutil -from itertools import izip -import logging -import re -import time - -import pytz - -from odoo import api, fields, models, _ -from odoo.exceptions import UserError -from odoo.tools.safe_eval import safe_eval - -from .aep import AccountingExpressionProcessor as AEP -from .aggregate import _sum, _avg, _min, _max -from .accounting_none import AccountingNone -from .simple_array import SimpleArray -from .mis_safe_eval import mis_safe_eval, DataError, NameDataError -from .mis_report_style import ( - TYPE_NUM, TYPE_PCT, TYPE_STR, CMP_DIFF, CMP_PCT, CMP_NONE -) - -_logger = logging.getLogger(__name__) - - -class AutoStruct(object): - - def __init__(self, **kwargs): - for k, v in kwargs.items(): - setattr(self, k, v) - - -class KpiMatrixRow(object): - - # TODO: ultimately, the kpi matrix will become ignorant of KPI's and - # accounts and know about rows, columns, sub columns and styles only. - # It is already ignorant of period and only knowns about columns. - # This will require a correct abstraction for expanding row details. - - def __init__(self, matrix, kpi, account_id=None, parent_row=None): - self._matrix = matrix - self.kpi = kpi - self.account_id = account_id - self.description = '' - self.parent_row = parent_row - if not self.account_id: - self.style_props = self._matrix._style_model.merge([ - self.kpi.report_id.style_id, - self.kpi.style_id]) - else: - self.style_props = self._matrix._style_model.merge([ - self.kpi.report_id.style_id, - self.kpi.auto_expand_accounts_style_id]) - - @property - def label(self): - if not self.account_id: - return self.kpi.description - else: - return self._matrix.get_account_name(self.account_id) - - @property - def row_id(self): - if not self.account_id: - return self.kpi.name - else: - return '{}:{}'.format(self.kpi.name, self.account_id) - - def iter_cell_tuples(self, cols=None): - if cols is None: - cols = self._matrix.iter_cols() - for col in cols: - yield col.get_cell_tuple_for_row(self) - - def iter_cells(self, subcols=None): - if subcols is None: - subcols = self._matrix.iter_subcols() - for subcol in subcols: - yield subcol.get_cell_for_row(self) - - -class KpiMatrixCol(object): - - def __init__(self, label, description, locals_dict, subkpis): - self.label = label - self.description = description - self.locals_dict = locals_dict - self.colspan = subkpis and len(subkpis) or 1 - self._subcols = [] - self.subkpis = subkpis - if not subkpis: - subcol = KpiMatrixSubCol(self, '', '', 0) - self._subcols.append(subcol) - else: - for i, subkpi in enumerate(subkpis): - subcol = KpiMatrixSubCol(self, subkpi.description, '', i) - self._subcols.append(subcol) - self._cell_tuples_by_row = {} # {row: (cells tuple)} - - def _set_cell_tuple(self, row, cell_tuple): - self._cell_tuples_by_row[row] = cell_tuple - - def iter_subcols(self): - return self._subcols - - def iter_cell_tuples(self): - return self._cell_tuples_by_row.values() - - def get_cell_tuple_for_row(self, row): - return self._cell_tuples_by_row.get(row) - - -class KpiMatrixSubCol(object): - - def __init__(self, col, label, description, index=0): - self.col = col - self.label = label - self.description = description - self.index = index - - @property - def subkpi(self): - if self.col.subkpis: - return self.col.subkpis[self.index] - - def iter_cells(self): - for cell_tuple in self.col.iter_cell_tuples(): - yield cell_tuple[self.index] - - def get_cell_for_row(self, row): - cell_tuple = self.col.get_cell_tuple_for_row(row) - if cell_tuple is None: - return None - return cell_tuple[self.index] - - -class KpiMatrixCell(object): - - def __init__(self, row, subcol, - val, val_rendered, val_comment, - style_props, - drilldown_arg): - self.row = row - self.subcol = subcol - self.val = val - self.val_rendered = val_rendered - self.val_comment = val_comment - self.style_props = style_props - self.drilldown_arg = drilldown_arg - - -class KpiMatrix(object): - - def __init__(self, env): - # cache language id for faster rendering - lang_model = env['res.lang'] - self.lang = lang_model._lang_get(env.user.lang) - self._style_model = env['mis.report.style'] - self._account_model = env['account.account'] - # data structures - # { kpi: KpiMatrixRow } - self._kpi_rows = OrderedDict() - # { kpi: {account_id: KpiMatrixRow} } - self._detail_rows = {} - # { col_key: KpiMatrixCol } - self._cols = OrderedDict() - # { col_key (left of comparison): [(col_key, base_col_key)] } - self._comparison_todo = defaultdict(list) - self._comparison_cols = defaultdict(list) - # { account_id: account_name } - self._account_names = {} - - def declare_kpi(self, kpi): - """ Declare a new kpi (row) in the matrix. - - Invoke this first for all kpi, in display order. - """ - self._kpi_rows[kpi] = KpiMatrixRow(self, kpi) - self._detail_rows[kpi] = {} - - def declare_col(self, col_key, label, description, - locals_dict, subkpis): - """ Declare a new column, giving it an identifier (key). - - Invoke this and declare_comparison in display order. - """ - col = KpiMatrixCol(label, description, locals_dict, subkpis) - self._cols[col_key] = col - return col - - def declare_comparison(self, col_key, base_col_key): - """ Declare a new comparison column. - - Invoke this and declare_col in display order. - """ - last_col_key = list(self._cols.keys())[-1] - self._comparison_todo[last_col_key].append( - (col_key, base_col_key)) - - def set_values(self, kpi, col_key, vals, - drilldown_args): - """ Set values for a kpi and a colum. - - Invoke this after declaring the kpi and the column. - """ - self.set_values_detail_account(kpi, col_key, None, vals, - drilldown_args) - - def set_values_detail_account(self, kpi, col_key, account_id, vals, - drilldown_args): - """ Set values for a kpi and a column and a detail account. - - Invoke this after declaring the kpi and the column. - """ - if not account_id: - row = self._kpi_rows[kpi] - else: - kpi_row = self._kpi_rows[kpi] - if account_id in self._detail_rows[kpi]: - row = self._detail_rows[kpi][account_id] - else: - row = KpiMatrixRow(self, kpi, account_id, parent_row=kpi_row) - self._detail_rows[kpi][account_id] = row - col = self._cols[col_key] - cell_tuple = [] - assert len(vals) == col.colspan - assert len(drilldown_args) == col.colspan - for val, drilldown_arg, subcol in \ - izip(vals, drilldown_args, col.iter_subcols()): - if isinstance(val, DataError): - val_rendered = val.name - val_comment = val.msg - else: - val_rendered = self._style_model.render( - self.lang, row.style_props, kpi.type, val) - if subcol.subkpi: - val_comment = u'{}.{} = {}'.format( - row.kpi.name, - subcol.subkpi.name, - row.kpi._get_expression_for_subkpi(subcol.subkpi)) - else: - val_comment = u'{} = {}'.format( - row.kpi.name, - row.kpi.expression) - cell_style_props = row.style_props - if row.kpi.style_expression: - # evaluate style expression - try: - style_name = mis_safe_eval(row.kpi.style_expression, - col.locals_dict) - except: - _logger.error("Error evaluating style expression <%s>", - row.kpi.style_expression, exc_info=True) - if style_name: - style = self._style_model.search( - [('name', '=', style_name)]) - if style: - cell_style_props = self._style_model.merge( - [row.style_props, style[0]]) - else: - _logger.error("Style '%s' not found.", style_name) - cell = KpiMatrixCell(row, subcol, val, val_rendered, val_comment, - cell_style_props, drilldown_arg) - cell_tuple.append(cell) - assert len(cell_tuple) == col.colspan - col._set_cell_tuple(row, cell_tuple) - - def compute_comparisons(self): - """ Compute comparisons. - - Invoke this after setting all values. - """ - for pos_col_key, comparisons in self._comparison_todo.items(): - for col_key, base_col_key in comparisons: - col = self._cols[col_key] - base_col = self._cols[base_col_key] - common_subkpis = set(col.subkpis) & set(base_col.subkpis) - if (col.subkpis or base_col.subkpis) and not common_subkpis: - raise UserError('Columns {} and {} are not comparable'. - format(col.description, - base_col.description)) - label = u'{} vs {}'.\ - format(col.label, base_col.label) - comparison_col = KpiMatrixCol(label, None, {}, - sorted(common_subkpis, - key=lambda s: s.sequence)) - for row in self.iter_rows(): - cell_tuple = col.get_cell_tuple_for_row(row) - base_cell_tuple = base_col.get_cell_tuple_for_row(row) - if cell_tuple is None and base_cell_tuple is None: - continue - if cell_tuple is None: - vals = [AccountingNone] * \ - (len(common_subkpis) or 1) - else: - vals = [cell.val for cell in cell_tuple - if not common_subkpis or - cell.subcol.subkpi in common_subkpis] - if base_cell_tuple is None: - base_vals = [AccountingNone] * \ - (len(common_subkpis) or 1) - else: - base_vals = [cell.val for cell in base_cell_tuple - if not common_subkpis or - cell.subcol.subkpi in common_subkpis] - comparison_cell_tuple = [] - for val, base_val, comparison_subcol in \ - izip(vals, - base_vals, - comparison_col.iter_subcols()): - # TODO FIXME average factors - delta, delta_r, style_r = \ - self._style_model.compare_and_render( - self.lang, row.style_props, - row.kpi.type, row.kpi.compare_method, - val, base_val, 1, 1) - comparison_cell_tuple.append(KpiMatrixCell( - row, comparison_subcol, delta, delta_r, None, - style_r, None)) - comparison_col._set_cell_tuple(row, comparison_cell_tuple) - self._comparison_cols[pos_col_key].append(comparison_col) - - def iter_rows(self): - """ Iterate rows in display order. - - yields KpiMatrixRow. - """ - for kpi_row in self._kpi_rows.values(): - yield kpi_row - detail_rows = self._detail_rows[kpi_row.kpi].values() - detail_rows = sorted(detail_rows, key=lambda r: r.description) - for detail_row in detail_rows: - yield detail_row - - def iter_cols(self): - """ Iterate columns in display order. - - yields KpiMatrixCol: one for each column or comparison. - """ - for col_key, col in self._cols.items(): - yield col - for comparison_col in self._comparison_cols[col_key]: - yield comparison_col - - def iter_subcols(self): - """ Iterate sub columns in display order. - - yields KpiMatrixSubCol: one for each subkpi in each column - and comparison. - """ - for col in self.iter_cols(): - for subcol in col.iter_subcols(): - yield subcol - - def _load_account_names(self): - account_ids = set() - for detail_rows in self._detail_rows.values(): - account_ids.update(detail_rows.keys()) - account_ids = list(account_ids) - accounts = self._account_model.search([('id', 'in', account_ids)]) - self._account_names = {a.id: u'{} {}'.format(a.code, a.name) - for a in accounts} - - def get_account_name(self, account_id): - if account_id not in self._account_names: - self._load_account_names() - return self._account_names[account_id] - - def as_dict(self): - header = [{'cols': []}, {'cols': []}] - for col in self.iter_cols(): - header[0]['cols'].append({ - 'label': col.label, - 'description': col.description, - 'colspan': col.colspan, - }) - for subcol in col.iter_subcols(): - header[1]['cols'].append({ - 'label': subcol.label, - 'description': subcol.description, - 'colspan': 1, - }) - - body = [] - for row in self.iter_rows(): - row_data = { - 'row_id': row.row_id, - 'parent_row_id': (row.parent_row and - row.parent_row.row_id or None), - 'label': row.label, - 'description': row.description, - 'style': self._style_model.to_css_style( - row.style_props), - 'cells': [] - } - for cell in row.iter_cells(): - if cell is None: - # TODO use subcol style here - row_data['cells'].append({}) - else: - if cell.val is AccountingNone or \ - isinstance(cell.val, DataError): - val = None - else: - val = cell.val - col_data = { - 'val': val, - 'val_r': cell.val_rendered, - 'val_c': cell.val_comment, - 'style': self._style_model.to_css_style( - cell.style_props, no_indent=True), - } - if cell.drilldown_arg: - col_data['drilldown_arg'] = cell.drilldown_arg - row_data['cells'].append(col_data) - body.append(row_data) - - return { - 'header': header, - 'body': body, - } - - -def _utc_midnight(d, tz_name, add_day=0): - d = fields.Datetime.from_string(d) + datetime.timedelta(days=add_day) - utc_tz = pytz.timezone('UTC') - context_tz = pytz.timezone(tz_name) - local_timestamp = context_tz.localize(d, is_dst=False) - return fields.Datetime.to_string(local_timestamp.astimezone(utc_tz)) - - -def _python_var(var_str): - return re.sub(r'\W|^(?=\d)', '_', var_str).lower() - - -def _is_valid_python_var(name): - return re.match("[_A-Za-z][_a-zA-Z0-9]*$", name) - - -class MisReportKpi(models.Model): - """ A KPI is an element (ie a line) of a MIS report. - - In addition to a name and description, it has an expression - to compute it based on queries defined in the MIS report. - It also has various informations defining how to render it - (numeric or percentage or a string, a prefix, a suffix, divider) and - how to render comparison of two values of the KPI. - KPI's have a sequence and are ordered inside the MIS report. - """ - - _name = 'mis.report.kpi' - - name = fields.Char(size=32, required=True, - string='Name') - description = fields.Char(required=True, - string='Description', - translate=True) - multi = fields.Boolean() - expression = fields.Char( - compute='_compute_expression', - inverse='_inverse_expression') - expression_ids = fields.One2many('mis.report.kpi.expression', 'kpi_id') - auto_expand_accounts = fields.Boolean(string='Display details by account') - auto_expand_accounts_style_id = fields.Many2one( - string="Style for account detail rows", - comodel_name="mis.report.style", - required=False - ) - style_id = fields.Many2one( - string="Style", - comodel_name="mis.report.style", - required=False - ) - style_expression = fields.Char( - string='Style expression', - help='An expression that returns a style depending on the KPI value. ' - 'Such style is applied on top of the row style.') - type = fields.Selection([(TYPE_NUM, _('Numeric')), - (TYPE_PCT, _('Percentage')), - (TYPE_STR, _('String'))], - required=True, - string='Value type', - default=TYPE_NUM) - compare_method = fields.Selection([(CMP_DIFF, _('Difference')), - (CMP_PCT, _('Percentage')), - (CMP_NONE, _('None'))], - required=True, - string='Comparison Method', - default=CMP_PCT) - sequence = fields.Integer(string='Sequence', default=100) - report_id = fields.Many2one('mis.report', - string='Report', - ondelete='cascade') - - _order = 'sequence, id' - - @api.constrains('name') - def _check_name(self): - for record in self: - if not _is_valid_python_var(record.name): - raise UserError(_('The name must be a valid python ' - 'identifier')) - - @api.onchange('name') - def _onchange_name(self): - if self.name and not _is_valid_python_var(self.name): - return { - 'warning': { - 'title': 'Invalid name %s' % self.name, - 'message': 'The name must be a valid python identifier' - } - } - - @api.multi - @api.depends('expression_ids.subkpi_id.name', 'expression_ids.name') - def _compute_expression(self): - for kpi in self: - l = [] - for expression in kpi.expression_ids: - if expression.subkpi_id: - l.append(u'{}\xa0=\xa0{}'.format( - expression.subkpi_id.name, expression.name)) - else: - l.append( - expression.name or 'AccountingNone') - kpi.expression = ',\n'.join(l) - - @api.multi - def _inverse_expression(self): - for kpi in self: - if kpi.multi: - raise UserError(_('Can not update a multi kpi from ' - 'the kpi line')) - if kpi.expression_ids: - kpi.expression_ids[0].write({ - 'name': kpi.expression, - 'subkpi_id': None}) - for expression in kpi.expression_ids[1:]: - expression.unlink() - else: - kpi.write({ - 'expression_ids': [(0, 0, { - 'name': kpi.expression - })] - }) - - @api.onchange('multi') - def _onchange_multi(self): - for kpi in self: - if not kpi.multi: - if kpi.expression_ids: - kpi.expression = kpi.expression_ids[0].name - else: - kpi.expression = None - else: - expressions = [] - for subkpi in kpi.report_id.subkpi_ids: - expressions.append((0, 0, { - 'name': kpi.expression, - 'subkpi_id': subkpi.id, - })) - kpi.expression_ids = expressions - - @api.onchange('description') - def _onchange_description(self): - """ construct name from description """ - if self.description and not self.name: - self.name = _python_var(self.description) - - @api.onchange('type') - def _onchange_type(self): - if self.type == TYPE_NUM: - self.compare_method = CMP_PCT - elif self.type == TYPE_PCT: - self.compare_method = CMP_DIFF - elif self.type == TYPE_STR: - self.compare_method = CMP_NONE - - def _get_expression_for_subkpi(self, subkpi): - for expression in self.expression_ids: - if expression.subkpi_id == subkpi: - return expression.name or 'AccountingNone' - return 'AccountingNone' - - def _get_expressions(self, subkpis): - if subkpis and self.multi: - return [ - self._get_expression_for_subkpi(subkpi) - for subkpi in subkpis - ] - else: - if self.expression_ids: - assert len(self.expression_ids) == 1 - assert not self.expression_ids[0].subkpi_id - return [self.expression_ids[0].name or 'AccountingNone'] - else: - return ['AccountingNone'] - - -class MisReportSubkpi(models.Model): - _name = 'mis.report.subkpi' - _order = 'sequence' - - sequence = fields.Integer() - report_id = fields.Many2one('mis.report') - name = fields.Char(size=32, required=True, - string='Name') - description = fields.Char(required=True, - string='Description', - translate=True) - expression_ids = fields.One2many('mis.report.kpi.expression', 'subkpi_id') - - @api.constrains('name') - def _check_name(self): - for record in self: - if not _is_valid_python_var(record.name): - raise UserError(_('The name must be a valid python ' - 'identifier')) - - @api.onchange('name') - def _onchange_name(self): - if self.name and not _is_valid_python_var(self.name): - return { - 'warning': { - 'title': 'Invalid name %s' % self.name, - 'message': 'The name must be a valid python identifier' - } - } - - @api.onchange('description') - def _onchange_description(self): - """ construct name from description """ - if self.description and not self.name: - self.name = _python_var(self.description) - - @api.multi - def unlink(self): - for subkpi in self: - subkpi.expression_ids.unlink() - return super(MisReportSubkpi, self).unlink() - - -class MisReportKpiExpression(models.Model): - """ A KPI Expression is an expression of a line of a MIS report Kpi. - It's used to compute the kpi value. - """ - - _name = 'mis.report.kpi.expression' - _order = 'sequence, name' - - sequence = fields.Integer( - related='subkpi_id.sequence', - store=True, - readonly=True) - name = fields.Char(string='Expression') - kpi_id = fields.Many2one('mis.report.kpi', required=True) - # TODO FIXME set readonly=True when onchange('subkpi_ids') below works - subkpi_id = fields.Many2one( - 'mis.report.subkpi', - readonly=False) - - _sql_constraints = [ - ('subkpi_kpi_unique', 'unique(subkpi_id, kpi_id)', - 'Sub KPI must be used once and only once for each KPI'), - ] - - -class MisReportQuery(models.Model): - """ A query to fetch arbitrary data for a MIS report. - - A query works on a model and has a domain and list of fields to fetch. - At runtime, the domain is expanded with a "and" on the date/datetime field. - """ - - _name = 'mis.report.query' - - @api.depends('field_ids') - def _compute_field_names(self): - for record in self: - 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') - model_id = fields.Many2one('ir.model', required=True, - string='Model') - field_ids = fields.Many2many('ir.model.fields', required=True, - string='Fields to fetch') - field_names = fields.Char(compute='_compute_field_names', - string='Fetched fields name') - aggregate = fields.Selection([('sum', _('Sum')), - ('avg', _('Average')), - ('min', _('Min')), - ('max', _('Max'))], - string='Aggregate') - date_field = fields.Many2one('ir.model.fields', required=True, - string='Date field', - domain=[('ttype', 'in', - ('date', 'datetime'))]) - domain = fields.Char(string='Domain') - report_id = fields.Many2one('mis.report', string='Report', - ondelete='cascade') - - _order = 'name' - - @api.constrains('name') - def _check_name(self): - for record in self: - if not _is_valid_python_var(record.name): - raise UserError(_('The name must be a valid python ' - 'identifier')) - - -class MisReport(models.Model): - """ A MIS report template (without period information) - - The MIS report holds: - * a list of explicit queries; the result of each query is - stored in a variable with same name as a query, containing as list - of data structures populated with attributes for each fields to fetch; - when queries have an aggregate method and no fields to group, it returns - a data structure with the aggregated fields - * a list of KPI to be evaluated based on the variables resulting - from the accounting data and queries (KPI expressions can references - queries and accounting expression - see AccoutingExpressionProcessor) - """ - - _name = 'mis.report' - - name = fields.Char(required=True, - string='Name', translate=True) - description = fields.Char(required=False, - string='Description', translate=True) - style_id = fields.Many2one(string="Style", - comodel_name="mis.report.style") - query_ids = fields.One2many('mis.report.query', 'report_id', - string='Queries', - copy=True) - kpi_ids = fields.One2many('mis.report.kpi', 'report_id', - string='KPI\'s', - copy=True) - subkpi_ids = fields.One2many('mis.report.subkpi', 'report_id', - string="Sub KPI", - copy=True) - - @api.onchange('subkpi_ids') - def _on_change_subkpi_ids(self): - """ Update kpi expressions when subkpis change on the report, - so the list of kpi expressions is always up-to-date """ - for kpi in self.kpi_ids: - if not kpi.multi: - continue - new_subkpis = set([subkpi for subkpi in self.subkpi_ids]) - expressions = [] - for expression in kpi.expression_ids: - assert expression.subkpi_id # must be true if kpi is multi - if expression.subkpi_id not in self.subkpi_ids: - expressions.append((2, expression.id, None)) # remove - else: - new_subkpis.remove(expression.subkpi_id) # no change - for subkpi in new_subkpis: - # TODO FIXME this does not work, while the remove above works - expressions.append((0, None, { - 'name': False, - 'subkpi_id': subkpi.id, - })) # add empty expressions for new subkpis - if expressions: - kpi.expressions_ids = expressions - - @api.multi - def get_wizard_report_action(self): - action = self.env.ref('mis_builder.mis_report_instance_view_action') - res = action.read()[0] - view = self.env.ref('mis_builder.wizard_mis_report_instance_view_form') - res.update({ - 'view_id': view.id, - 'views': [(view.id, 'form')], - 'target': 'new', - 'context': { - 'default_report_id': self.id, - 'default_name': self.name, - 'default_temporary': True, - } - }) - return res - - @api.multi - def copy(self, default=None): - self.ensure_one() - default = dict(default or {}) - default['name'] = _('%s (copy)') % self.name - return super(MisReport, self).copy(default) - - # TODO: kpi name cannot be start with query name - - @api.multi - def prepare_kpi_matrix(self): - self.ensure_one() - kpi_matrix = KpiMatrix(self.env) - for kpi in self.kpi_ids: - kpi_matrix.declare_kpi(kpi) - return kpi_matrix - - @api.multi - def _prepare_aep(self, company): - self.ensure_one() - aep = AEP(company) - for kpi in self.kpi_ids: - for expression in kpi.expression_ids: - if expression.name: - aep.parse_expr(expression.name) - aep.done_parsing() - return aep - - def prepare_locals_dict(self): - return { - 'sum': _sum, - 'min': _min, - 'max': _max, - 'len': len, - 'avg': _avg, - 'AccountingNone': AccountingNone, - 'SimpleArray': SimpleArray, - } - - @api.multi - def _fetch_queries(self, date_from, date_to, - get_additional_query_filter=None): - self.ensure_one() - res = {} - for query in self.query_ids: - model = self.env[query.model_id.model] - eval_context = { - 'env': self.env, - 'time': time, - 'datetime': datetime, - 'dateutil': dateutil, - # deprecated - 'uid': self.env.uid, - 'context': self.env.context, - } - domain = query.domain and \ - safe_eval(query.domain, eval_context) or [] - if get_additional_query_filter: - domain.extend(get_additional_query_filter(query)) - if query.date_field.ttype == 'date': - domain.extend([(query.date_field.name, '>=', date_from), - (query.date_field.name, '<=', date_to)]) - else: - datetime_from = _utc_midnight( - date_from, self._context.get('tz', 'UTC')) - datetime_to = _utc_midnight( - date_to, self._context.get('tz', 'UTC'), add_day=1) - domain.extend([(query.date_field.name, '>=', datetime_from), - (query.date_field.name, '<', datetime_to)]) - field_names = [f.name for f in query.field_ids] - all_stored = all([model._fields[f].store for f in field_names]) - if not query.aggregate: - data = model.search_read(domain, field_names) - res[query.name] = [AutoStruct(**d) for d in data] - elif query.aggregate == 'sum' and all_stored: - # use read_group to sum stored fields - data = model.read_group( - domain, field_names, []) - s = AutoStruct(count=data[0]['__count']) - for field_name in field_names: - try: - v = data[0][field_name] - except KeyError: - _logger.error('field %s not found in read_group ' - 'for %s; not summable?', - field_name, model._name) - v = AccountingNone - setattr(s, field_name, v) - res[query.name] = s - else: - data = model.search_read(domain, field_names) - s = AutoStruct(count=len(data)) - if query.aggregate == 'min': - agg = _min - elif query.aggregate == 'max': - agg = _max - elif query.aggregate == 'avg': - agg = _avg - elif query.aggregate == 'sum': - agg = _sum - for field_name in field_names: - setattr(s, field_name, - agg([d[field_name] for d in data])) - res[query.name] = s - return res - - @api.multi - def declare_and_compute_period(self, kpi_matrix, - col_key, - col_label, - col_description, - aep, - date_from, date_to, - target_move, - subkpis_filter=None, - get_additional_move_line_filter=None, - get_additional_query_filter=None, - locals_dict=None): - """ Evaluate a report for a given period, populating a KpiMatrix. - - :param kpi_matrix: the KpiMatrix object to be populated created - with prepare_kpi_matrix() - :param col_key: the period key to use when populating the KpiMatrix - :param aep: an AccountingExpressionProcessor instance created - using _prepare_aep() - :param date_from, date_to: the starting and ending date - :param target_move: all|posted - :param get_additional_move_line_filter: a bound method that takes - no arguments and returns - a domain compatible with - account.move.line - :param get_additional_query_filter: a bound method that takes a single - query argument and returns a - domain compatible with the query - underlying model - :param locals_dict: personalized locals dictionary used as evaluation - context for the KPI expressions - """ - self.ensure_one() - - # prepare the localsdict - if locals_dict is None: - locals_dict = {} - - locals_dict.update(self.prepare_locals_dict()) - - # fetch non-accounting queries - locals_dict.update(self._fetch_queries( - date_from, date_to, get_additional_query_filter)) - - # use AEP to do the accounting queries - additional_move_line_filter = None - if get_additional_move_line_filter: - additional_move_line_filter = get_additional_move_line_filter() - aep.do_queries(date_from, date_to, - target_move, - additional_move_line_filter) - - if subkpis_filter: - subkpis = [subkpi for subkpi in self.subkpi_ids - if subkpi in subkpis_filter] - else: - subkpis = self.subkpi_ids - col = kpi_matrix.declare_col(col_key, - col_label, col_description, - locals_dict, subkpis) - - compute_queue = self.kpi_ids - recompute_queue = [] - while True: - for kpi in compute_queue: - # build the list of expressions for this kpi - expressions = kpi._get_expressions(subkpis) - - vals = [] - drilldown_args = [] - name_error = False - for expression in expressions: - replaced_expr = aep.replace_expr(expression) - vals.append( - mis_safe_eval(replaced_expr, locals_dict)) - if isinstance(vals[-1], NameDataError): - name_error = True - if replaced_expr != expression: - drilldown_args.append({ - 'period_id': col_key, - 'expr': expression, - }) - else: - drilldown_args.append(None) - if name_error: - recompute_queue.append(kpi) - else: - # no error, set it in locals_dict so it can be used - # in computing other kpis - if len(expressions) == 1: - locals_dict[kpi.name] = vals[0] - else: - locals_dict[kpi.name] = SimpleArray(vals) - - # even in case of name error we set the result in the matrix - # so the name error will be displayed if it cannot be - # resolved by recomputing later - if len(expressions) == 1 and col.colspan > 1: - if isinstance(vals[0], tuple): - vals = vals[0] - assert len(vals) == col.colspan - elif isinstance(vals[0], DataError): - vals = (vals[0],) * col.colspan - else: - raise UserError(_("Probably not your fault... but I'm " - "really curious to know how you " - "managed to raise this error so " - "I can handle one more corner " - "case!")) - if len(drilldown_args) != col.colspan: - drilldown_args = [None] * col.colspan - kpi_matrix.set_values( - kpi, col_key, vals, drilldown_args) - - if not kpi.auto_expand_accounts or name_error: - continue - - for account_id, replaced_exprs in \ - aep.replace_exprs_by_account_id(expressions): - vals = [] - drilldown_args = [] - for expression, replaced_expr in \ - izip(expressions, replaced_exprs): - vals.append(mis_safe_eval(replaced_expr, locals_dict)) - if replaced_expr != expression: - drilldown_args.append({ - 'period_id': col_key, - 'expr': expression, - 'account_id': account_id - }) - else: - drilldown_args.append(None) - kpi_matrix.set_values_detail_account( - kpi, col_key, account_id, vals, drilldown_args) - - if len(recompute_queue) == 0: - # nothing to recompute, we are done - break - if len(recompute_queue) == len(compute_queue): - # could not compute anything in this iteration - # (ie real Name errors or cyclic dependency) - # so we stop trying - break - # try again - compute_queue = recompute_queue - recompute_queue = [] diff --git a/mis_builder/models/mis_report_instance.py b/mis_builder/models/mis_report_instance.py deleted file mode 100644 index d7d1a73e..00000000 --- a/mis_builder/models/mis_report_instance.py +++ /dev/null @@ -1,422 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2014-2016 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -from odoo import api, fields, models, _ - -import datetime -import logging - -from .aep import AccountingExpressionProcessor as AEP - -_logger = logging.getLogger(__name__) - - -class MisReportInstancePeriod(models.Model): - """ A MIS report instance has the logic to compute - a report template for a given date period. - - Periods have a duration (day, week, fiscal period) and - are defined as an offset relative to a pivot date. - """ - - @api.multi - @api.depends('report_instance_id.pivot_date', - 'report_instance_id.comparison_mode', - 'date_range_type_id', - 'type', 'offset', 'duration', 'mode') - def _compute_dates(self): - for record in self: - record.date_from = False - record.date_to = False - record.valid = False - report = record.report_instance_id - d = fields.Date.from_string(report.pivot_date) - if not report.comparison_mode: - record.date_from = report.date_from - record.date_to = report.date_to - record.valid = True - elif record.mode == 'fix': - record.date_from = record.manual_date_from - record.date_to = record.manual_date_to - record.valid = True - elif record.type == 'd': - date_from = d + datetime.timedelta(days=record.offset) - date_to = date_from + \ - datetime.timedelta(days=record.duration - 1) - record.date_from = fields.Date.to_string(date_from) - record.date_to = fields.Date.to_string(date_to) - record.valid = True - elif record.type == 'w': - date_from = d - datetime.timedelta(d.weekday()) - date_from = date_from + \ - datetime.timedelta(days=record.offset * 7) - date_to = date_from + \ - datetime.timedelta(days=(7 * record.duration) - 1) - record.date_from = fields.Date.to_string(date_from) - record.date_to = fields.Date.to_string(date_to) - record.valid = True - elif record.type == 'date_range': - date_range_obj = record.env['date.range'] - current_periods = date_range_obj.search( - [('type_id', '=', record.date_range_type_id.id), - ('date_start', '<=', d), - ('date_end', '>=', d), - ('company_id', '=', - record.report_instance_id.company_id.id)]) - if current_periods: - all_periods = date_range_obj.search( - [('type_id', '=', record.date_range_type_id.id), - ('company_id', '=', - record.report_instance_id.company_id.id)], - order='date_start') - all_period_ids = [p.id for p in all_periods] - p = all_period_ids.index(current_periods[0].id) + \ - record.offset - if p >= 0 and p + record.duration <= len(all_period_ids): - periods = all_periods[p:p + record.duration] - record.date_from = periods[0].date_start - record.date_to = periods[-1].date_end - record.valid = True - - _name = 'mis.report.instance.period' - - name = fields.Char(size=32, required=True, - string='Description', translate=True) - mode = fields.Selection([('fix', 'Fixed dates'), - ('relative', 'Relative to report base date'), - ], required=True, - default='fix') - type = fields.Selection([('d', _('Day')), - ('w', _('Week')), - ('date_range', _('Date Range')) - ], - string='Period type') - date_range_type_id = fields.Many2one( - comodel_name='date.range.type', string='Date Range Type') - offset = fields.Integer(string='Offset', - help='Offset from current period', - default=-1) - duration = fields.Integer(string='Duration', - help='Number of periods', - default=1) - date_from = fields.Date(compute='_compute_dates', string="From") - date_to = fields.Date(compute='_compute_dates', string="To") - manual_date_from = fields.Date(string="From") - manual_date_to = fields.Date(string="To") - date_range_id = fields.Many2one( - comodel_name='date.range', - string='Date Range') - valid = fields.Boolean(compute='_compute_dates', - type='boolean', - string='Valid') - sequence = fields.Integer(string='Sequence', default=100) - report_instance_id = fields.Many2one('mis.report.instance', - string='Report Instance', - ondelete='cascade') - comparison_column_ids = fields.Many2many( - comodel_name='mis.report.instance.period', - relation='mis_report_instance_period_rel', - column1='period_id', - column2='compare_period_id', - string='Compare with') - normalize_factor = fields.Integer( - string='Factor', - help='Factor to use to normalize the period (used in comparison', - default=1) - subkpi_ids = fields.Many2many( - 'mis.report.subkpi', - string="Sub KPI Filter") - - _order = 'sequence, id' - - _sql_constraints = [ - ('duration', 'CHECK (duration>0)', - 'Wrong duration, it must be positive!'), - ('normalize_factor', 'CHECK (normalize_factor>0)', - 'Wrong normalize factor, it must be positive!'), - ('name_unique', 'unique(name, report_instance_id)', - 'Period name should be unique by report'), - ] - - @api.onchange('date_range_id') - def _onchange_date_range(self): - for record in self: - record.manual_date_from = record.date_range_id.date_start - record.manual_date_to = record.date_range_id.date_end - record.name = record.date_range_id.name - - @api.multi - def _get_additional_move_line_filter(self): - """ Prepare a filter to apply on all move lines - - This filter is applied with a AND operator on all - accounting expression domains. This hook is intended - to be inherited, and is useful to implement filtering - on analytic dimensions or operational units. - - Returns an Odoo domain expression (a python list) - compatible with account.move.line.""" - self.ensure_one() - return [] - - @api.multi - def _get_additional_query_filter(self, query): - """ Prepare an additional filter to apply on the query - - This filter is combined to the query domain with a AND - operator. This hook is intended - to be inherited, and is useful to implement filtering - on analytic dimensions or operational units. - - Returns an Odoo domain expression (a python list) - compatible with the model of the query.""" - self.ensure_one() - return [] - - -class MisReportInstance(models.Model): - """The MIS report instance combines everything to compute - a MIS report template for a set of periods.""" - - @api.depends('date') - def _compute_pivot_date(self): - for record in self: - if record.date: - record.pivot_date = record.date - else: - record.pivot_date = fields.Date.context_today(record) - - @api.model - def _default_company(self): - return self.env['res.company'].\ - _company_default_get('mis.report.instance') - - _name = 'mis.report.instance' - - name = fields.Char(required=True, - string='Name', translate=True) - description = fields.Char(related='report_id.description', - readonly=True) - date = fields.Date(string='Base date', - help='Report base date ' - '(leave empty to use current date)') - pivot_date = fields.Date(compute='_compute_pivot_date', - string="Pivot date") - report_id = fields.Many2one('mis.report', - required=True, - string='Report') - period_ids = fields.One2many('mis.report.instance.period', - 'report_instance_id', - required=True, - string='Periods', - copy=True) - target_move = fields.Selection([('posted', 'All Posted Entries'), - ('all', 'All Entries')], - string='Target Moves', - required=True, - default='posted') - company_id = fields.Many2one(comodel_name='res.company', - string='Company', - default=_default_company, - required=True) - landscape_pdf = fields.Boolean(string='Landscape PDF') - comparison_mode = fields.Boolean( - compute="_compute_comparison_mode", - inverse="_inverse_comparison_mode") - date_range_id = fields.Many2one( - comodel_name='date.range', - string='Date Range') - date_from = fields.Date(string="From") - date_to = fields.Date(string="To") - temporary = fields.Boolean(default=False) - - @api.multi - def save_report(self): - self.ensure_one() - self.write({'temporary': False}) - action = self.env.ref('mis_builder.mis_report_instance_view_action') - res = action.read()[0] - view = self.env.ref('mis_builder.mis_report_instance_view_form') - res.update({ - 'views': [(view.id, 'form')], - 'res_id': self.id, - }) - return res - - @api.model - def _vacuum_report(self, hours=24): - clear_date = fields.Datetime.to_string( - datetime.datetime.now() - datetime.timedelta(hours=hours)) - reports = self.search([ - ('write_date', '<', clear_date), - ('temporary', '=', True), - ]) - _logger.debug('Vacuum %s Temporary MIS Builder Report', len(reports)) - return reports.unlink() - - @api.multi - def copy(self, default=None): - self.ensure_one() - default = dict(default or {}) - default['name'] = _('%s (copy)') % self.name - return super(MisReportInstance, self).copy(default) - - def _format_date(self, date): - # format date following user language - lang_model = self.env['res.lang'] - lang = lang_model._lang_get(self.env.user.lang) - date_format = lang.date_format - return datetime.datetime.strftime( - fields.Date.from_string(date), date_format) - - @api.multi - @api.depends('date_from') - def _compute_comparison_mode(self): - for instance in self: - instance.comparison_mode = bool(instance.period_ids) and\ - not bool(instance.date_from) - - @api.multi - def _inverse_comparison_mode(self): - for record in self: - if not record.comparison_mode: - if not record.date_from: - record.date_from = datetime.now() - if not record.date_to: - record.date_to = datetime.now() - record.period_ids.unlink() - record.write({'period_ids': [ - (0, 0, { - 'name': 'Default', - 'type': 'd', - }) - ]}) - else: - record.date_from = None - record.date_to = None - - @api.onchange('date_range_id') - def _onchange_date_range(self): - for record in self: - record.date_from = record.date_range_id.date_start - record.date_to = record.date_range_id.date_end - - @api.multi - def preview(self): - self.ensure_one() - view_id = self.env.ref('mis_builder.' - 'mis_report_instance_result_view_form') - return { - 'type': 'ir.actions.act_window', - 'res_model': 'mis.report.instance', - 'res_id': self.id, - 'view_mode': 'form', - 'view_type': 'form', - 'view_id': view_id.id, - 'target': 'current', - } - - @api.multi - def print_pdf(self): - self.ensure_one() - return { - 'name': 'MIS report instance QWEB PDF report', - 'model': 'mis.report.instance', - 'type': 'ir.actions.report.xml', - 'report_name': 'mis_builder.report_mis_report_instance', - 'report_type': 'qweb-pdf', - 'context': self.env.context, - } - - @api.multi - def export_xls(self): - self.ensure_one() - return { - 'name': 'MIS report instance XLSX report', - 'model': 'mis.report.instance', - 'type': 'ir.actions.report.xml', - 'report_name': 'mis.report.instance.xlsx', - 'report_type': 'xlsx', - 'context': self.env.context, - } - - @api.multi - def display_settings(self): - assert len(self.ids) <= 1 - view_id = self.env.ref('mis_builder.mis_report_instance_view_form') - return { - 'type': 'ir.actions.act_window', - 'res_model': 'mis.report.instance', - 'res_id': self.id if self.id else False, - 'view_mode': 'form', - 'view_type': 'form', - 'views': [(view_id.id, 'form')], - 'view_id': view_id.id, - 'target': 'current', - } - - @api.multi - def _compute_matrix(self): - self.ensure_one() - aep = self.report_id._prepare_aep(self.company_id) - kpi_matrix = self.report_id.prepare_kpi_matrix() - for period in self.period_ids: - if period.date_from == period.date_to: - comment = self._format_date(period.date_from) - else: - date_from = self._format_date(period.date_from) - date_to = self._format_date(period.date_to) - comment = _('from %s to %s') % (date_from, date_to) - self.report_id.declare_and_compute_period( - kpi_matrix, - period.id, - period.name, - comment, - aep, - period.date_from, - period.date_to, - self.target_move, - period.subkpi_ids, - period._get_additional_move_line_filter, - period._get_additional_query_filter) - for comparison_column in period.comparison_column_ids: - kpi_matrix.declare_comparison(period.id, comparison_column.id) - kpi_matrix.compute_comparisons() - return kpi_matrix - - @api.multi - def compute(self): - self.ensure_one() - kpi_matrix = self._compute_matrix() - return kpi_matrix.as_dict() - - @api.multi - def drilldown(self, arg): - self.ensure_one() - period_id = arg.get('period_id') - expr = arg.get('expr') - account_id = arg.get('account_id') - if period_id and expr and AEP.has_account_var(expr): - period = self.env['mis.report.instance.period'].browse(period_id) - aep = AEP(self.company_id) - aep.parse_expr(expr) - aep.done_parsing() - domain = aep.get_aml_domain_for_expr( - expr, - period.date_from, period.date_to, - self.target_move, - account_id) - domain.extend(period._get_additional_move_line_filter()) - return { - 'name': u'{} - {}'.format(expr, period.name), - 'domain': domain, - 'type': 'ir.actions.act_window', - 'res_model': 'account.move.line', - 'views': [[False, 'list'], [False, 'form']], - 'view_type': 'list', - 'view_mode': 'list', - 'target': 'current', - } - else: - return False diff --git a/mis_builder/models/mis_report_style.py b/mis_builder/models/mis_report_style.py deleted file mode 100644 index 3d63c85a..00000000 --- a/mis_builder/models/mis_report_style.py +++ /dev/null @@ -1,280 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2016 Therp BV () -# © 2016 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -from odoo import api, fields, models, _ -from odoo.exceptions import UserError - -from .accounting_none import AccountingNone -from .data_error import DataError - - -class PropertyDict(dict): - - def __getattr__(self, name): - return self.get(name) - - def copy(self): # pylint: disable=copy-wo-api-one,method-required-super - return PropertyDict(self) - - -PROPS = [ - 'color', - 'background_color', - 'font_style', - 'font_weight', - 'font_size', - 'indent_level', - 'prefix', - 'suffix', - 'dp', - 'divider', -] - -TYPE_NUM = 'num' -TYPE_PCT = 'pct' -TYPE_STR = 'str' - -CMP_DIFF = 'diff' -CMP_PCT = 'pct' -CMP_NONE = 'none' - - -class MisReportKpiStyle(models.Model): - - _name = 'mis.report.style' - - @api.constrains('indent_level') - def check_positive_val(self): - for record in self: - if record.indent_level < 0: - raise UserError(_('Indent level must be greater than ' - 'or equal to 0')) - - _font_style_selection = [ - ('normal', 'Normal'), - ('italic', 'Italic'), - ] - - _font_weight_selection = [ - ('nornal', 'Normal'), - ('bold', 'Bold'), - ] - - _font_size_selection = [ - ('medium', 'medium'), - ('xx-small', 'xx-small'), - ('x-small', 'x-small'), - ('small', 'small'), - ('large', 'large'), - ('x-large', 'x-large'), - ('xx-large', 'xx-large'), - ] - - _font_size_to_xlsx_size = { - 'medium': 11, - 'xx-small': 5, - 'x-small': 7, - 'small': 9, - 'large': 13, - 'x-large': 15, - 'xx-large': 17 - } - - # style name - # TODO enforce uniqueness - name = fields.Char(string='Style name', required=True) - - # color - color_inherit = fields.Boolean(default=True) - color = fields.Char( - string='Text color', - help='Text color in valid RGB code (from #000000 to #FFFFFF)', - default='#000000', - ) - background_color_inherit = fields.Boolean(default=True) - background_color = fields.Char( - help='Background color in valid RGB code (from #000000 to #FFFFFF)', - default='#FFFFFF', - ) - # font - font_style_inherit = fields.Boolean(default=True) - font_style = fields.Selection( - selection=_font_style_selection, - ) - font_weight_inherit = fields.Boolean(default=True) - font_weight = fields.Selection( - selection=_font_weight_selection - ) - font_size_inherit = fields.Boolean(default=True) - font_size = fields.Selection( - selection=_font_size_selection - ) - # indent - indent_level_inherit = fields.Boolean(default=True) - indent_level = fields.Integer() - # number format - prefix_inherit = fields.Boolean(default=True) - prefix = fields.Char(size=16, string='Prefix') - suffix_inherit = fields.Boolean(default=True) - suffix = fields.Char(size=16, string='Suffix') - dp_inherit = fields.Boolean(default=True) - dp = fields.Integer(string='Rounding', default=0) - divider_inherit = fields.Boolean(default=True) - divider = fields.Selection([('1e-6', _('µ')), - ('1e-3', _('m')), - ('1', _('1')), - ('1e3', _('k')), - ('1e6', _('M'))], - string='Factor', - default='1') - - @api.model - def merge(self, styles): - """ Merge several styles, giving priority to the last. - - Returns a PropertyDict of style properties. - """ - r = PropertyDict() - for style in styles: - if not style: - continue - if isinstance(style, dict): - r.update(style) - else: - for prop in PROPS: - inherit = getattr(style, prop + '_inherit', None) - if inherit is None: - value = getattr(style, prop) - if value: - r[prop] = value - elif not inherit: - value = getattr(style, prop) - r[prop] = value - return r - - @api.model - def render(self, lang, style_props, type, value): - if type == 'num': - return self.render_num(lang, value, style_props.divider, - style_props.dp, - style_props.prefix, style_props.suffix) - elif type == 'pct': - return self.render_pct(lang, value, style_props.dp) - else: - return self.render_str(lang, value) - - @api.model - def render_num(self, lang, value, - divider=1.0, dp=0, prefix=None, suffix=None, sign='-'): - # format number following user language - if value is None or value is AccountingNone: - return u'' - value = round(value / float(divider or 1), dp or 0) or 0 - r = lang.format('%%%s.%df' % (sign, dp or 0), value, grouping=True) - r = r.replace('-', u'\N{NON-BREAKING HYPHEN}') - if prefix: - r = prefix + u'\N{NO-BREAK SPACE}' + r - if suffix: - r = r + u'\N{NO-BREAK SPACE}' + suffix - return r - - @api.model - def render_pct(self, lang, value, dp=1, sign='-'): - return self.render_num(lang, value, divider=0.01, - dp=dp, suffix='%', sign=sign) - - @api.model - def render_str(self, lang, value): - if value is None or value is AccountingNone: - return u'' - return unicode(value) - - @api.model - def compare_and_render(self, lang, style_props, type, compare_method, - value, base_value, - average_value=1, average_base_value=1): - delta = AccountingNone - style_r = style_props.copy() - if isinstance(value, DataError) or isinstance(base_value, DataError): - return AccountingNone, '', style_r - if value is None: - value = AccountingNone - if base_value is None: - base_value = AccountingNone - if type == TYPE_PCT: - delta = value - base_value - if delta and round(delta, (style_props.dp or 0) + 2) != 0: - style_r.update(dict( - divider=0.01, prefix='', suffix=_('pp'))) - else: - delta = AccountingNone - elif type == TYPE_NUM: - if value and average_value: - value = value / float(average_value) - if base_value and average_base_value: - base_value = base_value / float(average_base_value) - if compare_method == CMP_DIFF: - delta = value - base_value - if delta and round(delta, style_props.dp or 0) != 0: - pass - else: - delta = AccountingNone - elif compare_method == CMP_PCT: - if base_value and round(base_value, style_props.dp or 0) != 0: - delta = (value - base_value) / abs(base_value) - if delta and round(delta, 1) != 0: - style_r.update(dict( - divider=0.01, dp=1, prefix='', suffix='%')) - else: - delta = AccountingNone - if delta is not AccountingNone: - delta_r = self.render_num( - lang, delta, - style_r.divider, style_r.dp, - style_r.prefix, style_r.suffix, - sign='+') - return delta, delta_r, style_r - else: - return AccountingNone, '', style_r - - @api.model - def to_xlsx_style(self, props, no_indent=False): - num_format = '0' - if props.dp: - num_format += '.' - num_format += '0' * props.dp - if props.prefix: - num_format = u'"{} "{}'.format(props.prefix, num_format) - if props.suffix: - num_format = u'{}" {}"'.format(num_format, props.suffix) - - xlsx_attributes = [ - ('italic', props.font_style == 'italic'), - ('bold', props.font_weight == 'bold'), - ('size', self._font_size_to_xlsx_size.get(props.font_size, 11)), - ('font_color', props.color), - ('bg_color', props.background_color), - ('num_format', num_format), - ] - if props.indent_level is not None and not no_indent: - xlsx_attributes.append( - ('indent', props.indent_level)) - return dict([a for a in xlsx_attributes - if a[1] is not None]) - - @api.model - def to_css_style(self, props, no_indent=False): - css_attributes = [ - ('font-style', props.font_style), - ('font-weight', props.font_weight), - ('font-size', props.font_size), - ('color', props.color), - ('background-color', props.background_color), - ] - if props.indent_level is not None and not no_indent: - css_attributes.append( - ('text-indent', '{}em'.format(props.indent_level))) - return '; '.join(['%s: %s' % a for a in css_attributes - if a[1] is not None]) or None diff --git a/mis_builder/models/mis_safe_eval.py b/mis_builder/models/mis_safe_eval.py deleted file mode 100644 index 180ab2f9..00000000 --- a/mis_builder/models/mis_safe_eval.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2016 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -import traceback - -from odoo.tools.safe_eval import test_expr, _SAFE_OPCODES, _BUILTINS - -from .data_error import DataError, NameDataError - - -__all__ = ['mis_safe_eval'] - - -def mis_safe_eval(expr, locals_dict): - """ Evaluate an expression using safe_eval - - Returns the evaluated value or DataError. - - Raises NameError if the evaluation depends on a variable that is not - present in local_dict. - """ - try: - c = test_expr(expr, _SAFE_OPCODES, mode='eval') - globals_dict = {'__builtins__': _BUILTINS} - val = eval(c, globals_dict, locals_dict) # pylint: disable=eval-used - except NameError: - val = NameDataError('#NAME', traceback.format_exc()) - except ZeroDivisionError: - val = DataError('#DIV/0', traceback.format_exc()) - except: - val = DataError('#ERR', traceback.format_exc()) - return val diff --git a/mis_builder/models/simple_array.py b/mis_builder/models/simple_array.py deleted file mode 100644 index b9b10b86..00000000 --- a/mis_builder/models/simple_array.py +++ /dev/null @@ -1,131 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2014-2015 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -""" A trivial immutable array that supports basic arithmetic operations. - ->>> a = SimpleArray((1.0, 2.0, 3.0)) ->>> b = SimpleArray((4.0, 5.0, 6.0)) ->>> t = (4.0, 5.0, 6.0) ->>> +a -SimpleArray((1.0, 2.0, 3.0)) ->>> -a -SimpleArray((-1.0, -2.0, -3.0)) ->>> a + b -SimpleArray((5.0, 7.0, 9.0)) ->>> b + a -SimpleArray((5.0, 7.0, 9.0)) ->>> a + t -SimpleArray((5.0, 7.0, 9.0)) ->>> t + a -SimpleArray((5.0, 7.0, 9.0)) ->>> a - b -SimpleArray((-3.0, -3.0, -3.0)) ->>> a - t -SimpleArray((-3.0, -3.0, -3.0)) ->>> t - a -SimpleArray((3.0, 3.0, 3.0)) ->>> a * b -SimpleArray((4.0, 10.0, 18.0)) ->>> b * a -SimpleArray((4.0, 10.0, 18.0)) ->>> a * t -SimpleArray((4.0, 10.0, 18.0)) ->>> t * a -SimpleArray((4.0, 10.0, 18.0)) ->>> a / b -SimpleArray((0.25, 0.4, 0.5)) ->>> b / a -SimpleArray((4.0, 2.5, 2.0)) ->>> a / t -SimpleArray((0.25, 0.4, 0.5)) ->>> t / a -SimpleArray((4.0, 2.5, 2.0)) ->>> b / 2 -SimpleArray((2.0, 2.5, 3.0)) ->>> 2 * b -SimpleArray((8.0, 10.0, 12.0)) ->>> b += 2 ; b -SimpleArray((6.0, 7.0, 8.0)) ->>> a / ((1.0, 0.0, 1.0)) -SimpleArray((1.0, DataError(), 3.0)) ->>> a / 0.0 -SimpleArray((DataError(), DataError(), DataError())) -""" - -import operator -import traceback - -from .data_error import DataError - - -__all__ = ['SimpleArray'] - - -# TODO named tuple-like behaviour, so expressions can work on subkpis - - -class SimpleArray(tuple): - - def _op(self, op, other): - def _o2(x, y): - try: - return op(x, y) - except ZeroDivisionError: - return DataError('#DIV/0', traceback.format_exc()) - except: - return DataError('#ERR', traceback.format_exc()) - - if isinstance(other, tuple): - if len(other) != len(self): - raise TypeError("tuples must have same length for %s" % op) - return SimpleArray(map(_o2, self, other)) - else: - return SimpleArray(map(lambda z: _o2(z, other), self)) - - def __add__(self, other): - return self._op(operator.add, other) - - __radd__ = __add__ - - def __pos__(self): - return SimpleArray(map(operator.pos, self)) - - def __neg__(self): - return SimpleArray(map(operator.neg, self)) - - def __sub__(self, other): - return self._op(operator.sub, other) - - def __rsub__(self, other): - return SimpleArray(other)._op(operator.sub, self) - - def __mul__(self, other): - return self._op(operator.mul, other) - - __rmul__ = __mul__ - - def __div__(self, other): - return self._op(operator.div, other) - - def __floordiv__(self, other): - return self._op(operator.floordiv, other) - - def __truediv__(self, other): - return self._op(operator.truediv, other) - - def __rdiv__(self, other): - return SimpleArray(other)._op(operator.div, self) - - def __rfloordiv__(self, other): - return SimpleArray(other)._op(operator.floordiv, self) - - def __rtruediv__(self, other): - return SimpleArray(other)._op(operator.truediv, self) - - def __repr__(self): - return "SimpleArray(%s)" % tuple.__repr__(self) - - -if __name__ == '__main__': - import doctest - doctest.testmod() diff --git a/mis_builder/report/__init__.py b/mis_builder/report/__init__.py deleted file mode 100644 index 592a2ccf..00000000 --- a/mis_builder/report/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2014-2015 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -from . import mis_report_instance_qweb -from . import mis_report_instance_xlsx diff --git a/mis_builder/report/mis_report_instance_qweb.py b/mis_builder/report/mis_report_instance_qweb.py deleted file mode 100644 index bd8d08d5..00000000 --- a/mis_builder/report/mis_report_instance_qweb.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2014-2015 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -import logging - -from odoo import api, models - -_logger = logging.getLogger(__name__) - - -class Report(models.Model): - _inherit = "report" - - @api.model - def get_pdf(self, docids, report_name, html=None, data=None): - ctx = self.env.context.copy() - if docids: - report = self._get_report_from_name(report_name) - obj = self.env[report.model].browse(docids)[0] - if hasattr(obj, 'landscape_pdf') and obj.landscape_pdf: - ctx.update({'landscape': True}) - return super(Report, self.with_context(ctx)).get_pdf( - docids, report_name, html=html, data=data) diff --git a/mis_builder/report/mis_report_instance_qweb.xml b/mis_builder/report/mis_report_instance_qweb.xml deleted file mode 100644 index 48e5bb90..00000000 --- a/mis_builder/report/mis_report_instance_qweb.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - MIS report instance QWEB PDF report - mis.report.instance - ir.actions.report.xml - mis_builder.report_mis_report_instance - qweb-pdf - - - - - - - - - - - diff --git a/mis_builder/report/mis_report_instance_xlsx.py b/mis_builder/report/mis_report_instance_xlsx.py deleted file mode 100644 index d37cafd2..00000000 --- a/mis_builder/report/mis_report_instance_xlsx.py +++ /dev/null @@ -1,142 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2014-2016 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -from collections import defaultdict -import logging - -from odoo.report import report_sxw - -from ..models.accounting_none import AccountingNone -from ..models.data_error import DataError - -_logger = logging.getLogger(__name__) - -try: - from odoo.addons.report_xlsx.report.report_xlsx import ReportXlsx -except ImportError: - _logger.debug("report_xlsx not installed, Excel export non functional") - - class ReportXlsx(object): - def __init__(self, *args, **kwargs): - pass - - -ROW_HEIGHT = 15 # xlsxwriter units -COL_WIDTH = 0.9 # xlsxwriter units -MIN_COL_WIDTH = 10 # characters -MAX_COL_WIDTH = 50 # characters - - -class MisBuilderXlsx(ReportXlsx): - - def __init__(self, name, table, rml=False, parser=False, header=True, - store=False): - super(MisBuilderXlsx, self).__init__( - name, table, rml, parser, header, store) - - def generate_xlsx_report(self, workbook, data, objects): - - # get the computed result of the report - matrix = objects._compute_matrix() - style_obj = self.env['mis.report.style'] - - # create worksheet - report_name = u'{} - {}'.format( - objects[0].name, objects[0].company_id.name) - sheet = workbook.add_worksheet(report_name[:31]) - row_pos = 0 - col_pos = 0 - # width of the labels column - label_col_width = MIN_COL_WIDTH - # {col_pos: max width in characters} - col_width = defaultdict(lambda: MIN_COL_WIDTH) - - # document title - bold = workbook.add_format({'bold': True}) - header_format = workbook.add_format({ - 'bold': True, 'align': 'center', 'bg_color': '#F0EEEE'}) - sheet.write(row_pos, 0, report_name, bold) - row_pos += 2 - - # column headers - sheet.write(row_pos, 0, '', header_format) - col_pos = 1 - for col in matrix.iter_cols(): - label = col.label - if col.description: - label += '\n' + col.description - sheet.set_row(row_pos, ROW_HEIGHT * 2) - if col.colspan > 1: - sheet.merge_range( - row_pos, col_pos, row_pos, - col_pos + col.colspan-1, - label, header_format) - else: - sheet.write(row_pos, col_pos, label, header_format) - col_width[col_pos] = max(col_width[col_pos], - len(col.label or ''), - len(col.description or '')) - col_pos += col.colspan - row_pos += 1 - - # sub column headers - sheet.write(row_pos, 0, '', header_format) - col_pos = 1 - for subcol in matrix.iter_subcols(): - label = subcol.label - if subcol.description: - label += '\n' + subcol.description - sheet.set_row(row_pos, ROW_HEIGHT * 2) - sheet.write(row_pos, col_pos, label, header_format) - col_width[col_pos] = max(col_width[col_pos], - len(subcol.label or ''), - len(subcol.description or '')) - col_pos += 1 - row_pos += 1 - - # rows - for row in matrix.iter_rows(): - row_xlsx_style = style_obj.to_xlsx_style(row.style_props) - row_format = workbook.add_format(row_xlsx_style) - col_pos = 0 - label = row.label - if row.description: - label += '\n' + row.description - sheet.set_row(row_pos, ROW_HEIGHT * 2) - sheet.write(row_pos, col_pos, label, row_format) - label_col_width = max(label_col_width, - len(row.label or ''), - len(row.description or '')) - for cell in row.iter_cells(): - col_pos += 1 - if not cell or cell.val is AccountingNone: - # TODO col/subcol format - sheet.write(row_pos, col_pos, '', row_format) - continue - cell_xlsx_style = style_obj.to_xlsx_style( - cell.style_props, no_indent=True) - cell_xlsx_style['align'] = 'right' - cell_format = workbook.add_format(cell_xlsx_style) - if isinstance(cell.val, DataError): - val = cell.val.name - # TODO display cell.val.msg as Excel comment? - elif cell.val is None or cell.val is AccountingNone: - val = '' - else: - val = cell.val / float(cell.style_props.get('divider', 1)) - sheet.write(row_pos, col_pos, val, cell_format) - col_width[col_pos] = max(col_width[col_pos], - len(cell.val_rendered or '')) - row_pos += 1 - - # adjust col widths - sheet.set_column(0, 0, min(label_col_width, MAX_COL_WIDTH) * COL_WIDTH) - data_col_width = min(MAX_COL_WIDTH, max(col_width.values())) - min_col_pos = min(col_width.keys()) - max_col_pos = max(col_width.keys()) - sheet.set_column(min_col_pos, max_col_pos, data_col_width * COL_WIDTH) - - -MisBuilderXlsx('report.mis.report.instance.xlsx', - 'mis.report.instance', parser=report_sxw.rml_parse) diff --git a/mis_builder/report/mis_report_instance_xlsx.xml b/mis_builder/report/mis_report_instance_xlsx.xml deleted file mode 100644 index 77d7c40c..00000000 --- a/mis_builder/report/mis_report_instance_xlsx.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - MIS report instance XLS report - mis.report.instance - ir.actions.report.xml - mis.report.instance.xlsx - xlsx - - - - - diff --git a/mis_builder/security/ir.model.access.csv b/mis_builder/security/ir.model.access.csv deleted file mode 100644 index 8d8b87df..00000000 --- a/mis_builder/security/ir.model.access.csv +++ /dev/null @@ -1,17 +0,0 @@ -"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -manage_mis_report_kpi,manage_mis_report_kpi,model_mis_report_kpi,account.group_account_manager,1,1,1,1 -access_mis_report_kpi,access_mis_report_kpi,model_mis_report_kpi,base.group_user,1,0,0,0 -manage_mis_report_query,manage_mis_report_query,model_mis_report_query,account.group_account_manager,1,1,1,1 -access_mis_report_query,access_mis_report_query,model_mis_report_query,base.group_user,1,0,0,0 -manage_mis_report,manage_mis_report,model_mis_report,account.group_account_manager,1,1,1,1 -access_mis_report,access_mis_report,model_mis_report,base.group_user,1,0,0,0 -manage_mis_report_instance_period,manage_mis_report_instance_period,model_mis_report_instance_period,account.group_account_manager,1,1,1,1 -access_mis_report_instance_period,access_mis_report_instance_period,model_mis_report_instance_period,base.group_user,1,0,0,0 -manage_mis_report_instance,manage_mis_report_instance,model_mis_report_instance,account.group_account_manager,1,1,1,1 -access_mis_report_instance,access_mis_report_instance,model_mis_report_instance,base.group_user,1,0,0,0 -manage_mis_report_subkpi,access_mis_report_subkpi,model_mis_report_subkpi,account.group_account_manager,1,1,1,1 -access_mis_report_subkpi,access_mis_report_subkpi,model_mis_report_subkpi,base.group_user,1,0,0,0 -manage_mis_report_kpi_expression,access_mis_report_kpi_expression,model_mis_report_kpi_expression,account.group_account_manager,1,1,1,1 -access_mis_report_kpi_expression,access_mis_report_kpi_expression,model_mis_report_kpi_expression,base.group_user,1,0,0,0 -manage_mis_report_style,access_mis_report_style,model_mis_report_style,account.group_account_manager,1,1,1,1 -access_mis_report_style,access_mis_report_style,model_mis_report_style,base.group_user,1,0,0,0 diff --git a/mis_builder/security/mis_builder_security.xml b/mis_builder/security/mis_builder_security.xml deleted file mode 100644 index e80c51d7..00000000 --- a/mis_builder/security/mis_builder_security.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - Mis Builder multi company - - - ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])] - - - - diff --git a/mis_builder/static/description/ex_dashboard.png b/mis_builder/static/description/ex_dashboard.png deleted file mode 100644 index 6c2d5b4f7039ad7a2b2b3159cef8a610ba31da6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35232 zcmdqIWmH|;wl#%?g4^3Y}|e0?hxGFJt=a|x%a!(>V5B3 ztEykMe(k;5Y;%n{));g3(fgPY%8F7*@c8gxU|>ix(&DOMU=U|uVBle}(C>FX@Y)T6 zfkjx#h<{S|$~s#|5+Qgn=KkeKD5t=nSumJztnD6}rMOEgt2Kx1j${W{QM-VdGf@$- zzA*JwS*wq@pfYq`#8x^c8)CgXGepm*ehtdf+lkwW-^wBbxlRKZ(ivW9RlZe9zbN5O zwb_hN_)Vm(Unp)K{|?cCGzs*JviSEA^1oUu0YLlOscj@e8;{4kSZae?` z)#I-G_4sYV|2HoDA1Ap9fqcAr0QheTUVPf`plvqrzA=B@hS})(S}ix^Lo&4$OTfeX z&pUH%kHq=y3Tyef9ipAb|DydF(7ssG%PjeeXyf-2eg4bCrPw+N`AKCN0ha_f84!k5 zXewkP=Tr2TH(1(>()bLEP)=@=5H5t<1vNO#G_ZUD>{+t^(`= z`r8yu0EE;vaM7ClC$4n`cpE+RK)a#@Kn~_~P-AS9hw=$})8?e#|3ILqcN-}N8E-*! zNzRU?XzZ-|tOVh$008PJEHW>s0b)WO(MH8`9}0!9--*GN*Et=gVYSDY(Ez9Myzy+_5mZ_`edr-Rzwgt((MAnarr@J`&<- z9Ra}#CCQhQhaO(^j775O(g?KMhN#>eeRXbLqnOE8Iqq3AX5>?M6Ar=~Lr~l_fO=$z zYTD%o?#PvNcTA{X3~r>(SP>QUwBeRmbAt@w=D46$!eE=qDoZd6Hnl=*w`XM+!k=W| zPR4%d`u(Qt_p-stb+;mK^!29kVaM;m*4dQe1qta4eQ@P|@`HzlF4L*R6AJ+cxtW4d z^8wEa%p~M5z}$sWHj5~r3acfxxSpvGe5;Z* z9TV_{z(65HH=>Z6IhuVE$w7GeXo=S1NXU^^-$RSmlDz5Kl=tMOac+;snf#5O`Z?3j zay|3BSI?aw-+lo{m%F;J{5@;E;ue=<5Y7SsJTFD$U5>Q92}Pn~yHXv*p||pB97^9s z&!s-FEJ~9dS4@)%91S`jIN!!(;cUr-Fs45(C3o~6d>EQK;fru+f;pf#qZa?YOv6AY zn&a$HlQIaid3@U24eHM-!j_=qVpxb2t;8l%2)>~-b#%fV_pzB~{;Hq>J;IMH=D>=< zQ%|A<1o9RlPF~*s!v4if5gLC zQM@;u6MoBfsU0;8&N@oxS&mUk2JQ%`Cg^2E4Ns`yW~+WmHHaB}1tc*q2vD&^R~0b1 zp+sCTE4h@xE%cHnVW$=3G8(s^!6iL}S6Ne*j6W2}r9-o>(-FzHNH{IIqWTb`;+~6U zmJ^&u(C)pI^*;<_z9nPnvAAA~qZ=>Jhfe%L%SxTC!PSy<$m0pmTFtd0h z!;7pD)D;;dBtRqwDupZE!0aYKv7FvZL9=3!Yo#~K?^+g{C^P68PvXf-Yo^Vk3yk|r z^I)duTI+q3&-z?ZWf17d!zUDkg(pd|{csumz6YjY0nmhh{X$7zV;3_W>}&O@H3oE5 z8}=&YH=L5U?o99pq#Axf%8PK^3DMe!dZ0WBDfx8a537lW*Vbri98!&c6w+2xI7u65 ziJKDuC#}go=b{$o(vre4lPX&f@O2jxUkdvPwPm9tf1`AXTZ~6|CM+cZEqbA`+c-kJ z>iYrBNcr<-?yT*PQi%{B+&xB4P^MM{oea9@wk25u?Cmz?K;X==uNU2yO_aFaWdSf( zYuND#X`|F2$8n~DLw*ZFLu#82e>r0k=7YvKds$7v*~UN7%CxBUnGky*17REYa?2J_NSFgeOtMAa~G`84P| zQ*kW|1tw%}iI)&8fiY3CPe!a85-q7dRH?ju-^f$qWaqFZ{Im?K$Q86yjlWHVmkCuqEl zBccK80ix^_0`K47Yi}&@NzeQMKf!Y@;c!oag{=b$$j7Z+tl$Yh6yf$0V>9~}=i0Z> zkbBwjHb>bScZUxz(;J844nCA)$Ii|8`2m8Q1bbmbAdFc|T%lOVhGG^p zd{v01Jtt(7%!RNpn_8bC^4ZE^i5)nYnSn*sVw}8I>0m%A&n>QXf2WJM&DCDU!*QSl zvZgwy>`+7@_EiSFnc)7rq3_mB@yaF>Pc$J~bM|z1)u?bVb{ih;3{Pu+xB-S?^U4}1 z+u@v*(VZW;AtmAh57kv7+SB)!r7W&1FGYYsPSpaRvp;!fR~xv`F$^muvVJQ(zp}uA zkw{R*vBw;ZrLgbe7ZVhH6X@r4L;1+5s?@@~=EIkQvpvpbWXc+PRs~0iQVIk}4f3^+wZoivqnX=YK`cCm zf(muGQ?^QT96}ehZ#lHVQa)R7`=plR3f=Q8*bCqLJ7CTX(UuBe2z6pdpg12AA{z3Y z_RI7b*%0az_?E(Gy;wIBRB2lxu`Jk&^C5LZ`RrZQ2M6udY#8B(<(Vh`apI zgu6kQK#~?hM3z!ANOKwJk%R?rv5p{vNzeG?9KRdphbB$!eqigH*?85mZQgt$t<_)KK1#RZ!i3w&i9379a0|(G&}yN%@hlGcG`rvmkG{ zF_tPa=a&YHu&gMQV_aFMNK$`p;Aiz2LZL-1olX%R{gF9)u3xEubL9?uJ^s50g1lFD zwkbnCxLP~=;K zpYnw84~x84r!nvZU3p8lncl7CzGNq>XHTqK+mW#esO2w*gpR z)t)j3HQ9Ik?$+R-ZKcGzM~-AzXwbGeALD%T+Bo{jOVL9jFil@CGqosK>&)#7f@I+R zZ7x{?-+?|?$pSei{z6eZ01f4i-B=qwnhcewTCrS{i6`0gEa~y!MvfH*b(_@Kgzuwm z-e=kuCQ6>@`vQvkSsY?f*Ls3VPECgJbG4oD><_d&#Dd?aMCf~~B{O~vUPBd`N3FrL zV^JaPs~4Bg(-*3u*-@~Av0&xpPt|OSh!pA5HVMJ^Fn`UvJ)G)c%{t2U zUx|lKT!tNYBeP~xQMJ*-_23LmYpZ9#By5&t@M{4jY`0)$u z)9(AP7A8^_Vn(fG@KDY*MRh|D0Yj4408F!$3UPf+_Yt1 z&T0hR(*oTuwWTIUcnOK88hj2|7^=;4n;=^&x|wPw5{dML8k>=y?tU1 zgwTb~w+~}Jb1{5K-WFJ)lD)7|BG^NZ zxXze39>j}2C0hqs8?JsUWEKxWx1rc#1oLz?-9=_w3al85Pb;Dg4#l7HErN7MAnxXf zZ1mukM@BmwcsR!DlG062i%%?)jAYV_9-v3IC}JU=$(y74oQ2;l(g*JL%)yd|U{p6j zv=fOnYy;^shJQPZgYY<*$Av`)13BY`gUpfjNjo?8G+$m@6Mr&G#UjdkrC?0W@j%9l z?Tn=u1Y;6ob(BEiu}h}i!b_DdJd4o>Ewj8r^ z)Lk_qUMdz0@D`ZGp)JP$t~58&QJ*6>DPG8KTy*t9QtaW)MTLR3r$sKhsBpBu-p~nR6)B25WS7QApgePqnnq>3{#QX!_7j(Ej7BPK?({kRo>=|viFJ!^DApnSkqYpbd{G^^ zkkVLl50J1)i;9fj@-R_%D5_gU%2tf>7rwq#4j!jb%|K#w_OCmnnN?BGfb-me6+IZZ zJRel=I6ZT~k~wXaMC#;BndEzGYE3fa@-|8Ewu)% z?}4&R(%a7YwG7!GQ(VgT|h*X&b!;3+$mV6CLTjL@5k z>8AMRz8chA!>j+{HozTv*G*N8K(vyDk2;){cp;oaEEm}8ApQ;z5Adiac|IanLq38P za;W8z1qj<@mD5@^7+_4-cbb!_!)a-LPMTo zoo5I_euEk-YWFXcIlKlfmwp{s1DxBI!wF@^z^_onIPw|3ZT;0IwJrG#nE8WjT|f3w z9K>^I3feW2rlT1KM=SC!Y7HIKAxL?QbjkmqR!X*DKUv#Bwi+m)fG0;Qef-|H52FjT7$u? zkKX0D7Ok*_(9CmBsGFm{b)zI0>Vt>vP*P6UXWiviP`T#~k|=FuQj=O7GS4FFgk7U1 zNswvYG*m0apd@?`!F+^19)d5p*fC32DAf)_%-L_yp}R>GW}Em*}^}565=@S~)qC(x0z1BXW$*z-h$7y^t@E=gXvq11wtv z>{maUpV@-lz&Cs~KX}Y*nwc96P9fkp&WX zi!kq0=lTklgV?j==32-nMC2T`bBOx800m`lljj6La7u^5r95>flFs8=LLDfZ7QhR8 zkT{g=KrrT!B;49-FMGJ+Q(!I)XWgfXz-5YvBMH5QJgSgCW4v6^%k6LRt|Jh@VLkHkP1I7Lc^7GzOwejS2ngkSJ33x(%ZzlP!17Pxu>vY22!zNj2)3 zGs!^>2sk-Gsx6(%f%XJmze!{b|I8M(>R*{M-VM4%>S9FoMyX8(DhvBZ#$w!rzEE~9 z??$hEvRIXpF#3x7P_uAP)w06&BbW+#fk98hOX$n9ndvi^o%)q>%r~4rYrj@)O0R`G zNa8von3=83IFT+S5stDP%C~2n5Q>>h5+Hgq_z)3xFC3y&vp#_2&S@?kp@_k&eFK8A zrQ7r5oUE=mJox>H^EkFxfMejuIG7NGLO;n328jIn7&W=wa-?`q!IPH#CA&BjMMe+d zPZlVk7_Ej@?`)fkd%n`IU+DC zfA)pEdYRLSUf(64xgxV3eP{Ob^_1y|g}fk8CSU!8M`E)@md7^m1+GIdyv&BT=9@1P zhn%((7v0INbsT|+2Q%7bPJxw{+qwJT>I2ww9VC69vmdqPQLqV(K2`O!9Nr+!!Dbtn zN_P@J#skg&Cdk)KxQZMH3u_TZZjhWdimaqHjZe6+CK#{WbdH8T5B}_9-n=eC*)Hw+ z!fa5Y8iTvo@h zpxd}#jO~6s*Eh4=D!kq%z+5UkrDT@53D_uNcvaGDh5CAgbl>4@lg?_qkP5H zyZCI}?<>6$`H#`OI)o!yd64^@`L z53EPcJ!1`RTHua@nNS_l(CWnYQ*kmi1?fq`El8qhMv3)tjr(fn^Uo-$QIzdO8@Mh) zyI#wcL8qfrUj0F~yzF;Jp#AL#M(GY(q9bzLE>dn;oGwQ>33;EZ!a@t7KsO$;#Ys~! zD&l4Am~9&@CM2Oa94656%MfU#5j<7EbcBaHeYOC_S=XZd-Nw3i2hhX@U+#Rh`?Tt6 z+Kj6i;Rk|I)_=w&mNr;AnA;@tZB;mBV|yr=cm6GZrT{Vs6Py@*1gU-QE+F_C=}7F@ zCybP>rdaE+locTrb>?;Z>kvvMFL#r`-rmb&H*l%cuD>xXQso&A;XLO-M^4aO>3KM{ z_F))jUvSWp{!|KiyH!}4#i3F;G>;^YwNb%F{kc<9UE+eFhpl~C(-5T?a2sdE|BFxn zr%zUIH!O1W3U1U6g`w|5UJ8jUrD)qylEV_!Vymh91K(oWRf$drYc08>?qn%( z=(!UGL!8qFnd=hOjau4~{<6ytcM!@`jchSAC^=sEZe%?#Npo)75o$U!mD;iy_C+x>xYCKsZQ2Ks)s6G-v1+ zJT-CV+p4NNL@koy`Pl8*pXZ8^bRNexS zJkXHq)FgPU)}pW{b$t77yx=LSFg=tnR2bxRS8S#ED{Wbqv6 z0q`)yKf`lh-z=RTLq;F3mTA#e)Oy%HwhH};O`%|>O{oz>olacYQ?Gfwf?|7SlSh5& z;1H|X2ok}V#sn5FyA}UYoP+slh3t?+qD+!?_!#&{D{oq+U~V#Yjq{RTNmj(&*4CO= z)Q&9>McZCf_O41f!}M&OrL*R(%f?`GPMs$l&ctvobCKyKPevEoU=fUXiTC3#tW|re zN~}@kkSO6;$!dg+?yLRLk=L(}eap>`&)5?TeVMj}Y-?`F=dKCoD3+2FU)LWZxSaQ2u?;)tJFa~ueI_mEKXUny{=w+S=Z zBc;KX!eN^1F^$DyUKl)gI*(%WSba^Ui6;k%w|X)iRp$~ zZt&WVY;&)~_jpTX+BCUkSd5GPO&L3SHpLCHUy-{~Iawb`$4DWYzWW1;uE+@eMhxWj z=A`)#oNie?(E-;L@5pq;f9yJr++Z(@8v+g|bdtPc1%7njyBJiMyKSqWfctH-xA^M^ zl1`_%f-F9IR`SK}XHVVl0!JOVkzSGP)a${ytc zXA}#O=D49YwykNFblSqI(P52-y*CO<+sm%Zn~#gc1D^#OBmT~oEvMUa@&gu*Myzz5 zBOY#!(1Yx-yp>l>ArEHlQ1L~$_nmS8PQk2;D964+hzMm@*5jynviIqgvSh4~rqK%9 z8w~Ugn%h3uH4d%~gUKpC4jQ8&CZ8M=i(6a&xM$=bk}VQegqIT5#VWnhb9T8H8lpq) zZ@(fH%DQ6^UKK~b3aQTSlN#ZwMU1Gzc>g{}q7ZOPc+6~#HZxoR z=Z*C{F=IX6)ABq41Suk*c)BjAH%d&*8~sg5Fnm(bJjAyzQh{U%+g0{871z!iT`4!& zQ7$!PX7VfgtY@K`{TgnmFrt*wOsx<<8$Lb7Z(kM;1 zpAhfX=~x{fG<(T}j6X%<}Ed3DJ{}p(6^7ByOXN`CL;|U?t zsDgoLs?NV$3^T6z!x3V_5VPkj>%(Xx!nVeF4O~hkehHIfZ&3`pJHTWE0GFC{b3jmI zeIwXCV4Q_e9{;Pm$O;7=@Z3NJq;1Mz@B7ulrmbcvtl04cZZ`-!VSqchJk?jDk6wNK z$W>&zI+#qY_3TU_3to+q0@CuP^Kmm zUvEp9Hxqnz^&oT9M%;E9E0qmisYWj?^hyyWJWn)@PS>EChX4^_7o7yD6A}(B&Bpa< zM>sJ5UQ>k6O@<=u|uRqvLPsa+rC9yr0$y|DldoAgCn}Nc%NB`$5G8X)9q&? z)5m-l@Spoq#630{J!MUTkucmyTP;zOTf<6m#^uKl6T`(2jR0H{?@dj6sWx9ch@;2L zAcFTT62a@a{%b(bxN#Q0r;Nj9be!*_p*}IbDc(;v`sA&3(6cmljy-;__NwLO*UtA( zJ~NFg5sF|PR_f57q(JzS6ftciOhdmuH|Cx3#=*kRDw*hy6OoE0gtgc`OYb&1U-KV8 zvo>0F8S85*W)}DAwvwdgE19%&ynP&$(prYr^kWvfZ*l2<;>aQ44|84eA5SNdtbJ2i z8>zHPWfns^XZ}Sft6}f;98ynS14+%E5~U3;g>%JG0(Ti7n1Vs_e^)mJ%*v%7kF~`rS`^g)57Vpv5X(Oa z`=1+e{>Fmg|3xbb9M%eCK=*jghx|;N^;UO%6m;BC=Brvn43g1!pzhgtPH_1*<-Bz( zj-RJ8q<6IJzzT^~#l%%} z7)(N&&VXX|021Dj!SKE8B%59vs<-yB@&48e_SoKRKym z_GPj0|1@ut+c~ti5?P({4o-kq1K^dNX)^e@)^y{3;Ws!WzTNhvVc_EBGdnMnbkB44 zXmym4OUm2r!?R@9e>0Si5LTOYQBl{46bL$`n2J(5^VohRH=W((+76~5I!;ajPub!G zX0Xi}$!U^}5QeaxEPsTK<;t&Qo)KhhgGCNQlJx#iPGjnYynR(hrUG!~%fAYSJd(qL z9c2k%tZ!!^=UE7OepZYQos%A=m1v-VdA4d2xez)fU=o*$!5U6`{6-CwD%{un&bNVT zAVV4aYIxh&P|yL-0@UjL7F{Tvq#lTSQ6;63OLBbLV(_s`%I;^AkyHqg#rSO-KCWBB z2889Yb2nCCWh+#pI!S9Lf%EqT|Ais}^MX#_2hz~Y^3AN8{QN>_=-+re1jn_XS0hbB zLIsu{y;}3@d@9DW5zaiNN05VRpO`>rGlFjRVwBKXe;$6`DvfI{%G#Hs!{LBGqwF ztuA(H$W`9&T^f#6J!P|G+r?;_a=al>PU7L+UfxoTsAmiTHB3Oo3i>X{axZ$Iq%qE@ zsT{%dDQf-_ie>7wKb#IHOqZ~}A=(1rx@xFh26HsU7}hY31m70QLx-I6`;!Mj>*zY} z9pn)-It zjpnE!?@hZ$ew^n=a!RTXr<>k!7%BO z=*#wg<^9aZwJHnXU2HE2G>7#vjZ0E571wnDyH9PKL6{h|4NLY#VXeh!6|U5D1Vv2* zRKMq7goT!HyP7}Ue6W6-m|goWJ_Jdua4il+qX7$|o3Ru5$2h{4!g;4%5W)`6N)FAC z6M#P!OB_dMPu-ZBfsv?Y)aSc-Q4Gzp41hb7lAcZ%Az&Y!=fDGt|3*fni)dxwez(WD z`He2EB6OM4&@w>A6~15xoYej4{M!QKf-)pw(XzXOEt?ol26EDkkkW_#s_7b7W(n4D z2&*TyB+tfD*cPA791e0RlEC7{7}^-P?XxG-UN0^7=f35V^>iWEd$$&Ik?UH->Jal$ zCmTY*p%LdG2hR+y(OmH6ePp^FR{^jAi!27v_>$$p&*KMD?vR;&h8Dig+b)$K?OAqb>=g)%bL}3Y*!(pX`L>-1Qc0NgowYV3q6lQb* z8uX4N_%+q$5b1?so1i&zmYInCK|iYnV1a6>0IX>*r~lXrc2=Dg3&59z4nH%&S|~aT zD>tL97f89U<{6=>V9zkP)pzaq36bHD4mpjwNWAzHhi@5C!GYM6-LSZ^4ix-e$6eCr z({l-$Xal8wXhZ78gP+dMVD|c*Z6901G+JAXm2FYQf;SN+95gT!*O&BWV&R@1Qq~`p z<;GY_TdYpCi_Yx7>2)H`v#gvbv(=)+Q1VZev^PQV;}ao3rox)q3j%&DqYQA^>I3lN zAsG5>jhETxKsW6E!~SdcA9Yz&!CcHOK{)F7U9=`SQj<}nEJFT`jc6tHwh6TvY$>m( z-iY6dk$l<&Laje|O7s!oFrjPR(SX}^t<>j*?U-8we#sq&N?8e)D~BJ}XWzu$6B zg_qQWD%;b&Kj-qAiB$g9-|*KK@k?!Q$=T-Iht2?77MYj4SSOI;kPw!lycGg!x-$5u zAzXDEp#fwfh`xqYxDU><8t22q)1Z#ZuZm1B(;1^AI3-yHQX~k zc-jPPV(u$=10Ek4$J!9LnQWf(RDKQ@7*uB*GYj>HrV#NXHgZlSFBc6)X-gfJUO zAhpKlztK}2PYXGS10>K~+`$o>vv@Q%5M58!Y-6cl_*f$u<}8NB*053n^i#I(iaGl% z;QNm3hC~eDDoWLyn)q4CbMaD4e3CYKA9>0`ckyyVUsZPk@uwt4d03EhRW&V6%hn?1 z;&BA+&q_9^^J*LH9AGW+1_iB8X>v*q)tLC=oQx-tQ?FOY2KEw!wDb*&N@KX@2jmijmsWLM+_)n3oY_X>d+ett1J|hWpGy1>h};-+_#M;n7Q`toxEde79#?q z4136*I!uC4d)3br-@7ns=&C<6a9NnG$j4`OT*_Lc4f?QZaCZoJ1=|pe>W$u% z@c|J%HkMQ0Jc)>;JHqMoVA-Gzk}qY0)d_Q;IhFep%aSWGzU}fF{^K8KV~k!t&-Q5= zfM5KQfIBV{j=h^ zZ6lqeICCvpySF{u!-qVOm40pXJnhYUW4y(o6TDi0w?fuCeWaAs#VV-Eq+2a(ZD`I` zY&!i-*TGvy)(Lm0E#Q?3VXiai(wdP5YZa$MlMt83hXoroPcR|_o7%uCcho;H68$z6 zSnyQB@A5)gsl&kFmj)Xi(@d%R?HkHElH%hHVU6CvcEYy+U-qfBbrfs$z~uzAWtkFp zX&nBrgj!TpgxLcASkl2*?gE4mC(LTMC$U|iJr9c>%E!ejB?V7|aUj}y8H8oc?+6d8 zvQ-uK^;ppg5(+@A(&YTG4sr^kv0Iy8{Ma;7$5-5+@yN?ZCVsLqdW~(mrdWE2)N2^% zF8K}K;MFjI7#X+_gz&TA@d{BtOB{h^^LAJVP7X=5WuMJEsDXX&RzzyD&s}L5`~;7I z7!Fxd_>r^w_BWc^(5i?GeJ4t%iO9qulbSJXQ9?8AcD`Wev_y8-U$Akze+epD(V2`$ z6LJkVDQely)2BE)J(9{E7c0+9bGQGV+IskFfA!K~YOqJP2;$tD|Ss>p+Mph<9CVQ|PBZfEELb{YI`+ELur%i)9SO zh@KHr7isjeRSpYA(h$hMYFtJm&bPZNmLp12j^8r!#Z1&8v=#dd$zW=waw<&VFuJNZBnq2+lttwbA$H5Hr=7c@T*oj4)osVi z6COTuEJ0R12&z?tSwIMGH>^Wjp@>&aeuh{obs%R! zWecI;NYE@>ZGq-#ziCPwrYm?w23a#Z{61le?M>MrI|m?~wB zs+AI2u0h1>7iTaP4W>{|W1k2jyfXvVb*&t(e7!_$@A)uP^nf$7d1BzG5 zorU9l3A3zmUQ@cpj_AU*Z@UBfP?d%QKs3q@%w3Lb$%(+GSruhh#2b2BlQ4Fig*?+? zzq|L%bP#K>3q<;bKGL?rbkIRv$qLBYSS*4B9h#?R&D=+@1D88xfc>+2Ql`7 zyV23SUE!VE6PqT%^(GHFV1cFZT{&pnzOKXNj2;-8V!aRys)QzLq=c4%7{>VfB+56; zzXX>5hlhFoTMl7pXz0C90rkC6LFa9iU0l$v>HwH0tFUIH*FJWX>L;uM%F2aZ$T!ah4&(G*e|}1rM;vzw<1uXqvi) z`*(u>U41Wym^1Z_9tiW^Xs$#N%8?FYE(>1&F6y-wqo{>2(xGN$PZzv}RMqjx6S6D| zpKxT@yKjd)f8Yb_PlLEJA>p}Y*EVSY3RNu>Kiw&dZPCVj_xGq*Y#y~Z$SPF3dB&Q; z=c)CzaL5Me+VcZig1fyo7}hm?sDofEEJjY2$I0$x<+!&MO+tG8ZB)O%EB=obnHZPI zy+rMb^;E_+f3Z4MwMJlxbK7ZxqU?I{)(|-*PFp4XIPVQZf|}I%nY28iRfAue zCBd@cVaHDxo~T%oZ6sso>p2Bxue z&RnxOepChf84pdB2y(GOV$g*f@-um)C;k$5W0cdV9!3mnJu06C^ z?qAT3Z7NOn;xyr;g|eKv`ZzZS)N!R1MhBUsXzd0;{ykeeC7$=jb0m>m)wF>H3^2M% zkRFS1bZ_csk35Y{Zr^F9TCBPd;*cY(D8FsQ7!OBAE{J|_`7qI9u=OAh@q9MLT{=x+v?E`374=%T!mRwzw-u)Zn_o`-p{`7gNM8O9vk_oVF|_?29>?w5Dp^BU1& zObVuxv?4I(0jGA-5@!+k+APsQ8gh4|_eEJ~^d`_JLCPVdO7Nx@oX^lhiaiWkKynMDl>uo72}LVf7=evb?VYaXYD zSK$q#v;-;%QQ9;t=1a4OOji{+X=s2~N-4v(fS2Q!d9Q+bGp6=lE1Eo=leHlE9~NcI zY8a*t#BX`e<}-`TlA#b+U+0y);lg{_*t=_ozV~lQ+mgl*4PapTrDb>zg$VNNk2q$m zNoLXLTYL8eB1Ftf64=BpTWr807v#az%%`)=`=IVsp#`h5zw?uDs|_uXGHcQ~Q&lsO z^D9v@*0tn0l%GY|p&;R7SgDogptWcH0T&-XR$@uCP^+xg!SHACrLk3l8kXbRmbRXC zpDFXXCGEv^hGZ}!#=T|Tu;jQ4d#RC|+kA!+a;vfUzx*ka)}d+IJ|yeDGHe(WsL*qY zy1E8@BaLU{{v>YmSQeTDSd|kBzE4vuePTSUxrxP!GWjb7D+5-v!&?XSTl%*y93>0* zF|d+bMjFsKzjn8Qm%lO~kUzipF zL%z}T<{dQH&THQp7&J1mNOd0Oe2N52TmnQ?0VFj-*p?7`cuxX=$JS?xk_)WT1hOUt z&{9jWVPY%{QTr0>uY{NvKxY1P zrGmM;Ht`GLl0lq*2a%Lr#kL;j-|=P>VcwTUOp8;gMTx^Ezkj=Y@+**@ftel-dB=-8 ze#0za#S>Mi5~?s1^RQvNyL&mPR^%$s;wpl{T9jXvO*y_$)bBtB(URXNVmV*h)W8Wz zLBw{RLc%f>nZhX!CV_iBaW}{ZV#&m8sudZX%7BN zI{j^?yp*Rnx4|ajz3?=$f;+#B$-+8Xm$s*?yGyLUxg74g1Ib6%+waT5h>p@>r*5_L zivJV{ClzXT2p@OTD7Hv9@4Bm5X#>o_YsYKT_v{t_RUrHwjEghyqkXcze)efBsXb&Q zP>%(UbmOVj8y`31-|@kKb5}zJX1WsayT|0m#*4b1vRP7=={TlE($^yNxnUfRl1iE} zJ26vJidOp5nqx>@-ggu{9IX0eqI$au}XaQla zX2m;xFtiss<*m5W^Z%=N(k=NGYRIY8sHcsd0c8}n)w!J?Dnwx)luq(*{Op|Y0({5M zCGQlTc%H%3eqNPE)Q&yVZ4+m{lEWd@MyRt7l+EcZir5T!aVy-nSvajTVxU-vx*D=< zrYtINeM(Sdt20L=lB#!?00h!Zot(0sO#}lb6@g3BTtW2}7(~NlIKY!(of*wQOm|m< zL{z%Mk-FSsas9eTRl9(|!rqYcxCnoGO+NteH2ejRU)jJqlNYPa*R!Q%^$%n=si2D! zh;VK@>{_aEQ{(PvAD8)LsaIS#ex$+$X$^A6G(7N5DEa3FFT8)vw?9UE5)B0xA||sV zXfn~A_3_j^I5z{SPRo`eo?nxNe`nR91g4aGzl ziS@%WXLn?neYd#q4`9U(o4VOhl=?Kz%1}}ffj6PA9TrRZFi-D>vl_ZL^arw*FYRlm zZtSmp``Zle-gh%h=2);v#D>}*5F7E`mQrv(!hQVw_xW*Iwtq=O|KE1|QmR{#kdSmO zC;oMW9d7I|!K#_=UEacQr}|5->Ogz{^Y?*piT~M#)OXyEFLrYde;c;nQ9VOO(FALL zPl!9G#e42gAoalg{lXVFqe8gvcg~~UYk4IWQ3y0CPbmBQS@Y}Y=9TI9=9Kus>D4L! z#=IL?3ap}6HucrYDJE`tBgBsE_k*NgoP{to8+p^)%2W(M_PyIwtWH2Qdp|?@PeH&_ zavnl1+`V+H!+~NCerG^J9!EA5yu7mGO=1yIBT#C6TjXwxk#Uk!7A_ec#2rykO2b3L}}&1txTXk3=GO9X6I4< z8HlDpbsa@#%w2-|7e=jB%i;ML{kM9Qzk;pJxpQb^_emoN`|Mg#(==o!9+}MABYY|x zAx4nQ>;ON>zGC+wT)O!mwEQw7VwdsWTGbOs4CKCzGOCL5zKKb_+HFSJn$u6>ud_sH zoO>>$|M|`qk>PfmX+w2*Ts0Hk0=GooP>bB2>K&_0ywhya-^R0H&uj*c*1%%VOG8|F zFx*ox3$GXEvBW(LT%bL4{%~%rMA&j;gUjE*D;>FQ*559dXDOtfZ85LIz{J2^D)&Lq z{mO{-GZMNUJmj*Z;M|JH5IPN%Al68Q&RX30d$dyzcVmXHwfLQX0bG^6ZRIG){iBZH z<-m3Vfg?Dv{}6*t2BZH|3<65y+&G59hWsyW>6;^jTB*gZHX}mQ0Ye`F4Xlz6CP5TeLYYGu6vO!H>nzds8TO&J8qh#HRTu((@46;tc-y zFMI9)WLhvsX~;yGAFK_~*pa+v0+2RoJG>MMy%w0+W!ltHi={L-E^Ld1yLVmExqL_+Bud6b#@YVG*Xlx z`yy)uT@RKK^Z({S2+JuANS{9whm*N(`5Pn?h5QAQ2TMq#bGs-|!E65l$!OTCO;hA^ z7D6b^fjR@cN~wBfBN~1NebacD6d9+=^4PvCvI$h4V*F8g~;OUVY|- z-ObF1_BjA|%W9o>?(o`ps=ViZ#bfsg*+^;fn;=u2z!-&S=fCxyX6ktsTn^bK;bqF6 zlt1#qF2dO-nOABFcs=+Y?iHv55mkDw$M{Q+-a{r(&a4_>q6a zpGXQ(E%vOJ<2)O|==N3&E4$U8$SngaVUr-kGqKd`Pjt9vl_lA0F)Oq%iX3|k8y4Tf zw=*y=DJo{hk%Dv~IZ#&T30caaYf}&9LEb;3p%50preVb-2u$>WvNGW4$kU5V>%5(xk#S0-Fw)GTVwBp z)&ez7*AKZ|mbj(b7;G05!QRjq%fu^e?|!8Mrf2P_sU(mHeMz`0aPjgn!8&nSaS2 zE49M`iqYf<4a=d~@)pZ3bGvoDE z)kQ<@T+*7G4_1w2OCxzt&o0D1`=R6Ojs73ay>(O^?Y8b4LXhAI?g5fOaMu6{?rwqL zL4reYYX}a(gS)#WK;!Q24vo88<9&*JYkhm|z3;kv+M zHnA(R)c;B0QwG>dYfIGq6pafI&Huk^m?(W^iIjW@n3Rfq2Kz;hdr8 z>HX&7p)O0aFM%`9;l#@pJn7o zIFh9r74!gZOyYKDX zOX%xdpVBW$edWzR7EmC#mT=qHTWt+w9-9A}d;!~l zufih+zYR;VO_{iux#iuI$8(<1xdyLk_~x!`-!=p#Rz0>N1;{Ld{N#FG3uT%eQz0F83rPV*e+kh|1E@P- zefqtbzQ(<}nPb*x^br=2Iu?ig6lZ}Y@Jp`7VjhfWDaOzGcXf%`tIz09A~D-Fz}-hZ z&*9vVB<;rl+G*?l8a9}FdR6omzr{tK3nc}m%zm&Gh98Kj*F!;XndS6mxQ>xtpyfoE z8dLhR|MlY}nc%6@2BmV|#~!YyWt`-fBvUsG=^PYXvO?0ou^SD@Ow8V{99rPb&!hb` zmQSOIIl@|tR^~=KANzaxz4)B}8doUwGN_{2H&m7PT4-ciq%a1kaA@ zKRtv7`eo+mroE&>)c6}2V2a&*jFJsL8Y%N6qccv#_T#hn$*VAkDi>Jpyv3()_XVHx zHsf4hMs&02zZ2d#|DG`@n&Ux$bSZ!lH|491%SR=zElUX$dB7Lo`){r}sXtK-@y>HN zDTha2d*YFInZl$7m=SRtlf_mB(mPFEbFXNr69ZR+XYg<)NZK`NLna<=>5k!x#N02@ zQB7^{)!LPylYa9%lNiIS4Ham9+uZz2B+ae=VMP-H{#CiNpoq&Is%Mqak z$96dbi^NO7)A*BI`c1UCI)6k!K)~}iwfAEp@n!s|X#>D+s{+&- z^{&j@M}*Cl>i;Riw%*#>UBrwt_3C!yxk}>XxB77KO3*3UmBY2^PWjp#BtWc9OG&mq_eguM!mR5AwVyPj8zUc6UR6owenu_nBn>y7)wMq zeQ!=1SaE2~Esvp3`T9XdR``$+Ny<_zKWhf;liwWRMq<)@K#r4ds~GWU_66>-Y1OTL{6A&a>)uU($29-)~1D3qd2LYRNd9Nk;Le*)6Z1 z((<2wLlM<9tR1fe0IoVT(!2J1g1E6rf#_5Zn|k<>oUhB6+RejL!6Q2E_hRxQ(?2lp zsl_v9m%dXLeO@yW`83Eac9|?v#)R4F@6sp@=PXPVFQaMeUg|AMw^Ac-AtRy@zi%Bt zT|&Tc7LdV3CMH`m?KZA$mAw z%cq%~)Y=;NJ=3ZtFO8h_^f6qtsdj2TNDH(3bq+PTat=%~GxmPWS==CuLZk-MHkZPJx^Ol9SPhbGt0Mj=#2L0S9;+BA06zj&~jz!JGvG)<_&=fOjQT*<*{oD zeh70B_>Dt|m0XvtV~T+)qteb&B-a_wCaYZY&k>)w7TL7mipaT8p@dSP)f0^hybvpN zIr$nHaFj|fz8KWb?29<^%HNzjfd?8G9cb0?PVnhS3r_tCMQQX8mK-uTvZ<0hhi;1Sst>Z8F`Sme<1TYk)Fe4@6YHxjUh)G%^r>PN-&3z>knaD}1Z zyGid?$@bD;?+G?e@-!49GK6BLsqqy39W#^YkX?{6m4>ykH&j(oqyzVLHkF7i^LdOz z2s@dHT%TyAJXdZ+QamL3NW+0G8WU4~VpeF*v@CY!t$ds$r9g#bN8Zo8GQiYM`0_mx zx%gzn=f%WF?Hk3hN#B08wdeZO?K6w|3s<`G-%O|G#s}{vKIQfsU2I_FM|{$JS;8|- zHQa=){RT+24+m)13qfCNVni`l7Nvvd%5xg=4||1h3dKkEF*S>0vMBcBAX2T z%o+5W{%jM>>HN*`*86+8|E(sLYC^+SvZK=!qhrUMbv{a9j2=A%Y5;tm-fi_7dR zf*Hm+e%4C`$Oy}1PZQ}Y$hH<$`hCja6Lw1;*NOml`mr5KelfpUk?$AJMIKPDxPLaZ z+>(mt-0{LCtn){5@>3iH?R=ZA%k1FUW9e6!uQNtN4&0HWEAVqeNCVt6>blZD*_9Kv z>XRHHo+i;N++wulRi&%!GoR0W-cIHxK*eD)RgzT~KXm}Q&5q8YqNc?RKT-)10EC$S zlYhm8-S~5U`g$q-J*Mst&6uKHxIu0^rdun>-;CJbc=JHfm_Ca4!gRxd43Q+DL>I%wNfLel4-X0tug3b{X5wy@((pPS1+aSz$8Trk|J zMCsaM!J}xMIKtK+RtctZ;2bE(2Hu+f8+{7)^UdAQWkvbSa-BLdp9tymT$Q+2`x?ck zm*y_Cdpf`UPV-}lPw6zY1s`wk#{S?&YB5?Q%HQ$De97!co!rXLK3}`DHuM@zIuzFT zaM117GK6MV;=H3aQaXDM$V{3A01~H9DoZXyD$2b~37uF1g%v1%C$nsG)1TWX5_e;|(5CDke$D1M<~ zCq2;iY5V-Jz;(sk|LCUS!|>@1_j;iAwEAu;3Ba!x4d!3(?!UbbtQJu&tBl&1U z;}n1Gc+|X`cIvGWT0!kb(yCFV6Z|}{tphAhG`vq2SQ^RX)D*;iIcmWq>3aiKU2E+Jg2!eCvVz)KC84C(oPM z$&?SrZ|avF-GO7K1~v}E*)nKH}H3ZZs%7#fr>eXM5qYin8X^ZUxE#d+DuP&g|!?9h^tAFwX(c;vb#bAXHWZL+n~OnN`gzv z;N~K|*5zs4o!HFaJ1NV--jA<}s-N+Qoq+$t)rEM!E^7%Q2kIZZ^UQ8iA^)tW2zCiA zPqemh%0Web9VM;UWe(-Ci zZkZ(Q*9Y8c>EY*P$x#QsqF;5^uot1N(J817^5hLYA4J7D?BNGZ1$cbV3^22#WPKds z;4$VGjCn=uJ^mA)A9skoraicgX_Dn=QuixWN&u{Ji*6HdT;yB%md&1mOYHu`O(yPp z{byp@Gmsg&o9Dt+Z%{A$q$(Iz5KH|15vtDFpEDNh9c7awjRTTsQ znElNNEajiW;kf2p?<9Vce>bXoZqyQ9E`?;dbXg-CJr{gl(FA{2xyoU%5f=z@Hy zBIue#ykfB}x>@nG*i2an6~Je-QP6gFzAYu}3kGEz5jWA(pH18y@DKAdhf77>(7*{n?(!x=y`gSc@zViKUr_Q?q`!P{rzpCQ98#kI z!cChLiBytE@L?#3oU-onpJ4c~)lmCsYvW8-{^ogsHwpcBefnM%%^-s!60tEwm4%Qd z{})%UE3za?QBrH#S!K{Z4lAngG|v3WLa651k^H{3yp~TCh58o#I!EkH4-#-Iho>)| zUDn+Fwsto8_6ZP;D&|6&?88~&zPluD2t?=^BOzDv?`rvjgSEDo@@pVu% zl>r)SNon(t-@sIl+0^(!si-6DExqU*oXvf6 z7|?!v#q5rAYbL7MU(&U*dOavQ`Ijtwl3FS@@dwGSh&GBpw$E%JW?N4nZ!`VIP=~gW z&&Wx=c0Ec3o5UxxqB2**dAvGa;OmWx#|G<`2w-Y-LfVaDJB!*U?7sc03gjyR zYL~nzqR3JlXDsD+k)MsF!h4Ms=h>71|8X&W(KsDK=zyXkcVVc^_Sqb1D7Q*-7>}y@ zzgU?uniRfmb~DP4PsCm2+ZQA41SdCe-_F|vdohPqvT@;oYrANdLF!6}!ZtrLGZT1- z!dHCrL@bOeU6&P@NXPX4V+C4)O<@`OBm4V?sV>=S1KIi=(FHf6yaQEwng3#;xN`%( zkEbopr+gDV>R`H;cVubq4~|2F3^;Q#`vZvomGu>gTJ(C=T7kBfxc<@2P%yXJLR`@m zd1+-O0SK58?zm#xjlZsB=NqN#qfusi?qu?N2FWCyU2ET`ssMO5M?N(l|EjUoT*8@Y z6Zian$cMY|TY3wD+TpkWfE}Bdcj|o(kF(qJb2N=qUVPTO<6Gp2IhP?+_zo#Y_RVO> z7r-V|p=^GjnJen+RO|9Rc;on`(usjbtg05L>dm03qiVWHlVE}|D(hL%N{^QItutkv z?bFj8^-%rDb{m&PLEo3x@7xUl2)7N~NaWCoNao&67^{C5)v!nqkwhMFGomC2Eyb$K zRI|q+ict4J&e$}rDZHcspUcShr+_hy3E%QHmf!`vj!a6%-Huk@sq3%O>OFaUJzsHs$&N$QZ_cXO%UW)hp>lN&yGi&uXBorr|4 zX19Pk)0`H8M>a3=_p%2Ey@PJ&P7WgWy#Mz^LygJ8;zt_RqrEP2Y`C_Zpv zGcjgMSL)`}2yopIiX)P0(CBGhg#H>cA7$|WV$A%1vjG3rTmKYoj2S|=S65d+%=OX# zlhPB*Ix&`SQ!n244o+cfM8`vr}1udf#Fa5;3WUh zhm%L0Kd;z081O}7a(dYE)u%mJ;408}?1L-=os5a2YKw>_{lt2NCD$xxlrdGvrG&o) z{iV#9*aU)64E9ZVc7-wQRT3*~!Wbs`k%6vHBA@s&W>I?oKtNU|!RAk3w2P6mVTnFJ zs%v6JUZ2nRDGd60RA4o{sIYS4YIm_i#-`{&MYeO|Q7~g;oWUqIzD5pn$Y^T9&Z6KL zvy)Oh=YB5E*YN(ZYx9WK$jI)eYbKnRW^uf_|GD#1wdP=nBkH%ox(qg0>{M zlGym^6foijm}V1Rl674TQO30LhYS{|oxDKZmQ7MzX^bsewVKn1_ue09vkayDt7q9o8bhaZNE7_4 z_y6e&aTNY|xC!%1ldv1vv8x`4Mol|AgB`%zLAExp8nww3%9 zn5p}p^WAQiMG<_-X=Q4S z@@cTscD}Y8-Y6Q)6q1s6U&dnmBz$U9pEx?jhXT?_75$TmHI|uL(+U|D>y@$N2vSgNd~N27{q#(+}ZB&e+9Pz*9Omy3CnT$xB*VxRfK_%__sHsXj9zXnGBuzHf@$-_GSV1*MXfN_Rf@Md} z$=Zyr8%hs@xS=dBGh^5E=kP`)D&D@axU?7V)JV*jT9=|2fDt9y zMFCRQUd`rAyKc$~DvQAuKJI7}L9Q&Ja(mAwKGE7{&M{%&C@H#Sijj;2Q>|`#|T z0AZd%CRsGS&q<+5E`*ppq{0NdB;8?s!sU54qw@>MCc;dt;kfim_G@_AoOo-;`q$v} zna$#g+n>4v#xGC|!S4+6O0aKDkDQSWeE4q#`j6j!>U7Ozce82Nm_sQ7x&t|4K!iX_ zQ<&F4U0?D`qFfm_L0KT;^&}%X${$t&{r0#<8X>C$@U|J;{_?gZS2Y3D$k)-=Cqm?8 zZ?cH*mzoief});cSkG7p$|%PS5Ia@6gwxz({Hb-SuS#US7pbh_HPj^MEDGKEQ21+3 z@h5hzhE!?oA*NCKuR1KLGkQb9LU^)3%W$Dn$Bbd7uveJ)AqYyI-CnD~lr^H|hh*Rk z3pqb+ag^0F+vDwG z@!Ogg*9IPalL*YqcB?8LYy%}Rkv{!K_1!U12rJ&Q&^ICX<2$=$4ACcJ z1I^qR8a1_jdmLP7W|{so0ZCs3wNq_)J1S!im9uIiyHQDf$*+jq<9@&ppkf35pGo`# z(xbGF<^7x=f#7_z7x5sHT&p$h$56YGM*j^eDa*=?&3Mbp(B=Q?t}A~@T<4pQ0w};7 zKSUiFsc)QX(qlyDzw;E>HBa0KC~_!j@M6Dz{(*j;Su&5BHjI?!^wcxEjbvQmv-yOW zpy+qVny`ktS7kg_I!8h$mXrtF)3r5Zzu_!fXh3Ea)^DXdgY0j3g;?%u6sBXc-@;_7 z#IWu4xw>-84NP@$V+1w_ei8X6yMJ**9GP@{xwgs|9`aRyNkAGOgNZ=pH01gvhJK+V zwE#P)Ql~kd>PGeFlTqT=oDZcBPgsHO9#~9Gz_1FjDN3{Q0>3qC?NgJR1!aUe0Cm4& zIyiVkF61`QoxKT8Z)coFzGh*iZ`}_p=^GW18x$*0rPK>%4w|&|H+^GJU;2`b?Y(t< zsfY_p+17voFgB;6&DE4ORm5jLaBPaC*!g9wQTz1B@Zy8DnX+hG*GK`r*EC!`aZ4Vs}xFHWhwB5E5*yQfo$UxorgC#dN<5T66jAO zhS0?D zO7v?#Z+hUMCl3KI^qN4EYgxQ}52TfGO$FLm(MC>uUK7l&r=6&b9+F>xs|Ms!ztiLH z^2r-;&$DbzfZ3-IrbnJts<}`%E~xHBR;y|2pjU(02idhEyAoO6;I(%O*AnsmhAY&; zbZ-@su?9cIKD{@iYBxvEte+{ro+5auO818frshXZ+zh@QHiVaWZ@)2ZBj&Na@nqjM7+G?hX!_eU?ekr<|$8 zPWuae%5-o28?oak?wPMPZE0Ixi+wY4TwYx?Q?X>u9v=saoyT4`c-CGQaXWu5xV<|8 z#P1-zwQ${XFQeATA^-M4z_1>CSyhv_(wN@tOEK^~QZLD(%Wc34`c6bjQ%`EVk@Ffu zed^9JACIhQZ(4~;)E$3*8M%K>9g*K#`04iSO#h{FiAG1gCl|LOdR#H95-ALu)uRAC zGgae0u(oI3?puq7!Bcl-B39pHSr{b@ltYmkB}O?t?wJTxZf`3*;?UJn#C*3r?Q0QZ zE|ndmZVNV~l}bj1saC6susCKA^xD1Pyqf}olt zEwI0}qbQvFjGR>ZwA5!%BIbx7>oOy+7Qx5+phveHqS&rdLt1z0NWxv{m(}t*jLdD> z-Ze7u8#1ARaL$xgx({l%JO&N1C;y zOjxo7fshVBoEVCbAZ=$tJ5@t$3;zP~2M7KokgMxn3jM-A7ob8zE0-y(8EmcT!lRN^ zT}!5o>-c3)*oNHtL-WrdlxsN!gAASO+ouM^N}9nx_!;u&*2Eu5KYt0flz8NM)GXu? z-A6X!OK)%(wbA+QP}xRi$DZW%dJCnHFAnBmVex_HGq)N5408cxFGF*{Vl5dpXyetU zcWXqG2s%wabM3RA^S0pDBj&B+?EbQH zjS~8G@LPAvvnZNM)HxtSYG&Io_(sTt>Sn#r_S!LMo=(9~cSG3w{5qeWP`I%OJbWa} z|C}OtzDAsU=N$bxLpv9oUL$r#KkEb6Nt(CiDBt^Wd}lU~kr35vM3LFLJb9e0d9L&L za>mM=<%bNBqU$=Lid?gUG1H9_di+<1f~q#p8D6IvBU6UX{NMB!3=@6qWJzqHek_=& zBb0f+gzxAD?1L|u|*@;#6+Az#(h2H{_t;u#SiG$X1JICnyiRB zz1b^+>`Ml^ffpU;3vbpMWCV&B+<;RH)_qPqSN6H~yEW)`{_4=FIYf`y`8PE+#ryLS zVQ0wgQozOD79QW0(WzG9J`m8LVR^kyc2_m6qb#%uY}wya#6_x>NV4W(}j^cJW9|SC@S0ddO+$8P`z%I!ODk|7`pEi)oyBz{Ur=trRC(S-$n= zH42i>vm%lSPOF7L$lWGa-`#3MgM&^S?cToi> zbIlGS(>ZeC;eR*@`b}`%3dOpU#nLRnLm>O=jwf^)0mZq$pVWdh+;+PwsPi! zbCv#Pr*2~)>^cpmCKP%{)eOt!YLwi0%Y_|jPLl^(dbotNYFpRRF$&F0HuasES0qlE zvoPVi#YjeF4~&0!jkLhCgf#!ma<&8;fhknb;s!LJWtTC`;4mLW*7Ix z`bCX&{qyE)S*#>3>n@`gyD`J{vhJ7WWlYFH~Hy&-F}za8Izu7 z*nkrTv@#qd`Wk~?RNcY7iM~viA1!DK+GC)(z{S!A&_fXvmXYw@ZTjG%&Thf_YcoF z=|EIzfHpc8?d}SIDt-a`f@XF^lxKL%O-@zzm)ZSByKY*y^MXA<15Q$o(1W1so6O*~ zbvBrnlh!Yh^Z_--<)o&yuDcd8o+p8F1OAphJv|CSZtG85ob>1Yf6wgQIsMSV$+#~S z&4n@?ebis!&2br$f^0dycw5%vFu4j}w&@1RPjtMl?>TccFd%_i%>IBH@#jyJJ9%7u zvY2-yZ#sCubiZ38?{2;X!Rs7_;}d$49^OOTj$0##SN3!dyKe<<;ViCI1;bK~4bH?< zg@7y6kIl!nD9v%;VtcO3(nNupc6}~x+sr!#;r;fudUf3S7Z_8pm#(YY1@7u{p3<_B zYvG%qCzSLi;Y1$E>3Ylfvv>x*AsZ5nIm~_PaX#XkYG6rCXXbkF`sQS3FZUIx>&+On zn3px@+N&3+IA2uJIiDp#(B9Dxx(_LF9E=vU6{(kg2=?c_Hn~qBPH%hTTejdo(u04z z1DXjGWDZ*!z|`r`u1)KNJ5xWw2ch20Lhg9Rx`>WP>}I0Idr@#eKb&ihWQXC;{ef+8)TGqY!#;ll%ZKEpTh*=As+@q1z8#|5X2W;l< zImyHMZG`JQ?p@{H@2k56aORZ_59=`K1?VJ)?*xgEX_XJs?A1Tx1-@T0yjov7>eSw& zO2fVyonCRR#>{GVmMr#jT5n4lk$1HNkJ0XpLT0p^-fF z92tPd8QrZQ(~%Fe?N{54W*fiP3UakMJ(yp^JcjwTjvH5wRu^Dr6iiUellr3p5xrf} z2AButstk+}4efz=%<~o;M*=y}67X##CurM}yJzsso%3G|c)+SNjYxeUnccHXDAnS= zxAs)0AX_+}=2lb;-h!MkHmo^8f}D)v^%p7$tzieXCfdfEiuO7*8_?5!DdqUtmL?q% zV)9Y@e5Hzp+|_7OA4 z_d)ALw09(U6gmN1izjb4E`9BYooZvbUl!wACuVX_hu!C#y|vFG9kgjDN3fHp0=Kn9 z@9$&eHilTGL5Bw;&D8M3X}5TcmNMN(cT?tljq6)eflU01WlcMvl_24Oi0d-gcWX3^ ztfL*+hqU*wr5iH$>}=#_80X}`FJ`{aU)-4<_Tac593GPEP{Suk+rkFHD`AjX?=ht2 z@VtjZnq=aJnx7}{Ccap96dBAamRh%Px>s@&&pD_c&spCyI^G98-zXJGzVE@VX*_}) zhky@7410Z?L+)yC7O(8DNJvV@3GUY#ox3f6_xJL3+EL1{_2W|(?bbPz>5TvDYn^iq zS@$`etbxwUk7r;dPifyvh?3CxEd=&zJ@H6AyZrREWGzHpClU)!U*@4!_Vup|@NlDO zhSE5r{6H?Ip0(s#&OlvV{8rUyS4=ePTB?_?vMi@E=ALQy74_A8iF}2NEu>0(63f+y zBI*8c01mN*ybIor({G@xv&QmPx`rl_=#(9zwO6Iao$lEWLYvQ1)E?BDB}2j1Y_0Lt z=#7vo{A8FPX0z*wy6OFx;`{Sk%oXd0OXS05LDICcvUZaqOd6;7PxcK=Fibg8Y;TWo zHH(@nhr5GspYk8PW{^8H8HbQ8PV7q(f*5i+Hi690*y4hQ<8DOGl?p$;m3U+~;?=4TD<`Fv2hu@>y zKdde0CE+%l_Vr)&&ZaF>!_EYqw~m@nn{S68DQp5pyz9D$?5hXXAihIq%ggGh)5ac? zn`m8K-EfD~Xz^*;X|FDK@*KBp{;Rz`%Cd@9`%AYT$Za(T=qP87qdC%rXHi7_QV{kH z52VwCe|UuU&g6B|Nts6^p@mn6~@K~8Z;2Q0L?Lc1Pys78@ zVmb&u(~W_=YYDs4 z3;MH@cM#nlW$aRX3vGgGyPrmcTzlSlq{0=XL1qj&>I%+))GMP3xG{6 zPda5nm3%yJ&C3|B7IO03HbX`0hVQj$F*WP(5wiO-gKYofBswbbNQxWLJ$^0w1S$ zbEUi58cJJyyC%Pi=}&wzOgh}&z=R2H*s10j=Lg+PmnaMKU#Ho?rj6f!>Fu6ZDH~3H z5ut;!{3|}%da3-_O8|FUU0Cl(t!dSkTQi{54 zOq;NfxspQf)V|y`lfkU-Zic|EHMUfxfj<6mUEQ`j7vL3!(c$Lv-?j}kp3&QkOIMu> zMh2d<+Tnj*6<4w48T{4$P9=jpjLr6+zSesJ+pTXLGLwZPJxczV0D4(j*>@D4b-Fz3 zva;IWhoNi@s%5&TtHXiQaTeAjJOqK4Z=fK)O|-l_kPdXV9Jhp_@gCy^2MGPhN&E!1 zlosYz1um;i=rE9dv((e@{%mmTSQmD!do_`E_;I&O#Xj{8$&{-JfgGk0$=bA)y63~w zUR-Gj%Nt+p112xc!;rNgm-7ZquqW2Fd!-0z^@kg2%dl$9)n7X>VMRx?Y|?r&V#m9k zBmL}?v|}j5mHP62Wic`cQ?~5)U~Q7ku_tq-$@VHC;P7U*e0o zHwYjdEu?q4Eeu}uy`vMjt*}&}>&6yr|K0sSIM)rrBnDkDj2_@S?~y;eJABdKdN2(lmdcuyfl}z+N=@9`@<7KK@iy-xIq-Clp3XSe1)&SE6>^=)ZBqdPMg`* zyN()Rt)lG*`-_I<7FVJ1#9anS&I3ned^$Wm&7NEHkOV{dzn_|<78GStmJr6>1pS8}PL8N9 zg0lw>c#zOW6&ucdKrL~eSd;iyB8Q~-Qrd3It9p~qrbG>txjQ92SM97b zf_IJ!*Skf|JdU60`0etj95gwXU{h*$THP-`)0($YAL%yd+5zT4W(V-Z+=njlzqM1` z;dQ?id=PfgZKAo5(!dA+cUGQ+Ewm|Mg!+RUWxuL7Xvo&xF{i^Wc9>Q)DhJPsq}>mb z$gaM*?`+qZ{tl5KP`)n{Y#+^v9M*7xrLFZ3&1W4fXZ(PILmr5_y|($=m5;4%^-r*` zwQ5J~&>=9_1%BiEoB0?vJXW4~`5-LNhLlDv-9SH6qc7x{&nY#{G-A*A-D(KF?G~vM z&3!*ane6gV)~Q=&Ev2U%#?jPZm0~xYYE$|4z1>M35fqnWwZAhmL}r>_Df|+%RQH&4 z1G2I5GvIyW1@t(`gXiiQvk94R`JFNZ{&csj&gJxGbUa##63eR4kN+lP1E3|GfUA78O37*4^MtvJZu7y(-?)+Jm{ z*$GxG=5_P&18&~wUZ%WA=)sZkWF@3gG8}dVwO+#)gs!zBK`@U%Zu&PV_IImoujgP* zvNA9_W(ybMY73TSAJF;7hN~jom6ZTHlg&;x*i2C2@WcS2HFs{W)V_V^5b^AJd-#{} zR(scnuA#J@#G4tHs)dH=GVS;#8XnH_ZaI02Z_zWuiZ{x+!gr*Nd;|8-S)T@V6GpR8 z^oa@x$TcA_WohR(Tak+^;~yCvB@NU&GkpHV92R{U;-$}HtuNw@Jjf3l&ca;qN&39^ zFSZdv_l%!{?{3c_(v!xe=d~dhT%?z=yG?T^#hVTViI+twaYxk+_(v{IcxGmWw!^V* z<@Ya=PM^&(xv#uK!@vlH3WnSsy454MF$Il0WNdr)^!GWy6B1%B??lTp-PE3$*K7?J z?LhH840b3N<94m9&YUZVpq&ELQ|7CU$L8vI_YE<*CIyM-=GvEl&iP63lCx62K5K|*HOfLwY=b`Q!@dmakEai3y*gD-SseeM`W{Q zmsTZl4CevQEYFN1gj42W760l4bWiQ+dYE^0VeJ_zn{?PU4Duu+JYrrm5xga=ESRf_ z=bApfklooZy-%8tA^PT04Z#2UvX2{fuS(C12sA(MICm>@iAnQvJxz#a(>Kl`>e(Su zxz3!ZtgJ+6f77=o#c`m{#+0`eLb3pxhSiaqG`S!q;-Kr`AqgE-G~nN_9^K^aZqy3eu8rzYL^{i#zQ-wfK9Nsv3^&98~l z9EKYEs!cwIOkZwN6 z^-zKfH@_ecQ}nGv!C!Siq)mqQ+v#0n6B9#cX9B^y70eeXet^OJ#uwUn*Tw@mSJ``6aW`JQg8_v*rNT^feo;F)ma3y=KqiR#28qlppK1h!1wfyIiBQiX0 zFc>SKba@-St(G^jG2>_QT`mcCvH!GK3FnOLuHrFXp(WC3m6Eb;8QB>UKUVV{ae(5$ z6Yi~Qcaa2E4h|@a@~@34-mv}I5sosG``@R8{~IFs@6Gl9{~QFoJK{NS3DyTT>gYRK zu_2(1*{zesdCaybvbt`>sQ*;wQSZNYt(sC9XGFS~w{9klj*hO`E3LNy?CerY+P|hB zDMr0+J%SqE-&~lNKG9W{t$%+SO3bwy*L?Tpsdq~v_0K;%q?%(lsgvG#uB=pPlNHCo zsbZ`3{gm}P^0!=(E(cZ9Q|~i?Yc3)JrmU6xK{B;L&ZAz|nRt_0Y8fXeVnuWYGy}?Z z+8>V;Xr(&Nv1eYOpXR9Q6z)PrF7f9N&D*sEUOs;GPM-gd?$#{~js!c?xrWtL{0Z;_ N>>MvrDx~-Qe*p?U8Sel9 diff --git a/mis_builder/static/description/ex_report.png b/mis_builder/static/description/ex_report.png deleted file mode 100644 index 03b882a81bcae07b2fcde93ace3eac0ab8598e6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83314 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

}Ot|JFbLa8}E$z8-qqC*{~PDZFTIt-Vrpmt)NZ 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 IPsi{70Q2lGh5!Hn diff --git a/mis_builder/static/description/icon.png b/mis_builder/static/description/icon.png deleted file mode 100644 index 3a0328b516c4980e8e44cdb63fd945757ddd132d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I diff --git a/mis_builder/static/description/icon.svg b/mis_builder/static/description/icon.svg deleted file mode 100644 index a7a26d09..00000000 --- a/mis_builder/static/description/icon.svg +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/mis_builder/static/description/index.html b/mis_builder/static/description/index.html deleted file mode 100644 index de59cbd6..00000000 --- a/mis_builder/static/description/index.html +++ /dev/null @@ -1,75 +0,0 @@ -

- diff --git a/mis_builder/static/src/css/custom.css b/mis_builder/static/src/css/custom.css deleted file mode 100644 index 2c59d7e7..00000000 --- a/mis_builder/static/src/css/custom.css +++ /dev/null @@ -1,30 +0,0 @@ -.o_web_client .mis_builder_amount { - text-align: right; -} - -.o_web_client .mis_builder_collabel { - text-align: center; -} - -.o_web_client .mis_builder_rowlabel { - text-align: left; -} - -.o_web_client .mis_builder a { - /* we don't want the link color, to respect user styles */ - color: inherit; -} - -.o_web_client .mis_builder a:hover { - /* underline links on hover to give a visual cue */ - text-decoration: underline; -} - -.odoo .oe_mis_builder_buttons { - padding-bottom: 10px; - padding-top: 10px; -} - -.oe_mis_builder_content { - padding: 10px; -} diff --git a/mis_builder/static/src/css/report.css b/mis_builder/static/src/css/report.css deleted file mode 100644 index 581a8560..00000000 --- a/mis_builder/static/src/css/report.css +++ /dev/null @@ -1,45 +0,0 @@ -.mis_table { - display: table; - width: 100%; - table-layout: fixed; -} -.mis_row { - display: table-row; - page-break-inside: avoid; -} -.mis_cell { - display: table-cell; - page-break-inside: avoid; -} -.mis_thead { - display: table-header-group; -} -.mis_tbody { - display: table-row-group; -} -.mis_table, .mis_table .mis_row { - border-left: 0px; - border-right: 0px; - text-align: left; - padding-right: 3px; - padding-left: 3px; - padding-top: 2px; - padding-bottom: 2px; - border-collapse: collapse; -} -.mis_table .mis_row { - border-color: grey; - border-bottom: 1px solid lightGrey; -} -.mis_table .mis_cell.mis_collabel { - font-weight: bold; - background-color: #F0F0F0; - text-align: center; -} -.mis_table .mis_cell.mis_rowlabel { - text-align: left; - /*white-space: nowrap;*/ -} -.mis_table .mis_cell.mis_amount { - text-align: right; -} diff --git a/mis_builder/static/src/img/icon.png b/mis_builder/static/src/img/icon.png deleted file mode 100644 index 833ce9211046568a692f342c1d62fb10e134d4df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3464 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 - -
- -

-
- - - - -
- - - - - - - - - - - - - - - - -
- - - -
- - -
- - -
- - -
- - - - - - - - -
-
-
-
- diff --git a/mis_builder/tests/__init__.py b/mis_builder/tests/__init__.py deleted file mode 100644 index 354d62fd..00000000 --- a/mis_builder/tests/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2014-2015 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -from . import test_accounting_none -from . import test_aep -from . import test_aggregate -from . import test_fetch_query -from . import test_mis_report_instance -from . import test_mis_safe_eval -from . import test_render -from . import test_simple_array -from . import test_utc_midnight diff --git a/mis_builder/tests/mis.report.csv b/mis_builder/tests/mis.report.csv deleted file mode 100644 index 761c37a3..00000000 --- a/mis_builder/tests/mis.report.csv +++ /dev/null @@ -1,2 +0,0 @@ -"id","description","kpi_ids/id","name","query_ids/id" -"mis_report_test","","mis_report_kpi_test","Test report","mis_report_query_test" diff --git a/mis_builder/tests/mis.report.instance.csv b/mis_builder/tests/mis.report.instance.csv deleted file mode 100644 index 73776865..00000000 --- a/mis_builder/tests/mis.report.instance.csv +++ /dev/null @@ -1,2 +0,0 @@ -"id","date","description","name","period_ids/id","report_id/id" -"mis_report_instance_test","2014-07-31","","Test-report-instance without company","mis_report_instance_period_test","mis_report_test" diff --git a/mis_builder/tests/mis.report.instance.period.csv b/mis_builder/tests/mis.report.instance.period.csv deleted file mode 100644 index 73bd7580..00000000 --- a/mis_builder/tests/mis.report.instance.period.csv +++ /dev/null @@ -1,2 +0,0 @@ -"id","duration","name","offset","type","sequence","mode" -"mis_report_instance_period_test","1","today","","Day","","relative" diff --git a/mis_builder/tests/mis.report.kpi.csv b/mis_builder/tests/mis.report.kpi.csv deleted file mode 100644 index 16a834d2..00000000 --- a/mis_builder/tests/mis.report.kpi.csv +++ /dev/null @@ -1,2 +0,0 @@ -"id","description","expression","name" -"mis_report_kpi_test","total test","len(test)","total_test" diff --git a/mis_builder/tests/mis.report.query.csv b/mis_builder/tests/mis.report.query.csv deleted file mode 100644 index 6ef1ac21..00000000 --- a/mis_builder/tests/mis.report.query.csv +++ /dev/null @@ -1,2 +0,0 @@ -"id","date_field/id","domain","field_ids/id","model_id/id","name" -"mis_report_query_test","analytic.field_account_analytic_line_date","","analytic.field_account_analytic_line_amount","analytic.model_account_analytic_line","test" diff --git a/mis_builder/tests/test_accounting_none.py b/mis_builder/tests/test_accounting_none.py deleted file mode 100644 index 7af50d0b..00000000 --- a/mis_builder/tests/test_accounting_none.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2014-2015 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -import doctest - -from odoo.addons.mis_builder.models import accounting_none - - -def load_tests(loader, tests, ignore): - tests.addTests(doctest.DocTestSuite(accounting_none)) - return tests diff --git a/mis_builder/tests/test_aep.py b/mis_builder/tests/test_aep.py deleted file mode 100644 index a5f4b258..00000000 --- a/mis_builder/tests/test_aep.py +++ /dev/null @@ -1,226 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2014-2015 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -import datetime -import time - -from odoo import fields -import odoo.tests.common as common -from odoo.tools.safe_eval import safe_eval - -from ..models.aep import AccountingExpressionProcessor as AEP -from ..models.accounting_none import AccountingNone - - -class TestAEP(common.TransactionCase): - - def setUp(self): - super(TestAEP, self).setUp() - self.res_company = self.env['res.company'] - self.account_model = self.env['account.account'] - self.move_model = self.env['account.move'] - self.journal_model = self.env['account.journal'] - self.curr_year = datetime.date.today().year - self.prev_year = self.curr_year - 1 - # create company - self.company = self.res_company.create({ - 'name': 'AEP Company'}) - # create receivable bs account - type_ar = self.browse_ref('account.data_account_type_receivable') - self.account_ar = self.account_model.create({ - 'company_id': self.company.id, - 'code': '400AR', - 'name': 'Receivable', - 'user_type_id': type_ar.id, - 'reconcile': True}) - # create income pl account - type_in = self.browse_ref('account.data_account_type_revenue') - self.account_in = self.account_model.create({ - 'company_id': self.company.id, - 'code': '700IN', - 'name': 'Income', - 'user_type_id': type_in.id}) - # create journal - self.journal = self.journal_model.create({ - 'company_id': self.company.id, - 'name': 'Sale journal', - 'code': 'VEN', - 'type': 'sale'}) - # create move in december last year - self._create_move( - date=datetime.date(self.prev_year, 12, 1), - amount=100, - debit_acc=self.account_ar, - credit_acc=self.account_in) - # create move in january this year - self._create_move( - date=datetime.date(self.curr_year, 1, 1), - amount=300, - debit_acc=self.account_ar, - credit_acc=self.account_in) - # create move in february this year - self._create_move( - date=datetime.date(self.curr_year, 3, 1), - amount=500, - debit_acc=self.account_ar, - credit_acc=self.account_in) - # create the AEP, and prepare the expressions we'll need - self.aep = AEP(self.company) - self.aep.parse_expr("bali[]") - self.aep.parse_expr("bale[]") - self.aep.parse_expr("balp[]") - self.aep.parse_expr("balu[]") - self.aep.parse_expr("bali[700IN]") - self.aep.parse_expr("bale[700IN]") - self.aep.parse_expr("balp[700IN]") - self.aep.parse_expr("bali[400AR]") - self.aep.parse_expr("bale[400AR]") - self.aep.parse_expr("balp[400AR]") - self.aep.parse_expr("debp[400A%]") - self.aep.parse_expr("crdp[700I%]") - self.aep.parse_expr("bal_700IN") # deprecated - self.aep.parse_expr("bals[700IN]") # deprecated - self.aep.done_parsing() - - def _create_move(self, date, amount, debit_acc, credit_acc): - move = self.move_model.create({ - 'journal_id': self.journal.id, - 'date': fields.Date.to_string(date), - 'line_ids': [(0, 0, { - 'name': '/', - 'debit': amount, - 'account_id': debit_acc.id, - }), (0, 0, { - 'name': '/', - 'credit': amount, - 'account_id': credit_acc.id, - })]}) - move.post() - return move - - def _do_queries(self, date_from, date_to): - 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): - eval_dict = {'AccountingNone': AccountingNone} - return safe_eval(self.aep.replace_expr(expr), eval_dict) - - def _eval_by_account_id(self, expr): - res = {} - eval_dict = {'AccountingNone': AccountingNone} - for account_id, replaced_exprs in \ - self.aep.replace_exprs_by_account_id([expr]): - res[account_id] = safe_eval(replaced_exprs[0], eval_dict) - return res - - def test_sanity_check(self): - self.assertEquals(self.company.fiscalyear_last_day, 31) - self.assertEquals(self.company.fiscalyear_last_month, 12) - - def test_aep_basic(self): - # let's query for december - self._do_queries( - datetime.date(self.prev_year, 12, 1), - datetime.date(self.prev_year, 12, 31)) - # initial balance must be None - self.assertIs(self._eval('bali[400AR]'), AccountingNone) - self.assertIs(self._eval('bali[700IN]'), AccountingNone) - # check variation - self.assertEquals(self._eval('balp[400AR]'), 100) - self.assertEquals(self._eval('balp[700IN]'), -100) - # check ending balance - self.assertEquals(self._eval('bale[400AR]'), 100) - self.assertEquals(self._eval('bale[700IN]'), -100) - - # let's query for January - self._do_queries( - datetime.date(self.curr_year, 1, 1), - datetime.date(self.curr_year, 1, 31)) - # initial balance is None for income account (it's not carried over) - self.assertEquals(self._eval('bali[400AR]'), 100) - self.assertIs(self._eval('bali[700IN]'), AccountingNone) - # check variation - self.assertEquals(self._eval('balp[400AR]'), 300) - self.assertEquals(self._eval('balp[700IN]'), -300) - # check ending balance - self.assertEquals(self._eval('bale[400AR]'), 400) - self.assertEquals(self._eval('bale[700IN]'), -300) - - # let's query for March - self._do_queries( - datetime.date(self.curr_year, 3, 1), - datetime.date(self.curr_year, 3, 31)) - # initial balance is the ending balance fo January - self.assertEquals(self._eval('bali[400AR]'), 400) - self.assertEquals(self._eval('bali[700IN]'), -300) - # check variation - self.assertEquals(self._eval('balp[400AR]'), 500) - self.assertEquals(self._eval('balp[700IN]'), -500) - # check ending balance - self.assertEquals(self._eval('bale[400AR]'), 900) - self.assertEquals(self._eval('bale[700IN]'), -800) - # check some variant expressions, for coverage - self.assertEquals(self._eval('crdp[700I%]'), 500) - self.assertEquals(self._eval('debp[400A%]'), 500) - self.assertEquals(self._eval('bal_700IN'), -500) - self.assertEquals(self._eval('bals[700IN]'), -800) - - # unallocated p&l from previous year - self.assertEquals(self._eval('balu[]'), -100) - - # TODO allocate profits, and then... - - def test_aep_by_account(self): - self._do_queries( - datetime.date(self.curr_year, 3, 1), - datetime.date(self.curr_year, 3, 31)) - variation = self._eval_by_account_id('balp[]') - self.assertEquals(variation, { - self.account_ar.id: 500, - self.account_in.id: -500, - }) - variation = self._eval_by_account_id('balp[700IN]') - self.assertEquals(variation, { - self.account_in.id: -500, - }) - end = self._eval_by_account_id('bale[]') - self.assertEquals(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') - self.assertEquals(initial, { - self.account_ar.id: (400, 0), - self.account_in.id: (0, 300), - }) - variation = AEP.get_balances_variation( - self.company, - time.strftime('%Y') + '-03-01', - time.strftime('%Y') + '-03-31', - 'posted') - self.assertEquals(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') - self.assertEquals(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.assertEquals(unallocated, (0, 100)) diff --git a/mis_builder/tests/test_aggregate.py b/mis_builder/tests/test_aggregate.py deleted file mode 100644 index 2472b2a1..00000000 --- a/mis_builder/tests/test_aggregate.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2014-2015 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -import doctest - -from odoo.addons.mis_builder.models import aggregate - - -def load_tests(loader, tests, ignore): - tests.addTests(doctest.DocTestSuite(aggregate)) - return tests diff --git a/mis_builder/tests/test_fetch_query.py b/mis_builder/tests/test_fetch_query.py deleted file mode 100644 index fb4c8609..00000000 --- a/mis_builder/tests/test_fetch_query.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2014-2016 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -import odoo.tests.common as common - - -class TestFetchQuery(common.TransactionCase): - - def test_fetch_query(self): - # create a report on account.analytic.line - report = self.env.ref('mis_builder.mis_report_instance_test') - data = report.compute() - self.maxDiff = None - self.assertEquals( - {'body': - [{'label': u'total test', - 'description': '', - 'style': None, - 'parent_row_id': None, - 'row_id': u'total_test', - 'cells': [{'val': 0, - 'val_r': u'0', - 'val_c': u'total_test = len(test)', - 'style': None, - }] - }], - 'header': - [{'cols': [{'description': '07/31/2014', - 'label': u'today', - 'colspan': 1, - }], - }, - {'cols': [{'label': '', - 'description': '', - 'colspan': 1, - }], - }, - ], - }, data) diff --git a/mis_builder/tests/test_mis_report_instance.py b/mis_builder/tests/test_mis_report_instance.py deleted file mode 100644 index c417f072..00000000 --- a/mis_builder/tests/test_mis_report_instance.py +++ /dev/null @@ -1,141 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2016 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -import odoo.tests.common as common -from odoo.tools import test_reports - - -class TestMisReportInstance(common.TransactionCase): - """ Basic integration test to exercise mis.report.instance. - - We don't check the actual results here too much as computation correctness - should be covered by lower level unit tests. - """ - - def setUp(self): - super(TestMisReportInstance, self).setUp() - partner_model_id = \ - self.env.ref('base.model_res_partner').id - partner_create_date_field_id = \ - self.env.ref('base.field_res_partner_create_date').id - partner_debit_field_id = \ - self.env.ref('account.field_res_partner_debit').id - # create a report with 2 subkpis and one query - self.report = self.env['mis.report'].create(dict( - name='test report', - subkpi_ids=[(0, 0, dict( - name='sk1', - description='subkpi 1', - sequence=1, - )), (0, 0, dict( - name='sk2', - description='subkpi 2', - sequence=2, - ))], - query_ids=[(0, 0, dict( - name='partner', - model_id=partner_model_id, - field_ids=[(4, partner_debit_field_id, None)], - date_field=partner_create_date_field_id, - aggregate='sum', - ))], - )) - # kpi with accounting formulas - self.env['mis.report.kpi'].create(dict( - report_id=self.report.id, - description='kpi 1', - name='k1', - multi=True, - expression_ids=[(0, 0, dict( - name='bale[200%]', - subkpi_id=self.report.subkpi_ids[0].id, - )), (0, 0, dict( - name='balp[200%]', - subkpi_id=self.report.subkpi_ids[1].id, - ))], - )) - # kpi with accounting formula and query - self.env['mis.report.kpi'].create(dict( - report_id=self.report.id, - description='kpi 2', - name='k2', - multi=True, - expression_ids=[(0, 0, dict( - name='balp[200%]', - subkpi_id=self.report.subkpi_ids[0].id, - )), (0, 0, dict( - name='partner.debit', - subkpi_id=self.report.subkpi_ids[1].id, - ))], - )) - # kpi with a simple expression summing other multi-valued kpis - self.env['mis.report.kpi'].create(dict( - report_id=self.report.id, - description='kpi 4', - name='k4', - multi=False, - expression='k1 + k2 + k3', - )) - # kpi with 2 constants - self.env['mis.report.kpi'].create(dict( - report_id=self.report.id, - description='kpi 3', - name='k3', - multi=True, - expression_ids=[(0, 0, dict( - name='AccountingNone', - subkpi_id=self.report.subkpi_ids[0].id, - )), (0, 0, dict( - name='1.0', - subkpi_id=self.report.subkpi_ids[1].id, - ))], - )) - # kpi with a NameError (x not defined) - self.env['mis.report.kpi'].create(dict( - report_id=self.report.id, - description='kpi 5', - name='k5', - multi=True, - expression_ids=[(0, 0, dict( - name='x', - subkpi_id=self.report.subkpi_ids[0].id, - )), (0, 0, dict( - name='1.0', - subkpi_id=self.report.subkpi_ids[1].id, - ))], - )) - # create a report instance - self.report_instance = self.env['mis.report.instance'].create(dict( - name='test instance', - report_id=self.report.id, - company_id=self.env.ref('base.main_company').id, - period_ids=[(0, 0, dict( - name='p1', - mode='relative', - type='d', - subkpi_ids=[(4, self.report.subkpi_ids[0].id, None)], - )), (0, 0, dict( - name='p2', - mode='fix', - manual_date_from='2014-01-01', - manual_date_to='2014-12-31', - ))], - )) - self.report_instance.period_ids[1].comparison_column_ids = \ - [(4, self.report_instance.period_ids[0].id, None)] - - def test_json(self): - self.report_instance.compute() - - def test_qweb(self): - test_reports.try_report(self.env.cr, self.env.uid, - 'mis_builder.report_mis_report_instance', - [self.report_instance.id], - report_type='qweb-pdf') - - def test_xlsx(self): - test_reports.try_report(self.env.cr, self.env.uid, - 'mis.report.instance.xlsx', - [self.report_instance.id], - report_type='xlsx') diff --git a/mis_builder/tests/test_mis_safe_eval.py b/mis_builder/tests/test_mis_safe_eval.py deleted file mode 100644 index 524f4f3f..00000000 --- a/mis_builder/tests/test_mis_safe_eval.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2016 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -import odoo.tests.common as common - -from ..models.mis_safe_eval import mis_safe_eval, DataError, NameDataError - - -class TestMisSafeEval(common.TransactionCase): - - def test_nominal(self): - val = mis_safe_eval('a + 1', {'a': 1}) - self.assertEqual(val, 2) - - def test_exceptions(self): - val = mis_safe_eval('1/0', {}) # division by zero - self.assertTrue(isinstance(val, DataError)) - self.assertEqual(val.name, '#DIV/0') - val = mis_safe_eval('1a', {}) # syntax error - self.assertTrue(isinstance(val, DataError)) - self.assertEqual(val.name, '#ERR') - - def test_name_error(self): - val = mis_safe_eval('a + 1', {}) - self.assertTrue(isinstance(val, NameDataError)) - self.assertEqual(val.name, '#NAME') diff --git a/mis_builder/tests/test_render.py b/mis_builder/tests/test_render.py deleted file mode 100644 index 90537f0f..00000000 --- a/mis_builder/tests/test_render.py +++ /dev/null @@ -1,158 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2016 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -import odoo.tests.common as common - -from ..models.accounting_none import AccountingNone -from ..models.mis_report_style import ( - TYPE_NUM, TYPE_PCT, TYPE_STR, CMP_DIFF, CMP_PCT -) - - -class TestRendering(common.TransactionCase): - - def setUp(self): - super(TestRendering, self).setUp() - self.style_obj = self.env['mis.report.style'] - self.kpi_obj = self.env['mis.report.kpi'] - self.style = self.style_obj.create(dict( - name='teststyle', - )) - self.lang = self.env['res.lang'].search([('code', '=', 'en_US')])[0] - - def _render(self, value, type=TYPE_NUM): - style_props = self.style_obj.merge([self.style]) - return self.style_obj.render(self.lang, style_props, type, value) - - def _compare_and_render(self, value, base_value, - type=TYPE_NUM, compare_method=CMP_PCT): - style_props = self.style_obj.merge([self.style]) - return self.style_obj.compare_and_render(self.lang, style_props, - type, compare_method, - value, base_value)[:2] - - def test_render(self): - self.assertEquals(u'1', self._render(1)) - self.assertEquals(u'1', self._render(1.1)) - self.assertEquals(u'2', self._render(1.6)) - self.style.dp_inherit = False - self.style.dp = 2 - self.assertEquals(u'1.00', self._render(1)) - self.assertEquals(u'1.10', self._render(1.1)) - self.assertEquals(u'1.60', self._render(1.6)) - self.assertEquals(u'1.61', self._render(1.606)) - self.assertEquals(u'12,345.67', self._render(12345.67)) - - def test_render_negative(self): - # non breaking hyphen - self.assertEquals(u'\u20111', self._render(-1)) - - def test_render_zero(self): - self.assertEquals(u'0', self._render(0)) - self.assertEquals(u'', self._render(None)) - self.assertEquals(u'', self._render(AccountingNone)) - - def test_render_suffix(self): - self.style.suffix_inherit = False - self.style.suffix = u'€' - self.assertEquals(u'1\xa0€', self._render(1)) - self.style.suffix = u'k€' - self.style.divider_inherit = False - self.style.divider = '1e3' - self.assertEquals(u'1\xa0k€', self._render(1000)) - - def test_render_prefix(self): - self.style.prefix_inherit = False - self.style.prefix = u'$' - self.assertEquals(u'$\xa01', self._render(1)) - self.style.prefix = u'k$' - self.style.divider_inherit = False - self.style.divider = '1e3' - self.assertEquals(u'k$\xa01', self._render(1000)) - - def test_render_divider(self): - self.style.divider_inherit = False - self.style.divider = '1e3' - self.style.dp_inherit = False - self.style.dp = 0 - self.assertEquals(u'1', self._render(1000)) - self.style.divider = '1e6' - self.style.dp = 3 - self.assertEquals(u'0.001', self._render(1000)) - self.style.divider = '1e-3' - self.style.dp = 0 - self.assertEquals(u'1,000', self._render(1)) - self.style.divider = '1e-6' - self.style.dp = 0 - self.assertEquals(u'1,000,000', self._render(1)) - - def test_render_pct(self): - self.assertEquals(u'100\xa0%', self._render(1, TYPE_PCT)) - self.assertEquals(u'50\xa0%', self._render(0.5, TYPE_PCT)) - self.style.dp_inherit = False - self.style.dp = 2 - self.assertEquals(u'51.23\xa0%', self._render(0.5123, TYPE_PCT)) - - def test_render_string(self): - self.assertEquals(u'', self._render('', TYPE_STR)) - self.assertEquals(u'', self._render(None, TYPE_STR)) - self.assertEquals(u'abcdé', self._render(u'abcdé', TYPE_STR)) - - def test_compare_num_pct(self): - self.assertEquals((1.0, u'+100.0\xa0%'), - self._compare_and_render(100, 50)) - self.assertEquals((0.5, u'+50.0\xa0%'), - self._compare_and_render(75, 50)) - self.assertEquals((0.5, u'+50.0\xa0%'), - self._compare_and_render(-25, -50)) - self.assertEquals((1.0, u'+100.0\xa0%'), - self._compare_and_render(0, -50)) - self.assertEquals((2.0, u'+200.0\xa0%'), - self._compare_and_render(50, -50)) - self.assertEquals((-0.5, u'\u201150.0\xa0%'), - self._compare_and_render(25, 50)) - self.assertEquals((-1.0, u'\u2011100.0\xa0%'), - self._compare_and_render(0, 50)) - self.assertEquals((-2.0, u'\u2011200.0\xa0%'), - self._compare_and_render(-50, 50)) - self.assertEquals((-0.5, u'\u201150.0\xa0%'), - self._compare_and_render(-75, -50)) - self.assertEquals((AccountingNone, u''), - self._compare_and_render(50, AccountingNone)) - self.assertEquals((AccountingNone, u''), - self._compare_and_render(50, None)) - self.assertEquals((-1.0, u'\u2011100.0\xa0%'), - self._compare_and_render(AccountingNone, 50)) - self.assertEquals((-1.0, u'\u2011100.0\xa0%'), - self._compare_and_render(None, 50)) - - def test_compare_num_diff(self): - self.assertEquals((25, u'+25'), - self._compare_and_render(75, 50, - TYPE_NUM, CMP_DIFF)) - self.assertEquals((-25, u'\u201125'), - self._compare_and_render(25, 50, - TYPE_NUM, CMP_DIFF)) - self.style.suffix_inherit = False - self.style.suffix = u'€' - self.assertEquals((-25, u'\u201125\xa0€'), - self._compare_and_render(25, 50, - TYPE_NUM, CMP_DIFF)) - self.style.suffix = u'' - self.assertEquals((50.0, u'+50'), - self._compare_and_render(50, AccountingNone, - TYPE_NUM, CMP_DIFF)) - self.assertEquals((50.0, u'+50'), - self._compare_and_render(50, None, - TYPE_NUM, CMP_DIFF)) - self.assertEquals((-50.0, u'\u201150'), - self._compare_and_render(AccountingNone, 50, - TYPE_NUM, CMP_DIFF)) - self.assertEquals((-50.0, u'\u201150'), - self._compare_and_render(None, 50, - TYPE_NUM, CMP_DIFF)) - - def test_compare_pct(self): - self.assertEquals((0.25, u'+25\xa0pp'), - self._compare_and_render(0.75, 0.50, TYPE_PCT)) diff --git a/mis_builder/tests/test_simple_array.py b/mis_builder/tests/test_simple_array.py deleted file mode 100644 index ff622fbd..00000000 --- a/mis_builder/tests/test_simple_array.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2014-2015 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -import doctest - -from odoo.addons.mis_builder.models import simple_array - - -def load_tests(loader, tests, ignore): - tests.addTests(doctest.DocTestSuite(simple_array)) - return tests diff --git a/mis_builder/tests/test_utc_midnight.py b/mis_builder/tests/test_utc_midnight.py deleted file mode 100644 index ca574553..00000000 --- a/mis_builder/tests/test_utc_midnight.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2014-2015 ACSONE SA/NV () -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -import odoo.tests.common as common - -from ..models.mis_report import _utc_midnight - - -class TestUtcMidnight(common.TransactionCase): - - def test_utc_midnight(self): - date_to_convert = '2014-07-05' - date_time_convert = _utc_midnight( - date_to_convert, 'Europe/Brussels') - self.assertEqual(date_time_convert, '2014-07-04 22:00:00') - date_time_convert = _utc_midnight( - date_to_convert, 'Europe/Brussels', add_day=1) - self.assertEqual(date_time_convert, '2014-07-05 22:00:00') - date_time_convert = _utc_midnight( - date_to_convert, 'US/Pacific') - self.assertEqual(date_time_convert, '2014-07-05 07:00:00') - date_time_convert = _utc_midnight( - date_to_convert, 'US/Pacific', add_day=1) - self.assertEqual(date_time_convert, '2014-07-06 07:00:00') diff --git a/mis_builder/views/mis_report.xml b/mis_builder/views/mis_report.xml deleted file mode 100644 index d752eef7..00000000 --- a/mis_builder/views/mis_report.xml +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - mis.report.view.tree - mis.report - - - - - - - - - - mis.report.view.form - mis.report - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - - mis.report.view.kpi.form - mis.report.kpi - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - - MIS Report Templates - - mis.report - form - tree,form - - - - - -
-
diff --git a/mis_builder/views/mis_report_instance.xml b/mis_builder/views/mis_report_instance.xml deleted file mode 100644 index 0a075347..00000000 --- a/mis_builder/views/mis_report_instance.xml +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - - mis.report.instance.result.view.form - mis.report.instance - - -
- -
-
-
- - - mis.report.instance.view.tree - mis.report.instance - - -
- License: AGPL-3 -
-

MIS Builder

-

This module allows you to build Management Information Systems dashboards. Such style of reports presents KPI in rows and time periods in columns. Reports mainly fetch data from account moves, but can also combine data coming from arbitrary Odoo models. Reports can be exported to PDF, Excel and they can be added to Odoo dashboards.

-
-

Installation

-

There is no specific installation procedure for this module.

-
-
-

Configuration and Usage

-

To configure this module, you need to:

-
    -
  • Go to Accounting > Configuration > Financial Reports > MIS Report Templates where you can create report templates by defining KPI's. KPI's constitute the rows of your reports. Such report templates are time independent.
  • -
-
- Sample report template -
-
    -
  • Then in Accounting > Reporting > MIS Reports you can create report instance by binding the templates to time period, hence defining the columns of your reports.
  • -
-
- Sample report configuration -
-
    -
  • From the MIS Report view, you can preview the report, add it to and Odoo dashboard, and export it to PDF or Excel.
  • -
-
- Sample dashboard view -
-

For further information, please visit:

-
-
-
-

Known issues / Roadmap

-
    -
  • More tests should be added. The first part is creating test data, then it will be easier. At the minimum, We need the following test data: -
      -
    • one account charts with a few normal accounts and view accounts,
    • -
    • two fiscal years,
    • -
    • an opening entry in the second fiscal year,
    • -
    • to test multi-company consolidation, we need a second company with it's own account chart and two fiscal years, but without opening entry; we also need a third company which is the parent of the other two and has a consolidation chart of account.
    • -
    -
  • -
-
-
-

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 feedback here.

-
-
-

Credits

-
-

Contributors

- -
-
-

Maintainer

- - Odoo Community Association - -

This module is maintained by the OCA.

-

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

-

To contribute to this module, please visit http://odoo-community.org.

-
-
-
-