Módulo Settings
src/app/modules/settings/
Configuración por tenant: idioma y zona horaria, horario de atención, auto-resolución de tickets, encuestas de satisfacción (CSAT) y mensajes programados. Hay un documento por tenant, que se crea con valores por defecto la primera vez que se lee o se actualiza.
Modelo — TenantSettings
Colección settings. tenantId es único. Cada sección es un subdocumento sin _id.
| Campo | Contenido (valor por defecto) |
|---|---|
tenantId | ObjectId → Tenant (único) |
general | language (es), timezone (America/Mexico_City) |
businessHours | enabled (false), sendAfterChatbot (false), useWabot (false), absenceMessage (vacío), days (lista vacía) |
autoResolution | enabled (false), sendFarewellMessage (true), resolveInMinutes (5), notifyInMinutes (1), notificationMessage (vacío), resolveInactiveWabot (false) |
csat | enabled, sendOnAutoResolve, sendAsInteractiveList, requestComment (todos false), requestMessage, thankYouMessage (vacíos), perRatingMessage (rating1 a rating5, vacíos) |
scheduledMessages | enabled (false), allowNotes (true), minLeadTimeMinutes (5), maxHorizonDays (30), maxPendingPerTicket (10), maxPendingPerAgent (50), onOwnerInactive (cancel), onTicketResolved (cancel), cancelledSystemMessage (vacío) |
Cada elemento de businessHours.days tiene day (monday a sunday), enabled (false), startTime (09:00) y endTime (18:00).
Endpoints
Base: /api/v1/settings. Controlador con @Auth() y PermissionsGuard.
| Método | Ruta | Permiso | Descripción |
|---|---|---|---|
GET | /settings/get-all | SETTINGS_READ | Devuelve el documento del tenant (data.results con un elemento); lo crea si no existe |
PATCH | /settings/general | SETTINGS_UPDATE | Reemplaza la sección general |
PATCH | /settings/attention/schedule | SETTINGS_UPDATE | Reemplaza businessHours |
PATCH | /settings/attention/auto-resolution | SETTINGS_UPDATE | Reemplaza autoResolution |
PATCH | /settings/attention/csat | SETTINGS_UPDATE | Reemplaza csat |
PATCH | /settings/attention/scheduled-messages | SETTINGS_UPDATE | Reemplaza scheduledMessages |
Todos los PATCH devuelven el documento completo actualizado en data. No hay parámetros de ruta ni de query en este módulo.
DTOs
Validaciones de class-validator. Ningún campo de estos DTO es opcional: cada PATCH reemplaza la sección completa, por lo que hay que enviar todos los campos.
UpdateGeneralDto (body de PATCH /settings/general)
| Campo | Tipo | Obligatorio | Validaciones | Descripción |
|---|---|---|---|---|
language | string | Sí | @IsString, @IsNotEmpty | Idioma de la interfaz del tenant |
timezone | string | Sí | @IsString, @IsNotEmpty | Zona horaria IANA; no se valida que sea una zona existente |
UpdateScheduleDto (body de PATCH /settings/attention/schedule)
| Campo | Tipo | Obligatorio | Validaciones | Descripción |
|---|---|---|---|---|
enabled | boolean | Sí | @IsBoolean | Activa el horario de atención |
sendAfterChatbot | boolean | Sí | @IsBoolean | Envía el mensaje de ausencia después del chatbot |
useWabot | boolean | Sí | @IsBoolean | Integración con Wabot |
absenceMessage | string | Sí | @IsString | Mensaje fuera de horario |
days | BusinessHoursDayDto[] | Sí | @IsArray, @ValidateNested({ each: true }), @Type | Configuración por día |
BusinessHoursDayDto:
| Campo | Tipo | Obligatorio | Validaciones | Descripción |
|---|---|---|---|---|
day | string | Sí | @IsEnum: monday, tuesday, wednesday, thursday, friday, saturday, sunday | Día de la semana |
enabled | boolean | Sí | @IsBoolean | Día laborable |
startTime | string | Sí | @IsString | Hora de inicio, formato HH:mm; el formato no se valida |
endTime | string | Sí | @IsString | Hora de fin, formato HH:mm; el formato no se valida |
UpdateAutoResolutionDto (body de PATCH /settings/attention/auto-resolution)
| Campo | Tipo | Obligatorio | Validaciones | Descripción |
|---|---|---|---|---|
enabled | boolean | Sí | @IsBoolean | Activa la auto-resolución |
sendFarewellMessage | boolean | Sí | @IsBoolean | Envía mensaje de despedida |
resolveInMinutes | number | Sí | @IsInt, @Min(1) | Minutos de inactividad hasta resolver |
notifyInMinutes | number | Sí | @IsInt, @Min(1) | Minutos de aviso previo |
notificationMessage | string | Sí | @IsString | Texto del aviso |
resolveInactiveWabot | boolean | Sí | @IsBoolean | Resuelve también tickets inactivos de Wabot |
UpdateCsatDto (body de PATCH /settings/attention/csat)
| Campo | Tipo | Obligatorio | Validaciones | Descripción |
|---|---|---|---|---|
enabled | boolean | Sí | @IsBoolean | Activa la encuesta |
sendOnAutoResolve | boolean | Sí | @IsBoolean | Envía la encuesta al auto-resolver |
sendAsInteractiveList | boolean | Sí | @IsBoolean | Envía como lista interactiva |
requestMessage | string | Sí | @IsString | Texto de la solicitud |
thankYouMessage | string | Sí | @IsString | Texto de agradecimiento |
requestComment | boolean | Sí | @IsBoolean | Solicita comentario |
perRatingMessage | PerRatingMessageDto | Sí | @ValidateNested, @Type | Mensaje por calificación |
PerRatingMessageDto: rating1, rating2, rating3, rating4, rating5; todos string, obligatorios, @IsString (se admite cadena vacía).
UpdateScheduledMessagesDto (body de PATCH /settings/attention/scheduled-messages)
| Campo | Tipo | Obligatorio | Validaciones | Descripción |
|---|---|---|---|---|
enabled | boolean | Sí | @IsBoolean | Habilita los mensajes programados del tenant |
allowNotes | boolean | Sí | @IsBoolean | Permite programar notas internas |
minLeadTimeMinutes | number | Sí | @IsInt, @Min(0) | Anticipación mínima |
maxHorizonDays | number | Sí | @IsInt, @Min(1) | Horizonte máximo en días |
maxPendingPerTicket | number | Sí | @IsInt, @Min(1) | Máximo de pendientes por ticket |
maxPendingPerAgent | number | Sí | @IsInt, @Min(1) | Máximo de pendientes por agente |
onOwnerInactive | string | Sí | @IsIn: cancel, send | Acción si el agente propietario queda inactivo |
onTicketResolved | string | Sí | @IsIn: cancel, send | Acción si el ticket se resuelve |
cancelledSystemMessage | string | Sí | @IsString | Mensaje de sistema al cancelar |
Servicios
TenantSettingsService:getOrCreate(crea el documento con los valores por defecto si no existe) y unupdate*por sección, que usafindOneAndUpdatesobre{ tenantId }reemplazando la sección completa.BusinessHoursEvaluatorService: determina si una fecha cae dentro del horario del día, en la zona horaria del tenant (Luxon). ComparastartTime <= hora actual < endTime. Un rango constartTimemayor queendTimese trata como vacío (nunca dentro de horario); no hay soporte para rangos que cruzan la medianoche.AutoResolutionPrecedenceService: elige la configuración de auto-resolución efectiva: la del departamento sioverrideGlobalResolutionestrue, y la del tenant en caso contrario (ver Departments).
Consumidores
TenantSettingsService y los evaluadores los usan, entre otros, ticket (resolución e inactividad), chat (gateway), whatsapp, meta, message (pipeline de entrada), scheduled-message y user (get-me).
Gotchas
- Los
PATCHreemplazan la sección completa: omitir un campo obligatorio devuelve400, y no existe actualización parcial. get-meexpone sololanguage,timezoneyscheduledMessagesEnableda cualquier usuario autenticado; el resto exigeSETTINGS_READ(ver User).- Los valores por defecto de idioma y zona horaria están fijados en el modelo (
es,America/Mexico_City).