'use client' import { useEffect, useState } from 'react' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, } from '@/components/ui/dialog' import { Button } from '@/components/ui/button' import { Loader2, Plus } from 'lucide-react' export interface ActivateAccountsDialogProps { open: boolean accountNumbers: string[] onConfirm: () => Promise | void onCancel: () => void // Optional: invoked when the user wants to create a custom (non-BAS) account // for a number that isn't in the BAS catalogue. The host should close this // dialog and open AddAccountDialog prefilled with the number. onCreateUnknown?: (accountNumber: string) => void // Confirm button label. Defaults to the bookkeeping wording; non-booking // hosts (e.g. the article register) pass their own. confirmLabel?: string } interface BasLookupRow { account_number: string account_name: string | null known: boolean // Present since the lookup learned about the company's own chart: an account // that is in_chart but not is_active is being reactivated, not added. in_chart?: boolean is_active?: boolean } export function ActivateAccountsDialog({ open, accountNumbers, onConfirm, onCancel, onCreateUnknown, confirmLabel, }: ActivateAccountsDialogProps) { const [rows, setRows] = useState([]) const [loading, setLoading] = useState(false) const [submitting, setSubmitting] = useState(false) useEffect(() => { if (!open || accountNumbers.length === 0) return let cancelled = false setLoading(true) fetch(`/api/bookkeeping/accounts/bas-lookup?numbers=${encodeURIComponent(accountNumbers.join(','))}`) .then((r) => r.json()) .then((body) => { if (cancelled) return setRows((body?.data as BasLookupRow[]) || []) }) .catch(() => { if (cancelled) return setRows( accountNumbers.map((n) => ({ account_number: n, account_name: null, known: false, in_chart: false, is_active: false, })), ) }) .finally(() => { if (!cancelled) setLoading(false) }) return () => { cancelled = true } }, [open, accountNumbers]) const knownRows = rows.filter((r) => r.known) const unknownRows = rows.filter((r) => !r.known) // Disable confirm when any entered number isn't a valid BAS account: activating // only the knowns would leave the unknowns to fail again on retry. const canConfirm = knownRows.length > 0 && unknownRows.length === 0 && !submitting async function handleConfirm() { setSubmitting(true) try { await onConfirm() } finally { setSubmitting(false) } } return ( { if (!next) onCancel() }}> Aktivera konton {knownRows.length > 0 ? 'Följande konton behöver aktiveras i din kontoplan innan bokföringen kan slutföras.' : 'Inga giltiga BAS-konton att aktivera.'}
{loading && (
Hämtar kontouppgifter...
)} {!loading && knownRows.length > 0 && (
    {knownRows.map((r) => (
  • {r.account_number} {r.account_name} {r.in_chart && !r.is_active && ( Aktiveras igen )}
  • ))}
)} {!loading && unknownRows.length > 0 && (

Finns inte i BAS-katalogen:

{unknownRows.map((r) => r.account_number).join(', ')}

Skapa dem som egna konton, eller kontrollera inmatningen.

{onCreateUnknown && (
{unknownRows.map((r) => ( ))}
)}
)}
) }