DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`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 ;
