feat: tüm mock veriyi kaldır + Resend e-posta entegrasyonu

- mockTenders.js silindi; referans listeleri (sektör/il/kurum) constants.js'e taşındı
- AppContext: tenders/liveStats/competitorWatchlist/vaultDocuments/notifications/
  savedFilters/apiKeys/scrapedCapabilities → gerçek/boş; sahte Math.random online
  sayacı kaldırıldı; competitor & belge kasası artık localStorage
- LiveStatsBar: gerçek alanlar (canlı havuz/yüklü/bugün/kalem/takibimdeki)
- AnalyticsDashboard: KPI'lar (katılım/kazanma oranı/kazanılan bedel) + aylık hacim
  + sektörel dağılım gerçek companyStats/monthlyStats/sectorStats'tan; ciro hedefi
  kullanıcı tarafından belirlenir; veri yoksa dürüst boş durum
- ContractSearch & Rakip Radar: gerçek firmStats
- analytics.js: companyStats/monthlyStats/parseDateTR eklendi
- Resend: server/email.mjs + /api/notify/email/config + /api/notify/email/test
  (auth'lu, kullanıcının kendi adresine); PwaSettings gerçek e-posta test kartı
This commit is contained in:
2026-08-28 08:49:10 +03:00
parent 7521f798f6
commit 3e129c2988
14 changed files with 497 additions and 555 deletions
+6 -9
View File
@@ -1,7 +1,6 @@
import React, { useState } from 'react';
import { useApp } from '../context/AppContext';
import { MOCK_COMPANY_STATS } from '../data/mockTenders';
import { firmStats } from '../services/analytics';
import { firmStats, companyStats } from '../services/analytics';
import { Briefcase, FileText, Calendar, History, Trophy, Eye, Kanban, Radar, ArrowRight, Users, Plus, Trash2 } from 'lucide-react';
export const RightSidebar = () => {
@@ -10,7 +9,7 @@ export const RightSidebar = () => {
const [tmEmail, setTmEmail] = useState('');
const [tmRole, setTmRole] = useState('Uzman');
const trackedCount = tenders.filter(t => t.takipte).length;
const cs = companyStats(tenders);
const topFirms = firmStats(tenders).firms.slice(0, 3);
const handleAddMember = (e) => {
@@ -21,12 +20,10 @@ export const RightSidebar = () => {
};
const records = [
{ label: 'Notlarım', count: MOCK_COMPANY_STATS.notlarimCount, icon: FileText, filterKey: 'all' },
{ label: 'Ajanda', count: MOCK_COMPANY_STATS.ajandaCount, icon: Calendar, filterKey: 'all' },
{ label: 'İncelediklerim', count: MOCK_COMPANY_STATS.incelediklerimCount, icon: History, filterKey: 'incelenenler' },
{ label: 'Sözleşmelerim', count: MOCK_COMPANY_STATS.sozlesmelerimCount, icon: FileText, filterKey: 'sozlesmeler' },
{ label: 'Sonuçlarım', count: MOCK_COMPANY_STATS.sonuclarimCount, icon: Trophy, filterKey: 'sonuclananlar' },
{ label: 'Takibimdekiler', count: trackedCount, icon: Eye, filterKey: 'takiptekiler' }
{ label: 'İncelediklerim', count: cs.reviewed, icon: History, filterKey: 'incelenenler' },
{ label: 'Sözleşmelerim', count: cs.contracts, icon: FileText, filterKey: 'sozlesmeler' },
{ label: 'Sonuçlarım', count: cs.resulted, icon: Trophy, filterKey: 'sonuclananlar' },
{ label: 'Takibimdekiler', count: cs.tracked, icon: Eye, filterKey: 'takiptekiler' }
];
return (