prefer official EKAP detail deadline
This commit is contained in:
Vendored
+3
-1
@@ -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' },
|
||||
];
|
||||
|
||||
@@ -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ı/);
|
||||
});
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user