



-- ============================================================

-- SP_PrestacionesPabellon

-- Retorna prestaciones de pabellón (IdPresupuesto IS NOT NULL).

-- se le quita el copago 07-05.2026 se indica que los usuarios se confunden asi que se decide quitar de las prestacioens realizadas

-- ============================================================

CREATE   PROCEDURE [Clinica].[SP_PrestacionesPabellon]

    @FechaDesde         DATETIME,

    @FechaHasta         DATETIME,

    @IdProfesional      INT = NULL,

    @IdProfesionalOrden INT = NULL,

    @IdTipoPrestacion   VARCHAR(100) = NULL,

    @IdCaja             INT = NULL

AS

BEGIN

    SET NOCOUNT ON;

	SELECT

        mc.IdMovimientoCaja AS IdMovimientoCaja,

        CASE WHEN mc.IdPresupuesto IS NOT NULL

            THEN CONVERT(VARCHAR,'P-'+CONVERT(VARCHAR,mc.IdPresupuesto))

            ELSE CONVERT(VARCHAR,'C-'+CONVERT(VARCHAR,mc.IdCita))

        END AS Identificador,

        cc.IdCaja,

        caja.Descripcion AS Caja,

        ec.IdTipoEstadoCaja,

        ec.Descripcion AS TipoEstadoCaja,

        '' AS RutCajero,

        usuario.LoginName AS NombreCajero,

        mc.FechaMovimiento,

        FORMAT(mc.FechaMovimiento,'HH:mm') AS HoraMovimiento,

        CASE WHEN profesional.IdTipoOrigenProfesional != 2 THEN profesional.IdProfesional

             ELSE CASE WHEN cita.IdProfesionalExterno IS NOT NULL THEN cita.IdProfesionalExterno ELSE profesionalOrigen.IdProfesional END

        END AS IdProfesional,

        CASE WHEN pd.IdBonificacion IS NOT NULL AND tipoBono.Descripcion IS NOT NULL THEN tipoBono.Descripcion

			 when tmp.IdTipoModalidadPago = 3 and mc.SistemaSalud != 1 then 'Particular'

             ELSE 'Particular'

        END AS OrigenBono,

        CASE WHEN profesional.IdTipoOrigenProfesional != 2 THEN profesional.Rut

             ELSE CASE WHEN cita.IdProfesionalExterno IS NOT NULL THEN profesionalExterno.Rut ELSE profesionalOrigen.Rut END

        END AS RutProfesional,

        CASE WHEN profesional.IdTipoOrigenProfesional != 2 THEN profesional.Nombres+' '+profesional.Apellidos

             ELSE CASE WHEN cita.IdProfesionalExterno IS NOT NULL THEN profesionalExterno.Nombres+' '+profesionalExterno.Apellidos ELSE profesionalOrigen.Nombres+' '+profesionalOrigen.Apellidos END

        END AS NombreProfesional,

        pd.IdProfesional AS IdProfesionalOrden_Potencial,

        CASE

			WHEN pd.IdProfesional is not null then pd.IdProfesional else null

			--WHEN prestacionPabellon.IdTipoPrestacion != 1 AND profesionalExterno.IdProfesional IS NULL THEN profesionalFichaEvolucion.IdProfesional

   --          WHEN profesionalExterno.IdProfesional IS NOT NULL THEN profesionalExterno.IdProfesional ELSE NULL

        END AS IdProfesionalOrden,



        CASE

			WHEN pd.IdProfesional is not null then profesionalPabellon.Rut else null

			--WHEN (CASE WHEN prestacionPabellon.IdTipoPrestacion != 1 AND profesionalExterno.IdProfesional IS NULL THEN profesionalFichaEvolucion.IdProfesional WHEN profesionalExterno.IdProfesional IS NOT NULL THEN profesionalExterno.IdProfesional ELSE NULL END)

   --             = (CASE WHEN profesional.IdTipoOrigenProfesional != 2 THEN profesional.IdProfesional ELSE CASE WHEN cita.IdProfesionalExterno IS NOT NULL THEN cita.IdProfesionalExterno ELSE profesionalOrigen.IdProfesional END END)

   --          THEN '-'

   --          ELSE CASE WHEN prestacionPabellon.IdTipoPrestacion != 1 AND profesionalExterno.IdProfesional IS NULL THEN ISNULL(profesionalFichaEvolucion.Rut,'-')

   --                    WHEN profesionalExterno.IdProfesional IS NOT NULL THEN profesionalExterno.Rut ELSE '-' END

        END AS RutProfesionalOrden,

        CASE

			WHEN pd.IdProfesional is not null then profesionalPabellon.Nombres + ' ' + profesionalPabellon.Apellidos else null

			--WHEN (CASE WHEN prestacionPabellon.IdTipoPrestacion != 1 AND profesionalExterno.IdProfesional IS NULL THEN profesionalFichaEvolucion.IdProfesional WHEN profesionalExterno.IdProfesional IS NOT NULL THEN profesionalExterno.IdProfesional ELSE NULL END)

   --             = (CASE WHEN profesional.IdTipoOrigenProfesional != 2 THEN profesional.IdProfesional ELSE CASE WHEN cita.IdProfesionalExterno IS NOT NULL THEN cita.IdProfesionalExterno ELSE profesionalOrigen.IdProfesional END END)

   --          THEN '-'

   --          ELSE CASE WHEN prestacionPabellon.IdTipoPrestacion != 1 AND profesionalExterno.IdProfesional IS NULL THEN ISNULL(profesionalFichaEvolucion.Nombres+' '+profesionalFichaEvolucion.Apellidos,'-')

   --                    WHEN profesionalExterno.IdProfesional IS NOT NULL THEN profesionalExterno.Nombres+' '+profesionalExterno.Apellidos ELSE '-' END

        END AS NombreProfesionalOrden,

        paciente.Rut AS RutPaciente,

        paciente.Nombres+' '+paciente.Apellidos AS NombrePaciente,

        prestacionPabellon.CodigoInterno AS CodigoPrestacion,

        prestacionPabellon.Descripcion AS NombrePrestacion,

        tp.IdTipoPrestacion,

        tp.Descripcion AS TipoPrestacion,

        CASE WHEN pd.IdBonificacion IS NOT NULL AND tipoBono.Descripcion IS NOT NULL THEN 'Bono'

             ELSE 'Particular'

        END AS Modalidad,

        sistemaSalud.Descripcion AS SistemaSalud,

        isapre.Descripcion AS Isapre,

        bon.NumeroBono AS NroBono,

        FORMAT(bon.FechaEmisionBono,'dd-MM-yyyy') AS FechaEmision,

        FORMAT(bon.FechaRecepcionBono,'dd-MM-yyyy') AS FechaRecepcion,

        pd.MontoPrestacion AS Valor,

        pd.MontoBonificacion AS MontoPagadoPrevision,

		CASE WHEN pd.IdBonificacion IS NOT NULL AND tipoBono.Descripcion IS NOT NULL THEN pd.MontoPrestacion - pd.MontoBonificacion - pd.MontoSeguro

             ELSE pd.MontoPrestacion

        END AS MontoCopago,

         

        pd.MontoSeguro AS SeguroComplementario,

        0 AS Excedentes,

        pd.MontoPagado AS TotalPagado,

        tipoCopago.IdTipoCopago,

        tipoCopago.Descripcion AS TipoCopago

    FROM Presupuesto.Presupuesto pres

    JOIN Presupuesto.PresupuestoDetalle pd ON pd.IdPresupuesto = pres.IdPresupuesto

	LEFT JOIN (

	SELECT *,

			ROW_NUMBER() OVER (

				PARTITION BY IdPresupuesto 

				ORDER BY 

					CASE WHEN OrigenBono IS NOT NULL AND OrigenBono != '' THEN 0 ELSE 1 END ASC,

					IdMovimientoCaja DESC

			) AS rn

	FROM Caja.MovimientoCaja

	WHERE IdTipoEstadoMovimientoCaja in(1, 3) --Pagado y control medico

	) mc ON mc.IdPresupuesto = pres.IdPresupuesto AND mc.rn = 1

    JOIN Caja.CicloCaja cc ON cc.IdCicloCaja = mc.IdCicloCaja

    JOIN Core.Usuario usuario ON usuario.IdUsuario = cc.IdUsuarioCajero

    JOIN Core.Contacto contacto ON contacto.IdContacto = usuario.IdContacto

    JOIN Caja.Caja caja ON caja.IdCaja = mc.IdCaja

    JOIN Caja.TipoEstadoCaja ec ON caja.IdTipoEstadoCaja = ec.IdTipoEstadoCaja

    left JOIN Clinica.Cita cita ON cita.IdCita = pd.IdCita

    JOIN Clinica.Profesional profesional ON profesional.IdProfesional = cita.IdProfesional

    JOIN Clinica.Paciente paciente ON paciente.IdPaciente = pres.IdPaciente

    JOIN Clinica.Prestacion prestacionPabellon ON prestacionPabellon.IdPrestacion = pd.IdPrestacion

    JOIN Clinica.TipoPrestacion tp ON tp.IdTipoPrestacion = prestacionPabellon.IdTipoPrestacion

    JOIN Caja.TipoModalidadPago tmp ON tmp.IdTipoModalidadPago = mc.IdTipoModalidadPago

    LEFT JOIN Clinica.SistemaSalud sistemaSalud ON sistemaSalud.IdSistemaSalud = pres.IdSistemaSalud

    LEFT JOIN Clinica.Isapre isapre ON isapre.IdIsapre = pres.IdIsapre

    LEFT JOIN Clinica.Bonificacion bon ON bon.IdBonificacion = pd.IdBonificacion

    LEFT JOIN Clinica.TipoBono tipoBono ON tipoBono.IdTipoBono = bon.IdTipoBono

    LEFT JOIN Clinica.Profesional profesionalPabellon ON profesionalPabellon.IdProfesional = pd.IdProfesional

    LEFT JOIN Clinica.Profesional profesionalExterno ON profesionalExterno.IdProfesional = cita.IdProfesionalExterno

    LEFT JOIN Caja.TipoCopago tipoCopago ON tipoCopago.IdTipoCopago = mc.IdTipoCopago

    LEFT JOIN (

        SELECT *, ROW_NUMBER() OVER (PARTITION BY IdCita ORDER BY IdCitaFichaEvolucionExamen) AS rn

        FROM Clinica.CitaFichaEvolucionExamen

    ) cfee_unica ON cfee_unica.IdCita = cita.IdCita AND cfee_unica.rn = 1

    LEFT JOIN Ficha.FichaEvolucion fe ON fe.IdFichaEvolucion = cfee_unica.IdFichaEvolucion

    LEFT JOIN Clinica.Profesional profesionalOrigen ON profesionalOrigen.IdProfesional = fe.IdProfesional

    LEFT JOIN Clinica.Profesional profesionalFichaEvolucion ON fe.IdProfesional = profesionalFichaEvolucion.IdProfesional

	

    WHERE mc.IdPresupuesto IS NOT NULL

		AND mc.IdTipoEstadoMovimientoCaja in(1, 3) --Pagado y control medico
    /* 
	JVE 25/06/2026 
	Para que el procedimiento muestre tambien los particulaes
    -- AND pd.IdBonificacion IS NOT NULL*/

      AND (@IdTipoPrestacion IS NULL 

			 OR tp.IdTipoPrestacion IN (

				 SELECT CAST(value AS INT) 

				 FROM STRING_SPLIT(@IdTipoPrestacion, ',')

			 ))

      AND CAST(mc.FechaMovimiento AS DATE) BETWEEN CAST(@FechaDesde AS DATE) AND CAST(@FechaHasta AS DATE)

      AND (@IdProfesional IS NULL OR profesional.IdProfesional = @IdProfesional)

      AND (@IdCaja IS NULL OR mc.IdCaja = @IdCaja)

     AND (@IdProfesionalOrden IS NULL OR 

            (CASE when pd.IdProfesional is not null then pd.IdProfesional ELSE NULL

             END) = @IdProfesionalOrden);

	

END

