Referencia API REST

GoTruckBackoffice.Api · rutas en inglés (kebab-case) · JSON · JWT Bearer

Convenciones

AspectoValor
Prefijo base/api
FormatoJSON (application/json)
AutenticaciónAuthorization: Bearer <JWT> salvo endpoints marcados Anónimo
EnumsSerializados como string (p. ej. UsuarioEstado: Pendiente, Activo, Inhabilitado)
Fechas en filtrosString YYYYMMDD en query (desde, hasta)
Proxy desarrolloVite reenvía /api → http://127.0.0.1:5000
Swagger/swagger en la API en ejecución

Seguridad y llamadas desde el frontend

El SPA (src/Web) nunca almacena credenciales de base de datos ni claves de mapas. Toda operación protegida pasa por la API con JWT emitido tras login exitoso.

Flujo de autenticación

  1. POST /api/auth/login con usuario y clave → respuesta incluye token (JWT firmado en servidor).
  2. El cliente guarda el token en localStorage bajo la clave gotruck_token (auth.ts).
  3. Las funciones fetchJson y sendJson añaden automáticamente Authorization: Bearer … si hay token.
  4. Ante 401, el cliente borra el token y lanza SessionExpiredError para redirigir al login.
  5. POST /api/auth/register crea cuenta en estado Pendiente sin devolver JWT; un administrador debe habilitarla.

JWT (servidor)

Claim / datoDescripción
sub / NameIdentifierId numérico del usuario
unique_name / NameNombre de usuario
admintrue si es administrador (menú Usuarios, endpoints /api/users)
Emisor / audiencia / firmaConfiguración en appsettings.json → sección Jwt (clave ≥ 32 caracteres)
ExpiraciónJwt:ExpiryMinutes

El frontend decodifica el payload solo para UI (p. ej. readIsAdminFromToken()); la autorización real la valida la API en cada request.

Buenas prácticas implementadas

Ejemplo (cliente)

// auth.ts — petición autenticada
const token = localStorage.getItem("gotruck_token");
const res = await fetch("/api/catalogs/customers", {
  headers: {
    Accept: "application/json",
    ...(token ? { Authorization: `Bearer ${token}` } : {}),
  },
});

Parámetros de consulta compartidos

Usados en reportes, tableros y mapas (ReporteFiltrosQuery):

QueryTipoDescripción
repartidorIdstring?Código/id del repartidor; omitir o vacío = todos
numeroHojaint?Número de hoja de reparto
desdestring?Fecha inicio YYYYMMDD
hastastring?Fecha fin YYYYMMDD
tipostring?Filtro de actividad: ENTREGA, COBRANZAS, ENTREGA_COBRANZAS (u omitir = todas)
canalIdstring?Canal de cliente (reporte estadístico)
busquedastring?Texto libre (tablero)

Mapas adicionales:

QueryTipoDescripción
includeWithoutGpsboolIncluir actividades sin GPS (ubicación por dirección de entrega)
includeWithoutActivityboolIncluir clientes sin actividad

Autenticación — /api/auth

POST /api/auth/login Anónimo

Inicio de sesión. Usuarios Pendiente o Inhabilitado reciben 401 con mensaje específico.

Cuerpo

CampoTipoRequeridoDescripción
usuariostringsíNombre de usuario
clavestringsíContraseña en claro (HTTPS en producción)

Respuesta 200 — AuthTokenDto

CampoTipoDescripción
tokenstringJWT
usuarioIdintId interno
nombreUsuariostringLogin
esAdministradorboolRol administrador

POST /api/auth/register Anónimo

Registro público. Crea usuario Pendiente, sin token.

Cuerpo

CampoTipoDescripción
usuariostring3–64 caracteres
clavestringMínimo 4 caracteres

Respuesta 201 — RegistroPendienteDto

CampoTipo
mensajestring

GET /api/auth/me JWT

Respuesta 200 — UserMeDto

CampoTipo
idint
nombreUsuariostring
estadoUsuarioEstado
esAdministradorbool

Salud — /api/health

GET /api/health Anónimo

Respuesta 200 — HealthDto

CampoTipoDescripción
serviciostringNombre del servicio
utcdatetimeMarca de tiempo UTC
baseDatosOkboolConexión auth DB + datos operativos legacy
baseDatosstringIdentificador lógico (ArcorGev5Reparto)

Dashboard — /api/dashboard

GET /api/dashboard/summary JWT

Resumen KPI de la última jornada con actividad en E_ACTIVIDADES_REPARTIDOR.

Respuesta — DashboardResumenDto

CampoTipoDescripción
fechaJornadastring?YYYYMMDD de la jornada o null
totalHojasRepartoint
visitasPlanificadasint
visitasRealizadasint
entregasOkint
entregasRechazadasint
montoCobradodecimal
montoPendientedecimal

GET /api/dashboard/detail/{type} JWT

type: hojas | visitas | entregas | cobrado

Respuesta — DashboardDetalleDto

CampoTipo
tipostring
titulostring
fechaJornadastring?
columnasstring[]
filas{ celdas: string[] }[]

Catálogos — /api/catalogs

Lectura de maestros I_* y catálogos dinámicos para filtros. Todos requieren JWT.

Repartidores (drivers)

GET /api/catalogs/drivers

Sin fechas: lista maestra RepartidorDto[]. Con desde + hasta: RepartidorConteoDto[] con conteos de repartos.

