Files
Investidor-V2/tests/frontend/iva-import-exemptions.test.mjs
T

57 lines
5.7 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import fs from 'node:fs';
import { newImportExemption,evaluateImportExemption,recordImportExemptions,saveImportExemptionBook,importExemptionBook,importExemptionCurrent,importExemptionReportRows } from '../../resources/js/lib/iva-import-exemptions.ts';
import { salesCurrent } from '../../resources/js/lib/iva-operations.ts';
import { acquisitionCurrent } from '../../resources/js/lib/iva-acquisitions.ts';
import { createProjectDossierReport } from '../../resources/js/lib/project-dossier-report.ts';
const frozen=JSON.parse(fs.readFileSync(new URL('./fixtures/iva-g5b-inputs.json',import.meta.url),'utf8'));
const row=(treatment='reimport_same_state')=>({...newImportExemption('g6a-'+treatment,'MZN'),treatment,description:treatment==='reimport_same_state'?'SYNTHETIC QA equipamento reimportado':'SYNTHETIC QA ouro importado',period:'2026-12',declaredValue:'1000',importer:treatment==='reimport_same_state'?'SYNTHETIC QA exportador original':'SYNTHETIC QA Banco de Moçambique',documentRef:'SYNTHETIC QA G6A '+treatment,documentDate:'2026-12-11',evidence:'SYNTHETIC QA pressupostos expressos; não é documento real',conditions:{sameExporter:'yes',sameState:'yes',customsExempt:'yes',gold:'yes',centralBank:'yes'}});
const draft=()=>({...structuredClone(frozen),context_opportunity:'opportunity:330',project_title:'SYNTHETIC QA — G6A / Importações'});
test('P049 requires all three own conditions;unknown differs from failed and neither produces normal tax or exempt zero',()=>{
const input=row();assert.equal(evaluateImportExemption(input,'MZN').importVat,'0.00');
for(const key of ['sameExporter','sameState','customsExempt'])for(const value of ['','no','unknown']){
const result=evaluateImportExemption({...input,conditions:{...input.conditions,[key]:value}},'MZN');assert.equal(result.status,value==='no'?'not_applicable':'indeterminate');assert.equal(result.importVat,null);
}
for(const patch of [{period:'2025-12'},{currency:'USD'},{documentDate:'2026-02-30'},{documentRef:''},{evidence:''},{declaredValue:'-1'},{origin:'unknown'},{treatment:'unknown'}])assert.equal(evaluateImportExemption({...input,...patch},'MZN').importVat,null);
assert.equal(evaluateImportExemption({...input,documentDate:'2026-11-11',declaredValue:''},'MZN').importVat,'0.00');
assert.deepEqual(input,row());assert.equal(evaluateImportExemption(input,'USD').importVat,null);
});
test('P051 uses gold and actual central-bank importer;does not import reimport conditions or unworked-form restriction from domestic sales',()=>{
const input={...row('central_bank_gold'),description:'SYNTHETIC QA ouro trabalhado; classificação de importação',conditions:{gold:'yes',centralBank:'yes'}};
assert.equal(evaluateImportExemption(input,'MZN').status,'exempt');
for(const key of ['gold','centralBank']){
assert.equal(evaluateImportExemption({...input,conditions:{...input.conditions,[key]:''}},'MZN').status,'indeterminate');
assert.equal(evaluateImportExemption({...input,conditions:{...input.conditions,[key]:'no'}},'MZN').status,'not_applicable');
}
assert.equal(evaluateImportExemption({...input,conditions:{...input.conditions,customsExempt:'no'}},'MZN').importVat,'0.00');
});
test('explicit classification archives prior inputs/results;editing currency,opportunity,location or conditions marks result historical',()=>{
const d=draft();let book=recordImportExemptions(d,{rows:[{...row(),conditions:{sameExporter:'yes',sameState:'yes'}}]});assert.equal(book.result.rows[0].importVat,null);
const original=structuredClone(book);book=recordImportExemptions(d,{...book,rows:[row()]});assert.deepEqual(book.history,[original.result]);assert.ok(importExemptionCurrent(d,book));
for(const patch of [{currency:'USD'},{context_opportunity:'opportunity:331'},{selection_labels:{province_id:'Maputo'}}])assert.ok(!importExemptionCurrent({...d,...patch},book));
assert.ok(!importExemptionCurrent(d,{...book,rows:[{...row(),conditions:{...row().conditions,sameState:'no'}}]}));
assert.throws(()=>recordImportExemptions(d,{rows:[row(),row()]}),/distintos/);
});
test('save/recovery/report preserve20sales and acceptedP086 purchase;classifying import leaves all ModeloA fields untouched',()=>{
const d=draft(),prior=JSON.parse(d.modelo_a_snapshot);
let book=recordImportExemptions(d,{rows:[row(),row('central_bank_gold')]});
d.modelo_a_snapshot=saveImportExemptionBook(d,book);assert.deepEqual(importExemptionBook(JSON.parse(JSON.stringify(d))),book);
const next=JSON.parse(d.modelo_a_snapshot);assert.deepEqual(next.salesOperations,prior.salesOperations);assert.deepEqual(next.books,prior.books);
for(const [scope,sales] of Object.entries(next.salesOperations))assert.ok(salesCurrent({...d,context_opportunity:scope},sales));
assert.ok(acquisitionCurrent({...d,context_opportunity:'opportunity:329'},next.books['opportunity:329']));
const report=JSON.stringify(createProjectDossierReport(d,{selectedSections:new Set(['finance']),version:'QA G6A'}));
for(const token of ['P049','P051','2026-12','opportunity:330','Manica','SYNTHETIC QA G6A','0.00','12(1)(d/f)','campo11','sem fixar base aduaneira'])assert.ok(report.includes(token),token);
assert.equal(importExemptionReportRows({...d,context_opportunity:'opportunity:331'}).length,0);
if(process.env.IVA_G6A_CALCULATED)fs.writeFileSync(process.env.IVA_G6A_CALCULATED,JSON.stringify(d));
});
test('old snapshots need no import book;corrupt import data cannot erase originals',()=>{
assert.deepEqual(importExemptionBook(draft()),{rows:[]});
const d=draft(),data=JSON.parse(d.modelo_a_snapshot);data.importExemptions=[];d.modelo_a_snapshot=JSON.stringify(data);const original=d.modelo_a_snapshot;assert.throws(()=>importExemptionBook(d),/preservados/);assert.equal(d.modelo_a_snapshot,original);
});