#7896 - 24.36 Dev To Test #2884
|
@ -24,6 +24,10 @@ module.exports = Self => {
|
||||||
arg: 'lang',
|
arg: 'lang',
|
||||||
type: 'string',
|
type: 'string',
|
||||||
description: 'The user lang'
|
description: 'The user lang'
|
||||||
|
}, {
|
||||||
|
arg: 'twoFactor',
|
||||||
|
type: 'string',
|
||||||
|
description: 'The user twoFactor'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
http: {
|
http: {
|
||||||
|
@ -32,8 +36,8 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.updateUser = async(ctx, id, name, nickname, email, lang) => {
|
Self.updateUser = async(ctx, id, name, nickname, email, lang, twoFactor) => {
|
||||||
await Self.userSecurity(ctx, id);
|
await Self.userSecurity(ctx, id);
|
||||||
await Self.upsertWithWhere({id}, {name, nickname, email, lang});
|
await Self.upsertWithWhere({id}, {name, nickname, email, lang, twoFactor});
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -118,6 +118,9 @@
|
||||||
"NotificationSubscription": {
|
"NotificationSubscription": {
|
||||||
"dataSource": "vn"
|
"dataSource": "vn"
|
||||||
},
|
},
|
||||||
|
"OrmConfig": {
|
||||||
|
"dataSource": "vn"
|
||||||
|
},
|
||||||
"Province": {
|
"Province": {
|
||||||
"dataSource": "vn"
|
"dataSource": "vn"
|
||||||
},
|
},
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
{
|
||||||
|
"name": "OrmConfig",
|
||||||
|
"base": "VnModel",
|
||||||
|
"options": {
|
||||||
|
"mysql": {
|
||||||
|
"table": "ormConfig"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"properties": {
|
||||||
|
"id": {
|
||||||
|
"type": "number",
|
||||||
|
"id": true
|
||||||
|
},
|
||||||
|
"selectLimit": {
|
||||||
|
"type": "number"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"acls": [
|
||||||
|
{
|
||||||
|
"accessType": "*",
|
||||||
|
"principalType": "ROLE",
|
||||||
|
"principalId": "$authenticated",
|
||||||
|
"permission": "ALLOW"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -101,9 +101,10 @@ module.exports = function(Self) {
|
||||||
const headers = httpRequest.headers;
|
const headers = httpRequest.headers;
|
||||||
const origin = headers.origin;
|
const origin = headers.origin;
|
||||||
|
|
||||||
const defaultHash = '/reset-password?access_token=$token$';
|
const defaultHash = '!/reset-password?access_token=$token$';
|
||||||
const recoverHashes = {
|
const recoverHashes = {
|
||||||
hedera: 'verificationToken=$token$'
|
hedera: '!verificationToken=$token$',
|
||||||
|
lilium: '/resetPassword?access_token=$token$'
|
||||||
};
|
};
|
||||||
|
|
||||||
const app = info.options?.app;
|
const app = info.options?.app;
|
||||||
|
@ -115,7 +116,7 @@ module.exports = function(Self) {
|
||||||
const params = {
|
const params = {
|
||||||
recipient: info.email,
|
recipient: info.email,
|
||||||
lang: user.lang,
|
lang: user.lang,
|
||||||
url: origin + '/#!' + recoverHash
|
url: origin + '/#' + recoverHash
|
||||||
};
|
};
|
||||||
|
|
||||||
const options = Object.assign({}, info.options);
|
const options = Object.assign({}, info.options);
|
||||||
|
|
|
@ -412,7 +412,7 @@ INSERT INTO `vn`.`clientManaCache`(`clientFk`, `mana`, `dated`)
|
||||||
(1103, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)),
|
(1103, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)),
|
||||||
(1104, -30, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH));
|
(1104, -30, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH));
|
||||||
|
|
||||||
INSERT INTO `vn`.`mandateType`(`id`, `name`)
|
INSERT INTO `vn`.`mandateType`(`id`, `code`)
|
||||||
VALUES
|
VALUES
|
||||||
(1, 'B2B'),
|
(1, 'B2B'),
|
||||||
(2, 'CORE'),
|
(2, 'CORE'),
|
||||||
|
@ -632,7 +632,7 @@ INSERT INTO `vn`.`invoiceOutSerial` (`code`, `description`, `isTaxed`, `taxAreaF
|
||||||
('A', 'Global nacional', 1, 'NATIONAL', 0, 'global'),
|
('A', 'Global nacional', 1, 'NATIONAL', 0, 'global'),
|
||||||
('T', 'Española rapida', 1, 'NATIONAL', 0, 'quick'),
|
('T', 'Española rapida', 1, 'NATIONAL', 0, 'quick'),
|
||||||
('V', 'Intracomunitaria global', 0, 'CEE', 1, 'global'),
|
('V', 'Intracomunitaria global', 0, 'CEE', 1, 'global'),
|
||||||
('M', 'Múltiple nacional', 1, 'NATIONAL', 0, 'quick'),
|
('M', 'Múltiple nacional', 1, 'NATIONAL', 0, 'multiple'),
|
||||||
('R', 'Rectificativa', 1, 'NATIONAL', 0, NULL),
|
('R', 'Rectificativa', 1, 'NATIONAL', 0, NULL),
|
||||||
('E', 'Exportación rápida', 0, 'WORLD', 0, 'quick');
|
('E', 'Exportación rápida', 0, 'WORLD', 0, 'quick');
|
||||||
|
|
||||||
|
@ -743,45 +743,45 @@ INSERT INTO `vn`.`route`(`id`, `time`, `workerFk`, `created`, `vehicleFk`, `agen
|
||||||
(6, NULL, 57, util.VN_CURDATE(), 5, 7, 'sixth route', 1.7, 60, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 3),
|
(6, NULL, 57, util.VN_CURDATE(), 5, 7, 'sixth route', 1.7, 60, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 3),
|
||||||
(7, NULL, 57, util.VN_CURDATE(), 6, 8, 'seventh route', 0, 70, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 5);
|
(7, NULL, 57, util.VN_CURDATE(), 6, 8, 'seventh route', 0, 70, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 5);
|
||||||
|
|
||||||
INSERT INTO `vn`.`ticket`(`id`, `priority`, `agencyModeFk`,`warehouseFk`,`routeFk`, `shipped`, `landed`, `clientFk`,`nickname`, `addressFk`, `refFk`, `isDeleted`, `zoneFk`, `zonePrice`, `zoneBonus`, `created`, `weight`, `cmrFk`)
|
INSERT INTO `vn`.`ticket`(`id`, `priority`, `agencyModeFk`,`warehouseFk`,`routeFk`, `shipped`, `landed`, `clientFk`,`nickname`, `addressFk`, `refFk`, `isDeleted`, `zoneFk`, `zonePrice`, `zoneBonus`, `created`, `weight`, `cmrFk`, `problem`, `risk`)
|
||||||
VALUES
|
VALUES
|
||||||
(1 , 3, 1, 1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -1 MONTH), INTERVAL +1 DAY), 1101, 'Bat cave', 121, NULL, 0, 1, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 1),
|
(1 , 3, 1, 1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -1 MONTH), INTERVAL +1 DAY), 1101, 'Bat cave', 121, NULL, 0, 1, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 1, 'hasHighRisk', 901.4),
|
||||||
(2 , 1, 1, 1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -1 MONTH), INTERVAL +1 DAY), 1101, 'Bat cave', 1, NULL, 0, 1, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 2),
|
(2 , 1, 1, 1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -1 MONTH), INTERVAL +1 DAY), 1101, 'Bat cave', 1, NULL, 0, 1, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 2, 'hasHighRisk', 901.4),
|
||||||
(3 , 1, 7, 1, 6, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -2 MONTH), INTERVAL +1 DAY), 1104, 'Stark tower', 124, NULL, 0, 3, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), NULL, 3),
|
(3 , 1, 7, 1, 6, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -2 MONTH), INTERVAL +1 DAY), 1104, 'Stark tower', 124, NULL, 0, 3, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), NULL, 3, NULL, NULL),
|
||||||
(4 , 3, 2, 1, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -3 MONTH), INTERVAL +1 DAY), 1104, 'Stark tower', 124, NULL, 0, 9, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH), NULL, NULL),
|
(4 , 3, 2, 1, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -3 MONTH), INTERVAL +1 DAY), 1104, 'Stark tower', 124, NULL, 0, 9, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH), NULL, NULL, NULL, NULL),
|
||||||
(5 , 3, 3, 3, 3, DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -4 MONTH), INTERVAL +1 DAY), 1104, 'Stark tower', 124, NULL, 0, 10, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH), NULL, NULL),
|
(5 , 3, 3, 3, 3, DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -4 MONTH), INTERVAL +1 DAY), 1104, 'Stark tower', 124, NULL, 0, 10, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH), NULL, NULL, NULL, NULL),
|
||||||
(6 , 1, 3, 3, 3, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -1 MONTH), INTERVAL +1 DAY), 1101, 'Mountain Drive Gotham', 1, NULL, 0, 10, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), NULL, NULL),
|
(6 , 1, 3, 3, 3, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL -1 MONTH), INTERVAL +1 DAY), 1101, 'Mountain Drive Gotham', 1, NULL, 0, 10, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), NULL, NULL, 'hasHighRisk', 901.4),
|
||||||
(7 , NULL, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1101, 'Mountain Drive Gotham', 1, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL, NULL),
|
(7 , NULL, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1101, 'Mountain Drive Gotham', 1, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL, NULL, 'hasHighRisk', 901.4),
|
||||||
(8 , NULL, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1101, 'Bat cave', 121, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL, NULL),
|
(8 , NULL, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1101, 'Bat cave', 121, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL, NULL, 'hasHighRisk', 901.4),
|
||||||
(9 , NULL, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1104, 'Stark tower', 124, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL, NULL),
|
(9 , NULL, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1104, 'Stark tower', 124, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL, NULL, NULL, NULL),
|
||||||
(10, 1, 1, 5, 1, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1102, 'Ingram Street', 2, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL, NULL),
|
(10, 1, 1, 5, 1, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1102, 'Ingram Street', 2, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL, NULL, 'isTooLittle', NULL),
|
||||||
(11, 1, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1102, 'NY roofs', 122, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL, NULL),
|
(11, 1, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1102, 'NY roofs', 122, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL, NULL, 'hasTicketRequest', NULL),
|
||||||
(12, 1, 8, 1, 1, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL, NULL),
|
(12, 1, 8, 1, 1, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL, NULL, NULL, NULL),
|
||||||
(13, 1, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1103, 'Phone Box', 123, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL, NULL),
|
(13, 1, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1103, 'Phone Box', 123, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL, NULL, NULL, NULL),
|
||||||
(14, 1, 2, 1, NULL, util.VN_CURDATE(), util.VN_CURDATE(), 1104, 'Malibu Point', 4, NULL, 0, 9, 5, 1, util.VN_CURDATE(), NULL, NULL),
|
(14, 1, 2, 1, NULL, util.VN_CURDATE(), util.VN_CURDATE(), 1104, 'Malibu Point', 4, NULL, 0, 9, 5, 1, util.VN_CURDATE(), NULL, NULL, NULL, NULL),
|
||||||
(15, 1, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1105, 'An incredibly long alias for testing purposes', 125, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL, NULL),
|
(15, 1, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1105, 'An incredibly long alias for testing purposes', 125, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL, NULL, 'isFreezed', NULL),
|
||||||
(16, 1, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1106, 'Many Places', 126, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL, NULL),
|
(16, 1, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1106, 'Many Places', 126, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL, NULL, NULL, 388.7),
|
||||||
(17, 1, 7, 2, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1106, 'Many Places', 126, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL, NULL),
|
(17, 1, 7, 2, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1106, 'Many Places', 126, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL, NULL, NULL, 388.7),
|
||||||
(18, 1, 4, 4, 4, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1108, 'Cerebro', 128, NULL, 0, 12, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +12 HOUR), NULL, NULL),
|
(18, 1, 4, 4, 4, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1108, 'Cerebro', 128, NULL, 0, 12, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +12 HOUR), NULL, NULL, 'isFreezed', NULL),
|
||||||
(19, 1, 5, 5, NULL, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1109, 'Somewhere in Thailand', 129, NULL, 1, NULL, 5, 1, util.VN_CURDATE(), NULL, NULL),
|
(19, 1, 5, 5, NULL, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1109, 'Somewhere in Thailand', 129, NULL, 1, NULL, 5, 1, util.VN_CURDATE(), NULL, NULL, 'isTaxDataChecked', NULL),
|
||||||
(20, 1, 5, 5, 3, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL +1 MONTH), INTERVAL +1 DAY), 1109, 'Somewhere in Thailand', 129, NULL, 0, 13, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), NULL, NULL),
|
(20, 1, 5, 5, 3, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL +1 MONTH), INTERVAL +1 DAY), 1109, 'Somewhere in Thailand', 129, NULL, 0, 13, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), NULL, NULL, 'isTaxDataChecked', NULL),
|
||||||
(21, NULL, 5, 5, 5, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL +1 MONTH), INTERVAL +1 DAY), 1109, 'Somewhere in Holland', 102, NULL, 0, 13, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), NULL, NULL),
|
(21, NULL, 5, 5, 5, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL +1 MONTH), INTERVAL +1 DAY), 1109, 'Somewhere in Holland', 102, NULL, 0, 13, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), NULL, NULL, 'isTaxDataChecked', NULL),
|
||||||
(22, NULL, 5, 5, 5, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL +1 MONTH), INTERVAL +1 DAY), 1109, 'Somewhere in Japan', 103, NULL, 0, 13, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), NULL, NULL),
|
(22, NULL, 5, 5, 5, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL +1 MONTH), INTERVAL +1 DAY), 1109, 'Somewhere in Japan', 103, NULL, 0, 13, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), NULL, NULL, 'isTaxDataChecked', NULL),
|
||||||
(23, NULL, 8, 1, 7, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1101, 'address 21', 121, NULL, 0, 5, 5, 1, util.VN_CURDATE(), NULL, NULL),
|
(23, NULL, 8, 1, 7, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1101, 'address 21', 121, NULL, 0, 5, 5, 1, util.VN_CURDATE(), NULL, NULL, 'hasTicketRequest, hasHighRisk', 901.4),
|
||||||
(24 ,NULL, 8, 1, 7, util.VN_CURDATE(), util.VN_CURDATE(), 1101, 'Bruce Wayne', 1, NULL, 0, 5, 5, 1, util.VN_CURDATE(), NULL, NULL),
|
(24 ,NULL, 8, 1, 7, util.VN_CURDATE(), util.VN_CURDATE(), 1101, 'Bruce Wayne', 1, NULL, 0, 5, 5, 1, util.VN_CURDATE(), NULL, NULL, 'hasHighRisk', 901.4),
|
||||||
(25 ,NULL, 8, 1, NULL, util.VN_CURDATE(), util.VN_CURDATE(), 1101, 'Bruce Wayne', 1, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL, NULL),
|
(25 ,NULL, 8, 1, NULL, util.VN_CURDATE(), util.VN_CURDATE(), 1101, 'Bruce Wayne', 1, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL, NULL, 'hasHighRisk', 901.4),
|
||||||
(26 ,NULL, 8, 1, NULL, util.VN_CURDATE(), util.VN_CURDATE(), 1101, 'An incredibly long alias for testing purposes', 1, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL, NULL),
|
(26 ,NULL, 8, 1, NULL, util.VN_CURDATE(), util.VN_CURDATE(), 1101, 'An incredibly long alias for testing purposes', 1, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL, NULL, 'hasHighRisk', 901.4),
|
||||||
(27 ,NULL, 8, 1, NULL, util.VN_CURDATE(), util.VN_CURDATE(), 1101, 'Wolverine', 1, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL, NULL),
|
(27 ,NULL, 8, 1, NULL, util.VN_CURDATE(), util.VN_CURDATE(), 1101, 'Wolverine', 1, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL, NULL, NULL, 901.4),
|
||||||
(28, 1, 8, 1, 1, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL, NULL),
|
(28, 1, 8, 1, 1, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL, NULL, NULL, NULL),
|
||||||
(29, 1, 8, 1, 1, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL, NULL),
|
(29, 1, 8, 1, 1, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL, NULL, NULL, NULL),
|
||||||
(30, 1, 8, 1, 1, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL, NULL),
|
(30, 1, 8, 1, 1, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL, NULL, NULL, NULL),
|
||||||
(31, 1, 8, 1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL + 2 DAY), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL, NULL),
|
(31, 1, 8, 1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL + 2 DAY), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL, NULL, NULL, NULL),
|
||||||
(32, 1, 8, 1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL + 2 DAY), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL, NULL),
|
(32, 1, 8, 1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL + 2 DAY), 1103, 'Phone Box', 123, NULL, 0, 1, 5, 1, util.VN_CURDATE(), NULL, NULL, NULL, NULL),
|
||||||
(33, 1, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1102, 'NY roofs', 122, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL, NULL),
|
(33, 1, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1102, 'NY roofs', 122, NULL, 0, 3, 5, 1, util.VN_CURDATE(), NULL, NULL, NULL, NULL),
|
||||||
(34, 1, 1, 1, 3, util.VN_CURDATE(), util.VN_CURDATE(), 1103, 'BEJAR', 123, NULL, 0, 1, 16, 0, util.VN_CURDATE(), NULL, NULL),
|
(34, 1, 1, 1, 3, util.VN_CURDATE(), util.VN_CURDATE(), 1103, 'BEJAR', 123, NULL, 0, 1, 16, 0, util.VN_CURDATE(), NULL, NULL, NULL, NULL),
|
||||||
(35, 1, 1, 1, 3, util.VN_CURDATE(), util.VN_CURDATE(), 1102, 'Somewhere in Philippines', 123, NULL, 0, 1, 16, 0, util.VN_CURDATE(), NULL, NULL),
|
(35, 1, 1, 1, 3, util.VN_CURDATE(), util.VN_CURDATE(), 1102, 'Somewhere in Philippines', 123, NULL, 0, 1, 16, 0, util.VN_CURDATE(), NULL, NULL, NULL, NULL),
|
||||||
(36, 1, 1, 1, 3, util.VN_CURDATE(), util.VN_CURDATE(), 1102, 'Ant-Man Adventure', 123, NULL, 0, 1, 16, 0, util.VN_CURDATE(), NULL, NULL),
|
(36, 1, 1, 1, 3, util.VN_CURDATE(), util.VN_CURDATE(), 1102, 'Ant-Man Adventure', 123, NULL, 0, 1, 16, 0, util.VN_CURDATE(), NULL, NULL, NULL, NULL),
|
||||||
(37, 1, 1, 1, 3, util.VN_CURDATE(), util.VN_CURDATE(), 1110, 'Deadpool swords', 123, NULL, 0, 1, 16, 0, util.VN_CURDATE(), NULL, NULL);
|
(37, 1, 1, 1, 3, util.VN_CURDATE(), util.VN_CURDATE(), 1110, 'Deadpool swords', 123, NULL, 0, 1, 16, 0, util.VN_CURDATE(), NULL, NULL, NULL, NULL);
|
||||||
|
|
||||||
INSERT INTO `vn`.`ticketObservation`(`id`, `ticketFk`, `observationTypeFk`, `description`)
|
INSERT INTO `vn`.`ticketObservation`(`id`, `ticketFk`, `observationTypeFk`, `description`)
|
||||||
VALUES
|
VALUES
|
||||||
|
@ -1059,50 +1059,50 @@ INSERT INTO `vn`.`ticketPackaging`(`id`, `ticketFk`, `packagingFk`, `quantity`,
|
||||||
(2, 2, 2, 1, util.VN_CURDATE(), NULL),
|
(2, 2, 2, 1, util.VN_CURDATE(), NULL),
|
||||||
(3, 3, 2, 4, util.VN_CURDATE(), NULL);
|
(3, 3, 2, 4, util.VN_CURDATE(), NULL);
|
||||||
|
|
||||||
INSERT INTO `vn`.`sale`(`id`, `itemFk`, `ticketFk`, `concept`, `quantity`, `price`, `discount`, `reserved`, `isPicked`, `created`)
|
INSERT INTO `vn`.`sale`(`id`, `itemFk`, `ticketFk`, `concept`, `quantity`, `price`, `discount`, `reserved`, `isPicked`, `created`, `problem`)
|
||||||
VALUES
|
VALUES
|
||||||
(1, 1, 1, 'Ranged weapon longbow 200cm', 5, 100.39, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)),
|
(1, 1, 1, 'Ranged weapon longbow 200cm', 5, 100.39, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 'hasComponentLack'),
|
||||||
(2, 2, 1, 'Melee weapon combat fist 15cm', 10, 7.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)),
|
(2, 2, 1, 'Melee weapon combat fist 15cm', 10, 7.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 'hasComponentLack'),
|
||||||
(3, 1, 1, 'Ranged weapon longbow 200cm', 2, 100.39, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)),
|
(3, 1, 1, 'Ranged weapon longbow 200cm', 2, 100.39, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 'hasComponentLack'),
|
||||||
(4, 4, 1, 'Melee weapon heavy shield 100cm', 20, 1.69, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)),
|
(4, 4, 1, 'Melee weapon heavy shield 100cm', 20, 1.69, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 'hasComponentLack'),
|
||||||
(5, 1, 2, 'Ranged weapon longbow 200cm', 1, 110.33, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)),
|
(5, 1, 2, 'Ranged weapon longbow 200cm', 1, 110.33, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 'hasComponentLack'),
|
||||||
(6, 1, 3, 'Ranged weapon longbow 200cm', 1, 110.33, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH)),
|
(6, 1, 3, 'Ranged weapon longbow 200cm', 1, 110.33, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), 'hasComponentLack'),
|
||||||
(7, 2, 11, 'Melee weapon combat fist 15cm', 15, 7.74, 0, 0, 0, util.VN_CURDATE()),
|
(7, 2, 11, 'Melee weapon combat fist 15cm', 15, 7.74, 0, 0, 0, util.VN_CURDATE(), NULL),
|
||||||
(8, 4, 11, 'Melee weapon heavy shield 100cm', 10, 1.79, 0, 0, 0, util.VN_CURDATE()),
|
(8, 4, 11, 'Melee weapon heavy shield 100cm', 10, 1.79, 0, 0, 0, util.VN_CURDATE(), NULL),
|
||||||
(9, 1, 16, 'Ranged weapon longbow 200cm', 1, 103.49, 0, 0, 0, util.VN_CURDATE()),
|
(9, 1, 16, 'Ranged weapon longbow 200cm', 1, 103.49, 0, 0, 0, util.VN_CURDATE(), NULL),
|
||||||
(10, 2, 16, 'Melee weapon combat fist 15cm', 10, 7.09, 0, 0, 0, util.VN_CURDATE()),
|
(10, 2, 16, 'Melee weapon combat fist 15cm', 10, 7.09, 0, 0, 0, util.VN_CURDATE(), NULL),
|
||||||
(11, 1, 16, 'Ranged weapon longbow 200cm', 1, 103.49, 0, 0, 0, util.VN_CURDATE()),
|
(11, 1, 16, 'Ranged weapon longbow 200cm', 1, 103.49, 0, 0, 0, util.VN_CURDATE(), NULL),
|
||||||
(12, 4, 16, 'Melee weapon heavy shield 100cm', 20, 1.71, 0, 0, 0, util.VN_CURDATE()),
|
(12, 4, 16, 'Melee weapon heavy shield 100cm', 20, 1.71, 0, 0, 0, util.VN_CURDATE(), NULL),
|
||||||
(13, 2, 8, 'Melee weapon combat fist 15cm', 10, 7.08, 0, 0, 0, util.VN_CURDATE()),
|
(13, 2, 8, 'Melee weapon combat fist 15cm', 10, 7.08, 0, 0, 0, util.VN_CURDATE(), NULL),
|
||||||
(14, 1, 8, 'Ranged weapon longbow 200cm', 2, 103.49, 0, 0, 0, util.VN_CURDATE()),
|
(14, 1, 8, 'Ranged weapon longbow 200cm', 2, 103.49, 0, 0, 0, util.VN_CURDATE(), NULL),
|
||||||
(15, 1, 19, 'Ranged weapon longbow 200cm', 1, 103.49, 0, 0, 0, util.VN_CURDATE()),
|
(15, 1, 19, 'Ranged weapon longbow 200cm', 1, 103.49, 0, 0, 0, util.VN_CURDATE(), NULL),
|
||||||
(16, 2, 20, 'Melee weapon combat fist 15cm', 20, 7.07, 0, 0, 0, util.VN_CURDATE()),
|
(16, 2, 20, 'Melee weapon combat fist 15cm', 20, 7.07, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
|
||||||
(17, 2, 22, 'Melee weapon combat fist 15cm', 30, 7.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH)),
|
(17, 2, 22, 'Melee weapon combat fist 15cm', 30, 7.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), 'hasComponentLack'),
|
||||||
(18, 4, 22, 'Melee weapon heavy shield 100cm', 20, 1.69, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH)),
|
(18, 4, 22, 'Melee weapon heavy shield 100cm', 20, 1.69, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), 'hasComponentLack'),
|
||||||
(19, 1, 4, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH)),
|
(19, 1, 4, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH), 'hasComponentLack'),
|
||||||
(20, 1, 5, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH)),
|
(20, 1, 5, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH), 'hasComponentLack'),
|
||||||
(21, 1, 6, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)),
|
(21, 1, 6, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 'hasComponentLack'),
|
||||||
(22, 1, 7, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, util.VN_CURDATE()),
|
(22, 1, 7, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
|
||||||
(23, 1, 9, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, util.VN_CURDATE()),
|
(23, 1, 9, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
|
||||||
(24, 1, 10, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, util.VN_CURDATE()),
|
(24, 1, 10, 'Ranged weapon longbow 200cm', 1, 8.07, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
|
||||||
(25, 4, 12, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE()),
|
(25, 4, 12, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
|
||||||
(26, 4, 13, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE()),
|
(26, 4, 13, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
|
||||||
(27, 4, 14, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE()),
|
(27, 4, 14, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
|
||||||
(28, 4, 15, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE()),
|
(28, 4, 15, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
|
||||||
(29, 4, 17, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE()),
|
(29, 4, 17, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
|
||||||
(30, 4, 18, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE()),
|
(30, 4, 18, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
|
||||||
(31, 2, 23, 'Melee weapon combat fist 15cm', -5, 7.08, 0, 0, 0, util.VN_CURDATE()),
|
(31, 2, 23, 'Melee weapon combat fist 15cm', -5, 7.08, 0, 0, 0, util.VN_CURDATE(), NULL),
|
||||||
(32, 1, 24, 'Ranged weapon longbow 200cm', -1, 8.07, 0, 0, 0, util.VN_CURDATE()),
|
(32, 1, 24, 'Ranged weapon longbow 200cm', -1, 8.07, 0, 0, 0, util.VN_CURDATE(), NULL),
|
||||||
(33, 5, 14, 'Ranged weapon pistol 9mm', 50, 1.79, 0, 0, 0, util.VN_CURDATE()),
|
(33, 5, 14, 'Ranged weapon pistol 9mm', 50, 1.79, 0, 0, 0, util.VN_CURDATE(), NULL),
|
||||||
(34, 4, 28, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE()),
|
(34, 4, 28, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
|
||||||
(35, 4, 29, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE()),
|
(35, 4, 29, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
|
||||||
(37, 4, 31, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE()),
|
(37, 4, 31, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE(), NULL),
|
||||||
(36, 4, 30, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE()),
|
(36, 4, 30, 'Melee weapon heavy shield 100cm', 20, 1.72, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
|
||||||
(38, 2, 32, 'Melee weapon combat fist 15cm', 30, 7.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH)),
|
(38, 2, 32, 'Melee weapon combat fist 15cm', 30, 7.07, 0, 0, 0, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), 'hasComponentLack'),
|
||||||
(39, 1, 32, 'Ranged weapon longbow 200cm', 2, 103.49, 0, 0, 0, util.VN_CURDATE()),
|
(39, 1, 32, 'Ranged weapon longbow 200cm', 2, 103.49, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
|
||||||
(40, 2, 34, 'Melee weapon combat fist 15cm', 10.00, 3.91, 0, 0, 0, util.VN_CURDATE()),
|
(40, 2, 34, 'Melee weapon combat fist 15cm', 10.00, 3.91, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
|
||||||
(41, 2, 35, 'Melee weapon combat fist 15cm', 8.00, 3.01, 0, 0, 0, util.VN_CURDATE()),
|
(41, 2, 35, 'Melee weapon combat fist 15cm', 8.00, 3.01, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack'),
|
||||||
(42, 2, 36, 'Melee weapon combat fist 15cm', 6.00, 2.50, 0, 0, 0, util.VN_CURDATE());
|
(42, 2, 36, 'Melee weapon combat fist 15cm', 6.00, 2.50, 0, 0, 0, util.VN_CURDATE(), 'hasComponentLack');
|
||||||
|
|
||||||
INSERT INTO `vn`.`saleComponent`(`saleFk`, `componentFk`, `value`)
|
INSERT INTO `vn`.`saleComponent`(`saleFk`, `componentFk`, `value`)
|
||||||
VALUES
|
VALUES
|
||||||
|
@ -3945,11 +3945,11 @@ VALUES
|
||||||
(35, 'ES12346B12345679', 3, 241);
|
(35, 'ES12346B12345679', 3, 241);
|
||||||
|
|
||||||
INSERT INTO vn.accountDetailType
|
INSERT INTO vn.accountDetailType
|
||||||
(id, description)
|
(id, description, code)
|
||||||
VALUES
|
VALUES
|
||||||
(1, 'IBAN'),
|
(1, 'IBAN', 'iban'),
|
||||||
(2, 'SWIFT'),
|
(2, 'SWIFT', 'swift'),
|
||||||
(3, 'Referencia Remesas'),
|
(3, 'Referencia Remesas', 'remRef'),
|
||||||
(4, 'Referencia Transferencias'),
|
(4, 'Referencia Transferencias', 'trnRef'),
|
||||||
(5, 'Referencia Nominas'),
|
(5, 'Referencia Nominas', 'payRef'),
|
||||||
(6, 'ABA');
|
(6, 'ABA', 'aba');
|
||||||
|
|
|
@ -1,13 +1,9 @@
|
||||||
DELIMITER $$
|
DELIMITER $$
|
||||||
CREATE OR REPLACE DEFINER=`root`@`localhost` EVENT `srt`.`moving_clean`
|
CREATE OR REPLACE DEFINER=`root`@`localhost` EVENT `srt`.`moving_clean`
|
||||||
ON SCHEDULE EVERY 5 MINUTE
|
ON SCHEDULE EVERY 15 MINUTE
|
||||||
STARTS '2022-01-21 00:00:00.000'
|
STARTS '2022-01-21 00:00:00.000'
|
||||||
ON COMPLETION PRESERVE
|
ON COMPLETION PRESERVE
|
||||||
ENABLE
|
ENABLE
|
||||||
COMMENT 'Llama a srt.moving_clean para que elimine y notifique de registr'
|
COMMENT 'Llama a srt.moving_clean para que elimine y notifique de registr'
|
||||||
DO BEGIN
|
DO CALL srt.moving_clean()$$
|
||||||
|
|
||||||
CALL srt.moving_clean();
|
|
||||||
|
|
||||||
END$$
|
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
|
@ -3,61 +3,69 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `srt`.`moving_clean`()
|
||||||
BEGIN
|
BEGIN
|
||||||
/**
|
/**
|
||||||
* Elimina movimientos por inactividad
|
* Elimina movimientos por inactividad
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
DECLARE vExpeditionFk INT;
|
DECLARE vExpeditionFk INT;
|
||||||
DECLARE vBufferToFk INT;
|
|
||||||
DECLARE vBufferFromFk INT;
|
DECLARE vBufferFromFk INT;
|
||||||
DECLARE done BOOL DEFAULT FALSE;
|
DECLARE vStateOutFk INT
|
||||||
|
DEFAULT (SELECT id FROM expeditionState WHERE `description` = 'OUT');
|
||||||
DECLARE cur CURSOR FOR
|
DECLARE vDone BOOL;
|
||||||
SELECT m.expeditionFk, m.bufferToFk, m.bufferFromFk
|
DECLARE vSorter CURSOR FOR
|
||||||
FROM srt.moving m
|
SELECT m.expeditionFk, m.bufferFromFk
|
||||||
JOIN srt.config c
|
FROM moving m
|
||||||
JOIN (SELECT bufferFk, SUM(isActive) hasBox
|
JOIN (
|
||||||
FROM srt.photocell
|
SELECT bufferFk, SUM(isActive) hasBox
|
||||||
GROUP BY bufferFk) sub ON sub.bufferFk = m.bufferFromFk
|
FROM photocell
|
||||||
WHERE m.created < TIMESTAMPADD(MINUTE, - c.movingMaxLife , util.VN_NOW())
|
GROUP BY bufferFk
|
||||||
|
) sub ON sub.bufferFk = m.bufferFromFk
|
||||||
|
WHERE m.created < (util.VN_NOW() - INTERVAL (SELECT movingMaxLife FROM config) MINUTE)
|
||||||
AND NOT sub.hasBox;
|
AND NOT sub.hasBox;
|
||||||
|
|
||||||
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
|
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
|
||||||
|
|
||||||
OPEN cur;
|
DECLARE EXIT HANDLER FOR SQLEXCEPTION
|
||||||
|
BEGIN
|
||||||
|
ROLLBACK;
|
||||||
|
RESIGNAL;
|
||||||
|
END;
|
||||||
|
|
||||||
bucle: LOOP
|
OPEN vSorter;
|
||||||
|
l: LOOP
|
||||||
|
SET vDone = FALSE;
|
||||||
|
FETCH vSorter INTO vExpeditionFk, vBufferFromFk;
|
||||||
|
|
||||||
FETCH cur INTO vExpeditionFk, vBufferToFk, vBufferFromFk;
|
IF vDone THEN
|
||||||
|
LEAVE l;
|
||||||
IF done THEN
|
|
||||||
LEAVE bucle;
|
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
DELETE FROM srt.moving
|
START TRANSACTION;
|
||||||
|
|
||||||
|
SELECT id
|
||||||
|
FROM moving
|
||||||
|
WHERE expeditionFk = vExpeditionFk
|
||||||
|
FOR UPDATE;
|
||||||
|
|
||||||
|
DELETE FROM moving
|
||||||
WHERE expeditionFk = vExpeditionFk;
|
WHERE expeditionFk = vExpeditionFk;
|
||||||
|
|
||||||
UPDATE srt.expedition e
|
SELECT id
|
||||||
JOIN srt.expeditionState es ON es.description = 'OUT'
|
FROM expedition
|
||||||
SET
|
WHERE id = vExpeditionFk
|
||||||
bufferFk = NULL,
|
OR (bufferFk = vBufferFromFk AND `position` > 0)
|
||||||
|
FOR UPDATE;
|
||||||
|
|
||||||
|
UPDATE expedition
|
||||||
|
SET bufferFk = NULL,
|
||||||
`position` = NULL,
|
`position` = NULL,
|
||||||
stateFk = es.id
|
stateFk = vStateOutFk
|
||||||
WHERE e.id = vExpeditionFk;
|
WHERE id = vExpeditionFk;
|
||||||
|
|
||||||
UPDATE srt.expedition e
|
UPDATE expedition
|
||||||
SET e.`position` = e.`position` - 1
|
SET `position` = `position` - 1
|
||||||
WHERE e.bufferFk = vBufferFromFk
|
WHERE bufferFk = vBufferFromFk
|
||||||
AND e.`position` > 0;
|
AND `position` > 0;
|
||||||
|
|
||||||
CALL vn.mail_insert(
|
|
||||||
'pako@verdnatura.es, carles@verdnatura.es',
|
|
||||||
NULL,
|
|
||||||
CONCAT('Moving_clean. Expedition: ', vExpeditionFk, ' estaba parada'),
|
|
||||||
CONCAT('Expedition: ', vExpeditionFk,' vBufferToFk: ', vBufferToFk)
|
|
||||||
);
|
|
||||||
|
|
||||||
END LOOP bucle;
|
|
||||||
|
|
||||||
CLOSE cur;
|
|
||||||
|
|
||||||
|
COMMIT;
|
||||||
|
END LOOP l;
|
||||||
|
CLOSE vSorter;
|
||||||
END$$
|
END$$
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `srt`.`buffer_afterDelete`
|
||||||
|
AFTER DELETE ON `buffer`
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO buffer
|
||||||
|
SET `action` = 'delete',
|
||||||
|
`changedModel` = 'Buffer',
|
||||||
|
`changedModelId` = OLD.id,
|
||||||
|
`userFk` = account.myUser_getId();
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -0,0 +1,8 @@
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `srt`.`buffer_beforeInsert`
|
||||||
|
BEFORE INSERT ON `buffer`
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
SET NEW.editorFk = account.myUser_getId();
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -0,0 +1,8 @@
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `srt`.`buffer_beforeUpdate`
|
||||||
|
BEFORE UPDATE ON `buffer`
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
SET NEW.editorFk = account.myUser_getId();
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -0,0 +1,12 @@
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `srt`.`config_afterDelete`
|
||||||
|
AFTER DELETE ON `config`
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO config
|
||||||
|
SET `action` = 'delete',
|
||||||
|
`changedModel` = 'Config',
|
||||||
|
`changedModelId` = OLD.id,
|
||||||
|
`userFk` = account.myUser_getId();
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -0,0 +1,8 @@
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `srt`.`config_beforeInsert`
|
||||||
|
BEFORE INSERT ON `config`
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
SET NEW.editorFk = account.myUser_getId();
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -0,0 +1,8 @@
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `srt`.`config_beforeUpdate`
|
||||||
|
BEFORE UPDATE ON `config`
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
SET NEW.editorFk = account.myUser_getId();
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -1,26 +1,32 @@
|
||||||
DELIMITER $$
|
DELIMITER $$
|
||||||
CREATE OR REPLACE DEFINER=`root`@`localhost` FUNCTION `vn`.`invoiceSerial`(vClientFk INT, vCompanyFk INT, vType CHAR(1))
|
CREATE OR REPLACE DEFINER=`root`@`localhost` FUNCTION `vn`.`invoiceSerial`(vClientFk INT, vCompanyFk INT, vType CHAR(15))
|
||||||
RETURNS char(1) CHARSET utf8mb3 COLLATE utf8mb3_general_ci
|
RETURNS char(2) CHARSET utf8mb3 COLLATE utf8mb3_general_ci
|
||||||
DETERMINISTIC
|
DETERMINISTIC
|
||||||
BEGIN
|
BEGIN
|
||||||
/**
|
/**
|
||||||
* Obtiene la serie de de una factura
|
* Obtiene la serie de una factura
|
||||||
* dependiendo del area del cliente.
|
* dependiendo del area del cliente.
|
||||||
*
|
*
|
||||||
* @param vClientFk Id del cliente
|
* @param vClientFk Id del cliente
|
||||||
* @param vCompanyFk Id de la empresa
|
* @param vCompanyFk Id de la empresa
|
||||||
* @param vType Tipo de factura ["R", "M", "G"]
|
* @param vType Tipo de factura ['global','multiple','quick']
|
||||||
* @return Serie de la factura
|
* @return vSerie de la factura
|
||||||
*/
|
*/
|
||||||
DECLARE vTaxArea VARCHAR(25);
|
DECLARE vTaxArea VARCHAR(25) COLLATE utf8mb3_general_ci;
|
||||||
DECLARE vSerie CHAR(1);
|
DECLARE vSerie CHAR(2);
|
||||||
|
|
||||||
IF (SELECT hasInvoiceSimplified FROM client WHERE id = vClientFk) THEN
|
IF (SELECT hasInvoiceSimplified FROM client WHERE id = vClientFk) THEN
|
||||||
RETURN 'S';
|
RETURN 'S';
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
SELECT clientTaxArea(vClientFk, vCompanyFk) INTO vTaxArea;
|
SELECT addressTaxArea(defaultAddressFk, vCompanyFk) INTO vTaxArea
|
||||||
SELECT invoiceSerialArea(vType,vTaxArea) INTO vSerie;
|
FROM client
|
||||||
|
WHERE id = vClientFk;
|
||||||
|
|
||||||
|
SELECT code INTO vSerie
|
||||||
|
FROM invoiceOutSerial
|
||||||
|
WHERE `type` = vType AND taxAreaFk = vTaxArea;
|
||||||
|
|
||||||
RETURN vSerie;
|
RETURN vSerie;
|
||||||
END$$
|
END$$
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
DELIMITER $$
|
|
||||||
CREATE OR REPLACE DEFINER=`root`@`localhost` FUNCTION `vn`.`invoiceSerialArea`(vType CHAR(1), vTaxArea VARCHAR(25))
|
|
||||||
RETURNS char(1) CHARSET utf8mb3 COLLATE utf8mb3_unicode_ci
|
|
||||||
DETERMINISTIC
|
|
||||||
BEGIN
|
|
||||||
DECLARE vSerie CHAR(1);
|
|
||||||
|
|
||||||
IF vType = 'R' THEN
|
|
||||||
SELECT
|
|
||||||
CASE vTaxArea
|
|
||||||
WHEN 'CEE' THEN 'H'
|
|
||||||
WHEN 'WORLD' THEN 'E'
|
|
||||||
ELSE 'T'
|
|
||||||
END INTO vSerie;
|
|
||||||
-- Factura multiple
|
|
||||||
ELSEIF vType = 'M' THEN
|
|
||||||
SELECT
|
|
||||||
CASE vTaxArea
|
|
||||||
WHEN 'CEE' THEN 'H'
|
|
||||||
WHEN 'WORLD' THEN 'E'
|
|
||||||
ELSE 'M'
|
|
||||||
END INTO vSerie;
|
|
||||||
-- Factura global
|
|
||||||
ELSEIF vType = 'G' THEN
|
|
||||||
SELECT
|
|
||||||
CASE vTaxArea
|
|
||||||
WHEN 'CEE' THEN 'V'
|
|
||||||
WHEN 'WORLD' THEN 'X'
|
|
||||||
ELSE 'A'
|
|
||||||
END INTO vSerie;
|
|
||||||
END IF;
|
|
||||||
RETURN vSerie;
|
|
||||||
END$$
|
|
||||||
DELIMITER ;
|
|
|
@ -9,10 +9,11 @@ BEGIN
|
||||||
DECLARE vWarehouseFk INT;
|
DECLARE vWarehouseFk INT;
|
||||||
DECLARE vWagons INT;
|
DECLARE vWagons INT;
|
||||||
DECLARE vTrainFk INT;
|
DECLARE vTrainFk INT;
|
||||||
DECLARE vLinesLimit INT DEFAULT NULL;
|
DECLARE vLinesLimit INT;
|
||||||
DECLARE vTicketLines INT;
|
DECLARE vTicketLines INT;
|
||||||
DECLARE vVolumeLimit DECIMAL DEFAULT NULL;
|
DECLARE vVolumeLimit DECIMAL;
|
||||||
DECLARE vTicketVolume DECIMAL;
|
DECLARE vTicketVolume DECIMAL;
|
||||||
|
DECLARE vSizeLimit INT;
|
||||||
DECLARE vMaxTickets INT;
|
DECLARE vMaxTickets INT;
|
||||||
DECLARE vStateFk VARCHAR(45);
|
DECLARE vStateFk VARCHAR(45);
|
||||||
DECLARE vFirstTicketFk INT;
|
DECLARE vFirstTicketFk INT;
|
||||||
|
@ -77,6 +78,7 @@ BEGIN
|
||||||
o.trainFk,
|
o.trainFk,
|
||||||
o.linesLimit,
|
o.linesLimit,
|
||||||
o.volumeLimit,
|
o.volumeLimit,
|
||||||
|
o.sizeLimit,
|
||||||
pc.collection_new_lockname
|
pc.collection_new_lockname
|
||||||
INTO vMaxTickets,
|
INTO vMaxTickets,
|
||||||
vHasUniqueCollectionTime,
|
vHasUniqueCollectionTime,
|
||||||
|
@ -88,6 +90,7 @@ BEGIN
|
||||||
vTrainFk,
|
vTrainFk,
|
||||||
vLinesLimit,
|
vLinesLimit,
|
||||||
vVolumeLimit,
|
vVolumeLimit,
|
||||||
|
vSizeLimit,
|
||||||
vLockName
|
vLockName
|
||||||
FROM productionConfig pc
|
FROM productionConfig pc
|
||||||
JOIN worker w ON w.id = vUserFk
|
JOIN worker w ON w.id = vUserFk
|
||||||
|
@ -172,6 +175,14 @@ BEGIN
|
||||||
JOIN state s ON s.id = pb.state
|
JOIN state s ON s.id = pb.state
|
||||||
JOIN agencyMode am ON am.id = pb.agencyModeFk
|
JOIN agencyMode am ON am.id = pb.agencyModeFk
|
||||||
JOIN agency a ON a.id = am.agencyFk
|
JOIN agency a ON a.id = am.agencyFk
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT pb.ticketFk, MAX(i.`size`) maxSize
|
||||||
|
FROM tmp.productionBuffer pb
|
||||||
|
JOIN ticket t ON t.id = pb.ticketfk
|
||||||
|
JOIN sale s ON s.ticketFk = t.id
|
||||||
|
JOIN item i ON i.id = s.itemFk
|
||||||
|
GROUP BY pb.ticketFk
|
||||||
|
) sub ON sub.ticketFk = pb.ticketFk
|
||||||
JOIN productionConfig pc
|
JOIN productionConfig pc
|
||||||
WHERE pb.shipped <> util.VN_CURDATE()
|
WHERE pb.shipped <> util.VN_CURDATE()
|
||||||
OR (pb.ubicacion IS NULL AND a.isOwn)
|
OR (pb.ubicacion IS NULL AND a.isOwn)
|
||||||
|
@ -183,8 +194,9 @@ BEGIN
|
||||||
OR (NOT pb.V AND vItemPackingTypeFk = 'V')
|
OR (NOT pb.V AND vItemPackingTypeFk = 'V')
|
||||||
OR (pc.isPreviousPreparationRequired AND pb.previousWithoutParking)
|
OR (pc.isPreviousPreparationRequired AND pb.previousWithoutParking)
|
||||||
OR LENGTH(pb.problem) > 0
|
OR LENGTH(pb.problem) > 0
|
||||||
OR (pb.lines >= vLinesLimit AND vLinesLimit IS NOT NULL)
|
OR (pb.lines > vLinesLimit AND vLinesLimit IS NOT NULL)
|
||||||
OR (pb.m3 >= vVolumeLimit AND vVolumeLimit IS NOT NULL);
|
OR (pb.m3 > vVolumeLimit AND vVolumeLimit IS NOT NULL)
|
||||||
|
OR ((sub.maxSize > vSizeLimit OR sub.maxSize IS NOT NULL) AND vSizeLimit IS NOT NULL);
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
-- Es importante que el primer ticket se coja en todos los casos
|
-- Es importante que el primer ticket se coja en todos los casos
|
||||||
|
|
|
@ -97,7 +97,7 @@ BEGIN
|
||||||
AND (vCorrectingSerial = vSerial OR NOT hasAnyNegativeBase())
|
AND (vCorrectingSerial = vSerial OR NOT hasAnyNegativeBase())
|
||||||
THEN
|
THEN
|
||||||
|
|
||||||
-- el trigger añade el siguiente Id_Factura correspondiente a la vSerial
|
-- el trigger añade el siguiente ref correspondiente a la vSerial
|
||||||
INSERT INTO invoiceOut(
|
INSERT INTO invoiceOut(
|
||||||
ref,
|
ref,
|
||||||
serial,
|
serial,
|
||||||
|
|
|
@ -15,11 +15,6 @@ proc: BEGIN
|
||||||
DECLARE vEndingDate DATETIME;
|
DECLARE vEndingDate DATETIME;
|
||||||
DECLARE vIsTodayRelative BOOLEAN;
|
DECLARE vIsTodayRelative BOOLEAN;
|
||||||
|
|
||||||
DECLARE EXIT HANDLER FOR SQLEXCEPTION
|
|
||||||
BEGIN
|
|
||||||
RESIGNAL;
|
|
||||||
END;
|
|
||||||
|
|
||||||
SELECT util.dayEnd(util.VN_CURDATE()) + INTERVAL LEAST(vScopeDays, maxProductionScopeDays) DAY
|
SELECT util.dayEnd(util.VN_CURDATE()) + INTERVAL LEAST(vScopeDays, maxProductionScopeDays) DAY
|
||||||
INTO vEndingDate
|
INTO vEndingDate
|
||||||
FROM productionConfig;
|
FROM productionConfig;
|
||||||
|
@ -273,7 +268,6 @@ proc: BEGIN
|
||||||
DROP TEMPORARY TABLE
|
DROP TEMPORARY TABLE
|
||||||
tmp.productionTicket,
|
tmp.productionTicket,
|
||||||
tmp.ticket,
|
tmp.ticket,
|
||||||
tmp.risk,
|
|
||||||
tmp.ticket_problems,
|
tmp.ticket_problems,
|
||||||
tmp.ticketWithPrevia,
|
tmp.ticketWithPrevia,
|
||||||
tItemShelvingStock,
|
tItemShelvingStock,
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
DELIMITER $$
|
DELIMITER $$
|
||||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`sale_getProblems`(IN vIsTodayRelative tinyint(1))
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`sale_getProblems`(
|
||||||
|
vIsTodayRelative tinyint(1)
|
||||||
|
)
|
||||||
BEGIN
|
BEGIN
|
||||||
/**
|
/**
|
||||||
* Calcula los problemas de cada venta para un conjunto de tickets.
|
* Calcula los problemas de cada venta para un conjunto de tickets.
|
||||||
*
|
*
|
||||||
* @param vIsTodayRelative Indica si se calcula el disponible como si todo saliera hoy
|
* @param vIsTodayRelative Indica si se calcula el disponible como si todo saliera hoy
|
||||||
* @table tmp.sale_getProblems(ticketFk, clientFk, warehouseFk, shipped) Identificadores de los tickets a calcular
|
* @table tmp.sale_getProblems(ticketFk, clientFk, warehouseFk, shipped) Tickets a calcular
|
||||||
* @return tmp.sale_problems
|
* @return tmp.sale_problems
|
||||||
*/
|
*/
|
||||||
DECLARE vWarehouseFk INT;
|
DECLARE vWarehouseFk INT;
|
||||||
|
@ -13,13 +15,11 @@ BEGIN
|
||||||
DECLARE vAvailableCache INT;
|
DECLARE vAvailableCache INT;
|
||||||
DECLARE vVisibleCache INT;
|
DECLARE vVisibleCache INT;
|
||||||
DECLARE vDone BOOL;
|
DECLARE vDone BOOL;
|
||||||
DECLARE vRequiredComponent INT;
|
|
||||||
|
|
||||||
DECLARE vCursor CURSOR FOR
|
DECLARE vCursor CURSOR FOR
|
||||||
SELECT DISTINCT tt.warehouseFk, IF(vIsTodayRelative, util.VN_CURDATE(), DATE(tt.shipped))
|
SELECT DISTINCT warehouseFk, IF(vIsTodayRelative, util.VN_CURDATE(), DATE(shipped))
|
||||||
FROM tmp.sale_getProblems tt
|
FROM tmp.sale_getProblems
|
||||||
WHERE DATE(tt.shipped) BETWEEN util.VN_CURDATE()
|
WHERE shipped BETWEEN util.VN_CURDATE()
|
||||||
AND util.VN_CURDATE() + INTERVAL IF(vIsTodayRelative, 9.9, 1.9) DAY;
|
AND util.dayEnd(util.VN_CURDATE() + INTERVAL IF(vIsTodayRelative, 9.9, 1.9) DAY);
|
||||||
|
|
||||||
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
|
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
|
||||||
|
|
||||||
|
@ -48,105 +48,42 @@ BEGIN
|
||||||
PRIMARY KEY (ticketFk, saleFk)
|
PRIMARY KEY (ticketFk, saleFk)
|
||||||
) ENGINE = MEMORY;
|
) ENGINE = MEMORY;
|
||||||
|
|
||||||
CREATE OR REPLACE TEMPORARY TABLE tmp.ticket_list
|
INSERT INTO tmp.sale_problems(ticketFk,
|
||||||
(PRIMARY KEY (ticketFk))
|
saleFk,
|
||||||
ENGINE = MEMORY
|
isFreezed,
|
||||||
SELECT ticketFk, clientFk
|
risk,
|
||||||
FROM tmp.sale_getProblems;
|
hasHighRisk,
|
||||||
|
hasTicketRequest,
|
||||||
|
isTaxDataChecked,
|
||||||
|
hasComponentLack,
|
||||||
|
hasRounding,
|
||||||
|
isTooLittle)
|
||||||
|
SELECT sgp.ticketFk,
|
||||||
|
s.id,
|
||||||
|
IF(FIND_IN_SET('isFreezed', t.problem), TRUE, FALSE) isFreezed,
|
||||||
|
t.risk,
|
||||||
|
IF(FIND_IN_SET('hasHighRisk', t.problem), TRUE, FALSE) hasHighRisk,
|
||||||
|
IF(FIND_IN_SET('hasTicketRequest', t.problem), TRUE, FALSE) hasTicketRequest,
|
||||||
|
IF(FIND_IN_SET('isTaxDataChecked', t.problem), FALSE, TRUE) isTaxDataChecked,
|
||||||
|
IF(FIND_IN_SET('hasComponentLack', s.problem), TRUE, FALSE) hasComponentLack,
|
||||||
|
IF(FIND_IN_SET('hasRounding', s.problem),
|
||||||
|
LEFT(GROUP_CONCAT('RE: ', i.id, ' ', IFNULL(i.longName,'') SEPARATOR ', '), 250),
|
||||||
|
NULL
|
||||||
|
) hasRounding,
|
||||||
|
IF(FIND_IN_SET('isTooLittle', t.problem), TRUE, FALSE) isTooLittle
|
||||||
|
FROM tmp.sale_getProblems sgp
|
||||||
|
JOIN ticket t ON t.id = sgp.ticketFk
|
||||||
|
LEFT JOIN sale s ON s.ticketFk = t.id
|
||||||
|
LEFT JOIN item i ON i.id = s.itemFk
|
||||||
|
WHERE s.problem <> '' OR t.problem <> '' OR t.risk
|
||||||
|
GROUP BY t.id, s.id;
|
||||||
|
|
||||||
SELECT COUNT(*) INTO vRequiredComponent
|
|
||||||
FROM component
|
|
||||||
WHERE isRequired;
|
|
||||||
|
|
||||||
-- Too Little
|
|
||||||
INSERT INTO tmp.sale_problems(ticketFk, isTooLittle)
|
|
||||||
SELECT tp.ticketFk, TRUE
|
|
||||||
FROM tmp.sale_getProblems tp
|
|
||||||
JOIN ticket t ON t.id = tp.ticketFk
|
|
||||||
JOIN (
|
|
||||||
SELECT t.addressFk,
|
|
||||||
SUM(ROUND(`ic`.`cm3delivery` * `s`.`quantity` / 1000, 0)) litros,
|
|
||||||
t.totalWithoutVat
|
|
||||||
FROM tmp.ticket_list tl
|
|
||||||
JOIN ticket t ON t.id = tl.ticketFk
|
|
||||||
JOIN sale s ON s.ticketFk = t.id
|
|
||||||
AND s.quantity > 0
|
|
||||||
JOIN itemCost ic ON ic.itemFk = s.itemFk
|
|
||||||
AND ic.warehouseFk = t.warehouseFk
|
|
||||||
JOIN zoneClosure zc ON zc.zoneFk = t.zoneFk
|
|
||||||
AND zc.dated = util.VN_CURDATE()
|
|
||||||
JOIN agencyMode am ON am.id = t.agencyModeFk
|
|
||||||
JOIN deliveryMethod dm ON dm.id = am.deliveryMethodFk
|
|
||||||
WHERE util.VN_NOW() < (util.VN_CURDATE() + INTERVAL HOUR(zc.`hour`) HOUR) + INTERVAL MINUTE(zc.`hour`) MINUTE
|
|
||||||
AND dm.code IN ('AGENCY','DELIVERY','PICKUP')
|
|
||||||
AND t.shipped BETWEEN util.VN_CURDATE() AND util.midnight()
|
|
||||||
GROUP BY t.addressFk
|
|
||||||
) sub ON sub.addressFk = t.addressFk
|
|
||||||
JOIN volumeConfig vc
|
|
||||||
WHERE sub.litros < vc.minTicketVolume
|
|
||||||
AND sub.totalWithoutVat < vc.minTicketValue;
|
|
||||||
|
|
||||||
-- VIP
|
|
||||||
INSERT INTO tmp.sale_problems(ticketFk, isVip)
|
INSERT INTO tmp.sale_problems(ticketFk, isVip)
|
||||||
SELECT DISTINCT tl.ticketFk, TRUE
|
SELECT sgp.ticketFk, TRUE
|
||||||
FROM tmp.ticket_list tl
|
FROM tmp.sale_getProblems sgp
|
||||||
JOIN client c ON c.id = tl.clientFk
|
JOIN client c ON c.id = sgp.clientFk
|
||||||
WHERE c.businessTypeFk = 'VIP'
|
WHERE c.businessTypeFk = 'VIP'
|
||||||
ON DUPLICATE KEY UPDATE isVip = TRUE;
|
ON DUPLICATE KEY UPDATE isVIP = TRUE;
|
||||||
|
|
||||||
-- Faltan componentes
|
|
||||||
INSERT INTO tmp.sale_problems(ticketFk, hasComponentLack, saleFk)
|
|
||||||
SELECT t.id, COUNT(c.id) < vRequiredComponent hasComponentLack, s.id
|
|
||||||
FROM tmp.ticket_list tl
|
|
||||||
JOIN ticket t ON t.id = tl.ticketFk
|
|
||||||
JOIN sale s ON s.ticketFk = t.id
|
|
||||||
JOIN agencyMode am ON am.id = t.agencyModeFk
|
|
||||||
JOIN deliveryMethod dm ON dm.id = am.deliveryMethodFk
|
|
||||||
LEFT JOIN saleComponent sc ON sc.saleFk = s.id
|
|
||||||
LEFT JOIN component c ON c.id = sc.componentFk
|
|
||||||
AND c.isRequired
|
|
||||||
WHERE dm.code IN ('AGENCY','DELIVERY','PICKUP')
|
|
||||||
AND s.quantity > 0
|
|
||||||
GROUP BY s.id
|
|
||||||
HAVING hasComponentLack;
|
|
||||||
|
|
||||||
-- Cliente congelado
|
|
||||||
INSERT INTO tmp.sale_problems(ticketFk, isFreezed)
|
|
||||||
SELECT DISTINCT tl.ticketFk, TRUE
|
|
||||||
FROM tmp.ticket_list tl
|
|
||||||
JOIN client c ON c.id = tl.clientFk
|
|
||||||
WHERE c.isFreezed
|
|
||||||
ON DUPLICATE KEY UPDATE isFreezed = c.isFreezed;
|
|
||||||
|
|
||||||
-- Credit exceeded
|
|
||||||
CREATE OR REPLACE TEMPORARY TABLE tmp.clientGetDebt
|
|
||||||
(PRIMARY KEY (clientFk))
|
|
||||||
ENGINE = MEMORY
|
|
||||||
SELECT DISTINCT clientFk
|
|
||||||
FROM tmp.ticket_list;
|
|
||||||
|
|
||||||
CALL client_getDebt(util.VN_CURDATE());
|
|
||||||
|
|
||||||
INSERT INTO tmp.sale_problems(ticketFk, risk, hasHighRisk)
|
|
||||||
SELECT DISTINCT tl.ticketFk, r.risk, ((r.risk - cc.riskTolerance) > c.credit + 10)
|
|
||||||
FROM tmp.ticket_list tl
|
|
||||||
JOIN ticket t ON t.id = tl.ticketFk
|
|
||||||
JOIN agencyMode a ON t.agencyModeFk = a.id
|
|
||||||
JOIN tmp.risk r ON r.clientFk = t.clientFk
|
|
||||||
JOIN client c ON c.id = t.clientFk
|
|
||||||
JOIN clientConfig cc
|
|
||||||
WHERE r.risk > c.credit + 10
|
|
||||||
AND NOT a.isRiskFree
|
|
||||||
ON DUPLICATE KEY UPDATE
|
|
||||||
risk = r.risk, hasHighRisk = ((r.risk - cc.riskTolerance) > c.credit + 10);
|
|
||||||
|
|
||||||
-- Antiguo COD 100, son peticiones de compra sin terminar
|
|
||||||
INSERT INTO tmp.sale_problems(ticketFk, hasTicketRequest)
|
|
||||||
SELECT DISTINCT tl.ticketFk, TRUE
|
|
||||||
FROM tmp.ticket_list tl
|
|
||||||
JOIN ticketRequest tr ON tr.ticketFk = tl.ticketFk
|
|
||||||
WHERE tr.isOK IS NULL
|
|
||||||
ON DUPLICATE KEY UPDATE hasTicketRequest = TRUE;
|
|
||||||
|
|
||||||
CREATE OR REPLACE TEMPORARY TABLE tItemShelvingStock_byWarehouse
|
CREATE OR REPLACE TEMPORARY TABLE tItemShelvingStock_byWarehouse
|
||||||
(INDEX (itemFk, warehouseFk))
|
(INDEX (itemFk, warehouseFk))
|
||||||
|
@ -158,10 +95,9 @@ BEGIN
|
||||||
JOIN shelving sh ON sh.code = ish.shelvingFk
|
JOIN shelving sh ON sh.code = ish.shelvingFk
|
||||||
JOIN parking p ON p.id = sh.parkingFk
|
JOIN parking p ON p.id = sh.parkingFk
|
||||||
JOIN sector s ON s.id = p.sectorFk
|
JOIN sector s ON s.id = p.sectorFk
|
||||||
GROUP BY ish.itemFk,
|
GROUP BY ish.itemFk, s.warehouseFk;
|
||||||
s.warehouseFk;
|
|
||||||
|
|
||||||
-- Disponible, Faltas, Inventario y Retrasos
|
-- Disponible, faltas, inventario y retrasos
|
||||||
OPEN vCursor;
|
OPEN vCursor;
|
||||||
l: LOOP
|
l: LOOP
|
||||||
SET vDone = FALSE;
|
SET vDone = FALSE;
|
||||||
|
@ -180,14 +116,14 @@ BEGIN
|
||||||
INSERT INTO tmp.sale_problems(ticketFk, itemShortage, saleFk)
|
INSERT INTO tmp.sale_problems(ticketFk, itemShortage, saleFk)
|
||||||
SELECT ticketFk, problem, saleFk
|
SELECT ticketFk, problem, saleFk
|
||||||
FROM (
|
FROM (
|
||||||
SELECT tl.ticketFk,
|
SELECT sgp.ticketFk,
|
||||||
LEFT(CONCAT('F: ', GROUP_CONCAT(i.id, ' ', i.longName, ' ')), 250) problem,
|
LEFT(CONCAT('F: ', GROUP_CONCAT(i.id, ' ', i.longName, ' ')), 250) problem,
|
||||||
s.id AS saleFk
|
s.id saleFk
|
||||||
FROM tmp.ticket_list tl
|
FROM tmp.sale_getProblems sgp
|
||||||
JOIN ticket t ON t.id = tl.ticketFk
|
JOIN ticket t ON t.id = sgp.ticketFk
|
||||||
JOIN sale s ON s.ticketFk = t.id
|
JOIN sale s ON s.ticketFk = t.id
|
||||||
JOIN item i ON i.id = s.itemFk
|
JOIN item i ON i.id = s.itemFk
|
||||||
JOIN itemType it on it.id = i.typeFk
|
JOIN itemType it ON it.id = i.typeFk
|
||||||
JOIN itemCategory ic ON ic.id = it.categoryFk
|
JOIN itemCategory ic ON ic.id = it.categoryFk
|
||||||
LEFT JOIN cache.visible v ON v.item_id = i.id
|
LEFT JOIN cache.visible v ON v.item_id = i.id
|
||||||
AND v.calc_id = vVisibleCache
|
AND v.calc_id = vVisibleCache
|
||||||
|
@ -205,21 +141,21 @@ BEGIN
|
||||||
AND NOT i.generic
|
AND NOT i.generic
|
||||||
AND util.VN_CURDATE() = vDate
|
AND util.VN_CURDATE() = vDate
|
||||||
AND t.warehouseFk = vWarehouseFk
|
AND t.warehouseFk = vWarehouseFk
|
||||||
GROUP BY tl.ticketFk) sub
|
GROUP BY sgp.ticketFk) sub
|
||||||
ON DUPLICATE KEY UPDATE itemShortage = sub.problem, saleFk = sub.saleFk;
|
ON DUPLICATE KEY UPDATE itemShortage = sub.problem, saleFk = sub.saleFk;
|
||||||
|
|
||||||
-- Inventario: Visible suficiente, pero ubicado menor a la cantidad vendida
|
-- Inventario: Visible suficiente, pero ubicado menor a la cantidad vendida
|
||||||
INSERT INTO tmp.sale_problems(ticketFk, itemLost, saleFk)
|
INSERT INTO tmp.sale_problems(ticketFk, itemLost, saleFk)
|
||||||
SELECT ticketFk, problem, saleFk
|
SELECT ticketFk, problem, saleFk
|
||||||
FROM (
|
FROM (
|
||||||
SELECT tl.ticketFk,
|
SELECT sgp.ticketFk,
|
||||||
LEFT(GROUP_CONCAT('I: ', i.id, ' ', i.longName, ' '), 250) problem,
|
LEFT(GROUP_CONCAT('I: ', i.id, ' ', i.longName, ' '), 250) problem,
|
||||||
s.id saleFk
|
s.id saleFk
|
||||||
FROM tmp.ticket_list tl
|
FROM tmp.sale_getProblems sgp
|
||||||
JOIN ticket t ON t.id = tl.ticketFk
|
JOIN ticket t ON t.id = sgp.ticketFk
|
||||||
JOIN sale s ON s.ticketFk = t.id
|
JOIN sale s ON s.ticketFk = t.id
|
||||||
JOIN item i ON i.id = s.itemFk
|
JOIN item i ON i.id = s.itemFk
|
||||||
JOIN itemType it on it.id = i.typeFk
|
JOIN itemType it ON it.id = i.typeFk
|
||||||
JOIN itemCategory ic ON ic.id = it.categoryFk
|
JOIN itemCategory ic ON ic.id = it.categoryFk
|
||||||
LEFT JOIN cache.visible v ON v.item_id = s.itemFk
|
LEFT JOIN cache.visible v ON v.item_id = s.itemFk
|
||||||
AND v.calc_id = vVisibleCache
|
AND v.calc_id = vVisibleCache
|
||||||
|
@ -235,22 +171,22 @@ BEGIN
|
||||||
AND NOT i.generic
|
AND NOT i.generic
|
||||||
AND util.VN_CURDATE() = vDate
|
AND util.VN_CURDATE() = vDate
|
||||||
AND t.warehouseFk = vWarehouseFk
|
AND t.warehouseFk = vWarehouseFk
|
||||||
GROUP BY tl.ticketFk
|
GROUP BY sgp.ticketFk
|
||||||
) sub
|
) sub
|
||||||
ON DUPLICATE KEY UPDATE itemDelay = sub.problem, saleFk = sub.saleFk;
|
ON DUPLICATE KEY UPDATE itemLost = sub.problem, saleFk = sub.saleFk;
|
||||||
|
|
||||||
-- Retraso: Disponible suficiente, pero no visible ni ubicado
|
-- Retraso: Disponible suficiente, pero no visible ni ubicado
|
||||||
INSERT INTO tmp.sale_problems(ticketFk, itemDelay, saleFk)
|
INSERT INTO tmp.sale_problems(ticketFk, itemDelay, saleFk)
|
||||||
SELECT ticketFk, problem, saleFk
|
SELECT ticketFk, problem, saleFk
|
||||||
FROM (
|
FROM (
|
||||||
SELECT tl.ticketFk,
|
SELECT sgp.ticketFk,
|
||||||
LEFT(GROUP_CONCAT('R: ', i.id, ' ', i.longName, ' '), 250) problem,
|
LEFT(GROUP_CONCAT('R: ', i.id, ' ', i.longName, ' '), 250) problem,
|
||||||
s.id saleFk
|
s.id saleFk
|
||||||
FROM tmp.ticket_list tl
|
FROM tmp.sale_getProblems sgp
|
||||||
JOIN ticket t ON t.id = tl.ticketFk
|
JOIN ticket t ON t.id = sgp.ticketFk
|
||||||
JOIN sale s ON s.ticketFk = t.id
|
JOIN sale s ON s.ticketFk = t.id
|
||||||
JOIN item i ON i.id = s.itemFk
|
JOIN item i ON i.id = s.itemFk
|
||||||
JOIN itemType it on it.id = i.typeFk
|
JOIN itemType it ON it.id = i.typeFk
|
||||||
JOIN itemCategory ic ON ic.id = it.categoryFk
|
JOIN itemCategory ic ON ic.id = it.categoryFk
|
||||||
LEFT JOIN cache.visible v ON v.item_id = s.itemFk
|
LEFT JOIN cache.visible v ON v.item_id = s.itemFk
|
||||||
AND v.calc_id = vVisibleCache
|
AND v.calc_id = vVisibleCache
|
||||||
|
@ -269,42 +205,27 @@ BEGIN
|
||||||
AND NOT i.generic
|
AND NOT i.generic
|
||||||
AND util.VN_CURDATE() = vDate
|
AND util.VN_CURDATE() = vDate
|
||||||
AND t.warehouseFk = vWarehouseFk
|
AND t.warehouseFk = vWarehouseFk
|
||||||
GROUP BY tl.ticketFk
|
GROUP BY sgp.ticketFk
|
||||||
) sub
|
) sub
|
||||||
ON DUPLICATE KEY UPDATE itemDelay = sub.problem, saleFk = sub.saleFk;
|
ON DUPLICATE KEY UPDATE itemDelay = sub.problem, saleFk = sub.saleFk;
|
||||||
|
|
||||||
-- Redondeo: Cantidad pedida incorrecta en al grouping de la última compra
|
|
||||||
CALL buy_getUltimate(NULL, vWarehouseFk, vDate);
|
|
||||||
INSERT INTO tmp.sale_problems(ticketFk, hasRounding, saleFk)
|
|
||||||
SELECT ticketFk, problem ,saleFk
|
|
||||||
FROM (
|
|
||||||
SELECT tl.ticketFk,
|
|
||||||
s.id saleFk,
|
|
||||||
LEFT(GROUP_CONCAT('RE: ',i.id, ' ', IFNULL(i.longName,'') SEPARATOR ', '), 250) problem
|
|
||||||
FROM tmp.ticket_list tl
|
|
||||||
JOIN ticket t ON t.id = tl.ticketFk
|
|
||||||
AND t.warehouseFk = vWarehouseFk
|
|
||||||
JOIN sale s ON s.ticketFk = tl.ticketFk
|
|
||||||
JOIN item i ON i.id = s.itemFk
|
|
||||||
JOIN tmp.buyUltimate bu ON bu.itemFk = s.itemFk
|
|
||||||
JOIN buy b ON b.id = bu.buyFk
|
|
||||||
WHERE MOD(s.quantity, b.`grouping`)
|
|
||||||
GROUP BY tl.ticketFk
|
|
||||||
)sub
|
|
||||||
ON DUPLICATE KEY UPDATE hasRounding = sub.problem, saleFk = sub.saleFk;
|
|
||||||
END LOOP;
|
END LOOP;
|
||||||
CLOSE vCursor;
|
CLOSE vCursor;
|
||||||
|
|
||||||
INSERT INTO tmp.sale_problems(ticketFk, isTaxDataChecked)
|
INSERT INTO tmp.sale_problems(ticketFk, hasRounding, saleFk)
|
||||||
SELECT DISTINCT tl.ticketFk, FALSE
|
SELECT ticketFk, problem, saleFk
|
||||||
FROM tmp.ticket_list tl
|
FROM (
|
||||||
JOIN client c ON c.id = tl.clientFk
|
SELECT sgp.ticketFk,
|
||||||
WHERE NOT c.isTaxDataChecked
|
s.id saleFk,
|
||||||
ON DUPLICATE KEY UPDATE isTaxDataChecked = FALSE;
|
LEFT(GROUP_CONCAT('RE: ', i.id, ' ', IFNULL(i.longName,'') SEPARATOR ', '), 250) problem
|
||||||
|
FROM tmp.sale_getProblems sgp
|
||||||
|
JOIN ticket t ON t.id = sgp.ticketFk
|
||||||
|
JOIN sale s ON s.ticketFk = sgp.ticketFk
|
||||||
|
JOIN item i ON i.id = s.itemFk
|
||||||
|
WHERE FIND_IN_SET('hasRounding', s.problem)
|
||||||
|
GROUP BY sgp.ticketFk
|
||||||
|
) sub
|
||||||
|
ON DUPLICATE KEY UPDATE hasRounding = sub.problem, saleFk = sub.saleFk;
|
||||||
|
|
||||||
DROP TEMPORARY TABLE
|
DROP TEMPORARY TABLE tItemShelvingStock_byWarehouse;
|
||||||
tmp.clientGetDebt,
|
|
||||||
tmp.ticket_list,
|
|
||||||
tItemShelvingStock_byWarehouse;
|
|
||||||
END$$
|
END$$
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
|
@ -7,8 +7,7 @@ BEGIN
|
||||||
*
|
*
|
||||||
* @return Problems result
|
* @return Problems result
|
||||||
*/
|
*/
|
||||||
DROP TEMPORARY TABLE IF EXISTS tmp.sale_getProblems;
|
CREATE OR REPLACE TEMPORARY TABLE tmp.sale_getProblems
|
||||||
CREATE TEMPORARY TABLE tmp.sale_getProblems
|
|
||||||
(INDEX (ticketFk))
|
(INDEX (ticketFk))
|
||||||
ENGINE = MEMORY
|
ENGINE = MEMORY
|
||||||
SELECT t.id ticketFk, t.clientFk, t.warehouseFk, t.shipped
|
SELECT t.id ticketFk, t.clientFk, t.warehouseFk, t.shipped
|
||||||
|
|
|
@ -90,7 +90,7 @@ BEGIN
|
||||||
IF vIsTaxDataChecked THEN
|
IF vIsTaxDataChecked THEN
|
||||||
CALL invoiceOut_newFromClient(
|
CALL invoiceOut_newFromClient(
|
||||||
vClientFk,
|
vClientFk,
|
||||||
(SELECT invoiceSerial(vClientFk, vCompanyFk, 'M')),
|
(SELECT invoiceSerial(vClientFk, vCompanyFk, 'multiple')),
|
||||||
vShipped,
|
vShipped,
|
||||||
vCompanyFk,
|
vCompanyFk,
|
||||||
NULL,
|
NULL,
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
DELIMITER $$
|
DELIMITER $$
|
||||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_getProblems`(IN vIsTodayRelative tinyint(1))
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_getProblems`(
|
||||||
|
vIsTodayRelative tinyint(1)
|
||||||
|
)
|
||||||
BEGIN
|
BEGIN
|
||||||
/**
|
/**
|
||||||
* Calcula los problemas para un conjunto de tickets.
|
* Calcula los problemas para un conjunto de tickets.
|
||||||
|
|
|
@ -14,16 +14,28 @@ BEGIN
|
||||||
DECLARE vTicketFk INT;
|
DECLARE vTicketFk INT;
|
||||||
|
|
||||||
DECLARE cTickets CURSOR FOR
|
DECLARE cTickets CURSOR FOR
|
||||||
SELECT id FROM ticket
|
SELECT DISTINCT t.id
|
||||||
WHERE refFk IS NULL
|
FROM ticket t
|
||||||
AND ((vScope = 'client' AND clientFk = vId)
|
LEFT JOIN tItems ti ON ti.id = t.id
|
||||||
OR (vScope = 'address' AND addressFk = vId));
|
WHERE t.refFk IS NULL
|
||||||
|
AND ((vScope = 'client' AND t.clientFk = vId)
|
||||||
|
OR (vScope = 'address' AND t.addressFk = vId)
|
||||||
|
OR (vScope = 'item' AND ti.id)
|
||||||
|
);
|
||||||
|
|
||||||
DECLARE CONTINUE HANDLER FOR NOT FOUND
|
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
|
||||||
SET vDone = TRUE;
|
|
||||||
|
CREATE OR REPLACE TEMPORARY TABLE tItems
|
||||||
|
(PRIMARY KEY (id))
|
||||||
|
ENGINE = MEMORY
|
||||||
|
SELECT DISTINCT t.id
|
||||||
|
FROM ticket t
|
||||||
|
JOIN sale s ON s.ticketFk = t.id
|
||||||
|
JOIN itemTaxCountry itc ON itc.itemFk = s.itemFk
|
||||||
|
WHERE t.refFk IS NULL
|
||||||
|
AND (vScope = 'item' AND itc.itemFk = vId);
|
||||||
|
|
||||||
OPEN cTickets;
|
OPEN cTickets;
|
||||||
|
|
||||||
myLoop: LOOP
|
myLoop: LOOP
|
||||||
SET vDone = FALSE;
|
SET vDone = FALSE;
|
||||||
FETCH cTickets INTO vTicketFk;
|
FETCH cTickets INTO vTicketFk;
|
||||||
|
@ -34,7 +46,8 @@ BEGIN
|
||||||
|
|
||||||
CALL ticket_recalc(vTicketFk, NULL);
|
CALL ticket_recalc(vTicketFk, NULL);
|
||||||
END LOOP;
|
END LOOP;
|
||||||
|
|
||||||
CLOSE cTickets;
|
CLOSE cTickets;
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE tItems;
|
||||||
END$$
|
END$$
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`host_beforeInsert`
|
||||||
|
BEFORE INSERT ON `host`
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
SET NEW.editorFk = account.myUser_getId();
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -4,5 +4,6 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`host_beforeUpdate`
|
||||||
FOR EACH ROW
|
FOR EACH ROW
|
||||||
BEGIN
|
BEGIN
|
||||||
SET new.updated = util.VN_NOW();
|
SET new.updated = util.VN_NOW();
|
||||||
|
SET NEW.editorFk = account.myUser_getId();
|
||||||
END$$
|
END$$
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`roadmap_beforeInsert`
|
||||||
|
BEFORE INSERT ON `roadmap`
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
IF NEW.driver1Fk IS NOT NULL THEN
|
||||||
|
SET NEW.driverName = (SELECT firstName FROM worker WHERE id = NEW.driver1Fk);
|
||||||
|
ELSE
|
||||||
|
SET NEW.driverName = NULL;
|
||||||
|
END IF;
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -0,0 +1,12 @@
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`roadmap_beforeUpdate`
|
||||||
|
BEFORE UPDATE ON `roadmap`
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
IF NEW.driver1Fk IS NOT NULL THEN
|
||||||
|
SET NEW.driverName = (SELECT firstName FROM worker WHERE id = NEW.driver1Fk);
|
||||||
|
ELSE
|
||||||
|
SET NEW.driverName = NULL;
|
||||||
|
END IF;
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -2,5 +2,5 @@ CREATE OR REPLACE DEFINER=`root`@`localhost`
|
||||||
SQL SECURITY DEFINER
|
SQL SECURITY DEFINER
|
||||||
VIEW `vn2008`.`mandato_tipo`
|
VIEW `vn2008`.`mandato_tipo`
|
||||||
AS SELECT `m`.`id` AS `idmandato_tipo`,
|
AS SELECT `m`.`id` AS `idmandato_tipo`,
|
||||||
`m`.`name` AS `Nombre`
|
`m`.`code` AS `Nombre`
|
||||||
FROM `vn`.`mandateType` `m`
|
FROM `vn`.`mandateType` `m`
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE srt.moving DROP INDEX moving_fk1_idx;
|
|
@ -0,0 +1,4 @@
|
||||||
|
ALTER TABLE vn.invoiceOutSerial
|
||||||
|
MODIFY COLUMN `type` enum('global','quick','multiple') CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci DEFAULT NULL NULL;
|
||||||
|
|
||||||
|
CREATE UNIQUE INDEX invoiceOutSerial_taxAreaFk_IDX USING BTREE ON vn.invoiceOutSerial (taxAreaFk,`type`);
|
|
@ -0,0 +1,3 @@
|
||||||
|
UPDATE vn.invoiceOutSerial
|
||||||
|
SET `type`='multiple'
|
||||||
|
WHERE `description` LIKE '%Múltiple%';
|
|
@ -0,0 +1,3 @@
|
||||||
|
ALTER TABLE vn.operator
|
||||||
|
ADD COLUMN sizeLimit int(10) unsigned DEFAULT 90 NULL COMMENT 'Límite de altura en una colección para la asignación de pedidos' AFTER volumeLimit,
|
||||||
|
MODIFY COLUMN linesLimit int(10) unsigned DEFAULT 20 NULL COMMENT 'Límite de lineas en una colección para la asignación de pedidos';
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE vn.ticket DROP FOREIGN KEY ticket_FK;
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE vn.invoiceOut DROP KEY Id_Factura;
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE vn.invoiceOut MODIFY COLUMN id int(10) unsigned NOT NULL;
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE vn.invoiceCorrection DROP FOREIGN KEY corrected_fk;
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE vn.invoiceCorrection DROP FOREIGN KEY correcting_fk;
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE vn.invoiceOutExpense DROP FOREIGN KEY invoiceOutExpence_FK_1;
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE vn.invoiceOutTax DROP FOREIGN KEY invoiceOutFk;
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE vn.invoiceOut DROP PRIMARY KEY;
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE vn.invoiceOut ADD CONSTRAINT invoiceOut_pk PRIMARY KEY (id);
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE vn.invoiceOut ADD CONSTRAINT invoiceOut_unique UNIQUE KEY (`ref`);
|
|
@ -0,0 +1,5 @@
|
||||||
|
UPDATE vn.invoiceOut
|
||||||
|
SET id = (SELECT MAX(id) + 1 FROM vn.invoiceOut)
|
||||||
|
WHERE id = 0;
|
||||||
|
|
||||||
|
ALTER TABLE vn.invoiceOut MODIFY COLUMN id int(10) unsigned auto_increment NOT NULL;
|
|
@ -0,0 +1,2 @@
|
||||||
|
ALTER TABLE vn.ticket ADD CONSTRAINT ticket_invoiceOut_FK
|
||||||
|
FOREIGN KEY (refFk) REFERENCES vn.invoiceOut(`ref`) ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
@ -0,0 +1,2 @@
|
||||||
|
ALTER TABLE vn.invoiceCorrection ADD CONSTRAINT invoiceCorrection_invoiceOut_FK
|
||||||
|
FOREIGN KEY (correctingFk) REFERENCES vn.invoiceOut(id) ON DELETE CASCADE ON UPDATE CASCADE;
|
|
@ -0,0 +1,2 @@
|
||||||
|
ALTER TABLE vn.invoiceCorrection ADD CONSTRAINT invoiceCorrection_invoiceOut_FK_1
|
||||||
|
FOREIGN KEY (correctedFk) REFERENCES vn.invoiceOut(id) ON DELETE CASCADE ON UPDATE CASCADE;
|
|
@ -0,0 +1,2 @@
|
||||||
|
ALTER TABLE vn.invoiceOutExpense ADD CONSTRAINT invoiceOutExpense_invoiceOut_FK
|
||||||
|
FOREIGN KEY (invoiceOutFk) REFERENCES vn.invoiceOut(id) ON DELETE CASCADE ON UPDATE CASCADE;
|
|
@ -0,0 +1,2 @@
|
||||||
|
ALTER TABLE vn.invoiceOutTax ADD CONSTRAINT invoiceOutTax_invoiceOut_FK
|
||||||
|
FOREIGN KEY (invoiceOutFk) REFERENCES vn.invoiceOut(id) ON DELETE CASCADE ON UPDATE CASCADE;
|
|
@ -0,0 +1,8 @@
|
||||||
|
USE vn;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS ormConfig (
|
||||||
|
id int(5) NOT NULL AUTO_INCREMENT primary key,
|
||||||
|
selectLimit int(5) NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT IGNORE INTO ormConfig SET selectLimit = 1000;
|
|
@ -0,0 +1 @@
|
||||||
|
DROP TABLE bi.Greuges_comercial_detail;
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE vn.host ADD editorFk int(10) unsigned DEFAULT NULL NULL;
|
|
@ -0,0 +1,3 @@
|
||||||
|
ALTER TABLE vn.item
|
||||||
|
ADD CONSTRAINT item_itemPackingType_FK FOREIGN KEY (itemPackingTypeFk)
|
||||||
|
REFERENCES vn.itemPackingType(code) ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
@ -0,0 +1,9 @@
|
||||||
|
ALTER TABLE hedera.tpvMerchantEnable
|
||||||
|
DROP FOREIGN KEY tpvMerchantEnable_ibfk_1,
|
||||||
|
DROP PRIMARY KEY,
|
||||||
|
ADD CONSTRAINT tpvMerchantEnable_pk PRIMARY KEY (merchantFk),
|
||||||
|
ADD CONSTRAINT tpvMerchantEnable_tpvMerchant_FK
|
||||||
|
FOREIGN KEY (merchantFk)
|
||||||
|
REFERENCES hedera.tpvMerchant(id)
|
||||||
|
ON DELETE RESTRICT
|
||||||
|
ON UPDATE CASCADE;
|
|
@ -0,0 +1,3 @@
|
||||||
|
ALTER TABLE vn.mandateType
|
||||||
|
CHANGE name code VARCHAR(45) NOT NULL,
|
||||||
|
ADD UNIQUE (code);
|
|
@ -0,0 +1,3 @@
|
||||||
|
ALTER TABLE vn.accountDetailType
|
||||||
|
ADD COLUMN code VARCHAR(45),
|
||||||
|
ADD UNIQUE (code);
|
|
@ -0,0 +1,9 @@
|
||||||
|
UPDATE vn.accountDetailType
|
||||||
|
SET code = CASE description
|
||||||
|
WHEN 'IBAN' THEN 'iban'
|
||||||
|
WHEN 'SWIFT' THEN 'swift'
|
||||||
|
WHEN 'Referencia Remesas' THEN 'remRef'
|
||||||
|
WHEN 'Referencia Transferencias' THEN 'trnRef'
|
||||||
|
WHEN 'Referencia Nominas' THEN 'payRef'
|
||||||
|
WHEN 'ABA' THEN 'aba'
|
||||||
|
END;
|
|
@ -0,0 +1,3 @@
|
||||||
|
ALTER TABLE hedera.tpvMerchantEnable
|
||||||
|
MODIFY COLUMN companyFk int(10) unsigned NOT NULL,
|
||||||
|
ADD CONSTRAINT tpvMerchantEnable_company_FK FOREIGN KEY (companyFk) REFERENCES vn.company(id) ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
@ -0,0 +1,19 @@
|
||||||
|
CREATE OR REPLACE TABLE `srt`.`bufferLog` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`originFk` int(11) DEFAULT NULL,
|
||||||
|
`userFk` int(10) unsigned DEFAULT NULL,
|
||||||
|
`action` set('insert','update','delete','select') NOT NULL,
|
||||||
|
`creationDate` timestamp NULL DEFAULT current_timestamp(),
|
||||||
|
`description` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
|
||||||
|
`changedModel` enum('Buffer', 'Config') NOT NULL DEFAULT 'Buffer',
|
||||||
|
`oldInstance` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`oldInstance`)),
|
||||||
|
`newInstance` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`newInstance`)),
|
||||||
|
`changedModelId` int(11) NOT NULL,
|
||||||
|
`changedModelValue` varchar(45) DEFAULT NULL,
|
||||||
|
`summaryId` varchar(30) DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
KEY `logBufferUserFk` (`userFk`),
|
||||||
|
KEY `bufferLog_changedModel` (`changedModel`,`changedModelId`,`creationDate`),
|
||||||
|
KEY `bufferLog_originFk` (`originFk`,`creationDate`),
|
||||||
|
CONSTRAINT `bufferUserFk` FOREIGN KEY (`userFk`) REFERENCES `account`.`user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE srt.buffer ADD editorFk int(10) unsigned DEFAULT NULL NULL;
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE srt.config ADD editorFk int(10) unsigned DEFAULT NULL NULL;
|
|
@ -0,0 +1,9 @@
|
||||||
|
CREATE TABLE vn.quadMindsApiConfig (
|
||||||
|
id int(10) unsigned NULL PRIMARY KEY,
|
||||||
|
`url` varchar(255) DEFAULT NULL NULL,
|
||||||
|
`key` varchar(255) DEFAULT NULL NULL,
|
||||||
|
CONSTRAINT quadMindsConfig_check CHECK (id = 1)
|
||||||
|
)
|
||||||
|
ENGINE=InnoDB
|
||||||
|
DEFAULT CHARSET=utf8mb3
|
||||||
|
COLLATE=utf8mb3_unicode_ci;
|
|
@ -0,0 +1,6 @@
|
||||||
|
ALTER TABLE vn.roadmap
|
||||||
|
ADD COLUMN m3 INT UNSIGNED NULL,
|
||||||
|
ADD COLUMN driver2Fk INT UNSIGNED NULL,
|
||||||
|
ADD COLUMN driver1Fk INT UNSIGNED NULL,
|
||||||
|
ADD CONSTRAINT roadmap_worker_FK FOREIGN KEY (driver1Fk) REFERENCES vn.worker(id) ON DELETE RESTRICT ON UPDATE CASCADE,
|
||||||
|
ADD CONSTRAINT roadmap_worker_FK_2 FOREIGN KEY (driver2Fk) REFERENCES vn.worker(id) ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
@ -0,0 +1,24 @@
|
||||||
|
DELETE FROM `salix`.`ACL`
|
||||||
|
WHERE `model` = 'Ticket'
|
||||||
|
AND `property` = 'refund'
|
||||||
|
AND `accessType` = 'WRITE'
|
||||||
|
AND `permission` = 'ALLOW'
|
||||||
|
AND `principalType` = 'ROLE'
|
||||||
|
AND `principalId` = 'salesAssistant';
|
||||||
|
|
||||||
|
UPDATE `salix`.`ACL`
|
||||||
|
SET `property` = 'cloneAll'
|
||||||
|
WHERE `model` = 'Ticket'
|
||||||
|
AND `property` = 'refund'
|
||||||
|
AND `accessType` = 'WRITE'
|
||||||
|
AND `permission` = 'ALLOW'
|
||||||
|
AND `principalType` = 'ROLE'
|
||||||
|
AND `principalId` IN ('invoicing', 'claimManager', 'logistic');
|
||||||
|
|
||||||
|
DELETE FROM `salix`.`ACL`
|
||||||
|
WHERE `model` = 'Ticket'
|
||||||
|
AND `property` = 'clone'
|
||||||
|
AND `accessType` = 'WRITE'
|
||||||
|
AND `permission` = 'ALLOW'
|
||||||
|
AND `principalType` = 'ROLE'
|
||||||
|
AND `principalId` = 'administrative';
|
|
@ -0,0 +1,4 @@
|
||||||
|
-- Place your SQL code here
|
||||||
|
ALTER TABLE vn.saleGroup ADD stateFk TINYINT(3) UNSIGNED;
|
||||||
|
|
||||||
|
ALTER TABLE vn.saleGroup ADD CONSTRAINT saleGroup_state_FK FOREIGN KEY (stateFk) REFERENCES vn.state(id) ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
@ -1,164 +0,0 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
|
||||||
|
|
||||||
describe('Account create and basic data path', () => {
|
|
||||||
let browser;
|
|
||||||
let page;
|
|
||||||
|
|
||||||
beforeAll(async() => {
|
|
||||||
browser = await getBrowser();
|
|
||||||
page = browser.page;
|
|
||||||
await page.loginAndModule('itManagement', 'account');
|
|
||||||
});
|
|
||||||
|
|
||||||
afterAll(async() => {
|
|
||||||
await browser.close();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should open the new account form by clicking the add button', async() => {
|
|
||||||
await page.waitToClick(selectors.accountIndex.addAccount);
|
|
||||||
await page.waitForState('account.create');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should fill the form and then save it by clicking the create button', async() => {
|
|
||||||
await page.write(selectors.accountIndex.newName, 'remy');
|
|
||||||
await page.write(selectors.accountIndex.newNickname, 'Gambit');
|
|
||||||
await page.write(selectors.accountIndex.newEmail, 'RemyEtienneLeBeau@verdnatura.es');
|
|
||||||
await page.autocompleteSearch(selectors.accountIndex.newRole, 'Trainee');
|
|
||||||
await page.write(selectors.accountIndex.newPassword, 'cestlavie');
|
|
||||||
await page.waitToClick(selectors.accountIndex.createAccountButton);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should redirect the user to the created account basic data section', async() => {
|
|
||||||
await page.waitForState('account.card.basicData');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the name is as expected', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.accountBasicData.name, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('remy');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the nickname is as expected', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.accountBasicData.nickname, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('Gambit');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the email is as expected', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.accountBasicData.email, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('RemyEtienneLeBeau@verdnatura.es');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should navigate to the roles section to check the roles are correct', async() => {
|
|
||||||
await page.accessToSection('account.card.roles');
|
|
||||||
const rolesCount = await page.countElement(selectors.accountRoles.anyResult);
|
|
||||||
|
|
||||||
expect(rolesCount).toEqual(3);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Descriptor option', () => {
|
|
||||||
describe('activate account', () => {
|
|
||||||
it(`should check the active account icon isn't present in the descriptor`, async() => {
|
|
||||||
await page.waitForNumberOfElements(selectors.accountDescriptor.activeAccountIcon, 0);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should activate the account using the descriptor menu', async() => {
|
|
||||||
await page.waitToClick(selectors.accountDescriptor.menuButton);
|
|
||||||
await page.waitToClick(selectors.accountDescriptor.activateAccount);
|
|
||||||
await page.waitToClick(selectors.accountDescriptor.acceptButton);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Account enabled!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the active account icon is now present in the descriptor', async() => {
|
|
||||||
await page.waitForSelector(selectors.accountDescriptor.activeAccountIcon, {visible: false});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('deactivate user', () => {
|
|
||||||
it(`should check the inactive user icon isn't present in the descriptor just yet`, async() => {
|
|
||||||
await page.waitForNumberOfElements(selectors.accountDescriptor.activeUserIcon, 0);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should deactivate the user using the descriptor menu', async() => {
|
|
||||||
await page.waitToClick(selectors.accountDescriptor.menuButton);
|
|
||||||
await page.waitToClick(selectors.accountDescriptor.deactivateUser);
|
|
||||||
await page.waitToClick(selectors.accountDescriptor.acceptButton);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('User deactivated!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the inactive user icon is now present', async() => {
|
|
||||||
await page.waitForNumberOfElements(selectors.accountDescriptor.activeUserIcon, 1);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('activate user', () => {
|
|
||||||
it('should activate the user using the descriptor menu', async() => {
|
|
||||||
await page.waitToClick(selectors.accountDescriptor.menuButton);
|
|
||||||
await page.waitToClick(selectors.accountDescriptor.activateUser);
|
|
||||||
await page.waitToClick(selectors.accountDescriptor.acceptButton);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('User activated!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the inactive user icon is not present anymore', async() => {
|
|
||||||
await page.waitForNumberOfElements(selectors.accountDescriptor.activeUserIcon, 0);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('mail forwarding', () => {
|
|
||||||
it('should activate the mail forwarding and set the recipent email', async() => {
|
|
||||||
await page.accessToSection('account.card.mailForwarding');
|
|
||||||
await page.waitToClick(selectors.accountMailForwarding.mailForwardingCheckbox);
|
|
||||||
await page.write(selectors.accountMailForwarding.email, 'someEmail@someDomain.es');
|
|
||||||
await page.waitToClick(selectors.accountMailForwarding.save);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Set password', () => {
|
|
||||||
it('should set the password using the descriptor menu', async() => {
|
|
||||||
const newPassword = 'quantum.12345';
|
|
||||||
|
|
||||||
await page.waitToClick(selectors.accountDescriptor.menuButton);
|
|
||||||
await page.waitToClick(selectors.accountDescriptor.setPassword);
|
|
||||||
await page.write(selectors.accountDescriptor.newPassword, newPassword);
|
|
||||||
await page.write(selectors.accountDescriptor.repeatPassword, newPassword);
|
|
||||||
await page.waitToClick(selectors.accountDescriptor.acceptButton);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Password changed succesfully!');
|
|
||||||
});
|
|
||||||
|
|
||||||
// cant log into created account for unknown reasons
|
|
||||||
// it('should login into the created account with the new password', async() => {
|
|
||||||
// await page.loginAndModule('Remy', 'quantum.crypt0graphy');
|
|
||||||
// });
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('delete account', () => {
|
|
||||||
// it('should navigate to the account basic data section', async() => {
|
|
||||||
// });
|
|
||||||
|
|
||||||
it('should delete the account using the descriptor menu', async() => {
|
|
||||||
await page.waitToClick(selectors.accountDescriptor.menuButton);
|
|
||||||
await page.waitToClick(selectors.accountDescriptor.deleteAccount);
|
|
||||||
await page.waitToClick(selectors.accountDescriptor.acceptButton);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('User removed');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,66 +0,0 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
|
||||||
|
|
||||||
describe('Account Alias create and basic data path', () => {
|
|
||||||
let browser;
|
|
||||||
let page;
|
|
||||||
|
|
||||||
beforeAll(async() => {
|
|
||||||
browser = await getBrowser();
|
|
||||||
page = browser.page;
|
|
||||||
await page.loginAndModule('itManagement', 'account');
|
|
||||||
await page.accessToSection('account.alias');
|
|
||||||
});
|
|
||||||
|
|
||||||
afterAll(async() => {
|
|
||||||
await browser.close();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should open the new account alias form by clicking the add button', async() => {
|
|
||||||
await page.waitToClick(selectors.accountAliasIndex.addAlias);
|
|
||||||
await page.waitForState('account.alias.create');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should fill the form and then save it by clicking the create alias button', async() => {
|
|
||||||
await page.write(selectors.accountAliasIndex.newName, 'Boring alias');
|
|
||||||
await page.write(selectors.accountAliasIndex.newDescription, 'Boring description');
|
|
||||||
await page.waitToClick(selectors.accountAliasIndex.createAliasButton);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should redirect the user to the created account alias basic data section', async() => {
|
|
||||||
await page.waitForState('account.alias.card.basicData');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should edit the alias basic data', async() => {
|
|
||||||
await page.overwrite(selectors.accountAliasBasicData.name, 'Psykers');
|
|
||||||
await page.overwrite(selectors.accountAliasBasicData.description, 'Email group for psykers');
|
|
||||||
await page.waitToClick(selectors.accountAliasBasicData.save);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should reload the basicData section and check the name was edited successfully', async() => {
|
|
||||||
await page.reloadSection('account.alias.card.basicData');
|
|
||||||
const result = await page.waitToGetProperty(selectors.accountAliasBasicData.name, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('Psykers');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the alias description was edited successfully', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.accountAliasBasicData.description, 'value');
|
|
||||||
|
|
||||||
expect(result).toContain('psykers');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should search IT alias then access the user section to check the role listed is the expected one', async() => {
|
|
||||||
await page.accessToSearchResult('IT');
|
|
||||||
await page.accessToSection('account.alias.card.users');
|
|
||||||
const rolesCount = await page.countElement(selectors.accountAliasUsers.anyResult);
|
|
||||||
|
|
||||||
expect(rolesCount).toEqual(1);
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,86 +0,0 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
|
||||||
|
|
||||||
describe('Account Role create and basic data path', () => {
|
|
||||||
let browser;
|
|
||||||
let page;
|
|
||||||
|
|
||||||
beforeAll(async() => {
|
|
||||||
browser = await getBrowser();
|
|
||||||
page = browser.page;
|
|
||||||
await page.loginAndModule('it', 'account');
|
|
||||||
await page.accessToSection('account.role');
|
|
||||||
});
|
|
||||||
|
|
||||||
afterAll(async() => {
|
|
||||||
await browser.close();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should open the new account role form by clicking the add button', async() => {
|
|
||||||
await page.waitToClick(selectors.accountRoleIndex.addRole);
|
|
||||||
await page.waitForState('account.role.create');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should fill the form and then save it by clicking the create role button', async() => {
|
|
||||||
await page.write(selectors.accountRoleIndex.newName, 'boringRole');
|
|
||||||
await page.write(selectors.accountRoleIndex.newDescription, 'Boring description');
|
|
||||||
await page.waitToClick(selectors.accountRoleIndex.createRoleButton);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should redirect the user to the created role basic data section', async() => {
|
|
||||||
await page.waitForState('account.role.card.basicData');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should edit the role basic data', async() => {
|
|
||||||
await page.overwrite(selectors.accountRoleBasicData.name, 'psyker');
|
|
||||||
await page.overwrite(selectors.accountRoleBasicData.description, 'A role just for psykers');
|
|
||||||
await page.waitToClick(selectors.accountRoleBasicData.save);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should reload the role basicData section and check the name was edited successfully', async() => {
|
|
||||||
await page.reloadSection('account.role.card.basicData');
|
|
||||||
const result = await page.waitToGetProperty(selectors.accountRoleBasicData.name, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('psyker');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the role description was edited successfully', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.accountRoleBasicData.description, 'value');
|
|
||||||
|
|
||||||
expect(result).toContain('psykers');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should navigate to the subroles section', async() => {
|
|
||||||
await page.accessToSection('account.role.card.subroles');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should asign a subrole', async() => {
|
|
||||||
await page.waitToClick(selectors.accountSubroles.addSubrole);
|
|
||||||
await page.autocompleteSearch(selectors.accountSubroles.role, 'teamManager');
|
|
||||||
await page.waitToClick(selectors.accountSubroles.save);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Role added!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should reload the subroles section and check a role was added', async() => {
|
|
||||||
await page.reloadSection('account.role.card.subroles');
|
|
||||||
const subrolesCount = await page.countElement(selectors.accountSubroles.anyResult);
|
|
||||||
|
|
||||||
expect(subrolesCount).toEqual(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should access the employee roles inheritance then check the roles listed are the expected ones', async() => {
|
|
||||||
await page.accessToSearchResult('employee');
|
|
||||||
await page.accessToSection('account.role.card.inherited');
|
|
||||||
const rolesCount = await page.countElement(selectors.accountRoleInheritance.anyResult);
|
|
||||||
|
|
||||||
expect(rolesCount).toEqual(7);
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,60 +0,0 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
|
||||||
|
|
||||||
describe('Account ACL path', () => {
|
|
||||||
let browser;
|
|
||||||
let page;
|
|
||||||
|
|
||||||
beforeAll(async() => {
|
|
||||||
browser = await getBrowser();
|
|
||||||
page = browser.page;
|
|
||||||
await page.loginAndModule('developer', 'account');
|
|
||||||
await page.accessToSection('account.acl');
|
|
||||||
});
|
|
||||||
|
|
||||||
afterAll(async() => {
|
|
||||||
await browser.close();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should go to create new acl', async() => {
|
|
||||||
await page.waitToClick(selectors.accountAcl.addAcl);
|
|
||||||
await page.waitForState('account.acl.create');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should create new acl', async() => {
|
|
||||||
await page.autocompleteSearch(selectors.accountAcl.role, 'sysadmin');
|
|
||||||
await page.autocompleteSearch(selectors.accountAcl.model, 'Account');
|
|
||||||
await page.autocompleteSearch(selectors.accountAcl.accessType, '*');
|
|
||||||
await page.autocompleteSearch(selectors.accountAcl.permission, 'ALLOW');
|
|
||||||
await page.waitToClick(selectors.accountAcl.save);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should navigate to edit', async() => {
|
|
||||||
await page.doSearch();
|
|
||||||
await page.waitToClick(selectors.accountAcl.thirdAcl);
|
|
||||||
await page.waitForState('account.acl.edit');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should edit the third acl', async() => {
|
|
||||||
await page.autocompleteSearch(selectors.accountAcl.model, 'Supplier');
|
|
||||||
await page.autocompleteSearch(selectors.accountAcl.accessType, 'READ');
|
|
||||||
await page.waitToClick(selectors.accountAcl.save);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should delete the third result', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.accountAcl.thirdAcl, 'innerText');
|
|
||||||
await page.waitToClick(selectors.accountAcl.deleteThirdAcl);
|
|
||||||
await page.waitToClick(selectors.globalItems.acceptButton);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
const newResult = await page.waitToGetProperty(selectors.accountAcl.thirdAcl, 'innerText');
|
|
||||||
|
|
||||||
expect(message.text).toContain('ACL removed');
|
|
||||||
expect(result).not.toEqual(newResult);
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,25 +0,0 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
|
||||||
|
|
||||||
describe('Account Connections path', () => {
|
|
||||||
let browser;
|
|
||||||
let page;
|
|
||||||
const account = 'sysadmin';
|
|
||||||
|
|
||||||
beforeAll(async() => {
|
|
||||||
browser = await getBrowser();
|
|
||||||
page = browser.page;
|
|
||||||
await page.loginAndModule(account, 'account');
|
|
||||||
await page.accessToSection('account.connections');
|
|
||||||
});
|
|
||||||
|
|
||||||
afterAll(async() => {
|
|
||||||
await browser.close();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check this is the last connection', async() => {
|
|
||||||
const firstResult = await page.waitToGetProperty(selectors.accountConnections.firstConnection, 'innerText');
|
|
||||||
|
|
||||||
expect(firstResult).toContain(account);
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,37 +0,0 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
|
||||||
|
|
||||||
describe('Account Accounts path', () => {
|
|
||||||
let browser;
|
|
||||||
let page;
|
|
||||||
|
|
||||||
beforeAll(async() => {
|
|
||||||
browser = await getBrowser();
|
|
||||||
page = browser.page;
|
|
||||||
await page.loginAndModule('sysadmin', 'account');
|
|
||||||
await page.accessToSection('account.accounts');
|
|
||||||
});
|
|
||||||
|
|
||||||
afterAll(async() => {
|
|
||||||
await browser.close();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should sync roles', async() => {
|
|
||||||
await page.waitToClick(selectors.accountAccounts.syncRoles);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Roles synchronized!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should relogin', async() => {
|
|
||||||
await page.loginAndModule('sysadmin', 'account');
|
|
||||||
await page.accessToSection('account.accounts');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should sync all', async() => {
|
|
||||||
await page.waitToClick(selectors.accountAccounts.syncAll);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Synchronizing in the background');
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,41 +0,0 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
|
||||||
|
|
||||||
describe('Account LDAP path', () => {
|
|
||||||
let browser;
|
|
||||||
let page;
|
|
||||||
|
|
||||||
beforeAll(async() => {
|
|
||||||
browser = await getBrowser();
|
|
||||||
page = browser.page;
|
|
||||||
await page.loginAndModule('sysadmin', 'account');
|
|
||||||
await page.accessToSection('account.ldap');
|
|
||||||
});
|
|
||||||
|
|
||||||
afterAll(async() => {
|
|
||||||
await browser.close();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should set data and save', async() => {
|
|
||||||
await page.waitToClick(selectors.accountLdap.checkEnable);
|
|
||||||
await page.write(selectors.accountLdap.server, '1234');
|
|
||||||
await page.write(selectors.accountLdap.rdn, '1234');
|
|
||||||
await page.write(selectors.accountLdap.password, 'nightmare');
|
|
||||||
await page.write(selectors.accountLdap.userDn, 'sysadmin');
|
|
||||||
await page.write(selectors.accountLdap.groupDn, '1234');
|
|
||||||
await page.waitToClick(selectors.accountLdap.save);
|
|
||||||
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should reset data', async() => {
|
|
||||||
await page.waitToClick(selectors.accountLdap.checkEnable);
|
|
||||||
await page.waitToClick(selectors.accountLdap.save);
|
|
||||||
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,42 +0,0 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
|
||||||
|
|
||||||
describe('Account Samba path', () => {
|
|
||||||
let browser;
|
|
||||||
let page;
|
|
||||||
|
|
||||||
beforeAll(async() => {
|
|
||||||
browser = await getBrowser();
|
|
||||||
page = browser.page;
|
|
||||||
await page.loginAndModule('sysadmin', 'account');
|
|
||||||
await page.accessToSection('account.samba');
|
|
||||||
});
|
|
||||||
|
|
||||||
afterAll(async() => {
|
|
||||||
await browser.close();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should set data and save', async() => {
|
|
||||||
await page.waitToClick(selectors.accountSamba.checkEnable);
|
|
||||||
await page.write(selectors.accountSamba.adDomain, '1234');
|
|
||||||
await page.write(selectors.accountSamba.adController, '1234');
|
|
||||||
await page.write(selectors.accountSamba.adUser, 'sysadmin');
|
|
||||||
await page.write(selectors.accountSamba.adPassword, 'nightmare');
|
|
||||||
await page.write(selectors.accountSamba.userDn, 'testDn');
|
|
||||||
await page.waitToClick(selectors.accountSamba.verifyCert);
|
|
||||||
await page.waitToClick(selectors.accountSamba.save);
|
|
||||||
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should reset data', async() => {
|
|
||||||
await page.waitToClick(selectors.accountSamba.checkEnable);
|
|
||||||
await page.waitToClick(selectors.accountSamba.save);
|
|
||||||
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,112 +0,0 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
|
||||||
|
|
||||||
describe('Account privileges path', () => {
|
|
||||||
let browser;
|
|
||||||
let page;
|
|
||||||
|
|
||||||
beforeAll(async() => {
|
|
||||||
browser = await getBrowser();
|
|
||||||
page = browser.page;
|
|
||||||
await page.loginAndModule('developer', 'account');
|
|
||||||
await page.accessToSearchResult('1101');
|
|
||||||
await page.accessToSection('account.card.privileges');
|
|
||||||
});
|
|
||||||
|
|
||||||
afterAll(async() => {
|
|
||||||
await browser.close();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('as developer', () => {
|
|
||||||
it('should throw error when give privileges', async() => {
|
|
||||||
await page.waitToClick(selectors.accountPrivileges.checkHasGrant);
|
|
||||||
await page.waitToClick(selectors.accountPrivileges.save);
|
|
||||||
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain(`You don't have grant privilege`);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should throw error when change role', async() => {
|
|
||||||
await page.autocompleteSearch(selectors.accountPrivileges.role, 'employee');
|
|
||||||
await page.waitToClick(selectors.accountPrivileges.save);
|
|
||||||
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain(`You don't have grant privilege`);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('as sysadmin', () => {
|
|
||||||
beforeAll(async() => {
|
|
||||||
await page.loginAndModule('sysadmin', 'account');
|
|
||||||
await page.accessToSearchResult('9');
|
|
||||||
await page.accessToSection('account.card.privileges');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should give privileges', async() => {
|
|
||||||
await page.waitToClick(selectors.accountPrivileges.checkHasGrant);
|
|
||||||
await page.waitToClick(selectors.accountPrivileges.save);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
await page.reloadSection('account.card.privileges');
|
|
||||||
const result = await page.checkboxState(selectors.accountPrivileges.checkHasGrant);
|
|
||||||
|
|
||||||
expect(message.text).toContain(`Data saved!`);
|
|
||||||
expect(result).toBe('checked');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should throw error when change role and not own role', async() => {
|
|
||||||
await page.autocompleteSearch(selectors.accountPrivileges.role, 'itBoss');
|
|
||||||
await page.waitToClick(selectors.accountPrivileges.save);
|
|
||||||
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain(`You don't own the role and you can't assign it to another user`);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should change role to employee', async() => {
|
|
||||||
await page.autocompleteSearch(selectors.accountPrivileges.role, 'employee');
|
|
||||||
await page.waitToClick(selectors.accountPrivileges.save);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
await page.reloadSection('account.card.privileges');
|
|
||||||
const result = await page.waitToGetProperty(selectors.accountPrivileges.role, 'value');
|
|
||||||
|
|
||||||
expect(message.text).toContain(`Data saved!`);
|
|
||||||
expect(result).toContain('employee');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return role to developer', async() => {
|
|
||||||
await page.autocompleteSearch(selectors.accountPrivileges.role, 'developer');
|
|
||||||
await page.waitToClick(selectors.accountPrivileges.save);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
await page.reloadSection('account.card.privileges');
|
|
||||||
const result = await page.waitToGetProperty(selectors.accountPrivileges.role, 'value');
|
|
||||||
|
|
||||||
expect(message.text).toContain(`Data saved!`);
|
|
||||||
expect(result).toContain('developer');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('as developer again', () => {
|
|
||||||
it('should remove privileges', async() => {
|
|
||||||
await page.accessToSearchResult('9');
|
|
||||||
await page.accessToSection('account.card.privileges');
|
|
||||||
|
|
||||||
await page.waitToClick(selectors.accountPrivileges.checkHasGrant);
|
|
||||||
await page.waitToClick(selectors.accountPrivileges.save);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain(`Data saved!`);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should logIn in developer', async() => {
|
|
||||||
await page.reloadSection('account.card.privileges');
|
|
||||||
const result = await page.checkboxState(selectors.accountPrivileges.checkHasGrant);
|
|
||||||
|
|
||||||
expect(result).toBe('unchecked');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -13,7 +13,6 @@ module.exports = function(Self) {
|
||||||
Object.assign(Self, {
|
Object.assign(Self, {
|
||||||
setup() {
|
setup() {
|
||||||
Self.super_.setup.call(this);
|
Self.super_.setup.call(this);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Setting a global transaction timeout to find out if the service
|
* Setting a global transaction timeout to find out if the service
|
||||||
* is blocked because the connection pool is empty.
|
* is blocked because the connection pool is empty.
|
||||||
|
@ -28,6 +27,26 @@ module.exports = function(Self) {
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.beforeRemote('**', async ctx => {
|
||||||
|
if (!this.hasFilter(ctx)) return;
|
||||||
|
|
||||||
|
const defaultLimit = this.app.orm.selectLimit;
|
||||||
|
const filter = ctx.args.filter || {limit: defaultLimit};
|
||||||
|
|
||||||
|
if (filter.limit > defaultLimit) {
|
||||||
|
filter.limit = defaultLimit;
|
||||||
|
ctx.args.filter = filter;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.afterRemote('**', async ctx => {
|
||||||
|
if (!this.hasFilter(ctx)) return;
|
||||||
|
|
||||||
|
const {result} = ctx;
|
||||||
|
const length = Array.isArray(result) ? result.length : result ? 1 : 0;
|
||||||
|
if (length >= this.app.orm.selectLimit) throw new UserError('Too many records');
|
||||||
|
});
|
||||||
|
|
||||||
// Register field ACL validation
|
// Register field ACL validation
|
||||||
/*
|
/*
|
||||||
this.beforeRemote('prototype.patchAttributes', ctx => this.checkUpdateAcls(ctx));
|
this.beforeRemote('prototype.patchAttributes', ctx => this.checkUpdateAcls(ctx));
|
||||||
|
@ -327,6 +346,12 @@ module.exports = function(Self) {
|
||||||
|
|
||||||
checkInsertAcls(ctx) {
|
checkInsertAcls(ctx) {
|
||||||
return this.checkAcls(ctx, 'insert');
|
return this.checkAcls(ctx, 'insert');
|
||||||
|
},
|
||||||
|
|
||||||
|
hasFilter(ctx) {
|
||||||
|
return ctx.req.method.toUpperCase() === 'GET' &&
|
||||||
|
ctx.method.accepts.some(x => x.arg === 'filter' && x.type.toLowerCase() === 'object');
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
@ -369,5 +369,6 @@
|
||||||
"Cannot send mail": "Não é possível enviar o email",
|
"Cannot send mail": "Não é possível enviar o email",
|
||||||
"CONSTRAINT `supplierAccountTooShort` failed for `vn`.`supplier`": "La cuenta debe tener exactamente 10 dígitos",
|
"CONSTRAINT `supplierAccountTooShort` failed for `vn`.`supplier`": "La cuenta debe tener exactamente 10 dígitos",
|
||||||
"The sale not exists in the item shelving": "La venta no existe en la estantería del artículo",
|
"The sale not exists in the item shelving": "La venta no existe en la estantería del artículo",
|
||||||
"The entry not have stickers": "La entrada no tiene etiquetas"
|
"The entry not have stickers": "La entrada no tiene etiquetas",
|
||||||
|
"Too many records": "Demasiados registros"
|
||||||
}
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
module.exports = async function(app) {
|
||||||
|
if (!app.orm) {
|
||||||
|
const ormConfig = await app.models.OrmConfig.findOne();
|
||||||
|
app.orm = ormConfig;
|
||||||
|
}
|
||||||
|
};
|
|
@ -1,75 +0,0 @@
|
||||||
<vn-watcher
|
|
||||||
vn-id="watcher"
|
|
||||||
url="AccountConfigs"
|
|
||||||
data="$ctrl.config"
|
|
||||||
id-value="1"
|
|
||||||
form="form">
|
|
||||||
</vn-watcher>
|
|
||||||
<form
|
|
||||||
name="form"
|
|
||||||
ng-submit="watcher.submit()"
|
|
||||||
class="vn-w-md">
|
|
||||||
<vn-card class="vn-pa-lg" vn-focus>
|
|
||||||
<vn-vertical>
|
|
||||||
<vn-textfield
|
|
||||||
label="Homedir base"
|
|
||||||
ng-model="$ctrl.config.homedir"
|
|
||||||
rule="AccountConfig">
|
|
||||||
</vn-textfield>
|
|
||||||
<vn-textfield
|
|
||||||
label="Shell"
|
|
||||||
ng-model="$ctrl.config.shell"
|
|
||||||
rule="AccountConfig">
|
|
||||||
</vn-textfield>
|
|
||||||
<vn-input-number
|
|
||||||
label="User and role base id"
|
|
||||||
ng-model="$ctrl.config.idBase"
|
|
||||||
rule="AccountConfig">
|
|
||||||
</vn-input-number>
|
|
||||||
<vn-horizontal>
|
|
||||||
<vn-input-number
|
|
||||||
label="Min"
|
|
||||||
ng-model="$ctrl.config.min"
|
|
||||||
rule="AccountConfig">
|
|
||||||
</vn-input-number>
|
|
||||||
<vn-input-number
|
|
||||||
label="Max"
|
|
||||||
ng-model="$ctrl.config.max"
|
|
||||||
rule="AccountConfig">
|
|
||||||
</vn-input-number>
|
|
||||||
</vn-horizontal>
|
|
||||||
<vn-horizontal>
|
|
||||||
<vn-input-number
|
|
||||||
label="Warn"
|
|
||||||
ng-model="$ctrl.config.warn"
|
|
||||||
rule="AccountConfig">
|
|
||||||
</vn-input-number>
|
|
||||||
<vn-input-number
|
|
||||||
label="Inact"
|
|
||||||
ng-model="$ctrl.config.inact"
|
|
||||||
rule="AccountConfig">
|
|
||||||
</vn-input-number>
|
|
||||||
</vn-horizontal>
|
|
||||||
</vn-vertical>
|
|
||||||
</vn-card>
|
|
||||||
<vn-button-bar>
|
|
||||||
<vn-submit
|
|
||||||
disabled="!watcher.dataChanged()"
|
|
||||||
label="Save">
|
|
||||||
</vn-submit>
|
|
||||||
<vn-button
|
|
||||||
label="Synchronize all"
|
|
||||||
ng-click="$ctrl.onSynchronizeAll()">
|
|
||||||
</vn-button>
|
|
||||||
<vn-button
|
|
||||||
label="Synchronize roles"
|
|
||||||
ng-click="$ctrl.onSynchronizeRoles()">
|
|
||||||
</vn-button>
|
|
||||||
<vn-button
|
|
||||||
disabled="!watcher.dataChanged()"
|
|
||||||
class="cancel"
|
|
||||||
label="Undo changes"
|
|
||||||
ng-click="watcher.loadOriginalData()">
|
|
||||||
</vn-button>
|
|
||||||
</vn-button-bar>
|
|
||||||
</form>
|
|
|
@ -1,19 +0,0 @@
|
||||||
import ngModule from '../module';
|
|
||||||
import Section from 'salix/components/section';
|
|
||||||
|
|
||||||
export default class Controller extends Section {
|
|
||||||
onSynchronizeAll() {
|
|
||||||
this.vnApp.showSuccess(this.$t('Synchronizing in the background'));
|
|
||||||
this.$http.patch(`Accounts/syncAll`);
|
|
||||||
}
|
|
||||||
|
|
||||||
onSynchronizeRoles() {
|
|
||||||
this.$http.patch(`RoleInherits/sync`)
|
|
||||||
.then(() => this.vnApp.showSuccess(this.$t('Roles synchronized!')));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ngModule.component('vnAccountAccounts', {
|
|
||||||
template: require('./index.html'),
|
|
||||||
controller: Controller
|
|
||||||
});
|
|
|
@ -1,14 +0,0 @@
|
||||||
Accounts: Cuentas
|
|
||||||
Homedir base: Directorio base para carpetas de usuario
|
|
||||||
Shell: Intérprete de línea de comandos
|
|
||||||
User and role base id: Id base usuarios y roles
|
|
||||||
Synchronize all: Sincronizar todo
|
|
||||||
Synchronize roles: Sincronizar roles
|
|
||||||
If password is not specified, just user attributes are synchronized: >-
|
|
||||||
Si la contraseña no se especifica solo se sincronizarán lo atributos del usuario
|
|
||||||
Synchronizing in the background: Sincronizando en segundo plano
|
|
||||||
Users synchronized!: ¡Usuarios sincronizados!
|
|
||||||
Username: Nombre de usuario
|
|
||||||
Synchronize: Sincronizar
|
|
||||||
Please enter the username: Por favor introduce el nombre de usuario
|
|
||||||
Roles synchronized!: ¡Roles sincronizados!
|
|
|
@ -1,70 +0,0 @@
|
||||||
<vn-watcher
|
|
||||||
vn-id="watcher"
|
|
||||||
url="ACLs"
|
|
||||||
data="$ctrl.acl"
|
|
||||||
id-value="$ctrl.$params.id"
|
|
||||||
insert-mode="!$ctrl.$params.id"
|
|
||||||
form="form">
|
|
||||||
</vn-watcher>
|
|
||||||
<form
|
|
||||||
name="form"
|
|
||||||
vn-http-submit="watcher.submitGo('account.acl')"
|
|
||||||
class="vn-w-md">
|
|
||||||
<vn-card class="vn-pa-lg">
|
|
||||||
<vn-horizontal>
|
|
||||||
<vn-autocomplete
|
|
||||||
label="Role"
|
|
||||||
ng-model="$ctrl.acl.principalId"
|
|
||||||
url="VnRoles"
|
|
||||||
id-field="name"
|
|
||||||
value-field="name"
|
|
||||||
vn-focus>
|
|
||||||
</vn-autocomplete>
|
|
||||||
</vn-horizontal>
|
|
||||||
<vn-horizontal>
|
|
||||||
<vn-autocomplete
|
|
||||||
label="Model"
|
|
||||||
ng-model="$ctrl.acl.model"
|
|
||||||
data="$ctrl.models"
|
|
||||||
id-field="name"
|
|
||||||
value-field="name">
|
|
||||||
</vn-autocomplete>
|
|
||||||
</vn-horizontal>
|
|
||||||
<vn-horizontal>
|
|
||||||
<vn-textfield
|
|
||||||
label="Property"
|
|
||||||
ng-model="$ctrl.acl.property"
|
|
||||||
info="Use * to match all properties">
|
|
||||||
</vn-textfield>
|
|
||||||
</vn-horizontal>
|
|
||||||
<vn-horizontal>
|
|
||||||
<vn-autocomplete
|
|
||||||
label="Access type"
|
|
||||||
ng-model="$ctrl.acl.accessType"
|
|
||||||
data="$ctrl.accessTypes"
|
|
||||||
id-field="name"
|
|
||||||
value-field="name">
|
|
||||||
</vn-autocomplete>
|
|
||||||
</vn-horizontal>
|
|
||||||
<vn-horizontal>
|
|
||||||
<vn-autocomplete
|
|
||||||
label="Permission"
|
|
||||||
ng-model="$ctrl.acl.permission"
|
|
||||||
data="$ctrl.permissions"
|
|
||||||
id-field="name"
|
|
||||||
value-field="name">
|
|
||||||
</vn-autocomplete>
|
|
||||||
</vn-horizontal>
|
|
||||||
</vn-card>
|
|
||||||
<vn-button-bar>
|
|
||||||
<vn-submit
|
|
||||||
disabled="!watcher.dataChanged()"
|
|
||||||
label="Save">
|
|
||||||
</vn-submit>
|
|
||||||
<vn-button
|
|
||||||
class="cancel"
|
|
||||||
label="Cancel"
|
|
||||||
ui-sref="account.acl">
|
|
||||||
</vn-button>
|
|
||||||
</vn-button-bar>
|
|
||||||
</form>
|
|
|
@ -1,33 +0,0 @@
|
||||||
import ngModule from '../../module';
|
|
||||||
import Section from 'salix/components/section';
|
|
||||||
|
|
||||||
export default class Controller extends Section {
|
|
||||||
constructor(...args) {
|
|
||||||
super(...args);
|
|
||||||
this.accessTypes = [
|
|
||||||
{name: '*'},
|
|
||||||
{name: 'READ'},
|
|
||||||
{name: 'WRITE'}
|
|
||||||
];
|
|
||||||
this.permissions = [
|
|
||||||
{name: 'ALLOW'},
|
|
||||||
{name: 'DENY'}
|
|
||||||
];
|
|
||||||
|
|
||||||
this.models = [];
|
|
||||||
for (let model in window.validations)
|
|
||||||
this.models.push({name: model});
|
|
||||||
|
|
||||||
this.acl = {
|
|
||||||
property: '*',
|
|
||||||
principalType: 'ROLE',
|
|
||||||
accessType: 'READ',
|
|
||||||
permission: 'ALLOW'
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ngModule.component('vnAclCreate', {
|
|
||||||
template: require('./index.html'),
|
|
||||||
controller: Controller
|
|
||||||
});
|
|
|
@ -1,4 +0,0 @@
|
||||||
import './main';
|
|
||||||
import './index/';
|
|
||||||
import './create';
|
|
||||||
import './search-panel';
|
|
|
@ -1,51 +0,0 @@
|
||||||
<vn-auto-search
|
|
||||||
model="model">
|
|
||||||
</vn-auto-search>
|
|
||||||
<vn-data-viewer
|
|
||||||
model="model"
|
|
||||||
class="vn-w-sm">
|
|
||||||
<vn-card>
|
|
||||||
<vn-list class="separated">
|
|
||||||
<a
|
|
||||||
ng-repeat="row in model.data track by row.id"
|
|
||||||
ui-sref="account.acl.edit(::{id: row.id})"
|
|
||||||
translate-attr="{title: 'Edit ACL'}"
|
|
||||||
class="vn-item search-result">
|
|
||||||
<vn-item-section>
|
|
||||||
<h6>{{::row.model}}.{{::row.property}}</h6>
|
|
||||||
<vn-label-value
|
|
||||||
label="Role"
|
|
||||||
value="{{::row.principalId}}">
|
|
||||||
</vn-label-value>
|
|
||||||
<vn-label-value
|
|
||||||
label="Access type"
|
|
||||||
value="{{::row.accessType}}">
|
|
||||||
</vn-label-value>
|
|
||||||
<vn-label-value
|
|
||||||
label="Permission"
|
|
||||||
value="{{::row.permission}}">
|
|
||||||
</vn-label-value>
|
|
||||||
</vn-item-section>
|
|
||||||
<vn-item-section side>
|
|
||||||
<vn-icon-button
|
|
||||||
vn-click-stop="deleteAcl.show(row)"
|
|
||||||
vn-tooltip="Delete"
|
|
||||||
icon="delete">
|
|
||||||
</vn-icon-button>
|
|
||||||
</vn-item-section>
|
|
||||||
</a>
|
|
||||||
</vn-list>
|
|
||||||
</vn-card>
|
|
||||||
</vn-data-viewer>
|
|
||||||
<a ui-sref="account.acl.create"
|
|
||||||
vn-tooltip="New ACL"
|
|
||||||
vn-bind="+"
|
|
||||||
fixed-bottom-right>
|
|
||||||
<vn-float-button icon="add"></vn-float-button>
|
|
||||||
</a>
|
|
||||||
<vn-confirm
|
|
||||||
vn-id="deleteAcl"
|
|
||||||
on-accept="$ctrl.onDelete($data)"
|
|
||||||
question="Are you sure you want to continue?"
|
|
||||||
message="ACL will be removed">
|
|
||||||
</vn-confirm>
|
|
|
@ -1,15 +0,0 @@
|
||||||
import ngModule from '../../module';
|
|
||||||
import Section from 'salix/components/section';
|
|
||||||
|
|
||||||
export default class Controller extends Section {
|
|
||||||
onDelete(row) {
|
|
||||||
return this.$http.delete(`ACLs/${row.id}`)
|
|
||||||
.then(() => this.$.model.refresh())
|
|
||||||
.then(() => this.vnApp.showSuccess(this.$t('ACL removed')));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ngModule.component('vnAclIndex', {
|
|
||||||
template: require('./index.html'),
|
|
||||||
controller: Controller
|
|
||||||
});
|
|
|
@ -1,4 +0,0 @@
|
||||||
New ACL: Nuevo ACL
|
|
||||||
Edit ACL: Editar ACL
|
|
||||||
ACL will be removed: El ACL será eliminado
|
|
||||||
ACL removed: ACL eliminado
|
|
|
@ -1,4 +0,0 @@
|
||||||
Model: Modelo
|
|
||||||
Property: Propiedad
|
|
||||||
Access type: Tipo de acceso
|
|
||||||
Permission: Permiso
|
|
|
@ -1,20 +0,0 @@
|
||||||
<vn-crud-model
|
|
||||||
vn-id="model"
|
|
||||||
url="ACLs"
|
|
||||||
limit="20"
|
|
||||||
expr-builder="$ctrl.exprBuilder(param, value)"
|
|
||||||
auto-save="true">
|
|
||||||
</vn-crud-model>
|
|
||||||
<vn-portal slot="topbar">
|
|
||||||
<vn-searchbar
|
|
||||||
info="Search ACL by model name"
|
|
||||||
panel="vn-acl-search-panel"
|
|
||||||
model="model"
|
|
||||||
expr-builder="$ctrl.exprBuilder(param, value)"
|
|
||||||
base-state="account.acl"
|
|
||||||
entity-state="edit">
|
|
||||||
</vn-searchbar>
|
|
||||||
</vn-portal>
|
|
||||||
<ui-view>
|
|
||||||
<vn-acl-index></vn-acl-index>
|
|
||||||
</ui-view>
|
|
|
@ -1,18 +0,0 @@
|
||||||
import ngModule from '../../module';
|
|
||||||
import ModuleMain from 'salix/components/module-main';
|
|
||||||
|
|
||||||
export default class ACL extends ModuleMain {
|
|
||||||
exprBuilder(param, value) {
|
|
||||||
switch (param) {
|
|
||||||
case 'search':
|
|
||||||
return {model: {like: `%${value}%`}};
|
|
||||||
default:
|
|
||||||
return {[param]: value};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ngModule.vnComponent('vnAclComponent', {
|
|
||||||
controller: ACL,
|
|
||||||
template: require('./index.html')
|
|
||||||
});
|
|
|
@ -1,39 +0,0 @@
|
||||||
<div class="search-panel">
|
|
||||||
<form ng-submit="$ctrl.onSearch()">
|
|
||||||
<vn-vertical>
|
|
||||||
<vn-autocomplete
|
|
||||||
label="Role"
|
|
||||||
ng-model="filter.principalId"
|
|
||||||
url="VnRoles"
|
|
||||||
value-field="name">
|
|
||||||
</vn-autocomplete>
|
|
||||||
<vn-autocomplete
|
|
||||||
label="Model"
|
|
||||||
ng-model="filter.model"
|
|
||||||
data="$ctrl.models"
|
|
||||||
id-field="name"
|
|
||||||
value-field="name">
|
|
||||||
</vn-autocomplete>
|
|
||||||
<vn-textfield
|
|
||||||
label="Property"
|
|
||||||
ng-model="filter.property">
|
|
||||||
</vn-textfield>
|
|
||||||
<vn-autocomplete
|
|
||||||
label="Access type"
|
|
||||||
ng-model="filter.accessType"
|
|
||||||
data="$ctrl.accessTypes"
|
|
||||||
value-field="name">
|
|
||||||
</vn-autocomplete>
|
|
||||||
<vn-autocomplete
|
|
||||||
label="Permission"
|
|
||||||
ng-model="$ctrl.acl.permission"
|
|
||||||
data="$ctrl.permissions"
|
|
||||||
value-field="name">
|
|
||||||
</vn-autocomplete>
|
|
||||||
<vn-submit
|
|
||||||
label="Search"
|
|
||||||
class="vn-mt-lg">
|
|
||||||
</vn-submit>
|
|
||||||
</vn-vertical>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
|
@ -1,26 +0,0 @@
|
||||||
import ngModule from '../../module';
|
|
||||||
import SearchPanel from 'core/components/searchbar/search-panel';
|
|
||||||
|
|
||||||
export default class Controller extends SearchPanel {
|
|
||||||
constructor(...args) {
|
|
||||||
super(...args);
|
|
||||||
this.accessTypes = [
|
|
||||||
{name: '*'},
|
|
||||||
{name: 'READ'},
|
|
||||||
{name: 'WRITE'}
|
|
||||||
];
|
|
||||||
this.permissions = [
|
|
||||||
{name: 'ALLOW'},
|
|
||||||
{name: 'DENY'}
|
|
||||||
];
|
|
||||||
|
|
||||||
this.models = [];
|
|
||||||
for (let model in window.validations)
|
|
||||||
this.models.push({name: model});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ngModule.component('vnAclSearchPanel', {
|
|
||||||
template: require('./index.html'),
|
|
||||||
controller: Controller
|
|
||||||
});
|
|
|
@ -1,43 +0,0 @@
|
||||||
<vn-watcher
|
|
||||||
vn-id="watcher"
|
|
||||||
url="MailAliases"
|
|
||||||
data="$ctrl.alias"
|
|
||||||
form="form">
|
|
||||||
</vn-watcher>
|
|
||||||
<form
|
|
||||||
name="form"
|
|
||||||
ng-submit="watcher.submit()"
|
|
||||||
class="vn-w-md">
|
|
||||||
<vn-card class="vn-pa-lg">
|
|
||||||
<vn-vertical>
|
|
||||||
<vn-textfield
|
|
||||||
label="Name"
|
|
||||||
ng-model="$ctrl.alias.alias"
|
|
||||||
rule="MailAlias"
|
|
||||||
vn-focus>
|
|
||||||
</vn-textfield>
|
|
||||||
<vn-textfield
|
|
||||||
label="Description"
|
|
||||||
ng-model="$ctrl.alias.description"
|
|
||||||
rule="MailAlias">
|
|
||||||
</vn-textfield>
|
|
||||||
<vn-check
|
|
||||||
label="Public"
|
|
||||||
ng-model="$ctrl.alias.isPublic"
|
|
||||||
rule="MailAlias">
|
|
||||||
</vn-check>
|
|
||||||
</vn-vertical>
|
|
||||||
</vn-card>
|
|
||||||
<vn-button-bar>
|
|
||||||
<vn-submit
|
|
||||||
disabled="!watcher.dataChanged()"
|
|
||||||
label="Save">
|
|
||||||
</vn-submit>
|
|
||||||
<vn-button
|
|
||||||
class="cancel"
|
|
||||||
label="Undo changes"
|
|
||||||
disabled="!watcher.dataChanged()"
|
|
||||||
ng-click="watcher.loadOriginalData()">
|
|
||||||
</vn-button>
|
|
||||||
</vn-button-bar>
|
|
||||||
</form>
|
|
|
@ -1,12 +0,0 @@
|
||||||
import ngModule from '../../module';
|
|
||||||
import Section from 'salix/components/section';
|
|
||||||
|
|
||||||
export default class Controller extends Section {}
|
|
||||||
|
|
||||||
ngModule.component('vnAliasBasicData', {
|
|
||||||
template: require('./index.html'),
|
|
||||||
controller: Controller,
|
|
||||||
bindings: {
|
|
||||||
alias: '<'
|
|
||||||
}
|
|
||||||
});
|
|
|
@ -1,5 +0,0 @@
|
||||||
<vn-portal slot="menu">
|
|
||||||
<vn-alias-descriptor alias="$ctrl.alias"></vn-alias-descriptor>
|
|
||||||
<vn-left-menu source="alias"></vn-left-menu>
|
|
||||||
</vn-portal>
|
|
||||||
<ui-view></ui-view>
|
|
|
@ -1,14 +0,0 @@
|
||||||
import ngModule from '../../module';
|
|
||||||
import ModuleCard from 'salix/components/module-card';
|
|
||||||
|
|
||||||
class Controller extends ModuleCard {
|
|
||||||
reload() {
|
|
||||||
this.$http.get(`MailAliases/${this.$params.id}`)
|
|
||||||
.then(res => this.alias = res.data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ngModule.vnComponent('vnAliasCard', {
|
|
||||||
template: require('./index.html'),
|
|
||||||
controller: Controller
|
|
||||||
});
|
|
|
@ -1,38 +0,0 @@
|
||||||
<vn-watcher
|
|
||||||
vn-id="watcher"
|
|
||||||
url="MailAliases"
|
|
||||||
data="$ctrl.alias"
|
|
||||||
insert-mode="true"
|
|
||||||
form="form">
|
|
||||||
</vn-watcher>
|
|
||||||
<form
|
|
||||||
name="form"
|
|
||||||
vn-http-submit="$ctrl.onSubmit()"
|
|
||||||
class="vn-w-md">
|
|
||||||
<vn-card class="vn-pa-lg">
|
|
||||||
<vn-vertical>
|
|
||||||
<vn-textfield
|
|
||||||
label="Name"
|
|
||||||
ng-model="$ctrl.alias.alias"
|
|
||||||
rule="MailAlias"
|
|
||||||
vn-focus>
|
|
||||||
</vn-textfield>
|
|
||||||
<vn-textfield
|
|
||||||
label="Description"
|
|
||||||
ng-model="$ctrl.alias.description"
|
|
||||||
rule="MailAlias">
|
|
||||||
</vn-textfield>
|
|
||||||
</vn-vertical>
|
|
||||||
</vn-card>
|
|
||||||
<vn-button-bar>
|
|
||||||
<vn-submit
|
|
||||||
disabled="!watcher.dataChanged()"
|
|
||||||
label="Create">
|
|
||||||
</vn-submit>
|
|
||||||
<vn-button
|
|
||||||
class="cancel"
|
|
||||||
label="Cancel"
|
|
||||||
ui-sref="account.alias">
|
|
||||||
</vn-button>
|
|
||||||
</vn-button-bar>
|
|
||||||
</form>
|
|
|
@ -1,15 +0,0 @@
|
||||||
import ngModule from '../../module';
|
|
||||||
import Section from 'salix/components/section';
|
|
||||||
|
|
||||||
export default class Controller extends Section {
|
|
||||||
onSubmit() {
|
|
||||||
return this.$.watcher.submit().then(res =>
|
|
||||||
this.$state.go('account.alias.card.basicData', {id: res.data.id})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ngModule.component('vnAliasCreate', {
|
|
||||||
template: require('./index.html'),
|
|
||||||
controller: Controller
|
|
||||||
});
|
|
|
@ -1,27 +0,0 @@
|
||||||
<vn-descriptor-content
|
|
||||||
module="account"
|
|
||||||
base-state="account.alias"
|
|
||||||
description="$ctrl.alias.alias">
|
|
||||||
<slot-menu>
|
|
||||||
<vn-item
|
|
||||||
ng-click="deleteAlias.show()"
|
|
||||||
name="deleteAlias"
|
|
||||||
translate>
|
|
||||||
Delete
|
|
||||||
</vn-item>
|
|
||||||
</slot-menu>
|
|
||||||
<slot-body>
|
|
||||||
<div class="attributes">
|
|
||||||
<vn-label-value
|
|
||||||
label="Description"
|
|
||||||
value="{{$ctrl.alias.description}}">
|
|
||||||
</vn-label-value>
|
|
||||||
</div>
|
|
||||||
</slot-body>
|
|
||||||
</vn-descriptor-content>
|
|
||||||
<vn-confirm
|
|
||||||
vn-id="delete-alias"
|
|
||||||
on-accept="$ctrl.onDelete()"
|
|
||||||
question="Are you sure you want to continue?"
|
|
||||||
message="Alias will be removed">
|
|
||||||
</vn-confirm>
|
|
|
@ -1,26 +0,0 @@
|
||||||
import ngModule from '../../module';
|
|
||||||
import Descriptor from 'salix/components/descriptor';
|
|
||||||
|
|
||||||
class Controller extends Descriptor {
|
|
||||||
get alias() {
|
|
||||||
return this.entity;
|
|
||||||
}
|
|
||||||
|
|
||||||
set alias(value) {
|
|
||||||
this.entity = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
onDelete() {
|
|
||||||
return this.$http.delete(`MailAliases/${this.id}`)
|
|
||||||
.then(() => this.$state.go('account.alias'))
|
|
||||||
.then(() => this.vnApp.showSuccess(this.$t('Alias removed')));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ngModule.component('vnAliasDescriptor', {
|
|
||||||
template: require('./index.html'),
|
|
||||||
controller: Controller,
|
|
||||||
bindings: {
|
|
||||||
alias: '<'
|
|
||||||
}
|
|
||||||
});
|
|
|
@ -1,2 +0,0 @@
|
||||||
Alias will be removed: El alias será eliminado
|
|
||||||
Alias removed: Alias eliminado
|
|
|
@ -1,9 +0,0 @@
|
||||||
import './main';
|
|
||||||
import './index/';
|
|
||||||
import './create';
|
|
||||||
import './summary';
|
|
||||||
import './card';
|
|
||||||
import './descriptor';
|
|
||||||
import './create';
|
|
||||||
import './basic-data';
|
|
||||||
import './users';
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue