From aaef10b8d8de3ef3d32563d71c5a103a941a7ddc Mon Sep 17 00:00:00 2001 From: pablone Date: Fri, 12 Apr 2024 08:48:29 +0200 Subject: [PATCH 01/18] feat(collection-label): refs #6602 add qr to the report --- .../10991-greenAsparagus/00-firstScript.sql | 2 ++ .../reports/collection-label/collection-label.html | 6 +++++- .../reports/collection-label/collection-label.js | 14 +++++++++++++- .../reports/collection-label/sql/labelsData.sql | 3 ++- 4 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 db/versions/10991-greenAsparagus/00-firstScript.sql diff --git a/db/versions/10991-greenAsparagus/00-firstScript.sql b/db/versions/10991-greenAsparagus/00-firstScript.sql new file mode 100644 index 000000000..9cfc9e19d --- /dev/null +++ b/db/versions/10991-greenAsparagus/00-firstScript.sql @@ -0,0 +1,2 @@ +ALTER TABLE vn.productionConfig MODIFY COLUMN id INT(10) UNSIGNED FIRST; +ALTER TABLE vn.productionConfig ADD scannableCodeType enum('qr','barcode') DEFAULT 'barcode' NOT NULL; diff --git a/print/templates/reports/collection-label/collection-label.html b/print/templates/reports/collection-label/collection-label.html index a0bfcad0e..f313fccc4 100644 --- a/print/templates/reports/collection-label/collection-label.html +++ b/print/templates/reports/collection-label/collection-label.html @@ -10,7 +10,11 @@ {{labelData.shipped || '---'}} - + +
+ {{labelData.workerCode || '---'}} + +
{{labelData.workerCode || '---'}} diff --git a/print/templates/reports/collection-label/collection-label.js b/print/templates/reports/collection-label/collection-label.js index db2adeb34..faf6792f9 100644 --- a/print/templates/reports/collection-label/collection-label.js +++ b/print/templates/reports/collection-label/collection-label.js @@ -1,4 +1,6 @@ -const jsBarcode = require('jsbarcode'); +import qrcode from 'qrcode'; +import jsBarcode from 'jsbarcode'; + const {DOMImplementation, XMLSerializer} = require('xmldom'); const vnReport = require('../../../core/mixins/vn-report.js'); @@ -31,6 +33,16 @@ module.exports = { this.checkMainEntity(this.labelsData); }, methods: { + getQR(id) { + let QRdata = JSON.stringify({ + company: 'vnl', + user: this.userFk, + created: Date.vnNew(), + table: 'ticket', + id + }); + return qrcode.toDataURL(QRdata, {margin: 0}); + }, getBarcode(id) { const xmlSerializer = new XMLSerializer(); const document = new DOMImplementation().createDocument('http://www.w3.org/1999/xhtml', 'html', null); diff --git a/print/templates/reports/collection-label/sql/labelsData.sql b/print/templates/reports/collection-label/sql/labelsData.sql index 61990812d..a83381b1f 100644 --- a/print/templates/reports/collection-label/sql/labelsData.sql +++ b/print/templates/reports/collection-label/sql/labelsData.sql @@ -17,7 +17,8 @@ SELECT c.itemPackingTypeFk code, tt.labelCount, t.nickName, SUM(IF(sgd.id IS NULL, 1, 0)) + IF(sgd.id , 1, 0) lineCount, - rm.routeFk + rm.routeFk, + pc.scannableCodeType FROM vn.ticket t JOIN vn.ticketCollection tc ON tc.ticketFk = t.id JOIN vn.collection c ON c.id = tc.collectionFk From 7e488ee601bb989ef6298caed17f3bd3dcf20330 Mon Sep 17 00:00:00 2001 From: ivanm Date: Thu, 18 Apr 2024 16:09:05 +0200 Subject: [PATCH 02/18] refs #7191 check isBooked in entry_BeforeUpdate --- db/routines/vn/triggers/entry_beforeUpdate.sql | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/db/routines/vn/triggers/entry_beforeUpdate.sql b/db/routines/vn/triggers/entry_beforeUpdate.sql index 98ebe1364..afe1a25be 100644 --- a/db/routines/vn/triggers/entry_beforeUpdate.sql +++ b/db/routines/vn/triggers/entry_beforeUpdate.sql @@ -6,11 +6,20 @@ BEGIN DECLARE vIsVirtual BOOL; DECLARE vPrintedCount INT; DECLARE vHasDistinctWarehouses BOOL; + DECLARE vEntryFkCount INT; IF NEW.isBooked = OLD.isBooked THEN CALL entry_checkBooked(OLD.id); END IF; + IF NEW.isBooked = 1 THEN + SELECT COUNT(*) INTO vEntryFkCount + FROM buy WHERE entryFk = NEW.id; + IF vEntryFkCount = 0 THEN + CALL util.throw('The entry cannot be marked as booked if it does not have lines'); + END IF; + END IF; + SET NEW.editorFk = account.myUser_getId(); IF NOT (NEW.travelFk <=> OLD.travelFk) THEN From 27d59f4a8f7ceb8eb17284483d2110fb83eef0fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Thu, 18 Apr 2024 19:12:24 +0200 Subject: [PATCH 03/18] fix: descuentos en bs.ventas refs #6974 --- db/routines/bi/procedures/comparativa_add.sql | 32 ----------- .../bi/procedures/comparativa_add_manual.sql | 40 ------------- db/routines/bs/procedures/ventas_add.sql | 52 +++++++++-------- .../11001-blackPalmetto/00-firstScript.sql | 56 +++++++++++++++++++ 4 files changed, 84 insertions(+), 96 deletions(-) delete mode 100644 db/routines/bi/procedures/comparativa_add.sql delete mode 100644 db/routines/bi/procedures/comparativa_add_manual.sql create mode 100644 db/versions/11001-blackPalmetto/00-firstScript.sql diff --git a/db/routines/bi/procedures/comparativa_add.sql b/db/routines/bi/procedures/comparativa_add.sql deleted file mode 100644 index 4297c8aff..000000000 --- a/db/routines/bi/procedures/comparativa_add.sql +++ /dev/null @@ -1,32 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bi`.`comparativa_add`() -BEGIN - DECLARE lastCOMP INT; # Se trata de una variable para almacenar el ultimo valor del Periodo - DECLARE vMaxPeriod INT; - DECLARE vMaxWeek INT; - - SELECT t.period, t.`week` INTO vMaxPeriod, vMaxWeek - FROM vn.`time` t - WHERE t.dated = util.VN_CURDATE(); - - SELECT MAX(Periodo) INTO lastCOMP FROM vn2008.Comparativa; - -- Fijaremos las ventas con más de un mes de antiguedad en la tabla Comparativa - - IF lastCOMP < vMaxPeriod - 3 AND vMaxWeek > 3 THEN - - REPLACE vn2008.Comparativa(Periodo, Id_Article, warehouse_id, Cantidad,price) - SELECT tm.period as Periodo, m.Id_Article, t.warehouse_id, sum(m.Cantidad), sum(v.importe) - FROM bs.ventas v - JOIN vn2008.time tm ON tm.date = v.fecha - JOIN vn2008.Movimientos m ON m.Id_Movimiento = v.Id_Movimiento - JOIN vn2008.Tipos tp ON tp.tipo_id = v.tipo_id - JOIN vn2008.reinos r ON r.id = tp.reino_id - JOIN vn2008.Tickets t ON t.Id_Ticket = m.Id_Ticket - WHERE tm.period BETWEEN lastCOMP AND vMaxPeriod - 3 - AND t.Id_Cliente NOT IN(400,200) - AND t.warehouse_id NOT IN (0,13) - GROUP BY m.Id_Article, Periodo, t.warehouse_id; - - END IF; -END$$ -DELIMITER ; diff --git a/db/routines/bi/procedures/comparativa_add_manual.sql b/db/routines/bi/procedures/comparativa_add_manual.sql deleted file mode 100644 index 281e15b23..000000000 --- a/db/routines/bi/procedures/comparativa_add_manual.sql +++ /dev/null @@ -1,40 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bi`.`comparativa_add_manual`(IN vStarted DATE, IN vEnded DATE) -BEGIN -/** - * Recalcula la tabla Comparativa para dos valores dados - * - * @param vStarted fecha desde - * @param vEnded fecha hasta - */ - - DECLARE periodStart INT; - DECLARE periodEnd INT; - - -- Seleccionamos la fecha minima/maxima del periodo que vamos a consultar - - SELECT t.period INTO periodStart - FROM vn.`time` t - WHERE t.dated = vStarted; - - SELECT t.period INTO periodEnd - FROM vn.`time` t - WHERE t.dated = vEnded; - - DELETE FROM vn2008.Comparativa - WHERE Periodo BETWEEN periodStart AND periodEnd; - - INSERT INTO vn2008.Comparativa(Periodo, Id_Article, warehouse_id, Cantidad,price) - SELECT tm.period as Periodo, m.Id_Article, t.warehouse_id, sum(m.Cantidad), sum(v.importe) - FROM bs.ventas v - JOIN vn2008.time tm ON tm.date = v.fecha - JOIN vn2008.Movimientos m ON m.Id_Movimiento = v.Id_Movimiento - JOIN vn2008.Tipos tp ON tp.tipo_id = v.tipo_id - JOIN vn2008.reinos r ON r.id = tp.reino_id - JOIN vn2008.Tickets t ON t.Id_Ticket = m.Id_Ticket - WHERE tm.period BETWEEN periodStart AND periodEnd - AND t.Id_Cliente NOT IN(400,200) - AND t.warehouse_id NOT IN (0,13) - GROUP BY m.Id_Article, Periodo, t.warehouse_id; -END$$ -DELIMITER ; diff --git a/db/routines/bs/procedures/ventas_add.sql b/db/routines/bs/procedures/ventas_add.sql index fcb00e092..0c8f636e3 100644 --- a/db/routines/bs/procedures/ventas_add.sql +++ b/db/routines/bs/procedures/ventas_add.sql @@ -29,30 +29,34 @@ BEGIN WHILE vEndingDate <= vEnded DO - REPLACE ventas(Id_Movimiento, importe, recargo, fecha, tipo_id, Id_Cliente, empresa_id) - SELECT saleFk, - SUM(IF(ct.isBase, s.quantity * sc.value, 0)) importe, - SUM(IF(ct.isBase, 0, s.quantity * sc.value)) recargo, - vStartingDate, - i.typeFk, - a.clientFk, - t.companyFk - FROM vn.saleComponent sc - JOIN vn.component c ON c.id = sc.componentFk - JOIN vn.componentType ct ON ct.id = c.typeFk - JOIN vn.sale s ON s.id = sc.saleFk - JOIN vn.item i ON i.id = s.itemFk - JOIN vn.itemType it ON it.id = i.typeFk - JOIN vn.itemCategory ic ON ic.id = it.categoryFk - JOIN vn.ticket t ON t.id = s.ticketFk - JOIN vn.address a ON a.id = t.addressFk - JOIN vn.client cl ON cl.id = a.clientFk - WHERE t.shipped BETWEEN vStartingDate AND vEndingDate - AND s.quantity <> 0 - AND s.discount <> 100 - AND ic.merchandise - GROUP BY sc.saleFk - HAVING IFNULL(importe,0) <> 0 OR IFNULL(recargo,0) <> 0; + REPLACE ventas(Id_Movimiento, + importe, + recargo, + fecha, + tipo_id, + Id_Cliente, + empresa_id + )SELECT saleFk, + IFNULL(SUM(IF(ct.isBase, s.quantity * sc.value, 0)), 0) importe, + IFNULL(SUM(IF(ct.isBase, 0, s.quantity * sc.value)), 0) recargo, + vStartingDate, + i.typeFk, + a.clientFk, + t.companyFk + FROM vn.saleComponent sc + JOIN vn.component c ON c.id = sc.componentFk + JOIN vn.componentType ct ON ct.id = c.typeFk + JOIN vn.sale s ON s.id = sc.saleFk + JOIN vn.item i ON i.id = s.itemFk + JOIN vn.itemType it ON it.id = i.typeFk + JOIN vn.itemCategory ic ON ic.id = it.categoryFk + JOIN vn.ticket t ON t.id = s.ticketFk + JOIN vn.address a ON a.id = t.addressFk + JOIN vn.client cl ON cl.id = a.clientFk + WHERE t.shipped BETWEEN vStartingDate AND vEndingDate + AND s.quantity <> 0 + AND ic.merchandise + GROUP BY sc.saleFk; UPDATE sale s JOIN ( diff --git a/db/versions/11001-blackPalmetto/00-firstScript.sql b/db/versions/11001-blackPalmetto/00-firstScript.sql new file mode 100644 index 000000000..b2a032265 --- /dev/null +++ b/db/versions/11001-blackPalmetto/00-firstScript.sql @@ -0,0 +1,56 @@ + UPDATE vn.componentType + SET isBase = 1 + WHERE code = 'MANA'; + + CREATE OR REPLACE TEMPORARY TABLE tmp.discountSale + (PRIMARY KEY (saleFk)) + SELECT bs.saleFk, + bs.amount, + s.discount, + SUM(IF(ct.isBase, s.quantity * sc.value, 0)) importe, + SUM(IF(ct.isBase, 0, s.quantity * sc.value)) recargo + FROM bs.sale bs + JOIN vn.sale s ON s.id = bs.saleFk + JOIN vn.saleComponent sc ON sc.saleFk = s.id + JOIN vn.component c ON c.id = sc.componentFk + JOIN vn.componentType ct ON ct.id = c.typeFk + WHERE s.discount + GROUP BY bs.saleFk; + UPDATE bs.sale bs + JOIN tmp.discountSale ts ON ts.saleFk = bs.saleFk + SET bs.amount = ts.importe + bs.surcharge = ts.recargo; + + DROP TEMPORARY TABLE tmp.discountSale; + + DELETE FROM comparative + WHERE timePeriod BETWEEN '202101' AND '202409'; + + INSERT INTO comparative( + timePeriod, + itemFk, + warehouseFk, + quantity, + price, + countryFk + ) + SELECT tm.period, + s.itemFk, + t.warehouseFk, + sum(s.quantity), + sum(v.importe), + p.countryFk + FROM bs.ventas v + JOIN time tm ON tm.dated = v.fecha + JOIN sale s ON s.id = v.Id_Movimiento + JOIN itemType tp ON tp.id = v.tipo_id + JOIN itemCategory ic ON ic.id = tp.categoryFk + JOIN ticket t ON t.id = s.ticketFk + JOIN client c ON c.id = t.clientFk + JOIN warehouse w ON w.id = t.warehouseFk + JOIN address ad ON ad.id = t.addressFk + LEFT JOIN province p ON p.id = ad.provinceFk + WHERE tm.period BETWEEN '202101' AND '202409' + AND c.typeFk <> 'loses' + AND NOT w.code = 'inv' + GROUP BY p.countryFk, s.itemFk, tm.period, t.warehouseFk; From fd903f27c06cd9f3cbf3d2d9af91f2e80c81026e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Sun, 21 Apr 2024 16:01:32 +0200 Subject: [PATCH 04/18] fix: descuentos en bs.ventas refs #6974 --- db/routines/bs/procedures/sale_add.sql | 72 ++++++++++++++++ db/routines/bs/procedures/ventas_add.sql | 82 ------------------- .../bs/procedures/ventas_add_launcher.sql | 5 +- .../11001-blackPalmetto/00-firstScript.sql | 56 ------------- 4 files changed, 74 insertions(+), 141 deletions(-) create mode 100644 db/routines/bs/procedures/sale_add.sql delete mode 100644 db/routines/bs/procedures/ventas_add.sql diff --git a/db/routines/bs/procedures/sale_add.sql b/db/routines/bs/procedures/sale_add.sql new file mode 100644 index 000000000..e9f91740f --- /dev/null +++ b/db/routines/bs/procedures/sale_add.sql @@ -0,0 +1,72 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`sale_add`( + IN vStarted DATE, + IN vEnded DATE) +BEGIN +/** + * Añade las ventas que se realizaron entre 2 fechas a la tabla bs.sale + * + * @param vStarted Fecha de inicio + * @param vEnded Fecha de fin + * + */ + DECLARE vLoopDate DATE; + DECLARE vLoopDateTime DATETIME; + + IF vStarted < (util.VN_CURDATE() - INTERVAL 5 YEAR) OR vStarted > vEnded THEN + CALL util.throw('Wrong date'); + END IF; + + SET vLoopDate = vStarted; + + DELETE FROM sale + WHERE dated BETWEEN vStarted AND vEnded; + + WHILE vLoopDate <= vEnded DO + SET vLoopDateTime = util.dayEnd(vLoopDate); + + REPLACE sale( + saleFk, + amount, + surcharge, + dated, + typeFk, + clientFk, + companyFk, + margin + )WITH calculated AS( + SELECT s.id saleFk, + SUM(IF(ct.isBase, s.quantity * sc.value, 0)) amount, + SUM(IF(ct.isBase, 0, s.quantity * sc.value)) surcharge, + s.total pvp, + DATE(t.shipped) dated, + i.typeFk, + t.clientFk, + t.companyFk, + SUM(IF(ct.isMargin, s.quantity * sc.value, 0 )) marginComponents + FROM vn.ticket t + STRAIGHT_JOIN vn.sale s ON s.ticketFk = t.id + JOIN vn.item i ON i.id = s.itemFk + JOIN vn.itemType it ON it.id = i.typeFk + JOIN vn.itemCategory ic ON ic.id = it.categoryFk + JOIN vn.saleComponent sc ON sc.saleFk = s.id + JOIN vn.component c ON c.id = sc.componentFk + JOIN vn.componentType ct ON ct.id = c.typeFk + WHERE t.shipped BETWEEN vLoopDate AND vLoopDateTime + AND s.quantity <> 0 + AND ic.merchandise + GROUP BY s.id + )SELECT saleFk, + amount, + surcharge, + dated, + typeFk, + clientFk, + companyFk, + marginComponents + amount + surcharge - pvp + FROM calculated; + + SET vLoopDate = vLoopDate + INTERVAL 1 DAY; + END WHILE; +END$$ +DELIMITER ; diff --git a/db/routines/bs/procedures/ventas_add.sql b/db/routines/bs/procedures/ventas_add.sql deleted file mode 100644 index 0c8f636e3..000000000 --- a/db/routines/bs/procedures/ventas_add.sql +++ /dev/null @@ -1,82 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`ventas_add`( - IN vStarted DATETIME, - IN vEnded DATETIME) -BEGIN -/** -* Añade las ventas que se realizaron entre -* vStarted y vEnded -* -* @param vStarted Fecha de inicio -* @param vEnded Fecha de finalizacion -* -**/ - DECLARE vStartingDate DATETIME; - DECLARE vEndingDate DATETIME; - - IF vStarted < TIMESTAMPADD(YEAR,-5,util.VN_CURDATE()) - OR vEnded < TIMESTAMPADD(YEAR,-5,util.VN_CURDATE()) THEN - CALL util.throw('fechaDemasiadoAntigua'); - END IF; - - SET vEnded = util.dayEnd(vEnded); - SET vStartingDate = vStarted ; - SET vEndingDate = util.dayEnd(vStartingDate); - - DELETE - FROM sale - WHERE dated BETWEEN vStartingDate AND vEnded; - - WHILE vEndingDate <= vEnded DO - - REPLACE ventas(Id_Movimiento, - importe, - recargo, - fecha, - tipo_id, - Id_Cliente, - empresa_id - )SELECT saleFk, - IFNULL(SUM(IF(ct.isBase, s.quantity * sc.value, 0)), 0) importe, - IFNULL(SUM(IF(ct.isBase, 0, s.quantity * sc.value)), 0) recargo, - vStartingDate, - i.typeFk, - a.clientFk, - t.companyFk - FROM vn.saleComponent sc - JOIN vn.component c ON c.id = sc.componentFk - JOIN vn.componentType ct ON ct.id = c.typeFk - JOIN vn.sale s ON s.id = sc.saleFk - JOIN vn.item i ON i.id = s.itemFk - JOIN vn.itemType it ON it.id = i.typeFk - JOIN vn.itemCategory ic ON ic.id = it.categoryFk - JOIN vn.ticket t ON t.id = s.ticketFk - JOIN vn.address a ON a.id = t.addressFk - JOIN vn.client cl ON cl.id = a.clientFk - WHERE t.shipped BETWEEN vStartingDate AND vEndingDate - AND s.quantity <> 0 - AND ic.merchandise - GROUP BY sc.saleFk; - - UPDATE sale s - JOIN ( - SELECT s.id, - SUM(s.quantity * sc.value ) margen, - s.quantity * s.price * (100 - s.discount ) / 100 pvp - FROM vn.sale s - JOIN vn.ticket t ON t.id = s.ticketFk - JOIN vn.saleComponent sc ON sc.saleFk = s.id - JOIN vn.component c ON c.id = sc.componentFk - JOIN vn.componentType ct ON ct.id = c.typeFk - WHERE t.shipped BETWEEN vStartingDate AND vEndingDate - AND ct.isMargin = TRUE - GROUP BY s.id) sub ON sub.id = s.saleFk - SET s.margin = sub.margen + s.amount + s.surcharge - sub.pvp; - - SET vStartingDate = TIMESTAMPADD(DAY,1, vStartingDate); - SET vEndingDate = util.dayEnd(vStartingDate); - - END WHILE; - -END$$ -DELIMITER ; diff --git a/db/routines/bs/procedures/ventas_add_launcher.sql b/db/routines/bs/procedures/ventas_add_launcher.sql index 0d9e89a89..3f8bd28c8 100644 --- a/db/routines/bs/procedures/ventas_add_launcher.sql +++ b/db/routines/bs/procedures/ventas_add_launcher.sql @@ -5,9 +5,8 @@ BEGIN * Añade las ventas a la tabla bs.sale que se realizaron desde hace un mes hasta hoy * */ - DECLARE vCurDate DATE DEFAULT util.VN_CURDATE(); - CALL ventas_add(vCurDate - INTERVAL 1 MONTH, vCurDate); - + + CALL sale_add(vCurDate - INTERVAL 1 MONTH, vCurDate); END$$ DELIMITER ; diff --git a/db/versions/11001-blackPalmetto/00-firstScript.sql b/db/versions/11001-blackPalmetto/00-firstScript.sql index b2a032265..e69de29bb 100644 --- a/db/versions/11001-blackPalmetto/00-firstScript.sql +++ b/db/versions/11001-blackPalmetto/00-firstScript.sql @@ -1,56 +0,0 @@ - UPDATE vn.componentType - SET isBase = 1 - WHERE code = 'MANA'; - - CREATE OR REPLACE TEMPORARY TABLE tmp.discountSale - (PRIMARY KEY (saleFk)) - SELECT bs.saleFk, - bs.amount, - s.discount, - SUM(IF(ct.isBase, s.quantity * sc.value, 0)) importe, - SUM(IF(ct.isBase, 0, s.quantity * sc.value)) recargo - FROM bs.sale bs - JOIN vn.sale s ON s.id = bs.saleFk - JOIN vn.saleComponent sc ON sc.saleFk = s.id - JOIN vn.component c ON c.id = sc.componentFk - JOIN vn.componentType ct ON ct.id = c.typeFk - WHERE s.discount - GROUP BY bs.saleFk; - UPDATE bs.sale bs - JOIN tmp.discountSale ts ON ts.saleFk = bs.saleFk - SET bs.amount = ts.importe - bs.surcharge = ts.recargo; - - DROP TEMPORARY TABLE tmp.discountSale; - - DELETE FROM comparative - WHERE timePeriod BETWEEN '202101' AND '202409'; - - INSERT INTO comparative( - timePeriod, - itemFk, - warehouseFk, - quantity, - price, - countryFk - ) - SELECT tm.period, - s.itemFk, - t.warehouseFk, - sum(s.quantity), - sum(v.importe), - p.countryFk - FROM bs.ventas v - JOIN time tm ON tm.dated = v.fecha - JOIN sale s ON s.id = v.Id_Movimiento - JOIN itemType tp ON tp.id = v.tipo_id - JOIN itemCategory ic ON ic.id = tp.categoryFk - JOIN ticket t ON t.id = s.ticketFk - JOIN client c ON c.id = t.clientFk - JOIN warehouse w ON w.id = t.warehouseFk - JOIN address ad ON ad.id = t.addressFk - LEFT JOIN province p ON p.id = ad.provinceFk - WHERE tm.period BETWEEN '202101' AND '202409' - AND c.typeFk <> 'loses' - AND NOT w.code = 'inv' - GROUP BY p.countryFk, s.itemFk, tm.period, t.warehouseFk; From 0284b138d7a26c97a93bd923d2a1d425020069e3 Mon Sep 17 00:00:00 2001 From: ivanm Date: Mon, 22 Apr 2024 15:03:08 +0200 Subject: [PATCH 05/18] refs #7191 requested modifications --- db/routines/vn/triggers/entry_beforeUpdate.sql | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/db/routines/vn/triggers/entry_beforeUpdate.sql b/db/routines/vn/triggers/entry_beforeUpdate.sql index afe1a25be..d4e50004c 100644 --- a/db/routines/vn/triggers/entry_beforeUpdate.sql +++ b/db/routines/vn/triggers/entry_beforeUpdate.sql @@ -6,17 +6,17 @@ BEGIN DECLARE vIsVirtual BOOL; DECLARE vPrintedCount INT; DECLARE vHasDistinctWarehouses BOOL; - DECLARE vEntryFkCount INT; + DECLARE vTotalBuy INT; IF NEW.isBooked = OLD.isBooked THEN CALL entry_checkBooked(OLD.id); - END IF; - - IF NEW.isBooked = 1 THEN - SELECT COUNT(*) INTO vEntryFkCount - FROM buy WHERE entryFk = NEW.id; - IF vEntryFkCount = 0 THEN - CALL util.throw('The entry cannot be marked as booked if it does not have lines'); + ELSE + IF NEW.isBooked = 1 THEN + SELECT COUNT(*) INTO vTotalBuy + FROM buy WHERE entryFk = NEW.id; + IF vTotalBuy = 0 THEN + CALL util.throw('The entry cannot be marked as booked if it does not have lines'); + END IF; END IF; END IF; From 30f6a9324d8bbb02ae61c474915c148c6ee924e8 Mon Sep 17 00:00:00 2001 From: ivanm Date: Mon, 29 Apr 2024 19:40:43 +0200 Subject: [PATCH 06/18] refs #7191 SQL conventions mod --- db/routines/vn/triggers/entry_beforeUpdate.sql | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/db/routines/vn/triggers/entry_beforeUpdate.sql b/db/routines/vn/triggers/entry_beforeUpdate.sql index d4e50004c..028564d15 100644 --- a/db/routines/vn/triggers/entry_beforeUpdate.sql +++ b/db/routines/vn/triggers/entry_beforeUpdate.sql @@ -11,9 +11,10 @@ BEGIN IF NEW.isBooked = OLD.isBooked THEN CALL entry_checkBooked(OLD.id); ELSE - IF NEW.isBooked = 1 THEN + IF NEW.isBooked THEN SELECT COUNT(*) INTO vTotalBuy - FROM buy WHERE entryFk = NEW.id; + FROM buy + WHERE entryFk = NEW.id; IF vTotalBuy = 0 THEN CALL util.throw('The entry cannot be marked as booked if it does not have lines'); END IF; From 3167bdcdd006bbcce61177b0da07edd6bba16e01 Mon Sep 17 00:00:00 2001 From: ivanm Date: Tue, 30 Apr 2024 14:37:06 +0200 Subject: [PATCH 07/18] refs #7191 message modification --- db/routines/vn/triggers/entry_beforeUpdate.sql | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/db/routines/vn/triggers/entry_beforeUpdate.sql b/db/routines/vn/triggers/entry_beforeUpdate.sql index 028564d15..d56db5e01 100644 --- a/db/routines/vn/triggers/entry_beforeUpdate.sql +++ b/db/routines/vn/triggers/entry_beforeUpdate.sql @@ -15,8 +15,8 @@ BEGIN SELECT COUNT(*) INTO vTotalBuy FROM buy WHERE entryFk = NEW.id; - IF vTotalBuy = 0 THEN - CALL util.throw('The entry cannot be marked as booked if it does not have lines'); + IF NOT vTotalBuy THEN + CALL util.throw('Entry must have lines to be marked booked'); END IF; END IF; END IF; @@ -26,7 +26,7 @@ BEGIN IF NOT (NEW.travelFk <=> OLD.travelFk) THEN IF NEW.travelFk IS NOT NULL AND NOT travel_hasUniqueAwb(NEW.travelFk) THEN - CALL util.throw('The travel is incorrect, there is a different AWB in the associated entries'); + CALL util.throw('The travel is incorrect, there is a different AWB in the associated entries'); END IF; SELECT COUNT(*) > 0 INTO vIsVirtual From a40545264bf322898eda746aac26fdea96e07bf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Tue, 30 Apr 2024 15:46:24 +0200 Subject: [PATCH 08/18] fix: descuentos en bs.ventas refs #6974 --- db/routines/bs/procedures/sale_add.sql | 50 +++++++++++++------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/db/routines/bs/procedures/sale_add.sql b/db/routines/bs/procedures/sale_add.sql index e9f91740f..64beb4776 100644 --- a/db/routines/bs/procedures/sale_add.sql +++ b/db/routines/bs/procedures/sale_add.sql @@ -34,37 +34,37 @@ BEGIN clientFk, companyFk, margin - )WITH calculated AS( - SELECT s.id saleFk, - SUM(IF(ct.isBase, s.quantity * sc.value, 0)) amount, - SUM(IF(ct.isBase, 0, s.quantity * sc.value)) surcharge, - s.total pvp, - DATE(t.shipped) dated, - i.typeFk, - t.clientFk, - t.companyFk, - SUM(IF(ct.isMargin, s.quantity * sc.value, 0 )) marginComponents - FROM vn.ticket t - STRAIGHT_JOIN vn.sale s ON s.ticketFk = t.id - JOIN vn.item i ON i.id = s.itemFk - JOIN vn.itemType it ON it.id = i.typeFk - JOIN vn.itemCategory ic ON ic.id = it.categoryFk - JOIN vn.saleComponent sc ON sc.saleFk = s.id - JOIN vn.component c ON c.id = sc.componentFk - JOIN vn.componentType ct ON ct.id = c.typeFk - WHERE t.shipped BETWEEN vLoopDate AND vLoopDateTime - AND s.quantity <> 0 - AND ic.merchandise - GROUP BY s.id - )SELECT saleFk, + )WITH calculatedSales AS( + SELECT s.id saleFk, + SUM(IF(ct.isBase, s.quantity * sc.value, 0)) amount, + SUM(IF(ct.isBase, 0, s.quantity * sc.value)) surcharge, + s.total pvp, + DATE(t.shipped) dated, + i.typeFk, + t.clientFk, + t.companyFk, + SUM(IF(ct.isMargin, s.quantity * sc.value, 0 )) marginComponents + FROM vn.ticket t + STRAIGHT_JOIN vn.sale s ON s.ticketFk = t.id + JOIN vn.item i ON i.id = s.itemFk + JOIN vn.itemType it ON it.id = i.typeFk + JOIN vn.itemCategory ic ON ic.id = it.categoryFk + JOIN vn.saleComponent sc ON sc.saleFk = s.id + JOIN vn.component c ON c.id = sc.componentFk + JOIN vn.componentType ct ON ct.id = c.typeFk + WHERE t.shipped BETWEEN vLoopDate AND vLoopDateTime + AND s.quantity <> 0 + AND ic.merchandise + GROUP BY s.id + )SELECT saleFk, amount, surcharge, dated, typeFk, clientFk, companyFk, - marginComponents + amount + surcharge - pvp - FROM calculated; + marginComponents + amount + surcharge - pvp + FROM calculatedSales; SET vLoopDate = vLoopDate + INTERVAL 1 DAY; END WHILE; From cc4081d25fc8314a241c522c3b6865905e01e74a Mon Sep 17 00:00:00 2001 From: jorgep Date: Tue, 30 Apr 2024 16:17:29 +0200 Subject: [PATCH 09/18] fix: refs #7165 css --- print/templates/reports/delivery-note/assets/css/style.css | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/print/templates/reports/delivery-note/assets/css/style.css b/print/templates/reports/delivery-note/assets/css/style.css index 8405ae78d..3e1c64d85 100644 --- a/print/templates/reports/delivery-note/assets/css/style.css +++ b/print/templates/reports/delivery-note/assets/css/style.css @@ -39,7 +39,11 @@ h2 { margin-top: 10px } -.observations{ +.observations { text-align: justify; text-justify: inter-word; +} + +.column-oriented { + margin-bottom: 5px; } \ No newline at end of file From a9bdfd8821e6c41ac4c5726413dc7fbc6fb9c7e3 Mon Sep 17 00:00:00 2001 From: jorgep Date: Tue, 30 Apr 2024 16:55:41 +0200 Subject: [PATCH 10/18] feat: refs #7165 add changeLog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a672e7986..0bb15511b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - (Worker -> time-control) Corrección de errores - (InvoiceOut -> Crear factura) Cuando falla al crear una factura, se devuelve un error +- (Worker -> Ver albarán) Ya no aparece la página en blanco ## [24.18.01] - 2024-05-07 From bd1499a6f79a4b932a44d2fb9a5956fee60461f8 Mon Sep 17 00:00:00 2001 From: pablone Date: Thu, 2 May 2024 10:25:46 +0200 Subject: [PATCH 11/18] feat(collection-label): new option barcode-qr --- modules/client/front/consumption/index.html | 3 +- .../collection-label/assets/css/style.css | 5 ++- .../collection-label/collection-label.html | 16 ++++----- .../collection-label/collection-label.js | 34 ++++++++++++------- .../collection-label/sql/barcodeType.sql | 3 ++ .../collection-label/sql/labelsData.sql | 4 +-- 6 files changed, 40 insertions(+), 25 deletions(-) create mode 100644 print/templates/reports/collection-label/sql/barcodeType.sql diff --git a/modules/client/front/consumption/index.html b/modules/client/front/consumption/index.html index 17e1e8c8b..06611da5a 100644 --- a/modules/client/front/consumption/index.html +++ b/modules/client/front/consumption/index.html @@ -77,8 +77,7 @@ tabindex="-1"> - {{::sale.quantity | dashIfEmpty}} - + {{::sale.quantity | dashIfEmpty}} diff --git a/print/templates/reports/collection-label/assets/css/style.css b/print/templates/reports/collection-label/assets/css/style.css index eb300f850..3eb68a2b2 100644 --- a/print/templates/reports/collection-label/assets/css/style.css +++ b/print/templates/reports/collection-label/assets/css/style.css @@ -32,9 +32,12 @@ html { #bold { font-weight: bold; } -#barcode{ +.barcode{ width: 370px; } +.qr{ + max-height: 137px; +} #shipped { font-weight: bold; width: 50px; diff --git a/print/templates/reports/collection-label/collection-label.html b/print/templates/reports/collection-label/collection-label.html index f313fccc4..752a31185 100644 --- a/print/templates/reports/collection-label/collection-label.html +++ b/print/templates/reports/collection-label/collection-label.html @@ -8,15 +8,15 @@ {{labelData.clientFk ? `${labelData.ticketFk} « ${labelData.clientFk}` : labelData.ticketFk}} - {{labelData.shipped || '---'}} + {{dashIfEmpty(labelData.shipped)}} - -
- {{labelData.workerCode || '---'}} + + + {{dashIfEmpty(labelData.workerCode)}} -
- {{labelData.workerCode || '---'}} +
+ {{dashIfEmpty(labelData.workerCode)}} {{labelData.labelCount || 0}} @@ -25,11 +25,11 @@ {{labelData.code == 'V' ? (labelData.size || 0) + 'cm' : (labelData.volume || 0) + 'm³'}} -
{{getAgencyDescripton(labelData)}}
+
{{dashIfEmpty(getAgencyDescription(labelData))}}
{{labelData.lineCount || 0}} - {{labelData.nickName ? labelData.nickName.toUpperCase() : '---'}} + {{dashIfEmpty(labelData?.nickName.toUpperCase()) }} {{labelData.shippedHour || labelData.zoneHour}} diff --git a/print/templates/reports/collection-label/collection-label.js b/print/templates/reports/collection-label/collection-label.js index faf6792f9..fe32a0e2b 100644 --- a/print/templates/reports/collection-label/collection-label.js +++ b/print/templates/reports/collection-label/collection-label.js @@ -1,8 +1,9 @@ -import qrcode from 'qrcode'; -import jsBarcode from 'jsbarcode'; +const qrCode = require('qrcode'); +const jsBarcode = require('jsbarcode'); const {DOMImplementation, XMLSerializer} = require('xmldom'); const vnReport = require('../../../core/mixins/vn-report.js'); +const {TRUE} = require('node-sass'); module.exports = { name: 'collection-label', @@ -29,19 +30,27 @@ module.exports = { } else ticketIds = [this.id]; - this.labelsData = await this.rawSqlFromDef('labelsData', [ticketIds]); + const labels = await this.rawSqlFromDef('labelsData', [ticketIds]); + + const [{scannableCodeType}] = await this.rawSqlFromDef('barcodeType'); + if (scannableCodeType === 'qr') { + for (const labelData of labels) + labelData.qrData = await this.getQr(labelData?.ticketFk, labelData?.workerFk); + } + + this.labelsData = labels; this.checkMainEntity(this.labelsData); }, methods: { - getQR(id) { - let QRdata = JSON.stringify({ + async getQr(ticketFk, workerFk = null) { + const QRdata = JSON.stringify({ company: 'vnl', - user: this.userFk, + user: workerFk, created: Date.vnNew(), table: 'ticket', - id + id: ticketFk }); - return qrcode.toDataURL(QRdata, {margin: 0}); + return qrCode.toDataURL(QRdata, {margin: 0}); }, getBarcode(id) { const xmlSerializer = new XMLSerializer(); @@ -64,18 +73,16 @@ module.exports = { if (labelData.code == 'V') value = value + `${labelData.wagon}-${labelData.level}`; else - value = value + `${labelData.color.substring(0, 4)}`; + value = value + `${labelData.color?.substring(0, 4)}`; } else value = '-'.repeat(19); return value; }, - getAgencyDescripton(labelData) { + getAgencyDescription(labelData) { let value; if (labelData.agencyDescription) value = labelData.agencyDescription.toUpperCase().substring(0, 11); - else - value = '---'; if (labelData.routeFk) { let routeFk = labelData.routeFk.toString(); @@ -84,5 +91,8 @@ module.exports = { return value; }, + dashIfEmpty(value) { + return value || '---'; + } }, }; diff --git a/print/templates/reports/collection-label/sql/barcodeType.sql b/print/templates/reports/collection-label/sql/barcodeType.sql new file mode 100644 index 000000000..0700c95a2 --- /dev/null +++ b/print/templates/reports/collection-label/sql/barcodeType.sql @@ -0,0 +1,3 @@ +SELECT scannableCodeType + FROM productionConfig + LIMIT 1 \ No newline at end of file diff --git a/print/templates/reports/collection-label/sql/labelsData.sql b/print/templates/reports/collection-label/sql/labelsData.sql index a83381b1f..f0a9baf1f 100644 --- a/print/templates/reports/collection-label/sql/labelsData.sql +++ b/print/templates/reports/collection-label/sql/labelsData.sql @@ -11,14 +11,14 @@ SELECT c.itemPackingTypeFk code, IF(sgd.id, IFNULL(pc.itemPreviousDefaultSize, i.`size`), i.`size`) ) `size`, w.code workerCode, + w.id workerFk, TIME_FORMAT(t.shipped, '%H:%i') shippedHour, TIME_FORMAT(zo.`hour`, '%H:%i') zoneHour, DATE_FORMAT(t.shipped, '%d/%m/%y') shipped, tt.labelCount, t.nickName, SUM(IF(sgd.id IS NULL, 1, 0)) + IF(sgd.id , 1, 0) lineCount, - rm.routeFk, - pc.scannableCodeType + rm.routeFk FROM vn.ticket t JOIN vn.ticketCollection tc ON tc.ticketFk = t.id JOIN vn.collection c ON c.id = tc.collectionFk From 6868863e542e208df5d63d1e8d2e5a68e7912cf0 Mon Sep 17 00:00:00 2001 From: pablone Date: Thu, 2 May 2024 10:32:20 +0200 Subject: [PATCH 12/18] fix: refs #6602 refactor code --- .../reports/collection-label/collection-label.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/print/templates/reports/collection-label/collection-label.js b/print/templates/reports/collection-label/collection-label.js index fe32a0e2b..f2f697ae6 100644 --- a/print/templates/reports/collection-label/collection-label.js +++ b/print/templates/reports/collection-label/collection-label.js @@ -1,9 +1,7 @@ -const qrCode = require('qrcode'); -const jsBarcode = require('jsbarcode'); - const {DOMImplementation, XMLSerializer} = require('xmldom'); const vnReport = require('../../../core/mixins/vn-report.js'); -const {TRUE} = require('node-sass'); +const {toDataURL} = require('qrcode'); +const jsBarcode = require('jsbarcode'); module.exports = { name: 'collection-label', @@ -50,7 +48,7 @@ module.exports = { table: 'ticket', id: ticketFk }); - return qrCode.toDataURL(QRdata, {margin: 0}); + return toDataURL(QRdata, {margin: 0}); }, getBarcode(id) { const xmlSerializer = new XMLSerializer(); From d994a682f961f7545bff87faeb1b15611f8507ca Mon Sep 17 00:00:00 2001 From: sergiodt Date: Thu, 2 May 2024 16:48:58 +0200 Subject: [PATCH 13/18] refs #6799 feat: french and portuguese --- loopback/locale/fr.json | 360 ++++++++++++++++++++++++++++++++++++++++ loopback/locale/pt.json | 360 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 720 insertions(+) create mode 100644 loopback/locale/fr.json create mode 100644 loopback/locale/pt.json diff --git a/loopback/locale/fr.json b/loopback/locale/fr.json new file mode 100644 index 000000000..44f5e35d3 --- /dev/null +++ b/loopback/locale/fr.json @@ -0,0 +1,360 @@ +{ + "Phone format is invalid": "O formato do telefone é inválido", + "You are not allowed to change the credit": "Você não tem permissão para alterar o crédito", + "Unable to mark the equivalence surcharge": "Não é possível marcar a sobretaxa de equivalência", + "The default consignee can not be unchecked": "Não é possível desmarcar o destinatário padrão", + "Unable to default a disabled consignee": "Não é possível definir um destinatário desativado como padrão", + "Can't be blank": "Não pode ficar em branco", + "Invalid TIN": "NIF/CIF inválido", + "TIN must be unique": "O NIF/CIF deve ser único", + "A client with that Web User name already exists": "Já existe um cliente com esse nome de usuário da web", + "Is invalid": "É inválido", + "Quantity cannot be zero": "A quantidade não pode ser zero", + "Enter an integer different to zero": "Digite um inteiro diferente de zero", + "Package cannot be blank": "A embalagem não pode ficar em branco", + "The company name must be unique": "O nome da empresa deve ser único", + "Invalid email": "E-mail inválido", + "The IBAN does not have the correct format": "O IBAN não tem o formato correto", + "That payment method requires an IBAN": "Este método de pagamento requer um IBAN", + "That payment method requires a BIC": "Este método de pagamento requer um BIC", + "State cannot be blank": "O estado não pode ficar em branco", + "Worker cannot be blank": "O trabalhador não pode ficar em branco", + "Cannot change the payment method if no salesperson": "Não é possível alterar o método de pagamento se não houver vendedor", + "can't be blank": "Não pode ficar em branco", + "Observation type must be unique": "O tipo de observação deve ser único", + "The credit must be an integer greater than or equal to zero": "O crédito deve ser um inteiro maior ou igual a zero", + "The grade must be similar to the last one": "A nota deve ser semelhante à última", + "Only manager can change the credit": "Apenas o gerente pode alterar o crédito deste cliente", + "Name cannot be blank": "O nome não pode ficar em branco", + "Phone cannot be blank": "O telefone não pode ficar em branco", + "Period cannot be blank": "O período não pode ficar em branco", + "Choose a company": "Escolha uma empresa", + "Se debe rellenar el campo de texto": "O campo de texto deve ser preenchido", + "Description should have maximum of 45 characters": "A descrição deve ter no máximo 45 caracteres", + "Cannot be blank": "Não pode ficar em branco", + "The grade must be an integer greater than or equal to zero": "A nota deve ser um inteiro maior ou igual a zero", + "Sample type cannot be blank": "O tipo de amostra não pode ficar em branco", + "Description cannot be blank": "A descrição não pode ficar em branco", + "The price of the item changed": "O preço do item mudou", + "The value should not be greater than 100%": "O valor não deve ser maior que 100%", + "The value should be a number": "O valor deve ser um número", + "This order is not editable": "Esta ordem não é editável", + "You can't create an order for a frozen client": "Você não pode criar uma ordem para um cliente congelado", + "You can't create an order for a client that has a debt": "Você não pode criar uma ordem para um cliente que tem uma dívida", + "is not a valid date": "não é uma data válida", + "Barcode must be unique": "O código de barras deve ser único", + "The warehouse can't be repeated": "O armazém não pode ser repetido", + "The tag or priority can't be repeated for an item": "A tag ou prioridade não podem ser repetidas para um item", + "The observation type can't be repeated": "O tipo de observação não pode ser repetido", + "A claim with that sale already exists": "Já existe uma reclamação com essa venda", + "You don't have enough privileges to change that field": "Você não tem privilégios suficientes para alterar esse campo", + "Warehouse cannot be blank": "O armazém não pode ficar em branco", + "Agency cannot be blank": "A agência não pode ficar em branco", + "Not enough privileges to edit a client with verified data": "Não há privilégios suficientes para editar um cliente com dados verificados", + "This address doesn't exist": "Este endereço não existe", + "You must delete the claim id %d first": "Você deve excluir primeiro a reclamação %d", + "You don't have enough privileges": "Você não tem privilégios suficientes", + "Cannot check Equalization Tax in this NIF/CIF": "Não é possível verificar o Imposto de Equalização neste NIF/CIF", + "You can't make changes on the basic data of an confirmed order or with rows": "Você não pode fazer alterações nos dados básicos de um pedido confirmado ou com linhas", + "INVALID_USER_NAME": "Le nom d'utilisateur ne doit contenir que des lettres minuscules ou, à partir du deuxième caractère, des chiffres ou des tirets bas, l'utilisation de la lettre ñ n'est pas autorisée", + "You can't create a ticket for a frozen client": "Vous ne pouvez pas créer un ticket pour un client gelé", + "You can't create a ticket for an inactive client": "Vous ne pouvez pas créer un ticket pour un client inactif", + "Tag value cannot be blank": "La valeur du tag ne peut pas être vide", + "ORDER_EMPTY": "Panier vide", + "You don't have enough privileges to do that": "Vous n'avez pas les privilèges nécessaires pour faire cela", + "NO SE PUEDE DESACTIVAR EL CONSIGNAT": "LE CONSIGNATAIRE NE PEUT PAS ÊTRE DÉSACTIVÉ", + "Error. El NIF/CIF está repetido": "Erreur. Le NIF/CIF est répété", + "Street cannot be empty": "L'adresse ne peut pas être vide", + "City cannot be empty": "La ville ne peut pas être vide", + "Code cannot be blank": "Le code ne peut pas être vide", + "You cannot remove this department": "Vous ne pouvez pas supprimer ce département", + "The extension must be unique": "L'extension doit être unique", + "The secret can't be blank": "Le mot de passe ne peut pas être vide", + "We weren't able to send this SMS": "Nous n'avons pas pu envoyer ce SMS", + "This client can't be invoiced": "Ce client ne peut pas être facturé", + "You must provide the correction information to generate a corrective invoice": "Vous devez fournir les informations de correction pour générer une facture corrective", + "This ticket can't be invoiced": "Ce ticket ne peut pas être facturé", + "You cannot add or modify services to an invoiced ticket": "Vous ne pouvez pas ajouter ou modifier des services à un ticket facturé", + "This ticket can not be modified": "Ce ticket ne peut pas être modifié", + "The introduced hour already exists": "Cette heure a déjà été introduite", + "INFINITE_LOOP": "Il existe une dépendance entre deux chefs", + "The sales of the receiver ticket can't be modified": "Les lignes du ticket auquel vous envoyez ne peuvent pas être modifiées", + "NO_AGENCY_AVAILABLE": "Il n'y a pas de zone de livraison disponible avec ces paramètres", + "ERROR_PAST_SHIPMENT": "Vous ne pouvez pas sélectionner une date d'envoi dans le passé", + "The current ticket can't be modified": "Le ticket actuel ne peut pas être modifié", + "The current claim can't be modified": "La réclamation actuelle ne peut pas être modifiée", + "The sales of this ticket can't be modified": "Les lignes de ce ticket ne peuvent pas être modifiées", + "The sales do not exists": "Les lignes sélectionnées n'existent pas", + "Please select at least one sale": "Veuillez sélectionner au moins une ligne", + "All sales must belong to the same ticket": "Toutes les lignes doivent appartenir au même ticket", + "NO_ZONE_FOR_THIS_PARAMETERS": "Il n'y a pas de zone configurée pour ce jour", + "This item doesn't exists": "Cet article n'existe pas", + "NOT_ZONE_WITH_THIS_PARAMETERS": "Il n'y a pas de zone configurée pour ce jour", + "Extension format is invalid": "Le format de l'extension est invalide", + "Invalid parameters to create a new ticket": "Paramètres invalides pour créer un nouveau ticket", + "This item is not available": "Cet article n'est pas disponible", + "This postcode already exists": "Ce code postal existe déjà", + "Concept cannot be blank": "Le concept ne peut pas être vide", + "File doesn't exists": "Le fichier n'existe pas", + "You don't have privileges to change the zone": "Vous n'avez pas les privilèges pour changer la zone ou pour ces paramètres, il y a plus d'une option de livraison, parlez avec les agences", + "This ticket is already on weekly tickets": "Ce ticket est déjà sur les tickets hebdomadaires", + "Ticket id cannot be blank": "L'id du ticket ne peut pas être vide", + "Weekday cannot be blank": "Le jour de la semaine ne peut pas être vide", + "You can't delete a confirmed order": "Vous ne pouvez pas supprimer une commande confirmée", + "The social name has an invalid format": "Le nom fiscal a un format incorrect", + "Invalid quantity": "Quantité invalide", + "This postal code is not valid": "Ce code postal n'est pas valide", + "is invalid": "est invalide", + "The postcode doesn't exist. Please enter a correct one": "Le code postal n'existe pas. Veuillez entrer un code correct", + "The department name can't be repeated": "Le nom du département ne peut pas être répété", + "This phone already exists": "Ce téléphone existe déjà", + "You cannot move a parent to its own sons": "Vous ne pouvez pas déplacer un élément parent à un de ses fils", + "You can't create a claim for a removed ticket": "Vous ne pouvez pas créer une réclamation pour un ticket supprimé", + "You cannot delete a ticket that part of it is being prepared": "Vous ne pouvez pas supprimer un ticket dont une partie est en préparation", + "You must delete all the buy requests first": "Vous devez supprimer toutes les demandes d'achat en premier", + "You should specify a date": "Vous devez spécifier une date", + "You should specify at least a start or end date": "Vous devez spécifier au moins une date de début ou de fin", + "Start date should be lower than end date": "La date de début doit être inférieure à la date de fin", + "You should mark at least one week day": "Vous devez marquer au moins un jour de la semaine", + "Swift / BIC can't be empty": "Swift / BIC ne peut pas être vide", + "Customs agent is required for a non UEE member": "Un agent des douanes est requis pour les clients non membres de l'UEE", + "Incoterms is required for a non UEE member": "Les incoterms sont requis pour les clients non membres de l'UEE", + "Deleted sales from ticket": "J'ai supprimé les lignes suivantes du ticket [{{ticketId}}]({{{ticketUrl}}}): {{{deletions}}}", + "Added sale to ticket": "J'ai ajouté la ligne suivante au ticket [{{ticketId}}]({{{ticketUrl}}}): {{{addition}}}", + "Changed sale discount": "J'ai changé le rabais des lignes suivantes du ticket [{{ticketId}}]({{{ticketUrl}}}): {{{changes}}}", + "Created claim": "J'ai créé la réclamation [{{claimId}}]({{{claimUrl}}}) des lignes suivantes du ticket [{{ticketId}}]({{{ticketUrl}}}): {{{changes}}}", + "Changed sale price": "J'ai changé le prix de [{{itemId}} {{concept}}]({{{itemUrl}}}) ({{quantity}}) de {{oldPrice}}€ ➔ *{{newPrice}}€* du ticket [{{ticketId}}]({{{ticketUrl}}})", + "Changed sale quantity": "J'ai changé la quantité de {{itemId}} {{concept}} de {{oldQuantity}} ➔ {{newQuantity}} du ticket [{{ticketId}}]({{{ticketUrl}}})", + "State": "État", + "regular": "normal", + "reserved": "réservé", + "Changed sale reserved state": "J'ai changé l'état réservé des lignes suivantes du ticket[{{ticketId}}]({{{ticketUrl}}}): {{{changes}}}", + "Bought units from buy request": "{{quantity}} unités ont été achetées de [{{itemId}} {{concept}}]({{{urlItem}}}) pour le ticket id [{{ticketId}}]({{{url}}})", + "Deny buy request": "La demande d'achat pour le ticket id {{ticketId}} a été rejetée. Raison : {{observation}}", + "MESSAGE_INSURANCE_CHANGE": "J'ai changé le crédit assuré du client [{{clientName}} ({{clientId}})]({{{url}}}) a *{{credit}} €*", + "Changed client paymethod": "J'ai changé la méthode de paiement du client [{{clientName}} ({{clientId}})]({{{url}}})", + "Sent units from ticket": "Envoi *{{quantity}}* unités de [{{concept}} ({{itemId}})]({{{itemUrl}}}) a *\"{{nickname}}\"* provenant du ticket id [{{ticketId}}]({{{ticketUrl}}})", + "Change quantity": "{{concept}} change de {{oldQuantity}} à {{newQuantity}}", + "Claim will be picked": "Le produit de la réclamation [({{claimId}})]({{{claimUrl}}}) du client *{{clientName}}*, avec le type de ramassage *{{claimPickup}}* sera récupéré", + "Claim state has changed to": "L'état de la réclamation [({{claimId}})]({{{claimUrl}}}) du client *{{clientName}}* a été changé à *{{newState}}*", + "Client checked as validated despite of duplication": "Le client a été vérifié malgré l'existence du client id {{clientId}}", + "ORDER_ROW_UNAVAILABLE": "Il n'y a pas de disponibilité pour ce produit", + "Distance must be lesser than 4000": "La distance doit être inférieure à 4000", + "This ticket is deleted": "Ce ticket est supprimé", + "Unable to clone this travel": "Il n'a pas été possible de cloner ce voyage", + "This thermograph id already exists": "L'id du thermographe existe déjà", + "Choose a date range or days forward": "Sélectionnez une plage de dates ou des jours à venir", + "ORDER_ALREADY_CONFIRMED": "COMMANDE DÉJÀ CONFIRMÉE", + "Invalid password": "Mot de passe invalide", + "Password does not meet requirements": "Le mot de passe ne répond pas aux exigences", + "Role already assigned": "Rôle déjà attribué", + "Invalid role name": "Nom de rôle invalide", + "Role name must be written in camelCase": "Le nom du rôle doit être écrit en camelCase", + "Email already exists": "L'email existe déjà", + "User already exists": "L'utilisateur existe déjà", + "Absence change notification on the labour calendar": "Notification de changement d'absence sur le calendrier de travail", + "Record of hours week": "Enregistrement des heures semaine {{week}} année {{year}}", + "Created absence": "L'employé {{author}} a ajouté une absence de type '{{absenceType}}' à {{employee}} pour le jour {{dated}}.", + "Deleted absence": "L'employé {{author}} a supprimé une absence de type '{{absenceType}}' à {{employee}} du jour {{dated}}.", + "I have deleted the ticket id": "J'ai supprimé le ticket id [{{id}}]({{{url}}})", + "I have restored the ticket id": "J'ai restauré le ticket id [{{id}}]({{{url}}})", + "You can only restore a ticket within the first hour after deletion": "Vous pouvez uniquement restaurer un ticket dans la première heure après sa suppression", + "Changed this data from the ticket": "J'ai modifié ces données du ticket [{{ticketId}}]({{{ticketUrl}}}): {{{changes}}}", + "agencyModeFk": "Agence", + "clientFk": "Client", + "zoneFk": "Zone", + "warehouseFk": "Entrepôt", + "shipped": "Date d'envoi", + "landed": "Date de livraison", + "addressFk": "Consignataire", + "companyFk": "Entreprise", + "agency": "Agence", + "delivery": "Livraison", + "The social name cannot be empty": "La raison sociale ne peut pas être vide", + "The nif cannot be empty": "Le NIF ne peut pas être vide", + "You need to fill sage information before you check verified data": "Vous devez remplir les informations de sage avant de vérifier les données", + "ASSIGN_ZONE_FIRST": "Assignez une zone d'abord", + "Amount cannot be zero": "Le montant ne peut pas être zéro", + "Company has to be official": "L'entreprise doit être officielle", + "You can not select this payment method without a registered bankery account": "Vous ne pouvez pas utiliser cette méthode de paiement sans avoir enregistré un compte bancaire", + "Action not allowed on the test environment": "Cette action n'est pas autorisée dans l'environnement de test", + "The selected ticket is not suitable for this route": "Le ticket sélectionné n'est pas adapté à cet itinéraire", + "New ticket request has been created with price": "Une nouvelle demande de ticket '{{description}}' a été créée pour le jour {{shipped}}, avec une quantité de {{quantity}} et un prix de {{price}} €", + "New ticket request has been created": "Une nouvelle demande de ticket '{{description}}' a été créée pour le jour {{shipped}}, avec une quantité de {{quantity}}", + "Swift / BIC cannot be empty": "Swift / BIC ne peut pas être vide", + "This BIC already exist.": "Ce BIC existe déjà.", + "That item doesn't exists": "Cet article n'existe pas", + "There's a new urgent ticket:": "Il y a un nouveau ticket urgent :", + "Invalid account": "Compte invalide", + "Compensation account is empty": "Le compte de compensation est vide", + "This genus already exist": "Ce genre existe déjà", + "This specie already exist": "Cette espèce existe déjà", + "Client assignment has changed": "J'ai changé le commercial ~*\"<{{previousWorkerName}}>\"*~ pour *\"<{{currentWorkerName}}>\"* du client [{{clientName}} ({{clientId}})]({{{url}}})", + "None": "Aucun", + "The contract was not active during the selected date": "Le contrat n'était pas actif pendant la date sélectionnée", + "Cannot add more than one '1/2 day vacation'": "Vous ne pouvez pas ajouter plus d'un 'Vacances 1/2 jour'", + "This document already exists on this ticket": "Ce document existe déjà dans ce ticket", + "Some of the selected tickets are not billable": "Certains des tickets sélectionnés ne sont pas facturables", + "You can't invoice tickets from multiple clients": "Vous ne pouvez pas facturer des tickets de plusieurs clients", + "nickname": "surnom", + "INACTIVE_PROVIDER": "Fournisseur inactif", + "This client is not invoiceable": "Ce client n'est pas facturable", + "serial non editable": "Cette série ne permet pas d'assigner la référence", + "Max shipped required": "La date limite est requise", + "Can't invoice to future": "Vous ne pouvez pas facturer pour l'avenir", + "Can't invoice to past": "Vous ne pouvez pas facturer pour le passé", + "This ticket is already invoiced": "Ce ticket est déjà facturé", + "A ticket with an amount of zero can't be invoiced": "Un ticket avec un montant de zéro ne peut pas être facturé", + "A ticket with a negative base can't be invoiced": "Un ticket avec une base négative ne peut pas être facturé", + "Global invoicing failed": "[Facturation globale] Certains clients n'ont pas pu être facturés", + "Wasn't able to invoice the following clients": "Les clients suivants n'ont pas pu être facturés", + "Can't verify data unless the client has a business type": "Vous ne pouvez pas vérifier les données d'un client qui n'a pas de type d'entreprise", + "You don't have enough privileges to set this credit amount": "Vous n'avez pas suffisamment de privilèges pour établir ce montant de crédit", + "You can't change the credit set to zero from a financialBoss": "Vous ne pouvez pas modifier le crédit établi à zéro par un chef financier", + "Amounts do not match": "Les montants ne correspondent pas", + "The PDF document does not exist": "Le document PDF n'existe pas. Essayez de le régénérer depuis l'option 'Regénérer PDF facture'", + "The type of business must be filled in basic data": "Le type d'entreprise doit être rempli dans les données de base", + "You can't create a claim from a ticket delivered more than seven days ago": "Vous ne pouvez pas créer une réclamation pour un ticket livré il y a plus de sept jours", + "The worker has hours recorded that day": "Le travailleur a des heures enregistrées ce jour-là", + "The worker has a marked absence that day": "Le travailleur a une absence marquée ce jour-là", + "You can not modify is pay method checked": "Vous ne pouvez pas modifier le champ méthode de paiement validé", + "The account size must be exactly 10 characters": "La taille du compte doit être exactement de 10 caractères", + "Can't transfer claimed sales": "Vous ne pouvez pas transférer des lignes réclamées", + "You don't have privileges to create refund": "Vous n'avez pas les privilèges pour créer un abonnement", + "The item is required": "L'article est requis", + "The agency is already assigned to another autonomous": "L'agence est déjà assignée à un autre autonome", + "date in the future": "Date dans le futur", + "reference duplicated": "Référence dupliquée", + "This ticket is already a refund": "Ce ticket est déjà un abonnement", + "isWithoutNegatives": "Sans négatifs", + "routeFk": "routeFk", + "Can't change the password of another worker": "Vous ne pouvez pas changer le mot de passe d'un autre travailleur", + "No hay un contrato en vigor": "Il n'y a pas de contrat en vigueur", + "No se permite fichar a futuro": "Il n'est pas permis de pointer pour l'avenir", + "No está permitido trabajar": "Il n'est pas permis de travailler", + "Fichadas impares": "Pointages impairs", + "Descanso diario 12h.": "Repos quotidien de 12h.", + "Descanso semanal 36h. / 72h.": "Repos hebdomadaire de 36h / 72h.", + "Dirección incorrecta": "Adresse incorrecte", + "Modifiable user details only by an administrator": "Détails de l'utilisateur modifiables uniquement par un administrateur", + "Modifiable password only via recovery or by an administrator": "Mot de passe modifiable uniquement via la récupération ou par un administrateur", + "Not enough privileges to edit a client": "Vous n'avez pas suffisamment de privilèges pour éditer un client", + "This route does not exists": "Cette route n'existe pas", + "Claim pickup order sent": "Ordre de ramassage de la réclamation envoyé [{{claimId}}]({{{claimUrl}}}) au client *{{clientName}}*", + "You don't have grant privilege": "Vous n'avez pas le privilège de donner des privilèges", + "You don't own the role and you can't assign it to another user": "Vous n'êtes pas le propriétaire du rôle et vous ne pouvez pas l'assigner à un autre utilisateur", + "Ticket merged": "Ticket [{{originId}}]({{{originFullPath}}}) ({{{originDated}}}) fusionné avec [{{destinationId}}]({{{destinationFullPath}}}) ({{{destinationDated}}})", + "Already has this status": "A déjà cet état", + "There aren't records for this week": "Il n'y a pas d'enregistrements pour cette semaine", + "Empty data source": "Source de données vide", + "App locked": "Application verrouillée par l'utilisateur {{userId}}", + "Email verify": "Vérification de courriel", + "Landing cannot be lesser than shipment": "L'arrivée ne peut pas être inférieure à l'expédition", + "Receipt's bank was not found": "La banque du reçu n'a pas été trouvée", + "This receipt was not compensated": "Ce reçu n'a pas été compensé", + "Client's email was not found": "L'email du client n'a pas été trouvé", + "Negative basis": "Base négative", + "This worker code already exists": "Ce code de travailleur existe déjà", + "This personal mail already exists": "Ce courriel personnel existe déjà", + "This worker already exists": "Ce travailleur existe déjà", + "App name does not exist": "Le nom de l'application n'est pas valide", + "Try again": "Réessayez", + "Aplicación bloqueada por el usuario 9": "Application bloquée par l'utilisateur 9", + "Failed to upload delivery note": "Échec du téléchargement du bon de livraison {{id}}", + "The DOCUWARE PDF document does not exists": "Le document PDF Docuware n'existe pas", + "It is not possible to modify tracked sales": "Il n'est pas possible de modifier des lignes de commande qui ont commencé à être préparées", + "It is not possible to modify sales that their articles are from Floramondo": "Il n'est pas possible de modifier des lignes de commande dont les articles proviennent de Floramondo", + "It is not possible to modify cloned sales": "Il n'est pas possible de modifier des lignes de commande clonées", + "A supplier with the same name already exists. Change the country.": "Un fournisseur avec le même nom existe déjà. Changez le pays.", + "There is no assigned email for this client": "Il n'y a pas d'email assigné pour ce client", + "Exists an invoice with a future date": "Il existe une facture avec une date future", + "Invoice date can't be less than max date": "La date de la facture ne peut pas être inférieure à la date limite", + "Warehouse inventory not set": "L'inventaire de l'entrepôt n'est pas établi", + "This locker has already been assigned": "Ce casier a déjà été assigné", + "Tickets with associated refunds": "Vous ne pouvez pas supprimer des tickets avec des remboursements associés. Ce ticket est associé au remboursement Nº %d", + "Not exist this branch": "La branche n'existe pas", + "This ticket cannot be signed because it has not been boxed": "Ce ticket ne peut pas être signé car il n'a pas été emballé", + "Collection does not exist": "La collection n'existe pas", + "Cannot obtain exclusive lock": "Impossible d'obtenir un verrou exclusif", + "Insert a date range": "Insérez une plage de dates", + "Added observation": "{{user}} a ajouté cette observation : {{text}}", + "Comment added to client": "Observation ajoutée au client {{clientFk}}", + "Invalid auth code": "Code de vérification incorrect", + "Invalid or expired verification code": "Code de vérification incorrect ou expiré", + "Cannot create a new claimBeginning from a different ticket": "Vous ne pouvez pas créer une ligne de réclamation d'un ticket différent de l'origine", + "company": "Compagnie", + "country": "Pays", + "clientId": "Id client", + "clientSocialName": "Client", + "amount": "Montant", + "taxableBase": "Base", + "ticketFk": "Id ticket", + "isActive": "Actif", + "hasToInvoice": "Facturer", + "isTaxDataChecked": "Données vérifiées", + "comercialId": "Id commercial", + "comercialName": "Commercial", + "Pass expired": "Le mot de passe a expiré, changez-le depuis Salix", + "Invalid NIF for VIES": "NIF invalide pour VIES", + "Ticket does not exist": "Ce ticket n'existe pas", + "Ticket is already signed": "Ce ticket a déjà été signé", + "Authentication failed": "Échec de l'authentification", + "You can't use the same password": "Vous ne pouvez pas utiliser le même mot de passe", + "You can only add negative amounts in refund tickets": "Vous ne pouvez ajouter que des montants négatifs dans les tickets de remboursement", + "Fecha fuera de rango": "Date hors plage", + "Error while generating PDF": "Erreur lors de la génération du PDF", + "Error when sending mail to client": "Erreur lors de l'envoi du courrier au client", + "Mail not sent": "Une erreur est survenue lors de l'envoi de la facture au client [{{clientId}}]({{{clientUrl}}}), veuillez vérifier l'adresse électronique", + "The renew period has not been exceeded": "La période de renouvellement n'a pas été dépassée", + "Valid priorities": "Priorités valides : %d", + "hasAnyNegativeBase": "Base négative pour les tickets : {{ticketsIds}}", + "hasAnyPositiveBase": "Base positives pour les tickets : {{ticketsIds}}", + "You cannot assign an alias that you are not assigned to": "Vous ne pouvez pas attribuer un alias que vous n'avez pas reçu", + "This ticket cannot be left empty.": "Ce ticket ne peut pas être laissé vide. %s", + "The company has not informed the supplier account for bank transfers": "L'entreprise n'a pas informé le compte du fournisseur pour les transferts bancaires", + "You cannot assign/remove an alias that you are not assigned to": "Vous ne pouvez pas attribuer/supprimer un alias que vous n'avez pas reçu", + "This invoice has a linked vehicle.": "Cette facture a un véhicule lié", + "You don't have enough privileges.": "Vous n'avez pas suffisamment de privilèges.", + "This ticket is locked": "Ce ticket est bloqué.", + "This ticket is not editable.": "Ce ticket n'est pas modifiable.", + "The ticket doesn't exist.": "Le ticket n'existe pas.", + "Social name should be uppercase": "La raison sociale doit être en majuscules", + "Street should be uppercase": "L'adresse fiscale doit être en majuscules", + "Ticket without Route": "Ticket sans itinéraire", + "Select a different client": "Sélectionnez un client différent", + "Fill all the fields": "Remplissez tous les champs", + "The response is not a PDF": "La réponse n'est pas un PDF", + "Booking completed": "Réservation terminée", + "The ticket is in preparation": "Le ticket [{{ticketId}}]({{{ticketUrl}}}) du commercial {{salesPersonId}} est en préparation", + "The notification subscription of this worker cant be modified": "L'abonnement à la notification de ce travailleur ne peut pas être modifié", + "User disabled": "Utilisateur désactivé", + "The amount cannot be less than the minimum": "La quantité ne peut pas être inférieure à la quantité minimale", + "quantityLessThanMin": "La quantité ne peut pas être inférieure à la quantité minimale", + "Cannot past travels with entries": "Vous ne pouvez pas passer des envois avec des entrées", + "It was not able to remove the next expeditions:": "Il n'a pas été possible de supprimer les expéditions suivantes : {{expeditions}}", + "This claim has been updated": "La réclamation avec l'Id : {{claimId}}, a été mise à jour", + "This user does not have an assigned tablet": "Cet utilisateur n'a pas de tablette assignée", + "Field are invalid": "Le champ '{{tag}}' n'est pas valide", + "Incorrect pin": "Pin incorrect.", + "You already have the mailAlias": "Vous avez déjà cet alias de courrier", + "The alias cant be modified": "Cet alias de courrier ne peut pas être modifié", + "No tickets to invoice": "Pas de tickets à facturer", + "this warehouse has not dms": "L'entrepôt n'accepte pas les documents", + "This ticket already has a cmr saved": "Ce ticket a déjà un cmr enregistré", + "Name should be uppercase": "Le nom doit être en majuscules", + "Bank entity must be specified": "L'entité bancaire doit être spécifiée", + "An email is necessary": "Un email est nécessaire", + "You cannot update these fields": "Vous ne pouvez pas mettre à jour ces champs", + "CountryFK cannot be empty": "Le pays ne peut pas être vide", + "Cmr file does not exist": "Le fichier cmr n'existe pas", + "You are not allowed to modify the alias": "Vous n'êtes pas autorisé à modifier l'alias", + "The address of the customer must have information about Incoterms and Customs Agent": "L'adresse du client doit contenir des informations sur les Incoterms et l'agent des douanes", + "The line could not be marked": "La ligne ne peut pas être marquée", + "This password can only be changed by the user themselves": "Ce mot de passe ne peut être modifié que par l'utilisateur lui-même", + "They're not your subordinate": "Ce n'est pas votre subordonné.", + "No results found": "Aucun résultat trouvé", + "InvoiceIn is already booked": "La facture reçue est déjà comptabilisée", + "This workCenter is already assigned to this agency": "Ce centre de travail est déjà assigné à cette agence", + "Select ticket or client": "Choisissez un ticket ou un client", + "It was not able to create the invoice": "Il n'a pas été possible de créer la facture" +} \ No newline at end of file diff --git a/loopback/locale/pt.json b/loopback/locale/pt.json new file mode 100644 index 000000000..b11eeefc6 --- /dev/null +++ b/loopback/locale/pt.json @@ -0,0 +1,360 @@ +{ + "Phone format is invalid": "O formato do telefone não é válido", + "You are not allowed to change the credit": "Você não tem permissão para alterar o crédito", + "Unable to mark the equivalence surcharge": "Não é possível marcar a sobretaxa de equivalência", + "The default consignee can not be unchecked": "Não é possível desmarcar o destinatário padrão", + "Unable to default a disabled consignee": "Não é possível definir como padrão um destinatário desativado", + "Can't be blank": "Não pode estar em branco", + "Invalid TIN": "NIF/CIF inválido", + "TIN must be unique": "O NIF/CIF deve ser único", + "A client with that Web User name already exists": "Já existe um cliente com esse nome de usuário da web", + "Is invalid": "É inválido", + "Quantity cannot be zero": "A quantidade não pode ser zero", + "Enter an integer different to zero": "Digite um inteiro diferente de zero", + "Package cannot be blank": "A embalagem não pode estar em branco", + "The company name must be unique": "O nome da empresa deve ser único", + "Invalid email": "Email inválido", + "The IBAN does not have the correct format": "O IBAN não tem o formato correto", + "That payment method requires an IBAN": "Esse método de pagamento requer um IBAN", + "That payment method requires a BIC": "Esse método de pagamento requer um BIC", + "State cannot be blank": "O estado não pode estar em branco", + "Worker cannot be blank": "O trabalhador não pode estar em branco", + "Cannot change the payment method if no salesperson": "Não é possível alterar o método de pagamento se não houver vendedor", + "can't be blank": "não pode estar em branco", + "Observation type must be unique": "O tipo de observação deve ser único", + "The credit must be an integer greater than or equal to zero": "O crédito deve ser um número inteiro maior ou igual a zero", + "The grade must be similar to the last one": "A nota deve ser semelhante à última", + "Only manager can change the credit": "Apenas o gerente pode alterar o crédito deste cliente", + "Name cannot be blank": "O nome não pode estar em branco", + "Phone cannot be blank": "O telefone não pode estar em branco", + "Period cannot be blank": "O período não pode estar em branco", + "Choose a company": "Escolha uma empresa", + "Se debe rellenar el campo de texto": "Você deve preencher o campo de texto", + "Description should have maximum of 45 characters": "A descrição deve ter no máximo 45 caracteres", + "Cannot be blank": "Não pode estar em branco", + "The grade must be an integer greater than or equal to zero": "A nota deve ser um número inteiro maior ou igual a zero", + "Sample type cannot be blank": "O tipo de amostra não pode estar em branco", + "Description cannot be blank": "A descrição não pode estar em branco", + "The price of the item changed": "O preço do item mudou", + "The value should not be greater than 100%": "O valor não deve ser maior que 100%", + "The value should be a number": "O valor deve ser um número", + "This order is not editable": "Esta ordem não é editável", + "You can't create an order for a frozen client": "Você não pode criar um pedido para um cliente congelado", + "You can't create an order for a client that has a debt": "Você não pode criar um pedido para um cliente com dívida", + "is not a valid date": "não é uma data válida", + "Barcode must be unique": "O código de barras deve ser único", + "The warehouse can't be repeated": "O armazém não pode ser repetido", + "The tag or priority can't be repeated for an item": "A tag ou prioridade não pode ser repetida para um item", + "The observation type can't be repeated": "O tipo de observação não pode ser repetido", + "A claim with that sale already exists": "Já existe uma reclamação com essa venda", + "You don't have enough privileges to change that field": "Você não tem privilégios suficientes para alterar esse campo", + "Warehouse cannot be blank": "O armazém não pode estar em branco", + "Agency cannot be blank": "A agência não pode estar em branco", + "Not enough privileges to edit a client with verified data": "Não há privilégios suficientes para editar um cliente com dados verificados", + "This address doesn't exist": "Este endereço não existe", + "You must delete the claim id %d first": "Você deve excluir a reclamação %d primeiro", + "You don't have enough privileges": "Você não tem privilégios suficientes", + "Cannot check Equalization Tax in this NIF/CIF": "Não é possível verificar o Imposto de Equalização neste NIF/CIF", + "You can't make changes on the basic data of an confirmed order or with rows": "Você não pode fazer alterações nos dados básicos de um pedido confirmado ou com linhas", + "INVALID_USER_NAME": "O nome de usuário só pode conter letras minúsculas ou, a partir do segundo caractere, números ou sublinhados, o uso da letra ñ não é permitido", + "You can't create a ticket for a frozen client": "Você não pode criar um ticket para um cliente congelado", + "You can't create a ticket for an inactive client": "Você não pode criar um ticket para um cliente inativo", + "Tag value cannot be blank": "O valor da tag não pode estar em branco", + "ORDER_EMPTY": "Cesta vazia", + "You don't have enough privileges to do that": "Você não tem privilégios suficientes para fazer isso", + "NO SE PUEDE DESACTIVAR EL CONSIGNAT": "NÃO É POSSÍVEL DESATIVAR O CONSIGNATÁRIO", + "Error. El NIF/CIF está repetido": "Erro. O NIF/CIF está repetido", + "Street cannot be empty": "A rua não pode estar vazia", + "City cannot be empty": "A cidade não pode estar vazia", + "Code cannot be blank": "O código não pode estar em branco", + "You cannot remove this department": "Você não pode remover este departamento", + "The extension must be unique": "A extensão deve ser única", + "The secret can't be blank": "O segredo não pode estar em branco", + "We weren't able to send this SMS": "Não conseguimos enviar este SMS", + "This client can't be invoiced": "Este cliente não pode ser faturado", + "You must provide the correction information to generate a corrective invoice": "Você deve fornecer as informações de correção para gerar uma fatura corretiva", + "This ticket can't be invoiced": "Este ticket não pode ser faturado", + "You cannot add or modify services to an invoiced ticket": "Você não pode adicionar ou modificar serviços a um ticket faturado", + "This ticket can not be modified": "Este ticket não pode ser modificado", + "The introduced hour already exists": "A hora introduzida já existe", + "INFINITE_LOOP": "Loop infinito", + "The sales of the receiver ticket can't be modified": "As vendas do ticket receptor não podem ser modificadas", + "NO_AGENCY_AVAILABLE": "Nenhuma agência disponível", + "ERROR_PAST_SHIPMENT": "Erro. Data de envio no passado", + "The current ticket can't be modified": "O ticket atual não pode ser modificado", + "The current claim can't be modified": "A reclamação atual não pode ser modificada", + "The sales of this ticket can't be modified": "As vendas deste ticket não podem ser modificadas", + "The sales do not exists": "As vendas não existem", + "Please select at least one sale": "Por favor, selecione pelo menos uma venda", + "All sales must belong to the same ticket": "Todas as vendas devem pertencer ao mesmo ticket", + "NO_ZONE_FOR_THIS_PARAMETERS": "Nenhuma zona para estes parâmetros", + "This item doesn't exists": "Este item não existe", + "NOT_ZONE_WITH_THIS_PARAMETERS": "Nenhuma zona para estes parâmetros", + "Extension format is invalid": "O formato da extensão é inválido", + "Invalid parameters to create a new ticket": "Parâmetros inválidos para criar um novo ticket", + "This item is not available": "Este item não está disponível", + "This postcode already exists": "Este código postal já existe", + "Concept cannot be blank": "O conceito não pode estar em branco", + "File doesn't exists": "O arquivo não existe", + "You don't have privileges to change the zone": "Você não tem privilégios para alterar a zona", + "This ticket is already on weekly tickets": "Este ticket já está em tickets semanais", + "Ticket id cannot be blank": "O id do ticket não pode ficar em branco", + "Weekday cannot be blank": "O dia da semana não pode ficar em branco", + "You can't delete a confirmed order": "Você não pode excluir um pedido confirmado", + "The social name has an invalid format": "O nome social tem um formato inválido", + "Invalid quantity": "Quantidade inválida", + "This postal code is not valid": "Este código postal não é válido", + "is invalid": "é inválido", + "The postcode doesn't exist. Please enter a correct one": "O código postal não existe. Por favor, insira um correto", + "The department name can't be repeated": "O nome do departamento não pode ser repetido", + "This phone already exists": "Este telefone já existe", + "You cannot move a parent to its own sons": "Você não pode mover um pai para seus próprios filhos", + "You can't create a claim for a removed ticket": "Você não pode criar uma reclamação para um ticket removido", + "You cannot delete a ticket that part of it is being prepared": "Você não pode excluir um ticket que parte dele está sendo preparada", + "You must delete all the buy requests first": "Você deve excluir todas as solicitações de compra primeiro", + "You should specify a date": "Você deve especificar uma data", + "You should specify at least a start or end date": "Você deve especificar pelo menos uma data de início ou fim", + "Start date should be lower than end date": "A data de início deve ser anterior à data de término", + "You should mark at least one week day": "Você deve marcar pelo menos um dia da semana", + "Swift / BIC can't be empty": "Swift / BIC não pode ficar vazio", + "Customs agent is required for a non UEE member": "O agente alfandegário é necessário para um cliente não UEE", + "Incoterms is required for a non UEE member": "Incoterms são necessários para um cliente não UEE", + "Deleted sales from ticket": "Vendas excluídas do ticket [{{ticketId}}]({{{ticketUrl}}}): {{{deletions}}}", + "Added sale to ticket": "Venda adicionada ao ticket [{{ticketId}}]({{{ticketUrl}}}): {{{addition}}}", + "Changed sale discount": "Desconto da venda alterado no ticket [{{ticketId}}]({{{ticketUrl}}}): {{{changes}}}", + "Created claim": "Reclamação criada [{{claimId}}]({{{claimUrl}}}) no ticket [{{ticketId}}]({{{ticketUrl}}}): {{{changes}}}", + "Changed sale price": "Preço da venda alterado para [{{itemId}} {{concept}}]({{{itemUrl}}}) ({{quantity}}) de {{oldPrice}}€ ➔ *{{newPrice}}€* no ticket [{{ticketId}}]({{{ticketUrl}}})", + "Changed sale quantity": "Quantidade da venda alterada para [{{itemId}} {{concept}}]({{{itemUrl}}}) de {{oldQuantity}} ➔ *{{newQuantity}}* no ticket [{{ticketId}}]({{{ticketUrl}}})", + "State": "Estado", + "regular": "normal", + "reserved": "reservado", + "Changed sale reserved state": "Estado de reserva da venda alterado no ticket [{{ticketId}}]({{{ticketUrl}}}): {{{changes}}}", + "Bought units from buy request": "Unidades compradas da solicitação de compra [{{itemId}} {{concept}}]({{{urlItem}}}) para o ticket id [{{ticketId}}]({{{url}}})", + "Deny buy request": "Solicitação de compra negada para o ticket id [{{ticketId}}]({{{url}}}). Motivo: {{observation}}", + "MESSAGE_INSURANCE_CHANGE": "Crédito segurado do cliente [{{clientName}} ({{clientId}})]({{{url}}}) alterado para *{{credit}} €*", + "Changed client paymethod": "Forma de pagamento do cliente [{{clientName}} ({{clientId}}) alterada", + "Sent units from ticket": "*{{quantity}}* Unidades enviadas de [{{concept}} ({{itemId}})]({{{itemUrl}}}) a *\"{{nickname}}\"* provenientes del ticket id [{{ticketId}}]({{{ticketUrl}}})", + "Change quantity": "{{concept}} mudou de {{oldQuantity}} para {{newQuantity}}", + "Claim will be picked": "Reclamação será recolhida [({{claimId}})]({{{claimUrl}}}) do cliente *{{clientName}}*, com tipo de coleta *{{claimPickup}}*", + "Claim state has changed to": "Estado da reclamação alterado para {{newState}} ({{claimId}}) do cliente {{clientName}}", + "Client checked as validated despite of duplication": "Cliente verificado apesar da duplicação do id {{clientId}}", + "ORDER_ROW_UNAVAILABLE": "Esta linha de pedido não está disponível", + "Distance must be lesser than 4000": "A distância deve ser menor que 4000", + "This ticket is deleted": "Este ticket foi excluído", + "Unable to clone this travel": "Não foi possível clonar esta viagem", + "This thermograph id already exists": "Esta id de termógrafo já existe", + "Choose a date range or days forward": "Escolha um intervalo de datas ou dias adiante", + "ORDER_ALREADY_CONFIRMED": "PEDIDO JÁ CONFIRMADO", + "Invalid password": "Senha inválida", + "Password does not meet requirements": "Senha não atende aos requisitos", + "Role already assigned": "Função já atribuída", + "Invalid role name": "Nome da função inválido", + "Role name must be written in camelCase": "O nome da função deve ser escrito em camelCase", + "Email already exists": "O e-mail já existe", + "User already exists": "O usuário já existe", + "Absence change notification on the labour calendar": "Notificação de mudança de ausência no calendário trabalhista", + "Record of hours week": "Registro de horas semana {{week}} ano {{year}} ", + "Created absence": "O funcionário {{author}} adicionou uma ausência do tipo '{{absenceType}}' para {{employee}} no dia {{dated}}.", + "Deleted absence": "O funcionário {{author}} excluiu uma ausência do tipo '{{absenceType}}' de {{employee}} no dia {{dated}}.", + "I have deleted the ticket id": "Eu excluí o id do ticket [{{id}}]({{{url}}})", + "I have restored the ticket id": "Eu restaurei o id do ticket [{{id}}]({{{url}}})", + "You can only restore a ticket within the first hour after deletion": "Você só pode restaurar um ticket dentro da primeira hora após a exclusão", + "Changed this data from the ticket": "Estes dados do ticket [{{ticketId}}]({{{ticketUrl}}}): {{{changes}}}", + "agencyModeFk": "Agência", + "clientFk": "Cliente", + "zoneFk": "Zona", + "warehouseFk": "Armazém", + "shipped": "Enviado", + "landed": "Entregue", + "addressFk": "Destinatário", + "companyFk": "Empresa", + "agency": "Agência", + "delivery": "Entrega", + "The social name cannot be empty": "O nome social não pode estar vazio", + "The nif cannot be empty": "O NIF não pode estar vazio", + "You need to fill sage information before you check verified data": "Você precisa preencher as informações do sage antes de verificar os dados verificados", + "ASSIGN_ZONE_FIRST": "Atribua uma zona primeiro", + "Amount cannot be zero": "O valor não pode ser zero", + "Company has to be official": "A empresa deve ser oficial", + "You can not select this payment method without a registered bankery account": "Você não pode selecionar este método de pagamento sem uma conta bancária registrada", + "Action not allowed on the test environment": "Ação não permitida no ambiente de teste", + "The selected ticket is not suitable for this route": "O ticket selecionado não é adequado para esta rota", + "New ticket request has been created with price": "Nova solicitação de ticket criada para o dia {{shipped}}, com uma quantidade de {{quantity}} e um preço de {{price}} €", + "New ticket request has been created": "Nova solicitação de ticket criada para o dia {{shipped}}, com uma quantidade de {{quantity}}", + "Swift / BIC cannot be empty": "Swift / BIC não pode ficar vazio", + "This BIC already exist.": "Este BIC já existe.", + "That item doesn't exists": "Esse item não existe", + "There's a new urgent ticket:": "Há um novo ticket urgente:", + "Invalid account": "Conta inválida", + "Compensation account is empty": "A conta de compensação está vazia", + "This genus already exist": "Este gênero já existe", + "This specie already exist": "Esta espécie já existe", + "Client assignment has changed": "A atribuição do cliente foi alterada de ~*\"<{{previousWorkerName}}>\"*~ por *\"<{{currentWorkerName}}>\"* del cliente [{{clientName}} ({{clientId}})]({{{url}}})", + "None": "Nenhum", + "The contract was not active during the selected date": "O contrato não estava ativo durante a data selecionada", + "Cannot add more than one '1/2 day vacation'": "Não é possível adicionar mais de um 'meio dia de férias'", + "This document already exists on this ticket": "Este documento já existe neste ticket", + "Some of the selected tickets are not billable": "Alguns dos tickets selecionados não são faturáveis", + "You can't invoice tickets from multiple clients": "Você não pode faturar tickets de múltiplos clientes", + "nickname": "apelido", + "INACTIVE_PROVIDER": "Fornecedor inativo", + "This client is not invoiceable": "Este cliente não é faturável", + "serial non editable": "Este série não é editável", + "Max shipped required": "A data limite é requerida", + "Can't invoice to future": "Não é possível faturar para o futuro", + "Can't invoice to past": "Não é possível faturar para o passado", + "This ticket is already invoiced": "Este ticket já está faturado", + "A ticket with an amount of zero can't be invoiced": "Um ticket com um valor zero não pode ser faturado", + "A ticket with a negative base can't be invoiced": "Um ticket com uma base negativa não pode ser faturado", + "Global invoicing failed": "[Faturamento global] Não foi possível faturar alguns clientes", + "Wasn't able to invoice the following clients": "Não foi possível faturar os seguintes clientes", + "Can't verify data unless the client has a business type": "Não é possível verificar os dados a menos que o cliente tenha um tipo de negócio", + "You don't have enough privileges to set this credit amount": "Você não tem privilégios suficientes para definir este valor de crédito", + "You can't change the credit set to zero from a financialBoss": "Você não pode alterar o crédito definido como zero de um financeiro chefe", + "Amounts do not match": "Os valores não correspondem", + "The PDF document does not exist": "O documento PDF não existe. Tente regenerá-lo na opção 'Regenerar PDF da fatura'", + "The type of business must be filled in basic data": "O tipo de negócio deve ser preenchido nos dados básicos", + "You can't create a claim from a ticket delivered more than seven days ago": "Você não pode criar uma reclamação de um ticket entregue há mais de sete dias", + "The worker has hours recorded that day": "O trabalhador tem horas registradas nesse dia", + "The worker has a marked absence that day": "O trabalhador tem uma ausência marcada nesse dia", + "You can not modify is pay method checked": "Você não pode modificar o método de pagamento verificado", + "The account size must be exactly 10 characters": "O tamanho da conta deve ser exatamente de 10 caracteres", + "Can't transfer claimed sales": "Não é possível transferir vendas reclamadas", + "You don't have privileges to create refund": "Você não tem privilégios para criar um reembolso", + "The item is required": "O item é necessário", + "The agency is already assigned to another autonomous": "A agência já está atribuída a outro autônomo", + "date in the future": "Data no futuro", + "reference duplicated": "Referência duplicada", + "This ticket is already a refund": "Este ticket já é um reembolso", + "isWithoutNegatives": "Sem negativos", + "routeFk": "routeFk", + "Can't change the password of another worker": "Não é possível alterar a senha de outro trabalhador", + "No hay un contrato en vigor": "Não há um contrato em vigor", + "No se permite fichar a futuro": "Não é permitido marcar o ponto no futuro", + "No está permitido trabajar": "Não está permitido trabalhar", + "Fichadas impares": "Fichadas ímpares", + "Descanso diario 12h.": "Descanso diário 12h.", + "Descanso semanal 36h. / 72h.": "Descanso semanal 36h. / 72h.", + "Dirección incorrecta": "Endereço incorreto", + "Modifiable user details only by an administrator": "Detalhes do usuário modificáveis apenas por um administrador", + "Modifiable password only via recovery or by an administrator": "Senha modificável apenas via recuperação ou por um administrador", + "Not enough privileges to edit a client": "Não há privilégios suficientes para editar um cliente", + "This route does not exists": "Esta rota não existe", + "Claim pickup order sent": "Ordem de retirada de reclamação enviada [{{claimId}}]({{{claimUrl}}}) o cliente *{{clientName}}*", + "You don't have grant privilege": "Você não tem privilégio de concessão", + "You don't own the role and you can't assign it to another user": "Você não é proprietário do papel e não pode atribuí-lo a outro usuário", + "Ticket merged": "Ticket [{{originId}}]({{{originFullPath}}}) ({{{originDated}}}) mesclado com [{{destinationId}}]({{{destinationFullPath}}}) ({{{destinationDated}}})", + "Already has this status": "Já tem este status", + "There aren't records for this week": "Não há registros para esta semana", + "Empty data source": "Fonte de dados vazia", + "App locked": "Aplicativo bloqueado pelo usuário {{userId}}", + "Email verify": "Verificação de e-mail", + "Landing cannot be lesser than shipment": "O pouso não pode ser menor que o envio", + "Receipt's bank was not found": "Banco do recibo não encontrado", + "This receipt was not compensated": "Este recibo não foi compensado", + "Client's email was not found": "E-mail do cliente não encontrado", + "Negative basis": "Base negativa", + "This worker code already exists": "Este código de trabalhador já existe", + "This personal mail already exists": "Este e-mail pessoal já existe", + "This worker already exists": "Este trabalhador já existe", + "App name does not exist": "O nome do aplicativo não existe", + "Try again": "Tente novamente", + "Aplicación bloqueada por el usuario 9": "Aplicação bloqueada pelo usuário 9", + "Failed to upload delivery note": "Falha ao carregar nota de entrega {{id}}", + "The DOCUWARE PDF document does not exists": "O documento PDF DOCUWARE não existe", + "It is not possible to modify tracked sales": "Não é possível modificar vendas rastreadas", + "It is not possible to modify sales that their articles are from Floramondo": "Não é possível modificar vendas cujos artigos são da Floramondo", + "It is not possible to modify cloned sales": "Não é possível modificar vendas clonadas", + "A supplier with the same name already exists. Change the country.": "Já existe um fornecedor com o mesmo nome. Mude o país.", + "There is no assigned email for this client": "Não há e-mail atribuído para este cliente", + "Exists an invoice with a future date": "Existe uma fatura com data futura", + "Invoice date can't be less than max date": "A data da fatura não pode ser menor que a data máxima", + "Warehouse inventory not set": "Inventário do armazém não configurado", + "This locker has already been assigned": "Este armário já foi atribuído", + "Tickets with associated refunds": "Tickets com reembolsos associados", + "Not exist this branch": "Esta filial não existe", + "This ticket cannot be signed because it has not been boxed": "Este ticket não pode ser assinado porque não foi encaixotado", + "Collection does not exist": "Coleção não existe", + "Cannot obtain exclusive lock": "Não é possível obter um bloqueio exclusivo", + "Insert a date range": "Insira um intervalo de datas", + "Added observation": "{{user}} adicionou esta observação: {{text}}", + "Comment added to client": "Comentário adicionado ao cliente {{clientFk}}", + "Invalid auth code": "Código de autenticação inválido", + "Invalid or expired verification code": "Código de verificação inválido ou expirado", + "Cannot create a new claimBeginning from a different ticket": "Não é possível criar um novo reclamação a partir de um ticket diferente", + "company": "Empresa", + "country": "País", + "clientId": "Id do cliente", + "clientSocialName": "Cliente", + "amount": "Quantidade", + "taxableBase": "Base tributável", + "ticketFk": "Id do ticket", + "isActive": "Está ativo", + "hasToInvoice": "Tem que faturar", + "isTaxDataChecked": "Dados fiscais verificados", + "comercialId": "Id do comercial", + "comercialName": "Comercial", + "Pass expired": "A senha expirou, altere-a pelo Salix", + "Invalid NIF for VIES": "NIF inválido para VIES", + "Ticket does not exist": "Este ticket não existe", + "Ticket is already signed": "Este ticket já está assinado", + "Authentication failed": "Autenticação falhou", + "You can't use the same password": "Você não pode usar a mesma senha", + "You can only add negative amounts in refund tickets": "Você só pode adicionar quantidades negativas em tickets de reembolso", + "Fecha fuera de rango": "Data fora do intervalo", + "Error while generating PDF": "Erro ao gerar PDF", + "Error when sending mail to client": "Erro ao enviar e-mail para o cliente", + "Mail not sent": "E-mail não enviado cliente [{{clientId}}]({{{clientUrl}}})", + "The renew period has not been exceeded": "O período de renovação não foi excedido", + "Valid priorities": "Prioridades válidas", + "hasAnyNegativeBase": "Base negativa para os tickets", + "hasAnyPositiveBase": "Bases positivas para os tickets", + "You cannot assign an alias that you are not assigned to": "Você não pode atribuir um alias que não está atribuído a você", + "This ticket cannot be left empty.": "Este ticket não pode ficar vazio.", + "The company has not informed the supplier account for bank transfers": "A empresa não informou a conta do fornecedor para transferências bancárias", + "You cannot assign/remove an alias that you are not assigned to": "Você não pode atribuir/remover um alias que não está atribuído a você", + "This invoice has a linked vehicle.": "Esta fatura tem um veículo vinculado", + "You don't have enough privileges.": "Você não tem privilégios suficientes.", + "This ticket is locked": "Este ticket está bloqueado.", + "This ticket is not editable.": "Este ticket não é editável.", + "The ticket doesn't exist.": "O ticket não existe.", + "Social name should be uppercase": "O nome social deve estar em maiúsculas", + "Street should be uppercase": "A rua deve estar em maiúsculas", + "Ticket without Route": "Ticket sem rota", + "Select a different client": "Selecione um cliente diferente", + "Fill all the fields": "Preencha todos os campos", + "The response is not a PDF": "A resposta não é um PDF", + "Booking completed": "Reserva concluída", + "The ticket is in preparation": "O ticket está em preparação [{{ticketId}}]({{{ticketUrl}}}) comercial {{salesPersonId}}", + "The notification subscription of this worker cant be modified": "A inscrição de notificação deste trabalhador não pode ser modificada", + "User disabled": "Usuário desativado", + "The amount cannot be less than the minimum": "O valor não pode ser menor que o mínimo", + "quantityLessThanMin": "Quantidade menor que o mínimo", + "Cannot past travels with entries": "Não é possível passar viagens com entradas", + "It was not able to remove the next expeditions:": "Não foi possível remover as próximas expedições:", + "This claim has been updated": "Esta reclamação foi atualizada", + "This user does not have an assigned tablet": "Este usuário não tem um tablet atribuído", + "Field are invalid": "Campos inválidos", + "Incorrect pin": "PIN incorreto.", + "You already have the mailAlias": "Você já tem o alias de e-mail", + "The alias cant be modified": "O alias não pode ser modificado", + "No tickets to invoice": "Não há tickets para faturar", + "this warehouse has not dms": "Este armazém não tem DMS", + "This ticket already has a cmr saved": "Este ticket já tem um CMR salvo", + "Name should be uppercase": "O nome deve estar em maiúsculas", + "Bank entity must be specified": "A entidade bancária deve ser especificada", + "An email is necessary": "Um e-mail é necessário", + "You cannot update these fields": "Você não pode atualizar estes campos", + "CountryFK cannot be empty": "CountryFK não pode estar vazio", + "Cmr file does not exist": "O arquivo CMR não existe", + "You are not allowed to modify the alias": "Você não tem permissão para modificar o alias", + "The address of the customer must have information about Incoterms and Customs Agent": "O endereço do cliente deve ter informações sobre Incoterms e Agente Aduaneiro", + "The line could not be marked": "A linha não pôde ser marcada", + "This password can only be changed by the user themselves": "Esta senha só pode ser alterada pelo próprio usuário", + "They're not your subordinate": "Eles não são seus subordinados.", + "No results found": "Nenhum resultado encontrado", + "InvoiceIn is already booked": "InvoiceIn já está reservado", + "This workCenter is already assigned to this agency": "Este centro de trabalho já está atribuído a esta agência", + "Select ticket or client": "Selecione um ticket ou cliente", + "It was not able to create the invoice": "Não foi possível criar a fatura" +} \ No newline at end of file From b5402a3f2fa4f4d38e39f32808f9ff40c75cb59c Mon Sep 17 00:00:00 2001 From: Pako Date: Fri, 3 May 2024 10:44:57 +0200 Subject: [PATCH 14/18] defaultSector --- db/versions/11029-tealAnthurium/00-firstScript.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 db/versions/11029-tealAnthurium/00-firstScript.sql diff --git a/db/versions/11029-tealAnthurium/00-firstScript.sql b/db/versions/11029-tealAnthurium/00-firstScript.sql new file mode 100644 index 000000000..b54e7a3b5 --- /dev/null +++ b/db/versions/11029-tealAnthurium/00-firstScript.sql @@ -0,0 +1,2 @@ +-- Place your SQL code here +ALTER TABLE vn.productionConfig ADD defaultSectorFk INT UNSIGNED DEFAULT 37 NOT NULL COMMENT 'Default sector'; From 8b11a4a2902549e9230311e703f4ed737cbe013e Mon Sep 17 00:00:00 2001 From: pablone Date: Fri, 3 May 2024 12:08:22 +0200 Subject: [PATCH 15/18] fix: refs #6005 time issue --- modules/worker/back/models/operator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/worker/back/models/operator.js b/modules/worker/back/models/operator.js index 1ebc1643c..d1a30f7db 100644 --- a/modules/worker/back/models/operator.js +++ b/modules/worker/back/models/operator.js @@ -18,7 +18,7 @@ module.exports = Self => { const {backupPrinterNotificationDelay} = await models.ProductionConfig.findOne(); if (backupPrinterNotificationDelay) { const notifications = await models.NotificationQueue.find( - {where: {created: {gte: Date.vnNow() - (backupPrinterNotificationDelay * 1000) + (3600 * 1000)}, + {where: {created: {gte: new Date(Date.vnNow() - (backupPrinterNotificationDelay * 1000))}, notificationFk: notificationName, status: 'sent' } From 48bfba71de0cfa8867f89db0a2d5e4c9b20dd2de Mon Sep 17 00:00:00 2001 From: pablone Date: Fri, 3 May 2024 12:33:59 +0200 Subject: [PATCH 16/18] fix: refs #6005 runtime --- modules/worker/back/models/operator.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/worker/back/models/operator.js b/modules/worker/back/models/operator.js index 1ebc1643c..51995270e 100644 --- a/modules/worker/back/models/operator.js +++ b/modules/worker/back/models/operator.js @@ -30,8 +30,7 @@ module.exports = Self => { return Object.keys(criteria).every(key => criteria[key] === paramsObj?.[key]); }); - if (filteredNotifications.length >= 1) - throw new Error('Previous notification sended with the same parameters'); + if (filteredNotifications.length >= 1) return; } await models.NotificationQueue.create({ From 3ae192c7611130434991179827ff900890454cbc Mon Sep 17 00:00:00 2001 From: pablone Date: Fri, 3 May 2024 12:52:12 +0200 Subject: [PATCH 17/18] fix: refs #6005 fix test --- .../methods/operator/spec/operator.spec.js | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/modules/worker/back/methods/operator/spec/operator.spec.js b/modules/worker/back/methods/operator/spec/operator.spec.js index 8a7d05298..c80a6542d 100644 --- a/modules/worker/back/methods/operator/spec/operator.spec.js +++ b/modules/worker/back/methods/operator/spec/operator.spec.js @@ -52,18 +52,16 @@ describe('Operator', () => { }); it('should not sent notification when is already notified by another worker', async() => { - try { - await models.NotificationQueue.create({ - authorFk: 2, - notificationFk: notificationName, - params: JSON.stringify({'labelerId': labeler, 'sectorId': sectorId, 'workerId': 2}), - created: '2001-01-01 12:30:00', - status: sentStatus - }); - await models.Operator.updateAll({id: 1}, {labelerFk: labeler, sectorFk: sectorId}); - } catch (e) { - expect(e.message).toEqual('Previous notification sended with the same parameters'); - } + const {id} = await models.NotificationQueue.create({ + authorFk: 2, + notificationFk: notificationName, + params: JSON.stringify({'labelerId': labeler, 'sectorId': sectorId, 'workerId': 2}), + created: '2001-01-01 11:30:00', + status: sentStatus + }); + const notificationQueue = await updateOperatorAndFindNotification(); + + expect(notificationQueue.id).toEqual(id); }); it('should send a notification when the previous one has distinct params', async() => { From e979defd92fe973e535b694ea5190305edc4b53b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Fri, 3 May 2024 15:03:05 +0200 Subject: [PATCH 18/18] fix: descuentos en bs.ventas refs #6974 --- .../{ventas_add_launcher.sql => sales_addLauncher.sql} | 2 +- db/versions/11031-aquaPalmetto/00-firstScript.sql | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) rename db/routines/bs/procedures/{ventas_add_launcher.sql => sales_addLauncher.sql} (74%) create mode 100644 db/versions/11031-aquaPalmetto/00-firstScript.sql diff --git a/db/routines/bs/procedures/ventas_add_launcher.sql b/db/routines/bs/procedures/sales_addLauncher.sql similarity index 74% rename from db/routines/bs/procedures/ventas_add_launcher.sql rename to db/routines/bs/procedures/sales_addLauncher.sql index 3f8bd28c8..38cb5e219 100644 --- a/db/routines/bs/procedures/ventas_add_launcher.sql +++ b/db/routines/bs/procedures/sales_addLauncher.sql @@ -1,5 +1,5 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`ventas_add_launcher`() +CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`sales_addLauncher`() BEGIN /** * Añade las ventas a la tabla bs.sale que se realizaron desde hace un mes hasta hoy diff --git a/db/versions/11031-aquaPalmetto/00-firstScript.sql b/db/versions/11031-aquaPalmetto/00-firstScript.sql new file mode 100644 index 000000000..5ef37e8f0 --- /dev/null +++ b/db/versions/11031-aquaPalmetto/00-firstScript.sql @@ -0,0 +1,4 @@ + +UPDATE bs.nightTask + SET `procedure` = 'sales_addLauncher' + WHERE `procedure` = 'ventas_add_launcher'; \ No newline at end of file