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.

Deux modules Diva sont à utiliser pour lire ou écrire des informations Factur-X

yMetaDataOpen.dhop

Fonctions du module

Développer
titleFonctions meta

function int MetaDataOpen

  • chargement de la dll "DhDivaltoRTFtoHTMLConnector.dll",

  • contient le code pour extraire le fichier xml factur-x d'un fichier pdf

  • renvoi 0 si ok , sinon renvoi la valeur 1 si le chargement n'a pas aboutit

function int MetaDataClose

  • ferme la dll "DhDivaltoRTFtoHTMLConnector.dll", elle renvoi toujours 0

function int MetaDataExtractFacturxToFile(fichier,fichierxml,&txterr,options)

1 fichier A ;fichier pdf a lire avec un chemin windows
1 fichierxml A ;fichier dans lequel la dll va écrire le fichier xmnp qui contient les metadatas au format xml du fichier pdf

1 txterr A ;texte d'erreur si la fonction renvoi <> 0
1 options A ;options pour le futur, pour l'instant mettre un chaine à espace

  • extraction du fichier xml facturx d'un fichier pdf

  • fichierxml : ! doit déjà exister, et à supprimer ensuite

Le fichierxml doit déjà exister. On peut le créer avec la séquence suivante

Bloc de code
record * htdf tdfficeml
1 fichierxml 256 = " " 
Tmpfcreate (tdfficeml, 2, 0)
fclose(tdfficeml)
fichierxml = tdfficeml.Name

puis le supprimer

Bloc de code
;et a la fin du traitement du fichier il faut le supprimer avec le code
windeletefile(left(fichierxml))

function int MetaDataExtractMetadataToFile(fichier,fichierxml,&txterr,options)

1 fichier A
1 fichierxml A
1 txterr A
1 options A

  • extraction du fichier metadata xmp (xmnp) d'un fichier pdf

  • fonctionne exactement comme MetaDataExtractFacturxToFile mais au lieu de renvoyer le fichier factur-x, elle renvoi le fichier metadata xmp (ou xmnp)

Fichier xmp ou xmnp

C'est un fichier xml qui decrit le type de fichier pdf , il contient le titre du fichier, la date de création et certaine informations comme le mode pdf a 3, la liste des mot clés, c'est dans ce fichier que divalto écrit les informations provenant de

err = MetaDataModele("BASIC") ;par défaut BASIC
err = MetaDataTitle("facture_Nebout_125e_du_12/08/2021") ;titre
err = MetaDataSubject("facture client Nebout de 125 euro pour livres du 12/08/2021") ;le sujet
err = MetaDataKeywords("facture Nebout livres") ;mot cles pour la recherche dans les metadatas

et les caractéristiques du fichier pdf

Vous pouvez trouver la définition d'un fichier "xmp metadata pdf" sur internet

Voici un exemple :

