Saltar al contenido
CRM Postventa documentación

Arquitectura

Base de datos

Base de datos

PostgreSQL 18. 38 tablas · 34 tipos enumerados · 23 triggers · 153 índices · 3 vistas, en 13 migraciones.

Los enums son el contrato

Los mismos valores viven en tres sitios:

CapaForma
Basesnake_caseen_proceso
GraphQLSCREAMING_SNAKEEN_PROCESO
Tokens de diseñocamelCaseenProceso

En Rust se declaran una sola vez con una macro que deriva a la vez sqlx::Type y async_graphql::Enum, de modo que las dos representaciones no pueden divergir. En el front, la traducción existe una sola vez en enumToTokenKey.

Añadir un estado nuevo obliga a tocar los tres. Eso es deliberado.

Los triggers que hacen el trabajo

TriggerQué hace
tickets_set_slaFija los vencimientos al crear, y los recalcula al cambiar la prioridad
tickets_statusCierra tiempos al resolver, marca el FCR, gestiona reaperturas
ticket_events_applyLa primera respuesta pública fija el TPA
work_logs_accumulateAcumula el tiempo de atención operativa
sales_refresh_customerRecalcula valor de vida, segmento y estado del cliente
warranties_syncDeriva la fecha de fin y sincroniza el estado
messages_touch_conversationResumen de la bandeja y ventana de 24 h

Las vistas

  • v_tickets_enriched — tickets con SLA en vivo, para que web y móvil no calculen «le quedan 40 minutos» cada una a su manera
  • v_customers_enriched — resumen para la ficha 360°
  • v_agent_workload — carga por asesor, alimenta el reparto automático

Un fallo real que enseña algo

La migración 0009 asignaba literales sin tipo a una columna de tipo enumerado. PostgreSQL resolvía la expresión como text y el UPDATE fallaba.

Estaba latente: el trigger sólo corre al insertar una venta, y el esquema se validó sin ninguna. Con eso, registrar la primera venta era imposible — habría aparecido el primer día de uso real.

Corregido en 0012, con la corrección en una migración nueva y no editando la 0009, porque cambiar una migración ya aplicada altera su checksum.

Ver Bitácora de hallazgos.

Enlazan aquí