diff --git a/index.js b/index.js
index 9043f7cbc0937bffd9ba8f038fea8be188bd0957..2cef00d7afe94cfbefcdd97880fc5ab312302365 100644
--- a/index.js
+++ b/index.js
@@ -18,19 +18,15 @@ const xml2js = __webpack_require__(1513)
 const { buildAgregatedData } = __webpack_require__(1554)
 const {
   parseSgeXmlData,
-  parseSgeXmlTechnicalData,
   formateDataForDoctype,
   parseTags,
   parseValue,
-  parseUserPdl,
+  parseContractStartDate,
 } = __webpack_require__(1555)
 const {
   consulterDonneesTechniquesContractuelles,
   consultationMesuresDetailleesMaxPower,
   consultationMesuresDetaillees,
-  rechercherPoint,
-  commanderCollectePublicationMesures,
-  commanderArretServiceSouscritMesures,
 } = __webpack_require__(1556)
 const {
   updateBoConsent,
@@ -38,7 +34,12 @@ const {
   getBoConsent,
   deleteBoConsent,
 } = __webpack_require__(1557)
-const { getInseeCode } = __webpack_require__(1558)
+const { verifyUserIdentity } = __webpack_require__(1558)
+const { activateContract } = __webpack_require__(1598)
+const { verifyContract } = __webpack_require__(1599)
+const { terminateContract } = __webpack_require__(1601)
+const { getAccount, saveAccountData } = __webpack_require__(1602)
+const { iSLocal } = __webpack_require__(1603)
 
 moment.locale('fr') // set the language
 moment.tz.setDefault('Europe/Paris') // set the timezone
@@ -53,26 +54,35 @@ let startDailyDateString = startDailyDate.format('YYYY-MM-DD')
 const startLoadDate = moment().subtract(7, 'day')
 const endDate = moment()
 const endDateString = endDate.format('YYYY-MM-DD')
+const ACCOUNT_ID = iSLocal() ? 'default_account_id' : 'enedis-sge-grandlyon'
 
 module.exports = new BaseKonnector(start)
+module.exports = { getContractStartDate }
 
-// The start function is run by the BaseKonnector instance only when it got all the account
-// information (fields). When you run this connector yourself in "standalone" mode or "dev" mode,
-// the account information come from ./konnector-dev-config.json file
-// cozyParameters are static parameters, independents from the account. Most often, it can be a
-// secret api key.
+/**
+ * The start function is run by the BaseKonnector instance only when it got all the account
+ * information (fields). When you run this connector yourself in "standalone" mode or "dev" mode,
+ * the account information come from ./konnector-dev-config.json file
+ * cozyParameters are static parameters, independents from the account. Most often, it can be a
+ * secret api key.
+ * @param {fields} fields
+ * @param {{secret: fields}} cozyParameters
+ */
 async function start(fields, cozyParameters) {
   log('info', 'Gathering data ...')
+  let pointId = fields.pointId
   let baseUrl = fields.wso2BaseUrl
   let apiAuthKey = fields.apiToken
-  let loginUtilisateur = fields.loginUtilisateur
+  //TODO switch variable to english
+  let sgeLogin = fields.sgeLogin
   log('info', 'Authenticating ...')
   //TODO: Verify if condition is working in local and on build version
   if (cozyParameters && Object.keys(cozyParameters).length !== 0) {
     log('debug', 'Found COZY_PARAMETERS')
+    pointId = cozyParameters.secret.pointId
     baseUrl = cozyParameters.secret.wso2BaseUrl
     apiAuthKey = cozyParameters.secret.apiToken
-    loginUtilisateur = cozyParameters.secret.loginUtilisateur
+    sgeLogin = cozyParameters.secret.sgeLogin
   }
 
   /**
@@ -85,112 +95,124 @@ async function start(fields, cozyParameters) {
    */
   log('info', 'User Logging...')
 
-  if (await isFirstStart()) {
-    if (
-      !(await verifyUserIdentity(fields, baseUrl, apiAuthKey, loginUtilisateur))
-    ) {
-      throw errors.LOGIN_FAILED
-    }
-    await createBoConsent()
-    //TODO: remove because useless ? Done later in code
-    // const startDate = await getDataStartDate(
-    //   baseUrl,
-    //   apiAuthKey,
-    //   loginUtilisateur,
-    //   fields.pointId
-    // )
-    await commanderCollectePublicationMesures()
-    await updateBoConsent()
+  if (await isFirstStart(await getAccount('default_account_id'))) {
+    const user = await verifyUserIdentity(fields, baseUrl, apiAuthKey, sgeLogin)
+
+    let consent = await createBoConsent(
+      pointId,
+      user.name,
+      user.address,
+      user.postalCode,
+      user.inseeCode
+    )
+    await getContractStartDate(baseUrl, apiAuthKey, sgeLogin, pointId)
+
+    const contractStartDate = moment().format('YYYY-MM-DD')
+    //TODO: consent time ? 5 years?
+    const contractEndDate = moment()
+      .add(1, 'year')
+      .format('YYYY-MM-DD')
+
+    let serviceId = await verifyContract(
+      baseUrl,
+      apiAuthKey,
+      sgeLogin,
+      fields.contractId,
+      user.pointId
+    )
+    if (!serviceId) {
+      serviceId = await activateContract(
+        baseUrl,
+        apiAuthKey,
+        sgeLogin,
+        fields.contractId,
+        user.name,
+        user.pointId,
+        contractStartDate,
+        contractEndDate
+      )
+    }
+    consent = await updateBoConsent(consent, serviceId)
+    // Save bo id into account
+    const accountData = await getAccount(ACCOUNT_ID)
+    console.log(
+      '🚀 ~ file: index.js ~ line 132 ~ start ~ accountData',
+      accountData
+    )
+
+    await saveAccountData(this.accountId, {
+      ...accountData.data,
+      consentId: consent.id,
+    })
   } else {
-    await getBoConsent()
-    if (!(await verifyUserIdentity(fields))) {
+    // AlternateStart
+    const accountData = await getAccount(ACCOUNT_ID)
+    const userConsent = await getBoConsent(accountData.data.consentId)
+    const user = await verifyUserIdentity(fields, baseUrl, apiAuthKey, sgeLogin)
+    if (user.name !== userConsent.name || !user) {
+      log('error', `Invalid or not found consent for user`)
       await deleteBoConsent()
-      await commanderArretServiceSouscritMesures()
+      if (userConsent.serviceId) {
+        await terminateContract(
+          baseUrl,
+          apiAuthKey,
+          sgeLogin,
+          fields.contractId,
+          fields.pointId,
+          userConsent.serviceId
+        )
+      } else {
+        log('error', `No service id retrieved from BO`)
+        throw errors.VENDOR_DOWN
+      }
       throw errors.TERMS_VERSION_MISMATCH
     }
   }
   log('info', 'Successfully logged in')
 
-  await gatherData(baseUrl, apiAuthKey, loginUtilisateur, fields.pointId)
-}
-
-/**
- * Verify user identity
- * @param {object} fields
- * @param {string} baseUrl
- * @param {string} apiAuthKey
- * @param {string} loginUtilisateur
- */
-async function verifyUserIdentity(
-  fields,
-  baseUrl,
-  apiAuthKey,
-  loginUtilisateur
-) {
-  const inseeCode = await getInseeCode(fields.postalCode)
-  if (!inseeCode) throw errors.USER_ACTION_NEEDED
-
-  const pdl = await findUserPdl(
-    `${baseUrl}/enedis_SDE_recherche-point/1.0`,
-    apiAuthKey,
-    loginUtilisateur,
-    fields.name,
-    fields.addresse,
-    fields.postalCode,
-    inseeCode
-  )
-
-  if (fields.pointId != pdl) {
-    log('error', 'PointId does not match')
-    return false
-  }
-  return true
+  await gatherData(baseUrl, apiAuthKey, sgeLogin, fields.pointId)
 }
 
 /**
  * Main method for gathering data
  * @param {string} baseUrl
  * @param {string} apiAuthKey
- * @param {string} loginUtilisateur
+ * @param {string} sgeLogin
  * @param {number} pointId
  */
-async function gatherData(baseUrl, apiAuthKey, loginUtilisateur, pointId) {
+async function gatherData(baseUrl, apiAuthKey, sgeLogin, pointId) {
   log('info', 'Querying data...')
-  await getDataStartDate(
-    `${baseUrl}/enedis_SGE_ConsultationDonneesTechniquesContractuelles/1.0`,
-    apiAuthKey,
-    loginUtilisateur,
-    pointId
-  )
+  await getContractStartDate(baseUrl, apiAuthKey, sgeLogin, pointId)
   await getData(
     `${baseUrl}/enedis_SGE_ConsultationMesuresDetaillees/1.0`,
     apiAuthKey,
-    loginUtilisateur,
+    sgeLogin,
     pointId
   )
   await getMaxPowerData(
     `${baseUrl}/enedis_SGE_ConsultationMesuresDetaillees/1.0`,
     apiAuthKey,
-    loginUtilisateur,
+    sgeLogin,
     pointId
   )
   await getDataHalfHour(
     `${baseUrl}/enedis_SGE_ConsultationMesuresDetaillees/1.0`,
     apiAuthKey,
-    loginUtilisateur,
+    sgeLogin,
     pointId
   )
   log('info', 'Querying data: done')
 }
 
 /**
- *
+ * //TODO: Move
  * @param {string} url
  * @param {string} apiAuthKey
  * @param {string} userLogin
  * @param {number} pointId
+ * @returns {Promise<void>}
  */
-async function getDataStartDate(url, apiAuthKey, userLogin, pointId) {
+async function getContractStartDate(url, apiAuthKey, userLogin, pointId) {
   log('info', 'Fetching data start date')
   const sgeHeaders = {
     'Content-Type': 'text/xml;charset=UTF-8',
@@ -198,13 +220,12 @@ async function getDataStartDate(url, apiAuthKey, userLogin, pointId) {
   }
 
   const { response } = await soapRequest({
-    url: url,
+    url: `${url}/enedis_SGE_ConsultationDonneesTechniquesContractuelles/1.0`,
     headers: sgeHeaders,
     xml: consulterDonneesTechniquesContractuelles(pointId, userLogin),
   }).catch(err => {
-    log('error', 'technicalDataResponse')
-    log('error', err)
-    return err
+    log('error', 'Error while fetching contract start date : ' + err)
+    throw errors.VENDOR_DOWN
   })
 
   xml2js.parseString(
@@ -413,12 +434,11 @@ function processStartDate() {
     }
     // update start Date with contract openning date
     try {
-      startDailyDate = moment(parseSgeXmlTechnicalData(result), 'YYYY-MM-DD')
+      startDailyDate = moment(parseContractStartDate(result), 'YYYY-MM-DD')
       startDailyDateString = startDailyDate.format('YYYY-MM-DD')
-    } catch (err) {
-      log('error', err)
-      //TODO: custom error ?
-      throw err
+    } catch (error) {
+      log('error', 'Error while processing contract start date: ' + error)
+      throw errors.NOT_EXISTING_DIRECTORY
     }
   }
 }
@@ -476,48 +496,14 @@ async function agregateMonthAndYearData(data) {
 /**
  * @returns {boolean}
  */
-function isFirstStart() {
-  console.log('isFirstStart')
-  //TODO: Implement
-  return true
-}
-
-/**
- * @return {Promise<string>} User Pdl
- */
-async function findUserPdl(
-  url,
-  apiAuthKey,
-  appLogin,
-  name,
-  addresse,
-  postalCode,
-  inseeCode
-) {
-  log('info', 'Fetching user data')
-  const sgeHeaders = {
-    'Content-Type': 'text/xml;charset=UTF-8',
-    apikey: apiAuthKey,
+function isFirstStart(account) {
+  console.log(account)
+  if (account && account.data && account.data.consentId) {
+    log('info', 'Konnector not first start')
+    return false
   }
-  const { response } = await soapRequest({
-    url: url,
-    headers: sgeHeaders,
-    xml: rechercherPoint(appLogin, name, postalCode, inseeCode, addresse),
-  }).catch(err => {
-    log('error', 'rechercherPointResponse')
-    log('error', err)
-    throw errors.LOGIN_FAILED
-    //TODO: handling code error SGT4F6 and SGT432 into USER_ACTIon_NEEDED
-  })
-
-  const parsedReply = await xml2js.parseStringPromise(response.body, {
-    tagNameProcessors: [parseTags],
-    valueProcessors: [parseValue],
-    explicitArray: false,
-  })
-
-  //TODO: handle errors
-  return parseUserPdl(parsedReply)
+  log('info', 'Konnector first start')
+  return true
 }
 
 
@@ -148186,7 +148172,7 @@ const fs = __webpack_require__(149);
 
 const path = __webpack_require__(142);
 
-let manifest = typeof {"version":"1.0.1","name":"Enedis SGE","type":"konnector","language":"node","icon":"icon.png","slug":"enedis-sge-grandlyon","source":"https://forge.grandlyon.com/web-et-numerique/llle_project/enedis-sge-konnector.git","editor":"Cozy","vendor_link":"Link to the target website","categories":["energy"],"frequency":"daily","fields":{"pointId":{"type":"text"}},"data_types":[],"screenshots":[],"permissions":{"accounts":{"type":"io.cozy.accounts","verbs":["GET"]},"files":{"type":"io.cozy.files"},"enedis data":{"type":"com.grandlyon.enedis.*"}},"developer":{"name":"Métropole de Lyon","url":"https://www.grandlyon.com/"},"langs":["fr"],"locales":{"fr":{"short_description":"Récupère vos donnéees de courbe de charge depuis l'API Enedis","long_description":"Ce connecteur récupère la courbe de charge électrique enregistrée par le compteur Linky","permissions":{"enedis data":{"description":"Requises pour accéder et stocker les données collectées par le compteur Linky et exposées par les API Enedis (consommations d’électricité à la demi-heure, au jour, mois et année). "},"files":{"description":"Cozy files"},"accounts":{"description":"Utilisé pour accéder à vos données de consommation."}}},"en":{"short_description":"Fetches your electricity consumption data from Enedis API","long_description":"This konnector fetches the energy curve of your electricity consumption gathered by your Linky device.","permissions":{"enedis data":{"description":"Required to access and store the data collected by the Linky meter and exposed by Enedis APIs (half-an-hour, daily, monthly and yearly consumption)."},"files":{"description":"Cozy files"},"accounts":{"description":"Used to access your consumption data."}}}},"manifest_version":"2"} === 'undefined' ? {} : {"version":"1.0.1","name":"Enedis SGE","type":"konnector","language":"node","icon":"icon.png","slug":"enedis-sge-grandlyon","source":"https://forge.grandlyon.com/web-et-numerique/llle_project/enedis-sge-konnector.git","editor":"Cozy","vendor_link":"Link to the target website","categories":["energy"],"frequency":"daily","fields":{"pointId":{"type":"text"}},"data_types":[],"screenshots":[],"permissions":{"accounts":{"type":"io.cozy.accounts","verbs":["GET"]},"files":{"type":"io.cozy.files"},"enedis data":{"type":"com.grandlyon.enedis.*"}},"developer":{"name":"Métropole de Lyon","url":"https://www.grandlyon.com/"},"langs":["fr"],"locales":{"fr":{"short_description":"Récupère vos donnéees de courbe de charge depuis l'API Enedis","long_description":"Ce connecteur récupère la courbe de charge électrique enregistrée par le compteur Linky","permissions":{"enedis data":{"description":"Requises pour accéder et stocker les données collectées par le compteur Linky et exposées par les API Enedis (consommations d’électricité à la demi-heure, au jour, mois et année). "},"files":{"description":"Cozy files"},"accounts":{"description":"Utilisé pour accéder à vos données de consommation."}}},"en":{"short_description":"Fetches your electricity consumption data from Enedis API","long_description":"This konnector fetches the energy curve of your electricity consumption gathered by your Linky device.","permissions":{"enedis data":{"description":"Required to access and store the data collected by the Linky meter and exposed by Enedis APIs (half-an-hour, daily, monthly and yearly consumption)."},"files":{"description":"Cozy files"},"accounts":{"description":"Used to access your consumption data."}}}},"manifest_version":"2"};
+let manifest = typeof {"version":"1.0.1","name":"Enedis SGE","type":"konnector","language":"node","icon":"icon.png","slug":"enedis-sge-grandlyon","source":"https://forge.grandlyon.com/web-et-numerique/llle_project/enedis-sge-konnector.git","editor":"Cozy","vendor_link":"Link to the target website","categories":["energy"],"frequency":"daily","fields":{"pointId":{"type":"text"}},"data_types":[],"screenshots":[],"permissions":{"accounts":{"type":"io.cozy.accounts"},"files":{"type":"io.cozy.files"},"enedis data":{"type":"com.grandlyon.enedis.*"}},"developer":{"name":"Métropole de Lyon","url":"https://www.grandlyon.com/"},"langs":["fr"],"locales":{"fr":{"short_description":"Récupère vos donnéees de courbe de charge depuis l'API Enedis","long_description":"Ce connecteur récupère la courbe de charge électrique enregistrée par le compteur Linky","permissions":{"enedis data":{"description":"Requises pour accéder et stocker les données collectées par le compteur Linky et exposées par les API Enedis (consommations d’électricité à la demi-heure, au jour, mois et année). "},"files":{"description":"Cozy files"},"accounts":{"description":"Utilisé pour accéder à vos données de consommation."}}},"en":{"short_description":"Fetches your electricity consumption data from Enedis API","long_description":"This konnector fetches the energy curve of your electricity consumption gathered by your Linky device.","permissions":{"enedis data":{"description":"Required to access and store the data collected by the Linky meter and exposed by Enedis APIs (half-an-hour, daily, monthly and yearly consumption)."},"files":{"description":"Cozy files"},"accounts":{"description":"Used to access your consumption data."}}}},"manifest_version":"2"} === 'undefined' ? {} : {"version":"1.0.1","name":"Enedis SGE","type":"konnector","language":"node","icon":"icon.png","slug":"enedis-sge-grandlyon","source":"https://forge.grandlyon.com/web-et-numerique/llle_project/enedis-sge-konnector.git","editor":"Cozy","vendor_link":"Link to the target website","categories":["energy"],"frequency":"daily","fields":{"pointId":{"type":"text"}},"data_types":[],"screenshots":[],"permissions":{"accounts":{"type":"io.cozy.accounts"},"files":{"type":"io.cozy.files"},"enedis data":{"type":"com.grandlyon.enedis.*"}},"developer":{"name":"Métropole de Lyon","url":"https://www.grandlyon.com/"},"langs":["fr"],"locales":{"fr":{"short_description":"Récupère vos donnéees de courbe de charge depuis l'API Enedis","long_description":"Ce connecteur récupère la courbe de charge électrique enregistrée par le compteur Linky","permissions":{"enedis data":{"description":"Requises pour accéder et stocker les données collectées par le compteur Linky et exposées par les API Enedis (consommations d’électricité à la demi-heure, au jour, mois et année). "},"files":{"description":"Cozy files"},"accounts":{"description":"Utilisé pour accéder à vos données de consommation."}}},"en":{"short_description":"Fetches your electricity consumption data from Enedis API","long_description":"This konnector fetches the energy curve of your electricity consumption gathered by your Linky device.","permissions":{"enedis data":{"description":"Required to access and store the data collected by the Linky meter and exposed by Enedis APIs (half-an-hour, daily, monthly and yearly consumption)."},"files":{"description":"Cozy files"},"accounts":{"description":"Used to access your consumption data."}}}},"manifest_version":"2"};
 
 if (process.env.NODE_ENV !== undefined && process.env.NODE_ENV !== 'none' && process.env.NODE_ENV !== 'production') {
   try {
@@ -223477,12 +223463,12 @@ function parseUserPdl(result) {
 }
 
 /**
- * Return start date
+ * Return User contract start date
  * @param {string} result
  * @returns {string}
  */
-function parseSgeXmlTechnicalData(result) {
-  log('info', 'Parsing technical data')
+function parseContractStartDate(result) {
+  log('info', 'Parsing contract start date')
   const json = JSON.stringify(result)
   return JSON.parse(json)['Envelope']['Body'][
     'consulterDonneesTechniquesContractuellesResponse'
@@ -223491,6 +223477,32 @@ function parseSgeXmlTechnicalData(result) {
   ]
 }
 
+/**
+ * Return User contract start date
+ * @param {string} result
+ * @returns {Contract[]}
+ */
+function parseContracts(result) {
+  log('info', 'Parsing contract')
+  const json = JSON.stringify(result)
+  return JSON.parse(json)['Envelope']['Body'][
+    'rechercherServicesSouscritsMesuresResponse'
+  ]['servicesSouscritsMesures']['serviceSouscritMesures']
+}
+
+/**
+ * Return User contract start date
+ * @param {string} result
+ * @returns {number}
+ */
+function parseServiceId(result) {
+  log('info', 'Parsing serviceId')
+  const json = JSON.stringify(result)
+  return JSON.parse(json)['Envelope']['Body'][
+    'commanderCollectePublicationMesuresResponse'
+  ]['serviceSouscritId']
+}
+
 /**
  * Parsing SGE xml reply to get only mesure data
  * @param {string} result
@@ -223552,11 +223564,13 @@ function parseValue(value, name) {
 
 module.exports = {
   parseSgeXmlData,
-  parseSgeXmlTechnicalData,
   formateDataForDoctype,
   parseTags,
   parseValue,
   parseUserPdl,
+  parseContracts,
+  parseContractStartDate,
+  parseServiceId,
 }
 
 
@@ -223699,7 +223713,6 @@ function rechercherPoint(appLogin, name, postalCode, inseeCode, address) {
     'info',
     `Query rechercherPoint - postal code / insee code: ${postalCode} / ${inseeCode}`
   )
-  //TODO: handle address
   return `<?xml version='1.0' encoding='utf-8'?>
   <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
      xmlns:v2="http://www.enedis.fr/sge/b2b/services/rechercherpoint/v2.0"
@@ -223812,7 +223825,7 @@ function commanderCollectePublicationMesures(
  * @param {string} appLogin
  * @param {string} contractId
  * @param {string} pointId
- * @param {string} serviceSouscritId
+ * @param {number} serviceSouscritId
  * @returns {*}
  */
 function commanderArretServiceSouscritMesures(
@@ -223864,40 +223877,66 @@ module.exports = {
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 // @ts-check
-const { log } = __webpack_require__(1)
+const { log, errors } = __webpack_require__(1)
 
 /**
- *
+ * @param {number} pointId
+ * @param {string} name
+ * @param {string} address
+ * @param {string} postalCode
+ * @param {string} inseeCode
+ * @returns {Consent}
  */
-function createBoConsent() {
+function createBoConsent(pointId, name, address, postalCode, inseeCode) {
   //TODO: Implement
   log('info', `Query createBoConsent`)
-  throw new Error('Function not implemented.')
+  return {
+    id: 1,
+    pointId,
+    name,
+    address,
+    postalCode,
+    inseeCode,
+  }
 }
 
 /**
- *
+ * @param {Consent} consent
+ * @param {number} serviceId
+ * @returns {Consent}
  */
-function updateBoConsent() {
+function updateBoConsent(consent, serviceId) {
   //TODO: Implement
   log('info', `Query updateBoConsent`)
-  throw new Error('Function not implemented.')
+  return {
+    ...consent,
+    serviceId: serviceId,
+  }
 }
 
 /**
- *
+ * @param {number} boId
+ * @returns {Consent}
  */
-function getBoConsent() {
+function getBoConsent(boId) {
   //TODO: Implement
   log('info', `Query getBoConsent`)
-  throw new Error('Function not implemented.')
+  return {
+    pointId: 1234,
+    name: 'SUBTIL',
+    address: 'mad',
+    postalCode: '69007',
+    inseeCode: '69383',
+    serviceId: 1234,
+  }
+  // throw errors.VENDOR_DOWN
 }
 /**
  *
  */
 function deleteBoConsent() {
   //TODO: deleteBoConsent
-  log('info', `Query createBoConsent`)
+  log('info', `Query deleteBoConsent`)
   throw new Error('Function not implemented.')
 }
 
@@ -223914,8 +223953,123 @@ module.exports = {
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 // @ts-check
-const { default: axios } = __webpack_require__(1559)
-const { log } = __webpack_require__(1)
+const { log, errors } = __webpack_require__(1)
+const { findUserPdl } = __webpack_require__(1559)
+const { getInseeCode } = __webpack_require__(1560)
+
+/**
+ * Verify user identity
+ * @param {object} fields
+ * @param {string} baseUrl
+ * @param {string} apiAuthKey
+ * @param {string} loginUtilisateur
+ * @returns {Promise<User>}
+ */
+async function verifyUserIdentity(
+  fields,
+  baseUrl,
+  apiAuthKey,
+  loginUtilisateur
+) {
+  const inseeCode = await getInseeCode(fields.postalCode)
+
+  const pdl = await findUserPdl(
+    `${baseUrl}/enedis_SDE_recherche-point/1.0`,
+    apiAuthKey,
+    loginUtilisateur,
+    fields.name,
+    fields.address,
+    fields.postalCode,
+    inseeCode
+  )
+
+  if (fields.pointId != pdl) {
+    log('error', 'PointId does not match')
+    throw errors.LOGIN_FAILED
+  }
+
+  return {
+    name: fields.name,
+    pointId: fields.pointId,
+    inseeCode,
+    postalCode: fields.postalCode,
+    address: fields.address,
+  }
+}
+
+module.exports = { verifyUserIdentity }
+
+
+/***/ }),
+/* 1559 */
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+// @ts-check
+const { log, errors } = __webpack_require__(1)
+const soapRequest = __webpack_require__(1331)
+const { parseUserPdl, parseTags, parseValue } = __webpack_require__(1555)
+const { rechercherPoint } = __webpack_require__(1556)
+const xml2js = __webpack_require__(1513)
+
+/**
+ * @param {string} url
+ * @param {string} apiAuthKey
+ * @param {string} appLogin
+ * @param {string} name
+ * @param {string} address
+ * @param {string} postalCode
+ * @param {string} inseeCode
+ * @return {Promise<string | null>} User Pdl
+ */
+async function findUserPdl(
+  url,
+  apiAuthKey,
+  appLogin,
+  name,
+  address,
+  postalCode,
+  inseeCode
+) {
+  log('info', 'Fetching user data')
+  const sgeHeaders = {
+    'Content-Type': 'text/xml;charset=UTF-8',
+    apikey: apiAuthKey,
+  }
+
+  const { response } = await soapRequest({
+    url: url,
+    headers: sgeHeaders,
+    xml: rechercherPoint(appLogin, name, postalCode, inseeCode, address),
+  }).catch(err => {
+    log('error', 'rechercherPointResponse')
+    log('error', err)
+    throw errors.LOGIN_FAILED
+  })
+
+  const parsedReply = await xml2js.parseStringPromise(response.body, {
+    tagNameProcessors: [parseTags],
+    valueProcessors: [parseValue],
+    explicitArray: false,
+  })
+
+  try {
+    return parseUserPdl(parsedReply)
+  } catch (error) {
+    log('error', 'Error while parsing user PDL: ' + error)
+    throw errors.LOGIN_FAILED
+  }
+}
+
+module.exports = { findUserPdl }
+
+
+/***/ }),
+/* 1560 */
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+// @ts-check
+const { default: axios } = __webpack_require__(1561)
+const { log, errors } = __webpack_require__(1)
 
 const API_URL = 'https://apicarto.ign.fr/api/codes-postaux/communes'
 
@@ -223923,7 +224077,7 @@ const API_URL = 'https://apicarto.ign.fr/api/codes-postaux/communes'
  * Return inseeCode given a postalCode
  * @param {string} postalCode
  * @param {string} [city]
- * @return {Promise<string | null>} inseeCode
+ * @return {Promise<string>} inseeCode
  */
 async function getInseeCode(postalCode, city) {
   try {
@@ -223933,7 +224087,7 @@ async function getInseeCode(postalCode, city) {
     if (response.data.length === 1) {
       return response.data[0].codeCommune
     } else {
-      if (!city) return null
+      if (!city) throw errors.USER_ACTION_NEEDED
 
       const filteredResponse = response.data.filter(
         town => town.nomCommune.toLowerCase() === city.toLowerCase()
@@ -223945,7 +224099,7 @@ async function getInseeCode(postalCode, city) {
       'error',
       `Query getInseeCode failed for postalCode ${postalCode} / ${city}`
     )
-    return null
+    throw errors.USER_ACTION_NEEDED
   }
 }
 
@@ -223955,23 +224109,23 @@ module.exports = {
 
 
 /***/ }),
-/* 1559 */
+/* 1561 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
-module.exports = __webpack_require__(1560);
+module.exports = __webpack_require__(1562);
 
 /***/ }),
-/* 1560 */
+/* 1562 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 "use strict";
 
 
-var utils = __webpack_require__(1561);
-var bind = __webpack_require__(1562);
-var Axios = __webpack_require__(1563);
-var mergeConfig = __webpack_require__(1591);
-var defaults = __webpack_require__(1568);
+var utils = __webpack_require__(1563);
+var bind = __webpack_require__(1564);
+var Axios = __webpack_require__(1565);
+var mergeConfig = __webpack_require__(1593);
+var defaults = __webpack_require__(1570);
 
 /**
  * Create an instance of Axios
@@ -224004,14 +224158,14 @@ var axios = createInstance(defaults);
 axios.Axios = Axios;
 
 // Expose Cancel & CancelToken
-axios.CanceledError = __webpack_require__(1581);
-axios.CancelToken = __webpack_require__(1593);
-axios.isCancel = __webpack_require__(1590);
-axios.VERSION = (__webpack_require__(1586).version);
-axios.toFormData = __webpack_require__(1572);
+axios.CanceledError = __webpack_require__(1583);
+axios.CancelToken = __webpack_require__(1595);
+axios.isCancel = __webpack_require__(1592);
+axios.VERSION = (__webpack_require__(1588).version);
+axios.toFormData = __webpack_require__(1574);
 
 // Expose AxiosError class
-axios.AxiosError = __webpack_require__(1570);
+axios.AxiosError = __webpack_require__(1572);
 
 // alias for CanceledError for backward compatibility
 axios.Cancel = axios.CanceledError;
@@ -224020,10 +224174,10 @@ axios.Cancel = axios.CanceledError;
 axios.all = function all(promises) {
   return Promise.all(promises);
 };
-axios.spread = __webpack_require__(1594);
+axios.spread = __webpack_require__(1596);
 
 // Expose isAxiosError
-axios.isAxiosError = __webpack_require__(1595);
+axios.isAxiosError = __webpack_require__(1597);
 
 module.exports = axios;
 
@@ -224032,13 +224186,13 @@ module.exports["default"] = axios;
 
 
 /***/ }),
-/* 1561 */
+/* 1563 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 "use strict";
 
 
-var bind = __webpack_require__(1562);
+var bind = __webpack_require__(1564);
 
 // utils is a library of generic helper functions non-specific to axios
 
@@ -224509,7 +224663,7 @@ module.exports = {
 
 
 /***/ }),
-/* 1562 */
+/* 1564 */
 /***/ ((module) => {
 
 "use strict";
@@ -224527,19 +224681,19 @@ module.exports = function bind(fn, thisArg) {
 
 
 /***/ }),
-/* 1563 */
+/* 1565 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 "use strict";
 
 
-var utils = __webpack_require__(1561);
-var buildURL = __webpack_require__(1564);
-var InterceptorManager = __webpack_require__(1565);
-var dispatchRequest = __webpack_require__(1566);
-var mergeConfig = __webpack_require__(1591);
-var buildFullPath = __webpack_require__(1576);
-var validator = __webpack_require__(1592);
+var utils = __webpack_require__(1563);
+var buildURL = __webpack_require__(1566);
+var InterceptorManager = __webpack_require__(1567);
+var dispatchRequest = __webpack_require__(1568);
+var mergeConfig = __webpack_require__(1593);
+var buildFullPath = __webpack_require__(1578);
+var validator = __webpack_require__(1594);
 
 var validators = validator.validators;
 /**
@@ -224694,13 +224848,13 @@ module.exports = Axios;
 
 
 /***/ }),
-/* 1564 */
+/* 1566 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 "use strict";
 
 
-var utils = __webpack_require__(1561);
+var utils = __webpack_require__(1563);
 
 function encode(val) {
   return encodeURIComponent(val).
@@ -224771,13 +224925,13 @@ module.exports = function buildURL(url, params, paramsSerializer) {
 
 
 /***/ }),
-/* 1565 */
+/* 1567 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 "use strict";
 
 
-var utils = __webpack_require__(1561);
+var utils = __webpack_require__(1563);
 
 function InterceptorManager() {
   this.handlers = [];
@@ -224832,17 +224986,17 @@ module.exports = InterceptorManager;
 
 
 /***/ }),
-/* 1566 */
+/* 1568 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 "use strict";
 
 
-var utils = __webpack_require__(1561);
-var transformData = __webpack_require__(1567);
-var isCancel = __webpack_require__(1590);
-var defaults = __webpack_require__(1568);
-var CanceledError = __webpack_require__(1581);
+var utils = __webpack_require__(1563);
+var transformData = __webpack_require__(1569);
+var isCancel = __webpack_require__(1592);
+var defaults = __webpack_require__(1570);
+var CanceledError = __webpack_require__(1583);
 
 /**
  * Throws a `CanceledError` if cancellation has been requested.
@@ -224926,14 +225080,14 @@ module.exports = function dispatchRequest(config) {
 
 
 /***/ }),
-/* 1567 */
+/* 1569 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 "use strict";
 
 
-var utils = __webpack_require__(1561);
-var defaults = __webpack_require__(1568);
+var utils = __webpack_require__(1563);
+var defaults = __webpack_require__(1570);
 
 /**
  * Transform the data for a request or a response
@@ -224955,17 +225109,17 @@ module.exports = function transformData(data, headers, fns) {
 
 
 /***/ }),
-/* 1568 */
+/* 1570 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 "use strict";
 
 
-var utils = __webpack_require__(1561);
-var normalizeHeaderName = __webpack_require__(1569);
-var AxiosError = __webpack_require__(1570);
-var transitionalDefaults = __webpack_require__(1571);
-var toFormData = __webpack_require__(1572);
+var utils = __webpack_require__(1563);
+var normalizeHeaderName = __webpack_require__(1571);
+var AxiosError = __webpack_require__(1572);
+var transitionalDefaults = __webpack_require__(1573);
+var toFormData = __webpack_require__(1574);
 
 var DEFAULT_CONTENT_TYPE = {
   'Content-Type': 'application/x-www-form-urlencoded'
@@ -224981,10 +225135,10 @@ function getDefaultAdapter() {
   var adapter;
   if (typeof XMLHttpRequest !== 'undefined') {
     // For browsers use XHR adapter
-    adapter = __webpack_require__(1573);
+    adapter = __webpack_require__(1575);
   } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {
     // For node use HTTP adapter
-    adapter = __webpack_require__(1583);
+    adapter = __webpack_require__(1585);
   }
   return adapter;
 }
@@ -225082,7 +225236,7 @@ var defaults = {
   maxBodyLength: -1,
 
   env: {
-    FormData: __webpack_require__(1587)
+    FormData: __webpack_require__(1589)
   },
 
   validateStatus: function validateStatus(status) {
@@ -225108,13 +225262,13 @@ module.exports = defaults;
 
 
 /***/ }),
