import { readFileSync } from 'node:fs'; import { resolve } from 'node:path'; import { describe, expect, it } from 'vitest'; describe('invoicing generate tab recurring copy wiring', () => { it('documents automatic, manual, and prepayment invoice semantics in service-period-first language', () => { const overviewSource = readFileSync( resolve(__dirname, '../src/components/billing-dashboard/Overview.tsx'), 'utf8', ); const generateTabSource = readFileSync( resolve(__dirname, '../src/components/billing-dashboard/invoicing/GenerateTab.tsx'), 'utf8', ); const automaticSource = readFileSync( resolve(__dirname, '../src/components/billing-dashboard/AutomaticInvoices.tsx'), 'utf8', ); const manualSource = readFileSync( resolve(__dirname, '../src/components/billing-dashboard/ManualInvoices.tsx'), 'utf8', ); const prepaymentSource = readFileSync( resolve(__dirname, '../src/components/billing-dashboard/PrepaymentInvoices.tsx'), 'utf8', ); expect(overviewSource).toContain( 'Generate invoice windows for recurring service periods and create manual or prepayment documents when financial handling differs from recurring coverage' ); expect(generateTabSource).toContain( 'Use invoice windows to review due recurring service periods before generating a recurring batch.' ); expect(generateTabSource).toContain( 'Use manual invoices for one-off or adjustment lines. They do not redefine recurring service periods.' ); expect(generateTabSource).toContain( 'Use prepayment and credit flows for financial value that should stay separate from recurring service-period coverage.' ); expect(automaticSource).toContain( 'Each parent row groups due obligations by client and invoice window. Child obligations remain the atomic execution units.' ); expect(manualSource).toContain( 'Use manual invoices for one-off or adjustment lines. They coexist with recurring invoices without redefining recurring service periods.' ); expect(manualSource).toContain( 'Manual edits stay periodless by default, while recurring detail-backed lines keep their canonical service periods.' ); expect(manualSource).toContain( 'Mark this only when the manual invoice should create credit for future financial application instead of representing recurring service-period coverage.' ); expect(prepaymentSource).toContain( 'Prepayment invoices create client credit for future value. They do not create recurring service periods; later recurring invoices keep their own service-period coverage.' ); expect(prepaymentSource).toContain( 'Credit memos adjust financial balances without redefining recurring service-period coverage on the source invoice.' ); }); });