Estadisticas de venta - Seguimiento de los estados de los pedidos de venta

25 de setiembre de 2023 por
Gustavo Orrillo
| Sin comentarios aún
 

Meses atras escribí sobre como obtener estadísticas del pasaje de etapas en las iniciativas del módulo CRM. Ahora vamos a hablar sobre como obtener estadísticas del pasaje de estados en los pedidos de venta.

Para ello desarrollamos un nuevo módulo llamado sale_stage_stats el cual obtiene estadísticas del cambio de estados en los pedidos de venta. Como funciona este módulo? Despues de instalarlo (no tiene secretos la instalación) notamos que se agrega un nuevo tab llamado "Stage Stats". 


En este tab tendremos un historial de en que momentos el pedido cambio de estado (de Borrador a Enviado, de Enviado a Confirmado, etc.). Siempre que cambie el estado, se registrará un nuevo item en este tab.

En el caso que querramos ver todos los cambios para todos los pedidos (y analizarlos) tenemos un nuevo item de menú en el menú Informes de Ventas. Este se llama "Stage Stats" y muestra todos los cambios de estado para todos los pedidos de venta.


Se le puede agregar nuevos campos (por ejemplo la diferencia en horas entre estado y estado, más el partner y el vendedor para facilitar el análisis) pero bueno... al menos este es una primera aproximación al tema. Que creo puede llegar a interesarlos.

Notas técnicas

Este módulo más alla de declarar un nuevo modelo, extiende el ORM. Para ello se extienden las funciones create y write de la siguiente manera:

    @api.model
def create(self, vals):
res = super(SaleOrder, self).create(vals)
for rec in res:
vals = {
'order_id': rec.id,
'state_from': '',
'state_to': 'draft',
'date': str(datetime.now())[:19],
'diff_days': 0,
}
stat_id = self.env['sale.stage.stat'].create(vals)
return res

def write(self, vals):
state_from = state_to = ''
if 'state' in vals:
for rec in self:
state_from = rec.state
state_to = vals.get('state')
res = super(SaleOrder, self).write(vals)
if state_from and state_to:
for rec in self:
prev_stage = self.env['sale.stage.stat'].search([('order_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 = {
'order_id': rec.id,
'state_from': state_from,
'state_to': state_to,
'date': str(datetime.now())[:19],
'diff_days': diff_days,
}
stat_id = self.env['sale.stage.stat'].create(vals)
return res

Como pueden ver al principio se extiende el create. Y en dicho método después de invocar el create del método padre, se crea un registro en las estadísticas para el pedido (con el valor de estado hasta como draft).

Luego se extiende el método write donde no solo se registra el cambio de estado, sino tambien se calcula el tiempo existente entre el estado anterior y el estado actual. Para ello se busca el estado anterior (se buscan los estados para el mismo pedido que sean diferentes al registro actual, ordenados por el ID de forma descendente para obtener el cambio más reciente).

Luego a dicho estado anterior se le substrae la fecha del estado actual de la siguiente manera:

diff_days = (datetime.now() - prev_stage.date).days

Gustavo Orrillo 25 de setiembre de 2023
Compartir
Archivar
Identificarse dejar un comentario