validate exchange calculator amounts
This commit is contained in:
@@ -1988,3 +1988,9 @@ Doğrulama: 287 test geçti, üretim derlemesi başarılı.
|
|||||||
İhale dokümanı paneli artık PDF metin ayrıştırıcısını yalnızca kullanıcı PDF okuma/kalem çıkarma istediğinde yüklüyor; ilk uygulama açılışındaki JavaScript yükü azaltıldı. Üretim derlemesindeki büyük üçüncü taraf chunk uyarıları (PDF/ExcelJS) devam ediyor ve sonraki performans çalışmasının girdisi olarak kaydedildi.
|
İhale dokümanı paneli artık PDF metin ayrıştırıcısını yalnızca kullanıcı PDF okuma/kalem çıkarma istediğinde yüklüyor; ilk uygulama açılışındaki JavaScript yükü azaltıldı. Üretim derlemesindeki büyük üçüncü taraf chunk uyarıları (PDF/ExcelJS) devam ediyor ve sonraki performans çalışmasının girdisi olarak kaydedildi.
|
||||||
|
|
||||||
Doğrulama: 287 test geçti, üretim derlemesi başarılı.
|
Doğrulama: 287 test geçti, üretim derlemesi başarılı.
|
||||||
|
|
||||||
|
### 2026-09-06 · Kur hesaplayıcı giriş sınırı
|
||||||
|
|
||||||
|
Kur farkı hesaplayıcısı artık negatif, sonsuz veya güvenli sınır dışı teklif tutarlarını kabul etmiyor; hatalı girişte açık uyarı gösterip USD/EUR dönüşüm sonucunu üretmiyor.
|
||||||
|
|
||||||
|
Doğrulama: 287 test geçti, üretim derlemesi başarılı.
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ export const TenderDetailModal = () => {
|
|||||||
|
|
||||||
// Kur Farkı Calculator State
|
// Kur Farkı Calculator State
|
||||||
const [bidAmount, setBidAmount] = useState(15000);
|
const [bidAmount, setBidAmount] = useState(15000);
|
||||||
|
const [bidAmountError, setBidAmountError] = useState(null);
|
||||||
const [fx, setFx] = useState(null);
|
const [fx, setFx] = useState(null);
|
||||||
const [fxError, setFxError] = useState(null);
|
const [fxError, setFxError] = useState(null);
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -48,6 +49,7 @@ export const TenderDetailModal = () => {
|
|||||||
const usdRate = fx?.rates?.USD;
|
const usdRate = fx?.rates?.USD;
|
||||||
const eurRate = fx?.rates?.EUR;
|
const eurRate = fx?.rates?.EUR;
|
||||||
const fxIsStale = Boolean(fx?.refreshError);
|
const fxIsStale = Boolean(fx?.refreshError);
|
||||||
|
const bidAmountValid = Number.isFinite(bidAmount) && bidAmount >= 0 && bidAmount <= 1e12;
|
||||||
|
|
||||||
if (!activeTenderDetail) return null;
|
if (!activeTenderDetail) return null;
|
||||||
// Havuzdaki güncel kayıt: takip/görev değişince düğme etiketleri de değişsin.
|
// Havuzdaki güncel kayıt: takip/görev değişince düğme etiketleri de değişsin.
|
||||||
@@ -374,19 +376,27 @@ export const TenderDetailModal = () => {
|
|||||||
<input
|
<input
|
||||||
type="number"
|
type="number"
|
||||||
value={bidAmount}
|
value={bidAmount}
|
||||||
onChange={(e) => setBidAmount(Number(e.target.value))}
|
min="0"
|
||||||
|
max="1000000000000"
|
||||||
|
step="0.01"
|
||||||
|
onChange={(e) => {
|
||||||
|
const value = Number(e.target.value);
|
||||||
|
setBidAmount(value);
|
||||||
|
setBidAmountError(Number.isFinite(value) && value >= 0 && value <= 1e12 ? null : 'Tutar 0 ile 1.000.000.000.000 TL arasında olmalıdır.');
|
||||||
|
}}
|
||||||
className="w-full bg-white/10 border border-white/20 rounded-lg px-3 py-1.5 text-xs text-white"
|
className="w-full bg-white/10 border border-white/20 rounded-lg px-3 py-1.5 text-xs text-white"
|
||||||
/>
|
/>
|
||||||
|
{bidAmountError && <p role="alert" className="text-xs text-amber-200">{bidAmountError}</p>}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="bg-blue-950/80 p-3 rounded-lg border border-blue-800 text-xs space-y-1">
|
<div className="bg-blue-950/80 p-3 rounded-lg border border-blue-800 text-xs space-y-1">
|
||||||
<div className="flex justify-between text-slate-300">
|
<div className="flex justify-between text-slate-300">
|
||||||
<span>Dolar Karşılığı:</span>
|
<span>Dolar Karşılığı:</span>
|
||||||
<span className="font-bold text-white">{usdRate ? '$' + (bidAmount / usdRate).toFixed(2) : 'Kur bekleniyor'}</span>
|
<span className="font-bold text-white">{!usdRate ? 'Kur bekleniyor' : bidAmountValid ? '$' + (bidAmount / usdRate).toFixed(2) : 'Geçerli tutar gerekli'}</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex justify-between text-slate-300">
|
<div className="flex justify-between text-slate-300">
|
||||||
<span>Euro Karşılığı:</span>
|
<span>Euro Karşılığı:</span>
|
||||||
<span className="font-bold text-white">{eurRate ? '€' + (bidAmount / eurRate).toFixed(2) : 'Kur bekleniyor'}</span>
|
<span className="font-bold text-white">{!eurRate ? 'Kur bekleniyor' : bidAmountValid ? '€' + (bidAmount / eurRate).toFixed(2) : 'Geçerli tutar gerekli'}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user