Files
SGF/scripts/sgf-payable-due-final-http.mjs
T
2026-11-11 09:00:17 +02:00

8 lines
4.0 KiB
JavaScript

import fs from 'node:fs';import assert from 'node:assert/strict';import crypto from 'node:crypto';import {createRequire} from 'node:module';import {pathToFileURL} from 'node:url';import React from 'react';import {renderToStaticMarkup} from 'react-dom/server';import {transformWithOxc} from 'vite';import {session} from './sgf-single-http.mjs';import {payablePageCsv} from '../resources/js/payable-position-view.js';
const root=JSON.parse(fs.readFileSync('C:/laragon/data/sgf-tempo/run/modular-regression-current.json')).root+'/private/receipt-composition-cc50a276c10c',checks=[],ok=(v,n)=>{assert(v,n);checks.push(n);},s=await session('sgf:read_only','finance');let r=await s.get('/api/finance/payable-positions');assert.equal(r.status,200);const list=await r.json(),row=list.positions.find(x=>x.obligation_id&&x.reviewed_terms);ok(row.reviewed_terms.due_on==='2026-11-30'&&row.reviewed_terms.version===2,'list carries actual reviewed terms');ok(row.due_on===null&&row.days_overdue===null&&row.balance_minor==='10000','original due lag and money preserved');r=await s.get('/api/finance/payable-due?'+new URLSearchParams({obligation_id:row.obligation_id,reference_on:'2026-12-01'}));const detail=await r.json();ok(r.status===200&&detail.days_overdue===1&&detail.basis.current_person,'new identity-aware detail read');
const saved=JSON.parse(fs.readFileSync(root+'/payable-due-http-progress.json')),own=await session('sgf:finance_prepare','finance');r=await own.get('/api/finance/payable-due/receipts/'+saved.prepare.key);ok(r.status===200&&(await r.json()).result.id===saved.prepare.result.id,'previous receipt retained after identity hardening');
const require=createRequire(import.meta.url),compile=async(file,imports)=>{let source=fs.readFileSync('resources/js/'+file,'utf8').replace("from 'react'",'from '+JSON.stringify(pathToFileURL(require.resolve('react')).href));for(const [name,url]of Object.entries(imports))source=source.replace("from './"+name+"'",'from '+JSON.stringify(url));const c=await transformWithOxc(source,file,{jsx:{runtime:'classic'}});return'data:text/javascript;base64,'+Buffer.from(c.code).toString('base64');},url=file=>pathToFileURL(process.cwd()+'/resources/js/'+file).href;
const child=await compile('PayableDueWorkspace.jsx',{'workshop-stock-operation.js':url('workshop-stock-operation.js'),'ledger-report-view.js':url('ledger-report-view.js')}),parent=await compile('PayablePositionsWorkspace.jsx',{'PayableDueWorkspace.jsx':child,'ledger-report-view.js':url('ledger-report-view.js'),'payable-position-view.js':url('payable-position-view.js')}),{PayablePositionRows}=await import(parent),html=renderToStaticMarkup(React.createElement(PayablePositionRows,{data:list,onDue(){}}));ok(html.includes('Original:')&&html.includes('Condição administrativa revista v2: 2026-11-30'),'actual row separates original and reviewed date');ok(html.includes('Condições de vencimento e histórico'),'explicit action opens terms');ok(payablePageCsv(list,{page:1,per_page:25}).includes(row.reviewed_terms.evidence),'page CSV includes reviewed evidence');const hostile=structuredClone(list);hostile.positions[0].reviewed_terms={due_on:null,evidence:' =FORMULA()'};ok(payablePageCsv(hostile,{}).includes("' =FORMULA()"),'reviewed evidence CSV formula escaped');
const manifest=JSON.parse(fs.readFileSync(root+'/app/public/build/manifest.json'));for(const e of Object.values(manifest).filter(v=>v.isEntry||v.file.includes('PayablePositionsWorkspace'))){r=await fetch('http://127.0.0.1:8085/build/'+e.file);const bytes=Buffer.from(await r.arrayBuffer());ok(r.status===200&&/javascript/.test(r.headers.get('content-type'))&&crypto.createHash('sha256').update(bytes).digest('hex')===crypto.createHash('sha256').update(fs.readFileSync(root+'/app/public/build/'+e.file)).digest('hex'),'final JS delivered '+e.file);}
const file=root+'/payable-due-final-http-20261110.json';fs.writeFileSync(file,JSON.stringify({passed:true,checks,business_commands:0,browser_visual_review:false},null,2));console.log(JSON.stringify({passed:true,checks:checks.length,proof:file}));