diff --git a/salesperson_pos/__init__.py b/salesperson_pos/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/salesperson_pos/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/salesperson_pos/__manifest__.py b/salesperson_pos/__manifest__.py new file mode 100644 index 00000000000..d14604590f8 --- /dev/null +++ b/salesperson_pos/__manifest__.py @@ -0,0 +1,14 @@ +{ + "name": "SalesPerson Choosing Button In Pos", + "version": "1.0", + "depends": ["point_of_sale", "hr"], + "data": ["views/pos_order_views.xml"], + "appication": True, + "installable": True, + "assets": { + "point_of_sale._assets_pos": [ + "salesperson_pos/static/src/**/*", + ], + }, + "license": "LGPL-3", +} diff --git a/salesperson_pos/models/__init__.py b/salesperson_pos/models/__init__.py new file mode 100644 index 00000000000..e9ab911ddcc --- /dev/null +++ b/salesperson_pos/models/__init__.py @@ -0,0 +1 @@ +from . import pos_order diff --git a/salesperson_pos/models/pos_order.py b/salesperson_pos/models/pos_order.py new file mode 100644 index 00000000000..321aede0eee --- /dev/null +++ b/salesperson_pos/models/pos_order.py @@ -0,0 +1,7 @@ +from odoo import fields, models + + +class PosOrder(models.Model): + _inherit = "pos.order" + + salesperson_id = fields.Many2one("hr.employee", string="Salesperson", readonly=True) diff --git a/salesperson_pos/static/src/control_buttons/control_buttons.js b/salesperson_pos/static/src/control_buttons/control_buttons.js new file mode 100644 index 00000000000..eac76f3226a --- /dev/null +++ b/salesperson_pos/static/src/control_buttons/control_buttons.js @@ -0,0 +1,13 @@ +import { patch } from "@web/core/utils/patch"; +import { ControlButtons } from "@point_of_sale/app/screens/product_screen/control_buttons/control_buttons"; +import { SelectSalesPersonButton } from "../salesperson_button/salesperson_button"; + +patch(ControlButtons, { + setup() { + super.setup(); + }, + components: { + ...ControlButtons.components, + SelectSalesPersonButton, + }, +}); diff --git a/salesperson_pos/static/src/control_buttons/control_buttons.xml b/salesperson_pos/static/src/control_buttons/control_buttons.xml new file mode 100644 index 00000000000..03626bfdb9e --- /dev/null +++ b/salesperson_pos/static/src/control_buttons/control_buttons.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/salesperson_pos/static/src/pos_order/pos_order.js b/salesperson_pos/static/src/pos_order/pos_order.js new file mode 100644 index 00000000000..aa703ad5063 --- /dev/null +++ b/salesperson_pos/static/src/pos_order/pos_order.js @@ -0,0 +1,11 @@ +import { patch } from "@web/core/utils/patch"; +import { PosOrder } from "@point_of_sale/app/models/pos_order"; +patch(PosOrder.prototype, { + set_salesperson(salespersonID) { + try { + this.update({ salesperson_id: salespersonID }); + } catch (error) { + console.log("error", error); + } + }, +}); diff --git a/salesperson_pos/static/src/salesperson_button/salesperson_button.js b/salesperson_pos/static/src/salesperson_button/salesperson_button.js new file mode 100644 index 00000000000..5feb82522ba --- /dev/null +++ b/salesperson_pos/static/src/salesperson_button/salesperson_button.js @@ -0,0 +1,55 @@ +import { Component, useState } from "@odoo/owl"; +import { useService } from "@web/core/utils/hooks"; +import { usePos } from "@point_of_sale/app/store/pos_hook"; +import { AlertDialog } from "@web/core/confirmation_dialog/confirmation_dialog"; +import { SalespersonListPopup } from "../salesperson_dialog/salesperson_dialog"; + +export class SelectSalesPersonButton extends Component { + static template = "salesperson_pos.SelectSalesPersonButton"; + static components = { SalespersonListPopup }; + static props = {}; + setup() { + this.pos = usePos(); + this.dialog = useService("dialog"); + this.orm = useService("orm"); + this.state = useState({ + selectedSalesperson: null, + }); + } + + async SelectSalesPerson() { + const currentOrder = this.pos.get_order(); + + if (!currentOrder) { + return false; + } + + try { + const salespersonList = await this.orm.searchRead( + "hr.employee", + [], + ["id", "name", "work_email"] + ); + + if (salespersonList.length === 0) { + this.dialog.add(AlertDialog, { + title: "No Salesperson", + body: "No salesperson found in the system.", + }); + return; + } + this.dialog.add(SalespersonListPopup, { + title: "Select Salesperson", + salespersonList, + confirm: (salesperson) => { + this.state.selectedSalesperson = salesperson; + if (salesperson) { + currentOrder.set_salesperson(salesperson?.id); + } + }, + }); + } catch (error) { + console.log(error); + } + } +} diff --git a/salesperson_pos/static/src/salesperson_button/salesperson_button.xml b/salesperson_pos/static/src/salesperson_button/salesperson_button.xml new file mode 100644 index 00000000000..ef4103e034d --- /dev/null +++ b/salesperson_pos/static/src/salesperson_button/salesperson_button.xml @@ -0,0 +1,15 @@ + + + + + + diff --git a/salesperson_pos/static/src/salesperson_dialog/saleperson_dialog.xml b/salesperson_pos/static/src/salesperson_dialog/saleperson_dialog.xml new file mode 100644 index 00000000000..815a50e50fa --- /dev/null +++ b/salesperson_pos/static/src/salesperson_dialog/saleperson_dialog.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + +
NameEmail
+ + + +
+ + +
+ +
+
+
+
+
diff --git a/salesperson_pos/static/src/salesperson_dialog/salesperson_dialog.js b/salesperson_pos/static/src/salesperson_dialog/salesperson_dialog.js new file mode 100644 index 00000000000..082e7b91866 --- /dev/null +++ b/salesperson_pos/static/src/salesperson_dialog/salesperson_dialog.js @@ -0,0 +1,26 @@ +import { Component, useState } from "@odoo/owl"; +import { Dialog } from "@web/core/dialog/dialog"; +export class SalespersonListPopup extends Component { + static template = "salesperson_pos.SalespersonListPopup"; + static props = { + title: String, + salespersonList: Array, + confirm: Function, + close: Function, + }; + + static components = { Dialog }; + setup() { + this.selectSalesperson = this.selectSalesperson.bind(this); + } + + selectSalesperson(salesperson) { + this.props.confirm(salesperson); + this.props.close(); + } + + cancelSelection() { + this.props.confirm(null); + this.props.close(); + } +} diff --git a/salesperson_pos/views/pos_order_views.xml b/salesperson_pos/views/pos_order_views.xml new file mode 100644 index 00000000000..9f2c2f790f7 --- /dev/null +++ b/salesperson_pos/views/pos_order_views.xml @@ -0,0 +1,24 @@ + + + + pos.order.list.inherit + pos.order + + + + + + + + + + pos.order.form.inherit + pos.order + + + + + + + +