Reviewed-on: #2298 Reviewed-by: Alex Moreno <alexm@verdnatura.es>
This commit is contained in:
commit
2b0ab1816f
|
@ -0,0 +1,24 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`worker_checkMultipleDevice`(
|
||||
vSelf INT
|
||||
)
|
||||
BEGIN
|
||||
/**
|
||||
* Verify if a worker has multiple assigned devices,
|
||||
* except for freelancers.
|
||||
*
|
||||
* @param vUserFk worker id.
|
||||
*/
|
||||
DECLARE vHasPda BOOLEAN;
|
||||
DECLARE vIsFreelance BOOLEAN;
|
||||
DECLARE vMaxDevicesPerUser INT;
|
||||
|
||||
SELECT COUNT(*) INTO vHasPda FROM deviceProductionUser WHERE userFk = vSelf;
|
||||
SELECT IFNULL(isFreelance, FALSE) INTO vIsFreelance FROM worker WHERE id = vSelf;
|
||||
SELECT IFNULL(maxDevicesPerUser, FALSE) INTO vMaxDevicesPerUser FROM deviceProductionConfig LIMIT 1;
|
||||
|
||||
IF NOT vIsFreelance AND vHasPda > vMaxDevicesPerUser THEN
|
||||
CALL util.throw('You can only have one PDA');
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -0,0 +1,8 @@
|
|||
DELIMITER $$
|
||||
CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`deviceProductionUser_afterInsert`
|
||||
AFTER INSERT ON `deviceProductionUser`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
CALL worker_checkMultipleDevice(NEW.userFk);
|
||||
END$$
|
||||
DELIMITER ;
|
|
@ -3,6 +3,8 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`deviceProductionUser_
|
|||
BEFORE UPDATE ON `deviceProductionUser`
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
|
||||
CALL worker_checkMultipleDevice(NEW.userFk);
|
||||
SET NEW.editorFk = account.myUser_getId();
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
ALTER TABLE vn.deviceProductionUser DROP INDEX IF EXISTS deviceProductionUser_UN;
|
||||
|
||||
ALTER TABLE vn.deviceProductionUser DROP FOREIGN KEY IF EXISTS deviceProductionUser_FK;
|
||||
|
||||
ALTER TABLE vn.deviceProductionUser DROP PRIMARY KEY;
|
||||
|
||||
ALTER TABLE vn.deviceProductionUser ADD IF NOT EXISTS id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY FIRST;
|
||||
|
||||
ALTER TABLE vn.deviceProductionUser ADD CONSTRAINT deviceProductionUser_deviceProduction_FK FOREIGN KEY IF NOT EXISTS (deviceProductionFk) REFERENCES vn.deviceProduction(id);
|
||||
|
||||
ALTER TABLE vn.deviceProductionUser ADD CONSTRAINT deviceProductionUser_unique UNIQUE KEY IF NOT EXISTS (deviceProductionFk);
|
||||
|
||||
ALTER TABLE vn.deviceProductionUser ADD IF NOT EXISTS simSerialNumber TEXT NULL;
|
||||
|
||||
ALTER TABLE vn.deviceProductionConfig ADD IF NOT EXISTS maxDevicesPerUser INT UNSIGNED NULL;
|
||||
|
||||
UPDATE vn.deviceProductionConfig SET maxDevicesPerUser=1 WHERE id=1;
|
||||
|
||||
INSERT IGNORE INTO salix.ACL (model,property,accessType,permission,principalType,principalId)
|
||||
VALUES ('Worker','getAvailablePda','READ','ALLOW','ROLE','hr');
|
||||
|
|
@ -223,7 +223,8 @@
|
|||
"printerNotExists": "The printer does not exist",
|
||||
"There are not picking tickets": "There are not picking tickets",
|
||||
"ticketCommercial": "The ticket {{ ticket }} for the salesperson {{ salesMan }} is in preparation. (automatically generated message)",
|
||||
"This password can only be changed by the user themselves": "This password can only be changed by the user themselves",
|
||||
"They're not your subordinate": "They're not your subordinate",
|
||||
"InvoiceIn is already booked": "InvoiceIn is already booked"
|
||||
}
|
||||
"This password can only be changed by the user themselves": "This password can only be changed by the user themselves",
|
||||
"They're not your subordinate": "They're not your subordinate",
|
||||
"InvoiceIn is already booked": "InvoiceIn is already booked",
|
||||
"This workCenter is already assigned to this agency": "This workCenter is already assigned to this agency"
|
||||
}
|
|
@ -355,6 +355,7 @@
|
|||
"No results found": "No se han encontrado resultados",
|
||||
"InvoiceIn is already booked": "La factura recibida está contabilizada",
|
||||
"This workCenter is already assigned to this agency": "Este centro de trabajo ya está asignado a esta agencia",
|
||||
"Select ticket or client": "Elija un ticket o un client",
|
||||
"It was not able to create the invoice": "No se pudo crear la factura"
|
||||
}
|
||||
"Select ticket or client": "Elija un ticket o un client",
|
||||
"It was not able to create the invoice": "No se pudo crear la factura",
|
||||
"This PDA is already assigned to another user": "This PDA is already assigned to another user"
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
module.exports = Self => {
|
||||
Self.remoteMethod('getAvailablePda', {
|
||||
description: 'returns devices without user',
|
||||
accessType: 'READ',
|
||||
accepts: [],
|
||||
returns: {
|
||||
type: 'array',
|
||||
root: true
|
||||
},
|
||||
http: {
|
||||
path: `/getAvailablePda`,
|
||||
verb: 'GET'
|
||||
}
|
||||
});
|
||||
Self.getAvailablePda = async() => {
|
||||
return Self.app.models.DeviceProduction.rawSql(
|
||||
`SELECT d.*
|
||||
FROM deviceProduction d
|
||||
LEFT JOIN deviceProductionUser du ON du.deviceProductionFk = d.id
|
||||
WHERE du.deviceProductionFk IS NULL`
|
||||
);
|
||||
};
|
||||
};
|
|
@ -0,0 +1,13 @@
|
|||
const models = require('vn-loopback/server/server').models;
|
||||
|
||||
describe('worker getAvailablePda()', () => {
|
||||
it('should return a Pda that has no user assigned', async() => {
|
||||
const [{id}] = await models.Worker.getAvailablePda();
|
||||
|
||||
const deviceProductionUser = await models.DeviceProductionUser.findOne({
|
||||
where: {deviceProductionFk: id}
|
||||
});
|
||||
|
||||
expect(!deviceProductionUser).toBeTruthy();
|
||||
});
|
||||
});
|
|
@ -0,0 +1,8 @@
|
|||
const UserError = require('vn-loopback/util/user-error');
|
||||
module.exports = Self => {
|
||||
Self.rewriteDbError(function(err) {
|
||||
if (err.code === 'ER_DUP_ENTRY')
|
||||
return new UserError(`This PDA is already assigned to another user`);
|
||||
return err;
|
||||
});
|
||||
};
|
|
@ -14,6 +14,10 @@
|
|||
}
|
||||
},
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "number",
|
||||
"id": true
|
||||
},
|
||||
"deviceProductionFk": {
|
||||
"type": "number",
|
||||
"id": true
|
||||
|
@ -21,6 +25,9 @@
|
|||
"userFk": {
|
||||
"type": "number"
|
||||
},
|
||||
"simSerialNumber": {
|
||||
"type": "string"
|
||||
},
|
||||
"created": {
|
||||
"type": "date"
|
||||
}
|
||||
|
@ -28,7 +35,7 @@
|
|||
"relations": {
|
||||
"deviceProduction": {
|
||||
"type": "belongsTo",
|
||||
"model": "DeviceProduction",
|
||||
"model": "DeviceProduction",
|
||||
"foreignKey": "deviceProductionFk"
|
||||
},
|
||||
"user": {
|
||||
|
@ -36,5 +43,10 @@
|
|||
"model": "User",
|
||||
"foreignKey": "userFk"
|
||||
}
|
||||
},
|
||||
"scope": {
|
||||
"include":{
|
||||
"relation": "deviceProduction"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@ module.exports = Self => {
|
|||
require('../methods/worker/search')(Self);
|
||||
require('../methods/worker/isAuthorized')(Self);
|
||||
require('../methods/worker/setPassword')(Self);
|
||||
require('../methods/worker/getAvailablePda')(Self);
|
||||
|
||||
Self.validateAsync('fi', tinIsValid, {
|
||||
message: 'Invalid TIN'
|
||||
|
|
Loading…
Reference in New Issue