diff --git a/models/__pycache__/res_partner.cpython-312.pyc b/models/__pycache__/res_partner.cpython-312.pyc index d55d443..e4559c2 100644 Binary files a/models/__pycache__/res_partner.cpython-312.pyc and b/models/__pycache__/res_partner.cpython-312.pyc differ diff --git a/models/res_partner.py b/models/res_partner.py index 331ebae..748ae32 100644 --- a/models/res_partner.py +++ b/models/res_partner.py @@ -25,3 +25,22 @@ class ResPartner(models.Model): 'price_subtotal_incl': line.price_subtotal_incl, } for line in order.lines], } for order in orders] + + @api.model + def get_pos_top_products(self, partner_id): + # SQL query to get top 3 products by quantity for a specific partner + query = """ + SELECT + pt.name ->> 'en_US' as product_name, + SUM(pol.qty) as total_qty + FROM pos_order_line pol + JOIN pos_order po ON pol.order_id = po.id + JOIN product_product pp ON pol.product_id = pp.id + JOIN product_template pt ON pp.product_tmpl_id = pt.id + WHERE po.partner_id = %s + GROUP BY pt.name + ORDER BY total_qty DESC + LIMIT 3 + """ + self.env.cr.execute(query, (partner_id,)) + return self.env.cr.dictfetchall() diff --git a/static/src/js/partner_editor.js b/static/src/js/partner_editor.js index 4b8fffb..0d602ca 100644 --- a/static/src/js/partner_editor.js +++ b/static/src/js/partner_editor.js @@ -9,21 +9,25 @@ patch(PartnerDetailsEdit.prototype, { setup() { super.setup(); this.orm = useService("orm"); - this.state = useState({ ...this.state, lastOrders: [] }); + this.state = useState({ ...this.state, lastOrders: [], topProducts: [] }); onWillStart(async () => { - await this.fetchLastOrders(); + await this.fetchData(); }); }, - async fetchLastOrders() { + async fetchData() { const partnerId = this.props.partner.id; if (partnerId) { try { - const orders = await this.orm.call("res.partner", "get_pos_last_orders", [partnerId]); + const [orders, topProducts] = await Promise.all([ + this.orm.call("res.partner", "get_pos_last_orders", [partnerId]), + this.orm.call("res.partner", "get_pos_top_products", [partnerId]) + ]); this.state.lastOrders = orders; + this.state.topProducts = topProducts; } catch (error) { - console.error("Error fetching orders:", error); + console.error("Error fetching data:", error); } } } diff --git a/static/src/xml/partner_editor.xml b/static/src/xml/partner_editor.xml index ffb8527..8ab53e6 100644 --- a/static/src/xml/partner_editor.xml +++ b/static/src/xml/partner_editor.xml @@ -5,6 +5,24 @@
+

Top 3 Products

+ +
+ +
+ + + + Units + +
+
+
+
+ +
No top products found.
+
+

Last Orders