Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.

...

  • 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

Bloc de code
breakoutModewide
languagec
procedure LectureErreur
1	txterreur S
beginp

	do
		txterreur = FacturXGetErreur
	while txterreur <> " " 
		display left(txterreur)
	wend
endp

public procedure DecodeFichierFacturxXML(ficAfficheDictionary(wdictionary,decalage,ficjoint,nivficjoint)
1	fic	A
1	ii		x =wdictionary L
1 1	iimax decalage x =2,0
1 1 ficjoint  titre 256x
1  decalagenivficjoint x
2,0
1	dictionarywmot		L256
= 0
1  retour			S
beginp1	wcle     	retour256 = 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 " " 
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

Bloc de code
breakoutModewide
 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