Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/JorLOrT/rappi2/llms.txt

Use this file to discover all available pages before exploring further.

Rappi2 stores its data across two databases. PostgreSQL holds the normalized, relational core — users, orders, fleet, and billing — where referential integrity and transactions matter. MongoDB holds the high-volume, geospatial, and schema-flexible data — GPS pings, geofences, audit logs, evidence files, and notifications — where document structure and indexing flexibility are more important than strict consistency.

PostgreSQL tables

Identity and access

roles
ColumnTypeNotes
idintegerPrimary key
nombrevarchar(50)Unique role name
permisos
ColumnTypeNotes
idintegerPrimary key
rol_idintegerFK → roles.id (CASCADE delete)
recursovarchar(50)Resource name or * wildcard
accionvarchar(20)read, write, delete, or * wildcard
Unique constraint on (rol_id, recurso, accion). usuarios
ColumnTypeNotes
idintegerPrimary key
usernamevarchar(50)Unique, indexed
emailvarchar(150)Unique, indexed
password_hashtextBcrypt hash
rol_idintegerFK → roles.id (RESTRICT delete)
cliente_idintegerFK → clientes.id (SET NULL), unique
activobooleanSoft-disable flag
fecha_registrotimestamptzServer default now()
tokens
ColumnTypeNotes
idintegerPrimary key
usuario_idintegerFK → usuarios.id (CASCADE delete)
tokentextUnique JWT string
fecha_expiraciontimestamptz
revocadobooleanManual revocation flag

Customers

clientes
ColumnTypeNotes
idintegerPrimary key
nombrevarchar(100)
emailvarchar(150)Unique, indexed
telefonovarchar(20)Optional
cc_idvarchar(30)National ID, optional
activoboolean
fecha_registrotimestamptzServer default now()
clientes_direcciones
ColumnTypeNotes
idintegerPrimary key
cliente_idintegerFK → clientes.id (CASCADE delete)
direccionvarchar(200)Street address
distritovarchar(80)Optional
ciudadvarchar(80)Optional
estadovarchar(80)State/region, optional
paisvarchar(80)Optional
es_principalbooleanMarks the preferred address

Orders and billing

ordenes
ColumnTypeNotes
idintegerPrimary key
cliente_idintegerFK → clientes.id (CASCADE delete)
estadovarchar(20)Pendiente, En Proceso, En Tránsito, Entregado, Cancelado
direccion_origenvarchar(200)
distrito_origenvarchar(80)Optional
direccion_destinovarchar(200)
distrito_destinovarchar(80)Optional
fecha_creaciontimestamptzServer default now()
totalnumeric(10,2)Optional until confirmed
pagos
ColumnTypeNotes
idintegerPrimary key
orden_idintegerFK → ordenes.id (CASCADE delete)
fecha_pagotimestamptzServer default now()
montonumeric(10,2)
estadovarchar(20)e.g. Pendiente, Completado
referencia_bancovarchar(80)Optional external reference
facturas
ColumnTypeNotes
idintegerPrimary key
orden_idintegerFK → ordenes.id (CASCADE delete)
fechatimestamptzServer default now()
rucvarchar(20)Tax ID, optional
montonumeric(10,2)
urltextPDF or external invoice URL

Fleet and dispatch

vehiculos
ColumnTypeNotes
placavarchar(15)Primary key — license plate
tipovarchar(40)Vehicle category
capacidad_kgnumeric(8,2)Payload capacity
estadovarchar(20)Operativo, etc.
fecha_mantenimientotimestamptzLast or next maintenance date
activoboolean
conductores
ColumnTypeNotes
idintegerPrimary key
usuario_idintegerFK → usuarios.id (CASCADE delete), unique
vehiculo_placavarchar(15)FK → vehiculos.placa (SET NULL)
nombrevarchar(100)
licenciavarchar(30)Unique driver’s licence number
disponibilidadvarchar(20)Disponible, etc.
activoboolean
asignaciones
ColumnTypeNotes
idintegerPrimary key
orden_idintegerFK → ordenes.id (CASCADE delete)
conductor_idintegerFK → conductores.id (RESTRICT delete)
vehiculo_placavarchar(15)FK → vehiculos.placa (RESTRICT delete)
estadovarchar(20)Asignada, etc.
fecha_iniciotimestamptzOptional
fecha_fintimestamptzOptional

Routes and incidents

