Skip to main content

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.

CampoContenido (valor por defecto)
tenantIdObjectId → Tenant (único)
generallanguage (es), timezone (America/Mexico_City)
businessHoursenabled (false), sendAfterChatbot (false), useWabot (false), absenceMessage (vacío), days (lista vacía)
autoResolutionenabled (false), sendFarewellMessage (true), resolveInMinutes (5), notifyInMinutes (1), notificationMessage (vacío), resolveInactiveWabot (false)
csatenabled, sendOnAutoResolve, sendAsInteractiveList, requestComment (todos false), requestMessage, thankYouMessage (vacíos), perRatingMessage (rating1 a rating5, vacíos)
scheduledMessagesenabled (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étodoRutaPermisoDescripción
GET/settings/get-allSETTINGS_READDevuelve el documento del tenant (data.results con un elemento); lo crea si no existe
PATCH/settings/generalSETTINGS_UPDATEReemplaza la sección general
PATCH/settings/attention/scheduleSETTINGS_UPDATEReemplaza businessHours
PATCH/settings/attention/auto-resolutionSETTINGS_UPDATEReemplaza autoResolution
PATCH/settings/attention/csatSETTINGS_UPDATEReemplaza csat
PATCH/settings/attention/scheduled-messagesSETTINGS_UPDATEReemplaza 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)​

CampoTipoObligatorioValidacionesDescripción
languagestringSí@IsString, @IsNotEmptyIdioma de la interfaz del tenant
timezonestringSí@IsString, @IsNotEmptyZona horaria IANA; no se valida que sea una zona existente

UpdateScheduleDto (body de PATCH /settings/attention/schedule)​

CampoTipoObligatorioValidacionesDescripción
enabledbooleanSí@IsBooleanActiva el horario de atención
sendAfterChatbotbooleanSí@IsBooleanEnvía el mensaje de ausencia después del chatbot
useWabotbooleanSí@IsBooleanIntegración con Wabot
absenceMessagestringSí@IsStringMensaje fuera de horario
daysBusinessHoursDayDto[]Sí@IsArray, @ValidateNested({ each: true }), @TypeConfiguración por día

BusinessHoursDayDto:

CampoTipoObligatorioValidacionesDescripción
daystringSí@IsEnum: monday, tuesday, wednesday, thursday, friday, saturday, sundayDía de la semana
enabledbooleanSí@IsBooleanDía laborable
startTimestringSí@IsStringHora de inicio, formato HH:mm; el formato no se valida
endTimestringSí@IsStringHora de fin, formato HH:mm; el formato no se valida

UpdateAutoResolutionDto (body de PATCH /settings/attention/auto-resolution)​

CampoTipoObligatorioValidacionesDescripción
enabledbooleanSí@IsBooleanActiva la auto-resolución
sendFarewellMessagebooleanSí@IsBooleanEnvía mensaje de despedida
resolveInMinutesnumberSí@IsInt, @Min(1)Minutos de inactividad hasta resolver
notifyInMinutesnumberSí@IsInt, @Min(1)Minutos de aviso previo
notificationMessagestringSí@IsStringTexto del aviso
resolveInactiveWabotbooleanSí@IsBooleanResuelve también tickets inactivos de Wabot

UpdateCsatDto (body de PATCH /settings/attention/csat)​

CampoTipoObligatorioValidacionesDescripción
enabledbooleanSí@IsBooleanActiva la encuesta
sendOnAutoResolvebooleanSí@IsBooleanEnvía la encuesta al auto-resolver
sendAsInteractiveListbooleanSí@IsBooleanEnvía como lista interactiva
requestMessagestringSí@IsStringTexto de la solicitud
thankYouMessagestringSí@IsStringTexto de agradecimiento
requestCommentbooleanSí@IsBooleanSolicita comentario
perRatingMessagePerRatingMessageDtoSí@ValidateNested, @TypeMensaje 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)​

CampoTipoObligatorioValidacionesDescripción
enabledbooleanSí@IsBooleanHabilita los mensajes programados del tenant
allowNotesbooleanSí@IsBooleanPermite programar notas internas
minLeadTimeMinutesnumberSí@IsInt, @Min(0)Anticipación mínima
maxHorizonDaysnumberSí@IsInt, @Min(1)Horizonte máximo en días
maxPendingPerTicketnumberSí@IsInt, @Min(1)Máximo de pendientes por ticket
maxPendingPerAgentnumberSí@IsInt, @Min(1)Máximo de pendientes por agente
onOwnerInactivestringSí@IsIn: cancel, sendAcción si el agente propietario queda inactivo
onTicketResolvedstringSí@IsIn: cancel, sendAcción si el ticket se resuelve
cancelledSystemMessagestringSí@IsStringMensaje de sistema al cancelar

Servicios​

  • TenantSettingsService: getOrCreate (crea el documento con los valores por defecto si no existe) y un update* por sección, que usa findOneAndUpdate sobre { 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). Compara startTime <= hora actual < endTime. Un rango con startTime mayor que endTime se 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 si overrideGlobalResolution es true, 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 PATCH reemplazan la sección completa: omitir un campo obligatorio devuelve 400, y no existe actualización parcial.
  • get-me expone solo language, timezone y scheduledMessagesEnabled a cualquier usuario autenticado; el resto exige SETTINGS_READ (ver User).
  • Los valores por defecto de idioma y zona horaria están fijados en el modelo (es, America/Mexico_City).