fixes #4866 más detalle en faltas #1201

Merged
alexandre merged 14 commits from 4866-detalle-faltas into dev 2023-01-17 07:37:50 +00:00
91 changed files with 33288 additions and 35867 deletions
Showing only changes of commit 62152d1668 - Show all commits

View File

@ -43,6 +43,9 @@ module.exports = Self => {
if (!recipient) if (!recipient)
throw new Error(`Could not send message "${message}" to worker id ${recipientId} from user ${userId}`); throw new Error(`Could not send message "${message}" to worker id ${recipientId} from user ${userId}`);
if (process.env.NODE_ENV == 'test')
message = `[Test:Environment to user ${userId}] ` + message;
await models.Chat.create({ await models.Chat.create({
senderFk: sender.id, senderFk: sender.id,
recipient: `@${recipient.name}`, recipient: `@${recipient.name}`,

View File

@ -19,11 +19,11 @@ describe('getStarredModules()', () => {
}); });
it(`should return the starred modules for a given user`, async() => { it(`should return the starred modules for a given user`, async() => {
const newStarred = await app.models.StarredModule.create({workerFk: 9, moduleFk: 'Clients', position: 1}); const newStarred = await app.models.StarredModule.create({workerFk: 9, moduleFk: 'customer', position: 1});
const starredModules = await app.models.StarredModule.getStarredModules(ctx); const starredModules = await app.models.StarredModule.getStarredModules(ctx);
expect(starredModules.length).toEqual(1); expect(starredModules.length).toEqual(1);
expect(starredModules[0].moduleFk).toEqual('Clients'); expect(starredModules[0].moduleFk).toEqual('customer');
// restores // restores
await app.models.StarredModule.destroyById(newStarred.id); await app.models.StarredModule.destroyById(newStarred.id);

View File

@ -26,29 +26,29 @@ describe('setPosition()', () => {
const filter = { const filter = {
where: { where: {
workerFk: ctx.req.accessToken.userId, workerFk: ctx.req.accessToken.userId,
moduleFk: 'Orders' moduleFk: 'order'
} }
}; };
try { try {
const options = {transaction: tx}; const options = {transaction: tx};
await app.models.StarredModule.toggleStarredModule(ctx, 'Orders', options); await app.models.StarredModule.toggleStarredModule(ctx, 'order', options);
await app.models.StarredModule.toggleStarredModule(ctx, 'Clients', options); await app.models.StarredModule.toggleStarredModule(ctx, 'customer', options);
let orders = await app.models.StarredModule.findOne(filter, options); let orders = await app.models.StarredModule.findOne(filter, options);
filter.where.moduleFk = 'Clients'; filter.where.moduleFk = 'customer';
let clients = await app.models.StarredModule.findOne(filter, options); let clients = await app.models.StarredModule.findOne(filter, options);
expect(orders.position).toEqual(1); expect(orders.position).toEqual(1);
expect(clients.position).toEqual(2); expect(clients.position).toEqual(2);
await app.models.StarredModule.setPosition(ctx, 'Clients', 'left', options); await app.models.StarredModule.setPosition(ctx, 'customer', 'left', options);
filter.where.moduleFk = 'Clients'; filter.where.moduleFk = 'customer';
clients = await app.models.StarredModule.findOne(filter, options); clients = await app.models.StarredModule.findOne(filter, options);
filter.where.moduleFk = 'Orders'; filter.where.moduleFk = 'order';
orders = await app.models.StarredModule.findOne(filter, options); orders = await app.models.StarredModule.findOne(filter, options);
expect(clients.position).toEqual(1); expect(clients.position).toEqual(1);
@ -67,29 +67,29 @@ describe('setPosition()', () => {
const filter = { const filter = {
where: { where: {
workerFk: ctx.req.accessToken.userId, workerFk: ctx.req.accessToken.userId,
moduleFk: 'Orders' moduleFk: 'order'
} }
}; };
try { try {
const options = {transaction: tx}; const options = {transaction: tx};
await app.models.StarredModule.toggleStarredModule(ctx, 'Orders', options); await app.models.StarredModule.toggleStarredModule(ctx, 'order', options);
await app.models.StarredModule.toggleStarredModule(ctx, 'Clients', options); await app.models.StarredModule.toggleStarredModule(ctx, 'customer', options);
let orders = await app.models.StarredModule.findOne(filter, options); let orders = await app.models.StarredModule.findOne(filter, options);
filter.where.moduleFk = 'Clients'; filter.where.moduleFk = 'customer';
let clients = await app.models.StarredModule.findOne(filter, options); let clients = await app.models.StarredModule.findOne(filter, options);
expect(orders.position).toEqual(1); expect(orders.position).toEqual(1);
expect(clients.position).toEqual(2); expect(clients.position).toEqual(2);
await app.models.StarredModule.setPosition(ctx, 'Orders', 'right', options); await app.models.StarredModule.setPosition(ctx, 'order', 'right', options);
filter.where.moduleFk = 'Orders'; filter.where.moduleFk = 'order';
orders = await app.models.StarredModule.findOne(filter, options); orders = await app.models.StarredModule.findOne(filter, options);
filter.where.moduleFk = 'Clients'; filter.where.moduleFk = 'customer';
clients = await app.models.StarredModule.findOne(filter, options); clients = await app.models.StarredModule.findOne(filter, options);
expect(orders.position).toEqual(2); expect(orders.position).toEqual(2);
@ -108,35 +108,35 @@ describe('setPosition()', () => {
const filter = { const filter = {
where: { where: {
workerFk: ctx.req.accessToken.userId, workerFk: ctx.req.accessToken.userId,
moduleFk: 'Items' moduleFk: 'item'
} }
}; };
try { try {
const options = {transaction: tx}; const options = {transaction: tx};
await app.models.StarredModule.toggleStarredModule(ctx, 'Clients', options); await app.models.StarredModule.toggleStarredModule(ctx, 'customer', options);
await app.models.StarredModule.toggleStarredModule(ctx, 'Orders', options); await app.models.StarredModule.toggleStarredModule(ctx, 'order', options);
await app.models.StarredModule.toggleStarredModule(ctx, 'Clients', options); await app.models.StarredModule.toggleStarredModule(ctx, 'customer', options);
await app.models.StarredModule.toggleStarredModule(ctx, 'Orders', options); await app.models.StarredModule.toggleStarredModule(ctx, 'order', options);
await app.models.StarredModule.toggleStarredModule(ctx, 'Items', options); await app.models.StarredModule.toggleStarredModule(ctx, 'item', options);
await app.models.StarredModule.toggleStarredModule(ctx, 'Claims', options); await app.models.StarredModule.toggleStarredModule(ctx, 'claim', options);
await app.models.StarredModule.toggleStarredModule(ctx, 'Clients', options); await app.models.StarredModule.toggleStarredModule(ctx, 'customer', options);
await app.models.StarredModule.toggleStarredModule(ctx, 'Orders', options); await app.models.StarredModule.toggleStarredModule(ctx, 'order', options);
await app.models.StarredModule.toggleStarredModule(ctx, 'Zones', options); await app.models.StarredModule.toggleStarredModule(ctx, 'zone', options);
const items = await app.models.StarredModule.findOne(filter, options); const items = await app.models.StarredModule.findOne(filter, options);
filter.where.moduleFk = 'Claims'; filter.where.moduleFk = 'claim';
const claims = await app.models.StarredModule.findOne(filter, options); const claims = await app.models.StarredModule.findOne(filter, options);
filter.where.moduleFk = 'Clients'; filter.where.moduleFk = 'customer';
let clients = await app.models.StarredModule.findOne(filter, options); let clients = await app.models.StarredModule.findOne(filter, options);
filter.where.moduleFk = 'Orders'; filter.where.moduleFk = 'order';
let orders = await app.models.StarredModule.findOne(filter, options); let orders = await app.models.StarredModule.findOne(filter, options);
filter.where.moduleFk = 'Zones'; filter.where.moduleFk = 'zone';
const zones = await app.models.StarredModule.findOne(filter, options); const zones = await app.models.StarredModule.findOne(filter, options);
expect(items.position).toEqual(1); expect(items.position).toEqual(1);
@ -145,12 +145,12 @@ describe('setPosition()', () => {
expect(orders.position).toEqual(4); expect(orders.position).toEqual(4);
expect(zones.position).toEqual(5); expect(zones.position).toEqual(5);
await app.models.StarredModule.setPosition(ctx, 'Clients', 'right', options); await app.models.StarredModule.setPosition(ctx, 'customer', 'right', options);
filter.where.moduleFk = 'Orders'; filter.where.moduleFk = 'order';
orders = await app.models.StarredModule.findOne(filter, options); orders = await app.models.StarredModule.findOne(filter, options);
filter.where.moduleFk = 'Clients'; filter.where.moduleFk = 'customer';
clients = await app.models.StarredModule.findOne(filter, options); clients = await app.models.StarredModule.findOne(filter, options);
expect(orders.position).toEqual(3); expect(orders.position).toEqual(3);
@ -169,31 +169,31 @@ describe('setPosition()', () => {
const filter = { const filter = {
where: { where: {
workerFk: ctx.req.accessToken.userId, workerFk: ctx.req.accessToken.userId,
moduleFk: 'Items' moduleFk: 'item'
} }
}; };
try { try {
const options = {transaction: tx}; const options = {transaction: tx};
await app.models.StarredModule.toggleStarredModule(ctx, 'Items', options); await app.models.StarredModule.toggleStarredModule(ctx, 'item', options);
await app.models.StarredModule.toggleStarredModule(ctx, 'Clients', options); await app.models.StarredModule.toggleStarredModule(ctx, 'customer', options);
await app.models.StarredModule.toggleStarredModule(ctx, 'Claims', options); await app.models.StarredModule.toggleStarredModule(ctx, 'claim', options);
await app.models.StarredModule.toggleStarredModule(ctx, 'Orders', options); await app.models.StarredModule.toggleStarredModule(ctx, 'order', options);
await app.models.StarredModule.toggleStarredModule(ctx, 'Zones', options); await app.models.StarredModule.toggleStarredModule(ctx, 'zone', options);
const items = await app.models.StarredModule.findOne(filter, options); const items = await app.models.StarredModule.findOne(filter, options);
filter.where.moduleFk = 'Clients'; filter.where.moduleFk = 'customer';
let clients = await app.models.StarredModule.findOne(filter, options); let clients = await app.models.StarredModule.findOne(filter, options);
filter.where.moduleFk = 'Claims'; filter.where.moduleFk = 'claim';
const claims = await app.models.StarredModule.findOne(filter, options); const claims = await app.models.StarredModule.findOne(filter, options);
filter.where.moduleFk = 'Orders'; filter.where.moduleFk = 'order';
let orders = await app.models.StarredModule.findOne(filter, options); let orders = await app.models.StarredModule.findOne(filter, options);
filter.where.moduleFk = 'Zones'; filter.where.moduleFk = 'zone';
const zones = await app.models.StarredModule.findOne(filter, options); const zones = await app.models.StarredModule.findOne(filter, options);
expect(items.position).toEqual(1); expect(items.position).toEqual(1);
@ -202,13 +202,13 @@ describe('setPosition()', () => {
expect(orders.position).toEqual(4); expect(orders.position).toEqual(4);
expect(zones.position).toEqual(5); expect(zones.position).toEqual(5);
await app.models.StarredModule.toggleStarredModule(ctx, 'Claims', options); await app.models.StarredModule.toggleStarredModule(ctx, 'claim', options);
await app.models.StarredModule.setPosition(ctx, 'Clients', 'right', options); await app.models.StarredModule.setPosition(ctx, 'customer', 'right', options);
filter.where.moduleFk = 'Clients'; filter.where.moduleFk = 'customer';
clients = await app.models.StarredModule.findOne(filter, options); clients = await app.models.StarredModule.findOne(filter, options);
filter.where.moduleFk = 'Orders'; filter.where.moduleFk = 'order';
orders = await app.models.StarredModule.findOne(filter, options); orders = await app.models.StarredModule.findOne(filter, options);
expect(orders.position).toEqual(2); expect(orders.position).toEqual(2);

View File

@ -21,15 +21,15 @@ describe('toggleStarredModule()', () => {
}); });
it('should create a new starred module and then remove it by calling the method again with same args', async() => { it('should create a new starred module and then remove it by calling the method again with same args', async() => {
const starredModule = await app.models.StarredModule.toggleStarredModule(ctx, 'Orders'); const starredModule = await app.models.StarredModule.toggleStarredModule(ctx, 'order');
let starredModules = await app.models.StarredModule.getStarredModules(ctx); let starredModules = await app.models.StarredModule.getStarredModules(ctx);
expect(starredModules.length).toEqual(1); expect(starredModules.length).toEqual(1);
expect(starredModule.moduleFk).toEqual('Orders'); expect(starredModule.moduleFk).toEqual('order');
expect(starredModule.workerFk).toEqual(activeCtx.accessToken.userId); expect(starredModule.workerFk).toEqual(activeCtx.accessToken.userId);
expect(starredModule.position).toEqual(starredModules.length); expect(starredModule.position).toEqual(starredModules.length);
await app.models.StarredModule.toggleStarredModule(ctx, 'Orders'); await app.models.StarredModule.toggleStarredModule(ctx, 'order');
starredModules = await app.models.StarredModule.getStarredModules(ctx); starredModules = await app.models.StarredModule.getStarredModules(ctx);
expect(starredModules.length).toEqual(0); expect(starredModules.length).toEqual(0);

View File

@ -12,14 +12,9 @@ BEGIN
* @param vAuthorFk The notification author or %NULL if there is no author * @param vAuthorFk The notification author or %NULL if there is no author
* @return The notification id * @return The notification id
*/ */
DECLARE vNotificationFk INT;
SELECT id INTO vNotificationFk
FROM `notification`
WHERE `name` = vNotificationName;
INSERT INTO notificationQueue INSERT INTO notificationQueue
SET notificationFk = vNotificationFk, SET notificationFk = vNotificationName,
params = vParams, params = vParams,
authorFk = vAuthorFk; authorFk = vAuthorFk;

View File

@ -1 +0,0 @@
Delete this file

View File

@ -0,0 +1 @@
ALTER TABLE `vn`.`entry` DROP COLUMN `ref`;

View File

@ -0,0 +1,12 @@
CREATE TABLE `vn`.`invoiceInConfig` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`retentionRate` int(3) NOT NULL,
`retentionName` varchar(25) NOT NULL,
`sageWithholdingFk` smallint(6) NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `invoiceInConfig_sageWithholdingFk` FOREIGN KEY (`sageWithholdingFk`) REFERENCES `sage`.`TiposRetencion`(`CodigoRetencion`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
INSERT INTO `vn`.`invoiceInConfig` (`id`, `retentionRate`, `retentionName`, `sageWithholdingFk`)
VALUES
(1, -2, 'Retención 2%', 2);

View File

@ -0,0 +1,46 @@
DROP TRIGGER IF EXISTS `vn`.`supplier_beforeUpdate`;
USE `vn`;
DELIMITER $$
$$
CREATE DEFINER=`root`@`localhost` TRIGGER `vn`.`supplier_beforeUpdate`
BEFORE UPDATE ON `supplier`
FOR EACH ROW
BEGIN
DECLARE vHasChange BOOL;
DECLARE vPayMethodChanged BOOL;
DECLARE vPayMethodHasVerified BOOL;
DECLARE vParams JSON;
DECLARE vOldPayMethodName VARCHAR(20);
DECLARE vNewPayMethodName VARCHAR(20);
SELECT hasVerified INTO vPayMethodHasVerified
FROM payMethod
WHERE id = NEW.payMethodFk;
SET vPayMethodChanged = NOT(NEW.payMethodFk <=> OLD.payMethodFk);
IF vPayMethodChanged THEN
SELECT name INTO vOldPayMethodName
FROM payMethod
WHERE id = OLD.payMethodFk;
SELECT name INTO vNewPayMethodName
FROM payMethod
WHERE id = NEW.payMethodFk;
SET vParams = JSON_OBJECT(
'name', NEW.name,
'oldPayMethod', vOldPayMethodName,
'newPayMethod', vNewPayMethodName
);
SELECT util.notification_send('supplier-pay-method-update', vParams, NULL) INTO @id;
END IF;
SET vHasChange = NOT(NEW.payDemFk <=> OLD.payDemFk AND NEW.payDay <=> OLD.payDay) OR vPayMethodChanged;
IF vHasChange AND vPayMethodHasVerified THEN
SET NEW.isPayMethodChecked = FALSE;
END IF;
END$$
DELIMITER ;

View File

@ -0,0 +1,60 @@
UPDATE salix.module t
SET t.code = 'supplier'
WHERE t.code LIKE 'Suppliers' ESCAPE '#';
UPDATE salix.module t
SET t.code = 'travel'
WHERE t.code LIKE 'Travels' ESCAPE '#';
UPDATE salix.module t
SET t.code = 'ticket'
WHERE t.code LIKE 'Tickets' ESCAPE '#';
UPDATE salix.module t
SET t.code = 'zone'
WHERE t.code LIKE 'Zones' ESCAPE '#';
UPDATE salix.module t
SET t.code = 'monitor'
WHERE t.code LIKE 'Monitors' ESCAPE '#';
UPDATE salix.module t
SET t.code = 'entry'
WHERE t.code LIKE 'Entries' ESCAPE '#';
UPDATE salix.module t
SET t.code = 'invoiceIn'
WHERE t.code LIKE 'Invoices in' ESCAPE '#';
UPDATE salix.module t
SET t.code = 'customer'
WHERE t.code LIKE 'Clients' ESCAPE '#';
UPDATE salix.module t
SET t.code = 'route'
WHERE t.code LIKE 'Routes' ESCAPE '#';
UPDATE salix.module t
SET t.code = 'item'
WHERE t.code LIKE 'Items' ESCAPE '#';
UPDATE salix.module t
SET t.code = 'claim'
WHERE t.code LIKE 'Claims' ESCAPE '#';
UPDATE salix.module t
SET t.code = 'user'
WHERE t.code LIKE 'Users' ESCAPE '#';
UPDATE salix.module t
SET t.code = 'invoiceOut'
WHERE t.code LIKE 'Invoices out' ESCAPE '#';
UPDATE salix.module t
SET t.code = 'order'
WHERE t.code LIKE 'Orders' ESCAPE '#';
UPDATE salix.module t
SET t.code = 'worker'
WHERE t.code LIKE 'Workers' ESCAPE '#';

View File

@ -0,0 +1,16 @@
UPDATE `vn`.starredModule SET moduleFk = 'customer' WHERE moduleFk = 'Clients';
UPDATE `vn`.starredModule SET moduleFk = 'ticket' WHERE moduleFk = 'Tickets';
UPDATE `vn`.starredModule SET moduleFk = 'route' WHERE moduleFk = 'Routes';
UPDATE `vn`.starredModule SET moduleFk = 'zone' WHERE moduleFk = 'Zones';
UPDATE `vn`.starredModule SET moduleFk = 'order' WHERE moduleFk = 'Orders';
UPDATE `vn`.starredModule SET moduleFk = 'claim' WHERE moduleFk = 'Claims';
UPDATE `vn`.starredModule SET moduleFk = 'item' WHERE moduleFk = 'Items';
UPDATE `vn`.starredModule SET moduleFk = 'worker' WHERE moduleFk = 'Workers';
UPDATE `vn`.starredModule SET moduleFk = 'entry' WHERE moduleFk = 'Entries';
UPDATE `vn`.starredModule SET moduleFk = 'invoiceOut' WHERE moduleFk = 'Invoices out';
UPDATE `vn`.starredModule SET moduleFk = 'invoiceIn' WHERE moduleFk = 'Invoices in';
UPDATE `vn`.starredModule SET moduleFk = 'monitor' WHERE moduleFk = 'Monitors';
UPDATE `vn`.starredModule SET moduleFk = 'user' WHERE moduleFk = 'Users';
UPDATE `vn`.starredModule SET moduleFk = 'supplier' WHERE moduleFk = 'Suppliers';
UPDATE `vn`.starredModule SET moduleFk = 'travel' WHERE moduleFk = 'Travels';
UPDATE `vn`.starredModule SET moduleFk = 'shelving' WHERE moduleFk = 'Shelvings';

File diff suppressed because one or more lines are too long

View File

@ -60,7 +60,7 @@ INSERT INTO `vn`.`educationLevel` (`id`, `name`)
INSERT INTO `vn`.`worker`(`id`,`code`, `firstName`, `lastName`, `userFk`, `bossFk`) INSERT INTO `vn`.`worker`(`id`,`code`, `firstName`, `lastName`, `userFk`, `bossFk`)
SELECT id,UPPER(LPAD(role, 3, '0')), name, name, id, 9 SELECT id,UPPER(LPAD(role, 3, '0')), name, name, id, 9
FROM `vn`.`user`; FROM `account`.`user`;
UPDATE `vn`.`worker` SET bossFk = NULL WHERE id = 20; UPDATE `vn`.`worker` SET bossFk = NULL WHERE id = 20;
UPDATE `vn`.`worker` SET bossFk = 20 WHERE id = 1 OR id = 9; UPDATE `vn`.`worker` SET bossFk = 20 WHERE id = 1 OR id = 9;
@ -105,20 +105,8 @@ INSERT INTO `account`.`mailForward`(`account`, `forwardTo`)
VALUES VALUES
(1, 'employee@domain.local'); (1, 'employee@domain.local');
INSERT INTO `vn`.`printer` (`id`, `name`, `path`, `isLabeler`)
VALUES
(1, 'printer1', 'path1', 0),
(2, 'printer2', 'path2', 1);
INSERT INTO `vn`.`worker`(`id`, `code`, `firstName`, `lastName`, `userFk`,`bossFk`, `phone`, `sectorFk`, `labelerFk`)
VALUES
(1106, 'LGN', 'David Charles', 'Haller', 1106, 19, 432978106, NULL, NULL),
(1107, 'ANT', 'Hank' , 'Pym' , 1107, 19, 432978107, NULL, 1),
(1108, 'DCX', 'Charles' , 'Xavier', 1108, 19, 432978108, 1, NULL),
(1109, 'HLK', 'Bruce' , 'Banner', 1109, 19, 432978109, 1, 2),
(1110, 'JJJ', 'Jessica' , 'Jones' , 1110, 19, 432978110, 2, 1);
INSERT INTO `vn`.`currency`(`id`, `code`, `name`, `ratio`) INSERT INTO `vn`.`currency`(`id`, `code`, `name`, `ratio`)
VALUES VALUES
(1, 'EUR', 'Euro', 1), (1, 'EUR', 'Euro', 1),
@ -159,6 +147,19 @@ INSERT INTO `vn`.`sector`(`id`, `description`, `warehouseFk`, `isPreviousPrepare
(1, 'First sector', 1, 1, 'FIRST'), (1, 'First sector', 1, 1, 'FIRST'),
(2, 'Second sector', 2, 0, 'SECOND'); (2, 'Second sector', 2, 0, 'SECOND');
INSERT INTO `vn`.`printer` (`id`, `name`, `path`, `isLabeler`, `sectorFk`)
VALUES
(1, 'printer1', 'path1', 0, 1),
(2, 'printer2', 'path2', 1, 1);
INSERT INTO `vn`.`worker`(`id`, `code`, `firstName`, `lastName`, `userFk`,`bossFk`, `phone`, `sectorFk`, `labelerFk`)
VALUES
(1106, 'LGN', 'David Charles', 'Haller', 1106, 19, 432978106, NULL, NULL),
(1107, 'ANT', 'Hank' , 'Pym' , 1107, 19, 432978107, NULL, NULL),
(1108, 'DCX', 'Charles' , 'Xavier', 1108, 19, 432978108, 1, NULL),
(1109, 'HLK', 'Bruce' , 'Banner', 1109, 19, 432978109, 1, NULL),
(1110, 'JJJ', 'Jessica' , 'Jones' , 1110, 19, 432978110, 2, NULL);
INSERT INTO `vn`.`parking` (`id`, `column`, `row`, `sectorFk`, `code`, `pickingOrder`) INSERT INTO `vn`.`parking` (`id`, `column`, `row`, `sectorFk`, `code`, `pickingOrder`)
VALUES VALUES
('1', 700, '01', 1, '700-01', 70001), ('1', 700, '01', 1, '700-01', 70001),
@ -216,18 +217,18 @@ INSERT INTO `vn`.`deliveryMethod`(`id`, `code`, `description`)
(3, 'PICKUP', 'Recogida'), (3, 'PICKUP', 'Recogida'),
(4, 'OTHER', 'Otros'); (4, 'OTHER', 'Otros');
INSERT INTO `vn`.`agency`(`id`, `name`, `warehouseFk`, `bankFk__`, `warehouseAliasFk`) INSERT INTO `vn`.`agency`(`id`, `name`, `warehouseFk`, `warehouseAliasFk`)
VALUES VALUES
(1, 'inhouse pickup' , 1, 1, 1), (1, 'inhouse pickup' , 1, 1),
(2, 'Super-Man delivery' , 1, 1, 1), (2, 'Super-Man delivery' , 1, 1),
(3, 'Teleportation device' , 1, 1, 1), (3, 'Teleportation device' , 1, 1),
(4, 'Entanglement' , 1, 1, 1), (4, 'Entanglement' , 1, 1),
(5, 'Quantum break device' , 1, 1, 1), (5, 'Quantum break device' , 1, 1),
(6, 'Walking' , 1, 1, 1), (6, 'Walking' , 1, 1),
(7, 'Gotham247' , 1, 1, 1), (7, 'Gotham247' , 1, 1),
(8, 'Gotham247Expensive' , 1, 1, 1), (8, 'Gotham247Expensive' , 1, 1),
(9, 'Refund' , 1, 1, 1), (9, 'Refund' , 1, 1),
(10, 'Other agency' , 1, 1, 1); (10, 'Other agency' , 1, 1);
UPDATE `vn`.`agencyMode` SET `id` = 1 WHERE `name` = 'inhouse pickup'; UPDATE `vn`.`agencyMode` SET `id` = 1 WHERE `name` = 'inhouse pickup';
UPDATE `vn`.`agencyMode` SET `id` = 2 WHERE `name` = 'Super-Man delivery'; UPDATE `vn`.`agencyMode` SET `id` = 2 WHERE `name` = 'Super-Man delivery';
@ -921,21 +922,21 @@ INSERT INTO `vn`.`expeditionStateType`(`id`, `description`, `code`)
(3, 'Perdida', 'LOST'); (3, 'Perdida', 'LOST');
INSERT INTO `vn`.`expedition`(`id`, `agencyModeFk`, `ticketFk`, `freightItemFk`, `created`, `itemFk__`, `counter`, `workerFk`, `externalId`, `packagingFk`, `stateTypeFk`, `hostFk`) INSERT INTO `vn`.`expedition`(`id`, `agencyModeFk`, `ticketFk`, `freightItemFk`, `created`, `counter`, `workerFk`, `externalId`, `packagingFk`, `stateTypeFk`, `hostFk`)
VALUES VALUES
(1, 1, 1, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 15, 1, 18, 'UR9000006041', 94, 1, 'pc1'), (1, 1, 1, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 18, 'UR9000006041', 94, 1, 'pc1'),
(2, 1, 1, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 16, 2, 18, 'UR9000006041', 94, 1, NULL), (2, 1, 1, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 18, 'UR9000006041', 94, 1, NULL),
(3, 1, 1, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), NULL, 3, 18, 'UR9000006041', 94, 2, NULL), (3, 1, 1, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 3, 18, 'UR9000006041', 94, 2, NULL),
(4, 1, 1, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), NULL, 4, 18, 'UR9000006041', 94, 2, NULL), (4, 1, 1, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 4, 18, 'UR9000006041', 94, 2, NULL),
(5, 1, 2, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), NULL, 1, 18, NULL, 94, 3, NULL), (5, 1, 2, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 18, NULL, 94, 3, NULL),
(6, 7, 3, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), NULL, 1, 18, NULL, 94, 3, NULL), (6, 7, 3, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), 1, 18, NULL, 94, 3, NULL),
(7, 2, 4, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH), NULL, 1, 18, NULL, 94, NULL,NULL), (7, 2, 4, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -3 MONTH), 1, 18, NULL, 94, NULL,NULL),
(8, 3, 5, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH), NULL, 1, 18, NULL, 94, 1, NULL), (8, 3, 5, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -4 MONTH), 1, 18, NULL, 94, 1, NULL),
(9, 3, 6, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), NULL, 1, 18, NULL, 94, 2, NULL), (9, 3, 6, 71, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 18, NULL, 94, 2, NULL),
(10, 7, 7, 71, NOW(), NULL, 1, 18, NULL, 94, 3, NULL), (10, 7, 7, 71, NOW(), 1, 18, NULL, 94, 3, NULL),
(11, 7, 8, 71, NOW(), NULL, 1, 18, NULL, 94, 3, NULL), (11, 7, 8, 71, NOW(), 1, 18, NULL, 94, 3, NULL),
(12, 7, 9, 71, NOW(), NULL, 1, 18, NULL, 94, 3, NULL), (12, 7, 9, 71, NOW(), 1, 18, NULL, 94, 3, NULL),
(13, 1, 10,71, NOW(), NULL, 1, 18, NULL, 94, 3, NULL); (13, 1, 10,71, NOW(), 1, 18, NULL, 94, 3, NULL);
INSERT INTO `vn`.`expeditionState`(`id`, `created`, `expeditionFk`, `typeFk`, `userFk`) INSERT INTO `vn`.`expeditionState`(`id`, `created`, `expeditionFk`, `typeFk`, `userFk`)
@ -1132,11 +1133,11 @@ INSERT INTO `vn`.`saleComponent`(`saleFk`, `componentFk`, `value`)
(32, 36, -92.324), (32, 36, -92.324),
(32, 39, 0.994); (32, 39, 0.994);
INSERT INTO `vn`.`itemShelving` (`itemFk`, `shelvingFk`, `shelve`, `visible`, `grouping`, `packing`, `userFk`) INSERT INTO `vn`.`itemShelving` (`itemFk`, `shelvingFk`, `visible`, `grouping`, `packing`, `userFk`)
VALUES VALUES
(2, 'GVC', 'A', 1, 1, 1, 1106), (2, 'GVC', 1, 1, 1, 1106),
(4, 'HEJ', 'A', 1, 1, 1, 1106), (4, 'HEJ', 1, 1, 1, 1106),
(1, 'UXN', 'A', 2, 12, 12, 1106); (1, 'UXN', 2, 12, 12, 1106);
INSERT INTO `vn`.`itemShelvingSale` (`itemShelvingFk`, `saleFk`, `quantity`, `created`, `userFk`) INSERT INTO `vn`.`itemShelvingSale` (`itemShelvingFk`, `saleFk`, `quantity`, `created`, `userFk`)
VALUES VALUES
@ -1377,16 +1378,16 @@ INSERT INTO `vn`.`travel`(`id`,`shipped`, `landed`, `warehouseInFk`, `warehouseO
(7, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 4, 1, 50.00, 500, 'seventh travel', 2, 1), (7, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 4, 1, 50.00, 500, 'seventh travel', 2, 1),
(8, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 1, 1, 50.00, 500, 'eight travel', 1, 2); (8, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 1, 1, 50.00, 500, 'eight travel', 1, 2);
INSERT INTO `vn`.`entry`(`id`, `supplierFk`, `created`, `travelFk`, `isConfirmed`, `companyFk`, `ref`,`isExcludedFromAvailable`, `isRaid`, `notes`, `evaNotes`) INSERT INTO `vn`.`entry`(`id`, `supplierFk`, `created`, `travelFk`, `isConfirmed`, `companyFk`, `invoiceNumber`, `reference`, `isExcludedFromAvailable`, `isRaid`, `notes`, `evaNotes`)
VALUES VALUES
(1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 1, 442, 'Movement 1', 0, 0, '', ''), (1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 1, 442, 'IN2001', 'Movement 1', 0, 0, '', ''),
(2, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 442, 'Movement 2', 0, 0, 'this is the note two', 'observation two'), (2, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 442, 'IN2002', 'Movement 2', 0, 0, 'this is the note two', 'observation two'),
(3, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 3, 0, 442, 'Movement 3', 0, 0, 'this is the note three', 'observation three'), (3, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 3, 0, 442, 'IN2003', 'Movement 3', 0, 0, 'this is the note three', 'observation three'),
(4, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 69, 'Movement 4', 0, 0, 'this is the note four', 'observation four'), (4, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 69, 'IN2004', 'Movement 4', 0, 0, 'this is the note four', 'observation four'),
(5, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 0, 442, 'Movement 5', 0, 0, 'this is the note five', 'observation five'), (5, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 0, 442, 'IN2005', 'Movement 5', 0, 0, 'this is the note five', 'observation five'),
(6, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 6, 0, 442, 'Movement 6', 0, 0, 'this is the note six', 'observation six'), (6, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 6, 0, 442, 'IN2006', 'Movement 6', 0, 0, 'this is the note six', 'observation six'),
(7, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'Movement 7', 0, 0, 'this is the note seven', 'observation seven'), (7, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2007', 'Movement 7', 0, 0, 'this is the note seven', 'observation seven'),
(8, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'Movement 8', 1, 1, '', ''); (8, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2008', 'Movement 8', 1, 1, '', '');
INSERT INTO `bs`.`waste`(`buyer`, `year`, `week`, `family`, `itemFk`, `itemTypeFk`, `saleTotal`, `saleWaste`, `rate`) INSERT INTO `bs`.`waste`(`buyer`, `year`, `week`, `family`, `itemFk`, `itemTypeFk`, `saleTotal`, `saleWaste`, `rate`)
VALUES VALUES
@ -1406,23 +1407,23 @@ INSERT INTO `bs`.`waste`(`buyer`, `year`, `week`, `family`, `itemFk`, `itemTypeF
('HankPym', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Miscellaneous Accessories', 6, 1, '186', '0', '0.0'), ('HankPym', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Miscellaneous Accessories', 6, 1, '186', '0', '0.0'),
('HankPym', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Adhesives', 7, 1, '277', '0', '0.0'); ('HankPym', YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK)), WEEK(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 WEEK), 1), 'Adhesives', 7, 1, '277', '0', '0.0');
INSERT INTO `vn`.`buy`(`id`,`entryFk`,`itemFk`,`buyingValue`,`quantity`,`packageFk`,`stickers`,`freightValue`,`packageValue`,`comissionValue`,`packing`,`grouping`,`groupingMode`,`location`,`price1`,`price2`,`price3`,`producer`,`printedStickers`,`isChecked`,`isIgnored`,`weight`, `created`) INSERT INTO `vn`.`buy`(`id`,`entryFk`,`itemFk`,`buyingValue`,`quantity`,`packageFk`,`stickers`,`freightValue`,`packageValue`,`comissionValue`,`packing`,`grouping`,`groupingMode`,`location`,`price1`,`price2`,`price3`, `printedStickers`,`isChecked`,`isIgnored`,`weight`, `created`)
VALUES VALUES
(1, 1, 1, 50, 5000, 4, 1, 1.500, 1.500, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, NULL, 0, 1, 0, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH)), (1, 1, 1, 50, 5000, 4, 1, 1.500, 1.500, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, 0, 1, 0, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH)),
(2, 2, 1, 50, 100, 4, 1, 1.500, 1.500, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, NULL, 0, 1, 0, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)), (2, 2, 1, 50, 100, 4, 1, 1.500, 1.500, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, 0, 1, 0, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH)),
(3, 3, 1, 50, 100, 4, 1, 1.500, 1.500, 0.000, 1, 1, 0, NULL, 0.00, 99.6, 99.4, NULL, 0, 1, 0, 1, util.VN_CURDATE()), (3, 3, 1, 50, 100, 4, 1, 1.500, 1.500, 0.000, 1, 1, 0, NULL, 0.00, 99.6, 99.4, 0, 1, 0, 1, util.VN_CURDATE()),
(4, 2, 2, 5, 450, 3, 1, 1.000, 1.000, 0.000, 10, 10, 0, NULL, 0.00, 7.30, 7.00, NULL, 0, 1, 0, 2.5, util.VN_CURDATE()), (4, 2, 2, 5, 450, 3, 1, 1.000, 1.000, 0.000, 10, 10, 0, NULL, 0.00, 7.30, 7.00, 0, 1, 0, 2.5, util.VN_CURDATE()),
(5, 3, 3, 55, 500, 5, 1, 1.000, 1.000, 0.000, 1, 1, 0, NULL, 0.00, 78.3, 75.6, NULL, 0, 1, 0, 2.5, util.VN_CURDATE()), (5, 3, 3, 55, 500, 5, 1, 1.000, 1.000, 0.000, 1, 1, 0, NULL, 0.00, 78.3, 75.6, 0, 1, 0, 2.5, util.VN_CURDATE()),
(6, 4, 8, 50, 1000, 4, 1, 1.000, 1.000, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, NULL, 0, 1, 0, 2.5, util.VN_CURDATE()), (6, 4, 8, 50, 1000, 4, 1, 1.000, 1.000, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, 0, 1, 0, 2.5, util.VN_CURDATE()),
(7, 4, 9, 20, 1000, 3, 1, 0.500, 0.500, 0.000, 10, 10, 1, NULL, 0.00, 30.50, 29.00, NULL, 0, 1, 0, 2.5, util.VN_CURDATE()), (7, 4, 9, 20, 1000, 3, 1, 0.500, 0.500, 0.000, 10, 10, 1, NULL, 0.00, 30.50, 29.00, 0, 1, 0, 2.5, util.VN_CURDATE()),
(8, 4, 4, 1.25, 1000, 3, 1, 0.500, 0.500, 0.000, 10, 10, 1, NULL, 0.00, 1.75, 1.67, NULL, 0, 1, 0, 2.5, util.VN_CURDATE()), (8, 4, 4, 1.25, 1000, 3, 1, 0.500, 0.500, 0.000, 10, 10, 1, NULL, 0.00, 1.75, 1.67, 0, 1, 0, 2.5, util.VN_CURDATE()),
(9, 4, 4, 1.25, 1000, 3, 1, 0.500, 0.500, 0.000, 10, 10, 1, NULL, 0.00, 1.75, 1.67, NULL, 0, 1, 0, 4, util.VN_CURDATE()), (9, 4, 4, 1.25, 1000, 3, 1, 0.500, 0.500, 0.000, 10, 10, 1, NULL, 0.00, 1.75, 1.67, 0, 1, 0, 4, util.VN_CURDATE()),
(10, 5, 1, 50, 10, 4, 1, 2.500, 2.500, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, NULL, 0, 1, 0, 4, util.VN_CURDATE()), (10, 5, 1, 50, 10, 4, 1, 2.500, 2.500, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, 0, 1, 0, 4, util.VN_CURDATE()),
(11, 5, 4, 1.25, 10, 3, 1, 2.500, 2.500, 0.000, 10, 10, 1, NULL, 0.00, 1.75, 1.67, NULL, 0, 1, 0, 4, util.VN_CURDATE()), (11, 5, 4, 1.25, 10, 3, 1, 2.500, 2.500, 0.000, 10, 10, 1, NULL, 0.00, 1.75, 1.67, 0, 1, 0, 4, util.VN_CURDATE()),
(12, 6, 4, 1.25, 0, 3, 1, 2.500, 2.500, 0.000, 10, 10, 1, NULL, 0.00, 1.75, 1.67, NULL, 0, 1, 0, 4, util.VN_CURDATE()), (12, 6, 4, 1.25, 0, 3, 1, 2.500, 2.500, 0.000, 10, 10, 1, NULL, 0.00, 1.75, 1.67, 0, 1, 0, 4, util.VN_CURDATE()),
(13, 7, 1, 50, 0, 3, 1, 2.000, 2.000, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, NULL, 0, 1, 0, 4, util.VN_CURDATE()), (13, 7, 1, 50, 0, 3, 1, 2.000, 2.000, 0.000, 1, 1, 1, NULL, 0.00, 99.6, 99.4, 0, 1, 0, 4, util.VN_CURDATE()),
(14, 7, 2, 5, 0, 3, 1, 2.000, 2.000, 0.000, 10, 10, 1, NULL, 0.00, 7.30, 7.00, NULL, 0, 1, 0, 4, util.VN_CURDATE()), (14, 7, 2, 5, 0, 3, 1, 2.000, 2.000, 0.000, 10, 10, 1, NULL, 0.00, 7.30, 7.00, 0, 1, 0, 4, util.VN_CURDATE()),
(15, 7, 4, 1.25, 0, 3, 1, 2.000, 2.000, 0.000, 10, 10, 1, NULL, 0.00, 1.75, 1.67, NULL, 0, 1, 0, 4, util.VN_CURDATE()); (15, 7, 4, 1.25, 0, 3, 1, 2.000, 2.000, 0.000, 10, 10, 1, NULL, 0.00, 1.75, 1.67, 0, 1, 0, 4, util.VN_CURDATE());
INSERT INTO `hedera`.`order`(`id`, `date_send`, `customer_id`, `delivery_method_id`, `agency_id`, `address_id`, `company_id`, `note`, `source_app`, `confirmed`,`total`, `date_make`, `first_row_stamp`, `confirm_date`) INSERT INTO `hedera`.`order`(`id`, `date_send`, `customer_id`, `delivery_method_id`, `agency_id`, `address_id`, `company_id`, `note`, `source_app`, `confirmed`,`total`, `date_make`, `first_row_stamp`, `confirm_date`)
VALUES VALUES
@ -1951,30 +1952,34 @@ INSERT INTO `vn`.`workerBusinessType` (`id`, `name`, `isFullTime`, `isPermanent`
(100, 'INDEFINIDO A TIEMPO COMPLETO', 1, 1, 1), (100, 'INDEFINIDO A TIEMPO COMPLETO', 1, 1, 1),
(109, 'CONVERSION DE TEMPORAL EN INDEFINIDO T.COMPLETO', 1, 1, 1); (109, 'CONVERSION DE TEMPORAL EN INDEFINIDO T.COMPLETO', 1, 1, 1);
INSERT INTO `vn`.`businessCategory` (`id`, `description`, `rate`)
VALUES
(1, 'basic employee', 1);
UPDATE `vn`.`business` b UPDATE `vn`.`business` b
SET `rate` = 7, SET `rate` = 7,
`workerBusinessCategoryFk` = 12, `workerBusinessCategoryFk` = 1,
`workerBusinessTypeFk` = 100, `workerBusinessTypeFk` = 100,
`amount` = 900.50 `amount` = 900.50
WHERE b.id = 1; WHERE b.id = 1;
UPDATE `vn`.`business` b UPDATE `vn`.`business` b
SET `rate` = 7, SET `rate` = 7,
`workerBusinessCategoryFk` = 12, `workerBusinessCategoryFk` = 1,
`workerBusinessTypeFk` = 100, `workerBusinessTypeFk` = 100,
`amount` = 1263.03 `amount` = 1263.03
WHERE b.id = 1106; WHERE b.id = 1106;
UPDATE `vn`.`business` b UPDATE `vn`.`business` b
SET `rate` = 7, SET `rate` = 7,
`workerBusinessCategoryFk` = 12, `workerBusinessCategoryFk` = 1,
`workerBusinessTypeFk` = 100, `workerBusinessTypeFk` = 100,
`amount` = 2000 `amount` = 2000
WHERE b.id = 1107; WHERE b.id = 1107;
UPDATE `vn`.`business` b UPDATE `vn`.`business` b
SET `rate` = 7, SET `rate` = 7,
`workerBusinessCategoryFk` = 12, `workerBusinessCategoryFk` = 1,
`workerBusinessTypeFk` = 100, `workerBusinessTypeFk` = 100,
`amount` = 1500 `amount` = 1500
WHERE b.id = 1108; WHERE b.id = 1108;
@ -2684,7 +2689,8 @@ INSERT INTO `util`.`notificationConfig`
INSERT INTO `util`.`notification` (`id`, `name`, `description`) INSERT INTO `util`.`notification` (`id`, `name`, `description`)
VALUES VALUES
(1, 'print-email', 'notification fixture one'); (1, 'print-email', 'notification fixture one'),
(3, 'supplier-pay-method-update', 'A supplier pay method has been updated');
INSERT INTO `util`.`notificationAcl` (`notificationFk`, `roleFk`) INSERT INTO `util`.`notificationAcl` (`notificationFk`, `roleFk`)
VALUES VALUES
@ -2732,3 +2738,14 @@ INSERT INTO `vn`.`osTicketConfig` (`id`, `host`, `user`, `password`, `oldStatus`
INSERT INTO `vn`.`ticketLog` (`id`, `originFk`, `userFk`, `action`, `changedModel`, `oldInstance`, `newInstance`, `changedModelId`) INSERT INTO `vn`.`ticketLog` (`id`, `originFk`, `userFk`, `action`, `changedModel`, `oldInstance`, `newInstance`, `changedModelId`)
VALUES VALUES
(1, 1, 9, 'insert', 'Ticket', '{}', '{"clientFk":1, "nickname": "Bat cave"}', 1); (1, 1, 9, 'insert', 'Ticket', '{}', '{"clientFk":1, "nickname": "Bat cave"}', 1);
INSERT INTO `salix`.`url` (`appName`, `environment`, `url`)
VALUES
('lilium', 'dev', 'http://localhost:8080/#/'),
('salix', 'dev', 'http://localhost:5000/#!/');
INSERT INTO `vn`.`payDemDetail` (`id`, `detail`)
VALUES
(1, 1);

File diff suppressed because it is too large Load Diff

View File

@ -41,6 +41,7 @@ dump_tables ${TABLES[@]}
TABLES=( TABLES=(
vn vn
agencyTermConfig
alertLevel alertLevel
bookingPlanner bookingPlanner
businessType businessType

View File

@ -6,7 +6,6 @@ SCHEMAS=(
cache cache
edi edi
hedera hedera
nst
pbx pbx
postgresql postgresql
sage sage
@ -104,4 +103,4 @@ mysqldump \
| sed 's/\bLOCALTIME\b/util.VN_NOW/ig' \ | sed 's/\bLOCALTIME\b/util.VN_NOW/ig' \
| sed 's/\bLOCALTIMESTAMP\b/util.VN_NOW/ig' \ | sed 's/\bLOCALTIMESTAMP\b/util.VN_NOW/ig' \
| sed 's/ AUTO_INCREMENT=[0-9]* //g' \ | sed 's/ AUTO_INCREMENT=[0-9]* //g' \
> dump/structure.sql > dump/structure.sql

View File

@ -1,7 +1,8 @@
import selectors from '../../helpers/selectors'; import selectors from '../../helpers/selectors';
import getBrowser from '../../helpers/puppeteer'; import getBrowser from '../../helpers/puppeteer';
describe('Login path', async() => { // https://redmine.verdnatura.es/issues/4995 fix login
xdescribe('RecoverPassword path', async() => {
let browser; let browser;
let page; let page;

View File

@ -29,6 +29,7 @@ export default class Modules {
const module = { const module = {
name: mod.name || mod.module, name: mod.name || mod.module,
code: mod.module,
icon: mod.icon || null, icon: mod.icon || null,
route, route,
keyBind keyBind

View File

@ -1,8 +1,9 @@
<vn-layout <vn-layout
ng-if="$ctrl.showLayout"> ng-if="$ctrl.showLayout">
</vn-layout> </vn-layout>
<vn-out-layout <ui-view
name="login"
ng-if="!$ctrl.showLayout"> ng-if="!$ctrl.showLayout">
</vn-out-layout> </ui-view>
<vn-snackbar vn-id="snackbar"></vn-snackbar> <vn-snackbar vn-id="snackbar"></vn-snackbar>
<vn-debug-info></vn-debug-info> <vn-debug-info></vn-debug-info>

View File

@ -21,7 +21,7 @@ export default class App extends Component {
get showLayout() { get showLayout() {
const state = this.$state.current.name || this.$location.$$path.substring(1).replace('/', '.'); const state = this.$state.current.name || this.$location.$$path.substring(1).replace('/', '.');
const outLayout = ['login', 'recoverPassword', 'resetPassword']; const outLayout = ['login', 'recoverPassword', 'resetPassword', 'reset-password'];
return state && !outLayout.some(ol => ol == state); return state && !outLayout.some(ol => ol == state);
} }

View File

@ -33,7 +33,9 @@ export default class Controller extends Component {
if (!res.data.length) return; if (!res.data.length) return;
for (let starredModule of res.data) { for (let starredModule of res.data) {
const module = this.modules.find(mod => mod.name === starredModule.moduleFk); let moduleName = starredModule.moduleFk;
if (moduleName === 'customer') moduleName = 'client';
const module = this.modules.find(mod => mod.code === moduleName);
if (module) { if (module) {
module.starred = true; module.starred = true;
module.position = starredModule.position; module.position = starredModule.position;
@ -47,8 +49,10 @@ export default class Controller extends Component {
if (event.defaultPrevented) return; if (event.defaultPrevented) return;
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
let moduleName = module.code;
if (moduleName === 'client') moduleName = 'customer';
const params = {moduleName: module.name}; const params = {moduleName};
const query = `starredModules/toggleStarredModule`; const query = `starredModules/toggleStarredModule`;
this.$http.post(query, params).then(res => { this.$http.post(query, params).then(res => {
if (res.data) { if (res.data) {
@ -84,13 +88,16 @@ export default class Controller extends Component {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
const params = {moduleName: module.name, direction: direction}; let moduleName = module.code;
if (moduleName === 'client') moduleName = 'customer';
const params = {moduleName: moduleName, direction: direction};
const query = `starredModules/setPosition`; const query = `starredModules/setPosition`;
this.$http.post(query, params).then(res => { this.$http.post(query, params).then(res => {
if (res.data) { if (res.data) {
module.position = res.data.movingModule.position; module.position = res.data.movingModule.position;
this.modules.forEach(mod => { this.modules.forEach(mod => {
if (mod.name == res.data.pushedModule.moduleFk) if (mod.code == res.data.pushedModule.moduleFk)
mod.position = res.data.pushedModule.position; mod.position = res.data.pushedModule.position;
}); });
this.vnApp.showSuccess(this.$t('Data saved!')); this.vnApp.showSuccess(this.$t('Data saved!'));

View File

@ -19,7 +19,7 @@ describe('Salix Component vnHome', () => {
describe('getStarredModules()', () => { describe('getStarredModules()', () => {
it('should not set any of the modules as starred if there are no starred modules for the user', () => { it('should not set any of the modules as starred if there are no starred modules for the user', () => {
const expectedResponse = []; const expectedResponse = [];
controller._modules = [{module: 'client', name: 'Clients'}]; controller._modules = [{code: 'client', name: 'Clients'}];
$httpBackend.whenRoute('GET', 'starredModules/getStarredModules').respond(expectedResponse); $httpBackend.whenRoute('GET', 'starredModules/getStarredModules').respond(expectedResponse);
$httpBackend.expectGET('starredModules/getStarredModules').respond(expectedResponse); $httpBackend.expectGET('starredModules/getStarredModules').respond(expectedResponse);
@ -31,8 +31,8 @@ describe('Salix Component vnHome', () => {
}); });
it('should set the example module as starred since its the starred module for the user', () => { it('should set the example module as starred since its the starred module for the user', () => {
const expectedResponse = [{id: 1, moduleFk: 'Clients', workerFk: 9}]; const expectedResponse = [{id: 1, moduleFk: 'customer', workerFk: 9}];
controller._modules = [{module: 'client', name: 'Clients'}]; controller._modules = [{code: 'client', name: 'Clients'}];
$httpBackend.whenRoute('GET', 'starredModules/getStarredModules').respond(expectedResponse); $httpBackend.whenRoute('GET', 'starredModules/getStarredModules').respond(expectedResponse);
$httpBackend.expectGET('starredModules/getStarredModules').respond(expectedResponse); $httpBackend.expectGET('starredModules/getStarredModules').respond(expectedResponse);
@ -48,7 +48,7 @@ describe('Salix Component vnHome', () => {
it(`should set the received module as starred if it wasn't starred`, () => { it(`should set the received module as starred if it wasn't starred`, () => {
const expectedResponse = [{id: 1, moduleFk: 'Clients', workerFk: 9}]; const expectedResponse = [{id: 1, moduleFk: 'Clients', workerFk: 9}];
const event = new Event('target'); const event = new Event('target');
controller._modules = [{module: 'client', name: 'Clients'}]; controller._modules = [{code: 'client', name: 'Clients'}];
$httpBackend.whenRoute('GET', 'starredModules/getStarredModules').respond(expectedResponse); $httpBackend.whenRoute('GET', 'starredModules/getStarredModules').respond(expectedResponse);
$httpBackend.expectPOST('starredModules/toggleStarredModule').respond(expectedResponse); $httpBackend.expectPOST('starredModules/toggleStarredModule').respond(expectedResponse);
@ -61,7 +61,7 @@ describe('Salix Component vnHome', () => {
it('should set the received module as regular if it was starred', () => { it('should set the received module as regular if it was starred', () => {
const event = new Event('target'); const event = new Event('target');
controller._modules = [{module: 'client', name: 'Clients', starred: true}]; controller._modules = [{code: 'client', name: 'Clients', starred: true}];
$httpBackend.whenRoute('GET', 'starredModules/getStarredModules').respond([]); $httpBackend.whenRoute('GET', 'starredModules/getStarredModules').respond([]);
$httpBackend.expectPOST('starredModules/toggleStarredModule').respond(undefined); $httpBackend.expectPOST('starredModules/toggleStarredModule').respond(undefined);
@ -76,18 +76,18 @@ describe('Salix Component vnHome', () => {
describe('moveModule()', () => { describe('moveModule()', () => {
it('should perform a query to setPosition and the apply the position to the moved and pushed modules', () => { it('should perform a query to setPosition and the apply the position to the moved and pushed modules', () => {
const starredModules = [ const starredModules = [
{id: 1, moduleFk: 'Clients', workerFk: 9}, {id: 1, moduleFk: 'customer', workerFk: 9},
{id: 2, moduleFk: 'Orders', workerFk: 9} {id: 2, moduleFk: 'order', workerFk: 9}
]; ];
const movedModules = { const movedModules = {
movingModule: {position: 2, moduleFk: 'Clients'}, movingModule: {position: 2, moduleFk: 'customer'},
pushedModule: {position: 1, moduleFk: 'Orders'} pushedModule: {position: 1, moduleFk: 'order'}
}; };
const event = new Event('target'); const event = new Event('target');
controller._modules = [ controller._modules = [
{module: 'client', name: 'Clients', position: 1}, {code: 'client', name: 'Clients', position: 1},
{module: 'orders', name: 'Orders', position: 2} {code: 'order', name: 'Orders', position: 2}
]; ];
$httpBackend.whenRoute('GET', 'starredModules/getStarredModules').respond(starredModules); $httpBackend.whenRoute('GET', 'starredModules/getStarredModules').respond(starredModules);

View File

@ -52,16 +52,14 @@
<tbody> <tbody>
<tr ng-repeat="prop in ::log.props"> <tr ng-repeat="prop in ::log.props">
<td class="field">{{prop.name}}</td> <td class="field">{{prop.name}}</td>
<td class="before">{{::$ctrl.formatValue(prop.old)}}</td> <td class="before">{{prop.old}}</td>
<td class="after">{{::$ctrl.formatValue(prop.new)}}</td> <td class="after">{{prop.new}}</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<vn-one ng-if="!log.newProperties" id="description"> <div ng-if="log.description != null">
<div> {{::log.description}}
<span no-ellipsize>{{::log.description}}</span> </div>
</div>
</vn-one>
</vn-td> </vn-td>
</vn-tr> </vn-tr>
</vn-tbody> </vn-tbody>

View File

@ -2,6 +2,8 @@ import ngModule from '../../module';
import Section from '../section'; import Section from '../section';
import './style.scss'; import './style.scss';
const validDate = /^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]+)?(Z)?$/;
export default class Controller extends Section { export default class Controller extends Section {
constructor($element, $) { constructor($element, $) {
super($element, $); super($element, $);
@ -10,7 +12,7 @@ export default class Controller extends Section {
'update': 'Updates', 'update': 'Updates',
'delete': 'Deletes', 'delete': 'Deletes',
'select': 'Views' 'select': 'Views'
}; ``; };
this.filter = { this.filter = {
include: [{ include: [{
relation: 'user', relation: 'user',
@ -34,52 +36,44 @@ export default class Controller extends Section {
set logs(value) { set logs(value) {
this._logs = value; this._logs = value;
if (!this.logs) return; if (!this.logs) return;
const empty = {};
const validations = window.validations; const validations = window.validations;
for (const log of value) { for (const log of value) {
const locale = validations[log.changedModel] && validations[log.changedModel].locale const oldValues = log.oldInstance || empty;
? validations[log.changedModel].locale : {}; const newValues = log.newInstance || empty;
log.oldProperties = this.getInstance(log.oldInstance, locale); const locale = validations[log.changedModel]?.locale || empty;
log.newProperties = this.getInstance(log.newInstance, locale);
let props = [].concat(log.oldProperties.map(p => p.key), log.newProperties.map(p => p.key)); let props = Object.keys(oldValues).concat(Object.keys(newValues));
props = [...new Set(props)]; props = [...new Set(props)];
log.props = []; log.props = [];
for (const prop of props) { for (const prop of props) {
const matchOldProp = log.oldProperties.find(p => p.key === prop);
const matchNewProp = log.newProperties.find(p => p.key === prop);
log.props.push({ log.props.push({
name: prop, name: locale[prop] || prop,
old: matchOldProp ? matchOldProp.value : null, old: this.formatValue(oldValues[prop]),
new: matchNewProp ? matchNewProp.value : null, new: this.formatValue(newValues[prop])
}); });
} }
} }
} }
formatValue(value) { formatValue(value) {
if (typeof value === 'string' && validDate.test(value))
value = new Date(value);
switch (typeof value) { switch (typeof value) {
case 'boolean': case 'boolean':
return value ? '✓' : '✗'; return value ? '✓' : '✗';
case 'object':
if (value instanceof Date)
return this.$filter('date')(value, 'dd/MM/yyyy HH:mm:ss');
else
return value;
default: default:
return value; return value;
} }
} }
getInstance(instance, locale) {
const properties = [];
let validDate = /^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]+)?(Z)?$/;
if (typeof instance == 'object' && instance != null) {
Object.keys(instance).forEach(property => {
if (validDate.test(instance[property]))
instance[property] = new Date(instance[property]).toLocaleString('es-ES');
const key = locale[property] || property;
properties.push({key, value: instance[property]});
});
return properties;
}
return null;
}
showWorkerDescriptor(event, workerId) { showWorkerDescriptor(event, workerId) {
if (!workerId) return; if (!workerId) return;
this.$.workerDescriptor.show(event.target, workerId); this.$.workerDescriptor.show(event.target, workerId);

View File

@ -1,27 +1,32 @@
<vn-textfield <div class="box">
label="User" <img src="./logo.svg"/>
ng-model="$ctrl.user" <form name="form" ng-submit="$ctrl.submit()">
vn-id="userField" <vn-textfield
vn-focus> label="User"
</vn-textfield> ng-model="$ctrl.user"
<vn-textfield vn-id="userField"
label="Password" vn-focus>
ng-model="$ctrl.password" </vn-textfield>
type="password"> <vn-textfield
</vn-textfield> label="Password"
<vn-check ng-model="$ctrl.password"
label="Do not close session" type="password">
ng-model="$ctrl.remember" </vn-textfield>
name="remember"> <vn-check
</vn-check> label="Do not close session"
<div class="footer"> ng-model="$ctrl.remember"
<vn-submit label="Enter" ng-click="$ctrl.submit()"></vn-submit> name="remember">
<div class="spinner-wrapper"> </vn-check>
<vn-spinner enable="$ctrl.loading"></vn-spinner> <div class="footer">
</div> <vn-submit label="Enter" ng-click="$ctrl.submit()"></vn-submit>
<div class="vn-pt-lg"> <div class="spinner-wrapper">
<a ui-sref="recoverPassword" translate> <vn-spinner enable="$ctrl.loading"></vn-spinner>
I do not remember my password </div>
</a> <!--<div class="vn-pt-lg">
</div> <a ui-sref="recoverPassword" translate>
I do not remember my password
</a>
</div>-->
</div>
</form>
</div> </div>

View File

@ -25,7 +25,7 @@ vn-recover-password{
} }
} }
vn-out-layout{ vn-login{
position: absolute; position: absolute;
height: 100%; height: 100%;
width: 100%; width: 100%;

View File

@ -9,7 +9,9 @@ function config($stateProvider, $urlRouterProvider) {
.state('login', { .state('login', {
url: '/login?continue', url: '/login?continue',
description: 'Login', description: 'Login',
template: '<vn-login></vn-login>' views: {
'login': {template: '<vn-login></vn-login>'},
}
}) })
.state('recoverPassword', { .state('recoverPassword', {
url: '/recover-password', url: '/recover-password',

View File

@ -66,9 +66,9 @@
"MESSAGE_INSURANCE_CHANGE": "I have changed the insurence credit of client [{{clientName}} ({{clientId}})]({{{url}}}) to *{{credit}} €*", "MESSAGE_INSURANCE_CHANGE": "I have changed the insurence credit of client [{{clientName}} ({{clientId}})]({{{url}}}) to *{{credit}} €*",
"Changed client paymethod": "I have changed the pay method for client [{{clientName}} ({{clientId}})]({{{url}}})", "Changed client paymethod": "I have changed the pay method for client [{{clientName}} ({{clientId}})]({{{url}}})",
"Sent units from ticket": "I sent *{{quantity}}* units of [{{concept}} ({{itemId}})]({{{itemUrl}}}) to *\"{{nickname}}\"* coming from ticket id [{{ticketId}}]({{{ticketUrl}}})", "Sent units from ticket": "I sent *{{quantity}}* units of [{{concept}} ({{itemId}})]({{{itemUrl}}}) to *\"{{nickname}}\"* coming from ticket id [{{ticketId}}]({{{ticketUrl}}})",
"Claim will be picked": "The product from the claim [({{claimId}})]({{{claimUrl}}}) from the client *{{clientName}}* will be picked", "Claim will be picked": "The product from the claim [{{claimId}}]({{{claimUrl}}}) from the client *{{clientName}}* will be picked",
"Claim state has changed to incomplete": "The state of the claim [({{claimId}})]({{{claimUrl}}}) from client *{{clientName}}* has changed to *incomplete*", "Claim state has changed to incomplete": "The state of the claim [{{claimId}}]({{{claimUrl}}}) from client *{{clientName}}* has changed to *incomplete*",
"Claim state has changed to canceled": "The state of the claim [({{claimId}})]({{{claimUrl}}}) from client *{{clientName}}* has changed to *canceled*", "Claim state has changed to canceled": "The state of the claim [{{claimId}}]({{{claimUrl}}}) from client *{{clientName}}* has changed to *canceled*",
"Customs agent is required for a non UEE member": "Customs agent is required for a non UEE member", "Customs agent is required for a non UEE member": "Customs agent is required for a non UEE member",
"Incoterms is required for a non UEE member": "Incoterms is required for a non UEE member", "Incoterms is required for a non UEE member": "Incoterms is required for a non UEE member",
"Client checked as validated despite of duplication": "Client checked as validated despite of duplication from client id {{clientId}}", "Client checked as validated despite of duplication": "Client checked as validated despite of duplication from client id {{clientId}}",
@ -136,7 +136,7 @@
"Password does not meet requirements": "Password does not meet requirements", "Password does not meet requirements": "Password does not meet requirements",
"You don't have privileges to change the zone": "You don't have privileges to change the zone or for these parameters there are more than one shipping options, talk to agencies", "You don't have privileges to change the zone": "You don't have privileges to change the zone or for these parameters there are more than one shipping options, talk to agencies",
"Not enough privileges to edit a client": "Not enough privileges to edit a client", "Not enough privileges to edit a client": "Not enough privileges to edit a client",
"Claim pickup order sent": "Claim pickup order sent [({{claimId}})]({{{claimUrl}}}) to client *{{clientName}}*", "Claim pickup order sent": "Claim pickup order sent [{{claimId}}]({{{claimUrl}}}) to client *{{clientName}}*",
"You don't have grant privilege": "You don't have grant privilege", "You don't have grant privilege": "You don't have grant privilege",
"You don't own the role and you can't assign it to another user": "You don't own the role and you can't assign it to another user", "You don't own the role and you can't assign it to another user": "You don't own the role and you can't assign it to another user",
"Email verify": "Email verify", "Email verify": "Email verify",

View File

@ -134,9 +134,9 @@
"MESSAGE_INSURANCE_CHANGE": "He cambiado el crédito asegurado del cliente [{{clientName}} ({{clientId}})]({{{url}}}) a *{{credit}} €*", "MESSAGE_INSURANCE_CHANGE": "He cambiado el crédito asegurado del cliente [{{clientName}} ({{clientId}})]({{{url}}}) a *{{credit}} €*",
"Changed client paymethod": "He cambiado la forma de pago del cliente [{{clientName}} ({{clientId}})]({{{url}}})", "Changed client paymethod": "He cambiado la forma de pago del cliente [{{clientName}} ({{clientId}})]({{{url}}})",
"Sent units from ticket": "Envio *{{quantity}}* unidades de [{{concept}} ({{itemId}})]({{{itemUrl}}}) a *\"{{nickname}}\"* provenientes del ticket id [{{ticketId}}]({{{ticketUrl}}})", "Sent units from ticket": "Envio *{{quantity}}* unidades de [{{concept}} ({{itemId}})]({{{itemUrl}}}) a *\"{{nickname}}\"* provenientes del ticket id [{{ticketId}}]({{{ticketUrl}}})",
"Claim will be picked": "Se recogerá el género de la reclamación [({{claimId}})]({{{claimUrl}}}) del cliente *{{clientName}}*", "Claim will be picked": "Se recogerá el género de la reclamación [{{claimId}}]({{{claimUrl}}}) del cliente *{{clientName}}*",
"Claim state has changed to incomplete": "Se ha cambiado el estado de la reclamación [({{claimId}})]({{{claimUrl}}}) del cliente *{{clientName}}* a *incompleta*", "Claim state has changed to incomplete": "Se ha cambiado el estado de la reclamación [{{claimId}}]({{{claimUrl}}}) del cliente *{{clientName}}* a *incompleta*",
"Claim state has changed to canceled": "Se ha cambiado el estado de la reclamación [({{claimId}})]({{{claimUrl}}}) del cliente *{{clientName}}* a *anulado*", "Claim state has changed to canceled": "Se ha cambiado el estado de la reclamación [{{claimId}}]({{{claimUrl}}}) del cliente *{{clientName}}* a *anulado*",
"Client checked as validated despite of duplication": "Cliente comprobado a pesar de que existe el cliente id {{clientId}}", "Client checked as validated despite of duplication": "Cliente comprobado a pesar de que existe el cliente id {{clientId}}",
"ORDER_ROW_UNAVAILABLE": "No hay disponibilidad de este producto", "ORDER_ROW_UNAVAILABLE": "No hay disponibilidad de este producto",
"Distance must be lesser than 1000": "La distancia debe ser inferior a 1000", "Distance must be lesser than 1000": "La distancia debe ser inferior a 1000",
@ -238,7 +238,7 @@
"Modifiable password only via recovery or by an administrator": "Contraseña modificable solo a través de la recuperación o por un administrador", "Modifiable password only via recovery or by an administrator": "Contraseña modificable solo a través de la recuperación o por un administrador",
"Not enough privileges to edit a client": "No tienes suficientes privilegios para editar un cliente", "Not enough privileges to edit a client": "No tienes suficientes privilegios para editar un cliente",
"This route does not exists": "Esta ruta no existe", "This route does not exists": "Esta ruta no existe",
"Claim pickup order sent": "Reclamación Orden de recogida enviada [({{claimId}})]({{{claimUrl}}}) al cliente *{{clientName}}*", "Claim pickup order sent": "Reclamación Orden de recogida enviada [{{claimId}}]({{{claimUrl}}}) al cliente *{{clientName}}*",
"You don't have grant privilege": "No tienes privilegios para dar privilegios", "You don't have grant privilege": "No tienes privilegios para dar privilegios",
"You don't own the role and you can't assign it to another user": "No eres el propietario del rol y no puedes asignarlo a otro usuario", "You don't own the role and you can't assign it to another user": "No eres el propietario del rol y no puedes asignarlo a otro usuario",
"Ticket merged": "Ticket [{{id}}]({{{fullPath}}}) ({{{originDated}}}) fusionado con [{{tfId}}]({{{fullPathFuture}}}) ({{{futureDated}}})", "Ticket merged": "Ticket [{{id}}]({{{fullPath}}}) ({{{originDated}}}) fusionado con [{{tfId}}]({{{fullPathFuture}}}) ({{{futureDated}}})",

View File

@ -15,7 +15,7 @@
"legacyUtcDateProcessing": false, "legacyUtcDateProcessing": false,
"timezone": "local", "timezone": "local",
"connectTimeout": 40000, "connectTimeout": 40000,
"acquireTimeout": 20000, "acquireTimeout": 60000,
"waitForConnections": true "waitForConnections": true
}, },
"osticket": { "osticket": {

View File

@ -27,7 +27,7 @@ module.exports = Self => {
message: 'Invalid email', message: 'Invalid email',
allowNull: true, allowNull: true,
allowBlank: true, allowBlank: true,
with: /^[\w|.|-]+@[\w|-]+(\.[\w|-]+)*(,[\w|.|-]+@[\w|-]+(\.[\w|-]+)*)*$/ with: /^[\W]*([\w+\-.%]+@[\w\-.]+\.[A-Za-z]{1,61}[\W]*,{1}[\W]*)*([\w+\-.%]+@[\w\-.]+\.[A-Za-z]{1,61})[\W]*$/
}); });
Self.validatesLengthOf('postcode', { Self.validatesLengthOf('postcode', {

View File

@ -154,8 +154,8 @@ module.exports = Self => {
e.id, e.id,
e.supplierFk, e.supplierFk,
e.dated, e.dated,
e.ref reference, e.reference,
e.ref invoiceNumber, e.invoiceNumber,
e.isBooked, e.isBooked,
e.isExcludedFromAvailable, e.isExcludedFromAvailable,
e.notes, e.notes,

View File

@ -19,16 +19,10 @@
"type": "date" "type": "date"
}, },
"reference": { "reference": {
"type": "string", "type": "string"
"mysql": {
"columnName": "ref"
}
}, },
"invoiceNumber": { "invoiceNumber": {
"type": "string", "type": "string"
"mysql": {
"columnName": "ref"
}
}, },
"isBooked": { "isBooked": {
"type": "boolean" "type": "boolean"

View File

@ -2,7 +2,7 @@
"InvoiceIn": { "InvoiceIn": {
"dataSource": "vn" "dataSource": "vn"
}, },
"InvoiceInTax": { "InvoiceInConfig": {
"dataSource": "vn" "dataSource": "vn"
}, },
"InvoiceInDueDay": { "InvoiceInDueDay": {
@ -13,5 +13,8 @@
}, },
"InvoiceInLog": { "InvoiceInLog": {
"dataSource": "vn" "dataSource": "vn"
},
"InvoiceInTax": {
"dataSource": "vn"
} }
} }

View File

@ -0,0 +1,35 @@
{
"name": "InvoiceInConfig",
"base": "VnModel",
"options": {
"mysql": {
"table": "invoiceInConfig"
}
},
"properties": {
"id": {
"id": true,
"type": "number",
"description": "Identifier"
},
"retentionRate": {
"type": "number"
},
"retentionName": {
"type": "string"
}
},
"relations": {
"sageWithholding": {
"type": "belongsTo",
"model": "SageWithholding",
"foreignKey": "sageWithholdingFk"
}
},
"acls": [{
"accessType": "READ",
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "ALLOW"
}]
}

View File

@ -1,3 +1,10 @@
<vn-crud-model
url="InvoiceInConfigs"
data="$ctrl.config"
filter="{fields: ['sageWithholdingFk']}"
id-value="1"
auto-load="true">
</vn-crud-model>
<vn-descriptor-content <vn-descriptor-content
module="invoiceIn" module="invoiceIn"
description="$ctrl.invoiceIn.supplierRef" description="$ctrl.invoiceIn.supplierRef"
@ -26,13 +33,13 @@
Clone Invoice Clone Invoice
</vn-item> </vn-item>
<vn-item <vn-item
ng-if="false" ng-if="$ctrl.isAgricultural()"
ng-click="$ctrl.showPdfInvoice()" ng-click="$ctrl.showPdfInvoice()"
translate> translate>
Show agricultural invoice as PDF Show agricultural invoice as PDF
</vn-item> </vn-item>
<vn-item <vn-item
ng-if="false" ng-if="$ctrl.isAgricultural()"
ng-click="sendPdfConfirmation.show({email: $ctrl.entity.supplierContact[0].email})" ng-click="sendPdfConfirmation.show({email: $ctrl.entity.supplierContact[0].email})"
translate> translate>
Send agricultural invoice as PDF Send agricultural invoice as PDF

View File

@ -110,6 +110,10 @@ class Controller extends Descriptor {
recipientId: this.entity.supplier.id recipientId: this.entity.supplier.id
}); });
} }
isAgricultural() {
return this.invoiceIn.supplier.sageWithholdingFk == this.config[0].sageWithholdingFk;
}
} }
ngModule.vnComponent('vnInvoiceInDescriptor', { ngModule.vnComponent('vnInvoiceInDescriptor', {

View File

@ -138,7 +138,7 @@ module.exports = Self => {
recipient: invoiceOut.client().email recipient: invoiceOut.client().email
}; };
try { try {
await models.InvoiceOut.invoiceEmail(ctx); await models.InvoiceOut.invoiceEmail(ctx, invoiceOut.ref);
} catch (err) {} } catch (err) {}
return invoiceId; return invoiceId;

View File

@ -13,6 +13,7 @@ describe('InvoiceOut downloadZip()', () => {
}; };
it('should return part of link to dowloand the zip', async() => { it('should return part of link to dowloand the zip', async() => {
pending('https://redmine.verdnatura.es/issues/4875');
const tx = await models.InvoiceOut.beginTransaction({}); const tx = await models.InvoiceOut.beginTransaction({});
try { try {
@ -30,7 +31,6 @@ describe('InvoiceOut downloadZip()', () => {
}); });
it('should return an error if the size of the files is too large', async() => { it('should return an error if the size of the files is too large', async() => {
pending('https://redmine.verdnatura.es/issues/4875');
const tx = await models.InvoiceOut.beginTransaction({}); const tx = await models.InvoiceOut.beginTransaction({});
let error; let error;

View File

@ -16,7 +16,6 @@ describe('AgencyTerm createInvoiceIn()', () => {
]; ];
it('should make an invoiceIn', async() => { it('should make an invoiceIn', async() => {
pending('Include after #3638 export database');
const tx = await models.AgencyTerm.beginTransaction({}); const tx = await models.AgencyTerm.beginTransaction({});
const options = {transaction: tx}; const options = {transaction: tx};

View File

@ -89,12 +89,12 @@ module.exports = Self => {
ENGINE = MEMORY ENGINE = MEMORY
SELECT SELECT
e.id, e.id,
e.ref, e.invoiceNumber,
e.supplierFk, e.supplierFk,
t.shipped t.shipped
FROM vn.entry e FROM vn.entry e
JOIN vn.travel t ON t.id = e.travelFk JOIN vn.travel t ON t.id = e.travelFk
JOIN buy b ON b.id = b.entryFk JOIN buy b ON e.id = b.entryFk
JOIN item i ON i.id = b.itemFk JOIN item i ON i.id = b.itemFk
JOIN itemType it ON it.id = i.typeFk`); JOIN itemType it ON it.id = i.typeFk`);
stmt.merge(conn.makeWhere(filter.where)); stmt.merge(conn.makeWhere(filter.where));
@ -104,7 +104,7 @@ module.exports = Self => {
const entriesIndex = stmts.push('SELECT * FROM tmp.entry') - 1; const entriesIndex = stmts.push('SELECT * FROM tmp.entry') - 1;
stmt = new ParameterizedSQL( stmt = new ParameterizedSQL(
`SELECT `SELECT
b.id AS buyId, b.id AS buyId,
b.itemFk, b.itemFk,
b.entryFk, b.entryFk,

View File

@ -11,7 +11,7 @@ describe('supplier consumption() filter', () => {
}; };
const result = await app.models.Supplier.consumption(ctx, filter); const result = await app.models.Supplier.consumption(ctx, filter);
expect(result.length).toEqual(6); expect(result.length).toEqual(5);
}); });
it('should return a list of entries from the item id 1 and supplier 1', async() => { it('should return a list of entries from the item id 1 and supplier 1', async() => {

View File

@ -8,7 +8,6 @@ describe('loopback model Supplier', () => {
beforeAll(async() => { beforeAll(async() => {
supplierOne = await models.Supplier.findById(1); supplierOne = await models.Supplier.findById(1);
supplierTwo = await models.Supplier.findById(442); supplierTwo = await models.Supplier.findById(442);
const activeCtx = { const activeCtx = {
accessToken: {userId: 9}, accessToken: {userId: 9},
http: { http: {
@ -23,71 +22,106 @@ describe('loopback model Supplier', () => {
}); });
}); });
afterAll(async() => {
await supplierOne.updateAttribute('payMethodFk', supplierOne.payMethodFk);
await supplierTwo.updateAttribute('payMethodFk', supplierTwo.payMethodFk);
});
describe('payMethodFk', () => { describe('payMethodFk', () => {
it('should throw an error when attempting to set an invalid payMethod id in the supplier', async() => { it('should throw an error when attempting to set an invalid payMethod id in the supplier', async() => {
let error; const tx = await models.Supplier.beginTransaction({});
const expectedError = 'You can not select this payment method without a registered bankery account'; const options = {transaction: tx};
const supplier = await models.Supplier.findById(1);
await supplier.updateAttribute('payMethodFk', 8) try {
.catch(e => { let error;
error = e; const expectedError = 'You can not select this payment method without a registered bankery account';
expect(error.message).toContain(expectedError); await supplierOne.updateAttribute('payMethodFk', 8, options)
}); .catch(e => {
error = e;
expect(error).toBeDefined(); expect(error.message).toContain(expectedError);
});
expect(error).toBeDefined();
await tx.rollback();
} catch (e) {
await tx.rollback();
throw e;
}
}); });
it('should not throw if the payMethod id is valid', async() => { it('should not throw if the payMethod id is valid', async() => {
let error; const tx = await models.Supplier.beginTransaction({});
const supplier = await models.Supplier.findById(442); const options = {transaction: tx};
await supplier.updateAttribute('payMethodFk', 4)
.catch(e => {
error = e;
});
expect(error).not.toBeDefined(); try {
let error;
await supplierTwo.updateAttribute('payMethodFk', 4, options)
.catch(e => {
error = e;
});
expect(error).not.toBeDefined();
await tx.rollback();
} catch (e) {
await tx.rollback();
throw e;
}
}); });
it('should have checked isPayMethodChecked for payMethod hasVerfified is false', async() => { it('should have checked isPayMethodChecked for payMethod hasVerfified is false', async() => {
const supplier = await models.Supplier.findById(442); const tx = await models.Supplier.beginTransaction({});
await supplier.updateAttribute('isPayMethodChecked', true); const options = {transaction: tx};
await supplier.updateAttribute('payMethodFk', 5);
const result = await models.Supplier.findById(442); try {
await supplierTwo.updateAttribute('isPayMethodChecked', true, options);
await supplierTwo.updateAttribute('payMethodFk', 5, options);
expect(result.isPayMethodChecked).toEqual(true); const result = await models.Supplier.findById(442, null, options);
expect(result.isPayMethodChecked).toEqual(true);
await tx.rollback();
} catch (e) {
await tx.rollback();
throw e;
}
}); });
it('should have unchecked isPayMethodChecked for payMethod hasVerfified is true', async() => { it('should have unchecked isPayMethodChecked for payMethod hasVerfified is true', async() => {
const supplier = await models.Supplier.findById(442); const tx = await models.Supplier.beginTransaction({});
await supplier.updateAttribute('isPayMethodChecked', true); const options = {transaction: tx};
await supplier.updateAttribute('payMethodFk', 2);
const result = await models.Supplier.findById(442); try {
await supplierTwo.updateAttribute('isPayMethodChecked', true, options);
await supplierTwo.updateAttribute('payMethodFk', 2, options);
expect(result.isPayMethodChecked).toEqual(false); const result = await models.Supplier.findById(442, null, options);
expect(result.isPayMethodChecked).toEqual(false);
await tx.rollback();
} catch (e) {
await tx.rollback();
throw e;
}
}); });
it('should have unchecked isPayMethodChecked for payDay and peyDemFk', async() => { it('should have unchecked isPayMethodChecked for payDay and peyDemFk', async() => {
const supplier = await models.Supplier.findById(442); const tx = await models.Supplier.beginTransaction({});
const options = {transaction: tx};
await supplier.updateAttribute('isPayMethodChecked', true); try {
await supplier.updateAttribute('payDay', 5); await supplierTwo.updateAttribute('payMethodFk', 2, options);
const firstResult = await models.Supplier.findById(442); await supplierTwo.updateAttribute('isPayMethodChecked', true, options);
await supplierTwo.updateAttribute('payDay', 5, options);
const firstResult = await models.Supplier.findById(442, null, options);
await supplier.updateAttribute('isPayMethodChecked', true); await supplierTwo.updateAttribute('isPayMethodChecked', true, options);
await supplier.updateAttribute('payDemFk', 1); await supplierTwo.updateAttribute('payDemFk', 1, options);
const secondResult = await models.Supplier.findById(442); const secondResult = await models.Supplier.findById(442, null, options);
expect(firstResult.isPayMethodChecked).toEqual(false); expect(firstResult.isPayMethodChecked).toEqual(false);
expect(secondResult.isPayMethodChecked).toEqual(false); expect(secondResult.isPayMethodChecked).toEqual(false);
await tx.rollback();
} catch (e) {
await tx.rollback();
throw e;
}
}); });
}); });
}); });

View File

@ -26,6 +26,7 @@
type="number" type="number"
label="Minimum M3" label="Minimum M3"
ng-model="$ctrl.supplierAgencyTerm.minimumM3" ng-model="$ctrl.supplierAgencyTerm.minimumM3"
step="0.01"
rule> rule>
</vn-input-number> </vn-input-number>
</vn-horizontal> </vn-horizontal>
@ -46,6 +47,7 @@
type="number" type="number"
label="M3 Price" label="M3 Price"
ng-model="$ctrl.supplierAgencyTerm.m3Price" ng-model="$ctrl.supplierAgencyTerm.m3Price"
step="0.01"
rule> rule>
</vn-input-number> </vn-input-number>
</vn-horizontal> </vn-horizontal>

View File

@ -31,8 +31,8 @@
</vn-button> </vn-button>
</vn-tool-bar> </vn-tool-bar>
</section> </section>
<vn-table model="model" <vn-table model="model"
ng-repeat="entry in entries" ng-repeat="entry in entries"
ng-if="entry.buys"> ng-if="entry.buys">
<vn-thead> <vn-thead>
<vn-tr> <vn-tr>
@ -40,8 +40,8 @@
<vn-td>{{::entry.id}}</vn-td> <vn-td>{{::entry.id}}</vn-td>
<vn-th field="data">Date</vn-th> <vn-th field="data">Date</vn-th>
<vn-td>{{::entry.shipped | date: 'dd/MM/yyyy'}}</vn-td> <vn-td>{{::entry.shipped | date: 'dd/MM/yyyy'}}</vn-td>
<vn-th field="ref">Reference</vn-th> <vn-th field="invoiceNumber">Reference</vn-th>
<vn-td vn-tooltip="{{::entry.ref}}">{{::entry.ref}}</vn-td> <vn-td vn-tooltip="{{::entry.invoiceNumber}}">{{::entry.invoiceNumber}}</vn-td>
</vn-tr> </vn-tr>
</vn-thead> </vn-thead>
<vn-tbody> <vn-tbody>
@ -83,8 +83,8 @@
</vn-table> </vn-table>
</vn-card> </vn-card>
</vn-data-viewer> </vn-data-viewer>
<vn-confirm <vn-confirm
vn-id="confirm" vn-id="confirm"
question="Please, confirm" question="Please, confirm"
message="The consumption report will be sent" message="The consumption report will be sent"
on-accept="$ctrl.sendEmail()"> on-accept="$ctrl.sendEmail()">

View File

@ -1,3 +1,2 @@
Total entry: Total entrada Total entry: Total entrada
This supplier doesn't have a contact with an email address: Este proveedor no tiene ningún contacto con una dirección de email This supplier doesn't have a contact with an email address: Este proveedor no tiene ningún contacto con una dirección de email

View File

@ -11,7 +11,12 @@ module.exports = Self => {
required: true, required: true,
description: 'The ticket id', description: 'The ticket id',
http: {source: 'path'} http: {source: 'path'}
}, }, {
arg: 'labelCount',
type: 'number',
required: false,
description: 'The number of labels'
}
], ],
returns: [ returns: [
{ {

View File

@ -137,7 +137,7 @@ module.exports = Self => {
const params = [args.id, args.shipped, args.warehouseFk]; const params = [args.id, args.shipped, args.warehouseFk];
const [salesMovable] = await Self.rawSql(query, params, myOptions); const [salesMovable] = await Self.rawSql(query, params, myOptions);
const sales = await models.Sale.find({ticketFk: args.id}, myOptions); const sales = await models.Sale.find({where: {ticketFk: args.id}}, myOptions);
const salesNewTicket = salesMovable.filter(sale => (sale.movable ? sale.movable : 0) >= sale.quantity); const salesNewTicket = salesMovable.filter(sale => (sale.movable ? sale.movable : 0) >= sale.quantity);
const salesNewTicketLength = salesNewTicket.length; const salesNewTicketLength = salesNewTicket.length;

View File

@ -0,0 +1,55 @@
const {Report} = require('vn-print');
module.exports = Self => {
Self.remoteMethodCtx('expeditionPalletLabel', {
description: 'Returns the expedition pallet label',
accessType: 'READ',
accepts: [
{
arg: 'id',
type: 'number',
required: true,
description: 'The pallet id',
http: {source: 'path'}
}, {
arg: 'userFk',
type: 'number',
required: true,
description: 'The user id'
}
],
returns: [
{
arg: 'body',
type: 'file',
root: true
}, {
arg: 'Content-Type',
type: 'String',
http: {target: 'header'}
}, {
arg: 'Content-Disposition',
type: 'String',
http: {target: 'header'}
}
],
http: {
path: '/:id/expedition-pallet-label',
verb: 'GET'
}
});
Self.expeditionPalletLabel = async(ctx, id) => {
const args = Object.assign({}, ctx.args);
const params = {lang: ctx.req.getLocale()};
delete args.ctx;
for (const param in args)
params[param] = args[param];
const report = new Report('expedition-pallet-label', params);
const stream = await report.toPdfStream();
return [stream, 'application/pdf', `filename="doc-${id}.pdf"`];
};
};

View File

@ -37,4 +37,5 @@ module.exports = function(Self) {
require('../methods/ticket/merge')(Self); require('../methods/ticket/merge')(Self);
require('../methods/ticket/isRoleAdvanced')(Self); require('../methods/ticket/isRoleAdvanced')(Self);
require('../methods/ticket/collectionLabel')(Self); require('../methods/ticket/collectionLabel')(Self);
require('../methods/ticket/expeditionPalletLabel')(Self);
}; };

View File

@ -256,7 +256,7 @@ class Controller extends Section {
this.$http.post(`NotificationQueues`, { this.$http.post(`NotificationQueues`, {
notificationFk: 'invoiceElectronic', notificationFk: 'invoiceElectronic',
authorFk: client.id, authorFk: client.id,
}).then(a => { }).then(() => {
this.vnApp.showSuccess(this.$t('Invoice sent')); this.vnApp.showSuccess(this.$t('Invoice sent'));
}); });
} }

View File

@ -159,7 +159,8 @@ module.exports = Self => {
`SELECT `SELECT
e.id, e.id,
e.travelFk, e.travelFk,
e.ref, e.reference,
e.invoiceNumber,
e.loadPriority, e.loadPriority,
s.id AS supplierFk, s.id AS supplierFk,
s.name AS supplierName, s.name AS supplierName,
@ -168,7 +169,7 @@ module.exports = Self => {
e.notes, e.notes,
CAST(SUM(b.weight * b.stickers) AS DECIMAL(10,0)) as loadedkg, CAST(SUM(b.weight * b.stickers) AS DECIMAL(10,0)) as loadedkg,
CAST(SUM(vc.aerealVolumetricDensity * b.stickers * IF(pkg.volume, pkg.volume, pkg.width * pkg.depth * pkg.height) / 1000000) AS DECIMAL(10,0)) as volumeKg CAST(SUM(vc.aerealVolumetricDensity * b.stickers * IF(pkg.volume, pkg.volume, pkg.width * pkg.depth * pkg.height) / 1000000) AS DECIMAL(10,0)) as volumeKg
FROM tmp.travel tr FROM tmp.travel tr
JOIN entry e ON e.travelFk = tr.id JOIN entry e ON e.travelFk = tr.id
JOIN buy b ON b.entryFk = e.id JOIN buy b ON b.entryFk = e.id
JOIN packaging pkg ON pkg.id = b.packageFk JOIN packaging pkg ON pkg.id = b.packageFk

View File

@ -1,4 +1,4 @@
/* eslint max-len: ["error", { "code": 150 }]*/
const ParameterizedSQL = require('loopback-connector').ParameterizedSQL; const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
module.exports = Self => { module.exports = Self => {
Self.remoteMethod('getEntries', { Self.remoteMethod('getEntries', {
@ -25,27 +25,34 @@ module.exports = Self => {
let stmt; let stmt;
stmt = new ParameterizedSQL(` stmt = new ParameterizedSQL(`
SELECT e.travelFk, e.id, e.isConfirmed, e.ref, e.notes, e.evaNotes AS observation, SELECT
s.name AS supplierName, e.travelFk,
CAST((SUM(IF(p.volume > 0,p.volume,p.width * p.depth * IF(p.height, p.height, i.size + pconfig.upperGap)) e.id,
* b.stickers)/1000000)/((pcc.width*pcc.depth*pcc.height)/1000000) AS DECIMAL(10,2)) cc, e.isConfirmed,
CAST((SUM(IF(p.volume > 0,p.volume,p.width * p.depth * IF(p.height, p.height, i.size + pconfig.upperGap)) e.invoiceNumber,
* b.stickers)/1000000)/((ppallet.width*ppallet.depth*ppallet.height)/1000000) AS DECIMAL(10,2)) pallet, e.reference,
CAST((SUM(IF(p.volume > 0,p.volume,p.width * p.depth * IF(p.height, p.height, i.size + pconfig.upperGap)) e.notes,
* b.stickers)/1000000) AS DECIMAL(10,2)) m3, e.evaNotes AS observation,
TRUNCATE(SUM(b.stickers)/(COUNT( b.id) / COUNT( DISTINCT b.id)),0) hb, s.name AS supplierName,
CAST(SUM(b.freightValue*b.quantity) AS DECIMAL(10,2)) freightValue, CAST((SUM(IF(p.volume > 0,p.volume,p.width * p.depth * IF(p.height, p.height, i.size + pconfig.upperGap))
CAST(SUM(b.packageValue*b.quantity) AS DECIMAL(10,2)) packageValue * b.stickers)/1000000)/((pcc.width*pcc.depth*pcc.height)/1000000) AS DECIMAL(10,2)) cc,
CAST((SUM(IF(p.volume > 0,p.volume,p.width * p.depth * IF(p.height, p.height, i.size + pconfig.upperGap))
* b.stickers)/1000000)/((ppallet.width*ppallet.depth*ppallet.height)/1000000) AS DECIMAL(10,2)) pallet,
CAST((SUM(IF(p.volume > 0,p.volume,p.width * p.depth * IF(p.height, p.height, i.size + pconfig.upperGap))
* b.stickers)/1000000) AS DECIMAL(10,2)) m3,
TRUNCATE(SUM(b.stickers)/(COUNT( b.id) / COUNT( DISTINCT b.id)),0) hb,
CAST(SUM(b.freightValue*b.quantity) AS DECIMAL(10,2)) freightValue,
CAST(SUM(b.packageValue*b.quantity) AS DECIMAL(10,2)) packageValue
FROM vn.travel t FROM vn.travel t
LEFT JOIN vn.entry e ON t.id = e.travelFk LEFT JOIN vn.entry e ON t.id = e.travelFk
LEFT JOIN vn.buy b ON b.entryFk = e.id LEFT JOIN vn.buy b ON b.entryFk = e.id
LEFT JOIN vn.supplier s ON e.supplierFk = s.id LEFT JOIN vn.supplier s ON e.supplierFk = s.id
JOIN vn.item i ON i.id = b.itemFk JOIN vn.item i ON i.id = b.itemFk
LEFT JOIN vn.packaging p ON p.id = b.packageFk LEFT JOIN vn.packaging p ON p.id = b.packageFk
JOIN vn.packaging pcc ON pcc.id = 'cc' JOIN vn.packaging pcc ON pcc.id = 'cc'
JOIN vn.packaging ppallet ON ppallet.id = 'pallet 100' JOIN vn.packaging ppallet ON ppallet.id = 'pallet 100'
JOIN vn.packagingConfig pconfig JOIN vn.packagingConfig pconfig
WHERE t.id = ? WHERE t.id = ?
GROUP BY e.id;`, [ GROUP BY e.id;`, [
id id
]); ]);

View File

@ -1,28 +1,34 @@
const app = require('vn-loopback/server/server'); const models = require('vn-loopback/server/server').models;
describe('travel getEntries()', () => { describe('travel getEntries()', () => {
const travelId = 1; const travelId = 1;
it('should check the response contains the id', async() => { it('should check the response contains the id', async() => {
const entries = await app.models.Travel.getEntries(travelId); const entries = await models.Travel.getEntries(travelId);
expect(entries.length).toEqual(1); expect(entries.length).toEqual(1);
expect(entries[0].id).toEqual(1); expect(entries[0].id).toEqual(1);
}); });
it('should check the response contains the travelFk', async() => { it('should check the response contains the travelFk', async() => {
const entries = await app.models.Travel.getEntries(travelId); const entries = await models.Travel.getEntries(travelId);
expect(entries[0].travelFk).toEqual(1); expect(entries[0].travelFk).toEqual(1);
}); });
it('should check the response contains the ref', async() => { it('should check the response contains the reference', async() => {
const entries = await app.models.Travel.getEntries(travelId); const entries = await models.Travel.getEntries(travelId);
expect(entries[0].ref).toEqual('Movement 1'); expect(entries[0].reference).toEqual('Movement 1');
});
it('should check the response contains the invoiceNumber', async() => {
const entries = await models.Travel.getEntries(travelId);
expect(entries[0].invoiceNumber).toEqual('IN2001');
}); });
it('should check the response contains the m3', async() => { it('should check the response contains the m3', async() => {
const entries = await app.models.Travel.getEntries(travelId); const entries = await models.Travel.getEntries(travelId);
expect(entries[0].m3).toEqual(0.22); expect(entries[0].m3).toEqual(0.22);
}); });

View File

@ -1,6 +1,6 @@
<vn-card class="summary"> <vn-card class="summary">
<h5> <h5>
<a <a
ng-if="::$ctrl.travelData.id" ng-if="::$ctrl.travelData.id"
vn-tooltip="Go to the travel" vn-tooltip="Go to the travel"
ui-sref="travel.card.summary({id: {{::$ctrl.travelData.id}}})" ui-sref="travel.card.summary({id: {{::$ctrl.travelData.id}}})"
@ -13,15 +13,15 @@
<vn-horizontal> <vn-horizontal>
<vn-one> <vn-one>
<vn-label-value <vn-label-value
label="Shipped" label="Shipped"
value="{{$ctrl.travelData.shipped | date: 'dd/MM/yyyy'}}"> value="{{$ctrl.travelData.shipped | date: 'dd/MM/yyyy'}}">
</vn-label-value> </vn-label-value>
<vn-label-value <vn-label-value
label="Warehouse Out" label="Warehouse Out"
value="{{$ctrl.travelData.warehouseOut.name}}"> value="{{$ctrl.travelData.warehouseOut.name}}">
</vn-label-value> </vn-label-value>
<vn-check <vn-check
label="Delivered" label="Delivered"
ng-model="$ctrl.travelData.isDelivered" ng-model="$ctrl.travelData.isDelivered"
disabled="true"> disabled="true">
</vn-check> </vn-check>
@ -36,7 +36,7 @@
value="{{$ctrl.travelData.warehouseIn.name}}"> value="{{$ctrl.travelData.warehouseIn.name}}">
</vn-label-value> </vn-label-value>
<vn-check <vn-check
label="Received" label="Received"
ng-model="$ctrl.travelData.isReceived" ng-model="$ctrl.travelData.isReceived"
disabled="true"> disabled="true">
</vn-check> </vn-check>
@ -80,7 +80,7 @@
<vn-tbody> <vn-tbody>
<vn-tr ng-repeat="entry in $ctrl.entries"> <vn-tr ng-repeat="entry in $ctrl.entries">
<vn-td shrink> <vn-td shrink>
<vn-check <vn-check
ng-model="entry.isConfirmed" ng-model="entry.isConfirmed"
disabled="true"> disabled="true">
</vn-check> </vn-check>
@ -99,7 +99,7 @@
<vn-td shrink>{{entry.cc}}</vn-td> <vn-td shrink>{{entry.cc}}</vn-td>
<vn-td shrink>{{entry.pallet}}</vn-td> <vn-td shrink>{{entry.pallet}}</vn-td>
<vn-td shrink>{{entry.m3}}</vn-td> <vn-td shrink>{{entry.m3}}</vn-td>
<vn-td shrink> <vn-td shrink>
<vn-icon <vn-icon
ng-if="entry.notes.length" ng-if="entry.notes.length"
vn-tooltip="{{entry.notes}}" vn-tooltip="{{entry.notes}}"
@ -134,13 +134,13 @@
</vn-auto> </vn-auto>
<vn-auto ng-if="$ctrl.travelThermographs.length != 0"> <vn-auto ng-if="$ctrl.travelThermographs.length != 0">
<h4 ng-show="$ctrl.isBuyer"> <h4 ng-show="$ctrl.isBuyer">
<a <a
ui-sref="travel.card.thermograph.index({id:$ctrl.travelData.id})" ui-sref="travel.card.thermograph.index({id:$ctrl.travelData.id})"
target="_self"> target="_self">
<span translate vn-tooltip="Go to">Thermograph</span> <span translate vn-tooltip="Go to">Thermograph</span>
</a> </a>
</h4> </h4>
<h4 <h4
translate translate
ng-show="!$ctrl.isBuyer"> ng-show="!$ctrl.isBuyer">
Thermograph Thermograph
@ -168,6 +168,6 @@
</vn-auto> </vn-auto>
</vn-horizontal> </vn-horizontal>
</vn-card> </vn-card>
<vn-entry-descriptor-popover <vn-entry-descriptor-popover
vn-id="entryDescriptor"> vn-id="entryDescriptor">
</vn-entry-descriptor-popover> </vn-entry-descriptor-popover>

View File

@ -410,6 +410,8 @@ describe('workerTimeControl add/delete timeEntry()', () => {
describe('12h rest', () => { describe('12h rest', () => {
it('should throw an error when the 12h rest is not fulfilled yet', async() => { it('should throw an error when the 12h rest is not fulfilled yet', async() => {
pending('https://redmine.verdnatura.es/issues/4707');
activeCtx.accessToken.userId = salesBossId; activeCtx.accessToken.userId = salesBossId;
const workerId = hankPymId; const workerId = hankPymId;

40058
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,11 @@
const Stylesheet = require(`vn-print/core/stylesheet`);
const path = require('path');
const vnPrintPath = path.resolve('print');
module.exports = new Stylesheet([
`${vnPrintPath}/common/css/spacing.css`,
`${vnPrintPath}/common/css/misc.css`,
`${vnPrintPath}/common/css/layout.css`,
`${vnPrintPath}/common/css/email.css`])
.mergeStyles();

View File

@ -0,0 +1,3 @@
subject: Pay method updated
title: Pay method updated
description: The pay method of the supplier {0} has been updated from {1} to {2}

View File

@ -0,0 +1,3 @@
subject: Método de pago actualizado
title: Método de pago actualizado
description: Se ha actualizado el método de pago del proveedor {0} de {1} a {2}

View File

@ -0,0 +1,8 @@
<email-body v-bind="$props">
<div class="grid-row">
<div class="grid-block vn-pa-ml">
<h1>{{ $t('title') }}</h1>
<p v-html="$t('description', [name, oldPayMethod, newPayMethod])"></p>
</div>
</div>
</email-body>

View File

@ -0,0 +1,23 @@
const Component = require(`vn-print/core/component`);
const emailBody = new Component('email-body');
module.exports = {
name: 'supplier-pay-method-update',
components: {
'email-body': emailBody.build(),
},
props: {
name: {
type: String,
required: true
},
oldPayMethod: {
type: String,
required: true
},
newPayMethod: {
type: String,
required: true
}
}
};

View File

@ -13,11 +13,12 @@ html {
font-size: 29px; font-size: 29px;
margin-left: -13px; margin-left: -13px;
} }
.outline { #outline {
border: 1px solid black; border: 1px solid black;
padding: 5px; padding: 5px;
height: 37px; height: 37px;
width: 100px; width: 100px;
max-width: 100px;
} }
#nickname { #nickname {
font-size: 22px; font-size: 22px;

View File

@ -12,13 +12,13 @@
</tr> </tr>
<tr> <tr>
<td rowspan="3"><div v-html="getBarcode(labelData.ticketFk)" id="barcode"></div></td> <td rowspan="3"><div v-html="getBarcode(labelData.ticketFk)" id="barcode"></div></td>
<td class="outline">{{labelData.workerCode || '---'}}</td> <td id="outline" class="ellipsize">{{labelData.workerCode || '---'}}</td>
</tr> </tr>
<tr> <tr>
<td class="outline">{{labelData.labelCount || 0}}</td> <td id="outline" class="ellipsize">{{labelCount || labelData.labelCount || 0}}</td>
</tr> </tr>
<tr> <tr>
<td class="outline">{{labelData.code == 'V' ? (labelData.size || 0) + 'cm' : (labelData.volume || 0) + 'm³'}}</td> <td id="outline" class="ellipsize">{{labelData.code == 'V' ? (labelData.size || 0) + 'cm' : (labelData.volume || 0) + 'm³'}}</td>
</tr> </tr>
<tr> <tr>
<td><div id="agencyDescripton" class="ellipsize">{{labelData.agencyDescription ? labelData.agencyDescription.toUpperCase() : '---'}}</div></td> <td><div id="agencyDescripton" class="ellipsize">{{labelData.agencyDescription ? labelData.agencyDescription.toUpperCase() : '---'}}</div></td>

View File

@ -11,6 +11,11 @@ module.exports = {
type: Number, type: Number,
required: true, required: true,
description: 'The ticket or collection id' description: 'The ticket or collection id'
},
labelCount: {
type: Number,
required: false,
description: 'The number of labels'
} }
}, },
async serverPrefetch() { async serverPrefetch() {

View File

@ -12,8 +12,8 @@ SELECT c.itemPackingTypeFk code,
TIME_FORMAT(t.shipped, '%H:%i') shippedHour, TIME_FORMAT(t.shipped, '%H:%i') shippedHour,
TIME_FORMAT(zo.`hour`, '%H:%i') zoneHour, TIME_FORMAT(zo.`hour`, '%H:%i') zoneHour,
DATE_FORMAT(t.shipped, '%d/%m/%y') shipped, DATE_FORMAT(t.shipped, '%d/%m/%y') shipped,
t.nickName,
tt.labelCount, tt.labelCount,
t.nickName,
COUNT(*) lineCount COUNT(*) lineCount
FROM vn.ticket t FROM vn.ticket t
JOIN vn.ticketCollection tc ON tc.ticketFk = t.id JOIN vn.ticketCollection tc ON tc.ticketFk = t.id

View File

@ -20,7 +20,7 @@
</tr> </tr>
<tr> <tr>
<td class="font gray uppercase">{{$t('ref')}}</td> <td class="font gray uppercase">{{$t('ref')}}</td>
<th>{{entry.ref}}</th> <th>{{entry.invoiceNumber}}</th>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@ -1,10 +1,10 @@
SELECT SELECT
e.id, e.id,
e.ref, e.invoiceNumber,
e.notes, e.notes,
c.code companyCode, c.code companyCode,
t.landed t.landed
FROM entry e FROM entry e
JOIN travel t ON t.id = e.travelFk JOIN travel t ON t.id = e.travelFk
JOIN company c ON c.id = e.companyFk JOIN company c ON c.id = e.companyFk
WHERE e.id = ? WHERE e.id = ?

View File

@ -0,0 +1,12 @@
const Stylesheet = require(`vn-print/core/stylesheet`);
const path = require('path');
const vnPrintPath = path.resolve('print');
module.exports = new Stylesheet([
`${vnPrintPath}/common/css/spacing.css`,
`${vnPrintPath}/common/css/misc.css`,
`${vnPrintPath}/common/css/layout.css`,
`${vnPrintPath}/common/css/report.css`,
`${__dirname}/style.css`])
.mergeStyles();

View File

@ -0,0 +1,62 @@
html {
font-family: Arial, Helvetica, sans-serif;
}
* {
box-sizing: border-box;
font-size: 25px;
}
#truck {
width: 100%;
max-width: 150px;
height: 90px;
background-color: black;
color: white;
font-size: 50px;
font-weight: bold;
text-align: center;
}
.mainTable {
width: 100%;
height: 100%;
border: 10px solid;
border-radius: 20px;
-moz-border-radius: 20px;
-webkit-border-radius: 10px;
border-collapse: separate;
border-spacing: 0px;
}
.zoneTable{
width: 100%;
margin: 0 auto;
border-collapse: collapse;
}
#routeFk, #zone, #labels{
font-size: 30px;
}
#routeFk{
width: 120px;
padding-top: 5px;
padding-bottom: 5px;
max-width: 120px;
text-align: center;
}
#zone{
width: 305px;
max-width: 305px;
text-align: center;
}
#labels{
text-align: center;
}
#black {
background-color: rgb(102, 102, 102);
color: white;
}
#QR {
padding: 25px;
padding-left: 40px;
margin-top: 20px;
}
#additionalInfo {
padding-top: 20px;
}

View File

@ -0,0 +1,38 @@
<!DOCTYPE html>
<html>
<body>
<table class="mainTable">
<tbody>
<tr>
<td colspan="2" id="truck" class="ellipsize">{{labelData.truck || '---'}}</td>
</tr>
<tr>
<td colspan="2">
<table v-for="labelData in labelsData" class="zoneTable">
<thead>
<tr v-if="!labelData.isMatch" id="black">
<td id="routeFk" class="ellipsize">{{labelData.routeFk}}</td>
<td id="zone" class="ellipsize">{{labelData.zone || '---'}}</td>
<td id="labels" class="ellipsize">{{labelData.labels}}</td>
</tr>
<tr v-else>
<td id="routeFk" class="ellipsize">{{labelData.routeFk}}</td>
<td id="zone" class="ellipsize">{{labelData.zone || '---'}}</td>
<td id="labels" class="ellipsize">{{labelData.labels || '--'}}</td>
</tr>
</thead>
</table>
</td>
</tr>
<tr>
<td><img :src="QR" id="QR"/></td>
<td class="ellipsize">
<div id="additionalInfo"><b>Pallet: </b>{{id}}</div>
<div id="additionalInfo"><b>User: </b> {{username.name || '---'}}</div>
<div id="additionalInfo"><b>Day: </b>{{labelData.dayName.toUpperCase() || '---'}}</div>
</td>
</tr>
</tbody>
</table>
</body>
</html>

View File

@ -0,0 +1,46 @@
const Component = require(`vn-print/core/component`);
const reportBody = new Component('report-body');
const UserError = require('vn-loopback/util/user-error');
const qrcode = require('qrcode');
module.exports = {
name: 'expedition-pallet-label',
props: {
id: {
type: Number,
required: true,
description: 'The pallet id'
},
userFk: {
type: Number,
required: true,
description: 'The user id'
}
},
async serverPrefetch() {
this.labelsData = await this.rawSqlFromDef('labelData', this.id);
this.username = await this.findOneFromDef('username', this.userFk);
this.labelData = this.labelsData[0];
let QRdata = JSON.stringify({
company: 'vnl',
user: this.userFk,
created: new Date(),
table: 'expeditionPallet',
id: this.id
});
this.QR = await this.getQR(QRdata);
if (!this.labelsData.length)
throw new UserError('Empty data source');
},
methods: {
getQR(id) {
const data = String(id);
return qrcode.toDataURL(data, {margin: 0});
},
},
components: {
'report-body': reportBody.build()
},
};

View File

@ -0,0 +1 @@
reportName: labelPalletExpedition

View File

@ -0,0 +1,11 @@
{
"width": "10cm",
"height": "15cm",
"margin": {
"top": "0.5cm",
"right": "0.2cm",
"bottom": "0cm",
"left": "0cm"
},
"printBackground": true
}

View File

@ -0,0 +1,19 @@
SELECT ep.id palletFk,
t.routeFk,
et2.description truck,
r.description `zone`,
COUNT(es.id) labels,
t.warehouseFk warehouseFk,
dayname(r.created) `dayName`,
et.id <=> rm.expeditionTruckFk isMatch
FROM vn.expeditionTruck et
JOIN vn.expeditionPallet ep ON ep.truckFk = et.id
JOIN vn.expeditionScan es ON es.palletFk = ep.id
JOIN vn.expedition e ON e.id = es.expeditionFk
JOIN vn.ticket t ON t.id = e.ticketFk
JOIN vn.route r ON r.id = t.routeFk
LEFT JOIN vn2008.Rutas_monitor rm ON rm.Id_Ruta = r.id
LEFT JOIN vn.expeditionTruck et2 ON et2.id = rm.expeditionTruckFk
WHERE ep.id = ?
GROUP BY ep.id, t.routeFk
ORDER BY t.routeFk

View File

@ -0,0 +1,3 @@
SELECT `name`
FROM account.user
WHERE id = ?

View File

@ -49,7 +49,7 @@
<tbody> <tbody>
<tr v-for="entry in travel.entries"> <tr v-for="entry in travel.entries">
<td>{{entry.supplierName}}</td> <td>{{entry.supplierName}}</td>
<td>{{entry.ref}}</td> <td>{{entry.reference}}</td>
<td class="number">{{entry.volumeKg | number($i18n.locale)}}</td> <td class="number">{{entry.volumeKg | number($i18n.locale)}}</td>
<td class="number">{{entry.loadedKg | number($i18n.locale)}}</td> <td class="number">{{entry.loadedKg | number($i18n.locale)}}</td>
<td class="number">{{entry.stickers}}</td> <td class="number">{{entry.stickers}}</td>

View File

@ -1,7 +1,7 @@
SELECT SELECT
e.id, e.id,
e.travelFk, e.travelFk,
e.ref, e.reference,
s.name AS supplierName, s.name AS supplierName,
SUM(b.stickers) AS stickers, SUM(b.stickers) AS stickers,
CAST(SUM(b.weight * b.stickers) as DECIMAL(10,0)) as loadedKg, CAST(SUM(b.weight * b.stickers) as DECIMAL(10,0)) as loadedKg,
@ -15,4 +15,4 @@ SELECT
JOIN supplier s ON s.id = e.supplierFk JOIN supplier s ON s.id = e.supplierFk
JOIN vn.volumeConfig vc JOIN vn.volumeConfig vc
WHERE t.id IN(?) WHERE t.id IN(?)
GROUP BY e.id GROUP BY e.id

View File

@ -82,7 +82,7 @@ module.exports = {
return this.rawSqlFromDef(`taxes`, [reference]); return this.rawSqlFromDef(`taxes`, [reference]);
}, },
fetchIntrastat(reference) { fetchIntrastat(reference) {
return this.rawSqlFromDef(`intrastat`, [reference, reference, reference, reference]); return this.rawSqlFromDef(`intrastat`, [reference, reference, reference, reference, reference]);
}, },
fetchRectified(reference) { fetchRectified(reference) {
return this.rawSqlFromDef(`rectified`, [reference]); return this.rawSqlFromDef(`rectified`, [reference]);

View File

@ -1,32 +1,39 @@
(SELECT SELECT *
ir.id code, FROM invoiceOut io
ir.description description, JOIN invoiceOutSerial ios ON io.serial = ios.code
CAST(SUM(IFNULL(i.stems, 1) * s.quantity) AS DECIMAL(10,2)) stems, JOIN
CAST(SUM(CAST(IFNULL(i.stems, 1) * s.quantity * IF(ic.grams, ic.grams, i.density * ic.cm3delivery / 1000) / 1000 AS DECIMAL(10,2)) * (SELECT
IF(sub.weight, sub.weight / vn.invoiceOut_getWeight(?), 1)) AS DECIMAL(10,2)) netKg, t.refFk,
CAST(SUM((s.quantity * s.price * (100 - s.discount) / 100 )) AS DECIMAL(10,2)) subtotal ir.id code,
FROM vn.ticket t ir.description description,
JOIN vn.sale s ON s.ticketFk = t.id CAST(SUM(IFNULL(i.stems, 1) * s.quantity) AS DECIMAL(10,2)) stems,
JOIN vn.item i ON i.id = s.itemFk CAST(SUM(CAST(IFNULL(i.stems, 1) * s.quantity * IF(ic.grams, ic.grams, i.density * ic.cm3delivery / 1000) / 1000 AS DECIMAL(10,2)) *
JOIN vn.itemCost ic ON ic.itemFk = i.id AND ic.warehouseFk = t.warehouseFk IF(sub.weight, sub.weight / vn.invoiceOut_getWeight(?), 1)) AS DECIMAL(10,2)) netKg,
JOIN vn.intrastat ir ON ir.id = i.intrastatFk CAST(SUM((s.quantity * s.price * (100 - s.discount) / 100 )) AS DECIMAL(10,2)) subtotal
LEFT JOIN ( FROM vn.ticket t
SELECT t2.weight JOIN vn.sale s ON s.ticketFk = t.id
FROM vn.ticket t2 JOIN vn.item i ON i.id = s.itemFk
WHERE refFk = ? AND weight JOIN vn.itemCost ic ON ic.itemFk = i.id AND ic.warehouseFk = t.warehouseFk
LIMIT 1 JOIN vn.intrastat ir ON ir.id = i.intrastatFk
) sub ON TRUE LEFT JOIN (
WHERE t.refFk = ? SELECT t2.weight
AND i.intrastatFk FROM vn.ticket t2
GROUP BY i.intrastatFk WHERE refFk = ? AND weight
ORDER BY i.intrastatFk) LIMIT 1
UNION ALL ) sub ON TRUE
(SELECT WHERE t.refFk = ?
NULL AS code, AND i.intrastatFk
NULL AS description, GROUP BY i.intrastatFk
0 AS stems, UNION ALL
0 AS netKg, SELECT
CAST(SUM((ts.quantity * ts.price)) AS DECIMAL(10,2)) AS subtotal NULL AS refFk,
FROM vn.ticketService ts NULL AS code,
JOIN vn.ticket t ON ts.ticketFk = t.id NULL AS description,
WHERE t.refFk = ?); 0 AS stems,
0 AS netKg,
IF(CAST(SUM((ts.quantity * ts.price)) AS DECIMAL(10,2)), CAST(SUM((ts.quantity * ts.price)) AS DECIMAL(10,2)), 0) AS subtotal
FROM vn.ticketService ts
JOIN vn.ticket t ON ts.ticketFk = t.id
WHERE t.refFk = ?) sub
WHERE io.`ref` = ? AND ios.isCEE
ORDER BY sub.code;

View File

@ -1,10 +1,10 @@
SELECT SELECT
io.amount, io.amount,
io.ref, io.ref,
io.issued, io.issued,
ict.description ict.description
FROM vn.invoiceCorrection ic FROM invoiceOut io
JOIN vn.invoiceOut io ON io.id = ic.correctedFk JOIN invoiceCorrection ic ON ic.correctingFk = io.id
JOIN vn.invoiceCorrectionType ict ON ict.id = ic.invoiceCorrectionTypeFk JOIN invoiceCorrectionType ict ON ict.id = ic.invoiceCorrectionTypeFk
LEFT JOIN ticket t ON t.refFk = io.ref LEFT JOIN ticket t ON t.refFk = io.ref
WHERE t.refFk = ? WHERE io.ref = ?

View File

@ -5,9 +5,8 @@
<div class="grid-row"> <div class="grid-row">
<div class="grid-block"> <div class="grid-block">
<div class="columns vn-mb-lg"> <div class="columns vn-mb-lg">
<div class="size50"> <div class="size75">
<div class="size75 vn-mt-ml"> <div class="size100 vn-mt-ml">
<h1 class="title uppercase">{{$t('title')}}</h1>
<table class="row-oriented ticket-info"> <table class="row-oriented ticket-info">
<tbody> <tbody>
<tr> <tr>
@ -16,7 +15,7 @@
</tr> </tr>
<tr> <tr>
<td class="font gray uppercase">{{$t('invoiceId')}}</td> <td class="font gray uppercase">{{$t('invoiceId')}}</td>
<th>{{invoice.id}}</th> <th>{{invoice.supplierRef}}</th>
</tr> </tr>
<tr> <tr>
<td class="font gray uppercase">{{$t('date')}}</td> <td class="font gray uppercase">{{$t('date')}}</td>
@ -26,7 +25,7 @@
</table> </table>
</div> </div>
</div> </div>
<div class="size50"> <div class="size25">
<div class="panel"> <div class="panel">
<div class="header">{{$t('invoiceData')}}</div> <div class="header">{{$t('invoiceData')}}</div>
<div class="body"> <div class="body">
@ -43,7 +42,7 @@
<div class="vn-mt-lg" v-for="entry in entries"> <div class="vn-mt-lg" v-for="entry in entries">
<div class="table-title clearfix"> <div class="table-title clearfix">
<div class="pull-left"> <div class="pull-left">
<h2>{{$t('invoiceId')}}</h2> <h2>{{$t('entry')}}</h2>
</div> </div>
<div class="pull-left vn-mr-md"> <div class="pull-left vn-mr-md">
<div class="field rectangle"> <div class="field rectangle">
@ -64,7 +63,7 @@
</div> </div>
<div class="pull-left"> <div class="pull-left">
<div class="field rectangle"> <div class="field rectangle">
<span>{{entry.ref}}</span> <span>{{entry.reference}}</span>
</div> </div>
</div> </div>
</span> </span>
@ -82,7 +81,7 @@
<tr> <tr>
<td width="50%">{{buy.name}}</td> <td width="50%">{{buy.name}}</td>
<td class="number">{{buy.quantity}}</td> <td class="number">{{buy.quantity}}</td>
<td class="number">{{buy.buyingValue}}</td> <td class="number">{{buy.buyingValue | currency('EUR', $i18n.locale)}}</td>
<td class="number">{{buyImport(buy) | currency('EUR', $i18n.locale)}}</td> <td class="number">{{buyImport(buy) | currency('EUR', $i18n.locale)}}</td>
</tr> </tr>
<tr class="description font light-gray"> <tr class="description font light-gray">
@ -103,27 +102,31 @@
</tfoot> </tfoot>
</table> </table>
</div> </div>
<div class="columns vn-mt-xl"> <div class="columns vn-mt-xl">
<div id="taxes" class="size50 pull-right no-page-break" v-if="taxes"> <div id="signature" class="size50 pull-left no-page-break vn-pr-xs">
<div class="panel">
<div class="header">{{$t('payMethod')}}: {{invoice.payMethod}}</div>
<div class="body">
<div class="vn-mt-md">{{$t('signer.received')}}:</div>
<div class="vn-my-md">{{$t('signer.signed')}}:</div>
</div>
</div>
</div>
<div id="taxes" class="size50 pull-right no-page-break vn-pl-xs vn-mt-md" v-if="taxes">
<table class="column-oriented"> <table class="column-oriented">
<thead> <thead>
<tr> <tr>
<th colspan="4">{{$t('taxBreakdown')}}</th> <th colspan="4">{{$t('taxBreakdown')}}</th>
</tr> </tr>
</thead> </thead>
<thead class="light">
<tr>
<th width="45%">{{$t('type')}}</th>
<th width="25%" class="number">{{$t('taxBase')}}</th>
<th>{{$t('tax')}}</th>
<th class="number">{{$t('fee')}}</th>
</tr>
</thead>
<tbody> <tbody>
<tr v-for="tax in taxes"> <tr v-for="tax in taxes">
<td width="45%">{{tax.name}}</td> <td width="45%">{{tax.name}}</td>
<td width="25%" class="number">{{tax.taxableBase | currency('EUR', $i18n.locale)}}</td> <td width="25%" class="number">{{tax.taxableBase | currency('EUR', $i18n.locale)}}
<td>{{tax.rate | percentage}}</td> </td>
<td>{{(tax.rate / 100) | percentage}}</td>
<td class="number">{{tax.vat | currency('EUR', $i18n.locale)}}</td> <td class="number">{{tax.vat | currency('EUR', $i18n.locale)}}</td>
</tr> </tr>
</tbody> </tbody>
@ -150,28 +153,16 @@
</div> </div>
</div> </div>
</div> </div>
<div class="columns vn-mt-xl"> </div>
<div class="size50 pull-left no-page-break">
<div class="panel"> <div id="footer" class="vn-mt-xl">
<div class="header">{{$t('observations')}}</div> <h2 class="centered bold">{{$t('footer')}}</h2>
<div class="body">
<div>{{$t('payMethod')}}</div>
<div>{{invoice.payMethod}}</div>
</div>
</div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
<template v-slot:footer> <template v-slot:footer>
<report-footer <report-footer id="pageFooter" v-bind:company-code="invoice.companyCode" v-bind:left-text="$t('invoiceId')"
id="pageFooter" v-bind:center-text="invoice.name" v-bind="$props">
v-bind:company-code="invoice.companyCode"
v-bind:left-text="$t('invoiceId')"
v-bind:center-text="invoice.name"
v-bind="$props"
>
</report-footer> </report-footer>
</template> </template>
</report-body> </report-body>

View File

@ -9,6 +9,16 @@ module.exports = {
this.invoice = await this.fetchInvoice(this.id); this.invoice = await this.fetchInvoice(this.id);
this.taxes = await this.fetchTaxes(this.id); this.taxes = await this.fetchTaxes(this.id);
let defaultTax = await this.fetchDefaultTax();
if (defaultTax) {
defaultTax = Object.assign(defaultTax, {
taxableBase: 0,
vat: (this.taxTotal() * defaultTax.rate / 100)
});
this.taxes.push(defaultTax);
}
if (!this.invoice) if (!this.invoice)
throw new Error('Something went wrong'); throw new Error('Something went wrong');
@ -43,6 +53,9 @@ module.exports = {
fetchBuy(id) { fetchBuy(id) {
return this.rawSqlFromDef('buy', [id]); return this.rawSqlFromDef('buy', [id]);
}, },
fetchDefaultTax() {
return this.findOneFromDef('defaultTax');
},
async fetchTaxes(id) { async fetchTaxes(id) {
const taxes = await this.rawSqlFromDef(`taxes`, [id]); const taxes = await this.rawSqlFromDef(`taxes`, [id]);
return this.taxVat(taxes); return this.taxVat(taxes);

View File

@ -1,6 +1,6 @@
reportName: invoice reportName: agricultural receip
title: Agricultural invoice title: Agricultural receip
invoiceId: Agricultural invoice invoiceId: Agricultural receip
supplierId: Proveedor supplierId: Proveedor
invoiceData: Invoice data invoiceData: Invoice data
reference: Reference reference: Reference
@ -23,3 +23,8 @@ subtotal: Subtotal
taxBreakdown: Tax breakdown taxBreakdown: Tax breakdown
observations: Observations observations: Observations
payMethod: Pay method payMethod: Pay method
entry: Entry
signer:
received: Received
signed: Signature
footer: Passive subject covered by the special agrarian regime. Please send this duly signed and sealed copy. Thanks.

View File

@ -1,6 +1,6 @@
reportName: factura reportName: recibo agrícola
title: Factura Agrícola title: Recibo Agrícola
invoiceId: Factura Agrícola invoiceId: Recibo Agrícola
supplierId: Proveedor supplierId: Proveedor
invoiceData: Datos de facturación invoiceData: Datos de facturación
reference: Referencia reference: Referencia
@ -23,3 +23,8 @@ subtotal: Subtotal
taxBreakdown: Desglose impositivo taxBreakdown: Desglose impositivo
observations: Observaciones observations: Observaciones
payMethod: Método de pago payMethod: Método de pago
entry: Entrada
signer:
received: Recibí
signed: Firma y sello
footer: Sujeto pasivo acogido al régimen especial agrario. Les rogamos remitan esta copia debidamente firmada y sellada. Gracias.

View File

@ -0,0 +1,5 @@
SELECT
id,
retentionRate rate,
retentionName name
FROM invoiceInConfig;

View File

@ -1,7 +1,7 @@
SELECT SELECT
e.id, e.id,
t.landed, t.landed,
e.ref e.reference
FROM entry e FROM entry e
JOIN invoiceIn i ON i.id = e.invoiceInFk JOIN invoiceIn i ON i.id = e.invoiceInFk
JOIN travel t ON t.id = e.travelFk JOIN travel t ON t.id = e.travelFk

View File

@ -1,5 +1,5 @@
SELECT SELECT
i.id, i.supplierRef,
s.id supplierId, s.id supplierId,
i.created, i.created,
s.name, s.name,

View File

@ -5,4 +5,5 @@ SELECT
FROM invoiceIn ii FROM invoiceIn ii
JOIN invoiceInTax iit ON ii.id = iit.invoiceInFk JOIN invoiceInTax iit ON ii.id = iit.invoiceInFk
JOIN sage.TiposIva ti ON ti.CodigoIva = iit.taxTypeSageFk JOIN sage.TiposIva ti ON ti.CodigoIva = iit.taxTypeSageFk
WHERE ii.id = ?; WHERE ii.id = ?
ORDER BY name DESC;

View File

@ -1,6 +1,6 @@
SELECT SELECT
e.id, e.id,
e.ref, e.reference,
e.supplierFk, e.supplierFk,
t.shipped t.shipped
FROM vn.entry e FROM vn.entry e

View File

@ -39,7 +39,7 @@
<h2> <h2>
<span>{{$t('entry')}} {{entry.id}}</span> <span>{{$t('entry')}} {{entry.id}}</span>
<span>{{$t('dated')}} {{entry.shipped | date('%d-%m-%Y')}}</span> <span>{{$t('dated')}} {{entry.shipped | date('%d-%m-%Y')}}</span>
<span class="pull-right">{{$t('reference')}} {{entry.ref}}</span> <span class="pull-right">{{$t('reference')}} {{entry.reference}}</span>
</h2> </h2>
<table class="column-oriented repeatable"> <table class="column-oriented repeatable">
<thead> <thead>