PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Chorus PDF et Déposer flux facture
Chorus PDF et Déposer flux facture
Débuté par Stéphane D., 12 déc. 2018 17:59 - 11 réponses
Membre enregistré
161 messages
Popularité : -1 (1 vote)
Posté le 12 décembre 2018 - 17:59
Bonjour à tous je reviens vers vous sur ma problématique avec Chorus.

En première partie j'ai voulu envoyer une facture sur chorus de cette manière avec deposerPDFFacture :
MonJsonIn est un Buffer
vJsonIn est un Variant

sURL est une chaîne ="https://chorus-pro.gouv.fr:5443/service-qualif/factures/deposer/flux"
// Constante
sTypeContenu est une chaîne = "application/json"
//utilisateur
user est une chaîne = "TECH_000000000@cpp2017.fr"
//mot de passe utilisateur
mdp est une chaîne = "*****"

fCrypte("C:\Facture\FSO1117A_EN16931_P03.pdf", "C:\Facture\FSO1117A_base64.txt", "", crypteAucun, encodeBASE64)

// constitution du JSON
vJsonIn.fichierFlux = "Fichier encodé en base 64"
vJsonIn.nomFichier = "C:\Facture\FSO1117A_base64.txt"
vJsonIn.syntaxeFlux = "IN_DP_E1_UBL_INVOICE"
vJsonIn.avecSignature = True

MonJsonIn = VariantVersJSON(vJsonIn)
//
// constitution de la chaîne d'authentification
//
User_MDP est une chaîne = user+":"+mdp
//on encode en base 64
auth_base64 est une chaîne = Crypte(User_MDP, "", compresseAucun + crypteAucun, encodeBASE64)
//on crée le HEADER
sHeaderAuth est une chaîne = ChaîneVersUTF8("Authorization: Basic "+auth_base64)
//
// Charger le certificat
//
ListeCertif est une chaîne = HTTPListeCertificat()
Certif est une chaîne = ExtraitChaîne(ExtraitChaîne(ListeCertif, 1, RC), 3, TAB)
HTTPCertificat(Certif)

// Lancement d'une requête sur un serveur sécurisé
ResLancement est un booléen = HTTPRequête(sURL,"",sHeaderAuth,MonJsonIn,sTypeContenu)

// Si erreur rencontrée
SI ResLancement = Vrai ALORS
ResCode est une chaîne = HTTPDonneRésultat()
Info("Code HTML : " + ResCode)
FIN


Mais il me dit :
L'encodage du fichier fourni en entré n'est pas conforme à la norme d'encodage (base64)

Pour ma deuxième partie je veux déposer un flux facture avec deposerFluxFacture :
MonJsonIn est un Buffer
MonJsonInStructure est un Buffer
vJsonIn est un Variant
vJsonInStructure est un Variant

sURL est une chaîne ="https://chorus-pro.gouv.fr:5443/service-qualif/factures/soumettre"
// Constante
sTypeContenu est une chaîne = "application/json"
//utilisateur
user est une chaîne = "TECH_000000000@cpp2017.fr"
//mot de passe utilisateur
mdp est une chaîne = "*******"
//
// constitution du JSON
//
vJsonIn.modeDepot="SAISIE_API"
vJsonIn.numeroFactureSaisi = Null

vJsonIn.destinataire.codeDestinataire = "2632"
vJsonIn.destinataire.codeServiceExecutant = "AAA024DESTINATAIRE"

vJsonIn.fournisseur.idFournisseur = 164679
vJsonIn.fournisseur.idServiceFournisseur = 10285851
vJsonIn.fournisseur.codeCoordonneesBancairesFournisseur = 132

vJsonIn.cadreDeFacturation.codeCadreFacturation = "A1_FACTURE_FOURNISSEUR"
vJsonIn.cadreDeFacturation.codeStructureValideur = Null

vJsonIn.references.deviseFacture = "EUR"
vJsonIn.references.typeFacture = "FACTURE"
vJsonIn.references.typeTva = "TVA_SUR_DEBIT"
vJsonIn.references.motifExonerationTva = Null
vJsonIn.references.numeroMarche = "VABFM001"
vJsonIn.references.numeroBonCommande = Null
vJsonIn.references.numeroFactureOrigine = Null
vJsonIn.references.modePaiement = "ESPECE"

vJsonIn.lignePoste[1].lignePosteNumero = 1
vJsonIn.lignePoste[1].lignePosteReference = "R1"
vJsonIn.lignePoste[1].lignePosteDenomination = "D1"
vJsonIn.lignePoste[1].lignePosteQuantite = 10
vJsonIn.lignePoste[1].lignePosteUnite = "lot"
vJsonIn.lignePoste[1].lignePosteMontantUnitaireHT = 50.000000
vJsonIn.lignePoste[1].lignePosteMontantRemiseHT = Null
vJsonIn.lignePoste[1].lignePosteTauxTva = "TVA5"
vJsonIn.lignePoste[1].lignePosteTauxTvaManuel = Null

