import { describe, it, expect } from 'vitest' import { openDb } from '../src/db' import { seedIfEmpty } from '../src/seed' import { createClient } from '../src/repos-clients' import { recordPayment } from '../src/repos-payments' import { createAmc, listAmc, generateAmcRenewalInvoice, amcPaidStatus, getAmc, } from '../src/repos-amc' function setup() { const db = openDb(':memory:'); seedIfEmpty(db) // seeds company.state_code, GST18, AMC module const c = createClient(db, 'u1', { name: 'Acme', stateCode: '32' }) return { db, c } } describe('amc contracts', () => { it('creates, generates a renewal invoice, and derives paid from settlement', () => { const { db, c } = setup() const amc = createAmc(db, 'u1', { clientId: c.id, coverage: 'On-site support', periodFrom: '2026-04-01', periodTo: '2027-03-31', amountPaise: 20_000_00, }) expect(listAmc(db, c.id)).toHaveLength(1) expect(amcPaidStatus(db, getAmc(db, amc.id)!)).toBe('unbilled') const inv = generateAmcRenewalInvoice(db, 'u1', amc.id) expect(inv.docType).toBe('INVOICE') expect(inv.payablePaise).toBe(23_600_00) // 20,000 + 18% GST intra-state expect(amcPaidStatus(db, getAmc(db, amc.id)!)).toBe('unpaid') recordPayment(db, 'u1', { clientId: c.id, receivedOn: '2026-07-10', mode: 'bank', amountPaise: 23_600_00 }) expect(amcPaidStatus(db, getAmc(db, amc.id)!)).toBe('paid') }) it('honours the legacy_paid flag for imported contracts without an invoice', () => { const { db, c } = setup() const amc = createAmc(db, 'u1', { clientId: c.id, periodFrom: '2025-04-01', periodTo: '2026-03-31', amountPaise: 10_000_00, legacyPaid: true, }) expect(amcPaidStatus(db, getAmc(db, amc.id)!)).toBe('paid') }) })