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

4 lines
3.4 KiB
JavaScript

import fs from 'node:fs';import assert from 'node:assert/strict';import {session} from './sgf-single-http.mjs';import {checkedPositions,positionsCsv} from '../resources/js/receivable-position-view.js';
const checks=[],ok=(v,n)=>{assert(v,n);checks.push(n);},s=await session('sgf:read_only','finance'),query={reference_on:'2026-11-10',page:1,per_page:'25'},path='/api/service-receivables/positions?';let r=await s.get(path+new URLSearchParams(query));assert.equal(r.status,200);const data=checkedPositions(await r.json(),query);ok(data.positions.data.length>0,'actual recognized positions visible');const legacy=await s.get('/api/service-receivables');const old=await legacy.json();for(const row of data.positions.data){const prior=old.obligations.find(o=>o.id===row.id);ok(prior&&prior.state===row.state&&prior.allocated===row.allocated&&prior.balance===(row.balance??prior.balance),'actual original source parity '+row.id);}const total=old.obligations.filter(o=>o.opened).reduce((sum,o)=>sum+BigInt(o.balance.replace('.','')),0n);ok(BigInt(data.totals.recognized_balance.replace('.',''))===total,'filtered total equals actual recognized balances once per obligation');r=await s.get(path+new URLSearchParams({...query,per_page:'100'}));const large=checkedPositions(await r.json(),{...query,per_page:'100'});ok(JSON.stringify(large.positions.data)===JSON.stringify(data.positions.data),'known positions identical25/100');const row=data.positions.data[0];r=await s.get(path+new URLSearchParams({...query,search:row.reference}));ok((await r.json()).positions.data.some(o=>o.id===row.id),'actual document search');r=await s.get(path+new URLSearchParams({...query,due_state:'unknown'}));const unknown=await r.json();ok(unknown.positions.data.every(o=>o.due_date===null&&o.overdue_days===null),'unknown due never zero days');r=await s.get(path+new URLSearchParams({...query,search:'%'}));ok((await r.json()).positions.total===0,'wildcard literal');r=await s.get('/api/service-receivables/positions');ok(r.status===422,'reference date required');r=await s.get(path+new URLSearchParams({...query,tenant_id:'2'}));ok(r.status===422,'tenant override refused');r=await s.get(path+new URLSearchParams({...query,per_page:'1000'}));ok(r.status===422,'unbounded page refused');const other=await session('sgf:read_only','commercial');r=await other.get(path+new URLSearchParams(query));ok([403,409].includes(r.status),'other module refused');const csv=positionsCsv(data,query);ok(csv.includes('NAO E SALDO HISTORICO')&&csv.includes(data.positions.data[0].reference),'CSV actual page and explicit temporal limit');const fiscal=await session('sgf:finance_prepare','accounting');r=await fiscal.get('/api/service-fiscal');const coverage=(await r.json()).coverage;ok(r.status===200&&coverage.version==='SGF-FISCAL-COVERAGE-v2'&&coverage.taxes[0].pending.includes('Emissão documental'),'coverage distinguishes line calculator from document issuance');
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+'/receivable-positions-http-20261110.json';fs.writeFileSync(root+'/receivable-positions-sample-private.json',JSON.stringify(data));fs.writeFileSync(file,JSON.stringify({passed:true,checks,business_commands:0,new_grants:0,new_demo:false,browser_visual_review:false},null,2));console.log(JSON.stringify({passed:true,checks:checks.length,proof:file}));