feat(tramites): involucrados pueden editar y eliminar horas también

Antes solo el autor original de la entrada (o un Socio/Admin) podía
editar/eliminar registros de horas. Ahora cualquiera con acceso al
trámite (creador, abogado solicitante, involucrado, socio, admin)
puede editar/eliminar horas de cualquier entrada — útil cuando un
involucrado nota un error en una hora registrada por otro.

* tramites/api.php: removido el check (autor_email == me OR isSocio)
  de update_hours y delete_hours. canView() sigue siendo el único
  gate, lo cual es consistente con add_hours.
* tramites.html: los botones ✎ y ✕ ahora siempre se muestran en cada
  entrada de horas. El backend protege la operación.
This commit is contained in:
Soporte ZH Consultores
2026-06-04 20:17:10 -05:00
parent e98d791cb8
commit 2f2d20604b
2 changed files with 9 additions and 13 deletions
+3 -6
View File
@@ -369,9 +369,8 @@ try {
$tramiteId = (int)$row['tramite_id']; $tramiteId = (int)$row['tramite_id'];
if (!canView($pdo, $tramiteId)) err('No tienes acceso al trámite', 403); if (!canView($pdo, $tramiteId)) err('No tienes acceso al trámite', 403);
if (!Auth::isSocio() && $row['autor_email'] !== $user['email']) { // Cualquiera que pueda ver el trámite (creador, abogado solicitante,
err('Solo quien registró las horas (o un Socio/Admin) puede editarlas', 403); // involucrado, o socio/admin) puede editar las horas registradas.
}
$abog = trim((string)($b['abogado'] ?? $row['abogado'])); $abog = trim((string)($b['abogado'] ?? $row['abogado']));
$hrs = (float) ($b['hrs'] ?? $row['hrs']); $hrs = (float) ($b['hrs'] ?? $row['hrs']);
@@ -400,9 +399,7 @@ try {
$tramiteId = (int)$row['tramite_id']; $tramiteId = (int)$row['tramite_id'];
if (!canView($pdo, $tramiteId)) err('No tienes acceso al trámite', 403); if (!canView($pdo, $tramiteId)) err('No tienes acceso al trámite', 403);
if (!Auth::isSocio() && $row['autor_email'] !== $user['email']) { // Misma regla que update_hours: cualquiera con acceso al trámite puede eliminar.
err('Solo quien registró las horas (o un Socio/Admin) puede eliminarlas', 403);
}
$pdo->prepare('DELETE FROM tramites_hours WHERE id = :id')->execute([':id' => $hourId]); $pdo->prepare('DELETE FROM tramites_hours WHERE id = :id')->execute([':id' => $hourId]);
$pdo->prepare('UPDATE tramites_legales SET actualizado_por = :u WHERE id = :id') $pdo->prepare('UPDATE tramites_legales SET actualizado_por = :u WHERE id = :id')
+6 -7
View File
@@ -538,14 +538,13 @@ function buildDetail(dept,r){
const obs=(r.obs||[]).map(o=>`<li>${esc(o.texto)}<br><span class="obs-meta">${esc(o.abogado)} · ${esc(o.fecha)}${o.autor_email?` · <i>${esc(o.autor_email.split('@')[0])}</i>`:''}</span></li>`).join(''); const obs=(r.obs||[]).map(o=>`<li>${esc(o.texto)}<br><span class="obs-meta">${esc(o.abogado)} · ${esc(o.fecha)}${o.autor_email?` · <i>${esc(o.autor_email.split('@')[0])}</i>`:''}</span></li>`).join('');
const lastUpd=r.obs&&r.obs.length?`<div class="last-upd">Última actualización: ${esc(r.obs[r.obs.length-1].fecha)}</div>`:''; const lastUpd=r.obs&&r.obs.length?`<div class="last-upd">Última actualización: ${esc(r.obs[r.obs.length-1].fecha)}</div>`:'';
// Cualquiera que pueda ver este trámite puede editar/eliminar horas
// (la API valida lo mismo: canView del trámite).
const hrs=(r.hours||[]).map(h => { const hrs=(r.hours||[]).map(h => {
const canEditHr = IS_SOCIO || h.autor_email === MY_EMAIL; const actions = `<span class="hr-actions" onclick="event.stopPropagation()">
const actions = canEditHr <button class="hr-edit" onclick="editHour(${h.id},'${dept}','${r.id}')" title="Editar">✎</button>
? `<span class="hr-actions" onclick="event.stopPropagation()"> <button class="hr-del" onclick="deleteHour(${h.id},'${dept}','${r.id}')" title="Eliminar">✕</button>
<button class="hr-edit" onclick="editHour(${h.id},'${dept}','${r.id}')" title="Editar">✎</button> </span>`;
<button class="hr-del" onclick="deleteHour(${h.id},'${dept}','${r.id}')" title="Eliminar">✕</button>
</span>`
: '';
return `<li> return `<li>
<span class="hl-who">${esc(h.abogado)}</span> <span class="hl-who">${esc(h.abogado)}</span>
<span class="hl-right"><span>${fmtHours(h.hrs)} · ${esc(h.fecha)}</span>${actions}</span> <span class="hl-right"><span>${fmtHours(h.hrs)} · ${esc(h.fecha)}</span>${actions}</span>