diff --git a/docs/quality/uygulama-durumu.md b/docs/quality/uygulama-durumu.md index 02550b8..eaa3784 100644 --- a/docs/quality/uygulama-durumu.md +++ b/docs/quality/uygulama-durumu.md @@ -2412,3 +2412,9 @@ Doğrulama: `npm test` 305/305, `npm run build` ve `npm run qa:browser` başarı Hazırlık ekranındaki her belge gereksinimine, ürün/servis kontrollerindeki sorumlu alanıyla aynı biçimde kişi veya ekip atama alanı eklendi. Sorumlu bilgisi taslak içindeki `checks.documents` kaydında saklanıyor; mevcut kayıtları geriye dönük zorunlu kılmıyor ve belge doğrulama koşullarını gevşetmiyor. Böylece beş dosyada eksik belge ile işi yapacak kişi aynı akışta görülebiliyor. Doğrulama: `npm test` 305/305, `npm run build` ve `npm run qa:browser` başarılı. Gitea `main`e gönderim ve Coolify rollout kimlik doğrulaması ayrıca bekliyor. + +### 2026-09-06 · Hazırlık özetinde belge sorumluları + +Belge gereksinimlerine eklenen sorumlu bilgisi hazırlık dosyaları özetine taşındı. Her ihalenin özetinde belge adı ile atanmış kişi/ekip veya `Atanmadı` durumu birlikte görülüyor; eksik belge sayısı ve sıradaki kontrol akışı korunuyor. Atanmamış kayıtlar otomatik tamamlanmış sayılmıyor. + +Doğrulama: `npm test` 306/306, `npm run build` ve `npm run qa:browser` başarılı. Gitea `main`e gönderim sonrası Coolify API kimlik doğrulaması yeniden denenmeli. diff --git a/src/components/PreparationOverview.jsx b/src/components/PreparationOverview.jsx index 3189d76..c4690ee 100644 --- a/src/components/PreparationOverview.jsx +++ b/src/components/PreparationOverview.jsx @@ -37,6 +37,7 @@ function Overview({tenders,now}) {

{summary.issues.length ? `${summary.issues.length} kontrol eksik` : 'Kayıtlı kontroller tamam; son kontrol gerekli'}

{summary.owner}
{summary.documentIssues.length ? `${summary.documentIssues.length} belge kontrolü` : 'Kayıtlı belgelerde eksik bulunmadı'} + {summary.documentOwners.length > 0 &&

Belge sorumluları: {summary.documentOwners.map(item=>`${item.document}: ${item.owner}`).join(' · ')}

}
diff --git a/src/services/preparationSummary.js b/src/services/preparationSummary.js index f5f7e1e..a38f1b8 100644 --- a/src/services/preparationSummary.js +++ b/src/services/preparationSummary.js @@ -37,5 +37,6 @@ export function preparationSummary(tender,vault,now=new Date()) { const checkedVault={...vault,documents:Array.isArray(vault?.documents) ? vault.documents : [],deadlineDate:tenderDateKey(tender),tenderIkn:tender.ikn}; const documentIssues=preparationBlockers([],documents,draft.checks,checkedVault); preparationBlockers(selection.rows,documents,draft.checks,checkedVault).forEach(text=>add('checks',text)); - return {issues,documentIssues,owner:tender.atananPersonel || 'Atanmadı',next:issues[0] || {target:'source',text:'Dosyayı açıp son kontrolleri yapın.'}}; + const documentOwners=documents.map(document=>({document:document.document,owner:draft.checks?.documents?.[documentKey(document)]?.owner?.trim() || 'Atanmadı'})); + return {issues,documentIssues,documentOwners,owner:tender.atananPersonel || 'Atanmadı',next:issues[0] || {target:'source',text:'Dosyayı açıp son kontrolleri yapın.'}}; } diff --git a/tests/preparation-summary.test.mjs b/tests/preparation-summary.test.mjs index 48e1c1c..2917d5a 100644 --- a/tests/preparation-summary.test.mjs +++ b/tests/preparation-summary.test.mjs @@ -24,6 +24,13 @@ test('document revision and vault failures invalidate a previously verified save assert.ok(preparationSummary({...tender,bidDraft:draft},{...vault,documents:[{...file,boyut:21}]},now).documentIssues.some(text=>text.includes('değişti'))); assert.ok(preparationSummary({...tender,bidDraft:draft},{...vault,error:'offline'},now).documentIssues.some(text=>text.includes('doğrulanamadı'))); }); +test('preparation summary exposes document owners without hiding unassigned work',()=>{ + const doc={document:'Yetki belgesi'}; + const assigned={manualDocuments:[doc],checks:{documents:{[documentKey(doc)]:{owner:' Uyum ekibi '}}}}; + const missing={manualDocuments:[doc],checks:{documents:{}}}; + assert.deepEqual(preparationSummary({...tender,bidDraft:assigned},vault,now).documentOwners,[{document:'Yetki belgesi',owner:'Uyum ekibi'}]); + assert.deepEqual(preparationSummary({...tender,bidDraft:missing},vault,now).documentOwners,[{document:'Yetki belgesi',owner:'Atanmadı'}]); +}); test('expired source takes priority over completion or manually moved Kanban status',()=>{ const summary=preparationSummary({...tender,tarih:'01.09.2026',kanbanStatus:'teklif_verildi'},vault,now); assert.match(summary.next.text,/zamanı geçti/);