'use client' import { useState } from 'react' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from '@/components/ui/dialog' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select' import { Loader2 } from 'lucide-react' import { useToast } from '@/components/ui/use-toast' import type { AssetCategory } from '@/types' interface CreateAssetDialogProps { open: boolean onOpenChange: (open: boolean) => void onCreated: () => void } // Defaults are K2-redovisning (BFNAR 2016:10) schablon, NOT skattemässig // avskrivning. Building / markanläggning values are conservative — IL 19/20 // kap may allow longer (50 yr) or shorter (10 yr) depending on byggnadstyp. const CATEGORY_OPTIONS: { value: AssetCategory; label: string; defaultYears: number }[] = [ { value: 'computer', label: 'Dator / IT-utrustning', defaultYears: 3 }, { value: 'equipment', label: 'Inventarier', defaultYears: 5 }, { value: 'machinery', label: 'Maskiner', defaultYears: 10 }, { value: 'vehicle', label: 'Fordon', defaultYears: 5 }, { value: 'building', label: 'Byggnad', defaultYears: 25 }, { value: 'land_improvement', label: 'Markanläggning', defaultYears: 10 }, { value: 'immaterial', label: 'Immateriell tillgång', defaultYears: 5 }, { value: 'other_tangible', label: 'Övrig materiell tillgång', defaultYears: 5 }, ] export function CreateAssetDialog({ open, onOpenChange, onCreated }: CreateAssetDialogProps) { const { toast } = useToast() const [name, setName] = useState('') const [category, setCategory] = useState('equipment') const [acquisitionDate, setAcquisitionDate] = useState( new Date().toISOString().split('T')[0], ) const [acquisitionCost, setAcquisitionCost] = useState('') const [usefulLifeYears, setUsefulLifeYears] = useState('5') const [submitting, setSubmitting] = useState(false) const [error, setError] = useState(null) const handleCategoryChange = (next: AssetCategory) => { setCategory(next) const option = CATEGORY_OPTIONS.find((o) => o.value === next) if (option) setUsefulLifeYears(option.defaultYears.toString()) } const handleSubmit = async () => { setError(null) const cost = parseFloat(acquisitionCost) const years = parseInt(usefulLifeYears, 10) if (!name.trim() || !Number.isFinite(cost) || cost <= 0 || !Number.isFinite(years) || years <= 0) { setError('Fyll i namn, anskaffningsvärde och avskrivningstid.') return } setSubmitting(true) try { const res = await fetch('/api/assets', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: name.trim(), category, acquisition_date: acquisitionDate, acquisition_cost: cost, useful_life_months: years * 12, depreciation_method: 'linear', }), }) const body = await res.json() if (!res.ok) { setError(body?.error?.message ?? 'Kunde inte spara tillgången') return } toast({ title: 'Tillgång sparad', description: name.trim() }) // Reset form for next entry setName('') setAcquisitionCost('') onCreated() } catch (err) { setError(err instanceof Error ? err.message : 'Okänt fel') } finally { setSubmitting(false) } } return ( Ny anläggningstillgång
setName(e.target.value)} placeholder="t.ex. MacBook Pro 14" autoFocus />
setAcquisitionDate(e.target.value)} />
setAcquisitionCost(e.target.value)} placeholder="t.ex. 25000" className="tabular-nums" />
setUsefulLifeYears(e.target.value)} className="tabular-nums" />

K2-schablon för redovisning: datorer 3 år, inventarier 5 år, byggnader 25 år. För skattemässig avskrivning kan annan livslängd gälla (IL 18–20 kap).

Tips: Anskaffningen måste redan vara bokförd (debet på 1xxx-kontot mot t.ex. 1930/2440) — registret bokför inte själva köpet. Det här registret styr enbart de planenliga avskrivningarna under bokslutet.
{error && (
{error}
)}
) }