Unify and validate bid totals across screen and exports

This commit is contained in:
2026-09-06 13:16:49 +03:00
parent 6fd6ac04f4
commit 3096ca45cd
6 changed files with 72 additions and 8 deletions
+6 -5
View File
@@ -6,7 +6,7 @@ import { getToken } from '../services/auth';
import { listDocuments, downloadDocument, validateDocumentTextReview } from '../services/account';
import { tenderDateKey } from '../services/tenderCalendar';
import React, { useState, useMemo, useEffect, useRef, useId } from 'react';
import { bidRowTotal, validateBidRows, roundMoney, parseBidPrice } from '../services/bidValidation';
import { bidRowTotal, validateBidRows, bidTotal, bidAmount } from '../services/bidValidation';
import { sourceRows, bidSourceSnapshot, restoreBidPrices, bidSourceOptions } from '../services/bidSource';
import { rowLot, selectBidLots } from '../services/bidLots';
import { PreparationChecks } from './PreparationChecks';
@@ -117,7 +117,7 @@ export const BidPackageBuilder = ({ results, tender: selectedTender }) => {
[kalemler, fiyatlar, partialBid],
);
const kalemToplami = useMemo(() => roundMoney(satirlar.reduce((t,r) => t + (bidRowTotal(r) ?? 0),0)), [satirlar]);
const kalemToplami = useMemo(() => bidTotal(satirlar), [satirlar]);
const latestDraft = useRef('');
latestDraft.current = JSON.stringify([firma,teklifTuru,gecerlilikGun,kisim,goturuBedel,fiyatlar,sourceSnapshot,reviewedSource,checks,manualDocuments,partialBid,itemSource]);
const mounted = useRef(true);
@@ -132,7 +132,7 @@ export const BidPackageBuilder = ({ results, tender: selectedTender }) => {
else setHata('Taslak kaydedilemedi. Tekrar deneyin.');
};
const toplam = teklifTuru === 'goturu' ? (parseBidPrice(goturuBedel) || 0) : kalemToplami;
const toplam = teklifTuru === 'goturu' ? bidAmount(goturuBedel) : kalemToplami;
const eksikler = ALANLAR.filter((a) => a.zorunlu && !String(firma[a.k] || '').trim());
const kalemEksik = teklifTuru === 'birim' && validateBidRows(satirlar).length > 0;
@@ -157,7 +157,8 @@ export const BidPackageBuilder = ({ results, tender: selectedTender }) => {
...(teklifTuru === 'birim' ? (satirlar.length ? satirlar.flatMap((row,i)=>
validateBidRows([row]).length ? [{target:`price:${row.priceKey}`,text:`${i+1}. kalem (${row.name || 'Adı eksik'}): ad, miktar, birim ve fiyatı kontrol edin.`}] : [])
: [{target:'pricing',text:'Resmi teklif cetvelindeki kalemleri yükleyin veya kısım seçimini tamamlayın.'}]) : []),
...(teklifTuru === 'goturu' && !(toplam > 0) ? [{target:'lumpSum',text:'Geçerli, sıfırdan büyük toplam teklif bedeli girin.'}] : []),
...(teklifTuru === 'goturu' && !(toplam > 0) ? [{target:'lumpSum',text:'Toplam teklif bedeli geçersiz veya hesaplama sınırını aşıyor. Pozitif ve kuruşa yuvarlanabilir bir tutar girin.'}] : []),
...(teklifTuru === 'birim' && !kalemEksik && toplam === null ? [{target:'pricing',text:'Genel toplam geçersiz veya güvenli hesaplama sınırını aşıyor. Miktarları ve fiyatları kontrol edin.'}] : []),
...kontrolEksikleri.map(text=>({target:'checks',text})),
];
@@ -502,7 +503,7 @@ export const BidPackageBuilder = ({ results, tender: selectedTender }) => {
<div className="bg-slate-900 text-white rounded-xl p-4 space-y-1">
<div className="flex items-baseline justify-between gap-3 flex-wrap">
<span className="text-xs font-semibold text-slate-300">Teklif toplamı (KDV hariç)</span>
<span className="text-lg font-black text-amber-300">{paraTR(toplam)} TL</span>
<span className="text-lg font-black text-amber-300">{toplam === null ? 'Hesaplanamadı — fiyatları kontrol edin' : `${paraTR(toplam)} TL`}</span>
</div>
{toplam > 0 && (
<p className="text-[11px] text-slate-400 leading-relaxed">Yazı ile: {yaziylaTL(toplam)}</p>