diff --git a/back/methods/collection/getTickets.js b/back/methods/collection/getTickets.js
index 48301a366..3c2f6cb2d 100644
--- a/back/methods/collection/getTickets.js
+++ b/back/methods/collection/getTickets.js
@@ -57,10 +57,10 @@ module.exports = Self => {
ROW_NUMBER () OVER (PARTITION BY s.id ORDER BY pickingOrder) currentItemShelving,
COUNT(*) OVER (PARTITION BY s.id ORDER BY s.id) totalItemShelving,
sh.code,
- p2.code parkingCode,
- p2.pickingOrder pickingOrder,
- p.code parkingCodePrevia,
- p.pickingOrder pickingOrderPrevia,
+ p2.code parkingCodePrevia,
+ p2.pickingOrder pickingOrderPrevia,
+ p.code parkingCode,
+ p.pickingOrder pickingOrder,
iss.id itemShelvingSaleFk,
iss.isPicked,
iss.itemShelvingFk
@@ -73,7 +73,7 @@ module.exports = Self => {
JOIN item i ON i.id = s.itemFk
JOIN itemShelvingSale iss ON iss.saleFk = s.id
LEFT JOIN itemShelving ish ON ish.id = iss.itemShelvingFk
- LEFT JOIN shelving sh ON sh.code = ish.shelvingFk
+ LEFT JOIN shelving sh ON sh.id = ish.shelvingFk
LEFT JOIN parking p ON p.id = sh.parkingFk
LEFT JOIN itemColor ic ON ic.itemFk = s.itemFk
LEFT JOIN origin o ON o.id = i.originFk
@@ -114,7 +114,7 @@ module.exports = Self => {
JOIN item i ON i.id = s.itemFk
JOIN itemShelvingSale iss ON iss.saleFk = s.id
LEFT JOIN itemShelving ish ON ish.id = iss.itemShelvingFk
- LEFT JOIN shelving sh ON sh.code = ish.shelvingFk
+ LEFT JOIN shelving sh ON sh.id = ish.shelvingFk
LEFT JOIN parking p ON p.id = sh.parkingFk
LEFT JOIN itemColor ic ON ic.itemFk = s.itemFk
LEFT JOIN origin o ON o.id = i.originFk
diff --git a/back/methods/mrw-config/cancelShipment.js b/back/methods/mrw-config/cancelShipment.js
index 56d206529..98aa8be39 100644
--- a/back/methods/mrw-config/cancelShipment.js
+++ b/back/methods/mrw-config/cancelShipment.js
@@ -39,6 +39,9 @@ module.exports = Self => {
const xmlString = response.data;
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(xmlString, 'text/xml');
+
+ await Self.rawSql('CALL util.debugAdd(?,?);', ['cancelShipment', xmlDoc]);
+
const result = xmlDoc.getElementsByTagName('Mensaje')[0].textContent;
return result.toLowerCase().includes('se ha cancelado correctamente');
};
diff --git a/back/model-config.json b/back/model-config.json
index 364ffabdf..b543071c9 100644
--- a/back/model-config.json
+++ b/back/model-config.json
@@ -79,6 +79,9 @@
"ImageCollectionSize": {
"dataSource": "vn"
},
+ "ImageConfig": {
+ "dataSource": "vn"
+ },
"ImageContainer": {
"dataSource": "imageStorage"
},
diff --git a/back/models/image-config.json b/back/models/image-config.json
new file mode 100644
index 000000000..11f4c2284
--- /dev/null
+++ b/back/models/image-config.json
@@ -0,0 +1,22 @@
+{
+ "name": "ImageConfig",
+ "base": "VnModel",
+ "options": {
+ "mysql": {
+ "table": "hedera.imageConfig"
+ }
+ },
+ "properties": {
+ "url": {
+ "type": "string"
+ }
+ },
+ "acls": [
+ {
+ "accessType": "READ",
+ "principalType": "ROLE",
+ "principalId": "$authenticated",
+ "permission": "ALLOW"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/back/models/say-simple-config.json b/back/models/say-simple-config.json
index edc4caa43..d5d4f8a6f 100644
--- a/back/models/say-simple-config.json
+++ b/back/models/say-simple-config.json
@@ -13,6 +13,9 @@
},
"url": {
"type": "string"
+ },
+ "defaultChannel": {
+ "type": "number"
}
},
"acls": [
diff --git a/db/dump/.dump/data.sql b/db/dump/.dump/data.sql
index 870b24f49..6bcfe2c9f 100644
--- a/db/dump/.dump/data.sql
+++ b/db/dump/.dump/data.sql
@@ -2084,7 +2084,7 @@ INSERT INTO `ACL` VALUES (756,'Route','findOne','READ','ALLOW','ROLE','employee'
INSERT INTO `ACL` VALUES (757,'Route','getRoutesByWorker','READ','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (758,'Route','canViewAllRoute','READ','ALLOW','ROLE','deliveryAssistant',NULL);
INSERT INTO `ACL` VALUES (759,'Route','cmr','READ','ALLOW','ROLE','employee',NULL);
-INSERT INTO `ACL` VALUES (760,'Route','downloadCmrsZip','READ','ALLOW','ROLE','employee',NULL);
+INSERT INTO `ACL` VALUES (760,'Cmr','downloadZip','READ','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (761,'Route','downloadZip','READ','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (762,'Route','filter','READ','ALLOW','ROLE','employee',NULL);
INSERT INTO `ACL` VALUES (763,'Route','getByWorker','READ','ALLOW','ROLE','employee',NULL);
diff --git a/db/dump/.dump/structure.sql b/db/dump/.dump/structure.sql
index e4e59a6bf..e6c0e6674 100644
--- a/db/dump/.dump/structure.sql
+++ b/db/dump/.dump/structure.sql
@@ -2955,55 +2955,55 @@ DELIMITER ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `analisis_ventas_update`()
-BEGIN
- DECLARE vLastMonth DATE;
-
- SET vLastMonth = util.firstDayOfMonth(TIMESTAMPADD(MONTH, -1, util.VN_CURDATE()));
-
- DELETE FROM analisis_ventas
- WHERE Año > YEAR(vLastMonth)
- OR (Año = YEAR(vLastMonth) AND Mes >= MONTH(vLastMonth));
-
- INSERT INTO analisis_ventas (
- Familia,
- Reino,
- Comercial,
- Comprador,
- Provincia,
- almacen,
- Año,
- Mes,
- Semana,
- Vista,
- Importe
- )
- SELECT
- it.name,
- ic.name,
- w.code,
- w2.code,
- p.name,
- wa.name,
- tm.year,
- tm.month,
- tm.week,
- dm.description,
- bt.importe
- FROM bs.ventas bt
- LEFT JOIN vn.itemType it ON it.id = bt.tipo_id
- LEFT JOIN vn.itemCategory ic ON ic.id = it.categoryFk
- LEFT JOIN vn.client c on c.id = bt.Id_Cliente
- LEFT JOIN vn.worker w ON w.id = c.salesPersonFk
- LEFT JOIN vn.worker w2 ON w2.id = it.workerFk
- JOIN vn.time tm ON tm.dated = bt.fecha
- JOIN vn.sale s ON s.id = bt.Id_Movimiento
- LEFT JOIN vn.ticket t ON t.id = s.ticketFk
- JOIN vn.agencyMode am ON am.id = t.agencyModeFk
- LEFT JOIN vn.deliveryMethod dm ON dm.id = am.deliveryMethodFk
- LEFT JOIN vn.address a ON a.id = t.addressFk
- LEFT JOIN vn.province p ON p.id = a.provinceFk
- LEFT JOIN vn.warehouse wa ON wa.id = t.warehouseFk
- WHERE bt.fecha >= vLastMonth AND ic.merchandise;
+BEGIN
+ DECLARE vLastMonth DATE;
+
+ SET vLastMonth = util.firstDayOfMonth(TIMESTAMPADD(MONTH, -1, util.VN_CURDATE()));
+
+ DELETE FROM analisis_ventas
+ WHERE Año > YEAR(vLastMonth)
+ OR (Año = YEAR(vLastMonth) AND Mes >= MONTH(vLastMonth));
+
+ INSERT INTO analisis_ventas (
+ Familia,
+ Reino,
+ Comercial,
+ Comprador,
+ Provincia,
+ almacen,
+ Año,
+ Mes,
+ Semana,
+ Vista,
+ Importe
+ )
+ SELECT
+ it.name,
+ ic.name,
+ w.code,
+ w2.code,
+ p.name,
+ wa.name,
+ tm.year,
+ tm.month,
+ tm.week,
+ dm.description,
+ bt.importe
+ FROM bs.ventas bt
+ LEFT JOIN vn.itemType it ON it.id = bt.tipo_id
+ LEFT JOIN vn.itemCategory ic ON ic.id = it.categoryFk
+ LEFT JOIN vn.client c on c.id = bt.Id_Cliente
+ LEFT JOIN vn.worker w ON w.id = c.salesPersonFk
+ LEFT JOIN vn.worker w2 ON w2.id = it.workerFk
+ JOIN vn.time tm ON tm.dated = bt.fecha
+ JOIN vn.sale s ON s.id = bt.Id_Movimiento
+ LEFT JOIN vn.ticket t ON t.id = s.ticketFk
+ JOIN vn.agencyMode am ON am.id = t.agencyModeFk
+ LEFT JOIN vn.deliveryMethod dm ON dm.id = am.deliveryMethodFk
+ LEFT JOIN vn.address a ON a.id = t.addressFk
+ LEFT JOIN vn.province p ON p.id = a.provinceFk
+ LEFT JOIN vn.warehouse wa ON wa.id = t.warehouseFk
+ WHERE bt.fecha >= vLastMonth AND ic.merchandise;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -3021,21 +3021,21 @@ DELIMITER ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `clean`()
-BEGIN
- DECLARE vDateShort DATETIME;
- DECLARE vDateLong DATETIME;
- DECLARE vOneYearAgo DATETIME;
-
- SET vDateShort = TIMESTAMPADD(MONTH, -2, util.VN_CURDATE());
- SET vDateLong = TIMESTAMPADD(MONTH, -18,util.VN_CURDATE());
- SET vOneYearAgo = TIMESTAMPADD(YEAR, -1,util.VN_CURDATE());
-
- DELETE FROM bi.Greuge_Evolution
- WHERE (Fecha < vDateShort AND weekday(Fecha) != 1)
- OR Fecha < vOneYearAgo;
-
- DELETE FROM bi.defaulters WHERE `date` < vDateLong;
- DELETE FROM bi.defaulting WHERE `date` < vDateLong;
+BEGIN
+ DECLARE vDateShort DATETIME;
+ DECLARE vDateLong DATETIME;
+ DECLARE vOneYearAgo DATETIME;
+
+ SET vDateShort = TIMESTAMPADD(MONTH, -2, util.VN_CURDATE());
+ SET vDateLong = TIMESTAMPADD(MONTH, -18,util.VN_CURDATE());
+ SET vOneYearAgo = TIMESTAMPADD(YEAR, -1,util.VN_CURDATE());
+
+ DELETE FROM bi.Greuge_Evolution
+ WHERE (Fecha < vDateShort AND weekday(Fecha) != 1)
+ OR Fecha < vOneYearAgo;
+
+ DELETE FROM bi.defaulters WHERE `date` < vDateLong;
+ DELETE FROM bi.defaulting WHERE `date` < vDateLong;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -3224,18 +3224,18 @@ DELIMITER ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `facturacion_media_anual_update`()
-BEGIN
- TRUNCATE TABLE bs.clientAnnualConsumption;
-
- REPLACE bi.facturacion_media_anual(Id_Cliente, Consumo)
- SELECT clientFk, avg(Facturacion)
- FROM (
- SELECT clientFk, YEAR(issued) year, MONTH(issued) month, sum(amount) as Facturacion
- FROM vn.invoiceOut
- WHERE issued BETWEEN TIMESTAMPADD(YEAR,-1,util.VN_CURDATE()) AND TIMESTAMPADD(DAY, - DAY(util.VN_CURDATE()),util.VN_CURDATE())
- GROUP BY clientFk, year, month
- ) vol
- GROUP BY clientFk;
+BEGIN
+ TRUNCATE TABLE bs.clientAnnualConsumption;
+
+ REPLACE bi.facturacion_media_anual(Id_Cliente, Consumo)
+ SELECT clientFk, avg(Facturacion)
+ FROM (
+ SELECT clientFk, YEAR(issued) year, MONTH(issued) month, sum(amount) as Facturacion
+ FROM vn.invoiceOut
+ WHERE issued BETWEEN TIMESTAMPADD(YEAR,-1,util.VN_CURDATE()) AND TIMESTAMPADD(DAY, - DAY(util.VN_CURDATE()),util.VN_CURDATE())
+ GROUP BY clientFk, year, month
+ ) vol
+ GROUP BY clientFk;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -4516,29 +4516,29 @@ DELIMITER ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `carteras_add`()
-BEGIN
-/**
- * Inserta en la tabla @bs.carteras las ventas desde el año pasado
- * agrupadas por trabajador, año y mes
- */
- DECLARE vYear INT DEFAULT YEAR(util.VN_CURDATE()) - 1;
-
- DELETE FROM bs.carteras WHERE Año >= vYear;
-
- CALL util.time_generate(
- MAKEDATE(vYear, 1),
- (SELECT MAX(fecha) FROM ventas)
- );
-
- INSERT INTO carteras(Año, Mes , CodigoTrabajador, Peso)
- SELECT t.`year`, t.`month`, w.code, SUM(v.importe)
- FROM tmp.time t
- JOIN ventas v on t.dated = v.fecha
- JOIN vn.client c on c.id = v.Id_Cliente
- JOIN vn.worker w ON w.id = c.salesPersonFk
- GROUP BY w.code, t.`year`, t.`month`;
-
- DROP TEMPORARY TABLE tmp.time;
+BEGIN
+/**
+ * Inserta en la tabla @bs.carteras las ventas desde el año pasado
+ * agrupadas por trabajador, año y mes
+ */
+ DECLARE vYear INT DEFAULT YEAR(util.VN_CURDATE()) - 1;
+
+ DELETE FROM bs.carteras WHERE Año >= vYear;
+
+ CALL util.time_generate(
+ MAKEDATE(vYear, 1),
+ (SELECT MAX(fecha) FROM ventas)
+ );
+
+ INSERT INTO carteras(Año, Mes , CodigoTrabajador, Peso)
+ SELECT t.`year`, t.`month`, w.code, SUM(v.importe)
+ FROM tmp.time t
+ JOIN ventas v on t.dated = v.fecha
+ JOIN vn.client c on c.id = v.Id_Cliente
+ JOIN vn.worker w ON w.id = c.salesPersonFk
+ GROUP BY w.code, t.`year`, t.`month`;
+
+ DROP TEMPORARY TABLE tmp.time;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -5465,82 +5465,82 @@ DELIMITER ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `nightTask_launchAll`()
-BEGIN
-/**
- * Runs all nightly tasks.
- */
- DECLARE vDone BOOL;
- DECLARE vError VARCHAR(255);
- DECLARE vErrorCode VARCHAR(255);
- DECLARE vSchema VARCHAR(255);
- DECLARE vProcedure VARCHAR(255);
- DECLARE vLogMail VARCHAR(255);
- DECLARE vNightTaskFk INT;
-
- DECLARE vQueue CURSOR FOR
- SELECT id, `schema`, `procedure`
- FROM nightTask
- WHERE finished <= util.VN_CURDATE()
- OR finished IS NULL
- ORDER BY `order`;
-
- DECLARE CONTINUE HANDLER FOR NOT FOUND
- SET vDone = TRUE;
-
- SET max_sp_recursion_depth = 3;
-
- SELECT logMail INTO vLogMail
- FROM nightTaskConfig LIMIT 1;
-
- OPEN vQueue;
- l: LOOP
- SET vDone = FALSE;
- FETCH vQueue INTO vNightTaskFk, vSchema, vProcedure;
-
- IF vDone THEN
- LEAVE l;
- END IF;
-
- UPDATE nightTask
- SET `started` = util.VN_NOW(),
- `finished` = NULL,
- `error` = NULL,
- `errorCode` = NULL
- WHERE id = vNightTaskFk;
-
- SET vError = NULL;
- CALL nightTask_launchTask(
- vSchema,
- vProcedure,
- vError,
- vErrorCode
- );
-
- IF vError IS NOT NULL THEN
- IF vLogMail IS NOT NULL THEN
- CALL vn.mail_insert(
- vLogMail,
- NULL,
- CONCAT('Nightly task failed (', vSchema, '.', vProcedure, ')'),
- CONCAT(
- '[', vErrorCode, '] ', vError, CHAR(13, 10), -- Line break
- 'See ', SCHEMA(), '.nightTask table for more info.'
- )
- );
- END IF;
-
- UPDATE nightTask
- SET `error` = vError,
- `errorCode` = vErrorCode
- WHERE id = vNightTaskFk;
- ELSE
- UPDATE nightTask
- SET finished = util.VN_NOW(),
- lastFinished = util.VN_NOW()
- WHERE id = vNightTaskFk;
- END IF;
- END LOOP;
- CLOSE vQueue;
+BEGIN
+/**
+ * Runs all nightly tasks.
+ */
+ DECLARE vDone BOOL;
+ DECLARE vError VARCHAR(255);
+ DECLARE vErrorCode VARCHAR(255);
+ DECLARE vSchema VARCHAR(255);
+ DECLARE vProcedure VARCHAR(255);
+ DECLARE vLogMail VARCHAR(255);
+ DECLARE vNightTaskFk INT;
+
+ DECLARE vQueue CURSOR FOR
+ SELECT id, `schema`, `procedure`
+ FROM nightTask
+ WHERE finished <= util.VN_CURDATE()
+ OR finished IS NULL
+ ORDER BY `order`;
+
+ DECLARE CONTINUE HANDLER FOR NOT FOUND
+ SET vDone = TRUE;
+
+ SET max_sp_recursion_depth = 3;
+
+ SELECT logMail INTO vLogMail
+ FROM nightTaskConfig LIMIT 1;
+
+ OPEN vQueue;
+ l: LOOP
+ SET vDone = FALSE;
+ FETCH vQueue INTO vNightTaskFk, vSchema, vProcedure;
+
+ IF vDone THEN
+ LEAVE l;
+ END IF;
+
+ UPDATE nightTask
+ SET `started` = util.VN_NOW(),
+ `finished` = NULL,
+ `error` = NULL,
+ `errorCode` = NULL
+ WHERE id = vNightTaskFk;
+
+ SET vError = NULL;
+ CALL nightTask_launchTask(
+ vSchema,
+ vProcedure,
+ vError,
+ vErrorCode
+ );
+
+ IF vError IS NOT NULL THEN
+ IF vLogMail IS NOT NULL THEN
+ CALL vn.mail_insert(
+ vLogMail,
+ NULL,
+ CONCAT('Nightly task failed (', vSchema, '.', vProcedure, ')'),
+ CONCAT(
+ '[', vErrorCode, '] ', vError, CHAR(13, 10), -- Line break
+ 'See ', SCHEMA(), '.nightTask table for more info.'
+ )
+ );
+ END IF;
+
+ UPDATE nightTask
+ SET `error` = vError,
+ `errorCode` = vErrorCode
+ WHERE id = vNightTaskFk;
+ ELSE
+ UPDATE nightTask
+ SET finished = util.VN_NOW(),
+ lastFinished = util.VN_NOW()
+ WHERE id = vNightTaskFk;
+ END IF;
+ END LOOP;
+ CLOSE vQueue;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -7285,27 +7285,27 @@ DELIMITER ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `cache_calc_end`(IN `v_calc` INT)
-BEGIN
- DECLARE v_cache_name VARCHAR(255);
- DECLARE v_params VARCHAR(255);
-
- -- Libera el bloqueo y actualiza la fecha de ultimo refresco.
-
- UPDATE cache_calc cc JOIN cache c ON c.id = cc.cache_id
- SET
- cc.last_refresh = NOW(),
- cc.expires = ADDTIME(NOW(), c.lifetime),
- cc.connection_id = NULL
- WHERE cc.id = v_calc;
-
- SELECT c.name, ca.params INTO v_cache_name, v_params
- FROM cache c
- JOIN cache_calc ca ON c.id = ca.cache_id
- WHERE ca.id = v_calc;
-
- IF v_cache_name IS NOT NULL THEN
- DO RELEASE_LOCK(CONCAT_WS('/', v_cache_name, IFNULL(v_params, '')));
- END IF;
+BEGIN
+ DECLARE v_cache_name VARCHAR(255);
+ DECLARE v_params VARCHAR(255);
+
+ -- Libera el bloqueo y actualiza la fecha de ultimo refresco.
+
+ UPDATE cache_calc cc JOIN cache c ON c.id = cc.cache_id
+ SET
+ cc.last_refresh = NOW(),
+ cc.expires = ADDTIME(NOW(), c.lifetime),
+ cc.connection_id = NULL
+ WHERE cc.id = v_calc;
+
+ SELECT c.name, ca.params INTO v_cache_name, v_params
+ FROM cache c
+ JOIN cache_calc ca ON c.id = ca.cache_id
+ WHERE ca.id = v_calc;
+
+ IF v_cache_name IS NOT NULL THEN
+ DO RELEASE_LOCK(CONCAT_WS('/', v_cache_name, IFNULL(v_params, '')));
+ END IF;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -7323,89 +7323,89 @@ DELIMITER ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `cache_calc_start`(OUT `v_calc` INT, INOUT `v_refresh` INT, IN `v_cache_name` VARCHAR(50), IN `v_params` VARCHAR(100))
-proc: BEGIN
- DECLARE v_valid BOOL;
- DECLARE v_lock_id VARCHAR(100);
- DECLARE v_cache_id INT;
- DECLARE v_expires DATETIME;
- DECLARE v_clean_time DATETIME;
- DECLARE vLastRefresh DATETIME;
-
- DECLARE EXIT HANDLER FOR SQLEXCEPTION
- BEGIN
- IF v_lock_id IS NOT NULL THEN
- DO RELEASE_LOCK(v_lock_id);
- END IF;
-
- RESIGNAL;
- END;
-
- SET v_params = IFNULL(v_params, '');
-
- -- Si el servidor se ha reiniciado invalida todos los calculos.
-
- SELECT COUNT(*) > 0 INTO v_valid FROM cache_valid;
-
- IF !v_valid
- THEN
- DELETE FROM cache_calc;
- INSERT INTO cache_valid (valid) VALUES (TRUE);
- END IF;
-
- -- Obtiene un bloqueo exclusivo para que no haya problemas de concurrencia.
-
- SET v_lock_id = CONCAT_WS('/', v_cache_name, v_params);
-
- IF !GET_LOCK(v_lock_id, 30)
- THEN
- SET v_calc = NULL;
- SET v_refresh = FALSE;
- LEAVE proc;
- END IF;
-
- -- Comprueba si el calculo solicitado existe y esta actualizado.
-
- SELECT c.id, ca.id, ca.expires, ca.last_refresh
- INTO v_cache_id, v_calc, v_expires, vLastRefresh
- FROM cache c
- LEFT JOIN cache_calc ca
- ON ca.cache_id = c.id AND ca.params = v_params COLLATE 'utf8_general_ci'
- WHERE c.name = v_cache_name COLLATE 'utf8_general_ci';
-
- -- Si existe una calculo valido libera el bloqueo y devuelve su identificador.
-
- IF !v_refresh AND NOW() < v_expires AND vLastRefresh >= CURDATE()
- THEN
- DO RELEASE_LOCK(v_lock_id);
- SET v_refresh = FALSE;
- LEAVE proc;
- END IF;
-
- -- Si el calculo no existe le crea una entrada en la tabla de calculos.
-
- IF v_calc IS NULL
- THEN
- INSERT INTO cache_calc SET
- cache_id = v_cache_id,
- cacheName = v_cache_name,
- params = v_params,
- last_refresh = NULL,
- expires = NULL,
- connection_id = CONNECTION_ID();
-
- SET v_calc = LAST_INSERT_ID();
- ELSE
- UPDATE cache_calc
- SET
- last_refresh = NULL,
- expires = NULL,
- connection_id = CONNECTION_ID()
- WHERE id = v_calc;
- END IF;
-
- -- Si se debe recalcular mantiene el bloqueo y devuelve su identificador.
-
- SET v_refresh = TRUE;
+proc: BEGIN
+ DECLARE v_valid BOOL;
+ DECLARE v_lock_id VARCHAR(100);
+ DECLARE v_cache_id INT;
+ DECLARE v_expires DATETIME;
+ DECLARE v_clean_time DATETIME;
+ DECLARE vLastRefresh DATETIME;
+
+ DECLARE EXIT HANDLER FOR SQLEXCEPTION
+ BEGIN
+ IF v_lock_id IS NOT NULL THEN
+ DO RELEASE_LOCK(v_lock_id);
+ END IF;
+
+ RESIGNAL;
+ END;
+
+ SET v_params = IFNULL(v_params, '');
+
+ -- Si el servidor se ha reiniciado invalida todos los calculos.
+
+ SELECT COUNT(*) > 0 INTO v_valid FROM cache_valid;
+
+ IF !v_valid
+ THEN
+ DELETE FROM cache_calc;
+ INSERT INTO cache_valid (valid) VALUES (TRUE);
+ END IF;
+
+ -- Obtiene un bloqueo exclusivo para que no haya problemas de concurrencia.
+
+ SET v_lock_id = CONCAT_WS('/', v_cache_name, v_params);
+
+ IF !GET_LOCK(v_lock_id, 30)
+ THEN
+ SET v_calc = NULL;
+ SET v_refresh = FALSE;
+ LEAVE proc;
+ END IF;
+
+ -- Comprueba si el calculo solicitado existe y esta actualizado.
+
+ SELECT c.id, ca.id, ca.expires, ca.last_refresh
+ INTO v_cache_id, v_calc, v_expires, vLastRefresh
+ FROM cache c
+ LEFT JOIN cache_calc ca
+ ON ca.cache_id = c.id AND ca.params = v_params COLLATE 'utf8_general_ci'
+ WHERE c.name = v_cache_name COLLATE 'utf8_general_ci';
+
+ -- Si existe una calculo valido libera el bloqueo y devuelve su identificador.
+
+ IF !v_refresh AND NOW() < v_expires AND vLastRefresh >= CURDATE()
+ THEN
+ DO RELEASE_LOCK(v_lock_id);
+ SET v_refresh = FALSE;
+ LEAVE proc;
+ END IF;
+
+ -- Si el calculo no existe le crea una entrada en la tabla de calculos.
+
+ IF v_calc IS NULL
+ THEN
+ INSERT INTO cache_calc SET
+ cache_id = v_cache_id,
+ cacheName = v_cache_name,
+ params = v_params,
+ last_refresh = NULL,
+ expires = NULL,
+ connection_id = CONNECTION_ID();
+
+ SET v_calc = LAST_INSERT_ID();
+ ELSE
+ UPDATE cache_calc
+ SET
+ last_refresh = NULL,
+ expires = NULL,
+ connection_id = CONNECTION_ID()
+ WHERE id = v_calc;
+ END IF;
+
+ -- Si se debe recalcular mantiene el bloqueo y devuelve su identificador.
+
+ SET v_refresh = TRUE;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -10429,28 +10429,28 @@ DELIMITER ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
-CREATE DEFINER=`root`@`localhost` PROCEDURE `contact_request`(
- vName VARCHAR(100),
- vPhone VARCHAR(15),
- vEmail VARCHAR(100),
+CREATE DEFINER=`root`@`localhost` PROCEDURE `contact_request`(
+ vName VARCHAR(100),
+ vPhone VARCHAR(15),
+ vEmail VARCHAR(100),
vMessage TEXT)
READS SQL DATA
-BEGIN
-/**
- * Set actions for contact request
- *
- * @param vName Name
- * @param vPhone Phone number
- * @param vEmail e-mail
- * @param vMessage text of the message
- */
-
- CALL vn.mail_insert(
- 'floranet@verdnatura.es',
- vEmail,
- 'Contact request',
- CONCAT('Phone: ',vPhone, ' Message: ', vMessage)
- );
+BEGIN
+/**
+ * Set actions for contact request
+ *
+ * @param vName Name
+ * @param vPhone Phone number
+ * @param vEmail e-mail
+ * @param vMessage text of the message
+ */
+
+ CALL vn.mail_insert(
+ 'floranet@verdnatura.es',
+ vEmail,
+ 'Contact request',
+ CONCAT('Phone: ',vPhone, ' Message: ', vMessage)
+ );
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -10469,27 +10469,27 @@ DELIMITER ;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `deliveryDate_get`(vPostalCode VARCHAR(15))
READS SQL DATA
-BEGIN
-/**
- * Returns available dates for this postalCode, in the next seven days.
- *
- * @param vPostalCode Delivery address postal code
- */
- DECLARE vCurrentDayOfWeek INT;
-
- SET vCurrentDayOfWeek = DAYOFWEEK(NOW());
-
- SELECT DISTINCT nextDay
- FROM (
- SELECT CURDATE() + INTERVAL IF(
- apc.dayOfWeek >= vCurrentDayOfWeek,
- apc.dayOfWeek - vCurrentDayOfWeek,
- 7 - apc.dayOfWeek
- ) DAY nextDay,
- NOW() + INTERVAL apc.hoursInAdvance HOUR minDeliveryTime
- FROM addressPostCode apc
- WHERE apc.postCode = vPostalCode
- HAVING nextDay > minDeliveryTime) sub;
+BEGIN
+/**
+ * Returns available dates for this postalCode, in the next seven days.
+ *
+ * @param vPostalCode Delivery address postal code
+ */
+ DECLARE vCurrentDayOfWeek INT;
+
+ SET vCurrentDayOfWeek = DAYOFWEEK(NOW());
+
+ SELECT DISTINCT nextDay
+ FROM (
+ SELECT CURDATE() + INTERVAL IF(
+ apc.dayOfWeek >= vCurrentDayOfWeek,
+ apc.dayOfWeek - vCurrentDayOfWeek,
+ 7 - apc.dayOfWeek
+ ) DAY nextDay,
+ NOW() + INTERVAL apc.hoursInAdvance HOUR minDeliveryTime
+ FROM addressPostCode apc
+ WHERE apc.postCode = vPostalCode
+ HAVING nextDay > minDeliveryTime) sub;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -42397,37 +42397,37 @@ DELIMITER ;
DELIMITER ;;
CREATE DEFINER=`vn`@`localhost` FUNCTION `client_getDebt`(`vClient` INT, `vDate` DATE) RETURNS decimal(10,2)
READS SQL DATA
-BEGIN
-/**
- * Returns the risk of a customer.
- *
- * @param vClient client id
- * @param vDate date to check the risk
- * @return Client risk
- */
- DECLARE vDebt DECIMAL(10,2);
- DECLARE vHasDebt BOOLEAN;
-
- SELECT COUNT(*) INTO vHasDebt
- FROM `client` c
- WHERE c.id = vClient AND c.typeFk = 'normal';
-
- IF NOT vHasDebt THEN
- RETURN 0;
- END IF;
-
- CREATE OR REPLACE TEMPORARY TABLE tmp.clientGetDebt (clientFk INT);
- INSERT INTO tmp.clientGetDebt SET clientFk = vClient;
-
- CALL vn.client_getDebt(vDate);
-
- SELECT risk INTO vDebt FROM tmp.risk;
-
- DROP TEMPORARY TABLE
- tmp.clientGetDebt,
- tmp.risk;
-
- RETURN vDebt;
+BEGIN
+/**
+ * Returns the risk of a customer.
+ *
+ * @param vClient client id
+ * @param vDate date to check the risk
+ * @return Client risk
+ */
+ DECLARE vDebt DECIMAL(10,2);
+ DECLARE vHasDebt BOOLEAN;
+
+ SELECT COUNT(*) INTO vHasDebt
+ FROM `client` c
+ WHERE c.id = vClient AND c.typeFk = 'normal';
+
+ IF NOT vHasDebt THEN
+ RETURN 0;
+ END IF;
+
+ CREATE OR REPLACE TEMPORARY TABLE tmp.clientGetDebt (clientFk INT);
+ INSERT INTO tmp.clientGetDebt SET clientFk = vClient;
+
+ CALL vn.client_getDebt(vDate);
+
+ SELECT risk INTO vDebt FROM tmp.risk;
+
+ DROP TEMPORARY TABLE
+ tmp.clientGetDebt,
+ tmp.risk;
+
+ RETURN vDebt;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -51221,93 +51221,93 @@ DELIMITER ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
-CREATE DEFINER=`vn`@`localhost` PROCEDURE `collection_addWithReservation`(
- vItemFk INT,
- vQuantity INT,
- vTicketFk INT,
- vSaleGroupFk INT,
- vSectorFk INT
+CREATE DEFINER=`vn`@`localhost` PROCEDURE `collection_addWithReservation`(
+ vItemFk INT,
+ vQuantity INT,
+ vTicketFk INT,
+ vSaleGroupFk INT,
+ vSectorFk INT
)
-BEGIN
-/**
- * En el ámbito de las colecciones se añade una línea de sale a un ticket
- * de una colección en caso de tener disponible y se realiza la reserva.
- *
- * @param vItemFk id of item
- * @param vQuantity quantity to be added to the ticket
- * @param vTicketFk ticket to which the sales line is added
- * @param vSaleGroupFk saleGroupFk id to add saleGroupDetail
- */
-
- DECLARE vWarehouseFk INT;
- DECLARE vCacheAvailableFk INT;
- DECLARE vAvailable INT;
- DECLARE vSaleFk INT;
- DECLARE vConcept VARCHAR(50);
- DECLARE vItemName VARCHAR(50);
- DECLARE vHasThrow BOOLEAN DEFAULT FALSE;
-
- DECLARE EXIT HANDLER FOR SQLEXCEPTION
- BEGIN
- ROLLBACK;
- RESIGNAL;
- END;
-
- SELECT t.warehouseFk INTO vWarehouseFk
- FROM ticket t
- JOIN ticketCollection tc ON tc.ticketFk = t.id
- WHERE t.id = vTicketFk;
-
- CALL cache.available_refresh(
- vCacheAvailableFk,
- FALSE,
- vWarehouseFk,
- util.VN_CURDATE());
-
- SELECT available INTO vAvailable
- FROM cache.available
- WHERE calc_id = vCacheAvailableFk
- AND item_id = vItemFk;
-
- IF vAvailable < vQuantity THEN
- SET vHasThrow = TRUE;
- ELSE
- SELECT `name`,
- CONCAT(getUser(), ' ', DATE_FORMAT(util.VN_NOW(), '%H:%i'), ' ', name)
- INTO vItemName, vConcept
- FROM item
- WHERE id = vItemFk;
-
- START TRANSACTION;
-
- INSERT INTO sale
- SET itemFk = vItemFk,
- ticketFk = vTicketFk,
- concept = vConcept,
- quantity = vQuantity,
- isAdded = TRUE;
-
- SELECT LAST_INSERT_ID() INTO vSaleFk;
-
- CALL sale_calculateComponent(vSaleFk, NULL);
- CALL itemShelvingSale_addBySale(vSaleFk, vSectorFk);
-
- IF NOT EXISTS (SELECT TRUE FROM itemShelvingSale WHERE saleFk = vSaleFk LIMIT 1) THEN
- SET vHasThrow = TRUE;
- END IF;
- END IF;
-
- IF vHasThrow THEN
- CALL util.throw("There is no available for the selected item");
- END IF;
-
- IF vSaleGroupFk THEN
- INSERT INTO saleGroupDetail
- SET saleFk = vSaleFk,
- saleGroupFk = vSaleGroupFk;
- END IF;
-
- COMMIT;
+BEGIN
+/**
+ * En el ámbito de las colecciones se añade una línea de sale a un ticket
+ * de una colección en caso de tener disponible y se realiza la reserva.
+ *
+ * @param vItemFk id of item
+ * @param vQuantity quantity to be added to the ticket
+ * @param vTicketFk ticket to which the sales line is added
+ * @param vSaleGroupFk saleGroupFk id to add saleGroupDetail
+ */
+
+ DECLARE vWarehouseFk INT;
+ DECLARE vCacheAvailableFk INT;
+ DECLARE vAvailable INT;
+ DECLARE vSaleFk INT;
+ DECLARE vConcept VARCHAR(50);
+ DECLARE vItemName VARCHAR(50);
+ DECLARE vHasThrow BOOLEAN DEFAULT FALSE;
+
+ DECLARE EXIT HANDLER FOR SQLEXCEPTION
+ BEGIN
+ ROLLBACK;
+ RESIGNAL;
+ END;
+
+ SELECT t.warehouseFk INTO vWarehouseFk
+ FROM ticket t
+ JOIN ticketCollection tc ON tc.ticketFk = t.id
+ WHERE t.id = vTicketFk;
+
+ CALL cache.available_refresh(
+ vCacheAvailableFk,
+ FALSE,
+ vWarehouseFk,
+ util.VN_CURDATE());
+
+ SELECT available INTO vAvailable
+ FROM cache.available
+ WHERE calc_id = vCacheAvailableFk
+ AND item_id = vItemFk;
+
+ IF vAvailable < vQuantity THEN
+ SET vHasThrow = TRUE;
+ ELSE
+ SELECT `name`,
+ CONCAT(getUser(), ' ', DATE_FORMAT(util.VN_NOW(), '%H:%i'), ' ', name)
+ INTO vItemName, vConcept
+ FROM item
+ WHERE id = vItemFk;
+
+ START TRANSACTION;
+
+ INSERT INTO sale
+ SET itemFk = vItemFk,
+ ticketFk = vTicketFk,
+ concept = vConcept,
+ quantity = vQuantity,
+ isAdded = TRUE;
+
+ SELECT LAST_INSERT_ID() INTO vSaleFk;
+
+ CALL sale_calculateComponent(vSaleFk, NULL);
+ CALL itemShelvingSale_addBySale(vSaleFk, vSectorFk);
+
+ IF NOT EXISTS (SELECT TRUE FROM itemShelvingSale WHERE saleFk = vSaleFk LIMIT 1) THEN
+ SET vHasThrow = TRUE;
+ END IF;
+ END IF;
+
+ IF vHasThrow THEN
+ CALL util.throw("There is no available for the selected item");
+ END IF;
+
+ IF vSaleGroupFk THEN
+ INSERT INTO saleGroupDetail
+ SET saleFk = vSaleFk,
+ saleGroupFk = vSaleGroupFk;
+ END IF;
+
+ COMMIT;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -51324,145 +51324,145 @@ DELIMITER ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
-CREATE DEFINER=`vn`@`localhost` PROCEDURE `collection_assign`(
- vUserFk INT,
- OUT vCollectionFk INT
+CREATE DEFINER=`vn`@`localhost` PROCEDURE `collection_assign`(
+ vUserFk INT,
+ OUT vCollectionFk INT
)
-BEGIN
-/**
- * Comprueba si existen colecciones libres que se ajustan
- * al perfil del usuario y le asigna la más antigua.
- * Añade un registro al semillero de colecciones.
- *
- * @param vUserFk Id de usuario
- * @param vCollectionFk Id de colección
- */
- DECLARE vHasTooMuchCollections BOOL;
- DECLARE vDone BOOL DEFAULT FALSE;
- DECLARE vCollectionWorker INT;
- DECLARE vMaxNotAssignedCollectionLifeTime TIME;
-
- DECLARE vCollections CURSOR FOR
- WITH collections AS (
- SELECT tc.collectionFk,
- SUM(sv.volume) volume,
- c.saleTotalCount,
- c.itemPackingTypeFk,
- c.trainFk,
- c.warehouseFk,
- c.wagons
- FROM vn.ticketCollection tc
- JOIN vn.collection c ON c.id = tc.collectionFk
- JOIN vn.saleVolume sv ON sv.ticketFk = tc.ticketFk
- WHERE c.workerFk IS NULL
- AND sv.shipped >= util.VN_CURDATE()
- GROUP BY tc.collectionFk
- ) SELECT c.collectionFk
- FROM collections c
- JOIN vn.operator o
- WHERE o.workerFk = vUserFk
- AND (c.saleTotalCount <= o.linesLimit OR o.linesLimit IS NULL)
- AND (c.itemPackingTypeFk = o.itemPackingTypeFk OR o.itemPackingTypeFk IS NULL)
- AND o.numberOfWagons = c.wagons
- AND o.trainFk = c.trainFk
- AND o.warehouseFk = c.warehouseFk;
-
- DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
- -- Si hay colecciones sin terminar, sale del proceso
-
- DECLARE EXIT HANDLER FOR SQLEXCEPTION
- BEGIN
- ROLLBACK;
- RESIGNAL;
- END;
-
- CALL collection_get(vUserFk);
-
- SELECT (pc.maxNotReadyCollections - COUNT(*)) <= 0, pc.maxNotAssignedCollectionLifeTime
- INTO vHasTooMuchCollections, vMaxNotAssignedCollectionLifeTime
- FROM productionConfig pc
- LEFT JOIN tmp.collection ON TRUE;
-
- DROP TEMPORARY TABLE tmp.collection;
-
- IF vHasTooMuchCollections THEN
- CALL util.throw('Hay colecciones pendientes');
- END IF;
-
- -- Se eliminan las colecciones sin asignar que estan obsoletas
-
- INSERT INTO ticketTracking(stateFk, ticketFk)
- SELECT s.id, tc.ticketFk
- FROM `collection` c
- JOIN ticketCollection tc ON tc.collectionFk = c.id
- JOIN `state` s ON s.code = 'PRINTED_AUTO'
- WHERE c.workerFk IS NULL
- AND TIMEDIFF(util.VN_NOW(), c.created) > vMaxNotAssignedCollectionLifeTime;
-
- DELETE FROM `collection`
- WHERE workerFk IS NULL
- AND TIMEDIFF(util.VN_NOW(), created) > vMaxNotAssignedCollectionLifeTime;
-
- -- Se añade registro al semillero
-
- INSERT INTO collectionHotbed(userFk) VALUES(vUserFk);
-
- -- Comprueba si hay colecciones disponibles que se ajustan a su configuracion
-
- OPEN vCollections;
- l: LOOP
- SET vDone = FALSE;
- FETCH vCollections INTO vCollectionFk;
-
- IF vDone THEN
- LEAVE l;
- END IF;
-
- BEGIN
- DECLARE EXIT HANDLER FOR SQLEXCEPTION
- BEGIN
- ROLLBACK;
- SET vCollectionFk = NULL;
- RESIGNAL;
- END;
-
- START TRANSACTION;
-
- SELECT workerFk INTO vCollectionWorker
- FROM `collection`
- WHERE id = vCollectionFk FOR UPDATE;
-
- IF vCollectionWorker IS NULL THEN
- UPDATE `collection`
- SET workerFk = vUserFk
- WHERE id = vCollectionFk;
-
- COMMIT;
- LEAVE l;
- END IF;
-
- ROLLBACK;
- END;
- END LOOP;
- CLOSE vCollections;
-
- IF vCollectionFk IS NULL THEN
- CALL collection_new(vUserFk, vCollectionFk);
-
- START TRANSACTION;
-
- SELECT workerFk INTO vCollectionWorker
- FROM `collection`
- WHERE id = vCollectionFk FOR UPDATE;
-
- IF vCollectionWorker IS NULL THEN
- UPDATE `collection`
- SET workerFk = vUserFk
- WHERE id = vCollectionFk;
- END IF;
-
- COMMIT;
- END IF;
+BEGIN
+/**
+ * Comprueba si existen colecciones libres que se ajustan
+ * al perfil del usuario y le asigna la más antigua.
+ * Añade un registro al semillero de colecciones.
+ *
+ * @param vUserFk Id de usuario
+ * @param vCollectionFk Id de colección
+ */
+ DECLARE vHasTooMuchCollections BOOL;
+ DECLARE vDone BOOL DEFAULT FALSE;
+ DECLARE vCollectionWorker INT;
+ DECLARE vMaxNotAssignedCollectionLifeTime TIME;
+
+ DECLARE vCollections CURSOR FOR
+ WITH collections AS (
+ SELECT tc.collectionFk,
+ SUM(sv.volume) volume,
+ c.saleTotalCount,
+ c.itemPackingTypeFk,
+ c.trainFk,
+ c.warehouseFk,
+ c.wagons
+ FROM vn.ticketCollection tc
+ JOIN vn.collection c ON c.id = tc.collectionFk
+ JOIN vn.saleVolume sv ON sv.ticketFk = tc.ticketFk
+ WHERE c.workerFk IS NULL
+ AND sv.shipped >= util.VN_CURDATE()
+ GROUP BY tc.collectionFk
+ ) SELECT c.collectionFk
+ FROM collections c
+ JOIN vn.operator o
+ WHERE o.workerFk = vUserFk
+ AND (c.saleTotalCount <= o.linesLimit OR o.linesLimit IS NULL)
+ AND (c.itemPackingTypeFk = o.itemPackingTypeFk OR o.itemPackingTypeFk IS NULL)
+ AND o.numberOfWagons = c.wagons
+ AND o.trainFk = c.trainFk
+ AND o.warehouseFk = c.warehouseFk;
+
+ DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
+ -- Si hay colecciones sin terminar, sale del proceso
+
+ DECLARE EXIT HANDLER FOR SQLEXCEPTION
+ BEGIN
+ ROLLBACK;
+ RESIGNAL;
+ END;
+
+ CALL collection_get(vUserFk);
+
+ SELECT (pc.maxNotReadyCollections - COUNT(*)) <= 0, pc.maxNotAssignedCollectionLifeTime
+ INTO vHasTooMuchCollections, vMaxNotAssignedCollectionLifeTime
+ FROM productionConfig pc
+ LEFT JOIN tmp.collection ON TRUE;
+
+ DROP TEMPORARY TABLE tmp.collection;
+
+ IF vHasTooMuchCollections THEN
+ CALL util.throw('Hay colecciones pendientes');
+ END IF;
+
+ -- Se eliminan las colecciones sin asignar que estan obsoletas
+
+ INSERT INTO ticketTracking(stateFk, ticketFk)
+ SELECT s.id, tc.ticketFk
+ FROM `collection` c
+ JOIN ticketCollection tc ON tc.collectionFk = c.id
+ JOIN `state` s ON s.code = 'PRINTED_AUTO'
+ WHERE c.workerFk IS NULL
+ AND TIMEDIFF(util.VN_NOW(), c.created) > vMaxNotAssignedCollectionLifeTime;
+
+ DELETE FROM `collection`
+ WHERE workerFk IS NULL
+ AND TIMEDIFF(util.VN_NOW(), created) > vMaxNotAssignedCollectionLifeTime;
+
+ -- Se añade registro al semillero
+
+ INSERT INTO collectionHotbed(userFk) VALUES(vUserFk);
+
+ -- Comprueba si hay colecciones disponibles que se ajustan a su configuracion
+
+ OPEN vCollections;
+ l: LOOP
+ SET vDone = FALSE;
+ FETCH vCollections INTO vCollectionFk;
+
+ IF vDone THEN
+ LEAVE l;
+ END IF;
+
+ BEGIN
+ DECLARE EXIT HANDLER FOR SQLEXCEPTION
+ BEGIN
+ ROLLBACK;
+ SET vCollectionFk = NULL;
+ RESIGNAL;
+ END;
+
+ START TRANSACTION;
+
+ SELECT workerFk INTO vCollectionWorker
+ FROM `collection`
+ WHERE id = vCollectionFk FOR UPDATE;
+
+ IF vCollectionWorker IS NULL THEN
+ UPDATE `collection`
+ SET workerFk = vUserFk
+ WHERE id = vCollectionFk;
+
+ COMMIT;
+ LEAVE l;
+ END IF;
+
+ ROLLBACK;
+ END;
+ END LOOP;
+ CLOSE vCollections;
+
+ IF vCollectionFk IS NULL THEN
+ CALL collection_new(vUserFk, vCollectionFk);
+
+ START TRANSACTION;
+
+ SELECT workerFk INTO vCollectionWorker
+ FROM `collection`
+ WHERE id = vCollectionFk FOR UPDATE;
+
+ IF vCollectionWorker IS NULL THEN
+ UPDATE `collection`
+ SET workerFk = vUserFk
+ WHERE id = vCollectionFk;
+ END IF;
+
+ COMMIT;
+ END IF;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -51530,146 +51530,146 @@ DELIMITER ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
-CREATE DEFINER=`vn`@`localhost` PROCEDURE `collection_getAssigned`(
- vUserFk INT,
- OUT vCollectionFk INT
+CREATE DEFINER=`vn`@`localhost` PROCEDURE `collection_getAssigned`(
+ vUserFk INT,
+ OUT vCollectionFk INT
)
-BEGIN
-/**
- * Comprueba si existen colecciones libres que se ajustan
- * al perfil del usuario y le asigna la más antigua.
- * Añade un registro al semillero de colecciones.
- *
- * @param vUserFk Id de usuario
- * @param vCollectionFk Id de colección
- */
- DECLARE vHasTooMuchCollections BOOL;
- DECLARE vDone BOOL DEFAULT FALSE;
- DECLARE vCollectionWorker INT;
- DECLARE vMaxNotAssignedCollectionLifeTime TIME;
-
- DECLARE vCollections CURSOR FOR
- WITH collections AS (
- SELECT tc.collectionFk,
- SUM(sv.volume) volume,
- c.saleTotalCount,
- c.itemPackingTypeFk,
- c.trainFk,
- c.warehouseFk,
- c.wagons
- FROM vn.ticketCollection tc
- JOIN vn.collection c ON c.id = tc.collectionFk
- JOIN vn.saleVolume sv ON sv.ticketFk = tc.ticketFk
- WHERE c.workerFk IS NULL
- AND sv.shipped >= util.VN_CURDATE()
- GROUP BY tc.collectionFk
- ) SELECT c.collectionFk
- FROM collections c
- JOIN vn.operator o
- WHERE o.workerFk = vUserFk
- AND (c.saleTotalCount <= o.linesLimit OR o.linesLimit IS NULL)
- AND (c.itemPackingTypeFk = o.itemPackingTypeFk OR o.itemPackingTypeFk IS NULL)
- AND o.numberOfWagons = c.wagons
- AND o.trainFk = c.trainFk
- AND o.warehouseFk = c.warehouseFk;
-
- DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
- -- Si hay colecciones sin terminar, sale del proceso
-
- DECLARE EXIT HANDLER FOR SQLEXCEPTION
- BEGIN
- ROLLBACK;
- RESIGNAL;
- END;
-
- CALL collection_get(vUserFk);
-
- SELECT (pc.maxNotReadyCollections - COUNT(*)) <= 0, pc.maxNotAssignedCollectionLifeTime
- INTO vHasTooMuchCollections, vMaxNotAssignedCollectionLifeTime
- FROM productionConfig pc
- LEFT JOIN tmp.collection ON TRUE;
-
- DROP TEMPORARY TABLE tmp.collection;
-
- IF vHasTooMuchCollections THEN
- CALL util.throw('Hay colecciones pendientes');
- END IF;
-
- -- Se eliminan las colecciones sin asignar que estan obsoletas
-
- INSERT INTO ticketTracking(stateFk, ticketFk)
- SELECT s.id, tc.ticketFk
- FROM `collection` c
- JOIN ticketCollection tc ON tc.collectionFk = c.id
- JOIN `state` s ON s.code = 'PRINTED_AUTO'
- WHERE c.workerFk IS NULL
- AND TIMEDIFF(util.VN_NOW(), c.created) > vMaxNotAssignedCollectionLifeTime;
-
- DELETE FROM `collection`
- WHERE workerFk IS NULL
- AND TIMEDIFF(util.VN_NOW(), created) > vMaxNotAssignedCollectionLifeTime;
-
- -- Se añade registro al semillero
-
- INSERT INTO collectionHotbed(userFk) VALUES(vUserFk);
-
- -- Comprueba si hay colecciones disponibles que se ajustan a su configuracion
-
- OPEN vCollections;
- l: LOOP
- SET vDone = FALSE;
- FETCH vCollections INTO vCollectionFk;
-
- IF vDone THEN
- LEAVE l;
- END IF;
-
- BEGIN
- DECLARE EXIT HANDLER FOR SQLEXCEPTION
- BEGIN
- ROLLBACK;
- SET vCollectionFk = NULL;
- RESIGNAL;
- END;
-
- START TRANSACTION;
-
- SELECT workerFk INTO vCollectionWorker
- FROM `collection`
- WHERE id = vCollectionFk FOR UPDATE;
-
- IF vCollectionWorker IS NULL THEN
- UPDATE `collection`
- SET workerFk = vUserFk
- WHERE id = vCollectionFk;
-
- COMMIT;
- LEAVE l;
- END IF;
-
- ROLLBACK;
- END;
- END LOOP;
- CLOSE vCollections;
-
- IF vCollectionFk IS NULL THEN
- CALL collection_new(vUserFk, vCollectionFk);
-
- START TRANSACTION;
-
- SELECT workerFk INTO vCollectionWorker
- FROM `collection`
- WHERE id = vCollectionFk FOR UPDATE;
-
- IF vCollectionWorker IS NULL THEN
- UPDATE `collection`
- SET workerFk = vUserFk
- WHERE id = vCollectionFk;
- END IF;
-
- COMMIT;
- END IF;
- CALL itemShelvingSale_addByCollection(vCollectionFk);
+BEGIN
+/**
+ * Comprueba si existen colecciones libres que se ajustan
+ * al perfil del usuario y le asigna la más antigua.
+ * Añade un registro al semillero de colecciones.
+ *
+ * @param vUserFk Id de usuario
+ * @param vCollectionFk Id de colección
+ */
+ DECLARE vHasTooMuchCollections BOOL;
+ DECLARE vDone BOOL DEFAULT FALSE;
+ DECLARE vCollectionWorker INT;
+ DECLARE vMaxNotAssignedCollectionLifeTime TIME;
+
+ DECLARE vCollections CURSOR FOR
+ WITH collections AS (
+ SELECT tc.collectionFk,
+ SUM(sv.volume) volume,
+ c.saleTotalCount,
+ c.itemPackingTypeFk,
+ c.trainFk,
+ c.warehouseFk,
+ c.wagons
+ FROM vn.ticketCollection tc
+ JOIN vn.collection c ON c.id = tc.collectionFk
+ JOIN vn.saleVolume sv ON sv.ticketFk = tc.ticketFk
+ WHERE c.workerFk IS NULL
+ AND sv.shipped >= util.VN_CURDATE()
+ GROUP BY tc.collectionFk
+ ) SELECT c.collectionFk
+ FROM collections c
+ JOIN vn.operator o
+ WHERE o.workerFk = vUserFk
+ AND (c.saleTotalCount <= o.linesLimit OR o.linesLimit IS NULL)
+ AND (c.itemPackingTypeFk = o.itemPackingTypeFk OR o.itemPackingTypeFk IS NULL)
+ AND o.numberOfWagons = c.wagons
+ AND o.trainFk = c.trainFk
+ AND o.warehouseFk = c.warehouseFk;
+
+ DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
+ -- Si hay colecciones sin terminar, sale del proceso
+
+ DECLARE EXIT HANDLER FOR SQLEXCEPTION
+ BEGIN
+ ROLLBACK;
+ RESIGNAL;
+ END;
+
+ CALL collection_get(vUserFk);
+
+ SELECT (pc.maxNotReadyCollections - COUNT(*)) <= 0, pc.maxNotAssignedCollectionLifeTime
+ INTO vHasTooMuchCollections, vMaxNotAssignedCollectionLifeTime
+ FROM productionConfig pc
+ LEFT JOIN tmp.collection ON TRUE;
+
+ DROP TEMPORARY TABLE tmp.collection;
+
+ IF vHasTooMuchCollections THEN
+ CALL util.throw('Hay colecciones pendientes');
+ END IF;
+
+ -- Se eliminan las colecciones sin asignar que estan obsoletas
+
+ INSERT INTO ticketTracking(stateFk, ticketFk)
+ SELECT s.id, tc.ticketFk
+ FROM `collection` c
+ JOIN ticketCollection tc ON tc.collectionFk = c.id
+ JOIN `state` s ON s.code = 'PRINTED_AUTO'
+ WHERE c.workerFk IS NULL
+ AND TIMEDIFF(util.VN_NOW(), c.created) > vMaxNotAssignedCollectionLifeTime;
+
+ DELETE FROM `collection`
+ WHERE workerFk IS NULL
+ AND TIMEDIFF(util.VN_NOW(), created) > vMaxNotAssignedCollectionLifeTime;
+
+ -- Se añade registro al semillero
+
+ INSERT INTO collectionHotbed(userFk) VALUES(vUserFk);
+
+ -- Comprueba si hay colecciones disponibles que se ajustan a su configuracion
+
+ OPEN vCollections;
+ l: LOOP
+ SET vDone = FALSE;
+ FETCH vCollections INTO vCollectionFk;
+
+ IF vDone THEN
+ LEAVE l;
+ END IF;
+
+ BEGIN
+ DECLARE EXIT HANDLER FOR SQLEXCEPTION
+ BEGIN
+ ROLLBACK;
+ SET vCollectionFk = NULL;
+ RESIGNAL;
+ END;
+
+ START TRANSACTION;
+
+ SELECT workerFk INTO vCollectionWorker
+ FROM `collection`
+ WHERE id = vCollectionFk FOR UPDATE;
+
+ IF vCollectionWorker IS NULL THEN
+ UPDATE `collection`
+ SET workerFk = vUserFk
+ WHERE id = vCollectionFk;
+
+ COMMIT;
+ LEAVE l;
+ END IF;
+
+ ROLLBACK;
+ END;
+ END LOOP;
+ CLOSE vCollections;
+
+ IF vCollectionFk IS NULL THEN
+ CALL collection_new(vUserFk, vCollectionFk);
+
+ START TRANSACTION;
+
+ SELECT workerFk INTO vCollectionWorker
+ FROM `collection`
+ WHERE id = vCollectionFk FOR UPDATE;
+
+ IF vCollectionWorker IS NULL THEN
+ UPDATE `collection`
+ SET workerFk = vUserFk
+ WHERE id = vCollectionFk;
+ END IF;
+
+ COMMIT;
+ END IF;
+ CALL itemShelvingSale_addByCollection(vCollectionFk);
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -60050,53 +60050,53 @@ DELIMITER ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
-CREATE DEFINER=`vn`@`localhost` PROCEDURE `itemShelvingSale_addByCollection`(
- vCollectionFk INT(11)
+CREATE DEFINER=`vn`@`localhost` PROCEDURE `itemShelvingSale_addByCollection`(
+ vCollectionFk INT(11)
)
-BEGIN
-/**
- * Reserva cantidades con ubicaciones para el contenido de una colección
- *
- * @param vCollectionFk Identificador de collection
- */
- DECLARE vDone BOOL DEFAULT FALSE;
- DECLARE vSaleFk INT;
- DECLARE vSales CURSOR FOR
- WITH sales AS (
- SELECT s.id saleFk, s.quantity, SUM(IFNULL(iss.quantity, 0)) quantityReserved
- FROM vn.ticketCollection tc
- JOIN vn.sale s ON s.ticketFk = tc.ticketFk
- LEFT JOIN vn.itemShelvingSale iss ON iss.saleFk = s.id
- WHERE tc.collectionFk = vCollectionFk
- GROUP BY s.id
- HAVING quantity <> quantityReserved
- ), trackedSales AS (
- SELECT sa.saleFk
- FROM sales sa
- JOIN vn.saleTracking st ON st.saleFk = sa.saleFk
- JOIN vn.`state` s ON s.id = st.stateFk
- WHERE st.isChecked
- AND s.`code` IN ('PREVIOUS_PREPARATION', 'OK PREVIOUS', 'OK STOWAWAY')
- GROUP BY sa.saleFk
- ) SELECT s.saleFk
- FROM sales s
- LEFT JOIN trackedSales ts ON ts.saleFk = s.saleFk
- WHERE ts.saleFk IS NULL;
-
- DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
-
- OPEN vSales;
- l: LOOP
- SET vDone = FALSE;
- FETCH vSales INTO vSaleFk;
-
- IF vDone THEN
- LEAVE l;
- END IF;
-
- CALL itemShelvingSale_addBySale(vSaleFk, NULL);
- END LOOP;
- CLOSE vSales;
+BEGIN
+/**
+ * Reserva cantidades con ubicaciones para el contenido de una colección
+ *
+ * @param vCollectionFk Identificador de collection
+ */
+ DECLARE vDone BOOL DEFAULT FALSE;
+ DECLARE vSaleFk INT;
+ DECLARE vSales CURSOR FOR
+ WITH sales AS (
+ SELECT s.id saleFk, s.quantity, SUM(IFNULL(iss.quantity, 0)) quantityReserved
+ FROM vn.ticketCollection tc
+ JOIN vn.sale s ON s.ticketFk = tc.ticketFk
+ LEFT JOIN vn.itemShelvingSale iss ON iss.saleFk = s.id
+ WHERE tc.collectionFk = vCollectionFk
+ GROUP BY s.id
+ HAVING quantity <> quantityReserved
+ ), trackedSales AS (
+ SELECT sa.saleFk
+ FROM sales sa
+ JOIN vn.saleTracking st ON st.saleFk = sa.saleFk
+ JOIN vn.`state` s ON s.id = st.stateFk
+ WHERE st.isChecked
+ AND s.`code` IN ('PREVIOUS_PREPARATION', 'OK PREVIOUS', 'OK STOWAWAY')
+ GROUP BY sa.saleFk
+ ) SELECT s.saleFk
+ FROM sales s
+ LEFT JOIN trackedSales ts ON ts.saleFk = s.saleFk
+ WHERE ts.saleFk IS NULL;
+
+ DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
+
+ OPEN vSales;
+ l: LOOP
+ SET vDone = FALSE;
+ FETCH vSales INTO vSaleFk;
+
+ IF vDone THEN
+ LEAVE l;
+ END IF;
+
+ CALL itemShelvingSale_addBySale(vSaleFk, NULL);
+ END LOOP;
+ CLOSE vSales;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -60437,56 +60437,56 @@ DELIMITER ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
CREATE DEFINER=`vn`@`localhost` PROCEDURE `itemShelvingSale_doReserve`()
-proc: BEGIN
-/**
- * Genera reservas de la tabla vn.itemShelvingSaleReserve
- */
- DECLARE vDone BOOL;
- DECLARE vSaleFk INT;
- DECLARE vSectorFk INT;
-
- DECLARE vSales CURSOR FOR
- SELECT DISTINCT saleFk, sectorFk FROM tSale;
-
- DECLARE CONTINUE HANDLER FOR NOT FOUND
- SET vDone = TRUE;
-
- DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
- BEGIN
- DO RELEASE_LOCK('vn.itemShelvingSale_doReserve');
- ROLLBACK;
- RESIGNAL;
- END;
-
- IF !GET_LOCK('vn.itemShelvingSale_doReserve', 0) THEN
- LEAVE proc;
- END IF;
-
- CREATE OR REPLACE TEMPORARY TABLE tSale
- ENGINE = MEMORY
- SELECT id, saleFk, sectorFk FROM itemShelvingSaleReserve;
-
- OPEN vSales;
-
- myLoop: LOOP
- SET vDone = FALSE;
- FETCH vSales INTO vSaleFk, vSectorFk;
-
- IF vDone THEN
- LEAVE myLoop;
- END IF;
-
- CALL itemShelvingSale_addBySale (vSaleFk, vSectorFk);
- END LOOP;
-
- CLOSE vSales;
-
- DELETE iss FROM itemShelvingSaleReserve iss
- JOIN tSale s ON s.id = iss.id AND s.sectorFk = iss.sectorFk;
-
- DROP TEMPORARY TABLE tSale;
-
- DO RELEASE_LOCK('vn.itemShelvingSale_doReserve');
+proc: BEGIN
+/**
+ * Genera reservas de la tabla vn.itemShelvingSaleReserve
+ */
+ DECLARE vDone BOOL;
+ DECLARE vSaleFk INT;
+ DECLARE vSectorFk INT;
+
+ DECLARE vSales CURSOR FOR
+ SELECT DISTINCT saleFk, sectorFk FROM tSale;
+
+ DECLARE CONTINUE HANDLER FOR NOT FOUND
+ SET vDone = TRUE;
+
+ DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
+ BEGIN
+ DO RELEASE_LOCK('vn.itemShelvingSale_doReserve');
+ ROLLBACK;
+ RESIGNAL;
+ END;
+
+ IF !GET_LOCK('vn.itemShelvingSale_doReserve', 0) THEN
+ LEAVE proc;
+ END IF;
+
+ CREATE OR REPLACE TEMPORARY TABLE tSale
+ ENGINE = MEMORY
+ SELECT id, saleFk, sectorFk FROM itemShelvingSaleReserve;
+
+ OPEN vSales;
+
+ myLoop: LOOP
+ SET vDone = FALSE;
+ FETCH vSales INTO vSaleFk, vSectorFk;
+
+ IF vDone THEN
+ LEAVE myLoop;
+ END IF;
+
+ CALL itemShelvingSale_addBySale (vSaleFk, vSectorFk);
+ END LOOP;
+
+ CLOSE vSales;
+
+ DELETE iss FROM itemShelvingSaleReserve iss
+ JOIN tSale s ON s.id = iss.id AND s.sectorFk = iss.sectorFk;
+
+ DROP TEMPORARY TABLE tSale;
+
+ DO RELEASE_LOCK('vn.itemShelvingSale_doReserve');
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -60571,37 +60571,37 @@ DELIMITER ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
-CREATE DEFINER=`vn`@`localhost` PROCEDURE `itemShelvingSale_setPicked`(
- vSaleGroupFk INT(10)
+CREATE DEFINER=`vn`@`localhost` PROCEDURE `itemShelvingSale_setPicked`(
+ vSaleGroupFk INT(10)
)
-BEGIN
-/**
- * Gestiona la reserva de un vn.saleGroup actualizando vn.itemShelvingSale.isPicked
- * y cambiando el estado de la vn.sale
- *
- * @param vSaleGroupFk Id saleGroupFk
- */
- DECLARE EXIT HANDLER FOR SQLEXCEPTION
- BEGIN
- ROLLBACK;
- RESIGNAL;
- END;
-
- IF NOT (SELECT COUNT(*) FROM saleGroup WHERE id = vSaleGroupFk) THEN
- CALL util.throw('Sale group not exists');
- END IF;
-
- START TRANSACTION;
-
- UPDATE itemShelvingSale iss
- JOIN sale s ON s.id = iss.saleFk
- JOIN saleGroupDetail sg ON sg.saleFk = s.id
- SET iss.isPicked = TRUE
- WHERE sg.saleGroupFk = vSaleGroupFk;
-
- CALL saleTracking_addPreparedSaleGroup(vSaleGroupFk);
-
- COMMIT;
+BEGIN
+/**
+ * Gestiona la reserva de un vn.saleGroup actualizando vn.itemShelvingSale.isPicked
+ * y cambiando el estado de la vn.sale
+ *
+ * @param vSaleGroupFk Id saleGroupFk
+ */
+ DECLARE EXIT HANDLER FOR SQLEXCEPTION
+ BEGIN
+ ROLLBACK;
+ RESIGNAL;
+ END;
+
+ IF NOT (SELECT COUNT(*) FROM saleGroup WHERE id = vSaleGroupFk) THEN
+ CALL util.throw('Sale group not exists');
+ END IF;
+
+ START TRANSACTION;
+
+ UPDATE itemShelvingSale iss
+ JOIN sale s ON s.id = iss.saleFk
+ JOIN saleGroupDetail sg ON sg.saleFk = s.id
+ SET iss.isPicked = TRUE
+ WHERE sg.saleGroupFk = vSaleGroupFk;
+
+ CALL saleTracking_addPreparedSaleGroup(vSaleGroupFk);
+
+ COMMIT;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -60618,114 +60618,114 @@ DELIMITER ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
-CREATE DEFINER=`vn`@`localhost` PROCEDURE `itemShelvingSale_setQuantity`(
- vItemShelvingSaleFk INT(10),
- vQuantity DECIMAL(10,0),
- vIsItemShelvingSaleEmpty BOOLEAN,
- vSectorFk INT
+CREATE DEFINER=`vn`@`localhost` PROCEDURE `itemShelvingSale_setQuantity`(
+ vItemShelvingSaleFk INT(10),
+ vQuantity DECIMAL(10,0),
+ vIsItemShelvingSaleEmpty BOOLEAN,
+ vSectorFk INT
)
-BEGIN
-/**
- * Gestiona la reserva de un itemShelvingFk, actualizando isPicked y quantity
- * en itemShelvingSale y sale.isPicked en caso necesario.
- * Si la reserva de la ubicación es fallida, se regulariza la situación
- *
- * @param vItemShelvingSaleFk Id itemShelvingSaleFK
- * @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;
- DECLARE vReservedQuantity INT;
- DECLARE vRemainingQuantity INT;
- DECLARE vItemFk INT;
- DECLARE vTotalQuantity INT;
- DECLARE vStateCode VARCHAR(45);
-
- DECLARE EXIT HANDLER FOR SQLEXCEPTION
- BEGIN
- ROLLBACK;
- 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;
-
- SELECT s.itemFk,
- iss.saleFk,
- iss.itemShelvingFk,
- SUM(IFNULL(iss.quantity,0)),
- IF(sgd.id, 'PREVIOUS_PREPARATION', 'PREPARED')
- INTO vItemFk,
- vSaleFk,
- vItemShelvingFk,
- vReservedQuantity,
- vStateCode
- FROM itemShelvingSale iss
- JOIN sale s ON s.id = iss.saleFk
- LEFT JOIN vn.saleGroupDetail sgd ON sgd.saleFk = iss.saleFk
- WHERE iss.id = vItemShelvingSaleFk
- AND NOT iss.isPicked;
-
- 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;
-
- START TRANSACTION;
-
- UPDATE itemShelvingSale
- SET isPicked = TRUE,
- quantity = vQuantity
- WHERE id = vItemShelvingSaleFk;
-
- SELECT id INTO vItemShelvingFk
- FROM itemShelving
- WHERE id = vItemShelvingFk
- FOR UPDATE;
-
- UPDATE itemShelving
- SET visible = GREATEST(0, visible - vQuantity)
- WHERE id = vItemShelvingFk;
-
- SELECT SUM(IF(isPicked OR id = vItemShelvingSaleFk, 0, quantity)), SUM(quantity)
- INTO vRemainingQuantity, vTotalQuantity
- FROM itemShelvingSale
- WHERE saleFk = vSaleFk;
-
- IF vRemainingQuantity = 0 AND NOT vIsItemShelvingSaleEmpty THEN
- CALL saleTracking_new(
- vSaleFk,
- TRUE,
- vTotalQuantity,
- `account`.`myUser_getId`(),
- NULL,
- vStateCode,
- TRUE);
-
- UPDATE sale s
- SET s.quantity = vTotalQuantity,
- isPicked = TRUE
- WHERE s.id = vSaleFk;
- END IF;
-
- COMMIT;
-
- IF vIsItemShelvingSaleEmpty AND vQuantity <> vReservedQuantity THEN
- INSERT INTO itemShelvingSaleReserve (saleFk, sectorFk)
- SELECT vSaleFk, vSectorFk;
- CALL itemShelvingSale_reallocate(vItemShelvingFk, vItemFk, vSectorFk);
- END IF;
+BEGIN
+/**
+ * Gestiona la reserva de un itemShelvingFk, actualizando isPicked y quantity
+ * en itemShelvingSale y sale.isPicked en caso necesario.
+ * Si la reserva de la ubicación es fallida, se regulariza la situación
+ *
+ * @param vItemShelvingSaleFk Id itemShelvingSaleFK
+ * @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;
+ DECLARE vReservedQuantity INT;
+ DECLARE vRemainingQuantity INT;
+ DECLARE vItemFk INT;
+ DECLARE vTotalQuantity INT;
+ DECLARE vStateCode VARCHAR(45);
+
+ DECLARE EXIT HANDLER FOR SQLEXCEPTION
+ BEGIN
+ ROLLBACK;
+ 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;
+
+ SELECT s.itemFk,
+ iss.saleFk,
+ iss.itemShelvingFk,
+ SUM(IFNULL(iss.quantity,0)),
+ IF(sgd.id, 'PREVIOUS_PREPARATION', 'PREPARED')
+ INTO vItemFk,
+ vSaleFk,
+ vItemShelvingFk,
+ vReservedQuantity,
+ vStateCode
+ FROM itemShelvingSale iss
+ JOIN sale s ON s.id = iss.saleFk
+ LEFT JOIN vn.saleGroupDetail sgd ON sgd.saleFk = iss.saleFk
+ WHERE iss.id = vItemShelvingSaleFk
+ AND NOT iss.isPicked;
+
+ 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;
+
+ START TRANSACTION;
+
+ UPDATE itemShelvingSale
+ SET isPicked = TRUE,
+ quantity = vQuantity
+ WHERE id = vItemShelvingSaleFk;
+
+ SELECT id INTO vItemShelvingFk
+ FROM itemShelving
+ WHERE id = vItemShelvingFk
+ FOR UPDATE;
+
+ UPDATE itemShelving
+ SET visible = GREATEST(0, visible - vQuantity)
+ WHERE id = vItemShelvingFk;
+
+ SELECT SUM(IF(isPicked OR id = vItemShelvingSaleFk, 0, quantity)), SUM(quantity)
+ INTO vRemainingQuantity, vTotalQuantity
+ FROM itemShelvingSale
+ WHERE saleFk = vSaleFk;
+
+ IF vRemainingQuantity = 0 AND NOT vIsItemShelvingSaleEmpty THEN
+ CALL saleTracking_new(
+ vSaleFk,
+ TRUE,
+ vTotalQuantity,
+ `account`.`myUser_getId`(),
+ NULL,
+ vStateCode,
+ TRUE);
+
+ UPDATE sale s
+ SET s.quantity = vTotalQuantity,
+ isPicked = TRUE
+ WHERE s.id = vSaleFk;
+ END IF;
+
+ COMMIT;
+
+ IF vIsItemShelvingSaleEmpty AND vQuantity <> vReservedQuantity THEN
+ INSERT INTO itemShelvingSaleReserve (saleFk, sectorFk)
+ SELECT vSaleFk, vSectorFk;
+ CALL itemShelvingSale_reallocate(vItemShelvingFk, vItemFk, vSectorFk);
+ END IF;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -60742,63 +60742,63 @@ DELIMITER ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
-CREATE DEFINER=`vn`@`localhost` PROCEDURE `itemShelvingSale_unpicked`(
- vSelf INT(11)
+CREATE DEFINER=`vn`@`localhost` PROCEDURE `itemShelvingSale_unpicked`(
+ vSelf INT(11)
)
-BEGIN
-/**
- * Desmarca una línea que ya estaba sacada, devolviendo la cantidad al itemShelving
- *
- * @param vSelf Identificador del itemShelvingSale
- */
- DECLARE vSaleFk INT;
- DECLARE vReservedQuantity INT;
- DECLARE vIsSaleGroup BOOL;
- DECLARE EXIT HANDLER FOR SQLEXCEPTION
- BEGIN
- ROLLBACK;
- RESIGNAL;
- END;
-
- IF (SELECT NOT isPicked FROM itemShelvingSale WHERE id = vSelf) THEN
- CALL util.throw('Reserva no completada');
- END IF;
-
- SELECT ish.saleFk, ish.quantity, IF(sg.id, TRUE, FALSE)
- INTO vSaleFk, vReservedQuantity, vIsSaleGroup
- FROM itemShelvingSale ish
- LEFT JOIN saleGroupDetail sg ON sg.saleFk = ish.saleFk
- WHERE ish.id = vSelf;
-
- /*IF vIsSaleGroup THEN
- CALL util.throw('Can not unpicked a sale group');
- END IF;*/
-
- START TRANSACTION;
-
- UPDATE itemShelvingSale
- SET isPicked = FALSE
- WHERE id = vSelf;
-
- UPDATE sale s
- JOIN itemShelvingSale ish ON ish.saleFk = s.id
- SET s.isPicked = FALSE
- WHERE ish.id = vSelf;
-
- UPDATE itemShelvingSale iss
- JOIN itemShelving ish ON ish.id = iss.itemShelvingFk
- SET ish.visible = ish.visible + iss.quantity
- WHERE iss.id = vSelf;
-
- CALL saleTracking_new(
- vSaleFk,
- FALSE,
- vReservedQuantity,
- `account`.`myUser_getId`(),
- NULL,
- 'ON_PREPARATION',
- TRUE);
- COMMIT;
+BEGIN
+/**
+ * Desmarca una línea que ya estaba sacada, devolviendo la cantidad al itemShelving
+ *
+ * @param vSelf Identificador del itemShelvingSale
+ */
+ DECLARE vSaleFk INT;
+ DECLARE vReservedQuantity INT;
+ DECLARE vIsSaleGroup BOOL;
+ DECLARE EXIT HANDLER FOR SQLEXCEPTION
+ BEGIN
+ ROLLBACK;
+ RESIGNAL;
+ END;
+
+ IF (SELECT NOT isPicked FROM itemShelvingSale WHERE id = vSelf) THEN
+ CALL util.throw('Reserva no completada');
+ END IF;
+
+ SELECT ish.saleFk, ish.quantity, IF(sg.id, TRUE, FALSE)
+ INTO vSaleFk, vReservedQuantity, vIsSaleGroup
+ FROM itemShelvingSale ish
+ LEFT JOIN saleGroupDetail sg ON sg.saleFk = ish.saleFk
+ WHERE ish.id = vSelf;
+
+ /*IF vIsSaleGroup THEN
+ CALL util.throw('Can not unpicked a sale group');
+ END IF;*/
+
+ START TRANSACTION;
+
+ UPDATE itemShelvingSale
+ SET isPicked = FALSE
+ WHERE id = vSelf;
+
+ UPDATE sale s
+ JOIN itemShelvingSale ish ON ish.saleFk = s.id
+ SET s.isPicked = FALSE
+ WHERE ish.id = vSelf;
+
+ UPDATE itemShelvingSale iss
+ JOIN itemShelving ish ON ish.id = iss.itemShelvingFk
+ SET ish.visible = ish.visible + iss.quantity
+ WHERE iss.id = vSelf;
+
+ CALL saleTracking_new(
+ vSaleFk,
+ FALSE,
+ vReservedQuantity,
+ `account`.`myUser_getId`(),
+ NULL,
+ 'ON_PREPARATION',
+ TRUE);
+ COMMIT;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -61293,167 +61293,167 @@ DELIMITER ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
CREATE DEFINER=`vn`@`localhost` PROCEDURE `itemShelving_getSaleDate`(vShelvingFk VARCHAR(3))
-BEGIN
-
- /* Devuelve la mínima fecha en que se necesita cada producto en esa matrícula.
- *
- * @param vShelvingFk Matrícula del carro o pallet
- */
-
- DECLARE vWarehouseFk INT;
- DECLARE vStockScopeDays INT;
-
- SELECT s.warehouseFk, stockScopeDays
- INTO vWarehouseFk, vStockScopeDays
- FROM sector s
- JOIN operator o ON s.id = o.sectorFk
- JOIN productionConfig pc
- WHERE o.workerFk = account.myUser_getId();
-
- IF vWarehouseFk IS NULL
- THEN CALL util.throw('WarehouseFk not setted');
- END IF;
-
- IF vStockScopeDays IS NULL
- THEN CALL util.throw('StockScopeDays not setted');
- END IF;
-
- CREATE OR REPLACE TEMPORARY TABLE tmp.tItems
- (PRIMARY KEY (itemFk))
- ENGINE = MEMORY
- SELECT itemFk, SUM(visible) visible
- FROM itemShelving
- WHERE shelvingFk = vShelvingFk COLLATE utf8_unicode_ci
- GROUP BY itemFk;
-
- CREATE OR REPLACE TEMPORARY TABLE tmp.tStockByDay
- (INDEX (itemFk, dated))
- ENGINE = MEMORY
- SELECT dated,
- SUM(t3.amount) OVER (PARTITION BY t3.itemFk ORDER BY dated) stock,
- t3.itemFk
- FROM (
- SELECT t.itemFk, dated, SUM(amount) amount
- FROM (
- SELECT t2.itemFk, t2.amount, t2.dated
- FROM (
- SELECT item_id itemFk, amount, util.VN_CURDATE() dated
- FROM cache.stock s
- JOIN tmp.tItems i ON i.itemFk = s.item_id
- WHERE s.warehouse_id = vWarehouseFk
- UNION ALL
- SELECT ish.itemFk, - SUM(ish.visible), util.VN_CURDATE()
- FROM itemShelving ish
- JOIN tmp.tItems i ON i.itemFk = ish.itemFk
- JOIN shelving sh ON sh.code = ish.shelvingFk
- JOIN parking p ON sh.parkingFk = p.id
- JOIN sector s ON s.id = p.sectorFk
- WHERE s.isReserve
- GROUP BY ish.itemFk
- UNION ALL
- SELECT iei.itemFk, SUM(quantity), landed
- FROM itemEntryIn iei
- JOIN tmp.tItems i ON i.itemFk = iei.itemFk
- WHERE iei.landed BETWEEN util.VN_CURDATE() AND util.VN_CURDATE() + INTERVAL vStockScopeDays DAY
- AND iei.warehouseInFk = vWarehouseFk
- AND NOT isVirtualStock
- GROUP BY iei.itemFk, iei.landed
- UNION ALL
- SELECT ieo.itemFk, SUM(quantity), shipped
- FROM itemEntryOut ieo
- JOIN tmp.tItems i ON i.itemFk = ieo.itemFk
- WHERE ieo.shipped BETWEEN util.VN_CURDATE() AND util.VN_CURDATE() + INTERVAL vStockScopeDays DAY
- AND ieo.warehouseOutFk = vWarehouseFk
- GROUP BY ieo.itemFk, ieo.shipped
- UNION ALL
- SELECT i.itemFk, SUM(ito.quantity), DATE(ito.shipped)
- FROM itemTicketOut ito
- JOIN tmp.tItems i ON i.itemFk = ito.itemFk
- WHERE ito.shipped BETWEEN util.VN_CURDATE() AND util.VN_CURDATE() + INTERVAL vStockScopeDays DAY
- AND ito.warehouseFk = vWarehouseFk
- GROUP BY ito.itemFk, ito.shipped
- ) t2
- JOIN tmp.tItems i ON i.itemFk = t2.itemFk)t
- GROUP BY t.itemFk, dated
- ) t3;
-
- -- Se restan las entradas de hoy
- UPDATE tmp.tStockByDay sbd
- JOIN (SELECT iei.itemFk, SUM(quantity) todayEntry
- FROM itemEntryIn iei
- JOIN tmp.tItems i ON i.itemFk = iei.itemFk
- WHERE iei.landed = util.VN_CURDATE()
- AND iei.warehouseInFk = vWarehouseFk
- AND NOT iei.isVirtualStock) sub ON sub.itemFk = sbd.itemFk
- SET sbd.stock = sbd.stock - sub.todayEntry
- WHERE sbd.dated = util.VN_CURDATE();
-
- -- Se añaden las lineas de venta servidas
- UPDATE tmp.tStockByDay sbd
- JOIN (SELECT s.itemFK, SUM(quantity) amount
- FROM sale s
- JOIN ticket t ON t.id = s.ticketFk
- WHERE t.warehouseFk = vWarehouseFk
- AND t.shipped BETWEEN util.VN_CURDATE() AND util.midnight()
- AND s.isPicked
- GROUP BY s.itemFk) sub ON sub.itemFk = sbd.itemFk
- SET sbd.stock = sbd.stock + sub.amount;
-
- -- Se añaden los items ubicados hoy
- UPDATE tmp.tStockByDay sbd
- JOIN (SELECT ish.itemFK, SUM(ish.visible) amount
- FROM itemShelving ish
- JOIN shelving sh ON sh.code = ish.shelvingFk
- JOIN parking p ON p.id = sh.parkingFk
- JOIN sector s ON s.id = p.sectorFk
- WHERE s.warehouseFk = vWarehouseFk
- AND NOT s.isReserve
- AND ish.created BETWEEN util.VN_CURDATE() AND util.midnight()
- GROUP BY ish.itemFk) sub ON sub.itemFk = sbd.itemFk
- SET sbd.stock = sbd.stock + sub.amount;
-
- SELECT ts.itemFk,
- i.longName,
- IF(ts.stock<=0, ts.dated, NULL) dated,
- ts.stock,
- sub4.visible,
- sub4.shelvingFk
- FROM(
- SELECT IFNULL(sub2.minDated, sub.minDated) dated,
- IFNULL(sub2.itemFk, sub.itemFk) itemFk
- FROM(SELECT sbd.itemFk,
- MIN(dated) minDated,
- sbd.stock
- FROM tmp.tItems ti
- LEFT JOIN tmp.tStockByDay sbd ON sbd.itemFk = ti.itemFk
- GROUP BY itemFk)sub
- LEFT JOIN (
- SELECT sbd.itemFk,
- MIN(dated) minDated,
- sbd.stock
- FROM tmp.tItems ti
- LEFT JOIN tmp.tStockByDay sbd ON sbd.itemFk = ti.itemFk
- WHERE sbd.stock <= 0
- GROUP BY itemFk)sub2 ON sub2.itemFk =sub.itemFk
- WHERE sub2.itemFk IS NOT NULL
- OR (sub2.itemFk IS NULL AND sub.itemFk IS NOT NULL)) sub3
- LEFT JOIN tmp.tStockByDay ts ON ts.itemFk = sub3.itemFk AND ts.dated = sub3.dated
- JOIN (SELECT ish.itemFk,
- ish.visible,
- p.sectorFk,
- ish.shelvingFk
- FROM itemShelving ish
- JOIN vn.shelving sh ON sh.code = ish.shelvingFk
- LEFT JOIN parking p ON p.id = parkingFk
- LEFT JOIN vn.sector s ON s.id = p.sectorFk
- WHERE ish.shelvingFk = vShelvingFk COLLATE utf8_unicode_ci
- ) sub4 ON sub4.itemFk = ts.itemFk
- LEFT JOIN sector s ON s.id = sub4.sectorFk
- LEFT JOIN item i ON i.id = ts.itemFk
- WHERE NOT s.isReserve;
-
- DROP TEMPORARY TABLE tmp.tStockByDay, tmp.tItems;
-
+BEGIN
+
+ /* Devuelve la mínima fecha en que se necesita cada producto en esa matrícula.
+ *
+ * @param vShelvingFk Matrícula del carro o pallet
+ */
+
+ DECLARE vWarehouseFk INT;
+ DECLARE vStockScopeDays INT;
+
+ SELECT s.warehouseFk, stockScopeDays
+ INTO vWarehouseFk, vStockScopeDays
+ FROM sector s
+ JOIN operator o ON s.id = o.sectorFk
+ JOIN productionConfig pc
+ WHERE o.workerFk = account.myUser_getId();
+
+ IF vWarehouseFk IS NULL
+ THEN CALL util.throw('WarehouseFk not setted');
+ END IF;
+
+ IF vStockScopeDays IS NULL
+ THEN CALL util.throw('StockScopeDays not setted');
+ END IF;
+
+ CREATE OR REPLACE TEMPORARY TABLE tmp.tItems
+ (PRIMARY KEY (itemFk))
+ ENGINE = MEMORY
+ SELECT itemFk, SUM(visible) visible
+ FROM itemShelving
+ WHERE shelvingFk = vShelvingFk COLLATE utf8_unicode_ci
+ GROUP BY itemFk;
+
+ CREATE OR REPLACE TEMPORARY TABLE tmp.tStockByDay
+ (INDEX (itemFk, dated))
+ ENGINE = MEMORY
+ SELECT dated,
+ SUM(t3.amount) OVER (PARTITION BY t3.itemFk ORDER BY dated) stock,
+ t3.itemFk
+ FROM (
+ SELECT t.itemFk, dated, SUM(amount) amount
+ FROM (
+ SELECT t2.itemFk, t2.amount, t2.dated
+ FROM (
+ SELECT item_id itemFk, amount, util.VN_CURDATE() dated
+ FROM cache.stock s
+ JOIN tmp.tItems i ON i.itemFk = s.item_id
+ WHERE s.warehouse_id = vWarehouseFk
+ UNION ALL
+ SELECT ish.itemFk, - SUM(ish.visible), util.VN_CURDATE()
+ FROM itemShelving ish
+ JOIN tmp.tItems i ON i.itemFk = ish.itemFk
+ JOIN shelving sh ON sh.code = ish.shelvingFk
+ JOIN parking p ON sh.parkingFk = p.id
+ JOIN sector s ON s.id = p.sectorFk
+ WHERE s.isReserve
+ GROUP BY ish.itemFk
+ UNION ALL
+ SELECT iei.itemFk, SUM(quantity), landed
+ FROM itemEntryIn iei
+ JOIN tmp.tItems i ON i.itemFk = iei.itemFk
+ WHERE iei.landed BETWEEN util.VN_CURDATE() AND util.VN_CURDATE() + INTERVAL vStockScopeDays DAY
+ AND iei.warehouseInFk = vWarehouseFk
+ AND NOT isVirtualStock
+ GROUP BY iei.itemFk, iei.landed
+ UNION ALL
+ SELECT ieo.itemFk, SUM(quantity), shipped
+ FROM itemEntryOut ieo
+ JOIN tmp.tItems i ON i.itemFk = ieo.itemFk
+ WHERE ieo.shipped BETWEEN util.VN_CURDATE() AND util.VN_CURDATE() + INTERVAL vStockScopeDays DAY
+ AND ieo.warehouseOutFk = vWarehouseFk
+ GROUP BY ieo.itemFk, ieo.shipped
+ UNION ALL
+ SELECT i.itemFk, SUM(ito.quantity), DATE(ito.shipped)
+ FROM itemTicketOut ito
+ JOIN tmp.tItems i ON i.itemFk = ito.itemFk
+ WHERE ito.shipped BETWEEN util.VN_CURDATE() AND util.VN_CURDATE() + INTERVAL vStockScopeDays DAY
+ AND ito.warehouseFk = vWarehouseFk
+ GROUP BY ito.itemFk, ito.shipped
+ ) t2
+ JOIN tmp.tItems i ON i.itemFk = t2.itemFk)t
+ GROUP BY t.itemFk, dated
+ ) t3;
+
+ -- Se restan las entradas de hoy
+ UPDATE tmp.tStockByDay sbd
+ JOIN (SELECT iei.itemFk, SUM(quantity) todayEntry
+ FROM itemEntryIn iei
+ JOIN tmp.tItems i ON i.itemFk = iei.itemFk
+ WHERE iei.landed = util.VN_CURDATE()
+ AND iei.warehouseInFk = vWarehouseFk
+ AND NOT iei.isVirtualStock) sub ON sub.itemFk = sbd.itemFk
+ SET sbd.stock = sbd.stock - sub.todayEntry
+ WHERE sbd.dated = util.VN_CURDATE();
+
+ -- Se añaden las lineas de venta servidas
+ UPDATE tmp.tStockByDay sbd
+ JOIN (SELECT s.itemFK, SUM(quantity) amount
+ FROM sale s
+ JOIN ticket t ON t.id = s.ticketFk
+ WHERE t.warehouseFk = vWarehouseFk
+ AND t.shipped BETWEEN util.VN_CURDATE() AND util.midnight()
+ AND s.isPicked
+ GROUP BY s.itemFk) sub ON sub.itemFk = sbd.itemFk
+ SET sbd.stock = sbd.stock + sub.amount;
+
+ -- Se añaden los items ubicados hoy
+ UPDATE tmp.tStockByDay sbd
+ JOIN (SELECT ish.itemFK, SUM(ish.visible) amount
+ FROM itemShelving ish
+ JOIN shelving sh ON sh.code = ish.shelvingFk
+ JOIN parking p ON p.id = sh.parkingFk
+ JOIN sector s ON s.id = p.sectorFk
+ WHERE s.warehouseFk = vWarehouseFk
+ AND NOT s.isReserve
+ AND ish.created BETWEEN util.VN_CURDATE() AND util.midnight()
+ GROUP BY ish.itemFk) sub ON sub.itemFk = sbd.itemFk
+ SET sbd.stock = sbd.stock + sub.amount;
+
+ SELECT ts.itemFk,
+ i.longName,
+ IF(ts.stock<=0, ts.dated, NULL) dated,
+ ts.stock,
+ sub4.visible,
+ sub4.shelvingFk
+ FROM(
+ SELECT IFNULL(sub2.minDated, sub.minDated) dated,
+ IFNULL(sub2.itemFk, sub.itemFk) itemFk
+ FROM(SELECT sbd.itemFk,
+ MIN(dated) minDated,
+ sbd.stock
+ FROM tmp.tItems ti
+ LEFT JOIN tmp.tStockByDay sbd ON sbd.itemFk = ti.itemFk
+ GROUP BY itemFk)sub
+ LEFT JOIN (
+ SELECT sbd.itemFk,
+ MIN(dated) minDated,
+ sbd.stock
+ FROM tmp.tItems ti
+ LEFT JOIN tmp.tStockByDay sbd ON sbd.itemFk = ti.itemFk
+ WHERE sbd.stock <= 0
+ GROUP BY itemFk)sub2 ON sub2.itemFk =sub.itemFk
+ WHERE sub2.itemFk IS NOT NULL
+ OR (sub2.itemFk IS NULL AND sub.itemFk IS NOT NULL)) sub3
+ LEFT JOIN tmp.tStockByDay ts ON ts.itemFk = sub3.itemFk AND ts.dated = sub3.dated
+ JOIN (SELECT ish.itemFk,
+ ish.visible,
+ p.sectorFk,
+ ish.shelvingFk
+ FROM itemShelving ish
+ JOIN vn.shelving sh ON sh.code = ish.shelvingFk
+ LEFT JOIN parking p ON p.id = parkingFk
+ LEFT JOIN vn.sector s ON s.id = p.sectorFk
+ WHERE ish.shelvingFk = vShelvingFk COLLATE utf8_unicode_ci
+ ) sub4 ON sub4.itemFk = ts.itemFk
+ LEFT JOIN sector s ON s.id = sub4.sectorFk
+ LEFT JOIN item i ON i.id = ts.itemFk
+ WHERE NOT s.isReserve;
+
+ DROP TEMPORARY TABLE tmp.tStockByDay, tmp.tItems;
+
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -63193,50 +63193,50 @@ DELIMITER ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
CREATE DEFINER=`vn`@`localhost` PROCEDURE `item_getAtp`(vDated DATE)
-BEGIN
-/**
- * Calcula el valor mínimo acumulado para cada artículo ordenado por fecha y
- * almacén.
- *
- * @param vDated Si no hay movimientos en la fecha indicada, debe devolver 0
- * @table tmp.itemCalc(itemFk, wareHouseFk, dated, quantity)
- * @return tmp.itemAtp(itemFk, warehouseFk, quantity)
- */
- CREATE OR REPLACE TEMPORARY TABLE tItemOrdered
- (UNIQUE(itemFk, warehouseFk, dated))
- ENGINE = MEMORY
- SELECT itemFk, warehouseFk, dated, SUM(quantity) quantity
- FROM (
- SELECT itemFk, warehouseFk, dated, quantity
- FROM tmp.itemCalc
- UNION ALL
- SELECT itemFk, warehouseFk, vDated, 0
- FROM (SELECT DISTINCT itemFk, warehouseFk FROM tmp.itemCalc) t2
- ) t1
- GROUP BY itemFk, warehouseFk, dated
- ORDER BY itemFk, warehouseFk, dated;
-
- SET @lastItemFk := 0;
- SET @lastWareHouseFk := 0;
- SET @lastQuantity := 0;
-
- CREATE OR REPLACE TEMPORARY TABLE tmp.itemAtp
- (INDEX (itemFk, wareHouseFk))
- SELECT itemFk, wareHouseFk, MIN(quantityAccumulated) quantity
- FROM (
- SELECT
- itemFk,
- IF(itemFk <> @lastItemFk OR wareHouseFk <> @lastWareHouseFk,
- @lastQuantity := quantity,
- @lastQuantity := @lastQuantity + quantity) quantityAccumulated,
- wareHouseFk,
- @lastItemFk := itemFk,
- @lastWareHouseFk := wareHouseFk
- FROM tItemOrdered
- )sub
- GROUP BY itemFk, wareHouseFk;
-
- DROP TEMPORARY TABLE tItemOrdered;
+BEGIN
+/**
+ * Calcula el valor mínimo acumulado para cada artículo ordenado por fecha y
+ * almacén.
+ *
+ * @param vDated Si no hay movimientos en la fecha indicada, debe devolver 0
+ * @table tmp.itemCalc(itemFk, wareHouseFk, dated, quantity)
+ * @return tmp.itemAtp(itemFk, warehouseFk, quantity)
+ */
+ CREATE OR REPLACE TEMPORARY TABLE tItemOrdered
+ (UNIQUE(itemFk, warehouseFk, dated))
+ ENGINE = MEMORY
+ SELECT itemFk, warehouseFk, dated, SUM(quantity) quantity
+ FROM (
+ SELECT itemFk, warehouseFk, dated, quantity
+ FROM tmp.itemCalc
+ UNION ALL
+ SELECT itemFk, warehouseFk, vDated, 0
+ FROM (SELECT DISTINCT itemFk, warehouseFk FROM tmp.itemCalc) t2
+ ) t1
+ GROUP BY itemFk, warehouseFk, dated
+ ORDER BY itemFk, warehouseFk, dated;
+
+ SET @lastItemFk := 0;
+ SET @lastWareHouseFk := 0;
+ SET @lastQuantity := 0;
+
+ CREATE OR REPLACE TEMPORARY TABLE tmp.itemAtp
+ (INDEX (itemFk, wareHouseFk))
+ SELECT itemFk, wareHouseFk, MIN(quantityAccumulated) quantity
+ FROM (
+ SELECT
+ itemFk,
+ IF(itemFk <> @lastItemFk OR wareHouseFk <> @lastWareHouseFk,
+ @lastQuantity := quantity,
+ @lastQuantity := @lastQuantity + quantity) quantityAccumulated,
+ wareHouseFk,
+ @lastItemFk := itemFk,
+ @lastWareHouseFk := wareHouseFk
+ FROM tItemOrdered
+ )sub
+ GROUP BY itemFk, wareHouseFk;
+
+ DROP TEMPORARY TABLE tItemOrdered;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -65424,176 +65424,176 @@ DELIMITER ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
-CREATE DEFINER=`vn`@`localhost` PROCEDURE `multipleInventory`(
- vDate DATE,
- vWarehouseFk TINYINT,
- vMaxDays TINYINT
+CREATE DEFINER=`vn`@`localhost` PROCEDURE `multipleInventory`(
+ vDate DATE,
+ vWarehouseFk TINYINT,
+ vMaxDays TINYINT
)
-proc: BEGIN
- DECLARE vDateTomorrow DATE DEFAULT vDate + INTERVAL 1 DAY;
- DECLARE vDateFrom DATE DEFAULT vDate;
- DECLARE vDateTo DATETIME;
- DECLARE vDateToTomorrow DATETIME;
- DECLARE vDefaultDayRange INT;
- DECLARE vCalcFk INT;
-
- IF vDate < util.VN_CURDATE() THEN
- LEAVE proc;
- END IF;
-
- IF vDate = util.VN_CURDATE() THEN
- SELECT inventoried INTO vDateFrom
- FROM config;
- END IF;
-
- SELECT defaultDayRange INTO vDefaultDayRange
- FROM comparativeConfig;
-
- SET vDateTo = vDate + INTERVAL IFNULL(vMaxDays, vDefaultDayRange) DAY;
- SET vDateToTomorrow = vDateTo + INTERVAL 1 DAY;
-
- ALTER TABLE tmp.itemInventory
- ADD `avalaible` INT NOT NULL,
- ADD `sd` INT NOT NULL,
- ADD `rest` INT NOT NULL,
- ADD `expected` INT NOT NULL,
- ADD `inventory` INT NOT NULL,
- ADD `visible` INT NOT NULL,
- ADD `life` TINYINT NOT NULL DEFAULT '0';
-
- -- Calculo del inventario
- CREATE OR REPLACE TEMPORARY TABLE tItemInventoryCalc
- (PRIMARY KEY (itemFk))
- ENGINE = MEMORY
- SELECT itemFk,
- SUM(quantity) quantity
- FROM (
- SELECT s.itemFk, - s.quantity quantity
- FROM sale s
- JOIN ticket t ON t.id = s.ticketFk
- JOIN warehouse w ON w.id = t.warehouseFk
- WHERE t.shipped BETWEEN vDateFrom AND util.dayEnd(vDate)
- AND IFNULL(vWarehouseFk, t.warehouseFk) = t.warehouseFk
- AND w.isComparative
- UNION ALL
- SELECT b.itemFk, b.quantity
- FROM buy b
- JOIN entry e ON e.id = b.entryFk
- JOIN travel t ON t.id = e.travelFk
- JOIN warehouse w ON w.id = t.warehouseInFk
- WHERE t.landed BETWEEN vDateFrom AND util.dayEnd(vDate)
- AND IFNULL(vWarehouseFk, t.warehouseInFk) = t.warehouseInFk
- AND w.isComparative
- AND NOT e.isExcludedFromAvailable
- AND NOT e.isRaid
- UNION ALL
- SELECT b.itemFk, - b.quantity
- FROM buy b
- JOIN entry e ON e.id = b.entryFk
- JOIN travel t ON t.id = e.travelFk
- JOIN warehouse w ON w.id = t.warehouseOutFk
- WHERE t.shipped BETWEEN vDateFrom AND util.dayEnd(vDate)
- AND IFNULL(vWarehouseFk, t.warehouseOutFk) = t.warehouseOutFk
- AND w.isComparative
- AND NOT e.isExcludedFromAvailable
- AND NOT e.isRaid
- ) sub
- GROUP BY itemFk;
-
- -- Cálculo del visible
- CALL cache.visible_refresh(vCalcFk, FALSE, vWarehouseFk);
-
- CREATE OR REPLACE TEMPORARY TABLE tItemVisibleCalc
- (PRIMARY KEY (item_id))
- ENGINE = MEMORY
- SELECT item_id, visible
- FROM cache.visible
- WHERE calc_id = vCalcFk;
-
- UPDATE tmp.itemInventory it
- LEFT JOIN tItemInventoryCalc iic ON iic.itemFk = it.id
- LEFT JOIN tItemVisibleCalc ivc ON ivc.item_id = it.id
- SET it.inventory = iic.quantity,
- it.visible = ivc.visible,
- it.avalaible = iic.quantity,
- it.sd = iic.quantity;
-
- -- Calculo del disponible
- CREATE OR REPLACE TEMPORARY TABLE tmp.itemCalc
- (INDEX (itemFk, warehouseFk))
- ENGINE = MEMORY
- SELECT sub.itemFk,
- vWarehouseFk warehouseFk,
- sub.dated,
- SUM(sub.quantity) quantity
- FROM (
- SELECT s.itemFk,
- DATE(t.shipped) dated,
- - s.quantity quantity
- FROM sale s
- JOIN ticket t ON t.id = s.ticketFk
- JOIN warehouse w ON w.id = t.warehouseFk
- WHERE t.shipped BETWEEN vDateTomorrow AND vDateTo
- AND IFNULL(vWarehouseFk, t.warehouseFk) = t.warehouseFk
- AND w.isComparative
- UNION ALL
- SELECT b.itemFk, t.landed, b.quantity
- FROM buy b
- JOIN entry e ON e.id = b.entryFk
- JOIN travel t ON t.id = e.travelFk
- JOIN warehouse w ON w.id = t.warehouseInFk
- WHERE t.landed BETWEEN vDateTomorrow AND vDateTo
- AND IFNULL(vWarehouseFk, t.warehouseInFk) = t.warehouseInFk
- AND w.isComparative
- AND NOT e.isExcludedFromAvailable
- AND NOT e.isRaid
- UNION ALL
- SELECT b.itemFk, t.shipped, - b.quantity
- FROM buy b
- JOIN entry e ON e.id = b.entryFk
- JOIN travel t ON t.id = e.travelFk
- JOIN warehouse w ON w.id = t.warehouseOutFk
- WHERE t.shipped BETWEEN vDateTomorrow AND vDateTo
- AND IFNULL(vWarehouseFk, t.warehouseOutFk) = t.warehouseOutFk
- AND w.isComparative
- AND NOT e.isExcludedFromAvailable
- AND NOT e.isRaid
- ) sub
- GROUP BY sub.itemFk, sub.dated;
-
- CALL item_getAtp(vDate);
- CALL travel_upcomingArrivals(vWarehouseFk, vDate);
-
- CREATE OR REPLACE TEMPORARY TABLE tItemAvailableCalc
- (PRIMARY KEY (itemFk))
- ENGINE = MEMORY
- SELECT it.itemFk,
- SUM(it.quantity) quantity,
- im.quantity minQuantity
- FROM tmp.itemCalc it
- JOIN tmp.itemAtp im ON im.itemFk = it.itemFk
- JOIN item i ON i.id = it.itemFk
- LEFT JOIN origin o ON o.id = i.originFk
- LEFT JOIN tmp.itemTravel t ON t.wh = o.warehouseFk
- WHERE it.dated < IF(vMaxDays < 0 AND t.landing IS NOT NULL,
- t.landing,
- vDateToTomorrow)
- GROUP BY it.itemFk;
-
- UPDATE tmp.itemInventory it
- JOIN tItemAvailableCalc iac ON iac.itemFk = it.id
- SET it.avalaible = IF(iac.minQuantity > 0,
- it.avalaible,
- it.avalaible + iac.minQuantity),
- it.sd = it.inventory + iac.quantity;
-
- DROP TEMPORARY TABLE
- tmp.itemTravel,
- tmp.itemCalc,
- tmp.itemAtp,
- tItemInventoryCalc,
- tItemVisibleCalc,
- tItemAvailableCalc;
+proc: BEGIN
+ DECLARE vDateTomorrow DATE DEFAULT vDate + INTERVAL 1 DAY;
+ DECLARE vDateFrom DATE DEFAULT vDate;
+ DECLARE vDateTo DATETIME;
+ DECLARE vDateToTomorrow DATETIME;
+ DECLARE vDefaultDayRange INT;
+ DECLARE vCalcFk INT;
+
+ IF vDate < util.VN_CURDATE() THEN
+ LEAVE proc;
+ END IF;
+
+ IF vDate = util.VN_CURDATE() THEN
+ SELECT inventoried INTO vDateFrom
+ FROM config;
+ END IF;
+
+ SELECT defaultDayRange INTO vDefaultDayRange
+ FROM comparativeConfig;
+
+ SET vDateTo = vDate + INTERVAL IFNULL(vMaxDays, vDefaultDayRange) DAY;
+ SET vDateToTomorrow = vDateTo + INTERVAL 1 DAY;
+
+ ALTER TABLE tmp.itemInventory
+ ADD `avalaible` INT NOT NULL,
+ ADD `sd` INT NOT NULL,
+ ADD `rest` INT NOT NULL,
+ ADD `expected` INT NOT NULL,
+ ADD `inventory` INT NOT NULL,
+ ADD `visible` INT NOT NULL,
+ ADD `life` TINYINT NOT NULL DEFAULT '0';
+
+ -- Calculo del inventario
+ CREATE OR REPLACE TEMPORARY TABLE tItemInventoryCalc
+ (PRIMARY KEY (itemFk))
+ ENGINE = MEMORY
+ SELECT itemFk,
+ SUM(quantity) quantity
+ FROM (
+ SELECT s.itemFk, - s.quantity quantity
+ FROM sale s
+ JOIN ticket t ON t.id = s.ticketFk
+ JOIN warehouse w ON w.id = t.warehouseFk
+ WHERE t.shipped BETWEEN vDateFrom AND util.dayEnd(vDate)
+ AND IFNULL(vWarehouseFk, t.warehouseFk) = t.warehouseFk
+ AND w.isComparative
+ UNION ALL
+ SELECT b.itemFk, b.quantity
+ FROM buy b
+ JOIN entry e ON e.id = b.entryFk
+ JOIN travel t ON t.id = e.travelFk
+ JOIN warehouse w ON w.id = t.warehouseInFk
+ WHERE t.landed BETWEEN vDateFrom AND util.dayEnd(vDate)
+ AND IFNULL(vWarehouseFk, t.warehouseInFk) = t.warehouseInFk
+ AND w.isComparative
+ AND NOT e.isExcludedFromAvailable
+ AND NOT e.isRaid
+ UNION ALL
+ SELECT b.itemFk, - b.quantity
+ FROM buy b
+ JOIN entry e ON e.id = b.entryFk
+ JOIN travel t ON t.id = e.travelFk
+ JOIN warehouse w ON w.id = t.warehouseOutFk
+ WHERE t.shipped BETWEEN vDateFrom AND util.dayEnd(vDate)
+ AND IFNULL(vWarehouseFk, t.warehouseOutFk) = t.warehouseOutFk
+ AND w.isComparative
+ AND NOT e.isExcludedFromAvailable
+ AND NOT e.isRaid
+ ) sub
+ GROUP BY itemFk;
+
+ -- Cálculo del visible
+ CALL cache.visible_refresh(vCalcFk, FALSE, vWarehouseFk);
+
+ CREATE OR REPLACE TEMPORARY TABLE tItemVisibleCalc
+ (PRIMARY KEY (item_id))
+ ENGINE = MEMORY
+ SELECT item_id, visible
+ FROM cache.visible
+ WHERE calc_id = vCalcFk;
+
+ UPDATE tmp.itemInventory it
+ LEFT JOIN tItemInventoryCalc iic ON iic.itemFk = it.id
+ LEFT JOIN tItemVisibleCalc ivc ON ivc.item_id = it.id
+ SET it.inventory = iic.quantity,
+ it.visible = ivc.visible,
+ it.avalaible = iic.quantity,
+ it.sd = iic.quantity;
+
+ -- Calculo del disponible
+ CREATE OR REPLACE TEMPORARY TABLE tmp.itemCalc
+ (INDEX (itemFk, warehouseFk))
+ ENGINE = MEMORY
+ SELECT sub.itemFk,
+ vWarehouseFk warehouseFk,
+ sub.dated,
+ SUM(sub.quantity) quantity
+ FROM (
+ SELECT s.itemFk,
+ DATE(t.shipped) dated,
+ - s.quantity quantity
+ FROM sale s
+ JOIN ticket t ON t.id = s.ticketFk
+ JOIN warehouse w ON w.id = t.warehouseFk
+ WHERE t.shipped BETWEEN vDateTomorrow AND vDateTo
+ AND IFNULL(vWarehouseFk, t.warehouseFk) = t.warehouseFk
+ AND w.isComparative
+ UNION ALL
+ SELECT b.itemFk, t.landed, b.quantity
+ FROM buy b
+ JOIN entry e ON e.id = b.entryFk
+ JOIN travel t ON t.id = e.travelFk
+ JOIN warehouse w ON w.id = t.warehouseInFk
+ WHERE t.landed BETWEEN vDateTomorrow AND vDateTo
+ AND IFNULL(vWarehouseFk, t.warehouseInFk) = t.warehouseInFk
+ AND w.isComparative
+ AND NOT e.isExcludedFromAvailable
+ AND NOT e.isRaid
+ UNION ALL
+ SELECT b.itemFk, t.shipped, - b.quantity
+ FROM buy b
+ JOIN entry e ON e.id = b.entryFk
+ JOIN travel t ON t.id = e.travelFk
+ JOIN warehouse w ON w.id = t.warehouseOutFk
+ WHERE t.shipped BETWEEN vDateTomorrow AND vDateTo
+ AND IFNULL(vWarehouseFk, t.warehouseOutFk) = t.warehouseOutFk
+ AND w.isComparative
+ AND NOT e.isExcludedFromAvailable
+ AND NOT e.isRaid
+ ) sub
+ GROUP BY sub.itemFk, sub.dated;
+
+ CALL item_getAtp(vDate);
+ CALL travel_upcomingArrivals(vWarehouseFk, vDate);
+
+ CREATE OR REPLACE TEMPORARY TABLE tItemAvailableCalc
+ (PRIMARY KEY (itemFk))
+ ENGINE = MEMORY
+ SELECT it.itemFk,
+ SUM(it.quantity) quantity,
+ im.quantity minQuantity
+ FROM tmp.itemCalc it
+ JOIN tmp.itemAtp im ON im.itemFk = it.itemFk
+ JOIN item i ON i.id = it.itemFk
+ LEFT JOIN origin o ON o.id = i.originFk
+ LEFT JOIN tmp.itemTravel t ON t.wh = o.warehouseFk
+ WHERE it.dated < IF(vMaxDays < 0 AND t.landing IS NOT NULL,
+ t.landing,
+ vDateToTomorrow)
+ GROUP BY it.itemFk;
+
+ UPDATE tmp.itemInventory it
+ JOIN tItemAvailableCalc iac ON iac.itemFk = it.id
+ SET it.avalaible = IF(iac.minQuantity > 0,
+ it.avalaible,
+ it.avalaible + iac.minQuantity),
+ it.sd = it.inventory + iac.quantity;
+
+ DROP TEMPORARY TABLE
+ tmp.itemTravel,
+ tmp.itemCalc,
+ tmp.itemAtp,
+ tItemInventoryCalc,
+ tItemVisibleCalc,
+ tItemAvailableCalc;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -70251,30 +70251,30 @@ DELIMITER ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
CREATE DEFINER=`vn`@`localhost` PROCEDURE `sectorCollection_new`(vSectorFk INT)
-BEGIN
-/**
- * Inserta una nueva colección, si el usuario no tiene ninguna vacia.
- * Esto se hace para evitar que por error se generen colecciones sin sentido.
- *
- * @param vSectorFk Identificador de #vn.sector
- */
- DECLARE hasEmptyCollections BOOL;
- DECLARE vUserFk INT;
-
- SET vUserFk = account.myUser_getId();
-
- SELECT (COUNT(sc.id) > 0) INTO hasEmptyCollections
- FROM vn.sectorCollection sc
- LEFT JOIN vn.sectorCollectionSaleGroup scsg ON scsg.sectorCollectionFk = sc.id
- WHERE ISNULL(scsg.id)
- AND sc.userFk = vUserFk
- AND sc.sectorFk = vSectorFk
- AND sc.created >= util.VN_CURDATE();
-
- IF NOT hasEmptyCollections THEN
- INSERT INTO vn.sectorCollection(userFk, sectorFk)
- VALUES(vUserFk, vSectorFk);
- END IF;
+BEGIN
+/**
+ * Inserta una nueva colección, si el usuario no tiene ninguna vacia.
+ * Esto se hace para evitar que por error se generen colecciones sin sentido.
+ *
+ * @param vSectorFk Identificador de #vn.sector
+ */
+ DECLARE hasEmptyCollections BOOL;
+ DECLARE vUserFk INT;
+
+ SET vUserFk = account.myUser_getId();
+
+ SELECT (COUNT(sc.id) > 0) INTO hasEmptyCollections
+ FROM vn.sectorCollection sc
+ LEFT JOIN vn.sectorCollectionSaleGroup scsg ON scsg.sectorCollectionFk = sc.id
+ WHERE ISNULL(scsg.id)
+ AND sc.userFk = vUserFk
+ AND sc.sectorFk = vSectorFk
+ AND sc.created >= util.VN_CURDATE();
+
+ IF NOT hasEmptyCollections THEN
+ INSERT INTO vn.sectorCollection(userFk, sectorFk)
+ VALUES(vUserFk, vSectorFk);
+ END IF;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -74173,62 +74173,62 @@ DELIMITER ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
-CREATE DEFINER=`vn`@`localhost` PROCEDURE `ticket_DelayTruckSplit`(
- vTicketFk INT
+CREATE DEFINER=`vn`@`localhost` PROCEDURE `ticket_DelayTruckSplit`(
+ vTicketFk INT
)
-BEGIN
-/**
- * Splita las lineas de ticket que no estan ubicadas
- *
- * @param vTicketFk Id ticket
- */
- DECLARE vNewTicketFk INT;
- DECLARE vTotalLines INT;
- DECLARE vLinesToSplit INT;
-
- DROP TEMPORARY TABLE IF EXISTS tmp.SalesToSplit;
-
- SELECT COUNT(*) INTO vTotalLines
- FROM sale
- WHERE ticketFk = vTicketFk;
-
- CREATE TEMPORARY TABLE tmp.SalesToSplit
- SELECT s.id saleFk
- FROM ticket t
- JOIN sale s ON t.id = s.ticketFk
- LEFT JOIN (
- SELECT ish.itemFk itemFk,
- SUM(ish.visible) visible,
- s.warehouseFk warehouseFk
- FROM itemShelving ish
- JOIN shelving sh ON sh.code = ish.shelvingFk
- JOIN parking p ON p.id = sh.parkingFk
- JOIN sector s ON s.id = p.sectorFk
- GROUP BY ish.itemFk,
- s.warehouseFk
- ) issw ON issw.itemFk = s.itemFk
- AND issw.warehouseFk = t.warehouseFk
- WHERE s.quantity > IFNULL(issw.visible, 0)
- AND s.quantity > 0
- AND NOT s.isPicked
- AND NOT s.reserved
- AND t.id = vTicketFk;
-
- SELECT COUNT(*) INTO vLinesToSplit
- FROM tmp.SalesToSplit;
-
- IF vLinesToSplit = vTotalLines AND vLinesToSplit > 0 THEN
- SET vNewTicketFk = vTicketFk;
- ELSE
- CALL ticket_Clone(vTicketFk, vNewTicketFk);
- UPDATE sale s
- JOIN tmp.SalesToSplit sts ON sts.saleFk = s.id
- SET s.ticketFk = vNewTicketFk;
- END IF;
-
- CALL ticket_setState(vNewTicketFk, 'FIXING');
-
- DROP TEMPORARY TABLE tmp.SalesToSplit;
+BEGIN
+/**
+ * Splita las lineas de ticket que no estan ubicadas
+ *
+ * @param vTicketFk Id ticket
+ */
+ DECLARE vNewTicketFk INT;
+ DECLARE vTotalLines INT;
+ DECLARE vLinesToSplit INT;
+
+ DROP TEMPORARY TABLE IF EXISTS tmp.SalesToSplit;
+
+ SELECT COUNT(*) INTO vTotalLines
+ FROM sale
+ WHERE ticketFk = vTicketFk;
+
+ CREATE TEMPORARY TABLE tmp.SalesToSplit
+ SELECT s.id saleFk
+ FROM ticket t
+ JOIN sale s ON t.id = s.ticketFk
+ LEFT JOIN (
+ SELECT ish.itemFk itemFk,
+ SUM(ish.visible) visible,
+ s.warehouseFk warehouseFk
+ FROM itemShelving ish
+ JOIN shelving sh ON sh.code = ish.shelvingFk
+ JOIN parking p ON p.id = sh.parkingFk
+ JOIN sector s ON s.id = p.sectorFk
+ GROUP BY ish.itemFk,
+ s.warehouseFk
+ ) issw ON issw.itemFk = s.itemFk
+ AND issw.warehouseFk = t.warehouseFk
+ WHERE s.quantity > IFNULL(issw.visible, 0)
+ AND s.quantity > 0
+ AND NOT s.isPicked
+ AND NOT s.reserved
+ AND t.id = vTicketFk;
+
+ SELECT COUNT(*) INTO vLinesToSplit
+ FROM tmp.SalesToSplit;
+
+ IF vLinesToSplit = vTotalLines AND vLinesToSplit > 0 THEN
+ SET vNewTicketFk = vTicketFk;
+ ELSE
+ CALL ticket_Clone(vTicketFk, vNewTicketFk);
+ UPDATE sale s
+ JOIN tmp.SalesToSplit sts ON sts.saleFk = s.id
+ SET s.ticketFk = vNewTicketFk;
+ END IF;
+
+ CALL ticket_setState(vNewTicketFk, 'FIXING');
+
+ DROP TEMPORARY TABLE tmp.SalesToSplit;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -74246,84 +74246,84 @@ DELIMITER ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
CREATE DEFINER=`vn`@`localhost` PROCEDURE `ticket_doCmr`(vSelf INT)
-BEGIN
-/**
-* Crea u actualiza la información del CMR asociado con
-* un ticket específico en caso de que sea necesario.
-*
-* @param vSelf El id del ticket
-*/
- DECLARE vCmrFk INT;
- SELECT cmrFk INTO vCmrFk
- FROM ticket
- WHERE id = vSelf;
-
- CREATE OR REPLACE TEMPORARY TABLE tTicket
- SELECT wo.firstName,
- v.numberPlate,
- com.id companyFk,
- a.id addressFk,
- c2.defaultAddressFk,
- IFNULL(sat.supplierFk, su.id) supplierFk,
- t.landed
- FROM ticket t
- JOIN ticketState ts ON ts.ticketFk = t.id
- JOIN `state` s ON s.id = ts.stateFk
- JOIN alertLevel al ON al.id = s.alertLevel
- JOIN client c ON c.id = t.clientFk
- JOIN `address` a ON a.id = t.addressFk
- JOIN province p ON p.id = a.provinceFk
- JOIN country co ON co.id = p.countryFk
- JOIN warehouse w ON w.id = t.warehouseFk
- JOIN company com ON com.id = t.companyFk
- JOIN client c2 ON c2.id = com.clientFk
- JOIN supplierAccount sa ON sa.id = com.supplierAccountFk
- JOIN supplier su ON su.id = sa.supplierFk
- LEFT JOIN route r ON r.id = t.routeFk
- LEFT JOIN worker wo ON wo.id = r.workerFk
- LEFT JOIN vehicle v ON v.id = r.vehicleFk
- LEFT JOIN agencyMode am ON am.id = r.agencyModeFk
- LEFT JOIN agency ag ON ag.id = am.agencyFk
- LEFT JOIN supplierAgencyTerm sat ON sat.agencyFk = ag.id
- AND wo.isFreelance
- WHERE al.code IN ('PACKED', 'DELIVERED')
- AND co.code <> 'ES'
- AND am.name <> 'ABONO'
- AND w.code = 'ALG'
- AND t.id = vSelf
- GROUP BY t.id;
-
- IF vCmrFk THEN
- UPDATE cmr c
- JOIN tTicket t
- SET c.senderInstruccions = t.firstName,
- c.truckPlate = t.numberPlate,
- c.companyFk = t.companyFk,
- c.addressToFk = t.addressFk,
- c.addressFromFk = t.defaultAddressFk,
- c.supplierFk = t.supplierFk,
- c.ead = t.landed
- WHERE id = vCmrFk;
- ELSE
- INSERT INTO cmr (
- senderInstruccions,
- truckPlate,
- companyFk,
- addressToFk,
- addressFromFk,
- supplierFk,
- ead
- )
- SELECT * FROM tTicket;
-
- IF (SELECT EXISTS(SELECT * FROM tTicket)) THEN
- UPDATE ticket
- SET cmrFk = LAST_INSERT_ID()
- WHERE id = vSelf;
- END IF;
- END IF;
-
- DROP TEMPORARY TABLE tTicket;
+BEGIN
+/**
+* Crea u actualiza la información del CMR asociado con
+* un ticket específico en caso de que sea necesario.
+*
+* @param vSelf El id del ticket
+*/
+ DECLARE vCmrFk INT;
+ SELECT cmrFk INTO vCmrFk
+ FROM ticket
+ WHERE id = vSelf;
+
+ CREATE OR REPLACE TEMPORARY TABLE tTicket
+ SELECT wo.firstName,
+ v.numberPlate,
+ com.id companyFk,
+ a.id addressFk,
+ c2.defaultAddressFk,
+ IFNULL(sat.supplierFk, su.id) supplierFk,
+ t.landed
+ FROM ticket t
+ JOIN ticketState ts ON ts.ticketFk = t.id
+ JOIN `state` s ON s.id = ts.stateFk
+ JOIN alertLevel al ON al.id = s.alertLevel
+ JOIN client c ON c.id = t.clientFk
+ JOIN `address` a ON a.id = t.addressFk
+ JOIN province p ON p.id = a.provinceFk
+ JOIN country co ON co.id = p.countryFk
+ JOIN warehouse w ON w.id = t.warehouseFk
+ JOIN company com ON com.id = t.companyFk
+ JOIN client c2 ON c2.id = com.clientFk
+ JOIN supplierAccount sa ON sa.id = com.supplierAccountFk
+ JOIN supplier su ON su.id = sa.supplierFk
+ LEFT JOIN route r ON r.id = t.routeFk
+ LEFT JOIN worker wo ON wo.id = r.workerFk
+ LEFT JOIN vehicle v ON v.id = r.vehicleFk
+ LEFT JOIN agencyMode am ON am.id = r.agencyModeFk
+ LEFT JOIN agency ag ON ag.id = am.agencyFk
+ LEFT JOIN supplierAgencyTerm sat ON sat.agencyFk = ag.id
+ AND wo.isFreelance
+ WHERE al.code IN ('PACKED', 'DELIVERED')
+ AND co.code <> 'ES'
+ AND am.name <> 'ABONO'
+ AND w.code = 'ALG'
+ AND t.id = vSelf
+ GROUP BY t.id;
+
+ IF vCmrFk THEN
+ UPDATE cmr c
+ JOIN tTicket t
+ SET c.senderInstruccions = t.firstName,
+ c.truckPlate = t.numberPlate,
+ c.companyFk = t.companyFk,
+ c.addressToFk = t.addressFk,
+ c.addressFromFk = t.defaultAddressFk,
+ c.supplierFk = t.supplierFk,
+ c.ead = t.landed
+ WHERE id = vCmrFk;
+ ELSE
+ INSERT INTO cmr (
+ senderInstruccions,
+ truckPlate,
+ companyFk,
+ addressToFk,
+ addressFromFk,
+ supplierFk,
+ ead
+ )
+ SELECT * FROM tTicket;
+
+ IF (SELECT EXISTS(SELECT * FROM tTicket)) THEN
+ UPDATE ticket
+ SET cmrFk = LAST_INSERT_ID()
+ WHERE id = vSelf;
+ END IF;
+ END IF;
+
+ DROP TEMPORARY TABLE tTicket;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -81979,126 +81979,126 @@ DELIMITER ;
/*!50003 SET character_set_results = utf8mb4 */ ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
-CREATE DEFINER=`vn`@`localhost` PROCEDURE `zone_getLeaves`(
- vSelf INT,
- vParentFk INT,
- vSearch VARCHAR(255),
- vHasInsert BOOL
+CREATE DEFINER=`vn`@`localhost` PROCEDURE `zone_getLeaves`(
+ vSelf INT,
+ vParentFk INT,
+ vSearch VARCHAR(255),
+ vHasInsert BOOL
)
-BEGIN
-/**
- * Devuelve las ubicaciones incluidas en la ruta y que sean hijos de parentFk.
- * @param vSelf Id de la zona
- * @param vParentFk Id del geo a calcular
- * @param vSearch Cadena a buscar
- * @param vHasInsert Indica si inserta en tmp.zoneNodes
- * Optional @table tmp.zoneNodes(geoFk, name, parentFk, sons, isChecked, zoneFk)
- */
- DECLARE vIsNumber BOOL;
- DECLARE vIsSearch BOOL DEFAULT vSearch IS NOT NULL AND vSearch <> '';
-
- CREATE OR REPLACE TEMPORARY TABLE tNodes
- (UNIQUE (id))
- ENGINE = MEMORY
- SELECT id
- FROM zoneGeo
- LIMIT 0;
-
- IF vIsSearch THEN
- SET vIsNumber = vSearch REGEXP '^[0-9]+$';
-
- INSERT INTO tNodes
- SELECT id
- FROM zoneGeo
- WHERE (vIsNumber AND `name` = vSearch)
- OR (!vIsNumber AND `name` LIKE CONCAT('%', vSearch, '%'))
- LIMIT 1000;
-
- ELSEIF vParentFk IS NULL THEN
- INSERT INTO tNodes
- SELECT geoFk
- FROM zoneIncluded
- WHERE zoneFk = vSelf;
- END IF;
-
- IF vParentFk IS NULL THEN
- CREATE OR REPLACE TEMPORARY TABLE tChilds
- (INDEX(id))
- ENGINE = MEMORY
- SELECT id FROM tNodes;
-
- CREATE OR REPLACE TEMPORARY TABLE tParents
- (INDEX(id))
- ENGINE = MEMORY
- SELECT id FROM zoneGeo LIMIT 0;
-
- myLoop: LOOP
- DELETE FROM tParents;
- INSERT INTO tParents
- SELECT parentFk id
- FROM zoneGeo g
- JOIN tChilds c ON c.id = g.id
- WHERE g.parentFk IS NOT NULL;
-
- INSERT IGNORE INTO tNodes
- SELECT id FROM tParents;
-
- IF NOT ROW_COUNT() THEN
- LEAVE myLoop;
- END IF;
-
- DELETE FROM tChilds;
- INSERT INTO tChilds
- SELECT id FROM tParents;
- END LOOP;
-
- DROP TEMPORARY TABLE tChilds, tParents;
- END IF;
-
- IF NOT vIsSearch THEN
- INSERT IGNORE INTO tNodes
- SELECT id
- FROM zoneGeo
- WHERE parentFk <=> vParentFk;
- END IF;
-
- CREATE OR REPLACE TEMPORARY TABLE tZones
- SELECT g.id,
- g.name,
- g.parentFk,
- g.sons,
- NOT g.sons OR `type` = 'country' isChecked,
- i.isIncluded selected,
- g.`depth`,
- vSelf
- FROM zoneGeo g
- JOIN tNodes n ON n.id = g.id
- LEFT JOIN zoneIncluded i ON i.geoFk = g.id
- AND i.zoneFk = vSelf
- ORDER BY g.`depth`, selected DESC, g.name;
-
- IF vHasInsert THEN
- INSERT IGNORE INTO tmp.zoneNodes(geoFk, name, parentFk, sons, isChecked, zoneFk)
- SELECT id,
- name,
- parentFk,
- sons,
- isChecked,
- vSelf
- FROM tZones
- WHERE selected
- OR (selected IS NULL AND vParentFk IS NOT NULL);
- ELSE
- SELECT id,
- name,
- parentFk,
- sons,
- selected
- FROM tZones
- ORDER BY `depth`, selected DESC, name;
- END IF;
-
- DROP TEMPORARY TABLE tNodes, tZones;
+BEGIN
+/**
+ * Devuelve las ubicaciones incluidas en la ruta y que sean hijos de parentFk.
+ * @param vSelf Id de la zona
+ * @param vParentFk Id del geo a calcular
+ * @param vSearch Cadena a buscar
+ * @param vHasInsert Indica si inserta en tmp.zoneNodes
+ * Optional @table tmp.zoneNodes(geoFk, name, parentFk, sons, isChecked, zoneFk)
+ */
+ DECLARE vIsNumber BOOL;
+ DECLARE vIsSearch BOOL DEFAULT vSearch IS NOT NULL AND vSearch <> '';
+
+ CREATE OR REPLACE TEMPORARY TABLE tNodes
+ (UNIQUE (id))
+ ENGINE = MEMORY
+ SELECT id
+ FROM zoneGeo
+ LIMIT 0;
+
+ IF vIsSearch THEN
+ SET vIsNumber = vSearch REGEXP '^[0-9]+$';
+
+ INSERT INTO tNodes
+ SELECT id
+ FROM zoneGeo
+ WHERE (vIsNumber AND `name` = vSearch)
+ OR (!vIsNumber AND `name` LIKE CONCAT('%', vSearch, '%'))
+ LIMIT 1000;
+
+ ELSEIF vParentFk IS NULL THEN
+ INSERT INTO tNodes
+ SELECT geoFk
+ FROM zoneIncluded
+ WHERE zoneFk = vSelf;
+ END IF;
+
+ IF vParentFk IS NULL THEN
+ CREATE OR REPLACE TEMPORARY TABLE tChilds
+ (INDEX(id))
+ ENGINE = MEMORY
+ SELECT id FROM tNodes;
+
+ CREATE OR REPLACE TEMPORARY TABLE tParents
+ (INDEX(id))
+ ENGINE = MEMORY
+ SELECT id FROM zoneGeo LIMIT 0;
+
+ myLoop: LOOP
+ DELETE FROM tParents;
+ INSERT INTO tParents
+ SELECT parentFk id
+ FROM zoneGeo g
+ JOIN tChilds c ON c.id = g.id
+ WHERE g.parentFk IS NOT NULL;
+
+ INSERT IGNORE INTO tNodes
+ SELECT id FROM tParents;
+
+ IF NOT ROW_COUNT() THEN
+ LEAVE myLoop;
+ END IF;
+
+ DELETE FROM tChilds;
+ INSERT INTO tChilds
+ SELECT id FROM tParents;
+ END LOOP;
+
+ DROP TEMPORARY TABLE tChilds, tParents;
+ END IF;
+
+ IF NOT vIsSearch THEN
+ INSERT IGNORE INTO tNodes
+ SELECT id
+ FROM zoneGeo
+ WHERE parentFk <=> vParentFk;
+ END IF;
+
+ CREATE OR REPLACE TEMPORARY TABLE tZones
+ SELECT g.id,
+ g.name,
+ g.parentFk,
+ g.sons,
+ NOT g.sons OR `type` = 'country' isChecked,
+ i.isIncluded selected,
+ g.`depth`,
+ vSelf
+ FROM zoneGeo g
+ JOIN tNodes n ON n.id = g.id
+ LEFT JOIN zoneIncluded i ON i.geoFk = g.id
+ AND i.zoneFk = vSelf
+ ORDER BY g.`depth`, selected DESC, g.name;
+
+ IF vHasInsert THEN
+ INSERT IGNORE INTO tmp.zoneNodes(geoFk, name, parentFk, sons, isChecked, zoneFk)
+ SELECT id,
+ name,
+ parentFk,
+ sons,
+ isChecked,
+ vSelf
+ FROM tZones
+ WHERE selected
+ OR (selected IS NULL AND vParentFk IS NOT NULL);
+ ELSE
+ SELECT id,
+ name,
+ parentFk,
+ sons,
+ selected
+ FROM tZones
+ ORDER BY `depth`, selected DESC, name;
+ END IF;
+
+ DROP TEMPORARY TABLE tNodes, tZones;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -82281,48 +82281,48 @@ DELIMITER ;
/*!50003 SET collation_connection = utf8mb4_unicode_ci */ ;
DELIMITER ;;
CREATE DEFINER=`vn`@`localhost` PROCEDURE `zone_getPostalCode`(vSelf INT)
-BEGIN
-/**
- * Devuelve los códigos postales incluidos en una zona
- */
- DECLARE vGeoFk INT DEFAULT NULL;
-
- CREATE OR REPLACE TEMPORARY TABLE tmp.zoneNodes (
- geoFk INT,
- name VARCHAR(100),
- parentFk INT,
- sons INT,
- isChecked BOOL DEFAULT 0,
- zoneFk INT,
- PRIMARY KEY zoneNodesPk (zoneFk, geoFk),
- INDEX(geoFk))
- ENGINE = MEMORY;
-
- CALL zone_getLeaves(vSelf, NULL , NULL, TRUE);
-
- UPDATE tmp.zoneNodes
- SET isChecked = 0
- WHERE parentFk IS NULL;
-
- myLoop: LOOP
- SET vGeoFk = NULL;
- SELECT geoFk INTO vGeoFk
- FROM tmp.zoneNodes
- WHERE NOT isChecked
- LIMIT 1;
-
- CALL zone_getLeaves(vSelf, vGeoFk, NULL, TRUE);
- UPDATE tmp.zoneNodes
- SET isChecked = TRUE
- WHERE geoFk = vGeoFk;
-
- IF vGeoFk IS NULL THEN
- LEAVE myLoop;
- END IF;
- END LOOP;
-
- DELETE FROM tmp.zoneNodes
- WHERE sons > 0;
+BEGIN
+/**
+ * Devuelve los códigos postales incluidos en una zona
+ */
+ DECLARE vGeoFk INT DEFAULT NULL;
+
+ CREATE OR REPLACE TEMPORARY TABLE tmp.zoneNodes (
+ geoFk INT,
+ name VARCHAR(100),
+ parentFk INT,
+ sons INT,
+ isChecked BOOL DEFAULT 0,
+ zoneFk INT,
+ PRIMARY KEY zoneNodesPk (zoneFk, geoFk),
+ INDEX(geoFk))
+ ENGINE = MEMORY;
+
+ CALL zone_getLeaves(vSelf, NULL , NULL, TRUE);
+
+ UPDATE tmp.zoneNodes
+ SET isChecked = 0
+ WHERE parentFk IS NULL;
+
+ myLoop: LOOP
+ SET vGeoFk = NULL;
+ SELECT geoFk INTO vGeoFk
+ FROM tmp.zoneNodes
+ WHERE NOT isChecked
+ LIMIT 1;
+
+ CALL zone_getLeaves(vSelf, vGeoFk, NULL, TRUE);
+ UPDATE tmp.zoneNodes
+ SET isChecked = TRUE
+ WHERE geoFk = vGeoFk;
+
+ IF vGeoFk IS NULL THEN
+ LEAVE myLoop;
+ END IF;
+ END LOOP;
+
+ DELETE FROM tmp.zoneNodes
+ WHERE sons > 0;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql
index 68d8be097..48e886ac9 100644
--- a/db/dump/fixtures.before.sql
+++ b/db/dump/fixtures.before.sql
@@ -1254,9 +1254,9 @@ INSERT INTO `vn`.`saleComponent`(`saleFk`, `componentFk`, `value`)
INSERT INTO `vn`.`itemShelving` (`itemFk`, `shelvingFk`, `visible`, `grouping`, `packing`,`buyFk`, `userFk`)
VALUES
- (2, 'GVC', 1, 1, 1, 2,1106),
- (4, 'HEJ', 1, 1, 1, NULL,1106),
- (1, 'UXN', 2, 12, 12, NULL,1106);
+ (2, 11, 1, 1, 1, 2,1106),
+ (4, 12, 1, 1, 1, NULL,1106),
+ (1, 13, 2, 12, 12, NULL,1106);
INSERT INTO `vn`.`itemShelvingSale` (`itemShelvingFk`, `saleFk`, `quantity`, `created`, `userFk`)
VALUES
@@ -3425,7 +3425,7 @@ INSERT INTO vn.buy
INSERT INTO vn.itemShelving
SET id = 9931,
itemFk = 999993,
- shelvingFk = 'NCC',
+ shelvingFk = 16,
visible = 10,
`grouping` = 5,
packing = 10;
@@ -3752,7 +3752,7 @@ INSERT vn.sale
USE vn;
DELETE ish.* FROM vn.itemShelving ish
- JOIN vn.shelving sh ON sh.code = ish.shelvingFk
+ JOIN vn.shelving sh ON sh.id = ish.shelvingFk
JOIN vn.parking p ON p.id = sh.parkingFk
JOIN vn.sector s ON s.id = p.sectorFk
JOIN vn.warehouse w ON w.id = s.warehouseFk
@@ -3761,22 +3761,22 @@ DELETE ish.* FROM vn.itemShelving ish
INSERT INTO vn.itemShelving
(itemFk, shelvingFk, visible, created, `grouping`, packing, packagingFk, userFk, isChecked)
VALUES
- (999991, 'NAA', 8, '2023-09-20', 1, 20, NULL, 103, NULL),
- (999998, 'NAA', 80, '2023-09-20', 10, 30, NULL, 103, NULL),
- (1000001, 'NAA', 6, '2023-09-20', 3, 50, NULL, 103, NULL),
- (1000000, 'NBB', 50, '2023-09-18', 25, 500, NULL, 103, NULL),
- (999993, 'NBB', 25, '2023-09-18', NULL, 10, NULL, 103, NULL),
- (999999, 'NBB', 30, '2023-09-18', 10, 500, NULL, 103, NULL),
- (999993, 'NCC', 25, '2023-09-20', 5, 10, NULL, 103, NULL),
- (999997, 'NCC', 10, '2023-09-20', NULL, 100, NULL, 103, NULL),
- (999999, 'NCC', 40, '2023-09-20', 10, 500, NULL, 103, NULL),
- (999995, 'NDD', 10, '2023-09-19', NULL, 20, NULL, 103, NULL),
- (999994, 'NDD', 48, '2023-09-19', 4, 20, NULL, 103, NULL),
- (1000001, 'NEE', 6, '2023-09-21', 3, 50, NULL, 103, NULL),
- (999992, 'NEE', 50, '2023-09-21', NULL, 1, NULL, 103, NULL),
- (1000000, 'NEE', 25, '2023-09-21', 25, 500, NULL, 103, NULL),
- (999996, 'PAA', 5, '2023-09-27', 1, 5, NULL, 103, NULL),
- (999997, 'PCC', 10, '2023-09-27', 5, 100, NULL, 103, NULL);
+ (999991, 14, 8, '2023-09-20', 1, 20, NULL, 103, NULL),
+ (999998, 14, 80, '2023-09-20', 10, 30, NULL, 103, NULL),
+ (1000001, 14, 6, '2023-09-20', 3, 50, NULL, 103, NULL),
+ (1000000, 15, 50, '2023-09-18', 25, 500, NULL, 103, NULL),
+ (999993, 15, 25, '2023-09-18', NULL, 10, NULL, 103, NULL),
+ (999999, 15, 30, '2023-09-18', 10, 500, NULL, 103, NULL),
+ (999993, 16, 25, '2023-09-20', 5, 10, NULL, 103, NULL),
+ (999997, 16, 10, '2023-09-20', NULL, 100, NULL, 103, NULL),
+ (999999, 16, 40, '2023-09-20', 10, 500, NULL, 103, NULL),
+ (999995, 17, 10, '2023-09-19', NULL, 20, NULL, 103, NULL),
+ (999994, 17, 48, '2023-09-19', 4, 20, NULL, 103, NULL),
+ (1000001, 18, 6, '2023-09-21', 3, 50, NULL, 103, NULL),
+ (999992, 18, 50, '2023-09-21', NULL, 1, NULL, 103, NULL),
+ (1000000, 18, 25, '2023-09-21', 25, 500, NULL, 103, NULL),
+ (999996, 19, 5, '2023-09-27', 1, 5, NULL, 103, NULL),
+ (999997, 21, 10, '2023-09-27', 5, 100, NULL, 103, NULL);
-- Previous for Bolas de madera
INSERT IGNORE INTO vn.sectorCollection
@@ -4008,6 +4008,10 @@ INSERT IGNORE INTO pbx.queueMember
UPDATE vn.department SET pbxQueue = '1000' WHERE name = "CAMARA";
UPDATE vn.department SET pbxQueue = '2000' WHERE name = "VENTAS";
+INSERT INTO vn.routeAction (id, name, price, isMainlineDelivered) VALUES(1, 'Pintar traje', 50.00, 0);
+INSERT INTO vn.routeComplement (id, dated, workerFk, price, routeActionFk) VALUES(1, util.VN_CURDATE(), 9, 50.00, 1);
+
+
INSERT INTO srt.buffer (id, x, y, `size`, `length`, stateFk, typeFk, isActive, code, stratus, hasWorkerWaiting, reserve, routeFk, dayMinute, lastUnloaded, hasStrapper, typeDefaultFk, motors, editorFk)
VALUES (0, 0, 0, 0, NULL, 3, 1, 0, 'ENT', 0, 0, NULL, NULL, NULL, NULL, 0, 1, 1, NULL),
(1, 0, 9900, 0, NULL, 1, 0, 0, 'NOK', 0, 0, NULL, NULL, NULL, NULL, 0, 1, 1, NULL),
@@ -4023,9 +4027,8 @@ INSERT INTO srt.buffer (id, x, y, `size`, `length`, stateFk, typeFk, isActive, c
INSERT IGNORE INTO vn.saySimpleCountry (countryFk, channel)
- VALUES (19, 1169),
- (8, 1183),
- (NULL, 1320);
+ VALUES (19, '1169'),
+ (8, '1183');
-INSERT IGNORE INTO vn.saySimpleConfig (url)
- VALUES ('saysimle-url-mock');
\ No newline at end of file
+INSERT IGNORE INTO vn.saySimpleConfig (url, defaultChannel)
+ VALUES ('saysimle-url-mock', 1320);
\ No newline at end of file
diff --git a/db/routines/account/views/myUser.sql b/db/routines/account/views/myUser.sql
index f520d893b..8d927dc0f 100644
--- a/db/routines/account/views/myUser.sql
+++ b/db/routines/account/views/myUser.sql
@@ -7,8 +7,7 @@ AS SELECT `u`.`id` AS `id`,
`u`.`email` AS `email`,
`u`.`nickname` AS `nickname`,
`u`.`lang` AS `lang`,
- `u`.`role` AS `role`,
- `u`.`recoverPass` AS `recoverPass`
+ `u`.`role` AS `role`
FROM `account`.`user` `u`
WHERE `u`.`name` = `myUser_getName`()
WITH CASCADED CHECK OPTION
diff --git a/db/routines/bs/procedures/inventoryDiscrepancyDetail_replace.sql b/db/routines/bs/procedures/inventoryDiscrepancyDetail_replace.sql
index 863005373..b698f0e3e 100644
--- a/db/routines/bs/procedures/inventoryDiscrepancyDetail_replace.sql
+++ b/db/routines/bs/procedures/inventoryDiscrepancyDetail_replace.sql
@@ -32,7 +32,7 @@ BEGIN
CREATE OR REPLACE TEMPORARY TABLE tVisible
SELECT itemFk, SUM(visible) totalVisible
FROM vn.itemShelving ish
- JOIN vn.shelving sh ON sh.code = ish.shelvingFk
+ JOIN vn.shelving sh ON sh.id = ish.shelvingFk
JOIN vn.parking p ON p.id = sh.parkingFk
JOIN vn.sector sc ON sc.id = p.sectorFk
WHERE sc.warehouseFk = vWarehouseFk
diff --git a/db/routines/vn/functions/address_getGeo.sql b/db/routines/vn/functions/address_getGeo.sql
index 04155c30c..213eb91c3 100644
--- a/db/routines/vn/functions/address_getGeo.sql
+++ b/db/routines/vn/functions/address_getGeo.sql
@@ -14,9 +14,12 @@ BEGIN
SELECT p.geoFk INTO vGeoFk
FROM address a
JOIN town t ON t.provinceFk = a.provinceFk
- JOIN postCode p ON p.townFk = t.id AND p.`code` = a.postalCode
+ JOIN postCode p ON p.townFk = t.id
+ AND (p.code = a.postalCode OR a.postalCode IS NULL)
+ JOIN zoneGeo zg ON zg.id = p.geoFk
WHERE a.id = vSelf
- ORDER BY (a.city SOUNDS LIKE t.`name`) DESC
+ ORDER BY (a.city SOUNDS LIKE t.name) DESC,
+ (p.code = a.postalCode) DESC
LIMIT 1;
RETURN vGeoFk;
diff --git a/db/routines/vn/functions/client_getGeo.sql b/db/routines/vn/functions/client_getGeo.sql
new file mode 100644
index 000000000..9c2e3212e
--- /dev/null
+++ b/db/routines/vn/functions/client_getGeo.sql
@@ -0,0 +1,27 @@
+DELIMITER $$
+CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`client_getGeo`(vSelf INT)
+ RETURNS int(11)
+ DETERMINISTIC
+BEGIN
+/**
+ * Returns the geo for the passed client.
+ *
+ * @param vSelf The address id
+ * @return The geo id
+ */
+ DECLARE vGeoFk INT;
+
+ SELECT p.geoFk INTO vGeoFk
+ FROM client c
+ JOIN town t ON t.provinceFk = c.provinceFk
+ JOIN postCode p ON p.townFk = t.id
+ AND (p.code = c.postcode OR c.postcode IS NULL)
+ JOIN zoneGeo zg ON zg.id = p.geoFk
+ WHERE c.id = vSelf
+ ORDER BY (c.city SOUNDS LIKE t.name) DESC,
+ (p.code = c.postcode) DESC
+ LIMIT 1;
+
+ RETURN vGeoFk;
+END$$
+DELIMITER ;
diff --git a/db/routines/vn/functions/entry_getCommission.sql b/db/routines/vn/functions/entry_getCommission.sql
index 4a19f4e63..a4afdabd4 100644
--- a/db/routines/vn/functions/entry_getCommission.sql
+++ b/db/routines/vn/functions/entry_getCommission.sql
@@ -1,58 +1,51 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`entry_getCommission`(vTravelFk INT,
- vCurrencyFk INT,
- vSupplierFk INT
+ vCurrencyFk INT,
+ vSupplierFk INT
)
RETURNS int(11)
NOT DETERMINISTIC
READS SQL DATA
BEGIN
- DECLARE vCommission INT;
- DECLARE vCurrentCommission INT;
- DECLARE vIsCurrencyUsd INT;
- DECLARE vLastEntryFk INT;
-
- SELECT count(*) INTO vIsCurrencyUsd
- FROM currency c
- WHERE c.code = 'USD' AND id = vCurrencyFk;
-
- IF NOT vIsCurrencyUsd THEN
-
- SELECT e.id INTO vLastEntryFk
- FROM vn.entry e
- JOIN vn.travel tr ON tr.id = e.travelFk
- WHERE e.supplierFk = vSupplierFk
- ORDER BY tr.landed DESC
- LIMIT 1;
-
- IF vLastEntryFk THEN
-
- SELECT commission INTO vCurrentCommission
- FROM vn.entry
- WHERE id = vLastEntryFk;
-
- ELSE
-
- SELECT commission INTO vCurrentCommission
- FROM supplier s
- WHERE s.id = vSupplierFk;
-
- END IF;
-
- RETURN vCurrentCommission;
-
- ELSE
+ DECLARE vCommission INT;
+ DECLARE vCurrentCommission INT;
+ DECLARE vIsNotEUR INT;
+ DECLARE vLastEntryFk INT;
+ SELECT count(*) INTO vIsNotEUR
+ FROM currency c
+ WHERE c.code <> 'EUR' AND id = vCurrencyFk;
+
+ IF vIsNotEUR THEN
SELECT ROUND(-100 * (1 - (1 / r.value))) INTO vCommission
FROM travel t
LEFT JOIN referenceCurrent r ON r.currencyFk = vCurrencyFk AND r.`dated` <= t.shipped
WHERE t.id = vTravelFk
ORDER BY r.`dated` DESC
LIMIT 1;
-
+
RETURN IFNULL(vCommission, 0);
-
- END IF;
-
+ ELSE
+ SELECT e.id INTO vLastEntryFk
+ FROM `entry` e
+ JOIN travel tr ON tr.id = e.travelFk
+ WHERE e.supplierFk = vSupplierFk
+ ORDER BY tr.landed DESC
+ LIMIT 1;
+
+ IF vLastEntryFk THEN
+ SELECT commission INTO vCurrentCommission
+ FROM `entry`
+ WHERE id = vLastEntryFk;
+
+ ELSE
+ SELECT commission INTO vCurrentCommission
+ FROM supplier s
+ WHERE s.id = vSupplierFk;
+
+ END IF;
+
+ RETURN vCurrentCommission;
+ END IF;
END$$
DELIMITER ;
diff --git a/db/routines/vn/functions/hasItemsInSector.sql b/db/routines/vn/functions/hasItemsInSector.sql
index 7a5c4cf60..faf9e8a90 100644
--- a/db/routines/vn/functions/hasItemsInSector.sql
+++ b/db/routines/vn/functions/hasItemsInSector.sql
@@ -9,7 +9,7 @@ BEGIN
SELECT count(*) INTO vItemCount
FROM vn.sale s
JOIN vn.itemShelving ish ON ish.itemFk = s.itemFk
- JOIN vn.shelving sh ON sh.code = ish.shelvingFk
+ JOIN vn.shelving sh ON sh.id = ish.shelvingFk
JOIN vn.parking p ON p.id = sh.parkingFk
WHERE s.ticketFk = vTicketFk
AND p.sectorFk = vSectorFk;
diff --git a/db/routines/vn/functions/itemsInSector_get.sql b/db/routines/vn/functions/itemsInSector_get.sql
index 254ebe1b5..9043e55cb 100644
--- a/db/routines/vn/functions/itemsInSector_get.sql
+++ b/db/routines/vn/functions/itemsInSector_get.sql
@@ -10,7 +10,7 @@ BEGIN
SELECT count(*) INTO vItemCount
FROM vn.sale s
JOIN vn.itemShelving ish ON ish.itemFk = s.itemFk
- JOIN vn.shelving sh ON sh.code = ish.shelvingFk
+ JOIN vn.shelving sh ON sh.id = ish.shelvingFk
JOIN vn.parking p ON p.id = sh.parkingFk
WHERE s.ticketFk = vTicketFk
AND p.sectorFk = vSectorFk;
diff --git a/db/routines/vn/functions/supplier_getGeo.sql b/db/routines/vn/functions/supplier_getGeo.sql
new file mode 100644
index 000000000..86984272c
--- /dev/null
+++ b/db/routines/vn/functions/supplier_getGeo.sql
@@ -0,0 +1,29 @@
+DELIMITER $$
+CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`supplier_getGeo`(vSelf INT)
+ RETURNS int(11)
+ DETERMINISTIC
+BEGIN
+/**
+ * Returns the geo for the passed supplier.
+ *
+ * @param vSelf The address id
+ * @return The geo id
+ */
+ DECLARE vGeoFk INT;
+
+ SELECT p.geoFk INTO vGeoFk
+ FROM supplier s
+ JOIN town t ON t.provinceFk = s.provinceFk
+ JOIN postCode p ON p.townFk = t.id
+ AND (p.code = s.postCode OR s.postCode IS NULL)
+ LEFT JOIN supplierAddress sad ON sad.supplierFk = s.id
+ JOIN zoneGeo zg ON zg.id = p.geoFk
+ WHERE s.id = vSelf
+ ORDER BY (s.city SOUNDS LIKE t.name) DESC,
+ (p.code = s.postCode) DESC,
+ (p.code = sad.postalCode) DESC
+ LIMIT 1;
+
+ RETURN vGeoFk;
+END$$
+DELIMITER ;
diff --git a/db/routines/vn/procedures/collectionPlacement_get.sql b/db/routines/vn/procedures/collectionPlacement_get.sql
index 239dbd3a2..8d2301e1e 100644
--- a/db/routines/vn/procedures/collectionPlacement_get.sql
+++ b/db/routines/vn/procedures/collectionPlacement_get.sql
@@ -83,7 +83,7 @@ BEGIN
AND s.semaphore = 1
GROUP BY st.saleFk) st ON st.saleFk = ts.saleFk
JOIN itemShelving ish ON ish.itemFk = ts.itemFk
- JOIN shelving sh ON sh.code = ish.shelvingFk
+ JOIN shelving sh ON sh.id = ish.shelvingFk
JOIN parking p ON p.id = sh.parkingFk
JOIN sector sc ON sc.id = p.sectorFk
JOIN sectorType st ON st.id = sc.typeFk
diff --git a/db/routines/vn/procedures/entry_splitByShelving.sql b/db/routines/vn/procedures/entry_splitByShelving.sql
index fbf0cef90..3201900e6 100644
--- a/db/routines/vn/procedures/entry_splitByShelving.sql
+++ b/db/routines/vn/procedures/entry_splitByShelving.sql
@@ -1,10 +1,15 @@
DELIMITER $$
-CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`entry_splitByShelving`(vShelvingFk VARCHAR(3), vFromEntryFk INT, vToEntryFk INT)
+CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`entry_splitByShelving`(
+ vShelvingCode VARCHAR(10),
+ vFromEntryFk INT,
+ vToEntryFk INT
+)
BEGIN
/**
- * Divide las compras entre dos entradas de acuerdo con lo ubicado en una matr�cula
+ * Divide las compras entre dos entradas de
+ * acuerdo con lo ubicado en una matricula.
*
- * @param vShelvingFk Identificador de vn.shelving
+ * @param vShelvingCode Código de vn.shelving
* @param vFromEntryFk Entrada origen
* @param vToEntryFk Entrada destino
*/
@@ -14,7 +19,7 @@ BEGIN
DECLARE vDone BOOLEAN DEFAULT FALSE;
DECLARE cur CURSOR FOR
- SELECT bb.id buyFk,
+ SELECT bb.id buyFk,
LEAST(bb.stickers, FLOOR(ish.visible / ish.packing)) ishStickers,
bb.stickers buyStickers
FROM itemShelving ish
@@ -23,7 +28,7 @@ BEGIN
WHERE b.entryFk = vFromEntryFk
ORDER BY b.stickers DESC
LIMIT 10000000000000000000) bb ON bb.itemFk = ish.itemFk
- WHERE ish.shelvingFk = vShelvingFk COLLATE utf8_general_ci
+ WHERE ish.shelvingFk = vShelvingCode COLLATE utf8_general_ci
AND NOT ish.isSplit
GROUP BY ish.id;
@@ -107,9 +112,10 @@ BEGIN
UPDATE buy SET printedStickers = vIshStickers WHERE id = LAST_INSERT_ID();
END IF;
- UPDATE itemShelving
- SET isSplit = TRUE
- WHERE shelvingFk = vShelvingFk COLLATE utf8_general_ci;
+ UPDATE itemShelving ish
+ JOIN shelving sh ON sh.id = ish.shelvingFk
+ SET ish.isSplit = TRUE
+ WHERE sh.code = vShelvingCode COLLATE utf8_general_ci;
END LOOP;
CLOSE cur;
END$$
diff --git a/db/routines/vn/procedures/entry_updateComission.sql b/db/routines/vn/procedures/entry_updateComission.sql
index e2de2a4a5..8db28f97d 100644
--- a/db/routines/vn/procedures/entry_updateComission.sql
+++ b/db/routines/vn/procedures/entry_updateComission.sql
@@ -22,7 +22,7 @@ BEGIN
FROM vn.entry e
JOIN vn.travel t ON t.id = e.travelFk
JOIN vn.warehouse w ON w.id = t.warehouseInFk
- WHERE t.shipped >= util.VN_CURDATE()
+ WHERE t.landed >= util.VN_CURDATE()
AND e.currencyFk = vCurrency
AND NOT e.isBooked;
@@ -33,7 +33,7 @@ BEGIN
SET e.commission = vComission;
SELECT `name` INTO vCurrencyName
- FROM currency
+ FROM currency
WHERE id = vCurrency;
CALL entry_recalc();
diff --git a/db/routines/vn/procedures/itemPlacementSupplyAiming.sql b/db/routines/vn/procedures/itemPlacementSupplyAiming.sql
index b96860623..ae0890564 100644
--- a/db/routines/vn/procedures/itemPlacementSupplyAiming.sql
+++ b/db/routines/vn/procedures/itemPlacementSupplyAiming.sql
@@ -1,5 +1,9 @@
DELIMITER $$
-CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemPlacementSupplyAiming`(vShelvingFk VARCHAR(10), quantity INT, vItemFk INT)
+CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemPlacementSupplyAiming`(
+ vShelvingCode VARCHAR(10),
+ vQuantity INT,
+ vItemFk INT
+)
BEGIN
SELECT ish.itemFk,
@@ -9,21 +13,21 @@ BEGIN
ish.itemShelvingFk,
ish.shelving,
ish.stock,
- LEAST(ish.stock,quantity) as total,
+ LEAST(ish.stock,vQuantity) total,
CONCAT(
- CAST(FLOOR(LEAST(ish.stock,quantity) / ish.packing) AS DECIMAL(10,0)),
+ CAST(FLOOR(LEAST(ish.stock, vQuantity) / ish.packing) AS DECIMAL(10,0)),
' x ',
ish.packing,
IF (
- LEAST(ish.stock,quantity) MOD ish.packing,
- CONCAT(' + ',CAST(LEAST(ish.stock,quantity) MOD ish.packing AS DECIMAL(10,0))),
+ LEAST(ish.stock, vQuantity) MOD ish.packing,
+ CONCAT(' + ',CAST(LEAST(ish.stock, vQuantity) MOD ish.packing AS DECIMAL(10,0))),
''
),
' = ',
- LEAST(ish.stock,quantity)
- ) as proposal
- FROM vn.itemShelvingPlacementSupplyStock ish
- WHERE ish.shelving = vShelvingFk COLLATE utf8_general_ci
+ LEAST(ish.stock, vQuantity)
+ ) proposal
+ FROM itemShelvingPlacementSupplyStock ish
+ WHERE ish.shelving = vShelvingCode COLLATE utf8_general_ci
AND ish.itemFk = vItemFk;
END$$
diff --git a/db/routines/vn/procedures/itemPlacementSupplyGetOrder.sql b/db/routines/vn/procedures/itemPlacementSupplyGetOrder.sql
index 958dc7e78..d2648ca6c 100644
--- a/db/routines/vn/procedures/itemPlacementSupplyGetOrder.sql
+++ b/db/routines/vn/procedures/itemPlacementSupplyGetOrder.sql
@@ -1,5 +1,7 @@
DELIMITER $$
-CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemPlacementSupplyGetOrder`(vSector INT )
+CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemPlacementSupplyGetOrder`(
+ vSectorFk INT
+)
BEGIN
DECLARE vId INT;
@@ -7,31 +9,35 @@ BEGIN
DECLARE vNextParkingFk INT;
SELECT sh.parkingFk INTO vLastParkingFk
- FROM vn.itemShelvingPlacementSupply isps
- JOIN vn.itemShelving ish ON ish.id = isps.itemShelvingFk
- JOIN vn.shelving sh ON sh.code = ish.shelvingFk
+ FROM itemShelvingPlacementSupply isps
+ JOIN itemShelving ish ON ish.id = isps.itemShelvingFk
+ JOIN shelving sh ON sh.id = ish.shelvingFk
WHERE isps.userFk = getUser()
ORDER BY isps.created DESC
LIMIT 1;
- SET vNextParkingFk = vn.itemShelvingPlacementSupply_ClosestGet(vLastParkingFk);
+ SET vNextParkingFk = itemShelvingPlacementSupply_ClosestGet(vLastParkingFk);
SELECT ipsl.id INTO vId
- FROM vn.itemPlacementSupplyList ipsl
- JOIN vn.itemShelvingPlacementSupplyStock ispss ON ispss.itemFk = ipsl.itemFk
+ FROM itemPlacementSupplyList ipsl
+ JOIN itemShelvingPlacementSupplyStock ispss ON ispss.itemFk = ipsl.itemFk
WHERE ipsl.saldo > 0
AND (ipsl.repoUserFk is NULL OR ipsl.repoUserFk = getUser())
- AND ipsl.sectorFk = vSector
- ORDER BY ipsl.repoUserFk DESC, ipsl.priority DESC, (ispss.parkingFk = vNextParkingFk) DESC, ispss.parking DESC, ipsl.created
+ AND ipsl.sectorFk = vSectorFk
+ ORDER BY ipsl.repoUserFk DESC,
+ ipsl.priority DESC,
+ (ispss.parkingFk = vNextParkingFk) DESC,
+ ispss.parking DESC,
+ ipsl.created
LIMIT 1;
- UPDATE vn.itemPlacementSupply
+ UPDATE itemPlacementSupply
SET repoUserFk = getUser()
WHERE id = vId;
- SELECT * FROM vn.itemPlacementSupplyList
+ SELECT * FROM itemPlacementSupplyList
WHERE id = vId
- AND sectorFk = vSector;
+ AND sectorFk = vSectorFk;
END$$
DELIMITER ;
diff --git a/db/routines/vn/procedures/itemPlacementSupplyStockGetTargetList.sql b/db/routines/vn/procedures/itemPlacementSupplyStockGetTargetList.sql
index cefa64d13..92c17b82f 100644
--- a/db/routines/vn/procedures/itemPlacementSupplyStockGetTargetList.sql
+++ b/db/routines/vn/procedures/itemPlacementSupplyStockGetTargetList.sql
@@ -1,5 +1,8 @@
DELIMITER $$
-CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemPlacementSupplyStockGetTargetList`(vItemFk INT,vSectorFk INT)
+CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemPlacementSupplyStockGetTargetList`(
+ vItemFk INT,
+ vSectorFk INT
+)
BEGIN
/**
* Devuelve la lista de ubicaciones para itemFk en ese sector. Se utiliza en la preparación previa.
@@ -13,11 +16,11 @@ BEGIN
SUM(ish.visible) stockTotal,
ish.created,
p.pickingOrder
- FROM vn.itemShelving ish
- JOIN vn.shelving sh ON sh.code = ish.shelvingFk
- JOIN vn.parking p ON p.id = sh.parkingFk
- JOIN vn.sector sc ON sc.id = p.sectorFk
- JOIN vn.warehouse w ON w.id = sc.warehouseFk
+ FROM itemShelving ish
+ JOIN shelving sh ON sh.id = ish.shelvingFk
+ JOIN parking p ON p.id = sh.parkingFk
+ JOIN sector sc ON sc.id = p.sectorFk
+ JOIN warehouse w ON w.id = sc.warehouseFk
WHERE ish.visible > 0
AND ish.itemFk = vItemFk
GROUP BY ish.id
diff --git a/db/routines/vn/procedures/itemShelvingLog_get.sql b/db/routines/vn/procedures/itemShelvingLog_get.sql
index 52e7a273f..5a943e867 100644
--- a/db/routines/vn/procedures/itemShelvingLog_get.sql
+++ b/db/routines/vn/procedures/itemShelvingLog_get.sql
@@ -1,14 +1,14 @@
DELIMITER $$
-CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelvingLog_get`(vShelvingFk VARCHAR(10) )
+CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelvingLog_get`(
+ vShelvingCode VARCHAR(10)
+)
BEGIN
-
/**
* Devuelve el log de los item en cada carro
*
- * @param vShelvingFk Matrícula del carro
+ * @param vShelvingCode Matrícula del carro
*
*/
-
SELECT isl.itemShelvingFk,
isl.created,
isl.accion,
@@ -28,8 +28,9 @@ BEGIN
FROM item
JOIN itemShelvingLog isl ON item.id = isl.itemFk
JOIN worker ON isl.workerFk = worker.id
- WHERE shelvingFk = vShelvingFk OR isl.itemFk = vShelvingFk
- ORDER BY isl.created DESC;
-
+ JOIN shelving sh ON sh.id = isl.shelvingFk
+ WHERE sh.code = vShelvingCode COLLATE utf8mb3_unicode_ci
+ OR isl.itemFk = vShelvingCode -- ?? Respeto porque ya estaba
+ ORDER BY isl.created DESC;
END$$
DELIMITER ;
diff --git a/db/routines/vn/procedures/itemShelvingMatch.sql b/db/routines/vn/procedures/itemShelvingMatch.sql
index 850c7907b..4ffa66fcb 100644
--- a/db/routines/vn/procedures/itemShelvingMatch.sql
+++ b/db/routines/vn/procedures/itemShelvingMatch.sql
@@ -20,7 +20,7 @@ BEGIN
LEFT JOIN (
SELECT itemFk, sum(cast(visible / packing AS DECIMAL(10,0))) AS etiquetas
FROM itemShelving ish
- JOIN shelving sh ON sh.code = ish.shelvingFk
+ JOIN shelving sh ON sh.id = ish.shelvingFk
LEFT JOIN parking pk ON pk.id = sh.parkingFk
WHERE ish.created BETWEEN vFromTimed AND vToTimed
GROUP BY itemFk
diff --git a/db/routines/vn/procedures/itemShelvingSale_addBySale.sql b/db/routines/vn/procedures/itemShelvingSale_addBySale.sql
index 06736732a..eeec60248 100644
--- a/db/routines/vn/procedures/itemShelvingSale_addBySale.sql
+++ b/db/routines/vn/procedures/itemShelvingSale_addBySale.sql
@@ -27,7 +27,7 @@ proc: BEGIN
ish.available
FROM sale s
JOIN itemShelving ish ON ish.itemFk = s.itemFk
- JOIN shelving sh ON sh.code = ish.shelvingFk
+ JOIN shelving sh ON sh.id = ish.shelvingFk
JOIN parking p ON p.id = sh.parkingFk
JOIN sector sc ON sc.id = p.sectorFk
JOIN productionConfig pc
@@ -61,7 +61,7 @@ proc: BEGIN
FROM sale s
LEFT JOIN itemShelvingSale iss ON iss.saleFk = s.id
LEFT JOIN itemShelving ish ON ish.id = iss.itemShelvingFk
- LEFT JOIN shelving sh ON sh.code = ish.shelvingFk
+ LEFT JOIN shelving sh ON sh.id = ish.shelvingFk
LEFT JOIN parking p ON p.id = sh.parkingFk
WHERE s.id = vSaleFk;
diff --git a/db/routines/vn/procedures/itemShelvingSale_setQuantity.sql b/db/routines/vn/procedures/itemShelvingSale_setQuantity.sql
index cde1b6872..f141762b5 100644
--- a/db/routines/vn/procedures/itemShelvingSale_setQuantity.sql
+++ b/db/routines/vn/procedures/itemShelvingSale_setQuantity.sql
@@ -3,7 +3,8 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelvingSale_setQ
vItemShelvingSaleFk INT(10),
vQuantity DECIMAL(10,0),
vIsItemShelvingSaleEmpty BOOLEAN,
- vSectorFk INT
+ vSectorFk INT,
+ vShelvingFk VARCHAR(10)
)
BEGIN
/**
@@ -24,6 +25,7 @@ BEGIN
DECLARE vItemFk INT;
DECLARE vTotalQuantity INT;
DECLARE vStateCode VARCHAR(45);
+ DECLARE vCurrentShelvingFk VARCHAR(10);
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
@@ -45,18 +47,25 @@ BEGIN
iss.saleFk,
iss.itemShelvingFk,
SUM(IFNULL(iss.quantity,0)),
- IF(sgd.id, 'PREVIOUS_PREPARATION', 'PREPARED')
+ IF(sgd.id, 'PREVIOUS_PREPARATION', 'PREPARED'),
+ ish.shelvingFk
INTO vItemFk,
vSaleFk,
vItemShelvingFk,
vReservedQuantity,
- vStateCode
+ vStateCode,
+ vCurrentShelvingFk
FROM itemShelvingSale iss
JOIN sale s ON s.id = iss.saleFk
+ JOIN itemShelving ish ON ish.id = iss.itemShelvingFk
LEFT JOIN vn.saleGroupDetail sgd ON sgd.saleFk = iss.saleFk
WHERE iss.id = vItemShelvingSaleFk
AND NOT iss.isPicked;
+ IF NOT (vCurrentShelvingFk <=> vShelvingFk) THEN
+ CALL util.throw('The shelving can not be different from the shelving reserved');
+ END IF;
+
IF vQuantity > vReservedQuantity
OR (vQuantity < vReservedQuantity AND NOT vIsItemShelvingSaleEmpty)
OR (vQuantity = vReservedQuantity AND vIsItemShelvingSaleEmpty) THEN
diff --git a/db/routines/vn/procedures/itemShelving_add.sql b/db/routines/vn/procedures/itemShelving_add.sql
index 92d1609e4..a8f0b5250 100644
--- a/db/routines/vn/procedures/itemShelving_add.sql
+++ b/db/routines/vn/procedures/itemShelving_add.sql
@@ -1,6 +1,6 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_add`(
- vShelvingFk VARCHAR(8),
+ vShelvingCode VARCHAR(10),
vBarcode VARCHAR(22),
vQuantity INT,
vPackagingFk VARCHAR(10),
@@ -12,7 +12,7 @@ BEGIN
/**
* Añade registro o lo actualiza si ya existe.
*
- * @param vShelvingFk matrícula del carro
+ * @param vShelvingCode matrícula del carro
* @param vBarcode el id del registro
* @param vQuantity indica la cantidad del producto
* @param vPackagingFk el packaging del producto en itemShelving, NULL para coger el de la ultima compra
@@ -23,10 +23,15 @@ BEGIN
**/
DECLARE vItemFk INT;
DECLARE vBuyFk INT;
+ DECLARE vShelvingFk INT;
SELECT id INTO vBuyFk
FROM buy WHERE id = vBarcode;
+ SELECT id INTO vShelvingFk
+ FROM shelving
+ WHERE code COLLATE utf8_unicode_ci = vShelvingCode;
+
SELECT barcodeToItem(vBarcode) INTO vItemFk;
IF vBuyFk IS NULL THEN
@@ -40,7 +45,7 @@ BEGIN
END IF;
IF (SELECT COUNT(*) FROM itemShelving
- WHERE shelvingFk COLLATE utf8_unicode_ci = vShelvingFk
+ WHERE shelvingFk = vShelvingFk
AND itemFk = vItemFk
AND packing = vPacking
AND buyFk = vBuyFk) THEN
@@ -48,7 +53,9 @@ BEGIN
UPDATE itemShelving
SET visible = visible + vQuantity,
available = available + vQuantity
- WHERE shelvingFk COLLATE utf8_unicode_ci = vShelvingFk AND itemFk = vItemFk AND packing = vPacking;
+ WHERE shelvingFk = vShelvingFk
+ AND itemFk = vItemFk
+ AND packing = vPacking;
ELSE
diff --git a/db/routines/vn/procedures/itemShelving_addByClaim.sql b/db/routines/vn/procedures/itemShelving_addByClaim.sql
index 5e7cdf3fc..55ac3e337 100644
--- a/db/routines/vn/procedures/itemShelving_addByClaim.sql
+++ b/db/routines/vn/procedures/itemShelving_addByClaim.sql
@@ -1,29 +1,38 @@
DELIMITER $$
-CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_addByClaim`(vClaimFk INT, vShelvingFk VARCHAR(3))
+CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_addByClaim`(
+ vClaimFk INT,
+ vShelvingCode VARCHAR(10)
+)
BEGIN
/**
* Insert items of claim into itemShelving.
*
* @param vClaimFk The claim
- * @param vShelvingFk The shelving
+ * @param vShelvingCode The shelving code
* @table tmp.buyUltimate
*/
DECLARE vWarehouseFk INT;
+ DECLARE vShelvingFk INT;
SELECT t.warehouseFk INTO vWarehouseFk
FROM claim c
JOIN ticket t ON t.id = c.ticketFk
WHERE c.id = vClaimFk;
+ SELECT id INTO vShelvingFk
+ FROM shelving
+ WHERE code COLLATE utf8_unicode_ci = vShelvingCode;
+
CALL buy_getUltimate(NULL, vWarehouseFk, util.VN_CURDATE());
INSERT INTO itemShelving (itemFk, shelvingFk, packing, `grouping`, visible)
- SELECT s.itemFk, vShelvingFk, b.packing, b.`grouping`, cb.quantity AS visible
+ SELECT s.itemFk, vShelvingFk, b.packing, b.`grouping`, cb.quantity visible
FROM claim c
JOIN claimBeginning cb ON c.id = cb.claimFk
JOIN sale s ON s.id = cb.saleFk
JOIN ticket t ON t.id = s.ticketFk
- JOIN tmp.buyUltimate bu ON bu.itemFk = s.itemFk AND bu.warehouseFk = t.warehouseFk
+ JOIN tmp.buyUltimate bu ON bu.itemFk = s.itemFk
+ AND bu.warehouseFk = t.warehouseFk
JOIN buy b ON b.id = bu.buyFk
WHERE c.id = vClaimFk;
END$$
diff --git a/db/routines/vn/procedures/itemShelving_addList.sql b/db/routines/vn/procedures/itemShelving_addList.sql
index ade92b9fd..04fa1e10c 100644
--- a/db/routines/vn/procedures/itemShelving_addList.sql
+++ b/db/routines/vn/procedures/itemShelving_addList.sql
@@ -1,6 +1,6 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_addList`(
- vShelvingFk VARCHAR(3),
+ vShelvingCode VARCHAR(10),
vList TEXT,
vIsChecking BOOL,
vWarehouseFk INT
@@ -13,7 +13,7 @@ BEGIN
* Cuando es TRUE sólo inserta los elementos de la colección que no están ya en
* ese shelving, actualizando los valores del campo itemShelving.isChecked
*
- * @param vShelvingFk Identificador de shelving
+ * @param vShelvingCode Código de shelving
* @param vList JSON array con esta estructura: '[value1, value2, ...]'
* @param vIsChecking Define si hay que añadir o comprobar los items
* @param vWarehouseFk Identificador de warehouse
@@ -24,6 +24,11 @@ BEGIN
DECLARE vPath VARCHAR(6);
DECLARE vItemFk INT;
DECLARE vIsChecked BOOL;
+ DECLARE vShelvingFk INT;
+
+ SELECT id INTO vShelvingFk
+ FROM shelving
+ WHERE code COLLATE utf8_unicode_ci = vShelvingCode;
WHILE vCounter < vListLength DO
SET vPath = CONCAT('$[', vCounter, ']');
@@ -34,17 +39,17 @@ BEGIN
SELECT IF(COUNT(*), TRUE, FALSE) INTO vIsChecked
FROM itemShelving
- WHERE shelvingFk COLLATE utf8_unicode_ci = vShelvingFk
+ WHERE shelvingFk = vShelvingFk
AND itemFk = vItemFk;
END IF;
IF NOT vIsChecking OR NOT vIsChecked THEN
- CALL itemShelving_add(vShelvingFk, vBarcode, 1, NULL, NULL, NULL, vWarehouseFk);
+ CALL itemShelving_add(vShelvingCode, vBarcode, 1, NULL, NULL, NULL, vWarehouseFk);
END IF;
UPDATE itemShelving
SET isChecked = vIsChecked
- WHERE shelvingFk COLLATE utf8_unicode_ci = vShelvingFk
+ WHERE shelvingFk = vShelvingFk
AND itemFk = vItemFk
AND isChecked IS NULL;
diff --git a/db/routines/vn/procedures/itemShelving_get.sql b/db/routines/vn/procedures/itemShelving_get.sql
index 07384b721..93022c2af 100644
--- a/db/routines/vn/procedures/itemShelving_get.sql
+++ b/db/routines/vn/procedures/itemShelving_get.sql
@@ -1,10 +1,12 @@
DELIMITER $$
-CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_get`(IN vSelf VARCHAR(8))
+CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_get`(
+ vShelvingCode VARCHAR(10)
+)
BEGIN
/**
-* Lista artículos de itemshelving
+* Lista artículos de itemShelving.
*
-* @param vSelf matrícula del carro
+* @param vShelvingCode Matrícula del carro
**/
SELECT ish.itemFk item,
i.name,
@@ -22,9 +24,9 @@ BEGIN
ish.buyFk
FROM itemShelving ish
JOIN item i ON i.id = ish.itemFk
- JOIN shelving s ON vSelf = s.code COLLATE utf8_unicode_ci
- LEFT JOIN parking p ON s.parkingFk = p.id
+ JOIN shelving s ON s.id = ish.shelvingFk
+ LEFT JOIN parking p ON p.id = s.parkingFk
JOIN hedera.imageConfig ic
- WHERE ish.shelvingFk COLLATE utf8_unicode_ci = vSelf;
+ WHERE s.code COLLATE utf8_unicode_ci = vShelvingCode;
END$$
DELIMITER ;
diff --git a/db/routines/vn/procedures/itemShelving_getAlternatives.sql b/db/routines/vn/procedures/itemShelving_getAlternatives.sql
index 89176c4f5..3eff3254b 100644
--- a/db/routines/vn/procedures/itemShelving_getAlternatives.sql
+++ b/db/routines/vn/procedures/itemShelving_getAlternatives.sql
@@ -1,21 +1,31 @@
DELIMITER $$
-CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_getAlternatives`(vShelvingFk VARCHAR(10))
+CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_getAlternatives`(
+ vShelvingCode VARCHAR(10)
+)
BEGIN
/**
- * Devuelve un listado de posibles ubicaciones alternativas a ubicar los item de la matricula
- * del carro que se le ha pasado.
+ * Devuelve un listado de posibles ubicaciones alternativas a ubicar
+ * los item de la matricula del carro que se le ha pasado.
*
- * @param vShelvingFk matricula del carro
+ * @param vShelvingCode Matricula del carro
*/
- SELECT is2.id,is2.shelvingFk , p.code, is2.itemFk , is2.visible, p.pickingOrder
+ DECLARE vShelvingFk INT;
+
+ SELECT id INTO vShelvingFk
+ FROM shelving
+ WHERE code COLLATE utf8_unicode_ci = vShelvingCode;
+
+ SELECT is2.id,is2.shelvingFk, p.code, is2.itemFk , is2.visible, p.pickingOrder
FROM itemShelving is2
- JOIN shelving sh ON sh.code = is2.shelvingFk
+ JOIN shelving sh ON sh.id = is2.shelvingFk
JOIN parking p ON p.id = sh.parkingFk
JOIN sector s ON s.id = p.sectorFk
- LEFT JOIN operator o ON o.sectorFk = s.id AND o.workerFk = account.myUser_getId()
+ LEFT JOIN operator o ON o.sectorFk = s.id
+ AND o.workerFk = account.myUser_getId()
JOIN warehouse wh ON wh.id = s.warehouseFk
- JOIN itemShelving is3 ON is3.itemFk = is2.itemFk AND is3.shelvingFk = vShelvingFk COLLATE utf8_unicode_ci
- WHERE is2.shelvingFk <> vShelvingFk COLLATE utf8_unicode_ci
+ JOIN itemShelving is3 ON is3.itemFk = is2.itemFk
+ AND is3.shelvingFk = vShelvingFk
+ WHERE is2.shelvingFk <> vShelvingFk
GROUP BY is2.id
ORDER BY p.pickingOrder DESC;
END$$
diff --git a/db/routines/vn/procedures/itemShelving_getInfo.sql b/db/routines/vn/procedures/itemShelving_getInfo.sql
index f02100e8b..f4c8c5b35 100644
--- a/db/routines/vn/procedures/itemShelving_getInfo.sql
+++ b/db/routines/vn/procedures/itemShelving_getInfo.sql
@@ -16,7 +16,7 @@ BEGIN
ish.itemFk itemFk,
sh.priority
FROM vn.itemShelving ish
- JOIN vn.shelving sh ON sh.`code` = ish.shelvingFk
+ JOIN vn.shelving sh ON sh.id = ish.shelvingFk
JOIN vn.parking pk ON pk.id = sh.parkingFk
WHERE ish.itemFk = vItemFk
ORDER BY sh.priority DESC, created ASC;
diff --git a/db/routines/vn/procedures/itemShelving_getItemDetails.sql b/db/routines/vn/procedures/itemShelving_getItemDetails.sql
index 4e641ca72..36f9830f0 100644
--- a/db/routines/vn/procedures/itemShelving_getItemDetails.sql
+++ b/db/routines/vn/procedures/itemShelving_getItemDetails.sql
@@ -1,14 +1,14 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_getItemDetails`(
vBarcodeItem INT,
- vShelvingFK VARCHAR(10)
+ vShelvingCode VARCHAR(10)
)
BEGIN
/**
* Obtiene el precio y visible de un item
*
* @param vBarcodeItem barcode de artículo
- * @param vShelvingFK Ubicación actual del artículo
+ * @param vShelvingCode Ubicación actual del artículo
*/
DECLARE vIsItem BOOL;
DECLARE vBuyFk INT;
@@ -38,18 +38,19 @@ BEGIN
WITH visible AS(
SELECT itemFk,
IFNULL(buyingValue, 0) +
- IFNULL(freightValue, 0) +
- IFNULL(comissionValue, 0) +
- IFNULL(packageValue, 0) itemCost
- FROM vn.buy b
+ IFNULL(freightValue, 0) +
+ IFNULL(comissionValue, 0) +
+ IFNULL(packageValue, 0) itemCost
+ FROM vn.buy b
WHERE b.id = vBuyFk
) SELECT v.itemFk,
- vShelvingFK,
+ vShelvingCode,
v.itemCost,
SUM(ish.visible) visible
FROM vn.itemShelving ish
+ JOIN vn.shelving sh ON sh.id = ish.shelvingFK
JOIN visible v
- WHERE ish.shelvingFK = vShelvingFK COLLATE utf8mb3_general_ci
- AND ish.itemFk = v.itemFk;
+ WHERE sh.code = vShelvingCode COLLATE utf8mb3_general_ci
+ AND ish.itemFk = v.itemFk;
END$$
DELIMITER ;
\ No newline at end of file
diff --git a/db/routines/vn/procedures/itemShelving_getSaleDate.sql b/db/routines/vn/procedures/itemShelving_getSaleDate.sql
index d8ab6ed0c..fad4d5abc 100644
--- a/db/routines/vn/procedures/itemShelving_getSaleDate.sql
+++ b/db/routines/vn/procedures/itemShelving_getSaleDate.sql
@@ -1,14 +1,20 @@
DELIMITER $$
-CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_getSaleDate`(vShelvingFk VARCHAR(3))
+CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_getSaleDate`(
+ vShelvingCode VARCHAR(10)
+)
BEGIN
-
- /* Devuelve la mínima fecha en que se necesita cada producto en esa matrícula.
- *
- * @param vShelvingFk Matrícula del carro o pallet
- */
-
+/**
+ * Devuelve la mínima fecha en que se necesita cada producto en esa matrícula.
+ *
+ * @param vShelvingCode Matrícula del carro o pallet
+ */
DECLARE vWarehouseFk INT;
DECLARE vStockScopeDays INT;
+ DECLARE vShelvingFk INT;
+
+ SELECT id INTO vShelvingFk
+ FROM shelving
+ WHERE code COLLATE utf8_unicode_ci = vShelvingCode;
SELECT s.warehouseFk, stockScopeDays
INTO vWarehouseFk, vStockScopeDays
@@ -30,7 +36,7 @@ BEGIN
ENGINE = MEMORY
SELECT itemFk, SUM(visible) visible
FROM itemShelving
- WHERE shelvingFk = vShelvingFk COLLATE utf8_unicode_ci
+ WHERE shelvingFk = vShelvingFk
GROUP BY itemFk;
CREATE OR REPLACE TEMPORARY TABLE tmp.tStockByDay
@@ -52,7 +58,7 @@ BEGIN
SELECT ish.itemFk, - SUM(ish.visible), util.VN_CURDATE()
FROM itemShelving ish
JOIN tmp.tItems i ON i.itemFk = ish.itemFk
- JOIN shelving sh ON sh.code = ish.shelvingFk
+ JOIN shelving sh ON sh.id = ish.shelvingFk
JOIN parking p ON sh.parkingFk = p.id
JOIN sector s ON s.id = p.sectorFk
WHERE s.isReserve
@@ -110,7 +116,7 @@ BEGIN
UPDATE tmp.tStockByDay sbd
JOIN (SELECT ish.itemFK, SUM(ish.visible) amount
FROM itemShelving ish
- JOIN shelving sh ON sh.code = ish.shelvingFk
+ JOIN shelving sh ON sh.id = ish.shelvingFk
JOIN parking p ON p.id = sh.parkingFk
JOIN sector s ON s.id = p.sectorFk
WHERE s.warehouseFk = vWarehouseFk
@@ -150,10 +156,10 @@ BEGIN
p.sectorFk,
ish.shelvingFk
FROM itemShelving ish
- JOIN vn.shelving sh ON sh.code = ish.shelvingFk
+ JOIN vn.shelving sh ON sh.id = ish.shelvingFk
LEFT JOIN parking p ON p.id = parkingFk
LEFT JOIN vn.sector s ON s.id = p.sectorFk
- WHERE ish.shelvingFk = vShelvingFk COLLATE utf8_unicode_ci
+ WHERE ish.shelvingFk = vShelvingFk
) sub4 ON sub4.itemFk = ts.itemFk
LEFT JOIN sector s ON s.id = sub4.sectorFk
LEFT JOIN item i ON i.id = ts.itemFk
diff --git a/db/routines/vn/procedures/itemShelving_inventory.sql b/db/routines/vn/procedures/itemShelving_inventory.sql
index b57df02e0..9ae96c7a8 100644
--- a/db/routines/vn/procedures/itemShelving_inventory.sql
+++ b/db/routines/vn/procedures/itemShelving_inventory.sql
@@ -42,7 +42,7 @@ BEGIN
JOIN item i ON i.id = ish.itemFk
JOIN itemType it ON it.id = i.typeFk
JOIN tmp.stockMisfit sm ON sm.itemFk = ish.itemFk
- JOIN shelving sh ON sh.code = ish.shelvingFk
+ JOIN shelving sh ON sh.id = ish.shelvingFk
JOIN parking p ON p.id = sh.parkingFk
LEFT JOIN (
SELECT s.itemFk, sum(s.quantity) notPrepared
diff --git a/db/routines/vn/procedures/itemShelving_selfConsumption.sql b/db/routines/vn/procedures/itemShelving_selfConsumption.sql
index 083d8d74c..5820b9d28 100644
--- a/db/routines/vn/procedures/itemShelving_selfConsumption.sql
+++ b/db/routines/vn/procedures/itemShelving_selfConsumption.sql
@@ -1,6 +1,6 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_selfConsumption`(
- vShelvingFk VARCHAR(10) COLLATE utf8_general_ci,
+ vShelvingCode VARCHAR(10) COLLATE utf8_general_ci,
vItemFk INT,
vQuantity INT
)
@@ -9,9 +9,9 @@ BEGIN
* Leave the indicated amount on the shelve
* and create a ticket with the difference.
*
- * @param vShelvingFk id of the shelve where the item is located.
- * @param vItemFk article of which the self-consumption ticket is to be created.
- * @param vQuantity amount that will stay on the shelve
+ * @param vShelvingCode Code of the shelve where the item is located
+ * @param vItemFk Item of which the self-consumption ticket is to be created
+ * @param vQuantity Amount that will stay on the shelve
*/
DECLARE vVisible INT;
DECLARE vClientFk INT;
@@ -21,6 +21,11 @@ BEGIN
DECLARE vAgencyModeFk INT;
DECLARE vItemShelvingFk INT;
DECLARE vAddressFk INT;
+ DECLARE vShelvingFk INT;
+
+ SELECT id INTO vShelvingFk
+ FROM shelving
+ WHERE code = vShelvingCode;
SELECT c.id,
pc.clientSelfConsumptionFk,
@@ -37,7 +42,7 @@ BEGIN
JOIN parking p ON p.sectorFk = s.id
JOIN shelving s2 ON s2.parkingFk = p.id
JOIN productionConfig pc
- WHERE s2.code = vShelvingFk;
+ WHERE s2.id = vShelvingFk;
IF vClientFk IS NULL THEN
CALL util.throw('The company does not have a customer assigned');
@@ -47,7 +52,7 @@ BEGIN
CALL util.throw('The shelf cannot have NULL or negative quantities');
END IF;
- IF vShelvingFk IS NULL THEN
+ IF vShelvingCode IS NULL THEN
CALL util.throw('The shelf is necessary');
END IF;
diff --git a/db/routines/vn/procedures/itemShelving_transfer.sql b/db/routines/vn/procedures/itemShelving_transfer.sql
index 95d70227f..e0e6af110 100644
--- a/db/routines/vn/procedures/itemShelving_transfer.sql
+++ b/db/routines/vn/procedures/itemShelving_transfer.sql
@@ -1,7 +1,7 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_transfer`(
vItemShelvingFk INT,
- vShelvingFk VARCHAR(10)
+ vShelvingCode VARCHAR(10)
)
BEGIN
/**
@@ -9,9 +9,14 @@ BEGIN
* fusionando si coincide el packing y la fecha.
*
* @param vItemShelvingFk Identificador de itemShelving
- * @param vShelvingFk Identificador de shelving
+ * @param vShelvingCode Código de shelving
*/
DECLARE vNewItemShelvingFk INT;
+ DECLARE vShelvingFk INT;
+
+ SELECT id INTO vShelvingFk
+ FROM shelving
+ WHERE code COLLATE utf8_unicode_ci = vShelvingCode;
SELECT MAX(ish.id) INTO vNewItemShelvingFk
FROM itemShelving ish
@@ -26,7 +31,7 @@ BEGIN
AND ish2.packing = ish.packing
AND DATE(ish2.created) = DATE(ish.created)
AND ish2.buyFk = ish.buyFk
- WHERE ish.shelvingFk = vShelvingFk COLLATE utf8_unicode_ci;
+ WHERE ish.shelvingFk = vShelvingFk;
IF vNewItemShelvingFk THEN
UPDATE itemShelving ish
@@ -38,9 +43,7 @@ BEGIN
DELETE FROM itemShelving
WHERE id = vItemShelvingFk;
ELSE
- IF (SELECT EXISTS(SELECT id FROM shelving
- WHERE code = vShelvingFk COLLATE utf8_unicode_ci)) THEN
-
+ IF (SELECT EXISTS(SELECT id FROM shelving WHERE id = vShelvingFk)) THEN
UPDATE itemShelving
SET shelvingFk = vShelvingFk
WHERE id = vItemShelvingFk;
diff --git a/db/routines/vn/procedures/item_devalueA2.sql b/db/routines/vn/procedures/item_devalueA2.sql
index d0178f6a7..3264165a6 100644
--- a/db/routines/vn/procedures/item_devalueA2.sql
+++ b/db/routines/vn/procedures/item_devalueA2.sql
@@ -1,7 +1,7 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`item_devalueA2`(
vSelf INT,
- vShelvingFK VARCHAR(10),
+ vShelvingCode VARCHAR(10) COLLATE utf8mb3_general_ci,
vBuyingValue DECIMAL(10,4),
vQuantity INT
)
@@ -12,7 +12,7 @@ BEGIN
* de almacén y shelvings correspondientes
*
* @param vSelf Id de artículo a devaluar
- * @param vShelvingFK Ubicación actual del artículo
+ * @param vShelvingCode Código de shelving / ubicación
* @param vBuyingValue Nuevo precio de coste
* @param vQuantity Cantidad del ítem a pasar a A2
*/
@@ -109,10 +109,11 @@ BEGIN
CALL util.throw ('The item has not a buy');
END IF;
- SELECT id,visible INTO vTargetItemShelvingFk, vCurrentVisible
- FROM itemShelving
- WHERE shelvingFk = vShelvingFK COLLATE utf8mb3_general_ci
- AND itemFk = vSelf
+ SELECT ish.id, ish.visible INTO vTargetItemShelvingFk, vCurrentVisible
+ FROM itemShelving ish
+ JOIN shelving sh ON sh.id = ish.shelvingFk
+ WHERE sh.code = vShelvingCode
+ AND ish.itemFk = vSelf
LIMIT 1;
IF vCurrentVisible IS NULL THEN
@@ -388,16 +389,17 @@ BEGIN
userFk,
isChecked)
SELECT vItemA2Fk,
- shelvingFk,
+ ish.shelvingFk,
vQuantity ,
- `grouping`,
- packing,
- packagingFk,
+ ish.`grouping`,
+ ish.packing,
+ ish.packagingFk,
account.myUser_getId(),
- isChecked
- FROM itemShelving
- WHERE itemFK = vSelf
- AND shelvingFk = vShelvingFK COLLATE utf8mb3_general_ci
+ ish.isChecked
+ FROM itemShelving ish
+ JOIN shelving sh ON sh.id = ish.shelvingFk
+ WHERE ish.itemFK = vSelf
+ AND sh.code = vShelvingCode
ON DUPLICATE KEY UPDATE
visible = vQuantity + VALUES(visible);
diff --git a/db/routines/vn/procedures/productionControl.sql b/db/routines/vn/procedures/productionControl.sql
index 1d206e20d..813c65ab2 100644
--- a/db/routines/vn/procedures/productionControl.sql
+++ b/db/routines/vn/procedures/productionControl.sql
@@ -217,7 +217,7 @@ proc: BEGIN
st.code = 'previousPrepared' isPreviousPrepared,
sc.itemPackingTypeFk
FROM itemShelving ish
- JOIN shelving sh ON sh.code = ish.shelvingFk
+ JOIN shelving sh ON sh.id = ish.shelvingFk
JOIN parking p ON p.id = sh.parkingFk
JOIN sector sc ON sc.id = p.sectorFk
JOIN sectorType st ON st.id = sc.typeFk
diff --git a/db/routines/vn/procedures/sale_boxPickingPrint.sql b/db/routines/vn/procedures/sale_boxPickingPrint.sql
index 6bb954a78..f156ff8f8 100644
--- a/db/routines/vn/procedures/sale_boxPickingPrint.sql
+++ b/db/routines/vn/procedures/sale_boxPickingPrint.sql
@@ -27,7 +27,7 @@ BEGIN
DECLARE vQuantity INT;
DECLARE vRemainder INT DEFAULT 0;
DECLARE vRemainderSaleFk INT;
- DECLARE vShelving VARCHAR(10);
+ DECLARE vShelvingFk VARCHAR(10);
DECLARE vTicketFk INT;
SELECT s.quantity,
@@ -74,7 +74,7 @@ w1: WHILE vQuantity >= vPacking DO
p.pickingOrder,
ish.created
FROM itemShelving ish
- JOIN shelving sh ON sh.code = ish.shelvingFk
+ JOIN shelving sh ON sh.id = ish.shelvingFk
JOIN parking p ON p.id = sh.parkingFk
LEFT JOIN itemShelvingSale iss
ON iss.itemShelvingFk = ish.id
@@ -262,9 +262,9 @@ w1: WHILE vQuantity >= vPacking DO
CALL dipole.expedition_Add(vExpeditionFk,vPrinterFk, TRUE);
SELECT shelvingFk, p.code
- INTO vShelving, vParkingCode
+ INTO vShelvingFk, vParkingCode
FROM itemShelving ish
- JOIN shelving sh ON sh.code = ish.shelvingFk
+ JOIN shelving sh ON sh.id = ish.shelvingFk
JOIN parking p ON p.id = sh.parkingFk
WHERE ish.id = vItemShelvingFk;
@@ -273,7 +273,7 @@ w1: WHILE vQuantity >= vPacking DO
itemFk = vItemFk,
quantity = vPacking,
longName = vConcept,
- shelvingFk = vShelving,
+ shelvingFk = vShelvingFk,
parkingCode = vParkingCode,
phone = RIGHT(phone,vMaxPhoneLength),
street = RIGHT(street, vMAxStreetLength)
diff --git a/db/routines/vn/procedures/sale_getBoxPickingList.sql b/db/routines/vn/procedures/sale_getBoxPickingList.sql
index f343ab375..4f6a08083 100644
--- a/db/routines/vn/procedures/sale_getBoxPickingList.sql
+++ b/db/routines/vn/procedures/sale_getBoxPickingList.sql
@@ -41,7 +41,7 @@ BEGIN
AND iss.created >= vDated
GROUP BY iss.itemShelvingFk, s.itemFk) tISS
ON tISS.itemFk = ish.itemFk AND tISS.itemShelvingFk = ish.id
- JOIN shelving sh ON sh.code = ish.shelvingFk
+ JOIN shelving sh ON sh.id = ish.shelvingFk
JOIN parking p ON p.id = sh.parkingFk
JOIN tmp.productionBuffer pb ON pb.ticketFk = s.ticketFk
JOIN agencyMode am ON am.id = pb.agencyModeFk
diff --git a/db/routines/vn/procedures/sale_getProblems.sql b/db/routines/vn/procedures/sale_getProblems.sql
index cd65bb81c..e016f3ab4 100644
--- a/db/routines/vn/procedures/sale_getProblems.sql
+++ b/db/routines/vn/procedures/sale_getProblems.sql
@@ -87,7 +87,7 @@ BEGIN
SUM(ish.visible) visible,
s.warehouseFk warehouseFk
FROM itemShelving ish
- JOIN shelving sh ON sh.code = ish.shelvingFk
+ JOIN shelving sh ON sh.id = ish.shelvingFk
JOIN parking p ON p.id = sh.parkingFk
JOIN sector s ON s.id = p.sectorFk
GROUP BY ish.itemFk, s.warehouseFk;
diff --git a/db/routines/vn/procedures/shelvingChange.sql b/db/routines/vn/procedures/shelvingChange.sql
index 2e7e92082..901b1cf95 100644
--- a/db/routines/vn/procedures/shelvingChange.sql
+++ b/db/routines/vn/procedures/shelvingChange.sql
@@ -1,11 +1,13 @@
DELIMITER $$
-CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`shelvingChange`(IN `vShelvingO` VARCHAR(8), IN `vShelvingD` VARCHAR(8))
+CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`shelvingChange`(
+ `vShelvingO` VARCHAR(10),
+ `vShelvingD` VARCHAR(10)
+)
BEGIN
-
- UPDATE vn.itemShelving
- SET shelvingFk = vShelvingD COLLATE utf8_unicode_ci
- WHERE shelvingFk = vShelvingO COLLATE utf8_unicode_ci;
-
-
+ UPDATE itemShelving ish
+ JOIN shelving sh1 ON sh1.code = vShelvingD COLLATE utf8_unicode_ci
+ JOIN shelving sh2 ON sh2.code = vShelvingO COLLATE utf8_unicode_ci
+ SET ish.shelvingFk = sh1.id
+ WHERE ish.shelvingFk = sh2.id;
END$$
DELIMITER ;
diff --git a/db/routines/vn/procedures/shelvingParking_get.sql b/db/routines/vn/procedures/shelvingParking_get.sql
index a9ed9f74a..c05e8afc3 100644
--- a/db/routines/vn/procedures/shelvingParking_get.sql
+++ b/db/routines/vn/procedures/shelvingParking_get.sql
@@ -1,8 +1,10 @@
DELIMITER $$
-CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`shelvingParking_get`(vShelvingFk VARCHAR(10), vWarehouseFk INT, vDayRange INT)
-BEGIN
-
-
+CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`shelvingParking_get`(
+ vShelvingCode VARCHAR(10),
+ vWarehouseFk INT,
+ vDayRange INT
+)
+BEGIN
SELECT s.itemFk,
s.concept,
CAST(SUM(s.quantity) AS DECIMAL(10,0)) as sinServir,
@@ -10,14 +12,15 @@ SELECT s.itemFk,
FROM vn.sale s
LEFT JOIN vn.itemShelvingSale iss ON iss.saleFk = s.id
JOIN vn.ticket t ON t.id = s.ticketFk
- LEFT JOIN vn.itemShelvingStock ist ON ist.itemFk = s.itemFk AND ist.warehouseFk = vWarehouseFk
- JOIN vn.itemShelving ish ON ish.itemFk = s.itemFk AND ish.shelvingFk = vShelvingFk COLLATE utf8_general_ci
+ LEFT JOIN vn.itemShelvingStock ist ON ist.itemFk = s.itemFk
+ AND ist.warehouseFk = vWarehouseFk
+ JOIN vn.itemShelving ish ON ish.itemFk = s.itemFk
+ JOIN shelving sh ON sh.id = ish.shelvingFk
+ AND sh.code = vShelvingCode COLLATE utf8_general_ci
WHERE t.shipped BETWEEN util.VN_CURDATE() AND util.dayend(TIMESTAMPADD(DAY, GREATEST(0,vDayRange), util.VN_CURDATE()))
AND iss.saleFk IS NULL
AND t.warehouseFk = vWarehouseFk
GROUP BY s.itemFk
HAVING sinServir > aparcado;
-
-
END$$
DELIMITER ;
diff --git a/db/routines/vn/procedures/shelving_clean.sql b/db/routines/vn/procedures/shelving_clean.sql
index 0b29968bc..155338827 100644
--- a/db/routines/vn/procedures/shelving_clean.sql
+++ b/db/routines/vn/procedures/shelving_clean.sql
@@ -12,12 +12,12 @@ BEGIN
DELETE ish.*
FROM itemShelving ish
- JOIN vn.shelving sh ON sh.code = ish.shelvingFk
+ JOIN vn.shelving sh ON sh.id = ish.shelvingFk
WHERE sh.parkingFk IS NULL
AND ish.created < TIMESTAMPADD(WEEK,-1,util.VN_CURDATE());
UPDATE shelving sh
- LEFT JOIN itemShelving its ON its.shelvingFk = sh.`code`
+ LEFT JOIN itemShelving its ON its.shelvingFk = sh.id
SET isPrinted = 0,
parkingFk = NULL
WHERE its.id IS NULL
@@ -27,11 +27,11 @@ UPDATE shelving sh
OR
sh.parked < util.VN_CURDATE() - INTERVAL 2 WEEK
)
-
AND IF(code REGEXP '^[A-Za-z]{2}[0-9]', LEFT (code, 2) NOT IN (
- SELECT DISTINCT LEFT(its.shelvingFk, 2)
+ SELECT DISTINCT LEFT(sh.code, 2)
FROM itemShelving its
- WHERE its.shelvingFk REGEXP '^[A-Za-z]{2}[0-9]'
+ JOIN shelving sh ON sh.id = its.shelvingFk
+ WHERE sh.code REGEXP '^[A-Za-z]{2}[0-9]'
), TRUE);
END$$
diff --git a/db/routines/vn/procedures/shelving_getSpam.sql b/db/routines/vn/procedures/shelving_getSpam.sql
index cef407285..a80021cdf 100644
--- a/db/routines/vn/procedures/shelving_getSpam.sql
+++ b/db/routines/vn/procedures/shelving_getSpam.sql
@@ -25,7 +25,7 @@ BEGIN
LEFT JOIN (
SELECT ish.itemFk, CAST(SUM(ish.visible) AS DECIMAL(10,0)) AS reserva
FROM vn.itemShelving ish
- JOIN vn.shelving sh ON sh.code = ish.shelvingFk
+ JOIN vn.shelving sh ON sh.id = ish.shelvingFk
JOIN vn.parking p ON p.id = sh.parkingFk
JOIN vn.sector s ON s.id = p.sectorFk
WHERE s.code = 'FUENTES_PICASSE'
@@ -68,7 +68,7 @@ BEGIN
sh.isSpam
FROM vn.itemShelving ish
JOIN vn.item i ON i.id = ish.itemFk
- JOIN vn.shelving sh ON sh.code = ish.shelvingFk
+ JOIN vn.shelving sh ON sh.id = ish.shelvingFk
JOIN vn.parking p ON p.id = sh.parkingFk
JOIN vn.sector s ON s.id = p.sectorFk
JOIN vn.warehouse w ON w.id = s.warehouseFk
diff --git a/db/routines/vn/procedures/stockBought_calculate.sql b/db/routines/vn/procedures/stockBought_calculate.sql
index ba044604a..c248d0deb 100644
--- a/db/routines/vn/procedures/stockBought_calculate.sql
+++ b/db/routines/vn/procedures/stockBought_calculate.sql
@@ -59,7 +59,7 @@ proc: BEGIN
INSERT INTO stockBought(workerFk, bought, dated)
SELECT tb.workerFk,
- ROUND(GREATEST(tb.bought - IFNULL(ts.sold, 0), 0), 1),
+ ROUND(GREATEST(tb.bought - IFNULL(ts.sold, 0), 0), 2),
vDated
FROM tStockBought tb
LEFT JOIN tStockSold ts ON ts.workerFk = tb.workerFk;
@@ -80,7 +80,7 @@ proc: BEGIN
UPDATE stockBought s
JOIN tStockSold ts ON ts.workerFk = s.workerFk
- SET s.bought = IF(s.bought < ts.sold, ROUND(s.bought - ts.sold, 1), 0)
+ SET s.bought = IF(s.bought < ABS(ts.sold), 0, ROUND(s.bought - ABS(ts.sold), 1))
WHERE s.dated = vDated;
DROP TEMPORARY TABLE tCurrentData, tmp.item, tmp.buyUltimate, tStockSold;
diff --git a/db/routines/vn/procedures/ticketDown_PrintableSelection.sql b/db/routines/vn/procedures/ticketDown_PrintableSelection.sql
index 082a890a6..8f448d647 100644
--- a/db/routines/vn/procedures/ticketDown_PrintableSelection.sql
+++ b/db/routines/vn/procedures/ticketDown_PrintableSelection.sql
@@ -9,7 +9,7 @@ BEGIN
JOIN vn.sale s ON s.ticketFk = t.id
JOIN vn.itemShelvingSale iss ON iss.saleFk = s.id
JOIN vn.itemShelving ish ON ish.id = iss.itemShelvingFk
- JOIN vn.shelving sh ON sh.code = ish.shelvingFk
+ JOIN vn.shelving sh ON sh.id = ish.shelvingFk
JOIN vn.parking p ON p.id = sh.parkingFk
WHERE p.sectorFk = vSectorFk
) sub ON sub.id = td.ticketFk
diff --git a/db/routines/vn/procedures/ticket_DelayTruckSplit.sql b/db/routines/vn/procedures/ticket_DelayTruckSplit.sql
index 1dc45d065..3d22207f3 100644
--- a/db/routines/vn/procedures/ticket_DelayTruckSplit.sql
+++ b/db/routines/vn/procedures/ticket_DelayTruckSplit.sql
@@ -27,7 +27,7 @@ BEGIN
SUM(ish.visible) visible,
s.warehouseFk warehouseFk
FROM itemShelving ish
- JOIN shelving sh ON sh.code = ish.shelvingFk
+ JOIN shelving sh ON sh.id = ish.shelvingFk
JOIN parking p ON p.id = sh.parkingFk
JOIN sector s ON s.id = p.sectorFk
GROUP BY ish.itemFk,
diff --git a/db/routines/vn/procedures/ticket_getSplitList.sql b/db/routines/vn/procedures/ticket_getSplitList.sql
index 988bc2931..66e9bdb57 100644
--- a/db/routines/vn/procedures/ticket_getSplitList.sql
+++ b/db/routines/vn/procedures/ticket_getSplitList.sql
@@ -28,7 +28,7 @@ BEGIN
SUM(ish.visible) visible,
s.warehouseFk warehouseFk
FROM itemShelving ish
- JOIN shelving sh ON sh.code = ish.shelvingFk
+ JOIN shelving sh ON sh.id = ish.shelvingFk
JOIN parking p ON p.id = sh.parkingFk
JOIN sector s ON s.id = p.sectorFk
GROUP BY ish.itemFk,
diff --git a/db/routines/vn/triggers/address_beforeInsert.sql b/db/routines/vn/triggers/address_beforeInsert.sql
index 56ef7aa51..a4f384f14 100644
--- a/db/routines/vn/triggers/address_beforeInsert.sql
+++ b/db/routines/vn/triggers/address_beforeInsert.sql
@@ -6,6 +6,7 @@ BEGIN
DECLARE vIsEqualizated BOOL;
SET NEW.editorFk = account.myUser_getId();
+ SET NEW.geoFk = address_getGeo(NEW.id);
IF (NEW.phone <> '') THEN
CALL pbx.phone_isValid(NEW.phone);
diff --git a/db/routines/vn/triggers/address_beforeUpdate.sql b/db/routines/vn/triggers/address_beforeUpdate.sql
index 35887912c..0b19a6266 100644
--- a/db/routines/vn/triggers/address_beforeUpdate.sql
+++ b/db/routines/vn/triggers/address_beforeUpdate.sql
@@ -3,7 +3,6 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`address_beforeUpdate`
BEFORE UPDATE ON `address`
FOR EACH ROW
BEGIN
-
SET NEW.editorFk = account.myUser_getId();
IF !(NEW.phone <=> OLD.phone) AND (NEW.phone <> '') THEN
@@ -14,5 +13,10 @@ BEGIN
CALL pbx.phone_isValid(NEW.mobile);
END IF;
+ IF NOT (NEW.provinceFk <=> OLD.provinceFk)
+ OR (NEW.postalCode <=> OLD.postalCode) THEN
+
+ SET NEW.geoFk = address_getGeo(NEW.id);
+ END IF;
END$$
DELIMITER ;
diff --git a/db/routines/vn/triggers/client_beforeInsert.sql b/db/routines/vn/triggers/client_beforeInsert.sql
index 45de107f1..b4038a2ba 100644
--- a/db/routines/vn/triggers/client_beforeInsert.sql
+++ b/db/routines/vn/triggers/client_beforeInsert.sql
@@ -3,8 +3,10 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`client_beforeInsert`
BEFORE INSERT ON `client`
FOR EACH ROW
BEGIN
-
SET NEW.editorFk = account.myUser_getId();
+ SET NEW.accountingAccount = 4300000000 + NEW.id;
+ SET NEW.lastSalesPersonFk = NEW.salesPersonFk;
+ SET NEW.geoFk = client_getGeo(NEW.id);
IF (NEW.phone <> '') THEN
CALL pbx.phone_isValid(NEW.phone);
@@ -13,9 +15,5 @@ BEGIN
IF (NEW.mobile <> '') THEN
CALL pbx.phone_isValid(NEW.mobile);
END IF;
-
- SET NEW.accountingAccount = 4300000000 + NEW.id;
-
- SET NEW.lastSalesPersonFk = NEW.salesPersonFk;
END$$
DELIMITER ;
diff --git a/db/routines/vn/triggers/client_beforeUpdate.sql b/db/routines/vn/triggers/client_beforeUpdate.sql
index 7142d6604..00418a9e7 100644
--- a/db/routines/vn/triggers/client_beforeUpdate.sql
+++ b/db/routines/vn/triggers/client_beforeUpdate.sql
@@ -72,5 +72,11 @@ BEGIN
IF NOT (NEW.businessTypeFk <=> OLD.businessTypeFk) AND (NEW.businessTypeFk = 'individual' OR OLD.businessTypeFk = 'individual') THEN
SET NEW.isTaxDataChecked = 0;
END IF;
+
+ IF NOT (NEW.provinceFk <=> OLD.provinceFk)
+ OR (NEW.postcode <=> OLD.postcode) THEN
+
+ SET NEW.geoFk = client_getGeo(NEW.id);
+ END IF;
END$$
DELIMITER ;
diff --git a/db/routines/vn/triggers/supplier_beforeInsert.sql b/db/routines/vn/triggers/supplier_beforeInsert.sql
index b141ec8fb..5bbfc79a1 100644
--- a/db/routines/vn/triggers/supplier_beforeInsert.sql
+++ b/db/routines/vn/triggers/supplier_beforeInsert.sql
@@ -4,5 +4,6 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`supplier_beforeInsert`
FOR EACH ROW
BEGIN
SET NEW.editorFk = account.myUser_getId();
+ SET NEW.geoFk = supplier_getGeo(NEW.id);
END$$
DELIMITER ;
diff --git a/db/routines/vn/triggers/supplier_beforeUpdate.sql b/db/routines/vn/triggers/supplier_beforeUpdate.sql
index af730b49d..b502340a3 100644
--- a/db/routines/vn/triggers/supplier_beforeUpdate.sql
+++ b/db/routines/vn/triggers/supplier_beforeUpdate.sql
@@ -40,5 +40,10 @@ BEGIN
SET NEW.isPayMethodChecked = FALSE;
END IF;
+ IF NOT (NEW.provinceFk <=> OLD.provinceFk)
+ OR (NEW.postCode <=> OLD.postCode) THEN
+
+ SET NEW.geoFk = supplier_getGeo(NEW.id);
+ END IF;
END$$
DELIMITER ;
diff --git a/db/routines/vn/views/itemShelvingList.sql b/db/routines/vn/views/itemShelvingList.sql
index 457d6f28a..f2cfeda58 100644
--- a/db/routines/vn/views/itemShelvingList.sql
+++ b/db/routines/vn/views/itemShelvingList.sql
@@ -15,7 +15,7 @@ FROM (
(
(
`vn`.`itemShelving` `ish`
- JOIN `vn`.`shelving` `sh` ON(`sh`.`code` = `ish`.`shelvingFk`)
+ JOIN `vn`.`shelving` `sh` ON(`sh`.`id` = `ish`.`shelvingFk`)
)
JOIN `vn`.`item` `i` ON(`i`.`id` = `ish`.`itemFk`)
)
diff --git a/db/routines/vn/views/itemShelvingPlacementSupplyStock.sql b/db/routines/vn/views/itemShelvingPlacementSupplyStock.sql
index fa1c11314..1ebb6410c 100644
--- a/db/routines/vn/views/itemShelvingPlacementSupplyStock.sql
+++ b/db/routines/vn/views/itemShelvingPlacementSupplyStock.sql
@@ -18,7 +18,7 @@ FROM (
(
(
`vn`.`itemShelving` `ish`
- JOIN `vn`.`shelving` `sh` ON(`sh`.`code` = `ish`.`shelvingFk`)
+ JOIN `vn`.`shelving` `sh` ON(`sh`.`id` = `ish`.`shelvingFk`)
)
LEFT JOIN `vn`.`parking` `p` ON(`p`.`id` = `sh`.`parkingFk`)
)
diff --git a/db/routines/vn/views/itemShelvingSaleSum.sql b/db/routines/vn/views/itemShelvingSaleSum.sql
index 9a402d6f4..60581faa9 100644
--- a/db/routines/vn/views/itemShelvingSaleSum.sql
+++ b/db/routines/vn/views/itemShelvingSaleSum.sql
@@ -13,7 +13,7 @@ FROM (
`vn`.`itemShelvingSale` `iss`
JOIN `vn`.`itemShelving` `ish` ON(`ish`.`id` = `iss`.`itemShelvingFk`)
)
- JOIN `vn`.`shelving` `sh` ON(`sh`.`code` = `ish`.`shelvingFk`)
+ JOIN `vn`.`shelving` `sh` ON(`sh`.`id` = `ish`.`shelvingFk`)
)
JOIN `vn`.`parking` `p` ON(`p`.`id` = `sh`.`parkingFk`)
)
diff --git a/db/routines/vn/views/itemShelvingStock.sql b/db/routines/vn/views/itemShelvingStock.sql
index 41777eaec..725a06f88 100644
--- a/db/routines/vn/views/itemShelvingStock.sql
+++ b/db/routines/vn/views/itemShelvingStock.sql
@@ -21,7 +21,7 @@ FROM (
(
(
`vn`.`itemShelving` `ish`
- LEFT JOIN `vn`.`shelving` `sh` ON(`sh`.`code` = `ish`.`shelvingFk`)
+ LEFT JOIN `vn`.`shelving` `sh` ON(`sh`.`id` = `ish`.`shelvingFk`)
)
LEFT JOIN `vn`.`parking` `p` ON(`p`.`id` = `sh`.`parkingFk`)
)
diff --git a/db/routines/vn/views/itemShelvingStockFull.sql b/db/routines/vn/views/itemShelvingStockFull.sql
index c767823d6..c8a82685c 100644
--- a/db/routines/vn/views/itemShelvingStockFull.sql
+++ b/db/routines/vn/views/itemShelvingStockFull.sql
@@ -19,7 +19,7 @@ FROM (
(
(
`vn`.`itemShelving` `ish`
- JOIN `vn`.`shelving` `sh` ON(`sh`.`code` = `ish`.`shelvingFk`)
+ JOIN `vn`.`shelving` `sh` ON(`sh`.`id` = `ish`.`shelvingFk`)
)
JOIN `vn`.`parking` `p` ON(`p`.`id` = `sh`.`parkingFk`)
)
diff --git a/db/versions/11251-navyChrysanthemum/00-firstScript.sql b/db/versions/11251-navyChrysanthemum/00-firstScript.sql
index 801405e59..7c2c69839 100644
--- a/db/versions/11251-navyChrysanthemum/00-firstScript.sql
+++ b/db/versions/11251-navyChrysanthemum/00-firstScript.sql
@@ -1,3 +1,2 @@
-UPDATE vn.sale
- SET originalQuantity = quantity
- WHERE originalQuantity IS NULL
+-- Debido a que tardaba mucho en la subida a master, se ha creado una nueva versión para que el proceso no se vea afectado y se ejecute por la noche.
+-- Se crea de nuevo en la versión 11344-grayBamboo
diff --git a/db/versions/11336-chocolateRaphis/00-firstScript.sql b/db/versions/11336-chocolateRaphis/00-firstScript.sql
new file mode 100644
index 000000000..c86dc39e9
--- /dev/null
+++ b/db/versions/11336-chocolateRaphis/00-firstScript.sql
@@ -0,0 +1,8 @@
+DELETE FROM salix.ACL
+ WHERE property IN ('cmrs', 'cmr', 'downloadCmrsZip')
+ AND model = 'Route';
+
+INSERT INTO salix.ACL (model,property,principalId)
+ VALUES ('Cmr','filter','production'),
+ ('Cmr','downloadZip','production'),
+ ('Cmr','print','production')
\ No newline at end of file
diff --git a/db/versions/11342-crimsonDendro/00-itemShelving.sql b/db/versions/11342-crimsonDendro/00-itemShelving.sql
new file mode 100644
index 000000000..4d083bf97
--- /dev/null
+++ b/db/versions/11342-crimsonDendro/00-itemShelving.sql
@@ -0,0 +1,6 @@
+CREATE OR REPLACE TEMPORARY TABLE tmp.tItemShelving
+ (PRIMARY KEY (id))
+ ENGINE = MEMORY
+ SELECT ish.id, s.id shelvingFk
+ FROM vn.itemShelving ish
+ JOIN vn.shelving s ON s.code = ish.shelvingFk COLLATE utf8mb3_unicode_ci;
diff --git a/db/versions/11342-crimsonDendro/01-itemShelving.sql b/db/versions/11342-crimsonDendro/01-itemShelving.sql
new file mode 100644
index 000000000..23099ac6b
--- /dev/null
+++ b/db/versions/11342-crimsonDendro/01-itemShelving.sql
@@ -0,0 +1,2 @@
+ALTER TABLE vn.itemShelving DROP FOREIGN KEY itemShelving_fk2,
+ MODIFY COLUMN shelvingFk int(11) NOT NULL;
diff --git a/db/versions/11342-crimsonDendro/02-itemShelving.sql b/db/versions/11342-crimsonDendro/02-itemShelving.sql
new file mode 100644
index 000000000..9d0e65d0b
--- /dev/null
+++ b/db/versions/11342-crimsonDendro/02-itemShelving.sql
@@ -0,0 +1,3 @@
+UPDATE vn.itemShelving ish
+ JOIN tmp.tItemShelving tish ON tish.id = ish.id
+ SET ish.shelvingFk = tish.shelvingFk;
\ No newline at end of file
diff --git a/db/versions/11342-crimsonDendro/03-itemShelving.sql b/db/versions/11342-crimsonDendro/03-itemShelving.sql
new file mode 100644
index 000000000..cb9825bfc
--- /dev/null
+++ b/db/versions/11342-crimsonDendro/03-itemShelving.sql
@@ -0,0 +1,4 @@
+ALTER TABLE vn.itemShelving
+ ADD CONSTRAINT itemShelving_shelving_FK FOREIGN KEY (shelvingFk) REFERENCES vn.shelving(id)
+ ON DELETE RESTRICT
+ ON UPDATE CASCADE;
diff --git a/db/versions/11342-crimsonDendro/04-itemShelvingLog.sql b/db/versions/11342-crimsonDendro/04-itemShelvingLog.sql
new file mode 100644
index 000000000..1135b9d09
--- /dev/null
+++ b/db/versions/11342-crimsonDendro/04-itemShelvingLog.sql
@@ -0,0 +1,8 @@
+/*
+CREATE OR REPLACE TEMPORARY TABLE tmp.tItemShelvingLog
+ (PRIMARY KEY (id))
+ ENGINE = MEMORY
+ SELECT ishl.id, s.id shelvingFk
+ FROM vn.itemShelvingLog ishl
+ JOIN vn.shelving s ON s.code = ishl.shelvingFk COLLATE utf8mb3_unicode_ci;
+*/
diff --git a/db/versions/11342-crimsonDendro/05-itemShelvingLog.sql b/db/versions/11342-crimsonDendro/05-itemShelvingLog.sql
new file mode 100644
index 000000000..b0e3b55cc
--- /dev/null
+++ b/db/versions/11342-crimsonDendro/05-itemShelvingLog.sql
@@ -0,0 +1 @@
+-- ALTER TABLE vn.itemShelvingLog MODIFY COLUMN shelvingFk int(11) NOT NULL;
diff --git a/db/versions/11342-crimsonDendro/06-itemShelvingLog.sql b/db/versions/11342-crimsonDendro/06-itemShelvingLog.sql
new file mode 100644
index 000000000..f97f61e42
--- /dev/null
+++ b/db/versions/11342-crimsonDendro/06-itemShelvingLog.sql
@@ -0,0 +1,7 @@
+/*
+UPDATE vn.itemShelvingLog ishl
+ JOIN tmp.tItemShelvingLog tishl ON tishl.id = ishl.id
+ SET ishl.shelvingFk = tishl.shelvingFk;
+
+DROP TEMPORARY TABLE tmp.tItemShelvingLog;
+*/
\ No newline at end of file
diff --git a/db/versions/11343-silverAsparagus/00-firstScript.sql b/db/versions/11343-silverAsparagus/00-firstScript.sql
new file mode 100644
index 000000000..bcee42eea
--- /dev/null
+++ b/db/versions/11343-silverAsparagus/00-firstScript.sql
@@ -0,0 +1,9 @@
+INSERT INTO salix.ACL (model, property, accessType, principalId)
+ VALUES ('Collection', 'create', 'WRITE', 'productionBoss'),
+ ('Collection', 'upsert', 'WRITE', 'productionBoss'),
+ ('Collection', 'replaceById', 'WRITE', 'productionBoss'),
+ ('Collection', 'updateAll', 'WRITE', 'productionBoss'),
+ ('Collection', 'updateAttributes', 'WRITE', 'productionBoss'),
+ ('Collection', 'deleteById', 'WRITE', 'productionBoss'),
+ ('Collection', 'destroyAll', 'WRITE', 'productionBoss'),
+ ('Collection', 'destroyById', 'WRITE', 'productionBoss');
diff --git a/db/versions/11344-grayBamboo/00-firstScript.sql b/db/versions/11344-grayBamboo/00-firstScript.sql
new file mode 100644
index 000000000..1fbd2a0d8
--- /dev/null
+++ b/db/versions/11344-grayBamboo/00-firstScript.sql
@@ -0,0 +1,3 @@
+UPDATE vn.sale
+ SET originalQuantity = quantity
+ WHERE originalQuantity IS NULL
\ No newline at end of file
diff --git a/db/versions/11251-navyChrysanthemum/01-firstScript.sql b/db/versions/11344-grayBamboo/01-firstScript.sql
similarity index 100%
rename from db/versions/11251-navyChrysanthemum/01-firstScript.sql
rename to db/versions/11344-grayBamboo/01-firstScript.sql
diff --git a/db/versions/11345-salmonEucalyptus/00-firstScript.sql b/db/versions/11345-salmonEucalyptus/00-firstScript.sql
new file mode 100644
index 000000000..ecbc36c40
--- /dev/null
+++ b/db/versions/11345-salmonEucalyptus/00-firstScript.sql
@@ -0,0 +1,2 @@
+ALTER TABLE account.user CHANGE recoverPass recoverPass__ tinyint(3) unsigned NOT NULL DEFAULT 1 COMMENT '@deprecated 2024-11-13';
+ALTER TABLE account.user CHANGE sync sync__ tinyint(4) NOT NULL DEFAULT 0 COMMENT '@deprecated 2024-11-13';
\ No newline at end of file
diff --git a/db/versions/11346-yellowPhormium/00-address.sql b/db/versions/11346-yellowPhormium/00-address.sql
new file mode 100644
index 000000000..f91d0ae9f
--- /dev/null
+++ b/db/versions/11346-yellowPhormium/00-address.sql
@@ -0,0 +1,23 @@
+ALTER TABLE vn.address
+ ADD geoFk int(11) DEFAULT NULL NULL AFTER isLogifloraAllowed,
+ ADD CONSTRAINT address_zoneGeo_FK FOREIGN KEY (geoFk)
+ REFERENCES vn.zoneGeo(id) ON DELETE RESTRICT ON UPDATE CASCADE;
+
+CREATE OR REPLACE TEMPORARY TABLE tmp.tAddressGeo
+ (PRIMARY KEY (id))
+ ENGINE = MEMORY
+ SELECT a.id, p.geoFk
+ FROM vn.address a
+ JOIN vn.town t ON t.provinceFk = a.provinceFk
+ JOIN vn.postCode p ON p.townFk = t.id
+ AND (p.code = a.postalCode OR a.postalCode IS NULL)
+ JOIN vn.zoneGeo zg ON zg.id = p.geoFk
+ GROUP BY a.id
+ ORDER BY (a.city SOUNDS LIKE t.`name`) DESC,
+ (p.code = a.postalCode) DESC;
+
+UPDATE vn.address a
+ JOIN tmp.tAddressGeo tag ON tag.id = a.id
+ SET a.geoFk = tag.geoFk;
+
+DROP TEMPORARY TABLE tmp.tAddressGeo;
diff --git a/db/versions/11346-yellowPhormium/01-client.sql b/db/versions/11346-yellowPhormium/01-client.sql
new file mode 100644
index 000000000..cb6fe41e8
--- /dev/null
+++ b/db/versions/11346-yellowPhormium/01-client.sql
@@ -0,0 +1,26 @@
+ALTER TABLE vn.client
+ CHANGE hasDailyInvoice hasDailyInvoice tinyint(1) DEFAULT 0 NOT NULL
+ COMMENT 'Indica si el cliente requiere facturación diaria por defecto se copiará lo que tenga country.hasDailyInvoice'
+ AFTER recommendedCredit,
+ ADD geoFk int(11) DEFAULT NULL NULL AFTER hasDailyInvoice,
+ ADD CONSTRAINT client_zoneGeo_FK FOREIGN KEY (geoFk)
+ REFERENCES vn.zoneGeo(id) ON DELETE RESTRICT ON UPDATE CASCADE;
+
+CREATE OR REPLACE TEMPORARY TABLE tmp.tClientGeo
+ (PRIMARY KEY (id))
+ ENGINE = MEMORY
+ SELECT c.id, p.geoFk
+ FROM vn.client c
+ JOIN vn.town t ON t.provinceFk = c.provinceFk
+ JOIN vn.postCode p ON p.townFk = t.id
+ AND (p.code = c.postcode OR c.postcode IS NULL)
+ JOIN vn.zoneGeo zg ON zg.id = p.geoFk
+ GROUP BY c.id
+ ORDER BY (c.city SOUNDS LIKE t.`name`) DESC,
+ (p.code = c.postcode) DESC;
+
+UPDATE vn.client c
+ JOIN tmp.tClientGeo tcg ON tcg.id = c.id
+ SET c.geoFk = tcg.geoFk;
+
+DROP TEMPORARY TABLE tmp.tClientGeo;
diff --git a/db/versions/11346-yellowPhormium/02-supplier.sql b/db/versions/11346-yellowPhormium/02-supplier.sql
new file mode 100644
index 000000000..4e866525e
--- /dev/null
+++ b/db/versions/11346-yellowPhormium/02-supplier.sql
@@ -0,0 +1,27 @@
+ALTER TABLE vn.supplier
+ CHANGE companySize companySize enum('small','medium','big') CHARACTER SET utf8mb3
+ COLLATE utf8mb3_general_ci DEFAULT NULL NULL AFTER stamp,
+ ADD geoFk int(11) DEFAULT NULL NULL AFTER companySize,
+ ADD CONSTRAINT supplier_zoneGeo_FK FOREIGN KEY (geoFk)
+ REFERENCES vn.zoneGeo(id) ON DELETE RESTRICT ON UPDATE CASCADE;
+
+CREATE OR REPLACE TEMPORARY TABLE tmp.tSupplierGeo
+ (PRIMARY KEY (id))
+ ENGINE = MEMORY
+ SELECT s.id, p.geoFk
+ FROM vn.supplier s
+ JOIN vn.town t ON t.provinceFk = s.provinceFk
+ JOIN vn.postCode p ON p.townFk = t.id
+ AND (p.code = s.postCode OR s.postCode IS NULL)
+ LEFT JOIN vn.supplierAddress sad ON sad.supplierFk = s.id
+ JOIN vn.zoneGeo zg ON zg.id = p.geoFk
+ GROUP BY s.id
+ ORDER BY (s.city SOUNDS LIKE t.`name`) DESC,
+ (p.code = s.postCode) DESC,
+ (p.code = sad.postalCode) DESC;
+
+UPDATE vn.supplier s
+ JOIN tmp.tSupplierGeo tsg ON tsg.id = s.id
+ SET s.geoFk = tsg.geoFk;
+
+DROP TEMPORARY TABLE tmp.tSupplierGeo;
diff --git a/db/versions/11347-redErica/00-firstScript.sql b/db/versions/11347-redErica/00-firstScript.sql
new file mode 100644
index 000000000..5da1d6096
--- /dev/null
+++ b/db/versions/11347-redErica/00-firstScript.sql
@@ -0,0 +1,9 @@
+DROP TABLE IF EXISTS vn.saySimpleConfig;
+
+CREATE TABLE vn.saySimpleConfig(
+ id INT AUTO_INCREMENT PRIMARY KEY,
+ url VARCHAR(255) NOT NULL,
+ defaultChannel VARCHAR(128)
+);
+
+ALTER TABLE vn.saySimpleCountry MODIFY COLUMN channel VARCHAR(128);
\ No newline at end of file
diff --git a/db/versions/11348-bronzeCamellia/00-firstScript.sql b/db/versions/11348-bronzeCamellia/00-firstScript.sql
new file mode 100644
index 000000000..fa466f1a4
--- /dev/null
+++ b/db/versions/11348-bronzeCamellia/00-firstScript.sql
@@ -0,0 +1,2 @@
+ALTER TABLE vn.clientObservation MODIFY COLUMN observationTypeFk tinyint(3) unsigned DEFAULT 4 NOT NULL;
+UPDATE vn.clientObservation SET observationTypeFk=4 WHERE observationTypeFk=0;
diff --git a/db/versions/11349-azureBamboo/00-firstScript.sql b/db/versions/11349-azureBamboo/00-firstScript.sql
new file mode 100644
index 000000000..09c919b79
--- /dev/null
+++ b/db/versions/11349-azureBamboo/00-firstScript.sql
@@ -0,0 +1,7 @@
+
+
+UPDATE salix.ACL
+ SET principalId = 'deliveryAssistant'
+WHERE model = 'Ticket'
+ AND property = 'updateAttributes'
+ AND principalId = "delivery";
diff --git a/db/versions/11350-silverArborvitae/00-firstScript.sql b/db/versions/11350-silverArborvitae/00-firstScript.sql
new file mode 100644
index 000000000..b5e87133e
--- /dev/null
+++ b/db/versions/11350-silverArborvitae/00-firstScript.sql
@@ -0,0 +1,2 @@
+ALTER TABLE vn.shelvingLog
+ MODIFY COLUMN changedModel enum('Shelving', 'ItemShelving') CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci DEFAULT 'Shelving' NOT NULL;
diff --git a/db/versions/11353-wheatCymbidium/00-firstScript.sql b/db/versions/11353-wheatCymbidium/00-firstScript.sql
new file mode 100644
index 000000000..557ffab9e
--- /dev/null
+++ b/db/versions/11353-wheatCymbidium/00-firstScript.sql
@@ -0,0 +1,15 @@
+
+
+USE vn;
+
+INSERT INTO salix.ACL (model, property, accessType, permission, principalType, principalId)
+VALUES('RouteAction', 'find', 'READ', 'ALLOW', 'ROLE', 'delivery');
+
+INSERT INTO salix.ACL (model, property, accessType, permission, principalType, principalId)
+VALUES('RouteComplement', 'find', 'READ', 'ALLOW', 'ROLE', 'delivery');
+
+INSERT INTO salix.ACL (model, property, accessType, permission, principalType, principalId)
+VALUES('RouteComplement', 'create', 'WRITE', 'ALLOW', 'ROLE', 'delivery');
+
+INSERT INTO salix.ACL (model, property, accessType, permission, principalType, principalId)
+VALUES('RouteComplement', 'deleteById', 'WRITE', 'ALLOW', 'ROLE', 'delivery');
\ No newline at end of file
diff --git a/e2e/paths/04-item/01_summary.spec.js b/e2e/paths/04-item/01_summary.spec.js
deleted file mode 100644
index 51195be48..000000000
--- a/e2e/paths/04-item/01_summary.spec.js
+++ /dev/null
@@ -1,133 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Item summary path', () => {
- let browser;
- let page;
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('employee', 'item');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should search for an item', async() => {
- await page.doSearch('Ranged weapon');
- const resultsCount = await page.countElement(selectors.itemsIndex.searchResult);
-
- await page.waitForTextInElement(selectors.itemsIndex.firstSearchResult, 'Ranged weapon');
- await page.waitToClick(selectors.itemsIndex.firstResultPreviewButton);
- const isVisible = await page.isVisible(selectors.itemSummary.basicData);
-
- expect(resultsCount).toBe(4);
- expect(isVisible).toBeTruthy();
- });
-
- it(`should check the item summary preview shows fields from basic data`, async() => {
- await page.waitForTextInElement(selectors.itemSummary.basicData, 'Ranged weapon longbow 200cm');
- const result = await page.waitToGetProperty(selectors.itemSummary.basicData, 'innerText');
-
- expect(result).toContain('Ranged weapon longbow 200cm');
- });
-
- it(`should check the item summary preview shows fields from tags`, async() => {
- await page.waitForTextInElement(selectors.itemSummary.tags, 'Brown');
- const result = await page.waitToGetProperty(selectors.itemSummary.tags, 'innerText');
-
- expect(result).toContain('Brown');
- });
-
- it(`should check the item summary preview shows fields from botanical`, async() => {
- await page.waitForTextInElement(selectors.itemSummary.botanical, 'Abelia');
- const result = await page.waitToGetProperty(selectors.itemSummary.botanical, 'innerText');
-
- expect(result).toContain('Abelia');
- });
-
- it(`should check the item summary preview shows fields from barcode`, async() => {
- await page.waitForTextInElement(selectors.itemSummary.barcode, '1');
- const result = await page.waitToGetProperty(selectors.itemSummary.barcode, 'innerText');
-
- expect(result).toContain('1');
- });
-
- it(`should close the summary popup`, async() => {
- await page.closePopup();
- await page.waitForSelector(selectors.itemSummary.basicData, {hidden: true});
- });
-
- it('should search for other item', async() => {
- await page.doSearch('Melee Reinforced');
- const resultsCount = await page.countElement(selectors.itemsIndex.searchResult);
-
- await page.waitToClick(selectors.itemsIndex.firstResultPreviewButton);
- await page.waitForSelector(selectors.itemSummary.basicData, {visible: true});
-
- expect(resultsCount).toBe(3);
- });
-
- it(`should now check the item summary preview shows fields from basic data`, async() => {
- await page.waitForTextInElement(selectors.itemSummary.basicData, 'Melee Reinforced weapon combat fist 15cm');
- const result = await page.waitToGetProperty(selectors.itemSummary.basicData, 'innerText');
-
- expect(result).toContain('Melee Reinforced weapon combat fist 15cm');
- });
-
- it(`should now check the item summary preview shows fields from tags`, async() => {
- await page.waitForTextInElement(selectors.itemSummary.tags, 'Silver');
- const result = await page.waitToGetProperty(selectors.itemSummary.tags, 'innerText');
-
- expect(result).toContain('Silver');
- });
-
- it(`should now check the item summary preview shows fields from botanical`, async() => {
- await page.waitForTextInElement(selectors.itemSummary.botanical, '-');
- const result = await page.waitToGetProperty(selectors.itemSummary.botanical, 'innerText');
-
- expect(result).toContain('-');
- });
-
- it(`should now close the summary popup`, async() => {
- await page.closePopup();
- await page.waitForSelector(selectors.itemSummary.basicData, {hidden: true});
- });
-
- it(`should navigate to one of the items detailed section`, async() => {
- await page.accessToSearchResult('Melee weapon combat fist 15cm');
- await page.waitForState('item.card.summary');
- });
-
- it(`should check the descritor edit button is not visible for employee`, async() => {
- const visibleButton = await page.isVisible(selectors.itemDescriptor.editButton);
-
- expect(visibleButton).toBeFalsy();
- });
-
- it(`should check the item summary shows fields from basic data section`, async() => {
- await page.waitForTextInElement(selectors.itemSummary.basicData, 'Melee weapon combat fist 15cm');
- const result = await page.waitToGetProperty(selectors.itemSummary.basicData, 'innerText');
-
- expect(result).toContain('Melee weapon combat fist 15cm');
- });
-
- it(`should check the item summary shows fields from tags section`, async() => {
- const result = await page.waitToGetProperty(selectors.itemSummary.tags, 'innerText');
-
- expect(result).toContain('Silver');
- });
-
- it(`should check the item summary shows fields from botanical section`, async() => {
- const result = await page.waitToGetProperty(selectors.itemSummary.botanical, 'innerText');
-
- expect(result).toContain('procera');
- });
-
- it(`should check the item summary shows fields from barcodes section`, async() => {
- const result = await page.waitToGetProperty(selectors.itemSummary.barcode, 'innerText');
-
- expect(result).toContain('4');
- });
-});
diff --git a/e2e/paths/04-item/02_basic_data.spec.js b/e2e/paths/04-item/02_basic_data.spec.js
deleted file mode 100644
index 3bad18303..000000000
--- a/e2e/paths/04-item/02_basic_data.spec.js
+++ /dev/null
@@ -1,64 +0,0 @@
-import getBrowser from '../../helpers/puppeteer';
-
-const $ = {
- form: 'vn-item-basic-data form',
- intrastatForm: '.vn-dialog.shown form',
- newIntrastatButton: 'vn-item-basic-data vn-icon-button[vn-tooltip="New intrastat"] > button'
-};
-
-describe('Item Edit basic data path', () => {
- let browser;
- let page;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('buyer', 'item');
- await page.accessToSearchResult('Melee weapon combat fist 15cm');
- });
-
- beforeEach(async() => {
- await page.accessToSection('item.card.basicData');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it(`should edit the item basic data and confirm the item data was edited`, async() => {
- const values = {
- type: 'Anthurium',
- intrastat: 'Coral y materiales similares',
- relevancy: 1,
- generic: 'Pallet',
- isActive: false,
- priceInKg: true,
- isFragile: true,
- packingOut: 5
- };
-
- const message = await page.sendForm($.form, values);
- await page.reloadSection('item.card.basicData');
- const formValues = await page.fetchForm($.form, Object.keys(values));
-
- expect(message.isSuccess).toBeTrue();
- expect(formValues).toEqual(values);
- });
-
- it(`should create a new intrastat and save it`, async() => {
- await page.click($.newIntrastatButton);
- await page.waitForSelector($.intrastatForm);
- await page.fillForm($.intrastatForm, {
- id: '588420239',
- description: 'Tropical Flowers'
- });
- await page.respondToDialog('accept');
-
- const message = await page.sendForm($.form);
- await page.reloadSection('item.card.basicData');
- const formValues = await page.fetchForm($.form, ['intrastat']);
-
- expect(message.isSuccess).toBeTrue();
- expect(formValues).toEqual({intrastat: 'Tropical Flowers'});
- });
-});
diff --git a/e2e/paths/04-item/03_tax.spec.js b/e2e/paths/04-item/03_tax.spec.js
deleted file mode 100644
index 6013094e9..000000000
--- a/e2e/paths/04-item/03_tax.spec.js
+++ /dev/null
@@ -1,48 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Item edit tax path', () => {
- let browser;
- let page;
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('buyer', 'item');
- await page.accessToSearchResult('Ranged weapon longbow 200cm');
- await page.accessToSection('item.card.tax');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it(`should add the item tax to all countries`, async() => {
- await page.autocompleteSearch(selectors.itemTax.firstClass, 'General VAT');
- await page.autocompleteSearch(selectors.itemTax.secondClass, 'General VAT');
- await page.waitToClick(selectors.itemTax.submitTaxButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it(`should confirm the first item tax class was edited`, async() => {
- await page.reloadSection('item.card.tax');
- const firstVatType = await page.waitToGetProperty(selectors.itemTax.firstClass, 'value');
-
- expect(firstVatType).toEqual('General VAT');
- });
-
- it(`should confirm the second item tax class was edited`, async() => {
- const secondVatType = await page
- .waitToGetProperty(selectors.itemTax.secondClass, 'value');
-
- expect(secondVatType).toEqual('General VAT');
- });
-
- it(`should edit the first class without saving the form`, async() => {
- await page.autocompleteSearch(selectors.itemTax.firstClass, 'Reduced VAT');
- const firstVatType = await page.waitToGetProperty(selectors.itemTax.firstClass, 'value');
-
- expect(firstVatType).toEqual('Reduced VAT');
- });
-});
diff --git a/e2e/paths/04-item/04_tags.spec.js b/e2e/paths/04-item/04_tags.spec.js
deleted file mode 100644
index f13cf9aa4..000000000
--- a/e2e/paths/04-item/04_tags.spec.js
+++ /dev/null
@@ -1,79 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Item create tags path', () => {
- let browser;
- let page;
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('buyer', 'item');
- await page.accessToSearchResult('Ranged weapon longbow 200cm');
- await page.accessToSection('item.card.tags');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should create a new tag and delete a former one', async() => {
- await page.waitToClick(selectors.itemTags.fourthRemoveTagButton);
- await page.waitToClick(selectors.itemTags.addItemTagButton);
- await page.autocompleteSearch(selectors.itemTags.seventhTag, 'Ancho de la base');
- await page.write(selectors.itemTags.seventhValue, '50');
- await page.clearInput(selectors.itemTags.seventhRelevancy);
- await page.write(selectors.itemTags.seventhRelevancy, '4');
- await page.waitToClick(selectors.itemTags.submitItemTagsButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should confirm the fourth row data is the expected one', async() => {
- await page.reloadSection('item.card.tags');
- await page.waitForSelector('vn-item-tags');
- let result = await page.waitToGetProperty(selectors.itemTags.fourthTag, 'value');
-
- expect(result).toEqual('Ancho de la base');
-
- result = await page
- .waitToGetProperty(selectors.itemTags.fourthValue, 'value');
-
- expect(result).toEqual('50');
-
- result = await page
- .waitToGetProperty(selectors.itemTags.fourthRelevancy, 'value');
-
- expect(result).toEqual('4');
- });
-
- it('should confirm the fifth row data is the expected one', async() => {
- let tag = await page
- .waitToGetProperty(selectors.itemTags.fifthTag, 'value');
-
- let value = await page
- .waitToGetProperty(selectors.itemTags.fifthValue, 'value');
-
- let relevancy = await page
- .waitToGetProperty(selectors.itemTags.fifthRelevancy, 'value');
-
- expect(tag).toEqual('Color');
- expect(value).toEqual('Brown');
- expect(relevancy).toEqual('5');
- });
-
- it('should confirm the sixth row data is the expected one', async() => {
- let tag = await page
- .waitToGetProperty(selectors.itemTags.sixthTag, 'value');
-
- let value = await page
- .waitToGetProperty(selectors.itemTags.sixthValue, 'value');
-
- let relevancy = await page
- .waitToGetProperty(selectors.itemTags.sixthRelevancy, 'value');
-
- expect(tag).toEqual('Categoria');
- expect(value).toEqual('+1 precission');
- expect(relevancy).toEqual('6');
- });
-});
diff --git a/e2e/paths/04-item/05_botanical.spec.js b/e2e/paths/04-item/05_botanical.spec.js
deleted file mode 100644
index 1671cc5d2..000000000
--- a/e2e/paths/04-item/05_botanical.spec.js
+++ /dev/null
@@ -1,66 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Item Create botanical path', () => {
- let browser;
- let page;
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('buyer', 'item');
- await page.accessToSearchResult('Ranged weapon pistol 9mm');
- await page.accessToSection('item.card.botanical');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it(`should create a new botanical for the item`, async() => {
- await page.autocompleteSearch(selectors.itemBotanical.genus, 'Abelia');
- await page.autocompleteSearch(selectors.itemBotanical.species, 'dealbata');
- await page.waitToClick(selectors.itemBotanical.submitBotanicalButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it(`should confirm the Genus for the item was created`, async() => {
- await page.waitForTextInField(selectors.itemBotanical.genus, 'Abelia');
- const result = await page
- .waitToGetProperty(selectors.itemBotanical.genus, 'value');
-
- expect(result).toEqual('Abelia');
- });
-
- it(`should confirm the Species for the item was created`, async() => {
- const result = await page
- .waitToGetProperty(selectors.itemBotanical.species, 'value');
-
- expect(result).toEqual('dealbata');
- });
-
- it(`should edit botanical for the item`, async() => {
- await page.autocompleteSearch(selectors.itemBotanical.genus, 'Abies');
- await page.autocompleteSearch(selectors.itemBotanical.species, 'decurrens');
- await page.waitToClick(selectors.itemBotanical.submitBotanicalButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it(`should confirm the Genus for the item was edited`, async() => {
- await page.waitForTextInField(selectors.itemBotanical.genus, 'Abies');
- const result = await page
- .waitToGetProperty(selectors.itemBotanical.genus, 'value');
-
- expect(result).toEqual('Abies');
- });
-
- it(`should confirm the Species for the item was edited`, async() => {
- const result = await page
- .waitToGetProperty(selectors.itemBotanical.species, 'value');
-
- expect(result).toEqual('decurrens');
- });
-});
diff --git a/e2e/paths/04-item/06_barcode.spec.js b/e2e/paths/04-item/06_barcode.spec.js
deleted file mode 100644
index 36c9c39ae..000000000
--- a/e2e/paths/04-item/06_barcode.spec.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Item Create barcodes path', () => {
- let browser;
- let page;
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('buyer', 'item');
- await page.accessToSearchResult('Ranged weapon longbow 200cm');
- await page.accessToSection('item.card.itemBarcode');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it(`should click create a new code and delete a former one`, async() => {
- await page.waitToClick(selectors.itemBarcodes.firstCodeRemoveButton);
- await page.waitToClick(selectors.itemBarcodes.addBarcodeButton);
- await page.write(selectors.itemBarcodes.thirdCode, '5');
- await page.waitToClick(selectors.itemBarcodes.submitBarcodesButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it(`should confirm the barcode 5 is created and it is now the third barcode as the first was deleted`, async() => {
- await page.reloadSection('item.card.itemBarcode');
- await page.waitForTextInField(selectors.itemBarcodes.thirdCode, '5');
- const result = await page
- .waitToGetProperty(selectors.itemBarcodes.thirdCode, 'value');
-
- expect(result).toEqual('5');
- });
-});
diff --git a/e2e/paths/04-item/07_create.spec.js b/e2e/paths/04-item/07_create.spec.js
deleted file mode 100644
index c20be9ebc..000000000
--- a/e2e/paths/04-item/07_create.spec.js
+++ /dev/null
@@ -1,65 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-const $ = {
- form: 'vn-item-create form'
-};
-
-describe('Item Create', () => {
- let browser;
- let page;
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('buyer', 'item');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should access to the create item view by clicking the create floating button', async() => {
- await page.waitToClick(selectors.itemsIndex.createItemButton);
- await page.waitForState('item.create');
- });
-
- it('should return to the item index by clickig the cancel button', async() => {
- await page.waitToClick(selectors.itemCreateView.cancelButton);
- await page.waitForState('item.index');
- });
-
- it('should now access to the create item view by clicking the create floating button', async() => {
- await page.waitToClick(selectors.itemsIndex.createItemButton);
- await page.waitForState('item.create');
- });
-
- it('should throw an error when insert an invalid priority', async() => {
- const values = {
- name: 'Infinity Gauntlet',
- type: 'Crisantemo',
- intrastat: 'Coral y materiales similares',
- origin: 'Holand',
- priority: null
- };
- const message = await page.sendForm($.form, values);
-
- expect(message.text).toContain('Valid priorities');
- });
-
- it('should create the Infinity Gauntlet item', async() => {
- const values = {
- name: 'Infinity Gauntlet',
- type: 'Crisantemo',
- intrastat: 'Coral y materiales similares',
- origin: 'Holand',
- priority: '2'
- };
-
- await page.fillForm($.form, values);
- const formValues = await page.fetchForm($.form, Object.keys(values));
- const message = await page.sendForm($.form);
-
- expect(message.isSuccess).toBeTrue();
- expect(formValues).toEqual(values);
- });
-});
diff --git a/e2e/paths/04-item/08_regularize.spec.js b/e2e/paths/04-item/08_regularize.spec.js
deleted file mode 100644
index 9b3074776..000000000
--- a/e2e/paths/04-item/08_regularize.spec.js
+++ /dev/null
@@ -1,141 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Item regularize path', () => {
- let browser;
- let page;
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('employee', 'item');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should edit the user local warehouse', async() => {
- await page.waitForSpinnerLoad();
- await page.waitToClick(selectors.globalItems.userMenuButton);
- await page.autocompleteSearch(selectors.globalItems.userLocalWarehouse, 'Warehouse Four');
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should check the local settings were saved', async() => {
- const userLocalWarehouse = await page
- .waitToGetProperty(selectors.globalItems.userLocalWarehouse, 'value');
-
- await page.closePopup();
-
- expect(userLocalWarehouse).toContain('Warehouse Four');
- });
-
- it('should search for a specific item', async() => {
- await page.accessToSearchResult('Ranged weapon pistol 9mm');
- await page.waitForState('item.card.summary');
- });
-
- it('should open the regularize dialog and check the warehouse matches the local user settings', async() => {
- await page.waitToClick(selectors.itemDescriptor.moreMenu);
- await page.waitToClick(selectors.itemDescriptor.moreMenuRegularizeButton);
- const result = await page.waitToGetProperty(selectors.itemDescriptor.regularizeWarehouse, 'value');
-
- expect(result).toEqual('Warehouse Four');
- });
-
- it('should regularize the item', async() => {
- await page.write(selectors.itemDescriptor.regularizeQuantity, '100');
- await page.autocompleteSearch(selectors.itemDescriptor.regularizeWarehouse, 'Warehouse One');
- await page.waitToClick(selectors.itemDescriptor.regularizeSaveButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should click on the Tickets button of the top bar menu', async() => {
- await page.waitToClick(selectors.globalItems.applicationsMenuButton);
- await page.waitForSelector(selectors.globalItems.applicationsMenuVisible);
- await Promise.all([
- page.waitForNavigation({waitUntil: ['load', 'networkidle0', 'domcontentloaded']}),
- page.waitToClick(selectors.globalItems.ticketsButton)
- ]);
- await page.waitForState('ticket.index');
- });
-
- it('should clear the user local settings now', async() => {
- await page.waitToClick(selectors.globalItems.userMenuButton);
- await page.waitForContentLoaded();
- await page.clearInput(selectors.globalItems.userConfigFirstAutocomplete);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should search for the ticket with alias missing', async() => {
- await page.keyboard.press('Escape');
- await page.accessToSearchResult('missing');
- await page.waitForState('ticket.card.summary');
- });
-
- it(`should check the ticket sale quantity is showing a negative value`, async() => {
- await page.waitForTextInElement(selectors.ticketSummary.firstSaleQuantity, '-100');
- const result = await page
- .waitToGetProperty(selectors.ticketSummary.firstSaleQuantity, 'innerText');
-
- expect(result).toContain('-100');
- });
-
- it(`should check the ticket sale discount is 100%`, async() => {
- const result = await page
- .waitToGetProperty(selectors.ticketSummary.firstSaleDiscount, 'innerText');
-
- expect(result).toContain('100 %');
- });
-
- it('should now click on the Items button of the top bar menu', async() => {
- await page.waitToClick(selectors.globalItems.applicationsMenuButton);
- await page.waitForSelector(selectors.globalItems.applicationsMenuVisible);
- await page.waitToClick(selectors.globalItems.itemsButton);
- await page.waitForState('item.index');
- });
-
- it('should search for the item once again', async() => {
- await page.accessToSearchResult('Ranged weapon pistol 9mm');
- await page.waitForState('item.card.summary');
- });
-
- it('should regularize the item once more', async() => {
- await page.waitToClick(selectors.itemDescriptor.moreMenu);
- await page.waitToClick(selectors.itemDescriptor.moreMenuRegularizeButton);
- await page.write(selectors.itemDescriptor.regularizeQuantity, '100');
- await page.autocompleteSearch(selectors.itemDescriptor.regularizeWarehouse, 'Warehouse One');
- await page.waitToClick(selectors.itemDescriptor.regularizeSaveButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should again click on the Tickets button of the top bar menu', async() => {
- await page.waitToClick(selectors.globalItems.applicationsMenuButton);
- await page.waitForSelector(selectors.globalItems.applicationsMenuVisible);
- await Promise.all([
- page.waitForNavigation({waitUntil: ['load', 'networkidle0', 'domcontentloaded']}),
- page.waitToClick(selectors.globalItems.ticketsButton)
- ]);
- await page.waitForState('ticket.index');
- });
-
- it('should search for the ticket missing once again', async() => {
- await page.accessToSearchResult('Missing');
- await page.waitForState('ticket.card.summary');
- });
-
- it(`should check the ticket contains now two sales`, async() => {
- await page.waitForTextInElement(selectors.ticketSummary.firstSaleQuantity, '-100');
- const result = await page.countElement(selectors.ticketSummary.sale);
-
- expect(result).toEqual(2);
- });
-});
diff --git a/e2e/paths/04-item/09_index.spec.js b/e2e/paths/04-item/09_index.spec.js
deleted file mode 100644
index 6e0a4bd5c..000000000
--- a/e2e/paths/04-item/09_index.spec.js
+++ /dev/null
@@ -1,84 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Item index path', () => {
- let browser;
- let page;
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('salesPerson', 'item');
- await page.waitToClick(selectors.globalItems.searchButton);
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should click on the fields to show button to open the list of columns to show', async() => {
- await page.waitToClick(selectors.itemsIndex.shownColumns);
- const visible = await page.isVisible(selectors.itemsIndex.shownColumnsList);
-
- expect(visible).toBeTruthy();
- });
-
- it('should unmark all checkboxes except the first and the last ones', async() => {
- await page.waitToClick(selectors.itemsIndex.idCheckbox);
- await page.waitToClick(selectors.itemsIndex.stemsCheckbox);
- await page.waitToClick(selectors.itemsIndex.sizeCheckbox);
- await page.waitToClick(selectors.itemsIndex.typeCheckbox);
- await page.waitToClick(selectors.itemsIndex.categoryCheckbox);
- await page.waitToClick(selectors.itemsIndex.intrastadCheckbox);
- await page.waitToClick(selectors.itemsIndex.originCheckbox);
- await page.waitToClick(selectors.itemsIndex.buyerCheckbox);
- await page.waitToClick(selectors.itemsIndex.weightByPieceCheckbox);
- await page.waitToClick(selectors.itemsIndex.saveFieldsButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should navigate forth and back to see the images column is still visible', async() => {
- await page.closePopup();
- await page.waitToClick(selectors.itemsIndex.firstSearchResult);
- await page.waitToClick(selectors.itemDescriptor.goBackToModuleIndexButton);
- await page.waitToClick(selectors.globalItems.searchButton);
- await page.waitForSelector(selectors.itemsIndex.searchResult);
- await page.waitImgLoad(selectors.itemsIndex.firstItemImage);
- const imageVisible = await page.isVisible(selectors.itemsIndex.firstItemImageTd);
-
- expect(imageVisible).toBeTruthy();
- });
-
- it('should check the ids column is not visible', async() => {
- await page.waitForSelector(selectors.itemsIndex.firstItemId, {hidden: true});
- });
-
- it('should mark all unchecked boxes to leave the index as it was', async() => {
- await page.waitToClick(selectors.itemsIndex.shownColumns);
- await page.waitToClick(selectors.itemsIndex.idCheckbox);
- await page.waitToClick(selectors.itemsIndex.stemsCheckbox);
- await page.waitToClick(selectors.itemsIndex.sizeCheckbox);
- await page.waitToClick(selectors.itemsIndex.typeCheckbox);
- await page.waitToClick(selectors.itemsIndex.categoryCheckbox);
- await page.waitToClick(selectors.itemsIndex.intrastadCheckbox);
- await page.waitToClick(selectors.itemsIndex.originCheckbox);
- await page.waitToClick(selectors.itemsIndex.buyerCheckbox);
- await page.waitToClick(selectors.itemsIndex.weightByPieceCheckbox);
- await page.waitToClick(selectors.itemsIndex.saveFieldsButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should now navigate forth and back to see the ids column is now visible', async() => {
- await page.closePopup();
- await page.waitToClick(selectors.itemsIndex.firstSearchResult);
- await page.waitToClick(selectors.itemDescriptor.goBackToModuleIndexButton);
- await page.waitToClick(selectors.globalItems.searchButton);
- await page.waitForSelector(selectors.itemsIndex.searchResult);
- const idVisible = await page.isVisible(selectors.itemsIndex.firstItemId);
-
- expect(idVisible).toBeTruthy();
- });
-});
diff --git a/e2e/paths/04-item/10_item_log.spec.js b/e2e/paths/04-item/10_item_log.spec.js
deleted file mode 100644
index c88fbd337..000000000
--- a/e2e/paths/04-item/10_item_log.spec.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Item log path', () => {
- let browser;
- let page;
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('developer', 'item');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it(`should search for the Knowledge artifact to confirm it isn't created yet`, async() => {
- await page.doSearch('Knowledge artifact');
- const nResults = await page.countElement(selectors.itemsIndex.searchResult);
-
- expect(nResults).toEqual(1);
- });
-
- it('should access to the create item view by clicking the create floating button', async() => {
- await page.waitToClick(selectors.itemsIndex.createItemButton);
- await page.waitForState('item.create');
- });
-
- it('should create the Knowledge artifact item', async() => {
- await page.write(selectors.itemCreateView.temporalName, 'Knowledge artifact');
- await page.autocompleteSearch(selectors.itemCreateView.type, 'Crisantemo');
- await page.autocompleteSearch(selectors.itemCreateView.intrastat, 'Coral y materiales similares');
- await page.autocompleteSearch(selectors.itemCreateView.origin, 'Holand');
- await page.waitToClick(selectors.itemCreateView.createButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should return to the items index by clicking the return to items button', async() => {
- await page.waitToClick(selectors.itemBasicData.goToItemIndexButton);
- await page.waitForSelector(selectors.itemsIndex.createItemButton);
- await page.waitForState('item.index');
- });
-});
diff --git a/e2e/paths/04-item/11_descriptor.spec.js b/e2e/paths/04-item/11_descriptor.spec.js
deleted file mode 100644
index eb9ed2573..000000000
--- a/e2e/paths/04-item/11_descriptor.spec.js
+++ /dev/null
@@ -1,41 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Item descriptor path', () => {
- let browser;
- let page;
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('buyer', 'item');
- await page.accessToSearchResult('1');
- await page.accessToSection('item.card.basicData');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should set the item to inactive', async() => {
- await page.waitToClick(selectors.itemBasicData.isActiveCheckbox);
- await page.waitToClick(selectors.itemBasicData.submitBasicDataButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should reload the section and check the inactive icon is visible', async() => {
- await page.reloadSection('item.card.basicData');
- const visibleIcon = await page.isVisible(selectors.itemDescriptor.inactiveIcon);
-
- expect(visibleIcon).toBeTruthy();
- });
-
- it('should set the item back to active', async() => {
- await page.waitToClick(selectors.itemBasicData.isActiveCheckbox);
- await page.waitToClick(selectors.itemBasicData.submitBasicDataButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-});
diff --git a/e2e/paths/04-item/12_request.spec.js b/e2e/paths/04-item/12_request.spec.js
deleted file mode 100644
index e0f3a1b45..000000000
--- a/e2e/paths/04-item/12_request.spec.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Item request path', () => {
- let browser;
- let page;
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('buyer', 'item');
- await page.accessToSection('item.request');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should reach the item request section', async() => {
- await page.waitForState('item.request');
- });
-
- it('should fill the id and quantity then check the concept was updated', async() => {
- await page.writeOnEditableTD(selectors.itemRequest.firstRequestItemID, '4');
- await page.writeOnEditableTD(selectors.itemRequest.firstRequestQuantity, '10');
- await page.waitForTextInElement(selectors.itemRequest.firstRequestConcept, 'Melee weapon heavy shield 100cm');
- let filledConcept = await page.waitToGetProperty(selectors.itemRequest.firstRequestConcept, 'innerText');
-
- expect(filledConcept).toContain('Melee weapon heavy shield 100cm');
- });
-
- it('should check the status of the request should now be accepted', async() => {
- let status = await page.waitToGetProperty(selectors.itemRequest.firstRequestStatus, 'innerText');
-
- expect(status).toContain('Accepted');
- });
-
- it('should now click on the second declain request icon then type the reason', async() => {
- await page.waitToClick(selectors.itemRequest.secondRequestDecline);
- await page.write(selectors.itemRequest.declineReason, 'Not quite as expected');
- await page.respondToDialog('accept');
- let status = await page.waitToGetProperty(selectors.itemRequest.secondRequestStatus, 'innerText');
-
- expect(status).toContain('Denied');
- });
-});
diff --git a/e2e/paths/04-item/13_fixedPrice.spec.js b/e2e/paths/04-item/13_fixedPrice.spec.js
deleted file mode 100644
index f36138e18..000000000
--- a/e2e/paths/04-item/13_fixedPrice.spec.js
+++ /dev/null
@@ -1,97 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-const $ = selectors.itemFixedPrice;
-
-describe('Item fixed prices path', () => {
- let browser;
- let page;
- let httpRequest;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('buyer', 'item');
- await page.accessToSection('item.fixedPrice');
- page.on('request', req => {
- if (req.url().includes(`FixedPrices/filter`))
- httpRequest = req.url();
- });
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should filter using all the fields', async() => {
- await page.write($.generalSearchFilter, 'item');
- await page.keyboard.press('Enter');
-
- expect(httpRequest).toContain('search=item');
-
- await page.click($.chip);
- await page.click($.reignFilter);
-
- expect(httpRequest).toContain('categoryFk');
-
- await page.autocompleteSearch($.typeFilter, 'Alstroemeria');
-
- expect(httpRequest).toContain('typeFk');
-
- await page.click($.chip);
- await page.autocompleteSearch($.buyerFilter, 'buyerNick');
-
- expect(httpRequest).toContain('buyerFk');
-
- await page.click($.chip);
- await page.autocompleteSearch($.warehouseFilter, 'Algemesi');
-
- expect(httpRequest).toContain('warehouseFk');
-
- await page.click($.chip);
- await page.click($.mineFilter);
-
- expect(httpRequest).toContain('mine=true');
-
- await page.click($.chip);
- await page.click($.hasMinPriceFilter);
-
- expect(httpRequest).toContain('hasMinPrice=true');
-
- await page.click($.chip);
- await page.click($.addTag);
- await page.autocompleteSearch($.tagFilter, 'Color');
- await page.autocompleteSearch($.tagValueFilter, 'Brown');
-
- expect(httpRequest).toContain('tags');
-
- await page.click($.chip);
- });
-
- it('should click on the add new fixed price button', async() => {
- await page.waitToClick($.add);
- await page.waitForSelector($.fourthFixedPrice);
- });
-
- it('should fill the fixed price data', async() => {
- const now = Date.vnNew();
- await page.autocompleteSearch($.fourthWarehouse, 'Warehouse one');
- await page.writeOnEditableTD($.fourthGroupingPrice, '1');
- await page.writeOnEditableTD($.fourthPackingPrice, '1');
- await page.write($.fourthMinPrice, '1');
- await page.pickDate($.fourthStarted, now);
- await page.pickDate($.fourthEnded, now);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should reload the section and check the created price has the expected ID', async() => {
- await page.goto(`http://localhost:5000/#!/item/fixed-price`);
- await page.autocompleteSearch($.warehouseFilter, 'Warehouse one');
- await page.click($.chip);
- const result = await page.waitToGetProperty($.fourthItemID, 'value');
-
- expect(result).toContain('13');
- });
-});
diff --git a/e2e/paths/05-ticket/01-sale/01_list_sales.spec.js b/e2e/paths/05-ticket/01-sale/01_list_sales.spec.js
deleted file mode 100644
index ad0975889..000000000
--- a/e2e/paths/05-ticket/01-sale/01_list_sales.spec.js
+++ /dev/null
@@ -1,99 +0,0 @@
-import selectors from '../../../helpers/selectors.js';
-import getBrowser from '../../../helpers/puppeteer';
-
-describe('Ticket List sale path', () => {
- let browser;
- let page;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('employee', 'ticket');
- await page.accessToSearchResult('13');
- await page.accessToSection('ticket.card.sale');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should confirm the first ticket sale contains the colour tag', async() => {
- const value = await page
- .waitToGetProperty(selectors.ticketSales.firstSaleColour, 'innerText');
-
- expect(value).toContain('Black');
- });
-
- it('should confirm the first sale contains the price', async() => {
- const value = await page
- .waitToGetProperty(selectors.ticketSales.firstSalePrice, 'innerText');
-
- expect(value).toContain('1.72');
- });
-
- it('should confirm the first sale contains the discount', async() => {
- const value = await page
- .waitToGetProperty(selectors.ticketSales.firstSaleDiscount, 'innerText');
-
- expect(value).toContain('0.00%');
- });
-
- it('should confirm the first sale contains the total import', async() => {
- const value = await page
- .waitToGetProperty(selectors.ticketSales.firstSaleImport, 'innerText');
-
- expect(value).toContain('34.40');
- });
-
- it('should add an empty item to the sale list', async() => {
- await page.waitToClick(selectors.ticketSales.newItemButton);
- const sales = await page
- .countElement(selectors.ticketSales.saleLine);
-
- expect(sales).toEqual(2);
- });
-
- it('should select a valid item to be added as the second item in the sales list', async() => {
- let searchValue = 'Melee weapon heavy shield 100cm';
- await page.autocompleteSearch(selectors.ticketSales.secondSaleIdAutocomplete, searchValue);
- await page.waitToClick(selectors.ticketSales.secondSaleQuantityCell);
- await page.type(selectors.ticketSales.secondSaleQuantity, '8');
- await page.keyboard.press('Enter');
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should update the description of the new sale', async() => {
- await page.click(selectors.ticketSales.secondSaleConceptCell);
- await page.write(selectors.ticketSales.secondSaleConceptInput, 'Aegis of Valor');
- await page.keyboard.press('Enter');
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should add a third empty item to the sale list', async() => {
- await page.waitToClick(selectors.ticketSales.newItemButton);
- await page.waitForNumberOfElements(selectors.ticketSales.saleLine, 3);
- const sales = await page.countElement(selectors.ticketSales.saleLine);
-
- expect(sales).toEqual(3);
- });
-
- it('should select the 2nd and 3th item and delete both', async() => {
- await page.waitToClick(selectors.ticketSales.secondSaleCheckbox);
- await page.waitToClick(selectors.ticketSales.thirdSaleCheckbox);
- await page.waitToClick(selectors.ticketSales.deleteSaleButton);
- await page.waitToClick(selectors.globalItems.acceptButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it(`should verify there's only 1 single line remaining`, async() => {
- const sales = await page.countElement(selectors.ticketSales.saleLine);
-
- expect(sales).toEqual(1);
- });
-});
diff --git a/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js b/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js
deleted file mode 100644
index d9689e31a..000000000
--- a/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js
+++ /dev/null
@@ -1,415 +0,0 @@
-import selectors from '../../../helpers/selectors.js';
-import getBrowser from '../../../helpers/puppeteer';
-
-describe('Ticket Edit sale path', () => {
- let browser;
- let page;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('salesPerson', 'ticket');
- await page.accessToSearchResult('16');
- await page.accessToSection('ticket.card.sale');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it(`should click on the first sale claim icon to navigate over there`, async() => {
- await page.waitToClick(selectors.ticketSales.firstSaleClaimIcon);
- await page.waitForNavigation();
- await page.goBack();
- await page.goBack();
- });
-
- it('should navigate to the tickets index', async() => {
- await page.waitToClick(selectors.globalItems.applicationsMenuButton);
- await page.waitForSelector(selectors.globalItems.applicationsMenuVisible);
- await page.waitToClick(selectors.globalItems.ticketsButton);
- await page.waitForState('ticket.index');
- });
-
- it(`should search for a ticket and then navigate to it's sales`, async() => {
- await page.accessToSearchResult('16');
- await page.accessToSection('ticket.card.sale');
- });
-
- it(`should set the ticket as libre`, async() => {
- const searchValue = 'libre';
- await page.waitToClick(selectors.ticketSales.stateMenuButton);
- await page.write(selectors.ticketSales.moreMenuState, searchValue);
- try {
- await page.waitForFunction(searchValue => {
- const element = document.querySelector('li.active');
- if (element)
- return element.innerText.toLowerCase().includes(searchValue.toLowerCase());
- }, {}, searchValue);
- } catch (error) {
- const builtSelector = await page.selectorFormater(selectors.ticketSales.moreMenuState);
- const inputValue = await page.evaluate(() => {
- return document.querySelector('.vn-drop-down.shown vn-textfield input').value;
- });
- throw new Error(`${builtSelector} value is ${inputValue}! ${error}`);
- }
- await page.waitForState('ticket.card.sale');
- await page.keyboard.press('Enter');
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it(`should check it's state is libre now`, async() => {
- await page.waitForTextInElement(selectors.ticketDescriptor.stateLabelValue, 'Libre');
- const result = await page.waitToGetProperty(selectors.ticketDescriptor.stateLabelValue, 'innerText');
-
- expect(result).toEqual('State Libre');
- });
-
- it(`should set the ticket as OK`, async() => {
- await page.waitToClick(selectors.ticketSales.setOk);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it(`should check it's state is OK now`, async() => {
- await page.waitForTextInElement(selectors.ticketDescriptor.stateLabelValue, 'OK');
- const result = await page.waitToGetProperty(selectors.ticketDescriptor.stateLabelValue, 'innerText');
-
- expect(result).toEqual('State OK');
- });
-
- it(`should check the zoomed image isn't present`, async() => {
- const result = await page.countElement(selectors.ticketSales.firstSaleZoomedImage);
-
- expect(result).toEqual(0);
- });
-
- it(`should click on the thumbnail image of the 1st sale and see the zoomed image`, async() => {
- await page.waitToClick(selectors.ticketSales.firstSaleThumbnailImage);
- const result = await page.countElement(selectors.ticketSales.firstSaleZoomedImage);
-
- expect(result).toEqual(1);
- });
-
- it(`should click on the zoomed image to close it`, async() => {
- await page.waitToClick(selectors.ticketSales.firstSaleZoomedImage);
- const result = await page.countElement(selectors.ticketSales.firstSaleZoomedImage);
-
- expect(result).toEqual(0);
- });
-
- it(`should click on the first sale ID making now the item descriptor visible`, async() => {
- await page.waitToClick(selectors.ticketSales.firstSaleId);
- await page.waitImgLoad(selectors.ticketSales.firstSaleDescriptorImage);
- const visible = await page.isVisible(selectors.ticketSales.saleDescriptorPopover);
-
- expect(visible).toBeTruthy();
- });
-
- it(`should click on the descriptor image of the 1st sale and see the zoomed image`, async() => {
- await page.waitToClick('vn-item-descriptor img');
- const result = await page.countElement(selectors.ticketSales.firstSaleZoomedImage);
-
- expect(result).toEqual(1);
- });
-
- it(`should now click on the zoomed image to close it`, async() => {
- await page.waitToClick(selectors.ticketSales.firstSaleZoomedImage);
- const result = await page.countElement(selectors.ticketSales.firstSaleZoomedImage);
-
- expect(result).toEqual(0);
- });
-
- it(`should click on the summary icon of the item-descriptor to access to the item summary`, async() => {
- await page.waitToClick(selectors.ticketSales.saleDescriptorPopoverSummaryButton);
- await page.waitForState('item.card.summary');
- });
-
- it('should return to ticket sales section', async() => {
- await page.waitToClick(selectors.globalItems.applicationsMenuButton);
- await page.waitForSelector(selectors.globalItems.applicationsMenuVisible);
- await page.waitToClick(selectors.globalItems.ticketsButton);
- await page.accessToSearchResult('16');
- await page.accessToSection('ticket.card.sale');
- });
-
- it('should remove 1 from the first sale quantity', async() => {
- await page.waitToClick(selectors.ticketSales.firstSaleQuantityCell);
- await page.waitForSelector(selectors.ticketSales.firstSaleQuantity);
- await page.type(selectors.ticketSales.firstSaleQuantity, '9\u000d');
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should update the price', async() => {
- await page.waitToClick(selectors.ticketSales.firstSalePrice);
- await page.waitForSelector(selectors.ticketSales.firstSalePriceInput);
- await page.type(selectors.ticketSales.firstSalePriceInput, '5\u000d');
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should confirm the price have been updated', async() => {
- const result = await page.waitToGetProperty(selectors.ticketSales.firstSalePrice, 'innerText');
-
- expect(result).toContain('5.00');
- });
-
- it('should confirm the total price for that item have been updated', async() => {
- const result = await page.waitToGetProperty(selectors.ticketSales.firstSaleImport, 'innerText');
-
- expect(result).toContain('45.00');
- });
-
- it('should update the discount', async() => {
- await page.waitToClick(selectors.ticketSales.firstSaleDiscount);
- await page.waitForSelector(selectors.ticketSales.firstSaleDiscountInput);
- await page.type(selectors.ticketSales.firstSaleDiscountInput, '50');
- await page.waitToClick(selectors.ticketSales.saveSaleDiscountButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should confirm the discount have been updated', async() => {
- await page.waitForTextInElement(selectors.ticketSales.firstSaleDiscount, '50.00%');
- const result = await page.waitToGetProperty(selectors.ticketSales.firstSaleDiscount, 'innerText');
-
- expect(result).toContain('50.00%');
- });
-
- it('should confirm the total import for that item have been updated', async() => {
- await page.waitForTextInElement(selectors.ticketSales.firstSaleImport, '22.50');
- const result = await page.waitToGetProperty(selectors.ticketSales.firstSaleImport, 'innerText');
-
- expect(result).toContain('22.50');
- });
-
- it('should recalculate price of sales', async() => {
- await page.waitToClick(selectors.ticketSales.firstSaleCheckbox);
- await page.waitToClick(selectors.ticketSales.secondSaleCheckbox);
-
- await page.waitToClick(selectors.ticketSales.moreMenu);
- await page.waitToClick(selectors.ticketSales.moreMenuRecalculatePrice);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should log in as salesAssistant and navigate to ticket sales', async() => {
- await page.loginAndModule('salesAssistant', 'ticket');
- await page.accessToSearchResult('15');
- await page.accessToSection('ticket.card.sale');
- });
-
- it('should select the first sale and create a refund with warehouse', async() => {
- await page.waitToClick(selectors.ticketSales.firstSaleCheckbox);
- await page.waitToClick(selectors.ticketSales.moreMenu);
- await page.waitToClick(selectors.ticketSales.moreMenuRefund);
- await page.waitToClick(selectors.ticketSales.refundWithWarehouse);
- await page.waitForSnackbar();
- await page.waitForState('ticket.card.sale');
- });
-
- it('should select the first sale and create a refund without warehouse', async() => {
- await page.accessToSearchResult('18');
- await page.waitToClick(selectors.ticketSales.firstSaleCheckbox);
- await page.waitToClick(selectors.ticketSales.moreMenu);
- await page.waitToClick(selectors.ticketSales.moreMenuRefund);
- await page.waitToClick(selectors.ticketSales.refundWithoutWarehouse);
- await page.waitForSnackbar();
- await page.waitForState('ticket.card.sale');
- });
-
- it('should show error trying to delete a ticket with a refund', async() => {
- await page.loginAndModule('salesPerson', 'ticket');
- await page.accessToSearchResult('8');
- await page.waitToClick(selectors.ticketDescriptor.moreMenu);
- await page.waitToClick(selectors.ticketDescriptor.moreMenuDeleteTicket);
- await page.waitToClick(selectors.globalItems.acceptButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Tickets with associated refunds can\'t be deleted');
- await page.waitToClick(selectors.globalItems.cancelButton);
- });
-
- it('should select the third sale and create a claim of it', async() => {
- await page.accessToSearchResult('16');
- await page.accessToSection('ticket.card.sale');
- await page.waitToClick(selectors.ticketSales.thirdSaleCheckbox);
- await page.waitToClick(selectors.ticketSales.moreMenu);
- await page.waitToClick(selectors.ticketSales.moreMenuCreateClaim);
- await page.waitToClick(selectors.globalItems.acceptButton);
- await page.waitForNavigation();
- });
-
- it('should search for a ticket then access to the sales section', async() => {
- await page.goBack();
- await page.goBack();
- await page.loginAndModule('salesPerson', 'ticket');
- await page.accessToSearchResult('16');
- await page.accessToSection('ticket.card.sale');
- });
-
- it('should select the third sale and delete it', async() => {
- await page.waitToClick(selectors.ticketSales.thirdSaleCheckbox);
- await page.waitToClick(selectors.ticketSales.deleteSaleButton);
- await page.waitToClick(selectors.globalItems.acceptButton);
- await page.waitForSpinnerLoad();
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it(`should confirm the third sale was deleted`, async() => {
- const result = await page.countElement(selectors.ticketSales.saleLine);
-
- expect(result).toEqual(3);
- });
-
- it('should select the second sale and transfer it to a valid ticket', async() => {
- const targetTicketId = '12';
-
- await page.waitToClick(selectors.ticketSales.secondSaleCheckbox);
- await page.waitToClick(selectors.ticketSales.transferSaleButton);
- await page.waitToClick(selectors.ticketSales.transferQuantityCell);
- await page.type(selectors.ticketSales.transferQuantityInput, '10\u000d');
- await page.type(selectors.ticketSales.moveToTicketInput, targetTicketId);
- await page.waitToClick(selectors.ticketSales.moveToTicketButton);
- await page.expectURL(`ticket/${targetTicketId}/sale`);
- });
-
- it('should confirm the transfered line is the correct one', async() => {
- await page.waitForSelector(selectors.ticketSales.secondSaleText);
- const result = await page.waitToGetProperty(selectors.ticketSales.secondSaleText, 'innerText');
-
- expect(result).toContain(`Melee weapon heavy shield`);
- });
-
- it('should confirm the transfered quantity is the correct one', async() => {
- const result = await page.waitToGetProperty(selectors.ticketSales.firstSaleQuantityCell, 'innerText');
-
- expect(result).toContain('20');
- });
-
- it('should go back to the original ticket sales section', async() => {
- await page.waitToClick(selectors.ticketDescriptor.goBackToModuleIndexButton);
- await page.accessToSearchResult('16');
- await page.accessToSection('ticket.card.sale');
- });
-
- it(`should confirm the original ticket has still three lines`, async() => {
- await page.waitForSelector(selectors.ticketSales.saleLine);
- const result = await page.countElement(selectors.ticketSales.saleLine);
-
- expect(result).toEqual(3);
- });
-
- it(`should confirm the second sale quantity is now half of it's original value after the transfer`, async() => {
- const result = await page.waitToGetProperty(selectors.ticketSales.secondSaleQuantityCell, 'innerText');
-
- expect(result).toContain('10');
- });
-
- it('should go back to the receiver ticket sales section', async() => {
- await page.waitToClick(selectors.ticketDescriptor.goBackToModuleIndexButton);
- await page.accessToSearchResult('12');
- await page.accessToSection('ticket.card.sale');
- });
-
- it('should transfer the sale back to the original ticket', async() => {
- const targetTicketId = '16';
-
- await page.waitToClick(selectors.ticketSales.secondSaleCheckbox);
- await page.waitToClick(selectors.ticketSales.transferSaleButton);
- await page.type(selectors.ticketSales.moveToTicketInput, targetTicketId);
- await page.waitToClick(selectors.ticketSales.moveToTicketButton);
- await page.expectURL(`ticket/${targetTicketId}/sale`);
- });
-
- it('should confirm the original ticket received the line', async() => {
- const expectedLines = 4;
- await page.waitForNumberOfElements(selectors.ticketSales.saleLine, expectedLines);
- const result = await page.countElement(selectors.ticketSales.saleLine);
-
- expect(result).toEqual(expectedLines);
- });
-
- it(`should throw an error when attempting to create a ticket for an inactive client`, async() => {
- await page.waitToClick(selectors.ticketSales.firstSaleCheckbox);
- await page.waitToClick(selectors.ticketSales.transferSaleButton);
- await page.waitToClick(selectors.ticketSales.moveToNewTicketButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain(`You can't create a ticket for an inactive client`);
-
- await page.closePopup();
- });
-
- it('should go now to the ticket sales section of an active, not frozen client', async() => {
- await page.waitToClick(selectors.ticketDescriptor.goBackToModuleIndexButton);
- await page.accessToSearchResult('13');
- await page.accessToSection('ticket.card.sale');
- });
-
- it(`should select all sales, tranfer them to a new ticket and delete the sender ticket as it would've been left empty`, async() => {
- const senderTicketId = '13';
-
- await page.waitToClick(selectors.ticketSales.selectAllSalesCheckbox);
- await page.waitToClick(selectors.ticketSales.transferSaleButton);
- await page.waitToClick(selectors.ticketSales.moveToNewTicketButton);
- await page.evaluate((selector, ticketId) => {
- return document.querySelector(selector).innerText.toLowerCase().indexOf(`#${ticketId}`) == -1;
- }, selectors.ticketDescriptor.id, senderTicketId);
- await page.waitForState('ticket.card.sale');
- });
-
- it('should confirm the new ticket received the line', async() => {
- const expectedLines = 1;
- const result = await page.countElement(selectors.ticketSales.saleLine);
-
- expect(result).toEqual(expectedLines);
- });
-
- it('should check the first sale reserved icon isnt visible', async() => {
- const result = await page.isVisible(selectors.ticketSales.firstSaleReservedIcon);
-
- expect(result).toBeFalsy();
- });
-
- it('should mark the first sale as reserved', async() => {
- await page.waitToClick(selectors.ticketSales.firstSaleCheckbox);
-
- await page.waitToClick(selectors.ticketSales.moreMenu);
- await page.waitToClick(selectors.ticketSales.moreMenuReserve);
- await page.closePopup();
- await page.waitForClassNotPresent(selectors.ticketSales.firstSaleReservedIcon, 'ng-hide');
- const result = await page.isVisible(selectors.ticketSales.firstSaleReservedIcon);
-
- expect(result).toBeTruthy();
- });
-
- it('should unmark the first sale as reserved', async() => {
- await page.waitToClick(selectors.ticketSales.moreMenu);
- await page.waitToClick(selectors.ticketSales.moreMenuUnmarkReseved);
- await page.waitForClassPresent(selectors.ticketSales.firstSaleReservedIcon, 'ng-hide');
- const result = await page.isVisible(selectors.ticketSales.firstSaleReservedIcon);
-
- expect(result).toBeFalsy();
- });
-
- it('should log in as Production role and go to a target ticket summary', async() => {
- await page.loginAndModule('production', 'ticket');
- await page.accessToSearchResult('13');
- await page.waitForState('ticket.card.summary');
- });
-
- it(`should check the ticket is deleted`, async() => {
- await page.waitForSelector(selectors.ticketDescriptor.isDeletedIcon);
- });
-});
diff --git a/e2e/paths/05-ticket/01_observations.spec.js b/e2e/paths/05-ticket/01_observations.spec.js
deleted file mode 100644
index cf37f9ff1..000000000
--- a/e2e/paths/05-ticket/01_observations.spec.js
+++ /dev/null
@@ -1,50 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Ticket Create notes path', () => {
- let browser;
- let page;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('employee', 'ticket');
- await page.accessToSearchResult('5');
- await page.accessToSection('ticket.card.observation');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should create a new note', async() => {
- await page.waitToClick(selectors.ticketNotes.addNoteButton);
- await page.autocompleteSearch(selectors.ticketNotes.firstNoteType, 'ItemPicker');
- await page.write(selectors.ticketNotes.firstDescription, 'description');
- await page.waitToClick(selectors.ticketNotes.submitNotesButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should confirm the note is the expected one', async() => {
- await page.reloadSection('ticket.card.observation');
- const result = await page
- .waitToGetProperty(selectors.ticketNotes.firstNoteType, 'value');
-
- expect(result).toEqual('ItemPicker');
-
- const firstDescription = await page
- .waitToGetProperty(selectors.ticketNotes.firstDescription, 'value');
-
- expect(firstDescription).toEqual('description');
- });
-
- it('should delete the note', async() => {
- await page.waitToClick(selectors.ticketNotes.firstNoteRemoveButton);
- await page.waitToClick(selectors.ticketNotes.submitNotesButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-});
diff --git a/e2e/paths/05-ticket/02_expeditions_and_log.spec.js b/e2e/paths/05-ticket/02_expeditions_and_log.spec.js
deleted file mode 100644
index 4e8005043..000000000
--- a/e2e/paths/05-ticket/02_expeditions_and_log.spec.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Ticket expeditions and log path', () => {
- let browser;
- let page;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('production', 'ticket');
- await page.accessToSearchResult('1');
- await page.accessToSection('ticket.card.expedition');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it(`should delete a former expedition and confirm the remaining expedition are the expected ones`, async() => {
- await page.waitToClick(selectors.ticketExpedition.thirdSaleCheckbox);
- await page.waitToClick(selectors.ticketExpedition.deleteExpeditionButton);
- await page.waitToClick(selectors.globalItems.acceptButton);
- await page.reloadSection('ticket.card.expedition');
-
- await page.waitForSelector(selectors.ticketExpedition.expeditionRow, {});
- const result = await page
- .countElement(selectors.ticketExpedition.expeditionRow);
-
- expect(result).toEqual(6);
- });
-});
diff --git a/e2e/paths/05-ticket/04_packages.spec.js b/e2e/paths/05-ticket/04_packages.spec.js
deleted file mode 100644
index 1e6a0a173..000000000
--- a/e2e/paths/05-ticket/04_packages.spec.js
+++ /dev/null
@@ -1,78 +0,0 @@
-import getBrowser from '../../helpers/puppeteer';
-
-const $ = {
- firstPackage: 'vn-autocomplete[label="Package"]',
- firstQuantity: 'vn-ticket-package vn-horizontal:nth-child(1) vn-input-number[ng-model="package.quantity"]',
- firstRemovePackageButton: 'vn-icon-button[vn-tooltip="Remove package"]',
- addPackageButton: 'vn-icon-button[vn-tooltip="Add package"]',
- savePackagesButton: `button[type=submit]`
-};
-
-describe('Ticket Create packages path', () => {
- let browser;
- let page;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('employee', 'ticket');
- await page.accessToSearchResult('1');
- await page.accessToSection('ticket.card.package');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it(`should attempt create a new package but receive an error if package is blank`, async() => {
- await page.waitToClick($.firstRemovePackageButton);
- await page.waitToClick($.addPackageButton);
- await page.write($.firstQuantity, '99');
- await page.waitToClick($.savePackagesButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Package cannot be blank');
- });
-
- it(`should delete the first package and receive and error to save a new one with blank quantity`, async() => {
- await page.clearInput($.firstQuantity);
- await page.autocompleteSearch($.firstPackage, 'Container medical box 100cm');
- await page.waitToClick($.savePackagesButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Some fields are invalid');
- });
-
- it(`should confirm the quantity input isn't invalid yet`, async() => {
- const result = await page
- .evaluate(selector => {
- return document.querySelector(`${selector} input`).checkValidity();
- }, $.firstQuantity);
-
- expect(result).toBeTruthy();
- });
-
- it(`should create a new package with correct data`, async() => {
- await page.clearInput($.firstQuantity);
- await page.write($.firstQuantity, '-99');
- await page.waitToClick($.savePackagesButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it(`should confirm the first select is the expected one`, async() => {
- await page.reloadSection('ticket.card.package');
- await page.waitForTextInField($.firstPackage, 'Container medical box 100cm');
- const result = await page.waitToGetProperty($.firstPackage, 'value');
-
- expect(result).toEqual('Container medical box 100cm');
- });
-
- it(`should confirm quantity is just a number and the string part was ignored by the imput number`, async() => {
- await page.waitForTextInField($.firstQuantity, '-99');
- const result = await page.waitToGetProperty($.firstQuantity, 'value');
-
- expect(result).toEqual('-99');
- });
-});
diff --git a/e2e/paths/05-ticket/05_tracking_state.spec.js b/e2e/paths/05-ticket/05_tracking_state.spec.js
deleted file mode 100644
index 5cfc1c9d4..000000000
--- a/e2e/paths/05-ticket/05_tracking_state.spec.js
+++ /dev/null
@@ -1,72 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Ticket Create new tracking state path', () => {
- let browser;
- let page;
-
- afterAll(async() => {
- await browser.close();
- });
-
- describe('as production', () => {
- it('should log into the ticket 1 tracking', async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('production', 'ticket');
- await page.accessToSearchResult('1');
- await page.accessToSection('ticket.card.tracking.index');
- });
-
- it('should access to the create state view by clicking the create floating button', async() => {
- await page.waitToClick(selectors.ticketTracking.createStateButton);
- await page.waitForSelector(selectors.createStateView.state, {visible: true});
- await page.waitForState('ticket.card.tracking.edit');
- });
-
- it(`should create a new state`, async() => {
- await page.autocompleteSearch(selectors.createStateView.state, 'OK');
- await page.waitToClick(selectors.createStateView.saveStateButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
- });
-
- describe('as salesPerson', () => {
- it('should now log into the ticket 1 tracking', async() => {
- await page.loginAndModule('salesPerson', 'ticket');
- await page.accessToSearchResult('1');
- await page.accessToSection('ticket.card.tracking.index');
- });
-
- it('should now access to the create state view by clicking the create floating button', async() => {
- await page.waitForSelector('.vn-popup', {hidden: true});
- await page.waitToClick(selectors.ticketTracking.createStateButton);
- await page.waitForState('ticket.card.tracking.edit');
- });
-
- it(`should attemp to create an state for which salesPerson doesn't have permissions`, async() => {
- await page.autocompleteSearch(selectors.createStateView.state, 'Encajado');
- await page.waitToClick(selectors.createStateView.saveStateButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain(`You don't have enough privileges`);
- });
-
- it(`should make sure the worker gets autocomplete uppon selecting the assigned state`, async() => {
- await page.autocompleteSearch(selectors.createStateView.state, 'asignado');
- const result = await page
- .waitToGetProperty(selectors.createStateView.worker, 'value');
-
- expect(result).toEqual('salesperson');
- });
-
- it(`should succesfully create a valid state`, async() => {
- await page.waitToClick(selectors.createStateView.saveStateButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
- });
-});
diff --git a/e2e/paths/05-ticket/06_basic_data_steps.spec.js b/e2e/paths/05-ticket/06_basic_data_steps.spec.js
deleted file mode 100644
index 77f0e0459..000000000
--- a/e2e/paths/05-ticket/06_basic_data_steps.spec.js
+++ /dev/null
@@ -1,143 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Ticket Edit basic data path', () => {
- let browser;
- let page;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('employee', 'ticket');
- await page.accessToSearchResult('11');
- await page.accessToSection('ticket.card.basicData.stepOne');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it(`should confirm the zone autocomplete is disabled unless your role is productionBoss`, async() => {
- await page.waitForSelector(selectors.ticketBasicData.zone, {});
- const disabled = await page.evaluate(selector => {
- return document.querySelector(selector).disabled;
- }, `${selectors.ticketBasicData.zone} input`);
-
- expect(disabled).toBeTruthy();
- });
-
- it(`should now log as productionBoss to perform the rest of the tests`, async() => {
- await page.loginAndModule('productionBoss', 'ticket');
- await page.accessToSearchResult('11');
- await page.accessToSection('ticket.card.basicData.stepOne');
- });
-
- it(`should confirm the zone autocomplete is enabled for the role productionBoss`, async() => {
- await page.waitForSpinnerLoad();
- await page.waitForSelector(selectors.ticketBasicData.zone);
- const disabled = await page.evaluate(selector => {
- return document.querySelector(selector).disabled;
- }, `${selectors.ticketBasicData.zone} input`);
-
- expect(disabled).toBeFalsy();
- });
-
- it(`should check the zone is for Gotham247`, async() => {
- let zone = await page
- .waitToGetProperty(selectors.ticketBasicData.zone, 'value');
-
- expect(zone).toContain('Zone 247 A');
- });
-
- it(`should edit the ticket agency then check there are no zones for it`, async() => {
- await page.autocompleteSearch(selectors.ticketBasicData.agency, 'Super-Man delivery');
- let emptyZone = await page
- .expectPropertyValue(selectors.ticketBasicData.zone, 'value', '');
-
- expect(emptyZone).toBeTruthy();
- });
-
- it(`should edit the ticket zone then check the agency is for the new zone`, async() => {
- await page.clearInput(selectors.ticketBasicData.agency);
- await page.autocompleteSearch(selectors.ticketBasicData.zone, 'Zone expensive A');
- let zone = await page
- .waitToGetProperty(selectors.ticketBasicData.agency, 'value');
-
- expect(zone).toContain('Gotham247Expensive');
- });
-
- it(`should click next`, async() => {
- await page.waitToClick(selectors.ticketBasicData.nextStepButton);
- await page.waitForState('ticket.card.basicData.stepTwo');
- });
-
- it(`should have a price diference`, async() => {
- const result = await page
- .waitToGetProperty(selectors.ticketBasicData.stepTwoTotalPriceDif, 'innerText');
-
- expect(result).toContain('-€228.25');
- });
-
- it(`should select a new reason for the changes made then click on finalize`, async() => {
- await page.waitToClick(selectors.ticketBasicData.chargesReason);
- await page.waitToClick(selectors.ticketBasicData.finalizeButton);
- await page.waitForState('ticket.card.summary');
- });
-
- it(`should not find ticket`, async() => {
- await page.doSearch('29');
- const count = await page.countElement(selectors.ticketsIndex.searchResult);
-
- expect(count).toEqual(0);
- });
-
- it(`should split ticket without negatives`, async() => {
- const newAgency = 'Gotham247';
- const newDate = Date.vnNew();
- newDate.setDate(newDate.getDate() - 1);
-
- await page.accessToSearchResult('14');
- await page.accessToSection('ticket.card.basicData.stepOne');
-
- await page.autocompleteSearch(selectors.ticketBasicData.agency, newAgency);
- await page.pickDate(selectors.ticketBasicData.shipped, newDate);
-
- await page.waitToClick(selectors.ticketBasicData.nextStepButton);
-
- await page.waitToClick(selectors.ticketBasicData.finalizeButton);
-
- await page.waitForState('ticket.card.summary');
-
- const newTicketAgency = await page
- .waitToGetProperty(selectors.ticketDescriptor.descriptorDeliveryAgency, 'innerText');
- const newTicketDate = await page
- .waitToGetProperty(selectors.ticketDescriptor.descriptorDeliveryDate, 'innerText');
-
- expect(newAgency).toEqual(newTicketAgency);
- expect(newTicketDate).toContain(newDate.getDate());
- });
-
- it(`should new ticket have sale of old ticket`, async() => {
- await page.accessToSection('ticket.card.sale');
- await page.waitForState('ticket.card.sale');
-
- const item = await page.waitToGetProperty(selectors.ticketSales.firstSaleId, 'innerText');
-
- expect(item).toEqual('4');
- });
-
- it(`should old ticket have old date and agency`, async() => {
- const oldDate = Date.vnNew();
- const oldAgency = 'Super-Man delivery';
-
- await page.accessToSearchResult('14');
-
- const oldTicketAgency = await page
- .waitToGetProperty(selectors.ticketDescriptor.descriptorDeliveryAgency, 'innerText');
- const oldTicketDate = await page
- .waitToGetProperty(selectors.ticketDescriptor.descriptorDeliveryDate, 'innerText');
-
- expect(oldTicketAgency).toEqual(oldAgency);
- expect(oldTicketDate).toContain(oldDate.getDate());
- });
-});
diff --git a/e2e/paths/05-ticket/08_components.spec.js b/e2e/paths/05-ticket/08_components.spec.js
deleted file mode 100644
index ab2aa85b2..000000000
--- a/e2e/paths/05-ticket/08_components.spec.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Ticket List components path', () => {
- let browser;
- let page;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('employee', 'ticket');
- await page.accessToSearchResult('1');
- await page.accessToSection('ticket.card.components');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should confirm the total base is correct', async() => {
- const name = 'Base €';
- const minLength = name.length;
-
- await page.waitPropertyLength(selectors.ticketComponents.base, 'innerText', minLength);
- const base = await page.waitToGetProperty(selectors.ticketComponents.base, 'innerText');
-
- expect(base).toContain('Base');
- expect(base.length).toBeGreaterThan(minLength);
- });
-});
diff --git a/e2e/paths/05-ticket/09_weekly.spec.js b/e2e/paths/05-ticket/09_weekly.spec.js
deleted file mode 100644
index 370d422e6..000000000
--- a/e2e/paths/05-ticket/09_weekly.spec.js
+++ /dev/null
@@ -1,123 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Ticket descriptor path', () => {
- let browser;
- let page;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('buyerBoss', 'ticket');
- await page.accessToSection('ticket.weekly.index');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should count the amount of tickets in the turns section', async() => {
- const result = await page.countElement(selectors.ticketsIndex.weeklyTicket);
-
- expect(result).toEqual(6);
- });
-
- it('should go back to the ticket index then search and access a ticket summary', async() => {
- await page.accessToSection('ticket.index');
- await page.accessToSearchResult('33');
- });
-
- it('should add the ticket to thursday turn using the descriptor more menu', async() => {
- await page.waitToClick(selectors.ticketDescriptor.moreMenu);
- await page.waitToClick(selectors.ticketDescriptor.moreMenuAddToTurn);
- await page.waitToClick(selectors.ticketDescriptor.thursdayButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Current ticket deleted and added to shift');
- });
-
- it('should again click on the Tickets button of the top bar menu', async() => {
- await page.waitToClick(selectors.globalItems.applicationsMenuButton);
- await page.waitForSelector(selectors.globalItems.applicationsMenuVisible);
- await page.waitToClick(selectors.globalItems.ticketsButton);
- await page.waitForState('ticket.index');
- });
-
- it('should confirm the ticket 33 was added to thursday', async() => {
- await page.accessToSection('ticket.weekly.index');
- const result = await page.waitToGetProperty(selectors.ticketsIndex.thirdWeeklyTicket, 'value');
-
- expect(result).toEqual('Thursday');
- });
-
- it('should click on the Tickets button of the top bar menu once more', async() => {
- await page.waitToClick(selectors.globalItems.applicationsMenuButton);
- await page.waitForSelector(selectors.globalItems.applicationsMenuVisible);
- await page.waitToClick(selectors.globalItems.ticketsButton);
- await page.waitForState('ticket.index');
- });
-
- it('should now search for the ticket 33', async() => {
- await page.accessToSearchResult('33');
- await page.waitForState('ticket.card.summary');
- });
-
- it('should add the ticket to saturday turn using the descriptor more menu', async() => {
- await page.waitToClick(selectors.ticketDescriptor.moreMenu);
- await page.waitToClick(selectors.ticketDescriptor.moreMenuAddToTurn);
- await page.waitToClick(selectors.ticketDescriptor.saturdayButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Current ticket deleted and added to shift');
- });
-
- it('should click on the Tickets button of the top bar menu once again', async() => {
- await page.waitToClick(selectors.globalItems.applicationsMenuButton);
- await page.waitForSelector(selectors.globalItems.applicationsMenuVisible);
- await page.waitToClick(selectors.globalItems.ticketsButton);
- await page.waitForState('ticket.index');
- });
-
- it('should confirm the ticket 33 was added on saturday', async() => {
- await page.accessToSection('ticket.weekly.index');
- await page.waitForTimeout(5000);
-
- const result = await page.waitToGetProperty(selectors.ticketsIndex.thirdWeeklyTicket, 'value');
-
- expect(result).toEqual('Saturday');
- });
-
- it('should now search for the weekly ticket 33', async() => {
- await page.doSearch('33');
- const nResults = await page.countElement(selectors.ticketsIndex.searchWeeklyResult);
-
- expect(nResults).toEqual(2);
- });
-
- it('should delete the weekly ticket 33', async() => {
- await page.waitToClick(selectors.ticketsIndex.firstWeeklyTicketDeleteIcon);
- await page.waitToClick(selectors.ticketsIndex.acceptDeleteTurn);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should confirm the sixth weekly ticket was deleted', async() => {
- await page.doSearch();
- const nResults = await page.countElement(selectors.ticketsIndex.searchWeeklyResult);
-
- expect(nResults).toEqual(6);
- });
-
- it('should update the agency then remove it afterwards', async() => {
- await page.autocompleteSearch(selectors.ticketsIndex.firstWeeklyTicketAgency, 'Gotham247');
- let message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
-
- await page.clearInput(selectors.ticketsIndex.firstWeeklyTicketAgency);
- message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-});
diff --git a/e2e/paths/05-ticket/10_request.spec.js b/e2e/paths/05-ticket/10_request.spec.js
deleted file mode 100644
index 1b580aec2..000000000
--- a/e2e/paths/05-ticket/10_request.spec.js
+++ /dev/null
@@ -1,77 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Ticket purchase request path', () => {
- let browser;
- let page;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('salesPerson', 'ticket');
- await page.accessToSearchResult('1');
- await page.accessToSection('ticket.card.request.index');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should add a new request', async() => {
- await page.waitToClick(selectors.ticketRequests.addRequestButton);
- await page.write(selectors.ticketRequests.descriptionInput, 'New stuff');
- await page.write(selectors.ticketRequests.quantity, '9');
- await page.autocompleteSearch(selectors.ticketRequests.atender, 'buyerNick');
- await page.write(selectors.ticketRequests.price, '999');
- await page.waitToClick(selectors.ticketRequests.saveButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should have been redirected to the request index', async() => {
- await page.waitForState('ticket.card.request.index');
- });
-
- it(`should edit the third request quantity as it's state is still new`, async() => {
- await page.write(selectors.ticketRequests.thirdRequestQuantity, '9');
- await page.keyboard.press('Enter');
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should check the new request was added', async() => {
- await page.reloadSection('ticket.card.request.index');
- const result = await page.waitToGetProperty(selectors.ticketRequests.thirdRequestQuantity, 'value');
-
- expect(result).toEqual('99');
- });
-
- it(`should check the first request can't be edited as its state is different to new`, async() => {
- await page.waitForClassPresent(selectors.ticketRequests.firstRequestQuantity, 'disabled');
- const result = await page.isDisabled(selectors.ticketRequests.firstRequestQuantity);
-
- expect(result).toBe(true);
- });
-
- it(`should check the second request can't be edited as its state is different to new`, async() => {
- await page.waitForClassPresent(selectors.ticketRequests.secondRequestQuantity, 'disabled');
- const result = await page.isDisabled(selectors.ticketRequests.secondRequestQuantity);
-
- expect(result).toBe(true);
- });
-
- it('should delete the added request', async() => {
- await page.waitToClick(selectors.ticketRequests.thirdRemoveRequestButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should check the request was deleted', async() => {
- await page.reloadSection('ticket.card.request.index');
- await page.waitForSelector(selectors.ticketRequests.addRequestButton);
- await page.waitForSelector(selectors.ticketRequests.thirdDescription, {hidden: true});
- });
-});
diff --git a/e2e/paths/05-ticket/12_descriptor.spec.js b/e2e/paths/05-ticket/12_descriptor.spec.js
deleted file mode 100644
index 95a114c45..000000000
--- a/e2e/paths/05-ticket/12_descriptor.spec.js
+++ /dev/null
@@ -1,148 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Ticket descriptor path', () => {
- let browser;
- let page;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('salesperson', 'ticket');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- describe('Delete ticket', () => {
- it('should search for an specific ticket', async() => {
- await page.accessToSearchResult('18');
- await page.waitForState('ticket.card.summary');
- });
-
- it(`should update the shipped hour using the descriptor menu`, async() => {
- await page.waitToClick(selectors.ticketDescriptor.moreMenu);
- await page.waitToClick(selectors.ticketDescriptor.moreMenuChangeShippedHour);
- await page.pickTime(selectors.ticketDescriptor.changeShippedHour, '08:15');
- await page.waitToClick(selectors.ticketDescriptor.acceptChangeHourButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Shipped hour updated');
- });
-
- it(`should confirm the ticket descriptor shows the correct shipping hour`, async() => {
- await page.waitForState('ticket.card.summary');
- const result = await page
- .waitToGetProperty(selectors.ticketDescriptor.descriptorDeliveryDate, 'innerText');
-
- expect(result).toContain('08:15');
- });
-
- it('should delete the ticket using the descriptor menu', async() => {
- await page.waitToClick(selectors.ticketDescriptor.moreMenu);
- await page.waitToClick(selectors.ticketDescriptor.moreMenuDeleteTicket);
- await page.waitToClick(selectors.ticketDescriptor.acceptDialog);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Ticket deleted. You can undo this action within the first hour');
- });
-
- it('should have been relocated to the ticket index', async() => {
- await page.waitForState('ticket.index');
- });
-
- it(`should search for the deleted ticket and check the deletedTicket icon and it's date`, async() => {
- await page.write(selectors.ticketsIndex.topbarSearch, '18');
- await page.waitToClick(selectors.globalItems.searchButton);
- await page.waitForState('ticket.card.summary');
- await page.isVisible(selectors.ticketDescriptor.isDeletedIcon);
- const result = await page.waitToGetProperty(selectors.ticketsIndex.searchResultDate, 'innerText');
-
- expect(result).toContain(2000);
- });
- });
-
- describe('Restore ticket', () => {
- it('should restore the ticket using the descriptor menu', async() => {
- await page.waitToClick(selectors.ticketDescriptor.moreMenu);
- await page.waitToClick(selectors.ticketDescriptor.moreMenuRestoreTicket);
- await page.waitToClick(selectors.ticketDescriptor.acceptDialog);
- await page.waitForState('ticket.card.summary');
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
- });
-
- describe('Make invoice', () => {
- it('should login as administrative role then search for a ticket', async() => {
- const invoiceableTicketId = '14';
-
- await page.loginAndModule('administrative', 'ticket');
- await page.accessToSearchResult(invoiceableTicketId);
- await page.waitForState('ticket.card.summary');
- });
-
- it(`should make sure the ticket doesn't have an invoiceOutFk yet`, async() => {
- const result = await page
- .waitToGetProperty(selectors.ticketSummary.invoiceOutRef, 'innerText');
-
- expect(result).toEqual('-');
- });
-
- it('should invoice the ticket using the descriptor menu', async() => {
- await page.waitToClick(selectors.ticketDescriptor.moreMenu);
- await page.waitForContentLoaded();
- await page.waitToClick(selectors.ticketDescriptor.moreMenuMakeInvoice);
- await page.waitToClick(selectors.ticketDescriptor.acceptInvoiceOutButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Ticket invoiced');
- });
-
- it(`should make sure the ticket summary have an invoiceOutFk`, async() => {
- await page.waitForTextInElement(selectors.ticketSummary.invoiceOutRef, 'T4444445');
- const result = await page.waitToGetProperty(selectors.ticketSummary.invoiceOutRef, 'innerText');
-
- expect(result).toEqual('T4444445');
- });
-
- it(`should regenerate the invoice using the descriptor menu`, async() => {
- const expectedMessage = 'The invoice PDF document has been regenerated';
-
- await page.waitToClick(selectors.ticketDescriptor.moreMenu);
- await page.waitForContentLoaded();
- await page.waitToClick(selectors.ticketDescriptor.moreMenuRegenerateInvoice);
- await page.respondToDialog('accept');
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain(expectedMessage);
- });
- });
-
- describe('SMS', () => {
- it('should send the payment SMS using the descriptor menu', async() => {
- await page.waitToClick(selectors.ticketDescriptor.moreMenu);
- await page.waitToClick(selectors.ticketDescriptor.moreMenuSMSOptions);
- await page.waitToClick(selectors.ticketDescriptor.moreMenuPaymentSMS);
- await page.waitForSelector(selectors.ticketDescriptor.SMStext);
- await page.waitPropertyLength(selectors.ticketDescriptor.SMStext, 'value', 128);
- await page.waitToClick(selectors.ticketDescriptor.sendSMSbutton);
- const message = await page.waitForSnackbar();
-
- expect(message).toBeDefined();
- });
-
- it('should send the import SMS using the descriptor menu', async() => {
- await page.waitToClick(selectors.ticketDescriptor.moreMenuSMSOptions);
- await page.waitToClick(selectors.ticketDescriptor.moreMenuSendImportSms);
- await page.waitForSelector(selectors.ticketDescriptor.SMStext);
- await page.waitPropertyLength(selectors.ticketDescriptor.SMStext, 'value', 144);
- await page.waitToClick(selectors.ticketDescriptor.sendSMSbutton);
- const message = await page.waitForSnackbar();
-
- expect(message).toBeDefined();
- });
- });
-});
diff --git a/e2e/paths/05-ticket/13_services.spec.js b/e2e/paths/05-ticket/13_services.spec.js
deleted file mode 100644
index 50df23582..000000000
--- a/e2e/paths/05-ticket/13_services.spec.js
+++ /dev/null
@@ -1,127 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Ticket services path', () => {
- let browser;
- let page;
- const invoicedTicketId = '1';
-
- afterAll(async() => {
- await browser.close();
- });
-
- describe('as employee', () => {
- it('should log in as employee, search for an invoice and get to services', async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('employee', 'ticket');
- await page.accessToSearchResult(invoicedTicketId);
- await page.accessToSection('ticket.card.service');
- });
-
- it('should find the add descripton button disabled for this user role', async() => {
- await page.waitForClassPresent(selectors.ticketService.firstAddServiceTypeButton, 'disabled');
- await page.waitToClick(selectors.ticketService.addServiceButton);
- await page.waitForSelector(selectors.ticketService.firstAddServiceTypeButton);
- const disabled = await page.isDisabled(selectors.ticketService.firstAddServiceTypeButton);
-
- expect(disabled).toBe(true);
- });
-
- it('should receive an error if you attempt to save a service without access rights', async() => {
- await page.clearInput(selectors.ticketService.firstPrice);
- await page.write(selectors.ticketService.firstPrice, '999');
- await page.waitToClick(selectors.ticketService.saveServiceButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain(`The current ticket can't be modified`);
- });
- });
-
- describe('as administrative', () => {
- let editableTicketId = '16';
- it('should navigate to the services of a target ticket', async() => {
- await page.loginAndModule('administrative', 'ticket');
- await page.accessToSearchResult(editableTicketId);
- await page.accessToSection('ticket.card.service');
- });
-
- it('should click on the add button to prepare the form to create a new service', async() => {
- await page.waitToClick(selectors.ticketService.addServiceButton);
- const result = await page
- .isVisible(selectors.ticketService.firstServiceType);
-
- expect(result).toBeTruthy();
- });
-
- it('should receive an error if you attempt to save it with empty fields', async() => {
- await page.waitToClick(selectors.ticketService.saveServiceButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain(`can't be blank`);
- });
-
- it('should click on the add new service type to open the dialog', async() => {
- await page.waitToClick(selectors.ticketService.firstAddServiceTypeButton);
- await page.waitForSelector('.vn-dialog.shown');
- const result = await page.isVisible(selectors.ticketService.newServiceTypeName);
-
- expect(result).toBeTruthy();
- });
-
- it('should receive an error if service type is empty on submit', async() => {
- await page.waitToClick(selectors.ticketService.saveServiceTypeButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain(`Name can't be empty`);
- });
-
- it('should create a new service type then add price then create the service', async() => {
- await page.write(selectors.ticketService.newServiceTypeName, 'Documentos');
- await page.waitToClick(selectors.ticketService.saveServiceTypeButton);
- await page.write(selectors.ticketService.firstPrice, '999');
- await page.waitToClick(selectors.ticketService.saveServiceButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should confirm the service description was created correctly', async() => {
- await page.reloadSection('ticket.card.service');
- const result = await page
- .waitToGetProperty(selectors.ticketService.firstServiceType, 'value');
-
- expect(result).toEqual('Documentos');
- });
-
- it('should confirm the service quantity was created correctly', async() => {
- const result = await page
- .waitToGetProperty(selectors.ticketService.firstQuantity, 'value');
-
- expect(result).toEqual('1');
- });
-
- it('should confirm the service price was created correctly', async() => {
- const result = await page
- .waitToGetProperty(selectors.ticketService.firstPrice, 'value');
-
- expect(result).toEqual('999');
- });
-
- it('should delete the service', async() => {
- await page.waitToClick(selectors.ticketService.fistDeleteServiceButton);
- await page.waitForNumberOfElements(selectors.ticketService.serviceLine, 0);
- await page.waitToClick(selectors.ticketService.saveServiceButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it(`should confirm the service was removed`, async() => {
- await page.reloadSection('ticket.card.service');
- const nResults = await page.countElement(selectors.ticketService.serviceLine);
-
- expect(nResults).toEqual(0);
- });
- });
-});
diff --git a/e2e/paths/05-ticket/14_create_ticket.spec.js b/e2e/paths/05-ticket/14_create_ticket.spec.js
deleted file mode 100644
index 1f9c0c40a..000000000
--- a/e2e/paths/05-ticket/14_create_ticket.spec.js
+++ /dev/null
@@ -1,69 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Ticket create path', () => {
- let browser;
- let page;
- let nextMonth = Date.vnNew();
- nextMonth.setMonth(nextMonth.getMonth() + 1);
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('salesPerson', 'ticket');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should open the new ticket form', async() => {
- await page.waitToClick(selectors.ticketsIndex.newTicketButton);
- await page.waitForState('ticket.create');
- });
-
- it('should succeed to create a ticket', async() => {
- await page.autocompleteSearch(selectors.createTicketView.client, 'Clark Kent');
- await page.pickDate(selectors.createTicketView.deliveryDate, nextMonth);
- await page.autocompleteSearch(selectors.createTicketView.warehouse, 'Warehouse Two');
- await page.autocompleteSearch(selectors.createTicketView.agency, 'Gotham247');
- await page.waitToClick(selectors.createTicketView.createButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should check the url is now the summary of the ticket', async() => {
- await page.waitForState('ticket.card.summary');
- });
-
- it('should again open the new ticket form', async() => {
- await page.waitToClick(selectors.globalItems.returnToModuleIndexButton);
- await page.waitToClick(selectors.ticketsIndex.newTicketButton);
- await page.waitForState('ticket.create');
- });
-
- it('should succeed to create another ticket for the same client', async() => {
- await page.autocompleteSearch(selectors.createTicketView.client, 'Clark Kent');
- await page.pickDate(selectors.createTicketView.deliveryDate, nextMonth);
- await page.autocompleteSearch(selectors.createTicketView.warehouse, 'Warehouse One');
- await page.autocompleteSearch(selectors.createTicketView.agency, 'Gotham247');
- await page.waitToClick(selectors.createTicketView.createButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should check the url is now the summary of the created ticket', async() => {
- await page.waitForState('ticket.card.summary');
- });
-
- it('should delete the current ticket', async() => {
- await page.waitToClick(selectors.ticketDescriptor.moreMenu);
- await page.waitToClick(selectors.ticketDescriptor.moreMenuDeleteTicket);
- await page.waitToClick(selectors.ticketDescriptor.acceptDialog);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Ticket deleted. You can undo this action within the first hour');
- });
-});
diff --git a/e2e/paths/05-ticket/15_create_ticket_from_client.spec.js b/e2e/paths/05-ticket/15_create_ticket_from_client.spec.js
deleted file mode 100644
index 51ead6461..000000000
--- a/e2e/paths/05-ticket/15_create_ticket_from_client.spec.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import getBrowser from '../../helpers/puppeteer';
-
-const $ = {
- form: 'vn-ticket-create-card',
- moreMenu: 'vn-client-descriptor vn-icon-button[icon=more_vert]',
- simpleTicketButton: '.vn-menu [name="simpleTicket"]'
-};
-
-describe('Ticket create from client path', () => {
- let browser;
- let page;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('employee', 'client');
- await page.accessToSearchResult('Petter Parker');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should create simple ticket and check if the client details are the expected ones', async() => {
- await page.waitToClick($.moreMenu);
- await page.waitToClick($.simpleTicketButton);
- await page.waitForState('ticket.create');
-
- const values = {
- client: 'Petter Parker',
- address: 'Petter Parker'
- };
- const formValues = await page.fetchForm($.form, Object.keys(values));
-
- expect(formValues).toEqual(values);
- });
-});
diff --git a/e2e/paths/05-ticket/16_summary.spec.js b/e2e/paths/05-ticket/16_summary.spec.js
deleted file mode 100644
index a6017e454..000000000
--- a/e2e/paths/05-ticket/16_summary.spec.js
+++ /dev/null
@@ -1,108 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Ticket Summary path', () => {
- let browser;
- let page;
- const ticketId = '20';
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should navigate to the target ticket summary section', async() => {
- await page.loginAndModule('employee', 'ticket');
- await page.accessToSearchResult(ticketId);
- await page.waitForState('ticket.card.summary');
- });
-
- it(`should display details from the ticket and it's client on the top of the header`, async() => {
- await page.waitForTextInElement(selectors.ticketSummary.header, 'Bruce Banner');
- const result = await page.waitToGetProperty(selectors.ticketSummary.header, 'innerText');
-
- expect(result).toContain(`Ticket #${ticketId}`);
- expect(result).toContain('Bruce Banner (1109)');
- expect(result).toContain('Somewhere in Thailand');
- });
-
- it('should display ticket details', async() => {
- let result = await page
- .waitToGetProperty(selectors.ticketSummary.state, 'innerText');
-
- expect(result).toContain('Arreglar');
- });
-
- it('should display delivery details', async() => {
- let result = await page
- .waitToGetProperty(selectors.ticketSummary.route, 'innerText');
-
- expect(result).toContain('3');
- });
-
- it('should display the ticket total', async() => {
- let result = await page
- .waitToGetProperty(selectors.ticketSummary.total, 'innerText');
-
- expect(result).toContain('€155.54');
- });
-
- it('should display the ticket line(s)', async() => {
- let result = await page
- .waitToGetProperty(selectors.ticketSummary.firstSaleItemId, 'innerText');
-
- expect(result).toContain('2');
- });
-
- it(`should click on the first sale ID to make the item descriptor visible`, async() => {
- await page.waitToClick(selectors.ticketSummary.firstSaleItemId);
- await page.waitImgLoad(selectors.ticketSummary.firstSaleDescriptorImage);
- const visible = await page.isVisible(selectors.ticketSummary.itemDescriptorPopover);
-
- expect(visible).toBeTruthy();
- });
-
- it(`should check the url for the item diary link of the descriptor is for the right item id`, async() => {
- await page.waitForSelector(selectors.ticketSummary.itemDescriptorPopoverItemDiaryButton, {visible: true});
- });
-
- it('should log in as production then navigate to the summary of the same ticket', async() => {
- await page.loginAndModule('production', 'ticket');
- await page.accessToSearchResult(ticketId);
- await page.waitForState('ticket.card.summary');
- });
-
- it('should set the ticket state to OK using the top right button', async() => {
- const searchValue = 'OK';
- await page.waitToClick(selectors.ticketSummary.stateButton);
- await page.write(selectors.ticketSummary.stateAutocomplete, searchValue);
- try {
- await page.waitForFunction(text => {
- const element = document.querySelector('li.active');
- if (element)
- return element.innerText.toLowerCase().includes(text.toLowerCase());
- }, {}, searchValue);
- } catch (error) {
- const state = await page.evaluate(() => {
- const stateSelector = 'vn-ticket-summary vn-label-value:nth-child(1) > section > span';
- return document.querySelector(stateSelector).value;
- });
- throw new Error(`${stateSelector} innerText is ${state}! ${error}`);
- }
- await page.keyboard.press('Enter');
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it('should confirm the ticket state was updated', async() => {
- await page.waitForSpinnerLoad();
- const result = await page.waitToGetProperty(selectors.ticketSummary.state, 'innerText');
-
- expect(result).toContain('OK');
- });
-});
diff --git a/e2e/paths/05-ticket/17_log.spec.js b/e2e/paths/05-ticket/17_log.spec.js
deleted file mode 100644
index e1da2df44..000000000
--- a/e2e/paths/05-ticket/17_log.spec.js
+++ /dev/null
@@ -1,34 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Ticket log path', () => {
- let browser;
- let page;
- const ticketId = '5';
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should navigate to the target ticket notes section', async() => {
- await page.loginAndModule('employee', 'ticket');
- await page.accessToSearchResult(ticketId);
- await page.accessToSection('ticket.card.observation');
- await page.waitForState('ticket.card.observation');
- });
-
- it('should create a new note for the test', async() => {
- await page.waitToClick(selectors.ticketNotes.addNoteButton);
- await page.autocompleteSearch(selectors.ticketNotes.firstNoteType, 'ItemPicker');
- await page.write(selectors.ticketNotes.firstDescription, 'description');
- await page.waitToClick(selectors.ticketNotes.submitNotesButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-});
diff --git a/e2e/paths/05-ticket/18_index_payout.spec.js b/e2e/paths/05-ticket/18_index_payout.spec.js
deleted file mode 100644
index 9c5518424..000000000
--- a/e2e/paths/05-ticket/18_index_payout.spec.js
+++ /dev/null
@@ -1,70 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-const $ = {
- newPayment: '.vn-dialog.shown',
- anyBalanceLine: 'vn-client-balance-index vn-tbody > vn-tr',
- firstLineReference: 'vn-client-balance-index vn-tbody > vn-tr:nth-child(1) > vn-td-editable'
-};
-
-describe('Ticket index payout path', () => {
- let browser;
- let page;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('administrative', 'ticket');
- await page.waitForState('ticket.index');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should check the second ticket from a client and 1 of another', async() => {
- await page.waitToClick(selectors.globalItems.searchButton);
- await page.waitToClick(selectors.ticketsIndex.thirdTicketCheckbox);
- await page.waitToClick(selectors.ticketsIndex.fifthTicketCheckbox);
- await page.waitToClick(selectors.ticketsIndex.payoutButton);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('You cannot make a payment on account from multiple clients');
- });
-
- it('should search for tickets of the same client then open the payout form', async() => {
- await page.waitToClick(selectors.ticketsIndex.openAdvancedSearchButton);
- await page.write(selectors.ticketsIndex.advancedSearchClient, '1101');
- await page.keyboard.press('Enter');
- await page.waitForNumberOfElements(selectors.ticketsIndex.anySearchResult, 10);
- await page.waitToClick(selectors.ticketsIndex.firstTicketCheckbox);
- await page.waitToClick(selectors.ticketsIndex.secondTicketCheckbox);
-
- await page.waitToClick(selectors.ticketsIndex.payoutButton);
-
- await page.waitForSelector(selectors.ticketsIndex.payoutCompany);
- });
-
- it('should fill the company and bank to perform a payout and check a new balance line was entered', async() => {
- await page.fillForm($.newPayment, {
- company: 'VNL',
- bank: 'cash',
- amountPaid: 100,
- description: 'Payment',
- viewReceipt: false
- });
- await page.respondToDialog('accept');
- const message = await page.waitForSnackbar();
-
- await page.waitToClick(selectors.globalItems.homeButton);
- await page.selectModule('client');
- await page.accessToSearchResult('1101');
- await page.accessToSection('client.card.balance.index');
- await page.waitForSelector($.anyBalanceLine);
- const count = await page.countElement($.anyBalanceLine);
- const reference = await page.innerText($.firstLineReference);
-
- expect(message.isSuccess).toBeTrue();
- expect(count).toEqual(4);
- expect(reference).toContain('Payment');
- });
-});
diff --git a/e2e/paths/05-ticket/19_dms.spec.js b/e2e/paths/05-ticket/19_dms.spec.js
deleted file mode 100644
index be2ac4338..000000000
--- a/e2e/paths/05-ticket/19_dms.spec.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Ticket DMS path', () => {
- let browser;
- let page;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('employee', 'ticket');
- await page.accessToSearchResult('1');
- await page.accessToSection('ticket.card.dms.index');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should import a document', async() => {
- await page.waitToClick(selectors.ticketDms.import);
- await page.autocompleteSearch(selectors.ticketDms.document, '1');
- await page.waitToClick(selectors.ticketDms.saveImport);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Data saved!');
- });
-
- it(`should check there's a listed document now`, async() => {
- const result = await page.countElement(selectors.ticketDms.anyDocument);
-
- expect(result).toEqual(1);
- });
-
- it('should attempt to import an existing document on this ticket', async() => {
- await page.waitToClick(selectors.ticketDms.import);
- await page.autocompleteSearch(selectors.ticketDms.document, '1');
- await page.waitToClick(selectors.ticketDms.saveImport);
- const message = await page.waitForSnackbar();
-
- expect(message.text).toContain('This document already exists on this ticket');
- });
-
- it(`should check there's still one document`, async() => {
- const result = await page.countElement(selectors.ticketDms.anyDocument);
-
- expect(result).toEqual(1);
- });
-});
diff --git a/e2e/paths/05-ticket/20_moveExpedition.spec.js b/e2e/paths/05-ticket/20_moveExpedition.spec.js
deleted file mode 100644
index ae23c9c99..000000000
--- a/e2e/paths/05-ticket/20_moveExpedition.spec.js
+++ /dev/null
@@ -1,50 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Ticket expeditions', () => {
- let browser;
- let page;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('production', 'ticket');
- await page.accessToSearchResult('1');
- await page.accessToSection('ticket.card.expedition');
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it(`should move one expedition to new ticket withoute route`, async() => {
- await page.waitToClick(selectors.ticketExpedition.thirdSaleCheckbox);
- await page.waitToClick(selectors.ticketExpedition.moveExpeditionButton);
- await page.waitToClick(selectors.ticketExpedition.moreMenuWithoutRoute);
- await page.waitToClick(selectors.ticketExpedition.saveButton);
- await page.waitForState('ticket.card.summary');
- await page.accessToSection('ticket.card.expedition');
-
- await page.waitForSelector(selectors.ticketExpedition.expeditionRow, {});
- const result = await page
- .countElement(selectors.ticketExpedition.expeditionRow);
-
- expect(result).toEqual(2);
- });
-
- it(`should move one expedition to new ticket with route`, async() => {
- await page.waitToClick(selectors.ticketExpedition.firstSaleCheckbox);
- await page.waitToClick(selectors.ticketExpedition.moveExpeditionButton);
- await page.waitToClick(selectors.ticketExpedition.moreMenuWithRoute);
- await page.write(selectors.ticketExpedition.newRouteId, '1');
- await page.waitToClick(selectors.ticketExpedition.saveButton);
- await page.waitForState('ticket.card.summary');
- await page.accessToSection('ticket.card.expedition');
-
- await page.waitForSelector(selectors.ticketExpedition.expeditionRow, {});
- const result = await page
- .countElement(selectors.ticketExpedition.expeditionRow);
-
- expect(result).toEqual(2);
- });
-});
diff --git a/e2e/paths/05-ticket/21_future.spec.js b/e2e/paths/05-ticket/21_future.spec.js
deleted file mode 100644
index 60bb9c38d..000000000
--- a/e2e/paths/05-ticket/21_future.spec.js
+++ /dev/null
@@ -1,99 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Ticket Future path', () => {
- let browser;
- let page;
- let httpRequest;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('employee', 'ticket');
- await page.accessToSection('ticket.future');
- page.on('request', req => {
- if (req.url().includes(`Tickets/getTicketsFuture`))
- httpRequest = req.url();
- });
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should search with required data, check three last tickets and move to the future', async() => {
- await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton);
- await page.clearInput(selectors.ticketFuture.warehouseFk);
- await page.waitToClick(selectors.ticketFuture.submit);
- let message = await page.waitForSnackbar();
-
- expect(message.text).toContain('warehouseFk is a required argument');
-
- await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton);
- await page.clearInput(selectors.ticketFuture.futureScopeDays);
- await page.waitToClick(selectors.ticketFuture.submit);
- message = await page.waitForSnackbar();
-
- expect(message.text).toContain('futureScopeDays is a required argument');
-
- await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton);
- await page.clearInput(selectors.ticketFuture.originScopeDays);
- await page.waitToClick(selectors.ticketFuture.submit);
- message = await page.waitForSnackbar();
-
- expect(message.text).toContain('originScopeDays is a required argument');
-
- await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton);
- await page.waitToClick(selectors.ticketFuture.submit);
-
- expect(httpRequest).toBeDefined();
-
- await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton);
-
- await page.autocompleteSearch(selectors.ticketFuture.ipt, 'H');
- await page.waitToClick(selectors.ticketFuture.submit);
-
- expect(httpRequest).toContain('ipt=H');
-
- await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton);
-
- await page.clearInput(selectors.ticketFuture.ipt);
-
- await page.autocompleteSearch(selectors.ticketFuture.futureIpt, 'H');
- await page.waitToClick(selectors.ticketFuture.submit);
-
- expect(httpRequest).toContain('futureIpt=H');
-
- await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton);
-
- await page.clearInput(selectors.ticketFuture.futureIpt);
-
- await page.autocompleteSearch(selectors.ticketFuture.state, 'Free');
- await page.waitToClick(selectors.ticketFuture.submit);
-
- expect(httpRequest).toContain('state=0');
-
- await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton);
-
- await page.clearInput(selectors.ticketFuture.state);
-
- await page.autocompleteSearch(selectors.ticketFuture.futureState, 'Free');
- await page.waitToClick(selectors.ticketFuture.submit);
-
- expect(httpRequest).toContain('futureState=0');
-
- await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton);
- await page.clearInput(selectors.ticketFuture.state);
- await page.clearInput(selectors.ticketFuture.futureState);
- await page.waitToClick(selectors.ticketFuture.submit);
-
- await page.waitForNumberOfElements(selectors.ticketFuture.searchResult, 5);
- await page.waitToClick(selectors.ticketFuture.multiCheck);
- await page.waitToClick(selectors.ticketFuture.firstCheck);
- await page.waitToClick(selectors.ticketFuture.moveButton);
- await page.waitToClick(selectors.globalItems.acceptButton);
- message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Tickets moved successfully!');
- });
-});
diff --git a/e2e/paths/05-ticket/22_advance.spec.js b/e2e/paths/05-ticket/22_advance.spec.js
deleted file mode 100644
index 0e5b5e0c3..000000000
--- a/e2e/paths/05-ticket/22_advance.spec.js
+++ /dev/null
@@ -1,79 +0,0 @@
-import selectors from '../../helpers/selectors.js';
-import getBrowser from '../../helpers/puppeteer';
-
-describe('Ticket Advance path', () => {
- let browser;
- let page;
- let httpRequest;
-
- beforeAll(async() => {
- browser = await getBrowser();
- page = browser.page;
- await page.loginAndModule('employee', 'ticket');
- await page.accessToSection('ticket.advance');
- page.on('request', req => {
- if (req.url().includes(`Tickets/getTicketsAdvance`))
- httpRequest = req.url();
- });
- });
-
- afterAll(async() => {
- await browser.close();
- });
-
- it('should search with the required data, check the first ticket and move to the present', async() => {
- await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
- await page.clearInput(selectors.ticketAdvance.warehouseFk);
-
- await page.waitToClick(selectors.ticketAdvance.submit);
- let message = await page.waitForSnackbar();
-
- expect(message.text).toContain('warehouseFk is a required argument');
-
- await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
- await page.clearInput(selectors.ticketAdvance.dateToAdvance);
- await page.waitToClick(selectors.ticketAdvance.submit);
- message = await page.waitForSnackbar();
-
- expect(message.text).toContain('dateToAdvance is a required argument');
-
- await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
- await page.clearInput(selectors.ticketAdvance.dateFuture);
- await page.waitToClick(selectors.ticketAdvance.submit);
- message = await page.waitForSnackbar();
-
- expect(message.text).toContain('dateFuture is a required argument');
-
- await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
- await page.waitToClick(selectors.ticketAdvance.submit);
-
- expect(httpRequest).toBeDefined();
-
- await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
- await page.autocompleteSearch(selectors.ticketAdvance.futureIpt, 'H');
- await page.waitToClick(selectors.ticketAdvance.submit);
-
- expect(httpRequest).toContain('futureIpt=H');
-
- await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
- await page.clearInput(selectors.ticketAdvance.futureIpt);
- await page.waitToClick(selectors.ticketAdvance.submit);
-
- await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
- await page.autocompleteSearch(selectors.ticketAdvance.ipt, 'H');
- await page.waitToClick(selectors.ticketAdvance.submit);
-
- expect(httpRequest).toContain('ipt=H');
-
- await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
- await page.clearInput(selectors.ticketAdvance.ipt);
- await page.waitToClick(selectors.ticketAdvance.submit);
-
- await page.waitToClick(selectors.ticketAdvance.firstCheck);
- await page.waitToClick(selectors.ticketAdvance.moveButton);
- await page.waitToClick(selectors.ticketAdvance.acceptButton);
- message = await page.waitForSnackbar();
-
- expect(message.text).toContain('Tickets moved successfully!');
- });
-});
diff --git a/loopback/common/methods/vn-model/printService.js b/loopback/common/methods/vn-model/printService.js
index 12a6a67cc..ed784229b 100644
--- a/loopback/common/methods/vn-model/printService.js
+++ b/loopback/common/methods/vn-model/printService.js
@@ -2,7 +2,7 @@ const {Report, Email} = require('vn-print');
module.exports = Self => {
Self.printReport = async function(ctx, id, reportName) {
- const args = Object.assign({}, ctx.args);
+ const args = Object.assign({id}, ctx.args);
const params = {lang: ctx.req.getLocale()};
delete args.ctx;
diff --git a/loopback/locale/en.json b/loopback/locale/en.json
index 4ad3f76e2..86ebebc89 100644
--- a/loopback/locale/en.json
+++ b/loopback/locale/en.json
@@ -241,9 +241,10 @@
"The height must be greater than 50cm": "The height must be greater than 50cm",
"The maximum height of the wagon is 200cm": "The maximum height of the wagon is 200cm",
"The quantity claimed cannot be greater than the quantity of the line": "The quantity claimed cannot be greater than the quantity of the line",
- "There are tickets for this area, delete them first": "There are tickets for this area, delete them first",
- "ticketLostExpedition": "The ticket [{{ticketId}}]({{{ticketUrl}}}) has the following lost expedition:{{ expeditionId }}",
- "null": "null",
"Invalid or expired verification code": "Invalid or expired verification code",
- "Payment method is required": "Payment method is required"
-}
\ No newline at end of file
+ "There are tickets for this area, delete them first": "There are tickets for this area, delete them first",
+ "ticketLostExpedition": "The ticket [{{ticketId}}]({{{ticketUrl}}}) has the following lost expedition:{{ expeditionId }}",
+ "Payment method is required": "Payment method is required",
+ "Sales already moved": "Sales already moved"
+
+}
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index 37976c0ea..8bf9f31c4 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -387,5 +387,6 @@
"There are tickets for this area, delete them first": "Hay tickets para esta sección, borralos primero",
"There is no company associated with that warehouse": "No hay ninguna empresa asociada a ese almacén",
"ticketLostExpedition": "El ticket [{{ticketId}}]({{{ticketUrl}}}) tiene la siguiente expedición perdida:{{ expeditionId }}",
- "The web user's email already exists": "El correo del usuario web ya existe"
-}
\ No newline at end of file
+ "The web user's email already exists": "El correo del usuario web ya existe",
+ "Sales already moved": "Ya han sido transferidas"
+}
diff --git a/modules/account/back/locale/vn-user/en.yml b/modules/account/back/locale/vn-user/en.yml
index 51de7c40d..f911ee1eb 100644
--- a/modules/account/back/locale/vn-user/en.yml
+++ b/modules/account/back/locale/vn-user/en.yml
@@ -15,7 +15,5 @@ columns:
image: image
hasGrant: has grant
userFk: user
- recoverPass: recover password
role: role
- sync: pending sync
lastPassChange: password changed
diff --git a/modules/account/back/locale/vn-user/es.yml b/modules/account/back/locale/vn-user/es.yml
index 85e8bc0dc..c05dd872c 100644
--- a/modules/account/back/locale/vn-user/es.yml
+++ b/modules/account/back/locale/vn-user/es.yml
@@ -15,7 +15,5 @@ columns:
image: imagen
hasGrant: puede delegar
userFk: usuario
- recoverPass: recuperar contraseña
role: rol
- sync: Pendiente de sincronizar
lastPassChange: contraseña modificada
diff --git a/modules/client/back/models/client-observation.json b/modules/client/back/models/client-observation.json
index 86351862d..1d906420a 100644
--- a/modules/client/back/models/client-observation.json
+++ b/modules/client/back/models/client-observation.json
@@ -55,7 +55,7 @@
"relation": "user",
"scope": {
"fields": [
- "nickname"
+ "name"
]
}
}
diff --git a/modules/entry/back/methods/stock-bought/getStockBought.js b/modules/entry/back/methods/stock-bought/getStockBought.js
index c1f99c496..9768b58e7 100644
--- a/modules/entry/back/methods/stock-bought/getStockBought.js
+++ b/modules/entry/back/methods/stock-bought/getStockBought.js
@@ -6,6 +6,9 @@ module.exports = Self => {
arg: 'workerFk',
type: 'number',
description: 'The id for a buyer',
+ }, {
+ arg: 'filter',
+ type: 'object',
},
{
arg: 'dated',
@@ -23,7 +26,7 @@ module.exports = Self => {
}
});
- Self.getStockBought = async(workerFk, dated = Date.vnNew()) => {
+ Self.getStockBought = async(workerFk, filter, dated = Date.vnNew()) => {
const models = Self.app.models;
const today = Date.vnNew();
dated.setHours(0, 0, 0, 0);
@@ -31,7 +34,7 @@ module.exports = Self => {
await models.StockBought.rawSql(`CALL vn.stockBought_calculate(?)`, [dated]);
- const filter = {
+ const defaultFilter = {
where: {dated},
include: [
{
@@ -53,6 +56,6 @@ module.exports = Self => {
if (workerFk) filter.where.workerFk = workerFk;
- return models.StockBought.find(filter);
+ return models.StockBought.find({...filter, ...defaultFilter});
};
};
diff --git a/modules/entry/back/methods/stock-bought/getStockBoughtDetail.js b/modules/entry/back/methods/stock-bought/getStockBoughtDetail.js
index d5f712edf..723e04cb9 100644
--- a/modules/entry/back/methods/stock-bought/getStockBoughtDetail.js
+++ b/modules/entry/back/methods/stock-bought/getStockBoughtDetail.js
@@ -1,3 +1,4 @@
+const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
module.exports = Self => {
Self.remoteMethod('getStockBoughtDetail', {
description: 'Returns the detail of stock bought for a given date and a worker',
@@ -12,6 +13,9 @@ module.exports = Self => {
type: 'string',
description: 'The date to filter',
required: true,
+ }, {
+ arg: 'filter',
+ type: 'object',
}
],
returns: {
@@ -24,11 +28,10 @@ module.exports = Self => {
}
});
- Self.getStockBoughtDetail = async(workerFk, dated) => {
- const models = Self.app.models;
+ Self.getStockBoughtDetail = async(workerFk, dated, filter, options) => {
+ const conn = Self.dataSource.connector;
const myOptions = {};
let tx;
- let result;
if (typeof options == 'object')
Object.assign(myOptions, options);
@@ -39,14 +42,19 @@ module.exports = Self => {
}
try {
- await models.StockBought.rawSql(`CALL vn.item_calculateStock(?)`, [dated], myOptions);
- result = await Self.rawSql(
+ const stmts = [];
+ stmts.push(new ParameterizedSQL(`CALL vn.item_calculateStock(?)`, [dated]));
+
+ const query = new ParameterizedSQL(
`SELECT b.entryFk entryFk,
i.id itemFk,
i.name itemName,
ti.quantity,
- ROUND((ac.conversionCoefficient * (ti.quantity / b.packing) * buy_getVolume(b.id))
- / (vc.trolleyM3 * 1000000),1) volume,
+ ROUND((ac.conversionCoefficient *
+ (ti.quantity / b.packing) *
+ buy_getVolume(b.id)
+ ) / (vc.trolleyM3 * 1000000),
+ 2) volume,
b.packagingFk packagingFk,
b.packing
FROM tmp.item ti
@@ -61,11 +69,17 @@ module.exports = Self => {
JOIN volumeConfig vc
WHERE ic.display
AND w.id = ?`,
- [workerFk], myOptions
+ [workerFk]
);
- await Self.rawSql(`DROP TEMPORARY TABLE tmp.item, tmp.buyUltimate;`, [], myOptions);
+
+ stmts.push(query.merge(conn.makeSuffix(filter)));
+
+ stmts.push(new ParameterizedSQL(`DROP TEMPORARY TABLE tmp.item, tmp.buyUltimate`));
+
+ const sql = ParameterizedSQL.join(stmts, ';');
+ const result = await conn.executeStmt(sql, myOptions);
if (tx) await tx.commit();
- return result;
+ return result[1];
} catch (e) {
await tx.rollback();
throw e;
diff --git a/modules/invoiceOut/front/index.js b/modules/invoiceOut/front/index.js
index a5e51d439..6d58a0a45 100644
--- a/modules/invoiceOut/front/index.js
+++ b/modules/invoiceOut/front/index.js
@@ -1,7 +1,7 @@
export * from './module';
import './main';
-import './summary';
import './descriptor';
import './descriptor-popover';
import './descriptor-menu';
+import './summary';
diff --git a/modules/invoiceOut/front/routes.json b/modules/invoiceOut/front/routes.json
index 7c7495cb9..908df3972 100644
--- a/modules/invoiceOut/front/routes.json
+++ b/modules/invoiceOut/front/routes.json
@@ -34,6 +34,12 @@
"params": {
"invoice-out": "$ctrl.invoiceOut"
}
+ },
+ {
+ "url": "/:id",
+ "state": "invoiceOut.card",
+ "abstract": true,
+ "component": "vn-invoice-out-card"
}
]
}
diff --git a/modules/item/back/methods/item-shelving-sale/filter.js b/modules/item/back/methods/item-shelving-sale/filter.js
index 01a9f1856..edd04b61f 100644
--- a/modules/item/back/methods/item-shelving-sale/filter.js
+++ b/modules/item/back/methods/item-shelving-sale/filter.js
@@ -41,7 +41,7 @@ module.exports = Self => {
u.name
FROM itemShelvingSale iss
LEFT JOIN itemShelving ish ON iss.itemShelvingFk = ish.id
- LEFT JOIN shelving s ON ish.shelvingFk = s.code
+ LEFT JOIN shelving s ON ish.shelvingFk = s.id
LEFT JOIN parking p ON s.parkingFk = p.id
LEFT JOIN account.user u ON u.id = iss.userFk`
);
diff --git a/modules/item/back/methods/item-shelving/getAlternative.js b/modules/item/back/methods/item-shelving/getAlternative.js
index 8108bfa6e..de34739bc 100644
--- a/modules/item/back/methods/item-shelving/getAlternative.js
+++ b/modules/item/back/methods/item-shelving/getAlternative.js
@@ -3,7 +3,7 @@ module.exports = Self => {
description: 'Returns a list of items and possible alternative locations',
accessType: 'READ',
accepts: [{
- arg: 'shelvingFk',
+ arg: 'shelvingCode',
type: 'string',
required: true,
}],
@@ -17,13 +17,21 @@ module.exports = Self => {
}
});
- Self.getAlternative = async(shelvingFk, options) => {
+ Self.getAlternative = async(shelvingCode, options) => {
const models = Self.app.models;
const myOptions = {};
if (typeof options == 'object')
Object.assign(myOptions, options);
+ const shelving = await models.Shelving.findOne({
+ where: {
+ code: shelvingCode
+ }
+ });
+
+ if (!shelving) return [];
+ const {id: shelvingFk} = shelving;
const filterItemShelvings = {
fields: ['id', 'visible', 'itemFk', 'shelvingFk'],
where: {shelvingFk},
@@ -42,7 +50,7 @@ module.exports = Self => {
if (itemShelvings) {
const [alternatives] = await models.ItemShelving.rawSql('CALL vn.itemShelving_getAlternatives(?)',
- [shelvingFk], myOptions
+ [shelvingCode], myOptions
);
return itemShelvings.map(itemShelving => {
const item = itemShelving.item();
diff --git a/modules/item/back/methods/item-shelving/getListItemNewer.js b/modules/item/back/methods/item-shelving/getListItemNewer.js
index 74c73532a..5c4ca277d 100644
--- a/modules/item/back/methods/item-shelving/getListItemNewer.js
+++ b/modules/item/back/methods/item-shelving/getListItemNewer.js
@@ -45,19 +45,19 @@ module.exports = Self => {
WITH tItemShelving AS(
SELECT is2.itemFk, is2.created, p.sectorFK, is2.id
FROM vn.itemShelving is2
- JOIN vn.shelving sh ON sh.code = is2.shelvingFk
+ JOIN vn.shelving sh ON sh.id = is2.shelvingFk
JOIN vn.parking p ON p.id = sh.parkingFk
JOIN vn.sector s ON s.id = p.sectorFk
JOIN vn.productionConfig pc
- WHERE is2.shelvingFk = ? AND s.code = pc.sectorFromCode
+ WHERE sh.code = ? AND s.code = pc.sectorFromCode
), tItemInSector AS (
SELECT is2.itemFk, is2.created, is2.shelvingFk
FROM vn.itemShelving is2
- JOIN vn.shelving sh ON sh.code = is2.shelvingFk
+ JOIN vn.shelving sh ON sh.id = is2.shelvingFk
JOIN vn.parking p ON p.id = sh.parkingFk
JOIN vn.sector s ON s.id = p.sectorFk
JOIN vn.productionConfig pc
- WHERE is2.shelvingFk <> ?
+ WHERE sh.code <> ?
AND s.code = pc.sectorFromCode)
SELECT ti.itemFK, tis.shelvingFk
FROM tItemShelving ti
diff --git a/modules/item/back/methods/item-shelving/specs/updateFromSale.spec.js b/modules/item/back/methods/item-shelving/specs/updateFromSale.spec.js
index dfa294000..2cdb5994b 100644
--- a/modules/item/back/methods/item-shelving/specs/updateFromSale.spec.js
+++ b/modules/item/back/methods/item-shelving/specs/updateFromSale.spec.js
@@ -5,7 +5,7 @@ describe('itemShelving updateFromSale()', () => {
const tx = await models.ItemBarcode.beginTransaction({});
const options = {transaction: tx};
const saleFk = 2;
- const filter = {where: {itemFk: 4, shelvingFk: 'HEJ'}
+ const filter = {where: {itemFk: 4, shelvingFk: 12}
};
try {
const {visible: visibleBefore} = await models.ItemShelving.findOne(filter, options);
diff --git a/modules/item/back/methods/item-shelving/specs/upsertItem.spec.js b/modules/item/back/methods/item-shelving/specs/upsertItem.spec.js
index f01cb985d..edc850211 100644
--- a/modules/item/back/methods/item-shelving/specs/upsertItem.spec.js
+++ b/modules/item/back/methods/item-shelving/specs/upsertItem.spec.js
@@ -18,22 +18,31 @@ describe('ItemShelving upsertItem()', () => {
});
it('should add two new records', async() => {
- const shelvingFk = 'GVC';
+ const shelvingCode = 'GVC';
const items = [1, 1, 1, 2];
-
- await models.ItemShelving.upsertItem(ctx, shelvingFk, items, warehouseFk, options);
+ const {id: shelvingFk} = await models.Shelving.findOne({
+ where: {
+ code: shelvingCode
+ }
+ });
+ await models.ItemShelving.upsertItem(ctx, shelvingCode, items, warehouseFk, options);
const itemShelvings = await models.ItemShelving.find({where: {shelvingFk}}, options);
expect(itemShelvings.length).toEqual(2);
});
it('should update the visible items', async() => {
- const shelvingFk = 'GVC';
+ const shelvingCode = 'GVC';
const items = [2, 2];
+ const {id: shelvingFk} = await models.Shelving.findOne({
+ where: {
+ code: shelvingCode
+ }
+ });
const {visible: visibleItemsBefore} = await models.ItemShelving.findOne({
where: {shelvingFk, itemFk: items[0]}
}, options);
- await models.ItemShelving.upsertItem(ctx, shelvingFk, items, warehouseFk, options);
+ await models.ItemShelving.upsertItem(ctx, shelvingCode, items, warehouseFk, options);
const {visible: visibleItemsAfter} = await models.ItemShelving.findOne({
where: {shelvingFk, itemFk: items[0]}
diff --git a/modules/item/back/models/item-shelving.json b/modules/item/back/models/item-shelving.json
index 5df3b0703..483d6bf3d 100644
--- a/modules/item/back/models/item-shelving.json
+++ b/modules/item/back/models/item-shelving.json
@@ -41,6 +41,9 @@
},
"available": {
"type": "number"
+ },
+ "buyFk": {
+ "type": "number"
}
},
"relations": {
@@ -57,8 +60,7 @@
"shelving": {
"type": "belongsTo",
"model": "Shelving",
- "foreignKey": "shelvingFk",
- "primaryKey": "code"
+ "foreignKey": "shelvingFk"
}
}
}
\ No newline at end of file
diff --git a/modules/item/front/barcode/index.html b/modules/item/front/barcode/index.html
deleted file mode 100644
index 8d6cb3af8..000000000
--- a/modules/item/front/barcode/index.html
+++ /dev/null
@@ -1,57 +0,0 @@
-
- |
- - Item ID - | -- Description - | -- Grouping price - | -- Packing price - | -- Min price - | -- Started - | -- Ended - | -- Warehouse - | -- |
---|---|---|---|---|---|---|---|---|---|
- |
-
- {{id}}
-
- |
-
-
-
- {{itemFk.selection.name}}
-
-
- {{price.subName}}- |
-
- |
-
- |
-
- |
-
- |
-
- |
-
- |
-
- |
-
- | - Identifier - | -- Grouping - | -- Packing - | -- Description - | -- Stems - | -- Size - | -- Type - | -- Category - | -- Intrastat - | -- Origin - | -- Buyer - | -- Weight/Piece - | -- Multiplier - | -- Active - | -- Producer - | -- Landed - | -- |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- - | -- - {{::item.id}} - - | -{{::item.grouping | dashIfEmpty}} | -{{::item.packing | dashIfEmpty}} | -
-
-
- {{::item.subName}}- |
- {{::item.stems}} | -{{::item.size}} | -- {{::item.typeName}} - | -- {{::item.category}} - | -- {{::item.intrastat}} - | -{{::item.origin}} | -- - {{::item.userName}} - - | -{{::item.weightByPiece}} | -{{::item.stemMultiplier}} | -
- |
- {{::item.producer | dashIfEmpty}} | -{{::item.landed | date:'dd/MM/yyyy'}} | -
- |
-
- |
- - Created - | -- Item - | -- Concept - | -- Parking - | -- Shelving - | -- Etiqueta - | -- Packing - | -
---|---|---|---|---|---|---|---|
- |
- {{::itemShelvingPlacementSupplyStock.created | date: 'dd/MM/yyyy'}} | -- {{::itemShelvingPlacementSupplyStock.itemFk}} - | -- - {{itemShelvingPlacementSupplyStock.longName}} - - | -- {{::itemShelvingPlacementSupplyStock.parking}} - | -- {{::itemShelvingPlacementSupplyStock.shelving}} - | -- {{(itemShelvingPlacementSupplyStock.stock / itemShelvingPlacementSupplyStock.packing).toFixed(2)}} - | -- {{::itemShelvingPlacementSupplyStock.packing}} - | -
Visible
-{{$ctrl.summary.visible}}
-Available
-{{$ctrl.summary.available}}
-
-
- {{$ctrl.summary.item.description}} -
-- {{barcode.code}} -
-{{$t('code')}} | {{$t('boxes')}} | -+ | {{$t('packing')}} | -{{$t('concept')}} | -{{$t('reference')}} | -{{$t('tags')}} | -{{$t('quantity')}} | -- | {{$t('price')}} | -- | {{$t('amount')}} | +{{$t('concept')}} | +{{$t('reference')}} | +{{$t('tags')}} | +{{$t('quantity')}} | ++ | {{$t('price')}} | ++ | {{$t('amount')}} | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
{{buy.itemFk}} | {{buy.stickers}} | -x | -{{buy.packing}} | -{{buy.name}} | -{{buy.comment}} | -- {{buy.tag5}} → {{buy.value5}} - {{buy.tag6}} → {{buy.value6}} - {{buy.tag7}} → {{buy.value7}} + | x | +{{buy.packing}} | +{{buy.name}} | +referencia de prueba | +
+
+
+ {{buy.tag5}}→ {{buy.value5}}
+ {{buy.tag6}}→ {{buy.value6}}
+
+
{{buy.tag7}}→ {{buy.value7}}
+ {{buy.tag8}}→ {{buy.value8}}
+ |
- {{buy.quantity | number($i18n.locale)}} | -x | -{{buy.buyingValue | currency('EUR', $i18n.locale)}} | -= | -+ | {{buy.quantity | number($i18n.locale)}} | +x | +{{buy.buyingValue | currency('EUR', $i18n.locale)}} | += | +{{buy.buyingValue * buy.quantity | currency('EUR', $i18n.locale)}} |
{{getTotalBy('stickers')}} | diff --git a/print/templates/reports/entry-order/locale/es.yml b/print/templates/reports/entry-order/locale/es.yml index 5a6716ba1..9ec357802 100644 --- a/print/templates/reports/entry-order/locale/es.yml +++ b/print/templates/reports/entry-order/locale/es.yml @@ -16,4 +16,5 @@ entry: Entrada {0} supplierData: Datos del proveedor notes: Notas reference: Referencia -tags: Tags \ No newline at end of file +tags: Etiquetas +code: Código \ No newline at end of file diff --git a/print/templates/reports/entry-order/sql/buys.sql b/print/templates/reports/entry-order/sql/buys.sql index 92c055483..545849908 100644 --- a/print/templates/reports/entry-order/sql/buys.sql +++ b/print/templates/reports/entry-order/sql/buys.sql @@ -10,7 +10,9 @@ SELECT b.itemFk, i.tag6, i.value6, i.tag7, - i.value7 + i.value7, + i.tag8, + i.value8 FROM buy b JOIN item i ON i.id = b.itemFk LEFT JOIN item i2 ON i2.id = b.itemOriginalFk |