|
FORUMS PROFESSIONNELS WINDEV, WEBDEV et WINDEV Mobile |
| | | | | |
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é 940 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é 940 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
VL_RestReq.URL = VL_URL VL_RestReq.Méthode = httpPost VL_RestReq.ContentType = "application/json" VL_RestReq.Contenu = VL_JSONParamEnt
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 ! |
| |
| |
| | | |
|
| | |
| |
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 ! |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 161 messages Popularité : -1 (1 vote) |
|
Posté le 04 avril 2019 - 16:38 |
-- 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" |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|