Saltar a contenido

Arquitectura y límites

El sistema conecta Business Central cloud con una API ASP.NET Core 8, PostgreSQL y almacenamiento local persistente. La tablet es una PWA React/TypeScript. Los objetos AL incorporados a tu extensión coordinan la firma con certificados dentro de BC.

Componentes y responsabilidades

Componente Responsabilidad
Business Central Generar PDFs, gestionar solicitudes y archivar resultados; custodiar/usar certificados PAdES
API Autenticar, validar entrada, gestionar estados, almacenar documentos y ensamblar PAdES
PostgreSQL / EF Core Dispositivos, solicitudes manuscritas/PAdES y auditoría
Storage PDFs originales, preparados y firmados
Tablet Activarse, recuperar PDF, capturar tinta y generar/subir el PDF final
Worker OCR Reconocer imágenes en segundo plano con una cola en memoria
Coolify Desplegar recursos y publicar API/tablet por HTTPS

Firma manuscrita

BC crea una solicitud dirigida a deviceId. La tablet consulta primero active para reanudar y después next para reservar un pendiente. En operación normal se atiende el más antiguo de esa cola.

Al primer trazo se solicita start-signing. La PWA incrusta imágenes de tinta con pdf-lib y sube signedPdfBase64. El backend publica el archivo antes de confirmar signed. BC consulta y descarga el resultado; no hay callback.

La reserva displayed dura 30 segundos inicialmente. El mantenimiento la libera si no se inició firma. Una sesión de tablet se guarda en localStorage; recuperar el documento tras recarga no recupera los trazos aún no enviados.

Extracción

La extracción embebida responde en la misma llamada con texto plano. OCR es explícito y asíncrono, con consulta de estado. Solo OCR usa una cola de trabajos en memoria; las solicitudes de firma se persisten en PostgreSQL.

Firma con certificado

FirmarPdf resuelve en BC empresa + usuario + alias hacia un certificado estándar. La API recibe el PDF y DER público, devuelve atributos CMS para firmar y verifica la firma RSA enviada por BC. Finalmente ensambla el PDF PAdES.

Original/preparado son inmutables; un lease de completado y actualizaciones condicionales evitan publicaciones PAdES simultáneas. Los hashes detectan modificación o pérdida del resultado. Consulta Protocolo PAdES.

Topología

API y tablet tienen dominios HTTPS separados. El proxy termina TLS y conecta con el puerto HTTP interno 8080. PostgreSQL es privado. Su volumen y /app/storage necesitan backups coordinados.

La imagen de documentación se construye y despliega por separado. El código AL se incorpora a tu extensión, que se compila y publica en el tenant con su versión propia; esa versión no se corresponde automáticamente con tags Docker.

Límites de la implementación

  • Un documento activo por tablet es un requisito. La PWA consulta active antes de next y opera un documento cada vez. La API protege la reserva de cada solicitud con una actualización condicional, pero next no comprueba otro activo del dispositivo ni existe un índice único que lo impida. Llamadas directas repetidas/concurrentes pueden reservar solicitudes distintas para la misma tablet.
  • Caducidad: manuscritas en signing no expiran automáticamente. Para liberar un proceso abandonado hay que cancelarlo. Si falta el original, active puede llevar también una solicitud en signing a error.
  • Retención: resultAvailable manuscrito refleja estado y ruta registrados, sin comprobar el archivo. PAdES registra explícitamente la purga y verifica hashes al descargar.
  • Conectividad: el documento puede recuperarse tras recarga, pero la tinta local se pierde. No hay modo offline completo ni garantía de despertar una pantalla Android apagada.
  • Aislamiento BC: el bearer actual identifica una integración del entorno. El backend no separa tenants/empresas BC; la autorización del alias por persona se realiza en AL.
  • Certificados: RSA ≥2048, SHA-256/PKCS#1 v1.5, PAdES B-B sin TSA, confianza ni OCSP/CRL. No admite PDF cifrado ni firmas incrementales previas.
  • OCR: jobs no duraderos; reinicios y retención en memoria pueden hacer desaparecer el trabajo.
  • Perímetro: CORS conserva orígenes adicionales del código y las cabeceras proxy se aceptan sin lista de confianza; controla el acceso de red al contenedor. Detalle en Seguridad.

Estas limitaciones describen el código actual y no cambian el contrato. Las validaciones pendientes se mantienen en TASKS.md.