fix: order new tenders by validated publication time

This commit is contained in:
2026-09-06 09:20:45 +03:00
parent f593d5e372
commit efec6e434d
4 changed files with 54 additions and 17 deletions
+31 -12
View File
@@ -16,22 +16,41 @@ export const ihaleGunu = (v) => {
return key ? new Date(key+'T00:00:00+03:00') : null;
};
// Her biçimi "yyyy-aa-gg" dizesine indirger (karşılaştırma için).
export const ilanTarihiISO = (t) => {
const v = String(t?.ilanTarihi || '').trim();
let m = /^(\d{4})-(\d{2})-(\d{2})/.exec(v);
if (m) return `${m[1]}-${m[2]}-${m[3]}`;
m = /^(\d{2})\.(\d{2})\.(\d{4})/.exec(v);
if (m) return `${m[3]}-${m[2]}-${m[1]}`;
return '';
};
// Publication metadata is distinct from the tender deadline.
export function publicationInfo(t) {
for (const value of [t?.yayinZamani,t?.ilanTarihi]) {
const v=String(value || '').trim();
const m=/^(\d{4})-(\d{2})-(\d{2})(?:[T ](\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{1,7}))?)?(Z|[+-]\d{2}:\d{2})?)?$/.exec(v);
const tr=/^(\d{2})\.(\d{2})\.(\d{4})$/.exec(v);
const key=m ? tenderDateKey({tarih:`${m[3]}.${m[2]}.${m[1]}`}) : tr ? tenderDateKey({tarih:v}) : null;
if (!key) continue;
if (!m?.[4]) return {dateKey:key,timestamp:null};
if (+m[4]>23 || +m[5]>59 || +(m[6] || 0)>59) continue;
// Offset-free Turkish source timestamps use Istanbul, never the browser timezone.
const stamp=Date.parse(`${key}T${m[4]}:${m[5]}:${m[6] || '00'}${m[7] ? '.'+m[7].slice(0,3) : ''}${m[8] || '+03:00'}`);
if (Number.isFinite(stamp)) return {dateKey:istanbulDateKey(new Date(stamp)),timestamp:stamp};
}
return {dateKey:null,timestamp:null};
}
export const ilanTarihiISO = t => publicationInfo(t).dateKey || '';
export function compareTenderPublications(a,b) {
const x=publicationInfo(a),y=publicationInfo(b);
if (!x.dateKey || !y.dateKey) return x.dateKey ? -1 : y.dateKey ? 1 : 0;
const day=y.dateKey.localeCompare(x.dateKey);
if (day) return day;
if (x.timestamp === null || y.timestamp === null) return x.timestamp !== null ? -1 : y.timestamp !== null ? 1 : 0;
return y.timestamp-x.timestamp;
}
const iso = istanbulDateKey;
export const bugunISO = () => iso(new Date());
export const bugunISO = (now = new Date()) => iso(now);
// Bugün yayımlanan ilan. Sunucunun isYeni bayrağı esas; o yoksa ilan tarihine bakılır.
export const bugunEklendi = (t) => Boolean(t?.isYeni) || (ilanTarihiISO(t) !== '' && ilanTarihiISO(t) === bugunISO());
// Bugün yayımlanan ilan. Bilinen yayın tarihi esas; yalnız tarih yoksa kaynak bayrağı kullanılır.
export const bugunEklendi = (t, now = new Date()) => {
const day=ilanTarihiISO(t);
return day ? day === bugunISO(now) : Boolean(t?.isYeni);
};
// Önceki ziyaretten (ms) sonra yayımlanan ilan. Kayıt yoksa "bugün" kabul edilir.
export const girisSonrasiEklendi = (t, oncekiGirisMs) => {