Bloc de code
languagexml
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta x:xmptk="Adobe XMP Core 4.2.1-c041 52.342996, 2008/05/07-20:48:00" xmlns:x="adobe:ns:meta/">
  <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
    <rdf:Description xmlns:fx="urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#" rdf:about="">
      <fx:DocumentType>INVOICE</fx:DocumentType>
      <fx:DocumentFileName>factur-x.xml</fx:DocumentFileName>
      <fx:Version>1.0</fx:Version>
      <fx:ConformanceLevel>BASIC</fx:ConformanceLevel>
    </rdf:Description>
    <rdf:Description xmlns:pdfaid="http://www.aiim.org/pdfa/ns/id/" rdf:about="">
      <pdfaid:part>3</pdfaid:part>
      <pdfaid:conformance>B</pdfaid:conformance>
    </rdf:Description>
    <rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1/" rdf:about="">
      <dc:title>
        <rdf:Alt>
          <rdf:li xml:lang="x-default">facture_Nebout_125e_du_12/08/2021</rdf:li>
        </rdf:Alt>
      </dc:title>
      <dc:creator>
        <rdf:Seq>
          <rdf:li>Divalto</rdf:li>
        </rdf:Seq>
      </dc:creator>
      <dc:description>
        <rdf:Alt>
          <rdf:li xml:lang="x-default">facture client Nebout de 125 euro pour livres du 12/08/2021</rdf:li>
        </rdf:Alt>
      </dc:description>
    </rdf:Description>
    <rdf:Description xmlns:pdf="http://ns.adobe.com/pdf/1.3/" rdf:about="">
      <pdf:Producer>Generateur PDF de DivaltoViewer v1.92</pdf:Producer>
      <pdf:Keywords>facture Nebout livres</pdf:Keywords>
    </rdf:Description>
    <rdf:Description xmlns:xmp="http://ns.adobe.com/xap/1.0/" rdf:about="">
      <xmp:MetadataDate>2022-11-26T12:44:17+01:00</xmp:MetadataDate>
      <xmp:CreatorTool>Divalto</xmp:CreatorTool>
      <xmp:CreateDate>2022-11-26T12:44:17+01:00</xmp:CreateDate>
      <xmp:ModifyDate>2022-11-26T12:44:17+01:00</xmp:ModifyDate>
    </rdf:Description>
    <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/">
	<xmpMM:InstanceID>uuid: 07e60b0c-2c11-31ab-07e6-0b0c2c1131ab</xmpMM:InstanceID>
	<xmpMM:DocumentID>uuid: 07e60b0c-2c11-31ab-07e6-0b0c2c1131ab</xmpMM:DocumentID>
    </rdf:Description>
    <rdf:Description xmlns:pdfaExtension="http://www.aiim.org/pdfa/ns/extension/"
	xmlns:pdfaSchema="http://www.aiim.org/pdfa/ns/schema#" 
	xmlns:pdfaType="http://www.aiim.org/pdfa/ns/type#"
	xmlns:pdfaField="http://www.aiim.org/pdfa/ns/field#" 
	xmlns:pdfaProperty="http://www.aiim.org/pdfa/ns/property#" rdf:about="">
      <pdfaExtension:schemas>
        <rdf:Bag>
          <rdf:li rdf:parseType="Resource">
            <pdfaSchema:schema>Factur-X PDFA Extension Schema</pdfaSchema:schema>
            <pdfaSchema:namespaceURI>urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#</pdfaSchema:namespaceURI>
            <pdfaSchema:prefix>fx</pdfaSchema:prefix>
            <pdfaSchema:property>
              <rdf:Seq>
                <rdf:li rdf:parseType="Resource">
                  <pdfaProperty:name>DocumentFileName</pdfaProperty:name>
                  <pdfaProperty:valueType>Text</pdfaProperty:valueType>
                  <pdfaProperty:category>external</pdfaProperty:category>
                  <pdfaProperty:description>name of the embedded XML invoice file</pdfaProperty:description>
                </rdf:li>
                <rdf:li rdf:parseType="Resource">
                  <pdfaProperty:name>DocumentType</pdfaProperty:name>
                  <pdfaProperty:valueType>Text</pdfaProperty:valueType>
                  <pdfaProperty:category>external</pdfaProperty:category>
                  <pdfaProperty:description>INVOICE</pdfaProperty:description>
                </rdf:li>
                <rdf:li rdf:parseType="Resource">
                  <pdfaProperty:name>Version</pdfaProperty:name>
                  <pdfaProperty:valueType>Text</pdfaProperty:valueType>
                  <pdfaProperty:category>external</pdfaProperty:category>
                  <pdfaProperty:description>The actual version of the Factur-X XML schema</pdfaProperty:description>
                </rdf:li>
                <rdf:li rdf:parseType="Resource">
                  <pdfaProperty:name>ConformanceLevel</pdfaProperty:name>
                  <pdfaProperty:valueType>Text</pdfaProperty:valueType>
                  <pdfaProperty:category>external</pdfaProperty:category>
                  <pdfaProperty:description>The conformance level of the embedded Factur-X data</pdfaProperty:description>
                </rdf:li>
              </rdf:Seq>
            </pdfaSchema:property>
          </rdf:li>
        </rdf:Bag>
      </pdfaExtension:schemas>
    </rdf:Description>
  </rdf:RDF>
</x:xmpmeta>
<?xpacket end="w"?>

Fournir un autre modèle xmp

Développer

Harmony a un modèle de base d'un fichier xmp mais on peut lui fournir un autre modèle s'il faut au moment de la génération du fichier dhvw avec la commande

err = MetaDataFileMetaData( "chemin et fichier xml au format windows a prendre comme modèle xmp")

ou alors de façon globale a toute les impressions en mettant dans regedit
Ordinateur\HKEY_CURRENT_USER\SOFTWARE\Divalto\divalto.ini
chapitre PDF mot cle "metadataXMNPFile" ;il faut mettre le chemin et le nom du fichier a lire

on peut saisir ce paramètre dans divaltoViewer -> menu Options => Paramètres => Convertion PDF

=> bouton Mode PDFA => Prendre le fichier XMNP par défaut sinon prendre ce fichier XMNP

le fichier sera intégré au fichier dhwv et c'est lui qui servira de modèle xmp lors de la conversion du dhvw en pdf
il faut mettre des mots clés que divaltoviewer modifira aves les valeurs title,key words etc au momment de la génération du pdf
voila le code xmp que harmony prend par defaut

