Files
SGF/scripts/sgf-payable-aging-ui.mjs
2026-11-11 09:00:17 +02:00

5 lines
4.5 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import fs from 'node:fs';import assert from 'node:assert/strict';import React from 'react';import {renderToStaticMarkup} from 'react-dom/server';import {createRequire} from 'node:module';import {pathToFileURL} from 'node:url';import {transformWithOxc} from 'vite';import {checkedPayablePage,payableAgeSummary,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',sample=JSON.parse(fs.readFileSync(root+'/payable-positions-sample-private.json')),query={page:1,per_page:25,reference_on:'2026-12-15'},checks=[],ok=(v,n)=>{assert(v,n);checks.push(n);};sample.aging_reference_on=query.reference_on;sample.aging_basis='reviewed_administrative_terms_current_balance';for(const r of sample.positions){r.reviewed_age_bucket=r.obligation_id?'days_1_30':'unrecognised';r.reviewed_age_days=r.obligation_id?15:null;}checkedPayablePage(sample,query);ok(true,'reference and age contract accepted');const prior=sample.positions.find(r=>r.obligation_id),s=structuredClone(sample);s.positions=[{...prior,currency:'MZN',balance_minor:'1'},{...prior,currency:'MZN',balance_minor:'2'},{...prior,currency:'USD',balance_minor:'300',reviewed_age_bucket:'unknown',reviewed_age_days:null}];const summary=payableAgeSummary(s);ok(summary.length===2&&summary.find(r=>r.currency==='MZN').value==='0,03','exact minor-unit sum without floating point');ok(summary.find(r=>r.currency==='USD').bucket==='unknown','unknown due balance retained separately by currency');s.positions.push({...prior,obligation_id:null,balance_minor:null,reviewed_age_bucket:'unrecognised',reviewed_age_days:null},{...prior,balance_minor:null,source_conflict:true,reviewed_age_bucket:'indeterminate',reviewed_age_days:null},{...prior,balance_minor:'0',reviewed_age_bucket:'settled',reviewed_age_days:null});ok(JSON.stringify(payableAgeSummary(s))===JSON.stringify(summary),'unrecognised conflicting and cleared balances excluded from aging totals');assert.throws(()=>checkedPayablePage({...sample,aging_reference_on:'2026-12-16'},query));ok(true,'late different reference refused');const bad=structuredClone(sample);bad.positions[0].reviewed_age_bucket='invented';assert.throws(()=>checkedPayablePage(bad,query));ok(true,'unknown category refused');const csv=payablePageCsv(sample,query);ok(csv.includes('2026-12-15')&&csv.includes('NAO E SALDO HISTORICO')&&csv.includes('Faixa administrativa'),'CSV reference current basis and categories');
const require=createRequire(import.meta.url),url=f=>pathToFileURL(process.cwd()+'/resources/js/'+f).href,compile=async(file,imports)=>{let src=fs.readFileSync('resources/js/'+file,'utf8').replace("from 'react'",'from '+JSON.stringify(pathToFileURL(require.resolve('react')).href));for(const [f,target]of Object.entries(imports))src=src.replace("from './"+f+"'",'from '+JSON.stringify(target));const c=await transformWithOxc(src,file,{jsx:{runtime:'classic'}});return'data:text/javascript;base64,'+Buffer.from(c.code).toString('base64');};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')}),{default:View,PayablePositionRows}=await import(parent);const html=renderToStaticMarkup(React.createElement(View,{context:{token:'test'},api(){throw Error('SSR no query');},aging:true}));ok(html.includes('Mapa de antiguidade')&&html.includes('type="date" required="" value=""'),'aging requires explicit reference');ok(!html.includes('Faixas apenas desta página')&&!html.includes('Saldo conhecido apenas desta página'),'no invented summary before query');ok(html.includes('Totais apenas da página')&&html.includes('não é saldo histórico'),'scope visible before data');const rows=renderToStaticMarkup(React.createElement(PayablePositionRows,{data:sample}));ok(rows.includes('1–30 dias')&&rows.includes('15 dia(s) à referência 2026-12-15'),'row category uses administrative reference');ok(rows.includes('Atraso indeterminado pelo livro'),'original unknown lag stays separate');
const file=root+'/payable-aging-ui-20261110.json';fs.writeFileSync(file,JSON.stringify({passed:true,checks,browser_visual_review:false,business_commands:0},null,2));console.log(JSON.stringify({passed:true,checks:checks.length,proof:file}));