From 0fbe85e9d6e338999268404990847c16150dd0fc Mon Sep 17 00:00:00 2001 From: build-token <build-token> Date: Wed, 5 Oct 2022 08:59:49 +0000 Subject: [PATCH] publish: feat: add safetyOnBoarding path generated from commit c866549ffe8fcfaa76d41ff630235bba3cbeaaad --- index.js | 224 ++++++++++++++++++++++++++++++++++++++++++--- onDeleteAccount.js | 102 ++++++++++++++++++--- 2 files changed, 297 insertions(+), 29 deletions(-) diff --git a/index.js b/index.js index c4e1c73..71d738d 100644 --- a/index.js +++ b/index.js @@ -39,8 +39,8 @@ const { terminateContract, getContractStartDate, } = __webpack_require__(1595) -const { getAccount, saveAccountData } = __webpack_require__(1604) -const { isLocal } = __webpack_require__(1605) +const { getAccount, saveAccountData } = __webpack_require__(1605) +const { isLocal } = __webpack_require__(1606) moment.locale('fr') // set the language moment.tz.setDefault('Europe/Paris') // set the timezone @@ -125,7 +125,8 @@ async function start(fields, cozyParameters) { user.address, user.postalCode, user.inseeCode, - user.city + user.city, + user.hasBeenThroughtSafetyOnBoarding ) // handle user contract start date in order to preperly request data @@ -223531,6 +223532,18 @@ function parseContractStartDate(result) { 'dateDerniereModificationFormuleTarifaireAcheminement' ] } +/** + * Return User address + * @param {string} result + * @returns {Address} + */ +function parseUserAddress(result) { + log('info', 'Parsing user Address') + const json = JSON.stringify(result) + return JSON.parse(json)['Envelope']['Body'][ + 'consulterDonneesTechniquesContractuellesResponse' + ]['point']['donneesGenerales']['adresseInstallation'] +} /** * Return User contract start date @@ -223629,6 +223642,24 @@ function parseValue(value, name) { return value } +/** + * Remove SGE useless multiple white spaces + * @param {string} str + * @returns {string} + */ +function removeMultipleSpaces(str) { + return str.replace(/ +/g, ' ') +} + +/** + * Remove SGE useless multiple white spaces + * @param {string} str + * @returns {string} + */ +function removeAddressnumber(str) { + return str.replace(/[0-9]|b |B |T |t /g, '') +} + module.exports = { parseSgeXmlData, formateDataForDoctype, @@ -223638,7 +223669,10 @@ module.exports = { parseContracts, parseContractStartDate, parseServiceId, + parseUserAddress, checkContractExists, + removeMultipleSpaces, + removeAddressnumber, } @@ -223750,7 +223784,11 @@ function consultationMesuresDetailleesMaxPower( * @param {string} appLogin * @returns {string} */ -function consulterDonneesTechniquesContractuelles(pointId, appLogin) { +function consulterDonneesTechniquesContractuelles( + pointId, + appLogin, + consent = true +) { log('info', `Query consulterDonneesTechniquesContractuelles`) return `<?xml version='1.0' encoding='utf-8'?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" @@ -223761,7 +223799,7 @@ function consulterDonneesTechniquesContractuelles(pointId, appLogin) { <v2:consulterDonneesTechniquesContractuelles> <pointId>${pointId}</pointId> <loginUtilisateur>${appLogin}</loginUtilisateur> - <autorisationClient>true</autorisationClient> + <autorisationClient>${consent}</autorisationClient> </v2:consulterDonneesTechniquesContractuelles> </soapenv:Body> </soapenv:Envelope> @@ -223773,14 +223811,45 @@ function consulterDonneesTechniquesContractuelles(pointId, appLogin) { * @param {string} name * @param {string} postalCode * @param {string} inseeCode - * @param {string} [address] + * @param {string} address + * @param {string} [escalierEtEtageEtAppartement] * @returns {string} PDL */ -function rechercherPoint(appLogin, name, postalCode, inseeCode, address) { +function rechercherPoint( + appLogin, + name, + postalCode, + inseeCode, + address, + escalierEtEtageEtAppartement +) { log( 'info', `Query rechercherPoint - postal code : ${postalCode} / insee code: ${inseeCode}` ) + if (escalierEtEtageEtAppartement) { + 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" + xmlns:v1="http://www.enedis.fr/sge/b2b/technique/v1.0"> + <soapenv:Header/> + <soapenv:Body> + <v2:rechercherPoint> + <criteres> + <adresseInstallation> + <escalierEtEtageEtAppartement>${escalierEtEtageEtAppartement}</escalierEtEtageEtAppartement> + <numeroEtNomVoie>${address}</numeroEtNomVoie> + <codePostal>${postalCode}</codePostal> + <codeInseeCommune>${inseeCode}</codeInseeCommune> + </adresseInstallation> + <nomClientFinalOuDenominationSociale>${name}</nomClientFinalOuDenominationSociale> + <rechercheHorsPerimetre>true</rechercheHorsPerimetre> + </criteres> + <loginUtilisateur>${appLogin}</loginUtilisateur> + </v2:rechercherPoint> + </soapenv:Body> + </soapenv:Envelope>` + } 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" @@ -223956,6 +224025,7 @@ const { default: axios } = __webpack_require__(1558) * @param {string} postalCode * @param {string} inseeCode * @param {string} city + * @param {boolean} hasBeenThroughtSafetyOnBoarding * @returns {Promise<Consent>} */ async function createBoConsent( @@ -223967,7 +224037,8 @@ async function createBoConsent( address, postalCode, inseeCode, - city + city, + hasBeenThroughtSafetyOnBoarding ) { log('info', `Query createBoConsent`) const headers = { @@ -223987,6 +224058,7 @@ async function createBoConsent( postalCode, inseeCode, city, + hasBeenThroughtSafetyOnBoarding, }, headers ) @@ -228005,6 +228077,7 @@ const { terminateContract } = __webpack_require__(1598) const { verifyContract } = __webpack_require__(1599) const { findUserPdl } = __webpack_require__(1601) const { verifyUserIdentity } = __webpack_require__(1602) +const { findUserAddress } = __webpack_require__(1604) module.exports = { activateContract, @@ -228013,6 +228086,7 @@ module.exports = { verifyContract, findUserPdl, verifyUserIdentity, + findUserAddress, } @@ -228364,7 +228438,8 @@ async function findUserPdl( name, address, postalCode, - inseeCode + inseeCode, + escalierEtEtageEtAppartement = '' ) { log('info', 'Fetching user data') const sgeHeaders = { @@ -228375,7 +228450,14 @@ async function findUserPdl( const { response } = await soapRequest({ url: url, headers: sgeHeaders, - xml: rechercherPoint(appLogin, name, postalCode, inseeCode, address), + xml: rechercherPoint( + appLogin, + name, + postalCode, + inseeCode, + address, + escalierEtEtageEtAppartement + ), }).catch(err => { log('error', 'rechercherPointResponse') log('error', err) @@ -228398,7 +228480,7 @@ async function findUserPdl( `Enedis issue ${parsedReply.Envelope.Body.Fault.detail.erreur.resultat.$.code}: ${parsedReply.Envelope.Body.Fault.faultstring}` ) } - throw errors.LOGIN_FAILED + return null } } @@ -228413,6 +228495,11 @@ module.exports = { findUserPdl } const { log, errors } = __webpack_require__(1) const { findUserPdl } = __webpack_require__(1601) const { getInseeCode } = __webpack_require__(1603) +const { findUserAddress } = __webpack_require__(1604) +const { + removeMultipleSpaces, + removeAddressnumber, +} = __webpack_require__(1555) /** * Verify user identity @@ -228437,7 +228524,11 @@ async function verifyUserIdentity( inseeCode = await getInseeCode(fields.postalCode, fields.city) } - const pdl = await findUserPdl( + // Store if user is going through safety sge onboarding + let userSafetyOnBoarding = false + + // First try with user adresse + let pdl = await findUserPdl( `${baseUrl}/enedis_SDE_recherche-point/1.0`, apiAuthKey, loginUtilisateur, @@ -228447,8 +228538,52 @@ async function verifyUserIdentity( inseeCode ) + if (!pdl) { + log('warn', 'Second chance for sge onboarding') + // Set safety onboarding in order to save it inside BO + userSafetyOnBoarding = true + // Backup verification + const userAddress = await findUserAddress( + baseUrl, + apiAuthKey, + loginUtilisateur, + fields.pointId + ) + + const escalierEtEtageEtAppartement = userAddress.escalierEtEtageEtAppartement + ? removeMultipleSpaces(userAddress.escalierEtEtageEtAppartement) + : '' + + pdl = await findUserPdl( + `${baseUrl}/enedis_SDE_recherche-point/1.0`, + apiAuthKey, + loginUtilisateur, + fields.lastname, + removeMultipleSpaces(userAddress.numeroEtNomVoie), + userAddress.codePostal, + userAddress.commune.$.code, + escalierEtEtageEtAppartement + ) + + // Third try, remove address number because it's buggy on SGE side + if (!pdl) { + log('warn', 'Last chance onboarding for sge') + pdl = await findUserPdl( + `${baseUrl}/enedis_SDE_recherche-point/1.0`, + apiAuthKey, + loginUtilisateur, + fields.lastname, + removeMultipleSpaces(removeAddressnumber(userAddress.numeroEtNomVoie)), + userAddress.codePostal, + userAddress.commune.$.code, + escalierEtEtageEtAppartement + ) + } + } + if (fields.pointId != pdl) { log('error', 'PointId does not match') + if (isAlternateStart) { throw errors.TERMS_VERSION_MISMATCH } else { @@ -228463,6 +228598,7 @@ async function verifyUserIdentity( inseeCode, postalCode: fields.postalCode, address: fields.address, + hasBeenThroughtSafetyOnBoarding: userSafetyOnBoarding, city: fields.city, } } @@ -228519,8 +228655,68 @@ module.exports = { /* 1604 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { +// @ts-check +const { log, errors } = __webpack_require__(1) +const soapRequest = __webpack_require__(1331) +const { + parseTags, + parseValue, + parseUserAddress, +} = __webpack_require__(1555) +const xml2js = __webpack_require__(1513) +const { consulterDonneesTechniquesContractuelles } = __webpack_require__(1556) + +/** + * Get user contract start date + * @param {string} url + * @param {string} apiAuthKey + * @param {string} userLogin + * @param {number} pointId + * @returns {Promise<Address>} + */ +async function findUserAddress(url, apiAuthKey, userLogin, pointId) { + log('info', 'Fetching user address') + 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, false), + }).catch(err => { + log('error', 'Error while fetching user : ' + err) + throw errors.VENDOR_DOWN + }) + + const result = await xml2js.parseStringPromise(response.body, { + tagNameProcessors: [parseTags], + valueProcessors: [parseValue], + explicitArray: false, + }) + + try { + return parseUserAddress(result) + } catch (error) { + log('error', 'Error while processing user address: ' + error) + log( + 'error', + `Enedis issue ${result.Envelope.Body.Fault.detail.erreur.resultat.$.code}: ${result.Envelope.Body.Fault.faultstring}` + ) + throw errors.NOT_EXISTING_DIRECTORY + } +} + +module.exports = { findUserAddress } + + +/***/ }), +/* 1605 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + const { log, updateOrCreate } = __webpack_require__(1) -const { isLocal } = __webpack_require__(1605) +const { isLocal } = __webpack_require__(1606) const cozyClient = __webpack_require__(485) async function saveAccountData(accountId, accountData) { @@ -228563,7 +228759,7 @@ module.exports = { getAccount, saveAccountData, getAccountForDelete } /***/ }), -/* 1605 */ +/* 1606 */ /***/ ((module) => { function isLocal() { diff --git a/onDeleteAccount.js b/onDeleteAccount.js index bcf1adb..a5f2654 100644 --- a/onDeleteAccount.js +++ b/onDeleteAccount.js @@ -222861,6 +222861,18 @@ function parseContractStartDate(result) { 'dateDerniereModificationFormuleTarifaireAcheminement' ] } +/** + * Return User address + * @param {string} result + * @returns {Address} + */ +function parseUserAddress(result) { + log('info', 'Parsing user Address') + const json = JSON.stringify(result) + return JSON.parse(json)['Envelope']['Body'][ + 'consulterDonneesTechniquesContractuellesResponse' + ]['point']['donneesGenerales']['adresseInstallation'] +} /** * Return User contract start date @@ -222959,6 +222971,24 @@ function parseValue(value, name) { return value } +/** + * Remove SGE useless multiple white spaces + * @param {string} str + * @returns {string} + */ +function removeMultipleSpaces(str) { + return str.replace(/ +/g, ' ') +} + +/** + * Remove SGE useless multiple white spaces + * @param {string} str + * @returns {string} + */ +function removeAddressnumber(str) { + return str.replace(/[0-9]|b |B |T |t /g, '') +} + module.exports = { parseSgeXmlData, formateDataForDoctype, @@ -222968,7 +222998,10 @@ module.exports = { parseContracts, parseContractStartDate, parseServiceId, + parseUserAddress, checkContractExists, + removeMultipleSpaces, + removeAddressnumber, } @@ -223080,7 +223113,11 @@ function consultationMesuresDetailleesMaxPower( * @param {string} appLogin * @returns {string} */ -function consulterDonneesTechniquesContractuelles(pointId, appLogin) { +function consulterDonneesTechniquesContractuelles( + pointId, + appLogin, + consent = true +) { log('info', `Query consulterDonneesTechniquesContractuelles`) return `<?xml version='1.0' encoding='utf-8'?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" @@ -223091,7 +223128,7 @@ function consulterDonneesTechniquesContractuelles(pointId, appLogin) { <v2:consulterDonneesTechniquesContractuelles> <pointId>${pointId}</pointId> <loginUtilisateur>${appLogin}</loginUtilisateur> - <autorisationClient>true</autorisationClient> + <autorisationClient>${consent}</autorisationClient> </v2:consulterDonneesTechniquesContractuelles> </soapenv:Body> </soapenv:Envelope> @@ -223103,14 +223140,45 @@ function consulterDonneesTechniquesContractuelles(pointId, appLogin) { * @param {string} name * @param {string} postalCode * @param {string} inseeCode - * @param {string} [address] + * @param {string} address + * @param {string} [escalierEtEtageEtAppartement] * @returns {string} PDL */ -function rechercherPoint(appLogin, name, postalCode, inseeCode, address) { +function rechercherPoint( + appLogin, + name, + postalCode, + inseeCode, + address, + escalierEtEtageEtAppartement +) { log( 'info', `Query rechercherPoint - postal code : ${postalCode} / insee code: ${inseeCode}` ) + if (escalierEtEtageEtAppartement) { + 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" + xmlns:v1="http://www.enedis.fr/sge/b2b/technique/v1.0"> + <soapenv:Header/> + <soapenv:Body> + <v2:rechercherPoint> + <criteres> + <adresseInstallation> + <escalierEtEtageEtAppartement>${escalierEtEtageEtAppartement}</escalierEtEtageEtAppartement> + <numeroEtNomVoie>${address}</numeroEtNomVoie> + <codePostal>${postalCode}</codePostal> + <codeInseeCommune>${inseeCode}</codeInseeCommune> + </adresseInstallation> + <nomClientFinalOuDenominationSociale>${name}</nomClientFinalOuDenominationSociale> + <rechercheHorsPerimetre>true</rechercheHorsPerimetre> + </criteres> + <loginUtilisateur>${appLogin}</loginUtilisateur> + </v2:rechercherPoint> + </soapenv:Body> + </soapenv:Envelope>` + } 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" @@ -223286,6 +223354,7 @@ const { default: axios } = __webpack_require__(1558) * @param {string} postalCode * @param {string} inseeCode * @param {string} city + * @param {boolean} hasBeenThroughtSafetyOnBoarding * @returns {Promise<Consent>} */ async function createBoConsent( @@ -223297,7 +223366,8 @@ async function createBoConsent( address, postalCode, inseeCode, - city + city, + hasBeenThroughtSafetyOnBoarding ) { log('info', `Query createBoConsent`) const headers = { @@ -223317,6 +223387,7 @@ async function createBoConsent( postalCode, inseeCode, city, + hasBeenThroughtSafetyOnBoarding, }, headers ) @@ -227407,11 +227478,12 @@ module.exports = { terminateContract } /* 1601 */, /* 1602 */, /* 1603 */, -/* 1604 */ +/* 1604 */, +/* 1605 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { const { log, updateOrCreate } = __webpack_require__(1) -const { isLocal } = __webpack_require__(1605) +const { isLocal } = __webpack_require__(1606) const cozyClient = __webpack_require__(485) async function saveAccountData(accountId, accountData) { @@ -227454,7 +227526,7 @@ module.exports = { getAccount, saveAccountData, getAccountForDelete } /***/ }), -/* 1605 */ +/* 1606 */ /***/ ((module) => { function isLocal() { @@ -227477,7 +227549,7 @@ module.exports = { isLocal, isAlpha } /***/ }), -/* 1606 */ +/* 1607 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { // @ts-check @@ -227486,15 +227558,15 @@ const { getAccountRev, getAccountSecret, getAccountId, -} = __webpack_require__(1607) +} = __webpack_require__(1608) const { getBoConsent, deleteBoConsent } = __webpack_require__(1557) const { terminateContract } = __webpack_require__(1598) -const { getAccountForDelete } = __webpack_require__(1604) +const { getAccountForDelete } = __webpack_require__(1605) const moment = __webpack_require__(1373) __webpack_require__(1510) moment.locale('fr') // set the language moment.tz.setDefault('Europe/Paris') // set the timezone -const { isLocal, isAlpha } = __webpack_require__(1605) +const { isLocal, isAlpha } = __webpack_require__(1606) // const ACCOUNT_ID = isLocal() ? 'default_account_id' : 'enedis-sge-grandlyon' async function onDeleteAccount() { @@ -227578,11 +227650,11 @@ module.exports = { onDeleteAccount } /***/ }), -/* 1607 */ +/* 1608 */ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { const { log } = __webpack_require__(1) -const { isLocal } = __webpack_require__(1605) +const { isLocal } = __webpack_require__(1606) function getAccountId() { log('info', `getAccountId`) @@ -227713,7 +227785,7 @@ module.exports = { getAccountId, getAccountRev, getAccountSecret } /******/ // module cache are used so entry inlining is disabled /******/ // startup /******/ // Load entry module and return exports -/******/ var __webpack_exports__ = __webpack_require__(__webpack_require__.s = 1606); +/******/ var __webpack_exports__ = __webpack_require__(__webpack_require__.s = 1607); /******/ /******/ })() ; \ No newline at end of file -- GitLab