feat(drafting): centralize petition knowledge, CMK/HMK procedural rules, and prompt resolver on backend
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user