diff --git a/client/ticket/routes.json b/client/ticket/routes.json index f32b563538..91814e7f2b 100644 --- a/client/ticket/routes.json +++ b/client/ticket/routes.json @@ -211,13 +211,13 @@ "component": "vn-ticket-request-create", "description": "Purchase request", "acl": ["salesPerson"] - }/* , + }, { "url": "/create?clientFk", "state": "ticket.create", "component": "vn-ticket-create", "description": "New ticket" - } */ + } ], "menu": [ {"state": "ticket.card.data.stepOne", "icon": "settings"}, diff --git a/client/ticket/src/create/card.html b/client/ticket/src/create/card.html new file mode 100644 index 0000000000..a689156111 --- /dev/null +++ b/client/ticket/src/create/card.html @@ -0,0 +1,44 @@ +New ticket + + {{id}}: {{name}} + + + {{nickname}}: {{street}}, {{city}} + + + + + + + diff --git a/client/ticket/src/create/card.js b/client/ticket/src/create/card.js new file mode 100644 index 0000000000..40a023b16b --- /dev/null +++ b/client/ticket/src/create/card.js @@ -0,0 +1,110 @@ +import ngModule from '../module'; + +class Controller { + constructor($http, vnApp, $translate, $state, $stateParams) { + this.$stateParams = $stateParams; + this.$http = $http; + this.translate = $translate; + this.vnApp = vnApp; + this.ticket = {}; + this.$state = $state; + this.clientFk = $stateParams.clientFk; + } + + $onInit() { + if (this.$stateParams && this.$stateParams.clientFk) + this.clientFk = this.$stateParams.clientFk; + } + + set ticket(value) { + if (value) + this._ticket = value; + } + + get ticket() { + return this._ticket; + } + + set clientFk(value) { + this.ticket.clientFk = value; + + if (value) { + let filter = {where: {clientFk: value, isDefaultAddress: true}}; + filter = encodeURIComponent(JSON.stringify(filter)); + let query = `/api/Addresses?filter=${filter}`; + this.$http.get(query).then(res => { + this.addressFk = res.data[0].id; + }); + } else + this.addressFk = null; + } + + get clientFk() { + return this.ticket.clientFk; + } + + set addressFk(value) { + this.ticket.addressFk = value; + } + + get addressFk() { + return this.ticket.addressFk; + } + + set landed(value) { + this.ticket.landed = value; + } + + get landed() { + return this.ticket.landed; + } + + set warehouseFk(value) { + this.ticket.warehouseFk = value; + this.getAvailableAgencies(); + } + get warehouseFk() { + return this.ticket.warehouseFk; + } + + + getAvailableAgencies() { + this.ticket.agencyModeFk = null; + if (this.ticket.landed && this.ticket.addressFk) { + let filter = {warehouseFk: this.ticket.warehouseFk, addressFk: this.ticket.addressFk, landed: this.ticket.landed}; + filter = encodeURIComponent(JSON.stringify(filter)); + let query = `/api/Agencies/getAgenciesWithWarehouse?filter=${filter}`; + this.$http.get(query).then(res => { + this._availableAgencies = res.data[0]; + }); + } + } + + onSubmit() { + this.createTicket(); + } + + createTicket() { + let params = { + clientFk: this.ticket.clientFk, + landed: this.ticket.landed, + addressFk: this.ticket.addressFk, + agencyModeFk: this.ticket.agencyModeFk, + warehouseFk: this.ticket.warehouseFk, + }; + this.$http.post(`ticket/api/Tickets/new`, params).then(res => { + this.vnApp.showSuccess(this.translate.instant('Data saved!')); + this.$state.go('ticket.card.summary', {id: res.data.id}); + }); + } +} + +Controller.$inject = ['$http', 'vnApp', '$translate', '$state', '$stateParams']; + +ngModule.component('vnTicketCreateCard', { + template: require('./card.html'), + controller: Controller, + bindings: { + ticket: ' +
+ + + + + + + +
+ \ No newline at end of file diff --git a/client/ticket/src/create/index.js b/client/ticket/src/create/index.js new file mode 100644 index 0000000000..bb9b4c76e2 --- /dev/null +++ b/client/ticket/src/create/index.js @@ -0,0 +1,20 @@ +import ngModule from '../module'; + +class Controller { + constructor($scope, $http, $state) { + this.$ = $scope; + this.$http = $http; + this.$state = $state; + } + + async onSubmit() { + let newTicketID = await this.$.card.createTicket(); + this.$state.go('ticket.card.summary', {id: newTicketID}); + } +} +Controller.$inject = ['$scope', '$http', '$state']; + +ngModule.component('vnTicketCreate', { + template: require('./index.html'), + controller: Controller +}); diff --git a/client/ticket/src/create/locale/es.yml b/client/ticket/src/create/locale/es.yml new file mode 100644 index 0000000000..19f3f4ddd8 --- /dev/null +++ b/client/ticket/src/create/locale/es.yml @@ -0,0 +1 @@ +New ticket: Nueva ticket \ No newline at end of file diff --git a/client/ticket/src/index/index.html b/client/ticket/src/index/index.html index a4aea9f6b1..587c9fbb1f 100644 --- a/client/ticket/src/index/index.html +++ b/client/ticket/src/index/index.html @@ -97,6 +97,9 @@ scroll-selector="ui-view"> + + + diff --git a/client/ticket/src/ticket.js b/client/ticket/src/ticket.js index 26a507a7ff..3367282723 100644 --- a/client/ticket/src/ticket.js +++ b/client/ticket/src/ticket.js @@ -3,8 +3,8 @@ export * from './module'; import './search-panel'; import './index'; import './card'; -/* import './create/card'; -import './create/index'; */ +import './create/card'; +import './create/index'; import './summary'; import './data'; import './data/step-one'; diff --git a/services/loopback/common/methods/item/regularize.js b/services/loopback/common/methods/item/regularize.js index 4bac1d6bf6..12c28144ca 100644 --- a/services/loopback/common/methods/item/regularize.js +++ b/services/loopback/common/methods/item/regularize.js @@ -16,7 +16,7 @@ module.exports = Self => { arg: 'warehouseFk', type: 'number', required: true, - description: 'The id of the wharehouse where the inventory happened', + description: 'The id of the warehouse where the inventory happened', }], returns: { type: 'boolean', @@ -86,15 +86,17 @@ module.exports = Self => { } async function createTicket(params, transaction) { - let ticket = await Self.app.models.Ticket.new({ - shipped: new Date(), - landed: new Date(), - clientFk: params.clientFk, - warehouseFk: params.warehouseFk, - companyFk: params.companyFk, - addressFk: params.addressFk, - userId: params.userId - }, {transaction: transaction}); + let ticket = await Self.app.models.Ticket.new( + ctx, + { + shipped: new Date(), + landed: new Date(), + clientFk: params.clientFk, + warehouseFk: params.warehouseFk, + companyFk: params.companyFk, + addressFk: params.addressFk, + userId: params.userId + }, {transaction: transaction}); return ticket.id; } diff --git a/services/loopback/common/methods/sale/moveToNewTicket.js b/services/loopback/common/methods/sale/moveToNewTicket.js index ed865f48d9..23e110d6c1 100644 --- a/services/loopback/common/methods/sale/moveToNewTicket.js +++ b/services/loopback/common/methods/sale/moveToNewTicket.js @@ -27,7 +27,7 @@ module.exports = Self => { } }); - Self.moveToNewTicket = async(ctx, params) => { + Self.moveToNewTicket = async (ctx, params) => { let userId = ctx.req.accessToken.userId; let model = Self.app.models; let thisTicketIsEditable = await model.Ticket.isEditable(params.ticket.oldTicketFk); @@ -53,7 +53,7 @@ module.exports = Self => { let transaction = await Self.beginTransaction({}); try { - let newTicket = await model.Ticket.new(newTicketParams, {transaction: transaction}); + let newTicket = await model.Ticket.new(ctx, newTicketParams, {transaction: transaction}); let selectedSalesId = []; params.sales.forEach(sale => { diff --git a/services/loopback/common/methods/ticket/new.js b/services/loopback/common/methods/ticket/new.js index 274224bc6d..80f4ece6c7 100644 --- a/services/loopback/common/methods/ticket/new.js +++ b/services/loopback/common/methods/ticket/new.js @@ -1,7 +1,7 @@ let UserError = require('../../helpers').UserError; module.exports = Self => { - Self.remoteMethod('new', { + Self.remoteMethodCtx('new', { description: 'Create a newticket and returns the new ID', accessType: 'WRITE', accepts: [{ @@ -21,17 +21,40 @@ module.exports = Self => { } }); - Self.new = async(params, transaction) => { - let existsAddress = await Self.app.models.Address.findOne({ - where: { - id: params.addressFk, - clientFk: params.clientFk} + Self.new = async (ctx, params, transaction) => { + let address = await Self.app.models.Address.findOne({ + where: {id: params.addressFk}, + fields: ['clientFk'], + include: [ + {relation: 'client'} + ] }); - if (!existsAddress) + if (!address) throw new UserError(`This address doesn't exist`); - let query = `CALL vn.ticketCreateWithUser(?, ?, ?, ?, ?, ?, ?, ?, ?, @result); + if (address.client().isFreezed) + throw new UserError(`You can't create an order for a frozen client`); + + if (!address.client().isActive) + throw new UserError(`You can't create an order for a inactive client`); + + if (!address.client().isTaxDataChecked) + throw new UserError(`You can't create an order for a client that doesn't has tax data verified`); + + let clientFk = address.clientFk; + + let query = `SELECT vn.clientGetDebt(?, CURDATE()) AS debt`; + let clientDebt = await Self.rawSql(query, [clientFk]); + + if (clientDebt[0].debt > 0) + throw new UserError(`You can't create an order for a client that has a debt`); + + + if (!params.userId && ctx.req && ctx.req.accessToken.userId) + params.userId = ctx.req.accessToken.userId; + + query = `CALL vn.ticketCreateWithUser(?, ?, ?, ?, ?, ?, ?, ?, ?, @result); SELECT @result newTicketId;`; let result = await Self.rawSql(query, [ params.clientFk, @@ -43,10 +66,10 @@ module.exports = Self => { params.routeFk | null, params.landed, params.userId - ], transaction); + ], {options: transaction}); return await Self.findOne({ where: {id: result[1][0].newTicketId} - }, transaction); + }, {options: transaction}); }; }; diff --git a/services/loopback/common/methods/ticket/specs/new.spec.js b/services/loopback/common/methods/ticket/specs/new.spec.js index cae4fa4cb0..3a081c9fbf 100644 --- a/services/loopback/common/methods/ticket/specs/new.spec.js +++ b/services/loopback/common/methods/ticket/specs/new.spec.js @@ -3,16 +3,17 @@ const app = require(`${servicesDir}/ticket/server/server`); describe('ticket new()', () => { let ticket; let today = new Date(); + let ctx = {req: {accessToken: {userId: 1}}}; - afterAll(async() => { + afterAll(async () => { await app.models.Ticket.destroyById(ticket.id); }); - it('should throw an error if the address doesnt exist', async() => { + it('should throw an error if the address doesnt exist', async () => { let error; - let params = {addressFk: 'invalid address', clientFk: 101}; + let params = {addressFk: 'invalid address', clientFk: 104}; - await app.models.Ticket.new(params) + await app.models.Ticket.new(ctx, params) .catch(response => { expect(response.message).toEqual(`This address doesn't exist`); error = response; @@ -21,19 +22,19 @@ describe('ticket new()', () => { expect(error).toBeDefined(); }); - it('should return the id of the created ticket', async() => { + it('should return the id of the created ticket', async () => { let params = { warehouseFk: 1, - clientFk: 101, + clientFk: 104, companyFk: 442, - addressFk: 1, + addressFk: 4, agencyModeFk: 1, userId: 9, shipped: today, landed: today }; - ticket = await app.models.Ticket.new(params); + ticket = await app.models.Ticket.new(ctx, params); let newestTicketIdInFixtures = 21;