-- =============================================
-- Author:		<Yonatan Gaete>
-- Create date: <28/11/2024>
-- Description:	<Seleccionar Datos Grilla Bienes>
-- Alter date:  <27/01/2025>
-- Description:	<Optimizar Consulta>
-- Alter date:  <31/03/2025>
-- Description:	<Se agrega dar baja masivo solo sin dar de baja>
-- Alter date:  <20/05/2025>
-- Description:	<Se agrega filtro unineg y Login>
-- =============================================
ALTER PROCEDURE [dbo].[sp_AfiBienesGrilla_Sel]
(
	@id INT,
	@codigoBarra VARCHAR(50),
	@codigoInterno VARCHAR(50),
	@grupo INT,
	@subGrupo INT,
	@responsable INT,
	@ubicaciones INT,
	@estado INT,
	@uniNeg INT,
	@loging VARCHAR(50),
	@fechaIni DATE,
	@fechaFin DATE
)
AS
BEGIN
    SET NOCOUNT ON;


	IF @estado = 999
		BEGIN
			-- Crea un CTE para mejorar la claridad y evitar consultas repetitivas
			WITH DepartamentoDesc AS (
				SELECT idDepartamento, descripcion
				FROM remDepartamentos
			)
			SELECT
				B.[id],
				B.[nombre],
				B.[descripcion],
				CASE 
				WHEN B.deBaja = 'True' THEN 'SI'
				ELSE 'NO'
				END AS deBaja,
				B.[codigoInterno],
				B.[uniNeg],
				ISNULL(UN.descripcion, 'SIN U. NEGOCIOS') AS uninegDesc,
				B.grupo,
				G.nombre AS grupoDesc,
				B.subgrupo,
				SG.nombre AS subgrupoDesc,
				B.orderCompra,
				B.fechaCompra,
				B.costoCompra,
				MovimientosAntiguos.fechaMovimiento,
				MovimientosAntiguos.cantidadMovida,
				B.ubicacion,
				U.nombre AS ubicacionDesc,
				U.sucursal,
				S.nomsuc,
				B.responsable,
				R.nombre AS responsableDesc,
				B.estado,
				E.nombre AS estadoDesc,
				B.departamento,
				B.rutCyV,
				B.tipoDocCyV,
				B.numDocCyV,
				ECV.monto_total,
				ECV.fecha_ing,
				ISNULL(D.descripcion, 'SIN DEPARTAMENTO') AS departamentoDesc,
				CASE WHEN B.permiteMovimiento = 1 THEN 'SI' ELSE 'NO' END AS permiteMovimiento,
				CASE WHEN B.manejaMantencion = 1 THEN 'SI' ELSE 'NO' END AS manejaMantencion,
				CASE WHEN B.enMantenimiento = 1 THEN 'SI' ELSE 'NO' END AS enMantenimiento
			FROM afiBienes B
			LEFT JOIN conUnidadNegocio UN ON UN.idUniNeg = B.uniNeg
			LEFT JOIN afiGrupo G ON G.id = B.grupo
			LEFT JOIN afiSubGrupo SG ON SG.id = B.subgrupo AND SG.idGrupo = B.grupo
			LEFT JOIN afiUbicaciones U ON U.id = B.ubicacion
			LEFT JOIN priSucursales S ON S.codsuc = U.sucursal
			LEFT JOIN afiResponsables R ON R.id = B.responsable
			LEFT JOIN afiEstados E ON E.id = B.estado
			OUTER APPLY (
				SELECT TOP 1 M.fechaMovimiento, M.cantidadMovida
				FROM afiMovimientos M
				WHERE M.idActivo = B.id AND M.ubicacionDestino = B.ubicacion
				ORDER BY M.fechaMovimiento ASC
			) AS MovimientosAntiguos
			LEFT JOIN DepartamentoDesc D ON D.idDepartamento = B.departamento
			LEFT JOIN cyvEncabezado ECV ON ECV.tipo_documento = B.tipoDocCyV 
										 AND ECV.num_documento = B.numDocCyV 
										 AND ECV.rut = B.rutCyV
			WHERE (@id = 0 OR B.id = @id)
				AND (@codigoBarra = '0' OR B.codigoBarra = @codigoBarra)
				AND (@codigoInterno = '0' OR B.codigoInterno = @codigoInterno)
				AND (@grupo = 0 OR B.grupo = @grupo)
				AND (@subGrupo = 0 OR (B.grupo = @grupo AND B.subgrupo = @subGrupo))
				AND (@responsable = 0 OR B.responsable = @responsable)
				AND (@ubicaciones = 0 OR B.ubicacion = @ubicaciones)
				AND (B.deBaja = 1)
				AND (B.uniNeg = @uniNeg OR @uniNeg = 0)
				AND (B.loging = @loging OR @loging = 'All')
				AND (B.fechaIngreso BETWEEN @fechaFin AND @fechaFin);
		END

	ELSE
		BEGIN
			-- Crea un CTE para mejorar la claridad y evitar consultas repetitivas
			-- (El CTE es claro, pero no es una optimización de rendimiento en sí misma aquí)
			WITH DepartamentoDesc AS (
				SELECT idDepartamento, descripcion
				FROM remDepartamentos
			)
			SELECT
				B.[id],
				B.[nombre],
				B.[descripcion],
				CASE WHEN B.deBaja = 'True' THEN 'SI' ELSE 'NO' END AS deBaja,
				B.[codigoInterno],
				B.[uniNeg],
				ISNULL(UN.descripcion, 'SIN U. NEGOCIOS') AS uninegDesc,
				B.grupo,
				G.nombre AS grupoDesc,
				B.subgrupo,
				SG.nombre AS subgrupoDesc,
				B.orderCompra,
				B.fechaCompra,
				B.costoCompra,
				ST.fechaUltimaActualizacion AS fechaMovimiento,
				ST.cantidadDisponible AS cantidadMovida,
				ST.ubicacion,
				U.nombre AS ubicacionDesc,
				U.sucursal,
				S.nomsuc,
				B.responsable,
				R.nombre AS responsableDesc,
				B.estado,
				E.nombre AS estadoDesc,
				B.departamento,
				B.rutCyV,
				B.tipoDocCyV,
				B.numDocCyV,
				ECV.monto_total,
				ECV.fecha_ing,
				ISNULL(D.descripcion, 'SIN DEPARTAMENTO') AS departamentoDesc,
				CASE WHEN B.permiteMovimiento = 1 THEN 'SI' ELSE 'NO' END AS permiteMovimiento,
				CASE WHEN B.manejaMantencion = 1 THEN 'SI' ELSE 'NO' END AS manejaMantencion,
				CASE WHEN B.enMantenimiento = 1 THEN 'SI' ELSE 'NO' END AS enMantenimiento
			FROM afiStock ST WITH (NOLOCK) -- Considera NOLOCK si las lecturas sucias son aceptables
			LEFT JOIN afiBienes B WITH (NOLOCK) ON ST.idActivo = B.id
			LEFT JOIN conUnidadNegocio UN WITH (NOLOCK) ON UN.idUniNeg = B.uniNeg
			LEFT JOIN afiGrupo G WITH (NOLOCK) ON G.id = B.grupo
			LEFT JOIN afiSubGrupo SG WITH (NOLOCK) ON SG.id = B.subgrupo AND SG.idGrupo = B.grupo
			LEFT JOIN afiUbicaciones U WITH (NOLOCK) ON U.id = ST.ubicacion
			LEFT JOIN priSucursales S WITH (NOLOCK) ON S.codsuc = U.sucursal
			LEFT JOIN afiResponsables R WITH (NOLOCK) ON R.id = B.responsable
			LEFT JOIN afiEstados E WITH (NOLOCK) ON E.id = B.estado
			LEFT JOIN DepartamentoDesc D ON D.idDepartamento = B.departamento -- CTE, NOLOCK no aplica directamente
			LEFT JOIN cyvEncabezado ECV WITH (NOLOCK) ON ECV.tipo_documento = B.tipoDocCyV
													 AND ECV.num_documento = B.numDocCyV
													 AND ECV.rut = B.rutCyV
			WHERE (ST.cantidadDisponible > 0)
				AND (B.deBaja = 'False')
				AND (@id = 0 OR B.id = @id)
				AND (@codigoBarra = '0' OR B.codigoBarra = @codigoBarra)
				AND (@codigoInterno = '0' OR B.codigoInterno = @codigoInterno)
				AND (@grupo = 0 OR B.grupo = @grupo)
				AND (@subGrupo = 0 OR (B.grupo = @grupo AND B.subgrupo = @subGrupo))
				AND (@responsable = 0 OR B.responsable = @responsable)
				AND (B.uniNeg = @uniNeg OR @uniNeg = 0)
				AND (B.loging = @loging OR @loging = '(All)')
				AND (B.fechaIngreso BETWEEN @fechaIni AND @fechaFin)
				AND (B.ubicacion = @ubicaciones OR @ubicaciones = 0)
				AND (B.estado = @estado OR @estado = -1)
			OPTION (RECOMPILE);
					END
    
END