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
+24
View File
@@ -0,0 +1,24 @@
export function quantityParts(value) {
if (typeof value === 'number') return {miktar:Number.isFinite(value) ? value : null,birim:''};
const match = /^\s*([+-]?[\d]+(?:[.,]\d+)*)\s+(.+?)\s*$/.exec(String(value || ''));
if (!match) return {miktar:null,birim:''};
const raw = match[1];
const normalized = raw.includes(',') ? raw.replace(/\./g,'').replace(',','.')
: /^\d{1,3}(?:\.\d{3})+$/.test(raw) ? raw.replace(/\./g,'') : raw;
const number = Number(normalized);
return {miktar:Number.isFinite(number) ? number : null,birim:match[2]};
}
export const roundMoney = n => Math.round((n + Number.EPSILON) * 100) / 100;
export function bidRowTotal(row) {
const {miktar} = quantityParts(row.quantity);
const price = Number(row.birimFiyat);
return miktar > 0 && Number.isFinite(price) && price > 0 ? roundMoney(miktar * price) : null;
}
export function validateBidRows(rows) {
if (!rows.length) return ['Resmi teklif cetvelindeki kalemler eksik.'];
return rows.flatMap((row,i) => {
const {miktar,birim} = quantityParts(row.quantity);
return (!row.name?.trim() || !(miktar > 0) || !birim || bidRowTotal(row) === null)
? [`${i+1}. kalemin adı, miktarı, birimi veya fiyatı eksik/geçersiz.`] : [];
});
}