PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Chorus
Chorus
Débuté par Stéphane D., 23 aoû. 2018 15:34 - 20 réponses
Membre enregistré
161 messages
Popularité : -1 (1 vote)
Posté le 23 août 2018 - 15:34
Bonjour à tous,
Je recherche de l'aide pour utilise les API de Chronus.
J'explique ma demande :
Je voudrais envoyer une facture, et voici leur documentation :
https://communaute.chorus-pro.gouv.fr/deposer-flux-facture/

Comment faire pour utiliser : https://chorus-pro.gouv.fr:5443/service-qualif/factures/deposer/flux
sachant qu'il faut passer les valeur qui suit : utilisateur, mdp, certificat et facture.

Merci d'avance de votre aide.

--
Stéphane.
Membre enregistré
2 566 messages
Popularité : +222 (260 votes)
Posté le 23 août 2018 - 16:26
Bonjour,

Il faut utiliser httpRequête

--
Cordialement,

Philippe SAINT-BERTIN
Membre enregistré
161 messages
Popularité : -1 (1 vote)
Posté le 24 août 2018 - 11:27
Bonjour Philippe,
Merci pour cette réponse, et j'ai bien utilisé cela mais où j'appelle mon certificat.
sUrl est une chaîne

SI EnModeTest() = Vrai ALORS
sUrl = URLEncode("https://chorus-pro.gouv.fr:5443/service-qualif/factures/deposer/flux")
SINON
sUrl = URLEncode("https://chorus-pro.gouv.fr:5443/service/factures/deposer/flux")
FIN


ErreurHTTP est une chaîne
sNomUser est une chaîne = "login"
sPwdUser est une chaîne = "mdp"
sXMLRetour est une chaîne

SI httpRequête(sUrl,"","","","",sNomUser,sPwdUser) ALORS
sXMLRetour = HTTPDonneRésultat(httpRésultat)
SINON
ErreurHTTP = HTTPDonneRésultat(httpEntête)
Erreur(ErreurHTTP)
FIN

Merci d'avance.

--
Stéphane.
Posté le 12 septembre 2018 - 09:11
Bonjour Stéphane,

J'ai mis une réponse que j'espère complète dans la discussion https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/200909-chorus-portail-pro-2017-applications-220404/read.awp…

Pour répondre précisément à la question
//
// Charger le certificat
//
ListeCertifest une chaîne=HTTPListeCertificat()
Certifest une chaîne=ExtraitChaîne(ExtraitChaîne(ListeCertif,1,RC),3,TAB)
HTTPCertificat(Certif)


Je suppose ici qu'il n'y a qu'un seul certificat installé, sinon, il rechercher le bon avec dans la première "colonne" de ListeCertifest

Bon courage.
Membre enregistré
161 messages
Popularité : -1 (1 vote)
Posté le 20 septembre 2018 - 12:07
Salut Zagvier,
Merci pour cette réponse, j'attends mon certificat pour commencer à faire des tests car sans on ne peux rien faire...

--
Stéphane.
Membre enregistré
87 messages
Posté le 21 novembre 2018 - 12:31
Zagvier a écrit :
Bonjour Stéphane,

J'ai mis une réponse que j'espère complète dans la discussionhttps://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/200909-chorus-portail-pro-2017-applications-220404/read.awp…

Pour répondre précisément à la question
//
// Charger le certificat
//
ListeCertifestune chaîne=HTTPListeCertificat()
Certifestune chaîne=ExtraitChaîne(ExtraitChaîne(ListeCertif,1,RC),3,TAB)
HTTPCertificat(Certif)


Je suppose ici qu'il n'y a qu'un seul certificat installé, sinon, il rechercher le bon avec dans la première "colonne" de ListeCertifest

Bon courage.




Bonjour Zagvier,
Merci pour ces informations précieuses
.
Auriez-vous par hasard des exemples à nous fournir pour un flux d'émission et un flux de réception?

Exemples:
- Utilisant le service API "Factures simples --> Factures à émettre --> Déposer flux facture"
- Utilisant le service API "Factures simples --> Récupérer information facture --> Consulter historique facture"

