'use client' import { useState } from 'react' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, } from '@/components/ui/dialog' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Textarea } from '@/components/ui/textarea' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { Loader2, AlertTriangle } from 'lucide-react' import { isStandardBASAccount } from '@/lib/bookkeeping/bas-reference' interface AddAccountDialogProps { open: boolean onOpenChange: (open: boolean) => void onCreated: () => void } function deriveAccountType(accountNumber: string): { type: string; balance: string } { const cls = parseInt(accountNumber[0]) switch (cls) { case 1: return { type: 'asset', balance: 'debit' } case 2: { const group = parseInt(accountNumber.substring(0, 2)) if (group <= 20) return { type: 'equity', balance: 'credit' } return { type: 'liability', balance: 'credit' } } case 3: return { type: 'revenue', balance: 'credit' } case 4: case 5: case 6: case 7: return { type: 'expense', balance: 'debit' } case 8: { const group = parseInt(accountNumber.substring(0, 2)) if (group >= 83 && group <= 83) return { type: 'revenue', balance: 'credit' } if (group >= 84 && group <= 84) return { type: 'expense', balance: 'debit' } return { type: 'expense', balance: 'debit' } } default: return { type: 'expense', balance: 'debit' } } } export function AddAccountDialog({ open, onOpenChange, onCreated }: AddAccountDialogProps) { const [accountNumber, setAccountNumber] = useState('') const [accountName, setAccountName] = useState('') const [description, setDescription] = useState('') const [defaultVatCode, setDefaultVatCode] = useState('') const [sruCode, setSruCode] = useState('') const [normalBalance, setNormalBalance] = useState<'debit' | 'credit'>('debit') const [isSaving, setIsSaving] = useState(false) const [error, setError] = useState('') const isBASMatch = accountNumber.length === 4 && isStandardBASAccount(accountNumber) const derived = accountNumber.length === 4 ? deriveAccountType(accountNumber) : null async function handleCreate() { setError('') if (!/^\d{4}$/.test(accountNumber)) { setError('Kontonumret måste vara exakt 4 siffror') return } if (!accountName.trim()) { setError('Kontonamn krävs') return } setIsSaving(true) try { const response = await fetch('/api/bookkeeping/accounts', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ account_number: accountNumber, account_name: accountName.trim(), account_type: derived?.type || 'expense', normal_balance: normalBalance, description: description || null, default_vat_code: defaultVatCode || null, sru_code: sruCode || null, }), }) if (!response.ok) { const data = await response.json() throw new Error(data.error || 'Kunde inte skapa kontot') } // Reset form setAccountNumber('') setAccountName('') setDescription('') setDefaultVatCode('') setSruCode('') onCreated() onOpenChange(false) } catch (err) { setError(err instanceof Error ? err.message : 'Något gick fel') } finally { setIsSaving(false) } } return ( Lägg till eget konto Skapa ett eget konto utanför BAS-standarden
{isBASMatch && (

Kontonummer {accountNumber} finns i BAS-standarden. Använd "BAS-katalog"-fliken för att aktivera standardkonton istället.

)}
{ const v = e.target.value.replace(/\D/g, '').slice(0, 4) setAccountNumber(v) if (v.length === 4) { const d = deriveAccountType(v) setNormalBalance(d.balance as 'debit' | 'credit') } }} placeholder="T.ex. 1935" maxLength={4} className="font-mono" />
{derived && (

Auto-detekterad typ:{' '} {derived.type === 'asset' ? 'Tillgång' : derived.type === 'liability' ? 'Skuld' : derived.type === 'equity' ? 'Eget kapital' : derived.type === 'revenue' ? 'Intäkt' : 'Kostnad'}

)}
setAccountName(e.target.value)} placeholder="T.ex. Sparkonto företag" />