diff --git a/back/models/sip.js b/back/models/sip.js
index 62ae1eff9..f6b007314 100644
--- a/back/models/sip.js
+++ b/back/models/sip.js
@@ -1,11 +1,5 @@
module.exports = Self => {
- // Validations
-
Self.validatesUniquenessOf('extension', {
message: `The extension must be unique`
});
-
- Self.validatesPresenceOf('secret', {
- message: `The secret can't be blank`
- });
};
diff --git a/back/models/sip.json b/back/models/sip.json
index 0864408e3..7a7cb8605 100644
--- a/back/models/sip.json
+++ b/back/models/sip.json
@@ -16,10 +16,8 @@
}
},
"extension": {
- "type": "Number"
- },
- "secret": {
- "type": "String"
+ "type": "String",
+ "required": true
}
},
"relations": {
diff --git a/db/changes/10050-pentecostes/00-ACL.sql b/db/changes/10050-pentecostes/00-ACL.sql
index d57826605..ca05184c1 100644
--- a/db/changes/10050-pentecostes/00-ACL.sql
+++ b/db/changes/10050-pentecostes/00-ACL.sql
@@ -1,2 +1,3 @@
INSERT INTO `salix`.`ACL` ( `model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ( 'ClientDms', 'remove', 'WRITE', 'ALLOW', 'ROLE', 'employee');
INSERT INTO `salix`.`ACL` ( `model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ( 'ClientDms', '*', 'READ', 'ALLOW', 'ROLE', 'employee');
+INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`) VALUES ('Route', 'updateVolume', 'WRITE', 'ALLOW', 'ROLE', 'deliveryBoss');
diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql
index 0a9309c1b..d23da60f4 100644
--- a/db/dump/fixtures.sql
+++ b/db/dump/fixtures.sql
@@ -364,13 +364,13 @@ INSERT INTO `vn`.`creditInsurance`(`id`, `creditClassification`, `credit`, `crea
INSERT INTO `vn`.`route`(`id`, `time`, `workerFk`, `created`, `vehicleFk`, `agencyModeFk`, `description`, `m3`, `cost`, `started`, `finished`)
VALUES
- (1, '1899-12-30 12:15:00', 56, CURDATE(), 1, 1, 'first route', null, 10, CURDATE(), CURDATE()),
- (2, '1899-12-30 13:20:00', 56, CURDATE(), 1, 1, 'second route', 4.2, 20, CURDATE(), CURDATE()),
- (3, '1899-12-30 14:30:00', 56, CURDATE(), 2, 7, 'third route', 5.3, 30, CURDATE(), CURDATE()),
- (4, '1899-12-30 15:45:00', 56, CURDATE(), 3, 7, 'fourth route', 6.4, 40, CURDATE(), CURDATE()),
- (5, '1899-12-30 16:00:00', 56, CURDATE(), 4, 8, 'fifth route', 7.5, 50, CURDATE(), CURDATE()),
- (6, null, 57, CURDATE(), 5, 8, 'sixth route', 8.6, 60, CURDATE(), CURDATE()),
- (7, null, 57, CURDATE(), 6, null, 'seventh route', 9.7, 70, CURDATE(), CURDATE());
+ (1, '1899-12-30 12:15:00', 56, CURDATE(), 1, 1, 'first route', 0.2, 10, CURDATE(), CURDATE()),
+ (2, '1899-12-30 13:20:00', 56, CURDATE(), 1, 1, 'second route', null, 20, CURDATE(), CURDATE()),
+ (3, '1899-12-30 14:30:00', 56, CURDATE(), 2, 7, 'third route', null, 30, CURDATE(), CURDATE()),
+ (4, '1899-12-30 15:45:00', 56, CURDATE(), 3, 7, 'fourth route', 0.1, 40, CURDATE(), CURDATE()),
+ (5, '1899-12-30 16:00:00', 56, CURDATE(), 4, 8, 'fifth route', null, 50, CURDATE(), CURDATE()),
+ (6, null, 57, CURDATE(), 5, 8, 'sixth route', null, 60, CURDATE(), CURDATE()),
+ (7, null, 57, CURDATE(), 6, null, 'seventh route', null, 70, CURDATE(), CURDATE());
INSERT INTO `vn2008`.`empresa_grupo`(`empresa_grupo_id`, `grupo`)
VALUES
@@ -1341,12 +1341,12 @@ INSERT INTO `vn`.`zoneIncluded` (`zoneFk`, `geoFk`, `isIncluded`)
(5, 4, 1),
(5, 5, 1);
-INSERT INTO `pbx`.`sip`(`user_id`, `extension`, `secret`, `caller_id`)
+INSERT INTO `pbx`.`sip`(`user_id`, `extension`)
VALUES
- (1, 1010, '123456', 'employee'),
- (3, 1101, '123456', 'agency'),
- (5, 1102, '123456', 'administrative'),
- (9, 1201, '123456', 'developer');
+ (1, 1010),
+ (3, 1101),
+ (5, 1102),
+ (9, 1201);
INSERT INTO `postgresql`.`person`(`person_id`, `name`, `nickname`, `nif`, `firstname`, `id_trabajador`)
SELECT w.id, w.lastName, u.nickname,CONCAT(RPAD(CONCAT(w.id,9),8,w.id),'A'),w.firstName,w.id
diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js
index 820e5b017..45b1e0398 100644
--- a/e2e/helpers/selectors.js
+++ b/e2e/helpers/selectors.js
@@ -474,7 +474,6 @@ export default {
},
claimBasicData: {
claimStateAutocomplete: 'vn-claim-basic-data vn-autocomplete[field="$ctrl.claim.claimStateFk"]',
- isPaidWithManaCheckbox: 'vn-check[field="$ctrl.claim.isChargedToMana"] md-checkbox',
responsabilityInputRange: 'vn-input-range',
observationInput: 'vn-textarea[field="$ctrl.claim.observation"] textarea',
saveButton: `${components.vnSubmit}`
@@ -510,8 +509,8 @@ export default {
thirdLineDestination: 'vn-claim-action vn-tr:nth-child(3) vn-autocomplete[field="saleClaimed.claimDestinationFk"]',
firstDeleteLine: 'vn-claim-action vn-tr:nth-child(1) vn-icon-button[icon="delete"]',
secondDeleteLine: 'vn-claim-action vn-tr:nth-child(2) vn-icon-button[icon="delete"]',
- thirdDeleteLine: 'vn-claim-action vn-tr:nth-child(3) vn-icon-button[icon="delete"]'
-
+ thirdDeleteLine: 'vn-claim-action vn-tr:nth-child(3) vn-icon-button[icon="delete"]',
+ isPaidWithManaCheckbox: 'vn-check[field="$ctrl.claim.isChargedToMana"] md-checkbox'
},
ordersIndex: {
searchResult: 'vn-order-index vn-card > div > vn-table > div > vn-tbody > a.vn-tr',
@@ -591,8 +590,7 @@ export default {
confirmButton: 'vn-route-tickets > vn-confirm button[response="ACCEPT"]'
},
workerPbx: {
- extensionInput: 'vn-worker-pbx vn-input-number[model="$ctrl.worker.sip.extension"] input',
- passwordInput: 'vn-worker-pbx vn-textfield[model="$ctrl.worker.sip.secret"] input',
+ extensionInput: 'vn-worker-pbx vn-textfield[model="$ctrl.worker.sip.extension"] input',
saveButton: 'vn-worker-pbx vn-submit[label="Save"] input'
},
workerTimeControl: {
diff --git a/e2e/paths/03-worker-module/01_pbx.spec.js b/e2e/paths/03-worker-module/01_pbx.spec.js
index 4a3bc2c7e..2032281e7 100644
--- a/e2e/paths/03-worker-module/01_pbx.spec.js
+++ b/e2e/paths/03-worker-module/01_pbx.spec.js
@@ -25,8 +25,6 @@ describe('Worker pbx path', () => {
const result = await nightmare
.clearInput(selectors.workerPbx.extensionInput)
.write(selectors.workerPbx.extensionInput, 4444)
- .clearInput(selectors.workerPbx.passwordInput)
- .write(selectors.workerPbx.passwordInput, 666666)
.waitToClick(selectors.workerPbx.saveButton)
.waitForLastSnackbar();
diff --git a/e2e/paths/06-claim-module/01_edit_basic_data.spec.js b/e2e/paths/06-claim-module/01_edit_basic_data.spec.js
index f863c86e2..2df37a147 100644
--- a/e2e/paths/06-claim-module/01_edit_basic_data.spec.js
+++ b/e2e/paths/06-claim-module/01_edit_basic_data.spec.js
@@ -11,10 +11,9 @@ describe('Claim edit basic data path', () => {
.accessToSection('claim.card.basicData');
});
- it(`should edit claim state, is paid with mana and observation fields`, async() => {
+ it(`should edit claim state and observation fields`, async() => {
const result = await nightmare
.autocompleteSearch(selectors.claimBasicData.claimStateAutocomplete, 'Gestionado')
- .waitToClick(selectors.claimBasicData.isPaidWithManaCheckbox)
.clearTextarea(selectors.claimBasicData.observationInput)
.write(selectors.claimBasicData.observationInput, 'edited observation')
.waitToClick(selectors.claimBasicData.saveButton)
@@ -40,13 +39,6 @@ describe('Claim edit basic data path', () => {
expect(result).toEqual('Gestionado');
});
- it('should confirm the Is paid with mana checkbox is checked', async() => {
- const result = await nightmare
- .checkboxState(selectors.claimBasicData.isPaidWithManaCheckbox);
-
- expect(result).toBe('checked');
- });
-
it('should confirm the claim observation was edited', async() => {
const result = await nightmare
.waitToGetProperty(selectors.claimBasicData.observationInput, 'value');
@@ -57,7 +49,6 @@ describe('Claim edit basic data path', () => {
it(`should edit the claim to leave it untainted`, async() => {
const result = await nightmare
.autocompleteSearch(selectors.claimBasicData.claimStateAutocomplete, 'Pendiente')
- .waitToClick(selectors.claimBasicData.isPaidWithManaCheckbox)
.clearTextarea(selectors.claimBasicData.observationInput)
.write(selectors.claimBasicData.observationInput, 'Observation one')
.waitToClick(selectors.claimBasicData.saveButton)
diff --git a/e2e/paths/06-claim-module/04_claim_action.spec.js b/e2e/paths/06-claim-module/04_claim_action.spec.js
index 2a61c088f..a06edaa50 100644
--- a/e2e/paths/06-claim-module/04_claim_action.spec.js
+++ b/e2e/paths/06-claim-module/04_claim_action.spec.js
@@ -1,7 +1,7 @@
import selectors from '../../helpers/selectors.js';
import createNightmare from '../../helpers/nightmare';
-describe('Claim edit basic data path', () => {
+describe('Claim action path', () => {
const nightmare = createNightmare();
beforeAll(() => {
@@ -60,4 +60,20 @@ describe('Claim edit basic data path', () => {
expect(result).toEqual('Data saved!');
});
+
+ it('should check the Is paid with mana checkbox', async() => {
+ const result = await nightmare
+ .waitToClick(selectors.claimAction.isPaidWithManaCheckbox)
+ .waitForSnackbar();
+
+ expect(result).toEqual(jasmine.arrayContaining(['Data saved!']));
+ });
+
+ it('should confirm the Is paid with mana checkbox is checked', async() => {
+ const result = await nightmare
+ .reloadSection('claim.card.action')
+ .checkboxState(selectors.claimAction.isPaidWithManaCheckbox);
+
+ expect(result).toBe('checked');
+ });
});
diff --git a/modules/claim/front/action/index.html b/modules/claim/front/action/index.html
index 4aa8909b9..4d0de4d1d 100644
--- a/modules/claim/front/action/index.html
+++ b/modules/claim/front/action/index.html
@@ -37,6 +37,16 @@
on-change="$ctrl.saveResponsibility(value)">
+
+
+
+
diff --git a/modules/claim/front/action/index.js b/modules/claim/front/action/index.js
index 2d74a2aff..f8612a992 100644
--- a/modules/claim/front/action/index.js
+++ b/modules/claim/front/action/index.js
@@ -173,6 +173,13 @@ class Controller {
this.vnApp.showSuccess(this.$translate.instant('Data saved!'));
});
}
+ saveMana(value) {
+ let query = `/api/Claims/${this.$stateParams.id}/updateClaim`;
+
+ this.$http.post(query, {isChargedToMana: value}).then(() => {
+ this.vnApp.showSuccess(this.$translate.instant('Data saved!'));
+ });
+ }
}
Controller.$inject = ['$stateParams', '$scope', '$http', '$translate', 'vnApp'];
diff --git a/modules/claim/front/basic-data/index.html b/modules/claim/front/basic-data/index.html
index 2887e5734..d05c6ebc5 100644
--- a/modules/claim/front/basic-data/index.html
+++ b/modules/claim/front/basic-data/index.html
@@ -18,6 +18,15 @@
label="Client"
order="id">
+
+
+
+
-
-
-
-
-
-
diff --git a/modules/route/back/methods/route/specs/filter.spec.js b/modules/route/back/methods/route/specs/filter.spec.js
index 6479f7ecb..1bf215138 100644
--- a/modules/route/back/methods/route/specs/filter.spec.js
+++ b/modules/route/back/methods/route/specs/filter.spec.js
@@ -45,7 +45,7 @@ describe('Route filter()', () => {
it('should return the routes matching "m3"', async() => {
let ctx = {
args: {
- m3: 4.2,
+ m3: 0.1,
}
};
diff --git a/modules/route/back/methods/route/specs/updateVolume.spec.js b/modules/route/back/methods/route/specs/updateVolume.spec.js
new file mode 100644
index 000000000..5a52a13a1
--- /dev/null
+++ b/modules/route/back/methods/route/specs/updateVolume.spec.js
@@ -0,0 +1,44 @@
+const app = require('vn-loopback/server/server');
+
+describe('route updateVolume()', () => {
+ const routeId = 1;
+ const workerFk = 9;
+ const ctx = {req: {accessToken: {userId: workerFk}}};
+ let originalRoute;
+ let ticketRestore;
+
+ afterAll(async done => {
+ await originalRoute.updateAttributes({m3: 0.2});
+ await ticketRestore.updateAttributes({routeFk: 4});
+ done();
+ });
+
+ it('should confirm the original volume of the route is the expected', async() => {
+ originalRoute = await app.models.Route.findById(routeId);
+
+ expect(originalRoute.m3).toEqual(0.2);
+ });
+
+ it('should confirm the route volume is updated when a ticket is added', async() => {
+ ticketRestore = await app.models.Ticket.findById(8);
+ let updatedTicket = await app.models.Ticket.findById(8);
+
+ await updatedTicket.updateAttributes({routeFk: routeId});
+ await app.models.Route.updateVolume(ctx, routeId);
+
+ let updatedRoute = await app.models.Route.findById(routeId);
+
+ expect(updatedRoute.m3).not.toEqual(originalRoute.m3);
+ });
+ // 1462
+ xit('should confirm the change is logged ', async() => {
+ let instanceValue = {m3: 0.3};
+ let filterValue = JSON.stringify(instanceValue);
+ let filter = {where: {newInstance: filterValue}};
+ console.log(filter);
+ let routeLog = await app.models.RouteLog.find(filter);
+ console.log(routeLog);
+
+ expect(routeLog.length).toBeGreaterThan(0);
+ });
+});
diff --git a/modules/route/back/methods/route/updateVolume.js b/modules/route/back/methods/route/updateVolume.js
new file mode 100644
index 000000000..27e96ebab
--- /dev/null
+++ b/modules/route/back/methods/route/updateVolume.js
@@ -0,0 +1,42 @@
+module.exports = Self => {
+ Self.remoteMethodCtx('updateVolume', {
+ description: 'Update the volume in a route',
+ accessType: 'WRITE',
+ accepts: {
+ arg: 'id',
+ type: 'number',
+ required: true,
+ description: 'Route id',
+ http: {source: 'path'}
+ },
+ returns: {
+ type: 'number',
+ root: true
+ },
+ http: {
+ path: `/:id/updateVolume`,
+ verb: 'POST'
+ }
+ });
+
+ Self.updateVolume = async(ctx, id) => {
+ let query = `CALL vn.routeUpdateM3(?)`;
+ let userId = ctx.req.accessToken.userId;
+ let originalRoute = await Self.app.models.Route.findById(id);
+
+ await Self.rawSql(query, [id]);
+ let updatedRoute = await Self.app.models.Route.findById(id);
+
+ let logRecord = {
+ originFk: id,
+ userFk: userId,
+ action: 'update',
+ changedModel: 'Route',
+ changedModelId: id,
+ oldInstance: {m3: originalRoute.m3},
+ newInstance: {m3: updatedRoute.m3}
+ };
+
+ return await Self.app.models.RouteLog.create(logRecord);
+ };
+};
diff --git a/modules/route/back/models/route.js b/modules/route/back/models/route.js
index bd637822f..c27719930 100644
--- a/modules/route/back/models/route.js
+++ b/modules/route/back/models/route.js
@@ -3,4 +3,5 @@ module.exports = Self => {
require('../methods/route/summary')(Self);
require('../methods/route/getTickets')(Self);
require('../methods/route/guessPriority')(Self);
+ require('../methods/route/updateVolume')(Self);
};
diff --git a/modules/route/front/descriptor/index.html b/modules/route/front/descriptor/index.html
index 2a2600177..dac65333e 100644
--- a/modules/route/front/descriptor/index.html
+++ b/modules/route/front/descriptor/index.html
@@ -13,7 +13,8 @@
value-field="callback"
translate-fields="['name']"
data="$ctrl.moreOptions"
- on-change="$ctrl.onMoreChange(value)">
+ on-change="$ctrl.onMoreChange(value)"
+ on-open="$ctrl.onMoreOpen()">
@@ -69,4 +70,9 @@
-
\ No newline at end of file
+
+
+
\ No newline at end of file
diff --git a/modules/route/front/descriptor/index.js b/modules/route/front/descriptor/index.js
index ca2a3de0c..15472726e 100644
--- a/modules/route/front/descriptor/index.js
+++ b/modules/route/front/descriptor/index.js
@@ -1,16 +1,29 @@
import ngModule from '../module';
+import {createDecipher} from 'crypto';
class Controller {
- constructor($, $http, vnApp, $translate) {
+ constructor($, $http, vnApp, $translate, aclService) {
this.$http = $http;
this.vnApp = vnApp;
this.$translate = $translate;
this.$ = $;
+ this.aclService = aclService;
this.moreOptions = [
{callback: this.showRouteReport, name: 'Show route report'},
- {callback: this.sendRouteReport, name: 'Send route report'}
+ {callback: this.sendRouteReport, name: 'Send route report'},
+ {callback: this.showUpdateVolumeDialog, name: 'Update volume', acl: 'deliveryBoss'}
];
}
+
+ onMoreOpen() {
+ let options = this.moreOptions.filter(option => {
+ const hasAclProperty = Object.hasOwnProperty.call(option, 'acl');
+
+ return !hasAclProperty || (hasAclProperty && this.aclService.hasAny([option.acl]));
+ });
+ this.$.moreButton.data = options;
+ }
+
set quicklinks(value = {}) {
this._quicklinks = Object.assign(value, this._quicklinks);
}
@@ -34,9 +47,23 @@ class Controller {
this.vnApp.showSuccess(this.$translate.instant('Report sent'));
});
}
+
+ showUpdateVolumeDialog() {
+ this.$.updateVolumeConfirmation.show();
+ }
+
+ updateVolume(response) {
+ if (response === 'ACCEPT') {
+ let url = `/route/api/Routes/${this.route.id}/updateVolume`;
+ this.$http.post(url).then(() => {
+ this.vnApp.showSuccess(this.$translate.instant('Volume updated'));
+ this.card.reload();
+ });
+ }
+ }
}
-Controller.$inject = ['$scope', '$http', 'vnApp', '$translate'];
+Controller.$inject = ['$scope', '$http', 'vnApp', '$translate', 'aclService'];
ngModule.component('vnRouteDescriptor', {
template: require('./index.html'),
@@ -44,5 +71,8 @@ ngModule.component('vnRouteDescriptor', {
route: '<',
quicklinks: '<'
},
+ require: {
+ card: '^vnRouteCard'
+ },
controller: Controller
});
diff --git a/modules/route/front/descriptor/locale/es.yml b/modules/route/front/descriptor/locale/es.yml
index 3fd58aed6..f2347b996 100644
--- a/modules/route/front/descriptor/locale/es.yml
+++ b/modules/route/front/descriptor/locale/es.yml
@@ -1,4 +1,6 @@
Volume exceded: Volumen excedido
Volume: Volumen
Send route report: Enviar informe de ruta
-Show route report: Ver informe de ruta
\ No newline at end of file
+Show route report: Ver informe de ruta
+Update volume: Actualizar volumen
+Volume updated: Volumen actualizado
\ No newline at end of file
diff --git a/modules/ticket/back/methods/sale/specs/updatePrice.spec.js b/modules/ticket/back/methods/sale/specs/updatePrice.spec.js
index 9036fb4b1..f14e285b0 100644
--- a/modules/ticket/back/methods/sale/specs/updatePrice.spec.js
+++ b/modules/ticket/back/methods/sale/specs/updatePrice.spec.js
@@ -7,9 +7,9 @@ describe('sale updatePrice()', () => {
let saleId = 13;
afterAll(async done => {
- originalSale.save();
- createdSaleComponent.destroy();
- originalSalesPersonMana.save();
+ await originalSale.save();
+ await app.models.SaleComponent.updateAll({componentFk: 37, saleFk: saleId}, {value: 0});
+ await originalSalesPersonMana.save();
done();
});
diff --git a/modules/ticket/back/models/ticket-log.json b/modules/ticket/back/models/ticket-log.json
index 80c501e2e..950742e98 100644
--- a/modules/ticket/back/models/ticket-log.json
+++ b/modules/ticket/back/models/ticket-log.json
@@ -26,23 +26,23 @@
"changedModel": {
"type": "String"
},
- "oldInstance": {
- "type": "Object"
+ "oldInstance": {
+ "type": "Object"
},
- "newInstance": {
- "type": "Object"
+ "newInstance": {
+ "type": "Object"
},
- "creationDate": {
- "type": "Date"
+ "creationDate": {
+ "type": "Date"
},
- "changedModelId": {
- "type": "Number"
+ "changedModelId": {
+ "type": "Number"
},
- "changedModelValue": {
- "type": "String"
+ "changedModelValue": {
+ "type": "String"
},
- "description": {
- "type": "String"
+ "description": {
+ "type": "String"
}
},
"relations": {
diff --git a/modules/worker/front/pbx/index.html b/modules/worker/front/pbx/index.html
index 931cf70fc..e8889704d 100644
--- a/modules/worker/front/pbx/index.html
+++ b/modules/worker/front/pbx/index.html
@@ -6,15 +6,11 @@
-
-
-
+
diff --git a/modules/worker/front/pbx/index.js b/modules/worker/front/pbx/index.js
index 9e0cef8ec..46afe5d68 100644
--- a/modules/worker/front/pbx/index.js
+++ b/modules/worker/front/pbx/index.js
@@ -10,8 +10,7 @@ class Controller {
const sip = this.worker.sip;
const params = {
userFk: this.worker.userFk,
- extension: sip.extension,
- secret: sip.secret
+ extension: sip.extension
};
this.$scope.watcher.check();
this.$http.patch('/api/Sips', params).then(() => {