DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bs`.`sale_add`( IN vStarted DATE, IN vEnded DATE ) BEGIN /** * AƱade las ventas que se realizaron entre 2 fechas a la tabla bs.sale * * @param vStarted Fecha de inicio * @param vEnded Fecha de fin * */ IF vStarted < (util.VN_CURDATE() - INTERVAL 5 YEAR) OR vStarted > vEnded THEN CALL util.throw('Wrong date'); END IF; DELETE FROM sale WHERE dated BETWEEN vStarted AND vEnded; REPLACE sale( saleFk, amount, surcharge, dated, typeFk, clientFk, companyFk, margin )WITH calculatedSales AS( SELECT s.id saleFk, CAST(SUM(IF(ct.isBase, s.quantity * sc.value, 0)) AS DECIMAL(10, 3)) amount, CAST(SUM(IF(ct.isBase, 0, s.quantity * sc.value)) AS DECIMAL(10, 3)) surcharge, s.total, DATE(t.shipped) dated, i.typeFk, t.clientFk, t.companyFk, CAST(SUM(IF(ct.isMargin, s.quantity * sc.value, 0 )) AS DECIMAL(10, 3)) marginComponents FROM vn.ticket t STRAIGHT_JOIN vn.sale s ON s.ticketFk = t.id JOIN vn.item i ON i.id = s.itemFk JOIN vn.itemType it ON it.id = i.typeFk JOIN vn.itemCategory ic ON ic.id = it.categoryFk JOIN vn.saleComponent sc ON sc.saleFk = s.id JOIN vn.component c ON c.id = sc.componentFk JOIN vn.componentType ct ON ct.id = c.typeFk WHERE t.shipped BETWEEN vStarted AND vEnded AND s.quantity <> 0 AND ic.merchandise GROUP BY s.id )SELECT saleFk, amount, surcharge, dated, typeFk, clientFk, companyFk, IF (marginComponents IS NULL, 0, CAST(marginComponents + amount + surcharge - total AS DECIMAL(10, 3))) FROM calculatedSales; END$$ DELIMITER ;