-/* 1569 */
+/* 1571 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 "use strict";
 
 
-var utils = __webpack_require__(1561);
+var utils = __webpack_require__(1563);
 
 module.exports = function normalizeHeaderName(headers, normalizedName) {
   utils.forEach(headers, function processHeader(value, name) {
@@ -225127,13 +225281,13 @@ module.exports = function normalizeHeaderName(headers, normalizedName) {
 
 
 /***/ }),
-/* 1570 */
+/* 1572 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 "use strict";
 
 
-var utils = __webpack_require__(1561);
+var utils = __webpack_require__(1563);
 
 /**
  * Create an Error with the specified message, config, error code, request and response.
@@ -225220,7 +225374,7 @@ module.exports = AxiosError;
 
 
 /***/ }),
-/* 1571 */
+/* 1573 */
 /***/ ((module) => {
 
 "use strict";
@@ -225234,13 +225388,13 @@ module.exports = {
 
 
 /***/ }),
-/* 1572 */
+/* 1574 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 "use strict";
 
 
-var utils = __webpack_require__(1561);
+var utils = __webpack_require__(1563);
 
 /**
  * Convert a data object to FormData
@@ -225313,23 +225467,23 @@ module.exports = toFormData;
 
 
 /***/ }),
-/* 1573 */
+/* 1575 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 "use strict";
 
 
-var utils = __webpack_require__(1561);
-var settle = __webpack_require__(1574);
-var cookies = __webpack_require__(1575);
-var buildURL = __webpack_require__(1564);
-var buildFullPath = __webpack_require__(1576);
-var parseHeaders = __webpack_require__(1579);
-var isURLSameOrigin = __webpack_require__(1580);
-var transitionalDefaults = __webpack_require__(1571);
-var AxiosError = __webpack_require__(1570);
-var CanceledError = __webpack_require__(1581);
-var parseProtocol = __webpack_require__(1582);
+var utils = __webpack_require__(1563);
+var settle = __webpack_require__(1576);
+var cookies = __webpack_require__(1577);
+var buildURL = __webpack_require__(1566);
+var buildFullPath = __webpack_require__(1578);
+var parseHeaders = __webpack_require__(1581);
+var isURLSameOrigin = __webpack_require__(1582);
+var transitionalDefaults = __webpack_require__(1573);
+var AxiosError = __webpack_require__(1572);
+var CanceledError = __webpack_require__(1583);
+var parseProtocol = __webpack_require__(1584);
 
 module.exports = function xhrAdapter(config) {
   return new Promise(function dispatchXhrRequest(resolve, reject) {
@@ -225542,13 +225696,13 @@ module.exports = function xhrAdapter(config) {
 
 
 /***/ }),
