#7187 add pda freelancers #2298
|
@ -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`
|
BEFORE UPDATE ON `deviceProductionUser`
|
||||||
FOR EACH ROW
|
FOR EACH ROW
|
||||||
BEGIN
|
BEGIN
|
||||||
|
|
||||||
|
CALL worker_checkMultipleDevice(NEW.userFk);
|
||||||
SET NEW.editorFk = account.myUser_getId();
|
SET NEW.editorFk = account.myUser_getId();
|
||||||
END$$
|
END$$
|
||||||
DELIMITER ;
|
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');
|
||||||
|
|
|
@ -225,5 +225,6 @@
|
||||||
"ticketCommercial": "The ticket {{ ticket }} for the salesperson {{ salesMan }} is in preparation. (automatically generated message)",
|
"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",
|
"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",
|
"They're not your subordinate": "They're not your subordinate",
|
||||||
"InvoiceIn is already booked": "InvoiceIn is already booked"
|
"InvoiceIn is already booked": "InvoiceIn is already booked",
|
||||||
|
"This workCenter is already assigned to this agency": "This workCenter is already assigned to this agency"
|
||||||
}
|
}
|
|
@ -356,5 +356,6 @@
|
||||||
"InvoiceIn is already booked": "La factura recibida está contabilizada",
|
"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",
|
"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",
|
"Select ticket or client": "Elija un ticket o un client",
|
||||||
"It was not able to create the invoice": "No se pudo crear la factura"
|
"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": {
|
"properties": {
|
||||||
|
"id": {
|
||||||
|
"type": "number",
|
||||||
|
"id": true
|
||||||
|
},
|
||||||
"deviceProductionFk": {
|
"deviceProductionFk": {
|
||||||
"type": "number",
|
"type": "number",
|
||||||
"id": true
|
"id": true
|
||||||
|
@ -21,6 +25,9 @@
|
||||||
"userFk": {
|
"userFk": {
|
||||||
"type": "number"
|
"type": "number"
|
||||||
},
|
},
|
||||||
|
"simSerialNumber": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"created": {
|
"created": {
|
||||||
"type": "date"
|
"type": "date"
|
||||||
}
|
}
|
||||||
|
@ -36,5 +43,10 @@
|
||||||
"model": "User",
|
"model": "User",
|
||||||
"foreignKey": "userFk"
|
"foreignKey": "userFk"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"scope": {
|
||||||
|
"include":{
|
||||||
|
"relation": "deviceProduction"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ module.exports = Self => {
|
||||||
require('../methods/worker/search')(Self);
|
require('../methods/worker/search')(Self);
|
||||||
require('../methods/worker/isAuthorized')(Self);
|
require('../methods/worker/isAuthorized')(Self);
|
||||||
require('../methods/worker/setPassword')(Self);
|
require('../methods/worker/setPassword')(Self);
|
||||||
|
require('../methods/worker/getAvailablePda')(Self);
|
||||||
|
|
||||||
Self.validateAsync('fi', tinIsValid, {
|
Self.validateAsync('fi', tinIsValid, {
|
||||||
message: 'Invalid TIN'
|
message: 'Invalid TIN'
|
||||||
|
|
Loading…
Reference in New Issue
Traducir