E-Fatura Schematron Doğrulaması
Bilindiği üzere belirli durumlara sahip iştiraklerin E-Fatura sistemine geçme zorunlulukları var. Hazırlanan faturalar XML biçiminde hazırlanmaktalar, fakat hazırlanan dökümanların Gelir İdaresi Başkanlığı tarafından sunulan dökümanlardaki kesin kıstaslara uyma zorunluluğu bulunuyor. Bu kıstaslar ise, ISO/IEC FDIS 19757-3 ile standart haline getirilen Schematron validasyon diliyle oluşturulmuştur.
Büyük bir parekende şirketinde .Net Developer olarak çalışan yakın bir arkadaşım, .Net ortamında Schematron validasyonu yapmak için uygun bir API bulunmadığını, Java ortamında bir çözüm bulup bulamayacağımızı söyledikten sonra, Java ile yazılmış birkaç kütüphane üzerinde denemeler yaptım. Bunun sonucunda UgliSch (Ugli Schematron Validator) ile Java ortamında sonuca vardım. Fakat .Net ortamıyla bir ilişik kurulması gerektiği için de, standalone olarak çalışan bir RESTful servis uygulaması geliştirdim. Şimdi sizlerle vardığım bu sonucu paylaşmak istemekteyim.
Schematron daha evvel belirttiğim üzere XML dökümanlarını validasyon/geçerleme işlemine tutuyor. Eğer XML dökümanı Schematron ile belirlenen kıstaslara uyuyorsa, XML geçerli, uymuyorsa da geçersiz oluyor. Yazılım ekosistemine bakıldığında XML validasyonu için yaygın biçimde XSD (XML Schema) teknolojisi kullanılsa da, Schematron’un XML Schema’ya göre artılarının bulunduğunu görmek zor değil.
Basit bir Schematron örneği
Aşağıdaki XML biçiminde tanımlanan Schematron içeriği, bir “end” isimli XML elemanının bir üstteki kardeşi ve adı start olana göre değer kıstası (büyüklük ) yapmakta, ve kıstas sağlanmadığında “The end page cannot be less than the start page” deyimini bildirmektedir.
<?xml version="1.0" encoding="UTF-8"?>
<sch:schema xmlns="http://purl.oclc.org/dsdl/schematron"
xmlns:sch="http://purl.oclc.org/dsdl/schematron">
<sch:pattern>
<sch:rule context="end">
<assert test=". > preceding-sibling::start">
The end page cannot be less than the start page
</assert>
</sch:rule>
</sch:pattern>
</sch:schema>
Geçerli bir XML dökümanı
Yukarıda tek bir kıstasa sahip Schematron dosyasına göre validasyona tabi tutulacak geçerli bir XML dökümanı aşağıdaki gibidir. (37 > 36 olduğu için döküman geçerlidir.)
<?xml version="1.0" encoding="UTF-8"?>
<text-pages-r>
<start>36</start>
<end>37</end>
</text-pages-r>
Geçersiz bir XML dökümanı
Bu kısımda ise end <= start olduğu durumda döküman geçersiz (invalid) olacaktır.
<?xml version="1.0" encoding="UTF-8"?>
<text-pages-r>
<start>36</start>
<end>30</end>
</text-pages-r>
Gelir İdaresi Başkanlığının sunduğu Schematron ve örnek E-Fatura dökümanları için de aslında yukarıdaki senaryo bire bir aynıdır. Döküman http://www.efatura.gov.tr/dosyalar/kilavuzlar/e-FaturaPaket.zip adresinden indirilebilmektedir. Bu dökümanın içerisindeki schematron dizini altındaki UBL-TR_Main_Schematron.xml isimli döküman Schematron kısıtlarının kök dosyası iken, xml dizini altındaki XML kütükleri ise, örnel fatura dökümanlarıdır.
Örnek uygulama aşağıdaki bağlantıdan Kodcu.com’a giriş yaparak erişebilirsiniz.
Tekrar görüşmek dileğiyle..
Tag:backend, e-fatura, schematron, Xml
7 Comments
Elinize sağlık çok yararlı bir çalışma olmuş
merhaba. Bu formata uygun olmayan bir xml dosyasını GİB e uygun formata dönüştürme işlemi yapılabilir bir işlem mi? Yardımcı olabilirseniz çok sevinirim.
bu işlem 300 mb kadar ram bellek kullanıyor. Aynı anda 100 kişi bu işlemi yaparsa sunucu patlar. bunla alakalı nasıl bir çözüme gidebiliriz?
Nasıl ölçümlediniz?
Bir faturanının xml dosyasını alıp şematrondan geçirdik o sırada Bellek Performansından inceledik.
Ayrıca gelir idaresinin efatura.gov.tr adresindeki efatura görüntüleyici uygulaması da aynı şeklide çalışıyor.
Bu herkesin kendi bilgisayarında kullanıldığı için sorun yok ama sunucuda kullanılırken aynı anda 100 faturayı kontrol ederken ram bellek kullanımını aşırı artacak ve sunucu donmaya başlayacaktır.
Tek fatura ile elde ettiğiniz sonuç yanıltıcı olabilir. 100 faturalık bir stres testi yazarak gerçek etkiyi gözlemleyebilirsiniz.
Elinize sağlık, çok güzel bir yazı olmuş.