Connecteur viasanté - ag2r la mondiale

Bonjour à tous,

Je me suis lancé dans la création d’un connecteur pour la mutuelle ViaSanté - AG2R La Mondiale.

Il est disponible ici : https://github.com/lotooo/cozy-konnector-viasante

Je suis ouvert à toute remarque et amélioration, c’est mon premier connecteur, ma première experience javascript et je ne suis pas vraiment développeur à la base, donc je pense qu’il y a surement pas mal d’axe d’amélioration.

J’imagine qu’il doit y avoir un peu de review du code avant un passage dans les étapes suivantes.

Merci !

Loto

Bonsoir @lotooo,

Bienvenue à bord et merci beaucoup :smile:

Je préviens notre équipe technique qui va aller regarder ça et te fera ses retours très vite.

Salut @lotooo

Super boulot, je vais pouvoir t’accompagner jusqu’à la publication.

Aprés relecture, voila ce que j’ai compris des documents importés, est ce correct ?
Dans un premier temps tu importes des courriers via le tableau ‘documents’

  • Y a t il des remboursements, des attestations dans ces courriers ?
  • C’est bien de les récupérés, tu as utilisé saveFiles exactement comme il fallait.
  • Peut être pourrait-on rajouter la string ‘Courrier’ dans le filename aprés le vendor pour que ce soit clair si c’est de la correspondance.

Dans un second temps, tu fetches une api pour obtenir des remboursements et en faire des bills

  • Sauf erreur, tu n’ajoutes pas de fichier à la bill, hors normalement on essaie d’attacher un fichier(le décompte de remboursement) à chaque bills.
    Tu as accés au PDF de remboursement ? Est ce que tu penses que c’est possible de les lier ?
    saveBills les téléchargera, si tu ajoutes l’attribut fileurl comme le fait saveFiles

Ce point est important car c’est inhabituel d’ajouter des bills sans fichiers. Il n’existe pas aujourd’hui d’application dédiéé pour visualiser les bills brutes. Le principal intérêt est de pouvoir faire correspondre une dépense dans un compte bancaire à un fichier pdf correspondant à la facture, (ou dans notre cas un remboursement à un décompte)

Qu’en dis tu ?

