feat: İhaleist - Akıllı İhale Takip ve Analiz Platformu (Full PRD + 7 Enterprise Modül)

This commit is contained in:
2026-08-07 16:30:24 +03:00
commit ece74feefe
35 changed files with 7820 additions and 0 deletions
+114
View File
@@ -0,0 +1,114 @@
import React from 'react';
import { useApp } from '../context/AppContext';
import { MOCK_COMPANY_STATS, COMPETITOR_DATA } from '../data/mockTenders';
import { Briefcase, FileText, Calendar, History, Trophy, Eye, Kanban, Radar, ArrowRight } from 'lucide-react';
export const RightSidebar = () => {
const { setActiveTab, setQuickFilter, tenders } = useApp();
const trackedCount = tenders.filter(t => t.takipte).length;
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' }
];
return (
<aside className="w-full lg:w-80 shrink-0 space-y-4">
{/* Firmanıza Ait Kayıtlar */}
<div className="bg-white rounded-xl border border-slate-200 shadow-xs overflow-hidden">
<div className="px-4 py-3 border-b border-slate-100 bg-slate-50 flex items-center justify-between">
<span className="font-bold text-xs uppercase tracking-wider text-slate-800 flex items-center gap-2">
<Briefcase className="w-4 h-4 text-blue-600" /> Firmanıza Ait Kayıtlar
</span>
</div>
<div className="p-2 space-y-1">
{records.map(rec => {
const Icon = rec.icon;
return (
<div
key={rec.label}
onClick={() => {
setQuickFilter(rec.filterKey);
setActiveTab('list');
}}
className="flex items-center justify-between p-2.5 rounded-lg hover:bg-slate-50 cursor-pointer transition-colors text-xs font-semibold text-slate-700"
>
<div className="flex items-center gap-2.5">
<Icon className="w-4 h-4 text-slate-400" />
<span>{rec.label}</span>
</div>
<span className="bg-slate-100 text-slate-800 font-bold px-2 py-0.5 rounded-md border border-slate-200">
{rec.count}
</span>
</div>
);
})}
</div>
</div>
{/* İhale Durumlarım (Kanban Entrance) */}
<div className="bg-white rounded-xl border border-slate-200 shadow-xs p-4 space-y-3">
<div className="flex items-center gap-2 font-bold text-xs uppercase tracking-wider text-slate-800 border-b border-slate-100 pb-2">
<Kanban className="w-4 h-4 text-blue-600" /> İhale Durumlarım
</div>
<p className="text-xs text-slate-500 leading-relaxed">
Takibe aldığınız ihalelere durum atayabilir, ekip içinde sürükle-bırak ile iş dağıtabilirsiniz.
</p>
<button
onClick={() => setActiveTab('kanban')}
className="w-full bg-[#1f2937] hover:bg-slate-800 text-white font-bold py-2.5 px-4 rounded-lg text-xs flex items-center justify-center gap-2 transition-colors shadow-xs"
>
<Kanban className="w-4 h-4 text-amber-400" />
<span>Kanban Panosunu Aç</span>
</button>
</div>
{/* Rakip Radar Widget */}
<div className="bg-white rounded-xl border border-slate-200 shadow-xs p-4 space-y-3">
<div className="flex items-center justify-between border-b border-slate-100 pb-2">
<span className="font-bold text-xs uppercase tracking-wider text-slate-800 flex items-center gap-2">
<Radar className="w-4 h-4 text-indigo-600" /> Rakip Radar & Pazar Payı
</span>
<span className="bg-indigo-100 text-indigo-800 text-[10px] font-bold px-2 py-0.5 rounded-full">
Sektör Analizi
</span>
</div>
<div className="space-y-2.5 text-xs">
{COMPETITOR_DATA.slice(0, 3).map((comp, i) => (
<div key={i} className="space-y-1">
<div className="flex items-center justify-between text-[11px] font-semibold text-slate-700">
<span className="truncate max-w-[170px]">{comp.name}</span>
<span className="font-bold text-indigo-900">%{comp.share} ({comp.winCount} İhale)</span>
</div>
<div className="w-full bg-slate-100 rounded-full h-1.5 overflow-hidden">
<div
className="bg-indigo-600 h-1.5 rounded-full"
style={{ width: `${comp.share}%` }}
/>
</div>
</div>
))}
</div>
<button
onClick={() => setActiveTab('sozlesme')}
className="w-full text-indigo-600 hover:text-indigo-800 font-bold text-xs py-1.5 flex items-center justify-center gap-1 hover:underline"
>
<span>Tüm Rakip Sözleşmelerini İncele</span>
<ArrowRight className="w-3.5 h-3.5" />
</button>
</div>
</aside>
);
};