'use client' import { useState } from 'react' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Download, AlertCircle } from 'lucide-react' import { AccountNumber } from '@/components/ui/account-number' import type { NEDeclaration } from '@/lib/reports/ne-bilaga/types' import { formatCurrency } from '@/lib/utils' export function NEDeclarationView({ periodId }: { periodId: string }) { const [data, setData] = useState(null) const [loading, setLoading] = useState(false) const [error, setError] = useState(null) const fetchDeclaration = async () => { setLoading(true) setError(null) try { const res = await fetch(`/api/reports/ne-bilaga?period_id=${periodId}`) const result = await res.json() if (result.error) { setError(result.error) } else { setData(result.data) } } catch { setError('Kunde inte hämta NE-bilaga') } finally { setLoading(false) } } const downloadSRU = () => { window.open(`/api/reports/ne-bilaga?period_id=${periodId}&format=sru`, '_blank') } // NE ruta labels const rutaLabels: Record = { R1: 'Försäljning med moms (25%)', R2: 'Momsfria intäkter', R3: 'Bil/bostadsförmån', R4: 'Ränteintäkter', R5: 'Varuinköp', R6: 'Övriga kostnader', R7: 'Lönekostnader', R8: 'Räntekostnader', R9: 'Avskrivningar fastighet', R10: 'Avskrivningar övriga tillgångar', R11: 'Årets resultat', } // Categorize rutor const revenueRutor = ['R1', 'R2', 'R3', 'R4'] as const const expenseRutor = ['R5', 'R6', 'R7', 'R8', 'R9', 'R10'] as const return (
{/* Info card */} NE-bilaga (Enskild firma)

NE-bilagan används för att deklarera resultat från enskild näringsverksamhet. Uppgifterna hämtas från bokföringen för valt räkenskapsår.

{data && ( )}
{error && ( {error} )} {data && ( <> {/* Warnings */} {data.warnings.length > 0 && (
{data.warnings.map((warning, i) => (

{warning}

))}
)} {/* Company info */}
{data.companyInfo.companyName} {data.fiscalYear.name}
{data.companyInfo.orgNumber && (

Org.nr: {data.companyInfo.orgNumber}

)}
{/* Revenue section */} Intäkter {revenueRutor.map((ruta) => { const value = data.rutor[ruta] const breakdown = data.breakdown[ruta] return ( ) })}
Summa intäkter {formatCurrency( data.rutor.R1 + data.rutor.R2 + data.rutor.R3 + data.rutor.R4 )}
{/* Expenses section */} Kostnader {expenseRutor.map((ruta) => { const value = data.rutor[ruta] const breakdown = data.breakdown[ruta] return ( ) })}
Summa kostnader -{formatCurrency( data.rutor.R5 + data.rutor.R6 + data.rutor.R7 + data.rutor.R8 + data.rutor.R9 + data.rutor.R10 )}
{/* Result */}
R11 Årets resultat
= 0 ? 'text-green-600' : 'text-red-600' }`} > {formatCurrency(data.rutor.R11)}
)} {!data && !loading && !error && ( Klicka "Hämta NE-bilaga" för att generera deklarationsunderlaget. )}
) } function NEDeclarationRow({ ruta, label, amount, accounts, isExpense, }: { ruta: string label: string amount: number accounts: Array<{ accountNumber: string; accountName: string; amount: number }> isExpense?: boolean }) { const [expanded, setExpanded] = useState(false) // Don't show rows with zero values if (amount === 0 && accounts.length === 0) return null return ( <> accounts.length > 0 && setExpanded(!expanded)} > {ruta} {label} {accounts.length > 0 && ( ({accounts.length} konton) )} {isExpense && amount > 0 ? '-' : ''}{formatCurrency(Math.abs(amount))} {expanded && accounts.length > 0 && ( {accounts.map((acc) => ( ))}
{acc.accountName} {isExpense && acc.amount > 0 ? '-' : ''}{formatCurrency(Math.abs(acc.amount))}
)} ) }