Modelo de Datos
La entidad principal es Supplier. Se persiste en MongoDB en la colección suppliers mediante Mongoose.
Entidad Supplier
| Campo | Tipo | Obligatoriedad | Descripción |
|---|---|---|---|
id |
string |
Sistema | ID generado por MongoDB |
tenantId |
string |
Obligatorio | Identificador del tenant propietario |
name |
string |
Obligatorio | Nombre comercial del proveedor |
contactName |
string |
Obligatorio | Nombre de contacto |
email |
string |
Obligatorio | Email principal |
phone |
string |
Obligatorio | Teléfono |
status |
active o inactive |
Obligatorio | Estado operativo |
requiresInvoice |
boolean |
Obligatorio | Indica si requiere datos fiscales |
legalName |
string |
Condicional | Obligatorio cuando requiresInvoice es true |
taxId |
string |
Condicional | Obligatorio cuando requiresInvoice es true |
taxRegime |
string |
Condicional | Obligatorio cuando requiresInvoice es true |
billingEmail |
string |
Condicional | Obligatorio cuando requiresInvoice es true |
fiscalAddress |
string |
Condicional | Obligatorio cuando requiresInvoice es true |
postalCode |
string |
Condicional | Obligatorio cuando requiresInvoice es true |
website |
string |
Opcional | Sitio web |
paymentTerms |
string |
Opcional | Condiciones de pago |
leadTimeDays |
number |
Opcional | Tiempo de entrega en días |
notes |
string |
Opcional | Notas internas |
createdAt |
string |
Sistema | Fecha de creación en ISO 8601 |
updatedAt |
string |
Sistema | Fecha de actualización en ISO 8601 |
Campos Obligatorios Por Operación
Creación
| Campo | Obligatorio | Regla |
|---|---|---|
tenantId |
Si | Debe ser string |
name |
Si | Debe ser string |
contactName |
Si | Debe ser string |
email |
Si | Debe tener formato de email |
phone |
Si | Debe ser string |
status |
Si | Sólo active o inactive |
requiresInvoice |
Si | Booleano; el DTO transforma true y "true" a true |
legalName |
Condicional | Requerido si requiresInvoice es true |
taxId |
Condicional | Requerido si requiresInvoice es true |
taxRegime |
Condicional | Requerido si requiresInvoice es true |
billingEmail |
Condicional | Requerido si requiresInvoice es true; debe tener formato de email |
fiscalAddress |
Condicional | Requerido si requiresInvoice es true |
postalCode |
Condicional | Requerido si requiresInvoice es true |
website |
No | Opcional |
paymentTerms |
No | Opcional |
leadTimeDays |
No | Opcional; entero entre 0 y 365 |
notes |
No | Opcional |
Actualización
| Campo | Obligatorio | Regla |
|---|---|---|
tenantId |
Si | Necesario para localizar el proveedor del tenant |
name |
No | Opcional |
contactName |
No | Opcional |
email |
No | Opcional; debe tener formato de email si se envía |
phone |
No | Opcional |
status |
No | Opcional; sólo active o inactive |
requiresInvoice |
No | Opcional |
legalName |
Condicional | Requerido por validación si requiresInvoice se envía como true |
taxId |
Condicional | Requerido por validación si requiresInvoice se envía como true |
taxRegime |
Condicional | Requerido por validación si requiresInvoice se envía como true |
billingEmail |
Condicional | Requerido por validación si requiresInvoice se envía como true; debe tener formato de email |
fiscalAddress |
Condicional | Requerido por validación si requiresInvoice se envía como true |
postalCode |
Condicional | Requerido por validación si requiresInvoice se envía como true |
website |
No | Opcional |
paymentTerms |
No | Opcional |
leadTimeDays |
No | Opcional; entero entre 0 y 365 |
notes |
No | Opcional |
Schema Mongoose
La colección usa timestamps automáticos y define estos campos requeridos en persistencia:
tenantIdnamecontactNameemailphonestatusrequiresInvoice
Los campos fiscales y opcionales tienen valor por defecto, por lo general cadena vacía o 0.
Indices definidos:
| Indice | Uso |
|---|---|
tenantId |
Filtrado por tenant |
{ tenantId: 1, name: 1 } |
Consultas por tenant y nombre |
Reglas de Normalización
En creación:
name,contactName,phoney campos similares se guardan contrim().emailybillingEmailse guardan en minúsculas.taxIdse guarda en mayúsculas.leadTimeDaysusa0si no se envía.website,paymentTermsynotesusan cadena vacía si no se envían.
En actualización:
- Sólo se reemplazan los campos enviados.
- Si
requiresInvoicequeda enfalse, los campos fiscales se limpian. - Si no existe el proveedor con esa combinación de
idytenantId, se lanzaNotFoundException.
Búsqueda
El listado por tenant acepta search. Cuando se envía, el repositorio usa una expresión regular case-insensitive sobre:
namecontactNameemailphonetaxId
Los resultados se ordenan por createdAt descendente.