UX Dashboard: fila Hoy en la clinica, KPIs clickeables, deltas; Cumpleanos wa.me E.164; Mis ventas con grafica diaria

This commit is contained in:
2026-09-17 07:25:16 +00:00
parent 8ba3d2582b
commit afc208a7b7
6 changed files with 382 additions and 35 deletions

View File

@@ -268,6 +268,22 @@ class SkeenFrontendController(http.Controller):
puntos_totales = sum(m.points for m in Monederos.search([]))
ventas_hoy = Ventas.search_count([('date', '=', today), ('state', 'in', ('paid', 'partial'))])
# Comparativas contra el período anterior equivalente (deltas):
# - Ingresos Mes: mes anterior recortado al mismo día de corte (MTD)
# - Ventas Hoy: mismo conteo del día de ayer
prev_month_last = first_day - timedelta(days=1)
prev_month_first = prev_month_last.replace(day=1)
prev_month_end = prev_month_first.replace(day=min(today.day, prev_month_last.day))
prev_revenue_month = sum(v.total for v in Ventas.search([
('date', '>=', prev_month_first),
('date', '<=', prev_month_end),
('state', 'in', ('paid', 'partial')),
]))
prev_sales_today = Ventas.search_count([
('date', '=', today - timedelta(days=1)),
('state', 'in', ('paid', 'partial')),
])
return json_response({
'status': 'success',
'stats': {
@@ -279,6 +295,8 @@ class SkeenFrontendController(http.Controller):
'pending_payments': pendientes_pago,
'total_wallet_points': puntos_totales,
'sales_today': ventas_hoy,
'prev_revenue_month': prev_revenue_month,
'prev_sales_today': prev_sales_today,
}
})
except Exception as e:
@@ -2111,7 +2129,8 @@ class SkeenFrontendController(http.Controller):
emp = self._linked_employee(user)
if not emp:
return json_response({'status': 'success', 'medico_sin_employee': True,
'sales': [], 'kpis': {'ventas': 0, 'total_mxn': 0.0, 'total_usd': None, 'total_card': 0.0},
'sales': [], 'daily_breakdown': [],
'kpis': {'ventas': 0, 'total_mxn': 0.0, 'total_usd': None, 'total_card': 0.0},
'commission_pct': 0.0, 'commission_estimate': 0.0})
today = date.today()
@@ -2158,6 +2177,22 @@ class SkeenFrontendController(http.Controller):
total_mxn += r['subtotal'] or 0.0
lines_by_venta.setdefault(vid, []).append(r)
# Serie diaria del rango (para la gráfica de Mis ventas): suma de
# líneas atribuidas por fecha de venta, con días sin ventas en 0.
date_by_venta = {v.id: v.date for v in ventas}
totals_by_date = {}
for r in rows:
vdate = date_by_venta.get(r['venta_id'][0])
if vdate:
key = vdate.strftime('%Y-%m-%d')
totals_by_date[key] = totals_by_date.get(key, 0.0) + (r['subtotal'] or 0.0)
daily_breakdown = []
day = date_from
while day <= date_to:
key = day.strftime('%Y-%m-%d')
daily_breakdown.append({'date': key, 'total': round(totals_by_date.get(key, 0.0), 2)})
day += timedelta(days=1)
def metodo_pago(v):
paid = v.amount_paid or 0.0
card = card_by_venta.get(v.id, 0.0)
@@ -2205,6 +2240,7 @@ class SkeenFrontendController(http.Controller):
'total_card': round(sum(card_by_venta.values()), 2),
},
'sales': sales,
'daily_breakdown': daily_breakdown,
'commission_pct': pct,
'commission_source': pct_source,
'commission_estimate': round(total_mxn * pct / 100.0, 2),