diff --git a/spreadsheet_dashboard_purchase_oca/README.rst b/spreadsheet_dashboard_purchase_oca/README.rst index 3e6cceea..3097a8d1 100644 --- a/spreadsheet_dashboard_purchase_oca/README.rst +++ b/spreadsheet_dashboard_purchase_oca/README.rst @@ -1,7 +1,3 @@ -.. image:: https://odoo-community.org/readme-banner-image - :target: https://odoo-community.org/get-involved?utm_source=readme - :alt: Odoo Community Association - ================================= Spreadsheet dashboard for vendors ================================= @@ -17,7 +13,7 @@ Spreadsheet dashboard for vendors .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/license-LGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html :alt: License: LGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fspreadsheet-lightgray.png?logo=github @@ -61,9 +57,9 @@ Authors Contributors ------------ -- `Tecnativa `__: +- `Tecnativa `__: - - Pedro M. Baeza + - Pedro M. Baeza Other credits ------------- diff --git a/spreadsheet_dashboard_purchase_oca/static/description/index.html b/spreadsheet_dashboard_purchase_oca/static/description/index.html index d58cda69..328930b3 100644 --- a/spreadsheet_dashboard_purchase_oca/static/description/index.html +++ b/spreadsheet_dashboard_purchase_oca/static/description/index.html @@ -3,7 +3,7 @@ -README.rst +Spreadsheet dashboard for vendors -
+
+

Spreadsheet dashboard for vendors

- - -Odoo Community Association - -
-

Spreadsheet dashboard for vendors

-

Beta License: LGPL-3 OCA/spreadsheet Translate me on Weblate Try me on Runboat

+

Beta License: LGPL-3 OCA/spreadsheet Translate me on Weblate Try me on Runboat

Spreadsheet dashboard for vendors.

Table of contents

@@ -390,7 +385,7 @@

Spreadsheet dashboard for vendors

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed @@ -398,16 +393,16 @@

Bug Tracker

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

-

Credits

+

Credits

-

Authors

+

Authors

  • Odoo S.A.
  • Tecnativa
-

Contributors

+

Contributors

-

Other credits

+

Other credits

This module is a forward-port from Odoo SA and as such, it is not included in the OCA CLA. That means we do not have a copy of the copyright on it like all other OCA modules.

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -435,6 +430,5 @@

Maintainers

-
diff --git a/spreadsheet_dashboard_purchase_stock_oca/README.rst b/spreadsheet_dashboard_purchase_stock_oca/README.rst index 49b2d217..fd22b650 100644 --- a/spreadsheet_dashboard_purchase_stock_oca/README.rst +++ b/spreadsheet_dashboard_purchase_stock_oca/README.rst @@ -1,7 +1,3 @@ -.. image:: https://odoo-community.org/readme-banner-image - :target: https://odoo-community.org/get-involved?utm_source=readme - :alt: Odoo Community Association - =================================== Spreadsheet dashboard for purchases =================================== @@ -17,7 +13,7 @@ Spreadsheet dashboard for purchases .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/license-LGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html :alt: License: LGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fspreadsheet-lightgray.png?logo=github @@ -42,9 +38,9 @@ Spreadsheet dashboard for purchases. Known issues / Roadmap ====================== -- Modernize style and use new v18 features. -- Unify both purchase modules into one, and remove duplicated - information. +- Modernize style and use new v18 features. +- Unify both purchase modules into one, and remove duplicated + information. Bug Tracker =========== @@ -68,9 +64,9 @@ Authors Contributors ------------ -- `Tecnativa `__: +- `Tecnativa `__: - - Pedro M. Baeza + - Pedro M. Baeza Other credits ------------- diff --git a/spreadsheet_dashboard_purchase_stock_oca/static/description/index.html b/spreadsheet_dashboard_purchase_stock_oca/static/description/index.html index eab375b6..a0ae7aa4 100644 --- a/spreadsheet_dashboard_purchase_stock_oca/static/description/index.html +++ b/spreadsheet_dashboard_purchase_stock_oca/static/description/index.html @@ -3,7 +3,7 @@ -README.rst +Spreadsheet dashboard for purchases -
+
+

Spreadsheet dashboard for purchases

- - -Odoo Community Association - -
-

Spreadsheet dashboard for purchases

-

Beta License: LGPL-3 OCA/spreadsheet Translate me on Weblate Try me on Runboat

+

Beta License: LGPL-3 OCA/spreadsheet Translate me on Weblate Try me on Runboat

Spreadsheet dashboard for purchases.

Table of contents

@@ -391,7 +386,7 @@

Spreadsheet dashboard for purchases

-

Known issues / Roadmap

+

Known issues / Roadmap

  • Modernize style and use new v18 features.
  • Unify both purchase modules into one, and remove duplicated @@ -399,7 +394,7 @@

    Known issues / Roadmap

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed @@ -407,16 +402,16 @@

Bug Tracker

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

-

Credits

+

Credits

-

Authors

+

Authors

  • Odoo S.A.
  • Tecnativa
-

Contributors

+

Contributors

-

Other credits

+

Other credits

This module is a forward-port from Odoo SA and as such, it is not included in the OCA CLA. That means we do not have a copy of the copyright on it like all other OCA modules.

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -444,6 +439,5 @@

Maintainers

