'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, Info } from 'lucide-react' import { AccountNumber } from '@/components/ui/account-number' import { formatCurrency } from '@/lib/utils' import type { INK2Declaration, INK2RSRUCode } from '@/lib/reports/ink2/types' import { INK2R_RUTA_LABELS, INK2R_ASSET_CODES, INK2R_EQUITY_LIABILITY_CODES, INK2R_INCOME_CODES, } from '@/lib/reports/ink2/types' export function INK2DeclarationView({ periodId }: { periodId: string }) { const [data, setData] = useState(null) const [loading, setLoading] = useState(false) const [downloading, setDownloading] = useState(false) const [error, setError] = useState(null) const fetchDeclaration = async () => { setLoading(true) setError(null) try { const res = await fetch(`/api/reports/ink2?period_id=${periodId}`) const result = await res.json() if (result.error) { setError(result.error) } else { setData(result.data) } } catch { setError('Kunde inte hämta INK2-deklaration') } finally { setLoading(false) } } const downloadSRU = async () => { setDownloading(true) try { const res = await fetch(`/api/reports/ink2?period_id=${periodId}&format=sru`) if (!res.ok) throw new Error('Download failed') const blob = await res.blob() const filename = res.headers.get('Content-Disposition')?.match(/filename="(.+)"/)?.[1] || 'INK2_SRU.zip' const url = URL.createObjectURL(blob) const a = document.createElement('a') a.href = url a.download = filename a.click() URL.revokeObjectURL(url) } catch { setError('Kunde inte ladda ner SRU-filer') } finally { setDownloading(false) } } return (
{/* Info card */} INK2 (Aktiebolag)

INK2 visar det bokföringsmässiga resultatet baserat på din bokföring. Skattemässiga justeringar (ej avdragsgilla kostnader, periodiseringsfonder m.m.) hanteras av din revisor/redovisningskonsult.

SRU-filen laddas ner som en ZIP med INFO.SRU och BLANKETTER.SRU. Ladda upp båda filerna till{' '} Skatteverkets filöverföringstjänst .

{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}

)}
{/* Assets section */} Tillgångar {INK2R_ASSET_CODES.map((code) => ( ))}
Summa tillgångar {formatCurrency(data.totals.totalAssets)}
{/* Equity & Liabilities section */} Eget kapital och skulder {INK2R_EQUITY_LIABILITY_CODES.map((code) => ( ))}
Summa eget kapital och skulder {formatCurrency(data.totals.totalEquityLiabilities)}
{/* Income Statement section */} Resultaträkning {INK2R_INCOME_CODES.map((code) => ( ))}
Rörelseresultat = 0 ? 'text-success' : 'text-destructive'}`}> {formatCurrency(data.totals.operatingResult)}
Årets resultat = 0 ? 'text-success' : 'text-destructive'}`}> {formatCurrency(data.totals.resultAfterFinancial)}
{/* INK2S summary */} INK2S — Skattemässiga justeringar

Grundläggande justeringar beräknas automatiskt. Manuella justeringar (periodiseringsfonder, koncernbidrag m.m.) hanteras av din redovisningskonsult.

4.1 Årets resultat (vinst) {formatCurrency(data.ink2s['7650'])}
4.2 Årets resultat (förlust) {formatCurrency(data.ink2s['7750'])}
4.3a Skatt på årets resultat (ej avdragsgill) {formatCurrency(data.ink2s['7651'])}
{data.ink2s['8020'] > 0 ? 'Överskott (punkt 1.1)' : 'Underskott (punkt 1.2)'} 0 ? 'text-success' : 'text-destructive'}`}> {formatCurrency(data.ink2s['8020'] > 0 ? data.ink2s['8020'] : data.ink2s['8021'])}
)} {!data && !loading && !error && ( Klicka "Hämta INK2" för att generera deklarationsunderlaget. )}
) } function INK2DeclarationRow({ code, label, amount, accounts, }: { code: INK2RSRUCode label: string amount: number accounts: Array<{ accountNumber: string; accountName: string; amount: number }> }) { const [expanded, setExpanded] = useState(false) if (amount === 0 && accounts.length === 0) return null return ( <> accounts.length > 0 && setExpanded(!expanded)} > {code} {label} {accounts.length > 0 && ( ({accounts.length} konton) )} {formatCurrency(amount)} {expanded && accounts.length > 0 && ( {accounts.map((acc) => ( ))}
{acc.accountName} {formatCurrency(acc.amount)}
)} ) }