static NetleEFatura GetSMMInvoice(Guid uuid) { var nef = new NetleEFatura(); nef.GUID = Guid.NewGuid().ToString(); /// Belge numarası, özel bir yapıdadır, ilk 3 karakter fatura serisi(Burada seri SMM olarak belirlendi), /// sonraki dört karakter yıl (2018) sonraki 9 karakter, müteselsil şekilde devam eden numara olmalıdır. /// Fatura numarası ve fatura tarihi birbiriyle sıralı olmalıdır. nef.DuzenlenmeTarihi = DateTime.Now; // Belge düzenlenme zamanı nef.Tip = NetleEFaturaType.SATIS; // Bu şekilde sabit belirtilmelidir. nef.Aciklama = "Yalnız : DörtBinYüz TL"; // Belgede not olarak eklenecek bir açıklama varsa yazılır. nef.No = "SMM2018000000315"; // Bu şekilde sabit olmalıdır. nef.Senaryo = NetleEFaturaSenaryoType.EARSIVBELGE; // Belgeyi kesen kişi / firmanın bilgileri. Belge bir şahıs tarafından kesiliyorsa Sahis bölümü doldurulmalıdır. nef.Tedarikci = new Tedarikci { FirmaAdi = "SMMİsim SMMSoyisim ", Il = "test", IlceSemt = "test", Sokak = "Test adres 03", Sahis = new Sahis { Ad = "SMMİsim", Soyad = "SMMSoyisim" }, /// Belgeyi kesen firmanın vergi kimlik numarası ya da şahsın tc kimlik no'su. /// Burada verilen değer, test hesabınıza tanımlı tckn değeridir, değiştirmeniz halinde sistemden hata alırsınız VergiNoTCKimlikNo = "98745612309", Ulke = "TR", VergiDairesi = "Test" }; nef.Musteri = new Musteri() // Belgenin alıcısı { FirmaAdi = "Musteriİsim MusteriSoyisim", Sokak = "Test", Il = "İzmir", IlceSemt = "Test", // Bir şahsa kesiliyorsa doldurulmalı Sahis = new Sahis { Ad = "Musteriİsim", Soyad = "MusteriSoyisim" }, VergiNoTCKimlikNo = "20231264774", Ulke = "TR", VergiDairesi = "Test" }; // Faturanın kalemleri bu listeye atılacak, sonrasında nef nesnesinin FaturaKalemleri elemanı bu listenin array'e çevrilmesiyle elde edilecek var fatKalemList = new List <FaturaKalemi>(); /// ilk fatura kalemi var fatKalem = new FaturaKalemi(); // Burada standart uluslararası birim kodları kullanılmalıdır. C62 Adet anlamına gelir. fatKalem.Birim = "C62"; fatKalem.BirimFiyat = 113.6364; fatKalem.ToplamTutar = 113.6364; fatKalem.DovizTipi = "TRY"; // Verilen hizmetin ismi de yazılabilir. fatKalem.StokAdi = "Deneme"; /// Fatura kaleminin vergileri bu listeye atılacak, sonrasında FaturaKalemi nesnesinin /// Vergiler elemanı bu listenin array'e çevrilmesiyle elde edilecek. var vergiler = new List <Vergi>(); // vergi türü, 0015 Kdv anlamına gelmektedir. var vergi = new Vergi(); vergi.Tur = TaxCodeContentType.Item0015; vergi.Oran = 8; vergi.Tutar = 9.0909; vergi.Matrah = 113.6364; vergiler.Add(vergi); // vergi türü, 0003 stopaj anlamına gelmektedir. vergi = new Vergi(); vergi.Tur = TaxCodeContentType.Item0003; vergi.Oran = 20; vergi.Tutar = 22.7273; vergi.Matrah = 113.6364; vergiler.Add(vergi); fatKalem.Vergiler = vergiler.ToArray(); fatKalemList.Add(fatKalem); /// ikinci fatura kalemi /// fatKalem = new FaturaKalemi(); fatKalem.Birim = "C62"; fatKalem.BirimFiyat = 2840.9091; fatKalem.ToplamTutar = 2840.9091; fatKalem.DovizTipi = "TRY"; fatKalem.StokAdi = "Deneme 2"; vergiler = new List <Vergi>(); vergi = new Vergi(); vergi.Tur = TaxCodeContentType.Item0015; vergi.Oran = 8; vergi.Tutar = 227.2727; vergi.Matrah = 2840.9091; vergiler.Add(vergi); vergi = new Vergi(); vergi.Tur = TaxCodeContentType.Item0003; vergi.Oran = 20; vergi.Tutar = 568.1818; vergi.Matrah = 2840.9091; vergiler.Add(vergi); fatKalem.Vergiler = vergiler.ToArray(); fatKalemList.Add(fatKalem); /// üçüncü fatura kalemi fatKalem = new FaturaKalemi(); fatKalem.Birim = "C62"; fatKalem.BirimFiyat = 1704.5455; fatKalem.ToplamTutar = 1704.5455; fatKalem.DovizTipi = "TRY"; fatKalem.StokAdi = "Deneme 3"; vergiler = new List <Vergi>(); vergi = new Vergi(); vergi.Tur = TaxCodeContentType.Item0015; vergi.Oran = 8; vergi.Tutar = 136.3636; vergi.Matrah = 1704.5455; vergiler.Add(vergi); vergi = new Vergi(); vergi.Tur = TaxCodeContentType.Item0003; vergi.Oran = 20; vergi.Tutar = 340.9091; vergi.Matrah = 1704.5455; vergiler.Add(vergi); fatKalem.Vergiler = vergiler.ToArray(); fatKalemList.Add(fatKalem); nef.FaturaKalemleri = fatKalemList.ToArray(); /// Toplam tutara ilişkin bilgiler oluşturuluyor: /// Toplam tutar için toplam vergi bilgisi oluşturuluyor vergiler = new List <Vergi>(); vergi = new Vergi(); vergi.Tur = TaxCodeContentType.Item0015; vergi.Oran = 8; vergi.Tutar = 372.73; vergi.Matrah = 4659.125; vergiler.Add(vergi); vergi = new Vergi(); vergi.Tur = TaxCodeContentType.Item0003; vergi.Oran = 20; vergi.Tutar = 931.82; vergi.Matrah = 4659.1; vergiler.Add(vergi); nef.Vergiler = vergiler.ToArray(); nef.ToplamTutar = 4659.09; nef.OdenecekToplamTutar = 4100; nef.DovizTipi = "TRY"; nef.VergilerDahilTutar = 4100; nef.KaynakDokumanTuru = KaynakDokumanTuru.ESERBESTMESLEKMAKBUZU; /// SMM belgeleri alıcıya iki şekilde gönderilir, kağıt çıktısı alınarak ya da elektonik yolla e-posta gönderilerek. /// Bu gönderim tipi belgede belirtilmelidir çünkü bu bilgi emtegratör tarafından ay sonunda oluşturulup /// GIB'e gönderilecek raporda doğru biçimde bildirilmelidir. nef.GonderimTipi = GonderimTipi.KAGIT; return(nef); }
/// <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 }