validate client credit

This commit is contained in:
Dani Herrero 2017-10-04 08:18:31 +02:00
parent 2db36a56bb
commit 627d27ad51
1 changed files with 32 additions and 30 deletions

View File

@ -2,7 +2,7 @@ var app = require('../../server/server');
module.exports = function(Client) { module.exports = function(Client) {
var models = app.models; var models = app.models;
var loopBackContext = require('loopback-context');
// Methods // Methods
require('../methods/client/activate.js')(Client); require('../methods/client/activate.js')(Client);
@ -69,20 +69,22 @@ module.exports = function(Client) {
done(); done();
}); });
} }
/*
Client.validateAsync('credit', validateCredit, { Client.validateAsync('credit', validateCredit, {
message: 'No tienes privilegios para modificar el crédito' message: 'No tienes privilegios para modificar el crédito'
}); });
function validateCredit(err, done) { function validateCredit(err, done) {
// FIXME: Id del usuario actual let ctx = loopBackContext.getCurrentContext();
let userId = 1; let accessToken = ctx && ctx.get('accessToken');
let userId = accessToken.userId;
let self = this;
// Comprueba si el rol del usuario puede asignar esa cantidad // Comprueba si el rol del usuario puede asignar esa cantidad
// para ello mira que roles pueden asignar la cantidad que el usuario ha indicado
let filter = { let filter = {
fields: ['roleFk'], fields: ['roleFk'],
where: { where: {
maxAmount: {gt: this.credit} maxAmount: {gt: self.credit}
} }
}; };
models.ClientCreditLimit.find(filter, models.ClientCreditLimit.find(filter,
@ -102,47 +104,47 @@ module.exports = function(Client) {
(_, res) => roleCb(_, res)); (_, res) => roleCb(_, res));
} }
function roleCb(_, count) { function roleCb(_, count) {
//si el usuario no tiene alguno de los roles no continua
if (!(count > 0)) { if (!(count > 0)) {
err(); err();
done(); done();
} else } else
validate(); validate(); //si tiene el rol hay que validar que el último movimiento no fuese crédito 0 insertado por gerencia
} }
// Si se puso a 0 por gerencia, solo gerencia puede aumentarlo // Si se puso a 0 por gerencia, solo gerencia puede aumentarlo
function validate() { function validate() {
let query = 'SELECT MAX(created) created FROM ClientCredit WHERE clientFk = ?'; let query = 'SELECT * FROM ClientCredit WHERE clientFk = ? ORDER BY created DESC LIMIT 1';
Client.dataSource.connector.execute (query, [this.id], Client.dataSource.connector.execute (query, [self.id],
(_, res) => maxCb(_, res)); (_, res) => maxCb(_, res));
} }
function maxCb(_, instances) { function maxCb(_, instances) {
if (instances.length !== 1) { //console.log('maxCb', instances);
if (instances && (instances.length !== 1 || instances[0].employeeFk == userId || instances[0].amount > 0)) {
done(); done();
return; return;
} }
//el ultimo registro tiene valor 0, hay que comprobar que no fue editado por un gerente
let sql = `SELECT count(distinct r.id) as hasManagerRole
FROM ClientCredit cc
JOIN Employee em ON (em.id = cc.employeeFk)
JOIN Account ac ON (ac.id = em.userFk)
JOIN RoleMapping rm ON (rm.principalId = ac.id)
JOIN Role r on (r.id = rm.roleId)
WHERE rm.principalType = 'USER'
AND cc.employeeFk = ${instances[0].employeeFk}
AND r.\`name\` = 'manager'`;
let filter = { Client.dataSource.connector.execute(sql, [], (_, res) => clientCreditCb(_, res));
fields: ['amount', 'employeeFk', 'employee'],
where: {
clientFk: this.id,
created: instances[0].created
},
include: {
relation: 'employee',
scope: {
fields: ['userFk']
}
}
};
models.ClientCredit.findOne(filter,
(_, res) => clientCreditCb(_, res));
} }
function clientCreditCb(_, instance) {
if (instance.amount == 0 && instance.employee.userFk != userId) function clientCreditCb(_, instance) {
if (instance.length && instance[0].hasManagerRole > 0 )
err(); err();
done(); done();
} }
} }
*/
}; };