Página /architecture: 4 tabs interactivos con diagramas Mermaid renderizados
Componente MermaidDiagram.tsx: Renderizado de diagramas con soporte dark mode
Dependencia mermaid@11.12.2: Visualización de flujos y arquitectura
🛠 Infraestructura
Limpieza de logs de desarrollo en producción
Tipos de identidad en src/types/identity.types.ts
Extensión global de Wallet local (navegador)
2. Visión General del Sistema
2.1 Propósito
PROCUREDATA es una plataforma de soberanía de datos diseñada para facilitar el intercambio seguro y trazable de información empresarial entre organizaciones de la cadena de suministro. No almacena datos; gestiona acuerdos soberanos entre quienes tienen los datos y quienes los necesitan.
La plataforma implementa los principios del ecosistema Gaia-X y el estándar IDSA (International Data Spaces Association) para garantizar:
Soberanía de Datos: Los propietarios de los datos mantienen control total sobre quién accede a su información y bajo qué condiciones.
Trazabilidad Inmutable: Cada acceso y transacción queda registrado en el registro de evidencias firmado, creando un historial auditable.
Interoperabilidad: Compatibilidad con sistemas ERP existentes (SAP, Oracle, Salesforce) mediante conectores estandarizados.
Cumplimiento Normativo: Diseñado para satisfacer requisitos GDPR, CSRD, y regulaciones sectoriales.
2.2 Modelo Tripartito de Roles
PROCUREDATA implementa un modelo de tres roles fundamentales basado en el estándar IDSA:
Rol
Responsabilidad
Ejemplo en Cadena de Suministro
Data Consumer
Solicita acceso a datos para un propósito específico
Empresa compradora que necesita validar proveedores
Data Subject (Provider)
Propietario original de los datos, decide sobre su uso
Proveedor cuyos datos fiscales se solicitan
Data Holder
Custodio técnico que almacena y entrega los datos
Agencia tributaria, cámara de comercio, certificadora
2.3 Arquitectura: API de negocio + conectores EDC
PROCUREDATA utiliza una arquitectura híbrida que combina:
Capa Web2 (Cloud AI/PostgreSQL): Almacenamiento tradicional para datos de usuario.s, lógica de negocio, y APIs RESTful.
Capa de confianza (EDC, DIDs y registro de evidencias): Registro de evidencias firmado de las transacciones, verificación de identidad (DID) y facturación tradicional (EUROe en estudio).
PROCUREDATA implementa Identificadores Descentralizados (DIDs) siguiendo el estándar W3C DID Core 1.0, específicamente el método did:ethr para generar la wallet de la organización (did:ethr).
Generación de DID
El servicio edcConnectorService genera DIDs automáticamente al conectar una wallet:
El catálogo de PROCUREDATA implementa la especificación DCAT (Data Catalog Vocabulary) adaptada para espacios de datos industriales.
Vista Materializada: marketplace_listings
sql
CREATE VIEW marketplace_listings AS
SELECT
da.id AS asset_id,
dp.id AS product_id,
dp.name AS product_name,
dp.description AS product_description,
dp.category,
dp.version,
da.price,
da.currency,
da.pricing_model,
da.billing_period,
o.id AS provider_id,
o.name AS provider_name,
o.kyb_verified,
o.seller_category,
esg.energy_renewable_percent,
-- Badges calculados
(esg.energy_renewable_percent >= 80) AS has_green_badge,
-- Métricas de reputación
(SELECT AVG(rating) FROM organization_reviews WHERE target_org_id = o.id) AS reputation_score,
(SELECT COUNT(*) FROM organization_reviews WHERE target_org_id = o.id) AS review_count
FROM data_assets da
JOIN data_products dp ON da.product_id = dp.id
JOIN organizations o ON da.subject_org_id = o.id
LEFT JOIN esg_reports esg ON o.id = esg.organization_id
WHERE da.is_public_marketplace = true AND da.status = 'active';
Funcionalidades del Catálogo
Funcionalidad
Implementación
Vista Grid/Lista
Toggle con estado local
Filtro por categoría
Dropdown con enum de categorías
Filtro por precio
Slider con rango min/max
Badges ESG
has_green_badge de la vista
Badge KYB
kyb_verified de organizations
Comparación
Checkbox multi-selección
Wishlist
Tabla user_wishlist
4.4 Contratos de Uso (Usage Policies - ODRL)
PROCUREDATA genera políticas de uso siguiendo el estándar ODRL (Open Digital Rights Language) almacenadas en la tabla data_policies.
Gestión completa de sesión: acceso con Keycloak, visualización de perfil (DID, credenciales verificables), dropdown con acciones. Usa useOrgWallet hook.
v3.0
ConnectorStatusWidget
src/components/IdentityStatusWidget.tsx
Widget de dashboard que muestra estado de wallet, balances, y DID verificado. Tres estados: sin wallet detectada, no conectada, conectada.
v3.1
RevokeAccessButton
src/components/RevokeAccessButton.tsx
Kill-switch para revocación de acceso a recursos. AlertDialog de confirmación con advertencia de irreversibilidad. Llama a edcService.revokeAccess().
v3.0
Estados del IdentityStatusWidget
Sin identidad descentralizada: Muestra botón para importar la wallet en MetaMask
No conectado: Muestra botón "Conectar Wallet"
Conectado: Muestra:
EUROe (en estudio)
Identidad did:ethr
DID truncado con botón copiar
Link a /evidencias
5.2 Componentes Feature/Audit
Componente
Archivo
Responsabilidad Técnica
DataLineageEvidence
src/components/DataLineageEvidence.tsx
Timeline visual de eventos de trazabilidad. Muestra hashes del registro de evidencias, timestamps, actores. Botón para copiar hash y link a la verificación pública en /evidencias.
DataLineage
src/components/DataLineage.tsx
Visualización de lineage de datos desde PostgreSQL. Complementa el registro de evidencias con la trazabilidad firmada de cada intercambio.
SmartContractViewer
src/components/SmartContractViewer.tsx
Visor de acuerdos de contrato EDC y su política ODRL. Permite inspeccionar permisos y obligaciones.
5.3 Componentes Feature/Commerce
Componente
Archivo
Responsabilidad Técnica
Facturación
src/components/PaymentGateway.tsx
Pasarela de pagos con 3 tabs: Tarjeta (Stripe), Wallet (EUROe, en estudio), Transferencia. Integración con edcConnectorService para pagos crypto.
OrderSummary
src/components/OrderSummary.tsx
Resumen de pedido con desglose de precios, impuestos, y total. Soporta múltiples monedas.
5.4 Componentes Core/UX
Componente
Archivo
Responsabilidad Técnica
Versión
NotificationsBell
src/components/NotificationsBell.tsx
Consumidor de notificaciones en tiempo real de la API. Muestra contador de no leídas, dropdown con lista, mark as read.
v3.0
ActivityFeed
src/components/ActivityFeed.tsx
Feed de actividad con suscripción Realtime a approval_history. Invalidación automática de queries. Cleanup correcto con removeChannel().
v3.1
EmptyState
src/components/EmptyState.tsx
Estados vacíos consistentes con iconos y acciones. Reutilizable en múltiples páginas.
v3.1
DemoBanner
src/components/DemoBanner.tsx
Aviso para cuentas pendientes de aprobación, con los siguientes pasos.
v3.0
DemoTour
src/components/DemoTour.tsx
Tour guiado con React Joyride. Steps configurables por página.
v3.0
CommandMenu
src/components/CommandMenu.tsx
Paleta de comandos estilo Spotlight/Alfred. Navegación rápida y acciones.
v3.0
5.5 Componentes UI/Layout
Componente
Archivo
Responsabilidad Técnica
AppLayout
src/components/AppLayout.tsx
Layout principal con Sidebar, Header, y área de contenido. Gestiona responsive.
AppSidebar
src/components/AppSidebar.tsx
Navegación lateral con secciones colapsables. Integra OrganizationSwitcher.
DynamicBreadcrumbs
src/components/DynamicBreadcrumbs.tsx
Migas de pan generadas dinámicamente desde la ruta actual.
ThemeToggle
src/components/ThemeToggle.tsx
Switch de tema claro/oscuro con persistencia en localStorage.
ProtectedRoute
src/components/ProtectedRoute.tsx
HOC que verifica autenticación y redirige a /auth si no hay sesión.
MermaidDiagram
src/components/MermaidDiagram.tsx
Renderizado de diagramas Mermaid con soporte dark mode. NUEVO v3.1
5.6 Componentes Feature/Data
Componente
Archivo
Responsabilidad Técnica
ESGDataView
src/components/ESGDataView.tsx
Visualización de datos ESG: emisiones scope 1/2, mix energético, certificaciones. Gráficos con Recharts.
IoTDataView
src/components/IoTDataView.tsx
Renderizado de datos de telemetría IoT. Series temporales y alertas.
ArrayDataView
src/components/ArrayDataView.tsx
Vista genérica para arrays de datos. Tabla paginada con sorting.
GenericJSONView
src/components/GenericJSONView.tsx
Visor de JSON con syntax highlighting y collapse/expand.
5.7 Componentes Feature/Collaboration
Componente
Archivo
Responsabilidad Técnica
NegotiationChat
src/components/NegotiationChat.tsx
Chat embebido para negociación de contratos. Mensajes almacenados en transaction_messages.
TeamManagement
src/components/TeamManagement.tsx
Gestión de miembros del equipo y roles. CRUD sobre user_roles.
AIConcierge
src/components/AIConcierge.tsx
Asistente virtual con IA para guiar usuarios. Integración con Cloud AI Gateway.
PROCUREDATA implementa un sistema de roles basado en la tabla user_roles con aislamiento por organización en la API.
Enum de Roles
sql
CREATE TYPE public.app_role AS ENUM (
'admin', -- Control total de la organización
'approver', -- Puede aprobar/rechazar transacciones
'viewer', -- Solo lectura
'api_configurator' -- Gestión de integraciones ERP
);
Tabla user_roles
sql
CREATE TABLE public.user_roles (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE,
organization_id UUID REFERENCES organizations(id),
role app_role NOT NULL,
created_at TIMESTAMPTZ DEFAULT now(),
UNIQUE (user_id, organization_id, role)
);
Función de Verificación
sql
CREATE FUNCTION public.has_role(_user_id UUID, _organization_id UUID, _role app_role)
RETURNS BOOLEAN
LANGUAGE SQL STABLE SECURITY DEFINER
SET search_path = public
AS $$
SELECT EXISTS (
SELECT 1 FROM public.user_roles
WHERE user_id = _user_id
AND organization_id = _organization_id
AND role = _role
)
$$;
8.2 Roles por Tipo de Organización
Tipo de Org
Rol Típico
Permisos Principales
Consumer
viewer, approver
Ver catálogo, crear solicitudes, aprobar pagos
Provider (Subject)
admin, approver
Gestionar activos, aprobar/rechazar solicitudes
Data Holder
admin, api_configurator
Custodia de datos, configurar ERPs, segunda aprobación
8.3 Flujos por Rol
Data Consumer
Data Provider (Subject)
Data Holder
9. Modelo de Gobernanza Técnica
9.1 Políticas de Acceso
Flujo de Aprobación Multi-Etapa
Estados de Transacción
sql
CREATE TYPE public.transaction_status AS ENUM (
'initiated', -- Solicitud creada
'pending_subject', -- Esperando aprobación del propietario
'pending_holder', -- Esperando aprobación del custodio
'approved', -- Aprobada por todos
'denied_subject', -- Rechazada por propietario
'denied_holder', -- Rechazada por custodio
'completed', -- Datos entregados
'cancelled' -- Cancelada por solicitante
);
PROCUREDATA implementa un modelo de autenticación dual que combina:
Keycloak (cuentas propias)
typescript
// src/hooks/useAuth.tsx
const signIn = async (email: string, password: string) => {
const { data, error } = await supabase.auth.signInWithPassword({
email,
password,
});
if (error) throw error;
return data;
};
// JWT almacenado en localStorage por API ProcureData SDK
// Refresh automático antes de expiración
Cuenta Keycloak (OIDC)
typescript
// src/services/pontusX.ts
async signMessage(message: string): Promise<string> {
if (!this.signer) throw new Error('Wallet not connected');
// Sign-In With Ethereum (SIWE) message
const siweMessage = `
PROCUREDATA Authentication
I authorize this application to access my wallet.
Nonce: ${Date.now()}
Message: ${message}
`;
return await this.signer.signMessage(siweMessage);
}
Validación Zod (Auth.tsx) - NUEVO v3.1
typescript
const authSchema = z.object({
email: z
.string()
.trim()
.min(1, "El email es obligatorio")
.email("Introduce un email válido")
.max(255, "Email demasiado largo"),
password: z
.string()
.min(6, "La contraseña debe tener al menos 6 caracteres")
.max(72, "Contraseña demasiado larga"),
});
10.2 Aislamiento por organización
Políticas Implementadas
sql
-- Ejemplo: Transacciones visibles solo para organizaciones involucradas
CREATE POLICY "Users can view transactions of their organization"
ON public.data_transactions
FOR SELECT
USING (
consumer_org_id = public.get_user_organization(auth.uid())
OR subject_org_id = public.get_user_organization(auth.uid())
OR holder_org_id = public.get_user_organization(auth.uid())
);
-- Ejemplo: Solo admins pueden modificar configuraciones
CREATE POLICY "Only admins can update organization settings"
ON public.organizations
FOR UPDATE
USING (
public.has_role(auth.uid(), id, 'admin')
);
Funciones Security Definer
sql
CREATE FUNCTION public.get_user_organization(_user_id UUID)
RETURNS UUID
LANGUAGE SQL STABLE SECURITY DEFINER
SET search_path = public
AS $$
SELECT organization_id
FROM public.user_profiles
WHERE user_id = _user_id
LIMIT 1
$$;
10.3 Trazabilidad End-to-End
10.4 Audit Logs
sql
CREATE TABLE public.audit_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
organization_id UUID REFERENCES organizations(id),
actor_id UUID,
actor_email TEXT,
action TEXT NOT NULL, -- 'create' | 'update' | 'delete' | 'access'
resource TEXT, -- 'transaction' | 'asset' | 'organization'
details JSONB, -- Payload completo del evento
ip_address TEXT,
created_at TIMESTAMPTZ DEFAULT now()
);
-- RLS: Solo admins pueden ver logs de su organización
ALTER TABLE audit_logs ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Admins can view audit logs"
ON audit_logs FOR SELECT
USING (public.has_role(auth.uid(), organization_id, 'admin'));
11. Casos de Uso Principales
11.1 Caso 1: Onboarding con identidad descentralizada
Objetivo: Usuario conecta su wallet y obtiene identidad verificable.
11.2 Caso 2: Intercambio de Datos con Facturación
Objetivo: Consumer adquiere acceso a datos con un acuerdo de contrato EDC y facturación tradicional.
11.3 Caso 3: Auditoría Forense
Objetivo: Verificar la integridad de un acceso a datos mediante el registro de evidencias.
Verificación de integridad:
typescript
// Componente DataLineageRegistro de evidencias
const verifyIntegrity = (event: LineageEvent) => {
// 1. Hash registrado en API ProcureData
const storedHash = event.metadata.tx_hash;
// 2. Hash verificable en registro de evidencias
const explorerUrl = `${PONTUSX_NETWORK_CONFIG.blockExplorerUrls[0]}tx/${storedHash}`;
// 3. Si el hash existe en el explorer, el evento es inmutable
return {
isVerified: true,
explorerUrl,
blockNumber: event.metadata.block_number,
timestamp: event.metadata.confirmed_at,
};
};
const authSchema = z.object({
email: z
.string()
.trim()
.min(1, "El email es obligatorio")
.email("Introduce un email válido")
.max(255, "Email demasiado largo"),
password: z
.string()
.min(6, "La contraseña debe tener al menos 6 caracteres")
.max(72, "Contraseña demasiado larga"),
});
// Uso con React Hook Form
const form = useForm({
resolver: zodResolver(authSchema),
});
id, asset_id, consumer_org_id, subject_org_id, holder_org_id, status
Transacciones
approval_history
transaction_id, actor_org_id, action, notes
Historial de aprobaciones (Realtime)
data_policies
transaction_id, odrl_policy_json
Contratos ODRL
data_payloads
transaction_id, schema_type, data_content
Contenido de datos
transaction_messages
transaction_id, sender_org_id, content
Chat de negociación
Finanzas
Tabla
Columnas Clave
Descripción
wallets
organization_id, balance, currency, address
Billeteras
access_logs
from_wallet_id, to_wallet_id, amount, type
Movimientos
Sistema y Seguridad
Tabla
Columnas Clave
Descripción
notifications
user_id, type, title, message, is_read
Sistema Realtime
login_attempts
email, ip_address, success, attempted_at
Rate Limiting
audit_logs
actor_id, action, resource, details
Trazabilidad
export_logs
transaction_id, format, exported_by
Auditoría exportaciones
Otros
Tabla
Descripción
esg_reports
Reportes de sostenibilidad
marketplace_opportunities
Demandas de datos
erp_configurations
Integraciones ERP
supplier_data
Datos estructurados de proveedores
value_services
Servicios adicionales
organization_reviews
Reseñas entre organizaciones
success_stories
Casos de éxito
innovation_lab_concepts
Conceptos del Innovation Lab
user_wishlist
Lista de deseos de usuarios
16.2 Enums del Sistema
sql
-- Tipos de organización
CREATE TYPE organization_type AS ENUM ('consumer', 'provider', 'data_holder');
-- Roles de usuario
CREATE TYPE app_role AS ENUM ('admin', 'approver', 'viewer', 'api_configurator');
-- Estados de transacción
CREATE TYPE transaction_status AS ENUM (
'initiated', 'pending_subject', 'pending_holder',
'approved', 'denied_subject', 'denied_holder',
'completed', 'cancelled'
);
-- Acciones de aprobación
CREATE TYPE approval_action AS ENUM ('pre_approve', 'approve', 'deny', 'cancel');
-- Tipos de configuración ERP
CREATE TYPE erp_config_type AS ENUM ('download', 'upload');
-- Métodos de autenticación ERP
CREATE TYPE auth_method AS ENUM ('bearer', 'api_key', 'oauth', 'basic');
Esta sección documenta los 10 casos de uso industriales principales que demuestran el valor práctico de PROCUREDATA en la cadena de suministro.
11.1 Onboarding KYB (Know Your Business)
Aspecto
Detalle
Actor
Proveedor Nuevo
El Problema
Las empresas pierden meses verificando la identidad de nuevos proveedores mediante procesos manuales, con riesgo de fraude por suplantación de identidad corporativa.
La Solución PROCUREDATA
El proveedor genera la wallet de su organización en el navegador, que crea automáticamente un DID (did:ethr:0x7ecc:...) y la plataforma valida su credencial verificable (MembershipCredential) con DCP.
Flujo Técnico
Wallet Generation → DID (did:ethr) → Gaia-X Compliance Lookup → Credential Verification → Profile Created
Valor
Elimina el fraude de suplantación de identidad, reduce el onboarding de semanas a minutos.
11.2 Intercambio de Huella de Carbono (Scope 3)
Aspecto
Detalle
Actor
Manufacturera (Consumer) y Proveedores (Providers)
El Problema
Las empresas no pueden cumplir con reportes CSRD/ESG porque dependen de datos de emisiones de sus proveedores que son difíciles de verificar, abriendo la puerta al "Greenwashing".
La Solución PROCUREDATA
La manufacturera solicita datos de emisiones. Los proveedores suben su reporte ESG, se registra su hash en el registro de evidencias y se comparte el acceso con políticas ODRL.
Flujo Técnico
Consumer Request → Subject Approval → ESG Data Upload → Hash Notarization in ProcureData Evidence Log → Controlled Data Access
Valor
Auditoría inmutable para reportes CSRD/ESG, eliminando el Greenwashing.
11.3 Compraventa de Datos con facturación (Marketplace)
Aspecto
Detalle
Actor
Data Broker
El Problema
Los pagos transfronterizos por datos tienen fricción bancaria, tiempos de liquidación de días, y altas comisiones.
La Solución PROCUREDATA
El broker publica un dataset de "Tendencias de Mercado" en el catálogo. Un comprador lo contrata con facturación tradicional. El acuerdo de contrato EDC libera el acceso automáticamente cuando el custodio confirma el cobro.
Flujo Técnico
Asset Published → Invoice Payment → Contract Agreement (ODRL) → Data Transfer (DSP) → Data Download
Valor
Liquidación instantánea, sin fricción bancaria internacional, comisiones mínimas.
11.4 Revocación de Emergencia (Kill-Switch)
Aspecto
Detalle
Actor
Director de Seguridad
El Problema
Cuando se detecta una brecha en un socio comercial, los datos ya compartidos siguen siendo accesibles durante días mientras se tramita la revocación manual.
La Solución PROCUREDATA
El Director usa el componente RevokeAccessButton para ejecutar una revocación instantánea. El conector EDC termina el acuerdo de contrato y bloquea nuevas transferencias en tiempo real.
Soberanía real sobre los datos, mitigación de daños inmediata ante brechas de seguridad.
11.5 Pasaporte Digital de Producto (DPP)
Aspecto
Detalle
Actor
Marca de Ropa
El Problema
La normativa UE exige trazabilidad completa de productos, pero agregar datos de múltiples proveedores (tela, tinte, confección) es complejo y propenso a errores.
La Solución PROCUREDATA
La marca crea un activo digital agregando datos de 5 proveedores en un solo "Pasaporte Digital". Cada contribución queda registrada con su DID y timestamp.
Flujo Técnico
Create DPP Asset → Invite Suppliers → Each Supplier Signs Data → Aggregate to Single Asset → Publish DPP → Consumer QR Scan
Valor
Cumplimiento con normativa UE, transparencia total para el consumidor final.
11.6 Entrenamiento de IA Privado (Compute-to-Data)
Aspecto
Detalle
Actor
Startup de IA y Hospital/Farmacéutica
El Problema
Los hospitales no pueden monetizar sus datos porque compartir datos de pacientes viola GDPR y regulaciones de privacidad médica.
La Solución PROCUREDATA
La IA "viaja" a los datos del hospital mediante Compute-to-Data. El modelo se entrena en un sandbox aislado sin que los datos salgan nunca de la infraestructura del hospital.
Flujo Técnico
AI Model Upload → Sandbox Provisioning → Secure Execution Environment → Training on Local Data → Model Results Export (no raw data)
Valor
Monetización de datos sensibles sin perder privacidad, cumplimiento GDPR.
11.7 Gestión de Recalls (Retirada de Productos)
Aspecto
Detalle
Actor
Fabricante de Automóviles
El Problema
Identificar qué lotes de piezas defectuosas se instalaron en qué vehículos puede tomar semanas con sistemas tradicionales, poniendo vidas en riesgo.
La Solución PROCUREDATA
El fabricante usa el componente DataLineage para rastrear en segundos la procedencia del lote defectuoso y en qué coches se instaló cada pieza.
Flujo Técnico
Defect Detection → DataLineage Query → Evidence Log Trace → Supplier Lot Identification → Affected Vehicle List → Recall Initiation
Valor
Respuesta rápida ante crisis de calidad, salvando vidas y reduciendo costos de recall.
11.8 Financiación de Cadena de Suministro (DeFi)
Aspecto
Detalle
Actor
Pequeño Agricultor
El Problema
Los pequeños productores no pueden acceder a crédito porque los bancos solo evalúan balances financieros, no el historial de cumplimiento de entregas.
La Solución PROCUREDATA
El agricultor comparte su historial de entregas exitosas (verificado en el registro de evidencias) con un banco o entidad financiera para obtener un crédito con mejor tasa basado en su reputación verificable.
Acceso a capital basado en reputación verificable, no solo en balance financiero.
11.9 Auditoría de Cadena de Frío (IoT)
Aspecto
Detalle
Actor
Logística de Alimentos
El Problema
Las disputas sobre quién rompió la cadena de frío en un envío de alimentos son imposibles de resolver sin registros inmutables.
La Solución PROCUREDATA
Sensores IoT suben lecturas de temperatura cada hora a través de la API de negocio. Si se rompe la cadena de frío, el evento queda registrado inmutablemente con timestamp y ubicación GPS.
Resolución indiscutible de disputas sobre responsabilidad en la cadena de frío.
11.10 Negociación Dinámica de Licencias (ODRL)
Aspecto
Detalle
Actor
Centro de Investigación
El Problema
Las licencias de datos tradicionales son "todo o nada" - no permiten restricciones temporales, geográficas o de uso específico sin contratos complejos.
La Solución PROCUREDATA
El investigador usa el componente NegotiationChat para negociar un contrato específico: "Acceso solo por 30 días, solo para uso académico, solo en UE". La política ODRL se genera automáticamente.
Flexibilidad contractual automatizada que va más allá del modelo "comprar para siempre".
14. Sistema de Registro y Onboarding (v3.2)
14.1 Flujo de Registro de Nuevos Usuarios
14.2 Tabla registration_requests
sql
CREATE TABLE public.registration_requests (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
legal_name TEXT NOT NULL,
tax_id TEXT NOT NULL,
sector TEXT NOT NULL,
size TEXT NOT NULL,
country TEXT NOT NULL,
address TEXT NOT NULL,
role TEXT NOT NULL, -- 'buyer' | 'supplier'
-- Representante legal
representative_name TEXT NOT NULL,
representative_email TEXT NOT NULL,
representative_phone TEXT,
representative_position TEXT,
-- Intenciones de uso
intention_data_types TEXT[],
intention_has_erp TEXT,
erp_type TEXT,
product_category TEXT,
-- Aceptación legal
accepted_terms BOOLEAN DEFAULT false,
accepted_gdpr BOOLEAN DEFAULT false,
accepted_conduct BOOLEAN DEFAULT false,
-- Estado del registro
status registration_status DEFAULT 'pending',
created_organization_id UUID REFERENCES organizations(id),
reviewed_by TEXT,
reviewed_at TIMESTAMPTZ,
reviewer_notes TEXT,
-- Auditoría
ip_address TEXT,
user_agent TEXT,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- Enum de estados
CREATE TYPE registration_status AS ENUM (
'pending', -- Recién enviado
'under_review', -- En revisión por admin
'approved', -- Aprobado, organización creada
'rejected', -- Rechazado
'needs_info' -- Requiere información adicional
);
id, asset_id, consumer_org_id, subject_org_id, holder_org_id, status
Transacciones
approval_history
transaction_id, actor_org_id, action, notes
Historial de aprobaciones (Realtime)
data_policies
transaction_id, odrl_policy_json
Contratos ODRL
data_payloads
transaction_id, schema_type, data_content
Contenido de datos
transaction_messages
transaction_id, sender_org_id, content
Chat de negociación
Finanzas
Tabla
Columnas Clave
Descripción
wallets
organization_id, balance, currency, address
Billeteras
access_logs
from_wallet_id, to_wallet_id, amount, type
Movimientos
Sistema y Seguridad
Tabla
Columnas Clave
Descripción
notifications
user_id, type, title, message, is_read
Sistema Realtime
login_attempts
email, ip_address, success, attempted_at
Rate Limiting
audit_logs
actor_id, action, resource, details
Trazabilidad
export_logs
transaction_id, format, exported_by
Auditoría exportaciones
Otros
Tabla
Descripción
esg_reports
Reportes de sostenibilidad
marketplace_opportunities
Demandas de datos
erp_configurations
Integraciones ERP
supplier_data
Datos estructurados de proveedores
value_services
Servicios adicionales
organization_reviews
Reseñas entre organizaciones
success_stories
Casos de éxito
innovation_lab_concepts
Conceptos del Innovation Lab
user_wishlist
Lista de deseos de usuarios
ai_feedback
Feedback para entrenamiento de ARIA
17.2 Enums del Sistema
sql
-- Tipos de organización
CREATE TYPE organization_type AS ENUM ('consumer', 'provider', 'data_holder');
-- Roles de usuario
CREATE TYPE app_role AS ENUM ('admin', 'approver', 'viewer', 'api_configurator');
-- Estados de transacción
CREATE TYPE transaction_status AS ENUM (
'initiated', 'pending_subject', 'pending_holder',
'approved', 'denied_subject', 'denied_holder',
'completed', 'cancelled'
);
-- Acciones de aprobación
CREATE TYPE approval_action AS ENUM ('pre_approve', 'approve', 'deny', 'cancel');
-- Estados de registro (NUEVO v3.2)
CREATE TYPE registration_status AS ENUM (
'pending', 'under_review', 'approved', 'rejected', 'needs_info'
);
-- Tipos de configuración ERP
CREATE TYPE erp_config_type AS ENUM ('download', 'upload');
-- Métodos de autenticación ERP
CREATE TYPE auth_method AS ENUM ('bearer', 'api_key', 'oauth', 'basic');
Sistema de registro multi-paso, emails de bienvenida diferenciados (Buyer/Supplier), acceso según el estado de la cuenta (pendiente/activa), 2 nuevos endpoints de la API, traducciones en 7 idiomas, documentación actualizada