API Clientes SAP HANA

API REST para gestión centralizada de clientes del grupo en SAP Business One. Permite buscar, contar, consultar metadatos de columnas y crear/actualizar clientes en una, varias o todas las sociedades.

https://netred.fzc.cl/clientes

¿Quieres probar los endpoints? Usa el Playground (/clientes/playground).

Todos los endpoints /api/* requieren autenticación mediante Bearer Token y están sujetos a rate limiting. Las respuestas se entregan en application/json.

Base central y sociedades

Los clientes se mantienen en una base central (Azure SQL) que se sincroniza en ambos sentidos con las sociedades SAP configuradas en setup.json:

Presencia por sociedad

La API lee y escribe sólo en la base central. No usa HANA ni Service Layer como respaldo: si la base central no está disponible, responde 503. La réplica hacia SAP la hace el proceso de sincronización (cada sync.intervalSeconds, o al momento con POST /clientes/api/sync/ejecutar).

El parámetro sociedad acepta vacío o todas (todas las activas) o una lista separada por comas, por ejemplo PRDFRUZCO,PRDMBFF.

Autenticación

Todos los endpoints /api/* requieren un token de acceso en el header Authorization:

Authorization: Bearer <tu-token>

Configuración de tokens

Los tokens se configuran mediante la variable de entorno API_TOKENS (separados por coma):

API_TOKENS=token1,token2,token3

Si no se configura ningún token, el servidor genera uno aleatorio al iniciar y lo muestra en los logs.

Respuestas de error

CódigoSituación
401No se envió el header Authorization o formato incorrecto
403Token inválido

Ejemplo con cURL

curl -H "Authorization: Bearer abc123..." \
     https://netred.fzc.cl/clientes/api/clientes?limit=10

Rate Limiting

Las peticiones están limitadas por dirección IP. Por defecto: 60 peticiones por minuto. Configurable vía la variable de entorno RATE_LIMIT.

Headers de respuesta

HeaderDescripción
X-RateLimit-LimitMáximo de peticiones por ventana
X-RateLimit-RemainingPeticiones restantes en la ventana actual
X-RateLimit-ResetTimestamp Unix de reinicio de la ventana
Retry-AfterSegundos de espera (solo cuando se excede el límite)

Respuesta al exceder el límite

HTTP/1.1 429 Too Many Requests
Retry-After: 42

{"error": "Límite de peticiones excedido. Intenta más tarde."}

Endpoints — Clientes

▶ GET /clientes/api/clientes Buscar clientes

Retorna una lista paginada de clientes de una o varias sociedades. Soporta filtros parciales por código, nombre y teléfono. Por defecto solo muestra clientes TPV (CardType = 'C' y U_GSP_SENDTPV = 'Y'). Con base central cada cliente aparece una vez con sus sociedades; sin ella, un registro por sociedad.

Parámetros de consulta

NombreTipoRequeridoDescripción
sociedad string opcional Sociedad(es) separadas por coma. Vacío o todas = todas las activas
cardCode string opcional Filtro parcial por código de cliente (LIKE %valor%)
nombre string opcional Filtro parcial por nombre, case-insensitive
telefono string opcional Filtro parcial por teléfono
soloActivos string opcional Filtrar solo clientes TPV. Por defecto "1". Enviar "0" para incluir todos los clientes
limit integer opcional Máximo de registros (1–5000). Default: 100
offset integer opcional Registros a omitir para paginación. Default: 0

Headers de respuesta

HeaderDescripción
X-Total-CountCantidad de registros retornados en la página

Ejemplo de petición

GET /clientes/api/clientes?nombre=ALIMENTOS&limit=50&offset=0 HTTP/1.1
Host: netred.fzc.cl
Authorization: Bearer <tu-token>

Ejemplo de respuesta — 200

[
  {
    "cardCode": "C00001",
    "cardName": "ALIMENTOS DEL SUR S.A.",
    "cardType": "C",
    "phone1": "+56912345678",
    "address": "Av. Principal 100, Santiago",
    "email": "contacto@empresa.cl",
    "licTradNum": "79921330-3",
    "sendTpv": "Y",
    "qryGroup2": "N",
    "sociedades": ["PRDFABALFRIO", "PRDFRUZCO"]
  }
]

Códigos de respuesta

200 OK 400 Bad Request 405 Method Not Allowed 500 Internal Server Error 503 Service Unavailable
▶ GET /clientes/api/clientes/count Contar clientes

Retorna el total de clientes (CardType = 'C') de las sociedades indicadas. Por defecto solo clientes TPV. Con base central cuenta clientes únicos; sin ella, registros por sociedad.

Parámetros de consulta

NombreTipoRequeridoDescripción
sociedad string opcional Sociedad(es) separadas por coma. Vacío o todas = todas las activas
soloActivos string opcional Enviar "0" para incluir todos los clientes. Por defecto solo clientes TPV

Ejemplo de respuesta — 200

{
  "count": 4523
}

Códigos de respuesta

200 OK 500 Internal Server Error 503 Service Unavailable
▶ POST /clientes/api/clientes/guardar Crear o actualizar cliente

Guarda la ficha sólo en la base central y deja pendiente su réplica en las sociedades destino. No escribe en SAP: el proceso de sincronización la envía después por Service Layer (BusinessPartners), respetando las validaciones de SAP.

  • Si isNew = true: crea el socio con CardType = cCustomer, Properties2 = tYES (HORECA) y U_GSP_SENDTPV (por defecto Y). Sin sociedades se crea en todas las activas.
  • Si isNew = false: actualiza nombre, teléfono, dirección, email, RUT y U_GSP_SENDTPV. Sin sociedades se actualiza donde ya existe.
  • Con sociedades se aplica sólo en esas, creando el cliente donde no exista.
  • La respuesta lista las sociedades del cliente con su estado de réplica (pendiente) y la accion que hará el proceso: crear o actualizar.
  • Si el envío a SAP falla, se reintenta en cada ciclo (hasta 5 veces; luego error). Ver GET /clientes/api/sync/estado.

Body (JSON)

CampoTipoRequeridoDescripción
cardCode string requerido Código único del cliente
cardName string requerido Nombre o razón social
phone1 string|null opcional Teléfono principal
address string|null opcional Dirección
email string|null opcional Correo electrónico
licTradNum string|null opcional RUT
sendTpv string opcional Enviar al TPV, Y o N. Default: Y
isNew boolean opcional true = crear nuevo, false = actualizar
sociedades string[] opcional Sociedades destino. Vacío = todas (alta) o donde ya existe (actualización)

Ejemplo — Crear cliente

POST /clientes/api/clientes/guardar HTTP/1.1
Host: netred.fzc.cl
Authorization: Bearer <tu-token>
Content-Type: application/json

{
  "cardCode": "C99999999-9",
  "cardName": "NUEVA EMPRESA S.A.",
  "phone1": "+56912345678",
  "address": "Calle Ejemplo 123, Santiago",
  "isNew": true
}

Respuesta — 201 Created

{
  "status": "created",
  "cardCode": "C99999999-9",
  "sociedades": [
    { "cardCode": "C99999999-9", "sociedad": "PRDFRUZCO", "estado": "pendiente", "accion": "crear" },
    { "cardCode": "C99999999-9", "sociedad": "PRDMBFF", "estado": "pendiente", "accion": "crear" }
  ]
}

Ejemplo — Actualizar cliente

POST /clientes/api/clientes/guardar HTTP/1.1
Host: netred.fzc.cl
Authorization: Bearer <tu-token>
Content-Type: application/json

{
  "cardCode": "C00001",
  "cardName": "EMPRESA ACTUALIZADA S.A.",
  "phone1": "+56987654321",
  "address": "Av. Nueva 456, Valparaíso",
  "isNew": false
}

Respuesta — 200 OK

{
  "status": "updated",
  "cardCode": "C00001",
  "sociedades": [
    { "cardCode": "C00001", "sociedad": "PRDFRUZCO", "estado": "pendiente", "accion": "actualizar" }
  ]
}

Códigos de respuesta

200 OK 201 Created 400 Bad Request 404 Not Found 405 Method Not Allowed 409 Conflict 503 Service Unavailable
▶ PUT /clientes/api/clientes/guardar Crear o actualizar cliente (alias PUT)

Mismo comportamiento que POST /clientes/api/clientes/guardar. Acepta el mismo body y retorna las mismas respuestas.

Endpoints — Metadata

▶ GET /clientes/api/clientes/columnas Listar columnas de OCRD

Retorna la definición de columnas de la tabla de clientes de una sociedad (parámetro sociedad; si se indican varias, se usa la primera). Útil para inspeccionar la estructura del esquema.

Ejemplo de respuesta — 200

[
  {
    "name": "CardCode",
    "type": "NVARCHAR",
    "length": 15,
    "nullable": "FALSE"
  },
  {
    "name": "CardName",
    "type": "NVARCHAR",
    "length": 100,
    "nullable": "TRUE"
  }
]

Códigos de respuesta

200 OK 500 Internal Server Error 503 Service Unavailable

Endpoints — Sincronización

▶ GET /clientes/api/sociedades Listar sociedades

Sociedades configuradas en setup.json. Con base central incluye clientes, envíos pendientes y envíos con error por sociedad.

[
  { "schema": "PRDFRUZCO", "nombre": "FRUZCO CHILE S.A.", "activa": true,
    "clientes": 5546, "pendientes": 0, "errores": 0 }
]
▶ GET /clientes/api/sync/estado Estado de la sincronización

Por sociedad: última marca leída (YYYYMMDDHHMMSS), si terminó la carga inicial, última ejecución y último error. Incluye los últimos 50 envíos en estado error.

▶ POST /clientes/api/sync/ejecutar Ejecutar sincronización ahora

Lanza un ciclo en segundo plano y responde 202 con status iniciado o en_curso. Con ?reintentarErrores=1, los envíos en error vuelven a pendiente.

Modelo — Cliente

Cliente

CampoTipoNullableDescripción
cardCodestringNoCódigo único del cliente
cardNamestringNoNombre o razón social
cardTypestringNoTipo de tarjeta (C = Cliente)
phone1stringSíTeléfono principal
addressstringSíDirección
emailstringSíCorreo electrónico (E_Mail)
licTradNumstringSíRUT
sendTpvstringNoEnviar al TPV, U_GSP_SENDTPV (Y/N)
qryGroup2stringNoPropiedad 2 de SAP: HORECA (Y/N)
sociedadesstring[]NoSociedades donde existe el cliente

Modelo — GuardarClienteRequest

GuardarClienteRequest

CampoTipoRequeridoDescripción
cardCodestringsíCódigo único del cliente
cardNamestringsíNombre o razón social
phone1string|nullnoTeléfono principal
addressstring|nullnoDirección
emailstring|nullnoCorreo electrónico
licTradNumstring|nullnoRUT
sendTpvstringnoEnviar al TPV (Y/N). Default Y
isNewbooleannotrue = crear, false = actualizar
sociedadesstring[]noSociedades destino

Modelo — Columna

Columna

CampoTipoDescripción
namestringNombre de la columna
typestringTipo de dato en HANA
lengthintegerLongitud del campo
nullablestringSi admite nulos (TRUE/FALSE)

Notas adicionales

Dominio público: https://netred.fzc.cl/clientes

CORS: Todos los endpoints aceptan preflight OPTIONS. Orígenes permitidos: https://netred.fzc.cl, http://netred.fzc.cl y subdominios de *.fzc.cl.

Configuración (setup.json): puerto HTTP (port, por defecto 1982), credenciales de HANA, Service Layer y base central (Azure SQL), lista de sociedades activas y parámetros de sincronización.

Variables de entorno:
• SETUP_FILE — Ruta alternativa a setup.json
• API_TOKENS — Tokens de acceso separados por coma
• RATE_LIMIT — Peticiones por minuto por IP (default: 60)

API Clientes SAP · v2.0.0 · netred.fzc.cl/clientes · https://evol.cl