les mots clés

  • %%metadatasubject%% sera remplacé par la valeur de la fonction MetaDataSubject

  • %%metadataTitle%% sera remplacé par la valeur de la fonction MetaDataTitle

  • %%metadataProducer%% actuellement toujours le texte "Generateur PDF de DivaltoViewer v1.92"

  • %%metadataCreator%% "Divalto"

  • %%metadataKeywords%% sera remplacé par la valeur de la fonction MetaDataKeywords

  • %%metadataCreationDate%% sera remplacé par la valeur de la date en cours

  • %%metadataDocumentFileName%% sera remplacé par la valeur factur-x.xml ou xrechnung.xml

  • ( si le modele est "XRECHNUNG" au lieu de BASIC Extended etc dans la fonction MetaDataModele()
    alors le nom du fichier factur-x n'est plus "factur-x.xml" mais doit être "xrechnung.xml"
    c'est une particuliriaté du modèle XRECHNUNG allemand )

  • %%metadataVersionDocumentFileName%% actuellement toujours "1.0"

  • %%metadataConformanceLevel%% sera remplacé par la valeur de la fonction MetaDataModele

  • %%metadataDocumentID%% c'est un guid qui est calculé au moment de la conversion pdf,

  • %%metadataInstanceID%% c'est un guid qui est calculé au moment de la conversion pdf
    %%metadataDocumentID%% et %%metadataInstanceID%% identifie de façon unique le document

  • %%metadataAuthor%% "ERP Divalto " HARMONY_VERSION " - DivaltoViewer v1.92 11/12/2021" mais on l'a pas mis dans le modèle par défaut
    car certains vérificateurs pdf-A 3b provoque une erreur si

Bloc de code
      <dc:creator>
        <rdf:Seq>
          <rdf:li>%%metadataCreator%%</rdf:li>
        </rdf:Seq>
      </dc:creator>
	est différent de celui qui est inscrit dans ce chapitre !
    <rdf:Description xmlns:xmp="http://ns.adobe.com/xap/1.0/" rdf:about="">
      <xmp:CreatorTool>%%metadataCreator%%</xmp:CreatorTool>
    </rdf:Description>

si on personnalise le fichier xmp , vous pouvez ajouter 3 mots clés qui seront remplacés par leurs valeurs

%%metadataParam1%% ce sont 3 valeurs que l'on peut positionner lorsqu'on crée le dhvw dans le code diva en utilisant la fc

%%metadataParam2%% MetaDataOptions("PARAM1","xxxxx") MetaDataOptions("PARAM2","xxxxx") MetaDataOptions("PARAM3","xxxxx")

%%metadataParam3%%

contenu du fichier xmp que prend divaltoviewer et qui intégré dans divaltoviewer

Bloc de code
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta x:xmptk="Adobe XMP Core 4.2.1-c041 52.342996, 2008/05/07-20:48:00" xmlns:x="adobe:ns:meta/">
  <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
    <rdf:Description xmlns:fx="urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#" rdf:about="">
      <fx:DocumentType>INVOICE</fx:DocumentType>
      <fx:DocumentFileName>%%metadataDocumentFileName%%</fx:DocumentFileName>
      <fx:Version>%%metadataVersionDocumentFileName%%</fx:Version>
      <fx:ConformanceLevel>%%metadataConformanceLevel%%</fx:ConformanceLevel>
    </rdf:Description>
    <rdf:Description xmlns:pdfaid="http://www.aiim.org/pdfa/ns/id/" rdf:about="">
      <pdfaid:part>3</pdfaid:part>
      <pdfaid:conformance>B</pdfaid:conformance>
    </rdf:Description>
    <rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1/" rdf:about="">
      <dc:title>
        <rdf:Alt>
          <rdf:li xml:lang="x-default">%%metadataTitle%%</rdf:li>
        </rdf:Alt>
      </dc:title>
      <dc:creator>
        <rdf:Seq>
          <rdf:li>%%metadataCreator%%</rdf:li>
        </rdf:Seq>
      </dc:creator>
      <dc:description>
        <rdf:Alt>
          <rdf:li xml:lang="x-default">%%metadatasubject%%</rdf:li>
        </rdf:Alt>
      </dc:description>
    </rdf:Description>
    <rdf:Description xmlns:pdf="http://ns.adobe.com/pdf/1.3/" rdf:about="">
      <pdf:Producer>%%metadataProducer%%</pdf:Producer>
      <pdf:Keywords>%%metadataKeywords%%</pdf:Keywords>
    </rdf:Description>
    <rdf:Description xmlns:xmp="http://ns.adobe.com/xap/1.0/" rdf:about="">
      <xmp:MetadataDate>%%metadataCreationDate%%</xmp:MetadataDate>
      <xmp:CreatorTool>%%metadataCreator%%</xmp:CreatorTool>
      <xmp:CreateDate>%%metadataCreationDate%%</xmp:CreateDate>
      <xmp:ModifyDate>%%metadataCreationDate%%</xmp:ModifyDate>
    </rdf:Description>
    <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/">
	<xmpMM:InstanceID>uuid: %%metadataInstanceID%%</xmpMM:InstanceID>
	<xmpMM:DocumentID>uuid: %%metadataDocumentID%%</xmpMM:DocumentID>
    </rdf:Description>
    <rdf:Description xmlns:pdfaExtension="http://www.aiim.org/pdfa/ns/extension/"
	xmlns:pdfaSchema="http://www.aiim.org/pdfa/ns/schema#" 
	xmlns:pdfaType="http://www.aiim.org/pdfa/ns/type#"
	xmlns:pdfaField="http://www.aiim.org/pdfa/ns/field#" 
	xmlns:pdfaProperty="http://www.aiim.org/pdfa/ns/property#" rdf:about="">
      <pdfaExtension:schemas>
        <rdf:Bag>
          <rdf:li rdf:parseType="Resource">
            <pdfaSchema:schema>Factur-X PDFA Extension Schema</pdfaSchema:schema>
            <pdfaSchema:namespaceURI>urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#</pdfaSchema:namespaceURI>
            <pdfaSchema:prefix>fx</pdfaSchema:prefix>
            <pdfaSchema:property>
              <rdf:Seq>
                <rdf:li rdf:parseType="Resource">
                  <pdfaProperty:name>DocumentFileName</pdfaProperty:name>
                  <pdfaProperty:valueType>Text</pdfaProperty:valueType>
                  <pdfaProperty:category>external</pdfaProperty:category>
                  <pdfaProperty:description>name of the embedded XML invoice file</pdfaProperty:description>
                </rdf:li>
                <rdf:li rdf:parseType="Resource">
                  <pdfaProperty:name>DocumentType</pdfaProperty:name>
                  <pdfaProperty:valueType>Text</pdfaProperty:valueType>
                  <pdfaProperty:category>external</pdfaProperty:category>
                  <pdfaProperty:description>INVOICE</pdfaProperty:description>
                </rdf:li>
                <rdf:li rdf:parseType="Resource">
                  <pdfaProperty:name>Version</pdfaProperty:name>
                  <pdfaProperty:valueType>Text</pdfaProperty:valueType>
                  <pdfaProperty:category>external</pdfaProperty:category>
                  <pdfaProperty:description>The actual version of the Factur-X XML schema</pdfaProperty:description>
                </rdf:li>
                <rdf:li rdf:parseType="Resource">
                  <pdfaProperty:name>ConformanceLevel</pdfaProperty:name>
                  <pdfaProperty:valueType>Text</pdfaProperty:valueType>
                  <pdfaProperty:category>external</pdfaProperty:category>
                  <pdfaProperty:description>The conformance level of the embedded Factur-X data</pdfaProperty:description>
                </rdf:li>
              </rdf:Seq>
            </pdfaSchema:property>
          </rdf:li>
        </rdf:Bag>
      </pdfaExtension:schemas>
    </rdf:Description>
  </rdf:RDF>
</x:xmpmeta>
<?xpacket end="w"?>

Fournir un autre modèle ICC

Développer

Harmony a aussi un modèle de base d'un ICC (description du modèle des couleurs, par défaut harmony à un fichier de couleur de base de winddows sRGB IEC61966-2-1) mais qu'on peut lui fournir un autre modèle ICC s'il faut au moment de la génération du fichier dhvw avec la commande
err = MetaDataFileICC( "chemin et fichier icc format windows a prendre comme modèle de couleur")
ou alors de façon globale a toute les impressions en mettant dans regedit

Ordinateur\HKEY_CURRENT_USER\SOFTWARE\Divalto\divalto.ini
chapitre PDF mot cle "metadataICCFile" ;il faut mettre le chemin et le nom du fichier a lire

on peut saisir ce paramètre dans DivaltoViewer -> menu Options => Paramètres => Conversion PDF
=> bouton Mode PDFA => Prendre le fichier ICC par défaut sinon prendre ce fichier ICC
=> Prendre l'identifiant ICC par défaut sinon prendre cet identifiant , par défaut harmony utilise le modèle "sRGB IEC61966-2-1"
et donc l'identifiant d’harmony est "sRGB IEC61966-2-1

yFacturX.dhop

Fonctions du module - globales

Développer
titleFonctions globales

function int FacturXBegin(option)

Chargement de la dll facturx.

  • 0 si ok

  • 1 si erreur

  • 1 option x = 0 ;pour évolution future

function int FacturXEnd(option)

Déchargement de la dll facturx
1 option x = 0 ;pour évolution future

function int FacturXGetVersion

function int FacturXGetDLLVersion

function char FacturXGetErreur

Cette fonction renvoi la liste des erreurs en cours et supprime a chaque fois le texte de l’erreur qu’elle vient de renvoyer au programme diva.

Le programme reçoit donc toujours les dernières erreurs non lues par lui

Bloc de code
procedure LectureErreur
1	txterreur S
beginp
	do
		txterreur = FacturXGetErreur
	while txterreur <> " " 
		display left(txterreur)
	wend
endp

Fonctions du module - Lecture factur-x

Développer
titleFonctions de lecture

function char FacturXReadOpen(fichier,option)

1 fichier A
1 option x = 0 ;pour évolution future

Lecture d'un fichier xml facturx, elle ouvre le fichier et charge la description xml

Retour :

  • espace = ok

  • sinon texte de l'erreur

function char FacturXReadClose(option)

1 option x = 0 ;pour évolution future

Fermeture du fichier xml facturx , elle libère le fichier (on peut apres le supprimé par exemple)
Retour:

  • espace = ok

  • sinon texte de l'erreur

function char FacturXGetGlobalProps(&liste,option)

1 liste L
1 option x = 0 ;pour évolution future

Renvoi la liste des propriétés globales SAUF les lignes détails, ainsi que les listes de tableaux de dictionnary
Retour :

  • espace = ok

  • sinon texte de l'erreur

Attention : cela crée des dictionnary, il faut utiliser la fonction FacturXDictionaryDestroy apres avoir traiter les propriétés.

Pour rechercher si un élément existe , il faut utiliser la fonction DictionarySearch (ident , clé, élément) en fonction de ce que vous traité dans le programme diva

voir aussi les fonctions DictionaryBegin et DictionaryNext pour parcourir une liste de dictionnary.

exemple

Bloc de code
1 existe L
1 valeur S
existe =  DictionarySearch ( dictionnaryt , "InvoiceNo", valeur)
if existe = 0
  traiter valeur 
endifexiste =  DictionarySearch ( dictionnaryt , "InvoiceDate", valeur)
if existe = 0
  traiter valeur 
endif
endifexiste =  DictionarySearch ( dictionnaryt , "$Taxes", valeur)
if existe = 0
  traiter valeur 
endif

exemple pour les taxes
existeliste=  DictionaryBegin(dictionnarylisteitem )
if existeliste = 0
 loop DictionaryNext (dictionnarylisteitem,cle,valeur) not in (0, -1)	
    dictionnaryitem = val(valeur)
    lecture d'une taxe qui se rtouve dans le dictionnary dictionnaryitem
 endloop
endif

On peut donc recevoir une liste de propriétés (voir la page dédiée)

function char FacturXGetGlobalNotes(&liste,option)

Renvoi la liste des notes globales , c’est uniquement si on veut traiter les notes
espace = ok
sinon texte de l'erreur

C’est une fonction a part car cela peut être optionnel si on ne traite pas la gestion des notes dans facturx
et cella peut demander plus de temps cpu pour charger les notes

1 liste L
1 option x = 0 ;pour évolution future

Bloc de code
        "Note.Content"					type texte
        "Note.ContentCode"				type ContentCodes
        "Note.SubjectCode"				type SubjectCodes
Bloc de code
cela donne le résultat suivant

 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


function char FacturXGetGlobalDocumentsInFiles(&liste,option)

Renvoi la liste des documents globaux, c’est uniquement si on veut traiter les fichiers joints
espace = ok
sinon texte de l'erreur

C’est une fonction a part car cela peut être optionnel si on ne traite pas la gestion des fichiers joints dans facturx et cella peut demander plus de temps cpu pour charger les joints et ca crées des fichiers temporaires.

Attention : cela crée des dictionnary, il faut utiliser la fonction FacturXDictionaryDestroy apres avoir traiter les propriétés.

Il faut les supprimés à la fin du traitement en appelant la fonction FacturXDeleteTmpFiles().

Si on les supprimes directement dans le programme diva alors il faut appeler la fonction FacturXClearListTmpFiles() pour vider la liste des fichiers à supprimés qui se trouve dans la dll.

1 liste L
1 option x = 0 ;pour évolution future

Bloc de code
        "AdditionalReferencedDocument.ID"			type texte
        "AdditionalReferencedDocument.TypeCode"			type AdditionalReferencedDocumentTypeCode
        "AdditionalReferencedDocument.IssueDateTime"		type date time
        "AdditionalReferencedDocument.Name"			type texte
        "AdditionalReferencedDocument.ReferenceTypeCode"	type ReferenceTypeCodes
        "AdditionalReferencedDocument.AttachmentBinaryObject"   type base64
        "AdditionalReferencedDocument.AttachmentBinaryFile"	type texte nom reel + chemin du fichier 
        "AdditionalReferencedDocument.Filename"			type texte

attention les types de fichiers autorisés sont 
           ".pdf", "application/pdf"
           ".png", "image/png"
           ".jpg", "image/jpeg"
           ".jpeg", "image/jpeg"
           ".csv", "text/csv" 
           ".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
           ".ods", "application/vnd.oasis.opendocument.spreadsheet"
           ".xml", "application/xml"

Bloc de code
Cela donne le résultat suivant 

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

function char FacturXGetLineProps(&liste,option)

1 liste L
1 option x = 0 ;pour évolution future

Renvoie la liste des props d'une ligne détail

Retour :

  • 1 = ok boucler pour lire la suivante

  • espace = fin de la liste

  • sinon texte de l'erreur

Attention : cela crée des dictionnary, il faut utiliser la fonction FacturXDictionaryDestroy apres avoir traiter les propriétés.

Bloc de code
    //     Adds a new line to the invoice. The line id is generated automatically.
        "Line.Name"					type texte
        "Line.Description"				type texte

        "Line.UnitCode"					type QuantityCodes
        "Line.UnitQuantity"				type numerique

	Prix ​​unitaire brut
        "Line.GrossUnitPrice"				type numerique

	prixunitaire net :	
        "Line.NetUnitPrice"				type numerique

	quantité facturée :
        "Line.BilledQuantity"				type numerique

        "Line.TaxType"					type TaxTypes
        "Line.TaxCategoryCode"				type TaxCategoryCodes
        "Line.TaxPercent"				type numerique

        //commentaire sur une ligne 			
	"Line.Comment"					type texte

        //{"Line.Note.Content"
        "Line.GlobalID.ID"				type texte
        "Line.GlobalID.SchemeID"			type SchemeID

	// vendeur
	   //Numéro d'article du vendeur
        "Line.SellerAssigned.ID"			type texte

	//l'acheteur
        //Numéro d'article de l'acheteur
        "Line.BuyerAssigned.ID"				type texte
        "Line.BuyerOrderID"				type texte
        "Line.BuyerOrderDate"				type date

        "Line.DeliveryNoteID"			type texte
        "Line.DeliveryNoteDate"			type date

        "Line.BillingPeriodStart"		type date
        "Line.BillingPeriodEnd"			type date

        "Line.ActualDeliveryDate"		type date

        "Line.Note.Content"			type texte
        "Line.Note.ContentCode"			type ContentCodes
        "Line.Note.SubjectCode"			type SubjectCodes
        
        "Line.ContractReferencedDocument.ID"			type texte
        "Line.ContractReferencedDocument.IssueDateTime"		type date

        "Line.DeliveryNoteReferencedDocumentDeliveryNote.ID"	type texte
        "Line.DeliveryNoteReferencedDocumentDeliveryNote.Date"	type date

        "Line.OrderReferencedDocument.ID"			type texte
        "Line.OrderReferencedDocument.Date"			type date
   
//charges ou remises
$Line.TradeAllowanceCharges
        "TradeAllowanceCharge.IsDiscount"		type bool true/false
        "TradeAllowanceCharge.Currency"		type CurrencyCodes
        "TradeAllowanceCharge.BasisAmount"		type numerique
        "TradeAllowanceCharge.ActualAmount"	type numerique
        "TradeAllowanceCharge.Reason"		type texte
        "TradeAllowanceCharge.ReasonCode"		type texte
        "TradeAllowanceCharge.Taxe.TypeCode"	type TaxTypes
        "TradeAllowanceCharge.Taxe.CategoryCode"	type TaxCategoryCodes
        "TradeAllowanceCharge.Taxe.ExemptionReasonCode"    type TaxExemptionReasonCodes
        "TradeAllowanceCharge.Taxe.ExemptionReason"	type texte
        "TradeAllowanceCharge.Taxe.Percent"		type numerique

$Line.AdditionalReferencedDocuments
        "AdditionalReferencedDocument.ID"			type texte
        "AdditionalReferencedDocument.IssueDateTime"	type date
        "AdditionalReferencedDocument.ReferenceTypeCode"	type ReferenceTypeCodes

$Line.ReceivableSpecifiedTradeAccountingAccounts
        "ReceivableSpecifiedTradeAccountingAccount.ID"	type texte
        "ReceivableSpecifiedTradeAccountingAccount.TypeCode" type AccountingAccountTypeCodes

$Line.ApplicableProductCharacteristics
//Caractéristique supplémentaire du produit
        "ApplicableProductCharacteristic.Description"	type texte
		//valeur du bien
        "ApplicableProductCharacteristic.Value"		type numerique


Bloc de code
Cella donne le résultat suivant :

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
     

function char FacturXGetLineNotes(&liste,option)

1 liste L
1 option x = 0 ;pour évolution future

Renvoie la liste des note de la ligne détail en cours
;"1" = ok boucler pour lire la suivante
;espace = fin de la liste
;sinon texte de l'erreur

Attention : cela crée des dictionnary, il faut utiliser la fonction FacturXDictionaryDestroy apres avoir traiter les propriétés.

Bloc de code
    "Note.Content"			type texte
    "Note.ContentCode"			type ContentCodes
    "Note.SubjectCode"			type SubjectCodes
Bloc de code
Cela donne le résultat suivant :

$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

function char FacturXGetLineDocumentsInFiles(&liste,option)

1 liste L
1 option x = 0 ;pour évolution future

Renvoie la liste des documents de la ligne détail en cours
Retour :

  • 1 = ok boucler pour lire la suivante

  • espace = fin de la liste

  • sinon le texte de l'erreur

Attention : cela crée des dictionnary, il faut utiliser la fonction FacturXDictionaryDestroy apres avoir traiter les propriétés.

Il faut les supprimés à la fin du traitement en appelant la fonction FacturXDeleteTmpFiles().

Si on les supprimes directement dans le programme diva alors il faut appeler la fonction FacturXClearListTmpFiles() pour vider la liste des fichiers à supprimés qui se trouve dans la dll.

Bloc de code
        "AdditionalReferencedDocument.ID"			type texte
        "AdditionalReferencedDocument.TypeCode"			type AdditionalReferencedDocumentTypeCode
        "AdditionalReferencedDocument.IssueDateTime"		type date time
        "AdditionalReferencedDocument.Name"			type texte
        "AdditionalReferencedDocument.ReferenceTypeCode"	type ReferenceTypeCodes
        "AdditionalReferencedDocument.AttachmentBinaryObject"   type base64
        "AdditionalReferencedDocument.AttachmentBinaryFile"	type texte nom reel + chemin du fichier 
        "AdditionalReferencedDocument.Filename"			type texte

attention les types de fichiers autorisés sont 
           ".pdf", "application/pdf"
           ".png", "image/png"
           ".jpg", "image/jpeg"
           ".jpeg", "image/jpeg"
           ".csv", "text/csv" 
           ".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
           ".ods", "application/vnd.oasis.opendocument.spreadsheet"
           ".xml", "application/xml"
Bloc de code
Cela donne le résultat suivant :

DictionaryGetName(FACTURX_LINE)
$Line.AdditionalReferencedDocuments count 1

    liste DictionaryGetName(FACTURX_$LINE.ADDITIONALREFERENCEDDOCUMENTS)

A noter que dans les lignes , on n'a pas le fichier en question mais un identifiant
qui indique le fichier joint global , il donc se référer à la liste globale des 
fichiers joints , c'est le champ AdditionalReferencedDocument.ID

    DictionaryGetName(FACTURX_LINE.ADDITIONALREFERENCEDDOCUMENT_1)
    AdditionalReferencedDocument.Filename=
    AdditionalReferencedDocument.ID=A123
    AdditionalReferencedDocument.IssueDateTime=20230313
    AdditionalReferencedDocument.Name=
    AdditionalReferencedDocument.ReferenceTypeCode=AAA
    AdditionalReferencedDocument.TypeCode=ReferenceDocument

procedure FacturXDictionaryDestroy

Supprime les dictionary qui sont dans la liste dictionary à supprimer

function char FacturXDeleteTmpFiles

Les fonctions suivantes

  • FacturXGetGlobalDocumentsInFiles

  • FacturXGetGlobalNotes

  • FacturXGetLinesDocumentsInFiles

  • FacturXGetLignesNotes

génèrent des fichiers temporaires, à chaque création d'un fichier temporaire (stockés dans un liste interne)

Cette fonction permet de supprimer tous ces fichiers lorsqu'on fini de les traitées

On peut appeler cette fonction quand on veut, si la liste des fichiers temporaires est vide, cette fonction ne fait rien et retourne dans diva

function char FacturXClearListTmpFiles

En alternative à FacturXDeleteTmpFiles, cette fonction permet de vider la liste des fichiers temporaire, dans ce cas c'est au programme diva de traiter ce qu'il doit faire avec ces fichiers temporaires.

On peut appeler cette fonction quand on veut, si la liste des fichiers temporaires est vide, cette fonction ne fait rien et retourne dans diva

procedure FacturXAppendDictonaryDestroy(wliste)

1 wliste L

Ajoute un ident d'un dictionary à la liste des dictionary à supprimer

function int FacturXOption(option,valeur)

1 option A
1 valeur A

Fonctions du module - Ecriture factur-x

Développer
titleFonctions d'écriture

function char FacturXWriteProps(dictionary,option)

1 dictionary L
1 option x = 0

Apres avoir alimenté la ou les listes de Dictionnary , il faut envoyer le tout à la dll en lui donnant l’identification du dictionnary principal.

Attention: les propriétés sont toutes les propriétés globales, celles de la liste de la fonction FacturXGetGlobalProps donc SAUF celles des lignes détail , car elles sont écrites en une seule fois par la fonction FacturXWriteEnd, car le code xml généré dépands de différent critères selon la valeurs d’autres propriétés, on ne peut donc générer les propriétés globales du fichier xml que lorsqu’on a toutes les valeurs.

On peut faire plusieurs FacturXWriteProps , par exemple faire un FacturXWriteProps pour les propriétés de bases puis un FacturXWriteProps pour les taxes puis un FacturXWriteProps pour les charges etc. Si lors de ce processus, une propriétés existe déjà, la nouvelle valeur remplace l’ancienne valeur.

A noter que cette fonction lit les différents dictionnary et les supprimes les uns après les autres , il ne faut donc pas les supprimés dans votre code diva, cette fonction le fait a votre place.

Attention : il peut y avoir plusieurs erreur, il faut donc utiliser ce code diva

Bloc de code
procedure LectureErreur
1	txterreur S
beginp
	do
		txterreur = FacturXGetErreur
	while txterreur <> " " 
		display left(txterreur)
	wend
endp

function char FacturXWriteEnd(fichier,option)

1 fichier A ;fichier qui va recevoir le texte xml avec un chemin windows
1 option x = 0

Cette fonction génère le fichier xml , elle écris les propriétés globales et les lignes détailles

Le champs fichier doit contenir le chemin et le nom d’un fichier, celui ci doit existé . La fonction efface le contenu du fichier et écris le code xml.

Pour créer le fichier , vous pouvez utiliser le code div suivant :

Bloc de code
Record * htdf tdf
1 ficxml 260
1 txterr S

	tdf = " "
	Tmpfcreate (tdf , 2 )
	ferase(tdf)
	ficxml= tdf.Name
	fclose(tdf)

txterr = FacturXWriteEnd(ficxml)

 

Attention : il peut y avoir plusieurs erreur, il faut donc utiliser ce code diva

Bloc de code
procedure LectureErreur
1	txterreur S
beginp
	do
		txterreur = FacturXGetErreur
	while txterreur <> " " 
		display left(txterreur)
	wend
endp

function char FacturXWritePropsLine(dictionary,option)

1 dictionary L
1 option x = 0

 Apres avoir alimenter la ou les listes de Dictionnary mais que pour les lignes , il faut envoyer la ligne à la dll en plus donnant l’identification du dictionnary principal de la ligne .

On peut faire plusieurs FacturXWritePropsLine pour une même ligne, par exemple un FacturXWritePropsLine pour les propriétés de bases de la lignes , puis un FacturXWritePropsLine pour les taxes, puis un FacturXWritePropsLine pour les charges etc, Si lors de ce processus, une propriétés existe déjà, la nouvelle valeur remplace l’ancienne valeur.

Quand on a fini de mettre en place les propriétés d’une ligne il faut exécuter la fonction FacturXWriteLine.

A noter que cette fonction lit les différents dictionnary et les supprimes les uns après les autres , il ne faut donc pas les supprimés dans votre code diva, cette fonction le fait a votre place.

 

Attention : il peut y avoir plusieurs erreur, il faut donc utiliser ce code diva

Bloc de code
procedure LectureErreur
1	txterreur S
beginp
	do
		txterreur = FacturXGetErreur
	while txterreur <> " " 
		display left(txterreur)
	wend
endp

function char FacturXWriteLine(option)

1 option x = 0

Ecrit définitivement une ligne avec toutes ces propriétés, efface les valeurs en cours et se remet en position pour accepter une nouvelle ligne. Attention, on ne peut pas modifier une ligne déjà écrite, il faut donc appeler cette fonction a la fin du processus de la création d’une ligne , lorsqu' on veut passer à la ligne suivante.

Attention : il peut y avoir plusieurs erreur, il faut donc utiliser ce code diva

Bloc de code
procedure LectureErreur
1	txterreur S
beginp
	do
		txterreur = FacturXGetErreur
	while txterreur <> " " 
		display left(txterreur)
	wend
endp

Sommaire