5 lines
4.5 KiB
JavaScript
5 lines
4.5 KiB
JavaScript
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}));
|