DROP PROCEDURE IF EXISTS `vn`.`ticket_canAdvance`; DELIMITER $$ $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_canAdvance`(vDateFuture DATE, vDateToAdvance DATE, vWarehouseFk INT) BEGIN /** * Devuelve los tickets y la cantidad de lineas de venta que se pueden adelantar. * * @param vDateFuture Fecha de los tickets que se quieren adelantar. * @param vDateToAdvance Fecha a cuando se quiere adelantar. * @param vWarehouseFk Almacén */ DECLARE vDateInventory DATE; SELECT inventoried INTO vDateInventory FROM config; DROP TEMPORARY TABLE IF EXISTS tmp.stock; CREATE TEMPORARY TABLE tmp.stock (itemFk INT PRIMARY KEY, amount INT) ENGINE = MEMORY; INSERT INTO tmp.stock(itemFk, amount) SELECT itemFk, SUM(quantity) amount FROM ( SELECT itemFk, quantity FROM itemTicketOut WHERE shipped >= vDateInventory AND shipped < vDateFuture AND warehouseFk = vWarehouseFk UNION ALL SELECT itemFk, quantity FROM itemEntryIn WHERE landed >= vDateInventory AND landed < vDateFuture AND isVirtualStock = FALSE AND warehouseInFk = vWarehouseFk UNION ALL SELECT itemFk, quantity FROM itemEntryOut WHERE shipped >= vDateInventory AND shipped < vDateFuture AND warehouseOutFk = vWarehouseFk ) t GROUP BY itemFk HAVING amount != 0; DROP TEMPORARY TABLE IF EXISTS tmp.filter; CREATE TEMPORARY TABLE tmp.filter (INDEX (id)) SELECT origin.ticketFk futureId, dest.ticketFk id, dest.state, origin.futureState, origin.futureIpt, dest.ipt, origin.workerFk, origin.futureLiters, origin.futureLines, dest.shipped, origin.shipped futureShipped, dest.totalWithVat, origin.totalWithVat futureTotalWithVat, dest.agency, origin.futureAgency, dest.lines, dest.liters, origin.futureLines - origin.hasStock AS notMovableLines, (origin.futureLines = origin.hasStock) AS isFullMovable FROM ( SELECT s.ticketFk, t.workerFk, t.shipped, t.totalWithVat, st.name futureState, t.addressFk, am.name futureAgency, count(s.id) futureLines, GROUP_CONCAT(DISTINCT ipt.code ORDER BY ipt.code) futureIpt, CAST(SUM(litros) AS DECIMAL(10,0)) futureLiters, SUM((s.quantity <= IFNULL(st.amount,0))) hasStock FROM ticket t JOIN sale s ON s.ticketFk = t.id JOIN saleVolume sv ON sv.saleFk = s.id JOIN item i ON i.id = s.itemFk JOIN ticketState ts ON ts.ticketFk = t.id JOIN state st ON st.id = ts.stateFk JOIN agencyMode am ON t.agencyModeFk = am.id LEFT JOIN itemPackingType ipt ON ipt.code = i.itemPackingTypeFk LEFT JOIN tmp.stock st ON st.itemFk = i.id WHERE t.shipped BETWEEN vDateFuture AND util.dayend(vDateFuture) AND t.warehouseFk = vWarehouseFk GROUP BY t.id ) origin JOIN ( SELECT t.id ticketFk, t.addressFk, st.name state, GROUP_CONCAT(DISTINCT ipt.code ORDER BY ipt.code) ipt, t.shipped, t.totalWithVat, am.name agency, CAST(SUM(litros) AS DECIMAL(10,0)) liters, CAST(COUNT(*) AS DECIMAL(10,0)) `lines` FROM ticket t JOIN sale s ON s.ticketFk = t.id JOIN saleVolume sv ON sv.saleFk = s.id JOIN item i ON i.id = s.itemFk JOIN ticketState ts ON ts.ticketFk = t.id JOIN state st ON st.id = ts.stateFk JOIN agencyMode am ON t.agencyModeFk = am.id LEFT JOIN itemPackingType ipt ON ipt.code = i.itemPackingTypeFk WHERE t.shipped BETWEEN vDateToAdvance AND util.dayend(vDateToAdvance) AND t.warehouseFk = vWarehouseFk AND st.order <= 5 GROUP BY t.id ) dest ON dest.addressFk = origin.addressFk WHERE origin.hasStock != 0; DROP TEMPORARY TABLE tmp.stock; END$$ DELIMITER ;