From 47ff920f5752863996edfd931ec0ef0cb403c43b Mon Sep 17 00:00:00 2001 From: roen-odoo Date: Mon, 4 Dec 2023 11:46:02 +0000 Subject: [PATCH] [FIX] pos_sale: fix warehouse group by in sales report Current behavior: When grouping by warehouse in the sales report, the pos orders appeared under the "None" warehouse group. Steps to reproduce: - Create a PoS order - Validate the PoS order, and close the session - Go to sale reporting, group by warehouse - A group "None" appears, with the PoS order inside opw-3540797 closes odoo/odoo#147100 X-original-commit: 132dd31e7e7a941ad375ada0be35dde05d0b3a43 Signed-off-by: Joseph Caburnay (jcb) Signed-off-by: Robin Engels (roen) --- addons/pos_sale/report/sale_report.py | 16 ++++++++++++++-- addons/pos_sale/tests/test_pos_sale_report.py | 15 +++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/addons/pos_sale/report/sale_report.py b/addons/pos_sale/report/sale_report.py index 19d4610ab6b..b5007ba0f7b 100644 --- a/addons/pos_sale/report/sale_report.py +++ b/addons/pos_sale/report/sale_report.py @@ -86,13 +86,23 @@ class SaleReport(models.Model): select_ += template % (value, fname) return select_ + def _available_additional_pos_fields(self): + """Hook to replace the additional fields from sale with the one from pos_sale.""" + return { + 'warehouse_id': 'picking.warehouse_id', + } + def _fill_pos_fields(self, additional_fields): """Hook to fill additional fields for the pos_sale. :param values: dictionary of values to fill :type values: dict """ - return {x: 'NULL' for x in additional_fields} + filled_fields = {x: 'NULL' for x in additional_fields} + for fname, value in self._available_additional_pos_fields().items(): + if fname in additional_fields: + filled_fields[fname] = value + return filled_fields def _from_pos(self): return """ @@ -104,6 +114,7 @@ class SaleReport(models.Model): LEFT JOIN uom_uom u ON u.id=t.uom_id LEFT JOIN pos_session session ON session.id = pos.session_id LEFT JOIN pos_config config ON config.id = session.config_id + LEFT JOIN stock_picking_type picking ON picking.id = config.picking_type_id JOIN {currency_table} ON currency_table.company_id = pos.company_id """.format( currency_table=self.env['res.currency']._get_query_currency_table(self.env.companies.ids, fields.Date.today()) @@ -138,7 +149,8 @@ class SaleReport(models.Model): partner.zip, u.factor, pos.crm_team_id, - currency_table.rate""" + currency_table.rate, + picking.warehouse_id""" def _query(self): res = super()._query() diff --git a/addons/pos_sale/tests/test_pos_sale_report.py b/addons/pos_sale/tests/test_pos_sale_report.py index 17f9a1d0686..4972906fdcb 100644 --- a/addons/pos_sale/tests/test_pos_sale_report.py +++ b/addons/pos_sale/tests/test_pos_sale_report.py @@ -100,3 +100,18 @@ class TestPoSSaleReport(TestPoSCommon): move_id = self.env['account.move'].browse(order_ids[0]['account_move']) self.assertEqual(move_id.partner_id.id, self.customer.id) self.assertEqual(move_id.partner_shipping_id.id, self.other_customer.id) + + def test_warehouse(self): + + self.open_new_session() + session = self.pos_session + orders = [] + + # Process two orders + orders.append(self.create_ui_order_data([(self.product0, 3)])) + self.env['pos.order'].create_from_ui(orders) + + session.action_pos_session_closing_control() + + reports = self.env['sale.report'].sudo().search([('product_id', '=', self.product0.id)], order='id', limit=2) + self.assertEqual(reports[0].warehouse_id.id, self.config.picking_type_id.warehouse_id.id)