diff --git a/index.js b/index.js index a08278de68087172ebb3297616aae8fe159be109..98e87421cad1ba565a0b20135a40414c4f45c70b 100644 --- a/index.js +++ b/index.js @@ -23,10 +23,12 @@ const { parseValue, parseValueHalfHour, parsePointId, + parseUserOffPeakHours, } = __webpack_require__(1599) const { consultationMesuresDetailleesMaxPower, consultationMesuresDetaillees, + consulterDonneesTechniquesContractuelles, } = __webpack_require__(1680) const { updateBoConsent, @@ -153,7 +155,6 @@ async function start(fields, cozyParameters) { */ log('info', 'User Logging...') - const boUrlSGE = new URL('/api/sge', boBaseUrl).href if (isFirstStart(await getAccount(ACCOUNT_ID))) { log('info', 'First start...') transaction.startChild({ op: 'First start' }) @@ -167,7 +168,7 @@ async function start(fields, cozyParameters) { exitIfDebug(user) let consent = await createBoConsent( - boUrlSGE, + boBaseUrl, boToken, pointId, user.lastname, @@ -202,12 +203,12 @@ async function start(fields, cozyParameters) { contractStartDate, contractEndDate ).catch(async err => { - await deleteBoConsent(boUrlSGE, boToken, consent.ID) + await deleteBoConsent(boBaseUrl, boToken, consent.ID) throw err }) } consent = await updateBoConsent( - boUrlSGE, + boBaseUrl, boToken, consent, serviceId.toString() @@ -226,7 +227,7 @@ async function start(fields, cozyParameters) { transaction.startChild({ op: 'Alternate start' }) const accountData = await getAccount(ACCOUNT_ID) const userConsent = await getBoConsent( - boUrlSGE, + boBaseUrl, boToken, accountData.data.consentId ) @@ -265,7 +266,7 @@ async function start(fields, cozyParameters) { sgeLogin, contractId, pointId, - boUrlSGE, + boBaseUrl, boToken, consentEndDate < today ) @@ -353,16 +354,93 @@ async function deleteConsent( */ async function gatherData(baseUrl, apiAuthKey, sgeLogin, pointId) { log('info', 'Querying data...') - const measuresUrl = new URL( - '/enedis_SGE_ConsultationMesuresDetaillees_v3/1.0', - baseUrl - ).href - await getData(measuresUrl, apiAuthKey, sgeLogin, pointId) - await getMaxPowerData(measuresUrl, apiAuthKey, sgeLogin, pointId) - await getDataHalfHour(measuresUrl, apiAuthKey, sgeLogin, pointId) + await getOffPeakHours( + `${baseUrl}/enedis_SGE_ConsultationDonneesTechniquesContractuelles/1.0`, + apiAuthKey, + sgeLogin, + pointId + ) + await getData( + `${baseUrl}/enedis_SGE_ConsultationMesuresDetaillees_v3/1.0`, + apiAuthKey, + sgeLogin, + pointId + ) + await getMaxPowerData( + `${baseUrl}/enedis_SGE_ConsultationMesuresDetaillees_v3/1.0`, + apiAuthKey, + sgeLogin, + pointId + ) + await getDataHalfHour( + `${baseUrl}/enedis_SGE_ConsultationMesuresDetaillees_v3/1.0`, + apiAuthKey, + sgeLogin, + pointId + ) log('info', 'Querying data: done') } +/** + * Get hour data + * @param {string} url + * @param {string} apiAuthKey + * @param {string} userLogin + * @param {string} pointId + */ +async function getOffPeakHours(url, apiAuthKey, userLogin, pointId) { + log('info', 'Fetching off-peak hours') + const sgeHeaders = { + 'Content-Type': 'text/xml;charset=UTF-8', + apikey: apiAuthKey, + } + + const { response } = await soapRequest({ + url: url, + headers: sgeHeaders, + xml: consulterDonneesTechniquesContractuelles(pointId, userLogin, false), + }).catch(err => { + log('error', 'consulterDonneesTechniquesContractuelles') + log('error', err) + Sentry.captureException( + `consulterDonneesTechniquesContractuelles: ${err}`, + { + tags: { section: 'getOffPeakHour' }, + extra: { + pointId: pointId, + }, + } + ) + return err + }) + + const result = await xml2js.parseStringPromise(response.body, { + tagNameProcessors: [parseTags], + valueProcessors: [parseValue], + explicitArray: false, + }) + + try { + const offPeakHours = parseUserOffPeakHours(result) + log( + 'debug', + `Found off-peak hours : ${offPeakHours}, store them in account data` + ) + const accountData = await getAccount(ACCOUNT_ID) + await saveAccountData(ACCOUNT_ID, { + ...accountData.data, + offPeakHours, + }) + } catch (error) { + log('debug', 'Off-peak hours not found, remove them from account data') + let accountData = await getAccount(ACCOUNT_ID) + delete accountData.data.offPeakHours + await saveAccountData(ACCOUNT_ID, { + ...accountData.data, + }) + } +} + /** * Get hour data * @param {string} url @@ -229086,6 +229164,31 @@ function parseUserAddress(result) { ]['point']['donneesGenerales']['adresseInstallation'] } +/** + * Return User off-peak hours + * @param {string} result + * @returns {string} + * @example "3H00-8H00;13H30-16H30" + */ +function parseUserOffPeakHours(result) { + log('info', 'Parsing user off-peak hours') + const json = JSON.stringify(result) + const rawOffPeakHours = + JSON.parse(json)['Envelope']['Body'][ + 'consulterDonneesTechniquesContractuellesResponse' + ]['point']['situationComptage']['dispositifComptage']['relais'][ + 'plageHeuresCreuses' + ] + // extract off-peak hours from parentheses + let match = rawOffPeakHours.match(/\((.*?)\)/) + // Check if there is a match and return the content + if (match) { + return match[1] + } else { + throw new Error('invalid off-peak hours format') + } +} + /** * Return User contract start date * @param {string} result @@ -229276,6 +229379,7 @@ module.exports = { parseSgeXmlData, parseTags, parseUserAddress, + parseUserOffPeakHours, parseUserPdl, parseValue, parseValueHalfHour, diff --git a/onDeleteAccount.js b/onDeleteAccount.js index db81f441cd37970318c01fbff748412aec7fdbc2..30be1990f1a2a295b7d8c98ecdbc5849c30a2255 100644 --- a/onDeleteAccount.js +++ b/onDeleteAccount.js @@ -228345,6 +228345,31 @@ function parseUserAddress(result) { ]['point']['donneesGenerales']['adresseInstallation'] } +/** + * Return User off-peak hours + * @param {string} result + * @returns {string} + * @example "3H00-8H00;13H30-16H30" + */ +function parseUserOffPeakHours(result) { + log('info', 'Parsing user off-peak hours') + const json = JSON.stringify(result) + const rawOffPeakHours = + JSON.parse(json)['Envelope']['Body'][ + 'consulterDonneesTechniquesContractuellesResponse' + ]['point']['situationComptage']['dispositifComptage']['relais'][ + 'plageHeuresCreuses' + ] + // extract off-peak hours from parentheses + let match = rawOffPeakHours.match(/\((.*?)\)/) + // Check if there is a match and return the content + if (match) { + return match[1] + } else { + throw new Error('invalid off-peak hours format') + } +} + /** * Return User contract start date * @param {string} result @@ -228535,6 +228560,7 @@ module.exports = { parseSgeXmlData, parseTags, parseUserAddress, + parseUserOffPeakHours, parseUserPdl, parseValue, parseValueHalfHour,