From 2bec5acedbfeb8b66da873a34b130d860c2284aa Mon Sep 17 00:00:00 2001 From: Jakob Wennberg <149234542+jakobwennberg@users.noreply.github.com> Date: Fri, 24 Jul 2026 12:36:08 +0200 Subject: [PATCH] =?UTF-8?q?feat(ui):=20rest-of-nav=201=20=E2=80=94=20Vikti?= =?UTF-8?q?ga=20datum,=20Skattekonto,=20Periodiseringar,=20Import=20to=20t?= =?UTF-8?q?he=20concept=20language=20(#1140)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(ui): concept scenes 17/24/32/33 for Viktiga datum, Skattekonto, Periodiseringar and Import (rest-of-nav 1) Viktiga datum: thread rows with type-icon circles behind a type seg (Alla/Skatt/Fakturering/Egna), Narmast countdown pane, Ny deadline lifted to the page header, both banners replaced by one AttnLine, mark-done via ConfirmDialog. DeadlineCard/DeadlineFilters die; DeadlineRow is the row. Skattekonto: card-less saldo hero with OCR + quiet copy, shortfall AttnLine computed from the next drain date with a betalningsuppgifter dialog (bankgiro 5050-1055 + OCR), one dry-table with Kommande/Forfallna/ Genomforda band rows, chips only on unbooked genomforda rows, quiet hover actions. Tabs and per-row badge noise are gone; the concept's Saldo column is dropped because SKV stores no per-row running balance. Periodiseringar: banner becomes an AttnLine with inline Bokfor forfallna (now confirm-first), house seg with Aktiva count, dry-table with muted normal states and animated RowFoldout for installments, Los upp nu as a quiet hover link through the shared ConfirmDialog. Import: tabs collapse into one two-column row list (Importera | Exportera) in the concept row language; SIE export moves into a small dialog and Molnsynkronisering folds the CloudBackupCard open in place. The /import?view=export#sie-export and /import#cloud-backup deep links keep working. Sandbox notice is an AttnLine. All four pages get stagger-enter, a help popover behind ? and sv+en keys for every new string. 9189 tests green, lint clean, guards pass. Co-Authored-By: Claude Fable 5 * chore(ui): align dashboard loading skeletons with the migrated page silhouettes Folds in the parallel WIP from this checkout at the founder's request: every loading.tsx under (dashboard) now mirrors its migrated page row-for-row (24px title block, pill actions, borderless table heads, single-line rows), and the shared (dashboard)/loading.tsx takes Hem's greeting + Att gora silhouette. Also lands the pending DECISIONS.md lines (onboarding swap plan note + rest-of-nav 1 deviations). Co-Authored-By: Claude Fable 5 * polish(ui): authority logos, stat-tile skattekonto hero, quieter type on rest-of-nav 1 Viktiga datum: statutory deadlines wear the receiving authority's mark (Skatteverket for tax dates, Bolagsverket for arsredovisning/arsstamma) as a small badge on white; other deadlines keep the neutral type icons. Row dates go muted, titles drop font-medium, the Narmast countdown steps down to the house text-4xl display scale. Skattekonto: the 32px serif hero becomes two compact metric tiles in the KPIHeroCards idiom (saldo with the Skatteverket mark + OCR meta, nasta dragning with date and event count), matching how numbers read on the migrated pages. Periodiseringar: chevron column dropped; rows expand on click exactly like the verifikat list. Import: provider logo chips return on Hamta fran annat system (live- version parity) and Koppla bank carries the Enable Banking mark. Adds skatteverket(_color), bolagsverket, enable-banking plus claude/ anthropic marks (for future use) under public/logos/. Co-Authored-By: Claude Fable 5 * polish(ui): keep Importera and Exportera as separate tabs on the import page Founder feedback: the merged two-column landing goes back to the familiar split. The house seg switches between the Importera rows and the Exportera rows (SIE 4 dialog + Molnsynkronisering fold), ?view=export selects the export tab again and the hash deep links flip to it before opening their surface. Row language and logo chips stay. Co-Authored-By: Claude Fable 5 * fix(ui): readable Enable Banking mark and full-width skattekonto The enable-banking.webp is the full stacked logo in white-on-transparent: invisible on the light chip and mush at 16px. The chip now uses a cropped 368px icon square (enable-banking-icon.png) with the marketing site's grayscale+brightness treatment in light mode and a white lift in dark. Skattekonto loses its max-w-3xl cap so the table stretches the content column exactly like Bokforing and Transaktioner; the saldo tiles take KPI-card width (lg:grid-cols-4). Import's tab columns stretch too. Co-Authored-By: Claude Fable 5 * fix(ui): address review-bot findings on rest-of-nav 1 CodeRabbit triage, all three confirmed real: the Bokfor forfallna attn action is hidden for read-only users instead of rendering a no-op link; a failed deadline edit rethrows so the form stays open with the user's input; authority marks are reserved for statutory (system-generated) deadlines: a manual tax-category deadline keeps the neutral icon. Compliance swarm's two high findings verified clean, no change needed: /api/bookkeeping/accruals/:id/dissolve and /api/deadlines/:id (+ /complete) all run through withRouteContext with company_id scoping and 404 on miss. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: Claude Fable 5 --- DECISIONS.md | 6 +- app/(dashboard)/bookkeeping/loading.tsx | 29 +- .../bookkeeping/periodiseringar/page.tsx | 426 +++++----- app/(dashboard)/customers/loading.tsx | 20 +- app/(dashboard)/deadlines/page.tsx | 166 ++-- app/(dashboard)/import/page.tsx | 524 ++++++------- app/(dashboard)/invoices/loading.tsx | 43 +- app/(dashboard)/loading.tsx | 67 +- app/(dashboard)/pending/loading.tsx | 15 +- app/(dashboard)/reports/loading.tsx | 6 +- app/(dashboard)/salary/loading.tsx | 30 +- app/(dashboard)/skattekonto/page.tsx | 727 ++++++++++-------- app/(dashboard)/supplier-invoices/loading.tsx | 27 +- app/(dashboard)/transactions/loading.tsx | 36 +- components/deadlines/DeadlineCard.tsx | 271 ------- components/deadlines/DeadlineFilters.tsx | 67 -- components/deadlines/DeadlineGroupCard.tsx | 205 ++--- components/deadlines/DeadlineList.tsx | 318 ++++---- components/deadlines/DeadlineRow.tsx | 193 +++++ components/deadlines/index.ts | 3 +- messages/en.json | 79 +- messages/sv.json | 79 +- public/logos/anthropic.png | Bin 0 -> 47770 bytes public/logos/bolagsverket.jpg | Bin 0 -> 66016 bytes public/logos/claude-ai-icon.webp | Bin 0 -> 5612 bytes public/logos/enable-banking-icon.png | Bin 0 -> 7202 bytes public/logos/enable-banking.webp | Bin 0 -> 16064 bytes public/logos/skatteverket.svg | 84 ++ public/logos/skatteverket_color.svg | 142 ++++ 29 files changed, 1943 insertions(+), 1620 deletions(-) delete mode 100644 components/deadlines/DeadlineCard.tsx delete mode 100644 components/deadlines/DeadlineFilters.tsx create mode 100644 components/deadlines/DeadlineRow.tsx create mode 100644 public/logos/anthropic.png create mode 100644 public/logos/bolagsverket.jpg create mode 100644 public/logos/claude-ai-icon.webp create mode 100644 public/logos/enable-banking-icon.png create mode 100644 public/logos/enable-banking.webp create mode 100644 public/logos/skatteverket.svg create mode 100644 public/logos/skatteverket_color.svg diff --git a/DECISIONS.md b/DECISIONS.md index 86eca794..35bf258a 100644 --- a/DECISIONS.md +++ b/DECISIONS.md @@ -348,4 +348,8 @@ One line per decision: `[YYYY-MM-DD] : `. Appended by agents and [2026-07-23] Frame layout (UI-migration PR 1) is md:-gated and the panel owns desktop scroll: mobile keeps document flow + bottom nav (concept is desktop-first), and since Next's window scroll-to-top never fires for an inner scroll container, MainContainer resets panel scroll on route change. Button default size drops fixed h-10 for natural pill height (7px/16px padding per locked convention 3); sm/lg/icon keep their heights. [2026-07-23] Nav PR 2: ui_state persisted as one jsonb bag on user_preferences (founder-approved migration 20260723120000) rather than per-preference columns: cosmetic, never load-bearing, grows with PR 3/4 split-button modes. Sidebar width driven by an inline --nav-w CSS variable on #dash-shell instead of a [data-nav-collapsed] attribute rule: the Tailwind 4/Lightning CSS pipeline silently dropped the top-level attribute-selector rule from compiled output, and the inline variable is pipeline-proof. Register/Bokslut folds default closed (concept tidiness), forced open by an active child route. Discord-community row skipped: no invite URL exists in the repo; add when one lands. [2026-07-23] PR 3 primitives: new --attn token pair (38 50% 34% light / 38 45% 62% dark) for the one-sentence AttnLine instead of reusing --warning: the warning tone fails WCAG AA as 12.5px body text on the page background; chips/charts keep --warning. Stagger applied via className on the five target pages' DataList/TableBody containers (plan item 7), not baked into the DataList primitive: remaining pages adopt it in their own migration PRs where their skeletons are aligned at the same time. -[2026-07-23] PR 4 template booking books directly through the normal journal-entries endpoint without the editor's account-activation retry flow: template accounts are standard BAS accounts that are active in practice, and an inactive-account error surfaces as a normal error toast pointing at the full editor. Voucher preview in the commit ConfirmDialog is indicative (voucher-sequences/next for today's period/default series); the atomic number assigned at commit is what the success toast shows. \ No newline at end of file +[2026-07-23] PR 4 template booking books directly through the normal journal-entries endpoint without the editor's account-activation retry flow: template accounts are standard BAS accounts that are active in practice, and an inactive-account error surfaces as a normal error toast pointing at the full editor. Voucher preview in the commit ConfirmDialog is indicative (voucher-sequences/next for today's period/default series); the atomic number assigned at commit is what the success toast shows. +[2026-07-23] Onboarding swap plan (dev_docs/onboarding_migration_plan.md): journey UI replaces wizard as pure UI swap (server action/lookup/BankID contract untouched); JourneyOrb = own canvas component, NOT thinking-orbs (needs comet+check morphs, reverses earlier npm intent); /companies/new folded into same component mode='add'; rollout behind NEXT_PUBLIC_ONBOARDING_JOURNEY flag. +[2026-07-24] BankID company picker in journey onboarding: searchable list (name + form/role + orgnr, "finns redan" section, filter with single-match Enter) is the standard at ANY engagement count; chips variant cut (founder call on concept c82c9358). Picking a company still runs zero Lens lookups: CompanyRoles prefill only, F-skatt/moms/rakenskapsar asked as questions per the plan's lookupRan rule. +[2026-07-24] BankID onboarding lookup (SUPERSEDES the zero-Lens line above, founder call): picking a company in the BankID picker DOES run one Lens lookup and prefills facts (address, F-skatt, moms, fiscal year, SNI), same per-onboarding cost as typing an orgnr; the roster list itself stays free CompanyRoles data, never prefetched. lookupRan=false becomes the degradation path (TIC disabled/429/504 -> ask as questions). Implementation note: the journey must NOT carry over Step2's preverifiedOrgNumber lookup-suppression; the deep-linked orgnr triggers the same single lookup as manual entry. +[2026-07-24] Rest-of-nav PR 1 (Viktiga datum/Skattekonto/Periodiseringar/Import) deviations from concept scenes 17/24/32/33: skattekonto Saldo column dropped (SKV API stores no per-row running balance; computing one client-side would be dishonest math); Periodiseringar ships without the concept's "Ny periodisering" header button (no standalone create flow exists, accruals are born from invoice rows, help popover explains); Import keeps FY selection inside the SIE-export dialog instead of a header FyPicker (FY only affects SIE export, a page-level picker would lie); concept's "Hela arkivet" export row omitted (no zip-archive endpoint exists). diff --git a/app/(dashboard)/bookkeeping/loading.tsx b/app/(dashboard)/bookkeeping/loading.tsx index 9f3b1fca..20d85454 100644 --- a/app/(dashboard)/bookkeeping/loading.tsx +++ b/app/(dashboard)/bookkeeping/loading.tsx @@ -3,21 +3,28 @@ import { Skeleton } from '@/components/ui/skeleton' export default function BookkeepingLoading() { return (
+ {/* Title (24px) + single "Nytt verifikat" split button (pill) */}
- -
- - -
+ +
-
+ + {/* Borderless table (JournalEntryList): header row + single-line rows */} +
+
+ + +
{[1, 2, 3, 4, 5, 6].map((i) => ( -
-
- - +
+ +
+ +
-
))}
diff --git a/app/(dashboard)/bookkeeping/periodiseringar/page.tsx b/app/(dashboard)/bookkeeping/periodiseringar/page.tsx index 3caf110d..4ca38264 100644 --- a/app/(dashboard)/bookkeeping/periodiseringar/page.tsx +++ b/app/(dashboard)/bookkeeping/periodiseringar/page.tsx @@ -6,23 +6,15 @@ import { Fragment, useCallback, useEffect, useMemo, useState } from 'react' import Link from 'next/link' -import { AlertCircle, CalendarClock, ChevronDown, Loader2 } from 'lucide-react' +import { CalendarClock } from 'lucide-react' import { PageHeader } from '@/components/ui/page-header' -import { Card, CardContent } from '@/components/ui/card' -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from '@/components/ui/table' +import { HelpPopover } from '@/components/ui/help-popover' +import { AttnLine } from '@/components/ui/attn-line' import { Badge } from '@/components/ui/badge' -import { Button } from '@/components/ui/button' import { Skeleton } from '@/components/ui/skeleton' import { EmptyState } from '@/components/ui/empty-state' -import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs' -import { ConfirmationDialog } from '@/components/ui/confirmation-dialog' +import { ConfirmDialog } from '@/components/ui/confirm-dialog' +import { TH_CLASS, TD_CLASS, QUIET_LINK_CLASS, RowFoldout } from '@/components/ui/dry-table' import { useToast } from '@/components/ui/use-toast' import { useCanWrite } from '@/lib/hooks/use-can-write' import { cn, formatCurrency, formatDate } from '@/lib/utils' @@ -40,13 +32,12 @@ type ScheduleWithInstallments = AccrualSchedule & { type StatusFilter = 'active' | 'completed' | 'all' -const SCHEDULE_BADGE: Record< - AccrualScheduleStatus, - { label: string; variant: 'secondary' | 'success' | 'outline' } -> = { - active: { label: 'Aktiv', variant: 'secondary' }, - completed: { label: 'Avslutad', variant: 'success' }, - cancelled: { label: 'Makulerad', variant: 'outline' }, +// Chips mark exceptions (design.md): Aktiv/Avslutad are normal states and +// render as muted text; only Makulerad deviates. +const SCHEDULE_STATUS_TEXT: Record = { + active: 'Aktiv', + completed: 'Avslutad', + cancelled: 'Makulerad', } function monthLabel(periodMonth: string): string { @@ -70,11 +61,12 @@ export default function AccrualSchedulesPage() { const [statusFilter, setStatusFilter] = useState('active') const [schedules, setSchedules] = useState([]) const [dueCount, setDueCount] = useState(0) + const [activeCount, setActiveCount] = useState(null) const [isLoading, setIsLoading] = useState(true) const [expanded, setExpanded] = useState>(new Set()) const [isPosting, setIsPosting] = useState(false) + const [postConfirmOpen, setPostConfirmOpen] = useState(false) const [dissolveTarget, setDissolveTarget] = useState(null) - const [isDissolving, setIsDissolving] = useState(false) const fetchSchedules = useCallback(async (filter: StatusFilter) => { setIsLoading(true) @@ -84,6 +76,7 @@ export default function AccrualSchedulesPage() { if (!res.ok) throw new Error(getErrorMessage(json, { context: 'journal_entry' })) setSchedules(json.data ?? []) setDueCount(json.due_count ?? 0) + if (filter === 'active') setActiveCount((json.data ?? []).length) } catch (error) { toast({ title: 'Kunde inte ladda periodiseringar', @@ -140,7 +133,6 @@ export default function AccrualSchedulesPage() { async function handleDissolve() { if (!dissolveTarget) return - setIsDissolving(true) try { const res = await fetch(`/api/bookkeeping/accruals/${dissolveTarget.id}/dissolve`, { method: 'POST', @@ -159,8 +151,6 @@ export default function AccrualSchedulesPage() { description: getErrorMessage(error, { context: 'journal_entry' }), variant: 'destructive', }) - } finally { - setIsDissolving(false) } } @@ -175,61 +165,88 @@ export default function AccrualSchedulesPage() { [schedules], ) + const dissolveRemaining = dissolveTarget + ? roundOre(dissolveTarget.total_amount - sumPosted(dissolveTarget.installments)) + : 0 + return (
- + +

+ Periodisera en fakturarad när du registrerar en leverantörsfaktura eller + skapar en kundfaktura, så fördelas beloppet över månaderna här. Månadens + andel bokförs automatiskt den sista dagen i varje månad. +

+ + } + /> - {(dueCount > 0 || blockedInstallments > 0) && ( -
0 ? ( + { + if (!isPosting) setPostConfirmOpen(true) + }, + } + : undefined + } > -
- -
-

- {dueCount > 0 - ? `${dueCount} ${dueCount === 1 ? 'månad väntar' : 'månader väntar'} på att bokföras` - : 'Periodiseringar med fel'} -

-

- {blockedInstallments > 0 - ? `${blockedInstallments} ${blockedInstallments === 1 ? 'månad kunde' : 'månader kunde'} inte bokföras automatiskt: öppna raden för felmeddelandet.` - : 'Förfallna månader bokförs automatiskt varje natt, eller direkt här.'} -

-
-
- {canWrite && dueCount > 0 && ( - - )} -
- )} + {dueCount === 1 + ? '1 månad väntar på att bokföras.' + : `${dueCount} månader väntar på att bokföras.`}{' '} + Förfallna månader bokförs annars automatiskt varje natt. + + ) : blockedInstallments > 0 ? ( + + {blockedInstallments === 1 + ? '1 månad kunde inte bokföras automatiskt: öppna raden för felmeddelandet.' + : `${blockedInstallments} månader kunde inte bokföras automatiskt: öppna raden för felmeddelandet.`} + + ) : null} - setStatusFilter(v as StatusFilter)}> - - Aktiva - Avslutade - Alla - - + {/* Toolbar: status seg (concept scene 33) */} +
+ {( + [ + { key: 'active', label: 'Aktiva', count: activeCount }, + { key: 'completed', label: 'Avslutade', count: null }, + { key: 'all', label: 'Alla', count: null }, + ] as const + ).map(({ key, label, count }) => ( + + ))} +
{isLoading ? ( - - - - - - - +
+ {[1, 2, 3].map((i) => ( + + ))} +
) : schedules.length === 0 ? ( ) : ( - - - - - - - Beskrivning - Konto - Period - Totalt - Kvar - Status - - - - + <> +
+
+ + + + + + + + + + + {schedules.map((schedule) => { const dissolved = sumPosted(schedule.installments) const remaining = @@ -260,7 +276,6 @@ export default function AccrualSchedulesPage() { ? 0 : roundOre(schedule.total_amount - dissolved) const isOpen = expanded.has(schedule.id) - const badge = SCHEDULE_BADGE[schedule.status] const sourceHref = schedule.supplier_invoice_id ? `/supplier-invoices/${schedule.supplier_invoice_id}` : schedule.invoice_id @@ -268,20 +283,11 @@ export default function AccrualSchedulesPage() { : null return ( - toggleExpanded(schedule.id)} > - - - + + + + + + + + {isOpen && ( - - -
-
BeskrivningKontoPeriodTotaltKvarStatus +
{schedule.description || '-'} @@ -294,118 +300,148 @@ export default function AccrualSchedulesPage() { {schedule.supplier_invoice_id ? 'Leverantörsfaktura' : 'Kundfaktura'} )} - - + {schedule.balance_account} → {schedule.target_account} - - + {formatDate(schedule.period_start)} till {formatDate(schedule.period_end)} - - + {formatCurrency(schedule.total_amount)} - - + {formatCurrency(remaining)} - - - {badge.label} - - + + {schedule.status === 'cancelled' ? ( + + {SCHEDULE_STATUS_TEXT.cancelled} + + ) : ( + + {SCHEDULE_STATUS_TEXT[schedule.status]} + + )} + {canWrite && schedule.status === 'active' && remaining > 0 && ( - + )} - - +
- - - - - - - - - - {schedule.installments.map((installment) => ( - - - - - + + + {schedule.installments.map((installment) => ( + + + + + + + ))} + +
MånadBeloppStatusVerifikat
- {monthLabel(installment.period_month)} - - {formatCurrency(installment.amount)} - - {installment.status === 'posted' ? ( - Bokförd - ) : installment.status === 'cancelled' ? ( - Makulerad - ) : installment.last_error ? ( - - Fel - - {installment.last_error} - - - ) : ( - Väntar - )} - - {installment.journal_entry_id ? ( - - Öppna verifikat - - ) : ( - - - )} -
+ +
+ + + + + + + - ))} - -
MånadBeloppStatusVerifikat
-
- - + +
+ {monthLabel(installment.period_month)} + + {formatCurrency(installment.amount)} + + {installment.status === 'posted' ? ( + Bokförd + ) : installment.status === 'cancelled' ? ( + Makulerad + ) : installment.last_error ? ( + + Fel + + {installment.last_error} + + + ) : ( + Väntar + )} + + {installment.journal_entry_id ? ( + + Öppna verifikat + + ) : ( + - + )} +
+
+ + + )} ) })} - - - - + + +
+ +

+ Månadens andel bokförs automatiskt den sista dagen i varje månad. Öppna en rad + för att se varje månads verifikat. +

+ )} - {dissolveTarget && ( - !open && setDissolveTarget(null)} - onConfirm={handleDissolve} - isSubmitting={isDissolving} - title="Lös upp periodiseringen nu?" - warningText={`Återstående ${formatCurrency( - Math.round( - (dissolveTarget.total_amount - sumPosted(dissolveTarget.installments)) * 100, - ) / 100, - )} bokförs i ett verifikat daterat idag, och periodiseringen avslutas.`} - confirmLabel="Lös upp nu" - > + + + !open && setDissolveTarget(null)} + title="Lös upp periodiseringen nu?" + description={ + dissolveTarget + ? `Återstående ${formatCurrency(dissolveRemaining)} bokförs i ett verifikat daterat idag, och periodiseringen avslutas.` + : undefined + } + confirmLabel="Lös upp nu" + onConfirm={handleDissolve} + > + {dissolveTarget && (

{dissolveTarget.description || 'Periodisering'}

@@ -413,8 +449,8 @@ export default function AccrualSchedulesPage() { {formatDate(dissolveTarget.period_start)} till {formatDate(dissolveTarget.period_end)}

-
- )} + )} +
) } diff --git a/app/(dashboard)/customers/loading.tsx b/app/(dashboard)/customers/loading.tsx index 6ee6fc09..fb0ef4c3 100644 --- a/app/(dashboard)/customers/loading.tsx +++ b/app/(dashboard)/customers/loading.tsx @@ -3,6 +3,7 @@ import { Skeleton } from '@/components/ui/skeleton' export default function CustomersLoading() { return (
+ {/* Title (24px) + export menu + "Ny kund" action (pills) */}
@@ -10,18 +11,25 @@ export default function CustomersLoading() {
- -
+ + {/* Search toolbar */} + + + {/* Borderless table: header row + single-line rows */} +
+
+ + +
{[1, 2, 3, 4, 5, 6].map((i) => (
- - - + +
))} diff --git a/app/(dashboard)/deadlines/page.tsx b/app/(dashboard)/deadlines/page.tsx index c7d6aadd..0de78744 100644 --- a/app/(dashboard)/deadlines/page.tsx +++ b/app/(dashboard)/deadlines/page.tsx @@ -8,11 +8,15 @@ import { fetchAllRows } from '@/lib/supabase/fetch-all' import { useToast } from '@/components/ui/use-toast' import { ToastAction } from '@/components/ui/toast' import { DeadlineList } from '@/components/deadlines/DeadlineList' +import { DeadlineForm } from '@/components/deadlines/DeadlineForm' import { PageHeader } from '@/components/ui/page-header' +import { HelpPopover } from '@/components/ui/help-popover' +import { AttnLine } from '@/components/ui/attn-line' import { Button } from '@/components/ui/button' import { Skeleton } from '@/components/ui/skeleton' -import { AlertTriangle, ArrowRight, CalendarClock, Loader2 } from 'lucide-react' +import { Lock, Plus } from 'lucide-react' import { useCompany } from '@/contexts/CompanyContext' +import { useCanWrite } from '@/lib/hooks/use-can-write' import { formatCurrency } from '@/lib/utils' import type { Deadline } from '@/types' import { getErrorMessage as getUserErrorMessage } from '@/lib/errors/get-error-message' @@ -23,11 +27,14 @@ export default function DeadlinesPage() { const { company } = useCompany() const companyId = company?.id const t = useTranslations('deadlines') + const { canWrite } = useCanWrite() const [deadlines, setDeadlines] = useState([]) const [customers, setCustomers] = useState<{ id: string; name: string }[]>([]) const [overdueInvoices, setOverdueInvoices] = useState<{ count: number; total: number }>({ count: 0, total: 0 }) const [isLoading, setIsLoading] = useState(true) const [isGenerating, setIsGenerating] = useState(false) + const [showForm, setShowForm] = useState(false) + const [editingDeadline, setEditingDeadline] = useState(null) const { toast } = useToast() const fetchData = useCallback(async () => { @@ -240,6 +247,9 @@ export default function DeadlinesPage() { description: error instanceof Error ? getUserErrorMessage(error) : t('retry'), variant: 'destructive', }) + // Rethrow (like create) so a failed edit keeps the form open with the + // user's input instead of silently discarding it. + throw error } } @@ -265,24 +275,60 @@ export default function DeadlinesPage() { } } + const handleFormSubmit = async ( + data: Omit, + ) => { + if (editingDeadline) { + await handleDeadlineEdit({ ...editingDeadline, ...data }) + } else { + await handleDeadlineCreate(data) + } + setShowForm(false) + setEditingDeadline(null) + } + + const openEdit = (deadline: Deadline) => { + setEditingDeadline(deadline) + setShowForm(true) + } + + const pageHeader = ( + +

{t('help_text')}

+

+ + {t('generate_open_settings')} + +

+ + } + action={ + + } + /> + ) + if (isLoading) { return (
- + {pageHeader}
{[1, 2, 3, 4].map((i) => ( -
-
-
- - -
- -
- - -
- +
+ +
+ +
))} @@ -294,65 +340,57 @@ export default function DeadlinesPage() { // Statutory deadlines (moms, arbetsgivardeklaration, F-skatt) are generated // from the company's tax settings — none present usually means those // settings were never filled in, so point there instead of letting the page - // read as an empty manual todo list. + // read as an empty manual todo list. One attn line per page: this setup + // nudge outranks the overdue-invoices note because it unlocks the page. const hasSystemDeadlines = deadlines.some((d) => d.source === 'system') return (
- + {pageHeader} - {!hasSystemDeadlines && ( -
-
- -

- {t('no_system_deadlines_title')} - - {t('no_system_deadlines_description')} - -

-
-
- - - {t('generate_open_settings')} - - -
-
- )} - - {/* Overdue invoices alert */} - {overdueInvoices.count > 0 && ( - -
-
- -

- {t('overdue_invoices', { count: overdueInvoices.count })} - - {formatCurrency(overdueInvoices.total)} - -

-
- -
- - )} + {!hasSystemDeadlines ? ( + { + if (!isGenerating) void handleGenerateSystemDeadlines() + }, + }} + > + {t('no_system_deadlines_title')} {t('no_system_deadlines_description')} + + ) : overdueInvoices.count > 0 ? ( + + {t('overdue_invoices', { count: overdueInvoices.count })} ·{' '} + {formatCurrency(overdueInvoices.total)}. + + ) : null} + + { + if (!open) { + setShowForm(false) + setEditingDeadline(null) + } + }} + onSubmit={handleFormSubmit} + onDelete={(deadline) => { + if (deadline.id) { + const full = deadlines.find((d) => d.id === deadline.id) + if (full) void handleDeadlineDelete(full) + } + }} + initialData={editingDeadline || undefined} + customers={customers} />
) diff --git a/app/(dashboard)/import/page.tsx b/app/(dashboard)/import/page.tsx index 723fada7..b93a749b 100644 --- a/app/(dashboard)/import/page.tsx +++ b/app/(dashboard)/import/page.tsx @@ -2,16 +2,25 @@ import { useState, useCallback, useEffect } from 'react' import { useSearchParams, useRouter } from 'next/navigation' -import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs' import { useTranslations } from 'next-intl' import { Card, CardContent } from '@/components/ui/card' import { Progress } from '@/components/ui/progress' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { PageHeader } from '@/components/ui/page-header' +import { HelpPopover } from '@/components/ui/help-popover' +import { AttnLine } from '@/components/ui/attn-line' +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog' import { useToast } from '@/components/ui/use-toast' import { getErrorMessage } from '@/lib/errors/get-error-message' -import { ArrowLeftRight, ArrowRightLeft, FileText, ArrowLeft, Landmark, Loader2, Info, ChevronRight, FileSpreadsheet, Download, AlertTriangle } from 'lucide-react' +import { ArrowLeft, Landmark, Loader2, ChevronRight, Download, AlertTriangle } from 'lucide-react' import { cn, formatDate } from '@/lib/utils' import { createClient } from '@/lib/supabase/client' import { useCompany, useCapability } from '@/contexts/CompanyContext' @@ -1944,6 +1953,8 @@ export default function ImportPage() { const { company } = useCompany() const [mode, setMode] = useState(null) const [view, setView] = useState<'import' | 'export'>('import') + const [sieDialogOpen, setSieDialogOpen] = useState(false) + const [cloudOpen, setCloudOpen] = useState(false) const [userId, setUserId] = useState('') const [isSandbox, setIsSandbox] = useState(false) const [exportPeriodId, setExportPeriodId] = useState(null) @@ -1994,20 +2005,24 @@ export default function ImportPage() { } }, [isSandbox, searchParams]) - // Hash-based deep links (#cloud-backup, #sie-export) → switch to export tab and scroll + // Hash-based deep links: both live on the export tab; #sie-export opens + // the SIE dialog, #cloud-backup expands the cloud panel and scrolls to it. useEffect(() => { if (typeof window === 'undefined') return const hash = window.location.hash - if (hash === '#cloud-backup' || hash === '#sie-export') { + if (hash === '#sie-export') { setView('export') + setSieDialogOpen(true) + } else if (hash === '#cloud-backup') { + setView('export') + setCloudOpen(true) setTimeout(() => { document.querySelector(hash)?.scrollIntoView({ block: 'start', behavior: 'smooth' }) - }, 50) + }, 80) } }, []) - const handleViewChange = (next: string) => { - if (next !== 'import' && next !== 'export') return + const handleViewChange = (next: 'import' | 'export') => { setView(next) const params = new URLSearchParams(searchParams.toString()) if (next === 'export') params.set('view', 'export') @@ -2022,276 +2037,171 @@ export default function ImportPage() { return (
+

{t('help_text')}

+ + } /> {mode === null && ( <> - {isSandbox && ( -
- -

- {t('sandbox_disabled')} -

+ {isSandbox && {t('sandbox_disabled')}} + + {/* Importera / Exportera as separate tabs (house seg), like before */} +
+ {( + [ + { key: 'import', label: t('tab_import') }, + { key: 'export', label: t('tab_export') }, + ] as const + ).map(({ key, label }) => ( + + ))} +
+ + {view === 'import' ? ( +
+
+ {hasBankingExtension && ( + {t('psd2_recommended')} + ) : ( + + {t('psd2_requires_subscription')} + + ) + } + chips={} + disabled={isSandbox} + onClick={() => setMode('psd2')} + /> + )} + {hasMigrationExtension && ( + + + + + + + + } + disabled={isSandbox} + onClick={() => setMode('migration')} + /> + )} + setMode('bank')} + /> + setMode('csv_data')} + /> + setMode('sie')} + /> +
+

