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: ''
+ }
+});
diff --git a/client/ticket/src/create/index.html b/client/ticket/src/create/index.html
new file mode 100644
index 0000000000..0ae0aa5883
--- /dev/null
+++ b/client/ticket/src/create/index.html
@@ -0,0 +1,11 @@
+
\ 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;