Files
Antifraude.Net/Antifraude.Net/GestionaDenunciasAN/Components/Pages/Rechazados.razor
2026-05-06 13:48:23 +02:00

365 lines
15 KiB
Plaintext

@page "/Rechazados"
@rendermode InteractiveServer
@attribute [Authorize]
@using GestionaDenunciasAN.Models
@using System.Globalization
@attribute [StreamRendering]
@inject GestionaDenunciasAN.Models.UserState userState
@inject NavigationManager Navigation
@inject IDenunciaStore DenunciaStore
<PageTitle>Denuncias Rechazadas</PageTitle>
<style>
/* Contenedor para la lista de denuncias */
.rechazados-list {
margin-top: 20px;
}
/* Estilo general para cada card */
.collapse-card {
margin-bottom: 1rem;
border: 1px solid #ccc;
border-radius: 6px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
overflow: hidden;
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.collapse-card:hover {
transform: scale(1.02);
box-shadow: 0 4px 8px rgba(0,0,0,0.2);
}
/* Aplicar fondo rojo a toda la card */
.Rechazada {
background-color: #f8d7da;
color: #721c24;
}
/* Forzar fondo transparente en cabecera y cuerpo para que hereden el color de la card */
.Rechazada .card-header,
.Rechazada .card-body {
background-color: transparent;
}
/* Estilos para la cabecera de la card */
.card-header {
padding: 0.75rem 1.25rem;
cursor: pointer;
}
.card-header h5 {
margin: 0;
font-size: 1.1rem;
}
.header-info {
font-size: 0.9rem;
margin-top: 0.5rem;
}
.header-info span {
margin-right: 15px;
}
/* Estilos para el cuerpo de la card */
.card-body {
padding: 1.25rem;
}
/* Estilos para los títulos de sección dentro de la card */
.section-heading {
text-align: center;
font-weight: bold;
text-decoration: underline;
font-size: 1.1em;
margin-top: 1rem;
margin-bottom: 0.5rem;
}
</style>
<h1>Denuncias Rechazadas</h1>
<!-- Campo de búsqueda -->
<input type="text"
class="form-control"
placeholder="Buscar denuncias..."
@bind="busqueda"
@bind:event="oninput"
style="margin-bottom:20px;" />
@if (!hasLoaded)
{
<div class="alert alert-info">Cargando datos...</div>
}
else if (denunciasRechazadas == null || !denunciasRechazadas.Any())
{
<p>No hay denuncias rechazadas.</p>
}
else
{
<div class="rechazados-list">
@foreach (var denuncia in denunciasRechazadas.Where(d =>
string.IsNullOrWhiteSpace(busqueda) ||
d.Id_Denuncia.ToString().Contains(busqueda) ||
(!string.IsNullOrEmpty(d.NombreDenuncia) && d.NombreDenuncia.Contains(busqueda, StringComparison.OrdinalIgnoreCase)) ||
(!string.IsNullOrEmpty(d.Estado) && d.Estado.Contains(busqueda, StringComparison.OrdinalIgnoreCase))
))
{
var collapseId = $"collapse{denuncia.Id_Denuncia}";
<div class="card collapse-card Rechazada">
<div class="card-header" data-bs-toggle="collapse" data-bs-target="#@collapseId" aria-expanded="false" aria-controls="@collapseId">
<h5 class="mb-0">Denuncia ID: @denuncia.Id_Denuncia</h5>
<div class="header-info">
<span><strong>Estado:</strong> @denuncia.Estado</span>
<span><strong>Motivo de rechazo:</strong> @denuncia.NombreDenuncia</span>
<span><strong>Fecha Rechazada:</strong> @denuncia.FechaSubidaAGestiona.ToString("dd/MM/yyyy")</span>
<span><strong>Hora Rechazada:</strong> @denuncia.FechaSubidaAGestiona.ToString("HH:mm")</span>
</div>
</div>
<div id="@collapseId" class="collapse">
<div class="card-body">
<!-- Datos Generales -->
<h5 class="section-heading">Datos Generales</h5>
<dl class="row">
@if (denuncia.Id_RegistroDenuncia != 0)
{
<dt class="col-sm-3">ID Registro Denuncia</dt>
<dd class="col-sm-9">@denuncia.Id_RegistroDenuncia</dd>
}
@if (denuncia.Id_Denuncia != 0)
{
<dt class="col-sm-3">ID Denuncia</dt>
<dd class="col-sm-9">@denuncia.Id_Denuncia</dd>
}
@if (denuncia.Fecha != DateTime.MinValue)
{
<dt class="col-sm-3">Fecha</dt>
<dd class="col-sm-9">@denuncia.Fecha.ToString("dd/MM/yyyy HH:mm")</dd>
}
@if (!string.IsNullOrWhiteSpace(denuncia.ExpedienteGestionaMostrable))
{
<dt class="col-sm-3">Nº expediente Gestiona</dt>
<dd class="col-sm-9">@denuncia.ExpedienteGestionaMostrable</dd>
}
@if (denuncia.Id_Persona_Gestiona != 0)
{
<dt class="col-sm-3">ID Persona Gestión</dt>
<dd class="col-sm-9">@denuncia.Id_Persona_Gestiona</dd>
}
@if (!string.IsNullOrWhiteSpace(denuncia.Etiqueta))
{
<dt class="col-sm-3">Etiqueta</dt>
<dd class="col-sm-9">@denuncia.Etiqueta</dd>
}
</dl>
<!-- Datos del Denunciante -->
@if (!string.IsNullOrWhiteSpace(denuncia.Nombre) ||
!string.IsNullOrWhiteSpace(denuncia.Apellidos) ||
!string.IsNullOrWhiteSpace(denuncia.Sexo) ||
!string.IsNullOrWhiteSpace(denuncia.Dni))
{
<h5 class="section-heading">Datos del Denunciante</h5>
<dl class="row">
@if (!string.IsNullOrWhiteSpace(denuncia.Nombre))
{
<dt class="col-sm-3">Nombre</dt>
<dd class="col-sm-9">@denuncia.Nombre</dd>
}
@if (!string.IsNullOrWhiteSpace(denuncia.Apellidos))
{
<dt class="col-sm-3">Apellidos</dt>
<dd class="col-sm-9">@denuncia.Apellidos</dd>
}
@if (!string.IsNullOrWhiteSpace(denuncia.Sexo))
{
<dt class="col-sm-3">Sexo</dt>
<dd class="col-sm-9">@denuncia.Sexo</dd>
}
@if (!string.IsNullOrWhiteSpace(denuncia.Dni))
{
<dt class="col-sm-3">DNI</dt>
<dd class="col-sm-9">@denuncia.Dni</dd>
}
</dl>
}
<!-- Detalles de la Denuncia -->
<h5 class="section-heading">Detalles de la Denuncia</h5>
<dl class="row">
<dt class="col-sm-3">Asunto</dt>
<dd class="col-sm-9">@denuncia.Asunto</dd>
<dt class="col-sm-3">A Quien Denuncia</dt>
<dd class="col-sm-9">@denuncia.A_Quien_Denuncia</dd>
<dt class="col-sm-3">Descripción Denuncia</dt>
<dd class="col-sm-9">@denuncia.Descripcion_Denuncia</dd>
<dt class="col-sm-3">Denunciado Ante Inst</dt>
<dd class="col-sm-9">@denuncia.Denunciado_Ante_Inst</dd>
@if (!string.IsNullOrWhiteSpace(denuncia.Modalidad_Informacion))
{
<dt class="col-sm-3">Modalidad Información</dt>
<dd class="col-sm-9">@denuncia.Modalidad_Informacion</dd>
}
<dt class="col-sm-3">Lugar Hechos</dt>
<dd class="col-sm-9">@denuncia.Lugar_Hechos</dd>
@if (denuncia.Fecha_Hechos != DateTime.MinValue)
{
<dt class="col-sm-3">Fecha Hechos</dt>
<dd class="col-sm-9">@denuncia.Fecha_Hechos.ToString("dd/MM/yyyy")</dd>
}
</dl>
<!-- Datos de Notificación -->
<h5 class="section-heading">Datos de Notificación</h5>
<dl class="row">
@if (!string.IsNullOrWhiteSpace(denuncia.Notificacion_Preferencia))
{
<dt class="col-sm-3">Notificación Preferencia</dt>
<dd class="col-sm-9">@denuncia.Notificacion_Preferencia</dd>
}
@if (!string.IsNullOrWhiteSpace(denuncia.Notificacion_Electronica))
{
<dt class="col-sm-3">Notificación Electrónica</dt>
<dd class="col-sm-9">@denuncia.Notificacion_Electronica</dd>
}
@if (!string.IsNullOrWhiteSpace(denuncia.Correo_Electronico))
{
<dt class="col-sm-3">Correo Electrónico</dt>
<dd class="col-sm-9">@denuncia.Correo_Electronico</dd>
}
@if (!string.IsNullOrWhiteSpace(denuncia.Notificacion_Sms))
{
<dt class="col-sm-3">Notificación SMS</dt>
<dd class="col-sm-9">@denuncia.Notificacion_Sms</dd>
}
</dl>
<!-- Otros -->
<h5 class="section-heading">Otros</h5>
<dl class="row">
@if (denuncia.Condiciones)
{
<dt class="col-sm-3">Condiciones</dt>
<dd class="col-sm-9">Sí</dd>
}
@if (!string.IsNullOrWhiteSpace(denuncia.Comments))
{
<dt class="col-sm-3">Comentarios</dt>
<dd class="col-sm-9"><pre>@denuncia.Comments</pre></dd>
}
</dl>
<!-- Ficheros adjuntos -->
@if (ficherosAdjuntos.ContainsKey(denuncia.Id_Denuncia) && ficherosAdjuntos[denuncia.Id_Denuncia].Any())
{
<h5 class="section-heading">Ficheros Adjuntos</h5>
<table class="table table-striped">
<thead>
<tr>
<th>Nombre</th>
<th>Tamaño (bytes)</th>
<th>Ver</th>
</tr>
</thead>
<tbody>
@foreach (var fichero in ficherosAdjuntos[denuncia.Id_Denuncia])
{
<tr>
<td>@fichero.NombreFichero</td>
<td>@fichero.Fichero.Length</td>
<td>
<a class="btn btn-primary btn-sm" href="#"
onclick="openFile(event, '@Convert.ToBase64String(fichero.Fichero)', '@GetContentType(fichero.NombreFichero)');">
<i class="bi bi-eye"></i> Ver
</a>
</td>
</tr>
}
</tbody>
</table>
}
</div>
</div>
</div>
}
</div>
}
<script>
function createObjectUrl(base64, contentType) {
const binaryString = window.atob(base64);
const len = binaryString.length;
const bytes = new Uint8Array(len);
for (let i = 0; i < len; i++) {
bytes[i] = binaryString.charCodeAt(i);
}
const blob = new Blob([bytes], { type: contentType });
return URL.createObjectURL(blob);
}
function openFile(event, base64, contentType) {
event.preventDefault();
event.stopPropagation();
const objectUrl = createObjectUrl(base64, contentType);
window.open(objectUrl, '_blank');
}
</script>
@code {
private List<DenunciasGestiona> denunciasRechazadas = new();
private Dictionary<int, List<FicherosDenuncias>> ficherosAdjuntos = new();
// Variable para la búsqueda
private string busqueda = "";
private bool hasLoaded = false;
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
await CargarRechazadasAsync();
await CargarFicherosAdjuntosAsync();
hasLoaded = true;
StateHasChanged();
}
}
private async Task CargarRechazadasAsync()
{
var todas = await CargarDenunciasJsonAsync();
// Ahora filtramos por la bandera EnRechazada
denunciasRechazadas = todas
.Where(d => d.EnRechazada)
.ToList();
}
private async Task<List<DenunciasGestiona>> CargarDenunciasJsonAsync()
{
return await DenunciaStore.GetAllDenunciasAsync();
}
private async Task<List<FicherosDenuncias>> CargarFicherosJsonAsync()
{
return await DenunciaStore.GetAllFicherosAsync();
}
private async Task CargarFicherosAdjuntosAsync()
{
var listaFicheros = await CargarFicherosJsonAsync();
ficherosAdjuntos = listaFicheros.GroupBy(f => f.Id_Denuncia)
.ToDictionary(g => g.Key, g => g.ToList());
}
private string GetContentType(string fileName)
{
var ext = Path.GetExtension(fileName).ToLowerInvariant();
return ext switch
{
".jpg" or ".jpeg" => "image/jpeg",
".png" => "image/png",
".gif" => "image/gif",
".pdf" => "application/pdf",
".txt" => "text/plain",
_ => "application/octet-stream",
};
}
}