93f81f03e8
* feat(providers): WINT migration provider behind WINT_MIGRATION_ENABLED Adds WINT (wint.se) as a sixth migration provider, built against the OpenAPI specs WINT's own API host serves publicly. Tier A scope: only the partner-facing v1 endpoints are used; the general ledger is fetched as vouchers/accounts and rendered as SIE 4E by our own sie-builder, with opening balances for earlier years derived backward from the current-year Ib anchor. Auth is the user's WINT login exchanged once for a JWT pair; the password is never stored. Ships dark: the wizard shows a disabled "Kommer snart" card, and the server-side /connect gate rejects WINT until WINT_MIGRATION_ENABLED=true. Live verification against a real WINT account is still outstanding. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(providers): harden WINT provider per PR #1446 review findings Addresses CodeRabbit and Swedish accounting review feedback in one pass: - Ib anchor selection now uses WINT's unfiltered fiscal-year list, so an active year outside the allowed import window can never silently anchor the wrong year; the voucher chain is extended through the anchor and a per-year fetch failure fails that year loudly instead of sinking the whole migration. - Auth token exchange is strict: only LoginState Success with a complete access+refresh pair mints a consent (a pair without a refresh token is unrefreshable and would break days later). - WintApiError no longer retains full response bodies (bounded 300-char diagnostic; bodies can carry customer data and errors get logged). - sie-builder refuses to render structurally invalid vouchers (missing account number or booking date) and documents deleted-voucher gaps in a #PROSA record per BFL 5 kap 6-7 §. - Account classification: 20xx is equity, 83xx is financial income. - SIE validator accepts EUBAS97 as BAS-based (standard kontoplanstyp; it previously produced a false non-BAS warning on every WINT/Bollbok file). - New tests: resolveConsent WINT refresh flow, credential upsert payload (no mail/password persisted), WINT fetch failure path, EUBAS97 warning regression, builder invalid-data rejection, vi.clearAllMocks hygiene. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(import): pin EUBAS97 acceptance to the exact SIE spec value Review follow-up on PR #1446: match EUBAS97 exactly instead of any EUBAS* prefix, so the non-BAS kontoplan warning stays pinned to the four kontoplanstyp values the SIE 4B spec enumerates (BAS95, BAS96, EUBAS97, NE2007) rather than silently accepting unknown future variants. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
65 lines
1.6 KiB
TypeScript
65 lines
1.6 KiB
TypeScript
import type { ResourceType } from './dto';
|
|
|
|
export type ProviderName = 'fortnox' | 'visma' | 'briox' | 'bokio' | 'bjornlunden' | 'wint';
|
|
|
|
export interface RateLimitConfig {
|
|
maxRequests: number;
|
|
windowMs: number;
|
|
}
|
|
|
|
export interface OAuthConfig {
|
|
clientId: string;
|
|
clientSecret: string;
|
|
redirectUri: string;
|
|
}
|
|
|
|
export interface TokenResponse {
|
|
access_token: string;
|
|
refresh_token: string;
|
|
token_type: string;
|
|
expires_in: number;
|
|
}
|
|
|
|
export interface ResourceConfig {
|
|
listEndpoint: string;
|
|
detailEndpoint: string;
|
|
idField: string;
|
|
mapper: (raw: Record<string, unknown>) => unknown;
|
|
singleton?: boolean;
|
|
}
|
|
|
|
export interface FortnoxResourceConfig extends ResourceConfig {
|
|
listKey: string;
|
|
detailKey: string;
|
|
supportsLastModified: boolean;
|
|
resolveDetailPath?: (resourceId: string, query?: Record<string, string>) => string;
|
|
supportsEntryHydration?: boolean;
|
|
}
|
|
|
|
export interface VismaResourceConfig extends ResourceConfig {
|
|
supportsModifiedFilter: boolean;
|
|
modifiedField?: string;
|
|
}
|
|
|
|
export interface BrioxResourceConfig extends ResourceConfig {
|
|
listKey: string;
|
|
supportsModifiedFilter: boolean;
|
|
yearScoped?: boolean;
|
|
supportsEntryHydration?: boolean;
|
|
detailKey?: string;
|
|
}
|
|
|
|
export interface BokioResourceConfig extends ResourceConfig {
|
|
paginated?: boolean;
|
|
}
|
|
|
|
export interface BjornLundenResourceConfig extends ResourceConfig {
|
|
paginated?: boolean;
|
|
}
|
|
|
|
export interface WintResourceConfig extends ResourceConfig {
|
|
paginated?: boolean;
|
|
/** Query-param name for incremental fetches (WINT uses `UpdatedAfter` / `LastUpdated`). */
|
|
modifiedParam?: string;
|
|
}
|