Médicos: badges de ventas 30d al estilo legacy

- Píldora verde 'N ventas' + gris 'N recomendaciones' y píldoras
  índigo apiladas (usd / m.n. / tarjeta m.n.) en una sola columna
- recomendaciones_30d: pacientes captados con 'recomendado por'
This commit is contained in:
2026-08-14 09:10:15 +00:00
parent 4c3eb0b11d
commit f80073f687
3 changed files with 51 additions and 16 deletions

View File

@@ -1657,6 +1657,16 @@ class SkeenFrontendController(http.Controller):
# ---- Ventas de los últimos 30 días por médico ----
since = (date.today() - timedelta(days=30)).strftime('%Y-%m-%d')
# Recomendaciones: pacientes captados en 30d asignados al médico
# con "recomendado por" capturado (misma métrica visible del legacy)
recomendaciones = {}
for g in request.env['res.partner'].sudo().read_group(
[('is_patient', '=', True), ('primary_doctor_id', 'in', doctors.ids),
('referred_by', 'not in', [False, '']), ('create_date', '>=', since)],
[], ['primary_doctor_id']):
recomendaciones[g['primary_doctor_id'][0]] = g['primary_doctor_id_count']
stats = {} # doctor_id -> {'ventas': set, 'total': float}
card_by_venta = {}
ventas = request.env['skeen.venta'].sudo().search([
@@ -1700,6 +1710,7 @@ class SkeenFrontendController(http.Controller):
'work_email': d.work_email or '',
'commission_pct': d.commission_pct or 0.0,
'patient_count': counts.get(d.id, 0),
'recomendaciones_30d': recomendaciones.get(d.id, 0),
'ventas_30d': len(stats.get(d.id, {}).get('ventas', set())),
'total_30d': round(stats.get(d.id, {}).get('total', 0.0), 2),
'total_30d_usd': round(stats.get(d.id, {}).get('total', 0.0) / rate, 2) if rate else None,