Fixing bug

This commit is contained in:
Emil
2026-02-21 17:14:08 +01:00
parent 43172751e9
commit fa5e14de83
20 changed files with 309 additions and 39 deletions
@@ -12,6 +12,10 @@ vi.mock('@/lib/supabase/server', () => ({
createClient: () => Promise.resolve(mockSupabase),
}))
vi.mock('@/lib/init', () => ({
ensureInitialized: vi.fn(),
}))
const mockCreateJournalEntry = vi.fn()
vi.mock('@/lib/bookkeeping/engine', () => ({
createJournalEntry: (...args: unknown[]) => mockCreateJournalEntry(...args),
@@ -1,8 +1,11 @@
import { createClient } from '@/lib/supabase/server'
import { NextResponse } from 'next/server'
import { createJournalEntry } from '@/lib/bookkeeping/engine'
import { ensureInitialized } from '@/lib/init'
import type { CreateJournalEntryInput } from '@/types'
ensureInitialized()
export async function GET(request: Request) {
const supabase = await createClient()
const { data: { user } } = await supabase.auth.getUser()
@@ -1,6 +1,9 @@
import { createClient } from '@/lib/supabase/server'
import { NextResponse } from 'next/server'
import { getSettings, saveSettings } from '@/extensions/general/ai-categorization'
import { ensureInitialized } from '@/lib/init'
ensureInitialized()
/**
* GET /api/extensions/ai-categorization/settings
@@ -1,8 +1,11 @@
import { createClient } from '@/lib/supabase/server'
import { NextResponse } from 'next/server'
import { categorizeTransactions } from '@/extensions/general/ai-categorization'
import { ensureInitialized } from '@/lib/init'
import type { CategorizationSuggestion } from '@/extensions/general/ai-categorization/categorizer'
ensureInitialized()
/**
* GET /api/extensions/ai-categorization/suggestions?transaction_ids=id1,id2,...
* Fetch pre-computed AI suggestions for given transaction IDs
@@ -2,8 +2,11 @@ import { createClient } from '@supabase/supabase-js'
import { NextResponse } from 'next/server'
import { syncAccountTransactions } from '@/extensions/general/enable-banking/lib/sync'
import { isConsentExpiringSoon, getDaysUntilExpiry } from '@/extensions/general/enable-banking/lib/api-client'
import { ensureInitialized } from '@/lib/init'
import type { StoredAccount } from '@/extensions/general/enable-banking/types'
ensureInitialized()
/**
* GET /api/extensions/enable-banking/sync/cron
* Automatic daily bank transaction sync
@@ -143,6 +143,8 @@ export async function POST(request: Request) {
vat_amount: item.vatRate && item.lineTotal ? (item.lineTotal * item.vatRate) / (100 + item.vatRate) : null,
extraction_confidence: item.confidence,
suggested_category: item.suggestedCategory,
category: item.category,
bas_account: item.basAccount,
sort_order: index,
}))
@@ -128,7 +128,7 @@ describe('POST /api/transactions/[id]/categorize', () => {
// Fetch company settings
enqueue({ data: { entity_type: 'enskild_firma', fiscal_year_start_month: 1 }, error: null })
// ensureFiscalPeriod: check existing
enqueue({ data: { id: 'period-1' }, error: null })
enqueue({ data: [{ id: 'period-1' }], error: null })
mockCreateTransactionJournalEntry.mockResolvedValue({ id: 'je-1' })
mockSaveUserMappingRule.mockResolvedValue(undefined)
@@ -177,7 +177,7 @@ describe('POST /api/transactions/[id]/categorize', () => {
enqueue({ data: tx, error: null })
enqueue({ data: { entity_type: 'enskild_firma', fiscal_year_start_month: 1 }, error: null })
enqueue({ data: { id: 'period-1' }, error: null })
enqueue({ data: [{ id: 'period-1' }], error: null })
mockCreateTransactionJournalEntry.mockRejectedValue(new Error('Period locked'))
@@ -210,7 +210,7 @@ describe('POST /api/transactions/[id]/categorize', () => {
enqueue({ data: tx, error: null })
enqueue({ data: { entity_type: 'enskild_firma', fiscal_year_start_month: 1 }, error: null })
enqueue({ data: { id: 'period-1' }, error: null })
enqueue({ data: [{ id: 'period-1' }], error: null })
mockCreateTransactionJournalEntry.mockResolvedValue({ id: 'je-1' })
@@ -237,7 +237,7 @@ describe('POST /api/transactions/[id]/categorize', () => {
enqueue({ data: tx, error: null })
enqueue({ data: { entity_type: 'enskild_firma', fiscal_year_start_month: 1 }, error: null })
enqueue({ data: { id: 'period-1' }, error: null })
enqueue({ data: [{ id: 'period-1' }], error: null })
mockCreateTransactionJournalEntry.mockResolvedValue({ id: 'je-1' })
@@ -14,14 +14,11 @@ vi.mock('@/lib/supabase/server', () => ({
createClient: () => Promise.resolve(mockSupabase),
}))
const mockCreateJournalEntry = vi.fn()
const mockFindFiscalPeriod = vi.fn()
vi.mock('@/lib/bookkeeping/engine', () => ({
createJournalEntry: (...args: unknown[]) => mockCreateJournalEntry(...args),
findFiscalPeriod: (...args: unknown[]) => mockFindFiscalPeriod(...args),
}))
const mockCreateInvoicePaymentJournalEntry = vi.fn()
const mockCreateInvoiceCashEntry = vi.fn()
vi.mock('@/lib/bookkeeping/invoice-entries', () => ({
createInvoicePaymentJournalEntry: (...args: unknown[]) => mockCreateInvoicePaymentJournalEntry(...args),
createInvoiceCashEntry: (...args: unknown[]) => mockCreateInvoiceCashEntry(...args),
getRevenueAccount: vi.fn().mockReturnValue('3001'),
getOutputVatAccount: vi.fn().mockReturnValue('2611'),
}))
@@ -35,7 +32,6 @@ describe('POST /api/transactions/[id]/match-invoice', () => {
vi.clearAllMocks()
reset()
mockSupabase.auth.getUser.mockResolvedValue({ data: { user: mockUser } })
mockFindFiscalPeriod.mockResolvedValue('period-1')
})
it('returns 401 when not authenticated', async () => {
@@ -161,7 +157,7 @@ describe('POST /api/transactions/[id]/match-invoice', () => {
// Fetch company settings
enqueue({ data: { accounting_method: 'accrual', entity_type: 'enskild_firma' }, error: null })
mockCreateJournalEntry.mockResolvedValue({ id: 'je-1' })
mockCreateInvoicePaymentJournalEntry.mockResolvedValue({ id: 'je-1' })
// Update invoice to paid
enqueue({ data: null, error: null })
@@ -186,16 +182,11 @@ describe('POST /api/transactions/[id]/match-invoice', () => {
expect(body.paid_amount).toBe(12500)
expect(body.journal_entry_id).toBe('je-1')
// Verify accrual journal entry: debit 1930, credit 1510
expect(mockCreateJournalEntry).toHaveBeenCalledWith(
// Verify accrual payment entry was called
expect(mockCreateInvoicePaymentJournalEntry).toHaveBeenCalledWith(
'user-1',
expect.objectContaining({
source_type: 'invoice_paid',
lines: expect.arrayContaining([
expect.objectContaining({ account_number: '1930', debit_amount: 12500 }),
expect.objectContaining({ account_number: '1510', credit_amount: 12500 }),
]),
})
expect.objectContaining({ id: 'inv-1' }),
'2024-06-15'
)
})
@@ -207,7 +198,7 @@ describe('POST /api/transactions/[id]/match-invoice', () => {
enqueue({ data: invoice, error: null })
enqueue({ data: { accounting_method: 'accrual', entity_type: 'enskild_firma' }, error: null })
mockCreateJournalEntry.mockRejectedValue(new Error('Period locked'))
mockCreateInvoicePaymentJournalEntry.mockRejectedValue(new Error('Period locked'))
// Update invoice
enqueue({ data: null, error: null })