/// <summary> /// Senaryo 1 /// • Token oluşturma. /// • NetleEFatura formatında bir e-arşiv hazırlama. /// • Faturayı web servise gönderme. /// • Faturayı indirme. /// • Faturanın html’ini alma. /// </summary> public static void PrepareElectronicArchiveByNetleEFatura() { Integration10 client = new Integration10(); client.Url = @" https://efaturatest.inposia.com.tr/CommonInvoice.Web.Service/Integration10.asmx"; var token = client.CreateUserToken(@"UserName", "Password", ModuleType.eArchive); var nef = new NetleEFatura(); #region [ invoice header ] var uniqueId = Guid.NewGuid(); nef.GUID = uniqueId.ToString(); nef.Tedarikci = new Tedarikci() // sender information { FirmaAdi = "Sender Company", // company name VergiNoTCKimlikNo = "1122334456", // company tax number WebAdresi = "www.inposia.com.tr", // web address Il = "izmir", // city IlceSemt = "konak", //district Ulke = "Türkiye", //country PostaKodu = "35000", // postal code VergiDairesi = "konak" // tax office }; nef.Musteri = new Musteri() // receiver / customer information { Alias = "urn:mail:[email protected]", // receiver alias FirmaAdi = "Receiver Company", // company name VergiNoTCKimlikNo = "1623427874", // company tax number WebAdresi = "www.inposia.com.tr", // web adress Il = "izmir", // city IlceSemt = "konak", // district Ulke = "Türkiye", // country PostaKodu = "35310", // post code VergiDairesi = "konak" //tax office }; nef.DuzenlenmeTarihi = DateTime.Now; nef.No = "ABC2016000000629"; nef.DovizTipi = "TRY"; nef.KDVTutari = 36; nef.ToplamTutar = 200; nef.OdenecekToplamTutar = 236; nef.Tip = NetleEFaturaType.SATIS; nef.Senaryo = NetleEFaturaSenaryoType.TEMELFATURA; #endregion #region [ items ] nef.FaturaKalemleri = new FaturaKalemi[] { new FaturaKalemi() { Aciklama = "energry drink", //description Miktar = 2, // quantity MusteriStokNo = "MusStok001", // customer stock code TedarikciStokNo = "TedStok001", // supplier stock code UreticiStokNo = "UretStok001", // manufacturer stock code BirimFiyat = 100, // unit price ToplamTutar = 200, // total amount KDVOrani = 18, //vat rate KDVTutari = 36, // vat amount StokAdi = "energy drink", // item name Birim = "NIU", // unit DovizTipi = "TRY" // currency } }; #endregion var uuid = Guid.NewGuid(); client.UploadInvoice(token, uuid, "", nef); var di = client.GetEArchiveStatus(token, uuid); Console.WriteLine("Status : " + di.OK); var html = client.GetCommonDocumentHtmlByUUID(token, uuid); }
/// <summary> /// • (daha önceden güvenlik-token) yoksa, oluştur ve işlemlere hazır hale gel /// • NetleEFatura formatında bir e-arşiv hazırlama. /// • Faturayı web servise gönderme. /// </summary> public static void NetleEFaturaNesnesiniEArsivIcinHazirlaVeGonder() { CheckToken(); var nef = new NetleEFatura(); #region [ invoice header ] ///e-arşiv belgesi için tekil anahtar değeri ///bu örnekte yeni yaratılıyor... ///eğer gitmemiş ya da daha önceden veri tabanına yazılan bir kayıt varsa, o değer kullanılmalıdır var uniqueId = Guid.NewGuid(); nef.GUID = uniqueId.ToString(); nef.Tedarikci = new Tedarikci() // sender information { FirmaAdi = "Sender Company", // company name VergiNoTCKimlikNo = "1122334456", // company tax number WebAdresi = "www.inposia.com.tr", // web address Il = "izmir", // city IlceSemt = "konak", //district Ulke = "Türkiye", //country PostaKodu = "35000", // postal code VergiDairesi = "konak" // tax office }; nef.Musteri = new Musteri() // receiver / customer information { Alias = "urn:mail:[email protected]", // receiver alias FirmaAdi = "Receiver Company", // company name VergiNoTCKimlikNo = "1623427874", // company tax number WebAdresi = "www.inposia.com.tr", // web adress Il = "izmir", // city IlceSemt = "konak", // district Ulke = "Türkiye", // country PostaKodu = "35310", // post code VergiDairesi = "konak" //tax office }; nef.DuzenlenmeTarihi = DateTime.Now; ///bu değer gönderici firma bazında tekil olmalıdır. ///GİB tarafından belirlenen formata uygun hazırlanmalıdır. ///Gönderici firma ve modül bazında (efatura, earsiv, eirsaliye, esmm, emm) PREFIX (ABC) değeri tekil olmalıdır ///earsiv icin "ABC" kullanılıyorsa, efatura icin kesinlikle "ABC" başlangıç (PREFIX) değeri kullanılamaz!!! ///yıl 2020 : bu değer fatura tarihindeki yıl bilgisidir. Fatura tarihindeki YIL ile No içindeki YIL değeri aynı olmalıdır. ///son 9 hane : bu alan tekil, ardışık (sıra atlamadan) üretilmelidir. Bu numara VUK sistemindeki basılı - kağıt fatura serisi numarası ///gibi işlenmelidir. nef.No = "ABC" + nef.DuzenlenmeTarihi.Year.ToString() + "000000629"; nef.DovizTipi = "TRY"; nef.KDVTutari = 36; nef.ToplamTutar = 200; nef.OdenecekToplamTutar = 236; nef.Tip = NetleEFaturaType.SATIS; nef.Senaryo = NetleEFaturaSenaryoType.TEMELFATURA; #endregion #region [ items ] nef.FaturaKalemleri = new FaturaKalemi[] { new FaturaKalemi() { Aciklama = "energry drink", //description Miktar = 2, // quantity MusteriStokNo = "MusStok001", // customer stock code TedarikciStokNo = "TedStok001", // supplier stock code UreticiStokNo = "UretStok001", // manufacturer stock code BirimFiyat = 100, // unit price ToplamTutar = 200, // total amount KDVOrani = 18, //vat rate KDVTutari = 36, // vat amount StokAdi = "energy drink", // item name Birim = "NIU", // unit DovizTipi = "TRY" // currency } }; #endregion ///Öneri ///olusan belgeyi yerel sistemdeki (firma/desktop/web/cloud) veritabanına ekle ///daha onceden kontrol edilmis mi kontrol et, yoksa durumunu ='ErcStateMachineCode.Init' olarak UUID değeri ile ///veri tabanına ekle var uuid = Guid.Parse(nef.GUID); ///entegratör sistemi birçok duruma özel hata kodu fırlatabilir. ///örnek : şematron hatası, vergi kimlik hatası, tekrarlı kayıt vb. ///bu durumda işlem durum kodları guncellenmelidir. try { client.UploadInvoice(token, uuid, "", nef); ///Öneri ///entegratör sistemine ilgili tekil anahtarlı (UUID) belgesi başarılı şekilde iletildi ///SQL : Update ???? Set ///IslemKodu=0, ///IslemAciklamasi=null, ///FinalState=False, //durum sorgulama yöntemin bu belge dikkate alınacak ///Durum=ErcStateMachineCode.Uploaded ///Where UUID=nef.Guid } catch (System.Web.Services.Protocols.SoapException sexc) //entegratör tarafından SOAP tabanlı hata geliyor { var errorCode = GetErrorCodeFromSoapException(sexc); var errorMessage = sexc.Message; ///Öneri ///entegratör sistemine ilgili tekil anahtarlı (UUID) belgesi iletilememiş olabilir. ///durum kodu ve hata yerel sistemdeki veritabanında güncellenmelidir. ///SQL : Update ???? Set ///IslemKodu=errorCode, ///IslemAciklamasi=errorMessage, /////durum sorgulama yönteminde bu belge artık dikkate alınmayacak cunku ileri dönemde bu durum kodu değişmeyecek ///FinalState=True, ///Durum=ErcStateMachineCode.Failed ///Where UUID=nef.Guid throw new Exception("Entegratör ortamına ilgili e-arşiv belgesi iletilemedi. Hata : " + string.Join(":", errorCode, errorMessage)); } catch (Exception exc) //entegratör bağımsız olası hatalar gelebilir (ağ bağlantısı kesildi gibi) { ///Öneri ///entegratör sistemine ilgili tekil anahtarlı (UUID) belgesi iletilememiş olabilir. ///durum kodu ve hata yerel sistemdeki veritabanında güncellenmelidir. ///SQL : Update ???? Set ///IslemKodu="-1", //unknown exception code ///IslemAciklamasi=exc.Message, ///FinalState=False, ///Durum=ErcStateMachineCode.ReSendable ///Where UUID=nef.Guid throw new Exception("E-arşiv belgesi iletilemedi. Hata : " + exc.Message); } ///Öneri: ///gönderim sonrasında durum sorgulama işlemi modellenmemelidir. ///E-arşiv gönderimleri e-fatura süreçelerine göre daha kısa sürede cevaplanıyor olsa da ///ayrı bir işlem ile durum güncelleme süreci modellenemelidir. ///Durum sorgulama süreci iki yöntem şeklinde olabilir ///Sorgulama modeli 1: ///background-servis/thread/işlem gibi yerlerde durum kodlarına göre uygun durumda kayıtların tekil anahtarları alınmalı ///durum sorgulaması yapılmalı ve son durum guncellenmelidir /// ///Sorgulama modeli 2 : ///background ortamında yapılan işlem son kullanıcı tarafından anlık olarak da tetiklenebilmelidir. ///kullanıcı gönderilen e-arşiv listesini ekranda izledikten sonra, "refresh-durum kodlarını güncelle" gibi bir işlem ile anlık ///tetikleyebilir. ///Önerilen şekilde ve mimaride durum sorgulama yapılabilmesi icin bu kod içindeki diğer yönteme benzer adımlar tasarlanabilir. ///yöntem adı : EArsivBelgelerineIliskinDurumKodlariniGuncelleVeYerelSistemeYaz }