From 024a2487970be1066f63ae0e0a91e8ee52c75732 Mon Sep 17 00:00:00 2001 From: gerard Date: Tue, 8 May 2018 09:25:15 +0200 Subject: [PATCH] =?UTF-8?q?#265=20A=C3=B1adir=20boton=20ok=20y=20estado=20?= =?UTF-8?q?CR:=20JUAN?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/ticket/src/sale/sale.html | 23 +++++++- client/ticket/src/sale/sale.js | 28 ++++++++-- client/ticket/src/sale/sale.spec.js | 54 +++++++++++++++++++ .../loopback/common/models/ticket-state.json | 9 +++- .../ticket/common/models/ticket-tracking.js | 18 ++++--- 5 files changed, 119 insertions(+), 13 deletions(-) create mode 100644 client/ticket/src/sale/sale.spec.js diff --git a/client/ticket/src/sale/sale.html b/client/ticket/src/sale/sale.html index ec66bbf753..4714a7c2c4 100644 --- a/client/ticket/src/sale/sale.html +++ b/client/ticket/src/sale/sale.html @@ -3,9 +3,25 @@ Sale + + + + + + + @@ -15,7 +31,10 @@ - + +
+ + Item Description Quantity
+ + - + diff --git a/client/ticket/src/sale/sale.js b/client/ticket/src/sale/sale.js index e9f7b4fb6d..31e4a13097 100644 --- a/client/ticket/src/sale/sale.js +++ b/client/ticket/src/sale/sale.js @@ -2,11 +2,27 @@ import ngModule from '../module'; import FilterTicketList from '../filter-ticket-list'; class Controller extends FilterTicketList { - constructor($scope, $timeout, $stateParams) { + constructor($scope, $timeout, $stateParams, $http) { super($scope, $timeout, $stateParams); this.$ = $scope; this.$timeout = $timeout; this.onOrder('itemFk', 'ASC'); + this.$http = $http; + } + + onStateOkClick() { + let filter = {where: {code: "OK"}, fields: ["id"]}; + let json = encodeURIComponent(JSON.stringify(filter)); + this.$http.get(`/ticket/api/States?filter=${json}`).then(res => { + this.onStateChange(res.data[0].id); + }); + } + + onStateChange(value) { + let params = {ticketFk: this.$state.params.id, stateFk: value}; + this.$http.post(`/ticket/api/TicketTrackings`, params).then(() => { + this.card.reload(); + }); } showDescriptor(event, itemFk) { @@ -19,9 +35,15 @@ class Controller extends FilterTicketList { } } -Controller.$inject = ['$scope', '$timeout', '$state']; +Controller.$inject = ['$scope', '$timeout', '$state', '$http']; ngModule.component('vnTicketSale', { template: require('./sale.html'), - controller: Controller + controller: Controller, + bindings: { + ticket: '<' + }, + require: { + card: '^vnTicketCard' + } }); diff --git a/client/ticket/src/sale/sale.spec.js b/client/ticket/src/sale/sale.spec.js new file mode 100644 index 0000000000..960794f969 --- /dev/null +++ b/client/ticket/src/sale/sale.spec.js @@ -0,0 +1,54 @@ +import './sale.js'; + +describe('Ticket', () => { + describe('Component vnTicketSale', () => { + let $componentController; + let controller; + let $httpBackend; + let $state; + let $scope; + + beforeEach(() => { + angular.mock.module('ticket'); + }); + + beforeEach(angular.mock.inject((_$componentController_, _$state_, _$httpBackend_, $rootScope) => { + $componentController = _$componentController_; + $httpBackend = _$httpBackend_; + $scope = $rootScope.$new(); + $scope.index = {model: {instances: [{id: 1}, {id: 2}]}, accept: () => { + return { + then: () => {} + }; + }}; + $state = _$state_; + $state.params.id = 1; + controller = $componentController('vnTicketSale', {$scope: $scope}, {$state: $state}); + })); + + describe('onStateOkClick()', () => { + it('should perform a get and then call a function', () => { + let filter = {where: {code: "OK"}, fields: ["id"]}; + filter = encodeURIComponent(JSON.stringify(filter)); + let res = [{id: 3}]; + spyOn(controller, 'onStateChange'); + + $httpBackend.whenGET(`/ticket/api/States?filter=${filter}`).respond(res); + $httpBackend.expectGET(`/ticket/api/States?filter=${filter}`); + controller.onStateOkClick(); + $httpBackend.flush(); + + expect(controller.onStateChange).toHaveBeenCalledWith(3); + }); + }); + + describe('onStateChange()', () => { + it('should perform a post and then call a function', () => { + $httpBackend.expectPOST(`/ticket/api/TicketTrackings`).respond(); + controller.card = {reload: () => {}}; + controller.onStateChange(3); + $httpBackend.flush(); + }); + }); + }); +}); diff --git a/services/loopback/common/models/ticket-state.json b/services/loopback/common/models/ticket-state.json index 693dc7b874..9b2bf579ea 100644 --- a/services/loopback/common/models/ticket-state.json +++ b/services/loopback/common/models/ticket-state.json @@ -7,7 +7,7 @@ } }, "properties": { - "id": { + "ticketFk": { "id": true, "type": "Number", "forceId": false @@ -30,8 +30,13 @@ }, "worker": { "type": "belongsTo", - "model": "Worder", + "model": "Worker", "foreignKey": "workerFk" + }, + "alertLevel": { + "type": "belongsTo", + "model": "State", + "foreignKey": "alertLevel" } } } diff --git a/services/ticket/common/models/ticket-tracking.js b/services/ticket/common/models/ticket-tracking.js index ce474fe50a..7f9e9c94b3 100644 --- a/services/ticket/common/models/ticket-tracking.js +++ b/services/ticket/common/models/ticket-tracking.js @@ -3,14 +3,20 @@ module.exports = function(Self) { Self.validatesPresenceOf('stateFk', {message: 'State cannot be blank'}); - Self.observe('before save', function(ctx, next) { + Self.observe('before save', async function(ctx) { + let models = Self.app.models; let token = ctx.options.accessToken; let userId = token && token.userId; - Self.app.models.Worker.findOne({where: {userFk: userId}}, (err, user) => { - if (err) return next(err); - ctx.instance.workerFk = user.id; - next(); - }); + let isEmployee = await models.Account.hasRole(userId, 'employee'); + let isProduction = await models.Account.hasRole(userId, 'production'); + let isAlertLevel0 = await models.State.isAlertLevel0(ctx.instance.stateFk); + let ticketAlertLevel = await models.TicketState.findOne({where: {id: ctx.instance.ticketFk}, fields: ["alertLevel"]}); + + if ((!isProduction && !isAlertLevel0) || !isEmployee || (isEmployee && ticketAlertLevel != 0 && !isProduction)) + throw new Error("You don't have enough privileges to do that"); + + let user = await models.Worker.findOne({where: {userFk: userId}}); + ctx.instance.workerFk = user.id; }); };