-/* 1574 */
+/* 1576 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 "use strict";
 
 
-var AxiosError = __webpack_require__(1570);
+var AxiosError = __webpack_require__(1572);
 
 /**
  * Resolve or reject a Promise based on response status.
@@ -225574,13 +225728,13 @@ module.exports = function settle(resolve, reject, response) {
 
 
 /***/ }),
-/* 1575 */
+/* 1577 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 "use strict";
 
 
-var utils = __webpack_require__(1561);
+var utils = __webpack_require__(1563);
 
 module.exports = (
   utils.isStandardBrowserEnv() ?
@@ -225634,14 +225788,14 @@ module.exports = (
 
 
 /***/ }),
-/* 1576 */
+/* 1578 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 "use strict";
 
 
-var isAbsoluteURL = __webpack_require__(1577);
-var combineURLs = __webpack_require__(1578);
+var isAbsoluteURL = __webpack_require__(1579);
+var combineURLs = __webpack_require__(1580);
 
 /**
  * Creates a new URL by combining the baseURL with the requestedURL,
@@ -225661,7 +225815,7 @@ module.exports = function buildFullPath(baseURL, requestedURL) {
 
 
 /***/ }),
-/* 1577 */
+/* 1579 */
 /***/ ((module) => {
 
 "use strict";
@@ -225682,7 +225836,7 @@ module.exports = function isAbsoluteURL(url) {
 
 
 /***/ }),
-/* 1578 */
+/* 1580 */
 /***/ ((module) => {
 
 "use strict";
@@ -225703,13 +225857,13 @@ module.exports = function combineURLs(baseURL, relativeURL) {
 
 
 /***/ }),
-/* 1579 */
+/* 1581 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 "use strict";
 
 
-var utils = __webpack_require__(1561);
+var utils = __webpack_require__(1563);
 
 // Headers whose duplicates are ignored by node
 // c.f. https://nodejs.org/api/http.html#http_message_headers
@@ -225763,13 +225917,13 @@ module.exports = function parseHeaders(headers) {
 
 
 /***/ }),
