# Arquitectura — ClickDelivery V0.6.1

## Capas

**APK/PWA** → **HTTP API Node** → **PostgreSQL/PostGIS**

Servicios laterales desacoplados:
- `private-storage.js`: binarios privados de evidencia.
- `realtime.js`: PostgreSQL `LISTEN/NOTIFY` → SSE.
- `notifications.js`: inbox + `push_outbox` + gateway.
- `integrations.js`: frontera futura de integración LM Networks; no forma parte del flujo crítico actual.
- `mobile.js`: bootstrap, contratos APK y mapa operativo.
- `logistics.js`: ranking, geocercas, tracking, PIN y pruebas de entrega.

## Multiempresa

`organization_id` sigue siendo la frontera de tenant. PostgreSQL RLS se aplica en las tablas operativas, incluidas las nuevas tablas de storage, notificaciones e integraciones.

## Transacciones

Los cambios de viaje, cargo y ledger son atómicos. Push y pagos externos usan patrón outbox para que una caída externa no haga rollback de la operación logística.

## Realtime

Los cambios de negocio publican `pg_notify('clickdelivery_realtime', ...)` dentro de la transacción. PostgreSQL entrega el NOTIFY tras commit. Cada instancia Node escucha el canal y retransmite por SSE a scopes de viaje, usuario u organización.

## Storage

Los objetos privados se guardan fuera del árbol público. La DB contiene metadata, hash y autorización; la entrega del binario siempre pasa por la API autenticada.

## Branding

Los archivos proporcionados por el usuario viven en `public/assets/brand/original/` y se consideran inmutables. `manifest.json` fija sus SHA-256 y el build ejecuta `scripts/validate-brand-assets.js`.


## Mobile Production V0.6.1

```text
APK React Native
  ├─ API client + access/refresh
  ├─ OfflineSyncQueue
  ├─ GPS queue / batch
  ├─ WebSocket + FCM
  └─ cámara/evidencia
          │
          ▼
ClickDelivery API
  ├─ Mobile Auth
  ├─ Mobile Sync
  ├─ Marketplace / Orders
  ├─ Logistics Core
  ├─ Wallet / Settlements
  └─ Integraciones futuras LM Networks → Manager Pay / ChefManager AI (deshabilitadas)
```

Los cuatro clientes consumen una sola fuente de verdad en backend. El branding oficial se referencia como asset bloqueado y no forma parte de la lógica mutable de tenant para ClickDelivery.
