diff --git a/app/api/import/sie/parse/route.ts b/app/api/import/sie/parse/route.ts index a18961bb..e02e2155 100644 --- a/app/api/import/sie/parse/route.ts +++ b/app/api/import/sie/parse/route.ts @@ -79,7 +79,7 @@ export async function POST(request: Request) { if (periodDuplicate) { return NextResponse.json({ error: 'duplicate_period', - message: `En SIE-import för perioden ${parsed.stats.fiscalYearStart} – ${parsed.stats.fiscalYearEnd} finns redan (importerad ${periodDuplicate.imported_at ? new Date(periodDuplicate.imported_at).toLocaleDateString('sv-SE') : 'okänt datum'})`, + message: `En SIE-import för ett överlappande räkenskapsår (${periodDuplicate.fiscal_year_start} – ${periodDuplicate.fiscal_year_end}) finns redan (importerad ${periodDuplicate.imported_at ? new Date(periodDuplicate.imported_at).toLocaleDateString('sv-SE') : 'okänt datum'})`, importId: periodDuplicate.id, }, { status: 409 }) } diff --git a/lib/import/sie-import.ts b/lib/import/sie-import.ts index db7ac3f4..8d4f1166 100644 --- a/lib/import/sie-import.ts +++ b/lib/import/sie-import.ts @@ -104,7 +104,7 @@ export async function checkDuplicateImport( /** * Check if a completed SIE import already exists for the same fiscal year period. * Prevents importing two different SIE files that cover the same accounting period, - * which would create duplicate verifikationer violating BFNAR 2013:2. + * which would create duplicate verifikationer violating BFL 4:1 (löpande bokföring). * Only blocks on status='completed' — failed/pending imports don't prevent retries. */ export async function checkDuplicatePeriodImport( @@ -113,13 +113,16 @@ export async function checkDuplicatePeriodImport( fiscalYearStart: string, fiscalYearEnd: string ): Promise { + // Range overlap check: start <= other_end AND end >= other_start. + // Two imports whose räkenskapsår overlap would produce duplicate + // verifikationer, violating BFL 4:1 (löpande bokföring). const { data } = await supabase .from('sie_imports') .select('*') .eq('company_id', companyId) - .eq('fiscal_year_start', fiscalYearStart) - .eq('fiscal_year_end', fiscalYearEnd) .eq('status', 'completed') + .lte('fiscal_year_start', fiscalYearEnd) + .gte('fiscal_year_end', fiscalYearStart) .limit(1) .maybeSingle() @@ -1334,7 +1337,7 @@ export async function executeSIEImport( ) if (periodDuplicate) { result.errors.push( - `En SIE-import för perioden ${fiscalYearStart} – ${fiscalYearEnd} finns redan (ID: ${periodDuplicate.id})` + `En SIE-import för ett överlappande räkenskapsår (${periodDuplicate.fiscal_year_start} – ${periodDuplicate.fiscal_year_end}) finns redan` ) return result }