-/* 1580 */
+/* 1582 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 "use strict";
 
 
-var utils = __webpack_require__(1561);
+var utils = __webpack_require__(1563);
 
 module.exports = (
   utils.isStandardBrowserEnv() ?
@@ -225838,14 +225992,14 @@ module.exports = (
 
 
 /***/ }),
-/* 1581 */
+/* 1583 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 "use strict";
 
 
-var AxiosError = __webpack_require__(1570);
-var utils = __webpack_require__(1561);
+var AxiosError = __webpack_require__(1572);
+var utils = __webpack_require__(1563);
 
 /**
  * A `CanceledError` is an object that is thrown when an operation is canceled.
@@ -225867,7 +226021,7 @@ module.exports = CanceledError;
 
 
 /***/ }),
-/* 1582 */
+/* 1584 */
 /***/ ((module) => {
 
 "use strict";
@@ -225880,26 +226034,26 @@ module.exports = function parseProtocol(url) {
 
 
 /***/ }),
-/* 1583 */
+/* 1585 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 "use strict";
 
 
-var utils = __webpack_require__(1561);
-var settle = __webpack_require__(1574);
-var buildFullPath = __webpack_require__(1576);
-var buildURL = __webpack_require__(1564);
+var utils = __webpack_require__(1563);
+var settle = __webpack_require__(1576);
+var buildFullPath = __webpack_require__(1578);
+var buildURL = __webpack_require__(1566);
 var http = __webpack_require__(80);
 var https = __webpack_require__(81);
-var httpFollow = (__webpack_require__(1584).http);
-var httpsFollow = (__webpack_require__(1584).https);
+var httpFollow = (__webpack_require__(1586).http);
+var httpsFollow = (__webpack_require__(1586).https);
 var url = __webpack_require__(63);
 var zlib = __webpack_require__(83);
-var VERSION = (__webpack_require__(1586).version);
-var transitionalDefaults = __webpack_require__(1571);
-var AxiosError = __webpack_require__(1570);
-var CanceledError = __webpack_require__(1581);
+var VERSION = (__webpack_require__(1588).version);
+var transitionalDefaults = __webpack_require__(1573);
+var AxiosError = __webpack_require__(1572);
+var CanceledError = __webpack_require__(1583);
 
 var isHttps = /https:?/;
 
@@ -226311,7 +226465,7 @@ module.exports = function httpAdapter(config) {
 
 
 /***/ }),
