summaryrefslogtreecommitdiff
path: root/addons/pos_hr
diff options
context:
space:
mode:
authorJoseph Caburnay <jcb@odoo.com>2020-08-10 14:32:59 +0000
committerPierre Masereel <pim@odoo.com>2021-02-10 10:27:09 +0000
commit84d668ed3a1ba8ba4f61302dea011c596a07f493 (patch)
tree6936333078d2f3a7ad051452d094dfbcae2dadf0 /addons/pos_hr
parentd583de02392b7738e7eead4ef33f91ef8a47b0f6 (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/pos_hr')
-rw-r--r--addons/pos_hr/models/pos_order.py7
-rw-r--r--addons/pos_hr/static/src/js/models.js54
-rw-r--r--addons/pos_hr/static/tests/tours/PosHrTour.js30
3 files changed, 83 insertions, 8 deletions
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());
});