'use client'; import React, { useState, useEffect, useCallback } from 'react'; import Link from 'next/link'; import { useAuth } from '@/contexts/AuthContext'; import { useRouter } from 'next/navigation'; function fmt(cents: number) { return '$' + (cents / 100).toLocaleString('en-US', { minimumFractionDigits: 2 }); } export default function CommissionsPage() { const { user, loading } = useAuth(); const router = useRouter(); const [commissions, setCommissions] = useState([]); const [summary, setSummary] = useState([]); const [loadingData, setLoadingData] = useState(true); const [year, setYear] = useState(new Date().getFullYear()); const [filterStaff, setFilterStaff] = useState(''); const [staff, setStaff] = useState([]); useEffect(() => { if (!loading && !user) router.push('/login'); }, [user, loading, router]); const load = useCallback(async () => { setLoadingData(true); const params = new URLSearchParams({ year: String(year) }); if (filterStaff) params.set('staff_id', filterStaff); const [cr, sr, staffR] = await Promise.all([ fetch(`/api/accounting/commissions?${params}`), fetch(`/api/accounting/commissions/summary?year=${year}`), fetch('/api/accounting/staff'), ]); const [cd, sd, staffD] = await Promise.all([cr.json(), sr.json(), staffR.json()]); setCommissions(cd.commissions ?? []); setSummary(sd.summary ?? []); setStaff(staffD.staff ?? []); setLoadingData(false); }, [year, filterStaff]); useEffect(() => { if (user) load(); }, [user, load]); async function markPaid(id: string) { await fetch(`/api/accounting/commissions/${id}/mark-paid`, { method: 'POST' }); load(); } if (loading) return
; if (!user) return null; return (

Commissions

← Accounting
{/* Summary per staff */}
{summary.map((s: any) => { const pct = s.next_threshold_cents ? Math.min(100, Math.round((s.ytd_sales_cents / s.next_threshold_cents) * 100)) : 100; return (

{s.full_name}

{s.current_tier}

YTD Sales

{fmt(s.ytd_sales_cents ?? 0)}

Earned

{fmt(s.earned_cents ?? 0)}

Outstanding

{fmt(s.outstanding_cents ?? 0)}

{s.next_threshold_cents && (
Tier progress{pct}%
)}
); })}
{/* Detail table */}
{['Staff','Invoice','Sale Amount','Rate','Commission','YTD at Time','Paid',''].map(h => ( ))} {loadingData ? ( ) : commissions.length === 0 ? ( ) : commissions.map((c: any) => ( ))}
{h}
Loading…
No commission records
{c.rmp_sales_staff?.full_name ?? '—'} {c.rmp_invoices?.invoice_number ?? '—'} {fmt(c.sale_amount_cents ?? 0)} {((c.commission_rate ?? 0) * 100).toFixed(1)}% {fmt(c.commission_amount_cents ?? 0)} {fmt(c.ytd_sales_at_time_cents ?? 0)} {c.paid ? 'Paid' : 'Unpaid'} {!c.paid && }
); }