feat: olvidar firma, editar tiempos tomas, obs en header, fix dispositivos
- feat(turnero): Botón "Olvidar" en lugar.php y recepcion.php para descartar firma de consentimiento completo (nuevo endpoint resetear_consentimiento.php) - feat(turnero): Botón "Olvidar" por toma individual en prolongadas para borrar firma+hora de una toma específica (nuevo endpoint resetear_toma.php) - feat(turnero): Editar tiempos en tomas en_progreso: hora_campo signed muestra readonly con botón olvidar, permite re-editar tras olvidar - feat(turnero): Guardar tiempos (draft save) también en estado en_progreso - feat(turnero): Observaciones de tomas prolongadas se muestran en header de tarjeta firmada (campo obs_campo en _mpMap) - fix(turnero): Token del equipo se sobreescribía en tabla — ip permitía solo un registro con ip='' (UNIQUE); ahora ip es nullable Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
8e9d7750a7
commit
ff52fa5ba7
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
/**
|
||||
* POST /modules/turnero/api/resetear_consentimiento.php
|
||||
* Descarta firma y datos de un consentimiento → estado 'enviado' para re-firma.
|
||||
* Body JSON: { token: string }
|
||||
*/
|
||||
require_once __DIR__ . '/_helpers.php';
|
||||
requireMethod('POST');
|
||||
requireTurnero();
|
||||
|
||||
$body = inputJson();
|
||||
$token = trim($body['token'] ?? '');
|
||||
if (!$token) jsonError('token requerido.');
|
||||
|
||||
$pdo = db();
|
||||
$stmt = $pdo->prepare(
|
||||
"SELECT tc.id, t.sesion_id
|
||||
FROM turnero_consentimientos tc
|
||||
JOIN turnero_turnos t ON t.id = tc.turno_id
|
||||
WHERE tc.token = ? LIMIT 1"
|
||||
);
|
||||
$stmt->execute([$token]);
|
||||
$tc = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
if (!$tc) jsonError('Consentimiento no encontrado.', 404);
|
||||
|
||||
$pdo->prepare(
|
||||
"UPDATE turnero_consentimientos
|
||||
SET estado = 'enviado',
|
||||
firma_svg = NULL,
|
||||
firmado_at = NULL,
|
||||
firma_profesional_svg = NULL,
|
||||
firmado_profesional_at = NULL,
|
||||
datos_respuestas = NULL,
|
||||
siguiente_toma_at = NULL,
|
||||
toma_inicio_at = NULL
|
||||
WHERE token = ?"
|
||||
)->execute([$token]);
|
||||
|
||||
notificarSSE((int)$tc['sesion_id']);
|
||||
jsonOk([], 'Consentimiento reiniciado correctamente.');
|
||||
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
/**
|
||||
* POST /modules/turnero/api/resetear_toma.php
|
||||
* Borra campos específicos de datos_respuestas (firma + hora de una toma).
|
||||
* Body JSON: { token: string, campos: string[] }
|
||||
*/
|
||||
require_once __DIR__ . '/_helpers.php';
|
||||
requireMethod('POST');
|
||||
requireTurnero();
|
||||
|
||||
$body = inputJson();
|
||||
$token = trim($body['token'] ?? '');
|
||||
$campos = $body['campos'] ?? [];
|
||||
|
||||
if (!$token) jsonError('token requerido.');
|
||||
if (!is_array($campos) || empty($campos)) jsonError('campos requerido.');
|
||||
|
||||
$pdo = db();
|
||||
$stmt = $pdo->prepare(
|
||||
"SELECT tc.id, tc.datos_respuestas, tc.estado, t.sesion_id
|
||||
FROM turnero_consentimientos tc
|
||||
JOIN turnero_turnos t ON t.id = tc.turno_id
|
||||
WHERE tc.token = ? LIMIT 1"
|
||||
);
|
||||
$stmt->execute([$token]);
|
||||
$tc = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
if (!$tc) jsonError('Consentimiento no encontrado.', 404);
|
||||
if ($tc['estado'] !== 'en_progreso') jsonError('Solo se pueden olvidar tomas en estado en_progreso.');
|
||||
|
||||
$dr = json_decode($tc['datos_respuestas'] ?? '{}', true) ?? [];
|
||||
foreach ($campos as $campo) {
|
||||
unset($dr[$campo]);
|
||||
}
|
||||
$pdo->prepare(
|
||||
"UPDATE turnero_consentimientos SET datos_respuestas=? WHERE token=?"
|
||||
)->execute([json_encode($dr, JSON_UNESCAPED_UNICODE), $token]);
|
||||
|
||||
notificarSSE((int)$tc['sesion_id']);
|
||||
jsonOk([], 'Toma olvidada.');
|
||||
@@ -19,7 +19,7 @@ if ($delete) {
|
||||
jsonOk([], 'Dispositivo eliminado');
|
||||
}
|
||||
|
||||
$ip = trim($input['ip'] ?? '');
|
||||
$ip = trim($input['ip'] ?? '') ?: null;
|
||||
$nombre = trim($input['nombre'] ?? '');
|
||||
$lugarId = (int)($input['lugar_id'] ?? 0);
|
||||
$activo = (int)($input['activo'] ?? 1);
|
||||
@@ -27,7 +27,7 @@ $token = trim($input['token'] ?? '') ?: null;
|
||||
|
||||
if ($nombre === '') jsonError('El nombre es requerido');
|
||||
if ($lugarId <= 0) jsonError('Debes asignar un lugar');
|
||||
if ($ip === '' && $token === null) jsonError('Se requiere IP o token de dispositivo');
|
||||
if ($ip === null && $token === null) jsonError('Se requiere IP o token de dispositivo');
|
||||
|
||||
if ($id) {
|
||||
$stmt = db()->prepare(
|
||||
|
||||
Reference in New Issue
Block a user