An invoice's begäran state (Att begära, Skapad, Uppladdad, Beviljad, Delvis beviljad, Avslagen) was only visible one invoice at a time or inside the payout dialog. The list now embeds the begäran behind each invoice, shows the state in a ROT/RUT column and filters on it through a third ContextPicker (?rotrut=), both gated on rot_rut_enabled or an invoiced deduction. One predicate (lib/invoices/rot-rut-list-status.ts) feeds the column, the filter and its counts. Normal states read as muted text; only a partial approval and an avslag get a chip. Closes #2426 Claude-Session: https://claude.ai/code/session_0179bdetHyofL6ATfQxB5wP5 Co-authored-by: Jakob Wennberg <311770904+jakobwennberg-oss@users.noreply.github.com> Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
25 lines
915 B
TypeScript
25 lines
915 B
TypeScript
import fs from 'node:fs'
|
|
import path from 'node:path'
|
|
import { describe, expect, it } from 'vitest'
|
|
|
|
const source = fs.readFileSync(
|
|
path.resolve(__dirname, '../../../app/(dashboard)/invoices/page.tsx'),
|
|
'utf8',
|
|
)
|
|
|
|
describe('invoice list query shape', () => {
|
|
it('paginates beyond the PostgREST row cap with a stable total order', () => {
|
|
expect(source).toContain('fetchAllRows<Invoice>')
|
|
expect(source).toContain(".order('invoice_date', { ascending: false })")
|
|
expect(source).toContain(".order('id', { ascending: false })")
|
|
expect(source).toContain('.range(from, to)')
|
|
expect(source).toContain('dedupeBy: (invoice) => invoice.id')
|
|
})
|
|
|
|
it('embeds the begäran behind each invoice for the ROT/RUT column and filter (#2426)', () => {
|
|
expect(source).toContain(
|
|
'rot_rut_items:rot_rut_payout_request_items(request:rot_rut_payout_requests(id, status, created_at))',
|
|
)
|
|
})
|
|
})
|