Files
accounted/lib/providers/__tests__/source-voucher.test.ts
T
Jakob Wennberg 521f437072 feat(migration): link migrated invoices to their registration voucher (#1463) (#2024)
Visma and Fortnox migrations now carry each invoice's source voucher reference, and after the invoice steps a core linker resolves it against the SIE-imported ledger (voucher-ref resolver by date, corroborated by the 244x credit / 151x debit amount, posted only, unreferenced only) and writes registration_journal_entry_id / journal_entry_id. Anything ambiguous, mismatched or unresolved is reported and left NULL; journal entries are never written. The arcim-migration /reconcile endpoint can relink already-migrated companies. Payment vouchers are PR B. Refs #1463
2026-08-30 11:52:14 +02:00

57 lines
2.6 KiB
TypeScript

import { describe, it, expect } from 'vitest'
import { parseSourceVoucherRef, sourceVoucherFromParts } from '../source-voucher'
/**
* The parser feeds the registration-voucher link (#1463). A false positive
* here becomes a wrong verifikat link on a migrated invoice, so garbage must
* come out as null, never as a best-effort number.
*/
describe('parseSourceVoucherRef', () => {
it('reads the Visma spelling with the series glued to the number', () => {
expect(parseSourceVoucherRef('A329')).toEqual({ series: 'A', number: 329 })
})
it('accepts a space or hyphen between series and number, and lowercase series', () => {
expect(parseSourceVoucherRef('A 329')).toEqual({ series: 'A', number: 329 })
expect(parseSourceVoucherRef('a-329')).toEqual({ series: 'A', number: 329 })
expect(parseSourceVoucherRef(' B12 ')).toEqual({ series: 'B', number: 12 })
})
it('reads a bare number as series-less', () => {
expect(parseSourceVoucherRef('329')).toEqual({ series: null, number: 329 })
expect(parseSourceVoucherRef(329)).toEqual({ series: null, number: 329 })
})
it('returns null on anything it cannot read with certainty', () => {
expect(parseSourceVoucherRef(undefined)).toBeNull()
expect(parseSourceVoucherRef(null)).toBeNull()
expect(parseSourceVoucherRef('')).toBeNull()
expect(parseSourceVoucherRef(' ')).toBeNull()
expect(parseSourceVoucherRef('A')).toBeNull()
expect(parseSourceVoucherRef('A329B')).toBeNull()
expect(parseSourceVoucherRef('12.5')).toBeNull()
expect(parseSourceVoucherRef('0')).toBeNull()
expect(parseSourceVoucherRef('-5')).toBeNull()
expect(parseSourceVoucherRef('Verifikation A329')).toBeNull()
expect(parseSourceVoucherRef(3.5)).toBeNull()
expect(parseSourceVoucherRef({ VoucherNumber: 'A1' })).toBeNull()
})
})
describe('sourceVoucherFromParts', () => {
it('reads the Fortnox split form', () => {
expect(sourceVoucherFromParts('A', 329)).toEqual({ series: 'A', number: 329 })
expect(sourceVoucherFromParts('a', '329')).toEqual({ series: 'A', number: 329 })
})
it('tolerates a missing series but not a missing or zero number', () => {
expect(sourceVoucherFromParts(undefined, 7)).toEqual({ series: null, number: 7 })
expect(sourceVoucherFromParts('', 7)).toEqual({ series: null, number: 7 })
expect(sourceVoucherFromParts('A', 0)).toBeNull()
expect(sourceVoucherFromParts('A', undefined)).toBeNull()
expect(sourceVoucherFromParts('A', null)).toBeNull()
expect(sourceVoucherFromParts('A', 'x')).toBeNull()
expect(sourceVoucherFromParts('A', 1.5)).toBeNull()
})
})