'use client' import { useState } from 'react' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' 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 { useToast } from '@/components/ui/use-toast' import { formatCurrency } from '@/lib/utils' import { SCHABLONAVDRAG_RATES, validateMileageEntry } from '@/lib/tax/schablonavdrag' import { Car, Loader2, MapPin, Calendar, FileText, X } from 'lucide-react' import type { CreateMileageEntryInput } from '@/types' interface MileageEntryProps { onSave: (entry: CreateMileageEntryInput) => Promise onCancel?: () => void initialDate?: string } export default function MileageEntry({ onSave, onCancel, initialDate, }: MileageEntryProps) { const { toast } = useToast() const [isSaving, setIsSaving] = useState(false) const [errors, setErrors] = useState([]) const today = new Date().toISOString().split('T')[0] const [formData, setFormData] = useState({ date: initialDate || today, distance_km: 0, purpose: '', from_location: '', to_location: '', }) // Calculate deduction preview const deductionPreview = formData.distance_km > 0 ? formData.distance_km * SCHABLONAVDRAG_RATES.bil.rate_per_km : 0 function handleChange( field: keyof CreateMileageEntryInput, value: string | number ) { setFormData((prev) => ({ ...prev, [field]: value })) setErrors([]) // Clear errors on change } async function handleSubmit(e: React.FormEvent) { e.preventDefault() // Validate const validation = validateMileageEntry({ date: formData.date, distance_km: formData.distance_km, purpose: formData.purpose, }) if (!validation.valid) { setErrors(validation.errors) return } setIsSaving(true) try { await onSave(formData) toast({ title: 'Körning registrerad', description: `${formData.distance_km} km - avdrag ${formatCurrency(deductionPreview)}`, }) // Reset form setFormData({ date: today, distance_km: 0, purpose: '', from_location: '', to_location: '', }) } catch (error) { toast({ title: 'Fel', description: 'Kunde inte spara körningen', variant: 'destructive', }) } setIsSaving(false) } return (
Registrera körning Logga en tjänsteresa för milersättning
{onCancel && ( )}
{/* Error display */} {errors.length > 0 && (
    {errors.map((error, idx) => (
  • {error}
  • ))}
)} {/* Date and distance row */}
handleChange('date', e.target.value)} required />
handleChange('distance_km', parseFloat(e.target.value) || 0) } required />
{/* Locations row */}
handleChange('from_location', e.target.value)} />
handleChange('to_location', e.target.value)} />
{/* Purpose */}