-
diff --git a/spreadsheet_oca/README.rst b/spreadsheet_oca/README.rst new file mode 100644 index 00000000..7908f90c --- /dev/null +++ b/spreadsheet_oca/README.rst @@ -0,0 +1,192 @@ +=============== +Spreadsheet Oca +=============== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:a7edc105b2730d126fc787ef8ef2c8c1d293b8e18e94402ff7db7d044ee863cd + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fspreadsheet-lightgray.png?logo=github + :target: https://github.com/OCA/spreadsheet/tree/18.0/spreadsheet_oca + :alt: OCA/spreadsheet +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/spreadsheet-18-0/spreadsheet-18-0-spreadsheet_oca + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/spreadsheet&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module adds a functionality for adding and editing Spreadsheets +using Odoo CE. + +It is an alternative to the proprietary module ``spreadsheet_edition`` +of Odoo Enterprise Edition. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +**Create a new spreadsheet** +---------------------------- + +- Go to 'Spreadsheet' menu +- Click on 'Create' +- Put a name, then click on the "Edit" button + +|image1| + +- At this point you switch to spreadsheet editing mode. The editor is + named ``o-spreadsheet`` and looks like another common spreadsheet web + editors. (OnlyOffice, Ethercalc, Google Sheets (non-free)). + +|image2| + +- You can use common functions ``SUM()``, ``AVERAGE()``, etc. in the + cells. For a complete list of functions and their syntax, Refer to + the documentation https://github.com/odoo/o-spreadsheet/ or go to + https://odoo.github.io/o-spreadsheet/ and click on "Insert > + Function". + +|image3| + +- Note: Business Odoo module can add "business functions". This is + currently the case for the accounting module, which adds the + following features: + + - ``ODOO.CREDIT(account_codes, date_range)``: Get the total + credit for the specified account(s) and period. + - ``ODOO.DEBIT(account_codes, date_range)``: Get the total debit + for the specified account(s) and period. + - ``ODOO.BALANCE(account_codes, date_range)``: Get the total + balance for the specified account(s) and period. + - ``ODOO.FISCALYEAR.START(day)``: Returns the starting date of + the fiscal year encompassing the provided date. + - ``ODOO.FISCALYEAR.END(day)``: Returns the ending date of the + fiscal year encompassing the provided date. + - ``ODOO.ACCOUNT.GROUP(type)``: Returns the account ids of a + given group where type should be a value of the + ``account_type`` field of ``account.account`` model. + (``income``, ``asset_receivable``, etc.) + +**Create a new dynamic spreadsheet from pivot** +----------------------------------------------- + +- Go to any pivot +- Press on insert button +- Select the dynamic rows or dynamic columns option and set a number of + rows/columns + +A new table that will be updated with the actual or filtered values will +be added. + +- Note: When a pivot has multiple levels of aggrupations in the rows or + the columns, the number of rows/columns selected will be transfered + to each level. + + Example: number of groups -> 2 number of rows -> 3 + + - val1 + + - subval1.1 + - subval1.2 + - subval1.3 + + - val2 + + - subval2.1 + - subval2.2 + - subval2.3 + + - val3 + + - subval3.1 + - subval3.2 + - subval3.3 + +https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/Hhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/rhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ihttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/shttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ahttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/vhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ihttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/shttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/uhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ahttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/lhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/xhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ahttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/phttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/lhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ohttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/fhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/uhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/shttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/:https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/.https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/.https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/fhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ihttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ghttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/uhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/rhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/:https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/:https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ +https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/../static/description/spreadsheetdynamic_table.gif + +.. |image1| image:: https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/static/description/spreadsheet_create.png +.. |image2| image:: https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/static/description/spreadsheet_edit.png +.. |image3| image:: https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/static/description/o-spreadsheet.png + +Development +=========== + +If you want to develop custom business functions, you can add others, +based on the file +https://github.com/odoo/odoo/blob/16.0/addons/spreadsheet_account/static/src/accounting_functions.js + +Known issues / Roadmap +====================== + +Adding new lines on pivot tables +-------------------------------- + +When we add a pivot table, the number of rows is predefined according to +the current data. + +In order to add new rows, we need to reinsert the pivot table. + +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 to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* CreuBlanca + +Contributors +------------ + +- Enric Tobella +- `Tecnativa `__: + + - Carlos Roca + +- `Open User Systems `__: + + - Chris Mann + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/spreadsheet `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/spreadsheet_oca/__init__.py b/spreadsheet_oca/__init__.py new file mode 100644 index 00000000..ada0b87b --- /dev/null +++ b/spreadsheet_oca/__init__.py @@ -0,0 +1,3 @@ +from . import controllers +from . import models +from . import wizards diff --git a/spreadsheet_oca/__manifest__.py b/spreadsheet_oca/__manifest__.py new file mode 100644 index 00000000..f065bd7f --- /dev/null +++ b/spreadsheet_oca/__manifest__.py @@ -0,0 +1,53 @@ +# Copyright 2022 CreuBlanca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Spreadsheet Oca", + "summary": """ + Allow to edit spreadsheets""", + "version": "18.0.1.0.0", + "license": "AGPL-3", + "author": "CreuBlanca,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/spreadsheet", + "depends": ["spreadsheet", "base_sparse_field", "bus"], + "data": [ + "security/security.xml", + "security/ir.model.access.csv", + "views/spreadsheet_spreadsheet.xml", + "data/spreadsheet_spreadsheet_import_mode.xml", + "wizards/spreadsheet_select_row_number.xml", + "wizards/spreadsheet_spreadsheet_import.xml", + ], + "demo": ["demo/spreadsheet_spreadsheet.xml"], + "assets": { + "web.assets_backend": [ + "spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.esm.js", + "spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.xml", + "spreadsheet_oca/static/src/spreadsheet/spreadsheet.scss", + "spreadsheet_oca/static/src/spreadsheet/spreadsheet_action.esm.js", + "spreadsheet_oca/static/src/spreadsheet/list_controller.esm.js", + "spreadsheet_oca/static/src/spreadsheet/list_renderer.esm.js", + "spreadsheet_oca/static/src/spreadsheet/list_controller.xml", + ], + "web.assets_backend_lazy": [ + "spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js", + "spreadsheet_oca/static/src/spreadsheet/graph_controller.esm.js", + "spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml", + "spreadsheet_oca/static/src/spreadsheet/graph_controller.xml", + ], + "spreadsheet.o_spreadsheet": [ + "spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml", + "spreadsheet_oca/static/src/spreadsheet/bundle/image_file_store.esm.js", + "spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js", + "spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js", + "spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js", + "spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_controlpanel.esm.js", + "spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_action.esm.js", + "spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js", + "spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js", + "spreadsheet_oca/static/src/spreadsheet/bundle/chart_panel.esm.js", + "spreadsheet_oca/static/src/spreadsheet/utils/dynamic_generators.esm.js", + "spreadsheet_oca/static/src/pivot/pivot_table.esm.js", + ], + }, +} diff --git a/spreadsheet_oca/controllers/__init__.py b/spreadsheet_oca/controllers/__init__.py new file mode 100644 index 00000000..12a7e529 --- /dev/null +++ b/spreadsheet_oca/controllers/__init__.py @@ -0,0 +1 @@ +from . import main diff --git a/spreadsheet_oca/controllers/main.py b/spreadsheet_oca/controllers/main.py new file mode 100644 index 00000000..dcc35bc7 --- /dev/null +++ b/spreadsheet_oca/controllers/main.py @@ -0,0 +1,23 @@ +# Copyright 2024 Tecnativa - Carlos Roca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +import json + +from odoo.http import Controller, content_disposition, request, route + + +class SpreadsheetDownloadXLSX(Controller): + @route("/spreadsheet/xlsx", type="http", auth="user", methods=["POST"]) + def download_spreadsheet_xlsx(self, zip_name, files, **kw): + if hasattr(files, "read"): + files = files.read().decode("utf-8") + files = json.loads(files) + file_content = request.env["spreadsheet.mixin"]._zip_xslx_files(files) + return request.make_response( + file_content, + [ + ("Content-Length", len(file_content)), + ("Content-Type", "application/vnd.ms-excel"), + ("X-Content-Type-Options", "nosniff"), + ("Content-Disposition", content_disposition(zip_name)), + ], + ) diff --git a/spreadsheet_oca/data/spreadsheet_spreadsheet_import_mode.xml b/spreadsheet_oca/data/spreadsheet_spreadsheet_import_mode.xml new file mode 100644 index 00000000..1ee1db44 --- /dev/null +++ b/spreadsheet_oca/data/spreadsheet_spreadsheet_import_mode.xml @@ -0,0 +1,30 @@ + + + + new + Create spreadsheet + + + + + add + Add to spreadsheet + + + + + add_sheet + Add sheet to spreadsheet + + + + diff --git a/spreadsheet_oca/demo/demo_spreadsheet.json b/spreadsheet_oca/demo/demo_spreadsheet.json new file mode 100644 index 00000000..79a0811d --- /dev/null +++ b/spreadsheet_oca/demo/demo_spreadsheet.json @@ -0,0 +1,54 @@ +{ + "version": 12.5, + "sheets": [ + { + "id": "Sheet1", + "name": "Demo Sheet 1", + "colNumber": 26, + "rowNumber": 100, + "rows": {}, + "cols": {}, + "merges": [], + "cells": { + "A1": {"style": 1, "content": "First Value", "border": 1}, + "A2": {"format": 1, "content": "30.55", "border": 1}, + "B1": {"style": 1, "content": "Second Value", "border": 1}, + "B2": {"format": 1, "content": "50", "border": 1}, + "C1": {"style": 1, "content": "Total", "border": 1}, + "C2": {"format": 1, "content": "=sum(A2:B2)", "border": 1}, + "A3": {"border": 2}, + "B3": {"border": 2}, + "C3": {"border": 2}, + "D1": {"border": 3}, + "D2": {"border": 3} + }, + "conditionalFormats": [], + "figures": [], + "filterTables": [], + "areGridLinesVisible": true, + "isVisible": true + } + ], + "entities": {}, + "styles": {"1": {"bold": true, "align": "center"}}, + "formats": {"1": "[$$]#,##0.00"}, + "borders": { + "1": { + "top": ["thin", "#000"], + "bottom": ["thin", "#000"], + "left": ["thin", "#000"], + "right": ["thin", "#000"] + }, + "2": {"top": ["thin", "#000"]}, + "3": {"left": ["thin", "#000"]} + }, + "revisionId": "START_REVISION", + "uniqueFigureIds": true, + "odooVersion": 5, + "globalFilters": [], + "pivots": {}, + "pivotNextId": 1, + "lists": {}, + "listNextId": 1, + "chartOdooMenusReferences": {} +} diff --git a/spreadsheet_oca/demo/spreadsheet_spreadsheet.xml b/spreadsheet_oca/demo/spreadsheet_spreadsheet.xml new file mode 100644 index 00000000..11222ed5 --- /dev/null +++ b/spreadsheet_oca/demo/spreadsheet_spreadsheet.xml @@ -0,0 +1,11 @@ + + + + Demo spreadsheet + + + diff --git a/spreadsheet_oca/i18n/es.po b/spreadsheet_oca/i18n/es.po new file mode 100644 index 00000000..4b51e125 --- /dev/null +++ b/spreadsheet_oca/i18n/es.po @@ -0,0 +1,798 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * spreadsheet_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-03 11:51+0000\n" +"PO-Revision-Date: 2024-09-03 13:54+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.0.1\n" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add date" +msgstr "Añadir fecha" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add relation" +msgstr "Añadir relación" + +#. module: spreadsheet_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_add_sheet +msgid "Add sheet to spreadsheet" +msgstr "Añadir hoja a la hoja de cálculo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add text" +msgstr "Añadir texto" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/list_controller.xml:0 +#, python-format +msgid "Add to spreadesheet" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/graph_controller.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/list_controller.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml:0 +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_add +#, python-format +msgid "Add to spreadsheet" +msgstr "Añadir a hoja de cálculo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "After next" +msgstr "Después del siguiente" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Are you sure you want to delete this list?" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Are you sure you want to delete this pivot?" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Automatically filter on the current period" +msgstr "Filtrar automáticamente en el período actual" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Before Previous" +msgstr "Antes del anterior" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__can_be_dynamic +msgid "Can Be Dynamic" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__can_have_dynamic_cols +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__can_have_dynamic_cols +msgid "Can Have Dynamic Cols" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_import_form_view +#, python-format +msgid "Cancel" +msgstr "Cancelar" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Change name" +msgstr "Cambiar nombre" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__client_id +msgid "Client" +msgstr "Cliente" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__mode +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__code +msgid "Code" +msgstr "Código" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands +msgid "Commands" +msgstr "Comandos" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__company_id +msgid "Company" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#, python-format +msgid "Comparisons in pivot are not supprted" +msgstr "Las comparaciones en la vista pivot no están soportadas" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Confirm" +msgstr "Confirmar" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__contributor_ids +msgid "Contributors" +msgstr "Colaboradores" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__contributor_group_ids +msgid "Contributors Groups" +msgstr "" + +#. module: spreadsheet_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_new +msgid "Create spreadsheet" +msgstr "Crear hoja de cálculo" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Currency" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__datasource_name +msgid "Datasource Name" +msgstr "Nombre de datos" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Default value" +msgstr "Valor por defecto" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Delete" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Dimensions" +msgstr "Dimensiones" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__display_name +msgid "Display Name" +msgstr "Nombre a mostrar" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Domain" +msgstr "Dominio" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Download XLSX" +msgstr "Descargar XLSX" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#, python-format +msgid "Duplicated groupbys in pivot are not supprted" +msgstr "Las agrupaciones duplicadas en la vista pivot no están soportadas" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__dynamic_cols +msgid "Dynamic Cols" +msgstr "Columnas Dinámicas" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic_cols +msgid "Dynamic Columns" +msgstr "Columnas Dinámicas" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__dynamic_rows +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic +msgid "Dynamic Rows" +msgstr "Filas Dinámicas" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_tree_view +msgid "Edit" +msgstr "Editar" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Edit domain" +msgstr "Editar dominio" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "File" +msgstr "Archivo" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__filename +msgid "Filename" +msgstr "Nombre de archivo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Filters" +msgstr "Filtros" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "From / To" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__group_ids +msgid "Group" +msgstr "Agrupado por" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__id +msgid "ID" +msgstr "ID" + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__company_id +msgid "" +"If set, the spreadsheet will be available only if this company is in the " +"current companies." +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__import_data +msgid "Import Data" +msgstr "Importar datos" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet_import_mode +msgid "Import Mode" +msgstr "Modo de importación" + +#. module: spreadsheet_oca +#: model:ir.actions.act_window,name:spreadsheet_oca.spreadsheet_spreadsheet_import_act_window +msgid "Import Pivot" +msgstr "Importar Pivot" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet_import +msgid "Import data to spreadsheet" +msgstr "Importar datos a hoja de cálculo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Insert dynamic pivot" +msgstr "Insertar pivot dinámica" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Insert pivot" +msgstr "Insertar pivot" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__is_tree +msgid "Is Tree" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Label" +msgstr "Etiqueta" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__write_uid +msgid "Last Updated by" +msgstr "Última modificación por" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__write_date +msgid "Last Updated on" +msgstr "Última actualización el" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Last updated at" +msgstr "Última Actualización el" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Link to Odoo menu" +msgstr "Enlazar al menú de Odoo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "List name" +msgstr "Lista de nombres" + +#. module: spreadsheet_oca +#: model:res.groups,name:spreadsheet_oca.group_manager +msgid "Manager" +msgstr "Administrador" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Measures" +msgstr "Medidas" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +#, python-format +msgid "Menu Items" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__mode_id +msgid "Mode" +msgstr "Modo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__model +#, python-format +msgid "Model" +msgstr "Modelo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Month" +msgstr "Mes" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Month / Quarter" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__name +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Name" +msgstr "Nombre" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Next" +msgstr "Siguiente" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__next_revision_id +msgid "Next Revision" +msgstr "Siguiente revisión" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__number_of_cols +msgid "Number Of Cols" +msgstr "Número de columnas" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__number_of_rows +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__number_of_rows +msgid "Number Of Rows" +msgstr "Número de filas" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__number_of_cols +msgid "Number of Columns" +msgstr "Número de columnas" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_import_form_view +msgid "OK" +msgstr "Vale" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Odoo Spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__owner_id +msgid "Owner" +msgstr "Propietario" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Pivot name" +msgstr "Nombre de pivot" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Previous" +msgstr "Anterior" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Quarter" +msgstr "Trimestre" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Read Access" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__reader_ids +msgid "Readers" +msgstr "Lectores" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__reader_group_ids +msgid "Readers Groups" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Refresh all data" +msgstr "Actualizar todos los datos" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Related model" +msgstr "Modelo relacionado" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Relative Period" +msgstr "Periodo relativo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Remove" +msgstr "Eliminar" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__res_id +msgid "Res" +msgstr "Res" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Save" +msgstr "Guardar" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_select_row_number +msgid "Select number of rows to duplicate row" +msgstr "Seleccione el número de filas a duplicar" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Select the quantity of rows" +msgstr "Seleccione la cantidad de filas" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__sequence +msgid "Sequence" +msgstr "Secuencia" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__server_revision_id +msgid "Server Revision" +msgstr "Revisión del servidor" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Settings" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-python +#: code:addons/spreadsheet_oca/models/spreadsheet_abstract.py:0 +#, python-format +msgid "Sheet1" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Sorting" +msgstr "Ordenando" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__spreadsheet_id +#: model:ir.module.category,name:spreadsheet_oca.module_category_spreedsheet +msgid "Spreadsheet" +msgstr "Hoja de cálculo" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_oca_revision +msgid "Spreadsheet Oca Revision" +msgstr "Revisión de hoja de cálculo OCA" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_raw +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_raw +msgid "Spreadsheet Raw" +msgstr "Hoja de cálculo Raw" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_revision_ids +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_revision_ids +msgid "Spreadsheet Revision" +msgstr "Revisión de hoja de cálculo" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_abstract +msgid "Spreadsheet abstract for inheritance" +msgstr "Hoja de cálculo abstracta para herencia" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_binary_data +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_binary_data +msgid "Spreadsheet file" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.actions.act_window,name:spreadsheet_oca.spreadsheet_spreadsheet_act_window +#: model:ir.ui.menu,name:spreadsheet_oca.spreadsheet_spreadsheet_menu +msgid "Spreadsheets" +msgstr "Hojas de cálculo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Stacked" +msgstr "Apilados" + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic_cols +msgid "" +"This field allows you to generate tables that its cols are updated with the " +"filters set in the spreadsheets." +msgstr "" +"Este campo permite generar tablas en las que se actualizan sus columnas con " +"los filtros establecidos en las hojas de cálculo." + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic +msgid "" +"This field allows you to generate tables that its rows are updated with the " +"filters set in the spreadsheets." +msgstr "" +"Este campo permite generar tablas en las que se actualizan sus filas con los " +"filtros establecidos en las hojas de cálculo." + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Time range" +msgstr "Intervalo de tiempo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Toggle Dropdown" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__type +msgid "Type" +msgstr "Tipo" + +#. module: spreadsheet_oca +#. odoo-python +#: code:addons/spreadsheet_oca/models/spreadsheet_spreadsheet.py:0 +#, python-format +msgid "Unnamed" +msgstr "Sin nombre" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.xml:0 +#, python-format +msgid "Upload" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.esm.js:0 +#, python-format +msgid "Upload a Spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#: model:res.groups,name:spreadsheet_oca.group_user +msgid "User" +msgstr "Usuario" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Write Access" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Year" +msgstr "Año" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "ascending" +msgstr "ascendiendo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "descending" +msgstr "descendiendo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "name is required" +msgstr "el nombre es requerido" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "not updated" +msgstr "no actualizado" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_ir_websocket +msgid "websocket message handling" +msgstr "gestión de mensajes websocket" + +#~ msgid "Data" +#~ msgstr "Datos" + +#~ msgid "Last Modified on" +#~ msgstr "Última modificación el" diff --git a/spreadsheet_oca/i18n/fr.po b/spreadsheet_oca/i18n/fr.po new file mode 100644 index 00000000..7db8304e --- /dev/null +++ b/spreadsheet_oca/i18n/fr.po @@ -0,0 +1,797 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * spreadsheet_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-09-17 23:06+0000\n" +"Last-Translator: Grégory Moka Tourisme \n" +"Language-Team: none\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add date" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add relation" +msgstr "" + +#. module: spreadsheet_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_add_sheet +msgid "Add sheet to spreadsheet" +msgstr "Ajouter une feuille au tableur" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add text" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/list_controller.xml:0 +#, python-format +msgid "Add to spreadesheet" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/graph_controller.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/list_controller.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml:0 +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_add +#, python-format +msgid "Add to spreadsheet" +msgstr "Ajouter au tableur" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "After next" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Are you sure you want to delete this list?" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Are you sure you want to delete this pivot?" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Automatically filter on the current period" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Before Previous" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__can_be_dynamic +msgid "Can Be Dynamic" +msgstr "Peut être dynamique" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__can_have_dynamic_cols +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__can_have_dynamic_cols +msgid "Can Have Dynamic Cols" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_import_form_view +#, python-format +msgid "Cancel" +msgstr "Annuler" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Change name" +msgstr "Modifier le nom" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__client_id +msgid "Client" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__mode +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__code +msgid "Code" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands +msgid "Commands" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__company_id +msgid "Company" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#, python-format +msgid "Comparisons in pivot are not supprted" +msgstr "Les comparaisons dans les pivots ne sont pas supportées" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Confirm" +msgstr "Valider" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__contributor_ids +msgid "Contributors" +msgstr "Contributeur" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__contributor_group_ids +msgid "Contributors Groups" +msgstr "" + +#. module: spreadsheet_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_new +msgid "Create spreadsheet" +msgstr "Créer un tableur" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__create_uid +msgid "Created by" +msgstr "Créé par" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__create_date +msgid "Created on" +msgstr "Créé le" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Currency" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__datasource_name +msgid "Datasource Name" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Default value" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Delete" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Dimensions" +msgstr "Dimensions" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__display_name +msgid "Display Name" +msgstr "Nom" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Domain" +msgstr "Domaine" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Download XLSX" +msgstr "Télécharger XLSX" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#, python-format +msgid "Duplicated groupbys in pivot are not supprted" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__dynamic_cols +msgid "Dynamic Cols" +msgstr "Colonnes dynamiques" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic_cols +msgid "Dynamic Columns" +msgstr "Colonnes dynamiques" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__dynamic_rows +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic +msgid "Dynamic Rows" +msgstr "Lignes dynamiques" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_tree_view +msgid "Edit" +msgstr "Edition" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Edit domain" +msgstr "Modifier le domaine" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "File" +msgstr "Fichier" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__filename +msgid "Filename" +msgstr "Nom de fichier" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Filters" +msgstr "Filtre" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "From / To" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__group_ids +msgid "Group" +msgstr "Groupe" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__id +msgid "ID" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__company_id +msgid "" +"If set, the spreadsheet will be available only if this company is in the " +"current companies." +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__import_data +msgid "Import Data" +msgstr "Importer des données" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet_import_mode +msgid "Import Mode" +msgstr "Mode d'import" + +#. module: spreadsheet_oca +#: model:ir.actions.act_window,name:spreadsheet_oca.spreadsheet_spreadsheet_import_act_window +msgid "Import Pivot" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet_import +msgid "Import data to spreadsheet" +msgstr "Importer des données au tableur" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Insert dynamic pivot" +msgstr "Insérer un pivot dynamique" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Insert pivot" +msgstr "Insérer un pivot" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__is_tree +msgid "Is Tree" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Label" +msgstr "Étiquette" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__write_uid +msgid "Last Updated by" +msgstr "Dernière mise à jour par" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__write_date +msgid "Last Updated on" +msgstr "Dernière mise à jour le" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Last updated at" +msgstr "Dernière mise à jour à" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Link to Odoo menu" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "List name" +msgstr "" + +#. module: spreadsheet_oca +#: model:res.groups,name:spreadsheet_oca.group_manager +msgid "Manager" +msgstr "Gestionnaire" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Measures" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +#, python-format +msgid "Menu Items" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__mode_id +msgid "Mode" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__model +#, python-format +msgid "Model" +msgstr "Modèle" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Month" +msgstr "Mois" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Month / Quarter" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__name +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Name" +msgstr "Nom" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Next" +msgstr "Suivant" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__next_revision_id +msgid "Next Revision" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__number_of_cols +msgid "Number Of Cols" +msgstr "Nombre de colonnes" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__number_of_rows +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__number_of_rows +msgid "Number Of Rows" +msgstr "Nombre de lignes" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__number_of_cols +msgid "Number of Columns" +msgstr "Nombre de colonnes" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_import_form_view +msgid "OK" +msgstr "OK" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Odoo Spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__owner_id +msgid "Owner" +msgstr "Propriétaire" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Pivot name" +msgstr "Nom du pivot" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Previous" +msgstr "Précédent" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Quarter" +msgstr "" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Read Access" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__reader_ids +msgid "Readers" +msgstr "Lecteurs" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__reader_group_ids +msgid "Readers Groups" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Refresh all data" +msgstr "Mettre à jour les données" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Related model" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Relative Period" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Remove" +msgstr "Supprimer" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__res_id +msgid "Res" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Save" +msgstr "Enregistrer" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_select_row_number +msgid "Select number of rows to duplicate row" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Select the quantity of rows" +msgstr "Sélectionnez la quantité de lignes" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__sequence +msgid "Sequence" +msgstr "Séquence" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__server_revision_id +msgid "Server Revision" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Settings" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-python +#: code:addons/spreadsheet_oca/models/spreadsheet_abstract.py:0 +#, python-format +msgid "Sheet1" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Sorting" +msgstr "Tri" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__spreadsheet_id +#: model:ir.module.category,name:spreadsheet_oca.module_category_spreedsheet +msgid "Spreadsheet" +msgstr "Feuille de calcul" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_oca_revision +msgid "Spreadsheet Oca Revision" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_raw +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_raw +msgid "Spreadsheet Raw" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_revision_ids +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_revision_ids +msgid "Spreadsheet Revision" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_abstract +msgid "Spreadsheet abstract for inheritance" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_binary_data +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_binary_data +msgid "Spreadsheet file" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.actions.act_window,name:spreadsheet_oca.spreadsheet_spreadsheet_act_window +#: model:ir.ui.menu,name:spreadsheet_oca.spreadsheet_spreadsheet_menu +msgid "Spreadsheets" +msgstr "Feuilles de calcul" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Stacked" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic_cols +msgid "" +"This field allows you to generate tables that its cols are updated with the " +"filters set in the spreadsheets." +msgstr "" +"Ce champ vous permet de générer des tableaux dont les colonnes sont mises à " +"jour avec les filtres définis dans les feuilles de calcul." + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic +msgid "" +"This field allows you to generate tables that its rows are updated with the " +"filters set in the spreadsheets." +msgstr "" +"Ce champ vous permet de générer des tableaux dont les lignes sont mises à " +"jour avec les filtres définis dans les feuilles de calcul." + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Time range" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Toggle Dropdown" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__type +msgid "Type" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-python +#: code:addons/spreadsheet_oca/models/spreadsheet_spreadsheet.py:0 +#, python-format +msgid "Unnamed" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.xml:0 +#, python-format +msgid "Upload" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.esm.js:0 +#, python-format +msgid "Upload a Spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#: model:res.groups,name:spreadsheet_oca.group_user +msgid "User" +msgstr "Utilisateur" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Write Access" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Year" +msgstr "Année" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "ascending" +msgstr "Croissant" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "descending" +msgstr "Décroissant" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "name is required" +msgstr "Le nom est requis" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "not updated" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_ir_websocket +msgid "websocket message handling" +msgstr "" + +#~ msgid "Data" +#~ msgstr "Données" + +#~ msgid "Last Modified on" +#~ msgstr "Dernière modification le" diff --git a/spreadsheet_oca/i18n/fr_FR.po b/spreadsheet_oca/i18n/fr_FR.po new file mode 100644 index 00000000..1b009ed1 --- /dev/null +++ b/spreadsheet_oca/i18n/fr_FR.po @@ -0,0 +1,785 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * spreadsheet_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: fr_FR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add date" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add relation" +msgstr "" + +#. module: spreadsheet_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_add_sheet +msgid "Add sheet to spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add text" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/list_controller.xml:0 +#, python-format +msgid "Add to spreadesheet" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/graph_controller.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/list_controller.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml:0 +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_add +#, python-format +msgid "Add to spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "After next" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Are you sure you want to delete this list?" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Are you sure you want to delete this pivot?" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Automatically filter on the current period" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Before Previous" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__can_be_dynamic +msgid "Can Be Dynamic" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__can_have_dynamic_cols +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__can_have_dynamic_cols +msgid "Can Have Dynamic Cols" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_import_form_view +#, python-format +msgid "Cancel" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Change name" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__client_id +msgid "Client" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__mode +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__code +msgid "Code" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands +msgid "Commands" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__company_id +msgid "Company" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#, python-format +msgid "Comparisons in pivot are not supprted" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__contributor_ids +msgid "Contributors" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__contributor_group_ids +msgid "Contributors Groups" +msgstr "" + +#. module: spreadsheet_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_new +msgid "Create spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__create_uid +msgid "Created by" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__create_date +msgid "Created on" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Currency" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__datasource_name +msgid "Datasource Name" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Default value" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Delete" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Dimensions" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__display_name +msgid "Display Name" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Domain" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Download XLSX" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#, python-format +msgid "Duplicated groupbys in pivot are not supprted" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__dynamic_cols +msgid "Dynamic Cols" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic_cols +msgid "Dynamic Columns" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__dynamic_rows +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic +msgid "Dynamic Rows" +msgstr "" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_tree_view +msgid "Edit" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Edit domain" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "File" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__filename +msgid "Filename" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Filters" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "From / To" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__group_ids +msgid "Group" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__id +msgid "ID" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__company_id +msgid "" +"If set, the spreadsheet will be available only if this company is in the " +"current companies." +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__import_data +msgid "Import Data" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet_import_mode +msgid "Import Mode" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.actions.act_window,name:spreadsheet_oca.spreadsheet_spreadsheet_import_act_window +msgid "Import Pivot" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet_import +msgid "Import data to spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Insert dynamic pivot" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Insert pivot" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__is_tree +msgid "Is Tree" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Label" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__write_date +msgid "Last Updated on" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Last updated at" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Link to Odoo menu" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "List name" +msgstr "" + +#. module: spreadsheet_oca +#: model:res.groups,name:spreadsheet_oca.group_manager +msgid "Manager" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Measures" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +#, python-format +msgid "Menu Items" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__mode_id +msgid "Mode" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__model +#, python-format +msgid "Model" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Month" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Month / Quarter" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__name +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Name" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Next" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__next_revision_id +msgid "Next Revision" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__number_of_cols +msgid "Number Of Cols" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__number_of_rows +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__number_of_rows +msgid "Number Of Rows" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__number_of_cols +msgid "Number of Columns" +msgstr "" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_import_form_view +msgid "OK" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Odoo Spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__owner_id +msgid "Owner" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Pivot name" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Previous" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Quarter" +msgstr "" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Read Access" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__reader_ids +msgid "Readers" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__reader_group_ids +msgid "Readers Groups" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Refresh all data" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Related model" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Relative Period" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Remove" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__res_id +msgid "Res" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Save" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_select_row_number +msgid "Select number of rows to duplicate row" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Select the quantity of rows" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__sequence +msgid "Sequence" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__server_revision_id +msgid "Server Revision" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Settings" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-python +#: code:addons/spreadsheet_oca/models/spreadsheet_abstract.py:0 +#, python-format +msgid "Sheet1" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Sorting" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__spreadsheet_id +#: model:ir.module.category,name:spreadsheet_oca.module_category_spreedsheet +msgid "Spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_oca_revision +msgid "Spreadsheet Oca Revision" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_raw +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_raw +msgid "Spreadsheet Raw" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_revision_ids +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_revision_ids +msgid "Spreadsheet Revision" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_abstract +msgid "Spreadsheet abstract for inheritance" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_binary_data +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_binary_data +msgid "Spreadsheet file" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.actions.act_window,name:spreadsheet_oca.spreadsheet_spreadsheet_act_window +#: model:ir.ui.menu,name:spreadsheet_oca.spreadsheet_spreadsheet_menu +msgid "Spreadsheets" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Stacked" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic_cols +msgid "" +"This field allows you to generate tables that its cols are updated with the " +"filters set in the spreadsheets." +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic +msgid "" +"This field allows you to generate tables that its rows are updated with the " +"filters set in the spreadsheets." +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Time range" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Toggle Dropdown" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__type +msgid "Type" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-python +#: code:addons/spreadsheet_oca/models/spreadsheet_spreadsheet.py:0 +#, python-format +msgid "Unnamed" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.xml:0 +#, python-format +msgid "Upload" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.esm.js:0 +#, python-format +msgid "Upload a Spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#: model:res.groups,name:spreadsheet_oca.group_user +msgid "User" +msgstr "" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Write Access" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Year" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "ascending" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "descending" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "name is required" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "not updated" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_ir_websocket +msgid "websocket message handling" +msgstr "" diff --git a/spreadsheet_oca/i18n/it.po b/spreadsheet_oca/i18n/it.po new file mode 100644 index 00000000..7916fe03 --- /dev/null +++ b/spreadsheet_oca/i18n/it.po @@ -0,0 +1,813 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * spreadsheet_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-06-24 09:25+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add date" +msgstr "Aggiungi data" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add relation" +msgstr "Aggiungi relazione" + +#. module: spreadsheet_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_add_sheet +msgid "Add sheet to spreadsheet" +msgstr "Aggiungi scheda a foglIo di calcolo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add text" +msgstr "Aggiungi testo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/list_controller.xml:0 +#, python-format +msgid "Add to spreadesheet" +msgstr "Aggiungi al foglio di calcolo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/graph_controller.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/list_controller.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml:0 +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_add +#, python-format +msgid "Add to spreadsheet" +msgstr "Aggiungi al foglio di calcolo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "After next" +msgstr "Dopo il sucessivo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Are you sure you want to delete this list?" +msgstr "Si è sicuri di voler cancellare questo elenco?" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Are you sure you want to delete this pivot?" +msgstr "Si è sicuri di voler cancellare questa pivot?" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Automatically filter on the current period" +msgstr "Filtra automaticamente sul periodo attuale" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Before Previous" +msgstr "Prima del precedente" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__can_be_dynamic +msgid "Can Be Dynamic" +msgstr "Può essere dinamico" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__can_have_dynamic_cols +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__can_have_dynamic_cols +msgid "Can Have Dynamic Cols" +msgstr "Può avere colonne dinamiche" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_import_form_view +#, python-format +msgid "Cancel" +msgstr "Annulla" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Change name" +msgstr "Modifica nome" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__client_id +msgid "Client" +msgstr "Client" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__mode +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__code +msgid "Code" +msgstr "Codice" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands +msgid "Commands" +msgstr "Comandi" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__company_id +msgid "Company" +msgstr "Azienda" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#, python-format +msgid "Comparisons in pivot are not supprted" +msgstr "Le comparazioni nella vista pivot non sono supportate" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Confirm" +msgstr "Conferma" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__contributor_ids +msgid "Contributors" +msgstr "Contributori" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__contributor_group_ids +msgid "Contributors Groups" +msgstr "Gruppo contributori" + +#. module: spreadsheet_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_new +msgid "Create spreadsheet" +msgstr "Crea foglio di calcolo" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Currency" +msgstr "Valuta" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__datasource_name +msgid "Datasource Name" +msgstr "Nome origine dati" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Default value" +msgstr "Valore predefinito" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Delete" +msgstr "Cancella" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Dimensions" +msgstr "Dimensioni" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Domain" +msgstr "Dominio" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Download XLSX" +msgstr "Scarica XLSX" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#, python-format +msgid "Duplicated groupbys in pivot are not supprted" +msgstr "Nelle viste pivot Non sono supportati i raggruppamenti duplicati" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__dynamic_cols +msgid "Dynamic Cols" +msgstr "Colonne dinamiche" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic_cols +msgid "Dynamic Columns" +msgstr "Colonne dinamiche" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__dynamic_rows +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic +msgid "Dynamic Rows" +msgstr "Righe dinamiche" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_tree_view +msgid "Edit" +msgstr "Modifica" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Edit domain" +msgstr "Modifica dominio" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "File" +msgstr "File" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__filename +msgid "Filename" +msgstr "Nome file" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Filters" +msgstr "Filtri" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "From / To" +msgstr "Da / A" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__group_ids +msgid "Group" +msgstr "Gruppo" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__id +msgid "ID" +msgstr "ID" + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__company_id +msgid "" +"If set, the spreadsheet will be available only if this company is in the " +"current companies." +msgstr "" +"Se impostata, il foglio di lavoro sarà disponibile se l'azienda è nelle " +"aziende attuali." + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__import_data +msgid "Import Data" +msgstr "Importa dati" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet_import_mode +msgid "Import Mode" +msgstr "Modo importazione" + +#. module: spreadsheet_oca +#: model:ir.actions.act_window,name:spreadsheet_oca.spreadsheet_spreadsheet_import_act_window +msgid "Import Pivot" +msgstr "Importa pivot" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet_import +msgid "Import data to spreadsheet" +msgstr "Importa dati nel foglio di calcolo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Insert dynamic pivot" +msgstr "Inserisci pivot dinamico" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Insert pivot" +msgstr "Inserisci pivot" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__is_tree +msgid "Is Tree" +msgstr "È albero" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Label" +msgstr "Etichetta" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Last updated at" +msgstr "Ultimo aggiornamento il" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Link to Odoo menu" +msgstr "Collegamento al menu Odoo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "List name" +msgstr "Nome elenco" + +#. module: spreadsheet_oca +#: model:res.groups,name:spreadsheet_oca.group_manager +msgid "Manager" +msgstr "Supervisore" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Measures" +msgstr "Misure" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +#, python-format +msgid "Menu Items" +msgstr "Menu elementi" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__mode_id +msgid "Mode" +msgstr "Modo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__model +#, python-format +msgid "Model" +msgstr "Modello" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Month" +msgstr "Mese" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Month / Quarter" +msgstr "Mese / Trimestre" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__name +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Name" +msgstr "Nome" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Next" +msgstr "Successiva" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__next_revision_id +msgid "Next Revision" +msgstr "Revisione successiva" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__number_of_cols +msgid "Number Of Cols" +msgstr "Numero di colonne" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__number_of_rows +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__number_of_rows +msgid "Number Of Rows" +msgstr "Numero di righe" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__number_of_cols +msgid "Number of Columns" +msgstr "Numero di colonne" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_import_form_view +msgid "OK" +msgstr "OK" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Odoo Spreadsheet" +msgstr "Foglio di calcolo Odoo" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__owner_id +msgid "Owner" +msgstr "Proprietario" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Pivot name" +msgstr "Nome pivot" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Previous" +msgstr "Precedente" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Quarter" +msgstr "Trimestre" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Read Access" +msgstr "Accesso in lettura" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__reader_ids +msgid "Readers" +msgstr "Lettori" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__reader_group_ids +msgid "Readers Groups" +msgstr "Gruppi lettori" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Refresh all data" +msgstr "Aggiorna tutti i dati" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Related model" +msgstr "Modello correlato" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Relative Period" +msgstr "Periodo relativo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Remove" +msgstr "Rimuovi" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__res_id +msgid "Res" +msgstr "Res" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Save" +msgstr "Salva" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_select_row_number +msgid "Select number of rows to duplicate row" +msgstr "Selezionare il numero di righe per duplicare la riga" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Select the quantity of rows" +msgstr "Selezionare la quantità di righe" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__sequence +msgid "Sequence" +msgstr "Sequenza" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__server_revision_id +msgid "Server Revision" +msgstr "Revisione server" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Settings" +msgstr "Impostazioni" + +#. module: spreadsheet_oca +#. odoo-python +#: code:addons/spreadsheet_oca/models/spreadsheet_abstract.py:0 +#, python-format +msgid "Sheet1" +msgstr "Foglio1" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Sorting" +msgstr "Ordinamento" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__spreadsheet_id +#: model:ir.module.category,name:spreadsheet_oca.module_category_spreedsheet +msgid "Spreadsheet" +msgstr "Foglio di calcolo" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_oca_revision +msgid "Spreadsheet Oca Revision" +msgstr "Revisione OCA foglio di calcolo" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_raw +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_raw +msgid "Spreadsheet Raw" +msgstr "Foglio di calcolo grezzo" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_revision_ids +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_revision_ids +msgid "Spreadsheet Revision" +msgstr "Revisione foglio di calcolo" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_abstract +msgid "Spreadsheet abstract for inheritance" +msgstr "Foglio di calcolo astratto per ereditarietà" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_binary_data +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_binary_data +msgid "Spreadsheet file" +msgstr "File foglio di calcolo" + +#. module: spreadsheet_oca +#: model:ir.actions.act_window,name:spreadsheet_oca.spreadsheet_spreadsheet_act_window +#: model:ir.ui.menu,name:spreadsheet_oca.spreadsheet_spreadsheet_menu +msgid "Spreadsheets" +msgstr "Fogli di calcolo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Stacked" +msgstr "In coda" + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic_cols +msgid "" +"This field allows you to generate tables that its cols are updated with the " +"filters set in the spreadsheets." +msgstr "" +"Questo campo consente di generare tabelle le cui colonne sono aggiornate con " +"i filtri impostati nei fogli di lavoro." + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic +msgid "" +"This field allows you to generate tables that its rows are updated with the " +"filters set in the spreadsheets." +msgstr "" +"Questo campo consente di generare tabelle le cui righe sono aggiornate con i " +"filtri impostati nei fogli di lavoro." + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Time range" +msgstr "Intervallo orario" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Toggle Dropdown" +msgstr "Attiva menu a tendina" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__type +msgid "Type" +msgstr "Tipo" + +#. module: spreadsheet_oca +#. odoo-python +#: code:addons/spreadsheet_oca/models/spreadsheet_spreadsheet.py:0 +#, python-format +msgid "Unnamed" +msgstr "Senza nome" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.xml:0 +#, python-format +msgid "Upload" +msgstr "Carica" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.esm.js:0 +#, python-format +msgid "Upload a Spreadsheet" +msgstr "Carica un foglio di calcolo" + +#. module: spreadsheet_oca +#: model:res.groups,name:spreadsheet_oca.group_user +msgid "User" +msgstr "Utente" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Write Access" +msgstr "Accesso in scrittura" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Year" +msgstr "Anno" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "ascending" +msgstr "crescente" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "descending" +msgstr "decrescente" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "name is required" +msgstr "è richiesto il nome" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "not updated" +msgstr "non aggiornato" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_ir_websocket +msgid "websocket message handling" +msgstr "gestione messaggio websocket" + +#~ msgid "Data" +#~ msgstr "Dati" + +#~ msgid "Last Modified on" +#~ msgstr "Ultima modifica il" + +#, python-format +#~ msgid "Upload XLSX" +#~ msgstr "Carica XLSX" + +#~ msgid "Dynamic" +#~ msgstr "Dinamico" + +#~ msgid "" +#~ "This field allows you to generate tables that are updated with the " +#~ "filters set in the spreadsheets." +#~ msgstr "" +#~ "Questo campo consente di generare tabelle che sono aggiornate con i " +#~ "filtri impostati nel foglio di lavoro." diff --git a/spreadsheet_oca/i18n/nl.po b/spreadsheet_oca/i18n/nl.po new file mode 100644 index 00000000..111f961c --- /dev/null +++ b/spreadsheet_oca/i18n/nl.po @@ -0,0 +1,793 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * spreadsheet_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-10-09 08:25+0000\n" +"Last-Translator: \"Jan Tapper [Onestein]\" \n" +"Language-Team: none\n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add date" +msgstr "Datum toevoegen" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add relation" +msgstr "Relatie toevoegen" + +#. module: spreadsheet_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_add_sheet +msgid "Add sheet to spreadsheet" +msgstr "Blad toevoegen aan spreadsheet" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add text" +msgstr "Tekst toevoegen" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/list_controller.xml:0 +#, python-format +msgid "Add to spreadesheet" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/graph_controller.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/list_controller.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml:0 +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_add +#, python-format +msgid "Add to spreadsheet" +msgstr "Toevoegen aan spreadsheet" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "After next" +msgstr "Na volgende" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Are you sure you want to delete this list?" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Are you sure you want to delete this pivot?" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Automatically filter on the current period" +msgstr "Automatisch filteren op de huidige periode" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Before Previous" +msgstr "Vóór Vorige" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__can_be_dynamic +msgid "Can Be Dynamic" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__can_have_dynamic_cols +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__can_have_dynamic_cols +msgid "Can Have Dynamic Cols" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_import_form_view +#, python-format +msgid "Cancel" +msgstr "Annuleren" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Change name" +msgstr "Verander naam" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__client_id +msgid "Client" +msgstr "Cliënt" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__mode +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__code +msgid "Code" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands +msgid "Commands" +msgstr "Commando's" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__company_id +msgid "Company" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#, python-format +msgid "Comparisons in pivot are not supprted" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Confirm" +msgstr "Bevestigen" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__contributor_ids +msgid "Contributors" +msgstr "Bijdragers" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__contributor_group_ids +msgid "Contributors Groups" +msgstr "" + +#. module: spreadsheet_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_new +msgid "Create spreadsheet" +msgstr "Spreadsheet maken" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__create_uid +msgid "Created by" +msgstr "Gemaakt door" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__create_date +msgid "Created on" +msgstr "Gemaakt op" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Currency" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__datasource_name +msgid "Datasource Name" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Default value" +msgstr "Standaardwaarde" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Delete" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Dimensions" +msgstr "Dimensies" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__display_name +msgid "Display Name" +msgstr "Weergavenaam" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Domain" +msgstr "Domein" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Download XLSX" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#, python-format +msgid "Duplicated groupbys in pivot are not supprted" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__dynamic_cols +msgid "Dynamic Cols" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic_cols +msgid "Dynamic Columns" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__dynamic_rows +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic +msgid "Dynamic Rows" +msgstr "" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_tree_view +msgid "Edit" +msgstr "Bewerking" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Edit domain" +msgstr "Bewerk domein" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "File" +msgstr "Bestand" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__filename +msgid "Filename" +msgstr "Bestandsnaam" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Filters" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "From / To" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__group_ids +msgid "Group" +msgstr "Groep" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__id +msgid "ID" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__company_id +msgid "" +"If set, the spreadsheet will be available only if this company is in the " +"current companies." +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__import_data +msgid "Import Data" +msgstr "Gegevens importeren" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet_import_mode +msgid "Import Mode" +msgstr "Importmodus" + +#. module: spreadsheet_oca +#: model:ir.actions.act_window,name:spreadsheet_oca.spreadsheet_spreadsheet_import_act_window +msgid "Import Pivot" +msgstr "Importeer draaipunt" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet_import +msgid "Import data to spreadsheet" +msgstr "Gegevens importeren naar spreadsheet" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Insert dynamic pivot" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Insert pivot" +msgstr "Draaipunt invoegen" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__is_tree +msgid "Is Tree" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Label" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__write_uid +msgid "Last Updated by" +msgstr "Laatst aangepast door" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__write_date +msgid "Last Updated on" +msgstr "Laatst bijgewerkt op" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Last updated at" +msgstr "Laatst bijgewerkt op" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Link to Odoo menu" +msgstr "Link naar het Odoo-menu" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "List name" +msgstr "Naam van lijst" + +#. module: spreadsheet_oca +#: model:res.groups,name:spreadsheet_oca.group_manager +msgid "Manager" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Measures" +msgstr "Afmetingen" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +#, python-format +msgid "Menu Items" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__mode_id +msgid "Mode" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__model +#, python-format +msgid "Model" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Month" +msgstr "Maand" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Month / Quarter" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__name +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Name" +msgstr "Naam" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Next" +msgstr "Volgende" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__next_revision_id +msgid "Next Revision" +msgstr "Volgende revisie" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__number_of_cols +msgid "Number Of Cols" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__number_of_rows +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__number_of_rows +msgid "Number Of Rows" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__number_of_cols +msgid "Number of Columns" +msgstr "" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_import_form_view +msgid "OK" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Odoo Spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__owner_id +msgid "Owner" +msgstr "Eigenaar" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Pivot name" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Previous" +msgstr "Vorig" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Quarter" +msgstr "Kwartaal" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Read Access" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__reader_ids +msgid "Readers" +msgstr "Lezers" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__reader_group_ids +msgid "Readers Groups" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Refresh all data" +msgstr "Ververs alle gegevens" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Related model" +msgstr "Gerelateerd model" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Relative Period" +msgstr "Relatieve periode" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Remove" +msgstr "Verwijderen" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__res_id +msgid "Res" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Save" +msgstr "Opslaan" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_select_row_number +msgid "Select number of rows to duplicate row" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Select the quantity of rows" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__sequence +msgid "Sequence" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__server_revision_id +msgid "Server Revision" +msgstr "Serverversie" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Settings" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-python +#: code:addons/spreadsheet_oca/models/spreadsheet_abstract.py:0 +#, python-format +msgid "Sheet1" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Sorting" +msgstr "Sortering" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__spreadsheet_id +#: model:ir.module.category,name:spreadsheet_oca.module_category_spreedsheet +msgid "Spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_oca_revision +msgid "Spreadsheet Oca Revision" +msgstr "Spreadsheet Oca-revisie" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_raw +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_raw +msgid "Spreadsheet Raw" +msgstr "Spreadsheet onbewerkt" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_revision_ids +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_revision_ids +msgid "Spreadsheet Revision" +msgstr "Revisie van spreadsheets" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_abstract +msgid "Spreadsheet abstract for inheritance" +msgstr "Spreadsheetsamenvatting voor overerving" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_binary_data +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_binary_data +msgid "Spreadsheet file" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.actions.act_window,name:spreadsheet_oca.spreadsheet_spreadsheet_act_window +#: model:ir.ui.menu,name:spreadsheet_oca.spreadsheet_spreadsheet_menu +msgid "Spreadsheets" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Stacked" +msgstr "Gestapeld" + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic_cols +msgid "" +"This field allows you to generate tables that its cols are updated with the " +"filters set in the spreadsheets." +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic +msgid "" +"This field allows you to generate tables that its rows are updated with the " +"filters set in the spreadsheets." +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Time range" +msgstr "Tijdsbestek" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Toggle Dropdown" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__type +msgid "Type" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-python +#: code:addons/spreadsheet_oca/models/spreadsheet_spreadsheet.py:0 +#, python-format +msgid "Unnamed" +msgstr "Naamloos" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.xml:0 +#, python-format +msgid "Upload" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.esm.js:0 +#, python-format +msgid "Upload a Spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#: model:res.groups,name:spreadsheet_oca.group_user +msgid "User" +msgstr "Gebruiker" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Write Access" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Year" +msgstr "Jaar" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "ascending" +msgstr "oplopend" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "descending" +msgstr "aflopend" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "name is required" +msgstr "Naam is vereist" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "not updated" +msgstr "niet geüpdate" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_ir_websocket +msgid "websocket message handling" +msgstr "afhandeling van websocket-berichten" + +#~ msgid "Data" +#~ msgstr "Gegevens" + +#~ msgid "Last Modified on" +#~ msgstr "Laatst aangepast op" diff --git a/spreadsheet_oca/i18n/pt.po b/spreadsheet_oca/i18n/pt.po new file mode 100644 index 00000000..825d818b --- /dev/null +++ b/spreadsheet_oca/i18n/pt.po @@ -0,0 +1,803 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * spreadsheet_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-08-21 19:57+0000\n" +"Last-Translator: Peter Romão \n" +"Language-Team: none\n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add date" +msgstr "Adicionar data" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add relation" +msgstr "Adicionar relação" + +#. module: spreadsheet_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_add_sheet +msgid "Add sheet to spreadsheet" +msgstr "Adicionar folha ao painel" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add text" +msgstr "Adicionar texto" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/list_controller.xml:0 +#, python-format +msgid "Add to spreadesheet" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/graph_controller.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/list_controller.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml:0 +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_add +#, python-format +msgid "Add to spreadsheet" +msgstr "Adicionar à folha de cálculo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "After next" +msgstr "Depois de a seguir" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Are you sure you want to delete this list?" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Are you sure you want to delete this pivot?" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Automatically filter on the current period" +msgstr "Filtrar automaticamente no período atual" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Before Previous" +msgstr "Antes de Anterior" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__can_be_dynamic +msgid "Can Be Dynamic" +msgstr "Pode Ser Dinâmico" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__can_have_dynamic_cols +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__can_have_dynamic_cols +msgid "Can Have Dynamic Cols" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_import_form_view +#, python-format +msgid "Cancel" +msgstr "Cancelar" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Change name" +msgstr "Mudar Nome" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__client_id +msgid "Client" +msgstr "Cliente" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__mode +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__code +msgid "Code" +msgstr "Código" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands +msgid "Commands" +msgstr "Comandos" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__company_id +msgid "Company" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#, python-format +msgid "Comparisons in pivot are not supprted" +msgstr "Comparações no pivô não são suportadas" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Confirm" +msgstr "Confirmar" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__contributor_ids +msgid "Contributors" +msgstr "Contribuintes" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__contributor_group_ids +msgid "Contributors Groups" +msgstr "" + +#. module: spreadsheet_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_new +msgid "Create spreadsheet" +msgstr "Criar folha de cálculo" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__create_uid +msgid "Created by" +msgstr "Criado por" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__create_date +msgid "Created on" +msgstr "Criado em" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Currency" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__datasource_name +msgid "Datasource Name" +msgstr "Nome da Fonte de Dados" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Default value" +msgstr "Valor predefinido" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Delete" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Dimensions" +msgstr "Dimensões" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__display_name +msgid "Display Name" +msgstr "Nome Apresentado" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Domain" +msgstr "Domínio" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Download XLSX" +msgstr "Descarregar XLSX" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#, python-format +msgid "Duplicated groupbys in pivot are not supprted" +msgstr "Agrupamentos duplicados no pivô não são suportados" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__dynamic_cols +msgid "Dynamic Cols" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic_cols +msgid "Dynamic Columns" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__dynamic_rows +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic +msgid "Dynamic Rows" +msgstr "" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_tree_view +msgid "Edit" +msgstr "Editar" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Edit domain" +msgstr "Editar domínio" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "File" +msgstr "Arquivo" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__filename +msgid "Filename" +msgstr "Nome do Arquivo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Filters" +msgstr "Filtros" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "From / To" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__group_ids +msgid "Group" +msgstr "Grupo" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__id +msgid "ID" +msgstr "ID" + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__company_id +msgid "" +"If set, the spreadsheet will be available only if this company is in the " +"current companies." +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__import_data +msgid "Import Data" +msgstr "Importar Dados" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet_import_mode +msgid "Import Mode" +msgstr "Modo de Importação" + +#. module: spreadsheet_oca +#: model:ir.actions.act_window,name:spreadsheet_oca.spreadsheet_spreadsheet_import_act_window +msgid "Import Pivot" +msgstr "Importar Pivô" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet_import +msgid "Import data to spreadsheet" +msgstr "Importar dados para a folha de cálculo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Insert dynamic pivot" +msgstr "Inserir pivô dinâmico" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Insert pivot" +msgstr "Inserir pivô" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__is_tree +msgid "Is Tree" +msgstr "É Árvore" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Label" +msgstr "Rótulo" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__write_uid +msgid "Last Updated by" +msgstr "Última Modificação por" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__write_date +msgid "Last Updated on" +msgstr "Última Actualização em" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Last updated at" +msgstr "Última Modificação a" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Link to Odoo menu" +msgstr "Link para o menu Odoo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "List name" +msgstr "Nome da lista" + +#. module: spreadsheet_oca +#: model:res.groups,name:spreadsheet_oca.group_manager +msgid "Manager" +msgstr "Gestor" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Measures" +msgstr "Medidas" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +#, python-format +msgid "Menu Items" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__mode_id +msgid "Mode" +msgstr "Modo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__model +#, python-format +msgid "Model" +msgstr "Modelo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Month" +msgstr "Mês" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Month / Quarter" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__name +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Name" +msgstr "Nome" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Next" +msgstr "Próximo" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__next_revision_id +msgid "Next Revision" +msgstr "Próxima Revisão" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__number_of_cols +msgid "Number Of Cols" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__number_of_rows +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__number_of_rows +msgid "Number Of Rows" +msgstr "Número De Linhas" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__number_of_cols +msgid "Number of Columns" +msgstr "" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_import_form_view +msgid "OK" +msgstr "OK" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Odoo Spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__owner_id +msgid "Owner" +msgstr "Dono" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Pivot name" +msgstr "Nome do pivô" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Previous" +msgstr "Anterior" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Quarter" +msgstr "Trimestre" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Read Access" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__reader_ids +msgid "Readers" +msgstr "Leitores" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__reader_group_ids +msgid "Readers Groups" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Refresh all data" +msgstr "Atualizar todos os dados" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Related model" +msgstr "Modelo relacionado" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Relative Period" +msgstr "Período Relativo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Remove" +msgstr "Remover" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__res_id +msgid "Res" +msgstr "Res" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Save" +msgstr "Guardar" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_select_row_number +msgid "Select number of rows to duplicate row" +msgstr "Selecionar o número de linhas para duplicar a linha" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Select the quantity of rows" +msgstr "Selecione a quantidade de linhas" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__sequence +msgid "Sequence" +msgstr "Sequência" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__server_revision_id +msgid "Server Revision" +msgstr "Revisão Servidor" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Settings" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-python +#: code:addons/spreadsheet_oca/models/spreadsheet_abstract.py:0 +#, python-format +msgid "Sheet1" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Sorting" +msgstr "Ordenação" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__spreadsheet_id +#: model:ir.module.category,name:spreadsheet_oca.module_category_spreedsheet +msgid "Spreadsheet" +msgstr "Folha de Cálculo" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_oca_revision +msgid "Spreadsheet Oca Revision" +msgstr "Folha de Cálculo Revisão OCA" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_raw +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_raw +msgid "Spreadsheet Raw" +msgstr "Folha de Cálculo Bruta" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_revision_ids +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_revision_ids +msgid "Spreadsheet Revision" +msgstr "Revisão da Folha de Cálculo" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_abstract +msgid "Spreadsheet abstract for inheritance" +msgstr "Resumo da folha de cálculo para herança" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_binary_data +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_binary_data +msgid "Spreadsheet file" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.actions.act_window,name:spreadsheet_oca.spreadsheet_spreadsheet_act_window +#: model:ir.ui.menu,name:spreadsheet_oca.spreadsheet_spreadsheet_menu +msgid "Spreadsheets" +msgstr "Folhas de Cálculo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Stacked" +msgstr "Empilhados" + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic_cols +msgid "" +"This field allows you to generate tables that its cols are updated with the " +"filters set in the spreadsheets." +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic +msgid "" +"This field allows you to generate tables that its rows are updated with the " +"filters set in the spreadsheets." +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Time range" +msgstr "Intervalo de tempo" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Toggle Dropdown" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__type +msgid "Type" +msgstr "Tipo" + +#. module: spreadsheet_oca +#. odoo-python +#: code:addons/spreadsheet_oca/models/spreadsheet_spreadsheet.py:0 +#, python-format +msgid "Unnamed" +msgstr "Sem Nome" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.xml:0 +#, python-format +msgid "Upload" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.esm.js:0 +#, python-format +msgid "Upload a Spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#: model:res.groups,name:spreadsheet_oca.group_user +msgid "User" +msgstr "Utilizador" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Write Access" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Year" +msgstr "Ano" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "ascending" +msgstr "ascendente" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "descending" +msgstr "descendente" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "name is required" +msgstr "nome é necessário" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "not updated" +msgstr "não atualizado" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_ir_websocket +msgid "websocket message handling" +msgstr "tratamento de mensagens websocket" + +#~ msgid "Data" +#~ msgstr "Data" + +#~ msgid "Last Modified on" +#~ msgstr "Última Modificação em" + +#~ msgid "Dynamic" +#~ msgstr "Dinâmico" + +#~ msgid "" +#~ "This field allows you to generate tables that are updated with the " +#~ "filters set in the spreadsheets." +#~ msgstr "" +#~ "Este campo permite-lhe gerar tabelas que são atualizadas com os filtros " +#~ "definidos nas folhas de cálculo." diff --git a/spreadsheet_oca/i18n/spreadsheet_oca.pot b/spreadsheet_oca/i18n/spreadsheet_oca.pot new file mode 100644 index 00000000..a961e6cc --- /dev/null +++ b/spreadsheet_oca/i18n/spreadsheet_oca.pot @@ -0,0 +1,796 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * spreadsheet_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add date" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add relation" +msgstr "" + +#. module: spreadsheet_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_add_sheet +msgid "Add sheet to spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add text" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/list_controller.xml:0 +#, python-format +msgid "Add to spreadesheet" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/graph_controller.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/graph_controller.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/list_controller.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml:0 +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_add +#, python-format +msgid "Add to spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "After next" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Are you sure you want to delete this list?" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Are you sure you want to delete this pivot?" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Automatically filter on the current period" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Before Previous" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__can_be_dynamic +msgid "Can Be Dynamic" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__can_have_dynamic_cols +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__can_have_dynamic_cols +msgid "Can Have Dynamic Cols" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_import_form_view +#, python-format +msgid "Cancel" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Change name" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__client_id +msgid "Client" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__mode +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__code +msgid "Code" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands +msgid "Commands" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__company_id +msgid "Company" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#, python-format +msgid "Comparisons in pivot are not supprted" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__contributor_ids +msgid "Contributors" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__contributor_group_ids +msgid "Contributors Groups" +msgstr "" + +#. module: spreadsheet_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_new +msgid "Create spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__create_uid +msgid "Created by" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__create_date +msgid "Created on" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Currency" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__datasource_name +msgid "Datasource Name" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Default value" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Delete" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Dimensions" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__display_name +msgid "Display Name" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Domain" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Download XLSX" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#, python-format +msgid "Duplicated groupbys in pivot are not supprted" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__dynamic_cols +msgid "Dynamic Cols" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic_cols +msgid "Dynamic Columns" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__dynamic_rows +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic +msgid "Dynamic Rows" +msgstr "" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_tree_view +msgid "Edit" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Edit domain" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "File" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__filename +msgid "Filename" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Filters" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "From / To" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__group_ids +msgid "Group" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__id +msgid "ID" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__company_id +msgid "" +"If set, the spreadsheet will be available only if this company is in the " +"current companies." +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__import_data +msgid "Import Data" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet_import_mode +msgid "Import Mode" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.actions.act_window,name:spreadsheet_oca.spreadsheet_spreadsheet_import_act_window +msgid "Import Pivot" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet_import +msgid "Import data to spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Insert dynamic pivot" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Insert pivot" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__is_tree +msgid "Is Tree" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Label" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__write_date +msgid "Last Updated on" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Last updated at" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Link to Odoo menu" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "List name" +msgstr "" + +#. module: spreadsheet_oca +#: model:res.groups,name:spreadsheet_oca.group_manager +msgid "Manager" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Measures" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +#, python-format +msgid "Menu Items" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__mode_id +msgid "Mode" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__model +#, python-format +msgid "Model" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Month" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Month / Quarter" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__name +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Name" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Next" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__next_revision_id +msgid "Next Revision" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__number_of_cols +msgid "Number Of Cols" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__number_of_rows +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__number_of_rows +msgid "Number Of Rows" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__number_of_cols +msgid "Number of Columns" +msgstr "" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_import_form_view +msgid "OK" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Odoo Spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__owner_id +msgid "Owner" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Pivot name" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Previous" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Quarter" +msgstr "" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Read Access" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__reader_ids +msgid "Readers" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__reader_group_ids +msgid "Readers Groups" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Refresh all data" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Related model" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Relative Period" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Remove" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__res_id +msgid "Res" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Save" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_select_row_number +msgid "Select number of rows to duplicate row" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Select the quantity of rows" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__sequence +msgid "Sequence" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__server_revision_id +msgid "Server Revision" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Settings" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-python +#: code:addons/spreadsheet_oca/models/spreadsheet_abstract.py:0 +#, python-format +msgid "Sheet1" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Sorting" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__spreadsheet_id +#: model:ir.module.category,name:spreadsheet_oca.module_category_spreedsheet +msgid "Spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_oca_revision +msgid "Spreadsheet Oca Revision" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_raw +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_raw +msgid "Spreadsheet Raw" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_revision_ids +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_revision_ids +msgid "Spreadsheet Revision" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_abstract +msgid "Spreadsheet abstract for inheritance" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_binary_data +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_binary_data +msgid "Spreadsheet file" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.actions.act_window,name:spreadsheet_oca.spreadsheet_spreadsheet_act_window +#: model:ir.ui.menu,name:spreadsheet_oca.spreadsheet_spreadsheet_menu +msgid "Spreadsheets" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Stacked" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic_cols +msgid "" +"This field allows you to generate tables that its cols are updated with the " +"filters set in the spreadsheets." +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic +msgid "" +"This field allows you to generate tables that its rows are updated with the " +"filters set in the spreadsheets." +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Time range" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Toggle Dropdown" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__type +msgid "Type" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-python +#: code:addons/spreadsheet_oca/models/spreadsheet_spreadsheet.py:0 +#, python-format +msgid "Unnamed" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.xml:0 +#, python-format +msgid "Upload" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.esm.js:0 +#, python-format +msgid "Upload a Spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#: model:res.groups,name:spreadsheet_oca.group_user +msgid "User" +msgstr "" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Write Access" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Year" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "ascending" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "descending" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "name is required" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "not updated" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_ir_websocket +msgid "websocket message handling" +msgstr "" diff --git a/spreadsheet_oca/i18n/zh_CN.po b/spreadsheet_oca/i18n/zh_CN.po new file mode 100644 index 00000000..ae7a6c77 --- /dev/null +++ b/spreadsheet_oca/i18n/zh_CN.po @@ -0,0 +1,785 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * spreadsheet_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add date" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add relation" +msgstr "" + +#. module: spreadsheet_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_add_sheet +msgid "Add sheet to spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Add text" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/list_controller.xml:0 +#, python-format +msgid "Add to spreadesheet" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/graph_controller.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/list_controller.xml:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml:0 +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_add +#, python-format +msgid "Add to spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "After next" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Are you sure you want to delete this list?" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Are you sure you want to delete this pivot?" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Automatically filter on the current period" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Before Previous" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__can_be_dynamic +msgid "Can Be Dynamic" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__can_have_dynamic_cols +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__can_have_dynamic_cols +msgid "Can Have Dynamic Cols" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_import_form_view +#, python-format +msgid "Cancel" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Change name" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__client_id +msgid "Client" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__mode +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__code +msgid "Code" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__commands +msgid "Commands" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__company_id +msgid "Company" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#, python-format +msgid "Comparisons in pivot are not supprted" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__contributor_ids +msgid "Contributors" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__contributor_group_ids +msgid "Contributors Groups" +msgstr "" + +#. module: spreadsheet_oca +#: model:spreadsheet.spreadsheet.import.mode,name:spreadsheet_oca.spreadsheet_import_mode_new +msgid "Create spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__create_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__create_uid +msgid "Created by" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__create_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__create_date +msgid "Created on" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Currency" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__datasource_name +msgid "Datasource Name" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Default value" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Delete" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Dimensions" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__display_name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__display_name +msgid "Display Name" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Domain" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Download XLSX" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js:0 +#, python-format +msgid "Duplicated groupbys in pivot are not supprted" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__dynamic_cols +msgid "Dynamic Cols" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic_cols +msgid "Dynamic Columns" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__dynamic_rows +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic +msgid "Dynamic Rows" +msgstr "" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_tree_view +msgid "Edit" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Edit domain" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "File" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__filename +msgid "Filename" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Filters" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "From / To" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__group_ids +msgid "Group" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__id +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__id +msgid "ID" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet__company_id +msgid "" +"If set, the spreadsheet will be available only if this company is in the " +"current companies." +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__import_data +msgid "Import Data" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet_import_mode +msgid "Import Mode" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.actions.act_window,name:spreadsheet_oca.spreadsheet_spreadsheet_import_act_window +msgid "Import Pivot" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet_import +msgid "Import data to spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Insert dynamic pivot" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Insert pivot" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__is_tree +msgid "Is Tree" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Label" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__write_uid +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__write_date +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__write_date +msgid "Last Updated on" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Last updated at" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Link to Odoo menu" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "List name" +msgstr "" + +#. module: spreadsheet_oca +#: model:res.groups,name:spreadsheet_oca.group_manager +msgid "Manager" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Measures" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js:0 +#, python-format +msgid "Menu Items" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__mode_id +msgid "Mode" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__model +#, python-format +msgid "Model" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Month" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Month / Quarter" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__name +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__name +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Name" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Next" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__next_revision_id +msgid "Next Revision" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__number_of_cols +msgid "Number Of Cols" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_select_row_number__number_of_rows +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__number_of_rows +msgid "Number Of Rows" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__number_of_cols +msgid "Number of Columns" +msgstr "" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_import_form_view +msgid "OK" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js:0 +#, python-format +msgid "Odoo Spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__owner_id +msgid "Owner" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Pivot name" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Previous" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Quarter" +msgstr "" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Read Access" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__reader_ids +msgid "Readers" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__reader_group_ids +msgid "Readers Groups" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Refresh all data" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Related model" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Relative Period" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Remove" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__res_id +msgid "Res" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Save" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_select_row_number +msgid "Select number of rows to duplicate row" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "Select the quantity of rows" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import_mode__sequence +msgid "Sequence" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__server_revision_id +msgid "Server Revision" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js:0 +#, python-format +msgid "Settings" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-python +#: code:addons/spreadsheet_oca/models/spreadsheet_abstract.py:0 +#, python-format +msgid "Sheet1" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Sorting" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_spreadsheet +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet_import__spreadsheet_id +#: model:ir.module.category,name:spreadsheet_oca.module_category_spreedsheet +msgid "Spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_oca_revision +msgid "Spreadsheet Oca Revision" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_raw +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_raw +msgid "Spreadsheet Raw" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_revision_ids +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_revision_ids +msgid "Spreadsheet Revision" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_spreadsheet_abstract +msgid "Spreadsheet abstract for inheritance" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_abstract__spreadsheet_binary_data +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_spreadsheet__spreadsheet_binary_data +msgid "Spreadsheet file" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.actions.act_window,name:spreadsheet_oca.spreadsheet_spreadsheet_act_window +#: model:ir.ui.menu,name:spreadsheet_oca.spreadsheet_spreadsheet_menu +msgid "Spreadsheets" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Stacked" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic_cols +msgid "" +"This field allows you to generate tables that its cols are updated with the " +"filters set in the spreadsheets." +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,help:spreadsheet_oca.field_spreadsheet_spreadsheet_import__dynamic +msgid "" +"This field allows you to generate tables that its rows are updated with the " +"filters set in the spreadsheets." +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Time range" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Toggle Dropdown" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model.fields,field_description:spreadsheet_oca.field_spreadsheet_oca_revision__type +msgid "Type" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-python +#: code:addons/spreadsheet_oca/models/spreadsheet_spreadsheet.py:0 +#, python-format +msgid "Unnamed" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.xml:0 +#, python-format +msgid "Upload" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet_tree/spreadsheet_tree_view.esm.js:0 +#, python-format +msgid "Upload a Spreadsheet" +msgstr "" + +#. module: spreadsheet_oca +#: model:res.groups,name:spreadsheet_oca.group_user +msgid "User" +msgstr "" + +#. module: spreadsheet_oca +#: model_terms:ir.ui.view,arch_db:spreadsheet_oca.spreadsheet_spreadsheet_form_view +msgid "Write Access" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "Year" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "ascending" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "descending" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml:0 +#, python-format +msgid "name is required" +msgstr "" + +#. module: spreadsheet_oca +#. odoo-javascript +#: code:addons/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js:0 +#, python-format +msgid "not updated" +msgstr "" + +#. module: spreadsheet_oca +#: model:ir.model,name:spreadsheet_oca.model_ir_websocket +msgid "websocket message handling" +msgstr "" diff --git a/spreadsheet_oca/models/__init__.py b/spreadsheet_oca/models/__init__.py new file mode 100644 index 00000000..60d31886 --- /dev/null +++ b/spreadsheet_oca/models/__init__.py @@ -0,0 +1,5 @@ +from . import spreadsheet_abstract +from . import spreadsheet_spreadsheet +from . import spreadsheet_oca_revision +from . import ir_websocket +from . import spreadsheet_spreadsheet_import_mode diff --git a/spreadsheet_oca/models/ir_websocket.py b/spreadsheet_oca/models/ir_websocket.py new file mode 100644 index 00000000..005f41c5 --- /dev/null +++ b/spreadsheet_oca/models/ir_websocket.py @@ -0,0 +1,66 @@ +# Copyright 2023 CreuBlanca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import re + +from odoo import models +from odoo.exceptions import AccessDenied + + +class IrWebsocket(models.AbstractModel): + _inherit = "ir.websocket" + + def _build_bus_channel_list(self, channels): + """ + With this change we are adding an extra layer of security. + Without it, any user was able to sniff how all happened using something like: + + const any_spreadsheet_id = 1234; + const channel = "spreadsheet_oca;spreadsheet.spreadsheet" + + ";" + any_spreadsheet_id; + bus_service.addChannel(channel); + bus_service.addEventListener( + "spreadsheet_oca", + (message) => /* every revision arrives here */ + ) + + """ + if self.env.uid: + # Do not alter original list. + channels = list(channels) + for channel in channels: + if isinstance(channel, str): + match = re.match(r"spreadsheet_oca;(\w+(?:\.\w+)*);(\d+)", channel) + if match: + model_name = match[1] + res_id = int(match[2]) + + # Verify access to the edition channel. + if not self.env.user._is_internal(): + raise AccessDenied() + + if not self.env["ir.model.access"].check( + model_name, "read", raise_exception=False + ): + continue + # If user don't have access to the model, we don't even try to + # read + + document = self.env[model_name].search( + [("id", "=", res_id)], limit=1 + ) + # We do a search in order to apply the access rules. + # We just need to ensure that the user can read it + + if not document.exists(): + continue + + channels.append( + ( + self.env.registry.db_name, + model_name, + res_id, + "spreadsheet_oca", + ) + ) + return super()._build_bus_channel_list(channels) diff --git a/spreadsheet_oca/models/spreadsheet_abstract.py b/spreadsheet_oca/models/spreadsheet_abstract.py new file mode 100644 index 00000000..c43be6bb --- /dev/null +++ b/spreadsheet_oca/models/spreadsheet_abstract.py @@ -0,0 +1,178 @@ +# Copyright 2022 CreuBlanca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import base64 +import json +from typing import Any + +from odoo import _, api, fields, models +from odoo.exceptions import AccessError + +CollaborationMessage = dict[str, Any] + + +class SpreadsheetAbstract(models.AbstractModel): + _name = "spreadsheet.abstract" + _description = "Spreadsheet abstract for inheritance" + _inherit = ["bus.listener.mixin"] + + name = fields.Char(required=True) + spreadsheet_binary_data = fields.Binary( + string="Spreadsheet file", + default=lambda self: self._empty_spreadsheet_data_base64(), + ) + spreadsheet_raw = fields.Serialized( + inverse="_inverse_spreadsheet_raw", compute="_compute_spreadsheet_raw" + ) + spreadsheet_revision_ids = fields.One2many( + "spreadsheet.oca.revision", + inverse_name="res_id", + domain=lambda r: [("model", "=", r._name)], + ) + + @api.depends("spreadsheet_binary_data") + def _compute_spreadsheet_raw(self): + for dashboard in self: + if dashboard.spreadsheet_binary_data: + dashboard.spreadsheet_raw = json.loads( + base64.decodebytes(dashboard.spreadsheet_binary_data).decode( + "UTF-8" + ) + ) + else: + dashboard.spreadsheet_raw = {} + + def _inverse_spreadsheet_raw(self): + for record in self: + record.spreadsheet_binary_data = base64.encodebytes( + json.dumps(record.spreadsheet_raw).encode("UTF-8") + ) + + def _empty_spreadsheet_data_base64(self): + """Create an empty spreadsheet workbook. + Encoded as base64 + """ + data = json.dumps(self._empty_spreadsheet_data()) + return base64.b64encode(data.encode()) + + def _empty_spreadsheet_data(self): + """Create an empty spreadsheet workbook. + The sheet name should be the same for all users to allow consistent references + in formulas. It is translated for the user creating the spreadsheet. + """ + lang = self.env["res.lang"]._lang_get(self.env.user.lang) + locale = lang._odoo_lang_to_spreadsheet_locale() + return { + "version": 1, + "sheets": [ + { + "id": "sheet1", + "name": _("Sheet1"), + } + ], + "settings": { + "locale": locale, + }, + "revisionId": "START_REVISION", + } + + def get_spreadsheet_data(self): + self.ensure_one() + mode = "normal" + try: + self.check_access("write") + except AccessError: + mode = "readonly" + return { + "name": self.name, + "spreadsheet_raw": self.spreadsheet_raw, + "revisions": [ + dict( + json.loads(revision.commands), + nextRevisionId=revision.next_revision_id, + serverRevisionId=revision.server_revision_id, + ) + for revision in self.spreadsheet_revision_ids + ], + "mode": mode, + "default_currency": self.env[ + "res.currency" + ].get_company_currency_for_spreadsheet(), + "user_locale": self.env["res.lang"]._get_user_spreadsheet_locale(), + } + + def open_spreadsheet(self): + self.ensure_one() + return { + "type": "ir.actions.client", + "tag": "action_spreadsheet_oca", + "params": {"spreadsheet_id": self.id, "model": self._name}, + } + + def send_spreadsheet_message( + self, message: CollaborationMessage, access_token=None + ): + self.ensure_one() + if message["type"] in ["REVISION_UNDONE", "REMOTE_REVISION", "REVISION_REDONE"]: + self._check_access_spreadsheet("write") + self.env["spreadsheet.oca.revision"].create( + { + "model": self._name, + "res_id": self.id, + "type": message["type"], + "client_id": message.get("clientId"), + "next_revision_id": message["nextRevisionId"], + "server_revision_id": message["serverRevisionId"], + "commands": json.dumps( + self._build_spreadsheet_revision_commands_data(message) + ), + } + ) + self._bus_send( + "notification", dict(message, id=self.id), subchannel="spreadsheet_oca" + ) + return True + elif message["type"] == "SNAPSHOT": + self._check_access_spreadsheet("write") + self.env["spreadsheet.oca.revision"].create( + { + "model": self._name, + "res_id": self.id, + "type": message["type"], + "client_id": message.get("clientId"), + "next_revision_id": message["nextRevisionId"], + "server_revision_id": message["serverRevisionId"], + "commands": json.dumps( + self._build_spreadsheet_revision_commands_data(message) + ), + } + ) + return True + elif message["type"] in ["CLIENT_JOINED", "CLIENT_LEFT", "CLIENT_MOVED"]: + self._check_access_spreadsheet("read") + self._bus_send( + "notification", dict(message, id=self.id), subchannel="spreadsheet_oca" + ) + return True + return False + + def _check_access_spreadsheet(self, operation: str): + try: + self.check_access(operation) + except AccessError as e: + raise e + return True + + @api.model + def _build_spreadsheet_revision_commands_data(self, message): + """Prepare spreadsheet revision commands data from the message""" + commands = dict(message) + commands.pop("serverRevisionId", None) + commands.pop("nextRevisionId", None) + commands.pop("clientId", None) + return commands + + def write(self, vals): + if "spreadsheet_raw" in vals: + self.spreadsheet_revision_ids.unlink() + return super().write(vals) diff --git a/spreadsheet_oca/models/spreadsheet_oca_revision.py b/spreadsheet_oca/models/spreadsheet_oca_revision.py new file mode 100644 index 00000000..b445b598 --- /dev/null +++ b/spreadsheet_oca/models/spreadsheet_oca_revision.py @@ -0,0 +1,17 @@ +# Copyright 2022 CreuBlanca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class SpreadsheetOcaRevision(models.Model): + _name = "spreadsheet.oca.revision" + _description = "Spreadsheet Oca Revision" # TODO + + model = fields.Char(required=True) + res_id = fields.Integer(required=True, index=True) + type = fields.Char() + client_id = fields.Char() + server_revision_id = fields.Char() + next_revision_id = fields.Char() + commands = fields.Char() diff --git a/spreadsheet_oca/models/spreadsheet_spreadsheet.py b/spreadsheet_oca/models/spreadsheet_spreadsheet.py new file mode 100644 index 00000000..86263f8d --- /dev/null +++ b/spreadsheet_oca/models/spreadsheet_spreadsheet.py @@ -0,0 +1,91 @@ +# Copyright 2022 CreuBlanca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import base64 +import zipfile +from io import BytesIO + +from odoo import _, api, fields, models + + +class SpreadsheetSpreadsheet(models.Model): + _name = "spreadsheet.spreadsheet" + _inherit = "spreadsheet.abstract" + _description = "Spreadsheet" + + filename = fields.Char(compute="_compute_filename") + owner_id = fields.Many2one( + "res.users", required=True, default=lambda r: r.env.user.id + ) + contributor_ids = fields.Many2many( + "res.users", + relation="spreadsheet_contributor", + column1="spreadsheet_id", + column2="user_id", + string="Contributors", + ) + contributor_group_ids = fields.Many2many( + "res.groups", + relation="spreadsheet_group_contributor", + column1="spreadsheet_id", + column2="group_id", + string="Contributors Groups", + ) + reader_ids = fields.Many2many( + "res.users", + relation="spreadsheet_reader", + column1="spreadsheet_id", + column2="user_id", + string="Readers", + ) + reader_group_ids = fields.Many2many( + "res.groups", + relation="spreadsheet_group_reader", + column1="spreadsheet_id", + column2="group_id", + string="Readers Groups", + ) + company_id = fields.Many2one( + comodel_name="res.company", + help="If set, the spreadsheet will be available only" + " if this company is in the current companies.", + ) + + @api.depends("name") + def _compute_filename(self): + for record in self: + record.filename = "%s.json" % (self.name or _("Unnamed")) + + def create_document_from_attachment(self, attachment_ids): + attachments = self.env["ir.attachment"].browse(attachment_ids) + spreadsheets = self.env["spreadsheet.spreadsheet"] + for attachment in attachments: + extracted = {} + with zipfile.ZipFile( + BytesIO(base64.b64decode(attachment.datas)), "r" + ) as xlsx: + # List and filter for XML and REL files + xml_files = [ + f + for f in xlsx.namelist() + if f.endswith(".xml") or f.endswith(".rels") + ] + # Extract each file + for xml_file in xml_files: + # Read the XML file into memory + with xlsx.open(xml_file) as file: + extracted[xml_file] = file.read().decode("UTF8") + spreadsheets |= self.create( + { + "spreadsheet_raw": extracted, + "name": attachment.name, + } + ) + attachments.unlink() + if len(spreadsheets) == 1: + return spreadsheets.get_formview_action() + action = self.env["ir.actions.act_window"]._for_xml_id( + "spreadsheet_oca.spreadsheet_spreadsheet_act_window" + ) + action["domain"] = [("id", "in", spreadsheets.ids)] + return action diff --git a/spreadsheet_oca/models/spreadsheet_spreadsheet_import_mode.py b/spreadsheet_oca/models/spreadsheet_spreadsheet_import_mode.py new file mode 100644 index 00000000..63f19019 --- /dev/null +++ b/spreadsheet_oca/models/spreadsheet_spreadsheet_import_mode.py @@ -0,0 +1,16 @@ +# Copyright 2022 CreuBlanca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class SpreadsheetSpreadsheetImportMode(models.Model): + _name = "spreadsheet.spreadsheet.import.mode" + _description = "Import Mode" + _order = "sequence asc" + _rec_name = "name" + + sequence = fields.Integer(default=20) + name = fields.Char(required=True, translate=True) + code = fields.Char(required=True) + group_ids = fields.Many2many("res.groups") diff --git a/spreadsheet_oca/pyproject.toml b/spreadsheet_oca/pyproject.toml new file mode 100644 index 00000000..4231d0cc --- /dev/null +++ b/spreadsheet_oca/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/spreadsheet_oca/readme/CONTRIBUTORS.md b/spreadsheet_oca/readme/CONTRIBUTORS.md new file mode 100644 index 00000000..b262cef9 --- /dev/null +++ b/spreadsheet_oca/readme/CONTRIBUTORS.md @@ -0,0 +1,5 @@ +- Enric Tobella +- [Tecnativa](https://www.tecnativa.com): + - Carlos Roca +- [Open User Systems](https://www.openusersystems.com): + - Chris Mann \ No newline at end of file diff --git a/spreadsheet_oca/readme/DESCRIPTION.md b/spreadsheet_oca/readme/DESCRIPTION.md new file mode 100644 index 00000000..afee06c5 --- /dev/null +++ b/spreadsheet_oca/readme/DESCRIPTION.md @@ -0,0 +1,5 @@ +This module adds a functionality for adding and editing Spreadsheets +using Odoo CE. + +It is an alternative to the proprietary module `spreadsheet_edition` of +Odoo Enterprise Edition. diff --git a/spreadsheet_oca/readme/DEVELOP.md b/spreadsheet_oca/readme/DEVELOP.md new file mode 100644 index 00000000..0afb4a08 --- /dev/null +++ b/spreadsheet_oca/readme/DEVELOP.md @@ -0,0 +1,3 @@ +If you want to develop custom business functions, you can add others, +based on the file + diff --git a/spreadsheet_oca/readme/ROADMAP.md b/spreadsheet_oca/readme/ROADMAP.md new file mode 100644 index 00000000..df941c4d --- /dev/null +++ b/spreadsheet_oca/readme/ROADMAP.md @@ -0,0 +1,6 @@ +## Adding new lines on pivot tables + +When we add a pivot table, the number of rows is predefined according to +the current data. + +In order to add new rows, we need to reinsert the pivot table. diff --git a/spreadsheet_oca/readme/USAGE.md b/spreadsheet_oca/readme/USAGE.md new file mode 100644 index 00000000..ec8d7945 --- /dev/null +++ b/spreadsheet_oca/readme/USAGE.md @@ -0,0 +1,71 @@ +## **Create a new spreadsheet** + +- Go to 'Spreadsheet' menu +- Click on 'Create' +- Put a name, then click on the "Edit" button + +![](../static/description/spreadsheet_create.png) + +- At this point you switch to spreadsheet editing mode. The editor is + named `o-spreadsheet` and looks like another common spreadsheet web + editors. (OnlyOffice, Ethercalc, Google Sheets (non-free)). + +![](../static/description/spreadsheet_edit.png) + +- You can use common functions `SUM()`, `AVERAGE()`, etc. in the cells. + For a complete list of functions and their syntax, Refer to the + documentation or go to + and click on "Insert \> + Function". + +![](../static/description/o-spreadsheet.png) + +- Note: Business Odoo module can add "business functions". This is + currently the case for the accounting module, which adds the following + features: + + > - `ODOO.CREDIT(account_codes, date_range)`: Get the total credit for + > the specified account(s) and period. + > - `ODOO.DEBIT(account_codes, date_range)`: Get the total debit for + > the specified account(s) and period. + > - `ODOO.BALANCE(account_codes, date_range)`: Get the total balance + > for the specified account(s) and period. + > - `ODOO.FISCALYEAR.START(day)`: Returns the starting date of the + > fiscal year encompassing the provided date. + > - `ODOO.FISCALYEAR.END(day)`: Returns the ending date of the fiscal + > year encompassing the provided date. + > - `ODOO.ACCOUNT.GROUP(type)`: Returns the account ids of a given + > group where type should be a value of the `account_type` field of + > `account.account` model. (`income`, `asset_receivable`, etc.) + +## **Create a new dynamic spreadsheet from pivot** + +- Go to any pivot +- Press on insert button +- Select the dynamic rows or dynamic columns option and set a number of + rows/columns + +A new table that will be updated with the actual or filtered values will +be added. + +- Note: When a pivot has multiple levels of aggrupations in the rows or + the columns, the number of rows/columns selected will be transfered to + each level. + + Example: number of groups -\> 2 number of rows -\> 3 + + - val1 + - subval1.1 + - subval1.2 + - subval1.3 + - val2 + - subval2.1 + - subval2.2 + - subval2.3 + - val3 + - subval3.1 + - subval3.2 + - subval3.3 + +Here is a visual exaple of use: .. figure:: +../static/description/spreadsheetdynamic_table.gif diff --git a/spreadsheet_oca/security/ir.model.access.csv b/spreadsheet_oca/security/ir.model.access.csv new file mode 100644 index 00000000..f25d2e12 --- /dev/null +++ b/spreadsheet_oca/security/ir.model.access.csv @@ -0,0 +1,6 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_spreadsheet_spreadsheet,access_spreadsheet_spreadsheet,model_spreadsheet_spreadsheet,group_user,1,1,1,1 +access_spreadsheet_oca_revision,access_spreadsheet_oca_revision,model_spreadsheet_oca_revision,base.group_user,1,1,1,1 +spreadsheet_oca.access_spreadsheet_spreadsheet_import,access_spreadsheet_spreadsheet_import,spreadsheet_oca.model_spreadsheet_spreadsheet_import,base.group_user,1,1,1,1 +access_spreadsheet_import_mode,access_spreadsheet_oca_revision,model_spreadsheet_spreadsheet_import_mode,base.group_user,1,0,0,0 +access_spreadsheet_select_row_number,access_spreadsheet_select_row_number,model_spreadsheet_select_row_number,base.group_user,1,1,1,1 diff --git a/spreadsheet_oca/security/security.xml b/spreadsheet_oca/security/security.xml new file mode 100644 index 00000000..aa94100a --- /dev/null +++ b/spreadsheet_oca/security/security.xml @@ -0,0 +1,65 @@ + + + + + Spreadsheet + 99 + + + User + + + + Manager + + + + + + Spreadsheet Company Rule + + [('company_id', 'in', company_ids + [False])] + + + Spreadsheet Owner + + + [('owner_id','=', user.id)] + + + Spreadsheet Contributor + + + ['|', ('contributor_ids','=', user.id), ('contributor_group_ids','in', user.groups_id.ids)] + + + + + Spreadsheet Reader + + + ['|', ('reader_ids','=', user.id), ('reader_group_ids','in', user.groups_id.ids)] + + + + + + Spreadsheet Manager + + + [(1,'=', 1)] + + + Spreadsheet Import mode + + [('group_ids','in', user.groups_id.ids)] + + diff --git a/spreadsheet_oca/static/description/icon.png b/spreadsheet_oca/static/description/icon.png new file mode 100644 index 00000000..34b37aba Binary files /dev/null and b/spreadsheet_oca/static/description/icon.png differ diff --git a/spreadsheet_oca/static/description/icon.svg b/spreadsheet_oca/static/description/icon.svg new file mode 100644 index 00000000..ba496774 --- /dev/null +++ b/spreadsheet_oca/static/description/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/spreadsheet_oca/static/description/index.html b/spreadsheet_oca/static/description/index.html new file mode 100644 index 00000000..b9fe162e --- /dev/null +++ b/spreadsheet_oca/static/description/index.html @@ -0,0 +1,549 @@ + + + + + +Spreadsheet Oca + + + +
+

