'use client' import { useEffect } from 'react' import { useForm, Controller } from 'react-hook-form' import { zodResolver } from '@hookform/resolvers/zod' import { z } from 'zod' 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 { Checkbox } from '@/components/ui/checkbox' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { InfoTooltip } from '@/components/ui/info-tooltip' import { Loader2, ArrowRight, ArrowLeft, Info } from 'lucide-react' import { useToast } from '@/components/ui/use-toast' import type { MomsPeriod, EntityType } from '@/types' const schema = z.object({ vat_registered: z.boolean(), vat_number: z.string().optional(), moms_period: z.enum(['monthly', 'quarterly', 'yearly']).optional(), accounting_method: z.enum(['accrual', 'cash']), }).superRefine((data, ctx) => { if (data.vat_registered && !data.moms_period) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'Välj momsredovisningsperiod.', path: ['moms_period'], }) } }) type FormData = z.infer interface Step4Output { vat_registered: boolean vat_number?: string moms_period?: MomsPeriod accounting_method: 'accrual' | 'cash' } interface Step4Props { initialData: Partial entityType?: EntityType orgNumber?: string onNext: (data: Step4Output) => void onBack: () => void isSaving: boolean } export default function Step4VatAccounting({ initialData, entityType, orgNumber, onNext, onBack, isSaving, }: Step4Props) { const { toast } = useToast() const { register, handleSubmit, watch, control, setValue, formState: {}, } = useForm({ resolver: zodResolver(schema), mode: 'onTouched', defaultValues: { vat_registered: initialData.vat_registered ?? false, vat_number: initialData.vat_number || '', moms_period: initialData.moms_period, accounting_method: initialData.accounting_method ?? 'accrual', }, }) const vatRegistered = watch('vat_registered') const vatNumber = watch('vat_number') const accountingMethod = watch('accounting_method') // Auto-fill VAT number when vat_registered toggles on useEffect(() => { if (vatRegistered && !vatNumber && orgNumber) { const cleaned = orgNumber.replace(/[-\s]/g, '') if (cleaned.length >= 10) { setValue('vat_number', `SE${cleaned}01`) } } }, [vatRegistered, vatNumber, orgNumber, setValue]) const onSubmit = (data: FormData) => { const output: Step4Output = { vat_registered: data.vat_registered, vat_number: data.vat_registered ? data.vat_number : undefined, moms_period: data.vat_registered ? data.moms_period : undefined, accounting_method: data.accounting_method, } onNext(output) } return (
Moms och bokföringsmetod Ange din momsregistrering och välj bokföringsmetod.
{ const fields = Object.keys(errs).join(', ') console.error('[onboarding] step 4 validation failed:', fields, errs) fetch('/api/log', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ message: 'step 4 validation failed', extra: { fields } }) }).catch(() => {}) const firstError = Object.values(errs)[0] const message = firstError?.message || 'Kontrollera att alla fält är korrekt ifyllda.' toast({ title: 'Saknade uppgifter', description: String(message), variant: 'destructive' }) })} className="space-y-6"> {/* VAT section */}

Behöver jag momsregistrera mig?

Ja, om din omsättning överstiger 120 000 kr per år. Med moms lägger du på 25% extra på dina fakturor, men får också dra av moms på dina inköp.

Om din omsättning överstiger 120 000 kr per år behöver du momsregistrera dig.

} side="right" > Momsregistrering
( )} />

Obligatoriskt om din omsättning överstiger 120 000 kr per år.

{vatRegistered && (

Format: SE + organisationsnummer + 01

Hur ofta rapporterar du moms?

Välj den period som anges på Verksamt eller i ditt beslut från Skatteverket.

  • Under 1 miljon/år = Kan välja årsredovisning
  • 1-40 miljoner = Kvartal
  • Över 40 miljoner = Månad
} side="right" > ( )} />

Välj den period som anges i ditt beslut från Skatteverket. Vanligtvis kvartal eller år.

)} {/* Accounting method */}
(
{ if (checked) field.onChange('accrual') }} />
{ if (checked) field.onChange('cash') }} />
)} />
{accountingMethod === 'accrual' ? 'Faktureringsmetoden' : 'Kontantmetoden'}

{accountingMethod === 'accrual' ? 'Intäkter och kostnader bokförs när fakturan skickas eller tas emot, oavsett när betalningen sker. Detta ger en mer rättvisande bild av verksamhetens ekonomi.' : 'Intäkter och kostnader bokförs först när betalningen faktiskt sker. Enklare att hantera men ger en mindre exakt bild av verksamhetens ekonomi vid varje given tidpunkt.'}

{entityType === 'aktiebolag' && (

Aktiebolag med omsättning över 3 MSEK per år måste använda faktureringsmetoden.

)}
) }