import assert from 'node:assert/strict'; import test from 'node:test'; import fs from 'node:fs'; import {operationTreatments,newSalesOperation,evaluateSalesOperation,recordSales,saveSalesBook,salesBook,salesCurrent} from '../../resources/js/lib/iva-operations.ts'; import {createProjectDossierReport} from '../../resources/js/lib/project-dossier-report.ts'; const ids=['financial_stamp','insurance_stamp','public_waste','public_funeral']; function fixture(){const draft={purpose:'simulate_only',currency:'MZN',context_opportunity:'opportunity:310',project_title:'SYNTHETIC QA — G1 serviços isentos',province_id:'cf5e81f1-ffbc-535d-b1b6-b44b445c4421',selection_labels:{province_id:'Manica'}}; let book={currency:'MZN',rows:ids.map((id,i)=>({...newSalesOperation(`g1-${i}`,'2026-01','MZN'),description:`SYNTHETIC QA ${id}`,establishment:'SYNTHETIC QA estabelecimento',amount:'100',basis:'net',treatment:id,confirmed:[0,1],evidence:'SYNTHETIC QA — condições documentadas pressupostas, sem certificação'})),periods:[{period:'2026-01',complete:true}]};book=recordSales(draft,book);draft.modelo_a_snapshot=saveSalesBook(draft,book);return {draft,book};} test('G1 four documented operations use the same conditions and persistence, with independent applicability',()=>{ const {draft,book}=fixture();for(const row of book.rows){const r=evaluateSalesOperation(row,'MZN');assert.equal(r.vat,'0.00');assert.equal(r.field,'07');assert.match(r.article,/9\(/);assert.match(r.source,/Lei22/);assert.equal(evaluateSalesOperation({...row,confirmed:[0]},'MZN').vat,null);assert.equal(evaluateSalesOperation({...row,evidence:''},'MZN').vat,null);} assert.equal(book.result.periods[0].fields['07'],'400.00');const recovered=JSON.parse(JSON.stringify(draft));assert.equal(salesCurrent(recovered,salesBook(recovered)),true);assert.match(JSON.stringify(createProjectDossierReport(recovered,{selectedSections:new Set(['finance'])})),/400\.00/); assert.equal(salesCurrent({...recovered,currency:'USD'},salesBook(recovered)),false); assert.equal(salesCurrent({...recovered,context_opportunity:'opportunity:309'},salesBook(recovered)),false); const rule=operationTreatments.find(t=>t.id==='financial_stamp');const source=rule.source; try{rule.source+=' — changed source';assert.equal(salesCurrent(recovered,salesBook(recovered)),false);}finally{rule.source=source;} }); test('adding independent catalogue rules does not invalidate or recalculate accepted rational snapshots',()=>{ const draft=JSON.parse(fs.readFileSync(new URL('./fixtures/iva-rational.json',import.meta.url),'utf8'));const original=draft.modelo_a_snapshot;assert.equal(salesCurrent(draft,salesBook(draft)),true);assert.equal(draft.modelo_a_snapshot,original);assert.equal(operationTreatments.filter(t=>ids.includes(t.id)).length,4); operationTreatments.push({...operationTreatments[0],id:'synthetic_future_independent'}); try{assert.equal(salesCurrent(draft,salesBook(draft)),true);assert.equal(draft.modelo_a_snapshot,original);}finally{operationTreatments.pop();} }); if(process.env.IVA_G1_OUT)fs.writeFileSync(process.env.IVA_G1_OUT,JSON.stringify(fixture().draft,null,2));