e-Defter denetimi: GİB'in kendi kuralları, dosyanızın üzerinde
Yevmiye · Kebir · Berat · Envanter · e-Defter raporu — Son güncelleme: 26 Ağustos 2026
Bir e-Defter dosyasının doğru olup olmadığına biz karar vermiyoruz — GİB karar veriyor. Gelir İdaresi Başkanlığı e-Defter paketiyle birlikte altı şematron kural dosyası yayımlar; Muin Müşavir bu dosyaları olduğu gibi, tek satırını değiştirmeden çalıştırır. Altı dosyada 636 canlı kural vardır ve altısı da bağlıdır. Bu sayfa, denetimin arkasında ne olduğunu anlatıyor.
1. GİB şematronu: altı dosya, 636 kural
Şematron, XML'in içeriğini XPath ifadeleriyle denetleyen bir kural dilidir. XSD şema "bu alan var mı, tipi doğru mu" der; şematron "bu alan varsa şu alan da olmalı", "bu tarih şundan büyük olamaz", "bu tutar sıfırdan büyük olmalı" der. e-Defter'in gerçek geçerlilik tanımı buradadır.
GİB paketinde altı şematron vardır ve her biri başka bir belge türü içindir. Her defter türü kendi şemasıyla denetlenir:
| Kural dosyası | Hangi belge | Kural (assert) |
|---|---|---|
edefter_yevmiye.sch | Yevmiye defteri (Y) | 131 |
edefter_kebir.sch | Büyük defter / kebir (K) | 123 |
envanter_defter.sch | Envanter defteri (E) | 107 (105 canlı) |
edefter_berat.sch | Yevmiye ve kebir beratı (YB / KB) | 106 |
edefter_rapor.sch | e-Defter raporu (DR) | 94 |
envanter_berat.sch | Envanter beratı (EB) | 77 |
| Toplam | 638 → 636 canlı |
envanter_defter.sch içinde iki assert <!-- --> arasına
alınmıştır; birinin test ifadesiyle hata mesajı da birbirini tutmuyor (mesaj
gl-bus:measurableCodeDescription derken test
gl-bus:measurableDescription arıyor). Kapalı kuralı sayıp "638 kural
çalışıyor" demek kolay olurdu; çalışan sayı 636.
Şemayı yanlış dosyaya uygulamak sessiz bir felakettir: kebirde entriesType
değeri ledger, yevmiyede journal'dır; kök eleman ve zorunlu
alanlar farklıdır. Yevmiye şemasını bir kebir dosyasına uygulayan bir araç size yüzlerce
"hata" gösterir ve hiçbiri gerçek değildir.
2. Kural neden koda çevrilmiyor
Şematron kurallarını TypeScript'e elle çevirmek, ilk bakışta daha hızlı görünen ama iki yerden sızdıran bir yoldur:
- 131 asserti çevirmek, 131 kez yanlış anlama fırsatıdır. Bir XPath ifadesinin niyetini yorumlayıp koda dökerken yapılan tek bir kayma, o kuralı sessizce ölü bırakır.
- GİB kuralı değiştirdiğinde kod eskir. Yeni paket çıktığında elle çevrilmiş kurallar hâlâ eski hâliyle çalışmaya devam eder — ve bunu kimse fark etmez.
Bu yüzden kurallar veri olarak durur: .sch dosyaları depoda GİB'den
geldiği hâliyle bulunur, ayrı bir şematron motoru onları çalıştırır. GİB kural dosyasını
yenilediğinde kod değişmez, dosya değişir.
3. XPath 2.0 meselesi
GİB'in kural dosyaları queryBinding="xslt2" ile yazılmıştır, yani XPath
2.0 semantiğine bağımlıdır. Bu ayrıntı teorik değil; kuralların doğru çalışıp
çalışmamasını belirliyor.
Somut örnek: şematrondaki
gl-cor:creationDate >= gl-cor:periodCoveredEnd kuralı. XPath 2.0'da iki
tarafı da düğümden gelen bir karşılaştırma metin olarak yapılır ve tarihler doğru
sıralanır. XPath 1.0'da ise >= daima sayısaldır:
number("2018-05-01") = NaN çıkar ve kural, GİB'in kendi örnek defterinde
hata verir.
4. Şematronun bakmadığı yer
Şematron dosyanın biçimini denetler: alan var mı, tip doğru mu, tarih tutarlı mı. Bakmadığı şey defterin muhasebesidir. GİB'in kuralları, borç ve alacağı denk ama kaydı yanlış hesaba atılmış bir fişten memnun kalır.
Bu boşluk için, her biri mevzuat dayanağı yazılı 148 kod tabanlı kontrol çalışır:
| Aile | Ne bakar | Örnek |
|---|---|---|
| YEV · TAR | Yevmiye bütünlüğü ve tarih sırası | Fişte borç/alacak eşitliği; numara sayacında boşluk veya yinelenme; dönem dışı tarih |
| EDF | Dosya ve parça düzeni | Dosya adlandırma standardı; parça (bölme) bütünlüğü; eksik ay veya eksik berat; entryNumber ↔ documentReference eşitliği |
| BEL | Belge bilgisi | Belge bilgisi tamamen eksik; belge numarası boş; aynı belge iki kez kaydedilmiş |
| KDV | KDV tutarlılığı | Matrah × oran = KDV; toplam = matrah + KDV; oran geçerliliği; KDV hesabı ile matrah ilişkisi |
| HES · MIZ | Hesap planı ve mizan | Ana/ara hesaba doğrudan kayıt; olağandışı bakiye karakteri; TDHP'de tanımsız ana hesap; defterden türetilen mizanla karşılaştırma |
| DON · KAP | Açılış ve kapanış | Açılış bakiyesi ve fiş denkliği; bilanço hesaplarının devri; yansıtma hesaplarının kapanışı; 590 → 570 devri |
| TEV · KKG · AMO · ORT | Vergisel izler | Tevsik zorunluluğu sınırının aşılması; kanunen kabul edilmeyen gider kalıpları; amortisman ayrılmamış olabilir; ortaklardan alacaklara adat işletilmemiş |
| KASA · CAR · DOV | Kasa, cari ve döviz | Kasa bakiyesinin niteliği, cari hesap ve döviz değerleme izleri |
| VKL | Veri kalitesi | Zorunlu alanın boş gelmesi, kaynağın bildirdiği eksikler |
| MAH · ACK · KOM | Mahsup fişi, açıklama ve hesap eşleşmesi | Mahsup fişinin dayanağı; genel ya da anlamsız açıklama; açıklama ile belge numarasının uyuşmaması; beklenmeyen borç/alacak kombinasyonu |
| ANM · ADL · MUK | Anomali ve mükerrerlik izleri | Cari bazında olağandışı tutar; tek satırlı yüksek tutarlı mahsup; belge bakımından ayırt edilemeyen benzer kayıt |
| DNS · GEL · ZIN | Dönemsellik, gelir–maliyet ve zincir tutarlılığı | Kıdem tazminatı karşılığı; satış olmadan maliyet; madde içi tarih ve taraf tutarlılığı |
Her kontrolün kaynağı kodda yazılıdır ve boş bırakılmaz: ilgili şematron assert'inin metni aynen alıntılanır, VUK maddesi ya da tebliğ bölümü belirtilir. Tahminle yazılmış kural yok.
5. Sahte bulguyla mücadele
Bir denetim listesinin işe yaraması için asıl sınav, bulduklarını değil bulmadıklarını doğru yapmasıdır. Üç yüz satırlık bir yanlış alarm listesi, hiç liste olmamasından kötüdür: müşavir listeye bir kez güvenini kaybederse gerçek hatayı da görmez.
| Tuzak | Ne oluyordu | Kural |
|---|---|---|
| Kebir tuzağı | Kebirde gl-cor:entryHeader bir yevmiye maddesi değil, bir hesap grubudur: dengeli olması beklenmez, satırları farklı tarihler taşır, lineNumber yevmiyedeki asıl satıra çapraz referanstır ve karışık sıradadır. Yevmiye kontrolleri kebirde çalıştırılsa her madde için yanlış pozitif üretirdi. |
Madde düzeyi kontrolleri yalnız Y parçalarında çalışır |
| Veri yok = bulgu yok | Excel'den gelen bir yevmiyede xbrli:identifier, gl-cor:enteredBy, gl-cor:lineNumber gibi XBRL-GL'e özgü alanlar hiç yoktur. Bunları "zorunlu alan boş" diye raporlamak gerçek bir defterde 268 fişte 536 bulgu üretiyordu. |
Kaynağında olmayan alanın yokluğu hata değildir |
| Tek hata, beş satır | Bir hatayı birden çok kontrol görür ve bu kaçınılmazdır: fişin tarihine bir kontrol, dosyanın kapsadığı döneme başka bir kontrol, GİB şematronu da aynı alana ayrı bir assert ile bakar. Şubat defterindeki tek bir dönem dışı tarih böylece beş bulgu üretiyordu. | Aynı konu + aynı kayıt = tek bulgu |
Tekilleştirmede güvenli taraf bellidir: etiketi olmayan bulgu asla birleştirilmez. Yani birleştirme, iki gerçek hatayı yanlışlıkla tek satıra indirme riski taşımaz.
6. Her bulgu aynı ağırlıkta değil
"Kesin hata" ile "bakılmalı" aynı listede karışırsa liste okunmaz olur. Bu yüzden her bulgu iki ayrı eksende etiketlenir:
| Eksen | Değerler | Ne söyler |
|---|---|---|
| Önem (severity) | CRITICAL · HIGH · MEDIUM · LOW · INFO | Bulgu gerçekse sonucu ne kadar ağır |
| Kesinlik (confidence) | CERTAIN · PROBABLE · POSSIBLE · HEURISTIC | Bulgunun gerçek olduğundan ne kadar eminiz |
| Tip | ERROR · WARNING · INFO · REVIEW | Sizden ne bekleniyor |
Denk olmayan bir fiş CRITICAL + CERTAIN'dir: tartışması yok. "Amortisman ayrılmamış olabilir" ise MEDIUM + HEURISTIC'tir: bakmanız gereken bir iz, iddia değil. İkisi listede aynı görünmez.
Her bulgunun yanında hangi kurala takıldığı, mevzuat dayanağı, beklenen ve gerçekleşen değer ve defterdeki konumu (parça, yevmiye no, satır no) yazar. Kontrol mantığı değiştiğinde sürüm numarası artar, böylece eski bulgular yeniden değerlendirilir.
7. Kendi dosyanızla deneyin
Bu sayfadaki her sayı depodaki koddan ve GİB'in kural dosyalarından geliyor. Ama bir denetim aracının değeri, tanıtım metninde değil sizin defterinizde ölçülür.
Elinizdeki bir aylık e-Defter paketini — yevmiye, kebir ve beratıyla birlikte — yükleyin. Ne bulduğumuzu görün, kendi bildiklerinizle karşılaştırın. Gördüğünüz bir bulgu yanlışsa bize yazın: kuralı ya düzeltiriz ya da neden öyle davrandığını dayanağıyla anlatırız. Şematron kuralları GİB'in, ama yanlış pozitifler bizim sorumluluğumuz.
Süresiz deneme sürümünü indirin, elinizdeki e-Defter paketini yükleyin ve bulgu listesini görün. Kural dosyaları GİB'in, kontroller dayanaklarıyla birlikte listede yazılı.
Ücretsiz deneyinBu sayfadaki kural sayıları GİB e-Defter paketindeki şematron dosyalarından ve Muin Müşavir deposundaki koddan sayılmıştır. GİB kural dosyalarını yenilediğinde sayılar değişir; anlatım bilgi amaçlıdır, mali müşavirlik hizmeti yerine geçmez.