143 lines
3.5 KiB
SQL
143 lines
3.5 KiB
SQL
DELIMITER $$
|
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `edi`.`ekt_scan`(vBarcode VARCHAR(512))
|
|
BEGIN
|
|
/**
|
|
* Busca transaciones a partir de un codigo de barras, las marca como escaneadas
|
|
* y las devuelve.
|
|
* Ver https://wiki.verdnatura.es/index.php/Ekt#Algoritmos_de_lectura
|
|
*
|
|
* @param vBarcode Código de compra de una etiqueta de subasta
|
|
* @param vLabels Cantidad escaneada
|
|
* @table tmp.ekt(ektFk) Transacciones escaneadas
|
|
*/
|
|
DECLARE vIsFound BOOL;
|
|
DECLARE vUsefulAuctionLeftSegmentLength INT;
|
|
DECLARE vStandardBarcodeLength INT;
|
|
DECLARE vFloridayBarcodeLength INT;
|
|
DECLARE vFloramondoBarcodeLength INT;
|
|
DECLARE vAuction INT;
|
|
DECLARE vKlo INT;
|
|
DECLARE vFec DATE;
|
|
DECLARE vShortAgj INT;
|
|
DECLARE vLongAgj INT;
|
|
DECLARE vXtraLongAgj INT;
|
|
DECLARE vDefaultKlo INT;
|
|
|
|
SELECT usefulAuctionLeftSegmentLength,
|
|
standardBarcodeLength,
|
|
floridayBarcodeLength,
|
|
floramondoBarcodeLength,
|
|
defaultKlo
|
|
INTO vUsefulAuctionLeftSegmentLength,
|
|
vStandardBarcodeLength,
|
|
vFloridayBarcodeLength,
|
|
vFloramondoBarcodeLength,
|
|
vDefaultKlo
|
|
FROM ektConfig;
|
|
|
|
CREATE OR REPLACE TEMPORARY TABLE tmp.ekt
|
|
ENGINE = MEMORY
|
|
SELECT id ektFk FROM ekt LIMIT 0;
|
|
|
|
CASE
|
|
WHEN LENGTH(vBarcode) <= vFloridayBarcodeLength THEN
|
|
INSERT INTO tmp.ekt
|
|
SELECT id
|
|
FROM ektRecent e
|
|
WHERE e.cps = vBarcode
|
|
OR e.batchNumber = vBarcode;
|
|
|
|
WHEN LENGTH(vBarcode) = vFloramondoBarcodeLength THEN
|
|
INSERT INTO tmp.ekt
|
|
SELECT e.id
|
|
FROM ektRecent e
|
|
WHERE e.pro = MID(vBarcode,2,6)
|
|
AND CAST(e.ptd AS SIGNED) = MID(vBarcode, 8, 5);
|
|
|
|
ELSE
|
|
SET vBarcode = LPAD(vBarcode, vStandardBarcodeLength, '0');
|
|
SET vAuction = MID(vBarcode, 1, 3);
|
|
SET vKlo = MID(vBarcode, 4, 2);
|
|
SET vFec = MAKEDATE(YEAR(util.VN_CURDATE()), MID(vBarcode, 6, 3));
|
|
SET vShortAgj = MID(vBarcode, 9, 5);
|
|
SET vLongAgj = MID(vBarcode, 9, 7);
|
|
SET vXtraLongAgj = MID(vBarcode, 9, 8);
|
|
|
|
-- Clásico de subasta
|
|
-- Trade standard
|
|
-- Trade que construye como la subasta
|
|
-- Trade como el anterior pero sin trade code
|
|
INSERT INTO tmp.ekt
|
|
SELECT id
|
|
FROM ekt
|
|
WHERE fec >= vFec - INTERVAL 1 DAY
|
|
AND (
|
|
(vKlo = vDefaultKlo
|
|
AND (klo = vKlo OR klo IS NULL OR klo = 0)
|
|
AND agj IN (vShortAgj, vLongAgj, vXtraLongAgj)
|
|
) OR (
|
|
klo = vKlo
|
|
AND auction = vAuction
|
|
AND agj = vShortAgj
|
|
)
|
|
)
|
|
ORDER BY agj DESC, fec DESC
|
|
LIMIT 1;
|
|
|
|
SELECT COUNT(*) FROM tmp.ekt INTO vIsFound;
|
|
|
|
-- BatchNumber largo
|
|
IF NOT vIsFound THEN
|
|
INSERT INTO tmp.ekt
|
|
SELECT id
|
|
FROM ektRecent e
|
|
WHERE e.batchNumber = LEFT(
|
|
vBarcode,
|
|
vUsefulAuctionLeftSegmentLength
|
|
)
|
|
AND e.batchNumber > 0;
|
|
|
|
SELECT COUNT(*) FROM tmp.ekt INTO vIsFound;
|
|
END IF;
|
|
|
|
-- Order Number
|
|
IF NOT vIsFound THEN
|
|
INSERT INTO tmp.ekt
|
|
SELECT id
|
|
FROM ektRecent e
|
|
WHERE e.putOrderFk = vBarcode;
|
|
|
|
SELECT COUNT(*) FROM tmp.ekt INTO vIsFound;
|
|
END IF;
|
|
|
|
-- deliveryNumber incrustado
|
|
IF NOT vIsFound THEN
|
|
INSERT INTO tmp.ekt
|
|
SELECT id
|
|
FROM ektRecent e
|
|
WHERE e.deliveryNumber = MID(vBarcode, 4, 13)
|
|
AND e.deliveryNumber > 0;
|
|
|
|
SELECT COUNT(*) FROM tmp.ekt INTO vIsFound;
|
|
END IF;
|
|
|
|
-- Solo campo agj
|
|
IF NOT vIsFound THEN
|
|
INSERT INTO tmp.ekt
|
|
SELECT id
|
|
FROM ektRecent
|
|
WHERE agj = vShortAgj;
|
|
|
|
SELECT COUNT(*) FROM tmp.ekt INTO vIsFound;
|
|
END IF;
|
|
|
|
END CASE;
|
|
|
|
IF vIsFound THEN
|
|
UPDATE ekt e
|
|
JOIN tmp.ekt t ON t.ektFk = e.id
|
|
SET e.scanned = TRUE;
|
|
END IF;
|
|
END$$
|
|
DELIMITER ;
|