Fixed locales: client & back-end validations, back-end UserError. #464

This commit is contained in:
Joan Sanchez 2018-08-02 09:49:00 +02:00
parent b6cc14065e
commit ff0f0436af
49 changed files with 7575 additions and 3672 deletions

View File

@ -5,6 +5,11 @@
data="contacts" on-data-change="$ctrl.onDataChange()"> data="contacts" on-data-change="$ctrl.onDataChange()">
</vn-crud-model> </vn-crud-model>
<vn-watcher
vn-id="watcher"
data="contacts"
form="form">
</vn-watcher>
<form name="form" ng-submit="$ctrl.submit()"> <form name="form" ng-submit="$ctrl.submit()">
<vn-card pad-large> <vn-card pad-large>
<vn-title>Contacts</vn-title> <vn-title>Contacts</vn-title>

View File

@ -2,8 +2,8 @@ import ngModule from '../module';
import {validateAll} from '../lib/validator'; import {validateAll} from '../lib/validator';
import {firstUpper} from '../lib/string'; import {firstUpper} from '../lib/string';
directive.$inject = ['$interpolate', '$compile', '$window']; directive.$inject = ['$interpolate', '$compile', '$translate', '$window'];
export function directive(interpolate, compile, $window) { export function directive(interpolate, compile, $translate, $window) {
return { return {
restrict: 'A', restrict: 'A',
require: ['ngModel', '^^?form'], require: ['ngModel', '^^?form'],
@ -41,7 +41,7 @@ export function directive(interpolate, compile, $window) {
ngModel.$options.$$options.allowInvalid = true; ngModel.$options.$$options.allowInvalid = true;
ngModel.$validators.entity = value => { ngModel.$validators.entity = value => {
try { try {
validateAll(value, validations); validateAll($translate, value, validations);
return true; return true;
} catch (e) { } catch (e) {
errorMsg = e.message; errorMsg = e.message;

View File

@ -1,8 +1,8 @@
import ngModule from '../module'; import ngModule from '../module';
import HttpError from './http-error'; import HttpError from './http-error';
interceptor.$inject = ['$q', 'vnApp', '$cookies']; interceptor.$inject = ['$q', 'vnApp', '$cookies', '$translate'];
function interceptor($q, vnApp, $cookies) { function interceptor($q, vnApp, $cookies, $translate) {
return { return {
request: function(config) { request: function(config) {
vnApp.pushLoader(); vnApp.pushLoader();
@ -11,6 +11,9 @@ function interceptor($q, vnApp, $cookies) {
if (token) if (token)
config.headers.Authorization = token; config.headers.Authorization = token;
if ($translate.use())
config.headers['Accept-Language'] = $translate.use();
return config; return config;
}, },
requestError: function(rejection) { requestError: function(rejection) {

View File

@ -1,15 +1,15 @@
import {validator} from 'vendor'; import {validator} from 'vendor';
export const validators = { export const validators = {
presence: value => { presence: ($translate, value) => {
if (validator.isEmpty(value ? String(value) : '')) if (validator.isEmpty(value ? String(value) : ''))
throw new Error(`Value can't be empty`); throw new Error(_($translate, `Value can't be empty`));
}, },
absence: value => { absence: ($translate, value) => {
if (!validator.isEmpty(value)) if (!validator.isEmpty(value))
throw new Error(`Value should be empty`); throw new Error(_($translate, `Value should be empty`));
}, },
length: (value, conf) => { length: ($translate, value, conf) => {
let options = { let options = {
min: conf.min || conf.is, min: conf.min || conf.is,
max: conf.max || conf.is max: conf.max || conf.is
@ -17,38 +17,42 @@ export const validators = {
let val = value ? String(value) : ''; let val = value ? String(value) : '';
if (!validator.isLength(val, options)) { if (!validator.isLength(val, options)) {
if (conf.is) { if (conf.is) {
throw new Error(`Value should be ${conf.is} characters long`); throw new Error(_($translate,
`Value should be %s characters long`, [conf.is]));
} else if (conf.min && conf.max) { } else if (conf.min && conf.max) {
throw new Error(`Value should have a length between ${conf.min} and ${conf.max}`); throw new Error(_($translate,
`Value should have a length between %s and %s`, [conf.min, conf.max]));
} else if (conf.min) { } else if (conf.min) {
throw new Error(`Value should have at least ${conf.min} characters`); throw new Error(_($translate,
`Value should have at least %s characters`, [conf.min]));
} else { } else {
throw new Error(`Value should have at most ${conf.max} characters`); throw new Error(_($translate,
`Value should have at most %s characters`, [conf.max]));
} }
} }
}, },
numericality: (value, conf) => { numericality: ($translate, value, conf) => {
if (conf.int) { if (conf.int) {
if (!validator.isInt(value)) if (!validator.isInt(value))
throw new Error(`Value should be integer`); throw new Error(_($translate, `Value should be integer`));
} else if (!validator.isNumeric(value)) } else if (!validator.isNumeric(value))
throw new Error(`Value should be a number`); throw new Error(_($translate, `Value should be a number`));
}, },
inclusion: (value, conf) => { inclusion: ($translate, value, conf) => {
if (!validator.isIn(value, conf.in)) if (!validator.isIn(value, conf.in))
throw new Error(`Invalid value`); throw new Error(_($translate, `Invalid value`));
}, },
exclusion: (value, conf) => { exclusion: ($translate, value, conf) => {
if (validator.isIn(value, conf.in)) if (validator.isIn(value, conf.in))
throw new Error(`Invalid value`); throw new Error(_($translate, `Invalid value`));
}, },
format: (value, conf) => { format: ($translate, value, conf) => {
if (!validator.matches(value, conf.with)) if (!validator.matches(value, conf.with))
throw new Error(`Invalid value`); throw new Error(_($translate, `Invalid value`));
}, },
custom: (value, conf) => { custom: ($translate, value, conf) => {
if (!conf.bindedFunction(value)) if (!conf.bindedFunction(value))
throw new Error(`Invalid value`); throw new Error(_($translate, `Invalid value`));
} }
}; };
@ -58,9 +62,9 @@ export const validators = {
* @param {*} value The value * @param {*} value The value
* @param {Array} validations Array with validations * @param {Array} validations Array with validations
*/ */
export function validateAll(value, validations) { export function validateAll($translate, value, validations) {
for (let conf of validations) for (let conf of validations)
validate(value, conf); validate($translate, value, conf);
} }
/** /**
@ -69,18 +73,18 @@ export function validateAll(value, validations) {
* @param {*} value The value * @param {*} value The value
* @param {Object} conf The validation configuration * @param {Object} conf The validation configuration
*/ */
export function validate(value, conf) { export function validate($translate, value, conf) {
let validator = validators[conf.validation]; let validator = validators[conf.validation];
try { try {
let isEmpty = value == null || value === ''; let isEmpty = value == null || value === '';
if (isEmpty) if (isEmpty)
checkNull(value, conf); checkNull($translate, value, conf);
if (validator && (!isEmpty || conf.validation == 'presence')) if (validator && (!isEmpty || conf.validation == 'presence'))
validator(value, conf); validator($translate, value, conf);
} catch (e) { } catch (e) {
let message = conf.message ? conf.message : e.message; let message = conf.message ? conf.message : e.message;
throw new Error(message); throw new Error(_($translate, message));
} }
} }
@ -90,9 +94,19 @@ export function validate(value, conf) {
* @param {*} value The value * @param {*} value The value
* @param {Object} conf The validation configuration * @param {Object} conf The validation configuration
*/ */
export function checkNull(value, conf) { export function checkNull($translate, value, conf) {
if (conf.allowBlank === false && value === '') if (conf.allowBlank === false && value === '')
throw new Error(`Value can't be blank`); throw new Error(_($translate, `Value can't be blank`));
else if (conf.allowNull === false && value == null) else if (conf.allowNull === false && value == null)
throw new Error(`Value can't be null`); throw new Error(_($translate, `Value can't be null`));
}
export function _($translate, text, params = []) {
text = $translate.instant(text);
for (let i = 0; i < params.length; i++) {
text = text.replace('%s', params[i]);
}
return text;
} }

View File

@ -13,3 +13,14 @@ Finalize: Finalizar
Previous: Anterior Previous: Anterior
Load more: Cargar más Load more: Cargar más
Auto-scroll interrupted, please adjust the search: Auto-scroll interrumpido, por favor ajusta la búsqueda Auto-scroll interrupted, please adjust the search: Auto-scroll interrumpido, por favor ajusta la búsqueda
Value can't be empty: El valor no puede estar vacío
Value should be empty: El valor debe estar vacío
Value should be integer: El valor debe ser entero
Value should be a number: El valor debe ser numérico
Invalid value: Valor incorrecto
Value can't be blank: El valor no puede estar en blanco
Value can't be null: El valor no puede ser nulo
Value should be %s characters long: El valor debe ser de %s carácteres de longitud
Value should have a length between %s and %s: El valor debe tener una longitud de entre %s y %s
Value should have at least %s characters: El valor debe tener al menos %s carácteres
Value should have at most %s characters: El valor debe tener un máximo de %s carácteres

View File

@ -70,6 +70,7 @@ describe('Client', () => {
it(`should create a new greuge with all its data`, () => { it(`should create a new greuge with all its data`, () => {
return nightmare return nightmare
.type(selectors.clientGreuge.amountInput, 999) .type(selectors.clientGreuge.amountInput, 999)
.waitForTextInInput(selectors.clientGreuge.amountInput, '999')
.type(selectors.clientGreuge.descriptionInput, 'new armor for Batman!') .type(selectors.clientGreuge.descriptionInput, 'new armor for Batman!')
.click(selectors.clientGreuge.saveButton) .click(selectors.clientGreuge.saveButton)
.waitForSnackbar() .waitForSnackbar()

7184
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,8 @@
"posttest": "npm run lint && nsp check" "posttest": "npm run lint && nsp check"
}, },
"dependencies": { "dependencies": {
"md5": "^2.2.1" "md5": "^2.2.1",
"vn-loopback": "file:../loopback"
}, },
"repository": { "repository": {
"type": "git", "type": "git",

View File

@ -1,5 +1,5 @@
var vnLoopback = require('../../loopback/server/server.js'); var vnLoopback = require('vn-loopback/server/server.js');
var app = module.exports = vnLoopback.loopback(); var app = module.exports = vnLoopback.loopback();
app.set('applications', require('./application.json')); app.set('applications', require('./application.json'));

View File

@ -7,6 +7,9 @@
"start": "node .", "start": "node .",
"posttest": "npm run lint && nsp check" "posttest": "npm run lint && nsp check"
}, },
"dependencies": {
"vn-loopback": "file:../loopback"
},
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://git.verdnatura.es/salix" "url": "https://git.verdnatura.es/salix"

View File

@ -1,5 +1,5 @@
var vnLoopback = require('../../loopback/server/server.js'); var vnLoopback = require('vn-loopback/server/server.js');
var app = module.exports = vnLoopback.loopback(); var app = module.exports = vnLoopback.loopback();
vnLoopback.boot(app, __dirname, module); vnLoopback.boot(app, __dirname, module);

View File

@ -1,5 +1,5 @@
module.exports = function(Self) { module.exports = function(Self) {
Self.validate('text', isEnabled, {message: 'Se debe rellenar el campo de texto'}); Self.validate('text', isEnabled, {message: 'Description cannot be blank'});
function isEnabled(err) { function isEnabled(err) {
if (!this.text) err(); if (!this.text) err();
} }

View File

@ -1,3 +1,5 @@
const UserError = require('vn-loopback/common/helpers').UserError;
module.exports = Self => { module.exports = Self => {
Self.validatesPresenceOf('typeFk', { Self.validatesPresenceOf('typeFk', {
message: 'Sample type cannot be blank' message: 'Sample type cannot be blank'
@ -10,7 +12,7 @@ module.exports = Self => {
let sample = await models.Sample.findById(data.typeFk); let sample = await models.Sample.findById(data.typeFk);
if (sample.hasCompany && !data.companyFk) if (sample.hasCompany && !data.companyFk)
throw new Error('Choose a company'); throw new UserError('Choose a company');
let filter = {where: {userFk: ctx.options.accessToken.userId}}; let filter = {where: {userFk: ctx.options.accessToken.userId}};
let worker = await Self.app.models.Worker.findOne(filter); let worker = await Self.app.models.Worker.findOne(filter);

View File

@ -3,6 +3,6 @@ module.exports = function(Self) {
Self.validatesLengthOf('description', { Self.validatesLengthOf('description', {
max: 45, max: 45,
message: 'La description debe tener maximo 45 caracteres' message: 'Description should have maximum of 45 characters'
}); });
}; };

3792
services/client/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -13,6 +13,7 @@
"url": "https://git.verdnatura.es/salix" "url": "https://git.verdnatura.es/salix"
}, },
"dependencies": { "dependencies": {
"request": "^2.83.0" "request": "^2.83.0",
"vn-loopback": "file:../loopback"
} }
} }

View File

@ -1,5 +1,5 @@
var vnLoopback = require('../../loopback/server/server.js'); var vnLoopback = require('vn-loopback/server/server.js');
var app = module.exports = vnLoopback.loopback(); var app = module.exports = vnLoopback.loopback();
vnLoopback.boot(app, __dirname, module); vnLoopback.boot(app, __dirname, module);

13
services/item/package-lock.json generated Normal file
View File

@ -0,0 +1,13 @@
{
"name": "vn-item",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"uuid": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
"integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA=="
}
}
}

View File

@ -14,6 +14,7 @@
"license": "GPL-3.0", "license": "GPL-3.0",
"description": "vn-item", "description": "vn-item",
"dependencies": { "dependencies": {
"uuid": "^3.1.0" "uuid": "^3.1.0",
"vn-loopback": "file:../loopback"
} }
} }

View File

@ -1,4 +1,4 @@
var vnLoopback = require('../../loopback/server/server.js'); var vnLoopback = require('vn-loopback/server/server.js');
var app = module.exports = vnLoopback.loopback(); var app = module.exports = vnLoopback.loopback();
vnLoopback.boot(app, __dirname, module); vnLoopback.boot(app, __dirname, module);

View File

@ -2,6 +2,7 @@
exports.UserError = class extends Error { exports.UserError = class extends Error {
constructor(message) { constructor(message) {
super(message); super(message);
this.name = 'UserError';
this.statusCode = 400; this.statusCode = 400;
} }
}; };

View File

@ -23,5 +23,11 @@
"Phone cannot be blank": "Phone cannot be blank", "Phone cannot be blank": "Phone cannot be blank",
"Observation type cannot be blank": "Observation type cannot be blank", "Observation type cannot be blank": "Observation type cannot be blank",
"NO_AGENCY_AVAILABLE": "NO_AGENCY_AVAILABLE", "NO_AGENCY_AVAILABLE": "NO_AGENCY_AVAILABLE",
"can't be blank": "can't be blank" "can't be blank": "can't be blank",
"Cannot be blank": "Cannot be blank",
"Description should have maximum of 45 characters": "Description should have maximum of 45 characters",
"Period cannot be blank": "Period cannot be blank",
"The credit must be an integer greater than or equal to zero": "The credit must be an integer greater than or equal to zero",
"The grade must be an integer greater than or equal to zero": "The grade must be an integer greater than or equal to zero",
"Sample type cannot be blank": "Sample type cannot be blank"
} }

View File

@ -28,5 +28,12 @@
"Name cannot be blank": "El nombre no puede estar en blanco", "Name cannot be blank": "El nombre no puede estar en blanco",
"Phone cannot be blank": "El teléfono no puede estar en blanco", "Phone cannot be blank": "El teléfono no puede estar en blanco",
"Period cannot be blank": "El periodo no puede estar en blanco", "Period cannot be blank": "El periodo no puede estar en blanco",
"Choose a company": "Selecciona una empresa" "Choose a company": "Selecciona una empresa",
"Se debe rellenar el campo de texto": "Se debe rellenar el campo de texto",
"Description should have maximum of 45 characters": "La descripción debe tener maximo 45 caracteres",
"Cannot be blank": "Cannot be blank",
"The grade must be an integer greater than or equal to zero": "El grade debe ser un entero mayor o igual a cero",
"Sample type cannot be blank": "El tipo de plantilla no puede quedar en blanco",
"Description cannot be blank": "Se debe rellenar el campo de texto",
"You can't create an order for a frozen client": "You can't create an order for a frozen client"
} }

View File

@ -1,3 +1,5 @@
let UserError = require('../../helpers').UserError;
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('updateBasicData', { Self.remoteMethod('updateBasicData', {
description: 'Updates billing data of a client', description: 'Updates billing data of a client',
@ -30,7 +32,7 @@ module.exports = Self => {
let validUpdateParams = ['id', 'contact', 'name', 'email', 'phone', 'mobile', 'salesPersonFk', 'contactChannelFk']; let validUpdateParams = ['id', 'contact', 'name', 'email', 'phone', 'mobile', 'salesPersonFk', 'contactChannelFk'];
for (const key in params) { for (const key in params) {
if (validUpdateParams.indexOf(key) === -1) if (validUpdateParams.indexOf(key) === -1)
throw new Error(`You don't have enough privileges to do that`); throw new UserError(`You don't have enough privileges to do that`);
} }
return await Self.app.models.Client.update({id: id}, params); return await Self.app.models.Client.update({id: id}, params);

View File

@ -1,3 +1,5 @@
let UserError = require('../../helpers').UserError;
module.exports = Self => { module.exports = Self => {
Self.remoteMethodCtx('updateBillingData', { Self.remoteMethodCtx('updateBillingData', {
description: 'Updates billing data of a client', description: 'Updates billing data of a client',
@ -32,7 +34,7 @@ module.exports = Self => {
let [taxData] = await Self.app.models.Client.find({where: {id: id}, fields: ['isTaxDataChecked']}); let [taxData] = await Self.app.models.Client.find({where: {id: id}, fields: ['isTaxDataChecked']});
if (!isAdministrative && taxData.isTaxDataChecked) if (!isAdministrative && taxData.isTaxDataChecked)
throw new Error(`You don't have enough privileges to do that`); throw new UserError(`You don't have enough privileges to do that`);
let validUpdateParams = [ let validUpdateParams = [
'payMethodFk', 'payMethodFk',
@ -45,7 +47,7 @@ module.exports = Self => {
for (const key in params) { for (const key in params) {
if (validUpdateParams.indexOf(key) === -1) if (validUpdateParams.indexOf(key) === -1)
throw new Error(`You don't have enough privileges to do that`); throw new UserError(`You don't have enough privileges to do that`);
} }
return await Self.app.models.Client.update({id: id}, params); return await Self.app.models.Client.update({id: id}, params);

View File

@ -1,3 +1,5 @@
let UserError = require('../../helpers').UserError;
module.exports = Self => { module.exports = Self => {
Self.remoteMethodCtx('updateFiscalData', { Self.remoteMethodCtx('updateFiscalData', {
description: 'Updates billing data of a client', description: 'Updates billing data of a client',
@ -32,7 +34,7 @@ module.exports = Self => {
let [taxData] = await Self.app.models.Client.find({where: {id: id}, fields: ['isTaxDataChecked']}); let [taxData] = await Self.app.models.Client.find({where: {id: id}, fields: ['isTaxDataChecked']});
if (!isAdministrative && taxData.isTaxDataChecked) if (!isAdministrative && taxData.isTaxDataChecked)
throw new Error(`You don't have enough privileges to do that`); throw new UserError(`You don't have enough privileges to do that`);
let validUpdateParams = [ let validUpdateParams = [
'id', 'id',
@ -56,7 +58,7 @@ module.exports = Self => {
for (const key in params) { for (const key in params) {
if (validUpdateParams.indexOf(key) === -1) if (validUpdateParams.indexOf(key) === -1)
throw new Error(`You don't have enough privileges to do that`); throw new UserError(`You don't have enough privileges to do that`);
} }
params.id = id; params.id = id;

View File

@ -1,3 +1,5 @@
let UserError = require('../../helpers').UserError;
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('updateTaxes', { Self.remoteMethod('updateTaxes', {
description: 'Updates the item taxes', description: 'Updates the item taxes',
@ -29,7 +31,7 @@ module.exports = Self => {
let promises = []; let promises = [];
for (let tax of taxes) { for (let tax of taxes) {
if (!tax.taxClassFk) if (!tax.taxClassFk)
throw new Error('Tax class cannot be blank'); throw new UserError('Tax class cannot be blank');
promises.push(Self.app.models.ItemTaxCountry.updateAll( promises.push(Self.app.models.ItemTaxCountry.updateAll(
{id: tax.id}, {id: tax.id},

View File

@ -1,3 +1,5 @@
let UserError = require('../../helpers').UserError;
module.exports = Self => { module.exports = Self => {
Self.remoteMethodCtx('moveToNewTicket', { Self.remoteMethodCtx('moveToNewTicket', {
description: 'Change the state of a ticket', description: 'Change the state of a ticket',
@ -30,7 +32,7 @@ module.exports = Self => {
let model = Self.app.models; let model = Self.app.models;
let thisTicketIsEditable = await model.Ticket.isEditable(params.ticket.oldTicketFk); let thisTicketIsEditable = await model.Ticket.isEditable(params.ticket.oldTicketFk);
if (!thisTicketIsEditable) if (!thisTicketIsEditable)
throw new Error(`The sales of this ticket can't be modified`); throw new UserError(`The sales of this ticket can't be modified`);
let travelDates = await model.Agency.getFirstShipped(params.ticket); let travelDates = await model.Agency.getFirstShipped(params.ticket);
let shipped = new Date(travelDates.vShipped); let shipped = new Date(travelDates.vShipped);

View File

@ -1,3 +1,5 @@
let UserError = require('../../helpers').UserError;
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('moveToTicket', { Self.remoteMethod('moveToTicket', {
description: 'Change the state of a ticket', description: 'Change the state of a ticket',
@ -22,11 +24,11 @@ module.exports = Self => {
Self.moveToTicket = async params => { Self.moveToTicket = async params => {
let thisTicketIsEditable = await Self.app.models.Ticket.isEditable(params.actualTicketFk); let thisTicketIsEditable = await Self.app.models.Ticket.isEditable(params.actualTicketFk);
if (!thisTicketIsEditable) if (!thisTicketIsEditable)
throw new Error(`The sales of this ticket can't be modified`); throw new UserError(`The sales of this ticket can't be modified`);
let newTicketIsEditable = await Self.app.models.Ticket.isEditable(params.newTicketFk); let newTicketIsEditable = await Self.app.models.Ticket.isEditable(params.newTicketFk);
if (!newTicketIsEditable) if (!newTicketIsEditable)
throw new Error(`The sales of that ticket can't be modified`); throw new UserError(`The sales of that ticket can't be modified`);
for (let i = 0; i < params.sales.length; i++) { for (let i = 0; i < params.sales.length; i++) {
await Self.app.models.Sale.update({id: params.sales[i].id}, {ticketFk: params.newTicketFk}); await Self.app.models.Sale.update({id: params.sales[i].id}, {ticketFk: params.newTicketFk});

View File

@ -1,3 +1,5 @@
let UserError = require('../../helpers').UserError;
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('removes', { Self.remoteMethod('removes', {
description: 'Change the state of a ticket', description: 'Change the state of a ticket',
@ -22,7 +24,7 @@ module.exports = Self => {
Self.removes = async params => { Self.removes = async params => {
let thisTicketIsEditable = await Self.app.models.Ticket.isEditable(params.actualTicketFk); let thisTicketIsEditable = await Self.app.models.Ticket.isEditable(params.actualTicketFk);
if (!thisTicketIsEditable) if (!thisTicketIsEditable)
throw new Error(`The sales of this ticket can't be modified`); throw new UserError(`The sales of this ticket can't be modified`);
for (let i = 0; i < params.sales.length; i++) { for (let i = 0; i < params.sales.length; i++) {
await Self.app.models.Sale.destroyById(params.sales[i].id); await Self.app.models.Sale.destroyById(params.sales[i].id);

View File

@ -1,4 +1,6 @@
let UserError = require('../../helpers').UserError;
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('reserve', { Self.remoteMethod('reserve', {
description: 'Change the state of a ticket', description: 'Change the state of a ticket',
@ -23,7 +25,7 @@ module.exports = Self => {
Self.reserve = async params => { Self.reserve = async params => {
let thisTicketIsEditable = await Self.app.models.Ticket.isEditable(params.actualTicketFk); let thisTicketIsEditable = await Self.app.models.Ticket.isEditable(params.actualTicketFk);
if (!thisTicketIsEditable) if (!thisTicketIsEditable)
throw new Error(`The sales of this ticket can't be modified`); throw new UserError(`The sales of this ticket can't be modified`);
for (let i = 0; i < params.sales.length; i++) { for (let i = 0; i < params.sales.length; i++) {
await Self.app.models.Sale.update({id: params.sales[i].id}, {reserved: params.reserved}); await Self.app.models.Sale.update({id: params.sales[i].id}, {reserved: params.reserved});

View File

@ -1,3 +1,5 @@
let UserError = require('../../helpers').UserError;
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('updateDiscount', { Self.remoteMethod('updateDiscount', {
description: 'Changes the discount of a sale', description: 'Changes the discount of a sale',
@ -21,13 +23,13 @@ module.exports = Self => {
Self.updateDiscount = async params => { Self.updateDiscount = async params => {
if (isNaN(params.editLines[0].discount)) if (isNaN(params.editLines[0].discount))
throw new Error(`The value should be a number`); throw new UserError(`The value should be a number`);
let model = Self.app.models; let model = Self.app.models;
let thisTicketIsEditable = await model.Ticket.isEditable(params.editLines[0].ticketFk); let thisTicketIsEditable = await model.Ticket.isEditable(params.editLines[0].ticketFk);
if (!thisTicketIsEditable) if (!thisTicketIsEditable)
throw new Error(`The sales of this ticket can't be modified`); throw new UserError(`The sales of this ticket can't be modified`);
let ticket = await model.Ticket.find({ let ticket = await model.Ticket.find({
where: { where: {

View File

@ -1,3 +1,5 @@
let UserError = require('../../helpers').UserError;
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('updatePrice', { Self.remoteMethod('updatePrice', {
description: 'Changes the discount of a sale', description: 'Changes the discount of a sale',
@ -21,13 +23,13 @@ module.exports = Self => {
Self.updatePrice = async params => { Self.updatePrice = async params => {
if (isNaN(params.price)) if (isNaN(params.price))
throw new Error(`The value should be a number`); throw new UserError(`The value should be a number`);
if (!params.price) params.price = 0; if (!params.price) params.price = 0;
let model = Self.app.models; let model = Self.app.models;
let thisTicketIsEditable = await model.Ticket.isEditable(params.ticketFk); let thisTicketIsEditable = await model.Ticket.isEditable(params.ticketFk);
if (!thisTicketIsEditable) if (!thisTicketIsEditable)
throw new Error(`The sales of this ticket can't be modified`); throw new UserError(`The sales of this ticket can't be modified`);
let ticket = await model.Ticket.find({ let ticket = await model.Ticket.find({
where: { where: {

View File

@ -1,3 +1,5 @@
let UserError = require('../../helpers').UserError;
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('updateQuantity', { Self.remoteMethod('updateQuantity', {
description: 'Changes the quantity of a sale', description: 'Changes the quantity of a sale',
@ -26,11 +28,11 @@ module.exports = Self => {
Self.updateQuantity = async(id, quantity) => { Self.updateQuantity = async(id, quantity) => {
if (isNaN(quantity)) if (isNaN(quantity))
throw new Error(`The value should be a number`); throw new UserError(`The value should be a number`);
let currentLine = await Self.app.models.Sale.findOne({where: {id: id}, fields: ['quantity']}); let currentLine = await Self.app.models.Sale.findOne({where: {id: id}, fields: ['quantity']});
if (quantity > currentLine.quantity) if (quantity > currentLine.quantity)
throw new Error('The new quantity should be smaller than the old one'); throw new UserError('The new quantity should be smaller than the old one');
return await Self.app.models.Sale.update({id: id}, {quantity: quantity}); return await Self.app.models.Sale.update({id: id}, {quantity: quantity});
}; };

View File

@ -1,3 +1,5 @@
let UserError = require('../../helpers').UserError;
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('new', { Self.remoteMethod('new', {
description: 'Create a newticket and returns the new ID', description: 'Create a newticket and returns the new ID',
@ -22,7 +24,7 @@ module.exports = Self => {
Self.new = async params => { Self.new = async params => {
let existsAddress = await Self.app.models.Address.findOne({where: {id: params.addressFk, clientFk: params.clientFk}}); let existsAddress = await Self.app.models.Address.findOne({where: {id: params.addressFk, clientFk: params.clientFk}});
if (!existsAddress) if (!existsAddress)
throw new Error(`This address doesn't exist`); throw new UserError(`This address doesn't exist`);
let query = `CALL vn.ticketCreateWithUser(?, ?, ?, ?, ?, ?, ?, ?, ?, @pe); let query = `CALL vn.ticketCreateWithUser(?, ?, ?, ?, ?, ?, ?, ?, ?, @pe);
SELECT @pe newTicketId;`; SELECT @pe newTicketId;`;

View File

@ -40,7 +40,12 @@ module.exports = function(app) {
(validation.validation == 'custom' && !validation.isExportable)) (validation.validation == 'custom' && !validation.isExportable))
continue; continue;
jsonField.push(toJson(validation)); let validationCp = Object.assign({}, validation);
if (validationCp.message)
validationCp.message = req.__(validationCp.message);
jsonField.push(toJson(validationCp));
} }
jsonValidations[fieldName] = jsonField; jsonValidations[fieldName] = jsonField;

View File

@ -1,3 +1,5 @@
const UserError = require('vn-loopback/common/helpers').UserError;
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('new', { Self.remoteMethod('new', {
description: 'Create a new order and returns the new ID', description: 'Create a new order and returns the new ID',
@ -26,18 +28,18 @@ module.exports = Self => {
}); });
if (client.isFreezed) if (client.isFreezed)
throw new Error(`You can't create an order for a frozen client`); throw new UserError(`You can't create an order for a frozen client`);
if (!client.isActive) if (!client.isActive)
throw new Error(`You can't create an order for a inactive client`); throw new UserError(`You can't create an order for a inactive client`);
if (!client.isTaxDataChecked) if (!client.isTaxDataChecked)
throw new Error(`You can't create an order for a client that doesn't has tax data verified`); throw new UserError(`You can't create an order for a client that doesn't has tax data verified`);
let query = `SELECT vn.clientGetDebt(?, CURDATE()) AS debt`; let query = `SELECT vn.clientGetDebt(?, CURDATE()) AS debt`;
let clientDebt = await Self.rawSql(query, [cli.clientFk]); let clientDebt = await Self.rawSql(query, [cli.clientFk]);
if (clientDebt[0].debt > 0) if (clientDebt[0].debt > 0)
throw new Error(`You can't create an order for a client that has a debt`); throw new UserError(`You can't create an order for a client that has a debt`);
query = `CALL vn.orderListCreate(?, ?, ?, ?);`; query = `CALL vn.orderListCreate(?, ?, ?, ?);`;
[result] = await Self.rawSql(query, [ [result] = await Self.rawSql(query, [

View File

@ -14,6 +14,7 @@
"license": "GPL-3.0", "license": "GPL-3.0",
"description": "vn-order", "description": "vn-order",
"dependencies": { "dependencies": {
"uuid": "^3.1.0" "uuid": "^3.1.0",
"vn-loopback": "file:../loopback"
} }
} }

View File

@ -1,4 +1,4 @@
var vnLoopback = require('../../loopback/server/server.js'); var vnLoopback = require('vn-loopback/server/server.js');
var app = module.exports = vnLoopback.loopback(); var app = module.exports = vnLoopback.loopback();
vnLoopback.boot(app, __dirname, module); vnLoopback.boot(app, __dirname, module);

View File

@ -14,6 +14,7 @@
"license": "GPL-3.0", "license": "GPL-3.0",
"description": "vn-production", "description": "vn-production",
"dependencies": { "dependencies": {
"uuid": "^3.1.0" "uuid": "^3.1.0",
"vn-loopback": "file:../loopback"
} }
} }

View File

@ -1,4 +1,4 @@
var vnLoopback = require('../../loopback/server/server.js'); var vnLoopback = require('vn-loopback/server/server.js');
var app = module.exports = vnLoopback.loopback(); var app = module.exports = vnLoopback.loopback();
vnLoopback.boot(app, __dirname, module); vnLoopback.boot(app, __dirname, module);

View File

@ -7,6 +7,9 @@
"start": "node .", "start": "node .",
"posttest": "npm run lint && nsp check" "posttest": "npm run lint && nsp check"
}, },
"dependencies": {
"vn-loopback": "file:../loopback"
},
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://git.verdnatura.es/salix" "url": "https://git.verdnatura.es/salix"

View File

@ -1,5 +1,5 @@
var vnLoopback = require('../../loopback/server/server.js'); var vnLoopback = require('vn-loopback/server/server.js');
var app = module.exports = vnLoopback.loopback(); var app = module.exports = vnLoopback.loopback();
vnLoopback.boot(app, __dirname, module); vnLoopback.boot(app, __dirname, module);

View File

@ -8,7 +8,8 @@
"posttest": "npm run lint && nsp check" "posttest": "npm run lint && nsp check"
}, },
"dependencies": { "dependencies": {
"cookie-parser": "^1.4.3" "cookie-parser": "^1.4.3",
"vn-loopback": "file:../loopback"
}, },
"repository": { "repository": {
"type": "git", "type": "git",

View File

@ -1,6 +1,6 @@
var cookieParser = require('cookie-parser'); var cookieParser = require('cookie-parser');
var vnLoopback = require('../../loopback/server/server.js'); var vnLoopback = require('vn-loopback/server/server.js');
var app = module.exports = vnLoopback.loopback(); var app = module.exports = vnLoopback.loopback();

View File

@ -1,3 +1,5 @@
const UserError = require('vn-loopback/common/helpers').UserError;
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('changeState', { Self.remoteMethod('changeState', {
description: 'Change the state of a ticket', description: 'Change the state of a ticket',
@ -24,6 +26,6 @@ module.exports = Self => {
if (isEditable) if (isEditable)
return await Self.app.models.TicketTracking.create(params); return await Self.app.models.TicketTracking.create(params);
throw new Error(`You don't have enough privileges to change the state of this ticket`); throw new UserError(`You don't have enough privileges to change the state of this ticket`);
}; };
}; };

View File

@ -7,6 +7,9 @@
"start": "node .", "start": "node .",
"posttest": "npm run lint && nsp check" "posttest": "npm run lint && nsp check"
}, },
"dependencies": {
"vn-loopback": "file:../loopback"
},
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://git.verdnatura.es/salix" "url": "https://git.verdnatura.es/salix"

View File

@ -1,5 +1,5 @@
var vnLoopback = require('../../loopback/server/server.js'); var vnLoopback = require('vn-loopback/server/server.js');
var app = module.exports = vnLoopback.loopback(); var app = module.exports = vnLoopback.loopback();
vnLoopback.boot(app, __dirname, module); vnLoopback.boot(app, __dirname, module);