prefer official EKAP detail deadline

This commit is contained in:
2026-09-06 19:44:29 +03:00
parent 74e784e2f7
commit 9fd1db3c8a
9 changed files with 393 additions and 5 deletions
+3 -1
View File
@@ -3,6 +3,8 @@ export const healthAcceptanceCases = [
{ ikn: '1582991', city: 'Giresun', date: '10.09.2026', time: '10:00', scenario: 'mikroskop' },
{ ikn: '1534665', city: 'Kayseri', date: '22.09.2026', time: '11:00', scenario: 'sarf' },
{ ikn: '1499061', city: 'Akdeniz', date: '22.09.2026', time: '10:30', scenario: 'cihaz-servis' },
{ ikn: '1573235', city: 'Aksaray', date: '09.09.2026', time: '10:00', scenario: 'kismi-teklif' },
// EKAP ihaleBilgi.ihaleTarihSaat is authoritative; the older announcement
// HTML contains 09.09.2026 and is retained only as a source discrepancy.
{ ikn: '1573235', city: 'Aksaray', date: '16.09.2026', time: '10:00', scenario: 'kismi-teklif' },
{ ikn: '1523851', city: 'Tepecik', date: '11.09.2026', time: '10:00', scenario: '100-kalem' },
];
+23
View File
@@ -0,0 +1,23 @@
import { test } from 'node:test';
import assert from 'node:assert/strict';
import fs from 'node:fs';
const evidence = JSON.parse(fs.readFileSync(new URL('../docs/quality/evidence/qa-official-five-tenders.json', import.meta.url), 'utf8'));
test('official five-tender evidence is complete and records the Aksaray date discrepancy', () => {
assert.equal(evidence.scope, 'Salt okunur EKAP API sorgusu; teklif, ödeme veya başvuru gönderilmedi.');
assert.equal(evidence.cases.length, 5);
assert.equal(new Set(evidence.cases.map((item) => item.ikn)).size, 5);
for (const item of evidence.cases) {
assert.equal(item.status, 'İhale İlanı Yayımlanmış, Katılıma Açık');
assert.equal(item.announcementPresent, true);
assert.match(item.tenderDateTime, /^\d{2}\.\d{2}\.2026 \d{2}:\d{2}$/);
assert.ok(item.textChars > 100);
assert.ok(item.textSha256);
}
const aksaray = evidence.cases.find((item) => item.ikn === '2026/1573235');
assert.equal(aksaray.tenderDateTime, '16.09.2026 10:00');
assert.equal(aksaray.parsedAnnouncement.tarih, '16.09.2026');
assert.equal(aksaray.dateConsistency.announcementHtml, '09.09.2026 10:00');
assert.match(aksaray.parsedAnnouncement.sourceDateWarning, /güncel detay tarihi esas alındı/);
});
+17 -1
View File
@@ -1,6 +1,6 @@
import {test} from 'node:test';
import assert from 'node:assert/strict';
import {uniqueTenders,announcementFields} from '../server/tender-quality.mjs';
import {uniqueTenders,announcementFields,officialDateFields,mergeAnnouncementFields} from '../server/tender-quality.mjs';
test('duplicate DT records merge without merging another institution or losing source identities',()=>{
const t={id:'dt-1',ikn:'26DT1693370',kurum:'Hastane'};
const out=uniqueTenders([t,{...t,id:'dt-2',aciklama:'Tam metin'},{...t,id:'dt-3',kurum:'Başka hastane'}]);
@@ -49,3 +49,19 @@ test('announcement deadline parser accepts common label variants',()=>{
assert.equal(d.saat,['09:30','14:15','08:05'][i]);
}
});
test('official EKAP detail date takes precedence over stale announcement date',()=>{
const official=officialDateFields('16.09.2026 10:00');
assert.deepEqual(official,{tarih:'16.09.2026',saat:'10:00',sourceDateTime:'16.09.2026 10:00'});
const merged=mergeAnnouncementFields('2.1. Tarih ve Saati: 09.09.2026 - 10:00',official);
assert.equal(merged.tarih,'16.09.2026');
assert.equal(merged.saat,'10:00');
assert.match(merged.sourceDateWarning,/Resmî ihale detay tarihi/);
});
test('official date merge preserves announcement fields when dates agree',()=>{
const merged=mergeAnnouncementFields('2.1. Tarih ve Saati: 10.09.2026 - 10:00',officialDateFields('2026-09-10T10:00:00'));
assert.equal(merged.tarih,'10.09.2026');
assert.equal(merged.saat,'10:00');
assert.equal(merged.sourceDateWarning,undefined);
});