skip malformed tender rows during deduplication

This commit is contained in:
2026-09-06 18:09:06 +03:00
parent 6b3b446e49
commit 6e78485228
3 changed files with 12 additions and 0 deletions
+6
View File
@@ -1976,3 +1976,9 @@ Doğrulama: 286 test geçti, üretim derlemesi başarılı.
Sağlık portföyü kayıt kimlikleri artık kırpılarak tekilleştiriliyor ve 200 karakterle sınırlandırılıyor; yalnızca boşluk farkıyla oluşturulan kopya ürün kayıtları reddediliyor.
Doğrulama: HTTP profil testleri 19/19 geçti, üretim derlemesi başarılı.
### 2026-09-06 · Bozuk ihale satırlarında tekilleştirme dayanıklılığı
Kaynak havuzundan gelen null, dizi veya kimliksiz satırlar artık tekilleştirme sırasında tüm havuzu düşürmüyor; geçersiz satır atlanıp geçerli ihale kayıtları işlenmeye devam ediyor.
Doğrulama: 287 test geçti, üretim derlemesi başarılı.
+2
View File
@@ -11,6 +11,8 @@ export function tenderIdentity(t) {
export function uniqueTenders(records) {
const found = new Map();
for (const t of records) {
// Kaynaklardan gelen bozuk/null satırlar tüm havuz birleştirmesini düşürmemeli.
if (!t || typeof t !== 'object' || Array.isArray(t) || typeof t.id !== 'string' || !t.id.trim()) continue;
const key = tenderIdentity(t), old = found.get(key);
if (!old) { found.set(key,{...t,sourceIds:[t.id]}); continue; }
const sourceIds = [...new Set([...old.sourceIds,t.id])];
+4
View File
@@ -11,6 +11,10 @@ test('distinct contract lots and corrections remain separate',()=>{
assert.equal(uniqueTenders([t,t,{...t,id:'b',kisim:'2'}]).length,2);
assert.equal(uniqueTenders([{ikn:'2026/123',id:'1'},{ikn:'2026/123',id:'2',baslik:'Düzeltme ilanı'}]).length,2);
});
test('malformed source rows do not crash pool deduplication',()=>{
const out=uniqueTenders([null,42,{},[],{ikn:'2026/123',baslik:'Eksik kimlik'}]);
assert.deepEqual(out,[]);
});
test('announcement preserves full text and extracts source-backed fields',()=>{
const text='x'.repeat(4500)+' Tarih ve Saati : 10.09.2026 - 10:00 3.3. Teslim edileceği yer : Patoloji laboratuvarı 3.4. Süresi/teslim tarihi : 30 gün 3.5. İşe başlama tarihi : sözleşme';
const d=announcementFields(text);assert.equal(d.aciklama,text);assert.equal(d.saat,'10:00');assert.equal(d.teslimYeri,'Patoloji laboratuvarı');assert.equal(d.teslimatSuresi,'30 gün');