Existe-t-il un moyen de tester que l'API est bien accessible avant d'envoyer une commande quelconque?
- Doit-on juste initier la connexion au démarrage de notre application?
- Doit-on le faire avant d'envoyer chaque commande?

Merci.

--

NR
Membre enregistré
939 messages
Popularité : +66 (68 votes)
Posté le 21 novembre 2018 - 13:47
Bonjour,

Nicolas ROBIN a écrit :
Existe-t-il un moyen de tester que l'API est bien accessible avant d'envoyer une commande quelconque?
- Doit-on juste initier la connexion au démarrage de notre application?
- Doit-on le faire avant d'envoyer chaque commande?


Non, c'est un système de requête, donc à chaque requête, si la plateforme Chorus n'est pas disponible vous aurez un retour d'erreur sur votre HTTPRequete()



Nicolas ROBIN a écrit :
Auriez-vous par hasard des exemples à nous fournir pour un flux d'émission et un flux de réception?

Exemples:
- Utilisant le service API "Factures simples --> Factures à émettre --> Déposer flux facture"
- Utilisant le service API "Factures simples --> Récupérer information facture --> Consulter historique facture"


Dépôt d'un Flux, pour déposer plusieurs factures d'un coup, il faut compresser vos fichiers et envoyer le fichier compressé à la place.
Une fois votre flux déposé, il vous faudra aller consulter son 'Statut' , soit Rejeté, Intégré partiellement , Intégré ou en attente de traitement.
( en allant consulter le CR Détaillé d'un flux , il faudra analyser le contenu des erreurs dans le cas d'un rejet ou d'une intégration partielle )

Voici un mini bout de code pour le dépôt d'un Flux de Facture :
// Identifiant de votre compte Technique Chorus-Pro
_url_login est une chaîne="TECH_000000000000000@cpp2017.fr"
_url_password est une chaîne="motdepasse"

_auth_base64 est une chaîne=Remplace(Crypte(_url_login+":"+_url_password,"",compresseAucun+crypteAucun,encodeBASE64),RC,"")
_http_header_auth est une chaîne=ChaîneVersUTF8("Authorization: Basic "+_auth_base64)
_http_exec est un booléen
_lst_Certif est une chaîne=HTTPListeCertificat()
_certificat_utilise est une chaîne=ExtraitChaîne(ExtraitChaîne(_lst_Certif,1,RC),3,TAB)
_type_data est une chaîne="application/json"

// URL Chorus-Qualifaction pour le dépot de flux
_url_Chorus est une chaîne="https://chorus-pro.gouv.fr:5443/service-qualif/factures/deposer/flux"" "

HTTPCertificat(_certificat_utilise)

_variant_emission est un Variant
_variant_reception est un Variant
_json_data est une chaîne


_variant_emission.syntaxeFlux="IN_DP_E1_UBL_INVOICE" // Type de fichier déposé
_variant_emission.nomFichier="MONFICHIER.XML" // Nom du fichier déposé , dans le cas d'un lot de facture il s'agira d'un fichier .tar.gz
_variant_emission.fichierFlux=ChaîneVersUTF8(Remplace(Crypte(fChargeBuffer(SysRep(srBureau)+["\"]+"MONFICHIER.XML"),"",compresseAucun+crypteAucun,encodeBASE64),RC,""))
_variant_emission.avecSignature=Faux

_json_data=VariantVersJSON(_variant_emission)

_http_exec=HTTPRequête(_url_Chorus,"",_http_header_auth,_json_data,_type_data)
SI _http_exec=Faux ALORS
Erreur(ErreurInfo(errComplet))
SINON
// Exécution Ok
_variant_reception=JSONVersVariant(HTTPDonneRésultat())
SI _variant_reception.codeRetour=0 ALORS
// Dépôt de flux OK
Info("Ok numéro de dépôt de Flux Chorus : "+_variant_reception.numeroFluxDepot)
SINON
Erreur("Erreur de code : "+_variant_reception.codeRetour)
FIN
FIN


Pour consulter l'historique d'une facture, il vous faudra son Identifiant Chorus.
C'est le même principe que le bout de code ci-dessus, en modifiant simplement votre JSON comme indiqué sur la documentation Chorus :
=> https://communaute.chorus-pro.gouv.fr/consulter-historique-facture/

Bon dèv
Membre enregistré
939 messages
Popularité : +66 (68 votes)
Posté le 21 novembre 2018 - 13:51
Membre enregistré
87 messages
Posté le 21 novembre 2018 - 15:24
Merci Christophe pour ces informations très claires.

Nous avons commandé notre certificat ce jour.
Je testerai cela dès que possible.
En attendant, je vais poursuivre l'avancée de mon développement à partir des spécifications externes API.

Savez-vous s'il existe un moyen en Windev de s'assurer que le port nécessaire au service API (5443) est ouvert et si le proxy laisse passer l'url Chorus?
J'ai vu des informations au sujet de SocketConnecte.
J'ai voulu faire le test suivant mais sans résultat probant:
Le test a été effectué avec l'URL "https://chorus-pro.gouv.fr", aussi en y ajoutant "/service", ou "/service-qualif" et même le chemin complet d'un service.

FONCTION PRIVÉ PRIVE__PortOuvert()
resultat est un booléen

sUrl_Hote est une chaîne
nPort est un entier

//--TEST--
sUrl_Hote ="https://chorus-pro.gouv.fr"
nPort =5443

//Pour tester le port CHORUS et voir si il est ouvert.
SI SocketConnecte("Serveur",nPort,sUrl_Hote) ALORS // Là c'est bon..
Trace("Port "+nPort+" ouvert")
SocketFerme("Serveur")
resultat=Vrai

SINON // Connexion de socket ne marche pas
resultat=Faux
Erreur("Erreur de connexion","",ErreurInfo(errMessage))
FIN

//On retourne VRAI si l'on a trouvé un certificat Valide
RENVOYER resultat


L'erreur suivante en découle:
La socket n'a pas pu être initialisée correctement.
La connexion au serveur  sur le port <5443> a échoué.
Détail de l'erreur système : Hôte inconnu.


A savoir que pour l'instant, ces essais ont été réalisés sans certificat.
J'ai tenté malgré tout puisque je n'utilisais pas encore les requêtes au service.

Merci

--

NR
Membre enregistré
87 messages
Posté le 21 novembre 2018 - 15:27
Christophe a écrit :


Oui, ce PDF associé à la doc en ligne pour chaque service sont très complémentaires et indispensables pour le développement de l'interface Chorus service API. Je les consulte au quotidien.

Merci.

--

NR
Membre enregistré
87 messages
Posté le 21 novembre 2018 - 16:15
Bonjour,

Pour information, cela pourra vous intéresser.
La procédure suivante me permet de m'assurer que l'hôte Chorus Pro est accessible pour le port donné:

FONCTION PortOuvert()
resultat est un booléen

sUrl_Hote est une chaîne
sUrl_Hote_Courte est une chaîne
sIP_Hote est une chaîne
nPort est un entier

//--TEST--
sUrl_Hote ="https://chorus-pro.gouv.fr"
sUrl_Hote_Courte =Remplace(sUrl_Hote,"https://","")
sIP_Hote =NetAdresseIP(sUrl_Hote_Courte)
nPort =:m_nPort

resultat=Faux

//Pour tester le port CHORUS et voir si il est ouvert pour accéder à l'hôte chorus.
SI SocketConnecte("Serveur",nPort,sIP_Hote) ALORS
resultat=Vrai
FIN

SI resultat ALORS
Trace("Port "+nPort+" ouvert")
SocketFerme("Serveur")
SINON
// Connexion de socket ne marche pas
Erreur("Erreur de connexion","",ErreurInfo(errMessage))
FIN

//On retourne VRAI si l'on a trouvé un certificat Valide
RENVOYER resultat


--

NR
Membre enregistré
1 623 messages
Popularité : +100 (114 votes)
Posté le 22 novembre 2018 - 10:00
Bonjour,

Apparemment la version 24 intégrera l’interconnexion avec Chorus pro
Membre enregistré
87 messages
Posté le 28 novembre 2018 - 15:06
Bonjour Christophe,

Dans votre exemple, vous transmettez donc un fichier "MONFICHIER.XML".

Pour mes essais, j'ai voulu commencer par utiliser un des fichiers exemples fournis par la communauté (https://communaute.chorus-pro.gouv.fr/documentation/exemples-de-flux/): fichier "FSO1100-P24.xml" ("IN_DP_E1_UBL_INVOICE").

Utilisez-vous la sérialisation/désérialisation pour vos fichiers XML?
De quelle manière vous y êtes vous pris?
Vous avez importé un modèle XML qui vous sert à déclarer un xmlDocument en indiquant votre modèle pour Description?

Je suppose que la plateforme CHORUS attend de recevoir ses XML avec les éléments en "[préfixe]:" ("cac:", "cbc:", etc.) pour s'assurer du bon format du XML reçu.


Avez-vous éventuellement un exemple d'affectation de vos données de factures pour génération du XML?

Merci

--

NR
Membre enregistré
939 messages
Popularité : +66 (68 votes)
Posté le 28 novembre 2018 - 15:54
bonjour Nicolas,

Nicolas ROBIN a écrit :
Bonjour Christophe,

Dans votre exemple, vous transmettez donc un fichier "MONFICHIER.XML".

Pour mes essais, j'ai voulu commencer par utiliser un des fichiers exemples fournis par la communauté (https://communaute.chorus-pro.gouv.fr/documentation/exemples-de-flux/): fichier "FSO1100-P24.xml" ("IN_DP_E1_UBL_INVOICE").

Utilisez-vous la sérialisation/désérialisation pour vos fichiers XML?


=> NON

Nicolas ROBIN a écrit :
> De quelle manière vous y êtes vous pris?

=> J'ai simplement développé un petit export XML UBL de nos factures, à minima avec les exemples Chorus.

Nicolas ROBIN a écrit :
Vous avez importé un modèle XML qui vous sert à déclarer un xmlDocument en indiquant votre modèle pour Description?


=> Non, l'import du XSD UBL ne fonctionne pas actuellement sous Windev, il se plante après un certain temps...

Nicolas ROBIN a écrit :
Je suppose que la plateforme CHORUS attend de recevoir ses XML avec les éléments en "[préfixe]:" ("cac:", "cbc:", etc.) pour s'assurer du bon format du XML reçu.


Avez-vous éventuellement un exemple d'affectation de vos données de factures pour génération du XML?


il y a un post avec quelques petits exemples de génération XML UBL ici :
=> https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/222153-chorus/read.awp…


bon dèv ;)
Message modifié, 28 novembre 2018 - 15:55
Membre enregistré
87 messages
Posté le 14 décembre 2018 - 10:42
Bonjour,
Lors du premier appel de HTTPRequête(...) depuis le lancement de notre EXE, une confirmation du certificat est demandée.

Sécurité Windows

Confirmer le certificat

Le site chorus-pro.gouv.fr a besoin de vos informations d'identification:
...
OK / Annuler

Connaissez-vous une manière d'automatiser la réponse OK?

Même si ce n'est qu'une fois, j'ai un peu peur que l'utilisateur ne fasse pas attention, ne confirme pas le certificat (clic sur la croix, ou Annuler) où que la fenêtre soit affichée derrière et qu'il pense à tort à un dysfonctionnement de notre application.

Pour information, dans "Internet Explorer" > "Options Internet" > "Avancé", les options "Vérifier la révocation des certificats de l'éditeur" et "Vérifier la révocation du certificat serveur*" sont bien décochées.

Merci
Cordialement,

--

NR
Membre enregistré
87 messages
Posté le 20 décembre 2018 - 14:48
Bonjour,

Lorsque que l'on fait un "Dépôt Flux Facture" xml ou tar.gz, on a un retour de l'état du flux (rejeté, intégré, etc.) avec "Consulter CR détaillé".

Par contre, qu'il soit rejeté ou intégré, peut-on retrouver dans le portail CHORUS ou via un service API, les informations de chaque facture contenue dans le flux?

Les services qui auraient pu m'intéresser demande un idFacture technique CPP (entier) mais pour un flux, j'arrive à en récupérer le numéroDépotFlux mais pas l'idFacture de chaque facture du flux. Sur le portail, on ne retrouve pas non plus les factures de notre flux dans factures émises?
On a aucun moyen de retrouver les factures provenant d'un flux dans Chorus?

Merci.
Cordialement,

--

NR
Posté le 14 novembre 2019 - 15:01
Bonjour Nicolas,

Avez-vous trouvé un moyen de récupérer la facture à partir d'un flux envoyé?

Merci!
Cordialement,
Membre enregistré
87 messages
Posté le 14 novembre 2019 - 16:32
Bonjour,

Pour ma part, je combine en utilisant les 2 API suivantes:

Consulter_CR_detaille (en passant le n° de flux en entrée)


Via le n° de flux, on peut retrouver un flux envoyé (qui serait présent dans la rubrique "Suivi des flux" du portail CHORUS)

Si je me souviens bien des problèmes rencontrés lors du développement, il ne permettait pas de retourner les factures du flux qui ont été intégrées mais par élimination, on pouvait les déterminer vu qu'il nous retourne celles qui ne l'ont pas été. Le tout est de mémoriser lors de l'envoi du flux, la liste des numéros de factures qu'il contenait lors de l'envoi.





Rechercher_facture_par_fournisseur (en passant le n° de facture en entrée)


Via le n° de facture, on peut retrouver une facture intégrée (qui serait présente dans la rubrique "Facture émise" du portail CHORUS)
Par contre, si elle a été transmise via un flux, le retour ne renvoie pas ce numéro de flux.
La seule façon que j'avais trouvée à l'époque était de combiner avec ce que j'ai évoqué au-dessus via "Consulter_CR_detaille" en déduisant la liste des facture non rejetées...

--

NR
Membre enregistré
161 messages
Popularité : -1 (1 vote)
Posté le 14 novembre 2019 - 17:04
Merci Nico d'avoir complété le poste.

--
Stéphane.
Membre enregistré
87 messages
Posté le 14 novembre 2019 - 18:09
Pour trouver les annexes API à jour, passez par:
https://communaute.chorus-pro.gouv.fr/documentation/specifications-externes/

puis la rubrique:
Annexe API


De façon générale, on trouve toutes les informations dont on a besoin dans ce document.
Vous trouverez aussi, l'URL du webservice associé à chaque fonction API et des exemples des données d'entrées et sorties JSON pour chaque fonction API, ici:
https://communaute.chorus-pro.gouv.fr/documentation/api/

Attention, les JSON ne sont donnés qu'à titre d'exemple. J'ai pu constater qu'ils ne sont pas tenus à jour.
Il arrive qu'ils comportent des erreurs et ils n'utilisent pas toutes les variables d'entrée/sortie.
Pour avoir la liste complète et à jour des données d'entrée/sortie de vos JSON et leur caractère obligatoire ou non, il faut aller chercher ses informations dans la spec. externe "Annexe API" évoquée plus haut.

--

NR
Posté le 15 novembre 2019 - 11:04
Merci beaucoup, Nicolas d'avoir clarifié le processus et pour des informations sur la documentation!

Ma situation est un peu plus compliquée, car je joue le rôle d'intermédiaire.

Mon flux contiendra une seule facture d'un fournisseur client.
Donc, pour trouver le statut de la facture (et non le flux),
j'imagine que je devrai demander l'accès à la zone "Factures émises" du fournisseur sur le portail ChorusPro, pour pouvoir ensuite effectuer la recherche à l'aide de l'appel "Rechercher_facture_par_fournisseur", en passant en paramètre de recherche code fournisseur et numéro de facture.

Pour le moment, je n'ai simulé le processus que sur le portail de qualification.
Dès que j'aurai les certificats, je procéderai aux tests avec l'API.

Bonne journée,

Jeanne