QueryDescripción
desde, hastaOpcional; activan modo conteo
tipoFiltro de actividad (p. ej. ENTREGA_COBRANZAS)

RepartidorDto

CampoTipo
idint
codigostring
nombrestring
activobool

RepartidorConteoDto (con fechas)

CampoTipo
id, codigo, nombre, activo
repartosRealizadosint
repartosPlanificadosint

GET /api/catalogs/drivers/{id}

Respuesta — RepartidorDetalleDto

CampoTipo
idint
camposArticuloCampoDto[] — todos los campos de I_REPARTIDORES (nombre + valor)

Hojas para filtros de reportes

GET /api/catalogs/sheets

Query: desde, hasta, repartidorId → CatalogoItemDto[]

CampoTipo
codigostring
etiquetastring

Canales y categorías

GET /api/catalogs/channels · GET /api/catalogs/customer-categories → CatalogoItemDto[]

Productos (artículos)

GET /api/catalogs/products → ArticuloListItemDto[]

CampoTipo
idint
codigostring
descripcionstring
unidadVentastring

GET /api/catalogs/products/{id} → ArticuloDetalleDto (id, campos[] de I_ARTICULOS)

Hojas de ruta

GET /api/catalogs/route-sheets → HojaRutaListItemDto[]

CampoTipoDescripción
idintPK interna
idHojaRepartostring
numeroHojaRepartostring
repartidorIdstring?
repartidorNombrestring?
estadoRutastring?ABIERTA | CERRADA (registro en E_CIERRE_DE_RUTA para la hoja y FECHA_REGISTRACION)
activobool
fechaRegistracionstring?
fechaUltimaModificacionstring?
procesadoQmint?
routeIdQmint?
cantidadClientesAVisitarintCOUNT en I_CLIENTES

GET /api/catalogs/route-sheets/{id} → HojaRutaDetalleDto

CampoDescripción
hojaHojaRutaListItemDto
clientes[]HojaRutaClienteVisitaDto: clienteId, codigo, razonSocial, ordenVisita, localidad

Clientes

GET /api/catalogs/customers → ClienteListItemDto[]

CampoTipo
idint
codigostring
razonSocialstring
canalId, canalstring?
categoriaId, categoriastring?
localidadstring?
cantidadDireccionesint

GET /api/catalogs/customers/{id} → ClienteDetalleDto (campos[] de I_CLIENTES)

GET /api/catalogs/customers/{id}/addresses → ClienteDireccionesDto

CampoTipo
clienteId, codigo, razonSocial
direcciones[]ClienteDireccionDto

ClienteDireccionDto

CampoTipo
idint
textostring
localidad, provincia, codigoPostal, telefono, paisCodigostring?
latitud, longituddouble?
esDireccionEntregabool
tieneCoordenadasValidasbool

POST /api/catalogs/customers/addresses/{addressId}/geocode

Geocodifica vía Nominatim (OpenStreetMap). Respuesta ClienteDireccionGeocodificadaDto: id, latitud, longitud, consultaUsada.

Reportes — /api/reports

Todos usan ReporteFiltrosQuery y devuelven ReporteFilaDto[].

CampoTipoDescripción
seleccionadoboolPara UI de selección
codigostringCódigo cliente
razonSocialstring
detallestring?Texto auxiliar según reporte
monto1, monto2decimal?Métricas monetarias
entero1, entero2int?Contadores

Tableros — /api/boards

GET /api/boards/delivery-progress

Query: filtros compartidos + busqueda. Respuesta TableroAvanceDto[]:

CampoTipo
transportistastring
repartidorIdstring
porcentajeAvanceVisitadecimal
clientesVisitados, clientesAVisitarint
montoDeuda, montoCobrado, montoEntregadoCuentaCorrientedecimal
repartosEntregados, repartosRechazadosint

Mapas — /api/maps

GET /api/maps/delivery

Filtros + includeWithoutGps, includeWithoutActivity → MapaPuntoDto[]

CampoTipo
idVisitastring
codigoCliente, razonSocialstring
latitud, longituddecimal
estadostringENTREGA_COBRANZA, ENTREGA_SIN_COBRAR, PARCIAL, …
repartidorId, numeroHoja
gpsDesdeDireccionEntregabool

GET /api/maps/delivery/activities → MapaActividadDetalleDto[] (metadatos por visita para leyenda y orden)

GET /api/maps/delivery/visit/{visitId} → MapaVisitaDetalleDto (entrega, cobranza, ítems, pagos)

Configuración — /api/settings

GET /api/settings/backoffice

ConfiguracionBackOfficeDto

CampoTipo
tituloAplicacionstring
urlAplicacionExternastring?
motorBdstring?
gpsDistribuidorastring?
parametros[]id, valor, descripcion

Usuarios — /api/users Admin

Requiere JWT con claim admin=true.

DTOCampos principales
List / Detalleid, nombreUsuario, estado, esAdministrador, creadoEnUtc
CrearUsuarioRequestnombreUsuario, clave?, esAdministrador, estado?
ActualizarUsuarioRequestnombreUsuario?, clave?, estado?, esAdministrador?

Endpoints legacy (alias)

Misma implementación que catálogos, rutas alternativas:

Errores

CódigoUso
400Validación (mensaje en mensaje o error)
401No autenticado / token inválido / cuenta pendiente o inhabilitada
404Recurso no encontrado
409Conflicto (usuario duplicado)