Modelo De Datos
La entidad principal es Customer. Se persiste en MongoDB en la colección customers.
Entidad Customer
| Campo | Tipo | Obligatoriedad | Descripción |
|---|---|---|---|
id |
string |
Sistema | ID generado por MongoDB |
tenantId |
string |
Obligatorio | Identificador del tenant propietario |
firstName |
string |
Obligatorio | Nombre del cliente |
lastName |
string |
Obligatorio | Apellido del cliente |
email |
string |
Obligatorio | Email del cliente |
phone |
string |
Obligatorio | Teléfono |
city |
string |
Obligatorio | Ciudad |
status |
active o inactive |
Obligatorio | Estado del cliente |
segment |
general, frequent o vip |
Obligatorio | Segmento comercial |
notes |
string |
Opcional | Notas internas |
totalOrders |
number |
Sistema | Contador de órdenes, inicia en 0 |
registeredAt |
string |
Sistema | Fecha de registro en ISO 8601 |
updatedAt |
string |
Sistema | Fecha de última actualización en ISO 8601 |
allowCredit |
boolean |
Opcional | Indica si el cliente tiene crédito permitido |
Campos Obligatorios Por Operación
Creación
| Campo | Obligatorio | Regla |
|---|---|---|
tenantId |
Si | String no vacío, máximo 80 caracteres |
firstName |
Si | String no vacío, máximo 80 caracteres |
lastName |
Si | String no vacío, máximo 80 caracteres |
email |
Si | Debe tener formato de email |
phone |
Si | String no vacío, máximo 30 caracteres |
city |
Si | String no vacío, máximo 80 caracteres |
status |
Si | Sólo active o inactive |
segment |
Si | Sólo general, frequent o vip |
notes |
No | Opcional, máximo 500 caracteres |
allowCredit |
No | Opcional; si no se envía, se guarda false |
Actualización
| Campo | Obligatorio | Regla |
|---|---|---|
tenantId |
Si, como query param | Necesario para localizar el cliente del tenant |
firstName |
No | Opcional, máximo 80 caracteres |
lastName |
No | Opcional, máximo 80 caracteres |
email |
No | Opcional; debe tener formato de email si se envía |
phone |
No | Opcional, máximo 30 caracteres |
city |
No | Opcional, máximo 80 caracteres |
status |
No | Opcional; sólo active o inactive |
segment |
No | Opcional; sólo general, frequent o vip |
notes |
No | Opcional, máximo 500 caracteres |
allowCredit |
No | Opcional |
Operaciones Por ID
Las operaciones GET /customers/:id, PATCH /customers/:id/orders/increment y DELETE /customers/:id requieren tenantId como query param. Si no se envía o viene vacío, la API responde BadRequestException con el mensaje tenantId is required.
Schema Mongoose
Campos requeridos en persistencia:
tenantIdfirstNamelastNameemailphonecitystatussegmentregisteredAtupdatedAtallowCredit
Campos con default:
| Campo | Default |
|---|---|
notes |
'' |
totalOrders |
0 |
allowCredit |
false |
Reglas De Normalización
En creación:
tenantId,firstName,lastName,phone,cityynotesse guardan contrim().emailse guarda en minúsculas.totalOrdersinicia en0.registeredAtyupdatedAtse asignan con la fecha actual.allowCreditusafalsesi no se envía.
En actualización:
- Sólo se actualizan los campos enviados.
- Los campos string enviados se normalizan con
trim(). emailse guarda en minúsculas.updatedAtse actualiza con la fecha actual.
Búsqueda
El listado por tenant acepta search. Cuando se envía, el repositorio usa una expresión regular case-insensitive sobre:
firstNamelastNameemailphonecity
Los resultados se ordenan por registeredAt descendente.