diff --git a/pos_dashboard_cooperative/README.md b/pos_dashboard_cooperative/README.md new file mode 100644 index 0000000..ca37e3f --- /dev/null +++ b/pos_dashboard_cooperative/README.md @@ -0,0 +1,29 @@ +# POS Dashboard Cooperative + +Real-time BI dashboards for cooperative supermarkets, built on top of +Point of Sale data. + +This module extends `report.pos.order` with three new dimensions: + +| Field | Description | +|---|---| +| `is_member_at_date` | True if the customer held a `share.line` whose `effective_date` was on or before the order date. | +| `categ_root_id` | Product family (root of `product.category` parent_path). | +| `categ_parent_id` | Product subfamily (parent of the leaf category). | +| `date_day` | Order date truncated to day. | +| `hour_of_day` | Hour of the order (`EXTRACT(HOUR FROM date_order)`). | +| `day_of_week` | Day of week, 1 = Monday … 7 = Sunday (ISO). | + +Pre-configured menus under *Point of Sale → Reporting → Cooperative +Dashboards* cover overview, members vs. non-members, categories, top +products, and time distributions. Four tiles surface the headline KPIs +on the `web_dashboard_tile` board. + +For spreadsheet dashboards published in Odoo's *Dashboards* menu, install +the companion module `spreadsheet_dashboard_pos_cooperative`. + +See `readme/` for the OCA-style structured documentation. + +## License + +AGPL-3.0 or later. diff --git a/pos_dashboard_cooperative/__init__.py b/pos_dashboard_cooperative/__init__.py new file mode 100644 index 0000000..4c4f242 --- /dev/null +++ b/pos_dashboard_cooperative/__init__.py @@ -0,0 +1 @@ +from . import report diff --git a/pos_dashboard_cooperative/__manifest__.py b/pos_dashboard_cooperative/__manifest__.py new file mode 100644 index 0000000..ce78c5d --- /dev/null +++ b/pos_dashboard_cooperative/__manifest__.py @@ -0,0 +1,27 @@ +# Copyright 2026 Criptomart +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +{ + "name": "POS Dashboard Cooperative", + "version": "16.0.1.0.0", + "summary": "Real-time BI dashboards for cooperative supermarkets (POS)", + "license": "AGPL-3", + "author": "Criptomart, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/pos", + "category": "Point of Sale", + "depends": [ + "point_of_sale", + "cooperator", + "pos_margin", + "web_dashboard_tile", + "web_pivot_computed_measure", + ], + "data": [ + "report/pos_order_report_views.xml", + "views/pos_order_report_member_views.xml", + "views/pos_order_report_category_views.xml", + "views/pos_order_report_time_views.xml", + "views/dashboard_tiles.xml", + "views/menus.xml", + ], + "installable": True, +} diff --git a/pos_dashboard_cooperative/i18n/es.po b/pos_dashboard_cooperative/i18n/es.po new file mode 100644 index 0000000..19431dc --- /dev/null +++ b/pos_dashboard_cooperative/i18n/es.po @@ -0,0 +1,151 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_dashboard_cooperative +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2026-06-05 12:00+0000\n" +"Last-Translator: Criptomart\n" +"Language-Team: Spanish\n" +"Language: es\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: pos_dashboard_cooperative +#: model:ir.actions.act_window,name:pos_dashboard_cooperative.action_pos_dashboard_by_day_of_week +msgid "Sales by Day of Week" +msgstr "Ventas por día de la semana" + +#. module: pos_dashboard_cooperative +#: model:ir.actions.act_window,name:pos_dashboard_cooperative.action_pos_dashboard_by_hour +msgid "Sales by Hour of Day" +msgstr "Ventas por hora del día" + +#. module: pos_dashboard_cooperative +#: model:ir.actions.act_window,name:pos_dashboard_cooperative.action_pos_dashboard_categories +msgid "Sales by Category" +msgstr "Ventas por categoría" + +#. module: pos_dashboard_cooperative +#: model:ir.actions.act_window,name:pos_dashboard_cooperative.action_pos_dashboard_members +msgid "Members vs Non-members" +msgstr "Socios vs no socios" + +#. module: pos_dashboard_cooperative +#: model:ir.actions.act_window,name:pos_dashboard_cooperative.action_pos_dashboard_overview +msgid "Cooperative POS Overview" +msgstr "Vista general TPV cooperativa" + +#. module: pos_dashboard_cooperative +#: model:ir.actions.act_window,name:pos_dashboard_cooperative.action_pos_dashboard_top_members +msgid "Top Member Buyers" +msgstr "Top socias compradoras" + +#. module: pos_dashboard_cooperative +#: model:ir.actions.act_window,name:pos_dashboard_cooperative.action_pos_dashboard_top_products +msgid "Top Products" +msgstr "Top productos" + +#. module: pos_dashboard_cooperative +#: model:ir.model,name:pos_dashboard_cooperative.model_report_pos_order +msgid "Point of Sale Orders Report" +msgstr "Informe de pedidos del TPV" + +#. module: pos_dashboard_cooperative +#: model:ir.model.fields,field_description:pos_dashboard_cooperative.field_report_pos_order__categ_parent_id +msgid "Product Subfamily (parent)" +msgstr "Subfamilia de producto (padre)" + +#. module: pos_dashboard_cooperative +#: model:ir.model.fields,field_description:pos_dashboard_cooperative.field_report_pos_order__categ_root_id +msgid "Product Family (root)" +msgstr "Familia de producto (raíz)" + +#. module: pos_dashboard_cooperative +#: model:ir.model.fields,field_description:pos_dashboard_cooperative.field_report_pos_order__date_day +msgid "Order Day" +msgstr "Día del pedido" + +#. module: pos_dashboard_cooperative +#: model:ir.model.fields,field_description:pos_dashboard_cooperative.field_report_pos_order__day_of_week +msgid "Day of Week (1=Mon, 7=Sun)" +msgstr "Día de la semana (1=lun, 7=dom)" + +#. module: pos_dashboard_cooperative +#: model:ir.model.fields,field_description:pos_dashboard_cooperative.field_report_pos_order__hour_of_day +msgid "Hour of Day" +msgstr "Hora del día" + +#. module: pos_dashboard_cooperative +#: model:ir.model.fields,field_description:pos_dashboard_cooperative.field_report_pos_order__is_member_at_date +msgid "Member at Order Date" +msgstr "Socio en la fecha del pedido" + +#. module: pos_dashboard_cooperative +#: model:ir.ui.menu,name:pos_dashboard_cooperative.menu_pos_dashboard_by_day +msgid "By Day of Week" +msgstr "Por día de la semana" + +#. module: pos_dashboard_cooperative +#: model:ir.ui.menu,name:pos_dashboard_cooperative.menu_pos_dashboard_by_hour +msgid "By Hour of Day" +msgstr "Por hora del día" + +#. module: pos_dashboard_cooperative +#: model:ir.ui.menu,name:pos_dashboard_cooperative.menu_pos_dashboard_categories +msgid "By Category" +msgstr "Por categoría" + +#. module: pos_dashboard_cooperative +#: model:ir.ui.menu,name:pos_dashboard_cooperative.menu_pos_dashboard_cooperative +msgid "Cooperative Dashboards" +msgstr "Tableros de la cooperativa" + +#. module: pos_dashboard_cooperative +#: model:ir.ui.menu,name:pos_dashboard_cooperative.menu_pos_dashboard_members +msgid "Members vs Non-members" +msgstr "Socios vs no socios" + +#. module: pos_dashboard_cooperative +#: model:ir.ui.menu,name:pos_dashboard_cooperative.menu_pos_dashboard_overview +msgid "Overview" +msgstr "Vista general" + +#. module: pos_dashboard_cooperative +#: model:ir.ui.menu,name:pos_dashboard_cooperative.menu_pos_dashboard_top_members +msgid "Top Members" +msgstr "Top socias" + +#. module: pos_dashboard_cooperative +#: model:ir.ui.menu,name:pos_dashboard_cooperative.menu_pos_dashboard_top_products +msgid "Top Products" +msgstr "Top productos" + +#. module: pos_dashboard_cooperative +#: model:tile.category,name:pos_dashboard_cooperative.tile_category_cooperative +msgid "Cooperative POS" +msgstr "TPV cooperativa" + +#. module: pos_dashboard_cooperative +#: model:tile.tile,name:pos_dashboard_cooperative.tile_pos_margin_last_30_days +msgid "Margin last 30 days (€)" +msgstr "Margen últimos 30 días (€)" + +#. module: pos_dashboard_cooperative +#: model:tile.tile,name:pos_dashboard_cooperative.tile_pos_sales_last_30_days +msgid "Sales last 30 days (€)" +msgstr "Ventas últimos 30 días (€)" + +#. module: pos_dashboard_cooperative +#: model:tile.tile,name:pos_dashboard_cooperative.tile_pos_sales_members_last_30_days +msgid "Members sales last 30 days (€)" +msgstr "Ventas a socias últimos 30 días (€)" + +#. module: pos_dashboard_cooperative +#: model:tile.tile,name:pos_dashboard_cooperative.tile_pos_sales_non_members_last_30_days +msgid "Non-members sales last 30 days (€)" +msgstr "Ventas a no socias últimos 30 días (€)" diff --git a/pos_dashboard_cooperative/i18n/pos_dashboard_cooperative.pot b/pos_dashboard_cooperative/i18n/pos_dashboard_cooperative.pot new file mode 100644 index 0000000..9875547 --- /dev/null +++ b/pos_dashboard_cooperative/i18n/pos_dashboard_cooperative.pot @@ -0,0 +1,149 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_dashboard_cooperative +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: pos_dashboard_cooperative +#: model:ir.actions.act_window,name:pos_dashboard_cooperative.action_pos_dashboard_by_day_of_week +msgid "Sales by Day of Week" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:ir.actions.act_window,name:pos_dashboard_cooperative.action_pos_dashboard_by_hour +msgid "Sales by Hour of Day" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:ir.actions.act_window,name:pos_dashboard_cooperative.action_pos_dashboard_categories +msgid "Sales by Category" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:ir.actions.act_window,name:pos_dashboard_cooperative.action_pos_dashboard_members +msgid "Members vs Non-members" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:ir.actions.act_window,name:pos_dashboard_cooperative.action_pos_dashboard_overview +msgid "Cooperative POS Overview" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:ir.actions.act_window,name:pos_dashboard_cooperative.action_pos_dashboard_top_members +msgid "Top Member Buyers" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:ir.actions.act_window,name:pos_dashboard_cooperative.action_pos_dashboard_top_products +msgid "Top Products" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:ir.model,name:pos_dashboard_cooperative.model_report_pos_order +msgid "Point of Sale Orders Report" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:ir.model.fields,field_description:pos_dashboard_cooperative.field_report_pos_order__categ_parent_id +msgid "Product Subfamily (parent)" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:ir.model.fields,field_description:pos_dashboard_cooperative.field_report_pos_order__categ_root_id +msgid "Product Family (root)" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:ir.model.fields,field_description:pos_dashboard_cooperative.field_report_pos_order__date_day +msgid "Order Day" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:ir.model.fields,field_description:pos_dashboard_cooperative.field_report_pos_order__day_of_week +msgid "Day of Week (1=Mon, 7=Sun)" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:ir.model.fields,field_description:pos_dashboard_cooperative.field_report_pos_order__hour_of_day +msgid "Hour of Day" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:ir.model.fields,field_description:pos_dashboard_cooperative.field_report_pos_order__is_member_at_date +msgid "Member at Order Date" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:ir.ui.menu,name:pos_dashboard_cooperative.menu_pos_dashboard_by_day +msgid "By Day of Week" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:ir.ui.menu,name:pos_dashboard_cooperative.menu_pos_dashboard_by_hour +msgid "By Hour of Day" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:ir.ui.menu,name:pos_dashboard_cooperative.menu_pos_dashboard_categories +msgid "By Category" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:ir.ui.menu,name:pos_dashboard_cooperative.menu_pos_dashboard_cooperative +msgid "Cooperative Dashboards" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:ir.ui.menu,name:pos_dashboard_cooperative.menu_pos_dashboard_members +msgid "Members vs Non-members" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:ir.ui.menu,name:pos_dashboard_cooperative.menu_pos_dashboard_overview +msgid "Overview" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:ir.ui.menu,name:pos_dashboard_cooperative.menu_pos_dashboard_top_members +msgid "Top Members" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:ir.ui.menu,name:pos_dashboard_cooperative.menu_pos_dashboard_top_products +msgid "Top Products" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:tile.category,name:pos_dashboard_cooperative.tile_category_cooperative +msgid "Cooperative POS" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:tile.tile,name:pos_dashboard_cooperative.tile_pos_margin_last_30_days +msgid "Margin last 30 days (€)" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:tile.tile,name:pos_dashboard_cooperative.tile_pos_sales_last_30_days +msgid "Sales last 30 days (€)" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:tile.tile,name:pos_dashboard_cooperative.tile_pos_sales_members_last_30_days +msgid "Members sales last 30 days (€)" +msgstr "" + +#. module: pos_dashboard_cooperative +#: model:tile.tile,name:pos_dashboard_cooperative.tile_pos_sales_non_members_last_30_days +msgid "Non-members sales last 30 days (€)" +msgstr "" diff --git a/pos_dashboard_cooperative/readme/CONFIGURE.rst b/pos_dashboard_cooperative/readme/CONFIGURE.rst new file mode 100644 index 0000000..85e3354 --- /dev/null +++ b/pos_dashboard_cooperative/readme/CONFIGURE.rst @@ -0,0 +1,7 @@ +No specific configuration is required after installation. The module +auto-installs ``pos_margin``, ``web_dashboard_tile`` and +``web_pivot_computed_measure`` if they are not already present. + +To control who sees the new dashboards, adjust the standard POS +security groups (``point_of_sale.group_pos_manager``) — the new analyses +inherit the access rules already in place for ``report.pos.order``. diff --git a/pos_dashboard_cooperative/readme/CONTRIBUTORS.rst b/pos_dashboard_cooperative/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..c8ac156 --- /dev/null +++ b/pos_dashboard_cooperative/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Criptomart diff --git a/pos_dashboard_cooperative/readme/DESCRIPTION.rst b/pos_dashboard_cooperative/readme/DESCRIPTION.rst new file mode 100644 index 0000000..8e92fa6 --- /dev/null +++ b/pos_dashboard_cooperative/readme/DESCRIPTION.rst @@ -0,0 +1,24 @@ +Real-time Business Intelligence dashboards for cooperative supermarkets +built on top of Point of Sale data. Extends the standard +``report.pos.order`` view to expose new dimensions that the standard POS +analysis lacks: + +* **Cooperative member dimension** — ``is_member_at_date`` flags each + ticket line according to the customer's share status *at the order + date*, so historic comparisons (members vs. non-members) reflect the + reality of the moment. +* **Category hierarchy** — ``categ_root_id`` (family) and + ``categ_parent_id`` (subfamily) derived from + ``product.category.parent_path``, ready to drive drilldowns. +* **Time dimensions** — ``date_day``, ``hour_of_day``, ``day_of_week`` + for daily/weekly/hourly distributions. + +Pre-configured menu entries under *Point of Sale → Reporting → +Cooperative Dashboards* cover overview, members vs. non-members, +categories, top products, day-of-week and hour-of-day analyses. Four +dashboard tiles surface the most important KPIs on the +``web_dashboard_tile`` board. + +The companion module ``spreadsheet_dashboard_pos_cooperative`` publishes +spreadsheet dashboards in Odoo's *Dashboards* menu that consume the +same data. diff --git a/pos_dashboard_cooperative/readme/ROADMAP.rst b/pos_dashboard_cooperative/readme/ROADMAP.rst new file mode 100644 index 0000000..4a92257 --- /dev/null +++ b/pos_dashboard_cooperative/readme/ROADMAP.rst @@ -0,0 +1,12 @@ +* Materialize the SQL view into a regular table populated by a nightly + cron, in case real-time aggregation becomes too slow on very large + POS datasets. +* Refine the ``is_member_at_date`` calculation by consuming + ``subscription.register`` to subtract sell-back and transfer + operations from the share balance. The current implementation simply + checks for the existence of a ``share.line`` dated on or before the + order date, which over-reports memberships when shares are returned. +* Add multi-company test coverage once a clean multi-company test + fixture is available. +* Add Galician, Catalan, French, Dutch and Croatian translations + (currently shipped with Spanish only). diff --git a/pos_dashboard_cooperative/readme/USAGE.rst b/pos_dashboard_cooperative/readme/USAGE.rst new file mode 100644 index 0000000..8e7d40b --- /dev/null +++ b/pos_dashboard_cooperative/readme/USAGE.rst @@ -0,0 +1,39 @@ +Open *Point of Sale → Reporting → Cooperative Dashboards* and pick one +of the predefined analyses: + +* **Overview** — sales, margin and order count grouped by month. +* **Members vs Non-members** — same axes split by cooperative + membership at the order date. +* **Top Members** — sales aggregated per cooperative member, sort by + total to obtain the top buyers. +* **By Category** — sales by product family (root category); drill down + to subfamily and product from the *Group By* menu. +* **Top Products** — sales per product. +* **By Day of Week / By Hour of Day** — temporal distributions. + +In every view, additional dimensions are available from the *Filters* +and *Group By* menus: ``Members``, ``Non members``, ``Member``, +``Product Family``, ``Product Subfamily``, ``Day of Week``, +``Hour of Day``. + +Time dimensions +=============== + +* ``day_of_week`` is the ISO day number (``EXTRACT(ISODOW FROM + date_order)``): **1 = Monday, 2 = Tuesday, 3 = Wednesday, 4 = + Thursday, 5 = Friday, 6 = Saturday, 7 = Sunday**. +* ``hour_of_day`` is the integer hour in the order's timezone + (``EXTRACT(HOUR FROM date_order)``), 0..23. + +These are deliberately exposed as integers rather than translated +labels so they aggregate cleanly in pivots, charts and spreadsheet +formulas. Map the numbers to weekday names in the consumer (for +example, in the o-spreadsheet dashboards) if a localized label is +needed. + +Pivot views support the ratios defined by ``web_pivot_computed_measure`` +(e.g. average ticket = total sales / order count). Click *Insert +Computed Measure* in the pivot's *Measures* menu. + +For curated dashboards rendered in Odoo's *Dashboards* menu, install +the companion module ``spreadsheet_dashboard_pos_cooperative``. diff --git a/pos_dashboard_cooperative/report/__init__.py b/pos_dashboard_cooperative/report/__init__.py new file mode 100644 index 0000000..1ddfcaa --- /dev/null +++ b/pos_dashboard_cooperative/report/__init__.py @@ -0,0 +1 @@ +from . import pos_order_report diff --git a/pos_dashboard_cooperative/report/pos_order_report.py b/pos_dashboard_cooperative/report/pos_order_report.py new file mode 100644 index 0000000..a208841 --- /dev/null +++ b/pos_dashboard_cooperative/report/pos_order_report.py @@ -0,0 +1,130 @@ +# Copyright 2026 Criptomart +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class PosOrderReport(models.Model): + _inherit = "report.pos.order" + + # --- Time dimensions ---------------------------------------------------- + date_day = fields.Date( + string="Order Day", + readonly=True, + ) + hour_of_day = fields.Integer( + string="Hour of Day", + readonly=True, + group_operator=None, + ) + day_of_week = fields.Integer( + string="Day of Week (1=Mon, 7=Sun)", + readonly=True, + group_operator=None, + ) + + # --- Category hierarchy ------------------------------------------------- + # Family = root category, subfamily = direct parent of categ_id. + # Computed from product.category.parent_path (materialized path + # "1/3/7/"), which is maintained automatically by Odoo (_parent_store). + categ_root_id = fields.Many2one( + "product.category", + string="Product Family (root)", + readonly=True, + ) + categ_root_id_int = fields.Integer( + string="Product Family ID (root)", + readonly=True, + group_operator=None, + ) + categ_parent_id = fields.Many2one( + "product.category", + string="Product Subfamily (parent)", + readonly=True, + ) + categ_parent_id_int = fields.Integer( + string="Product Subfamily ID (parent)", + readonly=True, + group_operator=None, + ) + product_categ_id_int = fields.Integer( + string="Product Category ID (leaf)", + readonly=True, + group_operator=None, + ) + product_id_int = fields.Integer( + string="Product ID", + readonly=True, + group_operator=None, + ) + + # --- Cooperative member dimension -------------------------------------- + # True when the customer of the ticket held at least one share line whose + # effective_date was on or before the order date, in the same company. + # + # NOTE: this is an approximation. cooperator does not store an end date + # on share.line; share buy-backs and transfers are recorded only in + # subscription.register. A future version may refine the calculation by + # consuming subscription.register to substract sell_back/transfer + # operations, at the cost of a more expensive subquery. + is_member_at_date = fields.Boolean( + string="Member at Order Date", + readonly=True, + ) + + def _select(self): + return ( + super()._select() + + """, + s.date_order::date AS date_day, + EXTRACT(HOUR FROM (s.date_order AT TIME ZONE 'UTC') AT TIME ZONE 'Europe/Madrid')::int AS hour_of_day, + EXTRACT(ISODOW FROM s.date_order)::int AS day_of_week, + cat_root.id AS categ_root_id, + cat_root.id AS categ_root_id_int, + pt_categ.parent_id AS categ_parent_id, + pt_categ.parent_id AS categ_parent_id_int, + pt.categ_id AS product_categ_id_int, + pt.id AS product_id_int, + CASE WHEN EXISTS ( + SELECT 1 FROM share_line sl + WHERE sl.partner_id = s.partner_id + AND sl.company_id = s.company_id + AND sl.effective_date IS NOT NULL + AND sl.effective_date <= s.date_order::date + ) THEN TRUE ELSE FALSE END AS is_member_at_date + """ + ) + + def _from(self): + # Extra joins to resolve: + # - pt_categ: direct category of the product (used for parent_id and + # parent_path lookup). + # - cat_root: root category, found by taking the first id in + # parent_path. parent_path looks like "1/3/7/". + return ( + super()._from() + + """ + LEFT JOIN product_category pt_categ ON pt_categ.id = pt.categ_id + LEFT JOIN product_category cat_root + ON cat_root.id = NULLIF( + split_part(pt_categ.parent_path, '/', 1), '' + )::int + """ + ) + + def _group_by(self): + # Append non-aggregated expressions added in _select() that are not + # already in the parent GROUP BY. s.date_order is already there + # (point_of_sale.report.pos_order_report._group_by), so the time + # dimensions derived from it (date_day, hour_of_day, day_of_week) + # are functionally dependent and don't need to be listed. + # is_member_at_date is a scalar subquery; not needed either. + return ( + super()._group_by() + + """, + cat_root.id, + pt_categ.parent_id, + pt.categ_id, + pt.id + """ + ) diff --git a/pos_dashboard_cooperative/report/pos_order_report_views.xml b/pos_dashboard_cooperative/report/pos_order_report_views.xml new file mode 100644 index 0000000..18a48cb --- /dev/null +++ b/pos_dashboard_cooperative/report/pos_order_report_views.xml @@ -0,0 +1,125 @@ + + + + + + + report.pos.order.search.cooperative + report.pos.order + + + + + + + + + + + + + + + + + + + + + + report.pos.order.pivot.cooperative + report.pos.order + + + + + + + + + + + + report.pos.order.tree.cooperative + report.pos.order + + + + + + + + + + + + + + + Cooperative POS Overview + report.pos.order + graph,pivot,tree + + { + 'search_default_order_month': 1, + 'group_by_no_leaf': 1, + 'group_by': [], + } + +

