fix(tz): servidor en America/Panama + edit/delete de horas registradas
TIMEZONE
* OS: timedatectl set-timezone America/Panama (era UTC). El reporte
de horas salía vacío para entries creados después de las 19:00 hora
Panama porque el filtro "este mes" del frontend usa local time pero
los datos se guardaban en UTC del día siguiente.
* MariaDB y PHP ahora corren en hora Panamá:
- src/Db.php hace SET time_zone='-05:00' por conexión.
- src/Config.php hace date_default_timezone_set('America/Panama').
* Migración 009: convierte timestamps existentes UTC → Panama usando
CONVERT_TZ en todas las tablas con DATETIME (users, escrituras_*,
tramites_*).
EDIT/DELETE DE HORAS
* Backend tramites/api.php: nuevos endpoints
- PUT ?action=update_hours: cambia abogado, hrs y descripción
- DELETE ?action=delete_hours
Permisos: solo el autor_email original (quien registró) o un
Socio/Admin puede editar/eliminar. También se valida canView().
* Frontend tramites.html: cada entrada de horas ahora muestra botones
✎ (editar) y ✕ (eliminar) al lado de la fecha, visibles solo para
quien tiene permiso. Editar abre un modal pequeño dedicado con los
mismos campos (abogado dropdown, horas dropdown 15-min, descripción).
This commit is contained in:
@@ -357,6 +357,62 @@ try {
|
||||
ok(hydrate($pdo, $row->fetch()));
|
||||
}
|
||||
|
||||
if ($method === 'PUT' && $action === 'update_hours') {
|
||||
$b = body();
|
||||
$hourId = (int)($b['_id'] ?? 0);
|
||||
if (!$hourId) err('id requerido');
|
||||
|
||||
$sel = $pdo->prepare('SELECT id, tramite_id, autor_email, abogado, hrs, descripcion FROM tramites_hours WHERE id = :id');
|
||||
$sel->execute([':id' => $hourId]);
|
||||
$row = $sel->fetch();
|
||||
if (!$row) err('Registro de horas no encontrado', 404);
|
||||
|
||||
$tramiteId = (int)$row['tramite_id'];
|
||||
if (!canView($pdo, $tramiteId)) err('No tienes acceso al trámite', 403);
|
||||
if (!Auth::isSocio() && $row['autor_email'] !== $user['email']) {
|
||||
err('Solo quien registró las horas (o un Socio/Admin) puede editarlas', 403);
|
||||
}
|
||||
|
||||
$abog = trim((string)($b['abogado'] ?? $row['abogado']));
|
||||
$hrs = (float) ($b['hrs'] ?? $row['hrs']);
|
||||
$desc = trim((string)($b['descripcion'] ?? $row['descripcion']));
|
||||
if ($hrs <= 0) err('horas debe ser > 0');
|
||||
|
||||
$upd = $pdo->prepare('UPDATE tramites_hours SET abogado = :a, hrs = :h, descripcion = :d WHERE id = :id');
|
||||
$upd->execute([':a' => $abog, ':h' => $hrs, ':d' => $desc, ':id' => $hourId]);
|
||||
|
||||
$pdo->prepare('UPDATE tramites_legales SET actualizado_por = :u WHERE id = :id')
|
||||
->execute([':u' => $user['email'], ':id' => $tramiteId]);
|
||||
|
||||
$r = $pdo->prepare('SELECT * FROM tramites_legales WHERE id = :id');
|
||||
$r->execute([':id' => $tramiteId]);
|
||||
ok(hydrate($pdo, $r->fetch()));
|
||||
}
|
||||
|
||||
if ($method === 'DELETE' && $action === 'delete_hours') {
|
||||
$hourId = (int)($_GET['id'] ?? 0);
|
||||
if (!$hourId) err('id requerido');
|
||||
|
||||
$sel = $pdo->prepare('SELECT id, tramite_id, autor_email FROM tramites_hours WHERE id = :id');
|
||||
$sel->execute([':id' => $hourId]);
|
||||
$row = $sel->fetch();
|
||||
if (!$row) err('Registro de horas no encontrado', 404);
|
||||
|
||||
$tramiteId = (int)$row['tramite_id'];
|
||||
if (!canView($pdo, $tramiteId)) err('No tienes acceso al trámite', 403);
|
||||
if (!Auth::isSocio() && $row['autor_email'] !== $user['email']) {
|
||||
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('UPDATE tramites_legales SET actualizado_por = :u WHERE id = :id')
|
||||
->execute([':u' => $user['email'], ':id' => $tramiteId]);
|
||||
|
||||
$r = $pdo->prepare('SELECT * FROM tramites_legales WHERE id = :id');
|
||||
$r->execute([':id' => $tramiteId]);
|
||||
ok(hydrate($pdo, $r->fetch()));
|
||||
}
|
||||
|
||||
if ($method === 'DELETE' && $action === 'delete') {
|
||||
if (!Auth::canDelete()) err('Tu rol no permite eliminar trámites. Solo Socios y Abogados pueden.', 403);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user