feat(drafting): centralize petition knowledge, CMK/HMK procedural rules, and prompt resolver on backend

This commit is contained in:
Mustafa Yildiz
2026-08-22 19:20:35 +03:00
parent 6b92f75e4b
commit dd7fccdd0c
11 changed files with 505 additions and 23 deletions
View File
View File
View File
View File
View File
View File
View File
View File
+45 -22
View File
@@ -1,12 +1,13 @@
import { Response } from 'express'; import { Request, Response } from 'express';
import { supabase } from '../lib/supabase'; import { supabase } from '../lib/supabase';
import { AuthenticatedRequest } from '../middleware/auth'; import { AuthenticatedRequest } from '../middleware/auth';
import { callAiModelRaw, CEZA_MUHAKEMESI_REFERANSI, HUKUK_MAHKEMELERI_REFERANSI } from './document.controller'; import { callAiModelRaw, CEZA_MUHAKEMESI_REFERANSI, HUKUK_MAHKEMELERI_REFERANSI } from './document.controller';
import { findRelevantLegislation, LegislationMatch } from '../lib/legislationLookup'; import { findRelevantLegislation, LegislationMatch } from '../lib/legislationLookup';
import { shouldPersistLegacyTables } from '../lib/localFirstFlag'; import { shouldPersistLegacyTables } from '../lib/localFirstFlag';
import { resolvePetitionContext, PETITION_CATEGORIES, PETITION_TYPES_CATALOG } from '../lib/petitionKnowledge';
import crypto from 'crypto'; 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 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 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). (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 })); 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 // 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ı, // (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 // backend'deki zengin dilekçe usul ve kural motoruyla birleştirerek AI taslağı üretir.
// gerçek bir AI taslağı üretir.
export const generateDraft = async (req: AuthenticatedRequest, res: Response) => { export const generateDraft = async (req: AuthenticatedRequest, res: Response) => {
try { try {
const { case_id, petition_type, notes, template_id, latest_analysis_summary_json } = req.body || {}; 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.' }); return res.status(403).json({ error: 'Bu dosyaya erişim yetkiniz yok.' });
} }
// Faz 2 — analyses artık kalıcı olarak Postgres'te tutulmuyor. İstekte // Faz 2 — analyses artık kalıcı olarak Postgres'te tutulmuyor.
// gönderilmişse (Electron'un yerel SQLite'tan okuduğu son analiz) öncelikli
// kaynak; yoksa (eski istemci/web) mevcut Postgres sorgusuna düşülür.
let lastAnalysis: { summary_json: any } | null = latest_analysis_summary_json !== undefined let lastAnalysis: { summary_json: any } | null = latest_analysis_summary_json !== undefined
? { summary_json: latest_analysis_summary_json } ? { summary_json: latest_analysis_summary_json }
: null; : null;
@@ -103,10 +112,21 @@ export const generateDraft = async (req: AuthenticatedRequest, res: Response) =>
const ozet = lastAnalysis?.summary_json?.ozet; 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`; // Backend Merkezi Hukuki Prompt & Kural Çözümleyici
if (notes && String(notes).trim()) { const resolvedContext = resolvePetitionContext(petition_type, notes);
userContent += `Vurgulanmasını istediğiniz noktalar: ${String(notes).trim()}\n`;
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') { if (ozet && typeof ozet === 'string') {
userContent += `\nDosya Özeti (bağlam için):\n${ozet.slice(0, 4000)}\n`; 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); const legislationMatches = await findRelevantLegislation(legislationLookupText);
userContent += formatReferenceBlock(legislationMatches); 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; let draftRecord: { id: string; created_at?: string } | null = null;
if (shouldPersistLegacyTables()) { if (shouldPersistLegacyTables()) {
const { data, error: draftError } = await supabase const { data, error: draftError } = await supabase
@@ -130,7 +147,7 @@ export const generateDraft = async (req: AuthenticatedRequest, res: Response) =>
.insert([{ .insert([{
user_id: userId, user_id: userId,
case_id, case_id,
petition_type, petition_type: resolvedContext.selectedItem?.title || petition_type,
content: aiContent, content: aiContent,
template_id: template_id || null, template_id: template_id || null,
used_legislation: toTraceableLegislation(legislationMatches), 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() }; 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) { } catch (error: any) {
console.error('Generate Draft Error:', error); console.error('Generate Draft Error:', error);
res.status(500).json({ error: error.message || 'Internal Server 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.`; 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); 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; let draftRecord: { id: string; created_at?: string } | null = null;
if (shouldPersistLegacyTables()) { if (shouldPersistLegacyTables()) {
const { data, error: draftError } = await supabase const { data, error: draftError } = await supabase
+458
View File
@@ -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
};
}
+2 -1
View File
@@ -1,9 +1,10 @@
import { Router } from 'express'; import { Router } from 'express';
import { requireAuth } from '../middleware/auth'; import { requireAuth } from '../middleware/auth';
import { generateDraft, generateAngarya } from '../controllers/drafting.controller'; import { generateDraft, generateAngarya, getPetitionCatalog } from '../controllers/drafting.controller';
const router = Router(); const router = Router();
router.get('/catalog', getPetitionCatalog);
router.post('/generate', requireAuth, generateDraft); router.post('/generate', requireAuth, generateDraft);
router.post('/generate-angarya', requireAuth, generateAngarya); router.post('/generate-angarya', requireAuth, generateAngarya);