E-Fatura için UBL data oluşturma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
mmg
Üye
Mesajlar: 51
Kayıt: 19 Haz 2014 11:47

E-Fatura için UBL data oluşturma

Mesaj gönderen mmg » 08 Oca 2020 02:17

Merhabalar,

E-fatura için UBL formatında xml datası oluşturmam gerekiyor. Bugüne kadar aşağıda kod örneğinde görüleceği gibi xml data oluşturup entegratör portalına yüklemeyi yapıyordum. Fakat şimdi çalışılan entegratör xml datasını UBL formatında istiyor. UBL formatında e-fatura datasını nasıl oluşturabilirim ? Faturaların yüklenmesi gerekiyor zor durumdayım, acil yardımcı olabilir misiniz, çok rica ediyorum.

Kod: Tümünü seç

    XmlDoc:= NewXMLDocument;
    XmlDoc.Version := '1.0';
    XmlDoc.Encoding:= 'UTF-8';
    XmlDoc.Active := True;
    XmlDoc.Options  := [doNodeAutoIndent]; 
    XmlDoc.standalone:='no';

    RootNode                   := XmlDoc.AddChild('Invoices');
      Invoice                  := RootNode.AddChild('Invoice');
        ReceipentInfo          := Invoice.AddChild('ReceipentInfo');
          Identifications      := ReceipentInfo.AddChild('Identifications');
            Identification     := Identifications.AddChild('Identification');
              CurNode          := Identification.AddChild('Attribute');

ertank
Üye
Mesajlar: 1281
Kayıt: 11 Eyl 2015 11:45

Re: E-Fatura için UBL data oluşturma

Mesaj gönderen ertank » 08 Oca 2020 03:36

Merhaba,

Kullandığınız Delphi sürümünü bildirmemişsiniz.

UBL-TR formatında XML dosyasını XmlDoc kullanarak oluşturmanız zor ve yorucu olacaktır.

Sanırım Uyumsoft bir ara delphi client örneği temin ediyor idi. Ben kendi adıma karışık, anlaması zor ve Uyumsoft'a özel bulduğum için hiç dokunmadım. Standart UBL-TR ortaya çıkan XML içinde bir yerlerde oluyor idi. Yüksek ihtimalle sizin çalıştığınız özel entegratör de bunu kabul etmeyecektir.

1- Sıfırdan XML dosyasını metin dosyası gibi düşünerek işlem yapabilirsiniz. Sabit bilgileri sabit olarak kaydedip değişkenleri ekleyebilirsiniz.
2- Oluşturduğunuz XmlDoc dosyasını XML formatında diske kaydedip eksikleri (format düzeltmelerini) tamamlamak adına dosyayı okuyarak işlem yapabilirsiniz. Ancak bu noktada dikkatli olun. XML dosyası UTF-8 olarak kaydedilir. Başında BOM (Byte Order Mark) bilgisi bulunmaz. Bunu okumak için Delphi içinde BOM ile işlem yapmayan bir Encoding sınıfı oluşturup kullanmanız gerekebilir.

Sizin oluşturduğunuz XML dosyasında yüksek ihtimal ile namespace bilgileri eksik kalıyordur. Bunları sonradan eklemesi de o kadar kolay olmayabilir.

Bu öneriler dışında yapılabilecek birşey şu anda aklıma gelmiyor.

Acaba çalıştığınız entegratör firma böyle önemli bir değişiklik yapacağını daha önceden bildirmedi mi? Normalde değişiklikler önceden haber verilir.

mkysoft
Kıdemli Üye
Mesajlar: 3031
Kayıt: 25 Ağu 2003 11:35
Konum: İstanbul
İletişim:

Re: E-Fatura için UBL data oluşturma

Mesaj gönderen mkysoft » 08 Oca 2020 09:20

Metin işlemleri ile XML dosyası üretmeyin, çok başınız ağrır. Tavsiye edebileceğim en kısa yol fatura türlerinize göre ubl'leri uygulamanıza ekleyin ve taslak olarka kullanın. UBL'i yine xmldoc nesnesine yükleyerek sadece gerekli alanları değiştirerek ilerleyin.
Eski firmamdayken yayınlamış olduğumuz Delphi kodları işinize yarayabilir, Delhi 7, 2010 ve XE8 örnekleri içeriyor, şuradan ulaşabilirsiniz.
Ayrıca şurada detayını verdiğim bir paket hazırlamaya başladım, size uyarsa iletişime geçebilirsiniz.

mmg
Üye
Mesajlar: 51
Kayıt: 19 Haz 2014 11:47

Re: E-Fatura için UBL data oluşturma

Mesaj gönderen mmg » 08 Oca 2020 10:09

Merhabalar,
Yardımlarınız ve desteğiniz için teşekkür ediyorum. Delphi 10.2 kullanıyorum. Entegratör firma data tipinde değişiklik yapmadı, entegratör firma değiştirildi. Yeni entegratör bu şekilde istiyor. Problem maalesef bir anda ortaya çıktı. Anladığım kadarıyla xml datayı UBL'e çeviren bir yöntem bulunmuyor. XML data üretir gibi UBL data üretmek gerekiyor. Açıkçası UBL data hakkında hiç bilgi yok diyebilirim. Anladığım kadarıyla xmlden farkı sayfa dizaynı ve logo eklemeleri yapabiliyorsunuz. Örneğin XSLT dosyasını kullandırabiliyorsunuz UBL içinde. Bunlar bana çok yabancı. XSLT nasıl üretilir ? Örnek UBL ve XSLT dosyaları inceliyorum fakat işin içinden çıkamıyorum. Örneğin xslt de logo resmi yüklenilen satırdan sonra şifreli olduğunu düşündüğüm bir blok oluyor. Bu nasıl yapılır ? xslt oluşturan bir uygulama mı var ? Mutlaka e-fatura oluşturan arkadaşlarımız vardır diye düşünüyorum. Yardımlarınızı rica ediyorum.

mkysoft
Kıdemli Üye
Mesajlar: 3031
Kayıt: 25 Ağu 2003 11:35
Konum: İstanbul
İletişim:

Re: E-Fatura için UBL data oluşturma

Mesaj gönderen mkysoft » 08 Oca 2020 01:16

Xslt içinde şifreli olarak nitelediğiniz kısımlar Bas64 formatında resim dosyalarıdır. İnternette ücretsiz bir çok site var, base64 image converter diye ararsanız çıkar. Özel entegratörlere özgü yapıları kullanmalayın, sizleri servislerine bağımlı yapar. UBL'de bir xml'dir, çok farklı değil.

3ddark
Üye
Mesajlar: 79
Kayıt: 14 Eyl 2010 09:55
Konum: İstanbul

Re: E-Fatura için UBL data oluşturma

Mesaj gönderen 3ddark » 08 Oca 2020 11:26

Fikir vermesi adına size benim kendi kullandığım kodların bir kısmını not defterinde düzenleyerek buraya ekliyorum.
Dediğim gibi not defterinde düzenleme ile sildim, isim değişikliği ile düzenledim direkt kullanırsanız çalışmaz ama genel olarak yapıyı paylaştım. Bazı commentler yanlış veya eski olabilir.

XSLT dediğimiz şablonu da GİB baz bir örnek olarak veriyor. Bu baz dosya üzerinde görsellik adına değişiklik yapabilirsiniz.

Burada eFatura, eİrsaliye veya eArsiv Fatura gibi işlemlerin mantığı devlet tarafından belirlenen bir kalıp var. Bizim yapmamız gereken bu kalıp çerçevesinde XML uzantılı bir dosya oluşturmak.

Burada sizin referans noktanız GİB'in paylaştığı teknik dokümanlardaki bilgileri okuyarak hangi bilgilerin hangi durumlarda geleceğini bilmeniz ve programınızdaki fatura kaydı içinden gerekli bilgiler buraya alarak XML dosyayı oluşturmanız.

Tekrar belirtmek isterim direkt olarak kullanırsanız çalışan bir kod değil.
Ayrıca 3 saate yakındır sizin anlayacağınız şekilde kodlarda silme düzenleme yaptım. Umarım size yol gösterir.

Kod: Tümünü seç

//Kullanımı
function TFaturaUBL.SendInvoiceToService(out filename:string): Boolean;
var
  xmlDoc: TXMLDocument;
begin
  Result := False;
  ...
  ...
  xmlDoc := Self.CreateXMLHeader;   
  xmlDoc := Self.AddXMLEFaturaHeader(xmlDoc);
  xmlDoc := Self.AddXMLNotes(xmlDoc);
  xmlDoc := Self.AddXMLDocumentCurrencyCode(xmlDoc);
  xmlDoc := Self.AdditionalDocumentReferenceXSLT(xmlDoc);
  xmlDoc := Self.AdditionalDocumentReference(xmlDoc);
  xmlDoc := Self.AddAccountingSupplierParty(xmlDoc);
  xmlDoc := Self.AddAccountingCustomerParty(xmlDoc);
  xmlDoc := Self.AddBuyerCustomerParty(xmlDoc);
  xmlDoc := Self.AddDelivery(xmlDoc);
  xmlDoc := Self.AddAllowanceCharge(xmlDoc);
  xmlDoc := Self.AddExchangeRate(xmlDoc);
  xmlDoc := Self.AddTaxTotal(xmlDoc);
  xmlDoc := Self.AddLegalMonetaryTotal(xmlDoc);
  
  nSiraNo := 0;
  for n1 := 0 to faturaKalemSayisi-1 do
    xmlDoc := Self.AddInvoiceLine(xmlDoc, faturaKalem, n1+1);

  xmlDoc.SaveToFile( ownerFatura.FaturaNo + strHataFaturaID + '.xml');
  xmlDoc.Free;
