
/****** Object:  StoredProcedure [dbo].[Update_PrecioCheckin]    Script Date: 12/02/2015 10:44:59 ******/

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO

--ALTER PROCEDURE [dbo].[Update_PrecioCheckin]
ALTER PROCEDURE dbo.Update_PrecioCheckin
	  @Id_Face INT, 
	  @TipoProforma INT,
	  @debug BIT = 0
AS

/*	Hecho por: Luis Abarca
	Fecha    : 15 Julio 2014
	Detalle  : Recalcual los precio ,
	           al hacer un checkin ,
	           de Reservas o Rooming
*/

/*  Modificado por: Francis Bolaños 
    Fecha         : 02 Diciembre 2015 (U17 - v5.0.255)
    Descripción   : Evitar que multiplique cargos por el pax cuando porpax es cero
                    Cálculo de impuestos basado en la configuración, no quemado.
                    Se mete variable @debug para depurarlo
*/

BEGIN

	/* ======================================  */

	DECLARE @Id_Faca     INT, 
			@Id_Uhab     INT, 
			@Monto       NUMERIC(15, 2), 
			@MontoPrecio NUMERIC(15, 2), 
			@FechaIn     DATETIME, 
			@FechaOut    DATETIME, 
			@IdContrato  INT, 
			@IdCcon      INT, 
			@IdFacp      INT, 
			@IdFapp      INT, 
			@Impuesto    NUMERIC(5, 2), 
			@PrecioOut   NUMERIC(13, 4), 
			@Precio      NUMERIC(13, 4), 
			@vPrecio     NUMERIC(12, 2), 
			@IdRoom      INT, 
			@cObserva    NVARCHAR(255), 
			@CantidadHab INT
        
/* --------------------------
   01 Informacion de hoteface
   -------------------------- 
*/

	SELECT @id_faca = id_faca, 
		   @Id_Uhab = id_uhab, 
		   @IdContrato = id_Cont, 
		   @FechaIn = fecha_ent, 
		   @FechaOut = fecha_sal, 
		   @Monto = precio, 
		   @IdRoom = id_room, 
		   @cObserva = LEFT(observaciones, 255)
	FROM   HOTEFACE
	WHERE  id_face = @Id_Face
	
	IF @debug = 1
	BEGIN
		SELECT @id_faca id_faca, 
			   @Id_Uhab Id_Uhab, 
			   @IdContrato IdContrato, 
			   @FechaIn FechaIn, 
			   @FechaOut FechaOut, 
			   @Monto Monto, 
			   @IdRoom IdRoom, 
			   @cObserva cObserva
	END

	UPDATE HOTEFACA
	SET    observaciones = @cObserva
	WHERE  id_faca = @Id_Faca

/* ..........................
   02 Concepto de Hospedaje
   --------------------------           
*/

	SELECT TOP 1 @IdCcon = hCcon.id_ccon
	FROM       HOTECPRE hCPre
	INNER JOIN HOTECCON hCcon ON hCcon.id_ccon = hCPre.id_ccon
	INNER JOIN HOTECFAG hCfag ON hCfag.id_cfag = hCcon.id_cfag
	INNER JOIN HOTEPERI hPeri ON hPeri.id_peri = hCPre.id_peri
	WHERE id_cont = @IdContrato
	  AND id_uhab = @Id_Uhab
	  AND @FechaIn BETWEEN fecha_desde AND fecha_hasta