vJsonIn.lignePoste[2].lignePosteNumero = 2
vJsonIn.lignePoste[2].lignePosteReference = "R2"
vJsonIn.lignePoste[2].lignePosteDenomination = "D2"
vJsonIn.lignePoste[2].lignePosteQuantite = 12
vJsonIn.lignePoste[2].lignePosteUnite = "Kg"
vJsonIn.lignePoste[2].lignePosteMontantUnitaireHT = 36.000000
vJsonIn.lignePoste[2].lignePosteMontantRemiseHT = Null
vJsonIn.lignePoste[2].lignePosteTauxTva = Null
vJsonIn.lignePoste[2].lignePosteTauxTvaManuel = 2.1

vJsonIn.lignePoste[3].lignePosteNumero = 3
vJsonIn.lignePoste[3].lignePosteReference = "R3"
vJsonIn.lignePoste[3].lignePosteDenomination = "D3"
vJsonIn.lignePoste[3].lignePosteQuantite = 16
vJsonIn.lignePoste[3].lignePosteUnite = "lot"
vJsonIn.lignePoste[3].lignePosteMontantUnitaireHT = 24.000000
vJsonIn.lignePoste[3].lignePosteMontantRemiseHT = Null
vJsonIn.lignePoste[3].lignePosteTauxTva = Null
vJsonIn.lignePoste[3].lignePosteTauxTvaManuel = 5

vJsonIn.lignePoste[4].lignePosteNumero = 4
vJsonIn.lignePoste[4].lignePosteReference = "xx"
vJsonIn.lignePoste[4].lignePosteDenomination = "xx"
vJsonIn.lignePoste[4].lignePosteQuantite = 1
vJsonIn.lignePoste[4].lignePosteUnite = "lot"
vJsonIn.lignePoste[4].lignePosteMontantUnitaireHT = 10.000000
vJsonIn.lignePoste[4].lignePosteMontantRemiseHT = Null
vJsonIn.lignePoste[4].lignePosteTauxTva = "TVA5"
vJsonIn.lignePoste[4].lignePosteTauxTvaManuel = Null

vJsonIn.montantTotal.montantHtTotal = 1326.000000
vJsonIn.montantTotal.montantTVA = 130.272000
vJsonIn.montantTotal.montantTtcTotal = 1406.272000
vJsonIn.montantTotal.montantRemiseGlobaleTTC = 50.000000
vJsonIn.montantTotal.motifRemiseGlobaleTTC = "Geste commercial"
vJsonIn.montantTotal.montantAPayer = 1400.000000



vJsonInStructure.structure.idStructure = 164679

vJsonInStructure.idService = 10285851
vJsonInStructure.idEspace = 24

vJsonInStructure.parametresAjouterEspace.pageResultatDemandee = 1
vJsonInStructure.parametresAjouterEspace.nbResultatsParPage = 10
vJsonInStructure.parametresAjouterEspace.triSens = "Ascendant"
vJsonInStructure.parametresAjouterEspace.triColonne = "ENUMERATION_A_RENSEIGNER"



MonJsonIn = VariantVersJSON(vJsonIn)
MonJsonInStructure = VariantVersJSON(vJsonInStructure)
//
// constitution de la chaîne d'authentification
//
User_MDP est une chaîne = user+":"+mdp
//on encode en base 64
auth_base64 est une chaîne = Crypte(User_MDP, "", compresseAucun + crypteAucun, encodeBASE64)
//on crée le HEADER
sHeaderAuth est une chaîne = ChaîneVersUTF8("Authorization: Basic "+auth_base64)
//
// Charger le certificat
//
ListeCertif est une chaîne = HTTPListeCertificat()
Certif est une chaîne = ExtraitChaîne(ExtraitChaîne(ListeCertif, 1, RC), 3, TAB)
HTTPCertificat(Certif)

// Lancement d'une requête sur un serveur sécurisé
ResLancement est un booléen = HTTPRequête(sURL,"",sHeaderAuth,MonJsonIn+RC+MonJsonInStructure,sTypeContenu)

// Si erreur rencontrée
SI ResLancement = VRAI ALORS
ResCode est une chaîne = HTTPDonneRésultat()
FIN

Cette fois ci il me dit :
les controles de coherences effectue sur la demande de paiement ne sont pas valides.

Je pense que ce poste va aider beaucoup de personne... Qui veulent utiliser Chorus dans leurs application...
Je vous remercie d'avance de votre aide.

--
Stéphane.
Membre enregistré
939 messages
Popularité : +66 (68 votes)
Posté le 13 décembre 2018 - 09:33
bonjour Stéphane,