Spreadsheet Oca

+ + +

Beta License: AGPL-3 OCA/spreadsheet Translate me on Weblate Try me on Runboat

+

This module adds a functionality for adding and editing Spreadsheets +using Odoo CE.

+

It is an alternative to the proprietary module spreadsheet_edition +of Odoo Enterprise Edition.

+

Table of contents

+ +
+

Usage

+
+

Create a new spreadsheet

+
    +
  • Go to ‘Spreadsheet’ menu
  • +
  • Click on ‘Create’
  • +
  • Put a name, then click on the “Edit” button
  • +
+

image1

+
    +
  • At this point you switch to spreadsheet editing mode. The editor is +named o-spreadsheet and looks like another common spreadsheet web +editors. (OnlyOffice, Ethercalc, Google Sheets (non-free)).
  • +
+

image2

+ +

image3

+
    +
  • Note: Business Odoo module can add “business functions”. This is +currently the case for the accounting module, which adds the +following features:

    +
    +
      +
    • ODOO.CREDIT(account_codes, date_range): Get the total +credit for the specified account(s) and period.
    • +
    • ODOO.DEBIT(account_codes, date_range): Get the total debit +for the specified account(s) and period.
    • +
    • ODOO.BALANCE(account_codes, date_range): Get the total +balance for the specified account(s) and period.
    • +
    • ODOO.FISCALYEAR.START(day): Returns the starting date of +the fiscal year encompassing the provided date.
    • +
    • ODOO.FISCALYEAR.END(day): Returns the ending date of the +fiscal year encompassing the provided date.
    • +
    • ODOO.ACCOUNT.GROUP(type): Returns the account ids of a +given group where type should be a value of the +account_type field of account.account model. +(income, asset_receivable, etc.)
    • +
    +
    +
  • +