Sinon d’un point de vue plus algorithmique,
Je te déconseille l’écriture contracts.forEach(async function { que tu utilises plusieurs fois
De mémoire, elle n’est pas asynchrone. Il va lancer en parallèle les n fonctions sur tes n contracts
Afin de limiter la charge, on préfère garder tout synchrone et itératif.
Tu peux faire un
for (contract of contracts) { await mafonction

Idem, on préfère constituer un tableau de bills et faire qu’un envoit vers saveBills. Mais c’est moins important.

J’ai relevé des petites modifs à faire, je t’en ferais une liste exhaustive plus tard, par exemple
(L37 héritée du template à supprimer, fichier src/zombie.js inutile, tu peux le supprimer)

A +

Lucas

1 Like

Hello,

Merci pour le retour !
Je vais regarder pour faire les modifs de code cette semaine.

Pour la logique de leur api, oui ce que je download c’est les PDFs avec la liste des remboursements qui ont été fait pendant une periode donné – c’est le courrier recapitualtif du mois --, mais je n’ai pas moyen d’être sûr que ces remboursements du mois ont été fait en une seul fois (et donc que le montant en bas du PDF, correspond vraiment à une ligne dans un relevé bancaire).

Je vais regarder sur les 6 mois de mes remboursements à moi si ca correspond.

Merci encore.

1 Like

Hello,

J’ai essayé de suivre tes conseils.

Peut être pourrait-on rajouter la string ‘ Courrier ’ dans le filename aprés le vendor pour que ce soit clair si c’est de la correspondance.

Fait

Je te déconseille l’écriture contracts.forEach(async function { que tu utilises plusieurs fois
De mémoire, elle n’est pas asynchrone. Il va lancer en parallèle les n fonctions sur tes n contracts
Afin de limiter la charge, on préfère garder tout synchrone et itératif.
Tu peux faire un
for (contract of contracts) { await mafonction

Fait (enfin surtout le remplacement de forEachpar for et la non utilisation de async)

Idem, on préfère constituer un tableau de bills et faire qu’un envoit vers saveBills. Mais c’est moins important.

Fait

(L37 héritée du template à supprimer, fichier src/zombie.js inutile, tu peux le supprimer)

Fait

Concernant la logique de viasanté, je n’ai pas encore de moyen sûr d’associer un paiement avec un document (mais il semblerait que chaque PDF soit l’ensemble des paiements des 30 jours precedant l’envoi du courrier, donc j’ai peut-être moyen de les faire matcher).

J’ai des questions concernant le code.

Il semblerait que lorsque j’extrait les paiements, je me retrouve avec des HTTP/401 de viasanté, je voudrais donc me re-authentifier pour refraichier mon cookie. SI je deplace mon authentification dans une fonction, que doit retourner ma fonction pour que je puisse utiliser le même cookie jar dans le reste du module ? Tout à l’air de se passer de facon magique en utiliser la fonction signin (https://docs.cozy.io/en/cozy-konnector-libs/api/#signin) mais dans mon cas, je peux directement faire un POST mais je ne sais pas ce que la fonction doit renvoyer.

Merci encore !

Salut,

Super.

Je suis pas sur que te ré-authentifié soit la solution à ton problème de 401.
Néanmoins, fait ton POST avec l’objet request (instance de requestFactory, comme dans ton code)
Les cookies seront mis à jour, à chaque requête, (si jar: true bien sur, tes lignes 20 & 21).
Donc si tu veux essayer de te reloguer en cours de process, tu peux tel quel.

Donc d’expérience, je vois 2 possibilités probables à ton souci.

  1. Il manque un header nécéssaire.
    Le plus souvent, c’est ca. Il y a un header spécifique soit constant (facile, il suffit de le trouver) soit variable.
    Je te propose une méthode pour le savoir.
    Faire le téléchargement dans ton navigateur et fait F12 pour avoir le mode dev et enregistré les échanges.
    Trouver la requête qui télécharge le fichier et faire un ‘copy as Curl’ via le clic droit.
    Dans un terminal, tu rejoues la requête, (ajoute -v pour avoir le status du résultat) si tout est ok.
    En grignotant les headers un par un, ou par dichotomie, tu vas pouvoir trouver celui qui est nécéssaire.

On a déja vu des erreurs comme ca, pour un Accept-Language pas défini, ou un Accept peut tolérant.

  1. Chose moins probable c’est que lien de téléchargement soit valable uniquement sur une page précise.
    Sur des sites complexes, on a déja vu des comportements de ce style. Si tu changes de pages de factures, alors les liens que tu viens de récupérer pour les passer à saveBills quelques requêtes plus tard, ne sont plus valides.
    Si tu n’as pas ce comportement en faisant un saveFiles/Bills par fichier, alors tant pis, fait le à chaque fois.
    Tu parcours des contrats, typiquement ca pourrait être ca, mais tu fais déja un saveFiles par contrat je crois.

Qu’est ce que tu en penses ? Hésites pas à me fournir des détails si tu as toujours cette 401. J’essaierais d’être réactif.

Lucas

J’ai finalement trouvé (grâce à Copy as curl) ca n’etait pas un soucis de Header mais des paramètres qui étaient passés dans l’URL. Pas sur de comprendre pourquoi ca marcahit pour certains paiements et pas d’autres mais en tout cas c’est reglé.

Je me penche maintenant sur le match paiement -> document.

Question concernant Cozy et les dépenses de santé: Ici dans le cadre de cette mutuelle, je n’ai aucun moyen de faire matché ce remboursement avec une depense de medecin/medicament, mais je recupère la dépense, le remboursement sécu et le remboursement mutuelle. Est ce que ces infos suffisent à Cosy pour comprendre que ma depense chez le medecin X est remboursé par ameli.fr + la mutuelle ?

1 Like

Parfait.

Est ce que tu as une date pour le remboursement, c’est nécessaire, ? Normalement, on devrait pouvoir au moins matcher le virement du remboursement.

Tu dois pouvoir construire une bills assez complète.
Je te pointe cette doc https://docs.cozy.io/en/cozy-doctypes/docs/io.cozy.bills/
Et cet exemple https://github.com/konnectors/lamutuellegenerale/blob/4906165035e05c9fd57b9465eaf18910804c50ee/src/index.js#L166

Si tu as un doute sur un champ, dit moi.

Lucas

J’ai réussi à faire le match entre un paiement et un document.

Je passe donc mon filename, fileurl et requestOptions au saveBills.

Comme j’ai plusieurs paiements qui renvoient vers le même document, il m’envoie bouler :

cozy-client-js-stub: debug : File /home/loto/Scripts/cozy-konnector-viasante/data/27609781/2019-10-24_courrier_viasante_22029229.pdf created
/home/loto/Scripts/cozy-konnector-viasante/node_modules/lodash-id/src/index.js:49
    if (d) throw new Error('Insert failed, duplicate id') 

Est ce que j’ai un moyen de faire pointer plusieurs bills sur le même doc ou bien faut il que je lui donne un filename different obligatoirement ?

Oui tu peux faire plusieurs bills avec le même fichier sans problème
saveBills va gérer automatiquement ce cas.

Est ce que ce n’est pas plutôt des tests antérieurs qui provoque ce conflit ? (yarn clean ou bien supprimer le dossier data avant le lancement pour nettoyer en mode standalone)

1 Like

Ah bah non il semblerait que c’était juste une error dans le contractId. Je viens aussi de mettre le bon format de date dans le saveBills et tout à l’air de rouler proprement localement !

et mon yarn dev fonctionne aussi !

Hello,

Quelle est la suite pour tester sur un vrai cozy (le mien ?) et envoyer ca dans le store officiel.

Matt

Je te propose de me transmettre le repo sur mon profil (LucsT) afin que je puisse le transférer sur l’organisation konnectors sur github. Je te recrédite des droits en écriture immédiatement après.

Dés que c’est fait, j’attaque le packaging (ajout de travis et autres) sur le repo et je te sors une version béta.
Ensuite, je l’installe sur ton cozy. (envoie moi le lien par mail ou message si ce n’est pas lotooo.mycozy.cloud)
Je vais aussi réclamer à un collègue si possible un beau svg optimisé pour l’icone.

Je me posais la question du nom du connecteur, viasante (pour le slug) ca me parait pas mal. Pour le nom dans le store, ‘name’, je pensais à Viasanté. On oublie donc complètement le terme ag2r.
Qu’en penses tu ? Cet marque semble bien connue des utilisateurs, elle est mise avant sur le site, ca me parait cohérent.

Lucas

1 Like

Normalement si tu utilises Cozy et veut utiliser ce connecteur, tu connais déjà le nom de ta propre mutuelle, donc je pense en effet q’enlever AG2R la Mondiale du titre fait beaucoup de sens ^^

Le connecteur est bien arrivé ici. Tu as des droits ‘Write’

Je m’occupe du packaging dans la journée.

Penses à changer le chemin du repo dans ton .git/config , sinon git te le rappellera au prochain push/pull

Re, le packaging a bien avancé, mais le build reste bloqué car le linter hurle à la mort.

https://travis-ci.com/konnectors/viasante

C’est principalement des non définitions de variables. (On aime bien avoir des variables clairement déclarées ‘const var=’ ou ‘let var =’)

Est ce que tu peux t’en occuper ? Tu peux faire le check avec ‘$ yarn lint’.
Je veux bien que tu m’envoies le détail des fichiers importés en privé pour avoir une idée générale des noms de fichiers.
J’ai pas vu de problème sur les attributs de bills, super boulot, il y a la regExp bancaire.
Je me demande si le ‘courrier’ n’est pas de trop finalement, dans les filename des pdfs de bills, ca parait bizarre. Comment se présente les pdfs de remboursement ? C’est un style courrier ou pas du tout ?

Si tu le souhaites, tu peux commiter directement dans la branche release-1.0.0. Sinon je mergerais.

Je viens de t’envoyer un des PDF par mail.

Je m’occupe de fixer le yarn lint

Je ne sais pas trop comment fixer les derniers warning.

Il se plaint de

/home/loto/Scripts/cozy-konnector-viasante/src/index.js
  104:13  error  'real_document_date' is assigned a value but never used  no-unused-vars
  108:13  error  'real_document_date' is assigned a value but never used  no-unused-vars
  113:32  error  'real_document_date' is not defined                      no-undef
  150:26  error  'real_document_date' is not defined                      no-undef

Mais la variable est utilisée :

  1. Dans un log, il y a une meilleure facon de concatener la string ?
        'debug',
        `Real document date: ${real_document_date} versus ${
          document['dateCreation']
        }`
      )
  1. Pour récuperer la valeur dans mon tableau (mais c’est peut-être pythonesque)
document_per_day[real_document_date] = pdf_info

Je viens de pousser un commit qui fix le truc.

Je serais plutôt pour virer le courrier finalement à la vue du pdf que tu m’as mailé.