alors pour votre première partie ce n'est pas deposerPDFFacture que vous utilisez, mais le dépôt d'un flux au format E1 UBL INVOICE, c'est un dire que Chorus s'attend à avoir un fichier XML structuré au format UBL de votre facture et non un PDF.

les URL pour deposerPDFFacture sont celles-ci :
URL de Production https://chorus-pro.gouv.fr:5443/service/factures/deposer/pdf
URL de Qualification https://chorus-pro.gouv.fr:5443/service-qualif/factures/deposer/pdf
=> https://communaute.chorus-pro.gouv.fr/deposer-pdf-facture/

du genre :
MonJsonIn est un Buffer
vJsonIn est un Variant

// URL Qualif
sURL est une chaîne="https://chorus-pro.gouv.fr:5443/service-qualif/factures/deposer/pdf"
// Constante
sTypeContenu est une chaîne="application/json"
//utilisateur
user est une chaîne="TECH_XXXXXXXXXXXXXXX@cpp2017.fr"
//mot de passe utilisateur
mdp est une chaîne="XXXXXXXXXXXXX"

_my_data est un chaîne=ChaîneVersUTF8(Remplace(Crypte(fChargeBuffer("c:\Chorus_Pro\F8091490.pdf"),"",compresseAucun+crypteAucun,encodeBASE64),RC,""))

// constitution du JSON
vJsonIn.fichierFacture=_my_data
vJsonIn.nomFichier="F8091490.pdf"
vJsonIn.formatDepot="PDF_NON_SIGNE"

MonJsonIn=VariantVersJSON(vJsonIn)


// constitution de la chaîne d'authentification
//
//on crée la chaine user:password
a_encoder est une chaîne=user+":"+mdp
//on encode en base 64
auth_base64 est une chaîne=Crypte(a_encoder,"",compresseAucun+crypteAucun,encodeBASE64)
//on crée le header
sHeaderAuth est une chaîne=ChaîneVersUTF8("Authorization: Basic "+auth_base64)

// Charger le certificat
ListeCertif est une chaîne=HTTPListeCertificat()
Certif est une chaîne=ExtraitChaîne(ExtraitChaîne(ListeCertif,1,RC),3,TAB)
HTTPCertificat(Certif)

// Lancement d'une requête sur un serveur sécurisé
ResLancement est un booléen=HTTPRequête(sURL,"",sHeaderAuth,MonJsonIn,sTypeContenu)


pour le second cas, il faudrait analyser, perso il me semble que j'avais effectué la ventilation de TVA que je ne vois pas dans votre exemple.
Car je pense que Chorus n'arrive pas à identifier à quoi correspond "TVA5".
Exemple :
vJsonIn.ligneTva[1].ligneTvaTauxManuel=20
vJsonIn.ligneTva[1].ligneTvaMontantBaseHtParTaux=590
vJsonIn.ligneTva[1].ligneTvaMontantTvaParTaux=118


de plus , votre total à payer est-il correct ?
car si vous avez :
vJsonIn.montantTotal.montantTtcTotal = 1406.272000
avec 50 € de remise TTC
et un total à payer de :
vJsonIn.montantTotal.montantAPayer = 1400.000000
çà me parait pas tout à fait carré...
Membre enregistré
939 messages
Popularité : +66 (68 votes)
Posté le 13 décembre 2018 - 09:37
je n'ai rien dit pour le total à payer,
je pense que le soucis viens juste de la ventilation de TVA que vous n'avez pas.

c'est l'exemple de Chorus c'est çà ?
Membre enregistré
87 messages
Posté le 14 décembre 2018 - 11:36
Bonjour,

Auriez-vous trouver lors de vos recherches pour "Déposer un flux facture", des illustrations où l'on trouverait par exemple un PDF ou image d'une facture type et le fichier XML au format E1_UBL_INVOICE associé?

Cela pourrait être très pratique pour bien comprendre à quoi correspond chaque élément du XML.

Merci.

--

NR
Membre enregistré
87 messages
Posté le 14 décembre 2018 - 11:39
Nicolas ROBIN a écrit :
Bonjour,

Auriez-vous trouver lors de vos recherches pour "Déposer un flux facture", des illustrations où l'on trouverait par exemple un PDF ou image d'une facture type et le fichier XML au format E1_UBL_INVOICE associé?

Cela pourrait être très pratique pour bien comprendre à quoi correspond chaque élément du XML.

Merci.

--

NR


Ce serait déjà très intéressant de retrouver les éléments obligatoires et facultatifs dans l'E1_UBL_INVOICE.
J'ai trouvé des documents où on le retrouve pour le flux "Soumettre une facture" mais pas pour E1_UBL_INVOICE.
Les termes peuvent êtres proches et j'ai un peu peur de me tromper avec la traduction.

--

