fix: carry source-backed bid validity into preparation drafts

This commit is contained in:
2026-09-06 09:24:38 +03:00
parent e07be66e7f
commit a751147d45
6 changed files with 66 additions and 6 deletions
+1
View File
@@ -32,6 +32,7 @@ export function bidSourceSnapshot(tender, results, rows = sourceRows(tender, res
announcement: tender?.aciklama || '',
deadline: [tender?.tarih || '', tender?.saat || ''],
documentVersion: results?.documentVersion ?? tender?.documentVersion ?? null,
procurementTerms: results?.procurementTerms || null,
analyzedItems: results?.itemsAndSpecs || [],
rows: rows.map(r => r.priceKey).sort(),
documents: results?.documentChecklist || [],
+19
View File
@@ -0,0 +1,19 @@
// Extract only explicitly labelled bid validity clauses; delivery/warranty days are unrelated.
export function extractBidValidity(text) {
const source=String(text || '');
const pattern=/teklif(?:lerin|in)?\s+geçerlilik\s+süresi[^\n.\d]{0,100}(\d{1,4})(?:\s*\([^)]{0,80}\))?\s*(?:takvim\s*)?gün/giu;
const evidence=[];
for(const match of source.toLocaleLowerCase('tr-TR').matchAll(pattern)) {
const days=Number(match[1]);
if(days>0) evidence.push({days,quote:source.slice(match.index,match.index+match[0].length),start:match.index,end:match.index+match[0].length});
}
const values=[...new Set(evidence.map(e=>e.days))];
return {status:values.length>1?'conflict':values.length?'found':'not_found',days:values.length===1?values[0]:null,evidence};
}
export function bidValidityForForm(announcement, analyzed) {
const local=extractBidValidity(announcement);
const evidence=[...local.evidence,...(Array.isArray(analyzed?.evidence)?analyzed.evidence:[])];
const values=[...new Set(evidence.map(e=>e.days).filter(d=>Number.isInteger(d)&&d>0))];
return {status:values.length>1?'conflict':values.length?'found':'not_found',days:values.length===1?values[0]:null,evidence};
}