rutas_planificadas
ColumnTypeNotes
idintegerPrimary key
orden_idintegerFK → ordenes.id (CASCADE delete)
distancia_kmnumeric(8,2)Optional computed distance
tiempo_estimadointervalPostgreSQL INTERVAL type
paradas
ColumnTypeNotes
idintegerPrimary key
ruta_idintegerFK → rutas_planificadas.id (CASCADE delete)
orden_idintegerFK → ordenes.id (SET NULL)
direccionvarchar(200)
distritovarchar(80)Optional
secuenciaintegerStop order within the route
fecha_pasotimestamptzActual arrival time, optional
estadovarchar(20)Pendiente, etc.
Unique constraint on (ruta_id, secuencia). incidencias
ColumnTypeNotes
idintegerPrimary key
asignacion_idintegerFK → asignaciones.id (CASCADE delete)
tipovarchar(50)Incident category
fechatimestamptzServer default now()
severidadinteger1–5 (check constraint)
notastextOptional free-text notes
evidencia_urltextOptional link to evidence

MongoDB collections

gps_tracking

One document per GPS ping from a driver device.
{
  "_id": "ObjectId",
  "asignacion_id": 42,
  "conductor_id": 7,
  "vehiculo_placa": "ABC-123",
  "location": { "type": "Point", "coordinates": [-77.0428, -12.0464] },
  "speed_kmh": 38.5,
  "heading": 270,
  "accuracy_m": 4.2,
  "timestamp": "2026-05-22T14:30:00Z"
}
A 2dsphere index on location enables $geoNear aggregation and proximity queries (for example, finding all drivers within 2 km of a point). A compound index on (asignacion_id, timestamp DESC) accelerates time-range queries per assignment.

geocercas

Polygon geofences linked to planned routes.
{
  "_id": "ObjectId",
  "ruta_id": 15,
  "orden_id": 88,
  "tipo": "ruta_buffer",
  "geometry": { "type": "Polygon", "coordinates": [[[...]]] },
  "tolerance_m": 100,
  "activa": true,
  "created_at": "2026-05-22T10:00:00Z"
}
A 2dsphere index on geometry powers $geoIntersects queries, allowing the API to check in real time whether a driver’s current position falls inside an active geofence.

auditoria

One document per HTTP request, written by AuditMiddleware.
{
  "_id": "ObjectId",
  "usuario_id": 3,
  "ruta": "/api/ordenes/12",
  "metodo": "PUT",
  "ip": "203.0.113.45",
  "status_code": 200,
  "payload_hash": "e3b0c44298fc1c14...",
  "timestamp": "2026-05-22T14:31:05Z"
}
A TTL index on timestamp with expireAfterSeconds: 7776000 (90 days) automatically purges old audit records without manual cleanup jobs.

evidencias

Metadata document per evidence submission; binary files live in GridFS bucket evidencias_files.
{
  "_id": "ObjectId",
  "incidencia_id": 5,
  "tipo": "foto",
  "descripcion": "Daño en paquete",
  "uploaded_by": 7,
  "archivos": [
    {
      "file_id": "6650f1a2...",
      "filename": "foto_dano.jpg",
      "content_type": "image/jpeg",
      "size": 204800
    }
  ],
  "urls": [],
  "timestamp": "2026-05-22T15:00:00Z"
}

notificaciones

Per-recipient notification documents.
{
  "_id": "ObjectId",
  "destinatario_tipo": "conductor",
  "destinatario_id": 7,
  "leida": false,
  "fecha": "2026-05-22T14:45:00Z"
}
A compound index on (destinatario_tipo, destinatario_id, fecha DESC) serves inbox queries efficiently.

Key relationships

Cliente ──< Orden ──< Pago
                 ──< Factura
                 ──< Asignacion ──> Conductor ──> Usuario
                              ──> Vehiculo
                              ──< Incidencia ──< Evidencia (MongoDB)
                 ──< RutaPlanificada ──< Parada
                              ──< Geocerca (MongoDB)

Asignacion ──< GPS Ping (MongoDB, via asignacion_id)
  • An order can have multiple payments, invoices, assignments, and planned routes.
  • An assignment links one order to one driver and one vehicle for a delivery leg, and accumulates incidents.
  • GPS pings in MongoDB reference asignacion_id and conductor_id for time-series and proximity queries.
  • Evidence files in MongoDB reference incidencia_id and store binary content in GridFS.

Build docs developers (and LLMs) love