'use client' import { useState, useEffect } from 'react' import Link from 'next/link' import { useTranslations } from 'next-intl' import { Badge } from '@/components/ui/badge' import { Skeleton } from "@/components/ui/skeleton" import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { EmptyState } from '@/components/ui/empty-state' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table' import { Plus, Users, HandCoins, CalendarDays, ArrowRight } from 'lucide-react' import { PageHeader } from '@/components/ui/page-header' import { useCanWrite } from '@/lib/hooks/use-can-write' import { formatCurrency, formatDate } from '@/lib/utils' import type { SalaryRun } from '@/types' const STATUS_LABEL_KEYS: Record = { draft: 'status_draft', review: 'status_review', approved: 'status_approved', paid: 'status_paid', booked: 'status_booked', } const STATUS_VARIANTS: Record = { draft: 'secondary', review: 'warning', approved: 'default', paid: 'success', booked: 'success', } export default function SalaryPage() { const [runs, setRuns] = useState([]) const [employeeCount, setEmployeeCount] = useState(0) const [loading, setLoading] = useState(true) const { canWrite } = useCanWrite() const t = useTranslations('salary') useEffect(() => { async function load() { const [runsRes, empRes] = await Promise.all([ fetch('/api/salary/runs'), fetch('/api/salary/employees'), ]) if (runsRes.ok) { const { data } = await runsRes.json() setRuns(data || []) } if (empRes.ok) { const { data } = await empRes.json() setEmployeeCount((data || []).length) } setLoading(false) } load() }, []) const currentYear = new Date().getFullYear() const yearRuns = runs.filter(r => r.period_year === currentYear) const totalGrossYTD = yearRuns.filter(r => r.status === 'booked').reduce((sum, r) => sum + r.total_gross, 0) const totalAvgifterYTD = yearRuns.filter(r => r.status === 'booked').reduce((sum, r) => sum + r.total_avgifter, 0) const latestRun = runs[0] if (loading) { return (
{[1, 2, 3].map(i => ( ))}
) } return (
{canWrite && ( )}
} /> {/* Summary cards */}

{t('employees')}

{employeeCount}

{t('gross_year', { year: currentYear })}

{formatCurrency(totalGrossYTD)}

{t('contributions_year', { year: currentYear })}

{formatCurrency(totalAvgifterYTD)}

{/* Recent runs */} {t('runs_title')} {runs.length === 0 ? ( ) : ( {t('th_period')} {t('th_payday')} {t('th_gross')} {t('th_net')} {t('th_contributions')} {t('th_status')} {runs.slice(0, 12).map(run => ( {run.period_year}-{String(run.period_month).padStart(2, '0')} {formatDate(run.payment_date)} {formatCurrency(run.total_gross)} {formatCurrency(run.total_net)} {formatCurrency(run.total_avgifter)} {STATUS_LABEL_KEYS[run.status] ? t(STATUS_LABEL_KEYS[run.status]) : run.status} ))}
)}
) }