+
+
+

Create a new dynamic spreadsheet from pivot

+
    +
  • Go to any pivot
  • +
  • Press on insert button
  • +
  • Select the dynamic rows or dynamic columns option and set a number of +rows/columns
  • +
+

A new table that will be updated with the actual or filtered values will +be added.

+
    +
  • Note: When a pivot has multiple levels of aggrupations in the rows or +the columns, the number of rows/columns selected will be transfered +to each level.

    +

    Example: number of groups -> 2 number of rows -> 3

    +
      +
    • val1
        +
      • subval1.1
      • +
      • subval1.2
      • +
      • subval1.3
      • +
      +
    • +
    • val2
        +
      • subval2.1
      • +
      • subval2.2
      • +
      • subval2.3
      • +
      +
    • +
    • val3
        +
      • subval3.1
      • +
      • subval3.2
      • +
      • subval3.3
      • +
      +
    • +
    +
  • +
+

https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/Hhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/rhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ihttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/shttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ahttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/vhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ihttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/shttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/uhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ahttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/lhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/xhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ahttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/phttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/lhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ohttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/fhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/uhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/shttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/:https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/.https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/.https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/fhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ihttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ghttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/uhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/rhttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ehttps://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/:https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/:https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/ +https://raw.githubusercontent.com/OCA/spreadsheet/18.0/spreadsheet_oca/../static/description/spreadsheetdynamic_table.gif

