'use client' import { useTranslations } from 'next-intl' import { useState } from 'react' import { Switch } from '@/components/ui/switch' import { HelpPopover } from '@/components/ui/help-popover' import { SettingsGroup, SettingsInput, SettingsReveal, SettingsRow, SettingsSelect, } from '@/components/settings/SettingsRows' import type { CompanySettings } from '@/types' interface TaxSettingsFormProps { settings: CompanySettings /** Ledger-derived signal: EU sales postings exist (3108/3308/3107). */ euSalesDetected?: boolean /** Ledger-derived signal: utdelning/ägarlån postings exist (2898/2393/2893). */ kuSignalDetected?: boolean /** Invoice-derived signal: invoices with ROT/RUT deductions exist. */ rotRutSignalDetected?: boolean } /** * Ledger/invoice-derived suggestion (EU sales, KU, ROT/RUT) as one visible * warning-tone sentence. The full body, including the legal deadlines and * late-fee amounts, lives behind the "?" so the signal stays a single line. */ function SignalLine({ text, help }: { text: string; help: React.ReactNode }) { return (

{text} {help}

) } export function TaxSettingsForm({ settings, euSalesDetected = false, kuSignalDetected = false, rotRutSignalDetected = false, }: TaxSettingsFormProps) { const t = useTranslations('settings_tax_form') const [vatRegistered, setVatRegistered] = useState(settings.vat_registered ?? false) const [fSkatt, setFSkatt] = useState(settings.f_skatt ?? true) const [paysSalaries, setPaysSalaries] = useState(settings.pays_salaries ?? false) // Fall back to pays_salaries for rows saved before the registration flag // existed; saving attests the shown value. const [employerRegistered, setEmployerRegistered] = useState( settings.employer_registered ?? settings.pays_salaries ?? false, ) const [employerSeasonal, setEmployerSeasonal] = useState(settings.employer_seasonal ?? false) const [momsPeriod, setMomsPeriod] = useState(settings.moms_period || '') const [vatTaxableBaseOver40m, setVatTaxableBaseOver40m] = useState( settings.vat_taxable_base_over_40m ?? false, ) const [hasEuTrade, setHasEuTrade] = useState(settings.vat_has_eu_trade ?? false) const [psEnabled, setPsEnabled] = useState(settings.periodisk_sammanstallning_enabled ?? false) const [kuEnabled, setKuEnabled] = useState(settings.kontrolluppgifter_enabled ?? false) const [rotRutEnabled, setRotRutEnabled] = useState(settings.rot_rut_enabled ?? false) const [ossEnabled, setOssEnabled] = useState(settings.oss_enabled ?? false) const [iossEnabled, setIossEnabled] = useState(settings.ioss_enabled ?? false) const [intrastatEnabled, setIntrastatEnabled] = useState(settings.intrastat_enabled ?? false) const [punktskattEnabled, setPunktskattEnabled] = useState(settings.punktskatt_enabled ?? false) const [fyllnadEnabled, setFyllnadEnabled] = useState( settings.fyllnadsinbetalning_enabled ?? false, ) const isEnskildFirma = settings.entity_type === 'enskild_firma' const months = [ t('month_jan'), t('month_feb'), t('month_mar'), t('month_apr'), t('month_may'), t('month_jun'), t('month_jul'), t('month_aug'), t('month_sep'), t('month_oct'), t('month_nov'), t('month_dec'), ] return (
{/* Entity type: read-only. Changing it is a support operation. */} {settings.entity_type === 'aktiebolag' ? t('entity_aktiebolag') : t('entity_enskild_firma')} setFSkatt(v === true)} /> { const checked = value === true setVatRegistered(checked) if (checked && vatTaxableBaseOver40m) setMomsPeriod('monthly') }} /> {euSalesDetected && vatRegistered && (!hasEuTrade || !psEnabled) && ( )} {/* The VAT sub-block. The reveal keeps the fields mounted while hidden (inert): the handleSave gates on vat_registered in TaxSettingsContent make the saved result identical to the old unmount behavior. */} setMomsPeriod(e.target.value)} > { const checked = value === true setVatTaxableBaseOver40m(checked) // Over 40 MSEK forces monthly VAT reporting. if (checked) setMomsPeriod('monthly') }} /> { const checked = value === true setHasEuTrade(checked) // No EU trade means no periodisk sammanställning. if (!checked) setPsEnabled(false) }} /> {momsPeriod === 'yearly' && !hasEuTrade && !isEnskildFirma && ( )} setPsEnabled(value === true)} /> {/* Tax contact: required for SKV filings. */} {/* Fiscal year & salaries */} {isEnskildFirma ? ( <> ) : ( {months.map((month, i) => ( ))} )} { const checked = v === true setPaysSalaries(checked) // Paying out salary obliges employer registration (SFL 7 kap. 1 §). if (checked) setEmployerRegistered(true) }} /> { const checked = v === true setEmployerRegistered(checked) if (!checked) setEmployerSeasonal(false) }} /> setEmployerSeasonal(v === true)} /> {/* Kontrolluppgifter (KU) */} {kuSignalDetected && !kuEnabled && ( )} setKuEnabled(v === true)} /> {/* ROT/RUT */} {rotRutSignalDetected && !rotRutEnabled && ( )} setRotRutEnabled(v === true)} /> {/* Preliminary tax */} {/* Long-tail deadlines: explicit opt-in only */} {vatRegistered && ( <> setOssEnabled(v === true)} /> setIossEnabled(v === true)} /> setIntrastatEnabled(v === true)} /> )} setPunktskattEnabled(v === true)} /> setFyllnadEnabled(v === true)} />
) }