diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js
index d7cb354470..fe0b699204 100644
--- a/e2e/helpers/selectors.js
+++ b/e2e/helpers/selectors.js
@@ -386,7 +386,8 @@ export default {
trackingButton: `vn-left-menu a[ui-sref="ticket.card.tracking.index"]`,
createStateButton: `${components.vnFloatButton}`,
stateAutocomplete: 'vn-ticket-tracking-edit vn-autocomplete[field="$ctrl.ticket.stateFk"]',
- saveButton: `${components.vnSubmit}`
+ saveButton: `${components.vnSubmit}`,
+ cancelButton: `vn-ticket-tracking-edit vn-button[ui-sref="ticket.card.tracking.index"]`
},
ticketBasicData: {
basicDataButton: `vn-left-menu a[ui-sref="ticket.card.data.stepOne"]`,
@@ -437,8 +438,8 @@ export default {
saveServiceButton: `${components.vnSubmit}`
},
createStateView: {
- stateAutocomplete: `vn-autocomplete[field="$ctrl.ticket.stateFk"]`,
- clearStateInputButton: `vn-autocomplete[field="$ctrl.ticket.stateFk"] > div > div > div > vn-icon > i`,
+ stateAutocomplete: `vn-autocomplete[field="$ctrl.stateFk"]`,
+ clearStateInputButton: `vn-autocomplete[field="$ctrl.stateFk"] > div > div > div > vn-icon > i`,
saveStateButton: `${components.vnSubmit}`
},
claimsIndex: {
diff --git a/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js b/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js
index 44f3dae51a..8446d84fc9 100644
--- a/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js
+++ b/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js
@@ -25,27 +25,19 @@ describe('Ticket Create new tracking state path', () => {
.click(selectors.createStateView.saveStateButton)
.waitForLastSnackbar();
- expect(result).toEqual('No changes to save');
+ expect(result).toEqual('State cannot be blank');
});
it(`should attempt create a new state then clear and save it`, async() => {
let result = await nightmare
.autocompleteSearch(selectors.createStateView.stateAutocomplete, '¿Fecha?')
.waitToClick(selectors.createStateView.clearStateInputButton)
- .click(selectors.createStateView.saveStateButton)
+ .waitToClick(selectors.createStateView.saveStateButton)
.waitForLastSnackbar();
- expect(result).toEqual('Data saved!');
+ expect(result).toEqual('State cannot be blank');
});
- it('should again access to the create state view by clicking the create floating button', async() => {
- let url = await nightmare
- .click(selectors.ticketTracking.createStateButton)
- .wait(selectors.createStateView.stateAutocomplete)
- .parsedUrl();
-
- expect(url.hash).toContain('tracking/edit');
- });
it(`should create a new state`, async() => {
let result = await nightmare
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index a244b5ae68..de9547daa6 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -18,6 +18,7 @@
"That payment method requires an IBAN": "El método de pago seleccionado requiere un IBAN",
"That payment method requires a BIC": "El método de pago seleccionado requiere un BIC",
"State cannot be blank": "El estado no puede estar en blanco",
+ "Worker cannot be blank": "El trabajador no puede estar en blanco",
"Cannot change the payment method if no salesperson": "No se puede cambiar la forma de pago si no hay comercial asignado",
"can't be blank": "El campo no puede estar vacío",
"Observation type cannot be blank": "El tipo de observación no puede estar en blanco",
diff --git a/modules/ticket/back/methods/ticket-tracking/changeState.js b/modules/ticket/back/methods/ticket-tracking/changeState.js
index 3ec81f2ce3..a701a1fdb3 100644
--- a/modules/ticket/back/methods/ticket-tracking/changeState.js
+++ b/modules/ticket/back/methods/ticket-tracking/changeState.js
@@ -25,18 +25,25 @@ module.exports = Self => {
let models = Self.app.models;
let isProduction;
let isEditable = await Self.app.models.Ticket.isEditable(params.ticketFk);
+ let assignedState = await Self.app.models.State.findOne({where: {code: 'PICKER_DESIGNED'}});
+ let isAssigned = assignedState.id === params.stateFk;
+ let currentUserId;
if (ctx.req.accessToken) {
let token = ctx.req.accessToken;
- let currentUserId = token && token.userId;
- isProduction = await models.Account.hasRole(currentUserId, 'Production');
+ currentUserId = token && token.userId;
+ isProduction = await models.Account.hasRole(currentUserId, 'production');
+ isSalesperson = await models.Account.hasRole(currentUserId, 'salesPerson');
+ }
+
+ if ((!isEditable && !isProduction) || (isEditable && !isAssigned && isSalesperson) || (!isSalesperson && !isProduction))
+ throw new UserError(`You don't have enough privileges to change the state of this ticket`);
+
+ if (!isAssigned) {
let worker = await models.Worker.findOne({where: {userFk: currentUserId}});
params.workerFk = worker.id;
}
- if (!isEditable && !isProduction)
- throw new UserError(`You don't have enough privileges to change the state of this ticket`);
-
return await Self.app.models.TicketTracking.create(params);
};
};
diff --git a/modules/ticket/back/methods/ticket-tracking/specs/changeState.spec.js b/modules/ticket/back/methods/ticket-tracking/specs/changeState.spec.js
index 1b35b6d700..1ac4ec14b0 100644
--- a/modules/ticket/back/methods/ticket-tracking/specs/changeState.spec.js
+++ b/modules/ticket/back/methods/ticket-tracking/specs/changeState.spec.js
@@ -3,18 +3,18 @@ const app = require(`${serviceRoot}/server/server`);
describe('ticket changeState()', () => {
let ticket;
- beforeAll(async () => {
+ beforeAll(async() => {
let originalTicket = await app.models.Ticket.findOne({where: {id: 16}});
originalTicket.id = null;
ticket = await app.models.Ticket.create(originalTicket);
});
- afterAll(async () => {
+ afterAll(async() => {
await app.models.Ticket.destroyById(ticket.id);
});
- it('should throw an error if the ticket is not editable and the user isnt production', async () => {
- let ctx = {req: {accessToken: {userId: 110}}};
+ it('should throw an error if the ticket is not editable and the user isnt production', async() => {
+ let ctx = {req: {accessToken: {userId: 18}}};
let params = {ticketFk: 2, stateFk: 3};
let error;
try {
@@ -26,26 +26,66 @@ describe('ticket changeState()', () => {
expect(error).toEqual(new Error(`You don't have enough privileges to change the state of this ticket`));
});
- it('should be able to create a ticket tracking line for a not editable ticket if the user has the production role', async () => {
- let ctx = {req: {accessToken: {userId: 50}}};
- let params = {ticketFk: 20, stateFk: 3};
+ it('should throw an error if the state is assigned and theres not worker in params', async() => {
+ let ctx = {req: {accessToken: {userId: 18}}};
+ let assignedState = await app.models.State.findOne({where: {code: 'PICKER_DESIGNED'}});
+ let params = {ticketFk: 11, stateFk: assignedState.id};
+ let error;
+ try {
+ await app.models.TicketTracking.changeState(ctx, params);
+ } catch (e) {
+ error = e;
+ }
+
+ expect(error.message).toEqual('La instancia `TicketTracking` no es válida. Detalles: `workerFk` Worker cannot be blank (value: undefined).');
+ });
+
+ it('should throw an error if a worker thats not production tries to change the state to one thats not assigned', async() => {
+ let ctx = {req: {accessToken: {userId: 110}}};
+ let params = {ticketFk: 11, stateFk: 3};
+ let error;
+ try {
+ await app.models.TicketTracking.changeState(ctx, params);
+ } catch (e) {
+ error = e;
+ }
+
+ expect(error.message).toEqual(`You don't have enough privileges to change the state of this ticket`);
+ });
+
+ it('should be able to create a ticket tracking line for a not editable ticket if the user has the production role', async() => {
+ let ctx = {req: {accessToken: {userId: 49}}};
+ let params = {ticketFk: ticket.id, stateFk: 3};
let res = await app.models.TicketTracking.changeState(ctx, params);
expect(res.__data.ticketFk).toBe(params.ticketFk);
expect(res.__data.stateFk).toBe(params.stateFk);
- expect(res.__data.workerFk).toBe(50);
+ expect(res.__data.workerFk).toBe(49);
expect(res.__data.id).toBeDefined();
});
- it('return an array with the created ticket tracking line', async () => {
- let ctx = {req: {accessToken: {userId: 108}}};
+ it('return an array with the created ticket tracking line', async() => {
+ let ctx = {req: {accessToken: {userId: 49}}};
let params = {ticketFk: ticket.id, stateFk: 3};
let res = await app.models.TicketTracking.changeState(ctx, params);
expect(res.__data.ticketFk).toBe(params.ticketFk);
expect(res.__data.stateFk).toBe(params.stateFk);
- expect(res.__data.workerFk).toBe(110);
+ expect(res.__data.workerFk).toBe(49);
+ expect(res.__data.id).toBeDefined();
+ });
+
+ it('return an array with the created ticket tracking line when the user is salesperson, uses the state assigned and thes a workerFk given', async() => {
+ let ctx = {req: {accessToken: {userId: 18}}};
+ let assignedState = await app.models.State.findOne({where: {code: 'PICKER_DESIGNED'}});
+ let params = {ticketFk: ticket.id, stateFk: assignedState.id, workerFk: 1};
+ let res = await app.models.TicketTracking.changeState(ctx, params);
+
+ expect(res.__data.ticketFk).toBe(params.ticketFk);
+ expect(res.__data.stateFk).toBe(params.stateFk);
+ expect(res.__data.workerFk).toBe(params.workerFk);
+ expect(res.__data.workerFk).toBe(1);
expect(res.__data.id).toBeDefined();
});
});
diff --git a/modules/ticket/back/models/ticket-tracking.js b/modules/ticket/back/models/ticket-tracking.js
index 2ebef8a9a9..2b2a935365 100644
--- a/modules/ticket/back/models/ticket-tracking.js
+++ b/modules/ticket/back/models/ticket-tracking.js
@@ -2,4 +2,5 @@ module.exports = function(Self) {
require('../methods/ticket-tracking/changeState')(Self);
Self.validatesPresenceOf('stateFk', {message: 'State cannot be blank'});
+ Self.validatesPresenceOf('workerFk', {message: 'Worker cannot be blank'});
};
diff --git a/modules/ticket/front/routes.json b/modules/ticket/front/routes.json
index 59fd490bf5..f130195e0c 100644
--- a/modules/ticket/front/routes.json
+++ b/modules/ticket/front/routes.json
@@ -142,7 +142,7 @@
"params": {
"ticket": "$ctrl.ticket"
},
- "acl": ["production", "administrative"]
+ "acl": ["production", "administrative", "salesPerson"]
},
{
"url" : "/sale-checked",
diff --git a/modules/ticket/front/tracking/edit/index.html b/modules/ticket/front/tracking/edit/index.html
index b2ca12e437..1d26e08dc0 100644
--- a/modules/ticket/front/tracking/edit/index.html
+++ b/modules/ticket/front/tracking/edit/index.html
@@ -1,9 +1,8 @@
-