9 lines
5.3 KiB
JavaScript
9 lines
5.3 KiB
JavaScript
import fs from 'node:fs';import assert from 'node:assert/strict';import crypto from 'node:crypto';import {session} from './sgf-single-http.mjs';import {checkedStatements} from '../resources/js/internal-statements-view.js';
|
|
const root=JSON.parse(fs.readFileSync('C:/laragon/data/sgf-tempo/run/modular-regression-current.json')).root+'/private/receipt-composition-cc50a276c10c',progress=root+'/multiline-statements-http-progress-private.json',saved=fs.existsSync(progress)?JSON.parse(fs.readFileSync(progress)):{},save=()=>fs.writeFileSync(progress,JSON.stringify(saved)),checks=[],ok=(v,n)=>{assert(v,n);checks.push(n);},base='/api/general-ledger/statements';
|
|
const prep=await session('sgf:accounting_prepare','accounting'),review=await session('sgf:accounting_review','accounting'),read=await session('sgf:read_only','accounting');const get=async(q={view:'history',page:1,per_page:25},s=read)=>{const r=await s.get(base+'?'+new URLSearchParams(q));assert.equal(r.status,200);return checkedStatements(await r.json(),q);};let state=await get();ok(prep.identity.context.internal_statements_enabled===true,'selected installation feature enabled');const names=s=>s.identity.context.grants.filter(g=>g.permission.startsWith('general_ledger.statements.')).map(g=>g.permission);ok(JSON.stringify(names(prep))===JSON.stringify(['general_ledger.statements.prepare'])&&JSON.stringify(names(review))===JSON.stringify(['general_ledger.statements.review'])&&names(read).length===0,'exact approved preparation review rights only');
|
|
const input=(kind,action,version,data)=>({kind,action,version,data,reason:'Decisão individual QA de demonstrações internas parciais, sem classificação legal ou novos lançamentos.'});
|
|
async function perform(name,s,body){saved[name]??={key:crypto.randomUUID()};save();const step=saved[name];if(step.result)return step.result;const old=await s.get(base+'/receipts/'+step.key);if(old.status===200){step.result=(await old.json()).result;save();return step.result;}assert.equal(old.status,404);const cut=await s.command(base+'/preview',body,step.key);assert.equal(cut.status,200,JSON.stringify(cut.value));step.cut=cut.value;save();const out=await s.command(base+'/confirm',{preview:cut.value.preview},step.key);assert.equal(out.status,201,JSON.stringify(out.value));step.result=out.value;save();return out.value;}
|
|
|
|
const assetProgress=JSON.parse(fs.readFileSync(root+'/assets-statements-http-progress-private.json'));const mapping=assetProgress.mappingReview.result;const r1=await perform('resultPrepare',prep,input('result','prepare',4,{mapping_id:mapping.id,from_on:'2026-01-01',to_on:'2026-11-11',per_page:25,evidence:'Resultado interno parcial actualizado com dois documentos QA multilinha; mesmas correspondências revistas e31 lançamentos.'}));const r2=await perform('resultReview',review,input('result','review',5,{decision:'approved'}));ok(r1.version===5&&r2.version===6,'new result independently prepared reviewed versions5/6');const query={view:'result',version_id:r2.id,page:1,per_page:25},report=await get(query),summary=report.snapshot.summary,c=summary.currencies.MZN;ok(summary.plan.accounts===24&&summary.accounts===23&&summary.basis.journals===31&&report.current_source_matches,'24 chart accounts23 accounts with movements31 journals current source');ok(c.groups.asset.presentation_minor==='557500'&&c.groups.liability.presentation_minor==='10000','classified assets5575 supplier100');ok(c.groups.expense.presentation_minor==='230000'&&c.known_result_subtotal_minor==='228621','year-to-date expense2300 known subtotal2286.21');ok(c.unclassified_accounts===10&&c.complete_result_minor===null&&c.equity_minor===null&&!c.complete_balance_sheet,'ten unclassified complete result and equity unknown');const larger=await get({...query,per_page:100});ok(JSON.stringify(larger.records.data)===JSON.stringify(report.records.data),'same frozen23 movement rows pages25/100');
|
|
const old=JSON.parse(fs.readFileSync(root+'/statements-http-progress.json')).resultReview.result;let response=await read.get(base+'/exports/'+old.id);const oldBytes=Buffer.from(await response.arrayBuffer());ok(response.status===200&&oldBytes.equals(fs.readFileSync(root+'/statements-frozen-export-private.csv')),'old reviewed export byte identical');const historical=await get({...query,version_id:old.id});ok(historical.snapshot.summary.accounts===19&&historical.snapshot.summary.basis.journals===27&&historical.current_source_matches===false,'old19/27 snapshot explicit historical');response=await read.get(base+'/exports/'+r2.id);const bytes=Buffer.from(await response.arrayBuffer());ok(response.status===200&&crypto.createHash('sha256').update(bytes).digest('hex')===report.snapshot.csv_sha256,'new partial result export and SHA');fs.writeFileSync(root+'/multiline-statements-frozen-private.csv',bytes);fs.writeFileSync(root+'/multiline-statements-sample-private.json',JSON.stringify(report));const assetOld=assetProgress.resultReview.result;response=await read.get(base+'/exports/'+assetOld.id);ok(response.status===200&&Buffer.from(await response.arrayBuffer()).equals(fs.readFileSync(root+'/assets-statements-frozen-private.csv')),'asset29 journal snapshot byte identical');const proof=root+'/multiline-statements-http-20261111.json';fs.writeFileSync(proof,JSON.stringify({passed:true,checks,administrative_commands:2,old_snapshot_preserved:true,new_demo:false},null,2));console.log(JSON.stringify({passed:true,checks:checks.length,proof}));
|