

/****** Object:  StoredProcedure [dbo].[Calc_Ing_Proforma]    Script Date: 09/17/2014 16:51:45 ******/

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO





ALTER PROCEDURE dbo.Calc_Ing_Proforma
	  @dia_inic DATETIME, 
	  @dia_fin DATETIME, 
	  @mone INT, 
	  @tasa_ext NUMERIC(13, 8), 
	  @ing_Pro_Al NUMERIC(15, 2) OUTPUT, 
	  @ing_Pro_Pen NUMERIC(15, 2) OUTPUT, 
	  @ing_OAgen NUMERIC(15, 2) OUTPUT 
	  
/*

	-------------------------------------------------- SEVEN DSS -------------------------------------------------------------

	ADVERTENCIA: Este proceso nativo de Front se incluye en los scripts principales de Seven DSS.
	Se incluye porque tiene actualizaciones que lo hacen más preciso y permite que sus resultados sean los mismos que del DSS.
	Por favor indicar si este script fue actualizado para incluirlo en los scripts de Seven DSS y evitar
	des-actualizarlo por accidente al instalar o actualizar Seven DSS.
	
	--------------------------------------------------------------------------------------------------------------------------

*/

/* Procedimiento  que calcula los ingresos de Agencias  por facturas (Proforma)  de Alojamiento,  pension y otros   */     

