DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticketComponentUpdateSale`(vCode VARCHAR(25))
BEGIN
/**
 * A partir de la tabla tmp.sale, crea los Movimientos_componentes
 * y modifica el campo Preu de la tabla Movimientos
 *
 * @param i_option integer tipo de actualizacion
 * @param table tmp.sale  tabla memory con el campo saleFk, warehouseFk
 **/
	DECLARE vComponentFk INT;

	IF vCode <> 'renewPrices' THEN 
		SELECT id INTO vComponentFk FROM component WHERE `code` = vCode;
	END IF;

	DELETE sc.* 
		FROM tmp.sale tmps 
			JOIN saleComponent sc ON sc.saleFk = tmps.saleFk
			JOIN `component` c ON c.id = sc.componentFk
	WHERE c.isRenewable;

	REPLACE INTO saleComponent(saleFk, componentFk, value)
		SELECT s.id, tc.componentFk, tc.cost
			FROM sale s 
				JOIN tmp.sale tmps ON tmps.saleFk = s.id
				JOIN tmp.ticketComponent tc ON tc.itemFk = s.itemFk AND tc.warehouseFk = tmps.warehouseFk
				LEFT JOIN saleComponent sc ON sc.saleFk = s.id
					AND sc.componentFk = tc.componentFk
				LEFT JOIN `component` c ON c.id = tc.componentFk
			WHERE IF(sc.componentFk IS NULL AND NOT c.isRenewable, FALSE, TRUE);

	-- AƱadir componente venta por paquete
	REPLACE INTO saleComponent(saleFk, componentFk, value)
		SELECT t.id, t.componentFk, t.cost
			FROM (
				SELECT s.id, tc.componentFk, tc.cost, MOD(s.quantity, b.packing) as resto
					FROM vn.sale s
						JOIN tmp.sale tmps ON tmps.saleFk = s.id
						JOIN cache.last_buy lb ON lb.item_id = s.itemFk AND tmps.warehouseFk = lb.warehouse_id
						JOIN vn.buy b ON b.id = buy_id
						JOIN tmp.ticketComponent tc ON tc.itemFk = s.itemFk AND tc.warehouseFk = tmps.warehouseFk
						JOIN `component` c ON c.id = tc.componentFk AND c.code = 'salePerPackage' 
						LEFT JOIN (
							SELECT s.id
							FROM vn.sale s
								JOIN tmp.sale tmps ON tmps.saleFk = s.id
								JOIN tmp.ticketComponent tc ON tc.itemFk = s.itemFk AND tc.warehouseFk = tmps.warehouseFk
								JOIN saleComponent sc ON sc.saleFk = s.id AND sc.componentFk = tc.componentFk
								JOIN `component` c ON c.id = sc.componentFk AND c.code = 'lastUnitsDiscount'
						) tp ON tp.id = s.id
					WHERE tp.id IS NULL
					HAVING resto <> 0) t;

	IF vCode <> 'renewPrices' THEN
		REPLACE INTO saleComponent(saleFk, componentFk, value)
			SELECT s.id, vComponentFk, ROUND((s.price * (100 - s.discount) / 100) - SUM(sc.value), 3) dif
				FROM sale s
					JOIN tmp.sale tmps ON tmps.saleFk = s.id
					LEFT JOIN saleComponent sc ON sc.saleFk = s.id
			WHERE  sc.saleFk <> vComponentFk
			GROUP BY s.id
			HAVING dif <> 0;
	ELSE
		UPDATE sale s
			JOIN item i on i.id = s.itemFk
			JOIN itemType it on it.id = i.typeFk
				JOIN (SELECT SUM(sc.value) sumValue, sc.saleFk
						FROM saleComponent sc
							JOIN tmp.sale tmps ON tmps.saleFk = sc.saleFk
						GROUP BY sc.saleFk) sc ON sc.saleFk = s.id
				SET s.price = sumValue / ((100 - s.discount) / 100)
			WHERE it.code != 'PRT' ;

		REPLACE INTO saleComponent(saleFk, componentFk, value)
			SELECT s.id, 21, ROUND((s.price * (100 - s.discount) / 100) - SUM(value), 3) saleValue
				FROM sale s
					JOIN tmp.sale tmps ON tmps.saleFk = s.id
					LEFT JOIN saleComponent sc ON sc.saleFk = s.id
				WHERE sc.componentFk != 21
				GROUP BY s.id
				HAVING ROUND(saleValue, 4) <> 0;
	END IF;

	UPDATE sale s
		JOIN (
			SELECT SUM(sc.value) sumValue, sc.saleFk 
				FROM saleComponent sc
					JOIN tmp.sale tmps ON tmps.saleFk = sc.saleFk
					JOIN `component` c ON c.id = sc.componentFk
					JOIN componentType ct on ct.id = c.typeFk AND ct.isBase
				GROUP BY sc.saleFk) sc ON sc.saleFk = s.id
		SET s.priceFixed = sumValue, s.isPriceFixed = 1;

	DELETE sc.*
		FROM saleComponent sc
			JOIN tmp.sale tmps ON tmps.saleFk = sc.saleFk
			JOIN sale s on s.id = sc.saleFk
			JOIN item i ON i.id = s.itemFk
			JOIN itemType it ON it.id = i.typeFk
		WHERE it.code = 'PRT';
		
	INSERT INTO saleComponent(saleFk, componentFk, value)
		SELECT s.id, 15, s.price
			FROM sale s
				JOIN tmp.sale tmps ON tmps.saleFk = s.id
				JOIN item i ON i.id = s.itemFK
				JOIN itemType it ON it.id = i.typeFk
		WHERE it.code = 'PRT' AND s.price > 0;
END$$
DELIMITER ;