diff --git a/modules/sale_promotion/CHANGELOG b/modules/sale_promotion/CHANGELOG
index 3439602340..e40c6a881b 100644
--- a/modules/sale_promotion/CHANGELOG
+++ b/modules/sale_promotion/CHANGELOG
@@ -1,3 +1,4 @@
+* Add sale reporting per promotion
* Add relate from promotions to sales
Version 7.2.0 - 2024-04-29
diff --git a/modules/sale_promotion/__init__.py b/modules/sale_promotion/__init__.py
index 345ee7479b..609af8eeca 100644
--- a/modules/sale_promotion/__init__.py
+++ b/modules/sale_promotion/__init__.py
@@ -3,7 +3,7 @@
from trytond.pool import Pool
-from . import sale
+from . import sale, sale_reporting
def register():
@@ -13,4 +13,5 @@ def register():
sale.Promotion_ProductCategory,
sale.Sale,
sale.Line,
+ sale_reporting.Promotion,
module='sale_promotion', type_='model')
diff --git a/modules/sale_promotion/sale_reporting.py b/modules/sale_promotion/sale_reporting.py
new file mode 100644
index 0000000000..eb9f2004ab
--- /dev/null
+++ b/modules/sale_promotion/sale_reporting.py
@@ -0,0 +1,45 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+from sql import Literal
+
+from trytond.model import ModelView, fields
+from trytond.modules.sale.sale_reporting import Abstract
+
+
+class Promotion(Abstract, ModelView):
+ "Sale Reporting per Promotion"
+ __name__ = 'sale.reporting.promotion'
+
+ promotion = fields.Many2One('sale.promotion', "Promotion")
+
+ @classmethod
+ def _sale_line_columns(cls, line, sale):
+ return super()._sale_line_columns(line, sale) + [
+ line.promotion.as_('promotion')]
+
+ @classmethod
+ def _pos_sale_line_columns(cls, line, point, sale, currency):
+ try:
+ columns = super()._pos_sale_line_columns(
+ line, point, sale, currency)
+ except AttributeError:
+ columns = []
+ return columns + [Literal(None).as_('promotion')]
+
+ @classmethod
+ def _columns(cls, tables, withs):
+ line = tables['line']
+ return super()._columns(tables, withs) + [line.promotion]
+
+ @classmethod
+ def _group_by(cls, tables, withs):
+ line = tables['line']
+ return super()._group_by(tables, withs) + [line.promotion]
+
+ def get_rec_name(self, name):
+ return self.promotion.rec_name if self.promotion else None
+
+ @classmethod
+ def search_rec_name(cls, name, clause):
+ return [('promotion.rec_name', *clause[1:])]
diff --git a/modules/sale_promotion/sale_reporting.xml b/modules/sale_promotion/sale_reporting.xml
new file mode 100644
index 0000000000..7d708483b6
--- /dev/null
+++ b/modules/sale_promotion/sale_reporting.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+ sale.reporting.promotion
+
+
+ sale_reporting_promotion_list
+
+
+
+ Sales per Promotion
+ sale.reporting.promotion
+ sale.reporting.context
+
+
+
+
+
+
+
+ tree_open
+
+
+
+
+
+ User in companies
+ sale.reporting.promotion
+
+
+
+
+
+
+
+
+
diff --git a/modules/sale_promotion/setup.py b/modules/sale_promotion/setup.py
index e194ac450b..f6cb871de8 100755
--- a/modules/sale_promotion/setup.py
+++ b/modules/sale_promotion/setup.py
@@ -41,13 +41,16 @@ else:
download_url = 'http://downloads.tryton.org/%s.%s/' % (
major_version, minor_version)
-requires = ['simpleeval']
+requires = ['simpleeval', 'python-sql']
for dep in info.get('depends', []):
if not re.match(r'(ir|res)(\W|$)', dep):
requires.append(get_require_version('trytond_%s' % dep))
requires.append(get_require_version('trytond'))
-tests_require = [get_require_version('proteus')]
+tests_require = [
+ get_require_version('proteus'),
+ get_require_version('trytond_sale_point'),
+ ]
setup(name=name,
version=version,
diff --git a/modules/sale_promotion/tests/test_module.py b/modules/sale_promotion/tests/test_module.py
index 1162df0d31..37357c1ba6 100644
--- a/modules/sale_promotion/tests/test_module.py
+++ b/modules/sale_promotion/tests/test_module.py
@@ -8,6 +8,7 @@ from trytond.tests.test_tryton import ModuleTestCase
class SalePromotionTestCase(CompanyTestMixin, ModuleTestCase):
'Test Sale Promotion module'
module = 'sale_promotion'
+ extras = ['sale_point']
del ModuleTestCase
diff --git a/modules/sale_promotion/tryton.cfg b/modules/sale_promotion/tryton.cfg
index b3fb1bfcd6..3e6d29c9ec 100644
--- a/modules/sale_promotion/tryton.cfg
+++ b/modules/sale_promotion/tryton.cfg
@@ -9,6 +9,9 @@ depends:
res
sale
sale_price_list
+extras_depend:
+ sale_point
xml:
sale.xml
+ sale_reporting.xml
message.xml
diff --git a/modules/sale_promotion/view/sale_reporting_promotion_list.xml b/modules/sale_promotion/view/sale_reporting_promotion_list.xml
new file mode 100644
index 0000000000..98967325be
--- /dev/null
+++ b/modules/sale_promotion/view/sale_reporting_promotion_list.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+