From dc9825848253dc5a36f2489f449c0b7870f9f43c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20PAILHAREY?= <rpailharey@grandlyon.com> Date: Wed, 15 Nov 2023 09:53:01 +0000 Subject: [PATCH] fix: removed contract start date limitation --- .vscode/settings.json | 23 +++++- __tests__/core/contractStartDate.spec.js | 90 ------------------------ __tests__/helpers/parsing.spec.js | 19 ----- src/core/contractStartDate.js | 67 ------------------ src/core/index.js | 2 - src/core/types/types.js | 2 +- src/core/verifyUserIdentity.js | 2 +- src/helpers/parsing.js | 17 +---- src/index.js | 68 +++--------------- 9 files changed, 35 insertions(+), 255 deletions(-) delete mode 100644 __tests__/core/contractStartDate.spec.js delete mode 100644 src/core/contractStartDate.js diff --git a/.vscode/settings.json b/.vscode/settings.json index 0f2b73d..e40cc91 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -28,21 +28,30 @@ ], "cSpell.words": [ "acces", + "adresse", "apikey", + "appartement", "arret", "Arret", + "autorisation", "backoffice", "catched", "cicid", + "collecte", + "contractuelles", + "contrat", "Corrigees", + "courbe", "cozyclient", "criteres", + "demande", "Derniere", "Detaillees", "ecolyo", "enedis", "Enedis", "enedissgegrandlyon", + "escalier", "Etage", "etat", "faultstring", @@ -50,19 +59,31 @@ "Generales", "grandlyon", "HISTO", + "initiateur", "insee", "konnector", "konnectors", "lastname", + "Libelle", "llle", "maxpower", + "mesure", + "mesures", "numerique", "numero", "Perimetre", "periodicite", + "personne", "PMAX", + "rechercher", "Recurrente", "resultat", - "soapenv" + "soapenv", + "sociale", + "souscrit", + "souscrits", + "soutirage", + "utilisateur", + "voie" ] } diff --git a/__tests__/core/contractStartDate.spec.js b/__tests__/core/contractStartDate.spec.js deleted file mode 100644 index 1831c7d..0000000 --- a/__tests__/core/contractStartDate.spec.js +++ /dev/null @@ -1,90 +0,0 @@ -const { errors } = require('cozy-konnector-libs') -const { getContractStartDate } = require('../../src/core/contractStartDate') -const xml2js = require('xml2js') - -const mockSoapRequest = jest.fn() -jest.mock('easy-soap-request', () => async () => mockSoapRequest()) - -const responseMock = { - response: { - body: `<?xml version="1.0" encoding="UTF-8"?> -<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> - <soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> - <ns7:consulterDonneesTechniquesContractuellesResponse xmlns:ns0="http://www.erdf.fr/tube/exposition/finalisation" xmlns:ns7="http://www.enedis.fr/sge/b2b/services/consulterdonneestechniquescontractuelles/v1.0"> - <point id="19160781274487"> - <donneesGenerales> - <dateDerniereModificationFormuleTarifaireAcheminement>2021-08-01+02:00</dateDerniereModificationFormuleTarifaireAcheminement> - <niveauOuvertureServices>2</niveauOuvertureServices> - </donneesGenerales> - </point> - </ns7:consulterDonneesTechniquesContractuellesResponse> - </soap:Body> -</soapenv:Envelope>`, - }, -} - -const responseIssueMock = { - response: { - body: `<?xml version="1.0" encoding="UTF-8"?> -<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> - <soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> - <ns7:consulterDonneesTechniquesContractuellesResponse xmlns:ns0="http://www.erdf.fr/tube/exposition/finalisation" xmlns:ns7="http://www.enedis.fr/sge/b2b/services/consulterdonneestechniquescontractuelles/v1.0"> - <point id="19160781274487"> - </point> - </ns7:consulterDonneesTechniquesContractuellesResponse> - </soap:Body> -</soapenv:Envelope>`, - }, -} - -describe('getContractStartDate', () => { - it('should return void when successfully got contract start date ✅', async () => { - mockSoapRequest.mockResolvedValueOnce(responseMock) - expect.assertions(1) - try { - await getContractStartDate( - 'http://pouet.com', - 'apiAuthKey', - 'pouet@pouet.com', - '1111111111' - ) - expect(true).toBeTruthy() - } catch (error) { - expect(true).toBe(false) - } - }) - - it('should throw VENDOR_DOWN when failing request 🚫', async () => { - mockSoapRequest.mockRejectedValueOnce('error') - - try { - await getContractStartDate() - expect(true).toBe(false) - } catch (error) { - expect(error.message).toBe(errors.VENDOR_DOWN) - } - }) - - it('should throw NOT_EXISTING_DIRECTORY when failing parsing 🚫', async () => { - mockSoapRequest.mockResolvedValueOnce(responseIssueMock) - jest.spyOn(xml2js, 'parseStringPromise').mockResolvedValueOnce({ - Envelope: { - Body: { - Fault: { detail: { erreur: { resultat: { $: { code: 401 } } } } }, - faultstring: 'Mock error', - }, - }, - }) - try { - await getContractStartDate( - 'http://pouet.com', - 'apiAuthKey', - 'pouet@pouet.com', - '1111111111' - ) - expect(true).toBe(false) - } catch (error) { - expect(error.message).toBe(errors.NOT_EXISTING_DIRECTORY) - } - }) -}) diff --git a/__tests__/helpers/parsing.spec.js b/__tests__/helpers/parsing.spec.js index c6fcc97..b45b2de 100644 --- a/__tests__/helpers/parsing.spec.js +++ b/__tests__/helpers/parsing.spec.js @@ -1,6 +1,5 @@ const { parseUserPdl, - parseContractStartDate, parseContracts, parseServiceId, parseSgeXmlData, @@ -27,24 +26,6 @@ describe('parsing', () => { const reply = parseUserPdl(result) expect(reply).toEqual(1) }) - it('should parse contract start date', () => { - const result = { - Envelope: { - Body: { - consulterDonneesTechniquesContractuellesResponse: { - point: { - donneesGenerales: { - dateDerniereModificationFormuleTarifaireAcheminement: - '01/01/2022', - }, - }, - }, - }, - }, - } - const reply = parseContractStartDate(result) - expect(reply).toEqual('01/01/2022') - }) it('should parse contract', () => { const result = { Envelope: { diff --git a/src/core/contractStartDate.js b/src/core/contractStartDate.js deleted file mode 100644 index 10e5e3a..0000000 --- a/src/core/contractStartDate.js +++ /dev/null @@ -1,67 +0,0 @@ -// @ts-check -const { log, errors } = require('cozy-konnector-libs') -const soapRequest = require('easy-soap-request') -const { - parseTags, - parseValue, - parseContractStartDate, -} = require('../helpers/parsing') -const xml2js = require('xml2js') -const { consulterDonneesTechniquesContractuelles } = require('../requests/sge') -const Sentry = require('@sentry/node') - -/** - * Get user contract start date - * @param {string} url - * @param {string} apiAuthKey - * @param {string} userLogin - * @param {string} pointId - * @returns {Promise<string>} - */ -async function getContractStartDate(url, apiAuthKey, userLogin, pointId) { - log('info', 'Fetching data start date') - const sgeHeaders = { - 'Content-Type': 'text/xml;charset=UTF-8', - apikey: apiAuthKey, - } - - const { response } = await soapRequest({ - url: `${url}/enedis_SGE_ConsultationDonneesTechniquesContractuelles/1.0`, - headers: sgeHeaders, - xml: consulterDonneesTechniquesContractuelles(pointId, userLogin), - }).catch(err => { - const errorMessage = - 'Error while fetching contract start date : ' + err.message - log('error', errorMessage) - Sentry.captureException(errorMessage, { - tags: { - section: 'getContractStartDate', - }, - extra: { - pointId: pointId, - }, - }) - throw new Error(errors.VENDOR_DOWN) - }) - - const result = await xml2js.parseStringPromise(response.body, { - tagNameProcessors: [parseTags], - valueProcessors: [parseValue], - explicitArray: false, - }) - try { - return parseContractStartDate(result) - } catch (error) { - const errorMessage = - 'Error while processing contract start date: ' + error.message - log('error', errorMessage) - Sentry.captureException(errorMessage) - log( - 'error', - `Enedis issue ${result.Envelope.Body.Fault.detail.erreur.resultat.$.code}: ${result.Envelope.Body.Fault.faultstring}` - ) - throw new Error(errors.NOT_EXISTING_DIRECTORY) - } -} - -module.exports = { getContractStartDate } diff --git a/src/core/index.js b/src/core/index.js index 70e2d7e..e71b162 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -1,5 +1,4 @@ const { activateContract } = require('./contractActivation') -const { getContractStartDate } = require('./contractStartDate') const { terminateContract } = require('./contractTermination') const { verifyContract } = require('./contractVerification') const { findUserPdl } = require('./findUserPdl') @@ -8,7 +7,6 @@ const { findUserAddress } = require('./findUserAddress') module.exports = { activateContract, - getContractStartDate, terminateContract, verifyContract, findUserPdl, diff --git a/src/core/types/types.js b/src/core/types/types.js index 5a344f9..78bf4d3 100644 --- a/src/core/types/types.js +++ b/src/core/types/types.js @@ -53,7 +53,7 @@ * @property {string} address * @property {string} inseeCode * @property {string} city - * @property {boolean} hasBeenThroughtSafetyOnBoarding + * @property {boolean} hasBeenThroughSafetyOnBoarding */ /** diff --git a/src/core/verifyUserIdentity.js b/src/core/verifyUserIdentity.js index 3ee35cf..a7376fd 100644 --- a/src/core/verifyUserIdentity.js +++ b/src/core/verifyUserIdentity.js @@ -153,7 +153,7 @@ async function verifyUserIdentity( inseeCode, postalCode: fields.postalCode, address: fields.address, - hasBeenThroughtSafetyOnBoarding: userSafetyOnBoarding, + hasBeenThroughSafetyOnBoarding: userSafetyOnBoarding, city: fields.city, } } diff --git a/src/helpers/parsing.js b/src/helpers/parsing.js index c947599..862f225 100644 --- a/src/helpers/parsing.js +++ b/src/helpers/parsing.js @@ -16,20 +16,6 @@ function parseUserPdl(result) { ]['point']['$'].id } -/** - * Return User contract start date - * @param {string} result - * @returns {string} - */ -function parseContractStartDate(result) { - log('info', 'Parsing contract start date') - const json = JSON.stringify(result) - return JSON.parse(json)['Envelope']['Body'][ - 'consulterDonneesTechniquesContractuellesResponse' - ]['point']['donneesGenerales'][ - 'dateDerniereModificationFormuleTarifaireAcheminement' - ] -} /** * Return User address * @param {string} result @@ -88,7 +74,7 @@ function parseSgeXmlData(result) { * @returns {Promise<EnedisKonnectorData[]>} Parsed timestamp array */ async function formateDataForDoctype(data) { - log('info', 'Formating data') + log('info', 'Formatting data') return data.map(record => { const date = moment(record.d, 'YYYY/MM/DD h:mm:ss') return { @@ -228,7 +214,6 @@ module.exports = { checkContractExists, formateDataForDoctype, parseContracts, - parseContractStartDate, parsePointId, parseServiceId, parseSgeXmlData, diff --git a/src/index.js b/src/index.js index 77d9a66..6dc43d8 100644 --- a/src/index.js +++ b/src/index.js @@ -34,7 +34,6 @@ const { activateContract, verifyContract, terminateContract, - getContractStartDate, } = require('./core') const { getAccount, saveAccountData } = require('./requests/cozy') const { isLocal, isDev } = require('./helpers/env') @@ -47,13 +46,12 @@ moment.locale('fr') // set the language moment.tz.setDefault('Europe/Paris') // set the timezone /** Connector Constants **/ -const manualExecution = - process.env.COZY_JOB_MANUAL_EXECUTION === 'true' ? true : false -let startDailyDate = manualExecution +const manualExecution = process.env.COZY_JOB_MANUAL_EXECUTION === 'true' +let startDate = manualExecution ? moment().subtract(12, 'month') - : moment().subtract(6, 'month') -let startDailyDateString = startDailyDate.format('YYYY-MM-DD') -const startLoadDate = moment().subtract(7, 'day') + : moment().subtract(36, 'month') +let startDateString = startDate.format('YYYY-MM-DD') +const startHalfHourDate = moment().subtract(7, 'day') const endDate = moment() const endDateString = endDate.format('YYYY-MM-DD') const ACCOUNT_ID = isLocal() ? 'default_account_id' : 'enedissgegrandlyon' @@ -172,20 +170,9 @@ async function start(fields, cozyParameters) { user.postalCode, user.inseeCode, user.city, - user.hasBeenThroughtSafetyOnBoarding + user.hasBeenThroughSafetyOnBoarding ) - // handle user contract start date in order to properly request data - const userContractStartDate = await getContractStartDate( - baseUrl, - apiAuthKey, - sgeLogin, - pointId - ) - - startDailyDate = moment(userContractStartDate, 'YYYY-MM-DD') - startDailyDateString = startDailyDate.format('YYYY-MM-DD') - const contractStartDate = moment().format('YYYY-MM-DD') const contractEndDate = moment() .add(1, 'year') // SGE force 1 year duration @@ -357,16 +344,6 @@ async function deleteConsent( */ async function gatherData(baseUrl, apiAuthKey, sgeLogin, pointId) { log('info', 'Querying data...') - const userContractStartDate = await getContractStartDate( - baseUrl, - apiAuthKey, - sgeLogin, - pointId - ) - - startDailyDate = moment(userContractStartDate, 'YYYY-MM-DD') - startDailyDateString = startDailyDate.format('YYYY-MM-DD') - await getData( `${baseUrl}/enedis_SGE_ConsultationMesuresDetaillees_v3/1.0`, apiAuthKey, @@ -402,15 +379,13 @@ async function getData(url, apiAuthKey, userLogin, pointId) { apikey: apiAuthKey, } - limitStartDate() - const { response } = await soapRequest({ url: url, headers: sgeHeaders, xml: consultationMesuresDetaillees( pointId, userLogin, - startDailyDateString, + startDateString, endDateString, 'ENERGIE', 'EA' @@ -449,15 +424,13 @@ async function getMaxPowerData(url, apiAuthKey, userLogin, pointId) { apikey: apiAuthKey, } - limitStartDate() - const { response } = await soapRequest({ url: url, headers: sgeHeaders, xml: consultationMesuresDetailleesMaxPower( pointId, userLogin, - startDailyDateString, + startDateString, endDateString ), }).catch(err => { @@ -480,27 +453,6 @@ async function getMaxPowerData(url, apiAuthKey, userLogin, pointId) { ) } -/** - * If start date exceed the maximum amount of data we can get with one query - * get only 36 month. Or 12 month if manual execution - * On manual execution, set the start date to one year ago. - */ -function limitStartDate() { - const livingDuration = moment(endDate).diff(startDailyDate, 'months', true) - // We need to prevent case that there is less than 12 month data - if (manualExecution && livingDuration > 12) { - startDailyDate = moment(endDate).subtract(12, 'month') - startDailyDateString = startDailyDate.format('YYYY-MM-DD') - } else if (livingDuration > 36) { - log( - 'info', - 'Start date exceed 36 month, setting start date to current date minus 36 month' - ) - startDailyDate = moment(endDate).subtract(36, 'month') - startDailyDateString = startDailyDate.format('YYYY-MM-DD') - } -} - /** * Get half-hour data * @param {string} url @@ -520,7 +472,7 @@ async function getDataHalfHour(url, apiAuthKey, userLogin, pointId) { for (let i = 0; i < MAX_HISTO; i++) { log('info', 'launch process with history') - const incrementedStartDateString = moment(startLoadDate) + const incrementedStartDateString = moment(startHalfHourDate) .subtract(7 * i, 'day') .format('YYYY-MM-DD') const incrementedEndDateString = moment(endDate) @@ -657,7 +609,7 @@ async function aggregateMonthAndYearData(data) { * @returns {boolean} */ function isFirstStart(account) { - if (account && account.data && account.data.consentId) { + if (account?.data?.consentId) { log('info', 'Konnector not first start') return false } -- GitLab