1import{u as V,j as e,am as Ce,ad as Ue,ae as He,af as Pe,ag as qe,B as Ge,aa as Ye}from"./index-DPoJI_wR.js";import{a as m,ar as Xe,G as Ze,Q as De,e as Re,be as Qe,bg as Je,bk as et,j as Te,aa as Ae,bm as Me,cM as tt,b0 as at,W as st,L as rt,Y as lt,_ as nt,s as it}from"./lucide-BOxB89cY.js";import{x as ot,s as ct,y as L,z as dt}from"./ProductSearchCell-BY7NkpTc.js";import{C as g,d as E}from"./printTokens-CS0lytAK.js";import{m as mt,n as ut,v as M,t as ht,o as F,X as I,Y as B,T as O,q as je,B as Y,w as W,as as le,at as ft}from"./BarChart-8KFbtNio.js";import{A as Le,R as we}from"./Area-DZYekUYm.js";import{L as ne}from"./Legend-BTQTB94z.js";import{s as xt}from"./stageConfig-bOzvBi3e.js";import"./label-D_D0_GbZ.js";import"./string-DtAa151R.js";import"./range-OtVwhkKS.js";var pt=["axis"],Ke=m.forwardRef((t,r)=>m.createElement(mt,{chartName:"AreaChart",defaultTooltipEventType:"axis",validateTooltipEventTypes:pt,tooltipPayloadSearcher:ut,categoricalChartProps:t,ref:r}));function S(t){if(t==null||!Number.isFinite(Number(t)))return"â";const r=Math.round(Number(t));if(r<60)return`${r}s`;const a=Math.floor(r/60);if(a<60)return`${a}m ${r%60}s`;const l=Math.floor(a/60);return l<48?`${l}h ${a%60}m`:`${Math.round(l/24)}d`}function T(t){return t==null||!Number.isFinite(Number(t))?"â":Number(t).toLocaleString("pt-BR",{style:"currency",currency:"BRL",maximumFractionDigits:0})}function K(t,r,a=!1){const l=Number(t),s=Number(r);if(!Number.isFinite(l)||!Number.isFinite(s)||s===0)return;let n=(l-s)/Math.abs(s)*100;return a&&(n=-n),Math.round(n*10)/10}function gt({delta:t,label:r}){if(t===void 0)return null;const a=t>=0;return e.jsxs("span",{title:r,className:`inline-flex items-center gap-0.5 rounded-md px-1.5 py-0.5 text-2xs font-semibold tabular-nums ${a?"bg-emerald-50/80 dark:bg-emerald-950/30 text-emerald-700 dark:text-emerald-500":"bg-rose-50/80 dark:bg-rose-950/30 text-rose-700 dark:text-rose-500"}`,children:[a?e.jsx(De,{className:"w-3 h-3"}):e.jsx(et,{className:"w-3 h-3"}),a?"+":"",t.toFixed(1),"%"]})}function bt({title:t,value:r,subtitle:a,icon:l,delta:s,deltaLabel:n,sparklineData:c,onClick:o,ariaLabel:p}){const x=!!c&&c.length>1;return e.jsxs("div",{role:"button",tabIndex:0,"aria-label":p,onClick:o,onKeyDown:b=>{b.key==="Enter"&&o&&o()},className:"group relative rounded-xl border border-border bg-card p-4 cursor-pointer hover:shadow-md hover:border-border/80 transition-all duration-200 flex flex-col justify-between min-h-[112px]",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-wider text-muted-foreground leading-snug",children:t}),e.jsx(l,{className:"w-4 h-4 shrink-0 text-muted-foreground/70"})]}),e.jsxs("div",{className:"mt-1.5 flex items-baseline gap-2 flex-wrap",children:[e.jsx("span",{className:"font-heading text-2xl font-bold text-foreground tabular-nums",children:r}),e.jsx(gt,{delta:s,label:n})]}),a&&e.jsx("p",{className:"text-2xs text-muted-foreground mt-0.5 line-clamp-1",title:a,children:a}),x&&e.jsx("div",{className:"mt-2 h-9 -mb-1","aria-hidden":"true",children:e.jsx(M,{width:"100%",height:"100%",children:e.jsx(Ke,{data:c,margin:{top:2,right:0,left:0,bottom:0},children:e.jsx(Le,{type:"monotone",dataKey:"value",stroke:g[0],strokeWidth:1.5,fill:g[0],fillOpacity:.08,dot:!1,isAnimationActive:!1})})})})]})}function vt({overview:t,previousOverview:r,sparklines:a,onDrilldown:l}){const{t:s}=V();if(!t)return null;const n=t.response_times,c=r?.response_times,o=t.funnel,p=r?.funnel,x=t.revenue,b=r?.revenue,v=s("admin.dashboard.trend.vs_previous_period",{defaultValue:"Vs previous period"}),C=[{title:s("comercial.metrics.kpi.ttpr",{defaultValue:"First response time (median)"}),value:S(n.ttpr?.median_seconds),subtitle:s("comercial.metrics.kpi.ttpr_sub",{defaultValue:"Benchmark: under 5 minutes"}),icon:Xe,delta:K(n.ttpr?.median_seconds,c?.ttpr?.median_seconds,!0),metric:"ttpr",sparklineData:a?.ttpr},{title:s("comercial.metrics.kpi.response",{defaultValue:"Avg response time"}),value:S(n.response?.avg_seconds),subtitle:s("comercial.metrics.kpi.response_sub",{defaultValue:"{n} reply pairs",params:{n:String(n.response?.pairs??0)}}),icon:Ze,delta:K(n.response?.avg_seconds,c?.response?.avg_seconds,!0),metric:"response_pairs",sparklineData:a?.response},{title:s("comercial.metrics.kpi.conversion",{defaultValue:"Cohort conversion"}),value:o.totals.cohort_conversion_pct!==null?`${o.totals.cohort_conversion_pct}%`:"â",subtitle:s("comercial.metrics.kpi.conversion_sub",{defaultValue:"{won} won of {created} created",params:{won:String(o.totals.cohort_won),created:String(o.totals.created)}}),icon:De,delta:K(o.totals.cohort_conversion_pct,p?.totals?.cohort_conversion_pct),metric:"cohort_deals"},{title:s("comercial.metrics.kpi.win_rate",{defaultValue:"Win rate"}),value:o.totals.win_rate_pct!==null?`${o.totals.win_rate_pct}%`:"â",subtitle:s("comercial.metrics.kpi.win_rate_sub",{defaultValue:"{won} won / {lost} lost",params:{won:String(o.totals.won),lost:String(o.totals.lost)}}),icon:Re,delta:K(o.totals.win_rate_pct,p?.totals?.win_rate_pct),metric:"won_lost"},{title:s("comercial.metrics.kpi.cycle",{defaultValue:"Sales cycle (median)"}),value:o.cycle?.median_days!==null&&o.cycle?.median_days!==void 0?s("comercial.metrics.kpi.cycle_days",{defaultValue:"{d} days",params:{d:String(Math.round(Number(o.cycle.median_days)*10)/10)}}):"â",subtitle:s("comercial.metrics.kpi.cycle_sub",{defaultValue:"Created â sale won"}),icon:Qe,delta:K(o.cycle?.median_days,p?.cycle?.median_days,!0),metric:"cycle"},{title:s("comercial.metrics.kpi.ticket",{defaultValue:"Avg ticket"}),value:T(x?.total_brl_complete===!0?x.avg_ticket_brl:null),subtitle:x?.total_brl_complete===!0?s("comercial.metrics.kpi.ticket_sub",{defaultValue:"{n} sales",params:{n:String(x.sales)}}):s("comercial.metrics.kpi.ticket_pending",{defaultValue:"Ticket unavailable · financial review pending"}),icon:Je,delta:x?.total_brl_complete===!0&&b?.total_brl_complete===!0&&x.avg_ticket_brl!=null&&b.avg_ticket_brl!=null?K(x.avg_ticket_brl,b.avg_ticket_brl):void 0,metric:"revenue_sales"}];return e.jsx("div",{className:"grid gap-3 sm:grid-cols-2 xl:grid-cols-3 items-stretch",children:C.map(i=>e.jsx(bt,{title:i.title,value:i.value,subtitle:i.subtitle,icon:i.icon,delta:i.delta,deltaLabel:v,sparklineData:i.sparklineData,onClick:l?()=>l(i.metric,i.title):void 0,ariaLabel:`${i.title} â ${i.value}`},i.metric))})}const se=t=>t==null?null:Math.round(Number(t)/60*10)/10;function _t({data:t,aiMedianSeconds:r}){const{t:a}=V();if(!t||!t.series||t.series.length===0)return e.jsxs("div",{className:"h-full min-h-[220px] rounded-xl border border-dashed border-border bg-card/50 p-5 flex flex-col items-center justify-center text-center",children:[e.jsx("p",{className:"text-sm font-medium text-muted-foreground",children:a("comercial.metrics.trend.empty_title",{defaultValue:"No response-time data in this period"})}
1),e.jsx("p",{className:"text-xs text-muted-foreground/80 mt-1 max-w-sm",children:a("comercial.metrics.trend.empty_hint",{defaultValue:"Times start counting when leads message the WhatsApp numbers and a seller replies â or after the historical backfill runs."})})]});const l=t.series.map(n=>({day:n.day,ttpr:se(n.ttpr_median_seconds),response:se(n.response_avg_seconds)})),s=se(r);return e.jsxs("div",{className:"rounded-lg border bg-card p-4",children:[e.jsx("h3",{className:"font-heading text-sm font-medium mb-3",children:a("comercial.metrics.trend.title",{defaultValue:"Response times (minutes)"})}),e.jsx(M,{width:"100%",height:260,children:e.jsxs(ht,{data:l,children:[e.jsx(F,{strokeDasharray:"3 3",stroke:E.grid}),e.jsx(I,{dataKey:"day",tick:{fontSize:11}}),e.jsx(B,{tick:{fontSize:11}}),e.jsx(O,{}),e.jsx(ne,{}),e.jsx(we,{y:5,stroke:g[3%g.length],strokeDasharray:"6 4",label:{value:a("comercial.metrics.trend.benchmark",{defaultValue:"Benchmark 5 min (MIT/InsideSales)"}),fontSize:10,position:"insideTopRight"}}),s!==null&&e.jsx(we,{y:s,stroke:g[4%g.length],strokeDasharray:"2 4",label:{value:a("comercial.metrics.trend.ai_median",{defaultValue:"AI median"}),fontSize:10,position:"insideBottomRight"}}),e.jsx(je,{type:"monotone",dataKey:"ttpr",name:a("comercial.metrics.trend.ttpr",{defaultValue:"First response (median)"}),stroke:g[0],strokeWidth:2,dot:!1,connectNulls:!0}),e.jsx(je,{type:"monotone",dataKey:"response",name:a("comercial.metrics.trend.response",{defaultValue:"Reply time (avg)"}),stroke:g[1],strokeWidth:2,dot:!1,connectNulls:!0})]})})]})}const yt=["a_chamar","tentando_contato","aguardando_informacoes","em_negociacao","aguardando_pagamento","venda_realizada"];function jt({funnel:t}){const{t:r}=V();if(!t)return null;const a=yt.map(l=>{const s=t.stages.find(c=>c.stage===l),n=xt(l);return{stage:l,label:n?r(n.i18nKey,{defaultValue:n.label}):l,entered:s?.entered??0,conversion:s?.conversion_pct??null}});return e.jsxs("div",{className:"h-full flex flex-col rounded-xl border bg-card p-4",children:[e.jsx("h3",{className:"font-heading text-sm font-medium mb-3",children:r("comercial.metrics.funnel.title",{defaultValue:"Funnel â deals entering each stage"})}),e.jsx("div",{className:"flex-1 min-h-[240px]",children:e.jsx(M,{width:"100%",height:"100%",children:e.jsxs(Y,{data:a,layout:"vertical",margin:{left:24,right:48},children:[e.jsx(F,{strokeDasharray:"3 3",stroke:E.grid,horizontal:!1}),e.jsx(I,{type:"number",allowDecimals:!1,tick:{fontSize:11}}),e.jsx(B,{type:"category",dataKey:"label",width:140,tick:{fontSize:11}}),e.jsx(O,{}),e.jsxs(W,{dataKey:"entered",radius:[0,4,4,0],children:[a.map((l,s)=>e.jsx(le,{fill:g[s%g.length]},s)),e.jsx(ft,{dataKey:"conversion",position:"right",formatter:l=>l!=null?`${l}% â`:"",style:{fontSize:11}})]})]})})}),e.jsx("p",{className:"text-xs text-muted-foreground mt-2",children:r("comercial.metrics.funnel.summary",{defaultValue:"{created} created · {won} won · win rate {wr} · median cycle {cycle} days",params:{created:String(t.totals.created),won:String(t.totals.won),wr:t.totals.win_rate_pct!==null?`${t.totals.win_rate_pct}%`:"â",cycle:t.cycle?.median_days!==null&&t.cycle?.median_days!==void 0?String(Math.round(Number(t.cycle.median_days)*10)/10):"â"}})})]})}function wt(t){const r=t.trim().split(/\s+/);return((r[0]?.[0]||"")+(r[1]?.[0]||"")).toUpperCase()||"?"}function ke({value:t,max:r,color:a}){const l=r>0?Math.max(2,Math.round(t/r*100)):0;return e.jsx("div",{className:"h-1 w-full max-w-[96px] rounded-full bg-muted/60 mt-1","aria-hidden":"true",children:e.jsx("div",{className:"h-1 rounded-full",style:{width:`${l}%`,backgroundColor:a}})})}function kt({sellers:t}){const r=m.useRef(null),{t:a}=V(),[l,s]=m.useState("revenue_brl"),[n,c]=m.useState("desc"),o=[{key:"messages_sent",label:a("comercial.metrics.rank.messages",{defaultValue:"Messages"})},{key:"response_median_seconds",label:a("comercial.metrics.rank.response",{defaultValue:"Median reply"})},{key:"deals_created",label:a("comercial.metrics.rank.created",{defaultValue:"Deals"})},{key:"deals_won",label:a("comercial.metrics.rank.won",{defaultValue:"Won"})},{key:"conversion_pct",label:a("comercial.metrics.rank.conversion",{defaultValue:"Conv. %"})},{key:"work_conversion_pct",label:a("comercial.metrics.rank.work_conversion",{defaultValue:"Worked conv. %"})},{key:"deals_moved",label:a("comercial.metrics.rank.moved",{defaultValue:"Moves"})},{key:"sales",label:a("comercial.metrics.rank.sales",{defaultValue:"Sales"})},{key:"revenue_brl",label:a("comercial.metrics.rank.revenue",{defaultValue:"Revenue"})}],p=m.useMemo(()=>{const i=n==="asc"?1:-1;return[...t].sort((d,h)=>{const _=d[l],f=h[l];return _==null?1:f==null?-1:(Number(_)-Number(f))*i})},[t,l,n]),x=m.useMemo(()=>Math.max(...t.map(i=>i.revenue_brl||0),0),[t]),b=m.useMemo(()=>Math.max(...t.map(i=>i.messages_sent||0),0),[t]),v=m.useMemo(()=>
1{if(t.some(d=>d.total_brl_complete!==!0))return;const i=[...t].filter(d=>(d.revenue_brl||0)>0).sort((d,h)=>(h.revenue_brl||0)-(d.revenue_brl||0))[0];return i?i.seller_id:void 0},[t]),C=i=>{i===l?c(d=>d==="asc"?"desc":"asc"):(s(i),c("desc"))};return t.length?e.jsxs("div",{className:"rounded-xl border bg-card p-5",children:[e.jsx("h3",{className:"font-heading text-sm font-semibold mb-3",children:a("comercial.metrics.rank.title",{defaultValue:"Seller ranking"})}),t.some(i=>i.total_brl_complete!==!0)&&e.jsx("p",{role:"status",className:"mb-3 text-xs text-text-warning",children:a("comercial.metrics.rank.pending",{defaultValue:"Known subtotals only. Conflicting attribution is not credited to any seller; affected sellers remain pending. No top-revenue award until review is complete."})}),e.jsxs("div",{children:[e.jsx("div",{ref:r,className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"text-left text-muted-foreground border-b border-border",children:[e.jsx("th",{className:"py-2 pr-3 font-medium",children:a("comercial.metrics.rank.seller",{defaultValue:"Seller"})}),o.map(i=>e.jsx("th",{className:"py-2 px-2 font-medium whitespace-nowrap","aria-sort":l===i.key?n==="desc"?"descending":"ascending":"none",children:e.jsxs("button",{type:"button",onClick:()=>C(i.key),className:"inline-flex items-center gap-1 hover:text-foreground min-h-[32px]",children:[i.label,l===i.key&&(n==="desc"?e.jsx(Te,{className:"w-3 h-3"}):e.jsx(Ae,{className:"w-3 h-3"}))]})},i.key))]})}),e.jsx("tbody",{className:"tabular-nums",children:p.map((i,d)=>{const h=i.is_ai===!0,_=!h&&(i.seller_id===null||!i.name&&!i.email),f=h?i.name||a("comercial.metrics.rank.sales_ai",{defaultValue:"Sales AI"}):_?a("comercial.metrics.rank.unattributed",{defaultValue:"Unattributed"}):i.name||i.email||"?",y=!_&&i.seller_id===v,A=g[d%g.length];return e.jsxs("tr",{className:`border-b border-border/40 last:border-0 ${y?"bg-emerald-50/60 dark:bg-emerald-950/20":""}`,children:[e.jsx("td",{className:"py-2.5 pr-3",children:e.jsxs("div",{className:"flex items-center gap-2.5",children:[h?e.jsx("span",{"aria-hidden":"true",className:"w-7 h-7 rounded-full bg-sky-50/80 dark:bg-sky-950/30 border border-sky-200/60 dark:border-sky-800/50 flex items-center justify-center shrink-0",children:e.jsx(Me,{className:"w-4 h-4 text-sky-700 dark:text-sky-400"})}):_?e.jsx("span",{className:"w-7 h-7 rounded-full bg-muted/60 border border-border flex items-center justify-center text-2xs text-muted-foreground shrink-0",children:"â"}):e.jsx("span",{"aria-hidden":"true",className:"w-7 h-7 rounded-full flex items-center justify-center text-2xs font-bold text-white shrink-0",style:{backgroundColor:A},children:wt(f)}),e.jsxs("span",{className:`${_?"italic text-muted-foreground":"font-medium text-foreground"} inline-flex items-center gap-1.5`,children:[f,y&&e.jsx(Re,{className:"w-3.5 h-3.5 text-amber-600 dark:text-amber-500","aria-label":a("comercial.metrics.rank.top",{defaultValue:"Top revenue"})})]})]})}),e.jsxs("td",{className:"py-2.5 px-2 align-top",children:[i.messages_sent,e.jsx(ke,{value:i.messages_sent,max:b,color:g[1]})]}),e.jsx("td",{className:"py-2.5 px-2",children:S(i.response_median_seconds)}),e.jsx("td",{className:"py-2.5 px-2",children:i.deals_created}),e.jsx("td",{className:"py-2.5 px-2",children:i.deals_won}),e.jsx("td",{className:"py-2.5 px-2",children:i.conversion_pct!==null?`${i.conversion_pct}%`:"â"}),e.jsxs("td",{className:"py-2.5 px-2 align-top",children:[i.work_conversion_pct!==null&&i.work_conversion_pct!==void 0?`${i.work_conversion_pct}%`:"â",(i.deals_worked??0)>0&&e.jsx("span",{className:"block text-2xs text-muted-foreground",children:a("comercial.metrics.rank.worked_n",{defaultValue:"{n} worked",params:{n:String(i.deals_worked??0)}})})]}),e.jsx("td",{className:"py-2.5 px-2",children:i.deals_moved}),e.jsxs("td",{className:"py-2.5 px-2",children:[i.sales,i.sales_complete!==!0&&e.jsx("span",{className:"block text-xs text-text-warning",children:a("comercial.metrics.rank.count_pending",{defaultValue:"Count incomplete"})})]}),e.jsxs("td",{className:"py-2.5 px-2 font-semibold align-top",children:[T(i.revenue_brl),i.total_brl_complete===!0?e.jsx(ke,{value:i.revenue_brl,max:x,color:g[0]}):e.jsx("span",{className:"block text-xs font-normal text-text-warning",children:a("comercial.metrics.rank.subtotal",{defaultValue:"Subtotal · pen
1ding review"})})]})]},h?"sales-ai":i.seller_id??"unattributed")})})]})}),e.jsx(Ce,{targetRef:r,className:"mt-1"})]})]}):null}function $({label:t,value:r,hint:a}){return e.jsxs("div",{className:"rounded-lg border border-outline-default/30 p-3",children:[e.jsx("div",{className:"text-xs text-muted-foreground",children:t}),e.jsx("div",{className:"text-lg font-heading font-semibold text-foreground",children:r}),a&&e.jsx("div",{className:"text-[11px] text-muted-foreground mt-0.5",children:a})]})}const Ne={chatwoot_assignee:{key:"comercial.metrics.ai.src.assignee",fallback:"Chatwoot assignment"},label:{key:"comercial.metrics.ai.src.label",fallback:"PARAR IA label"},manual:{key:"comercial.metrics.ai.src.manual",fallback:"Manual toggle"},escalation:{key:"comercial.metrics.ai.src.escalation",fallback:"Closer escalation"}};function Nt({ai:t,transfers:r}){const{t:a}=V();return t?e.jsxs("div",{className:"rounded-lg border bg-card p-4",children:[e.jsxs("h3",{className:"font-heading text-sm font-medium mb-3 inline-flex items-center gap-2",children:[e.jsx(Me,{className:"w-4 h-4"}),a("comercial.metrics.ai.title",{defaultValue:"AI attendant (SDR)"})]}),e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3",children:[e.jsx($,{label:a("comercial.metrics.ai.attended",{defaultValue:"Conversations attended"}),value:String(t.attended)}),e.jsx($,{label:a("comercial.metrics.ai.containment",{defaultValue:"Containment rate"}),value:t.containment.pct!==null?`${t.containment.pct}%`:"â",hint:a("comercial.metrics.ai.containment_hint",{defaultValue:"Benchmark: 40â60% typical · 70â85% agentic ({c}/{f} finalized without human)",params:{c:String(t.containment.contained),f:String(t.containment.finalized)}})}),e.jsx($,{label:a("comercial.metrics.ai.handoff",{defaultValue:"Handoff to human"}),value:t.handoff.pct!==null?`${t.handoff.pct}%`:"â",hint:a("comercial.metrics.ai.handoff_hint",{defaultValue:"Healthy range: 15â30% ({n} takeovers)",params:{n:String(t.handoff.taken_over)}})}),e.jsx($,{label:a("comercial.metrics.ai.response",{defaultValue:"AI response time (median)"}),value:S(t.response?.median_seconds),hint:a("comercial.metrics.ai.response_hint",{defaultValue:"{n} reply pairs",params:{n:String(t.response?.pairs??0)}})}),e.jsx($,{label:a("comercial.metrics.ai.follow_ups",{defaultValue:"Follow-ups sent"}),value:String(t.follow_ups)}),e.jsx($,{label:a("comercial.metrics.ai.conversion",{defaultValue:"AI conversion"}),value:t.conversion?`${t.conversion.deals_won}/${t.conversion.deals_created}`:"â",hint:a("comercial.metrics.ai.conversion_hint",{defaultValue:"{l} leads attended â deals created â won",params:{l:String(t.conversion?.leads_attended??0)}})})]}),r&&r.length>0&&e.jsxs("div",{className:"mt-4",children:[e.jsxs("div",{className:"text-xs text-muted-foreground mb-1.5 inline-flex items-center gap-1.5",children:[e.jsx(tt,{className:"w-3.5 h-3.5"}),a("comercial.metrics.ai.transfers",{defaultValue:"Transfers to a human in this period"})]}),e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-xs",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"text-left text-muted-foreground border-b border-border",children:[e.jsx("th",{className:"py-1.5 pr-3 font-medium",children:a("comercial.metrics.ai.transfer_lead",{defaultValue:"Lead"})}),e.jsx("th",{className:"py-1.5 px-2 font-medium",children:a("comercial.metrics.ai.transfer_to",{defaultValue:"Taken over by"})}),e.jsx("th",{className:"py-1.5 px-2 font-medium",children:a("comercial.metrics.ai.transfer_how",{defaultValue:"How"})}),e.jsx("th",{className:"py-1.5 px-2 font-medium",children:a("comercial.metrics.ai.transfer_channel",{defaultValue:"Channel"})}),e.jsx("th",{className:"py-1.5 px-2 font-medium",children:a("comercial.metrics.ai.transfer_when",{defaultValue:"When"})})]})}),e.jsx("tbody",{children:r.slice(0,8).map(l=>e.jsxs("tr",{className:"border-b border-border/40 last:border-0",children:[e.jsx("td",{className:"py-1.5 pr-3",children:l.lead_name||"â"}),e.jsx("td",{className:"py-1.5 px-2 font-medium",children:l.taken_over_by||a("comercial.metrics.ai.transfer_unknown",{defaultValue:"Unknown"})}),e.jsx("td",{className:"py-1.5 px-2",children:l.takeover_source?a(Ne[l.takeover_source]?.key||"comercial.metrics.ai.src.other",{defaultValue:Ne[l.takeover_source]?.fallback||l.takeover_source}):"â"}),e.jsxs("td",{className:"py-1.5 px-2",children:[l.channel_type||"â",l.inbox_id?` #${l.inbox_id}`:""]}),e.jsx("td",{className:"py-1.5 px-2",children:new Date(l.taken_over_at).toLocaleStr
1ing("pt-BR",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit"})})]},l.conversation_id))})]})})]}),t.by_channel.length>0&&e.jsxs("div",{className:"mt-4",children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1.5",children:a("comercial.metrics.ai.by_channel",{defaultValue:"Conversations by channel"})}),e.jsx("div",{className:"flex flex-wrap gap-2",children:t.by_channel.map((l,s)=>e.jsxs("span",{className:"inline-flex items-center gap-1.5 rounded-md border border-outline-default/30 px-2 py-1 text-xs",children:[e.jsx("span",{className:"font-medium",children:l.channel_type||a("comercial.metrics.ai.channel_unknown",{defaultValue:"unknown"})}),l.inbox_id&&e.jsxs("span",{className:"text-muted-foreground",children:["#",l.inbox_id]}),e.jsxs("span",{className:"text-muted-foreground",children:["· ",l.conversations]})]},s))})]})]}):null}const St=(t,r=18)=>t.length>r?`${t.slice(0,r-1)}â¦`:t;function Vt({data:t}){const{t:r}=V(),[a,l]=m.useState("conversations"),[s,n]=m.useState("desc"),c=t?.widget,o=!!c&&c.opens>0,p=m.useMemo(()=>(t?.by_inbox||[]).map(d=>{const h=d;return{name:h.label||d.inbox_name||(d.inbox_id!==null?`#${d.inbox_id}`:r("comercial.metrics.cw.no_inbox",{defaultValue:"No inbox"})),owner:h.owner_kind==="ai"||h.owner_kind==="ai_sales"?r("comercial.metrics.cw.owner_ai_sales",{defaultValue:"Sales AI"}):h.owner_kind==="ai_tech"?r("comercial.metrics.cw.owner_ai_technical",{defaultValue:"Ruminants.AI"}):h.owner_name||(h.owner_kind==="shared"?r("comercial.metrics.cw.owner_shared",{defaultValue:"Shared"}):"â"),conversations:d.conversations,frt:d.frt_median_seconds,aht:d.aht_median_seconds}}),[t,r]),x=m.useMemo(()=>{const d=s==="asc"?1:-1;return[...p].sort((h,_)=>{const f=h[a],y=_[a];return f==null?1:y==null?-1:typeof f=="string"||typeof y=="string"?String(f).localeCompare(String(y))*d:(Number(f)-Number(y))*d})},[p,a,s]),b=d=>{d===a?n(h=>h==="asc"?"desc":"asc"):(l(d),n(d==="name"||d==="owner"?"asc":"desc"))};if(!t||t.totals.conversations===0&&!o)return null;const v=[...p].sort((d,h)=>h.conversations-d.conversations),C=Math.max(220,v.length*30+24),i=[{key:"name",label:r("comercial.metrics.cw.inbox",{defaultValue:"Inbox"}),numeric:!1},{key:"owner",label:r("comercial.metrics.cw.owner",{defaultValue:"Owner"}),numeric:!1},{key:"conversations",label:r("comercial.metrics.cw.conversations",{defaultValue:"Conversations"}),numeric:!0},{key:"frt",label:r("comercial.metrics.cw.frt",{defaultValue:"First reply (median)"}),numeric:!0},{key:"aht",label:r("comercial.metrics.cw.aht",{defaultValue:"Resolution (median)"}),numeric:!0}];return e.jsxs("div",{className:"rounded-lg border bg-card p-4",children:[e.jsx("h3",{className:"font-heading text-sm font-medium mb-1",children:r("comercial.metrics.cw.title",{defaultValue:"Service channels (Chatwoot)"})}),t.totals.conversations>0&&e.jsx("p",{className:"text-xs text-muted-foreground mb-3",children:r("comercial.metrics.cw.summary",{defaultValue:"{n} conversations · response rate {rr} · median first reply {frt} · median resolution {aht}",params:{n:String(t.totals.conversations),rr:t.totals.response_rate_pct!==null?`${t.totals.response_rate_pct}%`:"â",frt:S(t.totals.frt_median_seconds),aht:S(t.totals.aht_median_seconds)}})}),v.length>0&&e.jsx(M,{width:"100%",height:C,children:e.jsxs(Y,{data:v,layout:"vertical",margin:{left:8,right:28},children:[e.jsx(F,{strokeDasharray:"3 3",stroke:E.grid,horizontal:!1}),e.jsx(I,{type:"number",allowDecimals:!1,tick:{fontSize:11}}),e.jsx(B,{type:"category",dataKey:"name",width:172,tick:{fontSize:11},tickFormatter:d=>St(String(d)),interval:0}),e.jsx(O,{formatter:d=>[String(d),r("comercial.metrics.cw.conversations",{defaultValue:"Conversations"})]}),e.jsx(W,{dataKey:"conversations",name:r("comercial.metrics.cw.conversations",{defaultValue:"Conversations"}),radius:[0,4,4,0],maxBarSize:22,children:v.map((d,h)=>e.jsx(le,{fill:g[h%g.length]},h))})]})}),x.length>0&&e.jsx("div",{className:"mt-2 overflow-x-auto",children:e.jsxs("table",{className:"w-full text-xs tabular-nums",children:[e.jsx("thead",{children:e.jsx("tr",{className:"text-left text-muted-foreground border-b border-border",children:i.map(d=>e.jsx("th",{className:`py-1.5 ${d.key==="name"?"pr-3":"px-2"} font-medium whitespace-nowrap`,"aria-sort":a===d.key?s==="desc"?"desce
1nding":"ascending":"none",children:e.jsxs("button",{type:"button",onClick:()=>b(d.key),className:"inline-flex items-center gap-1 hover:text-foreground min-h-[28px]",children:[d.label,a===d.key&&(s==="desc"?e.jsx(Te,{className:"w-3 h-3"}):e.jsx(Ae,{className:"w-3 h-3"}))]})},d.key))})}),e.jsx("tbody",{children:x.map((d,h)=>e.jsxs("tr",{className:"border-b border-border/50 last:border-0",children:[e.jsx("td",{className:"py-1.5 pr-3",children:d.name}),e.jsx("td",{className:"py-1.5 px-2",children:d.owner}),e.jsx("td",{className:"py-1.5 px-2",children:d.conversations}),e.jsx("td",{className:"py-1.5 px-2",children:S(d.frt)}),e.jsx("td",{className:"py-1.5 px-2",children:S(d.aht)})]},h))})]})}),o&&c&&e.jsxs("div",{className:"mt-3 pt-3 border-t border-border/60",children:[e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-wider text-muted-foreground mb-1.5",children:r("comercial.metrics.cw.widget.title",{defaultValue:"Site widget (live chat)"})}),e.jsxs("div",{className:"flex flex-wrap items-center gap-x-5 gap-y-1 text-xs tabular-nums",children:[e.jsxs("span",{children:[e.jsx("span",{className:"font-semibold text-foreground",children:c.opens})," ",e.jsx("span",{className:"text-muted-foreground",children:r("comercial.metrics.cw.widget.opens",{defaultValue:"opens"})})]}),e.jsx("span",{"aria-hidden":"true",className:"text-muted-foreground/50",children:"â"}),e.jsxs("span",{children:[e.jsx("span",{className:"font-semibold text-foreground",children:c.conversations_started})," ",e.jsx("span",{className:"text-muted-foreground",children:r("comercial.metrics.cw.widget.conversations",{defaultValue:"conversations started"})})]}),e.jsx("span",{"aria-hidden":"true",className:"text-muted-foreground/50",children:"â"}),e.jsxs("span",{children:[e.jsx("span",{className:"font-semibold text-foreground",children:c.engagement_pct!==null?`${c.engagement_pct}%`:"â"})," ",e.jsx("span",{className:"text-muted-foreground",children:r("comercial.metrics.cw.widget.engagement",{defaultValue:"engagement"})})]})]}),e.jsx("p",{className:"text-2xs text-muted-foreground/80 mt-1",children:r("comercial.metrics.cw.widget.hint",{defaultValue:"Opens count every time a visitor opens the chat bubble on the website; engagement = conversations started ÷ opens."})})]})]})}function Ct({totals:t,series:r,onDrilldown:a}){const{t:l}=V(),s=g[0],n=!!t&&t.total_brl_complete!==!0,c=r.map(o=>({...o,total_brl:o.total_brl_complete===!0?o.total_brl:null}));return e.jsxs("div",{className:"h-full flex flex-col rounded-xl border bg-card p-5 cursor-pointer hover:shadow-lg transition-shadow",role:"button",tabIndex:0,onClick:a,onKeyDown:o=>{o.key==="Enter"&&a&&a()},"aria-label":l("comercial.metrics.revenue.aria",{defaultValue:"Revenue â click for details"}),children:[e.jsxs("div",{className:"flex items-start justify-between",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-muted-foreground uppercase tracking-wider",children:l("comercial.metrics.revenue.title",{defaultValue:"Revenue"})}),e.jsx("h2",{className:"font-heading text-4xl font-bold text-foreground mt-1",children:T(t?.total_brl)}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:l("comercial.metrics.revenue.sub",{defaultValue:"{n} deal-attributed sales · avg ticket {ticket}",params:{n:String(t?.sales??"â"),ticket:T(t?.total_brl_complete===!0?t.avg_ticket_brl:null)}})})]}),e.jsx("div",{className:"p-2.5 rounded-xl bg-muted/30 border border-border/50",children:e.jsx(at,{className:"h-6 w-6 text-muted-foreground"})})]}),n&&e.jsx("p",{role:"status",className:"mt-2 text-xs text-text-warning",children:l("comercial.metrics.revenue.pending",{defaultValue:"Known subtotal only · currency or attribution pending review. Incomplete days are not plotted; purchase count may also be incomplete."})}),r.length>1&&e.jsx("div",{className:"mt-4 flex-1 min-h-[160px]",children:e.jsx(M,{width:"100%",height:"100%",children:e.jsxs(Ke,{data:c,margin:{top:4,right:4,left:4,bottom:0},children:[e.jsx("defs",{children:e.jsxs("linearGradient",{id:"revFill",x1:"0",y1:"0",x2:"0",y2:"1",children:[e.jsx("stop",{offset:"0%",stopColor:s,stopOpacity:.25}),e.jsx("stop",{offset:"100%",stopColor:s,stopOpacity:.02})]})}),e.jsx(F,{strokeDasharray:"3 3",stroke:E.grid,vertical:!1}),e.jsx(I,{dataKey:"day",tick:{fontSize:10}
1,tickLine:!1,axisLine:!1,minTickGap:40}),e.jsx(B,{tick:{fontSize:10},tickLine:!1,axisLine:!1,width:52,tickFormatter:o=>o>=1e3?`${Math.round(o/1e3)}k`:String(o)}),e.jsx(O,{formatter:o=>T(o==null?null:Number(o))}),e.jsx(Le,{type:"monotone",dataKey:"total_brl",name:l("comercial.metrics.revenue.series",{defaultValue:"Revenue (BRL)"}),stroke:s,strokeWidth:2,fill:"url(#revFill)",dot:!1})]})})})]})}function Dt({sellers:t,onDrilldown:r}){const{t:a}=V(),l=t.filter(s=>(s.is_ai===!0||s.seller_id!==null)&&(s.messages_sent>0||s.deals_moved>0)).map(s=>({name:s.is_ai===!0?s.name||a("comercial.metrics.rank.sales_ai",{defaultValue:"Sales AI"}):(s.name||s.email||"?").split(" ")[0],messages:s.messages_sent,moves:s.deals_moved})).sort((s,n)=>n.messages+n.moves-(s.messages+s.moves));return l.length===0?e.jsx("div",{className:"h-full min-h-[220px] rounded-xl border border-dashed border-border bg-card/50 p-5 flex items-center justify-center text-center",children:e.jsx("p",{className:"text-sm text-muted-foreground",children:a("comercial.metrics.activity.empty",{defaultValue:"No seller activity in this period."})})}):e.jsxs("div",{className:"h-full flex flex-col rounded-xl border bg-card p-5 cursor-pointer hover:shadow-lg transition-shadow",role:"button",tabIndex:0,onClick:r,onKeyDown:s=>{s.key==="Enter"&&r&&r()},children:[e.jsx("h3",{className:"font-heading text-sm font-semibold mb-3",children:a("comercial.metrics.activity.title",{defaultValue:"Seller activity"})}),e.jsx("div",{className:"flex-1 min-h-[200px]",children:e.jsx(M,{width:"100%",height:"100%",children:e.jsxs(Y,{data:l,layout:"vertical",margin:{top:4,right:24,left:8,bottom:0},barGap:2,children:[e.jsx(F,{strokeDasharray:"3 3",stroke:E.grid,horizontal:!1}),e.jsx(I,{type:"number",allowDecimals:!1,tick:{fontSize:10},tickLine:!1,axisLine:!1}),e.jsx(B,{type:"category",dataKey:"name",width:84,tick:{fontSize:12},tickLine:!1,axisLine:!1}),e.jsx(O,{}),e.jsx(ne,{wrapperStyle:{fontSize:11}}),e.jsx(W,{dataKey:"messages",name:a("comercial.metrics.activity.messages",{defaultValue:"Messages"}),fill:g[1],radius:[0,4,4,0],maxBarSize:16}),e.jsx(W,{dataKey:"moves",name:a("comercial.metrics.activity.moves",{defaultValue:"Deal moves"}),fill:g[2],radius:[0,4,4,0],maxBarSize:16})]})})})]})}const H=t=>{const r=new Date(String(t??""));return Number.isNaN(r.getTime())?null:r.toLocaleDateString("pt-BR",{day:"2-digit",month:"2-digit"})},G=t=>{const r=Number(t);return Number.isFinite(r)?r:null};function R(t,r,a){const l=[],s=new Map;for(const n of t){const c=r(n);c!==null&&(s.has(c)||(s.set(c,[]),l.push(c)),s.get(c).push(n))}return l.map(n=>({x:n,...a(s.get(n))}))}const Se=(t,r)=>{const a=t.map(l=>G(l[r])).filter(l=>l!==null);return a.length===0?null:Math.round(a.reduce((l,s)=>l+s,0)/a.length/60*10)/10};function Rt(t,r,a){const l=[...r].reverse();switch(t){case"ttpr":return{xKey:"x",data:R(l,s=>H(s.day),s=>({v:Se(s,"seconds")})),series:[{key:"v",label:a("comercial.metrics.dd.chart.ttpr",{defaultValue:"First reply (avg min)"}),kind:"minutes"}]};case"response_pairs":return{xKey:"x",data:R(l,s=>H(s.inbound_at),s=>({v:Se(s,"seconds")})),series:[{key:"v",label:a("comercial.metrics.dd.chart.pairs",{defaultValue:"Reply time (avg min)"}),kind:"minutes"}]};case"cohort_deals":return{xKey:"x",data:R(r,s=>String(s.stage??s.current_stage??"â"),s=>({v:s.length})),series:[{key:"v",label:a("comercial.metrics.dd.chart.deals",{defaultValue:"Deals"}),kind:"count"}]};case"won_lost":{const s=n=>String(n.to_stage??n.stage??"").includes("realizada");return{xKey:"x",stacked:!0,data:R(l,n=>H(n.created_at),n=>({won:n.filter(s).length,lost:n.filter(c=>!s(c)).length})),series:[{key:"won",label:a("comercial.metrics.dd.chart.won",{defaultValue:"Won"}),kind:"count"},{key:"lost",label:a("comercial.metrics.dd.chart.lost",{defaultValue:"Lost"}),kind:"count"}]}}case"cycle":return{xKey:"x",data:r.map(n=>({x:String(n.lead_name??n.deal_id??"?"),v:G(n.days)})).filter(n=>n.v!==null).sort((n,c)=>c.v-n.v).slice(0,30),series:[{key:"v",label:a("comercial.metrics.dd.chart.cycle",{defaultValue:"Days to close"}),kind:"days"}]};case"revenue_sales":return{xKey:"x",data:R(l,s=>H(s.sale_date),s=>({v:s.some(n=>n.price_brl==null||n.price_brl===""||G(n.price_brl)===null||n.attribution_conflict)?null:s.reduce((n,c)=>n+Number(c.price_brl),0)})),series:[{key:"v",label:a("comercial.metrics.dd.chart.revenue",{defaultValue:"Revenue (BRL)"}),kind:"brl"}]};case"stage_sla":return{xKey:"x",data:R(r,s=>String(s.stage??s.current_stage??"â"),s=>({v:s.length})),series:[{key:"v",label:a("comercial.metrics.dd.chart.open_deals",{defaultValue:"Open deals"}
1),kind:"count"}]};case"ai_conversations":{const s=n=>n.atendimento_humano===!0||!!n.taken_over_at;return{xKey:"x",stacked:!0,data:R(r,n=>String(n.etapa_atendimento??"â"),n=>({contained:n.filter(c=>!s(c)).length,handoff:n.filter(s).length})),series:[{key:"contained",label:a("comercial.metrics.dd.chart.contained",{defaultValue:"AI contained"}),kind:"count"},{key:"handoff",label:a("comercial.metrics.dd.chart.handoff",{defaultValue:"Handed off"}),kind:"count"}]}}case"chatwoot_conversations":return{xKey:"x",data:R(r,s=>String(s.inbox_name??(s.inbox_id!==null&&s.inbox_id!==void 0?`#${s.inbox_id}`:"â")),s=>({v:s.length})),series:[{key:"v",label:a("comercial.metrics.dd.chart.conversations",{defaultValue:"Conversations"}),kind:"count"}]};default:return null}}const Tt=(t,r)=>{if(t==="brl"&&(r==null||r===""))return"â";const a=G(r);return a===null?"â":t==="minutes"?S(a*60):t==="brl"?T(a):t==="days"?`${a}d`:String(a)};function At({metric:t,rows:r,hasMore:a}){const{t:l}=V(),s=Rt(t,r,l);if(!s||s.data.length===0)return null;const n=s.series.length===1,c=s.data.length>8;return e.jsxs("div",{className:"rounded-lg border border-border bg-card/60 p-3",children:[t==="revenue_sales"&&r.some(o=>o.price_brl==null||o.attribution_conflict)&&e.jsx("p",{role:"status",className:"mb-2 text-xs text-text-warning",children:l("comercial.metrics.dd.chart.pending",{defaultValue:"Days with unresolved currency or attribution are not plotted. Missing revenue is not zero."})}),e.jsx("div",{className:"h-[300px]",children:e.jsx(M,{width:"100%",height:"100%",children:e.jsxs(Y,{data:s.data,margin:{top:8,right:16,left:4,bottom:c?34:4},children:[e.jsx(F,{strokeDasharray:"3 3",stroke:E.grid,vertical:!1}),e.jsx(I,{dataKey:s.xKey,tick:{fontSize:10},interval:0,angle:c?-35:0,textAnchor:c?"end":"middle",height:c?48:22}),e.jsx(B,{tick:{fontSize:10},allowDecimals:!1,width:44}),e.jsx(O,{formatter:(o,p)=>{const x=s.series.find(b=>b.label===p)||s.series[0];return[Tt(x.kind,o),String(p)]}}),!n&&e.jsx(ne,{wrapperStyle:{fontSize:11}}),s.series.map((o,p)=>e.jsx(W,{dataKey:o.key,name:o.label,stackId:s.stacked?"a":void 0,fill:g[p%g.length],radius:s.stacked&&p<s.series.length-1?0:[3,3,0,0],maxBarSize:40,children:n&&s.data.map((x,b)=>e.jsx(le,{fill:g[p%g.length]},b))},o.key))]})})}),a&&e.jsx("p",{className:"text-2xs text-muted-foreground mt-1.5",children:l("comercial.metrics.dd.chart.page_note",{defaultValue:"Chart aggregates the rows on this page â use the arrows below to browse more."})})]})}const re=50,Ve={ttpr:{key:"comercial.metrics.dd.how.ttpr",fallback:"Per lead-day (America/Sao_Paulo): the FIRST inbound WhatsApp message of the day is paired with the first HUMAN reply after it on the same day. Median and average are computed over the answered lead-days. Human reply = platform send or seller reply captured via fromMe, attributed by triggered_by_user_id. Source: communications_log."},response_pairs:{key:"comercial.metrics.dd.how.pairs",fallback:"Each HUMAN outbound whose immediately-previous message from the same lead is an inbound forms a reply pair (any other outbound in between breaks the pair). Time = reply timestamp minus inbound timestamp. Source: communications_log."},cohort_deals:{key:"comercial.metrics.dd.how.cohort",fallback:"Deals CREATED inside the selected period (merged/archived excluded), with their current stage. Cohort conversion = deals currently won ÷ deals created. Source: commercial_deals."},won_lost:{key:"comercial.metrics.dd.how.wonlost",fallback:'Stage transitions into "venda_realizada" or "venda_perdida" registered inside the period. Win rate = won ÷ (won + lost). Source: lead_timeline (commercial_stage_changed).'},cycle:{key:"comercial.metrics.dd.how.cycle",fallback:'For each deal whose transition to "venda_realizada" happened in the period: days between the deal creation and that transition. Median/average over these deals. Source: commercial_deals + lead_timeline.'},revenue_sales:{key:"comercial.metrics.dd.how.revenue",fallback:"Sales linked to a CRM deal (financeiro_sales.commercial_deal_id), not soft-deleted, with sale_date inside the peri
1od. Revenue = sum of price_brl; avg ticket = average. Seller = who made the sale (financeiro_sales.sold_by_user_id), falling back to the deal's assigned seller for sales recorded before v2.336.0. Source: financeiro_sales + commercial_deals."},stage_sla:{key:"comercial.metrics.dd.how.sla",fallback:"OPEN deals (not won/lost/refunded/completed) with the time elapsed since the deal entered its current stage (last stage transition, or creation). SLA verdicts appear only for stages with an admin-configured limit. Source: commercial_deals + lead_timeline."},ai_conversations:{key:"comercial.metrics.dd.how.ai",fallback:"SDR conversations with at least one message in the period. Containment = finalized without human takeover; handoff = taken over by a human (author and source recorded). Source: sdr_conversations + sdr_conversation_messages."},chatwoot_conversations:{key:"comercial.metrics.dd.how.chatwoot",fallback:"Chatwoot conversations (all inboxes, excluding WhatsApp groups/broadcasts) created in the period. First reply = first human agent outgoing message (bot replies never count); resolution = time until the conversation was resolved. Source: chatwoot_conversations (webhook + API backfill)."}};function Mt(t,r){if(r==null||r==="")return"â";if(t==="seconds"||t.endsWith("_seconds"))return S(Number(r));if(t==="days")return`${Math.round(Number(r)*10)/10}d`;if(t.includes("minutes"))return S(Number(r)*60);if(t.includes("price")||t.includes("revenue")||t.includes("brl"))return T(Number(r));if(typeof r=="boolean")return r?"â":"â";if(t.endsWith("_at")||t==="sale_date"||t==="created_at"){const a=new Date(String(r));return Number.isNaN(a.getTime())?String(r):a.toLocaleString("pt-BR",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit"})}return String(r)}function Lt({open:t,onClose:r,metric:a,title:l,params:s}){const n=m.useRef(null),{t:c}=V(),[o,p]=m.useState(null),[x,b]=m.useState(!1),[v,C]=m.useState(0),[i,d]=m.useState(!1),h=m.useCallback(async f=>{if(a){b(!0),d(!1);try{const y=await ot.get(a,{...s,limit:re,offset:f});p(y),C(f)}catch{d(!0),p(null)}finally{b(!1)}}},[a,s]);if(m.useEffect(()=>{t&&a&&(p(null),h(0))},[t,a,h]),!a)return null;const _=o&&o.rows.length>0?Object.keys(o.rows[0]):[];return e.jsx(Ue,{open:t,onOpenChange:f=>{f||r()},children:e.jsxs(He,{className:"max-w-4xl max-h-[85vh] overflow-y-auto",children:[e.jsxs(Pe,{children:[e.jsx(qe,{className:"font-heading",children:l}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:[c("comercial.metrics.dd.period",{defaultValue:"Period: {from} to {to}",params:{from:String(s.from||"â"),to:String(s.to||"â")}}),s.seller_id?` · ${c("comercial.metrics.dd.seller_filtered",{defaultValue:"filtered by seller"})}`:""]})]}),e.jsxs("div",{className:"rounded-lg border border-outline-default/30 bg-surface-elevated/40 p-3 flex gap-2.5",children:[e.jsx(st,{className:"w-4 h-4 mt-0.5 shrink-0 text-muted-foreground"}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-semibold text-foreground mb-0.5",children:c("comercial.metrics.dd.how_title",{defaultValue:"How this number is built"})}),e.jsx("p",{className:"text-xs text-muted-foreground leading-relaxed",children:a==="revenue_sales"?c("comercial.metrics.dd.how.recognized_revenue",{defaultValue:"Recognized financial contributions linked to deals, by sale date. CRM projections are excluded. Revenue is the known BRL subtotal; ticket is revenue per distinct purchase, unavailable while currency or attribution is pending. The recorded seller takes precedence over the current deal owner. Conflicting links are shown for review, never credited."}):c(Ve[a].key,{defaultValue:Ve[a].fallback})})]})]}),x?e.jsx("div",{className:"flex items-center justify-center py-10 text-muted-foreground",children:e.jsx(rt,{className:"w-5 h-5 animate-spin"})}):i?e.jsxs("div",{role:"alert",className:"py-6 text-sm text-text-danger",children:[e.jsx("p",{children:c("comercial.metrics.dd.load_failed",{defaultValue:"Could not load underlying rows. This is not an empty result."})}),e.jsx(Ge,{type:"button",variant:"outline",className:"mt-2",onClick:()=>h(v),children:c("common.retry",{defaultValue:"Retry"})})]}):!o||o.rows.length===0?e.jsx("p",{className:"text-sm text-muted-foreground py-6 text-center",children:c("comercial.metrics.dd.empty",{defaultValue:"No underlying rows in this period."})}):e.jsxs(e.Fragment,{children:[a==="revenue_sales"&&o.summary&&e.jsxs("div",{role:"status",className:"rounded-md border border-border p-3 text-sm",children:[c("comercial.metrics.dd.full_scope_summary",{defaultValue:"Full filtered scope: {purchases} purchases · {rows} rows · {value} BRL",params:{purchases:String(o.summary.sales),rows:String(o.total_rows??"â"),value:T(o.summary.total_brl)}}),o.summary.total_brl_complete!==!0&&e.jsx("p",{className:"mt-1 text-text-warning",children:c("comercial.metrics.dd.summary_pending",{defaultValue:"Known subtotal only · purchase count or currency pen
1ding review. Totals are not limited to this page."})})]}),e.jsx(At,{metric:a,rows:o.rows,hasMore:!!o.has_more||v>0}),e.jsxs("div",{children:[e.jsx("div",{ref:n,className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-xs",children:[e.jsx("thead",{children:e.jsx("tr",{className:"text-left text-muted-foreground border-b border-border",children:_.map(f=>e.jsx("th",{className:"py-1.5 px-2 font-medium whitespace-nowrap",children:c(`comercial.metrics.dd.col.${f}`,{defaultValue:f.replace(/_/g," ")})},f))})}),e.jsx("tbody",{children:o.rows.map((f,y)=>e.jsx("tr",{className:"border-b border-border/40 last:border-0",children:_.map(A=>e.jsx("td",{className:"py-1.5 px-2 whitespace-nowrap",children:Mt(A,f[A])},A))},y))})]})}),e.jsx(Ce,{targetRef:n,className:"mt-1"})]}),e.jsxs("div",{className:"flex items-center justify-between pt-1",children:[e.jsx("span",{className:"text-2xs text-muted-foreground",children:c("comercial.metrics.dd.cache_note",{defaultValue:"Dashboard numbers are cached for 5 minutes; this table reads live."})}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("button",{type:"button",disabled:v===0,onClick:()=>h(Math.max(0,v-re)),className:"p-1.5 rounded-md border border-border disabled:opacity-30 hover:bg-muted/50",children:e.jsx(lt,{className:"w-3.5 h-3.5"})}),e.jsxs("span",{className:"text-xs text-muted-foreground px-1",children:[v+1,"â",v+o.rows.length]}),e.jsx("button",{type:"button",disabled:!o.has_more,onClick:()=>h(v+re),className:"p-1.5 rounded-md border border-border disabled:opacity-30 hover:bg-muted/50",children:e.jsx(nt,{className:"w-3.5 h-3.5"})})]})]})]})]})})}const Kt=[7,14,30,60,90],P=t=>t.toISOString().slice(0,10);let q=null;function z({children:t}){return e.jsx("p",{className:"text-2xs font-semibold uppercase tracking-[0.14em] text-muted-foreground/80 mb-2",children:t})}function Gt(){const{t}=V(),[r,a]=m.useState(30),[l,s]=m.useState("preset"),[n,c]=m.useState(""),[o,p]=m.useState(""),[x,b]=m.useState(""),[v,C]=m.useState([]),[i,d]=m.useState(!0),[h,_]=m.useState(!1),[f,y]=m.useState(null),[A,X]=m.useState(null),[Z,ie]=m.useState(null),[$e,oe]=m.useState(null),[ce,Q]=m.useState([]),[J,de]=m.useState(null),[ze,me]=m.useState(null),[Ee,ee]=m.useState([]),[Fe,ue]=m.useState({}),[te,he]=m.useState(null);m.useEffect(()=>{ct.list().then(u=>C(u.items)).catch(()=>{})},[]);const ae=m.useCallback(async(u=!1)=>{_(!1);let j,N;if(l==="custom"&&n&&o)j=n,N=o;else{const w=new Date;N=P(w),j=P(new Date(w.getTime()-(r-1)*24*60*60*1e3))}const D=new Date(`${j}T00:00:00Z`),Be=new Date(`${N}T00:00:00Z`).getTime()-D.getTime()+24*60*60*1e3,Oe=P(new Date(D.getTime()-24*60*60*1e3)),We=P(new Date(D.getTime()-Be)),fe=`${j}|${N}|${x}`;if(!u&&q&&q.key===fe){const w=q.data;y(w.overview),X(w.previousOverview),ie(w.responseTimes),oe(w.funnel),Q(w.ranking),de(w.ai),me(w.chatwoot),ee(w.revenueSeries),ue(w.range),d(!1);return}const U={from:j,to:N,seller_id:x||void 0,fresh:u?1:void 0};ue(U),d(!0);try{const[w,xe,pe,ge,be,ve,_e]=await Promise.all([L.overview(U),L.overview({from:We,to:Oe,seller_id:x||void 0}).catch(()=>null),L.responseTimes(U),L.funnel(U),L.sellers({from:j,to:N}),L.ai({from:j,to:N}),dt.get({from:j,to:N}).catch(()=>null)]);y(w),X(xe),ie(pe),oe(ge),Q(be.sellers),de(ve),me(_e);const ye=w.revenue_series||[];ee(ye),q={key:fe,data:{overview:w,previousOverview:xe,responseTimes:pe,funnel:ge,ranking:be.sellers,ai:ve,chatwoot:_e,revenueSeries:ye,range:{from:j,to:N,seller_id:x||void 0}}}}catch{_(!0),y(null),X(null),ee([]),Q([]),Ye.error(t("comercial.metrics.load_error",{defaultValue:"Failed to load metrics"}))}finally{d(!1)}},[r,l,n,o,x,t]);m.useEffect(()=>{ae()},[ae]);const Ie=m.useMemo(()=>{const u=Z?.series||[],j=N=>u.filter(D=>D[N]!==null&&D[N]!==void 0).map(D=>({day:D.day,value:Math.round(Number(D[N])/60*10)/10}));return{ttpr:j("ttpr_median_seconds"),response:j("response_avg_seconds")}},[Z]),k=m.useCallback((u,j)=>{he({metric:u,title:j})},[]);return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsxs("select",{value:l==="preset"?String(r):"custom",onChange:u=>{u.target.value==="custom"?s("custom"):(s("preset"),a(Number(u.target.value)))},className:"bg-card border border-border rounded-md px-3 py-2 text-sm","aria-label":t("comercial.metrics.filter.period",{defaultValue:"Period"}),children:[Kt.map(u=>e.jsx("option",{value:u,children:t("comercial.metrics.filter.days",{defaultValue:"{count} days",params:{count:String(u)}})},u)),e.jsx("option",{value:"custom",children:t("comercial.metrics.filter.custom",{defaultValue:"Customâ¦"})})]}),l==="custom"&&e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"date",value:n,onChange:u=>c(u.target.value),className:"bg-card border border-border rounded-md px-3 py-2 text-sm"}),e.jsx("span",{className:"text-sm text-muted-foreground",children:t("comercial.metrics.filter.to",{defaultValue:"to"})}),e.jsx("input",{type:"date",value:o,onChange:u=>p(u.target.value),className:"bg-card border border-border rounded-md px-3 py-2 text-sm"})]}),e.jsxs("select",{value:x,onChange:u=>b(u.target.value),className:"h-10 max-w-full rounded-md border border-input bg-background px-3 text-sm text-foreground","aria-label":t("comercial.filter.seller",{defaultValue:"Seller"}),children:[e.jsx("option",{value:"",children:t("comercial.filter.all_sellers",{defaultValue:"All sellers"})}),v.map(u=>e.jsx("option",{value:String(u.id),children:u.name||u.email},u.id))]}),e.jsxs("button",{type:"button",onClick:()=>ae(!0),disabled:i,className:"inline-flex items-center gap-1.5 h-10 px-3 rounded-md border border-border bg-card text-sm hover:bg-muted/50 disabled:opacity-50","aria-label":t("comercial.metrics.refresh",{defaultValue:"Update"}),children:[e.jsx(it,{className:`w-3.5 h-3.5 ${i?"animate-spin":""}`}),t("comercial.metrics.refresh",{defaultValue:"Update"})]})]}),h&&e.jsx("p",{role:"alert",className:"rounded-md bg-surface-tint-red text-text-danger p-3 text-sm",children:t("comercial.metrics.financial_load_error",{defaultValue:"Financial data could not be loaded. No zero total is inferred. Use Update to retry."})}),e.jsxs("section",{className:"grid gap-4 lg:grid-cols-2 items-stretch animate-in fade-in duration-300",children:[e.jsxs("div",{className:"flex flex-col",children:[e.jsx(z,{children:t("comercial.metrics.q.revenue",{defaultValue:"Result"})}),e.jsx(Ct,{totals:i||h?null:f?.revenue??null,series:i||h?[]:Ee,onDrilldown:()=>k("revenue_sales",t("comercial.metrics.kpi.revenue",{defaultValue:"Revenue"}))})]}),e.jsxs("div",{className:"flex flex-col",children:[e.jsx(z,{children:t("comercial.metrics.q.pipeline",{defaultValue:"Pipeline health"})}),e.jsx("div",{role:"button",tabIndex:0,className:"cursor-pointer flex-1",onClick:()=>k("cohort_deals",t("comercial.metrics.funnel.title",{defaultValue:"Funnel â deals entering each stage"})),onKeyDown:u=>{u.key==="Enter"&&k("cohort_deals",t("comercial.metrics.funnel.title",{defaultValue:"Funnel â deals entering each stage"}))},children:e.jsx(jt,{funnel:$e})})]})]}),e.jsxs("section",{className:"animate-in fade-in duration-300",style:{animationDelay:"60ms"},children:[e.jsx(z,{children:t("comercial.metrics.q.kpis",{defaultValue:"Primary indicators"})}),e.jsx(vt,{overview:i||h?null:f,previousOverview:A,sparklines:Ie,onDrilldown:k})]}),e.jsxs("section",{className:"animate-in fade-in duration-300",style:{animationDelay:"120ms"},children:[e.jsx(z,{children:t("comercial.metrics.q.diagnostics",{defaultValue:"Diagnostics"})}),e.jsxs("div",{className:"grid gap-4 lg:grid-cols-2 items-stretch",children:[e.jsx("div",{role:"button",tabIndex:0,className:"cursor-pointer h-full",onClick:()=>k("response_pairs",t("comercial.metrics.trend.title",{defaultValue:"Response times (minutes)"})),onKeyDown:u=>{u.key==="Enter"&&k("response_pairs",t("comercial.metrics.trend.title",{defaultValue:"Response times (minutes)"}))},children:e.jsx(_t,{data:Z,aiMedianSeconds:J?.response?.median_seconds??null})}),e.jsx(Dt,{sellers:ce,onDrilldown:()=>k("response_pairs",t("comercial.metrics.activity.title",{defaultValue:"Seller activity"}))})]}),e.jsx("div",{className:"mt-4",children:e.jsx(kt,{sellers:i||h?[]:ce})})]}),e.jsxs("section",{className:"animate-in fade-in duration-300",style:{animationDelay:"180ms"},children:[e.jsx(z,{children:t("comercial.metrics.q.service",{defaultValue:"AI & service channels"})}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{role:"button",tabIndex:0,className:"cursor-pointer",onClick:()=>k("ai_conversations",t("comercial.metrics.ai.title",{defaultValue:"AI attendant (SDR)"})),onKeyDown:u=>{u.key==="Enter"&&k("ai_conversations",t("comercial.metrics.ai.title",{defaultValue:"AI attendant (SDR)"}))},children:e.jsx(Nt,{ai:J,transfers:J?.transfers})}),e.jsx("div",{role:"button",tabIndex:0,className:"cursor-pointer",onClick:()=>k("chatwoot_conversations",t("comercial.metrics.cw.title",{defaultValue:"Service channels (Chatwoot)"})),onKeyDown:u=>{u.key==="Enter"&&k("chatwoot_conversations",t("comercial.metrics.cw.title",{defaultValue:"Service channels (Chatwoot)"}))},children:e.jsx(Vt,{data:ze})})]})]}),f&&f.stage_durations.some(u=>u.over_sla_count!==null&&u.over_sla_count>0)&&e.jsxs("section",{className:"animate-in fade-in duration-300",style:{animationDelay:"240ms"},children:[e.jsx(z,{children:t("comercial.metrics.q.alerts",{defaultValue:"SLA alerts"})}),e.jsx("div",{role:"button",tabIndex:0,className:"rounded-xl border border-amber-500/40 bg-amber-50/60 dark:bg-amber-950/20 p-4 cursor-pointer",onClick:()=>k("stage_sla",t("comercial.metrics.q.alerts",{defaultValue:"SLA alerts"})),onKeyDown:u=>{u.key==="Enter"&&k("stage_sla",t("comercial.metrics.q.alerts",{defaultValue:"SLA alerts"}))},children:e.jsx("p",{className:"text-sm text-foreground",children:t("comercial.metrics.sla_alert",{defaultValue:"{n} open deals over the configured stage SLA â click to inspect",params:{n:String(f.stage_durations.reduce((u,j)=>u+(j.over_sla_count||0),0))}})})})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:t("comercial.metrics.data_note",{defaultValue:"Response-time metrics cover messages captured since live ingestion/backfill. WhatsApp conversations are never auto-closed, so handling time is reported for Chatwoot only."})}),e.jsx(Lt,{open:!!te,onClose:()=>he(null),metric:te?.metric??null,title:te?.title??"",params:Fe})]})}
1export{Gt as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.