-/* 1584 */
+/* 1586 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 var url = __webpack_require__(63);
@@ -226320,7 +226474,7 @@ var http = __webpack_require__(80);
 var https = __webpack_require__(81);
 var Writable = (__webpack_require__(82).Writable);
 var assert = __webpack_require__(91);
-var debug = __webpack_require__(1585);
+var debug = __webpack_require__(1587);
 
 // Create handlers that pass events from native requests
 var events = ["abort", "aborted", "connect", "error", "socket", "timeout"];
@@ -226915,7 +227069,7 @@ module.exports.wrap = wrap;
 
 
 /***/ }),
-/* 1585 */
+/* 1587 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 var debug;
@@ -226936,7 +227090,7 @@ module.exports = function () {
 
 
 /***/ }),
-/* 1586 */
+/* 1588 */
 /***/ ((module) => {
 
 module.exports = {
@@ -226944,15 +227098,15 @@ module.exports = {
 };
 
 /***/ }),
-/* 1587 */
+/* 1589 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 // eslint-disable-next-line strict
-module.exports = __webpack_require__(1588);
+module.exports = __webpack_require__(1590);
 
 
 /***/ }),
-/* 1588 */
+/* 1590 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 var CombinedStream = __webpack_require__(147);
@@ -226965,7 +227119,7 @@ var fs = __webpack_require__(149);
 var Stream = (__webpack_require__(82).Stream);
 var mime = __webpack_require__(139);
 var asynckit = __webpack_require__(150);
-var populate = __webpack_require__(1589);
+var populate = __webpack_require__(1591);
 
 // Public API
 module.exports = FormData;
@@ -227459,7 +227613,7 @@ FormData.prototype.toString = function () {
 
 
 /***/ }),
