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.

Voici un exemple qui reprend les modules expliqués précédemment, illustrant la génération d’une édition au format factur-x

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

  • GenererLeFichierXml : positionne des propriétés dans la liste principale et des sous-listes. Puis la fin d'écriture génère le fichier à partir des listes

  • ExempleImpression : positionne des propriétés globales, génère une édition, demande à générer le fichier xml, et déclenche la conversion et fusion pour obtenir un PDF avec XML intégré

Bloc de code
breakoutModewide
languagec
module "yfacturX.dhop"  ;chargement des modules
module "ymapi.dhop"

procedure LectureErreur
1	txterreur S
beginp

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

function char GenererLeFichierXML
1  dictionary				L = 0
1  dictionarylisteitem 	L = 0
1  dictionaryitem 		L = 0
1	retour 					S
record * htdf  			tdf
1  st							x	
1	fic						256 
beginf
	retour = FacturXWriteBegin()											 ;creation d'un xml interne
	if retour <> " " | display "erreur " & retour |	LectureErreur |freturn "" | endif

	;entete et les props de base attention au majuscules/minuscule  Invoice  et pas invoice 
	dictionary = DictionaryCreate()		
	DictionaryAdd(dictionary,"InvoiceNo","InvoiceNo111")		;prop obligatoire en premier ca me sert a creer l'objet xml
	DictionaryAdd(dictionary,"IsTest","false")						;prop obligatoire en premier ca me sert a creer l'objet xml
	DictionaryAdd(dictionary,"Profile","Extended")				;prop obligatoire en premier ca me sert a creer l'objet xml			  	
   DictionaryAdd(dictionary,"Version","Version21")				;prop obligatoire en premier ca me sert a creer l'objet xml
	DictionaryAdd(dictionary,"Currency","EUR")                ;prop obligatoire en premier ca me sert a creer l'objet xml  
	DictionaryAdd(dictionary,"Type","Invoice ")                ;prop obligatoire en premier ca me sert a creer l'objet xml
	DictionaryAdd(dictionary,"InvoiceDate","20220818")        ;prop obligatoire en premier ca me sert a creer l'objet xml

	DictionaryAdd(dictionary,"LineTotalAmount","123")
	DictionaryAdd(dictionary,"TaxBasisAmount","124")
	DictionaryAdd(dictionary,"TaxTotalAmount","125")
	retour = FacturXWriteProps(dictionary)					;on ecris ces propriétés
	if retour <> " " | display "erreur " & retour |	LectureErreur | freturn "" | endif

	;si on veut créer des notes alos il faut créer un tableau de notes
	dictionary = DictionaryCreate()		;on recrer un dictionnary de base 
   dictionarylisteitem = DictionaryCreate() 	;puis un dictionnary qui sera la liste des autres dictionnary qui seront chaqu'un une note
	DictionaryAdd(dictionary,"$Notes",tostring(dictionarylisteitem))	;et on ajoute ce dictionnary liste au dictionnary de base
   
	dictionaryitem = DictionaryCreate()		
	DictionaryAdd(dictionarylisteitem,tostring(dictionaryitem),tostring(dictionaryitem))	;on l'ajoute a la liste
	DictionaryAdd(dictionaryitem,"Content", "note1 < >")		
   DictionaryAdd(dictionaryitem,"SubjectCode","AAK")
   DictionaryAdd(dictionaryitem,"ContentCode", "ST3")

   dictionaryitem = DictionaryCreate()		
	DictionaryAdd(dictionarylisteitem,tostring(dictionaryitem),tostring(dictionaryitem))	;on l'ajoute a la liste
	DictionaryAdd(dictionaryitem,"Content", "note2 < > ")		
   DictionaryAdd(dictionaryitem,"SubjectCode","AAJ")
   DictionaryAdd(dictionaryitem,"ContentCode", "EEV")

	retour = FacturXWriteProps(dictionary)					 ;et on ajoute tout ca au xml factur-x interne
	if retour <> " " | display "erreur " & retour |	LectureErreur | freturn "" | endif

	;--exemple de taxes et tva -------------------------------------------------
	dictionary = DictionaryCreate()		

   dictionarylisteitem = DictionaryCreate()  ;creation d'une liste Taxes
	DictionaryAdd(dictionary,"$Taxes",tostring(dictionarylisteitem))		;on ajoute la liste des  taxes

   dictionaryitem = DictionaryCreate()		;creation d'un element Taxe
	DictionaryAdd(dictionarylisteitem,tostring(dictionaryitem),tostring(dictionaryitem))	;on l'ajoute a la liste

	DictionaryAdd(dictionaryitem,"BasisAmount", "500.0")		
   DictionaryAdd(dictionaryitem,"Percent", "19.0")
   DictionaryAdd(dictionaryitem,"TypeCode","VAT")
   DictionaryAdd(dictionaryitem,"CategoryCode","")
   DictionaryAdd(dictionaryitem,"AllowanceChargeBasisAmount","0")

   dictionaryitem = DictionaryCreate() 		;creation d'un element Taxe					
	DictionaryAdd(dictionarylisteitem,tostring(dictionaryitem),tostring(dictionaryitem))		;on l'ajoute a la liste

	DictionaryAdd(dictionaryitem,"BasisAmount", "400.0")		
   DictionaryAdd(dictionaryitem,"Percent", "33.0")
   DictionaryAdd(dictionaryitem,"TypeCode","VAT")
   DictionaryAdd(dictionaryitem,"CategoryCode","")
   DictionaryAdd(dictionaryitem,"AllowanceChargeBasisAmount","0")
	
	retour = FacturXWriteProps(dictionary)
	if retour <> " " | display "erreur " & retour |LectureErreur |freturn "" | endif
																  *
	;- création d'une ligne de facture
	dictionary = DictionaryCreate()		;création d'une ligne de facture
   DictionaryAdd(dictionary,"Name", "Beurre Extra 250g")
   DictionaryAdd(dictionary,"Description","Beurre")
   DictionaryAdd(dictionary,"UnitCode", "C62")
   DictionaryAdd(dictionary,"UnitQuantity",""10)
   DictionaryAdd(dictionary,"GrossUnitPrice","1,45") 
	DictionaryAdd(dictionary,"NetUnitPrice","1,45")
   DictionaryAdd(dictionary,"BilledQuantity","10")
   DictionaryAdd(dictionary,"TaxType", "VAT")
   DictionaryAdd(dictionary,"TaxCategoryCode","S")
   DictionaryAdd(dictionary,"TaxPercent","7")

	;si on doit ajouter des charges du la ligne de facture
	dictionarylisteitem = DictionaryCreate()	 ;creation de  TradeAllowanceCharges
	DictionaryAdd(dictionary,"$TradeAllowanceCharges",tostring(dictionarylisteitem))

   dictionaryitem = DictionaryCreate()		;creation d'un element TradeAllowanceCharge
	DictionaryAdd(dictionarylisteitem,tostring(dictionaryitem),tostring(dictionaryitem))		;on l'ajoute a la liste 
	DictionaryAdd(dictionaryitem,"IsDiscount", "true")	
   DictionaryAdd(dictionaryitem,"Currency", "EUR")
   DictionaryAdd(dictionaryitem,"BasisAmount","1,5")
   DictionaryAdd(dictionaryitem,"ActualAmount","0,03")
   DictionaryAdd(dictionaryitem,"Reason","en promo")

	;et ecriture de la ligne de facture ,on commence a ecrire les propriétés de la ligne 
  	retour = FacturXWritePropsLine(dictionary)  
	if retour <> " " | display "erreur " & retour |	LectureErreur |freturn "" | endif
	;puis on ecris la ligne dans le ficheir xml factur-x , on est alros prêt pour une nouvelle ligne de facture
	retour = FacturXWriteLine()
	if retour <> " " | display "erreur " & retour |	LectureErreur |freturn "" | endif

	
	;a la fin on génère le vrai fichier xml 
	st = tmpfcreate(tdf,2,0)
	if st = 0
		fclose(tdf)	;attention faut penser a faire un close, car la fc tmpfcreate fait un open du fichier et donc le réserve
		fic = tdf.name
		retour = FacturXWriteEnd(left(fic))
		if retour <> " " | display "erreur " & retour |	LectureErreur |freturn "" | endif
		freturn fic
	endif
	freturn " "
