Merge remote-tracking branch 'origin/main' into export-biz

This commit is contained in:
Emil
2026-02-24 16:07:57 +01:00
69 changed files with 3584 additions and 208 deletions
+4
View File
@@ -3,6 +3,7 @@ import {
Sparkles,
MessageSquare,
Bell,
Inbox,
Landmark,
UtensilsCrossed,
ChefHat,
@@ -23,6 +24,7 @@ import {
BarChart3,
Layers,
Puzzle,
TextSearch,
Ship,
FileText,
Shield,
@@ -34,6 +36,7 @@ const ICON_MAP: Record<string, LucideIcon> = {
Sparkles,
MessageSquare,
Bell,
Inbox,
Landmark,
UtensilsCrossed,
ChefHat,
@@ -54,6 +57,7 @@ const ICON_MAP: Record<string, LucideIcon> = {
BarChart3,
Layers,
Puzzle,
TextSearch,
Ship,
FileText,
Shield,
+4
View File
@@ -6,6 +6,8 @@ import { sruExportExtension } from '@/extensions/sru-export'
import { neBilagaExtension } from '@/extensions/ne-bilaga'
import { aiChatExtension } from '@/extensions/general/ai-chat'
import { invoiceInboxExtension } from '@/extensions/general/invoice-inbox'
import { calendarExtension } from '@/extensions/general/calendar'
import { userDescriptionMatchExtension } from '@/extensions/general/user-description-match'
import { euSalesListExtension } from '@/extensions/export/eu-sales-list'
import { vatMonitorExtension } from '@/extensions/export/vat-monitor'
import { intrastatExtension } from '@/extensions/export/intrastat'
@@ -32,6 +34,8 @@ const FIRST_PARTY_EXTENSIONS: Extension[] = [
neBilagaExtension,
aiChatExtension,
invoiceInboxExtension,
calendarExtension,
userDescriptionMatchExtension,
// enableBankingExtension, // Uncomment to activate PSD2 bank sync
// ── Export sector ──────────────────────────────────────────
+30
View File
@@ -51,6 +51,12 @@ export const SECTORS: Sector[] = [
description: 'AI-assistent för skatte- och bokföringsfrågor',
longDescription:
'Ställ frågor om skatt, bokföring och företagande till en AI-assistent som förstår svensk redovisning. Svar baserade på aktuella regler och praxis.',
quickAction: {
label: 'AI-assistent',
description: 'Fråga om bokföring',
icon: 'MessageSquare',
event: 'open-ai-chat',
},
},
{
slug: 'push-notifications',
@@ -76,6 +82,30 @@ export const SECTORS: Sector[] = [
longDescription:
'Skicka leverantörsfakturor till en dedikerad e-postadress eller ladda upp manuellt. AI extraherar automatiskt leverantörsdata, belopp och moms. Granska och bekräfta med ett klick för att skapa leverantörsfakturor.',
},
{
slug: 'calendar',
name: 'Kalender',
sector: 'general',
category: 'operations',
icon: 'Calendar',
dataPattern: 'core',
readsCoreTables: ['invoices', 'deadlines', 'customers'],
description: 'Fullstandig kalendervy med manads-, vecko- och dagsvisning',
longDescription:
'Se alla fakturadatum och deadlines i en interaktiv kalender med manads-, vecko- och dagsvy.',
},
{
slug: 'user-description-match',
name: 'Beskrivningsmatchning',
sector: 'general',
category: 'operations',
icon: 'TextSearch',
dataPattern: 'core',
readsCoreTables: ['transactions', 'mapping_rules'],
description: 'Matcha transaktioner med egna beskrivningar',
longDescription:
'Beskriv vad en transaktion gäller med egna ord och få smarta bokföringsförslag. Systemet lär sig av dina beskrivningar och applicerar automatiskt på framtida transaktioner från samma leverantör.',
},
{
slug: 'enable-banking',
name: 'Bankintegration (PSD2)',
+11
View File
@@ -15,6 +15,16 @@ export type SectorSlug = 'general' | 'restaurant' | 'construction' | 'hotel' | '
/** How an extension gets its data */
export type ExtensionDataPattern = 'core' | 'manual' | 'both'
/** Dashboard quick action declared by an extension */
export interface QuickActionDefinition {
label: string
description: string
icon: string
href?: string
event?: string
order?: number
}
/** Extension metadata for the marketplace and workspace routing */
export interface ExtensionDefinition {
slug: string
@@ -28,6 +38,7 @@ export interface ExtensionDefinition {
dataPattern: ExtensionDataPattern
readsCoreTables?: string[]
hasOwnData?: boolean
quickAction?: QuickActionDefinition
}
/** Sector definition with its extensions */
+2
View File
@@ -14,7 +14,9 @@ const WORKSPACES: Record<WorkspaceKey, ComponentType<WorkspaceComponentProps>> =
'general/ai-chat': dynamic(() => import('@/components/extensions/general/AiChatWorkspace')),
'general/push-notifications': dynamic(() => import('@/components/extensions/general/PushNotificationsWorkspace')),
'general/invoice-inbox': dynamic(() => import('@/components/extensions/general/InvoiceInboxWorkspace')),
'general/calendar': dynamic(() => import('@/components/extensions/general/CalendarWorkspace')),
'general/enable-banking': dynamic(() => import('@/components/extensions/general/EnableBankingWorkspace')),
'general/user-description-match': dynamic(() => import('@/components/extensions/general/UserDescriptionMatchWorkspace')),
// Restaurant
'restaurant/food-cost': dynamic(() => import('@/components/extensions/restaurant/FoodCostWorkspace')),
'restaurant/earnings-per-liter': dynamic(() => import('@/components/extensions/restaurant/EarningsPerLiterWorkspace')),