Convierte el repositorio de Anexo76 en una plantilla limpia y reutilizable
para nuevos proyectos del ecosistema Workspace de Aduanasoft.
Cambios principales:
- Elimina módulos específicos de Anexo76: a76, a24, sitar, public
- Agrega módulo example/ con patrón CRUD de referencia (models/dto/service/routes)
- Limpia migraciones Alembic: solo quedan las 6 de core (users, tenants, permissions)
- Reemplaza todas las rutas del dashboard con stubs genéricos
- Elimina lógica de negocio aduanera: shortcuts, CSV imports, permisos, catálogos
- Simplifica variables de entorno: una sola WORKSPACE_URL deriva Hub y Keycloak
- Agrega scripts/auth-mode.sh para alternar entre auth local y workspace
- Configura docker-compose con nombres genéricos (app-*)
- Corrige flujo SSO: elimina system-gate SCAF/SCAII que bloqueaba el login
- Modo DEV_LOCAL_AUTH para desarrollo sin Keycloak ni Hub
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Reemplaza <input type="date"> por componente DateInputDMY que siempre
muestra DD/MM/YYYY sin depender del locale del navegador. El picker
nativo sigue funcionando vía input oculto. Se elimina el texto
auxiliar "Se guarda como entero (YYYYMMDD)".
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Dialog.Portal intenta instanciar clases del DOM durante SSR causando
'Class constructors cannot be invoked without new' en GET /dashboard.
El diálogo es puramente client-side, no necesita renderizado en servidor.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
No hay opción en el modal que lo llame. Solo existen las 8 interfaces
del select y los 4 regímenes de importación XML_RB_SYSTEMS.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Todos los métodos del archivo usaban fetch() directo con localStorage,
bypaseando el silent refresh automático. Ahora todos usan api.post()/api.get()
de $lib/api para manejo uniforme de 401 → refresh → retry en toda la interfaz.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Los 4 métodos XML RB Systems usaban fetch() con localStorage, bypaseando
el fetchApi() de $lib/api que tiene 401 → silent refresh → retry automático.
Ahora el token expirado se renueva de forma transparente sin interrumpir al usuario.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Detecta respuestas 401 en los 4 métodos XML RB Systems (impo-temp, impo-def,
impo, expo) y lanza un mensaje claro en lugar del error genérico de generación.
Además elimina entry_port/exit_port del tipo de request de exportación.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Para exportación los puertos vienen del manifiesto en BD (entry_port/foreign_exit_port),
no del request. El selector de puertos ahora solo aparece cuando movementType === 'Importacion'.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Títulos y subtítulos de goods, pedimentos, customs_brokers, users, admin/roles, settings, account, reports
- Componente Maintenance (cubre 6 páginas de export)
- Corrección de imports de m faltantes en fixed-asset-classes y tariff-fractions/american
- Nuevas claves common (botones, subtítulos, títulos de página)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Elimina la dependencia de HUB_ADMIN_EMAIL/HUB_ADMIN_PASSWORD del flujo
de invitaciones. Ahora se usa el Bearer token del usuario autenticado,
que debe tener role='admin' en su tenant dentro del Hub.
Esto hace el flujo compatible con instalaciones self-hosted donde el
cliente no debe tener acceso a credenciales del Workspace Hub.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Antes los fallos del Hub login y invite creation eran silenciosos o con
warning genérico. Ahora loguea status code, body y nombre de campo para
facilitar diagnóstico en producción.
- Detecta HUB_ADMIN_EMAIL/PASSWORD vacíos con error explícito
- Loguea status+body cuando login falla (401/403)
- Loguea status+body+tenant/email cuando invite falla (404/403)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>