Exemple de génération d'une édition factur-x
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é
Etapes:
ExempleImpression =>génère une édition classique
GenererLeFichierXml => créer des listes+sous-listes et garnit les données de couples clé-valeur
GenererLeFichierXml => appelle les instructions pour transmettre les liste et les convertir en fichier xml
ExempleImpression => renseigne des propriété globales
ExempleImpression => appelle la conversion en PDF et l’intégration du fichier XML
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