UNPKG

bpixrm

Version:

Bpifrance XRM Package

890 lines (629 loc) 33 kB
import { ExtendedBoolean, CompanyType, AddressType, BpiUsersType, SystemUserType, PortfolioItemType, InteractionType, UserType, CommunityType, E404 } from './index'; import { EstablishmentType } from './types'; import { IDynamicsBaseClass } from './IDynamicsBaseClass'; var _ = require('lodash'); class IDynamicsService extends IDynamicsBaseClass{ //================================================================================================================ private static populateCompany(item: any): CompanyType { if (item === undefined) return {} as CompanyType; const contacts: Array<UserType> = [] const establishments: Array<EstablishmentType> = [] let company: CompanyType = { eTag: IDynamicsService.getItem(item, "@odata.etag"), guid: item.accountid, accountid: item.accountid, bpi_siren: item.bpi_siren, bpi_codecp: item.bpi_codecp, name: item.name, bpi_nom: item.bpi_nom, bpi_prenom: item.bpi_prenom, bpi_nomcommercial: item.bpi_nomcommercial, bpi_nomcommercialbcp: item.bpi_nomcommercialbcp, imageUrl: item.entityimage_url, image: item.entityimage, address1: IDynamicsService.populateAddress(item), telephone1: item.telephone1, bpi_fondeele: item.bpi_fondeele, websiteurl: item.websiteurl, derniereInteraction: IDynamicsService.getIType(item, "bpi_derniereinteraction", "", ""), derniereActiviteType: IDynamicsService.getIType(item, "bpi_typederniereactivite"), derniereActiviteDate: IDynamicsService.getIType(item, "bpi_datedederniereactivit"), dateDernierProjetInvest: IDynamicsService.getIType(item, "bpi_datedernierprojetinvest"), dateDernierProjetFinance: IDynamicsService.getIType(item, "bpi_datedernierprojfinance"), dateDernierProjetAccomp: IDynamicsService.getIType(item, "bpi_datedernierprojetaccomp"), primaryContact: IDynamicsService.getIType(item, "_primarycontactid_value"), parent: IDynamicsService.getIType(item, "_parentaccountid_value"), isPivot: false, contacts: contacts, establishments: establishments, } as CompanyType; switch (company.derniereInteraction.value) { case null: { company.derniereInteractionType = InteractionType.None; break; } case company.derniereActiviteDate.value: { company.derniereInteractionType = InteractionType.Activite; break; } case company.dateDernierProjetInvest.value: { company.derniereInteractionType = InteractionType.Invest; break; } case company.dateDernierProjetFinance.value: { company.derniereInteractionType = InteractionType.Finance; break; } case company.dateDernierProjetAccomp.value: { company.derniereInteractionType = InteractionType.Accomp; break; } default: { company.derniereInteractionType = InteractionType.None; break; } } if (company.parent.value == null) { company.isPivot = true; } return company; } //================================================================================================================ private static populateEstablishments(items: any): Array<EstablishmentType> { let establishments: Array<EstablishmentType> = []; items.forEach((item: any, key: string) => { let establishment: EstablishmentType = { eTag: IDynamicsService.getItem(item, "@odata.etag"), guid: item.bpi_etablissementsid, bpi_etablissementsid: item.bpi_etablissementsid, bpi_codecp: item.bpi_codecp, bpi_codepostal: item.bpi_codepostal, bpi_date_creation: IDynamicsService.getIType(item, "bpi_date_creation"), bpi_date_fermeture: IDynamicsService.getIType(item, "bpi_date_fermeture"), bpi_name: item.bpi_name, bpi_numeroetablissement: item.bpi_numeroetablissement, bpi_phone: item.bpi_phone, bpi_siegesocial: IDynamicsService.getIType(item, "bpi_siegesocial"), createdOn: IDynamicsService.getIType(item, "createdon"), modifiedOn: IDynamicsService.getIType(item, "modifiedon"), bpi_siret: item.bpi_siret, bpi_ville: item.bpi_ville, bpi_voie: item.bpi_voie, } establishments.push(establishment); }); return establishments; } //================================================================================================================ private static populateEstablishment(item: any): EstablishmentType { let establishment: EstablishmentType = { eTag: IDynamicsService.getItem(item, "@odata.etag"), guid: item.bpi_etablissementsid, bpi_etablissementsid: item.bpi_etablissementsid, bpi_codecp: item.bpi_codecp, bpi_codepostal: item.bpi_codepostal, bpi_date_creation: IDynamicsService.getIType(item, "bpi_date_creation"), bpi_date_fermeture: IDynamicsService.getIType(item, "bpi_date_fermeture"), bpi_name: item.bpi_name, bpi_numeroetablissement: item.bpi_numeroetablissement, bpi_phone: item.bpi_phone, bpi_siegesocial: IDynamicsService.getIType(item, "bpi_siegesocial"), createdOn: IDynamicsService.getIType(item, "createdon"), modifiedOn: IDynamicsService.getIType(item, "modifiedon"), bpi_siret: item.bpi_siret, bpi_ville: item.bpi_ville, bpi_voie: item.bpi_voie, }; return establishment; } //================================================================================================================ private static populateAddress(item: any, position: number = 1): AddressType { const addressSuffix = "address" + String(position) + "_"; let address: AddressType = { eTag: item["@odata.etag"], id: item[addressSuffix + "addressid"], name: item[addressSuffix + "addressid"], line1: item[addressSuffix + "line1"], line2: item[addressSuffix + "line2"], line3: item[addressSuffix + "line3"], postalCode: item[addressSuffix + "postalcode"], city: item[addressSuffix + "city"], state: item[addressSuffix + "stateorprovince"], country: item[addressSuffix + "country"], composite: item[addressSuffix + "composite"], typeCode: item[addressSuffix + "addresstypecode"], latitude: item[addressSuffix + "latitude"], longitude: item[addressSuffix + "longitude"], telephone1: item[addressSuffix + "telephone1"], telephone2: item[addressSuffix + "telephone2"], telephone3: item[addressSuffix + "telephone3"], fax: item[addressSuffix + "fax"], //primaryContact: IDynamicsService.getIType(item, addressSuffix + "primarycontactname"), } as AddressType; return address; } //================================================================================================================ private static populateSystemUser(item: any): SystemUserType { if (item === undefined) return {} as SystemUserType; let user: SystemUserType = { guid: item.systemuserid, systemuserid: item.systemuserid, eTag: IDynamicsService.getItem(item, "@odata.etag"), fullname: item.fullname, firstname: item.firstname, lastname: item.lastname, metier: IDynamicsService.getIType(item, "bpi_metier"), fonction: IDynamicsService.getIType(item, "_bpi_fonction_value"), jobtitle: item.jobtitle, internalemailaddress: item.internalemailaddress, emailaddress: item.internalemailaddress, domainname: item.domainname, windowsliveid: item.windowsliveid, address1: IDynamicsService.populateAddress(item), telephone1: item.telephone1, } as SystemUserType return user; } //================================================================================================================ private static populateUser(item: any): UserType { if (item === undefined) return {} as UserType; let user: UserType = { eTag: IDynamicsService.getItem(item, "@odata.etag"), guid: item.contactid, contactid: item.contactid, civility: IDynamicsService.getIType(item, "bpi_civilite"), fullname: item.fullname, firstname: item.firstname, lastname: item.lastname, emailaddress: item.emailaddress1, address1: IDynamicsService.populateAddress(item), birthDate: IDynamicsService.getIType(item, "birthdate"), fonction: IDynamicsService.getIType(item, "_bpi_fonction_value"), //company: IDynamicsService.getIType(item, "_bpi_etablissement_value"), company: IDynamicsService.getIType(item, "_parentcustomerid_value"), mobilephone: item.mobilephone, telephone1: item.telephone1, telephone2: item.telephone2, telephone3: item.telephone3, createdOn: IDynamicsService.getIType(item, "createdon"), modifiedOn: IDynamicsService.getIType(item, "modifiedon"), createdBy: IDynamicsService.getIType(item, "_createdby_value"), modifiedBy: IDynamicsService.getIType(item, "_modifiedby_value"), } as UserType return user; } private static populatePortfolio(item: any): PortfolioItemType { const portfolioItem: PortfolioItemType = { eTag: item["@odata.etag"], guid: item.bpi_suiviparid, bpi_suiviparid: item.bpi_suiviparid, bpi_name: item.bpi_name, bpi_suivre_societe: IDynamicsService.getIType(item, "bpi_suivre_societe"), createdOn: IDynamicsService.getIType(item, "createdon"), modifiedOn: IDynamicsService.getIType(item, "modifiedon"), statecode: IDynamicsService.getIType(item, "statecode"), statuscode: IDynamicsService.getIType(item, "statuscode"), user: { } as BpiUsersType, company: { } as CompanyType, } as PortfolioItemType; return portfolioItem; } //================================================================================================================ public async getCompaniesList(commercialName: string, siren: string, zipCode: string, top: number = 100): Promise<void | Array<CompanyType>> { let url: string = `accounts?$top=${String(top)}`; let filter, filterName, filterSiren, filterZipCode: string = ""; if (commercialName.length > 0) { filterName = `(contains(bpi_nom,'${commercialName}') or contains(bpi_nomcommercial, '${commercialName}'))`; } if (siren.length > 0) { filterSiren = `contains(bpi_siren,'${siren}')`; } if (zipCode.length > 0) { filterZipCode = `contains(address1_postalcode,'${zipCode}')`; } filter = [filterName, filterZipCode, filterSiren].filter(Boolean).join(" and "); url = `${url}&$filter=${filter}`; url = `${url}&$expand=bpi_LibelleNAF, contact_customer_accounts, bpi_etablissement_siege`; console.log("IDynamicsService", "getCompaniesList", "url", url); return this.getService(url) .then(data => { console.log("IDynamicsService", "getCompaniesList", "data", data); let companiesList: Array<CompanyType> = []; data.value.forEach((item: any, key: string) => { companiesList.push( IDynamicsService.populateCompany(item), ); }); return companiesList; }) /*.catch(err => { console.log("IDynamicsService", "getCompaniesList", "Error", err); throw err; });*/ } //================================================================================================================ /** * This function is a private function - it is used to optimize how to access to a given company * * @param {string} filter - Le filer doit comprendre l'expression utilisée pour filtrer sur la collection $ @example * `bpi_siren eq 'XXXXX'` * * @returns {Promise<void | CompanyType>} Promise object represents an instance of CompanyType * */ private async getCompanyByFilter(filter: string): Promise<void | CompanyType> { let url: string = `accounts?$top=${String(this.getTop())}`; url = `${url}&$filter=${filter}`; url = `${url}&$expand=bpi_LibelleNAF, contact_customer_accounts, bpi_etablissement_siege`; console.log("IDynamicsService", "getCompanyByFilter", "url", url); return this.getService(url) .then(data => { console.log("IDynamicsService", "getCompanyByFilter", "data", data); data.value.forEach((item: any, key: string) => { return IDynamicsService.populateCompany(item) }); Promise.reject(new E404("L'entreprise identifiée par le filtre '${filter}' n'existe pas dans la base de données")); }) } //================================================================================================================ /** * This function let you get the company object by SIREN * * @param {string} siren - Le numéro siren de l'entrerprise * * @returns {Promise<void | CompanyType>} Promise object represents an instance of CompanyType * */ public async getCompanyBySiren(siren: string): Promise<void | CompanyType> { let filter: string = `bpi_siren eq '${siren}'`; return this.getCompanyByFilter(filter); } //================================================================================================================ /** * This function let you get the company object by codeCP * * @param {string} codeCP - Le code cp utilisé en internen par le SI * * @returns {Promise<void | CompanyType>} Promise object represents an instance of CompanyType * */ public async getCompanyByCP(codeCP: string): Promise<void | CompanyType> { let filter: string = `bpi_codecp eq '${codeCP}'`; return this.getCompanyByFilter(filter); } //================================================================================================================ public async getMe(email: string): Promise<void | SystemUserType> { let url: string = `systemusers?`; url = `${url}$filter=contains(windowsliveid,'${email}')`; console.log("IDynamicsService", "getMe", "url", url); return this.getService(url) .then(data => { console.log("IDynamicsService", "getMe", "data", data); let user: SystemUserType = {}; data.value.forEach((item: any, key: string) => { user = IDynamicsService.populateSystemUser(item); }); return user; }) } //================================================================================================================ /** * This function return all the occurence of the user portfolio (active and/or inactive) * * @param {string} email - L'email de l'utilisateur concerné * * @returns {Promise<void | CompanyType>} Promise object represents an instance of CompanyType * */ public async getPortfolio(email: string): Promise<void | Array<PortfolioItemType>> { const user: SystemUserType = await this.getMe(email); console.log("IDynamicsService", "getPortfolio", "user", user); if (user == undefined) { throw new Error("User (" + email + ") don't exists"); } const systemuserid: string = user.systemuserid; let url: string = `bpi_suivipars?`; url = `${url}$filter=_bpi_utilisateur_value eq ${systemuserid}`; url = `${url}&$expand=bpi_Utilisateur,bpi_Societe`; console.log("IDynamicsService", "getPortfolio", "url", url); return this.getService(url) .then(data => { let portfolioList: Array<PortfolioItemType> = []; console.log("IDynamicsService", "getPortfolio", "data", data); data.value.forEach((item: any, key: string) => { const bpi_Societe = item.bpi_Societe; if (bpi_Societe !== null) { const portfolioItem: PortfolioItemType = IDynamicsService.populatePortfolio(item); portfolioItem.company = IDynamicsService.populateCompany(bpi_Societe); portfolioList.push( portfolioItem ); } else { console.log("ERROR", "IDynamicsService", "getPortfolio", "item", item); } }); return portfolioList; }) } //================================================================================================================ /** * This function return all the occurence of the user portfolio - Cette méthode va filtrer sur statecode = 0 * * @param {string} email - L'email de l'utilisateur concerné * * @returns {Promise<void | CompanyType>} Promise object represents an instance of CompanyType * */ public async getPortfolioOnlyActive(email: string): Promise<void | Array<PortfolioItemType>> { return this.getPortfolio(email) .then((portfolioList: Array<PortfolioItemType>) => { console.log("IDynamicsService", "getPortfolio", "Before portfolioList:", portfolioList); const portfolioListFiltered = _.filter(portfolioList, function (item: PortfolioItemType) { return item.statecode.value == "0"; } ); console.log("IDynamicsService", "getPortfolio", "After portfolioListFiltered:", portfolioListFiltered); return portfolioListFiltered; }) } //================================================================================================================ public getCompanySuivParList(companyId: string, top: number = 20): Promise<void | Array<BpiUsersType>> { let url: string = `bpi_suivipars?$top=${String(top)}`; url = `${url}&$filter=_bpi_societe_value eq ${companyId} and statuscode eq 1`; url = `${url}&$expand=bpi_Utilisateur`; console.log("IDynamicsService", "getCompanySuivParList", url, url); return this.getService(url) .then(data => { let usersList: Array<BpiUsersType> = []; console.log("IDynamicsService", "getCompanySuivParList", "data", data); data.value.forEach((item: any, key: string) => { const bpi_Utilisateur = item.bpi_Utilisateur; usersList.push( IDynamicsService.populateSystemUser(bpi_Utilisateur) ); }); return usersList; }) /*.catch(err => console.error(err));*/ } //================================================================================================================ public getCompany(companyGuid: string, top: number = 5000): Promise<void | CompanyType> { let url: string = `accounts(${companyGuid})?$top=${String(top)}`; url = `${url}&$expand=contact_customer_accounts,bpi_account_bpi_etablissements_societederattachement`; console.log("IDynamicsService", "getCompany", "url", url); return this.getService(url) .then(data => { console.log("IDynamicsService", "getCompany", "data", data); let company: CompanyType = IDynamicsService.populateCompany(data); let contactsArray = data.contact_customer_accounts; console.log("IDynamicsService", "getCompany", "contactsArray", contactsArray); if (contactsArray){ contactsArray.forEach((item: any, key: string) => { company.contacts.push( IDynamicsService.populateUser(item) ); }); } let establishmentsArray = data.bpi_account_bpi_etablissements_societederattachement; console.log("IDynamicsService", "getCompany", "establishmentsArray", establishmentsArray); if (establishmentsArray) { establishmentsArray.forEach((item: any, key: string) => { company.establishments.push( IDynamicsService.populateEstablishment(item) ); }); } return company; }) } //================================================================================================================ public getCompanySuivParListExtended(companyId: string, top: number = 20): Promise<void | Array<PortfolioItemType>> { let url: string = `bpi_suivipars?$top=${String(top)}`; url = `${url}&$filter=_bpi_societe_value eq ${companyId} and statuscode eq 1`; url = `${url}&$expand=bpi_Utilisateur`; console.log("IDynamicsService", "getCompanySuivParListExtended", "url", url); return this.getService(url) .then(data => { let portfolioList: Array<PortfolioItemType> = []; console.log("IDynamicsService", "getCompanySuivParListExtended", "data", data); data.value.forEach((item: any, key: string) => { const bpi_Societe = item.bpi_Societe; const bpi_Utilisateur = item.bpi_Utilisateur; if (bpi_Societe !== null) { const portfolioItem: PortfolioItemType = IDynamicsService.populatePortfolio(item); portfolioItem.user = IDynamicsService.populateSystemUser(bpi_Utilisateur); portfolioItem.company = IDynamicsService.populateCompany(bpi_Societe); portfolioList.push( portfolioItem ); } }); return portfolioList; }) /*.catch(err => console.error(err));*/ } // ==================================================================================================================================== public getUserList(query: string, email: string, top: number = 20): Promise<void | Array<UserType>> { let url: string = `contacts?$top=${String(top)}`; //url = `${url}&$filter=(contains(fullname, '${query}') or contains(emailaddress1, '${query}') or contains(emailaddress2, '${query}')`; let filter, filterQuery, filterEmail: string = ""; if (query.length > 0) { filterQuery = `(contains(fullname, '${query}') or contains(emailaddress1, '${query}') or contains(emailaddress2, '${query}'))`; } if (email.length > 0) { filterEmail = `(contains(emailaddress1, '${email}') or contains(emailaddress2, '${email}') or contains(emailaddress2, '${email}'))`; } filter = [filterQuery, filterEmail].filter(Boolean).join(" and "); url = `${url}&$filter=${filter}`; console.log("IDynamicsService", "getUserList", "url", url); return this.getService(url) .then(data => { console.log("IDynamicsService", "getUserList", "data", data); let userList: Array<UserType> = []; data.value.forEach((item: any, key: string) => { userList.push( IDynamicsService.populateUser(item) ); }); return userList; }) } //================================================================================================================ /** * This function return all the communities of a company * * @param {string} companyId - Le guid de l'entreprise * @param {ExtendedBoolean} validOnly - Valeur par défault est ExtendedBoolean.All * @param {number} top - Valeur par défault 20 - le nombre de record max retourné par la requête * * @returns {Promise<void | Array<CommunityType>>} Promise object represents tje list of CommunityType * */ public getCompanyCommunitiesList(companyId: string, validOnly: ExtendedBoolean = ExtendedBoolean.All, top: number = 20): Promise<void | Array<CommunityType>> { /* https://bpifrance.crm4.dynamics.com/api/data/v8.2/bpi_accelerateurs?$top=10 &$expand=bpi_societe_concernee &$filter=_bpi_societe_concernee_value eq 6de0a974-878c-e611-80ee-5065f38a8a91 and bpi_statutdemande eq 922150003 $select=_bpi_typeprogrammeaccelerateurid_value, _bpi_promotionid_value, bpi_statutdemande, _bpi_demande_par_value, bpi_name, bpi_date_candidature, bpi_datedentreenew, bpi_date_sortie, bpi_date_entree, bpi_alumnicalculated */ let url: string = `bpi_accelerateurs?$top=${String(top)}`; url = `${url}&$filter=_bpi_societe_concernee_value eq ${companyId} and bpi_statutdemande eq 922150003`; url = `${url}&$expand=bpi_societe_concernee`; console.log("IDynamicsService", "getCompanyCommunitiesList", "url", url); return this.getService(url) .then(data => { console.log("IDynamicsService", "getCompanyCommunitiesList", "data", data); let communitiesList: Array<CommunityType> = []; data.value.forEach((item: any, key: string) => { let community: CommunityType = { eTag: item["@odata.etag"], typePprogrammeAccelerateur: IDynamicsService.getIType(item, "_bpi_typeprogrammeaccelerateurid_value", "", ""), promotion: IDynamicsService.getIType(item, "_bpi_promotionid_value", "", ""), statutDemande: IDynamicsService.getIType(item, "bpi_statutdemande", "", ""), demandePar: IDynamicsService.getIType(item, "_bpi_demande_par_value", "", ""), dateEntree: IDynamicsService.getIType(item, "bpi_datedentreenew", "", ""), dateDeSortie: IDynamicsService.getIType(item, "bpi_date_sortie", "", ""), dateDeValidation: IDynamicsService.getIType(item, "bpi_date_entree", "", ""), alumni: IDynamicsService.getIType(item, "bpi_alumnicalculated", "", ""), statecode: IDynamicsService.getIType(item, "statecode", "", ""), statuscode: IDynamicsService.getIType(item, "statuscode", "", ""), contact: IDynamicsService.getIType(item, "_bpi_contact_societe_value", "", ""), dateDemande: IDynamicsService.getIType(item, "bpi_sortiedemandee", "", ""), dateCandidature: IDynamicsService.getIType(item, "bpi_date_candidature", "", ""), directionRegionale: IDynamicsService.getIType(item, "_bpi_direction_regionale_value", "", ""), } as CommunityType; const now = new Date(); const dateDeSortie = new Date(community.dateDeSortie.value); //console.log("Date Now: ", now); //console.log("Date dateDeSortie: ", dateDeSortie, community.dateDeSortie); if (now < dateDeSortie) { community.isValid = true; } else if (now >= dateDeSortie) { community.isValid = false; } else { community.isValid = true; } switch (validOnly) { case ExtendedBoolean.All: communitiesList.push( community ); break; case ExtendedBoolean.True: if (community.isValid) { communitiesList.push( community ); } break case ExtendedBoolean.False: if (!community.isValid) { communitiesList.push( community ); } break } }); return communitiesList; }) /*.catch(err => console.log("Error:", err));*/ } //================================================================================================================ /** * Add a company to a portfolio * * @param {string} companyId - Le guid de l'entreprise * @param {string} xrmId - Le guid de l'utilisateur Dynamics * * @returns {Promise<Response>} Promise de type Response * */ public addCompanyToPortfolio(companyId: string, xrmId: string): Promise<Response> { /* POST /api/data/v8.2/bpi_suivipars body { "bpi_Societe@odata.bind": "/accounts(840F7609-0BD1-E711-80EC-3863BB358F68)", "bpi_Utilisateur@odata.bind": "/systemusers(e0e531f2-8962-e811-8105-3863bb358ff0)" } */ let url: string = `${this.getEndPointLink()}bpi_suivipars`; const jsonRequest: string = ` { 'bpi_Societe@odata.bind': '/accounts(${companyId})', 'bpi_Utilisateur@odata.bind': '/systemusers(${xrmId})' } `; console.log("IDynamicsService", "addCompanyToPortfolio", "url", url); console.log("IDynamicsService", "addCompanyToPortfolio", "jsonRequest", jsonRequest); return fetch(url, { headers: IDynamicsService.getHeaders(this.getAccessToken()), method: 'POST', body: jsonRequest, }); } //================================================================================================================ /** * Remove a company from a portfolio * * @param {string} companyId - Le guid de l'entreprise * @param {string} bpi_suiviparid - Le guid de l'instance de suiviPar * * @returns {Promise<Response>} Promise de type Response * */ public removeCompanyFromPortfolio(companyId: string, bpi_suiviparid: string): Promise<Response> { /* PATCH https://bpifrance-dev-v2.crm4.dynamics.com/api/data/v8.2/bpi_suivipars(0f0eb7aa-880a-e911-812c-3863bb35ff88) { statecode: 1 } OU DELETE /api/data/v8.2/accounts(840f7609-0bd1-e711-80ec-3863bb358f68)/bpi_account_bpi_suivipar_Societe(ed1e9df1-ce09-e911-8122-3863bb35ed98)/$ref où "ed1e9df1-ce09-e911-8122-3863bb35ed98" est bpi_suiviparid */ let url: string = `${this.getEndPointLink()}bpi_suivipars(${bpi_suiviparid})`; const jsonRequest: string = ` { statecode: 1, statuscode: 2 } `; console.log("IDynamicsService", "removeCompanyFromPortfolio", "url", url); console.log("IDynamicsService", "removeCompanyFromPortfolio", "jsonRequest", jsonRequest); //jsonRequest = JSON.stringify(jsonRequest); return fetch(url, { headers: IDynamicsService.getHeaders(this.getAccessToken()), method: 'PATCH', body: jsonRequest, }); } } export { IDynamicsService };