PageSourceSearch

https://www.simbacarhire.com.au/assets/BusinessAnalyticsTab-IsGcsfbC.js

js simbacarhire.com.au collected 2026-10-01 23:50:46 UTC 5,182 bytes, 1 lines download raw bytes

1import{r as n,V as S,j as e,L as R,aZ as k,bL as w,aB as A,d,h as m,e as p,f,o as M}from"./index-K4f5-ZQX.js";import{T as O,a as B,b as v,c as x,d as L,e as u}from"./table-D0egvJgs.js";import{P as E}from"./package-Dt1XN3o_.js";import{R as y}from"./ResponsiveContainer-H1-fTj4Q.js";import{B as D}from"./BarChart-Dkd5x08a.js";import{C as F}from"./CartesianGrid-CqxLV5As.js";import{X as P,Y as V,T as b,B as z,C as K,L as $}from"./generateCategoricalChart-M6QrsUi4.js";import{P as H,a as U}from"./PieChart-DoiZtLzq.js";import{p as X}from"./parseISO-CWQ1i7t3.js";import"./index-91cxZt_C.js";import"./index-Dh4i1-J3.js";const Y={confirmed:"#22c55e",reserved:"#3b82f6",draft:"#a3a3a3",pending:"#f59e0b",partial:"#f97316",cancelled:"#ef4444",failed:"#dc2626"},G=r=>{const i=["#8b5cf6","#ec4899","#06b6d4","#84cc16","#f43f5e"];return i[r%i.length]};function ne(){const[r,i]=n.useState([]),[N,C]=n.useState(!0);n.useEffect(()=>{(async()=>{const{data:a}=await M.from("business_fleet_orders").select("id, company_name, total_amount, total_vehicles, status, payment_status, pickup_location_name, created_at").order("created_at",{ascending:!1});i(a||[]),C(!1)})()},[]);const o=n.useMemo(()=>{const s=r.filter(l=>l.status!=="cancelled"),a=s.reduce((l,T)=>l+(T.total_amount||0),0),t=new Set(r.map(l=>l.company_name)),_=s.length?a/s.length:0;return{totalOrders:r.length,totalRevenue:a,activeCompanies:t.size,avgValue:_}},[r]),j=n.useMemo(()=>{const s=new Map;return r.filter(a=>a.status!=="cancelled").forEach(a=>{const t=S(X(a.created_at),"MMM yyyy");s.set(t,(s.get(t)||0)+(a.total_amount||0))}),Array.from(s.entries()).slice(-12).map(([a,t])=>({month:a,revenue:t}))},[r]),g=n.useMemo(()=>{const s=new Map;return r.filter(a=>a.status!=="cancelled").forEach(a=>{const t=s.get(a.company_name)||{orders:0,revenue:0,vehicles:0};s.set(a.company_name,{orders:t.orders+1,revenue:t.revenue+(a.total_amount||0),vehicles:t.vehicles+(a.total_vehicles||0)})}),Array.from(s.entries()).map(([a,t])=>({name:a,...t})).sort((a,t)=>t.revenue-a.revenue).slice(0,10)},[r]),h=n.useMemo(()=>{const s=new Map;return r.forEach(a=>s.set(a.status,(s.get(a.status)||0)+1)),Array.from(s.entries()).map(([a,t])=>({name:a,value:t}))},[r]),c=s=>`A$${(s??0).toLocaleString("en-AU",{minimumFractionDigits:2,maximumFractionDigits:2})}`;return N?e.jsx("div",{className:"flex items-center justify-center py-20",children:e.jsx(R,{className:"h-6 w-6 animate-spin text-muted-foreground"})}):e.jsxs("div",{className:"space-y-6",children:[e.jsx("div",{className:"grid grid-cols-2 lg:grid-cols-4 gap-4",children:[{label:"Total Orders",value:o.totalOrders.toString(),icon:E},{label:"Total Revenue",value:c(o.totalRevenue),icon:k},{label:"Active Companies",value:o.activeCompanies.toString(),icon:w},{label:"Avg Order Value",value:c(o.avgValue),icon:A}].map(s=>e.jsx(d,{children:e.jsxs(m,{className:"p-4",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[e.jsx(s.icon,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("span",{className:"text-xs text-muted-foreground",children:s.label})]}),e.jsx("p",{className:"text-xl font-bold",children:s.value})]})},s.label))}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-6",children:[e.jsxs(d,{className:"lg:col-span-2",children:[e.jsx(p,{children:e.jsx(f,{className:"text-base font-semibold",children:"Monthly Revenue"})}),e.jsx(m,{children:j.length===0?e.jsx("p",{className:"text-sm text-muted-foreground text-center py-8",children:"No revenue data yet."}):e.jsx(y,{width:"100%",height:280,children:e.jsxs(D,{data:j,children:[e.jsx(F,{strokeDasharray:"3 3",className:"stroke-border"}),e.jsx(P,{dataKey:"month",className:"text-xs",tick:{fontSize:11}}),e.jsx(V,{className:"text-xs",tick:{fontSize:11},tickFormatter:s=>`$${(s/1e3).toFixed(0)}k`}),e.jsx(b,{formatter:s=>[c(s),"Revenue"]}),e.jsx(z,{dataKey:"revenue",fill:"hsl(var(--primary))",radius:[4,4,0,0]})]})})})]}),e.jsxs(d,{children:[e.jsx(p,{children:e.jsx(f,{className:"text-base font-semibold",children:"Orders by Status"})}),e.jsx(m,{children:h.length===0?e.jsx("p",{className:"text-sm text-muted-foreground text-center py-8",children:"No data."}
1):e.jsx(y,{width:"100%",height:280,children:e.jsxs(H,{children:[e.jsx(U,{data:h,dataKey:"value",nameKey:"name",cx:"50%",cy:"50%",outerRadius:80,label:!1,children:h.map((s,a)=>e.jsx(K,{fill:Y[s.name]||G(a)},a))}),e.jsx($,{formatter:s=>e.jsx("span",{className:"text-xs capitalize",children:s})}),e.jsx(b,{})]})})})]})]}),e.jsxs(d,{children:[e.jsx(p,{children:e.jsx(f,{className:"text-base font-semibold",children:"Top Companies by Revenue"})}),e.jsx(m,{className:"p-0",children:g.length===0?e.jsx("p",{className:"text-sm text-muted-foreground text-center py-8",children:"No company data yet."}):e.jsxs(O,{children:[e.jsx(B,{children:e.jsxs(v,{children:[e.jsx(x,{children:"Company"}),e.jsx(x,{children:"Orders"}),e.jsx(x,{children:"Vehicles"}),e.jsx(x,{children:"Revenue"})]})}),e.jsx(L,{children:g.map(s=>e.jsxs(v,{children:[e.jsx(u,{className:"font-medium",children:s.name}),e.jsx(u,{children:s.orders}),e.jsx(u,{children:s.vehicles}),e.jsx(u,{className:"font-semibold",children:c(s.revenue)})]},s.name))})]})})]})]})}export{ne as BusinessAnalyticsTab};

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.