Skip to content
Snippets Groups Projects
index.js 7.56 MiB
Newer Older
Hugo NOUTS's avatar
Hugo NOUTS committed
/******/ (() => { // webpackBootstrap
/******/ 	var __webpack_modules__ = ([
/* 0 */
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {

// @ts-check
const {
  BaseKonnector,
  log,
  hydrateAndFilter,
  addData,
Hugo SUBTIL's avatar
Hugo SUBTIL committed
  errors,
Hugo NOUTS's avatar
Hugo NOUTS committed
} = __webpack_require__(1)
Hugo SUBTIL's avatar
Hugo SUBTIL committed
const soapRequest = __webpack_require__(1331)
const moment = __webpack_require__(1373)
__webpack_require__(1510)
const xml2js = __webpack_require__(1513)
const { buildAgregatedData } = __webpack_require__(1554)
Hugo NOUTS's avatar
Hugo NOUTS committed
const {
  parseSgeXmlData,
  formateDataForDoctype,
  parseTags,
  parseValue,
Hugo SUBTIL's avatar
Hugo SUBTIL committed
} = __webpack_require__(1555)
build-token's avatar
build-token committed
const {
Hugo SUBTIL's avatar
Hugo SUBTIL committed
  consultationMesuresDetailleesMaxPower,
  consultationMesuresDetaillees,
} = __webpack_require__(1556)
const {
  updateBoConsent,
  createBoConsent,
  getBoConsent,
  deleteBoConsent,
} = __webpack_require__(1557)
const {
  verifyUserIdentity,
  activateContract,
  verifyContract,
  terminateContract,
  getContractStartDate,
} = __webpack_require__(1595)
const { getAccount, saveAccountData } = __webpack_require__(1604)
const { isLocal } = __webpack_require__(1605)
Hugo SUBTIL's avatar
Hugo SUBTIL committed

Hugo NOUTS's avatar
Hugo NOUTS committed
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
  ? moment().subtract(12, 'month')
  : moment().subtract(6, 'month')
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'
Hugo NOUTS's avatar
Hugo NOUTS committed

module.exports = new BaseKonnector(start)

Hugo SUBTIL's avatar
Hugo SUBTIL committed
/**
 * 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
 */
Hugo NOUTS's avatar
Hugo NOUTS committed
async function start(fields, cozyParameters) {
Hugo SUBTIL's avatar
Hugo SUBTIL committed
  log('info', 'Konnector configuration ...')

  const pointId = parseInt(fields.pointId)
Hugo NOUTS's avatar
Hugo NOUTS committed
  let baseUrl = fields.wso2BaseUrl
  let apiAuthKey = fields.apiToken
Hugo SUBTIL's avatar
Hugo SUBTIL committed
  let contractId = fields.contractId
  let sgeLogin = fields.sgeLogin
Hugo SUBTIL's avatar
Hugo SUBTIL committed
  let boToken = fields.boToken
  let boBaseUrl = fields.boBaseUrl
Hugo NOUTS's avatar
Hugo NOUTS committed
  if (cozyParameters && Object.keys(cozyParameters).length !== 0) {
    log('debug', 'Found COZY_PARAMETERS')
    baseUrl = cozyParameters.secret.wso2BaseUrl
    apiAuthKey = cozyParameters.secret.apiToken
Hugo SUBTIL's avatar
Hugo SUBTIL committed
    contractId = cozyParameters.secret.contractId
    sgeLogin = cozyParameters.secret.sgeLogin
Hugo SUBTIL's avatar
Hugo SUBTIL committed
    boBaseUrl = cozyParameters.secret.boBaseUrl
    boToken = cozyParameters.secret.boToken
  }

  // Prevent missing configuration
  if (
    !baseUrl ||
    !apiAuthKey ||
    !contractId ||
    !sgeLogin ||
    !boToken ||
    !boBaseUrl
  ) {
    log('error', `Missing configuration secrets`)
    throw errors.VENDOR_DOWN
Hugo SUBTIL's avatar
Hugo SUBTIL committed
  }

  /**
   * If it's first start we have to do the following operations:
   * - verify pdl are matching
   * - BO: create backoffice consent
   * - get contract start date and store it
   * - activate half-hour
   * - BO: update consent with service ID
   */
  log('info', 'User Logging...')

  if (isFirstStart(await getAccount(ACCOUNT_ID))) {
Hugo SUBTIL's avatar
Hugo SUBTIL committed
    const user = await verifyUserIdentity(fields, baseUrl, apiAuthKey, sgeLogin)

    let consent = await createBoConsent(
Hugo SUBTIL's avatar
Hugo SUBTIL committed
      boBaseUrl,
      boToken,
Hugo SUBTIL's avatar
Hugo SUBTIL committed
      pointId,
      user.lastname,
      user.firstname,
      user.address,
      user.postalCode,
      user.inseeCode
    )
Hugo SUBTIL's avatar
Hugo SUBTIL committed

    // handle user contract start date in order to preperly request data
    const userContractstartDate = await getContractStartDate(
      baseUrl,
      apiAuthKey,
      sgeLogin,
      pointId
    )
    startDailyDate = moment(userContractstartDate, 'YYYY-MM-DD')
    startDailyDateString = startDailyDate.format('YYYY-MM-DD')
Hugo SUBTIL's avatar
Hugo SUBTIL committed

    const contractStartDate = moment().format('YYYY-MM-DD')
    const contractEndDate = moment()
Hugo SUBTIL's avatar
Hugo SUBTIL committed
      .add(1, 'year') // SGE force 1 year duration
Hugo SUBTIL's avatar
Hugo SUBTIL committed
      .format('YYYY-MM-DD')

    let serviceId = await verifyContract(
      baseUrl,
      apiAuthKey,
      sgeLogin,
      contractId,
      user.pointId
    )
    if (!serviceId) {
      serviceId = await activateContract(
        baseUrl,
        apiAuthKey,
        sgeLogin,
        contractId,
        user.lastname,
        user.pointId,
        contractStartDate,
        contractEndDate
      )
    }
Hugo SUBTIL's avatar
Hugo SUBTIL committed
    consent = await updateBoConsent(
      boBaseUrl,
      boToken,
      consent,
      serviceId.toString()
    )
Hugo SUBTIL's avatar
Hugo SUBTIL committed
    // Save bo id into account
    const accountData = await getAccount(ACCOUNT_ID)

    await saveAccountData(this.accountId, {
      ...accountData.data,
Hugo SUBTIL's avatar
Hugo SUBTIL committed
      consentId: consent.ID,
Hugo SUBTIL's avatar
Hugo SUBTIL committed
    })
  } else {
    // AlternateStart
    const accountData = await getAccount(ACCOUNT_ID)
Hugo SUBTIL's avatar
Hugo SUBTIL committed
    const userConsent = await getBoConsent(
      boBaseUrl,
      boToken,
      accountData.data.consentId
    )
    const user = await verifyUserIdentity(
      fields,
      baseUrl,
      apiAuthKey,
      sgeLogin,
      true
    )
Hugo SUBTIL's avatar
Hugo SUBTIL committed

Hugo SUBTIL's avatar
Hugo SUBTIL committed
    if (!userConsent) {
      log('error', 'No user consent found')
      throw errors.VENDOR_DOWN
    }

    const consentEndDate = Date.parse(userConsent.endDate)
    const today = Date.now()
    if (
      user.lastname.toLocaleUpperCase() !==
        userConsent.lastname.toLocaleUpperCase() ||
Loading
Loading full blame...