+ No data yet! +

+ Sell some products at the Point of Sale to populate this + cooperative dashboard. +

+
+
+ +
diff --git a/pos_dashboard_cooperative/tests/__init__.py b/pos_dashboard_cooperative/tests/__init__.py new file mode 100644 index 0000000..275170b --- /dev/null +++ b/pos_dashboard_cooperative/tests/__init__.py @@ -0,0 +1 @@ +from . import test_pos_dashboard diff --git a/pos_dashboard_cooperative/tests/test_pos_dashboard.py b/pos_dashboard_cooperative/tests/test_pos_dashboard.py new file mode 100644 index 0000000..2c85f1a --- /dev/null +++ b/pos_dashboard_cooperative/tests/test_pos_dashboard.py @@ -0,0 +1,215 @@ +# Copyright 2026 Criptomart +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import date, timedelta + +import odoo +from odoo.tests.common import TransactionCase + + +@odoo.tests.tagged("post_install", "-at_install") +class TestPosDashboardCooperative(TransactionCase): + """Validate the extra dimensions added by pos_dashboard_cooperative on + top of point_of_sale.report.pos.order: + + - time dimensions (date_day, hour_of_day, day_of_week) + - product category hierarchy (categ_root_id, categ_parent_id) + - cooperative member historic flag (is_member_at_date) + + These tests use a minimal hand-built pos.session to stay independent + from any existing data in the database and from the heavy + TestPoSCommon setup machinery, which requires a clean accounting + setup. + """ + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.company = cls.env.ref("base.main_company") + + # Two-level category hierarchy: family -> subfamily -> leaf + cls.family_root = cls.env["product.category"].create( + {"name": "DASHBOARD-FAMILY-ROOT"} + ) + cls.subfamily = cls.env["product.category"].create( + {"name": "DASHBOARD-SUBFAMILY", "parent_id": cls.family_root.id} + ) + cls.categ_leaf = cls.env["product.category"].create( + {"name": "DASHBOARD-LEAF", "parent_id": cls.subfamily.id} + ) + + # Product sold at the POS in every test. + cls.product = cls.env["product.product"].create( + { + "name": "DASHBOARD-PRODUCT", + "type": "consu", + "available_in_pos": True, + "list_price": 10.0, + "standard_price": 6.0, + "categ_id": cls.categ_leaf.id, + } + ) + + # Share product needed by cooperator.share.line. + cls.share_product = cls.env["product.product"].create( + { + "name": "DASHBOARD-SHARE", + "is_share": True, + "type": "service", + "list_price": 25.0, + } + ) + + # Two partners: one cooperative member (share dated in the past) + # and one non-member. + cls.member_partner = cls.env["res.partner"].create( + {"name": "DASHBOARD-MEMBER"} + ) + cls.non_member_partner = cls.env["res.partner"].create( + {"name": "DASHBOARD-NON-MEMBER"} + ) + cls.env["share.line"].create( + { + "partner_id": cls.member_partner.id, + "share_product_id": cls.share_product.id, + "share_number": 1, + "share_unit_price": 25.0, + "effective_date": date.today() - timedelta(days=365), + "company_id": cls.company.id, + } + ) + + # Reuse an existing POS config to avoid bootstrapping payment + # methods and journals from scratch. Any installed config is + # acceptable since we never go through the POS UI. + cls.pos_config = cls.env["pos.config"].search( + [("company_id", "=", cls.company.id)], limit=1 + ) + assert cls.pos_config, "A pos.config in the main company is required." + if not cls.pos_config.current_session_id: + cls.pos_config.open_ui() + cls.pos_session = cls.pos_config.current_session_id + + # ------------------------------------------------------------------ + # Helpers + # ------------------------------------------------------------------ + def _create_pos_order(self, partner): + return self.env["pos.order"].create( + { + "session_id": self.pos_session.id, + "partner_id": partner.id, + "company_id": self.company.id, + "lines": [ + ( + 0, + 0, + { + "name": "DASHBOARD-OL", + "product_id": self.product.id, + "price_unit": 10.0, + "discount": 0, + "qty": 1.0, + "price_subtotal": 10.0, + "price_subtotal_incl": 10.0, + "total_cost": 6.0, + }, + ) + ], + "amount_total": 10.0, + "amount_tax": 0.0, + "amount_paid": 0.0, + "amount_return": 0.0, + } + ) + + def _reports_for(self, partner): + return ( + self.env["report.pos.order"] + .sudo() + .search( + [ + ("product_id", "=", self.product.id), + ("partner_id", "=", partner.id), + ], + order="id", + ) + ) + + # ------------------------------------------------------------------ + # Tests + # ------------------------------------------------------------------ + def test_member_flag_for_member_partner(self): + """Partner with a share line predating the order is flagged as + member.""" + self._create_pos_order(self.member_partner) + reports = self._reports_for(self.member_partner) + self.assertTrue(reports) + self.assertTrue(reports[0].is_member_at_date) + + def test_member_flag_for_non_member_partner(self): + """Partner without any share line is not flagged as member.""" + self._create_pos_order(self.non_member_partner) + reports = self._reports_for(self.non_member_partner) + self.assertTrue(reports) + self.assertFalse(reports[0].is_member_at_date) + + def test_member_flag_is_historic(self): + """Share line dated AFTER the order date does not mark the partner + as member for that order.""" + future_member = self.env["res.partner"].create( + {"name": "DASHBOARD-FUTURE-MEMBER"} + ) + self._create_pos_order(future_member) + self.env["share.line"].create( + { + "partner_id": future_member.id, + "share_product_id": self.share_product.id, + "share_number": 1, + "share_unit_price": 25.0, + "effective_date": date.today() + timedelta(days=30), + "company_id": self.company.id, + } + ) + reports = self._reports_for(future_member) + self.assertTrue(reports) + self.assertFalse( + reports[0].is_member_at_date, + "Member flag must reflect the situation at order date.", + ) + + def test_category_hierarchy_is_resolved(self): + """categ_root_id and categ_parent_id reflect the product category + ancestors derived from parent_path.""" + self._create_pos_order(self.member_partner) + reports = self._reports_for(self.member_partner) + self.assertTrue(reports) + report = reports[0] + self.assertEqual(report.categ_root_id, self.family_root) + self.assertEqual(report.categ_parent_id, self.subfamily) + + def test_time_dimensions_are_populated(self): + """date_day matches order date; hour_of_day / day_of_week are in + valid ranges.""" + self._create_pos_order(self.member_partner) + reports = self._reports_for(self.member_partner) + self.assertTrue(reports) + report = reports[0] + self.assertIsNotNone(report.date_day) + self.assertGreaterEqual(report.hour_of_day, 0) + self.assertLess(report.hour_of_day, 24) + self.assertGreaterEqual(report.day_of_week, 1) + self.assertLessEqual(report.day_of_week, 7) + + def test_read_group_by_member_flag(self): + """Aggregations grouped by the member flag return one row per + member status when both kinds of partners have purchased.""" + self._create_pos_order(self.member_partner) + self._create_pos_order(self.non_member_partner) + results = self.env["report.pos.order"].read_group( + [("product_id", "=", self.product.id)], + ["price_total", "is_member_at_date"], + ["is_member_at_date"], + ) + statuses = {r["is_member_at_date"] for r in results} + self.assertIn(True, statuses) + self.assertIn(False, statuses) diff --git a/pos_dashboard_cooperative/views/dashboard_tiles.xml b/pos_dashboard_cooperative/views/dashboard_tiles.xml new file mode 100644 index 0000000..2a74920 --- /dev/null +++ b/pos_dashboard_cooperative/views/dashboard_tiles.xml @@ -0,0 +1,104 @@ + + + + + + + Cooperative POS + 100 + + + + + + Sales last 30 days (€) + 10 + + + + sum + + {:,.2f} € + [('state', 'in', ['paid', 'done', 'invoiced']), + ('date', '>=', (context_today - relativedelta(days=30)).strftime('%Y-%m-%d'))] + #2E7D32 + #FFFFFF + + + + Margin last 30 days (€) + 20 + + + + sum + + {:,.2f} € + [('state', 'in', ['paid', 'done', 'invoiced']), + ('date', '>=', (context_today - relativedelta(days=30)).strftime('%Y-%m-%d'))] + #1565C0 + #FFFFFF + + + + Members sales last 30 days (€) + 30 + + + + sum + + {:,.2f} € + [('state', 'in', ['paid', 'done', 'invoiced']), + ('is_member_at_date', '=', True), + ('date', '>=', (context_today - relativedelta(days=30)).strftime('%Y-%m-%d'))] + #EF6C00 + #FFFFFF + + + + Non-members sales last 30 days (€) + 40 + + + + sum + + {:,.2f} € + [('state', 'in', ['paid', 'done', 'invoiced']), + ('is_member_at_date', '=', False), + ('date', '>=', (context_today - relativedelta(days=30)).strftime('%Y-%m-%d'))] + #6A1B9A + #FFFFFF + + + diff --git a/pos_dashboard_cooperative/views/menus.xml b/pos_dashboard_cooperative/views/menus.xml new file mode 100644 index 0000000..8bafc82 --- /dev/null +++ b/pos_dashboard_cooperative/views/menus.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/pos_dashboard_cooperative/views/pos_order_report_category_views.xml b/pos_dashboard_cooperative/views/pos_order_report_category_views.xml new file mode 100644 index 0000000..1af9acf --- /dev/null +++ b/pos_dashboard_cooperative/views/pos_order_report_category_views.xml @@ -0,0 +1,43 @@ + + + + + + + Sales by Category + report.pos.order + pivot,graph,tree + + { + 'search_default_group_categ_root': 1, + 'search_default_order_month': 1, + 'group_by_no_leaf': 1, + } + +

+ No data yet! +

+ Add Subfamily or Product group-bys to drill down. Useful + to detect tractor categories. +

+
+
+ + + Top Products + report.pos.order + pivot,tree,graph + + { + 'group_by': ['product_id'], + 'group_by_no_leaf': 1, + } + + +
diff --git a/pos_dashboard_cooperative/views/pos_order_report_member_views.xml b/pos_dashboard_cooperative/views/pos_order_report_member_views.xml new file mode 100644 index 0000000..a0abb2d --- /dev/null +++ b/pos_dashboard_cooperative/views/pos_order_report_member_views.xml @@ -0,0 +1,57 @@ + + + + + + + Members vs Non-members + report.pos.order + pivot,graph,tree + + { + 'search_default_group_member': 1, + 'search_default_order_month': 1, + 'group_by_no_leaf': 1, + } + +

+ No data yet! +

+ This view contrasts cooperative members and non-members on + the same axes (sales, ticket count, margin). +

+
+
+ + + + Top Member Buyers + report.pos.order + pivot,tree,graph + + [('is_member_at_date', '=', True)] + { + 'search_default_members': 1, + 'group_by': ['partner_id'], + 'group_by_no_leaf': 1, + } + +

+ No data yet! +

+ Sales aggregated per cooperative member. Sort by total + price to obtain the top buyers. +

