From 9585af8e77a2d8566078fb171276be1f047ddd9a Mon Sep 17 00:00:00 2001 From: robert Date: Thu, 23 May 2024 12:39:30 +0200 Subject: [PATCH 001/123] feat: refs #6822 create entryTransfer --- db/routines/vn/procedures/entryTransfer.sql | 113 ++++++++++++++++++++ db/routines/vn/procedures/entry_clone.sql | 9 +- 2 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 db/routines/vn/procedures/entryTransfer.sql diff --git a/db/routines/vn/procedures/entryTransfer.sql b/db/routines/vn/procedures/entryTransfer.sql new file mode 100644 index 000000000..b0d3c98e3 --- /dev/null +++ b/db/routines/vn/procedures/entryTransfer.sql @@ -0,0 +1,113 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`entryTransfer`(vOriginalEntry INT) +BEGIN +/** +* If the bic length is Incorrect throw exception +* +* @param vBic bic code +*/ + + DECLARE vNewEntryFk INT; + DECLARE vTravelFk INT; + DECLARE vWarehouseFk INT; + + -- Clonar la entrada + CALL entry_clone(vOriginalEntry); + + SELECT id INTO vNewEntryFk + FROM entry + WHERE clonedFrom = vOriginalEntry + ORDER BY dated DESC + LIMIT 1; + + -- Hay que crear un nuevo travel, con salida hoy y llegada mañana y asignar la entrada nueva al nuevo travel. + INSERT INTO travel( + shipped, + landed, + warehouseInFk, + warehouseOutFk, + `ref`, + isReceived, + agencyModeFk) + SELECT util.VN_CURDATE(), + util.VN_CURDATE() + INTERVAL 1 DAY, + t.warehouseInFk, + t.warehouseOutFk, + t.`ref`, + t.isReceived, + t.agencyModeFk + FROM travel t + JOIN entry e ON e.travelFk = t.id + WHERE e.id = vOriginalEntry; + + SET vTravelFk = LAST_INSERT_ID(); + + UPDATE entry + SET travelFk = vTravelFk + WHERE id = vNewEntryFk; + + -- Poner a 0 las cantidades + UPDATE buy b + SET b.quantity = 0, b.stickers = 0 + WHERE b.entryFk = vNewEntryFk; + + -- Eliminar duplicados + DELETE b.* + FROM buy b + LEFT JOIN (SELECT b.id, b.itemFk + FROM buy b + WHERE b.entryFk = vNewEntryFk + GROUP BY b.itemFk) tBuy ON tBuy.id = b.id + WHERE b.entryFk = vNewEntryFk + AND tBuy.id IS NULL; + + SELECT t.warehouseInFk INTO vWarehouseFk + FROM travel t + JOIN entry e ON e.travelFk = t.id + WHERE e.id = vOriginalEntry; + + -- Actualizar la nueva entrada con lo que no está ubicado HOY, descontando lo vendido HOY de esas ubicaciones + UPDATE buy b + JOIN ( + SELECT tBuy.itemFk, IFNULL(iss.visible,0) visible, tBuy.totalQuantity, IFNULL(sales.sold,0) sold + FROM (SELECT b.itemFk, SUM(b.quantity) totalQuantity + FROM buy b + WHERE b.entryFk = vOriginalEntry + GROUP BY b.itemFk + ) tBuy + LEFT JOIN ( + SELECT ish.itemFk, SUM(visible) visible + FROM itemShelving ish + JOIN shelving sh ON sh.code = ish.shelvingFk + JOIN parking p ON p.id = sh.parkingFk + JOIN sector s ON s.id = p.sectorFk + WHERE s.warehouseFk = vWarehouseFk + AND sh.parked = util.VN_CURDATE() + GROUP BY ish.itemFk) iss ON tBuy.itemFk = iss.itemFk + LEFT JOIN ( + SELECT s.itemFk, SUM(s.quantity) sold + FROM ticket t + JOIN sale s ON s.ticketFk = t.id + JOIN itemShelvingSale iss ON iss.saleFk = s.id + JOIN itemShelving is2 ON is2.id = iss.itemShelvingFk + JOIN shelving s2 ON s2.code = is2.shelvingFk + WHERE t.shipped BETWEEN util.VN_CURDATE() AND util.dayend(util.VN_CURDATE()) + AND s2.parked = util.VN_CURDATE() + GROUP BY s.itemFk) sales ON sales.itemFk = tBuy.itemFk + WHERE visible = tBuy.totalQuantity + OR iss.itemFk IS NULL + ) sub ON sub.itemFk = b.itemFk + SET b.quantity = sub.totalQuantity - sub.visible - sub.sold + WHERE b.entryFk = vNewEntryFk; + + -- Limpia la nueva entrada + DELETE b.* + FROM buy b + WHERE b.entryFk = vNewEntryFk + AND b.quantity = 0; + + CALL cache.visible_refresh(@c,TRUE,7); + CALL cache.available_refresh(@c, TRUE, 7, util.VN_CURDATE()); + +END$$ +DELIMITER ; diff --git a/db/routines/vn/procedures/entry_clone.sql b/db/routines/vn/procedures/entry_clone.sql index 4f38447c8..b970ac0ff 100644 --- a/db/routines/vn/procedures/entry_clone.sql +++ b/db/routines/vn/procedures/entry_clone.sql @@ -1,5 +1,5 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`entry_clone`(vSelf INT) +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`entry_clone`(IN vSelf INT, OUT vNewEntryFk INT) BEGIN /** * clones an entry. @@ -8,6 +8,12 @@ BEGIN */ DECLARE vNewEntryFk INT; + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK; + RESIGNAL; + END; + START TRANSACTION; CALL entry_cloneHeader(vSelf, vNewEntryFk, NULL); @@ -15,6 +21,5 @@ BEGIN COMMIT; - SELECT vNewEntryFk; END$$ DELIMITER ; From bac07fe265c0393bbbe329bea42e63b6ae5d270f Mon Sep 17 00:00:00 2001 From: robert Date: Thu, 23 May 2024 12:41:59 +0200 Subject: [PATCH 002/123] feat: refs #6822 --- db/routines/vn/procedures/entryTransfer.sql | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/db/routines/vn/procedures/entryTransfer.sql b/db/routines/vn/procedures/entryTransfer.sql index b0d3c98e3..64c9b7680 100644 --- a/db/routines/vn/procedures/entryTransfer.sql +++ b/db/routines/vn/procedures/entryTransfer.sql @@ -12,13 +12,7 @@ BEGIN DECLARE vWarehouseFk INT; -- Clonar la entrada - CALL entry_clone(vOriginalEntry); - - SELECT id INTO vNewEntryFk - FROM entry - WHERE clonedFrom = vOriginalEntry - ORDER BY dated DESC - LIMIT 1; + CALL entry_clone(vOriginalEntry,vNewEntryFk); -- Hay que crear un nuevo travel, con salida hoy y llegada mañana y asignar la entrada nueva al nuevo travel. INSERT INTO travel( From 04f6059d6f67978947f7f385bded3c2c90640839 Mon Sep 17 00:00:00 2001 From: robert Date: Wed, 3 Jul 2024 12:03:28 +0200 Subject: [PATCH 003/123] feat: refs #6822 --- modules/entry/back/methods/entry/transfer.js | 38 ++++++++++++++++++++ modules/entry/back/models/entry.js | 1 + 2 files changed, 39 insertions(+) create mode 100644 modules/entry/back/methods/entry/transfer.js diff --git a/modules/entry/back/methods/entry/transfer.js b/modules/entry/back/methods/entry/transfer.js new file mode 100644 index 000000000..977832694 --- /dev/null +++ b/modules/entry/back/methods/entry/transfer.js @@ -0,0 +1,38 @@ +module.exports = Self => { + Self.remoteMethodCtx('transfer', { + description: 'Trasladar la mercancia de una entrada al dia siguiente', + accepts: [ + { + arg: 'id', + type: 'number', + required: true, + http: {source: 'path'} + } + ], + http: { + path: '/:id/transfer', + verb: 'POST' + } + }); + + Self.transfer = async(ctx, id, options) => { + const myOptions = {userId: ctx.req.accessToken.userId}; + let tx; + + if (typeof options == 'object') + Object.assign(myOptions, options); + + if (!myOptions.transaction) { + tx = await Self.beginTransaction({}); + myOptions.transaction = tx; + } + + try { + await Self.rawSql('CALL vn.entryTransfer(?)', [id], myOptions); + if (tx) await tx.commit(); + } catch (e) { + if (tx) await tx.rollback(); + throw e; + } + }; +}; diff --git a/modules/entry/back/models/entry.js b/modules/entry/back/models/entry.js index 6e27e1ece..5f47d718e 100644 --- a/modules/entry/back/models/entry.js +++ b/modules/entry/back/models/entry.js @@ -10,6 +10,7 @@ module.exports = Self => { require('../methods/entry/addFromPackaging')(Self); require('../methods/entry/addFromBuy')(Self); require('../methods/entry/buyLabel')(Self); + require('../methods/entry/transfer')(Self); Self.observe('before save', async function(ctx, options) { if (ctx.isNewInstance) return; From a34376f4d2bf998042920dadc33d3d09711d1452 Mon Sep 17 00:00:00 2001 From: robert Date: Wed, 10 Jul 2024 07:31:49 +0200 Subject: [PATCH 004/123] feat: refs #6822 --- .../vn/procedures/{entryTransfer.sql => entry_transfer.sql} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename db/routines/vn/procedures/{entryTransfer.sql => entry_transfer.sql} (98%) diff --git a/db/routines/vn/procedures/entryTransfer.sql b/db/routines/vn/procedures/entry_transfer.sql similarity index 98% rename from db/routines/vn/procedures/entryTransfer.sql rename to db/routines/vn/procedures/entry_transfer.sql index 64c9b7680..c0f111c34 100644 --- a/db/routines/vn/procedures/entryTransfer.sql +++ b/db/routines/vn/procedures/entry_transfer.sql @@ -1,5 +1,5 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`entryTransfer`(vOriginalEntry INT) +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`entry_transfer`(vOriginalEntry INT) BEGIN /** * If the bic length is Incorrect throw exception From 5a7d5787f725e15fd86d0e737ab50aed37d1733d Mon Sep 17 00:00:00 2001 From: robert Date: Thu, 11 Jul 2024 07:38:13 +0200 Subject: [PATCH 005/123] feat: refs #6822 clonar travel con warehouseInFk --- db/routines/vn/procedures/entry_transfer.sql | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/db/routines/vn/procedures/entry_transfer.sql b/db/routines/vn/procedures/entry_transfer.sql index c0f111c34..aedfdb7d6 100644 --- a/db/routines/vn/procedures/entry_transfer.sql +++ b/db/routines/vn/procedures/entry_transfer.sql @@ -2,9 +2,9 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`entry_transfer`(vOriginalEntry INT) BEGIN /** -* If the bic length is Incorrect throw exception +* Adelanta a mañana la mercancia de una entrada a partir de lo que hay ubicado en el almacén * -* @param vBic bic code +* @param vOriginalEntry entrada que se quiera adelantar */ DECLARE vNewEntryFk INT; @@ -14,7 +14,7 @@ BEGIN -- Clonar la entrada CALL entry_clone(vOriginalEntry,vNewEntryFk); - -- Hay que crear un nuevo travel, con salida hoy y llegada mañana y asignar la entrada nueva al nuevo travel. + -- Hay que crear un nuevo travel, con salida hoy y llegada mañana y asignar la entrada nueva al nuevo travel. INSERT INTO travel( shipped, landed, @@ -26,7 +26,7 @@ BEGIN SELECT util.VN_CURDATE(), util.VN_CURDATE() + INTERVAL 1 DAY, t.warehouseInFk, - t.warehouseOutFk, + t.warehouseInFk, t.`ref`, t.isReceived, t.agencyModeFk From d60a1a3424a19c0ead18976bf53a74d24bb3109b Mon Sep 17 00:00:00 2001 From: robert Date: Thu, 11 Jul 2024 09:39:06 +0200 Subject: [PATCH 006/123] feat: refs #6822 entry_clone --- db/routines/vn/procedures/entry_clone.sql | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/db/routines/vn/procedures/entry_clone.sql b/db/routines/vn/procedures/entry_clone.sql index b970ac0ff..679af5f47 100644 --- a/db/routines/vn/procedures/entry_clone.sql +++ b/db/routines/vn/procedures/entry_clone.sql @@ -1,5 +1,5 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`entry_clone`(IN vSelf INT, OUT vNewEntryFk INT) +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`entry_clone`(IN vSelf INT, OUT newEntryFk INT) BEGIN /** * clones an entry. @@ -20,6 +20,7 @@ BEGIN CALL entry_copyBuys(vSelf, vNewEntryFk); COMMIT; + SET newEntryFk = vNewEntryFk; END$$ DELIMITER ; From 109770b0a37059b9a53bf626b5adf230ea29cf42 Mon Sep 17 00:00:00 2001 From: robert Date: Wed, 17 Jul 2024 10:28:22 +0200 Subject: [PATCH 007/123] feat: refs #6822 return newEntry --- db/routines/vn/procedures/entry_transfer.sql | 14 +++++++++++++- modules/entry/back/methods/entry/transfer.js | 9 ++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/db/routines/vn/procedures/entry_transfer.sql b/db/routines/vn/procedures/entry_transfer.sql index aedfdb7d6..64cafe043 100644 --- a/db/routines/vn/procedures/entry_transfer.sql +++ b/db/routines/vn/procedures/entry_transfer.sql @@ -1,5 +1,5 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`entry_transfer`(vOriginalEntry INT) +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`entry_transfer`(vOriginalEntry INT, OUT vNewEntry INT) BEGIN /** * Adelanta a mañana la mercancia de una entrada a partir de lo que hay ubicado en el almacén @@ -11,6 +11,16 @@ BEGIN DECLARE vTravelFk INT; DECLARE vWarehouseFk INT; + DECLARE CONTINUE HANDLER FOR NOT FOUND + SET vDone = TRUE; + + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK; + RESIGNAL; + END; + + START TRANSACTION; -- Clonar la entrada CALL entry_clone(vOriginalEntry,vNewEntryFk); @@ -100,6 +110,8 @@ BEGIN WHERE b.entryFk = vNewEntryFk AND b.quantity = 0; + SET vNewEntry = vNewEntryFk; + COMMIT; CALL cache.visible_refresh(@c,TRUE,7); CALL cache.available_refresh(@c, TRUE, 7, util.VN_CURDATE()); diff --git a/modules/entry/back/methods/entry/transfer.js b/modules/entry/back/methods/entry/transfer.js index 977832694..53ae4b48c 100644 --- a/modules/entry/back/methods/entry/transfer.js +++ b/modules/entry/back/methods/entry/transfer.js @@ -12,6 +12,10 @@ module.exports = Self => { http: { path: '/:id/transfer', verb: 'POST' + }, + returns: { + arg: 'newEntryFk', + type: 'number' } }); @@ -28,8 +32,11 @@ module.exports = Self => { } try { - await Self.rawSql('CALL vn.entryTransfer(?)', [id], myOptions); + await Self.rawSql('CALL vn.entry_transfer(?, @vNewEntry)', [id], myOptions); + const newEntryFk = await Self.rawSql('SELECT @vNewEntry AS newEntryFk', [], myOptions); + if (tx) await tx.commit(); + return newEntryFk; } catch (e) { if (tx) await tx.rollback(); throw e; From 2cb8d07aef43e1021a86e8ebdfbb316ec47116ab Mon Sep 17 00:00:00 2001 From: robert Date: Wed, 17 Jul 2024 10:30:23 +0200 Subject: [PATCH 008/123] feat: refs #6822 --- db/routines/vn/procedures/entry_transfer.sql | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/db/routines/vn/procedures/entry_transfer.sql b/db/routines/vn/procedures/entry_transfer.sql index 64cafe043..efe630e36 100644 --- a/db/routines/vn/procedures/entry_transfer.sql +++ b/db/routines/vn/procedures/entry_transfer.sql @@ -11,9 +11,6 @@ BEGIN DECLARE vTravelFk INT; DECLARE vWarehouseFk INT; - DECLARE CONTINUE HANDLER FOR NOT FOUND - SET vDone = TRUE; - DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; @@ -111,9 +108,9 @@ BEGIN AND b.quantity = 0; SET vNewEntry = vNewEntryFk; - COMMIT; + CALL cache.visible_refresh(@c,TRUE,7); CALL cache.available_refresh(@c, TRUE, 7, util.VN_CURDATE()); - + COMMIT; END$$ DELIMITER ; From 5f63017853f5838ca570ac95dd9f9553d2533f26 Mon Sep 17 00:00:00 2001 From: robert Date: Tue, 6 Aug 2024 07:20:30 +0200 Subject: [PATCH 009/123] feat: refs #6822 changes transaction --- .../bs/procedures/ventas_contables_add.sql | 2 +- .../vn/procedures/entry_splitByShelving.sql | 4 +- db/routines/vn/procedures/entry_transfer.sql | 67 ++++++++++--------- 3 files changed, 39 insertions(+), 34 deletions(-) diff --git a/db/routines/bs/procedures/ventas_contables_add.sql b/db/routines/bs/procedures/ventas_contables_add.sql index 72b0c0fee..c82cb96d9 100644 --- a/db/routines/bs/procedures/ventas_contables_add.sql +++ b/db/routines/bs/procedures/ventas_contables_add.sql @@ -15,7 +15,7 @@ BEGIN DELETE FROM bs.ventas_contables WHERE year = vYear - AND month = vMonth; + AND month = vMonth; DROP TEMPORARY TABLE IF EXISTS tmp.ticket_list; CREATE TEMPORARY TABLE tmp.ticket_list diff --git a/db/routines/vn/procedures/entry_splitByShelving.sql b/db/routines/vn/procedures/entry_splitByShelving.sql index f46278e5a..a8df482fa 100644 --- a/db/routines/vn/procedures/entry_splitByShelving.sql +++ b/db/routines/vn/procedures/entry_splitByShelving.sql @@ -34,14 +34,14 @@ BEGIN read_loop: LOOP SET vDone = FALSE; - + FETCH cur INTO vBuyFk, vIshStickers, vBuyStickers; IF vDone THEN LEAVE read_loop; END IF; - IF vIshStickers = vBuyStickers THEN + IF vIshStickers = vBuyStickers THEN UPDATE buy SET entryFk = vToEntryFk WHERE id = vBuyFk; diff --git a/db/routines/vn/procedures/entry_transfer.sql b/db/routines/vn/procedures/entry_transfer.sql index efe630e36..6d7da2b37 100644 --- a/db/routines/vn/procedures/entry_transfer.sql +++ b/db/routines/vn/procedures/entry_transfer.sql @@ -17,10 +17,11 @@ BEGIN RESIGNAL; END; - START TRANSACTION; -- Clonar la entrada CALL entry_clone(vOriginalEntry,vNewEntryFk); + START TRANSACTION; + -- Hay que crear un nuevo travel, con salida hoy y llegada mañana y asignar la entrada nueva al nuevo travel. INSERT INTO travel( shipped, @@ -68,36 +69,38 @@ BEGIN WHERE e.id = vOriginalEntry; -- Actualizar la nueva entrada con lo que no está ubicado HOY, descontando lo vendido HOY de esas ubicaciones + CREATE OR REPLACE TEMPORARY TABLE tBuy + ENGINE = MEMORY + SELECT tBuy.itemFk, IFNULL(iss.visible,0) visible, tBuy.totalQuantity, IFNULL(sales.sold,0) sold + FROM (SELECT b.itemFk, SUM(b.quantity) totalQuantity + FROM buy b + WHERE b.entryFk = vOriginalEntry + GROUP BY b.itemFk + ) tBuy + LEFT JOIN ( + SELECT ish.itemFk, SUM(visible) visible + FROM itemShelving ish + JOIN shelving sh ON sh.code = ish.shelvingFk + JOIN parking p ON p.id = sh.parkingFk + JOIN sector s ON s.id = p.sectorFk + WHERE s.warehouseFk = vWarehouseFk + AND sh.parked = util.VN_CURDATE() + GROUP BY ish.itemFk) iss ON tBuy.itemFk = iss.itemFk + LEFT JOIN ( + SELECT s.itemFk, SUM(s.quantity) sold + FROM ticket t + JOIN sale s ON s.ticketFk = t.id + JOIN itemShelvingSale iss ON iss.saleFk = s.id + JOIN itemShelving is2 ON is2.id = iss.itemShelvingFk + JOIN shelving s2 ON s2.code = is2.shelvingFk + WHERE t.shipped BETWEEN util.VN_CURDATE() AND util.dayend(util.VN_CURDATE()) + AND s2.parked = util.VN_CURDATE() + GROUP BY s.itemFk) sales ON sales.itemFk = tBuy.itemFk + WHERE visible = tBuy.totalQuantity + OR iss.itemFk IS NULL; + UPDATE buy b - JOIN ( - SELECT tBuy.itemFk, IFNULL(iss.visible,0) visible, tBuy.totalQuantity, IFNULL(sales.sold,0) sold - FROM (SELECT b.itemFk, SUM(b.quantity) totalQuantity - FROM buy b - WHERE b.entryFk = vOriginalEntry - GROUP BY b.itemFk - ) tBuy - LEFT JOIN ( - SELECT ish.itemFk, SUM(visible) visible - FROM itemShelving ish - JOIN shelving sh ON sh.code = ish.shelvingFk - JOIN parking p ON p.id = sh.parkingFk - JOIN sector s ON s.id = p.sectorFk - WHERE s.warehouseFk = vWarehouseFk - AND sh.parked = util.VN_CURDATE() - GROUP BY ish.itemFk) iss ON tBuy.itemFk = iss.itemFk - LEFT JOIN ( - SELECT s.itemFk, SUM(s.quantity) sold - FROM ticket t - JOIN sale s ON s.ticketFk = t.id - JOIN itemShelvingSale iss ON iss.saleFk = s.id - JOIN itemShelving is2 ON is2.id = iss.itemShelvingFk - JOIN shelving s2 ON s2.code = is2.shelvingFk - WHERE t.shipped BETWEEN util.VN_CURDATE() AND util.dayend(util.VN_CURDATE()) - AND s2.parked = util.VN_CURDATE() - GROUP BY s.itemFk) sales ON sales.itemFk = tBuy.itemFk - WHERE visible = tBuy.totalQuantity - OR iss.itemFk IS NULL - ) sub ON sub.itemFk = b.itemFk + JOIN (SELECT * FROM tBuy) sub ON sub.itemFk = b.itemFk SET b.quantity = sub.totalQuantity - sub.visible - sub.sold WHERE b.entryFk = vNewEntryFk; @@ -107,10 +110,12 @@ BEGIN WHERE b.entryFk = vNewEntryFk AND b.quantity = 0; + COMMIT; + SET vNewEntry = vNewEntryFk; CALL cache.visible_refresh(@c,TRUE,7); CALL cache.available_refresh(@c, TRUE, 7, util.VN_CURDATE()); - COMMIT; + END$$ DELIMITER ; From e99920196918815c4b7c32da2a47dea48c5f764b Mon Sep 17 00:00:00 2001 From: robert Date: Wed, 11 Sep 2024 09:59:01 +0200 Subject: [PATCH 010/123] feat: refs #6822 entry_clone --- db/routines/vn/procedures/entry_clone.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/routines/vn/procedures/entry_clone.sql b/db/routines/vn/procedures/entry_clone.sql index 1f436e230..122d521cb 100644 --- a/db/routines/vn/procedures/entry_clone.sql +++ b/db/routines/vn/procedures/entry_clone.sql @@ -1,5 +1,5 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`entry_clone`(vSelf INT) +CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`entry_clone`(vSelf INT, OUT newEntryFk INT) BEGIN /** * clones an entry. From 9a01ae5ccc5f1e07ab36a31dc2f3bf6377cf9d4a Mon Sep 17 00:00:00 2001 From: robert Date: Wed, 23 Oct 2024 12:32:48 +0200 Subject: [PATCH 011/123] feat: refs #6822 tabulaciones --- db/routines/vn/procedures/entry_transfer.sql | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/db/routines/vn/procedures/entry_transfer.sql b/db/routines/vn/procedures/entry_transfer.sql index 6d7da2b37..9fbf561b2 100644 --- a/db/routines/vn/procedures/entry_transfer.sql +++ b/db/routines/vn/procedures/entry_transfer.sql @@ -2,11 +2,10 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`entry_transfer`(vOriginalEntry INT, OUT vNewEntry INT) BEGIN /** -* Adelanta a mañana la mercancia de una entrada a partir de lo que hay ubicado en el almacén -* -* @param vOriginalEntry entrada que se quiera adelantar -*/ - + * Adelanta a mañana la mercancia de una entrada a partir de lo que hay ubicado en el almacén + * + * @param vOriginalEntry entrada que se quiera adelantar + */ DECLARE vNewEntryFk INT; DECLARE vTravelFk INT; DECLARE vWarehouseFk INT; @@ -40,7 +39,7 @@ BEGIN t.agencyModeFk FROM travel t JOIN entry e ON e.travelFk = t.id - WHERE e.id = vOriginalEntry; + WHERE e.id = vOriginalEntry; SET vTravelFk = LAST_INSERT_ID(); @@ -116,6 +115,5 @@ BEGIN CALL cache.visible_refresh(@c,TRUE,7); CALL cache.available_refresh(@c, TRUE, 7, util.VN_CURDATE()); - END$$ DELIMITER ; From 01537d410ccda58d453b722f9e6b3f780dd852df Mon Sep 17 00:00:00 2001 From: robert Date: Wed, 27 Nov 2024 13:08:14 +0100 Subject: [PATCH 012/123] feat: refs #6629 refs # 6629 updateAddress --- .../client/back/methods/client/updateAddress.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/modules/client/back/methods/client/updateAddress.js b/modules/client/back/methods/client/updateAddress.js index 7342b28f1..190ebbc63 100644 --- a/modules/client/back/methods/client/updateAddress.js +++ b/modules/client/back/methods/client/updateAddress.js @@ -72,6 +72,10 @@ module.exports = function(Self) { { arg: 'isLogifloraAllowed', type: 'boolean' + }, + { + arg: 'updateObservations', + type: 'boolean' } ], returns: { @@ -127,6 +131,17 @@ module.exports = function(Self) { delete args.ctx; // Remove unwanted properties const updatedAddress = await address.updateAttributes(ctx.args, myOptions); + if (args.updateObservations) { + const ticket = await Self.rawSql(` + UPDATE ticketObservation to2 + JOIN ticket t ON t.id = to2.ticketFk + JOIN address a ON a.id = t.addressFk + JOIN addressObservation ao ON ao.addressFk = a.id + SET to2.description = ao.description + WHERE ao.observationTypeFk = to2.observationTypeFk + AND a.id = ? + AND t.shipped >= util.VN_CURDATE()`, [addressId]); + } return updatedAddress; }; From 4b474834cfd5b15586dfb1e3159eafc8faa5aa05 Mon Sep 17 00:00:00 2001 From: robert Date: Thu, 28 Nov 2024 08:13:53 +0100 Subject: [PATCH 013/123] feat: refs #6822 change request --- db/routines/vn/procedures/entry_clone.sql | 6 +- db/routines/vn/procedures/entry_transfer.sql | 96 +++++++++++--------- 2 files changed, 59 insertions(+), 43 deletions(-) diff --git a/db/routines/vn/procedures/entry_clone.sql b/db/routines/vn/procedures/entry_clone.sql index 122d521cb..12738af54 100644 --- a/db/routines/vn/procedures/entry_clone.sql +++ b/db/routines/vn/procedures/entry_clone.sql @@ -1,10 +1,14 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`entry_clone`(vSelf INT, OUT newEntryFk INT) +CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`entry_clone`( + vSelf INT, + OUT newEntryFk INT +) BEGIN /** * clones an entry. * * @param vSelf The entry id + * @param newEntryFk Output parameter of the new created input */ DECLARE vNewEntryFk INT; diff --git a/db/routines/vn/procedures/entry_transfer.sql b/db/routines/vn/procedures/entry_transfer.sql index 9fbf561b2..a5a127738 100644 --- a/db/routines/vn/procedures/entry_transfer.sql +++ b/db/routines/vn/procedures/entry_transfer.sql @@ -1,10 +1,14 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`entry_transfer`(vOriginalEntry INT, OUT vNewEntry INT) +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`entry_transfer`( + vOriginalEntry INT, + OUT vNewEntry INT + ) BEGIN /** * Adelanta a mañana la mercancia de una entrada a partir de lo que hay ubicado en el almacén - * + * * @param vOriginalEntry entrada que se quiera adelantar + * @param vNewEntry nueva entrada creada */ DECLARE vNewEntryFk INT; DECLARE vTravelFk INT; @@ -15,9 +19,9 @@ BEGIN ROLLBACK; RESIGNAL; END; - + -- Clonar la entrada - CALL entry_clone(vOriginalEntry,vNewEntryFk); + CALL entry_clone(vOriginalEntry, vNewEntryFk); START TRANSACTION; @@ -33,7 +37,7 @@ BEGIN SELECT util.VN_CURDATE(), util.VN_CURDATE() + INTERVAL 1 DAY, t.warehouseInFk, - t.warehouseInFk, + t.warehouseOutFk, t.`ref`, t.isReceived, t.agencyModeFk @@ -53,15 +57,15 @@ BEGIN WHERE b.entryFk = vNewEntryFk; -- Eliminar duplicados - DELETE b.* + DELETE b FROM buy b - LEFT JOIN (SELECT b.id, b.itemFk - FROM buy b + LEFT JOIN (SELECT b.id, b.itemFk + FROM buy b WHERE b.entryFk = vNewEntryFk GROUP BY b.itemFk) tBuy ON tBuy.id = b.id WHERE b.entryFk = vNewEntryFk AND tBuy.id IS NULL; - + SELECT t.warehouseInFk INTO vWarehouseFk FROM travel t JOIN entry e ON e.travelFk = t.id @@ -69,42 +73,50 @@ BEGIN -- Actualizar la nueva entrada con lo que no está ubicado HOY, descontando lo vendido HOY de esas ubicaciones CREATE OR REPLACE TEMPORARY TABLE tBuy - ENGINE = MEMORY - SELECT tBuy.itemFk, IFNULL(iss.visible,0) visible, tBuy.totalQuantity, IFNULL(sales.sold,0) sold - FROM (SELECT b.itemFk, SUM(b.quantity) totalQuantity - FROM buy b - WHERE b.entryFk = vOriginalEntry - GROUP BY b.itemFk - ) tBuy - LEFT JOIN ( - SELECT ish.itemFk, SUM(visible) visible - FROM itemShelving ish - JOIN shelving sh ON sh.code = ish.shelvingFk - JOIN parking p ON p.id = sh.parkingFk - JOIN sector s ON s.id = p.sectorFk - WHERE s.warehouseFk = vWarehouseFk - AND sh.parked = util.VN_CURDATE() - GROUP BY ish.itemFk) iss ON tBuy.itemFk = iss.itemFk - LEFT JOIN ( - SELECT s.itemFk, SUM(s.quantity) sold - FROM ticket t - JOIN sale s ON s.ticketFk = t.id - JOIN itemShelvingSale iss ON iss.saleFk = s.id - JOIN itemShelving is2 ON is2.id = iss.itemShelvingFk - JOIN shelving s2 ON s2.code = is2.shelvingFk - WHERE t.shipped BETWEEN util.VN_CURDATE() AND util.dayend(util.VN_CURDATE()) - AND s2.parked = util.VN_CURDATE() - GROUP BY s.itemFk) sales ON sales.itemFk = tBuy.itemFk - WHERE visible = tBuy.totalQuantity + WITH tBuy AS ( + SELECT b.itemFk, SUM(b.quantity) totalQuantity + FROM buy b + WHERE b.entryFk = vOriginalEntry + GROUP BY b.itemFk + ), + itemShelvings AS ( + SELECT ish.itemFk, SUM(visible) visible + FROM itemShelving ish + JOIN shelving sh ON sh.code = ish.shelvingFk + JOIN parking p ON p.id = sh.parkingFk + JOIN sector s ON s.id = p.sectorFk + WHERE s.warehouseFk = vWarehouseFk + AND sh.parked = util.VN_CURDATE() + GROUP BY ish.itemFk + ), + sales AS ( + SELECT s.itemFk, SUM(s.quantity) sold + FROM ticket t + JOIN sale s ON s.ticketFk = t.id + JOIN itemShelvingSale iss ON iss.saleFk = s.id + JOIN itemShelving is2 ON is2.id = iss.itemShelvingFk + JOIN shelving s2 ON s2.code = is2.shelvingFk + WHERE t.shipped BETWEEN util.VN_CURDATE() AND util.dayend(util.VN_CURDATE()) + AND s2.parked = util.VN_CURDATE() + GROUP BY s.itemFk + ) + SELECT tmp.itemFk, + IFNULL(iss.visible, 0) visible, + tmp.totalQuantity, + IFNULL(s.sold, 0) sold + FROM tBuy tmp + LEFT JOIN itemShelvings iss ON tmp.itemFk = iss.itemFk + LEFT JOIN sales s ON s.itemFk = tmp.itemFk + WHERE visible = tmp.totalQuantity OR iss.itemFk IS NULL; UPDATE buy b - JOIN (SELECT * FROM tBuy) sub ON sub.itemFk = b.itemFk - SET b.quantity = sub.totalQuantity - sub.visible - sub.sold + JOIN tBuy tmp ON tmp.itemFk = b.itemFk + SET b.quantity = tmp.totalQuantity - tmp.visible - tmp.sold WHERE b.entryFk = vNewEntryFk; - + -- Limpia la nueva entrada - DELETE b.* + DELETE b FROM buy b WHERE b.entryFk = vNewEntryFk AND b.quantity = 0; @@ -113,7 +125,7 @@ BEGIN SET vNewEntry = vNewEntryFk; - CALL cache.visible_refresh(@c,TRUE,7); - CALL cache.available_refresh(@c, TRUE, 7, util.VN_CURDATE()); + CALL cache.visible_refresh(@c,TRUE,vWarehouseFk); + CALL cache.available_refresh(@c, TRUE, vWarehouseFk, util.VN_CURDATE()); END$$ DELIMITER ; From be394cec283ee2f8dd5e0d694dbe82867e3a188b Mon Sep 17 00:00:00 2001 From: robert Date: Thu, 28 Nov 2024 08:17:32 +0100 Subject: [PATCH 014/123] feat: refs #6822 change request --- modules/entry/back/methods/entry/transfer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/entry/back/methods/entry/transfer.js b/modules/entry/back/methods/entry/transfer.js index 53ae4b48c..425fc6af1 100644 --- a/modules/entry/back/methods/entry/transfer.js +++ b/modules/entry/back/methods/entry/transfer.js @@ -33,7 +33,7 @@ module.exports = Self => { try { await Self.rawSql('CALL vn.entry_transfer(?, @vNewEntry)', [id], myOptions); - const newEntryFk = await Self.rawSql('SELECT @vNewEntry AS newEntryFk', [], myOptions); + const newEntryFk = await Self.rawSql('SELECT @vNewEntry newEntryFk', [], myOptions); if (tx) await tx.commit(); return newEntryFk; From 3f4aa60cd2fcc4a4ae612aa0dd48c7b2e17c04b9 Mon Sep 17 00:00:00 2001 From: robert Date: Thu, 28 Nov 2024 08:22:30 +0100 Subject: [PATCH 015/123] feat: refs #6822 poner esquemas en el with --- db/routines/vn/procedures/entry_transfer.sql | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/db/routines/vn/procedures/entry_transfer.sql b/db/routines/vn/procedures/entry_transfer.sql index a5a127738..bd14c4f62 100644 --- a/db/routines/vn/procedures/entry_transfer.sql +++ b/db/routines/vn/procedures/entry_transfer.sql @@ -75,27 +75,27 @@ BEGIN CREATE OR REPLACE TEMPORARY TABLE tBuy WITH tBuy AS ( SELECT b.itemFk, SUM(b.quantity) totalQuantity - FROM buy b + FROM vn.buy b WHERE b.entryFk = vOriginalEntry GROUP BY b.itemFk ), itemShelvings AS ( SELECT ish.itemFk, SUM(visible) visible - FROM itemShelving ish - JOIN shelving sh ON sh.code = ish.shelvingFk - JOIN parking p ON p.id = sh.parkingFk - JOIN sector s ON s.id = p.sectorFk + FROM vn.itemShelving ish + JOIN vn.shelving sh ON sh.code = ish.shelvingFk + JOIN vn.parking p ON p.id = sh.parkingFk + JOIN vn.sector s ON s.id = p.sectorFk WHERE s.warehouseFk = vWarehouseFk AND sh.parked = util.VN_CURDATE() GROUP BY ish.itemFk ), sales AS ( SELECT s.itemFk, SUM(s.quantity) sold - FROM ticket t - JOIN sale s ON s.ticketFk = t.id - JOIN itemShelvingSale iss ON iss.saleFk = s.id - JOIN itemShelving is2 ON is2.id = iss.itemShelvingFk - JOIN shelving s2 ON s2.code = is2.shelvingFk + FROM vn.ticket t + JOIN vn.sale s ON s.ticketFk = t.id + JOIN vn.itemShelvingSale iss ON iss.saleFk = s.id + JOIN vn.itemShelving is2 ON is2.id = iss.itemShelvingFk + JOIN vn.shelving s2 ON s2.code = is2.shelvingFk WHERE t.shipped BETWEEN util.VN_CURDATE() AND util.dayend(util.VN_CURDATE()) AND s2.parked = util.VN_CURDATE() GROUP BY s.itemFk From c518352bf7118d87c87eda2b5df783f8410bb96c Mon Sep 17 00:00:00 2001 From: robert Date: Wed, 4 Dec 2024 08:12:47 +0100 Subject: [PATCH 016/123] feat: refs #6822 changes required --- db/routines/vn/procedures/entry_clone.sql | 6 ++-- db/routines/vn/procedures/entry_transfer.sql | 35 +++++++++++++++++--- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/db/routines/vn/procedures/entry_clone.sql b/db/routines/vn/procedures/entry_clone.sql index 12738af54..c7cbf1f7b 100644 --- a/db/routines/vn/procedures/entry_clone.sql +++ b/db/routines/vn/procedures/entry_clone.sql @@ -1,14 +1,14 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`entry_clone`( vSelf INT, - OUT newEntryFk INT + OUT vOutputEntryFk INT ) BEGIN /** * clones an entry. * * @param vSelf The entry id - * @param newEntryFk Output parameter of the new created input + * @param vOutputEntryFk The new entry id */ DECLARE vNewEntryFk INT; @@ -24,7 +24,7 @@ BEGIN CALL entry_copyBuys(vSelf, vNewEntryFk); COMMIT; - SET newEntryFk = vNewEntryFk; + SET vOutputEntryFk = vNewEntryFk; END$$ DELIMITER ; diff --git a/db/routines/vn/procedures/entry_transfer.sql b/db/routines/vn/procedures/entry_transfer.sql index bd14c4f62..7943f738f 100644 --- a/db/routines/vn/procedures/entry_transfer.sql +++ b/db/routines/vn/procedures/entry_transfer.sql @@ -13,6 +13,12 @@ BEGIN DECLARE vNewEntryFk INT; DECLARE vTravelFk INT; DECLARE vWarehouseFk INT; + DECLARE vWarehouseInFk INT; + DECLARE vWarehouseOutFk INT; + DECLARE vRef INT; + DECLARE vIsReceived INT; + DECLARE vAgencyModeFk INT; + DECLARE vNewTravelFk INT; DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN @@ -26,7 +32,25 @@ BEGIN START TRANSACTION; -- Hay que crear un nuevo travel, con salida hoy y llegada mañana y asignar la entrada nueva al nuevo travel. - INSERT INTO travel( + SELECT warehouseInFk,warehouseOutFk,`ref`,isReceived ,agencyModeFk + INTO vWarehouseInFk,vWarehouseOutFk, vRef,vIsReceived, vAgencyModeFk + FROM travel t + JOIN entry e ON e.travelFk = t.id + WHERE e.id = 1; + + SELECT t.di INTO vNewTravelFk + FROM travel t + JOIN entry e ON e.travelFk = t.id + WHERE t.shipped = util.VN_CURDATE() + AND t.landed = util.VN_CURDATE() + INTERVAL 1 DAY + AND warehouseInFk = vWarehouseInFk + AND warehouseOutFk = vWarehouseOutFk + AND `ref` = vRef + AND isReceived =vIsReceived + AND agencyModeFk = vAgencyModeFk; + + IF NOT vNewTravelFk THEN + INSERT INTO travel( shipped, landed, warehouseInFk, @@ -45,7 +69,10 @@ BEGIN JOIN entry e ON e.travelFk = t.id WHERE e.id = vOriginalEntry; - SET vTravelFk = LAST_INSERT_ID(); + SET vTravelFk = LAST_INSERT_ID(); + ELSE + SET vTravelFk = vNewTravelFk; + END IF; UPDATE entry SET travelFk = vTravelFk @@ -82,7 +109,7 @@ BEGIN itemShelvings AS ( SELECT ish.itemFk, SUM(visible) visible FROM vn.itemShelving ish - JOIN vn.shelving sh ON sh.code = ish.shelvingFk + JOIN vn.shelving sh ON sh.id = ish.shelvingFk JOIN vn.parking p ON p.id = sh.parkingFk JOIN vn.sector s ON s.id = p.sectorFk WHERE s.warehouseFk = vWarehouseFk @@ -95,7 +122,7 @@ BEGIN JOIN vn.sale s ON s.ticketFk = t.id JOIN vn.itemShelvingSale iss ON iss.saleFk = s.id JOIN vn.itemShelving is2 ON is2.id = iss.itemShelvingFk - JOIN vn.shelving s2 ON s2.code = is2.shelvingFk + JOIN vn.shelving s2 ON s2.id = is2.shelvingFk WHERE t.shipped BETWEEN util.VN_CURDATE() AND util.dayend(util.VN_CURDATE()) AND s2.parked = util.VN_CURDATE() GROUP BY s.itemFk From b97b61c7dd8304193e5af7a279c9d62270ed9de5 Mon Sep 17 00:00:00 2001 From: robert Date: Wed, 4 Dec 2024 09:40:28 +0100 Subject: [PATCH 017/123] feat: refs #6822 fix --- db/routines/vn/procedures/entry_transfer.sql | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/db/routines/vn/procedures/entry_transfer.sql b/db/routines/vn/procedures/entry_transfer.sql index 7943f738f..1aa2841ce 100644 --- a/db/routines/vn/procedures/entry_transfer.sql +++ b/db/routines/vn/procedures/entry_transfer.sql @@ -36,9 +36,9 @@ BEGIN INTO vWarehouseInFk,vWarehouseOutFk, vRef,vIsReceived, vAgencyModeFk FROM travel t JOIN entry e ON e.travelFk = t.id - WHERE e.id = 1; + WHERE e.id = vOriginalEntry; - SELECT t.di INTO vNewTravelFk + SELECT t.id INTO vNewTravelFk FROM travel t JOIN entry e ON e.travelFk = t.id WHERE t.shipped = util.VN_CURDATE() @@ -49,7 +49,7 @@ BEGIN AND isReceived =vIsReceived AND agencyModeFk = vAgencyModeFk; - IF NOT vNewTravelFk THEN + IF vNewTravelFk IS NULL THEN INSERT INTO travel( shipped, landed, @@ -113,7 +113,7 @@ BEGIN JOIN vn.parking p ON p.id = sh.parkingFk JOIN vn.sector s ON s.id = p.sectorFk WHERE s.warehouseFk = vWarehouseFk - AND sh.parked = util.VN_CURDATE() + AND sh.parked BETWEEN CURDATE() AND util.dayend(CURDATE()) GROUP BY ish.itemFk ), sales AS ( @@ -124,7 +124,7 @@ BEGIN JOIN vn.itemShelving is2 ON is2.id = iss.itemShelvingFk JOIN vn.shelving s2 ON s2.id = is2.shelvingFk WHERE t.shipped BETWEEN util.VN_CURDATE() AND util.dayend(util.VN_CURDATE()) - AND s2.parked = util.VN_CURDATE() + AND s2.parked BETWEEN CURDATE() AND util.dayend(CURDATE()) GROUP BY s.itemFk ) SELECT tmp.itemFk, @@ -134,7 +134,7 @@ BEGIN FROM tBuy tmp LEFT JOIN itemShelvings iss ON tmp.itemFk = iss.itemFk LEFT JOIN sales s ON s.itemFk = tmp.itemFk - WHERE visible = tmp.totalQuantity + WHERE visible < tmp.totalQuantity OR iss.itemFk IS NULL; UPDATE buy b From 6ac30dcb0c11bf1e9289460c875569a8cb4dcde2 Mon Sep 17 00:00:00 2001 From: robert Date: Wed, 4 Dec 2024 13:32:10 +0100 Subject: [PATCH 018/123] feat: refs #6822 fix conflict --- db/routines/vn/procedures/entry_transfer.sql | 7 ++++--- modules/entry/back/models/entry.js | 1 - 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/db/routines/vn/procedures/entry_transfer.sql b/db/routines/vn/procedures/entry_transfer.sql index 1aa2841ce..6e9607691 100644 --- a/db/routines/vn/procedures/entry_transfer.sql +++ b/db/routines/vn/procedures/entry_transfer.sql @@ -75,7 +75,8 @@ BEGIN END IF; UPDATE entry - SET travelFk = vTravelFk + SET travelFk = vTravelFk, + evaNotes = vOriginalEntry WHERE id = vNewEntryFk; -- Poner a 0 las cantidades @@ -113,7 +114,7 @@ BEGIN JOIN vn.parking p ON p.id = sh.parkingFk JOIN vn.sector s ON s.id = p.sectorFk WHERE s.warehouseFk = vWarehouseFk - AND sh.parked BETWEEN CURDATE() AND util.dayend(CURDATE()) + AND sh.parked >= util.VN_CURDATE() GROUP BY ish.itemFk ), sales AS ( @@ -124,7 +125,7 @@ BEGIN JOIN vn.itemShelving is2 ON is2.id = iss.itemShelvingFk JOIN vn.shelving s2 ON s2.id = is2.shelvingFk WHERE t.shipped BETWEEN util.VN_CURDATE() AND util.dayend(util.VN_CURDATE()) - AND s2.parked BETWEEN CURDATE() AND util.dayend(CURDATE()) + AND s2.parked >= util.VN_CURDATE() GROUP BY s.itemFk ) SELECT tmp.itemFk, diff --git a/modules/entry/back/models/entry.js b/modules/entry/back/models/entry.js index 56ff69bf5..03cbd6e7f 100644 --- a/modules/entry/back/models/entry.js +++ b/modules/entry/back/models/entry.js @@ -13,7 +13,6 @@ module.exports = Self => { require('../methods/entry/addFromBuy')(Self); require('../methods/entry/buyLabel')(Self); require('../methods/entry/transfer')(Self); - require('../methods/entry/print')(Self); require('../methods/entry/labelSupplier')(Self); require('../methods/entry/buyLabelSupplier')(Self); From 43bbdfd4215a308e4f41fc1815ae403d1b2f48a2 Mon Sep 17 00:00:00 2001 From: robert Date: Wed, 11 Dec 2024 11:54:40 +0100 Subject: [PATCH 019/123] feat: refs #6822 --- db/routines/vn/procedures/entry_transfer.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/db/routines/vn/procedures/entry_transfer.sql b/db/routines/vn/procedures/entry_transfer.sql index 6e9607691..98ddf3ef5 100644 --- a/db/routines/vn/procedures/entry_transfer.sql +++ b/db/routines/vn/procedures/entry_transfer.sql @@ -113,6 +113,8 @@ BEGIN JOIN vn.shelving sh ON sh.id = ish.shelvingFk JOIN vn.parking p ON p.id = sh.parkingFk JOIN vn.sector s ON s.id = p.sectorFk + JOIN vn.buy b ON b.id = ish.buyFk + JOIN vn.entry e ON e.id = b.entryFk WHERE s.warehouseFk = vWarehouseFk AND sh.parked >= util.VN_CURDATE() GROUP BY ish.itemFk From 31a6db5da0cc02f9062e17bb2a07f59632e1abbb Mon Sep 17 00:00:00 2001 From: sergiodt Date: Thu, 12 Dec 2024 20:30:38 +0100 Subject: [PATCH 020/123] feat: refs #7569 refs#7569 sendMail --- loopback/locale/en.json | 8 +-- loopback/locale/es.json | 13 ++--- loopback/locale/fr.json | 12 +++-- loopback/locale/pt.json | 6 ++- .../ticket/back/methods/ticket/saveSign.js | 52 ++++++++++++++++++- .../methods/ticket/specs/saveSign.spec.js | 42 +++++++++++++++ 6 files changed, 116 insertions(+), 17 deletions(-) diff --git a/loopback/locale/en.json b/loopback/locale/en.json index 7372ac9a6..f5c27726b 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -246,6 +246,8 @@ "ticketLostExpedition": "The ticket [{{ticketId}}]({{{ticketUrl}}}) has the following lost expedition:{{ expeditionId }}", "The raid information is not correct": "The raid information is not correct", "Payment method is required": "Payment method is required", - "Sales already moved": "Sales already moved", - "Holidays to past days not available": "Holidays to past days not available" -} + "Sales already moved": "Sales already moved", + "Holidays to past days not available": "Holidays to past days not available", + "Incorrect delivery order alert on route": "Incorrect delivery order alert on route: {{ route }} zone: {{ zone }}", + "Ticket has been delivered out of order": "The ticket {{ ticket }} ({{ fullUrl }}) has been delivered out of order. Tickets that have not been delivered in their route are: {{ ticketsToMail }}" +} \ No newline at end of file diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 0dc8e53a8..2a93407fc 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -388,10 +388,11 @@ "You do not have permission to modify the booked field": "No tienes permisos para modificar el campo contabilizada", "ticketLostExpedition": "El ticket [{{ticketId}}]({{{ticketUrl}}}) tiene la siguiente expedición perdida:{{ expeditionId }}", "The web user's email already exists": "El correo del usuario web ya existe", - "Sales already moved": "Ya han sido transferidas", - "The raid information is not correct": "La información de la redada no es correcta", - "There are tickets to be invoiced": "Hay tickets para esta zona, borralos primero", + "Sales already moved": "Ya han sido transferidas", + "The raid information is not correct": "La información de la redada no es correcta", + "There are tickets to be invoiced": "Hay tickets para esta zona, borralos primero", "An item type with the same code already exists": "Un tipo con el mismo código ya existe", - "Holidays to past days not available": "Las vacaciones a días pasados no están disponibles" -} - + "Holidays to past days not available": "Las vacaciones a días pasados no están disponibles", + "Incorrect delivery order alert on route": "Alerta de orden de entrega incorrecta en ruta: {{ route }} zona: {{ zone }}", + "Ticket has been delivered out of order": "El ticket {{ ticket }} ({{ fullUrl }}) no ha sigo entregado en su orden. Los tickets de la ruta que no han sido entregados en su orden son: {{ ticketsToMail }}" +} \ No newline at end of file diff --git a/loopback/locale/fr.json b/loopback/locale/fr.json index 9941358be..719cbf99c 100644 --- a/loopback/locale/fr.json +++ b/loopback/locale/fr.json @@ -362,9 +362,11 @@ "The invoices have been created but the PDFs could not be generated": "La facture a été émise mais le PDF n'a pas pu être généré", "It has been invoiced but the PDF of refund not be generated": "Il a été facturé mais le PDF de remboursement n'a pas été généré", "Cannot send mail": "Impossible d'envoyer le mail", - "Original invoice not found": "Facture originale introuvable", - "The quantity claimed cannot be greater than the quantity of the line": "Le montant réclamé ne peut pas être supérieur au montant de la ligne", - "You do not have permission to modify the booked field": "Vous n'avez pas la permission de modifier le champ comptabilisé", + "Original invoice not found": "Facture originale introuvable", + "The quantity claimed cannot be greater than the quantity of the line": "Le montant réclamé ne peut pas être supérieur au montant de la ligne", + "You do not have permission to modify the booked field": "Vous n'avez pas la permission de modifier le champ comptabilisé", "ticketLostExpedition": "Le ticket [{{ticketId}}]({{{ticketUrl}}}) a l'expédition perdue suivante : {{expeditionId}}", - "The web user's email already exists": "L'email de l'internaute existe déjà" -} + "The web user's email already exists": "L'email de l'internaute existe déjà", + "Incorrect delivery order alert on route": "Alerte de bon de livraison incorrect sur l'itinéraire: {{ route }} zone : {{ zone }}", + "Ticket has been delivered out of order": "Le ticket {{ticket}} ({{fullUrl}}) a été livré hors ordre. Les tickets qui n'ont pas été livrés dans leur itinéraire sont : {{ticketsToMail}}" +} \ No newline at end of file diff --git a/loopback/locale/pt.json b/loopback/locale/pt.json index e84b30f3d..5dfad3725 100644 --- a/loopback/locale/pt.json +++ b/loopback/locale/pt.json @@ -365,5 +365,7 @@ "Cannot send mail": "Não é possível enviar o email", "The quantity claimed cannot be greater than the quantity of the line": "O valor reclamado não pode ser superior ao valor da linha", "ticketLostExpedition": "O ticket [{{ticketId}}]({{{ticketUrl}}}) tem a seguinte expedição perdida: {{expeditionId}}", - "The web user's email already exists": "O e-mail do utilizador da web já existe." -} + "The web user's email already exists": "O e-mail do utilizador da web já existe.", + "Incorrect delivery order alert on route": "Alerta de ordem de entrega incorreta na rota: {{ route }} zona: {{ zone }}", + "Ticket has been delivered out of order": "O ticket {{ ticket }} ({{ fullUrl }}) foi entregue fora de ordem. Os tickets que não foram entregues na sua rota são: {{ ticketsToMail }}" +} \ No newline at end of file diff --git a/modules/ticket/back/methods/ticket/saveSign.js b/modules/ticket/back/methods/ticket/saveSign.js index ac2a7bc66..eeb753614 100644 --- a/modules/ticket/back/methods/ticket/saveSign.js +++ b/modules/ticket/back/methods/ticket/saveSign.js @@ -28,7 +28,6 @@ module.exports = Self => { verb: 'POST' } }); - Self.saveSign = async(ctx, tickets, location, signedTime, options) => { const models = Self.app.models; const myOptions = {userId: ctx.req.accessToken.userId}; @@ -111,6 +110,12 @@ module.exports = Self => { scope: { fields: ['id'] } + }, + { + relation: 'zone', + scope: { + fields: ['id', 'zoneFk,', 'name'] + } }] }, myOptions); @@ -151,6 +156,29 @@ module.exports = Self => { await Self.rawSql(`CALL vn.ticket_setState(?, ?)`, [ticketId, stateCode], myOptions); + if (stateCode == 'DELIVERED' && ticket.priority) { + const orderState = await models.State.findOne({ + where: {code: 'DELIVERED'}, + fields: ['id'] + }, myOptions); + + const ticketsToMail = await Self.rawSql(` + SELECT t.id + FROM ticket t + JOIN ticketState ts ON ts.ticketFk = t.id + JOIN state s ON s.code = ts.code + WHERE t.routeFk = ? + AND s.\`order\` < ? + AND priority <(SELECT t.priority + FROM ticket t + WHERE t.id = ?)` + , [ticket.routeFk, orderState.id, ticket.id], myOptions); + const ticketIds = ticketsToMail.map(row => row.id); + + if (ticketsToMail) + await sendMail(ctx, ticket.routeFk, ticket.id, ticket.zone().name, ticketIds); + } + if (ticket?.address()?.province()?.country()?.code != 'ES' && ticket.$cmrFk) { await models.Ticket.saveCmr(ctx, [ticketId], myOptions); externalTickets.push(ticketId); @@ -163,4 +191,26 @@ module.exports = Self => { } await models.Ticket.sendCmrEmail(ctx, externalTickets); }; + + async function sendMail(ctx, route, ticket, zoneName, ticketsToMail) { + const $t = ctx.req.__; + const url = await Self.app.models.Url.getUrl(); + const sendTo = 'repartos@verdnatura.es'; + const fullUrl = `${url}route/${route}/summary`; + const emailSubject = $t('Incorrect delivery order alert on route', { + route: route, + zone: zoneName + }); + const emailBody = $t('Ticket has been delivered out of order', { + ticket: ticket, + fullUrl: fullUrl, + ticketsToMail: ticketsToMail, + }, {escape: false}); + + await Self.app.models.Mail.create({ + receiver: sendTo, + subject: emailSubject, + body: emailBody + }); + } }; diff --git a/modules/ticket/back/methods/ticket/specs/saveSign.spec.js b/modules/ticket/back/methods/ticket/specs/saveSign.spec.js index e93408973..559c413e5 100644 --- a/modules/ticket/back/methods/ticket/specs/saveSign.spec.js +++ b/modules/ticket/back/methods/ticket/specs/saveSign.spec.js @@ -51,4 +51,46 @@ describe('Ticket saveSign()', () => { expect(ticketTrackingAfter.name).toBe('Entregado en parte'); }); + + fit('should send an email to notify that the delivery order is not correct', async() => { + const tx = await models.Ticket.beginTransaction({}); + const ticketFk = 8; + const priority = 5; + const stateFk = 10; + const stateTicketFk = 2; + const expeditionFk = 11; + const expeditionStateFK = 2; + + let mailCountBefore; + let mailCountAfter; + spyOn(models.Dms, 'uploadFile').and.returnValue([{id: 1}]); + + const options = {transaction: tx}; + const tickets = [ticketFk]; + + const expedition = await models.Expedition.findById(expeditionFk, null, options); + expedition.updateAttribute('stateTypeFk', expeditionStateFK, options); + + const ticket = await models.Ticket.findById(ticketFk, null, options); + ticket.updateAttribute('priority', priority, options); + + const filter = {where: { + ticketFk: ticketFk, + stateFk: stateTicketFk} + }; + try { + const ticketTracking = await models.TicketTracking.findOne(filter, options); + ticketTracking.updateAttribute('stateFk', stateFk, options); + mailCountBefore = await models.Mail.count(options); + await models.Ticket.saveSign(ctx, tickets, null, null, options); + mailCountAfter = await models.Mail.count(options); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + + expect(mailCountAfter).toBeGreaterThan(mailCountBefore); + }); }); From 2c672951c6428f27958ee850f11093db08748c5e Mon Sep 17 00:00:00 2001 From: sergiodt Date: Thu, 12 Dec 2024 20:33:00 +0100 Subject: [PATCH 021/123] fix: refs #7569 refs#8188 add IfNotExists --- modules/ticket/back/methods/ticket/saveSign.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ticket/back/methods/ticket/saveSign.js b/modules/ticket/back/methods/ticket/saveSign.js index eeb753614..6dc90e330 100644 --- a/modules/ticket/back/methods/ticket/saveSign.js +++ b/modules/ticket/back/methods/ticket/saveSign.js @@ -205,7 +205,7 @@ module.exports = Self => { ticket: ticket, fullUrl: fullUrl, ticketsToMail: ticketsToMail, - }, {escape: false}); + }); await Self.app.models.Mail.create({ receiver: sendTo, From ab1eed66df04760db013af5f2f4fc832a8dcd647 Mon Sep 17 00:00:00 2001 From: robert Date: Fri, 13 Dec 2024 12:29:03 +0100 Subject: [PATCH 022/123] feat: refs #6822 changes required --- db/routines/vn/procedures/entry_transfer.sql | 21 ++++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/db/routines/vn/procedures/entry_transfer.sql b/db/routines/vn/procedures/entry_transfer.sql index 98ddf3ef5..c368e1e55 100644 --- a/db/routines/vn/procedures/entry_transfer.sql +++ b/db/routines/vn/procedures/entry_transfer.sql @@ -18,7 +18,7 @@ BEGIN DECLARE vRef INT; DECLARE vIsReceived INT; DECLARE vAgencyModeFk INT; - DECLARE vNewTravelFk INT; + DECLARE vTomorrow DATETIME DEFAULT util.tomorrow(); DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN @@ -32,24 +32,23 @@ BEGIN START TRANSACTION; -- Hay que crear un nuevo travel, con salida hoy y llegada mañana y asignar la entrada nueva al nuevo travel. - SELECT warehouseInFk,warehouseOutFk,`ref`,isReceived ,agencyModeFk - INTO vWarehouseInFk,vWarehouseOutFk, vRef,vIsReceived, vAgencyModeFk + SELECT t.warehouseInFk, t.warehouseOutFk, t.`ref`, t.isReceived, t.agencyModeFk + INTO vWarehouseInFk, vWarehouseOutFk, vRef, vIsReceived, vAgencyModeFk FROM travel t JOIN entry e ON e.travelFk = t.id WHERE e.id = vOriginalEntry; - SELECT t.id INTO vNewTravelFk + SELECT id INTO vTravelFk FROM travel t - JOIN entry e ON e.travelFk = t.id - WHERE t.shipped = util.VN_CURDATE() - AND t.landed = util.VN_CURDATE() + INTERVAL 1 DAY + WHERE shipped = util.VN_CURDATE() + AND landed = vTomorrow AND warehouseInFk = vWarehouseInFk AND warehouseOutFk = vWarehouseOutFk AND `ref` = vRef AND isReceived =vIsReceived AND agencyModeFk = vAgencyModeFk; - IF vNewTravelFk IS NULL THEN + IF vTravelFk IS NULL THEN INSERT INTO travel( shipped, landed, @@ -59,7 +58,7 @@ BEGIN isReceived, agencyModeFk) SELECT util.VN_CURDATE(), - util.VN_CURDATE() + INTERVAL 1 DAY, + vTomorrow, t.warehouseInFk, t.warehouseOutFk, t.`ref`, @@ -70,8 +69,6 @@ BEGIN WHERE e.id = vOriginalEntry; SET vTravelFk = LAST_INSERT_ID(); - ELSE - SET vTravelFk = vNewTravelFk; END IF; UPDATE entry @@ -115,6 +112,7 @@ BEGIN JOIN vn.sector s ON s.id = p.sectorFk JOIN vn.buy b ON b.id = ish.buyFk JOIN vn.entry e ON e.id = b.entryFk + JOIN tBuy t ON t.itemFk = ish.itemFk WHERE s.warehouseFk = vWarehouseFk AND sh.parked >= util.VN_CURDATE() GROUP BY ish.itemFk @@ -126,6 +124,7 @@ BEGIN JOIN vn.itemShelvingSale iss ON iss.saleFk = s.id JOIN vn.itemShelving is2 ON is2.id = iss.itemShelvingFk JOIN vn.shelving s2 ON s2.id = is2.shelvingFk + JOIN tBuy t ON t.itemFk = s.itemFk WHERE t.shipped BETWEEN util.VN_CURDATE() AND util.dayend(util.VN_CURDATE()) AND s2.parked >= util.VN_CURDATE() GROUP BY s.itemFk From 781a8a4d105c88edfd5b5395f4a169b189add6d6 Mon Sep 17 00:00:00 2001 From: guillermo Date: Fri, 13 Dec 2024 13:49:35 +0100 Subject: [PATCH 023/123] refactor: refs #8205 Added geoFk Fk --- db/versions/11383-maroonChico/00-town.sql | 10 ++++++++++ db/versions/11383-maroonChico/01-postCode.sql | 10 ++++++++++ db/versions/11383-maroonChico/02-province.sql | 10 ++++++++++ 3 files changed, 30 insertions(+) create mode 100644 db/versions/11383-maroonChico/00-town.sql create mode 100644 db/versions/11383-maroonChico/01-postCode.sql create mode 100644 db/versions/11383-maroonChico/02-province.sql diff --git a/db/versions/11383-maroonChico/00-town.sql b/db/versions/11383-maroonChico/00-town.sql new file mode 100644 index 000000000..8fdd8c7b0 --- /dev/null +++ b/db/versions/11383-maroonChico/00-town.sql @@ -0,0 +1,10 @@ +UPDATE vn.town t + LEFT JOIN vn.zoneGeo zg ON zg.id = t.geoFk + SET t.geoFk = NULL + WHERE zg.id IS NULL; + +ALTER TABLE vn.town + ADD CONSTRAINT town_zoneGeo_FK FOREIGN KEY (geoFk) + REFERENCES vn.zoneGeo(id) + ON DELETE RESTRICT + ON UPDATE CASCADE; diff --git a/db/versions/11383-maroonChico/01-postCode.sql b/db/versions/11383-maroonChico/01-postCode.sql new file mode 100644 index 000000000..668cf69cb --- /dev/null +++ b/db/versions/11383-maroonChico/01-postCode.sql @@ -0,0 +1,10 @@ +UPDATE vn.postCode pc + LEFT JOIN vn.zoneGeo zg ON zg.id = pc.geoFk + SET pc.geoFk = NULL + WHERE zg.id IS NULL; + +ALTER TABLE vn.postCode + ADD CONSTRAINT postCode_zoneGeo_FK FOREIGN KEY (geoFk) + REFERENCES vn.zoneGeo(id) + ON DELETE RESTRICT + ON UPDATE CASCADE; diff --git a/db/versions/11383-maroonChico/02-province.sql b/db/versions/11383-maroonChico/02-province.sql new file mode 100644 index 000000000..c16d33cd8 --- /dev/null +++ b/db/versions/11383-maroonChico/02-province.sql @@ -0,0 +1,10 @@ +UPDATE vn.province p + LEFT JOIN vn.zoneGeo zg ON zg.id = p.geoFk + SET p.geoFk = NULL + WHERE zg.id IS NULL; + +ALTER TABLE vn.province + ADD CONSTRAINT province_zoneGeo_FK FOREIGN KEY (geoFk) + REFERENCES vn.zoneGeo(id) + ON DELETE RESTRICT + ON UPDATE CASCADE; From 1d7e69cb25f809ca2d26c1fa2e90facff815cbc4 Mon Sep 17 00:00:00 2001 From: robert Date: Mon, 16 Dec 2024 07:40:49 +0100 Subject: [PATCH 024/123] feat: refs #7584 workerTimeControl_afterDelete --- .../vn/triggers/workerTimeControl_afterDelete.sql | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/db/routines/vn/triggers/workerTimeControl_afterDelete.sql b/db/routines/vn/triggers/workerTimeControl_afterDelete.sql index 27432fccb..762754591 100644 --- a/db/routines/vn/triggers/workerTimeControl_afterDelete.sql +++ b/db/routines/vn/triggers/workerTimeControl_afterDelete.sql @@ -3,10 +3,12 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`workerTimeControl_after AFTER DELETE ON `workerTimeControl` FOR EACH ROW BEGIN - INSERT INTO workerLog - SET `action` = 'delete', - `changedModel` = 'WorkerTimeControl', - `changedModelId` = OLD.id, - `userFk` = account.myUser_getId(); + IF account.myUser_getId() THEN + INSERT INTO workerLog + SET `action` = 'delete', + `changedModel` = 'WorkerTimeControl', + `changedModelId` = OLD.id, + `userFk` = account.myUser_getId(); + END IF; END$$ DELIMITER ; From 48d2d1d3271eb6d92ef8cda0979e38daed999e30 Mon Sep 17 00:00:00 2001 From: jtubau Date: Thu, 26 Dec 2024 10:41:20 +0100 Subject: [PATCH 025/123] feat: refs #8117 add worker first and last name to item type query --- modules/ticket/back/methods/ticket-request/getItemTypeWorker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ticket/back/methods/ticket-request/getItemTypeWorker.js b/modules/ticket/back/methods/ticket-request/getItemTypeWorker.js index f160cfaac..2f2a85abb 100644 --- a/modules/ticket/back/methods/ticket-request/getItemTypeWorker.js +++ b/modules/ticket/back/methods/ticket-request/getItemTypeWorker.js @@ -30,7 +30,7 @@ module.exports = Self => { Object.assign(myOptions, options); const query = - `SELECT DISTINCT u.id, u.nickname + `SELECT DISTINCT u.id, u.nickname, w.firstName, w.lastName FROM itemType it JOIN worker w ON w.id = it.workerFk JOIN account.user u ON u.id = w.id`; From 02d77324b170271d88231a57334eadd6a7eebd26 Mon Sep 17 00:00:00 2001 From: robert Date: Fri, 3 Jan 2025 08:27:34 +0100 Subject: [PATCH 026/123] feat: refs #6822 crear test --- db/routines/vn/procedures/entry_transfer.sql | 16 ++++------ .../back/methods/entry/specs/transfer.spec.js | 30 +++++++++++++++++++ modules/entry/back/methods/entry/transfer.js | 2 +- 3 files changed, 36 insertions(+), 12 deletions(-) create mode 100644 modules/entry/back/methods/entry/specs/transfer.spec.js diff --git a/db/routines/vn/procedures/entry_transfer.sql b/db/routines/vn/procedures/entry_transfer.sql index c368e1e55..63f3f14ab 100644 --- a/db/routines/vn/procedures/entry_transfer.sql +++ b/db/routines/vn/procedures/entry_transfer.sql @@ -1,7 +1,7 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`entry_transfer`( vOriginalEntry INT, - OUT vNewEntry INT + OUT vNewEntryFk INT ) BEGIN /** @@ -10,7 +10,6 @@ BEGIN * @param vOriginalEntry entrada que se quiera adelantar * @param vNewEntry nueva entrada creada */ - DECLARE vNewEntryFk INT; DECLARE vTravelFk INT; DECLARE vWarehouseFk INT; DECLARE vWarehouseInFk INT; @@ -97,7 +96,7 @@ BEGIN WHERE e.id = vOriginalEntry; -- Actualizar la nueva entrada con lo que no está ubicado HOY, descontando lo vendido HOY de esas ubicaciones - CREATE OR REPLACE TEMPORARY TABLE tBuy + CREATE OR REPLACE TEMPORARY TABLE buys WITH tBuy AS ( SELECT b.itemFk, SUM(b.quantity) totalQuantity FROM vn.buy b @@ -105,7 +104,7 @@ BEGIN GROUP BY b.itemFk ), itemShelvings AS ( - SELECT ish.itemFk, SUM(visible) visible + SELECT ish.itemFk, SUM(ish.visible) visible FROM vn.itemShelving ish JOIN vn.shelving sh ON sh.id = ish.shelvingFk JOIN vn.parking p ON p.id = sh.parkingFk @@ -140,20 +139,15 @@ BEGIN OR iss.itemFk IS NULL; UPDATE buy b - JOIN tBuy tmp ON tmp.itemFk = b.itemFk + JOIN buys tmp ON tmp.itemFk = b.itemFk SET b.quantity = tmp.totalQuantity - tmp.visible - tmp.sold WHERE b.entryFk = vNewEntryFk; -- Limpia la nueva entrada - DELETE b - FROM buy b - WHERE b.entryFk = vNewEntryFk - AND b.quantity = 0; + DELETE FROM buy WHERE entryFk = vNewEntryFk AND quantity = 0; COMMIT; - SET vNewEntry = vNewEntryFk; - CALL cache.visible_refresh(@c,TRUE,vWarehouseFk); CALL cache.available_refresh(@c, TRUE, vWarehouseFk, util.VN_CURDATE()); END$$ diff --git a/modules/entry/back/methods/entry/specs/transfer.spec.js b/modules/entry/back/methods/entry/specs/transfer.spec.js new file mode 100644 index 000000000..3a223a335 --- /dev/null +++ b/modules/entry/back/methods/entry/specs/transfer.spec.js @@ -0,0 +1,30 @@ +const transfer = require('../transfer'); + +const models = require('vn-loopback/server/server').models; + +describe('Transfer merchandise from one entry to the next day()', () => { + const ctx = {req: {accessToken: {userId: 18}}}; + + it('should Transfer buys not located', async() => { + const id = 3; + const item = 8; + const buy = 6; + const originalEntry = 4; + + const tx = await models.ItemShelving.beginTransaction({}); + const options = {transaction: tx}; + try { + const currentItemShelving = await models.ItemShelving.findOne({where: {id}}, options); + await currentItemShelving.updateAttributes({itemFk: item, buyFk: buy}, options); + const result = await models.Entry.transfer(ctx, originalEntry, options); + const buys = await models.Buy.find({where: {entryFk: result[0].newEntryFk}}, options); + + expect(buys.length).toEqual(3); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); +}); diff --git a/modules/entry/back/methods/entry/transfer.js b/modules/entry/back/methods/entry/transfer.js index 425fc6af1..1c5f38c21 100644 --- a/modules/entry/back/methods/entry/transfer.js +++ b/modules/entry/back/methods/entry/transfer.js @@ -1,6 +1,6 @@ module.exports = Self => { Self.remoteMethodCtx('transfer', { - description: 'Trasladar la mercancia de una entrada al dia siguiente', + description: 'Transfer merchandise from one entry to the next day', accepts: [ { arg: 'id', From 04734ac55c5bf0bef6481ea3448b0609fd51fb11 Mon Sep 17 00:00:00 2001 From: robert Date: Tue, 7 Jan 2025 08:59:47 +0100 Subject: [PATCH 027/123] feat: refs #6822 test transfer --- .../back/methods/entry/specs/transfer.spec.js | 40 +++++++++++++------ modules/entry/back/models/buy.json | 7 +++- modules/item/back/models/item-shelving.json | 9 ++++- 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/modules/entry/back/methods/entry/specs/transfer.spec.js b/modules/entry/back/methods/entry/specs/transfer.spec.js index 3a223a335..3efd081d7 100644 --- a/modules/entry/back/methods/entry/specs/transfer.spec.js +++ b/modules/entry/back/methods/entry/specs/transfer.spec.js @@ -1,25 +1,41 @@ -const transfer = require('../transfer'); +// const transfer = require('../transfer'); const models = require('vn-loopback/server/server').models; describe('Transfer merchandise from one entry to the next day()', () => { - const ctx = {req: {accessToken: {userId: 18}}}; - - it('should Transfer buys not located', async() => { - const id = 3; - const item = 8; - const buy = 6; - const originalEntry = 4; - + fit('should Transfer buys not located', async() => { const tx = await models.ItemShelving.beginTransaction({}); const options = {transaction: tx}; + try { + const id = 3; + const item = 8; + const buy = 6; + const originalEntry = 4; + const ctx = {req: {accessToken: {userId: 48}}}; + const currentItemShelving = await models.ItemShelving.findOne({where: {id}}, options); await currentItemShelving.updateAttributes({itemFk: item, buyFk: buy}, options); - const result = await models.Entry.transfer(ctx, originalEntry, options); - const buys = await models.Buy.find({where: {entryFk: result[0].newEntryFk}}, options); - expect(buys.length).toEqual(3); + const result = await models.Entry.transfer(ctx, originalEntry, options); + + const originalEntrybuys = await models.Buy.find({where: {entryFk: originalEntry}}, options); + + const newEntrybuys = await models.Buy.find({where: {entryFk: result[0].newEntryFk}}, options); + + const itemShelvingsWithBuys = await models.Buy.find({ + include: { + relation: 'itemShelving', + scope: { + fields: ['id'], + }, + }, + where: {entryFk: originalEntry}, + }, options); + + const hasItemShelving = await itemShelvingsWithBuys.filter(buy => buy.itemShelving().length); + + expect(newEntrybuys.length).toEqual(originalEntrybuys.length - hasItemShelving.length); await tx.rollback(); } catch (e) { diff --git a/modules/entry/back/models/buy.json b/modules/entry/back/models/buy.json index 14cafde06..cd1e54de7 100644 --- a/modules/entry/back/models/buy.json +++ b/modules/entry/back/models/buy.json @@ -114,6 +114,11 @@ "type": "belongsTo", "model": "Delivery", "foreignKey": "deliveryFk" - } + }, + "itemShelving": { + "type": "hasMany", + "model": "ItemShelving", + "foreignKey": "buyFk" + } } } diff --git a/modules/item/back/models/item-shelving.json b/modules/item/back/models/item-shelving.json index 483d6bf3d..5c31e9e4e 100644 --- a/modules/item/back/models/item-shelving.json +++ b/modules/item/back/models/item-shelving.json @@ -61,6 +61,11 @@ "type": "belongsTo", "model": "Shelving", "foreignKey": "shelvingFk" - } + }, + "buy": { + "type": "belongsTo", + "model": "Buy", + "foreignKey": "buyFk" + } } -} \ No newline at end of file +} From b7658f5814a98ba5aa06ca6ed50ac18c9741074e Mon Sep 17 00:00:00 2001 From: robert Date: Tue, 7 Jan 2025 09:28:17 +0100 Subject: [PATCH 028/123] feat: refs #6822 fix test --- modules/entry/back/methods/entry/specs/transfer.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/entry/back/methods/entry/specs/transfer.spec.js b/modules/entry/back/methods/entry/specs/transfer.spec.js index 3efd081d7..e4f4747c6 100644 --- a/modules/entry/back/methods/entry/specs/transfer.spec.js +++ b/modules/entry/back/methods/entry/specs/transfer.spec.js @@ -3,7 +3,7 @@ const models = require('vn-loopback/server/server').models; describe('Transfer merchandise from one entry to the next day()', () => { - fit('should Transfer buys not located', async() => { + it('should Transfer buys not located', async() => { const tx = await models.ItemShelving.beginTransaction({}); const options = {transaction: tx}; From ebf234dd4fbeca5c484bf2653ae6ab96e2213053 Mon Sep 17 00:00:00 2001 From: robert Date: Tue, 7 Jan 2025 09:49:55 +0100 Subject: [PATCH 029/123] feat: refs #6822 delete fixtures to test --- modules/entry/back/methods/entry/specs/transfer.spec.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/entry/back/methods/entry/specs/transfer.spec.js b/modules/entry/back/methods/entry/specs/transfer.spec.js index e4f4747c6..0ab35e4a3 100644 --- a/modules/entry/back/methods/entry/specs/transfer.spec.js +++ b/modules/entry/back/methods/entry/specs/transfer.spec.js @@ -23,6 +23,8 @@ describe('Transfer merchandise from one entry to the next day()', () => { const newEntrybuys = await models.Buy.find({where: {entryFk: result[0].newEntryFk}}, options); + const newTravel = await models.Entry.find({where: {id: result[0].newEntryFk}}, options); + const itemShelvingsWithBuys = await models.Buy.find({ include: { relation: 'itemShelving', @@ -37,6 +39,9 @@ describe('Transfer merchandise from one entry to the next day()', () => { expect(newEntrybuys.length).toEqual(originalEntrybuys.length - hasItemShelving.length); + await models.Travel.destroyById(newTravel, options); + await models.Entry.destroyById(result[0].newEntryFk, options); + await tx.rollback(); } catch (e) { await tx.rollback(); From 73d5d508cef2567ccbcfbf7796e45ad77fcd6c8d Mon Sep 17 00:00:00 2001 From: jgallego Date: Tue, 7 Jan 2025 10:45:51 +0100 Subject: [PATCH 030/123] test: refs #8361 enhance exchangeRateUpdate specs with additional scenarios --- .../methods/invoice-in/exchangeRateUpdate.js | 134 +++++++++++----- .../specs/exchangeRateUpdate.spec.js | 148 ++++++++++++++---- 2 files changed, 217 insertions(+), 65 deletions(-) diff --git a/modules/invoiceIn/back/methods/invoice-in/exchangeRateUpdate.js b/modules/invoiceIn/back/methods/invoice-in/exchangeRateUpdate.js index 989b1d4a2..b5a081fc6 100644 --- a/modules/invoiceIn/back/methods/invoice-in/exchangeRateUpdate.js +++ b/modules/invoiceIn/back/methods/invoice-in/exchangeRateUpdate.js @@ -13,66 +13,126 @@ module.exports = Self => { } }); - Self.exchangeRateUpdate = async() => { - const response = await axios.get('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml'); - const xmlData = response.data; - - const doc = new DOMParser({errorHandler: {warning: () => {}}})?.parseFromString(xmlData, 'text/xml'); - const cubes = doc?.getElementsByTagName('Cube'); - if (!cubes || cubes.length === 0) - throw new UserError('No cubes found. Exiting the method.'); - + Self.exchangeRateUpdate = async(options = {}) => { const models = Self.app.models; + const myOptions = {}; + Object.assign(myOptions, options); - const maxDateRecord = await models.ReferenceRate.findOne({order: 'dated DESC'}); + let createdTx = false; + if (!myOptions.transaction) { + myOptions.transaction = await Self.beginTransaction({}); + createdTx = true; + } - const maxDate = maxDateRecord?.dated ? new Date(maxDateRecord.dated) : null; + try { + const response = await axios.get('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml'); + const xmlData = response.data; - for (const cube of Array.from(cubes)) { - if (cube.nodeType === doc.ELEMENT_NODE && cube.attributes.getNamedItem('time')) { - const xmlDate = new Date(cube.getAttribute('time')); - const xmlDateWithoutTime = new Date(xmlDate.getFullYear(), xmlDate.getMonth(), xmlDate.getDate()); - if (!maxDate || maxDate < xmlDateWithoutTime) { + const doc = new DOMParser({errorHandler: {warning: () => {}}}) + .parseFromString(xmlData, 'text/xml'); + const cubes = doc?.getElementsByTagName('Cube'); + if (!cubes || cubes.length === 0) + throw new UserError('No cubes found. Exiting the method.'); + + const maxDateRecord = await models.ReferenceRate.findOne({order: 'dated DESC'}, myOptions); + const maxDate = maxDateRecord?.dated ? new Date(maxDateRecord.dated) : null; + let lastProcessedDate = maxDate; + + for (const cube of Array.from(cubes)) { + if (cube.nodeType === doc.ELEMENT_NODE && cube.attributes.getNamedItem('time')) { + const xmlDate = new Date(cube.getAttribute('time')); + const xmlDateWithoutTime = new Date( + xmlDate.getFullYear(), + xmlDate.getMonth(), + xmlDate.getDate() + ); + + if (!maxDate || xmlDateWithoutTime > maxDate) { + if (lastProcessedDate && xmlDateWithoutTime > lastProcessedDate) { + for (const code of ['USD', 'CNY', 'GBP']) { + const currency = await models.Currency.findOne( + {where: {code}}, + myOptions + ); + if (!currency) + throw new UserError(`Currency not found for code: ${code}`); + + await fillMissingDates( + models, currency, lastProcessedDate, xmlDateWithoutTime, myOptions + ); + } + } + } for (const rateCube of Array.from(cube.childNodes)) { if (rateCube.nodeType === doc.ELEMENT_NODE) { const currencyCode = rateCube.getAttribute('currency'); const rate = rateCube.getAttribute('rate'); if (['USD', 'CNY', 'GBP'].includes(currencyCode)) { - const currency = await models.Currency.findOne({where: {code: currencyCode}}); - if (!currency) throw new UserError(`Currency not found for code: ${currencyCode}`); + const currency = await models.Currency.findOne( + {where: {code: currencyCode}}, + myOptions + ); + if (!currency) + throw new UserError(`Currency not found for code: ${currencyCode}`); + const existingRate = await models.ReferenceRate.findOne({ - where: {currencyFk: currency.id, dated: xmlDate} - }); + where: {currencyFk: currency.id, dated: xmlDateWithoutTime} + }, myOptions); if (existingRate) { if (existingRate.value !== rate) - await existingRate.updateAttributes({value: rate}); + await existingRate.updateAttributes({value: rate}, myOptions); } else { await models.ReferenceRate.create({ currencyFk: currency.id, - dated: xmlDate, + dated: xmlDateWithoutTime, value: rate - }); - } - const monday = 1; - if (xmlDateWithoutTime.getDay() === monday) { - const saturday = new Date(xmlDateWithoutTime); - saturday.setDate(xmlDateWithoutTime.getDate() - 2); - const sunday = new Date(xmlDateWithoutTime); - sunday.setDate(xmlDateWithoutTime.getDate() - 1); - - for (const date of [saturday, sunday]) { - await models.ReferenceRate.upsertWithWhere( - {currencyFk: currency.id, dated: date}, - {currencyFk: currency.id, dated: date, value: rate} - ); - } + }, myOptions); } } } } + + lastProcessedDate = xmlDateWithoutTime; } } + + if (createdTx) + await myOptions.transaction.commit(); + } catch (error) { + if (createdTx) + await myOptions.transaction.rollback(); + + throw error; } }; + + async function getLastValidRate(models, currencyId, date, myOptions) { + return models.ReferenceRate.findOne({ + where: {currencyFk: currencyId, dated: {lt: date}}, + order: 'dated DESC' + }, myOptions); + } + + async function fillMissingDates(models, currency, startDate, endDate, myOptions) { + const cursor = new Date(startDate); + cursor.setDate(cursor.getDate() + 1); + while (cursor < endDate) { + const existingRate = await models.ReferenceRate.findOne({ + where: {currencyFk: currency.id, dated: cursor} + }, myOptions); + + if (!existingRate) { + const lastValid = await getLastValidRate(models, currency.id, cursor, myOptions); + if (lastValid) { + await models.ReferenceRate.create({ + currencyFk: currency.id, + dated: new Date(cursor), + value: lastValid.value + }, myOptions); + } + } + cursor.setDate(cursor.getDate() + 1); + } + } }; diff --git a/modules/invoiceIn/back/methods/invoice-in/specs/exchangeRateUpdate.spec.js b/modules/invoiceIn/back/methods/invoice-in/specs/exchangeRateUpdate.spec.js index 0fd7ea165..70e7dbad7 100644 --- a/modules/invoiceIn/back/methods/invoice-in/specs/exchangeRateUpdate.spec.js +++ b/modules/invoiceIn/back/methods/invoice-in/specs/exchangeRateUpdate.spec.js @@ -1,52 +1,144 @@ describe('exchangeRateUpdate functionality', function() { const axios = require('axios'); const models = require('vn-loopback/server/server').models; + let tx; let options; - beforeEach(function() { - spyOn(axios, 'get').and.returnValue(Promise.resolve({ - data: ` - - - - - ` - })); + function formatYmd(d) { + const mm = (d.getMonth() + 1).toString().padStart(2, '0'); + const dd = d.getDate().toString().padStart(2, '0'); + return `${d.getFullYear()}-${mm}-${dd}`; + } + + afterEach(async() => { + await tx.rollback(); }); - it('should process XML data and update or create rates in the database', async function() { + beforeEach(async() => { + tx = await models.Sale.beginTransaction({}); + options = {transaction: tx}; + spyOn(axios, 'get').and.returnValue(Promise.resolve({data: ''})); + }); + + it('should process XML data and create rates', async function() { + const d1 = Date.vnNew(); + const d4 = Date.vnNew(); + d4.setDate(d4.getDate() + 1); + const xml = ` + + + + + + + + `; + axios.get.and.returnValue(Promise.resolve({data: xml})); spyOn(models.ReferenceRate, 'findOne').and.returnValue(Promise.resolve(null)); spyOn(models.ReferenceRate, 'create').and.returnValue(Promise.resolve()); + await models.InvoiceIn.exchangeRateUpdate(options); - await models.InvoiceIn.exchangeRateUpdate(); - - expect(models.ReferenceRate.create).toHaveBeenCalledTimes(2); + expect(models.ReferenceRate.create).toHaveBeenCalledTimes(3); }); - it('should not create or update rates when no XML data is available', async function() { + it('should handle no data', async function() { axios.get.and.returnValue(Promise.resolve({})); spyOn(models.ReferenceRate, 'create'); - - let thrownError = null; + let e; try { - await models.InvoiceIn.exchangeRateUpdate(); - } catch (error) { - thrownError = error; + await models.InvoiceIn.exchangeRateUpdate(options); + } catch (err) { + e = err; } - expect(thrownError.message).toBe('No cubes found. Exiting the method.'); + expect(e.message).toBe('No cubes found. Exiting the method.'); + expect(models.ReferenceRate.create).not.toHaveBeenCalled(); }); - it('should handle errors gracefully', async function() { + it('should handle errors', async function() { axios.get.and.returnValue(Promise.reject(new Error('Network error'))); - let error; - + let e; try { - await models.InvoiceIn.exchangeRateUpdate(); - } catch (e) { - error = e; + await models.InvoiceIn.exchangeRateUpdate(options); + } catch (err) { + e = err; } - expect(error).toBeDefined(); - expect(error.message).toBe('Network error'); + expect(e).toBeDefined(); + expect(e.message).toBe('Network error'); + }); + + it('should update existing rate', async function() { + const existingRate = await models.ReferenceRate.findOne({ + order: 'id DESC' + }, options); + + if (!existingRate) return fail('No ReferenceRate records in DB'); + + const currency = await models.Currency.findById(existingRate.currencyFk, null, options); + + const xml = ` + + + + `; + + axios.get.and.returnValue(Promise.resolve({data: xml})); + + await models.InvoiceIn.exchangeRateUpdate(options); + + const updatedRate = await models.ReferenceRate.findById(existingRate.id, null, options); + + expect(updatedRate.value).toBeCloseTo('2.22'); + }); + + it('should not update if same rate', async function() { + const existingRate = await models.ReferenceRate.findOne({order: 'id DESC'}, options); + if (!existingRate) return fail('No existing ReferenceRate in DB'); + + const currency = await models.Currency.findById(existingRate.currencyFk, null, options); + + const oldValue = existingRate.value; + const xml = ` + + + + `; + + axios.get.and.returnValue(Promise.resolve({data: xml})); + + await models.InvoiceIn.exchangeRateUpdate(options); + + const updatedRate = await models.ReferenceRate.findById(existingRate.id, null, options); + + expect(updatedRate.value).toBe(oldValue); + }); + + it('should backfill missing dates', async function() { + const lastRate = await models.ReferenceRate.findOne({order: 'dated DESC'}, options); + if (!lastRate) return fail('No existing ReferenceRate data in DB'); + + const currency = await models.Currency.findById(lastRate.currencyFk, null, options); + + const d1 = new Date(lastRate.dated); + d1.setDate(d1.getDate() + 1); + const d4 = new Date(lastRate.dated); + d4.setDate(d4.getDate() + 4); + + const xml = ` + + + + + + + `; + + axios.get.and.returnValue(Promise.resolve({data: xml})); + + const beforeCount = await models.ReferenceRate.count({}, options); + await models.InvoiceIn.exchangeRateUpdate(options); + const afterCount = await models.ReferenceRate.count({}, options); + + expect(afterCount - beforeCount).toBe(4); }); }); From 786f1fe661a40204831fb8942a7f1734d9e86322 Mon Sep 17 00:00:00 2001 From: jgallego Date: Tue, 7 Jan 2025 11:06:09 +0100 Subject: [PATCH 031/123] test: refs #8361 enhance exchangeRateUpdate specs to validate day1 and day2 entries without backfilling day3 --- .../specs/exchangeRateUpdate.spec.js | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/modules/invoiceIn/back/methods/invoice-in/specs/exchangeRateUpdate.spec.js b/modules/invoiceIn/back/methods/invoice-in/specs/exchangeRateUpdate.spec.js index 70e7dbad7..4b53f65c6 100644 --- a/modules/invoiceIn/back/methods/invoice-in/specs/exchangeRateUpdate.spec.js +++ b/modules/invoiceIn/back/methods/invoice-in/specs/exchangeRateUpdate.spec.js @@ -141,4 +141,50 @@ describe('exchangeRateUpdate functionality', function() { expect(afterCount - beforeCount).toBe(4); }); + + fit('should create entries for day1 and day2 from the feed, and not backfill day3', async function() { + const lastRate = await models.ReferenceRate.findOne({order: 'dated DESC'}, options); + if (!lastRate) return fail('No existing ReferenceRate data in DB'); + + const currency = await models.Currency.findById(lastRate.currencyFk, null, options); + if (!currency) return fail(`No currency for ID ${lastRate.currencyFk}`); + + const day1 = new Date(lastRate.dated); + day1.setDate(day1.getDate() + 1); + + const day2 = new Date(lastRate.dated); + day2.setDate(day2.getDate() + 2); + + const day3 = new Date(lastRate.dated); + day3.setDate(day3.getDate() + 3); + + const xml = ` + + + + + + + `; + + axios.get.and.returnValue(Promise.resolve({data: xml})); + + await models.InvoiceIn.exchangeRateUpdate(options); + + const day3Record = await models.ReferenceRate.findOne({ + where: {currencyFk: currency.id, dated: day3} + }, options); + + expect(day3Record).toBeNull(); + + const day1Record = await models.ReferenceRate.findOne({ + where: {currencyFk: currency.id, dated: day1} + }, options); + const day2Record = await models.ReferenceRate.findOne({ + where: {currencyFk: currency.id, dated: day2} + }, options); + + expect(day1Record.value).toBeCloseTo('1.1'); + expect(day2Record.value).toBeCloseTo('2.2'); + }); }); From c4c9b5640ec50496af87decbcf56bbe14dfd4f50 Mon Sep 17 00:00:00 2001 From: robert Date: Tue, 7 Jan 2025 12:02:32 +0100 Subject: [PATCH 032/123] feat: refs #6822 modify transaction --- db/routines/vn/procedures/entry_clone.sql | 7 ++++--- db/routines/vn/procedures/entry_transfer.sql | 8 +++++--- .../entry/back/methods/entry/specs/transfer.spec.js | 10 +++------- modules/entry/back/methods/entry/transfer.js | 2 +- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/db/routines/vn/procedures/entry_clone.sql b/db/routines/vn/procedures/entry_clone.sql index c7cbf1f7b..511ff4837 100644 --- a/db/routines/vn/procedures/entry_clone.sql +++ b/db/routines/vn/procedures/entry_clone.sql @@ -12,18 +12,19 @@ BEGIN */ DECLARE vNewEntryFk INT; + DECLARE vIsRequiredTx BOOL DEFAULT NOT @@in_transaction; DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN - ROLLBACK; + CALL util.tx_rollback(vIsRequiredTx); RESIGNAL; END; - START TRANSACTION; + CALL util.tx_start(vIsRequiredTx); CALL entry_cloneHeader(vSelf, vNewEntryFk, NULL); CALL entry_copyBuys(vSelf, vNewEntryFk); - COMMIT; + CALL util.tx_commit(vIsRequiredTx); SET vOutputEntryFk = vNewEntryFk; END$$ diff --git a/db/routines/vn/procedures/entry_transfer.sql b/db/routines/vn/procedures/entry_transfer.sql index 63f3f14ab..123470038 100644 --- a/db/routines/vn/procedures/entry_transfer.sql +++ b/db/routines/vn/procedures/entry_transfer.sql @@ -19,16 +19,18 @@ BEGIN DECLARE vAgencyModeFk INT; DECLARE vTomorrow DATETIME DEFAULT util.tomorrow(); + DECLARE vIsRequiredTx BOOL DEFAULT NOT @@in_transaction; DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN - ROLLBACK; + CALL util.tx_rollback(vIsRequiredTx); RESIGNAL; END; -- Clonar la entrada CALL entry_clone(vOriginalEntry, vNewEntryFk); - START TRANSACTION; + CALL util.tx_start(vIsRequiredTx); + -- Hay que crear un nuevo travel, con salida hoy y llegada mañana y asignar la entrada nueva al nuevo travel. SELECT t.warehouseInFk, t.warehouseOutFk, t.`ref`, t.isReceived, t.agencyModeFk @@ -146,7 +148,7 @@ BEGIN -- Limpia la nueva entrada DELETE FROM buy WHERE entryFk = vNewEntryFk AND quantity = 0; - COMMIT; + CALL util.tx_commit(vIsRequiredTx); CALL cache.visible_refresh(@c,TRUE,vWarehouseFk); CALL cache.available_refresh(@c, TRUE, vWarehouseFk, util.VN_CURDATE()); diff --git a/modules/entry/back/methods/entry/specs/transfer.spec.js b/modules/entry/back/methods/entry/specs/transfer.spec.js index 0ab35e4a3..74e89df46 100644 --- a/modules/entry/back/methods/entry/specs/transfer.spec.js +++ b/modules/entry/back/methods/entry/specs/transfer.spec.js @@ -17,13 +17,12 @@ describe('Transfer merchandise from one entry to the next day()', () => { const currentItemShelving = await models.ItemShelving.findOne({where: {id}}, options); await currentItemShelving.updateAttributes({itemFk: item, buyFk: buy}, options); - const result = await models.Entry.transfer(ctx, originalEntry, options); - + const [{newEntryFk}] = await models.Entry.transfer(ctx, originalEntry, options); const originalEntrybuys = await models.Buy.find({where: {entryFk: originalEntry}}, options); - const newEntrybuys = await models.Buy.find({where: {entryFk: result[0].newEntryFk}}, options); + const newEntrybuys = await models.Buy.find({where: {entryFk: newEntryFk}}, options); - const newTravel = await models.Entry.find({where: {id: result[0].newEntryFk}}, options); + await models.Entry.find({where: {id: newEntryFk}}, options); const itemShelvingsWithBuys = await models.Buy.find({ include: { @@ -39,9 +38,6 @@ describe('Transfer merchandise from one entry to the next day()', () => { expect(newEntrybuys.length).toEqual(originalEntrybuys.length - hasItemShelving.length); - await models.Travel.destroyById(newTravel, options); - await models.Entry.destroyById(result[0].newEntryFk, options); - await tx.rollback(); } catch (e) { await tx.rollback(); diff --git a/modules/entry/back/methods/entry/transfer.js b/modules/entry/back/methods/entry/transfer.js index 1c5f38c21..aa4b4c819 100644 --- a/modules/entry/back/methods/entry/transfer.js +++ b/modules/entry/back/methods/entry/transfer.js @@ -33,7 +33,7 @@ module.exports = Self => { try { await Self.rawSql('CALL vn.entry_transfer(?, @vNewEntry)', [id], myOptions); - const newEntryFk = await Self.rawSql('SELECT @vNewEntry newEntryFk', [], myOptions); + const newEntryFk = await Self.rawSql('SELECT @vNewEntry newEntryFk', null, myOptions); if (tx) await tx.commit(); return newEntryFk; From dbd8d816c06a6a0dc066b14baea4333f712e9a81 Mon Sep 17 00:00:00 2001 From: jgallego Date: Tue, 7 Jan 2025 14:53:26 +0100 Subject: [PATCH 033/123] fix: refs #8361 streamline transaction handling in exchangeRateUpdate --- .../methods/invoice-in/exchangeRateUpdate.js | 17 ++++++++--------- .../invoice-in/specs/exchangeRateUpdate.spec.js | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/modules/invoiceIn/back/methods/invoice-in/exchangeRateUpdate.js b/modules/invoiceIn/back/methods/invoice-in/exchangeRateUpdate.js index b5a081fc6..a6bad405f 100644 --- a/modules/invoiceIn/back/methods/invoice-in/exchangeRateUpdate.js +++ b/modules/invoiceIn/back/methods/invoice-in/exchangeRateUpdate.js @@ -16,12 +16,14 @@ module.exports = Self => { Self.exchangeRateUpdate = async(options = {}) => { const models = Self.app.models; const myOptions = {}; - Object.assign(myOptions, options); + let tx; + + if (typeof options == 'object') + Object.assign(myOptions, options); - let createdTx = false; if (!myOptions.transaction) { - myOptions.transaction = await Self.beginTransaction({}); - createdTx = true; + tx = await Self.beginTransaction({}); + myOptions.transaction = tx; } try { @@ -97,12 +99,9 @@ module.exports = Self => { } } - if (createdTx) - await myOptions.transaction.commit(); + if (tx) await tx.commit(); } catch (error) { - if (createdTx) - await myOptions.transaction.rollback(); - + if (tx) await tx.rollback(); throw error; } }; diff --git a/modules/invoiceIn/back/methods/invoice-in/specs/exchangeRateUpdate.spec.js b/modules/invoiceIn/back/methods/invoice-in/specs/exchangeRateUpdate.spec.js index 4b53f65c6..c3dcca5ae 100644 --- a/modules/invoiceIn/back/methods/invoice-in/specs/exchangeRateUpdate.spec.js +++ b/modules/invoiceIn/back/methods/invoice-in/specs/exchangeRateUpdate.spec.js @@ -142,7 +142,7 @@ describe('exchangeRateUpdate functionality', function() { expect(afterCount - beforeCount).toBe(4); }); - fit('should create entries for day1 and day2 from the feed, and not backfill day3', async function() { + it('should create entries for day1 and day2 from the feed, and not backfill day3', async function() { const lastRate = await models.ReferenceRate.findOne({order: 'dated DESC'}, options); if (!lastRate) return fail('No existing ReferenceRate data in DB'); From 115756aaf3b71300ebd604588478f9f2266597e3 Mon Sep 17 00:00:00 2001 From: robert Date: Wed, 8 Jan 2025 07:44:49 +0100 Subject: [PATCH 034/123] feat: refs #6822 fix transfer test --- modules/entry/back/methods/entry/specs/transfer.spec.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/modules/entry/back/methods/entry/specs/transfer.spec.js b/modules/entry/back/methods/entry/specs/transfer.spec.js index 74e89df46..cc712b994 100644 --- a/modules/entry/back/methods/entry/specs/transfer.spec.js +++ b/modules/entry/back/methods/entry/specs/transfer.spec.js @@ -1,5 +1,3 @@ -// const transfer = require('../transfer'); - const models = require('vn-loopback/server/server').models; describe('Transfer merchandise from one entry to the next day()', () => { @@ -22,8 +20,6 @@ describe('Transfer merchandise from one entry to the next day()', () => { const newEntrybuys = await models.Buy.find({where: {entryFk: newEntryFk}}, options); - await models.Entry.find({where: {id: newEntryFk}}, options); - const itemShelvingsWithBuys = await models.Buy.find({ include: { relation: 'itemShelving', From 1816b6de678ff5a9254483ae33ac0c855bb9e797 Mon Sep 17 00:00:00 2001 From: jgallego Date: Wed, 8 Jan 2025 10:24:18 +0100 Subject: [PATCH 035/123] feat: refs #8298 add priceOptimum and packagesDiscountFactor to zone and client tables --- .../client_setPackagesDiscountFactor.sql | 8 ++++++ .../procedures/catalog_componentCalculate.sql | 19 +++++++++++++- .../client_setPackagesDiscountFactor.sql | 25 +++++++++++++++++++ .../procedures/zone_getOptionsForShipment.sql | 3 ++- .../00-zoneEventPriceOptimum.sql | 5 ++++ .../11398-orangeRose/00-zonePriceOptimum.sql | 5 ++++ .../11398-orangeRose/01-zoneUpdate.sql | 2 ++ .../11398-orangeRose/02-clientAlter.sql | 3 +++ .../11398-orangeRose/03-clientConfig.sql | 3 +++ loopback/locale/en.json | 3 ++- modules/zone/back/models/zone-event.json | 3 +++ modules/zone/back/models/zone.json | 3 +++ 12 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 db/routines/vn/events/client_setPackagesDiscountFactor.sql create mode 100644 db/routines/vn/procedures/client_setPackagesDiscountFactor.sql create mode 100644 db/versions/11398-orangeRose/00-zoneEventPriceOptimum.sql create mode 100644 db/versions/11398-orangeRose/00-zonePriceOptimum.sql create mode 100644 db/versions/11398-orangeRose/01-zoneUpdate.sql create mode 100644 db/versions/11398-orangeRose/02-clientAlter.sql create mode 100644 db/versions/11398-orangeRose/03-clientConfig.sql diff --git a/db/routines/vn/events/client_setPackagesDiscountFactor.sql b/db/routines/vn/events/client_setPackagesDiscountFactor.sql new file mode 100644 index 000000000..a0dc33cac --- /dev/null +++ b/db/routines/vn/events/client_setPackagesDiscountFactor.sql @@ -0,0 +1,8 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`vn`@`localhost` EVENT `vn`.`client_setPackagesDiscountFactor` + ON SCHEDULE EVERY 1 DAY + STARTS '2024-10-18 03:00:00.000' + ON COMPLETION PRESERVE + ENABLE +DO CALL client_setPackagesDiscountFactor()$$ +DELIMITER ; diff --git a/db/routines/vn/procedures/catalog_componentCalculate.sql b/db/routines/vn/procedures/catalog_componentCalculate.sql index e29e13a8c..991ff412f 100644 --- a/db/routines/vn/procedures/catalog_componentCalculate.sql +++ b/db/routines/vn/procedures/catalog_componentCalculate.sql @@ -231,7 +231,23 @@ BEGIN SELECT tcc.warehouseFK, tcc.itemFk, c2.id, - z.inflation * ROUND(ic.cm3delivery * (IFNULL(zo.price,5000) - IFNULL(zo.bonus,0)) / (1000 * vc.standardFlowerBox) , 4) cost + z.inflation + * ROUND( + ic.cm3delivery + * ( + ( + zo.price + - ( + (zo.price - zo.priceOptimum) + * c.packagesDiscountFactor + ) + ) + - IFNULL(zo.bonus, 0) + ) + / (1000 * vc.standardFlowerBox), + 4 + ) cost + FROM tmp.ticketComponentCalculate tcc JOIN item i ON i.id = tcc.itemFk JOIN tmp.zoneOption zo ON zo.zoneFk = vZoneFk @@ -239,6 +255,7 @@ BEGIN JOIN agencyMode am ON am.id = z.agencyModeFk JOIN vn.volumeConfig vc JOIN vn.component c2 ON c2.code = 'delivery' + JOIN `client` c on c.id = vClientFk LEFT JOIN itemCost ic ON ic.warehouseFk = tcc.warehouseFk AND ic.itemFk = tcc.itemFk HAVING cost <> 0; diff --git a/db/routines/vn/procedures/client_setPackagesDiscountFactor.sql b/db/routines/vn/procedures/client_setPackagesDiscountFactor.sql new file mode 100644 index 000000000..f6068ca37 --- /dev/null +++ b/db/routines/vn/procedures/client_setPackagesDiscountFactor.sql @@ -0,0 +1,25 @@ +DELIMITER $$ + +CREATE OR REPLACE DEFINER=`vn`@`localhost` +PROCEDURE `vn`.`client_setPackagesDiscountFactor`() +BEGIN + /** + * Set the discount factor for the packages of the clients. + */ + UPDATE client c + JOIN ( + SELECT t.clientFk, + LEAST(( + SUM(t.packages) / COUNT(DISTINCT DATE(t.shipped)) + ) / cc.packagesOptimum, 1) discountFactor + FROM ticket t + JOIN clientConfig cc ON TRUE + WHERE t.shipped > util.VN_CURDATE() - INTERVAL cc.monthsToCalcOptimumPrice MONTH + AND t.packages + GROUP BY t.clientFk + ) ca ON c.id = ca.clientFk + SET c.packagesDiscountFactor = ca.discountFactor; + +END$$ + +DELIMITER ; diff --git a/db/routines/vn/procedures/zone_getOptionsForShipment.sql b/db/routines/vn/procedures/zone_getOptionsForShipment.sql index fa48b0b0f..17d1b3d11 100644 --- a/db/routines/vn/procedures/zone_getOptionsForShipment.sql +++ b/db/routines/vn/procedures/zone_getOptionsForShipment.sql @@ -9,7 +9,7 @@ BEGIN * @return tmp.zoneOption(zoneFk, hour, travelingDays, price, bonus, specificity) The computed options */ DECLARE vHour TIME DEFAULT TIME(util.VN_NOW()); - + DROP TEMPORARY TABLE IF EXISTS tLandings; CREATE TEMPORARY TABLE tLandings (INDEX (eventFk)) @@ -30,6 +30,7 @@ BEGIN TIME(IFNULL(e.`hour`, z.`hour`)) `hour`, l.travelingDays, IFNULL(e.price, z.price) price, + IFNULL(e.priceOptimum, z.priceOptimum) priceOptimum, IFNULL(e.bonus, z.bonus) bonus, l.landed, vShipped shipped diff --git a/db/versions/11398-orangeRose/00-zoneEventPriceOptimum.sql b/db/versions/11398-orangeRose/00-zoneEventPriceOptimum.sql new file mode 100644 index 000000000..8f08eb3e7 --- /dev/null +++ b/db/versions/11398-orangeRose/00-zoneEventPriceOptimum.sql @@ -0,0 +1,5 @@ +ALTER TABLE `vn`.`zoneEvent` + ADD COLUMN `priceOptimum` DECIMAL(10,2) NOT NULL COMMENT 'Precio mínimo que puede pagar un bulto' + AFTER `price`, + ADD CONSTRAINT `ck_zoneEvent_priceOptimum` + CHECK (priceOptimum <= price) diff --git a/db/versions/11398-orangeRose/00-zonePriceOptimum.sql b/db/versions/11398-orangeRose/00-zonePriceOptimum.sql new file mode 100644 index 000000000..82b2001cd --- /dev/null +++ b/db/versions/11398-orangeRose/00-zonePriceOptimum.sql @@ -0,0 +1,5 @@ +ALTER TABLE `vn`.`zone` + ADD COLUMN `priceOptimum` DECIMAL(10,2) NOT NULL COMMENT 'Precio mínimo que puede pagar un bulto' + AFTER `price`, + ADD CONSTRAINT `ck_zone_priceOptimum` + CHECK (priceOptimum <= price) diff --git a/db/versions/11398-orangeRose/01-zoneUpdate.sql b/db/versions/11398-orangeRose/01-zoneUpdate.sql new file mode 100644 index 000000000..042f2a92b --- /dev/null +++ b/db/versions/11398-orangeRose/01-zoneUpdate.sql @@ -0,0 +1,2 @@ +UPDATE `vn`.`zone` + SET `priceOptimum` = `price`; diff --git a/db/versions/11398-orangeRose/02-clientAlter.sql b/db/versions/11398-orangeRose/02-clientAlter.sql new file mode 100644 index 000000000..4119f05ff --- /dev/null +++ b/db/versions/11398-orangeRose/02-clientAlter.sql @@ -0,0 +1,3 @@ +ALTER TABLE `vn`.`client` + ADD COLUMN `packagesDiscountFactor` DECIMAL(4,3) NOT NULL DEFAULT 1.000 + COMMENT 'Factor (1-0) que pondera el precio final entre priceOptimum (mejor) y price (peor)'; diff --git a/db/versions/11398-orangeRose/03-clientConfig.sql b/db/versions/11398-orangeRose/03-clientConfig.sql new file mode 100644 index 000000000..2869f26a2 --- /dev/null +++ b/db/versions/11398-orangeRose/03-clientConfig.sql @@ -0,0 +1,3 @@ +ALTER TABLE `vn`.`clientConfig` + ADD COLUMN `packagesOptimum` INT UNSIGNED NOT NULL DEFAULT 20 COMMENT 'Numero de bultos por cliente/dia para conseguir el precio optimo', + ADD COLUMN `monthsToCalcOptimumPrice` TINYINT UNSIGNED NOT NULL DEFAULT 3 COMMENT 'Número de meses a usar para el cálculo de client.packagesDiscountFactor'; diff --git a/loopback/locale/en.json b/loopback/locale/en.json index 80da13ae5..72346a364 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -250,5 +250,6 @@ "Holidays to past days not available": "Holidays to past days not available", "Price cannot be blank": "Price cannot be blank", "There are tickets to be invoiced": "There are tickets to be invoiced", - "The address of the customer must have information about Incoterms and Customs Agent": "The address of the customer must have information about Incoterms and Customs Agent" + "The address of the customer must have information about Incoterms and Customs Agent": "The address of the customer must have information about Incoterms and Customs Agent", + "CONSTRAINT `ck_zoneEvent_priceOptimum` failed for `vn`.`zoneEvent`": "CONSTRAINT `ck_zoneEvent_priceOptimum` failed for `vn`.`zoneEvent`" } \ No newline at end of file diff --git a/modules/zone/back/models/zone-event.json b/modules/zone/back/models/zone-event.json index 366bdec9d..cf5045a8c 100644 --- a/modules/zone/back/models/zone-event.json +++ b/modules/zone/back/models/zone-event.json @@ -42,6 +42,9 @@ "price": { "type": "number" }, + "priceOptimum": { + "type": "number" + }, "bonus": { "type": "number" }, diff --git a/modules/zone/back/models/zone.json b/modules/zone/back/models/zone.json index 141b28750..4f963568f 100644 --- a/modules/zone/back/models/zone.json +++ b/modules/zone/back/models/zone.json @@ -28,6 +28,9 @@ "price": { "type": "number" }, + "priceOptimum": { + "type": "number" + }, "bonus": { "type": "number" }, From 0d822d03c929094e6f685a4fb05cee51ead9db79 Mon Sep 17 00:00:00 2001 From: jgallego Date: Wed, 8 Jan 2025 10:30:47 +0100 Subject: [PATCH 036/123] fix: refs #8298 remove duplicate entry in English locale file --- loopback/locale/en.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/loopback/locale/en.json b/loopback/locale/en.json index 72346a364..2e25408c6 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -250,6 +250,5 @@ "Holidays to past days not available": "Holidays to past days not available", "Price cannot be blank": "Price cannot be blank", "There are tickets to be invoiced": "There are tickets to be invoiced", - "The address of the customer must have information about Incoterms and Customs Agent": "The address of the customer must have information about Incoterms and Customs Agent", - "CONSTRAINT `ck_zoneEvent_priceOptimum` failed for `vn`.`zoneEvent`": "CONSTRAINT `ck_zoneEvent_priceOptimum` failed for `vn`.`zoneEvent`" -} \ No newline at end of file + "The address of the customer must have information about Incoterms and Customs Agent": "The address of the customer must have information about Incoterms and Customs Agent" +} From be5631370649bc90bf6c4b059bc1082f403494e9 Mon Sep 17 00:00:00 2001 From: jgallego Date: Wed, 8 Jan 2025 11:58:50 +0100 Subject: [PATCH 037/123] feat: refs #8298 add priceOptimum column to zoneEvent and update zone fixture data --- db/dump/fixtures.before.sql | 32 +++++++++---------- .../00-zoneEventPriceOptimum.sql | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index ff896b84d..9e46e3c2e 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -694,22 +694,22 @@ INSERT INTO `vn`.`invoiceOutExpense`(`id`, `invoiceOutFk`, `amount`, `expenseFk` (6, 4, 8.07, 2000000000, util.VN_CURDATE()), (7, 5, 8.07, 2000000000, util.VN_CURDATE()); -INSERT INTO `vn`.`zone` (`id`, `name`, `hour`, `agencyModeFk`, `travelingDays`, `price`, `bonus`, `itemMaxSize`) - VALUES - (1, 'Zone pickup A', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 1, 0, 1, 0, 100), - (2, 'Zone pickup B', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 1, 0, 1, 0, 100), - (3, 'Zone 247 A', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 7, 1, 2, 0, 100), - (4, 'Zone 247 B', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 7, 1, 2, 0, 100), - (5, 'Zone expensive A', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 8, 1, 1000, 0, 100), - (6, 'Zone expensive B', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 8, 1, 1000, 0, 100), - (7, 'Zone refund', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 23, 0, 1, 0, 100), - (8, 'Zone others', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 10, 0, 1, 0, 100), - (9, 'Zone superMan', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 2, 0, 1, 0, 100), - (10, 'Zone teleportation', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 3, 0, 1, 0, 100), - (11, 'Zone pickup C', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 1, 0, 1, 0, 100), - (12, 'Zone entanglement', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 4, 0, 1, 0, 100), - (13, 'Zone quantum break', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 5, 0, 1, 0, 100); - +INSERT INTO `vn`.`zone` + (`id`, `name`, `hour`, `agencyModeFk`, `travelingDays`, `price`, `bonus`, `itemMaxSize`, `priceOptimum`) +VALUES + (1, 'Zone pickup A', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 1, 0, 1, 0, 100, 1), + (2, 'Zone pickup B', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 1, 0, 1, 0, 100, 1), + (3, 'Zone 247 A', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 7, 1, 2, 0, 100, 1), + (4, 'Zone 247 B', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 7, 1, 2, 0, 100, 1), + (5, 'Zone expensive A', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 8, 1, 1000, 0, 100, 500), + (6, 'Zone expensive B', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 8, 1, 1000, 0, 100, 500), + (7, 'Zone refund', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 23, 0, 1, 0, 100, 0.5), + (8, 'Zone others', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 10, 0, 1, 0, 100, 0.5), + (9, 'Zone superMan', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 2, 0, 1, 0, 100, 0.5), + (10, 'Zone teleportation', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 3, 0, 1, 0, 100, 0.5), + (11, 'Zone pickup C', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 1, 0, 1, 0, 100, 0.5), + (12, 'Zone entanglement', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 4, 0, 1, 0, 100, 0.5), + (13, 'Zone quantum break', CONCAT(util.VN_CURDATE(), ' ', TIME('23:59')), 5, 0, 1, 0, 100, 0.5); INSERT INTO `vn`.`zoneWarehouse` (`id`, `zoneFk`, `warehouseFk`) VALUES diff --git a/db/versions/11398-orangeRose/00-zoneEventPriceOptimum.sql b/db/versions/11398-orangeRose/00-zoneEventPriceOptimum.sql index 8f08eb3e7..0440714e4 100644 --- a/db/versions/11398-orangeRose/00-zoneEventPriceOptimum.sql +++ b/db/versions/11398-orangeRose/00-zoneEventPriceOptimum.sql @@ -1,5 +1,5 @@ ALTER TABLE `vn`.`zoneEvent` - ADD COLUMN `priceOptimum` DECIMAL(10,2) NOT NULL COMMENT 'Precio mínimo que puede pagar un bulto' + ADD COLUMN `priceOptimum` DECIMAL(10,2) NULL COMMENT 'Precio mínimo que puede pagar un bulto' AFTER `price`, ADD CONSTRAINT `ck_zoneEvent_priceOptimum` CHECK (priceOptimum <= price) From 446ffac7f848c3dc47f7667e001778c939baabde Mon Sep 17 00:00:00 2001 From: robert Date: Thu, 9 Jan 2025 13:44:59 +0100 Subject: [PATCH 038/123] feat: sendCheckingPresence debug --- back/methods/chat/sendCheckingPresence.js | 69 +++++++++++++---------- 1 file changed, 39 insertions(+), 30 deletions(-) diff --git a/back/methods/chat/sendCheckingPresence.js b/back/methods/chat/sendCheckingPresence.js index 7ab5d63fe..83e8da304 100644 --- a/back/methods/chat/sendCheckingPresence.js +++ b/back/methods/chat/sendCheckingPresence.js @@ -27,38 +27,47 @@ module.exports = Self => { }); Self.sendCheckingPresence = async(ctx, recipientId, message) => { - if (!recipientId) return false; - const models = Self.app.models; - const userId = ctx.req.accessToken.userId; - const sender = await models.VnUser.findById(userId, {fields: ['id']}); - const recipient = await models.VnUser.findById(recipientId, null); - - // Prevent sending messages to yourself - if (recipientId == userId) return false; - if (!recipient) - throw new Error(`Could not send message "${message}" to worker id ${recipientId} from user ${userId}`); - - if (!isProduction()) - message = `[Test:Environment to user ${userId}] ` + message; - - const chat = await models.Chat.create({ - senderFk: sender.id, - recipient: `@${recipient.name}`, - dated: Date.vnNew(), - checkUserStatus: 1, - message: message, - status: 'sending', - attempts: 0 - }); - try { - await Self.sendCheckingUserStatus(chat); - await Self.updateChat(chat, 'sent'); - } catch (error) { - await Self.updateChat(chat, 'error', error); - } + const models = Self.app.models; + const sender = await models.VnUser.findById(userId, {fields: ['id']}); + const error = `Could not send message from user ${userId}`; - return true; + if (!recipientId) throw new Error(error); + const recipient = await models.VnUser.findById(recipientId, null); + if (!recipient) + throw new Error(error); + + // Prevent sending messages to yourself + if (recipientId == userId) return false; + + if (!isProduction()) + message = `[Test:Environment to user ${userId}] ` + message; + + const chat = await models.Chat.create({ + senderFk: sender.id, + recipient: `@${recipient.name}`, + dated: Date.vnNew(), + checkUserStatus: 1, + message: message, + status: 'sending', + attempts: 0 + }); + + try { + await Self.sendCheckingUserStatus(chat); + await Self.updateChat(chat, 'sent'); + } catch (error) { + await Self.updateChat(chat, 'error', error); + } + + return true; + } catch (e) { + await Self.rawSql(` + INSERT INTO util.debug (variable, value) + VALUES ('sendCheckingPresence_error', ?) + `, [`User: ${userId}, recipient: ${recipientId}, message: ${message}, error: ${e}`]); + throw e; + } }; }; From 12fa87a93cbb53f7ce95b9cc257f522ff010fdbf Mon Sep 17 00:00:00 2001 From: sergiodt Date: Thu, 9 Jan 2025 16:15:29 +0100 Subject: [PATCH 039/123] =?UTF-8?q?fix:=20refs=20#7569=20refs=C2=B76861=20?= =?UTF-8?q?ticketOrderReserve?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- loopback/locale/en.json | 2 +- loopback/locale/es.json | 2 +- loopback/locale/fr.json | 2 +- modules/ticket/back/methods/ticket/saveSign.js | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/loopback/locale/en.json b/loopback/locale/en.json index f5c27726b..0f53cf572 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -249,5 +249,5 @@ "Sales already moved": "Sales already moved", "Holidays to past days not available": "Holidays to past days not available", "Incorrect delivery order alert on route": "Incorrect delivery order alert on route: {{ route }} zone: {{ zone }}", - "Ticket has been delivered out of order": "The ticket {{ ticket }} ({{ fullUrl }}) has been delivered out of order. Tickets that have not been delivered in their route are: {{ ticketsToMail }}" + "Ticket has been delivered out of order": "The ticket {{ticket}} {{{fullUrl}}} has been delivered out of order. Tickets that have not been delivered in their route are: {{ ticketsToMail }}" } \ No newline at end of file diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 2a93407fc..163fbaa71 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -394,5 +394,5 @@ "An item type with the same code already exists": "Un tipo con el mismo código ya existe", "Holidays to past days not available": "Las vacaciones a días pasados no están disponibles", "Incorrect delivery order alert on route": "Alerta de orden de entrega incorrecta en ruta: {{ route }} zona: {{ zone }}", - "Ticket has been delivered out of order": "El ticket {{ ticket }} ({{ fullUrl }}) no ha sigo entregado en su orden. Los tickets de la ruta que no han sido entregados en su orden son: {{ ticketsToMail }}" + "Ticket has been delivered out of order": "El ticket {{ticket}} {{{fullUrl}}} no ha sigo entregado en su orden. Los tickets de la ruta que no han sido entregados en su orden son: {{ ticketsToMail }}" } \ No newline at end of file diff --git a/loopback/locale/fr.json b/loopback/locale/fr.json index 719cbf99c..082aedd2b 100644 --- a/loopback/locale/fr.json +++ b/loopback/locale/fr.json @@ -368,5 +368,5 @@ "ticketLostExpedition": "Le ticket [{{ticketId}}]({{{ticketUrl}}}) a l'expédition perdue suivante : {{expeditionId}}", "The web user's email already exists": "L'email de l'internaute existe déjà", "Incorrect delivery order alert on route": "Alerte de bon de livraison incorrect sur l'itinéraire: {{ route }} zone : {{ zone }}", - "Ticket has been delivered out of order": "Le ticket {{ticket}} ({{fullUrl}}) a été livré hors ordre. Les tickets qui n'ont pas été livrés dans leur itinéraire sont : {{ticketsToMail}}" + "Ticket has been delivered out of order": "Le ticket {{ticket}} {{{fullUrl}}} a été livré hors ordre. Les tickets qui n'ont pas été livrés dans leur itinéraire sont : {{ticketsToMail}}" } \ No newline at end of file diff --git a/modules/ticket/back/methods/ticket/saveSign.js b/modules/ticket/back/methods/ticket/saveSign.js index 6dc90e330..443b2c1c7 100644 --- a/modules/ticket/back/methods/ticket/saveSign.js +++ b/modules/ticket/back/methods/ticket/saveSign.js @@ -198,13 +198,13 @@ module.exports = Self => { const sendTo = 'repartos@verdnatura.es'; const fullUrl = `${url}route/${route}/summary`; const emailSubject = $t('Incorrect delivery order alert on route', { - route: route, + route, zone: zoneName }); const emailBody = $t('Ticket has been delivered out of order', { - ticket: ticket, - fullUrl: fullUrl, - ticketsToMail: ticketsToMail, + ticket, + fullUrl, + ticketsToMail, }); await Self.app.models.Mail.create({ From a1e1d4fa72fd906a65659fbfb3425fd683c25652 Mon Sep 17 00:00:00 2001 From: sergiodt Date: Fri, 10 Jan 2025 07:20:24 +0100 Subject: [PATCH 040/123] =?UTF-8?q?fix:=20refs=20#7569=20refs=C2=B76861=20?= =?UTF-8?q?ticketOrderReserve?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- loopback/locale/pt.json | 2 +- modules/ticket/back/methods/ticket/specs/saveSign.spec.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/loopback/locale/pt.json b/loopback/locale/pt.json index 5dfad3725..1fa16074f 100644 --- a/loopback/locale/pt.json +++ b/loopback/locale/pt.json @@ -367,5 +367,5 @@ "ticketLostExpedition": "O ticket [{{ticketId}}]({{{ticketUrl}}}) tem a seguinte expedição perdida: {{expeditionId}}", "The web user's email already exists": "O e-mail do utilizador da web já existe.", "Incorrect delivery order alert on route": "Alerta de ordem de entrega incorreta na rota: {{ route }} zona: {{ zone }}", - "Ticket has been delivered out of order": "O ticket {{ ticket }} ({{ fullUrl }}) foi entregue fora de ordem. Os tickets que não foram entregues na sua rota são: {{ ticketsToMail }}" + "Ticket has been delivered out of order": "O ticket {{ticket}} {{{fullUrl}}} foi entregue fora de ordem. Os tickets que não foram entregues na sua rota são: {{ ticketsToMail }}" } \ No newline at end of file diff --git a/modules/ticket/back/methods/ticket/specs/saveSign.spec.js b/modules/ticket/back/methods/ticket/specs/saveSign.spec.js index 559c413e5..ed802e311 100644 --- a/modules/ticket/back/methods/ticket/specs/saveSign.spec.js +++ b/modules/ticket/back/methods/ticket/specs/saveSign.spec.js @@ -52,7 +52,7 @@ describe('Ticket saveSign()', () => { expect(ticketTrackingAfter.name).toBe('Entregado en parte'); }); - fit('should send an email to notify that the delivery order is not correct', async() => { + it('should send an email to notify that the delivery order is not correct', async() => { const tx = await models.Ticket.beginTransaction({}); const ticketFk = 8; const priority = 5; From 1ac75d87ade3d238585c075813fc136601417f3c Mon Sep 17 00:00:00 2001 From: sergiodt Date: Fri, 10 Jan 2025 08:55:45 +0100 Subject: [PATCH 041/123] fix: refs #6861 refs#6861 addPrevOK --- db/routines/vn/procedures/saleTracking_addPrevOK.sql | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/db/routines/vn/procedures/saleTracking_addPrevOK.sql b/db/routines/vn/procedures/saleTracking_addPrevOK.sql index 34d1cfac8..9f823e9a0 100644 --- a/db/routines/vn/procedures/saleTracking_addPrevOK.sql +++ b/db/routines/vn/procedures/saleTracking_addPrevOK.sql @@ -16,10 +16,11 @@ BEGIN TRUE, sc.userFk, s.id - FROM vn.sectorCollection sc - JOIN vn.sectorCollectionSaleGroup scsg ON scsg.sectorCollectionFk = sc.id - JOIN vn.saleGroupDetail sgd ON sgd.saleGroupFk = scsg.saleGroupFk - JOIN vn.state s ON s.code = 'OK PREVIOUS' + FROM sectorCollection sc + JOIN sectorCollectionSaleGroup scsg ON scsg.sectorCollectionFk = sc.id + JOIN saleGroupDetail sgd ON sgd.saleGroupFk = scsg.saleGroupFk + JOIN state s ON s.code = 'OK PREVIOUS' + JOIN itemShelvingSale iss ON iss.saleFk = sgd.saleFk WHERE sc.id = vSectorCollectionFk; END$$ DELIMITER ; From bdaaffbbd76247d2eaf64635c58fbd8e707bff2b Mon Sep 17 00:00:00 2001 From: robert Date: Fri, 10 Jan 2025 10:33:19 +0100 Subject: [PATCH 042/123] feat: refs #7584 changes request --- db/routines/vn/triggers/workerTimeControl_afterDelete.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/routines/vn/triggers/workerTimeControl_afterDelete.sql b/db/routines/vn/triggers/workerTimeControl_afterDelete.sql index 762754591..96db381b5 100644 --- a/db/routines/vn/triggers/workerTimeControl_afterDelete.sql +++ b/db/routines/vn/triggers/workerTimeControl_afterDelete.sql @@ -3,7 +3,7 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`workerTimeControl_after AFTER DELETE ON `workerTimeControl` FOR EACH ROW BEGIN - IF account.myUser_getId() THEN + IF account.myUser_getId() IS NOT NULL THEN INSERT INTO workerLog SET `action` = 'delete', `changedModel` = 'WorkerTimeControl', From 9d05b16404da3a7d3d7d5e14300f7b4a9d8baa9f Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 13 Jan 2025 09:18:46 +0100 Subject: [PATCH 043/123] fix: canBeInvoiced only in makeInvoice --- loopback/locale/en.json | 3 +- loopback/locale/es.json | 2 +- loopback/locale/fr.json | 2 +- loopback/locale/pt.json | 2 +- .../methods/invoiceOut/clientsToInvoice.js | 6 --- .../invoiceOut/specs/clientsToInvoice.spec.js | 54 +++++++++++-------- 6 files changed, 38 insertions(+), 31 deletions(-) diff --git a/loopback/locale/en.json b/loopback/locale/en.json index 80da13ae5..8d5eab4bc 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -211,6 +211,7 @@ "Name should be uppercase": "Name should be uppercase", "You cannot update these fields": "You cannot update these fields", "CountryFK cannot be empty": "Country cannot be empty", + "No tickets to invoice": "There are no tickets to invoice that meet the invoicing requirements", "You are not allowed to modify the alias": "You are not allowed to modify the alias", "You already have the mailAlias": "You already have the mailAlias", "This machine is already in use.": "This machine is already in use.", @@ -251,4 +252,4 @@ "Price cannot be blank": "Price cannot be blank", "There are tickets to be invoiced": "There are tickets to be invoiced", "The address of the customer must have information about Incoterms and Customs Agent": "The address of the customer must have information about Incoterms and Customs Agent" -} \ No newline at end of file +} diff --git a/loopback/locale/es.json b/loopback/locale/es.json index fcee0e111..cde81e0cb 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -339,7 +339,7 @@ "Incorrect pin": "Pin incorrecto.", "You already have the mailAlias": "Ya tienes este alias de correo", "The alias cant be modified": "Este alias de correo no puede ser modificado", - "No tickets to invoice": "No hay tickets para facturar", + "No tickets to invoice": "No hay tickets para facturar que cumplan los requisitos de facturación", "this warehouse has not dms": "El Almacén no acepta documentos", "This ticket already has a cmr saved": "Este ticket ya tiene un cmr guardado", "Name should be uppercase": "El nombre debe ir en mayúscula", diff --git a/loopback/locale/fr.json b/loopback/locale/fr.json index 9941358be..f49196a8f 100644 --- a/loopback/locale/fr.json +++ b/loopback/locale/fr.json @@ -339,7 +339,7 @@ "Incorrect pin": "Pin incorrect.", "You already have the mailAlias": "Vous avez déjà cet alias de courrier", "The alias cant be modified": "Cet alias de courrier ne peut pas être modifié", - "No tickets to invoice": "Pas de tickets à facturer", + "No tickets to invoice": "Il n'y a pas de tickets à facturer qui répondent aux exigences de facturation", "this warehouse has not dms": "L'entrepôt n'accepte pas les documents", "This ticket already has a cmr saved": "Ce ticket a déjà un cmr enregistré", "Name should be uppercase": "Le nom doit être en majuscules", diff --git a/loopback/locale/pt.json b/loopback/locale/pt.json index e84b30f3d..e2374d35f 100644 --- a/loopback/locale/pt.json +++ b/loopback/locale/pt.json @@ -339,7 +339,7 @@ "Incorrect pin": "PIN incorreto.", "You already have the mailAlias": "Você já tem o alias de e-mail", "The alias cant be modified": "O alias não pode ser modificado", - "No tickets to invoice": "Não há tickets para faturar", + "No tickets to invoice": "Não há bilhetes para faturar que atendam aos requisitos de faturamento", "this warehouse has not dms": "Este armazém não tem DMS", "This ticket already has a cmr saved": "Este ticket já tem um CMR salvo", "Name should be uppercase": "O nome deve estar em maiúsculas", diff --git a/modules/invoiceOut/back/methods/invoiceOut/clientsToInvoice.js b/modules/invoiceOut/back/methods/invoiceOut/clientsToInvoice.js index 7befdcbeb..f66221409 100644 --- a/modules/invoiceOut/back/methods/invoiceOut/clientsToInvoice.js +++ b/modules/invoiceOut/back/methods/invoiceOut/clientsToInvoice.js @@ -49,12 +49,6 @@ module.exports = Self => { } try { - const clientCanBeInvoiced = - await Self.app.models.Client.canBeInvoiced(clientId, companyFk, myOptions); - - if (!clientCanBeInvoiced) - throw new UserError(`This client can't be invoiced`); - const vIsAllInvoiceable = false; await Self.rawSql('CALL ticketPackaging_add(?, ?, ?, ?)', [ clientId, diff --git a/modules/invoiceOut/back/methods/invoiceOut/specs/clientsToInvoice.spec.js b/modules/invoiceOut/back/methods/invoiceOut/specs/clientsToInvoice.spec.js index df0566c54..6e536f433 100644 --- a/modules/invoiceOut/back/methods/invoiceOut/specs/clientsToInvoice.spec.js +++ b/modules/invoiceOut/back/methods/invoiceOut/specs/clientsToInvoice.spec.js @@ -1,4 +1,5 @@ const models = require('vn-loopback/server/server').models; +const LoopBackContext = require('loopback-context'); describe('InvoiceOut clientsToInvoice()', () => { const userId = 1; @@ -20,6 +21,21 @@ describe('InvoiceOut clientsToInvoice()', () => { headers: {origin: 'http://localhost'} }; const ctx = {req: activeCtx}; + let tx; + let options; + + beforeEach(async() => { + LoopBackContext.getCurrentContext = () => ({ + active: activeCtx, + }); + + tx = await models.InvoiceOut.beginTransaction({}); + options = {transaction: tx}; + }); + + afterEach(async() => { + await tx.rollback(); + }); it('should return a list of clients to invoice', async() => { spyOn(models.InvoiceOut, 'rawSql').and.callFake(query => { @@ -37,24 +53,14 @@ describe('InvoiceOut clientsToInvoice()', () => { } }); - const tx = await models.InvoiceOut.beginTransaction({}); - const options = {transaction: tx}; + const addresses = await models.InvoiceOut.clientsToInvoice( + ctx, clientId, invoiceDate, maxShipped, companyFk, options); - try { - const addresses = await models.InvoiceOut.clientsToInvoice( - ctx, clientId, invoiceDate, maxShipped, companyFk, options); - - expect(addresses.length).toBeGreaterThan(0); - expect(addresses[0].clientId).toBe(clientId); - expect(addresses[0].clientName).toBe('Test Client'); - expect(addresses[0].id).toBe(1); - expect(addresses[0].nickname).toBe('Address 1'); - - await tx.rollback(); - } catch (e) { - await tx.rollback(); - throw e; - } + expect(addresses.length).toBeGreaterThan(0); + expect(addresses[0].clientId).toBe(clientId); + expect(addresses[0].clientName).toBe('Test Client'); + expect(addresses[0].id).toBe(1); + expect(addresses[0].nickname).toBe('Address 1'); }); it('should handle errors and rollback transaction', async() => { @@ -62,14 +68,20 @@ describe('InvoiceOut clientsToInvoice()', () => { return Promise.reject(new Error('Test Error')); }); - const tx = await models.InvoiceOut.beginTransaction({}); - const options = {transaction: tx}; - try { await models.InvoiceOut.clientsToInvoice(ctx, clientId, invoiceDate, maxShipped, companyFk, options); } catch (e) { expect(e.message).toBe('Test Error'); - await tx.rollback(); } }); + + it('should return all list', async() => { + const minShipped = Date.vnNew(); + minShipped.setFullYear(maxShipped.getFullYear() - 1); + + const toInvoice = await models.InvoiceOut.clientsToInvoice( + ctx, null, invoiceDate, maxShipped, companyFk, options); + + expect(toInvoice).toBeDefined(); + }); }); From c15a3bfe501f46159e3868ddfb8a90ac7c493527 Mon Sep 17 00:00:00 2001 From: jgallego Date: Mon, 13 Jan 2025 11:28:30 +0100 Subject: [PATCH 044/123] feat: refs #8381 add initial and final temperature fields to entry model and queries --- db/versions/11405-blackMoss/00-entryAlter.sql | 3 +++ modules/entry/back/methods/entry/filter.js | 16 ++++++++++++++++ modules/entry/back/models/entry.json | 6 ++++++ modules/travel/back/methods/travel/getEntries.js | 4 +++- 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 db/versions/11405-blackMoss/00-entryAlter.sql diff --git a/db/versions/11405-blackMoss/00-entryAlter.sql b/db/versions/11405-blackMoss/00-entryAlter.sql new file mode 100644 index 000000000..3320b9dd3 --- /dev/null +++ b/db/versions/11405-blackMoss/00-entryAlter.sql @@ -0,0 +1,3 @@ +ALTER TABLE `vn`.`entry` + ADD COLUMN `initialTemperature` decimal(10,2) DEFAULT NULL COMMENT 'Temperatura de como lo recibimos del proveedor ej. en colombia', + ADD COLUMN `finalTemperature` decimal(10,2) DEFAULT NULL COMMENT 'Temperatura final de como llega a nuestras instalaciones'; diff --git a/modules/entry/back/methods/entry/filter.js b/modules/entry/back/methods/entry/filter.js index d7740dd4e..e5eae85fd 100644 --- a/modules/entry/back/methods/entry/filter.js +++ b/modules/entry/back/methods/entry/filter.js @@ -119,6 +119,16 @@ module.exports = Self => { arg: 'invoiceAmount', type: 'number', description: `The invoice amount` + }, + { + arg: 'initialTemperature', + type: 'number', + description: 'Initial temperature value' + }, + { + arg: 'finalTemperature', + type: 'number', + description: 'Final temperature value' } ], returns: { @@ -170,6 +180,10 @@ module.exports = Self => { case 'invoiceInFk': param = `e.${param}`; return {[param]: value}; + case 'initialTemperature': + return {'e.initialTemperature': {lte: value}}; + case 'finalTemperature': + return {'e.finalTemperature': {gte: value}}; } }); filter = mergeFilters(ctx.args.filter, {where}); @@ -204,6 +218,8 @@ module.exports = Self => { e.gestDocFk, e.invoiceInFk, e.invoiceAmount, + e.initialTemperature, + e.finalTemperature, t.landed, s.name supplierName, s.nickname supplierAlias, diff --git a/modules/entry/back/models/entry.json b/modules/entry/back/models/entry.json index 4a09c7d6a..1ff062119 100644 --- a/modules/entry/back/models/entry.json +++ b/modules/entry/back/models/entry.json @@ -68,6 +68,12 @@ }, "invoiceAmount": { "type": "number" + }, + "initialTemperature": { + "type": "number" + }, + "finalTemperature": { + "type": "number" } }, "relations": { diff --git a/modules/travel/back/methods/travel/getEntries.js b/modules/travel/back/methods/travel/getEntries.js index 50088ccfa..2399f8bc4 100644 --- a/modules/travel/back/methods/travel/getEntries.js +++ b/modules/travel/back/methods/travel/getEntries.js @@ -41,7 +41,9 @@ module.exports = Self => { * 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 + CAST(SUM(b.packageValue*b.quantity) AS DECIMAL(10,2)) packageValue, + e.initialTemperature, + e.finalTemperature FROM vn.travel t LEFT JOIN vn.entry e ON t.id = e.travelFk LEFT JOIN vn.buy b ON b.entryFk = e.id From 050c338ffb67283ae303f06e786a492bd88262b8 Mon Sep 17 00:00:00 2001 From: robert Date: Mon, 13 Jan 2025 14:29:13 +0100 Subject: [PATCH 045/123] feat: refs #8387 crudModel --- loopback/locale/en.json | 3 ++- loopback/locale/es.json | 5 +++-- modules/item/back/models/item-tag.js | 23 +++++++++++++++++++++++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/loopback/locale/en.json b/loopback/locale/en.json index 80da13ae5..e6b7b98c1 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -250,5 +250,6 @@ "Holidays to past days not available": "Holidays to past days not available", "Price cannot be blank": "Price cannot be blank", "There are tickets to be invoiced": "There are tickets to be invoiced", - "The address of the customer must have information about Incoterms and Customs Agent": "The address of the customer must have information about Incoterms and Customs Agent" + "The address of the customer must have information about Incoterms and Customs Agent": "The address of the customer must have information about Incoterms and Customs Agent", + "The value must be a number or a range of numbers": "The value must be a number or a range of numbers" } \ No newline at end of file diff --git a/loopback/locale/es.json b/loopback/locale/es.json index fcee0e111..93ba0d59a 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -398,5 +398,6 @@ "Holidays to past days not available": "Las vacaciones a días pasados no están disponibles", "All tickets have a route order": "Todos los tickets tienen orden de ruta", "Price cannot be blank": "Price cannot be blank", - "There are tickets to be invoiced": "La zona tiene tickets por facturar" -} + "There are tickets to be invoiced": "La zona tiene tickets por facturar", + "The value must be a number or a range of numbers": "The value must be a number or a range of numbers" +} \ No newline at end of file diff --git a/modules/item/back/models/item-tag.js b/modules/item/back/models/item-tag.js index 5b7163913..338ef64cf 100644 --- a/modules/item/back/models/item-tag.js +++ b/modules/item/back/models/item-tag.js @@ -10,4 +10,27 @@ module.exports = Self => { return new UserError(`Tag value cannot be blank`); return err; }); + + Self.observe('before save', async ctx => { + const validValue = new RegExp('^\\d{1,3}(-\\d{1,3})?$'); + let tagFk; + let value; + + if (ctx.isNewInstance) { + tagFk = ctx.instance.tagFk; + value = ctx.instance.value; + } + const newData = ctx.data.value || null; + const currentData = ctx.currentInstance.value || null; + const models = Self.app.models; + const validTag = await models.Tag.findOne({where: {name: 'Longitud(cm)'}}); + + if (tagFk === validTag.id || (currentData && currentData === validTag.id)) { + if ( + (value && !validValue.test(value)) || + (newData && !validValue.test(newData)) + ) + throw new UserError('The value must be a number or a range of numbers'); + } + }); }; From 6fd8c5ded6816c4437bd833af98de12d7ddc837b Mon Sep 17 00:00:00 2001 From: robert Date: Mon, 13 Jan 2025 14:33:32 +0100 Subject: [PATCH 046/123] feat: refs #8387 fix --- loopback/locale/en.json | 5 ++--- loopback/locale/es.json | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/loopback/locale/en.json b/loopback/locale/en.json index e6b7b98c1..2e25408c6 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -250,6 +250,5 @@ "Holidays to past days not available": "Holidays to past days not available", "Price cannot be blank": "Price cannot be blank", "There are tickets to be invoiced": "There are tickets to be invoiced", - "The address of the customer must have information about Incoterms and Customs Agent": "The address of the customer must have information about Incoterms and Customs Agent", - "The value must be a number or a range of numbers": "The value must be a number or a range of numbers" -} \ No newline at end of file + "The address of the customer must have information about Incoterms and Customs Agent": "The address of the customer must have information about Incoterms and Customs Agent" +} diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 93ba0d59a..57aa2845a 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -398,6 +398,5 @@ "Holidays to past days not available": "Las vacaciones a días pasados no están disponibles", "All tickets have a route order": "Todos los tickets tienen orden de ruta", "Price cannot be blank": "Price cannot be blank", - "There are tickets to be invoiced": "La zona tiene tickets por facturar", - "The value must be a number or a range of numbers": "The value must be a number or a range of numbers" -} \ No newline at end of file + "There are tickets to be invoiced": "La zona tiene tickets por facturar" +} From c4870d52de17c101e17d421f2dd633db8ba92f74 Mon Sep 17 00:00:00 2001 From: robert Date: Mon, 13 Jan 2025 14:37:27 +0100 Subject: [PATCH 047/123] feat: refs #257275 defaulterFilter --- modules/client/back/methods/defaulter/filter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/client/back/methods/defaulter/filter.js b/modules/client/back/methods/defaulter/filter.js index 5359ce4a7..cf8bd855a 100644 --- a/modules/client/back/methods/defaulter/filter.js +++ b/modules/client/back/methods/defaulter/filter.js @@ -94,7 +94,7 @@ module.exports = Self => { AND r1.started = r2.maxStarted ) r ON r.clientFk = c.id LEFT JOIN workerDepartment wd ON wd.workerFk = u.id - JOIN department dp ON dp.id = wd.departmentFk + LEFT JOIN department dp ON dp.id = wd.departmentFk WHERE d.created = ? AND d.amount > 0 From 6e56bdeeb1159473d8a6797eb82a2656e89f5e0f Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 13 Jan 2025 15:24:01 +0100 Subject: [PATCH 048/123] fix: refs #8389 prevent error propagation --- back/methods/chat/sendCheckingPresence.js | 1 - 1 file changed, 1 deletion(-) diff --git a/back/methods/chat/sendCheckingPresence.js b/back/methods/chat/sendCheckingPresence.js index 83e8da304..955ed0240 100644 --- a/back/methods/chat/sendCheckingPresence.js +++ b/back/methods/chat/sendCheckingPresence.js @@ -67,7 +67,6 @@ module.exports = Self => { INSERT INTO util.debug (variable, value) VALUES ('sendCheckingPresence_error', ?) `, [`User: ${userId}, recipient: ${recipientId}, message: ${message}, error: ${e}`]); - throw e; } }; }; From 00577056ddd933b153bd63c8ee9cc8734d1e6f8e Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 13 Jan 2025 15:24:12 +0100 Subject: [PATCH 049/123] build: refs #8389 changelog --- CHANGELOG.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4eb7d29a..67ffe9f12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,31 @@ +# Version 25.00 - 2025-01-14 + +### Added 🆕 + +- feat: refs #7235 add serialType parameter to getInvoiceDate and implement corresponding tests by:jgallego +- feat: refs #7301 update lastEntriesFilter to include landedDate and enhance test cases (origin/7301-removeRedundantInventories) by:pablone +- feat: refs #7880 error code and translations by:ivanm +- feat: refs #7924 add isCustomInspectionRequired field to item and update related logic by:jgallego +- feat: refs #8167 update canBeInvoiced method to include active status check and improve test cases by:jgallego +- feat: refs #8167 update locale and improve invoicing logic with error handling by:jgallego +- feat: refs #8246 added relation for the front's new field by:Jon +- feat: refs #8266 added itemFk and needed fixtures by:jtubau +- feat: refs #8324 country unique by:Carlos Andrés + +### Changed 📦 + + +### Fixed 🛠️ + +- feat: refs #8266 added itemFk and needed fixtures by:jtubau +- fix: add isCustomInspectionRequired column to item table for customs inspection indication by:jgallego +- fix: canBeInvoiced only in makeInvoice by:alexm +- fix: hotFix getMondayWeekYear by:alexm +- fix: refs #6598 update ACL property assignment by:jorgep +- fix: refs #6861 refs#6861 addPrevOK by:sergiodt +- fix: refs #7301 remove debug console log and update test cases in lastEntriesFilter by:pablone +- fix: refs #7301 update SQL fixtures and improve lastEntriesFilter logic by:pablone + # Version 24.52 - 2024-01-07 ### Added 🆕 From 29e6a999836f42bd626dce912451aaa1293223fe Mon Sep 17 00:00:00 2001 From: Jon Date: Tue, 14 Jan 2025 07:36:23 +0100 Subject: [PATCH 050/123] feat: refs #8247 added new acl for VnUser model --- db/versions/11407-turquoiseTulip/00-firstScript.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 db/versions/11407-turquoiseTulip/00-firstScript.sql diff --git a/db/versions/11407-turquoiseTulip/00-firstScript.sql b/db/versions/11407-turquoiseTulip/00-firstScript.sql new file mode 100644 index 000000000..72d29061d --- /dev/null +++ b/db/versions/11407-turquoiseTulip/00-firstScript.sql @@ -0,0 +1,2 @@ +INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId) + VALUES ('VnUser','adminUser','WRITE','ALLOW','ROLE','sysadmin'); \ No newline at end of file From 6aa898ee596b29347fba4e88f3bd712cd4be3e19 Mon Sep 17 00:00:00 2001 From: alexm Date: Tue, 14 Jan 2025 07:39:52 +0100 Subject: [PATCH 051/123] build: refs #8389 dump db --- db/dump/.dump/data.sql | 31 ++++++++++++++++----------- db/dump/.dump/privileges.sql | 4 ++++ db/dump/.dump/structure.sql | 41 +++++++++++++++++++++++------------- db/dump/.dump/triggers.sql | 2 +- 4 files changed, 50 insertions(+), 28 deletions(-) diff --git a/db/dump/.dump/data.sql b/db/dump/.dump/data.sql index a2df34218..b95890b0d 100644 --- a/db/dump/.dump/data.sql +++ b/db/dump/.dump/data.sql @@ -4,7 +4,7 @@ USE `util`; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -INSERT INTO `version` VALUES ('vn-database','11385','72bf27f08d3ddf646ec0bb6594fc79cecd4b72f2','2025-01-07 07:46:33','11395'); +INSERT INTO `version` VALUES ('vn-database','11391','43edb1f82e88dcc44eedc8501b93c1fac66d71e9','2025-01-14 07:32:09','11407'); INSERT INTO `versionLog` VALUES ('vn-database','10107','00-firstScript.sql','jenkins@10.0.2.69','2022-04-23 10:53:53',NULL,NULL); INSERT INTO `versionLog` VALUES ('vn-database','10112','00-firstScript.sql','jenkins@10.0.2.69','2022-05-09 09:14:53',NULL,NULL); @@ -1078,6 +1078,7 @@ INSERT INTO `versionLog` VALUES ('vn-database','11315','00-firstScript.sql','jen INSERT INTO `versionLog` VALUES ('vn-database','11316','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:05:30',NULL,NULL); INSERT INTO `versionLog` VALUES ('vn-database','11317','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:05:30',NULL,NULL); INSERT INTO `versionLog` VALUES ('vn-database','11319','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:05:30',NULL,NULL); +INSERT INTO `versionLog` VALUES ('vn-database','11320','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2025-01-14 07:32:07',NULL,NULL); INSERT INTO `versionLog` VALUES ('vn-database','11321','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-26 07:05:30',NULL,NULL); INSERT INTO `versionLog` VALUES ('vn-database','11322','00-entryAcl.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-12-10 07:20:04',NULL,NULL); INSERT INTO `versionLog` VALUES ('vn-database','11324','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-13 10:49:47',NULL,NULL); @@ -1139,6 +1140,9 @@ INSERT INTO `versionLog` VALUES ('vn-database','11379','00-firstScript.sql','jen INSERT INTO `versionLog` VALUES ('vn-database','11379','01-secScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2025-01-07 07:46:32',NULL,NULL); INSERT INTO `versionLog` VALUES ('vn-database','11384','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2025-01-07 07:46:32',NULL,NULL); INSERT INTO `versionLog` VALUES ('vn-database','11385','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2025-01-07 07:46:33',NULL,NULL); +INSERT INTO `versionLog` VALUES ('vn-database','11390','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2025-01-14 07:32:08',NULL,NULL); +INSERT INTO `versionLog` VALUES ('vn-database','11391','00-itemAlter.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2025-01-14 07:32:08',NULL,NULL); +INSERT INTO `versionLog` VALUES ('vn-database','11400','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2025-01-09 09:55:24',NULL,NULL); /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; @@ -1515,6 +1519,7 @@ INSERT INTO `roleInherit` VALUES (378,101,15,19294); INSERT INTO `roleInherit` VALUES (379,103,121,19294); INSERT INTO `roleInherit` VALUES (381,119,123,19295); INSERT INTO `roleInherit` VALUES (382,48,72,783); +INSERT INTO `roleInherit` VALUES (383,114,111,19295); INSERT INTO `userPassword` VALUES (1,7,1,0,2,1); @@ -2311,9 +2316,9 @@ INSERT INTO `ACL` VALUES (938,'Worker','__get__mail','READ','ALLOW','ROLE','hr', INSERT INTO `ACL` VALUES (939,'Machine','*','*','ALLOW','ROLE','productionBoss',10578); INSERT INTO `ACL` VALUES (940,'ItemTypeLog','find','READ','ALLOW','ROLE','employee',10578); INSERT INTO `ACL` VALUES (941,'Entry','buyLabel','READ','ALLOW','ROLE','employee',10578); -INSERT INTO `ACL` VALUES (942,'Cmr','filter','READ','ALLOW','ROLE','production',10578); -INSERT INTO `ACL` VALUES (943,'Cmr','downloadZip','READ','ALLOW','ROLE','production',10578); -INSERT INTO `ACL` VALUES (944,'Cmr','print','READ','ALLOW','ROLE','production',10578); +INSERT INTO `ACL` VALUES (942,'Cmr','filter','READ','ALLOW','ROLE','employee',19295); +INSERT INTO `ACL` VALUES (943,'Cmr','downloadZip','READ','ALLOW','ROLE','employee',19295); +INSERT INTO `ACL` VALUES (944,'Cmr','print','READ','ALLOW','ROLE','employee',19295); INSERT INTO `ACL` VALUES (945,'Collection','create','WRITE','ALLOW','ROLE','productionBoss',10578); INSERT INTO `ACL` VALUES (946,'Collection','upsert','WRITE','ALLOW','ROLE','productionBoss',10578); INSERT INTO `ACL` VALUES (947,'Collection','replaceById','WRITE','ALLOW','ROLE','productionBoss',10578); @@ -2327,7 +2332,6 @@ INSERT INTO `ACL` VALUES (954,'RouteComplement','find','READ','ALLOW','ROLE','de INSERT INTO `ACL` VALUES (955,'RouteComplement','create','WRITE','ALLOW','ROLE','delivery',10578); INSERT INTO `ACL` VALUES (956,'RouteComplement','deleteById','WRITE','ALLOW','ROLE','delivery',10578); INSERT INTO `ACL` VALUES (957,'SaleGroup','find','READ','ALLOW','ROLE','production',10578); -INSERT INTO `ACL` VALUES (958,'Worker','canCreateAbsenceInPast','WRITE','ALLOW','ROLE','hr',10578); INSERT INTO `ACL` VALUES (959,'WorkerRelative','updateAttributes','*','ALLOW','ROLE','hr',10578); INSERT INTO `ACL` VALUES (960,'WorkerRelative','crud','WRITE','ALLOW','ROLE','hr',10578); INSERT INTO `ACL` VALUES (961,'WorkerRelative','findById','*','ALLOW','ROLE','hr',10578); @@ -2383,6 +2387,8 @@ INSERT INTO `ACL` VALUES (1010,'InventoryConfig','find','READ','ALLOW','ROLE','b INSERT INTO `ACL` VALUES (1011,'SiiTypeInvoiceIn','find','READ','ALLOW','ROLE','salesPerson',10578); INSERT INTO `ACL` VALUES (1012,'OsrmConfig','optimize','READ','ALLOW','ROLE','employee',10578); INSERT INTO `ACL` VALUES (1013,'Route','optimizePriority','*','ALLOW','ROLE','employee',10578); +INSERT INTO `ACL` VALUES (1014,'Worker','canModifyAbsenceInPast','WRITE','ALLOW','ROLE','hr',10578); +INSERT INTO `ACL` VALUES (1015,'Worker','__get__sip','READ','ALLOW','ROLE','employee',19294); INSERT INTO `fieldAcl` VALUES (1,'Client','name','update','employee'); INSERT INTO `fieldAcl` VALUES (2,'Client','contact','update','employee'); @@ -2725,7 +2731,7 @@ INSERT INTO `department` VALUES (124,NULL,'CONTROL INTERNO',122,123,NULL,72,0,0, INSERT INTO `department` VALUES (125,'spainTeam3','EQUIPO ESPAÑA 3',59,60,1118,0,0,0,2,0,43,'/1/43/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL); INSERT INTO `department` VALUES (126,NULL,'PRESERVADO',29,30,NULL,0,0,0,2,0,37,'/1/37/',NULL,0,NULL,0,1,1,0,NULL,NULL,NULL,NULL); INSERT INTO `department` VALUES (128,NULL,'PALETIZADO',31,32,NULL,0,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,'PALLETIZING'); -INSERT INTO `department` VALUES (130,NULL,'REVISION',33,34,NULL,0,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,1,NULL,NULL,NULL,'ON_CHECKING'); +INSERT INTO `department` VALUES (130,'reviewers','REVISION',33,34,NULL,0,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,1,NULL,NULL,NULL,'ON_CHECKING'); INSERT INTO `department` VALUES (131,'greenhouse','INVERNADERO',105,106,NULL,0,0,0,2,0,58,'/1/58/',NULL,0,NULL,0,1,0,0,NULL,NULL,NULL,NULL); INSERT INTO `department` VALUES (132,NULL,'EQUIPO DC',61,62,1731,0,0,0,2,0,43,'/1/43/','dc_equipo',1,'gestioncomercial@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL); INSERT INTO `department` VALUES (133,'franceTeamManagement','EQUIPO GESTIÓN FRANCIA',63,64,9751,72,0,0,2,0,43,'/1/43/','fr_equipo',1,'gestionfrancia@verdnatura.es',0,0,0,0,NULL,NULL,'3300',NULL); @@ -2740,12 +2746,12 @@ INSERT INTO `department` VALUES (146,NULL,'VERDNACOLOMBIA',3,4,NULL,72,0,0,2,0,2 INSERT INTO `department` VALUES (147,'spainTeamAsia','EQUIPO ESPAÑA ASIA',71,72,40214,0,0,0,2,0,43,'/1/43/','esA_equipo',1,'esA@verdnatura.es',0,0,0,0,NULL,NULL,'5500',NULL); INSERT INTO `department` VALUES (148,'franceTeamCatchment','EQUIPO CAPTACIÓN FRANCIA',73,74,25178,0,0,0,2,0,43,'/1/43/',NULL,1,NULL,0,0,0,0,NULL,NULL,'6000',NULL); INSERT INTO `department` VALUES (149,'spainTeamCatchment','EQUIPO ESPAÑA CAPTACIÓN',75,76,1203,0,0,0,2,0,43,'/1/43/','es_captacion_equipo',1,'es_captacion@verdnatura.es',0,0,0,0,NULL,NULL,'5700',NULL); -INSERT INTO `department` VALUES (150,'spainTeamLevanteIslands','EQUIPO ESPAÑA LEVANTE',77,78,1118,0,0,0,2,0,43,'/1/43/','es_levante_equipo',1,'levanteislas.verdnatura@gmail.com',0,0,0,0,NULL,NULL,'5000',NULL); -INSERT INTO `department` VALUES (151,'spainTeamNorthwest','EQUIPO ESPAÑA NOROESTE',79,80,7102,0,0,0,2,0,43,'/1/43/','es_noroeste_equipo',1,'noroeste.verdnatura@gmail.com',0,0,0,0,NULL,NULL,'5300',NULL); -INSERT INTO `department` VALUES (152,'spainTeamNortheast','EQUIPO ESPAÑA NORESTE',81,82,1118,0,0,0,2,0,43,'/1/43/','es_noreste_equipo',1,'noreste.verdnatura@gmail.com',0,0,0,0,NULL,NULL,'5200',NULL); -INSERT INTO `department` VALUES (153,'spainTeamSouth','EQUIPO ESPAÑA SUR',83,84,36578,0,0,0,2,0,43,'/1/43/','es_sur_equipo',1,'sur.verdnatura@gmail.com',0,0,0,0,NULL,NULL,'5400',NULL); -INSERT INTO `department` VALUES (154,'spainTeamCenter','EQUIPO ESPAÑA CENTRO',85,86,4661,0,0,0,2,0,43,'/1/43/','es_centro_equipo',1,'centro.verdnatura@gmail.com',0,0,0,0,NULL,NULL,'5100',NULL); -INSERT INTO `department` VALUES (155,'spainTeamVip','EQUIPO ESPAÑA VIP',87,88,5432,0,0,0,2,0,43,'/1/43/','es_vip_equipo',1,'vip.verdnatura@gmail.com',0,0,0,0,NULL,NULL,'5600',NULL); +INSERT INTO `department` VALUES (150,'spainTeamLevanteIslands','EQUIPO ESPAÑA LEVANTE',77,78,1118,0,0,0,2,0,43,'/1/43/','es_levante_equipo',1,'es_levante@verdnatura.es',0,0,0,0,NULL,NULL,'5000',NULL); +INSERT INTO `department` VALUES (151,'spainTeamNorthwest','EQUIPO ESPAÑA NOROESTE',79,80,7102,0,0,0,2,0,43,'/1/43/','es_noroeste_equipo',1,'es_noroeste@verdnatura.es',0,0,0,0,NULL,NULL,'5300',NULL); +INSERT INTO `department` VALUES (152,'spainTeamNortheast','EQUIPO ESPAÑA NORESTE',81,82,1118,0,0,0,2,0,43,'/1/43/','es_noreste_equipo',1,'es_noreste@verdnatura.es',0,0,0,0,NULL,NULL,'5200',NULL); +INSERT INTO `department` VALUES (153,'spainTeamSouth','EQUIPO ESPAÑA SUR',83,84,36578,0,0,0,2,0,43,'/1/43/','es_sur_equipo',1,'es_sur@verdnatura.es',0,0,0,0,NULL,NULL,'5400',NULL); +INSERT INTO `department` VALUES (154,'spainTeamCenter','EQUIPO ESPAÑA CENTRO',85,86,4661,0,0,0,2,0,43,'/1/43/','es_centro_equipo',1,'es_centro@verdnatura.es',0,0,0,0,NULL,NULL,'5100',NULL); +INSERT INTO `department` VALUES (155,'spainTeamVip','EQUIPO ESPAÑA VIP',87,88,5432,0,0,0,2,0,43,'/1/43/','es_vip_equipo',1,'es_vip@verdnatura.es',0,0,0,0,NULL,NULL,'5600',NULL); INSERT INTO `docuware` VALUES (1,'deliveryNote','Albaranes cliente','find','find','N__ALBAR_N',NULL); INSERT INTO `docuware` VALUES (2,'deliveryNote','Albaranes cliente','store','Archivar','N__ALBAR_N',NULL); @@ -3046,6 +3052,7 @@ INSERT INTO `message` VALUES (20,'clientNotVerified','Incomplete tax data, pleas INSERT INTO `message` VALUES (21,'quantityLessThanMin','The quantity cannot be less than the minimum'); INSERT INTO `message` VALUES (22,'ORDER_ROW_UNAVAILABLE','The ordered quantity exceeds the available'); INSERT INTO `message` VALUES (23,'AMOUNT_NOT_MATCH_GROUPING','The quantity ordered does not match the grouping'); +INSERT INTO `message` VALUES (24,'orderLinesWithZero','There are empty lines. Please delete them'); INSERT INTO `metatag` VALUES (2,'title','Verdnatura Levante SL, mayorista de flores, plantas y complementos para floristería y decoración'); INSERT INTO `metatag` VALUES (3,'description','Verdnatura Levante SL, mayorista de flores, plantas y complementos para floristería y decoración. Envío a toda España, pedidos por internet o por teléfono.'); diff --git a/db/dump/.dump/privileges.sql b/db/dump/.dump/privileges.sql index 460256b56..598bfdf75 100644 --- a/db/dump/.dump/privileges.sql +++ b/db/dump/.dump/privileges.sql @@ -1494,6 +1494,10 @@ INSERT IGNORE INTO `tables_priv` VALUES ('','vn','grafana','travelThermograph',' INSERT IGNORE INTO `tables_priv` VALUES ('','vn','grafana','thermograph','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select',''); INSERT IGNORE INTO `tables_priv` VALUES ('','vn2008','buyerSalesAssistant','Tickets','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Update',''); INSERT IGNORE INTO `tables_priv` VALUES ('','vn','hr','sim','jenkins@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select,Insert,Update,Delete',''); +INSERT IGNORE INTO `tables_priv` VALUES ('','vn','employee','zoneGeo','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select',''); +INSERT IGNORE INTO `tables_priv` VALUES ('','vn','buyer','itemCampaign','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select',''); +INSERT IGNORE INTO `tables_priv` VALUES ('','vn','grafana','itemCampaign','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select',''); +INSERT IGNORE INTO `tables_priv` VALUES ('','vn','buyer','campaign','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select',''); /*!40000 ALTER TABLE `tables_priv` ENABLE KEYS */; /*!40000 ALTER TABLE `columns_priv` DISABLE KEYS */; diff --git a/db/dump/.dump/structure.sql b/db/dump/.dump/structure.sql index e52ed2a51..58f1e7591 100644 --- a/db/dump/.dump/structure.sql +++ b/db/dump/.dump/structure.sql @@ -6249,19 +6249,27 @@ BEGIN * @param vDateFrom Fecha desde * @param vDateTo Fecha hasta */ - IF vDateFrom IS NULL THEN - SET vDateFrom = util.VN_CURDATE() - INTERVAL WEEKDAY(util.VN_CURDATE()) DAY; + DECLARE vDaysInYear INT; + SET vDaysInYear = DATEDIFF(util.lastDayOfYear(CURDATE()), util.firstDayOfYear(CURDATE())); + + SET vDateFrom = COALESCE(vDateFrom, util.VN_CURDATE()); + SET vDateTo = COALESCE(vDateTo, util.VN_CURDATE()); + + IF DATEDIFF(vDateTo, vDateFrom) > vDaysInYear THEN + CALL util.throw('The period cannot be longer than one year'); END IF; - IF vDateTo IS NULL THEN - SET vDateTo = vDateFrom + INTERVAL 6 DAY; - END IF; + -- Obtiene el primer día de la semana de esa fecha + SET vDateFrom = DATE_SUB(vDateFrom, INTERVAL ((WEEKDAY(vDateFrom) + 1) % 7) DAY); + + -- Obtiene el último día de la semana de esa fecha + SET vDateTo = DATE_ADD(vDateTo, INTERVAL (6 - ((WEEKDAY(vDateTo) + 1) % 7)) DAY); CALL cache.last_buy_refresh(FALSE); REPLACE bs.waste - SELECT YEAR(t.shipped), - WEEK(t.shipped, 4), + SELECT YEARWEEK(t.shipped, 6) DIV 100, + WEEK(t.shipped, 6), it.workerFk, it.id, s.itemFk, @@ -6307,9 +6315,9 @@ BEGIN JOIN cache.last_buy lb ON lb.item_id = i.id AND lb.warehouse_id = w.id JOIN vn.buy b ON b.id = lb.buy_id - WHERE t.shipped BETWEEN vDateFrom AND vDateTo + WHERE t.shipped BETWEEN vDateFrom AND util.dayEnd(vDateTo) AND w.isManaged - GROUP BY YEAR(t.shipped), WEEK(t.shipped, 4), i.id; + GROUP BY YEARWEEK(t.shipped, 6) DIV 100, WEEK(t.shipped, 6), i.id; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -13807,7 +13815,7 @@ BEGIN ) INTO vHas0Amount; IF vHas0Amount THEN - CALL util.throw('Hay líneas vacías. Por favor, elimínelas'); + CALL util.throw('orderLinesWithZero'); END IF; START TRANSACTION; @@ -28922,6 +28930,7 @@ CREATE TABLE `country` ( `isSocialNameUnique` tinyint(1) NOT NULL DEFAULT 1, PRIMARY KEY (`id`), UNIQUE KEY `country_unique` (`code`), + UNIQUE KEY `country_unique_name` (`name`), KEY `currency_id_fk_idx` (`currencyFk`), KEY `country_Ix4` (`name`), KEY `continent_id_fk_idx` (`continentFk`), @@ -31971,6 +31980,7 @@ CREATE TABLE `item` ( `value12` varchar(50) DEFAULT NULL, `tag13` varchar(20) DEFAULT NULL, `value13` varchar(50) DEFAULT NULL, + `isCustomInspectionRequired` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'Indicates if the item requires physical inspection at customs', PRIMARY KEY (`id`), UNIQUE KEY `item_supplyResponseFk_idx` (`supplyResponseFk`), KEY `Color` (`inkFk`), @@ -68661,10 +68671,11 @@ BEGIN TRUE, sc.userFk, s.id - FROM vn.sectorCollection sc - JOIN vn.sectorCollectionSaleGroup scsg ON scsg.sectorCollectionFk = sc.id - JOIN vn.saleGroupDetail sgd ON sgd.saleGroupFk = scsg.saleGroupFk - JOIN vn.state s ON s.code = 'OK PREVIOUS' + FROM sectorCollection sc + JOIN sectorCollectionSaleGroup scsg ON scsg.sectorCollectionFk = sc.id + JOIN saleGroupDetail sgd ON sgd.saleGroupFk = scsg.saleGroupFk + JOIN state s ON s.code = 'OK PREVIOUS' + JOIN itemShelvingSale iss ON iss.saleFk = sgd.saleFk WHERE sc.id = vSectorCollectionFk; END ;; DELIMITER ; @@ -90882,4 +90893,4 @@ USE `vn2008`; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2025-01-07 6:51:38 +-- Dump completed on 2025-01-14 6:39:04 diff --git a/db/dump/.dump/triggers.sql b/db/dump/.dump/triggers.sql index 039dbb2a8..fb72e9899 100644 --- a/db/dump/.dump/triggers.sql +++ b/db/dump/.dump/triggers.sql @@ -11499,4 +11499,4 @@ USE `vn2008`; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2025-01-07 6:51:57 +-- Dump completed on 2025-01-14 6:39:25 From 44765b5a64dc00913c59b83776c1c7fbd10df7a7 Mon Sep 17 00:00:00 2001 From: jgallego Date: Tue, 14 Jan 2025 09:07:00 +0100 Subject: [PATCH 052/123] feat: refs #8361 add hasToDownloadRate field to currency model and update exchange rate logic --- db/dump/fixtures.before.sql | 12 +++++------ .../11406-bronzeMoss/00-currrencyAlter.sql | 2 ++ .../11406-bronzeMoss/01-currrencyUpdate.sql | 3 +++ .../methods/invoice-in/exchangeRateUpdate.js | 21 +++++-------------- modules/travel/back/models/currency.json | 3 +++ 5 files changed, 19 insertions(+), 22 deletions(-) create mode 100644 db/versions/11406-bronzeMoss/00-currrencyAlter.sql create mode 100644 db/versions/11406-bronzeMoss/01-currrencyUpdate.sql diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index ff896b84d..788854b4e 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -158,13 +158,13 @@ INSERT INTO `account`.`mailForward`(`account`, `forwardTo`) -INSERT INTO `vn`.`currency`(`id`, `code`, `name`, `ratio`) +INSERT INTO `vn`.`currency`(`id`, `code`, `name`, `ratio`, `hasToDownloadRate`) VALUES - (1, 'EUR', 'Euro', 1), - (2, 'USD', 'Dollar USA', 1.4), - (3, 'GBP', 'Libra', 1), - (4, 'JPY', 'Yen Japones', 1), - (5, 'CNY', 'Yuan Chino', 1.2); + (1, 'EUR', 'Euro', 1, FALSE), + (2, 'USD', 'Dollar USA', 1.4, TRUE), + (3, 'GBP', 'Libra', 1, TRUE), + (4, 'JPY', 'Yen Japones', 1, FALSE), + (5, 'CNY', 'Yuan Chino', 1.2, TRUE); INSERT INTO `vn`.`country`(`id`, `name`, `isUeeMember`, `code`, `currencyFk`, `ibanLength`, `continentFk`, `hasDailyInvoice`, `CEE`) VALUES diff --git a/db/versions/11406-bronzeMoss/00-currrencyAlter.sql b/db/versions/11406-bronzeMoss/00-currrencyAlter.sql new file mode 100644 index 000000000..86465545e --- /dev/null +++ b/db/versions/11406-bronzeMoss/00-currrencyAlter.sql @@ -0,0 +1,2 @@ +ALTER TABLE `vn`.`currency` +ADD COLUMN `hasToDownloadRate` TINYINT(1) NOT NULL DEFAULT 0 comment 'Si se guarda el tipo de cambio diariamente en referenceRate'; diff --git a/db/versions/11406-bronzeMoss/01-currrencyUpdate.sql b/db/versions/11406-bronzeMoss/01-currrencyUpdate.sql new file mode 100644 index 000000000..5e0882de2 --- /dev/null +++ b/db/versions/11406-bronzeMoss/01-currrencyUpdate.sql @@ -0,0 +1,3 @@ +UPDATE `vn`.`currency` + SET `hasToDownloadRate` = TRUE + WHERE `code` IN ('USD', 'CNY', 'GBP'); diff --git a/modules/invoiceIn/back/methods/invoice-in/exchangeRateUpdate.js b/modules/invoiceIn/back/methods/invoice-in/exchangeRateUpdate.js index a6bad405f..99ff4cd79 100644 --- a/modules/invoiceIn/back/methods/invoice-in/exchangeRateUpdate.js +++ b/modules/invoiceIn/back/methods/invoice-in/exchangeRateUpdate.js @@ -36,6 +36,7 @@ module.exports = Self => { if (!cubes || cubes.length === 0) throw new UserError('No cubes found. Exiting the method.'); + const currencies = await models.Currency.find({where: {hasToDownloadRate: true}}, myOptions); const maxDateRecord = await models.ReferenceRate.findOne({order: 'dated DESC'}, myOptions); const maxDate = maxDateRecord?.dated ? new Date(maxDateRecord.dated) : null; let lastProcessedDate = maxDate; @@ -51,32 +52,20 @@ module.exports = Self => { if (!maxDate || xmlDateWithoutTime > maxDate) { if (lastProcessedDate && xmlDateWithoutTime > lastProcessedDate) { - for (const code of ['USD', 'CNY', 'GBP']) { - const currency = await models.Currency.findOne( - {where: {code}}, - myOptions - ); - if (!currency) - throw new UserError(`Currency not found for code: ${code}`); - + for (const currency of currencies) { await fillMissingDates( models, currency, lastProcessedDate, xmlDateWithoutTime, myOptions ); } } } + for (const rateCube of Array.from(cube.childNodes)) { if (rateCube.nodeType === doc.ELEMENT_NODE) { const currencyCode = rateCube.getAttribute('currency'); const rate = rateCube.getAttribute('rate'); - if (['USD', 'CNY', 'GBP'].includes(currencyCode)) { - const currency = await models.Currency.findOne( - {where: {code: currencyCode}}, - myOptions - ); - if (!currency) - throw new UserError(`Currency not found for code: ${currencyCode}`); - + const currency = currencies.find(c => c.code === currencyCode); + if (currency) { const existingRate = await models.ReferenceRate.findOne({ where: {currencyFk: currency.id, dated: xmlDateWithoutTime} }, myOptions); diff --git a/modules/travel/back/models/currency.json b/modules/travel/back/models/currency.json index f3241fad1..427a18e31 100644 --- a/modules/travel/back/models/currency.json +++ b/modules/travel/back/models/currency.json @@ -20,6 +20,9 @@ }, "ratio": { "type": "number" + }, + "hasToDownloadRate": { + "type": "boolean" } }, "acls": [ From e273733832016b0916fa7cccff42a46f1f89a5b6 Mon Sep 17 00:00:00 2001 From: alexm Date: Tue, 14 Jan 2025 09:33:26 +0100 Subject: [PATCH 053/123] refactor: order by id --- modules/invoiceOut/back/methods/invoiceOut/clientsToInvoice.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/invoiceOut/back/methods/invoiceOut/clientsToInvoice.js b/modules/invoiceOut/back/methods/invoiceOut/clientsToInvoice.js index f66221409..78fce348e 100644 --- a/modules/invoiceOut/back/methods/invoiceOut/clientsToInvoice.js +++ b/modules/invoiceOut/back/methods/invoiceOut/clientsToInvoice.js @@ -74,7 +74,8 @@ module.exports = Self => { AND t.companyFk = ? AND NOT t.isDeleted GROUP BY IF(c.hasToInvoiceByAddress, a.id, c.id) - HAVING SUM(t.totalWithVat) > 0;`; + HAVING SUM(t.totalWithVat) > 0 + ORDER BY c.id`; const addresses = await Self.rawSql(query, [ minShipped, From 01072f7cbc394f4fa7f68768a0c3a5e6c081a417 Mon Sep 17 00:00:00 2001 From: carlossa Date: Tue, 14 Jan 2025 11:36:54 +0100 Subject: [PATCH 054/123] fix: hotfix 7366 6943 --- modules/client/back/models/client-credit.json | 5 ++++- modules/travel/back/methods/travel/filter.js | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/modules/client/back/models/client-credit.json b/modules/client/back/models/client-credit.json index b92639b80..b57374dc3 100644 --- a/modules/client/back/models/client-credit.json +++ b/modules/client/back/models/client-credit.json @@ -19,6 +19,9 @@ }, "created": { "type": "date" + }, + "workerFk": { + "type": "number" } }, "relations": { @@ -33,4 +36,4 @@ "foreignKey": "workerFk" } } -} \ No newline at end of file +} diff --git a/modules/travel/back/methods/travel/filter.js b/modules/travel/back/methods/travel/filter.js index 30c1a45fa..d10ff080b 100644 --- a/modules/travel/back/methods/travel/filter.js +++ b/modules/travel/back/methods/travel/filter.js @@ -91,6 +91,11 @@ module.exports = Self => { arg: 'landed', type: 'date', description: 'The landed date' + }, + { + arg: 'awbFk', + type: 'number', + description: 'The awbFk id' } ], returns: { @@ -168,7 +173,9 @@ module.exports = Self => { t.totalEntries, t.isRaid, t.daysInForward, + t.awbFk, am.name agencyModeName, + a.code awbCode, win.name warehouseInName, wout.name warehouseOutName, cnt.code continent @@ -176,6 +183,7 @@ module.exports = Self => { JOIN vn.agencyMode am ON am.id = t.agencyModeFk JOIN vn.warehouse win ON win.id = t.warehouseInFk JOIN vn.warehouse wout ON wout.id = t.warehouseOutFk + JOIN vn.awb a ON a.id = t.awbFk JOIN warehouse wo ON wo.id = t.warehouseOutFk JOIN country c ON c.id = wo.countryFk LEFT JOIN continent cnt ON cnt.id = c.continentFk) AS t` From 849bcd1ff55633de28469dfd812b21a6cb9805b6 Mon Sep 17 00:00:00 2001 From: robert Date: Tue, 14 Jan 2025 13:39:43 +0100 Subject: [PATCH 055/123] feat: refs #6629 test back updateObservations --- .../client/specs/updateAddress.spec.js | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/modules/client/back/methods/client/specs/updateAddress.spec.js b/modules/client/back/methods/client/specs/updateAddress.spec.js index 0453332d7..e8d6bb8d8 100644 --- a/modules/client/back/methods/client/specs/updateAddress.spec.js +++ b/modules/client/back/methods/client/specs/updateAddress.spec.js @@ -157,4 +157,57 @@ describe('Address updateAddress', () => { throw e; } }); + + fit('should update ticket observations when updateObservations is true', async() => { + const tx = await models.Client.beginTransaction({}); + const client = 1103; + const address = 123; + const ticket = 31; + const observationType = 3; + + const salesAssistantId = 21; + const addressObservation = 'nuevo texto'; + const ticketObservation = 'texto a modificar'; + + try { + const options = {transaction: tx}; + ctx.req.accessToken.userId = salesAssistantId; + ctx.args = { + updateObservations: true, + incotermsFk: incotermsId, + provinceFk: provinceId, + customsAgentFk: customAgentOneId + }; + + await models.AddressObservation.create({ + addressFk: address, + observationTypeFk: observationType, + description: addressObservation + }, options); + + await models.TicketObservation.create({ + ticketFk: ticket, + observationTypeFk: observationType, + description: ticketObservation + }, options); + + await models.Client.updateAddress(ctx, client, address, options); + + const updatedObservation = await models.TicketObservation.findOne({ + where: {ticketFk: ticket, observationTypeFk: observationType} + }, options); + + // const address = await models.Address.findById(addressId, null, options); + + // const addressObservation = await models.addressObservation.findById(addressId, null, options); + + expect(updatedObservation).toEqual(addressObservation); + // expect(1).toEqual(1); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); }); From 807ddf07ad33b8fd77aa81b0ddb5d31b3190ecfb Mon Sep 17 00:00:00 2001 From: robert Date: Wed, 15 Jan 2025 07:31:49 +0100 Subject: [PATCH 056/123] feat: refs #6629 test back --- .../back/methods/client/specs/updateAddress.spec.js | 9 ++------- modules/client/back/methods/client/updateAddress.js | 2 +- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/modules/client/back/methods/client/specs/updateAddress.spec.js b/modules/client/back/methods/client/specs/updateAddress.spec.js index e8d6bb8d8..233ab9ccb 100644 --- a/modules/client/back/methods/client/specs/updateAddress.spec.js +++ b/modules/client/back/methods/client/specs/updateAddress.spec.js @@ -158,7 +158,7 @@ describe('Address updateAddress', () => { } }); - fit('should update ticket observations when updateObservations is true', async() => { + it('should update ticket observations when updateObservations is true', async() => { const tx = await models.Client.beginTransaction({}); const client = 1103; const address = 123; @@ -197,12 +197,7 @@ describe('Address updateAddress', () => { where: {ticketFk: ticket, observationTypeFk: observationType} }, options); - // const address = await models.Address.findById(addressId, null, options); - - // const addressObservation = await models.addressObservation.findById(addressId, null, options); - - expect(updatedObservation).toEqual(addressObservation); - // expect(1).toEqual(1); + expect(updatedObservation.description).toEqual(addressObservation); await tx.rollback(); } catch (e) { diff --git a/modules/client/back/methods/client/updateAddress.js b/modules/client/back/methods/client/updateAddress.js index 69e288db3..e6e5adb45 100644 --- a/modules/client/back/methods/client/updateAddress.js +++ b/modules/client/back/methods/client/updateAddress.js @@ -148,7 +148,7 @@ module.exports = function(Self) { SET to2.description = ao.description WHERE ao.observationTypeFk = to2.observationTypeFk AND a.id = ? - AND t.shipped >= util.VN_CURDATE()`, [addressId]); + AND t.shipped >= util.VN_CURDATE()`, [addressId], myOptions); } return updatedAddress; From 93c9ef6f4cbb3e4b2d752019e4b374fefe09eb23 Mon Sep 17 00:00:00 2001 From: robert Date: Wed, 15 Jan 2025 10:25:21 +0100 Subject: [PATCH 057/123] feat: refs #8387 changes --- loopback/locale/en.json | 7 ++++--- loopback/locale/es.json | 5 +++-- modules/item/back/models/item-tag.js | 14 ++++++-------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/loopback/locale/en.json b/loopback/locale/en.json index 8d5eab4bc..4fe11c2b6 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -211,7 +211,7 @@ "Name should be uppercase": "Name should be uppercase", "You cannot update these fields": "You cannot update these fields", "CountryFK cannot be empty": "Country cannot be empty", - "No tickets to invoice": "There are no tickets to invoice that meet the invoicing requirements", + "No tickets to invoice": "There are no tickets to invoice that meet the invoicing requirements", "You are not allowed to modify the alias": "You are not allowed to modify the alias", "You already have the mailAlias": "You already have the mailAlias", "This machine is already in use.": "This machine is already in use.", @@ -251,5 +251,6 @@ "Holidays to past days not available": "Holidays to past days not available", "Price cannot be blank": "Price cannot be blank", "There are tickets to be invoiced": "There are tickets to be invoiced", - "The address of the customer must have information about Incoterms and Customs Agent": "The address of the customer must have information about Incoterms and Customs Agent" -} + "The address of the customer must have information about Incoterms and Customs Agent": "The address of the customer must have information about Incoterms and Customs Agent", + "The value must be a number or a range of numbers": "The value must be a number or a range of numbers" +} \ No newline at end of file diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 5558c0964..9a24f84ba 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -398,5 +398,6 @@ "Holidays to past days not available": "Las vacaciones a días pasados no están disponibles", "All tickets have a route order": "Todos los tickets tienen orden de ruta", "Price cannot be blank": "Price cannot be blank", - "There are tickets to be invoiced": "La zona tiene tickets por facturar" -} + "There are tickets to be invoiced": "La zona tiene tickets por facturar", + "The value must be a number or a range of numbers": "The value must be a number or a range of numbers" +} \ No newline at end of file diff --git a/modules/item/back/models/item-tag.js b/modules/item/back/models/item-tag.js index 338ef64cf..4c1ef4d4a 100644 --- a/modules/item/back/models/item-tag.js +++ b/modules/item/back/models/item-tag.js @@ -19,17 +19,15 @@ module.exports = Self => { if (ctx.isNewInstance) { tagFk = ctx.instance.tagFk; value = ctx.instance.value; + } else { + tagFk = ctx.currentInstance.tagFk; + value = ctx.data.value; } - const newData = ctx.data.value || null; - const currentData = ctx.currentInstance.value || null; const models = Self.app.models; - const validTag = await models.Tag.findOne({where: {name: 'Longitud(cm)'}}); + const validTag = await models.Tag.findOne({where: {name: 'Longitud(m)'}}); - if (tagFk === validTag.id || (currentData && currentData === validTag.id)) { - if ( - (value && !validValue.test(value)) || - (newData && !validValue.test(newData)) - ) + if (tagFk === validTag.id) { + if ((value && !validValue.test(value))) throw new UserError('The value must be a number or a range of numbers'); } }); From c2ca9cfbe5ca58a699660d6dd437c4291a480f8e Mon Sep 17 00:00:00 2001 From: guillermo Date: Wed, 15 Jan 2025 12:26:16 +0100 Subject: [PATCH 058/123] feat: refs #7531 Added address_hasDelivery --- .../vn/functions/address_hasDelivery.sql | 24 +++++++++++++++++++ .../vn/procedures/zone_getAddresses.sql | 4 +++- 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 db/routines/vn/functions/address_hasDelivery.sql diff --git a/db/routines/vn/functions/address_hasDelivery.sql b/db/routines/vn/functions/address_hasDelivery.sql new file mode 100644 index 000000000..f37edbd34 --- /dev/null +++ b/db/routines/vn/functions/address_hasDelivery.sql @@ -0,0 +1,24 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`address_hasDelivery`(vSelf INT, vLanded DATE) + RETURNS BOOL + DETERMINISTIC +BEGIN +/** + * Retorna si hay reparto disponible para + * la dirección y fecha solicitada. + * + * @param vSelf Id de dirección de envío + * @param vLanded Fecha de entrega + * @return true|false + */ + DECLARE vHasDelivery BOOL; + + CALL zone_getAgency(vSelf, vLanded); + + SELECT EXISTS (SELECT TRUE FROM tmp.zoneGetAgency) INTO vHasDelivery; + + RETURN vHasDelivery; + + DROP TEMPORARY TABLE tmp.zoneGetAgency; +END$$ +DELIMITER ; diff --git a/db/routines/vn/procedures/zone_getAddresses.sql b/db/routines/vn/procedures/zone_getAddresses.sql index 2e5982c82..0e52abe1c 100644 --- a/db/routines/vn/procedures/zone_getAddresses.sql +++ b/db/routines/vn/procedures/zone_getAddresses.sql @@ -21,6 +21,7 @@ BEGIN SELECT clientFk FROM vn.ticket WHERE shipped BETWEEN vShipped AND util.dayEnd(vShipped) + AND NOT isDeleted ) SELECT c.id, c.name, @@ -50,7 +51,8 @@ BEGIN AND c.isActive AND ct.code = 'normal' AND bt.code <> 'worker' - AND (d.id = vDepartmentFk OR NOT vDepartmentFk) + AND (d.id = vDepartmentFk OR vDepartmentFk IS NULL) + AND vn.address_hasDelivery(c.defaultAddressFk, vShipped) GROUP BY c.id; DROP TEMPORARY TABLE tmp.zoneNodes; From 6ab0515f8ec48380d19e23fab63e0090877f6d8d Mon Sep 17 00:00:00 2001 From: robert Date: Wed, 15 Jan 2025 12:31:28 +0100 Subject: [PATCH 059/123] feat: refs #8398 sendCheckingPresence --- modules/ticket/back/methods/ticket/merge.js | 26 +++++++++++---------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/modules/ticket/back/methods/ticket/merge.js b/modules/ticket/back/methods/ticket/merge.js index 1106cef06..6922ad170 100644 --- a/modules/ticket/back/methods/ticket/merge.js +++ b/modules/ticket/back/methods/ticket/merge.js @@ -40,21 +40,23 @@ module.exports = Self => { try { for (let ticket of tickets) { - const originFullPath = `${url}ticket/${ticket.originId}/summary`; - const destinationFullPath = `${url}ticket/${ticket.destinationId}/summary`; - const message = $t('Ticket merged', { - originDated: dateUtil.toString(new Date(ticket.originShipped)), - destinationDated: dateUtil.toString(new Date(ticket.destinationShipped)), - originId: ticket.originId, - destinationId: ticket.destinationId, - originFullPath, - destinationFullPath - }); if (!ticket.originId || !ticket.destinationId) continue; await models.Sale.updateAll({ticketFk: ticket.originId}, {ticketFk: ticket.destinationId}, myOptions); - if (await models.Ticket.setDeleted(ctx, ticket.originId, myOptions)) - await models.Chat.sendCheckingPresence(ctx, ticket.workerFk, message); + if (await models.Ticket.setDeleted(ctx, ticket.originId, myOptions)) { + if (!ticket.salesPersonFk) continue; + const originFullPath = `${url}ticket/${ticket.originId}/summary`; + const destinationFullPath = `${url}ticket/${ticket.destinationId}/summary`; + const message = $t('Ticket merged', { + originDated: dateUtil.toString(new Date(ticket.originShipped)), + destinationDated: dateUtil.toString(new Date(ticket.destinationShipped)), + originId: ticket.originId, + destinationId: ticket.destinationId, + originFullPath, + destinationFullPath + }); + await models.Chat.sendCheckingPresence(ctx, ticket.salesPersonFk, message); + } } if (tx) await tx.commit(); From ec14281a820d86bfa03155c50e587b5159ff0d99 Mon Sep 17 00:00:00 2001 From: jtubau Date: Wed, 15 Jan 2025 13:37:57 +0100 Subject: [PATCH 060/123] feat: refs #7322 add optional addressFk parameter to transferClient method --- modules/ticket/back/methods/ticket/transferClient.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/modules/ticket/back/methods/ticket/transferClient.js b/modules/ticket/back/methods/ticket/transferClient.js index 95bee008d..99e89da99 100644 --- a/modules/ticket/back/methods/ticket/transferClient.js +++ b/modules/ticket/back/methods/ticket/transferClient.js @@ -12,6 +12,10 @@ module.exports = Self => { arg: 'clientFk', type: 'number', required: true, + }, { + arg: 'addressFk', + type: 'number', + required: false, }], http: { path: `/:id/transferClient`, @@ -19,7 +23,7 @@ module.exports = Self => { } }); - Self.transferClient = async(ctx, id, clientFk, options) => { + Self.transferClient = async(ctx, id, clientFk, addressFk, options) => { const models = Self.app.models; const myOptions = {}; let tx; @@ -43,10 +47,10 @@ module.exports = Self => { const client = await models.Client.findById(clientFk, {fields: ['id', 'defaultAddressFk']}, myOptions); - const address = await models.Address.findById(client.defaultAddressFk, + const address = await models.Address.findById(addressFk ? addressFk : client.defaultAddressFk, {fields: ['id', 'nickname']}, myOptions); - const attributes = {clientFk, addressFk: client.defaultAddressFk, nickname: address.nickname}; + const attributes = {clientFk, addressFk: address.id, nickname: address.nickname}; const tickets = []; const ticketIds = []; From b78603275fceb1e53898294b66839a2b7f752286 Mon Sep 17 00:00:00 2001 From: jtubau Date: Wed, 15 Jan 2025 14:13:00 +0100 Subject: [PATCH 061/123] fix: refs #7322 reorder parameters in transferClient method for consistency --- modules/ticket/back/methods/ticket/transferClient.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ticket/back/methods/ticket/transferClient.js b/modules/ticket/back/methods/ticket/transferClient.js index 99e89da99..9bf2a861e 100644 --- a/modules/ticket/back/methods/ticket/transferClient.js +++ b/modules/ticket/back/methods/ticket/transferClient.js @@ -23,7 +23,7 @@ module.exports = Self => { } }); - Self.transferClient = async(ctx, id, clientFk, addressFk, options) => { + Self.transferClient = async(ctx, id, clientFk, options, addressFk) => { const models = Self.app.models; const myOptions = {}; let tx; From 416e6c81f152850a3d4da974e4f2e8df8252b677 Mon Sep 17 00:00:00 2001 From: ivanm Date: Wed, 15 Jan 2025 15:22:48 +0100 Subject: [PATCH 062/123] refactor: refs #8378 deprecate bi.f_tvc --- db/versions/11410-blackTulip/00-firstScript.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 db/versions/11410-blackTulip/00-firstScript.sql diff --git a/db/versions/11410-blackTulip/00-firstScript.sql b/db/versions/11410-blackTulip/00-firstScript.sql new file mode 100644 index 000000000..e300c4b7c --- /dev/null +++ b/db/versions/11410-blackTulip/00-firstScript.sql @@ -0,0 +1,2 @@ +RENAME TABLE bi.f_tvc TO bi.f_tvc__; +ALTER TABLE bi.f_tvc__ COMMENT='@deprecated 2025-01-15'; \ No newline at end of file From c24b00856765fbd09c5d5a73182508619ddeb8b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Wed, 15 Jan 2025 16:34:44 +0000 Subject: [PATCH 063/123] Actualizar modules/travel/back/methods/travel/filter.js --- modules/travel/back/methods/travel/filter.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/modules/travel/back/methods/travel/filter.js b/modules/travel/back/methods/travel/filter.js index d10ff080b..837e30b30 100644 --- a/modules/travel/back/methods/travel/filter.js +++ b/modules/travel/back/methods/travel/filter.js @@ -1,4 +1,3 @@ - const ParameterizedSQL = require('loopback-connector').ParameterizedSQL; const buildFilter = require('vn-loopback/util/filter').buildFilter; const mergeFilters = require('vn-loopback/util/filter').mergeFilters; @@ -179,11 +178,11 @@ module.exports = Self => { win.name warehouseInName, wout.name warehouseOutName, cnt.code continent - FROM vn.travel t - JOIN vn.agencyMode am ON am.id = t.agencyModeFk - JOIN vn.warehouse win ON win.id = t.warehouseInFk - JOIN vn.warehouse wout ON wout.id = t.warehouseOutFk - JOIN vn.awb a ON a.id = t.awbFk + FROM travel t + JOIN agencyMode am ON am.id = t.agencyModeFk + JOIN warehouse win ON win.id = t.warehouseInFk + JOIN warehouse wout ON wout.id = t.warehouseOutFk + LEFT JOIN awb a ON a.id = t.awbFk JOIN warehouse wo ON wo.id = t.warehouseOutFk JOIN country c ON c.id = wo.countryFk LEFT JOIN continent cnt ON cnt.id = c.continentFk) AS t` From 4853e45051b139b79bb5733bd1dd0970b22d0630 Mon Sep 17 00:00:00 2001 From: robert Date: Thu, 16 Jan 2025 07:29:40 +0100 Subject: [PATCH 064/123] feat: refs #8398 change merge.spec --- db/routines/vn/procedures/ticket_canbePostponed.sql | 2 ++ modules/ticket/back/methods/ticket/specs/merge.spec.js | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/db/routines/vn/procedures/ticket_canbePostponed.sql b/db/routines/vn/procedures/ticket_canbePostponed.sql index 1f3c43057..a21e171cf 100644 --- a/db/routines/vn/procedures/ticket_canbePostponed.sql +++ b/db/routines/vn/procedures/ticket_canbePostponed.sql @@ -19,6 +19,7 @@ BEGIN sub2.iptd futureIpt, sub2.state futureState, t.clientFk, + cl.salespersonFk, t.warehouseFk, ts.alertLevel, sub2.alertLevel futureAlertLevel, @@ -38,6 +39,7 @@ BEGIN JOIN vn.province p ON p.id = a.provinceFk JOIN vn.country c ON c.id = p.countryFk JOIN vn.ticketState ts ON ts.ticketFk = t.id + JOIN vn.client cl ON cl.id = t.clientFk JOIN vn.state st ON st.id = ts.stateFk JOIN vn.alertLevel al ON al.id = ts.alertLevel LEFT JOIN vn.ticketParking tp ON tp.ticketFk = t.id diff --git a/modules/ticket/back/methods/ticket/specs/merge.spec.js b/modules/ticket/back/methods/ticket/specs/merge.spec.js index 68f9d3393..99e0c6e81 100644 --- a/modules/ticket/back/methods/ticket/specs/merge.spec.js +++ b/modules/ticket/back/methods/ticket/specs/merge.spec.js @@ -7,7 +7,7 @@ describe('ticket merge()', () => { destinationId: 12, originShipped: Date.vnNew(), destinationShipped: Date.vnNew(), - workerFk: 1 + salesPersonFk: 1 }; it('should merge two tickets', async() => { From 4d98c340d210635d1546e15ea7e74dc620c05b00 Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 16 Jan 2025 09:34:18 +0100 Subject: [PATCH 065/123] feat: refs #7882 Added coords to create a address --- modules/client/back/methods/client/createAddress.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/client/back/methods/client/createAddress.js b/modules/client/back/methods/client/createAddress.js index 2709632cb..6bd4a26c1 100644 --- a/modules/client/back/methods/client/createAddress.js +++ b/modules/client/back/methods/client/createAddress.js @@ -52,6 +52,14 @@ module.exports = function(Self) { arg: 'customsAgentFk', type: 'number' }, + { + arg: 'longitude', + type: 'number' + }, + { + arg: 'latitude', + type: 'number' + }, { arg: 'isActive', type: 'boolean' From 125b7730e736b2e8421e4226c624a80d4d109230 Mon Sep 17 00:00:00 2001 From: jgallego Date: Thu, 16 Jan 2025 12:56:04 +0100 Subject: [PATCH 066/123] feat: refs #8298 update price calculation logic and add packagesDiscountFactor column to client table --- db/routines/vn/procedures/catalog_componentCalculate.sql | 6 +----- db/versions/11398-orangeRose/02-clientAlter.sql | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/db/routines/vn/procedures/catalog_componentCalculate.sql b/db/routines/vn/procedures/catalog_componentCalculate.sql index 991ff412f..aaf2db408 100644 --- a/db/routines/vn/procedures/catalog_componentCalculate.sql +++ b/db/routines/vn/procedures/catalog_componentCalculate.sql @@ -236,11 +236,7 @@ BEGIN ic.cm3delivery * ( ( - zo.price - - ( - (zo.price - zo.priceOptimum) - * c.packagesDiscountFactor - ) + zo.priceOptimum + (( zo.price - zo.priceOptimum) * 2 * ( 1 - c.packagesDiscountFactor)) ) - IFNULL(zo.bonus, 0) ) diff --git a/db/versions/11398-orangeRose/02-clientAlter.sql b/db/versions/11398-orangeRose/02-clientAlter.sql index 4119f05ff..b5275a301 100644 --- a/db/versions/11398-orangeRose/02-clientAlter.sql +++ b/db/versions/11398-orangeRose/02-clientAlter.sql @@ -1,3 +1,3 @@ ALTER TABLE `vn`.`client` ADD COLUMN `packagesDiscountFactor` DECIMAL(4,3) NOT NULL DEFAULT 1.000 - COMMENT 'Factor (1-0) que pondera el precio final entre priceOptimum (mejor) y price (peor)'; + COMMENT 'Porcentaje de ajuste entre el numero de bultos medio del cliente, y el número medio óptimo para las zonas en las que compra'; From 69b78b6bf1b2b36822a043e36b58f04b5f6667d2 Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 16 Jan 2025 15:04:21 +0100 Subject: [PATCH 067/123] feat: refs #7531 Added address_hasDelivery --- db/routines/vn/functions/address_hasDelivery.sql | 12 ++++++++++-- db/routines/vn/procedures/zone_getAddresses.sql | 3 ++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/db/routines/vn/functions/address_hasDelivery.sql b/db/routines/vn/functions/address_hasDelivery.sql index f37edbd34..719cc14f0 100644 --- a/db/routines/vn/functions/address_hasDelivery.sql +++ b/db/routines/vn/functions/address_hasDelivery.sql @@ -1,5 +1,9 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`address_hasDelivery`(vSelf INT, vLanded DATE) +CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`address_hasDelivery`( + vSelf INT, + vAgencyModeFk INT, + vLanded DATE +) RETURNS BOOL DETERMINISTIC BEGIN @@ -15,7 +19,11 @@ BEGIN CALL zone_getAgency(vSelf, vLanded); - SELECT EXISTS (SELECT TRUE FROM tmp.zoneGetAgency) INTO vHasDelivery; + SELECT EXISTS( + SELECT TRUE + FROM tmp.zoneGetAgency + WHERE agencyModeFk = vAgencyModeFk + ) INTO vHasDelivery; RETURN vHasDelivery; diff --git a/db/routines/vn/procedures/zone_getAddresses.sql b/db/routines/vn/procedures/zone_getAddresses.sql index 0e52abe1c..05267c14c 100644 --- a/db/routines/vn/procedures/zone_getAddresses.sql +++ b/db/routines/vn/procedures/zone_getAddresses.sql @@ -1,6 +1,7 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`zone_getAddresses`( vSelf INT, + vAgencyModeFk INT, vShipped DATE, vDepartmentFk INT ) @@ -52,7 +53,7 @@ BEGIN AND ct.code = 'normal' AND bt.code <> 'worker' AND (d.id = vDepartmentFk OR vDepartmentFk IS NULL) - AND vn.address_hasDelivery(c.defaultAddressFk, vShipped) + AND vn.address_hasDelivery(c.defaultAddressFk, vAgencyModeFk, vShipped) GROUP BY c.id; DROP TEMPORARY TABLE tmp.zoneNodes; From 1aa1fbda6cc12818da9071ba0d779a6d440c7699 Mon Sep 17 00:00:00 2001 From: guillermo Date: Fri, 17 Jan 2025 08:10:26 +0100 Subject: [PATCH 068/123] feat: refs #7531 Added address_hasDelivery --- db/routines/vn/procedures/zone_getAddresses.sql | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/db/routines/vn/procedures/zone_getAddresses.sql b/db/routines/vn/procedures/zone_getAddresses.sql index 05267c14c..90ad89bf3 100644 --- a/db/routines/vn/procedures/zone_getAddresses.sql +++ b/db/routines/vn/procedures/zone_getAddresses.sql @@ -1,7 +1,6 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`zone_getAddresses`( vSelf INT, - vAgencyModeFk INT, vShipped DATE, vDepartmentFk INT ) @@ -16,6 +15,12 @@ BEGIN * @param vDepartmentFk Id de departamento * @return Un select */ + DECLARE vAgencyModeFk INT; + + SELECT agencyModeFk INTO vAgencyModeFk + FROM `zone` + WHERE id = vSelf; + CALL zone_getPostalCode(vSelf); WITH clientWithTicket AS ( From a666cfa4cdbb442e524d7f55ab049669b8d8035d Mon Sep 17 00:00:00 2001 From: guillermo Date: Fri, 17 Jan 2025 09:40:07 +0100 Subject: [PATCH 069/123] feat: refs #7531 Added address_hasDelivery --- .../vn/functions/address_hasDelivery.sql | 9 ++++++++- .../vn/procedures/zone_getAddresses.sql | 18 ++++++------------ 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/db/routines/vn/functions/address_hasDelivery.sql b/db/routines/vn/functions/address_hasDelivery.sql index 719cc14f0..6b3962e1d 100644 --- a/db/routines/vn/functions/address_hasDelivery.sql +++ b/db/routines/vn/functions/address_hasDelivery.sql @@ -1,7 +1,7 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`address_hasDelivery`( vSelf INT, - vAgencyModeFk INT, + vZoneFk INT, vLanded DATE ) RETURNS BOOL @@ -12,10 +12,16 @@ BEGIN * la dirección y fecha solicitada. * * @param vSelf Id de dirección de envío + * @param vZoneFk Id de zona * @param vLanded Fecha de entrega * @return true|false */ DECLARE vHasDelivery BOOL; + DECLARE vAgencyModeFk INT; + + SELECT agencyModeFk INTO vAgencyModeFk + FROM `zone` + WHERE id = vZoneFk; CALL zone_getAgency(vSelf, vLanded); @@ -23,6 +29,7 @@ BEGIN SELECT TRUE FROM tmp.zoneGetAgency WHERE agencyModeFk = vAgencyModeFk + AND zoneFk = vZoneFk ) INTO vHasDelivery; RETURN vHasDelivery; diff --git a/db/routines/vn/procedures/zone_getAddresses.sql b/db/routines/vn/procedures/zone_getAddresses.sql index 90ad89bf3..eeee6c598 100644 --- a/db/routines/vn/procedures/zone_getAddresses.sql +++ b/db/routines/vn/procedures/zone_getAddresses.sql @@ -1,7 +1,7 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`zone_getAddresses`( vSelf INT, - vShipped DATE, + vLanded DATE, vDepartmentFk INT ) BEGIN @@ -11,22 +11,16 @@ BEGIN * vender producto para esa zona. * * @param vSelf Id de zona - * @param vShipped Fecha de envio + * @param vLanded Fecha de entrega * @param vDepartmentFk Id de departamento * @return Un select */ - DECLARE vAgencyModeFk INT; - - SELECT agencyModeFk INTO vAgencyModeFk - FROM `zone` - WHERE id = vSelf; - CALL zone_getPostalCode(vSelf); WITH clientWithTicket AS ( - SELECT clientFk + SELECT DISTINCT clientFk FROM vn.ticket - WHERE shipped BETWEEN vShipped AND util.dayEnd(vShipped) + WHERE shipped BETWEEN vLanded - INTERVAL 1 DAY AND util.dayEnd(vLanded - INTERVAL 1 DAY) AND NOT isDeleted ) SELECT c.id, @@ -37,7 +31,7 @@ BEGIN u.name username, aai.invoiced, cnb.lastShipped, - cwt.clientFk + IF(cwt.clientFk, TRUE, FALSE) hasTicket FROM vn.client c JOIN vn.worker w ON w.id = c.salesPersonFk JOIN vn.workerDepartment wd ON wd.workerFk = w.id @@ -58,7 +52,7 @@ BEGIN AND ct.code = 'normal' AND bt.code <> 'worker' AND (d.id = vDepartmentFk OR vDepartmentFk IS NULL) - AND vn.address_hasDelivery(c.defaultAddressFk, vAgencyModeFk, vShipped) + AND vn.address_hasDelivery(c.defaultAddressFk, vSelf, vLanded) GROUP BY c.id; DROP TEMPORARY TABLE tmp.zoneNodes; From e636d43f0492bf161b181fe2d4f147e163652387 Mon Sep 17 00:00:00 2001 From: guillermo Date: Fri, 17 Jan 2025 09:42:15 +0100 Subject: [PATCH 070/123] feat: refs #7531 Added address_hasDelivery --- db/routines/vn/functions/address_hasDelivery.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/routines/vn/functions/address_hasDelivery.sql b/db/routines/vn/functions/address_hasDelivery.sql index 6b3962e1d..c4f1644ce 100644 --- a/db/routines/vn/functions/address_hasDelivery.sql +++ b/db/routines/vn/functions/address_hasDelivery.sql @@ -9,7 +9,7 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`address_hasDelivery`( BEGIN /** * Retorna si hay reparto disponible para - * la dirección y fecha solicitada. + * la dirección, zona y fecha solicitada. * * @param vSelf Id de dirección de envío * @param vZoneFk Id de zona From 0bfd0895d7a418382545b41cd623af86e80df1c1 Mon Sep 17 00:00:00 2001 From: robert Date: Fri, 17 Jan 2025 12:11:18 +0100 Subject: [PATCH 071/123] feat: refs #8077 sumDefaulter --- .../client/back/methods/defaulter/filter.js | 58 +++++++++++-------- .../methods/defaulter/specs/filter.spec.js | 29 ++++++++-- 2 files changed, 59 insertions(+), 28 deletions(-) diff --git a/modules/client/back/methods/defaulter/filter.js b/modules/client/back/methods/defaulter/filter.js index 5359ce4a7..e00048cf5 100644 --- a/modules/client/back/methods/defaulter/filter.js +++ b/modules/client/back/methods/defaulter/filter.js @@ -21,7 +21,7 @@ module.exports = Self => { } ], returns: { - type: ['object'], + type: 'object', root: true }, http: { @@ -41,23 +41,28 @@ module.exports = Self => { switch (param) { case 'search': return {or: [ - {'d.clientFk': value}, - {'d.clientName': {like: `%${value}%`}} + {'c.id': value}, + {'c.name': {like: `%${value}%`}} ]}; } }); - filter = mergeFilters(ctx.args.filter, {where}); + const date = Date.vnNew(); + date.setHours(0, 0, 0, 0); + + filter = mergeFilters({where: {'d.created': date, 'd.amount': {gt: 0}}}, ctx.args.filter); + filter = mergeFilters(filter, {where}); const stmts = []; - const date = Date.vnNew(); - date.setHours(0, 0, 0, 0); - const stmt = new ParameterizedSQL( - `SELECT * - FROM ( - SELECT - DISTINCT c.id clientFk, + let stmt = new ParameterizedSQL( + `CREATE OR REPLACE TEMPORARY TABLE tmp.defaulters + WITH clientObservations AS + (SELECT clientFk,text, created, workerFk + FROM vn.clientObservation + GROUP BY clientFk + ORDER BY created DESC + )SELECT c.id clientFk, c.name clientName, c.salesPersonFk, c.businessTypeFk = 'worker' isWorker, @@ -80,36 +85,43 @@ module.exports = Self => { JOIN client c ON c.id = d.clientFk JOIN country cn ON cn.id = c.countryFk JOIN payMethod pm ON pm.id = c.payMethodFk - LEFT JOIN clientObservation co ON co.clientFk = c.id + LEFT JOIN clientObservations co ON co.clientFk = c.id LEFT JOIN account.user u ON u.id = c.salesPersonFk LEFT JOIN account.user uw ON uw.id = co.workerFk LEFT JOIN ( - SELECT r1.started, r1.clientFk, r1.finished + SELECT r1.started, r1.clientFk, r1.finished FROM recovery r1 JOIN ( - SELECT MAX(started) AS maxStarted, clientFk + SELECT MAX(started) maxStarted, clientFk FROM recovery GROUP BY clientFk ) r2 ON r1.clientFk = r2.clientFk AND r1.started = r2.maxStarted + WHERE r1.finished + GROUP BY r1.clientFk ) r ON r.clientFk = c.id LEFT JOIN workerDepartment wd ON wd.workerFk = u.id - JOIN department dp ON dp.id = wd.departmentFk - WHERE - d.created = ? - AND d.amount > 0 - ORDER BY co.created DESC) d` - , [date]); + LEFT JOIN department dp ON dp.id = wd.departmentFk`); stmt.merge(conn.makeWhere(filter.where)); - stmt.merge(`GROUP BY d.clientFk`); + stmts.push(stmt); + + stmt = new ParameterizedSQL(` + SELECT SUM(amount) amount + FROM tmp.defaulters + `); + stmts.push(stmt); + + stmt = new ParameterizedSQL(` + SELECT * + FROM tmp.defaulters + `); stmt.merge(conn.makeOrderBy(filter.order)); - stmt.merge(conn.makeLimit(filter)); const itemsIndex = stmts.push(stmt) - 1; const sql = ParameterizedSQL.join(stmts, ';'); const result = await conn.executeStmt(sql, myOptions); - return itemsIndex === 0 ? result : result[itemsIndex]; + return {defaulters: result[itemsIndex], amount: result[itemsIndex - 1][0].amount}; }; }; diff --git a/modules/client/back/methods/defaulter/specs/filter.spec.js b/modules/client/back/methods/defaulter/specs/filter.spec.js index 0a970823e..e7f58c575 100644 --- a/modules/client/back/methods/defaulter/specs/filter.spec.js +++ b/modules/client/back/methods/defaulter/specs/filter.spec.js @@ -1,6 +1,6 @@ const models = require('vn-loopback/server/server').models; -describe('defaulter filter()', () => { +fdescribe('defaulter filter()', () => { const authUserId = 9; it('should all return the tickets matching the filter', async() => { const tx = await models.Defaulter.beginTransaction({}); @@ -11,10 +11,10 @@ describe('defaulter filter()', () => { const ctx = {req: {accessToken: {userId: authUserId}}, args: {filter: filter}}; const result = await models.Defaulter.filter(ctx, null, options); - const firstRow = result[0]; + const firstRow = result.defaulters[0]; expect(firstRow.clientFk).toEqual(1101); - expect(result.length).toEqual(5); + expect(result.defaulters.length).toEqual(5); await tx.rollback(); } catch (e) { @@ -31,7 +31,7 @@ describe('defaulter filter()', () => { const ctx = {req: {accessToken: {userId: authUserId}}, args: {search: 1101}}; const result = await models.Defaulter.filter(ctx, null, options); - const firstRow = result[0]; + const firstRow = result.defaulters[0]; expect(firstRow.clientFk).toEqual(1101); @@ -50,7 +50,7 @@ describe('defaulter filter()', () => { const ctx = {req: {accessToken: {userId: authUserId}}, args: {search: 'Petter Parker'}}; const result = await models.Defaulter.filter(ctx, null, options); - const firstRow = result[0]; + const firstRow = result.defaulters[0]; expect(firstRow.clientName).toEqual('Petter Parker'); @@ -60,4 +60,23 @@ describe('defaulter filter()', () => { throw e; } }); + + it('should return the defaulter the sum of every defaulters', async() => { + const tx = await models.Defaulter.beginTransaction({}); + + try { + const options = {transaction: tx}; + const ctx = {req: {accessToken: {userId: authUserId}}, args: {search: 1101}}; + const {defaulters, amount} = await models.Defaulter.filter(ctx, null, options); + + const total = defaulters.reduce((total, row) => total + row.amount, 0); + + expect(total).toEqual(amount); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); }); From 9cd8dfaf9de3db785d72496a114c806ecbd68a32 Mon Sep 17 00:00:00 2001 From: robert Date: Fri, 17 Jan 2025 13:03:28 +0100 Subject: [PATCH 072/123] feat: refs #8077 fix spec --- modules/client/back/methods/defaulter/specs/filter.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/client/back/methods/defaulter/specs/filter.spec.js b/modules/client/back/methods/defaulter/specs/filter.spec.js index e7f58c575..ca7a6b4ff 100644 --- a/modules/client/back/methods/defaulter/specs/filter.spec.js +++ b/modules/client/back/methods/defaulter/specs/filter.spec.js @@ -1,6 +1,6 @@ const models = require('vn-loopback/server/server').models; -fdescribe('defaulter filter()', () => { +describe('defaulter filter()', () => { const authUserId = 9; it('should all return the tickets matching the filter', async() => { const tx = await models.Defaulter.beginTransaction({}); From 1cdeadb59de1288857e0df6ed058e08aa1375413 Mon Sep 17 00:00:00 2001 From: provira Date: Fri, 17 Jan 2025 13:20:45 +0100 Subject: [PATCH 073/123] feat: refs #8258 added uppercase validation on supplier create --- loopback/locale/es.json | 5 +++-- modules/supplier/back/methods/supplier/newSupplier.js | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/loopback/locale/es.json b/loopback/locale/es.json index cde81e0cb..3183a9697 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -398,5 +398,6 @@ "Holidays to past days not available": "Las vacaciones a días pasados no están disponibles", "All tickets have a route order": "Todos los tickets tienen orden de ruta", "Price cannot be blank": "Price cannot be blank", - "There are tickets to be invoiced": "La zona tiene tickets por facturar" -} + "There are tickets to be invoiced": "La zona tiene tickets por facturar", + "Social name should be uppercase": "La razón social debe ir en mayúscula" +} \ No newline at end of file diff --git a/modules/supplier/back/methods/supplier/newSupplier.js b/modules/supplier/back/methods/supplier/newSupplier.js index 3cca4195f..eb941ed69 100644 --- a/modules/supplier/back/methods/supplier/newSupplier.js +++ b/modules/supplier/back/methods/supplier/newSupplier.js @@ -28,6 +28,7 @@ module.exports = Self => { delete args.ctx; if (!args.name) throw new UserError('The social name cannot be empty'); + if (args.name !== args.name.toUpperCase()) throw new UserError('Social name should be uppercase'); const data = {...args, ...{nickname: args.name}}; const supplier = await models.Supplier.create(data, myOptions); From 4f68a7d2625287668db4f493343d6426ac725a5d Mon Sep 17 00:00:00 2001 From: jgallego Date: Fri, 17 Jan 2025 15:36:11 +0100 Subject: [PATCH 074/123] feat: refs #8381 add agencyModeFk to travel thermograph and create AgencyModeIncoming model --- db/routines/vn/views/agencyModeIncoming.sql | 9 +++++++ .../00-agencyIncomingForeign.sql | 6 +++++ .../01-travelThermographAlter.sql | 7 +++++ .../back/methods/travel/saveThermograph.js | 6 +++++ modules/travel/back/model-config.json | 5 +++- .../back/models/agency-mode-incoming.json | 27 +++++++++++++++++++ .../back/models/travel-thermograph.json | 5 ++++ 7 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 db/routines/vn/views/agencyModeIncoming.sql create mode 100644 db/versions/11411-turquoiseEucalyptus/00-agencyIncomingForeign.sql create mode 100644 db/versions/11411-turquoiseEucalyptus/01-travelThermographAlter.sql create mode 100644 modules/travel/back/models/agency-mode-incoming.json diff --git a/db/routines/vn/views/agencyModeIncoming.sql b/db/routines/vn/views/agencyModeIncoming.sql new file mode 100644 index 000000000..f7f6e595d --- /dev/null +++ b/db/routines/vn/views/agencyModeIncoming.sql @@ -0,0 +1,9 @@ +CREATE OR REPLACE DEFINER=`vn`@`localhost` +SQL SECURITY DEFINER +VIEW `vn`.`agencyModeIncoming` AS + SELECT + am.id, + am.name + FROM `vn`.`agencyMode` AS am + JOIN `vn`.`agencyIncoming` AS ai + ON am.id = ai.agencyModeFk; diff --git a/db/versions/11411-turquoiseEucalyptus/00-agencyIncomingForeign.sql b/db/versions/11411-turquoiseEucalyptus/00-agencyIncomingForeign.sql new file mode 100644 index 000000000..bf2c75f2b --- /dev/null +++ b/db/versions/11411-turquoiseEucalyptus/00-agencyIncomingForeign.sql @@ -0,0 +1,6 @@ +ALTER TABLE `vn`.`agencyIncoming` + ADD CONSTRAINT `fk_agencyIncoming_agencyMode` + FOREIGN KEY (`agencyModeFk`) + REFERENCES `agencyMode`(`id`) + ON DELETE CASCADE + ON UPDATE CASCADE; diff --git a/db/versions/11411-turquoiseEucalyptus/01-travelThermographAlter.sql b/db/versions/11411-turquoiseEucalyptus/01-travelThermographAlter.sql new file mode 100644 index 000000000..3838f59d7 --- /dev/null +++ b/db/versions/11411-turquoiseEucalyptus/01-travelThermographAlter.sql @@ -0,0 +1,7 @@ +ALTER TABLE `vn`.`travelThermograph` + ADD COLUMN `agencyModeFk` INT(11) NULL AFTER `editorFk`, + ADD CONSTRAINT `travelThermograph_agencyIncoming_fk` + FOREIGN KEY (`agencyModeFk`) + REFERENCES `agencyIncoming`(`agencyModeFk`) + ON DELETE RESTRICT + ON UPDATE CASCADE; diff --git a/modules/travel/back/methods/travel/saveThermograph.js b/modules/travel/back/methods/travel/saveThermograph.js index 6f7e1c8bf..2517b0b8c 100644 --- a/modules/travel/back/methods/travel/saveThermograph.js +++ b/modules/travel/back/methods/travel/saveThermograph.js @@ -57,6 +57,10 @@ module.exports = Self => { arg: 'hasFileAttached', type: 'Boolean', description: 'True if has an attached file' + }, { + arg: 'agencyModeFk', + type: 'Number', + description: 'Carrier' }], returns: {type: 'object', root: true}, http: {path: `/:id/saveThermograph`, verb: 'POST'} @@ -76,6 +80,7 @@ module.exports = Self => { reference, description, hasFileAttached, + agencyModeFk, options ) => { const models = Self.app.models; @@ -119,6 +124,7 @@ module.exports = Self => { minTemperature, temperatureFk, warehouseFk: warehouseId, + agencyModeFk, }, myOptions); if (tx) await tx.commit(); diff --git a/modules/travel/back/model-config.json b/modules/travel/back/model-config.json index 952ce0d20..e7a644180 100644 --- a/modules/travel/back/model-config.json +++ b/modules/travel/back/model-config.json @@ -22,5 +22,8 @@ }, "Temperature": { "dataSource": "vn" + }, + "AgencyModeIncoming": { + "dataSource": "vn" } -} \ No newline at end of file +} diff --git a/modules/travel/back/models/agency-mode-incoming.json b/modules/travel/back/models/agency-mode-incoming.json new file mode 100644 index 000000000..efefaf872 --- /dev/null +++ b/modules/travel/back/models/agency-mode-incoming.json @@ -0,0 +1,27 @@ +{ + "name": "AgencyModeIncoming", + "base": "VnModel", + "options": { + "mysql": { + "table": "agencyModeIncoming" + } + }, + "properties": { + "id": { + "type": "number", + "id": true, + "description": "Identifier" + }, + "name": { + "type": "string" + } + }, + "acls": [ + { + "accessType": "READ", + "principalType": "ROLE", + "principalId": "$everyone", + "permission": "ALLOW" + } + ] +} diff --git a/modules/travel/back/models/travel-thermograph.json b/modules/travel/back/models/travel-thermograph.json index cb0a9b4f8..79b692507 100644 --- a/modules/travel/back/models/travel-thermograph.json +++ b/modules/travel/back/models/travel-thermograph.json @@ -58,6 +58,11 @@ "type": "belongsTo", "model": "Thermograph", "foreignKey": "thermographFk" + }, + "agencyMode": { + "type": "belongsTo", + "model": "AgencyMode", + "foreignKey": "agencyModeFk" } } } From 5fe032ac75d893749bc31892b1d03bc3517d703f Mon Sep 17 00:00:00 2001 From: robert Date: Sun, 19 Jan 2025 08:30:14 +0100 Subject: [PATCH 075/123] feat: refs #8401 create triggers to itemTaxCountry --- db/routines/vn/triggers/itemTaxCountry_beforeDelete.sql | 9 +++++++++ db/routines/vn/triggers/itemTaxCountry_beforeUpdate.sql | 4 ++++ 2 files changed, 13 insertions(+) create mode 100644 db/routines/vn/triggers/itemTaxCountry_beforeDelete.sql diff --git a/db/routines/vn/triggers/itemTaxCountry_beforeDelete.sql b/db/routines/vn/triggers/itemTaxCountry_beforeDelete.sql new file mode 100644 index 000000000..d30cae7b8 --- /dev/null +++ b/db/routines/vn/triggers/itemTaxCountry_beforeDelete.sql @@ -0,0 +1,9 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`itemTaxCountry_beforeDelete` + BEFORE DELETE ON `itemTaxCountry` + FOR EACH ROW +BEGIN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'Records in this table cannot be deleted'; +END$$ +DELIMITER ; diff --git a/db/routines/vn/triggers/itemTaxCountry_beforeUpdate.sql b/db/routines/vn/triggers/itemTaxCountry_beforeUpdate.sql index ad7d6327b..2552b8914 100644 --- a/db/routines/vn/triggers/itemTaxCountry_beforeUpdate.sql +++ b/db/routines/vn/triggers/itemTaxCountry_beforeUpdate.sql @@ -4,5 +4,9 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`itemTaxCountry_beforeUp FOR EACH ROW BEGIN SET NEW.editorFk = account.myUser_getId(); + + IF NOT(NEW.countryFk <=> OLD.countryFk) THEN + CALL util.throw('Only the VAT can be modified'); + END IF; END$$ DELIMITER ; From 044a22bc3e209faf2ee04fd57de29f6d4776eed9 Mon Sep 17 00:00:00 2001 From: guillermo Date: Mon, 20 Jan 2025 07:13:04 +0100 Subject: [PATCH 077/123] feat: refs #7531 Deleted address_hasDelivery --- .../vn/functions/address_hasDelivery.sql | 39 ------------------- .../vn/procedures/zone_getAddresses.sql | 1 - 2 files changed, 40 deletions(-) delete mode 100644 db/routines/vn/functions/address_hasDelivery.sql diff --git a/db/routines/vn/functions/address_hasDelivery.sql b/db/routines/vn/functions/address_hasDelivery.sql deleted file mode 100644 index c4f1644ce..000000000 --- a/db/routines/vn/functions/address_hasDelivery.sql +++ /dev/null @@ -1,39 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`address_hasDelivery`( - vSelf INT, - vZoneFk INT, - vLanded DATE -) - RETURNS BOOL - DETERMINISTIC -BEGIN -/** - * Retorna si hay reparto disponible para - * la dirección, zona y fecha solicitada. - * - * @param vSelf Id de dirección de envío - * @param vZoneFk Id de zona - * @param vLanded Fecha de entrega - * @return true|false - */ - DECLARE vHasDelivery BOOL; - DECLARE vAgencyModeFk INT; - - SELECT agencyModeFk INTO vAgencyModeFk - FROM `zone` - WHERE id = vZoneFk; - - CALL zone_getAgency(vSelf, vLanded); - - SELECT EXISTS( - SELECT TRUE - FROM tmp.zoneGetAgency - WHERE agencyModeFk = vAgencyModeFk - AND zoneFk = vZoneFk - ) INTO vHasDelivery; - - RETURN vHasDelivery; - - DROP TEMPORARY TABLE tmp.zoneGetAgency; -END$$ -DELIMITER ; diff --git a/db/routines/vn/procedures/zone_getAddresses.sql b/db/routines/vn/procedures/zone_getAddresses.sql index eeee6c598..45c82de07 100644 --- a/db/routines/vn/procedures/zone_getAddresses.sql +++ b/db/routines/vn/procedures/zone_getAddresses.sql @@ -52,7 +52,6 @@ BEGIN AND ct.code = 'normal' AND bt.code <> 'worker' AND (d.id = vDepartmentFk OR vDepartmentFk IS NULL) - AND vn.address_hasDelivery(c.defaultAddressFk, vSelf, vLanded) GROUP BY c.id; DROP TEMPORARY TABLE tmp.zoneNodes; From e6abb1d759ac55f7b43b6d7452ee99c91a3ee4ab Mon Sep 17 00:00:00 2001 From: guillermo Date: Mon, 20 Jan 2025 07:41:41 +0100 Subject: [PATCH 078/123] feat: refs #7531 Minor change --- db/routines/vn/procedures/zone_getAddresses.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db/routines/vn/procedures/zone_getAddresses.sql b/db/routines/vn/procedures/zone_getAddresses.sql index 45c82de07..5a1380126 100644 --- a/db/routines/vn/procedures/zone_getAddresses.sql +++ b/db/routines/vn/procedures/zone_getAddresses.sql @@ -8,7 +8,7 @@ BEGIN /** * Devuelve un listado de todos los clientes activos * con consignatarios a los que se les puede - * vender producto para esa zona. + * entregar producto para esa zona. * * @param vSelf Id de zona * @param vLanded Fecha de entrega @@ -20,7 +20,7 @@ BEGIN WITH clientWithTicket AS ( SELECT DISTINCT clientFk FROM vn.ticket - WHERE shipped BETWEEN vLanded - INTERVAL 1 DAY AND util.dayEnd(vLanded - INTERVAL 1 DAY) + WHERE landed BETWEEN vLanded AND util.dayEnd(vLanded) AND NOT isDeleted ) SELECT c.id, From 934507569e8963141036197a44d6e539254c5a95 Mon Sep 17 00:00:00 2001 From: guillermo Date: Mon, 20 Jan 2025 07:48:43 +0100 Subject: [PATCH 079/123] feat: refs #7531 Added comment --- db/routines/vn/procedures/zone_getAddresses.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/routines/vn/procedures/zone_getAddresses.sql b/db/routines/vn/procedures/zone_getAddresses.sql index 5a1380126..9946b0b73 100644 --- a/db/routines/vn/procedures/zone_getAddresses.sql +++ b/db/routines/vn/procedures/zone_getAddresses.sql @@ -12,7 +12,7 @@ BEGIN * * @param vSelf Id de zona * @param vLanded Fecha de entrega - * @param vDepartmentFk Id de departamento + * @param vDepartmentFk Id de departamento | NULL para mostrar todos * @return Un select */ CALL zone_getPostalCode(vSelf); From 9584ffcf5bb113284d235e05802e2a038887e529 Mon Sep 17 00:00:00 2001 From: guillermo Date: Mon, 20 Jan 2025 08:10:12 +0100 Subject: [PATCH 080/123] feat: refs #7531 Added landed index --- db/versions/11415-chocolateTulip/00-firstScript.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 db/versions/11415-chocolateTulip/00-firstScript.sql diff --git a/db/versions/11415-chocolateTulip/00-firstScript.sql b/db/versions/11415-chocolateTulip/00-firstScript.sql new file mode 100644 index 000000000..2ed7ec9b5 --- /dev/null +++ b/db/versions/11415-chocolateTulip/00-firstScript.sql @@ -0,0 +1 @@ +CREATE INDEX ticket_landed_IDX USING BTREE ON vn.ticket (landed); From cb065f42cde28963df88b29f69a4dd02e7c21797 Mon Sep 17 00:00:00 2001 From: robert Date: Mon, 20 Jan 2025 11:19:24 +0100 Subject: [PATCH 081/123] feat: refs #8401 change request --- db/routines/vn/triggers/itemTaxCountry_beforeDelete.sql | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/db/routines/vn/triggers/itemTaxCountry_beforeDelete.sql b/db/routines/vn/triggers/itemTaxCountry_beforeDelete.sql index d30cae7b8..461b861f2 100644 --- a/db/routines/vn/triggers/itemTaxCountry_beforeDelete.sql +++ b/db/routines/vn/triggers/itemTaxCountry_beforeDelete.sql @@ -3,7 +3,6 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`itemTaxCountry_beforeDe BEFORE DELETE ON `itemTaxCountry` FOR EACH ROW BEGIN - SIGNAL SQLSTATE '45000' - SET MESSAGE_TEXT = 'Records in this table cannot be deleted'; + CALL util.throw('Records in this table cannot be deleted'); END$$ DELIMITER ; From 316a17304fd94988115d0b9f387edaf4ceb38540 Mon Sep 17 00:00:00 2001 From: robert Date: Mon, 20 Jan 2025 12:26:29 +0100 Subject: [PATCH 082/123] feat: refs #8401 restriction itemFk --- db/routines/vn/triggers/itemTaxCountry_beforeUpdate.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/routines/vn/triggers/itemTaxCountry_beforeUpdate.sql b/db/routines/vn/triggers/itemTaxCountry_beforeUpdate.sql index 2552b8914..5220028e8 100644 --- a/db/routines/vn/triggers/itemTaxCountry_beforeUpdate.sql +++ b/db/routines/vn/triggers/itemTaxCountry_beforeUpdate.sql @@ -5,7 +5,7 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`itemTaxCountry_beforeUp BEGIN SET NEW.editorFk = account.myUser_getId(); - IF NOT(NEW.countryFk <=> OLD.countryFk) THEN + IF NOT(NEW.`countryFk` <=> OLD.`countryFk`) OR NOT(NEW.`itemFk` <=> OLD.`itemFk`) THEN CALL util.throw('Only the VAT can be modified'); END IF; END$$ From 0340612645ab456997ba034775c0de3cab70aff1 Mon Sep 17 00:00:00 2001 From: sergiodt Date: Mon, 20 Jan 2025 12:35:55 +0100 Subject: [PATCH 083/123] feat: refs #7569 refs#7569 sendEmailNotification --- loopback/locale/en.json | 2 +- loopback/locale/es.json | 3 ++- loopback/locale/fr.json | 2 +- loopback/locale/pt.json | 2 +- modules/ticket/back/methods/ticket/saveSign.js | 12 +++++------- .../back/methods/ticket/specs/saveSign.spec.js | 16 ++++++++++++---- 6 files changed, 22 insertions(+), 15 deletions(-) diff --git a/loopback/locale/en.json b/loopback/locale/en.json index 0f53cf572..d39b1bac5 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -249,5 +249,5 @@ "Sales already moved": "Sales already moved", "Holidays to past days not available": "Holidays to past days not available", "Incorrect delivery order alert on route": "Incorrect delivery order alert on route: {{ route }} zone: {{ zone }}", - "Ticket has been delivered out of order": "The ticket {{ticket}} {{{fullUrl}}} has been delivered out of order. Tickets that have not been delivered in their route are: {{ ticketsToMail }}" + "Ticket has been delivered out of order": "The ticket {{ticket}} {{{fullUrl}}} has been delivered out of order." } \ No newline at end of file diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 163fbaa71..b9207d9cf 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -394,5 +394,6 @@ "An item type with the same code already exists": "Un tipo con el mismo código ya existe", "Holidays to past days not available": "Las vacaciones a días pasados no están disponibles", "Incorrect delivery order alert on route": "Alerta de orden de entrega incorrecta en ruta: {{ route }} zona: {{ zone }}", - "Ticket has been delivered out of order": "El ticket {{ticket}} {{{fullUrl}}} no ha sigo entregado en su orden. Los tickets de la ruta que no han sido entregados en su orden son: {{ ticketsToMail }}" + "Ticket has been delivered out of order": "El ticket {{ticket}} {{{fullUrl}}} no ha sigo entregado en su orden.", + "Price cannot be blank": "Price cannot be blank" } \ No newline at end of file diff --git a/loopback/locale/fr.json b/loopback/locale/fr.json index 082aedd2b..66098bac5 100644 --- a/loopback/locale/fr.json +++ b/loopback/locale/fr.json @@ -368,5 +368,5 @@ "ticketLostExpedition": "Le ticket [{{ticketId}}]({{{ticketUrl}}}) a l'expédition perdue suivante : {{expeditionId}}", "The web user's email already exists": "L'email de l'internaute existe déjà", "Incorrect delivery order alert on route": "Alerte de bon de livraison incorrect sur l'itinéraire: {{ route }} zone : {{ zone }}", - "Ticket has been delivered out of order": "Le ticket {{ticket}} {{{fullUrl}}} a été livré hors ordre. Les tickets qui n'ont pas été livrés dans leur itinéraire sont : {{ticketsToMail}}" + "Ticket has been delivered out of order": "Le ticket {{ticket}} {{{fullUrl}}} a été livré hors ordre." } \ No newline at end of file diff --git a/loopback/locale/pt.json b/loopback/locale/pt.json index 1fa16074f..240d239d6 100644 --- a/loopback/locale/pt.json +++ b/loopback/locale/pt.json @@ -367,5 +367,5 @@ "ticketLostExpedition": "O ticket [{{ticketId}}]({{{ticketUrl}}}) tem a seguinte expedição perdida: {{expeditionId}}", "The web user's email already exists": "O e-mail do utilizador da web já existe.", "Incorrect delivery order alert on route": "Alerta de ordem de entrega incorreta na rota: {{ route }} zona: {{ zone }}", - "Ticket has been delivered out of order": "O ticket {{ticket}} {{{fullUrl}}} foi entregue fora de ordem. Os tickets que não foram entregues na sua rota são: {{ ticketsToMail }}" + "Ticket has been delivered out of order": "O ticket {{ticket}} {{{fullUrl}}} foi entregue fora de ordem." } \ No newline at end of file diff --git a/modules/ticket/back/methods/ticket/saveSign.js b/modules/ticket/back/methods/ticket/saveSign.js index 443b2c1c7..9c33797b6 100644 --- a/modules/ticket/back/methods/ticket/saveSign.js +++ b/modules/ticket/back/methods/ticket/saveSign.js @@ -162,7 +162,7 @@ module.exports = Self => { fields: ['id'] }, myOptions); - const ticketsToMail = await Self.rawSql(` + const ticketIncorrect = await Self.rawSql(` SELECT t.id FROM ticket t JOIN ticketState ts ON ts.ticketFk = t.id @@ -173,10 +173,9 @@ module.exports = Self => { FROM ticket t WHERE t.id = ?)` , [ticket.routeFk, orderState.id, ticket.id], myOptions); - const ticketIds = ticketsToMail.map(row => row.id); - if (ticketsToMail) - await sendMail(ctx, ticket.routeFk, ticket.id, ticket.zone().name, ticketIds); + if (ticketIncorrect && ticketIncorrect.length > 0) + await sendMail(ctx, ticket.routeFk, ticket.id, ticket.zone().name); } if (ticket?.address()?.province()?.country()?.code != 'ES' && ticket.$cmrFk) { @@ -192,7 +191,7 @@ module.exports = Self => { await models.Ticket.sendCmrEmail(ctx, externalTickets); }; - async function sendMail(ctx, route, ticket, zoneName, ticketsToMail) { + async function sendMail(ctx, route, ticket, zoneName) { const $t = ctx.req.__; const url = await Self.app.models.Url.getUrl(); const sendTo = 'repartos@verdnatura.es'; @@ -203,8 +202,7 @@ module.exports = Self => { }); const emailBody = $t('Ticket has been delivered out of order', { ticket, - fullUrl, - ticketsToMail, + fullUrl }); await Self.app.models.Mail.create({ diff --git a/modules/ticket/back/methods/ticket/specs/saveSign.spec.js b/modules/ticket/back/methods/ticket/specs/saveSign.spec.js index ed802e311..7098ee1fc 100644 --- a/modules/ticket/back/methods/ticket/specs/saveSign.spec.js +++ b/modules/ticket/back/methods/ticket/specs/saveSign.spec.js @@ -1,14 +1,22 @@ const models = require('vn-loopback/server/server').models; +const LoopBackContext = require('loopback-context'); describe('Ticket saveSign()', () => { let ctx = {req: { getLocale: () => { return 'en'; }, + __: () => {}, accessToken: {userId: 9} - }}; + } + }; + beforeEach(() => { + spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({ + active: ctx + }); + }); - it(`should throw error if the ticket's alert level is lower than 2`, async() => { + fit(`should throw error if the ticket's alert level is lower than 2`, async() => { const tx = await models.TicketDms.beginTransaction({}); const ticketWithOkState = 12; let error; @@ -27,7 +35,7 @@ describe('Ticket saveSign()', () => { expect(error).toBeDefined(); }); - it('should change state for ticket', async() => { + fit('should change state for ticket', async() => { const tx = await models.Ticket.beginTransaction({}); const ticketWithPackedState = 7; spyOn(models.Dms, 'uploadFile').and.returnValue([{id: 1}]); @@ -52,7 +60,7 @@ describe('Ticket saveSign()', () => { expect(ticketTrackingAfter.name).toBe('Entregado en parte'); }); - it('should send an email to notify that the delivery order is not correct', async() => { + fit('should send an email to notify that the delivery order is not correct', async() => { const tx = await models.Ticket.beginTransaction({}); const ticketFk = 8; const priority = 5; From b5e27707a73f339e2d4d5fbe27d76b3765ca9041 Mon Sep 17 00:00:00 2001 From: sergiodt Date: Mon, 20 Jan 2025 12:36:31 +0100 Subject: [PATCH 084/123] feat: refs #7569 refs#7569 sendEmailNotification --- modules/ticket/back/methods/ticket/specs/saveSign.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ticket/back/methods/ticket/specs/saveSign.spec.js b/modules/ticket/back/methods/ticket/specs/saveSign.spec.js index 7098ee1fc..9cc262ea0 100644 --- a/modules/ticket/back/methods/ticket/specs/saveSign.spec.js +++ b/modules/ticket/back/methods/ticket/specs/saveSign.spec.js @@ -16,7 +16,7 @@ describe('Ticket saveSign()', () => { }); }); - fit(`should throw error if the ticket's alert level is lower than 2`, async() => { + it(`should throw error if the ticket's alert level is lower than 2`, async() => { const tx = await models.TicketDms.beginTransaction({}); const ticketWithOkState = 12; let error; @@ -35,7 +35,7 @@ describe('Ticket saveSign()', () => { expect(error).toBeDefined(); }); - fit('should change state for ticket', async() => { + it('should change state for ticket', async() => { const tx = await models.Ticket.beginTransaction({}); const ticketWithPackedState = 7; spyOn(models.Dms, 'uploadFile').and.returnValue([{id: 1}]); From ef68884fe0b5f656540cfeddf1d3a6f711bd6259 Mon Sep 17 00:00:00 2001 From: sergiodt Date: Mon, 20 Jan 2025 16:27:35 +0100 Subject: [PATCH 085/123] feat: refs #7569 refs#7569 sendEmailNotification --- loopback/locale/es.json | 2 +- modules/ticket/back/methods/ticket/saveSign.js | 2 +- modules/ticket/back/methods/ticket/specs/saveSign.spec.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/loopback/locale/es.json b/loopback/locale/es.json index b9207d9cf..eff238150 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -395,5 +395,5 @@ "Holidays to past days not available": "Las vacaciones a días pasados no están disponibles", "Incorrect delivery order alert on route": "Alerta de orden de entrega incorrecta en ruta: {{ route }} zona: {{ zone }}", "Ticket has been delivered out of order": "El ticket {{ticket}} {{{fullUrl}}} no ha sigo entregado en su orden.", - "Price cannot be blank": "Price cannot be blank" + "Price cannot be blank": "El precio no puede estar en blanco" } \ No newline at end of file diff --git a/modules/ticket/back/methods/ticket/saveSign.js b/modules/ticket/back/methods/ticket/saveSign.js index 9c33797b6..f99311c39 100644 --- a/modules/ticket/back/methods/ticket/saveSign.js +++ b/modules/ticket/back/methods/ticket/saveSign.js @@ -174,7 +174,7 @@ module.exports = Self => { WHERE t.id = ?)` , [ticket.routeFk, orderState.id, ticket.id], myOptions); - if (ticketIncorrect && ticketIncorrect.length > 0) + if (ticketIncorrect?.length > 0) await sendMail(ctx, ticket.routeFk, ticket.id, ticket.zone().name); } diff --git a/modules/ticket/back/methods/ticket/specs/saveSign.spec.js b/modules/ticket/back/methods/ticket/specs/saveSign.spec.js index 9cc262ea0..3b426c2cf 100644 --- a/modules/ticket/back/methods/ticket/specs/saveSign.spec.js +++ b/modules/ticket/back/methods/ticket/specs/saveSign.spec.js @@ -60,7 +60,7 @@ describe('Ticket saveSign()', () => { expect(ticketTrackingAfter.name).toBe('Entregado en parte'); }); - fit('should send an email to notify that the delivery order is not correct', async() => { + it('should send an email to notify that the delivery order is not correct', async() => { const tx = await models.Ticket.beginTransaction({}); const ticketFk = 8; const priority = 5; From eee73f001de867f11a0e68f863a9f40bb0bc0b7e Mon Sep 17 00:00:00 2001 From: sergiodt Date: Tue, 21 Jan 2025 07:00:02 +0100 Subject: [PATCH 086/123] Merge branch 'dev' of https: refs #7569//gitea.verdnatura.es/verdnatura/salix into 7569-sendEmailOrderTicket --- loopback/locale/en.json | 2 -- loopback/locale/es.json | 4 +--- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/loopback/locale/en.json b/loopback/locale/en.json index 4f6374a8f..2c180e204 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -247,8 +247,6 @@ "ticketLostExpedition": "The ticket [{{ticketId}}]({{{ticketUrl}}}) has the following lost expedition:{{ expeditionId }}", "The raid information is not correct": "The raid information is not correct", "Payment method is required": "Payment method is required", - "Sales already moved": "Sales already moved", - "Holidays to past days not available": "Holidays to past days not available", "Price cannot be blank": "Price cannot be blank", "There are tickets to be invoiced": "There are tickets to be invoiced", "The address of the customer must have information about Incoterms and Customs Agent": "The address of the customer must have information about Incoterms and Customs Agent""Sales already moved": "Sales already moved", diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 0203a3bc1..abd2f79a0 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -390,13 +390,11 @@ "The web user's email already exists": "El correo del usuario web ya existe", "Sales already moved": "Ya han sido transferidas", "The raid information is not correct": "La información de la redada no es correcta", - "There are tickets to be invoiced": "Hay tickets para esta zona, borralos primero", "An item type with the same code already exists": "Un tipo con el mismo código ya existe", "Holidays to past days not available": "Las vacaciones a días pasados no están disponibles", "All tickets have a route order": "Todos los tickets tienen orden de ruta", - "Price cannot be blank": "Price cannot be blank", "There are tickets to be invoiced": "La zona tiene tickets por facturar", - "Social name should be uppercase": "La razón social debe ir en mayúscula""Incorrect delivery order alert on route": "Alerta de orden de entrega incorrecta en ruta: {{ route }} zona: {{ zone }}", + "Incorrect delivery order alert on route": "Alerta de orden de entrega incorrecta en ruta: {{ route }} zona: {{ zone }}", "Ticket has been delivered out of order": "El ticket {{ticket}} {{{fullUrl}}} no ha sigo entregado en su orden.", "Price cannot be blank": "El precio no puede estar en blanco" } \ No newline at end of file From c50ff6a43aa27323c9973b976c29da509920f4a6 Mon Sep 17 00:00:00 2001 From: sergiodt Date: Tue, 21 Jan 2025 07:05:42 +0100 Subject: [PATCH 087/123] feat: refs #7569 refs#7569 sendEmailNotification --- loopback/locale/en.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/loopback/locale/en.json b/loopback/locale/en.json index 2c180e204..06428475f 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -249,7 +249,8 @@ "Payment method is required": "Payment method is required", "Price cannot be blank": "Price cannot be blank", "There are tickets to be invoiced": "There are tickets to be invoiced", - "The address of the customer must have information about Incoterms and Customs Agent": "The address of the customer must have information about Incoterms and Customs Agent""Sales already moved": "Sales already moved", + "The address of the customer must have information about Incoterms and Customs Agent": "The address of the customer must have information about Incoterms and Customs Agent", + "Sales already moved": "Sales already moved", "Holidays to past days not available": "Holidays to past days not available", "Incorrect delivery order alert on route": "Incorrect delivery order alert on route: {{ route }} zone: {{ zone }}", "Ticket has been delivered out of order": "The ticket {{ticket}} {{{fullUrl}}} has been delivered out of order." From a46ec1bc8d34150a19ff02568ad78db6b6c73773 Mon Sep 17 00:00:00 2001 From: jgallego Date: Tue, 21 Jan 2025 08:13:56 +0100 Subject: [PATCH 088/123] feat: refs #8381 add agencyModeFk to thermograph and insert agencyIncoming records --- db/dump/fixtures.before.sql | 5 +++++ .../back/methods/travel/specs/saveThermograph.spec.js | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index 590fe34b6..30c49aafc 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -321,6 +321,11 @@ UPDATE `vn`.`agencyMode` SET `web` = 1, `reportMail` = 'no-reply@gothamcity.com' UPDATE `vn`.`agencyMode` SET `code` = 'refund' WHERE `id` = 23; +INSERT INTO `vn`.`agencyIncoming`(`agencyModeFk`) + VALUES + (1), + (2); + INSERT INTO `vn`.`payMethod`(`id`,`code`, `name`, `graceDays`, `outstandingDebt`, `isIbanRequiredForClients`, `isIbanRequiredForSuppliers`, `hasVerified`) VALUES (1, NULL, 'PayMethod one', 0, 001, 0, 0, 0), diff --git a/modules/travel/back/methods/travel/specs/saveThermograph.spec.js b/modules/travel/back/methods/travel/specs/saveThermograph.spec.js index c2da4234e..0f5f248bf 100644 --- a/modules/travel/back/methods/travel/specs/saveThermograph.spec.js +++ b/modules/travel/back/methods/travel/specs/saveThermograph.spec.js @@ -9,6 +9,7 @@ describe('Thermograph saveThermograph()', () => { const maxTemperature = 30; const minTemperature = 10; const temperatureFk = 'COOL'; + const agencyModeFk = 1; let tx; let options; @@ -46,13 +47,16 @@ describe('Thermograph saveThermograph()', () => { null, null, null, - null, options + null, + agencyModeFk, + options ); expect(updatedThermograph.result).toEqual(state); expect(updatedThermograph.maxTemperature).toEqual(maxTemperature); expect(updatedThermograph.minTemperature).toEqual(minTemperature); expect(updatedThermograph.temperatureFk).toEqual(temperatureFk); + expect(updatedThermograph.agencyModeFk).toEqual(agencyModeFk); expect(updatedThermograph.dmsFk).toEqual(dmsFk); }); From 785a10a26aad2ffc70a8b55550dbd773fe979b1d Mon Sep 17 00:00:00 2001 From: robert Date: Tue, 21 Jan 2025 09:34:56 +0100 Subject: [PATCH 089/123] feat: refs #8447 create tables tag --- .../11418-goldenRuscus/00-firstScript.sql | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 db/versions/11418-goldenRuscus/00-firstScript.sql diff --git a/db/versions/11418-goldenRuscus/00-firstScript.sql b/db/versions/11418-goldenRuscus/00-firstScript.sql new file mode 100644 index 000000000..6c623d7b7 --- /dev/null +++ b/db/versions/11418-goldenRuscus/00-firstScript.sql @@ -0,0 +1,130 @@ +-- Place your SQL code here +CREATE TABLE IF NOT EXISTS `vn`.`itemSoldOutTag` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name_UNIQUE` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT + CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; + +INSERT IGNORE INTO `vn`.`itemSoldOutTag` (`name`) VALUES ('Ultimas unidades'); +INSERT IGNORE INTO `vn`.`itemSoldOutTag` (`name`) VALUES ('Temporalmente'); +INSERT IGNORE INTO `vn`.`itemSoldOutTag` (`name`) VALUES ('Descatalogado'); +INSERT IGNORE INTO `vn`.`itemSoldOutTag` (`name`) VALUES ('Hasta mayo'); +INSERT IGNORE INTO `vn`.`itemSoldOutTag` (`name`) VALUES ('Hasta febrero'); +INSERT IGNORE INTO `vn`.`itemSoldOutTag` (`name`) VALUES ('Hasta diciembre'); +INSERT IGNORE INTO `vn`.`itemSoldOutTag` (`name`) VALUES ('Hasta enero'); +INSERT IGNORE INTO `vn`.`itemSoldOutTag` (`name`) VALUES ('Hasta marzo'); +INSERT IGNORE INTO `vn`.`itemSoldOutTag` (`name`) VALUES ('Hasta nueva temporada'); +INSERT IGNORE INTO `vn`.`itemSoldOutTag` (`name`) VALUES ('Hasta septiembre'); + +UPDATE vn.tag + SET isFree=FALSE, + sourceTable='itemSoldOutTag' + WHERE name= 'Agotado'; + + +CREATE TABLE IF NOT EXISTS `vn`.`itemDurationTag` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name_UNIQUE` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT + CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; + +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('10 días'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('11 días'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('12 días'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('13 días'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('14 días'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('15 días'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('17 días'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('7 días'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('9 días'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('16-20 días'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('17-21 días'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('19-23 días'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('3-4 semanas'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('13-17 días'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('14-16 días'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('15-19 días'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('18-25 días'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('20 días'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('6 días'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('9 días'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('10-13 días'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('6 meses'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('5 años'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('10 horas'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('20 horas'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('35 horas'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('6 horas'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('11 horas'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('12 horas'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('14 horas'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('15 horas'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('18 horas'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('19 horas'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('24 horas'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('25 horas'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('30 horas'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('32 horas'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('4 horas'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('40 horas'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('45 horas'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('50 horas'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('55 horas'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('70 horas'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('8 horas'); +INSERT IGNORE INTO `vn`.`itemDurationTag` (`name`) VALUES ('9 horas'); + +UPDATE vn.tag + SET isFree=FALSE, + sourceTable='itemDurationTag' + WHERE name= 'Duracion'; + + +CREATE TABLE IF NOT EXISTS `vn`.`itemGrowingTag` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name_UNIQUE` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT + CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; + +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('01-05'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('01-06'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('01-12'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('02-06'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('03-05'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('03-07'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('03-08'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('03-11'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('04-06'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('04-09'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('04-11'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('05-07'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('05-08'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('05-10'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('05-11'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('06-09'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('06-10'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('06-11'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('07-09'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('07-10'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('07-11'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('07-12'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('09-12'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('01-04 / 10-12'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('01-04 / 9-12'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('01-05 / 10-12'); +INSERT IGNORE INTO `vn`.`itemGrowingTag` (`name`) VALUES ('01-05 / 11-12'); + +UPDATE vn.tag + SET isFree=FALSE, + sourceTable='itemGrowingTag' + WHERE name= 'Recolecta'; + +GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE vn.itemSoldOutTag TO logisticAssist; +GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE vn.itemDurationTag TO logisticAssist; +GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE vn.itemGrowingTag TO logisticAssist; From 05b383ecb01ad4fc5606aa73bdff2cc2c9f1b1d6 Mon Sep 17 00:00:00 2001 From: alexm Date: Tue, 21 Jan 2025 10:57:40 +0100 Subject: [PATCH 090/123] test: refs #8448 fix e2e --- e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js | 16 +--------------- e2e/paths/05-ticket/06_basic_data_steps.spec.js | 2 +- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js b/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js index d9689e31a..af1dc56bc 100644 --- a/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js +++ b/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js @@ -238,25 +238,11 @@ describe('Ticket Edit sale path', () => { await page.waitToClick(selectors.globalItems.cancelButton); }); - it('should select the third sale and create a claim of it', async() => { - await page.accessToSearchResult('16'); - await page.accessToSection('ticket.card.sale'); - await page.waitToClick(selectors.ticketSales.thirdSaleCheckbox); - await page.waitToClick(selectors.ticketSales.moreMenu); - await page.waitToClick(selectors.ticketSales.moreMenuCreateClaim); - await page.waitToClick(selectors.globalItems.acceptButton); - await page.waitForNavigation(); - }); - - it('should search for a ticket then access to the sales section', async() => { - await page.goBack(); - await page.goBack(); + it('should select the third sale and delete it', async() => { await page.loginAndModule('salesPerson', 'ticket'); await page.accessToSearchResult('16'); await page.accessToSection('ticket.card.sale'); - }); - it('should select the third sale and delete it', async() => { await page.waitToClick(selectors.ticketSales.thirdSaleCheckbox); await page.waitToClick(selectors.ticketSales.deleteSaleButton); await page.waitToClick(selectors.globalItems.acceptButton); diff --git a/e2e/paths/05-ticket/06_basic_data_steps.spec.js b/e2e/paths/05-ticket/06_basic_data_steps.spec.js index 77f0e0459..0a3ae4edc 100644 --- a/e2e/paths/05-ticket/06_basic_data_steps.spec.js +++ b/e2e/paths/05-ticket/06_basic_data_steps.spec.js @@ -75,7 +75,7 @@ describe('Ticket Edit basic data path', () => { const result = await page .waitToGetProperty(selectors.ticketBasicData.stepTwoTotalPriceDif, 'innerText'); - expect(result).toContain('-€228.25'); + expect(result).toContain('-€111.75'); }); it(`should select a new reason for the changes made then click on finalize`, async() => { From c72758685584378a28e2fdd9de127fc8968cbeb6 Mon Sep 17 00:00:00 2001 From: robert Date: Tue, 21 Jan 2025 11:25:03 +0100 Subject: [PATCH 091/123] feat: refs #8387 add column validationRegex --- db/versions/11419-orangeSalal/00-firstScript.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 db/versions/11419-orangeSalal/00-firstScript.sql diff --git a/db/versions/11419-orangeSalal/00-firstScript.sql b/db/versions/11419-orangeSalal/00-firstScript.sql new file mode 100644 index 000000000..432ed70aa --- /dev/null +++ b/db/versions/11419-orangeSalal/00-firstScript.sql @@ -0,0 +1,2 @@ +ALTER TABLE `vn`.`tag` +ADD COLUMN IF NOT EXISTS `validationRegex` varchar(50) DEFAULT NULL; From 9d289fa11efcc41b8507710d8584807f9eb1bbd9 Mon Sep 17 00:00:00 2001 From: alexm Date: Tue, 21 Jan 2025 11:57:35 +0100 Subject: [PATCH 092/123] build: init version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e4cbf1406..72f8e2d1b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "salix-back", - "version": "25.04.0", + "version": "25.06.0", "author": "Verdnatura Levante SL", "description": "Salix backend", "license": "GPL-3.0", From 3d5bfb81da18c83910213eedf63af1a3bbdbeb4a Mon Sep 17 00:00:00 2001 From: robert Date: Tue, 21 Jan 2025 13:12:03 +0100 Subject: [PATCH 093/123] feat: refs #8387 regular expression all tags --- loopback/locale/es.json | 4 ++-- modules/item/back/models/item-tag.js | 10 ++++++---- modules/item/back/models/tag.json | 3 +++ 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 9a24f84ba..6199bb106 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -399,5 +399,5 @@ "All tickets have a route order": "Todos los tickets tienen orden de ruta", "Price cannot be blank": "Price cannot be blank", "There are tickets to be invoiced": "La zona tiene tickets por facturar", - "The value must be a number or a range of numbers": "The value must be a number or a range of numbers" -} \ No newline at end of file + "The value must be a number or a range of numbers": "El valor debe ser un número o un rango de números" +} diff --git a/modules/item/back/models/item-tag.js b/modules/item/back/models/item-tag.js index 4c1ef4d4a..5a81f427f 100644 --- a/modules/item/back/models/item-tag.js +++ b/modules/item/back/models/item-tag.js @@ -12,7 +12,6 @@ module.exports = Self => { }); Self.observe('before save', async ctx => { - const validValue = new RegExp('^\\d{1,3}(-\\d{1,3})?$'); let tagFk; let value; @@ -24,10 +23,13 @@ module.exports = Self => { value = ctx.data.value; } const models = Self.app.models; - const validTag = await models.Tag.findOne({where: {name: 'Longitud(m)'}}); + const validTag = await models.Tag.findOne({where: {id: tagFk}}); - if (tagFk === validTag.id) { - if ((value && !validValue.test(value))) + if (validTag.validationRegex) { + const regexString = validTag.validationRegex.replace(/\\\\/g, '\\'); + const validExpresion = new RegExp(regexString); + + if (value && !validExpresion.test(value)) throw new UserError('The value must be a number or a range of numbers'); } }); diff --git a/modules/item/back/models/tag.json b/modules/item/back/models/tag.json index 6c5f5c0ba..5269b849f 100644 --- a/modules/item/back/models/tag.json +++ b/modules/item/back/models/tag.json @@ -30,6 +30,9 @@ "mysql": { "columnName": "isQuantitatif" } + }, + "validationRegex": { + "type": "string" } }, "acls": [ From b4ac80615b7422b9f829ab92d913886f5f984b81 Mon Sep 17 00:00:00 2001 From: robert Date: Tue, 21 Jan 2025 13:13:30 +0100 Subject: [PATCH 094/123] feat: refs #8387 fix traductions --- loopback/locale/en.json | 5 ++--- loopback/locale/es.json | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/loopback/locale/en.json b/loopback/locale/en.json index 4fe11c2b6..818772e40 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -251,6 +251,5 @@ "Holidays to past days not available": "Holidays to past days not available", "Price cannot be blank": "Price cannot be blank", "There are tickets to be invoiced": "There are tickets to be invoiced", - "The address of the customer must have information about Incoterms and Customs Agent": "The address of the customer must have information about Incoterms and Customs Agent", - "The value must be a number or a range of numbers": "The value must be a number or a range of numbers" -} \ No newline at end of file + "The address of the customer must have information about Incoterms and Customs Agent": "The address of the customer must have information about Incoterms and Customs Agent" +} diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 6199bb106..b8a43285d 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -399,5 +399,5 @@ "All tickets have a route order": "Todos los tickets tienen orden de ruta", "Price cannot be blank": "Price cannot be blank", "There are tickets to be invoiced": "La zona tiene tickets por facturar", - "The value must be a number or a range of numbers": "El valor debe ser un número o un rango de números" + "The value must be a number or a range of numbers": "The value must be a number or a range of numbers" } From a40e9a547b7d96fc047ad0dd6321ec1438768082 Mon Sep 17 00:00:00 2001 From: robert Date: Tue, 21 Jan 2025 13:40:24 +0100 Subject: [PATCH 095/123] feat: refs #8387 --- loopback/locale/es.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/loopback/locale/es.json b/loopback/locale/es.json index b8a43285d..5558c0964 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -398,6 +398,5 @@ "Holidays to past days not available": "Las vacaciones a días pasados no están disponibles", "All tickets have a route order": "Todos los tickets tienen orden de ruta", "Price cannot be blank": "Price cannot be blank", - "There are tickets to be invoiced": "La zona tiene tickets por facturar", - "The value must be a number or a range of numbers": "The value must be a number or a range of numbers" + "There are tickets to be invoiced": "La zona tiene tickets por facturar" } From 5ff27de72c20ee2e7b9800c75c9117599ca59f9e Mon Sep 17 00:00:00 2001 From: robert Date: Tue, 21 Jan 2025 13:42:12 +0100 Subject: [PATCH 096/123] feat: refs #8387 --- loopback/locale/es.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 5558c0964..fc2b89caa 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -397,6 +397,5 @@ "An item type with the same code already exists": "Un tipo con el mismo código ya existe", "Holidays to past days not available": "Las vacaciones a días pasados no están disponibles", "All tickets have a route order": "Todos los tickets tienen orden de ruta", - "Price cannot be blank": "Price cannot be blank", - "There are tickets to be invoiced": "La zona tiene tickets por facturar" + "Price cannot be blank": "Price cannot be blank" } From 3c89ea0df8e225bdbf4a9ec065114d4c66ec73b7 Mon Sep 17 00:00:00 2001 From: robert Date: Tue, 21 Jan 2025 14:12:14 +0100 Subject: [PATCH 097/123] fix: refs #8387 local/es.json --- loopback/locale/es.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/loopback/locale/es.json b/loopback/locale/es.json index fc2b89caa..23a40a9fb 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -397,5 +397,8 @@ "An item type with the same code already exists": "Un tipo con el mismo código ya existe", "Holidays to past days not available": "Las vacaciones a días pasados no están disponibles", "All tickets have a route order": "Todos los tickets tienen orden de ruta", - "Price cannot be blank": "Price cannot be blank" + "There are tickets to be invoiced": "La zona tiene tickets por facturar", + "Incorrect delivery order alert on route": "Alerta de orden de entrega incorrecta en ruta: {{ route }} zona: {{ zone }}", + "Ticket has been delivered out of order": "El ticket {{ticket}} {{{fullUrl}}} no ha sigo entregado en su orden.", + "Price cannot be blank": "El precio no puede estar en blanco" } From 43528a0a5338c6e53c02b21fb74a253c7fb8ae29 Mon Sep 17 00:00:00 2001 From: ivanm Date: Wed, 22 Jan 2025 13:04:16 +0100 Subject: [PATCH 098/123] feat: refs #8342 deprecate sorter and splitLine tables --- db/routines/vn2008/views/Split_lines.sql | 8 -------- db/versions/11422-blackAsparagus/00-firstScript.sql | 5 +++++ 2 files changed, 5 insertions(+), 8 deletions(-) delete mode 100644 db/routines/vn2008/views/Split_lines.sql create mode 100644 db/versions/11422-blackAsparagus/00-firstScript.sql diff --git a/db/routines/vn2008/views/Split_lines.sql b/db/routines/vn2008/views/Split_lines.sql deleted file mode 100644 index 0b7897be7..000000000 --- a/db/routines/vn2008/views/Split_lines.sql +++ /dev/null @@ -1,8 +0,0 @@ -CREATE OR REPLACE DEFINER=`root`@`localhost` - SQL SECURITY DEFINER - VIEW `vn2008`.`Split_lines` -AS SELECT `sl`.`id` AS `Id_Split_lines`, - `sl`.`splitFk` AS `Id_Split`, - `sl`.`itemFk` AS `Id_Article`, - `sl`.`buyFk` AS `Id_Compra` -FROM `vn`.`splitLine` `sl` \ No newline at end of file diff --git a/db/versions/11422-blackAsparagus/00-firstScript.sql b/db/versions/11422-blackAsparagus/00-firstScript.sql new file mode 100644 index 000000000..bb0e7c3e9 --- /dev/null +++ b/db/versions/11422-blackAsparagus/00-firstScript.sql @@ -0,0 +1,5 @@ +RENAME TABLE vn.sorter TO vn.sorter__; +ALTER TABLE vn.sorter__ COMMENT='@deprecated 2025-01-22'; + +RENAME TABLE vn.splitLine TO vn.splitLine__; +ALTER TABLE vn.splitLine__ COMMENT='@deprecated 2025-01-22'; \ No newline at end of file From e92e1d3a46162a24a6464c9a3a429b36c9070176 Mon Sep 17 00:00:00 2001 From: robert Date: Wed, 22 Jan 2025 13:20:24 +0100 Subject: [PATCH 099/123] feat: refs #6822 refs #688 change request --- db/routines/vn/procedures/entry_transfer.sql | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/db/routines/vn/procedures/entry_transfer.sql b/db/routines/vn/procedures/entry_transfer.sql index 123470038..bb1ef97be 100644 --- a/db/routines/vn/procedures/entry_transfer.sql +++ b/db/routines/vn/procedures/entry_transfer.sql @@ -31,8 +31,7 @@ BEGIN CALL util.tx_start(vIsRequiredTx); - - -- Hay que crear un nuevo travel, con salida hoy y llegada mañana y asignar la entrada nueva al nuevo travel. + -- Nuevo travel, salida hoy y llegada mañana, asignar la entrada nueva al nuevo travel. SELECT t.warehouseInFk, t.warehouseOutFk, t.`ref`, t.isReceived, t.agencyModeFk INTO vWarehouseInFk, vWarehouseOutFk, vRef, vIsReceived, vAgencyModeFk FROM travel t From 0f531d4b745671287067c9f32d006486b64fa3f1 Mon Sep 17 00:00:00 2001 From: robert Date: Wed, 22 Jan 2025 13:24:06 +0100 Subject: [PATCH 100/123] feat: refs #6822 change request --- db/routines/vn/procedures/entry_transfer.sql | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/db/routines/vn/procedures/entry_transfer.sql b/db/routines/vn/procedures/entry_transfer.sql index bb1ef97be..7e38e5095 100644 --- a/db/routines/vn/procedures/entry_transfer.sql +++ b/db/routines/vn/procedures/entry_transfer.sql @@ -31,7 +31,8 @@ BEGIN CALL util.tx_start(vIsRequiredTx); - -- Nuevo travel, salida hoy y llegada mañana, asignar la entrada nueva al nuevo travel. + /* Hay que crear un nuevo travel, con salida hoy y llegada mañana y + asignar la entrada nueva al nuevo travel.*/ SELECT t.warehouseInFk, t.warehouseOutFk, t.`ref`, t.isReceived, t.agencyModeFk INTO vWarehouseInFk, vWarehouseOutFk, vRef, vIsReceived, vAgencyModeFk FROM travel t @@ -96,7 +97,8 @@ BEGIN JOIN entry e ON e.travelFk = t.id WHERE e.id = vOriginalEntry; - -- Actualizar la nueva entrada con lo que no está ubicado HOY, descontando lo vendido HOY de esas ubicaciones + /* Actualizar nueva entrada con lo que no está ubicado HOY, + descontando lo vendido HOY de esas ubicaciones*/ CREATE OR REPLACE TEMPORARY TABLE buys WITH tBuy AS ( SELECT b.itemFk, SUM(b.quantity) totalQuantity From 0eff155dafa5da11e584bb093d9ee1f8e165d22e Mon Sep 17 00:00:00 2001 From: Jon Date: Wed, 22 Jan 2025 16:34:14 +0100 Subject: [PATCH 101/123] refactor: refs #7184 created myteam filter and modified filters where it is used --- modules/claim/back/methods/claim/filter.js | 22 +++------- .../back/methods/sales-monitor/salesFilter.js | 22 +++------- modules/order/back/methods/order/filter.js | 24 +++-------- .../back/methods/ticket-request/filter.js | 21 +++------ modules/ticket/back/methods/ticket/filter.js | 24 +++-------- modules/worker/back/methods/worker/filter.js | 17 ++++++++ modules/worker/back/methods/worker/myTeam.js | 43 +++++++++++++++++++ modules/worker/back/models/worker.js | 1 + 8 files changed, 86 insertions(+), 88 deletions(-) create mode 100644 modules/worker/back/methods/worker/myTeam.js diff --git a/modules/claim/back/methods/claim/filter.js b/modules/claim/back/methods/claim/filter.js index bacdd4021..2fea40425 100644 --- a/modules/claim/back/methods/claim/filter.js +++ b/modules/claim/back/methods/claim/filter.js @@ -109,6 +109,7 @@ module.exports = Self => { const args = ctx.args; const myOptions = {}; let to; + const myTeamIds = []; if (typeof options == 'object') Object.assign(myOptions, options); @@ -133,21 +134,8 @@ module.exports = Self => { claimIdsByClaimResponsibleFk = claims.map(claim => claim.claimFk); } - // Apply filter by team - const teamMembersId = []; - if (args.myTeam != null) { - const worker = await models.Worker.findById(userId, { - include: { - relation: 'collegues' - } - }, myOptions); - const collegues = worker.collegues() || []; - for (let collegue of collegues) - teamMembersId.push(collegue.collegueFk); - - if (teamMembersId.length == 0) - teamMembersId.push(userId); - } + if (args.myTeam != null) + myTeamIds.value = await models.Worker.myTeam(userId); const where = buildFilter(ctx.args, (param, value) => { switch (param) { @@ -184,9 +172,9 @@ module.exports = Self => { return {'t.zoneFk': value}; case 'myTeam': if (value) - return {'cl.workerFk': {inq: teamMembersId}}; + return {'cl.workerFk': {inq: myTeamIds.value}}; else - return {'cl.workerFk': {nin: teamMembersId}}; + return {'cl.workerFk': {nin: myTeamIds.value}}; } }); diff --git a/modules/monitor/back/methods/sales-monitor/salesFilter.js b/modules/monitor/back/methods/sales-monitor/salesFilter.js index ac8a722bd..3059154c5 100644 --- a/modules/monitor/back/methods/sales-monitor/salesFilter.js +++ b/modules/monitor/back/methods/sales-monitor/salesFilter.js @@ -123,25 +123,13 @@ module.exports = Self => { date.setHours(0, 0, 0, 0); const args = ctx.args; const myOptions = {}; + const myTeamIds = []; if (typeof options == 'object') Object.assign(myOptions, options); - // Apply filter by team - const teamMembersId = []; - if (args.myTeam != null) { - const worker = await models.Worker.findById(userId, { - include: { - relation: 'collegues' - } - }, myOptions); - const collegues = worker.collegues() || []; - for (let collegue of collegues) - teamMembersId.push(collegue.collegueFk); - - if (teamMembersId.length == 0) - teamMembersId.push(userId); - } + if (args.myTeam != null) + myTeamIds.value = await models.Worker.myTeam(userId); if (ctx.args && args.to) { const dateTo = args.to; @@ -163,9 +151,9 @@ module.exports = Self => { case 'mine': case 'myTeam': if (value) - return {'c.salesPersonFk': {inq: teamMembersId}}; + return {'c.salesPersonFk': {inq: myTeamIds.value}}; else - return {'c.salesPersonFk': {nin: teamMembersId}}; + return {'c.salesPersonFk': {nin: myTeamIds.value}}; case 'id': case 'clientFk': param = `t.${param}`; diff --git a/modules/order/back/methods/order/filter.js b/modules/order/back/methods/order/filter.js index 2aeb1aac5..465227621 100644 --- a/modules/order/back/methods/order/filter.js +++ b/modules/order/back/methods/order/filter.js @@ -80,29 +80,15 @@ module.exports = Self => { const conn = Self.dataSource.connector; const myOptions = {}; const userId = ctx.req.accessToken.userId; + const myTeamIds = []; if (typeof options == 'object') Object.assign(myOptions, options); const args = ctx.args; - // Apply filter by team - const teamMembersId = []; - if (args.myTeam != null) { - const worker = await models.Worker.findById(userId, { - include: { - relation: 'collegues' - } - }, myOptions); - const collegues = worker.collegues() || []; - for (let collegue of collegues) - teamMembersId.push(collegue.collegueFk); - if (teamMembersId.length == 0) - teamMembersId.push(userId); - } - - if (args?.myTeam) - args.teamIds = teamIds; + if (args.myTeam != null) + myTeamIds.value = await models.Worker.myTeam(userId); if (args?.to) args.to.setHours(23, 59, 0, 0); @@ -133,9 +119,9 @@ module.exports = Self => { return {'o.confirmed': value ? 1 : 0}; case 'myTeam': if (value) - return {'c.salesPersonFk': {inq: teamMembersId}}; + return {'c.salesPersonFk': {inq: myTeamIds.value}}; else - return {'c.salesPersonFk': {nin: teamMembersId}}; + return {'c.salesPersonFk': {nin: myTeamIds.value}}; case 'showEmpty': return {'o.total': {neq: value}}; case 'id': diff --git a/modules/ticket/back/methods/ticket-request/filter.js b/modules/ticket/back/methods/ticket-request/filter.js index c2edcae81..4432a017a 100644 --- a/modules/ticket/back/methods/ticket-request/filter.js +++ b/modules/ticket/back/methods/ticket-request/filter.js @@ -87,6 +87,7 @@ module.exports = Self => { const myOptions = {}; const models = Self.app.models; const args = ctx.args; + const myTeamIds = []; if (typeof options == 'object') Object.assign(myOptions, options); @@ -94,20 +95,8 @@ module.exports = Self => { if (ctx.args.mine) ctx.args.attenderFk = userId; - const teamMembersId = []; - if (args.myTeam != null) { - const worker = await models.Worker.findById(userId, { - include: { - relation: 'collegues' - } - }, myOptions); - const collegues = worker.collegues() || []; - for (let collegue of collegues) - teamMembersId.push(collegue.collegueFk); - - if (teamMembersId.length == 0) - teamMembersId.push(userId); - } + if (args.myTeam != null) + myTeamIds.value = await models.Worker.myTeam(userId); const today = Date.vnNew(); const future = Date.vnNew(); @@ -145,9 +134,9 @@ module.exports = Self => { return {'c.salesPersonFk': value}; case 'myTeam': if (value) - return {'tr.requesterFk': {inq: teamMembersId}}; + return {'tr.requesterFk': {inq: myTeamIds.value}}; else - return {'tr.requesterFk': {nin: teamMembersId}}; + return {'tr.requesterFk': {nin: myTeamIds.value}}; case 'daysOnward': today.setHours(0, 0, 0, 0); future.setDate(today.getDate() + value); diff --git a/modules/ticket/back/methods/ticket/filter.js b/modules/ticket/back/methods/ticket/filter.js index c61223470..ba72f34ef 100644 --- a/modules/ticket/back/methods/ticket/filter.js +++ b/modules/ticket/back/methods/ticket/filter.js @@ -142,28 +142,14 @@ module.exports = Self => { date.setHours(0, 0, 0, 0); const models = Self.app.models; const args = ctx.args; - + const myTeamIds = []; const myOptions = {}; if (typeof options == 'object') Object.assign(myOptions, options); - // Apply filter by team - const teamMembersId = []; - if (args.myTeam != null) { - const worker = await models.Worker.findById(userId, { - include: { - relation: 'collegues' - } - }, myOptions); - - const collegues = worker.collegues() || []; - for (let collegue of collegues) - teamMembersId.push(collegue.collegueFk); - - if (teamMembersId.length == 0) - teamMembersId.push(userId); - } + if (args.myTeam != null) + myTeamIds.value = await models.Worker.myTeam(userId); if (ctx.args && args.to) { const dateTo = args.to; @@ -195,9 +181,9 @@ module.exports = Self => { case 'mine': case 'myTeam': if (value) - return {'c.salesPersonFk': {inq: teamMembersId}}; + return {'c.salesPersonFk': {inq: myTeamIds.value}}; else - return {'c.salesPersonFk': {nin: teamMembersId}}; + return {'c.salesPersonFk': {nin: myTeamIds.value}}; case 'alertLevel': return {'ts.alertLevel': value}; diff --git a/modules/worker/back/methods/worker/filter.js b/modules/worker/back/methods/worker/filter.js index 52c60572a..06c4a694e 100644 --- a/modules/worker/back/methods/worker/filter.js +++ b/modules/worker/back/methods/worker/filter.js @@ -73,6 +73,11 @@ module.exports = Self => { type: 'String', description: 'The user email', http: {source: 'query'} + }, + { + arg: 'myTeam', + type: 'boolean', + description: 'Whether to show only tickets for the current logged user team (currently user tickets)' } ], returns: { @@ -87,6 +92,13 @@ module.exports = Self => { Self.filter = async(ctx, filter) => { let conn = Self.dataSource.connector; + const models = Self.app.models; + const userId = ctx.req.accessToken.userId; + const args = ctx.args; + const myTeamIds = []; + + if (args.myTeam != null) + myTeamIds.value = await models.Worker.myTeam(userId); let where = buildFilter(ctx.args, (param, value) => { switch (param) { @@ -117,6 +129,11 @@ module.exports = Self => { return {'u.name': {like: `%${value}%`}}; case 'email': return {'eu.email': {like: `%${value}%`}}; + case 'myTeam': + if (value) + return {'c.salesPersonFk': {inq: myTeamIds.value}}; + else + return {'c.salesPersonFk': {nin: myTeamIds.value}}; } }); diff --git a/modules/worker/back/methods/worker/myTeam.js b/modules/worker/back/methods/worker/myTeam.js new file mode 100644 index 000000000..25c5916fb --- /dev/null +++ b/modules/worker/back/methods/worker/myTeam.js @@ -0,0 +1,43 @@ +module.exports = Self => { + Self.remoteMethod('myTeam', { + description: 'Return the members of the user team', + accessType: 'READ', + accepts: [{ + arg: 'userId', + type: 'string', + required: true + }], + returns: { + type: 'string', + root: true + }, + http: { + path: `/myTeam`, + verb: 'GET' + } + }); + + Self.myTeam = async(userId, options) => { + const models = Self.app.models; + const myOptions = {}; + const teamMembersId = []; + + if (typeof options == 'object') + Object.assign(myOptions, options); + + const worker = await models.Worker.findById(userId, { + include: { + relation: 'collegues' + } + }, myOptions); + const collegues = worker.collegues() || []; + for (let collegue of collegues) + teamMembersId.push(collegue.collegueFk); + + if (teamMembersId.length == 0) + teamMembersId.push(userId); + + return teamMembersId; + }; +}; + diff --git a/modules/worker/back/models/worker.js b/modules/worker/back/models/worker.js index 2e45b78da..97e6a283c 100644 --- a/modules/worker/back/models/worker.js +++ b/modules/worker/back/models/worker.js @@ -21,6 +21,7 @@ module.exports = Self => { require('../methods/worker/isAuthorized')(Self); require('../methods/worker/setPassword')(Self); require('../methods/worker/getAvailablePda')(Self); + require('../methods/worker/myTeam')(Self); Self.validateAsync('fi', tinIsValid, { message: 'Invalid TIN' From 6d5a329b49b1de5bfcdce2c124aa5591fb8a016d Mon Sep 17 00:00:00 2001 From: Jon Date: Wed, 22 Jan 2025 17:09:01 +0100 Subject: [PATCH 102/123] fix: refs #7184 fixed filter and test --- modules/worker/back/methods/worker/filter.js | 27 +++++--- .../back/methods/worker/specs/filter.spec.js | 68 +++++++++++++++---- 2 files changed, 72 insertions(+), 23 deletions(-) diff --git a/modules/worker/back/methods/worker/filter.js b/modules/worker/back/methods/worker/filter.js index 06c4a694e..38d0e7833 100644 --- a/modules/worker/back/methods/worker/filter.js +++ b/modules/worker/back/methods/worker/filter.js @@ -90,17 +90,21 @@ module.exports = Self => { } }); - Self.filter = async(ctx, filter) => { - let conn = Self.dataSource.connector; - const models = Self.app.models; + Self.filter = async(ctx, filter, options) => { const userId = ctx.req.accessToken.userId; + const conn = Self.dataSource.connector; + const models = Self.app.models; const args = ctx.args; const myTeamIds = []; + const myOptions = {}; + + if (typeof options == 'object') + Object.assign(myOptions, options); if (args.myTeam != null) myTeamIds.value = await models.Worker.myTeam(userId); - let where = buildFilter(ctx.args, (param, value) => { + const where = buildFilter(ctx.args, (param, value) => { switch (param) { case 'search': return /^\d+$/.test(value) @@ -137,9 +141,9 @@ module.exports = Self => { } }); - filter = mergeFilters(ctx.args.filter, {where}); + filter = mergeFilters(filter, {where}); - let stmts = []; + const stmts = []; let stmt; stmt = new ParameterizedSQL( @@ -162,11 +166,12 @@ module.exports = Self => { LEFT JOIN account.emailUser eu ON eu.userFk = u.id` ); - stmt.merge(conn.makeSuffix(filter)); - let itemsIndex = stmts.push(stmt) - 1; + stmt.merge(conn.makeWhere(filter.where)); + stmts.push(stmt); - let sql = ParameterizedSQL.join(stmts, ';'); - let result = await conn.executeStmt(sql); - return itemsIndex === 0 ? result : result[itemsIndex]; + const itemsIndex = stmts.push(stmt) - 1; + const sql = ParameterizedSQL.join(stmts, ';'); + const result = await conn.executeStmt(sql, myOptions); + return result[itemsIndex]; }; }; diff --git a/modules/worker/back/methods/worker/specs/filter.spec.js b/modules/worker/back/methods/worker/specs/filter.spec.js index 2eb353576..27eb79cdb 100644 --- a/modules/worker/back/methods/worker/specs/filter.spec.js +++ b/modules/worker/back/methods/worker/specs/filter.spec.js @@ -1,25 +1,69 @@ +const models = require('vn-loopback/server/server').models; const app = require('vn-loopback/server/server'); describe('worker filter()', () => { - it('should return 1 result filtering by id', async() => { - let result = await app.models.Worker.filter({args: {filter: {}, search: 1}}); + const ctx = beforeAll.getCtx(); - expect(result.length).toEqual(1); - expect(result[0].id).toEqual(1); + it('should return 1 result filtering by id', async() => { + const tx = await models.Worker.beginTransaction({}); + + try { + const options = {transaction: tx}; + const filter = {}; + const args = {search: 1}; + ctx.args = args; + + let result = await app.models.Worker.filter(ctx, filter, options); + + expect(result.length).toEqual(1); + expect(result[0].id).toEqual(1); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } }); it('should return 1 result filtering by string', async() => { - let result = await app.models.Worker.filter({args: {filter: {}, search: 'administrativeNick'}}); + const tx = await models.Worker.beginTransaction({}); - expect(result.length).toEqual(1); - expect(result[0].id).toEqual(5); + try { + const options = {transaction: tx}; + const filter = {}; + const args = {search: 'administrativeNick'}; + ctx.args = args; + + let result = await app.models.Worker.filter(ctx, filter, options); + + expect(result.length).toEqual(1); + expect(result[0].id).toEqual(5); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } }); - it('should return 2 results filtering by name', async() => { - let result = await app.models.Worker.filter({args: {filter: {}, firstName: 'agency'}}); + it('should return 2 result filtering by name', async() => { + const tx = await models.Worker.beginTransaction({}); - expect(result.length).toEqual(2); - expect(result[0].nickname).toEqual('agencyNick'); - expect(result[1].nickname).toEqual('agencyBossNick'); + try { + const options = {transaction: tx}; + const filter = {}; + const args = {firstName: 'agency'}; + ctx.args = args; + + let result = await app.models.Worker.filter(ctx, filter, options); + + expect(result[0].nickname).toEqual('agencyNick'); + expect(result[1].nickname).toEqual('agencyBossNick'); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } }); }); From 602e822599f9764e1beb8daaccdff02d4d8ca63b Mon Sep 17 00:00:00 2001 From: Jon Date: Thu, 23 Jan 2025 08:21:19 +0100 Subject: [PATCH 103/123] refactor: refs #7184 deleted .value --- modules/claim/back/methods/claim/filter.js | 8 ++++---- modules/monitor/back/methods/sales-monitor/salesFilter.js | 8 ++++---- modules/order/back/methods/order/filter.js | 8 ++++---- modules/ticket/back/methods/ticket-request/filter.js | 8 ++++---- modules/ticket/back/methods/ticket/filter.js | 8 ++++---- modules/worker/back/methods/worker/filter.js | 8 ++++---- 6 files changed, 24 insertions(+), 24 deletions(-) diff --git a/modules/claim/back/methods/claim/filter.js b/modules/claim/back/methods/claim/filter.js index 2fea40425..bf9cd9441 100644 --- a/modules/claim/back/methods/claim/filter.js +++ b/modules/claim/back/methods/claim/filter.js @@ -109,7 +109,7 @@ module.exports = Self => { const args = ctx.args; const myOptions = {}; let to; - const myTeamIds = []; + let myTeamIds = []; if (typeof options == 'object') Object.assign(myOptions, options); @@ -135,7 +135,7 @@ module.exports = Self => { } if (args.myTeam != null) - myTeamIds.value = await models.Worker.myTeam(userId); + myTeamIds = await models.Worker.myTeam(userId); const where = buildFilter(ctx.args, (param, value) => { switch (param) { @@ -172,9 +172,9 @@ module.exports = Self => { return {'t.zoneFk': value}; case 'myTeam': if (value) - return {'cl.workerFk': {inq: myTeamIds.value}}; + return {'cl.workerFk': {inq: myTeamIds}}; else - return {'cl.workerFk': {nin: myTeamIds.value}}; + return {'cl.workerFk': {nin: myTeamIds}}; } }); diff --git a/modules/monitor/back/methods/sales-monitor/salesFilter.js b/modules/monitor/back/methods/sales-monitor/salesFilter.js index 3059154c5..4947edeaf 100644 --- a/modules/monitor/back/methods/sales-monitor/salesFilter.js +++ b/modules/monitor/back/methods/sales-monitor/salesFilter.js @@ -123,13 +123,13 @@ module.exports = Self => { date.setHours(0, 0, 0, 0); const args = ctx.args; const myOptions = {}; - const myTeamIds = []; + let myTeamIds = []; if (typeof options == 'object') Object.assign(myOptions, options); if (args.myTeam != null) - myTeamIds.value = await models.Worker.myTeam(userId); + myTeamIds = await models.Worker.myTeam(userId); if (ctx.args && args.to) { const dateTo = args.to; @@ -151,9 +151,9 @@ module.exports = Self => { case 'mine': case 'myTeam': if (value) - return {'c.salesPersonFk': {inq: myTeamIds.value}}; + return {'c.salesPersonFk': {inq: myTeamIds}}; else - return {'c.salesPersonFk': {nin: myTeamIds.value}}; + return {'c.salesPersonFk': {nin: myTeamIds}}; case 'id': case 'clientFk': param = `t.${param}`; diff --git a/modules/order/back/methods/order/filter.js b/modules/order/back/methods/order/filter.js index 465227621..f24d9b225 100644 --- a/modules/order/back/methods/order/filter.js +++ b/modules/order/back/methods/order/filter.js @@ -80,7 +80,7 @@ module.exports = Self => { const conn = Self.dataSource.connector; const myOptions = {}; const userId = ctx.req.accessToken.userId; - const myTeamIds = []; + let myTeamIds = []; if (typeof options == 'object') Object.assign(myOptions, options); @@ -88,7 +88,7 @@ module.exports = Self => { const args = ctx.args; if (args.myTeam != null) - myTeamIds.value = await models.Worker.myTeam(userId); + myTeamIds = await models.Worker.myTeam(userId); if (args?.to) args.to.setHours(23, 59, 0, 0); @@ -119,9 +119,9 @@ module.exports = Self => { return {'o.confirmed': value ? 1 : 0}; case 'myTeam': if (value) - return {'c.salesPersonFk': {inq: myTeamIds.value}}; + return {'c.salesPersonFk': {inq: myTeamIds}}; else - return {'c.salesPersonFk': {nin: myTeamIds.value}}; + return {'c.salesPersonFk': {nin: myTeamIds}}; case 'showEmpty': return {'o.total': {neq: value}}; case 'id': diff --git a/modules/ticket/back/methods/ticket-request/filter.js b/modules/ticket/back/methods/ticket-request/filter.js index 4432a017a..1318c1ab3 100644 --- a/modules/ticket/back/methods/ticket-request/filter.js +++ b/modules/ticket/back/methods/ticket-request/filter.js @@ -87,7 +87,7 @@ module.exports = Self => { const myOptions = {}; const models = Self.app.models; const args = ctx.args; - const myTeamIds = []; + let myTeamIds = []; if (typeof options == 'object') Object.assign(myOptions, options); @@ -96,7 +96,7 @@ module.exports = Self => { ctx.args.attenderFk = userId; if (args.myTeam != null) - myTeamIds.value = await models.Worker.myTeam(userId); + myTeamIds = await models.Worker.myTeam(userId); const today = Date.vnNew(); const future = Date.vnNew(); @@ -134,9 +134,9 @@ module.exports = Self => { return {'c.salesPersonFk': value}; case 'myTeam': if (value) - return {'tr.requesterFk': {inq: myTeamIds.value}}; + return {'tr.requesterFk': {inq: myTeamIds}}; else - return {'tr.requesterFk': {nin: myTeamIds.value}}; + return {'tr.requesterFk': {nin: myTeamIds}}; case 'daysOnward': today.setHours(0, 0, 0, 0); future.setDate(today.getDate() + value); diff --git a/modules/ticket/back/methods/ticket/filter.js b/modules/ticket/back/methods/ticket/filter.js index ba72f34ef..f125ac586 100644 --- a/modules/ticket/back/methods/ticket/filter.js +++ b/modules/ticket/back/methods/ticket/filter.js @@ -142,14 +142,14 @@ module.exports = Self => { date.setHours(0, 0, 0, 0); const models = Self.app.models; const args = ctx.args; - const myTeamIds = []; + let myTeamIds = []; const myOptions = {}; if (typeof options == 'object') Object.assign(myOptions, options); if (args.myTeam != null) - myTeamIds.value = await models.Worker.myTeam(userId); + myTeamIds = await models.Worker.myTeam(userId); if (ctx.args && args.to) { const dateTo = args.to; @@ -181,9 +181,9 @@ module.exports = Self => { case 'mine': case 'myTeam': if (value) - return {'c.salesPersonFk': {inq: myTeamIds.value}}; + return {'c.salesPersonFk': {inq: myTeamIds}}; else - return {'c.salesPersonFk': {nin: myTeamIds.value}}; + return {'c.salesPersonFk': {nin: myTeamIds}}; case 'alertLevel': return {'ts.alertLevel': value}; diff --git a/modules/worker/back/methods/worker/filter.js b/modules/worker/back/methods/worker/filter.js index 38d0e7833..087f080bd 100644 --- a/modules/worker/back/methods/worker/filter.js +++ b/modules/worker/back/methods/worker/filter.js @@ -95,14 +95,14 @@ module.exports = Self => { const conn = Self.dataSource.connector; const models = Self.app.models; const args = ctx.args; - const myTeamIds = []; + let myTeamIds = []; const myOptions = {}; if (typeof options == 'object') Object.assign(myOptions, options); if (args.myTeam != null) - myTeamIds.value = await models.Worker.myTeam(userId); + myTeamIds = await models.Worker.myTeam(userId); const where = buildFilter(ctx.args, (param, value) => { switch (param) { @@ -135,9 +135,9 @@ module.exports = Self => { return {'eu.email': {like: `%${value}%`}}; case 'myTeam': if (value) - return {'c.salesPersonFk': {inq: myTeamIds.value}}; + return {'c.salesPersonFk': {inq: myTeamIds}}; else - return {'c.salesPersonFk': {nin: myTeamIds.value}}; + return {'c.salesPersonFk': {nin: myTeamIds}}; } }); From d8847d3d09822ea377cc315156031ebf05a62de3 Mon Sep 17 00:00:00 2001 From: robert Date: Thu, 23 Jan 2025 12:59:32 +0100 Subject: [PATCH 104/123] feat: refs #6822 change request --- db/routines/vn/procedures/entry_transfer.sql | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/db/routines/vn/procedures/entry_transfer.sql b/db/routines/vn/procedures/entry_transfer.sql index 7e38e5095..5b83ae532 100644 --- a/db/routines/vn/procedures/entry_transfer.sql +++ b/db/routines/vn/procedures/entry_transfer.sql @@ -18,6 +18,7 @@ BEGIN DECLARE vIsReceived INT; DECLARE vAgencyModeFk INT; DECLARE vTomorrow DATETIME DEFAULT util.tomorrow(); + DECLARE vCurDate DATE DEFAULT util.VN_CURDATE(); DECLARE vIsRequiredTx BOOL DEFAULT NOT @@in_transaction; DECLARE EXIT HANDLER FOR SQLEXCEPTION @@ -41,7 +42,7 @@ BEGIN SELECT id INTO vTravelFk FROM travel t - WHERE shipped = util.VN_CURDATE() + WHERE shipped = vCurDate AND landed = vTomorrow AND warehouseInFk = vWarehouseInFk AND warehouseOutFk = vWarehouseOutFk @@ -58,7 +59,7 @@ BEGIN `ref`, isReceived, agencyModeFk) - SELECT util.VN_CURDATE(), + SELECT vCurDate, vTomorrow, t.warehouseInFk, t.warehouseOutFk, @@ -116,7 +117,7 @@ BEGIN JOIN vn.entry e ON e.id = b.entryFk JOIN tBuy t ON t.itemFk = ish.itemFk WHERE s.warehouseFk = vWarehouseFk - AND sh.parked >= util.VN_CURDATE() + AND sh.parked >= vCurDate GROUP BY ish.itemFk ), sales AS ( @@ -127,8 +128,8 @@ BEGIN JOIN vn.itemShelving is2 ON is2.id = iss.itemShelvingFk JOIN vn.shelving s2 ON s2.id = is2.shelvingFk JOIN tBuy t ON t.itemFk = s.itemFk - WHERE t.shipped BETWEEN util.VN_CURDATE() AND util.dayend(util.VN_CURDATE()) - AND s2.parked >= util.VN_CURDATE() + WHERE t.shipped BETWEEN vCurDate AND util.dayend(vCurDate) + AND s2.parked >= vCurDate GROUP BY s.itemFk ) SELECT tmp.itemFk, @@ -152,6 +153,6 @@ BEGIN CALL util.tx_commit(vIsRequiredTx); CALL cache.visible_refresh(@c,TRUE,vWarehouseFk); - CALL cache.available_refresh(@c, TRUE, vWarehouseFk, util.VN_CURDATE()); + CALL cache.available_refresh(@c, TRUE, vWarehouseFk, vCurDate); END$$ DELIMITER ; From 518a91cff206d87adf054d6035d6704ce6c1cf3a Mon Sep 17 00:00:00 2001 From: alexm Date: Thu, 23 Jan 2025 13:56:36 +0100 Subject: [PATCH 105/123] fix: address isEqualizated can be null for trigger --- db/versions/11423-maroonMonstera/00-firstScript.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 db/versions/11423-maroonMonstera/00-firstScript.sql diff --git a/db/versions/11423-maroonMonstera/00-firstScript.sql b/db/versions/11423-maroonMonstera/00-firstScript.sql new file mode 100644 index 000000000..cf21473d8 --- /dev/null +++ b/db/versions/11423-maroonMonstera/00-firstScript.sql @@ -0,0 +1 @@ +ALTER TABLE vn.address MODIFY COLUMN isEqualizated tinyint(1) NULL; From f165d178695a0218e11fa11e3f035ca98dbdf2af Mon Sep 17 00:00:00 2001 From: jtubau Date: Thu, 23 Jan 2025 14:26:02 +0100 Subject: [PATCH 106/123] feat: refs #7322 add addressFk parameter to transferClient method and update tests --- .../ticket/specs/transferClient.spec.js | 43 +++++++++++++++++-- .../back/methods/ticket/transferClient.js | 6 ++- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/modules/ticket/back/methods/ticket/specs/transferClient.spec.js b/modules/ticket/back/methods/ticket/specs/transferClient.spec.js index d3ac3c6aa..327a099d8 100644 --- a/modules/ticket/back/methods/ticket/specs/transferClient.spec.js +++ b/modules/ticket/back/methods/ticket/specs/transferClient.spec.js @@ -22,14 +22,16 @@ describe('Ticket transferClient()', () => { it('should throw an error as the ticket is not editable', async() => { try { const ticketId = 4; - await models.Ticket.transferClient(ctx, ticketId, clientId, options); + const addressFk = null; + await models.Ticket.transferClient(ctx, ticketId, clientId, addressFk, options); } catch (e) { expect(e.message).toEqual('This ticket is locked'); } }); it('should be assigned a different clientFk and nickname in the original ticket', async() => { - await models.Ticket.transferClient(ctx, 2, clientId, options); + const addressFk = null; + await models.Ticket.transferClient(ctx, 2, clientId, addressFk, options); const afterTransfer = await models.Ticket.findById(2, null, options); const client = await models.Client.findById(clientId, {fields: ['defaultAddressFk']}, options); const address = await models.Address.findById(client.defaultAddressFk, {fields: ['nickname']}, options); @@ -39,7 +41,8 @@ describe('Ticket transferClient()', () => { }); it('should be assigned a different clientFk and nickname in the original and refund ticket and claim', async() => { - await models.Ticket.transferClient(ctx, originalTicketId, clientId, options); + const addressFk = null; + await models.Ticket.transferClient(ctx, originalTicketId, clientId, addressFk, options); const [originalTicket, refundTicket] = await models.Ticket.find({ where: {id: {inq: [originalTicketId, refundTicketId]}} @@ -59,4 +62,38 @@ describe('Ticket transferClient()', () => { expect(originalTicket.nickname).toEqual(address.nickname); expect(refundTicket.nickname).toEqual(address.nickname); }); + + it('should be assigned a different addressFk and nickname in the original and refund ticket', async() => { + const addressFk = 131; + await models.Ticket.transferClient(ctx, originalTicketId, clientId, addressFk, options); + + const [originalTicket, refundTicket] = await models.Ticket.find({ + where: {id: {inq: [originalTicketId, refundTicketId]}} + }, options); + + const claim = await models.Claim.findOne({ + where: {ticketFk: originalTicketId} + }, options); + + const address = await models.Address.findById(addressFk, {fields: ['id', 'nickname', 'clientFk']}, options); + + expect(originalTicket.clientFk).toEqual(clientId); + expect(originalTicket.clientFk).toEqual(address.clientFk); + expect(refundTicket.clientFk).toEqual(clientId); + expect(refundTicket.clientFk).toEqual(address.clientFk); + expect(claim.clientFk).toEqual(clientId); + expect(claim.clientFk).toEqual(address.clientFk); + + expect(originalTicket.nickname).toEqual(address.nickname); + expect(refundTicket.nickname).toEqual(address.nickname); + }); + + it('should be thrown an error if the new address is not belong to the client', async() => { + const addressFk = 1; + try { + await models.Ticket.transferClient(ctx, originalTicketId, clientId, addressFk, options); + } catch (e) { + expect(e.message).toEqual('The address does not belong to the client'); + } + }); }); diff --git a/modules/ticket/back/methods/ticket/transferClient.js b/modules/ticket/back/methods/ticket/transferClient.js index 9bf2a861e..76a66c528 100644 --- a/modules/ticket/back/methods/ticket/transferClient.js +++ b/modules/ticket/back/methods/ticket/transferClient.js @@ -23,7 +23,7 @@ module.exports = Self => { } }); - Self.transferClient = async(ctx, id, clientFk, options, addressFk) => { + Self.transferClient = async(ctx, id, clientFk, addressFk, options) => { const models = Self.app.models; const myOptions = {}; let tx; @@ -48,7 +48,9 @@ module.exports = Self => { {fields: ['id', 'defaultAddressFk']}, myOptions); const address = await models.Address.findById(addressFk ? addressFk : client.defaultAddressFk, - {fields: ['id', 'nickname']}, myOptions); + {fields: ['id', 'nickname', 'clientFk']}, myOptions); + + if (address.clientFk !== clientFk) throw new UserError('The address does not belong to the client'); const attributes = {clientFk, addressFk: address.id, nickname: address.nickname}; From 603e3e32c4358196f18fbba6122dab8b23868452 Mon Sep 17 00:00:00 2001 From: Jon Date: Fri, 24 Jan 2025 07:39:18 +0100 Subject: [PATCH 107/123] fix: shipped field --- modules/ticket/back/methods/ticket/priceDifference.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/ticket/back/methods/ticket/priceDifference.js b/modules/ticket/back/methods/ticket/priceDifference.js index 7db03e268..7e4fe8283 100644 --- a/modules/ticket/back/methods/ticket/priceDifference.js +++ b/modules/ticket/back/methods/ticket/priceDifference.js @@ -108,7 +108,10 @@ module.exports = Self => { // Get items movable const ticketOrigin = await models.Ticket.findById(args.id, null, myOptions); - const differenceShipped = ticketOrigin.shipped.getTime() > args.shipped.getTime(); + let shipped = ticketOrigin.shipped ?? ticketOrigin.updated; + + const differenceShipped = shipped.getTime() > args.shipped.getTime(); + const differenceWarehouse = ticketOrigin.warehouseFk != args.warehouseId; salesObj.haveDifferences = differenceShipped || differenceWarehouse; From df97534882ddbd86ef55c6f8360f77fdbeb9a5f3 Mon Sep 17 00:00:00 2001 From: sergiodt Date: Fri, 24 Jan 2025 08:25:44 +0100 Subject: [PATCH 108/123] fix: refs #6861 refs#6861 showUsername --- back/methods/collection/getTickets.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/back/methods/collection/getTickets.js b/back/methods/collection/getTickets.js index 85d1111df..f7ec4867b 100644 --- a/back/methods/collection/getTickets.js +++ b/back/methods/collection/getTickets.js @@ -65,7 +65,8 @@ module.exports = Self => { iss.id itemShelvingSaleFk, iss.isPicked, iss.itemShelvingFk, - st.code stateCode + st.code stateCode, + ac.username FROM ticketCollection tc LEFT JOIN collection c ON c.id = tc.collectionFk JOIN sale s ON s.ticketFk = tc.ticketFk @@ -79,7 +80,8 @@ module.exports = Self => { LEFT JOIN parking p ON p.id = sh.parkingFk LEFT JOIN itemColor ic ON ic.itemFk = s.itemFk LEFT JOIN origin o ON o.id = i.originFk - LEFT JOIN state st ON st.id = sg.stateFk + LEFT JOIN state st ON st.id = sg.stateFk, + LEFT JOIN account.user ac ON ac.id = iss.userFk WHERE tc.collectionFk = ? GROUP BY s.id, ish.id, p.code, p2.code UNION ALL @@ -109,7 +111,8 @@ module.exports = Self => { iss.id itemShelvingSaleFk, iss.isPicked, iss.itemShelvingFk, - st.code stateCode + st.code stateCode, + ac.username FROM sectorCollection sc JOIN sectorCollectionSaleGroup ss ON ss.sectorCollectionFk = sc.id JOIN saleGroup sg ON sg.id = ss.saleGroupFk @@ -124,6 +127,7 @@ module.exports = Self => { LEFT JOIN itemColor ic ON ic.itemFk = s.itemFk LEFT JOIN origin o ON o.id = i.originFk LEFT JOIN state st ON st.id = sg.stateFk + LEFT JOIN account.user ac ON ac.id = sg.userFk WHERE sc.id = ? AND sgd.saleGroupFk GROUP BY s.id, ish.id, p.code, p2.code`, [id, id], myOptions); From 5dd60bd912e147e3fc6ce46701e3f4f221c11584 Mon Sep 17 00:00:00 2001 From: sergiodt Date: Fri, 24 Jan 2025 08:28:15 +0100 Subject: [PATCH 109/123] fix: refs #6861 refs#6861 showUsername --- back/methods/collection/getTickets.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/back/methods/collection/getTickets.js b/back/methods/collection/getTickets.js index f7ec4867b..dfe86c94c 100644 --- a/back/methods/collection/getTickets.js +++ b/back/methods/collection/getTickets.js @@ -80,7 +80,7 @@ module.exports = Self => { LEFT JOIN parking p ON p.id = sh.parkingFk LEFT JOIN itemColor ic ON ic.itemFk = s.itemFk LEFT JOIN origin o ON o.id = i.originFk - LEFT JOIN state st ON st.id = sg.stateFk, + LEFT JOIN state st ON st.id = sg.stateFk LEFT JOIN account.user ac ON ac.id = iss.userFk WHERE tc.collectionFk = ? GROUP BY s.id, ish.id, p.code, p2.code From 2ee5ba908a518e957312bd5b3c0044f25ef8d38c Mon Sep 17 00:00:00 2001 From: robert Date: Fri, 24 Jan 2025 13:16:36 +0100 Subject: [PATCH 110/123] feat: refs #6822 change request --- modules/entry/back/methods/entry/transfer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/entry/back/methods/entry/transfer.js b/modules/entry/back/methods/entry/transfer.js index aa4b4c819..db6873663 100644 --- a/modules/entry/back/methods/entry/transfer.js +++ b/modules/entry/back/methods/entry/transfer.js @@ -33,7 +33,7 @@ module.exports = Self => { try { await Self.rawSql('CALL vn.entry_transfer(?, @vNewEntry)', [id], myOptions); - const newEntryFk = await Self.rawSql('SELECT @vNewEntry newEntryFk', null, myOptions); + const [newEntryFk] = await Self.rawSql('SELECT @vNewEntry newEntryFk', null, myOptions); if (tx) await tx.commit(); return newEntryFk; From 163302c770ca66b7d4838406f93f976c116bec6a Mon Sep 17 00:00:00 2001 From: robert Date: Fri, 24 Jan 2025 13:26:36 +0100 Subject: [PATCH 111/123] feat: refs #6822 fix test --- modules/entry/back/methods/entry/specs/transfer.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/entry/back/methods/entry/specs/transfer.spec.js b/modules/entry/back/methods/entry/specs/transfer.spec.js index cc712b994..bf0b2b974 100644 --- a/modules/entry/back/methods/entry/specs/transfer.spec.js +++ b/modules/entry/back/methods/entry/specs/transfer.spec.js @@ -15,7 +15,7 @@ describe('Transfer merchandise from one entry to the next day()', () => { const currentItemShelving = await models.ItemShelving.findOne({where: {id}}, options); await currentItemShelving.updateAttributes({itemFk: item, buyFk: buy}, options); - const [{newEntryFk}] = await models.Entry.transfer(ctx, originalEntry, options); + const {newEntryFk} = await models.Entry.transfer(ctx, originalEntry, options); const originalEntrybuys = await models.Buy.find({where: {entryFk: originalEntry}}, options); const newEntrybuys = await models.Buy.find({where: {entryFk: newEntryFk}}, options); From 034df6e8eae7c5ced0e8619db6bceb0baee1ea5e Mon Sep 17 00:00:00 2001 From: Jon Date: Fri, 24 Jan 2025 13:48:35 +0100 Subject: [PATCH 112/123] feat: added nickname in address --- modules/ticket/back/methods/ticket/summary.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ticket/back/methods/ticket/summary.js b/modules/ticket/back/methods/ticket/summary.js index 6bfa478ec..88894cef7 100644 --- a/modules/ticket/back/methods/ticket/summary.js +++ b/modules/ticket/back/methods/ticket/summary.js @@ -72,7 +72,8 @@ module.exports = Self => { }, { relation: 'address', scope: { - fields: ['street', 'city', 'provinceFk', 'phone', 'mobile', 'postalCode', 'isEqualizated'], + fields: ['street', 'city', 'provinceFk', 'phone', 'mobile', + 'postalCode', 'isEqualizated', 'nickname'], include: { relation: 'province', scope: { From 29af7cfcbcf8af057cd0c5a1ed9c6263d34fc56c Mon Sep 17 00:00:00 2001 From: jtubau Date: Mon, 27 Jan 2025 08:23:30 +0100 Subject: [PATCH 113/123] test: refs #7322 added test error for case when expected error is not thrown --- modules/ticket/back/methods/ticket/specs/transferClient.spec.js | 1 + modules/ticket/back/methods/ticket/transferClient.js | 1 + 2 files changed, 2 insertions(+) diff --git a/modules/ticket/back/methods/ticket/specs/transferClient.spec.js b/modules/ticket/back/methods/ticket/specs/transferClient.spec.js index 327a099d8..063433680 100644 --- a/modules/ticket/back/methods/ticket/specs/transferClient.spec.js +++ b/modules/ticket/back/methods/ticket/specs/transferClient.spec.js @@ -92,6 +92,7 @@ describe('Ticket transferClient()', () => { const addressFk = 1; try { await models.Ticket.transferClient(ctx, originalTicketId, clientId, addressFk, options); + fail('Expected an error to be thrown, but none was thrown.'); } catch (e) { expect(e.message).toEqual('The address does not belong to the client'); } diff --git a/modules/ticket/back/methods/ticket/transferClient.js b/modules/ticket/back/methods/ticket/transferClient.js index 76a66c528..2e845144e 100644 --- a/modules/ticket/back/methods/ticket/transferClient.js +++ b/modules/ticket/back/methods/ticket/transferClient.js @@ -1,3 +1,4 @@ +const UserError = require('vn-loopback/util/user-error'); module.exports = Self => { Self.remoteMethodCtx('transferClient', { description: 'Transferring ticket to another client', From 1f6779d86b2837e22f1165b4935eb92ac4b23720 Mon Sep 17 00:00:00 2001 From: robert Date: Mon, 27 Jan 2025 08:59:33 +0100 Subject: [PATCH 114/123] feat: refs #8387 change request --- modules/item/back/models/item-tag.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/item/back/models/item-tag.js b/modules/item/back/models/item-tag.js index 5a81f427f..2cd2e5f9b 100644 --- a/modules/item/back/models/item-tag.js +++ b/modules/item/back/models/item-tag.js @@ -23,7 +23,7 @@ module.exports = Self => { value = ctx.data.value; } const models = Self.app.models; - const validTag = await models.Tag.findOne({where: {id: tagFk}}); + const validTag = await models.Tag.findById(tagFk); if (validTag.validationRegex) { const regexString = validTag.validationRegex.replace(/\\\\/g, '\\'); From cd8e04d6485a8f3a33f4ed630ac932ff70284376 Mon Sep 17 00:00:00 2001 From: guillermo Date: Mon, 27 Jan 2025 11:22:21 +0100 Subject: [PATCH 115/123] refactor: refs #7568 ticket_doCmr ignore alertLevel --- db/routines/vn/procedures/ticket_doCmr.sql | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/db/routines/vn/procedures/ticket_doCmr.sql b/db/routines/vn/procedures/ticket_doCmr.sql index ba64944f8..59bb3e070 100644 --- a/db/routines/vn/procedures/ticket_doCmr.sql +++ b/db/routines/vn/procedures/ticket_doCmr.sql @@ -21,9 +21,6 @@ BEGIN IFNULL(sat.supplierFk, su.id) supplierFk, t.landed FROM ticket t - JOIN ticketState ts ON ts.ticketFk = t.id - JOIN `state` s ON s.id = ts.stateFk - JOIN alertLevel al ON al.id = s.alertLevel JOIN client c ON c.id = t.clientFk JOIN `address` a ON a.id = t.addressFk JOIN province p ON p.id = a.provinceFk @@ -40,8 +37,7 @@ BEGIN LEFT JOIN agency ag ON ag.id = am.agencyFk LEFT JOIN supplierAgencyTerm sat ON sat.agencyFk = ag.id AND wo.isFreelance - WHERE al.code IN ('PACKED', 'DELIVERED') - AND co.code <> 'ES' + WHERE co.code <> 'ES' AND am.name <> 'ABONO' AND w.code = 'ALG' AND t.id = vSelf From 72a1c2ca5753ae92e89f5a708d99631b6f389872 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Mon, 27 Jan 2025 12:57:58 +0000 Subject: [PATCH 116/123] fix: some params --- modules/client/back/methods/client/extendedListFilter.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/client/back/methods/client/extendedListFilter.js b/modules/client/back/methods/client/extendedListFilter.js index 174970a2f..7bbae27be 100644 --- a/modules/client/back/methods/client/extendedListFilter.js +++ b/modules/client/back/methods/client/extendedListFilter.js @@ -79,6 +79,10 @@ module.exports = Self => { return /^\d+$/.test(value) ? {'c.id': {inq: value}} : {'c.name': {like: `%${value}%`}}; + case 'sageTaxTypeFk': + return {'sti.CodigoIva': value}; + case 'sageTransactionTypeFk': + return {'stt.CodigoTransaccion': value}; case 'name': case 'salesPersonFk': case 'fi': @@ -88,6 +92,8 @@ module.exports = Self => { case 'provinceFk': case 'email': case 'phone': + case 'sti.CodigoIva': + case 'sti.CodigoTransaccion': param = `c.${param}`; return {[param]: value}; } From b003dff0453d095282565912fddb055af045b69a Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Mon, 27 Jan 2025 13:30:29 +0000 Subject: [PATCH 117/123] fix: new params --- .../client/back/methods/client/extendedListFilter.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/client/back/methods/client/extendedListFilter.js b/modules/client/back/methods/client/extendedListFilter.js index 7bbae27be..0097795e6 100644 --- a/modules/client/back/methods/client/extendedListFilter.js +++ b/modules/client/back/methods/client/extendedListFilter.js @@ -43,6 +43,14 @@ module.exports = Self => { arg: 'postcode', type: 'string', }, + { + arg: 'sageTransactionTypeFk', + type: 'number', + }, + { + arg: 'sageTaxTypeFk', + type: 'number', + }, { arg: 'provinceFk', type: 'number', @@ -92,8 +100,6 @@ module.exports = Self => { case 'provinceFk': case 'email': case 'phone': - case 'sti.CodigoIva': - case 'sti.CodigoTransaccion': param = `c.${param}`; return {[param]: value}; } From bbebff7ea93dc0a34f9b9b807cad883d585f56b2 Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 27 Jan 2025 14:37:39 +0100 Subject: [PATCH 118/123] fix: prevent slow update --- db/versions/11269-wheatBirch/00-firstScript.sql | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/db/versions/11269-wheatBirch/00-firstScript.sql b/db/versions/11269-wheatBirch/00-firstScript.sql index 9432d131b..9552fe6cd 100644 --- a/db/versions/11269-wheatBirch/00-firstScript.sql +++ b/db/versions/11269-wheatBirch/00-firstScript.sql @@ -7,9 +7,9 @@ ALTER TABLE vn.invoiceOut ADD CONSTRAINT invoiceOut_customsAgentFk FOREIGN KEY ( ALTER TABLE vn.invoiceOut ADD CONSTRAINT invoiceOut_incotermsFk FOREIGN KEY (incotermsFk) REFERENCES vn.incoterms (`code`) ON DELETE RESTRICT ON UPDATE CASCADE; -UPDATE vn.invoiceOut io - JOIN vn.client c ON c.id = io.clientFk - JOIN vn.ticket t ON t.clientFk = c.id - JOIN vn.address a ON a.id = t.addressFk - SET io.customsAgentFk = a.customsAgentFk, - io.incotermsFk = a.incotermsFk; \ No newline at end of file +-- UPDATE vn.invoiceOut io +-- JOIN vn.client c ON c.id = io.clientFk +-- JOIN vn.ticket t ON t.clientFk = c.id +-- JOIN vn.address a ON a.id = t.addressFk +-- SET io.customsAgentFk = a.customsAgentFk, +-- io.incotermsFk = a.incotermsFk; From 5f07c159bc66f828d89a738f94c825f80256a35c Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 27 Jan 2025 15:24:26 +0100 Subject: [PATCH 119/123] build: refs #8452 add change log --- CHANGELOG.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67ffe9f12..5aabb9305 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,49 @@ +# Version 25.04 - 2025-01-28 + +### Added 🆕 + +- feat: refs #7202 added new field by:Jon +- feat: refs #7343 delete sending to user by:ivanm +- feat: refs #7569 refs#7569 sendEmailNotification by:sergiodt +- feat: refs #7569 refs#7569 sendMail by:sergiodt +- feat: refs #7584 changes request by:robert +- feat: refs #7584 workerTimeControl_afterDelete by:robert +- feat: refs #7832 implement refund ticket restrictions and add unit tests for ticket service updates by:jgallego +- feat: refs #7882 Added coords to create a address by:guillermo +- feat: refs #8073 change names and primary key by:ivanm +- feat: refs #8073 new comment message by:ivanm +- feat: refs #8073 #refs 8073 create vn.productionCountryVolume by:ivanm +- feat: refs #8117 add worker first and last name to item type query by:jtubau +- feat: refs #8247 added new acl for VnUser model by:Jon +- feat: refs #8258 added uppercase validation on supplier create (origin/8258-uppercaseInputs) by:provira +- feat: refs #8298 add priceOptimum and packagesDiscountFactor to zone and client tables by:jgallego +- feat: refs #8298 add priceOptimum column to zoneEvent and update zone fixture data by:jgallego +- feat: refs #8298 update price calculation logic and add packagesDiscountFactor column to client table by:jgallego +- feat: refs #8357 Agregados triggers para manejar exclusiones de trabajadores en la tabla workerMana by:guillermo +- feat: refs #8361 add hasToDownloadRate field to currency model and update exchange rate logic by:jgallego +- feat: refs #8381 add initial and final temperature fields to entry model and queries by:jgallego + +### Changed 📦 + +- refactor: order by id by:alexm +- refactor: refs #7202 modified new invoice procedure and incoterms sql by:Jon +- refactor: refs #7202 modified procedure to include customsAgent field when creating an invoice by:Jon +- refactor: refs #8378 deprecate bi.f_tvc by:ivanm + +### Fixed 🛠️ + +- feat: refs #8298 add priceOptimum column to zoneEvent and update zone fixture data by:jgallego +- fix: prevent slow update (HEAD -> 8452-testToMaster, origin/test, origin/8452-testToMaster, test) by:alexm +- fix: refs #7202 fixed back test by:Jon +- fix: refs #7202 fixed sql by:Jon +- fix: refs #7569 refs·6861 ticketOrderReserve by:sergiodt +- fix: refs #7569 refs·6861 ticketOrderReserve (origin/7569-sendEmailOrderTicket) by:sergiodt +- fix: refs #7569 refs#8188 add IfNotExists by:sergiodt +- fix: refs #7832 update ticketService model test suite to correct describe block by:jgallego +- fix: refs #8298 remove duplicate entry in English locale file by:jgallego +- fix: refs #8361 streamline transaction handling in exchangeRateUpdate by:jgallego +- test: refs #8448 fix e2e by:alexm + # Version 25.00 - 2025-01-14 ### Added 🆕 From 8cbe64eedd9dc87659061476ea18a15a85817785 Mon Sep 17 00:00:00 2001 From: jgallego Date: Mon, 27 Jan 2025 16:34:28 +0100 Subject: [PATCH 120/123] fix: remove orphaned agencyIncoming records with null agencyModeFk --- .../11411-turquoiseEucalyptus/00-agencyIncomingForeign.sql | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/db/versions/11411-turquoiseEucalyptus/00-agencyIncomingForeign.sql b/db/versions/11411-turquoiseEucalyptus/00-agencyIncomingForeign.sql index bf2c75f2b..e470282b7 100644 --- a/db/versions/11411-turquoiseEucalyptus/00-agencyIncomingForeign.sql +++ b/db/versions/11411-turquoiseEucalyptus/00-agencyIncomingForeign.sql @@ -1,3 +1,9 @@ +DELETE ai from + `vn`.`agencyIncoming` ai +LEFT JOIN `vn`.`agencyMode` am ON + am.id = ai.agencyModeFk +WHERE am.id IS null + ALTER TABLE `vn`.`agencyIncoming` ADD CONSTRAINT `fk_agencyIncoming_agencyMode` FOREIGN KEY (`agencyModeFk`) From b8f9dc7ad7b2e3bf81fa617e9347f03fb46ad51f Mon Sep 17 00:00:00 2001 From: jgallego Date: Mon, 27 Jan 2025 16:37:17 +0100 Subject: [PATCH 121/123] fix: correct SQL syntax for deleting orphaned agencyIncoming records --- .../00-agencyIncomingForeign.sql | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/db/versions/11411-turquoiseEucalyptus/00-agencyIncomingForeign.sql b/db/versions/11411-turquoiseEucalyptus/00-agencyIncomingForeign.sql index e470282b7..829236a2a 100644 --- a/db/versions/11411-turquoiseEucalyptus/00-agencyIncomingForeign.sql +++ b/db/versions/11411-turquoiseEucalyptus/00-agencyIncomingForeign.sql @@ -1,8 +1,8 @@ DELETE ai from - `vn`.`agencyIncoming` ai -LEFT JOIN `vn`.`agencyMode` am ON - am.id = ai.agencyModeFk -WHERE am.id IS null + `vn`.`agencyIncoming` ai + LEFT JOIN `vn`.`agencyMode` am ON + am.id = ai.agencyModeFk + WHERE am.id IS null; ALTER TABLE `vn`.`agencyIncoming` ADD CONSTRAINT `fk_agencyIncoming_agencyMode` From c73af0a44b46f89ff04624d0a44d0c55d174dda9 Mon Sep 17 00:00:00 2001 From: jgallego Date: Tue, 28 Jan 2025 08:09:18 +0100 Subject: [PATCH 122/123] fix: specify database context in agencyIncoming foreign key deletion SQL --- .../11411-turquoiseEucalyptus/00-agencyIncomingForeign.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/db/versions/11411-turquoiseEucalyptus/00-agencyIncomingForeign.sql b/db/versions/11411-turquoiseEucalyptus/00-agencyIncomingForeign.sql index 829236a2a..d2c46e9ca 100644 --- a/db/versions/11411-turquoiseEucalyptus/00-agencyIncomingForeign.sql +++ b/db/versions/11411-turquoiseEucalyptus/00-agencyIncomingForeign.sql @@ -1,3 +1,4 @@ +use `vn`; DELETE ai from `vn`.`agencyIncoming` ai LEFT JOIN `vn`.`agencyMode` am ON From f4b7683609d40b1a6b0dbf22ec4f4fd8719d9984 Mon Sep 17 00:00:00 2001 From: alexm Date: Tue, 28 Jan 2025 08:10:23 +0100 Subject: [PATCH 123/123] build: refs #8452 dump db --- db/dump/.dump/data.sql | 122 +++++++++++--------- db/dump/.dump/privileges.sql | 12 +- db/dump/.dump/structure.sql | 215 +++++++++++++++++++++++++++++------ db/dump/.dump/triggers.sql | 124 +++++++++++++++++++- 4 files changed, 381 insertions(+), 92 deletions(-) diff --git a/db/dump/.dump/data.sql b/db/dump/.dump/data.sql index b95890b0d..7fa281197 100644 --- a/db/dump/.dump/data.sql +++ b/db/dump/.dump/data.sql @@ -4,7 +4,7 @@ USE `util`; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -INSERT INTO `version` VALUES ('vn-database','11391','43edb1f82e88dcc44eedc8501b93c1fac66d71e9','2025-01-14 07:32:09','11407'); +INSERT INTO `version` VALUES ('vn-database','11410','7a02af9a3acae14a658de1557baa44542c24d480','2025-01-28 07:44:02','11423'); INSERT INTO `versionLog` VALUES ('vn-database','10107','00-firstScript.sql','jenkins@10.0.2.69','2022-04-23 10:53:53',NULL,NULL); INSERT INTO `versionLog` VALUES ('vn-database','10112','00-firstScript.sql','jenkins@10.0.2.69','2022-05-09 09:14:53',NULL,NULL); @@ -1041,6 +1041,7 @@ INSERT INTO `versionLog` VALUES ('vn-database','11261','00-firstScript.sql','jen INSERT INTO `versionLog` VALUES ('vn-database','11262','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2024-10-03 07:47:43',NULL,NULL); INSERT INTO `versionLog` VALUES ('vn-database','11263','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2024-09-27 12:05:32',NULL,NULL); INSERT INTO `versionLog` VALUES ('vn-database','11264','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-12 08:00:15',NULL,NULL); +INSERT INTO `versionLog` VALUES ('vn-database','11269','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2025-01-28 07:43:58',NULL,NULL); INSERT INTO `versionLog` VALUES ('vn-database','11271','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-12 08:00:15',NULL,NULL); INSERT INTO `versionLog` VALUES ('vn-database','11272','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2024-11-12 08:00:15',NULL,NULL); INSERT INTO `versionLog` VALUES ('vn-database','11273','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2024-10-03 10:50:51',NULL,NULL); @@ -1140,9 +1141,24 @@ INSERT INTO `versionLog` VALUES ('vn-database','11379','00-firstScript.sql','jen INSERT INTO `versionLog` VALUES ('vn-database','11379','01-secScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2025-01-07 07:46:32',NULL,NULL); INSERT INTO `versionLog` VALUES ('vn-database','11384','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2025-01-07 07:46:32',NULL,NULL); INSERT INTO `versionLog` VALUES ('vn-database','11385','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2025-01-07 07:46:33',NULL,NULL); +INSERT INTO `versionLog` VALUES ('vn-database','11387','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2025-01-28 07:43:58',NULL,NULL); INSERT INTO `versionLog` VALUES ('vn-database','11390','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2025-01-14 07:32:08',NULL,NULL); INSERT INTO `versionLog` VALUES ('vn-database','11391','00-itemAlter.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2025-01-14 07:32:08',NULL,NULL); +INSERT INTO `versionLog` VALUES ('vn-database','11396','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2025-01-28 07:43:58',NULL,NULL); +INSERT INTO `versionLog` VALUES ('vn-database','11398','00-zoneEventPriceOptimum.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2025-01-28 07:43:59',NULL,NULL); +INSERT INTO `versionLog` VALUES ('vn-database','11398','00-zonePriceOptimum.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2025-01-28 07:43:59',NULL,NULL); +INSERT INTO `versionLog` VALUES ('vn-database','11398','01-zoneUpdate.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2025-01-28 07:43:59',NULL,NULL); +INSERT INTO `versionLog` VALUES ('vn-database','11398','02-clientAlter.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2025-01-28 07:43:59',NULL,NULL); +INSERT INTO `versionLog` VALUES ('vn-database','11398','03-clientConfig.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2025-01-28 07:43:59',NULL,NULL); INSERT INTO `versionLog` VALUES ('vn-database','11400','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2025-01-09 09:55:24',NULL,NULL); +INSERT INTO `versionLog` VALUES ('vn-database','11405','00-entryAlter.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2025-01-28 07:44:00',NULL,NULL); +INSERT INTO `versionLog` VALUES ('vn-database','11406','00-currrencyAlter.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2025-01-28 07:44:00',NULL,NULL); +INSERT INTO `versionLog` VALUES ('vn-database','11406','01-currrencyUpdate.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2025-01-28 07:44:00',NULL,NULL); +INSERT INTO `versionLog` VALUES ('vn-database','11407','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2025-01-28 07:44:00',NULL,NULL); +INSERT INTO `versionLog` VALUES ('vn-database','11410','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2025-01-28 07:44:00',NULL,NULL); +INSERT INTO `versionLog` VALUES ('vn-database','11415','00-firstScript.sql','jenkins@db-proxy1.servers.dc.verdnatura.es','2025-01-20 08:12:38',NULL,NULL); +INSERT INTO `versionLog` VALUES ('vn-database','11418','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2025-01-21 11:03:27',NULL,NULL); +INSERT INTO `versionLog` VALUES ('vn-database','11423','00-firstScript.sql','jenkins@db-proxy2.servers.dc.verdnatura.es','2025-01-23 15:19:32',NULL,NULL); /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; @@ -1241,6 +1257,7 @@ INSERT INTO `role` VALUES (127,'timeControl','Tablet para fichar',1,'2024-01-09 INSERT INTO `role` VALUES (129,'buyerAssistant','Comprador que tienes mas permisos para ayudar al buyerBoss en algunas tareas',1,'2024-02-06 06:59:12','2024-02-06 06:59:12',783); INSERT INTO `role` VALUES (130,'reviewer','Revisor de producción',1,'2024-06-11 00:00:00','2024-06-11 00:00:00',10578); INSERT INTO `role` VALUES (131,'supplier','Privilegios básicos de un proveedor',1,'2024-07-05 10:18:58','2024-07-05 10:18:58',19295); +INSERT INTO `role` VALUES (132,'salesPersonClaim','Departamento de ventas con funciones de reclamaciones',1,'2025-01-17 07:07:40','2025-01-17 07:07:40',19295); INSERT INTO `roleInherit` VALUES (1,1,2,NULL); INSERT INTO `roleInherit` VALUES (2,1,3,NULL); @@ -1252,7 +1269,6 @@ INSERT INTO `roleInherit` VALUES (8,5,33,NULL); INSERT INTO `roleInherit` VALUES (10,11,6,NULL); INSERT INTO `roleInherit` VALUES (11,13,1,NULL); INSERT INTO `roleInherit` VALUES (12,15,35,NULL); -INSERT INTO `roleInherit` VALUES (16,17,20,NULL); INSERT INTO `roleInherit` VALUES (17,17,37,NULL); INSERT INTO `roleInherit` VALUES (18,17,39,NULL); INSERT INTO `roleInherit` VALUES (19,17,64,NULL); @@ -1327,7 +1343,6 @@ INSERT INTO `roleInherit` VALUES (105,72,18,NULL); INSERT INTO `roleInherit` VALUES (106,73,5,NULL); INSERT INTO `roleInherit` VALUES (107,73,64,NULL); INSERT INTO `roleInherit` VALUES (108,73,19,NULL); -INSERT INTO `roleInherit` VALUES (109,59,50,NULL); INSERT INTO `roleInherit` VALUES (115,39,76,NULL); INSERT INTO `roleInherit` VALUES (117,65,76,NULL); INSERT INTO `roleInherit` VALUES (118,30,76,NULL); @@ -1520,6 +1535,9 @@ INSERT INTO `roleInherit` VALUES (379,103,121,19294); INSERT INTO `roleInherit` VALUES (381,119,123,19295); INSERT INTO `roleInherit` VALUES (382,48,72,783); INSERT INTO `roleInherit` VALUES (383,114,111,19295); +INSERT INTO `roleInherit` VALUES (384,132,18,19295); +INSERT INTO `roleInherit` VALUES (385,132,72,19295); +INSERT INTO `roleInherit` VALUES (386,109,132,19295); INSERT INTO `userPassword` VALUES (1,7,1,0,2,1); @@ -2389,6 +2407,7 @@ INSERT INTO `ACL` VALUES (1012,'OsrmConfig','optimize','READ','ALLOW','ROLE','em INSERT INTO `ACL` VALUES (1013,'Route','optimizePriority','*','ALLOW','ROLE','employee',10578); INSERT INTO `ACL` VALUES (1014,'Worker','canModifyAbsenceInPast','WRITE','ALLOW','ROLE','hr',10578); INSERT INTO `ACL` VALUES (1015,'Worker','__get__sip','READ','ALLOW','ROLE','employee',19294); +INSERT INTO `ACL` VALUES (1016,'VnUser','adminUser','WRITE','ALLOW','ROLE','sysadmin',10578); INSERT INTO `fieldAcl` VALUES (1,'Client','name','update','employee'); INSERT INTO `fieldAcl` VALUES (2,'Client','contact','update','employee'); @@ -2687,71 +2706,72 @@ INSERT INTO `continent` VALUES (3,'África','AF'); INSERT INTO `continent` VALUES (4,'Europa','EU'); INSERT INTO `continent` VALUES (5,'Oceanía','OC'); -INSERT INTO `department` VALUES (1,'VN','VERDNATURA',1,130,763,0,0,0,0,26,NULL,'/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (1,'VN','VERDNATURA',1,132,763,0,0,0,0,26,NULL,'/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); INSERT INTO `department` VALUES (22,'shopping','COMPRAS',2,5,NULL,72,0,0,1,1,1,'/1/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL); INSERT INTO `department` VALUES (23,'CMA','CAMARA',15,16,NULL,72,1,1,2,0,37,'/1/37/',NULL,0,NULL,0,1,1,1,NULL,NULL,NULL,'PREVIOUS'); INSERT INTO `department` VALUES (31,'it','INFORMATICA',6,7,NULL,72,0,0,1,0,1,'/1/','informatica-cau',1,NULL,0,0,0,0,NULL,NULL,NULL,NULL); INSERT INTO `department` VALUES (34,'accounting','CONTABILIDAD',8,9,NULL,0,0,0,1,0,1,'/1/',NULL,1,NULL,1,0,0,0,NULL,NULL,NULL,NULL); INSERT INTO `department` VALUES (35,'finance','FINANZAS',10,11,NULL,0,0,0,1,0,1,'/1/',NULL,1,'begonya@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL); INSERT INTO `department` VALUES (36,'labor','LABORAL',12,13,NULL,0,0,0,1,0,1,'/1/',NULL,1,NULL,1,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (37,'PROD','PRODUCCION',14,37,NULL,72,1,1,1,11,1,'/1/',NULL,0,NULL,0,1,1,1,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (37,'PROD','PRODUCCION',14,39,NULL,72,1,1,1,12,1,'/1/',NULL,0,NULL,0,1,1,1,NULL,NULL,NULL,NULL); INSERT INTO `department` VALUES (38,'picking','SACADO',17,18,NULL,72,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,1,0,1,NULL,NULL,NULL,'ON_PREPARATION'); INSERT INTO `department` VALUES (39,'packing','ENCAJADO',19,20,NULL,72,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,1,NULL,NULL,NULL,'PACKING'); -INSERT INTO `department` VALUES (41,'administration','ADMINISTRACION',38,39,NULL,72,0,0,1,0,1,'/1/',NULL,1,NULL,1,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (43,'VT','VENTAS',40,89,NULL,0,0,0,1,24,1,'/1/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (44,'management','GERENCIA',90,91,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (45,'logistic','LOGISTICA',92,93,NULL,72,0,0,1,0,1,'/1/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (46,'delivery','REPARTO',94,95,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,1,0,0,NULL,NULL,NULL,'DELIVERY'); -INSERT INTO `department` VALUES (48,'storage','ALMACENAJE',96,97,NULL,0,1,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,'STORAGE'); -INSERT INTO `department` VALUES (49,NULL,'PROPIEDAD',98,99,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (52,NULL,'CARGA AEREA',100,101,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (53,'marketing','MARKETING Y COMUNICACIÓN',41,42,NULL,72,0,0,2,0,43,'/1/43/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (54,NULL,'ORNAMENTALES',102,103,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (41,'administration','ADMINISTRACION',40,41,NULL,72,0,0,1,0,1,'/1/',NULL,1,NULL,1,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (43,'VT','VENTAS',42,91,NULL,0,0,0,1,24,1,'/1/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (44,'management','GERENCIA',92,93,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (45,'logistic','LOGISTICA',94,95,NULL,72,0,0,1,0,1,'/1/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (46,'delivery','REPARTO',96,97,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,1,0,0,NULL,NULL,NULL,'DELIVERY'); +INSERT INTO `department` VALUES (48,'storage','ALMACENAJE',98,99,NULL,0,1,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,'STORAGE'); +INSERT INTO `department` VALUES (49,NULL,'PROPIEDAD',100,101,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (52,NULL,'CARGA AEREA',102,103,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (53,'marketing','MARKETING Y COMUNICACIÓN',43,44,NULL,72,0,0,2,0,43,'/1/43/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (54,NULL,'ORNAMENTALES',104,105,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); INSERT INTO `department` VALUES (55,NULL,'TALLER NATURAL',21,22,14548,72,0,0,2,0,37,'/1/37/',NULL,0,NULL,0,1,1,0,1118,NULL,NULL,NULL); INSERT INTO `department` VALUES (56,NULL,'TALLER ARTIFICIAL',23,24,8470,72,0,0,2,0,37,'/1/37/',NULL,0,NULL,0,1,1,0,1927,NULL,NULL,NULL); -INSERT INTO `department` VALUES (58,'CMP','CAMPOS',104,107,NULL,72,0,0,1,1,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,'FIELD'); -INSERT INTO `department` VALUES (59,'maintenance','MANTENIMIENTO',108,109,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,1,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (60,'claims','RECLAMACIONES',43,44,NULL,72,0,0,2,0,43,'/1/43/',NULL,0,NULL,0,1,0,0,NULL,NULL,NULL,'CLAIM'); -INSERT INTO `department` VALUES (61,NULL,'VNH',110,113,NULL,73,0,0,1,1,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (66,NULL,'VERDNAMADRID',114,115,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (58,'CMP','CAMPOS',106,109,NULL,72,0,0,1,1,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,'FIELD'); +INSERT INTO `department` VALUES (59,'maintenance','MANTENIMIENTO',110,111,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,1,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (60,'claims','RECLAMACIONES',45,46,NULL,72,0,0,2,0,43,'/1/43/',NULL,0,NULL,0,1,0,0,NULL,NULL,NULL,'CLAIM'); +INSERT INTO `department` VALUES (61,NULL,'VNH',112,115,NULL,73,0,0,1,1,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (66,NULL,'VERDNAMADRID',116,117,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); INSERT INTO `department` VALUES (68,NULL,'COMPLEMENTOS',25,26,NULL,72,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,1,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (69,NULL,'VERDNABARNA',116,117,NULL,74,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (80,'spainTeam5','EQUIPO ESPAÑA 5',45,46,4250,0,0,0,2,0,43,'/1/43/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (86,NULL,'LIMPIEZA',118,119,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (89,NULL,'COORDINACION',120,121,NULL,0,1,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (90,NULL,'TRAILER',111,112,NULL,0,0,0,2,0,61,'/1/61/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (69,NULL,'VERDNABARNA',118,119,NULL,74,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (80,'spainTeam5','EQUIPO ESPAÑA 5',47,48,4250,0,0,0,2,0,43,'/1/43/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (86,NULL,'LIMPIEZA',120,121,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (89,NULL,'COORDINACION',122,123,NULL,0,1,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (90,NULL,'TRAILER',113,114,NULL,0,0,0,2,0,61,'/1/61/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); INSERT INTO `department` VALUES (91,'artificial','ARTIFICIAL',27,28,NULL,0,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,'PREVIOUS'); -INSERT INTO `department` VALUES (92,NULL,'EQUIPO SILVERIO',47,48,1203,0,0,0,2,0,43,'/1/43/','sdc_equipo',0,'gestioncomercial@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (94,'spainTeam2','EQUIPO ESPAÑA 2',49,50,3797,0,0,0,2,0,43,'/1/43/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (95,'spainTeam1','EQUIPO ESPAÑA 1',51,52,24065,0,0,0,2,0,43,'/1/43/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (96,NULL,'EQUIPO C LOPEZ',53,54,4661,0,0,0,2,0,43,'/1/43/','cla_equipo',0,'gestioncomercial@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (115,NULL,'EQUIPO CLAUDI',55,56,3810,0,0,0,2,0,43,'/1/43/','csr_equipo',0,'gestioncomercial@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (123,NULL,'EQUIPO ELENA BASCUÑANA',57,58,7102,0,0,0,2,0,43,'/1/43/','ebt_equipo',0,'gestioncomercial@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (124,NULL,'CONTROL INTERNO',122,123,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (125,'spainTeam3','EQUIPO ESPAÑA 3',59,60,1118,0,0,0,2,0,43,'/1/43/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (92,NULL,'EQUIPO SILVERIO',49,50,1203,0,0,0,2,0,43,'/1/43/','sdc_equipo',0,'gestioncomercial@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (94,'spainTeam2','EQUIPO ESPAÑA 2',51,52,3797,0,0,0,2,0,43,'/1/43/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (95,'spainTeam1','EQUIPO ESPAÑA 1',53,54,24065,0,0,0,2,0,43,'/1/43/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (96,NULL,'EQUIPO C LOPEZ',55,56,4661,0,0,0,2,0,43,'/1/43/','cla_equipo',0,'gestioncomercial@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (115,NULL,'EQUIPO CLAUDI',57,58,3810,0,0,0,2,0,43,'/1/43/','csr_equipo',0,'gestioncomercial@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (123,NULL,'EQUIPO ELENA BASCUÑANA',59,60,7102,0,0,0,2,0,43,'/1/43/','ebt_equipo',0,'gestioncomercial@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (124,NULL,'CONTROL INTERNO',124,125,NULL,72,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (125,'spainTeam3','EQUIPO ESPAÑA 3',61,62,1118,0,0,0,2,0,43,'/1/43/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL); INSERT INTO `department` VALUES (126,NULL,'PRESERVADO',29,30,NULL,0,0,0,2,0,37,'/1/37/',NULL,0,NULL,0,1,1,0,NULL,NULL,NULL,NULL); INSERT INTO `department` VALUES (128,NULL,'PALETIZADO',31,32,NULL,0,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,'PALLETIZING'); INSERT INTO `department` VALUES (130,'reviewers','REVISION',33,34,NULL,0,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,1,NULL,NULL,NULL,'ON_CHECKING'); -INSERT INTO `department` VALUES (131,'greenhouse','INVERNADERO',105,106,NULL,0,0,0,2,0,58,'/1/58/',NULL,0,NULL,0,1,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (132,NULL,'EQUIPO DC',61,62,1731,0,0,0,2,0,43,'/1/43/','dc_equipo',1,'gestioncomercial@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (133,'franceTeamManagement','EQUIPO GESTIÓN FRANCIA',63,64,9751,72,0,0,2,0,43,'/1/43/','fr_equipo',1,'gestionfrancia@verdnatura.es',0,0,0,0,NULL,NULL,'3300',NULL); -INSERT INTO `department` VALUES (134,'portugalTeam','EQUIPO PORTUGAL',65,66,8964,0,0,0,2,0,43,'/1/43/','pt_equipo',1,'portugal@verdnatura.es',0,0,0,0,NULL,NULL,'3500',NULL); -INSERT INTO `department` VALUES (135,'routers','ENRUTADORES',124,125,NULL,0,0,0,1,0,1,'/1/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (136,'heavyVehicles','VEHICULOS PESADOS',126,127,NULL,0,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (137,'sorter','SORTER',128,129,NULL,0,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (139,'spainTeam4','EQUIPO ESPAÑA 4',67,68,3803,0,0,0,2,0,43,'/1/43/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (140,'internationalTeam','EQUIPO INTERNACIONAL',69,70,24065,0,0,0,2,0,43,'/1/43/','int_equipo',1,'international@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (131,'greenhouse','INVERNADERO',107,108,NULL,0,0,0,2,0,58,'/1/58/',NULL,0,NULL,0,1,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (132,NULL,'EQUIPO DC',63,64,1731,0,0,0,2,0,43,'/1/43/','dc_equipo',1,'gestioncomercial@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (133,'franceTeamManagement','EQUIPO GESTIÓN FRANCIA',65,66,9751,72,0,0,2,0,43,'/1/43/','fr_equipo',1,'gestionfrancia@verdnatura.es',0,0,0,0,NULL,NULL,'3300',NULL); +INSERT INTO `department` VALUES (134,'portugalTeam','EQUIPO PORTUGAL',67,68,8964,0,0,0,2,0,43,'/1/43/','pt_equipo',1,'portugal@verdnatura.es',0,0,0,0,NULL,NULL,'3500',NULL); +INSERT INTO `department` VALUES (135,'routers','ENRUTADORES',126,127,NULL,0,0,0,1,0,1,'/1/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (136,'heavyVehicles','VEHICULOS PESADOS',128,129,NULL,0,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (137,'sorter','SORTER',130,131,NULL,0,0,0,1,0,1,'/1/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (139,'spainTeam4','EQUIPO ESPAÑA 4',69,70,3803,0,0,0,2,0,43,'/1/43/',NULL,1,NULL,0,0,0,0,NULL,NULL,NULL,NULL); +INSERT INTO `department` VALUES (140,'internationalTeam','EQUIPO INTERNACIONAL',71,72,24065,0,0,0,2,0,43,'/1/43/','int_equipo',1,'international@verdnatura.es',0,0,0,0,NULL,NULL,NULL,NULL); INSERT INTO `department` VALUES (141,NULL,'PREVIA',35,36,NULL,0,1,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,1,NULL,NULL,NULL,'PREVIOUS'); INSERT INTO `department` VALUES (146,NULL,'VERDNACOLOMBIA',3,4,NULL,72,0,0,2,0,22,'/1/22/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); -INSERT INTO `department` VALUES (147,'spainTeamAsia','EQUIPO ESPAÑA ASIA',71,72,40214,0,0,0,2,0,43,'/1/43/','esA_equipo',1,'esA@verdnatura.es',0,0,0,0,NULL,NULL,'5500',NULL); -INSERT INTO `department` VALUES (148,'franceTeamCatchment','EQUIPO CAPTACIÓN FRANCIA',73,74,25178,0,0,0,2,0,43,'/1/43/',NULL,1,NULL,0,0,0,0,NULL,NULL,'6000',NULL); -INSERT INTO `department` VALUES (149,'spainTeamCatchment','EQUIPO ESPAÑA CAPTACIÓN',75,76,1203,0,0,0,2,0,43,'/1/43/','es_captacion_equipo',1,'es_captacion@verdnatura.es',0,0,0,0,NULL,NULL,'5700',NULL); -INSERT INTO `department` VALUES (150,'spainTeamLevanteIslands','EQUIPO ESPAÑA LEVANTE',77,78,1118,0,0,0,2,0,43,'/1/43/','es_levante_equipo',1,'es_levante@verdnatura.es',0,0,0,0,NULL,NULL,'5000',NULL); -INSERT INTO `department` VALUES (151,'spainTeamNorthwest','EQUIPO ESPAÑA NOROESTE',79,80,7102,0,0,0,2,0,43,'/1/43/','es_noroeste_equipo',1,'es_noroeste@verdnatura.es',0,0,0,0,NULL,NULL,'5300',NULL); -INSERT INTO `department` VALUES (152,'spainTeamNortheast','EQUIPO ESPAÑA NORESTE',81,82,1118,0,0,0,2,0,43,'/1/43/','es_noreste_equipo',1,'es_noreste@verdnatura.es',0,0,0,0,NULL,NULL,'5200',NULL); -INSERT INTO `department` VALUES (153,'spainTeamSouth','EQUIPO ESPAÑA SUR',83,84,36578,0,0,0,2,0,43,'/1/43/','es_sur_equipo',1,'es_sur@verdnatura.es',0,0,0,0,NULL,NULL,'5400',NULL); -INSERT INTO `department` VALUES (154,'spainTeamCenter','EQUIPO ESPAÑA CENTRO',85,86,4661,0,0,0,2,0,43,'/1/43/','es_centro_equipo',1,'es_centro@verdnatura.es',0,0,0,0,NULL,NULL,'5100',NULL); -INSERT INTO `department` VALUES (155,'spainTeamVip','EQUIPO ESPAÑA VIP',87,88,5432,0,0,0,2,0,43,'/1/43/','es_vip_equipo',1,'es_vip@verdnatura.es',0,0,0,0,NULL,NULL,'5600',NULL); +INSERT INTO `department` VALUES (147,'spainTeamAsia','EQUIPO ESPAÑA ASIA',73,74,40214,0,0,0,2,0,43,'/1/43/','esA_equipo',1,'esA@verdnatura.es',0,0,0,0,NULL,NULL,'5500',NULL); +INSERT INTO `department` VALUES (148,'franceTeamCatchment','EQUIPO CAPTACIÓN FRANCIA',75,76,25178,0,0,0,2,0,43,'/1/43/',NULL,1,NULL,0,0,0,0,NULL,NULL,'6000',NULL); +INSERT INTO `department` VALUES (149,'spainTeamCatchment','EQUIPO ESPAÑA CAPTACIÓN',77,78,1203,0,0,0,2,0,43,'/1/43/','es_captacion_equipo',1,'es_captacion@verdnatura.es',0,0,0,0,NULL,NULL,'5700',NULL); +INSERT INTO `department` VALUES (150,'spainTeamLevanteIslands','EQUIPO ESPAÑA LEVANTE',79,80,1118,0,0,0,2,0,43,'/1/43/','es_levante_equipo',1,'es_levante@verdnatura.es',0,0,0,0,NULL,NULL,'5000',NULL); +INSERT INTO `department` VALUES (151,'spainTeamNorthwest','EQUIPO ESPAÑA NOROESTE',81,82,7102,0,0,0,2,0,43,'/1/43/','es_noroeste_equipo',1,'es_noroeste@verdnatura.es',0,0,0,0,NULL,NULL,'5300',NULL); +INSERT INTO `department` VALUES (152,'spainTeamNortheast','EQUIPO ESPAÑA NORESTE',83,84,1118,0,0,0,2,0,43,'/1/43/','es_noreste_equipo',1,'es_noreste@verdnatura.es',0,0,0,0,NULL,NULL,'5200',NULL); +INSERT INTO `department` VALUES (153,'spainTeamSouth','EQUIPO ESPAÑA SUR',85,86,36578,0,0,0,2,0,43,'/1/43/','es_sur_equipo',1,'es_sur@verdnatura.es',0,0,0,0,NULL,NULL,'5400',NULL); +INSERT INTO `department` VALUES (154,'spainTeamCenter','EQUIPO ESPAÑA CENTRO',87,88,4661,0,0,0,2,0,43,'/1/43/','es_centro_equipo',1,'es_centro@verdnatura.es',0,0,0,0,NULL,NULL,'5100',NULL); +INSERT INTO `department` VALUES (155,'spainTeamVip','EQUIPO ESPAÑA VIP',89,90,5432,0,0,0,2,0,43,'/1/43/','es_vip_equipo',1,'es_vip@verdnatura.es',0,0,0,0,NULL,NULL,'5600',NULL); +INSERT INTO `department` VALUES (156,NULL,'COCINA',37,38,NULL,0,0,0,2,0,37,'/1/37/',NULL,0,NULL,0,0,0,0,NULL,NULL,NULL,NULL); INSERT INTO `docuware` VALUES (1,'deliveryNote','Albaranes cliente','find','find','N__ALBAR_N',NULL); INSERT INTO `docuware` VALUES (2,'deliveryNote','Albaranes cliente','store','Archivar','N__ALBAR_N',NULL); diff --git a/db/dump/.dump/privileges.sql b/db/dump/.dump/privileges.sql index 598bfdf75..1d4fce189 100644 --- a/db/dump/.dump/privileges.sql +++ b/db/dump/.dump/privileges.sql @@ -602,7 +602,7 @@ INSERT IGNORE INTO `tables_priv` VALUES ('','vn','administrative','projectState' INSERT IGNORE INTO `tables_priv` VALUES ('','vn','employee','entrySplit__','alexm@%','0000-00-00 00:00:00','Select,Insert,Update,Delete',''); INSERT IGNORE INTO `tables_priv` VALUES ('','vn','employee','entryType','alexm@%','0000-00-00 00:00:00','Select',''); INSERT IGNORE INTO `tables_priv` VALUES ('','vn','administrative','projectNotes','alexm@%','0000-00-00 00:00:00','Select',''); -INSERT IGNORE INTO `tables_priv` VALUES ('','vn','administrative','project','juan@10.5.1.1','0000-00-00 00:00:00','Select,Update',''); +INSERT IGNORE INTO `tables_priv` VALUES ('','vn','administrative','project','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select,Insert,Update',''); INSERT IGNORE INTO `tables_priv` VALUES ('','vn','employee','productionConfig','alexm@%','0000-00-00 00:00:00','Select',''); INSERT IGNORE INTO `tables_priv` VALUES ('','vn','manager','productionConfig','alexm@%','0000-00-00 00:00:00','Update',''); INSERT IGNORE INTO `tables_priv` VALUES ('','vn','grafana','creditInsurance','juan@db-proxy2.static.verdnatura.es','0000-00-00 00:00:00','Select',''); @@ -1498,6 +1498,13 @@ INSERT IGNORE INTO `tables_priv` VALUES ('','vn','employee','zoneGeo','guillermo INSERT IGNORE INTO `tables_priv` VALUES ('','vn','buyer','itemCampaign','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select',''); INSERT IGNORE INTO `tables_priv` VALUES ('','vn','grafana','itemCampaign','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select',''); INSERT IGNORE INTO `tables_priv` VALUES ('','vn','buyer','campaign','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select',''); +INSERT IGNORE INTO `tables_priv` VALUES ('','vn','grafana','awb','guillermo@db-proxy2.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select',''); +INSERT IGNORE INTO `tables_priv` VALUES ('','vn','grafana','awbComponent','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select',''); +INSERT IGNORE INTO `tables_priv` VALUES ('','vn','grafana','awbComponentType','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select',''); +INSERT IGNORE INTO `tables_priv` VALUES ('','vn','logisticAssist','itemSoldOutTag','jenkins@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select,Insert,Update,Delete',''); +INSERT IGNORE INTO `tables_priv` VALUES ('','vn','logisticAssist','itemDurationTag','jenkins@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select,Insert,Update,Delete',''); +INSERT IGNORE INTO `tables_priv` VALUES ('','vn','logisticAssist','itemGrowingTag','jenkins@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Select,Insert,Update,Delete',''); +INSERT IGNORE INTO `tables_priv` VALUES ('','vn','adminBoss','receipt','guillermo@db-proxy1.servers.dc.verdnatura.es','0000-00-00 00:00:00','Update,Delete',''); /*!40000 ALTER TABLE `tables_priv` ENABLE KEYS */; /*!40000 ALTER TABLE `columns_priv` DISABLE KEYS */; @@ -2142,6 +2149,7 @@ INSERT IGNORE INTO `procs_priv` VALUES ('','srt','delivery','buffer_settypebynam INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','expedition_getstate','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00'); INSERT IGNORE INTO `procs_priv` VALUES ('','srt','delivery','expedition_scan','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00'); INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','itemshelving_get','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00'); +INSERT IGNORE INTO `procs_priv` VALUES ('','vn','financial','remittance_calc','PROCEDURE','jgallego@db-proxy2.servers.dc.verdnatura.es','Execute','0000-00-00 00:00:00'); INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','itemshelving_add','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00'); INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','itemshelving_getsaledate','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00'); INSERT IGNORE INTO `procs_priv` VALUES ('','vn','delivery','itemshelving_filterbuyer','PROCEDURE','guillermo@db-proxy1.static.verdnatura.es','Execute','0000-00-00 00:00:00'); @@ -2204,7 +2212,6 @@ INSERT IGNORE INTO `procs_priv` VALUES ('','vn','claimManager','entry_getTransfe INSERT IGNORE INTO `procs_priv` VALUES ('','vn','buyer','entry_getTransfer','PROCEDURE','jenkins@db-proxy1.servers.dc.verdnatura.es','Execute','0000-00-00 00:00:00'); INSERT IGNORE INTO `procs_priv` VALUES ('','vn','administrative','intrastat_estimateNet','FUNCTION','jenkins@db-proxy1.servers.dc.verdnatura.es','Execute','0000-00-00 00:00:00'); INSERT IGNORE INTO `procs_priv` VALUES ('','vn','artificialBoss','confection_controlSource','PROCEDURE','jenkins@db-proxy1.servers.dc.verdnatura.es','Execute','0000-00-00 00:00:00'); -INSERT IGNORE INTO `procs_priv` VALUES ('','vn','financial','remittance_calc','PROCEDURE','alexm@db-proxy1.servers.dc.verdnatura.es','Execute','0000-00-00 00:00:00'); INSERT IGNORE INTO `procs_priv` VALUES ('','util','developer','connection_kill','PROCEDURE','jenkins@db-proxy1.servers.dc.verdnatura.es','Execute','0000-00-00 00:00:00'); INSERT IGNORE INTO `procs_priv` VALUES ('','vn','financial','client_getRisk','PROCEDURE','jenkins@db-proxy1.servers.dc.verdnatura.es','Execute','0000-00-00 00:00:00'); INSERT IGNORE INTO `procs_priv` VALUES ('','account','developer','user_hasRole','FUNCTION','root@localhost','Execute','0000-00-00 00:00:00'); @@ -2312,6 +2319,7 @@ INSERT IGNORE INTO `global_priv` VALUES ('','root','{\"access\": 549755781119, \ INSERT IGNORE INTO `global_priv` VALUES ('','salesAssistant','{\"access\":0,\"version_id\":101106,\"is_role\":true}'); INSERT IGNORE INTO `global_priv` VALUES ('','salesBoss','{\"access\":0,\"version_id\":101106,\"is_role\":true}'); INSERT IGNORE INTO `global_priv` VALUES ('','salesPerson','{\"access\": 0, \"is_role\": true,\"version_id\":101106}'); +INSERT IGNORE INTO `global_priv` VALUES ('','salesPersonClaim','{\"access\":0,\"version_id\":101106,\"is_role\":true}'); INSERT IGNORE INTO `global_priv` VALUES ('','salesTeamBoss','{\"access\":0,\"version_id\":100707,\"is_role\":true}'); INSERT IGNORE INTO `global_priv` VALUES ('','salix','{\"access\":33555456,\"version_id\":100707,\"is_role\":true}'); INSERT IGNORE INTO `global_priv` VALUES ('','sysadmin','{\"access\": 201326592, \"is_role\": true, \"version_id\": 100707}'); diff --git a/db/dump/.dump/structure.sql b/db/dump/.dump/structure.sql index 58f1e7591..97f7bc512 100644 --- a/db/dump/.dump/structure.sql +++ b/db/dump/.dump/structure.sql @@ -2543,17 +2543,17 @@ CREATE TABLE `defaulting` ( /*!40101 SET character_set_client = @saved_cs_client */; -- --- Table structure for table `f_tvc` +-- Table structure for table `f_tvc__` -- -DROP TABLE IF EXISTS `f_tvc`; +DROP TABLE IF EXISTS `f_tvc__`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; -CREATE TABLE `f_tvc` ( +CREATE TABLE `f_tvc__` ( `Id_Ticket` int(11) NOT NULL, PRIMARY KEY (`Id_Ticket`), CONSTRAINT `id_ticket_to_comisionantes` FOREIGN KEY (`Id_Ticket`) REFERENCES `vn`.`ticket` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='Almacenamos la lista de tickets para agilizar la consulta. Corresponde a los clientes REAL y en los almacenes COMISIONANTES'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='@deprecated 2025-01-15'; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -25878,7 +25878,7 @@ CREATE TABLE `address` ( `isActive` tinyint(4) NOT NULL DEFAULT 1, `longitude` decimal(11,7) DEFAULT NULL COMMENT 'Indica la última longitud proporcionada por tabla delivery', `latitude` decimal(11,7) DEFAULT NULL COMMENT 'Indica la última latitud proporcionada por tabla delivery', - `isEqualizated` tinyint(1) NOT NULL DEFAULT 0, + `isEqualizated` tinyint(1) DEFAULT NULL, `customsAgentFk` int(11) DEFAULT NULL, `incotermsFk` varchar(3) DEFAULT NULL, `isLogifloraAllowed` tinyint(4) NOT NULL DEFAULT 0, @@ -27725,6 +27725,7 @@ CREATE TABLE `client` ( `hasDailyInvoice` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'Indica si el cliente requiere facturación diaria por defecto se copiará lo que tenga country.hasDailyInvoice', `geoFk` int(11) DEFAULT NULL, `editorFk` int(10) unsigned DEFAULT NULL, + `packagesDiscountFactor` decimal(4,3) NOT NULL DEFAULT 1.000 COMMENT 'Porcentaje de ajuste entre el numero de bultos medio del cliente, y el número medio óptimo para las zonas en las que compra', PRIMARY KEY (`id`), UNIQUE KEY `IF` (`fi`), KEY `Id_Trabajador` (`salesPersonFk`), @@ -27804,6 +27805,8 @@ CREATE TABLE `clientConfig` ( `defaultHasCoreVnl` tinyint(1) DEFAULT NULL, `defaultMandateTypeFk` smallint(5) DEFAULT NULL, `monthsToDisableUser` int(10) unsigned DEFAULT NULL, + `packagesOptimum` int(10) unsigned NOT NULL DEFAULT 20 COMMENT 'Numero de bultos por cliente/dia para conseguir el precio optimo', + `monthsToCalcOptimumPrice` tinyint(3) unsigned NOT NULL DEFAULT 3 COMMENT 'Número de meses a usar para el cálculo de client.packagesDiscountFactor', PRIMARY KEY (`id`), KEY `clientNewConfigPayMethod_FK` (`defaultPayMethodFk`), KEY `clientNewConfigMandateType_FK` (`defaultMandateTypeFk`), @@ -29061,6 +29064,7 @@ CREATE TABLE `currency` ( `code` varchar(3) NOT NULL, `name` varchar(45) DEFAULT NULL, `ratio` double NOT NULL DEFAULT 1, + `hasToDownloadRate` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'Si se guarda el tipo de cambio diariamente en referenceRate', PRIMARY KEY (`id`), UNIQUE KEY `Moneda_UNIQUE` (`code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; @@ -29972,6 +29976,8 @@ CREATE TABLE `entry` ( `editorFk` int(10) unsigned DEFAULT NULL, `lockerUserFk` int(10) unsigned DEFAULT NULL, `locked` datetime DEFAULT current_timestamp(), + `initialTemperature` decimal(10,2) DEFAULT NULL COMMENT 'Temperatura de como lo recibimos del proveedor ej. en colombia', + `finalTemperature` decimal(10,2) DEFAULT NULL COMMENT 'Temperatura final de como llega a nuestras instalaciones', PRIMARY KEY (`id`), KEY `Id_Proveedor` (`supplierFk`), KEY `Fecha` (`dated`), @@ -31774,6 +31780,8 @@ CREATE TABLE `invoiceOut` ( `cplusTaxBreakFk` int(10) unsigned NOT NULL DEFAULT 1, `cplusSubjectOpFk` int(10) unsigned NOT NULL DEFAULT 1, `siiTrascendencyInvoiceOutFk` int(10) unsigned NOT NULL DEFAULT 1, + `customsAgentFk` int(11) DEFAULT NULL, + `incotermsFk` varchar(3) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `invoiceOut_unique` (`ref`), KEY `Id_Banco` (`bankFk`), @@ -31786,9 +31794,13 @@ CREATE TABLE `invoiceOut` ( KEY `Facturas_ibfk_5_idx` (`siiTrascendencyInvoiceOutFk`), KEY `Facturas_idx_Vencimiento` (`dued`), KEY `invoiceOut_serial` (`serial`), + KEY `invoiceOut_customsAgentFk` (`customsAgentFk`), + KEY `invoiceOut_incotermsFk` (`incotermsFk`), + CONSTRAINT `invoiceOut_customsAgentFk` FOREIGN KEY (`customsAgentFk`) REFERENCES `customsAgent` (`id`) ON UPDATE CASCADE, CONSTRAINT `invoiceOut_ibfk_2` FOREIGN KEY (`siiTypeInvoiceOutFk`) REFERENCES `siiTypeInvoiceOut` (`id`) ON UPDATE CASCADE, CONSTRAINT `invoiceOut_ibfk_3` FOREIGN KEY (`cplusSubjectOpFk`) REFERENCES `cplusSubjectOp` (`id`) ON UPDATE CASCADE, CONSTRAINT `invoiceOut_ibfk_4` FOREIGN KEY (`cplusTaxBreakFk`) REFERENCES `cplusTaxBreak` (`id`) ON UPDATE CASCADE, + CONSTRAINT `invoiceOut_incotermsFk` FOREIGN KEY (`incotermsFk`) REFERENCES `incoterms` (`code`) ON UPDATE CASCADE, CONSTRAINT `invoiceOut_serial` FOREIGN KEY (`serial`) REFERENCES `invoiceOutSerial` (`code`), CONSTRAINT `invoice_bank_id` FOREIGN KEY (`bankFk`) REFERENCES `accounting` (`id`) ON UPDATE CASCADE, CONSTRAINT `invoice_customer_id` FOREIGN KEY (`clientFk`) REFERENCES `client` (`id`) ON UPDATE CASCADE @@ -32259,6 +32271,21 @@ CREATE TABLE `itemCost` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='Almacena los valores de rotacion en los ultimos 365 dias'; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Table structure for table `itemDurationTag` +-- + +DROP TABLE IF EXISTS `itemDurationTag`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `itemDurationTag` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name_UNIQUE` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + -- -- Temporary table structure for view `itemEntryIn` -- @@ -32323,6 +32350,21 @@ CREATE TABLE `itemFarmingTag` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Table structure for table `itemGrowingTag` +-- + +DROP TABLE IF EXISTS `itemGrowingTag`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `itemGrowingTag` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name_UNIQUE` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + -- -- Table structure for table `itemImageQueue` -- @@ -32871,6 +32913,21 @@ SET character_set_client = utf8; 1 AS `removed` */; SET character_set_client = @saved_cs_client; +-- +-- Table structure for table `itemSoldOutTag` +-- + +DROP TABLE IF EXISTS `itemSoldOutTag`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `itemSoldOutTag` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name_UNIQUE` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + -- -- Table structure for table `itemStateTag` -- @@ -35460,6 +35517,21 @@ CREATE TABLE `productionConfigLog` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Table structure for table `productionCountry` +-- + +DROP TABLE IF EXISTS `productionCountry`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `productionCountry` ( + `countryFk` mediumint(8) unsigned NOT NULL, + `volumeGrowthEstimatePercent` decimal(6,2) DEFAULT NULL COMMENT 'Porcentaje estimado de crecimiento del volumen', + PRIMARY KEY (`countryFk`), + CONSTRAINT `productionCountryVolume_countryFK` FOREIGN KEY (`countryFk`) REFERENCES `country` (`id`) ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='Datos de producción por país'; +/*!40101 SET character_set_client = @saved_cs_client */; + -- -- Table structure for table `productionError` -- @@ -37992,7 +38064,7 @@ CREATE TABLE `supplier` ( `payDay` tinyint(4) unsigned DEFAULT NULL, `payDemFk` tinyint(3) unsigned NOT NULL DEFAULT 7, `created` timestamp NOT NULL DEFAULT current_timestamp(), - `isReal` tinyint(1) unsigned NOT NULL DEFAULT 0, + `isReal` tinyint(1) unsigned NOT NULL DEFAULT 1, `note` text CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci DEFAULT NULL, `postcodeFk` int(11) unsigned DEFAULT NULL, `postCode` char(8) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci DEFAULT NULL, @@ -38585,6 +38657,7 @@ CREATE TABLE `ticket` ( KEY `tickets_zone_fk_idx` (`zoneFk`), KEY `ticket_fk_editor` (`editorFk`), KEY `ticket_cmrFk` (`cmrFk`), + KEY `ticket_landed_IDX` (`landed`) USING BTREE, CONSTRAINT `ticketCompany_Fk` FOREIGN KEY (`companyFk`) REFERENCES `company` (`id`) ON UPDATE CASCADE, CONSTRAINT `ticket_cmrFk` FOREIGN KEY (`cmrFk`) REFERENCES `cmr` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `ticket_customer_id` FOREIGN KEY (`clientFk`) REFERENCES `client` (`id`) ON UPDATE CASCADE, @@ -41261,6 +41334,7 @@ CREATE TABLE `zone` ( `agencyModeFk` int(11) NOT NULL, `travelingDays` int(11) NOT NULL DEFAULT 1, `price` decimal(10,2) DEFAULT NULL, + `priceOptimum` decimal(10,2) NOT NULL COMMENT 'Precio mínimo que puede pagar un bulto', `bonus` double NOT NULL DEFAULT 0, `isVolumetric` tinyint(1) NOT NULL DEFAULT 0, `inflation` decimal(5,2) NOT NULL DEFAULT 1.00, @@ -41277,7 +41351,8 @@ CREATE TABLE `zone` ( KEY `zone_address_FK` (`addressFk`), CONSTRAINT `fk_zone_2` FOREIGN KEY (`agencyModeFk`) REFERENCES `agencyMode` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `zone_address_FK` FOREIGN KEY (`addressFk`) REFERENCES `address` (`id`) ON UPDATE CASCADE, - CONSTRAINT `zone_fk_editor` FOREIGN KEY (`editorFk`) REFERENCES `account`.`user` (`id`) + CONSTRAINT `zone_fk_editor` FOREIGN KEY (`editorFk`) REFERENCES `account`.`user` (`id`), + CONSTRAINT `ck_zone_priceOptimum` CHECK (`priceOptimum` <= `price`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; @@ -41370,6 +41445,7 @@ CREATE TABLE `zoneEvent` ( `hour` datetime DEFAULT NULL, `travelingDays` int(11) DEFAULT NULL, `price` decimal(10,2) DEFAULT NULL, + `priceOptimum` decimal(10,2) DEFAULT NULL COMMENT 'Precio mínimo que puede pagar un bulto', `bonus` decimal(10,2) DEFAULT NULL, `m3Max` decimal(10,2) unsigned DEFAULT NULL, `editorFk` int(10) unsigned DEFAULT NULL, @@ -41377,7 +41453,8 @@ CREATE TABLE `zoneEvent` ( UNIQUE KEY `zoneFk` (`zoneFk`,`type`,`dated`), KEY `zoneEvent_fk_editor` (`editorFk`), CONSTRAINT `zoneEvent_fk_editor` FOREIGN KEY (`editorFk`) REFERENCES `account`.`user` (`id`), - CONSTRAINT `zoneEvent_ibfk_1` FOREIGN KEY (`zoneFk`) REFERENCES `zone` (`id`) ON DELETE CASCADE ON UPDATE CASCADE + CONSTRAINT `zoneEvent_ibfk_1` FOREIGN KEY (`zoneFk`) REFERENCES `zone` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `ck_zoneEvent_priceOptimum` CHECK (`priceOptimum` <= `price`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; @@ -41611,6 +41688,24 @@ END */ ;; /*!50003 SET character_set_client = @saved_cs_client */ ;; /*!50003 SET character_set_results = @saved_cs_results */ ;; /*!50003 SET collation_connection = @saved_col_connection */ ;; +/*!50106 DROP EVENT IF EXISTS `client_setPackagesDiscountFactor` */;; +DELIMITER ;; +/*!50003 SET @saved_cs_client = @@character_set_client */ ;; +/*!50003 SET @saved_cs_results = @@character_set_results */ ;; +/*!50003 SET @saved_col_connection = @@collation_connection */ ;; +/*!50003 SET character_set_client = utf8mb4 */ ;; +/*!50003 SET character_set_results = utf8mb4 */ ;; +/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ;; +/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ;; +/*!50003 SET @saved_time_zone = @@time_zone */ ;; +/*!50003 SET time_zone = 'SYSTEM' */ ;; +/*!50106 CREATE*/ /*!50117 DEFINER=`vn`@`localhost`*/ /*!50106 EVENT `client_setPackagesDiscountFactor` ON SCHEDULE EVERY 1 DAY STARTS '2024-10-18 03:00:00' ON COMPLETION PRESERVE ENABLE DO CALL client_setPackagesDiscountFactor() */ ;; +/*!50003 SET time_zone = @saved_time_zone */ ;; +/*!50003 SET sql_mode = @saved_sql_mode */ ;; +/*!50003 SET character_set_client = @saved_cs_client */ ;; +/*!50003 SET character_set_results = @saved_cs_results */ ;; +/*!50003 SET collation_connection = @saved_col_connection */ ;; /*!50106 DROP EVENT IF EXISTS `client_unassignSalesPerson` */;; DELIMITER ;; /*!50003 SET @saved_cs_client = @@character_set_client */ ;; @@ -49234,7 +49329,19 @@ BEGIN SELECT tcc.warehouseFK, tcc.itemFk, c2.id, - z.inflation * ROUND(ic.cm3delivery * (IFNULL(zo.price,5000) - IFNULL(zo.bonus,0)) / (1000 * vc.standardFlowerBox) , 4) cost + z.inflation + * ROUND( + ic.cm3delivery + * ( + ( + zo.priceOptimum + (( zo.price - zo.priceOptimum) * 2 * ( 1 - c.packagesDiscountFactor)) + ) + - IFNULL(zo.bonus, 0) + ) + / (1000 * vc.standardFlowerBox), + 4 + ) cost + FROM tmp.ticketComponentCalculate tcc JOIN item i ON i.id = tcc.itemFk JOIN tmp.zoneOption zo ON zo.zoneFk = vZoneFk @@ -49242,6 +49349,7 @@ BEGIN JOIN agencyMode am ON am.id = z.agencyModeFk JOIN vn.volumeConfig vc JOIN vn.component c2 ON c2.code = 'delivery' + JOIN `client` c on c.id = vClientFk LEFT JOIN itemCost ic ON ic.warehouseFk = tcc.warehouseFk AND ic.itemFk = tcc.itemFk HAVING cost <> 0; @@ -50944,6 +51052,41 @@ BEGIN ORDER BY clientFk; +END ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ; +/*!50003 DROP PROCEDURE IF EXISTS `client_setPackagesDiscountFactor` */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; +DELIMITER ;; +CREATE DEFINER=`vn`@`localhost` PROCEDURE `client_setPackagesDiscountFactor`() +BEGIN + /** + * Set the discount factor for the packages of the clients. + */ + UPDATE client c + JOIN ( + SELECT t.clientFk, + LEAST(( + SUM(t.packages) / COUNT(DISTINCT DATE(t.shipped)) + ) / cc.packagesOptimum, 1) discountFactor + FROM ticket t + JOIN clientConfig cc ON TRUE + WHERE t.shipped > util.VN_CURDATE() - INTERVAL cc.monthsToCalcOptimumPrice MONTH + AND t.packages + GROUP BY t.clientFk + ) ca ON c.id = ca.clientFk + SET c.packagesDiscountFactor = ca.discountFactor; + END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -58737,6 +58880,7 @@ BEGIN DECLARE vMaxShipped DATE; DECLARE vDone BOOL; DECLARE vTicketFk INT; + DECLARE vAddressFk INT; DECLARE vCursor CURSOR FOR SELECT id FROM tmp.ticketToInvoice; @@ -58751,11 +58895,13 @@ BEGIN DATE(vInvoiceDate) >= invoiceOut_getMaxIssued( vSerial, t.companyFk, - YEAR(vInvoiceDate)) + YEAR(vInvoiceDate)), + t.addressFk INTO vClientFk, vCompanyFk, vMaxShipped, - vIsCorrectInvoiceDate + vIsCorrectInvoiceDate, + vAddressFk FROM tmp.ticketToInvoice tt JOIN ticket t ON t.id = tt.id; @@ -58808,7 +58954,9 @@ BEGIN clientFk, dued, companyFk, - siiTypeInvoiceOutFk + siiTypeInvoiceOutFk, + customsAgentFk, + incotermsFk ) SELECT 1, @@ -58821,9 +58969,12 @@ BEGIN vCplusCorrectingInvoiceTypeFk, IF(vSerial = vSimplifiedSerial, vCplusSimplifiedInvoiceTypeFk, - vCplusStandardInvoiceTypeFk)) - FROM client - WHERE id = vClientFk; + vCplusStandardInvoiceTypeFk)), + a.customsAgentFk, + a.incotermsFk + FROM client c + JOIN address a ON a.id = vAddressFk + WHERE c.id = vClientFk; SET vNewInvoiceId = LAST_INSERT_ID(); @@ -67491,14 +67642,14 @@ DELIMITER ; /*!50003 SET character_set_results = @saved_cs_results */ ; /*!50003 SET collation_connection = @saved_col_connection */ ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ; -/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ; +/*!50003 SET sql_mode = 'NO_ENGINE_SUBSTITUTION' */ ; /*!50003 DROP PROCEDURE IF EXISTS `remittance_calc` */; /*!50003 SET @saved_cs_client = @@character_set_client */ ; /*!50003 SET @saved_cs_results = @@character_set_results */ ; /*!50003 SET @saved_col_connection = @@collation_connection */ ; /*!50003 SET character_set_client = utf8mb4 */ ; /*!50003 SET character_set_results = utf8mb4 */ ; -/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; +/*!50003 SET collation_connection = utf8mb4_general_ci */ ; DELIMITER ;; CREATE DEFINER=`vn`@`localhost` PROCEDURE `remittance_calc`( vDated DATE @@ -67562,7 +67713,7 @@ BEGIN ) risk ON risk.clientFk = c.id GROUP BY risk.companyFk, c.id - HAVING receipt > 10 + HAVING receipt > 1 ) sub ON sub.id = c.id JOIN supplier s ON s.id = sub.companyFk JOIN company co ON co.id = sub.companyFk @@ -74504,9 +74655,6 @@ BEGIN IFNULL(sat.supplierFk, su.id) supplierFk, t.landed FROM ticket t - JOIN ticketState ts ON ts.ticketFk = t.id - JOIN `state` s ON s.id = ts.stateFk - JOIN alertLevel al ON al.id = s.alertLevel JOIN client c ON c.id = t.clientFk JOIN `address` a ON a.id = t.addressFk JOIN province p ON p.id = a.provinceFk @@ -74523,8 +74671,7 @@ BEGIN LEFT JOIN agency ag ON ag.id = am.agencyFk LEFT JOIN supplierAgencyTerm sat ON sat.agencyFk = ag.id AND wo.isFreelance - WHERE al.code IN ('PACKED', 'DELIVERED') - AND co.code <> 'ES' + WHERE co.code <> 'ES' AND am.name <> 'ABONO' AND w.code = 'ALG' AND t.id = vSelf @@ -81591,26 +81738,27 @@ DELIMITER ; DELIMITER ;; CREATE DEFINER=`vn`@`localhost` PROCEDURE `zone_getAddresses`( vSelf INT, - vShipped DATE, + vLanded DATE, vDepartmentFk INT ) BEGIN /** * Devuelve un listado de todos los clientes activos * con consignatarios a los que se les puede - * vender producto para esa zona. + * entregar producto para esa zona. * * @param vSelf Id de zona - * @param vShipped Fecha de envio - * @param vDepartmentFk Id de departamento + * @param vLanded Fecha de entrega + * @param vDepartmentFk Id de departamento | NULL para mostrar todos * @return Un select */ CALL zone_getPostalCode(vSelf); WITH clientWithTicket AS ( - SELECT clientFk + SELECT DISTINCT clientFk FROM vn.ticket - WHERE shipped BETWEEN vShipped AND util.dayEnd(vShipped) + WHERE landed BETWEEN vLanded AND util.dayEnd(vLanded) + AND NOT isDeleted ) SELECT c.id, c.name, @@ -81620,7 +81768,7 @@ BEGIN u.name username, aai.invoiced, cnb.lastShipped, - cwt.clientFk + IF(cwt.clientFk, TRUE, FALSE) hasTicket FROM vn.client c JOIN vn.worker w ON w.id = c.salesPersonFk JOIN vn.workerDepartment wd ON wd.workerFk = w.id @@ -81640,7 +81788,7 @@ BEGIN AND c.isActive AND ct.code = 'normal' AND bt.code <> 'worker' - AND (d.id = vDepartmentFk OR NOT vDepartmentFk) + AND (d.id = vDepartmentFk OR vDepartmentFk IS NULL) GROUP BY c.id; DROP TEMPORARY TABLE tmp.zoneNodes; @@ -82332,7 +82480,7 @@ BEGIN * @return tmp.zoneOption(zoneFk, hour, travelingDays, price, bonus, specificity) The computed options */ DECLARE vHour TIME DEFAULT TIME(util.VN_NOW()); - + DROP TEMPORARY TABLE IF EXISTS tLandings; CREATE TEMPORARY TABLE tLandings (INDEX (eventFk)) @@ -82353,6 +82501,7 @@ BEGIN TIME(IFNULL(e.`hour`, z.`hour`)) `hour`, l.travelingDays, IFNULL(e.price, z.price) price, + IFNULL(e.priceOptimum, z.priceOptimum) priceOptimum, IFNULL(e.bonus, z.bonus) bonus, l.landed, vShipped shipped @@ -90893,4 +91042,4 @@ USE `vn2008`; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2025-01-14 6:39:04 +-- Dump completed on 2025-01-28 7:08:42 diff --git a/db/dump/.dump/triggers.sql b/db/dump/.dump/triggers.sql index fb72e9899..4f7bab43b 100644 --- a/db/dump/.dump/triggers.sql +++ b/db/dump/.dump/triggers.sql @@ -6804,6 +6804,30 @@ DELIMITER ;; FOR EACH ROW BEGIN SET NEW.editorFk = account.myUser_getId(); + + IF NOT(NEW.`countryFk` <=> OLD.`countryFk`) OR NOT(NEW.`itemFk` <=> OLD.`itemFk`) THEN + CALL util.throw('Only the VAT can be modified'); + END IF; +END */;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`vn`@`localhost`*/ /*!50003 TRIGGER `vn`.`itemTaxCountry_beforeDelete` + BEFORE DELETE ON `itemTaxCountry` + FOR EACH ROW +BEGIN + CALL util.throw('Records in this table cannot be deleted'); END */;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -11019,6 +11043,92 @@ DELIMITER ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ; /*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`vn`@`localhost`*/ /*!50003 TRIGGER `vn`.`workerMana_beforeInsert` + BEFORE INSERT ON `workerMana` + FOR EACH ROW +BEGIN + IF (SELECT EXISTS(SELECT TRUE FROM workerManaExcluded WHERE workerFk = NEW.workerFk)) THEN + CALL util.throw('Worker is excluded from mana'); + END IF; +END */;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`vn`@`localhost`*/ /*!50003 TRIGGER `vn`.`workerMana_beforeUpdate` + BEFORE UPDATE ON `workerMana` + FOR EACH ROW +BEGIN + IF (SELECT EXISTS(SELECT TRUE FROM workerManaExcluded WHERE workerFk = NEW.workerFk)) THEN + CALL util.throw('Worker is excluded from mana'); + END IF; +END */;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`vn`@`localhost`*/ /*!50003 TRIGGER `vn`.`workerManaExcluded_beforeInsert` + BEFORE INSERT ON `workerManaExcluded` + FOR EACH ROW +BEGIN + DELETE FROM workerMana + WHERE workerFk = NEW.workerFk; +END */;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`vn`@`localhost`*/ /*!50003 TRIGGER `vn`.`workerManaExcluded_beforeUpdate` + BEFORE UPDATE ON `workerManaExcluded` + FOR EACH ROW +BEGIN + DELETE FROM workerMana + WHERE workerFk = NEW.workerFk; +END */;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'IGNORE_SPACE,NO_ENGINE_SUBSTITUTION' */ ; +DELIMITER ;; /*!50003 CREATE*/ /*!50017 DEFINER=`vn`@`localhost`*/ /*!50003 TRIGGER `vn`.`workerTimeControl_beforeInsert` BEFORE INSERT ON `workerTimeControl` FOR EACH ROW @@ -11085,11 +11195,13 @@ DELIMITER ;; AFTER DELETE ON `workerTimeControl` FOR EACH ROW BEGIN - INSERT INTO workerLog - SET `action` = 'delete', - `changedModel` = 'WorkerTimeControl', - `changedModelId` = OLD.id, - `userFk` = account.myUser_getId(); + IF account.myUser_getId() IS NOT NULL THEN + INSERT INTO workerLog + SET `action` = 'delete', + `changedModel` = 'WorkerTimeControl', + `changedModelId` = OLD.id, + `userFk` = account.myUser_getId(); + END IF; END */;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -11499,4 +11611,4 @@ USE `vn2008`; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2025-01-14 6:39:25 +-- Dump completed on 2025-01-28 7:09:01