NR
Membre enregistré
87 messages
Posté le 14 décembre 2018 - 11:53
Il y a déjà ce document qui s'avèretrès pratique (en traduisant la page;)):
http://www.datypic.com/sc/ubl20/e-ns19_Invoice.html


Les éléments ne commençant pas par [0...] sont obligatoires (commençant donc soit par 1 ou *).

--

NR
Posté le 04 avril 2019 - 14:48
Bonjour,

Je suis aussi en train de batailler pour arriver à déposer des factures via API... ;(

Voici ce que je fais :

VL_JSONParamEnt est un JSON <Description="DeposerFluxFacture_input">
VL_ResultAPI est un JSON <Description="DeposerFluxFacture_output">
VL_URL est une chaîne = VGP_URL_Base + "/factures/deposer/flux"
VL_RestReq est une restRequête
VL_RestRéponse est une restRéponse

Sablier(Vrai)

VL_JSONParamEnt.idUtilisateurCourant = Z_IDUTIL
VL_JSONParamEnt.fichierFlux = Encode("C:\Mes projets\Chorus_Pro\Exe\FACTURES\FSO1100A_P01",encodeBASE64)
VL_JSONParamEnt.nomFichier = V_Archive
VL_JSONParamEnt.syntaxeFlux = "IN_DP_E1_UBL_INVOICE"
VL_JSONParamEnt.avecSignature = Faux

//Construction de la base de la requête REST
VL_RestReq.URL = VL_URL
VL_RestReq.Méthode = httpPost
VL_RestReq.ContentType = "application/json"
VL_RestReq.Contenu = VL_JSONParamEnt
//Header de sécurité de la requête REST
VL_RestReq.Utilisateur = VGP_MailTech
VL_RestReq.MotDePasse = VGP_MDPTech
VL_RestReq.CertificatClient = VGP_Certif
VL_RestReq.MotDePasseCertificatClient = VGP_MDPCertif

VL_RestRéponse = RESTEnvoie(VL_RestReq)
SI ErreurDétectée ALORS
Erreur(ErreurInfo(errComplet))
RETOUR
FIN

VL_ResultAPI = VL_RestRéponse.Contenu

Info(VL_ResultAPI)


Dans ce cas, je reçoit une erreur 500 me disant :
{"codeRetour":500, "libelle":"500 - Impossible de recuperer la reponse provenant du webservice deposerFluxFacture."}

Quelqu'un peut-il m'expliquer ce que je fais de mal svp ???
Merci par avance pour votre aide ! :D
Posté le 04 avril 2019 - 15:24
Bon ben je me réponds moi-même...
Je cherche depuis hier, et je trouve la solution 5 minutes après avoir posté !

au lieu de :

VL_JSONParamEnt.nomFichier = V_Archive


il fallait mettre :

VL_JSONParamEnt.nomFichier = "C:\Mes projets\Chorus_Pro\Exe\FACTURES\FSO1100A_P01.xml"


L'extension est obligatoire dans nomFichier (et non dans fichierFlux où là il faut l'enlever...)

Je me remercie à moi pour ma réponse à mon problème du coup ! :p
Membre enregistré
161 messages
Popularité : -1 (1 vote)
Posté le 04 avril 2019 - 16:38
:merci:

--
Stéphane.
Posté le 27 août 2019 - 15:38
Avez vous réussi a déposer vous même un flux de factures?
Moi je galère un peu et songe à passer par un prestataire.
Membre enregistré
4 messages
Posté le 01 mars 2024 - 15:24
Bonjour

avez vous tenté avec un fichier pdfA3 de type FacturX, qui contient un xml donc ?

soit sFacture_PDF_A3 = "C:\Chorus_Pro\Mafacture.pdf"
ParametreEntree.fichierFlux = Encode(Remplace(sFacture_PDF_A3, ".pdf", "") ,encodeBASE64)

ParametreEntree.idUtilisateurCourant = 1

ParametreEntree.nomFichier = sFacture_PDF_A3
ParametreEntree.syntaxeFlux = "IN_DP_E1_UBL_INVOICE"

Moi cela me retourne erreur 403

enfin comment avez vous trouvé l'Id de l'utilisateur contenu dans votre variable Z_IDUTIL car sur le site de Chorus impossible de le trouver

Merci
Membre enregistré
4 messages
Posté le 01 mars 2024 - 16:25
je viens de trouver !
soit sFacture_PDF_A3 = "c:\Mafacture.pdf"

ParametreEntree est un JSON
ParametreEntree.avecSignature = False
ParametreEntree.fichierFlux = Encode(fChargeBuffer(sFacture_PDF_A3) ,encodeBASE64SansRC)
ParametreEntree.nomFichier = fExtraitChemin(sFacture_PDF_A3, fFichier+fExtension)
ParametreEntree.syntaxeFlux = "IN_DP_E2_CII_FACTURX"