

	-- ============================================================
	-- SP_PrestacionesBonoExterno
	-- Retorna prestaciones con OrigenBono IN ('Externo','Imed Manual'),
	-- con split bono/pago cuando corresponde.
	-- ============================================================
	CREATE   PROCEDURE [Clinica].[SP_PrestacionesBonoExterno]
		@FechaDesde         DATETIME,
		@FechaHasta         DATETIME,
		@IdProfesional      INT = NULL,
		@IdProfesionalOrden INT = NULL,
		@IdTipoPrestacion   VARCHAR(100) = NULL,
		@IdCaja             INT = NULL
	AS
	BEGIN
		SET NOCOUNT ON;

		-- Bloque 1: sin split
		SELECT
			bq.IdMovimientoCaja, bq.Identificador, bq.IdCaja, bq.Caja,
			bq.IdTipoEstadoCaja, bq.TipoEstadoCaja, bq.RutCajero, bq.NombreCajero,
			bq.FechaMovimiento, bq.HoraMovimiento, bq.IdProfesional, bq.OrigenBono,
			bq.RutProfesional, bq.NombreProfesional, bq.IdProfesionalOrden_Potencial,
			bq.IdProfesionalOrden, bq.RutProfesionalOrden, bq.NombreProfesionalOrden,
			bq.RutPaciente, bq.NombrePaciente, bq.CodigoPrestacion, bq.NombrePrestacion,
			bq.IdTipoPrestacion, bq.TipoPrestacion, bq.Modalidad, bq.SistemaSalud, bq.Isapre,
			bq.NroBono, bq.FechaEmision, bq.FechaRecepcion,
			bq.Valor, bq.MontoPagadoPrevision, bq.MontoCopago,
			bq.SeguroComplementario, bq.Excedentes, bq.TotalPagado,
			bq.IdTipoCopago, bq.TipoCopago
		FROM (
			SELECT
				mc.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,
				mc.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,
				CASE WHEN prestacion.IdTipoPrestacion != 1 AND profesionalExterno.IdProfesional IS NULL THEN profesionalFichaEvolucion.IdProfesional
					 WHEN profesionalExterno.IdProfesional IS NOT NULL THEN profesionalExterno.IdProfesional ELSE NULL
				END AS IdProfesionalOrden_Potencial,
				CASE WHEN (CASE WHEN prestacion.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 NULL
					 ELSE CASE WHEN prestacion.IdTipoPrestacion != 1 AND profesionalExterno.IdProfesional IS NULL THEN profesionalFichaEvolucion.IdProfesional WHEN profesionalExterno.IdProfesional IS NOT NULL THEN profesionalExterno.IdProfesional ELSE NULL END
				END AS IdProfesionalOrden,
				CASE WHEN (CASE WHEN prestacion.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 prestacion.IdTipoPrestacion != 1 AND profesionalExterno.IdProfesional IS NULL THEN profesionalFichaEvolucion.Rut WHEN profesionalExterno.IdProfesional IS NOT NULL THEN profesionalExterno.Rut ELSE '-' END
				END AS RutProfesionalOrden,
				CASE WHEN (CASE WHEN prestacion.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 prestacion.IdTipoPrestacion != 1 AND profesionalExterno.IdProfesional IS NULL THEN 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,
				CASE WHEN cfee.IdCitaFichaEvolucionExamen IS NOT NULL THEN prestacionExamen.CodigoInterno ELSE prestacion.CodigoInterno END AS CodigoPrestacion,
				CASE WHEN cfee.IdCitaFichaEvolucionExamen IS NOT NULL THEN prestacionExamen.Descripcion ELSE prestacion.Descripcion END AS NombrePrestacion,
				tp.IdTipoPrestacion, tp.Descripcion AS TipoPrestacion,
				CASE WHEN cfee.rn = 1 OR cfee.IdCitaFichaEvolucionExamen IS NULL THEN tmp.Descripcion ELSE 'Bono' END AS Modalidad,
				sistemaSalud.Descripcion AS SistemaSalud, isapre.Descripcion AS Isapre,
				mc.NroBono,
				FORMAT(mc.FechaEmision,'dd-MM-yyyy') AS FechaEmision,
				FORMAT(mc.FechaRecepcion,'dd-MM-yyyy') AS FechaRecepcion,
				CASE WHEN cfee.rn = 1 OR cfee.IdCitaFichaEvolucionExamen IS NULL THEN mc.TotalBono ELSE 0 END AS Valor,
				CASE WHEN cfee.rn = 1 OR cfee.IdCitaFichaEvolucionExamen IS NULL THEN mc.MontoPagadoPrevision ELSE 0 END AS MontoPagadoPrevision,
				CASE WHEN cfee.rn = 1 OR cfee.IdCitaFichaEvolucionExamen IS NULL THEN mc.MontoCopago ELSE 0 END AS MontoCopago,
				CASE WHEN cfee.rn = 1 OR cfee.IdCitaFichaEvolucionExamen IS NULL THEN mc.Seguros ELSE 0 END AS SeguroComplementario,
				CASE WHEN cfee.rn = 1 OR cfee.IdCitaFichaEvolucionExamen IS NULL THEN mc.Excendentes ELSE 0 END AS Excedentes,
				CASE WHEN cfee.rn = 1 OR cfee.IdCitaFichaEvolucionExamen IS NULL THEN mc.Monto ELSE 0 END AS TotalPagado,
				tipoCopago.IdTipoCopago, tipoCopago.Descripcion AS TipoCopago
			FROM Caja.MovimientoCaja mc
			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
			JOIN Clinica.Cita cita ON cita.IdCita = mc.IdCita
			JOIN Clinica.Profesional profesional ON profesional.IdProfesional = cita.IdProfesional
			JOIN Clinica.Paciente paciente ON paciente.IdPaciente = cita.IdPaciente
			JOIN Clinica.Prestacion prestacion ON prestacion.IdPrestacion = cita.IdPrestacion
			JOIN Clinica.TipoPrestacion tp ON tp.IdTipoPrestacion = prestacion.IdTipoPrestacion
			JOIN Caja.TipoModalidadPago tmp ON tmp.IdTipoModalidadPago = mc.IdTipoModalidadPago
			LEFT JOIN Clinica.SistemaSalud sistemaSalud ON sistemaSalud.IdSistemaSalud = mc.SistemaSalud
			LEFT JOIN Clinica.Isapre isapre ON isapre.IdIsapre = mc.IdIsapre
			LEFT JOIN (
				SELECT *, ROW_NUMBER() OVER (PARTITION BY IdCita ORDER BY IdCitaFichaEvolucionExamen) AS rn
				FROM Clinica.CitaFichaEvolucionExamen
			) cfee ON cfee.IdCita = cita.IdCita
			LEFT JOIN Clinica.Prestacion prestacionExamen ON prestacionExamen.IdPrestacion = cfee.IdPrestacion
			LEFT JOIN Ficha.FichaEvolucion fe ON fe.IdFichaEvolucion = cfee.IdFichaEvolucion
			LEFT JOIN Clinica.Profesional profesionalOrigen ON profesionalOrigen.IdProfesional = fe.IdProfesional
			LEFT JOIN Clinica.Profesional profesionalFichaEvolucion ON fe.IdProfesional = profesionalFichaEvolucion.IdProfesional
			LEFT JOIN Clinica.Profesional profesionalExterno ON profesionalExterno.IdProfesional = cita.IdProfesionalExterno
			LEFT JOIN Caja.TipoCopago tipoCopago ON tipoCopago.IdTipoCopago = mc.IdTipoCopago
			WHERE mc.OrigenBono IN ('Externo')
         
			  AND CAST(mc.FechaMovimiento AS DATE) BETWEEN CAST(@FechaDesde AS DATE) AND CAST(@FechaHasta AS DATE)
			  AND (@IdProfesional IS NULL OR
				   CASE WHEN profesional.IdTipoOrigenProfesional != 2 THEN profesional.IdProfesional
						ELSE CASE WHEN cita.IdProfesionalExterno IS NOT NULL THEN cita.IdProfesionalExterno ELSE profesionalOrigen.IdProfesional END
				   END = @IdProfesional)
			  AND (@IdTipoPrestacion IS NULL 
				 OR tp.IdTipoPrestacion IN (
					 SELECT CAST(value AS INT) 
					 FROM STRING_SPLIT(@IdTipoPrestacion, ',')
				 ))
			  AND (@IdProfesionalOrden IS NULL OR
				   CASE WHEN (CASE WHEN prestacion.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 NULL
						ELSE CASE WHEN prestacion.IdTipoPrestacion != 1 AND profesionalExterno.IdProfesional IS NULL THEN profesionalFichaEvolucion.IdProfesional WHEN profesionalExterno.IdProfesional IS NOT NULL THEN profesionalExterno.IdProfesional ELSE NULL END
				   END = @IdProfesionalOrden)
			  AND (@IdCaja IS NULL OR mc.IdCaja = @IdCaja)
			  AND mc.IdPresupuesto IS NULL
			  and mc.Monto = 0
			  AND mc.IdTipoEstadoMovimientoCaja in(1, 3) --Pagado y control medico
		) bq
		WHERE NOT (bq.NroBono IS NOT NULL AND bq.NroBono != '' AND bq.IdTipoCopago IS NOT NULL AND bq.TotalPagado > 0)

		UNION ALL

		-- Bloque 2: split - registro bono
		SELECT
			bq.IdMovimientoCaja, bq.Identificador, bq.IdCaja, bq.Caja,
			bq.IdTipoEstadoCaja, bq.TipoEstadoCaja, bq.RutCajero, bq.NombreCajero,
			bq.FechaMovimiento, bq.HoraMovimiento, bq.IdProfesional, bq.OrigenBono,
			bq.RutProfesional, bq.NombreProfesional, bq.IdProfesionalOrden_Potencial,
			bq.IdProfesionalOrden, bq.RutProfesionalOrden, bq.NombreProfesionalOrden,
			bq.RutPaciente, bq.NombrePaciente, bq.CodigoPrestacion, bq.NombrePrestacion,
			bq.IdTipoPrestacion, bq.TipoPrestacion, bq.Modalidad, bq.SistemaSalud, bq.Isapre,
			bq.NroBono, bq.FechaEmision, bq.FechaRecepcion,
			bq.Valor, bq.MontoPagadoPrevision,
			CASE WHEN bq.MontoCopago = 0 THEN bq.TotalPagado ELSE bq.MontoCopago END AS MontoCopago,
			bq.SeguroComplementario, bq.Excedentes,
			0    AS TotalPagado,
			NULL AS IdTipoCopago,
			NULL AS TipoCopago
		FROM (
			SELECT
				mc.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,
				mc.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,
				CASE WHEN prestacion.IdTipoPrestacion != 1 AND profesionalExterno.IdProfesional IS NULL THEN profesionalFichaEvolucion.IdProfesional
					 WHEN profesionalExterno.IdProfesional IS NOT NULL THEN profesionalExterno.IdProfesional ELSE NULL
				END AS IdProfesionalOrden_Potencial,
				CASE WHEN (CASE WHEN prestacion.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 NULL
					 ELSE CASE WHEN prestacion.IdTipoPrestacion != 1 AND profesionalExterno.IdProfesional IS NULL THEN profesionalFichaEvolucion.IdProfesional WHEN profesionalExterno.IdProfesional IS NOT NULL THEN profesionalExterno.IdProfesional ELSE NULL END
				END AS IdProfesionalOrden,
				CASE WHEN (CASE WHEN prestacion.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 prestacion.IdTipoPrestacion != 1 AND profesionalExterno.IdProfesional IS NULL THEN profesionalFichaEvolucion.Rut WHEN profesionalExterno.IdProfesional IS NOT NULL THEN profesionalExterno.Rut ELSE '-' END
				END AS RutProfesionalOrden,
				CASE WHEN (CASE WHEN prestacion.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 prestacion.IdTipoPrestacion != 1 AND profesionalExterno.IdProfesional IS NULL THEN 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,
				CASE WHEN cfee.IdCitaFichaEvolucionExamen IS NOT NULL THEN prestacionExamen.CodigoInterno ELSE prestacion.CodigoInterno END AS CodigoPrestacion,
				CASE WHEN cfee.IdCitaFichaEvolucionExamen IS NOT NULL THEN prestacionExamen.Descripcion ELSE prestacion.Descripcion END AS NombrePrestacion,
				tp.IdTipoPrestacion, tp.Descripcion AS TipoPrestacion,
				CASE WHEN cfee.rn = 1 OR cfee.IdCitaFichaEvolucionExamen IS NULL THEN tmp.Descripcion ELSE 'Bono' END AS Modalidad,
				sistemaSalud.Descripcion AS SistemaSalud, isapre.Descripcion AS Isapre,
				mc.NroBono,
				FORMAT(mc.FechaEmision,'dd-MM-yyyy') AS FechaEmision,
				FORMAT(mc.FechaRecepcion,'dd-MM-yyyy') AS FechaRecepcion,
				CASE WHEN cfee.rn = 1 OR cfee.IdCitaFichaEvolucionExamen IS NULL THEN mc.TotalBono ELSE 0 END AS Valor,
				CASE WHEN cfee.rn = 1 OR cfee.IdCitaFichaEvolucionExamen IS NULL THEN mc.MontoPagadoPrevision ELSE 0 END AS MontoPagadoPrevision,
				CASE WHEN cfee.rn = 1 OR cfee.IdCitaFichaEvolucionExamen IS NULL THEN mc.MontoCopago ELSE 0 END AS MontoCopago,
				CASE WHEN cfee.rn = 1 OR cfee.IdCitaFichaEvolucionExamen IS NULL THEN mc.Seguros ELSE 0 END AS SeguroComplementario,
				CASE WHEN cfee.rn = 1 OR cfee.IdCitaFichaEvolucionExamen IS NULL THEN mc.Excendentes ELSE 0 END AS Excedentes,
				CASE WHEN cfee.rn = 1 OR cfee.IdCitaFichaEvolucionExamen IS NULL THEN mc.Monto ELSE 0 END AS TotalPagado,
				tipoCopago.IdTipoCopago, tipoCopago.Descripcion AS TipoCopago
			FROM Caja.MovimientoCaja mc
			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
			JOIN Clinica.Cita cita ON cita.IdCita = mc.IdCita
			JOIN Clinica.Profesional profesional ON profesional.IdProfesional = cita.IdProfesional
			JOIN Clinica.Paciente paciente ON paciente.IdPaciente = cita.IdPaciente
			JOIN Clinica.Prestacion prestacion ON prestacion.IdPrestacion = cita.IdPrestacion
			JOIN Clinica.TipoPrestacion tp ON tp.IdTipoPrestacion = prestacion.IdTipoPrestacion
			JOIN Caja.TipoModalidadPago tmp ON tmp.IdTipoModalidadPago = mc.IdTipoModalidadPago
			LEFT JOIN Clinica.SistemaSalud sistemaSalud ON sistemaSalud.IdSistemaSalud = mc.SistemaSalud
			LEFT JOIN Clinica.Isapre isapre ON isapre.IdIsapre = mc.IdIsapre
			LEFT JOIN (
				SELECT *, ROW_NUMBER() OVER (PARTITION BY IdCita ORDER BY IdCitaFichaEvolucionExamen) AS rn
				FROM Clinica.CitaFichaEvolucionExamen
			) cfee ON cfee.IdCita = cita.IdCita
			LEFT JOIN Clinica.Prestacion prestacionExamen ON prestacionExamen.IdPrestacion = cfee.IdPrestacion
			LEFT JOIN Ficha.FichaEvolucion fe ON fe.IdFichaEvolucion = cfee.IdFichaEvolucion
			LEFT JOIN Clinica.Profesional profesionalOrigen ON profesionalOrigen.IdProfesional = fe.IdProfesional
			LEFT JOIN Clinica.Profesional profesionalFichaEvolucion ON fe.IdProfesional = profesionalFichaEvolucion.IdProfesional
			LEFT JOIN Clinica.Profesional profesionalExterno ON profesionalExterno.IdProfesional = cita.IdProfesionalExterno
			LEFT JOIN Caja.TipoCopago tipoCopago ON tipoCopago.IdTipoCopago = mc.IdTipoCopago
			WHERE mc.OrigenBono IN ('Externo')
          
			  AND CAST(mc.FechaMovimiento AS DATE) BETWEEN CAST(@FechaDesde AS DATE) AND CAST(@FechaHasta AS DATE)
			  AND (@IdProfesional IS NULL OR
				   CASE WHEN profesional.IdTipoOrigenProfesional != 2 THEN profesional.IdProfesional
						ELSE CASE WHEN cita.IdProfesionalExterno IS NOT NULL THEN cita.IdProfesionalExterno ELSE profesionalOrigen.IdProfesional END
				   END = @IdProfesional)
			  AND (@IdTipoPrestacion IS NULL 
				 OR tp.IdTipoPrestacion IN (
					 SELECT CAST(value AS INT) 
					 FROM STRING_SPLIT(@IdTipoPrestacion, ',')
				 ))
			  AND (@IdProfesionalOrden IS NULL OR
				   CASE WHEN (CASE WHEN prestacion.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 NULL
						ELSE CASE WHEN prestacion.IdTipoPrestacion != 1 AND profesionalExterno.IdProfesional IS NULL THEN profesionalFichaEvolucion.IdProfesional WHEN profesionalExterno.IdProfesional IS NOT NULL THEN profesionalExterno.IdProfesional ELSE NULL END
				   END = @IdProfesionalOrden)
			  AND (@IdCaja IS NULL OR mc.IdCaja = @IdCaja)
			  AND mc.IdPresupuesto IS NULL   and mc.Monto = 0
			  AND mc.IdTipoEstadoMovimientoCaja in(1, 3) --Pagado y control medico
		) bq
		WHERE bq.NroBono IS NOT NULL AND bq.NroBono != '' AND bq.IdTipoCopago IS NOT NULL AND bq.TotalPagado > 0

		UNION ALL

		-- Bloque 3: split - registro pago
		SELECT
			bq.IdMovimientoCaja, bq.Identificador, bq.IdCaja, bq.Caja,
			bq.IdTipoEstadoCaja, bq.TipoEstadoCaja, bq.RutCajero, bq.NombreCajero,
			bq.FechaMovimiento, bq.HoraMovimiento, bq.IdProfesional, bq.OrigenBono,
			bq.RutProfesional, bq.NombreProfesional, bq.IdProfesionalOrden_Potencial,
			bq.IdProfesionalOrden, bq.RutProfesionalOrden, bq.NombreProfesionalOrden,
			bq.RutPaciente, bq.NombrePaciente, bq.CodigoPrestacion, bq.NombrePrestacion,
			bq.IdTipoPrestacion, bq.TipoPrestacion,
			(SELECT Descripcion FROM Caja.TipoModalidadPago WHERE IdTipoModalidadPago = 4) AS Modalidad,
			bq.SistemaSalud, bq.Isapre,
			''             AS NroBono,
			''             AS FechaEmision,
			''             AS FechaRecepcion,
			bq.TotalPagado AS Valor,
			0              AS MontoPagadoPrevision,
			0              AS MontoCopago,
			0              AS SeguroComplementario,
			0              AS Excedentes,
			bq.TotalPagado AS TotalPagado,
			bq.IdTipoCopago,
			bq.TipoCopago
		FROM (
			SELECT
				mc.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,
				mc.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,
				CASE WHEN prestacion.IdTipoPrestacion != 1 AND profesionalExterno.IdProfesional IS NULL THEN profesionalFichaEvolucion.IdProfesional
					 WHEN profesionalExterno.IdProfesional IS NOT NULL THEN profesionalExterno.IdProfesional ELSE NULL
				END AS IdProfesionalOrden_Potencial,
				CASE WHEN (CASE WHEN prestacion.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 NULL
					 ELSE CASE WHEN prestacion.IdTipoPrestacion != 1 AND profesionalExterno.IdProfesional IS NULL THEN profesionalFichaEvolucion.IdProfesional WHEN profesionalExterno.IdProfesional IS NOT NULL THEN profesionalExterno.IdProfesional ELSE NULL END
				END AS IdProfesionalOrden,
				CASE WHEN (CASE WHEN prestacion.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 prestacion.IdTipoPrestacion != 1 AND profesionalExterno.IdProfesional IS NULL THEN profesionalFichaEvolucion.Rut WHEN profesionalExterno.IdProfesional IS NOT NULL THEN profesionalExterno.Rut ELSE '-' END
				END AS RutProfesionalOrden,
				CASE WHEN (CASE WHEN prestacion.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 prestacion.IdTipoPrestacion != 1 AND profesionalExterno.IdProfesional IS NULL THEN 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,
				CASE WHEN cfee.IdCitaFichaEvolucionExamen IS NOT NULL THEN prestacionExamen.CodigoInterno ELSE prestacion.CodigoInterno END AS CodigoPrestacion,
				CASE WHEN cfee.IdCitaFichaEvolucionExamen IS NOT NULL THEN prestacionExamen.Descripcion ELSE prestacion.Descripcion END AS NombrePrestacion,
				tp.IdTipoPrestacion, tp.Descripcion AS TipoPrestacion,
				CASE WHEN cfee.rn = 1 OR cfee.IdCitaFichaEvolucionExamen IS NULL THEN tmp.Descripcion ELSE 'Bono' END AS Modalidad,
				sistemaSalud.Descripcion AS SistemaSalud, isapre.Descripcion AS Isapre,
				mc.NroBono,
				FORMAT(mc.FechaEmision,'dd-MM-yyyy') AS FechaEmision,
				FORMAT(mc.FechaRecepcion,'dd-MM-yyyy') AS FechaRecepcion,
				CASE WHEN cfee.rn = 1 OR cfee.IdCitaFichaEvolucionExamen IS NULL THEN mc.TotalBono ELSE 0 END AS Valor,
				CASE WHEN cfee.rn = 1 OR cfee.IdCitaFichaEvolucionExamen IS NULL THEN mc.MontoPagadoPrevision ELSE 0 END AS MontoPagadoPrevision,
				CASE WHEN cfee.rn = 1 OR cfee.IdCitaFichaEvolucionExamen IS NULL THEN mc.MontoCopago ELSE 0 END AS MontoCopago,
				CASE WHEN cfee.rn = 1 OR cfee.IdCitaFichaEvolucionExamen IS NULL THEN mc.Seguros ELSE 0 END AS SeguroComplementario,
				CASE WHEN cfee.rn = 1 OR cfee.IdCitaFichaEvolucionExamen IS NULL THEN mc.Excendentes ELSE 0 END AS Excedentes,
				CASE WHEN cfee.rn = 1 OR cfee.IdCitaFichaEvolucionExamen IS NULL THEN mc.Monto ELSE 0 END AS TotalPagado,
				tipoCopago.IdTipoCopago, tipoCopago.Descripcion AS TipoCopago
			FROM Caja.MovimientoCaja mc
			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
			JOIN Clinica.Cita cita ON cita.IdCita = mc.IdCita
			JOIN Clinica.Profesional profesional ON profesional.IdProfesional = cita.IdProfesional
			JOIN Clinica.Paciente paciente ON paciente.IdPaciente = cita.IdPaciente
			JOIN Clinica.Prestacion prestacion ON prestacion.IdPrestacion = cita.IdPrestacion
			JOIN Clinica.TipoPrestacion tp ON tp.IdTipoPrestacion = prestacion.IdTipoPrestacion
			JOIN Caja.TipoModalidadPago tmp ON tmp.IdTipoModalidadPago = mc.IdTipoModalidadPago
			LEFT JOIN Clinica.SistemaSalud sistemaSalud ON sistemaSalud.IdSistemaSalud = mc.SistemaSalud
			LEFT JOIN Clinica.Isapre isapre ON isapre.IdIsapre = mc.IdIsapre
			LEFT JOIN (
				SELECT *, ROW_NUMBER() OVER (PARTITION BY IdCita ORDER BY IdCitaFichaEvolucionExamen) AS rn
				FROM Clinica.CitaFichaEvolucionExamen
			) cfee ON cfee.IdCita = cita.IdCita
			LEFT JOIN Clinica.Prestacion prestacionExamen ON prestacionExamen.IdPrestacion = cfee.IdPrestacion
			LEFT JOIN Ficha.FichaEvolucion fe ON fe.IdFichaEvolucion = cfee.IdFichaEvolucion
			LEFT JOIN Clinica.Profesional profesionalOrigen ON profesionalOrigen.IdProfesional = fe.IdProfesional
			LEFT JOIN Clinica.Profesional profesionalFichaEvolucion ON fe.IdProfesional = profesionalFichaEvolucion.IdProfesional
			LEFT JOIN Clinica.Profesional profesionalExterno ON profesionalExterno.IdProfesional = cita.IdProfesionalExterno
			LEFT JOIN Caja.TipoCopago tipoCopago ON tipoCopago.IdTipoCopago = mc.IdTipoCopago
			WHERE mc.OrigenBono IN ('Externo')
         
			  AND CAST(mc.FechaMovimiento AS DATE) BETWEEN CAST(@FechaDesde AS DATE) AND CAST(@FechaHasta AS DATE)
			  AND (@IdProfesional IS NULL OR
				   CASE WHEN profesional.IdTipoOrigenProfesional != 2 THEN profesional.IdProfesional
						ELSE CASE WHEN cita.IdProfesionalExterno IS NOT NULL THEN cita.IdProfesionalExterno ELSE profesionalOrigen.IdProfesional END
				   END = @IdProfesional)
			  AND (@IdTipoPrestacion IS NULL 
				 OR tp.IdTipoPrestacion IN (
					 SELECT CAST(value AS INT) 
					 FROM STRING_SPLIT(@IdTipoPrestacion, ',')
				 ))
			  AND (@IdProfesionalOrden IS NULL OR
				   CASE WHEN (CASE WHEN prestacion.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 NULL
						ELSE CASE WHEN prestacion.IdTipoPrestacion != 1 AND profesionalExterno.IdProfesional IS NULL THEN profesionalFichaEvolucion.IdProfesional WHEN profesionalExterno.IdProfesional IS NOT NULL THEN profesionalExterno.IdProfesional ELSE NULL END
				   END = @IdProfesionalOrden)
			  AND (@IdCaja IS NULL OR mc.IdCaja = @IdCaja)
			  AND mc.IdPresupuesto IS NULL   and mc.Monto = 0
			  AND mc.IdTipoEstadoMovimientoCaja in(1, 3) --Pagado y control medico
		) bq
		WHERE bq.NroBono IS NOT NULL AND bq.NroBono != '' AND bq.IdTipoCopago IS NOT NULL AND bq.TotalPagado > 0;
	END