AS
BEGIN
	SET NOCOUNT ON

	DECLARE @tasa NUMERIC(13, 8), 
			@tasa_mb NUMERIC(13, 8), 
			@id_cfag INT, 
			@precio NUMERIC(15, 2), 
			@cant INT, 
			@tipo_cfag TINYINT, 
			@id_cont INT, 
			@porc_dcto NUMERIC(8, 2), 
			@porc_inc NUMERIC(8, 2), 
			@porc_no_inc NUMERIC(8, 2), 
			@precio_neto NUMERIC(15, 2), 
			@tipo TINYINT, 
			@factor_div TINYINT, 
			@uhab INT, 
			@ralo INT, 
			@aloj_precio NUMERIC(15, 2), 
			@aloj_porc NUMERIC(15, 2), 
			@pen_precio NUMERIC(15, 2), 
			@pen_porc NUMERIC(4, 2), 
			@otr_precio NUMERIC(15, 2), 
			@otr_porc NUMERIC(4, 2), 
			@aloj NUMERIC(15, 2), 
			@pen NUMERIC(15, 2), 
			@otr NUMERIC(15, 2)

	SELECT @ing_Pro_Al = 0, 
		   @ing_Pro_Pen = 0, 
		   @ing_OAgen = 0

	SELECT @tasa_mb = tasa
	FROM Hotetabl tabl
		 INNER JOIN Siclamon sicla ON tabl.id_mone = sicla.id_mone

	DECLARE c_cargar SCROLL CURSOR
		FOR SELECT cfag.id_cfag, 
				   cfag.tipo_cfag, 
				   cantidad = facp.cantidad_p, 
				   precio = fapp.precio, 
				   tasa = CASE
							   WHEN cont.id_mone != @mone THEN @tasa_ext / COALESCE(faca.tasa, 1)
							   ELSE 1
						  END, 
				   faca.id_cont, 
				   hdesc.porc_dcto, 
				   ccon.factor_div, 
				   cfag.id_uhab, 
				   cfag.id_ralo
			FROM       Hotefacp facp
			INNER JOIN Hotefapp fapp ON facp.id_facp = fapp.id_facp
			INNER JOIN Hoteccon ccon ON facp.id_ccon = ccon.id_ccon
			INNER JOIN Hotecfag cfag ON ccon.id_cfag = cfag.id_cfag
			INNER JOIN Hotefaca faca ON facp.id_faca = faca.id_faca
			INNER JOIN Hotecont cont ON faca.id_cont = cont.id_cont
			LEFT  JOIN Hotedesc hdesc ON faca.id_dcto = hdesc.id_dcto
			--LEFT  JOIN HOTEFACE face  ON faca.id_faca = face.id_faca
			--LEFT  JOIN HOTEHROM hrom  ON face.id_room = hrom.id_room
			--LEFT  JOIN HOTEROOM room  ON face.id_room = room.id_room
			--LEFT  JOIN HOTEHRES hres  ON face.id_rese = hres.id_rese
			--LEFT  JOIN HOTERESE rese  ON face.id_rese = rese.id_rese
			WHERE @dia_inic >= facp.fecha_desde
			  AND @dia_inic < facp.fecha_hasta
			  AND @dia_inic >= fapp.fecha_1
			  AND @dia_inic < fapp.fecha_2
			UNION ALL
			SELECT cfag.id_cfag, 
				   cfag.tipo_cfag, 
				   facs.cantidad_s, 
				   precio = CONVERT(NUMERIC(15, 2), fasp.porciento * fapp.precio / 100), 
				   tasa = CASE
							   WHEN cont.id_mone != @mone THEN @tasa_ext / COALESCE(faca.tasa, 1)
							   ELSE 1
						  END, 
				   faca.id_cont, 
				   hdesc.porc_dcto, 
				   ccon.factor_div, 
				   cfag.id_uhab, 
				   cfag.id_ralo
			FROM       Hotefacp facp
			INNER JOIN Hotefapp fapp ON facp.id_facp = fapp.id_facp
			INNER JOIN Hotefacs facs ON facp.id_facp = facs.id_facp
			INNER JOIN Hotefasp fasp ON facs.id_facs = fasp.id_facs
			INNER JOIN Hoteccon ccon ON facs.id_ccon = ccon.id_ccon
			INNER JOIN Hotecfag cfag ON cfag.id_cfag = ccon.id_cfag
			INNER JOIN Hoteporc porc ON cfag.id_cfag = porc.id_cfag
			INNER JOIN Hotefaca faca ON facp.id_faca = faca.id_faca
			INNER JOIN Hotecont cont ON faca.id_cont = cont.id_cont
			LEFT JOIN Hotedesc hdesc ON faca.id_dcto = hdesc.id_dcto
			--LEFT  JOIN HOTEFACE face  ON faca.id_faca = face.id_faca
			--LEFT  JOIN HOTEHROM hrom  ON face.id_room = hrom.id_room
			--LEFT  JOIN HOTEROOM room  ON face.id_room = room.id_room
			--LEFT  JOIN HOTEHRES hres  ON face.id_rese = hres.id_rese
			--LEFT  JOIN HOTERESE rese  ON face.id_rese = rese.id_rese
			WHERE @dia_inic >= fapp.fecha_1
			  AND @dia_inic < fapp.fecha_2
			  AND fasp.fecha_1 = fapp.fecha_1
			  AND fasp.fecha_2 = fapp.fecha_2
		FOR READ ONLY

	OPEN c_cargar
	FETCH FIRST FROM c_cargar INTO @id_cfag, @tipo_cfag, @cant, @precio, @tasa, @id_cont, @porc_dcto, @factor_div, @uhab, @ralo
	WHILE @@fetch_status = 0
	BEGIN
		EXEC Calc_Impuestos_Cfag @id_cfag, @id_cont, @porc_inc OUTPUT, @porc_no_inc OUTPUT

		SELECT @precio_neto = @precio * 100 / (100 + @porc_inc)          

		/*  quito los impuestos incluidos en el precio */

		SELECT @precio = (@precio_neto - @precio_neto * COALESCE(@porc_dcto, 0) / 100) * @cant     

		/* quito  el descuento y calculo el precio total (por cant ) */

		SELECT @precio = @precio --+ @precio * @porc_inc / 100 + (@precio * @porc_no_inc / 100)    

		/*  Calculo el precio mas los impuestos incluidos y los no incluidos */

		SELECT @precio = @precio * @tasa 

		/* Convierto el precio a moneda final */

		IF @tipo_cfag IN(1, 2, 3)
		BEGIN
			IF @uhab IS NOT NULL
			BEGIN
				SELECT @ing_Pro_Al = @ing_Pro_Al + @precio  

			/* Ingreso de alojamiento en mb*/

			END
			ELSE
			BEGIN
				IF @ralo IS NOT NULL
				BEGIN
					SELECT @ing_Pro_Pen = @ing_Pro_Pen + @precio  

				/* Ingreso de alojamiento en mb*/

				END
				ELSE
				BEGIN
					SELECT @ing_OAgen = @ing_OAgen + @precio
				END
			END   

		/* Ingreso por otros en mb  */

		END
		ELSE
		BEGIN
			SELECT @tipo = csim.tipo_csim       

			/* tipo del concepto compuesto  */

			FROM       Hoteccom ccom
			INNER JOIN Hotecsim csim ON ccom.id_csim = csim.id_csim
			WHERE ccom.id_cfag = @id_cfag     

			/* Calculo el desglose del concepto por aloja, pension y otros  */

			EXEC Calc_Ing_Desg @id_cfag, @aloj_precio OUTPUT, @aloj_porc OUTPUT, @pen_precio OUTPUT, @pen_porc OUTPUT, @otr_precio OUTPUT, @otr_porc OUTPUT

			SELECT @aloj = @aloj_precio * @factor_div + (@precio * @aloj_porc / 100), 
				   @pen = @pen_precio * @factor_div + (@precio * @pen_porc / 100), 
				   @otr = @otr_precio * @factor_div + (@precio * @otr_porc / 100)

			IF @precio > 0 AND @aloj <= @precio
			BEGIN
				SELECT @ing_Pro_Al = @ing_Pro_Al + @aloj, 
					   @precio = @precio - @aloj
			END
			ELSE
			BEGIN
				SELECT @ing_Pro_Al = @ing_Pro_Al + @precio, 
					   @precio = 0
			END

			IF @precio > 0 AND @pen <= @precio
			BEGIN
				SELECT @ing_Pro_Pen = @ing_Pro_Pen + @pen, 
					   @precio = @precio - @pen
			END
			ELSE
			BEGIN
				SELECT @ing_Pro_Pen = @ing_Pro_Pen + @precio, 
					   @precio = 0
			END

			IF @precio > 0 AND @otr <= @precio
			BEGIN
				SELECT @ing_OAgen = @ing_OAgen + @otr, 
					   @precio = @precio - @otr
			END
			ELSE
			BEGIN
				SELECT @ing_OAgen = @ing_OAgen + @precio, 
					   @precio = 0
			END

			IF @precio > 0   

			/* Asigno el resto del desglose del concepto */

			BEGIN
				IF @tipo = 1
				BEGIN
					SELECT @ing_Pro_Al = @ing_Pro_Al + @precio
				END
				ELSE
				BEGIN
					IF @tipo = 2
					BEGIN
						SELECT @ing_Pro_Pen = @ing_Pro_Pen + @precio
					END
					ELSE
					BEGIN
						IF @tipo = 3
						BEGIN
							SELECT @ing_OAgen = @ing_OAgen + @precio
						END
					END
				END
			END

		END

		FETCH NEXT FROM c_cargar INTO @id_cfag, @tipo_cfag, @cant, @precio, @tasa, @id_cont, @porc_dcto, @factor_div, @uhab, @ralo
	END

	DEALLOCATE c_cargar
END





