fix: preserve bid drafts and align tender source data
This commit is contained in:
@@ -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.`] : [];
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user