← Blog
En marcha

Sistema CPQ: De 35 minutos a 10 minutos por cotización

#rails#cpq#automatización#cliente

El Problema

En este cliente, cotizar una puerta corredera de interiorismo era un proceso manual que tomaba entre 20-35 minutos por cliente. El proceso implicaba:

  1. Consultar catálogos físicos para encontrar los componentes
  2. Calcular medidas manualmente según el hueco del cliente
  3. Buscar precios en múltiples listas actualizadas
  4. Sumar todo en una calculadora o Excel
  5. Redactar la oferta en Word

Con un promedio de 5-8 cotizaciones diarias, el cliente estaba perdiendo más de 2 horas al día en trabajo repetitivo que no aportaba valor real.

La Solución: CPQ en Rails

Desarrollar un sistema Configure-Price-Quote (CPQ) usando Ruby on Rails que automatiza todo el proceso de cotización.

Stack Técnico

# Gemfile
gem 'rails', '~> 7.0'
gem 'postgresql'
gem 'devise' # Autenticación
gem 'prawn' # Generación de PDFs
gem 'turbo-rails' # UX instantánea

Arquitectura del Sistema

El sistema tiene 3 componentes principales:

1. Configurador Visual

  • Interface web responsive donde introduces medidas del hueco
  • Selector de acabados (blanco, negro TXT, plata)
  • Preview en tiempo real de la configuración

2. Motor de Precios

  • Algoritmos de cálculo basados en tablas técnicas del sistema
  • Actualización de precios mediante interfaz admin
  • Cálculo automático de componentes necesarios (guías, perfiles, accesorios)

3. Generador de PDFs

  • Propuesta comercial profesional con logo
  • Desglose técnico de componentes
  • Términos y condiciones automáticos
  • Generación en menos de 2 segundos

Implementación Destacada

Cálculo Dinámico de Componentes

class DOMOCalculator
  def initialize(width, height, doors_count)
    @width = width
    @height = height
    @doors = doors_count
  end
  
  def components
    {
      upper_guide: calculate_guide_length,
      lower_guide: calculate_guide_length,
      vertical_profiles: @doors * 2,
      glass_area: calculate_glass_area,
      rollers: @doors * 2,
      stoppers: 2
    }
  end
  
  private
  
  def calculate_guide_length
    # Guías necesitan 10cm extra por lado
    (@width + 20).ceil
  end
  
  def calculate_glass_area
    # Área de cristal con descuento de perfil (5cm por lado)
    door_width = (@width / @doors) - 10
    door_height = @height - 10
    (door_width * door_height * @doors) / 10000.0 # m²
  end
end

Sistema de Precios Versionado

Una de las claves fue versionar los precios para poder hacer seguimiento histórico:

class Price < ApplicationRecord
  belongs_to :component
  
  scope :current, -> { where(valid_until: nil).or(where('valid_until > ?', Date.today)) }
  
  def self.for_component(component_id, date = Date.today)
    where(component_id: component_id)
      .where('valid_from <= ?', date)
      .where('valid_until IS NULL OR valid_until > ?', date)
      .first
  end
end

Resultados

Métricas de Impacto

  • ⏱️ Tiempo de cotización: De 15-20 min → < 5 min
  • 📈 Productividad: +200% en capacidad de respuesta
  • 💰 ROI: Sistema pagado en < 2 semanas
  • ✅ Errores: Reducción del 100% en errores de cálculo
  • 📊 Datos: Base de datos de todas las cotizaciones para análisis

Impacto en el Negocio

  1. Mayor capacidad de respuesta: Ahora se puede cotizar incluso por WhatsApp en tiempo real
  2. Profesionalización: PDFs branded que mejoran imagen de marca
  3. Análisis de datos: Qué productos se cotizan más y tasas de conversión
  4. Escalabilidad: Cualquier persona del equipo puede hacer cotizaciones

Lecciones Aprendidas

✅ Lo que funcionó bien

  • Turbo para UX instantánea: El preview en tiempo real sin recargar página fue clave
  • Prawn para PDFs: Mucho más potente que soluciones HTML-to-PDF
  • Versionar precios: Poder revisar cotizaciones antiguas con precios de esa fecha es crítico

🔄 Lo que mejoraría

  • Testing: Inciado sin tests unitarios, después se añadieron
  • Validaciones: Algunas medidas imposibles se escapaban inicialmente
  • Mobile-first: Diseñado para desktop, después adaptado a móvil (debió ser al revés)

Próximos Pasos

El éxito de este proyecto abrió las puertas a:

  1. Extender a otros productos: Vallas, puertas cancela
  2. Integración con ERP: Pasar cotizaciones aceptadas directamente a pedidos
  3. Portal de clientes: Que los clientes puedan auto-configurar y ver presupuestos

Conclusión

Este proyecto demuestra que no necesitas AI ni soluciones complejas para generar impacto real. Una aplicación web bien construida, con Rails y PostgreSQL, puede transformar un proceso de negocio crítico.

El mejor software es el que resuelve problemas reales de forma simple y elegante.


Tech Stack: Ruby on Rails 7.0, PostgreSQL, Turbo, Prawn, Devise
Tiempo de desarrollo: 3 semanas (part-time)
Líneas de código: ~2,000 LOC
Estado: En producción desde Diciembre 2025

¿Tienes un proceso manual en tu negocio que podría automatizarse? Hablemos.