Catálogo de Funcionalidades
Todo lo que tiene Quotery, organizado por etapa. Del PDF del cliente al pedido entregado.
Capturar — Convierta solicitudes de clientes en cotizaciones estructuradas
La IA lee documentos de clientes y cruza cada línea con su catálogo de productos. Lo que tomaba 20 minutos ahora toma menos de 60 segundos.
Importación de Cotización por IA
Pipeline de IA en 3 llamadas
VentasExtracción de estructura, cruce de productos y resumen — tres llamadas secuenciales de IA en una única transacción atómica.
- Llamada A: Extrae grupos, secciones y líneas de texto no estructurado usando salidas estructuradas de IA
- Llamada B: Decisión paralela por lotes de IA — hasta 6 workers concurrentes eligiendo entre 15 candidatos
- Llamada C: Banner de resumen con detección de idioma renderizado localmente por defecto, IA solo cuando está activada
Cruce determinista por 4 códigos
VentasEmpareja códigos de proveedor con SKU, import_code, internal_code y export_code antes de cualquier llamada de IA. Solo paga por lo que la IA realmente procesa.
- Coincidencia exacta sensible a mayúsculas en las cuatro columnas de código de producto
- Los matches exactos se saltan la decisión de IA por completo — deterministas y gratuitos
- Clasificación: exact_match (verde), ai_decision (azul), not_found (rosa)
- Protección contra alucinación: rechaza selecciones del modelo fuera de la lista presentada
Ingesta multiformato
VentasAcepta PDF, XLSX, XLS, CSV o texto pegado — cualquier formato que envíe su cliente.
- Carga de archivos hasta 20 MB
- Texto pegado de 10 a 100,000 caracteres
- Siempre genera un borrador de cotización para revisión humana — nunca envía solo
Catálogo de Productos
Cuatro códigos de producto paralelos
AdminSKU + import_code + internal_code + export_code — el motor de importación por IA empareja con los cuatro.
- SKU único dentro del tenant, validado en la creación
- Las cuatro columnas de código indexadas para búsqueda por trigramas
- Los códigos alimentan la etapa de coincidencia determinista de la importación por IA
Flujo de producto temporal
AdminLos vendedores crean productos sobre la marcha. Las cotizaciones con productos no aprobados se bloquean hasta que un admin apruebe.
- Productos temporales forzados a is_approved=false en el backend
- Cotizaciones con productos no aprobados bloqueadas para envío, cierre y exportación PDF
- Alternancia de aprobación en línea para admins y gerentes
Importación determinista de productos
AdminImporte catálogos de productos desde Excel con clasificación y resolución fila por fila.
- Clasificación de filas: nuevo, duplicado, SKU duplicado, unidad inválida, precio inválido, duplicado parcial
- Controles de resolución en lote con filtrado por pestañas
- Vistas previas persisten en el servidor por 24 horas
Cotizar — Ajuste, ponga precio y envíe
Un editor completo con secciones de arrastrar y soltar, cálculo inverso de precios y borradores de seguimiento por IA.
Editor y Ciclo de Vida de la Cotización
Máquina de estados completa
VentasBorrador → Enviada → Cerrada → Parcialmente Entregada → Entregada, más ramificaciones de cancelar y reabrir.
- Borrador y enviada son los estados editables — ediciones rechazadas después del cierre con HTTP 409
- Cancelar desde cerrada libera todas las reservas de inventario
- Reabrir de cancelada a borrador o enviada; reabrir de cerrada libera reservas
- Parcialmente entregada y entregada son terminales — debe usar notas de devolución
Numeración continua Q-AAAA-NNNN
VentasNumeración secuencial por tenant y por año asignada bajo bloqueo pesimista.
- SELECT ... FOR UPDATE en la tabla QuoteNumberSequence
- Garantiza ausencia de saltos y duplicados dentro del tenant/año
- Asignada dentro de la transacción de creación
Editor completo con cálculo inverso de precios
VentasSecciones de arrastrar y soltar, atajos de teclado y cálculo de descuento por valor total objetivo.
- Reordenación por arrastrar y soltar de líneas y encabezados de sección
- Escriba un subtotal o total objetivo — el descuento se calcula inversamente con 6 decimales
- Notas por línea, anulaciones de descripción y agrupación por sección
- Límites de descuento aplicados por tenant — admins y gerentes exentos
PDFs de cotización con marca del tenant
VentasPDF Carta con logo, color de acento, líneas agrupadas y etiquetas localizadas en 3 idiomas.
- Logo del tenant + color de acento aplicados a la banda principal y tarjeta de totales
- Líneas agrupadas por sección; líneas de importación no coincidentes excluidas
- Etiquetas, fechas y formato monetario localizados por idioma
- Bloqueado mientras alguna línea referencia un producto temporal no aprobado
Borrador de Correo de Seguimiento por IA
IA redacta seguimientos — usted envía
VentasCorreos de seguimiento redactados por LLM para cotizaciones enviadas inactivas por 3+ días. Usted revisa, edita y envía. La IA nunca envía sin usted.
- Disponible solo en cotizaciones en estado enviada inactivas por 3+ días
- PII minimizado: el prompt contiene solo nombre del cliente, 3 líneas principales, total, fecha de validez
- Puntuación de confianza: baja para clientes nuevos, alta en caso contrario
- Detección de advertencias: rastrea promesas de descuento no autorizadas, menciones de entrega gratuita
- Controlado por la flag ai_followup_enabled del tenant
Cerrar — El cliente acepta, el inventario se reserva
Portal del cliente tokenizado con firma electrónica, más puerta de aprobación financiera opcional.
Portal del Cliente
Acceso anónimo por token
El cliente revisa, acepta o solicita cambios — sin cuenta, sin contraseña, sin fricción.
- Tokens Django firmados con expiración configurable (predeterminado 30 días)
- Revocación de token mediante soft-delete o expiración
- Consultas entre tenants devuelven 404, no 403
Aceptación electrónica con SHA-256
Firma electrónica por nombre escrito con hash del nombre, correo, ID de cotización y timestamp.
- Hash SHA-256 vincula los cuatro campos canónicos juntos
- Idempotente: aceptación duplicada devuelve fila existente con already_accepted=true
- La aceptación transiciona la cotización a cerrada, activa la reserva de inventario
- Evento de auditoría registrado con metadatos completos
Solicitudes de cambio e hilo de conversación
El cliente puede solicitar cambios en línea. Toda la conversación — mensajes de ventas + solicitudes del cliente — se muestra en orden.
- Solicitud de cambio en texto libre crea una fila QuoteChangeRequest
- Vendedor notificado mediante notificación en la app + correo
- Panel de conversación renderizado estilo WhatsApp sobre los botones de acción
Descarga de PDF protegida por token
El mismo PDF con marca que la exportación autenticada, autorizado exclusivamente por el token del portal.
- Registra evento de auditoría con actor=None, token_id, recipient_email, locale
- Líneas de importación no coincidentes excluidas; productos no aprobados bloquean exportación
- Locale resuelto de cookie → Accept-Language → en-US
Aprobación Financiera
Puerta de aprobación opcional por tenant
FinanzasPausa cotizaciones aceptadas en ready_for_billing hasta que finanzas confirme el pago. El inventario no se reserva hasta que se pague.
- Controlado por la flag Tenant.requires_finance_approval (desactivada por defecto)
- Máquina de estados de pago: pending → paid / failed / cancelled
- La transición paid ejecuta la maquinaria estándar de cierre (reservar inventario + borrador de ND)
- Revertir de paid permitido solo cuando ninguna ND ha sido enviada
Notificaciones al cliente y difusión interna
FinanzasFinanzas notifica explícitamente al cliente; el equipo interno es notificado en cada transición.
- Las notificaciones al cliente insertan una fila append-only QuotePaymentNotification
- Difusión interna al propietario de ventas, gerentes y admins en cada transición
- El banner del portal del cliente se orienta por notificaciones, no por el estado bruto del pago
Reserva de Inventario
Reserva automática al cerrar
Cerrar una cotización reserva inventario atómicamente. Se permite la sobre-reserva — las faltantes vuelven como lista, no como error.
- Filas RESERVATION StockMovement escritas por línea rastreable
- Filas StockItem bloqueadas con select_for_update en orden determinista de producto
- Sobre-reserva: el cierre nunca devuelve 409 por inventario insuficiente
- El array de faltantes identifica producto, ubicación y cantidad disponible resultante
Entregar — Pick, pack, enviar y devolver
Notas de entrega, app móvil para conductor, devoluciones, recepciones y un libro mayor de inventario completo.
Notas de Entrega
Ciclo de vida Borrador → Enviada → Entregada
AlmacénGenerada automáticamente al cerrar la cotización. Creación manual desde cotizaciones cerradas. Continuación para entregas parciales.
- ND en borrador generada automáticamente cubre todas las líneas rastreables al cierre
- Ubicación de almacén por línea — divide una entrega entre múltiples almacenes
- La publicación escribe entradas Delivery en el libro mayor y decrementa el disponible
- ND de continuación creada automáticamente para cantidades no entregadas tras publicación parcial
PDFs de entrega con código QR
AlmacénPDFs con marca incluyendo ubicaciones de pasillo, subtotales por sección y códigos QR escaneables.
- El código QR codifica el número de nota de entrega para escaneo móvil
- Pasillo resuelto por la tripleta (producto, ubicación, proveedor consignante)
- Bloques de firma para conductor y receptor
App Móvil del Conductor
Superficie móvil dedicada en /delivery
ConductorLos conductores ven solo notas enviadas y entregadas — nunca borradores. Escaneo QR, captura de fotos, confirmación con un toque.
- Acceso restringido solo a usuarios del grupo Driver
- Endpoint reforzado filtra todas las notas de entrega no enviadas
- Hasta 3 fotos por entrega, 10 MB cada una, almacenadas en la base de datos de la aplicación
- La confirmación final transiciona la ND a Entregada, recalcula el estado de la cotización padre
- Las notificaciones posteriores a la entrega excluyen al propio conductor
Devoluciones y Recepciones
Notas de devolución vinculadas a entregas
AlmacénRastree lo que vuelve con motivo y condición. La publicación incrementa el disponible sin afectar el reservado.
- Dos modos de creación: vinculado a entrega (líneas pre-rellenadas) o general (búsqueda por tecleo)
- Motivos de devolución: Dañado, Exceso, Rechazado por el cliente, Artículo incorrecto, Otro
- Condiciones: Revendible, Dañado, Inspeccionar
- La publicación escribe entradas Return en el libro mayor — el estado de la cotización padre no se ve afectado
Recepciones de inventario con flag de consignación
AlmacénReciba inventario de proveedores. La flag de consignación rastrea el inventario propiedad del proveedor por separado.
- La alternancia de inventario consignado crea ítems de inventario vinculados al proveedor consignante
- La publicación escribe entradas Receipt; la cancelación escribe entradas Receipt reversal
- Costo unitario capturado en la recepción — reservado para funcionalidades futuras de costeo
- Creación rápida en línea de proveedor desde el formulario de recepción
Libro Mayor de Movimientos de Inventario
Libro mayor solo de adición
Almacén7 tipos de movimiento. Cada cambio en el inventario disponible o reservado registrado. Sin modificación, sin eliminación — incluso para admins.
- Tipos de movimiento: Receipt, Receipt reversal, Reservation, Release, Delivery, Return, Adjustment
- Cada fila referencia su documento de origen (cotización, ND, NDev, RE)
- Filtrable por producto, ubicación, tipo de movimiento y rango de fechas
- Exportable como PDF con marca
Central del Almacén
Panel operativo agregado en /warehouse
AlmacénVista en una sola pantalla de todo el trabajo de cumplimiento en curso — entregas, devoluciones, recepciones — con contadores KPI y feed de actividades fusionado.
- 3 tarjetas de contador KPI: conteos de borradores y publicados para entregas, devoluciones, recepciones
- Feed de actividades fusionado intercalando los tres tipos de documento por updated_at
- Enlaces laterales a vista general de inventario, inventario consignado y libro mayor de movimientos
- Solo del lado del cliente — no introduce nuevos endpoints ni mutaciones
Saber — Haga preguntas, obtenga información
Preguntas y respuestas con IA, informes diarios, paneles, reportes y notificaciones.
Pregunte a la IA
Consultas en lenguaje natural en 3 idiomas
VentasPregunte sobre cotizaciones, clientes, inventario y operaciones en español, inglés o portugués. Obtenga respuestas estructuradas con gráficos y tablas.
- Métricas: count_quotes, sum_revenue, count_clients, avg_cycle_time_days
- Agrupaciones: client, user (vendedor), month, status
- Ramificación determinista de inventario maneja solicitudes de stock sin llamada LLM
- Vía de escape de rechazo: el modelo rechaza preguntas fuera de alcance en lugar de adivinar
- Alcance por usuario: los usuarios comerciales ven solo sus propios datos con un banner
Informe Diario por IA
Tarjetas de acción personalizadas cada mañana
VentasResumen generado por IA una vez al día de lo que necesita su atención. Consciente del rol — diferentes tarjetas para ventas, gerentes y admins.
- Generado una vez por usuario por día — restricción única en (tenant, user, date)
- Prompt consciente del rol: comercial recibe CTAs personales, gerentes reciben CTAs del equipo
- Tipos de tarjeta: follow_up, stale_draft, reorder_opportunity, recent_win, quote_risk y más
- Tarjetas estructuradas con niveles de prioridad, tipo de icono, texto de insight y botones CTA
- Limitado a 8 tarjetas como máximo con validación y sanitización
Reportes y Paneles
5 paneles de dashboard
GerentePipeline por estado, distribución de antigüedad, principales clientes, principales vendedores y tasa de conversión — todo en una llamada API.
- Un solo GET /api/reports/dashboard/ devuelve los 5 paneles
- Parámetro de ventana: 30d, 90d o ytd (predeterminado 90d)
- Caché Redis por tenant por ventana, rotado automáticamente al cambio de día UTC
- Widget de cotizaciones en mapa con búsqueda de centroide de código postal del lado del cliente
7 modos de reporte de cotización
GerenteRegistro, antigüedad, por expirar, seguimiento, ganancias-pérdidas, descuentos e importaciones-IA — cada uno con filtros estructurados y exportación PDF.
- Filtros estructurados: tokens de estado, UUIDs de propietario, selectores de fecha, formato monetario, porcentajes de descuento
- Búsqueda de texto libre con debounce desde 3 caracteres
- PDF exporta el conjunto de datos filtrado completo, no solo la página actual
6 modos de reporte de inventario
AlmacénActual, excepciones, consignado, movimientos, velocidad de consumo y demanda prevista — con secciones de metodología analítica.
- Velocidad de consumo: resalte de riesgo cuando quedan ≤30 días de suministro
- Demanda prevista: resalte de déficit positivo, envolvente de datos insuficientes por debajo de 30 cotizaciones/año
- Filtros de entidad validados como UUIDs antes de la evaluación del queryset
Exportaciones CSV en streaming
GerenteCotización única, dashboard y CSVs de uso de productos — transmitidos fila por fila, nunca mantenidos en memoria.
- Usa Django StreamingHttpResponse con generador produciendo una fila a la vez
- Memoria constante independientemente del tamaño del conjunto de datos — seguro para exportaciones de 50,000+ filas
Notificaciones
En la app + correo, con conciencia de audiencia
Cotización aceptada, cambio solicitado, entrega completada, inventario consignado movido, inventario disponible nuevamente — cada una con la audiencia correcta y opciones por tenant.
- Feed en la app con insignia de no leídos, marcar como leído individualmente o en lote
- Correo transaccional con HTML + parte de texto plano auto-proyectada
- Difusión con conciencia de audiencia: supervisores, almacén, vendedor reciben CTAs diferentes
- Detector de inventario disponible: vuelve a verificar todas las cotizaciones abiertas tras cualquier aumento de disponible
- Clave de deduplicación previene notificaciones repetidas para el mismo evento
Fundación — Multi-tenancy, seguridad e infraestructura de la plataforma
La base arquitectónica que hace posible todo lo anterior.
Multi-Tenancy
Aislamiento estricto de tenants
Cada consulta a la base de datos lleva un filtro de tenant obligatorio. Las consultas entre tenants devuelven 404, no 403.
- ID de tenant inyectado desde la sesión autenticada — nunca desde el payload de la solicitud
- Consultas entre tenants indistinguibles de no encontrado para prevenir inferencia
- Configuración por tenant: marca, asientos, impuesto, límites de descuento, opciones de notificación, texto de documentos
Autenticación
OAuth Google Workspace + Microsoft 365
Inicio de sesión con verificación de dominio y aprovisionamiento automático de usuario. Los dominios de consumidor se rechazan explícitamente.
- Solo se permiten correos verificados de dominios de tenant autorizados
- Primer inicio de sesión: aprovisiona automáticamente al usuario con foto de perfil del proveedor
- Inicios de sesión posteriores: reutiliza el registro existente, actualiza solo la foto de perfil
Correo/contraseña con ingreso por mismo dominio
Autenticación por contraseña para tenants sin SSO. Los registros del mismo dominio ingresan al tenant existente automáticamente.
- Registro con dominio no reclamado crea nuevo tenant + primer admin
- Registro con dominio reclamado no-SSO ingresa como vendedor (capacidad de asientos aplicada)
- Tenants con SSO obligatorio rechazan el inicio de sesión por contraseña con error claro
Invitaciones de equipo con control de asientos
Admins y gerentes invitan por correo. Los tokens expiran en 7 días. La capacidad de asientos se verifica al invitar, aceptar y reactivar.
- El invitado recibe un enlace único, establece contraseña, asignado al rol elegido por el invitador
- Las invitaciones pendientes se muestran junto a los usuarios activos con controles de reenviar/revocar
- Límite de sesiones concurrentes: 2 sesiones activas por usuario (configurable por suscriptor)
Equipo y Roles
48 códigos de permiso, 5 grupos estándar
Admin, Gerente, Vendedor, Operador de Almacén y Conductor — cada uno preconfigurado con los permisos correctos para su trabajo.
- Los grupos estándar son de solo lectura y se aplican en el backend
- Grupos personalizados compuestos libremente del catálogo de 48 códigos mediante cuadrícula de casillas
- Permisos organizados por área: usuarios, clientes, cotizaciones, inventario, productos, reportes, cumplimiento, conductor, proveedores, auditoría, importaciones IA
Registro de Auditoría
Auditoría solo de adición de cada acción material
Filas de auditoría escritas en la misma transacción que la acción. La eliminación de entidades auditadas anula las FK pero preserva el payload del evento.
- Búsqueda de texto libre en metadatos con debounce de 300ms
- Filtrado de selección múltiple por acción, tipo de objetivo y actor
- Metadatos expandibles por fila con control de Copia
- Sin interfaz de administración para modificación o eliminación de filas de auditoría
Internacionalización
3 idiomas, cobertura completa
en-US, pt-BR y es-US en toda la UI, correos transaccionales y documentos PDF. Terminología consistente en todas las superficies.
- Cada cadena visible, notificación toast, error y etiqueta traducida
- Correos transaccionales con botones CTA localizados
- Documentos PDF: etiquetas, fechas y formato monetario localizados
- Cascada de idioma: cookie → navegador Accept-Language → fallback en-US
- Usuarios autenticados: preferencia guardada anula cookie y navegador
Facturación
Gestión de suscripciones Stripe
Planes, asientos e intervalos de facturación gestionados mediante Stripe. La BD es la fuente de verdad — Stripe se reconcilia para coincidir.
- Un Stripe Product por Plan, uno o dos Stripe Prices por PlanPrice
- Stripe Prices inmutables: cambiar el monto crea un nuevo Price, archiva el anterior
- Libro mayor append-only PlanPriceHistory de IDs de Stripe Price archivados
- Aplicación de cambios al final del ciclo: downgrades, reducciones de asientos, cambios de intervalo aplicados al final del período
Seguridad y Rendimiento
Controles de defensa en profundidad
Disciplina de caché, limitación de tasa, indexación de base de datos, disciplina de concurrencia y aplicación de presupuesto de consultas.
- Caché: cada clave con namespace de tenant, invalidación en la misma transacción atómica, fallo de Redis no es fatal
- Limitación de tasa: endpoints públicos con límite por IP, endpoint Ask 20 req/min por usuario
- Índices GIN de trigramas en todos los campos de texto buscables; índices compuestos en combinaciones comunes de filtros
- Bloqueos pesimistas adquiridos en orden determinista para concurrencia sin deadlocks
- Suite de pruebas de regresión aplica presupuesto de consultas por ruta para prevenir regresiones N+1