-/* 1589 */
+/* 1591 */
 /***/ ((module) => {
 
 // populates missing values
@@ -227475,7 +227629,7 @@ module.exports = function(dst, src) {
 
 
 /***/ }),
-/* 1590 */
+/* 1592 */
 /***/ ((module) => {
 
 "use strict";
@@ -227487,13 +227641,13 @@ module.exports = function isCancel(value) {
 
 
 /***/ }),
-/* 1591 */
+/* 1593 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 "use strict";
 
 
-var utils = __webpack_require__(1561);
+var utils = __webpack_require__(1563);
 
 /**
  * Config-specific merge-function which creates a new config-object
@@ -227594,14 +227748,14 @@ module.exports = function mergeConfig(config1, config2) {
 
 
 /***/ }),
-/* 1592 */
+/* 1594 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 "use strict";
 
 
-var VERSION = (__webpack_require__(1586).version);
-var AxiosError = __webpack_require__(1570);
+var VERSION = (__webpack_require__(1588).version);
+var AxiosError = __webpack_require__(1572);
 
 var validators = {};
 
@@ -227687,13 +227841,13 @@ module.exports = {
 
 
 /***/ }),
-/* 1593 */
+/* 1595 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 "use strict";
 
 
-var CanceledError = __webpack_require__(1581);
+var CanceledError = __webpack_require__(1583);
 
 /**
  * A `CancelToken` is an object that can be used to request cancellation of an operation.
@@ -227813,7 +227967,7 @@ module.exports = CancelToken;
 
 
 /***/ }),
