fix: preserve bid drafts and align tender source data

This commit is contained in:
2026-09-06 08:40:10 +03:00
parent c91631d99f
commit 456728b4bd
26 changed files with 510 additions and 81 deletions
+27
View File
@@ -0,0 +1,27 @@
export const RATE_SOURCE = 'https://www.tcmb.gov.tr/kurlar/today.xml';
export function parseRates(xml) {
const bulletinDate = /<Tarih_Date\b[^>]*\bTarih="([^"]+)"/.exec(xml)?.[1];
if (!bulletinDate) throw new Error('TCMB bülten tarihi okunamadı.');
const rates={};
for (const code of ['USD','EUR']) {
const block=new RegExp(`<Currency\\b[^>]*CurrencyCode="${code}"[^>]*>([\\s\\S]*?)</Currency>`).exec(xml)?.[1];
const unit=Number(/<Unit>([^<]+)<\/Unit>/.exec(block || '')?.[1]);
const selling=Number(/<ForexSelling>([^<]+)<\/ForexSelling>/.exec(block || '')?.[1]);
if (!(unit>0) || !(selling>0)) throw new Error(`${code} döviz satış kuru okunamadı.`);
rates[code]=selling/unit;
}
return {bulletinDate,rates,type:'Döviz satış',source:RATE_SOURCE};
}
let cache;
export async function exchangeRates() {
if (cache && Date.now()-cache.at<15*60*1000) return {...cache.value,cached:true};
try {
const response=await fetch(RATE_SOURCE,{signal:AbortSignal.timeout(10000)});
if (!response.ok) throw new Error('TCMB kaynağına ulaşılamadı.');
const value={...parseRates(await response.text()),fetchedAt:new Date().toISOString()};
cache={at:Date.now(),value};return {...value,cached:false};
} catch(error) {
if(cache) return {...cache.value,cached:true,refreshError:'Güncelleme alınamadı; gösterilen bülten tarihini kontrol edin.'};
throw new Error('Kur alınamadı. Daha sonra yeniden deneyin.');
}
}