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:
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user