34 lines
6.3 KiB
JavaScript
34 lines
6.3 KiB
JavaScript
import test from 'node:test';import assert from 'node:assert/strict';import fs from 'node:fs';
|
|
import {newObjectiveImport,objectiveImportTreatments,evaluateObjectiveImport,reuseObjectiveImport,recordObjectiveImports,saveObjectiveImportBook,objectiveImportBook,objectiveImportCurrent,objectiveImportReportRows} from '../../resources/js/lib/iva-objective-imports.ts';
|
|
import {annexIEntries} from '../../resources/js/lib/iva-annex-i.ts';
|
|
const frozen=JSON.parse(fs.readFileSync('tests/frontend/fixtures/iva-objective-imports-preserved.json','utf8')),prior=JSON.parse(frozen.modelo_a_snapshot);
|
|
const draft={...frozen,context_opportunity:'opportunity:361',project_title:'SYNTHETIC QA — Importações objectivas / Manica'};
|
|
function row(treatment,id=treatment){const r={...newObjectiveImport(id,'MZN'),description:'SYNTHETIC QA bens '+treatment,period:'2026-10',importer:'SYNTHETIC QA importador',documentRef:'SYNTHETIC QA DU/previsão',documentDate:'2026-10-01',scope:'SYNTHETIC QA bens/operação/período',evidence:'SYNTHETIC QA factos/pressupostos da correspondência',definitive:'yes',goods:'yes',sameGoods:'yes',internalApplicable:'yes'};const rule=objectiveImportTreatments.find(t=>t.id===treatment);r.reference={...r.reference,treatment,confirmed:rule?.conditions.map((_,i)=>i)??[],annexIItem:'annexI-2022-001',annexIOnly:true,pharmaAnnexItem:'annexIII-2022-001'};return r;}
|
|
const rows=objectiveImportTreatments.map(t=>row(t.id));
|
|
for(const r of rows)test('P046 '+r.reference.treatment+' explicit correspondence,without domestic sale or deduction',()=>{const v=evaluateObjectiveImport(r,'MZN');assert.equal(v.status,'exempt');assert.equal(v.importVat,'0.00');assert.equal(v.deduction,null);assert.match(v.source,/12\(1\)a/);assert.match(v.source,/9\(/);});
|
|
test('P046 documentary and factual unknowns remain indeterminate; explicit failed prerequisites remain distinct',()=>{
|
|
for(const patch of [{period:'2025-12'},{period:'2026-13'},{currency:'USD'},{origin:''},{description:''},{importer:''},{documentRef:''},{documentDate:'2026-02-30'},{scope:''},{evidence:''},{definitive:''},{goods:''},{sameGoods:''},{internalApplicable:''}]){const v=evaluateObjectiveImport({...rows[0],...patch},'MZN');assert.equal(v.status,'indeterminate');assert.equal(v.importVat,null);}
|
|
for(const field of ['definitive','goods','sameGoods','internalApplicable']){const v=evaluateObjectiveImport({...rows[0],[field]:'no'},'MZN');assert.equal(v.status,'not_applicable');assert.equal(v.importVat,null);}
|
|
for(const t of ['export_goods','public_health','private_education','production_agriculture','temporary_sugar','unknown'])assert.equal(evaluateObjectiveImport(row(t),'MZN').status,'indeterminate');
|
|
});
|
|
test('P046 does not infer conditions,annex qualifiers or extend another reference to the goods',()=>{
|
|
for(const r of rows)for(const condition of r.reference.confirmed){const v=evaluateObjectiveImport({...r,reference:{...r.reference,confirmed:r.reference.confirmed.filter(n=>n!==condition)}},'MZN');assert.equal(v.status,'indeterminate');assert.equal(v.importVat,null);}
|
|
for(const field of ['annexIItem','pharmaAnnexItem']){const t=field==='annexIItem'?'annexI_goods':'pharma_manufacturing_inputs';assert.equal(evaluateObjectiveImport({...row(t),reference:{...row(t).reference,[field]:'missing'}},'MZN').status,'indeterminate');}
|
|
const overlap=row('annexI_goods');overlap.reference.annexIItem='annexI-2022-013';overlap.reference.annexIOnly=undefined;assert.equal(evaluateObjectiveImport(overlap,'MZN').status,'indeterminate');overlap.reference.annexIOnly=true;assert.equal(evaluateObjectiveImport(overlap,'MZN').status,'exempt');
|
|
const required=row('annexI_goods');required.reference.annexIItem=annexIEntries.find(a=>a.relatedRequired).id;assert.equal(evaluateObjectiveImport(required,'MZN').status,'indeterminate');
|
|
});
|
|
test('P046 reuse fills only missing fields and never copies confirmations or overwrites deliberate edits',()=>{
|
|
const source={...rows[0].reference,id:'source',description:'source description',period:'2026-11',evidence:'source evidence',treatment:'annexI_goods',annexIItem:'annexI-2022-001'};
|
|
const empty=newObjectiveImport('reuse','MZN'),copy=reuseObjectiveImport(empty,source);assert.equal(copy.description,source.description);assert.equal(copy.period,source.period);assert.equal(copy.reference.treatment,'annexI_goods');assert.deepEqual(copy.reference.confirmed,[]);assert.equal(copy.internalApplicable,'');
|
|
const original=structuredClone(rows[0]),edited=reuseObjectiveImport(original,source);assert.equal(edited.description,original.description);assert.equal(edited.evidence,original.evidence);assert.deepEqual(edited.reference,original.reference);assert.equal(edited.reusedFrom,'source');
|
|
});
|
|
let book=recordObjectiveImports(draft,{rows});draft.modelo_a_snapshot=saveObjectiveImportBook(draft,book);
|
|
test('P046 versions,history,project isolation and every accepted book remain intact',()=>{
|
|
assert.equal(objectiveImportCurrent(draft,book),true);const changed={...book,rows:book.rows.map((r,i)=>i? r:{...r,scope:'changed'})};assert.equal(objectiveImportCurrent(draft,changed),false);const next=recordObjectiveImports(draft,changed);assert.equal(next.history.length,1);assert.deepEqual(next.history[0],book.result);assert.notEqual(next.result.sourceKey,book.result.sourceKey);assert.equal(objectiveImportBook({...draft,context_opportunity:'opportunity:999'}).rows.length,0);
|
|
assert.deepEqual(prior,Object.fromEntries(Object.entries(JSON.parse(draft.modelo_a_snapshot)).filter(([key])=>key!=='objectiveImports')));assert.throws(()=>objectiveImportBook({...draft,modelo_a_snapshot:'{"version":1,"books":{},"objectiveImports":[]}'}));
|
|
assert.match(objectiveImportReportRows(draft)[0][3],/versão1/);assert.match(objectiveImportReportRows(draft)[0][3],/sem alteração dos livros internos/);book=recordObjectiveImports(draft,book);draft.modelo_a_snapshot=saveObjectiveImportBook(draft,book);
|
|
});
|
|
test('P046 final fixture keeps digital formalities and travel fiscal limitations visible',()=>{
|
|
const s=JSON.parse(draft.modelo_a_snapshot);assert.equal(s.digitalOperations['opportunity:359'].result.rows[0].procedure,'regulation_pending');for(const p of s.travelOperations['opportunity:360'].result.periods){assert.equal(p.vat,null);assert.equal(p.deduction,null);}assert.equal(book.result.rows.length,28);if(process.env.IVA_OBJECTIVE_IMPORT_FIXTURE)fs.writeFileSync(process.env.IVA_OBJECTIVE_IMPORT_FIXTURE,JSON.stringify(draft));
|
|
});
|