/* --------------------------------------------------------------------------------- 
   03 Impuesto de contrato   
      01 Octubre 2013, se agrego el impuesto
      INTUR,esto es solo para Nicaragua  
      
      -- v5.0.255: Vamos a ignorar la quema del 01 de octubre de 2013 
      y a hacerlo bien, leyendo la configuración del servicio de agencia del uso.
   ---------------------------------------------------------------------------------       
*/

	

	SELECT @Impuesto = SUM(CASE WHEN it.incluido = 0 THEN porc_impu / 100
								--ELSE 1 -- v5.0.255: Esto estaba malo, al sumar el otro 1 al final daba 2, dividiendo el precio a la mitad
								ELSE 0
						        END) + 1
	FROM       HOTEIMCO it
	INNER JOIN SICLAIMP im ON it.id_impu = im.id_impu
	INNER JOIN HOTECONT ta ON it.id_cont = ta.id_cont 
	INNER JOIN HOTECCON st ON ta.id_cont = st.id_cont
	INNER JOIN HOTECFAG sa ON st.id_cfag = sa.id_cfag
	INNER JOIN HOTEIMAG ai ON sa.id_cfag = ai.id_cfag 
	                      AND im.id_impu = ai.id_impu
	INNER JOIN SICLAMON mo ON ta.id_mone = mo.id_mone
	WHERE ta.id_cont = @IdContrato
	  AND st.id_ccon = @IdCcon

	/*SELECT @Impuesto = SUM(CASE WHEN incluido = 0 THEN porc_impu / 100
								--ELSE 1 -- v5.0.255: Esto estaba malo, al sumar el otro 1 al final daba 2, dividiendo el precio a la mitad
								ELSE 0
						        END) + 1
	FROM   Vst_ImpContrato
	WHERE  Desc_Impu IN('IMPUESTO DE VENTAS', 'INTUR')
	  AND  id_cont = @IdContrato*/
	  
	SELECT @Impuesto = ISNULL(@Impuesto, 1)
	  
    IF @debug = 1
	BEGIN
		SELECT 'Impuestos Contrato'
		
		SELECT im.*, CASE WHEN it.incluido = 0 THEN porc_impu / 100
						 --ELSE 1 -- v5.0.255: Esto estaba malo, al sumar el otro 1 al final daba 2, dividiendo el precio a la mitad
						 ELSE 0
						 END impu_fin, @Impuesto impu_tot_fin
		FROM       HOTEIMCO it
		INNER JOIN SICLAIMP im ON it.id_impu = im.id_impu
		INNER JOIN HOTECONT ta ON it.id_cont = ta.id_cont 
		INNER JOIN HOTECCON st ON ta.id_cont = st.id_cont
		INNER JOIN HOTECFAG sa ON st.id_cfag = sa.id_cfag
		INNER JOIN HOTEIMAG ai ON sa.id_cfag = ai.id_cfag 
		                      AND im.id_impu = ai.id_impu
		INNER JOIN SICLAMON mo ON ta.id_mone = mo.id_mone
		WHERE ta.id_cont = @IdContrato
		  AND st.id_ccon = @IdCcon
		
		/*SELECT *, CASE WHEN incluido = 0 THEN porc_impu / 100
								--ELSE 1 -- v5.0.255: Esto estaba malo, al sumar el otro 1 al final daba 2, dividiendo el precio a la mitad
								ELSE 0
						        END impu
		FROM   Vst_ImpContrato
		WHERE  Desc_Impu IN('IMPUESTO DE VENTAS', 'INTUR')
		  AND  id_cont = @IdContrato*/
	END

/* ...............................
   04 HoteFacp        
   -------------------------------
*/

	SELECT @IdFacp = id_facp
	FROM   HOTEFACP
	WHERE  id_ccon = @IdCcon
	  AND  id_faca = @Id_Faca


/* ...............................
   05 HoteFapp  
   -------------------------------
*/

	SELECT @IdFapp = id_fapp
	FROM   HOTEFAPP
	WHERE  id_facp = @IdFacp


/* ...............................
   05  HoteFacp 
   -------------------------------        
*/

	SELECT @MontoPrecio = precio
	FROM   HOTEFAPP
	WHERE  id_facp = @IdFacp

	SET @PrecioOut = @Monto
	
	IF @debug = 1
	BEGIN
		SELECT @MontoPrecio MontoPrecio,
		       @PrecioOut PrecioOut,
		       @Impuesto Impuesto
	END

	IF @Monto <> @MontoPrecio
	BEGIN
		SET @PrecioOut = @Monto / @Impuesto
	END

	IF @Monto <> @MontoPrecio
	BEGIN
		UPDATE HOTEFAPP
		SET precio = @PrecioOut
		WHERE id_fapp = @IdFapp
	END

