Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 85 additions & 0 deletions sale_report_product_tag/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
=======================
Sale Report Product Tag
=======================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:b07a67ca959b690b0b7c9bac4086736052c675e84763dca8da8be0ef70d97670
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsale--reporting-lightgray.png?logo=github
:target: https://github.com/OCA/sale-reporting/tree/18.0/sale_report_product_tag
:alt: OCA/sale-reporting
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/sale-reporting-18-0/sale-reporting-18-0-sale_report_product_tag
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/sale-reporting&target_branch=18.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

This module extends the **Sales Analysis** report (``sale.report``) to
allow grouping and filtering by **Product Tag**.

**Table of contents**

.. contents::
:local:

Known issues / Roadmap
======================

Since product tags are a Many2many field, we had to choose to take the
first tag in the products. This avoids any double-counting of sales
figures that would occur with a direct Many2many field. This can be
improved if we want real figures for every tag in the products

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/sale-reporting/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/sale-reporting/issues/new?body=module:%20sale_report_product_tag%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

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

Credits
=======

Authors
-------

* INVITU

Contributors
------------

- Cyril VINH-TUNG <cyril@invitu.com>

Maintainers
-----------

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

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

This module is part of the `OCA/sale-reporting <https://github.com/OCA/sale-reporting/tree/18.0/sale_report_product_tag>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
4 changes: 4 additions & 0 deletions sale_report_product_tag/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Copyright 2026 INVITU (<https://www.invitu.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from . import report
16 changes: 16 additions & 0 deletions sale_report_product_tag/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Copyright 2026 INVITU (<https://www.invitu.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
{
"name": "Sale Report Product Tag",
"version": "18.0.1.0.0",
"author": "INVITU, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/sale-reporting",
"category": "Sales",
"license": "AGPL-3",
"depends": ["sale"],
"data": [
"report/sale_report_views.xml",
],
"installable": True,
"auto_install": False,
}
3 changes: 3 additions & 0 deletions sale_report_product_tag/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"
1 change: 1 addition & 0 deletions sale_report_product_tag/readme/CONTRIBUTORS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Cyril VINH-TUNG \<<cyril@invitu.com>\>
2 changes: 2 additions & 0 deletions sale_report_product_tag/readme/DESCRIPTION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
This module extends the **Sales Analysis** report (`sale.report`) to allow
grouping and filtering by **Product Tag**.
5 changes: 5 additions & 0 deletions sale_report_product_tag/readme/ROADMAP.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Since product tags are a Many2many field, we had to choose to take the first tag
in the products.
This avoids any double-counting of sales figures that would occur with a direct
Many2many field.
This can be improved if we want real figures for every tag in the products
4 changes: 4 additions & 0 deletions sale_report_product_tag/report/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Copyright 2026 INVITU (<https://www.invitu.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from . import sale_report
43 changes: 43 additions & 0 deletions sale_report_product_tag/report/sale_report.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Copyright 2026 INVITU (<https://www.invitu.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from odoo import fields, models


class SaleReport(models.Model):
_inherit = "sale.report"

product_tag_id = fields.Many2one("product.tag", string="Product Tag", readonly=True)

def _with_sale(self):
with_ = super()._with_sale()
res = (
(with_ + "," if with_ else "")
+ """
first_product_tag AS (
SELECT
pt.id AS product_template_id,
(array_agg(ptg.id))[1] AS id
FROM product_template pt
LEFT JOIN product_tag_product_template_rel ptgpt ON
(pt.id = ptgpt.product_template_id)
LEFT JOIN product_tag ptg ON (ptgpt.product_tag_id = ptg.id)
GROUP BY pt.id
)"""
)
return res

def _select_additional_fields(self):
res = super()._select_additional_fields()
res["product_tag_id"] = "fpt.id"
return res

def _from_sale(self):
res = super()._from_sale()
res += "LEFT JOIN first_product_tag fpt ON (t.id = fpt.product_template_id)"
return res

def _group_by_sale(self):
res = super()._group_by_sale()
res += ",fpt.id"
return res
21 changes: 21 additions & 0 deletions sale_report_product_tag/report/sale_report_views.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="view_order_product_search" model="ir.ui.view">
<field name="name">sale.report.search</field>
<field name="model">sale.report</field>
<field name="inherit_id" ref="sale.view_order_product_search" />
<field name="priority" eval="8" />
<field name="arch" type="xml">
<field name="categ_id" position="after">
<field name="product_tag_id" />
</field>
<filter name="Category" position="after">
<filter
string="Product Tag"
name="product_tag_id"
context="{'group_by':'product_tag_id'}"
/>
</filter>
</field>
</record>
</odoo>
Loading
Loading