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.
¿Quieres probar los endpoints? Usa el Playground (/clientes/playground).
/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:
- SAP → central: cada
sync.intervalSecondsse leen los cambios deOCRDporUpdateDate/UpdateTS. - Central → SAP: las altas y cambios se envían por Service Layer (
BusinessPartners). - Si un mismo
CardCodecambia en dos lugares, gana el cambio más reciente. - Con
sync.propagarEntreSociedades = true, un cambio hecho en una sociedad se replica en las demás donde existe el cliente. - En la carga inicial de cada sociedad no se reescribe SAP: las diferencias históricas se mantienen hasta el próximo cambio.
- Carga inicial: se lee primero la
sociedadPrincipal(PRDFRUZCO) y luego las demás. Un cliente ya existente no se sobrescribe; sólo se registra en qué sociedades está y si sus datos difieren. ElCardCodeidentifica al cliente, sin distinguir mayúsculas (-ky-Kson el mismo).
Presencia por sociedad
GET /clientes/api/clientes/cobertura: por sociedad, clientes presentes, faltantes y con datos distintos; y cuántos clientes están en 1, 2, … sociedades.GET /clientes/api/clientes?sociedad=PRDFRUZCO&faltaEn=PRDMBFF: clientes de Fruzco que no están en Franquicias. Cada cliente traesociedades,faltaEnydifiereEn.GET /clientes/api/clientes?difiere=1: clientes con datos distintos entre sociedades.GET /clientes/api/clientes/duplicados: RUT registrados con más de un CardCode.
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ódigo | Situación |
|---|---|
| 401 | No se envió el header Authorization o formato incorrecto |
| 403 | Token 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
| Header | Descripción |
|---|---|
X-RateLimit-Limit | Máximo de peticiones por ventana |
X-RateLimit-Remaining | Peticiones restantes en la ventana actual |
X-RateLimit-Reset | Timestamp Unix de reinicio de la ventana |
Retry-After | Segundos 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
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
| Nombre | Tipo | Requerido | Descripció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
| Header | Descripción |
|---|---|
X-Total-Count | Cantidad 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
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
| Nombre | Tipo | Requerido | Descripció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
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 conCardType = cCustomer,Properties2 = tYES(HORECA) yU_GSP_SENDTPV(por defectoY). Sinsociedadesse crea en todas las activas. - Si
isNew = false: actualiza nombre, teléfono, dirección, email, RUT yU_GSP_SENDTPV. Sinsociedadesse actualiza donde ya existe. - Con
sociedadesse 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 laaccionque hará el proceso:crearoactualizar. - Si el envío a SAP falla, se reintenta en cada ciclo (hasta 5 veces; luego
error). VerGET /clientes/api/sync/estado.
Body (JSON)
| Campo | Tipo | Requerido | Descripció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
Mismo comportamiento que POST /clientes/api/clientes/guardar.
Acepta el mismo body y retorna las mismas respuestas.
Endpoints — Metadata
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
Endpoints — Sincronización
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 }
]
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.
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
| Campo | Tipo | Nullable | Descripción |
|---|---|---|---|
cardCode | string | No | Código único del cliente |
cardName | string | No | Nombre o razón social |
cardType | string | No | Tipo de tarjeta (C = Cliente) |
phone1 | string | Sí | Teléfono principal |
address | string | Sí | Dirección |
email | string | Sí | Correo electrónico (E_Mail) |
licTradNum | string | Sí | RUT |
sendTpv | string | No | Enviar al TPV, U_GSP_SENDTPV (Y/N) |
qryGroup2 | string | No | Propiedad 2 de SAP: HORECA (Y/N) |
sociedades | string[] | No | Sociedades donde existe el cliente |
Modelo — GuardarClienteRequest
GuardarClienteRequest
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
cardCode | string | sí | Código único del cliente |
cardName | string | sí | Nombre o razón social |
phone1 | string|null | no | Teléfono principal |
address | string|null | no | Dirección |
email | string|null | no | Correo electrónico |
licTradNum | string|null | no | RUT |
sendTpv | string | no | Enviar al TPV (Y/N). Default Y |
isNew | boolean | no | true = crear, false = actualizar |
sociedades | string[] | no | Sociedades destino |
Modelo — Columna
Columna
| Campo | Tipo | Descripción |
|---|---|---|
name | string | Nombre de la columna |
type | string | Tipo de dato en HANA |
length | integer | Longitud del campo |
nullable | string | Si admite nulos (TRUE/FALSE) |
Notas adicionales
https://netred.fzc.cl/clientesCORS: 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