hikmettan
9c7055a543
fix: align list expiry and date ordering with tender deadlines
2026-09-06 09:18:41 +03:00
hikmettan
a87ee758bc
fix: restrict PWA cache and report actual offline capabilities
2026-09-06 09:17:15 +03:00
hikmettan
37b10ce09a
fix: clean failed document uploads and surface filesystem errors
2026-09-06 09:15:34 +03:00
hikmettan
43dc4feb31
fix: validate document uploads and allow clearing expiry dates
2026-09-06 09:14:43 +03:00
hikmettan
0d2cf584e7
fix: require explicit choice for conflicting bid item sources
2026-09-06 09:13:26 +03:00
hikmettan
c3264149ea
fix: support keyboard navigation in tender details
2026-09-06 09:12:07 +03:00
hikmettan
2aaf56ce8b
fix: validate nested analysis fields before merging and preparation
2026-09-06 09:10:18 +03:00
hikmettan
144724484c
fix: align server deadlines and follow consumers with preparation state
2026-09-06 09:09:10 +03:00
hikmettan
7ad5fb4f50
fix: preserve newer tender note drafts after delayed saves
2026-09-06 09:07:23 +03:00
hikmettan
d4d9d17a9f
feat: verify offline user data backup and recovery
2026-09-06 09:04:03 +03:00
hikmettan
f88a0c7bfe
fix: persist explicit review status and align review counters
2026-09-06 09:02:28 +03:00
hikmettan
a9036cf909
feat: verify analysis citations against source text
2026-09-06 09:00:16 +03:00
hikmettan
0ae828163a
feat: analyze complete long documents in bounded source parts
2026-09-06 08:58:54 +03:00
hikmettan
90d85060f2
fix: expose incomplete AI analysis and track source versions
2026-09-06 08:57:32 +03:00
hikmettan
ca92bebb45
feat: export validated bid sheets as real Excel workbooks
2026-09-06 08:56:12 +03:00
hikmettan
2dfd32aa9c
fix: invalidate pending bid output when preparation changes
2026-09-06 08:54:22 +03:00
hikmettan
953d3b5c1e
feat: validate preparation against owned document files
2026-09-06 08:53:41 +03:00
hikmettan
0d332afdb1
feat: prepare bids by official lot selection
2026-09-06 08:52:07 +03:00
hikmettan
311344306b
fix: preserve Turkish decimal prices and verify preparation persistence
2026-09-06 08:50:18 +03:00
hikmettan
b94ab97241
fix: unify tender countdowns and add monthly calendar navigation
2026-09-06 08:47:44 +03:00
hikmettan
a291b186df
fix: isolate account state and ignore stale session responses
2026-09-06 08:46:05 +03:00
hikmettan
05c7e7ecdc
fix: share persisted preparation checks across analysis screens
2026-09-06 08:44:10 +03:00
hikmettan
e4b02f5dd3
feat: track document and health product preparation checks
2026-09-06 08:42:59 +03:00
hikmettan
465874ebbb
fix: bind bid prices and review to source content
2026-09-06 08:41:14 +03:00
hikmettan
456728b4bd
fix: preserve bid drafts and align tender source data
2026-09-06 08:40:10 +03:00
hikmettan
c91631d99f
fix: persist tender preparation and correct calendar export
2026-09-06 08:30:32 +03:00
hikmettan and Claude Fable 5.1
909ebae7c2
fix(pwa): önbellek v2 — yanlış MIME ile saklanan pdf worker temizlenir, bozuk JS yanıtları artık önbelleğe alınmaz
...
nginx düzeltmesi tek başına yetmezdi: servis çalışanı /assets/ dosyalarını
cache-first sakladığı için kullanıcıların tarayıcısındaki octet-stream'li
worker kopyası redeploy sonrasında da kullanılmaya devam ederdi. Sürüm
yükseltilince eski önbellek silinir; ayrıca .js/.mjs dosyaları yalnızca
JavaScript MIME tipiyle ve 200 ile geldiğinde saklanır.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-06 01:02:35 +03:00
hikmettan and Claude Fable 5.1
3a0403f07f
fix: PDF okuma — nginx .mjs worker dosyasını octet-stream sunuyordu, tarayıcı worker'ı reddediyordu
...
pdfjs worker'ı Vite tarafından pdf.worker.min-<hash>.mjs olarak üretiliyor.
Debian nginx'in mime.types dosyasında mjs uzantısı olmadığından dosya
application/octet-stream ile geliyor; tarayıcılar modül worker'ını yalnızca
JavaScript MIME tipiyle yüklediği için her PDF yüklemesinde
"Setting up fake worker failed: Failed to fetch dynamically imported module"
hatası çıkıyor, belge analizi tamamlanamıyordu. mjs → application/javascript
eşlemesi eklendi (nginx -t ile doğrulandı).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-06 01:02:04 +03:00
hikmettan and Claude Fable 5.1
2271883be4
fix: EKAP dokümanları açılmıyor — yeni sekme tıklama anında açılıyor, boşluklu İKN'ler düzeltildi
...
İki ayrı neden vardı:
1) window.open sunucu yanıtından SONRA çağrılıyordu; Safari, PWA ve sıkı ayarlı
Chrome bunu açılır-pencere sayıp sessizce engelliyordu — düğme "çalışmıyor"
görünüyordu. Sekme artık tıklamanın hemen içinde boş açılır, adres gelince
yönlendirilir. Engellenirse gerçek bir bağlantı (a href) gösterilir; bağlantı
tıklaması hiçbir tarayıcıda engellenmez.
2) ilan.gov.tr bazı kayıtlarda İKN'yi başta/sonda boşluk ve kesme boşluğu (nbsp)
ile veriyor (" 2026/1622878"). Bu 50 kayıtta panel "EKAP formatında değil"
deyip düğmeyi hiç göstermiyordu. İKN artık alınırken boşluksuz saklanıyor;
panel ve doküman araması da savunma amaçlı temizliyor.
Ayrıca: "EKAP'ta 0 doküman kayıtlı" yanıltıcı metni kaldırıldı (EKAP arama
kaydı sayıyı vermiyor), EKAP'ın önce güvenlik doğrulaması istediği açıklandı.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-05 23:53:43 +03:00
hikmettan and Claude Fable 5.1
8e9dff6833
TED çevirisi: parçalar 3'lü eşzamanlı — 30 ilanlık liste daha hızlı tamamlanır
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-05 17:08:46 +03:00
hikmettan and Claude Fable 5.1
c32446db81
AB İhaleleri (TED): başlık ve açıklamalar Türkçe
...
- server/ted-ceviri.mjs: TED'in kendi Türkçe alanı varsa onu kullanır; yoksa
OpenRouter ile toplu çevirir (deepseek-v4-flash → gemini 3.7 flash → glm),
sonucu server/data/ted.sqlite'ta ilan numarasına göre saklar
- İstek en fazla 12 sn bekler, kalan çeviriler arka planda sürer;
yanıt ceviriBekleniyor bayrağı taşır, ön yüz sessizce yeniden çeker
- Kartta Türkçe başlık + küçük özgün başlık, Türkçe açıklama (3 satır),
ülke kodları Türkçe ad (TUR → Türkiye, AUT → Avusturya…)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-05 15:58:28 +03:00
hikmettan and Claude Fable 5.1
eeb1447edc
Kalan kişisel varsayılanlar: firma sitesi tarama URL'si ve sonuç kartı kazanan yedeği
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-05 15:36:37 +03:00
hikmettan and Claude Fable 5.1
782b361d24
feat: Gemini Flash ücretli yedek — analiz zincirinin sonunda her zaman denenir
...
Panelde seçilen modeller tıkanınca (limit/429) şartname analizi ve teklif asistanı
boş kalıyordu; analyzeSpec zincire yoksa 'gemini'yi sona ekler. Panel ve kılavuz notu.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-05 13:45:04 +03:00
hikmettan and Claude Fable 5.1
08c0a0af7e
Kullanıcı testi hataları: sabit tarihler, kişisel varsayılanlar, kılavuz düğmesi, mobil başlık, AI taslak çökmesi
...
- Günlük Bülten ve İhale Takvimi sabit "10.08.2026" yerine bugünden hesaplar;
takvim 7 günü gerçek ihale tarihleriyle sayar
- Ekip/üye/firma varsayılanları oturumdaki kullanıcıdan; sahte "Ekip Notları"
ve sabit "%94 Uyum" rozeti kaldırıldı (gerçek uyum skoru varsa gösterilir)
- Kılavuz düğmesi document.body'ye portal (ekran dışına düşüyordu)
- Detay modalı havuzdaki güncel kaydı okur: Takip Et / Görev aç etiketleri güncellenir
- Mobil: başlıkta ikincil düğmeler md altında gizli, arama formu küçülebilir
- PWA sayfası: sahte önbellek sayıları yerine Cache API ve bellek sayımı
- Sözleşme sorgula pazar payı bir ondalık (hep %0 görünüyordu)
- Rakip Radar "SMS" vaadi düzeltildi; sektör=CPV etiketi tekrarı gizlendi;
Stripe kurulum uyarısı yalnız yöneticiye
- Açılışta 7 gereksiz PUT /api/me/data: ilk yükleme yazımı atlanır
- server: teklif taslağı çökmesi (kalemOku nesne döndürür), denetim yanıtından
model adı kaldırıldı, gereklilikler satır bazlı; derin analiz 12k token +
kesik JSON onarımı
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-05 09:43:41 +03:00
hikmettan and Claude Fable 5.1
6d7d938711
Sekme şeridi: 19 sekmeye kendi rengi (ikon tonu + aktif dolgu) — menü daha belirgin
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-05 08:32:03 +03:00
hikmettan and Claude Fable 5.1
6f33adc1b6
feat: landing sayfasına taşınan yeni özellikler (Teklif Asistanı, yeterlilik, MCP+RSS, haftalık brief, yeni bayrak kuralları)
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-04 11:04:19 +03:00
hikmettan and Claude Fable 5.1
25dde198d7
Landing: 'Yeni eklenenler' bölümü (11 yetenek) + derin analiz kartı + Yenilikler nav bağlantısı
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-04 10:03:17 +03:00
hikmettan and Claude Fable 5.1
48f0c48732
feat: İhaleAB'den taşınan özellikler — MCP sunucusu, RSS, haftalık brief, teklif asistanı, yeterlilik rozeti, 5 yeni kırmızı bayrak
...
- /mcp (JSON-RPC, ih_live_ anahtarı): search_tenders, get_tender, search_results, search_items, upcoming_deadlines
- /api/feeds/tenders.rss (anahtarlı) ve /api/feeds/sonuc.rss (açık)
- Haftalık brief (Pazartesi 08:00, Telegram + e-posta), /api/me/brief tercihi + önizleme, sağ panelde yaklaşan ihale tarihleri
- Detayda Teklif Asistanı sekmesi: belgeye sor (atıflı), taslak denetimi, taslak üretimi (analyzeSpec zinciri)
- Derin analiz belge listesi × Doküman Deposu eşleştirme rozeti
- Kırmızı bayrak: kısa süre, hafta sonu tarih, geç sözleşme, kazananı gizli, DT parçalama şüphesi
- Kullanım kılavuzu güncellendi
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-04 02:23:41 +03:00
hikmettan and Claude Fable 5.1
fabff18fe9
feat: mobil uyumlu PWA — manifest, service worker, gercek kurulum, filtre cekmecesi
...
- public/manifest.webmanifest (standalone, tr, kisayollar) + 192/512 ve
maskable ikonlar + apple-touch-icon; index.html PWA meta etiketleri
- public/sw.js: /assets cache-first (hash'li adlar), kabuk network-first,
/api ASLA onbellekten (eski ihale gosterilmesin); surum degisince temizlik
- main.jsx: SW yalniz uretimde kaydedilir (dev'de HMR ile cakismasin)
- Mobil PWA sayfasindaki "Cihaza Yukle" dugmesi sahteydi (setInstalled(true));
artik beforeinstallprompt ile gercek kurulum, standalone algilama, iOS/
Android/masaustu yol tarifi
- Kucuk ekranda sol filtre paneli listeyi 72 satir asagi itiyordu: lg altinda
"Filtreler" dugmesiyle acilan cekmece; sag panel xl altinda gizli
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-04 00:39:40 +03:00
hikmettan and Claude Fable 5.1
acec88a4c4
feat: her sayfada sagdan acilan kullanim kilavuzu (? dugmesi / ? tusu), sekmeye gore icerik
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-04 00:36:55 +03:00
hikmettan and Claude Fable 5.1
91b8ea94b8
feat: sinir deger hesaplayici — Tebliğ md. 79/45 formulleri, 2026 R katsayilari
...
Formuller kaynagindan alindi (mevzuat.gov.tr Kamu Ihale Genel Tebligi,
kullanicinin Chrome'u uzerinden okundu; formuller Teblig'de gorsel oldugu icin
ekran goruntusunden):
- Md. 79.1.2 hizmet (personel dayali olmayan): SD = ((YM + ΣT)/(n+1)) × R,
YM'nin %60 alti ve YM ustu teklifler haric
- Md. 79.1.1 personel calistirmaya dayali: SD = kar haric YM
- Md. 62/A.1 (RG 9/4/2026): mal aliminda 79 uygulanir
- Md. 45.1.1 yapim: Tort1/σ/Tort2, C = Tort2/YM, K parcali, SD = K×Tort2/(C×N);
N 1,00 (B/C/D/E gruplari) veya 1,20 (45.1.1.1)
- R katsayilari: KIK Kurul karari 21.01.2026 (.doc'tan okundu): arac kiralama
0,77, bilgisayar 0,87, yemek 0,77, muhendislik 0,72, sigorta 0,74, tasima
0,78, diger 0,78
Dogrulama: Teblig'in kendi 45.2 ornegi (YM 100.000, N 1,20, 12 teklif) ile
birebir — Tort1 66.270,00, σ 20.317,05, Tort2 63.237,50, C 0,632, K 0,627,
SD 52.281,00. Yuvarlama kurallari ornekteki gibi (2/3 ondalik).
Arac: ust menude "Sinir Deger"; alim turu, YM, teklif listesi, R/N secimi,
"benim teklifim sinirin altinda mi" uyarisi, adim adim hesap.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-04 00:16:58 +03:00
hikmettan and Claude Fable 5.1
df89eaac33
feat: takip izleme (zeyilname + sonuc bildirimi), hazirlik gorevi, belge sure uyarisi, Telegram, OCR, yasakli sorgu
...
28 depo taramasindan alinan alti ozellik. Kod kopyalanmadi (depolar
lisanssiz), fikirler uygulandi.
1) Zeyilname / duzeltme ilani takibi (server/zeyilname.mjs): takipteki
IKN'ler sunucuya yazilir; 3 saatte bir EKAP detayindan ilan sayisi ve
ihale tarihi karsilastirilir, degisince "ne degisti" bildirimi (uygulama
ici + e-posta + Telegram). Test: anlik kaydi eskitilince tur "yeni ilan
yayimlandi; ihale tarihi 01.01.2026 → 08.10.2026" bildirimi uretti.
2) Sonuc bildirimi: takipteki ihale sonuclaninca "X firmasi Y'ye aldi, %Z
kirim". Yalniz takiptekiler; kismi ihalede oran yazilmaz.
3) Ihaleden goreve (MOBIT-DURT): detayda "Hazirlik Gorevi Ac" → teslim
tarihi ihale saati, pano "Teklif Hazirlaniyor", derin analizden gelen
belge kontrol listesi gorevde; Kanban kartinda geri sayim rozeti.
4) Sirket belgesi sure takibi: Belge Kasasi'nda son kullanma tarihi girisi,
dolmus / 30 gun icinde dolacak uyarisi; girise gunde bir bildirim.
PATCH /api/me/documents/meta.
5) Telegram (server/telegram.mjs): TELEGRAM_BOT_TOKEN sunucuda; kullanici
6 haneli kodu bota yazar, "Dogrula" → getUpdates ile chat id baglanir.
Arayuzde adim adim kurulum rehberi (BotFather → env → Redeploy → kod).
Ihale ozeti, zeyilname ve sonuc bildirimleri Telegram'a da gider.
6) OCR (tesseract.js, tur): PDF metin katmani bossa (taranmis) ilk 8 sayfa
OCR. Olcum: sentetik cetvelde guven 87, ~0,3 sn/sayfa; IKN ve kalemler
dogru okundu. Kalem havuzu ve derin analiz artik taranmis PDF'ten de
besleniyor.
7) Rakip Radari'nda KIK yasakli sorgusu baglantisi (firma adi panoya
kopyalanir; EKAP sorguyu API'den vermiyor).
Sinir deger hesaplayici KURULMADI: Kamu Ihale Genel Tebligi'ne ulasilamadi
(mevzuat.gov.tr / ihale.gov.tr bu makineden erisilemiyor); formul kaynaksiz
yazilmadi.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-03 22:58:13 +03:00
hikmettan and Claude Fable 5.1
1716b6365c
feat: hibrit uyum skoru (sozluksel + anlamsal bonus) ve firma esigi
...
Anlamsal bonus: profil metni sunucuda gomulur (multilingual-e5-small, ONNX
q8, @huggingface/transformers — Python/GPU yok), havuzdaki her ihaleyle
kosinus alinir, havuz ici z-skor → +0..20 puan. Sozluksel skor ana eksen
kalir; bonus eklenir. Sozluksel 0 iken bonus yalniz ≥10'sa gorunur.
NEDEN BONUS, ESIK DEGIL (olculdu): e5 kosinusleri 0,79-0,86 bandina
sikisiyor (havuz ort 0,814 sd 0,026); kirtasiye ile rontgen arasi 0,06.
kaanvp/kobi-ihale-eslestirme'nin 0,65 esigiyle trafo bakimi da "eslesti"
sayilirdi. Ama siralama dogru ve sozlukselin kacirdigini yakaliyor: "GENEL
TIBBI SARF" profilde birebir terim yokken kirtasiyenin ustune cikiyor.
- server/uyum-gomme.mjs: acilista arka planda isitma (~45 sn soguk), ihale
gommeleri bellekte (metin imzasi degisince yenilenir), model data/modeller
volume'unda bir kez indirilir; paket/yukleme yoksa sessizce kapali
- POST /api/uyum/gomme, GET /api/health/uyum
- Dockerfile: calisma imajina @huggingface/transformers@3 (package.json'a
degil — sunucu sifir-bagimlilik, calisma katmani ayri npm i)
- Olculen: 3.2 bin ihale ilk cagri 7,6 sn (tumu gomuluyor), ikinci 17 ms;
+20 alan 170, ≥10 alan 610 ihale
Firma esigi: profilde uyumEsigi (varsayilan 60, kalici); "Uyumlu" hizli
filtresi bu esigi kullanir; profil modalinda kaydirici + bonus durumu.
Modaldaki "%98+ dogruluk" cumlesi kaldirildi — olculmemis iddiaydi.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-03 22:32:23 +03:00
hikmettan and Claude Fable 5.1
2c70ed9d71
fix: kismi ihalede sahte kirim orani — maliyet tum ihale, bedel kisim basina
...
Sonuc ayristirici yaklasik maliyeti TUM ihale icin okuyor
((?<!Kısımlarının )Yaklaşık Maliyeti), sozlesme bedeli ise kisim basina
satir. 11 kisimlik ilac ihalesinin ilk kismi 1,6 milyon tahmine karsi 25 bine
verilmisse rakip radarinda "%98 kirim" cikiyordu — aritmetik kurgu.
Kirim artik yalnizca tek sonuc satiri olan (kisimsiz) ihalelerde
hesaplaniyor. Yanlis bir oran, hic oran olmamasindan kotudur.
Test: A (kisimsiz) → %20; B ve C (ayni IKN, iki kisim) → null.
Bulgu kaynagi: erenulutas0/MOBIT-DURT README "olcerek cozulmus uc tuzak".
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-03 22:19:15 +03:00
hikmettan and Claude Fable 5.1
17c781a9ba
feat: gercek sirket-ihale uyum skoru — sahte %98 rozeti gitti
...
Karttaki "%N Uyumlu" rozeti sabit yazili degerlerdi (liveTenderService
98/95/91/99), sunucudan null geliyordu. Artik profil terimleri ile ihale
metni arasinda agirlikli sozcuk eslesmesi (src/services/uyum.js):
- terimler: urunler (1.0), ihale konulari (1.0), sektorler (0.6),
sertifikalar (0.3); "ve/alimi/malzeme" gibi durma kelimeleri sayilmaz
- alanlar: baslik (1.0), teklif cetveli kalemleri (1.1 — en guclu sinyal),
OKAS/CPV (0.7), ilan metni (0.6), sektor (0.5)
- doygunluk egrisi: 1 guclu eslesme ≈ 55, 2 ≈ 75, 3+ ≈ 90
- profilde terim yoksa skor null → sahte yuzde gosterilmez
- her skorun nedeni var: kartta ipucu, detayda "‘eldiven’ · teklif cetveli"
Olculen: "VETERINER ILAC VE SARF MALZEME" basligi hicbir urunu icermiyor ama
kalemlerinde ELDIVEN + HEMOGRAM KITI var → %86; kirtasiye → 0.
- Siralama: "Sirketime En Uyumlu"; hizli filtre 'uyumlu' (≥60)
- Profil yetkinlikleri artik kalici (localStorage + sunucu 'firma_profil');
onceden sayfa yenilenince siliniyordu
- Web sitesi taramasi gercek uca bagli (/api/company/scan: site metni +
model → sektorler/urunler/sertifikalar/ihaleKonulari); basarisizsa eski
alan-adi tahmini yedek. Onceden 1,5 sn setTimeout ile taklitti.
Sozluksel yol bilincli: dis servis yok, 8 bin ihalede aninda, deterministik,
aciklanabilir. Embedding katmani istenirse ustune eklenebilir.
(Fikir: kaanvp/kobi-ihale-eslestirme'nin esik + aciklama deseni; kod alinmadi.)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-03 21:51:28 +03:00
hikmettan and Claude Fable 5.1
1fce9df06f
feat: OKAS kod aramasi, toplu ihale dokumani yukleme, kazanan istihbarati
...
Uc ozellik, 27+1 depo taramasinda gorulen fikirlerden; kod kopyalanmadi
(ilgili depolar lisanssiz), uygulamalar sifirdan yazildi.
1) OKAS koduyla arama (fikir: firatbadur/ihaletakip-api'nin kullandigi
IhtiyacKalemleri/GetAll ucu). EKAP'in kendi OKAS katalogunda ad ile
(TR/EN) arama: "ortoped" → 33141700 Ortopedik malzemeler, 33183000
Ortopedik destek cihazlari. Secilen kodla EKAP'ta ihale aramasi
(okasBransKodList). Olculen: 33141700 altinda 335 ihale, basliklari
"VETERINER ILAC VE SARF MALZEME" — basliktan gorunmeyen turden.
- ekap-v2.mjs: okasAra(), searchByOkas(); sonuc normalize ortak
- GET /api/okas/ara?q= (1 sa onbellek); /api/urun-ara?okas=kod,kod
- Urun Arama modalinda "OKAS koduyla" modu (katalog onerisi + cok kod)
- Sol menude CPV bolumunun ustunde OKAS kutusu: kod secilince modal
o kodla acilip hemen arar
2) Toplu ihale dokumani yukleme (fikir: barkem-tayyar/ihale'nin izlenen
klasor + extractIkn deseni). Belge Kasasi'na coklu dosya secimi: her
dosyanin IKN'si METNINDEN bulunur ("Ihale Kayit Numarasi (IKN):
2026/1166496"), kullaniciya sorulmaz; ihaleye baglanir ve teklif
cetveli kalemleri otomatik havuza yazilir. Onlarca sartnameyi tek
seferde atarak kalem havuzunu hizla doldurmak icin.
- kalem-cikar.mjs#iknCikar + istemci esi (PDF tarayicida okunuyor)
- Yukleme ucu: otoIkn → ofis metninden IKN; donuste ikn alani
- Dosya basina sonuc satiri: IKN / kalem sayisi / "IKN bulunamadi"
Dogrulandi: ikn parametresiz docx → 2026/1588948 bulundu, 2 kalem.
3) Kazanan istihbarati (fikir: gulmezeren2-byte/ihalent, MIT). Rakip
Radari'nda firma basina kirim orani (1 − sozlesme/yaklasik maliyet,
ortalama), ortalama gecerli teklif sayisi (rekabet derinligi) ve tek
teklifle kazanma orani. Veri yoksa null — 0 ile karismasin; bedel >
maliyet×1,5 olan bozuk satirlar orana katilmiyor.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-03 20:16:53 +03:00
hikmettan and Claude Opus 5
9c142fa0f8
feat: EKAP imzalama anahtari rotasyona girince kendini toparlasin
...
Anahtar sabit kodluydu (EKAP_R8FACT_KEY ile gecilebiliyordu). EKAP anahtari
donemsel degistiriyor; degistigi anda ihale havuzu tamamen karariyor ve birinin
elle yeni anahtari bulup env'e yazmasi gerekiyordu.
Artik kimlik dogrulama hatasindan sonra anahtar portalin kendi paketinden
kesfediliyor. Zincir canli EKAP'ta dogrulandi:
/ekap/search → <script src="main.<hash>.js">
main.<hash>.js → webpack chunk haritasi; 2076 ozel olarak "common" adiyla
yayimlaniyor: y=>(2076===y?"common":y)+"."+{...}
common.<hash>.js → r8fact:"<32 baytlik anahtar>"
Kesfedilen deger su anki sabit anahtarla birebir ayni cikti — zincir dogru.
- Kesif YALNIZCA yedek: normalde sabit/env anahtar kullanilir, kesif ancak
401/403/5xx sonrasi ve istek basina BIR KEZ denenir (gercek sunucu hatasinda
her denemede portalden uc dosya indirmeyelim)
- 5xx de tetikliyor: EKAP gecersiz anahtari bazen 401, bazen 500 ile bildiriyor
(imza cozulemeyince sifre cozme katmani patliyor); yalnizca 401'e bakmak
rotasyonun yarisini kacirirdi
- Basari 1 sa, basarisizlik 5 dk onbellekleniyor
- Anahtar 32 bayt degilse kullanilmiyor — sema degismis demektir, korlemesine
denemek yerine mevcut anahtarla devam edilir
- SPA fallback tuzagi: bilinmeyen yol HTTP 200 + index.html donduruyor; JS
beklenen isteklerde HTML gelirse hata veriliyor (sessiz basarisizlik olmasin)
Sahte rotasyon testi: bozuk anahtarla EKAP 500 dondu → kesif devreye girdi →
dogru anahtar bulundu → tekrar denendi → arama basarili (860 ms).
Bulgu kaynagi: saidsurucu/ihale-mcp taramasinda gorulen imza semasi ve
firatbadur/ihaletakip-api'nin belgeledigi rotasyon davranisi. Ilgili depo
lisanssiz oldugu icin kod kopyalanmadi, uygulama sifirdan yazildi.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-03 20:04:11 +03:00
hikmettan and Claude Opus 5
ff797f5a91
feat: urun arama — urun adini ihale DOKUMANLARININ icinde aratir
...
saidsurucu/ihale-mcp deposu incelenirken EKAP arama API'sinin doküman ici
arama parametreleri oldugu goruldu: teklifCetvelindeAra, teknikSartnamedeAra,
idariSartnamedeAra, sozlesmeTasarisindaAra. EKAP dokumani kendi tarafinda
indeksliyor — yani teklif cetvelinde arama icin dokumani indirmeye (ve
CAPTCHA'ya) gerek yok.
Kullanicinin sikayetini olcen kanit:
ELDIVEN basliкta 1.135 → teklif cetvelinde 29.057
ORTOPEDIK VIDA baslikta 0 → teklif cetvelinde 3
HEMOGRAM baslikta 283 → teklif cetvelinde 2.529
"ORTOPEDIK VIDA" hicbir ihale BASLIGINDA gecmiyor; gectigi ihalelerin adi
"VETERINER ILAC ... SARF MALZEME". Basliga bakan firma bunlari bulamiyordu.
- ekap-v2.mjs: searchBody artik opts.kapsam ile daraltilabiliyor;
searchInDocuments() yalnizca teklif cetvelinde (istege bagli teknik
sartnamede) arar ve sonucu normalize eder
- GET /api/urun-ara?q=&skip=&take=&teknik= — 5 dk bellek onbellegi ile
(EKAP'a uzak cagri, ayni sorgu kaynagi yormasin)
- Header'da "URUN ARA" dugmesi + UrunAramaModal: sayfalama, "sadece teklif
verilebilir" suzgeci, havuzda acik olan ihalede detayi acma kisayolu
SINIR: EKAP hangi kalemin eslestigini dondurmuyor, yalnizca eslesen ihaleleri.
Kalem dokumu icin dokuman yuklemeye dayali ortak havuz yolu gecerli kaliyor;
arayuzde bu acikca yaziliyor.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-03 12:55:36 +03:00
hikmettan and Claude Opus 5
8826ff8e68
feat: ortak kalem havuzu — teklif cetveli kalemleri kartta gorunur ve aranabilir
...
Firmalar ihalenin sadece basligina bakarak kendi urunlerinin icinde olup
olmadigini goremiyordu ("148 KALEM KIRTASIYE MALZEME ALIMI"). Artik bir
kullanici ihale dokumanini yukledinde teklif cetveli kalemleri ayristirilip
IKN'ye baglaniyor ve o ihale HERKESIN kartinda kalemleriyle gorunuyor.
NEDEN YUKLEMEYE DAYALI: kalem listesi EKAP'in programatik yuzeyinde yok.
- Arama/detay API'si (ihtiyacKalemiOkasList) yalnizca OKAS sinifi veriyor:
"KALP AKCIGER POMPASI CIHAZI ALIMI" icin tek satir "Tibbi cihazlar"
- Ilan metni yalnizca sayiyi veriyor: "148 KALEM ... Ayrintili bilgiye EKAP'ta
yer alan ihale dokumani icinde bulunan idari sartnameden ulasilabilir"
- Dokuman sayfasi CAPTCHA ile korunuyor (ctl00_btnCaptchaProtect, guvenlik
resmi). Gercek tarayiciyla (Playwright) da acildi, donen tek metin: "Dogrula"
OTOMATIK, AI'SIZ: kalem cikarimi yukleme aninda kendiliginden calisir,
kullanicidan tiklama beklemez ve model cagirmaz (saf regex). AI analizi ayri
dugmede, kullanici isterse.
- server/kalem-cikar.mjs: teklif cetveli ayristirici. " | " tablolarindan
(docx/xlsx/zip) sutun basligini cozerek; ayracsiz PDF metninde sezgisel
satir kalibiyla. Miktar+birim tek hucrede olabiliyor ("25000 TEST").
Birim listesinde 'test' var — tibbi kitlerde kalem miktari boyle yaziliyor.
- server/kalem-store.mjs: kalem.sqlite, IKN bazli, Turkce duyarli arama.
Bos ayristirma mevcut iyi veriyi silmez.
- Uclar: POST /api/kalem/cikar (tarayicidan gelen PDF metni), GET /api/kalem,
GET /api/kalem/ara, GET /api/health/kalem
- /api/tenders payloadu kalemSayisi + ilk kalemleri tasiyor
- Kartta kalem rozeti ve kalem seridi; aramada eslesen kalemler one alinir
- Ust arama kutusu kalem havuzunda da ariyor (350ms debounce, sunucu tarafi)
- Detay modalinda tam kalem listesi + kalem ici arama
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-03 11:51:39 +03:00
hikmettan and Claude Fable 5.1
b41bc338af
fix: analiz icin dosya yuklenemiyordu — nginx varsayilan 1 MB govde siniri 413 veriyordu (arayuz 10 MB vaat ediyor); 20 MB + 300 sn zaman asimi, 413/504 icin anlasilir hata mesaji, 10 MB on kontrol
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
2026-09-02 13:48:22 +03:00