'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)}
/>
)
}