+
+
+
+

Development

+

If you want to develop custom business functions, you can add others, +based on the file +https://github.com/odoo/odoo/blob/16.0/addons/spreadsheet_account/static/src/accounting_functions.js

+
+
+

Known issues / Roadmap

+
+

Adding new lines on pivot tables

+

When we add a pivot table, the number of rows is predefined according to +the current data.

+

In order to add new rows, we need to reinsert the pivot table.

+
+
+
+

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 to smash it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • CreuBlanca
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

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

+

This module is part of the OCA/spreadsheet project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/spreadsheet_oca/static/description/o-spreadsheet.png b/spreadsheet_oca/static/description/o-spreadsheet.png new file mode 100644 index 00000000..5d8c9e28 Binary files /dev/null and b/spreadsheet_oca/static/description/o-spreadsheet.png differ diff --git a/spreadsheet_oca/static/description/spreadsheet_create.png b/spreadsheet_oca/static/description/spreadsheet_create.png new file mode 100644 index 00000000..7e94ba1d Binary files /dev/null and b/spreadsheet_oca/static/description/spreadsheet_create.png differ diff --git a/spreadsheet_oca/static/description/spreadsheet_dynamic_table.gif b/spreadsheet_oca/static/description/spreadsheet_dynamic_table.gif new file mode 100644 index 00000000..2beb7324 Binary files /dev/null and b/spreadsheet_oca/static/description/spreadsheet_dynamic_table.gif differ diff --git a/spreadsheet_oca/static/description/spreadsheet_edit.png b/spreadsheet_oca/static/description/spreadsheet_edit.png new file mode 100644 index 00000000..e4a57314 Binary files /dev/null and b/spreadsheet_oca/static/description/spreadsheet_edit.png differ diff --git a/spreadsheet_oca/static/src/pivot/pivot_table.esm.js b/spreadsheet_oca/static/src/pivot/pivot_table.esm.js new file mode 100644 index 00000000..0ce658c8 --- /dev/null +++ b/spreadsheet_oca/static/src/pivot/pivot_table.esm.js @@ -0,0 +1,66 @@ +/* Copyright 2024 Tecnativa - Carlos Roca + * License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). */ +import {SpreadsheetPivotTable} from "@odoo/o-spreadsheet"; +import {patch} from "@web/core/utils/patch"; + +patch(SpreadsheetPivotTable.prototype, { + get _dynamic_cols() { + return this._cols[this._cols.length - 1] === "dynamic_cols"; + }, + getNumberOfMeasures() { + if (this._dynamic_cols) { + // We have disabled the computation of the last column to prevent showing + // the totalization of the columns when they are of a dynamic type. If + // shown, it would display the total of all records corresponding to the + // row, rather than what is being displayed on the screen. + return 1; + } + return this._super(...arguments); + }, + getColHeaders() { + if (this._dynamic_cols) { + // We return a copy of this._cols without the last entry of the array, + // which indicates that these are dynamic columns. + var cols = [...this._cols]; + cols.pop(); + return cols; + } + return this._super(...arguments); + }, + getMeasureHeaders() { + if (this._dynamic_cols) { + return this._cols[this._cols.length - 2]; + } + return this._super(...arguments); + }, + getColWidth() { + if (this._dynamic_cols) { + return this._cols[this._cols.length - 2].length; + } + return this._super(...arguments); + }, + getColHeight() { + if (this._dynamic_cols) { + return this._cols.length - 1; + } + return this._super(...arguments); + }, + getColMeasureIndex(values) { + if (this._dynamic_cols) { + var cols = [...this._cols]; + cols.pop(); + const vals = JSON.stringify(values); + const maxLength = Math.max(...cols.map((col) => col.length)); + for (let i = 0; i < maxLength; i++) { + const cellValues = cols.map((col) => + JSON.stringify((col[i] || {}).values) + ); + if (cellValues.includes(vals)) { + return i; + } + } + return -1; + } + return this._super(...arguments); + }, +}); diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panel.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panel.esm.js new file mode 100644 index 00000000..b6a1d23b --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panel.esm.js @@ -0,0 +1,41 @@ +import * as spreadsheet from "@odoo/o-spreadsheet"; +import {patch} from "@web/core/utils/patch"; + +const {chartRegistry} = spreadsheet.registries; +const {ChartPanel} = spreadsheet.components; +export function isOdooKey(code) { + return code.startsWith("odoo_"); +} + +patch(ChartPanel.prototype, { + get chartTypes() { + return this.filterChartTypes(isOdooKey(this.getChartDefinition().type)); + }, + + filterChartTypes(isOdoo) { + var result = {}; + for (const key of chartRegistry.getKeys()) { + if ((isOdoo && isOdooKey(key)) || (!isOdoo && !isOdooKey(key))) { + result[key] = chartRegistry.get(key).name; + } + } + return result; + }, + onTypeChange(type) { + if (isOdooKey(this.getChartDefinition().type)) { + const definition = { + stacked: false, + verticalAxisPosition: "left", + ...this.env.model.getters.getChartDefinition(this.figureId), + type, + }; + this.env.model.dispatch("UPDATE_CHART", { + definition, + id: this.figureId, + sheetId: this.env.model.getters.getActiveSheetId(), + }); + } else { + super.onTypeChange(type); + } + }, +}); diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js new file mode 100644 index 00000000..e42f6706 --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/chart_panels.esm.js @@ -0,0 +1,109 @@ +import * as spreadsheet from "@odoo/o-spreadsheet"; +import {Domain} from "@web/core/domain"; +import {Many2XAutocomplete} from "@web/views/fields/relational_utils"; +import {_t} from "@web/core/l10n/translation"; +import {patch} from "@web/core/utils/patch"; +import {useService} from "@web/core/utils/hooks"; + +const { + GenericChartConfigPanel, + LineConfigPanel, + BarConfigPanel, + ScorecardChartConfigPanel, + GaugeChartConfigPanel, +} = spreadsheet.components; + +const menuChartProps = { + setup() { + super.setup(...arguments); + this.menus = useService("menu"); + }, + get menuProps() { + const menu = this.env.model.getters.getChartOdooMenu(this.props.figureId); + var result = { + fieldString: _t("Menu Items"), + resModel: "ir.ui.menu", + update: this.updateMenu.bind(this), + activeActions: {}, + getDomain: this.getDomain.bind(this), + }; + if (menu) { + result.value = menu.name; + result.id = menu.id; + } + return result; + }, + + getDomain() { + const menus = this.menus + .getAll() + .map((menu) => menu.id) + .filter((menuId) => menuId !== "root"); + return [["id", "in", menus]]; + }, + get menuId() { + const menu = this.env.model.getters.getChartOdooMenu(this.props.figureId); + if (menu) { + return [menu.id, menu.name]; + } + return false; + }, + updateMenu(menuId) { + if (!menuId) { + this.env.model.dispatch("LINK_ODOO_MENU_TO_CHART", { + chartId: this.props.figureId, + odooMenuId: false, + }); + return; + } + const menu = this.env.model.getters.getIrMenu(menuId[0].id); + this.env.model.dispatch("LINK_ODOO_MENU_TO_CHART", { + chartId: this.props.figureId, + odooMenuId: menu.xmlid || menu.id, + }); + }, + get record() { + const menus = this.menus + .getAll() + .map((menu) => menu.id) + .filter((menuId) => menuId !== "root"); + return { + getFieldDomain: function () { + return new Domain([["id", "in", menus]]); + }, + getFieldContext: function () { + return {}; + }, + }; + }, +}; + +patch(GenericChartConfigPanel.prototype, menuChartProps); +GenericChartConfigPanel.components = { + ...GenericChartConfigPanel.components, + Many2XAutocomplete, +}; + +patch(LineConfigPanel.prototype, menuChartProps); +LineConfigPanel.components = { + ...LineConfigPanel.components, + Many2XAutocomplete, +}; + +patch(BarConfigPanel.prototype, menuChartProps); +BarConfigPanel.components = { + ...BarConfigPanel.components, + Many2XAutocomplete, +}; + +patch(ScorecardChartConfigPanel.prototype, menuChartProps); +ScorecardChartConfigPanel.components = { + ...ScorecardChartConfigPanel.components, + Many2XAutocomplete, +}; + +patch(GaugeChartConfigPanel.prototype, menuChartProps); +GaugeChartConfigPanel.components = { + ...GaugeChartConfigPanel.components, + Many2XAutocomplete, +}; diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js new file mode 100644 index 00000000..a5fabc63 --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js @@ -0,0 +1,235 @@ +import * as spreadsheet from "@odoo/o-spreadsheet"; +import {Component, onWillStart, useState} from "@odoo/owl"; + +import {FilterValue} from "@spreadsheet/global_filters/components/filter_value/filter_value"; +import {ModelFieldSelector} from "@web/core/model_field_selector/model_field_selector"; +import {ModelSelector} from "@web/core/model_selector/model_selector"; +import {RELATIVE_DATE_RANGE_TYPES} from "@spreadsheet/helpers/constants"; + +import {_t} from "@web/core/l10n/translation"; +import {globalFiltersFieldMatchers} from "@spreadsheet/global_filters/plugins/global_filters_core_plugin"; +import {useService} from "@web/core/utils/hooks"; + +const {topbarMenuRegistry} = spreadsheet.registries; +const uuidGenerator = new spreadsheet.helpers.UuidGenerator(); + +topbarMenuRegistry.add("file", {name: _t("File"), sequence: 10}); +topbarMenuRegistry.addChild("filters", ["file"], { + name: _t("Filters"), + sequence: 70, + execute: (env) => env.openSidePanel("FilterPanel", {}), + icon: "o-spreadsheet-Icon.GLOBAL_FILTERS", +}); +topbarMenuRegistry.addChild("save", ["file"], { + name: _t("Save"), + // Description: "Ctrl+S", // This is not working, so removing it from the view for now... + sequence: 10, + execute: (env) => env.saveSpreadsheet(), + icon: "o-spreadsheet-Icon.DOWNLOAD", +}); +topbarMenuRegistry.addChild("download", ["file"], { + name: _t("Download XLSX"), + sequence: 20, + execute: (env) => env.downloadAsXLXS(), + icon: "o-spreadsheet-Icon.EXPORT_XLSX", +}); +topbarMenuRegistry.addChild("settings", ["file"], { + name: _t("Settings"), + sequence: 100, + execute: (env) => env.openSidePanel("Settings"), + icon: "o-spreadsheet-Icon.COG", +}); + +const {sidePanelRegistry} = spreadsheet.registries; + +export class FilterPanel extends Component { + onEditFilter(filter) { + this.env.openSidePanel("EditFilterPanel", {filter}); + } + onAddFilter(type) { + this.env.openSidePanel("EditFilterPanel", {filter: {type: type}}); + } +} + +FilterPanel.template = "spreadsheet_oca.FilterPanel"; +FilterPanel.components = { + FilterValue, +}; + +sidePanelRegistry.add("FilterPanel", { + title: "Filters", + Body: FilterPanel, +}); + +export class EditFilterPanel extends Component { + setup() { + this.filterId = this.props.filter; + this.orm = useService("orm"); + this.state = useState({ + label: this.props.filter.label, + type: this.props.filter.type, + defaultValue: this.props.filter.defaultValue, + rangeType: this.props.filter.rangeType || "year", + modelName: {technical: this.props.filter.modelName, label: null}, + objects: {}, + }); + this.relativeDateRangeTypes = RELATIVE_DATE_RANGE_TYPES; + onWillStart(this.willStart.bind(this)); + } + async willStart() { + if (this.state.modelName.technical !== undefined) { + const modelLabel = await this.orm.call("ir.model", "display_name_for", [ + [this.state.modelName.technical], + ]); + this.state.modelName.label = modelLabel[0] && modelLabel[0].display_name; + } + var ModelFields = []; + for (var [objectType, objectClass] of Object.entries( + globalFiltersFieldMatchers + )) { + for (const objectId of objectClass.getIds()) { + var fields = objectClass.getFields(objectId); + this.state.objects[objectType + "_" + objectId] = { + id: objectType + "_" + objectId, + objectId: objectId, + name: objectClass.getDisplayName(objectId), + tag: await objectClass.getTag(objectId), + fieldMatch: + objectClass.getFieldMatching(objectId, this.props.filter.id) || + {}, + fields: fields, + type: objectType, + model: objectClass.getModel(objectId), + }; + ModelFields.push(fields); + } + } + this.models = [ + ...new Set( + ModelFields.map((field_items) => Object.values(field_items)) + .flat() + .filter((field) => field.relation) + .map((field) => field.relation) + ), + ]; + } + get dateRangeTypes() { + return [ + {type: "fixedPeriod", description: _t("Month / Quarter")}, + {type: "relative", description: _t("Relative Period")}, + {type: "from_to", description: _t("From / To")}, + ]; + } + get dateOffset() { + return [ + {value: 0, name: ""}, + {value: -1, name: _t("Previous")}, + {value: -2, name: _t("Before Previous")}, + {value: 1, name: _t("Next")}, + {value: 2, name: _t("After next")}, + ]; + } + onChangeFieldMatchOffset(object, ev) { + this.state.objects[object.id].fieldMatch.offset = parseInt(ev.target.value, 10); + } + onModelSelected(ev) { + this.state.modelName.technical = ev.technical; + this.state.modelName.label = ev.label; + } + onDateRangeChange(ev) { + this.state.rangeType = ev.target.value; + this.state.defaultValue = undefined; + } + onSave() { + const action = this.props.filter.id + ? "EDIT_GLOBAL_FILTER" + : "ADD_GLOBAL_FILTER"; + + const filter = { + id: this.props.filter.id || uuidGenerator.uuidv4(), + type: this.state.type, + label: this.state.label, + defaultValue: this.state.defaultValue, + rangeType: this.state.rangeType, + modelName: this.state.modelName.technical, + }; + const filterMatching = {}; + Object.values(this.state.objects).forEach((object) => { + filterMatching[object.type] = filterMatching[object.type] || {}; + const fieldMatch = object.fieldMatch ? {...object.fieldMatch} : {}; + filterMatching[object.type][object.objectId] = fieldMatch; + }); + this.env.model.dispatch(action, { + filter, + ...filterMatching, + }); + this.env.openSidePanel("FilterPanel", {}); + } + onCancel() { + this.env.openSidePanel("FilterPanel", {}); + } + onRemove() { + if (this.props.filter.id) { + this.env.model.dispatch("REMOVE_GLOBAL_FILTER", { + id: this.props.filter.id, + }); + } + this.env.openSidePanel("FilterPanel", {}); + } + onFieldMatchUpdate(object, path, fieldInfo) { + if (!path) { + // Clear the field match if no path selected + this.state.objects[object.id].fieldMatch = {}; + return; + } + // Extract field definition from fieldInfo (V18> structure) + const fieldDef = + fieldInfo && fieldInfo.fieldDef ? fieldInfo.fieldDef : fieldInfo; + this.state.objects[object.id].fieldMatch = { + chain: path, + type: fieldDef?.type || "", + }; + } + toggleDateDefaultValue(ev) { + this.state.defaultValue = ev.target.checked ? "this_month" : undefined; + } + getModelField(fieldMatch) { + if (!fieldMatch || !fieldMatch.chain) { + return ""; + } + return fieldMatch.chain; + } + filterModelFieldSelectorField(field, path, coModel) { + if (!field.searchable) { + return false; + } + + // TODO: Define allowed field types based on filter type + const ALLOWED_FIELD_TYPES = [ + "char", + "text", + "selection", + "many2one", + "date", + "datetime", + ]; + + if (field.name === "id" && this.state.type === "relation") { + const paths = path.split("."); + const lastField = paths.at(-2); + if (!lastField || (lastField.relation && lastField.relation === coModel)) { + return true; + } + return false; + } + return ALLOWED_FIELD_TYPES.includes(field.type) || Boolean(field.relation); + } +} + +EditFilterPanel.template = "spreadsheet_oca.EditFilterPanel"; +EditFilterPanel.components = {ModelSelector, ModelFieldSelector}; + +sidePanelRegistry.add("EditFilterPanel", { + title: "Edit Filter", + Body: EditFilterPanel, +}); diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js new file mode 100644 index 00000000..0706956c --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js @@ -0,0 +1,282 @@ +import * as spreadsheet from "@odoo/o-spreadsheet"; +import {Component, onWillStart, onWillUpdateProps, useState} from "@odoo/owl"; +import {Domain} from "@web/core/domain"; +import {DomainSelector} from "@web/core/domain_selector/domain_selector"; +import {DomainSelectorDialog} from "@web/core/domain_selector_dialog/domain_selector_dialog"; +import {_t} from "@web/core/l10n/translation"; +import {formatDate} from "@web/core/l10n/dates"; +import {useService} from "@web/core/utils/hooks"; + +const {DateTime} = luxon; +const {sidePanelRegistry, topbarMenuRegistry, pivotSidePanelRegistry} = + spreadsheet.registries; + +topbarMenuRegistry.addChild("data_sources", ["data"], (env) => { + let sequence = 53; + const lists = env.model.getters.getListIds().map((listId, index) => ({ + id: `data_source_list_${listId}`, + name: env.model.getters.getListDisplayName(listId), + sequence: sequence++, + execute: (child_env) => { + child_env.model.dispatch("SELECT_ODOO_LIST", {listId: listId}); + child_env.openSidePanel("ListPanel", {listId}); + }, + icon: "spreadsheet_oca.ListIcon", + separator: index === env.model.getters.getListIds().length - 1, + })); + return lists.concat([ + { + id: "refresh_all_data", + name: _t("Refresh all data"), + sequence: 110, + execute: (child_env) => { + child_env.model.dispatch("REFRESH_ALL_DATA_SOURCES"); + }, + separator: true, + }, + ]); +}); + +export class PivotPanelDisplay extends Component { + setup() { + this.dialog = useService("dialog"); + onWillStart(this.modelData.bind(this)); + onWillUpdateProps(this.modelData.bind(this)); + } + async modelData() { + this.PivotDataSource = this.env.model.getters.getPivot(this.props.pivotId); + this.modelLabel = await this.PivotDataSource.getModelLabel(); + } + get domain() { + return new Domain(this.props.pivotDefinition.domain).toString(); + } + get pivotDimensions() { + const {rows = [], columns = []} = this.props.pivotDefinition; + return [...rows, ...columns].map((dim) => { + const label = dim.displayName || dim.fieldName; + return dim.granularity ? `${label} (${dim.granularity})` : label; + }); + } + get sortInformation() { + const sortedColumn = this.props.pivotDefinition.sortedColumn; + const orderTranslate = + sortedColumn.order === "asc" ? _t("ascending") : _t("descending"); + + let label = null; + if (sortedColumn.measure) { + const measure = this.PivotDataSource.getMeasure(sortedColumn.measure); + label = measure ? measure.displayName : sortedColumn.measure; + } else if (sortedColumn.groupBy) { + label = this.PivotDataSource.getFormattedGroupBy(sortedColumn.groupBy); + } + return `${label} (${orderTranslate})`; + } + get lastUpdate() { + const lastUpdate = this.PivotDataSource.lastUpdate; + if (lastUpdate) { + return formatDate(DateTime.fromMillis(lastUpdate)); + } + return _t("not updated"); + } + editDomain() { + this.dialog.add(DomainSelectorDialog, { + resModel: this.props.pivotDefinition.model, + domain: this.domain, + readonly: false, + isDebugMode: Boolean(this.env.debug), + onConfirm: this.onSelectDomain.bind(this), + }); + } + onSelectDomain(domain) { + this.env.model.dispatch("UPDATE_ODOO_PIVOT_DOMAIN", { + pivotId: this.props.pivotId, + domain: new Domain(domain).toList(), + }); + } + async insertPivot() { + const pivotId = this.props.pivotId; + const {type} = this.env.model.getters.getPivotCoreDefinition(pivotId); + const position = this.env.model.getters.getActivePosition(); + let table = null; + if (type === "ODOO") { + const dataSource = this.env.model.getters.getPivot(pivotId); + const model = await dataSource.copyModelWithOriginalDomain(); + table = model.getTableStructure().export(); + } else { + table = this.env.model.getters + .getPivot(pivotId) + .getTableStructure() + .export(); + } + this.env.model.dispatch("INSERT_PIVOT_WITH_TABLE", { + ...position, + pivotId, + table, + pivotMode: "static", + }); + this.env.model.dispatch("REFRESH_PIVOT", {id: pivotId}); + } + async insertDynamicPivot() { + const pivotId = this.props.pivotId; + const {type} = this.env.model.getters.getPivotCoreDefinition(pivotId); + const position = this.env.model.getters.getActivePosition(); + let table = null; + if (type === "ODOO") { + const dataSource = this.env.model.getters.getPivot(this.props.pivotId); + const model = await dataSource.copyModelWithOriginalDomain(); + table = model.getTableStructure().export(); + } else { + table = this.env.model.getters + .getPivot(this.props.pivotId) + .getTableStructure() + .export(); + } + this.env.model.dispatch("INSERT_PIVOT_WITH_TABLE", { + ...position, + pivotId, + table, + pivotMode: "dynamic", + }); + this.env.model.dispatch("REFRESH_PIVOT", {id: pivotId}); + } + delete() { + this.env.askConfirmation( + _t("Are you sure you want to delete this pivot?"), + () => { + this.env.model.dispatch("REMOVE_PIVOT", { + pivotId: this.props.pivotId, + }); + } + ); + } +} + +PivotPanelDisplay.template = "spreadsheet_oca.PivotPanelDisplay"; +PivotPanelDisplay.components = { + DomainSelector, +}; +PivotPanelDisplay.properties = { + pivotId: String, + pivotDefinition: Object, +}; + +export class PivotPanel extends Component { + get pivotId() { + return this.props.pivotId; + } + get pivotType() { + return this.env.model.getters.getPivotCoreDefinition(this.pivotId).type; + } + get pivotDefinition() { + const dataSource = this.env.model.getters.getPivot(this.pivotId); + return dataSource ? dataSource.definition || {} : {}; + } +} + +PivotPanel.template = "spreadsheet_oca.PivotPanel"; +PivotPanel.components = { + PivotPanelDisplay, +}; + +pivotSidePanelRegistry.add("ODOO", { + editor: PivotPanel, +}); + +export class ListPanelDisplay extends Component { + setup() { + this.state = useState({listRows: undefined}); + this.dialog = useService("dialog"); + onWillStart(this.modelData.bind(this)); + onWillUpdateProps(this.modelData.bind(this)); + } + async modelData() { + this.ListDataSource = await this.env.model.getters.getAsyncListDataSource( + this.props.listId + ); + this.modelLabel = await this.ListDataSource.getModelLabel(); + } + get domain() { + return new Domain(this.props.listDefinition.domain).toString(); + } + get lastUpdate() { + const lastUpdate = this.ListDataSource.lastUpdate; + if (lastUpdate) { + return formatDate(DateTime.fromMillis(lastUpdate)); + } + return _t("not updated"); + } + editDomain() { + this.dialog.add(DomainSelectorDialog, { + resModel: this.props.listDefinition.model, + domain: this.domain, + readonly: false, + isDebugMode: Boolean(this.env.debug), + onConfirm: this.onSelectDomain.bind(this), + }); + } + onSelectDomain(domain) { + this.env.model.dispatch("UPDATE_ODOO_LIST_DOMAIN", { + listId: this.props.listId, + domain: new Domain(domain).toList(), + }); + } + async insertList() { + const listId = this.props.listId; + const zone = this.env.model.getters.getSelectedZone(); + const dataSource = await this.env.model.getters.getAsyncListDataSource(listId); + const totalRows = parseInt(this.state.listRows, 10) || dataSource.maxPosition; + const list = this.env.model.getters.getListDefinition(listId); + const sheetId = this.env.model.getters.getActiveSheetId(); + const columns = list.columns.map((name) => ({ + name, + type: dataSource.getField(name).type, + })); + this.env.model.dispatch("RE_INSERT_ODOO_LIST_WITH_TABLE", { + sheetId: sheetId, + col: zone.left, + row: zone.top, + id: listId, + linesNumber: totalRows, + columns: columns, + }); + } + delete() { + this.env.askConfirmation( + _t("Are you sure you want to delete this list?"), + () => { + this.env.model.dispatch("REMOVE_ODOO_LIST", { + listId: this.props.listId, + }); + this.env.openSidePanel("ListPanel", {}); + } + ); + } +} + +ListPanelDisplay.template = "spreadsheet_oca.ListPanelDisplay"; +ListPanelDisplay.components = { + DomainSelector, +}; +ListPanelDisplay.props = { + listId: String, + listDefinition: Object, +}; + +export class ListPanel extends Component { + get listId() { + return this.props.listId; + } + get listDefinition() { + return this.env.model.getters.getListDefinition(this.listId) || {}; + } +} + +ListPanel.template = "spreadsheet_oca.ListPanel"; +ListPanel.components = { + ListPanelDisplay, +}; + +sidePanelRegistry.add("ListPanel", { + title: "List information", + Body: ListPanel, +}); diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/image_file_store.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/image_file_store.esm.js new file mode 100644 index 00000000..919524e8 --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/image_file_store.esm.js @@ -0,0 +1,33 @@ +export class ImageFileStore { + constructor(resModel, resId, http, orm) { + this.resModel = resModel; + this.resId = resId; + this.http = http; + this.orm = orm; + } + + async upload(file) { + const route = "/web/binary/upload_attachment"; + const params = { + ufile: [file], + csrf_token: odoo.csrf_token, + model: this.resModel, + id: this.resId, + }; + const fileData = JSON.parse(await this.http.post(route, params, "text"))[0]; + const [accessToken] = await this.orm.call( + "ir.attachment", + "generate_access_token", + [fileData.id] + ); + return `/web/image/${fileData.id}?access_token=${accessToken}`; + } + + async delete(path) { + const attachmentId = path.split("/").pop(); + if (Number.isNaN(attachmentId)) { + throw new Error("Invalid path: " + path); + } + await this.orm.unlink("ir.attachment", [parseInt(attachmentId, 10)]); + } +} diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js new file mode 100644 index 00000000..dfbe770a --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/odoo_panels.esm.js @@ -0,0 +1,164 @@ +import * as spreadsheet from "@odoo/o-spreadsheet"; + +import {Domain} from "@web/core/domain"; +import {Many2XAutocomplete} from "@web/views/fields/relational_utils"; +import {_t} from "@web/core/l10n/translation"; +import {useService} from "@web/core/utils/hooks"; + +const {chartSidePanelComponentRegistry, chartSubtypeRegistry} = spreadsheet.registries; +const {PieChartDesignPanel} = spreadsheet.components; +const {Component} = owl; + +export class OdooPanel extends Component { + setup() { + this.menus = useService("menu"); + } + get menuProps() { + const menu = this.env.model.getters.getChartOdooMenu(this.props.figureId); + var result = { + fieldString: _t("Menu Items"), + resModel: "ir.ui.menu", + update: this.updateMenu.bind(this), + activeActions: {}, + getDomain: this.getDomain.bind(this), + }; + if (menu) { + result.value = menu.name; + result.id = menu.id; + } + return result; + } + getDomain() { + const menus = this.menus + .getAll() + .map((menu) => menu.id) + .filter((menuId) => menuId !== "root"); + return [["id", "in", menus]]; + } + get menuId() { + const menu = this.env.model.getters.getChartOdooMenu(this.props.figureId); + if (menu) { + return [menu.id, menu.name]; + } + return false; + } + updateMenu(menuId) { + if (!menuId) { + this.env.model.dispatch("LINK_ODOO_MENU_TO_CHART", { + chartId: this.props.figureId, + odooMenuId: false, + }); + return; + } + const menu = this.env.model.getters.getIrMenu(menuId[0].id); + this.env.model.dispatch("LINK_ODOO_MENU_TO_CHART", { + chartId: this.props.figureId, + odooMenuId: menu.xmlid || menu.id, + }); + } + get record() { + const menus = this.menus + .getAll() + .map((menu) => menu.id) + .filter((menuId) => menuId !== "root"); + return { + getFieldDomain: function () { + return new Domain([["id", "in", menus]]); + }, + getFieldContext: function () { + return {}; + }, + }; + } +} +OdooPanel.template = "spreadsheet_oca.OdooPanel"; +OdooPanel.components = {Many2XAutocomplete}; + +class OdooStackablePanel extends OdooPanel { + onChangeStacked(ev) { + this.props.updateChart(this.props.figureId, { + stacked: ev.target.checked, + }); + } +} +OdooStackablePanel.template = "spreadsheet_oca.OdooStackablePanel"; + +chartSidePanelComponentRegistry + .add("odoo_line", { + configuration: OdooStackablePanel, + design: PieChartDesignPanel, + }) + .add("odoo_bar", { + configuration: OdooStackablePanel, + design: PieChartDesignPanel, + }) + .add("odoo_pie", { + configuration: OdooPanel, + design: PieChartDesignPanel, + }); + +chartSubtypeRegistry.add("odoo_line", { + matcher: (definition) => + definition.type === "odoo_line" && !definition.stacked && !definition.fillArea, + subtypeDefinition: {stacked: false, fillArea: false}, + displayName: _t("Line"), + chartSubtype: "odoo_line", + chartType: "odoo_line", + category: "line", + preview: "o-spreadsheet-ChartPreview.LINE_CHART", +}); +chartSubtypeRegistry.add("odoo_stacked_line", { + matcher: (definition) => + definition.type === "odoo_line" && definition.stacked && !definition.fillArea, + subtypeDefinition: {stacked: true, fillArea: false}, + displayName: _t("Stacked Line"), + chartSubtype: "odoo_stacked_line", + chartType: "odoo_line", + category: "line", + preview: "o-spreadsheet-ChartPreview.STACKED_LINE_CHART", +}); +chartSubtypeRegistry.add("odoo_area", { + matcher: (definition) => + definition.type === "odoo_line" && !definition.stacked && definition.fillArea, + subtypeDefinition: {stacked: false, fillArea: true}, + displayName: _t("Area"), + chartSubtype: "odoo_area", + chartType: "odoo_line", + category: "area", + preview: "o-spreadsheet-ChartPreview.AREA_CHART", +}); +chartSubtypeRegistry.add("odoo_stacked_area", { + matcher: (definition) => + definition.type === "odoo_line" && definition.stacked && definition.fillArea, + subtypeDefinition: {stacked: true, fillArea: true}, + displayName: _t("Stacked Area"), + chartSubtype: "odoo_stacked_area", + chartType: "odoo_line", + category: "area", + preview: "o-spreadsheet-ChartPreview.STACKED_AREA_CHART", +}); +chartSubtypeRegistry.add("odoo_bar", { + matcher: (definition) => definition.type === "odoo_bar" && !definition.stacked, + subtypeDefinition: {stacked: false}, + displayName: _t("Column"), + chartSubtype: "odoo_bar", + chartType: "odoo_bar", + category: "column", + preview: "o-spreadsheet-ChartPreview.COLUMN_CHART", +}); +chartSubtypeRegistry.add("odoo_stacked_bar", { + matcher: (definition) => definition.type === "odoo_bar" && definition.stacked, + subtypeDefinition: {stacked: true}, + displayName: _t("Stacked Column"), + chartSubtype: "odoo_stacked_bar", + chartType: "odoo_bar", + category: "column", + preview: "o-spreadsheet-ChartPreview.STACKED_COLUMN_CHART", +}); +chartSubtypeRegistry.add("odoo_pie", { + displayName: _t("Pie"), + chartSubtype: "odoo_pie", + chartType: "odoo_pie", + category: "pie", + preview: "o-spreadsheet-ChartPreview.PIE_CHART", +}); diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml new file mode 100644 index 00000000..242124ba --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml @@ -0,0 +1,678 @@ + + + + +
+ + +
+
+ + + + + + + +
+
+
Pivot name
+ +
+
+
Model
+
()
+
+
+
Domain
+ + +
+
+
Dimensions
+ +
+ +
+
+
Sorting
+
+
+
+
Measures
+ +
+ +
+
+ + + +
+
+ Last updated at +
+
+ + + + + + + + + +
+
+
List name
+ +
+
+
Model
+
()
+
+
+
Domain
+ + +
+
+ + +
+
+ + +
+
+ Last updated at +
+
+
+ +
+
+ +
+
+ + +
+
+
+ + + +
+
+ +
+
+ Label +
+
+ +
+
+
+
Time range
+
+ +
+
+
+
Default value
+
+ + +
+
+ +
+
+ +
+ +
+ +
+
Related model
+
+ +
+
+
+
+ - +
+
+
+ +
+
+ +
+ +
+
+
+ + + +
+
+ + + + + + + name is required + + + + + + + + + + + + + +
+ + + + + + + +
+
+ +
+ +
+
+ +
+
+ +
+ +
+ + + + + + + + + + +
+
+
+
+
+ + + +
+
+ + + +
+
+ +
+ + +
+
+ + + + + + + +
+ +
+ + +
+ +
+ + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
Link to Odoo menu
+
+ +
+
+
+ + +
+ +
+
+
+ + +
+
Link to Odoo menu
+
+ +
+
+
+
+ + +
+
Link to Odoo menu
+
+ +
+
+
+
+ + +
+
Link to Odoo menu
+
+ +
+
+
+
+ + +
+
Link to Odoo menu
+
+ +
+
+
+
+ + +
+
Link to Odoo menu
+
+ +
+
+
+
+ + diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_action.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_action.esm.js new file mode 100644 index 00000000..5055a15c --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_action.esm.js @@ -0,0 +1,297 @@ +import * as spreadsheet from "@odoo/o-spreadsheet"; + +import {Domain} from "@web/core/domain"; +import {SpreadsheetControlPanel} from "./spreadsheet_controlpanel.esm"; +import {SpreadsheetRenderer} from "./spreadsheet_renderer.esm"; +import {deepCopy} from "@web/core/utils/objects"; +import {helpers} from "@odoo/o-spreadsheet"; +import {registry} from "@web/core/registry"; +import {standardActionServiceProps} from "@web/webclient/actions/action_service"; +import {useService} from "@web/core/utils/hooks"; + +const {load} = spreadsheet; + +const uuidGenerator = new spreadsheet.helpers.UuidGenerator(); +const actionRegistry = registry.category("actions"); +const {Component, onWillStart, useSubEnv} = owl; +const {parseDimension, isDateOrDatetimeField} = helpers; + +function normalizeGroupBys(dimensions, fields) { + return dimensions.map((dimension) => { + if ( + isDateOrDatetimeField(fields[dimension.fieldName]) && + !dimension.granularity + ) { + return {granularity: "month", ...dimension}; + } + return dimension; + }); +} + +export class ActionSpreadsheetOca extends Component { + setup() { + this.orm = useService("orm"); + this.notification = useService("notification"); + const params = this.props.action.params || this.props.action.context.params; + this.spreadsheetId = params.spreadsheet_id || params.active_id; + this.model = params.model || "spreadsheet.spreadsheet"; + this.import_data = params.import_data || {}; + onWillStart(async () => { + // We need to load in case the data comes from an XLSX + this.record = + load( + await this.orm.call( + this.model, + "get_spreadsheet_data", + [[this.spreadsheetId]], + {context: {bin_size: false}} + ) + ) || {}; + }); + useSubEnv({ + saveRecord: this.saveRecord.bind(this), + importData: this.importData.bind(this), + notifyUser: this.notifyUser.bind(this), + }); + } + + notifyUser(notification) { + this.notification.add(notification.text, { + type: notification.type, + sticky: notification.sticky, + }); + } + async saveRecord(data) { + if (this.record.mode === "readonly") { + return; + } + if (this.spreadsheetId) { + this.orm.call(this.model, "write", [this.spreadsheetId, data]); + } else { + this.spreadsheetId = await this.orm.call(this.model, "create", [data]); + } + } + /** + * Clean SearchParams of conflictive keys. + * + * 1. Removed from context pivot conflictive keys. + * 2. Removed from context graph conflictive keys. + * + * @returns {Object} Formated searchParams. + */ + cleanSearchParams() { + const searchParams = this.import_data.searchParams; + const context = {}; + for (var key of Object.keys(searchParams.context)) { + if (key.startsWith("pivot_") || key.startsWith("graph_")) { + continue; + } + context[key] = searchParams.context[key]; + } + return {...searchParams, context}; + } + async importDataGraph(spreadsheet_model) { + var sheetId = spreadsheet_model.getters.getActiveSheetId(); + if (this.import_data.new === undefined && this.import_data.new_sheet) { + sheetId = uuidGenerator.uuidv4(); + spreadsheet_model.dispatch("CREATE_SHEET", { + sheetId, + position: spreadsheet_model.getters.getSheetIds().length, + }); + // We want to open the new sheet + const sheetIdFrom = spreadsheet_model.getters.getActiveSheetId(); + spreadsheet_model.dispatch("ACTIVATE_SHEET", { + sheetIdFrom, + sheetIdTo: sheetId, + }); + } else if (this.import_data.new === undefined) { + // TODO: Add a way to detect the last row total height + } + const dataSourceId = uuidGenerator.uuidv4(); + const chartType = `odoo_${this.import_data.metaData.mode}`; + const definition = { + title: {text: this.import_data.name}, + type: chartType, + fillArea: chartType === "odoo_line", + background: "#FFFFFF", + stacked: this.import_data.metaData.stacked, + metaData: this.import_data.metaData, + searchParams: this.cleanSearchParams(), + dataSourceId: dataSourceId, + id: uuidGenerator.uuidv4(), + cumulative: this.import_data.metaData.cumulated, + cumulatedStart: this.import_data.metaData.cumulatedStart, + legendPosition: "top", + verticalAxisPosition: "left", + actionXmlId: this.import_data.actionXmlId, + }; + spreadsheet_model.dispatch("CREATE_CHART", { + sheetId, + id: dataSourceId, + position: { + x: 0, + y: 0, + }, + definition, + }); + } + importCreateOrReuseSheet(spreadsheet_model) { + var sheetId = spreadsheet_model.getters.getActiveSheetId(); + var row = 0; + if (this.import_data.new === undefined && this.import_data.new_sheet) { + sheetId = uuidGenerator.uuidv4(); + spreadsheet_model.dispatch("CREATE_SHEET", { + sheetId, + position: spreadsheet_model.getters.getSheetIds().length, + }); + // We want to open the new sheet + const sheetIdFrom = spreadsheet_model.getters.getActiveSheetId(); + spreadsheet_model.dispatch("ACTIVATE_SHEET", { + sheetIdFrom, + sheetIdTo: sheetId, + }); + } else if (this.import_data.new === undefined) { + row = spreadsheet_model.getters.getNumberRows(sheetId); + var maxcols = spreadsheet_model.getters.getNumberCols(sheetId); + var filled = false; + while (row >= 0) { + for (var col = maxcols; col >= 0; col--) { + if ( + spreadsheet_model.getters.getCell(sheetId, col, row) !== + undefined && + !spreadsheet_model.getters.getCell(sheetId, col, row).isEmpty() + ) { + filled = true; + break; + } + } + if (filled) { + break; + } + row -= 1; + } + row += 1; + } + return sheetId; + } + async importDataList(spreadsheet_model) { + var sheetId = this.importCreateOrReuseSheet(spreadsheet_model); + if (!sheetId) { + const sheetIds = spreadsheet_model.getters.getSheetIds(); + sheetId = sheetIds.length ? sheetIds[0] : uuidGenerator.uuidv4(); + } + const listId = spreadsheet_model.getters.getNextListId(); + const list_info = { + metaData: { + resModel: this.import_data.metaData.model, + columns: this.import_data.metaData.columns.map((column) => column.name), + fields: this.import_data.metaData.fields, + }, + searchParams: { + domain: new Domain(this.import_data.metaData.domain).toJson(), + context: this.import_data.metaData.context, + orderBy: this.import_data.metaData.orderBy, + }, + name: this.import_data.name, + actionXmlId: this.import_data.actionXmlId, + }; + const columns = this.import_data.metaData.columns.map((c) => ({ + name: c.name, + type: this.import_data.metaData.fields[c.name].type, + })); + spreadsheet_model.dispatch("INSERT_ODOO_LIST_WITH_TABLE", { + sheetId, + col: 0, + row: 0, + id: listId, + definition: list_info, + linesNumber: this.import_data.dyn_number_of_rows, + columns: columns, + }); + const dataSource = spreadsheet_model.getters.getListDataSource(listId); + await dataSource.load(); + spreadsheet_model.dispatch("AUTORESIZE_COLUMNS", { + sheetId, + cols: Array.from({length: columns.length}, (_, i) => i), + }); + } + async importDataPivot(spreadsheet_model) { + var sheetId = this.importCreateOrReuseSheet(spreadsheet_model); + const pivotId = uuidGenerator.uuidv4(); + const fields = this.import_data.metaData.fields || {}; + const activeMeasures = this.import_data.metaData.activeMeasures; + const measures = activeMeasures.map((measure) => ({ + id: fields[measure]?.aggregator + ? `${measure}:${fields[measure].aggregator}` + : measure, + fieldName: measure, + aggregator: fields[measure]?.aggregator, + })); + const sortedMeasure = this.import_data.metaData.sortedColumn?.measure; + const sortedColumn = activeMeasures.includes(sortedMeasure) + ? this.import_data.metaData.sortedColumn + : null; + const colGroupBys = (this.import_data.metaData.colGroupBys || []).concat( + this.import_data.metaData.expandedColGroupBys || [] + ); + const rowGroupBys = (this.import_data.metaData.rowGroupBys || []).concat( + this.import_data.metaData.expandedRowGroupBys || [] + ); + const pivot_info = deepCopy({ + type: "ODOO", + domain: new Domain(this.import_data.searchParams.domain).toJson(), + context: this.import_data.searchParams.context, + sortedColumn, + measures, + model: this.import_data.metaData.resModel, + columns: normalizeGroupBys(colGroupBys.map(parseDimension), fields), + rows: normalizeGroupBys(rowGroupBys.map(parseDimension), fields), + name: this.import_data.name, + actionXmlId: this.import_data.actionXmlId, + }); + spreadsheet_model.dispatch("ADD_PIVOT", { + pivotId, + pivot: pivot_info, + }); + const ds = spreadsheet_model.getters.getPivot(pivotId); + await ds.load(); + const table = ds.getTableStructure(); + spreadsheet_model.dispatch("INSERT_PIVOT_WITH_TABLE", { + sheetId, + col: 0, + row: 0, + pivotId, + table: table.export(), + pivotMode: "dynamic", + }); + const columns = []; + for ( + let col = 0; + col <= table.columns[table.columns.length - 1].length; + col++ + ) { + columns.push(col); + } + spreadsheet_model.dispatch("AUTORESIZE_COLUMNS", {sheetId, cols: columns}); + } + async importData(spreadsheet_model) { + if (this.import_data.mode === "pivot") { + await this.importDataPivot(spreadsheet_model); + } + if (this.import_data.mode === "graph") { + await this.importDataGraph(spreadsheet_model); + } + if (this.import_data.mode === "list") { + await this.importDataList(spreadsheet_model); + } + } +} +ActionSpreadsheetOca.template = "spreadsheet_oca.ActionSpreadsheetOca"; +ActionSpreadsheetOca.components = { + SpreadsheetRenderer, + SpreadsheetControlPanel, +}; +ActionSpreadsheetOca.props = {...standardActionServiceProps}; +actionRegistry.add("action_spreadsheet_oca", ActionSpreadsheetOca, { + force: true, +}); diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_controlpanel.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_controlpanel.esm.js new file mode 100644 index 00000000..4b5d8647 --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_controlpanel.esm.js @@ -0,0 +1,50 @@ +import {Component} from "@odoo/owl"; +import {ControlPanel} from "@web/search/control_panel/control_panel"; +import {useService} from "@web/core/utils/hooks"; + +const {useState} = owl; + +export class SpreadsheetName extends Component { + setup() { + this.state = useState({ + name: this.props.name, + }); + } + _onNameChanged(ev) { + if (this.props.isReadonly) { + return; + } + if (ev.target.value) { + this.env.saveRecord({name: ev.target.value}); + } + this.state.name = ev.target.value; + if (this.props.onChanged) { + this.props.onChanged(ev); + } + } +} +SpreadsheetName.template = "spreadsheet_oca.SpreadsheetName"; +SpreadsheetName.props = { + name: String, + isReadonly: Boolean, + onChanged: {type: Function, optional: true}, +}; + +export class SpreadsheetControlPanel extends ControlPanel { + setup() { + super.setup(); + this.actionService = useService("action"); + } + + onBreadcrumbClicked(jsId) { + this.actionService.restore(jsId); + } +} +SpreadsheetControlPanel.template = "spreadsheet_oca.SpreadsheetControlPanel"; +SpreadsheetControlPanel.props = { + ...ControlPanel.props, + record: Object, +}; +SpreadsheetControlPanel.components = { + SpreadsheetName, +}; diff --git a/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js new file mode 100644 index 00000000..24cc65ed --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js @@ -0,0 +1,215 @@ +import * as spreadsheet from "@odoo/o-spreadsheet"; + +import {Component} from "@odoo/owl"; +import {ImageFileStore} from "./image_file_store.esm"; +import {OdooDataProvider} from "@spreadsheet/data_sources/odoo_data_provider"; +import {SpreadsheetComponent} from "@spreadsheet/actions/spreadsheet_component"; +import {_t} from "@web/core/l10n/translation"; +import {loadSpreadsheetDependencies} from "@spreadsheet/assets_backend/helpers"; +import {useService} from "@web/core/utils/hooks"; +import {useSetupAction} from "@web/search/action_hook"; +import {user} from "@web/core/user"; +import {waitForDataLoaded} from "@spreadsheet/helpers/model"; + +const {Model, load} = spreadsheet; + +const {useSubEnv, onWillStart} = owl; +const {useStoreProvider, ModelStore} = spreadsheet.stores; +const uuidGenerator = new spreadsheet.helpers.UuidGenerator(); + +class SpreadsheetTransportService { + constructor(orm, bus_service, model, res_id) { + this.orm = orm; + this.bus_service = bus_service; + this.model = model; + this.res_id = res_id; + this.channel = "spreadsheet_oca;" + this.model + ";" + this.res_id; + this.bus_service.addChannel(this.channel); + this.dialog = useService("dialog"); + this.bus_service.subscribe("notification", (payload) => { + if (payload.id === this.res_id) { + this._handleNotification(payload); + } + }); + this.listeners = []; + this._listener = null; + } + onNotification({detail: notifications}) { + for (const {payload, type} of notifications) { + if ( + type === "spreadsheet_oca" && + payload.res_model === this.model && + payload.res_id === this.res_id + ) { + // What shall we do if no callback is defined (empty until onNewMessage...) :/ + for (const {callback} of this.listeners) { + callback(payload); + } + } + } + } + async sendMessage(message) { + const isAccepted = await this.orm.call(this.model, "send_spreadsheet_message", [ + [this.res_id], + message, + this.accessToken, + ]); + if (isAccepted) { + this._handleNotification(message); + } + } + onNewMessage(id, callback) { + this._listener = callback; + for (const message of this.listeners) { + callback(message); + } + this.listeners = []; + } + leave(id) { + this.listeners = this.listeners.filter((listener) => listener.id !== id); + } + _handleNotification(payload) { + if (!this._listener) { + this.listeners.push(payload); + } else { + this._listener(payload); + } + } +} + +export class SpreadsheetRenderer extends Component { + createDefaultCurrency(currency) { + if (!currency) { + return undefined; + } + return { + symbol: currency.symbol, + position: currency.position, + decimalPlaces: currency.decimal_places, + }; + } + getLocales() { + const orm = useService("orm"); + return async () => { + return orm.call("res.lang", "get_locales_for_spreadsheet", []); + }; + } + getCurrencies() { + const orm = useService("orm"); + return async () => { + const odooCurrencies = await orm.searchRead( + "res.currency", + [], + ["symbol", "full_name", "position", "name", "decimal_places"], + { + order: "active DESC, full_name ASC", + context: {active_test: false}, + } + ); + return odooCurrencies.map((currency) => { + return { + code: currency.name, + symbol: currency.symbol, + position: currency.position || "after", + name: currency.full_name || _t("Currency"), + decimalPlaces: currency.decimal_places || 2, + }; + }); + }; + } + setup() { + this.orm = useService("orm"); + this.http = useService("http"); + this.bus_service = this.env.services.bus_service; + this.ui = useService("ui"); + this.action = useService("action"); + this.dialog = useService("dialog"); + this.notifications = useService("notification"); + const odooDataProvider = new OdooDataProvider(this.env); + this.loadCurrencies = this.getCurrencies(); + this.loadLocales = this.getLocales(); + const defaultCurrency = this.props.record.default_currency; + this.fileStore = new ImageFileStore( + this.props.model, + this.props.res_id, + this.http, + this.orm + ); + this.stores = useStoreProvider(); + // The o-spreadsheet Model handles currency formatting internally + this.spreadsheet_model = new Model( + load(this.props.record.spreadsheet_raw), + { + custom: {env: this.env, orm: this.orm, odooDataProvider}, + defaultCurrency: this.createDefaultCurrency(defaultCurrency), + external: { + loadCurrencies: this.loadCurrencies, + loadLocales: this.loadLocales, + fileStore: this.fileStore, + }, + transportService: new SpreadsheetTransportService( + this.orm, + this.bus_service, + this.props.model, + this.props.res_id + ), + client: { + id: uuidGenerator.uuidv4(), + name: user.name, + userId: user.userId, + }, + mode: this.props.record.mode, + }, + this.props.record.revisions + ); + useSubEnv({ + saveSpreadsheet: this.onSpreadsheetSaved.bind(this), + downloadAsXLXS: this.downloadAsXLXS.bind(this), + }); + onWillStart(async () => { + await loadSpreadsheetDependencies(); + await waitForDataLoaded(this.spreadsheet_model); + await this.env.importData(this.spreadsheet_model); + this.spreadsheet_model.joinSession(); + this.stores.inject(ModelStore, this.spreadsheet_model); + }); + useSetupAction({ + beforeLeave: () => { + this.onSpreadsheetSaved(); + return Promise.resolve(); + }, + }); + odooDataProvider.addEventListener("data-source-updated", () => { + const sheetId = this.spreadsheet_model.getters.getActiveSheetId(); + this.spreadsheet_model.dispatch("EVALUATE_CELLS", {sheetId}); + }); + } + onSpreadsheetSaved() { + const data = this.spreadsheet_model.exportData(); + this.env.saveRecord({spreadsheet_raw: data}); + this.spreadsheet_model.leaveSession(); + this.spreadsheet_model.off("update", this); + } + async downloadAsXLXS() { + this.ui.block(); + await waitForDataLoaded(this.spreadsheet_model); + await this.action.doAction({ + type: "ir.actions.client", + tag: "action_download_spreadsheet", + params: { + name: this.props.record.name, + xlsxData: this.spreadsheet_model.exportXLSX(), + }, + }); + this.ui.unblock(); + } +} + +SpreadsheetRenderer.template = "spreadsheet_oca.SpreadsheetRenderer"; +SpreadsheetRenderer.components = {SpreadsheetComponent}; +SpreadsheetRenderer.props = { + record: Object, + res_id: Number, + model: String, + importData: Function, +}; diff --git a/spreadsheet_oca/static/src/spreadsheet/graph_controller.esm.js b/spreadsheet_oca/static/src/spreadsheet/graph_controller.esm.js new file mode 100644 index 00000000..04238fa6 --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/graph_controller.esm.js @@ -0,0 +1,24 @@ +import {GraphRenderer} from "@web/views/graph/graph_renderer"; + +import {patch} from "@web/core/utils/patch"; + +patch(GraphRenderer.prototype, { + onSpreadsheetButtonClicked() { + this.actionService.doAction( + "spreadsheet_oca.spreadsheet_spreadsheet_import_act_window", + { + additionalContext: { + default_name: this.model.metaData.title, + default_datasource_name: this.model.metaData.title, + default_import_data: { + mode: "graph", + metaData: JSON.parse(JSON.stringify(this.model.metaData)), + searchParams: JSON.parse( + JSON.stringify(this.model.searchParams) + ), + }, + }, + } + ); + }, +}); diff --git a/spreadsheet_oca/static/src/spreadsheet/graph_controller.xml b/spreadsheet_oca/static/src/spreadsheet/graph_controller.xml new file mode 100644 index 00000000..f54f8868 --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/graph_controller.xml @@ -0,0 +1,19 @@ + + + + + + + +
+ diff --git a/spreadsheet_oca/static/src/spreadsheet/list_renderer.esm.js b/spreadsheet_oca/static/src/spreadsheet/list_renderer.esm.js new file mode 100644 index 00000000..beccbe38 --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/list_renderer.esm.js @@ -0,0 +1,63 @@ +import {useBus, useService} from "@web/core/utils/hooks"; + +import {HandleField} from "@web/views/fields/handle/handle_field"; +import {ListRenderer} from "@web/views/list/list_renderer"; +import {omit} from "@web/core/utils/objects"; +import {patch} from "@web/core/utils/patch"; +import {user} from "@web/core/user"; + +patch(ListRenderer.prototype, { + setup() { + super.setup(...arguments); + this.actionService = useService("action"); + useBus( + this.env.bus, + "addListOnSpreadsheet", + this.onAddListOnSpreadsheet.bind(this) + ); + }, + onAddListOnSpreadsheet() { + const model = this.env.model.root; + this.actionService.doAction( + "spreadsheet_oca.spreadsheet_spreadsheet_import_act_window", + { + additionalContext: { + default_name: this.env.config.getDisplayName(), + default_datasource_name: this.env.config.getDisplayName(), + default_can_be_dynamic: true, + default_dynamic: true, + default_is_tree: true, + default_number_of_rows: Math.min(model.count, model.limit), + default_import_data: { + mode: "list", + metaData: { + model: model.resModel, + domain: model.domain, + orderBy: model.orderBy, + context: omit( + model.searchParams?.context || {}, + ...Object.keys(user.context) + ), + columns: this.getSpreadsheetColumns(), + fields: model.fields, + name: this.env.config.getDisplayName(), + }, + }, + }, + } + ); + }, + getSpreadsheetColumns() { + const fields = this.env.model.root.fields; + return this.columns + .filter( + (col) => + col.type === "field" && + col.field.component !== HandleField && + !col.relatedPropertyField && + !["binary", "json"].includes(fields[col.name].type) + // We want to avoid binary or json fields + ) + .map((col) => ({name: col.name, type: fields[col.name].type})); + }, +}); diff --git a/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js b/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js new file mode 100644 index 00000000..7b787a73 --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js @@ -0,0 +1,69 @@ +import {PivotRenderer} from "@web/views/pivot/pivot_renderer"; +import {_t} from "@web/core/l10n/translation"; +import {patch} from "@web/core/utils/patch"; + +patch(PivotRenderer.prototype, { + isComparingInfo() { + return Boolean(this.model.searchParams.comparison); + }, + containsDuplicatedGroupBys() { + const colGroupBys = new Set( + this.model.metaData.colGroupBys + .concat(this.model.metaData.expandedColGroupBys) + .map((el) => el.split(":")[0]) + ); + const rowGroupBys = new Set( + this.model.metaData.rowGroupBys + .concat(this.model.metaData.expandedRowGroupBys) + .map((el) => el.split(":")[0]) + ); + return Boolean(colGroupBys.intersection(rowGroupBys).size); + }, + containsColGroupBys() { + const colGroupBys = new Set( + this.model.metaData.colGroupBys + .concat(this.model.metaData.expandedColGroupBys) + .map((el) => el.split(":")[0]) + ); + return Boolean(colGroupBys.size); + }, + disableSpreadsheetInsertion() { + return ( + !this.model.hasData() || + !this.model.metaData.activeMeasures.length || + this.containsDuplicatedGroupBys() || + this.isComparingInfo() + ); + }, + getSpreadsheetInsertionTooltip() { + var message = _t("Add to spreadsheet"); + if (this.containsDuplicatedGroupBys()) { + message = _t("Duplicated groupbys in pivot are not supported"); + } else if (this.isComparingInfo()) { + message = _t("Comparisons in pivot are not supported"); + } + return message; + }, + onSpreadsheetButtonClicked() { + this.actionService.doAction( + "spreadsheet_oca.spreadsheet_spreadsheet_import_act_window", + { + additionalContext: { + default_name: this.model.metaData.title, + default_datasource_name: this.model.metaData.title, + default_can_be_dynamic: false, + default_can_have_dynamic_cols: false, + // Default_can_be_dynamic: true, + // default_can_have_dynamic_cols: this.containsColGroupBys(), + default_import_data: { + mode: "pivot", + metaData: JSON.parse(JSON.stringify(this.model.metaData)), + searchParams: JSON.parse( + JSON.stringify(this.model.searchParams) + ), + }, + }, + } + ); + }, +}); diff --git a/spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml b/spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml new file mode 100644 index 00000000..2eebc450 --- /dev/null +++ b/spreadsheet_oca/static/src/spreadsheet/pivot_controller.xml @@ -0,0 +1,19 @@ + + + + + + + + +
+ diff --git a/spreadsheet_oca/views/spreadsheet_spreadsheet.xml b/spreadsheet_oca/views/spreadsheet_spreadsheet.xml new file mode 100644 index 00000000..66dc4882 --- /dev/null +++ b/spreadsheet_oca/views/spreadsheet_spreadsheet.xml @@ -0,0 +1,96 @@ + + + + + spreadsheet.spreadsheet.search (in spreadsheet_oca) + spreadsheet.spreadsheet + + + + + + + spreadsheet.spreadsheet.tree (in spreadsheet_oca) + spreadsheet.spreadsheet + + + + +
+

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + Spreadsheets + spreadsheet.spreadsheet + list,form + [] + {} + + + + Spreadsheets + + spreadsheet_oca,static/description/icon.png + + + + diff --git a/spreadsheet_oca/wizards/__init__.py b/spreadsheet_oca/wizards/__init__.py new file mode 100644 index 00000000..845f1a3e --- /dev/null +++ b/spreadsheet_oca/wizards/__init__.py @@ -0,0 +1,2 @@ +from . import spreadsheet_select_row_number +from . import spreadsheet_spreadsheet_import diff --git a/spreadsheet_oca/wizards/spreadsheet_select_row_number.py b/spreadsheet_oca/wizards/spreadsheet_select_row_number.py new file mode 100644 index 00000000..51bb580b --- /dev/null +++ b/spreadsheet_oca/wizards/spreadsheet_select_row_number.py @@ -0,0 +1,15 @@ +# Copyright 2024 Tecnativa - Carlos Roca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class SpreadsheetSelectRowNumber(models.TransientModel): + _name = "spreadsheet.select.row.number" + _description = "Select number of rows to duplicate row" + + dynamic_rows = fields.Boolean() + number_of_rows = fields.Integer() + can_have_dynamic_cols = fields.Boolean() + dynamic_cols = fields.Boolean() + number_of_cols = fields.Integer() diff --git a/spreadsheet_oca/wizards/spreadsheet_select_row_number.xml b/spreadsheet_oca/wizards/spreadsheet_select_row_number.xml new file mode 100644 index 00000000..538c0756 --- /dev/null +++ b/spreadsheet_oca/wizards/spreadsheet_select_row_number.xml @@ -0,0 +1,23 @@ + + + + spreadsheet.select.row.number.form + spreadsheet.select.row.number + +
+ + + + + + + + + +
+
+
+
diff --git a/spreadsheet_oca/wizards/spreadsheet_spreadsheet_import.py b/spreadsheet_oca/wizards/spreadsheet_spreadsheet_import.py new file mode 100644 index 00000000..6db07da8 --- /dev/null +++ b/spreadsheet_oca/wizards/spreadsheet_spreadsheet_import.py @@ -0,0 +1,88 @@ +# Copyright 2022 CreuBlanca +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class SpreadsheetSpreadsheetImport(models.TransientModel): + _name = "spreadsheet.spreadsheet.import" + _description = "Import data to spreadsheet" + + @api.model + def _default_mode_id(self): + return self.env["spreadsheet.spreadsheet.import.mode"].search([], limit=1).id + + name = fields.Char() + datasource_name = fields.Char() + mode_id = fields.Many2one( + "spreadsheet.spreadsheet.import.mode", + required=True, + default=lambda r: r._default_mode_id(), + ) + mode = fields.Char(related="mode_id.code") + import_data = fields.Serialized() + spreadsheet_id = fields.Many2one("spreadsheet.spreadsheet") + can_be_dynamic = fields.Boolean() + can_have_dynamic_cols = fields.Boolean() + is_tree = fields.Boolean() + dynamic = fields.Boolean( + "Dynamic Rows", + help="This field allows you to generate tables that its rows are updated with" + " the filters set in the spreadsheets.", + ) + dynamic_cols = fields.Boolean( + "Dynamic Columns", + help="This field allows you to generate tables that its cols are updated with" + " the filters set in the spreadsheets.", + ) + number_of_rows = fields.Integer() + number_of_cols = fields.Integer("Number of Columns") + + def insert_pivot(self): + self.ensure_one() + return getattr(self, f"_insert_pivot_{self.mode_id.code}")() + + def _create_spreadsheet_vals(self): + return {"name": self.name} + + def _insert_pivot_new(self): + spreadsheet = self.env["spreadsheet.spreadsheet"].create( + self._create_spreadsheet_vals() + ) + import_data = self.import_data + import_data["name"] = self.datasource_name + import_data["new"] = 1 + if self.dynamic: + import_data["dyn_number_of_rows"] = self.number_of_rows + if self.dynamic_cols: + import_data["dyn_number_of_cols"] = self.number_of_cols + return { + "type": "ir.actions.client", + "tag": "action_spreadsheet_oca", + "params": { + "model": spreadsheet._name, + "spreadsheet_id": spreadsheet.id, + "import_data": import_data, + }, + } + + def _insert_pivot_add(self, new_sheet=False): + import_data = self.import_data + import_data["name"] = self.datasource_name + import_data["new_sheet"] = new_sheet + if self.dynamic: + import_data["dyn_number_of_rows"] = self.number_of_rows + if self.dynamic_cols: + import_data["dyn_number_of_cols"] = self.number_of_cols + return { + "type": "ir.actions.client", + "tag": "action_spreadsheet_oca", + "params": { + "model": "spreadsheet.spreadsheet", + "spreadsheet_id": self.spreadsheet_id.id, + "import_data": import_data, + }, + } + + def _insert_pivot_add_sheet(self): + return self._insert_pivot_add(True) diff --git a/spreadsheet_oca/wizards/spreadsheet_spreadsheet_import.xml b/spreadsheet_oca/wizards/spreadsheet_spreadsheet_import.xml new file mode 100644 index 00000000..04bdd272 --- /dev/null +++ b/spreadsheet_oca/wizards/spreadsheet_spreadsheet_import.xml @@ -0,0 +1,85 @@ + + + + + spreadsheet.spreadsheet.import.form (in spreadsheet_oca) + spreadsheet.spreadsheet.import + +
+ + + + + + + + + + + + + + + + + +
+
+
+
+
+ + + Import Pivot + spreadsheet.spreadsheet.import + form + {} + new + +