+
+
+ +
diff --git a/pos_dashboard_cooperative/views/pos_order_report_time_views.xml b/pos_dashboard_cooperative/views/pos_order_report_time_views.xml new file mode 100644 index 0000000..0e8edcd --- /dev/null +++ b/pos_dashboard_cooperative/views/pos_order_report_time_views.xml @@ -0,0 +1,33 @@ + + + + + + + Sales by Day of Week + report.pos.order + graph,pivot,tree + + { + 'search_default_group_day_of_week': 1, + 'group_by_no_leaf': 1, + } + + + + Sales by Hour of Day + report.pos.order + graph,pivot,tree + + { + 'search_default_group_hour_of_day': 1, + 'group_by_no_leaf': 1, + } + + + diff --git a/spreadsheet_dashboard_pos_cooperative/README.md b/spreadsheet_dashboard_pos_cooperative/README.md new file mode 100644 index 0000000..3feca4e --- /dev/null +++ b/spreadsheet_dashboard_pos_cooperative/README.md @@ -0,0 +1,31 @@ +# Spreadsheet Dashboard POS Cooperative + +Publishes spreadsheet-based dashboards in Odoo's *Dashboards* menu, in +a dedicated *Cooperative* group. Built on top of o-spreadsheet, the +same technology used by Odoo's official `spreadsheet_dashboard_*` +modules (`spreadsheet_dashboard_sale`, `spreadsheet_dashboard_purchase`, +etc.). + +Depends on `pos_dashboard_cooperative` for the underlying data model +(`report.pos.order` extended with member / category / time +dimensions). + +Four dashboards are bundled: + +| Dashboard | Contents | +|---|---| +| POS Overview | Sales, Orders, Avg ticket, Margin + monthly chart | +| POS Members | Members vs non-members KPIs + monthly chart + TOP 50 buyers | +| POS Categories | Members contribution + TOP 10 families / subfamilies / products | +| POS Sales by Time | Sales by day of week + sales by hour of day | + +The JSON files under `data/files/` are hand-authored and intentionally +diff-friendly. To redesign one of them visually, install +`spreadsheet_oca`, edit in the o-spreadsheet UI, export to JSON and +replace the matching file. + +See `readme/USAGE.rst` for the full procedure and metric definitions. + +## License + +AGPL-3.0 or later. diff --git a/spreadsheet_dashboard_pos_cooperative/__init__.py b/spreadsheet_dashboard_pos_cooperative/__init__.py new file mode 100644 index 0000000..d9b29b8 --- /dev/null +++ b/spreadsheet_dashboard_pos_cooperative/__init__.py @@ -0,0 +1 @@ +# Part of the spreadsheet_dashboard ecosystem. Nothing to import. diff --git a/spreadsheet_dashboard_pos_cooperative/__manifest__.py b/spreadsheet_dashboard_pos_cooperative/__manifest__.py new file mode 100644 index 0000000..7db1242 --- /dev/null +++ b/spreadsheet_dashboard_pos_cooperative/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2026 Criptomart +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +{ + "name": "Spreadsheet dashboard for POS cooperative", + "version": "16.0.1.0.0", + "category": "Hidden", + "summary": "Spreadsheet dashboards for cooperative supermarkets POS", + "license": "AGPL-3", + "author": "Criptomart, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/pos", + "depends": [ + "spreadsheet_dashboard", + "pos_dashboard_cooperative", + ], + "data": [ + "data/dashboards.xml", + ], + "auto_install": ["pos_dashboard_cooperative"], + "installable": True, +} diff --git a/spreadsheet_dashboard_pos_cooperative/data/dashboards.xml b/spreadsheet_dashboard_pos_cooperative/data/dashboards.xml new file mode 100644 index 0000000..795d620 --- /dev/null +++ b/spreadsheet_dashboard_pos_cooperative/data/dashboards.xml @@ -0,0 +1,82 @@ + + + + + + + PDV Supermercado + 150 + + + + + Ventas + + + + 100 + + + + + Ventas horas y días + + + + 400 + + + + + Categorías + + + + 300 + + + + + Socias + + + + 200 + + + diff --git a/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json b/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json new file mode 100644 index 0000000..2dbc93c --- /dev/null +++ b/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json @@ -0,0 +1,1799 @@ +{ + "version": 12, + "sheets": [ + { + "id": "dashboard", + "name": "Categories", + "colNumber": 12, + "rowNumber": 50, + "rows": { + "0": { + "size": 40 + } + }, + "cols": { + "0": { + "size": 340 + }, + "1": { + "size": 140 + }, + "2": { + "size": 100 + }, + "3": { + "size": 100 + }, + "4": { + "size": 110 + }, + "5": { + "size": 340 + }, + "6": { + "size": 140 + }, + "7": { + "size": 100 + }, + "8": { + "size": 100 + }, + "9": { + "size": 110 + } + }, + "merges": [], + "cells": { + "A1": { + "style": 1, + "content": "=_t(\"Cooperative POS — Categories\")" + }, + "A3": { + "style": 2, + "content": "=_t(\"Top 10 categorías\")" + }, + "A4": { + "style": 3, + "content": "=_t(\"Categoría\")", + "border": 1 + }, + "B4": { + "style": 3, + "content": "=_t(\"Ventas (€)\")", + "border": 1 + }, + "C4": { + "style": 3, + "content": "=_t(\"Tickets\")", + "border": 1 + }, + "D4": { + "style": 3, + "content": "=_t(\"Cuota %\")", + "border": 1 + }, + "E4": { + "style": 3, + "content": "=_t(\"Var %\")", + "border": 1 + }, + "F3": { + "style": 2, + "content": "=_t(\"Top 10 familias\")" + }, + "F4": { + "style": 3, + "content": "=_t(\"Familia\")", + "border": 1 + }, + "G4": { + "style": 3, + "content": "=_t(\"Ventas (€)\")", + "border": 1 + }, + "H4": { + "style": 3, + "content": "=_t(\"Tickets\")", + "border": 1 + }, + "I4": { + "style": 3, + "content": "=_t(\"Cuota %\")", + "border": 1 + }, + "J4": { + "style": 3, + "content": "=_t(\"Var %\")", + "border": 1 + }, + "A16": { + "style": 2, + "content": "=_t(\"Top 10 subfamilias\")" + }, + "A17": { + "style": 3, + "content": "=_t(\"Subfamilia\")", + "border": 1 + }, + "B17": { + "style": 3, + "content": "=_t(\"Ventas (€)\")", + "border": 1 + }, + "C17": { + "style": 3, + "content": "=_t(\"Tickets\")", + "border": 1 + }, + "D17": { + "style": 3, + "content": "=_t(\"Cuota %\")", + "border": 1 + }, + "E17": { + "style": 3, + "content": "=_t(\"Var %\")", + "border": 1 + }, + "F16": { + "style": 2, + "content": "=_t(\"Top 10 productos\")" + }, + "F17": { + "style": 3, + "content": "=_t(\"Producto\")", + "border": 1 + }, + "G17": { + "style": 3, + "content": "=_t(\"Ventas (€)\")", + "border": 1 + }, + "H17": { + "style": 3, + "content": "=_t(\"Unidades\")", + "border": 1 + }, + "I17": { + "style": 3, + "content": "=_t(\"Cuota %\")", + "border": 1 + }, + "J17": { + "style": 3, + "content": "=_t(\"Var %\")", + "border": 1 + }, + "A5": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(1,\"#categ_root_id\",1)" + }, + "B5": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",1)" + }, + "C5": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(1,\"order_id\",\"#categ_root_id\",1)" + }, + "D5": { + "style": "5", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",1)/Data!B1,0)" + }, + "E5": { + "style": "5", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",1)-ODOO.PIVOT(6,\"price_total\",\"categ_root_id\",ODOO.PIVOT.HEADER(1,\"#categ_root_id_int\",1)))/ODOO.PIVOT(6,\"price_total\",\"categ_root_id\",ODOO.PIVOT.HEADER(1,\"#categ_root_id_int\",1)),0)" + }, + "A6": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(1,\"#categ_root_id\",2)" + }, + "B6": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",2)" + }, + "C6": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(1,\"order_id\",\"#categ_root_id\",2)" + }, + "D6": { + "style": "4", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",2)/Data!B1,0)" + }, + "E6": { + "style": "4", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",2)-ODOO.PIVOT(6,\"price_total\",\"categ_root_id\",ODOO.PIVOT.HEADER(1,\"#categ_root_id_int\",2)))/ODOO.PIVOT(6,\"price_total\",\"categ_root_id\",ODOO.PIVOT.HEADER(1,\"#categ_root_id_int\",2)),0)" + }, + "A7": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(1,\"#categ_root_id\",3)" + }, + "B7": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",3)" + }, + "C7": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(1,\"order_id\",\"#categ_root_id\",3)" + }, + "D7": { + "style": "5", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",3)/Data!B1,0)" + }, + "E7": { + "style": "5", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",3)-ODOO.PIVOT(6,\"price_total\",\"categ_root_id\",ODOO.PIVOT.HEADER(1,\"#categ_root_id_int\",3)))/ODOO.PIVOT(6,\"price_total\",\"categ_root_id\",ODOO.PIVOT.HEADER(1,\"#categ_root_id_int\",3)),0)" + }, + "A8": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(1,\"#categ_root_id\",4)" + }, + "B8": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",4)" + }, + "C8": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(1,\"order_id\",\"#categ_root_id\",4)" + }, + "D8": { + "style": "4", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",4)/Data!B1,0)" + }, + "E8": { + "style": "4", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",4)-ODOO.PIVOT(6,\"price_total\",\"categ_root_id\",ODOO.PIVOT.HEADER(1,\"#categ_root_id_int\",4)))/ODOO.PIVOT(6,\"price_total\",\"categ_root_id\",ODOO.PIVOT.HEADER(1,\"#categ_root_id_int\",4)),0)" + }, + "A9": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(1,\"#categ_root_id\",5)" + }, + "B9": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",5)" + }, + "C9": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(1,\"order_id\",\"#categ_root_id\",5)" + }, + "D9": { + "style": "5", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",5)/Data!B1,0)" + }, + "E9": { + "style": "5", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",5)-ODOO.PIVOT(6,\"price_total\",\"categ_root_id\",ODOO.PIVOT.HEADER(1,\"#categ_root_id_int\",5)))/ODOO.PIVOT(6,\"price_total\",\"categ_root_id\",ODOO.PIVOT.HEADER(1,\"#categ_root_id_int\",5)),0)" + }, + "A10": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(1,\"#categ_root_id\",6)" + }, + "B10": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",6)" + }, + "C10": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(1,\"order_id\",\"#categ_root_id\",6)" + }, + "D10": { + "style": "4", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",6)/Data!B1,0)" + }, + "E10": { + "style": "4", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",6)-ODOO.PIVOT(6,\"price_total\",\"categ_root_id\",ODOO.PIVOT.HEADER(1,\"#categ_root_id_int\",6)))/ODOO.PIVOT(6,\"price_total\",\"categ_root_id\",ODOO.PIVOT.HEADER(1,\"#categ_root_id_int\",6)),0)" + }, + "A11": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(1,\"#categ_root_id\",7)" + }, + "B11": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",7)" + }, + "C11": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(1,\"order_id\",\"#categ_root_id\",7)" + }, + "D11": { + "style": "5", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",7)/Data!B1,0)" + }, + "E11": { + "style": "5", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",7)-ODOO.PIVOT(6,\"price_total\",\"categ_root_id\",ODOO.PIVOT.HEADER(1,\"#categ_root_id_int\",7)))/ODOO.PIVOT(6,\"price_total\",\"categ_root_id\",ODOO.PIVOT.HEADER(1,\"#categ_root_id_int\",7)),0)" + }, + "A12": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(1,\"#categ_root_id\",8)" + }, + "B12": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",8)" + }, + "C12": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(1,\"order_id\",\"#categ_root_id\",8)" + }, + "D12": { + "style": "4", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",8)/Data!B1,0)" + }, + "E12": { + "style": "4", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",8)-ODOO.PIVOT(6,\"price_total\",\"categ_root_id\",ODOO.PIVOT.HEADER(1,\"#categ_root_id_int\",8)))/ODOO.PIVOT(6,\"price_total\",\"categ_root_id\",ODOO.PIVOT.HEADER(1,\"#categ_root_id_int\",8)),0)" + }, + "A13": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(1,\"#categ_root_id\",9)" + }, + "B13": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",9)" + }, + "C13": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(1,\"order_id\",\"#categ_root_id\",9)" + }, + "D13": { + "style": "5", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",9)/Data!B1,0)" + }, + "E13": { + "style": "5", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",9)-ODOO.PIVOT(6,\"price_total\",\"categ_root_id\",ODOO.PIVOT.HEADER(1,\"#categ_root_id_int\",9)))/ODOO.PIVOT(6,\"price_total\",\"categ_root_id\",ODOO.PIVOT.HEADER(1,\"#categ_root_id_int\",9)),0)" + }, + "A14": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(1,\"#categ_root_id\",10)" + }, + "B14": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",10)" + }, + "C14": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(1,\"order_id\",\"#categ_root_id\",10)" + }, + "D14": { + "style": "4", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",10)/Data!B1,0)" + }, + "E14": { + "style": "4", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(1,\"price_total\",\"#categ_root_id\",10)-ODOO.PIVOT(6,\"price_total\",\"categ_root_id\",ODOO.PIVOT.HEADER(1,\"#categ_root_id_int\",10)))/ODOO.PIVOT(6,\"price_total\",\"categ_root_id\",ODOO.PIVOT.HEADER(1,\"#categ_root_id_int\",10)),0)" + }, + "F5": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(2,\"#categ_parent_id\",1)" + }, + "G5": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",1)" + }, + "H5": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(2,\"order_id\",\"#categ_parent_id\",1)" + }, + "I5": { + "style": "5", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",1)/Data!B1,0)" + }, + "J5": { + "style": "5", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",1)-ODOO.PIVOT(7,\"price_total\",\"categ_parent_id\",ODOO.PIVOT.HEADER(2,\"#categ_parent_id_int\",1)))/ODOO.PIVOT(7,\"price_total\",\"categ_parent_id\",ODOO.PIVOT.HEADER(2,\"#categ_parent_id_int\",1)),0)" + }, + "F6": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(2,\"#categ_parent_id\",2)" + }, + "G6": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",2)" + }, + "H6": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(2,\"order_id\",\"#categ_parent_id\",2)" + }, + "I6": { + "style": "4", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",2)/Data!B1,0)" + }, + "J6": { + "style": "4", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",2)-ODOO.PIVOT(7,\"price_total\",\"categ_parent_id\",ODOO.PIVOT.HEADER(2,\"#categ_parent_id_int\",2)))/ODOO.PIVOT(7,\"price_total\",\"categ_parent_id\",ODOO.PIVOT.HEADER(2,\"#categ_parent_id_int\",2)),0)" + }, + "F7": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(2,\"#categ_parent_id\",3)" + }, + "G7": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",3)" + }, + "H7": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(2,\"order_id\",\"#categ_parent_id\",3)" + }, + "I7": { + "style": "5", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",3)/Data!B1,0)" + }, + "J7": { + "style": "5", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",3)-ODOO.PIVOT(7,\"price_total\",\"categ_parent_id\",ODOO.PIVOT.HEADER(2,\"#categ_parent_id_int\",3)))/ODOO.PIVOT(7,\"price_total\",\"categ_parent_id\",ODOO.PIVOT.HEADER(2,\"#categ_parent_id_int\",3)),0)" + }, + "F8": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(2,\"#categ_parent_id\",4)" + }, + "G8": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",4)" + }, + "H8": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(2,\"order_id\",\"#categ_parent_id\",4)" + }, + "I8": { + "style": "4", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",4)/Data!B1,0)" + }, + "J8": { + "style": "4", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",4)-ODOO.PIVOT(7,\"price_total\",\"categ_parent_id\",ODOO.PIVOT.HEADER(2,\"#categ_parent_id_int\",4)))/ODOO.PIVOT(7,\"price_total\",\"categ_parent_id\",ODOO.PIVOT.HEADER(2,\"#categ_parent_id_int\",4)),0)" + }, + "F9": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(2,\"#categ_parent_id\",5)" + }, + "G9": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",5)" + }, + "H9": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(2,\"order_id\",\"#categ_parent_id\",5)" + }, + "I9": { + "style": "5", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",5)/Data!B1,0)" + }, + "J9": { + "style": "5", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",5)-ODOO.PIVOT(7,\"price_total\",\"categ_parent_id\",ODOO.PIVOT.HEADER(2,\"#categ_parent_id_int\",5)))/ODOO.PIVOT(7,\"price_total\",\"categ_parent_id\",ODOO.PIVOT.HEADER(2,\"#categ_parent_id_int\",5)),0)" + }, + "F10": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(2,\"#categ_parent_id\",6)" + }, + "G10": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",6)" + }, + "H10": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(2,\"order_id\",\"#categ_parent_id\",6)" + }, + "I10": { + "style": "4", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",6)/Data!B1,0)" + }, + "J10": { + "style": "4", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",6)-ODOO.PIVOT(7,\"price_total\",\"categ_parent_id\",ODOO.PIVOT.HEADER(2,\"#categ_parent_id_int\",6)))/ODOO.PIVOT(7,\"price_total\",\"categ_parent_id\",ODOO.PIVOT.HEADER(2,\"#categ_parent_id_int\",6)),0)" + }, + "F11": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(2,\"#categ_parent_id\",7)" + }, + "G11": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",7)" + }, + "H11": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(2,\"order_id\",\"#categ_parent_id\",7)" + }, + "I11": { + "style": "5", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",7)/Data!B1,0)" + }, + "J11": { + "style": "5", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",7)-ODOO.PIVOT(7,\"price_total\",\"categ_parent_id\",ODOO.PIVOT.HEADER(2,\"#categ_parent_id_int\",7)))/ODOO.PIVOT(7,\"price_total\",\"categ_parent_id\",ODOO.PIVOT.HEADER(2,\"#categ_parent_id_int\",7)),0)" + }, + "F12": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(2,\"#categ_parent_id\",8)" + }, + "G12": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",8)" + }, + "H12": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(2,\"order_id\",\"#categ_parent_id\",8)" + }, + "I12": { + "style": "4", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",8)/Data!B1,0)" + }, + "J12": { + "style": "4", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",8)-ODOO.PIVOT(7,\"price_total\",\"categ_parent_id\",ODOO.PIVOT.HEADER(2,\"#categ_parent_id_int\",8)))/ODOO.PIVOT(7,\"price_total\",\"categ_parent_id\",ODOO.PIVOT.HEADER(2,\"#categ_parent_id_int\",8)),0)" + }, + "F13": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(2,\"#categ_parent_id\",9)" + }, + "G13": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",9)" + }, + "H13": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(2,\"order_id\",\"#categ_parent_id\",9)" + }, + "I13": { + "style": "5", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",9)/Data!B1,0)" + }, + "J13": { + "style": "5", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",9)-ODOO.PIVOT(7,\"price_total\",\"categ_parent_id\",ODOO.PIVOT.HEADER(2,\"#categ_parent_id_int\",9)))/ODOO.PIVOT(7,\"price_total\",\"categ_parent_id\",ODOO.PIVOT.HEADER(2,\"#categ_parent_id_int\",9)),0)" + }, + "F14": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(2,\"#categ_parent_id\",10)" + }, + "G14": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",10)" + }, + "H14": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(2,\"order_id\",\"#categ_parent_id\",10)" + }, + "I14": { + "style": "4", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",10)/Data!B1,0)" + }, + "J14": { + "style": "4", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(2,\"price_total\",\"#categ_parent_id\",10)-ODOO.PIVOT(7,\"price_total\",\"categ_parent_id\",ODOO.PIVOT.HEADER(2,\"#categ_parent_id_int\",10)))/ODOO.PIVOT(7,\"price_total\",\"categ_parent_id\",ODOO.PIVOT.HEADER(2,\"#categ_parent_id_int\",10)),0)" + }, + "A18": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#product_categ_id\",1)" + }, + "B18": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",1)" + }, + "C18": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#product_categ_id\",1)" + }, + "D18": { + "style": "5", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",1)/Data!B1,0)" + }, + "E18": { + "style": "5", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",1)-ODOO.PIVOT(8,\"price_total\",\"product_categ_id\",ODOO.PIVOT.HEADER(3,\"#product_categ_id_int\",1)))/ODOO.PIVOT(8,\"price_total\",\"product_categ_id\",ODOO.PIVOT.HEADER(3,\"#product_categ_id_int\",1)),0)" + }, + "A19": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#product_categ_id\",2)" + }, + "B19": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",2)" + }, + "C19": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#product_categ_id\",2)" + }, + "D19": { + "style": "4", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",2)/Data!B1,0)" + }, + "E19": { + "style": "4", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",2)-ODOO.PIVOT(8,\"price_total\",\"product_categ_id\",ODOO.PIVOT.HEADER(3,\"#product_categ_id_int\",2)))/ODOO.PIVOT(8,\"price_total\",\"product_categ_id\",ODOO.PIVOT.HEADER(3,\"#product_categ_id_int\",2)),0)" + }, + "A20": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#product_categ_id\",3)" + }, + "B20": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",3)" + }, + "C20": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#product_categ_id\",3)" + }, + "D20": { + "style": "5", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",3)/Data!B1,0)" + }, + "E20": { + "style": "5", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",3)-ODOO.PIVOT(8,\"price_total\",\"product_categ_id\",ODOO.PIVOT.HEADER(3,\"#product_categ_id_int\",3)))/ODOO.PIVOT(8,\"price_total\",\"product_categ_id\",ODOO.PIVOT.HEADER(3,\"#product_categ_id_int\",3)),0)" + }, + "A21": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#product_categ_id\",4)" + }, + "B21": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",4)" + }, + "C21": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#product_categ_id\",4)" + }, + "D21": { + "style": "4", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",4)/Data!B1,0)" + }, + "E21": { + "style": "4", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",4)-ODOO.PIVOT(8,\"price_total\",\"product_categ_id\",ODOO.PIVOT.HEADER(3,\"#product_categ_id_int\",4)))/ODOO.PIVOT(8,\"price_total\",\"product_categ_id\",ODOO.PIVOT.HEADER(3,\"#product_categ_id_int\",4)),0)" + }, + "A22": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#product_categ_id\",5)" + }, + "B22": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",5)" + }, + "C22": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#product_categ_id\",5)" + }, + "D22": { + "style": "5", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",5)/Data!B1,0)" + }, + "E22": { + "style": "5", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",5)-ODOO.PIVOT(8,\"price_total\",\"product_categ_id\",ODOO.PIVOT.HEADER(3,\"#product_categ_id_int\",5)))/ODOO.PIVOT(8,\"price_total\",\"product_categ_id\",ODOO.PIVOT.HEADER(3,\"#product_categ_id_int\",5)),0)" + }, + "A23": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#product_categ_id\",6)" + }, + "B23": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",6)" + }, + "C23": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#product_categ_id\",6)" + }, + "D23": { + "style": "4", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",6)/Data!B1,0)" + }, + "E23": { + "style": "4", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",6)-ODOO.PIVOT(8,\"price_total\",\"product_categ_id\",ODOO.PIVOT.HEADER(3,\"#product_categ_id_int\",6)))/ODOO.PIVOT(8,\"price_total\",\"product_categ_id\",ODOO.PIVOT.HEADER(3,\"#product_categ_id_int\",6)),0)" + }, + "A24": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#product_categ_id\",7)" + }, + "B24": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",7)" + }, + "C24": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#product_categ_id\",7)" + }, + "D24": { + "style": "5", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",7)/Data!B1,0)" + }, + "E24": { + "style": "5", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",7)-ODOO.PIVOT(8,\"price_total\",\"product_categ_id\",ODOO.PIVOT.HEADER(3,\"#product_categ_id_int\",7)))/ODOO.PIVOT(8,\"price_total\",\"product_categ_id\",ODOO.PIVOT.HEADER(3,\"#product_categ_id_int\",7)),0)" + }, + "A25": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#product_categ_id\",8)" + }, + "B25": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",8)" + }, + "C25": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#product_categ_id\",8)" + }, + "D25": { + "style": "4", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",8)/Data!B1,0)" + }, + "E25": { + "style": "4", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",8)-ODOO.PIVOT(8,\"price_total\",\"product_categ_id\",ODOO.PIVOT.HEADER(3,\"#product_categ_id_int\",8)))/ODOO.PIVOT(8,\"price_total\",\"product_categ_id\",ODOO.PIVOT.HEADER(3,\"#product_categ_id_int\",8)),0)" + }, + "A26": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#product_categ_id\",9)" + }, + "B26": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",9)" + }, + "C26": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#product_categ_id\",9)" + }, + "D26": { + "style": "5", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",9)/Data!B1,0)" + }, + "E26": { + "style": "5", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",9)-ODOO.PIVOT(8,\"price_total\",\"product_categ_id\",ODOO.PIVOT.HEADER(3,\"#product_categ_id_int\",9)))/ODOO.PIVOT(8,\"price_total\",\"product_categ_id\",ODOO.PIVOT.HEADER(3,\"#product_categ_id_int\",9)),0)" + }, + "A27": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#product_categ_id\",10)" + }, + "B27": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",10)" + }, + "C27": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#product_categ_id\",10)" + }, + "D27": { + "style": "4", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",10)/Data!B1,0)" + }, + "E27": { + "style": "4", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(3,\"price_total\",\"#product_categ_id\",10)-ODOO.PIVOT(8,\"price_total\",\"product_categ_id\",ODOO.PIVOT.HEADER(3,\"#product_categ_id_int\",10)))/ODOO.PIVOT(8,\"price_total\",\"product_categ_id\",ODOO.PIVOT.HEADER(3,\"#product_categ_id_int\",10)),0)" + }, + "F18": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(4,\"#product_id\",1)" + }, + "G18": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(4,\"price_total\",\"#product_id\",1)" + }, + "H18": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(4,\"product_qty\",\"#product_id\",1)" + }, + "I18": { + "style": "5", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(4,\"price_total\",\"#product_id\",1)/Data!B1,0)" + }, + "J18": { + "style": "5", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(4,\"price_total\",\"#product_id\",1)-ODOO.PIVOT(9,\"price_total\",\"product_id\",ODOO.PIVOT.HEADER(4,\"#product_id_int\",1)))/ODOO.PIVOT(9,\"price_total\",\"product_id\",ODOO.PIVOT.HEADER(4,\"#product_id_int\",1)),0)" + }, + "F19": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(4,\"#product_id\",2)" + }, + "G19": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(4,\"price_total\",\"#product_id\",2)" + }, + "H19": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(4,\"product_qty\",\"#product_id\",2)" + }, + "I19": { + "style": "4", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(4,\"price_total\",\"#product_id\",2)/Data!B1,0)" + }, + "J19": { + "style": "4", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(4,\"price_total\",\"#product_id\",2)-ODOO.PIVOT(9,\"price_total\",\"product_id\",ODOO.PIVOT.HEADER(4,\"#product_id_int\",2)))/ODOO.PIVOT(9,\"price_total\",\"product_id\",ODOO.PIVOT.HEADER(4,\"#product_id_int\",2)),0)" + }, + "F20": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(4,\"#product_id\",3)" + }, + "G20": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(4,\"price_total\",\"#product_id\",3)" + }, + "H20": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(4,\"product_qty\",\"#product_id\",3)" + }, + "I20": { + "style": "5", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(4,\"price_total\",\"#product_id\",3)/Data!B1,0)" + }, + "J20": { + "style": "5", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(4,\"price_total\",\"#product_id\",3)-ODOO.PIVOT(9,\"price_total\",\"product_id\",ODOO.PIVOT.HEADER(4,\"#product_id_int\",3)))/ODOO.PIVOT(9,\"price_total\",\"product_id\",ODOO.PIVOT.HEADER(4,\"#product_id_int\",3)),0)" + }, + "F21": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(4,\"#product_id\",4)" + }, + "G21": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(4,\"price_total\",\"#product_id\",4)" + }, + "H21": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(4,\"product_qty\",\"#product_id\",4)" + }, + "I21": { + "style": "4", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(4,\"price_total\",\"#product_id\",4)/Data!B1,0)" + }, + "J21": { + "style": "4", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(4,\"price_total\",\"#product_id\",4)-ODOO.PIVOT(9,\"price_total\",\"product_id\",ODOO.PIVOT.HEADER(4,\"#product_id_int\",4)))/ODOO.PIVOT(9,\"price_total\",\"product_id\",ODOO.PIVOT.HEADER(4,\"#product_id_int\",4)),0)" + }, + "F22": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(4,\"#product_id\",5)" + }, + "G22": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(4,\"price_total\",\"#product_id\",5)" + }, + "H22": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(4,\"product_qty\",\"#product_id\",5)" + }, + "I22": { + "style": "5", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(4,\"price_total\",\"#product_id\",5)/Data!B1,0)" + }, + "J22": { + "style": "5", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(4,\"price_total\",\"#product_id\",5)-ODOO.PIVOT(9,\"price_total\",\"product_id\",ODOO.PIVOT.HEADER(4,\"#product_id_int\",5)))/ODOO.PIVOT(9,\"price_total\",\"product_id\",ODOO.PIVOT.HEADER(4,\"#product_id_int\",5)),0)" + }, + "F23": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(4,\"#product_id\",6)" + }, + "G23": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(4,\"price_total\",\"#product_id\",6)" + }, + "H23": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(4,\"product_qty\",\"#product_id\",6)" + }, + "I23": { + "style": "4", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(4,\"price_total\",\"#product_id\",6)/Data!B1,0)" + }, + "J23": { + "style": "4", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(4,\"price_total\",\"#product_id\",6)-ODOO.PIVOT(9,\"price_total\",\"product_id\",ODOO.PIVOT.HEADER(4,\"#product_id_int\",6)))/ODOO.PIVOT(9,\"price_total\",\"product_id\",ODOO.PIVOT.HEADER(4,\"#product_id_int\",6)),0)" + }, + "F24": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(4,\"#product_id\",7)" + }, + "G24": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(4,\"price_total\",\"#product_id\",7)" + }, + "H24": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(4,\"product_qty\",\"#product_id\",7)" + }, + "I24": { + "style": "5", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(4,\"price_total\",\"#product_id\",7)/Data!B1,0)" + }, + "J24": { + "style": "5", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(4,\"price_total\",\"#product_id\",7)-ODOO.PIVOT(9,\"price_total\",\"product_id\",ODOO.PIVOT.HEADER(4,\"#product_id_int\",7)))/ODOO.PIVOT(9,\"price_total\",\"product_id\",ODOO.PIVOT.HEADER(4,\"#product_id_int\",7)),0)" + }, + "F25": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(4,\"#product_id\",8)" + }, + "G25": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(4,\"price_total\",\"#product_id\",8)" + }, + "H25": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(4,\"product_qty\",\"#product_id\",8)" + }, + "I25": { + "style": "4", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(4,\"price_total\",\"#product_id\",8)/Data!B1,0)" + }, + "J25": { + "style": "4", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(4,\"price_total\",\"#product_id\",8)-ODOO.PIVOT(9,\"price_total\",\"product_id\",ODOO.PIVOT.HEADER(4,\"#product_id_int\",8)))/ODOO.PIVOT(9,\"price_total\",\"product_id\",ODOO.PIVOT.HEADER(4,\"#product_id_int\",8)),0)" + }, + "F26": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(4,\"#product_id\",9)" + }, + "G26": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(4,\"price_total\",\"#product_id\",9)" + }, + "H26": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(4,\"product_qty\",\"#product_id\",9)" + }, + "I26": { + "style": "5", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(4,\"price_total\",\"#product_id\",9)/Data!B1,0)" + }, + "J26": { + "style": "5", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(4,\"price_total\",\"#product_id\",9)-ODOO.PIVOT(9,\"price_total\",\"product_id\",ODOO.PIVOT.HEADER(4,\"#product_id_int\",9)))/ODOO.PIVOT(9,\"price_total\",\"product_id\",ODOO.PIVOT.HEADER(4,\"#product_id_int\",9)),0)" + }, + "F27": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(4,\"#product_id\",10)" + }, + "G27": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(4,\"price_total\",\"#product_id\",10)" + }, + "H27": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(4,\"product_qty\",\"#product_id\",10)" + }, + "I27": { + "style": "4", + "format": "3", + "content": "=IFERROR(ODOO.PIVOT(4,\"price_total\",\"#product_id\",10)/Data!B1,0)" + }, + "J27": { + "style": "4", + "format": "3", + "content": "=IFERROR((ODOO.PIVOT(4,\"price_total\",\"#product_id\",10)-ODOO.PIVOT(9,\"price_total\",\"product_id\",ODOO.PIVOT.HEADER(4,\"#product_id_int\",10)))/ODOO.PIVOT(9,\"price_total\",\"product_id\",ODOO.PIVOT.HEADER(4,\"#product_id_int\",10)),0)" + } + }, + "conditionalFormats": [], + "figures": [], + "areGridLinesVisible": false, + "isVisible": true + }, + { + "id": "data", + "name": "Data", + "colNumber": 3, + "rowNumber": 3, + "rows": {}, + "cols": { + "0": { + "size": 200 + }, + "1": { + "size": 140 + } + }, + "merges": [], + "cells": { + "A1": { + "content": "=_t(\"Total ventas\")" + }, + "B1": { + "content": "=ODOO.PIVOT(5,\"price_total\")" + } + }, + "conditionalFormats": [], + "figures": [], + "areGridLinesVisible": true, + "isVisible": false + } + ], + "entities": {}, + "styles": { + "1": { + "bold": true, + "fontSize": 22, + "textColor": "#2E7D32" + }, + "2": { + "bold": true, + "fontSize": 14, + "textColor": "#333333" + }, + "3": { + "bold": true, + "fillColor": "#EFEFEF", + "textColor": "#333333", + "align": "center" + }, + "4": { + "fillColor": "#F8F8F8" + }, + "5": {} + }, + "formats": { + "1": "#,##0.00 [$€]", + "2": "#,##0", + "3": "0.0%" + }, + "borders": { + "1": { + "bottom": [ + "thin", + "#000" + ] + } + }, + "revisionId": "START_REVISION", + "chartOdooMenusReferences": {}, + "odooVersion": 1, + "lists": {}, + "listNextId": 1, + "pivots": { + "1": { + "colGroupBys": [], + "context": { + "group_by_no_leaf": 1, + "group_by": [] + }, + "domain": [ + [ + "state", + "in", + [ + "paid", + "done", + "invoiced" + ] + ], + [ + "categ_root_id", + "!=", + false + ] + ], + "id": "1", + "measures": [ + { + "field": "price_total" + }, + { + "field": "order_id" + } + ], + "model": "report.pos.order", + "rowGroupBys": [ + "categ_root_id", + "categ_root_id_int" + ], + "name": "Top categorías", + "sortedColumn": { + "groupId": [ + [], + [] + ], + "measure": "price_total", + "order": "desc" + } + }, + "2": { + "colGroupBys": [], + "context": { + "group_by_no_leaf": 1, + "group_by": [] + }, + "domain": [ + [ + "state", + "in", + [ + "paid", + "done", + "invoiced" + ] + ], + [ + "categ_parent_id", + "!=", + false + ] + ], + "id": "2", + "measures": [ + { + "field": "price_total" + }, + { + "field": "order_id" + } + ], + "model": "report.pos.order", + "rowGroupBys": [ + "categ_parent_id", + "categ_parent_id_int" + ], + "name": "Top familias", + "sortedColumn": { + "groupId": [ + [], + [] + ], + "measure": "price_total", + "order": "desc" + } + }, + "3": { + "colGroupBys": [], + "context": { + "group_by_no_leaf": 1, + "group_by": [] + }, + "domain": [ + [ + "state", + "in", + [ + "paid", + "done", + "invoiced" + ] + ], + [ + "product_categ_id", + "!=", + false + ] + ], + "id": "3", + "measures": [ + { + "field": "price_total" + }, + { + "field": "order_id" + } + ], + "model": "report.pos.order", + "rowGroupBys": [ + "product_categ_id", + "product_categ_id_int" + ], + "name": "Top subfamilias", + "sortedColumn": { + "groupId": [ + [], + [] + ], + "measure": "price_total", + "order": "desc" + } + }, + "4": { + "colGroupBys": [], + "context": { + "group_by_no_leaf": 1, + "group_by": [] + }, + "domain": [ + [ + "state", + "in", + [ + "paid", + "done", + "invoiced" + ] + ], + [ + "product_id", + "!=", + false + ] + ], + "id": "4", + "measures": [ + { + "field": "price_total" + }, + { + "field": "product_qty" + } + ], + "model": "report.pos.order", + "rowGroupBys": [ + "product_id", + "product_id_int" + ], + "name": "Top productos", + "sortedColumn": { + "groupId": [ + [], + [] + ], + "measure": "price_total", + "order": "desc" + } + }, + "5": { + "colGroupBys": [], + "context": { + "group_by_no_leaf": 1, + "group_by": [] + }, + "domain": [ + [ + "state", + "in", + [ + "paid", + "done", + "invoiced" + ] + ] + ], + "id": "5", + "measures": [ + { + "field": "price_total" + } + ], + "model": "report.pos.order", + "rowGroupBys": [], + "name": "Total ventas", + "sortedColumn": null + }, + "6": { + "colGroupBys": [], + "context": { + "group_by_no_leaf": 1, + "group_by": [] + }, + "domain": [ + [ + "state", + "in", + [ + "paid", + "done", + "invoiced" + ] + ], + [ + "categ_root_id", + "!=", + false + ] + ], + "id": "6", + "measures": [ + { + "field": "price_total" + }, + { + "field": "order_id" + } + ], + "model": "report.pos.order", + "rowGroupBys": [ + "categ_root_id" + ], + "name": "Top categorías - prev", + "sortedColumn": { + "groupId": [ + [], + [] + ], + "measure": "price_total", + "order": "desc" + } + }, + "7": { + "colGroupBys": [], + "context": { + "group_by_no_leaf": 1, + "group_by": [] + }, + "domain": [ + [ + "state", + "in", + [ + "paid", + "done", + "invoiced" + ] + ], + [ + "categ_parent_id", + "!=", + false + ] + ], + "id": "7", + "measures": [ + { + "field": "price_total" + }, + { + "field": "order_id" + } + ], + "model": "report.pos.order", + "rowGroupBys": [ + "categ_parent_id" + ], + "name": "Top familias - prev", + "sortedColumn": { + "groupId": [ + [], + [] + ], + "measure": "price_total", + "order": "desc" + } + }, + "8": { + "colGroupBys": [], + "context": { + "group_by_no_leaf": 1, + "group_by": [] + }, + "domain": [ + [ + "state", + "in", + [ + "paid", + "done", + "invoiced" + ] + ], + [ + "product_categ_id", + "!=", + false + ] + ], + "id": "8", + "measures": [ + { + "field": "price_total" + }, + { + "field": "order_id" + } + ], + "model": "report.pos.order", + "rowGroupBys": [ + "product_categ_id" + ], + "name": "Top subfamilias - prev", + "sortedColumn": { + "groupId": [ + [], + [] + ], + "measure": "price_total", + "order": "desc" + } + }, + "9": { + "colGroupBys": [], + "context": { + "group_by_no_leaf": 1, + "group_by": [] + }, + "domain": [ + [ + "state", + "in", + [ + "paid", + "done", + "invoiced" + ] + ], + [ + "product_id", + "!=", + false + ] + ], + "id": "9", + "measures": [ + { + "field": "price_total" + }, + { + "field": "product_qty" + } + ], + "model": "report.pos.order", + "rowGroupBys": [ + "product_id" + ], + "name": "Top productos - prev", + "sortedColumn": { + "groupId": [ + [], + [] + ], + "measure": "price_total", + "order": "desc" + } + }, + "10": { + "colGroupBys": [], + "context": { + "group_by_no_leaf": 1, + "group_by": [] + }, + "domain": [ + [ + "state", + "in", + [ + "paid", + "done", + "invoiced" + ] + ] + ], + "id": "10", + "measures": [ + { + "field": "price_total" + } + ], + "model": "report.pos.order", + "rowGroupBys": [], + "name": "Total ventas - prev", + "sortedColumn": null + } + }, + "pivotNextId": 11, + "globalFilters": [ + { + "id": "11111111-1111-1111-1111-111111111111", + "type": "date", + "label": "Period", + "defaultValue": {}, + "rangeType": "month", + "defaultsToCurrentPeriod": true, + "pivotFields": { + "1": { + "field": "date", + "type": "datetime", + "offset": 0 + }, + "2": { + "field": "date", + "type": "datetime", + "offset": 0 + }, + "3": { + "field": "date", + "type": "datetime", + "offset": 0 + }, + "4": { + "field": "date", + "type": "datetime", + "offset": 0 + }, + "5": { + "field": "date", + "type": "datetime", + "offset": 0 + }, + "6": { + "field": "date", + "type": "datetime", + "offset": -1 + }, + "7": { + "field": "date", + "type": "datetime", + "offset": -1 + }, + "8": { + "field": "date", + "type": "datetime", + "offset": -1 + }, + "9": { + "field": "date", + "type": "datetime", + "offset": -1 + }, + "10": { + "field": "date", + "type": "datetime", + "offset": -1 + } + }, + "listFields": {}, + "graphFields": {} + }, + { + "id": "22222222-2222-2222-2222-222222222222", + "type": "relation", + "label": "Categoría", + "modelName": "product.category", + "defaultValue": [], + "defaultValueDisplayNames": [], + "rangeType": "year", + "defaultsToCurrentPeriod": false, + "pivotFields": { + "1": { + "field": "product_categ_id", + "type": "many2one" + }, + "2": { + "field": "product_categ_id", + "type": "many2one" + }, + "3": { + "field": "product_categ_id", + "type": "many2one" + }, + "4": { + "field": "product_categ_id", + "type": "many2one" + }, + "5": { + "field": "product_categ_id", + "type": "many2one" + }, + "6": { + "field": "product_categ_id", + "type": "many2one" + }, + "7": { + "field": "product_categ_id", + "type": "many2one" + }, + "8": { + "field": "product_categ_id", + "type": "many2one" + }, + "9": { + "field": "product_categ_id", + "type": "many2one" + }, + "10": { + "field": "product_categ_id", + "type": "many2one" + } + }, + "listFields": {}, + "graphFields": {} + }, + { + "id": "33333333-3333-3333-3333-333333333333", + "type": "relation", + "label": "Producto", + "modelName": "product.product", + "defaultValue": [], + "defaultValueDisplayNames": [], + "rangeType": "year", + "defaultsToCurrentPeriod": false, + "pivotFields": { + "1": { + "field": "product_id", + "type": "many2one" + }, + "2": { + "field": "product_id", + "type": "many2one" + }, + "3": { + "field": "product_id", + "type": "many2one" + }, + "4": { + "field": "product_id", + "type": "many2one" + }, + "5": { + "field": "product_id", + "type": "many2one" + }, + "6": { + "field": "product_id", + "type": "many2one" + }, + "7": { + "field": "product_id", + "type": "many2one" + }, + "8": { + "field": "product_id", + "type": "many2one" + }, + "9": { + "field": "product_id", + "type": "many2one" + }, + "10": { + "field": "product_id", + "type": "many2one" + } + }, + "listFields": {}, + "graphFields": {} + } + ] +} diff --git a/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json b/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json new file mode 100644 index 0000000..ddb8b6d --- /dev/null +++ b/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json @@ -0,0 +1,2758 @@ +{ + "version": 12, + "sheets": [ + { + "id": "dashboard", + "name": "Members", + "colNumber": 12, + "rowNumber": 100, + "rows": { + "0": { + "size": 40 + } + }, + "cols": { + "0": { + "size": 60 + }, + "1": { + "size": 220 + }, + "2": { + "size": 120 + }, + "3": { + "size": 120 + }, + "4": { + "size": 100 + }, + "5": { + "size": 130 + }, + "6": { + "size": 100 + }, + "7": { + "size": 50 + }, + "8": { + "size": 50 + }, + "9": { + "size": 50 + } + }, + "merges": [], + "cells": { + "A1": { + "style": 1, + "content": "=_t(\"Cooperative POS — Members vs Non-members\")" + }, + "A3": { + "style": 2, + "content": "=_t(\"KPIs de socias\")" + }, + "A11": { + "style": 2, + "content": "=_t(\"KPIs de no socias\")" + }, + "A19": { + "style": 2, + "content": "=_t(\"Evolución mensual — Socias vs no socias\")" + }, + "A33": { + "style": 2, + "content": "=_t(\"Contribución de las socias\")" + }, + "A41": { + "style": 2, + "content": "=_t(\"TOP 50 socias compradoras\")" + }, + "A42": { + "style": 3, + "content": "=_t(\"#\")", + "border": 1 + }, + "B42": { + "style": 3, + "content": "=_t(\"Socia\")", + "border": 1 + }, + "C42": { + "style": 3, + "content": "=_t(\"Ventas (€)\")", + "border": 1 + }, + "D42": { + "style": 3, + "content": "=_t(\"Tickets\")", + "border": 1 + }, + "E42": { + "style": 3, + "content": "=_t(\"Unidades\")", + "border": 1 + }, + "F42": { + "style": 3, + "content": "=_t(\"Ticket medio (€)\")", + "border": 1 + }, + "G42": { + "style": 3, + "content": "=_t(\"UPT\")", + "border": 1 + }, + "A43": { + "style": "5", + "content": "1" + }, + "B43": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",1)" + }, + "C43": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",1)" + }, + "D43": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",1)" + }, + "E43": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",1)" + }, + "F43": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",1)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",1),0)" + }, + "G43": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",1)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",1),0)" + }, + "A44": { + "style": "4", + "content": "2" + }, + "B44": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",2)" + }, + "C44": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",2)" + }, + "D44": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",2)" + }, + "E44": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",2)" + }, + "F44": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",2)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",2),0)" + }, + "G44": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",2)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",2),0)" + }, + "A45": { + "style": "5", + "content": "3" + }, + "B45": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",3)" + }, + "C45": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",3)" + }, + "D45": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",3)" + }, + "E45": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",3)" + }, + "F45": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",3)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",3),0)" + }, + "G45": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",3)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",3),0)" + }, + "A46": { + "style": "4", + "content": "4" + }, + "B46": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",4)" + }, + "C46": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",4)" + }, + "D46": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",4)" + }, + "E46": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",4)" + }, + "F46": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",4)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",4),0)" + }, + "G46": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",4)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",4),0)" + }, + "A47": { + "style": "5", + "content": "5" + }, + "B47": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",5)" + }, + "C47": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",5)" + }, + "D47": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",5)" + }, + "E47": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",5)" + }, + "F47": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",5)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",5),0)" + }, + "G47": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",5)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",5),0)" + }, + "A48": { + "style": "4", + "content": "6" + }, + "B48": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",6)" + }, + "C48": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",6)" + }, + "D48": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",6)" + }, + "E48": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",6)" + }, + "F48": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",6)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",6),0)" + }, + "G48": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",6)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",6),0)" + }, + "A49": { + "style": "5", + "content": "7" + }, + "B49": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",7)" + }, + "C49": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",7)" + }, + "D49": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",7)" + }, + "E49": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",7)" + }, + "F49": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",7)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",7),0)" + }, + "G49": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",7)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",7),0)" + }, + "A50": { + "style": "4", + "content": "8" + }, + "B50": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",8)" + }, + "C50": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",8)" + }, + "D50": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",8)" + }, + "E50": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",8)" + }, + "F50": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",8)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",8),0)" + }, + "G50": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",8)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",8),0)" + }, + "A51": { + "style": "5", + "content": "9" + }, + "B51": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",9)" + }, + "C51": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",9)" + }, + "D51": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",9)" + }, + "E51": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",9)" + }, + "F51": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",9)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",9),0)" + }, + "G51": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",9)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",9),0)" + }, + "A52": { + "style": "4", + "content": "10" + }, + "B52": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",10)" + }, + "C52": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",10)" + }, + "D52": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",10)" + }, + "E52": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",10)" + }, + "F52": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",10)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",10),0)" + }, + "G52": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",10)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",10),0)" + }, + "A53": { + "style": "5", + "content": "11" + }, + "B53": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",11)" + }, + "C53": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",11)" + }, + "D53": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",11)" + }, + "E53": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",11)" + }, + "F53": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",11)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",11),0)" + }, + "G53": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",11)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",11),0)" + }, + "A54": { + "style": "4", + "content": "12" + }, + "B54": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",12)" + }, + "C54": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",12)" + }, + "D54": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",12)" + }, + "E54": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",12)" + }, + "F54": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",12)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",12),0)" + }, + "G54": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",12)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",12),0)" + }, + "A55": { + "style": "5", + "content": "13" + }, + "B55": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",13)" + }, + "C55": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",13)" + }, + "D55": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",13)" + }, + "E55": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",13)" + }, + "F55": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",13)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",13),0)" + }, + "G55": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",13)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",13),0)" + }, + "A56": { + "style": "4", + "content": "14" + }, + "B56": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",14)" + }, + "C56": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",14)" + }, + "D56": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",14)" + }, + "E56": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",14)" + }, + "F56": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",14)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",14),0)" + }, + "G56": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",14)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",14),0)" + }, + "A57": { + "style": "5", + "content": "15" + }, + "B57": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",15)" + }, + "C57": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",15)" + }, + "D57": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",15)" + }, + "E57": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",15)" + }, + "F57": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",15)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",15),0)" + }, + "G57": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",15)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",15),0)" + }, + "A58": { + "style": "4", + "content": "16" + }, + "B58": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",16)" + }, + "C58": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",16)" + }, + "D58": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",16)" + }, + "E58": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",16)" + }, + "F58": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",16)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",16),0)" + }, + "G58": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",16)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",16),0)" + }, + "A59": { + "style": "5", + "content": "17" + }, + "B59": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",17)" + }, + "C59": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",17)" + }, + "D59": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",17)" + }, + "E59": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",17)" + }, + "F59": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",17)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",17),0)" + }, + "G59": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",17)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",17),0)" + }, + "A60": { + "style": "4", + "content": "18" + }, + "B60": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",18)" + }, + "C60": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",18)" + }, + "D60": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",18)" + }, + "E60": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",18)" + }, + "F60": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",18)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",18),0)" + }, + "G60": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",18)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",18),0)" + }, + "A61": { + "style": "5", + "content": "19" + }, + "B61": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",19)" + }, + "C61": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",19)" + }, + "D61": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",19)" + }, + "E61": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",19)" + }, + "F61": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",19)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",19),0)" + }, + "G61": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",19)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",19),0)" + }, + "A62": { + "style": "4", + "content": "20" + }, + "B62": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",20)" + }, + "C62": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",20)" + }, + "D62": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",20)" + }, + "E62": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",20)" + }, + "F62": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",20)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",20),0)" + }, + "G62": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",20)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",20),0)" + }, + "A63": { + "style": "5", + "content": "21" + }, + "B63": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",21)" + }, + "C63": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",21)" + }, + "D63": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",21)" + }, + "E63": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",21)" + }, + "F63": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",21)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",21),0)" + }, + "G63": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",21)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",21),0)" + }, + "A64": { + "style": "4", + "content": "22" + }, + "B64": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",22)" + }, + "C64": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",22)" + }, + "D64": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",22)" + }, + "E64": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",22)" + }, + "F64": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",22)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",22),0)" + }, + "G64": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",22)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",22),0)" + }, + "A65": { + "style": "5", + "content": "23" + }, + "B65": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",23)" + }, + "C65": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",23)" + }, + "D65": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",23)" + }, + "E65": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",23)" + }, + "F65": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",23)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",23),0)" + }, + "G65": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",23)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",23),0)" + }, + "A66": { + "style": "4", + "content": "24" + }, + "B66": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",24)" + }, + "C66": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",24)" + }, + "D66": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",24)" + }, + "E66": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",24)" + }, + "F66": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",24)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",24),0)" + }, + "G66": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",24)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",24),0)" + }, + "A67": { + "style": "5", + "content": "25" + }, + "B67": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",25)" + }, + "C67": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",25)" + }, + "D67": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",25)" + }, + "E67": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",25)" + }, + "F67": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",25)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",25),0)" + }, + "G67": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",25)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",25),0)" + }, + "A68": { + "style": "4", + "content": "26" + }, + "B68": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",26)" + }, + "C68": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",26)" + }, + "D68": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",26)" + }, + "E68": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",26)" + }, + "F68": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",26)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",26),0)" + }, + "G68": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",26)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",26),0)" + }, + "A69": { + "style": "5", + "content": "27" + }, + "B69": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",27)" + }, + "C69": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",27)" + }, + "D69": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",27)" + }, + "E69": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",27)" + }, + "F69": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",27)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",27),0)" + }, + "G69": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",27)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",27),0)" + }, + "A70": { + "style": "4", + "content": "28" + }, + "B70": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",28)" + }, + "C70": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",28)" + }, + "D70": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",28)" + }, + "E70": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",28)" + }, + "F70": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",28)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",28),0)" + }, + "G70": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",28)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",28),0)" + }, + "A71": { + "style": "5", + "content": "29" + }, + "B71": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",29)" + }, + "C71": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",29)" + }, + "D71": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",29)" + }, + "E71": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",29)" + }, + "F71": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",29)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",29),0)" + }, + "G71": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",29)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",29),0)" + }, + "A72": { + "style": "4", + "content": "30" + }, + "B72": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",30)" + }, + "C72": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",30)" + }, + "D72": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",30)" + }, + "E72": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",30)" + }, + "F72": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",30)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",30),0)" + }, + "G72": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",30)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",30),0)" + }, + "A73": { + "style": "5", + "content": "31" + }, + "B73": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",31)" + }, + "C73": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",31)" + }, + "D73": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",31)" + }, + "E73": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",31)" + }, + "F73": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",31)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",31),0)" + }, + "G73": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",31)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",31),0)" + }, + "A74": { + "style": "4", + "content": "32" + }, + "B74": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",32)" + }, + "C74": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",32)" + }, + "D74": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",32)" + }, + "E74": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",32)" + }, + "F74": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",32)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",32),0)" + }, + "G74": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",32)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",32),0)" + }, + "A75": { + "style": "5", + "content": "33" + }, + "B75": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",33)" + }, + "C75": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",33)" + }, + "D75": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",33)" + }, + "E75": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",33)" + }, + "F75": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",33)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",33),0)" + }, + "G75": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",33)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",33),0)" + }, + "A76": { + "style": "4", + "content": "34" + }, + "B76": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",34)" + }, + "C76": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",34)" + }, + "D76": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",34)" + }, + "E76": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",34)" + }, + "F76": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",34)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",34),0)" + }, + "G76": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",34)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",34),0)" + }, + "A77": { + "style": "5", + "content": "35" + }, + "B77": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",35)" + }, + "C77": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",35)" + }, + "D77": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",35)" + }, + "E77": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",35)" + }, + "F77": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",35)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",35),0)" + }, + "G77": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",35)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",35),0)" + }, + "A78": { + "style": "4", + "content": "36" + }, + "B78": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",36)" + }, + "C78": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",36)" + }, + "D78": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",36)" + }, + "E78": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",36)" + }, + "F78": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",36)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",36),0)" + }, + "G78": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",36)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",36),0)" + }, + "A79": { + "style": "5", + "content": "37" + }, + "B79": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",37)" + }, + "C79": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",37)" + }, + "D79": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",37)" + }, + "E79": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",37)" + }, + "F79": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",37)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",37),0)" + }, + "G79": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",37)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",37),0)" + }, + "A80": { + "style": "4", + "content": "38" + }, + "B80": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",38)" + }, + "C80": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",38)" + }, + "D80": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",38)" + }, + "E80": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",38)" + }, + "F80": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",38)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",38),0)" + }, + "G80": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",38)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",38),0)" + }, + "A81": { + "style": "5", + "content": "39" + }, + "B81": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",39)" + }, + "C81": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",39)" + }, + "D81": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",39)" + }, + "E81": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",39)" + }, + "F81": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",39)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",39),0)" + }, + "G81": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",39)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",39),0)" + }, + "A82": { + "style": "4", + "content": "40" + }, + "B82": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",40)" + }, + "C82": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",40)" + }, + "D82": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",40)" + }, + "E82": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",40)" + }, + "F82": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",40)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",40),0)" + }, + "G82": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",40)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",40),0)" + }, + "A83": { + "style": "5", + "content": "41" + }, + "B83": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",41)" + }, + "C83": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",41)" + }, + "D83": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",41)" + }, + "E83": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",41)" + }, + "F83": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",41)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",41),0)" + }, + "G83": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",41)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",41),0)" + }, + "A84": { + "style": "4", + "content": "42" + }, + "B84": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",42)" + }, + "C84": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",42)" + }, + "D84": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",42)" + }, + "E84": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",42)" + }, + "F84": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",42)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",42),0)" + }, + "G84": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",42)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",42),0)" + }, + "A85": { + "style": "5", + "content": "43" + }, + "B85": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",43)" + }, + "C85": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",43)" + }, + "D85": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",43)" + }, + "E85": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",43)" + }, + "F85": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",43)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",43),0)" + }, + "G85": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",43)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",43),0)" + }, + "A86": { + "style": "4", + "content": "44" + }, + "B86": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",44)" + }, + "C86": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",44)" + }, + "D86": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",44)" + }, + "E86": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",44)" + }, + "F86": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",44)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",44),0)" + }, + "G86": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",44)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",44),0)" + }, + "A87": { + "style": "5", + "content": "45" + }, + "B87": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",45)" + }, + "C87": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",45)" + }, + "D87": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",45)" + }, + "E87": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",45)" + }, + "F87": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",45)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",45),0)" + }, + "G87": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",45)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",45),0)" + }, + "A88": { + "style": "4", + "content": "46" + }, + "B88": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",46)" + }, + "C88": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",46)" + }, + "D88": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",46)" + }, + "E88": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",46)" + }, + "F88": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",46)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",46),0)" + }, + "G88": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",46)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",46),0)" + }, + "A89": { + "style": "5", + "content": "47" + }, + "B89": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",47)" + }, + "C89": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",47)" + }, + "D89": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",47)" + }, + "E89": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",47)" + }, + "F89": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",47)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",47),0)" + }, + "G89": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",47)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",47),0)" + }, + "A90": { + "style": "4", + "content": "48" + }, + "B90": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",48)" + }, + "C90": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",48)" + }, + "D90": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",48)" + }, + "E90": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",48)" + }, + "F90": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",48)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",48),0)" + }, + "G90": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",48)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",48),0)" + }, + "A91": { + "style": "5", + "content": "49" + }, + "B91": { + "style": "5", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",49)" + }, + "C91": { + "style": "5", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",49)" + }, + "D91": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",49)" + }, + "E91": { + "style": "5", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",49)" + }, + "F91": { + "style": "5", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",49)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",49),0)" + }, + "G91": { + "style": "5", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",49)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",49),0)" + }, + "A92": { + "style": "4", + "content": "50" + }, + "B92": { + "style": "4", + "content": "=ODOO.PIVOT.HEADER(3,\"#partner_id\",50)" + }, + "C92": { + "style": "4", + "format": "1", + "content": "=ODOO.PIVOT(3,\"price_total\",\"#partner_id\",50)" + }, + "D92": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"order_id\",\"#partner_id\",50)" + }, + "E92": { + "style": "4", + "format": "2", + "content": "=ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",50)" + }, + "F92": { + "style": "4", + "format": "1", + "content": "=IFERROR(ODOO.PIVOT(3,\"price_total\",\"#partner_id\",50)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",50),0)" + }, + "G92": { + "style": "4", + "format": "2", + "content": "=IFERROR(ODOO.PIVOT(3,\"product_qty\",\"#partner_id\",50)/ODOO.PIVOT(3,\"order_id\",\"#partner_id\",50),0)" + } + }, + "conditionalFormats": [], + "figures": [ + { + "id": "kpi-soc-1", + "x": 0, + "y": 60, + "width": 180, + "height": 110, + "tag": "chart", + "data": { + "type": "scorecard", + "title": "Ventas socias (€)", + "keyValue": "Data!D1", + "baseline": "Data!E1", + "baselineDescr": "since last period", + "baselineMode": "percentage", + "baselineColorUp": "#00A04A", + "baselineColorDown": "#DC6965" + } + }, + { + "id": "kpi-soc-2", + "x": 190, + "y": 60, + "width": 180, + "height": 110, + "tag": "chart", + "data": { + "type": "scorecard", + "title": "Tickets socias", + "keyValue": "Data!D2", + "baseline": "Data!E2", + "baselineDescr": "since last period", + "baselineMode": "percentage", + "baselineColorUp": "#00A04A", + "baselineColorDown": "#DC6965" + } + }, + { + "id": "kpi-soc-3", + "x": 380, + "y": 60, + "width": 180, + "height": 110, + "tag": "chart", + "data": { + "type": "scorecard", + "title": "Ticket medio socias (€)", + "keyValue": "Data!D3", + "baseline": "Data!E3", + "baselineDescr": "since last period", + "baselineMode": "percentage", + "baselineColorUp": "#00A04A", + "baselineColorDown": "#DC6965" + } + }, + { + "id": "kpi-soc-4", + "x": 570, + "y": 60, + "width": 180, + "height": 110, + "tag": "chart", + "data": { + "type": "scorecard", + "title": "UPT socias", + "keyValue": "Data!D4", + "baseline": "Data!E4", + "baselineDescr": "since last period", + "baselineMode": "percentage", + "baselineColorUp": "#00A04A", + "baselineColorDown": "#DC6965" + } + }, + { + "id": "kpi-soc-5", + "x": 760, + "y": 60, + "width": 180, + "height": 110, + "tag": "chart", + "data": { + "type": "scorecard", + "title": "Compradoras distintas (socias)", + "keyValue": "Data!D5", + "baseline": "Data!E5", + "baselineDescr": "since last period", + "baselineMode": "percentage", + "baselineColorUp": "#00A04A", + "baselineColorDown": "#DC6965" + } + }, + { + "id": "kpi-soc-6", + "x": 950, + "y": 60, + "width": 180, + "height": 110, + "tag": "chart", + "data": { + "type": "scorecard", + "title": "Frecuencia socias", + "keyValue": "Data!D6", + "baseline": "Data!E6", + "baselineDescr": "since last period", + "baselineMode": "percentage", + "baselineColorUp": "#00A04A", + "baselineColorDown": "#DC6965" + } + }, + { + "id": "kpi-nsoc-1", + "x": 0, + "y": 210, + "width": 180, + "height": 110, + "tag": "chart", + "data": { + "type": "scorecard", + "title": "Ventas no socias (€)", + "keyValue": "Data!H1", + "baseline": "Data!I1", + "baselineDescr": "since last period", + "baselineMode": "percentage", + "baselineColorUp": "#00A04A", + "baselineColorDown": "#DC6965" + } + }, + { + "id": "kpi-nsoc-2", + "x": 190, + "y": 210, + "width": 180, + "height": 110, + "tag": "chart", + "data": { + "type": "scorecard", + "title": "Tickets no socias", + "keyValue": "Data!H2", + "baseline": "Data!I2", + "baselineDescr": "since last period", + "baselineMode": "percentage", + "baselineColorUp": "#00A04A", + "baselineColorDown": "#DC6965" + } + }, + { + "id": "kpi-nsoc-3", + "x": 380, + "y": 210, + "width": 180, + "height": 110, + "tag": "chart", + "data": { + "type": "scorecard", + "title": "Ticket medio no socias (€)", + "keyValue": "Data!H3", + "baseline": "Data!I3", + "baselineDescr": "since last period", + "baselineMode": "percentage", + "baselineColorUp": "#00A04A", + "baselineColorDown": "#DC6965" + } + }, + { + "id": "kpi-nsoc-4", + "x": 570, + "y": 210, + "width": 180, + "height": 110, + "tag": "chart", + "data": { + "type": "scorecard", + "title": "UPT no socias", + "keyValue": "Data!H4", + "baseline": "Data!I4", + "baselineDescr": "since last period", + "baselineMode": "percentage", + "baselineColorUp": "#00A04A", + "baselineColorDown": "#DC6965" + } + }, + { + "id": "kpi-nsoc-5", + "x": 760, + "y": 210, + "width": 180, + "height": 110, + "tag": "chart", + "data": { + "type": "scorecard", + "title": "Compradoras distintas (no socias)", + "keyValue": "Data!H5", + "baseline": "Data!I5", + "baselineDescr": "since last period", + "baselineMode": "percentage", + "baselineColorUp": "#00A04A", + "baselineColorDown": "#DC6965" + } + }, + { + "id": "chart-monthly-evolution", + "x": 0, + "y": 360, + "width": 1140, + "height": 280, + "tag": "chart", + "data": { + "title": "Evolución mensual — Socias vs no socias (€)", + "background": "#FFFFFF", + "legendPosition": "bottom", + "metaData": { + "groupBy": [ + "date:month" + ], + "measure": "price_total", + "order": null, + "resModel": "report.pos.order" + }, + "searchParams": { + "comparison": null, + "context": { + "group_by": [ + "date:month" + ], + "group_by_no_leaf": 1 + }, + "domain": [ + [ + "state", + "in", + [ + "paid", + "done", + "invoiced" + ] + ] + ], + "groupBy": [ + "date:month" + ], + "orderBy": [] + }, + "type": "odoo_line", + "verticalAxisPosition": "left" + } + }, + { + "id": "kpi-contrib-1", + "x": 0, + "y": 680, + "width": 180, + "height": 110, + "tag": "chart", + "data": { + "type": "scorecard", + "title": "Ventas socias (€)", + "keyValue": "Data!D1", + "baseline": "Data!E1", + "baselineDescr": "since last period", + "baselineMode": "percentage", + "baselineColorUp": "#00A04A", + "baselineColorDown": "#DC6965" + } + }, + { + "id": "kpi-contrib-2", + "x": 190, + "y": 680, + "width": 180, + "height": 110, + "tag": "chart", + "data": { + "type": "scorecard", + "title": "Cuota de compra", + "keyValue": "Data!D10", + "baseline": "Data!E10", + "baselineDescr": "since last period", + "baselineMode": "percentage", + "baselineColorUp": "#00A04A", + "baselineColorDown": "#DC6965" + } + }, + { + "id": "kpi-contrib-3", + "x": 380, + "y": 680, + "width": 180, + "height": 110, + "tag": "chart", + "data": { + "type": "scorecard", + "title": "Concentración de ventas", + "keyValue": "Data!D11", + "baseline": "Data!E11", + "baselineDescr": "since last period", + "baselineMode": "percentage", + "baselineColorUp": "#00A04A", + "baselineColorDown": "#DC6965" + } + } + ], + "areGridLinesVisible": false, + "isVisible": true + }, + { + "id": "data", + "name": "Data", + "colNumber": 10, + "rowNumber": 15, + "rows": {}, + "cols": { + "0": { + "size": 220 + }, + "1": { + "size": 140 + }, + "2": { + "size": 140 + }, + "3": { + "size": 140 + }, + "4": { + "size": 140 + }, + "5": { + "size": 140 + }, + "6": { + "size": 140 + }, + "7": { + "size": 140 + }, + "8": { + "size": 140 + } + }, + "merges": [], + "cells": { + "A1": { + "content": "=_t(\"Socias - Ventas\")" + }, + "B1": { + "content": "=ODOO.PIVOT(1,\"price_total\",\"is_member_at_date\",TRUE)" + }, + "C1": { + "content": "=ODOO.PIVOT(4,\"price_total\",\"is_member_at_date\",TRUE)" + }, + "D1": { + "content": "=FORMAT.LARGE.NUMBER(B1)" + }, + "E1": { + "content": "=FORMAT.LARGE.NUMBER(C1)" + }, + "F1": { + "content": "=ODOO.PIVOT(1,\"price_total\",\"is_member_at_date\",FALSE)" + }, + "G1": { + "content": "=ODOO.PIVOT(4,\"price_total\",\"is_member_at_date\",FALSE)" + }, + "H1": { + "content": "=FORMAT.LARGE.NUMBER(F1)" + }, + "I1": { + "content": "=FORMAT.LARGE.NUMBER(G1)" + }, + "A2": { + "content": "=_t(\"Socias - Tickets\")" + }, + "B2": { + "content": "=ODOO.PIVOT(1,\"order_id\",\"is_member_at_date\",TRUE)" + }, + "C2": { + "content": "=ODOO.PIVOT(4,\"order_id\",\"is_member_at_date\",TRUE)" + }, + "D2": { + "content": "=FORMAT.LARGE.NUMBER(B2)" + }, + "E2": { + "content": "=FORMAT.LARGE.NUMBER(C2)" + }, + "F2": { + "content": "=ODOO.PIVOT(1,\"order_id\",\"is_member_at_date\",FALSE)" + }, + "G2": { + "content": "=ODOO.PIVOT(4,\"order_id\",\"is_member_at_date\",FALSE)" + }, + "H2": { + "content": "=FORMAT.LARGE.NUMBER(F2)" + }, + "I2": { + "content": "=FORMAT.LARGE.NUMBER(G2)" + }, + "A3": { + "content": "=_t(\"Socias - Ticket medio\")" + }, + "B3": { + "content": "=IFERROR(B1/B2,0)" + }, + "C3": { + "content": "=IFERROR(C1/C2,0)" + }, + "D3": { + "content": "=ROUND(B3,2)" + }, + "E3": { + "content": "=ROUND(C3,2)" + }, + "F3": { + "content": "=IFERROR(F1/F2,0)" + }, + "G3": { + "content": "=IFERROR(G1/G2,0)" + }, + "H3": { + "content": "=ROUND(F3,2)" + }, + "I3": { + "content": "=ROUND(G3,2)" + }, + "A4": { + "content": "=_t(\"Socias - UPT\")" + }, + "B4": { + "content": "=IFERROR(ODOO.PIVOT(1,\"product_qty\",\"is_member_at_date\",TRUE)/B2,0)" + }, + "C4": { + "content": "=IFERROR(ODOO.PIVOT(4,\"product_qty\",\"is_member_at_date\",TRUE)/C2,0)" + }, + "D4": { + "content": "=ROUND(B4,2)" + }, + "E4": { + "content": "=ROUND(C4,2)" + }, + "F4": { + "content": "=IFERROR(ODOO.PIVOT(1,\"product_qty\",\"is_member_at_date\",FALSE)/F2,0)" + }, + "G4": { + "content": "=IFERROR(ODOO.PIVOT(4,\"product_qty\",\"is_member_at_date\",FALSE)/G2,0)" + }, + "H4": { + "content": "=ROUND(F4,2)" + }, + "I4": { + "content": "=ROUND(G4,2)" + }, + "A5": { + "content": "=_t(\"Socias - Compradoras distintas\")" + }, + "B5": { + "content": "=ODOO.PIVOT(1,\"partner_id\",\"is_member_at_date\",TRUE)" + }, + "C5": { + "content": "=ODOO.PIVOT(4,\"partner_id\",\"is_member_at_date\",TRUE)" + }, + "D5": { + "content": "=FORMAT.LARGE.NUMBER(B5)" + }, + "E5": { + "content": "=FORMAT.LARGE.NUMBER(C5)" + }, + "F5": { + "content": "=ODOO.PIVOT(1,\"partner_id\",\"is_member_at_date\",FALSE)" + }, + "G5": { + "content": "=ODOO.PIVOT(4,\"partner_id\",\"is_member_at_date\",FALSE)" + }, + "H5": { + "content": "=FORMAT.LARGE.NUMBER(F5)" + }, + "I5": { + "content": "=FORMAT.LARGE.NUMBER(G5)" + }, + "A6": { + "content": "=_t(\"Socias - Frecuencia\")" + }, + "B6": { + "content": "=IFERROR(B2/B5,0)" + }, + "C6": { + "content": "=IFERROR(C2/C5,0)" + }, + "D6": { + "content": "=ROUND(B6,2)" + }, + "E6": { + "content": "=ROUND(C6,2)" + }, + "A8": { + "content": "=_t(\"Total ventas\")" + }, + "B8": { + "content": "=ODOO.PIVOT(1,\"price_total\")" + }, + "C8": { + "content": "=ODOO.PIVOT(4,\"price_total\")" + }, + "D8": { + "content": "=FORMAT.LARGE.NUMBER(B8)" + }, + "E8": { + "content": "=FORMAT.LARGE.NUMBER(C8)" + }, + "A9": { + "content": "=_t(\"Total compradoras distintas\")" + }, + "B9": { + "content": "=ODOO.PIVOT(1,\"partner_id\")" + }, + "C9": { + "content": "=ODOO.PIVOT(4,\"partner_id\")" + }, + "D9": { + "content": "=FORMAT.LARGE.NUMBER(B9)" + }, + "E9": { + "content": "=FORMAT.LARGE.NUMBER(C9)" + }, + "A10": { + "content": "=_t(\"Cuota de compra %\")" + }, + "B10": { + "content": "=IFERROR(B1/B8,0)" + }, + "C10": { + "content": "=IFERROR(C1/C8,0)" + }, + "D10": { + "content": "=ROUND(B10*100,2)" + }, + "E10": { + "content": "=ROUND(C10*100,2)" + }, + "A11": { + "content": "=_t(\"Concentración de ventas %\")" + }, + "B11": { + "content": "=IFERROR(B5/B9,0)" + }, + "C11": { + "content": "=IFERROR(C5/C9,0)" + }, + "D11": { + "content": "=ROUND(B11*100,2)" + }, + "E11": { + "content": "=ROUND(C11*100,2)" + } + }, + "conditionalFormats": [], + "figures": [], + "areGridLinesVisible": true, + "isVisible": false + } + ], + "entities": {}, + "styles": { + "1": { + "bold": true, + "fontSize": 22, + "textColor": "#2E7D32" + }, + "2": { + "bold": true, + "fontSize": 14, + "textColor": "#333333" + }, + "3": { + "bold": true, + "fillColor": "#EFEFEF", + "textColor": "#333333", + "align": "center" + }, + "4": { + "fillColor": "#F8F8F8" + }, + "5": {} + }, + "formats": { + "1": "#,##0.00 [$€]", + "2": "#,##0" + }, + "borders": { + "1": { + "bottom": [ + "thin", + "#000" + ] + } + }, + "revisionId": "START_REVISION", + "chartOdooMenusReferences": {}, + "odooVersion": 1, + "lists": {}, + "listNextId": 1, + "pivots": { + "1": { + "colGroupBys": [], + "context": { + "group_by_no_leaf": 1, + "group_by": [] + }, + "domain": [ + [ + "state", + "in", + [ + "paid", + "done", + "invoiced" + ] + ] + ], + "id": "1", + "measures": [ + { + "field": "price_total" + }, + { + "field": "order_id" + }, + { + "field": "product_qty" + }, + { + "field": "partner_id" + } + ], + "model": "report.pos.order", + "rowGroupBys": [ + "is_member_at_date" + ], + "name": "TPV por condición de socia", + "sortedColumn": null + }, + "2": { + "colGroupBys": [], + "context": { + "group_by_no_leaf": 1, + "group_by": [] + }, + "domain": [ + [ + "state", + "in", + [ + "paid", + "done", + "invoiced" + ] + ] + ], + "id": "2", + "measures": [ + { + "field": "price_total" + } + ], + "model": "report.pos.order", + "rowGroupBys": [ + "date:month" + ], + "name": "Evolución mensual por condición de socia", + "sortedColumn": null + }, + "3": { + "colGroupBys": [], + "context": { + "group_by_no_leaf": 1, + "group_by": [] + }, + "domain": [ + [ + "state", + "in", + [ + "paid", + "done", + "invoiced" + ] + ], + [ + "is_member_at_date", + "=", + true + ] + ], + "id": "3", + "measures": [ + { + "field": "price_total" + }, + { + "field": "order_id" + }, + { + "field": "product_qty" + } + ], + "model": "report.pos.order", + "rowGroupBys": [ + "partner_id" + ], + "name": "Mejores compradoras (socias)", + "sortedColumn": { + "groupId": [ + [], + [] + ], + "measure": "price_total", + "order": "desc" + } + }, + "4": { + "colGroupBys": [], + "context": { + "group_by_no_leaf": 1, + "group_by": [] + }, + "domain": [ + [ + "state", + "in", + [ + "paid", + "done", + "invoiced" + ] + ] + ], + "id": "4", + "measures": [ + { + "field": "price_total" + }, + { + "field": "order_id" + }, + { + "field": "product_qty" + }, + { + "field": "partner_id" + } + ], + "model": "report.pos.order", + "rowGroupBys": [ + "is_member_at_date" + ], + "name": "TPV por condición de socia - previous", + "sortedColumn": null + }, + "5": { + "colGroupBys": [], + "context": { + "group_by_no_leaf": 1, + "group_by": [] + }, + "domain": [ + [ + "state", + "in", + [ + "paid", + "done", + "invoiced" + ] + ] + ], + "id": "5", + "measures": [ + { + "field": "price_total" + } + ], + "model": "report.pos.order", + "rowGroupBys": [ + "date:month" + ], + "name": "Evolución mensual - previous", + "sortedColumn": null + }, + "6": { + "colGroupBys": [], + "context": { + "group_by_no_leaf": 1, + "group_by": [] + }, + "domain": [ + [ + "state", + "in", + [ + "paid", + "done", + "invoiced" + ] + ], + [ + "is_member_at_date", + "=", + true + ] + ], + "id": "6", + "measures": [ + { + "field": "price_total" + }, + { + "field": "order_id" + }, + { + "field": "product_qty" + } + ], + "model": "report.pos.order", + "rowGroupBys": [ + "partner_id" + ], + "name": "Mejores compradoras - previous", + "sortedColumn": { + "groupId": [ + [], + [] + ], + "measure": "price_total", + "order": "desc" + } + } + }, + "pivotNextId": 7, + "globalFilters": [ + { + "id": "11111111-1111-1111-1111-111111111111", + "type": "date", + "label": "Period", + "defaultValue": {}, + "rangeType": "month", + "defaultsToCurrentPeriod": true, + "pivotFields": { + "1": { + "field": "date", + "type": "datetime", + "offset": 0 + }, + "2": { + "field": "date", + "type": "datetime", + "offset": 0 + }, + "3": { + "field": "date", + "type": "datetime", + "offset": 0 + }, + "4": { + "field": "date", + "type": "datetime", + "offset": -1 + }, + "5": { + "field": "date", + "type": "datetime", + "offset": -1 + }, + "6": { + "field": "date", + "type": "datetime", + "offset": -1 + } + }, + "listFields": {}, + "graphFields": { + "chart-monthly-evolution": { + "field": "date", + "type": "datetime", + "offset": 0 + } + } + }, + { + "id": "22222222-2222-2222-2222-222222222222", + "type": "relation", + "label": "Categoría", + "modelName": "product.category", + "defaultValue": [], + "defaultValueDisplayNames": [], + "rangeType": "year", + "defaultsToCurrentPeriod": false, + "pivotFields": { + "1": { + "field": "product_categ_id", + "type": "many2one" + }, + "2": { + "field": "product_categ_id", + "type": "many2one" + }, + "3": { + "field": "product_categ_id", + "type": "many2one" + }, + "4": { + "field": "product_categ_id", + "type": "many2one" + }, + "5": { + "field": "product_categ_id", + "type": "many2one" + }, + "6": { + "field": "product_categ_id", + "type": "many2one" + } + }, + "listFields": {}, + "graphFields": {} + }, + { + "id": "33333333-3333-3333-3333-333333333333", + "type": "relation", + "label": "Producto", + "modelName": "product.product", + "defaultValue": [], + "defaultValueDisplayNames": [], + "rangeType": "year", + "defaultsToCurrentPeriod": false, + "pivotFields": { + "1": { + "field": "product_id", + "type": "many2one" + }, + "2": { + "field": "product_id", + "type": "many2one" + }, + "3": { + "field": "product_id", + "type": "many2one" + }, + "4": { + "field": "product_id", + "type": "many2one" + }, + "5": { + "field": "product_id", + "type": "many2one" + }, + "6": { + "field": "product_id", + "type": "many2one" + } + }, + "listFields": {}, + "graphFields": {} + }, + { + "id": "44444444-4444-4444-4444-444444444444", + "type": "relation", + "label": "Socia", + "modelName": "res.partner", + "defaultValue": [], + "defaultValueDisplayNames": [], + "rangeType": "year", + "defaultsToCurrentPeriod": false, + "pivotFields": { + "1": { + "field": "partner_id", + "type": "many2one" + }, + "2": { + "field": "partner_id", + "type": "many2one" + }, + "3": { + "field": "partner_id", + "type": "many2one" + }, + "4": { + "field": "partner_id", + "type": "many2one" + }, + "5": { + "field": "partner_id", + "type": "many2one" + }, + "6": { + "field": "partner_id", + "type": "many2one" + } + }, + "listFields": {}, + "graphFields": {} + } + ] +} diff --git a/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json b/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json new file mode 100644 index 0000000..7cac554 --- /dev/null +++ b/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json @@ -0,0 +1,367 @@ +{ + "version": 12, + "sheets": [ + { + "id": "dashboard", + "name": "Overview", + "colNumber": 26, + "rowNumber": 50, + "rows": { + "0": { + "size": 40 + } + }, + "cols": {}, + "merges": [], + "cells": { + "A1": { + "style": 1, + "content": "=_t(\"Cooperative POS — Overview\")" + }, + "A3": { + "style": 2, + "content": "=_t(\"Monthly evolution\")" + } + }, + "conditionalFormats": [], + "figures": [ + { + "id": "kpi-sales", + "x": 0, + "y": 60, + "width": 200, + "height": 120, + "tag": "chart", + "data": { + "type": "scorecard", + "title": "Sales (€)", + "keyValue": "Data!D1", + "baseline": "Data!E1", + "baselineDescr": "since last period", + "baselineMode": "percentage", + "baselineColorUp": "#00A04A", + "baselineColorDown": "#DC6965" + } + }, + { + "id": "kpi-orders", + "x": 220, + "y": 60, + "width": 200, + "height": 120, + "tag": "chart", + "data": { + "type": "scorecard", + "title": "Orders", + "keyValue": "Data!D2", + "baseline": "Data!E2", + "baselineDescr": "since last period", + "baselineMode": "percentage", + "baselineColorUp": "#00A04A", + "baselineColorDown": "#DC6965" + } + }, + { + "id": "kpi-ticket", + "x": 440, + "y": 60, + "width": 200, + "height": 120, + "tag": "chart", + "data": { + "type": "scorecard", + "title": "Average ticket (€)", + "keyValue": "Data!D3", + "baseline": "Data!E3", + "baselineDescr": "since last period", + "baselineMode": "percentage", + "baselineColorUp": "#00A04A", + "baselineColorDown": "#DC6965" + } + }, + { + "id": "kpi-margin", + "x": 660, + "y": 60, + "width": 200, + "height": 120, + "tag": "chart", + "data": { + "type": "scorecard", + "title": "Gross margin (€)", + "keyValue": "Data!D4", + "baseline": "Data!E4", + "baselineDescr": "since last period", + "baselineMode": "percentage", + "baselineColorUp": "#00A04A", + "baselineColorDown": "#DC6965" + } + }, + { + "id": "chart-monthly-sales", + "x": 0, + "y": 220, + "width": 1000, + "height": 300, + "tag": "chart", + "data": { + "title": "Monthly sales (€)", + "background": "#FFFFFF", + "legendPosition": "none", + "metaData": { + "groupBy": [ + "date:month" + ], + "measure": "price_total", + "order": null, + "resModel": "report.pos.order" + }, + "searchParams": { + "comparison": null, + "context": { + "group_by": [ + "date:month" + ], + "group_by_no_leaf": 1 + }, + "domain": [ + [ + "state", + "in", + [ + "paid", + "done", + "invoiced" + ] + ] + ], + "groupBy": [ + "date:month" + ], + "orderBy": [] + }, + "type": "odoo_line", + "verticalAxisPosition": "left" + } + } + ], + "areGridLinesVisible": false, + "isVisible": true + }, + { + "id": "data", + "name": "Data", + "colNumber": 5, + "rowNumber": 10, + "rows": {}, + "cols": { + "0": { + "size": 200 + }, + "1": { + "size": 140 + }, + "2": { + "size": 140 + }, + "3": { + "size": 140 + }, + "4": { + "size": 140 + } + }, + "merges": [], + "cells": { + "A1": { + "content": "=_t(\"KPI - Sales\")" + }, + "A2": { + "content": "=_t(\"KPI - Orders\")" + }, + "A3": { + "content": "=_t(\"KPI - Average ticket\")" + }, + "A4": { + "content": "=_t(\"KPI - Margin\")" + }, + "B1": { + "content": "=ODOO.PIVOT(1,\"price_total\")" + }, + "B2": { + "content": "=ODOO.PIVOT(1,\"order_id\")" + }, + "B3": { + "content": "=IFERROR(B1/B2,0)" + }, + "B4": { + "content": "=ODOO.PIVOT(1,\"margin\")" + }, + "C1": { + "content": "=ODOO.PIVOT(2,\"price_total\")" + }, + "C2": { + "content": "=ODOO.PIVOT(2,\"order_id\")" + }, + "C3": { + "content": "=IFERROR(C1/C2,0)" + }, + "C4": { + "content": "=ODOO.PIVOT(2,\"margin\")" + }, + "D1": { + "content": "=FORMAT.LARGE.NUMBER(B1)" + }, + "D2": { + "content": "=FORMAT.LARGE.NUMBER(B2)" + }, + "D3": { + "content": "=FORMAT.LARGE.NUMBER(B3)" + }, + "D4": { + "content": "=FORMAT.LARGE.NUMBER(B4)" + }, + "E1": { + "content": "=FORMAT.LARGE.NUMBER(C1)" + }, + "E2": { + "content": "=FORMAT.LARGE.NUMBER(C2)" + }, + "E3": { + "content": "=FORMAT.LARGE.NUMBER(C3)" + }, + "E4": { + "content": "=FORMAT.LARGE.NUMBER(C4)" + } + }, + "conditionalFormats": [], + "figures": [], + "areGridLinesVisible": true, + "isVisible": false + } + ], + "entities": {}, + "styles": { + "1": { + "bold": true, + "fontSize": 22, + "textColor": "#2E7D32" + }, + "2": { + "bold": true, + "fontSize": 14, + "textColor": "#333333" + } + }, + "formats": { + "1": "#,##0.00 [$€]", + "2": "#,##0" + }, + "borders": {}, + "revisionId": "START_REVISION", + "chartOdooMenusReferences": {}, + "odooVersion": 1, + "lists": {}, + "listNextId": 1, + "pivots": { + "1": { + "colGroupBys": [], + "context": { + "group_by_no_leaf": 1, + "group_by": [] + }, + "domain": [ + [ + "state", + "in", + [ + "paid", + "done", + "invoiced" + ] + ] + ], + "id": "1", + "measures": [ + { + "field": "price_total" + }, + { + "field": "margin" + }, + { + "field": "order_id" + } + ], + "model": "report.pos.order", + "rowGroupBys": [], + "name": "POS KPIs - current", + "sortedColumn": null + }, + "2": { + "colGroupBys": [], + "context": { + "group_by_no_leaf": 1, + "group_by": [] + }, + "domain": [ + [ + "state", + "in", + [ + "paid", + "done", + "invoiced" + ] + ] + ], + "id": "2", + "measures": [ + { + "field": "price_total" + }, + { + "field": "margin" + }, + { + "field": "order_id" + } + ], + "model": "report.pos.order", + "rowGroupBys": [], + "name": "POS KPIs - previous", + "sortedColumn": null + } + }, + "pivotNextId": 3, + "globalFilters": [ + { + "id": "11111111-1111-1111-1111-111111111111", + "type": "date", + "label": "Period", + "defaultValue": {}, + "rangeType": "month", + "defaultsToCurrentPeriod": true, + "pivotFields": { + "1": { + "field": "date", + "type": "datetime", + "offset": 0 + }, + "2": { + "field": "date", + "type": "datetime", + "offset": -1 + } + }, + "listFields": {}, + "graphFields": { + "chart-monthly-sales": { + "field": "date", + "type": "datetime", + "offset": 0 + } + } + } + ] +} diff --git a/spreadsheet_dashboard_pos_cooperative/data/files/time_dashboard.json b/spreadsheet_dashboard_pos_cooperative/data/files/time_dashboard.json new file mode 100644 index 0000000..9fd9a09 --- /dev/null +++ b/spreadsheet_dashboard_pos_cooperative/data/files/time_dashboard.json @@ -0,0 +1,221 @@ +{ + "version": 12, + "sheets": [ + { + "id": "dashboard", + "name": "Sales by time", + "colNumber": 26, + "rowNumber": 50, + "rows": { + "0": { + "size": 40 + } + }, + "cols": {}, + "merges": [], + "cells": { + "A1": { + "style": 1, + "content": "=_t(\"Cooperative POS — Sales by hours and days\")" + }, + "A3": { + "style": 2, + "content": "=_t(\"Sales by day of the week\")" + }, + "A20": { + "style": 2, + "content": "=_t(\"Sales by hour of the day\")" + } + }, + "conditionalFormats": [], + "figures": [ + { + "id": "chart-by-day", + "x": 0, + "y": 60, + "width": 1000, + "height": 280, + "tag": "chart", + "data": { + "title": "Sales by day of week", + "background": "#FFFFFF", + "legendPosition": "none", + "metaData": { + "groupBy": [ + "day_of_week" + ], + "measure": "price_total", + "order": null, + "resModel": "report.pos.order" + }, + "searchParams": { + "comparison": null, + "context": { + "group_by": [ + "day_of_week" + ], + "group_by_no_leaf": 1 + }, + "domain": [ + [ + "state", + "in", + [ + "paid", + "done", + "invoiced" + ] + ] + ], + "groupBy": [ + "day_of_week" + ], + "orderBy": [] + }, + "type": "odoo_line", + "verticalAxisPosition": "left" + } + }, + { + "id": "chart-by-hour", + "x": 0, + "y": 380, + "width": 1000, + "height": 280, + "tag": "chart", + "data": { + "title": "Sales by hour of day", + "background": "#FFFFFF", + "legendPosition": "none", + "metaData": { + "groupBy": [ + "hour_of_day" + ], + "measure": "price_total", + "order": null, + "resModel": "report.pos.order" + }, + "searchParams": { + "comparison": null, + "context": { + "group_by": [ + "hour_of_day" + ], + "group_by_no_leaf": 1 + }, + "domain": [ + [ + "state", + "in", + [ + "paid", + "done", + "invoiced" + ] + ] + ], + "groupBy": [ + "hour_of_day" + ], + "orderBy": [] + }, + "type": "odoo_line", + "verticalAxisPosition": "left" + } + } + ], + "areGridLinesVisible": false, + "isVisible": true + } + ], + "entities": {}, + "styles": { + "1": { + "bold": true, + "fontSize": 22, + "textColor": "#2E7D32" + }, + "2": { + "bold": true, + "fontSize": 14, + "textColor": "#333333" + } + }, + "formats": {}, + "borders": {}, + "revisionId": "START_REVISION", + "chartOdooMenusReferences": {}, + "odooVersion": 1, + "lists": {}, + "listNextId": 1, + "pivots": {}, + "pivotNextId": 1, + "globalFilters": [ + { + "id": "11111111-1111-1111-1111-111111111111", + "type": "date", + "label": "Period", + "defaultValue": {}, + "rangeType": "month", + "defaultsToCurrentPeriod": true, + "pivotFields": {}, + "listFields": {}, + "graphFields": { + "chart-by-day": { + "field": "date", + "type": "datetime", + "offset": 0 + }, + "chart-by-hour": { + "field": "date", + "type": "datetime", + "offset": 0 + } + } + }, + { + "id": "22222222-2222-2222-2222-222222222222", + "type": "relation", + "label": "Product Category", + "modelName": "product.category", + "defaultValue": [], + "defaultValueDisplayNames": [], + "rangeType": "year", + "defaultsToCurrentPeriod": false, + "pivotFields": {}, + "listFields": {}, + "graphFields": { + "chart-by-day": { + "field": "product_categ_id", + "type": "many2one" + }, + "chart-by-hour": { + "field": "product_categ_id", + "type": "many2one" + } + } + }, + { + "id": "33333333-3333-3333-3333-333333333333", + "type": "relation", + "label": "Product", + "modelName": "product.product", + "defaultValue": [], + "defaultValueDisplayNames": [], + "rangeType": "year", + "defaultsToCurrentPeriod": false, + "pivotFields": {}, + "listFields": {}, + "graphFields": { + "chart-by-day": { + "field": "product_id", + "type": "many2one" + }, + "chart-by-hour": { + "field": "product_id", + "type": "many2one" + } + } + } + ] +} diff --git a/spreadsheet_dashboard_pos_cooperative/i18n/es.po b/spreadsheet_dashboard_pos_cooperative/i18n/es.po new file mode 100644 index 0000000..fcc380a --- /dev/null +++ b/spreadsheet_dashboard_pos_cooperative/i18n/es.po @@ -0,0 +1,634 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * spreadsheet_dashboard_pos_cooperative +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-05 15:43+0000\n" +"PO-Revision-Date: 2026-06-05 15:43+0000\n" +"Last-Translator: Criptomart\n" +"Language-Team: Spanish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "Average ticket (€)" +msgstr "Ticket medio (€)" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Categoría" +msgstr "Categoría" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Compradoras distintas (no socias)" +msgstr "Compradoras distintas (no socias)" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Compradoras distintas (socias)" +msgstr "Compradoras distintas (socias)" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Contribución de las socias" +msgstr "Contribución de las socias" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Cooperative POS — Categories" +msgstr "TPV Cooperativa — Categorías" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Cooperative POS — Members vs Non-members" +msgstr "TPV Cooperativa — Socias vs no socias" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "Cooperative POS — Overview" +msgstr "TPV Cooperativa — Vista general" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/time_dashboard.json:0 +#, python-format +msgid "Cooperative POS — Sales by hours and days" +msgstr "TPV Cooperativa — Ventas por horas y días" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Cuota %" +msgstr "Cuota %" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Cuota de compra" +msgstr "Cuota de compra" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Cuota de compra %" +msgstr "Cuota de compra %" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Evolución mensual por condición de socia" +msgstr "Evolución mensual por condición de socia" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Evolución mensual — Socias vs no socias" +msgstr "Evolución mensual — Socias vs no socias" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Evolución mensual — Socias vs no socias (€)" +msgstr "Evolución mensual — Socias vs no socias (€)" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Familia" +msgstr "Familia" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Frecuencia socias" +msgstr "Frecuencia socias" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "Gross margin (€)" +msgstr "Margen bruto (€)" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "KPI - Average ticket" +msgstr "KPI - Ticket medio" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "KPI - Margin" +msgstr "KPI - Margen" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "KPI - Orders" +msgstr "KPI - Tickets" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "KPI - Sales" +msgstr "KPI - Ventas" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "KPIs de no socias" +msgstr "KPIs de no socias" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "KPIs de socias" +msgstr "KPIs de socias" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Mejores compradoras (socias)" +msgstr "Mejores compradoras (socias)" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "Monthly evolution" +msgstr "Evolución mensual" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "Monthly sales (€)" +msgstr "Ventas mensuales (€)" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "Orders" +msgstr "Tickets" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "POS KPIs" +msgstr "POS KPIs" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Penetración socias" +msgstr "Penetración socias" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Penetración socias %" +msgstr "Penetración socias %" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/time_dashboard.json:0 +#, python-format +msgid "Period" +msgstr "Período" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/time_dashboard.json:0 +#, python-format +msgid "Product" +msgstr "Producto" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/time_dashboard.json:0 +#, python-format +msgid "Product Category" +msgstr "Categoría de producto" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Producto" +msgstr "Producto" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "Sales (€)" +msgstr "Ventas (€)" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/time_dashboard.json:0 +#, python-format +msgid "Sales by day of the week" +msgstr "Ventas por día de la semana" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/time_dashboard.json:0 +#, python-format +msgid "Sales by day of week" +msgstr "Ventas por día de la semana" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/time_dashboard.json:0 +#, python-format +msgid "Sales by hour of day" +msgstr "Ventas por hora del día" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/time_dashboard.json:0 +#, python-format +msgid "Sales by hour of the day" +msgstr "Ventas por hora del día" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Socia" +msgstr "Socia" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Socias - Compradoras distintas" +msgstr "Socias - Compradoras distintas" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Socias - Frecuencia" +msgstr "Socias - Frecuencia" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Socias - Ticket medio" +msgstr "Socias - Ticket medio" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Socias - Tickets" +msgstr "Socias - Tickets" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Socias - UPT" +msgstr "Socias - UPT" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Socias - Ventas" +msgstr "Socias - Ventas" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Subfamilia" +msgstr "Subfamilia" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "TOP 50 socias compradoras" +msgstr "TOP 50 socias compradoras" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "TPV por condición de socia" +msgstr "TPV por condición de socia" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Ticket medio (€)" +msgstr "Ticket medio (€)" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Ticket medio no socias (€)" +msgstr "Ticket medio no socias (€)" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Ticket medio socias (€)" +msgstr "Ticket medio socias (€)" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Tickets" +msgstr "Tickets" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Tickets no socias" +msgstr "Tickets no socias" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Tickets socias" +msgstr "Tickets socias" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Top 10 categorías" +msgstr "Top 10 categorías" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Top 10 familias" +msgstr "Top 10 familias" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Top 10 productos" +msgstr "Top 10 productos" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Top 10 subfamilias" +msgstr "Top 10 subfamilias" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Top categorías" +msgstr "Top categorías" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Top familias" +msgstr "Top familias" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Top productos" +msgstr "Top productos" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Top subfamilias" +msgstr "Top subfamilias" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Total compradoras distintas" +msgstr "Total compradoras distintas" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Total ventas" +msgstr "Total ventas" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "UPT" +msgstr "UPT" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "UPT no socias" +msgstr "UPT no socias" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "UPT socias" +msgstr "UPT socias" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Unidades" +msgstr "Unidades" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Ventas (€)" +msgstr "Ventas (€)" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Ventas no socias (€)" +msgstr "Ventas no socias (€)" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Ventas socias (€)" +msgstr "Ventas socias (€)" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "en el período" +msgstr "en el período" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "in selected period" +msgstr "en el período seleccionado" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "sales / orders" +msgstr "ventas / tickets" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "socias compradoras / total" +msgstr "socias compradoras / total" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "socias únicas" +msgstr "socias únicas" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "tickets" +msgstr "tickets" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "tickets / compradora" +msgstr "tickets / compradora" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "uds / ticket" +msgstr "uds / ticket" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "ventas / tickets" +msgstr "ventas / tickets" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "ventas socias / total" +msgstr "ventas socias / total" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "únicas" +msgstr "únicas" diff --git a/spreadsheet_dashboard_pos_cooperative/i18n/spreadsheet_dashboard_pos_cooperative.pot b/spreadsheet_dashboard_pos_cooperative/i18n/spreadsheet_dashboard_pos_cooperative.pot new file mode 100644 index 0000000..b07097e --- /dev/null +++ b/spreadsheet_dashboard_pos_cooperative/i18n/spreadsheet_dashboard_pos_cooperative.pot @@ -0,0 +1,633 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * spreadsheet_dashboard_pos_cooperative +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-05 15:43+0000\n" +"PO-Revision-Date: 2026-06-05 15:43+0000\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_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "Average ticket (€)" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Categoría" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Compradoras distintas (no socias)" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Compradoras distintas (socias)" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Contribución de las socias" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Cooperative POS — Categories" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Cooperative POS — Members vs Non-members" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "Cooperative POS — Overview" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/time_dashboard.json:0 +#, python-format +msgid "Cooperative POS — Sales by hours and days" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Cuota %" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Cuota de compra" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Cuota de compra %" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Evolución mensual por condición de socia" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Evolución mensual — Socias vs no socias" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Evolución mensual — Socias vs no socias (€)" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Familia" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Frecuencia socias" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "Gross margin (€)" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "KPI - Average ticket" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "KPI - Margin" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "KPI - Orders" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "KPI - Sales" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "KPIs de no socias" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "KPIs de socias" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Mejores compradoras (socias)" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "Monthly evolution" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "Monthly sales (€)" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "Orders" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "POS KPIs" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Penetración socias" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Penetración socias %" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/time_dashboard.json:0 +#, python-format +msgid "Period" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/time_dashboard.json:0 +#, python-format +msgid "Product" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/time_dashboard.json:0 +#, python-format +msgid "Product Category" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Producto" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "Sales (€)" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/time_dashboard.json:0 +#, python-format +msgid "Sales by day of the week" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/time_dashboard.json:0 +#, python-format +msgid "Sales by day of week" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/time_dashboard.json:0 +#, python-format +msgid "Sales by hour of day" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/time_dashboard.json:0 +#, python-format +msgid "Sales by hour of the day" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Socia" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Socias - Compradoras distintas" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Socias - Frecuencia" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Socias - Ticket medio" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Socias - Tickets" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Socias - UPT" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Socias - Ventas" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Subfamilia" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "TOP 50 socias compradoras" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "TPV por condición de socia" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Ticket medio (€)" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Ticket medio no socias (€)" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Ticket medio socias (€)" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Tickets" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Tickets no socias" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Tickets socias" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Top 10 categorías" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Top 10 familias" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Top 10 productos" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Top 10 subfamilias" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Top categorías" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Top familias" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Top productos" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#, python-format +msgid "Top subfamilias" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Total compradoras distintas" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Total ventas" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "UPT" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "UPT no socias" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "UPT socias" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Unidades" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/categories_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Ventas (€)" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Ventas no socias (€)" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "Ventas socias (€)" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "en el período" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "in selected period" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "sales / orders" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "socias compradoras / total" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "socias únicas" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/overview_dashboard.json:0 +#, python-format +msgid "tickets" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "tickets / compradora" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "uds / ticket" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "ventas / tickets" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "ventas socias / total" +msgstr "" + +#. module: spreadsheet_dashboard_pos_cooperative +#. odoo-javascript +#: code:addons/spreadsheet_dashboard_pos_cooperative/data/files/members_dashboard.json:0 +#, python-format +msgid "únicas" +msgstr "" diff --git a/spreadsheet_dashboard_pos_cooperative/readme/CONTRIBUTORS.rst b/spreadsheet_dashboard_pos_cooperative/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..c8ac156 --- /dev/null +++ b/spreadsheet_dashboard_pos_cooperative/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Criptomart diff --git a/spreadsheet_dashboard_pos_cooperative/readme/DESCRIPTION.rst b/spreadsheet_dashboard_pos_cooperative/readme/DESCRIPTION.rst new file mode 100644 index 0000000..cb34354 --- /dev/null +++ b/spreadsheet_dashboard_pos_cooperative/readme/DESCRIPTION.rst @@ -0,0 +1,23 @@ +Publishes spreadsheet-based dashboards for cooperative supermarkets +in Odoo's *Dashboards* menu, under a dedicated *Cooperative* group. + +The dashboards consume the data prepared by ``pos_dashboard_cooperative`` +(extended ``report.pos.order`` with member-at-date flag, category +hierarchy and time dimensions). They use Odoo's o-spreadsheet engine, +the same as Odoo Enterprise's official ``spreadsheet_dashboard_*`` +modules. + +Four dashboards ship out of the box: + +* **POS Overview** — headline KPIs (Sales, Orders, Average ticket, + Margin) and monthly evolution. +* **POS Members** — members vs non-members comparison, monthly + evolution chart, TOP 50 buying members. +* **POS Categories** — members contribution KPIs and TOP 10 families, + subfamilies and products. +* **POS Sales by Time** — sales by day of the week and hour of the + day. + +Each dashboard is a small hand-authored JSON file. They can be +redesigned visually inside o-spreadsheet (with ``spreadsheet_oca`` +installed) and re-exported; see USAGE for the workflow. diff --git a/spreadsheet_dashboard_pos_cooperative/readme/ROADMAP.rst b/spreadsheet_dashboard_pos_cooperative/readme/ROADMAP.rst new file mode 100644 index 0000000..091864f --- /dev/null +++ b/spreadsheet_dashboard_pos_cooperative/readme/ROADMAP.rst @@ -0,0 +1,38 @@ +* Period-over-period comparisons on the scorecards (the BI brief shows + "X% desde el último periodo" arrows on every KPI). In o-spreadsheet + this is wired through ``baseline`` references plus a comparison + range on the date global filter. Postponed until the four dashboards + are validated by the customer in production. + +* Quarter-level selection (*Q1..Q4*) on the ``Period`` filter. The + o-spreadsheet date filter in Odoo 16 only accepts a single + ``rangeType`` per filter; we picked ``month`` because it is the + finest granularity. A second date filter with ``rangeType: + "quarter"`` would coexist visually but duplicate the year picker, + which the customer rejected. Revisit in Odoo 17 where the filter + UI allows choosing the granularity dynamically. + +* Rolling-window date filter (*Last 30 / 90 / 180 days*) as an + alternative to the month picker. Same limitation as above (one + ``rangeType`` per filter). + +* "Sales concentration" KPI on the Categories dashboard: share of + sales captured by the top 20% of buying members. The Top buyers + pivot already exists in the Members dashboard; only an aggregation + formula plus a scorecard would be needed. + +* Stricter definition of **Members penetration** as ``distinct member + buyers / total members in the cooperative`` (instead of the current + ``/ total buyers in the period``). Requires sourcing the total from + ``share.line`` rather than from ``report.pos.order``. + +* Translate ``spreadsheet.dashboard.name`` / ``spreadsheet.dashboard.group.name`` + so the entries in the *Dashboards* menu render in the user's + language (currently always English: *POS Overview*, *POS Members*, + etc.). Blocked upstream: the core ``name`` fields are not declared + ``translate=True``. Either patch the core fields downstream or rename + the records to the customer's primary language in the XML. + +* Add Galician, Catalan, French, Dutch and Croatian translations. + Spanish (``es.po``) ships out of the box. The other locales can be + produced from the same ``.pot`` by translating each ``msgstr``. diff --git a/spreadsheet_dashboard_pos_cooperative/readme/USAGE.rst b/spreadsheet_dashboard_pos_cooperative/readme/USAGE.rst new file mode 100644 index 0000000..5445324 --- /dev/null +++ b/spreadsheet_dashboard_pos_cooperative/readme/USAGE.rst @@ -0,0 +1,149 @@ +Open *Dashboards → Cooperative* in the Odoo backend. Four dashboards +are published: + +The workbook content (titles, KPI labels, table headers, scorecard +descriptions) is available in **English (source) and Spanish** out of +the box. Users with ``lang = es_ES`` will see all in-cell texts in +Spanish; the rest of the locales can be added by translating the +``i18n/spreadsheet_dashboard_pos_cooperative.pot`` template. + +Note: the dashboard names shown in the *Dashboards* menu sidebar +(*POS Overview*, *POS Members*, *POS Categories*, *POS Sales by +Time*) are not translatable because ``spreadsheet.dashboard.name`` is +not declared as a translatable field in Odoo core. + +POS Overview +============ + +Headline KPIs and monthly evolution for the whole store. + +* **Sales (€)** — sum of ``price_total`` over orders in the period. +* **Orders** — count of distinct ``order_id``. +* **Average ticket (€)** — ``Sales / Orders``. +* **Gross margin (€)** — sum of ``margin``. +* A line chart with monthly sales evolution. + +POS Members +=========== + +Detailed comparison between cooperative members and non-members. For +each group the dashboard shows: + +* Sales (€), Orders, Average ticket (€), UPT, Distinct buyers, and + (members only) Frequency. +* Monthly evolution chart with one line per group. +* TOP 50 buying members (ranked by sales), with sales, orders, units, + average ticket and UPT. + +POS Categories +============== + +Members contribution KPIs and the top product breakdowns. + +* **Members sales (€)** — sales from orders where the customer was a + cooperative member at the order date. +* **Purchase share** — ``members sales / total sales``. +* **Members penetration** — ``distinct members buyers / distinct total + buyers`` (see "Metric definitions" below for the caveat). +* TOP 10 product families (root categories) with sales, orders, share %. +* TOP 10 product subfamilies (parent categories) with the same columns. +* TOP 10 products with sales, units, share %. + +POS Sales by Time +================= + +* Line chart of sales by ISO day of the week (1 = Monday, 7 = Sunday). +* Line chart of sales by hour of the day (0..23). + +Global filters +============== + +Every dashboard ships a ``Period`` date filter. Members, Categories +and Sales by Time also ship ``Product Category``, ``Product`` and +(Members only) ``Member`` relation filters. Each filter is wired to +every pivot and chart on the dashboard, so changing one selection +updates the whole view. + +* **Period** — year picker plus a month dropdown + (January..December). Pick a year only to look at the full year + (e.g. *2026*, *2025*), or add a month to narrow the range (e.g. + *March 2026*). Defaults to the current month. +* **Product Category** — relation picker over ``product.category``. + Choose one or more categories to restrict every metric to products + of those categories. Empty = no restriction. +* **Product** — relation picker over ``product.product``. Useful to + audit a specific reference. +* **Member** — relation picker over ``res.partner``. Available only + on the Members dashboard; restricts the comparison and the TOP 50 + to the selected partners. + +Note: the o-spreadsheet date filter in Odoo 16 only accepts a single +``rangeType`` per filter (year, quarter or month). We chose ``month`` +because it is the finest granularity the customer requested; for +year-only views, just pick a year and leave the month dropdown +unset. Rolling ranges (*Last 30 / 90 / 180 days*) and quarter +selection (*Q1..Q4*) are not available on the spreadsheet filters; +both are handled in ``pos_dashboard_cooperative`` through the +standard search view on *Point of Sale → Reporting → Cooperative +Dashboards*, which exposes the usual Odoo date filters. + +Metric definitions +================== + +The BI brief from the customer left several KPIs without a precise +formulation. The dashboards use the following standard retail +definitions; revise them in the JSON if your cooperative prefers a +different convention. + +* **UPT** (Units per Ticket) = ``total units sold / number of + orders``. ``product_qty`` summed and divided by distinct + ``order_id``. +* **Frequency** = ``number of orders / number of distinct buyers``. + Measures how many tickets the average member buyer made in the + period. +* **Average ticket (€)** = ``total sales / number of orders``. POS has + no separate "average ticket value", so this metric matches the + "Ticket medio" and "Valor medio del ticket" rows in the BI brief. +* **Purchase share %** = ``members sales / total sales``. Share of + total revenue contributed by member-driven orders. +* **Members penetration %** = ``distinct member buyers / distinct + total buyers`` *in the selected period*. Note: a stricter definition + would be ``distinct member buyers / total members in the + cooperative`` (regardless of whether they bought). That denominator + is not exposed by ``report.pos.order``; a future iteration may add a + separate KPI sourced from ``share.line``. +* **Sales concentration** (not yet rendered) would be the share of + sales captured by the top X% of buying members, typically X = 20. + Easy to add later from the same ``Top buyers`` pivot. + +Iterating on the layouts +======================== + +Each dashboard is a ``data/files/*.json`` file shipped as a base64 +binary on a ``spreadsheet.dashboard`` record. They are intentionally +small and hand-authored to be diff-friendly. + +To redesign one of them visually: + +1. Install ``spreadsheet_oca`` (from OCA's ``spreadsheet`` repository) + on top of this module. It provides full o-spreadsheet editing in + the backend, including saving back to ``spreadsheet.dashboard``. +2. Open the dashboard in *Dashboards → Cooperative*. +3. Edit pivots, charts, styles and global filters from the + o-spreadsheet UI. The data sources are pre-wired against + ``report.pos.order`` and consume the dimensions exposed by + ``pos_dashboard_cooperative``: + + * ``is_member_at_date`` (boolean) — cooperative member flag at the + order date. + * ``categ_root_id`` / ``categ_parent_id`` — product family / + subfamily. + * ``hour_of_day`` / ``day_of_week`` — time distributions. + +4. Export the workbook to JSON. +5. Replace the matching ``data/files/.json`` and reinstall (or + upgrade) the module. + +Reference: the same workflow is used by Odoo core's +``spreadsheet_dashboard_sale``, ``spreadsheet_dashboard_purchase`` and +similar modules.