DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `bi`.`greuge_dif_porte_add`()
BEGIN
	DECLARE vDateStarted DATETIME;
	DECLARE vDateEnded DATETIME DEFAULT TIMESTAMPADD(DAY,-1,util.VN_CURDATE());
	DECLARE vDaysSinceLastRecalculation INT;

	SELECT daysSinceLastRecalculation INTO vDaysSinceLastRecalculation
		FROM vn.greugeConfig;

	SET vDateStarted = TIMESTAMPADD(DAY, -vDaysSinceLastRecalculation, util.VN_CURDATE());

	DROP TEMPORARY TABLE IF EXISTS tmp.dp;

	-- Agencias que no cobran por volumen
	CREATE TEMPORARY TABLE tmp.dp
		(PRIMARY KEY (ticketFk))
		ENGINE = MEMORY
		 SELECT t.id ticketFk,
			SUM((t.zonePrice - t.zoneBonus) * ebv.ratio) AS teorico,
			00000.00 as practico,
			00000.00 as greuge,
			t.clientFk,
			t.shipped
		FROM vn.ticket t
			JOIN vn2008.Clientes cli ON cli.Id_cliente = t.clientFk
			LEFT JOIN vn.expedition e ON e.ticketFk = t.id
			JOIN vn.expeditionBoxVol ebv ON ebv.boxFk = e.freightItemFk
			JOIN vn.zone z ON t.zoneFk = z.id
		WHERE t.shipped between vDateStarted AND vDateEnded
			AND cli.`real`
			AND t.companyFk IN (442 , 567)
			AND z.isVolumetric = FALSE
		GROUP BY t.id;

	-- Agencias que cobran por volumen
	INSERT INTO tmp.dp
		SELECT sv.ticketFk,
			SUM(IFNULL(sv.freight,0)) AS teorico,
			00000.00 as practico,
			00000.00 as greuge,
			sv.clientFk,
			sv.shipped
		FROM vn.saleVolume sv
			JOIN vn.zone z ON z.id = sv.zoneFk
				AND sv.shipped BETWEEN vDateStarted AND vDateEnded
				AND z.isVolumetric != FALSE
		GROUP BY sv.ticketFk;

	DROP TEMPORARY TABLE IF EXISTS tmp.dp_aux;

	CREATE TEMPORARY TABLE tmp.dp_aux
		(PRIMARY KEY (ticketFk))
		ENGINE = MEMORY
		SELECT dp.ticketFk, sum(Cantidad * Valor) as valor
			FROM tmp.dp
				JOIN vn2008.Movimientos m ON m.Id_Ticket = dp.ticketFk
				JOIN vn2008.Movimientos_componentes mc using(Id_Movimiento)
			WHERE mc.Id_Componente = 15
			GROUP BY dp.ticketFk;

	UPDATE tmp.dp
		JOIN tmp.dp_aux USING(ticketFk)
		SET practico = IFNULL(valor,0);

	DROP TEMPORARY TABLE tmp.dp_aux;

	CREATE TEMPORARY TABLE tmp.dp_aux
		(PRIMARY KEY (ticketFk))
		ENGINE = MEMORY
		SELECT dp.ticketFk, sum(g.amount) Importe
			FROM tmp.dp
			JOIN vn.greuge g ON g.ticketFk = dp.ticketFk
				WHERE g.greugeTypeFk = 1 -- dif_porte
				GROUP BY dp.ticketFk;

	UPDATE tmp.dp
		JOIN tmp.dp_aux USING(ticketFk)
		SET greuge = IFNULL(Importe,0);

	INSERT INTO vn.greuge (clientFk,description,amount,shipped,greugeTypeFk,ticketFk)
		SELECT dp.clientFk,
			concat('dif_porte ', dp.ticketFk), 
			round(IFNULL(dp.teorico,0) - IFNULL(dp.practico,0) - IFNULL(dp.greuge,0),2) as Importe,
			date(dp.shipped), 
			1,
			dp.ticketFk
			FROM tmp.dp
				JOIN vn.client c ON c.id = dp.clientFk
			WHERE ABS(IFNULL(dp.teorico,0) - IFNULL(dp.practico,0) - IFNULL(dp.greuge,0)) > 1
				AND c.isRelevant;

	DROP TEMPORARY TABLE 
		tmp.dp,
		tmp.dp_aux;
END$$
DELIMITER ;
