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:

  1. ExempleImpression =>génère une édition classique

  2. GenererLeFichierXml => créer des listes+sous-listes et garnit les données de couples clé-valeur

  3. GenererLeFichierXml => appelle les instructions pour transmettre les liste et les convertir en fichier xml

  4. ExempleImpression => renseigne des propriété globales

  5. 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