From a03981a671cee215b931b0c69b1f1bd91ea9c096 Mon Sep 17 00:00:00 2001 From: kdes-odoo Date: Mon, 28 Jul 2025 12:51:23 +0530 Subject: [PATCH] [ADD] point_of_sale: added salesperson field Introduced the functionality to assign a salesperson to a Point of Sale order. Added new dialog menu, populated with employees from hr.employee, has been added to the main POS interface. A (Many2one) field was added to the model to store the selected employee. The POS Order form and list views in the backend have been updated to display the salesperson's name. Employee data is now loaded into the POS session to make it available in the UI. task-4968717 --- pos_salesperson/__init__.py | 1 + pos_salesperson/__manifest__.py | 21 ++++++++++ pos_salesperson/models/__init__.py | 2 + pos_salesperson/models/pos_order.py | 11 +++++ pos_salesperson/models/pos_session.py | 12 ++++++ .../salesperson_button/salesperson_button.js | 30 +++++++++++++ .../salesperson_button/salesperson_button.xml | 12 ++++++ .../src/salesperson_list/salesperson_list.js | 42 +++++++++++++++++++ .../src/salesperson_list/salesperson_list.xml | 33 +++++++++++++++ pos_salesperson/views/pos_view.xml | 24 +++++++++++ 10 files changed, 188 insertions(+) create mode 100644 pos_salesperson/__init__.py create mode 100644 pos_salesperson/__manifest__.py create mode 100644 pos_salesperson/models/__init__.py create mode 100644 pos_salesperson/models/pos_order.py create mode 100644 pos_salesperson/models/pos_session.py create mode 100644 pos_salesperson/static/src/salesperson_button/salesperson_button.js create mode 100644 pos_salesperson/static/src/salesperson_button/salesperson_button.xml create mode 100644 pos_salesperson/static/src/salesperson_list/salesperson_list.js create mode 100644 pos_salesperson/static/src/salesperson_list/salesperson_list.xml create mode 100644 pos_salesperson/views/pos_view.xml diff --git a/pos_salesperson/__init__.py b/pos_salesperson/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/pos_salesperson/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/pos_salesperson/__manifest__.py b/pos_salesperson/__manifest__.py new file mode 100644 index 00000000000..64477638a99 --- /dev/null +++ b/pos_salesperson/__manifest__.py @@ -0,0 +1,21 @@ +{ + 'name': "POS salesperson", + 'version': '1.0', + 'license': 'LGPL-3', + 'depends': ['pos_hr'], + 'author': "Kalpan Desai", + 'category': 'Sales/Point of Sale', + 'description': """ + Salesperson in POS + """, + 'installable': True, + 'application': True, + 'data': [ + 'views/pos_view.xml', + ], + 'assets': { + 'point_of_sale._assets_pos': [ + 'pos_salesperson/static/src/**/*' + ] + }, +} diff --git a/pos_salesperson/models/__init__.py b/pos_salesperson/models/__init__.py new file mode 100644 index 00000000000..b2f4b5e054e --- /dev/null +++ b/pos_salesperson/models/__init__.py @@ -0,0 +1,2 @@ +from . import pos_order +from . import pos_session diff --git a/pos_salesperson/models/pos_order.py b/pos_salesperson/models/pos_order.py new file mode 100644 index 00000000000..00e2e010e38 --- /dev/null +++ b/pos_salesperson/models/pos_order.py @@ -0,0 +1,11 @@ +from odoo import fields, models + + +class PosOrder(models.Model): + _inherit = 'pos.order' + + salesperson_id = fields.Many2one( + 'hr.employee', + string='Salesperson', + help='The salesperson responsible for this order.' + ) diff --git a/pos_salesperson/models/pos_session.py b/pos_salesperson/models/pos_session.py new file mode 100644 index 00000000000..422da9185c5 --- /dev/null +++ b/pos_salesperson/models/pos_session.py @@ -0,0 +1,12 @@ +from odoo import api, models + + +class PosSession(models.Model): + """Inherit the pos.session to load the data of hr.employee model""" + _inherit = 'pos.session' + + @api.model + def _load_pos_data_models(self, config_id): + data = super()._load_pos_data_models(config_id) + data += ['hr.employee'] + return data diff --git a/pos_salesperson/static/src/salesperson_button/salesperson_button.js b/pos_salesperson/static/src/salesperson_button/salesperson_button.js new file mode 100644 index 00000000000..12e6a85fa62 --- /dev/null +++ b/pos_salesperson/static/src/salesperson_button/salesperson_button.js @@ -0,0 +1,30 @@ +import { SalespersonList } from '../salesperson_list/salesperson_list'; +import { ControlButtons } from '@point_of_sale/app/screens/product_screen/control_buttons/control_buttons'; +import { makeAwaitable } from "@point_of_sale/app/store/make_awaitable_dialog"; +import { patch } from '@web/core/utils/patch'; +import { useState } from '@odoo/owl'; + +patch(ControlButtons.prototype, { + setup(){ + super.setup(); + this.state = useState({ + salesperson_id: null, + }); + }, + async selectSalesperson() { + const currentOrder = this.pos.get_order(); + if (!currentOrder) { + return; + } + + const currentSalesperson = currentOrder.salesperson_id || null; + const payload = await makeAwaitable(this.dialog, SalespersonList, { + salesperson: currentSalesperson, + getPayload: (newSalesperson) => newSalesperson || null, + }); + this.state.salesperson_id = payload || null; + currentOrder.salesperson_id = payload || null; + return currentOrder.salesperson_id; + + } +}) diff --git a/pos_salesperson/static/src/salesperson_button/salesperson_button.xml b/pos_salesperson/static/src/salesperson_button/salesperson_button.xml new file mode 100644 index 00000000000..590484814c1 --- /dev/null +++ b/pos_salesperson/static/src/salesperson_button/salesperson_button.xml @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git a/pos_salesperson/static/src/salesperson_list/salesperson_list.js b/pos_salesperson/static/src/salesperson_list/salesperson_list.js new file mode 100644 index 00000000000..26d36d80374 --- /dev/null +++ b/pos_salesperson/static/src/salesperson_list/salesperson_list.js @@ -0,0 +1,42 @@ +import { _t } from "@web/core/l10n/translation"; +import { useService } from "@web/core/utils/hooks"; +import { Dialog } from "@web/core/dialog/dialog"; +import { usePos } from "@point_of_sale/app/store/pos_hook"; +import { Component, useState } from "@odoo/owl"; +import { useHotkey } from "@web/core/hotkeys/hotkey_hook"; + + +export class SalespersonList extends Component { + static template = "POS_Salesperson.SalespersonList"; + static components = { Dialog }; + static props = { + salesperson: { + optional: true, + type: [{ value: null }, Object], + }, + getPayload : { type: Function }, + close : { type: Function } + } + + setup() { + this.pos = usePos(); + this.ui = useState(useService("ui")); + this.dialog = useService("dialog"); + + this.state = useState({ + query: null, + previousQuery: "", + currentOffset: 0, + }); + useHotkey("enter", () => this.onEnter()); + } + getSalesPerson(){ + const salesperson = this.pos.models['hr.employee'].getAll(); + return salesperson; + } + + clickSalesPerson(salesperson) { + this.props.getPayload(salesperson); + this.props.close(); + } +} diff --git a/pos_salesperson/static/src/salesperson_list/salesperson_list.xml b/pos_salesperson/static/src/salesperson_list/salesperson_list.xml new file mode 100644 index 00000000000..8b81271a805 --- /dev/null +++ b/pos_salesperson/static/src/salesperson_list/salesperson_list.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + +
Name
+
+ + +
+ +
+
+
+
+
diff --git a/pos_salesperson/views/pos_view.xml b/pos_salesperson/views/pos_view.xml new file mode 100644 index 00000000000..2a461bfaff3 --- /dev/null +++ b/pos_salesperson/views/pos_view.xml @@ -0,0 +1,24 @@ + + + + pos.order.form.inherit + pos.order + + + + + + + + + + pos.order.list.inherit + pos.order + + + + + + + +