diff --git a/apps/portal/prisma/schema.prisma b/apps/portal/prisma/schema.prisma index ec549a84..069cdca3 100644 --- a/apps/portal/prisma/schema.prisma +++ b/apps/portal/prisma/schema.prisma @@ -333,9 +333,8 @@ model OffersOffer { offersFullTime OffersFullTime? @relation(fields: [offersFullTimeId], references: [id], onDelete: Cascade) offersFullTimeId String? @unique - OffersAnalysis OffersAnalysis? @relation("HighestOverallOffer") - OffersAnalysisTopOverallOffers OffersAnalysis[] @relation("TopOverallOffers") - OffersAnalysisTopCompanyOffers OffersAnalysis[] @relation("TopCompanyOffers") + offersAnalysis OffersAnalysis? @relation("HighestOverallOffer") + offersAnalysisUnit OffersAnalysisUnit[] } model OffersIntern { @@ -376,14 +375,21 @@ model OffersAnalysis { offerId String @unique // OVERALL - overallPercentile Float + overallAnalysis OffersAnalysisUnit @relation("OverallAnalysis", fields: [overallAnalysisUnitId], references: [id]) + overallAnalysisUnitId String + + companyAnalysis OffersAnalysisUnit[] @relation("CompanyAnalysis") +} + +model OffersAnalysisUnit { + id String @id @default(cuid()) + + percentile Float noOfSimilarOffers Int - topOverallOffers OffersOffer[] @relation("TopOverallOffers") + topSimilarOffers OffersOffer[] - // Company - companyPercentile Float - noOfSimilarCompanyOffers Int - topCompanyOffers OffersOffer[] @relation("TopCompanyOffers") + offersAnalysisOverall OffersAnalysis[] @relation("OverallAnalysis") + offersAnalysisCompany OffersAnalysis[] @relation("CompanyAnalysis") } // End of Offers project models. diff --git a/apps/portal/src/mappers/offers-mappers.ts b/apps/portal/src/mappers/offers-mappers.ts index 198d2db0..aa4b178a 100644 --- a/apps/portal/src/mappers/offers-mappers.ts +++ b/apps/portal/src/mappers/offers-mappers.ts @@ -1,6 +1,7 @@ import type { Company, OffersAnalysis, + OffersAnalysisUnit, OffersBackground, OffersCurrency, OffersEducation, @@ -18,9 +19,9 @@ import { TRPCError } from '@trpc/server'; import type { AddToProfileResponse, - Analysis, AnalysisHighestOffer, AnalysisOffer, + AnalysisUnit, Background, CreateOfferProfileResponse, DashboardOffer, @@ -35,7 +36,8 @@ import type { SpecificYoe, UserProfile, UserProfileOffer, - Valuation} from '~/types/offers'; + Valuation, +} from '~/types/offers'; const analysisOfferDtoMapper = ( offer: OffersOffer & { @@ -110,32 +112,32 @@ const analysisOfferDtoMapper = ( return analysisOfferDto; }; -const analysisDtoMapper = ( - noOfOffers: number, - percentile: number, - topPercentileOffers: Array< - OffersOffer & { - company: Company; - offersFullTime: - | (OffersFullTime & { totalCompensation: OffersCurrency }) - | null; - offersIntern: (OffersIntern & { monthlySalary: OffersCurrency }) | null; - profile: OffersProfile & { - background: - | (OffersBackground & { - experiences: Array< - OffersExperience & { company: Company | null } - >; - }) +const analysisUnitDtoMapper = ( + analysisUnit: OffersAnalysisUnit & { + topSimilarOffers: Array< + OffersOffer & { + company: Company; + offersFullTime: + | (OffersFullTime & { totalCompensation: OffersCurrency }) | null; - }; - } - >, + offersIntern: (OffersIntern & { monthlySalary: OffersCurrency }) | null; + profile: OffersProfile & { + background: + | (OffersBackground & { + experiences: Array< + OffersExperience & { company: Company | null } + >; + }) + | null; + }; + } + >; + }, ) => { - const analysisDto: Analysis = { - noOfOffers, - percentile, - topPercentileOffers: topPercentileOffers.map((offer) => + const analysisDto: AnalysisUnit = { + noOfOffers: analysisUnit.noOfSimilarOffers, + percentile: analysisUnit.percentile, + topPercentileOffers: analysisUnit.topSimilarOffers.map((offer) => analysisOfferDtoMapper(offer), ), }; @@ -165,6 +167,52 @@ const analysisHighestOfferDtoMapper = ( export const profileAnalysisDtoMapper = ( analysis: | (OffersAnalysis & { + companyAnalysis: Array< + OffersAnalysisUnit & { + topSimilarOffers: Array< + OffersOffer & { + company: Company; + offersFullTime: + | (OffersFullTime & { totalCompensation: OffersCurrency }) + | null; + offersIntern: + | (OffersIntern & { monthlySalary: OffersCurrency }) + | null; + profile: OffersProfile & { + background: + | (OffersBackground & { + experiences: Array< + OffersExperience & { company: Company | null } + >; + }) + | null; + }; + } + >; + } + >; + overallAnalysis: OffersAnalysisUnit & { + topSimilarOffers: Array< + OffersOffer & { + company: Company; + offersFullTime: + | (OffersFullTime & { totalCompensation: OffersCurrency }) + | null; + offersIntern: + | (OffersIntern & { monthlySalary: OffersCurrency }) + | null; + profile: OffersProfile & { + background: + | (OffersBackground & { + experiences: Array< + OffersExperience & { company: Company | null } + >; + }) + | null; + }; + } + >; + }; overallHighestOffer: OffersOffer & { company: Company; offersFullTime: @@ -175,46 +223,6 @@ export const profileAnalysisDtoMapper = ( | null; profile: OffersProfile & { background: OffersBackground | null }; }; - topCompanyOffers: Array< - OffersOffer & { - company: Company; - offersFullTime: - | (OffersFullTime & { totalCompensation: OffersCurrency }) - | null; - offersIntern: - | (OffersIntern & { monthlySalary: OffersCurrency }) - | null; - profile: OffersProfile & { - background: - | (OffersBackground & { - experiences: Array< - OffersExperience & { company: Company | null } - >; - }) - | null; - }; - } - >; - topOverallOffers: Array< - OffersOffer & { - company: Company; - offersFullTime: - | (OffersFullTime & { totalCompensation: OffersCurrency }) - | null; - offersIntern: - | (OffersIntern & { monthlySalary: OffersCurrency }) - | null; - profile: OffersProfile & { - background: - | (OffersBackground & { - experiences: Array< - OffersExperience & { company: Company | null } - >; - }) - | null; - }; - } - >; }) | null, ) => { @@ -223,19 +231,11 @@ export const profileAnalysisDtoMapper = ( } const profileAnalysisDto: ProfileAnalysis = { - companyAnalysis: [ - analysisDtoMapper( - analysis.noOfSimilarCompanyOffers, - analysis.companyPercentile, - analysis.topCompanyOffers, - ), - ], - id: analysis.id, - overallAnalysis: analysisDtoMapper( - analysis.noOfSimilarOffers, - analysis.overallPercentile, - analysis.topOverallOffers, + companyAnalysis: analysis.companyAnalysis.map((analysisUnit) => + analysisUnitDtoMapper(analysisUnit), ), + id: analysis.id, + overallAnalysis: analysisUnitDtoMapper(analysis.overallAnalysis), overallHighestOffer: analysisHighestOfferDtoMapper( analysis.overallHighestOffer, ), @@ -441,6 +441,52 @@ export const profileDtoMapper = ( profile: OffersProfile & { analysis: | (OffersAnalysis & { + companyAnalysis: Array< + OffersAnalysisUnit & { + topSimilarOffers: Array< + OffersOffer & { + company: Company; + offersFullTime: + | (OffersFullTime & { totalCompensation: OffersCurrency }) + | null; + offersIntern: + | (OffersIntern & { monthlySalary: OffersCurrency }) + | null; + profile: OffersProfile & { + background: + | (OffersBackground & { + experiences: Array< + OffersExperience & { company: Company | null } + >; + }) + | null; + }; + } + >; + } + >; + overallAnalysis: OffersAnalysisUnit & { + topSimilarOffers: Array< + OffersOffer & { + company: Company; + offersFullTime: + | (OffersFullTime & { totalCompensation: OffersCurrency }) + | null; + offersIntern: + | (OffersIntern & { monthlySalary: OffersCurrency }) + | null; + profile: OffersProfile & { + background: + | (OffersBackground & { + experiences: Array< + OffersExperience & { company: Company | null } + >; + }) + | null; + }; + } + >; + }; overallHighestOffer: OffersOffer & { company: Company; offersFullTime: @@ -451,46 +497,6 @@ export const profileDtoMapper = ( | null; profile: OffersProfile & { background: OffersBackground | null }; }; - topCompanyOffers: Array< - OffersOffer & { - company: Company; - offersFullTime: - | (OffersFullTime & { totalCompensation: OffersCurrency }) - | null; - offersIntern: - | (OffersIntern & { monthlySalary: OffersCurrency }) - | null; - profile: OffersProfile & { - background: - | (OffersBackground & { - experiences: Array< - OffersExperience & { company: Company | null } - >; - }) - | null; - }; - } - >; - topOverallOffers: Array< - OffersOffer & { - company: Company; - offersFullTime: - | (OffersFullTime & { totalCompensation: OffersCurrency }) - | null; - offersIntern: - | (OffersIntern & { monthlySalary: OffersCurrency }) - | null; - profile: OffersProfile & { - background: - | (OffersBackground & { - experiences: Array< - OffersExperience & { company: Company | null } - >; - }) - | null; - }; - } - >; }) | null; background: @@ -530,7 +536,7 @@ export const profileDtoMapper = ( user: User | null; }, inputToken: string | undefined, - inputUserId: string | null | undefined + inputUserId: string | null | undefined, ) => { const profileDto: Profile = { analysis: profileAnalysisDtoMapper(profile.analysis), @@ -547,7 +553,7 @@ export const profileDtoMapper = ( profileDto.editToken = profile.editToken ?? null; profileDto.isEditable = true; - const users = profile.user + const users = profile.user; // TODO: BRYANN UNCOMMENT THIS ONCE U CHANGE THE SCHEMA // for (let i = 0; i < users.length; i++) { @@ -558,7 +564,7 @@ export const profileDtoMapper = ( // TODO: REMOVE THIS ONCE U CHANGE THE SCHEMA if (users?.id === inputUserId) { - profileDto.isSaved = true + profileDto.isSaved = true; } } @@ -645,83 +651,95 @@ export const getOffersResponseMapper = ( return getOffersResponse; }; -export const getUserProfileResponseMapper = (res: User & { - OffersProfile: Array; - }>; -} | null): Array => { +export const getUserProfileResponseMapper = ( + res: + | (User & { + OffersProfile: Array< + OffersProfile & { + offers: Array< + OffersOffer & { + company: Company; + offersFullTime: + | (OffersFullTime & { totalCompensation: OffersCurrency }) + | null; + offersIntern: + | (OffersIntern & { monthlySalary: OffersCurrency }) + | null; + } + >; + } + >; + }) + | null, +): Array => { if (res) { return res.OffersProfile.map((profile) => { return { createdAt: profile.createdAt, id: profile.id, offers: profile.offers.map((offer) => { - return userProfileOfferDtoMapper(offer) + return userProfileOfferDtoMapper(offer); }), profileName: profile.profileName, - token: profile.editToken - } - }) + token: profile.editToken, + }; + }); } - return [] -} + return []; +}; const userProfileOfferDtoMapper = ( offer: OffersOffer & { - company: Company; - offersFullTime: (OffersFullTime & { totalCompensation: OffersCurrency }) | null; - offersIntern: (OffersIntern & { monthlySalary: OffersCurrency }) | null; - }): UserProfileOffer => { - const mappedOffer: UserProfileOffer = { - company: offersCompanyDtoMapper(offer.company), - id: offer.id, - income: { - baseCurrency: '', - baseValue: -1, - currency: '', - id: '', - value: -1, - }, - jobType: offer.jobType, - level: offer.offersFullTime?.level ?? '', - location: offer.location, - monthYearReceived: offer.monthYearReceived, - title: - offer.jobType === JobType.FULLTIME - ? offer.offersFullTime?.title ?? '' - : offer.offersIntern?.title ?? '', - } + company: Company; + offersFullTime: + | (OffersFullTime & { totalCompensation: OffersCurrency }) + | null; + offersIntern: (OffersIntern & { monthlySalary: OffersCurrency }) | null; + }, +): UserProfileOffer => { + const mappedOffer: UserProfileOffer = { + company: offersCompanyDtoMapper(offer.company), + id: offer.id, + income: { + baseCurrency: '', + baseValue: -1, + currency: '', + id: '', + value: -1, + }, + jobType: offer.jobType, + level: offer.offersFullTime?.level ?? '', + location: offer.location, + monthYearReceived: offer.monthYearReceived, + title: + offer.jobType === JobType.FULLTIME + ? offer.offersFullTime?.title ?? '' + : offer.offersIntern?.title ?? '', + }; - if (offer.offersFullTime?.totalCompensation) { - mappedOffer.income.value = - offer.offersFullTime.totalCompensation.value; - mappedOffer.income.currency = - offer.offersFullTime.totalCompensation.currency; - mappedOffer.income.id = offer.offersFullTime.totalCompensation.id; - mappedOffer.income.baseValue = - offer.offersFullTime.totalCompensation.baseValue; - mappedOffer.income.baseCurrency = - offer.offersFullTime.totalCompensation.baseCurrency; - } else if (offer.offersIntern?.monthlySalary) { - mappedOffer.income.value = offer.offersIntern.monthlySalary.value; - mappedOffer.income.currency = - offer.offersIntern.monthlySalary.currency; - mappedOffer.income.id = offer.offersIntern.monthlySalary.id; - mappedOffer.income.baseValue = - offer.offersIntern.monthlySalary.baseValue; - mappedOffer.income.baseCurrency = - offer.offersIntern.monthlySalary.baseCurrency; - } else { - throw new TRPCError({ - code: 'NOT_FOUND', - message: 'Total Compensation or Salary not found', - }); - } + if (offer.offersFullTime?.totalCompensation) { + mappedOffer.income.value = offer.offersFullTime.totalCompensation.value; + mappedOffer.income.currency = + offer.offersFullTime.totalCompensation.currency; + mappedOffer.income.id = offer.offersFullTime.totalCompensation.id; + mappedOffer.income.baseValue = + offer.offersFullTime.totalCompensation.baseValue; + mappedOffer.income.baseCurrency = + offer.offersFullTime.totalCompensation.baseCurrency; + } else if (offer.offersIntern?.monthlySalary) { + mappedOffer.income.value = offer.offersIntern.monthlySalary.value; + mappedOffer.income.currency = offer.offersIntern.monthlySalary.currency; + mappedOffer.income.id = offer.offersIntern.monthlySalary.id; + mappedOffer.income.baseValue = offer.offersIntern.monthlySalary.baseValue; + mappedOffer.income.baseCurrency = + offer.offersIntern.monthlySalary.baseCurrency; + } else { + throw new TRPCError({ + code: 'NOT_FOUND', + message: 'Total Compensation or Salary not found', + }); + } - return mappedOffer -} \ No newline at end of file + return mappedOffer; +}; diff --git a/apps/portal/src/server/router/offers/offers-analysis-router.ts b/apps/portal/src/server/router/offers/offers-analysis-router.ts index 8176b3c3..ede0c57f 100644 --- a/apps/portal/src/server/router/offers/offers-analysis-router.ts +++ b/apps/portal/src/server/router/offers/offers-analysis-router.ts @@ -14,6 +14,15 @@ import { profileAnalysisDtoMapper } from '~/mappers/offers-mappers'; import { createRouter } from '../context'; +type Offer = OffersOffer & { + company: Company; + offersFullTime: + | (OffersFullTime & { totalCompensation: OffersCurrency }) + | null; + offersIntern: (OffersIntern & { monthlySalary: OffersCurrency }) | null; + profile: OffersProfile & { background: OffersBackground | null }; +}; + const searchOfferPercentile = ( offer: OffersOffer & { company: Company; @@ -58,46 +67,62 @@ export const offersAnalysisRouter = createRouter() async resolve({ ctx, input }) { const analysis = await ctx.prisma.offersAnalysis.findFirst({ include: { - overallHighestOffer: { + companyAnalysis: { include: { - company: true, - offersFullTime: { - include: { - totalCompensation: true, - }, - }, - offersIntern: { + topSimilarOffers: { include: { - monthlySalary: true, - }, - }, - profile: { - include: { - background: true, + company: true, + offersFullTime: { + include: { + totalCompensation: true, + }, + }, + offersIntern: { + include: { + monthlySalary: true, + }, + }, + profile: { + include: { + background: { + include: { + experiences: { + include: { + company: true, + }, + }, + }, + }, + }, + }, }, }, }, }, - topCompanyOffers: { + overallAnalysis: { include: { - company: true, - offersFullTime: { - include: { - totalCompensation: true, - }, - }, - offersIntern: { + topSimilarOffers: { include: { - monthlySalary: true, - }, - }, - profile: { - include: { - background: { + company: true, + offersFullTime: { + include: { + totalCompensation: true, + }, + }, + offersIntern: { include: { - experiences: { + monthlySalary: true, + }, + }, + profile: { + include: { + background: { include: { - company: true, + experiences: { + include: { + company: true, + }, + }, }, }, }, @@ -106,7 +131,7 @@ export const offersAnalysisRouter = createRouter() }, }, }, - topOverallOffers: { + overallHighestOffer: { include: { company: true, offersFullTime: { @@ -121,15 +146,7 @@ export const offersAnalysisRouter = createRouter() }, profile: { include: { - background: { - include: { - experiences: { - include: { - company: true, - }, - }, - }, - }, + background: true, }, }, }, @@ -310,11 +327,56 @@ export const offersAnalysisRouter = createRouter() }, }); - let similarCompanyOffers = similarOffers.filter( - (offer) => offer.companyId === overallHighestOffer.companyId, + // COMPANY ANALYSIS + const companyMap = new Map(); + offers.forEach((offer) => { + if (companyMap.get(offer.companyId) == null) { + companyMap.set(offer.companyId, offer); + } + }); + + const companyAnalysis = Array.from(companyMap.values()).map( + (companyOffer) => { + // TODO: Refactor calculating analysis into a function + let similarCompanyOffers = similarOffers.filter( + (offer) => offer.companyId === overallHighestOffer.companyId, + ); + + const companyIndex = searchOfferPercentile( + overallHighestOffer, + similarCompanyOffers, + ); + const companyPercentile = + similarCompanyOffers.length <= 1 + ? 100 + : 100 - (100 * companyIndex) / (similarCompanyOffers.length - 1); + + // Get top offers (excluding user's offer) + similarCompanyOffers = similarCompanyOffers.filter( + (offer) => offer.id !== companyOffer.id, + ); + + const noOfSimilarCompanyOffers = similarCompanyOffers.length; + const similarCompanyOffers90PercentileIndex = Math.ceil( + noOfSimilarCompanyOffers * 0.1, + ); + const topPercentileCompanyOffers = + noOfSimilarCompanyOffers > 2 + ? similarCompanyOffers.slice( + similarCompanyOffers90PercentileIndex, + similarCompanyOffers90PercentileIndex + 2, + ) + : similarCompanyOffers; + + return { + noOfSimilarOffers: noOfSimilarCompanyOffers, + percentile: companyPercentile, + topSimilarOffers: topPercentileCompanyOffers, + }; + }, ); - // CALCULATE PERCENTILES + // OVERALL ANALYSIS const overallIndex = searchOfferPercentile( overallHighestOffer, similarOffers, @@ -324,23 +386,9 @@ export const offersAnalysisRouter = createRouter() ? 100 : 100 - (100 * overallIndex) / (similarOffers.length - 1); - const companyIndex = searchOfferPercentile( - overallHighestOffer, - similarCompanyOffers, - ); - const companyPercentile = - similarCompanyOffers.length <= 1 - ? 100 - : 100 - (100 * companyIndex) / (similarCompanyOffers.length - 1); - - // FIND TOP >=90 PERCENTILE OFFERS, DOESN'T GIVE 100th PERCENTILE - // e.g. If there only 4 offers, it gives the 2nd and 3rd offer similarOffers = similarOffers.filter( (offer) => offer.id !== overallHighestOffer.id, ); - similarCompanyOffers = similarCompanyOffers.filter( - (offer) => offer.id !== overallHighestOffer.id, - ); const noOfSimilarOffers = similarOffers.length; const similarOffers90PercentileIndex = Math.ceil(noOfSimilarOffers * 0.1); @@ -352,86 +400,100 @@ export const offersAnalysisRouter = createRouter() ) : similarOffers; - const noOfSimilarCompanyOffers = similarCompanyOffers.length; - const similarCompanyOffers90PercentileIndex = Math.ceil( - noOfSimilarCompanyOffers * 0.1, - ); - const topPercentileCompanyOffers = - noOfSimilarCompanyOffers > 2 - ? similarCompanyOffers.slice( - similarCompanyOffers90PercentileIndex, - similarCompanyOffers90PercentileIndex + 2, - ) - : similarCompanyOffers; - const analysis = await ctx.prisma.offersAnalysis.create({ data: { - companyPercentile, - noOfSimilarCompanyOffers, - noOfSimilarOffers, + companyAnalysis: { + create: companyAnalysis.map((analysisUnit) => { + return { + noOfSimilarOffers: analysisUnit.noOfSimilarOffers, + percentile: analysisUnit.percentile, + topSimilarOffers: { + connect: analysisUnit.topSimilarOffers.map((offer) => { + return { id: offer.id }; + }), + }, + }; + }), + }, + overallAnalysis: { + create: { + noOfSimilarOffers, + percentile: overallPercentile, + topSimilarOffers: { + connect: topPercentileOffers.map((offer) => { + return { id: offer.id }; + }), + }, + }, + }, overallHighestOffer: { connect: { id: overallHighestOffer.id, }, }, - overallPercentile, profile: { connect: { id: input.profileId, }, }, - topCompanyOffers: { - connect: topPercentileCompanyOffers.map((offer) => { - return { id: offer.id }; - }), - }, - topOverallOffers: { - connect: topPercentileOffers.map((offer) => { - return { id: offer.id }; - }), - }, }, include: { - overallHighestOffer: { + companyAnalysis: { include: { - company: true, - offersFullTime: { + topSimilarOffers: { include: { - totalCompensation: true, - }, - }, - offersIntern: { - include: { - monthlySalary: true, - }, - }, - profile: { - include: { - background: true, + company: true, + offersFullTime: { + include: { + totalCompensation: true, + }, + }, + offersIntern: { + include: { + monthlySalary: true, + }, + }, + profile: { + include: { + background: { + include: { + experiences: { + include: { + company: true, + }, + }, + }, + }, + }, + }, }, }, }, }, - topCompanyOffers: { + overallAnalysis: { include: { - company: true, - offersFullTime: { + topSimilarOffers: { include: { - totalCompensation: true, - }, - }, - offersIntern: { - include: { - monthlySalary: true, - }, - }, - profile: { - include: { - background: { + company: true, + offersFullTime: { + include: { + totalCompensation: true, + }, + }, + offersIntern: { + include: { + monthlySalary: true, + }, + }, + profile: { include: { - experiences: { + background: { include: { - company: true, + experiences: { + include: { + company: true, + }, + }, }, }, }, @@ -440,7 +502,7 @@ export const offersAnalysisRouter = createRouter() }, }, }, - topOverallOffers: { + overallHighestOffer: { include: { company: true, offersFullTime: { @@ -455,15 +517,7 @@ export const offersAnalysisRouter = createRouter() }, profile: { include: { - background: { - include: { - experiences: { - include: { - company: true, - }, - }, - }, - }, + background: true, }, }, }, diff --git a/apps/portal/src/server/router/offers/offers-profile-router.ts b/apps/portal/src/server/router/offers/offers-profile-router.ts index 1e1d1d52..f6567560 100644 --- a/apps/portal/src/server/router/offers/offers-profile-router.ts +++ b/apps/portal/src/server/router/offers/offers-profile-router.ts @@ -113,46 +113,62 @@ export const offersProfileRouter = createRouter() include: { analysis: { include: { - overallHighestOffer: { + companyAnalysis: { include: { - company: true, - offersFullTime: { - include: { - totalCompensation: true, - }, - }, - offersIntern: { + topSimilarOffers: { include: { - monthlySalary: true, - }, - }, - profile: { - include: { - background: true, + company: true, + offersFullTime: { + include: { + totalCompensation: true, + }, + }, + offersIntern: { + include: { + monthlySalary: true, + }, + }, + profile: { + include: { + background: { + include: { + experiences: { + include: { + company: true, + }, + }, + }, + }, + }, + }, }, }, }, }, - topCompanyOffers: { + overallAnalysis: { include: { - company: true, - offersFullTime: { - include: { - totalCompensation: true, - }, - }, - offersIntern: { + topSimilarOffers: { include: { - monthlySalary: true, - }, - }, - profile: { - include: { - background: { + company: true, + offersFullTime: { include: { - experiences: { + totalCompensation: true, + }, + }, + offersIntern: { + include: { + monthlySalary: true, + }, + }, + profile: { + include: { + background: { include: { - company: true, + experiences: { + include: { + company: true, + }, + }, }, }, }, @@ -161,7 +177,7 @@ export const offersProfileRouter = createRouter() }, }, }, - topOverallOffers: { + overallHighestOffer: { include: { company: true, offersFullTime: { @@ -176,15 +192,7 @@ export const offersProfileRouter = createRouter() }, profile: { include: { - background: { - include: { - experiences: { - include: { - company: true, - }, - }, - }, - }, + background: true, }, }, }, @@ -394,7 +402,7 @@ export const offersProfileRouter = createRouter() message: 'Missing fields in background experiences.', }); }), - ) + ), }, specificYoes: { create: input.background.specificYoes.map((x) => { diff --git a/apps/portal/src/types/offers.d.ts b/apps/portal/src/types/offers.d.ts index b26995d7..670627a6 100644 --- a/apps/portal/src/types/offers.d.ts +++ b/apps/portal/src/types/offers.d.ts @@ -143,14 +143,14 @@ export type OffersDiscussion = { }; export type ProfileAnalysis = { - companyAnalysis: Array; + companyAnalysis: Array; id: string; - overallAnalysis: Analysis; + overallAnalysis: AnalysisUnit; overallHighestOffer: AnalysisHighestOffer; profileId: string; }; -export type Analysis = { +export type AnalysisUnit = { noOfOffers: number; percentile: number; topPercentileOffers: Array; @@ -191,7 +191,7 @@ export type UserProfile = { offers: Array; profileName: string; token: string; -} +}; export type UserProfileOffer = { company: OffersCompany; @@ -202,4 +202,4 @@ export type UserProfileOffer = { location: string; monthYearReceived: Date; title: string; -} \ No newline at end of file +};