Saltar al contenido

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

Ventas

Extracció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

Ventas

Empareja 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

Ventas

Acepta 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

Admin

SKU + 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

Admin

Los 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

Admin

Importe 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

Ventas

Borrador → 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

Ventas

Numeració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

Ventas

Secciones 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

Ventas

PDF 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

Ventas

Correos 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

Finanzas

Pausa 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

Finanzas

Finanzas 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én

Generada 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én

PDFs 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

Conductor

Los 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én

Rastree 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én

Reciba 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én

7 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én

Vista 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

Ventas

Pregunte 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

Ventas

Resumen 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

Gerente

Pipeline 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

Gerente

Registro, 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én

Actual, 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

Gerente

Cotizació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