create procedure sistema.sp_validarPermiso
@numUsuario int,
@numPageId int,
@dbResponse varchar(300) output,
@dbIsRoot int output,
@dbTipoPermiso varchar(25) output,
@dbMantenimiento int output,
@dbIsAdministrativo int output
as
begin
	set nocount on;
	declare @dbModulo int,@dbCnt int,@dbNivel int,@dbSuperior int,@dbLoop int,@dbPaginaValida int;
	begin tran validarPermiso
	begin try
		IF OBJECT_ID(N'tempdb..#roles_usuario') IS NOT NULL
			BEGIN
				DROP TABLE #roles_usuario;
			END

		IF OBJECT_ID(N'tempdb..#modulos_usuario') IS NOT NULL
			BEGIN
				DROP TABLE #modulos_usuario;
			END

		IF OBJECT_ID(N'tempdb..#apartados_usuario') IS NOT NULL
			BEGIN
				DROP TABLE #apartados_usuario;
			END

		IF OBJECT_ID(N'tempdb..#apartados_modulo') IS NOT NULL
			BEGIN
				DROP TABLE #apartados_modulo;
			END

		create table #roles_usuario(
			rol int,
			label_rol varchar(300),
			tipo_rol int,
		);

		create table #apartados_modulo(
			id int,
		);

		set @dbIsAdministrativo = 0;
		set @dbPaginaValida = 0;

		insert into #roles_usuario select idRol,rol,idTipo from sistema.view_rolesUsuario where usuario = @numUsuario;

		if (select COUNT(*) from #roles_usuario where label_rol = 'ROOT') > 0
			begin
				set @dbIsRoot = 1;
			end
		else
			begin
				set @dbIsRoot = 0;
			end

		select top(1) @dbModulo = idModulo,@dbSuperior = idSuperior,@dbNivel = nivel from sistema.det_apartados where id = @numPageId and estado = 1;

		insert into #apartados_modulo select id from sistema.det_apartados where idModulo = @dbModulo and estado != 0;

		if(select COUNT(*) from #roles_usuario where tipo_rol = 1 and rol in(select idAsignacion from sistema.datos_permisos where estado != 0 and tipoAsignacion = 'rol' and ((tipoContenedor = 'modulo' and idContenedor = @dbModulo) OR (tipoContenedor = 'apartado' and idContenedor in (select id from #apartados_modulo))))) > 0
			begin
				set @dbIsAdministrativo = 1;
			end

		select @dbCnt = COUNT(*) from sistema.datos_permisos where estado = 1 and tipoContenedor = 'modulo' and idContenedor = @dbModulo and (
			(tipoAsignacion = 'rol' and idAsignacion in(select rol from #roles_usuario))
			or
			(tipoAsignacion = 'usuario' and idAsignacion = @numUsuario)
		);

		select @dbMantenimiento = mantenimiento,@dbPaginaValida = estado from sistema.datos_modulos where id = @dbModulo;

		if @dbCnt > 0 and @dbMantenimiento = 0 AND @dbPaginaValida = 1
			begin
				select top(1) @dbTipoPermiso = tipoPermiso from sistema.datos_permisos where estado = 1 and tipoContenedor = 'modulo' and idContenedor = @dbModulo and (
					(tipoAsignacion = 'rol' and idAsignacion in(select rol from #roles_usuario))
					or
					(tipoAsignacion = 'usuario' and idAsignacion = @numUsuario)
				) order by tipoPermiso asc;
			end

		if @dbMantenimiento = 0 AND @dbPaginaValida = 1
			begin
				select @dbMantenimiento = mantenimiento,@dbSuperior = idSuperior,@dbPaginaValida = estado from sistema.det_apartados where id = @numPageId;
				if @dbSuperior is not null AND @dbMantenimiento = 0 and @dbPaginaValida = 1
					begin
						select @dbMantenimiento = mantenimiento,@dbPaginaValida = estado from sistema.det_apartados where id = @dbSuperior;
					end
			end

		set @dbSuperior = null;

		if (@dbTipoPermiso is null or @dbTipoPermiso = 'LECTURA') and @dbMantenimiento = 0 AND @dbPaginaValida = 1
			begin
				set @dbLoop = 0;
				while(@dbLoop = 0 and @dbMantenimiento = 0)
					begin
						if @dbSuperior is null
							begin
								set @dbLoop = 1;
							end

						select @dbMantenimiento = mantenimiento,@dbPaginaValida = estado FROM sistema.det_apartados where id = @numPageId;

						if @dbMantenimiento = 0 AND @dbPaginaValida = 1
							begin
								select @dbCnt = COUNT(*) from sistema.datos_permisos where estado = 1 and tipoContenedor = 'apartado' and idContenedor = @numPageId and (
									(tipoAsignacion = 'rol' and idAsignacion in(select rol from #roles_usuario))
									or
									(tipoAsignacion = 'usuario' and idAsignacion = @numUsuario)
								);

								if @dbCnt > 0
									begin
										select top(1) @dbTipoPermiso = tipoPermiso from sistema.datos_permisos where estado = 1 and tipoContenedor = 'apartado' and idContenedor = @numPageId and (
											(tipoAsignacion = 'rol' and idAsignacion in(select rol from #roles_usuario))
											or
											(tipoAsignacion = 'usuario' and idAsignacion = @numUsuario)
										) order by tipoPermiso asc;

										if @dbTipoPermiso = 'LECTURA'
											begin
												select @numPageId = id,@dbSuperior = idSuperior from sistema.det_apartados where id = @dbSuperior;
											end
										else
											begin
												set @dbLoop = 1;
											end
									end
								else
									begin
										select @numPageId = id,@dbSuperior = idSuperior from sistema.det_apartados where id = @dbSuperior;
									end
							end
					end
			end

		if @dbTipoPermiso is null or @dbMantenimiento != 0 OR @dbPaginaValida = 0
			begin
				if @dbMantenimiento != 0
					begin
						set @dbResponse = 'mantenimiento';
					end
				else
					begin
						set @dbResponse = 'noAsignado';
					end
			end
		else
			begin
				set @dbResponse = 'success';
			end

		commit tran validarPermiso
	end try
	begin catch
		SET @dbResponse = 'Ocurrió el siguiente error: '+ERROR_MESSAGE()+', en la línea '+ CONVERT ( NVARCHAR ( 255 ), ERROR_LINE( ) );
		rollback tran validarPermiso
	end catch
end