Exemple de lecture d'un PDF factur-x

Voici un exemple qui reprend les modules expliqués précédemment, illustrant la lecture d’un PDF au format factur-x

 

  • LectureErreur : boucle sur les dernières erreurs FacturX et les affiche

  • AfficheDictionary : parcours toutes les listes et affiche à l'écran

  • DecodeFichierFacturxXML : ouvre le fichier XML pour en lire les propriétés globales,notes, les lignes, les documents,…et les mettre en listes

  • DecodeFichierXML :

    • Création d’un fichier xml vide pour reçevoir les données

    • Extraction des métadonnées dans le fichier xml temporaire

 

Etapes:

  1. DecodeFichierXML =>on a un fichier XML qui contient les données issues du PDF

  2. DecodeFichierFacturxXML =>transforme le fichier XML en listes+sous-listes de couples clé-valeur

  3. AfficheDictionary => exploite les données à partir des listes

procedure LectureErreur 1 txterreur S beginp do txterreur = FacturXGetErreur while txterreur <> " " display left(txterreur) wend endp public procedure AfficheDictionary(wdictionary,decalage,ficjoint,nivficjoint) 1 wdictionary L 1 decalage 2,0 1 ficjoint x 1 nivficjoint x 1 wmot 256 1 wcle 256 = " " 1 wtxt 256 1 wdictionaryliste L 1 wsousdictionary L 1 titre 256 1 wtxt1car 1 = " " 1 countelement 6,0 1 iddir 6,0 1 AttachmentBinaryFile 256 = " " 1 AttachmentBinaryName 256 = " " 1 fic 256 = " " beginp if wdictionary = 0 preturn endif display " " ;on parcoure la liste des prorpiétés du dictionnary, le titre ;du dictionnary indique si c'est un tableau ou pas titre = DictionaryGetName(wdictionary) wtxt = [ *decalage "DictionaryGetName(" left(titre) ")"] display left(wtxt) ;on lit la liste clés/valeurs du dictionnary DictionaryBegin(wdictionary) AttachmentBinaryFile = " " AttachmentBinaryName = " " fic = " " ;boucle principale loop DictionaryNext(wdictionary,wcle,wmot) ;display clé (donc le nom de la propriété) et la valeur ou alors le nomdre d'élément du tableau if mid(wcle,1,1) = "$" iddir = val(wmot) countelement = DictionaryCount(iddir) wtxt = [ *decalage left(wcle) " count " & tostring(countelement)] else wtxt = [ *decalage left(wcle) "=" left(wmot)] endif display left(wtxt) ;ficjoint: c'est un flag juste pour dire de voir si la props ;est un fichier joints if mid(wcle,1,1) <> "$" ;sauf si wcle est un tableau if ficjoint if nivficjoint = 1 if string(".AttachmentBinaryFile",wcle) <> 0 AttachmentBinaryFile = wmot ;c'est le chemin et le nom temp fic = "c:\divalto\" & left(AttachmentBinaryName) wincopyfile(left(AttachmentBinaryFile),fic,FALSE) AttachmentBinaryFile = " " AttachmentBinaryName = " " fic = " " elsif string(".Filename",wcle) <> 0 AttachmentBinaryName = wmot ;ca c'est le vrai nom du fichier à l'origine endif endif endif endif ;si c'est un tableau, alors on décode le tableau et if mid(wcle,1,1) = "$" decalage += 2 ;c'est juste pour faire joli a l'écran ! wdictionaryliste = val(wmot) titre = DictionaryGetName(wdictionaryliste) wtxt = [ *decalage "liste DictionaryGetName(" left(titre) ")"] display left(wtxt) DictionaryBegin(wdictionaryliste ) loop DictionaryNext(wdictionaryliste,wcle,wmot) wsousdictionary = val(wmot) AfficheDictionary(wsousdictionary,decalage,ficjoint,nivficjoint+1) endloop decalage -= 2 endif endloop endp procedure DecodeFichierFacturxXML(fic) 1 fic A 1 ii x = 1 1 iimax x = 1 1 titre 256 1 decalage 2,0 1 dictionary L = 0 1 retour S beginp retour = FacturXReadOpen(left(fic)) ;open du fichier if retour <> " " | display "erreur " & retour | LectureErreur |else | display "ok" | endif dictionary = 0 retour = FacturXGetGlobalProps(dictionary) ;read entete taxe etc SAUF lignes detail if retour = "1" and dictionary <> 0 decalage = 1 AfficheDictionary(dictionary,decalage,0,0) endif FacturXDictionaryDestroy ;supression des dictionnay crées par la fc FacturXGetGlobalProps ;optionnel, c'est si on veut traiter les notes de la facture dictionary = 0 retour = FacturXGetGlobalNotes(dictionary) ;read notes if retour = "1" and dictionary <> 0 decalage = 1 AfficheDictionary(dictionary,decalage,0,0) endif FacturXDictionaryDestroy ;optionnel, c'est si on veut traiter les documents joints de la facture dictionary = 0 retour = FacturXGetGlobalDocumentsInFiles(dictionary) ;read document if retour = "1" and dictionary <> 0 decalage = 1 AfficheDictionary(dictionary,decalage,1,0) endif FacturXDictionaryDestroy ;et on supprime les fichiers crées par la fc FacturXGetGlobalDocumentsInFiles et FacturXGetGlobalNotes FacturXDeleteTmpFiles do retour = FacturXGetLineProps(dictionary) ;lecture des lignes detail while retour = "1" and dictionary <> 0 decalage = 1 AfficheDictionary(dictionary,decalage,0,0) FacturXDictionaryDestroy ;optionnel, c'est si on veut traiter les notes sur les ligne retour = FacturXGetLineNotes(dictionary) ;lecture des notes de la ligne en cours if retour = "1" and dictionary <> 0 decalage = 2 AfficheDictionary(dictionary,decalage,0,0) FacturXDictionaryDestroy endif ;optionnel, c'est si on veut traiter les documents joints sur les ligne retour = FacturXGetLineDocumentsInFiles(dictionary) ;lecture des documents de la ligne en cours if retour = "1" and dictionary <> 0 decalage = 2 AfficheDictionary(dictionary,decalage,0,0) FacturXDictionaryDestroy endif ;et on supprime les fichiers crées par la fc FacturXGetLinesDocumentsInFiles et FacturXGetLignesNotes FacturXDeleteTmpFiles wend retour = FacturXReadClose() ;fermeture du fichier xml if retour <> " " | display "erreur " & retour | endif endp procedure DecodeFichierXML record * htdf tdfficeml record * htdf tdf 1 fichierxml 260 = " " 1 fichierxmltxt 260 = " " 1 fichiercopiepdf 260 = " " 1 txterr 4096 1 fic 260 1 fd L 1 listxml L 1 numerofic 1,0 1 st x 1 err x beginp ;on prend le fichier pdf qu'il faut mettre en mode local pour avoir un chemin widnows ;le mieux est de faire une copie du pdf vers un fichier temp tdf.name = "aaafacture_nebout_125e_du_09_12_2020.pdf" st = fopen(tdf,"P") if st <> 0 preturn endif fic = tdf.name fclose(tdf) Tmpfcreate (tdfficeml, 2, 0) fichiercopiepdf = GetSystemFileName(tdfficeml) fclose(tdfficeml) st = hcopyfile(left(fic),left(fichiercopiepdf),false,"P",false,numerofic) if st <> 0 if fichiercopiepdf <> " " si erreur alors delete du pdf de copie windeletefile(left(fichiercopiepdf)) endif preturn endif ;1- faturx il faut creer un fichier temporaire pour recevoir le fichier xml de la description de la facture Tmpfcreate (tdfficeml, 2, 0) fichierxml = GetSystemFileName(tdfficeml) fclose(tdfficeml) ;2- appeler la fc d'extraction du fichier factu-x.xml qui sera ecris dans le fichier temporaire ;le fichier temporaire est effacé dans la fonction , attention il peut etre vide au final si le pdf n'a pas de metadata factur-x ;c'est le cas si un fichier pdf a été mis dans la liste des pdf a traité par erreur err = MetaDataExtractFacturxToFile(left(fichiercopiepdf),left(fichierxml),txterr,"") if err <> 0 display left(txterr) else DecodeFichierFacturxXML(fichierxml) ;on peut lire le xml endif if fichierxml <> " " windeletefile(left(fichierxml)) endif if fichiercopiepdf <> " " windeletefile(left(fichiercopiepdf)) endif endp module "yPDFMetaData.dhop" main MetaDataOpen ;extraction factrux-x DecodeFichierXML MetaDataClose programexit

