Preserve documented turnover corrections in PEC viability estimates
tests / ci (push) Canceled after 0s
tests / ci (push) Canceled after 0s
This commit is contained in:
@@ -0,0 +1,132 @@
|
||||
import { newPecCorrection } from '../resources/js/lib/irpc-pec-correction.ts';
|
||||
import {
|
||||
calculatePecPlan,
|
||||
newPecPlan,
|
||||
} from '../resources/js/lib/irpc-pec-plan.ts';
|
||||
import fs from 'node:fs';
|
||||
import assert from 'node:assert/strict';
|
||||
import { combinedCase } from '../tests/frontend/helpers/irpc-investment-combination-case.mjs';
|
||||
import { plan } from '../tests/frontend/helpers/irpc-pec-obligation-case.mjs';
|
||||
import { calculatePecObligation } from '../resources/js/lib/irpc-pec-obligation.ts';
|
||||
import {
|
||||
recordAnnual,
|
||||
saveAnnualBook,
|
||||
annualBook,
|
||||
annualCurrent,
|
||||
annualHtml,
|
||||
} from '../resources/js/lib/irpc-annual-settlement.ts';
|
||||
import { createProjectDossierReport } from '../resources/js/lib/project-dossier-report.ts';
|
||||
const out = new URL(
|
||||
'../outputs/irpc-pec-correction-20261111/',
|
||||
import.meta.url,
|
||||
);
|
||||
fs.mkdirSync(out, { recursive: true });
|
||||
const allocation = {
|
||||
...newPecPlan(),
|
||||
mode: 'three',
|
||||
reference: 'SYNTHETIC cash-flow hypothesis for viability',
|
||||
june: '10000',
|
||||
august: '15000',
|
||||
october: '15000',
|
||||
};
|
||||
const correction = {
|
||||
...newPecCorrection('10000000', '123456789'),
|
||||
apply: 'yes',
|
||||
revisedTurnover: '50000000',
|
||||
reference: 'SYNTHETIC corrected sales2025 reviewed2026',
|
||||
};
|
||||
const scenarios = {
|
||||
higher: { correction },
|
||||
lower: { correction: { ...correction, revisedTurnover: '1000000' } },
|
||||
retained: { correction: { ...correction, apply: 'no' } },
|
||||
changed_base: { correction: { ...correction, originalTurnover: '1' } },
|
||||
zero: { correction: { ...correction, revisedTurnover: '0' } },
|
||||
};
|
||||
for (const [name, changes] of Object.entries(scenarios)) {
|
||||
if (process.argv[2] === 'generate') {
|
||||
const { d, b } = combinedCase();
|
||||
const prior = recordAnnual(d, b, '2026-11-11T10:00:00Z');
|
||||
prior.pecObligation = {
|
||||
...plan(),
|
||||
subjectNuit: b.subjectNuit,
|
||||
year: b.year,
|
||||
...changes,
|
||||
correction: { ...changes.correction, subjectNuit: b.subjectNuit },
|
||||
plan: allocation,
|
||||
};
|
||||
const next = recordAnnual(d, prior, '2026-11-11T10:01:00Z');
|
||||
d.modelo_a_snapshot = saveAnnualBook(d, next);
|
||||
fs.writeFileSync(new URL(name + '.json', out), JSON.stringify(d));
|
||||
} else {
|
||||
const d = JSON.parse(
|
||||
fs.readFileSync(
|
||||
new URL('recovered-' + name + '.json', out),
|
||||
'utf8',
|
||||
),
|
||||
),
|
||||
b = annualBook(d),
|
||||
m = calculatePecObligation(
|
||||
b.pecObligation,
|
||||
b.subjectNuit,
|
||||
b.year,
|
||||
b.assessment,
|
||||
);
|
||||
assert.equal(annualCurrent(d, b), true);
|
||||
assert.equal(b.history.length, 1);
|
||||
assert.deepEqual(b.result.model.arithmeticBalance, {
|
||||
numerator: '138',
|
||||
denominator: '1',
|
||||
});
|
||||
const html = annualHtml(d),
|
||||
report = createProjectDossierReport(d, {
|
||||
selectedSections: new Set(['finance']),
|
||||
generatedAt: '2026-11-11T10:02:00Z',
|
||||
});
|
||||
assert.match(html, /PEC — estimativa fiscal/);
|
||||
assert.match(JSON.stringify(report), /PEC — estimativa fiscal/);
|
||||
assert.equal(m.paymentExecuted, false);
|
||||
assert.equal(m.annualDeductionCreated, false);
|
||||
const allocationModel = calculatePecPlan(
|
||||
b.pecObligation.plan,
|
||||
m.total,
|
||||
m.notApplicable,
|
||||
b.year,
|
||||
);
|
||||
const expected = {
|
||||
higher: '90000',
|
||||
lower: '20000',
|
||||
retained: '40000',
|
||||
changed_base: null,
|
||||
zero: null,
|
||||
}[name];
|
||||
assert.equal(m.total?.numerator ?? null, expected);
|
||||
assert.equal(allocationModel.allocationReconciled, name === 'retained');
|
||||
assert.equal(allocationModel.annualDeductionCreated, false);
|
||||
assert.match(html, /PEC — rectificação do volume/);
|
||||
assert.match(JSON.stringify(report), /PEC — rectificação do volume/);
|
||||
fs.writeFileSync(new URL(name + '-report.html', out), html);
|
||||
fs.writeFileSync(
|
||||
new URL(name + '-verification.json', out),
|
||||
JSON.stringify(
|
||||
{
|
||||
synthetic: true,
|
||||
apiRecovered: true,
|
||||
current: true,
|
||||
historyPreserved: true,
|
||||
annualBalanceUnchanged: true,
|
||||
report: true,
|
||||
visualReview: false,
|
||||
model: m,
|
||||
allocationModel,
|
||||
},
|
||||
null,
|
||||
2,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
console.log(
|
||||
process.argv[2] === 'generate'
|
||||
? 'Five synthetic PEC correction scenarios prepared.'
|
||||
: 'Five native recovered PEC correction scenarios recalculated and reported without creating deductions.',
|
||||
);
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
$root = dirname(__DIR__);
|
||||
if (($argv[1] ?? '') !== 'test' || basename($root) !== 'portal-investidor') {
|
||||
throw new RuntimeException('Explicit local test operation required.');
|
||||
}
|
||||
foreach (['APP_ENV' => 'testing', 'APP_KEY' => 'base64:'.base64_encode(str_repeat('Q', 32)),
|
||||
'APP_CONFIG_CACHE' => $root.'/outputs/irpc-pec-correction-20261111/no-config.php',
|
||||
'DB_CONNECTION' => 'pgsql', 'DB_HOST' => '127.0.0.1', 'DB_PORT' => '55441',
|
||||
'DB_DATABASE' => 'proactive_investment_20261027_test', 'DB_USERNAME' => 'investmoz_test', 'DB_PASSWORD' => '',
|
||||
'DB_URL' => '', 'DATABASE_URL' => '', 'CACHE_STORE' => 'array', 'SESSION_DRIVER' => 'array',
|
||||
'QUEUE_CONNECTION' => 'sync', 'MAIL_MAILER' => 'array', 'SUITECRM_ENABLED' => 'false'] as $key => $value) {
|
||||
putenv($key.'='.$value);
|
||||
$_ENV[$key] = $_SERVER[$key] = $value;
|
||||
}
|
||||
$pdo = new PDO('pgsql:host=127.0.0.1;port=55441;dbname=proactive_investment_20261027_test', 'investmoz_test', '');
|
||||
$identity = $pdo->query('select current_database() as name,inet_server_port() as port')->fetch(PDO::FETCH_ASSOC);
|
||||
if ($identity['name'] !== 'proactive_investment_20261027_test' || (int) $identity['port'] !== 55441) {
|
||||
throw new RuntimeException('Isolated QA identity required.');
|
||||
}
|
||||
$argv = ['phpunit', '-c', 'phpunit.investmoz.xml', '--do-not-cache-result', 'tests/Feature/IrpcPecCorrectionDraftTest.php'];
|
||||
$argc = count($argv);
|
||||
$_SERVER['argv'] = $argv;
|
||||
$_SERVER['argc'] = $argc;
|
||||
require $root.'/vendor/autoload.php';
|
||||
require $root.'/vendor/phpunit/phpunit/phpunit';
|
||||
Reference in New Issue
Block a user