end;

Kod: Tümünü seç

function TFaturaUBL.CreateXMLHeader: TXMLDocument;
begin
  Result := TXMLDocument.Create(nil);
  try
    Result.Options        := Result.Options + [doNodeAutoIndent];   //girintiyi otomatik ayarla
    Result.NodeIndentStr  := #9;                                    //girinti boyutunu ayarla

    Result.Active := True;
    Result.Version := '1.0';
    Result.Encoding := 'UTF-8';

    Result.DocumentElement := Result.CreateNode('Invoice');    //Root Node

    Result.DocumentElement.Attributes['xsi:schemaLocation'] := 'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 UBL-Invoice-2.1.xsd';
    Result.DocumentElement.DeclareNamespace('', 'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2');
    Result.DocumentElement.DeclareNamespace('cac', 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2');
    Result.DocumentElement.DeclareNamespace('cbc', 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2');
    Result.DocumentElement.DeclareNamespace('ccts', 'urn:un:unece:uncefact:documentation:2');
    Result.DocumentElement.DeclareNamespace('ext', 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2');
    Result.DocumentElement.DeclareNamespace('qdt', 'urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2');
    Result.DocumentElement.DeclareNamespace('ubltr', 'urn:oasis:names:specification:ubl:schema:xsd:TurkishCustomizationExtensionComponents');
    Result.DocumentElement.DeclareNamespace('udt', 'urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2');
    Result.DocumentElement.DeclareNamespace('xsi', 'http://www.w3.org/2001/XMLSchema-instance');

    //ZORUNLU(1)    
    //AÇIKLAMA=XSD dokümanının UBL versiyonu yazılacaktır.    
    //KULLANIM=Bu değer için “2.1” kullanılacaktır.     
    //ÖRNEK=<cbc:UBLVersionID>2.1</cbc:UBLVersionID>
    Result.DocumentElement.AddChild('cbc:UBLVersionID').Text := '2.1';        

    //ZORUNLU(1)    
    //AÇIKLAMA=UBL’ in özelleştirme numarasıdır.              
    //KULLANIM=Bu değer için “TR1.2” kullanılacaktır.   
    //ÖRNEK=<cbc:CustomizationID>TR1.2</cbc:CustomizationID>
    Result.DocumentElement.AddChild('cbc:CustomizationID').Text := 'TR1.2';   
  finally
  end;
end;

function TFaturaUBL.AddXMLEFaturaHeader(XmlDoc: TXMLDocument): TXMLDocument;
var
  profilID, faturaTipi : string;
begin
  Result := XmlDoc;

  if faturaKaydi.FaturaTipi = 'IHRACAT' then profilID := 'IHRACAT' else profilID := 'TEMELFATURA';

  //ZORUNLU(1)    
  //AÇIKLAMA=Kullanılan senaryodur.   
  //KULLANIM=Bknz. Kod Listeleri    
  //ÖRNEK=<cbc:ProfileID>TEMELFATURA</cbc: ProfileID>   
  //DEĞERLER=TEMELFATURA, TICARIFATURA, YOLCUBERABERFATURA, IHRACAT
  Result.DocumentElement.AddChild('cbc:ProfileID').Text           := profilID; 
  
  //ZORUNLU(1)    
  //AÇIKLAMA=Üç haneli alfanumerik birim kod ile 13 haneli müteselsil numaranın birleşiminden meydana gelen Fatura Numarası bu elemana yazılacaktır. 
  //  Müteselsil numaranın ilk dört hanesi faturanın düzenlendiği yılı kalan dokuz hane ise müteselsil numarayı ifade etmektedir. 
  //  Fatura düzenleyen bünyesinde aynı fatura numarası birden fazla kullanılamaz.   
  //KULLANIM=Alfanumerik    ÖRNEK=<cbc:ID>GIB2009000000001</cbc:ID>
  Result.DocumentElement.AddChild('cbc:ID').Text                  := faturaKaydi.FaturaNo;  
  
  //ZORUNLU(1)    
  //AÇIKLAMA=Bu elemanda düzenlenen faturanın asıl veya suret olduğu gösterilecektir.   
  //KULLANIM=Asıl ise “false”, suret ise “true”   
  //ÖRNEK=<cbc:CopyIndicator>true</cbc:CopyIndicator>
  Result.DocumentElement.AddChild('cbc:CopyIndicator').Text       := 'false'; 
  
  //ZORUNLU(1)    
  //AÇIKLAMA=Evrensel Tekil Tanımlama Numarası (ETTN), düzenlenen faturanın evrensel eşsizliğini sağlayan numaradır. 
  //  Bu numara fatura düzenleyen tarafından standartlara uygun olarak üretilip faturalarda kullanılacaktır.   
  //KULLANIM=GUID formatı   
  //ÖRNEK=<cbc:UUID>e093a490-dd99-11dd-ad8b-0800200c9a66</cbc:UUID>
  Result.DocumentElement.AddChild('cbc:UUID').Text                := faturaKaydi.ETTNNumarasi;  
  
  //ZORUNLU(1)      
  //AÇIKLAMA=Bu elemana faturanın düzenleme tarihi yazılacaktır.      
  //KULLANIM=Yıl-Ay-Gün (YYYY-AA-GG)  
  //ÖRNEK=<cbc:IssueDate>2009-01-01</cbc:IssueDate>
  Result.DocumentElement.AddChild('cbc:IssueDate').Text           := FormatDateTime('YYYY-MM-DD', faturaKaydi.FaturaTarihi);   
  
  //SEÇİMLİ(0..1)   
  //AÇIKLAMA=Bu elemana faturanın düzenleme saati yazılabilecektir.   
  //KULLANIM=Saat:Dakika:Saniye       
  //ÖRNEK=<cbc:IssueTime>14:50:00</cbc:IssueTime>
  Result.DocumentElement.AddChild('cbc:IssueTime').Text           := TimeToStr(faturaKaydi.FaturaSaati);  

  //ZORUNLU(1)    
  //AÇIKLAMA=Bu elemanda UBL-TR içerisinde yer alan fatura tiplerine ait kodlar yazılacaktır.   
  //KULLANIM=Bknz. Kod Listeleri    
  //ÖRNEK=<cbc:InvoiceTypeCode>SATIS</cbc:InvoiceTypeCode>    
  //DEĞERLER=SATIS, IADE, TEVKIFAT, ISTISNA, OZELMATRAH, IHRACKAYITLI
  Result.DocumentElement.AddChild('cbc:InvoiceTypeCode').Text     := faturaKaydi.FaturaTipi;
end;

function TFaturaUBL.AddXMLNotes(XmlDoc: TXMLDocument):TXMLDocument;
begin
  Result := XmlDoc;

  //SEÇİMLİ(0..n)   
  //AÇIKLAMA=Faturada yer verilmek istenen genel açıklamalar için bu eleman kullanılacaktır. 
  //  Birden fazla açıklama yapılmak istenmesi halinde elemanın tekrar kullanımı mümkündür.    
  //KULLANIM=Serbest Metin
  Result.DocumentElement.AddChild('cbc:Note').Text := 'bla bla açıklama satır 1';
  Result.DocumentElement.AddChild('cbc:Note').Text := 'satır 2 bla bla';
  Result.DocumentElement.AddChild('cbc:Note').Text := 'Banka Hesap Bilgileri...';
end;

function TFaturaUBL.AddXMLDocumentCurrencyCode(XmlDoc: TXMLDocument):TXMLDocument;
var 
  Node1 : IXMLNode;
    strProfilID, strFaturaTipi : string;
    fatura_ozeti : TViewFaturaOzeti;
    nIndex, nSiraNo: Integer;
    fs : TStream;
    old_seperator : Char;
    view_fatura_kdv_gruplari : TViewFaturaKdvGrupToplamlari;
    mal: TMal;
begin
  Result := XmlDoc;

  //Bu elemana faturanın düzenlendiği paranın birim kodu yazılacaktır.
  //Zorunlu(1)    Kullanım  Bknz. Kod Listeleri
  Node1 := Result.DocumentElement.AddChild('cbc:DocumentCurrencyCode');
  Node1.Text := 'TL';

  Result.DocumentElement.AddChild('cbc:LineCountNumeric').Text := '5';  //Toplam Fatura Kalem sayısı

  //Seçimli(0..1)   
  //Kullanım  Bknz. Ortak Sınıflar: Period    
  //Açıklama:Faturada dönem bilgisine yer verilmesi halinde bu eleman kullanılacaktır.
//  Node1 := Result.DocumentElement.AddChild('cac:InvoicePeriod');
//  Node1.AddChild('cbc:StartDate').Text    := '2009-08-13';
//  Node1.AddChild('cbc:EndDate').Text      := '2009-09-13';
//  Node1.AddChild('cbc:Description>').Text := 'Açıklama';


  //İrsaliye bilgileri için bu eleman kullanılabilecektir. Birden fazla irsaliyeye ait bilgilerin girilmesi ve irsaliye belgesinin faturaya eklenmesinde bu eleman kullanılabilecektir.
  //Kullanım  Bknz. Ortak Sınıflar: DocumentReference
  //Seçimli (0…1)   
  //Kullanım  Bknz. Ortak Sınıflar: OrderReference  
  //Açıklama:Sipariş bilgilerinin gösterilmesinde ve sipariş belgesinin faturaya eklenmesinde bu eleman kullanılabilecektir.
//  Node1 := Result.DocumentElement.AddChild('cac:OrderReference');
//    Node1.AddChild('cbc:ID').Text        := siparisNo;
//    Node1.AddChild('cbc:IssueDate').Text := FormatDateTime('YYYY-MM-DD', siparisTarihi);

  //Faturanın ilişkili olduğu diğer belgelerin bilgileri bu elemana yazılacaktır.
  //Seçimli (0…n)   Kullanım  Bknz. Ortak Sınıflar: BillingReference
//  Node1 := Result.DocumentElement.AddChild('cac:BillingReference');
//    Node1 := Node1.AddChild('cac:InvoiceDocumentReference');
//    Node1.AddChild('cbc:ID').Text        := '';//Döküman No
//    Node1.AddChild('cbc:IssueDate').Text := '';//Döküman Tarihi

  //İrsaliye bilgileri için bu eleman kullanılabilecektir. 
  //  Birden fazla irsaliyeye ait bilgilerin girilmesi ve irsaliye belgesinin faturaya eklenmesinde bu eleman kullanılabilecektir.
  //Seçimli (0…n)   Kullanım  Bknz. Ortak Sınıflar: DocumentReference
  Node1 := Result.DocumentElement.AddChild('cac:DespatchDocumentReference');
    Node1.AddChild('cbc:ID').Text        := irsaliyeNo;                                    
    Node1.AddChild('cbc:IssueDate').Text := FormatDateTime('YYYY-MM-DD', irsaliyeTarihi);  

  //Alındı bilgilerinin gösterilmesinde ve alındı belgesinin faturaya eklenmesinde bu eleman kullanılabilecektir.
  //Seçimli (0…n)   Kullanım  Bknz. Ortak Sınıflar: DocumentReference
//  Node1 := Result.DocumentElement.AddChild('cac:ReceiptDocumentReference>');
//    Node1.AddChild('cbc:ID').Text        := '';//No
//    Node1.AddChild('cbc:IssueDate').Text := '';//Tarih

  //Faturanın düzenlenmesine referans teşkil eden ilgili belgelere ait bilgiler bu elemana yazılacaktır.
  //Seçimli (0…n)   Kullanım  Bknz. Ortak Sınıflar: DocumentReference
//  Node1 := Result.DocumentElement.AddChild('cac:OriginatorDocumentReference>');
//    Node1.AddChild('cbc:ID').Text        := '';//No
//    Node1.AddChild('cbc:IssueDate').Text := '';//Tarih

  //Fatura ile ilgili kontrat dokümanın bilgilerinin gösterilmesinde bu eleman kullanılabilecektir.
  //Seçimli (0…n)   Kullanım  Bknz. Ortak Sınıflar: DocumentReference
//  Node1 := Result.DocumentElement.AddChild('cac:ContractDocumentReference>>');
//    Node1.AddChild('cbc:ID').Text        := '';//No
//    Node1.AddChild('cbc:IssueDate').Text := '';//Tarih
end;

function TFaturaUBL.AdditionalDocumentReferenceXSLT(XmlDoc: TXMLDocument): TXMLDocument;
var 
  Node1 : IXMLNode;
begin
  //İrsaliye, sipariş, kontrat, alındı ve diğer fatura belgeleri dışında faturaya eklenmek istenen diğer belgeler için bu eleman kullanılabilecektir. 
  //  Örneğin belge para birimi dışında ayrıca fatura düzenlenmek isteniyorsa bu fatura düzenlenip 
  //  AdditionalDocumentReference elemanının EmbeddedDocumentBinaryObject elemanına eklenebilir. 
  //  NOT: 433 nolu VUK genel tebliği kapsamında düzenlenen ÖKC bilgi fişi bilgileri bu elemana yazılacaktır.
  //Kullanız  Bknz. Ortak Sınıflar: DocumentReference
  //Seçimli (0…n)
  Result := XmlDoc;

  Node1 := Result.DocumentElement.AddChild('cac:AdditionalDocumentReference');
    Node1.AddChild('cbc:ID').Text        := faturaKaydi.ETTNNumarasi;
    Node1.AddChild('cbc:IssueDate').Text := FormatDateTime('YYYY-MM-DD', faturaKaydi.FaturaTarihi);

  Node1 := Node1.AddChild('cac:Attachment');
    Node1 := Node1.AddChild('cbc:EmbeddedDocumentBinaryObject');
    Node1.Attributes['characterSetCode']  := 'UTF-8';
    Node1.Attributes['encodingCode']      := 'Base64';
    Node1.Attributes['filename']          := faturaKaydi.FaturaNo + '.xslt';         //yukarıdaki cbc:ID (ETTN Numarası) değeri ile aynı olacak sonuna ".xslt" eklenecek
    Node1.Attributes['mimeCode']          := 'application/xml';
    Node1.Text := TGenel.FileToBase64(faturaKaydi.FaturaNo + '.xslt', XSLTSablonAdi); //xslt dosyasının base64 dönüştürülmüş kodu olacak
end;

function TFaturaUBL.AdditionalDocumentReference(XmlDoc: TXMLDocument): TXMLDocument;
var 
  Node1 : IXMLNode;
  old_seperator : Char;
begin
  Result := XmlDoc;

  old_seperator := FormatSettings.DecimalSeparator;
  FormatSettings.DecimalSeparator := '.';
  try
    //burası XSLT dosyasında verileri göstermi için eklendi. Ayrıca düzenlemeler yapıldı. Logo entegratör bir kısmını tanımlı gönderdi
    Node1 := Result.DocumentElement.AddChild('cac:AdditionalDocumentReference');
      Node1.AddChild('cbc:ID').Text             := FormatFloat('0.0000', sizinFaturaToplamlariniz);
      Node1.AddChild('cbc:IssueDate').Text      := FormatDateTime('YYYY-MM-DD', faturaKaydi.FaturaTarihi);
      Node1.AddChild('cbc:DocumentType').Text   := 'LINEEXTENSIONAMOUNT';

    Node1 := Result.DocumentElement.AddChild('cac:AdditionalDocumentReference');
      Node1.AddChild('cbc:ID').Text             := FormatFloat('0.0000', sizinFaturaToplamlariniz);
      Node1.AddChild('cbc:IssueDate').Text      := FormatDateTime('YYYY-MM-DD', faturaKaydi.FaturaTarihi);
      Node1.AddChild('cbc:DocumentType').Text   := 'TAXEXCLUSIVEAMOUNT';

    Node1 := Result.DocumentElement.AddChild('cac:AdditionalDocumentReference');
      Node1.AddChild('cbc:ID').Text             := FormatFloat('0.0000', sizinFaturaToplamlariniz);
      Node1.AddChild('cbc:IssueDate').Text      := FormatDateTime('YYYY-MM-DD', faturaKaydi.FaturaTarihi);
      Node1.AddChild('cbc:DocumentType').Text   := 'TAXINCLUSIVEAMOUNT';

    Node1 := Result.DocumentElement.AddChild('cac:AdditionalDocumentReference');
      Node1.AddChild('cbc:ID').Text             := FormatFloat('0.0000', sizinFaturaToplamlariniz);
      Node1.AddChild('cbc:IssueDate').Text      := FormatDateTime('YYYY-MM-DD', faturaKaydi.FaturaTarihi);
      Node1.AddChild('cbc:DocumentType').Text   := 'ALLOWANCETOTALAMOUNT';

    Node1 := Result.DocumentElement.AddChild('cac:AdditionalDocumentReference');
      Node1.AddChild('cbc:ID').Text             := FormatFloat('0.0000', sizinFaturaToplamlariniz);
      Node1.AddChild('cbc:IssueDate').Text      := FormatDateTime('YYYY-MM-DD', faturaKaydi.FaturaTarihi);
      Node1.AddChild('cbc:DocumentType').Text   := 'CHARGETOTALAMOUNT';

    Node1 := Result.DocumentElement.AddChild('cac:AdditionalDocumentReference');
      Node1.AddChild('cbc:ID').Text             := FormatFloat('0.0000', ownerFatura.ToplamTutar - ownerFatura.ToplamIskontoTutar - ownerFatura.GenelIskontoTutar);
      Node1.AddChild('cbc:IssueDate').Text      := FormatDateTime('YYYY-MM-DD', ownerFatura.FaturaTarihi);
      Node1.AddChild('cbc:DocumentType').Text   := 'NETTUTAR_TR';

    Node1 := Result.DocumentElement.AddChild('cac:AdditionalDocumentReference');
      Node1.AddChild('cbc:ID').Text             := FormatFloat('0.0000', ownerFatura.DovizTutar - ownerFatura.DovizIskontoTutar - ownerFatura.DovizGenelIskontoTutar);
      Node1.AddChild('cbc:IssueDate').Text      := FormatDateTime('YYYY-MM-DD', ownerFatura.FaturaTarihi);
      Node1.AddChild('cbc:DocumentType').Text   := 'NETTUTAR_DOVIZ';

    Node1 := Result.DocumentElement.AddChild('cac:AdditionalDocumentReference');
      Node1.AddChild('cbc:ID').Text             := FormatFloat('0.0000', dPayableAmount);
      Node1.AddChild('cbc:IssueDate').Text      := FormatDateTime('YYYY-MM-DD', ownerFatura.FaturaTarihi);
      Node1.AddChild('cbc:DocumentType').Text   := 'PAYABLEAMOUNT';
    //burası XSLT dosyasında verileri göstermi için eklendi. Ayrıca düzenlemeler yapıldı. Logo entegratör bir kısmını tanımlı gönderdi

    //Her KDV için ayrı ayrı girilecek
    Node1 := Result.DocumentElement.AddChild('cac:AdditionalDocumentReference');
      Node1.AddChild('cbc:ID').Text               := FormatFloat('0.0000', toplam18KDVTutariniz);
      Node1.AddChild('cbc:IssueDate').Text        := FormatDateTime('YYYY-MM-DD', faturaKaydi.FaturaTarihi);
      Node1.AddChild('cbc:DocumentTypeCode').Text := vergiKodu; //0015 KDV kodu
      Node1.AddChild('cbc:DocumentType').Text     := IntToStr(18);  //Fatura içindeki KDV oranınız
    //gibi
    Node1 := Result.DocumentElement.AddChild('cac:AdditionalDocumentReference');
      Node1.AddChild('cbc:ID').Text               := FormatFloat('0.0000', toplam8KDVTutariniz);
      Node1.AddChild('cbc:IssueDate').Text        := FormatDateTime('YYYY-MM-DD', faturaKaydi.FaturaTarihi);
      Node1.AddChild('cbc:DocumentTypeCode').Text := vergiKodu; //0015 KDV kodu
      Node1.AddChild('cbc:DocumentType').Text     := IntToStr(8); //Fatura içindeki KDV oranınız
  finally
    FormatSettings.DecimalSeparator := old_seperator;
  end;
end;

function TFaturaUBL.AddAccountingSupplierParty(XmlDoc: TXMLDocument): TXMLDocument;
var
  Node1, Node2, Node3, Node4 : IXMLNode;
  vAdres: string;
begin
  Result := XmlDoc;

  //Bu elemanda faturayı düzenleyen tarafın bilgileri yer alacaktır.
  //Kullanım  Bknz. Ortak Sınıflar: SupplierParty
  //Zorunlu(1)
  Node1 := Result.DocumentElement.AddChild('cac:AccountingSupplierParty');
    Node2 := Node1.AddChild('cac:Party');
      Node2.AddChild('cbc:WebsiteURI').Text := bizimWebSitesi;
      Node3 := Node2.AddChild('cac:PartyIdentification');
        Node4 := Node3.AddChild('cbc:ID');
        Node4.Text                    := bizimVergiNo;
        Node4.Attributes['schemeID']  := bizimMukellefTipi; //VKN veya TCKN ... gibi

      Node3 := Node2.AddChild('cac:PartyIdentification');
        Node4 := Node3.AddChild('cbc:ID');
        Node4.Text                    := bizimTicaretSicilNo;
        Node4.Attributes['schemeID']  := 'TICARETSICILNO';

      Node3 := Node2.AddChild('cac:PartyIdentification');
        Node4 := Node3.AddChild('cbc:ID');
        Node4.Text                    := bizimMersisNo;
        Node4.Attributes['schemeID']  := 'MERSISNO';

      Node3 := Node2.AddChild('cac:PartyName');
        Node3.AddChild('cbc:Name').Text := bizimFirmaUnvani;

      Node3 := Node2.AddChild('cac:PostalAddress');
        Node3.AddChild('cbc:StreetName').Text           := bizimAdres;  //UZUN
        Node3.AddChild('cbc:BuildingNumber').Text       := bizimKapiNo; //1
        Node3.AddChild('cbc:CitySubdivisionName').Text  := bizimIlce;   //PENDİK
        Node3.AddChild('cbc:CityName').Text             := bizimSehir;  //İSTANBUL
        Node3.AddChild('cbc:PostalZone').Text           := bizimPostaKodu;  //34123
        Node4 := Node3.AddChild('cac:Country');
          Node4.AddChild('cbc:IdentificationCode').Text := bizimUlkeKodu; //TR
          Node4.AddChild('cbc:Name').Text               := bizimUlke; //TÜRKİYE

      Node3 := Node2.AddChild('cac:PartyTaxScheme');
        Node4 := Node3.AddChild('cac:TaxScheme');
          Node4.AddChild('cbc:Name').Text               := bizimVergiDairesi;

      Node3 := Node2.AddChild('cac:Contact');
        Node3.AddChild('cbc:Telephone').Text      := bizimTel;
        Node3.AddChild('cbc:Telefax').Text        := bizimFax;
        Node3.AddChild('cbc:ElectronicMail').Text := bizimEPostaAdresi;
end;

function TFaturaUBL.AddAccountingCustomerParty(XmlDoc: TXMLDocument): TXMLDocument;
var 
  Node1, Node2, Node3, Node4 : IXMLNode;
begin
  Result    := XmlDoc;

  if faturaKaydi.FaturaTipi = 'IHRACAT' then
  begin
    Node1 := Result.DocumentElement.AddChild('cac:AccountingCustomerParty');
      Node2 := Node1.AddChild('cac:Party');
      Node3 := Node2.AddChild('cac:PartyIdentification');
        Node4 := Node3.AddChild('cbc:ID');
        Node4.Text                   := '1460415308';
        Node4.Attributes['schemeID'] := 'VKN';

      Node3 := Node2.AddChild('cac:PartyName');
        Node3.AddChild('cbc:Name').Text := 'GÜMRÜK VE TİCARET BAKANLIĞI BİLGİ İŞLEM DAİRESİ BAŞKANLIĞI';

      Node3 := Node2.AddChild('cac:PostalAddress');
        Node3.AddChild('cbc:StreetName').Text           := 'Üniversiteler Mahallesi Dumlupınar Bulvarı';
        Node3.AddChild('cbc:BuildingName').Text         := '';
        Node3.AddChild('cbc:BuildingNumber').Text       := '151';
        Node3.AddChild('cbc:CitySubdivisionName').Text  := 'Çankaya';
        Node3.AddChild('cbc:CityName').Text             := 'Ankara';
        Node3.AddChild('cbc:PostalZone').Text           := '';
        Node4 := Node3.AddChild('cac:Country');
        Node4.AddChild('cbc:Name').Text               := 'Türkiye';

      Node3 := Node2.AddChild('cac:PartyTaxScheme');
        Node4 := Node3.AddChild('cac:TaxScheme');
          Node4.AddChild('cbc:Name').Text               := 'Ulus';

//      Node3 := Node2.AddChild('cac:Contact');
//        Node3.AddChild('cbc:Telephone').Text      := gumrukBakanligiTel;
//        Node3.AddChild('cbc:Telefax').Text        := gumrukBakanligiFaks;
//        Node3.AddChild('cbc:ElectronicMail').Text := gumrukBakanligiEPostaAdresi;
  end
  else
  begin
    //Bu elemanda faturayı alan tarafın bilgileri yer alacaktır.
    //Kullanım  Bknz. Ortak Sınıflar: CustomerParty
    //Zorunlu(1)
    Node1 := Result.DocumentElement.AddChild('cac:AccountingCustomerParty');
      Node2 := Node1.AddChild('cac:Party');
      Node3 := Node2.AddChild('cac:PartyIdentification');
        Node4 := Node3.AddChild('cbc:ID');
        Node4.Text                    := faturaKaydi.VergiNo;       
        Node4.Attributes['schemeID']  := faturaKaydi.MukellefTipi;  //VKN     TCKN

      Node3 := Node2.AddChild('cac:PartyName');
        Node3.AddChild('cbc:Name').Text := ownerFatura.Firma;

      Node3 := Node2.AddChild('cac:PostalAddress');
        Node3.AddChild('cbc:StreetName').Text           := faturaKaydi.Adres;
        Node3.AddChild('cbc:CitySubdivisionName').Text  := faturaKaydi.Ilce;
        Node3.AddChild('cbc:BuildingNumber').Text       := faturaKaydi.KapiNo;
        Node3.AddChild('cbc:CityName').Text             := faturaKaydi.Sehir;
        Node3.AddChild('cbc:PostalZone').Text           := faturaKaydi.PostaKodu;
        Node4 := Node3.AddChild('cac:Country');
          Node4.AddChild('cbc:IdentificationCode').Text := faturaKaydi.UlkeKodu;
          Node4.AddChild('cbc:Name').Text               := faturaKaydi.UlkeAdi;

      Node3 := Node2.AddChild('cac:PartyTaxScheme');
        Node4 := Node3.AddChild('cac:TaxScheme');
          Node4.AddChild('cbc:Name').Text               := faturaKaydi..VergiDairesi;

      Node3 := Node2.AddChild('cac:Contact');
        Node3.AddChild('cbc:Telephone').Text      := faturaKaydi.Tel;
        Node3.AddChild('cbc:Telefax').Text        := faturaKaydi.Faks;
        Node3.AddChild('cbc:ElectronicMail').Text := faturaKaydi.EPostaAdresi;

      //şahıs firması için firma sahibi adı
      if faturaKaydi.MukellefTipi = MUKELLEF_TIPI_TCKN then
      begin
        Node3 := Node2.AddChild('cac:Person');
          Node3.AddChild('cbc:FirstName').Text  := faturaKaydi.PersonFirstName; //firma sahibi adı 
          Node3.AddChild('cbc:FamilyName').Text := faturaKaydi.PersonFamilyName;  //firma sahibi soyadı
          Node3.AddChild('cbc:Title').Text      := '';
          Node3.AddChild('cbc:MiddleName').Text := '';
          Node3.AddChild('cbc:NameSuffix').Text := '';
      end;
  end;
end;

function TFaturaUBL.AddBuyerCustomerParty(XmlDoc: TXMLDocument):TXMLDocument;
var
  Node1, Node2, Node3, Node4 : IXMLNode;
begin
  Result    := XmlDoc;

  if ownerFatura.FaturaTipi = 'IHRACAT' then
  begin
    Node1 := Result.DocumentElement.AddChild('cac:BuyerCustomerParty');
      Node2 := Node1.AddChild('cac:Party');
      Node3 := Node2.AddChild('cac:PartyIdentification');
        Node4 := Node3.AddChild('cbc:ID');
        Node4.Text                    := 'EXPORT';                       //buradaki bilgiler zorunlu bu şekilde yazılacak
        Node4.Attributes['schemeID']  := 'PARTYTYPE';                    //buradaki bilgiler zorunlu bu şekilde yazılacak

      Node3 := Node2.AddChild('cac:PartyName');                          //alıcı hesap ismi
        Node3.AddChild('cbc:Name').Text := aliciHesapIsmi;

      Node3 := Node2.AddChild('cac:PostalAddress');
        Node3.AddChild('cbc:StreetName').Text           := aliciHesapAdres;
        Node3.AddChild('cbc:CitySubdivisionName');
        Node3.AddChild('cbc:CityName').Text             := aliciHesapSehir;
        Node3.AddChild('cbc:PostalZone').Text           := aliciHesapPostaKodu;
        Node4 := Node3.AddChild('cac:Country');
          Node4.AddChild('cbc:Name').Text               := aliciHesapUlkeAdi;

      Node3 := Node2.AddChild('cac:PartyLegalEntity');
        Node3.AddChild('cbc:RegistrationName').Text     := aliciHesapHesapIsmi; //alıcının kendi ülkesindeki resmi ünvanı
        Node3.AddChild('cbc:CompanyID').Text            := aliciHesapVergiNo;   //alıcının kendi ülkesindeki vergi kodu

      Node3 := Node2.AddChild('cac:Contact');
        Node3.AddChild('cbc:Telephone').Text      := aliciHesapTel;
        Node3.AddChild('cbc:Telefax').Text        := aliciHesapFaks;
        Node3.AddChild('cbc:ElectronicMail').Text := aliciHesapEPostaAdresi;
  end;
end;

function TFaturaUBL.AddDelivery(XmlDoc: TXMLDocument): TXMLDocument;
var 
  Node1, Node2, Node3 : IXMLNode;
  old_seperator : Char;
begin
  //IHRACAT için Toplam Beyan edilen kıymet değeri
  Result := XmlDoc;

  old_seperator := FormatSettings.DecimalSeparator;
  FormatSettings.DecimalSeparator := '.';
  try
    if ownerFatura.FaturaTipi = INVOICE_TYPE_IHRACAT then
    begin
      Node1 := Result.DocumentElement.AddChild('cac:Delivery');
        Node2 := Node1.AddChild('cac:Shipment');
        Node2.AddChild('cbc:ID').Text;
        Node3 := Node2.AddChild('cbc:DeclaredCustomsValueAmount');
          Node3.Text := FormatFloat('0.0000', beyanEdilenGumrukDegeri);
          Node3.Attributes['currencyID'] := paraBirimi;
    end;
  finally
    FormatSettings.DecimalSeparator := old_seperator;
  end;
end;

function TFaturaUBL.AddAllowanceCharge(XmlDoc: TXMLDocument): TXMLDocument;
var
  Node1, Node2 : IXMLNode;
  old_seperator : Char;
begin
  Result := XmlDoc;

  old_seperator := FormatSettings.DecimalSeparator;
  FormatSettings.DecimalSeparator := '.';
  try
    //AÇIKLAMA BİLGİSİ
    //Iskonto veya artırımların tanımlandığı elemandır.
    //Zorunlu(1): ChargeIndicator   
    //Iskonto ise “false”, artırım ise “true” girilir.
//    <cac:AllowanceCharge>
//        <cbc:ChargeIndicator>false</cbc:ChargeIndicator>    
//        <cbc:Amount currencyID="USD">0.0000</cbc:Amount>
//        <cbc:BaseAmount currencyID="USD">2624.5900</cbc:BaseAmount>
//    </cac:AllowanceCharge>
//
//    Seçimli(0..1): AllowanceChargeReason    //indirim/arttırım sebebi serbest metin
//    Seçimli(0..1): MultiplierFactorNumeric    //Iskonto veya artırım oranı numerik olarak girilir. '0.1'
//    Seçimli(0..1): SequenceNumeric    //Sıra Numarası
//    Zorunlu(1): Amount    //Toplam iskonto/arttırım tutarı (ToplamIskontoTutar+ToplamGenelIskontoTutar)
//    Seçimli(0..1): BaseAmount   //Iskonto/Arttırımın uygulandığı Tutar bilgisi (ToplamTutar-ToplamIskontoTutar-ToplamGenelIskontoTutar)
//    Seçimli(0..1): PerUnitAmount    //Ürün adetine göre iskonto veya artırımın uygulandığı durumlarda uygulanan ürün miktarını gösterir
    Node1 := Result.DocumentElement.AddChild('cac:AllowanceCharge');
      Node1.AddChild('cbc:ChargeIndicator').Text  := 'false'; //  ChargeIndicator: Iskonto ise “false”, artırım ise “true” girilir.
      //Node1.AddChild('cbc:AllowanceChargeReason').Text := 'Müşteri indirimi'; // indirim/arttırım sebebi serbest metin
      //Node1.AddChild('cbc:MultiplierFactorNumeric').Text := '0.1';  // Iskonto veya artırım oranı numerik olarak girilir. 0.1 anlamı %10
      Node2 := Node1.AddChild('cbc:Amount');
      Node2.Text := FormatFloat('0.0000', iskontoTutari);
      Node2.Attributes['currencyID']  := paraBirimi;

    if faturaKaydi.FaturaTipi = 'IHRACAT' then
    begin
      Node1 := Result.DocumentElement.AddChild('cac:AllowanceCharge');
      Node1.AddChild('cbc:ChargeIndicator').Text  := 'true';
      Node1.AddChild('cbc:AllowanceChargeReason').Text := 'İhracat Masrafları';
      Node2 := Node1.AddChild('cbc:Amount');
      Node2.Text := FormatFloat('0.0000', hizmetTutari)
      Node2.Attributes['currencyID']  := paraBirimi;
      end;
    end;
  finally
    FormatSettings.DecimalSeparator := old_seperator;
  end;
end;

function TFaturaUBL.AddExchangeRate(XmlDoc: TXMLDocument): TXMLDocument;
var 
  Node1, Node2 : IXMLNode;
  old_seperator : Char;
begin
  Result := XmlDoc;

  old_seperator := FormatSettings.DecimalSeparator;
  FormatSettings.DecimalSeparator := '.';
  try
    Node1 := Result.DocumentElement.AddChild('cac:PricingExchangeRate');
      Node1.AddChild('cbc:SourceCurrencyCode').Text := kaynakPara;
      Node1.AddChild('cbc:TargetCurrencyCode').Text := hedefPara;
      Node1.AddChild('cbc:CalculationRate').Text    := FormatFloat('0.0000', dovizKuru);
      Node1.AddChild('cbc:Date').Text               := FormatDateTime('YYYY-MM-DD', kurTarihi);// Kur tarihi

    Node1 := Result.DocumentElement.AddChild('cac:PaymentExchangeRate');
      Node1.AddChild('cbc:SourceCurrencyCode').Text := kaynakPara;
      Node1.AddChild('cbc:TargetCurrencyCode').Text := hedefPara;
      Node1.AddChild('cbc:CalculationRate').Text    := FormatFloat('0.0000', dovizKuru);
      Node1.AddChild('cbc:Date').Text               := FormatDateTime('YYYY-MM-DD', kurTarihi);// Kur tarihi

    Node1 := Result.DocumentElement.AddChild('cac:PaymentAlternativeExchangeRate');
      Node1.AddChild('cbc:SourceCurrencyCode').Text := kaynakPara;
      Node1.AddChild('cbc:TargetCurrencyCode').Text := hedefPara;
      Node1.AddChild('cbc:CalculationRate').Text    := FormatFloat('0.0000', dovizKuru);
      Node1.AddChild('cbc:Date').Text               := FormatDateTime('YYYY-MM-DD', kurTarihi);// Kur tarihi
  finally
    FormatSettings.DecimalSeparator := old_seperator;
  end;
end;

function TFaturaUBL.AddTaxTotal(XmlDoc: TXMLDocument): TXMLDocument;
var 
  Node1, Node2, Node3, Node4: IXMLNode;
  old_seperator: Char;
begin
  Result := XmlDoc;

  old_seperator := FormatSettings.DecimalSeparator;
  FormatSettings.DecimalSeparator := '.';
  try
    if faturaKaydi.FaturaTipi = 'IHRACAT' then
    begin
      if ownerFatura.ParaBirimi = PARA_BIRIMI_TL then
      begin
        Node1 := Result.DocumentElement.AddChild('cac:TaxTotal');
          Node2 := Node1.AddChild('cbc:TaxAmount');
          Node2.Text                     := FormatFloat('0.00', vergiTutari); //hesaplanan vergi tutarı
          Node2.Attributes['currencyID'] := paraBirimi;

          //hesaplanan vergi tutarı ayrıntıları farklı vergi oranlarına göre hepsini ayrı olarak hesapla
          Node2 := Node1.AddChild('cac:TaxSubtotal');
            Node3 := Node2.AddChild('cbc:TaxableAmount'); 
              Node3.Text := FormatFloat('0.00', 0);  //vergi uygulanacak tutar
              Node3.Attributes['currencyID']            := paraBirimi;
              Node3 := Node2.AddChild('cbc:TaxAmount');
              Node3.Text                                := FormatFloat('0.00', 0);  //vergi tutarı
              Node3.Attributes['currencyID']            := paraBirimi;
            Node2.AddChild('cbc:Percent').Text        := IntToStr(0); //vergi oranı

            //vergi muafiyet kodu ve açıklaması
            Node3 := Node2.AddChild('cac:TaxCategory');
              Node3.AddChild('cbc:TaxExemptionReasonCode').Text := muafiyetKodu;  //301
              Node3.AddChild('cbc:TaxExemptionReason').Text     := muafiyetKodu + ' ' + muafiyetKodAciklama;  //301 11/1-a Mal ihracatı

              Node4 := Node3.AddChild('cac:TaxScheme');
                Node4.AddChild('cbc:Name').Text         := 'KDV';
                Node4.AddChild('cbc:TaxTypeCode').Text  := '0015';
      end;
    end
    else
    begin
      //Bu elemana faturada yer alan vergi ve diğer yasal yükümlülükler ile ilgili bilgiler yazılacaktır.
      //Kullanım  Bknz. Ortak Sınıflar: TaxTotal
      //Zorunlu(1..n)
      //Hesaplanan vergilerin toplam tutarı girilir. Bu alan zorunludur.
      //TaxAmount: Toplam vergi tutarı girilir.
      //TaxSubtotal: Vergi hesaplaması ile ilgili bilgilere yer verilir. Birden fazla vergi türü veya aynı vergi türü içerisinde farklı oranlarda yapılan hesaplamalarla ilgili bilgilere de bu alanda yer verilecektir. Bknz. TaxSubtotal.

      //Zorunlu(1): TaxAmount
      //Zorunlu(1..n): TaxSubtotal
      //Açıklama
      //Vergi ve diğer yasal yükümlülüklerin hesaplaması ile ilgili bilgiler ile belge üzerinde hesaplanan toplam vergi ve yasal yükümlülük tutarı girilecektir.
      //Kullanım
      //Üç çeşit kullanımı mevcuttur:
      //1. “Invoice/TaxTotal”: Hesaplanan vergilerin toplam tutarı girilir. Bu alan zorunludur.
      //  TaxAmount: Toplam vergi tutarı girilir.
      //  TaxSubtotal: Vergi hesaplaması ile ilgili bilgilere yer verilir. Birden fazla vergi türü veya aynı vergi türü içerisinde farklı oranlarda yapılan hesaplamalarla ilgili bilgilere de bu alanda yer verilecektir. Bknz. TaxSubtotal.
      //2. “Invoice/InvoiceLine/TaxTotal”: Hesaplanan vergilerin kalem bazlı hesaplanması durumunda bu alan kullanılır. Bu alan seçimlidir.
      //  TaxAmount: Kalem için hesaplanan toplam vergi tutarı girilir.
      //  TaxSubtotal: Kalem bazında vergi hesaplaması söz konusu olması halinde ilgili bilgilere yer verilebilecektir. Bknz. TaxSubtotal.
      //3. “WithholdingTaxTotal”: Tevkifatlı faturalarda, uygulanan tevkifat miktarları, oranları ve diğer bilgileri girilir.
      //  TaxAmount: Toplam tevkifat tutarı girilir.
      //  TaxSubtotal: Tevkifat kodu ve oranı bilgisi girilir.
          Node1 := Result.DocumentElement.AddChild('cac:TaxTotal');
            
            Node2 := Node1.AddChild('cbc:TaxAmount');
            Node2.Text := FormatFloat('0.00', toplamKDVTutar);  //hesaplanan vergi tutarı
            Node2.Attributes['currencyID'] := paraBirimi;

            //hesaplanan vergi tutarı ayrıntıları farklı vergi oranlarına göre hepsini ayrı olarak hesapla
            Node2 := Node1.AddChild('cac:TaxSubtotal');
              Node3 := Node2.AddChild('cbc:TaxableAmount');
                Node3.Text := FormatFloat('0.00', vergiUygulanacakTutar);  //vergi uygulanacak tutar
                Node3.Attributes['currencyID'] := paraBirimi;
                Node3 := Node2.AddChild('cbc:TaxAmount');
                Node3.Text  := FormatFloat('0.00', toplamKDVTutar); //vergi tutarı
                Node3.Attributes['currencyID'] := paraBirimi;
              Node2.AddChild('cbc:Percent').Text := IntToStr(18); //vergi oranı

              Node3 := Node2.AddChild('cac:TaxCategory');
                Node3.AddChild('cbc:TaxExemptionReasonCode').Text := muafiyetKodu;
                Node3.AddChild('cbc:TaxExemptionReason').Text     := muafiyetKodAciklama;

                //vergi türü kodunu ve açıklaması
                Node4 := Node3.AddChild('cac:TaxScheme');
                  Node4.AddChild('cbc:Name').Text         := vergiKoduKisaltma;
                  Node4.AddChild('cbc:TaxTypeCode').Text  := vergiKodu;

            //tevkifatlı faturanın tevkifat bilgileri
            if faturaKaydi.FaturaTipi = 'TEVKIFAT' then
            begin
              Node1 := Result.DocumentElement.AddChild('cac:WithholdingTaxTotal');
              
              Node2 := Node1.AddChild('cbc:TaxAmount');
              Node2.Text := FormatFloat('0.00', tevkifatTutari);
              Node2.Attributes['currencyID'] := paraBirimi;
              //tevkifat tutar ayrıntısı
              Node2 := Node1.AddChild('cac:TaxSubtotal');
                Node3 := Node2.AddChild('cbc:TaxableAmount');
                Node3.Text := FormatFloat('0.00', toplamKDVTutar);  //vergi uygulanacak tutar (tevkifat uygulanacak kdv tutarı)
                Node3.Attributes['currencyID'] := paraBirimi;
                Node3 := Node2.AddChild('cbc:TaxAmount');
                Node3.Text := FormatFloat('0.00', tevkifatTutari);  //tevkifat tutarı
                Node3.Attributes['currencyID'] := paraBirimi;
                Node2.AddChild('cbc:Percent').Text := IntToStr(Trunc(tevkifatPay / tevkifatPayda) * 100)) //tevkifat oranı yüzdesi
                Node3 := Node2.AddChild('cac:TaxCategory');
                Node3.AddChild('cbc:Name').Text := 'KDV TEVKIFAT';
                Node4 := Node3.AddChild('cac:TaxScheme');
                  Node4.AddChild('cbc:Name').Text         := tevkifatAdi;  //tevkifat kodu ve açıklaması
                  Node4.AddChild('cbc:TaxTypeCode').Text  := tevkifatKodu; //tevkifat kodu ve açıklaması
            end;
    end;
  finally
    FormatSettings.DecimalSeparator := old_seperator;
  end;
end;

function TFaturaUBL.AddLegalMonetaryTotal(XmlDoc: TXMLDocument): TXMLDocument;
var 
  Node1, Node2 : IXMLNode;
  old_seperator : Char;
begin
  Result        := XmlDoc;

  old_seperator := FormatSettings.DecimalSeparator;
  FormatSettings.DecimalSeparator := '.';
  try
    //bildirilen toplam tutar
    Node1 := Result.DocumentElement.AddChild('cac:LegalMonetaryTotal');
      Node2 := Node1.AddChild('cbc:LineExtensionAmount');
      Node2.Text                      := FormatFloat('0.00', lineExtensionAmount); //toplam tutar
      Node2.Attributes['currencyID']  := paraBirimi;

      Node2 := Node1.AddChild('cbc:TaxExclusiveAmount');
      Node2.Text                      := FormatFloat('0.00', taxExclusiveAmount); //verigiler hariç toplam tutar
      Node2.Attributes['currencyID']  := paraBirimi;

      Node2 := Node1.AddChild('cbc:TaxInclusiveAmount');
      Node2.Text                      := FormatFloat('0.00', taxInclusiveAmount);  //vergiler dahil toplam tutar
      Node2.Attributes['currencyID']  := paraBirimi;

      Node2 := Node1.AddChild('cbc:AllowanceTotalAmount');
      Node2.Text                      := FormatFloat('0.00', allowanceTotalAmount); //iskonto/arttırım miktarı
      Node2.Attributes['currencyID']  := paraBirimi;

      Node2 := Node1.AddChild('cbc:ChargeTotalAmount');
      Node2.Text                      := FormatFloat('0.00', 0)
      Node2.Attributes['currencyID']  := paraBirimi;

      Node2 := Node1.AddChild('cbc:PayableAmount');
      Node2.Attributes['currencyID']  := paraBirimi; //ödenecek tutar
      Node2.Text                    := FormatFloat('0.00', payableAmount);
  finally
    FormatSettings.DecimalSeparator := old_seperator;
  end;
end;

function TFaturaUBL.AddInvoiceLine(XmlDoc: TXMLDocument; detay:TFaturaDetay; sira_no:Integer): TXMLDocument;
var 
  Node1, Node2, Node3, Node4, Node5 : IXMLNode;
    old_seperator : Char;
begin
  Result          := XmlDoc;

  old_seperator := FormatSettings.DecimalSeparator;
  FormatSettings.DecimalSeparator := '.';
  try
    Node1 := Result.DocumentElement.AddChild('cac:InvoiceLine');
      Node1.AddChild('cbc:ID').Text := IntToStr(sira_no);
      if not faturaKalemDiibTanimi.IsEmpty then
        Node1.AddChild('cbc:Note').Text := faturaKalemDiibTanimi;
      Node2 := Node1.AddChild('cbc:InvoicedQuantity');
      Node2.Text := FloatToStr(faturaKalemMiktar);
      Node2.Attributes['unitCode'] := faturaKalemOlcuBirimi;
      Node2 := Node1.AddChild('cbc:LineExtensionAmount');
      Node2.Text := FormatFloat('0.00', faturaKalemTutar);
      Node2.Attributes['currencyID'] := paraBirimi;

      if faturaKaydi.FaturaTipi = 'IHRACAT' then
      begin
        Node2 := Node1.AddChild('cac:Delivery');
          Node3 := Node2.AddChild('cac:DeliveryAddress');
            Node3.AddChild('cbc:StreetName').Text           := faturaKaydi.Adres;
            Node3.AddChild('cbc:BuildingName').Text         := faturaKaydi.Bina;
            Node3.AddChild('cbc:BuildingNumber').Text       := faturaKaydi.KapiNo;
            Node3.AddChild('cbc:CitySubdivisionName');
            Node3.AddChild('cbc:CityName').Text             := faturaKaydi.Sehir;
            Node3.AddChild('cbc:PostalZone').Text           := faturaKaydi.PostaKodu;
            Node4 := Node3.AddChild('cac:Country');
              Node4.AddChild('cbc:Name').Text               := faturaKaydi.UlkeAdi;

          Node3 := Node2.AddChild('cac:DeliveryTerms');
            Node4 := Node3.AddChild('cbc:ID');
              Node4.Text := teslimSartiKodu;
              Node4.Attributes['schemeID'] := 'INCOTERMS';

          Node3 := Node2.AddChild('cac:Shipment');
            Node3.AddChild('cbc:ID');
            Node4 := Node3.AddChild('cbc:DeclaredCustomsValueAmount');
              Node4.Text := FormatFloat('0.0000', beyanEdilenGumrukDegeri);
              Node4.Attributes['currencyID'] := paraBirimi;

            Node4 := Node3.AddChild('cac:GoodsItem');
              Node4.AddChild('cbc:RequiredCustomsID').Text  := faturaKalem.GTIPNo;

            Node4 := Node3.AddChild('cac:ShipmentStage');
              Node4.AddChild('cbc:TransportModeCode').Text  := gonderimSekliKodu;

            Node4 := Node3.AddChild('cac:TransportHandlingUnit');
              Node5 := Node4.AddChild('cac:ActualPackage');
                Node5.AddChild('cbc:ID').Text                 := faturaKalemKabNumarasi;
                Node5.AddChild('cbc:Quantity').Text           := faturaKalemKabAdeti.ToString;
                Node5.AddChild('cbc:PackagingTypeCode').Text  := faturaKalemPaketTipiKodu;
      end;


      //iskonto varsa indirim/arttırım bilgisini ekle
      if CompareValue(faturaKaydi.IskontoTutar, 0, EPSILON) <> 1 then
      begin
        Node2 := Node1.AddChild('cac:AllowanceCharge');
          Node2.AddChild('cbc:ChargeIndicator').Text := 'false';

          if faturaKaydi.FaturaTipi = 'IHRACAT' then
          begin
            Node2.AddChild('cbc:MultiplierFactorNumeric').Text  := FormatFloat('0.00', 0);
            Node3 := Node2.AddChild('cbc:Amount');
            Node3.Text := FormatFloat('0.00', 0);
            Node3.Attributes['currencyID'] := paraBirimi;

            Node3 := Node2.AddChild('cbc:BaseAmount');
            Node3.Text := FormatFloat('0.00', faturaKalemIskontosuzTutar)
            Node3.Attributes['currencyID'] := paraBirimi;
          end
          else
          begin
            if detay.Iskonto <> 0 then
              Node2.AddChild('cbc:MultiplierFactorNumeric').Text  := FormatFloat('0.00', (detay.Iskonto/100) )
            else
              Node2.AddChild('cbc:MultiplierFactorNumeric').Text  := FormatFloat('0.00', 0);

            Node3 := Node2.AddChild('cbc:Amount');
            Node3.Text := FormatFloat('0.00', detay.TLIskontoTutar )
            Node3.Attributes['currencyID'] := paraBirimi;

            Node3 := Node2.AddChild('cbc:BaseAmount');
            Node3.Text := FormatFloat('0.00', detay.TLTutar );
            Node3.Attributes['currencyID'] := paraBirimi;
          end;
      end;

      //vergi bilgileri
      Node2 := Node1.AddChild('cac:TaxTotal');
        Node3 := Node2.AddChild('cbc:TaxAmount');
        Node3.Text := FormatFloat('0.00', KDVTutar); //vergi tutarı
        Node3.Attributes['currencyID'] := paraBirimi;
        Node3 := Node2.AddChild('cac:TaxSubtotal');

          Node4 := Node3.AddChild('cbc:TaxableAmount');
            Node4.Text := FormatFloat('0.00', vergiUygulanacakTutar);  //vergi uygulanacak tutar
            Node4.Attributes['currencyID'] := paraBirimi;

          Node4 := Node3.AddChild('cbc:TaxAmount');
            Node4.Text := FormatFloat('0.00', vergiTutari);  //vergi tutarı
            Node4.Attributes['currencyID'] := paraBirimi;

          Node3.AddChild('cbc:Percent').Text := IntToStr(KDVOrani); //vergi yüzdesi/oranı

          Node4 := Node3.AddChild('cac:TaxCategory');
            //eğer vegi muafiyet kodu varsa alltaki iki satırı ekle
            Node4.AddChild('cbc:TaxExemptionReasonCode').Text  := muafiyetKodu;
            Node4.AddChild('cbc:TaxExemptionReason').Text      := muafiyetKodu + ' ' + muafiyetAdi;
            
            Node5 := Node4.AddChild('cac:TaxScheme');
              Node5.AddChild('cbc:Name').Text         := vergiKoduKisaltma;
              Node5.AddChild('cbc:TaxTypeCode').Text  := vergiKodu;  //vergi kodu


      if (faturaKaydi.FaturaTipi = 'TEVKIFAT') then
      begin
        //tevkifat bilgileri
        Node2 := Node1.AddChild('cac:WithholdingTaxTotal');
          Node3 := Node2.AddChild('cbc:TaxAmount');
          Node3.Text := FormatFloat('0.00', tevkifatTutar); //tevkifat tutarı
          Node3.Attributes['currencyID'] := paraBirimi;

          //tevkifat bilgileri
          Node3 := Node2.AddChild('cac:TaxSubtotal');
            //tevkifat uygulanacak vergi tutarı
            Node4 := Node3.AddChild('cbc:TaxableAmount');
            Node4.Text := FormatFloat('0.00', KDVTutar )
            Node4.Attributes['currencyID'] := paraBirimi;

            //tevkifat tutarı
            Node4 := Node3.AddChild('cbc:TaxAmount');
            Node4.Text := FormatFloat('0.00', tevkifatTutar );
            Node4.Attributes['currencyID'] := paraBirimi;

            //tevkifat yüzdesi
            Node3.AddChild('cbc:Percent').Text := FloatToStr( (faturaKaydi.TevkifatPay / faturaKaydi.TevkifatPayda)*100 );

            Node4 := Node3.AddChild('cac:TaxCategory');
              Node5 := Node4.AddChild('cac:TaxScheme');
                Node5.AddChild('cbc:Name').Text := vergi_kodlari.Kisaltma;
                Node5.AddChild('cbc:TaxTypeCode').Text := vergi_kodlari.Kodu; //diger vergi kodu (tevkifat vergi kodu)
      end;

        //ürün özellikleri ve kodu
        Node2 := Node1.AddChild('cac:Item');
          Node2.AddChild('cbc:Description').Text := faturaKalemAciklama;
          Node2.AddChild('cbc:Name').Text := faturaKalemUrunKodu;
          Node3 := Node2.AddChild('cac:SellersItemIdentification');
            Node3.AddChild('cbc:ID').Text := faturaKalemUrunKodu;

      if (faturaKaydi.FaturaTipi = 'IHRACAT') then
      begin
          Node3 := Node2.AddChild('cac:OriginCountry');
            Node3.AddChild('cbc:Name').Text             := lowerCaseTr(faturaKalem.Mensei)[1]) + RightStr(lowerCaseTr(faturaKalem.Mensei), Length(faturaKalem.Mensei)-1);
      end;

        //ürün fiyatı
        Node2 := Node1.AddChild('cac:Price');
          Node3 := Node2.AddChild('cbc:PriceAmount');
          Node3.Text := FormatFloat('0.00', fiyat);
          Node3.Attributes['currencyID'] := paraBirimi;
  finally
    FormatSettings.DecimalSeparator := old_seperator;
  end;
end;
PostgreSQL - Delphi - Linux :!:

mmg
Üye
Mesajlar: 51
Kayıt: 19 Haz 2014 11:47

Re: E-Fatura için UBL data oluşturma

Mesaj gönderen mmg » 09 Oca 2020 01:45

Merhaba,

Değerli desteğiniz için çok teşekkür ediyorum, emeğinize sağlık. İnceleyip denemeleri yapacağım.

mmg
Üye
Mesajlar: 51
Kayıt: 19 Haz 2014 11:47

Re: E-Fatura için UBL data oluşturma

Mesaj gönderen mmg » 11 Oca 2020 10:00

3ddark, Allah senden razı olsun. Gönderdiğin örnek çalışma çok işime yaradı. Bu çalışmayı inceledim ve şu an UBL formatında e-Fatura dosyası oluşturabiliyorum, yardımınla büyük bir sorundan kurtulmuş oldum, çok teşekkür ediyorum. Çok emek harcamışsın, hakkını helal et.

3ddark
Üye
Mesajlar: 79
Kayıt: 14 Eyl 2010 09:55
Konum: İstanbul

Re: E-Fatura için UBL data oluşturma

Mesaj gönderen 3ddark » 12 Oca 2020 12:07

İşinize yaramasına sevindim. Kolay gelsin
PostgreSQL - Delphi - Linux :!:

mmg
Üye
Mesajlar: 51
Kayıt: 19 Haz 2014 11:47

Re: E-Fatura için UBL data oluşturma

Mesaj gönderen mmg » 12 Oca 2020 03:28

Merhaba 3ddark,

UBL dosya oluşturma işlemini tamamladım, test için portala yükledim fakat hata verdi. Verdiği hata başlık kısmından kaynaklanıyor. UBL başlık kısmı için sizin CreateXMLHeader fonksiyonunuzu kullanamadım, bunun yerine aşağıda görüldüğü gibi function tanımlamadan sizin fonksiyonda kullandığınız kodu kullanarak yapmaya çalıştım. Fakat belirttiğim gibi portala yüklerken hata verdi. Bu kısımda hata vermesini şöyle tespit ettim, portaldan veri girerek oluşturduğum bir UBL verisinin üst başlık kısmını kendi UBL dosyama taşıdığım zaman hata mesajı değişiyor, veri ile ilgili hatalar vermeye başlıyor. Acaba nerede hata yapmışım, yardımcı olabilir misiniz. Teşekkürler.

Kod: Tümünü seç

  Invoice:= TXMLDocument.Create(nil);
  try

    Invoice.Options        := Invoice.Options + [doNodeAutoIndent];   //girintiyi otomatik ayarla
    Invoice.NodeIndentStr  := #9;                                    //girinti boyutunu ayarla
    Invoice.Active  := True;
    Invoice.Version := '1.0';
    Invoice.Encoding:= 'UTF-8';

    Invoice.DocumentElement:= Invoice.CreateNode('Invoice');    //Root Node
    Invoice.DocumentElement.Attributes['xsi:schemaLocation'] := 'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 UBL-Invoice-2.1.xsd';
    Invoice.DocumentElement.DeclareNamespace('xsi','http://www.w3.org/2001/XMLSchema-instance');
    Invoice.DocumentElement.DeclareNamespace('xades','http://uri.etsi.org/01903/v1.3.2#" xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2');
    Invoice.DocumentElement.DeclareNamespace('cac','urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2');
    Invoice.DocumentElement.DeclareNamespace('cbc','urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2');
    Invoice.DocumentElement.DeclareNamespace('udt','urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2');
    Invoice.DocumentElement.DeclareNamespace('ccts','urn:un:unece:uncefact:documentation:2');
    Invoice.DocumentElement.DeclareNamespace('ext','urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2');
    Invoice.DocumentElement.DeclareNamespace('qdt','urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2');
    Invoice.DocumentElement.DeclareNamespace('ubltr','urn:oasis:names:specification:ubl:schema:xsd:TurkishCustomizationExtensionComponents');
    Invoice.DocumentElement.DeclareNamespace('ds','http://www.w3.org/2000/09/xmldsig#');

    CurNode1 := Invoice.DocumentElement.AddChild('ext:UBLExtensions');
    CurNode2:= CurNode1.AddChild('ext:UBLExtension');
    CurNode2.AddChild('ext:ExtensionContent').Text:= '';

    Invoice.DocumentElement.AddChild('cbc:UBLVersionID').Text := '2.1';

    Invoice.DocumentElement.AddChild('cbc:CustomizationID').Text := 'TR1.2';

mkysoft
Kıdemli Üye
Mesajlar: 3031
Kayıt: 25 Ağu 2003 11:35
Konum: İstanbul
İletişim:

Re: E-Fatura için UBL data oluşturma

Mesaj gönderen mkysoft » 12 Oca 2020 04:09

Namespacelerle ilgili bir probleminiz var görebildiğim kadarıyla. xsi:schemaLocation değerine gerek yok. Xml'in ana namespace'ini belirmemişsiniz. xades olarak verdiğiniz prefix içinde iki namespace var. Oluşturduğunuz xml'leri şuradan da kontrol edebilirsiniz.

3ddark
Üye
Mesajlar: 79
Kayıt: 14 Eyl 2010 09:55
Konum: İstanbul

Re: E-Fatura için UBL data oluşturma

Mesaj gönderen 3ddark » 12 Oca 2020 04:27

Ben ubl oluştururken şöyle yapmıştım. Entegrator firmadan bir tane fatura ubl örneği alıp o dosyayı kod ile kurallara uygun şekilde olusturmuştum. Özetle kendim herhangi bir bilgiyi doğaçlama eklemedim. Bir örnek alın ve onun üzerinden gidin
PostgreSQL - Delphi - Linux :!:

mmg
Üye
Mesajlar: 51
Kayıt: 19 Haz 2014 11:47

Re: E-Fatura için UBL data oluşturma

Mesaj gönderen mmg » 12 Oca 2020 06:59

Merhaba,

UBL dosyası başlık kısmı standart bilgileri içermiyor mu ? Bu kısmı yapamıyorum, çünkü mantığını anlayamadım. Belki yazmamam gereken satırlar vardır ama bu kısımda tamamen deneme yanılma ile yapmaya çalışıyorum. Bir yöntemi var mı ? Bakabileceğim bir kaynak var mı ? Yardımlarınızı rica ediyorum. Dosyanın diğer tarafları tamam, browserda açılıyor herhangi bir hata vermiyor ve düzenli bir şekilde açılıyor.

mmg
Üye
Mesajlar: 51
Kayıt: 19 Haz 2014 11:47

Re: E-Fatura için UBL data oluşturma

Mesaj gönderen mmg » 12 Oca 2020 07:07

Başlık kısmını ekte resimde görülen şekilde yapmam gerekiyor.
Dosya ekleri
e-fatura.jpg
e-fatura.jpg (1.29 KiB) 497 kere görüntülendi

3ddark
Üye
Mesajlar: 79
Kayıt: 14 Eyl 2010 09:55
Konum: İstanbul

Re: E-Fatura için UBL data oluşturma

Mesaj gönderen 3ddark » 12 Oca 2020 07:33

https://ebelge.gib.gov.tr/dosyalar/kila ... Paketi.zip

Buradaki dokümanlara bakın örnek ubl mevcut ve header ile ilgili olarak yazması gerekenler de yazıyor.

Ayrıca asıl kaynak burasıdır entegrator firmalarda bu sitede yayınlanan dokümanlar ile sistemini geliştiriyor
PostgreSQL - Delphi - Linux :!:

Cevapla