Files
Antifraude.Net/Antifraude.Net/SwaggerAntifraude/Controllers/ResultadoIdentificacionController.cs
2026-01-13 12:51:39 +01:00

261 lines
14 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using bdAntifraude.db;
using bdAntifraude.dbcontext;
using SwaggerAntifraude.Models;
using DevExpress.CodeParser;
namespace SwaggerAntifraude.Controllers
{
[Authorize]
[Route("api/[controller]")]
[ApiController]
public class ResultadoIdentificacionController : ControllerBase
{
/// <summary>
/// Carga el perfil de identificación y las incidencias asociadas para el usuario especificado.
/// Se asignan roles y se consultan incidencias según el origen (WEBINTRANET, GESTDELE o RPT).
/// Además, se incluyen en el listado tanto el usuario consultante como sus subordinados,
/// forzando que el usuario consultante se agregue a la lista (incluso si ya apareciera en el listado de subordinados).
/// </summary>
/// <param name="nif">NIF del usuario a identificar.</param>
/// <param name="origen">Origen de la consulta (por ejemplo: "WEBINTRANET", "GESTDELE" o "RPT").</param>
/// <returns>Objeto ResultadoIdentificacion con la lista de perfiles e incidencias.</returns>
[Authorize(Policy = "LecturaPolicy")]
[HttpGet("nif/{nif}/origen/{origen}")]
public IActionResult CargaPerfilIdentificacion(string nif, string origen)
{
var resultadoIdentificacion = new ResultadoIdentificacion
{
Personas = new List<Personal>()
};
try
{
using (var context = tsGestionAntifraude.NuevoContexto(SoloLectura: true, UseLazyLoadingProxies: false))
{
// Se busca la persona por NIF
var persona = context.PERSONAS
.Include(p => p.IDDEPARTAMENTONavigation) // Para obtener la descripción del departamento
.AsNoTracking()
.FirstOrDefault(p => p.NIF.Trim().ToUpper() == nif.Trim().ToUpper());
if (persona == null)
{
resultadoIdentificacion.resultado = 1;
resultadoIdentificacion.errores = $"No se encontró persona con NIF: {nif}";
return Ok(resultadoIdentificacion);
}
// Creamos el objeto Personal para el usuario consultante
var grup = context.USUARIOS.Include(x => x.IDGRUPONavigation).FirstOrDefault(x => x.USUARIO == persona.NIF).IDGRUPONavigation.DESCRIPCION;
var usuarioActual = new Personal
{
Nombre = persona.APELLIDOS + ", " + persona.NOMBRE,
Departamento = persona.IDDEPARTAMENTONavigation?.DESCRIPCION,
Dni = persona.NIF,
idPersona = persona.IDPERSONA,
Roll = string.Empty,
Grupo = grup.ToUpper() == "ACCESO WEB RET" ? "RET" : ""
};
// Creamos la lista de personas y agregamos inmediatamente el usuario consultante
var personas = new List<Personal>();
personas.Add(usuarioActual);
resultadoIdentificacion.Personas = personas;
// Lógica de asignación de roles según el origen
if (origen == "WEBINTRANET" || origen == "GESTDELE")
{
if (persona.DELEGADO)
usuarioActual.Roll = "DELEGADO";
if (persona.SUPERVISORDEPARTAMENTO)
usuarioActual.Roll = "SUPERVISOR";
if (persona.SUPERVISORDETODO)
usuarioActual.Roll = "SUPERVISORDETODO";
if (persona.ADMINISTRADORCONTROLHORARIO)
usuarioActual.Roll = "ADMINISTRADORCONTROLHORARIO";
// Consultar incidencias en la vista V_ASISTENCIAS_EXTENDIDA
List<V_ASISTENCIAS_EXTENDIDA> asisYestados;
if (usuarioActual.Roll == "ADMINISTRADORCONTROLHORARIO")
{
asisYestados = context.V_ASISTENCIAS_EXTENDIDA
.Where(x => x.ULTIMOESTADO.Contains("VISTO BUENO") || x.ULTIMOESTADO == "SOLICITADA")
.ToList();
}
else if (usuarioActual.Roll == "SUPERVISORDETODO")
{
asisYestados = context.V_ASISTENCIAS_EXTENDIDA
.Where(x => x.ULTIMOESTADO.Contains("PROPUESTA") ||
x.ULTIMOESTADO == "SOLICITADA" ||
x.ULTIMOESTADO.Contains("VISTO BUENO"))
.ToList();
}
else
{
asisYestados = context.V_ASISTENCIAS_EXTENDIDA
.Where(x => x.ULTIMOESTADO.Contains("PROPUESTA"))
.ToList();
}
var asisBorrador = context.V_ASISTENCIAS_EXTENDIDA
.Where(x => x.ULTIMOESTADO == "BORRADOR")
.ToList();
if (!string.IsNullOrEmpty(usuarioActual.Roll))
{
if (usuarioActual.Roll != "ADMINISTRADORCONTROLHORARIO")
{
// Para SUPERVISOR o DELEGADO se filtra por departamento
if (usuarioActual.Roll == "SUPERVISOR" || usuarioActual.Roll == "DELEGADO")
{
asisYestados = asisYestados
.Where(x => x.IDDEPARTAMENTO == persona.IDDEPARTAMENTO)
.ToList();
}
usuarioActual.NumeroInciPorAceptar = asisYestados.Count;
usuarioActual.NumeroInciBorrador = asisBorrador
.Where(x => x.IDPERSONA == usuarioActual.idPersona)
.Count();
if (usuarioActual.NumeroInciPorAceptar > 0)
{
usuarioActual.FeIniInciPorAceptar = (DateTime)asisYestados
.OrderBy(x => x.FECHAOCURRENCIA)
.First().FECHAOCURRENCIA;
usuarioActual.FeFinInciPorAceptar = (DateTime)asisYestados
.OrderBy(x => x.FECHAOCURRENCIA)
.Last().FECHAOCURRENCIA;
}
if (usuarioActual.NumeroInciBorrador > 0)
{
usuarioActual.FeIniInciBorrador = (DateTime)asisBorrador
.Where(x => x.IDPERSONA == usuarioActual.idPersona)
.OrderBy(x => x.FECHAOCURRENCIA)
.First().FECHAOCURRENCIA;
usuarioActual.FeFinInciBorrador = (DateTime)asisBorrador
.Where(x => x.IDPERSONA == usuarioActual.idPersona)
.OrderBy(x => x.FECHAOCURRENCIA)
.Last().FECHAOCURRENCIA;
}
}
else // Caso ADMINISTRADORCONTROLHORARIO
{
asisYestados = context.V_ASISTENCIAS_EXTENDIDA
.Where(x => x.ULTIMOESTADO == "VISTO BUENO")
.ToList();
usuarioActual.NumeroInciPorAceptar = asisYestados.Count;
usuarioActual.NumeroInciBorrador = asisBorrador.Count;
if (usuarioActual.NumeroInciPorAceptar > 0)
{
usuarioActual.FeIniInciPorAceptar = (DateTime)asisYestados
.OrderBy(x => x.FECHAOCURRENCIA)
.First().FECHAOCURRENCIA;
usuarioActual.FeFinInciPorAceptar = (DateTime)asisYestados
.OrderBy(x => x.FECHAOCURRENCIA)
.Last().FECHAOCURRENCIA;
}
if (usuarioActual.NumeroInciBorrador > 0)
{
usuarioActual.FeIniInciBorrador = (DateTime)asisBorrador
.OrderBy(x => x.FECHAOCURRENCIA)
.First().FECHAOCURRENCIA;
usuarioActual.FeFinInciBorrador = (DateTime)asisBorrador
.OrderBy(x => x.FECHAOCURRENCIA)
.Last().FECHAOCURRENCIA;
}
}
}
// Cargar perfiles secundarios (subordinados)
if (!string.IsNullOrEmpty(usuarioActual.Roll))
{
var lpdep = context.PERSONAS
.Include(p => p.IDDEPARTAMENTONavigation)
.Where(x => x.IDDEPARTAMENTO != null && x.FECHABAJA == null)
.ToList();
if (usuarioActual.Roll == "SUPERVISOR" || usuarioActual.Roll == "DELEGADO")
{
lpdep = lpdep.Where(x => x.IDDEPARTAMENTO == persona.IDDEPARTAMENTO).ToList();
}
foreach (var perDep in lpdep.OrderBy(x => x.IDDEPARTAMENTO))
{
if (perDep.NIF.Trim().ToUpper() != nif.Trim().ToUpper() &&
(
(!perDep.SUPERVISORDEPARTAMENTO && (usuarioActual.Roll == "SUPERVISOR" || usuarioActual.Roll == "DELEGADO"))
|| (usuarioActual.Roll == "SUPERVISORDETODO")
)
)
{
var subordinate = new Personal
{
Nombre = perDep.APELLIDOS + ", " + perDep.NOMBRE,
Dni = perDep.NIF,
idPersona = perDep.IDPERSONA,
Departamento = perDep.IDDEPARTAMENTONavigation?.DESCRIPCION,
Roll = string.Empty
};
if (perDep.DELEGADO)
subordinate.Roll = "DELEGADO";
if (string.IsNullOrEmpty(subordinate.Roll) && perDep.SUPERVISORDEPARTAMENTO)
subordinate.Roll = "SUPERVISOR";
subordinate.NumeroInciPorAceptar = asisYestados.Where(x => x.IDPERSONA == perDep.IDPERSONA).Count();
subordinate.NumeroInciBorrador = asisBorrador.Where(x => x.IDPERSONA == perDep.IDPERSONA).Count();
personas.Add(subordinate);
}
}
// Calcular fechas globales a partir de todos los perfiles (incluyendo el usuario consultante)
DateTime fechaNula = new DateTime(1, 1, 1);
if (personas.Any(x => x.FeIniInciPorAceptar > fechaNula))
{
resultadoIdentificacion.FeIniInciPorAceptar = personas
.Where(x => x.FeIniInciPorAceptar > fechaNula)
.OrderBy(x => x.FeIniInciPorAceptar)
.First().FeIniInciPorAceptar;
}
if (personas.Any(x => x.FeFinInciPorAceptar > fechaNula))
{
resultadoIdentificacion.FeFinInciPorAceptar = personas
.Where(x => x.FeFinInciPorAceptar > fechaNula)
.OrderBy(x => x.FeFinInciPorAceptar)
.Last().FeFinInciPorAceptar;
}
}
}
else // Caso "RPT"
{
if (origen == "RPT" && !persona.ADMINISTRARPTYREGISTRO)
{
resultadoIdentificacion.resultado = 1;
resultadoIdentificacion.errores = "Identificación correcta pero no es Administrador de Rpt y de Registro de Personal";
return Ok(resultadoIdentificacion);
}
}
resultadoIdentificacion.resultado = 0;
resultadoIdentificacion.errores = string.Empty;
return Ok(resultadoIdentificacion);
}
}
catch (Exception ex)
{
resultadoIdentificacion.resultado = 3;
resultadoIdentificacion.errores = ex.ToString();
return Ok(resultadoIdentificacion);
}
}
}
}