diff --git a/db/tests/vn/zone_getEvents.spec.js b/db/tests/vn/zone_getEvents.spec.js
index bfd11b4b2..fe49b60be 100644
--- a/db/tests/vn/zone_getEvents.spec.js
+++ b/db/tests/vn/zone_getEvents.spec.js
@@ -1,7 +1,7 @@
const app = require('vn-loopback/server/server');
const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
-fdescribe('zone zone_getEvents()', () => {
+describe('zone zone_getEvents()', () => {
it(`should return data for a agencyMode with deliveryMethod pickup`, async() => {
let stmts = [];
let stmt;
@@ -18,7 +18,6 @@ fdescribe('zone zone_getEvents()', () => {
]);
stmts.push(stmt);
- let firstResultIndex = stmts.push(stmt) - 1;
stmts.push('ROLLBACK');
diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js
index e8435eadf..5cd24cda5 100644
--- a/e2e/helpers/selectors.js
+++ b/e2e/helpers/selectors.js
@@ -585,6 +585,7 @@ export default {
claimState: 'vn-claim-basic-data vn-autocomplete[ng-model="$ctrl.claim.claimStateFk"]',
responsabilityInputRange: 'vn-range',
observation: 'vn-textarea[ng-model="$ctrl.claim.observation"]',
+ hasToPickUpCheckbox: 'vn-claim-basic-data vn-check[ng-model="$ctrl.claim.hasToPickUp"]',
saveButton: `button[type=submit]`
},
claimDetail: {
@@ -619,8 +620,7 @@ export default {
firstLineDestination: 'vn-claim-action vn-tr:nth-child(1) vn-autocomplete[ng-model="saleClaimed.claimDestinationFk"]',
secondLineDestination: 'vn-claim-action vn-tr:nth-child(2) vn-autocomplete[ng-model="saleClaimed.claimDestinationFk"]',
firstDeleteLine: 'vn-claim-action vn-tr:nth-child(1) vn-icon-button[icon="delete"]',
- isPaidWithManaCheckbox: 'vn-claim-action vn-check[ng-model="$ctrl.claim.isChargedToMana"]',
- hasToPickUpCheckbox: 'vn-claim-action vn-check[ng-model="$ctrl.claim.hasToPickUp"]'
+ isPaidWithManaCheckbox: 'vn-claim-action vn-check[ng-model="$ctrl.claim.isChargedToMana"]'
},
ordersIndex: {
searchResult: 'vn-order-index vn-card > vn-table > div > vn-tbody > a.vn-tr',
diff --git a/e2e/paths/06-claim/01_basic_data.spec.js b/e2e/paths/06-claim/01_basic_data.spec.js
index a255188e2..dd55d0053 100644
--- a/e2e/paths/06-claim/01_basic_data.spec.js
+++ b/e2e/paths/06-claim/01_basic_data.spec.js
@@ -34,6 +34,15 @@ describe('Claim edit basic data path', () => {
await page.waitForState('claim.card.detail');
});
+ it('should check the "Pick up" checkbox', async() => {
+ await page.reloadSection('claim.card.basicData');
+ await page.waitToClick(selectors.claimBasicData.hasToPickUpCheckbox);
+ await page.waitToClick(selectors.claimBasicData.saveButton);
+ const message = await page.waitForSnackbar();
+
+ expect(message.type).toBe('success');
+ });
+
it('should confirm the claim state was edited', async() => {
await page.reloadSection('claim.card.basicData');
await page.wait(selectors.claimBasicData.claimState);
@@ -42,6 +51,12 @@ describe('Claim edit basic data path', () => {
expect(result).toEqual('Gestionado');
});
+ it('should confirm the "is paid with mana" and "Pick up" checkbox are checked', async() => {
+ const hasToPickUpCheckbox = await page.checkboxState(selectors.claimBasicData.hasToPickUpCheckbox);
+
+ expect(hasToPickUpCheckbox).toBe('checked');
+ });
+
it('should confirm the claim observation was edited', async() => {
const result = await page
.waitToGetProperty(selectors.claimBasicData.observation, 'value');
diff --git a/e2e/paths/06-claim/04_claim_action.spec.js b/e2e/paths/06-claim/04_claim_action.spec.js
index 67c936898..e7ab8638c 100644
--- a/e2e/paths/06-claim/04_claim_action.spec.js
+++ b/e2e/paths/06-claim/04_claim_action.spec.js
@@ -72,19 +72,10 @@ describe('Claim action path', () => {
expect(message.type).toBe('success');
});
- it('should check the "Pick up" checkbox', async() => {
- await page.waitToClick(selectors.claimAction.hasToPickUpCheckbox);
- const message = await page.waitForSnackbar();
-
- expect(message.type).toBe('success');
- });
-
- it('should confirm the "is paid with mana" and "Pick up" checkbox are checked', async() => {
+ it('should confirm the "is paid with mana" is checked', async() => {
await page.reloadSection('claim.card.action');
const isPaidWithManaCheckbox = await page.checkboxState(selectors.claimAction.isPaidWithManaCheckbox);
- const hasToPickUpCheckbox = await page.checkboxState(selectors.claimAction.hasToPickUpCheckbox);
expect(isPaidWithManaCheckbox).toBe('checked');
- expect(hasToPickUpCheckbox).toBe('checked');
});
});
diff --git a/modules/claim/back/methods/claim/regularizeClaim.js b/modules/claim/back/methods/claim/regularizeClaim.js
index 77e5f6504..7c5c2a3d4 100644
--- a/modules/claim/back/methods/claim/regularizeClaim.js
+++ b/modules/claim/back/methods/claim/regularizeClaim.js
@@ -88,32 +88,11 @@ module.exports = Self => {
}, options);
}
- let claim = await Self.findById(claimFk, {
- include: {
- relation: 'client',
- scope: {
- include: {
- relation: 'salesPerson'
- }
- }
- }
- }, options);
+ let claim = await Self.findById(claimFk, null, options);
claim = await claim.updateAttributes({
claimStateFk: resolvedState
}, options);
- // Get sales person from claim client
- const salesPerson = claim.client().salesPerson();
- if (salesPerson && claim.hasToPickUp) {
- const origin = ctx.req.headers.origin;
- const message = $t('Claim will be picked', {
- claimId: claim.id,
- clientName: claim.client().name,
- claimUrl: `${origin}/#!/claim/${claim.id}/summary`
- });
- await models.Chat.sendCheckingPresence(ctx, salesPerson.id, message);
- }
-
await tx.commit();
return claim;
diff --git a/modules/claim/back/methods/claim/specs/regularizeClaim.spec.js b/modules/claim/back/methods/claim/specs/regularizeClaim.spec.js
index 8ebe41f25..1d3bff26d 100644
--- a/modules/claim/back/methods/claim/specs/regularizeClaim.spec.js
+++ b/modules/claim/back/methods/claim/specs/regularizeClaim.spec.js
@@ -103,11 +103,9 @@ describe('regularizeClaim()', () => {
claimEnd.updateAttributes({claimDestinationFk: okDestination});
});
- const claim = await app.models.Claim.findById(claimFk);
- await claim.updateAttribute('hasToPickUp', true);
await app.models.Claim.regularizeClaim(ctx, claimFk);
expect(chatModel.sendCheckingPresence).toHaveBeenCalledWith(ctx, 18, 'Bueno');
- expect(chatModel.sendCheckingPresence).toHaveBeenCalledTimes(5);
+ expect(chatModel.sendCheckingPresence).toHaveBeenCalledTimes(4);
});
});
diff --git a/modules/claim/back/methods/claim/specs/updateClaim.spec.js b/modules/claim/back/methods/claim/specs/updateClaim.spec.js
index 095e374bd..0222164ec 100644
--- a/modules/claim/back/methods/claim/specs/updateClaim.spec.js
+++ b/modules/claim/back/methods/claim/specs/updateClaim.spec.js
@@ -54,6 +54,7 @@ describe('Update Claim', () => {
let data = {
observation: 'valid observation',
claimStateFk: correctState,
+ hasToPickUp: false
};
let ctx = {
req: {
@@ -70,19 +71,25 @@ describe('Update Claim', () => {
});
it('should change some sensible fields as salesAssistant', async() => {
+ const chatModel = app.models.Chat;
+ spyOn(chatModel, 'sendCheckingPresence').and.callThrough();
+
const salesAssistantId = 21;
let data = {
claimStateFk: 3,
workerFk: 5,
- observation: 'another valid observation'
+ observation: 'another valid observation',
+ hasToPickUp: true
};
- let ctx = {
+ const ctx = {
req: {
- accessToken: {
- userId: salesAssistantId
- }
+ accessToken: {userId: salesAssistantId},
+ headers: {origin: 'http://localhost'}
}
};
+ ctx.req.__ = (value, params) => {
+ return params.nickname;
+ };
await app.models.Claim.updateClaim(ctx, newInstance.id, data);
let claimUpdated = await app.models.Claim.findById(newInstance.id);
@@ -90,5 +97,6 @@ describe('Update Claim', () => {
expect(claimUpdated.observation).toEqual(data.observation);
expect(claimUpdated.claimStateFk).toEqual(data.claimStateFk);
expect(claimUpdated.workerFk).toEqual(data.workerFk);
+ expect(chatModel.sendCheckingPresence).toHaveBeenCalled();
});
});
diff --git a/modules/claim/back/methods/claim/updateClaim.js b/modules/claim/back/methods/claim/updateClaim.js
index 51623a7a8..61b8085d3 100644
--- a/modules/claim/back/methods/claim/updateClaim.js
+++ b/modules/claim/back/methods/claim/updateClaim.js
@@ -27,16 +27,44 @@ module.exports = Self => {
});
Self.updateClaim = async(ctx, id, data) => {
- let models = Self.app.models;
- let claim = await models.Claim.findById(id);
+ const models = Self.app.models;
+ const userId = ctx.req.accessToken.userId;
- let canUpdate = await canChangeState(ctx, claim.claimStateFk);
- let hasRights = await canChangeState(ctx, data.claimStateFk);
+ const $t = ctx.req.__; // $translate
+ const claim = await models.Claim.findById(id, {
+ include: {
+ relation: 'client',
+ scope: {
+ include: {
+ relation: 'salesPerson'
+ }
+ }
+ }
+ });
- if (!canUpdate || !hasRights)
+ const canUpdate = await canChangeState(ctx, claim.claimStateFk);
+ const hasRights = await canChangeState(ctx, data.claimStateFk);
+ const isSalesAssistant = await models.Account.hasRole(userId, 'salesAssistant');
+ const changedHasToPickUp = claim.hasToPickUp != data.hasToPickUp;
+
+ if (!canUpdate || !hasRights || changedHasToPickUp && !isSalesAssistant)
throw new UserError(`You don't have enough privileges to change that field`);
- return await claim.updateAttributes(data);
+ const updatedClaim = await claim.updateAttributes(data);
+
+ // Get sales person from claim client
+ const salesPerson = claim.client().salesPerson();
+ if (salesPerson && changedHasToPickUp && updatedClaim.hasToPickUp) {
+ const origin = ctx.req.headers.origin;
+ const message = $t('Claim will be picked', {
+ claimId: claim.id,
+ clientName: claim.client().name,
+ claimUrl: `${origin}/#!/claim/${claim.id}/summary`
+ });
+ await models.Chat.sendCheckingPresence(ctx, salesPerson.id, message);
+ }
+
+ return updatedClaim;
};
async function canChangeState(ctx, id) {
diff --git a/modules/claim/back/methods/claim/updateClaimAction.js b/modules/claim/back/methods/claim/updateClaimAction.js
index 69691897c..d11e2ed08 100644
--- a/modules/claim/back/methods/claim/updateClaimAction.js
+++ b/modules/claim/back/methods/claim/updateClaimAction.js
@@ -17,10 +17,6 @@ module.exports = Self => {
arg: 'isChargedToMana',
type: 'boolean',
required: false
- }, {
- arg: 'hasToPickUp',
- type: 'boolean',
- required: false
}],
returns: {
type: 'object',
diff --git a/modules/claim/front/action/index.html b/modules/claim/front/action/index.html
index 69dfd255b..f7a43bd2e 100644
--- a/modules/claim/front/action/index.html
+++ b/modules/claim/front/action/index.html
@@ -43,11 +43,6 @@
on-change="$ctrl.save({responsibility: value})">
-
-
+
+
+
+
diff --git a/modules/claim/front/basic-data/locale/es.yml b/modules/claim/front/basic-data/locale/es.yml
index 221b17cdc..d6bae25f6 100644
--- a/modules/claim/front/basic-data/locale/es.yml
+++ b/modules/claim/front/basic-data/locale/es.yml
@@ -3,4 +3,5 @@ Claim state: Estado de la reclamación
Is paid with mana: Cargado al maná
Responsability: Responsabilidad
Company: Empresa
-Sales/Client: Comercial/Cliente
\ No newline at end of file
+Sales/Client: Comercial/Cliente
+Pick up: Recoger
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 4a597175a..4a34836a4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11410,9 +11410,9 @@
}
},
"loopback-connector-mysql": {
- "version": "5.4.2",
- "resolved": "https://registry.npmjs.org/loopback-connector-mysql/-/loopback-connector-mysql-5.4.2.tgz",
- "integrity": "sha512-f5iIIcJdfUuBUkScGcK7m4dLZnpjFjl1iFG5OHTk8pFwDq7+Xap/0H99ulueRp2ljfqbULTUvt3Rg1y/W5smtw==",
+ "version": "5.4.3",
+ "resolved": "https://registry.npmjs.org/loopback-connector-mysql/-/loopback-connector-mysql-5.4.3.tgz",
+ "integrity": "sha512-HQ0Nnscyhhk+4zsDhXyR8dYdkhxIBN8r8N1futX5xznWjCZ4dpkG5svoPOMUjoNaDEtZuLr1I2E4CKb6f5u9Mw==",
"requires": {
"async": "^2.6.1",
"debug": "^3.1.0",
@@ -12231,14 +12231,35 @@
}
},
"mysql": {
- "version": "2.17.1",
- "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.17.1.tgz",
- "integrity": "sha512-7vMqHQ673SAk5C8fOzTG2LpPcf3bNt0oL3sFpxPEEFp1mdlDcrLK0On7z8ZYKaaHrHwNcQ/MTUz7/oobZ2OyyA==",
+ "version": "2.18.1",
+ "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz",
+ "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==",
"requires": {
- "bignumber.js": "7.2.1",
- "readable-stream": "2.3.6",
+ "bignumber.js": "9.0.0",
+ "readable-stream": "2.3.7",
"safe-buffer": "5.1.2",
"sqlstring": "2.3.1"
+ },
+ "dependencies": {
+ "bignumber.js": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
+ "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A=="
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ }
}
},
"mysql2": {
diff --git a/package.json b/package.json
index 0195aaa9e..c24022e5e 100644
--- a/package.json
+++ b/package.json
@@ -17,7 +17,7 @@
"loopback-boot": "^2.27.1",
"loopback-component-explorer": "^6.5.0",
"loopback-component-storage": "^3.6.1",
- "loopback-connector-mysql": "^5.4.2",
+ "loopback-connector-mysql": "^5.4.3",
"loopback-connector-remote": "^3.4.1",
"loopback-context": "^3.4.0",
"md5": "^2.2.1",