// Haftalık brief — Pazartesi 08:00: takipteki ihalelerden bu hafta yapılacaklar, // önceki yedi takvim günündeki takipli sonuç kayıtları. // 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 { createBriefBuilder } from './brief-content.mjs'; import { createBriefSender } from './brief-delivery.mjs'; 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 const briefOlustur = createBriefBuilder({ trackedKeys:store.getTrackedTenderKeys, upcoming:yaklasanIhaleler, results:resultsByIkn, parseDate:trTarih, }); const deadlineText = t => t.son_teklif_zamani ? new Date(t.son_teklif_zamani).toLocaleTimeString('tr-TR', { timeZone: 'Europe/Istanbul', hour: '2-digit', minute: '2-digit' }) + ' (Türkiye saati)' : 'saat doğrulanmalı'; 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} · ${deadlineText(t)})`); } if (b.sonuclar.length) { s.push('', `🏁 Önceki 7 takvim günündeki takipli sonuç kayıtları (${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.