Obteniendo estadísticas del CRM

Gustavo Orrillo
- 24/06/2022 - 3 min. de lectura

Odoo permite gestionar las oportunidades a lo largo de diferentes etapas del ciclo de venta. Dichas etapas pueden ser definidas por equipo de ventas. Ahora, la única estadística que tenemos es por etapa, la cantidad de oportunidades que hay. También hay una estadística, días para el cierre (la cual por oscuras razones, se puede ver cuando uno esta en modo desarrollador). Nada más.


Y falta una estadística importante, que es cuantos días una oportunidad pasa en cada etapa. Para resolver dicho problema, acabamos de desarrollar el módulo crm_stage_stats. Este módulo agrega un menú, llamado "CRM Stage Stats" (no muy feliz, pero es lo que hay por ahora). 


Lo que muestra por oportunidad, la fecha en la que se cambió de etapa a etapa, y cuantos días se tardó en pasar de una etapa a la otra. Tiene las siguientes columnas: oportunidad, fecha, etapa desde, etapa hasta, y cantidad de días que se tardó en pasar de etapa a etapa.


Esta vista puede pasarse a pivot y tambien ser descargada por Excel


Por ejemplo, en modo pivot podemos agregar la medida "días" por diferentes columnas, como por ejemplo "Etapa hasta" o por oportunidad. Quiza sea util agregar el vendedor (lo cual podemos hacer dentro de poco). Tambien tenemos el historial de las etapas en la oportunidad, hay ahora un tab llamado "Stage stats"


Lo que le falta por ahora es agregar un feature que falta en Odoo. Cuando se confirma un presupuesto relacionado a una oportunidad, no se marca la oportunidad como ganada. Es algo que vamos a agregar dentro de poco. También le faltan estadísticas relacionadas con el proceso de ventas; como por ejemplo cantidad de días a que el pedido sea confirmado y cantidad de días a que el pedido sea facturado. Dichos cambios los vamos a hacer a la brevedad.

Por último, el módulo solo captura las estadísticas a partir del momento que es instalado. No lo hace para las modificaciones a oportunidades creadas antes del momento de la instalación.

Notas técnicas

Más alla de la creación de los campos y la vista, lo que es interesante es primero el cálculo de la cantidad de días de diferencia. Para ello se realiza la substracción de dos campos tipo datetime. Esta resta devolverá un objeto que tiene una propiedad llamada days, que es la cantidad de días resultante de la resta de dos campos tipo date o datetime.

if prev_stage:
    diff_days = (datetime.now() - prev_stage.date).days
else:
    diff_days = (datetime.now() - rec.create_date).days

Por otra parte, la actualización de las estadísticas se la hace cada vez que se realiza un cambio en la oportunidad. Para ello extendemos el método write:

def write(self, vals):
    stage_from_id = stage_to_id = None
    if 'stage_id' in vals:
        for rec in self:
            stage_from_id = rec.stage_id.id
            stage_to_id = vals.get('stage_id')
    res = super(CrmLead, self).write(vals)
    if stage_from_id and stage_to_id:
        for rec in self:
            prev_stage = self.env['crm.stage.stat'].search([('lead_id','=',rec.id)],order='id desc',limit=1)
            if prev_stage:
                diff_days = (datetime.now() - prev_stage.date).days
            else:
                diff_days = (datetime.now() - rec.create_date).days
            vals = {
                'lead_id': rec.id,
                'stage_from_id': stage_from_id,
                'stage_to_id': stage_to_id,
                'date': str(datetime.now())[:19],
                'diff_days': diff_days,
                }
            stat_id = self.env['crm.stage.stat'].create(vals)
    return res

En las primeras cinco líneas chequeamos si la oportunidad está actualizando la etapa. Si es así, capturamos cual es la etapa previa y la etapa posterior a la actualización. Paso siguiente, hacemos el write (invocando el método write de la clase padre). Luego, si se modificaron las etapas, se calcula la cantidad de días que la oportunidad estuvo en dicha etapa. Para ello se busca la actualización de la etapa anterior y se calcula la cantidad de días entre dicha actualización y el día de hoy. Y por último se crea un registro en el objeto de las estadísticas.


Acerca de:

Gustavo Orrillo

Passionate about programming, he has implemented Odoo for different types of businesses since 2010. In Moldeo Interactive he is a founding Partner and Programmer; In addition to writing on the Blog about different topics related to the developments he makes.