Files
SGF/scripts/sgf-document-math-http.mjs
2026-11-11 09:00:17 +02:00

7 lines
5.4 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';
const run=JSON.parse(fs.readFileSync('C:/laragon/data/sgf-tempo/run/modular-regression-current.json')),root=run.root+'/private/receipt-composition-cc50a276c10c',file=root+'/document-math-http-20261110.json';let p=fs.existsSync(file)?JSON.parse(fs.readFileSync(file)):{operations:{},checks:[]};if(p.passed){console.log(JSON.stringify({passed:true,reused:true,proof:file}));process.exit();}const save=()=>fs.writeFileSync(file,JSON.stringify(p,null,2));const ok=(v,n)=>{assert(v,n);if(!p.checks.includes(n))p.checks.push(n);save();};
const s=await session('sgf:finance_prepare','accounting'),read=await session('sgf:read_only','accounting');let response=await s.get('/api/fiscal-rules?per_page=100');assert.equal(response.status,200);const catalogue=await response.json();ok(catalogue.document_enabled===true,'approved line feature on selected8085');const rule=catalogue.records.data.find(r=>r.rule_key==='QA-RATE-TRANSVERSAL'&&r.rule_version===1&&r.state==='reviewed');assert(rule,'explicit existing approved version1');const line=(reference,unit_price)=>({reference,unit_price,quantity:'1'});const input=(mode,lines)=>({action:'calculate_document',revision:0,reason:'Conferência individual QA por linhas e modalidade aprovada, sem documento ou efeito financeiro.',data:{rule_event_id:rule.id,date:'2026-11-10',currency:'MZN',price_mode:mode,lines}});
const command=async(name,body)=>{if(p.operations[name]?.result)return p.operations[name].result;let op=p.operations[name];if(!op){op=p.operations[name]={key:crypto.randomUUID(),input:body};save();}if(!op.cut){const r=await s.command('/api/fiscal-rules/preview',op.input,op.key);assert.equal(r.status,200,JSON.stringify(r.value));op.cut=r.value.preview;op.impact=r.value.impact;save();}const r=await s.command('/api/fiscal-rules/confirm',{preview:op.cut});assert.equal(r.status,200,JSON.stringify(r.value));op.result=r.value;save();const again=await s.command('/api/fiscal-rules/confirm',{preview:op.cut});ok(again.status===200&&again.value.replayed&&again.value.id===r.value.id,'repeat '+name+' without duplicate');return r.value;};
for(const [name,mode,lines,base,tax,total]of [['net','net_added',[line('N400','400'),line('N600','600')],'1000.00','160.00','1160.00'],['included','gross_included',[line('G464','464'),line('G696','696')],'1000.00','160.00','1160.00'],['included100','gross_included',[line('G100','100')],'86.21','13.79','100.00']]){const result=await command(name,input(mode,lines));response=await read.get('/api/fiscal-rules/records/'+result.id+'?type=calculation');assert.equal(response.status,200);const detail=await response.json(),r=detail.result;ok(r.base_document===base&&r.tax_document===tax&&r.total===total,name+' actual documented amounts');ok(detail.current_evaluation.state==='determined_qa'&&detail.current_evaluation.total===total,name+' current source revalidation');if(name==='included100'){ok(r.lines[0].base_exact_fraction==='2500/29'&&r.lines[0].tax_exact_fraction==='400/29','exact included fractions retained');ok(r.base_difference_fraction==='9/2900'&&r.tax_difference_fraction==='9/2900','both rational differences retained');}response=await read.get('/api/fiscal-rules/documents/'+result.id+'/report');ok(response.status===200&&response.headers.get('content-type').includes('text/csv'),name+' line report authorized');const bytes=Buffer.from(await response.arrayBuffer()),text=bytes.toString();ok(crypto.createHash('sha256').update(bytes).digest('hex')===response.headers.get('x-content-sha256'),name+' report exact checksum');ok(text.includes(base+';'+tax+';'+total)&&text.includes("'"+lines[0].reference)&&text.includes('2026-11-10'),name+' report amounts safe references and date');}
response=await read.get('/api/fiscal-rules?view=calculations&per_page=100');ok((await response.json()).records.total===5,'only three new calculations plus two originals');response=await read.get('/api/fiscal-rules?view=history&rule_key=QA-RATE-TRANSVERSAL');ok((await response.json()).records.total===4,'four rule events unchanged');let denied=await read.command('/api/fiscal-rules/preview',input('gross_included',[line('X','100')]));ok(denied.status===403,'read-only calculation writer refused');const bad=input('gross_included',[line('X','100')]);bad.data.rate='0.99';denied=await s.command('/api/fiscal-rules/preview',bad);ok(denied.status===422,'client rate injection refused by actual HTTP');const wrong=await session('sgf:finance_prepare','finance');response=await wrong.get('/api/fiscal-rules');ok([403,409].includes(response.status),'other module refused');response=await read.get('/api/fiscal-rules?tenant_id=2');ok(response.status===422,'tenant override refused');const fresh=await session('sgf:finance_prepare','accounting');response=await fresh.get('/api/fiscal-rules/receipts/'+p.operations.included100.key);const receipt=await response.json();ok(response.status===200&&receipt.result.id===p.operations.included100.result.id&&receipt.operation_executed===false,'own receipt recovered in new session');response=await read.get('/api/fiscal-rules/receipts/'+p.operations.included100.key);ok(response.status===404,'other actor receipt refused');p.passed=true;p.business_confirmations=3;p.calculations_retained=5;p.new_grants=0;p.new_financial_effects=0;p.browser_visual_review=false;save();console.log(JSON.stringify({passed:true,checks:p.checks.length,proof:file}));