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