salix/db/routines/vn/procedures/sale_getFromTicketOrCollect...

115 lines
3.6 KiB
SQL

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`sale_getFromTicketOrCollection`(vParam INT)
BEGIN
/**
* Visualizar lineas de la tabla sale a través del parámetro vParam que puede
* ser ticket o collection.
*
* @param vParam Identificador de ticket o collection
*/
DECLARE vIsCollection BOOL;
SELECT COUNT(*) INTO vIsCollection
FROM collection c
WHERE c.id = vParam;
DROP TEMPORARY TABLE IF EXISTS tmp.ticket;
DROP TEMPORARY TABLE IF EXISTS tmp.ticket2;
IF vIsCollection THEN
CREATE TEMPORARY TABLE tmp.ticket
(INDEX (id))
ENGINE = MEMORY
SELECT tc.ticketFk id
FROM ticketCollection tc
JOIN ticket t ON t.id = tc.ticketFk
WHERE tc.collectionFk = vParam;
CREATE TEMPORARY TABLE tmp.ticket2
(INDEX (id))
ENGINE = MEMORY
SELECT tc.ticketFk id
FROM ticketCollection tc
JOIN ticket t ON t.id = tc.ticketFk
WHERE tc.collectionFk = vParam;
ELSE
CREATE TEMPORARY TABLE tmp.ticket
(INDEX (id))
ENGINE = MEMORY
SELECT vParam id;
CREATE TEMPORARY TABLE tmp.ticket2
(INDEX (id))
ENGINE = MEMORY
SELECT vParam id;
END IF;
SELECT s.ticketFk,
sgd.saleGroupFk,
s.id saleFk,
s.itemFk,
s.quantity,
i.longName,
i.size,
s.reserved,
MAX(IF(st.semaphore <=> 1, TRUE, FALSE)) isPreviousPrepared,
MAX(IF(st.semaphore <=> 2, TRUE, FALSE)) isPrepared,
MAX(IF(st.semaphore <=> 3, TRUE, FALSE)) isControlled,
MAX(IF(st.semaphore <=> 4, TRUE, FALSE)) isPreControlled,
ic.color,
ip.productor,
s.discount,
s.price,
i.stems,
i.category,
o.code origin,
tt.clientFk,
s.originalQuantity,
TRIM(CONCAT(LPAD(s.concept,30,' '), ' ',
RPAD(IFNULL(i.size,''),5,' '))) line1,
'' cel1,
TRIM(CONCAT(LPAD(IFNULL(ip.productor,''),30,' '), ' ',LPAD(IFNULL(o.code,''),4,' '))) line2,
IF(s.quantity MOD IFNULL(b.packing,s.quantity + 1),
CONCAT(CAST(s.quantity/IFNULL(b.`grouping`,1) AS DECIMAL(10,0)),' x ',IFNULL(b.`grouping`,1)),
CONCAT(CAST(s.quantity / IFNULL(b.packing,1) AS DECIMAL(10,0)),' pack de ',IFNULL(b.packing,1))) cel2,
TRIM(CONCAT(ic.color)) line3,
p.code cel3,
s.isAdded,
IF(c.workerFk IS NULL, getUser(), c.workerFk) workerFk,
IF(SUM(iss.quantity) IS NULL, 0, SUM(iss.quantity)) pickedQuantity,
MIN(iss.created) picked,
IF(sm.id, TRUE, FALSE) hasMistake,
sg.sectorFk
FROM tmp.ticket t
JOIN sale s ON s.ticketFk = t.id
JOIN ticket tt ON tt.id = t.id
LEFT JOIN cache.last_buy lb ON lb.item_id = s.itemFk AND lb.warehouse_id = tt.warehouseFk
LEFT JOIN buy b ON b.id = lb.buy_id
JOIN item i ON i.id = s.itemFk
LEFT JOIN ticketCollection tc ON tc.ticketFk = t.id
LEFT JOIN collection c ON c.id = tc.collectionFk
LEFT JOIN (SELECT sub.saleFk, sub.isChecked, sub.stateFk, sub.originalQuantity
FROM (SELECT DISTINCT st.id, st.saleFk, st.isChecked, st.stateFk, st.originalQuantity
FROM tmp.ticket2 t
JOIN sale s ON s.ticketFk = t.id
JOIN saleTracking st ON st.saleFk = s.id
ORDER BY st.id DESC
LIMIT 10000000000000000000) sub
GROUP BY sub.saleFk, sub.stateFK) sub2 ON sub2.saleFk = s.id AND sub2.isChecked = 1
LEFT JOIN itemShelvingSale iss ON iss.saleFk = s.id
LEFT JOIN state st ON st.id = sub2.stateFk
LEFT JOIN itemColor ic ON ic.itemFk = s.itemFk
LEFT JOIN itemProductor ip ON ip.itemFk = s.itemFk
LEFT JOIN origin o ON o.id = i.originFk
LEFT JOIN saleGroupDetail sgd ON sgd.saleFk = s.id
LEFT JOIN saleGroup sg ON sg.id = sgd.saleGroupFk
LEFT JOIN parking p ON p.id = sg.parkingFk
LEFT JOIN saleMistake sm ON sm.saleFk = s.id
GROUP BY s.id;
DROP TEMPORARY TABLE
tmp.ticket,
tmp.ticket2;
END$$
DELIMITER ;