import { auth } from "../lib/auth"; import { ownerFilter } from "../lib/authz"; import { getClosed, resolveScopeOwnerId } from "../lib/queries"; import LoginPrompt from "../components/LoginPrompt"; import ErrorNotice from "../components/ErrorNotice"; import { money, money2 } from "../lib/constants"; import { getMetaGlobal } from "../lib/metas"; export const dynamic = "force-dynamic"; const MESES_A_MOSTRAR = 6; function lastMonths(n) { const out = []; const d = new Date(); for (let i = n - 1; i >= 0; i--) { const dt = new Date(d.getFullYear(), d.getMonth() - i, 1); out.push(`${dt.getFullYear()}-${String(dt.getMonth() + 1).padStart(2, "0")}`); } return out; } export default async function TendenciaPage({ searchParams }) { const session = await auth(); if (!session?.email) return ; const { owner } = await searchParams; const scope = ownerFilter(session, owner); const meses = lastMonths(MESES_A_MOSTRAR); const metaGlobal = getMetaGlobal(); let porMes; try { const { ownerId } = await resolveScopeOwnerId(scope, session.accessToken); porMes = await Promise.all( meses.map(async (m) => { const [won, lost] = await Promise.all([ getClosed(session.accessToken, scope, 1, m, ownerId), getClosed(session.accessToken, scope, 2, m, ownerId), ]); const sumW = won.reduce((a, o) => a + (o.actual || 0), 0); return { mes: m, won: won.length, lost: lost.length, sumW, arpu: won.length ? sumW / won.length : 0, conv: won.length + lost.length ? Math.round((won.length / (won.length + lost.length)) * 100) : 0, cumpl: metaGlobal ? Math.round((sumW / metaGlobal) * 100) : null, }; }) ); } catch (error) { return ; } const maxSumW = Math.max(...porMes.map((m) => m.sumW), 1); return (

Tendencia

Últimos {MESES_A_MOSTRAR} meses, calculado en vivo desde Dynamics. No incluye el análisis narrativo del tablero anterior (era específico de un semestre puntual) — solo las cifras.

Ganadas ($) por mes

{porMes.map((m) => (
{m.mes}
{m.won} {money(m.sumW)}
))}
{porMes.map((m) => ( ))}
Mes Ganadas # Ganadas $ ARPU Perdidas # Conversión Cumpl. (meta {money(metaGlobal)})
{m.mes} {m.won} {money2(m.sumW)} {money2(m.arpu)} {m.lost} {m.conv}% {m.cumpl != null ? `${m.cumpl}%` : "n/d"}
); }