Persist document processing outcomes separately from upload success
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import { documentProcessingLabel } from '../services/documentProcessing';
|
||||
import React, { useState, useEffect, useRef, useCallback } from 'react';
|
||||
import { useApp } from '../context/AppContext';
|
||||
import { getToken } from '../services/auth';
|
||||
@@ -49,16 +50,17 @@ export const TenderDocuments = ({ tender }) => {
|
||||
// otomatik çıkarır. PDF tarayıcıda çözüldüğü için metni biz göndeririz.
|
||||
const cevap = await uploadDocument(f, 'İhale Dokümanı', ikn, {documentType:'ihale'});
|
||||
let kalem = cevap?.kalem?.sayi || null;
|
||||
let kalemHata = cevap.processing?.status === 'error' ? cevap.processing.error : null;
|
||||
if (!kalem && ikn && /\.(pdf|txt|md)$/i.test(f.name)) {
|
||||
try {
|
||||
const { text } = await extractText(f);
|
||||
const { kalemCikar } = await import('../services/kalem');
|
||||
const d = await kalemCikar({ ikn, metin: text, dosya: f.name, documentId:cevap.id });
|
||||
kalem = d.sayi || null;
|
||||
} catch { /* kalem çıkmazsa yükleme yine de başarılı sayılır */ }
|
||||
} catch (error) { kalemHata = error.message; }
|
||||
}
|
||||
belgeleriYukle();
|
||||
setBilgi({ yuklendi: f.name, kalem });
|
||||
setBilgi({ yuklendi: f.name, kalem, kalemHata });
|
||||
} catch (err) {
|
||||
setError(err.kod === 'KOTA_ASILDI' ? err.message : `Yüklenemedi: ${err.message}`);
|
||||
} finally { setYukleniyor(false); }
|
||||
@@ -283,6 +285,7 @@ export const TenderDocuments = ({ tender }) => {
|
||||
{bilgi.yuklendi && (
|
||||
<>
|
||||
<strong>{bilgi.yuklendi}</strong> yüklendi ve bu ihaleye bağlandı.
|
||||
{bilgi.kalemHata && <span role="alert"> Kalem aktarımı tamamlanamadı: {bilgi.kalemHata}. Dosya kaydı korunmuştur.</span>}
|
||||
{bilgi.kalem
|
||||
? <> Teklif cetvelinden <strong>{bilgi.kalem} kalem</strong> otomatik çıkarıldı; bu ihale artık kalemleriyle listeleniyor.</>
|
||||
: <> Bu dosyadan teklif cetveli kalemi çıkarılamadı.</>}
|
||||
@@ -339,7 +342,7 @@ export const TenderDocuments = ({ tender }) => {
|
||||
{belgeler.map((b) => (
|
||||
<div key={b.id} className="flex items-center gap-2 bg-white border border-slate-200 rounded-lg px-2.5 py-2">
|
||||
<FileText className="w-3.5 h-3.5 text-slate-400 shrink-0" />
|
||||
<span className="text-xs text-slate-800 truncate flex-1" title={b.ad}>{b.ad}</span>
|
||||
<span className="text-xs text-slate-800 truncate flex-1" title={b.ad}>{b.ad}</span><span className="block text-[10px] text-slate-500">{documentProcessingLabel(b.isleme)}</span>
|
||||
<span className="text-[10px] text-slate-400 whitespace-nowrap">
|
||||
{(b.boyut / 1024).toLocaleString('tr-TR', { maximumFractionDigits: 0 })} KB
|
||||
</span>
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { documentProcessingLabel } from '../../services/documentProcessing';
|
||||
import React, { useState, useEffect, useRef } from 'react';
|
||||
import { useApp } from '../../context/AppContext';
|
||||
import { listDocuments, uploadDocument, deleteDocument, downloadDocument, formatBayt, updateDocumentMeta } from '../../services/account';
|
||||
@@ -67,14 +68,17 @@ export const DocumentVault = () => {
|
||||
const cevap = await uploadDocument(f, 'İhale Dokümanı', ikn, { otoIkn: true, documentType:'ihale' });
|
||||
ikn = cevap?.ikn || ikn;
|
||||
let kalem = cevap?.kalem?.sayi || null;
|
||||
let kalemHata = cevap.processing?.status === 'error' ? cevap.processing.error : null;
|
||||
if (ikn && !kalem && metin) {
|
||||
try {
|
||||
const { kalemCikar } = await import('../../services/kalem');
|
||||
kalem = (await kalemCikar({ ikn, metin, dosya: f.name, documentId:cevap.id })).sayi || null;
|
||||
} catch { /* kalem çıkmazsa yükleme yine başarılı */ }
|
||||
} catch (error) { kalemHata = error.message; }
|
||||
}
|
||||
guncelle(i, { durum: 'tamam', ikn, kalem });
|
||||
guncelle(i, { durum: 'tamam', ikn, kalem, kalemHata });
|
||||
setDurum(cevap);
|
||||
try { setDurum(await listDocuments()); }
|
||||
catch { setHata('Dosya kayıtlı; güncel belge listesi alınamadı. Listeyi yeniden yükleyin.'); }
|
||||
} catch (err) {
|
||||
guncelle(i, { durum: 'hata', hata: err.message });
|
||||
}
|
||||
@@ -218,6 +222,7 @@ export const DocumentVault = () => {
|
||||
{t.ikn
|
||||
? <span className="font-mono font-bold text-amber-300">{t.ikn}</span>
|
||||
: <span className="text-amber-200/80">İKN bulunamadı — ihaleye bağlanmadı</span>}
|
||||
{t.kalemHata && <span role="alert" className="text-amber-200">Dosya kayıtlı; kalem aktarımı başarısız: {t.kalemHata}</span>}
|
||||
{t.kalem ? <span className="text-emerald-300 font-bold flex items-center gap-1"><Package className="w-3 h-3" />{t.kalem} kalem</span> : null}
|
||||
</span>
|
||||
)}
|
||||
@@ -254,6 +259,7 @@ export const DocumentVault = () => {
|
||||
</p>
|
||||
<p className="text-[10px] text-slate-400 mt-0.5">
|
||||
{new Date(d.olusturma).toLocaleString('tr-TR')}
|
||||
<span className="block">{documentProcessingLabel(d.isleme)}</span>
|
||||
</p>
|
||||
<label className="flex items-center gap-1.5 mt-1.5 text-[10px] text-slate-500">
|
||||
<CalendarClock className={`w-3 h-3 ${kalanGun(d) != null && kalanGun(d) < 0 ? 'text-red-600' : kalanGun(d) != null && kalanGun(d) <= 30 ? 'text-amber-600' : 'text-slate-400'}`} />
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
export function documentProcessingLabel(processing) {
|
||||
const labels={processed:`Kalem çıkarımı tamamlandı (${processing?.count || 0} kalem)`,
|
||||
no_items:'Kalem çıkarılamadı — resmi cetveli kontrol edin',
|
||||
awaiting_text:'Dosya kayıtlı; metin/kalem aktarımı bekleniyor',
|
||||
unsupported:'Dosya kayıtlı; bu biçimde kalem çıkarımı desteklenmiyor',
|
||||
needs_tender:'Dosya kayıtlı; İKN bağlantısı gerekli',
|
||||
not_applicable:'Özel firma belgesi — ortak kalem aktarımı yapılmaz',
|
||||
error:processing?.error || 'Dosya kayıtlı; kalem çıkarımında hata oluştu'};
|
||||
return labels[processing?.status] || 'İşleme durumu doğrulanmadı';
|
||||
}
|
||||
Reference in New Issue
Block a user