Files
Investidor-V2/tests/frontend/iva-modelo-a.test.mjs
T

38 lines
3.5 KiB
JavaScript

import assert from 'node:assert/strict';
import test from 'node:test';
import { monthlyProjectedPurchaseOrders, serializeBusinessPlanSnapshot } from '../../resources/js/lib/business-financial-plan.ts';
import { modeloAComponentRows, modeloAPurchaseReferences } from '../../resources/js/lib/iva-modelo-a.ts';
import { createProjectDossierReport } from '../../resources/js/lib/project-dossier-report.ts';
test('purchase references use active existing purchase schedules, not cost of sales or cash payments', () => {
const plan={periods:3,products:[{label:'A',monthlyUnits:'8',unitPrice:'30',unitVariableCost:'12',productInventoryPurchasesByPeriod:[{amount:'100',leadMonths:2},{amount:'0',leadMonths:0},{amount:'',leadMonths:1}]}],useProductInventorySchedule:true,monthlyInventoryPurchases:'900',monthlyVariableCostPayments:'700',useInventoryPurchaseSchedule:true,inventoryPurchaseSchedule:[{amount:'400',leadMonths:0},{amount:'500',leadMonths:0},{amount:'600',leadMonths:0}]};
assert.deepEqual(monthlyProjectedPurchaseOrders(plan),['100.00','0.00',null]);
plan.useProductInventorySchedule=false;
assert.deepEqual(monthlyProjectedPurchaseOrders(plan),['400.00','500.00','600.00']);
plan.useInventoryPurchaseSchedule=false;
assert.deepEqual(monthlyProjectedPurchaseOrders(plan),['900.00','900.00','900.00']);
});
test('missing and zero purchase amounts are preserved without manufacturing net VAT or deduction', () => {
const plan={currency:'MZN',periods:2,depreciationLifeMonths:60,products:[{label:'A',monthlyUnits:'1',unitPrice:'10',unitVariableCost:'0'}],useInventoryPurchaseSchedule:true,inventoryPurchaseSchedule:[{amount:'0',leadMonths:0},{amount:'',leadMonths:0}]};
for(const key of ['openingCash','monthlyCollections','monthlyVariableCostPayments','monthlyOperatingExpenses','monthlyOperatingPayments','monthlyPayrollExpense','monthlyPayrollPayments','assetInvestment','inventory','receivables','payables','equity','shareholderLoans','bankLoanProceeds','grants','assetDepreciation','monthlyInterestExpense','monthlyInterestPayment','monthlyPrincipalRepayment']) plan[key]='0';
const rows=modeloAPurchaseReferences({business_plan_snapshot:serializeBusinessPlanSnapshot(plan)});
assert.equal(rows[0].declared,'0.00');assert.equal(rows[1].declared,null);
for(const row of rows) for(const field of ['net','vat','gross','deductible']) assert.equal(row[field],null);
assert.deepEqual(modeloAPurchaseReferences({}),[]);
assert.throws(()=>modeloAPurchaseReferences({business_plan_snapshot:'broken'}),/preservado/);
const report = createProjectDossierReport({currency:'MZN',business_plan_snapshot:serializeBusinessPlanSnapshot(plan),monthly_iva_snapshot:'{}'},{selectedSections:new Set(['finance'])});
const text=JSON.stringify(report);
assert.match(text,/Compras\/encomendas/);assert.match(text,/0\.00/);
assert.match(text,/base\/IVA incluído por classificar/);assert.match(text,/IVA suportado e dedutível indeterminados/);
});
test('Modelo A report adds partial coverage without recalculating or rewriting accepted server history', () => {
const snapshot={monthly_projection:{rows:[{date:'2026-01-01',net_sales:'1000.03',vat:'160.0048'}]},result:{value:'160.0048'}};
const before=JSON.stringify(snapshot);const rows=modeloAComponentRows(snapshot);
assert.equal(JSON.stringify(snapshot),before);
assert.match(rows.map(row=>row.join(' ')).join('\n'),/Indeterminado/);
assert.match(rows.map(row=>row.join(' ')).join('\n'),/não é imposto final/);
assert.deepEqual(modeloAComponentRows({scenario_kind:'custom_planning'}),[]);
});