Files
compras/scripts/pilot-access-activation-http.mjs
2026-11-02 20:27:11 +02:00

87 lines
5.3 KiB
JavaScript

import fs from 'node:fs/promises';
import assert from 'node:assert/strict';
const proposal = JSON.parse(await fs.readFile('docs/proofs/pilot-access-proposal.json', 'utf8'));
const applied = JSON.parse(await fs.readFile('docs/proofs/pilot-access-activation.json', 'utf8'));
assert.equal(applied.result, 'applied');
const source = await fs.readFile('scripts/supplier-evaluation-check.mjs', 'utf8');
const common = source.slice(source.indexOf('const base ='), source.indexOf('const author ='));
await new Function('fs', 'assert', 'proposal', 'applied', 'return (async()=>{' + common + `
const viewer = client();
await viewer.enter('admin');
const parameters = await viewer.request('/administracao/parametrizacao');
assert.equal(parameters.status, 200);
const p = parameters.page.props;
assert.equal(p.active, true);
assert.equal(p.version, applied.active_version);
assert.equal(p.profiles.length, 11);
assert.equal(p.memberships.length, 17);
assert.equal(p.users.length, 12);
assert.equal(p.activationPreview.permanent_administrators, 2);
assert.equal(p.activationPreview.losing_access, 0);
for (const person of proposal.users) {
const actual = p.activationPreview.users.find(user => user.id === person.id);
assert.equal(actual.name, person.name);
assert.deepEqual([...actual.current_permissions].sort(), [...person.planned_permissions].sort());
assert.deepEqual(actual.current_contexts, person.current_contexts);
assert.equal(actual.current_can_request, person.current_can_request);
assert.equal(p.users.find(user => user.id === person.id).department_id, person.department_id);
}
assert.equal(p.companyRules.first_limit, proposal.proposed_rules.first_limit);
assert.equal(p.companyRules.second_limit, proposal.proposed_rules.second_limit);
assert.equal(p.companyRules.includes_tax, proposal.proposed_rules.includes_tax);
assert.equal(p.companyRules.default_tax_rate, proposal.current_rules.default_tax_rate);
assert.equal(p.companyRules.provisional, false);
async function selectInternal(client, area = 'procurement') {
const response = await client.request('/contexto', 'POST', { area, option: area + '.internal' });
assert.equal(response.status, 302);
}
await selectInternal(viewer);
const readiness = await viewer.request('/stock/piloto');
assert.equal(readiness.status, 200);
const report = readiness.page.props.report;
for (const [group, ids] of [['prepare', [9]], ['review', [10]], ['deliver', [13]], ['supply_prepare', [11]], ['supply_review', [12]]]) {
assert.deepEqual(report.participants[group].map(user => user.id).sort((a, b) => a - b), ids);
}
assert.equal(report.checks.find(check => check.key === 'participants').ok, true);
assert.equal(report.participants.purchase_requester.length, 12);
const roles = [];
for (const [role, path, capability] of [
['requester', '/stock/requisicoes', 'canPrepare'],
['department_head', '/stock/requisicoes?view=review', null],
['warehouse', '/stock/requisicoes?view=delivery', null],
['procurement', '/stock/reposicao', 'canPrepare'],
['finance', '/stock/reposicao', 'canReview']
]) {
const person = client();
await person.enter(role);
await selectInternal(person);
const response = await person.request(path);
assert.equal(response.status, 200, role + ' ' + path);
if (capability) assert.equal(response.page.props[capability], true);
if (role === 'procurement') assert.equal(response.page.props.canReview, false);
if (role === 'finance') assert.equal(response.page.props.canPrepare, false);
if (['warehouse', 'department_head'].includes(role)) assert.equal(response.page.props.canPrepare, false);
assert.equal((await person.request('/administracao/parametrizacao')).status, 403);
const tasks = await person.request('/requisicoes/tarefas');
assert.equal(tasks.status, 200);
roles.push({ role, route: path, result: 'passed', tasks: tasks.page.props.tasks.total });
}
await selectInternal(viewer, 'people');
assert.equal((await viewer.request('/pessoas/tarefas')).status, 200);
const proof = {
checked_at: new Date().toISOString(), environment: base, result: 'passed', active: true,
version: p.version, users: 12, profiles: 11, memberships: 17, permanent_administrators: 2,
original_access_and_contexts_preserved: true, first_limit: p.companyRules.first_limit,
second_limit: p.companyRules.second_limit, includes_tax: p.companyRules.includes_tax, provisional_rules: false,
participants_separated: true, roles, readiness: {
warehouse_scenario_ready: report.warehouse_scenario_ready,
replenishment_scenario_ready: report.replenishment_scenario_ready,
client_configuration_complete: report.client_configuration_complete,
checks: report.checks.map(check => ({ key: check.key, ok: check.ok, detail: check.detail }))
}, business_commands_executed: false, new_accounts: false, sgf_changes: false, visual_review: false
};
await fs.writeFile('docs/proofs/pilot-access-activation-http.json', JSON.stringify(proof, null, 2));
console.log(JSON.stringify(proof, null, 2));
` + '})()')(fs, assert, proposal, applied);