diff --git a/back/methods/mrw-config/cancelShipment.js b/back/methods/mrw-config/cancelShipment.js
index 56d206529..0efd00874 100644
--- a/back/methods/mrw-config/cancelShipment.js
+++ b/back/methods/mrw-config/cancelShipment.js
@@ -37,6 +37,7 @@ module.exports = Self => {
});
const xmlString = response.data;
+ console.log('xmlString: ', xmlString);
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(xmlString, 'text/xml');
const result = xmlDoc.getElementsByTagName('Mensaje')[0].textContent;
diff --git a/back/methods/mrw-config/createShipment.ejs b/back/methods/mrw-config/createShipment.ejs
index 65326112b..52ccc859c 100644
--- a/back/methods/mrw-config/createShipment.ejs
+++ b/back/methods/mrw-config/createShipment.ejs
@@ -25,7 +25,7 @@
<%= expeditionData.fi %>
<%= expeditionData.clientName %>
- <%= expeditionData.phone %>
+ <%= expeditionData.mobile %>
<%= expeditionData.deliveryObservation %>
diff --git a/back/methods/mrw-config/createShipment.js b/back/methods/mrw-config/createShipment.js
index 900e1fc0f..4db0d0c7d 100644
--- a/back/methods/mrw-config/createShipment.js
+++ b/back/methods/mrw-config/createShipment.js
@@ -47,7 +47,7 @@ module.exports = Self => {
co.code countryCode,
c.fi,
c.name clientName,
- c.phone,
+ a.mobile,
DATE_FORMAT(t.shipped, '%d/%m/%Y') created,
t.shipped,
CONCAT( e.ticketFk, LPAD(e.counter, mc.counterWidth, '0')) reference,
diff --git a/db/routines/vn/procedures/clean.sql b/db/routines/vn/procedures/clean.sql
index 6645b9cb2..f479d5b3e 100644
--- a/db/routines/vn/procedures/clean.sql
+++ b/db/routines/vn/procedures/clean.sql
@@ -28,6 +28,10 @@ BEGIN
DELETE FROM ticketDown WHERE created < util.yesterday();
DELETE FROM entryLog WHERE creationDate < v2Months;
DELETE IGNORE FROM expedition WHERE created < v26Months;
+ DELETE cs
+ FROM sms s
+ JOIN clientSms cs ON cs.smsFk = s.id
+ WHERE s.created < v18Months;
DELETE FROM sms WHERE created < v18Months;
DELETE FROM saleTracking WHERE created < v1Years;
DELETE FROM productionError WHERE dated < v1Years;
diff --git a/db/routines/vn/procedures/collection_addWithReservation.sql b/db/routines/vn/procedures/collection_addWithReservation.sql
index e3f4eb8d2..18a3e8ab2 100644
--- a/db/routines/vn/procedures/collection_addWithReservation.sql
+++ b/db/routines/vn/procedures/collection_addWithReservation.sql
@@ -3,7 +3,8 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`collection_addWithR
vItemFk INT,
vQuantity INT,
vTicketFk INT,
- vSaleGroupFk INT
+ vSaleGroupFk INT,
+ vSectorFk INT
)
BEGIN
/**
@@ -67,7 +68,7 @@ BEGIN
SELECT LAST_INSERT_ID() INTO vSaleFk;
CALL sale_calculateComponent(vSaleFk, NULL);
- CALL itemShelvingSale_addBySale(vSaleFk);
+ CALL itemShelvingSale_addBySale(vSaleFk, vSectorFk);
IF NOT EXISTS (SELECT TRUE FROM itemShelvingSale WHERE saleFk = vSaleFk LIMIT 1) THEN
SET vHasThrow = TRUE;
diff --git a/db/routines/vn/procedures/expeditionPallet_build.sql b/db/routines/vn/procedures/expeditionPallet_build.sql
index bea56eae6..e917c5eb2 100644
--- a/db/routines/vn/procedures/expeditionPallet_build.sql
+++ b/db/routines/vn/procedures/expeditionPallet_build.sql
@@ -1,5 +1,10 @@
DELIMITER $$
-CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`expeditionPallet_build`(IN vExpeditions JSON, IN vArcId INT, IN vWorkerFk INT, OUT vPalletFk INT)
+CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`expeditionPallet_build`(
+ vExpeditions JSON,
+ vArcId INT,
+ vWorkerFk INT,
+ OUT vPalletFk INT
+)
BEGIN
/** Construye un pallet de expediciones.
*
@@ -7,28 +12,22 @@ BEGIN
* en cuyo caso actualiza ese pallet.
*
* @param vExpeditions JSON_ARRAY con esta estructura [exp1, exp2, exp3, ...]
- * @param vArcId INT Identificador de vn.arcRead
- * @param vWorkerFk INT Identificador de vn.worker
- * @param out vPalletFk Identificador de vn.expeditionPallet
+ * @param vArcId INT Identificador de arcRead
+ * @param vWorkerFk INT Identificador de worker
+ * @param out vPalletFk Identificador de expeditionPallet
*/
DECLARE vCounter INT;
DECLARE vExpeditionFk INT;
DECLARE vTruckFk INT;
DECLARE vPrinterFk INT;
+ DECLARE vExpeditionStateTypeFk INT;
- DROP TEMPORARY TABLE IF EXISTS tExpedition;
- CREATE TEMPORARY TABLE tExpedition
- SELECT
- e.id expeditionFk,
- r.id routeFk,
- ep.id palletFk
- FROM
- vn.expedition e,
- vn.route r,
- vn.expeditionPallet ep
- LIMIT 0;
-
- ALTER TABLE tExpedition ADD PRIMARY KEY (expeditionFk);
+ CREATE OR REPLACE TEMPORARY TABLE tExpedition (
+ expeditionFk INT,
+ routeFk INT,
+ palletFk INT,
+ PRIMARY KEY (expeditionFk)
+ );
SET vCounter = JSON_LENGTH(vExpeditions);
@@ -39,53 +38,58 @@ BEGIN
INSERT IGNORE INTO tExpedition(expeditionFk, routeFk, palletFk)
SELECT vExpeditionFk, t.routeFk, es.palletFk
- FROM vn.expedition e
- LEFT JOIN vn.ticket t ON t.id = e.ticketFk
- LEFT JOIN vn.expeditionScan es ON es.expeditionFk = e.id
+ FROM expedition e
+ LEFT JOIN ticket t ON t.id = e.ticketFk
+ LEFT JOIN expeditionScan es ON es.expeditionFk = e.id
WHERE e.id = vExpeditionFk;
END WHILE;
SELECT palletFk INTO vPalletFk
FROM (
- SELECT palletFk, count(*) n
- FROM tExpedition
- WHERE palletFk > 0
- GROUP BY palletFk
- ORDER BY n DESC
- LIMIT 100 ) sub
+ SELECT palletFk, count(*) n
+ FROM tExpedition
+ WHERE palletFk > 0
+ GROUP BY palletFk
+ ORDER BY n DESC
+ LIMIT 100
+ ) sub
LIMIT 1;
IF vPalletFk IS NULL THEN
- SELECT roadmapStopFk
- INTO vTruckFk
- FROM (
- SELECT rm.roadmapStopFk, count(*) n
- FROM vn.routesMonitor rm
- JOIN tExpedition e ON e.routeFk = rm.routeFk
- GROUP BY roadmapStopFk
- ORDER BY n DESC
- LIMIT 1) sub;
+ SELECT roadmapStopFk INTO vTruckFk
+ FROM (
+ SELECT rm.roadmapStopFk, count(*) n
+ FROM routesMonitor rm
+ JOIN tExpedition e ON e.routeFk = rm.routeFk
+ GROUP BY roadmapStopFk
+ ORDER BY n DESC
+ LIMIT 1
+ ) sub;
IF vTruckFk IS NULL THEN
CALL util.throw ('TRUCK_NOT_AVAILABLE');
END IF;
- INSERT INTO vn.expeditionPallet(truckFk)
- VALUES(vTruckFk);
+ INSERT INTO expeditionPallet SET truckFk = vTruckFk;
SET vPalletFk = LAST_INSERT_ID();
END IF;
- INSERT INTO vn.expeditionScan(expeditionFk, palletFk, workerFk)
+ INSERT INTO expeditionScan(expeditionFk, palletFk, workerFk)
SELECT expeditionFk, vPalletFk, vWorkerFk
FROM tExpedition
ON DUPLICATE KEY UPDATE palletFk = vPalletFk, workerFk = vWorkerFk;
- SELECT printerFk INTO vPrinterFk
- FROM vn.arcRead
- WHERE id = vArcId;
+ SELECT id INTO vExpeditionStateTypeFk
+ FROM expeditionStateType
+ WHERE code = 'PALLETIZED';
- CALL vn.report_print(
+ INSERT INTO expeditionState(expeditionFk, typeFk)
+ SELECT expeditionFk, vExpeditionStateTypeFk FROM tExpedition;
+
+ SELECT printerFk INTO vPrinterFk FROM arcRead WHERE id = vArcId;
+
+ CALL report_print(
'LabelPalletExpedition',
vPrinterFk,
account.myUser_getId(),
@@ -93,7 +97,7 @@ BEGIN
'high'
);
- UPDATE vn.expeditionPallet SET isPrint = TRUE WHERE id = vPalletFk;
+ UPDATE expeditionPallet SET isPrint = TRUE WHERE id = vPalletFk;
DROP TEMPORARY TABLE tExpedition;
END$$
diff --git a/db/routines/vn/procedures/itemMinimumQuantity_check.sql b/db/routines/vn/procedures/itemMinimumQuantity_check.sql
new file mode 100644
index 000000000..fef7cdbdb
--- /dev/null
+++ b/db/routines/vn/procedures/itemMinimumQuantity_check.sql
@@ -0,0 +1,28 @@
+DELIMITER $$
+CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemMinimumQuantity_check`(
+ vSelf INT,
+ vItemFk INT,
+ vStarted DATE,
+ vEnded DATE,
+ vWarehouseFk INT
+)
+BEGIN
+ DECLARE vHasCollision BOOL;
+
+ IF vStarted IS NULL THEN
+ CALL util.throw('The field "started" cannot be null');
+ END IF;
+
+ SELECT COUNT(*) INTO vHasCollision
+ FROM itemMinimumQuantity
+ WHERE vItemFk = itemFk
+ AND ((vStarted <= ended OR ended IS NULL)
+ AND (vStarted >= `started` OR vEnded IS NULL))
+ AND (vWarehouseFk <=> warehouseFk)
+ AND vSelf <> id;
+
+ IF vHasCollision THEN
+ CALL util.throw('A line with the same configuration already exists');
+ END IF;
+END$$
+DELIMITER ;
\ No newline at end of file
diff --git a/db/routines/vn/procedures/itemShelvingSale_addByCollection.sql b/db/routines/vn/procedures/itemShelvingSale_addByCollection.sql
index 7f9cc6616..a6f9b3e8c 100644
--- a/db/routines/vn/procedures/itemShelvingSale_addByCollection.sql
+++ b/db/routines/vn/procedures/itemShelvingSale_addByCollection.sql
@@ -44,7 +44,7 @@ BEGIN
LEAVE l;
END IF;
- CALL itemShelvingSale_addBySale(vSaleFk);
+ CALL itemShelvingSale_addBySale(vSaleFk, NULL);
END LOOP;
CLOSE vSales;
END$$
diff --git a/db/routines/vn/procedures/itemShelvingSale_addBySale.sql b/db/routines/vn/procedures/itemShelvingSale_addBySale.sql
index 909ce5155..96c49b788 100644
--- a/db/routines/vn/procedures/itemShelvingSale_addBySale.sql
+++ b/db/routines/vn/procedures/itemShelvingSale_addBySale.sql
@@ -1,6 +1,7 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemShelvingSale_addBySale`(
- vSaleFk INT
+ vSaleFk INT,
+ vSectorFk INT
)
proc: BEGIN
/**
@@ -8,6 +9,7 @@ proc: BEGIN
*
* @param vSaleFk Id de sale
* @param vItemShelvingSaleFk Id de reserva
+ * @param vSectorFk Id del sector del operator
*/
DECLARE vLastPickingOrder INT;
DECLARE vDone INT DEFAULT FALSE;
@@ -30,6 +32,7 @@ proc: BEGIN
JOIN productionConfig pc
WHERE s.id = vSaleFk
AND NOT sc.isHideForPickers
+ AND (sc.id = vSectorFk OR vSectorFk IS NULL)
ORDER BY s.id,
p.pickingOrder >= vLastPickingOrder,
sh.priority DESC,
diff --git a/db/routines/vn/procedures/itemShelvingSale_addBySectorCollection.sql b/db/routines/vn/procedures/itemShelvingSale_addBySectorCollection.sql
index 442abcf5d..c359c7c8d 100644
--- a/db/routines/vn/procedures/itemShelvingSale_addBySectorCollection.sql
+++ b/db/routines/vn/procedures/itemShelvingSale_addBySectorCollection.sql
@@ -10,6 +10,7 @@ BEGIN
*/
DECLARE vDone BOOL DEFAULT FALSE;
DECLARE vSaleFk INT;
+ DECLARE vSectorFk INT;
DECLARE vSales CURSOR FOR
SELECT s.id
FROM sectorCollectionSaleGroup sc
@@ -25,6 +26,10 @@ BEGIN
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
+ SELECT sectorFk INTO vSectorFk
+ FROM operator
+ WHERE workerFk = account.myUser_getId();
+
OPEN vSales;
l: LOOP
SET vDone = FALSE;
@@ -34,7 +39,7 @@ BEGIN
LEAVE l;
END IF;
- CALL itemShelvingSale_addBySale(vSaleFk);
+ CALL itemShelvingSale_addBySale(vSaleFk, vSectorFk);
END LOOP;
CLOSE vSales;
END$$
diff --git a/db/routines/vn/procedures/itemShelvingSale_doReserve.sql b/db/routines/vn/procedures/itemShelvingSale_doReserve.sql
index 629e303b3..d38a787a1 100644
--- a/db/routines/vn/procedures/itemShelvingSale_doReserve.sql
+++ b/db/routines/vn/procedures/itemShelvingSale_doReserve.sql
@@ -6,9 +6,10 @@ proc: BEGIN
*/
DECLARE vDone BOOL;
DECLARE vSaleFk INT;
+ DECLARE vSectorFk INT;
DECLARE vSales CURSOR FOR
- SELECT DISTINCT saleFk FROM tSale;
+ SELECT DISTINCT saleFk, sectorFk FROM tSale;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET vDone = TRUE;
@@ -26,24 +27,25 @@ proc: BEGIN
CREATE OR REPLACE TEMPORARY TABLE tSale
ENGINE = MEMORY
- SELECT id, saleFk FROM itemShelvingSaleReserve;
+ SELECT id, saleFk, sectorFk FROM itemShelvingSaleReserve;
OPEN vSales;
myLoop: LOOP
SET vDone = FALSE;
- FETCH vSales INTO vSaleFk;
+ FETCH vSales INTO vSaleFk, vSectorFk;
IF vDone THEN
LEAVE myLoop;
END IF;
- CALL itemShelvingSale_addBySale (vSaleFk);
+ CALL itemShelvingSale_addBySale (vSaleFk, vSectorFk);
END LOOP;
CLOSE vSales;
- DELETE iss FROM itemShelvingSaleReserve iss JOIN tSale s ON s.id = iss.id;
+ DELETE iss FROM itemShelvingSaleReserve iss
+ JOIN tSale s ON s.id = iss.id AND s.sectorFk = iss.sectorFk;
DROP TEMPORARY TABLE tSale;
diff --git a/db/routines/vn/procedures/itemShelvingSale_reallocate.sql b/db/routines/vn/procedures/itemShelvingSale_reallocate.sql
index 85230a386..a60287caa 100644
--- a/db/routines/vn/procedures/itemShelvingSale_reallocate.sql
+++ b/db/routines/vn/procedures/itemShelvingSale_reallocate.sql
@@ -1,13 +1,16 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemShelvingSale_reallocate`(
vItemShelvingFk INT(10),
- vItemFk INT(10)
+ vItemFk INT(10),
+ vSectorFk INT
)
BEGIN
/**
* Elimina reservas de un itemShelving e intenta reservar en otra ubicación
*
* @param vItemShelvingFk Id itemShelving
+ * @param vItemFk Id del artículo
+ * @param vSectorFk Id del sector
*/
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
@@ -17,18 +20,21 @@ BEGIN
START TRANSACTION;
- SELECT id INTO vItemShelvingFk
- FROM itemShelving
- WHERE id = vItemShelvingFk
- FOR UPDATE;
-
UPDATE itemShelving
SET visible = 0,
available = 0
WHERE id = vItemShelvingFk
AND itemFk = vItemFk;
- INSERT INTO itemShelvingSaleReserve (saleFk)
+ SELECT iss.id
+ FROM itemShelvingSale iss
+ JOIN itemShelving ish ON ish.id = iss.itemShelvingFk
+ WHERE iss.itemShelvingFk = vItemShelvingFk
+ AND iss.itemFk = vItemFk
+ AND NOT iss.isPicked
+ FOR UPDATE;
+
+ INSERT INTO itemShelvingSaleReserve (saleFk, vSectorFk)
SELECT DISTINCT iss.saleFk
FROM itemShelvingSale iss
JOIN itemShelving ish ON ish.id = iss.itemShelvingFk
diff --git a/db/routines/vn/procedures/itemShelvingSale_setQuantity.sql b/db/routines/vn/procedures/itemShelvingSale_setQuantity.sql
index 85f56ee68..30abefec8 100644
--- a/db/routines/vn/procedures/itemShelvingSale_setQuantity.sql
+++ b/db/routines/vn/procedures/itemShelvingSale_setQuantity.sql
@@ -2,7 +2,8 @@ DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemShelvingSale_setQuantity`(
vItemShelvingSaleFk INT(10),
vQuantity DECIMAL(10,0),
- vIsItemShelvingSaleEmpty BOOLEAN
+ vIsItemShelvingSaleEmpty BOOLEAN,
+ vSectorFk INT
)
BEGIN
/**
@@ -14,6 +15,7 @@ BEGIN
* @param vQuantity Cantidad real que se ha cogido de la ubicación
* @param vIsItemShelvingSaleEmpty determina si la ubicación itemShelvingSale se ha
* quedado vacio tras el movimiento
+ * @param vSectorFk Id del sector
*/
DECLARE vSaleFk INT;
DECLARE vItemShelvingFk INT;
@@ -29,6 +31,12 @@ BEGIN
RESIGNAL;
END;
+ IF vQuantity > vReservedQuantity
+ OR (vQuantity < vReservedQuantity AND NOT vIsItemShelvingSaleEmpty)
+ OR (vQuantity = vReservedQuantity AND vIsItemShelvingSaleEmpty) THEN
+ CALL util.throw('The quantity cannot be different from the reserved');
+ END IF;
+
IF (SELECT isPicked FROM itemShelvingSale WHERE id = vItemShelvingSaleFk) THEN
CALL util.throw('Reservation completed');
END IF;
@@ -50,9 +58,8 @@ BEGIN
AND NOT iss.isPicked;
IF vQuantity > vReservedQuantity
- OR (vQuantity < vReservedQuantity AND
- (NOT vIsItemShelvingSaleEmpty OR vIsItemShelvingSaleEmpty IS NULL))
- OR (vIsItemShelvingSaleEmpty IS NOT NULL AND vQuantity = vReservedQuantity) THEN
+ OR (vQuantity < vReservedQuantity AND NOT vIsItemShelvingSaleEmpty)
+ OR (vQuantity = vReservedQuantity AND vIsItemShelvingSaleEmpty) THEN
CALL util.throw('The quantity cannot be different from the reserved');
END IF;
@@ -72,7 +79,7 @@ BEGIN
SET visible = GREATEST(0, visible - vQuantity)
WHERE id = vItemShelvingFk;
- SELECT SUM(IF(isPicked, 0, quantity)), SUM(quantity)
+ SELECT SUM(IF(isPicked OR id = vItemShelvingSaleFk, 0, quantity)), SUM(quantity)
INTO vRemainingQuantity, vTotalQuantity
FROM itemShelvingSale
WHERE saleFk = vSaleFk;
@@ -96,9 +103,9 @@ BEGIN
COMMIT;
IF vIsItemShelvingSaleEmpty AND vQuantity <> vReservedQuantity THEN
- INSERT INTO itemShelvingSaleReserve (saleFk)
- SELECT vSaleFk;
- CALL itemShelvingSale_reallocate(vItemShelvingFk, vItemFk);
+ INSERT INTO itemShelvingSaleReserve (saleFk, vSectorFk)
+ SELECT vSaleFk, vSectorFk;
+ CALL itemShelvingSale_reallocate(vItemShelvingFk, vItemFk, vSectorFk);
END IF;
END$$
DELIMITER ;
\ No newline at end of file
diff --git a/db/routines/vn/procedures/item_valuateInventory.sql b/db/routines/vn/procedures/item_valuateInventory.sql
index 18aefdf7b..d1d0573a3 100644
--- a/db/routines/vn/procedures/item_valuateInventory.sql
+++ b/db/routines/vn/procedures/item_valuateInventory.sql
@@ -1,6 +1,8 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`item_valuateInventory`(
- vDated DATE
+ vDated DATE,
+ vItemTypeFk INT,
+ vItemCategoryFk INT
)
BEGIN
DECLARE vInventoried DATE;
@@ -61,11 +63,14 @@ BEGIN
JOIN `entry` e ON e.id = b.entryFk
JOIN travel tr ON tr.id = e.travelFk
JOIN itemType t ON t.id = i.typeFk
+ JOIN itemCategory ic ON ic.id = t.categoryFk
JOIN warehouse w ON w.id = tr.warehouseInFk
WHERE tr.landed = vDateDayEnd
AND e.supplierFk = vInventorySupplierFk
AND w.valuatedInventory
AND t.isInventory
+ AND (t.id = vItemTypeFk OR vItemTypeFk IS NULL)
+ AND (ic.id = vItemCategoryFk OR vItemCategoryFk IS NULL)
GROUP BY tr.warehouseInFk, b.itemFk;
ELSE
INSERT INTO tInventory(warehouseFk, itemFk, quantity, warehouseInventory)
@@ -78,11 +83,14 @@ BEGIN
JOIN `entry` e ON e.id = b.entryFk
JOIN travel tr ON tr.id = e.travelFk
JOIN itemType t ON t.id = i.typeFk
+ JOIN itemCategory ic ON ic.id = t.categoryFk
JOIN warehouse w ON w.id = tr.warehouseInFk
WHERE tr.landed = vInventoried
AND e.supplierFk = vInventorySupplierFk
AND w.valuatedInventory
AND t.isInventory
+ AND (t.id = vItemTypeFk OR vItemTypeFk IS NULL)
+ AND (ic.id = vItemCategoryFk OR vItemCategoryFk IS NULL)
GROUP BY tr.warehouseInFk, b.itemFk;
END IF;
@@ -97,6 +105,7 @@ BEGIN
JOIN `entry` e ON e.id = b.entryFk
JOIN travel tr ON tr.id = e.travelFk
JOIN itemType t ON t.id = i.typeFk
+ JOIN itemCategory ic ON ic.id = t.categoryFk
JOIN warehouse w ON w.id = tr.warehouseInFk
WHERE tr.landed BETWEEN vInventoried AND vDateDayEnd
AND IF(tr.landed = util.VN_CURDATE(), tr.isReceived, TRUE)
@@ -104,6 +113,8 @@ BEGIN
AND w.valuatedInventory
AND t.isInventory
AND e.supplierFk <> vInventorySupplierFk
+ AND (t.id = vItemTypeFk OR vItemTypeFk IS NULL)
+ AND (ic.id = vItemCategoryFk OR vItemCategoryFk IS NULL)
ON DUPLICATE KEY UPDATE tInventory.quantity = tInventory.quantity + (b.quantity * IF(vHasNotInventory, -1, 1));
-- Descontamos las salidas
@@ -117,11 +128,14 @@ BEGIN
JOIN `entry` e ON e.id = b.entryFk
JOIN travel tr ON tr.id = e.travelFk
JOIN itemType t ON t.id = i.typeFk
+ JOIN itemCategory ic ON ic.id = t.categoryFk
JOIN warehouse w ON w.id = tr.warehouseOutFk
WHERE tr.shipped BETWEEN vInventoried AND vDateDayEnd
AND NOT e.isRaid
AND w.valuatedInventory
AND t.isInventory
+ AND (t.id = vItemTypeFk OR vItemTypeFk IS NULL)
+ AND (ic.id = vItemCategoryFk OR vItemCategoryFk IS NULL)
ON DUPLICATE KEY UPDATE tInventory.quantity = tInventory.quantity + (b.quantity * IF(vHasNotInventory,1,-1));
-- Descontamos las lineas de venta
@@ -135,10 +149,13 @@ BEGIN
JOIN `client` c ON c.id = t.clientFk
JOIN item i ON i.id = s.itemFk
JOIN itemType it ON it.id = i.typeFk
+ JOIN itemCategory ic ON ic.id = it.categoryFk
JOIN warehouse w ON w.id = t.warehouseFk
WHERE t.shipped BETWEEN vInventoried AND vDateDayEnd
AND w.valuatedInventory
AND it.isInventory
+ AND (it.id = vItemTypeFk OR vItemTypeFk IS NULL)
+ AND (ic.id = vItemCategoryFk OR vItemCategoryFk IS NULL)
ON DUPLICATE KEY UPDATE tInventory.quantity = tInventory.quantity + s.quantity * IF(vHasNotInventory, 1, -1);
-- Volver a poner lo que esta aun en las estanterias
@@ -153,11 +170,14 @@ BEGIN
JOIN `client` c ON c.id = t.clientFk
JOIN item i ON i.id = s.itemFk
JOIN itemType it ON it.id = i.typeFk
+ JOIN itemCategory ic ON ic.id = it.categoryFk
JOIN warehouse w ON w.id = t.warehouseFk
WHERE t.shipped BETWEEN vDated AND vDateDayEnd
AND NOT (s.isPicked OR t.isLabeled)
AND w.valuatedInventory
AND it.isInventory
+ AND (it.id = vItemTypeFk OR vItemTypeFk IS NULL)
+ AND (ic.id = vItemCategoryFk OR vItemCategoryFk IS NULL)
ON DUPLICATE KEY UPDATE tInventory.quantity = tInventory.quantity + s.quantity * IF(vHasNotInventory, 0, 1);
END IF;
@@ -172,6 +192,7 @@ BEGIN
JOIN `entry` e ON e.id = b.entryFk
JOIN travel tr ON tr.id = e.travelFk
JOIN itemType t ON t.id = i.typeFk
+ JOIN itemCategory ic ON ic.id = t.categoryFk
JOIN warehouse wIn ON wIn.id = tr.warehouseInFk
JOIN warehouse wOut ON wOut.id = tr.warehouseOutFk
WHERE vDated >= tr.shipped AND vDated < tr.landed
@@ -179,6 +200,8 @@ BEGIN
AND wIn.valuatedInventory
AND t.isInventory
AND e.isConfirmed
+ AND (t.id = vItemTypeFk OR vItemTypeFk IS NULL)
+ AND (ic.id = vItemCategoryFk OR vItemCategoryFk IS NULL)
ON DUPLICATE KEY UPDATE tInventory.quantity = tInventory.quantity + (b.quantity);
CALL buyUltimate(NULL, vDateDayEnd);
@@ -204,7 +227,8 @@ BEGIN
ic.name itemCategoryName,
ti.cost,
ti.total,
- ti.warehouseInventory
+ ti.warehouseInventory,
+ ic.display
FROM tInventory ti
JOIN warehouse w ON w.id = warehouseFk
JOIN item i ON i.id = ti.itemFk
diff --git a/db/routines/vn/triggers/itemMinimumQuantity_beforeInsert.sql b/db/routines/vn/triggers/itemMinimumQuantity_beforeInsert.sql
index 8833ac968..3ee6c0b1a 100644
--- a/db/routines/vn/triggers/itemMinimumQuantity_beforeInsert.sql
+++ b/db/routines/vn/triggers/itemMinimumQuantity_beforeInsert.sql
@@ -4,5 +4,6 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`itemMinimumQuantity_b
FOR EACH ROW
BEGIN
SET NEW.editorFk = account.myUser_getId();
+ CALL itemMinimumQuantity_check(NEW.id, NEW.itemFk, NEW.started, NEW.ended, NEW.warehouseFk);
END$$
DELIMITER ;
diff --git a/db/routines/vn/triggers/itemMinimumQuantity_beforeUpdate.sql b/db/routines/vn/triggers/itemMinimumQuantity_beforeUpdate.sql
index ef030f9f9..6f082551c 100644
--- a/db/routines/vn/triggers/itemMinimumQuantity_beforeUpdate.sql
+++ b/db/routines/vn/triggers/itemMinimumQuantity_beforeUpdate.sql
@@ -4,5 +4,6 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`itemMinimumQuantity_b
FOR EACH ROW
BEGIN
SET NEW.editorFk = account.myUser_getId();
+ CALL itemMinimumQuantity_check(NEW.id, NEW.itemFk, NEW.started, NEW.ended, NEW.warehouseFk);
END$$
DELIMITER ;
diff --git a/db/versions/11042-turquoiseAspidistra/00-firstScript.sql b/db/versions/11042-turquoiseAspidistra/00-firstScript.sql
index 5a0b23bc9..43038ab6d 100644
--- a/db/versions/11042-turquoiseAspidistra/00-firstScript.sql
+++ b/db/versions/11042-turquoiseAspidistra/00-firstScript.sql
@@ -1,8 +1,20 @@
ALTER TABLE bs.waste ADD buyerFk int(10) unsigned NOT NULL;
+USE vn;
+CREATE OR REPLACE TEMPORARY TABLE tBuyers
+ ENGINE = MEMORY
+ WITH tDistinctBuyers AS (
+ SELECT DISTINCT buyer
+ FROM bs.waste w
+ )
+ SELECT buyer, u.id
+ FROM tDistinctBuyers tdb
+ JOIN account.`user` u ON u.name = tdb.buyer COLLATE utf8mb3_unicode_ci;
UPDATE bs.waste w
- JOIN account.`user` u ON u.name = w.buyer COLLATE utf8mb3_unicode_ci
- SET w.buyerFk = u.id;
+ JOIN tBuyers tb ON tb.buyer = w.buyer
+ SET w.buyerFk = tb.id;
+
+DROP TEMPORARY TABLE tBuyers;
ALTER TABLE bs.waste
DROP PRIMARY KEY,
@@ -19,4 +31,23 @@ ALTER TABLE bs.waste CHANGE saleWaste saleInternalWaste decimal(10,2) DEFAULT NU
ALTER TABLE bs.waste ADD saleExternalWaste decimal(10,2) DEFAULT NULL NULL;
ALTER TABLE bs.waste CHANGE saleQuantity saleQuantity decimal(10,2) DEFAULT NULL NULL AFTER itemTypeFk;
ALTER TABLE bs.waste CHANGE itemFk itemFk int(11) DEFAULT 0 NOT NULL AFTER itemTypeFk;
-ALTER TABLE bs.waste ADD CONSTRAINT waste_pk PRIMARY KEY (`year`, `week`, buyerFk, itemTypeFk, itemFk);
\ No newline at end of file
+
+CREATE OR REPLACE TEMPORARY TABLE tWasteUnique
+ SELECT *
+ FROM bs.waste
+ GROUP BY `year`, `week`, buyerFk, itemTypeFk, itemFk
+ HAVING COUNT(*) > 1;
+
+DELETE w.* FROM bs.waste w
+ JOIN tWasteUnique twu ON twu.`year` = w.`year`
+ AND twu.`week` = w.`week`
+ AND twu.`buyerFk` = w.`buyerFk`
+ AND twu.`itemTypeFk` = w.`itemTypeFk`
+ AND twu.`itemFk` = w.`itemFk`;
+
+INSERT INTO bs.waste
+ SELECT * FROM tWasteUnique;
+
+ALTER TABLE bs.waste ADD CONSTRAINT waste_pk PRIMARY KEY (`year`, `week`, buyerFk, itemTypeFk, itemFk);
+
+DROP TEMPORARY TABLE tWasteUnique;
diff --git a/db/versions/11118-limeCymbidium/00-firstScript.sql b/db/versions/11118-limeCymbidium/00-firstScript.sql
index 3921a8a13..b15dfbd41 100644
--- a/db/versions/11118-limeCymbidium/00-firstScript.sql
+++ b/db/versions/11118-limeCymbidium/00-firstScript.sql
@@ -16,6 +16,4 @@ INSERT IGNORE INTO account.roleInherit (`role`,`inheritsFrom`)
UPDATE salix.ACL
SET principalId='$authenticated'
- WHERE id=264;
-
-
+ WHERE id=(SELECT id FROM salix.ACL WHERE model='StarredModule' and property='*' and `accessType`='*');
diff --git a/db/versions/11152-goldenRaphis/00-firstScript.sql b/db/versions/11152-goldenRaphis/00-firstScript.sql
new file mode 100644
index 000000000..ad58a570a
--- /dev/null
+++ b/db/versions/11152-goldenRaphis/00-firstScript.sql
@@ -0,0 +1,3 @@
+-- Place your SQL code here
+ALTER TABLE vn.ticketSms__ DROP FOREIGN KEY IF EXISTS ticketSms_FK;
+ALTER TABLE vn.ticketSms__ ADD CONSTRAINT ticketSms_FK FOREIGN KEY (smsFk) REFERENCES vn.sms(id) ON DELETE CASCADE ON UPDATE CASCADE;
diff --git a/db/versions/11157-limeDendro/00-firstScript.sql b/db/versions/11157-limeDendro/00-firstScript.sql
new file mode 100644
index 000000000..fa13f14a2
--- /dev/null
+++ b/db/versions/11157-limeDendro/00-firstScript.sql
@@ -0,0 +1,11 @@
+
+ALTER TABLE IF EXISTS vn.sectorCollectionSaleGroup DROP FOREIGN KEY sectorCollectionSaleGroup_ibfk_3;
+ALTER TABLE IF EXISTS vn.sectorCollectionSaleGroup DROP FOREIGN KEY sectorCollectionSaleGroup_ibfk_2;
+ALTER TABLE IF EXISTS vn.sectorCollectionSaleGroup DROP KEY saleGroupFk;
+
+
+ALTER TABLE IF EXISTS vn.sectorCollectionSaleGroup ADD CONSTRAINT sectorCollectionSaleGroup_saleGroup_FK
+ FOREIGN KEY (saleGroupFk) REFERENCES vn.saleGroup(id) ON DELETE CASCADE ON UPDATE CASCADE;
+
+
+ALTER TABLE IF EXISTS vn.sectorCollectionSaleGroup ADD CONSTRAINT sectorCollectionSaleGroup_unique UNIQUE KEY (sectorCollectionFk,saleGroupFk);
\ No newline at end of file
diff --git a/db/versions/11158-redRaphis/00-firstScript.sql b/db/versions/11158-redRaphis/00-firstScript.sql
new file mode 100644
index 000000000..7fe41b32b
--- /dev/null
+++ b/db/versions/11158-redRaphis/00-firstScript.sql
@@ -0,0 +1,11 @@
+-- Place your SQL code here
+
+ALTER TABLE IF EXISTS vn.itemShelvingSaleReserve
+ADD IF NOT EXISTS sectorFk int(11) NULL;
+
+ALTER TABLE IF EXISTS vn.itemShelvingSaleReserve
+DROP FOREIGN KEY IF EXISTS itemShelvingSaleReserve_sector_FK;
+
+ALTER TABLE IF EXISTS vn.itemShelvingSaleReserve
+ADD CONSTRAINT itemShelvingSaleReserve_sector_FK FOREIGN KEY (id)
+REFERENCES vn.sector(id) ON DELETE RESTRICT ON UPDATE CASCADE;
\ No newline at end of file
diff --git a/db/versions/11159-redIvy/00-firstScript.sql b/db/versions/11159-redIvy/00-firstScript.sql
new file mode 100644
index 000000000..d0b563b7a
--- /dev/null
+++ b/db/versions/11159-redIvy/00-firstScript.sql
@@ -0,0 +1,3 @@
+
+
+ALTER TABLE vn.itemShelvingSale MODIFY COLUMN IF EXISTS isPicked tinyint(1) DEFAULT 1 NOT NULL;
diff --git a/db/versions/11160-blueRoebelini/00-firstScript.sql b/db/versions/11160-blueRoebelini/00-firstScript.sql
new file mode 100644
index 000000000..235eda7fd
--- /dev/null
+++ b/db/versions/11160-blueRoebelini/00-firstScript.sql
@@ -0,0 +1,2 @@
+ALTER TABLE vn.state DROP FOREIGN KEY state_ibfk_1;
+ALTER TABLE vn.state ADD CONSTRAINT state_ibfk_1 FOREIGN KEY (alertLevel) REFERENCES vn.alertLevel(id) ON DELETE RESTRICT ON UPDATE CASCADE;
diff --git a/modules/entry/back/methods/entry/getBuys.js b/modules/entry/back/methods/entry/getBuys.js
index b6809c8c5..bd9c5db7a 100644
--- a/modules/entry/back/methods/entry/getBuys.js
+++ b/modules/entry/back/methods/entry/getBuys.js
@@ -1,5 +1,4 @@
const UserError = require('vn-loopback/util/user-error');
-
const mergeFilters = require('vn-loopback/util/filter').mergeFilters;
module.exports = Self => {
diff --git a/modules/invoiceIn/front/intrastat/index.html b/modules/invoiceIn/front/intrastat/index.html
index fc0139303..b15fdf543 100644
--- a/modules/invoiceIn/front/intrastat/index.html
+++ b/modules/invoiceIn/front/intrastat/index.html
@@ -10,7 +10,7 @@
auto-load="true"
url="Countries"
data="countries"
- order="country">
+ order="name">
{
Self.remoteMethodCtx('itemShelvingSaleSetQuantity', {
- description: 'Set quanitity of a sale in itemShelvingSale',
+ description: 'Set quantity of a sale in itemShelvingSale',
accessType: 'WRITE',
accepts: [
{
@@ -20,6 +20,12 @@ module.exports = Self => {
type: 'boolean',
required: true,
description: 'True if the shelvingFk is empty ',
+ },
+ {
+ arg: 'sectorFk',
+ type: 'number',
+ required: true,
+ description: 'Sector Id',
}
],
http: {
@@ -28,14 +34,14 @@ module.exports = Self => {
}
});
- Self.itemShelvingSaleSetQuantity = async(ctx, id, quantity, isItemShelvingSaleEmpty, options) => {
+ Self.itemShelvingSaleSetQuantity = async(ctx, id, quantity, isItemShelvingSaleEmpty, sectorFk, options) => {
const myOptions = {userId: ctx.req.accessToken.userId};
if (typeof options == 'object')
Object.assign(myOptions, options);
- await Self.rawSql(`CALL vn.itemShelvingSale_setQuantity(?, ?, ? )`,
- [id, quantity, isItemShelvingSaleEmpty],
+ await Self.rawSql(`CALL vn.itemShelvingSale_setQuantity(?, ?, ?, ?)`,
+ [id, quantity, isItemShelvingSaleEmpty, sectorFk],
myOptions);
};
};
diff --git a/modules/item/back/models/specs/itemMinimumQuantity.spec.js b/modules/item/back/models/specs/itemMinimumQuantity.spec.js
index 072a80f94..7d1e19def 100644
--- a/modules/item/back/models/specs/itemMinimumQuantity.spec.js
+++ b/modules/item/back/models/specs/itemMinimumQuantity.spec.js
@@ -2,9 +2,10 @@ const {models} = require('vn-loopback/server/server');
describe('itemMinimumQuantity model', () => {
const itemFk = 5;
+ const quantity = 100;
const warehouseFk = 60;
- beforeAll(async() => {
+ beforeEach(async() => {
await models.ItemMinimumQuantity.destroyAll({where: {itemFk: itemFk}});
});
@@ -12,7 +13,7 @@ describe('itemMinimumQuantity model', () => {
it('should create a new itemMinimumQuantity record', async() => {
const newRecord = {
itemFk: itemFk,
- quantity: 100,
+ quantity: quantity,
started: Date.vnNew(),
ended: new Date(Date.vnNew().setFullYear(Date.vnNew().getFullYear() + 1)),
warehouseFk: warehouseFk
@@ -27,7 +28,7 @@ describe('itemMinimumQuantity model', () => {
it('should read an existing itemMinimumQuantity record', async() => {
const newRecord = {
itemFk: itemFk,
- quantity: 100,
+ quantity: quantity,
started: Date.vnNew(),
ended: new Date(Date.vnNew().setFullYear(Date.vnNew().getFullYear() + 2)),
warehouseFk: warehouseFk
@@ -44,7 +45,7 @@ describe('itemMinimumQuantity model', () => {
it('should update an existing itemMinimumQuantity record', async() => {
const newRecord = {
itemFk: itemFk,
- quantity: 100,
+ quantity: quantity,
started: Date.vnNew(),
ended: new Date(Date.vnNew().setFullYear(Date.vnNew().getFullYear() + 3)),
warehouseFk: warehouseFk
@@ -67,7 +68,7 @@ describe('itemMinimumQuantity model', () => {
it('should enforce unique constraint on itemFk, started, ended, and warehouseFk', async() => {
const newRecord = {
itemFk: itemFk,
- quantity: 100,
+ quantity: quantity,
started: Date.vnNew(),
ended: Date.vnNew().setFullYear(Date.vnNew().getFullYear() + 5),
warehouseFk: warehouseFk
@@ -78,14 +79,14 @@ describe('itemMinimumQuantity model', () => {
await models.ItemMinimumQuantity.create(newRecord);
} catch (e) {
expect(e).toBeDefined();
- expect(e.code).toContain('ER_DUP_ENTRY');
+ expect(e.code).toContain('ER_SIGNAL_EXCEPTION');
}
});
it('should allow null values for ended and warehouseFk', async() => {
const newRecord = {
itemFk: itemFk,
- quantity: 100,
+ quantity: quantity,
started: Date.vnNew(),
ended: null,
warehouseFk: null
diff --git a/modules/item/front/diary/index.html b/modules/item/front/diary/index.html
index 481cec51a..7fb3b870e 100644
--- a/modules/item/front/diary/index.html
+++ b/modules/item/front/diary/index.html
@@ -1,121 +1,2 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Date
- Id
- State
- Reference
- Client
- In
- Out
- Balance
-
-
-
-
-
-
-
-
-
-
-
-
- {{::sale.shipped | date:'dd/MM/yyyy' }}
-
-
-
-
- {{::sale.origin | dashIfEmpty}}
-
-
- {{::sale.stateName | dashIfEmpty}}
- {{::sale.reference | dashIfEmpty}}
-
-
-
- {{::sale.name | dashIfEmpty}}
-
-
- {{::sale.name | dashIfEmpty}}
-
-
-
- {{::sale.invalue | dashIfEmpty}}
- {{::sale.out | dashIfEmpty}}
-
-
- {{::sale.balance | dashIfEmpty}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/modules/item/front/diary/index.js b/modules/item/front/diary/index.js
index 1d2e34a66..3d86b0b60 100644
--- a/modules/item/front/diary/index.js
+++ b/modules/item/front/diary/index.js
@@ -1,107 +1,21 @@
import ngModule from '../module';
import Section from 'salix/components/section';
-import './style.scss';
class Controller extends Section {
- constructor($element, $scope, $anchorScroll, $location) {
- super($element, $scope);
- this.$anchorScroll = $anchorScroll;
- this.$location = $location;
- let today = Date.vnNew();
- today.setHours(0, 0, 0, 0);
- this.today = today.toJSON();
+ constructor($element, $) {
+ super($element, $);
}
- get item() {
- return this._item;
- }
-
- set item(value) {
- this._item = value;
-
- this.filter = {
- where: {itemFk: this.$params.id}
- };
-
- this.$.$applyAsync(() => {
- if (this.$params.warehouseFk)
- this.warehouseFk = this.$params.warehouseFk;
- else if (value)
- this.warehouseFk = this.vnConfig.warehouseFk;
-
- if (this.$params.lineFk)
- this.lineFk = this.$params.lineFk;
- });
- }
-
- set warehouseFk(value) {
- if (value && value != this._warehouseFk) {
- this._warehouseFk = value;
- this.card.warehouseFk = value;
- this.filter.where.warehouseFk = this.warehouseFk;
-
- this.$.model.refresh();
- }
- }
-
- get warehouseFk() {
- return this._warehouseFk;
- }
-
- set date(value) {
- this._date = value;
- this.filter.where.date = value;
- this.filter.where.warehouseFk = this.warehouseFk;
-
- this.$.model.refresh();
- }
-
- get date() {
- return this._date;
- }
-
- set showOld(value) {
- this._showOld = value;
- if (!this._showOld) this.date = null;
- else this.date = new Date();
- }
-
- get showOld() {
- return this._showOld;
- }
-
- scrollToLine(lineFk) {
- this.$.$applyAsync(() => {
- const hashFk = this.lineFk || lineFk;
- const hash = `vnItemDiary-${hashFk}`;
- this.$location.hash(hash);
- this.$anchorScroll();
- });
- }
-
- showDescriptor(event, sale) {
- let descriptor = 'entryDescriptor';
- if (sale.isTicket)
- descriptor = 'ticketDescriptor';
-
- this.$[descriptor].show(event.target, sale.origin);
- }
-
- $onDestroy() {
- if (this.$state.getCurrentPath()[2].state.name === 'item')
- this.card.reload();
+ async $onInit() {
+ this.$state.go('item.card.summary', {id: this.$params.id});
+ window.location.href = await this.vnApp.getUrl(`item/${this.$params.id}/diary`);
}
}
-Controller.$inject = ['$element', '$scope', '$anchorScroll', '$location'];
-
ngModule.vnComponent('vnItemDiary', {
template: require('./index.html'),
controller: Controller,
bindings: {
item: '<'
- },
- require: {
- card: '?^vnItemCard'
}
});
diff --git a/modules/item/front/diary/index.spec.js b/modules/item/front/diary/index.spec.js
deleted file mode 100644
index a6302346d..000000000
--- a/modules/item/front/diary/index.spec.js
+++ /dev/null
@@ -1,99 +0,0 @@
-import './index.js';
-import crudModel from 'core/mocks/crud-model';
-
-describe('Item', () => {
- describe('Component vnItemDiary', () => {
- let $scope;
- let controller;
-
- beforeEach(ngModule('item'));
-
- beforeEach(inject(($componentController, $rootScope) => {
- $scope = $rootScope.$new();
- const $element = angular.element('');
- controller = $componentController('vnItemDiary', {$element, $scope});
- controller.$.model = crudModel;
- controller.$params = {id: 1};
- controller.card = {};
- }));
-
- describe('set item()', () => {
- it('should set warehouseFk property based on itemType warehouseFk', () => {
- jest.spyOn(controller.$, '$applyAsync');
- controller.vnConfig = {warehouseFk: 1};
- controller.item = {id: 1};
-
- expect(controller.$.$applyAsync).toHaveBeenCalledWith(jasmine.any(Function));
- $scope.$apply();
-
- expect(controller.warehouseFk).toEqual(1);
- expect(controller.item.id).toEqual(1);
- });
-
- it(`should set warehouseFk property based on url query warehouseFk`, () => {
- jest.spyOn(controller.$, '$applyAsync');
- controller.$params.warehouseFk = 4;
- controller.item = {id: 1, itemType: {warehouseFk: 1}};
-
- expect(controller.$.$applyAsync).toHaveBeenCalledWith(jasmine.any(Function));
- $scope.$apply();
-
- expect(controller.warehouseFk).toEqual(4);
- expect(controller.item.id).toEqual(1);
- });
- });
-
- describe('scrollToLine ()', () => {
- it('should assign $location then call anchorScroll using controller value', () => {
- jest.spyOn(controller, '$anchorScroll');
- controller.lineFk = 1;
- controller.scrollToLine('invalidValue');
-
- $scope.$apply();
-
- expect(controller.$location.hash()).toEqual(`vnItemDiary-${1}`);
- expect(controller.$anchorScroll).toHaveBeenCalledWith();
- });
-
- it('should assign $location then call anchorScroll using received value', () => {
- jest.spyOn(controller, '$anchorScroll');
- controller.lineFk = undefined;
- controller.scrollToLine(1);
-
- $scope.$apply();
-
- expect(controller.$location.hash()).toEqual(`vnItemDiary-${1}`);
- expect(controller.$anchorScroll).toHaveBeenCalledWith();
- });
- });
-
- describe('showDescriptor ()', () => {
- it('should call to the entryDescriptor show() method', () => {
- controller.$.entryDescriptor = {};
- controller.$.entryDescriptor.show = jest.fn();
-
- const $event = new Event('click');
- const target = document.createElement('div');
- target.dispatchEvent($event);
- const data = {id: 1, origin: 1};
- controller.showDescriptor($event, data);
-
- expect(controller.$.entryDescriptor.show).toHaveBeenCalledWith($event.target, data.origin);
- });
-
- it('should call to the ticketDescriptor show() method', () => {
- controller.$.ticketDescriptor = {};
- controller.$.ticketDescriptor.show = jest.fn();
-
- const $event = new Event('click');
- const target = document.createElement('div');
- target.dispatchEvent($event);
- const data = {id: 1, origin: 1, isTicket: true};
- controller.showDescriptor($event, data);
-
- expect(controller.$.ticketDescriptor.show).toHaveBeenCalledWith($event.target, data.origin);
- });
- });
- });
-});
-
diff --git a/modules/item/front/diary/locale/es.yml b/modules/item/front/diary/locale/es.yml
deleted file mode 100644
index a312da774..000000000
--- a/modules/item/front/diary/locale/es.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-In: Entrada
-Out: Salida
-Visible quantity: Cantidad visible
-Ticket/Entry: Ticket/Entrada
-Show what's before the inventory: Mostrar lo anterior al inventario
diff --git a/modules/item/front/diary/style.scss b/modules/item/front/diary/style.scss
deleted file mode 100644
index 0a6cafcb9..000000000
--- a/modules/item/front/diary/style.scss
+++ /dev/null
@@ -1,33 +0,0 @@
-@import "variables";
-
-vn-item-diary {
- & > vn-vertical {
- display: block;
- }
- vn-horizontal {
- justify-content: center;
- }
- vn-autocomplete > div {
- width: 400px;
- }
- .balanceNegative .balance {
- color: $color-alert;
- }
- .isIn .in {
- color: $color-success;
- font-weight: bold;
- }
- .isToday .date {
- color: white;
- background-color: $color-main;
- }
- .truncate {
- max-width: 250px;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
- }
- .table-check{
- justify-content: center;
- }
-}
diff --git a/modules/ticket/back/methods/expedition/deleteExpeditions.js b/modules/ticket/back/methods/expedition/deleteExpeditions.js
index 90a649425..75993a485 100644
--- a/modules/ticket/back/methods/expedition/deleteExpeditions.js
+++ b/modules/ticket/back/methods/expedition/deleteExpeditions.js
@@ -27,40 +27,33 @@ module.exports = Self => {
const deletedExpeditions = [];
for (let expeditionId of expeditionIds) {
- const filter = {
- fields: [],
- where: {
- id: expeditionId
- },
- include: [
- {
- relation: 'agencyMode',
- scope: {
- fields: ['code'],
+ try {
+ const expedition = await models.Expedition.findById(expeditionId, {
+ include: [
+ {
+ relation: 'agencyMode',
+ scope: {
+ fields: ['code'],
+ }
}
- }
- ]
- };
+ ]
+ });
+ const {code} = expedition.agencyMode();
- const expedition = await models.Expedition.findOne(filter);
- const {code} = expedition.agencyMode();
- let isDeleted = true;
+ if (code?.toLowerCase()?.includes('mrw') && expedition.externalId) {
+ const result = await models.MrwConfig.cancelShipment(expeditionId);
+ if (!result) throw new Error('not deleted');
+ }
- if (code?.toLowerCase()?.includes('mrw')) {
- const result = await models.MrwConfig.cancelShipment(expeditionId);
- isDeleted = result;
- }
+ if (code?.toLowerCase()?.substring(0, 10) == 'viaexpress') {
+ const result = await models.ViaexpressConfig.deleteExpedition(expeditionId);
+ if (result !== 'true') throw new Error('not deleted');
+ }
- if (code?.toLowerCase()?.substring(0, 10) == 'viaexpress') {
- const result = await models.ViaexpressConfig.deleteExpedition(expeditionId);
- if (result !== 'true') isDeleted = false;
- }
-
- if (!isDeleted)
- notDeletedExpeditions.push(expeditionId);
- else {
const deletedExpedition = await models.Expedition.destroyById(expeditionId);
deletedExpeditions.push(deletedExpedition);
+ } catch (e) {
+ notDeletedExpeditions.push(expeditionId);
}
}
diff --git a/modules/ticket/back/methods/ticket/saveSign.js b/modules/ticket/back/methods/ticket/saveSign.js
index a751bd93a..bc0da686c 100644
--- a/modules/ticket/back/methods/ticket/saveSign.js
+++ b/modules/ticket/back/methods/ticket/saveSign.js
@@ -51,23 +51,23 @@ module.exports = Self => {
fields: ['id']
});
- async function setLocation(ticketId) {
+ async function setLocation() {
await models.Delivery.create({
- ticketFk: ticketId,
+ ticketFk: ticket.id,
longitude: location.Longitude,
latitude: location.Latitude,
dated: signedTime || new Date()
}, myOptions);
}
- async function hasSignDms(ticketId) {
+ async function hasSignDms() {
const hasTicketDms = await Self.rawSql(`
SELECT d.id
FROM ticketDms td
JOIN dms d ON d.id = td.dmsFk
WHERE td.ticketFk = ?
AND d.dmsTypeFk = ?
- `, [ticketId, dmsTypeTicket.id], myOptions);
+ `, [ticket.id, dmsTypeTicket.id], myOptions);
if (hasTicketDms.length) return true;
}
@@ -133,9 +133,9 @@ module.exports = Self => {
if (await ticket.isSigned)
throw new UserError('Ticket is already signed');
- if (location) await setLocation(ticketId);
- if (!await hasSignDms(ticketId) && !isSignUploaded)
- await createGestDoc(ticketId);
+ if (location) await setLocation();
+ if (!await hasSignDms() && !isSignUploaded)
+ await createGestDoc();
if (isSignUploaded)
await models.TicketDms.create({ticketFk: ticket.id, dmsFk: dms[0].id}, myOptions);
await ticket.updateAttribute('isSigned', true, myOptions);
diff --git a/modules/worker/back/methods/worker-time-control/sendMail.js b/modules/worker/back/methods/worker-time-control/sendMail.js
index e43f4a8ab..2e1e00d83 100644
--- a/modules/worker/back/methods/worker-time-control/sendMail.js
+++ b/modules/worker/back/methods/worker-time-control/sendMail.js
@@ -165,8 +165,8 @@ module.exports = Self => {
const sql = ParameterizedSQL.join(stmts, ';');
const days = await conn.executeStmt(sql, myOptions);
- let previousWorkerFk = days[index][0].workerFk;
- let previousReceiver = days[index][0].receiver;
+ let previousWorkerFk = days[index][0]?.workerFk;
+ let previousReceiver = days[index][0]?.receiver;
const workerTimeControlConfig = await models.WorkerTimeControlConfig.findOne(null, myOptions);
diff --git a/modules/worker/back/methods/worker-time-control/weeklyHourRecordEmail.js b/modules/worker/back/methods/worker-time-control/weeklyHourRecordEmail.js
index f19ab17e1..e352eb3cb 100644
--- a/modules/worker/back/methods/worker-time-control/weeklyHourRecordEmail.js
+++ b/modules/worker/back/methods/worker-time-control/weeklyHourRecordEmail.js
@@ -61,7 +61,7 @@ module.exports = Self => {
const url = `${salix.url}worker/${args.workerId}/time-control?timestamp=${timestamp}`;
ctx.args.url = url;
- await models.WorkerTimeControl.updateMailState(ctx, ctx.workerId, myOptions);
+ await models.WorkerTimeControl.updateMailState(ctx, ctx.args.workerId, myOptions);
return Self.sendTemplate(ctx, 'weekly-hour-record');
};
diff --git a/modules/worker/front/time-control/index.js b/modules/worker/front/time-control/index.js
index 7f7bad137..2993e3986 100644
--- a/modules/worker/front/time-control/index.js
+++ b/modules/worker/front/time-control/index.js
@@ -380,7 +380,6 @@ class Controller extends Section {
updateWorkerTimeControlMail(state, reason) {
const params = {
- workerId: this.worker.id,
year: this.date.getFullYear(),
week: this.weekNumber,
state
@@ -389,7 +388,7 @@ class Controller extends Section {
if (reason)
params.reason = reason;
- const query = `WorkerTimeControls/updateWorkerTimeControlMail`;
+ const query = `WorkerTimeControls/${this.worker.id}/updateMailState`;
this.$http.post(query, params).then(() => {
this.getMailStates(this.date);
this.getWeekData();
diff --git a/modules/worker/front/time-control/index.spec.js b/modules/worker/front/time-control/index.spec.js
index 42df4ba9b..3868ded75 100644
--- a/modules/worker/front/time-control/index.spec.js
+++ b/modules/worker/front/time-control/index.spec.js
@@ -201,7 +201,7 @@ describe('Component vnWorkerTimeControl', () => {
controller.date = today;
controller.weekNumber = 1;
- $httpBackend.expect('POST', 'WorkerTimeControls/updateWorkerTimeControlMail').respond();
+ $httpBackend.expect('POST', 'WorkerTimeControls/1/updateMailState').respond();
controller.isSatisfied();
$httpBackend.flush();
@@ -236,7 +236,7 @@ describe('Component vnWorkerTimeControl', () => {
controller.weekNumber = 1;
controller.reason = 'reason';
- $httpBackend.expect('POST', 'WorkerTimeControls/updateWorkerTimeControlMail').respond();
+ $httpBackend.expect('POST', 'WorkerTimeControls/1/updateMailState').respond();
controller.isSatisfied();
$httpBackend.flush();
diff --git a/print/templates/email/sepa-core/locale/en.yml b/print/templates/email/sepa-core/locale/en.yml
new file mode 100644
index 000000000..c6cc4dab4
--- /dev/null
+++ b/print/templates/email/sepa-core/locale/en.yml
@@ -0,0 +1,16 @@
+subject: Bank Direct Debit Request
+title: SEPA CORE Direct Debit
+description:
+ dear: Dear Customer
+ instructions: Given the excellent relationship between our two companies
+ and to facilitate the payment processes of our invoices, we suggest the use
+ of the SEPA CORE direct debit system.
+ This service involves issuing our receipts to your company in an automated
+ and electronic manner, which represents a substantial reduction in costs for you
+ in terms of fees and bank charges.
+ If you accept our proposal, on the due date of each payment, it will be automatically
+ debited from your account through your bank.
+ This system is based on the electronic transmission of data; the handling of
+ physical documents has been eliminated.
+ We appreciate your cooperation,
+ conclusion: Thank you for your attention!
diff --git a/print/templates/email/sepa-core/locale/es.yml b/print/templates/email/sepa-core/locale/es.yml
index 10a1d32fe..a8dd9032e 100644
--- a/print/templates/email/sepa-core/locale/es.yml
+++ b/print/templates/email/sepa-core/locale/es.yml
@@ -9,9 +9,7 @@ description:
forma automatizada y electrónicamente, lo que supone para usted una reducción
sustancial de costos en términos de honorarios y gastos bancarios.
En caso de que acepte nuestra propuesta, a la fecha de vencimiento de cada efecto,
- se debitará a su cuenta automáticamente a través de su entidad bancaria.
- Por tanto, le pedimos que firme y envíe a su banco la autorización original adjunta,
- debidamente cumplimentada, y nos devuelva una fotocopia de dicha autorización.
+ se debitará a su cuenta automáticamente a través de su entidad bancaria.
Este sistema se basa en la transmisión electrónica de datos;
el manejo de documentos físicos ha sido eliminado.
Le agradecemos su cooperación,
diff --git a/print/templates/email/sepa-core/locale/fr.yml b/print/templates/email/sepa-core/locale/fr.yml
index 98bd7593a..6d76ef24f 100644
--- a/print/templates/email/sepa-core/locale/fr.yml
+++ b/print/templates/email/sepa-core/locale/fr.yml
@@ -14,11 +14,7 @@ description:
et commissions bancaires.
Dans le cas où vous accepteriez notre proposition, à
l’échéance de chaque effet, votre compte sera débité
- automatiquement par votre Banque.
- Ainsi, nous vous demandons de signer et envoyer à votre
- Banque l'original de l'autorisation pour débit en annexe,
- dûment remplie, et de nous retourner une photocopie de la
- dite autorisation.
+ automatiquement par votre Banque.
Ce système étant basé sur la transmission de données de
manière électronique, le maniement de documents
physiques á été éliminé
diff --git a/print/templates/reports/buy-label/sql/buys.sql b/print/templates/reports/buy-label/sql/buys.sql
index e05ca2a66..d75366815 100644
--- a/print/templates/reports/buy-label/sql/buys.sql
+++ b/print/templates/reports/buy-label/sql/buys.sql
@@ -28,4 +28,4 @@ SELECT ROW_NUMBER() OVER(ORDER BY b.id, num.n) labelNum,
LEFT JOIN origin o ON o.id = i.originFk
JOIN numbers num
WHERE b.entryFk = ?
- AND num.n <= b.stickers
\ No newline at end of file
+ AND num.n <= b.stickers
diff --git a/print/templates/reports/sepa-core/locale/en.yml b/print/templates/reports/sepa-core/locale/en.yml
new file mode 100644
index 000000000..6d7e23501
--- /dev/null
+++ b/print/templates/reports/sepa-core/locale/en.yml
@@ -0,0 +1,46 @@
+reportName: direct-debit-order
+title: SEPA CORE Direct Debit Order
+description: By signing this direct debit order, the debtor authorizes (A) the creditor
+ to send instructions to the debtor's bank to debit their account and (B) the bank to debit
+ their account according to the creditor's instructions. As part of their rights,
+ the debtor is entitled to a refund by their bank under the terms and conditions
+ of the contract signed with the bank. The refund request must be made within
+ eight weeks of the debit. You can obtain additional information about your rights
+ from your financial institution.
+documentCopy: You must take a signed copy of this document to your Bank for registration to avoid returns.
+mandatoryFields: ALL FIELDS MUST BE COMPLETED.
+sendOrder: ONCE THIS DIRECT DEBIT ORDER IS SIGNED, IT MUST BE SENT TO THE CREDITOR
+ FOR SAFEGUARDING AND IT IS RECOMMENDED TO PROVIDE A COPY TO YOUR BANK.
+supplier:
+ toCompleteBySupplier: To be completed by the creditor
+ orderReference: Direct debit order reference
+ identifier: Creditor identifier
+ name: Creditor's name
+ street: Address
+ location: Postal Code - City - Province
+ country: Country
+client:
+ toCompleteByClient: To be completed by the debtor
+ name: Debtor's name(s)
+ fiscalId: NIF
+ street: Debtor's address
+ location: Postal Code - City - Province
+ country: Debtor's country
+ swift: Swift BIC
+ accountNumber: IBAN
+ accountHolder: "(Account holder(s))"
+ accountNumberFormat: In {0}, the IBAN consists of {1} characters always starting with {2}
+ paymentType: Payment type
+ recurrent: Recurrent
+ unique: Unique
+ signLocation: Date - City
+ sign: Debtor's signature and stamp
+order: Direct Debit Order {0}
+Francia: France
+España: Spain
+Portugal: Portugal
+instructions:
+ title: Instructions
+ accountFields: Fill in the fields related to the bank account
+ signDocument: Sign and stamp the document. For it to be valid, the stamp must show the CIF/NIF. If not, the request must be accompanied by an account ownership certificate.
+ thanks: Thank you for your cooperation!
\ No newline at end of file
diff --git a/print/templates/reports/sepa-core/sepa-core.js b/print/templates/reports/sepa-core/sepa-core.js
index 6b941556e..8c4e4911c 100755
--- a/print/templates/reports/sepa-core/sepa-core.js
+++ b/print/templates/reports/sepa-core/sepa-core.js
@@ -1,13 +1,12 @@
const vnReport = require('../../../core/mixins/vn-report.js');
-const db = require('../../../core/database');
module.exports = {
name: 'sepa-core',
mixins: [vnReport],
async serverPrefetch() {
- this.client = await this.findOneFromDef('client', [this.companyId, this.companyId, this.id]);
+ this.client = await this.findOneFromDef('client', [this.id]);
this.checkMainEntity(this.client);
- const suppliers = await this.rawSqlFromDef('supplier', [this.companyId, this.companyId, this.id]);
+ const suppliers = await this.rawSqlFromDef('supplier', [this.companyId, this.id]);
this.supplier = {
...suppliers[0],
accountDetailValue: suppliers.map(val => val?.accountDetailValue)
@@ -23,16 +22,5 @@ module.exports = {
type: Number,
required: true
}
- },
- methods: {
- getSupplierCif() {
- return db.findOne(`
- SELECT DISTINCT ad.value
- FROM supplierAccount sa
- JOIN accountDetail ad ON ad.supplierAccountFk = sa.id
- JOIN accountDetailType adt ON adt.id = ad.accountDetailTypeFk AND adt.id = 3
- WHERE sa.supplierFk = ?`) [this.companyId];
- }
}
-
};
diff --git a/print/templates/reports/sepa-core/sql/client.sql b/print/templates/reports/sepa-core/sql/client.sql
index b3ba180b3..6e0ec89eb 100644
--- a/print/templates/reports/sepa-core/sql/client.sql
+++ b/print/templates/reports/sepa-core/sql/client.sql
@@ -1,19 +1,14 @@
-SELECT
- c.id,
- m.code mandateCode,
+SELECT c.id,
c.socialName,
c.street,
c.postcode,
c.city,
c.fi,
- p.name AS province,
+ p.name province,
ct.name country,
- ct.code AS countryCode,
- ct.ibanLength AS ibanLength
-FROM client c
- JOIN country ct ON ct.id = c.countryFk
- LEFT JOIN mandate m ON m.clientFk = c.id
- AND m.companyFk = ? AND m.finished IS NULL
- LEFT JOIN province p ON p.id = c.provinceFk
-WHERE (m.companyFk = ? OR m.companyFk IS NULL) AND c.id = ?
-ORDER BY m.created DESC LIMIT 1
\ No newline at end of file
+ ct.code countryCode,
+ ct.ibanLength ibanLength
+ FROM client c
+ JOIN country ct ON ct.id = c.countryFk
+ JOIN province p ON p.id = c.provinceFk
+ WHERE c.id = ?
\ No newline at end of file
diff --git a/print/templates/reports/sepa-core/sql/supplier.sql b/print/templates/reports/sepa-core/sql/supplier.sql
index 1276f2437..da543147a 100644
--- a/print/templates/reports/sepa-core/sql/supplier.sql
+++ b/print/templates/reports/sepa-core/sql/supplier.sql
@@ -1,29 +1,24 @@
-SELECT
- m.code mandateCode,
- s.name,
- s.street,
- sc.name country,
- s.postCode,
- s.city,
- sp.name province,
- s.nif,
- sa.supplierFk,
- be.name bankName,
- ad.value accountDetailValue
-FROM
- client c
- LEFT JOIN mandate m ON m.clientFk = c.id AND m.companyFk = ? AND m.finished IS NULL
- LEFT JOIN supplier s ON s.id = m.companyFk
- LEFT JOIN country sc ON sc.id = s.countryFk
- LEFT JOIN province sp ON sp.id = s.provinceFk
- LEFT JOIN province p ON p.id = c.provinceFk
- LEFT JOIN supplierAccount sa ON sa.supplierFk = s.id
- LEFT JOIN bankEntity be ON sa.bankEntityFk = be.id
- LEFT JOIN accountDetail ad ON ad.supplierAccountFk = sa.id
- JOIN accountDetailType adt ON adt.id = ad.accountDetailTypeFk AND adt.id = 3
-WHERE
- (m.companyFk = ? OR m.companyFk IS NULL)
- AND (c.id = ? OR (c.id IS NULL AND c.countryFk = sa.countryFk))
-GROUP BY ad.value
-ORDER BY
-m.created DESC;
+SELECT m.code mandateCode,
+ s.name,
+ s.street,
+ sc.name country,
+ s.postCode,
+ s.city,
+ sp.name province,
+ ad.value accountDetailValue
+ FROM client c
+ JOIN mandate m ON m.clientFk = c.id
+ JOIN mandateType mt ON mt.id = m.mandateTypeFk
+ JOIN supplier s ON s.id = m.companyFk
+ LEFT JOIN country sc ON sc.id = s.countryFk
+ LEFT JOIN province sp ON sp.id = s.provinceFk
+ JOIN supplierAccount sa ON sa.supplierFk = s.id
+ JOIN accountDetail ad ON ad.supplierAccountFk = sa.id
+ JOIN accountDetailType adt ON adt.id = ad.accountDetailTypeFk
+ WHERE m.companyFk = ?
+ AND m.finished IS NULL
+ AND c.id = ?
+ AND mt.name = 'CORE'
+ AND adt.description = 'Referencia Remesas'
+ GROUP BY m.id, ad.value
+ ORDER BY m.created DESC
\ No newline at end of file