Fixed locales: client & back-end validations, back-end UserError. #464
This commit is contained in:
parent
b6cc14065e
commit
ff0f0436af
|
@ -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>
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
|
@ -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()
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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",
|
||||||
|
|
|
@ -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'));
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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'
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -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"
|
||||||
}
|
}
|
|
@ -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"
|
||||||
}
|
}
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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},
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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});
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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});
|
||||||
|
|
|
@ -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: {
|
||||||
|
|
|
@ -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: {
|
||||||
|
|
|
@ -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});
|
||||||
};
|
};
|
||||||
|
|
|
@ -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;`;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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, [
|
||||||
|
|
|
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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`);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue