prepare( "SELECT tc.id AS tc_id, tc.formulario_id, tc.token AS tc_token, tc.estado, tc.lab_form_envio_id, ts.paciente_id, t.sesion_id, p.nombre_completo, p.tipo_documento, p.numero_documento, p.fecha_nacimiento, p.telefono, p.eps, med.nombres AS medico_nombres, med.apellidos AS medico_apellidos FROM turnero_consentimientos tc JOIN turnero_turnos t ON t.id = tc.turno_id LEFT JOIN turnero_solicitudes ts ON ts.turno_id = tc.turno_id LEFT JOIN lab_pacientes p ON p.id = ts.paciente_id LEFT JOIN medicos med ON med.id = ts.medico_id WHERE tc.token = ? LIMIT 1" ); $stmt->execute([$consentToken]); $tc = $stmt->fetch(PDO::FETCH_ASSOC); if (!$tc) jsonError('Consentimiento no encontrado.', 404); // ── Si ya fue firmado o tiene envío vinculado, devolver ese token ──── if ($tc['lab_form_envio_id']) { $stEnv = $pdo->prepare("SELECT token, estado FROM lab_form_envios WHERE id = ?"); $stEnv->execute([(int)$tc['lab_form_envio_id']]); $envio = $stEnv->fetch(PDO::FETCH_ASSOC); if ($envio) { // Si el envio no fue completado todavía, reutilizarlo if (!in_array($envio['estado'], ['completado', 'firmado'])) { jsonOk(['form_token' => $envio['token']]); } // Si ya completado, devolver igualmente el token para que el operador lo vea jsonOk(['form_token' => $envio['token'], 'ya_firmado' => true]); } } if ($tc['estado'] === 'firmado') { jsonError('Este consentimiento ya fue firmado.', 409); } // ── 3. Crear nuevo lab_form_envios ──────────────────────────────────── $formToken = bin2hex(random_bytes(32)); // 64 chars hex $prefilled = []; if ($tc['nombre_completo']) $prefilled['__paciente']['nombre_completo'] = $tc['nombre_completo']; if ($tc['tipo_documento']) $prefilled['__paciente']['tipo_documento'] = $tc['tipo_documento']; if ($tc['numero_documento']) $prefilled['__paciente']['numero_documento'] = $tc['numero_documento']; if ($tc['fecha_nacimiento']) $prefilled['__paciente']['fecha_nacimiento'] = $tc['fecha_nacimiento']; if ($tc['telefono']) $prefilled['__paciente']['telefono'] = $tc['telefono']; if ($tc['eps']) $prefilled['__paciente']['eps'] = $tc['eps']; $medicoNombre = trim(($tc['medico_nombres'] ?? '') . ' ' . ($tc['medico_apellidos'] ?? '')); if ($medicoNombre) $prefilled['__paciente']['medico_nombre'] = $medicoNombre; $userId = (int)($_SESSION['admin_user']['id'] ?? 0) ?: null; $ins = $pdo->prepare( "INSERT INTO lab_form_envios (formulario_id, paciente_id, token, datos_prefilled, estado, enviado_por, enviado_via, turnero_consentimiento_id) VALUES (?, ?, ?, ?, 'pendiente', ?, 'link', ?)" ); $ins->execute([ (int)$tc['formulario_id'], $tc['paciente_id'] ?: null, $formToken, json_encode($prefilled, JSON_UNESCAPED_UNICODE), $userId, (int)$tc['tc_id'], ]); $formEnvioId = (int)$pdo->lastInsertId(); // ── 4. Guardar el vínculo en turnero_consentimientos ───────────────── $pdo->prepare("UPDATE turnero_consentimientos SET lab_form_envio_id = ? WHERE id = ?") ->execute([$formEnvioId, (int)$tc['tc_id']]); jsonOk(['form_token' => $formToken]);