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 + + + + + + + +