Développement Connecteur : téléchargement des factures manuel


#1

Bonjour,

Je suis en train de faire un connecteur pour un fournisseur d’electricité…
je n’ai pas réussi à faire télécharger les factures par la fonction SaveBills (il y a une requête POST pour paramétrer une variable puis une requete GET pour effectivement télécharger le pdf de la facture)
Je ne voit pas comment faire cette succession de requête avec saveBills ou saveFiles…
Du coup, je l’ai fait à la main. Maintenant j’ai les PDF, comment je fais pour donner le chemin à saveBills ?

Merci d’avance


#2

Bonjour,

Dans le tableau de bills que tu passe à saveBills il y a une propriété filestream qui est destinée à contenir le stream du pdf de la facture si sa récupération nécessite plus qu’une requête GET dont l’url est définie dans fileurl.
Voici un exemple: https://github.com/laedit/cozy-konnector-gazdestrasbourg/blob/master/src/index.js#L146


#3

Salut
Merci pour ces precisions

j’ai quand meme une question parce que pense que je me loupe sur l’asynchrone mais je vois pas trop ou…

Je n’ai que le dernier document qui est ajouté à cozy…
je soupconne soit la déclaration de l’objet “stream” qui ne crée pas un nouveau stream à chaque fois et qui du coup écrase l’objet à chaque fois…
ou alors un pb d’asynchrone…

Quelqu’un pourrait m’aider ?
merci d’avance.

voici mon code :

var tabDocs = [];
var oUnDoc = {};
for (var i = 0 ; i < oObjet.aaData.length; i++)
{
oUnDoc.reference = oObjet.aaData[i][0]
oUnDoc.date = parseDate(oObjet.aaData[i][1])
oUnDoc.filename = normalizeFileName(oUnDoc.date, oObjet.aaData[i][4], oUnDoc.reference)
oUnDoc.amount = normalizePrice(oObjet.aaData[i][4])
requestOptions: {method: ‘POST’ }
oUnDoc.currency = ‘€’
oUnDoc.vendor= ‘CESML’
// l’objet avec les metadata
oUnDoc.metadata= {}
oUnDoc.metadata.importDate = new Date()
oUnDoc.metadata.version = 1
// Le ntaille -1 est vrai, c’est que la facture est téléchargeable
if (oObjet.aaData[i][oObjet.aaData[i].length - 2] == true)
{
formData = ‘{“id”:’ + oObjet.aaData[i][14] + ‘}’
contentLength = formData.length
await request({
uri: ‘https://moncompte.cesml.com/Portail/fr-FR/Usager/Abonnement/StoreFactureId’,
body: formData,
method: ‘POST’,
headers: {
‘Content-Length’: contentLength,
‘Content-Type’: ‘application/json’
},
}, function(error, response, body){
}
)
}

oUnDoc.filestream = await request(‘https://moncompte.cesml.com/Portail/fr-FR/Usager/Abonnement/TelechargerFacture’).pipe(new PassThrough())
// Ajoute les éléments au tableau
tabDocs.push(oUnDoc);
}
return tabDocs;


#4

Si ce code est dans une fonction async il me semble que ça devrait être bon.
Le nom obtenu par normalizeFileName est bien différent pour chaque facture ?


#5

Salut,

je viens de vérifier ma fonction est bien async et les noms sont bien différents…
je comprends pas trop…

J’ai mis à jour mon code sur github

Si une bonne ame peut y jeter un oeil, parce que la je sèche…

Merci d’avance


#6

Salut,
Oui c’est la boucle for qui est asynchrone. Tu dois pouvoir le vérifier en mettant des logs bien choisis en début et fin de boucle.

Sur un array, je te conseille d’utilise forEach(), c’est bloquant.

Lucas


#7

Bon nous venons de vérifier sur du pseudo code, j’étais un peu trop confiant sur le forEach il est asynchrone. Et ne règlera rien.
Ton code devrait attendre la requête de ce que je vois sur le repo.


#8

Est ce que tu peux essayer avec la déclaration de oUnDoc dans la boucle for.

Je me demande si ce n’est pas la ré-utilisation du même objet à chaque tour qui pose problème.


#9

Bon, c’était ca !
la solution était de mettre la déclaration de l’objet dans la boucle.
Après avoir effectué des recherches, voici l’explication “technique”
la notion de valeur et référence en nodeJS est donc la même qu’en JS “normal” (par normal, j’entends celui du web)

les types simples (entier, chaîne, float, …) sont toujours passés par valeur
les types complexes (objets, array, …) sont toujours passés par référence…

Du coup, dans mon cas, l’objet était ajouté sous forme d’une référence, donc en modifiant mon objet au tour d’après, je modifiais tous les éléments du tableau, donc il ne restait toujours que le dernier élément…
bref, c’est corrigé, merci pour vos idées et solutions !