- Corrige la comparación del hash del report para detectar cambios y comentarios nuevos.

- Elimina la generación de documentos artificiales para comentarios.
- Añade los estados Nueva denuncia, Actualización ciudadano, Actividad OAAF y Actualizada.
- Incorpora circuitos específicos de comunicación SAJ y SDI.
- Registra correctamente el tipo de última subida en el histórico.
- Añade confirmación al asignar una denuncia a un grupo distinto al del usuario.
- Mejora etiquetas, mensajes de ayuda e instrucciones de la aplicación.
- Añade la persistencia técnica necesaria para identificar el origen de cada actualización.
This commit is contained in:
2026-07-29 14:47:35 +02:00
parent 6f9392f3d0
commit 8dedafdc07
23 changed files with 404 additions and 71 deletions

View File

@@ -314,12 +314,12 @@
<th>#</th>
<th>Canal</th>
<th>Presentacion</th>
<th>Actividad ciudadano</th>
<th>Actividad OAAF</th>
<th>Estado</th>
<th>Acceso</th>
<th>Seguimiento</th>
<th class="inbox-action-cell">Detalle</th>
<th title="Fecha de la última aportación o comentario realizado por el ciudadano.">Actividad ciudadano</th>
<th title="Fecha de la última comunicación o fichero incorporado por un gestor de la OAAF.">Actividad OAAF</th>
<th title="Resume si la denuncia es nueva, tiene cambios pendientes o ya está actualizada en Gestiona.">Estado</th>
<th title="Indica si tu usuario gestor del buzón puede acceder a esta denuncia.">Acceso</th>
<th title="Indica si el cambio está pendiente, descargado en la aplicación o ya incorporado a Gestiona.">Gestiona</th>
<th class="inbox-action-cell" title="Abre el detalle disponible en GlobalLeaks.">Detalle</th>
</tr>
</thead>
<tbody>
@@ -361,17 +361,17 @@
<td class="inbox-activity-cell">@FormatCitizenActivity(report)</td>
<td class="inbox-activity-cell" title="@GetReceiverActivityTitle(report)">@FormatReceiverActivity(report)</td>
<td>
<span class="badge @GetStatusBadgeCss(report)">
<span class="badge @GetStatusBadgeCss(report)" title="@GetStatusHelp(report)">
@GetStatusLabel(report)
</span>
</td>
<td>
<span class="badge @GetAccessBadgeCss(report)">
<span class="badge @GetAccessBadgeCss(report)" title="@GetAccessHelp(report)">
@GetAccessLabel(report)
</span>
</td>
<td class="inbox-tracking-cell" title="@(report.TrackingNote ?? string.Empty)">
<span class="badge @GetTrackingBadgeCss(report)">@GetTrackingLabel(report)</span>
<td class="inbox-tracking-cell">
<span class="badge @GetTrackingBadgeCss(report)" title="@GetTrackingHelp(report)">@GetTrackingLabel(report)</span>
</td>
<td class="inbox-action-cell">
<button type="button"
@@ -1282,7 +1282,7 @@
if (report.CitizenHasNewActivity)
{
return "Actualizacion ciudadano";
return "Actualización ciudadano";
}
if (IsReceiverOnlyUpdate(report))
@@ -1290,14 +1290,19 @@
return "Actividad OAAF";
}
if (report.Updated)
if (report.AlreadyInGestiona && !report.ActivityAnalyzed)
{
return "Sin comprobar";
}
if (IsUpToDateInGestiona(report))
{
return "Actualizada";
}
return string.Equals(report.Status, "closed", StringComparison.OrdinalIgnoreCase)
? "Cerrada"
: "Abierta";
: "Nueva denuncia";
}
private static string GetStatusBadgeCss(ReportDto report)
@@ -1317,7 +1322,12 @@
return "bg-secondary";
}
if (report.Updated)
if (report.AlreadyInGestiona && !report.ActivityAnalyzed)
{
return "bg-warning text-dark";
}
if (IsUpToDateInGestiona(report))
{
return "bg-light text-dark";
}
@@ -1327,6 +1337,47 @@
: "bg-primary";
}
private static bool IsUpToDateInGestiona(ReportDto report)
{
if (!report.AlreadyInGestiona)
{
return false;
}
var lastUpload = ParseDate(report.LastGestionaUploadAt);
var latestActivity = new[]
{
ParseDate(report.CitizenLastActivity),
ParseDate(report.ReceiverLastActivity)
}
.Where(value => value is not null)
.Select(value => value!.Value)
.DefaultIfEmpty()
.Max();
if (lastUpload is not null && latestActivity != default)
{
return lastUpload.Value >= latestActivity;
}
return report.ActivityAnalyzed &&
!report.CitizenHasNewActivity &&
!report.ReceiverHasNewActivity;
}
private static string GetStatusHelp(ReportDto report)
=> GetStatusLabel(report) switch
{
"Nueva denuncia" => "La denuncia todavía no tiene expediente creado desde la aplicación y está pendiente de actuación.",
"Actualización ciudadano" => "El ciudadano ha añadido un comentario, un fichero o una modificación posterior a la última subida a Gestiona.",
"Actividad OAAF" => "Un gestor de la OAAF ha realizado una comunicación o añadido un fichero posterior a la última subida a Gestiona.",
"Actualizada" => "La última subida a Gestiona es igual o posterior a la actividad del ciudadano y de la OAAF detectada en el buzón.",
"Sin comprobar" => "No se ha podido comparar en este momento la actividad del buzón con la última subida a Gestiona.",
"Cerrada" => "La denuncia figura cerrada en GlobalLeaks.",
"Sin leer" => "La denuncia todavía no se ha abierto con este usuario en GlobalLeaks.",
_ => string.Empty
};
private static string GetAccessLabel(ReportDto report)
=> report.Accessible switch
{
@@ -1343,6 +1394,14 @@
_ => "bg-light text-dark"
};
private static string GetAccessHelp(ReportDto report)
=> report.Accessible switch
{
true => "Tu usuario gestor del buzón tiene acceso a esta denuncia.",
false => "GlobalLeaks indica que tu usuario gestor del buzón no tiene acceso a esta denuncia.",
_ => "GlobalLeaks no ha informado si tu usuario puede acceder a esta denuncia."
};
private static bool CanUseReport(ReportDto report)
=> report.Accessible != false;
@@ -1422,6 +1481,35 @@
return "bg-light text-dark";
}
private static string GetTrackingHelp(ReportDto report)
{
if (report.AlreadyInGestiona)
{
return "La denuncia ya tiene un expediente creado en Gestiona. El estado indica si existe actividad posterior pendiente.";
}
if (report.DownloadedByAnotherUser)
{
return string.IsNullOrWhiteSpace(report.TrackingNote)
? "Otro usuario ya la descargó en la aplicación, pero todavía no se ha materializado la subida a Gestiona."
: $"{report.TrackingNote}. Todavía no se ha materializado la subida a Gestiona.";
}
if (report.DownloadedByCurrentUser)
{
return string.IsNullOrWhiteSpace(report.TrackingNote)
? "Ya la descargaste en la aplicación, pero todavía no se ha materializado la subida a Gestiona."
: $"{report.TrackingNote}. Todavía no se ha materializado la subida a Gestiona.";
}
if (report.AlreadyImported)
{
return "La denuncia está incorporada a la aplicación, pero todavía no se ha subido a Gestiona.";
}
return "La denuncia todavía no se ha descargado ni subido a Gestiona.";
}
private static string? GetReportRowCss(ReportDto report)
{
if (report.Accessible == false)