{t('pgnote')}

+
+ ) : ( +
+
+ setSieDialogOpen(true)} + /> + {hasCloudBackup && ( + setCloudOpen((v) => !v)} + /> + )} +
+ {hasCloudBackup && cloudOpen && ( +
+ +
+ )}
)} - - - {t('tab_import')} - {t('tab_export')} - - - -
- {/* 1. Koppla bank */} - {hasBankingExtension && ( -
{ if (!isSandbox) setMode('psd2') }} - onKeyDown={(e) => { if (!isSandbox && (e.key === 'Enter' || e.key === ' ')) { e.preventDefault(); setMode('psd2') } }} - > -
- -
-
-
-

{t('psd2_title')}

- {hasBankSync ? ( - {t('psd2_recommended')} - ) : ( - - {t('psd2_requires_subscription')} - - )} -
-

- {t('psd2_description')} -

-
- -
- )} - - {/* 2. Hämta från annat system */} - {hasMigrationExtension === true && ( -
{ if (!isSandbox) setMode('migration') }} - onKeyDown={(e) => { if (!isSandbox && (e.key === 'Enter' || e.key === ' ')) { e.preventDefault(); setMode('migration') } }} - > -
-
- -
-
-

{t('migration_title')}

-

- {t('migration_description')} -

-
- -
-
- {([ - { name: 'Fortnox', logo: '/logos/fortnox.svg' }, - { name: 'Visma', logo: '/logos/visma.jpeg' }, - { name: 'Bokio', logo: '/logos/bokio.png' }, - { name: 'Björn Lundén', logo: '/logos/bjornlunden.png' }, - { name: 'Briox', logo: '/logos/Briox_logo.png' }, - ] as const).map(provider => ( -
- {provider.name} - {provider.name} -
- ))} -
-
- )} - - {/* 3. Banktransaktioner: manual file imports (bank file, CSV/Excel, - SIE) run entirely on uploaded data with no external service, so - they stay available in the sandbox, unlike the API-backed options - above (bank connection, provider migration) which need live - credentials. */} -
setMode('bank')} - onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setMode('bank') } }} - > -
- -
-
-

