fix: withhold print action until bid validation finishes

This commit is contained in:
2026-09-06 15:08:56 +03:00
parent 1e36c17487
commit fb2c2b120e
6 changed files with 72 additions and 8 deletions
+19 -3
View File
@@ -6,6 +6,8 @@ import {tmpdir} from 'node:os';
import {join} from 'node:path';
import {randomBytes} from 'node:crypto';
import {createServer as netServer} from 'node:net';
import {readyBid} from './fixtures/ready-bid.mjs';
import {preparationSummary} from '../src/services/preparationSummary.js';
const dir=mkdtempSync(join(tmpdir(),'ihaleist-browser-'));
process.env.AUTH_SECRET=randomBytes(32).toString('hex');
const {signToken}=await import('../server/auth.mjs');
@@ -15,6 +17,8 @@ const keyUser={email:'keys-browser-qa@example.test',name:'API QA',isAdmin:true};
const keyToken=signToken(keyUser);
let apiKeyListFailure=false;
let briefFailure='none';
let holdDocuments=false;
const pendingDocuments=new Set();
process.env.IHALEIST_USER_DATA_DIR=dir;
const {createBriefOutbox}=await import('../server/brief-outbox.mjs');
const qaBriefOutbox=createBriefOutbox(dir);
@@ -96,17 +100,29 @@ const ui=await createServer({server:{host:'127.0.0.1',port:0,proxy:{'/api':{targ
res.setHeader('Content-Type','application/json');res.end(JSON.stringify({success:true,job:qaJobs.getAiJob(user.email,created.id)}));
}catch(error){res.writeHead(400,{'Content-Type':'application/json'});res.end(JSON.stringify({success:false,error:error.message}));}});return;
}
if(req.url==='/qa-source-update') {
if(req.url?.startsWith('/qa-output-documents?')&&req.method==='POST') {
const mode=new URL(req.url,'http://localhost').searchParams.get('mode');
if(mode==='hold')holdDocuments=true;
if(mode==='release'){holdDocuments=false;for(const pending of pendingDocuments){pending.writeHead(200,{'Content-Type':'application/json'});pending.end(JSON.stringify({success:true,belgeler:[]}));}pendingDocuments.clear();}
res.end('Belge yanıtı: '+mode);return;
}
if(req.url==='/api/me/documents'&&req.method==='GET'&&holdDocuments){pendingDocuments.add(res);res.on('close',()=>pendingDocuments.delete(res));return;}
if(req.url==='/qa-source-update'||req.url==='/qa-source-update?ready=1') {
const selected=req.url.endsWith('?ready=1')?readyBid(tenders[0]):tenders[0];
if(selected.bidDraft){const summary=preparationSummary(selected,{loading:false,error:null,documents:[]});if(summary.issues.length)throw new Error('QA ready fixture: '+JSON.stringify(summary.issues));}
const html=`<html lang="tr"><head><meta name="viewport" content="width=device-width,initial-scale=1"></head><body><div id="root"></div><script type="module">
import React from '/node_modules/.vite/deps/react.js';
import ReactDOM from '/node_modules/.vite/deps/react-dom_client.js';
import {AppProvider,useApp} from '/src/context/AppContext.jsx';
import {BidPackageBuilder} from '/src/components/BidPackageBuilder.jsx';
import '/src/index.css';
const selected=${JSON.stringify(tenders[0])};
function Probe(){const {setTenders}=useApp();return React.createElement('main',{},
const selected=${JSON.stringify(selected)};
function Probe(){const {setTenders}=useApp();const [status,setStatus]=React.useState('');const control=async mode=>setStatus(await (await fetch('/qa-output-documents?mode='+mode,{method:'POST'})).text());return React.createElement('main',{},
React.createElement('h1',{},'Yerel kaynak güncelleme testi'),
React.createElement('p',{},'Yalnız sentetik veri. Açık dosya korunurken güncel kaynak değişir.'),
React.createElement('button',{onClick:()=>control('hold')},'Belge yanıtını beklet'),
React.createElement('button',{onClick:()=>control('release')},'Belge yanıtını serbest bırak'),
React.createElement('p',{role:'status'},status),
React.createElement('button',{onClick:()=>setTenders([{...selected,id:'qa-rotated-source',baslik:'QA Güncellenmiş alım',kazananFirma:'QA Kazanan'}])},'Aynı İKN için yeni kayıt ID ve kazanan yayımla'),
React.createElement(BidPackageBuilder,{tender:selected}));}
ReactDOM.createRoot(document.getElementById('root')).render(React.createElement(AppProvider,{},React.createElement(Probe)));