'use client' import { useState, useEffect } from 'react' import { createClient } from '@/lib/supabase/client' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { ChevronDown, ChevronRight, Search } from 'lucide-react' import { AccountNumber } from '@/components/ui/account-number' import type { BASAccount } from '@/types' const CLASS_LABELS: Record = { 1: 'Tillgångar', 2: 'Eget kapital och skulder', 3: 'Intäkter', 4: 'Varor och material', 5: 'Övriga externa kostnader', 6: 'Övriga externa kostnader', 7: 'Personal och avskrivningar', 8: 'Finansiella poster', } export default function ChartOfAccounts() { const [accounts, setAccounts] = useState([]) const [loading, setLoading] = useState(true) const [expandedClasses, setExpandedClasses] = useState>(new Set()) const [searchQuery, setSearchQuery] = useState('') const [editingSRU, setEditingSRU] = useState(null) const [sruValue, setSruValue] = useState('') useEffect(() => { fetchAccounts() }, []) async function fetchAccounts() { const res = await fetch('/api/bookkeeping/accounts') const { data } = await res.json() setAccounts(data || []) setLoading(false) } async function updateSRUCode(accountId: string, newSruCode: string) { const supabase = createClient() const trimmed = newSruCode.trim() || null await supabase .from('chart_of_accounts') .update({ sru_code: trimmed }) .eq('id', accountId) setAccounts((prev) => prev.map((a) => (a.id === accountId ? { ...a, sru_code: trimmed } : a)) ) setEditingSRU(null) } const toggleClass = (cls: number) => { const next = new Set(expandedClasses) if (next.has(cls)) { next.delete(cls) } else { next.add(cls) } setExpandedClasses(next) } const filteredAccounts = accounts.filter((a) => { if (!searchQuery) return true const q = searchQuery.toLowerCase() return ( a.account_number.includes(q) || a.account_name.toLowerCase().includes(q) ) }) const groupedByClass = filteredAccounts.reduce( (acc, account) => { const cls = account.account_class if (!acc[cls]) acc[cls] = [] acc[cls].push(account) return acc }, {} as Record ) if (loading) { return ( Laddar kontoplan... ) } return (
setSearchQuery(e.target.value)} className="pl-9" />
{Object.entries(groupedByClass) .sort(([a], [b]) => Number(a) - Number(b)) .map(([cls, classAccounts]) => { const classNum = Number(cls) const isExpanded = expandedClasses.has(classNum) || !!searchQuery return ( {isExpanded && ( {classAccounts.map((account) => ( ))}
Konto Namn SRU Typ Normal
{account.account_name} {editingSRU === account.id ? ( setSruValue(e.target.value)} onBlur={() => updateSRUCode(account.id, sruValue)} onKeyDown={(e) => { if (e.key === 'Enter') updateSRUCode(account.id, sruValue) if (e.key === 'Escape') setEditingSRU(null) }} className="h-7 w-16 text-xs text-center px-1" autoFocus /> ) : ( )} {account.account_type === 'asset' ? 'Tillgång' : account.account_type === 'liability' ? 'Skuld' : account.account_type === 'equity' ? 'EK' : account.account_type === 'revenue' ? 'Intäkt' : 'Kostnad'} {account.normal_balance === 'debit' ? 'Debet' : 'Kredit'}
)}
) })}
) }