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 87b355af5..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 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/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": {