diff --git a/2. b/2. new file mode 100644 index 0000000..e69de29 diff --git a/4. b/4. new file mode 100644 index 0000000..e69de29 diff --git a/Agir b/Agir new file mode 100644 index 0000000..e69de29 diff --git a/Asliye b/Asliye new file mode 100644 index 0000000..e69de29 diff --git a/Ceza b/Ceza new file mode 100644 index 0000000..e69de29 diff --git a/Hukuk b/Hukuk new file mode 100644 index 0000000..e69de29 diff --git a/Mugla b/Mugla new file mode 100644 index 0000000..e69de29 diff --git a/Sulh b/Sulh new file mode 100644 index 0000000..e69de29 diff --git a/src/controllers/drafting.controller.ts b/src/controllers/drafting.controller.ts index 968776a..3501531 100644 --- a/src/controllers/drafting.controller.ts +++ b/src/controllers/drafting.controller.ts @@ -1,12 +1,13 @@ -import { Response } from 'express'; +import { Request, Response } from 'express'; import { supabase } from '../lib/supabase'; import { AuthenticatedRequest } from '../middleware/auth'; import { callAiModelRaw, CEZA_MUHAKEMESI_REFERANSI, HUKUK_MAHKEMELERI_REFERANSI } from './document.controller'; import { findRelevantLegislation, LegislationMatch } from '../lib/legislationLookup'; import { shouldPersistLegacyTables } from '../lib/localFirstFlag'; +import { resolvePetitionContext, PETITION_CATEGORIES, PETITION_TYPES_CATALOG } from '../lib/petitionKnowledge'; import crypto from 'crypto'; -const DRAFT_SYSTEM_PROMPT = ` +const BASE_DRAFT_SYSTEM_PROMPT = ` Sen uzman bir Türk avukatısın. Sana verilen dosya bilgilerine göre, istenen türde bir dilekçe TASLAĞI yazacaksın. Türk hukuk uygulamasına uygun, resmî bir dille yaz (hitap, hususlar, netice-i talep gibi standart dilekçe yapısını kullan). @@ -43,10 +44,20 @@ function toTraceableLegislation(matches: LegislationMatch[]) { return matches.map(({ maddeNo, baslik, kanun }) => ({ maddeNo, baslik, kanun })); } +export const getPetitionCatalog = async (_req: Request, res: Response) => { + try { + res.json({ + categories: PETITION_CATEGORIES, + types: PETITION_TYPES_CATALOG, + }); + } catch (error: any) { + res.status(500).json({ error: error.message || 'Internal Server Error' }); + } +}; + // Dilekçe Hazırlama ekranındaki "AI ile Taslak Oluştur" — dosyanın gerçek bilgilerini // (başlık, UYAP'tan gelen taraflar, varsa Dosya Özeti) ve kullanıcının notlarını, -// isteğe bağlı olarak seçilen büro şablonunun DİLİNİ/FORMATINI referans alarak -// gerçek bir AI taslağı üretir. +// backend'deki zengin dilekçe usul ve kural motoruyla birleştirerek AI taslağı üretir. export const generateDraft = async (req: AuthenticatedRequest, res: Response) => { try { const { case_id, petition_type, notes, template_id, latest_analysis_summary_json } = req.body || {}; @@ -68,9 +79,7 @@ export const generateDraft = async (req: AuthenticatedRequest, res: Response) => return res.status(403).json({ error: 'Bu dosyaya erişim yetkiniz yok.' }); } - // Faz 2 — analyses artık kalıcı olarak Postgres'te tutulmuyor. İstekte - // gönderilmişse (Electron'un yerel SQLite'tan okuduğu son analiz) öncelikli - // kaynak; yoksa (eski istemci/web) mevcut Postgres sorgusuna düşülür. + // Faz 2 — analyses artık kalıcı olarak Postgres'te tutulmuyor. let lastAnalysis: { summary_json: any } | null = latest_analysis_summary_json !== undefined ? { summary_json: latest_analysis_summary_json } : null; @@ -103,10 +112,21 @@ export const generateDraft = async (req: AuthenticatedRequest, res: Response) => const ozet = lastAnalysis?.summary_json?.ozet; - let userContent = `YENİ DOSYA BİLGİLERİ:\nDosya: ${caseRow.title}\nTaraflar: ${partiesText}\nDilekçe Türü: ${petition_type}\n`; - if (notes && String(notes).trim()) { - userContent += `Vurgulanmasını istediğiniz noktalar: ${String(notes).trim()}\n`; + // Backend Merkezi Hukuki Prompt & Kural Çözümleyici + const resolvedContext = resolvePetitionContext(petition_type, notes); + + const fullSystemPrompt = ` +${BASE_DRAFT_SYSTEM_PROMPT} + +${resolvedContext.systemPromptAddon} + `.trim(); + + let userContent = `YENİ DOSYA BİLGİLERİ:\nDosya: ${caseRow.title}\nTaraflar: ${partiesText}\nSeçilen Dilekçe Türü: ${resolvedContext.selectedItem?.title || petition_type}\n`; + + if (resolvedContext.enhancedNotes) { + userContent += `\n${resolvedContext.enhancedNotes}\n`; } + if (ozet && typeof ozet === 'string') { userContent += `\nDosya Özeti (bağlam için):\n${ozet.slice(0, 4000)}\n`; } @@ -118,11 +138,8 @@ export const generateDraft = async (req: AuthenticatedRequest, res: Response) => const legislationMatches = await findRelevantLegislation(legislationLookupText); userContent += formatReferenceBlock(legislationMatches); - const { aiContent, aiModel } = await callAiModelRaw(DRAFT_SYSTEM_PROMPT, userContent, 2500, 180_000); + const { aiContent, aiModel } = await callAiModelRaw(fullSystemPrompt, userContent, 2500, 180_000); - // Faz 3 — taslak artık kalıcı olarak Postgres'e YAZILMIYOR (PERSIST_TO_POSTGRES=false - // olduğunda); "Dilekçelerim" listesi artık yerel SQLite'tan (Faz 1/2) besleniyor. - // Bayrak açıkken (varsayılan) davranış birebir eskisi gibi kalır. let draftRecord: { id: string; created_at?: string } | null = null; if (shouldPersistLegacyTables()) { const { data, error: draftError } = await supabase @@ -130,7 +147,7 @@ export const generateDraft = async (req: AuthenticatedRequest, res: Response) => .insert([{ user_id: userId, case_id, - petition_type, + petition_type: resolvedContext.selectedItem?.title || petition_type, content: aiContent, template_id: template_id || null, used_legislation: toTraceableLegislation(legislationMatches), @@ -145,7 +162,19 @@ export const generateDraft = async (req: AuthenticatedRequest, res: Response) => draftRecord = { id: crypto.randomUUID(), created_at: new Date().toISOString() }; } - res.json({ draft: aiContent, draftId: draftRecord?.id || null, model: aiModel, usedTemplate: !!template, usedLegislation: toTraceableLegislation(legislationMatches) }); + res.json({ + draft: aiContent, + draftId: draftRecord?.id || null, + model: aiModel, + usedTemplate: !!template, + usedLegislation: toTraceableLegislation(legislationMatches), + resolvedPetition: resolvedContext.selectedItem ? { + id: resolvedContext.selectedItem.id, + title: resolvedContext.selectedItem.title, + lawRef: resolvedContext.selectedItem.lawRef, + courtType: resolvedContext.selectedItem.courtType, + } : null, + }); } catch (error: any) { console.error('Generate Draft Error:', error); res.status(500).json({ error: error.message || 'Internal Server Error' }); @@ -211,14 +240,8 @@ export const generateAngarya = async (req: AuthenticatedRequest, res: Response) } userContent += `\nİstenen Dilekçe: ${petitionType}\nLütfen sadece bu bilgileri kullanarak yukarıda tarif edilen standart ${petitionType} metnini oluştur.`; - // Fast generation using a lightweight model or quick params const { aiContent, aiModel } = await callAiModelRaw(ANGARYA_SYSTEM_PROMPT, userContent, 500); - // Faz 3 — angarya taslakları da PERSIST_TO_POSTGRES=false olduğunda - // kalıcı yazılmıyor. NOT: Angarya için Faz 1'de bir yerel SQLite dual-write - // eklenmedi (kapsam dışı tutulan düşük öncelikli özellik) — bayrak - // kapatıldığında bu taslaklar sadece HTTP yanıtında var olacak, hiçbir - // yerde kalıcı olmayacak. Bilinen ve kabul edilmiş bir sınırlama. let draftRecord: { id: string; created_at?: string } | null = null; if (shouldPersistLegacyTables()) { const { data, error: draftError } = await supabase diff --git a/src/lib/petitionKnowledge.ts b/src/lib/petitionKnowledge.ts new file mode 100644 index 0000000..56e8089 --- /dev/null +++ b/src/lib/petitionKnowledge.ts @@ -0,0 +1,458 @@ +/** + * Ceza & Hukuk Muhakemesi Hukuku (HMK, CMK, İİK, İYUK, TMK, TBK) + * Backend Merkezi Dilekçe ve Hukuki Prompt Bilgi Bankası + */ + +export interface PetitionTypeItem { + id: string; + title: string; + shortTitle: string; + categoryId: string; + lawRef: string; + courtType: string; + keyElements: string[]; + suggestedNotes: string; + aiPromptGuide: string; +} + +export interface PetitionCategory { + id: string; + name: string; + shortName: string; + icon: string; + badgeColor: string; + description: string; +} + +export const PETITION_CATEGORIES: PetitionCategory[] = [ + { + id: 'hmk', + name: '1. Hukuk Yargılaması (HMK)', + shortName: 'Hukuk (HMK)', + icon: '⚖️', + badgeColor: 'text-[#3B82F6] bg-[#3B82F6]/10 border-[#3B82F6]/30', + description: 'Hukuk Muhakemeleri Kanunu kapsamındaki dava, cevap, beyan, delil, ıslah, ihtiyati tedbir ve temyiz dilekçeleri' + }, + { + id: 'cmk', + name: '2. Ceza Yargılaması (CMK & TCK)', + shortName: 'Ceza (CMK)', + icon: '🛡️', + badgeColor: 'text-[#EF4444] bg-[#EF4444]/10 border-[#EF4444]/30', + description: 'Ceza Muhakemesi Kanunu uyarınca şikâyet, KYOK itiraz, tutukluluğa itiraz, savunma ve ceza temyiz talepleri' + }, + { + id: 'iik', + name: '3. İcra ve İflas Hukuku (İİK)', + shortName: 'İcra-İflas (İİK)', + icon: '🏢', + badgeColor: 'text-[#F59E0B] bg-[#F59E0B]/10 border-[#F59E0B]/30', + description: 'İcra takipleri, ödeme emrine itiraz, itirazın iptali/kaldırılması, menfi tespit, istihkak ve ihale feshi' + }, + { + id: 'iyuk', + name: '4. İdare ve Vergi Yargılaması (İYUK)', + shortName: 'İdare-Vergi (İYUK)', + icon: '🏛️', + badgeColor: 'text-[#8B5CF6] bg-[#8B5CF6]/10 border-[#8B5CF6]/30', + description: 'İdari iptal ve tam yargı davaları, yürütmenin durdurulması (YD), vergi cezası iptalleri ve Danıştay başvuruları' + }, + { + id: 'is', + name: '5. İş ve Sosyal Güvenlik Hukuku', + shortName: 'İş Hukuku', + icon: '💼', + badgeColor: 'text-[#10B981] bg-[#10B981]/10 border-[#10B981]/30', + description: 'İşe iade, arabuluculuk başvurusu, kıdem-ihbar alacakları, hizmet tespiti ve iş kazası tazminat davaları' + }, + { + id: 'tmk', + name: '6. Aile ve Kişiler Hukuku (TMK)', + shortName: 'Aile (TMK)', + icon: '👨‍👩‍👧', + badgeColor: 'text-[#EC4899] bg-[#EC4899]/10 border-[#EC4899]/30', + description: 'Anlaşmalı/çekişmeli boşanma, 6284 koruma kararı, nafaka, velayet, mal rejimi tasfiyesi ve vesayet' + }, + { + id: 'ttk', + name: '7. Ticaret, Şirketler ve Tüketici Hukuku', + shortName: 'Ticaret & Tüketici', + icon: '📈', + badgeColor: 'text-[#06B6D4] bg-[#06B6D4]/10 border-[#06B6D4]/30', + description: 'Tüketici Hakem Heyeti, zayi çek/senet iptali, ayıplı mal tazminatı ve şirket genel kurul iptali' + }, + { + id: 'tbk', + name: '8. Gayrimenkul ve Eşya Hukuku', + shortName: 'Gayrimenkul (TBK)', + icon: '🏠', + badgeColor: 'text-[#F97316] bg-[#F97316]/10 border-[#F97316]/30', + description: 'Kira tahliye, kira tespit/uyarlama, tapu iptal-tescil, izale-i şüyu ve ecrimisil davaları' + }, + { + id: 'aym', + name: '9. Anayasa Mahkemesi ve Uluslararası Yargı', + shortName: 'AYM & AİHM', + icon: '🌐', + badgeColor: 'text-[#6366F1] bg-[#6366F1]/10 border-[#6366F1]/30', + description: 'Anayasa Mahkemesi (AYM) bireysel başvuru formu ve AİHM insan hakları ihlali başvuru dilekçeleri' + }, + { + id: 'usul', + name: '10. Genel Usul, Kalem ve Duruşma Talepleri', + shortName: 'Usul & Kalem Talepleri', + icon: '📑', + badgeColor: 'text-[#64748B] bg-[#64748B]/10 border-[#64748B]/30', + description: 'Mazeret, süre tutum, vekillikten istifa, Mernis tebligat yenileme, dosya inceleme ve gerekçeli karar tebliği' + } +]; + +export const PETITION_TYPES_CATALOG: PetitionTypeItem[] = [ + // 1. HUKUK YARGILAMASI (HMK) + { + id: 'hmk-dava', + title: 'Dava Dilekçesi', + shortTitle: 'Dava Dilekçesi', + categoryId: 'hmk', + lawRef: 'HMK m. 119', + courtType: 'Asliye Hukuk / Asliye Ticaret / İş Mahkemesi', + keyElements: [ + 'Mahkeme Adı ve Dosya Konusu', + 'Tarafların Kimlik/Adres Bilgileri ve T.C. No', + 'Davanın Konusu ve Dava Değeri', + 'Somut Vakıalar ve Maddeler Halinde Açıklamalar', + 'Dayanılan Hukuki Sebepler ve Deliller Listesi', + 'Açık ve Net Netice-i Talep (Faiz, Vekalet Ücreti, Yargılama Giderleri)' + ], + suggestedNotes: 'Müvekkilin uğradığı maddi zarar ve alacak kalemlerini madde madde belirtiniz.', + aiPromptGuide: 'Dava dilekçesini HMK 119 zorunlu unsurlarına tam uyumlu olarak hazırla. Vakıaları kronolojik ve somut olay örgüsüyle açıkla.' + }, + { + id: 'hmk-cevap', + title: 'Cevap Dilekçesi', + shortTitle: 'Cevap Dilekçesi', + categoryId: 'hmk', + lawRef: 'HMK m. 129', + courtType: 'İlgili Hukuk Mahkemesi', + keyElements: [ + 'İlk İtirazlar (Yetki, Görev, Derdestlik, Zamanaşımı vb.)', + 'Davacının İddialarına Karşı Madde Madde Cevap ve İtiraflar/İnkarlar', + 'Karşı Savunma Delilleri (Yemin, Tanık, Bilirkişi vb.)', + 'Davanın Reddi ve Yargılama Giderleri Talebi' + ], + suggestedNotes: 'Davacının iddialarından kabul etmediklerinizi ve zamanaşımı/yetki gibi ilk itirazları belirtiniz.', + aiPromptGuide: 'HMK 129 uyarınca cevap dilekçesini yapılandır. İlk itirazları en başta ayrı başlık altında ele al. Davacının her bir iddiasını somut delillerle çürüt.' + }, + { + id: 'hmk-cevaba-cevap', + title: 'Cevaba Cevap (Replik) Dilekçesi', + shortTitle: 'Cevaba Cevap', + categoryId: 'hmk', + lawRef: 'HMK m. 136', + courtType: 'İlgili Hukuk Mahkemesi', + keyElements: [ + 'Davalının Cevap Dilekçesindeki İddiaların Çürütülmesi', + 'Davanın Genişletilmesi Yasağı Sınırları İçinde Yeni Açıklamalar', + 'Davalının İlk İtirazlarının Hukuken Geçersizliğinin İzahı' + ], + suggestedNotes: 'Davalının cevap dilekçesindeki iddialarına karşı cevabi hususları giriniz.', + aiPromptGuide: 'Replik dilekçesini davalının cevaplarına nokta atışı karşı argümanlar sunacak şekilde yaz.' + }, + { + id: 'hmk-istinaf', + title: 'İstinaf Başvuru Dilekçesi (Hukuk)', + shortTitle: 'Hukuk İstinaf', + categoryId: 'hmk', + lawRef: 'HMK m. 342', + courtType: 'Bölge Adliye Mahkemesi (BAM) İlgili Hukuk Dairesi', + keyElements: [ + 'İlk Derece Mahkemesi Karar Bilgileri (Esas ve Karar No)', + 'Tebliğ Tarihi ve Süresinde Başvuru Kaydı', + 'Somut İstinaf Sebepleri (Usul ve Esas Yönünden Hukuka Aykırılıklar)', + 'Kararın Kaldırılması ve Yeniden Hüküm Kurulması İstemi' + ], + suggestedNotes: 'Mahkeme kararındaki usul ve esas hatalarını ve eksik bilirkişi incelemesini belirtiniz.', + aiPromptGuide: 'HMK 342 kapsamında gerekçeli istinaf dilekçesi yaz. Mahkemenin hangi delili eksik incelediğini ve hangi kanun hükmünü yanlış uyguladığını detaylandır.' + }, + { + id: 'hmk-temyiz', + title: 'Temyiz Başvuru Dilekçesi (Hukuk)', + shortTitle: 'Hukuk Temyiz', + categoryId: 'hmk', + lawRef: 'HMK m. 364', + courtType: 'Yargıtay İlgili Hukuk Dairesi', + keyElements: [ + 'BAM Karar Bilgileri ve Tebliğ Tarihi', + 'Bozma Sebepleri (Kanun Maddesinin Yanlış Uygulanması, Görev/Yetki Hatası)', + 'Yargıtay İçtihatları ile Çelişki Göstergeleri', + 'BAM Kararının Bozulması Talebi' + ], + suggestedNotes: 'BAM kararının Yargıtay içtihatlarına ve kanuna aykırı kısımlarını giriniz.', + aiPromptGuide: 'Yargıtay temyiz incelemesi için HMK 364 gerekçeli temyiz dilekçesi kurgula.' + }, + + // 2. CEZA YARGILAMASI (CMK & TCK) + { + id: 'cmk-savunma', + title: 'Esas Hakkında Savunma Dilekçesi', + shortTitle: 'Esas Hakkında Savunma', + categoryId: 'cmk', + lawRef: 'CMK m. 216', + courtType: 'Ağır Ceza Mahkemesi / Asliye Ceza Mahkemesi', + keyElements: [ + 'İddianame ve Mütalaadaki Suçlamaların Analizi', + 'Maddi ve Manevi Unsur Yokluğu İzahı', + 'Hukuka Aykırı Delillerin Dosyadan Çıkarılması Talebi (CMK 206/2-a, 217/2)', + 'Şüpheden Sanık Yararlanır İlkesi Vurgusu', + 'Öncelikle Beraat, Aksi Halde Lehe Hükümlerin Uygulanması Talebi' + ], + suggestedNotes: 'Mütalaadaki hangi suçlamaların mesnetsiz olduğunu ve sanığın masumiyet delillerini yazınız.', + aiPromptGuide: 'CMK 216 esas hakkında savunma dilekçesi oluştur. Dosya kovuşturma evresindedir, kişi "Sanık"tır. Suçun unsurlarının oluşmadığını ve şüpheden sanık yararlanır ilkesini vurgula.' + }, + { + id: 'cmk-tutuklama-itiraz', + title: 'Tutukluluğa İtiraz ve Tahliye Talebi', + shortTitle: 'Tutukluluğa İtiraz', + categoryId: 'cmk', + lawRef: 'CMK m. 101, 104, 267', + courtType: 'Nöbetçi Asliye Ceza / Nöbetçi Ağır Ceza Mahkemesi', + keyElements: [ + 'Tutuklama Karar Tarihi ve Gerekçelerinin Hukuki Eleştirisi', + 'Kaçma ve Delil Karartma Şüphesinin Somut Olmadığı İzahı', + 'Kuvvetli Suç Şüphesini Gösteren Somut Delil Bulunmadığı', + 'Ölçülülük İlkesi ve Adli Kontrolün Yeterli Olacağı Vurgusu (CMK 109)', + 'Tahliye veya Adli Kontrol Talebi' + ], + suggestedNotes: 'Şüphelinin/sanığın sabit ikametgâhı, kaçma şüphesinin bulunmadığı ve delillerin toplandığını belirtiniz.', + aiPromptGuide: 'CMK 101-104 tutukluluğa itiraz dilekçesi yaz. AİHM ve AYM içtihatları doğrultusunda tutuklamanın son çare olduğu ve adli kontrol tedbirlerinin ölçülü olacağını vurgula.' + }, + { + id: 'cmk-kyok-itiraz', + title: 'Kovuşturmaya Yer Olmadığı Kararına (KYOK) İtiraz', + shortTitle: 'KYOK İtiraz', + categoryId: 'cmk', + lawRef: 'CMK m. 173', + courtType: 'Nöbetçi Sulh Ceza Hâkimliği', + keyElements: [ + 'KYOK Veren Savcılık ve Soruşturma No', + 'Tebliğ Tarihi ve 15 Günlük Yasal Süre Kaydı', + 'Eksik Soruşturma İddiası (Toplanmayan Kamera, HTS, Tanık Delilleri)', + 'Kamu Davası Açılması İçin Yeterli Şüphenin Mevcut Olduğu', + 'KYOK Kararının Kaldırılması ve Dava Açılması Talebi' + ], + suggestedNotes: 'Savcılığın hangi delilleri toplamadan veya araştırmadan takipsizlik verdiğini yazınız.', + aiPromptGuide: 'CMK 173 takipsizlik kararına itiraz dilekçesi yaz. Eksik soruşturma yürütüldüğünü ve kamu davası açmaya yeterli şüphe bulunduğunu net delillerle ortaya koy.' + }, + { + id: 'cmk-istinaf', + title: 'İstinaf Başvuru Dilekçesi (Ceza)', + shortTitle: 'Ceza İstinaf', + categoryId: 'cmk', + lawRef: 'CMK m. 272, 273', + courtType: 'Bölge Adliye Mahkemesi (BAM) İlgili Ceza Dairesi', + keyElements: [ + 'İlk Derece Mahkemesi Kararı ve Tebliğ Tarihi', + 'Hukuka Aykırılık Nedenleri (Eksik İnceleme, Hatalı Niteleme, Savunma Hakkı Kısıtlaması)', + 'Hükmün Bozulması ve Beraat Talebi' + ], + suggestedNotes: 'Hükümdeki usul ve esas hatalarını, dinlenmeyen tanıkları veya eksik raporları giriniz.', + aiPromptGuide: 'CMK 273 uyarınca gerekçeli ceza istinaf dilekçesi oluştur.' + }, + + // 3. İCRA VE İFLAS (İİK) + { + id: 'iik-itiraz', + title: 'Ödeme Emrine İtiraz Dilekçesi (İlamsız İcra)', + shortTitle: 'Ödeme Emrine İtiraz', + categoryId: 'iik', + lawRef: 'İİK m. 62', + courtType: 'İlgili İcra Dairesi', + keyElements: [ + 'İcra Dosya No ve Tebliğ Tarihi (7 Günlük Süre)', + 'Borca, Faize ve Yetkiye Açık ve Koşulsuz İtiraz', + 'Takibin Durdurulması Talebi' + ], + suggestedNotes: 'Borcun bulunmadığı, faiz oranının fahiş olduğu veya icra dairesinin yetkisiz olduğunu belirtiniz.', + aiPromptGuide: 'İİK 62 ilamsız icra takibine itiraz dilekçesi yaz. Borcun tamamına, faize, ferilerine ve icra dairesinin yetkisine itiraz ederek takibin durdurulmasını sağla.' + }, + { + id: 'iik-itirazin-iptali', + title: 'İtirazın İptali Dava Dilekçesi', + shortTitle: 'İtirazın İptali', + categoryId: 'iik', + lawRef: 'İİK m. 67', + courtType: 'Asliye Ticaret / Asliye Hukuk Mahkemesi', + keyElements: [ + 'İcra Takibi ve Borçlunun Haksız İtirazı Bilgisi', + 'Alacağın Likit ve Belirli Olduğunun İspatı (Fatura, Sözleşme, Cari Hesap)', + 'İtirazın İptali ile Takibin Devamı', + '%20\'den Aşağı Olmamak Üzere İcra İnkâr Tazminatı Talebi' + ], + suggestedNotes: 'Alacağın dayanağı olan fatura, teslim tutanağı veya sözleşme detaylarını giriniz.', + aiPromptGuide: 'İİK 67 itirazın iptali dava dilekçesi yaz. İtirazın haksız ve kötü niyetli olduğunu, alacağın likit olduğunu kanıtla ve icra inkar tazminatını talep et.' + }, + + // 4. İDARE VE VERGİ (İYUK) + { + id: 'iyuk-iptal', + title: 'İdari İşlemin İptali ve Yürütmenin Durdurulması (YD)', + shortTitle: 'İptal & YD Davası', + categoryId: 'iyuk', + lawRef: 'İYUK m. 2, 27', + courtType: 'Nöbetçi İdare Mahkemesi', + keyElements: [ + 'İptali İstenen İdari İşlemin Tarih, Sayı ve Tebliğ Tarihi', + 'İşlemin Yetki, Şekil, Sebep, Konu ve Maksat Yönlerinden Sakatlığı', + 'Telafisi Güç veya İmkânsız Zarar ve Açık Hukuka Aykırılık Şartlarının Gerçekleştiği', + 'Öncelikle YD Kararı Verilmesi, Neticeten İşlemin İptali Talebi' + ], + suggestedNotes: 'İdari işlemin hangi hukuka aykırılıklar içerdiğini ve derhal durdurulmazsa doğacak zararları yazınız.', + aiPromptGuide: 'İYUK 2 ve 27 uyarınca yürütmenin durdurulması istemli idari iptal davası dilekçesi hazırla.' + }, + + // 5. İŞ VE SOSYAL GÜVENLİK + { + id: 'is-ise-iade', + title: 'İşe İade Dava Dilekçesi', + shortTitle: 'İşe İade Davası', + categoryId: 'is', + lawRef: 'İş Kanunu m. 18-21, 7036 sayılı Kanun', + courtType: 'Nöbetçi İş Mahkemesi', + keyElements: [ + 'Fesih Bildirim Tarihi ve Arabuluculuk Son Tutanağı Tarihi (Süre Kaydı)', + 'Feshin Geçerli Bir Sebebe Dayanmadığı', + 'Feshin Geçersizliğinin Tespiti ve İşe İade', + '4 Aya Kadar Boşta Geçen Süre Ücreti ve 4-8 Ay Arası İşe Başlatmama Tazminatı' + ], + suggestedNotes: 'İşçinin kıdemi, işyerindeki çalışan sayısı ve feshin haksız gerekçesini giriniz.', + aiPromptGuide: 'İş Kanunu m. 18-21 uyarınca işe iade dava dilekçesi kurgula.' + }, + + // 6. AİLE VE KİŞİLER HUKUKU (TMK) + { + id: 'tmk-bosanma-cekimeli', + title: 'Çekişmeli Boşanma Dava Dilekçesi', + shortTitle: 'Çekişmeli Boşanma', + categoryId: 'tmk', + lawRef: 'TMK m. 166', + courtType: 'Nöbetçi Aile Mahkemesi', + keyElements: [ + 'Evlilik Birliğinin Temelden Sarsılması Vakıaları (Kronolojik Olaylar)', + 'Kusur Durumu ve Karşı Tarafın Ağır Kusuru', + 'Müşterek Çocukların Tedbiren ve Kalıcı Velayeti Talebi', + 'Tedbir, İştirak ve Yoksulluk Nafakası Talepleri', + 'Maddi ve Manevi Tazminat Talepleri (TMK 174/1-2)' + ], + suggestedNotes: 'Karşı tarafın kusurlu davranışlarını, çocukların durumunu ve nafaka/tazminat taleplerinizi yazınız.', + aiPromptGuide: 'TMK 166/1 evlilik birliğinin temelden sarsılması nedeniyle çekişmeli boşanma dilekçesi yaz.' + }, + + // 7. GAYRİMENKUL & KİRA (TBK) + { + id: 'tbk-tahliye-ihtiyac', + title: 'Konut/İşyeri İhtiyacı Nedeniyle Tahliye Davası', + shortTitle: 'İhtiyaç Nedeniyle Tahliye', + categoryId: 'tbk', + lawRef: 'TBK m. 350', + courtType: 'Nöbetçi Sulh Hukuk Mahkemesi', + keyElements: [ + 'Kira Sözleşmesi Bilgileri ve Kira Başlangıç Tarihi', + 'İhtiyacın Gerçek, Samimi ve Zorunlu Olduğunun Somut Kanıtları', + 'Kira Dönemi Sonu ve Yasal Süresinde Açılan Dava', + 'Kiralananın Tahliyesi ve Teslimi İstemi' + ], + suggestedNotes: 'İhtiyaç sahibinin (ev sahibi veya 1. derece yakını) neden bu eve/işyerine zorunlu ihtiyacı olduğunu yazınız.', + aiPromptGuide: 'TBK 350 uyarınca konut veya işyeri ihtiyacı sebebiyle tahliye dava dilekçesi hazırla.' + }, + + // 8. USUL & KALEM TALEPLERİ + { + id: 'usul-mazeret', + title: 'Mesleki Mazeret Bildirim Dilekçesi', + shortTitle: 'Mazeret Dilekçesi', + categoryId: 'usul', + lawRef: 'HMK / CMK Usul Hükümleri', + courtType: 'İlgili Mahkeme', + keyElements: [ + 'Duruşma Gün ve Saati Bilgisi', + 'Mesleki Mazeret Sebebi (Çakışan Duruşma Mahkeme ve Dosya Bilgisi)', + 'Mazeretin Kabulü ve Yeni Duruşma Gününün UYAP Üzerinden Öğrenilmesine Karar Verilmesi' + ], + suggestedNotes: 'Çakışan diğer duruşmanızın mahkemesini ve dosya numarasını belirtiniz.', + aiPromptGuide: 'Standart mesleki mazeret dilekçesi hazırla. Kısa, net ve resmî dille mazeretin kabulünü talep et.' + }, + { + id: 'usul-sure-tutum', + title: 'Süre Tutum (Müddet-i Muhafaza) Dilekçesi', + shortTitle: 'Süre Tutum Dilekçesi', + categoryId: 'usul', + lawRef: 'CMK m. 273 / HMK m. 342', + courtType: 'Kararı Veren Mahkeme', + keyElements: [ + 'Tefhim Edilen Kısa Karar Bilgisi', + 'Yasal İstinaf/Temyiz Süresinin Korunması Kaydı', + 'Gerekçeli Kararın Tebliği Akabinde Ayrıntılı Gerekçeli İstinaf/Temyiz Dilekçesi Sunulacağı Beyanı' + ], + suggestedNotes: 'Kısa kararın tefhim tarihini belirtiniz.', + aiPromptGuide: 'Süre tutum dilekçesi yaz. Gerekçeli kararın tebliğine kadar istinaf süresinin tutulduğunu resmî üslupla beyan et.' + } +]; + +export function getPetitionById(idOrTitle: string): PetitionTypeItem | undefined { + if (!idOrTitle) return undefined; + const norm = idOrTitle.trim().toLowerCase(); + return PETITION_TYPES_CATALOG.find( + (p) => + p.id.toLowerCase() === norm || + p.title.toLowerCase() === norm || + p.shortTitle.toLowerCase() === norm || + norm.includes(p.title.toLowerCase()) + ); +} + +export function resolvePetitionContext(petitionIdOrTitle: string, userNotes?: string): { + systemPromptAddon: string; + enhancedNotes: string; + selectedItem?: PetitionTypeItem; +} { + const item = getPetitionById(petitionIdOrTitle); + if (!item) { + return { + systemPromptAddon: '', + enhancedNotes: userNotes || '' + }; + } + + const isCmk = item.categoryId === 'cmk'; + const cmkAddon = isCmk ? ` +[CEZA MUHAKEMESİ HUKUKU (CMK & TCK) KESİN KURALLARI]: +1. Soruşturma aşamasında kişi "Şüpheli", iddianamenin kabulü / tensip zaptından sonraki kovuşturma aşamasında "Sanık", kesinleşen hüküm sonrası "Hükümlü" olarak adlandırılır. +2. Mahkemede dava açıldıktan sonra dosya asla "iddianame aşamasında" veya "soruşturma evresinde" olamaz; dosya "Kovuşturma Evresi"ndedir. +3. İstinabe / talimat evrakları kovuşturma safhasında bir delil toplama işlemidir. +` : ''; + + const systemPromptAddon = ` +${cmkAddon} +DİLEKÇE TÜRÜ ÖZEL HUKUKİ TALİMATI: +Seçilen Dilekçe Türü: ${item.title} (${item.lawRef}) +Hedef Görevli Makam: ${item.courtType} +Zorunlu Hukuki Unsurlar & Kontrol Listesi: +${item.keyElements.map(el => `- ${el}`).join('\n')} + +DİLEKÇE OLUŞTURMA REHBERİ: +${item.aiPromptGuide} +`.trim(); + + const enhancedNotes = ` +[Dilekçe Türü: ${item.title} - Dayanak: ${item.lawRef}] +[Görevli Makam: ${item.courtType}] +Zorunlu Unsurlar: ${item.keyElements.join(', ')} +${userNotes && userNotes.trim() ? `Avukat Notları & Ek Talepler:\n${userNotes.trim()}` : ''} +`.trim(); + + return { + systemPromptAddon, + enhancedNotes, + selectedItem: item + }; +} diff --git a/src/routes/drafting.routes.ts b/src/routes/drafting.routes.ts index d30c2b5..603f718 100644 --- a/src/routes/drafting.routes.ts +++ b/src/routes/drafting.routes.ts @@ -1,9 +1,10 @@ import { Router } from 'express'; import { requireAuth } from '../middleware/auth'; -import { generateDraft, generateAngarya } from '../controllers/drafting.controller'; +import { generateDraft, generateAngarya, getPetitionCatalog } from '../controllers/drafting.controller'; const router = Router(); +router.get('/catalog', getPetitionCatalog); router.post('/generate', requireAuth, generateDraft); router.post('/generate-angarya', requireAuth, generateAngarya);