== Descripcion ==
Una vez que ingresa los datos básicos de un producto, verifica que este producto tenga alguna composicion (solo los elementos básicos). Si la tiene, divide el proceso en 2 partes
#Une 2 grupos de datos dentro del mismo subconjunto
##Todos los productos-elementos de la [[VISTA:visprodadic]] cuyo codigo de producto sea igual al código de producto madre y que sea "propiamente dichos" (cuyo código de producto sea igual al código de elemento)
##Todos los productos-elementos de la [[VISTA:visprodadic]] cuyo codigo de producto sea igual al código de producto madre y el código de producto sea diferente al codigo de elemento.
###Incluye todos los productos-elementos de un nivel inferior. Esto se realiza seleccionando los elementos de la composicion como si fuesen productos y esos productos son la clave de búsqueda dentro de la misma tabla de composición.

== Composicion ==
*[[VISTA:visproadic]]->
*->[[TABLA:vidquoten3]]
== SQL ==
<small><pre>
-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`sas_admin`@`%` PROCEDURE `AltaItemPresupuesto`(
	IN pVidQuoteID INT(5), 
	IN pVidQuoteLPre INT(1), 
	IN pVidQuoteItem INT(5), 
	IN pVidQuoteProdID CHAR(8), 
	IN pVidQuoteProdCantidad INT(5), 
	IN pVidQuoteAncho INT(5), 
	IN pVidQuoteAlto INT(5), 
	IN pCoeficienteMU DECIMAL(5,2)
BEGIN
    DECLARE vVarNum INT(5);
	-- --------------------------------------------------------------------------------
	-- Inserta Registro de Auditoria
	-- --------------------------------------------------------------------------------
    CALL DebugCheckPoint(
        CONCAT(
        "PROC:AltaItemPresupuestoTmp","/",
        CAST(pVidQuoteID AS CHAR),"-",
        CAST(pVidQuoteLPre AS CHAR),"-",
        CAST(pVidQuoteItem AS CHAR),"-",
        pVidQuoteProdID,"-",
        CAST(pVidQuoteProdCantidad AS CHAR),"-",
        CAST(pVidQuoteAncho AS CHAR),"-",
        CAST(pVidQuoteAlto AS CHAR),"-",
        CAST(pCoeficienteMU AS CHAR)
        ));
	-- --------------------------------------------------------------------------------
	-- Inserta Registraciones pausibles de incorporar de acuerdo al tipo de 
	-- --------------------------------------------------------------------------------
	INSERT INTO vidquoten3 (
		VidQuoteID,
		VidQuoteItem,
		VidQuoteProdID,
		VidQuoteProdCantidad,
		VidQuoteElementoID,
		VidQuoteComposicID,
      VidQuoteElementoPM,
		VidQuotePrecio,
		VidQuotePrecioP)
	SELECT
		pVidQuoteID as VidQuoteID,
		pVidQuoteItem as VidQuoteItem,
		R1.ProductoID AS VidQuoteProdID,
		pVidQuoteProdCantidad AS VidQuoteProdCantidad,
		R1.ProdCmpID AS VidQuoteElementoID,
		R1.ComposicID AS VidQuoteComposicID,
      R1.ElementoPM AS VidQuoteElementoPM,
		SUM(
          CalculoPrecio(
			pVidQuoteAncho, 
			pVidQuoteAlto,
			`R1`.`PrecioProd`,
			`R1`.`Magnitud`,
			`R1`.`OffsetVanoAlto`,
			`R1`.`OffsetVanoAncho`,
			`R1`.`CoefVanoAlto`,
			`R1`.`CoefVanoAncho`,
			`R1`.`ValorElemento`) * pCoeficienteMU) AS VidQuotePrecio,
		SUM(
         CalculoPrecio(
			pVidQuoteAncho, 
			pVidQuoteAlto,
			`R1`.`PrecioProd`,
			`R1`.`Magnitud`,
			`R1`.`OffsetVanoAlto`,
			`R1`.`OffsetVanoAncho`,
			`R1`.`CoefVanoAlto`,
			`R1`.`CoefVanoAncho`,
			`R1`.`ValorElemento`) * pVidQuoteProdCantidad * pCoeficienteMU) AS VidQuotePrecioP

	FROM
		-- --------------------------------------------------------------------------------
		-- Selecciona elementos de composicion iguales al producto 
		-- --------------------------------------------------------------------------------
		((
		SELECT 
		U1.ProductoID,
		U1.ElementoID AS ProdCmpID,
		U1.ComposicID,
		U1.ElementoID,
		U1.ElementoPM,
		U2.Magnitud,
		U1.ValorElemento,
		U1.OffsetVanoAncho,
		U1.OffsetVanoAlto,
		U1.CoefVanoAncho,
		U1.CoefVanoAlto,
		(CASE (2)
		  WHEN 0 THEN U3.PrecioProd00
		  WHEN 1 THEN U3.PrecioProd01
		  WHEN 2 THEN U3.PrecioProd02
		  WHEN 3 THEN U3.PrecioProd03
		END) AS PrecioProd
		FROM
		fzggestion.productos AS U2,
		fzggestion.composicion AS U1,
		fzggestion.precios AS U3
		WHERE
		U2.ProductoID = U1.ElementoID AND 
		U3.ProductoID = U2.ProductoID AND 
		U1.ProductoID = pVidQuoteProdID AND 
		U1.ElementoID = pVidQuoteProdID AND 
		U1.ElementoPM = 0)
		-- --------------------------------------------------------------------------------
		UNION
		-- --------------------------------------------------------------------------------
		-- Selecciona elementos de composicion diferentes al producto
		-- --------------------------------------------------------------------------------
		(
		SELECT 
			T1.ProductoID,
			T1.ElementoID AS ProdCmpID,
			T1.ComposicID,
			T2.ElementoID,
			T1.ElementoPM,
			T3.Magnitud,
			T1.ValorElemento,        
			T1.OffsetVanoAncho,
			T1.OffsetVanoAlto,
			T1.CoefVanoAncho,
			T1.CoefVanoAlto,
			(CASE (2)
				WHEN 0 THEN `T4`.`PrecioProd00`
				WHEN 1 THEN `T4`.`PrecioProd01`
				WHEN 2 THEN `T4`.`PrecioProd02`
				WHEN 3 THEN `T4`.`PrecioProd03`
			END) AS PrecioProd
		FROM
			fzggestion.composicion AS T2,
			fzggestion.composicion AS T1,
			fzggestion.productos AS T3,
			fzggestion.precios AS T4
		WHERE
			T2.ProductoID = T1.ElementoID AND 
			T3.ProductoID = T2.ElementoID AND 
			T4.ProductoID = T3.ProductoID AND 
			T1.ProductoID <> T1.ElementoID AND 
			T2.ElementoPM = 0 AND 
			T1.ProductoID = pVidQuoteProdID AND 
			T1.ElementoPM = 0
		ORDER BY
			T1.ProductoID ASC ,
			T1.ElementoID ASC ,
			T1.ComposicID ASC ,
			T2.ElementoID ASC)
		-- --------------------------------------------------------------------------------
		-- R1 es el sinónimo de la union de las tablas 
		-- --------------------------------------------------------------------------------
		) AS R1
		GROUP BY
			VidQuoteElementoID,
			VidQuoteComposicID;
END
</pre></small>
== Bitácora ==
*20120419
**Cambio de esquema para colocar el cálculo de subitems.
*20120917
**Cambio de diseño [[FORM:Presupuesto]]
<small><pre>
delimiter |
CREATE PROCEDURE AltaItemPresupuesto (IN pVidQuoteID INT(5), IN pVidQuoteLPre INT(1), IN pVidQuoteItem INT(5), IN pVidQuoteProdID CHAR(8), IN pVidQuoteProdCantidad INT(5), IN pVidQuoteAncho INT(5), IN pVidQuoteAlto INT(5)) 
BEGIN
	INSERT INTO vidquoten3 (
		VidQuoteID,
		VidQuoteLPre,
		VidQuoteItem,
		VidQuoteProdID,
		VidQuoteProdCantidad,
		VidQuoteAncho,
		VidQuoteAlto,
		VidQuoteElementoID,
		VidQuotePrecio,
		VidQuotePrecioP)
	SELECT
		pVidQuoteID,
		pVidQuoteLPre,
		pVidQuoteItem,
		pVidQuoteProdID,
		pVidQuoteProdCantidad,
		pVidQuoteAncho,
		pVidQuoteAlto,
		`T3`.`ProdCmpID`,
		SUM(CalculoPrecio(
			pVidQuoteAncho, 
			pVidQuoteAlto,
			`T3`.`PrecioProd`,
			`T3`.`Magnitud`,
			`T3`.`OffsetVanoAlto`,
			`T3`.`OffsetVanoAncho`,
			`T3`.`CoefVanoAlto`,
			`T3`.`CoefVanoAncho`,
			`T3`.`ValorElemento`)) AS pVidQuotePrecio,
		SUM(CalculoPrecio(
			pVidQuoteAncho, 
			pVidQuoteAlto,
			`T3`.`PrecioProd`,
			`T3`.`Magnitud`,
			`T3`.`OffsetVanoAlto`,
			`T3`.`OffsetVanoAncho`,
			`T3`.`CoefVanoAlto`,
			`T3`.`CoefVanoAncho`,
			`T3`.`ValorElemento`) * pVidQuoteProdCantidad) AS pVidQuotePrecioP
	FROM
		(
		SELECT
		`T1`.`ProductoID` AS ProductoID,
		`T1`.`ProductoID` AS ProdCmpID,
		`T1`.`ElementoID`,
		`T1`.`ValorElemento`,
		`T1`.`Descripcion`,
		`T1`.`Magnitud`,
		`T1`.`OffsetVanoAncho`,
		`T1`.`OffsetVanoAlto`,
		`T1`.`CoefVanoAncho`,
		`T1`.`CoefVanoAlto`,
		(CASE (pVidQuoteLPre)
		 WHEN 0 THEN `T1`.`PrecioProd00`
		 WHEN 1 THEN `T1`.`PrecioProd01`
		 WHEN 2 THEN `T1`.`PrecioProd02`
		 WHEN 3 THEN `T1`.`PrecioProd03`
		END) AS PrecioProd
		FROM visprodadic AS T1
		WHERE ProductoID=pVidQuoteProdID AND ElementoID=pVidQuoteProdID AND ElementoPM=1
		UNION
		SELECT 
		pVidQuoteProdID AS ProductoID,
		`T2`.`ProductoID` AS ProdCmpID,
		`T2`.`ElementoID`,
		`T2`.`ValorElemento`,
		`T2`.`Descripcion`,
		`T2`.`Magnitud`,
		`T2`.`OffsetVanoAncho`,
		`T2`.`OffsetVanoAlto`,
		`T2`.`CoefVanoAncho`,
		`T2`.`CoefVanoAlto`,
		(CASE (pVidQuoteLPre)
		 WHEN 0 THEN `T2`.`PrecioProd00`
		 WHEN 1 THEN `T2`.`PrecioProd01`
		 WHEN 2 THEN `T2`.`PrecioProd02`
		 WHEN 3 THEN `T2`.`PrecioProd03`
		END) AS PrecioProd
		FROM visprodadic AS T2
		WHERE ProductoID IN 
			 (SELECT ElementoID 
			  FROM visprodadic 
			  WHERE ProductoID=pVidQuoteProdID AND ElementoID<>pVidQuoteProdID AND ElementoPM=1
		 )
		) AS T3
	GROUP BY ProdCmpID;
END;|		
</pre></small>
== Uso ==
*[[MACRO:EventoBRCDetallePresupuesto]]
== URL ==
FZG.Procedure.AltaItemPresupuesto.sql