{"id":"TH_ARCHITECTURE","title":"Arquitectura TRANSPORT HUB","version":"nav88-20261106-v1","date":"2026-11-06T13:00:28.028715+01:00","classification":"PUBLIC_REVIEW","sha256":"d462da401604603caa8090655efce3c67212dd66c757e3dfa869553c6e7b209a","read_url":"/api/review/TH_ARCHITECTURE","total_bytes":53541,"fragment_count":1,"document_sha256":"d462da401604603caa8090655efce3c67212dd66c757e3dfa869553c6e7b209a","fragmented":false,"content_markdown":"# Arquitectura: referencia historica y etapa B\n\nVer ARCHITECTURE_DECISIONS para las decisiones vigentes del repositorio, operaciones y cuotas.\n\n# Arquitectura y plan completo de implementacion\n\nExportacion para revision: 05/11/2026, Europe/Madrid.\nContenido completo de los informes fuente, no resumen. No se alteran los originales.\nLos nombres personales no imprescindibles se sustituyen por etiquetas; los ejemplos\ntecnicos y la estructura se conservan. No se exportan credenciales ni evidencias crudas.\nLas conclusiones, contadores y autorizaciones de cada informe son HISTORICOS:\nno habilitan operaciones. El encargo actual prioriza exclusivamente enumeracion por fechas.\nLa fecha mas reciente y el suplemento de esta revision prevalecen sobre planes anteriores.\n\n## Fuentes completas incluidas\n\n| Fuente original en VM | SHA-256 original |\n|---|---|\n| [RUTA INTERNA OMITIDA] | c11be5363f1a27143fd52d20c893946c3cf179ec0661123cf4bf5f50a355b554 |\n| [RUTA INTERNA OMITIDA] | 64a106f48b5ebc3fa2c4db51d3490230759e491bcec5f01006978fbd7b121dc0 |\n| [RUTA INTERNA OMITIDA] | 3360e9000bd3434a819b70993d23c5bad7a6dfd975e145e6f66c92b535e016cb |\n| [RUTA INTERNA OMITIDA] | cb3fb1dd6d8259bd37083fe1484fc7486a95518d99d47f05961107c30945addf |\n| [RUTA INTERNA OMITIDA] | ece91c44d580d1099ea79234ea6ed35d52ec8443ee58c3810d7508321d483fd1 |\n| [RUTA INTERNA OMITIDA] | 01ba339b547a06f61e1afa14daea70814e0408f0d7b5943d4ed39c3ab5a41751 |\n| [RUTA INTERNA OMITIDA] | 81147dc7e924e9591784e20c1afeb13cf0f500a2f485a588b7b6fcecd3cefd5e |\n| [RUTA INTERNA OMITIDA] | ca5c0143cdb6556c373a4a2576d476635b0ef063f711ecaff14307fdf395dbaf |\n\n---\n\n## Documento fuente: 01_EXECUTIVE_REPORT.md\n\n# Consolidacion: informe ejecutivo 05/11/2026\n\nSolo auditoria y documentacion; cero llamadas GLS. Se inspecciono VM214,\nPostgreSQL, codigo real, configuracion, fuentes y originales. No se abrio\nel enlace publico, instalo servicios, cambio puertos o realizaron migraciones.\n\n## Hechos principales\n\n1. iClientes es la integracion domestica recomendada por GLS Iberia segun\n   la comunicacion de Juan; ShipIT no se selecciona para esta operativa.\n2. Creacion/consulta SOAP demostradas; Anula aceptada con resultado 0.\n   Extranet mostro despues anulacion y cierre, segun Juan. No nueva API hoy.\n3. Falta el contrato de descubrimiento por cuenta/fecha. GetEnvios sigue\n   candidata, no descartada por tener XML generico; no aparecio un IN/OUT extra.\n4. Historico Extranet observado de noviembre 2025; API antigua aun no probada.\n5. Plataforma sana en pruebas locales health/ready 200. Puerto 88 activo;\n   80 libre. BD local PostgreSQL 15.19, 39 tablas, 386 columnas, 59 indices,\n   103 restricciones y 13 migraciones. Repositorio de expediciones sin poblar.\n6. Registro tecnico en ficheros mas amplio que indices SQL: 54 Markdown frente\n   a 31 knowledge_articles/31 documents. No se sincronizaron indices SQL hoy.\n7. Existe base reutilizable, no una plataforma operativa completa. La alta\n   productiva general esta bloqueada; Anula fue auxiliar aislado, no panel.\n\n## Respuestas a los 14 criterios de cierre\n\n| Pregunta | Respuesta basada en evidencia / prueba minima pendiente |\n|---|---|\n| Que sabemos de GLS | Domestica SOAP elegida; alta, lookup, etiquetas TEST y anulacion probados con los limites del maestro. |\n| Que originales tenemos | 16 registrados; 13 iClientes (11 iniciales + 2 Anula), 2 OpenAPI REST y 1 referencia Zebra. Hashes verificados. |\n| Como descubrir por fechas | Via domestica utilizable aun no acreditada; GetEnvios/GetManifiesto requieren contrato. No inferirlo de Extranet. |\n| Que falta demostrar | Operacion/IN/OUT/cuenta/fechas/limites y una prueba read-only de un intervalo autorizado, sin IDs. |\n| Hasta donde llega API | Probado lookup de 26/10/2026; no limite inferior API demostrado. Extranet tiene 61 resultados en rango 2025 comunicado. |\n| Que datos recuperamos | IDs, referencias, datos envio, estado/eventos; muestras cifradas. POD confirmado por GLS, formato real reciente pendiente. |\n| Que existe en PostgreSQL | Auditoria, usuarios/config, catalogos, laboratorio, documentos e impresion; tablas negocio base vacias. |\n| Que reutilizar | Conectores/captura, cifrado, auth local, contadores, tablas base, activos inmutables y verificacion fisica. |\n| Como sera historico | Extender shipments/parcels/tracking_events con cuentas, IDs y observaciones; no purga automatica. |\n| Como no saturar GLS | Un ejecutor presupuestado por cuenta/API/entorno, prioridades P0-P3 y checkpoint; SOAP sin cuota numerica asumida. |\n| POD posteriores | Pasada separada de cola, referencias privadas, hash/integridad, deduplicacion y presupuesto; no descarga hoy. |\n| API intranet | Versionada, identidad de servicio, scopes/cuenta, idempotencia, datos comerciales, sin SOAP arbitrario ni secretos GLS. |\n| Puertos 80/88 | Dos apps/routers de presentacion futuros, nucleo/BD comunes; tecnico no se publica por el operativo. Sin cambios ahora. |\n| Que implementar primero | Aprobar contrato y plan de pruebas; backup recuperable y modelo/ingesta offline sobre lo existente antes de sincronizar/importar. |\n\n## Contadores reales\n\nPRODUCCION iClientes 10; SOAP TEST 6; REST 5 registrados; global 21.\nHistorico rotulado TEST/laboratorio 11 contiene SOAP TEST y REST, no es una\ncuota oficial. REST: 2 OAuth, 1 ShipIT Parcel Shops, 1 catalogo T&T, 1 dataset.\nSOAP registrado: 4 altas (3 aceptadas y 1 error HTTP), 9 GetExpCli,\n2 recuperaciones EtiquetaEnvioV2, 1 Anula. No son 21 envios.\n\n## Riesgos y decisiones\n\nPrioridad inmediata: contrato de listado y profundidad, restauracion de backup,\nscope de cuenta, integridad de la ingesta y auditoria completa de cada HTTP.\nNo afirmar que cache significa historico, 100 es retencion o 20 es batch SOAP.\nLas dependencias instaladas se inventarian sin declarar revision CVE actual.\n\nSe entregan maestro, inventarios y 14 informes/anexos vinculados desde\nGLS Integration Master.\nEl contenido oficial reciente transmitido por Juan se incorpora como fuente\nfechada, no se fabrica un correo ni captura Extranet que no se haya recibido.\n\nAuditoria detenida para revision/aprobacion. Ningun plan queda activado.\n\n\n---\n\n## Documento fuente: 07_INFRASTRUCTURE_AUDIT.md\n\n# Auditoria de infraestructura VM214\n\n05/11/2026. Solo VM transport-hub y lectura de su configuracion Proxmox.\nNo otras VMs, proxy de empresa, DNS externo, impresora ni servicios GLS.\n\n## Estado observado\n\n- Debian GNU/Linux 12, Python 3.11, 2 vCPU. Proxmox asigna 2048 MiB,\n  balloon 1536 MiB; guest MemTotal 1502724 kB. No son 4 GB.\n- Disco 32 GB, filesystem de unos 33,6 GB, 8% usado y unos 29,9 GB\n  disponibles en la lectura. No prueba capacidad infinita de POD.\n- IP [IP INTERNA OMITIDA], hostname transport-hub; qemu-guest-agent activo.\n- transport-hub.service activo/running, usuario/grupo transport-hub,\n  WorkingDirectory [RUTA INTERNA OMITIDA] ExecStart [RUTA INTERNA OMITIDA]\n- Restart on-failure, PrivateTmp yes, NoNewPrivileges yes,\n  CapabilityBoundingSet cap_net_bind_service; ProtectSystem no.\n- ASGI FastAPI/Uvicorn + Jinja2 server-side; no React/Node ni contenedor\n  requerido por la aplicacion. Un proceso web observado, no worker dedicado.\n\n## Puertos y salud local\n\nTCP 88 escucha en 0.0.0.0 mediante Uvicorn; 80 no esta escuchando. SSH 22\nen IPv4/IPv6; PostgreSQL 5432 solo 127.0.0.1 y ::1. Resolucion local en\n53 y LLMNR 5355. No listener CUPS 631 durante la auditoria.\n\nGET local 127.0.0.1:88/health y /ready: HTTP 200. Ready confirma app,\nPostgreSQL, clave maestra y 13 migraciones. Se inspecciono antes su codigo:\nno llama GLS ni aplica migraciones en esos handlers. No se importo/inicio\notra instancia de web.py, cuyo startup SI aplica migraciones y sincroniza\nmetadata de documentos REST.\n\nNo se detecto Nginx/Apache/Caddy/HAProxy o Cloudflare Tunnel activo en VM.\nLa publicacion externa conocida pertenece a infraestructura ajena a este\nalcance: no se audita ni se declara segura/rota. Bind 0.0.0.0 no demuestra\npor si solo exposicion Internet. nft/ufw no disponibles como comandos; no\nse concluye que no haya filtrado en host/router. Nada fue modificado.\n\n## Tareas y procesos\n\n14 servicios running, incluidos PostgreSQL15, SSH, agente y sistema base.\n8 timers del sistema (apt, logrotate, dpkg backup, man-db, fstrim, e2scrub,\ntmpfiles); ninguno de TH/GLS. crontab no instalado; no jobs TH hallados\nen ficheros cron inspeccionados. Sin Redis/Celery/worker ni sincronizacion\nperiodica GLS identificada. No iniciar una tarea para probar ausencia.\n\n## Dependencias instaladas, sin revision CVE remota\n\nFastAPI 0.92.0; Starlette 0.26.1; Uvicorn 0.17.6; Jinja2 3.1.2;\ncryptography 38.0.4; psycopg2 2.9.5; argon2-cffi 21.1.0;\npython-multipart 0.0.5; Pillow 9.4.0; PyYAML 6.0; httpx 0.23.3;\npytest 7.2.1. PostgreSQL 15.19. CUPS 2.4.2 y Ghostscript instalados,\nno utilizados ni arrancados para esta auditoria.\n\npyproject sigue version 0.1.0 y descripcion fase0, sin declarar dependencias\nruntime completas. No es inventario reproducible de produccion. Proponer\nmanifest/lock y revision de seguridad/compatibilidad en fase propia; no\natribuir CVEs ni asegurar versiones actualizadas sin una revision autorizada.\n\n20 ficheros de tests, 169 funciones test detectadas por AST sin errores de\nsintaxis. No se ejecutaron tests integrados ni se afirma que todos pasen hoy.\n\n## Secretos, logs y backups\n\nmaster.key modo600 usuario servicio; UID test/production en iclientes-secrets\nmodo600, cifrados; credenciales REST cifradas en BD. .env legacy root600.\nArgon2id local y cookies firmadas, HttpOnly/SameSite=Lax/8h; Secure no activado\nen el codigo actual por HTTP. Misma clave local para cifrado/firma requiere\nplan de separacion/rotacion aprobado, no cambio unilateral.\n\nLogs en [RUTA INTERNA OMITIDA] y journal. No se replican logs completos\nen KB: pueden contener PII/sondas. Auditoria revisa control de redaccion y\nmetadata; originales SOAP cifrados separan evidencia de vistas sanitizadas.\n\nSe hallaron archivos de respaldo de documentacion/config/codigo (p.ej.\npre-iclientes-uid-20261019.tar.gz) y deployment snapshots. No se localizo\nun pg_dump reciente/plan restaurado en las rutas inspeccionadas. archive_mode\noff y timers de dpkg NO son un backup de PostgreSQL/secretos/activos TH.\nNo se auditaron posibles backups Proxmox externos ni se declara su ausencia.\n\nGate antes de historico: politica aprobada de BD+activos cifrados+clave/\nkeyring en backup seguro separado, manifiesto de hashes, consistencia y\nrestauracion de prueba autorizada. Si se pierde master.key y no hay copia,\nlos cifrados antiguos no son recuperables por resetear una clave.\n\n## Propuesta de despliegue, no aplicada\n\nNo aumentar recursos ahora. Medir carga de parseo/POD antes de concurrencia.\nSeparar arranque de migraciones y runtime antes de dos interfaces; servicio\noperativo futuro en 80 y tecnico en 88 con nucleo/BD comunes. No dos copias\nde codigo, ningun puerto/proxy/firewall nuevo durante esta fase.\n\n\n---\n\n## Documento fuente: 09_SYNC_AND_POD_DESIGN.md\n\n# Sincronizacion, importacion y POD: diseno sin ejecucion\n\nObjetivo desde agosto 2025, condicionado a alcance API demostrado y contrato\nde descubrimiento/exportacion. Ningun job/worker/timer se instala o activa.\n\n## Una cola comun y dos pasadas\n\nReutilizar synchronizations para cabecera/estado/correlacion y ampliar con\nitems/lease/checkpoint donde sea necesario. PostgreSQL puede arbitrar una\nprimera cola de trabajo; no se presupone necesidad de Redis/Celery.\n\n1. Descubrimiento autorizado: cuenta/entorno/rango, IDs devueltos y procedencia.\n   Si no hay listado, una exportacion oficial o semillas acreditadas pueden\n   alimentar candidatos. No secuencias, scraping ni codigo vacio.\n2. Primera pasada: datos, contactos disponibles, servicio, condiciones\n   comerciales, estados, TODOS los eventos/referencias y referencias documentales.\n   Captura completa/ingesta tipada; no limitarse a la primera muestra sanitizada.\n3. Segunda pasada despues de completar la primera: POD progresivos pendientes,\n   priorizados y presupuestados. No descargar etiqueta o POD para consultar estado.\n4. Sincronizacion permanente de activos, incidencias, pendientes e incompletos;\n   terminales reducidos/suspendidos con refresh manual explicito.\n\nLote inicial funcional **20 expediciones**, configurable. No significa\nGrabaServicios con 20 envios ni GetExpCli batch de 20 IDs: el lookup domestico\ndocumentado es por codigo. Hasta 20 lookups remotos mas descubrimiento/otros\nHTTP, no una llamada. No hay limite fisico de 20/100 en el repositorio.\n\n## Checkpoints y reanudacion\n\nJob immutable define cuenta, conector, intervalo, filtros, version de parser,\npresupuesto y autorizacion. Item guarda ID externo fuerte, estado, intentos,\nlast_error y referencia de respuesta. Lease exclusivo con expiracion para\nevitar que dos workers/manual consulten lo mismo simultaneamente.\n\nCheckpoints de descubrimiento conservan cursor/pagina reales SOLO cuando el\ncontrato GLS los defina; rango, ultimo item y cobertura. No inventar cursor\nni confiar en duracion ilimitada. Si expira, reiniciar ventana con solapamiento\ncontrolado/deduplicacion y presupuesto, no saltarse silenciosamente resultados.\n\nCommit atomico por envio: identidades, snapshot, eventos/revisiones, referencias\ny item procesado. Reejecutar ingesta LOCAL idempotente tras caida; evidencia\nya capturada no requiere otro HTTP. Entrega de cola es at-least-once local,\nno promesa de exactly-once en GLS.\n\nErrores de contrato/identidad pausan el job, no se reintentan a ciegas.\nLecturas transitorias pueden tener backoff/jitter e intentos acotados cuando\nse apruebe; 429 respeta indicacion recibida y cuotas; 401/403 abre circuito.\nCreaciones/anulaciones ambiguas no se reintentan automaticamente, menos aun\npor otro conector. Este plan no cambia el comportamiento de pruebas actuales.\n\n## Frescura y politica de actualizacion\n\nlast_fetch_at, last_successful_sync_at, source_effective_at, ingested_at y\nnext_sync_at son distintos. Consultar UI local no renueva last_gls_sync_at.\nUn error o lista vacia no sustituye un estado valido por cero/desconocido.\n\nActivos: ventanas configurables razonables y por cuota; incidencias vigentes\npriorizadas, no cada incidencia historica. Incompletos: refresco con motivo,\nno bucle sin limite. Finalizados: disminuir hasta detener automatismo segun\ncompletitud; posteriores correcciones se incorporan en revision/manual/ventana\nacordada, sin perder el historico anterior.\n\nEl manual aconseja unas 4-5 consultas diarias de conocidos no definitivos;\nes recomendacion de uso, no cuota ni permiso para activarlas ahora. No fijar\nintervalos definitivos sin conocer volumen/limites. Reusar una respuesta rica\npara estados, eventos, contactos y referencias, no hacer una consulta por vista.\n\n## POD progresivo, privado e integro\n\nUna referencia POD no es un binario almacenado. Modelo de item: detectado,\npendiente, descargando, verificado, fallido, no_disponible o requiere_revision.\nFuente/URL privada, tipo, hash, tamano y metadata, con dominio autorizado.\nEnlaces expirables requieren nueva consulta solo si es necesaria/autorizada.\n\nAl descargar futuramente: validar host/protocolo/redireccion/limites MIME,\ntimeouts/tamano, cifrar original, verificar firma de fichero/hash y metadata\ntransaccional. Evitar SSRF, URLs con secretos en logs y descargas a terceros\nno declarados. Cada HTTP de descarga cuenta, aunque sea almacenamiento de\ndocumentos y no SOAP. No seguir enlaces arbitrarios dentro de respuestas.\n\nNo recuperar de nuevo documento ya verificado; una version distinta crea\nactivo nuevo. Si falta campo POD no inventar un documento ni tratarlo como\nfallo definitivo. Priorizar pendientes segun antiguedad/riesgo de disponibilidad\nconfirmado, nunca reservar toda la cuota para historico. No descarga en esta fase.\n\n## Criterios de aceptacion futuros\n\nJob 20 sintetico/replay local con pausa a mitad y reanudacion sin duplicados;\nfallo BD tras captura sin segundo HTTP; dos workers sin doble claim; cuenta\nanterior bloqueada; terminales no consultados por defecto; originales intactos;\nzero POD en primera pasada; todos los HTTP contabilizados y presupuesto respetado.\n\n\n---\n\n## Documento fuente: 10_API_USAGE_DESIGN.md\n\n# Gestor central de consumo: diseno\n\nNo se cambia ningun limite, cola o contador. No hay valores definitivos de\nfrecuencia/concurrencia aprobados en esta auditoria.\n\n## Estado actual y semantica\n\napi_requests 21, api_usage_daily 7; cuenta no es columna de esas tablas.\nPRODUCCION SOAP 10 = 1 alta + 8 GetExpCli + 1 Anula.\nTEST SOAP 6 = 3 altas (una fallo HTTP), 1 GetExpCli, 2 etiquetas.\nREST 5 = 2 OAuth (ShipIT/T&T), 1 Parcel Shops, 1 catalogo, 1 dataset.\nHistorico TEST/laboratorio 11 agrega SOAP TEST y REST. No renumerar ese historial.\n\nHay tests anteriores al ledger y OAuth auxiliares que ciertos metodos no\nregistran individualmente. Por tanto el contador interno no certifica todo\nel trafico historico ni la cuota restante oficial. La agregacion actual\nconsidera exito HTTP200 aunque pueda fallar negocio: separar success_http\ny success_business en la evolucion, sin reescribir evidencia antigua.\n\nUnica politica configurada: T&T, etiqueta sandbox del laboratorio, 500/dia,\nreserva50 y umbrales50/75/90/100. El OpenAPI documenta 500 peticiones/dia y\nmaximo10 IDs/referencias; el alcance/horario exacto de reset se confirma con GLS.\nNo aplicar esa cuota a iClientes SOAP ni ShipIT. Limite desconocido != ilimitado.\n\n## Identidad de presupuesto\n\nProveedor + producto/API + entorno real + cuenta/identidad + periodo. Una\nKey compartida por apps podria consumir cuota no visible; registrar esa\nincertidumbre y margen, no prometer restantes exactas. OAuth se registra\ncomo HTTP propio con producto autenticacion/emisor y coste de cuota segun\ncontrato, aunque no compute igual que tracking. TLS/DNS no son expediciones.\n\nExtender tablas existentes con scope de cuenta y fuente de limite:\noficial/configuracion_interna/estimacion/desconocido. Limite oficial nullable\nen el modelo futuro; schema actual limit_count NOT NULL requiere migracion\nexpresa posterior, no usar 0 para simular ilimitado.\n\n## Prioridades y reservas\n\n| Prioridad | Uso | Proteccion |\n|---|---|---|\n| P0 | Operacion interactiva autorizada | Reserva propia; escritura siempre sujeta a confirmacion/idempotencia, no privilegio para saltar limites oficiales. |\n| P1 | Seguimiento activo e incidencias | Presupuesto sostenido y deduplicacion de trabajos. |\n| P2 | Importacion historica | Solo excedente autorizado, checkpoints y pausa antes de invadir reservas. |\n| P3 | POD antiguos | Capacidad residual y limites de bytes/concurrencia ademas de HTTP. |\n\nNo dar a P2/P3 toda la cuota en madrugada sin considerar P0 del siguiente\nperiodo. Reservas se calculan atomicas antes de dispatch; liberar reservas\nno usadas, registrar transmision real y conservar incertidumbre tras timeout.\nContar 401/429/errores segun politica oficial, no solo exitos.\n\nPlanificador por zona Europe/Madrid, calendarios laborable/nocturno/fin de\nsemana y excepciones configurables. Horarios no implican disponibilidad\ngarantizada del carrier. Control diario + ventana por minuto + concurrencia,\nmargen y circuit breaker independientes; el reinicio del servicio no reinicia\nconsumo. Cambios de periodo/DST no duplican capacidad por sumar 24h sin zona.\n\n## Simulacion antes de ejecutar\n\nPlan: candidatos -> deduplicados -> llamadas principales -> datos ya incluidos\n-> descargas necesarias -> coste OAuth/otros HTTP -> cuotas/reservas -> ejecucion\no pausa con motivo. No contar cada exp retornado como una llamada y no asumir\nque un lote20 representa una sola peticion SOAP.\n\nSi N conocidos requieren una GetExpCli cada uno, coste de lookup=N, mas\ndescubrimiento/descargas reales; iClientes no requiere OAuth por lookup.\nLa frecuencia del manual se somete a volumen y presupuesto acordado.\nRespuestas ya conservadas se reprocesan localmente con coste remoto cero.\n\n## Configuracion futura desde 88\n\nFuentes y ambitos de limites, ventana diaria/minuto, reservas por prioridad,\nmargen por consumo externo, horarios/feriados/zona, maximo concurrencia,\ntamano de job (inicial20 propuesto), limite bytes POD, backoff e intentos de lectura,\numbrales de alerta, maximo de consultas manuales y politica de terminales.\nCampos marcados provisional/confirmado por GLS, actor/cambio/version auditados.\nCambiar configuracion no arranca sincronizacion automaticamente.\n\nPanel: gastado/pendiente reservado/restante estimado, por API/cuenta/entorno,\ndiario/semanal/mensual, errores HTTP vs negocio, eficiencia items/HTTP,\nultima llamada y reset estimado con grado de certeza. Alertas persistentes\ndeduplicadas y reconocibles, sin repetir ruido en cada healthcheck.\n\nTest futuro: dos workers compiten por ultima reserva sin exceder presupuesto;\nP3 no bloquea P0; 429/backoff y reinicio conservan consumo; OAuth contado;\ncuenta/entorno aislados; no fallback de escritura entre conectores.\n\n\n---\n\n## Documento fuente: 11_INTERNAL_API_DESIGN.md\n\n# API interna de intranet: contrato propuesto v1\n\nNo implementada. TH especializado en transporte; intranet mantiene clientes,\npedidos/facturas y SMS. No una API limitada al SMS ni proxy SOAP arbitrario.\n\nBase logica `/internal/v1`. Cuenta/tenant deriva de identidad de servicio y\nseleccion autorizada, no de una UID enviada por el cliente. ID TH es recurso\nestable; numero GLS completo campo operativo principal, CODEXP/refs conservados.\n\n## Recursos y operaciones\n\n| Metodo y recurso | Contrato / permiso |\n|---|---|\n| POST /shipments | CrearExpedicion; shipments:create, Idempotency-Key obligatorio, cuenta/centro/servicio/destinatario/condiciones validos. No llamada ciega si capacidad deshabilitada. |\n| GET /shipments/{th_id} | Ficha local, shipments:read; campos de contacto segun permiso adicional. |\n| GET /shipments | Buscar numeroGLS/CODEXP/barcode/albaran/referencia/fecha/destinatario parcial/pais/estado/servicio/origen, cuenta/envio scoped. Paginacion LOCAL. |\n| GET /shipments/{id}/status | Cuatro dimensiones, codigos originales y fuente/fecha; no HTTP GLS implicito. |\n| GET /shipments/{id}/events | Eventos tipados/versiones; cursor local estable, no equivalencia numerica entre tipos. |\n| GET /shipments/{id}/cod | Reembolso declarado/moneda/observado y completitud; cod:read, sin fingir conciliacion bancaria. |\n| GET /shipments/{id}/tracking-link | URL oficial conservada o plantilla validada, source/status; no incluir UID/secretos. |\n| GET /shipments/{id}/labels | Metadata privada; labels:read, formato/hash/original. |\n| GET /shipments/{id}/pods | Metadata/estado de disponibilidad; pod:read, no descarga remota automatica. |\n| GET /shipments/{id}/incidents | Incidencias vigentes e historicas diferenciadas. |\n| POST /shipments/{id}/refresh | Solicitar actualizacion explicita, shipments:refresh, prioridad/budget y deduplicacion; devuelve operacion. |\n| GET /carriers/{carrier}/capabilities | Cuenta/entorno, documentado/validado/habilitado, limites y motivo de bloqueo; sin credenciales. |\n| GET /documents/{id}/content | Binario local autorizado, documents:read mas tipo sensible; no ruta arbitraria ni enlace publico permanente. |\n| GET /operations/{id} | Estado/peticion/resultado de operacion; sin trazas/secretos. |\n\nModificar/anular se modelan como comandos independientes futuros con permisos,\nconfirmacion y capacidad; no se abren por existir Anula en WSDL. Cerrar dia\nno forma parte del flujo normal ni del MVP de esta API.\n\n## Ficha conceptual de respuesta\n\n```json\n{\n  \"id\": \"[ID_TH]\",\n  \"carrier\": \"gls\",\n  \"account\": \"[CUENTA_TH_AUTORIZADA]\",\n  \"environment\": \"production\",\n  \"shipment_number\": \"2004-[IDENTIFICADOR OMITIDO]\",\n  \"identifiers\": {\"codexp\": \"[IDENTIFICADOR OMITIDO]\", \"guid\": null, \"barcode\": null},\n  \"references\": [],\n  \"status\": {\"administrative\": null, \"logistic\": null, \"lifecycle\": null, \"outcome\": null},\n  \"recipient\": {\"name\": null, \"phone\": null, \"mobile\": null, \"email\": null},\n  \"cod\": {\"declared_amount\": null, \"currency\": null, \"collection_status\": \"unknown\"},\n  \"tracking\": {\"url\": null, \"source\": null, \"validation_status\": \"pending\"},\n  \"data_source\": \"historical_repository\",\n  \"last_carrier_sync_at\": null,\n  \"completeness\": \"not_yet_imported\"\n}\n```\n\nEjemplo de ESQUEMA, no respuesta real ni fila existente de esa expedicion.\nNulls expresan datos no recuperados; los hechos de Extranet comunicados\nno se fabrican como nuevos resultados API. La respuesta real puede incluir\ndatos comerciales permitidos, no solo los campos minimos del ejemplo.\n\n## Crear y vincular con la intranet\n\nEntrada prevista: carrier/account/centro_remitente, referencia TH/caller,\npedido, factura, cliente/ERP, destinatario y contactos, servicio/horario,\nbultos/peso, portes, reembolso/importe/moneda, observaciones y servicios\nadicionales explicitamente solicitados. Centro remitente resuelve direccion\nconfigurada; snapshot queda ligado al envio. Validar datos requeridos por\nconector/servicio sin inventar telefonos si no los envia el origen.\n\nNo recibir endpoint, SOAPAction, XML libre, UID, bearer GLS, SQL, ruta\nfilesystem, callback o URL de descarga arbitrarios. Lista cerrada de campos\ny capacidades; clientes no eligen bypass de entorno o conector de respaldo.\n\nIdempotencia por identidad de servicio + cuenta + entorno + clave y hash\ncanonico del comando. Misma clave/datos devuelve la misma operacion; datos\ndistintos con misma clave =409. Una referencia pedido puede tener varios\nenvios: no es automaticamente clave idempotente universal.\n\nOperacion duradera antes de transmitir. Mutaciones devuelven 202 y ID de\noperacion; estado aceptada remota con IDs no se confunde con entregada.\nTimeout = resultado desconocido/requiere conciliacion, no nuevo envio.\nNo reintento automatico en otro conector ni nueva alta por expiracion del\ncliente HTTP. Consulta de operacion usa datos locales y conserva resultado.\n\n## Seguridad, errores y versionado\n\nIdentidades de servicio distintas de usuarios de navegador. Permisos por\noperacion, cuenta/entorno y datos: contactos y POD no para cualquier lector.\nSecretos de cliente guardados por mecanismo existente autorizado, rotables,\ncon hashes/referencias donde corresponda; no generar credenciales ahora.\nPreferir TLS interno/mTLS o canal privado acordado. Bearer sobre HTTP LAN\nno cifra nada; necesita decision de riesgo/compensacion, no confianza solo\nporque el puerto80 no se publique en Internet.\n\nAuditar actor, cuenta, correlation_id, idempotency_key referenciada, resultado\ny campos sensibles leidos sin copiarlos en logs. Limitar busqueda/exportacion,\ntamano/cursor y peticiones por servicio, ademas del presupuesto GLS. Errores\nde cliente 400/403/404 por ambito, 409 conflicto/capacidad, 422 validacion,\n429 presupuesto, 503 dependencia; estructura estable {code,message,correlation_id,\nretryable}. No filtrar existencia de datos de otra cuenta, ni stack traces.\n\nVersion v1 con campos aditivos; cambios de significado requieren version.\nContratos de consumidor/tests sintenticos y cuenta negativa antes de desplegar.\nNo endpoint publica directamente datos crudos de GLS ni firmas/POD masivos.\n\n## Enlace de seguimiento y SMS\n\nPreferencia: URL oficial devuelta por GLS y preservada con origen/version,\nhost/protocolo validados, expiracion si existe. Hoy solo hay un ejemplo de\nJuan, sin plantilla universal demostrada. No se ha abierto ni validado.\nPlantilla configurable e inicialmente deshabilitada para casos no probados;\nURL-encode, host allowlist y prohibicion de secretos en query/path.\n\nNo afirmar que /e/{CODEXP}/{CP_DESTINO} sea siempre valido para internacionales\no cualquier servicio. Si no esta validado, API devuelve pending/null, no URL\ninventada. La intranet decide y envia SMS; TH no crea automatizacion SMS.\n\n\n---\n\n## Documento fuente: 12_INTERFACES_DESIGN.md\n\n# Interfaces operativa 80 y tecnica 88: diseno\n\nNo se abrio el puerto80 ni se cambio el proceso actual. Hoy todo vive en\nFastAPI/Uvicorn88, HTML Jinja2; no hay interfaz operativa independiente.\n\n## Topologia propuesta\n\n```text\nUsuarios LAN -> HTTP :80 -> presentacion operativa / API de negocio autorizada\nTecnicos     -> HTTP :88 -> configuracion, KB, diagnostico, auditoria\n                           |\n                 mismos servicios de negocio\n                 mismo repositorio PostgreSQL\n                 mismos conectores y gestor de consumo\n```\n\nDos apps/router roots/entrypoints de presentacion, no dos copias del dominio\nni dos BD. Un segundo servicio ASGI futuro es viable en puerto libre sin\nproxy nuevo obligatorio; decision de despliegue se aprueba despues. No se\nejecuta dos veces el startup actual que aplica migraciones. Primero extraer\nmigracion como paso de release autorizado, y factories sin efectos al importar.\n\n88 mantiene KB, configuracion tecnica, diagnosticos, consumo, logs/evidencias,\nusuarios/roles y herramientas. Ninguna ruta tecnica se monta en app80 ni se\nprotege solo por ocultar el enlace del menu. Ambos listeners autentican y\nautorizan en servidor. Salud local no llama GLS.\n\n80: LAN, HTTP segun decision del encargo, sin allowlists de IP individuales,\nautenticacion de usuarios y permisos. No significa publicar en Internet o\ndar acceso anonimo. Futuro acceso API con secretos exige TLS/canal seguro o\naceptacion expresa del riesgo de HTTP; no se modifica proxy/firewall ahora.\n\nCookies no se aislan por puerto: nombres/paths/audiencia y politica de sesion\nseparados para operativo/tecnico, CSRF por origen permitido y roles comunes\nrevalidados. No poner una cookie admin valida indiscriminadamente en ambos.\nNo usar confianza en X-Forwarded-* de cualquier cliente; proxies confiables\nsolo tras revisar la infraestructura de empresa con permiso especifico.\n\n## Menu operativo aprobado\n\n1. Grabar envios: formulario de negocio, centro remitente, destinatario,\n   contactos, bultos/peso, servicio, reembolso y referencias; revision humana\n   de produccion y confirmacion idempotente antes de crear.\n2. Buscar envios: informacion del repositorio, filtros, ficha y documentos.\n3. Cerrar dia: ultimo modulo, complementario y condicionado a contrato y\n   autorizacion. No requisito para funcionamiento normal ni para desarrollo.\n\nPC primero, adaptacion movil posterior; no implementar landing ni duplicar\nlaboratorio. Los datos del remitente no se reenvian desde intranet si un centro\nya configura lo necesario, manteniendo snapshot de lo efectivamente usado.\n\n## Buscar envios: superficie propuesta\n\nBarra de filtros compacta: numero GLS completo prioritario, fechas, nombre\nparcial, referencia, CP, servicio/horario, estado, entregadas/pendientes,\nincidencias, anuladas, reembolso, pais, agencia y cuenta/entorno/origen.\nNo mezclar anuladas con entregadas ni CERRADO DEFINITIVO con entrega.\n\nVistas rapidas: Todas, En curso, Pendientes, Incidencias, Entregadas,\nAnuladas. Consulta SQL parametrizada y paginada localmente; filtros remotos\nsolo despues de tener contrato y accion explicita. Paginar, buscar o abrir\nficha NO llama GLS. Los candidatos aun no confirmados se distinguen de los\nenvios recuperados; vacio de API no crea estado pendiente ficticio.\n\nTabla: numero completo, fecha, destinatario/poblacion/CP, servicio/horario,\nbultos/peso, estado por dimensiones, reembolso, ultima consulta, procedencia\ny calidad. Acciones de documentos solo si permiso/disponibilidad reales.\n\nFicha: IDs, administrativo/logistico/ciclo/resultado, partes/contactos,\nservicio, bultos, peso, reembolso, referencias, timeline, delegaciones,\nincidencias, enlace publico, POD, etiquetas y detalles tecnicos autorizados.\nCodigo/literal original y fuente conservados aunque no esten en vista principal.\nExtranet es referencia funcional, no contrato ni obligacion de copiar su visual.\n\n## Sin conectividad GLS\n\nConsulta local sigue disponible si app/BD funcionan. Mostrar Datos del\nrepositorio historico, ultima sincronizacion GLS, fecha efectiva y error/\nfrescura; no prometer datos actuales por estar renderizados ahora. Si no hay\nPOD local mostrar pendiente/no disponible, no hacer descarga automatica.\nPostgreSQL caido es fallo diferente: no hay cache magica si su BD no responde.\n\nActualizar manual es comando independiente con confirmacion/permisos/cuota,\nno efecto secundario de GET. La impresion EPL sigue manual, original inmutable,\nderivado S4 y resultado TRANSMITIDO distinto de verificacion fisica humana.\n\n\n---\n\n## Documento fuente: 13_RISKS_AND_DECISIONS.md\n\n# Riesgos y decisiones pendientes\n\n05/11/2026. Prioridad de proyecto, no afirmacion de vulnerabilidad explotada.\nNada corregido unilateralmente en codigo/infraestructura en esta auditoria.\n\n| Prioridad | Riesgo / evidencia real | Decision o gate |\n|---|---|---|\n| P0 | Descubrimiento domestico sin IN/OUT; Extranet no define SOAP | Pedir contrato exacto y lectura acotada; nunca XML inventado. |\n| P0 | Backup/restauracion de BD+activos+clave no demostrados | Aprobar y ensayar restauracion antes de historico/migracion. No tocar otra VM sin permiso. |\n| P0 | Crear con timeout puede duplicarse al cambiar conector | Operacion duradera/idempotencia y conciliacion; nada de fallback automatico. |\n| P0 | Modelo sin cuenta/entorno ni unicidad de IDs fuertes | Aprobar alcance y claves antes de importar; cuenta previa aislada. |\n| P1 | Datos comerciales/eventos se perderian desde sanitized copy (limites/PII) | Ingesta tipada de original cifrado, no de muestra recortada. |\n| P1 | Historico API 2025/POD sin demostrar | Prospectar IDs reales y contrato con presupuestos separados. |\n| P1 | 401 ShipIT antes atribuido como certeza contractual | Mantener causa probable/no determinada; ahora producto no seleccionado por recomendacion GLS. |\n| P1 | Startup aplica migraciones y upsert de metadata | No arrancar segunda app en auditoria; separar release/runtime antes de 80. |\n| P1 | HTTP LAN y cookies no separadas por puerto | Aceptar riesgo/definir canal seguro, scopes y sesiones por interfaz; no abrir Internet. |\n| P1 | Clave local unica para cifrado/firma; backups no acreditados | Plan keyring/rotacion y backup seguro, sin inventar cripto ni migrar secretos ahora. |\n| P1 | Contadores no son todo HTTP historico; OAuth implicito y etiquetas sandbox ambiguas | Centralizar captura de cada intento real y entorno/cuenta, no reconstruir como certeza el pasado. |\n| P1 | Anula funciono en auxiliar, no conector reusable; flag borrado ambiguo | No declarar funcion de panel ya disponible; cuatro ejes de estado y fuente. |\n| P2 | 54 articulos en disco frente a 31 indices SQL | Reconciliacion futura versionada; KB filesystem actual sigue accesible sin insertar hoy. |\n| P2 | Dependencias/metadata proyecto fase0 y sin lock completo | Inventario reproducible y revision de seguridad/compatibilidad con autorizacion; no upgrades a ciegas. |\n| P2 | Memoria guest 1,5 GB visible, concurrencia POD desconocida | Medir y limitar; sin aumento de recursos en esta fase. |\n| P2 | Plantilla enlace publico solo observada en un ejemplo | Guardar enlace oficial; plantilla no general hasta confirmar pais/servicio/CP. |\n| P2 | Ausencia de cargos tras Anula no probada | No declararla; soporte y evidencias administrativas/facturacion futuras. |\n\n## Decisiones adoptadas documentalmente\n\nADR-01: iClientes domestico principal, ShipIT investigacion archivada para\nesta operativa. Alternativa continuar habilitando ShipIT descartada como\nprioridad por recomendacion GLS; no borrar contratos/evidencia.\n\nADR-02: repositorio historico persistente en BD existente, no cache de 100.\nTTL mide frescura, no retencion. Alternativa segundo repositorio GLS rechazada.\n\nADR-03: numero GLS completo como identificador humano; PK TH independiente\ny IDs tipados scoped. Alternativa CODEXP global/PK rechazada.\n\nADR-04: cuatro dimensiones de estado y versiones de evento. Alternativa\nultimo evento cronologico/estado unico rechazada por TH-P-001 y FACTURA\nposterior de historica entregada.\n\nADR-05: importacion datos/referencias primero, POD despues; job20 configurable,\nno batch SOAP20. Presupuesto central P0-P3; no valores definitivos hoy.\n\nADR-06: operativo80 y tecnico88 con nucleo/BD/consumo compartidos. Dos vistas\nno significan dos copias del negocio ni misma cookie confiada por puerto.\n\nADR-07: intranet integra por API versionada, mantiene SMS y autoridad comercial;\nno acceso directo a UID/SOAP ni automatizacion de portal.\n\n## Decisiones que requieren aprobacion\n\nContrato/alcance historico GLS; presupuesto de pruebas; minimo indexable PII\ny cifrado por campo; retencion/gobierno; mecanismo de backup/restore y RPO/RTO;\ntopologia/TLS/canal de API; roles de lectura/contactos/POD; rol de migracion;\ncadencias y cuotas internas; generacion validada de enlace; reglas de eventos\ncorregidos sin ID externo; orden de activacion de escrituras y cierre.\n\nNo quedan decisiones funcionales activadas por escribir esta lista.\n\n\n---\n\n## Documento fuente: 14_IMPLEMENTATION_PLAN.md\n\n# Plan de implementacion, pendiente de aprobacion\n\nNo ejecutar al terminar la auditoria. Cada fase requiere alcance, backup,\ntests, documentacion, configuracion externa, rollback y criterios de salida.\nNo nuevos transportistas, banca, facturacion o SMS en este plan inicial.\n\n| Fase | Dependencias y trabajo propuesto | Criterio de aceptacion |\n|---|---|---|\n| 0. Cerrar incertidumbres | Recibir IN/OUT listado, alcance historico, POD y limites; aprobar R1 y luego bloques historicos si procede. | Capacidad documentada y prueba minima real por autorizacion, o limitacion/fallback oficial claramente aceptados. |\n| 1. Proteccion y release | Backup consistente BD+activos+claves, restauracion de prueba autorizada, dependencias inventariadas y migraciones separadas del arranque. | Recuperacion verificada y rol/runtime definido sin cambiar otras VMs sin permiso. |\n| 2. Modelo historico | Extender nucleo existente con cuentas, IDs, referencias, snapshots, eventos/revisiones, operaciones y documentos privados minimos. | Migraciones aprobadas/testadas, aislamiento cuenta/entorno, sin destruir laboratorio/originales. |\n| 3. Ingesta offline | Reprocesar evidencias existentes autorizadas con parser versionado y cuatro ejes; no llamadas externas para reimportar. | Sin duplicados, PII autorizada completa, replay tras fallo BD, historial inmutable; TH-P-001 no termina ENTREGADA. |\n| 4. Ejecutor y consumo | Cuenta/API/entorno, reservas P0-P3, captura de cada HTTP, errores y lease/backoff controlado. | No exceso de reserva, OAuth contado, fallo parcial sin retry de escritura, estado desconocido conciliable. |\n| 5. Lectura/importacion inicial | Contrato/semillas oficiales; primer job20 configurable solo datos/referencias, sin POD. | Datos y todos los eventos persistidos, checkpoint/reanudacion, informe de cobertura y consumo real. |\n| 6. API intranet y busqueda80 | Contratos v1/RBAC/contactos, API de lectura y UI PC sobre mismo repositorio; desplegar80 solo con aprobacion de red/HTTP/seguridad. | 88 intacto, ninguna ruta tecnica expuesta80, sin GLS al filtrar/paginar, funciona sin Internet con DB disponible. |\n| 7. Seguimiento continuo | Cadencias/ventanas acordadas, activos/incidencias/incompletos, terminales y refresh manual. | Sincronizacion presupuestada, circuit breaker, sin perdida ni reinicio de contador. |\n| 8. POD progresivo | Primera pasada completada, formato y alcance probados, politicas privadas y cuota aprobadas. | Descarga gradual, hash/validacion, sin duplicar verificados, control de enlaces y todos los HTTP auditados. |\n| 9. Escritura operativa | Grabar envios/CrearExpedicion intranet, centros remitentes, revision/confirmacion e idempotencia; Anula reusable solo en subfase autorizada. | Un solo envio ante doble POST, respuesta ambigua no reintentada, produccion inequívoca y credenciales aisladas. |\n| 10. Cerrar dia complementario | Contrato domestico de cierre/manifiesto y necesidad de negocio expresamente confirmados. | Ultimo modulo, no dependencia normal de alta/seguimiento; ninguna prueba de cierre sin permiso especifico. |\n\nFases 0 y preparacion de contratos/modelo pueden avanzar documentalmente\nen paralelo. No bloquear todo el producto esperando ShipIT: queda fuera de\nla ruta principal. El repositorio y la ingesta offline no inventan enumeracion;\nel importador historico completo necesita realmente IDs o listado oficial.\n\n## Que implementar primero, tras aprobar\n\nPrimero proteccion recuperable y diseno de identidad/estados/ingesta local,\nmientras se obtiene el contrato de descubrimiento. No empezar por una UI\nque llame GLS en cada filtro ni por descargas masivas de POD. El primer\nincremento operativo debe demostrar persistencia de conocidos y consumo\ncorrecto antes de automatizar historico o ampliar escrituras.\n\n## Calidad transversal\n\nTests sinteticos para cifrado/permisos, parser robusto/500/Fault, scope de\ncuenta, dedup/revisiones, referencias heredadas, estados cruzados, idempotencia,\nbackoff/cuota, doble worker, documentos inmutables, cookies por interfaz,\nAPI consumidor y restauracion. Pruebas externas separadas y contadas.\n\nNo reutilizar UID real en unit tests ni versiones crudas de documentos con\ncredenciales. Validar datos completos en parser privado y solo vistas sanitizadas\nen logs. Changelog/README y runbooks se actualizan al implementar, no mediante\nafirmaciones de funcionalidades aun no construidas.\n\n## Aprobaciones pendientes antes de actuar\n\nElegir bloque de pruebas (recomendado R1: una GetExpCli reciente), aprobar\npolitica de datos/contactos y autenticacion intranet, contrato historico,\nplan backup/restore, schema y criterios de roles/puertos. Esta auditoria no\nautoriza esas actuaciones ni genera tareas programadas.\n\n\n---\n\n# Suplemento: propuesta diaria concreta y plan de salida del bloqueo\n\n05/11/2026. Diseno no desplegado; sin nuevos procesos, puertos, servicios ni llamadas GLS.\nObjetivo de uso: al abrir TH por la manana, ver los envios de ayer con entrega/transito/incidencia.\n\n## Secuencia propuesta con enumeracion validada\n\n1. Una tarea manual/diaria autorizada determina ayer en Europe/Madrid y la cuenta activa.\n   Descubre IDs mediante el contrato de listado, con el campo de fecha y limites acordados.\n   No usar cierre/manifiesto de efectos desconocidos como mecanismo de importacion.\n2. Conserva respuesta original cifrada y metadatos; aplica en transaccion los resultados utiles\n   que ya contenga. Solo solicita detalle de IDs nuevos/incompletos cuando haga falta y haya\n   presupuesto. No asumir que GetEnvios requiere siempre otra llamada o que devuelve ficha completa.\n3. Refresca conocidos activos e incidencias de cualquier fecha con prioridad y ultima sync correcta;\n   entregas recientes segun politica. No refrescar indiscriminadamente todo el historico cada dia.\n4. Actualiza proyecciones de estado/eventos/datos y cobertura. Una ventana se marca completa\n   solo tras todas las paginas validadas y deduplicadas. Ventana parcial conserva cursor/motivo.\n5. El puerto 80 futuro consulta SOLO PostgreSQL: filtro por fecha operativa, cuenta, destinatario,\n   servicio y estado; paginacion local. Abrir/buscar no llama a GLS. Puerto 88 sigue siendo tecnico.\n6. La pantalla muestra ultima sincronizacion correcta, ultimo intento, cobertura del periodo,\n   datos incompletos y errores. Permite actualizacion manual separada con alcance y coste previstos.\n7. POD en segunda pasada progresiva de entregadas, solo si no existe activo verificado y con\n   presupuesto separado. Su retraso no bloquea la busqueda ni la importacion de la ficha.\n\nNo se fija una nueva hora/frecuencia como permiso operativo. El manual aconseja 4-5\nrefrescos de no definitivos al dia; ajustar la futura agenda y cuota con GLS y Juan.\nEl lote 20 del plan anterior es tamano de trabajo local, no batching SOAP ni 20 consultas gratis.\nDescubrimiento, detalle, eventos, descarga POD y cualquier token/HTTP auxiliar tienen coste real.\nNo atribuir 500/dia T&T a iClientes. Limite SOAP desconocido, no ilimitado.\n\n## Sin conexion y fallos\n\nLa busqueda local sigue disponible con indicador de antiguedad; no inventar entrega/ausencia.\nEl estado correcto de ultima sincronizacion no se reemplaza por un fallo posterior. Guardar\ncaptura para replay cuando falla parser/BD. Los reintentos de lectura futuros requieren\npolitica/presupuesto, no se aplican a la prueba actual (cero reintentos). Nunca retries\nautomaticos de creacion ambigua; no mezclar su idempotencia con un job de consulta.\n\nManual y programada usan un mismo motor con lease/lock por cuenta/tarea e idempotencia\nde ingesta para impedir solapamientos accidentales. Cambios tardios requieren solape o feed\ndocumentado; el cursor de una pagina no es automaticamente un cursor de cambios continuo.\n\n## Que puede hacerse sin enumeracion\n\n| Funcion | Con IDs conocidos | Limitacion expresa |\n|---|---|---|\n| Guardar/consultar/actualizar una ficha conocida | Si, tras implementar ingesta autorizada | No descubre envios Extranet desconocidos. |\n| Mostrar ayer desde BD | Si, sobre datos locales | Mensaje obligatorio: cobertura parcial; no equivale a todos los envios de ayer. |\n| Detectar entrega/incidencia de conocidos | Si, con refrescos autorizados | No detecta incidencias de expediciones nunca importadas. |\n| Historico completo desde agosto 2025 | No demostrado | Falta mecanismo de descubrimiento y retencion/cobertura probadas. |\n| Sembrar IDs desde exportacion oficial autorizada | Posible alternativa futura | No hay importador implementado ni exportacion completa recibida. |\n| Nuevas altas TH futuras | Sus IDs se conocen por respuesta | No resuelve altas de otros canales ni el historico anterior. |\n\nSi GLS no ofrece listado, solicitar exportacion inicial y alimentacion incremental\noficial acordada. No scraping, enumeracion de secuencias ni consulta ciega de codigos.\nAceptar una alternativa parcial debe ser una decision visible, no esconder el bloqueo.\n\n## Plan siguiente propuesto, sin iniciar implementacion\n\n1. Revisar el ZIP y enviar manualmente el borrador tecnico a GLS. Obtener IN/OUT con\n   efectos, cuenta, fechas, paginas, retencion y limites. No volver a pedir alta/endpoint/UID.\n2. Analizar el contrato y preparar mocks, validacion y calculo de coste. Si se acredita\n   lectura, revisar la unica consulta reciente pendiente y su presupuesto antes de enviarla.\n3. Tras resultado reciente y nueva aprobacion, probar el intervalo de los 61 y contrastar\n   IDs/criterios con Extranet; pedir autorizacion para cualquier pagina adicional.\n4. Aprobar backup/restore, modelo scoped y migraciones. Implementar primero parser/ingesta\n   offline/replay, identidades, fechas y consultas locales; verificar sin llamadas nuevas.\n5. Importar ventanas progresivas hasta agosto2025 solo con contrato/retencion/presupuesto;\n   consolidar cobertura y conciliacion. Aislar cuentas de agencias anteriores.\n6. Habilitar busqueda operativa local y sincronizacion diaria limitada; POD despues, progresivo.\n\nLas decisiones antiguas que proponian una nueva consulta de un CODEXP historico conocido\nNO son la prueba prioritaria autorizada hoy. No se ha ejecutado ninguna ni iniciado el plan.\n\n\n## Arquitectura implementada etapa D\n\n# GLS_SENDER_INTEGRATION\n\n## Separacion de responsabilidades\n\nOperationalService coordina el caso de uso; CreateCoordinator garantiza intento\nunico, evidencia y conciliacion. IClientesAdapter resuelve identidad y serializa\ncon el contrato existente. El repositorio, diarios, documentos, centros y cuotas\nson entidades independientes del proveedor. Otro transportista podra aportar\nsu adaptador sin duplicar el modelo de expediciones.\n\nLa identidad debe corresponder a la referencia de secreto del entorno y cuenta\nseleccionados. PRODUCCION se contrasta internamente con TEST. Nunca se incluyen\ncredenciales en borradores, observaciones, respuestas web o mensajes de error.\nLa peticion real se construye solo en memoria; el intento cifrado de negocio\ncontiene XML con el secreto eliminado, no una copia del UID.\n\n## Centros remitentes\n\nsender_centers conserva codigo, etiqueta, estado, version y direccion cifrada.\ncarrier_account_senders permite varios centros y cuentas; un indice parcial\ngarantiza un solo habitual por cuenta. Edicion por revision y auditoria sin\ndirecciones. No se utiliza la tabla de destinatarios como configuracion.\n\nDesde Administracion 88 > Transportistas > Centros remitentes se configuran\nnombre, direccion, poblacion, CP, pais y datos opcionales propios. Un centro\ninactivo deja de estar disponible para borradores nuevos sin eliminar historia.\nLa seleccion del puerto 80 copia un snapshot al guardar el borrador, evitando\nvolver a introducir el remitente. Cambiar despues el centro no modifica envios\nni borradores existentes: debe guardarse y revisarse de nuevo explicitamente.\nPuede mantenerse direccion manual seleccionando esa opcion.\n\nLa fase inicial de serializacion operativa admite origen y destino Espana y\nlos servicios localmente validados. El centro es reutilizable y no contiene\nUID, codigos contractuales inventados ni destinatarios de prueba.\n\nSe ha inicializado un centro habitual con los campos exclusivos del remitente\npropio previamente confirmados y preservados en configuracion local cifrada.\nSe ha contrastado identidad de empresa, localidad, CP y pais. Asociado a TEST\ny PRODUCCION; no se han copiado campos del destinatario ni activado llamadas.\n\n## Creacion y etiquetas\n\nGrabaServicios usa la cuenta revisada y la referencia inmutable del intento.\nResultado 0 no acredita recogida. Se conserva CODEXP sin inventar una agencia\nen el numero principal; una respuesta posterior puede aportar la numeracion\ncompleta. UID de expedicion y codigo de barras son identificadores distintos\ndel UIDCLIENTE. Las etiquetas recibidas en la misma respuesta se guardan como\nactivos originales cifrados, con SHA-256, MIME, formato y tamano.\n\nNo se recuperan representaciones adicionales automaticamente ni se imprime.\nEl circuito Zebra previamente validado sigue independiente e inalterado.\n\n## Activacion futura\n\nBloqueo de release, flag operacional global, permisos de cuenta, identidad,\ncuotas y confirmacion son controles acumulativos. Las politicas del servicio\n80 aun impiden leer el almacen UID y conectarse a GLS. Su futura autorizacion\ndebe ser explicita; guardar datos o abrir una pagina nunca las modifica.\n\nUn resultado ambiguo conserva evidencia y exige conciliacion local. Si falta\nrecibo, el plan puede proponer GetExpCli por identificador/documentacion valida,\npero no lo ejecuta ni vuelve a crear la expedicion automaticamente.\n\n\n# HISTORICAL_IMPORT_STATUS\n\n## Flujo disponible en el puerto 88\n\n1. Administrador selecciona cuenta y pega texto de Extranet, no se exige CSV.\n2. Se reconocen numeros agencia-CODEXP y candidatos de barcode de 14 digitos.\n3. Otras agencias y numeros ambiguos quedan apartados, nunca se adivinan.\n4. Se deduplica el texto y se excluyen identificadores ya presentes por cuenta.\n5. Se muestra estimacion de llamadas y disponibilidad de cuota con reserva.\n6. El administrador revisa y confirma un maximo de 25 identificadores.\n7. Se guarda payload cifrado y trabajo PAUSADO, con clave idempotente.\n8. El trabajador preparado recuperara GetExpCli por conocido cuando exista\n   autorizacion posterior, nunca al abrir la pagina o guardar el lote.\n9. Se persisten identificadores, partes, acontecimientos, COD y metadatos\n   disponibles, con deduplicacion y trazabilidad a evidencia cifrada.\n10. El informe por lote muestra completos, pendientes, fallidos y ambiguos.\n\nEl texto original pegado no se guarda. El mes opcional se valida desde agosto\nde 2025; es procedencia administrativa, no prueba de cobertura ni filtro API.\nRecuperacion prevista: mes reciente a antiguo, lotes pequenos y revision\nhumana entre ellos. No se ha ejecutado campana ni lote productivo en esta etapa.\n\n## Reanudacion y errores\n\nLease exclusivo, prioridad y checkpoints por elemento. Cada elemento tiene un\nUUID de ejecucion y una respuesta cifrada duradera antes de normalizar.\nDespacho sin respuesta: ambiguo, no se repite automaticamente. Respuesta\npreservada con fallo local: replay sin otra llamada. Recibos y reservas impiden\nduplicar consumo durante replay. Pausa durante una llamada conserva primero\nsu respuesta y se detiene antes del siguiente elemento.\n\nUn corte por maximo de elementos deja el lote pausado sin consumir el limite\nde reintentos por fallo. Reanudar no vuelve a consultar elementos completos,\nfallidos o ambiguos; estos requieren revision y una accion posterior explicita.\nLa ausencia de datos no significa anulacion ni borra historico conocido.\n\n## Alcance del mapeo\n\nContrato: ES-GLS-WS_GetExp_GetExpCli.docx.pdf y ejemplo XML oficial conservado.\nIdentificador preferente para conocidas: barcode, numero completo o CODEXP.\nLa respuesta debe corresponder inequívocamente al identificador solicitado.\nMultiples expediciones o identidades conflictivas requieren revision manual.\n\nSe conservan fechas raw si no pueden interpretarse; las fechas locales sin\noffset se interpretan Europe/Madrid segun el contrato existente sin TipoUTC.\nEstado administrativo 5 no se confunde con borrado=S; 90 no significa entrega.\nUn evento SOLUCION no elimina indiscriminadamente todas las incidencias.\nLos enlaces de digitalizaciones no se siguen y no se descarga POD.\n\n## Limitaciones pendientes\n\nGetEnvios no tiene aun contrato de enumeracion suficientemente acreditado.\nEste importador NO descubre todas las expediciones por fechas ni demuestra\nrecuperacion de las 61 expediciones del intervalo historico. Solo recupera\nidentificadores revisados de nuestra cuenta. Los periodos, cobertura temporal,\nPOD, cuentas anteriores y limites oficiales iClientes requieren pruebas o\ndocumentacion adicional. Nunca se presenta cobertura parcial como completa.\n"}