diff options
| author | Joseph Caburnay <jcb@odoo.com> | 2020-08-10 14:32:59 +0000 |
|---|---|---|
| committer | Pierre Masereel <pim@odoo.com> | 2021-02-10 10:27:09 +0000 |
| commit | 84d668ed3a1ba8ba4f61302dea011c596a07f493 (patch) | |
| tree | 6936333078d2f3a7ad051452d094dfbcae2dadf0 /addons | |
| parent | d583de02392b7738e7eead4ef33f91ef8a47b0f6 (diff) | |
[FIX] pos_hr: set the right employee for the order
closes odoo/odoo#65865
Signed-off-by: pimodoo <pimodoo@users.noreply.github.com>
Diffstat (limited to 'addons')
| -rw-r--r-- | addons/point_of_sale/static/src/js/models.js | 1 | ||||
| -rw-r--r-- | addons/pos_hr/models/pos_order.py | 7 | ||||
| -rw-r--r-- | addons/pos_hr/static/src/js/models.js | 54 | ||||
| -rw-r--r-- | addons/pos_hr/static/tests/tours/PosHrTour.js | 30 |
4 files changed, 83 insertions, 9 deletions
diff --git a/addons/point_of_sale/static/src/js/models.js b/addons/point_of_sale/static/src/js/models.js index 2fa17771b70..1b261131b21 100644 --- a/addons/point_of_sale/static/src/js/models.js +++ b/addons/point_of_sale/static/src/js/models.js @@ -2734,7 +2734,6 @@ exports.Order = Backbone.Model.extend({ pricelist_id: this.pricelist ? this.pricelist.id : false, partner_id: this.get_client() ? this.get_client().id : false, user_id: this.pos.user.id, - employee_id: this.pos.get_cashier().id, uid: this.uid, sequence_number: this.sequence_number, creation_date: this.validation_date || this.creation_date, // todo: rename creation_date in master diff --git a/addons/pos_hr/models/pos_order.py b/addons/pos_hr/models/pos_order.py index cecbbb24a63..f11c6c2e2d2 100644 --- a/addons/pos_hr/models/pos_order.py +++ b/addons/pos_hr/models/pos_order.py @@ -21,3 +21,10 @@ class PosOrder(models.Model): order.cashier = order.employee_id.name else: order.cashier = order.user_id.name + + def _export_for_ui(self, order): + result = super(PosOrder, self)._export_for_ui(order) + result.update({ + 'employee_id': order.employee_id.id, + }) + return result diff --git a/addons/pos_hr/static/src/js/models.js b/addons/pos_hr/static/src/js/models.js index 549ace40902..52ada147840 100644 --- a/addons/pos_hr/static/src/js/models.js +++ b/addons/pos_hr/static/src/js/models.js @@ -6,17 +6,23 @@ var models = require('point_of_sale.models'); models.load_models([{ model: 'hr.employee', fields: ['name', 'id', 'user_id'], - domain: function(self){ return [['company_id', '=', self.config.company_id[0]]]; }, + domain: function(self){ + return self.config.employee_ids.length > 0 + ? [ + '&', + ['company_id', '=', self.config.company_id[0]], + '|', + ['user_id', '=', self.user.id], + ['id', 'in', self.config.employee_ids], + ] + : [['company_id', '=', self.config.company_id[0]]]; + }, loaded: function(self, employees) { if (self.config.module_pos_hr) { - if (self.config.employee_ids.length > 0) { - self.employees = employees.filter(function(employee) { - return self.config.employee_ids.includes(employee.id) || employee.user_id[0] === self.user.id; - }); - } else { - self.employees = employees; - } + self.employees = employees; + self.employee_by_id = {}; self.employees.forEach(function(employee) { + self.employee_by_id[employee.id] = employee; var hasUser = self.users.some(function(user) { if (user.id === employee.user_id[0]) { employee.role = user.role; @@ -54,6 +60,38 @@ models.PosModel = models.PosModel.extend({ }); }); }, + set_cashier: function(employee) { + posmodel_super.set_cashier.apply(this, arguments); + const selectedOrder = this.get_order(); + if (selectedOrder && !selectedOrder.get_orderlines().length) { + // Order without lines can be considered to be un-owned by any employee. + // We set the employee on that order to the currently set employee. + selectedOrder.employee = employee; + } + } +}); + +var super_order_model = models.Order.prototype; +models.Order = models.Order.extend({ + initialize: function (attributes, options) { + super_order_model.initialize.apply(this, arguments); + if (!options.json) { + this.employee = this.pos.get_cashier(); + } + }, + init_from_JSON: function (json) { + super_order_model.init_from_JSON.apply(this, arguments); + if (this.pos.config.module_pos_hr) { + this.employee = this.pos.employee_by_id[json.employee_id]; + } + }, + export_as_JSON: function () { + const json = super_order_model.export_as_JSON.apply(this, arguments); + if (this.pos.config.module_pos_hr) { + json.employee_id = this.employee.id; + } + return json; + }, }); }); diff --git a/addons/pos_hr/static/tests/tours/PosHrTour.js b/addons/pos_hr/static/tests/tours/PosHrTour.js index ca96f846df1..99f5057a0d6 100644 --- a/addons/pos_hr/static/tests/tours/PosHrTour.js +++ b/addons/pos_hr/static/tests/tours/PosHrTour.js @@ -3,6 +3,8 @@ odoo.define('point_of_sale.tour.PosHr', function (require) { const { PosHr } = require('pos_hr.tour.PosHrTourMethods'); const { ProductScreen } = require('point_of_sale.tour.ProductScreenTourMethods'); + const { TicketScreen } = require('point_of_sale.tour.TicketScreenTourMethods'); + const { Chrome } = require('point_of_sale.tour.ChromeTourMethods'); const { ErrorPopup } = require('point_of_sale.tour.ErrorPopupTourMethods'); const { NumberPopup } = require('point_of_sale.tour.NumberPopupTourMethods'); const { SelectionPopup } = require('point_of_sale.tour.SelectionPopupTourMethods'); @@ -48,6 +50,34 @@ odoo.define('point_of_sale.tour.PosHr', function (require) { NumberPopup.check.inputShownIs('••••'); NumberPopup.do.clickConfirm(); ProductScreen.check.isShown(); + ProductScreen.do.clickHomeCategory(); + + // Create orders and check if the ticket list has the right employee for each order + // order for employee 2 + ProductScreen.exec.addOrderline('Desk Pad', '1', '2'); + ProductScreen.check.totalAmountIs('2.0') + Chrome.do.clickTicketButton(); + TicketScreen.check.nthRowContains(2, 'Pos Employee2'); + + // order for employee 1 + PosHr.do.clickLockButton(); + PosHr.exec.login('Pos Employee1', '2580'); + TicketScreen.do.clickNewTicket(); + ProductScreen.exec.addOrderline('Desk Pad', '1', '4'); + ProductScreen.check.totalAmountIs('4.0') + Chrome.do.clickTicketButton(); + TicketScreen.check.nthRowContains(2, 'Pos Employee2'); + TicketScreen.check.nthRowContains(3, 'Pos Employee1'); + + // order for admin + PosHr.do.clickCashierName(); + SelectionPopup.do.clickItem('Mitchell Admin'); + PosHr.check.cashierNameIs('Mitchell Admin'); + TicketScreen.do.clickNewTicket(); + ProductScreen.exec.addOrderline('Desk Pad', '1', '8'); + ProductScreen.check.totalAmountIs('8.0') + Chrome.do.clickTicketButton(); + TicketScreen.check.nthRowContains(4, 'Mitchell Admin'); Tour.register('PosHrTour', { test: true, url: '/pos/ui' }, getSteps()); }); |
