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(() => {