Verify administrator outbox review and expose saved provider reference

This commit is contained in:
2026-09-06 13:08:38 +03:00
parent 22e886936e
commit 783ea807db
4 changed files with 27 additions and 0 deletions
+15
View File
@@ -0,0 +1,15 @@
{
"checks": {
"hiddenFromNormal": true,
"visibleToAdmin": true,
"emptyEvidenceDisabled": true,
"requiresCheckbox": true,
"savedDecision": true,
"savedActor": true,
"noSecondDecision": true,
"persistedAfterReload": true,
"receiptVisible": true
},
"scope": "Local synthetic uncertain delivery and synthetic receipt only; real API/store administrator resolution; no provider check or external email",
"snapshot": "utton \"+ Otomotiv & İş Makinesi\"\n - button \"+ Personel Hizmet Alımı\"\n - button \"+ Peyzaj & Park\"\n - button \"+ Reklam & Organizasyon\"\n - button \"+ Sağlık / Tıbbi Malzeme\"\n - button \"+ Sigorta\"\n - button \"+ Spor Tesisleri\"\n - button \"+ Su & Arıtma\"\n - button \"+ Tarım & Hayvancılık\"\n - button \"+ Taşımacılık & Kiralama\"\n - button \"+ Taşınmaz & Kiralama\"\n - button \"+ Tekstil & Giyim\"\n - button \"+ Temizlik & Hijyen\"\n - button \"+ Yayın & Arşiv\"\n - button \"+ Genel\"\n - 'button \"Daha da daralt (isteğe bağlı) — varsayılan: tüm Türkiye\"':\n - text: \"Daha da daralt (isteğe bağlı) — varsayılan: tüm Türkiye\"\n - button \"Bildirimi Kaydet\" [disabled]:\n - text: Bildirimi Kaydet\n - alert:\n - paragraph:\n - text: \"QA: Abonelik deposuna erişilemiyor.\"\n - button \"Abonelikleri yeniden yükle\"\n - paragraph:\n - text: İlk kayıtta mevcut ihaleler\n - strong: bildirilmez\n - text: — yalnızca temel alınır, sonrasında çıkan yeni ihaleler gönderilir. Sonuçlanmış arşiv kayıtları bildirime girmez. Aboneliği kaydetmek, e-postanın teslim edildiği anlamına gelmez.\n - heading \"E-posta gönderim incelemesi · Yönetici\" [level=3]\n - paragraph: Bekleyen işler ve son inceleme kararları gösterilir (en fazla 50). Belirsiz gönderimi sağlayıcı kaydıyla karşılaştırın. Bu işlemler yeni e-posta göndermez.\n - button \"Gönderim listesini yenile\"\n - paragraph: QA belirsiz laboratuvar e-postası\n - paragraph: browser-qa@example.test · Gönderildiği yönetici tarafından doğrulandı\n - paragraph: \"Kayıt: 7301fa20-ae6c-4b86-995c-e3f6a6ed63f2\"\n - paragraph: \"Sağlayıcı kaydı: qa-synthetic-provider-receipt\"\n - paragraph: \"keys-browser-qa@example.test · 06.09.2026 13:07:52 · QA: Sentetik sağlayıcı kaydı karşılaştırıldı; gerçek e-posta gönderilmedi.\"\n- button \"Kullanım kılavuzu (? tuşu)\":"
}
+6
View File
@@ -827,3 +827,9 @@ Taslak türü seçicisine erişilebilir ad eklendi. Üretim derlemesi geçti. Ö
- Belirsiz iş confirmed_sent (sağlayıcı id, açık kontrol onayı, 20+ karakter açıklama) veya skip (yeniden göndermeden kapatma) ile çözülebilir. Yeni e-posta gönderilmez. İki karar da grup kimliklerini görülmüş sayarak aynı grubun yeniden oluşmasını önler; yalnız confirmed_sent son gönderim tarihi oluşturur. - Belirsiz iş confirmed_sent (sağlayıcı id, açık kontrol onayı, 20+ karakter açıklama) veya skip (yeniden göndermeden kapatma) ile çözülebilir. Yeni e-posta gönderilmez. İki karar da grup kimliklerini görülmüş sayarak aynı grubun yeniden oluşmasını önler; yalnız confirmed_sent son gönderim tarihi oluşturur.
- notification_outbox_reviews aktör, karar, açıklama ve zamanı tutar. Karar ve abonelik görülme güncellemesi atomiktir; yalnız uncertain durumunda tek karar kabul edilir. Abonelik sonradan silinse de karar geçmişi korunur. - notification_outbox_reviews aktör, karar, açıklama ve zamanı tutar. Karar ve abonelik görülme güncellemesi atomiktir; yalnız uncertain durumunda tek karar kabul edilir. Abonelik sonradan silinse de karar geçmişi korunur.
- 189 test ve derleme geçti. HTTP yönetici yetkisi, geçersiz/eskimiş karar, sağlayıcı kanıtı gereksinimi, tekrar karar reddi, replay engeli ve unsubscribe sonrası inceleme geçmişi test edildi. Yeni yönetici ekranının tarayıcı kabulü henüz yapılmadı; sağlayıcı kaydının gerçek doğrulaması insan incelemesidir. - 189 test ve derleme geçti. HTTP yönetici yetkisi, geçersiz/eskimiş karar, sağlayıcı kanıtı gereksinimi, tekrar karar reddi, replay engeli ve unsubscribe sonrası inceleme geçmişi test edildi. Yeni yönetici ekranının tarayıcı kabulü henüz yapılmadı; sağlayıcı kaydının gerçek doğrulaması insan incelemesidir.
### Yönetici gönderim incelemesi tarayıcı kabulü — 6 Eylül 2026
- 5182 yerel QA deposunda sentetik belirsiz e-posta grubu oluşturuldu. Normal hesapta inceleme alanının bulunmaması, yöneticiye görünmesi, açıklama/sağlayıcı kimliği/onay koşulları ve confirmed_sent kararı gerçek UI/API ile sınandı.
- Yönetici aktörü/açıklaması kalıcı kaldı, ikinci karar düğmesi kalktı, sayfa yenilendikten sonra karar geri geldi. Kaydedilen sağlayıcı kimliği sonuçta ayrıca gösterildi.
- `qa-outbox-review.json`: 9 kontrol doğru. Sağlayıcı makbuzu sentetiktir; gerçek e-posta gönderilmedi veya doğrulanmadı. Skip dalı önceki sunucu testlerinde doğrulandı; bu tarayıcı oturumunda confirmed_sent dalı yürütüldü.
- Derleme geçti. UI referans gösterimi ve QA altyapısı değişti; önceki 189 test sonucu yeniden çalıştırılmadı. Gerçek outbox süreç kesintisi ve dış teslim kabulü açık.
+1
View File
@@ -28,6 +28,7 @@ function Review({row,busy,resolve}){
return <div className="border rounded p-3 space-y-2 text-sm"> return <div className="border rounded p-3 space-y-2 text-sm">
<p className="font-bold">{row.subject}</p><p>{String(row.to)} · {labels[row.state]}</p><p className="break-all">Kayıt: {row.id}</p> <p className="font-bold">{row.subject}</p><p>{String(row.to)} · {labels[row.state]}</p><p className="break-all">Kayıt: {row.id}</p>
{row.error&&<p>{row.error}</p>} {row.error&&<p>{row.error}</p>}
{row.providerId&&<p className="break-all">Sağlayıcı kaydı: {row.providerId}</p>}
{row.review&&<p>{row.review.actor} · {new Date(row.review.at).toLocaleString('tr-TR')} · {row.review.note}</p>} {row.review&&<p>{row.review.actor} · {new Date(row.review.at).toLocaleString('tr-TR')} · {row.review.note}</p>}
{row.state==='uncertain'&&<fieldset disabled={busy} className="space-y-2"> {row.state==='uncertain'&&<fieldset disabled={busy} className="space-y-2">
<label className="block">Kontrol açıklaması<textarea className="block border w-full p-2" value={note} onChange={e=>setNote(e.target.value)} minLength={20}/></label> <label className="block">Kontrol açıklaması<textarea className="block border w-full p-2" value={note} onChange={e=>setNote(e.target.value)} minLength={20}/></label>
+5
View File
@@ -33,6 +33,11 @@ const qaNotifications=await import('../server/zeyilname.mjs');
qaNotifications.bildirimYaz({email:user.email,tur:'zeyilname',ikn:'2026/1582991',baslik:'QA tarih değişikliği',metin:'Sentetik bildirim: ihale tarihi güncellendi.'}); qaNotifications.bildirimYaz({email:user.email,tur:'zeyilname',ikn:'2026/1582991',baslik:'QA tarih değişikliği',metin:'Sentetik bildirim: ihale tarihi güncellendi.'});
qaNotifications.bildirimYaz({email:user.email,tur:'sonuc',ikn:'2026/1534665',baslik:'QA sonuç bildirimi',metin:'Sentetik sonuç inceleme bildirimi.'}); qaNotifications.bildirimYaz({email:user.email,tur:'sonuc',ikn:'2026/1534665',baslik:'QA sonuç bildirimi',metin:'Sentetik sonuç inceleme bildirimi.'});
let notificationFailure='read'; let notificationFailure='read';
const qaSubscriptionStore=await import('../server/notify-store.mjs');
const qaReviewSub=qaSubscriptionStore.subscribe(user.email,{konular:['QA gönderim incelemesi']})[0];
const qaDelivery=qaSubscriptionStore.reserveDelivery(qaReviewSub.id,{to:user.email,subject:'QA belirsiz laboratuvar e-postası',html:'Sentetik içerik; gönderilmedi.'},['qa-review-tender'],{clock:Date.now()-24*3600000});
qaSubscriptionStore.failDelivery(qaDelivery,'Sentetik belirsiz sağlayıcı sonucu.');
qaSubscriptionStore.reserveDelivery(qaReviewSub.id,null,[]);
let subscriptionFailure='read'; let subscriptionFailure='read';
const ui=await createServer({server:{host:'127.0.0.1',port:0,proxy:{'/api':{target:'http://127.0.0.1:'+port}}},plugins:[{name:'qa-fixtures',configureServer(server){server.middlewares.use(async(req,res,next)=>{ const ui=await createServer({server:{host:'127.0.0.1',port:0,proxy:{'/api':{target:'http://127.0.0.1:'+port}}},plugins:[{name:'qa-fixtures',configureServer(server){server.middlewares.use(async(req,res,next)=>{
if(req.url==='/qa-subscription-controls'){res.setHeader('Content-Type','text/html; charset=utf-8');res.end(`<html lang="tr"><h1>Yerel abonelik testi</h1><button id="read">Abonelik liste hatası</button><button id="delete">Abonelik silme hatası</button><button id="none">Abonelik hatalarını kapat</button><p role="status"></p><script>for(const mode of ['read','delete','none'])document.getElementById(mode).onclick=async()=>{const r=await fetch('/qa-subscription-failure?mode='+mode,{method:'POST'});document.querySelector('[role=status]').textContent=await r.text();};</script></html>`);return;} if(req.url==='/qa-subscription-controls'){res.setHeader('Content-Type','text/html; charset=utf-8');res.end(`<html lang="tr"><h1>Yerel abonelik testi</h1><button id="read">Abonelik liste hatası</button><button id="delete">Abonelik silme hatası</button><button id="none">Abonelik hatalarını kapat</button><p role="status"></p><script>for(const mode of ['read','delete','none'])document.getElementById(mode).onclick=async()=>{const r=await fetch('/qa-subscription-failure?mode='+mode,{method:'POST'});document.querySelector('[role=status]').textContent=await r.text();};</script></html>`);return;}