From 624f4707aca2ac1e13f2e5d97c8d1be816c2979e Mon Sep 17 00:00:00 2001 From: jorgep Date: Wed, 26 Jun 2024 10:43:02 +0200 Subject: [PATCH 01/39] feat: refs #7197 filter by correcting --- .../invoiceIn/back/methods/invoice-in/filter.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/modules/invoiceIn/back/methods/invoice-in/filter.js b/modules/invoiceIn/back/methods/invoice-in/filter.js index 0d3b5f14a..91d358016 100644 --- a/modules/invoiceIn/back/methods/invoice-in/filter.js +++ b/modules/invoiceIn/back/methods/invoice-in/filter.js @@ -82,7 +82,11 @@ module.exports = Self => { { arg: 'correctedFk', type: 'number', - description: 'The corrected invoice', + description: 'The rectified invoice', + }, + { + arg: 'correctingFk', + type: 'Boolean', } ], returns: { @@ -111,6 +115,7 @@ module.exports = Self => { } let correctings; + let correcteds; if (args.correctedFk) { correctings = await models.InvoiceInCorrection.find({ fields: ['correctingFk'], @@ -118,6 +123,9 @@ module.exports = Self => { }); } + if (args.correctingFk || args.correctingFk === false) + correcteds = await models.InvoiceInCorrection.find(); + const where = buildFilter(ctx.args, (param, value) => { switch (param) { case 'search': @@ -141,6 +149,10 @@ module.exports = Self => { return {[`ii.${param}`]: value}; case 'awbCode': return {'sub.code': value}; + case 'correctingFk': + return args.correctingFk + ? {'ii.id': {inq: correcteds.map(x => x.correctingFk)}} + : {'ii.id': {nin: correcteds.map(x => x.correctingFk)}}; case 'correctedFk': return {'ii.id': {inq: correctings.map(x => x.correctingFk)}}; } From 4bef3e9107375adbe80e844f71b9c5de8526b889 Mon Sep 17 00:00:00 2001 From: ivanm Date: Wed, 3 Jul 2024 17:09:10 +0200 Subject: [PATCH 02/39] refs #7531 Modify zone_getAddresses --- .../vn/procedures/zone_getAddresses.sql | 67 ++++++++++++------- 1 file changed, 41 insertions(+), 26 deletions(-) diff --git a/db/routines/vn/procedures/zone_getAddresses.sql b/db/routines/vn/procedures/zone_getAddresses.sql index ce7b0204e..c3a21aa83 100644 --- a/db/routines/vn/procedures/zone_getAddresses.sql +++ b/db/routines/vn/procedures/zone_getAddresses.sql @@ -1,7 +1,8 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zone_getAddresses`( vSelf INT, - vLanded DATE + vDated DATE, + vDepartment INT ) BEGIN /** @@ -12,6 +13,7 @@ BEGIN * * @param vSelf Id de zona * @param vDated Fecha de entrega + * @param vDepartment Departamento del trabajador * @return Un select */ CALL zone_getPostalCode(vSelf); @@ -22,34 +24,47 @@ BEGIN WHERE id NOT IN ( SELECT clientFk FROM vn.ticket - WHERE landed BETWEEN vLanded AND util.dayEnd(vLanded) + WHERE landed BETWEEN vDated AND util.dayEnd(vDated) ) + ), + hasTicketShippedToday AS ( + SELECT clientFk, + IF (COUNT(*) > 0, TRUE, FALSE) hasTicketShipped + FROM vn.ticket + WHERE shipped BETWEEN vDated AND util.dayEnd(vDated) + GROUP BY clientFk ) SELECT c.id clientFk, - c.name, - c.phone, - bt.description, - c.salesPersonFk, - u.name username, - aai.invoiced, - cnb.lastShipped - FROM vn.client c - JOIN notHasTicket ON notHasTicket.id = c.id - LEFT JOIN account.`user` u ON u.id = c.salesPersonFk - JOIN vn.`address` a ON a.clientFk = c.id - JOIN vn.postCode pc ON pc.code = a.postalCode - JOIN vn.town t ON t.id = pc.townFk AND t.provinceFk = a.provinceFk - JOIN vn.zoneGeo zg ON zg.name = a.postalCode - JOIN tmp.zoneNodes zn ON zn.geoFk = pc.geoFk - LEFT JOIN bs.clientNewBorn cnb ON cnb.clientFk = c.id - LEFT JOIN vn.annualAverageInvoiced aai ON aai.clientFk = c.id - JOIN vn.clientType ct ON ct.code = c.typeFk - JOIN vn.businessType bt ON bt.code = c.businessTypeFk - WHERE a.isActive - AND c.isActive - AND ct.code = 'normal' - AND bt.code <> 'worker' - GROUP BY c.id; + c.name, + c.phone, + bt.description, + c.salesPersonFk, + u.name username, + aai.invoiced, + cnb.lastShipped, + ht.hasTicketShipped + FROM vn.client c + JOIN vn.worker w ON w.id = c.salesPersonFk + JOIN vn.workerDepartment wd ON wd.workerFk = w.id + JOIN vn.department d ON d.id = wd.departmentFk + JOIN notHasTicket ON notHasTicket.id = c.id + LEFT JOIN account.`user` u ON u.id = c.salesPersonFk + JOIN vn.`address` a ON a.clientFk = c.id + JOIN vn.postCode pc ON pc.code = a.postalCode + JOIN vn.town t ON t.id = pc.townFk AND t.provinceFk = a.provinceFk + JOIN vn.zoneGeo zg ON zg.name = a.postalCode + JOIN tmp.zoneNodes zn ON zn.geoFk = pc.geoFk + LEFT JOIN bs.clientNewBorn cnb ON cnb.clientFk = c.id + LEFT JOIN vn.annualAverageInvoiced aai ON aai.clientFk = c.id + JOIN vn.clientType ct ON ct.code = c.typeFk + JOIN vn.businessType bt ON bt.code = c.businessTypeFk + LEFT JOIN hasTicketShippedToday ht ON ht.clientFk = c.id + WHERE a.isActive + AND c.isActive + AND ct.code = 'normal' + AND bt.code <> 'worker' + AND d.id = vDepartment + GROUP BY c.id; DROP TEMPORARY TABLE tmp.zoneNodes; END$$ From dce62245e9ffbe7cb639776b0785c8f0a262a0bb Mon Sep 17 00:00:00 2001 From: jorgep Date: Thu, 4 Jul 2024 13:10:32 +0200 Subject: [PATCH 03/39] chore: refs #7197 add supplierActivityFk filter --- modules/invoiceIn/back/methods/invoice-in/filter.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/invoiceIn/back/methods/invoice-in/filter.js b/modules/invoiceIn/back/methods/invoice-in/filter.js index 91d358016..d72d7fc63 100644 --- a/modules/invoiceIn/back/methods/invoice-in/filter.js +++ b/modules/invoiceIn/back/methods/invoice-in/filter.js @@ -87,6 +87,10 @@ module.exports = Self => { { arg: 'correctingFk', type: 'Boolean', + }, + { + arg: 'supplierActivityFk', + type: 'string', } ], returns: { @@ -155,6 +159,8 @@ module.exports = Self => { : {'ii.id': {nin: correcteds.map(x => x.correctingFk)}}; case 'correctedFk': return {'ii.id': {inq: correctings.map(x => x.correctingFk)}}; + case 'supplierActivityFk': + return {'s.supplierActivityFk': value}; } }); From 38d863aac63c76873eed12cdf8461c99786e587d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Tue, 16 Jul 2024 18:44:24 +0200 Subject: [PATCH 04/39] feat: refactor buyUltimate refs #7736 --- .../cache/procedures/last_buy_refresh.sql | 2 +- .../vn/procedures/available_traslate.sql | 2 +- db/routines/vn/procedures/buyUltimate.sql | 31 +--- .../vn/procedures/buyUltimateFromInterval.sql | 150 +-------------- db/routines/vn/procedures/buy_getUltimate.sql | 48 +++++ .../buy_getUltimateFromInterval .sql | 174 ++++++++++++++++++ .../vn/procedures/buy_updateGrouping.sql | 2 +- .../vn/procedures/buy_updatePacking.sql | 2 +- .../vn/procedures/catalog_calculate.sql | 2 +- .../vn/procedures/entry_getTransfer.sql | 2 +- .../vn/procedures/itemShelving_addByClaim.sql | 2 +- .../itemShelving_getItemDetails.sql | 2 +- db/routines/vn/procedures/item_devalueA2.sql | 2 +- db/routines/vn/procedures/item_getInfo.sql | 6 +- .../vn/procedures/item_multipleBuy.sql | 2 +- .../vn/procedures/item_valuateInventory.sql | 2 +- .../vn/procedures/sale_getProblems.sql | 2 +- .../vn/procedures/sale_recalcComponent.sql | 2 +- .../vn/procedures/sale_replaceItem.sql | 4 +- .../vn/procedures/sale_setProblemRounding.sql | 2 +- db/routines/vn/procedures/stockTraslation.sql | 2 +- .../vn/procedures/ticket_componentPreview.sql | 7 +- .../procedures/ticket_setProblemRounding.sql | 2 +- .../entry/back/methods/entry/addFromBuy.js | 4 +- .../entry/back/methods/entry/importBuys.js | 3 +- .../entry/back/methods/entry/lastItemBuys.js | 3 +- .../methods/order/getItemTypeAvailable.js | 15 +- 27 files changed, 265 insertions(+), 212 deletions(-) create mode 100644 db/routines/vn/procedures/buy_getUltimate.sql create mode 100644 db/routines/vn/procedures/buy_getUltimateFromInterval .sql diff --git a/db/routines/cache/procedures/last_buy_refresh.sql b/db/routines/cache/procedures/last_buy_refresh.sql index 49ef4ee5e..0f80163fb 100644 --- a/db/routines/cache/procedures/last_buy_refresh.sql +++ b/db/routines/cache/procedures/last_buy_refresh.sql @@ -30,7 +30,7 @@ proc: BEGIN SELECT inventoried INTO started FROM vn.config LIMIT 1; SET ended = util.VN_CURDATE(); -- TIMESTAMPADD(DAY, -1, util.VN_CURDATE()); - CALL vn.buyUltimateFromInterval(NULL, started, ended); + CALL vn.buy_getUltimateFromInterval (NULL, NULL, started, ended); DELETE FROM last_buy; diff --git a/db/routines/vn/procedures/available_traslate.sql b/db/routines/vn/procedures/available_traslate.sql index d33a8e10e..e4ba13d79 100644 --- a/db/routines/vn/procedures/available_traslate.sql +++ b/db/routines/vn/procedures/available_traslate.sql @@ -47,7 +47,7 @@ proc: BEGIN -- Tabla con el ultimo dia de last_buy para cada producto -- que hace un replace de la anterior. - CALL buyUltimate(vWarehouseShipment, util.VN_CURDATE()); + CALL buy_getUltimate (NULL, vWarehouseShipment, util.VN_CURDATE()); INSERT INTO tItemRange SELECT t.itemFk, tr.landed diff --git a/db/routines/vn/procedures/buyUltimate.sql b/db/routines/vn/procedures/buyUltimate.sql index 98b16cbc0..7026c8c82 100644 --- a/db/routines/vn/procedures/buyUltimate.sql +++ b/db/routines/vn/procedures/buyUltimate.sql @@ -5,39 +5,14 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`buyUltimate`( ) BEGIN /** + * DEPRECATED usar buy_getUltimate * Calcula las últimas compras realizadas hasta una fecha * + * @param vItemFk Id del artículo * @param vWarehouseFk Id del almacén * @param vDated Compras hasta fecha * @return tmp.buyUltimate */ - CALL cache.last_buy_refresh (FALSE); - - DROP TEMPORARY TABLE IF EXISTS tmp.buyUltimate; - CREATE TEMPORARY TABLE tmp.buyUltimate - (PRIMARY KEY (itemFk, warehouseFk), - INDEX(itemFk)) - ENGINE = MEMORY - SELECT item_id itemFk, buy_id buyFk, warehouse_id warehouseFk, landing - FROM cache.last_buy - WHERE warehouse_id = vWarehouseFk OR vWarehouseFk IS NULL; - - IF vDated >= util.VN_CURDATE() THEN - CALL buyUltimateFromInterval(vWarehouseFk, util.VN_CURDATE(), vDated); - - REPLACE INTO tmp.buyUltimate - SELECT itemFk, buyFk, warehouseFk, landed landing - FROM tmp.buyUltimateFromInterval - WHERE (warehouseFk = vWarehouseFk OR vWarehouseFk IS NULL) - AND landed <= vDated - AND NOT isIgnored; - - INSERT IGNORE INTO tmp.buyUltimate - SELECT itemFk, buyFk, warehouseFk, landed landing - FROM tmp.buyUltimateFromInterval - WHERE (warehouseFk = vWarehouseFk OR vWarehouseFk IS NULL) - AND landed > vDated - ORDER BY isIgnored = FALSE DESC; - END IF; + CALL buy_getUltimate(NULL, vWarehouseFk, vDated); END$$ DELIMITER ; diff --git a/db/routines/vn/procedures/buyUltimateFromInterval.sql b/db/routines/vn/procedures/buyUltimateFromInterval.sql index 5879b58e1..75dfff489 100644 --- a/db/routines/vn/procedures/buyUltimateFromInterval.sql +++ b/db/routines/vn/procedures/buyUltimateFromInterval.sql @@ -6,6 +6,7 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`buyUltimateFromInte ) BEGIN /** + * DEPRECATED usar buy_getUltimateFromInterval * Calcula las últimas compras realizadas * desde un rango de fechas. * @@ -14,153 +15,6 @@ BEGIN * @param vEnded Fecha fin * @return tmp.buyUltimateFromInterval */ - IF vEnded IS NULL THEN - SET vEnded = vStarted; - END IF; - - IF vEnded < vStarted THEN - SET vStarted = TIMESTAMPADD(MONTH, -1, vEnded); - END IF; - - -- Item - DROP TEMPORARY TABLE IF EXISTS tmp.buyUltimateFromInterval; - CREATE TEMPORARY TABLE tmp.buyUltimateFromInterval - (PRIMARY KEY (itemFk, warehouseFk), - INDEX(buyFk), INDEX(landed), INDEX(warehouseFk), INDEX(itemFk)) - ENGINE = MEMORY - SELECT itemFk, - warehouseFk, - buyFk, - landed, - isIgnored - FROM (SELECT b.itemFk, - t.warehouseInFk warehouseFk, - b.id buyFk, - t.landed, - b.isIgnored - FROM buy b - JOIN entry e ON e.id = b.entryFk - JOIN travel t ON t.id = e.travelFk - WHERE t.landed BETWEEN vStarted AND vEnded - AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) - AND b.price2 > 0 - ORDER BY NOT b.isIgnored DESC, t.landed DESC, b.id DESC - LIMIT 10000000000000000000) sub - GROUP BY itemFk, warehouseFk; - - - INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored) - SELECT itemFk, - warehouseFk, - buyFk, - landed, - isIgnored - FROM (SELECT b.itemFk, - t.warehouseInFk warehouseFk, - b.id buyFk, - t.landed, - b.isIgnored - FROM buy b - JOIN entry e ON e.id = b.entryFk - JOIN travel t ON t.id = e.travelFk - WHERE t.landed > vEnded - AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) - AND b.price2 > 0 - AND NOT b.isIgnored - ORDER BY NOT b.isIgnored DESC, t.landed DESC, b.id DESC - LIMIT 10000000000000000000) sub - GROUP BY itemFk, warehouseFk; - - INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored) - SELECT itemFk, - warehouseFk, - buyFk, - landed, - isIgnored - FROM (SELECT b.itemFk, - t.warehouseInFk warehouseFk, - b.id buyFk, - t.landed, - b.isIgnored - FROM buy b - JOIN entry e ON e.id = b.entryFk - JOIN travel t ON t.id = e.travelFk - WHERE t.landed BETWEEN vStarted AND vEnded - AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) - AND b.quantity = 0 - ORDER BY NOT b.isIgnored DESC, t.landed DESC, b.id DESC - LIMIT 10000000000000000000) sub - GROUP BY itemFk, warehouseFk; - - -- ItemOriginal - INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored) - SELECT itemFk, - warehouseFk, - buyFk, - landed, - isIgnored - FROM (SELECT b.itemFk, - t.warehouseInFk warehouseFk, - b.id buyFk, - t.landed, - itemOriginalFk, - b.isIgnored - FROM buy b - JOIN entry e ON e.id = b.entryFk - JOIN travel t ON t.id = e.travelFk - WHERE t.landed BETWEEN vStarted AND vEnded - AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) - AND b.price2 > 0 - AND NOT b.isIgnored - AND b.quantity > 0 - AND itemOriginalFk - ORDER BY t.landed DESC, b.id DESC - LIMIT 10000000000000000000) sub - GROUP BY itemFk, warehouseFk; - INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored) - SELECT itemFk, - warehouseFk, - buyFk, - landed, - isIgnored - FROM (SELECT b.itemFk, - t.warehouseInFk warehouseFk, - b.id buyFk, - t.landed, - b.isIgnored - FROM buy b - JOIN entry e ON e.id = b.entryFk - JOIN travel t ON t.id = e.travelFk - WHERE t.landed > vEnded - AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) - AND b.price2 > 0 - AND NOT b.isIgnored - AND itemOriginalFk - ORDER BY t.landed DESC, b.id DESC - LIMIT 10000000000000000000) sub - GROUP BY itemFk, warehouseFk; - - INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored) - SELECT itemFk, - warehouseFk, - buyFk, - landed, - isIgnored - FROM - (SELECT b.itemFk, - t.warehouseInFk warehouseFk, - b.id buyFk, - t.landed, - b.isIgnored - FROM buy b - JOIN entry e ON e.id = b.entryFk - JOIN travel t ON t.id = e.travelFk - WHERE t.landed BETWEEN vStarted AND vEnded - AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) - AND b.quantity = 0 - AND itemOriginalFk - ORDER BY t.landed DESC, b.id DESC - LIMIT 10000000000000000000) sub - GROUP BY itemFk, warehouseFk; + CALL vn.buy_getUltimateFromInterval (NULL,vWarehouseFk,vStarted,vEnded); END$$ DELIMITER ; diff --git a/db/routines/vn/procedures/buy_getUltimate.sql b/db/routines/vn/procedures/buy_getUltimate.sql new file mode 100644 index 000000000..36ae10fd8 --- /dev/null +++ b/db/routines/vn/procedures/buy_getUltimate.sql @@ -0,0 +1,48 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`buy_getUltimate`( + vItemFk INT, + vWarehouseFk SMALLINT, + vDated DATE +) +BEGIN +/** + * Calcula las últimas compras realizadas hasta una fecha + * + * @param vItemFk Id del artículo + * @param vWarehouseFk Id del almacén + * @param vDated Compras hasta fecha + * @return tmp.buyUltimate + */ + CALL cache.last_buy_refresh (FALSE); + + DROP TEMPORARY TABLE IF EXISTS tmp.buyUltimate; + CREATE TEMPORARY TABLE tmp.buyUltimate + (PRIMARY KEY (itemFk, warehouseFk), + INDEX(itemFk)) + ENGINE = MEMORY + SELECT item_id itemFk, buy_id buyFk, warehouse_id warehouseFk, landing + FROM cache.last_buy + WHERE (warehouse_id = vWarehouseFk OR vWarehouseFk IS NULL) + AND (item_id = vItemFk OR vItemFk IS NULL); + + IF vDated >= util.VN_CURDATE() THEN + CALL buyUltimateFromInterval(vItemFk, vWarehouseFk, util.VN_CURDATE(), vDated); + + REPLACE INTO tmp.buyUltimate + SELECT itemFk, buyFk, warehouseFk, landed landing + FROM tmp.buyUltimateFromInterval + WHERE (warehouseFk = vWarehouseFk OR vWarehouseFk IS NULL) + AND (itemFk = vItemFk OR vItemFk IS NULL) + AND landed <= vDated + AND NOT isIgnored; + + INSERT IGNORE INTO tmp.buyUltimate + SELECT itemFk, buyFk, warehouseFk, landed landing + FROM tmp.buyUltimateFromInterval + WHERE (warehouseFk = vWarehouseFk OR vWarehouseFk IS NULL) + AND (itemFk = vItemFk OR vItemFk IS NULL) + AND landed > vDated + ORDER BY isIgnored = FALSE DESC; + END IF; +END$$ +DELIMITER ; diff --git a/db/routines/vn/procedures/buy_getUltimateFromInterval .sql b/db/routines/vn/procedures/buy_getUltimateFromInterval .sql new file mode 100644 index 000000000..4dafd105f --- /dev/null +++ b/db/routines/vn/procedures/buy_getUltimateFromInterval .sql @@ -0,0 +1,174 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`buy_getUltimateFromInterval `( + vItemFk INT, + vWarehouseFk SMALLINT, + vStarted DATE, + vEnded DATE +) +BEGIN +/** + * Calcula las últimas compras realizadas + * desde un rango de fechas. + * + * @param vItemFk Id del artículo + * @param vWarehouseFk Id del almacén si es NULL se actualizan todos + * @param vStarted Fecha inicial + * @param vEnded Fecha fin + * @return tmp.buyUltimateFromInterval + */ + IF vEnded IS NULL THEN + SET vEnded = vStarted; + END IF; + + IF vEnded < vStarted THEN + SET vStarted = TIMESTAMPADD(MONTH, -1, vEnded); + END IF; + + -- Item + DROP TEMPORARY TABLE IF EXISTS tmp.buyUltimateFromInterval; + CREATE TEMPORARY TABLE tmp.buyUltimateFromInterval + (PRIMARY KEY (itemFk, warehouseFk), + INDEX(buyFk), INDEX(landed), INDEX(warehouseFk), INDEX(itemFk)) + ENGINE = MEMORY + SELECT itemFk, + warehouseFk, + buyFk, + landed, + isIgnored + FROM (SELECT b.itemFk, + t.warehouseInFk warehouseFk, + b.id buyFk, + t.landed, + b.isIgnored + FROM buy b + JOIN entry e ON e.id = b.entryFk + JOIN travel t ON t.id = e.travelFk + WHERE t.landed BETWEEN vStarted AND vEnded + AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) + AND (b.itemFk = vItemFk OR vItemFk IS NULL) + AND b.price2 > 0 + ORDER BY NOT b.isIgnored DESC, t.landed DESC, b.id DESC + LIMIT 10000000000000000000) sub + GROUP BY itemFk, warehouseFk; + + + INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored) + SELECT itemFk, + warehouseFk, + buyFk, + landed, + isIgnored + FROM (SELECT b.itemFk, + t.warehouseInFk warehouseFk, + b.id buyFk, + t.landed, + b.isIgnored + FROM buy b + JOIN entry e ON e.id = b.entryFk + JOIN travel t ON t.id = e.travelFk + WHERE t.landed > vEnded + AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) + AND (b.itemFk = vItemFk OR vItemFk IS NULL) + AND b.price2 > 0 + AND NOT b.isIgnored + ORDER BY NOT b.isIgnored DESC, t.landed DESC, b.id DESC + LIMIT 10000000000000000000) sub + GROUP BY itemFk, warehouseFk; + + INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored) + SELECT itemFk, + warehouseFk, + buyFk, + landed, + isIgnored + FROM (SELECT b.itemFk, + t.warehouseInFk warehouseFk, + b.id buyFk, + t.landed, + b.isIgnored + FROM buy b + JOIN entry e ON e.id = b.entryFk + JOIN travel t ON t.id = e.travelFk + WHERE t.landed BETWEEN vStarted AND vEnded + AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) + AND (b.itemFk = vItemFk OR vItemFk IS NULL) + AND b.quantity = 0 + ORDER BY NOT b.isIgnored DESC, t.landed DESC, b.id DESC + LIMIT 10000000000000000000) sub + GROUP BY itemFk, warehouseFk; + + -- ItemOriginal + INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored) + SELECT itemFk, + warehouseFk, + buyFk, + landed, + isIgnored + FROM (SELECT b.itemFk, + t.warehouseInFk warehouseFk, + b.id buyFk, + t.landed, + itemOriginalFk, + b.isIgnored + FROM buy b + JOIN entry e ON e.id = b.entryFk + JOIN travel t ON t.id = e.travelFk + WHERE t.landed BETWEEN vStarted AND vEnded + AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) + AND (b.itemFk = vItemFk OR vItemFk IS NULL) + AND b.price2 > 0 + AND NOT b.isIgnored + AND b.quantity > 0 + AND itemOriginalFk + ORDER BY t.landed DESC, b.id DESC + LIMIT 10000000000000000000) sub + GROUP BY itemFk, warehouseFk; + INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored) + SELECT itemFk, + warehouseFk, + buyFk, + landed, + isIgnored + FROM (SELECT b.itemFk, + t.warehouseInFk warehouseFk, + b.id buyFk, + t.landed, + b.isIgnored + FROM buy b + JOIN entry e ON e.id = b.entryFk + JOIN travel t ON t.id = e.travelFk + WHERE t.landed > vEnded + AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) + AND (b.itemFk = vItemFk OR vItemFk IS NULL) + AND b.price2 > 0 + AND NOT b.isIgnored + AND itemOriginalFk + ORDER BY t.landed DESC, b.id DESC + LIMIT 10000000000000000000) sub + GROUP BY itemFk, warehouseFk; + + INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored) + SELECT itemFk, + warehouseFk, + buyFk, + landed, + isIgnored + FROM + (SELECT b.itemFk, + t.warehouseInFk warehouseFk, + b.id buyFk, + t.landed, + b.isIgnored + FROM buy b + JOIN entry e ON e.id = b.entryFk + JOIN travel t ON t.id = e.travelFk + WHERE t.landed BETWEEN vStarted AND vEnded + AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) + AND (b.itemFk = vItemFk OR vItemFk IS NULL) + AND b.quantity = 0 + AND itemOriginalFk + ORDER BY t.landed DESC, b.id DESC + LIMIT 10000000000000000000) sub + GROUP BY itemFk, warehouseFk; +END$$ +DELIMITER ; diff --git a/db/routines/vn/procedures/buy_updateGrouping.sql b/db/routines/vn/procedures/buy_updateGrouping.sql index fb7adc0a3..45a619262 100644 --- a/db/routines/vn/procedures/buy_updateGrouping.sql +++ b/db/routines/vn/procedures/buy_updateGrouping.sql @@ -8,7 +8,7 @@ BEGIN * @param vItemFk Id del Artículo * @param vGrouping Cantidad de grouping */ - CALL vn.buyUltimate(vWarehouseFk, util.VN_CURDATE()); + CALL vn.buy_getUltimate (vItemFk, vWarehouseFk, util.VN_CURDATE()); UPDATE vn.buy b JOIN tmp.buyUltimate bu ON b.id = bu.buyFk diff --git a/db/routines/vn/procedures/buy_updatePacking.sql b/db/routines/vn/procedures/buy_updatePacking.sql index d86edc98f..0ee9d4c80 100644 --- a/db/routines/vn/procedures/buy_updatePacking.sql +++ b/db/routines/vn/procedures/buy_updatePacking.sql @@ -8,7 +8,7 @@ BEGIN * @param vItemFk id del item * @param vPacking packing a actualizar */ - CALL buyUltimate(vWarehouseFk, util.VN_CURDATE()); + CALL buy_getUltimate(vItemFk, vWarehouseFk, util.VN_CURDATE()); UPDATE buy b JOIN tmp.buyUltimate bu ON b.id = bu.buyFk diff --git a/db/routines/vn/procedures/catalog_calculate.sql b/db/routines/vn/procedures/catalog_calculate.sql index 963e33507..887492b35 100644 --- a/db/routines/vn/procedures/catalog_calculate.sql +++ b/db/routines/vn/procedures/catalog_calculate.sql @@ -74,7 +74,7 @@ BEGIN CALL `cache`.available_refresh (vAvailableCalc, FALSE, vWarehouseFk, vShipped); CALL `cache`.availableNoRaids_refresh (vAvailableNoRaidsCalc, FALSE, vWarehouseFk, vShipped); - CALL vn.buyUltimate(vWarehouseFk, vShipped); + CALL vn.buy_getUltimate(NULL, vWarehouseFk, vShipped); INSERT INTO tmp.ticketLot (warehouseFk, itemFk, available, buyFk, zoneFk) SELECT vWarehouseFk, diff --git a/db/routines/vn/procedures/entry_getTransfer.sql b/db/routines/vn/procedures/entry_getTransfer.sql index 165c87dc7..5bf049b6e 100644 --- a/db/routines/vn/procedures/entry_getTransfer.sql +++ b/db/routines/vn/procedures/entry_getTransfer.sql @@ -97,7 +97,7 @@ BEGIN FROM tmp.itemList; END IF; - CALL buyUltimateFromInterval(vWarehouseIn,vInventoryDate, vDateLanded); + CALL buy_getUltimateFromInterval(NULL, vWarehouseIn,vInventoryDate, vDateLanded); CREATE OR REPLACE TEMPORARY TABLE tTransfer ENGINE = MEMORY diff --git a/db/routines/vn/procedures/itemShelving_addByClaim.sql b/db/routines/vn/procedures/itemShelving_addByClaim.sql index 851162952..4ff2955c7 100644 --- a/db/routines/vn/procedures/itemShelving_addByClaim.sql +++ b/db/routines/vn/procedures/itemShelving_addByClaim.sql @@ -15,7 +15,7 @@ BEGIN JOIN ticket t ON t.id = c.ticketFk WHERE c.id = vClaimFk; - CALL buyUltimate (vWarehouseFk, util.VN_CURDATE()); + CALL buy_getUltimate(NULL, vWarehouseFk, util.VN_CURDATE()); INSERT INTO itemShelving (itemFk, shelvingFk, packing, `grouping`, visible) SELECT s.itemFk, vShelvingFk, b.packing, b.`grouping`, cb.quantity AS visible diff --git a/db/routines/vn/procedures/itemShelving_getItemDetails.sql b/db/routines/vn/procedures/itemShelving_getItemDetails.sql index c01bc348c..b097c2d17 100644 --- a/db/routines/vn/procedures/itemShelving_getItemDetails.sql +++ b/db/routines/vn/procedures/itemShelving_getItemDetails.sql @@ -23,7 +23,7 @@ BEGIN FROM operator WHERE workerFk = account.myUser_getId(); - CALL buyUltimate(vWarehouseFk, util.VN_CURDATE()); + CALL buy_getUltimate(vBarcodeItem, vWarehouseFk, util.VN_CURDATE()); SELECT buyFk INTO vBuyFk FROM tmp.buyUltimate diff --git a/db/routines/vn/procedures/item_devalueA2.sql b/db/routines/vn/procedures/item_devalueA2.sql index c9f716d8f..0cfcfcc7e 100644 --- a/db/routines/vn/procedures/item_devalueA2.sql +++ b/db/routines/vn/procedures/item_devalueA2.sql @@ -93,7 +93,7 @@ BEGIN ORDER BY created DESC LIMIT 1; - CALL buyUltimate(vWarehouseFk, vCurdate); + CALL buy_getUltimate(vSelf, vWarehouseFk, vCurdate); SELECT b.entryFk, bu.buyFk,IFNULL(b.buyingValue, 0) INTO vLastEntryFk, vLastBuyFk, vBuyingValueOriginal FROM tmp.buyUltimate bu diff --git a/db/routines/vn/procedures/item_getInfo.sql b/db/routines/vn/procedures/item_getInfo.sql index 50ab880a0..f569d235b 100644 --- a/db/routines/vn/procedures/item_getInfo.sql +++ b/db/routines/vn/procedures/item_getInfo.sql @@ -14,9 +14,11 @@ BEGIN CALL cache.visible_refresh(vCacheVisibleFk, FALSE, vWarehouseFk); CALL cache.available_refresh(vCacheAvailableFk, FALSE, vWarehouseFk, util.VN_CURDATE()); - CALL buyUltimate(vWarehouseFk, util.VN_CURDATE()); - + SELECT barcodeToItem(vBarcode) INTO vItemFk; + + CALL buy_getUltimate(vItemFk, vWarehouseFk, util.VN_CURDATE()); + SELECT SUM(visible) INTO vVisibleItemShelving FROM itemShelvingStock WHERE itemFk = vItemFk diff --git a/db/routines/vn/procedures/item_multipleBuy.sql b/db/routines/vn/procedures/item_multipleBuy.sql index ba49f8d36..0a08f5015 100644 --- a/db/routines/vn/procedures/item_multipleBuy.sql +++ b/db/routines/vn/procedures/item_multipleBuy.sql @@ -13,7 +13,7 @@ BEGIN */ ALTER TABLE tmp.itemInventory ADD IF NOT EXISTS buy_id INT; - CALL buyUltimate(vWarehouseFk, vDate); + CALL buy_getUltimate (NULL, vWarehouseFk, vDate); CREATE OR REPLACE TEMPORARY TABLE tmp (KEY (itemFk)) diff --git a/db/routines/vn/procedures/item_valuateInventory.sql b/db/routines/vn/procedures/item_valuateInventory.sql index 18aefdf7b..71f1459eb 100644 --- a/db/routines/vn/procedures/item_valuateInventory.sql +++ b/db/routines/vn/procedures/item_valuateInventory.sql @@ -181,7 +181,7 @@ BEGIN AND e.isConfirmed ON DUPLICATE KEY UPDATE tInventory.quantity = tInventory.quantity + (b.quantity); - CALL buyUltimate(NULL, vDateDayEnd); + CALL buy_getUltimate (NULL, NULL, vDateDayEnd); DELETE FROM tInventory WHERE quantity IS NULL OR NOT quantity; diff --git a/db/routines/vn/procedures/sale_getProblems.sql b/db/routines/vn/procedures/sale_getProblems.sql index ba4ff5857..64ecb898d 100644 --- a/db/routines/vn/procedures/sale_getProblems.sql +++ b/db/routines/vn/procedures/sale_getProblems.sql @@ -276,7 +276,7 @@ BEGIN ON DUPLICATE KEY UPDATE itemDelay = sub.problem, saleFk = sub.saleFk; -- Redondeo: Cantidad pedida incorrecta en al grouping de la última compra - CALL buyUltimate(vWarehouseFk, vDate); + CALL buy_getUltimate(NULL, vWarehouseFk, vDate); INSERT INTO tmp.sale_problems(ticketFk, hasRounding, saleFk) SELECT ticketFk, problem ,saleFk FROM ( diff --git a/db/routines/vn/procedures/sale_recalcComponent.sql b/db/routines/vn/procedures/sale_recalcComponent.sql index 54297571a..f3c188404 100644 --- a/db/routines/vn/procedures/sale_recalcComponent.sql +++ b/db/routines/vn/procedures/sale_recalcComponent.sql @@ -78,7 +78,7 @@ proc: BEGIN DROP TEMPORARY TABLE tmp.zoneGetLanded; -- rellena la tabla buyUltimate con la ultima compra - CALL buyUltimate (vWarehouseFk, vShipped); + CALL buy_getUltimate(NULL, vWarehouseFk, vShipped); CREATE OR REPLACE TEMPORARY TABLE tmp.sale (PRIMARY KEY (saleFk)) ENGINE = MEMORY diff --git a/db/routines/vn/procedures/sale_replaceItem.sql b/db/routines/vn/procedures/sale_replaceItem.sql index a4aefc088..573d5b488 100644 --- a/db/routines/vn/procedures/sale_replaceItem.sql +++ b/db/routines/vn/procedures/sale_replaceItem.sql @@ -53,7 +53,7 @@ BEGIN JOIN ticket t ON t.id = s.ticketFk WHERE s.id = vSaleFk; - CALL buyUltimate(vWarehouseFk, vDate); + CALL buy_getUltimate(vNewItemFk, vWarehouseFk, vDate); SELECT `grouping`, groupingMode, packing INTO vGrouping,vGroupingMode,vPacking @@ -61,6 +61,8 @@ BEGIN JOIN tmp.buyUltimate tmp ON b.id = tmp.buyFk WHERE tmp.itemFk = vNewItemFk AND tmp.WarehouseFk = vWarehouseFk; + DROP TEMPORARY TABLE tmp.buyUltimate; + IF vGroupingMode = 'packing' AND vPacking > 0 THEN SET vRoundQuantity = vPacking; END IF; diff --git a/db/routines/vn/procedures/sale_setProblemRounding.sql b/db/routines/vn/procedures/sale_setProblemRounding.sql index f58d00799..894749c7b 100644 --- a/db/routines/vn/procedures/sale_setProblemRounding.sql +++ b/db/routines/vn/procedures/sale_setProblemRounding.sql @@ -19,7 +19,7 @@ BEGIN JOIN ticket t ON t.id = s.ticketFk WHERE s.id = vSelf; - CALL buyUltimate(vWarehouseFk, vShipped); + CALL buy_getUltimate(vItemFk, vWarehouseFk, vShipped); CREATE OR REPLACE TEMPORARY TABLE tmp.sale SELECT vSelf saleFk, diff --git a/db/routines/vn/procedures/stockTraslation.sql b/db/routines/vn/procedures/stockTraslation.sql index c681112f1..f9175dc2a 100644 --- a/db/routines/vn/procedures/stockTraslation.sql +++ b/db/routines/vn/procedures/stockTraslation.sql @@ -36,6 +36,6 @@ BEGIN WHERE warehouse_id = vAuctionWarehouseFk ON DUPLICATE KEY UPDATE quantity = tmp.item.quantity + VALUES(quantity); - CALL buyUltimate(vAuctionWarehouseFk, vDated); + CALL buy_getUltimate(NULL, vAuctionWarehouseFk, vDated); END$$ DELIMITER ; diff --git a/db/routines/vn/procedures/ticket_componentPreview.sql b/db/routines/vn/procedures/ticket_componentPreview.sql index 729e3a743..4bcd8c8ec 100644 --- a/db/routines/vn/procedures/ticket_componentPreview.sql +++ b/db/routines/vn/procedures/ticket_componentPreview.sql @@ -56,13 +56,12 @@ BEGIN FROM zone WHERE id = vZoneFk; - CALL buyUltimate(vWarehouseFk, vShipped); + CALL buy_getUltimate(NULL, vWarehouseFk, vShipped); DROP TEMPORARY TABLE IF EXISTS tmp.ticketLot; CREATE TEMPORARY TABLE tmp.ticketLot ENGINE = MEMORY ( - SELECT - vWarehouseFk AS warehouseFk, - NULL AS available, + SELECT vWarehouseFk warehouseFk, + NULL available, s.itemFk, bu.buyFk, vZoneFk zoneFk diff --git a/db/routines/vn/procedures/ticket_setProblemRounding.sql b/db/routines/vn/procedures/ticket_setProblemRounding.sql index fb580eacf..551cf67d1 100644 --- a/db/routines/vn/procedures/ticket_setProblemRounding.sql +++ b/db/routines/vn/procedures/ticket_setProblemRounding.sql @@ -16,7 +16,7 @@ BEGIN FROM ticket WHERE id = vSelf; - CALL buyUltimate(vWarehouseFk, vDated); + CALL buy_getUltimate(NULL, vWarehouseFk, vDated); CREATE OR REPLACE TEMPORARY TABLE tmp.sale (INDEX(saleFk, isProblemCalcNeeded)) diff --git a/modules/entry/back/methods/entry/addFromBuy.js b/modules/entry/back/methods/entry/addFromBuy.js index e5cc427a8..212aed7ea 100644 --- a/modules/entry/back/methods/entry/addFromBuy.js +++ b/modules/entry/back/methods/entry/addFromBuy.js @@ -52,8 +52,8 @@ module.exports = Self => { else { const userConfig = await models.UserConfig.findById(userId, {fields: ['warehouseFk']}, myOptions); await Self.rawSql( - 'CALL vn.buyUltimate(?,?)', - [userConfig.warehouseFk, null], + 'CALL vn.buy_getUltimate(?,?,?)', + [args.item, userConfig.warehouseFk, null], myOptions ); let buyUltimate = await Self.rawSql( diff --git a/modules/entry/back/methods/entry/importBuys.js b/modules/entry/back/methods/entry/importBuys.js index 812775a1b..e3fd653bb 100644 --- a/modules/entry/back/methods/entry/importBuys.js +++ b/modules/entry/back/methods/entry/importBuys.js @@ -73,7 +73,8 @@ module.exports = Self => { }, myOptions); const travel = entry.travel(); - await Self.rawSql('CALL buyUltimate(?, ?)', [ + await Self.rawSql('CALL buy_getUltimate(?, ?, ?)', [ + null, travel.warehouseInFk, travel.landed ], myOptions); diff --git a/modules/entry/back/methods/entry/lastItemBuys.js b/modules/entry/back/methods/entry/lastItemBuys.js index 63e6d38f2..012b99d17 100644 --- a/modules/entry/back/methods/entry/lastItemBuys.js +++ b/modules/entry/back/methods/entry/lastItemBuys.js @@ -50,7 +50,8 @@ module.exports = Self => { const stmts = []; let stmt; - stmt = new ParameterizedSQL(`CALL buyUltimate(?, ?)`, [ + stmt = new ParameterizedSQL(`CALL buy_getUltimate(?, ?, ?)`, [ + null, travel.warehouseInFk, travel.landed ]); diff --git a/modules/order/back/methods/order/getItemTypeAvailable.js b/modules/order/back/methods/order/getItemTypeAvailable.js index b84863953..fd7be5d57 100644 --- a/modules/order/back/methods/order/getItemTypeAvailable.js +++ b/modules/order/back/methods/order/getItemTypeAvailable.js @@ -44,16 +44,14 @@ module.exports = Self => { ]); stmts.push(stmt); - stmts.push('DROP TEMPORARY TABLE IF EXISTS tmp.item'); - stmt = new ParameterizedSQL( - `CREATE TEMPORARY TABLE tmp.item + `CREATE OR REPLACE TEMPORARY TABLE tmp.item (PRIMARY KEY (itemFk)) ENGINE = MEMORY SELECT DISTINCT - i.id AS itemFk, - it.id AS typeFk, + i.id itemFk, + it.id typeFk, it.name, - ic.name AS categoryName + ic.name categoryName FROM tmp.availableCalc ac JOIN cache.available a ON a.calc_id = ac.calcFk JOIN vn.item i ON i.id = a.item_id @@ -64,7 +62,7 @@ module.exports = Self => { stmts.push(stmt); stmt = new ParameterizedSQL( - 'CALL vn.catalog_calculate(?, ?, ?,?)', [ + 'CALL vn.catalog_calculate(?, ?, ?, ?)', [ order.landed, order.addressFk, order.agencyModeFk, @@ -74,7 +72,7 @@ module.exports = Self => { stmts.push(stmt); stmt = new ParameterizedSQL(` - SELECT i.typeFk AS id, i.name, i.categoryName + SELECT i.typeFk id, i.name, i.categoryName FROM tmp.item i JOIN tmp.ticketCalculateItem tci ON tci.itemFk = i.itemFk GROUP BY i.typeFk` @@ -85,7 +83,6 @@ module.exports = Self => { const sql = ParameterizedSQL.join(stmts, ';'); const result = await Self.rawStmt(sql, myOptions); - return result[categoriesIndex]; }; }; From d6a949a9f38f22bfd2487bf93b246e9e7527f687 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Tue, 16 Jul 2024 18:55:58 +0200 Subject: [PATCH 05/39] feat: refactor buyUltimate refs #7736 --- .../cache/procedures/last_buy_refresh.sql | 2 +- .../vn/procedures/buyUltimateFromInterval.sql | 2 +- .../buy_getUltimateFromInterval .sql | 174 ------------------ 3 files changed, 2 insertions(+), 176 deletions(-) delete mode 100644 db/routines/vn/procedures/buy_getUltimateFromInterval .sql diff --git a/db/routines/cache/procedures/last_buy_refresh.sql b/db/routines/cache/procedures/last_buy_refresh.sql index 0f80163fb..555ae0b8d 100644 --- a/db/routines/cache/procedures/last_buy_refresh.sql +++ b/db/routines/cache/procedures/last_buy_refresh.sql @@ -30,7 +30,7 @@ proc: BEGIN SELECT inventoried INTO started FROM vn.config LIMIT 1; SET ended = util.VN_CURDATE(); -- TIMESTAMPADD(DAY, -1, util.VN_CURDATE()); - CALL vn.buy_getUltimateFromInterval (NULL, NULL, started, ended); + CALL vn.buy_getUltimateFromInterval(NULL, NULL, started, ended); DELETE FROM last_buy; diff --git a/db/routines/vn/procedures/buyUltimateFromInterval.sql b/db/routines/vn/procedures/buyUltimateFromInterval.sql index 75dfff489..8aea38ee0 100644 --- a/db/routines/vn/procedures/buyUltimateFromInterval.sql +++ b/db/routines/vn/procedures/buyUltimateFromInterval.sql @@ -15,6 +15,6 @@ BEGIN * @param vEnded Fecha fin * @return tmp.buyUltimateFromInterval */ - CALL vn.buy_getUltimateFromInterval (NULL,vWarehouseFk,vStarted,vEnded); + CALL vn.buy_getUltimateFromInterval(NULL,vWarehouseFk,vStarted,vEnded); END$$ DELIMITER ; diff --git a/db/routines/vn/procedures/buy_getUltimateFromInterval .sql b/db/routines/vn/procedures/buy_getUltimateFromInterval .sql deleted file mode 100644 index 4dafd105f..000000000 --- a/db/routines/vn/procedures/buy_getUltimateFromInterval .sql +++ /dev/null @@ -1,174 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`buy_getUltimateFromInterval `( - vItemFk INT, - vWarehouseFk SMALLINT, - vStarted DATE, - vEnded DATE -) -BEGIN -/** - * Calcula las últimas compras realizadas - * desde un rango de fechas. - * - * @param vItemFk Id del artículo - * @param vWarehouseFk Id del almacén si es NULL se actualizan todos - * @param vStarted Fecha inicial - * @param vEnded Fecha fin - * @return tmp.buyUltimateFromInterval - */ - IF vEnded IS NULL THEN - SET vEnded = vStarted; - END IF; - - IF vEnded < vStarted THEN - SET vStarted = TIMESTAMPADD(MONTH, -1, vEnded); - END IF; - - -- Item - DROP TEMPORARY TABLE IF EXISTS tmp.buyUltimateFromInterval; - CREATE TEMPORARY TABLE tmp.buyUltimateFromInterval - (PRIMARY KEY (itemFk, warehouseFk), - INDEX(buyFk), INDEX(landed), INDEX(warehouseFk), INDEX(itemFk)) - ENGINE = MEMORY - SELECT itemFk, - warehouseFk, - buyFk, - landed, - isIgnored - FROM (SELECT b.itemFk, - t.warehouseInFk warehouseFk, - b.id buyFk, - t.landed, - b.isIgnored - FROM buy b - JOIN entry e ON e.id = b.entryFk - JOIN travel t ON t.id = e.travelFk - WHERE t.landed BETWEEN vStarted AND vEnded - AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) - AND (b.itemFk = vItemFk OR vItemFk IS NULL) - AND b.price2 > 0 - ORDER BY NOT b.isIgnored DESC, t.landed DESC, b.id DESC - LIMIT 10000000000000000000) sub - GROUP BY itemFk, warehouseFk; - - - INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored) - SELECT itemFk, - warehouseFk, - buyFk, - landed, - isIgnored - FROM (SELECT b.itemFk, - t.warehouseInFk warehouseFk, - b.id buyFk, - t.landed, - b.isIgnored - FROM buy b - JOIN entry e ON e.id = b.entryFk - JOIN travel t ON t.id = e.travelFk - WHERE t.landed > vEnded - AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) - AND (b.itemFk = vItemFk OR vItemFk IS NULL) - AND b.price2 > 0 - AND NOT b.isIgnored - ORDER BY NOT b.isIgnored DESC, t.landed DESC, b.id DESC - LIMIT 10000000000000000000) sub - GROUP BY itemFk, warehouseFk; - - INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored) - SELECT itemFk, - warehouseFk, - buyFk, - landed, - isIgnored - FROM (SELECT b.itemFk, - t.warehouseInFk warehouseFk, - b.id buyFk, - t.landed, - b.isIgnored - FROM buy b - JOIN entry e ON e.id = b.entryFk - JOIN travel t ON t.id = e.travelFk - WHERE t.landed BETWEEN vStarted AND vEnded - AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) - AND (b.itemFk = vItemFk OR vItemFk IS NULL) - AND b.quantity = 0 - ORDER BY NOT b.isIgnored DESC, t.landed DESC, b.id DESC - LIMIT 10000000000000000000) sub - GROUP BY itemFk, warehouseFk; - - -- ItemOriginal - INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored) - SELECT itemFk, - warehouseFk, - buyFk, - landed, - isIgnored - FROM (SELECT b.itemFk, - t.warehouseInFk warehouseFk, - b.id buyFk, - t.landed, - itemOriginalFk, - b.isIgnored - FROM buy b - JOIN entry e ON e.id = b.entryFk - JOIN travel t ON t.id = e.travelFk - WHERE t.landed BETWEEN vStarted AND vEnded - AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) - AND (b.itemFk = vItemFk OR vItemFk IS NULL) - AND b.price2 > 0 - AND NOT b.isIgnored - AND b.quantity > 0 - AND itemOriginalFk - ORDER BY t.landed DESC, b.id DESC - LIMIT 10000000000000000000) sub - GROUP BY itemFk, warehouseFk; - INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored) - SELECT itemFk, - warehouseFk, - buyFk, - landed, - isIgnored - FROM (SELECT b.itemFk, - t.warehouseInFk warehouseFk, - b.id buyFk, - t.landed, - b.isIgnored - FROM buy b - JOIN entry e ON e.id = b.entryFk - JOIN travel t ON t.id = e.travelFk - WHERE t.landed > vEnded - AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) - AND (b.itemFk = vItemFk OR vItemFk IS NULL) - AND b.price2 > 0 - AND NOT b.isIgnored - AND itemOriginalFk - ORDER BY t.landed DESC, b.id DESC - LIMIT 10000000000000000000) sub - GROUP BY itemFk, warehouseFk; - - INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored) - SELECT itemFk, - warehouseFk, - buyFk, - landed, - isIgnored - FROM - (SELECT b.itemFk, - t.warehouseInFk warehouseFk, - b.id buyFk, - t.landed, - b.isIgnored - FROM buy b - JOIN entry e ON e.id = b.entryFk - JOIN travel t ON t.id = e.travelFk - WHERE t.landed BETWEEN vStarted AND vEnded - AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) - AND (b.itemFk = vItemFk OR vItemFk IS NULL) - AND b.quantity = 0 - AND itemOriginalFk - ORDER BY t.landed DESC, b.id DESC - LIMIT 10000000000000000000) sub - GROUP BY itemFk, warehouseFk; -END$$ -DELIMITER ; From 50e2c03d3e1a2caac3643d49ad2cf220c5050a04 Mon Sep 17 00:00:00 2001 From: ivanm Date: Tue, 16 Jul 2024 18:56:00 +0200 Subject: [PATCH 06/39] refs #7531 Requested modifications in redmine --- .../vn/procedures/zone_getAddresses.sql | 37 ++++++------------- 1 file changed, 12 insertions(+), 25 deletions(-) diff --git a/db/routines/vn/procedures/zone_getAddresses.sql b/db/routines/vn/procedures/zone_getAddresses.sql index c3a21aa83..417b8c7a3 100644 --- a/db/routines/vn/procedures/zone_getAddresses.sql +++ b/db/routines/vn/procedures/zone_getAddresses.sql @@ -1,40 +1,28 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zone_getAddresses`( vSelf INT, - vDated DATE, - vDepartment INT + vShipped 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 y no tiene un ticket - * para ese día. + * vender producto para esa zona. * * @param vSelf Id de zona - * @param vDated Fecha de entrega - * @param vDepartment Departamento del trabajador + * @param vShipped Fecha de envio + * @param vDepartmentFk Id de departamento * @return Un select */ CALL zone_getPostalCode(vSelf); - WITH notHasTicket AS ( - SELECT id - FROM vn.client - WHERE id NOT IN ( - SELECT clientFk - FROM vn.ticket - WHERE landed BETWEEN vDated AND util.dayEnd(vDated) - ) - ), - hasTicketShippedToday AS ( - SELECT clientFk, - IF (COUNT(*) > 0, TRUE, FALSE) hasTicketShipped + WITH clientWithTicket AS ( + SELECT clientFk FROM vn.ticket - WHERE shipped BETWEEN vDated AND util.dayEnd(vDated) - GROUP BY clientFk + WHERE shipped BETWEEN vShipped AND util.dayEnd(vShipped) ) - SELECT c.id clientFk, + SELECT c.id, c.name, c.phone, bt.description, @@ -42,12 +30,12 @@ BEGIN u.name username, aai.invoiced, cnb.lastShipped, - ht.hasTicketShipped + cwt.clientFk FROM vn.client c JOIN vn.worker w ON w.id = c.salesPersonFk JOIN vn.workerDepartment wd ON wd.workerFk = w.id JOIN vn.department d ON d.id = wd.departmentFk - JOIN notHasTicket ON notHasTicket.id = c.id + LEFT JOIN clientWithTicket cwt ON cwt.clientFk = c.id LEFT JOIN account.`user` u ON u.id = c.salesPersonFk JOIN vn.`address` a ON a.clientFk = c.id JOIN vn.postCode pc ON pc.code = a.postalCode @@ -58,12 +46,11 @@ BEGIN LEFT JOIN vn.annualAverageInvoiced aai ON aai.clientFk = c.id JOIN vn.clientType ct ON ct.code = c.typeFk JOIN vn.businessType bt ON bt.code = c.businessTypeFk - LEFT JOIN hasTicketShippedToday ht ON ht.clientFk = c.id WHERE a.isActive AND c.isActive AND ct.code = 'normal' AND bt.code <> 'worker' - AND d.id = vDepartment + AND d.id = vDepartmentFk GROUP BY c.id; DROP TEMPORARY TABLE tmp.zoneNodes; From 5ca2a432daece8d1013b7c0737a50f3c859f4472 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Tue, 16 Jul 2024 18:58:26 +0200 Subject: [PATCH 07/39] feat: refactor buyUltimate refs #7736 --- .../buy_getUltimateFromInterval.sql | 174 ++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 db/routines/vn/procedures/buy_getUltimateFromInterval.sql diff --git a/db/routines/vn/procedures/buy_getUltimateFromInterval.sql b/db/routines/vn/procedures/buy_getUltimateFromInterval.sql new file mode 100644 index 000000000..45d1122ae --- /dev/null +++ b/db/routines/vn/procedures/buy_getUltimateFromInterval.sql @@ -0,0 +1,174 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`buy_getUltimateFromInterval`( + vItemFk INT, + vWarehouseFk SMALLINT, + vStarted DATE, + vEnded DATE +) +BEGIN +/** + * Calcula las últimas compras realizadas + * desde un rango de fechas. + * + * @param vItemFk Id del artículo + * @param vWarehouseFk Id del almacén si es NULL se actualizan todos + * @param vStarted Fecha inicial + * @param vEnded Fecha fin + * @return tmp.buyUltimateFromInterval + */ + IF vEnded IS NULL THEN + SET vEnded = vStarted; + END IF; + + IF vEnded < vStarted THEN + SET vStarted = TIMESTAMPADD(MONTH, -1, vEnded); + END IF; + + -- Item + DROP TEMPORARY TABLE IF EXISTS tmp.buyUltimateFromInterval; + CREATE TEMPORARY TABLE tmp.buyUltimateFromInterval + (PRIMARY KEY (itemFk, warehouseFk), + INDEX(buyFk), INDEX(landed), INDEX(warehouseFk), INDEX(itemFk)) + ENGINE = MEMORY + SELECT itemFk, + warehouseFk, + buyFk, + landed, + isIgnored + FROM (SELECT b.itemFk, + t.warehouseInFk warehouseFk, + b.id buyFk, + t.landed, + b.isIgnored + FROM buy b + JOIN entry e ON e.id = b.entryFk + JOIN travel t ON t.id = e.travelFk + WHERE t.landed BETWEEN vStarted AND vEnded + AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) + AND (b.itemFk = vItemFk OR vItemFk IS NULL) + AND b.price2 > 0 + ORDER BY NOT b.isIgnored DESC, t.landed DESC, b.id DESC + LIMIT 10000000000000000000) sub + GROUP BY itemFk, warehouseFk; + + + INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored) + SELECT itemFk, + warehouseFk, + buyFk, + landed, + isIgnored + FROM (SELECT b.itemFk, + t.warehouseInFk warehouseFk, + b.id buyFk, + t.landed, + b.isIgnored + FROM buy b + JOIN entry e ON e.id = b.entryFk + JOIN travel t ON t.id = e.travelFk + WHERE t.landed > vEnded + AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) + AND (b.itemFk = vItemFk OR vItemFk IS NULL) + AND b.price2 > 0 + AND NOT b.isIgnored + ORDER BY NOT b.isIgnored DESC, t.landed DESC, b.id DESC + LIMIT 10000000000000000000) sub + GROUP BY itemFk, warehouseFk; + + INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored) + SELECT itemFk, + warehouseFk, + buyFk, + landed, + isIgnored + FROM (SELECT b.itemFk, + t.warehouseInFk warehouseFk, + b.id buyFk, + t.landed, + b.isIgnored + FROM buy b + JOIN entry e ON e.id = b.entryFk + JOIN travel t ON t.id = e.travelFk + WHERE t.landed BETWEEN vStarted AND vEnded + AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) + AND (b.itemFk = vItemFk OR vItemFk IS NULL) + AND b.quantity = 0 + ORDER BY NOT b.isIgnored DESC, t.landed DESC, b.id DESC + LIMIT 10000000000000000000) sub + GROUP BY itemFk, warehouseFk; + + -- ItemOriginal + INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored) + SELECT itemFk, + warehouseFk, + buyFk, + landed, + isIgnored + FROM (SELECT b.itemFk, + t.warehouseInFk warehouseFk, + b.id buyFk, + t.landed, + itemOriginalFk, + b.isIgnored + FROM buy b + JOIN entry e ON e.id = b.entryFk + JOIN travel t ON t.id = e.travelFk + WHERE t.landed BETWEEN vStarted AND vEnded + AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) + AND (b.itemFk = vItemFk OR vItemFk IS NULL) + AND b.price2 > 0 + AND NOT b.isIgnored + AND b.quantity > 0 + AND itemOriginalFk + ORDER BY t.landed DESC, b.id DESC + LIMIT 10000000000000000000) sub + GROUP BY itemFk, warehouseFk; + INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored) + SELECT itemFk, + warehouseFk, + buyFk, + landed, + isIgnored + FROM (SELECT b.itemFk, + t.warehouseInFk warehouseFk, + b.id buyFk, + t.landed, + b.isIgnored + FROM buy b + JOIN entry e ON e.id = b.entryFk + JOIN travel t ON t.id = e.travelFk + WHERE t.landed > vEnded + AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) + AND (b.itemFk = vItemFk OR vItemFk IS NULL) + AND b.price2 > 0 + AND NOT b.isIgnored + AND itemOriginalFk + ORDER BY t.landed DESC, b.id DESC + LIMIT 10000000000000000000) sub + GROUP BY itemFk, warehouseFk; + + INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored) + SELECT itemFk, + warehouseFk, + buyFk, + landed, + isIgnored + FROM + (SELECT b.itemFk, + t.warehouseInFk warehouseFk, + b.id buyFk, + t.landed, + b.isIgnored + FROM buy b + JOIN entry e ON e.id = b.entryFk + JOIN travel t ON t.id = e.travelFk + WHERE t.landed BETWEEN vStarted AND vEnded + AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) + AND (b.itemFk = vItemFk OR vItemFk IS NULL) + AND b.quantity = 0 + AND itemOriginalFk + ORDER BY t.landed DESC, b.id DESC + LIMIT 10000000000000000000) sub + GROUP BY itemFk, warehouseFk; +END$$ +DELIMITER ; From 4ee0bd687fb040f2cc9fae0a9594be4c268fdbdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Tue, 16 Jul 2024 19:01:02 +0200 Subject: [PATCH 08/39] feat: refactor buyUltimate refs #7736 --- db/routines/vn/procedures/buyUltimateFromInterval.sql | 2 +- db/routines/vn/procedures/buy_getUltimate.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/db/routines/vn/procedures/buyUltimateFromInterval.sql b/db/routines/vn/procedures/buyUltimateFromInterval.sql index 8aea38ee0..9709f2edc 100644 --- a/db/routines/vn/procedures/buyUltimateFromInterval.sql +++ b/db/routines/vn/procedures/buyUltimateFromInterval.sql @@ -15,6 +15,6 @@ BEGIN * @param vEnded Fecha fin * @return tmp.buyUltimateFromInterval */ - CALL vn.buy_getUltimateFromInterval(NULL,vWarehouseFk,vStarted,vEnded); + CALL vn.buy_getUltimateFromInterval(NULL, vWarehouseFk, vStarted, vEnded); END$$ DELIMITER ; diff --git a/db/routines/vn/procedures/buy_getUltimate.sql b/db/routines/vn/procedures/buy_getUltimate.sql index 36ae10fd8..d16f89295 100644 --- a/db/routines/vn/procedures/buy_getUltimate.sql +++ b/db/routines/vn/procedures/buy_getUltimate.sql @@ -26,7 +26,7 @@ BEGIN AND (item_id = vItemFk OR vItemFk IS NULL); IF vDated >= util.VN_CURDATE() THEN - CALL buyUltimateFromInterval(vItemFk, vWarehouseFk, util.VN_CURDATE(), vDated); + CALL buy_getUltimateFromInterval(vItemFk, vWarehouseFk, util.VN_CURDATE(), vDated); REPLACE INTO tmp.buyUltimate SELECT itemFk, buyFk, warehouseFk, landed landing From a6e6f435f75a976cf517c5e11d7ef1a0a32d6ab2 Mon Sep 17 00:00:00 2001 From: ivanm Date: Thu, 18 Jul 2024 15:21:59 +0200 Subject: [PATCH 09/39] refs #7531 No assigned department --- 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 417b8c7a3..0622ece1b 100644 --- a/db/routines/vn/procedures/zone_getAddresses.sql +++ b/db/routines/vn/procedures/zone_getAddresses.sql @@ -50,7 +50,7 @@ BEGIN AND c.isActive AND ct.code = 'normal' AND bt.code <> 'worker' - AND d.id = vDepartmentFk + AND (d.id = vDepartmentFk OR NOT vDepartmentFk) GROUP BY c.id; DROP TEMPORARY TABLE tmp.zoneNodes; From b2a8326170594eca7aff3f5127516ee97cfa399a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Fri, 19 Jul 2024 12:44:45 +0200 Subject: [PATCH 10/39] feat: refactor buyUltimate refs #7736 --- db/routines/vn/procedures/buyUltimateFromInterval.sql | 2 +- db/routines/vn/procedures/buy_getUltimate.sql | 2 +- db/routines/vn/procedures/buy_getUltimateFromInterval.sql | 7 ++++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/db/routines/vn/procedures/buyUltimateFromInterval.sql b/db/routines/vn/procedures/buyUltimateFromInterval.sql index 9709f2edc..acb6282de 100644 --- a/db/routines/vn/procedures/buyUltimateFromInterval.sql +++ b/db/routines/vn/procedures/buyUltimateFromInterval.sql @@ -6,7 +6,7 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`buyUltimateFromInte ) BEGIN /** - * DEPRECATED usar buy_getUltimateFromInterval + * @deprecated Usar buy_getUltimateFromInterval * Calcula las últimas compras realizadas * desde un rango de fechas. * diff --git a/db/routines/vn/procedures/buy_getUltimate.sql b/db/routines/vn/procedures/buy_getUltimate.sql index d16f89295..164fb3266 100644 --- a/db/routines/vn/procedures/buy_getUltimate.sql +++ b/db/routines/vn/procedures/buy_getUltimate.sql @@ -13,7 +13,7 @@ BEGIN * @param vDated Compras hasta fecha * @return tmp.buyUltimate */ - CALL cache.last_buy_refresh (FALSE); + CALL cache.last_buy_refresh(FALSE); DROP TEMPORARY TABLE IF EXISTS tmp.buyUltimate; CREATE TEMPORARY TABLE tmp.buyUltimate diff --git a/db/routines/vn/procedures/buy_getUltimateFromInterval.sql b/db/routines/vn/procedures/buy_getUltimateFromInterval.sql index 45d1122ae..df0d6a20e 100644 --- a/db/routines/vn/procedures/buy_getUltimateFromInterval.sql +++ b/db/routines/vn/procedures/buy_getUltimateFromInterval.sql @@ -25,8 +25,8 @@ BEGIN END IF; -- Item - DROP TEMPORARY TABLE IF EXISTS tmp.buyUltimateFromInterval; - CREATE TEMPORARY TABLE tmp.buyUltimateFromInterval + + CREATE OR REPLACE TEMPORARY TABLE tmp.buyUltimateFromInterval (PRIMARY KEY (itemFk, warehouseFk), INDEX(buyFk), INDEX(landed), INDEX(warehouseFk), INDEX(itemFk)) ENGINE = MEMORY @@ -97,7 +97,8 @@ BEGIN LIMIT 10000000000000000000) sub GROUP BY itemFk, warehouseFk; - -- ItemOriginal + -- ItemOriginal + INSERT IGNORE INTO tmp.buyUltimateFromInterval(itemFk, warehouseFk, buyFk, landed, isIgnored) SELECT itemFk, warehouseFk, From 55ea761af4e9f0419712a01c841f0313d466338a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Fri, 19 Jul 2024 15:11:14 +0200 Subject: [PATCH 11/39] eat: refactor buyUltimate refs #7736 --- db/routines/vn/procedures/buy_getUltimate.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/routines/vn/procedures/buy_getUltimate.sql b/db/routines/vn/procedures/buy_getUltimate.sql index 164fb3266..66e92c50e 100644 --- a/db/routines/vn/procedures/buy_getUltimate.sql +++ b/db/routines/vn/procedures/buy_getUltimate.sql @@ -6,7 +6,7 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`buy_getUltimate`( ) BEGIN /** - * Calcula las últimas compras realizadas hasta una fecha + * Calcula las últimas compras realizadas hasta una fecha. * * @param vItemFk Id del artículo * @param vWarehouseFk Id del almacén From d7b9a3ffd02a0571d7f3a014a33425e1c0827082 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Mon, 22 Jul 2024 11:58:51 +0200 Subject: [PATCH 12/39] feat: refactor buyUltimate refs #7736 --- db/routines/vn/procedures/buy_getUltimate.sql | 3 +-- .../vn/procedures/buy_getUltimateFromInterval.sql | 2 +- db/routines/vn/procedures/buy_updateGrouping.sql | 10 +++++++--- db/routines/vn/procedures/catalog_calculate.sql | 2 +- db/routines/vn/procedures/item_getInfo.sql | 15 +++++++++------ modules/entry/back/methods/entry/addFromBuy.js | 2 +- 6 files changed, 20 insertions(+), 14 deletions(-) diff --git a/db/routines/vn/procedures/buy_getUltimate.sql b/db/routines/vn/procedures/buy_getUltimate.sql index 66e92c50e..023e81774 100644 --- a/db/routines/vn/procedures/buy_getUltimate.sql +++ b/db/routines/vn/procedures/buy_getUltimate.sql @@ -15,8 +15,7 @@ BEGIN */ CALL cache.last_buy_refresh(FALSE); - DROP TEMPORARY TABLE IF EXISTS tmp.buyUltimate; - CREATE TEMPORARY TABLE tmp.buyUltimate + CREATE OR REPLACE TEMPORARY TABLE tmp.buyUltimate (PRIMARY KEY (itemFk, warehouseFk), INDEX(itemFk)) ENGINE = MEMORY diff --git a/db/routines/vn/procedures/buy_getUltimateFromInterval.sql b/db/routines/vn/procedures/buy_getUltimateFromInterval.sql index df0d6a20e..c340686ba 100644 --- a/db/routines/vn/procedures/buy_getUltimateFromInterval.sql +++ b/db/routines/vn/procedures/buy_getUltimateFromInterval.sql @@ -21,7 +21,7 @@ BEGIN END IF; IF vEnded < vStarted THEN - SET vStarted = TIMESTAMPADD(MONTH, -1, vEnded); + SET vStarted = vEnded - INTERVAL 1 MONTH; END IF; -- Item diff --git a/db/routines/vn/procedures/buy_updateGrouping.sql b/db/routines/vn/procedures/buy_updateGrouping.sql index 45a619262..0d97fd8bf 100644 --- a/db/routines/vn/procedures/buy_updateGrouping.sql +++ b/db/routines/vn/procedures/buy_updateGrouping.sql @@ -1,5 +1,9 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`buy_updateGrouping`(vWarehouseFk INT, vItemFk INT, vGrouping INT) +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`buy_updateGrouping`( + vWarehouseFk INT, + vItemFk INT, + vGrouping INT +) BEGIN /** * Actualiza el grouping de las últimas compras de un artículo @@ -8,9 +12,9 @@ BEGIN * @param vItemFk Id del Artículo * @param vGrouping Cantidad de grouping */ - CALL vn.buy_getUltimate (vItemFk, vWarehouseFk, util.VN_CURDATE()); + CALL buy_getUltimate (vItemFk, vWarehouseFk, util.VN_CURDATE()); - UPDATE vn.buy b + UPDATE buy b JOIN tmp.buyUltimate bu ON b.id = bu.buyFk SET b.`grouping` = vGrouping WHERE bu.warehouseFk = vWarehouseFk diff --git a/db/routines/vn/procedures/catalog_calculate.sql b/db/routines/vn/procedures/catalog_calculate.sql index 887492b35..6c4affa9d 100644 --- a/db/routines/vn/procedures/catalog_calculate.sql +++ b/db/routines/vn/procedures/catalog_calculate.sql @@ -74,7 +74,7 @@ BEGIN CALL `cache`.available_refresh (vAvailableCalc, FALSE, vWarehouseFk, vShipped); CALL `cache`.availableNoRaids_refresh (vAvailableNoRaidsCalc, FALSE, vWarehouseFk, vShipped); - CALL vn.buy_getUltimate(NULL, vWarehouseFk, vShipped); + CALL buy_getUltimate(NULL, vWarehouseFk, vShipped); INSERT INTO tmp.ticketLot (warehouseFk, itemFk, available, buyFk, zoneFk) SELECT vWarehouseFk, diff --git a/db/routines/vn/procedures/item_getInfo.sql b/db/routines/vn/procedures/item_getInfo.sql index f569d235b..5cd4fb31e 100644 --- a/db/routines/vn/procedures/item_getInfo.sql +++ b/db/routines/vn/procedures/item_getInfo.sql @@ -1,5 +1,8 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`item_getInfo`(IN `vBarcode` VARCHAR(22), IN `vWarehouseFk` INT) +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`item_getInfo`( + `vBarcode` VARCHAR(22), + `vWarehouseFk` INT +) BEGIN /** * Devuelve información relativa al item correspondiente del vBarcode pasado @@ -11,13 +14,13 @@ BEGIN DECLARE vCacheAvailableFk INT; DECLARE vVisibleItemShelving INT; DECLARE vItemFk INT; + DECLARE vDated DATE; + + SELECT barcodeToItem(vBarcode), util.VN_CURDATE() INTO vItemFk, vDated; CALL cache.visible_refresh(vCacheVisibleFk, FALSE, vWarehouseFk); - CALL cache.available_refresh(vCacheAvailableFk, FALSE, vWarehouseFk, util.VN_CURDATE()); - - SELECT barcodeToItem(vBarcode) INTO vItemFk; - - CALL buy_getUltimate(vItemFk, vWarehouseFk, util.VN_CURDATE()); + CALL cache.available_refresh(vCacheAvailableFk, FALSE, vWarehouseFk, vDated); + CALL buy_getUltimate(vItemFk, vWarehouseFk, vDated); SELECT SUM(visible) INTO vVisibleItemShelving FROM itemShelvingStock diff --git a/modules/entry/back/methods/entry/addFromBuy.js b/modules/entry/back/methods/entry/addFromBuy.js index 212aed7ea..c75c1935a 100644 --- a/modules/entry/back/methods/entry/addFromBuy.js +++ b/modules/entry/back/methods/entry/addFromBuy.js @@ -52,7 +52,7 @@ module.exports = Self => { else { const userConfig = await models.UserConfig.findById(userId, {fields: ['warehouseFk']}, myOptions); await Self.rawSql( - 'CALL vn.buy_getUltimate(?,?,?)', + 'CALL buy_getUltimate(?, ?, ?)', [args.item, userConfig.warehouseFk, null], myOptions ); From b086cc7658772b58c4ffd6fea4d6a7935c3a92c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Mon, 22 Jul 2024 13:34:04 +0200 Subject: [PATCH 13/39] feat: refactor buyUltimate refs #7736 --- .../buy_getUltimateFromInterval.sql | 12 ++++---- .../vn/procedures/catalog_calculate.sql | 30 +++++++++---------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/db/routines/vn/procedures/buy_getUltimateFromInterval.sql b/db/routines/vn/procedures/buy_getUltimateFromInterval.sql index c340686ba..2115beb95 100644 --- a/db/routines/vn/procedures/buy_getUltimateFromInterval.sql +++ b/db/routines/vn/procedures/buy_getUltimateFromInterval.sql @@ -115,12 +115,12 @@ BEGIN JOIN entry e ON e.id = b.entryFk JOIN travel t ON t.id = e.travelFk WHERE t.landed BETWEEN vStarted AND vEnded - AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) - AND (b.itemFk = vItemFk OR vItemFk IS NULL) - AND b.price2 > 0 - AND NOT b.isIgnored - AND b.quantity > 0 - AND itemOriginalFk + AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) + AND (b.itemFk = vItemFk OR vItemFk IS NULL) + AND b.price2 > 0 + AND NOT b.isIgnored + AND b.quantity > 0 + AND itemOriginalFk ORDER BY t.landed DESC, b.id DESC LIMIT 10000000000000000000) sub GROUP BY itemFk, warehouseFk; diff --git a/db/routines/vn/procedures/catalog_calculate.sql b/db/routines/vn/procedures/catalog_calculate.sql index 6c4affa9d..8432e8dea 100644 --- a/db/routines/vn/procedures/catalog_calculate.sql +++ b/db/routines/vn/procedures/catalog_calculate.sql @@ -29,7 +29,7 @@ BEGIN DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; - CALL vn.zone_getShipped (vLanded, vAddressFk, vAgencyModeFk, vShowExpiredZones); + CALL zone_getShipped (vLanded, vAddressFk, vAgencyModeFk, vShowExpiredZones); DROP TEMPORARY TABLE IF EXISTS tmp.ticketLot; CREATE TEMPORARY TABLE tmp.ticketLot( @@ -86,17 +86,17 @@ BEGIN LEFT JOIN cache.availableNoRaids anr ON anr.item_id = a.item_id AND anr.calc_id = vAvailableNoRaidsCalc JOIN tmp.item i ON i.itemFk = a.item_id - JOIN vn.item it ON it.id = i.itemFk - JOIN vn.`zone` z ON z.id = vZoneFk + JOIN item it ON it.id = i.itemFk + JOIN `zone` z ON z.id = vZoneFk LEFT JOIN tmp.buyUltimate bu ON bu.itemFk = a.item_id LEFT JOIN edi.supplyResponse sr ON sr.ID = it.supplyResponseFk LEFT JOIN edi.VMPSettings v ON v.VMPID = sr.vmpID LEFT JOIN edi.marketPlace mp ON mp.id = sr.MarketPlaceID LEFT JOIN (SELECT isVNHSupplier, isEarlyBird, TRUE AS itemAllowed - FROM vn.addressFilter af + FROM addressFilter af JOIN (SELECT ad.provinceFk, p.countryFk, ad.isLogifloraAllowed - FROM vn.address ad - JOIN vn.province p ON p.id = ad.provinceFk + FROM address ad + JOIN province p ON p.id = ad.provinceFk WHERE ad.id = vAddressFk ) sub2 ON sub2.provinceFk <=> IFNULL(af.provinceFk, sub2.provinceFk) AND sub2.countryFk <=> IFNULL(af.countryFk, sub2.countryFk) @@ -108,18 +108,18 @@ BEGIN OR ISNULL(af.afterDated)) ) sub ON sub.isVNHSupplier = v.isVNHSupplier AND (sub.isEarlyBird = mp.isEarlyBird OR ISNULL(sub.isEarlyBird)) - JOIN vn.agencyMode am ON am.id = vAgencyModeFk - JOIN vn.agency ag ON ag.id = am.agencyFk - JOIN vn.itemType itt ON itt.id = it.typeFk - JOIN vn.itemCategory itc on itc.id = itt.categoryFk - JOIN vn.address ad ON ad.id = vAddressFk - LEFT JOIN vn.clientItemType cit + JOIN agencyMode am ON am.id = vAgencyModeFk + JOIN agency ag ON ag.id = am.agencyFk + JOIN itemType itt ON itt.id = it.typeFk + JOIN itemCategory itc on itc.id = itt.categoryFk + JOIN address ad ON ad.id = vAddressFk + LEFT JOIN clientItemType cit ON cit.clientFk = ad.clientFk AND cit.itemTypeFk = itt.id - LEFT JOIN vn.zoneItemType zit + LEFT JOIN zoneItemType zit ON zit.zoneFk = vZoneFk AND zit.itemTypeFk = itt.id - LEFT JOIN vn.agencyModeItemType ait + LEFT JOIN agencyModeItemType ait ON ait.agencyModeFk = vAgencyModeFk AND ait.itemTypeFk = itt.id WHERE a.calc_id = vAvailableCalc @@ -133,7 +133,7 @@ BEGIN DROP TEMPORARY TABLE tmp.buyUltimate; - CALL vn.catalog_componentCalculate(vZoneFk, vAddressFk, vShipped, vWarehouseFk); + CALL catalog_componentCalculate(vZoneFk, vAddressFk, vShipped, vWarehouseFk); INSERT INTO tmp.ticketCalculateItem( itemFk, From 33a71867bda9cd58ce2297d7a73fe051391949ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Mon, 22 Jul 2024 13:39:48 +0200 Subject: [PATCH 14/39] feat: refactor buyUltimate refs #7736 --- db/routines/vn/procedures/buyUltimate.sql | 4 ++-- db/routines/vn/procedures/buy_updateGrouping.sql | 2 +- db/routines/vn/procedures/catalog_calculate.sql | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/db/routines/vn/procedures/buyUltimate.sql b/db/routines/vn/procedures/buyUltimate.sql index 7026c8c82..e743b8c90 100644 --- a/db/routines/vn/procedures/buyUltimate.sql +++ b/db/routines/vn/procedures/buyUltimate.sql @@ -5,8 +5,8 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`buyUltimate`( ) BEGIN /** - * DEPRECATED usar buy_getUltimate - * Calcula las últimas compras realizadas hasta una fecha + * @deprecated Usar buy_getUltimate + * Calcula las últimas compras realizadas hasta una fecha. * * @param vItemFk Id del artículo * @param vWarehouseFk Id del almacén diff --git a/db/routines/vn/procedures/buy_updateGrouping.sql b/db/routines/vn/procedures/buy_updateGrouping.sql index 0d97fd8bf..e589fbd2a 100644 --- a/db/routines/vn/procedures/buy_updateGrouping.sql +++ b/db/routines/vn/procedures/buy_updateGrouping.sql @@ -12,7 +12,7 @@ BEGIN * @param vItemFk Id del Artículo * @param vGrouping Cantidad de grouping */ - CALL buy_getUltimate (vItemFk, vWarehouseFk, util.VN_CURDATE()); + CALL buy_getUltimate(vItemFk, vWarehouseFk, util.VN_CURDATE()); UPDATE buy b JOIN tmp.buyUltimate bu ON b.id = bu.buyFk diff --git a/db/routines/vn/procedures/catalog_calculate.sql b/db/routines/vn/procedures/catalog_calculate.sql index 8432e8dea..2a0157881 100644 --- a/db/routines/vn/procedures/catalog_calculate.sql +++ b/db/routines/vn/procedures/catalog_calculate.sql @@ -72,8 +72,8 @@ BEGIN LEAVE l; END IF; - CALL `cache`.available_refresh (vAvailableCalc, FALSE, vWarehouseFk, vShipped); - CALL `cache`.availableNoRaids_refresh (vAvailableNoRaidsCalc, FALSE, vWarehouseFk, vShipped); + CALL `cache`.available_refresh(vAvailableCalc, FALSE, vWarehouseFk, vShipped); + CALL `cache`.availableNoRaids_refresh(vAvailableNoRaidsCalc, FALSE, vWarehouseFk, vShipped); CALL buy_getUltimate(NULL, vWarehouseFk, vShipped); INSERT INTO tmp.ticketLot (warehouseFk, itemFk, available, buyFk, zoneFk) From 2374711a882aa21907d528857d5a4bd36cae09a1 Mon Sep 17 00:00:00 2001 From: sergiodt Date: Thu, 25 Jul 2024 08:36:14 +0200 Subject: [PATCH 15/39] hotFix itemShelvingSale_addBySale refs #6861 --- db/routines/vn/procedures/itemShelvingSale_addBySale.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/db/routines/vn/procedures/itemShelvingSale_addBySale.sql b/db/routines/vn/procedures/itemShelvingSale_addBySale.sql index 757f880f9..454ea877f 100644 --- a/db/routines/vn/procedures/itemShelvingSale_addBySale.sql +++ b/db/routines/vn/procedures/itemShelvingSale_addBySale.sql @@ -98,6 +98,7 @@ proc: BEGIN itemShelvingFk, saleFk, quantity, + userFk, isPicked) SELECT vItemShelvingFk, vSaleFk, From af62c2e8071f31a12ade906b3a2e98bc5eb8aa94 Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 25 Jul 2024 08:57:18 +0200 Subject: [PATCH 16/39] fix: refs #7664 No insert editorFk --- db/versions/11168-redFern/00-firstScript.sql | 2 ++ modules/worker/back/models/calendar.json | 5 ++--- 2 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 db/versions/11168-redFern/00-firstScript.sql diff --git a/db/versions/11168-redFern/00-firstScript.sql b/db/versions/11168-redFern/00-firstScript.sql new file mode 100644 index 000000000..f91780e37 --- /dev/null +++ b/db/versions/11168-redFern/00-firstScript.sql @@ -0,0 +1,2 @@ +ALTER TABLE vn.calendar + ADD CONSTRAINT calendar_user_FK FOREIGN KEY (editorFk) REFERENCES account.`user`(id); diff --git a/modules/worker/back/models/calendar.json b/modules/worker/back/models/calendar.json index 40d29c519..4c68c7793 100644 --- a/modules/worker/back/models/calendar.json +++ b/modules/worker/back/models/calendar.json @@ -1,9 +1,8 @@ { "name": "Calendar", "base": "VnModel", - "log": { - "model": "WorkerLog", - "relation": "labour" + "mixins": { + "Loggable": true }, "options": { "mysql": { From 81120df4e4c080f2e02a5844d014fefdf72da292 Mon Sep 17 00:00:00 2001 From: pablone Date: Thu, 25 Jul 2024 09:57:56 +0200 Subject: [PATCH 17/39] feat: refs #6403 default mobile --- back/methods/mrw-config/createShipment.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/back/methods/mrw-config/createShipment.js b/back/methods/mrw-config/createShipment.js index 3b91f4486..2ebb80774 100644 --- a/back/methods/mrw-config/createShipment.js +++ b/back/methods/mrw-config/createShipment.js @@ -47,7 +47,7 @@ module.exports = Self => { co.code countryCode, c.fi, c.name clientName, - a.mobile, + IFNULL(a.mobile, c.mobile) mobile, DATE_FORMAT(t.shipped, '%d/%m/%Y') created, t.shipped, CONCAT( e.ticketFk, LPAD(e.counter, mc.counterWidth, '0')) reference, From 6661cb4c2ae6b137936360cdf058f98e1272c8dc Mon Sep 17 00:00:00 2001 From: robert Date: Thu, 25 Jul 2024 12:30:18 +0200 Subject: [PATCH 18/39] fix: refs #7654 itemShelving --- db/versions/11169-azureCyca/00-firstScript.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 db/versions/11169-azureCyca/00-firstScript.sql diff --git a/db/versions/11169-azureCyca/00-firstScript.sql b/db/versions/11169-azureCyca/00-firstScript.sql new file mode 100644 index 000000000..49adcfc05 --- /dev/null +++ b/db/versions/11169-azureCyca/00-firstScript.sql @@ -0,0 +1,2 @@ +ALTER TABLE IF EXISTS vn.itemShelving +MODIFY COLUMN IF EXISTS isSplit tinyint(1) DEFAULT 0 NOT NULL COMMENT 'Este valor cambia al splitar un carro que se ha quedado en holanda'; From 7254abea40b0f5f2ddd9c98ac926acc2e47310cf Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Thu, 25 Jul 2024 12:49:23 +0200 Subject: [PATCH 19/39] feat(salix): #7648 Add args to filter shipped value --- modules/entry/back/methods/entry/filter.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/modules/entry/back/methods/entry/filter.js b/modules/entry/back/methods/entry/filter.js index 5963e9c72..dcb1e3158 100644 --- a/modules/entry/back/methods/entry/filter.js +++ b/modules/entry/back/methods/entry/filter.js @@ -95,6 +95,16 @@ module.exports = Self => { type: 'date', description: `The to date filter` }, + { + arg: 'fromShipped', + type: 'date', + description: `The from shipped date filter` + }, + { + arg: 'toShipped', + type: 'date', + description: `The to shipped date filter` + }, { arg: 'days', type: 'number', @@ -133,8 +143,12 @@ module.exports = Self => { return {'e.created': {gte: value}}; case 'from': return {'t.landed': {gte: value}}; + case 'fromShipped': + return {'t.shipped': {gte: value}}; case 'to': return {'t.landed': {lte: value}}; + case 'toShipped': + return {'t.shipped': {lte: value}}; case 'id': case 'isBooked': case 'isConfirmed': From 9e18a208b27bb389ae765b8f5dad71e41db53aa1 Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 25 Jul 2024 13:26:45 +0200 Subject: [PATCH 20/39] fix: refs #7662 get value for proc with select for updates --- back/methods/collection/assign.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/back/methods/collection/assign.js b/back/methods/collection/assign.js index 718cd48c5..f246043b8 100644 --- a/back/methods/collection/assign.js +++ b/back/methods/collection/assign.js @@ -20,13 +20,14 @@ module.exports = Self => { if (typeof options == 'object') Object.assign(myOptions, options); + const randStr = Math.random().toString(36).substring(3); const result = await Self.rawSql(` CALL vn.collection_assign(?, @vCollectionFk); - SELECT @vCollectionFk collectionFk - `, [userId], myOptions); + SELECT @vCollectionFk ? + `, [userId, randStr], myOptions); - // Por si entra en el SELECT FOR UPDATE y retorna un array más - const collectionFk = result[2]?.[0]?.collectionFk || result[3]?.[0]?.collectionFk; + // Por si entra en SELECT FOR UPDATE una o varias veces + const collectionFk = result.find(item => item[0]?.[randStr] !== undefined)?.[0]?.[randStr]; if (!collectionFk) throw new UserError('There are not picking tickets'); await Self.rawSql('CALL vn.collection_printSticker(?, NULL)', [collectionFk], myOptions); From cf84ce1337aab940e74599faf80f55c287421d2f Mon Sep 17 00:00:00 2001 From: pablone Date: Fri, 26 Jul 2024 09:38:49 +0200 Subject: [PATCH 21/39] feat: refs #7401 redirect lilium --- e2e/paths/08-route/01_summary.spec.js | 62 ---- e2e/paths/08-route/02_basic_data.spec.js | 42 --- .../08-route/03_create_and_clone.spec.js | 91 ------ e2e/paths/08-route/04_tickets.spec.js | 59 ---- .../front/agency-term-search-panel/index.html | 52 ---- .../front/agency-term-search-panel/index.js | 17 -- .../agency-term-search-panel/locale/es.yml | 2 - .../agency-term/createInvoiceIn/index.html | 108 ------- .../agency-term/createInvoiceIn/index.js | 120 -------- .../agency-term/createInvoiceIn/index.spec.js | 107 ------- .../agency-term/createInvoiceIn/style.scss | 7 - .../route/front/agency-term/index/index.html | 152 ---------- .../route/front/agency-term/index/index.js | 121 -------- .../front/agency-term/index/index.spec.js | 94 ------ modules/route/front/agency-term/locale/es.yml | 5 - modules/route/front/basic-data/index.html | 96 ------ modules/route/front/basic-data/index.js | 28 -- modules/route/front/basic-data/locale/es.yml | 8 - modules/route/front/card/index.html | 5 - modules/route/front/card/index.js | 71 ----- modules/route/front/create/index.html | 52 ---- modules/route/front/create/index.js | 20 -- modules/route/front/index.js | 13 - modules/route/front/index/index.html | 228 -------------- modules/route/front/index/index.js | 151 ---------- modules/route/front/index/index.spec.js | 156 ---------- modules/route/front/index/locale/es.yml | 13 - modules/route/front/locale/en.yml | 1 - modules/route/front/locale/es.yml | 5 - modules/route/front/log/index.html | 1 - modules/route/front/log/index.js | 7 - modules/route/front/main/index.html | 20 -- modules/route/front/main/index.js | 34 +-- modules/route/front/main/index.spec.js | 49 ---- .../route/front/roadmap/basic-data/index.html | 98 ------- .../route/front/roadmap/basic-data/index.js | 16 - modules/route/front/roadmap/card/index.html | 5 - modules/route/front/roadmap/card/index.js | 19 -- modules/route/front/roadmap/create/index.html | 37 --- modules/route/front/roadmap/create/index.js | 23 -- modules/route/front/roadmap/create/style.scss | 6 - .../route/front/roadmap/descriptor/index.html | 39 --- .../route/front/roadmap/descriptor/index.js | 26 -- .../front/roadmap/descriptor/locale/es.yml | 3 - modules/route/front/roadmap/index.js | 9 - modules/route/front/roadmap/index/index.html | 112 ------- modules/route/front/roadmap/index/index.js | 60 ---- .../route/front/roadmap/index/locale/es.yml | 3 - modules/route/front/roadmap/locale/es.yml | 14 - modules/route/front/roadmap/main/index.html | 20 -- modules/route/front/roadmap/main/index.js | 61 ---- .../route/front/roadmap/main/locale/es.yml | 1 - .../front/roadmap/search-panel/index.html | 74 ----- .../route/front/roadmap/search-panel/index.js | 7 - modules/route/front/roadmap/stops/index.html | 71 ----- modules/route/front/roadmap/stops/index.js | 39 --- .../route/front/roadmap/stops/locale/es.yml | 4 - .../route/front/roadmap/summary/index.html | 116 -------- modules/route/front/roadmap/summary/index.js | 68 ----- .../route/front/roadmap/summary/locale/es.yml | 3 - .../route/front/roadmap/summary/style.scss | 9 - modules/route/front/routes.json | 115 +------- modules/route/front/search-panel/index.html | 96 ------ modules/route/front/search-panel/index.js | 43 --- .../route/front/search-panel/index.spec.js | 48 --- modules/route/front/sms/index.html | 36 --- modules/route/front/sms/index.js | 47 --- modules/route/front/sms/index.spec.js | 71 ----- modules/route/front/sms/locale/es.yml | 9 - modules/route/front/sms/style.scss | 5 - modules/route/front/ticket-popup/index.html | 84 ------ modules/route/front/ticket-popup/index.js | 80 ----- .../route/front/ticket-popup/index.spec.js | 82 ------ modules/route/front/ticket-popup/style.scss | 5 - .../tickets/__snapshots__/index.spec.js.snap | 18 -- modules/route/front/tickets/index.html | 203 ------------- modules/route/front/tickets/index.js | 201 ------------- modules/route/front/tickets/index.spec.js | 277 ------------------ modules/route/front/tickets/locale/es.yml | 18 -- modules/route/front/tickets/style.scss | 16 - 80 files changed, 6 insertions(+), 4388 deletions(-) delete mode 100644 e2e/paths/08-route/01_summary.spec.js delete mode 100644 e2e/paths/08-route/02_basic_data.spec.js delete mode 100644 e2e/paths/08-route/03_create_and_clone.spec.js delete mode 100644 e2e/paths/08-route/04_tickets.spec.js delete mode 100644 modules/route/front/agency-term-search-panel/index.html delete mode 100644 modules/route/front/agency-term-search-panel/index.js delete mode 100644 modules/route/front/agency-term-search-panel/locale/es.yml delete mode 100644 modules/route/front/agency-term/createInvoiceIn/index.html delete mode 100644 modules/route/front/agency-term/createInvoiceIn/index.js delete mode 100644 modules/route/front/agency-term/createInvoiceIn/index.spec.js delete mode 100644 modules/route/front/agency-term/createInvoiceIn/style.scss delete mode 100644 modules/route/front/agency-term/index/index.html delete mode 100644 modules/route/front/agency-term/index/index.js delete mode 100644 modules/route/front/agency-term/index/index.spec.js delete mode 100644 modules/route/front/agency-term/locale/es.yml delete mode 100644 modules/route/front/basic-data/index.html delete mode 100644 modules/route/front/basic-data/index.js delete mode 100644 modules/route/front/basic-data/locale/es.yml delete mode 100644 modules/route/front/card/index.html delete mode 100644 modules/route/front/card/index.js delete mode 100644 modules/route/front/create/index.html delete mode 100644 modules/route/front/create/index.js delete mode 100644 modules/route/front/index/index.html delete mode 100644 modules/route/front/index/index.js delete mode 100644 modules/route/front/index/index.spec.js delete mode 100644 modules/route/front/index/locale/es.yml delete mode 100644 modules/route/front/locale/en.yml delete mode 100644 modules/route/front/locale/es.yml delete mode 100644 modules/route/front/log/index.html delete mode 100644 modules/route/front/log/index.js delete mode 100644 modules/route/front/main/index.spec.js delete mode 100644 modules/route/front/roadmap/basic-data/index.html delete mode 100644 modules/route/front/roadmap/basic-data/index.js delete mode 100644 modules/route/front/roadmap/card/index.html delete mode 100644 modules/route/front/roadmap/card/index.js delete mode 100644 modules/route/front/roadmap/create/index.html delete mode 100644 modules/route/front/roadmap/create/index.js delete mode 100644 modules/route/front/roadmap/create/style.scss delete mode 100644 modules/route/front/roadmap/descriptor/index.html delete mode 100644 modules/route/front/roadmap/descriptor/index.js delete mode 100644 modules/route/front/roadmap/descriptor/locale/es.yml delete mode 100644 modules/route/front/roadmap/index.js delete mode 100644 modules/route/front/roadmap/index/index.html delete mode 100644 modules/route/front/roadmap/index/index.js delete mode 100644 modules/route/front/roadmap/index/locale/es.yml delete mode 100644 modules/route/front/roadmap/locale/es.yml delete mode 100644 modules/route/front/roadmap/main/index.html delete mode 100644 modules/route/front/roadmap/main/index.js delete mode 100644 modules/route/front/roadmap/main/locale/es.yml delete mode 100644 modules/route/front/roadmap/search-panel/index.html delete mode 100644 modules/route/front/roadmap/search-panel/index.js delete mode 100644 modules/route/front/roadmap/stops/index.html delete mode 100644 modules/route/front/roadmap/stops/index.js delete mode 100644 modules/route/front/roadmap/stops/locale/es.yml delete mode 100644 modules/route/front/roadmap/summary/index.html delete mode 100644 modules/route/front/roadmap/summary/index.js delete mode 100644 modules/route/front/roadmap/summary/locale/es.yml delete mode 100644 modules/route/front/roadmap/summary/style.scss delete mode 100644 modules/route/front/search-panel/index.html delete mode 100644 modules/route/front/search-panel/index.js delete mode 100644 modules/route/front/search-panel/index.spec.js delete mode 100644 modules/route/front/sms/index.html delete mode 100644 modules/route/front/sms/index.js delete mode 100644 modules/route/front/sms/index.spec.js delete mode 100644 modules/route/front/sms/locale/es.yml delete mode 100644 modules/route/front/sms/style.scss delete mode 100644 modules/route/front/ticket-popup/index.html delete mode 100644 modules/route/front/ticket-popup/index.js delete mode 100644 modules/route/front/ticket-popup/index.spec.js delete mode 100644 modules/route/front/ticket-popup/style.scss delete mode 100644 modules/route/front/tickets/__snapshots__/index.spec.js.snap delete mode 100644 modules/route/front/tickets/index.html delete mode 100644 modules/route/front/tickets/index.js delete mode 100644 modules/route/front/tickets/index.spec.js delete mode 100644 modules/route/front/tickets/locale/es.yml delete mode 100644 modules/route/front/tickets/style.scss diff --git a/e2e/paths/08-route/01_summary.spec.js b/e2e/paths/08-route/01_summary.spec.js deleted file mode 100644 index 44f66ba2d..000000000 --- a/e2e/paths/08-route/01_summary.spec.js +++ /dev/null @@ -1,62 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Route summary path', () => { - let browser; - let page; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('employee', 'route'); - await page.waitToClick(selectors.routeIndex.previewButton); - await page.waitToClick(selectors.routeSummary.goToRouteSummaryButton); - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should reach the first route summary section', async() => { - await page.waitForState('route.card.summary'); - }); - - it(`should display details from the route on the header`, async() => { - await page.waitForTextInElement(selectors.routeSummary.header, 'first route'); - const result = await page.waitToGetProperty(selectors.routeSummary.header, 'innerText'); - - expect(result).toContain('first route'); - }); - - it('should display some route details like the cost', async() => { - const result = await page.waitToGetProperty(selectors.routeSummary.cost, 'innerText'); - - expect(result).toContain('€10.00'); - }); - - it('should click on the first ticket ID making the descriptor popover visible', async() => { - await page.waitForState('route.card.summary'); - await page.waitForTimeout(250); - await page.waitToClick(selectors.routeSummary.firstTicketID); - await page.waitForSelector(selectors.routeSummary.firstTicketDescriptor); - const visible = await page.isVisible(selectors.routeSummary.firstTicketDescriptor); - - expect(visible).toBe(true); - }); - - it('should close the ticket descriptor', async() => { - await page.closePopup(); - }); - - it('should click on the first alias making the client descriptor popover visible', async() => { - await page.waitToClick(selectors.routeSummary.firstAlias); - await page.waitForSelector(selectors.routeSummary.firstClientDescriptor); - const visible = await page.isVisible(selectors.routeSummary.firstClientDescriptor); - - expect(visible).toBe(true); - }); - - it('should close the client descriptor', async() => { - await page.closePopup(); - }); -}); diff --git a/e2e/paths/08-route/02_basic_data.spec.js b/e2e/paths/08-route/02_basic_data.spec.js deleted file mode 100644 index 7ab7dda42..000000000 --- a/e2e/paths/08-route/02_basic_data.spec.js +++ /dev/null @@ -1,42 +0,0 @@ -import getBrowser from '../../helpers/puppeteer'; - -describe('Route basic Data path', () => { - let browser; - let page; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('delivery', 'route'); - await page.accessToSearchResult('1'); - await page.accessToSection('route.card.basicData'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should edit the route basic data and confirm the route was edited', async() => { - const nextMonth = Date.vnNew(); - nextMonth.setMonth(nextMonth.getMonth() + 1); - nextMonth.setUTCHours(0, 0, 0, 0); - - const form = 'vn-route-basic-data form'; - const values = { - worker: 'adminBossNick', - vehicle: '1111-IMK', - created: nextMonth, - kmStart: 1, - kmEnd: 2, - started: '08:00', - finished: '12:30', - }; - - const message = await page.sendForm(form, values); - await page.reloadSection('route.card.basicData'); - const formValues = await page.fetchForm(form, Object.keys(values)); - - expect(message.isSuccess).toBeTrue(); - expect(formValues).toEqual(values); - }); -}); diff --git a/e2e/paths/08-route/03_create_and_clone.spec.js b/e2e/paths/08-route/03_create_and_clone.spec.js deleted file mode 100644 index 31c0cfc18..000000000 --- a/e2e/paths/08-route/03_create_and_clone.spec.js +++ /dev/null @@ -1,91 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Route create path', () => { - let browser; - let page; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('employee', 'route'); - }); - - afterAll(async() => { - await browser.close(); - }); - - describe('as employee', () => { - it('should click on the add new route button and open the creation form', async() => { - await page.waitToClick(selectors.routeIndex.addNewRouteButton); - await page.waitForState('route.create'); - }); - - it(`should attempt to create a new route but fail since employee has no access rights`, async() => { - await page.write(selectors.createRouteView.description, 'faster faster!!'); - await page.waitToClick(selectors.createRouteView.submitButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Access Denied'); - }); - }); - - describe('as delivery', () => { - beforeAll(async() => { - await page.login('delivery'); - await page.selectModule('route'); - }); - - it('should again click on the add new route button and open the creation form', async() => { - await page.waitToClick(selectors.routeIndex.addNewRouteButton); - await page.waitForState('route.create'); - }); - - it(`should create a new route`, async() => { - await page.autocompleteSearch(selectors.createRouteView.worker, 'teamManagerNick'); - await page.pickDate(selectors.createRouteView.createdDatePicker); - await page.autocompleteSearch(selectors.createRouteView.vehicleAuto, '4444-IMK'); - await page.autocompleteSearch(selectors.createRouteView.agency, 'Teleportation device'); - await page.write(selectors.createRouteView.description, 'faster faster!!'); - await page.waitToClick(selectors.createRouteView.submitButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it(`should confirm the redirection to the created route summary`, async() => { - await page.waitForState('route.card.summary'); - }); - - it(`should navigate back to the route index`, async() => { - await page.waitToClick(selectors.globalItems.returnToModuleIndexButton); - await page.waitForState('route.index'); - }); - - let count; - it(`should count the amount of routes before clonation`, async() => { - await page.waitForFunction(selector => { - return document.querySelectorAll(selector).length > 6; - }, {}, selectors.routeIndex.anyResult); - count = await page.countElement(selectors.routeIndex.anyResult); - - expect(count).toBeGreaterThanOrEqual(7); - }); - - it(`should clone the first route`, async() => { - await page.waitToClick(selectors.routeIndex.firstRouteCheckbox); - await page.waitToClick(selectors.routeIndex.cloneButton); - await page.waitToClick(selectors.routeIndex.submitClonationButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it(`should reload the section and count the amount of routes after clonation`, async() => { - await page.waitForNumberOfElements(selectors.routeIndex.anyResult, count + 1); - const result = await page.countElement(selectors.routeIndex.anyResult); - - expect(result).toEqual(count + 1); - }); - }); -}); diff --git a/e2e/paths/08-route/04_tickets.spec.js b/e2e/paths/08-route/04_tickets.spec.js deleted file mode 100644 index c890162a1..000000000 --- a/e2e/paths/08-route/04_tickets.spec.js +++ /dev/null @@ -1,59 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Route tickets path', () => { - let browser; - let page; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('delivery', 'route'); - await page.accessToSearchResult('2'); - await page.accessToSection('route.card.tickets'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should modify the first ticket priority', async() => { - await page.writeOnEditableTD(selectors.routeTickets.firstTicketPriority, '9'); - await page.keyboard.press('Enter'); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should confirm the buscaman button is disabled', async() => { - await page.waitForSelector(`${selectors.routeTickets.buscamanButton}.disabled`); - }); - - it('should check the first ticket checkbox and confirm the buscamanButton button is no longer disabled', async() => { - await page.waitForSelector(`${selectors.routeTickets.buscamanButton}.disabled`, {visible: false}); - }); - - it('should check the route volume on the descriptor', async() => { - const result = await page.waitToGetProperty(selectors.routeDescriptor.volume, 'innerText'); - - expect(result).toEqual('0.2 / 50 m³'); - }); - - it('should count how many tickets are in route', async() => { - const result = await page.countElement(selectors.routeTickets.anyTicket); - - expect(result).toEqual(1); - }); - - it('should delete the first ticket in route', async() => { - await page.waitToClick(selectors.routeTickets.firstTicketDeleteButton); - await page.waitToClick(selectors.routeTickets.confirmButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Ticket removed from route'); - }); - - it('should now count how many tickets are in route to find one less', async() => { - await page.waitForNumberOfElements(selectors.routeTickets.anyTicket, 0); - }); -}); diff --git a/modules/route/front/agency-term-search-panel/index.html b/modules/route/front/agency-term-search-panel/index.html deleted file mode 100644 index fdd6b649b..000000000 --- a/modules/route/front/agency-term-search-panel/index.html +++ /dev/null @@ -1,52 +0,0 @@ -
- - -
- - - - - - - - - - -
- - - - - - -
- - - -
-
diff --git a/modules/route/front/agency-term-search-panel/index.js b/modules/route/front/agency-term-search-panel/index.js deleted file mode 100644 index d5d8ea7a6..000000000 --- a/modules/route/front/agency-term-search-panel/index.js +++ /dev/null @@ -1,17 +0,0 @@ -import ngModule from '../module'; -import SearchPanel from 'core/components/searchbar/search-panel'; - -class Controller extends SearchPanel { - get filter() { - return this.$.filter; - } - - set filter(value = {}) { - this.$.filter = value; - } -} - -ngModule.vnComponent('vnAgencyTermSearchPanel', { - template: require('./index.html'), - controller: Controller -}); diff --git a/modules/route/front/agency-term-search-panel/locale/es.yml b/modules/route/front/agency-term-search-panel/locale/es.yml deleted file mode 100644 index 74336a03b..000000000 --- a/modules/route/front/agency-term-search-panel/locale/es.yml +++ /dev/null @@ -1,2 +0,0 @@ -Search by invoiceIn id or autonomous name: Buscar por id de recibida o por nombre de autónomo -Search autonomous: Buscar autónomos \ No newline at end of file diff --git a/modules/route/front/agency-term/createInvoiceIn/index.html b/modules/route/front/agency-term/createInvoiceIn/index.html deleted file mode 100644 index 8f270378f..000000000 --- a/modules/route/front/agency-term/createInvoiceIn/index.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
diff --git a/modules/route/front/agency-term/createInvoiceIn/index.js b/modules/route/front/agency-term/createInvoiceIn/index.js deleted file mode 100644 index 0198ab80f..000000000 --- a/modules/route/front/agency-term/createInvoiceIn/index.js +++ /dev/null @@ -1,120 +0,0 @@ -import ngModule from '../../module'; -import Section from 'salix/components/section'; -import './style.scss'; -import UserError from 'core/lib/user-error'; - -class Controller extends Section { - constructor($element, $) { - super($element, $); - this.dms = { - files: [], - hasFile: false, - hasFileAttached: false - }; - } - - get route() { - return this._route; - } - - set route(value) { - this._route = value; - - this.setDefaultParams(); - this.getAllowedContentTypes(); - } - - $onChanges() { - if (this.$params && this.$params.q) - this.params = JSON.parse(this.$params.q); - } - - getAllowedContentTypes() { - this.$http.get('DmsContainers/allowedContentTypes').then(res => { - const contentTypes = res.data.join(', '); - this.allowedContentTypes = contentTypes; - }); - } - - get contentTypesInfo() { - return this.$t('ContentTypesInfo', { - allowedContentTypes: this.allowedContentTypes - }); - } - - setDefaultParams() { - const params = {filter: { - where: {code: 'invoiceIn'} - }}; - this.$http.get('DmsTypes/findOne', {params}).then(res => { - const dmsType = res.data && res.data; - const companyId = this.vnConfig.companyFk; - const warehouseId = this.vnConfig.warehouseFk; - const defaultParams = { - warehouseId: warehouseId, - companyId: companyId, - dmsTypeId: dmsType.id, - description: this.params.supplierName - }; - - this.dms = Object.assign(this.dms, defaultParams); - }); - } - - onSubmit() { - if (this.dms.files.length > 1) throw new UserError('You cannot attach more than one document'); - const query = `dms/uploadFile`; - const options = { - method: 'POST', - url: query, - params: this.dms, - headers: { - 'Content-Type': undefined - }, - transformRequest: files => { - const formData = new FormData(); - formData.append(files[0].name, files[0]); - return formData; - }, - data: this.dms.files - }; - this.$http(options).then(res => { - if (res) { - const addedDms = res.data; - this.$.watcher.updateOriginalData(); - - const params = { - rows: this.params.rows, - dms: addedDms - }; - - this.$http.post('AgencyTerms/createInvoiceIn', params) - .then(() => { - this.$state.go('route.agencyTerm.index'); - this.vnApp.showSuccess(this.$t('Data saved!')); - }); - } - }); - } - - onFileChange(files) { - let hasFileAttached = false; - - if (files.length > 0) - hasFileAttached = true; - - this.$.$applyAsync(() => { - this.dms.hasFileAttached = hasFileAttached; - }); - } -} - -Controller.$inject = ['$element', '$scope']; - -ngModule.vnComponent('vnAgencyTermCreateInvoiceIn', { - template: require('./index.html'), - controller: Controller, - bindings: { - route: '<' - } -}); diff --git a/modules/route/front/agency-term/createInvoiceIn/index.spec.js b/modules/route/front/agency-term/createInvoiceIn/index.spec.js deleted file mode 100644 index d6d9883a7..000000000 --- a/modules/route/front/agency-term/createInvoiceIn/index.spec.js +++ /dev/null @@ -1,107 +0,0 @@ -import './index'; -import watcher from 'core/mocks/watcher.js'; - -describe('AgencyTerm', () => { - describe('Component vnAgencyTermCreateInvoiceIn', () => { - let controller; - let $scope; - let $httpBackend; - let $httpParamSerializer; - - beforeEach(ngModule('route')); - - beforeEach(inject(($componentController, $rootScope, _$httpBackend_, _$httpParamSerializer_) => { - $scope = $rootScope.$new(); - $httpBackend = _$httpBackend_; - $httpParamSerializer = _$httpParamSerializer_; - const $element = angular.element(''); - controller = $componentController('vnAgencyTermCreateInvoiceIn', {$element}); - controller._route = { - id: 1 - }; - })); - - describe('$onChanges()', () => { - it('should update the params data when $params.q is defined', () => { - controller.$params = {q: '{"supplierName": "Plants SL","rows": null}'}; - - const params = {q: '{"supplierName": "Plants SL", "rows": null}'}; - const json = JSON.parse(params.q); - - controller.$onChanges(); - - expect(controller.params).toEqual(json); - }); - }); - - describe('route() setter', () => { - it('should set the ticket data and then call setDefaultParams() and getAllowedContentTypes()', () => { - jest.spyOn(controller, 'setDefaultParams'); - jest.spyOn(controller, 'getAllowedContentTypes'); - controller.route = { - id: 1 - }; - - expect(controller.route).toBeDefined(); - expect(controller.setDefaultParams).toHaveBeenCalledWith(); - expect(controller.getAllowedContentTypes).toHaveBeenCalledWith(); - }); - }); - - describe('getAllowedContentTypes()', () => { - it('should make an HTTP GET request to get the allowed content types', () => { - const expectedResponse = ['image/png', 'image/jpg']; - $httpBackend.expect('GET', `DmsContainers/allowedContentTypes`).respond(expectedResponse); - controller.getAllowedContentTypes(); - $httpBackend.flush(); - - expect(controller.allowedContentTypes).toBeDefined(); - expect(controller.allowedContentTypes).toEqual('image/png, image/jpg'); - }); - }); - - describe('setDefaultParams()', () => { - it('should perform a GET query and define the dms property on controller', () => { - const params = {filter: { - where: {code: 'invoiceIn'} - }}; - const serializedParams = $httpParamSerializer(params); - $httpBackend.expect('GET', `DmsTypes/findOne?${serializedParams}`).respond({id: 1, code: 'invoiceIn'}); - controller.params = {supplierName: 'Plants SL'}; - controller.setDefaultParams(); - $httpBackend.flush(); - - expect(controller.dms).toBeDefined(); - expect(controller.dms.dmsTypeId).toEqual(1); - }); - }); - - describe('onSubmit()', () => { - it('should make an HTTP POST request to save the form data', () => { - controller.$.watcher = watcher; - - jest.spyOn(controller.$.watcher, 'updateOriginalData'); - const files = [{id: 1, name: 'MyFile'}]; - controller.dms = {files}; - const serializedParams = $httpParamSerializer(controller.dms); - const query = `dms/uploadFile?${serializedParams}`; - controller.params = {rows: null}; - - $httpBackend.expect('POST', query).respond({}); - $httpBackend.expect('POST', 'AgencyTerms/createInvoiceIn').respond({}); - controller.onSubmit(); - $httpBackend.flush(); - }); - }); - - describe('onFileChange()', () => { - it('should set dms hasFileAttached property to true if has any files', () => { - const files = [{id: 1, name: 'MyFile'}]; - controller.onFileChange(files); - $scope.$apply(); - - expect(controller.dms.hasFileAttached).toBeTruthy(); - }); - }); - }); -}); diff --git a/modules/route/front/agency-term/createInvoiceIn/style.scss b/modules/route/front/agency-term/createInvoiceIn/style.scss deleted file mode 100644 index 73f136fc1..000000000 --- a/modules/route/front/agency-term/createInvoiceIn/style.scss +++ /dev/null @@ -1,7 +0,0 @@ -vn-ticket-request { - .vn-textfield { - margin: 0!important; - max-width: 100px; - } -} - diff --git a/modules/route/front/agency-term/index/index.html b/modules/route/front/agency-term/index/index.html deleted file mode 100644 index 0d8ea40e7..000000000 --- a/modules/route/front/agency-term/index/index.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - - -
-
-
Total
- - -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Id - - Date - - Agency route - - Agency Agreement - - Packages - - M3 - - Km - - Price - - Received - - Autonomous -
- - - - - {{::agencyTerm.routeFk}} - - {{::agencyTerm.created | date:'dd/MM/yyyy'}}{{::agencyTerm.agencyModeName | dashIfEmpty}}{{::agencyTerm.agencyAgreement | dashIfEmpty}}{{::agencyTerm.packages | dashIfEmpty}}{{::agencyTerm.m3 | dashIfEmpty}}{{::agencyTerm.kmTotal | dashIfEmpty}}{{::agencyTerm.price | dashIfEmpty}} - - {{::agencyTerm.invoiceInFk}} - - - - {{::agencyTerm.supplierName}} - - - - -
-
-
-
- - - - - - - - - - - - - -
- - - - -
diff --git a/modules/route/front/agency-term/index/index.js b/modules/route/front/agency-term/index/index.js deleted file mode 100644 index 6c3bafc9a..000000000 --- a/modules/route/front/agency-term/index/index.js +++ /dev/null @@ -1,121 +0,0 @@ -import ngModule from '../../module'; -import Section from 'salix/components/section'; - -class Controller extends Section { - constructor($element, $) { - super($element, $); - - this.smartTableOptions = { - activeButtons: { - search: true - }, - columns: [ - { - field: 'agencyModeFk', - autocomplete: { - url: 'AgencyModes', - showField: 'name', - valueField: 'id' - } - }, - { - field: 'agencyFk', - autocomplete: { - url: 'Agencies', - showField: 'name', - valueField: 'id' - } - }, - { - field: 'supplierFk', - autocomplete: { - url: 'Suppliers', - showField: 'name', - valueField: 'name', - } - } - ] - }; - } - - exprBuilder(param, value) { - switch (param) { - case 'agencyModeFk': - return {'a.agencyModeFk': value}; - case 'supplierFk': - return {'a.supplierName': value}; - case 'routeFk': - return {'a.routeFk': value}; - case 'created': - case 'agencyFk': - case 'packages': - case 'm3': - case 'kmTotal': - case 'price': - case 'invoiceInFk': - return {[`a.${param}`]: value}; - } - } - - get checked() { - const agencyTerms = this.$.model.data || []; - const checkedAgencyTerms = []; - for (let agencyTerm of agencyTerms) { - if (agencyTerm.checked) - checkedAgencyTerms.push(agencyTerm); - } - - return checkedAgencyTerms; - } - - get totalChecked() { - return this.checked.length; - } - - get totalPrice() { - let totalPrice = 0; - - if (this.checked.length > 0) { - for (let agencyTerm of this.checked) - totalPrice += agencyTerm.price; - - return totalPrice; - } - - return totalPrice; - } - - preview(route) { - this.routeSelected = route; - this.$.summary.show(); - } - - createInvoiceIn() { - const rowsToCreateInvoiceIn = []; - const supplierFk = this.checked[0].supplierFk; - - for (let agencyTerm of this.checked) { - let hasSameSupplier = supplierFk == agencyTerm.supplierFk; - if (hasSameSupplier) { - rowsToCreateInvoiceIn.push({ - routeFk: agencyTerm.routeFk, - supplierFk: agencyTerm.supplierFk, - created: agencyTerm.created, - totalPrice: this.totalPrice}); - } else { - this.vnApp.showError(this.$t('Two autonomous cannot be counted at the same time')); - return false; - } - } - const params = JSON.stringify({ - supplierName: this.checked[0].supplierName, - rows: rowsToCreateInvoiceIn - }); - this.$state.go('route.agencyTerm.createInvoiceIn', {q: params}); - } -} - -ngModule.vnComponent('vnAgencyTermIndex', { - template: require('./index.html'), - controller: Controller -}); diff --git a/modules/route/front/agency-term/index/index.spec.js b/modules/route/front/agency-term/index/index.spec.js deleted file mode 100644 index 55c40daa5..000000000 --- a/modules/route/front/agency-term/index/index.spec.js +++ /dev/null @@ -1,94 +0,0 @@ -import './index.js'; -import crudModel from 'core/mocks/crud-model'; - -describe('AgencyTerm', () => { - describe('Component vnAgencyTermIndex', () => { - let controller; - let $window; - - beforeEach(ngModule('route')); - - beforeEach(inject(($componentController, _$window_) => { - $window = _$window_; - const $element = angular.element(''); - controller = $componentController('vnAgencyTermIndex', {$element}); - controller.$.model = crudModel; - controller.$.model.data = [ - {supplierFk: 1, totalPrice: null}, - {supplierFk: 1}, - {supplierFk: 2} - ]; - })); - - describe('checked() getter', () => { - it('should return the checked lines', () => { - const data = controller.$.model.data; - data[0].checked = true; - - const checkedRows = controller.checked; - - const firstCheckedRow = checkedRows[0]; - - expect(firstCheckedRow.supplierFk).toEqual(1); - }); - }); - - describe('totalCheked() getter', () => { - it('should return the total checked lines', () => { - const data = controller.$.model.data; - data[0].checked = true; - - const checkedRows = controller.totalChecked; - - expect(checkedRows).toEqual(1); - }); - }); - - describe('preview()', () => { - it('should show the summary dialog', () => { - controller.$.summary = {show: () => {}}; - jest.spyOn(controller.$.summary, 'show'); - - let event = new MouseEvent('click', { - view: $window, - bubbles: true, - cancelable: true - }); - const route = {id: 1}; - - controller.preview(event, route); - - expect(controller.$.summary.show).toHaveBeenCalledWith(); - }); - }); - - describe('createInvoiceIn()', () => { - it('should throw an error if more than one autonomous are checked', () => { - jest.spyOn(controller.vnApp, 'showError'); - const data = controller.$.model.data; - data[0].checked = true; - data[2].checked = true; - - controller.createInvoiceIn(); - - expect(controller.vnApp.showError).toHaveBeenCalled(); - }); - - it('should call the function go() on $state to go to the file management', () => { - jest.spyOn(controller.$state, 'go'); - const data = controller.$.model.data; - data[0].checked = true; - - controller.createInvoiceIn(); - - delete data[0].checked; - const params = JSON.stringify({ - supplierName: data[0].supplierName, - rows: [data[0]] - }); - - expect(controller.$state.go).toHaveBeenCalledWith('route.agencyTerm.createInvoiceIn', {q: params}); - }); - }); - }); -}); diff --git a/modules/route/front/agency-term/locale/es.yml b/modules/route/front/agency-term/locale/es.yml deleted file mode 100644 index 0f6797188..000000000 --- a/modules/route/front/agency-term/locale/es.yml +++ /dev/null @@ -1,5 +0,0 @@ -Agency route: Agencia ruta -Agency Agreement: Acuerdo agencia -Autonomous: Autónomos -Two autonomous cannot be counted at the same time: Dos autonónomos no pueden ser contabilizados al mismo tiempo -You cannot attach more than one document: No puedes adjuntar más de un documento \ No newline at end of file diff --git a/modules/route/front/basic-data/index.html b/modules/route/front/basic-data/index.html deleted file mode 100644 index 7f9aef0d0..000000000 --- a/modules/route/front/basic-data/index.html +++ /dev/null @@ -1,96 +0,0 @@ - - - -
- - - - - - {{::numberPlate}} - {{::name}} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/modules/route/front/basic-data/index.js b/modules/route/front/basic-data/index.js deleted file mode 100644 index f051e23c5..000000000 --- a/modules/route/front/basic-data/index.js +++ /dev/null @@ -1,28 +0,0 @@ -import ngModule from '../module'; -import Section from 'salix/components/section'; - -class Controller extends Section { - $onInit() { - this.$http.post(`Vehicles/sorted`, {warehouseFk: this.vnConfig.warehouseFk}) - .then(res => { - this.vehicles = res.data; - }); - } - - onSubmit() { - this.$.watcher.submit().then(() => - this.card.reload() - ); - } -} - -ngModule.vnComponent('vnRouteBasicData', { - template: require('./index.html'), - controller: Controller, - bindings: { - route: '<' - }, - require: { - card: '^vnRouteCard' - } -}); diff --git a/modules/route/front/basic-data/locale/es.yml b/modules/route/front/basic-data/locale/es.yml deleted file mode 100644 index 9dcacbe9a..000000000 --- a/modules/route/front/basic-data/locale/es.yml +++ /dev/null @@ -1,8 +0,0 @@ -Date finished: Fecha fin -Date started: Fecha inicio -Km start: Km de inicio -Km end: Km de fin -Description: Descripción -Hour started: Hora inicio -Hour finished: Hora fin -Is served: Se ha servido diff --git a/modules/route/front/card/index.html b/modules/route/front/card/index.html deleted file mode 100644 index 9e0ae4e8c..000000000 --- a/modules/route/front/card/index.html +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/modules/route/front/card/index.js b/modules/route/front/card/index.js deleted file mode 100644 index 07b5a547c..000000000 --- a/modules/route/front/card/index.js +++ /dev/null @@ -1,71 +0,0 @@ -import ngModule from '../module'; -import ModuleCard from 'salix/components/module-card'; - -class Controller extends ModuleCard { - reload() { - let filter = { - fields: [ - 'id', - 'workerFk', - 'agencyModeFk', - 'created', - 'm3', - 'warehouseFk', - 'description', - 'vehicleFk', - 'kmStart', - 'kmEnd', - 'started', - 'finished', - 'cost', - 'zoneFk', - 'isOk' - ], - include: [ - { - relation: 'agencyMode', - scope: { - fields: ['id', 'name'] - } - }, { - relation: 'vehicle', - scope: { - fields: ['id', 'm3'] - } - }, { - relation: 'zone', - scope: { - fields: ['id', 'name'] - } - }, - { - relation: 'worker', - scope: { - fields: ['id'], - include: { - relation: 'user', - scope: { - fields: ['id'], - include: { - relation: 'emailUser', - scope: { - fields: ['email'] - } - } - } - } - } - } - ] - }; - - this.$http.get(`Routes/${this.$params.id}`, {filter}) - .then(res => this.route = res.data); - } -} - -ngModule.vnComponent('vnRouteCard', { - template: require('./index.html'), - controller: Controller -}); - diff --git a/modules/route/front/create/index.html b/modules/route/front/create/index.html deleted file mode 100644 index de341220e..000000000 --- a/modules/route/front/create/index.html +++ /dev/null @@ -1,52 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/modules/route/front/create/index.js b/modules/route/front/create/index.js deleted file mode 100644 index c81394c10..000000000 --- a/modules/route/front/create/index.js +++ /dev/null @@ -1,20 +0,0 @@ -import ngModule from '../module'; -import Section from 'salix/components/section'; - -export default class Controller extends Section { - onSubmit() { - this.$.watcher.submit().then( - res => { - this.$http.post(`Routes/${res.data.id}/updateWorkCenter`, null) - .then(() => { - this.$state.go('route.card.summary', {id: res.data.id}); - }); - } - ); - } -} - -ngModule.vnComponent('vnRouteCreate', { - template: require('./index.html'), - controller: Controller -}); diff --git a/modules/route/front/index.js b/modules/route/front/index.js index 803fc1045..0f2208862 100644 --- a/modules/route/front/index.js +++ b/modules/route/front/index.js @@ -1,19 +1,6 @@ export * from './module'; import './main'; -import './index/'; -import './search-panel'; import './descriptor'; import './descriptor-popover'; import './summary'; -import './card'; -import './create'; -import './basic-data'; -import './log'; -import './tickets'; -import './agency-term/index'; -import './agency-term/createInvoiceIn'; -import './agency-term-search-panel'; -import './ticket-popup'; -import './sms'; -import './roadmap'; diff --git a/modules/route/front/index/index.html b/modules/route/front/index/index.html deleted file mode 100644 index 9384af6be..000000000 --- a/modules/route/front/index/index.html +++ /dev/null @@ -1,228 +0,0 @@ - - - - - - - - -
- - - -
- - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Id - - Worker - - Agency - - Vehicle - - Date - - - - Description - - Hour started - - Hour finished -
- - - {{::route.id | dashIfEmpty}} - - -
{{name}} - {{nickname}}
-
-
-
- - - - - - - - - {{::route.m3 | dashIfEmpty}} - - - - - - - - - - - - - -
-
-
-
-
- - - - - - - - - - - - - - - - -
- - - - - - -
- - - - - - - - - - - - - - diff --git a/modules/route/front/index/index.js b/modules/route/front/index/index.js deleted file mode 100644 index bb32e1f13..000000000 --- a/modules/route/front/index/index.js +++ /dev/null @@ -1,151 +0,0 @@ -import ngModule from '../module'; -import Section from 'salix/components/section'; - -export default class Controller extends Section { - constructor($element, $, vnReport) { - super($element, $); - this.vnReport = vnReport; - this.droppableElement = 'a.vn-tr'; - } - - preview(route) { - this.routeSelected = route; - this.$.summary.show(); - } - - showTicketPopup(route) { - this.routeSelected = route; - this.$.ticketPopup.show(); - } - - get checked() { - const rows = this.$.model.data || []; - const checkedRows = []; - for (let row of rows) { - if (row.checked) - checkedRows.push(row); - } - - return checkedRows; - } - - get totalChecked() { - return this.checked.length; - } - - showRouteReport() { - const routesIds = []; - const access_token = this.vnToken.tokenMultimedia; - - for (let route of this.checked) - routesIds.push(route.id); - const stringRoutesIds = routesIds.join(','); - - if (this.checked.length <= 1) { - const url = `api/Routes/${stringRoutesIds}/driver-route-pdf?access_token=${access_token}`; - window.open(url, '_blank'); - } else { - const serializedParams = this.$httpParamSerializer({ - access_token, - id: stringRoutesIds - }); - const url = `api/Routes/downloadZip?${serializedParams}`; - window.open(url, '_blank'); - } - } - - openClonationDialog() { - this.$.clonationDialog.show(); - this.createdDate = Date.vnNew(); - } - - cloneSelectedRoutes() { - try { - if (!this.createdDate) - throw new Error(`The date can't be empty`); - - const routesIds = []; - for (let route of this.checked) - routesIds.push(route.id); - - return this.$http.post('Routes/clone', {ids: routesIds, created: this.createdDate}).then(() => { - this.$.model.refresh(); - this.vnApp.showSuccess(this.$t('Data saved!')); - }); - } catch (e) { - this.vnApp.showError(this.$t(e.message)); - } - } - - onDrop($event) { - const target = $event.target; - const droppable = target.closest(this.droppableElement); - const ticketId = $event.dataTransfer.getData('Text'); - const routeId = droppable.id; - - if (isNaN(ticketId)) { - const regexp = new RegExp(/\/ticket\/([0-9]+)\//i); - const matches = ticketId.match(regexp); - - if (matches && matches.length) - this.insert(routeId, matches[1]); - else - this.vnApp.showError(this.$t('Ticket not found')); - } - - if (!isNaN(ticketId)) - this.insert(routeId, ticketId); - } - - insert(routeId, ticketId) { - routeId = parseInt(routeId); - ticketId = parseInt(ticketId); - - const query = `Routes/${routeId}/insertTicket`; - return this.$http.patch(query, {ticketId}).then(() => { - this.vnApp.showSuccess(this.$t('Data saved!')); - this.$.model.refresh(); - }).catch(error => { - if (error.status == 404) - return this.vnApp.showError(this.$t('Ticket not found')); - throw error; - }); - } - - updateAttributes(route) { - if (route.started == null || route.finished == null) - return this.vnApp.showError(this.$t('You must select a valid time')); - if (route.created == null) - return this.vnApp.showError(this.$t('You must select a valid date')); - const params = { - workerFk: route.workerFk, - agencyModeFk: route.agencyModeFk, - vehicleFk: route.vehicleFk, - created: route.created, - description: route.description, - started: route.started, - finished: route.finished - }; - const query = `Routes/${route.id}/`; - this.$http.patch(query, params).then(res => { - this.vnApp.showSuccess(this.$t('Data saved!')); - }); - } - - markAsServed() { - const routes = []; - for (let route of this.checked) - routes.push(route.id); - - const params = {isOk: true}; - for (let routeId of routes) - this.$http.patch(`Routes/${routeId}`, params); - } -} - -Controller.$inject = ['$element', '$scope', 'vnReport']; - -ngModule.vnComponent('vnRouteIndex', { - template: require('./index.html'), - controller: Controller -}); diff --git a/modules/route/front/index/index.spec.js b/modules/route/front/index/index.spec.js deleted file mode 100644 index 399ece714..000000000 --- a/modules/route/front/index/index.spec.js +++ /dev/null @@ -1,156 +0,0 @@ -import './index.js'; -import crudModel from 'core/mocks/crud-model'; - -describe('Component vnRouteIndex', () => { - let controller; - let $httpBackend; - - beforeEach(ngModule('route')); - - beforeEach(inject(($componentController, _$httpBackend_) => { - $httpBackend = _$httpBackend_; - const $element = angular.element(''); - controller = $componentController('vnRouteIndex', {$element}); - controller.$.model = crudModel; - controller.$.model.data = [{id: 1, checked: true}, {id: 2}, {id: 3}]; - })); - - describe('checked() getter', () => { - it('should return the checked lines', () => { - const data = controller.$.model.data; - data[0].checked = true; - data[2].checked = true; - - const checkedRows = controller.checked; - - const firstCheckedRow = checkedRows[0]; - const secondCheckedRow = checkedRows[1]; - - expect(firstCheckedRow.id).toEqual(1); - expect(secondCheckedRow.id).toEqual(3); - }); - }); - - describe('totalCheked() getter', () => { - it('should return the total checked lines', () => { - const data = controller.$.model.data; - data[0].checked = true; - - const checkedRows = controller.totalChecked; - - expect(checkedRows).toEqual(1); - }); - }); - - describe('showRouteReport()', () => { - it('should call to the vnReport show method', () => { - jest.spyOn(window, 'open').mockReturnThis(); - - const data = controller.$.model.data; - data[0].checked = true; - data[2].checked = true; - - controller.showRouteReport(); - - expect(window.open).toHaveBeenCalled(); - }); - }); - - describe('cloneSelectedRoutes()', () => { - it('should perform an http request to Routes/clone', () => { - controller.createdDate = Date.vnNew(); - - $httpBackend.expect('POST', 'Routes/clone').respond(); - controller.cloneSelectedRoutes(); - $httpBackend.flush(); - }); - }); - - describe('onDrop()', () => { - it('should call the insert method when dragging a ticket number', () => { - jest.spyOn(controller, 'insert'); - - const routeId = '1'; - const expectedTicketId = '16'; - const draggedElement = '16'; - const droppable = document.createElement('a'); - droppable.setAttribute('id', 1); - droppable.classList.add('vn-tr'); - - const $event = { - dataTransfer: { - getData: () => draggedElement - }, - target: droppable - }; - controller.onDrop($event); - - expect(controller.insert).toHaveBeenCalledWith(routeId, expectedTicketId); - }); - - it('should call the insert method when dragging a ticket link', () => { - jest.spyOn(controller, 'insert'); - - const routeId = '1'; - const expectedTicketId = '11'; - const draggedElement = 'http://arkamcity.com/#!/ticket/11/summary'; - const droppable = document.createElement('a'); - droppable.setAttribute('id', 1); - droppable.classList.add('vn-tr'); - - const $event = { - dataTransfer: { - getData: () => draggedElement - }, - target: droppable - }; - controller.onDrop($event); - - expect(controller.insert).toHaveBeenCalledWith(routeId, expectedTicketId); - }); - - it('should throw an error when dragging an invalid ticket link', () => { - jest.spyOn(controller.vnApp, 'showError'); - - const draggedElement = 'http://arkamcity.com/#!/item/11/summary'; - const droppable = document.createElement('a'); - droppable.setAttribute('id', 1); - droppable.classList.add('vn-tr'); - const $event = { - dataTransfer: { - getData: () => draggedElement - }, - target: droppable - }; - controller.onDrop($event); - - expect(controller.vnApp.showError).toHaveBeenCalledWith('Ticket not found'); - }); - }); - - describe('insert()', () => { - it('should perform a HTTP patch query and then call both refresh and showSuccess methods', () => { - jest.spyOn(controller.$.model, 'refresh').mockReturnThis(); - jest.spyOn(controller.vnApp, 'showSuccess'); - - const routeId = 1; - const ticketId = 11; - const data = {ticketId}; - $httpBackend.expect('PATCH', `Routes/1/insertTicket`, data).respond(); - controller.insert(routeId, ticketId); - $httpBackend.flush(); - - expect(controller.vnApp.showSuccess).toHaveBeenCalled(); - expect(controller.$.model.refresh).toHaveBeenCalledWith(); - }); - }); - - describe('markAsServed()', () => { - it('should perform a HTTP patch query', () => { - const data = {isOk: true}; - $httpBackend.expect('PATCH', `Routes/1`, data).respond(); - controller.markAsServed(); - $httpBackend.flush(); - }); - }); -}); diff --git a/modules/route/front/index/locale/es.yml b/modules/route/front/index/locale/es.yml deleted file mode 100644 index 3db84d81e..000000000 --- a/modules/route/front/index/locale/es.yml +++ /dev/null @@ -1,13 +0,0 @@ -Vehicle: Vehículo -Download selected routes as PDF: Descargar rutas seleccionadas como PDF -Clone selected routes: Clonar rutas seleccionadas -The date can't be empty: La fecha no puede estar vacía -Starting date: Fecha de inicio -Hour started: Hora inicio -Hour finished: Hora fin -Go to route: Ir a la ruta -You must select a valid time: Debe seleccionar una hora válida -You must select a valid date: Debe seleccionar una fecha válida -Mark as served: Marcar como servidas -Retrieving data from the routes: Recuperando datos de las rutas -Send SMS to all clients: Mandar sms a todos los clientes de las rutas \ No newline at end of file diff --git a/modules/route/front/locale/en.yml b/modules/route/front/locale/en.yml deleted file mode 100644 index 0e5302b14..000000000 --- a/modules/route/front/locale/en.yml +++ /dev/null @@ -1 +0,0 @@ -Unlink zone: Unlink zone {{zoneName}} from agency {{agencyName}} \ No newline at end of file diff --git a/modules/route/front/locale/es.yml b/modules/route/front/locale/es.yml deleted file mode 100644 index 74ab2cd61..000000000 --- a/modules/route/front/locale/es.yml +++ /dev/null @@ -1,5 +0,0 @@ -Routes: Rutas -Search routes by id: Buscar rutas por identificador -New route: Nueva ruta -route: ruta -Unlink zone: Desvincular zona {{zoneName}} de agencia {{agencyName}} \ No newline at end of file diff --git a/modules/route/front/log/index.html b/modules/route/front/log/index.html deleted file mode 100644 index 7df2e30ae..000000000 --- a/modules/route/front/log/index.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/modules/route/front/log/index.js b/modules/route/front/log/index.js deleted file mode 100644 index c1a7052a9..000000000 --- a/modules/route/front/log/index.js +++ /dev/null @@ -1,7 +0,0 @@ -import ngModule from '../module'; -import Section from 'salix/components/section'; - -ngModule.vnComponent('vnRouteLog', { - template: require('./index.html'), - controller: Section, -}); diff --git a/modules/route/front/main/index.html b/modules/route/front/main/index.html index f1bed84ff..e69de29bb 100644 --- a/modules/route/front/main/index.html +++ b/modules/route/front/main/index.html @@ -1,20 +0,0 @@ - - - - - - - - - - diff --git a/modules/route/front/main/index.js b/modules/route/front/main/index.js index 8c57bbad6..a567e3072 100644 --- a/modules/route/front/main/index.js +++ b/modules/route/front/main/index.js @@ -2,36 +2,12 @@ import ngModule from '../module'; import ModuleMain from 'salix/components/module-main'; export default class Route extends ModuleMain { - $postLink() { - const to = Date.vnNew(); - to.setDate(to.getDate() + 1); - to.setHours(0, 0, 0, 0); - - const from = Date.vnNew(); - from.setDate(from.getDate()); - from.setHours(0, 0, 0, 0); - - this.filterParams = {from, to}; - this.$.model.applyFilter(null, this.filterParams); + constructor($element, $) { + super($element, $); } - - fetchParams($params) { - const hasEntries = Object.entries($params).length; - if (!hasEntries) - $params.scopeDays = 1; - - if (typeof $params.scopeDays === 'number') { - const from = Date.vnNew(); - from.setHours(0, 0, 0, 0); - - const to = new Date(from.getTime()); - to.setDate(to.getDate() + $params.scopeDays); - to.setHours(23, 59, 59, 999); - - Object.assign($params, {from, to}); - } - - return $params; + async $onInit() { + this.$state.go('home'); + window.location.href = await this.vnApp.getUrl(`route/`); } } diff --git a/modules/route/front/main/index.spec.js b/modules/route/front/main/index.spec.js deleted file mode 100644 index 0c16a7b1f..000000000 --- a/modules/route/front/main/index.spec.js +++ /dev/null @@ -1,49 +0,0 @@ -import './index.js'; - -describe('Route Component vnRoute', () => { - let controller; - - beforeEach(ngModule('route')); - - beforeEach(inject($componentController => { - let $element = angular.element(`
`); - controller = $componentController('vnRoute', {$element}); - })); - - describe('fetchParams()', () => { - it('should return a range of dates with passed scope days', () => { - let params = controller.fetchParams({ - scopeDays: 2 - }); - const from = Date.vnNew(); - from.setHours(0, 0, 0, 0); - const to = new Date(from.getTime()); - to.setDate(to.getDate() + params.scopeDays); - to.setHours(23, 59, 59, 999); - - const expectedParams = { - from, - scopeDays: params.scopeDays, - to - }; - - expect(params).toEqual(expectedParams); - }); - - it('should return default value for scope days', () => { - let params = controller.fetchParams({ - scopeDays: 1 - }); - - expect(params.scopeDays).toEqual(1); - }); - - it('should return the given scope days', () => { - let params = controller.fetchParams({ - scopeDays: 2 - }); - - expect(params.scopeDays).toEqual(2); - }); - }); -}); diff --git a/modules/route/front/roadmap/basic-data/index.html b/modules/route/front/roadmap/basic-data/index.html deleted file mode 100644 index 28c67eb47..000000000 --- a/modules/route/front/roadmap/basic-data/index.html +++ /dev/null @@ -1,98 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - - - - {{::id}} - {{::nickname}} - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/modules/route/front/roadmap/basic-data/index.js b/modules/route/front/roadmap/basic-data/index.js deleted file mode 100644 index d5b39b76e..000000000 --- a/modules/route/front/roadmap/basic-data/index.js +++ /dev/null @@ -1,16 +0,0 @@ -import ngModule from '../../module'; -import Section from 'salix/components/section'; - -export default class Controller extends Section { - onSubmit() { - this.$.watcher.submit(); - } -} - -ngModule.component('vnRoadmapBasicData', { - template: require('./index.html'), - controller: Controller, - bindings: { - roadmap: '<' - } -}); diff --git a/modules/route/front/roadmap/card/index.html b/modules/route/front/roadmap/card/index.html deleted file mode 100644 index 97ca40f95..000000000 --- a/modules/route/front/roadmap/card/index.html +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/modules/route/front/roadmap/card/index.js b/modules/route/front/roadmap/card/index.js deleted file mode 100644 index ff2d13616..000000000 --- a/modules/route/front/roadmap/card/index.js +++ /dev/null @@ -1,19 +0,0 @@ -import ngModule from '../../module'; -import ModuleCard from 'salix/components/module-card'; - -class Controller extends ModuleCard { - reload() { - const filter = { - include: [ - {relation: 'supplier'} - ] - }; - this.$http.get(`Roadmaps/${this.$params.id}`, {filter}) - .then(res => this.roadmap = res.data); - } -} - -ngModule.vnComponent('vnRoadmapCard', { - template: require('./index.html'), - controller: Controller -}); diff --git a/modules/route/front/roadmap/create/index.html b/modules/route/front/roadmap/create/index.html deleted file mode 100644 index f5a26566e..000000000 --- a/modules/route/front/roadmap/create/index.html +++ /dev/null @@ -1,37 +0,0 @@ - - -
- - - - - - - - - - - - - - - - -
diff --git a/modules/route/front/roadmap/create/index.js b/modules/route/front/roadmap/create/index.js deleted file mode 100644 index 7e638da94..000000000 --- a/modules/route/front/roadmap/create/index.js +++ /dev/null @@ -1,23 +0,0 @@ -import ngModule from '../../module'; -import Section from 'salix/components/section'; -import './style.scss'; - -class Controller extends Section { - constructor($element, $, $transclude, vnReport, vnEmail) { - super($element, $, $transclude); - this.roadmap = {etd: Date.vnNew()}; - } - - onSubmit() { - this.$.watcher.submit().then( - res => this.$state.go('route.roadmap.card.summary', {id: res.data.id}) - ); - } -} - -Controller.$inject = ['$element', '$scope']; - -ngModule.vnComponent('vnRoadmapCreate', { - template: require('./index.html'), - controller: Controller -}); diff --git a/modules/route/front/roadmap/create/style.scss b/modules/route/front/roadmap/create/style.scss deleted file mode 100644 index 8ee7ecb09..000000000 --- a/modules/route/front/roadmap/create/style.scss +++ /dev/null @@ -1,6 +0,0 @@ -vn-ticket-request { - .vn-textfield { - margin: 0!important; - max-width: 100px; - } -} diff --git a/modules/route/front/roadmap/descriptor/index.html b/modules/route/front/roadmap/descriptor/index.html deleted file mode 100644 index 92ae8eab1..000000000 --- a/modules/route/front/roadmap/descriptor/index.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - Delete roadmap - - - -
- - - - - - - {{$ctrl.roadmap.supplier.nickname}} - - -
-
-
- - - - diff --git a/modules/route/front/roadmap/descriptor/index.js b/modules/route/front/roadmap/descriptor/index.js deleted file mode 100644 index 2846b073a..000000000 --- a/modules/route/front/roadmap/descriptor/index.js +++ /dev/null @@ -1,26 +0,0 @@ -import ngModule from '../../module'; -import Descriptor from 'salix/components/descriptor'; - -class Controller extends Descriptor { - get roadmap() { - return this.entity; - } - - set roadmap(value) { - this.entity = value; - } - - onDelete() { - return this.$http.delete(`Roadmaps/${this.roadmap.id}`) - .then(() => this.$state.go('route.roadmap')) - .then(() => this.vnApp.showSuccess(this.$t('Roadmap removed'))); - } -} - -ngModule.component('vnRoadmapDescriptor', { - template: require('./index.html'), - controller: Controller, - bindings: { - roadmap: '<' - } -}); diff --git a/modules/route/front/roadmap/descriptor/locale/es.yml b/modules/route/front/roadmap/descriptor/locale/es.yml deleted file mode 100644 index 376209694..000000000 --- a/modules/route/front/roadmap/descriptor/locale/es.yml +++ /dev/null @@ -1,3 +0,0 @@ -Delete roadmap: Eliminar troncal -The roadmap will be removed: La troncal será eliminada -Roadmap removed: Troncal eliminada diff --git a/modules/route/front/roadmap/index.js b/modules/route/front/roadmap/index.js deleted file mode 100644 index 91b782a9b..000000000 --- a/modules/route/front/roadmap/index.js +++ /dev/null @@ -1,9 +0,0 @@ -import './main'; -import './index/'; -import './summary'; -import './card'; -import './descriptor'; -import './create'; -import './basic-data'; -import './search-panel'; -import './stops'; diff --git a/modules/route/front/roadmap/index/index.html b/modules/route/front/roadmap/index/index.html deleted file mode 100644 index 6f8cbecc4..000000000 --- a/modules/route/front/roadmap/index/index.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - - - - - - - - - - - - Roadmap - ETD - Carrier - Plate - Price - Observations - - - - - - - - - - {{::roadmap.name}} - {{::roadmap.etd | date:'dd/MM/yyyy HH:mm'}} - - - {{::roadmap.supplier.nickname}} - - - {{::roadmap.tractorPlate | dashIfEmpty}} - {{::roadmap.price | currency: 'EUR':2 | dashIfEmpty}} - {{::roadmap.observations | dashIfEmpty}} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/route/front/roadmap/index/index.js b/modules/route/front/roadmap/index/index.js deleted file mode 100644 index c5f5ef9d1..000000000 --- a/modules/route/front/roadmap/index/index.js +++ /dev/null @@ -1,60 +0,0 @@ -import ngModule from '../../module'; -import Section from 'salix/components/section'; - -class Controller extends Section { - get checked() { - const roadmaps = this.$.model.data || []; - const checkedRoadmap = []; - for (let roadmap of roadmaps) { - if (roadmap.checked) - checkedRoadmap.push(roadmap); - } - - return checkedRoadmap; - } - - get totalChecked() { - return this.checked.length; - } - - preview(roadmap) { - this.roadmapSelected = roadmap; - this.$.summary.show(); - } - - openClonationDialog() { - this.$.clonationDialog.show(); - this.etd = Date.vnNew(); - } - - cloneSelectedRoadmaps() { - try { - if (!this.etd) - throw new Error(`The date can't be empty`); - - const roadmapsIds = []; - for (let roadmap of this.checked) - roadmapsIds.push(roadmap.id); - - return this.$http.post('Roadmaps/clone', {ids: roadmapsIds, etd: this.etd}).then(() => { - this.$.model.refresh(); - this.vnApp.showSuccess(this.$t('Data saved!')); - }); - } catch (e) { - this.vnApp.showError(this.$t(e.message)); - } - } - - deleteRoadmaps() { - for (const roadmap of this.checked) { - this.$http.delete(`Roadmaps/${roadmap.id}`) - .then(() => this.$.model.refresh()) - .then(() => this.vnApp.showSuccess(this.$t('Roadmaps removed'))); - } - } -} - -ngModule.vnComponent('vnRoadmapIndex', { - template: require('./index.html'), - controller: Controller -}); diff --git a/modules/route/front/roadmap/index/locale/es.yml b/modules/route/front/roadmap/index/locale/es.yml deleted file mode 100644 index dd93eac6e..000000000 --- a/modules/route/front/roadmap/index/locale/es.yml +++ /dev/null @@ -1,3 +0,0 @@ -Delete roadmap(s): Eliminar troncal(es) -Selected roadmaps will be removed: Los troncales seleccionados serán eliminados -Roadmaps removed: Troncales eliminados diff --git a/modules/route/front/roadmap/locale/es.yml b/modules/route/front/roadmap/locale/es.yml deleted file mode 100644 index e136eca31..000000000 --- a/modules/route/front/roadmap/locale/es.yml +++ /dev/null @@ -1,14 +0,0 @@ -Roadmaps: Troncales -Roadmap: Troncal -Driver name: Nombre conductor -Plate: Matrícula -Price: Precio -Observations: Observaciones -Clone selected roadmaps: Clonar troncales seleccionadas -Select the estimated time of departure (ETD): Seleccione la hora estimada de salida (ETD) -Create roadmap: Crear troncal -Tractor plate: Matrícula tractor -Trailer plate: Matrícula trailer -Carrier: Transportista -ETD date: Fecha ETD -ETD hour: Hora ETD diff --git a/modules/route/front/roadmap/main/index.html b/modules/route/front/roadmap/main/index.html deleted file mode 100644 index 3a8eb2599..000000000 --- a/modules/route/front/roadmap/main/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - diff --git a/modules/route/front/roadmap/main/index.js b/modules/route/front/roadmap/main/index.js deleted file mode 100644 index e7b3366f2..000000000 --- a/modules/route/front/roadmap/main/index.js +++ /dev/null @@ -1,61 +0,0 @@ -import ngModule from '../../module'; -import ModuleMain from 'salix/components/module-main'; - -export default class Roadmap extends ModuleMain { - constructor($element, $) { - super($element, $); - - this.include = { - relation: 'supplier', - scope: { - fields: ['nickname'] - } - }; - } - - $postLink() { - const from = Date.vnNew(); - from.setHours(0, 0, 0, 0); - - const to = Date.vnNew(); - to.setHours(23, 59, 59, 999); - - this.filterParams = { - from: from, - to: to - }; - - this.$.model.addFilter({where: { - and: [ - {etd: {gte: from}}, - {etd: {lte: to}} - ] - }}); - } - - exprBuilder(param, value) { - switch (param) { - case 'search': - return /^\d+$/.test(value) - ? {id: value} - : {name: {like: `%${value}%`}}; - case 'from': - return {etd: {gte: value}}; - case 'to': - return {etd: {lte: value}}; - case 'supplierFk': - case 'price': - return {[param]: value}; - case 'tractorPlate': - case 'trailerPlate': - case 'phone': - case 'driverName': - return {[param]: {like: `%${value}%`}}; - } - } -} - -ngModule.vnComponent('vnRoadmap', { - controller: Roadmap, - template: require('./index.html') -}); diff --git a/modules/route/front/roadmap/main/locale/es.yml b/modules/route/front/roadmap/main/locale/es.yml deleted file mode 100644 index 78342bce8..000000000 --- a/modules/route/front/roadmap/main/locale/es.yml +++ /dev/null @@ -1 +0,0 @@ -Search roadmap by id or trunk: Buscar troncales por id o troncal diff --git a/modules/route/front/roadmap/search-panel/index.html b/modules/route/front/roadmap/search-panel/index.html deleted file mode 100644 index 53fd37344..000000000 --- a/modules/route/front/roadmap/search-panel/index.html +++ /dev/null @@ -1,74 +0,0 @@ -
-
- - - - -
- - - - - - -
- - - - - - - - - - {{::id}} - {{::nickname}} - - - - - - - - - - - - - - -
-
diff --git a/modules/route/front/roadmap/search-panel/index.js b/modules/route/front/roadmap/search-panel/index.js deleted file mode 100644 index 499027d14..000000000 --- a/modules/route/front/roadmap/search-panel/index.js +++ /dev/null @@ -1,7 +0,0 @@ -import ngModule from '../../module'; -import SearchPanel from 'core/components/searchbar/search-panel'; - -ngModule.component('vnRoadmapSearchPanel', { - template: require('./index.html'), - controller: SearchPanel -}); diff --git a/modules/route/front/roadmap/stops/index.html b/modules/route/front/roadmap/stops/index.html deleted file mode 100644 index 82f30c326..000000000 --- a/modules/route/front/roadmap/stops/index.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - diff --git a/modules/route/front/roadmap/stops/index.js b/modules/route/front/roadmap/stops/index.js deleted file mode 100644 index 075a1c8a4..000000000 --- a/modules/route/front/roadmap/stops/index.js +++ /dev/null @@ -1,39 +0,0 @@ -import ngModule from '../../module'; -import Section from 'salix/components/section'; - -export default class Controller extends Section { - add() { - const filter = { - fields: ['etd'] - }; - this.$http.get(`Roadmaps/${this.$params.id}`, {filter}) - .then(res => { - this.roadmap = res.data; - - const eta = new Date(this.roadmap.etd); - eta.setDate(eta.getDate() + 1); - - this.$.model.insert({ - roadmapFk: this.$params.id, - eta: eta - }); - }); - } - - onSubmit() { - this.$.watcher.check(); - this.$.model.save().then(() => { - this.$.watcher.notifySaved(); - this.$.watcher.updateOriginalData(); - this.$.model.refresh(); - }); - } -} - -ngModule.component('vnRoadmapStops', { - template: require('./index.html'), - controller: Controller, - bindings: { - roadmap: '<' - } -}); diff --git a/modules/route/front/roadmap/stops/locale/es.yml b/modules/route/front/roadmap/stops/locale/es.yml deleted file mode 100644 index 1db275949..000000000 --- a/modules/route/front/roadmap/stops/locale/es.yml +++ /dev/null @@ -1,4 +0,0 @@ -Remove stop: Eliminar parada -Add stop: Añadir parada -ETA date: Fecha ETA -ETA hour: Hora ETA diff --git a/modules/route/front/roadmap/summary/index.html b/modules/route/front/roadmap/summary/index.html deleted file mode 100644 index abf5ff90a..000000000 --- a/modules/route/front/roadmap/summary/index.html +++ /dev/null @@ -1,116 +0,0 @@ - -
- {{summary.id}} - {{summary.name}} -
- - - - - {{summary.supplier.nickname}} - - - - - - - - - - - - - - - - - - - -

- - Stops - - - -

- - - - Wharehouse - ETA - - - - - {{roadmapStop.warehouse.name}} - {{roadmapStop.eta | date:'dd/MM/yyyy HH:mm'}} - - - -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/route/front/roadmap/summary/index.js b/modules/route/front/roadmap/summary/index.js deleted file mode 100644 index 46abe5ca2..000000000 --- a/modules/route/front/roadmap/summary/index.js +++ /dev/null @@ -1,68 +0,0 @@ -import ngModule from '../../module'; -import Component from 'core/lib/component'; -import './style.scss'; - -class Controller extends Component { - set roadmap(value) { - this._roadmap = value; - this.$.summary = null; - if (!value) return; - - this.loadData(); - } - - get roadmap() { - return this._roadmap; - } - - loadData() { - const filter = { - include: [ - {relation: 'supplier'}, - {relation: 'worker'}, - {relation: 'roadmapStop', - scope: { - include: [ - {relation: 'warehouse'} - ] - }} - ] - }; - this.$http.get(`Roadmaps/${this.roadmap.id}`, {filter}) - .then(res => this.$.summary = res.data); - } - - getETD() { - const eta = new Date(this.roadmap.etd); - eta.setDate(eta.getDate() + 1); - - this.roadmapStop = {eta: eta}; - } - - onAddAccept() { - try { - const data = { - roadmapFk: this.roadmap.id, - warehouseFk: this.roadmapStop.warehouseFk, - eta: this.roadmapStop.eta, - description: this.roadmapStop.description - }; - - this.$http.post(`RoadmapStops`, data) - .then(() => { - this.loadData(); - this.vnApp.showSuccess(this.$t('Data saved!')); - }); - } catch (e) { - this.vnApp.showError(this.$t(e.message)); - } - } -} - -ngModule.component('vnRoadmapSummary', { - template: require('./index.html'), - controller: Controller, - bindings: { - roadmap: '<' - } -}); diff --git a/modules/route/front/roadmap/summary/locale/es.yml b/modules/route/front/roadmap/summary/locale/es.yml deleted file mode 100644 index f2d82438a..000000000 --- a/modules/route/front/roadmap/summary/locale/es.yml +++ /dev/null @@ -1,3 +0,0 @@ -Stops: Paradas -Wharehouse: Almacén -You must fill all the fields: Debes rellenar todos los campos diff --git a/modules/route/front/roadmap/summary/style.scss b/modules/route/front/roadmap/summary/style.scss deleted file mode 100644 index 743500cef..000000000 --- a/modules/route/front/roadmap/summary/style.scss +++ /dev/null @@ -1,9 +0,0 @@ -@import "variables"; - -vn-roadmap-summary .summary { - a:not(vn-link-phone a) { - display: flex; - align-items: center; - height: 18.328px; - } -} diff --git a/modules/route/front/routes.json b/modules/route/front/routes.json index 3b866581d..00fedc259 100644 --- a/modules/route/front/routes.json +++ b/modules/route/front/routes.json @@ -6,18 +6,7 @@ "dependencies": ["client", "worker", "ticket", "supplier", "invoiceIn"], "menus": { "main": [ - {"state": "route.index", "icon": "icon-delivery"}, - {"state": "route.agencyTerm.index", "icon": "icon-agency-term"}, - {"state": "route.roadmap", "icon": "icon-trailer"} - ], - "card": [ - {"state": "route.card.basicData", "icon": "settings"}, - {"state": "route.card.tickets", "icon": "icon-ticket"}, - {"state": "route.card.log", "icon": "history"} - ], - "roadmap": [ - {"state": "route.roadmap.card.basicData", "icon": "settings"}, - {"state": "route.roadmap.card.stops", "icon": "icon-lines"} + {"state": "route.index", "icon": "icon-delivery"} ] }, "routes": [ @@ -33,108 +22,6 @@ "state": "route.index", "component": "vn-route-index", "description": "Routes" - }, { - "url": "/create", - "state": "route.create", - "component": "vn-route-create", - "description": "New route" - }, { - "url": "/:id", - "state": "route.card", - "abstract": true, - "component": "vn-route-card" - }, { - "url": "/agency-term?q", - "abstract": true, - "state": "route.agencyTerm", - "component": "ui-view" - }, { - "url": "/index", - "state": "route.agencyTerm.index", - "component": "vn-agency-term-index", - "description": "Autonomous", - "acl": ["administrative"] - },{ - "url": "/createInvoiceIn?q", - "state": "route.agencyTerm.createInvoiceIn", - "component": "vn-agency-term-create-invoice-in", - "description": "File management", - "params": { - "route": "$ctrl.route" - }, - "acl": ["administrative"] - }, { - "url": "/summary", - "state": "route.card.summary", - "component": "vn-route-summary", - "description": "Summary", - "params": { - "route": "$ctrl.route" - } - }, { - "url": "/basic-data", - "state": "route.card.basicData", - "component": "vn-route-basic-data", - "description": "Basic data", - "params": { - "route": "$ctrl.route" - }, - "acl": ["delivery"] - }, { - "url" : "/log", - "state": "route.card.log", - "component": "vn-route-log", - "description": "Log", - "acl": ["delivery"] - }, { - "url": "/tickets", - "state": "route.card.tickets", - "component": "vn-route-tickets", - "description": "Tickets", - "params": { - "route": "$ctrl.route" - }, - "acl": ["delivery"] - }, { - "url": "/roadmap?q", - "state": "route.roadmap", - "component": "vn-roadmap", - "description": "Roadmaps" - }, { - "url": "/create", - "state": "route.roadmap.create", - "component": "vn-roadmap-create", - "description": "Create roadmap" - },{ - "url": "/:id", - "state": "route.roadmap.card", - "component": "vn-roadmap-card", - "abstract": true, - "description": "Detail" - },{ - "url": "/summary", - "state": "route.roadmap.card.summary", - "component": "vn-roadmap-summary", - "description": "Summary", - "params": { - "roadmap": "$ctrl.roadmap" - } - },{ - "url": "/basic-data", - "state": "route.roadmap.card.basicData", - "component": "vn-roadmap-basic-data", - "description": "Basic data", - "params": { - "roadmap": "$ctrl.roadmap" - } - }, { - "url": "/stops", - "state": "route.roadmap.card.stops", - "component": "vn-roadmap-stops", - "description": "Stops", - "params": { - "route": "$ctrl.roadmap" - } } ] } diff --git a/modules/route/front/search-panel/index.html b/modules/route/front/search-panel/index.html deleted file mode 100644 index f3d392580..000000000 --- a/modules/route/front/search-panel/index.html +++ /dev/null @@ -1,96 +0,0 @@ -
- - -
- - - - - - - - - - -
- - - - - - Or - - - - - -
- - - - - - - - - - - - - - - -
-
diff --git a/modules/route/front/search-panel/index.js b/modules/route/front/search-panel/index.js deleted file mode 100644 index b5abbd94a..000000000 --- a/modules/route/front/search-panel/index.js +++ /dev/null @@ -1,43 +0,0 @@ -import ngModule from '../module'; -import SearchPanel from 'core/components/searchbar/search-panel'; - -class Controller extends SearchPanel { - constructor($, $element) { - super($, $element); - this.filter = this.$.filter; - } - - get from() { - return this._from; - } - - set from(value) { - this._from = value; - this.filter.scopeDays = null; - } - - get to() { - return this._to; - } - - set to(value) { - this._to = value; - this.filter.scopeDays = null; - } - - get scopeDays() { - return this._scopeDays; - } - - set scopeDays(value) { - this._scopeDays = value; - - this.filter.from = null; - this.filter.to = null; - } -} - -ngModule.vnComponent('vnRouteSearchPanel', { - template: require('./index.html'), - controller: Controller -}); diff --git a/modules/route/front/search-panel/index.spec.js b/modules/route/front/search-panel/index.spec.js deleted file mode 100644 index ae15e16e4..000000000 --- a/modules/route/front/search-panel/index.spec.js +++ /dev/null @@ -1,48 +0,0 @@ -import './index'; - -describe('Route Component vnRouteSearchPanel', () => { - let controller; - - beforeEach(ngModule('route')); - - beforeEach(inject($componentController => { - controller = $componentController('vnRouteSearchPanel', {$element: null}); - controller.$t = () => {}; - controller.filter = {}; - })); - - describe('from() setter', () => { - it('should clear the scope days when setting the from property', () => { - controller.filter.scopeDays = 1; - - controller.from = Date.vnNew(); - - expect(controller.filter.scopeDays).toBeNull(); - expect(controller.from).toBeDefined(); - }); - }); - - describe('to() setter', () => { - it('should clear the scope days when setting the to property', () => { - controller.filter.scopeDays = 1; - - controller.to = Date.vnNew(); - - expect(controller.filter.scopeDays).toBeNull(); - expect(controller.to).toBeDefined(); - }); - }); - - describe('scopeDays() setter', () => { - it('should clear the date range when setting the scopeDays property', () => { - controller.filter.from = Date.vnNew(); - controller.filter.to = Date.vnNew(); - - controller.scopeDays = 1; - - expect(controller.filter.from).toBeNull(); - expect(controller.filter.to).toBeNull(); - expect(controller.scopeDays).toBeDefined(); - }); - }); -}); diff --git a/modules/route/front/sms/index.html b/modules/route/front/sms/index.html deleted file mode 100644 index 0d7dd7c11..000000000 --- a/modules/route/front/sms/index.html +++ /dev/null @@ -1,36 +0,0 @@ - - -
- - - - - - - {{'Characters remaining' | translate}}: - - {{$ctrl.charactersRemaining()}} - - - -
-
- - - - -
\ No newline at end of file diff --git a/modules/route/front/sms/index.js b/modules/route/front/sms/index.js deleted file mode 100644 index f466adea7..000000000 --- a/modules/route/front/sms/index.js +++ /dev/null @@ -1,47 +0,0 @@ -import ngModule from '../module'; -import Component from 'core/lib/component'; -import './style.scss'; - -class Controller extends Component { - open() { - this.$.SMSDialog.show(); - } - - charactersRemaining() { - const element = this.$.message; - const value = element.input.value; - - const maxLength = 160; - const textAreaLength = new Blob([value]).size; - return maxLength - textAreaLength; - } - - onResponse() { - try { - if (!this.sms.destination) - throw new Error(`The destination can't be empty`); - if (!this.sms.message) - throw new Error(`The message can't be empty`); - if (this.charactersRemaining() < 0) - throw new Error(`The message it's too long`); - - this.$http.post(`Routes/sendSms`, this.sms).then(res => { - this.vnApp.showMessage(this.$t('SMS sent')); - - if (res.data) this.emit('send', {response: res.data}); - }); - } catch (e) { - this.vnApp.showError(this.$t(e.message)); - return false; - } - return true; - } -} - -ngModule.vnComponent('vnRouteSms', { - template: require('./index.html'), - controller: Controller, - bindings: { - sms: '<', - } -}); diff --git a/modules/route/front/sms/index.spec.js b/modules/route/front/sms/index.spec.js deleted file mode 100644 index 8bf35e673..000000000 --- a/modules/route/front/sms/index.spec.js +++ /dev/null @@ -1,71 +0,0 @@ -import './index'; - -describe('Route', () => { - describe('Component vnRouteSms', () => { - let controller; - let $httpBackend; - - beforeEach(ngModule('route')); - - beforeEach(inject(($componentController, $rootScope, _$httpBackend_) => { - $httpBackend = _$httpBackend_; - let $scope = $rootScope.$new(); - const $element = angular.element(''); - controller = $componentController('vnRouteSms', {$element, $scope}); - controller.$.message = { - input: { - value: 'My SMS' - } - }; - })); - - describe('onResponse()', () => { - it('should perform a POST query and show a success snackbar', () => { - let params = {destinationFk: 1101, destination: 111111111, message: 'My SMS'}; - controller.sms = {destinationFk: 1101, destination: 111111111, message: 'My SMS'}; - - jest.spyOn(controller.vnApp, 'showMessage'); - $httpBackend.expect('POST', `Routes/sendSms`, params).respond(200, params); - - controller.onResponse(); - $httpBackend.flush(); - - expect(controller.vnApp.showMessage).toHaveBeenCalledWith('SMS sent'); - }); - - it('should call onResponse without the destination and show an error snackbar', () => { - controller.sms = {destinationFk: 1101, message: 'My SMS'}; - - jest.spyOn(controller.vnApp, 'showError'); - - controller.onResponse(); - - expect(controller.vnApp.showError).toHaveBeenCalledWith(`The destination can't be empty`); - }); - - it('should call onResponse without the message and show an error snackbar', () => { - controller.sms = {destinationFk: 1101, destination: 222222222}; - - jest.spyOn(controller.vnApp, 'showError'); - - controller.onResponse(); - - expect(controller.vnApp.showError).toHaveBeenCalledWith(`The message can't be empty`); - }); - }); - - describe('charactersRemaining()', () => { - it('should return the characters remaining in a element', () => { - controller.$.message = { - input: { - value: 'My message 0€' - } - }; - - let result = controller.charactersRemaining(); - - expect(result).toEqual(145); - }); - }); - }); -}); diff --git a/modules/route/front/sms/locale/es.yml b/modules/route/front/sms/locale/es.yml deleted file mode 100644 index 0168a6eb6..000000000 --- a/modules/route/front/sms/locale/es.yml +++ /dev/null @@ -1,9 +0,0 @@ -Send SMS to the selected tickets: Enviar SMS a los tickets seleccionados -Routes to notify: Rutas a notificar -Message: Mensaje -SMS sent!: ¡SMS enviado! -Characters remaining: Carácteres restantes -The destination can't be empty: El destinatario no puede estar vacio -The message can't be empty: El mensaje no puede estar vacio -The message it's too long: El mensaje es demasiado largo -Special characters like accents counts as a multiple: Carácteres especiales como los acentos cuentan como varios \ No newline at end of file diff --git a/modules/route/front/sms/style.scss b/modules/route/front/sms/style.scss deleted file mode 100644 index 84571a5f4..000000000 --- a/modules/route/front/sms/style.scss +++ /dev/null @@ -1,5 +0,0 @@ -@import "variables"; - -.SMSDialog { - min-width: 400px -} \ No newline at end of file diff --git a/modules/route/front/ticket-popup/index.html b/modules/route/front/ticket-popup/index.html deleted file mode 100644 index 5046d5e43..000000000 --- a/modules/route/front/ticket-popup/index.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - Tickets to add -
- -
-
-
- - - - - - - - - - - - Ticket - Client - Province - - - Population - - - PC - Address - Zone - - - - - - - - - - - {{::ticket.id}} - - - - - {{::ticket.nickname}} - - - {{::ticket.address.province.name}} - {{::ticket.address.city}} - {{::ticket.address.postalCode}} - {{::ticket.address.street}} - - {{::ticket.zone.name}} - - - - - - - - - - - - - - - diff --git a/modules/route/front/ticket-popup/index.js b/modules/route/front/ticket-popup/index.js deleted file mode 100644 index 8fd7b5d71..000000000 --- a/modules/route/front/ticket-popup/index.js +++ /dev/null @@ -1,80 +0,0 @@ -import ngModule from '../module'; -import Dialog from 'core/components/dialog'; -import './style.scss'; - -class Controller extends Dialog { - constructor($element, $, $transclude) { - super($element, $, $transclude); - } - - getSelectedTickets(tickets) { - const selectedTickets = []; - - if (tickets) { - for (let i = 0; i < tickets.length; i++) { - if (tickets[i].checked) - selectedTickets.push(tickets[i]); - } - } - return selectedTickets; - } - - updateVolume() { - let url = `Routes/${this.route.id}/updateVolume`; - this.$http.post(url).then(() => { - this.$.model.refresh(); - if (this.parentReload) - this.parentReload(); - }); - } - - setTicketsRoute() { - const tickets = this.getSelectedTickets(this.possibleTickets); - if (tickets.length === 0) return; - - const updates = []; - - for (let ticket of tickets) { - delete ticket.checked; - const update = { - where: {id: ticket.id}, - data: {routeFk: this.route.id} - }; - - updates.push(update); - } - - const data = {creates: [], updates: updates, deletes: []}; - return this.$http.post(`Tickets/crud`, data) - .then(() => { - this.vnApp.showSuccess(this.$t('Data saved!')); - this.updateVolume(); - this.hide(); - }); - } - - unlinkZone(ticket) { - const params = { - agencyModeId: this.route.agencyModeFk, - zoneId: ticket.zoneFk, - }; - - const query = `Routes/unlink`; - this.$http.post(query, params).then(() => { - this.vnApp.showSuccess(this.$t('Data saved!')); - this.$.model.refresh(); - this.hide(); - }); - } -} -Controller.$inject = ['$element', '$scope', '$transclude']; - -ngModule.vnComponent('vnRouteTicketPopup', { - slotTemplate: require('./index.html'), - controller: Controller, - bindings: { - route: '<', - model: ' { - let controller; - let $httpBackend; - let $scope; - - beforeEach(ngModule('route')); - - beforeEach(inject(($componentController, $rootScope, _$httpBackend_) => { - $httpBackend = _$httpBackend_; - $scope = $rootScope.$new(); - const $element = angular.element(''); - const $transclude = { - $$boundTransclude: { - $$slots: [] - } - }; - controller = $componentController('vnRouteTicketPopup', {$element, $scope, $transclude}); - controller.route = {id: 1}; - controller.$.model = { - refresh: () => {}, - remove: () => {} - }; - controller.card = {reload: () => {}}; - })); - - describe('unlink()', () => { - it('should call the route unlink endpoint with the agency and zone ids', () => { - controller.$.model = {refresh: jest.fn()}; - jest.spyOn(controller.vnApp, 'showSuccess'); - jest.spyOn(controller, 'hide'); - - controller.route = { - agencyModeFk: 1 - }; - - const ticket = { - zoneFk: 2, - }; - const params = { - agencyModeId: controller.route.agencyModeFk, - zoneId: ticket.zoneFk, - }; - - $httpBackend.expectPOST(`Routes/unlink`, params).respond('ok'); - controller.unlinkZone(ticket); - $httpBackend.flush(); - - expect(controller.vnApp.showSuccess).toHaveBeenCalled(); - expect(controller.hide).toHaveBeenCalled(); - expect(controller.$.model.refresh).toHaveBeenCalledWith(); - }); - }); - - describe('setTicketsRoute()', () => { - it('should perform a POST query to add tickets to the route', () => { - controller.$.model = {refresh: jest.fn()}; - jest.spyOn(controller.vnApp, 'showSuccess'); - jest.spyOn(controller, 'hide'); - - controller.route = {id: 111}; - - controller.possibleTickets = [ - {id: 2, checked: false}, - {id: 3, checked: true}, - {id: 4, checked: false}, - {id: 5, checked: true}, - ]; - - $httpBackend.whenPOST(`Routes/${controller.route.id}/updateVolume`).respond(200); - $httpBackend.expectPOST('Tickets/crud').respond(); - controller.setTicketsRoute(); - $httpBackend.flush(); - - expect(controller.vnApp.showSuccess).toHaveBeenCalled(); - expect(controller.hide).toHaveBeenCalled(); - expect(controller.$.model.refresh).toHaveBeenCalledWith(); - }); - }); -}); diff --git a/modules/route/front/ticket-popup/style.scss b/modules/route/front/ticket-popup/style.scss deleted file mode 100644 index 77fa48f20..000000000 --- a/modules/route/front/ticket-popup/style.scss +++ /dev/null @@ -1,5 +0,0 @@ -@import "variables"; - -.dialog{ - padding: $float-spacing -} \ No newline at end of file diff --git a/modules/route/front/tickets/__snapshots__/index.spec.js.snap b/modules/route/front/tickets/__snapshots__/index.spec.js.snap deleted file mode 100644 index 9476a8e09..000000000 --- a/modules/route/front/tickets/__snapshots__/index.spec.js.snap +++ /dev/null @@ -1,18 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Route getSelectedItems() should return the selected items 1`] = ` -Array [ - Object { - "checked": true, - "id": 1, - }, - Object { - "checked": true, - "id": 3, - }, - Object { - "checked": true, - "id": 5, - }, -] -`; diff --git a/modules/route/front/tickets/index.html b/modules/route/front/tickets/index.html deleted file mode 100644 index 7fafeb0ba..000000000 --- a/modules/route/front/tickets/index.html +++ /dev/null @@ -1,203 +0,0 @@ - - - -
- -
- - - - - - - - - - - - - - - - - - - - - Order - Street - City - PC - Client - Warehouse - Packages - - Packaging - Ticket - - - - - - - - - - - - - - - - - - {{ticket.priority}} - - - - - - - {{::ticket.street}} - - {{::ticket.city}} - - {{::ticket.postalCode}} - - - {{::ticket.nickname}} - - - {{ticket.warehouseName}} - {{::ticket.packages}} - {{::ticket.volume | number:2}} - {{::ticket.ipt}} - - - {{::ticket.id}} - - - - - - - - - - - - - - - - - -
-
-
-
- - - - - - - - - -
- - - - - - -
- - - - - - - diff --git a/modules/route/front/tickets/index.js b/modules/route/front/tickets/index.js deleted file mode 100644 index a1b97005e..000000000 --- a/modules/route/front/tickets/index.js +++ /dev/null @@ -1,201 +0,0 @@ -import ngModule from '../module'; -import Section from 'salix/components/section'; -import './style.scss'; -import UserError from 'core/lib/user-error'; - -class Controller extends Section { - get isChecked() { - if (this.tickets) { - for (let instance of this.tickets) - if (instance.checked) return true; - } - - return false; - } - - getHighestPriority() { - let highestPriority = Math.max(...this.$.model.data.map(tag => { - return tag.priority; - })); - return highestPriority + 1; - } - - setHighestPriority(ticket) { - const highestPriority = this.getHighestPriority(); - if (highestPriority - 1 != ticket.priority) { - const params = {priority: highestPriority}; - const query = `Tickets/${ticket.id}/`; - this.$http.patch(query, params).then(res => { - ticket.priority = res.data.priority; - this.vnApp.showSuccess(this.$t('Data saved!')); - }); - } - } - - setPriority(id, priority) { - let params = {priority: priority}; - let query = `Tickets/${id}/`; - this.$http.patch(query, params).then(() => { - this.vnApp.showSuccess(this.$t('Data saved!')); - }); - } - - deletePriority() { - const lines = this.getSelectedItems(this.tickets); - - for (const line of lines) { - this.$http.patch(`Tickets/${line.id}/`, {priority: null}).then(() => { - this.vnApp.showSuccess(this.$t('Data saved!')); - this.$.model.refresh(); - }); - } - } - - setOrderedPriority(lines) { - let priority = 1; - for (const line of lines) { - this.$http.patch(`Tickets/${line.id}/`, {priority: priority}).then(() => { - this.vnApp.showSuccess(this.$t('Data saved!')); - this.$.model.refresh(); - }); - priority++; - } - } - - getSelectedItems(items) { - const selectedItems = []; - - if (items) { - for (let i = 0; i < items.length; i++) { - if (items[i].checked) - selectedItems.push(items[i]); - } - } - return selectedItems; - } - - goToBuscaman(ticket) { - if (!this.route.vehicleFk) - throw new UserError(`The route doesn't have a vehicle`); - - this.$http.get(`Routes/${this.route.vehicleFk}/getDeliveryPoint`).then(res => { - if (!res.data) - throw new UserError(`The route's vehicle doesn't have a delivery point`); - - let addresses = res.data; - const lines = ticket ? [ticket] : this.getSelectedItems(this.tickets); - lines.forEach((line, index) => { - const previousLine = lines[index - 1] ? lines[index - 1].street : null; - if (previousLine != line.street) - addresses = addresses + '+to:' + line.postalCode + ' ' + line.city + ' ' + line.street; - }); - - const url = 'http://gps.buscalia.com/usuario/localizar.aspx?bmi=true&addr='; - window.open(url + encodeURI(addresses), '_blank'); - }); - } - - showDeleteConfirm(id) { - this.selectedTicket = id; - this.$.confirm.show(); - } - - removeTicketFromRoute($index) { - let params = {routeFk: null}; - let query = `Tickets/${this.selectedTicket}/`; - this.$http.patch(query, params).then(() => { - this.$.model.remove($index); - this.vnApp.showSuccess(this.$t('Ticket removed from route')); - this.updateVolume(); - }); - } - - updateVolume() { - let url = `Routes/${this.$params.id}/updateVolume`; - this.$http.post(url).then(() => { - this.card.reload(); - this.$.model.refresh(); - }); - } - - guessPriority() { - let query = `Routes/${this.$params.id}/guessPriority/`; - this.$http.patch(query).then(() => { - this.vnApp.showSuccess(this.$t('Order changed')); - this.$.model.refresh(); - }); - } - - onDrop($event) { - const ticketId = $event.dataTransfer.getData('Text'); - - if (isNaN(ticketId)) { - const regexp = new RegExp(/\/ticket\/([0-9]+)\//i); - const matches = ticketId.match(regexp); - - if (matches && matches.length) - this.insert(matches[1]); - else - this.vnApp.showError(this.$t('Ticket not found')); - } - - if (!isNaN(ticketId)) - this.insert(ticketId); - } - - insert(ticketId) { - ticketId = parseInt(ticketId); - - const query = `Routes/${this.route.id}/insertTicket`; - return this.$http.patch(query, {ticketId}).then(() => { - this.vnApp.showSuccess(this.$t('Data saved!')); - this.updateVolume(); - }).catch(error => { - if (error.status == 404) - return this.vnApp.showError(this.$t('Ticket not found')); - throw error; - }); - } - - async sendSms() { - try { - const clientsFk = []; - const clientsName = []; - const clients = []; - - const selectedTickets = this.getSelectedItems(this.$.$ctrl.tickets); - - for (let ticket of selectedTickets) { - clientsFk.push(ticket.clientFk); - let userContact = await this.$http.get(`Clients/${ticket.clientFk}`); - clientsName.push(userContact.data.name); - clients.push(userContact.data.phone); - } - - const destinationFk = String(clientsFk); - const destination = String(clients); - - this.newSMS = Object.assign({ - destinationFk: destinationFk, - destination: destination - }); - - this.$.sms.open(); - return true; - } catch (e) { - this.vnApp.showError(this.$t(e.message)); - return false; - } - } -} - -ngModule.vnComponent('vnRouteTickets', { - template: require('./index.html'), - controller: Controller, - require: { - card: '^vnRouteCard' - }, - bindings: { - route: '<' - } -}); diff --git a/modules/route/front/tickets/index.spec.js b/modules/route/front/tickets/index.spec.js deleted file mode 100644 index fef4b8331..000000000 --- a/modules/route/front/tickets/index.spec.js +++ /dev/null @@ -1,277 +0,0 @@ -/* eslint max-len: ["error", { "code": 150 }]*/ -import './index'; - -describe('Route', () => { - let controller; - let $httpBackend; - let $scope; - - beforeEach(ngModule('route')); - - beforeEach(inject(($componentController, $rootScope, _$httpBackend_) => { - $httpBackend = _$httpBackend_; - $scope = $rootScope.$new(); - const $element = angular.element(''); - controller = $componentController('vnRouteTickets', {$element, $scope}); - controller.route = {id: 1}; - controller.$.model = { - refresh: () => {}, - remove: () => {} - }; - controller.card = {reload: () => {}}; - })); - - describe('route setter/getter', () => { - it('should return the route id', () => { - controller.route = 2; - - expect(controller.route).toEqual(2); - }); - }); - - describe('isChecked getter', () => { - it('should return false if none of the tickets is checked or there are no tickets', () => { - expect(controller.isChecked).toBeFalsy(); - }); - - it('should return true if any of the tickets is checked', () => { - controller.tickets = [{checked: true}]; - - expect(controller.isChecked).toBeTruthy(); - }); - }); - - describe('getHighestPriority()', () => { - it('should return the highest value found in priorities plus 1', () => { - controller.$.model = {data: [ - {priority: 99}, - {priority: 1}, - {priority: 2}, - {priority: 3}, - {priority: 4}, - {priority: 5}, - ]}; - - let result = controller.getHighestPriority(); - - expect(result).toEqual(100); - }); - }); - - describe('setHighestPriority()', () => { - it('should set a ticket highest priority', () => { - jest.spyOn(controller.vnApp, 'showSuccess'); - controller.$.model.data = [{priority: 3}]; - const ticket = {id: 1, priority: 2}; - const res = {data: {priority: 4}}; - - $httpBackend.expectPATCH(`Tickets/${ticket.id}/`).respond(res); - controller.setHighestPriority(ticket); - $httpBackend.flush(); - - expect(controller.vnApp.showSuccess).toHaveBeenCalled(); - }); - }); - - describe('setPriority()', () => { - it('should set a ticket priority', () => { - jest.spyOn(controller.vnApp, 'showSuccess'); - const ticketId = 1; - const priority = 999; - - $httpBackend.expectPATCH(`Tickets/${ticketId}/`).respond('ok'); - controller.setPriority(ticketId, priority); - $httpBackend.flush(); - - expect(controller.vnApp.showSuccess).toHaveBeenCalled(); - }); - }); - - describe('deletePriority()', () => { - it('should delete priority of all tickets', () => { - jest.spyOn(controller.$.model, 'refresh'); - jest.spyOn(controller.vnApp, 'showSuccess'); - controller.tickets = [{id: 1, checked: true}]; - - $httpBackend.expectPATCH(`Tickets/${controller.tickets[0].id}/`).respond(); - controller.deletePriority(); - $httpBackend.flush(); - - expect(controller.vnApp.showSuccess).toHaveBeenCalled(); - expect(controller.$.model.refresh).toHaveBeenCalledWith(); - }); - }); - - describe('setOrderedPriority()', () => { - it('should set priority of all tickets starting by 1', () => { - jest.spyOn(controller.$.model, 'refresh'); - jest.spyOn(controller.vnApp, 'showSuccess'); - const tickets = [{id: 1, checked: true}]; - - $httpBackend.expectPATCH(`Tickets/${tickets[0].id}/`).respond(); - controller.setOrderedPriority(tickets); - $httpBackend.flush(); - - expect(controller.vnApp.showSuccess).toHaveBeenCalled(); - expect(controller.$.model.refresh).toHaveBeenCalledWith(); - }); - }); - - describe('getSelectedItems()', () => { - it('should return the selected items', () => { - let items = [ - {id: 1, checked: true}, - {id: 2, checked: false}, - {id: 3, checked: true}, - {id: 4, checked: false}, - {id: 5, checked: true}, - ]; - - let selectedItems = controller.getSelectedItems(items); - - expect(selectedItems).toMatchSnapshot(); - }); - }); - - describe('goToBuscaman()', () => { - it('should open buscaman with the given arguments', () => { - jest.spyOn(window, 'open').mockReturnThis(); - const expectedUrl = 'http://gps.buscalia.com/usuario/localizar.aspx?bmi=true&addr=46460%20Av%20Espioca%20100+to:n19%20London%20my%20street'; - controller.route = {vehicleFk: 1}; - const url = `Routes/${controller.route.vehicleFk}/getDeliveryPoint`; - $httpBackend.expectGET(url).respond('46460 Av Espioca 100'); - - controller.tickets = [ - { - id: 1, - checked: true, - street: 'my street', - postalCode: 'n19', - city: 'London' - }, - ]; - - controller.goToBuscaman(); - $httpBackend.flush(); - - expect(window.open).toHaveBeenCalledWith(expectedUrl, '_blank'); - }); - }); - - describe('showDeleteConfirm()', () => { - it('should open a confirm dialog after setting the selected ticket into the controller', () => { - controller.$.confirm = {show: () => {}}; - jest.spyOn(controller.$.confirm, 'show'); - let ticketId = 1; - - controller.showDeleteConfirm(ticketId); - - expect(controller.selectedTicket).toEqual(ticketId); - expect(controller.$.confirm.show).toHaveBeenCalledWith(); - }); - }); - - describe('removeTicketFromRoute()', () => { - it('should perform a patch query then call showSuccess and updateVolume methods', () => { - controller.$params = {id: 1101}; - - jest.spyOn(controller.vnApp, 'showSuccess'); - jest.spyOn(controller.$.model, 'remove'); - - let ticketId = 1; - controller.selectedTicket = ticketId; - - $httpBackend.whenPOST(`Routes/${controller.$params.id}/updateVolume`).respond(200); - $httpBackend.expectPATCH(`Tickets/${ticketId}/`).respond('ok'); - controller.removeTicketFromRoute(); - $httpBackend.flush(); - - expect(controller.vnApp.showSuccess).toHaveBeenCalledWith('Ticket removed from route'); - }); - }); - - describe('updateVolume()', () => { - it('should perform a POST query then call both reload and refresh methods', () => { - controller.$params = {id: 999}; - jest.spyOn(controller.$.model, 'refresh'); - jest.spyOn(controller.card, 'reload'); - - let ticketId = 1; - controller.selectedTicket = ticketId; - - const url = `Routes/${controller.$params.id}/updateVolume`; - $httpBackend.expectPOST(url).respond('ok'); - controller.updateVolume(); - $httpBackend.flush(); - - expect(controller.$.model.refresh).toHaveBeenCalledWith(); - expect(controller.card.reload).toHaveBeenCalledWith(); - }); - }); - - describe('onDrop()', () => { - it('should call the insert method when dragging a ticket number', () => { - jest.spyOn(controller, 'insert'); - - const expectedTicketId = '11'; - const draggedElement = '11'; - const $event = { - dataTransfer: { - getData: () => draggedElement - } - }; - controller.onDrop($event); - - expect(controller.insert).toHaveBeenCalledWith(expectedTicketId); - }); - - it('should call the insert method when dragging a ticket link', () => { - jest.spyOn(controller, 'insert'); - - const expectedTicketId = '11'; - const draggedElement = 'http://arkamcity.com/#!/ticket/11/summary'; - const $event = { - dataTransfer: { - getData: () => draggedElement - } - }; - controller.onDrop($event); - - expect(controller.insert).toHaveBeenCalledWith(expectedTicketId); - }); - - it('should throw an error when dragging an invalid ticket link', () => { - jest.spyOn(controller.vnApp, 'showError'); - - const draggedElement = 'http://arkamcity.com/#!/item/11/summary'; - const $event = { - dataTransfer: { - getData: () => draggedElement - } - }; - controller.onDrop($event); - - expect(controller.vnApp.showError).toHaveBeenCalledWith('Ticket not found'); - }); - }); - - describe('insert()', () => { - it('should make a HTTP patch query and then call both refresh and showSuccess methods', () => { - controller.$params = {id: 1101}; - - jest.spyOn(controller.$.model, 'refresh').mockReturnThis(); - jest.spyOn(controller.vnApp, 'showSuccess'); - - const ticketId = 11; - const data = {ticketId}; - - $httpBackend.whenPOST(`Routes/${controller.$params.id}/updateVolume`).respond(200); - $httpBackend.expect('PATCH', `Routes/1/insertTicket`, data).respond(); - controller.insert(ticketId); - $httpBackend.flush(); - - expect(controller.vnApp.showSuccess).toHaveBeenCalled(); - expect(controller.$.model.refresh).toHaveBeenCalledWith(); - }); - }); -}); diff --git a/modules/route/front/tickets/locale/es.yml b/modules/route/front/tickets/locale/es.yml deleted file mode 100644 index e7f483d2f..000000000 --- a/modules/route/front/tickets/locale/es.yml +++ /dev/null @@ -1,18 +0,0 @@ -Remove ticket: Eliminar ticket -Open buscaman: Abrir buscaman -Ticket removed from route: Ticket quitado de la ruta -Order changed: Orden cambiado -Delete ticket from route?: ¿Quitar el ticket de la ruta? -Sort routes: Ordenar rutas -Add ticket: Añadir ticket -Tickets to add: Tickets a añadir -Ticket not found: No se ha encontrado el ticket -The selected ticket is not suitable for this route: El ticket seleccionado no es apto para esta ruta -PC: CP -The route's vehicle doesn't have a delivery point: El vehículo de la ruta no tiene un punto de entrega -The route doesn't have a vehicle: La ruta no tiene un vehículo -Population: Población -Unlink selected zone?: Desvincular zona seleccionada? -Delete priority: Borrar orden -Renumber all tickets in the order you see on the screen: Renumerar todos los tickets con el orden que ves por pantalla -Assign highest priority: Asignar máxima prioridad \ No newline at end of file diff --git a/modules/route/front/tickets/style.scss b/modules/route/front/tickets/style.scss deleted file mode 100644 index 9393a7d59..000000000 --- a/modules/route/front/tickets/style.scss +++ /dev/null @@ -1,16 +0,0 @@ -@import "variables"; - -vn-route-tickets form{ - margin: 0 auto; - max-width: $width-lg; - - .order-field { - max-width: 30px; - } -} - -.button-right{ - display: block; - padding-right: 50px; - text-align: right; -} \ No newline at end of file From 2505adf87fc5786f93d2aa7fabe74d5893d86b2f Mon Sep 17 00:00:00 2001 From: alexm Date: Fri, 26 Jul 2024 13:47:15 +0200 Subject: [PATCH 22/39] hotFix: ticketAdvanced --- modules/ticket/front/advance/index.js | 12 +++--------- modules/ticket/front/advance/index.spec.js | 18 ------------------ 2 files changed, 3 insertions(+), 27 deletions(-) diff --git a/modules/ticket/front/advance/index.js b/modules/ticket/front/advance/index.js index 1f47d8242..15ad303e3 100644 --- a/modules/ticket/front/advance/index.js +++ b/modules/ticket/front/advance/index.js @@ -62,8 +62,11 @@ export default class Controller extends Section { setDefaultFilter() { let today = Date.vnNew(); + today.setHours(0, 0, 0, 0); const tomorrow = new Date(today); tomorrow.setDate(tomorrow.getDate() + 1); + tomorrow.setHours(23, 59, 59, 999); + this.$http.get(`UserConfigs/getUserConfig`) .then(res => { this.filterParams = { @@ -86,15 +89,6 @@ export default class Controller extends Section { return checkedLines; } - dateRange(value) { - const minHour = new Date(value); - minHour.setHours(0, 0, 0, 0); - const maxHour = new Date(value); - maxHour.setHours(23, 59, 59, 59); - - return [minHour, maxHour]; - } - totalPriceColor(totalWithVat) { return this.isLessThan50(totalWithVat) ? 'warning' : ''; } diff --git a/modules/ticket/front/advance/index.spec.js b/modules/ticket/front/advance/index.spec.js index 883993c1c..5caca742c 100644 --- a/modules/ticket/front/advance/index.spec.js +++ b/modules/ticket/front/advance/index.spec.js @@ -36,24 +36,6 @@ describe('Component vnTicketAdvance', () => { }); }); - describe('dateRange()', () => { - it('should return two dates with the hours at the start and end of the given date', () => { - const now = Date.vnNew(); - - const today = now.getDate(); - - const dateRange = controller.dateRange(now); - const start = dateRange[0].toString(); - const end = dateRange[1].toString(); - - expect(start).toContain(today); - expect(start).toContain('00:00:00'); - - expect(end).toContain(today); - expect(end).toContain('23:59:59'); - }); - }); - describe('moveTicketsAdvance()', () => { it('should make an HTTP Post query', () => { jest.spyOn(controller.$.model, 'refresh'); From b876d1c2781ef674cddb6feb69cce6343d785f89 Mon Sep 17 00:00:00 2001 From: guillermo Date: Fri, 26 Jul 2024 13:52:18 +0200 Subject: [PATCH 23/39] feat: refs #7644 Added item reference --- .../back/methods/client/hasCustomerRole.js | 2 +- .../reports/buy-label/assets/css/style.css | 5 +---- .../templates/reports/buy-label/buy-label.html | 18 ++++++++++++------ .../templates/reports/buy-label/locale/en.yml | 3 ++- .../templates/reports/buy-label/locale/es.yml | 3 ++- print/templates/reports/buy-label/sql/buys.sql | 3 ++- 6 files changed, 20 insertions(+), 14 deletions(-) diff --git a/modules/client/back/methods/client/hasCustomerRole.js b/modules/client/back/methods/client/hasCustomerRole.js index e790d6e3a..08e90077e 100644 --- a/modules/client/back/methods/client/hasCustomerRole.js +++ b/modules/client/back/methods/client/hasCustomerRole.js @@ -29,7 +29,7 @@ module.exports = Self => { SELECT COUNT(*) > 0 isCustomer FROM salix.Account A JOIN salix.Role r ON r.id = A.roleFK - WHERE r.name = 'customer' + WHERE r.name IN ('customer', 'supplier') AND A.id IN (?)`; const [result] = await Self.rawSql(query, [id], myOptions); const {isCustomer} = result; diff --git a/print/templates/reports/buy-label/assets/css/style.css b/print/templates/reports/buy-label/assets/css/style.css index 0d4a2891d..3b1f2f91e 100644 --- a/print/templates/reports/buy-label/assets/css/style.css +++ b/print/templates/reports/buy-label/assets/css/style.css @@ -33,9 +33,6 @@ span { .barcode { text-align: center; } -#variant { +.one-third { width: 314px; -} -#producer { - width: 471px; } \ No newline at end of file diff --git a/print/templates/reports/buy-label/buy-label.html b/print/templates/reports/buy-label/buy-label.html index b14e54759..4a0d7f3fc 100644 --- a/print/templates/reports/buy-label/buy-label.html +++ b/print/templates/reports/buy-label/buy-label.html @@ -4,7 +4,7 @@ -
+ @@ -63,18 +63,24 @@ - -
+ + + +
+ {{$t('control')}} + {{`${weekNum} / ${dayNum}`}} +
+ -
- {{$t('control')}} - {{`${weekNum} / ${dayNum}`}} + diff --git a/print/templates/reports/buy-label/locale/en.yml b/print/templates/reports/buy-label/locale/en.yml index d48d00771..333282759 100644 --- a/print/templates/reports/buy-label/locale/en.yml +++ b/print/templates/reports/buy-label/locale/en.yml @@ -9,4 +9,5 @@ grouping: Grouping unitSale: Un. sale producer: Producer control: Control -boxNum: Box no. \ No newline at end of file +boxNum: Box no. +reference: Reference \ No newline at end of file diff --git a/print/templates/reports/buy-label/locale/es.yml b/print/templates/reports/buy-label/locale/es.yml index 33a4a499d..af1d9aa1c 100644 --- a/print/templates/reports/buy-label/locale/es.yml +++ b/print/templates/reports/buy-label/locale/es.yml @@ -9,4 +9,5 @@ grouping: Grouping saleUnit: Sale un. producer: Productor control: Control -boxNum: Caja nº \ No newline at end of file +boxNum: Caja nº +reference: Referencia \ No newline at end of file diff --git a/print/templates/reports/buy-label/sql/buys.sql b/print/templates/reports/buy-label/sql/buys.sql index d75366815..015a74797 100644 --- a/print/templates/reports/buy-label/sql/buys.sql +++ b/print/templates/reports/buy-label/sql/buys.sql @@ -20,7 +20,8 @@ SELECT ROW_NUMBER() OVER(ORDER BY b.id, num.n) labelNum, i.stems, b.id, b.itemFk, - p.name producer + p.name producer, + i.comment FROM buy b JOIN item i ON i.id = b.itemFk LEFT JOIN producer p ON p.id = i.producerFk From a4d3eec1e1bd7066323f06318d38b702c63754a0 Mon Sep 17 00:00:00 2001 From: guillermo Date: Fri, 26 Jul 2024 14:05:22 +0200 Subject: [PATCH 24/39] fix: refs #7580 Parking deadlock --- db/routines/vn/procedures/saleGroup_setParking.sql | 9 ++------- db/routines/vn/procedures/setParking.sql | 10 ---------- db/routines/vn/procedures/shelving_setParking.sql | 6 +++--- db/routines/vn/procedures/ticket_setParking.sql | 5 ----- 4 files changed, 5 insertions(+), 25 deletions(-) diff --git a/db/routines/vn/procedures/saleGroup_setParking.sql b/db/routines/vn/procedures/saleGroup_setParking.sql index 551ca6386..fffe5e154 100644 --- a/db/routines/vn/procedures/saleGroup_setParking.sql +++ b/db/routines/vn/procedures/saleGroup_setParking.sql @@ -10,15 +10,10 @@ BEGIN * @param vSaleGroupFk id de la preparación previa * @param vParkingFk id del parking */ - DECLARE EXIT HANDLER FOR SQLEXCEPTION - BEGIN - RESIGNAL; - END; - UPDATE saleGroup sg SET sg.parkingFk = vParkingFk - WHERE sg.id = vSaleGroupFk - AND sg.created >= util.VN_CURDATE() - INTERVAL 1 WEEK; + WHERE sg.id = vSaleGroupFk + AND sg.created >= util.VN_CURDATE() - INTERVAL 1 WEEK; CALL ticket_setNextState(ticket_get(vSaleGroupFk)); END$$ diff --git a/db/routines/vn/procedures/setParking.sql b/db/routines/vn/procedures/setParking.sql index 1aa4f920a..b3edf350d 100644 --- a/db/routines/vn/procedures/setParking.sql +++ b/db/routines/vn/procedures/setParking.sql @@ -13,12 +13,6 @@ BEGIN DECLARE vParkingFk INT; DECLARE vLastWeek DATE; - DECLARE EXIT HANDLER FOR SQLEXCEPTION - BEGIN - ROLLBACK; - RESIGNAL; - END; - SET vParkingCode = REPLACE(vParkingCode, ' ', ''); SELECT id INTO vParkingFk @@ -29,8 +23,6 @@ BEGIN CALL util.throw('parkingNotExist'); END IF; - START TRANSACTION; - SET vLastWeek = util.VN_CURDATE() - INTERVAL 1 WEEK; -- Comprobamos si es una prep. previa, ticket, colección o shelving @@ -45,7 +37,5 @@ BEGIN ELSE CALL util.throw('paramNotExist'); END IF; - - COMMIT; END$$ DELIMITER ; diff --git a/db/routines/vn/procedures/shelving_setParking.sql b/db/routines/vn/procedures/shelving_setParking.sql index 0ff07ef5d..3e8717197 100644 --- a/db/routines/vn/procedures/shelving_setParking.sql +++ b/db/routines/vn/procedures/shelving_setParking.sql @@ -1,20 +1,20 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`shelving_setParking`(IN `vShelvingCode` VARCHAR(8), IN `vParkingFk` INT) -proc: BEGIN +BEGIN /** * Aparca una matrícula en un parking * * @param vShelvingCode code de la matrícula * @param vParkingFk id del parking */ - INSERT INTO vn.shelvingLog (originFk, userFk, action , description,changedModel,changedModelId) + INSERT INTO shelvingLog (originFk, userFk, action , description,changedModel,changedModelId) SELECT s.id, account.myUser_getId(), 'update', CONCAT("Cambio parking ",vShelvingCode," de ", p.code," a ", pNew.code),'Shelving',s.id FROM parking p JOIN shelving s ON s.parkingFk = p.id JOIN parking pNew ON pNew.id = vParkingFk WHERE s.code = vShelvingCode COLLATE utf8_unicode_ci; - UPDATE vn.shelving + UPDATE shelving SET parkingFk = vParkingFk, parked = util.VN_NOW(), isPrinted = TRUE diff --git a/db/routines/vn/procedures/ticket_setParking.sql b/db/routines/vn/procedures/ticket_setParking.sql index 7935e0d60..bd2a5370a 100644 --- a/db/routines/vn/procedures/ticket_setParking.sql +++ b/db/routines/vn/procedures/ticket_setParking.sql @@ -21,11 +21,6 @@ BEGIN DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; - DECLARE EXIT HANDLER FOR SQLEXCEPTION - BEGIN - RESIGNAL; - END; - INSERT INTO vn.ticketParking(ticketFk, parkingFk) SELECT IFNULL(tc2.ticketFk, t.id), vParkingFk FROM ticket t From c713c3a5c0b5dcd94e10436cf3b01cb2137f9c10 Mon Sep 17 00:00:00 2001 From: guillermo Date: Mon, 29 Jul 2024 09:21:35 +0200 Subject: [PATCH 25/39] fix: refs #6861 Unhandled error --- loopback/locale/es.json | 5 +++-- modules/item/back/methods/item-shelving/updateFromSale.js | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/loopback/locale/es.json b/loopback/locale/es.json index e2be5d013..acc3d69f6 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -367,5 +367,6 @@ "It has been invoiced but the PDF of refund not be generated": "Se ha facturado pero no se ha podido generar el PDF del abono", "Payment method is required": "El método de pago es obligatorio", "Cannot send mail": "Não é possível enviar o email", - "CONSTRAINT `supplierAccountTooShort` failed for `vn`.`supplier`": "La cuenta debe tener exactamente 10 dígitos" -} + "CONSTRAINT `supplierAccountTooShort` failed for `vn`.`supplier`": "La cuenta debe tener exactamente 10 dígitos", + "The sale not exists in the item shelving": "La venta no existe en la estantería del artículo" +} \ No newline at end of file diff --git a/modules/item/back/methods/item-shelving/updateFromSale.js b/modules/item/back/methods/item-shelving/updateFromSale.js index 2b9f49cae..167509074 100644 --- a/modules/item/back/methods/item-shelving/updateFromSale.js +++ b/modules/item/back/methods/item-shelving/updateFromSale.js @@ -1,3 +1,4 @@ +const UserError = require('vn-loopback/util/user-error'); module.exports = Self => { Self.remoteMethod('updateFromSale', { description: 'Update the visible items', @@ -32,6 +33,9 @@ module.exports = Self => { include: {relation: 'itemShelving'} }, myOptions); + if (!itemShelvingSale?.itemShelving()) + throw new UserError('The sale not exists in the item shelving'); + const itemShelving = itemShelvingSale.itemShelving(); const quantity = itemShelving.visible + itemShelvingSale.quantity; From 5264d6c9739afe1e66524ff216075f809daba008 Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 29 Jul 2024 10:35:01 +0200 Subject: [PATCH 26/39] feat(postcode_town): refs #7679 add requireds --- back/models/postcode.json | 5 +++-- back/models/town.json | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/back/models/postcode.json b/back/models/postcode.json index eadc2c86c..bad6be5d7 100644 --- a/back/models/postcode.json +++ b/back/models/postcode.json @@ -9,7 +9,8 @@ "properties": { "code": { "id": true, - "type": "string" + "type": "string", + "required": true } }, "relations": { @@ -47,4 +48,4 @@ } } } -} \ No newline at end of file +} diff --git a/back/models/town.json b/back/models/town.json index 4ad729791..e5d39314b 100644 --- a/back/models/town.json +++ b/back/models/town.json @@ -12,7 +12,8 @@ "type": "number" }, "name": { - "type": "string" + "type": "string", + "required": true } }, "relations": { @@ -54,4 +55,4 @@ "fields": ["id", "name", "provinceFk"] } } -} \ No newline at end of file +} From 254cced550a5a417e840fe844ac46250ba319ecd Mon Sep 17 00:00:00 2001 From: jorgep Date: Mon, 29 Jul 2024 13:40:30 +0200 Subject: [PATCH 27/39] chore: refs #6989 add config model --- back/model-config.json | 3 +++ back/models/config.json | 22 +++++++++++++++++++ db/routines/vn/procedures/item_getBalance.sql | 2 +- 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 back/models/config.json diff --git a/back/model-config.json b/back/model-config.json index a16fe4e8a..13c06ef54 100644 --- a/back/model-config.json +++ b/back/model-config.json @@ -28,6 +28,9 @@ "Company": { "dataSource": "vn" }, + "Config": { + "dataSource": "vn" + }, "Continent": { "dataSource": "vn" }, diff --git a/back/models/config.json b/back/models/config.json new file mode 100644 index 000000000..e5ba1f134 --- /dev/null +++ b/back/models/config.json @@ -0,0 +1,22 @@ +{ + "name": "Config", + "base": "VnModel", + "options": { + "mysql": { + "table": "config" + } + }, + "properties": { + "inventoried": { + "type": "date" + } + }, + "acls": [ + { + "accessType": "READ", + "principalType": "ROLE", + "principalId": "$authenticated", + "permission": "ALLOW" + } + ] +} \ No newline at end of file diff --git a/db/routines/vn/procedures/item_getBalance.sql b/db/routines/vn/procedures/item_getBalance.sql index 0de59b478..3a594c81c 100644 --- a/db/routines/vn/procedures/item_getBalance.sql +++ b/db/routines/vn/procedures/item_getBalance.sql @@ -240,7 +240,7 @@ BEGIN NULL reference, NULL entityType, NULL entityId, - 'Inventario calculado', + 'Inventario calculado' entityName, @a invalue, NULL `out`, @a balance, From 434dfe4ae45740e8d60f603eeae7941231c9632e Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 29 Jul 2024 15:03:40 +0200 Subject: [PATCH 28/39] fix: refs #7679 postcode filter --- back/methods/postcode/filter.js | 36 +++++++++++++++------------------ loopback/locale/en.json | 4 +++- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/back/methods/postcode/filter.js b/back/methods/postcode/filter.js index 8b0f64d97..fc7905215 100644 --- a/back/methods/postcode/filter.js +++ b/back/methods/postcode/filter.js @@ -11,13 +11,11 @@ module.exports = Self => { arg: 'filter', type: 'object', description: 'Filter defining where, order, offset, and limit - must be a JSON-encoded string', - http: {source: 'query'} }, { arg: 'search', type: 'string', description: 'Value to filter', - http: {source: 'query'} }, ], returns: { @@ -29,13 +27,11 @@ module.exports = Self => { verb: 'GET', }, }); - Self.filter = async(ctx, filter, options) => { + Self.filter = async(filter = {}, search, options) => { const myOptions = {}; if (typeof options == 'object') Object.assign(myOptions, options); - filter = ctx?.filter ?? {}; - const conn = Self.dataSource.connector; const where = buildFilter(filter?.where, (param, value) => { switch (param) { @@ -50,27 +46,27 @@ module.exports = Self => { }; } }) ?? {}; - delete ctx.filter.where; + delete filter.where; const stmts = []; let stmt; stmt = new ParameterizedSQL(` - SELECT - pc.townFk, - t.provinceFk, - p.countryFk, - pc.code, - t.name as town, - p.name as province, - c.name country - FROM - postCode pc - JOIN town t on t.id = pc.townFk - JOIN province p on p.id = t.provinceFk - JOIN country c on c.id = p.countryFk + SELECT + pc.townFk, + t.provinceFk, + p.countryFk, + pc.code, + t.name as town, + p.name as province, + c.name country + FROM + postCode pc + JOIN town t on t.id = pc.townFk + JOIN province p on p.id = t.provinceFk + JOIN country c on c.id = p.countryFk `); - stmt.merge(conn.makeSuffix({where, ...ctx})); + stmt.merge(conn.makeSuffix({where})); const itemsIndex = stmts.push(stmt) - 1; const sql = ParameterizedSQL.join(stmts, ';'); diff --git a/loopback/locale/en.json b/loopback/locale/en.json index 382a2824c..06538a524 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -233,5 +233,7 @@ "It has been invoiced but the PDF could not be generated": "It has been invoiced but the PDF could not be generated", "It has been invoiced but the PDF of refund not be generated": "It has been invoiced but the PDF of refund not be generated", "Cannot add holidays on this day": "Cannot add holidays on this day", - "Cannot send mail": "Cannot send mail" + "Cannot send mail": "Cannot send mail", + "CONSTRAINT `chkParkingCodeFormat` failed for `vn`.`parking`": "CONSTRAINT `chkParkingCodeFormat` failed for `vn`.`parking`", + "This postcode already exists": "This postcode already exists" } \ No newline at end of file From 6c1de1d6bd85802bcd2ed273fc1a489831d6c1fe Mon Sep 17 00:00:00 2001 From: carlossa Date: Tue, 30 Jul 2024 07:55:14 +0200 Subject: [PATCH 29/39] refs #7801 frenchGoLabel --- .../email/printer-setup/locale/fr.yml | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 print/templates/email/printer-setup/locale/fr.yml diff --git a/print/templates/email/printer-setup/locale/fr.yml b/print/templates/email/printer-setup/locale/fr.yml new file mode 100644 index 000000000..0c9f7031a --- /dev/null +++ b/print/templates/email/printer-setup/locale/fr.yml @@ -0,0 +1,39 @@ +subject: Instalation et configuration de l'imprimante +title: "Merci pour votre confiance !" +description: + dear: Cher client + instructions: Veuillez suivre les instructions spécifiées dans cet e-mail pour procéder à l'installation de l'imprimante. + followGuide: Vous pouvez utiliser comme guide la vidéo du montage du ruban et de la bande. + https://www.youtube.com/watch?v=qhb0kgQF3o8. Vous + aurez également besoin de GoLabel, le programme pour imprimer les bandes. + downloadFrom: Vous pouvez le télécharger depuis ce lien. https://cdn.verdnatura.es/public/GoLabel.zip + downloadDriver: Vous pouvez télécharger le pilote de l'imprimante depuis ce lien. https://es.seagullscientific.com/support/downloads/drivers/godex/download/ +sections: + GoLabel: + title: Utilisation de GoLabel + description: Pour utiliser le programme d'impression des bandes, suivez ces étapes + steps: + - Ci-joint à cet e-mail, vous trouverez le fichier 'model.ezp' (le modèle de bandes de corona standard). Téléchargez-le et vous le trouverez probablement dans le dossier 'Téléchargements'. + - Ouvrez le programme GoLabel. + - Cliquez sur l'icône de la barre supérieure en forme de dossier avec une feuille. + - Sélectionnez le fichier nommé 'model.ezp' (qui se trouve probablement dans 'Téléchargements'), puis cliquez sur Ouvrir. + - Une fois le fichier ouvert, double-cliquez sur le texte. Dans la boîte qui s'ouvre, cliquez sur le texte d'exemple (dans ce cas "TUS HERMANOS") et il apparaîtra dans la même zone à gauche pour que vous puissiez l'éditer et écrire ce que vous souhaitez. + - Lorsque vous avez le texte souhaité, cliquez sur le bouton 'OK'. + - Allez dans 'Fichier' → 'Enregistrer sous' et enregistrez-le sur le bureau sous un autre nom. + - Ensuite, pour imprimer, vous devez d'abord configurer l'imprimante. + - Cliquez sur la huitième icône de la barre supérieure, qui sera ici une imprimante avec un engrenage orange. + - Une fois là, cliquez sur le menu déroulant du modèle d'imprimante et choisissez le modèle qui correspond au vôtre 'G***'. + - Cliquez sur 'Enregistrer' et notre imprimante sera configurée et prête. + - Et enfin, pour imprimer, cliquez sur la neuvième icône, qui correspond à une imprimante bleue. + help: + title: "Avez-vous besoin d'aide ?" + description: Si vous avez besoin d'aide, téléchargez notre programme de support afin que nous puissions nous connecter à distance à votre ordinateur et effectuer l'installation. Veuillez nous fournir un horaire de contact pour vous assister, et nous vous contacterons. + remoteSupport: Vous pouvez télécharger le programme depuis ce lien. http://soporte.verdnatura.es. +help: Pour toute question que vous pourriez avoir, n'hésitez pas à nous la poser. Nous sommes là pour vous aider ! +salesPersonName: Je suis votre commercial et mon nom est +salesPersonPhone: Téléphone et WhatsApp. +salesPersonEmail: Adresse e-mail. From fcd26784bfb60dae6fcbf44677beae279acad9fc Mon Sep 17 00:00:00 2001 From: alexm Date: Tue, 30 Jul 2024 08:37:35 +0200 Subject: [PATCH 30/39] build: init version 2434 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9016f74a6..261b877dd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "salix-back", - "version": "24.32.0", + "version": "24.34.0", "author": "Verdnatura Levante SL", "description": "Salix backend", "license": "GPL-3.0", From dbe0f4497c880fafde27066d5ba70991b59c381f Mon Sep 17 00:00:00 2001 From: alexm Date: Tue, 30 Jul 2024 08:59:03 +0200 Subject: [PATCH 31/39] fix(postcode_filter): add limit --- back/methods/postcode/filter.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/back/methods/postcode/filter.js b/back/methods/postcode/filter.js index fc7905215..37cc0c148 100644 --- a/back/methods/postcode/filter.js +++ b/back/methods/postcode/filter.js @@ -67,10 +67,12 @@ module.exports = Self => { `); stmt.merge(conn.makeSuffix({where})); + 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]; }; }; From 2ac8760061506f713e5e4fbde9e9f0bfb6e86560 Mon Sep 17 00:00:00 2001 From: alexm Date: Tue, 30 Jul 2024 10:13:32 +0200 Subject: [PATCH 32/39] test: fix postcode filter back test --- back/methods/postcode/filter.js | 7 +-- back/methods/postcode/specs/filter.spec.js | 57 ++++++++-------------- 2 files changed, 20 insertions(+), 44 deletions(-) diff --git a/back/methods/postcode/filter.js b/back/methods/postcode/filter.js index 37cc0c148..f350b1ea9 100644 --- a/back/methods/postcode/filter.js +++ b/back/methods/postcode/filter.js @@ -12,11 +12,6 @@ module.exports = Self => { type: 'object', description: 'Filter defining where, order, offset, and limit - must be a JSON-encoded string', }, - { - arg: 'search', - type: 'string', - description: 'Value to filter', - }, ], returns: { type: ['object'], @@ -27,7 +22,7 @@ module.exports = Self => { verb: 'GET', }, }); - Self.filter = async(filter = {}, search, options) => { + Self.filter = async(filter = {}, options) => { const myOptions = {}; if (typeof options == 'object') Object.assign(myOptions, options); diff --git a/back/methods/postcode/specs/filter.spec.js b/back/methods/postcode/specs/filter.spec.js index 60ac24809..391b1e196 100644 --- a/back/methods/postcode/specs/filter.spec.js +++ b/back/methods/postcode/specs/filter.spec.js @@ -1,17 +1,14 @@ const {models} = require('vn-loopback/server/server'); -describe('Postcode filter()', () => { +fdescribe('Postcode filter()', () => { it('should retrieve with no filter', async() => { const tx = await models.Postcode.beginTransaction({}); const options = {transaction: tx}; try { - const ctx = { - filter: { - }, + const results = await models.Postcode.filter({ limit: 1 - }; - const results = await models.Postcode.filter(ctx, options); + }, options); expect(results.length).toEqual(1); await tx.rollback(); @@ -26,14 +23,11 @@ describe('Postcode filter()', () => { const options = {transaction: tx}; try { - const ctx = { - filter: { - where: { - search: 46, - } - }, - }; - const results = await models.Postcode.filter(ctx, options); + const results = await models.Postcode.filter({ + where: { + search: 46, + } + }, options); expect(results.length).toEqual(4); await tx.rollback(); @@ -48,14 +42,9 @@ describe('Postcode filter()', () => { const options = {transaction: tx}; try { - const ctx = { - filter: { - where: { - search: 'Alz', - } - }, - }; - const results = await models.Postcode.filter(ctx, options); + const results = await models.Postcode.filter({where: { + search: 'Alz', + }}, options); expect(results.length).toEqual(1); await tx.rollback(); @@ -70,14 +59,9 @@ describe('Postcode filter()', () => { const options = {transaction: tx}; try { - const ctx = { - filter: { - where: { - search: 'one', - } - }, - }; - const results = await models.Postcode.filter(ctx, options); + const results = await models.Postcode.filter({where: { + search: 'one', + }}, options); expect(results.length).toEqual(4); await tx.rollback(); @@ -92,14 +76,11 @@ describe('Postcode filter()', () => { const options = {transaction: tx}; try { - const ctx = { - filter: { - where: { - search: 'Ec', - } - }, - }; - const results = await models.Postcode.filter(ctx, options); + const results = await models.Postcode.filter({ + where: { + search: 'Ec', + } + }, options); expect(results.length).toEqual(1); await tx.rollback(); From b17b5a1b21955ae12d517fb208f0ad094473a42f Mon Sep 17 00:00:00 2001 From: alexm Date: Tue, 30 Jul 2024 10:15:09 +0200 Subject: [PATCH 33/39] test: fix postcode filter back test --- back/methods/postcode/specs/filter.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/back/methods/postcode/specs/filter.spec.js b/back/methods/postcode/specs/filter.spec.js index 391b1e196..abf450a19 100644 --- a/back/methods/postcode/specs/filter.spec.js +++ b/back/methods/postcode/specs/filter.spec.js @@ -1,6 +1,6 @@ const {models} = require('vn-loopback/server/server'); -fdescribe('Postcode filter()', () => { +describe('Postcode filter()', () => { it('should retrieve with no filter', async() => { const tx = await models.Postcode.beginTransaction({}); const options = {transaction: tx}; From 1f80117ff749021ca6ae5070986c78f122337b99 Mon Sep 17 00:00:00 2001 From: guillermo Date: Tue, 30 Jul 2024 10:24:50 +0200 Subject: [PATCH 34/39] fix: refs #6861 Column --- db/routines/vn/procedures/itemShelvingSale_setQuantity.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/routines/vn/procedures/itemShelvingSale_setQuantity.sql b/db/routines/vn/procedures/itemShelvingSale_setQuantity.sql index 30abefec8..9d21e6a6f 100644 --- a/db/routines/vn/procedures/itemShelvingSale_setQuantity.sql +++ b/db/routines/vn/procedures/itemShelvingSale_setQuantity.sql @@ -103,7 +103,7 @@ BEGIN COMMIT; IF vIsItemShelvingSaleEmpty AND vQuantity <> vReservedQuantity THEN - INSERT INTO itemShelvingSaleReserve (saleFk, vSectorFk) + INSERT INTO itemShelvingSaleReserve (saleFk, sectorFk) SELECT vSaleFk, vSectorFk; CALL itemShelvingSale_reallocate(vItemShelvingFk, vItemFk, vSectorFk); END IF; From 01562420d4861b6c392a7209c92cc5ab9b6d1955 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Tue, 30 Jul 2024 10:14:15 +0000 Subject: [PATCH 35/39] Actualizar db/routines/vn/procedures/itemShelvingSale_reallocate.sql --- .../itemShelvingSale_reallocate.sql | 108 +++++++++--------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/db/routines/vn/procedures/itemShelvingSale_reallocate.sql b/db/routines/vn/procedures/itemShelvingSale_reallocate.sql index a60287caa..0ce4440e6 100644 --- a/db/routines/vn/procedures/itemShelvingSale_reallocate.sql +++ b/db/routines/vn/procedures/itemShelvingSale_reallocate.sql @@ -1,55 +1,55 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemShelvingSale_reallocate`( - vItemShelvingFk INT(10), - vItemFk INT(10), - vSectorFk INT -) -BEGIN -/** - * Elimina reservas de un itemShelving e intenta reservar en otra ubicación - * - * @param vItemShelvingFk Id itemShelving - * @param vItemFk Id del artículo - * @param vSectorFk Id del sector - */ - DECLARE EXIT HANDLER FOR SQLEXCEPTION - BEGIN - ROLLBACK; - RESIGNAL; - END; - - START TRANSACTION; - - UPDATE itemShelving - SET visible = 0, - available = 0 - WHERE id = vItemShelvingFk - AND itemFk = vItemFk; - - SELECT iss.id - FROM itemShelvingSale iss - JOIN itemShelving ish ON ish.id = iss.itemShelvingFk - WHERE iss.itemShelvingFk = vItemShelvingFk - AND iss.itemFk = vItemFk - AND NOT iss.isPicked - FOR UPDATE; - - INSERT INTO itemShelvingSaleReserve (saleFk, vSectorFk) - SELECT DISTINCT iss.saleFk - FROM itemShelvingSale iss - JOIN itemShelving ish ON ish.id = iss.itemShelvingFk - WHERE iss.itemShelvingFk = vItemShelvingFk - AND ish.itemFk = vItemFk - AND NOT iss.isPicked; - - DELETE iss - FROM itemShelvingSale iss - JOIN itemShelving ish ON ish.id = iss.itemShelvingFk - WHERE iss.itemShelvingFk = vItemShelvingFk - AND ish.itemFk = vItemFk - AND NOT iss.isPicked; - COMMIT; - - CALL itemShelvingSale_doReserve(); -END$$ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemShelvingSale_reallocate`( + vItemShelvingFk INT(10), + vItemFk INT(10), + vSectorFk INT +) +BEGIN +/** + * Elimina reservas de un itemShelving e intenta reservar en otra ubicación + * + * @param vItemShelvingFk Id itemShelving + * @param vItemFk Id del artículo + * @param vSectorFk Id del sector + */ + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK; + RESIGNAL; + END; + + START TRANSACTION; + + UPDATE itemShelving + SET visible = 0, + available = 0 + WHERE id = vItemShelvingFk + AND itemFk = vItemFk; + + SELECT iss.id + FROM itemShelvingSale iss + JOIN itemShelving ish ON ish.id = iss.itemShelvingFk + WHERE iss.itemShelvingFk = vItemShelvingFk + AND iss.itemFk = vItemFk + AND NOT iss.isPicked + FOR UPDATE; + + INSERT INTO itemShelvingSaleReserve (saleFk, sectorFk) + SELECT DISTINCT iss.saleFk, vSectorFk + FROM itemShelvingSale iss + JOIN itemShelving ish ON ish.id = iss.itemShelvingFk + WHERE iss.itemShelvingFk = vItemShelvingFk + AND ish.itemFk = vItemFk + AND NOT iss.isPicked; + + DELETE iss + FROM itemShelvingSale iss + JOIN itemShelving ish ON ish.id = iss.itemShelvingFk + WHERE iss.itemShelvingFk = vItemShelvingFk + AND ish.itemFk = vItemFk + AND NOT iss.isPicked; + COMMIT; + + CALL itemShelvingSale_doReserve(); +END$$ DELIMITER ; \ No newline at end of file From 2015256f5d6a3416eb903d7e0f6b8e82af5ac5f6 Mon Sep 17 00:00:00 2001 From: sergiodt Date: Tue, 30 Jul 2024 12:38:13 +0200 Subject: [PATCH 36/39] hotFix reallocate resfs #6861 --- db/versions/11177-crimsonPaniculata/00-firstScript.sql | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 db/versions/11177-crimsonPaniculata/00-firstScript.sql diff --git a/db/versions/11177-crimsonPaniculata/00-firstScript.sql b/db/versions/11177-crimsonPaniculata/00-firstScript.sql new file mode 100644 index 000000000..79bcf1291 --- /dev/null +++ b/db/versions/11177-crimsonPaniculata/00-firstScript.sql @@ -0,0 +1,6 @@ +-- Place your SQL code here + +ALTER TABLE vn.itemShelvingSaleReserve DROP FOREIGN KEY IF EXISTS itemShelvingSaleReserve_sector_FK; + +ALTER TABLE vn.itemShelvingSaleReserve ADD CONSTRAINT itemShelvingSaleReserve_sector_FK + FOREIGN KEY IF NOT EXISTS (sectorFk) REFERENCES vn.sector(id) ON DELETE RESTRICT ON UPDATE CASCADE; \ No newline at end of file From 9e486e4affa8593546602921ef393a18caf7533e Mon Sep 17 00:00:00 2001 From: sergiodt Date: Tue, 30 Jul 2024 13:04:33 +0200 Subject: [PATCH 37/39] hotFix reallocate iss refs #6861 --- db/routines/vn/procedures/itemShelvingSale_reallocate.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/routines/vn/procedures/itemShelvingSale_reallocate.sql b/db/routines/vn/procedures/itemShelvingSale_reallocate.sql index 0ce4440e6..d5b89c373 100644 --- a/db/routines/vn/procedures/itemShelvingSale_reallocate.sql +++ b/db/routines/vn/procedures/itemShelvingSale_reallocate.sql @@ -30,7 +30,7 @@ BEGIN FROM itemShelvingSale iss JOIN itemShelving ish ON ish.id = iss.itemShelvingFk WHERE iss.itemShelvingFk = vItemShelvingFk - AND iss.itemFk = vItemFk + AND ish.itemFk = vItemFk AND NOT iss.isPicked FOR UPDATE; From 80ad1f30af043ff4e20881fae72526add266d680 Mon Sep 17 00:00:00 2001 From: guillermo Date: Tue, 30 Jul 2024 13:50:47 +0200 Subject: [PATCH 38/39] fix: refs #7811 Variables pm2 --- back/process.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/back/process.yml b/back/process.yml index a29323240..08fee7a93 100644 --- a/back/process.yml +++ b/back/process.yml @@ -2,6 +2,5 @@ apps: - script: ./loopback/server/server.js name: salix-back instances: 1 - max_restarts: 3 - restart_delay: 15000 + max_restarts: 0 node_args: --tls-min-v1.0 --openssl-legacy-provider From d97aba8e10127c2522d30f87d1b7294e55fdf22d Mon Sep 17 00:00:00 2001 From: sergiodt Date: Tue, 30 Jul 2024 17:28:55 +0200 Subject: [PATCH 39/39] hotFix getTickets refs #6861 --- back/methods/collection/getTickets.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/back/methods/collection/getTickets.js b/back/methods/collection/getTickets.js index b79dbc93a..2a2b67524 100644 --- a/back/methods/collection/getTickets.js +++ b/back/methods/collection/getTickets.js @@ -57,8 +57,10 @@ module.exports = Self => { ROW_NUMBER () OVER (PARTITION BY s.id ORDER BY pickingOrder) currentItemShelving, COUNT(*) OVER (PARTITION BY s.id ORDER BY s.id) totalItemShelving, sh.code, - IFNULL(p2.code, p.code) parkingCode, - IFNULL(p2.pickingOrder, p.pickingOrder) pickingOrder, + p2.code parkingCode, + p2.pickingOrder pickingOrder, + p.code parkingCodePrevia, + p.pickingOrder pickingOrderPrevia, iss.id itemShelvingSaleFk, iss.isPicked FROM ticketCollection tc @@ -95,8 +97,10 @@ module.exports = Self => { ROW_NUMBER () OVER (PARTITION BY s.id ORDER BY p.pickingOrder), COUNT(*) OVER (PARTITION BY s.id ORDER BY s.id) , sh.code, - IFNULL(p2.code, p.code), - IFNULL(p2.pickingOrder, p.pickingOrder), + p2.code, + p2.pickingOrder, + p.code, + p.pickingOrder, iss.id itemShelvingSaleFk, iss.isPicked FROM sectorCollection sc