Skip to content

Sektör Vakası: Faturadan Kalem Çıkarma + e-Fatura Entegrasyonu

Türkiye'de yaygın senaryo: PDF/görsel faturadan satır kalemlerini çıkarıp e-Fatura formatına dönüştürme. Tam pipeline.

Şükrü Yusuf KAYA
13 min read
Intermediate

Vaka: e-Fatura Kalem Çıkarımı

Senaryo: Türkiye'de küçük muhasebe firması. Müşterilerden gelen kâğıt + PDF faturaları e-Fatura sistemine aktarmak gerekiyor. Manuel: 1 fatura = 8 dk. Hedef: < 30sn.

1. Schema Tanımı#

python
from pydantic import BaseModel, Field, validator
from typing import List, Literal
from datetime import date
from decimal import Decimal
 
class Item(BaseModel):
description: str
quantity: Decimal = Field(gt=0)
unit: Literal["adet", "kg", "lt", "m", "m2", "m3", "saat"]
unit_price: Decimal = Field(gt=0)
vat_rate: Literal["0", "1", "8", "10", "18", "20"] # KDV oranları
 
@property
def total(self) -> Decimal:
return self.quantity * self.unit_price
 
@property
def vat_amount(self) -> Decimal:
return self.total * Decimal(self.vat_rate) / 100
 
class Invoice(BaseModel):
seller_vkn: str = Field(pattern=r"^\d{10}$") # vergi numarası
seller_name: str
buyer_vkn_or_tckn: str = Field(pattern=r"^\d{10,11}$")
buyer_name: str
invoice_no: str
invoice_date: date
items: List[Item] = Field(min_length=1)
 
@property
def grand_total(self) -> Decimal:
return sum(i.total + i.vat_amount for i in self.items)
e-Fatura için tam Pydantic schema

2. Vision LLM ile Çıkarım#

python
import base64
from anthropic import Anthropic
 
client = Anthropic()
 
with open("fatura.pdf.png", "rb") as f:
img_b64 = base64.standard_b64encode(f.read()).decode()
 
system = """Sen bir Türk e-Fatura veri çıkarma uzmanısın.
Verilen fatura görselinden tüm bilgileri çıkar.
 
Önemli:
- Vergi numarası 10 hane (kurum) veya TC Kimlik 11 hane (birey)
- KDV oranları: 0, 1, 8, 10, 18, 20 (yeni: %20)
- Tutarlar Türk Lirası, ondalık virgül (1.234,56) → 1234.56'ya dönüştür
- Tarih: GG.AA.YYYY veya GG/AA/YYYY → YYYY-MM-DD
 
Eksik/okunamayan alanlar → "needs_review": true ekle ve neyin eksik olduğunu söyle."""
 
r = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=2000,
system=system,
messages=[{
"role": "user",
"content": [
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": img_b64}},
{"type": "text", "content": "Bu faturayı işle, JSON döndür."}
]
}]
)
 
# Validation
import json
data = json.loads(r.content[0].text)
invoice = Invoice.model_validate(data)
print(invoice.grand_total)
Vision LLM ile fatura → schema

3. Hata Yönetimi#

Model çıkarımına confidence skoru ekletbil. Eşik altında insan inceler.
class ExtractedInvoice(BaseModel): invoice: Invoice confidence: float = Field(ge=0, le=1) needs_review: bool review_reasons: List[str] = []
confidence < 0.85 veya needs_review → kuyruk → human.
Production sonucu: Bu pattern ile (Claude Sonnet 4.6 vision + Pydantic + cross-check) Türkiye'de bir muhasebe firması fatura işleme süresini 8 dk → 22 sn'ye düşürdü. Hatalı kayıt oranı %3.2 → %0.4.

Yorumlar & Soru-Cevap

(0)
Yorum yazmak için giriş yap.
Yorumlar yükleniyor...

Related Content

Connected pillar topics

Pillar topics this article maps to