prepare("SELECT id, sesion_id, paciente_id FROM turnero_turnos WHERE id = ?"); $stmt->execute([$turnoId]); $turno = $stmt->fetch(PDO::FETCH_ASSOC); if (!$turno) jsonError('Turno no encontrado.', 404); $pacienteId = (int)$turno['paciente_id']; // Si el turno aún no tiene paciente pero la petición trae uno válido, vincularlo aquí // (evita la carrera con vincular_paciente.php que se llamaba fire-and-forget). if (!$pacienteId && $pacienteIdReq) { $upd = $pdo->prepare("UPDATE turnero_turnos SET paciente_id = ? WHERE id = ?"); $upd->execute([$pacienteIdReq, $turnoId]); $pacienteId = $pacienteIdReq; } if (!$pacienteId) jsonError('El turno no tiene paciente vinculado.'); // Verificar que el formulario existe $stmt = $pdo->prepare("SELECT id, nombre FROM lab_formularios WHERE id = ? AND is_active = 1"); $stmt->execute([$formularioId]); $formulario = $stmt->fetch(PDO::FETCH_ASSOC); if (!$formulario) jsonError('Formulario no encontrado o inactivo.', 404); // Buscar si ya existe un token $stmt = $pdo->prepare( "SELECT token, estado FROM turnero_consentimientos WHERE turno_id = ? AND formulario_id = ?" ); $stmt->execute([$turnoId, $formularioId]); $existente = $stmt->fetch(PDO::FETCH_ASSOC); if ($existente) { if (in_array($existente['estado'], ['firmado', 'rechazado'], true)) { jsonError('Este consentimiento ya fue ' . $existente['estado'] . '.', 422); } $token = $existente['token']; } else { // Generar nuevo token $token = sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000, mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff) ); $stmt = $pdo->prepare( "INSERT INTO turnero_consentimientos (turno_id, formulario_id, token, estado, creado_por) VALUES (?, ?, ?, 'pendiente', ?)" ); $stmt->execute([$turnoId, $formularioId, $token, adminId()]); } $url = BASE_URL . 'ver_formulario_enviado.php?token=' . urlencode($token); jsonOk([ 'token' => $token, 'url' => $url, 'nombre'=> $formulario['nombre'], ]);