skip malformed tender rows during deduplication
This commit is contained in:
@@ -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.
|
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ı.
|
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ı.
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ export function tenderIdentity(t) {
|
|||||||
export function uniqueTenders(records) {
|
export function uniqueTenders(records) {
|
||||||
const found = new Map();
|
const found = new Map();
|
||||||
for (const t of records) {
|
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);
|
const key = tenderIdentity(t), old = found.get(key);
|
||||||
if (!old) { found.set(key,{...t,sourceIds:[t.id]}); continue; }
|
if (!old) { found.set(key,{...t,sourceIds:[t.id]}); continue; }
|
||||||
const sourceIds = [...new Set([...old.sourceIds,t.id])];
|
const sourceIds = [...new Set([...old.sourceIds,t.id])];
|
||||||
|
|||||||
@@ -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([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);
|
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',()=>{
|
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 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');
|
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');
|
||||||
|
|||||||
Reference in New Issue
Block a user