cela donne un résultat de de ce type

DictionaryGetName(FACTURX_GLOBAL_PROPS) Version=Version21 InvoiceNo=InvoiceNo InvoiceDate=20230301 Currency=EUR IsTest=False Profile=Extended Type=Invoice PaymentReference=PaymentReference Buyer.OrderReferenceDocument.OrderNo=Buyer.OrderReferenceDocument.OrderNo Buyer.OrderReferenceDocument.OrderDate=20230309 ActualDeliveryDate=20230308 ReferenceOrderNo=ReferenceOrderNo LineTotalAmount=123,00 ChargeTotalAmount=126,00 AllowanceTotalAmount=127,00 TaxBasisAmount=124,00 TaxTotalAmount=125,00 GrandTotalAmount=128,00 TotalPrepaidAmount=129,00 RoundingAmount=130,00 DuePayableAmount=131,00 BillingPeriodStart=20230306 BillingPeriodEnd=20230307 Invoicee.Party.GlobalID.ID=Invoicee.Party.GlobalID.ID Invoicee.Party.GlobalID.SchemeID=Invoicee.Party.GlobalID.SchemeID Invoicee.Party.Id=Invoicee.Party.Id Invoicee.Party.Name=Invoicee.Party.Name Invoicee.Party.Street=Invoicee.Party.Street Invoicee.Party.Postcode=Invoicee.Party.Postcode Invoicee.Party.City=Invoicee.Party.City Invoicee.Party.Contry=DE Invoicee.Party.ContactName=Invoicee.Party.ContactName Invoicee.Party.AddressLine3=Invoicee.Party.AddressLine3 Invoicee.Party.CountrySubdivisionName=Invoicee.Party.CountrySubdivisionName ShipTo.Party.GlobalID.ID=ShipTo.Party.GlobalID.ID ShipTo.Party.GlobalID.SchemeID=ShipTo.Party.GlobalID.SchemeID ShipTo.Party.Id=ShipTo.Party.Id ShipTo.Party.Name=ShipTo.Party.Name ShipTo.Party.Street=ShipTo.Party.Street ShipTo.Party.Postcode=ShipTo.Party.Postcode ShipTo.Party.City=ShipTo.Party.City ShipTo.Party.Contry=DE ShipTo.Party.ContactName=ShipTo.Party.ContactName ShipTo.Party.AddressLine3=ShipTo.Party.AddressLine3 ShipTo.Party.CountrySubdivisionName=ShipTo.Party.CountrySubdivisionName Payee.Party.GlobalID.ID=Payee.Party.GlobalID.ID Payee.Party.GlobalID.SchemeID=Payee.Party.GlobalID.SchemeID Payee.Party.Id=Payee.Party.Id Payee.Party.Name=Payee.Party.Name Payee.Party.Street=Payee.Party.Street Payee.Party.Postcode=Payee.Party.Postcode Payee.Party.City=Payee.Party.City Payee.Party.Contry=ES Payee.Party.ContactName=Payee.Party.ContactName Payee.Party.AddressLine3=Payee.Party.AddressLine3 Payee.Party.CountrySubdivisionName=Payee.Party.CountrySubdivisionName ShipFrom.Party.GlobalID.ID=ShipFrom.Party.GlobalID.ID ShipFrom.Party.GlobalID.SchemeID=ShipFrom.Party.GlobalID.SchemeID ShipFrom.Party.Id=ShipFrom.Party.Id ShipFrom.Party.Name=ShipFrom.Party.Name ShipFrom.Party.Street=ShipFrom.Party.Street ShipFrom.Party.Postcode=ShipFrom.Party.Postcode ShipFrom.Party.City=ShipFrom.Party.City ShipFrom.Party.Contry=GB ShipFrom.Party.ContactName=ShipFrom.Party.ContactName ShipFrom.Party.AddressLine3=ShipFrom.Party.AddressLine3 ShipFrom.Party.CountrySubdivisionName=ShipFrom.Party.CountrySubdivisionName Buyer.Party.GlobalID.ID=Buyer.Party.GlobalID.ID Buyer.Party.GlobalID.SchemeID=Buyer.Party.GlobalID.SchemeID Buyer.Party.Id=Buyer.Party.Id Buyer.Party.Name=Buyer.Party.Name Buyer.Party.Street=Buyer.Party.Street Buyer.Party.Postcode=Buyer.Party.Postcode Buyer.Party.City=Buyer.Party.City Buyer.Party.Contry=ET Buyer.Party.ContactName=Buyer.Party.ContactName Buyer.Party.AddressLine3=Buyer.Party.AddressLine3 Buyer.Party.CountrySubdivisionName=Buyer.Party.CountrySubdivisionName Buyer.Contact.Name=Buyer.Contact.Name Buyer.Contact.Orgunit=Buyer.Contact.Orgunit Buyer.Contact.Emailaddress=Buyer.Contact.Emailaddress Buyer.Contact.PhonNo=Buyer.Contact.PhonNo Buyer.Contact.FaxNo=Buyer.Contact.FaxNo Seller.Party.GlobalID.ID=Seller.Party.GlobalID.ID Seller.Party.GlobalID.SchemeID=Seller.Party.GlobalID.SchemeID Seller.Party.Id=Seller.Party.Id Seller.Party.Name=Seller.Party.Name Seller.Party.Street=Seller.Party.Street Seller.Party.Postcode=Seller.Party.Postcode Seller.Party.City=Seller.Party.City Seller.Party.Contry=FI Seller.Party.AddressLine3=Seller.Party.AddressLine3 Seller.Party.CountrySubdivisionName=Seller.Party.CountrySubdivisionName Seller.Contact.Name=Seller.Contact.Name Seller.Contact.Orgunit=Seller.Contact.OrgUnit Seller.Contact.Emailaddress=Seller.Contact.Emailaddress Seller.Contact.PhonNo=Seller.Contact.PhonNo Seller.Contact.FaxNo=Seller.Contact.FaxNo PaymentTerms.Description=PaymentTerms.Description PaymentTerms.DueDate=20230310 PaymentMeans.TypeCode=Cheque PaymentMeans.Information=PaymentMeans.Information PaymentMeans.SEPACreditorIdentifier=PaymentMeans.IdentifikationsNummer PaymentMeans.SEPAMandateReference=PaymentMeans.MandatsNummer DeliveryNoteReferencedDocument.ID=DeliveryNoteReferenceDocumentdeliveryNote.No DeliveryNoteReferencedDocumentdt.IssueDateTime=20230304 ContractReferencedDocument.ID=ContractReferencedDocument.ID ContractReferencedDocumentdt.IssueDateTime=20230302 InvoiceReferencedDocument.ID=InvoiceReferencedDocumentID InvoiceReferencedDocument.IssueDateTime=20230305 SpecifiedProcuringProject.ID=SpecifiedProcuringProject.ID SpecifiedProcuringProject.Name=SpecifiedProcuringProject.Name SellerOrderReferencedDocument.ID=SellerOrderReferencedDocument.ID SellerOrderReferencedDocument.IssueDateTime=20230303 $Taxes count 2 liste DictionaryGetName(FACTURX_$TAXES) DictionaryGetName(FACTURX_TAXE_1) Taxe.AllowanceChargeBasisAmount=0 Taxe.BasisAmount=500,00 Taxe.CategoryCode=AD Taxe.ExemptionReason=ExemptionReason Taxe.ExemptionReasonCode=vatex_eu_132_1k Taxe.Percent=19,00 Taxe.TaxAmount=95,000000 Taxe.TypeCode=VAT DictionaryGetName(FACTURX_TAXE_2) Taxe.AllowanceChargeBasisAmount=0 Taxe.BasisAmount=400,00 Taxe.CategoryCode=AD Taxe.ExemptionReason= Taxe.Percent=33,00 Taxe.TaxAmount=132,000000 Taxe.TypeCode=VAT $LogisticsServiceCharges count 1 liste DictionaryGetName(FACTURX_$LOGISTICSSERVICECHARGES) DictionaryGetName(FACTURX_LOGISTICSSERVICECHARGE_1) Charge.Amount=0,00 Charge.Description=Description $Taxes count 1 liste DictionaryGetName(FACTURX_$TAXES) DictionaryGetName(FACTURX_TAXE_1) Taxe.AllowanceChargeBasisAmount=0 Taxe.BasisAmount=0 Taxe.CategoryCode=AD Taxe.Percent=0,00 Taxe.TaxAmount=0,0000 Taxe.TypeCode=AAD $Creditor.BankAccounts count 2 liste DictionaryGetName(FACTURX_$CREDITOR.BANKACCOUNTS) DictionaryGetName(FACTURX_CREDITOR.BANKACCOUNT_1) BankAccount.Bankleitzahl= BankAccount.BankName= BankAccount.BIC=BIC21 BankAccount.IBAN=IBAN21 BankAccount.ID=ID21 BankAccount.Name=Name21 DictionaryGetName(FACTURX_CREDITOR.BANKACCOUNT_2) BankAccount.Bankleitzahl= BankAccount.BankName= BankAccount.BIC=BIC22 BankAccount.IBAN=IBAN22 BankAccount.ID=ID22 BankAccount.Name=Name22 $Debitor.BankAccounts count 1 liste DictionaryGetName(FACTURX_$DEBITOR.BANKACCOUNTS) DictionaryGetName(FACTURX_DEBITOR.BANKACCOUNT_1) BankAccount.Bankleitzahl= BankAccount.BankName= BankAccount.BIC=BIC23 BankAccount.IBAN=IBAN23 BankAccount.ID=ID23 $Buyer.TaxRegistrations count 3 liste DictionaryGetName(FACTURX_$BUYER.TAXREGISTRATIONS) DictionaryGetName(FACTURX_BUYER.TAXREGISTRATION_1) TaxRegistration.No=No1 TaxRegistration.SchemeID=VA DictionaryGetName(FACTURX_BUYER.TAXREGISTRATION_2) TaxRegistration.No=No2 TaxRegistration.SchemeID=VA DictionaryGetName(FACTURX_BUYER.TAXREGISTRATION_3) TaxRegistration.No=No3 TaxRegistration.SchemeID=FC $Seller.TaxRegistrations count 3 liste DictionaryGetName(FACTURX_$SELLER.TAXREGISTRATIONS) DictionaryGetName(FACTURX_SELLER.TAXREGISTRATION_1) TaxRegistration.No=No11 TaxRegistration.SchemeID=VA DictionaryGetName(FACTURX_SELLER.TAXREGISTRATION_2) TaxRegistration.No=No12 TaxRegistration.SchemeID=FC DictionaryGetName(FACTURX_SELLER.TAXREGISTRATION_3) TaxRegistration.No=No13 TaxRegistration.SchemeID=VA DictionaryGetName(FACTURX_GLOBAL_NOTES) $Notes count 2 liste DictionaryGetName(FACTURX_$NOTES) DictionaryGetName(FACTURX_NOTE_1) Note.Content=note1 < > Note.ContentCode=ST3 Note.SubjectCode=AAK DictionaryGetName(FACTURX_NOTE_2) Note.Content=note2 < > Note.ContentCode=EEV Note.SubjectCode=AAJ DictionaryGetName(FACTURX_GLOBAL_DOCUMENTS) $AdditionalReferencedDocuments count 1 liste DictionaryGetName(FACTURX_$ADDITIONALREFERENCEDDOCUMENTS) DictionaryGetName(FACTURX_ADDITIONALREFERENCEDDOCUMENT_1) AdditionalReferencedDocument.Filename=testzero.xlsx AdditionalReferencedDocument.ID=A123 AdditionalReferencedDocument.IssueDateTime=20230317 AdditionalReferencedDocument.Name=testzero AdditionalReferencedDocument.ReferenceTypeCode=AAB AdditionalReferencedDocument.TypeCode=PriceSalesCatalogueResponse AdditionalReferencedDocument.AttachmentBinaryFile=C:\Users\jpthorrignac\AppData\Local\Temp\tmpD012.tmp DictionaryGetName(FACTURX_LINE) Line.LineID=1 Line.GlobalID.ID=4123456000021 Line.GlobalID.SchemeID=SchemeID_GLN Line.SellerAssigned.ID=GZ250 Line.BuyerAssigned.ID=20232202-3 Line.Name=Gelierzucker Extra 250g Line.Description=testDescription Line.UnitQuantity=1 Line.BilledQuantity=50,0000 Line.LineTotalAmount=72,50 Line.BillingPeriodEnd=20230225 Line.BillingPeriodStart=20230202 Line.TaxCategoryCode=S Line.TaxPercent=7,00 Line.TaxType=VAT Line.GrossUnitPrice=0,0000 Line.NetUnitPrice=1,4500 Line.UnitCode=C62 Line.ActualDeliveryDate=20230312 Line.BuyerOrderReferencedDocument.ID=20232202-4 Line.BuyerOrderReferencedDocument.IssueDateTime=20230311 Line.DeliveryNoteReferencedDocument.ID=20232202-4 Line.DeliveryNoteReferencedDocument.IssueDateTime=20230310 $Line.TradeAllowanceCharges count 2 liste DictionaryGetName(FACTURX_$LINE.TRADEALLOWANCECHARGES) DictionaryGetName(FACTURX_LINE.TRADEALLOWANCECHARGE_1) TradeAllowanceCharge.ActualAmount=0,03 TradeAllowanceCharge.Amount=0 TradeAllowanceCharge.BasisAmount=1,50 TradeAllowanceCharge.ChargeIndicator=False TradeAllowanceCharge.Currency=Unknown TradeAllowanceCharge.Reason=Artikelrabatt 1 TradeAllowanceCharge.ReasonCode=ReasonCode_1 $Taxes count 1 liste DictionaryGetName(FACTURX_$TAXES) DictionaryGetName(FACTURX_TAXE_1) Taxe.AllowanceChargeBasisAmount=0 Taxe.BasisAmount=1,50 Taxe.CategoryCode=AD Taxe.ExemptionReason=Taxe.ExemptionReason Taxe.ExemptionReasonCode=vatex_eu_132_1k Taxe.Percent=0,00 Taxe.TaxAmount=0,000000 Taxe.TypeCode=VAT DictionaryGetName(FACTURX_TAXE_2) TradeAllowanceCharge.ActualAmount=2,03 TradeAllowanceCharge.Amount=0 TradeAllowanceCharge.BasisAmount=2,50 TradeAllowanceCharge.ChargeIndicator=False TradeAllowanceCharge.Currency=Unknown TradeAllowanceCharge.Reason=Artikelrabatt 1 TradeAllowanceCharge.ReasonCode=ReasonCode_2 $Line.ReceivableSpecifiedTradeAccountingAccounts count 2 liste DictionaryGetName(FACTURX_$LINE.RECEIVABLESPECIFIEDTRADEACCOUNTINGACCOUNTS) DictionaryGetName(FACTURX_LINE.RECEIVABLESPECIFIEDTRADEACCOUNTINGACCOUNT_1) ReceivableSpecifiedTradeAccountingAccount.ID=987654321 ReceivableSpecifiedTradeAccountingAccount.TypeCode=Financial DictionaryGetName(FACTURX_LINE.RECEIVABLESPECIFIEDTRADEACCOUNTINGACCOUNT_2) ReceivableSpecifiedTradeAccountingAccount.ID=10000000 ReceivableSpecifiedTradeAccountingAccount.TypeCode=Financial DictionaryGetName(FACTURX_LINE) Line.AssociatedDocumentLine.ID=1 $Line.Notes count 3 liste DictionaryGetName(FACTURX_$LINE.NOTES) DictionaryGetName(FACTURX_LINE.NOTE_1) Note.Content=ligne comment Note.ContentCode=Unknown Note.SubjectCode=Unknown DictionaryGetName(FACTURX_LINE.NOTE_2) Note.Content=note3 < > Note.ContentCode=ST3 Note.SubjectCode=AAK DictionaryGetName(FACTURX_LINE.NOTE_3) Note.Content=note4 < > Note.ContentCode=EEV Note.SubjectCode=AAJ DictionaryGetName(FACTURX_LINE) $Line.AdditionalReferencedDocuments count 1 liste DictionaryGetName(FACTURX_$LINE.ADDITIONALREFERENCEDDOCUMENTS) DictionaryGetName(FACTURX_LINE.ADDITIONALREFERENCEDDOCUMENT_1) AdditionalReferencedDocument.Filename= AdditionalReferencedDocument.ID=A123 AdditionalReferencedDocument.IssueDateTime=20230313 AdditionalReferencedDocument.Name= AdditionalReferencedDocument.ReferenceTypeCode=AAA AdditionalReferencedDocument.TypeCode=ReferenceDocument DictionaryGetName(FACTURX_LINE) Line.LineID=2 Line.GlobalID.ID=4123456000021 Line.GlobalID.SchemeID=SchemeID_GLN Line.SellerAssigned.ID=GZ250 Line.BuyerAssigned.ID= Line.Name=bis Extra 250g Line.Description=Description bis Extra 250g Line.UnitQuantity=1 Line.BilledQuantity=50,0000 Line.LineTotalAmount=72,50 Line.BillingPeriodEnd=20230321 Line.BillingPeriodStart=20230320 Line.TaxCategoryCode=S Line.TaxPercent=19,00 Line.TaxType=VAT Line.GrossUnitPrice=0,0000 Line.NetUnitPrice=1,4500 Line.UnitCode=C62 Line.ActualDeliveryDate=20230316 Line.BuyerOrderReferencedDocument.ID=20231801-30 Line.BuyerOrderReferencedDocument.IssueDateTime=20230302 Line.ContractReferencedDocument.ID=20231801-1 Line.ContractReferencedDocument.IssueDateTime=20230302 $Line.TradeAllowanceCharges count 2 liste DictionaryGetName(FACTURX_$LINE.TRADEALLOWANCECHARGES) DictionaryGetName(FACTURX_LINE.TRADEALLOWANCECHARGE_1) TradeAllowanceCharge.ActualAmount=0,03 TradeAllowanceCharge.Amount=0 TradeAllowanceCharge.BasisAmount=102,00 TradeAllowanceCharge.ChargeIndicator=False TradeAllowanceCharge.Currency=Unknown TradeAllowanceCharge.Reason=Artikelrabatt 1 TradeAllowanceCharge.ReasonCode=ReasonCode_3 $Taxes count 1 liste DictionaryGetName(FACTURX_$TAXES) DictionaryGetName(FACTURX_TAXE_1) Taxe.AllowanceChargeBasisAmount=0 Taxe.BasisAmount=102,00 Taxe.CategoryCode=AD Taxe.ExemptionReason=Taxe.ExemptionReason Taxe.ExemptionReasonCode=vatex_eu_132_1k Taxe.Percent=0,00 Taxe.TaxAmount=0,000000 Taxe.TypeCode=VAT DictionaryGetName(FACTURX_TAXE_2) TradeAllowanceCharge.ActualAmount=2,03 TradeAllowanceCharge.Amount=0 TradeAllowanceCharge.BasisAmount=101,00 TradeAllowanceCharge.ChargeIndicator=False TradeAllowanceCharge.Currency=Unknown TradeAllowanceCharge.Reason=Artikelrabatt 1 TradeAllowanceCharge.ReasonCode=ReasonCode_4 $Line.ApplicableProductCharacteristics count 1 liste DictionaryGetName(FACTURX_$LINE.APPLICABLEPRODUCTCHARACTERISTICS) DictionaryGetName(FACTURX_LINE.APPLICABLEPRODUCTCHARACTERISTIC_1) ApplicableProductCharacteristic.Description=Description ApplicableProductCharacteristic.Value=Value DictionaryGetName(FACTURX_LINE) Line.AssociatedDocumentLine.ID=2 $Line.Notes count 1 liste DictionaryGetName(FACTURX_$LINE.NOTES) DictionaryGetName(FACTURX_LINE.NOTE_1) Note.Content=note5 < > Note.ContentCode=ST3 Note.SubjectCode=AAK