New Base func

This commit is contained in:
Jakob Wennberg
2026-02-19 09:48:02 +01:00
parent afc9f69def
commit cdf1dcc4c8
73 changed files with 11036 additions and 51 deletions
+28 -1
View File
@@ -1,6 +1,10 @@
import { createClient } from '@/lib/supabase/server'
import { NextResponse } from 'next/server'
import type { ConfirmReceiptInput } from '@/types'
import { eventBus } from '@/lib/events/bus'
import { ensureInitialized } from '@/lib/init'
import type { ConfirmReceiptInput, Receipt, ReceiptLineItem } from '@/types'
ensureInitialized()
/**
* POST /api/receipts/[id]/confirm
@@ -104,5 +108,28 @@ export async function POST(
return NextResponse.json({ error: 'Failed to update receipt' }, { status: 500 })
}
// Calculate business/private totals from line items
const lineItems = ((updatedReceipt as unknown as Receipt).line_items || []) as ReceiptLineItem[]
let businessTotal = 0
let privateTotal = 0
for (const item of lineItems) {
if (item.is_business === true) {
businessTotal += item.line_total
} else if (item.is_business === false) {
privateTotal += item.line_total
}
}
// Emit receipt.confirmed event
await eventBus.emit({
type: 'receipt.confirmed',
payload: {
receipt: updatedReceipt as unknown as Receipt,
businessTotal: Math.round(businessTotal * 100) / 100,
privateTotal: Math.round(privateTotal * 100) / 100,
userId: user.id,
},
})
return NextResponse.json({ data: updatedReceipt })
}
+18 -2
View File
@@ -1,8 +1,12 @@
import { createClient } from '@/lib/supabase/server'
import { NextResponse } from 'next/server'
import { findTransactionMatches } from '@/lib/receipts/receipt-matcher'
import { eventBus } from '@/lib/events/bus'
import { ensureInitialized } from '@/lib/init'
import type { Receipt, Transaction } from '@/types'
ensureInitialized()
/**
* POST /api/receipts/[id]/match
* Find potential transaction matches for a receipt
@@ -100,7 +104,7 @@ export async function PATCH(
// Verify receipt ownership
const { data: receipt, error: receiptError } = await supabase
.from('receipts')
.select('id')
.select('*, line_items:receipt_line_items(*)')
.eq('id', id)
.eq('user_id', user.id)
.single()
@@ -112,7 +116,7 @@ export async function PATCH(
// Verify transaction ownership
const { data: transaction, error: txError } = await supabase
.from('transactions')
.select('id')
.select('*')
.eq('id', transaction_id)
.eq('user_id', user.id)
.single()
@@ -145,6 +149,18 @@ export async function PATCH(
console.error('Transaction update error:', updateTxError)
}
// Emit receipt.matched event
await eventBus.emit({
type: 'receipt.matched',
payload: {
receipt: receipt as unknown as Receipt,
transaction: transaction as Transaction,
confidence: match_confidence || 0,
autoMatched: false,
userId: user.id,
},
})
return NextResponse.json({
data: {
receipt_id: id,
+15
View File
@@ -2,6 +2,10 @@ import { createClient } from '@/lib/supabase/server'
import { NextResponse } from 'next/server'
import { analyzeReceipt } from '@/lib/receipts/receipt-analyzer'
import { processLineItems } from '@/lib/receipts/receipt-categorizer'
import { eventBus } from '@/lib/events/bus'
import { ensureInitialized } from '@/lib/init'
ensureInitialized()
/**
* POST /api/receipts/upload
@@ -157,6 +161,17 @@ export async function POST(request: Request) {
})
}
// Emit receipt.extracted event
await eventBus.emit({
type: 'receipt.extracted',
payload: {
receipt: completeReceipt,
documentId: null,
confidence: extraction.confidence,
userId: user.id,
},
})
return NextResponse.json({ data: completeReceipt })
} catch (analysisError) {
console.error('Receipt analysis error:', analysisError)