test: verify open bid form reacts to rotating source records
This commit is contained in:
@@ -1159,3 +1159,10 @@ Taslak türü seçicisine erişilebilir ad eklendi. Üretim derlemesi geçti. Ö
|
|||||||
- Teklif kaynak karşılaştırmasına çıktıdaki ihale başlığı, idare ve form tarihi eklendi. Bu bilgiler değiştiğinde önceki kaynak onayı ve `latestDraft` karşılaştırması aynı kabul edilmiyor; mevcut asenkron çıktı kontrolleri değişikliği görebiliyor. Yalnız kaynak yanıt ID'sinin değişmesi onayı bozmaz.
|
- Teklif kaynak karşılaştırmasına çıktıdaki ihale başlığı, idare ve form tarihi eklendi. Bu bilgiler değiştiğinde önceki kaynak onayı ve `latestDraft` karşılaştırması aynı kabul edilmiyor; mevcut asenkron çıktı kontrolleri değişikliği görebiliyor. Yalnız kaynak yanıt ID'sinin değişmesi onayı bozmaz.
|
||||||
- 274 test ve build başarılı. Yeni regresyonlar dönen ID + sabit İKN, yanlış İKN'de birleştirmeme, eski taslağın korunması ve çıktı başlık alanlarının kaynak imzasına etkisini kapsıyor. Gerçek tarayıcıda çıktı oluşturma sırasında canlı kaynak değişimi kabulü henüz tamamlanmadı; bu testler onun yerine geçmez.
|
- 274 test ve build başarılı. Yeni regresyonlar dönen ID + sabit İKN, yanlış İKN'de birleştirmeme, eski taslağın korunması ve çıktı başlık alanlarının kaynak imzasına etkisini kapsıyor. Gerçek tarayıcıda çıktı oluşturma sırasında canlı kaynak değişimi kabulü henüz tamamlanmadı; bu testler onun yerine geçmez.
|
||||||
- Eski kaydedilmiş kaynak onayları yeni çıktı başlığı alanlarını içermediğinden bir defa yeniden kaynak karşılaştırması gerektirebilir. Kaydedilmiş fiyatlar ve firma alanları silinmez. Genel plan, resmi beş dosya ve kalan kabul maddeleri açısından açık.
|
- Eski kaydedilmiş kaynak onayları yeni çıktı başlığı alanlarını içermediğinden bir defa yeniden kaynak karşılaştırması gerektirebilir. Kaydedilmiş fiyatlar ve firma alanları silinmez. Genel plan, resmi beş dosya ve kalan kabul maddeleri açısından açık.
|
||||||
|
|
||||||
|
### 2026-09-06 — Açık hazırlık dosyasında dönen kaynak ID tarayıcı kabulü
|
||||||
|
|
||||||
|
- QA sunucusunda üretimdeki AppProvider/BidPackageBuilder ile görünür kaynak güncelleme düğmesi olan izole düzenek eklendi. Seçilmiş eski satır sabit kalırken canlı React veri havuzuna aynı İKN ve farklı kayıt ID'si, yeni başlık ve kazanan veriliyor. Gerçek ihale veya sunucu kaynağı değiştirilmez.
|
||||||
|
- Altı tarayıcı kontrolü geçti: başlangıç kaynak onayı, değişen ID üzerinden kazananın açık dosyaya yansıması, önceki onayın geçersiz olması, 125,50 TL birim fiyat / 251,00 TL satır toplamının korunması, çıktı düğmesinin kapalı kalması ve yeni kayıt üzerinden taslak kaydının sunucu onayı. Kanıt `rapor/qa-open-bid-source-update.json`.
|
||||||
|
- Bu düzenekte firma/belge eksikleri de vardı; kapalı çıktı düğmesi tek başına kazanan kontrolünü kanıtlamaz. Kazanan uyarısının görünmesi ve kaynak onayının değişmesi doğrudan doğrulandı. Henüz başlayan PDF/Excel üretimi sırasında kaynak değişimi veya tam hazırdan engelliye geçiş kabulü yapılmadı.
|
||||||
|
- Yalnız QA düzeneği değişti; önceki 274 test ve build sonucu geçerli, tekrarlanmadı. Test sekmesi ve bu çalışmanın geçici sunucusu kapatıldı. İlk düzeneğin ReactDOM import hatası test sırasında düzeltildi. Genel plan ve resmi beş dosya kabulü açık.
|
||||||
|
|||||||
@@ -96,6 +96,23 @@ 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)}));
|
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;
|
}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') {
|
||||||
|
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',{},
|
||||||
|
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:()=>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)));
|
||||||
|
</script></body></html>`;
|
||||||
|
res.setHeader('Content-Type','text/html; charset=utf-8');res.end(await server.transformIndexHtml('/qa-source-update',html));return;
|
||||||
|
}
|
||||||
if(req.url==='/qa-brief-controls') {res.setHeader('Content-Type','text/html; charset=utf-8');res.end(`<html lang="tr"><h1>Yerel haftalık özet testi</h1><button id="read">Özet okuma hatası</button><button id="write">Özet kayıt hatası</button><button id="none">Özet hatalarını kapat</button><p role="status"></p><script>for(const mode of ['read','write','none'])document.getElementById(mode).onclick=async()=>{const r=await fetch('/qa-brief-failure?mode='+mode,{method:'POST'});document.querySelector('[role=status]').textContent=await r.text();};</script></html>`);return;}
|
if(req.url==='/qa-brief-controls') {res.setHeader('Content-Type','text/html; charset=utf-8');res.end(`<html lang="tr"><h1>Yerel haftalık özet testi</h1><button id="read">Özet okuma hatası</button><button id="write">Özet kayıt hatası</button><button id="none">Özet hatalarını kapat</button><p role="status"></p><script>for(const mode of ['read','write','none'])document.getElementById(mode).onclick=async()=>{const r=await fetch('/qa-brief-failure?mode='+mode,{method:'POST'});document.querySelector('[role=status]').textContent=await r.text();};</script></html>`);return;}
|
||||||
if(req.url?.startsWith('/qa-brief-failure?')&&req.method==='POST'){briefFailure=new URL(req.url,'http://localhost').searchParams.get('mode');res.end('Özet test durumu: '+briefFailure);return;}
|
if(req.url?.startsWith('/qa-brief-failure?')&&req.method==='POST'){briefFailure=new URL(req.url,'http://localhost').searchParams.get('mode');res.end('Özet test durumu: '+briefFailure);return;}
|
||||||
if(req.url?.startsWith('/api/me/brief')&&((briefFailure==='read'&&req.method==='GET')||(briefFailure==='write'&&req.method==='POST'))){res.writeHead(503,{'Content-Type':'application/json'});res.end(JSON.stringify({success:false,error:'QA: Haftalık özet deposuna erişilemiyor.'}));return;}
|
if(req.url?.startsWith('/api/me/brief')&&((briefFailure==='read'&&req.method==='GET')||(briefFailure==='write'&&req.method==='POST'))){res.writeHead(503,{'Content-Type':'application/json'});res.end(JSON.stringify({success:false,error:'QA: Haftalık özet deposuna erişilemiyor.'}));return;}
|
||||||
|
|||||||
Reference in New Issue
Block a user