-/* 1594 */
+/* 1596 */
 /***/ ((module) => {
 
 "use strict";
@@ -227847,13 +228001,13 @@ module.exports = function spread(callback) {
 
 
 /***/ }),
-/* 1595 */
+/* 1597 */
 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
 "use strict";
 
 
-var utils = __webpack_require__(1561);
+var utils = __webpack_require__(1563);
 
 /**
  * Determines whether the payload is an error thrown by Axios
@@ -227866,6 +228020,259 @@ module.exports = function isAxiosError(payload) {
 };
 
 
+/***/ }),
+/* 1598 */
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+// @ts-check
+const { log, errors } = __webpack_require__(1)
+const soapRequest = __webpack_require__(1331)
+const { parseTags, parseValue, parseServiceId } = __webpack_require__(1555)
+const { commanderCollectePublicationMesures } = __webpack_require__(1556)
+const xml2js = __webpack_require__(1513)
+
+/**
+ * @param {string} url
+ * @param {string} apiAuthKey
+ * @param {string} appLogin
+ * @param {string} name
+ * @param {string} pointId
+ * @param {string} startDate
+ * @param {string} endDate
+ * @return {Promise<number>} User contractId
+ */
+async function activateContract(
+  url,
+  apiAuthKey,
+  appLogin,
+  contractId,
+  name,
+  pointId,
+  startDate,
+  endDate
+) {
+  log('info', 'activateContract')
+  const sgeHeaders = {
+    'Content-Type': 'text/xml;charset=UTF-8',
+    apikey: apiAuthKey,
+  }
+
+  const { response } = await soapRequest({
+    url: url,
+    headers: sgeHeaders,
+    xml: commanderCollectePublicationMesures(
+      appLogin,
+      contractId,
+      pointId,
+      name,
+      startDate,
+      endDate
+    ),
+  }).catch(err => {
+    log('error', 'commanderCollectePublicationMesures')
+    log('error', err)
+    throw errors.LOGIN_FAILED
+  })
+
+  const parsedReply = await xml2js.parseStringPromise(response.body, {
+    tagNameProcessors: [parseTags],
+    valueProcessors: [parseValue],
+    explicitArray: false,
+  })
+
+  try {
+    return parseServiceId(parsedReply)
+  } catch (error) {
+    log('error', 'Error while parsing user PDL: ' + error)
+    throw errors.LOGIN_FAILED
+  }
+}
+
+module.exports = { activateContract }
+
+
+/***/ }),
+/* 1599 */
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+// @ts-check
+const { log, errors } = __webpack_require__(1)
+const soapRequest = __webpack_require__(1331)
+const { parseTags, parseValue, parseContracts } = __webpack_require__(1555)
+const { rechercherServicesSouscritsMesures } = __webpack_require__(1556)
+const xml2js = __webpack_require__(1513)
+const { contractState } = __webpack_require__(1600)
+
+/**
+ * @param {string} url
+ * @param {string} apiAuthKey
+ * @param {string} appLogin
+ * @param {string} pointId
+ * @return {Promise<number | null>} User contractId
+ */
+async function verifyContract(url, apiAuthKey, appLogin, contractId, pointId) {
+  log('info', 'verifyContract')
+  const sgeHeaders = {
+    'Content-Type': 'text/xml;charset=UTF-8',
+    apikey: apiAuthKey,
+  }
+
+  const { response } = await soapRequest({
+    url: `${url}/enedis_SGE_RechercheServicesMesures/1.0`,
+    headers: sgeHeaders,
+    xml: rechercherServicesSouscritsMesures(appLogin, contractId, pointId),
+  }).catch(err => {
+    log('error', 'rechercherServicesSouscritsMesures')
+    log('error', err)
+    throw errors.LOGIN_FAILED
+  })
+
+  const parsedReply = await xml2js.parseStringPromise(response.body, {
+    tagNameProcessors: [parseTags],
+    valueProcessors: [parseValue],
+    explicitArray: false,
+  })
+
+  try {
+    const currentContract = parseContracts(parsedReply)[0]
+    if (currentContract.etatCode === contractState.ACTIF)
+      return currentContract.serviceSouscritId
+    return null
+  } catch (error) {
+    log('error', 'Error while parsing user contract: ' + error)
+    throw errors.LOGIN_FAILED
+  }
+}
+
+module.exports = { verifyContract }
+
+
+/***/ }),
+/* 1600 */
+/***/ ((module) => {
+
+/**
+ * Enum for contract-state values.
+ * @readonly
+ * @enum {number}
+ */
+const contractState = {
+  TERMINE: 'TERMINE',
+  ACTIF: 'ACTIF',
+}
+
+module.exports = { contractState }
+
+
+/***/ }),
+/* 1601 */
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+// @ts-check
+const { log, errors } = __webpack_require__(1)
+const soapRequest = __webpack_require__(1331)
+const { parseTags, parseValue } = __webpack_require__(1555)
+const { commanderArretServiceSouscritMesures } = __webpack_require__(1556)
+const xml2js = __webpack_require__(1513)
+
+/**
+ * @param {string} url
+ * @param {string} apiAuthKey
+ * @param {string} appLogin
+ * @param {string} pointId
+ * @param {number} serviceId
+ * @return {Promise<string>} User contractId
+ */
+async function terminateContract(
+  url,
+  apiAuthKey,
+  appLogin,
+  contractId,
+  pointId,
+  serviceId
+) {
+  log('info', 'activateContract')
+  const sgeHeaders = {
+    'Content-Type': 'text/xml;charset=UTF-8',
+    apikey: apiAuthKey,
+  }
+
+  const { response } = await soapRequest({
+    url: url,
+    headers: sgeHeaders,
+    xml: commanderArretServiceSouscritMesures(
+      appLogin,
+      contractId,
+      pointId,
+      serviceId
+    ),
+  }).catch(err => {
+    log('error', 'commanderArretServiceSouscritMesures')
+    log('error', err)
+    throw errors.VENDOR_DOWN
+  })
+
+  const parsedReply = await xml2js.parseStringPromise(response.body, {
+    tagNameProcessors: [parseTags],
+    valueProcessors: [parseValue],
+    explicitArray: false,
+  })
+
+  try {
+    // We don't need any action on reply for now
+    return parsedReply
+  } catch (error) {
+    log('error', 'Error while parsing user contract termination: ' + error)
+    throw errors.VENDOR_DOWN
+  }
+}
+
+module.exports = { terminateContract }
+
+
+/***/ }),
+/* 1602 */
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+const { log, updateOrCreate } = __webpack_require__(1)
+const { iSLocal } = __webpack_require__(1603)
+const cozyClient = __webpack_require__(485)
+
+async function saveAccountData(accountId, accountData) {
+  log('info', `saveAccountData: ${accountId}`)
+
+  let account = await getAccount(accountId)
+
+  account = await updateOrCreate(
+    [{ ...account, data: accountData }],
+    'io.cozy.accounts'
+  )
+  return account
+}
+
+async function getAccount(accountId) {
+  log('info', `getAccount: ${accountId}`)
+  //TODO: refactor with usageof cozy-libs. Not working during implementation
+  const accounts = await cozyClient.data.findAll('io.cozy.accounts')
+  return accounts.filter(account =>
+    iSLocal() ? account._id === accountId : account.account_type === accountId
+  )[0]
+}
+
+module.exports = { getAccount, saveAccountData }
+
+
+/***/ }),
+/* 1603 */
+/***/ ((module) => {
+
+function iSLocal() {
+  return process.env.NODE_ENV === 'development' || process.env.NODE_ENV
+}
+
+module.exports = { iSLocal }
+
+
 /***/ })
 /******/ 	]);
 /************************************************************************/
