// Haftalık brief — Pazartesi 08:00: takipteki ihalelerden bu hafta yapılacaklar, // geçen hafta sonuçlanan takipliler, takiplilere gelen zeyilname sayısı. // Telegram (bağlıysa) + e-posta. Son gönderim data/brief-son.json'da tutulur; // saatlik kontrol, haftada bir gönderim (node-cron yok, setInterval). import fs from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; import * as store from './user-store.mjs'; import { resultsByIkn } from './history-store.mjs'; import { emailConfigured, sendEmail } from './email.mjs'; import { sendTelegram, telegramConfigured } from './telegram.mjs'; import { yaklasanIhaleler, trTarih } from './feeds-mcp.mjs'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const DURUM_DOSYASI = path.join(__dirname, 'data', 'brief-son.json'); function sonGonderim() { try { return JSON.parse(fs.readFileSync(DURUM_DOSYASI, 'utf8')); } catch { return {}; } } function sonGonderimYaz(d) { try { fs.mkdirSync(path.dirname(DURUM_DOSYASI), { recursive: true }); fs.writeFileSync(DURUM_DOSYASI, JSON.stringify(d)); } catch { /* yok */ } } const paraTR = (v, birim) => (v == null ? '' : `${Number(v).toLocaleString('tr-TR')} ${birim || 'TL'}`); /** Bir kullanıcı için brief içeriği. */ export function briefOlustur(email, tenders) { const takip = (store.getData(email, 'takip') || []).map(String); const yaklasan = yaklasanIhaleler(email, tenders, 7); const birHafta = Date.now() - 7 * 86400000; const sonuclar = []; for (const ikn of takip.slice(0, 200)) { const r = resultsByIkn(ikn) || []; for (const s of r) { const d = trTarih(s.sozlesmeTarihi) || trTarih(s.tarih); if (d && d.getTime() >= birHafta) sonuclar.push({ ikn, baslik: s.baslik, kazanan: s.kazananFirma, bedel: s.sozlesmeBedeli, birim: s.paraBirimi, teklif: s.teklifSayisi }); } } const hafta = new Date().toLocaleDateString('tr-TR', { day: '2-digit', month: 'long', year: 'numeric' }); return { hafta, yaklasan, sonuclar: sonuclar.slice(0, 15), bos: !yaklasan.length && !sonuclar.length }; } export function briefMetni(b) { const s = [`📋 Haftalık İhale Brief — ${b.hafta}`]; if (b.yaklasan.length) { s.push('', `⏰ Bu hafta yapılacak takipli ihaleler (${b.yaklasan.length}):`); for (const t of b.yaklasan) s.push(`• ${t.kalan_gun === 0 ? 'BUGÜN' : t.kalan_gun + ' gün'} — ${t.baslik} (${t.kurum}, ${t.tarih}${t.saat ? ' ' + t.saat : ''})`); } if (b.sonuclar.length) { s.push('', `🏁 Geçen hafta sonuçlanan takipliler (${b.sonuclar.length}):`); for (const r of b.sonuclar) s.push(`• ${r.baslik} → ${r.kazanan || 'kazanan açıklanmadı'}${r.bedel != null ? ' · ' + paraTR(r.bedel, r.birim) : ''}${r.teklif != null ? ' · ' + r.teklif + ' teklif' : ''}`); } s.push('', 'ihaleist.com'); return s.join('\n'); } export function briefHtml(b) { const esc = (x) => String(x ?? '').replace(/[<>&]/g, (c) => ({ '<': '<', '>': '>', '&': '&' }[c])); const bolum = (baslik, satirlar) => satirlar.length ? `
Bu brief her Pazartesi gönderilir; Bildirimler sekmesinden kapatabilirsiniz.