{t('bankfile_title')}

-

- {t('bankfile_description')} -

-
- {['CSV', 'OFX', 'SEB', 'Swedbank', 'Nordea'].map(fmt => ( - - {fmt} - - ))} -
-
- -
- - {/* 4. CSV/Excel-data (ingående balanser, kunder, leverantörer) */} -
setMode('csv_data')} - onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setMode('csv_data') } }} - > -
- -
-
-

{t('csv_data_title')}

-

- {t('csv_data_description')} -

-
- {[ - { key: 'XLSX', label: 'XLSX' }, - { key: 'CSV', label: 'CSV' }, - { key: 'opening_balances', label: t('csv_chip_opening_balances') }, - { key: 'customers', label: t('csv_chip_customers') }, - { key: 'suppliers', label: t('csv_chip_suppliers') }, - { key: 'articles', label: t('csv_chip_articles') }, - ].map(chip => ( - - {chip.label} - - ))} -
-
- -
- - {/* 5. Bokföringsdata (SIE) */} -
setMode('sie')} - onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setMode('sie') } }} - > -
- -
-
-

{t('sie_title')}

-

- {t('sie_description')} -

-
- {['SIE4', '.se'].map(fmt => ( - - {fmt} - - ))} -
-
- -
-
-
- - + {/* SIE export as a small centered dialog (concept overlay convention) */} + + + + + {t('export_sie_title')} + + + {t('export_sie_dialog_description')} + +
- {/* SIE-export */} -
-
- {/* Identity */} -
-
- -
-
-

