import { User } from 'nexus-plugin-prisma/client' import { prismaClient as prisma } from '../../../prismaClient' import GeneralUtils from '../../general' // TODO: this will need to be augmented through code later rather than manually built to respond to changes in prisma admin const USER_FRAGMENT = { id: true, active: true, firstName: true, isResident: true, lastName: true, email: true, role: true, hasInstalledApp: true, preferedLanguage: true, // condoManagerNoCompteReel: true, // condoManagerCompteUserNumber: true, // condoManagerNomCompte: true, copropertyDueAmount: true, condoManagerNomComptes: { select: { project: { select: { id: true, }, }, nomCompte: true, noCompteReel: true, userNumber: true, }, }, projects: { select: { id: true, }, }, currentProject: { select: { id: true, }, }, projectsActive: { select: { id: true, }, }, properties: { select: { id: true, }, }, property: { select: { id: true, }, }, firstNameSyncStatuses: { select: { status: true, id: true, overwriteWalterConfirmed: true, overwriteThirdPartyServiceConfirmed: true, dataToConfirm: true, lastSeenPrismaValue: true, mapping: { select: { mappedService: { select: { friendlyName: true, }, }, }, }, }, }, lastNameSyncStatuses: { select: { status: true, id: true, overwriteWalterConfirmed: true, overwriteThirdPartyServiceConfirmed: true, dataToConfirm: true, lastSeenPrismaValue: true, mapping: { select: { mappedService: { select: { friendlyName: true, }, }, }, }, }, }, emailSyncStatuses: { select: { status: true, id: true, overwriteWalterConfirmed: true, overwriteThirdPartyServiceConfirmed: true, dataToConfirm: true, lastSeenPrismaValue: true, mapping: { select: { mappedService: { select: { friendlyName: true, }, }, }, }, }, }, phone: { select: { number: true, extension: true, nationalFormat: true, countryCode: true, phoneSyncStatuses: { select: { status: true, id: true, overwriteWalterConfirmed: true, overwriteThirdPartyServiceConfirmed: true, dataToConfirm: true, lastSeenPrismaValue: true, mapping: { select: { mappedService: { select: { friendlyName: true, }, }, }, }, }, }, extensionSyncStatuses: { select: { status: true, id: true, overwriteWalterConfirmed: true, overwriteThirdPartyServiceConfirmed: true, dataToConfirm: true, lastSeenPrismaValue: true, mapping: { select: { mappedService: { select: { friendlyName: true, }, }, }, }, }, }, countryCodeSyncStatuses: { select: { status: true, id: true, overwriteWalterConfirmed: true, overwriteThirdPartyServiceConfirmed: true, dataToConfirm: true, lastSeenPrismaValue: true, mapping: { select: { mappedService: { select: { friendlyName: true, }, }, }, }, }, }, nationalFormatSyncStatuses: { select: { status: true, id: true, overwriteWalterConfirmed: true, overwriteThirdPartyServiceConfirmed: true, dataToConfirm: true, lastSeenPrismaValue: true, mapping: { select: { mappedService: { select: { friendlyName: true, }, }, }, }, }, }, }, }, homePhone: { select: { number: true, extension: true, nationalFormat: true, countryCode: true, phoneSyncStatuses: { select: { status: true, id: true, overwriteWalterConfirmed: true, overwriteThirdPartyServiceConfirmed: true, dataToConfirm: true, lastSeenPrismaValue: true, mapping: { select: { mappedService: { select: { friendlyName: true, }, }, }, }, }, }, extensionSyncStatuses: { select: { status: true, id: true, overwriteWalterConfirmed: true, overwriteThirdPartyServiceConfirmed: true, dataToConfirm: true, lastSeenPrismaValue: true, mapping: { select: { mappedService: { select: { friendlyName: true, }, }, }, }, }, }, countryCodeSyncStatuses: { select: { status: true, id: true, overwriteWalterConfirmed: true, overwriteThirdPartyServiceConfirmed: true, dataToConfirm: true, lastSeenPrismaValue: true, mapping: { select: { mappedService: { select: { friendlyName: true, }, }, }, }, }, }, nationalFormatSyncStatuses: { select: { status: true, id: true, overwriteWalterConfirmed: true, overwriteThirdPartyServiceConfirmed: true, dataToConfirm: true, lastSeenPrismaValue: true, mapping: { select: { mappedService: { select: { friendlyName: true, }, }, }, }, }, }, }, }, officePhone: { select: { number: true, extension: true, nationalFormat: true, countryCode: true, phoneSyncStatuses: { select: { status: true, id: true, overwriteWalterConfirmed: true, overwriteThirdPartyServiceConfirmed: true, dataToConfirm: true, lastSeenPrismaValue: true, mapping: { select: { mappedService: { select: { friendlyName: true, }, }, }, }, }, }, extensionSyncStatuses: { select: { status: true, id: true, overwriteWalterConfirmed: true, overwriteThirdPartyServiceConfirmed: true, dataToConfirm: true, lastSeenPrismaValue: true, mapping: { select: { mappedService: { select: { friendlyName: true, }, }, }, }, }, }, countryCodeSyncStatuses: { select: { status: true, id: true, overwriteWalterConfirmed: true, overwriteThirdPartyServiceConfirmed: true, dataToConfirm: true, lastSeenPrismaValue: true, mapping: { select: { mappedService: { select: { friendlyName: true, }, }, }, }, }, }, nationalFormatSyncStatuses: { select: { status: true, id: true, overwriteWalterConfirmed: true, overwriteThirdPartyServiceConfirmed: true, dataToConfirm: true, lastSeenPrismaValue: true, mapping: { select: { mappedService: { select: { friendlyName: true, }, }, }, }, }, }, }, }, } export default async function getExistingResident({ userEmail, userPhoneNumber, projectId, isTenant, }: { userEmail: string userPhoneNumber: string projectId: string isTenant?: boolean condoManagerCompteUserNumber?: number condoManagerNoCompteReel?: number condoManagerNomCompte?: any }) { if (!projectId) { throw new Error('Need project to search user') } const formattedEmail = userEmail?.trim()?.toLowerCase() const validUserPhoneNumber = GeneralUtils.isValidPhoneNumber(userPhoneNumber) ? userPhoneNumber : null const validUserEmail = GeneralUtils.isValidEmail(formattedEmail) ? formattedEmail : null const generalWhere = [ { OR: [ { projects: { some: { id: projectId }, }, }, // Also fetching in previous projects in case the user was removed from a project but now // is added to a new one. We don't want to create a new user { previousProjects: { some: { id: projectId }, }, }, ], }, ] const tenantWhere = [ { projectsTenants: { some: { id: projectId }, }, }, ] const emailPhoneNumberWhere = validUserEmail || validUserPhoneNumber ? [ { OR: [ ...(validUserEmail ? [ { email: { equals: validUserEmail, }, }, ] : []), ...(validUserPhoneNumber ? [ { // Check 5148679893 AND +15148679893 OR: [ { phone: { number: { equals: validUserPhoneNumber }, }, }, { phone: { number: { equals: GeneralUtils.formatPhoneNumberToHaveTheSameAsTwilio( validUserPhoneNumber ), }, }, }, ], }, ] : []), ], }, ] : [] let users = [] // TENANT if (isTenant) { if (emailPhoneNumberWhere.length) { users = await prisma.user.findMany({ where: { AND: [{ OR: [...generalWhere, ...tenantWhere, ...emailPhoneNumberWhere] }], }, select: USER_FRAGMENT, }) } if (users.length === 0) { users = await prisma.user.findMany({ where: { AND: [...generalWhere, ...tenantWhere], }, select: USER_FRAGMENT, }) } // Null is important here for the rest of the logics... return users[0] || null } // REGULAR if (emailPhoneNumberWhere.length) { users = await prisma.user.findMany({ where: { AND: [...generalWhere, ...emailPhoneNumberWhere] }, select: USER_FRAGMENT, }) } // Null is important here for the rest of the logics... return users[0] || null }