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.

Bu sayfada
  1. GİB şematronu: altı dosya, 636 kural
  2. Kural neden koda çevrilmiyor
  3. XPath 2.0 meselesi
  4. Şematronun bakmadığı yer
  5. Sahte bulguyla mücadele
  6. Her bulgu aynı ağırlıkta değil
  7. Kendi dosyanızla deneyin

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 belgeKural (assert)
edefter_yevmiye.schYevmiye defteri (Y)131
edefter_kebir.schBüyük defter / kebir (K)123
envanter_defter.schEnvanter defteri (E)107 (105 canlı)
edefter_berat.schYevmiye ve kebir beratı (YB / KB)106
edefter_rapor.sche-Defter raporu (DR)94
envanter_berat.schEnvanter beratı (EB)77
Toplam638 → 636 canlı
638 değil 636 diyoruz, çünkü ikisini GİB'in kendisi yorum satırına almış. 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:

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.

Motor, desteklemediği hiçbir yapıyı sessizce doğru saymaz: bilinmeyen bir eksen, fonksiyon ya da yapı görürse derleme anında hata fırlatır. Bir kuralın "geçti" görünüp aslında hiç değerlendirilmemiş olması mümkün değil — bu, mali bir üründe kabul edilebilir tek davranış.

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.

Ölçüt şu: bir e-Defter denetleyicisi, GİB'in paketiyle birlikte dağıttığı kendi örnek dosyasını kendi kurallarından temiz geçirebilmelidir. Muin Müşavir'in şematron motoru bu yüzden XPath 2.0'ın kullanılan altkümesini açıkça uygular — hazır bir XPath 1.0 kütüphanesi bu testi geçemezdi.

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:

AileNe bakarÖrnek
YEV · TARYevmiye 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
EDFDosya ve parça düzeniDosya adlandırma standardı; parça (bölme) bütünlüğü; eksik ay veya eksik berat; entryNumberdocumentReference eşitliği
BELBelge bilgisiBelge bilgisi tamamen eksik; belge numarası boş; aynı belge iki kez kaydedilmiş
KDVKDV tutarlılığıMatrah × oran = KDV; toplam = matrah + KDV; oran geçerliliği; KDV hesabı ile matrah ilişkisi
HES · MIZHesap planı ve mizanAna/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 · KAPAçı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 · ORTVergisel izlerTevsik 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 · DOVKasa, cari ve dövizKasa bakiyesinin niteliği, cari hesap ve döviz değerleme izleri
VKLVeri kalitesiZorunlu alanın boş gelmesi, kaynağın bildirdiği eksikler
MAH · ACK · KOMMahsup fişi, açıklama ve hesap eşleşmesiMahsup 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 · MUKAnomali ve mükerrerlik izleriCari bazında olağandışı tutar; tek satırlı yüksek tutarlı mahsup; belge bakımından ayırt edilemeyen benzer kayıt
DNS · GEL · ZINDö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.

TuzakNe oluyorduKural
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.

Yanlış alarm gördüğünüzde kararı siz verirsiniz: bulguyu "yanlış pozitif" işaretlersiniz, aynı defterde bir daha karşınıza çıkmaz. Kapatma kararı notuyla birlikte saklanır — hangi bulguyu kimin, ne zaman, neden kapattığı defterle birlikte durur.

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:

EksenDeğerlerNe söyler
Önem (severity)CRITICAL · HIGH · MEDIUM · LOW · INFOBulgu gerçekse sonucu ne kadar ağır
Kesinlik (confidence)CERTAIN · PROBABLE · POSSIBLE · HEURISTICBulgunun gerçek olduğundan ne kadar eminiz
TipERROR · WARNING · INFO · REVIEWSizden 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.

Dosyalarınız bilgisayarınızdan çıkmaz. Muin Müşavir masaüstü uygulamasıdır; e-Defter XML'leri okunur, denetlenir ve sonuçlar bilgisayarınızdaki yerel veritabanında saklanır. Denetim için internet bağlantısı gerekmez.
Bir aylık defteri denetime sokun

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 deneyin
Muavin defter nedirHesap dökümü nasıl okunur Luca mizanından vergi hesabıHangi kolonlar gerekir KKEG rehberiDefterde hangi izler taranır Mükellef verisi nerede duruyorYerel veritabanı ve şifreli senkron

Bu 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.