Commit Graph
59 Commits
Author SHA1 Message Date
hikmettan f647e037c7 fix: preserve cents in price analysis csv 2026-09-06 16:34:27 +03:00
hikmettan d4e7ea44c5 fix: distinguish units in price analysis selection 2026-09-06 16:33:57 +03:00
hikmettan 2d1667940a fix: validate document expiry dates before countdown 2026-09-06 16:29:06 +03:00
hikmettan f9bf95dbf9 a11y: announce selected calendar day results 2026-09-06 16:26:43 +03:00
hikmettan 77164ab6bb a11y: make calendar day controls non submitting 2026-09-06 16:26:15 +03:00
hikmettan 120657758c fix: reject unconfirmed Telegram tests and invalid update responses 2026-09-06 14:55:05 +03:00
hikmettan 37fb7b0366 fix: clear consumed Telegram challenges after link changes 2026-09-06 14:53:35 +03:00
hikmettan 283bfe5990 fix: bind Telegram pairing to expiring single-use account challenges 2026-09-06 14:50:11 +03:00
hikmettan 8faf03e632 fix: clear stale weekly preference after concurrent changes 2026-09-06 14:44:25 +03:00
hikmettan 38227862c0 fix: guide users through blocked notification permissions 2026-09-06 14:41:24 +03:00
hikmettan 7a01e4bed7 feat: review uncertain weekly brief deliveries with audit history 2026-09-06 14:37:32 +03:00
hikmettan b2a416c908 fix: persist weekly brief preference and expose request failures 2026-09-06 14:20:31 +03:00
hikmettan 9db12a5eae fix: persist quiet-hour time input changes 2026-09-06 14:18:29 +03:00
hikmettan e711da9567 fix: distinguish email service errors and validate send receipts 2026-09-06 14:16:08 +03:00
hikmettan a25dcb7a5d fix: persist notification preferences and clarify delivery controls 2026-09-06 14:14:46 +03:00
hikmettan 83df706631 fix: persist competitor tracking and remove unsupported metrics and alerts 2026-09-06 14:12:43 +03:00
hikmettan 525b673e25 fix: synchronize calendar month input and add month navigation 2026-09-06 14:08:08 +03:00
hikmettan 6c33012ab8 fix: order calendar deadlines and surface undated tenders 2026-09-06 14:05:24 +03:00
hikmettan ae32382ffa fix: bound document downloads and cancel stale sessions 2026-09-06 13:56:05 +03:00
hikmettan 44c9809deb Show Telegram status errors and keep setup instructions admin-only 2026-09-06 13:42:25 +03:00
hikmettan 783ea807db Verify administrator outbox review and expose saved provider reference 2026-09-06 13:08:38 +03:00
hikmettan 22e886936e Add audited administrator resolution of uncertain email deliveries 2026-09-06 13:06:17 +03:00
hikmettan d956de3014 Persist notification email batches with leased idempotent delivery 2026-09-06 13:03:47 +03:00
hikmettan d2d66c8e9d Verify subscription lifecycle in browser and clarify delivery status 2026-09-06 12:58:34 +03:00
hikmettan 0a0c01baf1 Preserve subscriptions on request failure and isolate account state 2026-09-06 12:55:05 +03:00
hikmettan 372c0e76e0 Fix API key error states and verify revocation lifecycle 2026-09-06 10:37:14 +03:00
hikmettan 2164494c32 Cancel vault rereading without persisting a false document error 2026-09-06 10:25:17 +03:00
hikmettan 01d4acf246 Verify stored PDF retry in browser and clarify upload errors 2026-09-06 09:41:17 +03:00
hikmettan 277c9407a2 Keep vault state and file transfers within their originating session 2026-09-06 09:39:05 +03:00
hikmettan 6dc6fadda8 Share stored document retry flow across tender detail and vault 2026-09-06 09:37:56 +03:00
hikmettan 32ea749669 Persist document processing outcomes separately from upload success 2026-09-06 09:34:52 +03:00
hikmettan ece623d86c fix: separate private company documents from shared tender item imports 2026-09-06 09:30:37 +03:00
hikmettan a87ee758bc fix: restrict PWA cache and report actual offline capabilities 2026-09-06 09:17:15 +03:00
hikmettan b94ab97241 fix: unify tender countdowns and add monthly calendar navigation 2026-09-06 08:47:44 +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
hikmettanandClaude 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
hikmettanandClaude 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
hikmettanandClaude 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
hikmettanandClaude 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
hikmettanandClaude 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
hikmettanandClaude 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
hikmettanandClaude 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
hikmettanandClaude 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
hikmettanandClaude 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 fd78b6e7d9 feat: 30 günlük havuz referansı (kalıcı erime) + 25 sektör, çoklu sektör seçimi ve sunucudan gelen tek kaynaklı liste 2026-08-30 00:24:33 +03:00
hikmettan 65997055fe feat: abonelik iptal ekranı (ayrılma nedeni + açıklama) & gerçek abonelik rozeti (yönetici erişimi aboneliği gizlemesin) 2026-08-29 21:47:58 +03:00
hikmettan 8bb3d6ee48 feat: yıllık abonelik (varsayılan) — Stripe yıllık fiyatlar + periyot checkout'a geçiyor 2026-08-29 11:58:46 +03:00
hikmettan f04401031c feat: sunucu tarafı hesap altyapısı — Stripe webhook, kotalar, gerçek API anahtarı ve belge deposu
Denetlenen 5 teknik borç kalemi de kapatıldı:

1) Stripe webhook + gerçek yetkilendirme (ÖNCEDEN YOKTU)
   - POST /api/billing/webhook — SDK'sız HMAC-SHA256 imza doğrulaması,
     tekrar saldırısına karşı ±300sn zaman penceresi, timingSafeEqual
   - checkout.session.completed / subscription.created|updated|deleted işlenir
   - Ödeme → kullanıcının planı sunucuda güncellenir (önce ödeme hiçbir şeyi
     değiştirmiyordu)

2) Plan kotaları GERÇEKTEN uygulanıyor (önce sadece tanımlıydı)
   - server/entitlements.mjs: plan hakları + kotaKontrol()
   - ekip, belge adedi/boyutu, API anahtarı kotaları sunucuda zorlanır
   - Kota aşımında 402 + anlaşılır Türkçe mesaj; arayüzde KotaUyarisi bandı
   - /api/me/plan: plan, haklar ve gerçek kullanım

3) Kullanıcı verisi localStorage'dan sunucuya taşındı
   - server/user-store.mjs: kullanici_verisi tablosu (izinli anahtar listesi)
   - AppContext girişte sunucudan yükler, değişiklikleri sunucuya yazar;
     localStorage yalnızca çevrimdışı önbellek
   - Artık cihaz değişince veri kaybolmuyor

4) API anahtarları gerçek (önce Math.random ile tarayıcıda üretiliyordu)
   - Sunucuda crypto.randomBytes ile üretilir, YALNIZCA sha256 hash'i saklanır
   - Ham değer bir kez gösterilir; verifyApiKey ile doğrulanır, son kullanım
     izlenir, iptal anında geçerli olur

5) Belge deposu gerçek (önce boyut Math.random'dı, dosya hiç yüklenmiyordu)
   - Dosyalar kalıcı volume'e yazılır, boyut GERÇEK bayt
   - Auth'lu indirme (blob), silme diskten de siler, kota sunucuda uygulanır
2026-08-29 10:40:05 +03:00
hikmettan f73c7bd6cb feat: konu bazlı bildirim + gerçek site tarama
1) Bildirim artık KONU odaklı (il değil)
   - Kullanıcı hangi konularda ihale alabildiğini seçer; varsayılan tüm Türkiye
   - İl/alım türü/favori kurum 'daha da daralt' altında isteğe bağlı
   - notify-store: konular kolonu + otomatik şema geçişi
   - notifier: konu başlıkları ihale başlığı/sektör/branş/kalemlerde aranır

2) Gerçek firma sitesi tarama (webScraperService mock'unun yerine)
   - server/site-scan.mjs: siteyi GERÇEKTEN çeker, ana sayfa + ürün/hizmet/
     hakkımızda iç sayfalarını tarar, HTML'i metne çevirir, AI ile firmanın
     tedarik edebildiği ihale konularını çıkarır ('uydurma' yasaklı prompt)
   - /api/company/scan (auth'lu)
   - ai.mjs: systemOverride desteği (farklı görevler için ayrı sistem promptu)
   - Arayüz: 'Sitenizi tarayıp konuları otomatik önerelim' → tıklayarak ekleme

Not: eski webScraperService.js sabit anahtar-kelime sözlüğüydü; domain adında
'tanriverdi' geçince tıbbi ürün listesi uyduruyordu.
2026-08-29 10:19:44 +03:00