DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`waste_addSales`( vDateFrom DATE, vDateTo DATE ) BEGIN /** * Recalcula las mermas de un periodo. * * @param vDateFrom Fecha desde * @param vDateTo Fecha hasta */ DECLARE vDaysInYear INT; SET vDaysInYear = DATEDIFF(util.lastDayOfYear(CURDATE()), util.firstDayOfYear(CURDATE())); SET vDateFrom = COALESCE(vDateFrom, util.VN_CURDATE()); SET vDateTo = COALESCE(vDateTo, util.VN_CURDATE()); IF DATEDIFF(vDateTo, vDateFrom) > vDaysInYear THEN CALL util.throw('The period cannot be longer than one year'); END IF; -- Obtiene el primer día de la semana de esa fecha SET vDateFrom = DATE_SUB(vDateFrom, INTERVAL ((WEEKDAY(vDateFrom) + 1) % 7) DAY); -- Obtiene el último día de la semana de esa fecha SET vDateTo = DATE_ADD(vDateTo, INTERVAL (6 - ((WEEKDAY(vDateTo) + 1) % 7)) DAY); CALL cache.last_buy_refresh(FALSE); REPLACE bs.waste SELECT YEARWEEK(t.shipped, 6) DIV 100, WEEK(t.shipped, 6), it.workerFk, it.id, s.itemFk, SUM((b.buyingValue + b.freightValue + b.comissionValue + b.packageValue) * s.quantity), SUM(IF(aw.`type`, s.quantity, 0)), SUM(IF( aw.`type` = 'external', (b.buyingValue + b.freightValue + b.comissionValue + b.packageValue) * s.quantity, 0 ) ), SUM(IF( aw.`type` = 'fault', (b.buyingValue + b.freightValue + b.comissionValue + b.packageValue) * s.quantity, 0 ) ), SUM(IF( aw.`type` = 'container', (b.buyingValue + b.freightValue + b.comissionValue + b.packageValue) * s.quantity, 0 ) ), SUM(IF( aw.`type` = 'break', (b.buyingValue + b.freightValue + b.comissionValue + b.packageValue) * s.quantity, 0 ) ), SUM(IF( aw.`type` = 'other', (b.buyingValue + b.freightValue + b.comissionValue + b.packageValue) * s.quantity, 0 ) ) FROM vn.sale s JOIN vn.item i ON i.id = s.itemFk JOIN vn.itemType it ON it.id = i.typeFk JOIN vn.ticket t ON t.id = s.ticketFk JOIN vn.address a FORCE INDEX (PRIMARY) ON a.id = t.addressFk LEFT JOIN vn.addressWaste aw ON aw.addressFk = a.id JOIN vn.warehouse w ON w.id = t.warehouseFk JOIN cache.last_buy lb ON lb.item_id = i.id AND lb.warehouse_id = w.id JOIN vn.buy b ON b.id = lb.buy_id WHERE t.shipped BETWEEN vDateFrom AND util.dayEnd(vDateTo) AND w.isManaged GROUP BY YEARWEEK(t.shipped, 6) DIV 100, WEEK(t.shipped, 6), i.id; END$$ DELIMITER ;