{t('export_sie_title')}

-

- {t('export_sie_description')} -

-
-
- - {/* Controls */} -
- - - -
-
-
- - {/* Molnsynkronisering (Google Drive) */} - {hasCloudBackup && ( -
- -
- )} + +
-
-
+ + + + + )} @@ -2328,3 +2238,81 @@ export default function ImportPage() {
) } + +// Quiet action row (concept scene 32): borderless list row with title, muted +// sub-line and a chevron; chips only for the recommended/gated exceptions. +function ImportRow({ + title, + sub, + chip, + chips, + disabled = false, + expanded, + onClick, + id, +}: { + title: string + sub: string + chip?: React.ReactNode + /** Logo chips under the sub line (provider marks, as on the live page). */ + chips?: React.ReactNode + disabled?: boolean + /** For rows that fold a panel open below the grid (cloud backup). */ + expanded?: boolean + onClick: () => void + id?: string +}) { + return ( + + ) +} + +// Provider mark chip (same recipe as the pre-migration live page): tiny logo +// on a quiet bordered chip, so integrations read as first-class brands. +// `mono` is for light-on-transparent marks (Enable Banking): the marketing +// site's grayscale+brightness treatment makes them read on a light ground, +// with the inverse lift in dark mode. +function LogoChip({ src, name, mono = false }: { src: string; name: string; mono?: boolean }) { + return ( + + + {name} + + ) +} diff --git a/app/(dashboard)/invoices/loading.tsx b/app/(dashboard)/invoices/loading.tsx index 79f60d2a..a4da46ca 100644 --- a/app/(dashboard)/invoices/loading.tsx +++ b/app/(dashboard)/invoices/loading.tsx @@ -3,25 +3,34 @@ import { Skeleton } from '@/components/ui/skeleton' export default function InvoicesLoading() { return (
+ {/* Title (24px) + primary action (single "Ny faktura" split button, pill) */}
- -
- - -
+ +
- - -
- {[1, 2, 3, 4, 5].map((i) => ( -
-
- - -
-
- - + + {/* Toolbar: status picker chip + search + fiscal-year picker */} +
+ + + +
+ + {/* Borderless table: header row over hairline-separated single-line rows */} +
+
+ + +
+ {[1, 2, 3, 4, 5, 6].map((i) => ( +
+ +
+ +
))} diff --git a/app/(dashboard)/loading.tsx b/app/(dashboard)/loading.tsx index 4fa65c48..dbfc9201 100644 --- a/app/(dashboard)/loading.tsx +++ b/app/(dashboard)/loading.tsx @@ -1,47 +1,46 @@ import { Skeleton } from '@/components/ui/skeleton' +/** + * Shared loading fallback for the dashboard segment. It is the Suspense + * fallback for Hem (app/(dashboard)/page.tsx) and for every child route that + * has no loading.tsx of its own, so it deliberately mirrors Hem's silhouette: + * a greeting hero (H1 + date line) followed by a single "Att göra"-style pane + * of list rows (see DashboardContent / AttGoraSection). + * + * A greeting + hairline-separated rows reads honestly on Hem and stays neutral + * on the plain list pages that fall back here (a page title + rows), which is + * why it is not shaped like any one page's specific grid. + */ export default function DashboardLoading() { return (
- {/* Metrics row */} -
- {[1, 2, 3, 4].map((i) => ( -
- - - -
- ))} -
+ {/* Greeting hero (title + date line) */} +
+ + +
- {/* Income / Expenses */} -
- {[1, 2].map((i) => ( -
- - - -
- ))} -
- - {/* Alerts + deadlines */} -
-
- - - + {/* Single pane: header over a hairline, then list rows */} +
+
+ +
-
- - {[1, 2, 3].map((i) => ( -
- - + + +
+ {['w-44', 'w-52', 'w-40', 'w-48', 'w-44'].map((w, i) => ( +
+ + +
))}
-
+
) } diff --git a/app/(dashboard)/pending/loading.tsx b/app/(dashboard)/pending/loading.tsx index 8a9e2444..321fc6f5 100644 --- a/app/(dashboard)/pending/loading.tsx +++ b/app/(dashboard)/pending/loading.tsx @@ -3,17 +3,26 @@ import { Skeleton } from '@/components/ui/skeleton' export default function PendingLoading() { return (
+ {/* Title (24px) + conditional "Godkänn alla" action (pill) */}
-
+ + {/* Toolbar: segmented tabs + source picker */} +
+ + +
+ + {/* Per-operation cards with approve/reject actions */} +
{[1, 2, 3, 4].map((i) => (
- +
diff --git a/app/(dashboard)/reports/loading.tsx b/app/(dashboard)/reports/loading.tsx index d9312c8b..08c30dc6 100644 --- a/app/(dashboard)/reports/loading.tsx +++ b/app/(dashboard)/reports/loading.tsx @@ -3,10 +3,12 @@ import { Skeleton } from '@/components/ui/skeleton' export default function ReportsLoading() { return (
+ {/* Title (24px) + fiscal-year picker chip */}
- - + +
+ {/* Section heading (e.g. "Senaste rapporter") */}
{[1, 2, 3, 4, 5, 6].map((i) => ( diff --git a/app/(dashboard)/salary/loading.tsx b/app/(dashboard)/salary/loading.tsx index 4d5049e2..c0392003 100644 --- a/app/(dashboard)/salary/loading.tsx +++ b/app/(dashboard)/salary/loading.tsx @@ -3,17 +3,29 @@ import { Skeleton } from '@/components/ui/skeleton' export default function SalaryLoading() { return (
+ {/* Title (24px) + single "Starta körning" action (pill) */}
- -
- - -
+ +
- -
- {[1, 2, 3].map((i) => ( - + + {/* Borderless table of salary runs: header row + single-line rows */} +
+
+ + +
+ {[1, 2, 3, 4, 5].map((i) => ( +
+ +
+ + +
+
))}
diff --git a/app/(dashboard)/skattekonto/page.tsx b/app/(dashboard)/skattekonto/page.tsx index ed1f6c88..1b280943 100644 --- a/app/(dashboard)/skattekonto/page.tsx +++ b/app/(dashboard)/skattekonto/page.tsx @@ -1,13 +1,16 @@ 'use client' -import { useCallback, useEffect, useRef, useState } from 'react' +import { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react' import Link from 'next/link' -import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' +import { useTranslations } from 'next-intl' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { PageHeader } from '@/components/ui/page-header' +import { HelpPopover } from '@/components/ui/help-popover' +import { AttnLine } from '@/components/ui/attn-line' import { EmptyState } from '@/components/ui/empty-state' -import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' +import { Skeleton } from '@/components/ui/skeleton' +import { TH_CLASS, TD_CLASS, QUIET_LINK_CLASS } from '@/components/ui/dry-table' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table' import { Dialog, @@ -18,6 +21,7 @@ import { DialogTitle, } from '@/components/ui/dialog' import { useToast } from '@/components/ui/use-toast' +import { cn } from '@/lib/utils' import { formatCurrency, formatDate, @@ -29,9 +33,7 @@ import { AlertCircle, Copy, ExternalLink, - FileCheck, Landmark, - Link2, RefreshCw, } from 'lucide-react' import { useCapability } from '@/contexts/CompanyContext' @@ -70,7 +72,9 @@ interface MatchCandidate { export default function SkattekontoPage() { const { toast } = useToast() + const t = useTranslations('skattekonto') const hasSkvCapability = useCapability(CAPABILITY.skatteverket) + const [showPayment, setShowPayment] = useState(false) const [saldo, setSaldo] = useState(null) const [tx, setTx] = useState(null) const [loading, setLoading] = useState(true) @@ -294,59 +298,85 @@ export default function SkattekontoPage() { .catch(() => {}) } + // Next charge (concept attn line): the earliest upcoming due date and the + // sum of everything Skatteverket draws that day. + const nextCharge = useMemo(() => { + const upcoming = tx?.upcoming ?? [] + const dueOf = (r: StoredSkattekontoTransaction) => + r.forfallodatum ?? r.transaktionsdatum + const due = upcoming.map(dueOf).sort()[0] + if (!due) return null + const rows = upcoming.filter((r) => dueOf(r) === due) + const amount = rows.reduce((sum, r) => sum + Number(r.belopp_skatteverket), 0) + return { due, count: rows.length, amount: Math.round(Math.abs(amount) * 100) / 100 } + }, [tx]) + + const saldoNow = saldo?.data ? saldo.data.saldoSkatteverket : null + const shortfall = + nextCharge && saldoNow !== null && saldoNow < nextCharge.amount + ? Math.round((nextCharge.amount - saldoNow) * 100) / 100 + : null + + const helpNode = ( + +

{t('help_text')}

+
+ ) + if (notConnected) { return ( -
- - - - - - - - +
+ + + +
) } if (loadError) { return ( -
- - - - - - - - +
+ + + +
) } + const data = saldo?.data ?? null + return ( -
- + - @@ -354,72 +384,131 @@ export default function SkattekontoPage() { } /> - {reconnectMessage && ( -
-
- -

{reconnectMessage}

+ {/* Saldo as compact stat tiles (house metric-card idiom, KPIHeroCards) */} +
+ {loading && !data ? ( +
+ +
- -
- )} + ) : !data ? ( +

+ Inget saldo hämtat ännu: klicka på ”Synkronisera nu”. +

+ ) : ( + <> +
+
+
+ +

Saldo hos Skatteverket

+
+

+ {formatCurrency(data.saldoSkatteverket)} +

+

+ OCR {data.ocrNummer}{' '} + + {saldo?.lastSyncedAt && ( + <> + {' '}· synkad{' '} + {formatDateTime(saldo.lastSyncedAt)} + + )} +

+ {data.rantaSkatteverket !== 0 && ( +

+ Preliminär ränta: {formatCurrency(data.rantaSkatteverket)} +

+ )} + {data.saldoKronofogden !== 0 && ( +

+ Hos Kronofogden: {formatCurrency(data.saldoKronofogden)} + {data.rantaKronofogden !== 0 && + ` (ränta ${formatCurrency(data.rantaKronofogden)})`} +

+ )} +
- +
+

Nästa dragning

+ {nextCharge ? ( + <> +

+ {formatCurrency(nextCharge.amount)} +

+

+ {formatDateLong(nextCharge.due)} + {nextCharge.count > 1 && ` · ${nextCharge.count} händelser`} +

+ + ) : ( +

+ Inga kommande dragningar. +

+ )} +
+
- - - Transaktioner - - - - - - Genomförda {tx?.booked ? `(${tx.booked.length})` : ''} - - - Förfallna {tx?.overdue ? `(${tx.overdue.length})` : ''} - - - Kommande {tx?.upcoming ? `(${tx.upcoming.length})` : ''} - - - - - - - - - - - - - - + {reconnectMessage ? ( + + {reconnectMessage} + + ) : shortfall !== null && nextCharge ? ( + setShowPayment(true) }} + > + {t('attn_shortfall', { + date: formatDateLong(nextCharge.due), + charge: formatCurrency(nextCharge.amount), + missing: formatCurrency(shortfall), + })} + + ) : null} + + {data.informationstext.length > 0 && ( +
+

+ Information från Skatteverket +

+ {data.informationstext.map((info, i) => ( +

+ {info} +

+ ))} +
+ )} + + )} + + + {/* One dry table with band rows (concept): Kommande, Förfallna, Genomförda */} + + +

+ {t('pgnote', { amount: formatCurrency(data?.saldoKronofogden ?? 0) })} +

+ + + + + + {t('payment_title')} + + {nextCharge && ( + + {t('payment_description', { + date: formatDateLong(nextCharge.due), + charge: formatCurrency(nextCharge.amount), + })} + + )} + +
+
+
{t('payment_bankgiro_label')}
+
5050-1055
+
+
+
OCR
+
+ {data?.ocrNummer} + {data && ( + + )} +
+
+ {shortfall !== null && ( +
+
{t('payment_shortfall_label')}
+
{formatCurrency(shortfall)}
+
+ )} +
+
+
) } -function PageHeading({ right }: { right?: React.ReactNode }) { - return +type TableSection = { + key: 'upcoming' | 'overdue' | 'booked' + label: string + rows: SkattekontoTransactionWithSuggestion[] } -function BalanceHero({ - saldo, - loading, - onCopyOcr, -}: { - saldo: SaldoEnvelope | null - loading: boolean - onCopyOcr: (ocr: string) => void -}) { - if (loading && !saldo?.data) { - return ( - - - Hämtar saldo… - - - ) - } - - if (!saldo?.data) { - return ( - - - Inget saldo hämtat ännu: klicka på "Synkronisera nu". - - - ) - } - - const { data } = saldo - const skvNegative = data.saldoSkatteverket < 0 - const kfmNegative = data.saldoKronofogden < 0 - - return ( - - -
-
-

- Skatteverket -

-

- {formatCurrency(data.saldoSkatteverket)} -

- {data.rantaSkatteverket !== 0 && ( -

- Preliminär ränta: {formatCurrency(data.rantaSkatteverket)} -

- )} -
-
-

- Kronofogden -

-

- {formatCurrency(data.saldoKronofogden)} -

- {data.rantaKronofogden !== 0 && ( -

- Preliminär ränta: {formatCurrency(data.rantaKronofogden)} -

- )} -
-
- -
-
-

- OCR -

-

- {data.ocrNummer} - -

-
-
-

- Nästa avstämning -

-

{data.nastaAvstamningsdatum}

-
-
-

- Saldo per -

-

- {formatDateLong(data.senastUppdaterad)} -

-
-
- - {saldo.lastSyncedAt && ( -

- Synkas automatiskt varje natt. Senast synkad{' '} - - {formatDateTime(saldo.lastSyncedAt)} - - . Skatteverket uppdaterar saldot periodvis: datumet ovan ändras - inte varje gång du synkroniserar. -

- )} - - {data.informationstext.length > 0 && ( -
-

- Information från Skatteverket -

-
    - {data.informationstext.map((t, i) => ( -
  • {t}
  • - ))} -
-
- )} -
-
- ) -} - -function TransactionTable({ - rows, +function SkattekontoTable({ + tx, onBokfor, onMatch, bookingId, - emptyText, - showForfallodatum = false, }: { - rows: SkattekontoTransactionWithSuggestion[] + tx: TransaktionerEnvelope['data'] | null onBokfor: (id: string) => void onMatch: (row: StoredSkattekontoTransaction) => void bookingId: string | null - emptyText: string - showForfallodatum?: boolean }) { - if (rows.length === 0) { - return

{emptyText}

+ const t = useTranslations('skattekonto') + + const allSections: TableSection[] = [ + { key: 'upcoming', label: t('band_upcoming'), rows: tx?.upcoming ?? [] }, + { key: 'overdue', label: t('band_overdue'), rows: tx?.overdue ?? [] }, + { key: 'booked', label: t('band_booked'), rows: tx?.booked ?? [] }, + ] + const sections = allSections.filter((s) => s.rows.length > 0) + + if (sections.length === 0) { + return ( +

+ {t('no_transactions')} +

+ ) } return ( - - - - Datum - {showForfallodatum && Förfallodatum} - Beskrivning - Belopp - Status - - - - - {rows.map(row => { - const negative = Number(row.belopp_skatteverket) < 0 - const isBooked = !!row.journal_entry_id - return ( - - {formatDate(row.transaktionsdatum)} - {showForfallodatum && ( - - {row.forfallodatum ? formatDate(row.forfallodatum) : '-'} - - )} - - {row.transaktionstext} - {!isBooked && row.match_suggestion && ( -

- Möjlig dublett av{' '} - {row.match_suggestion.voucher_series && row.match_suggestion.voucher_number +

+
+ + + + + + + + + {sections.map((section) => ( + + + + + {section.rows.map((row) => ( + + ))} + + ))} + +
DatumHändelseBelopp +
+ {section.label} +
+
+ ) +} + +function SkattekontoRow({ + row, + section, + onBokfor, + onMatch, + bookingId, +}: { + row: SkattekontoTransactionWithSuggestion + section: TableSection['key'] + onBokfor: (id: string) => void + onMatch: (row: StoredSkattekontoTransaction) => void + bookingId: string | null +}) { + const t = useTranslations('skattekonto') + const amount = Number(row.belopp_skatteverket) + const isBooked = !!row.journal_entry_id + const displayDate = + section === 'upcoming' || section === 'overdue' + ? (row.forfallodatum ?? row.transaktionsdatum) + : row.transaktionsdatum + + return ( + + + {formatDate(displayDate)} + + + + {row.transaktionstext} + {/* Chips mark exceptions: only a *genomförd* row that is still + unbooked deviates; upcoming rows are unbooked by nature. */} + {section === 'booked' && !isBooked && ( + row.match_suggestion ? ( + + {t('chip_possible_duplicate', { + voucher: + row.match_suggestion.voucher_series && row.match_suggestion.voucher_number ? formatVoucher({ voucher_series: row.match_suggestion.voucher_series, voucher_number: row.match_suggestion.voucher_number, }) - : 'utkast'}{' '} - ({formatDate(row.match_suggestion.entry_date)}) -

- )} - - - {formatCurrency(Number(row.belopp_skatteverket))} - - - {isBooked ? ( - - - Bokförd - - ) : row.match_suggestion ? ( - Möjlig dublett - ) : ( - Ej bokförd - )} - - - {isBooked ? ( - - ) : ( -
- - -
- )} -
- - ) - })} - - + : t('chip_draft'), + })} +
+ ) : ( + + {t('chip_not_booked')} + + ) + )} +
+ + 0 && 'text-success', + )} + > + {amount > 0 ? `+${formatCurrency(amount)}` : formatCurrency(amount)} + + + {isBooked ? ( + + {t('action_show_voucher')} + + ) : ( + + + + + )} + + ) } diff --git a/app/(dashboard)/supplier-invoices/loading.tsx b/app/(dashboard)/supplier-invoices/loading.tsx index 6bfed8e3..9bcce884 100644 --- a/app/(dashboard)/supplier-invoices/loading.tsx +++ b/app/(dashboard)/supplier-invoices/loading.tsx @@ -3,27 +3,34 @@ import { Skeleton } from '@/components/ui/skeleton' export default function SupplierInvoicesLoading() { return (
+ {/* Title (24px) + single "Registrera" action (pill) */}
-
- + + {/* Toolbar: status picker chip + search + fiscal-year picker */} +
+ +
-
+ + {/* Borderless table: header row + single-line rows */} +
+
+ + +
{[1, 2, 3, 4, 5, 6].map((i) => (
-
- - -
-
+ +
- +
))} diff --git a/app/(dashboard)/transactions/loading.tsx b/app/(dashboard)/transactions/loading.tsx index 4bd4c73e..82ab2e5a 100644 --- a/app/(dashboard)/transactions/loading.tsx +++ b/app/(dashboard)/transactions/loading.tsx @@ -3,23 +3,35 @@ import { Skeleton } from '@/components/ui/skeleton' export default function TransactionsLoading() { return (
+ {/* Status bar: title (24px) + single "Importera" split button (pill) */}
- - + +
-
- - + + {/* Toolbar: inbox/history segmented tabs + search + source picker */} +
+ + +
- -
+ + {/* Borderless table: header row + single-line transaction rows */} +
+
+ + +
{[1, 2, 3, 4, 5, 6].map((i) => ( -
-
- - +
+ +
+ +
-
))}
diff --git a/components/deadlines/DeadlineCard.tsx b/components/deadlines/DeadlineCard.tsx deleted file mode 100644 index fa3e65f0..00000000 --- a/components/deadlines/DeadlineCard.tsx +++ /dev/null @@ -1,271 +0,0 @@ -'use client' - -import { useState, useRef, useEffect } from 'react' -import { Deadline } from '@/types' -import { Button } from '@/components/ui/button' -import { cn } from '@/lib/utils' -import { - isDeadlineOverdue, - DEADLINE_TYPE_LABELS, - parseDate, - startOfDay, -} from '@/lib/calendar/utils' -import { Check, Pencil } from 'lucide-react' - -interface DeadlineCardProps { - deadline: Deadline - onToggle: (deadline: Deadline) => void - onEdit?: (deadline: Deadline) => void - onDelete?: (deadline: Deadline) => void - compact?: boolean -} - -function getRelativeDate(dateStr: string): { text: string; urgent: boolean } | null { - const today = startOfDay(new Date()) - const target = parseDate(dateStr) - const diffMs = target.getTime() - today.getTime() - const diffDays = Math.round(diffMs / (1000 * 60 * 60 * 24)) - - if (diffDays === 0) return { text: 'Idag', urgent: true } - if (diffDays === 1) return { text: 'Imorgon', urgent: false } - if (diffDays === -1) return { text: '1 dag sedan', urgent: true } - if (diffDays < -1) return { text: `${Math.abs(diffDays)} dagar sedan`, urgent: true } - if (diffDays <= 7) return { text: `Om ${diffDays} dagar`, urgent: false } - if (diffDays <= 14) return { text: `Om ${diffDays} dagar`, urgent: false } - return null -} - -const SWEDISH_MONTHS_SHORT = [ - 'jan', 'feb', 'mar', 'apr', 'maj', 'jun', - 'jul', 'aug', 'sep', 'okt', 'nov', 'dec', -] - -export function DeadlineCard({ - deadline, - onToggle, - onEdit, - onDelete, - compact = false, -}: DeadlineCardProps) { - const [confirming, setConfirming] = useState(false) - const confirmRef = useRef(null) - const overdue = isDeadlineOverdue(deadline) - const completed = deadline.is_completed - const relative = getRelativeDate(deadline.due_date) - const dueDate = parseDate(deadline.due_date) - const dayNum = dueDate.getDate() - const monthStr = SWEDISH_MONTHS_SHORT[dueDate.getMonth()] - - // Dismiss confirmation when clicking outside - useEffect(() => { - if (!confirming) return - function handleClickOutside(e: MouseEvent) { - if (confirmRef.current && !confirmRef.current.contains(e.target as Node)) { - setConfirming(false) - } - } - document.addEventListener('mousedown', handleClickOutside) - return () => document.removeEventListener('mousedown', handleClickOutside) - }, [confirming]) - - function handleToggleClick(e: React.MouseEvent) { - e.stopPropagation() - if (completed) { - // Uncompleting doesn't need confirmation - onToggle(deadline) - return - } - setConfirming(true) - } - - function handleConfirm(e: React.MouseEvent) { - e.stopPropagation() - setConfirming(false) - onToggle(deadline) - } - - function handleCancel(e: React.MouseEvent) { - e.stopPropagation() - setConfirming(false) - } - - function handleCardClick() { - if (confirming) return - if (onEdit) onEdit(deadline) - } - - // -- Compact variant (used in dashboard widgets) -- - if (compact) { - return ( -
- - {dayNum} {monthStr} - - -

- {deadline.title} -

- - {!completed && relative && ( - - {relative.text} - - )} - - {completed && ( - - )} -
- ) - } - - // -- Full card -- - return ( -
-
- {/* Main row */} -
- {/* Date block */} -
- - {dayNum} - - - {monthStr} - -
- - {/* Divider */} -
- - {/* Content */} -
-
-

- {deadline.title} -

- {deadline.deadline_type !== 'other' && ( - - {DEADLINE_TYPE_LABELS[deadline.deadline_type]} - - )} -
- -
- {deadline.due_time && ( - - kl {deadline.due_time.slice(0, 5)} - - )} - {deadline.due_time && deadline.customer && ( - · - )} - {deadline.customer && ( - - {deadline.customer.name} - - )} -
-
- - {/* Right: relative date + action */} -
- {!completed && relative && ( - - )} - - {completed ? ( - - - Klar - - ) : ( - - )} - - {/* Edit hint */} - {onEdit && !confirming && ( - - )} -
-
- - {/* Inline confirmation bar */} -
-
-
-

- Markera {deadline.title} som klar? -

-
- - -
-
-
-
-
-
- ) -} diff --git a/components/deadlines/DeadlineFilters.tsx b/components/deadlines/DeadlineFilters.tsx deleted file mode 100644 index 4a283d3b..00000000 --- a/components/deadlines/DeadlineFilters.tsx +++ /dev/null @@ -1,67 +0,0 @@ -'use client' - -import { Button } from '@/components/ui/button' -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from '@/components/ui/select' -import { DeadlineType } from '@/types' -import { DEADLINE_TYPE_LABELS } from '@/lib/calendar/utils' -import { X } from 'lucide-react' - -interface DeadlineFiltersProps { - status: 'all' | 'pending' | 'completed' - type: DeadlineType | 'all' - onStatusChange: (status: 'all' | 'pending' | 'completed') => void - onTypeChange: (type: DeadlineType | 'all') => void - onReset: () => void -} - -export function DeadlineFilters({ - status, - type, - onStatusChange, - onTypeChange, - onReset, -}: DeadlineFiltersProps) { - const hasFilters = status !== 'all' || type !== 'all' - - return ( -
- - - - - {hasFilters && ( - - )} -
- ) -} diff --git a/components/deadlines/DeadlineGroupCard.tsx b/components/deadlines/DeadlineGroupCard.tsx index 5e59fdf7..ab3ef864 100644 --- a/components/deadlines/DeadlineGroupCard.tsx +++ b/components/deadlines/DeadlineGroupCard.tsx @@ -1,17 +1,17 @@ 'use client' -import { useState, useRef, useEffect } from 'react' import { useTranslations } from 'next-intl' import { Deadline } from '@/types' -import { Button } from '@/components/ui/button' import { cn } from '@/lib/utils' -import { isDeadlineOverdue, parseDate } from '@/lib/calendar/utils' -import { Check, Pencil } from 'lucide-react' +import { isDeadlineOverdue } from '@/lib/calendar/utils' +import { QUIET_LINK_CLASS } from '@/components/ui/dry-table' +import { deadlineDateLabel } from './DeadlineRow' +import { Pencil } from 'lucide-react' /** * System tax deadlines that legally share the skattekonto date ("den 12:e"): * for a small monthly-moms employer, moms + AGI (+ debiterad preliminärskatt) - * all fall due the same day. Rendering them as one grouped card instead of + * all fall due the same day. Rendering them as one grouped row instead of * 2-3 identical-date rows keeps the list scannable. */ export const SKATTEKONTO_GROUP_TYPES = new Set([ @@ -32,158 +32,81 @@ export function isSkattekontoDeadline(d: Deadline): boolean { ) } -const SWEDISH_MONTHS_SHORT = [ - 'jan', 'feb', 'mar', 'apr', 'maj', 'jun', - 'jul', 'aug', 'sep', 'okt', 'nov', 'dec', -] - -interface DeadlineGroupCardProps { +interface DeadlineGroupRowProps { /** Two or more skattekonto deadlines sharing the same due_date. */ deadlines: Deadline[] - onToggle: (deadline: Deadline) => void onEdit?: (deadline: Deadline) => void + /** "Markera klar": the list confirms before toggling. */ + onRequestToggle: (deadline: Deadline) => void } /** - * One card for all skattekonto obligations on a shared due date, with the - * date block rendered once and each obligation as a sub-row that keeps its - * own "Markera klar" confirmation. Visual language mirrors DeadlineCard. + * One thread row for all skattekonto obligations on a shared due date + * (concept scene 17 row language): the date renders once, each obligation is + * a sub-row with its own quiet "Markera klar". */ -export function DeadlineGroupCard({ deadlines, onToggle, onEdit }: DeadlineGroupCardProps) { +export function DeadlineGroupCard({ deadlines, onEdit, onRequestToggle }: DeadlineGroupRowProps) { const t = useTranslations('deadlines') - const [confirmingId, setConfirmingId] = useState(null) - const confirmRef = useRef(null) - const first = deadlines[0] - const dueDate = parseDate(first.due_date) - const dayNum = dueDate.getDate() - const monthStr = SWEDISH_MONTHS_SHORT[dueDate.getMonth()] const overdue = deadlines.some(isDeadlineOverdue) - useEffect(() => { - if (!confirmingId) return - function handleClickOutside(e: MouseEvent) { - if (confirmRef.current && !confirmRef.current.contains(e.target as Node)) { - setConfirmingId(null) - } - } - document.addEventListener('mousedown', handleClickOutside) - return () => document.removeEventListener('mousedown', handleClickOutside) - }, [confirmingId]) - - const confirming = deadlines.find((d) => d.id === confirmingId) ?? null - return ( -
-
-
- {/* Shared date block */} -
- - {dayNum} - - - {monthStr} - -
+
+ {/* Shared skattekonto date: always Skatteverket's mark (white ground, + badge not chrome). */} + + Skatteverket + -
- - {/* Group content */} -
-
-

{t('group_skattekonto_title')}

- - {t('group_same_day', { count: deadlines.length })} - -
- -
- {deadlines.map((deadline) => ( -
{ - if (!confirmingId && onEdit) onEdit(deadline) - }} - className={cn( - 'group flex items-center gap-3 rounded-md py-1.5 -mx-2 px-2 transition-colors', - onEdit && !confirmingId && 'cursor-pointer hover:bg-accent/40', - )} - > -

{deadline.title}

- - {onEdit && !confirmingId && ( - - )} -
- ))} -
-
-
- - {/* Inline confirmation bar (one at a time, mirrors DeadlineCard) */} -
+

+ + {deadlineDateLabel(first.due_date)} + + · + {t('group_skattekonto_title')} +

+

-

- {confirming && ( -
-

- {t.rich('group_confirm_question', { - title: confirming.title, - hl: (chunks) => ( - {chunks} - ), - })} -

-
- - -
-
- )} -
+ {t('group_same_day', { count: deadlines.length })} +

+ +
+ {deadlines.map((deadline) => ( +
onEdit?.(deadline)} + className={cn( + 'group flex items-center gap-3 rounded-md py-1.5 -mx-2 px-2 transition-colors duration-150', + onEdit && 'cursor-pointer hover:bg-secondary/35', + )} + > +

{deadline.title}

+ + {onEdit && ( +
+ ))}
diff --git a/components/deadlines/DeadlineList.tsx b/components/deadlines/DeadlineList.tsx index 3a91a960..57a84dcd 100644 --- a/components/deadlines/DeadlineList.tsx +++ b/components/deadlines/DeadlineList.tsx @@ -1,47 +1,46 @@ 'use client' -import { useState, useMemo } from 'react' +import { useMemo, useState } from 'react' +import { useTranslations } from 'next-intl' import { Deadline, DeadlineType } from '@/types' -import { Button } from '@/components/ui/button' -import { DeadlineCard } from './DeadlineCard' +import { DeadlineRow, deadlineDateLabel } from './DeadlineRow' import { DeadlineGroupCard, isSkattekontoDeadline } from './DeadlineGroupCard' -import { DeadlineFilters } from './DeadlineFilters' -import { DeadlineForm } from './DeadlineForm' -import { isDeadlineOverdue } from '@/lib/calendar/utils' -import { Plus, Lock } from 'lucide-react' -import { useCanWrite } from '@/lib/hooks/use-can-write' +import { ConfirmDialog } from '@/components/ui/confirm-dialog' +import { isDeadlineOverdue, parseDate, startOfDay } from '@/lib/calendar/utils' + +type TypeSegment = 'all' | 'tax' | 'invoicing' | 'own' + +const SEGMENT_TYPES: Record, ReadonlyArray> = { + tax: ['tax'], + invoicing: ['invoicing'], + own: ['delivery', 'report', 'other'], +} interface DeadlineListProps { deadlines: Deadline[] - customers: { id: string; name: string }[] - onDeadlineCreate: (data: Omit) => Promise onDeadlineToggle: (deadline: Deadline) => Promise - onDeadlineEdit: (deadline: Deadline) => Promise - onDeadlineDelete: (deadline: Deadline) => Promise + onDeadlineEdit: (deadline: Deadline) => void } +/** + * Viktiga datum as the concept thread (scene 17): a type seg, borderless + * rows under hairline section headers, and a "Närmast" countdown pane on the + * right. Marking done confirms up front via ConfirmDialog. + */ export function DeadlineList({ deadlines, - customers, - onDeadlineCreate, onDeadlineToggle, onDeadlineEdit, - onDeadlineDelete, }: DeadlineListProps) { - const { canWrite } = useCanWrite() - const [statusFilter, setStatusFilter] = useState<'all' | 'pending' | 'completed'>('pending') - const [typeFilter, setTypeFilter] = useState('all') - const [showForm, setShowForm] = useState(false) - const [editingDeadline, setEditingDeadline] = useState(null) + const t = useTranslations('deadlines') + const [segment, setSegment] = useState('all') + const [confirmTarget, setConfirmTarget] = useState(null) const filteredDeadlines = useMemo(() => { - return deadlines.filter((d) => { - if (statusFilter === 'pending' && d.is_completed) return false - if (statusFilter === 'completed' && !d.is_completed) return false - if (typeFilter !== 'all' && d.deadline_type !== typeFilter) return false - return true - }) - }, [deadlines, statusFilter, typeFilter]) + if (segment === 'all') return deadlines + const types = SEGMENT_TYPES[segment] + return deadlines.filter((d) => types.includes(d.deadline_type)) + }, [deadlines, segment]) const groupedDeadlines = useMemo(() => { const today = new Date().toISOString().split('T')[0] @@ -65,41 +64,46 @@ export function DeadlineList({ return { overdue, today: todayDeadlines, upcoming, completed } }, [filteredDeadlines]) - const handleResetFilters = () => { - setStatusFilter('all') - setTypeFilter('all') - } + // "Närmast" pane: days to the nearest pending deadline (across the + // unfiltered list: the countdown is page context, not a filter readout). + const nearest = useMemo(() => { + const pending = deadlines + .filter((d) => !d.is_completed && !isDeadlineOverdue(d)) + .sort((a, b) => a.due_date.localeCompare(b.due_date)) + const first = pending[0] + if (!first) return null + const today = startOfDay(new Date()) + const days = Math.round( + (parseDate(first.due_date).getTime() - today.getTime()) / (1000 * 60 * 60 * 24), + ) + return { deadline: first, days: Math.max(0, days) } + }, [deadlines]) - const handleFormSubmit = async (data: Omit) => { - if (editingDeadline) { - await onDeadlineEdit({ ...editingDeadline, ...data }) - } else { - await onDeadlineCreate(data) + const overdueCount = useMemo( + () => deadlines.filter((d) => !d.is_completed && isDeadlineOverdue(d)).length, + [deadlines], + ) + + const handleRequestToggle = (deadline: Deadline) => { + // Un-completing is a harmless revert: no confirmation (matches the undo + // toast the page already offers). + if (deadline.is_completed) { + void onDeadlineToggle(deadline) + return } - setShowForm(false) - setEditingDeadline(null) - } - - const handleEdit = (deadline: Deadline) => { - setEditingDeadline(deadline) - setShowForm(true) - } - - const handleFormClose = () => { - setShowForm(false) - setEditingDeadline(null) + setConfirmTarget(deadline) } const sections = [ - { key: 'overdue', label: 'Förfallna', items: groupedDeadlines.overdue }, - { key: 'today', label: 'Idag', items: groupedDeadlines.today }, - { key: 'upcoming', label: 'Kommande', items: groupedDeadlines.upcoming }, - { key: 'completed', label: 'Klara', items: groupedDeadlines.completed }, - ].filter(s => s.items.length > 0) + { key: 'overdue', label: t('section_overdue'), items: groupedDeadlines.overdue }, + { key: 'today', label: t('section_today'), items: groupedDeadlines.today }, + { key: 'upcoming', label: t('section_upcoming'), items: groupedDeadlines.upcoming }, + { key: 'completed', label: t('section_completed'), items: groupedDeadlines.completed }, + ].filter((s) => s.items.length > 0) // Skattekonto obligations legally share the same due date (moms + AGI + // preliminärskatt all fall on "den 12:e"): collapse 2+ such rows into one - // grouped card per date instead of near-identical rows. Other deadlines + // grouped row per date instead of near-identical rows. Other deadlines // render as before, in their original order. type ListEntry = | { kind: 'single'; deadline: Deadline } @@ -131,103 +135,125 @@ export function DeadlineList({ return (
- {/* Toolbar */} -
- - + {/* Toolbar: the type seg (concept: Alla / Skatt / Fakturering / Egna) */} +
+ {( + [ + { key: 'all', label: t('seg_all') }, + { key: 'tax', label: t('seg_tax') }, + { key: 'invoicing', label: t('seg_invoicing') }, + { key: 'own', label: t('seg_own') }, + ] as const + ).map(({ key, label }) => ( + + ))}
- {/* Content */} - {filteredDeadlines.length === 0 ? ( -
-

- {statusFilter !== 'all' || typeFilter !== 'all' - ? 'Inga deadlines matchar filtret.' - : 'Inga deadlines ännu.'} +

+ {/* The thread */} + {filteredDeadlines.length === 0 ? ( +

+ {segment !== 'all' ? t('empty_filtered') : t('empty_title')}

- -
- ) : ( -
- {sections.map(({ key, label, items }) => ( -
-
-

- {label} -

- - {items.length} - -
-
-
- {toEntries(items).map((entry) => - entry.kind === 'group' ? ( - - ) : ( - - ), - )} -
-
- ))} -
- )} + ) : ( +
+ {sections.map(({ key, label, items }) => ( +
+
+

+ {label} +

+ + {items.length} + +
+
+
+ {toEntries(items).map((entry) => + entry.kind === 'group' ? ( + + ) : ( + + ), + )} +
+
+ ))} +
+ )} - { - if (deadline.id) { - const full = deadlines.find(d => d.id === deadline.id) - if (full) onDeadlineDelete(full) - } + {/* "Närmast" pane (concept aside) */} + +
+ + !open && setConfirmTarget(null)} + title={t('confirm_done_title')} + description={ + confirmTarget + ? `${deadlineDateLabel(confirmTarget.due_date)} · ${confirmTarget.title}` + : undefined + } + confirmLabel={t('group_confirm')} + onConfirm={async () => { + if (confirmTarget) await onDeadlineToggle(confirmTarget) }} - initialData={editingDeadline || undefined} - customers={customers} />
) diff --git a/components/deadlines/DeadlineRow.tsx b/components/deadlines/DeadlineRow.tsx new file mode 100644 index 00000000..f38f2c2f --- /dev/null +++ b/components/deadlines/DeadlineRow.tsx @@ -0,0 +1,193 @@ +'use client' + +import { useTranslations } from 'next-intl' +import { Deadline } from '@/types' +import { cn } from '@/lib/utils' +import { isDeadlineOverdue, parseDate, startOfDay } from '@/lib/calendar/utils' +import { QUIET_LINK_CLASS } from '@/components/ui/dry-table' +import { + CalendarClock, + Check, + FileText, + Landmark, + Pencil, + ReceiptText, + Truck, +} from 'lucide-react' + +interface DeadlineRowProps { + deadline: Deadline + /** Row click: open the edit dialog. */ + onEdit?: (deadline: Deadline) => void + /** "Markera klar" (or un-done): the list confirms before toggling. */ + onRequestToggle: (deadline: Deadline) => void +} + +function daysFromToday(dateStr: string): number { + const today = startOfDay(new Date()) + const target = parseDate(dateStr) + return Math.round((target.getTime() - today.getTime()) / (1000 * 60 * 60 * 24)) +} + +const TYPE_ICONS: Record = { + tax: Landmark, + invoicing: ReceiptText, + delivery: Truck, + report: FileText, + other: CalendarClock, +} + +// Statutory deadlines carry the receiving authority's mark: Bolagsverket for +// the company-law dates, Skatteverket for everything tax-shaped. Non-system +// deadlines keep the neutral type icons. +const BOLAGSVERKET_TYPES = new Set(['arsredovisning', 'arsstamma']) + +export function deadlineAuthorityLogo(deadline: Deadline): { src: string; alt: string } | null { + if (deadline.tax_deadline_type) { + return BOLAGSVERKET_TYPES.has(deadline.tax_deadline_type) + ? { src: '/logos/bolagsverket.jpg', alt: 'Bolagsverket' } + : { src: '/logos/skatteverket_color.svg', alt: 'Skatteverket' } + } + // Manual deadlines (including user-created tax-category ones) keep the + // neutral type icons: the authority crest is reserved for statutory dates + // the system generated from the tax settings. + return null +} + +/** The shared 28px round mark: authority logo on white, or a muted type icon. */ +export function DeadlineMark({ + deadline, + completed = false, +}: { + deadline: Deadline + completed?: boolean +}) { + const logo = deadlineAuthorityLogo(deadline) + if (completed) { + return ( + + + ) + } + if (logo) { + // Deliberately white in both themes: the authority marks are badges, not + // chrome, and their brand colors need a white ground. + return ( + + {logo.alt} + + ) + } + const Icon = TYPE_ICONS[deadline.deadline_type] ?? CalendarClock + return ( + + + ) +} + +const SWEDISH_MONTHS_SHORT = [ + 'jan', 'feb', 'mar', 'apr', 'maj', 'jun', + 'jul', 'aug', 'sep', 'okt', 'nov', 'dec', +] + +export function deadlineDateLabel(dateStr: string): string { + const date = parseDate(dateStr) + return `${date.getDate()} ${SWEDISH_MONTHS_SHORT[date.getMonth()]}` +} + +/** + * One deadline as a concept thread row (scene 17): icon circle, "12 aug · + * Title" line, muted status sentence below, quiet hover actions. Rows are + * borderless; the section headers carry the structure. + */ +export function DeadlineRow({ deadline, onEdit, onRequestToggle }: DeadlineRowProps) { + const t = useTranslations('deadlines') + const overdue = isDeadlineOverdue(deadline) + const completed = deadline.is_completed + const diff = daysFromToday(deadline.due_date) + + const relative = completed + ? null + : diff === 0 + ? t('rel_today') + : diff === 1 + ? t('rel_tomorrow') + : diff < 0 + ? t('rel_days_ago', { count: Math.abs(diff) }) + : diff <= 14 + ? t('rel_in_days', { count: diff }) + : null + + const subParts = [ + relative, + deadline.due_time ? `kl ${deadline.due_time.slice(0, 5)}` : null, + deadline.customer?.name ?? null, + ].filter(Boolean) as string[] + + return ( +
onEdit?.(deadline)} + className={cn( + 'group flex items-start gap-3 rounded-md py-3 -mx-2 px-2 transition-colors duration-150', + onEdit && 'cursor-pointer hover:bg-secondary/35', + completed && 'opacity-60', + )} + > + + +
+

+ + {deadlineDateLabel(deadline.due_date)} + + · + {deadline.title} +

+ {subParts.length > 0 && ( +

+ {subParts.join(' · ')} +

+ )} +
+ +
+ {completed ? ( + + ) : ( + + )} + {onEdit && ( +
+
+ ) +} diff --git a/components/deadlines/index.ts b/components/deadlines/index.ts index 3118eff9..7bfe3969 100644 --- a/components/deadlines/index.ts +++ b/components/deadlines/index.ts @@ -1,5 +1,4 @@ -export { DeadlineCard } from './DeadlineCard' -export { DeadlineFilters } from './DeadlineFilters' +export { DeadlineRow } from './DeadlineRow' export { DeadlineForm } from './DeadlineForm' export { DeadlineList } from './DeadlineList' export { UpcomingDeadlinesWidget } from './UpcomingDeadlinesWidget' diff --git a/messages/en.json b/messages/en.json index 8622a425..087ab817 100644 --- a/messages/en.json +++ b/messages/en.json @@ -537,7 +537,7 @@ "history_reason": "reason: \"{reason}\"" }, "deadlines": { - "title": "Deadlines", + "title": "Key dates", "load_failed_title": "Could not load deadlines", "load_failed_description": "Check your connection and try again.", "created_title": "Deadline created", @@ -570,7 +570,32 @@ "group_mark_done": "Mark as done", "group_confirm_question": "Mark {title} as done?", "group_cancel": "Cancel", - "group_confirm": "Confirm" + "group_confirm": "Confirm", + "new_deadline": "New deadline", + "read_only_tooltip": "You have read-only access in this company", + "generating": "Generating…", + "help_text": "Deadlines for VAT, employer declarations and F-tax are generated automatically from your company's tax settings. Add your own with New deadline; click a row to edit it.", + "overdue_invoices_action": "View the invoices", + "seg_all": "All", + "seg_tax": "Tax", + "seg_invoicing": "Invoicing", + "seg_own": "Your own", + "section_overdue": "Overdue", + "section_today": "Today", + "section_upcoming": "Upcoming", + "section_completed": "Done", + "nearest_title": "Next up", + "nearest_days_to": "days until {title}", + "nearest_empty": "Nothing coming up.", + "nearest_overdue": "{count, plural, one {1 overdue} other {# overdue}}", + "rel_today": "Today", + "rel_tomorrow": "Tomorrow", + "rel_days_ago": "{count, plural, one {1 day ago} other {# days ago}}", + "rel_in_days": "{count, plural, one {In 1 day} other {In # days}}", + "mark_not_done": "Undo done", + "empty_title": "No deadlines yet.", + "empty_filtered": "No deadlines match the filter.", + "confirm_done_title": "Mark as done?" }, "bureau": { "title": "Bureau", @@ -5851,7 +5876,7 @@ "missing_rate": "Missing rate" }, "import": { - "title": "Import", + "title": "Import / export", "subtitle": "Import bank transactions or bookkeeping data into your company", "export_title": "Export", "export_subtitle": "Download your bookkeeping as a SIE file or back it up to Google Drive", @@ -5862,28 +5887,33 @@ "psd2_title": "Connect bank", "psd2_recommended": "Recommended", "psd2_requires_subscription": "Requires subscription", - "psd2_description": "Connect your bank account directly and sync transactions automatically via PSD2.", + "psd2_description": "Automatic bank transaction sync via PSD2", "migration_title": "Import from another system", "migration_description": "Nothing changes in your existing system.", - "bankfile_title": "Bank transactions", - "bankfile_description": "Import statements from your bank. Supports most Swedish banks.", - "csv_data_title": "Import CSV / Excel data", - "csv_data_description": "Import opening balances, customers, suppliers, or articles.", + "bankfile_title": "Bank file", + "bankfile_description": "CSV, OFX or your bank's own formats: SEB, Swedbank, Nordea", + "csv_data_title": "CSV or Excel", + "csv_data_description": "Opening balances, customers, suppliers and articles", "csv_chip_opening_balances": "Opening balances", "csv_chip_customers": "Customers", "csv_chip_suppliers": "Suppliers", "csv_chip_articles": "Articles", - "sie_title": "Bookkeeping data (SIE)", - "sie_description": "Import journal entries and chart of accounts from another bookkeeping system.", + "sie_title": "SIE file", + "sie_description": "Bookkeeping from another system or from your accountant", "loading_migration": "Loading migration tool...", "export_heading": "Export", - "export_sie_title": "Export SIE file", - "export_sie_description": "Export your bookkeeping as a SIE4 file for your accountant or for migrating to another system.", + "export_sie_title": "SIE 4", + "export_sie_description": "Any fiscal year, with or without closing entries", "export_sie_period_label": "Fiscal year", "export_sie_button": "Download SIE", "export_sie_no_period": "Select a fiscal year to export.", "export_sie_exclude_closing_label": "Exclude year-end closing voucher (recommended for eDeklarera and systems that do their own year-end closing)", - "export_cloud_title": "Cloud backup to Google Drive" + "export_cloud_title": "Cloud backup to Google Drive", + "export_sie_dialog_description": "Download your bookkeeping as a SIE4 file for your accountant or for moving to another system.", + "cloud_row_title": "Cloud sync", + "cloud_row_description": "Continuous backup of the archive to Google Drive", + "help_text": "Every way in and out lives here: bank connections, file imports and migrations from other systems, plus SIE export and backups. Every import is reviewed before anything is booked.", + "pgnote": "Every import goes through the same steps: upload, map columns, review, result. Nothing is booked without you seeing it first." }, "annualReportStudio": { "choose": "Välj", @@ -5986,5 +6016,28 @@ "preset_reports_description": "Reports are generated automatically once you have enough data. Start by creating invoices or importing transactions.", "preset_reports_action": "Create invoice", "preset_reports_secondary": "Import transactions" + }, + "skattekonto": { + "help_text": "The balance and events are fetched from Skatteverket and synced automatically every night. Completed events are booked against 1630 Skattekonto, usually automatically; anything that cannot be matched is flagged in the list. Pay in via bankgiro 5050-1055 with your OCR number.", + "copy": "copy", + "attn_reconnect_action": "Reconnect", + "attn_shortfall": "The charge on {date} is {charge}. The balance is {missing} short.", + "attn_show_payment": "Show payment details", + "band_upcoming": "Upcoming", + "band_overdue": "Overdue", + "band_booked": "Completed", + "no_transactions": "No transactions yet. Sync to fetch the tax account.", + "chip_not_booked": "Not booked", + "chip_possible_duplicate": "Possible duplicate of {voucher}", + "chip_draft": "draft", + "action_show_voucher": "Show voucher", + "action_match": "Match", + "action_book": "Book", + "action_booking": "Booking…", + "payment_title": "Payment details", + "payment_description": "The charge on {date} is {charge}.", + "payment_bankgiro_label": "Bankgiro (Skatteverket)", + "payment_shortfall_label": "Missing on the account", + "pgnote": "Synced automatically every night. Completed events are booked against 1630 Skattekonto, usually automatically, and deviations are flagged here. Kronofogden: {amount}." } } diff --git a/messages/sv.json b/messages/sv.json index 20fc5162..25792d04 100644 --- a/messages/sv.json +++ b/messages/sv.json @@ -537,7 +537,7 @@ "history_reason": "orsak: \"{reason}\"" }, "deadlines": { - "title": "Deadlines", + "title": "Viktiga datum", "load_failed_title": "Kunde inte ladda deadlines", "load_failed_description": "Kontrollera din anslutning och försök igen.", "created_title": "Deadline skapad", @@ -570,7 +570,32 @@ "group_mark_done": "Markera klar", "group_confirm_question": "Markera {title} som klar?", "group_cancel": "Avbryt", - "group_confirm": "Bekräfta" + "group_confirm": "Bekräfta", + "new_deadline": "Ny deadline", + "read_only_tooltip": "Du har endast läsbehörighet i detta företag", + "generating": "Genererar…", + "help_text": "Deadlines för moms, arbetsgivardeklaration och F-skatt skapas automatiskt från företagets skatteinställningar. Egna deadlines lägger du till med Ny deadline; klicka på en rad för att ändra den.", + "overdue_invoices_action": "Visa fakturorna", + "seg_all": "Alla", + "seg_tax": "Skatt", + "seg_invoicing": "Fakturering", + "seg_own": "Egna", + "section_overdue": "Förfallna", + "section_today": "Idag", + "section_upcoming": "Kommande", + "section_completed": "Klara", + "nearest_title": "Närmast", + "nearest_days_to": "dagar till {title}", + "nearest_empty": "Inget på gång.", + "nearest_overdue": "{count, plural, one {1 förfallen} other {# förfallna}}", + "rel_today": "Idag", + "rel_tomorrow": "Imorgon", + "rel_days_ago": "{count, plural, one {1 dag sedan} other {# dagar sedan}}", + "rel_in_days": "{count, plural, one {Om 1 dag} other {Om # dagar}}", + "mark_not_done": "Ångra klar", + "empty_title": "Inga deadlines ännu.", + "empty_filtered": "Inga deadlines matchar filtret.", + "confirm_done_title": "Markera som klar?" }, "bureau": { "title": "Byrå", @@ -5851,7 +5876,7 @@ "missing_rate": "Saknar timpris" }, "import": { - "title": "Importera", + "title": "Importera / exportera", "subtitle": "Importera banktransaktioner eller bokföringsdata till ditt företag", "export_title": "Exportera", "export_subtitle": "Ladda ner bokföringen som SIE-fil eller säkerhetskopia till Google Drive", @@ -5862,28 +5887,33 @@ "psd2_title": "Koppla bank", "psd2_recommended": "Rekommenderat", "psd2_requires_subscription": "Kräver abonnemang", - "psd2_description": "Anslut ditt bankkonto direkt och synka transaktioner automatiskt via PSD2.", + "psd2_description": "Automatisk hämtning av banktransaktioner via PSD2", "migration_title": "Hämta från annat system", "migration_description": "Inget ändras i ditt befintliga system.", - "bankfile_title": "Banktransaktioner", - "bankfile_description": "Importera kontoutdrag från din bank. Stöder de flesta svenska banker.", - "csv_data_title": "Importera CSV/Excel-data", - "csv_data_description": "Importera ingående balanser, kunder, leverantörer eller artiklar.", + "bankfile_title": "Bankfil", + "bankfile_description": "CSV, OFX eller bankens egna format: SEB, Swedbank, Nordea", + "csv_data_title": "CSV eller Excel", + "csv_data_description": "Ingående balanser, kunder, leverantörer och artiklar", "csv_chip_opening_balances": "Ingående balanser", "csv_chip_customers": "Kunder", "csv_chip_suppliers": "Leverantörer", "csv_chip_articles": "Artiklar", - "sie_title": "Bokföringsdata (SIE)", - "sie_description": "Importera verifikationer och kontoplan från ett annat bokföringsprogram.", + "sie_title": "SIE-fil", + "sie_description": "Bokföring från ett annat system eller från revisorn", "loading_migration": "Laddar migreringsverktyg...", "export_heading": "Exportera", - "export_sie_title": "Exportera SIE-fil", - "export_sie_description": "Exportera bokföringen som SIE4-fil för revisor eller programmigrering.", + "export_sie_title": "SIE 4", + "export_sie_description": "Valfritt räkenskapsår, med eller utan bokslutsposter", "export_sie_period_label": "Räkenskapsår", "export_sie_button": "Ladda ner SIE", "export_sie_no_period": "Välj ett räkenskapsår för att exportera.", "export_sie_exclude_closing_label": "Exkludera bokslutsverifikat (rekommenderas för eDeklarera och system som gör eget bokslut)", - "export_cloud_title": "Säkerhetskopia till Google Drive" + "export_cloud_title": "Säkerhetskopia till Google Drive", + "export_sie_dialog_description": "Ladda ner bokföringen som SIE4-fil för revisorn eller för flytt till ett annat system.", + "cloud_row_title": "Molnsynkronisering", + "cloud_row_description": "Löpande säkerhetskopia av arkivet till Google Drive", + "help_text": "Här samlas alla vägar in och ut: bankkoppling, filimporter och flytt från andra system, samt export av SIE och säkerhetskopior. Varje import granskas innan något bokförs.", + "pgnote": "Varje import går genom samma steg: ladda upp, mappa kolumner, granska, resultat. Inget bokförs utan att du ser det först." }, "annualReportStudio": { "choose": "Välj", @@ -5986,5 +6016,28 @@ "preset_reports_description": "Rapporter genereras automatiskt när du har tillräckligt med data. Börja med att skapa fakturor eller importera transaktioner.", "preset_reports_action": "Skapa faktura", "preset_reports_secondary": "Importera transaktioner" + }, + "skattekonto": { + "help_text": "Saldot och händelserna hämtas från Skatteverket och synkas automatiskt varje natt. Genomförda händelser bokförs mot 1630 Skattekonto, oftast automatiskt; det som inte kan matchas flaggas i listan. Betala in via bankgiro 5050-1055 med ditt OCR-nummer.", + "copy": "kopiera", + "attn_reconnect_action": "Anslut igen", + "attn_shortfall": "Dragningen {date} är {charge}. Saldot saknar {missing}.", + "attn_show_payment": "Visa betalningsuppgifter", + "band_upcoming": "Kommande", + "band_overdue": "Förfallna", + "band_booked": "Genomförda", + "no_transactions": "Inga transaktioner ännu. Synkronisera för att hämta skattekontot.", + "chip_not_booked": "Ej bokförd", + "chip_possible_duplicate": "Möjlig dublett av {voucher}", + "chip_draft": "utkast", + "action_show_voucher": "Visa verifikat", + "action_match": "Matcha", + "action_book": "Bokför", + "action_booking": "Bokför…", + "payment_title": "Betalningsuppgifter", + "payment_description": "Dragningen {date} är {charge}.", + "payment_bankgiro_label": "Bankgiro (Skatteverket)", + "payment_shortfall_label": "Saknas på kontot", + "pgnote": "Synkas automatiskt varje natt. Genomförda händelser bokförs mot 1630 Skattekonto, oftast automatiskt, och avvikelser flaggas här. Kronofogden: {amount}." } } diff --git a/public/logos/anthropic.png b/public/logos/anthropic.png new file mode 100644 index 0000000000000000000000000000000000000000..ae3943b0a95a55d6982d2e4f159a71748ff18f73 GIT binary patch literal 47770 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%0AnfN449qq*8wRxj!+*IssB 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 literal 0 HcmV?d00001 diff --git a/public/logos/claude-ai-icon.webp b/public/logos/claude-ai-icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..4e888a5bd6eecf9026b907a52a2410f6c3d75702 GIT binary patch literal 5612 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 GCIJAZF7oLB literal 0 HcmV?d00001 diff --git a/public/logos/enable-banking-icon.png b/public/logos/enable-banking-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..64badb4a97878825284fcab289b39d817c7b667d GIT binary patch literal 7202 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 X3IPF?|6j&UunYA6Fy>nV@a_Kqz?5}I literal 0 HcmV?d00001 diff --git a/public/logos/skatteverket.svg b/public/logos/skatteverket.svg new file mode 100644 index 00000000..a8b33fa6 --- /dev/null +++ b/public/logos/skatteverket.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/logos/skatteverket_color.svg b/public/logos/skatteverket_color.svg new file mode 100644 index 00000000..94abb074 --- /dev/null +++ b/public/logos/skatteverket_color.svg @@ -0,0 +1,142 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + +