fix(turnero): corregir 6 hallazgos de auditoría en tomas previas
- cancelar_toma_pendiente: añade JOIN por paciente_id para prevenir IDOR - cancelar_toma_pendiente: requiere turno_id para validar propiedad - get_tomas_pendientes: porta filtros condicionales y _tomas_config de guardar_toma.php para mostrar conteo de firmas correcto - lugar.php: refresca sección tomas previas al completar via turneroFirmado - lugar.php: muestra error en catch de cargarTomasPrevias en vez de silenciar - lugar.php: limpia _tomaAlertados al cancelar toma previa - lugar.php: pasa turno_id en POST de cancelar para ownership check Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
814bd2ce5c
commit
49a622e05f
@@ -8,18 +8,26 @@ require_once __DIR__ . '/_helpers.php';
|
||||
requireMethod('POST');
|
||||
requireTurnero();
|
||||
|
||||
$body = inputJson();
|
||||
$body = inputJson();
|
||||
$consentId = (int)($body['consentimiento_id'] ?? 0);
|
||||
$turnoId = (int)($body['turno_id'] ?? 0);
|
||||
if (!$consentId) jsonError('consentimiento_id requerido.');
|
||||
if (!$turnoId) jsonError('turno_id requerido.');
|
||||
|
||||
$pdo = db();
|
||||
$stmt = $pdo->prepare(
|
||||
"UPDATE turnero_consentimientos
|
||||
SET estado = 'rechazado'
|
||||
WHERE id = ? AND estado = 'en_progreso'"
|
||||
);
|
||||
$stmt->execute([$consentId]);
|
||||
|
||||
if ($stmt->rowCount() === 0) jsonError('No se encontró toma en progreso con ese id.', 404);
|
||||
// Verificar que el consentimiento pertenece al mismo paciente que el turno activo.
|
||||
// Previene que un turnero cancele tomas de pacientes que no tiene abiertos (IDOR).
|
||||
$stmt = $pdo->prepare(
|
||||
"UPDATE turnero_consentimientos tc
|
||||
JOIN turnero_turnos t_old ON t_old.id = tc.turno_id
|
||||
JOIN turnero_turnos t_cur ON t_cur.id = ? AND t_cur.paciente_id IS NOT NULL
|
||||
AND t_cur.paciente_id = t_old.paciente_id
|
||||
SET tc.estado = 'rechazado'
|
||||
WHERE tc.id = ? AND tc.estado = 'en_progreso'"
|
||||
);
|
||||
$stmt->execute([$turnoId, $consentId]);
|
||||
|
||||
if ($stmt->rowCount() === 0) jsonError('Toma no encontrada o el paciente no coincide.', 404);
|
||||
|
||||
jsonOk(['cancelado' => true]);
|
||||
|
||||
Reference in New Issue
Block a user