endf

;on genère une edition FACTURX 
procedure ExempleImpression
1	err	x  = 0
1	txterr	4096= " " 
1  errl		L
1 fichierxml  260
1 fichierimp  260
1 fichierpdf  260
beginp
	XharviewBeginFileJoint  ;<- force le mode generer un xharview en interne
	XharviewNoRunXharview	;mais sans toucher a l'etat de la coche avec ou	sans apercu

	PrintBegin
	xmiprint  harmony.imasque  1  ; les xmiprint du masque etc 

	XharviewWriteParameter("<name>aaafacture_Nebout_125e_du_09_12_2020")	 ;<- 'nom' de l'edition , si on génére un pdf le nom du fichier 
																			;sera celui la (attention pas de blanc)
	fichierxml = GenererLeFichierXML ;on génére le fichier xml factur-x
	if fichierxml <> " "
		err = MetaDataFileFacturx(left(fichierxml))					;FACTURX on ajoute apres création le fichier factur-x xml attention au format windows 
		if err <> 0 															;FACTURX la fc fait un open pour vérifier que le fichier existe 
			err  = MetaDataGetLastError(txterr)
		endif
	endif
	MetaDataModele("BASIC") 											;FACTURX par défaut je prend toujours BASIC par defaut modele XRECHNUNG le fichier doit etre xrechnung.xml
	MetaDataTitle("facture_Nebout_125e_du_12/08/2021") 		;FACTURX titre, sinon le prend le nom du fichier 
	MetaDataSubject("facture client Nebout de 125 euro pour livres du 12/08/2021") ;FACTURX le sujet sinon le prend le nom du fichier 
	MetaDataKeywords("facture Nebout livres") 					;FACTURX mot cles pour la recherche dans les metadatas, sinon je met le nom du fichier 
	PrintEnd    

	XharviewGetFileXharview(fichierimp) ;on recupere le fichier
	if fichierimp <> " "	and err <> 0 					;cas en erreur , fichier = " " , exemple disque plein !!!
		fichierpdf = filenamebase(fichierimp) & "\facture_Nebout" & time(7) & ".pdf" 
		MapiConvertPDF(fichierimp,fichierpdf)
	endif
	XharviewEndFileJoint   ;continue l'execution du PrintEnd , ce qui n'a pas ete 
	XharviewRunXharview

	if fichierxml <> " "
		fdeletefile(left(fichierxml),errl,false)		;FACTURX on peut supprimer le fichier XML QUE APRES LE PRINTEND pas avant !
	endif
	if fichierimp <> " "
		fdeletefile(left(fichierimp),errl,false)		;FACTURX on peut supprimer le fichier de l'edition
	endif
	;fichierpdf contiend l'édition en pdf au format factur-x, on peut alors l'envoyer chez le client	
endp

main 
	masque  = "_testmapirtfxwin.dhoi"
	xmiload masque

	MapiOpen
	FacturXBegin()

	ExempleImpression	;impression d'une édition

	FacturXEnd()	;fermeture des modules
	MapiClose
	programexit