diff --git a/back/methods/collection/getTickets.js b/back/methods/collection/getTickets.js
index 48301a366..693358fb0 100644
--- a/back/methods/collection/getTickets.js
+++ b/back/methods/collection/getTickets.js
@@ -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 5368769fd..364ffabdf 100644
--- a/back/model-config.json
+++ b/back/model-config.json
@@ -139,6 +139,12 @@
"StarredModule": {
"dataSource": "vn"
},
+ "SaySimpleCountry": {
+ "dataSource": "vn"
+ },
+ "SaySimpleConfig": {
+ "dataSource": "vn"
+ },
"TempContainer": {
"dataSource": "tempStorage"
},
diff --git a/back/models/country.json b/back/models/country.json
index 80d456702..ee72ae49d 100644
--- a/back/models/country.json
+++ b/back/models/country.json
@@ -44,6 +44,11 @@
"type": "belongsTo",
"model": "Continent",
"foreignKey": "continentFk"
+ },
+ "saySimpleCountry": {
+ "type": "hasOne",
+ "model": "SaySimpleCountry",
+ "foreignKey": "countryFk"
}
},
"acls": [
@@ -54,4 +59,4 @@
"permission": "ALLOW"
}
]
-}
+}
\ No newline at end of file
diff --git a/back/models/say-simple-config.json b/back/models/say-simple-config.json
new file mode 100644
index 000000000..d5d4f8a6f
--- /dev/null
+++ b/back/models/say-simple-config.json
@@ -0,0 +1,29 @@
+{
+ "name": "SaySimpleConfig",
+ "base": "VnModel",
+ "options": {
+ "mysql": {
+ "table": "saySimpleConfig"
+ }
+ },
+ "properties": {
+ "id": {
+ "type": "number",
+ "id": true
+ },
+ "url": {
+ "type": "string"
+ },
+ "defaultChannel": {
+ "type": "number"
+ }
+ },
+ "acls": [
+ {
+ "accessType": "READ",
+ "principalType": "ROLE",
+ "principalId": "$authenticated",
+ "permission": "ALLOW"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/back/models/say-simple-country.json b/back/models/say-simple-country.json
new file mode 100644
index 000000000..adddddc02
--- /dev/null
+++ b/back/models/say-simple-country.json
@@ -0,0 +1,26 @@
+{
+ "name": "SaySimpleCountry",
+ "base": "VnModel",
+ "options": {
+ "mysql": {
+ "table": "saySimpleCountry"
+ }
+ },
+ "properties": {
+ "countryFk": {
+ "type": "number",
+ "id": true
+ },
+ "channel": {
+ "type": "number"
+ }
+ },
+ "acls": [
+ {
+ "accessType": "READ",
+ "principalType": "ROLE",
+ "principalId": "$authenticated",
+ "permission": "ALLOW"
+ }
+ ]
+}
\ No newline at end of file
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 918eed6e3..e8f95bd9e 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
@@ -3421,7 +3421,7 @@ INSERT INTO vn.buy
INSERT INTO vn.itemShelving
SET id = 9931,
itemFk = 999993,
- shelvingFk = 'NCC',
+ shelvingFk = 16,
visible = 10,
`grouping` = 5,
packing = 10;
@@ -3748,7 +3748,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
@@ -3757,22 +3757,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
@@ -4018,3 +4018,9 @@ INSERT INTO srt.buffer (id, x, y, `size`, `length`, stateFk, typeFk, isActive, c
(10, 0, 2000, 500, 13000, 1, 1, 1, '05A', 5, 0, NULL, NULL, NULL, NULL, 0, 1, 1, NULL);
+INSERT IGNORE INTO vn.saySimpleCountry (countryFk, channel)
+ VALUES (19, '1169'),
+ (8, '1183');
+
+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/hedera/procedures/order_getTax.sql b/db/routines/hedera/procedures/order_getTax.sql
index d24ffe7ef..371416c29 100644
--- a/db/routines/hedera/procedures/order_getTax.sql
+++ b/db/routines/hedera/procedures/order_getTax.sql
@@ -9,45 +9,54 @@ BEGIN
* @param vOrder El identificador del pedido
* @return tmp.orderTax Bases imponibles, IVA y recargo de equivalencia
*/
+ -- No poner create or replace, ya que da problemas
DROP TEMPORARY TABLE IF EXISTS tmp.addressCompany;
CREATE TEMPORARY TABLE tmp.addressCompany
(INDEX (addressFk, companyFk))
ENGINE = MEMORY
SELECT DISTINCT o.address_id addressFk, o.company_id companyFk
FROM tmp.`order` tmpOrder
- JOIN hedera.`order` o ON o.id = tmpOrder.orderFk;
+ JOIN `order` o ON o.id = tmpOrder.orderFk;
- CALL vn.addressTaxArea;
+ CALL vn.addressTaxArea();
-- Calcula el IVA y el recargo desglosado.
-
- DROP TEMPORARY TABLE IF EXISTS tmp.orderTax;
- CREATE TEMPORARY TABLE tmp.orderTax
- (INDEX (orderFk))
+ CREATE OR REPLACE TEMPORARY TABLE tmp.orderTax
+ (PRIMARY KEY (orderFk, code, rate))
ENGINE = MEMORY
- SELECT o.id orderFk,
+ WITH orders AS (
+ SELECT tor.orderFk,
+ oro.amount * oro.price total,
+ s.countryFk,
+ ata.areaFk,
+ itc.taxClassFk
+ FROM hedera.orderRow oro
+ JOIN tmp.order tor ON tor.orderFk = oro.orderFk
+ JOIN hedera.`order` o ON o.id = tor.orderFk
+ JOIN vn.item i ON i.id = oro.itemFk
+ JOIN vn.`client` c ON c.id = o.customer_id
+ JOIN vn.supplier s ON s.id = o.company_id
+ JOIN tmp.addressTaxArea ata ON ata.addressFk = o.address_id
+ AND ata.companyFk = o.company_id
+ JOIN vn.itemTaxCountry itc ON itc.itemFk = i.id
+ AND itc.countryFk = s.countryFk
+ HAVING total
+ )
+ SELECT o.orderFk,
tc.code,
- SUM(m.amount * m.price) taxableBase,
+ SUM(o.total) taxableBase,
pgc.rate
- FROM tmp.`order` tmpOrder
- JOIN `order` o ON o.id = tmpOrder.orderFk
- JOIN orderRow m ON m.orderFk = o.id
- JOIN vn.item i ON i.id = m.itemFk
- JOIN vn.`client` c ON c.id = o.customer_id
- JOIN vn.supplier s ON s.id = o.company_id
- JOIN tmp.addressTaxArea ata
- ON ata.addressFk = o.address_id AND ata.companyFk = o.company_id
- JOIN vn.itemTaxCountry itc
- ON itc.itemFk = i.id AND itc.countryFk = s.countryFk
- JOIN vn.bookingPlanner bp
- ON bp.countryFk = s.countryFk
- AND bp.taxAreaFk = ata.areaFk
- AND bp.taxClassFk = itc.taxClassFk
- JOIN vn.pgc ON pgc.`code` = bp.pgcFk
+ FROM orders o
+ JOIN vn.bookingPlanner bp ON bp.countryFk = o.countryFk
+ AND bp.taxAreaFk = o.areaFk
+ AND bp.taxClassFk = o.taxClassFk
+ JOIN vn.pgc ON pgc.code = bp.pgcFk
JOIN vn.taxClass tc ON tc.id = bp.taxClassFk
- GROUP BY tmpOrder.orderFk, pgc.`code`, pgc.rate
- HAVING taxableBase != 0;
+ GROUP BY o.orderFk, pgc.code, pgc.rate
+ HAVING taxableBase
+ ORDER BY bp.priority;
+ -- No poner create or replace, ya que da problemas
DROP TEMPORARY TABLE IF EXISTS tmp.orderAmount;
CREATE TEMPORARY TABLE tmp.orderAmount
(INDEX (orderFk))
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/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/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/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 b50b4784d..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;
@@ -127,7 +127,7 @@ BEGIN
LEFT JOIN tItemShelvingStock_byWarehouse issw ON issw.itemFk = i.id
AND issw.warehouseFk = t.warehouseFk
WHERE IFNULL(v.visible, 0) < s.quantity
- AND IFNULL(av.available, 0) < s.quantity
+ AND IFNULL(av.available, 0) < 0
AND IFNULL(issw.visible, 0) < s.quantity
AND NOT s.isPicked
AND NOT s.reserved
@@ -190,7 +190,7 @@ BEGIN
LEFT JOIN tItemShelvingStock_byWarehouse issw ON issw.itemFk = i.id
AND issw.warehouseFk = t.warehouseFk
WHERE IFNULL(v.visible, 0) < s.quantity
- AND IFNULL(av.available, 0) >= s.quantity
+ AND IFNULL(av.available, 0) >= 0
AND IFNULL(issw.visible, 0) < s.quantity
AND s.quantity > 0
AND NOT s.isPicked
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..c3b5a0dc6 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;
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/procedures/ticket_splitItemPackingType.sql b/db/routines/vn/procedures/ticket_splitItemPackingType.sql
index 9a4bc01eb..0ee865af5 100644
--- a/db/routines/vn/procedures/ticket_splitItemPackingType.sql
+++ b/db/routines/vn/procedures/ticket_splitItemPackingType.sql
@@ -3,87 +3,124 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`ticket_splitItemPacki
vSelf INT,
vOriginalItemPackingTypeFk VARCHAR(1)
)
-proc:BEGIN
+BEGIN
/**
- * Clona y reparte las líneas de ventas de un ticket en funcion del tipo de empaquetado.
- * Respeta el id de ticket original para el tipo de empaquetado propuesto.
+ * Clona y reparte las ventas de un ticket en funcion del tipo de empaquetado.
+ * Respeta el id inicial para el tipo propuesto.
*
* @param vSelf Id ticket
- * @param vOriginalItemPackingTypeFk Tipo empaquetado que se mantiene el ticket original
+ * @param vOriginalItemPackingTypeFk Tipo para el que se reserva el número de ticket original
* @return table tmp.ticketIPT(ticketFk, itemPackingTypeFk)
*/
- DECLARE vDone INT DEFAULT FALSE;
- DECLARE vHasItemPackingType BOOL;
- DECLARE vItemPackingTypeFk INT;
+ DECLARE vItemPackingTypeFk VARCHAR(1) DEFAULT 'H';
DECLARE vNewTicketFk INT;
+ DECLARE vPackingTypesToSplit INT;
+ DECLARE vDone INT DEFAULT FALSE;
- DECLARE vItemPackingTypes CURSOR FOR
- SELECT DISTINCT itemPackingTypeFk
- FROM tSalesToMove;
+ DECLARE vSaleGroup CURSOR FOR
+ SELECT itemPackingTypeFk
+ FROM tSaleGroup
+ WHERE itemPackingTypeFk IS NOT NULL
+ ORDER BY (itemPackingTypeFk = vOriginalItemPackingTypeFk) DESC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
- SELECT COUNT(*) INTO vHasItemPackingType
- FROM ticket t
- JOIN sale s ON s.ticketFk = t.id
- JOIN item i ON i.id = s.itemFk
- WHERE t.id = vSelf
- AND i.itemPackingTypeFk = vOriginalItemPackingTypeFk;
+ START TRANSACTION;
+
+ SELECT id
+ FROM sale
+ WHERE ticketFk = vSelf
+ AND NOT quantity
+ FOR UPDATE;
+
+ DELETE FROM sale
+ WHERE NOT quantity
+ AND ticketFk = vSelf;
+
+ CREATE OR REPLACE TEMPORARY TABLE tSale
+ (PRIMARY KEY (id))
+ ENGINE = MEMORY
+ SELECT s.id, i.itemPackingTypeFk, IFNULL(sv.litros, 0) litros
+ FROM sale s
+ JOIN item i ON i.id = s.itemFk
+ LEFT JOIN saleVolume sv ON sv.saleFk = s.id
+ WHERE s.ticketFk = vSelf;
+
+ CREATE OR REPLACE TEMPORARY TABLE tSaleGroup
+ ENGINE = MEMORY
+ SELECT itemPackingTypeFk, SUM(litros) totalLitros
+ FROM tSale
+ GROUP BY itemPackingTypeFk;
+
+ SELECT COUNT(*) INTO vPackingTypesToSplit
+ FROM tSaleGroup
+ WHERE itemPackingTypeFk IS NOT NULL;
CREATE OR REPLACE TEMPORARY TABLE tmp.ticketIPT(
ticketFk INT,
itemPackingTypeFk VARCHAR(1)
- ) ENGINE=MEMORY
- SELECT vSelf ticketFk, vOriginalItemPackingTypeFk itemPackingTypeFk;
+ ) ENGINE = MEMORY;
- IF NOT vHasItemPackingType THEN
- LEAVE proc;
- END IF;
+ CASE vPackingTypesToSplit
+ WHEN 0 THEN
+ INSERT INTO tmp.ticketIPT(ticketFk, itemPackingTypeFk)
+ VALUES(vSelf, vItemPackingTypeFk);
+ WHEN 1 THEN
+ INSERT INTO tmp.ticketIPT(ticketFk, itemPackingTypeFk)
+ SELECT vSelf, itemPackingTypeFk
+ FROM tSaleGroup
+ WHERE itemPackingTypeFk IS NOT NULL;
+ ELSE
+ OPEN vSaleGroup;
+ FETCH vSaleGroup INTO vItemPackingTypeFk;
- CREATE OR REPLACE TEMPORARY TABLE tSalesToMove (
- ticketFk INT,
- saleFk INT,
- itemPackingTypeFk INT
- ) ENGINE=MEMORY;
+ INSERT INTO tmp.ticketIPT(ticketFk, itemPackingTypeFk)
+ VALUES(vSelf, vItemPackingTypeFk);
- INSERT INTO tSalesToMove (saleFk, itemPackingTypeFk)
- SELECT s.id, i.itemPackingTypeFk
- FROM ticket t
- JOIN sale s ON s.ticketFk = t.id
- JOIN item i ON i.id = s.itemFk
- WHERE t.id = vSelf
- AND i.itemPackingTypeFk <> vOriginalItemPackingTypeFk;
+ l: LOOP
+ SET vDone = FALSE;
+ FETCH vSaleGroup INTO vItemPackingTypeFk;
- OPEN vItemPackingTypes;
+ IF vDone THEN
+ LEAVE l;
+ END IF;
- l: LOOP
- SET vDone = FALSE;
- FETCH vItemPackingTypes INTO vItemPackingTypeFk;
+ CALL ticket_Clone(vSelf, vNewTicketFk);
- IF vDone THEN
- LEAVE l;
- END IF;
+ INSERT INTO tmp.ticketIPT(ticketFk, itemPackingTypeFk)
+ VALUES(vNewTicketFk, vItemPackingTypeFk);
+ END LOOP;
- CALL ticket_Clone(vSelf, vNewTicketFk);
+ CLOSE vSaleGroup;
- UPDATE tSalesToMove
- SET ticketFk = vNewTicketFk
- WHERE itemPackingTypeFk = vItemPackingTypeFk;
+ SELECT s.id
+ FROM sale s
+ JOIN tSale ts ON ts.id = s.id
+ JOIN tmp.ticketIPT t ON t.itemPackingTypeFk = ts.itemPackingTypeFk
+ FOR UPDATE;
- END LOOP;
+ UPDATE sale s
+ JOIN tSale ts ON ts.id = s.id
+ JOIN tmp.ticketIPT t ON t.itemPackingTypeFk = ts.itemPackingTypeFk
+ SET s.ticketFk = t.ticketFk;
- CLOSE vItemPackingTypes;
+ SELECT itemPackingTypeFk INTO vItemPackingTypeFk
+ FROM tSaleGroup sg
+ WHERE sg.itemPackingTypeFk IS NOT NULL
+ ORDER BY sg.itemPackingTypeFk
+ LIMIT 1;
- UPDATE sale s
- JOIN tSalesToMove stm ON stm.saleFk = s.id
- SET s.ticketFk = stm.ticketFk
- WHERE stm.ticketFk;
+ UPDATE sale s
+ JOIN tSale ts ON ts.id = s.id
+ JOIN tmp.ticketIPT t ON t.itemPackingTypeFk = vItemPackingTypeFk
+ SET s.ticketFk = t.ticketFk
+ WHERE ts.itemPackingTypeFk IS NULL;
+ END CASE;
- INSERT INTO tmp.ticketIPT (ticketFk, itemPackingTypeFk)
- SELECT ticketFk, itemPackingTypeFk
- FROM tSalesToMove
- GROUP BY ticketFk;
+ COMMIT;
- DROP TEMPORARY TABLE tSalesToMove;
+ DROP TEMPORARY TABLE
+ tSale,
+ tSaleGroup;
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/11251-navyChrysanthemum/01-firstScript.sql b/db/versions/11251-navyChrysanthemum/01-firstScript.sql
deleted file mode 100644
index c942e0400..000000000
--- a/db/versions/11251-navyChrysanthemum/01-firstScript.sql
+++ /dev/null
@@ -1 +0,0 @@
--- ALTER TABLE vn.sale MODIFY COLUMN originalQuantity decimal(10,2) DEFAULT 0.00 NOT NULL COMMENT 'Se utiliza para notificar a través de rocket los cambios de quantity';
\ No newline at end of file
diff --git a/db/versions/11324-salmonCataractarum/00-firstScript.sql b/db/versions/11324-salmonCataractarum/00-firstScript.sql
new file mode 100644
index 000000000..5c17ed549
--- /dev/null
+++ b/db/versions/11324-salmonCataractarum/00-firstScript.sql
@@ -0,0 +1,71 @@
+CREATE TABLE IF NOT EXISTS `vn`.`itemTextureTag` (
+ `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
+ `name` varchar(50) DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `name_UNIQUE` (`name`)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT
+ CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
+
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Natural y encerado');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Natural y esponjoso');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Natural y foam');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Natural y látex');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Arenosa');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Aterciopelado');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Engomado');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Flocado');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Foam');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Gasa');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Goma');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Látex');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Latón');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Mate');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Metálico');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Natural');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Natural y engomado');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Plastificado');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Plastificado y engomado');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Plastificado y rugoso');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Pluma');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Plástico');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Plástico engomado');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Poliéster');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Poliéster texturizado');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Rugoso');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Rígido');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Seminatural');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Silicona');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Suave');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela con brillo');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela con texturas');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela dura');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela engomada');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela escarchada');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela flocada');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela flocada engomada');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela foam');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela micro peach');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela plastificada');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela plástico engomado');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela poliéster');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela PVC');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela ratan');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela rigida');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela rugosa');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela rústica');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela sintética');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela y cristal');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela y foam');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela y goma');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela y látex');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela y madera');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela y plástico');
+INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela y seco');
+
+UPDATE vn.tag
+ SET isFree=0,
+ sourceTable='itemTextureTag'
+ WHERE name= 'Textura';
+
+GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE vn.itemTextureTag TO logisticAssist;
diff --git a/db/versions/11330-greenMoss/00-firstScript.sql b/db/versions/11330-greenMoss/00-firstScript.sql
new file mode 100644
index 000000000..127c8e40e
--- /dev/null
+++ b/db/versions/11330-greenMoss/00-firstScript.sql
@@ -0,0 +1,16 @@
+CREATE TABLE IF NOT EXISTS vn.saySimpleCountry(
+ countryFk MEDIUMINT(8) UNSIGNED,
+ channel INT(4) COMMENT 'channel de whatsapp de saySimple',
+ PRIMARY KEY (countryFk),
+ CONSTRAINT `saySimpleCountry_FK` FOREIGN KEY (`countryFk`) REFERENCES vn.country (`id`) ON UPDATE CASCADE
+);
+
+CREATE TABLE IF NOT EXISTS vn.saySimpleConfig(
+ id INT AUTO_INCREMENT PRIMARY KEY,
+ url VARCHAR(255) NOT NULL
+);
+
+INSERT IGNORE INTO vn.saySimpleCountry (countryFk, channel)
+ VALUES (19, 1169),
+ (8, 1183),
+ (NULL, 1320);
\ No newline at end of file
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/11344-grayBamboo/01-firstScript.sql b/db/versions/11344-grayBamboo/01-firstScript.sql
new file mode 100644
index 000000000..e3e08e0aa
--- /dev/null
+++ b/db/versions/11344-grayBamboo/01-firstScript.sql
@@ -0,0 +1 @@
+ALTER TABLE vn.sale MODIFY COLUMN originalQuantity decimal(10,2) DEFAULT 0.00 NOT NULL COMMENT 'Se utiliza para notificar a través de rocket los cambios de quantity';
\ No newline at end of file
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/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/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/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..95f6ff326 100644
--- a/loopback/locale/en.json
+++ b/loopback/locale/en.json
@@ -241,9 +241,8 @@
"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",
+ "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"
-}
\ No newline at end of file
+}
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/methods/client/summary.js b/modules/client/back/methods/client/summary.js
index 8162096f0..9242fbd44 100644
--- a/modules/client/back/methods/client/summary.js
+++ b/modules/client/back/methods/client/summary.js
@@ -54,7 +54,10 @@ module.exports = Self => {
{
relation: 'country',
scope: {
- fields: ['name']
+ fields: ['id', 'name'],
+ include: {
+ relation: 'saySimpleCountry',
+ }
}
},
{
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..60b099682 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,8 +42,10 @@ 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,
@@ -61,11 +66,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/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..9a0ebc61d 100644
--- a/modules/item/back/models/item-shelving.json
+++ b/modules/item/back/models/item-shelving.json
@@ -57,8 +57,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 |