/* ..........................
   06 Obtener Cantidad
   --------------------------
*/

	SELECT hotecfag.id_ralo, 
		   cod_cfag, 
		   hoteccon.id_cfag, 
		   hoteccon.id_cont, 
		   hoteccon.id_ccon, 
		   cantidad = SUM(hoterlag.cantidad), 
		   hoterlag.Precio, 
		   hoterlag.Fecha_desde, 
		   hoterlag.Fecha_hasta, 
		   tipo_cfag, 
		   fecha_fija, 
		   id_con1, 
		   SUM(Factor_Div)AS Factor_Div, 
		   hotecfag.id_uhab, 
		   automatico, 
		   porpax 
	INTO #TempCantidad
	FROM       hotecfag
	INNER JOIN hoteccon ON hoteccon.id_cfag = hotecfag.id_cfag
	INNER JOIN hoterlag ON hotecfag.id_cfag = hoterlag.id_cfag
	INNER JOIN hoterool ON hoterlag.id_rool = hoterool.id_rool
	LEFT  JOIN hotencff ON hotecfag.id_cfag = hotencff.id_cfag
	LEFT  JOIN hotecant ON hotecfag.id_cfag = hotecant.id_cfag
	WHERE hoteccon.id_cont = @IdContrato
	  AND hoterool.id_room = @IdRoom
	GROUP BY hotecfag.id_ralo, cod_cfag, hoteccon.id_cfag, hoteccon.id_cont, 
			 hoteccon.id_ccon, hoterlag.Precio, hoterlag.Fecha_desde, hoterlag.Fecha_hasta, 
			 tipo_cfag, fecha_fija, id_con1, Factor_Div, 
			 hotecfag.id_uhab, automatico, porpax 
			 
	IF @debug = 1
	BEGIN
		SELECT '#TempCantidad'
		SELECT * FROM #TempCantidad
	END

	IF EXISTS(SELECT * FROM #TempCantidad)
	BEGIN
		--Create Table #Temp01
		--      (Cant int,
		--       CantActual int,
		--       id_ccon int,
		--       id_faca int )
       
		--Create Table #TempUsos1
		--       (id_facp int,id_ccon int,
		--     id_faca int,cant int,
		--     id_cfag int,cantidad_p int,
		--     uso_hab nvarchar(20) )

		/* .................................
		   07 Si la proforma, se realizo,
		   por todas las habitaciones, del 
		   rooming
		   ---------------------------------
		*/

		IF @TipoProforma = 1
		BEGIN
	
			/* .................................
			   07.01 Crear #TempCantidad_1,
			   cantidad_2: contiene la cantidad, 
			   de cada uno de los conceptos de la 
			   factura. 
			   ---------------------------------
			*/

			SELECT hotecfag.id_ralo, 
				   cod_cfag, 
				   cFace.id_faca, 
				   hoteccon.id_cfag, 
				   hoteccon.id_cont, 
				   hoteccon.id_ccon, 
				   cantidad_2 = SUM(hoterlag.cantidad), 
				   hoterlag.Precio, 
				   hoterlag.Fecha_desde, 
				   hoterlag.Fecha_hasta, 
				   tipo_cfag, 
				   fecha_fija, 
				   id_con1, 
				   SUM(Factor_Div)AS Factor_Div, 
				   hotecfag.id_uhab, 
				   automatico, 
				   porpax INTO #TempCantidad_1
			FROM       hotecfag
			INNER JOIN hoteccon ON hoteccon.id_cfag = hotecfag.id_cfag
			INNER JOIN hoterlag ON hotecfag.id_cfag = hoterlag.id_cfag
			INNER JOIN hoterool ON hoterlag.id_rool = hoterool.id_rool
			LEFT  JOIN hotencff ON hotecfag.id_cfag = hotencff.id_cfag
			LEFT  JOIN hotecant ON hotecfag.id_cfag = hotecant.id_cfag
			INNER JOIN HOTEFACE cFace ON cFace.id_face = hoterool.id_face
			WHERE hoteccon.id_cont = @IdContrato
			  AND hoterool.id_room = @IdRoom
			  AND cface.id_faca = @Id_Faca
			GROUP BY hotecfag.id_ralo, cod_cfag, hoteccon.id_cfag, 
					 hoteccon.id_cont, hoteccon.id_ccon, hoterlag.Precio, 
					 hoterlag.Fecha_desde, hoterlag.Fecha_hasta, tipo_cfag, 
					 fecha_fija, id_con1, Factor_Div, hotecfag.id_uhab, 
					 cFace.id_faca, automatico, porpax 
		
			--Select @id_faca, '#TempCantidad_1',* from #TempCantidad_1  
			--   Insert into #Temp_Usos_01
			--Select cFacp.id_facp,cFacp.id_ccon,
			--       cFace.id_faca,
			--       cUhab.max_adultos as Cantidad_02,
			--       cFag.id_cfag,
			--       cFacp.cantidad_p,
			--       cUhab.uso_hab
			-- From       HOTEFACP cFacp
			-- inner join HOTEFACE cFace on cFacp.id_faca = cFace.id_faca
			-- inner join HOTEUHAB cUhab on cUhab.id_uhab = cface.id_uhab 
			-- inner join HOTECFAG cFag  on cFag.id_uhab  = cUhab.id_uhab
			-- Where cFace.id_cont = @IdContrato
			-- and cFace.id_room = @IdRoom
	 
			--Select '#Temp_Usos_01',* from #Temp_Usos_01
			--select hCant.cantidad_2,*
			--From       HOTEFACP hFacp
			--Inner Join #TempCantidad_1 hCant on hCant.id_ccon = hFacp.id_ccon  

			/* ...................................
			   07.02 Actualiza las cantidades
			   de la factura, de acuerdo con
			   los conceptos
			   ----------------------------------
			*/

			UPDATE HOTEFACP
			SET cantidad_p = hCant.cantidad_2
			FROM HOTEFACP hFacp
				 INNER JOIN #TempCantidad_1 hCant ON hCant.id_ccon = hFacp.id_ccon
			WHERE hCant.id_faca = hFacp.id_faca

		END
   
   
		/* .................................
		   08 Si la proforma, se realizo,
		   por cada una de la habitaciones,
		   o sea que se selecciono una a una 
		   cada habitación del rooming
		   ---------------------------------
		*/

		IF @TipoProforma > 1
		BEGIN
	
			/* =================================
			   08.01 Crear #TempCantidad_1   
			   cantidad_2: contiene la cantidad, 
			   de cada uno de los conceptos de la 
			   factura. 
			   .................................
			*/

			SELECT hotecfag.id_ralo, 
				   cod_cfag, 
				   cFace.id_faca, 
				   hoteccon.id_cfag, 
				   hoteccon.id_cont, 
				   hoteccon.id_ccon, 
				   cantidad_2 = SUM(hoterlag.cantidad), 
				   hoterlag.Precio, 
				   hoterlag.Fecha_desde, 
				   hoterlag.Fecha_hasta, 
				   tipo_cfag, 
				   fecha_fija, 
				   id_con1, 
				   SUM(Factor_Div)AS Factor_Div, 
				   hotecfag.id_uhab, 
				   automatico, 
				   porpax INTO #TempCantidad_2
			FROM       hotecfag
			INNER JOIN hoteccon ON hoteccon.id_cfag = hotecfag.id_cfag
			INNER JOIN hoterlag ON hotecfag.id_cfag = hoterlag.id_cfag
			INNER JOIN hoterool ON hoterlag.id_rool = hoterool.id_rool
			LEFT  JOIN hotencff ON hotecfag.id_cfag = hotencff.id_cfag
			LEFT  JOIN hotecant ON hotecfag.id_cfag = hotecant.id_cfag
			INNER JOIN HOTEFACE cFace ON cFace.id_face = hoterool.id_face
			WHERE hoteccon.id_cont = @IdContrato
			  AND hoterool.id_room = @IdRoom
			  AND hoterool.id_face = @Id_Face
			GROUP BY hotecfag.id_ralo, cod_cfag, hoteccon.id_cfag, 
					 hoteccon.id_cont, hoteccon.id_ccon, hoterlag.Precio, 
					 hoterlag.Fecha_desde, hoterlag.Fecha_hasta, tipo_cfag, 
					 fecha_fija, id_con1, Factor_Div, hotecfag.id_uhab, 
					 cFace.id_faca, automatico, porpax 
		
			--Select '#TempCantidad_2',* from #TempCantidad_2  

			--select hCant.cantidad_2,*
			--From        HOTEFACP hFacp
			--Inner Join #TempCantidad_2 hCant on hCant.id_ccon = hFacp.id_ccon  
			--where  hCant.id_faca = hFacp.id_faca

			/* ...................................
			   08.02 Actualiza las cantidades
			   de la factura, de acuerdo con
			   los conceptos
			   ----------------------------------
			*/

			UPDATE HOTEFACP
			SET    cantidad_p = hCant.cantidad_2
			FROM       HOTEFACP hFacp
			INNER JOIN #TempCantidad_2 hCant ON hCant.id_ccon = hFacp.id_ccon
			WHERE  hCant.id_faca = hFacp.id_faca
			
			--delete #TempCantidad_2

		END

		--Update HOTEFACP 
		--Set    cantidad_p = cantidad
		--From       HOTEFACP hFacp
		--Inner Join #TempCantidad hCant on hCant.id_ccon = hFacp.id_ccon 
	   
	END

	/* .........................................
	   09 Obtener Cantidad real de habitaciones
	   -----------------------------------------
	*/

	IF NOT EXISTS(SELECT * FROM #TempCantidad)
	BEGIN
		SELECT cFacp.id_facp, 
			   cFacp.id_ccon, 
			   cFace.id_faca, 
			   cUhab.max_adultos 
		INTO   #TempUsos
		FROM       HOTEFACP cFacp
		INNER JOIN HOTEFACE cFace ON cFacp.id_faca = cFace.id_faca
		INNER JOIN HOTEUHAB cUhab ON cUhab.id_uhab = cface.id_uhab
		INNER JOIN HOTECCON cCcon ON cFacp.id_ccon = cCcon.id_ccon -- v5.0.255 Enlace con HOTECCON para...
		WHERE cFace.id_cont = @IdContrato
		  AND cFace.id_room = @IdRoom
		  AND cCcon.porpax  = 1 -- Que solo lo haga cuando porpax es uno!!
		  
		IF @debug = 1
		BEGIN
			SELECT '#TempUsos'
			SELECT * FROM #TempUsos
		END

		UPDATE HOTEFACP
		SET    cantidad_p = max_adultos
		FROM       HOTEFACP  hFacp
		INNER JOIN #TempUsos hCant ON hCant.id_ccon = hFacp.id_ccon

	END

END
