Saltar a contenido

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:

  • tenantId
  • name
  • contactName
  • email
  • phone
  • status
  • requiresInvoice

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, phone y campos similares se guardan con trim().
  • email y billingEmail se guardan en minúsculas.
  • taxId se guarda en mayúsculas.
  • leadTimeDays usa 0 si no se envía.
  • website, paymentTerms y notes usan cadena vacía si no se envían.

En actualización:

  • Sólo se reemplazan los campos enviados.
  • Si requiresInvoice queda en false, los campos fiscales se limpian.
  • Si no existe el proveedor con esa combinación de id y tenantId, se lanza NotFoundException.

Búsqueda

El listado por tenant acepta search. Cuando se envía, el repositorio usa una expresión regular case-insensitive sobre:

  • name
  • contactName
  • email
  • phone
  • taxId

Los resultados se ordenan por createdAt descendente.