import Ftp from 'ftp' import shell from 'shelljs' import config from '../../config' import { prismaClient as prisma } from '../../prismaClient' import { condoManagerLogger } from '../logger' import processManagingCompanyWithApiKey from './api/processManagingComany' import createMissingManagingCompaniesAndProjectsForFTPServer from './ftp/createMissingManagingCompaniesAndProjects' import * as FtpHelpers from './ftp/ftp' import processManagingCompanyWithFTP from './ftp/processManagingComany' // eslint-disable-next-line no-unused-vars const MANAGING_COMPANY_NAME_ID_MAPPED = { walterCondoManager: 'ckd7k65v30qw00713i9fpof2a', 'Gestion Imhotep': 'cjp9id47h002e0914f8t3edbz', Immoplex: 'cjs3jzkuq01650980u526tt8f', GestionPS: 'cjt0hw2yl00d508600z6ehxgq', 'Gestion Patrimonium': 'cju0n3mci00880852wdlqydou', 'Condo Vision': 'cjv71pj8900g80773nh9d9p8b', 'Gestion Griffin': 'cjvi6mt2o00zx07984eau41nm', POTEL: 'cjvzdhwde035y0778nkvfklck', 'Gestionnaire CITÉ Gestion': 'cjw123gaj00hy0766y3hbla1z', 'Gestion Corev': 'cjw86jfdd001n07627yh79lwm', 'Gestionnaire Condo Stratégis': 'cjwjosprg0nil0772v4m6r8oh', 'Fitzback Gestion': 'ck0cfj3py03m70747n4o7r4rq', Gestactif: 'ck16yi8cn02p80709z82qt2tm', 'Groupe Immobilier Celico': 'ck18miz8eutaz07478883gdwx', 'Gestion avenue': 'ck19m0gw6cjvy07133bcr31u8', EOPMG: 'ck1s8hcof016c0869iucobhkt', 'Gestion Kaldi inc.': 'ck2ky8qyx01kj0866hsywksgr', '10504980 Canada inc.': 'ck2kykthz0o7d0866d914o9f7', 'Managing company ABC': 'ck2kywigo0u5b0866x80udxwr', 'Test 1 (CmMaster)': 'ck2yx3rf4tegm07876m40v74z', 'Collins Management': 'ck3abg4dcondv0789c480at48', 'FPMGroup, INC': 'ck3rjgch9584p0893mpu1xtrg', 'Villas du Parc': 'ck3rjgctx585k0893foio1mtx', 'Gestion P. Charpentier': 'ck3udk9hmgd2a08937p0ylo00', 'Groupe Ultimmo': 'ck5ffj2b7mpsb0793qj1usvmo', 'TRADEMARK PROPERTY MANAGEMENT LTD.': 'ck5poeu0pcfn40880aowgihxc', habitat67: 'ck73vcjfm0tfb0713znxm2hxe', Verriere: 'ck7kqujvc46zt0791b10dil8a', condoConsulte: 'ck3es5lflwkps078979e45nu7', domis: 'ck7faws3m0nnp0729mq4i4wyr', sentinel: 'ck66snhz80fqm0760aewbj06o', redpath: 'ck6b730vl1wbu0798wydk43t3', amaimmo: 'ckb9lqmjvvjee082642saup5o', tomcondos: 'cka5r7vph4d7208266e7rcfh3', santelli: 'cka2p8f9xkqsc0826fg5ngeeu', } const MANAGING_COMPANY_TO_SYNC = null // const MANAGING_COMPANY_TO_SYNC = MANAGING_COMPANY_NAME_ID_MAPPED['Groupe Immobilier Celico'] shell.config.silent = true // If a no projectId and no managingCompany is passed, ALL the managing companies and ALL // the projects will be sync. export default async function startCondoManagerSync({ projectId, managingCompanyId, }: { projectId?: string managingCompanyId?: string }) { condoManagerLogger.info(`Starting Condo manager sync: ${config.thirdPartySync}`) try { // Make sure we have all the managing companies and the projects created // ONLY FTP... if (config.thirdPartySync.createMissingProjectAndCompanies && config.isDevelopment) { await createMissingManagingCompaniesAndProjectsForFTPServer() } condoManagerLogger.info('Fetching managing compagnies that are linked to Condo Manager') // If we passed a projectId, we don't want to fetch all managing companies... // We only want the managing company of the project if (projectId && !managingCompanyId) { const managingCompanyOfProject = await prisma.project .findOne({ where: { id: projectId } }) .managingCompany() managingCompanyId = managingCompanyOfProject.id } const managingCompanies = await prisma.managingCompany.findMany({ where: { AND: [ // Let's say we only want to sync a certain managing company ...(managingCompanyId ? [{ id: managingCompanyId }] : []), { projects: { some: { thirdPartyServices: { some: { friendlyName: { equals: config.thirdPartySync.condoManager.friendlyName, }, }, }, }, }, }, { OR: [ ...(config.isDevelopment ? [ { condoManagerId: { not: null, }, }, ] : []), { condoManagerApiKey: { not: null, }, }, ], }, ], }, }) condoManagerLogger.info(`Success fetching ${managingCompanies.length} managing compagnies`) for await (const managingCompany of managingCompanies) { // Try catch to not stop everything if a single managingComapny fail to process try { // Condo manager api key for those who have it... if (managingCompany.condoManagerApiKey) { if (config.thirdPartySync.processFTPOnly) { condoManagerLogger.info( `Not processing ${managingCompany.shortName} because config for process FTP only is true` ) continue } await processManagingCompanyWithApiKey({ managingCompanyId: managingCompany.id, // If for example we only want to process a specific project projectId, }) continue } // For now, we can only sync data with FTP in dev... // Scripts aren't working in production if (!config.isDevelopment) { continue } const primaryConnection = new Ftp() primaryConnection.on('error', console.error) await FtpHelpers.connect(primaryConnection) // Else the managing company is using the old stuff.. if (!config.thirdPartySync.makeSyncFast) { await FtpHelpers.changeDir(primaryConnection, `Commun${managingCompany.condoManagerId}`) } await processManagingCompanyWithFTP(managingCompany.id, projectId) if (!config.thirdPartySync.makeSyncFast) { await FtpHelpers.moveUpDir(primaryConnection) } primaryConnection.end() } catch (error) { condoManagerLogger.error(error) } } condoManagerLogger.info('Done processing for Condo Manager') } catch (error) { condoManagerLogger.error(error) } }