Product Requirements Document (PRD)¶
Version: 0.1.0 Last Updated: 2026-05-15 Status: Draft - MVP Planning
1. Visión del Producto¶
Objetivo¶
SaaS para agencias de courier latinoamericanas que operan con viajeros y vuelos comerciales.
El sistema gestiona la complejidad de enviar paquetes a través de pasajeros que viajan en vuelos comerciales, permitiendo: - Registro y tracking de paquetes - Asignación a viajeros/maletas - Consolidación en warehouses de destino - Trazabilidad completa del envío
Contexto del Negocio¶
| Elemento | Descripción |
|---|---|
| Courier social/Latina | Agencias que usan viajeros como "mensajeros informales" |
| Vuelos comerciales | Los paquetes viajan en maletas de pasajeros reales |
| Multi-leg | Un paquete puede pasar por múltiples vuelos/couriers |
| Consolidación | Paquetes se agrupan en destino antes de entrega |
Funcionalidades Core¶
- Envíos físicos: Paquetes, documentos, electrónicos
- Scanning y tracking: En warehouses a lo largo de la cadena
- Flujo financiero multi-moneda: Operaciones España ↔ Perú
- Netting y optimización de caja: Compensación de saldos entre mercados
- Facturación y reportes: Documentación y métricas financieras
- Multi-tenant configurable: Cada agencia tiene su propia configuración
Alcance MVP¶
- Geografía: España ↔ Perú
- Agencias: Soporte inicial para 2 agencias (tenants)
- Usuarios por agencia: Múltiples admins, couriers y warehouses
2. Reglas de Negocio¶
RB-001: Splitting y Consolidación de Paquetes¶
Regla: Un envío puede dividirse (split) - los paquetes NO siempre viajan juntos. Se consolidan en el warehouse de destino.
Comportamiento: - Un shipment puede tener múltiples packages - Los packages pueden dividirse en grupos (splits) antes del envío - Cada grupo puede viajar en不同的maletas/couriers/vuelos - En el warehouse de destino, todos los paquetes se consolidan para entrega final
Flujo de Split:
Shipment "SHP_001"
├── Package "PKG_001" ──┐
├── Package "PKG_002" ──┼──► Split A (Vuelo MAD→LIM, Bag "BAG_A")
└── Package "PKG_003" ──┘
Shipment "SHP_001" (continuación)
├── Package "PKG_004" ──────────────────► Split B (Vuelo MAD→LIM, Bag "BAG_B")
└── Package "PKG_005" ──────────────────► Split C (Vuelo MAD→LIM, Bag "BAG_C")
[DESTINO - Lima Warehouse]
Bag A + Bag B + Bag C ──► CONSOLIDACIÓN ──► Entrega final
Implicaciones: - Tracking debe mostrar splits parciales y su estado individual - Consolidación es un evento crítico en el workflow (PACKAGE_RECONCILED) - Un shipment puede tener múltiples "partidas" de salida - El receptor recibe todos los paquetes al final (o en entregas parciales si decide)
Estados de Split:
| Estado | Descripción |
|--------|-------------|
| PENDING_SPLIT | Paquetes aún no agrupados |
| SPLIT_CREATED | Grupos de envío creados |
| IN_TRANSIT | Paquetes en diferentes vuelos |
| CONSOLIDATED | Todos los paquetes llegaron al warehouse destino |
| PARTIALLY_DELIVERED | Algunos paquetes entregados |
| FULLY_DELIVERED | Todos los paquetes entregados |
RB-002: Multi-Tenancy Flexible¶
Regla: Cada tenant puede tener múltiples admins, couriers y warehouses.
Implicaciones: - Jerarquía: Tenant → Admin → Couriers/Warehouses - Aislamiento de datos por tenant (RLS en PostgreSQL) - Configuración independiente de pricing, FX, notificaciones
RB-003: Empresas Inscritas por País¶
Regla: Cada agencia (tenant) opera con una empresa inscrita legalmente en cada país donde tiene operaciones.
Comportamiento: - Un Tenant tiene N Companies (una por país de operación) - Cada Company tiene: CIF/RUC/DNI-NIE, dirección fiscal, moneda local, bancos - Para tenants que inician sin empresa constituida, se usa DNI/NIE como identificador - Los shipments se registran bajo el Tenant (que engloba las Companies) y la Company del país de origen - La Company del país de destino puede intervenir en la entrega
Jerarquía:
Tenant (Agencia)
├── Company España (CIF/DNI-NIE, EUR, banco ES)
├── Company Perú (RUC/DNI-NIE, PEN, banco PE)
├── Company Colombia (NIT/DNI-NIE, COP, banco CO)
└── ...
Implicaciones: - Facturas se emiten desde la Company del país correspondiente - Impuestos (IVA, IGV) se calculan según país de origen - Balances contables por Company/país - Cada país tiene su propia configuración de pricing (FX, fees) - El shipment siempre se asocia al Tenant y a la Company origen para trazabilidad fiscal
RB-004: Sistema de Pagos¶
Regla: El pago del envío se realiza en efectivo y puede hacerse al recoger o al entregar el paquete.
Características del pago: | Aspecto | Descripción | |---------|-------------| | Método | Efectivo | | Timing | Al recoger el paquete O al entregar el paquete | | Moneda | Moneda del país donde se realiza el pago |
Implicaciones: - El sistema debe registrar el estado del pago (PENDING, PAID) - El pricing se calcula en la moneda del país de origen - No hay integración con pasarelas de pago (PayPal, tarjeta, etc.) en MVP
RB-005: Tracking Público¶
Regla: El tracking es público y anónimo - cualquier persona puede consultar el estado de un shipment con solo el número de tracking.
Características del tracking público: | Aspecto | Descripción | |---------|-------------| | Acceso | Anónimo (sin cuenta necesaria) | | Identificador | Número de tracking (QR code) | | Información visible | Estado actual + timeline de eventos previos | | Límite de consultas | Rate limited para evitar ataques DoS | | Disponibilidad | Solo 3 días después de la entrega del paquete |
Implicaciones: - No se requiere registro/login para consultar tracking - El sistema debe sanitizar outputs para evitar info leaks - Después de 3 días post-entrega, el tracking deja de estar disponible
RB-006: Recepción de Paquetes sin Pre-registro¶
Regla: El sistema permite recibir paquetes que no fueron pre-registrados vía web. El Warehouse Operator puede crear el shipment in-situ.
Flujo: 1. Paquete llega al warehouse sin QR registrado 2. Warehouse Operator crea shipment manualmente 3. Se genera QR para el paquete 4. Paquete entra al flujo normal
Implicaciones: - Todo paquete debe tener un shipment y QR para ser trackeado - El warehouse puede recibir paquetes "cold" sin registro previo
RB-007: Consolidación y Notificaciones¶
Regla: El sistema realiza verificación automática de consolidación. Cuando todos los packages de un shipment han llegado al warehouse destino, se notifica automáticamente al cliente.
Flujo de consolidación:
1. Bags llegan al warehouse destino
2. Sistema compara: Packages esperados vs Packages recibidos
3. Si todos llegaron → Notificación automática al cliente
4. Si faltan packages → Espera 24h por posible extravío
5. Después de 24h → Courier decide qué hacer (reenviar, devolver, almacenar)
Notificaciones: | Evento | Notificación | |--------|--------------| | Todos packages llegaron | Cliente recibe notificación de consolidación lista | | Faltan packages (24h) | Courier recibe alerta para decisión | | Decisión tomada | Cliente recibe update con próxima acción |
RB-008: Scheduling de Flights¶
Regla: Los flights pueden ser creados por ambos (Admin y Courier). Las bags se asignan al courier previo al check-in y se permite modificación por incidencias de vuelo.
Flujo:
1. Admin o Courier crea/registra flight
2. Admin asigna bags al courier antes del viaje
3. En warehouse, se confirma asignación de packages a bags
4. Courier realiza check-in en aeropuerto
5. Se obtiene código IATA de la aerolínea
6. Bag se actualiza con airline_tag_code
Modificaciones: - Se permite cambiar courier/vuelo hasta check-in - Se permite cambios por incidencias (retrasos, cancelaciones)
RB-009: Courier No-show¶
Regla: Si un courier no puede viajar, el Admin reasigna manualmente los bags. Esto afecta el rating/estadísticas del courier con la causa registrada.
Impacto en Courier:
| Campo | Descripción |
|-------|-------------|
| flights_completed | No incrementa (penalización) |
| no_show_count | Se incrementa |
| rating | Puede bajar según historial |
| causes | Se registra la causa (enfermedad, emergencia, otro) |
Notificaciones: - Solo se notifica al cliente si el envío se cancela - Admin debe tomar decisión de reasignación o cancelación
RB-010: Confirmación de Entrega¶
Regla: La entrega se confirma con acknowledgment verbal del receptor (o persona autorizada). Se captura foto como evidencia.
Proceso:
1. Courier/Warehouse entrega paquete
2. Receptor confirma verbalmente
3. Se captura foto del momento (evidencia)
4. PackageEvent DELIVERED se registra
Autorización: - Receptor registrado en shipment - O cualquier persona con autorización del receptor (delegación)
RB-011: Paquetes No Recogidos¶
Regla: Los paquetes tienen tiempo de almacenamiento configurable por warehouse. El Admin decide costos y destino final. Se notifica al remitente automáticamente tras X días (configurable).
Configuración por Warehouse:
| Variable | Descripción |
|----------|-------------|
| storage_days | Días máximos de almacenamiento |
| storage_fee_per_day | Costo diario (0 = gratis) |
| notification_days | Días antes de notificar al remitente |
| default_action | Devolver/Destruir/Almacenar indefinidamente |
Acciones posibles: - Devolver al remitente (costo adicional) - Destruir (para items perishables) - Almacenar indefinidamente (costo acumulado) - Admin decide caso por caso
RB-012: KYC y Monitoreo de Clientes¶
Regla: No se requiere verificación KYC para clientes. Sin límites de uso, pero existe monitoreo activo de actividad sospechosa.
Política: | Aspecto | Descripción | |---------|-------------| | KYC Required | No | | Límite shipments | Sin límite | | Límite valor | Sin límite | | Monitoreo | Activo para detectar patrones sospechosos |
Alertas de monitoreo: - Volumen anómalo de shipments - Patrones de uso inusuales - Dirección de entrega inconsistente
RB-013: Aduanas y Documentación¶
Regla: El sistema no maneja información aduanera en MVP. Solo se genera el QR en cada paquete como identificación. Las incidencias de retención se reportan manualmente.
MVP incluye: - QR único por package - tracking en tiempo real
Futuro (post-MVP): - Registro básico de contenido - Declaración jurada - HS codes para categorías
RB-014: Setup de Nuevo Tenant¶
Regla: Un nuevo tenant requiere configuración mínima: Companies + Pricing + 1 Warehouse + 1 User. Se puede empezar sin Companies (agregar después).
Setup mínimo: | Componente | Requerido | Opcional | |------------|-----------|----------| | Tenant | ✅ | - | | Companies | Opcional | ✅ Agregar después | | Pricing Rules | ✅ | - | | Warehouse | ✅ Mínimo 1 | ✅ Más adelante | | Users | ✅ Mínimo 1 | ✅ Más adelante |
No incluye datos demo - el tenant comienza vacío.
3. Modelo de Datos¶
Jerarquía de Entidades¶
Tenant (Agencia)
├── Companies # Empresas inscritas por país
│ ├── Company España # CIF/DNI-NIE, EUR, banco ES
│ ├── Company Perú # RUC/DNI-NIE, PEN, banco PE
│ └── Company Colombia # NIT/DNI-NIE, COP, banco CO
├── Users # Usuarios del tenant
│ └── Roles: Admin, Warehouse Operator
├── Couriers # Viajeros que llevan paquetes
│ ├── Flights # Vuelos asignados al courier
│ └── Bags # Maletas que lleva el courier
├── Shipments (1:N) # 1 envío puede tener N paquetes
│ ├── Packages (N:1) # N paquetes pertenecen a 1 envío
│ │ ├── PackageEvents # Histórico de eventos (scan, status)
│ │ ├── BagAssignments (N:N) # Relación packages a bags
│ │ └── Documents # Documentos asociados (fotos, PDFs)
│ └── Contacts # Remitente y destinatario
├── Warehouses # Almacenes del tenant
├── PricingRules # Reglas de pricing por tenant
└── TenantConfig # Configuración del sistema
Descripción de Entidades¶
| Entidad | Descripción | Relaciones |
|---|---|---|
| Tenant | Agencia courier | Raíz del modelo, contiene Companies, Users, Couriers, Shipments |
| Companies | Empresas inscritas por país | Cada país tiene Company (CIF/DNI-NIE, RUC/NIT) |
| Users | Usuarios administrativos | Roles: Admin, Warehouse Operator (no Courier) |
| Couriers | Viajeros que llevan paquetes | Tiene User link, pasaporte, estadísticas, bags asignados |
| Shipments | Envío completo (grupo de paquetes) | 1:N con Packages, pertenece a Tenant + Company origen |
| Packages | Paquetes individuales de un envío | N:1 con Shipment, N:N con Bags, tienen QR único |
| BagAssignments | Relación packages a bags | Tabla intermedia N:N |
| Bags | Maletas que llevan los couriers | Código IATA post check-in, status, flight info |
| PackageEvents | Eventos de tracking | Historial de estados del paquete |
| Documents | Documentos adjuntos | Fotos del paquete, facturas, guías |
| Contacts | Remitente y destinatario | Sender y Receiver de cada Shipment |
| Warehouses | Almacenes | Cada Tenant puede tener múltiples warehouses |
| PricingRules | Tarifas por tenant | Fee base, FX margin, discounts |
| TenantConfig | Configuración del sistema | Monedas, umbrales, integraciones |
PricingRules - Modelo de Precios por Tenant¶
Cada agencia (tenant) tiene reglas de pricing completamente configurables según sus necesidades.
Características del Pricing¶
| Aspecto | Descripción |
|---|---|
| Volumen variable | Cada tenant tiene volumen MUY variable (días altos/bajos) |
| Costos operativos reales | Cada envío tiene costos: vuelos, personal, riesgo |
| Reglas personalizadas | Cada agencia define sus propias reglas |
Variables de Pricing¶
| Variable | Descripción | Ejemplo |
|---|---|---|
| KG_RATE | Tarifa por kilogramo | €/kg según categoría |
| BASE_FEE | Tarifa base por envío | Costo fijo mínimo |
| FX_MARGIN | Margen sobre tipo de cambio | % sobre EUR/PEN |
| MIN_CHARGE | Cargo mínimo por envío | Tarifa base si peso bajo |
| VOLUME_DISCOUNT | Descuento por volumen | % según cantidad mensual |
| CATEGORY_RULES | Reglas por categoría | % electrónicos, documentos, fragile |
Categorías de Paquetes¶
| Categoría | Descripción | Reglas ejemplo |
|---|---|---|
| Documents | Documentos, papeles | Tarifa mínima, sin peso |
| General | Ropa, accesorios | Tarifa estándar por kg |
| Electronics | Equipos, móviles | % adicional por seguro |
| Fragile | Frágiles, objetos valiosos | % adicional por manejo especial |
| Hazardous | Materiales especiales | Reglas de regulación |
Ejemplo de Configuración por Tenant¶
tenant: "RoundAway Express"
pricing:
base_fee: 15.00 # EUR
kg_rate:
documents: 0.00 # Documentos no se cobran por kg
general: 8.50 # EUR/kg
electronics: 12.00 # EUR/kg (con seguro)
fragile: 15.00 # EUR/kg (manejo especial)
min_charge: 10.00 # EUR (si peso < 1kg)
fx_margin: 0.03 # 3% sobre tipo de cambio
volume_discount:
- >100_shipments: 0.05 # 5% descuento
- >500_shipments: 0.10 # 10% descuento
Regla de negocio: El pricing debe ser configurable por tenant sin cambios en código.
Couriers - Viajeros que Llevan Paquetes¶
Los couriers/viajeros son una entidad separada para permitir seguimiento, estadísticas y asignación de maletas.
| Atributo | Descripción | Ejemplo |
|---|---|---|
id |
UUID | |
user_id |
FK hacia User (login/auth) | |
full_name |
Nombre completo | Juan Pérez |
passport_number |
Número de pasaporte | AA1234567 |
nationality |
Nacionalidad | Peruana |
phone |
Teléfono de contacto | +51123456789 |
email |
Email de contacto | |
flights_completed |
Contador de vuelos | 45 |
packages_delivered |
Contador de paquetes | 234 |
rating |
Rating del courier (1-5) | 4.8 |
status |
ACTIVE, INACTIVE, SUSPENDED | ACTIVE |
home_country |
País de residencia | Perú |
preferred_routes |
Rutas frecuentes | MAD→LIM, LIM→MAD |
Asignación de Bags en Warehouse:
1. En el warehouse, al courier se le asignan los packages que viajará
2. Los packages se agrupan en Bags (maletas)
3. Se genera un Bag provisional
4. En el check-in del aeropuerto, se obtiene el código IATA (etiqueta oficial de la aerolínea)
5. El Bag se actualiza con el airline_tag_code
Bags - Maletas con Paquetes¶
| Atributo | Descripción | Ejemplo |
|---|---|---|
id |
UUID | |
courier_id |
FK hacia Courier | |
flight_id |
FK hacia Flight (asignado) | |
warehouse_id |
FK hacia Warehouse (origen) | MAD-WH-01 |
status |
OPEN, SEALED, CHECKED_IN, IN_TRANSIT, DELIVERED | |
airline_tag_code |
Código IATA post check-in | AMC1234567890 |
airline |
Aerolínea | Iberia |
flight_number |
Número de vuelo | IB6251 |
estimated_arrival |
Fecha estimada de llegada | |
actual_arrival |
Fecha real de llegada | |
total_packages |
Número de paquetes en la maleta | 12 |
Relación con Packages:
- Un Bag puede contener N Packages (N:N)
- Un Package puede estar en N Bags (split shipping)
- La tabla BagAssignments registra la relación con timestamps
BagAssignments - Relación Packages-Bags¶
| Atributo | Descripción |
|---|---|
id |
UUID |
package_id |
FK hacia Package |
bag_id |
FK hacia Bag |
added_at |
Timestamp de asignación |
added_by |
User que realizó la asignación |
position |
Posición en la maleta (opcional) |
removed |
Boolean (si se removió de la maleta) |
Flights - Vuelos Comerciales¶
| Atributo | Descripción | Ejemplo |
|---|---|---|
id |
UUID | |
flight_number |
Número de vuelo | IB6251 |
airline |
Aerolínea | Iberia |
departure_airport |
Aeropuerto de salida | MAD |
arrival_airport |
Aeropuerto de llegada | LIM |
scheduled_departure |
Hora programada salida | |
scheduled_arrival |
Hora programada llegada | |
actual_departure |
Hora real de salida | |
actual_arrival |
Hora real de llegada | |
status |
SCHEDULED, BOARDING, DEPARTED, ARRIVED, CANCELLED | |
courier_id |
FK hacia Courier asignado | |
max_weight_kg |
Peso máximo permitido | 23 |
available_weight_kg |
Peso disponible | 18.5 |
PackageEvents - Eventos de Tracking (Unificados)¶
Cada acción en warehouse genera un evento rastreable. Esta es la lista unificada de eventos:
| Evento | Descripción | MVP1 | Transición típica |
|---|---|---|---|
PACKAGE_CREATED |
Paquete registrado en el sistema | ✅ | Inicio del tracking |
QR_GENERATED |
QR generado para el paquete | ✅ | Sistema genera código único |
PHOTO_UPLOADED |
Foto de evidencia capturada | ✅ | Worker captura evidencia |
PACKAGE_SCANNED |
Paquete escaneado en warehouse | ⚠️ | Post-MVP1: requiere hardware scanner |
PACKAGE_PACKED |
Paquete empaquetado y listo | ✅ | Preparado para asignación |
ASSIGNED_TO_BAG |
Paquete asignado a maleta | ✅ | Agrupación para transporte |
BAG_SEALED |
Maleta sellada/ cerrada | ✅ | Todos los packages agregados |
BAG_CHECKED_IN |
Check-in en aeropuerto (código IATA asignado) | ⚠️ | Post-MVP1: se obtiene código de aerolínea |
BAG_LOADED |
Maleta cargada en bodega del avión | ✅ | Courier entrega maleta |
FLIGHT_DEPARTED |
Vuelo ha despegado | ✅ | Confirmación de salida |
FLIGHT_ARRIVED |
Vuelo ha aterrizado | ✅ | Confirmación de llegada |
BAG_UNLOADED |
Maleta descargada en destino | ✅ | Extracción de bodega |
CONSOLIDATED |
Paquetes consolidados en warehouse destino | ✅ | Reagrupación para entrega |
READY_FOR_PICKUP |
Paquete listo para recojo | ✅ | Disponible en warehouse destino |
DELIVERED |
Paquete entregado al destinatario | ✅ | Fin del ciclo |
RETURNED |
Paquete devuelto | ✅ | Excepción, requiere acción |
Nota MVP1: Los eventos marcados con ⚠️ (SCANNED, BAG_CHECKED_IN) requieren hardware específico o integración con aerolíneas que puede implementarse en fases posteriores.
Nota: El estado
RETURNEDpuede aplicarse en cualquier punto del flujo si el paquete no puede continuar su curso normal.Regla de trazabilidad: Cada PackageEvent debe incluir: - Timestamp del evento - User/Actor que realizó la acción - Ubicación (Warehouse ID) - Evidencia adjunta (foto URL, documento) - Metadata adicional (opcional)
Contacts - Personas (Remitente / Receptor)¶
| Tipo | Rol | Descripción |
|---|---|---|
| Sender (Remitente) | Quien envía el paquete | Cliente que inicia el envío |
| Receiver (Destinatario) | Quien recibe el paquete | Cliente final que recibe el envío |
Regla de negocio: El remitente y el receptor pueden ser la misma persona (envío a uno mismo).
Flujos de Warehouse¶
Flujo de Entrada (Recepción de Paquete)¶
1. Worker recibe paquete en warehouse
2. Abre Flet app (escaner)
3. Escanea QR del paquete
4. Backend registra evento SCAN
5. Sistema genera etiqueta con QR
6. Printer imprime etiqueta QR
7. Captura foto del paquete (evidencia)
8. Worker asigna paquete a bag/flight
Flujo de Salida (Carga a Vuelo)¶
1. Scanner agrupa paquetes
2. Imprime Bag QR (etiqueta de maleta)
3. Asigna Courier al flight
4. Sistema cambia estado a LOADED_TO_FLIGHT
Flujo Técnico de Scanning¶
[Worker abre app]
↓
[Escanea QR]
↓
Flet captura string: "PKG_839201"
↓
POST /api/v1/scan-event
↓
FastAPI valida:
- tenant (del usuario auth)
- package (existe en DB)
- warehouse (pertenece al tenant)
↓
Redis publish:
channel: "package.scanned"
event: { package_id, warehouse_id, timestamp }
↓
Webhook/API notifica:
- Cliente (si subscribed)
- Dashboard admin
↓
DB UPDATE:
PackageEvents(scanned, timestamp, warehouse_id)
↓
Optional: Printer genera etiqueta
API Endpoint - Scan Event¶
POST /api/v1/scan-event
Authorization: Bearer <token>
Content-Type: application/json
Request:
{
"qr_code": "PKG_839201",
"warehouse_id": "uuid",
"action": "SCAN",
"photo_url": "https://s3.../photo.jpg", // opcional
"evidence": {} // metadata adicional
}
Response (200):
{
"event_id": "uuid",
"package_id": "uuid",
"status": "SCANNED",
"next_actions": ["PRINT_LABEL", "ASSIGN_TO_BAG"],
"warehouse_current": "MAD-WH-01"
}
4. Actores del Sistema¶
| Actor | Descripción | Funciones principales |
|---|---|---|
| Cliente final | Persona que envía paquetes | Crear envíos, elegir moneda de destino, ver tracking |
| Agencia Tenant | Empresa courier (tenant) | Gestión de envíos, pricing, usuarios, warehouse, FX |
| Admin de tenant | Administrador interno de la agencia | Configuración, reportes, usuarios, warehouses |
| Courier / viajero | Usuario con rol de courier | Lleva bags de origen a destino, tiene tracking de estadísticas (vuelos completados, paquetes entregados, rating) |
| Warehouse operator | Operador de warehouse | Recepción, verificación, empaquetado, entrega |
Nota sobre Roles: Un mismo usuario puede tener múltiples roles. Por ejemplo, una persona puede ser
Adminde la agencia y también hacer deCouriercuando viaja. El sistema permite que unUsertenga los roles:Admin,Courier,Warehouse Operator.
5. Features Core¶
Las siguientes funcionalidades son el enfoque del sistema:
| # | Feature | Descripción |
|---|---|---|
| F1 | Registrar envíos | Formulario de registro con datos de remitente/destinatario, contenido, peso |
| F2 | Escanear QR/barcode | App móvil para escanear códigos de paquetes |
| F3 | Visualizar estado de paquetes | Tracking en tiempo real para clientes |
| F4 | Dashboard admin por tenant | Panel de control con métricas y gestión |
| F5 | Notificaciones push | Alertas de estado del envío |
6. Warehouse Operating System (WOS)¶
Sistema integral para gestionar operaciones de warehouse:
┌─────────────────────────────────────────────────────────────┐
│ WAREHOUSE OPERATING SYSTEM │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────────┐ ┌──────────────────┐ ┌────────────┐ │
│ │ LABELING SYSTEM │ │ MOBILE SCAN │ │ PHOTO │ │
│ │ QR / Barcode │ │ SYSTEM │ │ EVIDENCE │ │
│ └─────────────────┘ └──────────────────┘ └────────────┘ │
│ ┌─────────────────┐ ┌──────────────────┐ │
│ │ MULTI-PACKAGE │ │ MULTI-CARRIER │ │
│ │ SHIPMENT GRP │ │ HANDLING │ │
│ └─────────────────┘ └──────────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ OPERACIONES: │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │Recepción │ │Etiquetado│ │Picking/ │ │ Tracking │ │
│ │ │ │ │ │ Packing │ │ │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ EVIDENCIA VISUAL │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
Módulos del WOS¶
| Módulo | Descripción | Funcionalidades |
|---|---|---|
| Labeling System | Sistema de etiquetas QR/Barcode | Generación automática, impresión, re-etiquetado |
| Mobile Scanning System | App móvil para escanear | Captura QR, validación, registro de eventos |
| Multi-Package Shipment Grouping | Agrupación de paquetes | Consolidar N packages en 1 shipment, separar shipments |
| Photo Evidence System | Sistema de evidencia fotográfica | Captura, almacenamiento S3, adjuntar a eventos |
| Multi-Carrier Handling | Manejo de maletas/viajeros/vuelos | Asignación carrier, tracking de vuelos, gestión bags |
Flujo de Operaciones WOS¶
RECEPCIÓN ETIQUETADO PICKING/PACKING TRACKING
│ │ │ │
▼ ▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ Scan │────▶│ Generate│───────▶│ Group │───────▶│ Real-time│
│ QR │ │ Label │ │ Package │ │ Events │
└──────────┘ └──────────┘ └──────────┘ └──────────┘
│ │ │ │
▼ ▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ Photo │ │ Print │ │ Assign │ │ Status │
│ Evidence │ │ Label │ │ to Bag │ │ Update │
└──────────┘ └──────────┘ └──────────┘ └──────────┘
Beneficios del WOS¶
- Trazabilidad end-to-end: Desde recepción hasta entrega
- Reducción de errores: Validación por QR elimina confusión
- Evidencia auditiva: Fotos para disputas y calidad
- Operaciones eficientes: Mobile app para workers en piso
- Consolidación inteligente: Agrupar paquetes optimiza espacio
7. MVP Fases y Epics¶
MVP 1 — Básico¶
Objetivo: Registro de envíos y tracking simple.
Dependencias: Ninguna
Features incluidas: F1, F2, F3, F4, F5
| Epic | User Stories | Backend | Frontend |
|---|---|---|---|
| Registro de paquete | Como cliente quiero registrar un paquete con remitente/destinatario, contenido, peso, fotos | API POST /shipments, DB shipments |
Formulario registro paquete, subida de fotos, asignación QR |
| Generación de QR/Barcode | Como sistema quiero generar un QR para cada paquete | Generación QR en backend, almacenamiento en S3 | Mostrar QR en app y PDF para imprimir |
| Tracking de bags y consolidación | Como cliente quiero ver en qué bags/vuelos están mis paquetes y el estado de consolidación en destino | API GET /shipments/{id}/bags, consolidación events |
Dashboard de tracking con timeline de bags, estado de llegada |
| Asignación Bag-Courier | Como admin quiero asignar packages a bags y asignar un courier al bag para un vuelo | API POST /bags, POST /bags/{id}/assign-courier, BagAssignments |
Formulario de asignación, lista de couriers disponibles |
| Dashboard admin | Como admin quiero ver métricas de envíos por tenant | API dashboard aggregations | Dashboard con KPIs básicos |
| Notificaciones push | Como cliente quiero recibir alertas de estado | WebSocket + FCM push | Configuración de notificaciones |
MVP 2 — Intermedio¶
Objetivo: Multi-warehouse, contabilidad básica, pricing configurado.
Dependencias: MVP 1 completado
| Epic | User Stories | Backend | Frontend |
|---|---|---|---|
| Warehouse management | Como admin quiero registrar recepciones y entradas | API warehouse events, DB warehouse_events | Dashboard warehouse, scanning app |
| Pricing por tenant | Como admin quiero configurar fee + FX margin | DB tenant_pricing, API POST/GET /pricing |
Formulario de configuración de tarifas |
| Ledger básico | Como admin quiero registrar ingresos y operaciones FX | DB ledger, API POST/GET /ledger |
Visualización de operaciones por tenant |
| Facturación PDF | Como admin quiero generar PDF de envíos | Generación PDF en backend, API | Descarga PDF y envío por email/WhatsApp |
MVP 3 — Avanzado¶
Objetivo: Netting bidireccional, optimización de liquidez, reportes financieros avanzados.
Dependencias: MVP 2 completado
| Epic | User Stories | Backend | Frontend |
|---|---|---|---|
| Netting bidireccional | Como admin quiero compensar saldos entre España y Perú | Algoritmo netting, DB settlements, API POST /settlements |
Dashboard financiero con saldo neto |
| Integración pagos locales | Como admin quiero registrar operaciones de Yape/Plin | API webhooks pagos, DB ledger | Mostrar estado de pagos locales |
| Reporting avanzado | Como admin quiero KPIs de envíos, fees, cashflow | API reportes, agregaciones DB | Dashboard financiero completo |
8. Roadmap¶
Placeholder: Dates and milestones to be defined.
| Fase | Alcance | Target Date | Status |
|---|---|---|---|
| MVP 1 | Básico | TBD | Planning |
| MVP 2 | Intermedio | TBD | Pending MVP 1 |
| MVP 3 | Avanzado | TBD | Pending MVP 2 |
9. Dependencias entre MVPs¶
MVP 1 (Básico) ──→ MVP 2 (Intermedio) ──→ MVP 3 (Avanzado)
│ │ │
▼ ▼ ▼
Registro Warehouse Netting
QR/Tracking Ledger Reporting
Dashboard Pricing Pagos locales
Notifications Facturación
10. Información Pendiente¶
- [ ] Fechas target para cada MVP
- [ ] Presupuesto y recursos asignados
- [ ] Priorización interna de features MVP 1
- [ ] Detalles de integración con bancos para netting
- [ ] Requisitos de compliance (KYC,AML) por mercado
11. Notas de Implementación¶
Infraestructura¶
| Componente | Función | Descripción |
|---|---|---|
| PostgreSQL | Base de datos | Almacenamiento principal con RLS para multi-tenancy |
| Redis | Event bus + Realtime | Pub/Sub para eventos en tiempo real, cache de sesiones |
| S3/R2 | Storage | Almacenamiento de PDFs, fotos, documentos |
| FCM | Push notifications | Notificaciones push a dispositivos móviles |
| FastAPI | Backend API | Lógica de negocio, validación, eventos |
| Flet | Frontend (UI) | UI, navegación, formularios, tracking visual |
Arquitectura de la Aplicación (DDD/CQRS)¶
┌─────────────────────────────────────────────────────────────────────┐
│ ARQUITECTURA DEL SISTEMA │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ │ │ │ │ │ │
│ │ FLET │◄──────►│ FastAPI │◄──────►│ Postgres │ │
│ │ │ │ │ │ │ │
│ │ Thin Client │ │ Bounded │ │ Truth │ │
│ │ │ │ Context │ │ System │ │
│ │ - UI │ │ (Core) │ │ │ │
│ │ - Forms │ │ - Commands │ │ - State │ │
│ │ - Display │ │ - Queries │ │ - Events │ │
│ │ │ │ - Domain │ │ │ │
│ └─────────────┘ └──────┬───────┘ └─────────────┘ │
│ │ │
│ │ │
│ ┌──────▼───────┐ │
│ │ │ │
│ │ Redis │ │
│ │ │ │
│ │ Event Bus │ │
│ │ │ │
│ │ - Pub/Sub │ │
│ │ - Real-time │ │
│ │ - Cache │ │
│ └──────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────────┘
Componentes Core¶
| Componente | Rol | Responsabilidad |
|---|---|---|
| Flet | Thin Client | UI, formularios, navegación, display. Sin lógica de negocio. |
| FastAPI | Bounded Context (Core System) | Lógica de negocio, comandos, queries, validación, eventos |
| Redis | Event Bus | Pub/Sub para eventos, real-time subscriptions, cache |
| PostgreSQL | Truth System | Estado único, persistencia, RLS para multi-tenancy |
[Worker/Flet] [FastAPI] [Redis] [Postgres]
│ │ │ │
│ POST /scan-event │ │ │
│───────────────────────>│ │ │
│ │ Validate & Process │ │
│ │──────────────────────>│ │
│ │ │ PUBLISH event │
│ │ │─────────────────>│
│ │ │ │ STORE event
│ │ │ │
│ │<────── ACK ──────────│<─────────────────│
│ │ │ │
│<─── Response ─────────│ │ │
│ │ │ │
│ │ Pub/Sub notifications │ │
│ │─────────────────────>│ │
│ │ │───► Dashboard │
│ │ │───► WebSocket │
│ │ │───► FCM push │
Responsabilidades por Componente¶
| Componente | Rol DDD | Qué hace | Qué NO hace |
|---|---|---|---|
| Flet | Thin Client | UI, Forms, Display, Navigation | Lógica, validación, estado |
| FastAPI | Bounded Context | Domain logic, Commands, Queries, Events | UI, almacenamiento local |
| Redis | Event Bus | Pub/Sub, Real-time, Cache | Lógica de negocio |
| PostgreSQL | Truth System | State, Events, Persistence | UI, lógica de presentación |
Consideraciones técnicas¶
- Multi-tenancy: Tenant como entidad raíz, RLS en PostgreSQL, Companies por país
- Consolidación de paquetes: Shipments → Packages → BagAssignments → Bags → Flights
- Bags: Gestión de maletas con código IATA post check-in, tracking de peso disponible
- Couriers: Seguimiento de viajeros con estadísticas (flights_completed, packages_delivered, rating)
- Companies: Setup fiscal multi-país (CIF, RUC, NIT), monedas locales, impuestos por país
- PricingRules: Configurable por tenant para fee + FX margin + categoría de paquete
- TenantConfig: Monedas (EUR/PEN/COP), umbrales, integraciones (Yape/Plin, FCM)
- Contacts: Sender y Receiver almacenados en Shipment para trazabilidad
- Documents: Almacenamiento en S3 para fotos y PDFs de paquetes
- Split Shipping: Packages pueden estar en múltiples Bags (N:N relationship)
- Multi-leg Tracking: Un paquete puede pasar por múltiples flights/couriers
Este documento es vivo y se actualizará según evolucione el producto.