Add saved bid preparation overview with actionable missing checks

This commit is contained in:
2026-09-06 13:26:29 +03:00
parent 2e98e5ad4f
commit 30ce6e3a6c
9 changed files with 168 additions and 13 deletions
+32
View File
@@ -0,0 +1,32 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import {preparationSummary} from '../src/services/preparationSummary.js';
import {documentKey,documentRevision} from '../src/services/preparationChecks.js';
const now=new Date('2026-09-06T10:00:00Z');
const tender={id:'test',ikn:'2026/1',tarih:'10.09.2026',saat:'10:00',baslik:'Lab',items:[{ad:'Kit',miktar:2,birim:'adet'}]};
const vault={loading:false,error:null,documents:[]};
test('five saved dossiers retain distinct owners, missing documents and actionable targets',()=>{
const rows=Array.from({length:5},(_,i)=>({...tender,id:`t-${i}`,ikn:`2026/${i}`,atananPersonel:`Sorumlu ${i}`,bidDraft:{manualDocuments:[{document:`Belge ${i}`}],teklifTuru:'birim'}}));
rows.forEach((row,i)=>{
const result=preparationSummary(row,vault,now);
assert.equal(result.owner,`Sorumlu ${i}`);
assert.ok(result.documentIssues.some(text=>text.includes(`Belge ${i}`)));
assert.equal(result.next.target,'source');
assert.ok(result.issues.some(issue=>issue.target.startsWith('price:')));
assert.ok(result.issues.some(issue=>issue.target==='firm:vergiNo'));
});
});
test('document revision and vault failures invalidate a previously verified saved document',()=>{
const doc={document:'Ürün belgesi'};
const file={id:'f',tur:'firma',olusturma:'2026-09-01',boyut:20,son_kullanma:'2026-12-31'};
const draft={manualDocuments:[doc],checks:{documents:{[documentKey(doc)]:{status:'verified',evidence:'Madde 2',documentId:'f',documentRevision:documentRevision(file)}}}};
assert.deepEqual(preparationSummary({...tender,bidDraft:draft},{...vault,documents:[file]},now).documentIssues,[]);
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('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/);
assert.equal(summary.next.target,'source');
assert.equal(summary.owner,'Atanmadı');
});