DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`item_getLack`( vForce BOOLEAN, vDays INT, vId INT, vLongname VARCHAR(255), vSupplierFk VARCHAR(255), vColor VARCHAR(255), vSize INT, vOrigen INT, vLack INT, vWarehouseFk INT ) BEGIN /** * Calcula una tabla con el máximo negativo visible para cada producto y almacen * * @param vForce Fuerza el recalculo del stock * @param vDays Numero de dias a considerar **/ CALL `cache`.stock_refresh(vForce); CALL item_getMinacum(NULL, util.VN_CURDATE(), vDays, NULL); CALL item_getMinETD(); CALL item_zoneClosure(); SELECT i.id itemFk, i.longName, w.id warehouseFk, p.`name` producer, i.`size`, i.category, w.name warehouse, SUM(IFNULL(sub.amount,0)) lack, i.inkFk, IFNULL(im.timed, util.midnight()) timed, IFNULL(izc.timed, util.midnight()) minTimed, o.name originFk FROM (SELECT item_id, warehouse_id, amount FROM cache.stock WHERE amount > 0 UNION ALL SELECT itemFk, warehouseFk, amount FROM tmp.itemMinacum ) sub JOIN warehouse w ON w.id = sub.warehouse_id JOIN item i ON i.id = sub.item_id LEFT JOIN producer p ON p.id = i.producerFk JOIN itemType it ON it.id = i.typeFk JOIN itemCategory ic ON ic.id = it.categoryFk LEFT JOIN tmp.itemMinETD im ON im.itemFk = i.id LEFT JOIN tmp.itemZoneClosure izc ON izc.itemFk = i.id JOIN origin o ON o.id = i.originFk WHERE w.isForTicket AND ic.display AND it.code != 'GEN' AND (vId IS NULL OR i.id = vId) AND (vLongname IS NULL OR i.name = vLongname) AND (vSupplierFk IS NULL OR p.`name` LIKE CONCAT('%', vSupplierFk, '%')) AND (vColor IS NULL OR vColor = i.inkFk) AND (vSize IS NULL OR vSize = i.`size`) AND (vOrigen IS NULL OR vOrigen = w.id) AND (vLack IS NULL OR vLack = sub.amount) AND (vWarehouseFk IS NULL OR vWarehouseFk = w.id) GROUP BY i.id, w.id HAVING lack < 0; DROP TEMPORARY TABLE tmp.itemMinacum; DROP TEMPORARY TABLE tmp.itemMinETD; DROP TEMPORARY TABLE tmp.itemZoneClosure; END$$ DELIMITER ;