diff --git a/manifest.konnector b/manifest.konnector
index e26d1d5f5e99005e71c97dea70c3171a24e71b9e..f9b5284b932f869a6be001de1545d259e1414de5 100644
--- a/manifest.konnector
+++ b/manifest.konnector
@@ -20,8 +20,7 @@
   "screenshots": [],
   "permissions": {
     "accounts": {
-      "type": "io.cozy.accounts",
-      "verbs": ["GET"]
+      "type": "io.cozy.accounts"
     },
     "files": {
       "type": "io.cozy.files"
diff --git a/package.json b/package.json
index 5b69af56f7f1e5d173be72544c09999b3de759d1..87eab8c4ab9a44615f57bef7762ab4a9456bd7d2 100644
--- a/package.json
+++ b/package.json
@@ -19,11 +19,6 @@
     "build",
     "data"
   ],
-  "husky": {
-    "hooks": {
-      "pre-commit": "yarn lint"
-    }
-  },
   "scripts": {
     "start": "node ./src/index.js",
     "dev": "cozy-konnector-dev",
@@ -49,7 +44,7 @@
     "xml2js": "^0.4.23"
   },
   "devDependencies": {
-    "cozy-jobs-cli": "1.19.0",
+    "cozy-jobs-cli": "1.18.2",
     "cozy-konnector-build": "1.3.4",
     "eslint-config-cozy-app": "1.3.3",
     "eslint-plugin-prettier": "^4.0.0",