diff --git a/app/Filament/Admin/Resources/Proposals/Pages/CreateProposal.php b/app/Filament/Admin/Resources/Proposals/Pages/CreateProposal.php
new file mode 100644
index 0000000..896314b
--- /dev/null
+++ b/app/Filament/Admin/Resources/Proposals/Pages/CreateProposal.php
@@ -0,0 +1,16 @@
+label(__('proposal.create')),
+ ];
+ }
+}
diff --git a/app/Filament/Admin/Resources/Proposals/ProposalResource.php b/app/Filament/Admin/Resources/Proposals/ProposalResource.php
new file mode 100644
index 0000000..917e802
--- /dev/null
+++ b/app/Filament/Admin/Resources/Proposals/ProposalResource.php
@@ -0,0 +1,72 @@
+ ListProposals::route('/'),
+ 'create' => CreateProposal::route('/create'),
+ 'edit' => EditProposal::route('/{record}/edit'),
+ ];
+ }
+
+ public static function getRecordRouteBindingEloquentQuery(): Builder
+ {
+ return parent::getRecordRouteBindingEloquentQuery()
+ ->withoutGlobalScopes([
+ SoftDeletingScope::class,
+ ]);
+ }
+}
diff --git a/app/Filament/Admin/Resources/Proposals/Schemas/ProposalForm.php b/app/Filament/Admin/Resources/Proposals/Schemas/ProposalForm.php
new file mode 100644
index 0000000..794ce7c
--- /dev/null
+++ b/app/Filament/Admin/Resources/Proposals/Schemas/ProposalForm.php
@@ -0,0 +1,140 @@
+columns(3)
+ ->schema([
+ // Sol kolon - Ana içerik (2 sütun genişliğinde)
+ Section::make(__('proposal.content_section'))
+ ->schema([
+ TextInput::make('title')
+ ->label(__('proposal.title_field'))
+ ->required()
+ ->maxLength(255)
+ ->live(onBlur: true)
+ ->afterStateUpdated(function (string $operation, $state, callable $set) {
+ if ($operation !== 'create') {
+ return;
+ }
+ $set('slug', \Str::slug($state));
+ }),
+
+ TextInput::make('slug')
+ ->label(__('proposal.slug_field'))
+ ->required()
+ ->maxLength(255)
+ ->unique(ignoreRecord: true)
+ ->rules(['alpha_dash'])
+ ->helperText(__('proposal.slug_helper')),
+
+ Textarea::make('content')
+ ->label(__('proposal.content_field'))
+ ->required()
+ ->rows(18)
+ ->extraInputAttributes(['style' => 'font-family: monospace; font-size: 0.9rem; line-height: 1.5;'])
+ ->columnSpanFull(),
+
+ Textarea::make('client_feedback')
+ ->label('Müşteri Geri Bildirimi / Revizyon Notu')
+ ->rows(3)
+ ->disabled()
+ ->dehydrated(false)
+ ->placeholder('Henüz geri bildirim bırakılmadı.')
+ ->visible(fn ($record) => $record !== null && !empty($record->client_feedback))
+ ->columnSpanFull(),
+ ])
+ ->columnSpan(2)
+ ->collapsible(false),
+
+ // Sağ kolon - Durum, Fiyat, Müşteri ve Tasarım (1 sütun genişliğinde)
+ Section::make(__('proposal.settings_section'))
+ ->schema([
+ Select::make('status')
+ ->label(__('proposal.status_field'))
+ ->options([
+ 'draft' => __('proposal.status_draft'),
+ 'sent' => __('proposal.status_sent'),
+ 'accepted' => __('proposal.status_accepted'),
+ 'rejected' => __('proposal.status_rejected'),
+ 'revised' => __('proposal.status_revised'),
+ ])
+ ->default('draft')
+ ->required()
+ ->columnSpanFull(),
+
+ TextInput::make('client_name')
+ ->label(__('proposal.client_name_field'))
+ ->required()
+ ->maxLength(255)
+ ->columnSpanFull(),
+
+ TextInput::make('client_email')
+ ->label(__('proposal.client_email_field'))
+ ->email()
+ ->maxLength(255)
+ ->columnSpanFull(),
+
+ TextInput::make('total_price')
+ ->label(__('proposal.total_price_field'))
+ ->numeric()
+ ->prefix(fn ($get) => match ($get('currency')) {
+ 'USD' => '$',
+ 'EUR' => '€',
+ default => '₺',
+ })
+ ->columnSpan(2),
+
+ Select::make('currency')
+ ->label(__('proposal.currency_field'))
+ ->options([
+ 'TRY' => 'TL (₺)',
+ 'USD' => 'USD ($)',
+ 'EUR' => 'EUR (€)',
+ ])
+ ->default('TRY')
+ ->required()
+ ->live()
+ ->columnSpan(1),
+
+ DatePicker::make('valid_until')
+ ->label(__('proposal.valid_until_field'))
+ ->native(false)
+ ->displayFormat('d.m.Y')
+ ->columnSpanFull(),
+
+ Select::make('meta.accent_color')
+ ->label(__('proposal.accent_color_field'))
+ ->options([
+ 'indigo' => 'Premium Indigo (Mor/Mavi)',
+ 'emerald' => 'Emerald Medical (Zümrüt Yeşil)',
+ 'cyberpunk' => 'Cyberpunk Neon (Pembe/Mavi)',
+ 'coral' => 'Coral Corporate (Mercan Kırmızı)',
+ 'amber' => 'Amber Executive (Kehribar/Altın)',
+ ])
+ ->default('indigo')
+ ->columnSpanFull(),
+
+ Checkbox::make('meta.show_calculator')
+ ->label(__('proposal.show_calculator_field'))
+ ->default(true)
+ ->columnSpanFull(),
+ ])
+ ->columns(3)
+ ->columnSpan(1)
+ ->collapsible(false),
+ ]);
+ }
+}
diff --git a/app/Filament/Admin/Resources/Proposals/Tables/ProposalsTable.php b/app/Filament/Admin/Resources/Proposals/Tables/ProposalsTable.php
new file mode 100644
index 0000000..603cb96
--- /dev/null
+++ b/app/Filament/Admin/Resources/Proposals/Tables/ProposalsTable.php
@@ -0,0 +1,111 @@
+columns([
+ TextColumn::make('title')
+ ->label(__('proposal.table_title'))
+ ->searchable()
+ ->sortable()
+ ->limit(40),
+
+ TextColumn::make('client_name')
+ ->label(__('proposal.table_client'))
+ ->searchable()
+ ->sortable()
+ ->limit(30),
+
+ TextColumn::make('total_price')
+ ->label(__('proposal.table_price'))
+ ->money(fn ($record) => $record->currency)
+ ->sortable(),
+
+ TextColumn::make('status')
+ ->label(__('proposal.table_status'))
+ ->badge()
+ ->color(fn (string $state): string => match ($state) {
+ 'draft' => 'gray',
+ 'sent' => 'info',
+ 'accepted' => 'success',
+ 'rejected' => 'danger',
+ 'revised' => 'warning',
+ default => 'gray',
+ })
+ ->formatStateUsing(fn (string $state): string => match ($state) {
+ 'draft' => __('proposal.status_draft'),
+ 'sent' => __('proposal.status_sent'),
+ 'accepted' => __('proposal.status_accepted'),
+ 'rejected' => __('proposal.status_rejected'),
+ 'revised' => __('proposal.status_revised'),
+ default => $state,
+ }),
+
+ TextColumn::make('slug')
+ ->label(__('proposal.table_slug'))
+ ->searchable()
+ ->copyable()
+ ->copyMessage(__('proposal.link_copied'))
+ ->icon('heroicon-o-document-duplicate')
+ ->limit(25),
+
+ TextColumn::make('valid_until')
+ ->label(__('proposal.table_valid_until'))
+ ->date('d.m.Y')
+ ->sortable(),
+
+ TextColumn::make('views_count')
+ ->label(__('proposal.table_views'))
+ ->integer()
+ ->sortable()
+ ->alignCenter(),
+
+ TextColumn::make('created_at')
+ ->label(__('proposal.table_created_at'))
+ ->dateTime('d.m.Y H:i')
+ ->sortable()
+ ->toggleable(isToggledHiddenByDefault: true),
+ ])
+ ->filters([
+ SelectFilter::make('status')
+ ->label(__('proposal.status_field'))
+ ->options([
+ 'draft' => __('proposal.status_draft'),
+ 'sent' => __('proposal.status_sent'),
+ 'accepted' => __('proposal.status_accepted'),
+ 'rejected' => __('proposal.status_rejected'),
+ 'revised' => __('proposal.status_revised'),
+ ]),
+ ])
+ ->recordActions([
+ EditAction::make()
+ ->label(__('proposal.edit')),
+ ])
+ ->actions([
+ Action::make('view_proposal')
+ ->label(__('proposal.preview'))
+ ->icon('heroicon-o-eye')
+ ->url(fn ($record) => route('proposals.show', $record->slug))
+ ->openUrlInNewTab(),
+ ])
+ ->bulkActions([
+ BulkActionGroup::make([
+ DeleteBulkAction::make()
+ ->label(__('proposal.delete')),
+ ]),
+ ])
+ ->defaultSort('created_at', 'desc');
+ }
+}
diff --git a/app/Http/Controllers/ProposalController.php b/app/Http/Controllers/ProposalController.php
new file mode 100644
index 0000000..a461879
--- /dev/null
+++ b/app/Http/Controllers/ProposalController.php
@@ -0,0 +1,70 @@
+firstOrFail();
+
+ // Increment views count cleanly
+ $proposal->increment('views_count');
+
+ return view('proposals.show', compact('proposal'));
+ }
+
+ /**
+ * Handle client interaction actions (approve or revision/feedback).
+ */
+ public function action(Request $request, string $slug)
+ {
+ $proposal = Proposal::where('slug', $slug)->firstOrFail();
+
+ $actionType = $request->input('action_type');
+
+ if ($actionType === 'approve') {
+ $request->validate([
+ 'name' => 'required|string|max:255',
+ ]);
+
+ $proposal->update([
+ 'status' => 'accepted',
+ 'accepted_name' => $request->input('name'),
+ 'accepted_at' => now(),
+ ]);
+
+ return response()->json([
+ 'success' => true,
+ 'message' => 'Teklif başarıyla onaylandı! Katılımınız ve iş birliğiniz için teşekkür ederiz.',
+ ]);
+ }
+
+ if ($actionType === 'feedback') {
+ $request->validate([
+ 'feedback' => 'required|string|max:5000',
+ ]);
+
+ $proposal->update([
+ 'status' => 'revised',
+ 'client_feedback' => $request->input('feedback'),
+ ]);
+
+ return response()->json([
+ 'success' => true,
+ 'message' => 'Revizyon ve görüşleriniz başarıyla iletildi. En kısa sürede güncellenerek sizinle paylaşılacaktır.',
+ ]);
+ }
+
+ return response()->json([
+ 'success' => false,
+ 'message' => 'Geçersiz işlem tipi.',
+ ], 400);
+ }
+}
diff --git a/app/Models/Proposal.php b/app/Models/Proposal.php
new file mode 100644
index 0000000..1cf4911
--- /dev/null
+++ b/app/Models/Proposal.php
@@ -0,0 +1,70 @@
+ 'date',
+ 'accepted_at' => 'datetime',
+ 'meta' => 'array',
+ 'views_count' => 'integer',
+ 'total_price' => 'decimal:2',
+ ];
+
+ protected static function boot()
+ {
+ parent::boot();
+
+ static::creating(function ($proposal) {
+ if (empty($proposal->uuid)) {
+ $proposal->uuid = (string) Str::uuid();
+ }
+ if (empty($proposal->created_by) && auth()->check()) {
+ $proposal->created_by = auth()->id();
+ }
+ });
+ }
+
+ /**
+ * Get the user who created the proposal.
+ */
+ public function creator()
+ {
+ return $this->belongsTo(User::class, 'created_by');
+ }
+
+ /**
+ * Get the public url for the proposal.
+ */
+ public function getUrlAttribute()
+ {
+ return route('proposals.show', $this->slug);
+ }
+}
diff --git a/database/migrations/2026_05_25_000000_create_proposals_table.php b/database/migrations/2026_05_25_000000_create_proposals_table.php
new file mode 100644
index 0000000..bedd845
--- /dev/null
+++ b/database/migrations/2026_05_25_000000_create_proposals_table.php
@@ -0,0 +1,44 @@
+id();
+ $table->uuid('uuid')->unique();
+ $table->string('slug')->unique();
+ $table->string('title');
+ $table->string('client_name');
+ $table->string('client_email')->nullable();
+ $table->longText('content');
+ $table->decimal('total_price', 15, 2)->nullable();
+ $table->string('currency', 10)->default('TRY');
+ $table->string('status', 30)->default('draft'); // draft, sent, accepted, rejected, revised
+ $table->date('valid_until')->nullable();
+ $table->text('client_feedback')->nullable();
+ $table->string('accepted_name')->nullable();
+ $table->timestamp('accepted_at')->nullable();
+ $table->integer('views_count')->default(0);
+ $table->json('meta')->nullable(); // For accent color, logos, etc.
+ $table->foreignId('created_by')->nullable()->constrained('users')->nullOnDelete();
+ $table->timestamps();
+ $table->softDeletes();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('proposals');
+ }
+};
diff --git a/database/seeders/ProposalSeeder.php b/database/seeders/ProposalSeeder.php
new file mode 100644
index 0000000..7e3f93d
--- /dev/null
+++ b/database/seeders/ProposalSeeder.php
@@ -0,0 +1,390 @@
+
+
+
YAZILIM GELİŞTİRME HİZMET ALIMI TEKNİK VE MALİ TEKLİF DOKÜMANI
+ Acil Servis Triaj ve Erken Tedavi İçin Çok Ajanlı Büyük Dil Modeli Tabanlı Hekim Karar Destek Sistemi Projesi
+
+ DOKÜMAN REFERANS NO: TT-2026-DEEPP-001-R1
+ TEKLİF TARİHİ: 25 Mayıs 2026
+ GEÇERLİLİK TARİHİ: 26 Haziran 2026
+ SON TESLİM ZAMANI: 26.05.2026 Salı - Saat 16:00
+
+
+
+ HAZIRLAYAN YÜKLENİCİ
+ Trunçgil Teknoloji Sanayi ve Ticaret Limited Şirketi
+ Gaziantep Üniversitesi Teknoparkı, Şahinbey / Gaziantep
+ www.truncgil.com.tr | info@truncgil.com.tr
+
+ MÜŞTERİ / YETKİLİ KURUM
+ Deepp Yapay Zeka Teknolojileri A.Ş.
+ Cevizlik Mah. İstanbul Cad. No:12-26 Bakırköy / İstanbul
+ info@deepp.ai
+
+
+---
+
+> [!NOTE]
+> **Gizlilik Bildirimi**
+> Bu doküman ve ekleri, Trunçgil Teknoloji Sanayi ve Ticaret Limited Şirketi’nin ticari sırlarını ve özel teknik yaklaşımlarını içermekte olup, Deepp Yapay Zeka Teknolojileri A.Ş. yetkililerinin değerlendirmesi için özel olarak hazırlanmıştır. Üçüncü şahıslarla paylaşılması veya çoğaltılması izne tabidir.
+
+---
+
+## 1. Kurumsal Profil ve Resmi Bilgiler
+
+Trunçgil Teknoloji, kökleri 2014 yılına dayanan ve 2019 yılından bu yana Gaziantep Teknopark (Teknoloji Geliştirme Bölgesi) bünyesinde AR-GE faaliyetleri yürüten kurumsal bir teknoloji şirketidir. Şirketimiz; yüksek ölçeklenebilir backend sistemleri (**Laravel & PHP 8.3+ & Laravel Octane**), Laravel ile en entegre çalışan yüksek performanslı modern web portalları (**Inertia.js & Vue 3 & Tailwind CSS**) ile cross-platform mobil uygulamalar (**Flutter & Dart**) alanında uçtan uca uzmanlaşmıştır.
+
+Özellikle tıbbi veri entegrasyonu, kişisel verilerin korunması (KVKK/GDPR), HIPAA uyumluluğu, gerçek zamanlı veri akışları ve yapay zeka entegrasyonlu hibrit yazılım mimarilerinde derin tecrübeye sahibiz.
+
+### Resmi Bilgilerimiz
+
+| Alan | Resmi Bilgi Tanımı |
+| :--- | :--- |
+| **Firma Ünvanı** | TRUNÇGİL TEKNOLOJİ SANAYİ VE TİCARET LİMİTED ŞİRKETİ |
+| **Web Sitesi** | [www.truncgil.com.tr](https://www.truncgil.com.tr) |
+| **Yetkili İsim & Soyisim** | Ümit Tunç (Kurucu / Software Engineer) |
+| **Yetkili Telefon** | +90 551 234 36 95 |
+| **E-posta** | [info@truncgil.com.tr](mailto:info@truncgil.com.tr) / [umit.tunc@truncgil.com](mailto:umit.tunc@truncgil.com) |
+| **Yazışma Adresi** | Çamtepe Mah. Mahmut Tevfik Atay Bul. Gaziantep Teknopark No: 4A İç Kapı No: 1 Şahinbey / Gaziantep |
+| **Vergi Dairesi & No** | Şahinbey V.D. - 8591492435 |
+| **MERSİS No** | 0859149243500001 |
+
+---
+
+## 2. Proje Anlayışı ve Kapsam
+
+Deepp Yapay Zeka Teknolojileri A.Ş. tarafından geliştirilen **"Acil Servis Triaj ve Erken Tedavi İçin Çok Ajanlı Büyük Dil Modeli Tabanlı Hekim Karar Destek Sistemi"** projesinin nihai başarısı; karmaşık yapay zeka ajanlarının, klinik iş akışlarına kusursuz ve gecikmesiz (low latency) bir şekilde entegre edilmesine bağlıdır.
+
+Şirketimiz, bu şartname kapsamındaki **üç ana kalemden (Backend, Mobil Arayüz, Web Arayüzü)** oluşan yazılım altyapısının geliştirilmesini üstlenecektir. Bu kapsamda, **Backend mimarisi Laravel**, **İstemci arayüzlerinden Mobil tarafı Flutter**, **Web arayüzü (Komuta ve Yönetim Portalı) ise Laravel ile en entegre çalışan Inertia.js + Vue.js (Vue 3)** mimarisiyle geliştirilecektir.
+
+### Kapsam Matrisi
+
+```mermaid
+graph LR
+ subgraph TRUNCGIL_TEKNOLOJI_KAPSAMI ["Trunçgil Teknoloji Geliştirme Kapsamı"]
+ BE["1. Laravel Tabanlı Yüksek Performanslı Backend & Ajan Orkestratör Katmanı"]
+ MOB["2. Cross-Platform Flutter Mobil Uygulaması (iOS & Android)"]
+ WEB["3. Laravel ile Entegre Inertia.js & Vue 3 Web Portalı (Masaüstü & Tablet Uyumlu)"]
+ QA["4. Kapsamlı Test, Yük Testi (500 RPS) & Güvenlik (Penetrasyon) Testleri"]
+ PILOT["5. 3 Aylık Pilot Hastane Kurulumu & UAT Desteği"]
+ SLA["6. 6 Aylık Klinik Doğrulama Boyunca 7/24 SLA ve Bakım Hizmeti"]
+ end
+
+ subgraph DEEPP_AI_KAPSAMI ["Deepp Yapay Zeka A.Ş. Kapsamı"]
+ AI_Ajanlari["Çok Ajanlı LLM Katmanı (Triaj, Risk Skorlama, Tedavi Önerisi, Kontrendikasyon, Sesli Asistan)"]
+ LLM_API["Yapay Zeka Modelleri ve Yüksek Performanslı Altyapı"]
+ end
+
+ BE -->|Entegrasyon & Veri Akışı| AI_Ajanlari
+
+ style DEEPP_AI_KAPSAMI fill:#FFF1F2,stroke:#FDA4AF,stroke-width:1.5px,color:#9F1239,rx:12px,ry:12px
+ style TRUNCGIL_TEKNOLOJI_KAPSAMI fill:#EEF2FF,stroke:#A5B4FC,stroke-width:1.5px,color:#3730A3,rx:12px,ry:12px
+ style AI_Ajanlari fill:#FFFFFF,stroke:#F43F5E,stroke-width:1.5px,color:#9F1239,rx:8px,ry:8px
+ style LLM_API fill:#FFFFFF,stroke:#F43F5E,stroke-width:1.5px,color:#9F1239,rx:8px,ry:8px
+ style BE fill:#FFFFFF,stroke:#4F46E5,stroke-width:1.5px,color:#3730A3,rx:8px,ry:8px
+ style MOB fill:#FFFFFF,stroke:#4F46E5,stroke-width:1.5px,color:#3730A3,rx:8px,ry:8px
+ style WEB fill:#FFFFFF,stroke:#4F46E5,stroke-width:1.5px,color:#3730A3,rx:8px,ry:8px
+ style QA fill:#FFFFFF,stroke:#6366F1,stroke-width:1.2px,color:#3730A3,rx:8px,ry:8px
+ style PILOT fill:#FFFFFF,stroke:#6366F1,stroke-width:1.2px,color:#3730A3,rx:8px,ry:8px
+ style SLA fill:#FFFFFF,stroke:#6366F1,stroke-width:1.2px,color:#3730A3,rx:8px,ry:8px
+```
+
+> [!IMPORTANT]
+> **Kapsam Dışı Hususlar:** Yapay zeka ajanlarının (LLM) algoritma tasarımı, LLM model eğitimi/ince ayarı ve ana çıkarım (inference) motorunun geliştirilmesi bu şartnamenin ve teklifimizin kapsamı dışındadır. Ancak, bu modellerin backend sistemine entegrasyonu, güvenli ve maskelenmiş veri akışının sağlanması ve ajansal orkestrasyon katmanının kurulması teklifimizin asli unsurudur.
+
+---
+
+## 3. Teknik Mimari ve Çözüm Yaklaşımı
+
+Sistemin saniyede 500 eşzamanlı isteği (500 RPS) minimum gecikmeyle karşılayabilmesi ve yüksek güvenlik (KVKK %100 maskeleme) standartlarını sağlayabilmesi amacıyla kuracağımız modern tıbbi yazılım mimarisi aşağıda detaylandırılmıştır.
+
+### Mimari Bileşenler:
+* **Yüksek Performanslı Laravel Backend & API Gateway:** **PHP 8.3+** ve **Laravel Octane (Swoole / RoadRunner)** altyapısı kullanılarak PHP'nin geleneksel bootstrap yükü sıfıra indirilerek saniyede binlerce istek (RPS) karşılanacaktır.
+* **Orkestratör Katmanı & Ajan İletişimi:** Çok ajanlı mimarinin yönetiminde, asenkron işlemler için **Laravel Queue & Laravel Horizon** ile entegre edilmiş **RabbitMQ** kullanılacaktır.
+* **Flutter Mobil & Inertia.js + Vue 3 Web Front-end:** Mobil tarafı **Flutter & Dart** ile derlenecektir. Web komuta portalı ise **Inertia.js + Vue 3** mimarisiyle kurulacaktır.
+* **Konteyner Orkestrasyonu & Veritabanı:** Tüm sistem Dockerize edilerek **Kubernetes (K8s)** üzerinde kurulacaktır. Veritabanı olarak normalize edilmiş, yedekli **PostgreSQL** tercih edilecektir.
+
+---
+
+### MİMARİ DİYAGRAM 1: Uçtan Uca Sistem Mimarisi (C4 Model Container Level)
+
+Laravel backend ve Flutter istemcilerinden oluşan yapay zeka entegrasyonlu sistem mimarisi:
+
+```mermaid
+graph TB
+ subgraph İstemci_Katmanı [Flutter Mobil & Vue 3 Web Katmanı]
+ mobile[Flutter Mobil App - Dart]
+ web[Inertia.js & Vue 3 Web Portal - Tailwind CSS]
+ voip[VoIP / SIP Telefon Ağ Geçidi]
+ end
+
+ subgraph Güvenlik_ve_Yönlendirme [Gateway & Security]
+ gateway[Laravel API Gateway - Octane / Sanctum / Passport RBAC]
+ end
+
+ subgraph Uygulama_Servisleri_Laravel [Laravel & PHP 8.3+ Uygulama & Orkestrasyon]
+ orchestrator[Laravel Ajan Orkestratör Katmanı - PHP Pipelines]
+ anonymizer[KVKK Veri Anonimleştirme Servisi]
+ stt_service[Arka Plan Gürültü Filtreli VoIP / STT Servisi]
+ audit_logger[Şifreli Tıbbi Denetim İzi Kaydedici - Laravel Auditing]
+ db_service[Eloquent ORM Veri Erişim Katmanı]
+ end
+
+ subgraph Mesaj_Kuyruğu_ve_Önbellek [Queue & Cache]
+ mq[RabbitMQ / Laravel Horizon - Redis]
+ cache[Redis Cache / Session Store]
+ websockets[Laravel Reverb - WebSocket Server]
+ end
+
+ subgraph Veritabanı_Katmanı [Veritabanı Katmanı]
+ db[(PostgreSQL - Yedekli / Normalize SQL)]
+ end
+
+ subgraph Harici_Servisler [Deepp AI Çok Ajanlı LLM Sistemi]
+ triage_agent[Triaj Ajanı]
+ risk_agent[Klinik Risk Skorlama Ajanı]
+ treatment_agent[Tedavi Önerisi Ajanı]
+ contra_agent[Kontrendikasyon Ajanı]
+ end
+
+ mobile -->|HTTPS / WSS| gateway
+ web -->|HTTPS / WSS| gateway
+ voip -->|SIP / VoIP API| stt_service
+
+ gateway -->|Internal REST / gRPC| anonymizer
+ gateway -->|Internal REST / gRPC| orchestrator
+
+ anonymizer -->|Kişisel Verilerden Arındırılmış| orchestrator
+ orchestrator -->|Laravel Jobs / Dispatch| mq
+ mq -->|Ajan İletişimi| triage_agent
+ mq -->|Ajan İletişimi| risk_agent
+ mq -->|Ajan İletişimi| treatment_agent
+ mq -->|Ajan İletişimi| contra_agent
+
+ orchestrator -->|Hızlı Okuma| cache
+ orchestrator -->|WebSocket Push| websockets
+ websockets -->|Canlı Komuta Paneli Güncellemesi| web
+ websockets -->|Kritik Push Bildirim| mobile
+ orchestrator -->|Eloquent Models| db_service
+ db_service --> db
+ db_service -->|Milisaniye Zaman Damgası & SHA256| audit_logger
+ audit_logger --> db
+
+ style İstemci_Katmanı fill:#F0FDFA,stroke:#99F6E4,stroke-width:1.5px,color:#115E59,rx:12px,ry:12px
+ style Güvenlik_ve_Yönlendirme fill:#FFFBEB,stroke:#FDE68A,stroke-width:1.5px,color:#92400E,rx:12px,ry:12px
+ style Uygulama_Servisleri_Laravel fill:#EEF2FF,stroke:#C7D2FE,stroke-width:1.5px,color:#3730A3,rx:12px,ry:12px
+ style Mesaj_Kuyruğu_ve_Önbellek fill:#FAF5FF,stroke:#E9D5FF,stroke-width:1.5px,color:#6B21A8,rx:12px,ry:12px
+ style Veritabanı_Katmanı fill:#ECFDF5,stroke:#A7F3D0,stroke-width:1.5px,color:#065F46,rx:12px,ry:12px
+ style Harici_Servisler fill:#FFF1F2,stroke:#FECDD3,stroke-width:1.5px,color:#9F1239,rx:12px,ry:12px
+ style mobile fill:#FFFFFF,stroke:#0D9488,stroke-width:1.5px,color:#115E59,rx:8px,ry:8px
+ style web fill:#FFFFFF,stroke:#0D9488,stroke-width:1.5px,color:#115E59,rx:8px,ry:8px
+ style voip fill:#FFFFFF,stroke:#0D9488,stroke-width:1.5px,color:#115E59,rx:8px,ry:8px
+ style gateway fill:#FFFFFF,stroke:#D97706,stroke-width:1.5px,color:#92400E,rx:8px,ry:8px
+ style orchestrator fill:#FFFFFF,stroke:#4F46E5,stroke-width:1.5px,color:#3730A3,rx:8px,ry:8px
+ style anonymizer fill:#FFFFFF,stroke:#4F46E5,stroke-width:1.5px,color:#3730A3,rx:8px,ry:8px
+ style stt_service fill:#FFFFFF,stroke:#4F46E5,stroke-width:1.5px,color:#3730A3,rx:8px,ry:8px
+ style audit_logger fill:#FFFFFF,stroke:#4F46E5,stroke-width:1.5px,color:#3730A3,rx:8px,ry:8px
+ style db_service fill:#FFFFFF,stroke:#4F46E5,stroke-width:1.5px,color:#3730A3,rx:8px,ry:8px
+ style mq fill:#FFFFFF,stroke:#9333EA,stroke-width:1.5px,color:#6B21A8,rx:8px,ry:8px
+ style cache fill:#FFFFFF,stroke:#9333EA,stroke-width:1.5px,color:#6B21A8,rx:8px,ry:8px
+ style websockets fill:#FFFFFF,stroke:#9333EA,stroke-width:1.5px,color:#6B21A8,rx:8px,ry:8px
+ style db fill:#FFFFFF,stroke:#059669,stroke-width:1.5px,color:#065F46,rx:8px,ry:8px
+ style triage_agent fill:#FFFFFF,stroke:#F43F5E,stroke-width:1.5px,color:#9F1239,rx:8px,ry:8px
+ style risk_agent fill:#FFFFFF,stroke:#F43F5E,stroke-width:1.5px,color:#9F1239,rx:8px,ry:8px
+ style treatment_agent fill:#FFFFFF,stroke:#F43F5E,stroke-width:1.5px,color:#9F1239,rx:8px,ry:8px
+ style contra_agent fill:#FFFFFF,stroke:#F43F5E,stroke-width:1.5px,color:#9F1239,rx:8px,ry:8px
+```
+
+---
+
+### MİMARİ DİYAGRAM 2: Gerçek Zamanlı ve Asenkron Veri Akışı & Gecikme Bütçesi
+
+Saniyede 500 istek (500 RPS) kapasitesi altında Laravel Octane ve Flutter istemcileri arasındaki milisaniye seviyesindeki gecikme bütçesi (Latency Budget) hedefi:
+
+```mermaid
+sequenceDiagram
+ autonumber
+ participant Hekim as Hekim Arayüzü (Flutter Mobil / Vue 3 Web)
+ participant GW as Laravel API Gateway (Octane)
+ participant ANON as Laravel Anonimleştirme Servisi
+ participant ORCH as Laravel Orkestratör Katmanı (Octane / Swoole)
+ participant MQ as Laravel Horizon (Redis / RabbitMQ)
+ participant AI as Yapay Zeka Ajanları (LLM)
+
+ Note over Hekim,GW: Senkron Sorgu Akışı (Hedef: < 200 ms - LLM hariç)
+ Hekim->>GW: 1. İstek Gönderimi (Sanctum Auth + PHI Verileri)
+ rect rgb(240, 248, 255)
+ GW->>ANON: 2. PHI Verisini Anonimleştir (Hedef: < 25 ms)
+ ANON-->>GW: 3. Maskelenmiş Veri
+ end
+ GW->>ORCH: 4. İstek Yönlendirme (Hedef: < 15 ms)
+
+ rect rgb(255, 240, 245)
+ Note over ORCH,AI: Asenkron Ajan Orkestrasyonu (Hedef: < 500 ms)
+ ORCH->>MQ: 5. Ajan Görevlerini Kuyruğa Ekle (Laravel Job Dispatch)
+ MQ->>AI: 6. Ajanlar Arası Mesajlaşma & Paralel Çalışma (gRPC / HTTP)
+ AI-->>MQ: 7. Ajan Sonuçları (Triaj, Risk, Tedavi vb.)
+ MQ-->>ORCH: 8. Sonuçları Konsolide Et
+ end
+
+ ORCH-->>GW: 9. Konsolide Edilmiş Yanıt (Hedef: < 40 ms)
+ GW-->>Hekim: 10. Yanıtı İlet (JSON formatında)
+
+ Note over Hekim,ORCH: Laravel Reverb WebSocket Canlı Akışı (Gecikme < 500 ms)
+ ORCH->>Hekim: 11. Canlı Triaj & Komuta Güncellemesi (WSS Push)
+```
+
+---
+
+### MİMARİ DİYAGRAM 3: KVKK Veri Anonimleştirme Servisi Pipeline
+
+Kişisel Sağlık Verilerinin (PHI) %100 doğrulukla maskelenmesi ve dış LLM uç noktalarına sızıntının önlenmesi için iki katmanlı anonimleştirme iş akışı:
+
+```mermaid
+graph LR
+ subgraph Girdi [Girdi Verisi]
+ raw[Ham Tıbbi Veri: Ad/Soyad, T.C., Yaş, Telefon, Özel Öykü]
+ end
+
+ subgraph Maskeleme_Motoru [Laravel Veri Anonimleştirme Servisi]
+ parser[1. Veri Ayrıştırıcı - JSON Parser]
+
+ subgraph Katman_1 [Katman 1: PHP Regex & NER Kütüphaneleri]
+ regex[Düzenli İfadeler - Regex: TC No, Telefon, Mail, Ad/Soyad]
+ nlp_ner[PHP NLP NER Modeli: Kurum Adları, Tarihler, Şehirler]
+ end
+
+ subgraph Katman_2 [Katman 2: Şifreleme & Sözlük Map]
+ salt_hash[SHA-256 Tuzlanmış Hash: Hasta ID -> Maskeli ID]
+ dict_map[Geçici Oturum Sözlüğü - Secure Vault / Redis]
+ end
+
+ reconstructor[3. Maskelenmiş Paket Oluşturucu]
+ end
+
+ subgraph Çıktı [Güvenli Çıktı]
+ clean_data[Yapay Zeka Uç Noktalarına Gönderilen %100 Anonim Veri]
+ end
+
+ raw --> parser
+ parser --> regex
+ parser --> nlp_ner
+ regex --> salt_hash
+ nlp_ner --> salt_hash
+ salt_hash --> dict_map
+ dict_map --> reconstructor
+ reconstructor --> clean_data
+
+ style Girdi fill:#FFF7ED,stroke:#FED7AA,stroke-width:1.5px,color:#C2410C,rx:12px,ry:12px
+ style Maskeleme_Motoru fill:#F5F3FF,stroke:#DDD6FE,stroke-width:1.5px,color:#5B21B6,rx:12px,ry:12px
+ style Katman_1 fill:#EEF2FF,stroke:#C7D2FE,stroke-width:1.2px,color:#3730A3,rx:10px,ry:10px
+ style Katman_2 fill:#FAF5FF,stroke:#E9D5FF,stroke-width:1.2px,color:#6B21A8,rx:10px,ry:10px
+ style Çıktı fill:#ECFDF5,stroke:#A7F3D0,stroke-width:1.5px,color:#065F46,rx:12px,ry:12px
+ style raw fill:#FFFFFF,stroke:#F97316,stroke-width:1.5px,color:#C2410C,rx:8px,ry:8px
+ style parser fill:#FFFFFF,stroke:#7C3AED,stroke-width:1.5px,color:#5B21B6,rx:8px,ry:8px
+ style regex fill:#FFFFFF,stroke:#4F46E5,stroke-width:1.2px,color:#3730A3,rx:8px,ry:8px
+ style nlp_ner fill:#FFFFFF,stroke:#4F46E5,stroke-width:1.2px,color:#3730A3,rx:8px,ry:8px
+ style salt_hash fill:#FFFFFF,stroke:#9333EA,stroke-width:1.2px,color:#6B21A8,rx:8px,ry:8px
+ style dict_map fill:#FFFFFF,stroke:#9333EA,stroke-width:1.2px,color:#6B21A8,rx:8px,ry:8px
+ style reconstructor fill:#FFFFFF,stroke:#7C3AED,stroke-width:1.5px,color:#5B21B6,rx:8px,ry:8px
+ style clean_data fill:#FFFFFF,stroke:#10B981,stroke-width:1.5px,color:#065F46,rx:8px,ry:8px
+```
+
+---
+
+## 4. Teknik Şartname Uyum Matrisi
+
+Teknik şartnamedeki maddelere olan uyumumuz:
+
+| Şartname Maddesi | Talep Edilen Gereksinim | Uyum Durumu | Trunçgil Teknoloji Teknik Çözüm Yaklaşımı |
+| :--- | :--- | :---: | :--- |
+| **3. Backend - 1** | Saniyede en az 500 eşzamanlı istek (500 RPS) kapasitesi. | **TAM UYUM** | **Laravel Octane (Swoole / RoadRunner)** altyapısı, Kubernetes yatay otomatik ölçekleme (HPA) ve Redis önbellek katmanı ile 500 RPS yük altında darboğazsız çalışacaktır. |
+| **3. Backend - 2** | Ses/yazı inputları, LLM ve istemciler arası milisaniye (ms) seviyesinde gecikme bütçesi. | **TAM UYUM** | HTTP/2, WebSocket ve gRPC / HTTP REST protokolleri kullanılarak ağ gecikmesi minimize edilecek, asenkron yapıda veri akışları kurulacaktır. |
+| **3. Backend - 8** | %100 oranında kişisel sağlık verilerini maskeleyecek "Veri Anonimleştirme Servisi". | **TAM UYUM** | Özel geliştirilecek PHP Regex + NLP NER (Adlandırılmış Varlık Tanıma) kütüphaneleriyle veriler uç noktalara gitmeden önce maskelenecektir. |
+| **3. Backend - 9** | VoIP API telefon entegrasyonunda yanıt süresi maksimum 2 saniye (2000 ms). | **TAM UYUM** | SIP/RTP ses paketleri gerçek zamanlı (chunked) işlenecek, Laravel Event Listeners ve asenkron kuyruk yapısı ile 2 saniyenin altında yanıt dönülecektir. |
+
+---
+
+## 7. Proforma Fatura ve Mali Teklif
+
+Trunçgil Teknoloji’nin Teknopark bünyesindeki faaliyetleri kapsamında hazırlanan resmi mali teklifimiz ve proforma faturamız aşağıda sunulmuştur.
+
+### 📜 PROFORMA FATURA (PROFORMA INVOICE)
+
+| **Proforma No:** TT-2026-PF-042-R1 | **Tarih:** 25.05.2026 |
+| :--- | :--- |
+| **Satıcı (Yüklenici):** TRUNÇGİL TEKNOLOJİ SAN. VE TİC. LTD. ŞTİ. | **Alıcı (Müşteri):** DEEPP YAPAY ZEKA TEKNOLOJİLERİ A.Ş. |
+| **Adres:** Gaziantep Teknopark No: 4A İç Kapı No: 1 Şahinbey / Gaziantep | **Adres:** Cevizlik Mah. İstanbul Cad. No:12-26 Bakırköy / İstanbul |
+
+---
+
+#### Bütçe Dağılım Tablosu
+
+| Sıra No | Hizmet / Kalem Açıklaması | Süre (Ay) | Efor (Adam/Saat) | Birim Fiyat (TL) | Toplam Tutar (TL - KDV Hariç) | KDV Oranı (%) | KDV Tutarı (TL) |
+| :---: | :--- | :---: | :---: | :---: | :---: | :---: | :---: |
+| **1** | **Backend (Laravel) Geliştirme Hizmeti** | 12 | 1.200 | 1.000,00 TL | 1.200.000,00 TL | %0 | 0,00 TL |
+| **2** | **Mobil Arayüz (Flutter Mobile) Geliştirme Hizmeti** | 12 | 960 | 1.000,00 TL | 960.000,00 TL | %0 | 0,00 TL |
+| **3** | **Web Arayüz (Inertia.js + Vue.js) Geliştirme Hizmeti** | 12 | 880 | 1.000,00 TL | 880.000,00 TL | %0 | 0,00 TL |
+
+---
+
+#### Mali Özet
+
+* **Ara Toplam (KDV Hariç):** **3.040.000,00 TL** *(Üç Milyon Kırk Bin Türk Lirası)*
+* **Toplam KDV (%0 - Muaf):** **0,00 TL**
+* **GENEL TOPLAM:** **3.040.000,00 TL** *(Üç Milyon Kırk Bin Türk Lirası)*
+
+> [!IMPORTANT]
+> **Yasal KDV Muafiyeti Maddesi:**
+> Satıcı firma (Trunçgil Teknoloji), Gaziantep Teknopark bünyesinde AR-GE faaliyeti yürüten tescilli bir kuruluştur. **4691 Sayılı Teknoloji Geliştirme Bölgeleri Kanunu** Geçici 2. Maddesi uyarınca, bölgede üretilen yazılımların teslim ve hizmetleri **KDV'den istisnadır (%0 KDV)**. Bu muafiyet, alıcı firmaya doğrudan **%20 maliyet avantajı** sağlamaktadır.
+
+---
+
+## 8. Sonuç ve Taahhüt
+
+Trunçgil Teknoloji olarak, **Deepp AI** projenizin medikal standartlara uygun, güvenli, yüksek performanslı ve geleceğe hazır bir altyapı üzerinde yükselmesi için gerekli tüm tecrübe, teknik yetkinlik ve kurumsal disipline sahibiz.
+
+**Saygılarımızla,**
+
+**Ümit Tunç**
+Software Engineer & Kurucu
+**Trunçgil Teknoloji Sanayi ve Ticaret Limited Şirketi**
+EOT;
+
+ Proposal::updateOrCreate(
+ ['slug' => 'tt-2026-deepp-001'],
+ [
+ 'title' => 'Yazılım Geliştirme Hizmet Alımı Teknik ve Mali Teklif Dokümanı',
+ 'client_name' => 'Deepp Yapay Zeka Teknolojileri A.Ş.',
+ 'client_email' => 'info@deepp.ai',
+ 'content' => $markdown,
+ 'total_price' => 3040000.00,
+ 'currency' => 'TRY',
+ 'status' => 'sent',
+ 'valid_until' => '2026-06-26',
+ 'meta' => [
+ 'accent_color' => 'emerald',
+ 'show_calculator' => true
+ ],
+ 'views_count' => 42
+ ]
+ );
+ }
+}
diff --git a/lang/en/proposal.php b/lang/en/proposal.php
new file mode 100644
index 0000000..011ce7c
--- /dev/null
+++ b/lang/en/proposal.php
@@ -0,0 +1,56 @@
+ 'Proposals',
+ 'model_label' => 'Proposal',
+ 'plural_model_label' => 'Proposals',
+ 'title' => 'Proposal Management',
+ 'create' => 'Create New Proposal',
+ 'edit' => 'Edit Proposal',
+ 'delete' => 'Delete',
+ 'restore' => 'Restore',
+ 'force_delete' => 'Force Delete',
+
+ // Sections
+ 'content_section' => 'Proposal Details and Content',
+ 'settings_section' => 'Status and Settings',
+ 'client_section' => 'Client Information',
+
+ // Fields
+ 'title_field' => 'Proposal Title',
+ 'slug_field' => 'Proposal URL (Slug)',
+ 'slug_helper' => 'Client-specific URL. Must be unique. E.g.: tt-2026-deepp-001',
+ 'client_name_field' => 'Client Company / Name',
+ 'client_email_field' => 'Client Email Address',
+ 'content_field' => 'Proposal Content (Markdown)',
+ 'total_price_field' => 'Total Price',
+ 'currency_field' => 'Currency',
+ 'status_field' => 'Proposal Status',
+ 'valid_until_field' => 'Valid Until',
+ 'accent_color_field' => 'Accent Theme Color',
+ 'show_calculator_field' => 'Show Tax Exemption Calculator',
+ 'views_count_field' => 'Views Count',
+
+ // Statuses
+ 'status_draft' => 'Draft',
+ 'status_sent' => 'Sent',
+ 'status_accepted' => 'Accepted',
+ 'status_rejected' => 'Rejected',
+ 'status_revised' => 'Revision Requested',
+
+ // Table
+ 'table_title' => 'Title',
+ 'table_slug' => 'Slug',
+ 'table_client' => 'Client',
+ 'table_price' => 'Price',
+ 'table_status' => 'Status',
+ 'table_valid_until' => 'Valid Until',
+ 'table_views' => 'Views',
+ 'table_created_at' => 'Created At',
+ 'table_updated_at' => 'Updated At',
+
+ // Actions
+ 'copy_link' => 'Copy Proposal Link',
+ 'link_copied' => 'Proposal link copied to clipboard!',
+ 'preview' => 'Preview Proposal',
+];
diff --git a/lang/tr/proposal.php b/lang/tr/proposal.php
new file mode 100644
index 0000000..560b818
--- /dev/null
+++ b/lang/tr/proposal.php
@@ -0,0 +1,56 @@
+ 'Teklifler',
+ 'model_label' => 'Teklif',
+ 'plural_model_label' => 'Teklifler',
+ 'title' => 'Teklif Yönetimi',
+ 'create' => 'Yeni Teklif Oluştur',
+ 'edit' => 'Teklifi Düzenle',
+ 'delete' => 'Sil',
+ 'restore' => 'Geri Yükle',
+ 'force_delete' => 'Kalıcı Olarak Sil',
+
+ // Sections
+ 'content_section' => 'Teklif Detayları ve İçerik',
+ 'settings_section' => 'Durum ve Ayarlar',
+ 'client_section' => 'Müşteri Bilgileri',
+
+ // Fields
+ 'title_field' => 'Teklif Başlığı',
+ 'slug_field' => 'Teklif Linki (Slug)',
+ 'slug_helper' => 'Müşteriye özel bağlantı adresi. Benzersiz olmalıdır. Örn: tt-2026-deepp-001',
+ 'client_name_field' => 'Müşteri Kurum / Kişi Adı',
+ 'client_email_field' => 'Müşteri E-posta Adresi',
+ 'content_field' => 'Teklif İçeriği (Markdown formatında)',
+ 'total_price_field' => 'Teklif Tutarı',
+ 'currency_field' => 'Para Birimi',
+ 'status_field' => 'Teklif Durumu',
+ 'valid_until_field' => 'Geçerlilik Tarihi',
+ 'accent_color_field' => 'Arayüz Tema Rengi',
+ 'show_calculator_field' => 'KDV Muafiyet Hesaplayıcısını Göster',
+ 'views_count_field' => 'Görüntülenme Sayısı',
+
+ // Statuses
+ 'status_draft' => 'Taslak',
+ 'status_sent' => 'Gönderildi',
+ 'status_accepted' => 'Onaylandı',
+ 'status_rejected' => 'Reddedildi',
+ 'status_revised' => 'Revizyon İstendi',
+
+ // Table
+ 'table_title' => 'Başlık',
+ 'table_slug' => 'Bağlantı',
+ 'table_client' => 'Müşteri',
+ 'table_price' => 'Tutar',
+ 'table_status' => 'Durum',
+ 'table_valid_until' => 'Son Geçerlilik',
+ 'table_views' => 'Görüntülenme',
+ 'table_created_at' => 'Oluşturulma',
+ 'table_updated_at' => 'Güncellenme',
+
+ // Actions
+ 'copy_link' => 'Teklif Linkini Kopyala',
+ 'link_copied' => 'Teklif bağlantısı panoya kopyalandı!',
+ 'preview' => 'Teklifi Önizle',
+];
diff --git a/resources/views/proposals/show.blade.php b/resources/views/proposals/show.blade.php
new file mode 100644
index 0000000..5632de6
--- /dev/null
+++ b/resources/views/proposals/show.blade.php
@@ -0,0 +1,1156 @@
+
+
+
+
+
+
+ {{ $proposal->title }} - Trunçgil Teknoloji
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @php
+ $accent = $proposal->meta['accent_color'] ?? 'indigo';
+ $accentColor = match($accent) {
+ 'emerald' => '#059669',
+ 'cyberpunk' => '#ec4899',
+ 'coral' => '#ea580c',
+ 'amber' => '#d97706',
+ default => '#4f46e5',
+ };
+ $accentColorGlow = match($accent) {
+ 'emerald' => 'rgba(5, 150, 105, 0.2)',
+ 'cyberpunk' => 'rgba(236, 72, 153, 0.2)',
+ 'coral' => 'rgba(234, 88, 12, 0.2)',
+ 'amber' => 'rgba(217, 119, 6, 0.2)',
+ default => 'rgba(79, 70, 229, 0.2)',
+ };
+ $themeClass = match($accent) {
+ 'emerald' => 'theme-emerald bg-emerald-600 hover:bg-emerald-700 focus:ring-emerald-500 text-emerald-600 dark:text-emerald-400 border-emerald-500/20',
+ 'cyberpunk' => 'theme-rose bg-rose-500 hover:bg-rose-600 focus:ring-rose-400 text-rose-500 dark:text-rose-400 border-rose-500/20',
+ 'coral' => 'theme-orange bg-orange-600 hover:bg-orange-700 focus:ring-orange-500 text-orange-600 dark:text-orange-400 border-orange-500/20',
+ 'amber' => 'theme-amber bg-amber-600 hover:bg-amber-700 focus:ring-amber-500 text-amber-600 dark:text-amber-400 border-amber-500/20',
+ default => 'theme-indigo bg-indigo-600 hover:bg-indigo-700 focus:ring-indigo-500 text-indigo-600 dark:text-indigo-400 border-indigo-500/20',
+ };
+ $gradient = match($accent) {
+ 'emerald' => 'from-emerald-600 to-teal-600 dark:from-emerald-500 dark:to-teal-500',
+ 'cyberpunk' => 'from-rose-500 to-cyan-500 dark:from-rose-400 dark:to-cyan-400',
+ 'coral' => 'from-orange-600 to-rose-600 dark:from-orange-500 dark:to-rose-500',
+ 'amber' => 'from-amber-500 to-yellow-600 dark:from-amber-400 dark:to-yellow-500',
+ default => 'from-indigo-600 to-purple-600 dark:from-indigo-500 dark:to-purple-500',
+ };
+ $glowGradients = match($accent) {
+ 'emerald' => 'shadow-emerald-500/20 dark:shadow-emerald-500/10',
+ 'cyberpunk' => 'shadow-rose-500/20 dark:shadow-rose-500/10',
+ 'coral' => 'shadow-orange-500/20 dark:shadow-orange-500/10',
+ 'amber' => 'shadow-amber-500/20 dark:shadow-amber-500/10',
+ default => 'shadow-indigo-500/20 dark:shadow-indigo-500/10',
+ };
+ @endphp
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @php
+ $statusLabel = match($proposal->status) {
+ 'draft' => 'Taslak',
+ 'sent' => 'İletildi / Değerlendirmede',
+ 'accepted' => 'Onaylandı',
+ 'rejected' => 'Reddedildi',
+ 'revised' => 'Revizyon Talep Edildi',
+ default => 'Taslak',
+ };
+ $statusColor = match($proposal->status) {
+ 'draft' => 'bg-slate-100 text-slate-700 border-slate-200 dark:bg-slate-800 dark:text-slate-300 dark:border-slate-700',
+ 'sent' => 'bg-blue-50 text-blue-700 border-blue-200 dark:bg-blue-950/20 dark:text-blue-400 dark:border-blue-800',
+ 'accepted' => 'bg-emerald-50 text-emerald-700 border-emerald-200 dark:bg-emerald-950/20 dark:text-emerald-400 dark:border-emerald-800',
+ 'rejected' => 'bg-rose-50 text-rose-700 border-rose-200 dark:bg-rose-950/20 dark:text-rose-400 dark:border-rose-800',
+ 'revised' => 'bg-amber-50 text-amber-700 border-amber-200 dark:bg-amber-950/20 dark:text-amber-400 dark:border-amber-800',
+ default => 'bg-slate-100 text-slate-700 border-slate-200',
+ };
+ @endphp
+
+ {{ $statusLabel }}
+
+
+
+
+
+
+
+
Referans Kodu
+
{{ $proposal->slug }}
+
+
+
Teklif Tarihi
+
{{ $proposal->created_at->format('d.m.Y') }}
+
+
+
Son Geçerlilik
+
+ {{ $proposal->valid_until ? $proposal->valid_until->format('d.m.Y') : 'Belirtilmedi' }}
+
+
+
+
Okunma / İnceleme
+
+
+
+
+
+
{{ $proposal->views_count }} kez
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Teklif dökümanı güvenli olarak yükleniyor...
+
+
+
+
+
+
+ @if($proposal->total_price && ($proposal->meta['show_calculator'] ?? true))
+
+
+
+
+
+
+
+
+
+
+
+
Teknopark KDV Muafiyeti Avantajı
+
+
+ 4691 Sayılı Kanun KDV Muafiyeti
+
+
+ Trunçgil Teknoloji, Gaziantep Üniversitesi Teknoparkı bünyesinde AR-GE yürüten tescilli bir kuruluştur. Kanun kapsamında geliştirdiğimiz yazılım çözümleri KDV'den (%0 KDV) istisnadır. Bu sayede maliyetlerinizde doğrudan avantaj sağlarsınız.
+
+
+
+
+
+
+
KDV Muafiyeti Göster
+
+
+
+
+
+
+
+
+
+
Teknopark Avantajlı Fiyat (%0 KDV)
+
+
+
+
+
+
+ %20 standart KDV oranına kıyasla toplamda {{ number_format($proposal->total_price * 0.20, 2, ',', '.') }} kazanç sağladınız.
+
+
+
+
+
+
+ @endif
+
+
+
+
+
+
+
+
+ @if($proposal->status === 'accepted')
+
+
+
+
+ Bu döküman, yetkiliniz {{ $proposal->accepted_name }} tarafından {{ $proposal->accepted_at->format('d.m.Y H:i') }} tarihinde resmi olarak onaylanmış ve dijital olarak imzalanmıştır.
+
+
+
+
+
Dijital İmza Mührü
+
+ {{ $proposal->accepted_name }}
+
+
+ DOKÜMAN DOĞRULAMA KODU:
+ {{ substr(sha1($proposal->uuid . $proposal->accepted_at), 0, 16) }}
+
+
+
+ @else
+
+
+
+
+ İş Birliği & Karar Arayüzü
+
+
+ Aşağıdaki butonları kullanarak teklifi doğrudan onaylayıp dijital olarak imzalayabilir ya da ekibimize revizyon notlarınızı bırakabilirsiniz.
+
+
+
+
+
+
+
+ Teklifi Onayla & İmzala
+
+
+
+ Revizyon / Görüş İlet
+
+
+
+
+
+
+
+
+ @endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/routes/web.php b/routes/web.php
index d168eb1..f9d1a9a 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -144,6 +144,10 @@ Route::get('/logo-preview', function (Illuminate\Http\Request $request) {
// Sitemap
Route::get('/sitemap.xml', [\App\Http\Controllers\SitemapController::class, 'index'])->name('sitemap');
+// Proposals Public Interface
+Route::get('/teklif/{slug}', [\App\Http\Controllers\ProposalController::class, 'show'])->name('proposals.show');
+Route::post('/teklif/{slug}/action', [\App\Http\Controllers\ProposalController::class, 'action'])->name('proposals.action');
+
// Nested Pages (Parent/Child)
Route::get('/{parentSlug}/{slug}', [PageController::class, 'showNested'])->name('page.show_nested');