From e17156cbc1a58f58286e887ffb9f6af9d8fa0eb5 Mon Sep 17 00:00:00 2001 From: himaniraghav3 Date: Wed, 29 Jul 2026 15:28:38 +0530 Subject: [PATCH 1/7] PM-5710 New fields for engagements --- .circleci/config.yml | 1 + .../migration.sql | 9 +++ prisma/schema.prisma | 55 +++++++++++-------- src/engagements/dto/create-engagement.dto.ts | 45 +++++++++++++++ .../dto/engagement-response.dto.ts | 33 +++++++++++ .../engagement-response.e2e.spec.ts | 15 +++++ src/engagements/engagements.service.spec.ts | 5 ++ src/engagements/engagements.service.ts | 29 ++++++++++ 8 files changed, 170 insertions(+), 22 deletions(-) create mode 100644 prisma/migrations/20260729100000_add_engagement_internal_account_fields/migration.sql diff --git a/.circleci/config.yml b/.circleci/config.yml index 932512a..3f19e2c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -65,6 +65,7 @@ workflows: only: - develop - PM-4669_payment-cycles + - v9-engagements # Production builds are exectuted only on tagged commits to the # master branch. diff --git a/prisma/migrations/20260729100000_add_engagement_internal_account_fields/migration.sql b/prisma/migrations/20260729100000_add_engagement_internal_account_fields/migration.sql new file mode 100644 index 0000000..851430b --- /dev/null +++ b/prisma/migrations/20260729100000_add_engagement_internal_account_fields/migration.sql @@ -0,0 +1,9 @@ +-- CreateEnum +CREATE TYPE "RoleLevel" AS ENUM ('JUNIOR', 'MID', 'SENIOR'); + +-- AlterTable +ALTER TABLE "Engagement" ADD COLUMN "account" TEXT, +ADD COLUMN "receivedDateFromAccount" TIMESTAMP(3), +ADD COLUMN "roleLevel" "RoleLevel", +ADD COLUMN "smu" TEXT, +ADD COLUMN "spoc" TEXT; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 53cdcfa..e199c7e 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -60,29 +60,40 @@ enum AnticipatedStart { FEW_WEEKS } +enum RoleLevel { + JUNIOR + MID + SENIOR +} + model Engagement { - id String @id @default(uuid()) - projectId String - title String - description String - durationStartDate DateTime? - durationEndDate DateTime? - durationWeeks Int? - durationMonths Int? - timeZones String[] - countries String[] - requiredSkills String[] - anticipatedStart AnticipatedStart - status EngagementStatus @default(OPEN) - isPrivate Boolean @default(false) - requiredMemberCount Int? - role Role? - workload Workload? - compensationRange String? - createdAt DateTime @default(now()) - createdBy String - updatedAt DateTime @updatedAt - updatedBy String? + id String @id @default(uuid()) + projectId String + title String + description String + durationStartDate DateTime? + durationEndDate DateTime? + durationWeeks Int? + durationMonths Int? + timeZones String[] + countries String[] + requiredSkills String[] + anticipatedStart AnticipatedStart + status EngagementStatus @default(OPEN) + isPrivate Boolean @default(false) + requiredMemberCount Int? + role Role? + roleLevel RoleLevel? + workload Workload? + compensationRange String? + receivedDateFromAccount DateTime? + account String? + smu String? + spoc String? + createdAt DateTime @default(now()) + createdBy String + updatedAt DateTime @updatedAt + updatedBy String? applications EngagementApplication[] assignments EngagementAssignment[] diff --git a/src/engagements/dto/create-engagement.dto.ts b/src/engagements/dto/create-engagement.dto.ts index 962d82d..b5cc0e0 100644 --- a/src/engagements/dto/create-engagement.dto.ts +++ b/src/engagements/dto/create-engagement.dto.ts @@ -26,6 +26,7 @@ import { EngagementStatus, PaymentCycle, Role, + RoleLevel, Workload, } from "@prisma/client"; import { HasDuration, IsNotWhitespace } from "../../common/validation.util"; @@ -276,6 +277,50 @@ export class CreateEngagementDto { @MaxLength(100) compensationRange?: string; + @ApiPropertyOptional({ + description: "Internal: date the request was received from the account", + example: "2026-07-15T00:00:00.000Z", + }) + @IsOptional() + @IsDateString() + receivedDateFromAccount?: string | null; + + @ApiPropertyOptional({ + description: "Internal: account name", + example: "Acme Corp", + }) + @IsOptional() + @IsString() + @MaxLength(255) + account?: string | null; + + @ApiPropertyOptional({ + description: "Internal: SMU", + example: "North America", + }) + @IsOptional() + @IsString() + @MaxLength(255) + smu?: string | null; + + @ApiPropertyOptional({ + description: "Internal: SPOC", + example: "Jane Doe", + }) + @IsOptional() + @IsString() + @MaxLength(255) + spoc?: string | null; + + @ApiPropertyOptional({ + description: "Internal: role level for the engagement", + enum: RoleLevel, + example: RoleLevel.SENIOR, + }) + @IsOptional() + @IsEnum(RoleLevel) + roleLevel?: RoleLevel | null; + @ApiProperty({ description: "Anticipated start timeframe", enum: AnticipatedStart, diff --git a/src/engagements/dto/engagement-response.dto.ts b/src/engagements/dto/engagement-response.dto.ts index d989791..8826a90 100644 --- a/src/engagements/dto/engagement-response.dto.ts +++ b/src/engagements/dto/engagement-response.dto.ts @@ -3,6 +3,7 @@ import { AnticipatedStart, EngagementStatus, Role, + RoleLevel, Workload, } from "@prisma/client"; import { Transform } from "class-transformer"; @@ -229,6 +230,38 @@ export class EngagementResponseDto { }) compensationRange?: string; + @ApiPropertyOptional({ + description: "Internal: date the request was received from the account", + example: "2026-07-15T00:00:00.000Z", + }) + receivedDateFromAccount?: Date | null; + + @ApiPropertyOptional({ + description: "Internal: account name", + example: "Acme Corp", + }) + account?: string | null; + + @ApiPropertyOptional({ + description: "Internal: SMU", + example: "North America", + }) + smu?: string | null; + + @ApiPropertyOptional({ + description: "Internal: SPOC", + example: "Jane Doe", + }) + spoc?: string | null; + + @ApiPropertyOptional({ + description: "Internal: role level for the engagement", + enum: RoleLevel, + example: RoleLevel.SENIOR, + }) + @Transform(({ value }) => value?.toString()) + roleLevel?: RoleLevel | null; + @ApiPropertyOptional({ description: "Number of applications for the engagement", example: 12, diff --git a/src/engagements/engagement-response.e2e.spec.ts b/src/engagements/engagement-response.e2e.spec.ts index e19fb5a..c884ddd 100644 --- a/src/engagements/engagement-response.e2e.spec.ts +++ b/src/engagements/engagement-response.e2e.spec.ts @@ -93,6 +93,11 @@ describe("Engagement Response (e2e)", () => { role: Role.SOFTWARE_DEVELOPER, workload: Workload.FULL_TIME, compensationRange: null, + receivedDateFromAccount: null, + account: null, + smu: null, + spoc: null, + roleLevel: null, assignments: [], }); }); @@ -110,11 +115,21 @@ describe("Engagement Response (e2e)", () => { expect(response.body).toHaveProperty("role"); expect(response.body).toHaveProperty("workload"); expect(response.body).toHaveProperty("compensationRange"); + expect(response.body).toHaveProperty("receivedDateFromAccount"); + expect(response.body).toHaveProperty("account"); + expect(response.body).toHaveProperty("smu"); + expect(response.body).toHaveProperty("spoc"); + expect(response.body).toHaveProperty("roleLevel"); expect(typeof response.body.role).toBe("string"); expect(typeof response.body.workload).toBe("string"); expect(response.body.role).toBe(Role.SOFTWARE_DEVELOPER); expect(response.body.workload).toBe(Workload.FULL_TIME); expect(response.body.compensationRange).toBeNull(); + expect(response.body.receivedDateFromAccount).toBeNull(); + expect(response.body.account).toBeNull(); + expect(response.body.smu).toBeNull(); + expect(response.body.spoc).toBeNull(); + expect(response.body.roleLevel).toBeNull(); }); it("allows an assigned member to view a private engagement", async () => { diff --git a/src/engagements/engagements.service.spec.ts b/src/engagements/engagements.service.spec.ts index ac4c4a0..1ec1eaf 100644 --- a/src/engagements/engagements.service.spec.ts +++ b/src/engagements/engagements.service.spec.ts @@ -137,6 +137,11 @@ describe("EngagementsService", () => { role: null, workload: null, compensationRange: null, + receivedDateFromAccount: null, + account: null, + smu: null, + spoc: null, + roleLevel: null, createdAt: new Date("2026-01-01T00:00:00.000Z"), createdBy: "manager-1", updatedAt: new Date("2026-01-01T00:00:00.000Z"), diff --git a/src/engagements/engagements.service.ts b/src/engagements/engagements.service.ts index d2d51a9..371103f 100644 --- a/src/engagements/engagements.service.ts +++ b/src/engagements/engagements.service.ts @@ -12,6 +12,7 @@ import { EngagementStatus, PaymentCycle, Role, + RoleLevel, Prisma, Workload, } from "@prisma/client"; @@ -333,6 +334,9 @@ export class EngagementsService { ...payload, durationStartDate: this.normalizeDate(payload.durationStartDate), durationEndDate: this.normalizeDate(payload.durationEndDate), + receivedDateFromAccount: this.normalizeDate( + payload.receivedDateFromAccount ?? undefined, + ), createdBy: userIdentifier, }, }); @@ -915,10 +919,18 @@ export class EngagementsService { role: engagementWithFields.role ? (engagementWithFields.role.toString() as Role) : null, + roleLevel: engagementWithFields.roleLevel + ? (engagementWithFields.roleLevel.toString() as RoleLevel) + : null, workload: engagementWithFields.workload ? (engagementWithFields.workload.toString() as Workload) : null, compensationRange: engagementWithFields.compensationRange ?? null, + receivedDateFromAccount: + engagementWithFields.receivedDateFromAccount ?? null, + account: engagementWithFields.account ?? null, + smu: engagementWithFields.smu ?? null, + spoc: engagementWithFields.spoc ?? null, }; if (!options.includeCreatorEmail) { @@ -1531,6 +1543,23 @@ export class EngagementsService { if (payload.compensationRange !== undefined) { data.compensationRange = payload.compensationRange; } + if (payload.receivedDateFromAccount !== undefined) { + data.receivedDateFromAccount = payload.receivedDateFromAccount + ? this.normalizeDate(payload.receivedDateFromAccount) + : null; + } + if (payload.account !== undefined) { + data.account = payload.account; + } + if (payload.smu !== undefined) { + data.smu = payload.smu; + } + if (payload.spoc !== undefined) { + data.spoc = payload.spoc; + } + if (payload.roleLevel !== undefined) { + data.roleLevel = payload.roleLevel; + } if (payload.isPrivate !== undefined) { data.isPrivate = payload.isPrivate; } From bb03aafaef1d7bf0d51aeae9813bc1ec23ba5c35 Mon Sep 17 00:00:00 2001 From: himaniraghav3 Date: Thu, 30 Jul 2026 13:07:24 +0530 Subject: [PATCH 2/7] PM-5711 Make few fields optional for private enagagements --- src/common/validation.util.ts | 9 ++++++- src/engagements/dto/create-engagement.dto.ts | 25 +++++++++++++------- src/engagements/engagements.service.ts | 5 ++++ 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/common/validation.util.ts b/src/common/validation.util.ts index fd1a121..1f807dc 100644 --- a/src/common/validation.util.ts +++ b/src/common/validation.util.ts @@ -60,7 +60,14 @@ export function HasDuration(validationOptions?: ValidationOptions) { options: validationOptions, validator: { validate(_value: unknown, args: ValidationArguments) { - return hasValidDuration(args.object as Record); + const dto = args.object as Record; + + // Private engagements do not collect public duration fields. + if (dto.isPrivate === true) { + return true; + } + + return hasValidDuration(dto); }, defaultMessage() { return ERROR_MESSAGES.MissingDuration; diff --git a/src/engagements/dto/create-engagement.dto.ts b/src/engagements/dto/create-engagement.dto.ts index b5cc0e0..24e12e5 100644 --- a/src/engagements/dto/create-engagement.dto.ts +++ b/src/engagements/dto/create-engagement.dto.ts @@ -17,6 +17,7 @@ import { IsOptional, IsString, Matches, + ValidateIf, ValidateNested, MaxLength, Min, @@ -223,23 +224,27 @@ export class CreateEngagementDto { @Min(1) durationMonths?: number; - @ApiProperty({ - description: "Accepted time zones. Must contain at least one timezone.", + @ApiPropertyOptional({ + description: + "Accepted time zones. Required for public engagements; optional for private engagements.", example: ["UTC", "America/New_York"], }) + @ValidateIf((dto: { isPrivate?: boolean }) => dto.isPrivate !== true) @IsArray() @ArrayMinSize(1) @IsString({ each: true }) - timeZones: string[]; + timeZones?: string[]; - @ApiProperty({ - description: "Accepted countries. Must contain at least one country.", + @ApiPropertyOptional({ + description: + "Accepted countries. Required for public engagements; optional for private engagements.", example: ["US", "CA"], }) + @ValidateIf((dto: { isPrivate?: boolean }) => dto.isPrivate !== true) @IsArray() @ArrayMinSize(1) @IsString({ each: true }) - countries: string[]; + countries?: string[]; @ApiProperty({ description: "Required skill IDs. Must contain at least one skill ID.", @@ -321,14 +326,16 @@ export class CreateEngagementDto { @IsEnum(RoleLevel) roleLevel?: RoleLevel | null; - @ApiProperty({ - description: "Anticipated start timeframe", + @ApiPropertyOptional({ + description: + "Anticipated start timeframe. Required for public engagements; optional for private engagements.", enum: AnticipatedStart, example: AnticipatedStart.IMMEDIATE, }) + @ValidateIf((dto: { isPrivate?: boolean }) => dto.isPrivate !== true) @IsEnum(AnticipatedStart) @IsNotEmpty() - anticipatedStart: AnticipatedStart; + anticipatedStart?: AnticipatedStart; @ApiPropertyOptional({ description: "Engagement status, including ON_HOLD when applicable", diff --git a/src/engagements/engagements.service.ts b/src/engagements/engagements.service.ts index 371103f..93eaf14 100644 --- a/src/engagements/engagements.service.ts +++ b/src/engagements/engagements.service.ts @@ -9,6 +9,7 @@ import { Engagement, EngagementAssignment, AssignmentStatus, + AnticipatedStart, EngagementStatus, PaymentCycle, Role, @@ -332,6 +333,10 @@ export class EngagementsService { data: { id: nanoid(), ...payload, + anticipatedStart: + payload.anticipatedStart ?? AnticipatedStart.IMMEDIATE, + countries: payload.countries ?? [], + timeZones: payload.timeZones ?? [], durationStartDate: this.normalizeDate(payload.durationStartDate), durationEndDate: this.normalizeDate(payload.durationEndDate), receivedDateFromAccount: this.normalizeDate( From 27bb5b9ea290686575445091b46da83b3394d14c Mon Sep 17 00:00:00 2001 From: himaniraghav3 Date: Thu, 30 Jul 2026 13:18:54 +0530 Subject: [PATCH 3/7] fix optional duration in weeks --- src/engagements/dto/create-engagement.dto.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/engagements/dto/create-engagement.dto.ts b/src/engagements/dto/create-engagement.dto.ts index 24e12e5..1db2bb7 100644 --- a/src/engagements/dto/create-engagement.dto.ts +++ b/src/engagements/dto/create-engagement.dto.ts @@ -203,11 +203,12 @@ export class CreateEngagementDto { @IsDateString() durationEndDate?: string; - @ApiProperty({ + @ApiPropertyOptional({ description: - "Duration in weeks. Required if durationMonths and durationStartDate/durationEndDate are not provided.", + "Duration in weeks. Required for public engagements when durationMonths and durationStartDate/durationEndDate are not provided. Optional for private engagements.", example: 8, }) + @IsOptional() @Type(() => Number) @IsInt() @Min(1) From dfa82d41dca4803e577cb052d15026188b9e3184 Mon Sep 17 00:00:00 2001 From: himaniraghav3 Date: Thu, 30 Jul 2026 13:28:40 +0530 Subject: [PATCH 4/7] Skip empty timezone checks for pvt engagements --- src/engagements/engagements.service.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/engagements/engagements.service.ts b/src/engagements/engagements.service.ts index 93eaf14..65dfaa0 100644 --- a/src/engagements/engagements.service.ts +++ b/src/engagements/engagements.service.ts @@ -273,8 +273,10 @@ export class EngagementsService { this.assertNonBlankField(createDto.title, "title"); this.assertNonBlankField(createDto.description, "description"); - this.assertNonEmptyArrayField(createDto.timeZones, "timeZones"); - this.assertNonEmptyArrayField(createDto.countries, "countries"); + if (!createDto.isPrivate) { + this.assertNonEmptyArrayField(createDto.timeZones, "timeZones"); + this.assertNonEmptyArrayField(createDto.countries, "countries"); + } this.assertNonEmptyArrayField(createDto.requiredSkills, "requiredSkills"); await this.assertProjectExists(createDto.projectId); @@ -1387,18 +1389,22 @@ export class EngagementsService { if (updateDto.description !== undefined) { this.assertNonBlankField(updateDto.description, "description"); } - if (updateDto.timeZones !== undefined) { + + const existingEngagement = await this.findOne(id); + const isPrivateEngagement = + updateDto.isPrivate === true || + (updateDto.isPrivate !== false && existingEngagement.isPrivate === true); + + if (updateDto.timeZones !== undefined && !isPrivateEngagement) { this.assertNonEmptyArrayField(updateDto.timeZones, "timeZones"); } - if (updateDto.countries !== undefined) { + if (updateDto.countries !== undefined && !isPrivateEngagement) { this.assertNonEmptyArrayField(updateDto.countries, "countries"); } if (updateDto.requiredSkills !== undefined) { this.assertNonEmptyArrayField(updateDto.requiredSkills, "requiredSkills"); } - const existingEngagement = await this.findOne(id); - if (updateDto.projectId) { const normalizedCurrentProjectId = this.normalizeProjectId( existingEngagement.projectId, From a1a91e55de8f3c6a001effbd6369ad8aedda74c7 Mon Sep 17 00:00:00 2001 From: himaniraghav3 Date: Thu, 30 Jul 2026 14:23:55 +0530 Subject: [PATCH 5/7] PM-5713 Add shortlisted application status --- packages/engagements-prisma-client/edge.js | 3 ++- packages/engagements-prisma-client/index-browser.js | 1 + packages/engagements-prisma-client/index.d.ts | 1 + packages/engagements-prisma-client/index.js | 3 ++- packages/engagements-prisma-client/schema.prisma | 1 + .../migration.sql | 2 ++ prisma/schema.prisma | 1 + 7 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 prisma/migrations/20260730100000_add_shortlisted_application_status/migration.sql diff --git a/packages/engagements-prisma-client/edge.js b/packages/engagements-prisma-client/edge.js index 1a9863b..24908da 100644 --- a/packages/engagements-prisma-client/edge.js +++ b/packages/engagements-prisma-client/edge.js @@ -204,6 +204,7 @@ exports.EngagementStatus = exports.$Enums.EngagementStatus = { exports.ApplicationStatus = exports.$Enums.ApplicationStatus = { SUBMITTED: 'SUBMITTED', UNDER_REVIEW: 'UNDER_REVIEW', + SHORTLISTED: 'SHORTLISTED', SELECTED: 'SELECTED', ACCEPTED: 'ACCEPTED', REJECTED: 'REJECTED' @@ -256,7 +257,7 @@ const config = { "clientVersion": "7.8.0", "engineVersion": "3c6e192761c0362d496ed980de936e2f3cebcd3a", "activeProvider": "postgresql", - "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n}\n\ngenerator externalClient {\n provider = \"prisma-client-js\"\n output = \"../packages/engagements-prisma-client\"\n binaryTargets = [\"native\", \"debian-openssl-3.0.x\"]\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nenum EngagementStatus {\n OPEN\n ACTIVE\n CANCELLED\n CLOSED\n ON_HOLD\n}\n\nenum ApplicationStatus {\n SUBMITTED\n UNDER_REVIEW\n SELECTED\n ACCEPTED\n REJECTED\n}\n\nenum AssignmentStatus {\n SELECTED\n OFFER_REJECTED\n ASSIGNED\n COMPLETED\n TERMINATED\n}\n\nenum PaymentCycle {\n WEEKLY\n FORTNIGHTLY\n MONTHLY\n}\n\nenum Role {\n DESIGNER\n SOFTWARE_DEVELOPER\n DATA_SCIENTIST\n DATA_ENGINEER\n}\n\nenum Workload {\n FULL_TIME\n FRACTIONAL\n}\n\nenum AnticipatedStart {\n IMMEDIATE\n FEW_DAYS\n FEW_WEEKS\n}\n\nmodel Engagement {\n id String @id @default(uuid())\n projectId String\n title String\n description String\n durationStartDate DateTime?\n durationEndDate DateTime?\n durationWeeks Int?\n durationMonths Int?\n timeZones String[]\n countries String[]\n requiredSkills String[]\n anticipatedStart AnticipatedStart\n status EngagementStatus @default(OPEN)\n isPrivate Boolean @default(false)\n requiredMemberCount Int?\n role Role?\n workload Workload?\n compensationRange String?\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String?\n\n applications EngagementApplication[]\n assignments EngagementAssignment[]\n\n @@index([projectId])\n @@index([status])\n @@index([role])\n @@index([workload])\n}\n\nmodel EngagementApplication {\n id String @id @default(uuid())\n engagementId String\n userId String\n handle String?\n email String\n name String\n address String?\n mobileNumber String?\n coverLetter String?\n resumeUrl String?\n portfolioUrls String[]\n yearsOfExperience Int?\n availability String?\n status ApplicationStatus @default(SUBMITTED)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n updatedBy String?\n\n engagement Engagement @relation(fields: [engagementId], references: [id], onDelete: Cascade)\n\n @@unique([engagementId, userId])\n @@index([userId])\n @@index([engagementId])\n @@index([status])\n}\n\nmodel EngagementAssignment {\n id String @id @default(uuid())\n engagementId String\n memberId String\n memberHandle String\n status AssignmentStatus @default(SELECTED)\n agreementRate String?\n ratePerHour String?\n paymentCycle PaymentCycle @default(WEEKLY)\n standardHoursPerDay Float?\n /// @deprecated Use standardHoursPerDay instead.\n standardHoursPerWeek Float?\n durationMonths Int?\n otherRemarks String?\n terminationReason String?\n startDate DateTime?\n endDate DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n engagement Engagement @relation(fields: [engagementId], references: [id], onDelete: Restrict)\n feedback EngagementFeedback[]\n memberExperiences MemberExperience[]\n\n @@index([engagementId])\n @@index([engagementId, memberId])\n @@index([memberId])\n}\n\nmodel EngagementFeedback {\n id String @id @default(uuid())\n engagementAssignmentId String\n feedbackText String\n rating Int?\n givenByMemberId String?\n givenByHandle String?\n givenByEmail String?\n secretToken String? @unique\n secretTokenExpiresAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n assignment EngagementAssignment @relation(fields: [engagementAssignmentId], references: [id], onDelete: Cascade)\n\n @@index([engagementAssignmentId])\n @@index([givenByMemberId])\n}\n\nmodel MemberExperience {\n id String @id @default(uuid())\n engagementAssignmentId String\n experienceText String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n assignment EngagementAssignment @relation(fields: [engagementAssignmentId], references: [id], onDelete: Cascade)\n\n @@index([engagementAssignmentId])\n}\n" + "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n}\n\ngenerator externalClient {\n provider = \"prisma-client-js\"\n output = \"../packages/engagements-prisma-client\"\n binaryTargets = [\"native\", \"debian-openssl-3.0.x\"]\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nenum EngagementStatus {\n OPEN\n ACTIVE\n CANCELLED\n CLOSED\n ON_HOLD\n}\n\nenum ApplicationStatus {\n SUBMITTED\n UNDER_REVIEW\n SHORTLISTED\n SELECTED\n ACCEPTED\n REJECTED\n}\n\nenum AssignmentStatus {\n SELECTED\n OFFER_REJECTED\n ASSIGNED\n COMPLETED\n TERMINATED\n}\n\nenum PaymentCycle {\n WEEKLY\n FORTNIGHTLY\n MONTHLY\n}\n\nenum Role {\n DESIGNER\n SOFTWARE_DEVELOPER\n DATA_SCIENTIST\n DATA_ENGINEER\n}\n\nenum Workload {\n FULL_TIME\n FRACTIONAL\n}\n\nenum AnticipatedStart {\n IMMEDIATE\n FEW_DAYS\n FEW_WEEKS\n}\n\nmodel Engagement {\n id String @id @default(uuid())\n projectId String\n title String\n description String\n durationStartDate DateTime?\n durationEndDate DateTime?\n durationWeeks Int?\n durationMonths Int?\n timeZones String[]\n countries String[]\n requiredSkills String[]\n anticipatedStart AnticipatedStart\n status EngagementStatus @default(OPEN)\n isPrivate Boolean @default(false)\n requiredMemberCount Int?\n role Role?\n workload Workload?\n compensationRange String?\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String?\n\n applications EngagementApplication[]\n assignments EngagementAssignment[]\n\n @@index([projectId])\n @@index([status])\n @@index([role])\n @@index([workload])\n}\n\nmodel EngagementApplication {\n id String @id @default(uuid())\n engagementId String\n userId String\n handle String?\n email String\n name String\n address String?\n mobileNumber String?\n coverLetter String?\n resumeUrl String?\n portfolioUrls String[]\n yearsOfExperience Int?\n availability String?\n status ApplicationStatus @default(SUBMITTED)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n updatedBy String?\n\n engagement Engagement @relation(fields: [engagementId], references: [id], onDelete: Cascade)\n\n @@unique([engagementId, userId])\n @@index([userId])\n @@index([engagementId])\n @@index([status])\n}\n\nmodel EngagementAssignment {\n id String @id @default(uuid())\n engagementId String\n memberId String\n memberHandle String\n status AssignmentStatus @default(SELECTED)\n agreementRate String?\n ratePerHour String?\n paymentCycle PaymentCycle @default(WEEKLY)\n standardHoursPerDay Float?\n /// @deprecated Use standardHoursPerDay instead.\n standardHoursPerWeek Float?\n durationMonths Int?\n otherRemarks String?\n terminationReason String?\n startDate DateTime?\n endDate DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n engagement Engagement @relation(fields: [engagementId], references: [id], onDelete: Restrict)\n feedback EngagementFeedback[]\n memberExperiences MemberExperience[]\n\n @@index([engagementId])\n @@index([engagementId, memberId])\n @@index([memberId])\n}\n\nmodel EngagementFeedback {\n id String @id @default(uuid())\n engagementAssignmentId String\n feedbackText String\n rating Int?\n givenByMemberId String?\n givenByHandle String?\n givenByEmail String?\n secretToken String? @unique\n secretTokenExpiresAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n assignment EngagementAssignment @relation(fields: [engagementAssignmentId], references: [id], onDelete: Cascade)\n\n @@index([engagementAssignmentId])\n @@index([givenByMemberId])\n}\n\nmodel MemberExperience {\n id String @id @default(uuid())\n engagementAssignmentId String\n experienceText String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n assignment EngagementAssignment @relation(fields: [engagementAssignmentId], references: [id], onDelete: Cascade)\n\n @@index([engagementAssignmentId])\n}\n" } config.runtimeDataModel = JSON.parse("{\"models\":{\"Engagement\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"projectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"durationStartDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"durationEndDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"durationWeeks\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"durationMonths\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"timeZones\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"countries\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"requiredSkills\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"anticipatedStart\",\"kind\":\"enum\",\"type\":\"AnticipatedStart\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"EngagementStatus\"},{\"name\":\"isPrivate\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"requiredMemberCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"Role\"},{\"name\":\"workload\",\"kind\":\"enum\",\"type\":\"Workload\"},{\"name\":\"compensationRange\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"applications\",\"kind\":\"object\",\"type\":\"EngagementApplication\",\"relationName\":\"EngagementToEngagementApplication\"},{\"name\":\"assignments\",\"kind\":\"object\",\"type\":\"EngagementAssignment\",\"relationName\":\"EngagementToEngagementAssignment\"}],\"dbName\":null},\"EngagementApplication\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"engagementId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"handle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"address\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"mobileNumber\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"coverLetter\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resumeUrl\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"portfolioUrls\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"yearsOfExperience\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"availability\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"ApplicationStatus\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"engagement\",\"kind\":\"object\",\"type\":\"Engagement\",\"relationName\":\"EngagementToEngagementApplication\"}],\"dbName\":null},\"EngagementAssignment\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"engagementId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberHandle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"AssignmentStatus\"},{\"name\":\"agreementRate\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ratePerHour\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"paymentCycle\",\"kind\":\"enum\",\"type\":\"PaymentCycle\"},{\"name\":\"standardHoursPerDay\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"standardHoursPerWeek\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"durationMonths\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"otherRemarks\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"terminationReason\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"startDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"endDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"engagement\",\"kind\":\"object\",\"type\":\"Engagement\",\"relationName\":\"EngagementToEngagementAssignment\"},{\"name\":\"feedback\",\"kind\":\"object\",\"type\":\"EngagementFeedback\",\"relationName\":\"EngagementAssignmentToEngagementFeedback\"},{\"name\":\"memberExperiences\",\"kind\":\"object\",\"type\":\"MemberExperience\",\"relationName\":\"EngagementAssignmentToMemberExperience\"}],\"dbName\":null},\"EngagementFeedback\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"engagementAssignmentId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"feedbackText\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"rating\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"givenByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"givenByHandle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"givenByEmail\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"secretToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"secretTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"assignment\",\"kind\":\"object\",\"type\":\"EngagementAssignment\",\"relationName\":\"EngagementAssignmentToEngagementFeedback\"}],\"dbName\":null},\"MemberExperience\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"engagementAssignmentId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"experienceText\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"assignment\",\"kind\":\"object\",\"type\":\"EngagementAssignment\",\"relationName\":\"EngagementAssignmentToMemberExperience\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") diff --git a/packages/engagements-prisma-client/index-browser.js b/packages/engagements-prisma-client/index-browser.js index fac1376..f0831db 100644 --- a/packages/engagements-prisma-client/index-browser.js +++ b/packages/engagements-prisma-client/index-browser.js @@ -250,6 +250,7 @@ exports.Workload = exports.$Enums.Workload = { exports.ApplicationStatus = exports.$Enums.ApplicationStatus = { SUBMITTED: 'SUBMITTED', UNDER_REVIEW: 'UNDER_REVIEW', + SHORTLISTED: 'SHORTLISTED', SELECTED: 'SELECTED', ACCEPTED: 'ACCEPTED', REJECTED: 'REJECTED' diff --git a/packages/engagements-prisma-client/index.d.ts b/packages/engagements-prisma-client/index.d.ts index 3a8a634..9bc8c1c 100644 --- a/packages/engagements-prisma-client/index.d.ts +++ b/packages/engagements-prisma-client/index.d.ts @@ -57,6 +57,7 @@ export type EngagementStatus = (typeof EngagementStatus)[keyof typeof Engagement export const ApplicationStatus: { SUBMITTED: 'SUBMITTED', UNDER_REVIEW: 'UNDER_REVIEW', + SHORTLISTED: 'SHORTLISTED', SELECTED: 'SELECTED', ACCEPTED: 'ACCEPTED', REJECTED: 'REJECTED' diff --git a/packages/engagements-prisma-client/index.js b/packages/engagements-prisma-client/index.js index 2c4d8d7..b470628 100644 --- a/packages/engagements-prisma-client/index.js +++ b/packages/engagements-prisma-client/index.js @@ -205,6 +205,7 @@ exports.EngagementStatus = exports.$Enums.EngagementStatus = { exports.ApplicationStatus = exports.$Enums.ApplicationStatus = { SUBMITTED: 'SUBMITTED', UNDER_REVIEW: 'UNDER_REVIEW', + SHORTLISTED: 'SHORTLISTED', SELECTED: 'SELECTED', ACCEPTED: 'ACCEPTED', REJECTED: 'REJECTED' @@ -257,7 +258,7 @@ const config = { "clientVersion": "7.8.0", "engineVersion": "3c6e192761c0362d496ed980de936e2f3cebcd3a", "activeProvider": "postgresql", - "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n}\n\ngenerator externalClient {\n provider = \"prisma-client-js\"\n output = \"../packages/engagements-prisma-client\"\n binaryTargets = [\"native\", \"debian-openssl-3.0.x\"]\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nenum EngagementStatus {\n OPEN\n ACTIVE\n CANCELLED\n CLOSED\n ON_HOLD\n}\n\nenum ApplicationStatus {\n SUBMITTED\n UNDER_REVIEW\n SELECTED\n ACCEPTED\n REJECTED\n}\n\nenum AssignmentStatus {\n SELECTED\n OFFER_REJECTED\n ASSIGNED\n COMPLETED\n TERMINATED\n}\n\nenum PaymentCycle {\n WEEKLY\n FORTNIGHTLY\n MONTHLY\n}\n\nenum Role {\n DESIGNER\n SOFTWARE_DEVELOPER\n DATA_SCIENTIST\n DATA_ENGINEER\n}\n\nenum Workload {\n FULL_TIME\n FRACTIONAL\n}\n\nenum AnticipatedStart {\n IMMEDIATE\n FEW_DAYS\n FEW_WEEKS\n}\n\nmodel Engagement {\n id String @id @default(uuid())\n projectId String\n title String\n description String\n durationStartDate DateTime?\n durationEndDate DateTime?\n durationWeeks Int?\n durationMonths Int?\n timeZones String[]\n countries String[]\n requiredSkills String[]\n anticipatedStart AnticipatedStart\n status EngagementStatus @default(OPEN)\n isPrivate Boolean @default(false)\n requiredMemberCount Int?\n role Role?\n workload Workload?\n compensationRange String?\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String?\n\n applications EngagementApplication[]\n assignments EngagementAssignment[]\n\n @@index([projectId])\n @@index([status])\n @@index([role])\n @@index([workload])\n}\n\nmodel EngagementApplication {\n id String @id @default(uuid())\n engagementId String\n userId String\n handle String?\n email String\n name String\n address String?\n mobileNumber String?\n coverLetter String?\n resumeUrl String?\n portfolioUrls String[]\n yearsOfExperience Int?\n availability String?\n status ApplicationStatus @default(SUBMITTED)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n updatedBy String?\n\n engagement Engagement @relation(fields: [engagementId], references: [id], onDelete: Cascade)\n\n @@unique([engagementId, userId])\n @@index([userId])\n @@index([engagementId])\n @@index([status])\n}\n\nmodel EngagementAssignment {\n id String @id @default(uuid())\n engagementId String\n memberId String\n memberHandle String\n status AssignmentStatus @default(SELECTED)\n agreementRate String?\n ratePerHour String?\n paymentCycle PaymentCycle @default(WEEKLY)\n standardHoursPerDay Float?\n /// @deprecated Use standardHoursPerDay instead.\n standardHoursPerWeek Float?\n durationMonths Int?\n otherRemarks String?\n terminationReason String?\n startDate DateTime?\n endDate DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n engagement Engagement @relation(fields: [engagementId], references: [id], onDelete: Restrict)\n feedback EngagementFeedback[]\n memberExperiences MemberExperience[]\n\n @@index([engagementId])\n @@index([engagementId, memberId])\n @@index([memberId])\n}\n\nmodel EngagementFeedback {\n id String @id @default(uuid())\n engagementAssignmentId String\n feedbackText String\n rating Int?\n givenByMemberId String?\n givenByHandle String?\n givenByEmail String?\n secretToken String? @unique\n secretTokenExpiresAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n assignment EngagementAssignment @relation(fields: [engagementAssignmentId], references: [id], onDelete: Cascade)\n\n @@index([engagementAssignmentId])\n @@index([givenByMemberId])\n}\n\nmodel MemberExperience {\n id String @id @default(uuid())\n engagementAssignmentId String\n experienceText String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n assignment EngagementAssignment @relation(fields: [engagementAssignmentId], references: [id], onDelete: Cascade)\n\n @@index([engagementAssignmentId])\n}\n" + "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n}\n\ngenerator externalClient {\n provider = \"prisma-client-js\"\n output = \"../packages/engagements-prisma-client\"\n binaryTargets = [\"native\", \"debian-openssl-3.0.x\"]\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nenum EngagementStatus {\n OPEN\n ACTIVE\n CANCELLED\n CLOSED\n ON_HOLD\n}\n\nenum ApplicationStatus {\n SUBMITTED\n UNDER_REVIEW\n SHORTLISTED\n SELECTED\n ACCEPTED\n REJECTED\n}\n\nenum AssignmentStatus {\n SELECTED\n OFFER_REJECTED\n ASSIGNED\n COMPLETED\n TERMINATED\n}\n\nenum PaymentCycle {\n WEEKLY\n FORTNIGHTLY\n MONTHLY\n}\n\nenum Role {\n DESIGNER\n SOFTWARE_DEVELOPER\n DATA_SCIENTIST\n DATA_ENGINEER\n}\n\nenum Workload {\n FULL_TIME\n FRACTIONAL\n}\n\nenum AnticipatedStart {\n IMMEDIATE\n FEW_DAYS\n FEW_WEEKS\n}\n\nmodel Engagement {\n id String @id @default(uuid())\n projectId String\n title String\n description String\n durationStartDate DateTime?\n durationEndDate DateTime?\n durationWeeks Int?\n durationMonths Int?\n timeZones String[]\n countries String[]\n requiredSkills String[]\n anticipatedStart AnticipatedStart\n status EngagementStatus @default(OPEN)\n isPrivate Boolean @default(false)\n requiredMemberCount Int?\n role Role?\n workload Workload?\n compensationRange String?\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String?\n\n applications EngagementApplication[]\n assignments EngagementAssignment[]\n\n @@index([projectId])\n @@index([status])\n @@index([role])\n @@index([workload])\n}\n\nmodel EngagementApplication {\n id String @id @default(uuid())\n engagementId String\n userId String\n handle String?\n email String\n name String\n address String?\n mobileNumber String?\n coverLetter String?\n resumeUrl String?\n portfolioUrls String[]\n yearsOfExperience Int?\n availability String?\n status ApplicationStatus @default(SUBMITTED)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n updatedBy String?\n\n engagement Engagement @relation(fields: [engagementId], references: [id], onDelete: Cascade)\n\n @@unique([engagementId, userId])\n @@index([userId])\n @@index([engagementId])\n @@index([status])\n}\n\nmodel EngagementAssignment {\n id String @id @default(uuid())\n engagementId String\n memberId String\n memberHandle String\n status AssignmentStatus @default(SELECTED)\n agreementRate String?\n ratePerHour String?\n paymentCycle PaymentCycle @default(WEEKLY)\n standardHoursPerDay Float?\n /// @deprecated Use standardHoursPerDay instead.\n standardHoursPerWeek Float?\n durationMonths Int?\n otherRemarks String?\n terminationReason String?\n startDate DateTime?\n endDate DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n engagement Engagement @relation(fields: [engagementId], references: [id], onDelete: Restrict)\n feedback EngagementFeedback[]\n memberExperiences MemberExperience[]\n\n @@index([engagementId])\n @@index([engagementId, memberId])\n @@index([memberId])\n}\n\nmodel EngagementFeedback {\n id String @id @default(uuid())\n engagementAssignmentId String\n feedbackText String\n rating Int?\n givenByMemberId String?\n givenByHandle String?\n givenByEmail String?\n secretToken String? @unique\n secretTokenExpiresAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n assignment EngagementAssignment @relation(fields: [engagementAssignmentId], references: [id], onDelete: Cascade)\n\n @@index([engagementAssignmentId])\n @@index([givenByMemberId])\n}\n\nmodel MemberExperience {\n id String @id @default(uuid())\n engagementAssignmentId String\n experienceText String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n assignment EngagementAssignment @relation(fields: [engagementAssignmentId], references: [id], onDelete: Cascade)\n\n @@index([engagementAssignmentId])\n}\n" } config.runtimeDataModel = JSON.parse("{\"models\":{\"Engagement\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"projectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"durationStartDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"durationEndDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"durationWeeks\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"durationMonths\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"timeZones\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"countries\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"requiredSkills\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"anticipatedStart\",\"kind\":\"enum\",\"type\":\"AnticipatedStart\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"EngagementStatus\"},{\"name\":\"isPrivate\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"requiredMemberCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"Role\"},{\"name\":\"workload\",\"kind\":\"enum\",\"type\":\"Workload\"},{\"name\":\"compensationRange\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"applications\",\"kind\":\"object\",\"type\":\"EngagementApplication\",\"relationName\":\"EngagementToEngagementApplication\"},{\"name\":\"assignments\",\"kind\":\"object\",\"type\":\"EngagementAssignment\",\"relationName\":\"EngagementToEngagementAssignment\"}],\"dbName\":null},\"EngagementApplication\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"engagementId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"handle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"address\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"mobileNumber\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"coverLetter\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resumeUrl\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"portfolioUrls\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"yearsOfExperience\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"availability\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"ApplicationStatus\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"engagement\",\"kind\":\"object\",\"type\":\"Engagement\",\"relationName\":\"EngagementToEngagementApplication\"}],\"dbName\":null},\"EngagementAssignment\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"engagementId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberHandle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"AssignmentStatus\"},{\"name\":\"agreementRate\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ratePerHour\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"paymentCycle\",\"kind\":\"enum\",\"type\":\"PaymentCycle\"},{\"name\":\"standardHoursPerDay\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"standardHoursPerWeek\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"durationMonths\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"otherRemarks\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"terminationReason\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"startDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"endDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"engagement\",\"kind\":\"object\",\"type\":\"Engagement\",\"relationName\":\"EngagementToEngagementAssignment\"},{\"name\":\"feedback\",\"kind\":\"object\",\"type\":\"EngagementFeedback\",\"relationName\":\"EngagementAssignmentToEngagementFeedback\"},{\"name\":\"memberExperiences\",\"kind\":\"object\",\"type\":\"MemberExperience\",\"relationName\":\"EngagementAssignmentToMemberExperience\"}],\"dbName\":null},\"EngagementFeedback\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"engagementAssignmentId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"feedbackText\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"rating\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"givenByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"givenByHandle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"givenByEmail\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"secretToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"secretTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"assignment\",\"kind\":\"object\",\"type\":\"EngagementAssignment\",\"relationName\":\"EngagementAssignmentToEngagementFeedback\"}],\"dbName\":null},\"MemberExperience\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"engagementAssignmentId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"experienceText\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"assignment\",\"kind\":\"object\",\"type\":\"EngagementAssignment\",\"relationName\":\"EngagementAssignmentToMemberExperience\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") diff --git a/packages/engagements-prisma-client/schema.prisma b/packages/engagements-prisma-client/schema.prisma index 185924b..b2e016c 100644 --- a/packages/engagements-prisma-client/schema.prisma +++ b/packages/engagements-prisma-client/schema.prisma @@ -23,6 +23,7 @@ enum EngagementStatus { enum ApplicationStatus { SUBMITTED UNDER_REVIEW + SHORTLISTED SELECTED ACCEPTED REJECTED diff --git a/prisma/migrations/20260730100000_add_shortlisted_application_status/migration.sql b/prisma/migrations/20260730100000_add_shortlisted_application_status/migration.sql new file mode 100644 index 0000000..b56d7c7 --- /dev/null +++ b/prisma/migrations/20260730100000_add_shortlisted_application_status/migration.sql @@ -0,0 +1,2 @@ +-- AlterEnum +ALTER TYPE "ApplicationStatus" ADD VALUE 'SHORTLISTED'; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index e199c7e..0d5ed62 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -23,6 +23,7 @@ enum EngagementStatus { enum ApplicationStatus { SUBMITTED UNDER_REVIEW + SHORTLISTED SELECTED ACCEPTED REJECTED From 247c606b328ba042c1cdbaf79965627727e98445 Mon Sep 17 00:00:00 2001 From: himaniraghav3 Date: Fri, 31 Jul 2026 13:55:08 +0530 Subject: [PATCH 6/7] PM-5714 Add new fields to the assignment object --- packages/engagements-prisma-client/edge.js | 10 ++- .../index-browser.js | 8 +++ packages/engagements-prisma-client/index.d.ts | 11 ++++ packages/engagements-prisma-client/index.js | 10 ++- .../engagements-prisma-client/schema.prisma | 21 ++++-- .../migration.sql | 14 ++++ prisma/schema.prisma | 21 ++++-- src/applications/applications.service.ts | 66 ++++++++++++++++++- .../dto/approve-application.dto.ts | 35 +++++++++- .../dto/assignment-context-response.dto.ts | 25 ++++++- .../dto/assignment-response.dto.ts | 25 ++++++- src/engagements/dto/create-engagement.dto.ts | 34 ++++++++++ src/engagements/engagements.service.ts | 46 +++++++++++++ 13 files changed, 310 insertions(+), 16 deletions(-) create mode 100644 prisma/migrations/20260731120000_add_assignment_wipro_and_source_fields/migration.sql diff --git a/packages/engagements-prisma-client/edge.js b/packages/engagements-prisma-client/edge.js index 24908da..e6c741b 100644 --- a/packages/engagements-prisma-client/edge.js +++ b/packages/engagements-prisma-client/edge.js @@ -224,6 +224,14 @@ exports.PaymentCycle = exports.$Enums.PaymentCycle = { MONTHLY: 'MONTHLY' }; +exports.AssignmentSource = exports.$Enums.AssignmentSource = { + DIRECT: 'DIRECT', + VENDOR: 'VENDOR', + WIPRO_REFERRAL: 'WIPRO_REFERRAL', + CUSTOMER_REFERRAL: 'CUSTOMER_REFERRAL', + TOPCODER_COMMUNITY: 'TOPCODER_COMMUNITY' +}; + exports.Role = exports.$Enums.Role = { DESIGNER: 'DESIGNER', SOFTWARE_DEVELOPER: 'SOFTWARE_DEVELOPER', @@ -257,7 +265,7 @@ const config = { "clientVersion": "7.8.0", "engineVersion": "3c6e192761c0362d496ed980de936e2f3cebcd3a", "activeProvider": "postgresql", - "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n}\n\ngenerator externalClient {\n provider = \"prisma-client-js\"\n output = \"../packages/engagements-prisma-client\"\n binaryTargets = [\"native\", \"debian-openssl-3.0.x\"]\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nenum EngagementStatus {\n OPEN\n ACTIVE\n CANCELLED\n CLOSED\n ON_HOLD\n}\n\nenum ApplicationStatus {\n SUBMITTED\n UNDER_REVIEW\n SHORTLISTED\n SELECTED\n ACCEPTED\n REJECTED\n}\n\nenum AssignmentStatus {\n SELECTED\n OFFER_REJECTED\n ASSIGNED\n COMPLETED\n TERMINATED\n}\n\nenum PaymentCycle {\n WEEKLY\n FORTNIGHTLY\n MONTHLY\n}\n\nenum Role {\n DESIGNER\n SOFTWARE_DEVELOPER\n DATA_SCIENTIST\n DATA_ENGINEER\n}\n\nenum Workload {\n FULL_TIME\n FRACTIONAL\n}\n\nenum AnticipatedStart {\n IMMEDIATE\n FEW_DAYS\n FEW_WEEKS\n}\n\nmodel Engagement {\n id String @id @default(uuid())\n projectId String\n title String\n description String\n durationStartDate DateTime?\n durationEndDate DateTime?\n durationWeeks Int?\n durationMonths Int?\n timeZones String[]\n countries String[]\n requiredSkills String[]\n anticipatedStart AnticipatedStart\n status EngagementStatus @default(OPEN)\n isPrivate Boolean @default(false)\n requiredMemberCount Int?\n role Role?\n workload Workload?\n compensationRange String?\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String?\n\n applications EngagementApplication[]\n assignments EngagementAssignment[]\n\n @@index([projectId])\n @@index([status])\n @@index([role])\n @@index([workload])\n}\n\nmodel EngagementApplication {\n id String @id @default(uuid())\n engagementId String\n userId String\n handle String?\n email String\n name String\n address String?\n mobileNumber String?\n coverLetter String?\n resumeUrl String?\n portfolioUrls String[]\n yearsOfExperience Int?\n availability String?\n status ApplicationStatus @default(SUBMITTED)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n updatedBy String?\n\n engagement Engagement @relation(fields: [engagementId], references: [id], onDelete: Cascade)\n\n @@unique([engagementId, userId])\n @@index([userId])\n @@index([engagementId])\n @@index([status])\n}\n\nmodel EngagementAssignment {\n id String @id @default(uuid())\n engagementId String\n memberId String\n memberHandle String\n status AssignmentStatus @default(SELECTED)\n agreementRate String?\n ratePerHour String?\n paymentCycle PaymentCycle @default(WEEKLY)\n standardHoursPerDay Float?\n /// @deprecated Use standardHoursPerDay instead.\n standardHoursPerWeek Float?\n durationMonths Int?\n otherRemarks String?\n terminationReason String?\n startDate DateTime?\n endDate DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n engagement Engagement @relation(fields: [engagementId], references: [id], onDelete: Restrict)\n feedback EngagementFeedback[]\n memberExperiences MemberExperience[]\n\n @@index([engagementId])\n @@index([engagementId, memberId])\n @@index([memberId])\n}\n\nmodel EngagementFeedback {\n id String @id @default(uuid())\n engagementAssignmentId String\n feedbackText String\n rating Int?\n givenByMemberId String?\n givenByHandle String?\n givenByEmail String?\n secretToken String? @unique\n secretTokenExpiresAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n assignment EngagementAssignment @relation(fields: [engagementAssignmentId], references: [id], onDelete: Cascade)\n\n @@index([engagementAssignmentId])\n @@index([givenByMemberId])\n}\n\nmodel MemberExperience {\n id String @id @default(uuid())\n engagementAssignmentId String\n experienceText String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n assignment EngagementAssignment @relation(fields: [engagementAssignmentId], references: [id], onDelete: Cascade)\n\n @@index([engagementAssignmentId])\n}\n" + "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n}\n\ngenerator externalClient {\n provider = \"prisma-client-js\"\n output = \"../packages/engagements-prisma-client\"\n binaryTargets = [\"native\", \"debian-openssl-3.0.x\"]\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nenum EngagementStatus {\n OPEN\n ACTIVE\n CANCELLED\n CLOSED\n ON_HOLD\n}\n\nenum ApplicationStatus {\n SUBMITTED\n UNDER_REVIEW\n SHORTLISTED\n SELECTED\n ACCEPTED\n REJECTED\n}\n\nenum AssignmentStatus {\n SELECTED\n OFFER_REJECTED\n ASSIGNED\n COMPLETED\n TERMINATED\n}\n\nenum PaymentCycle {\n WEEKLY\n FORTNIGHTLY\n MONTHLY\n}\n\nenum AssignmentSource {\n DIRECT\n VENDOR\n WIPRO_REFERRAL\n CUSTOMER_REFERRAL\n TOPCODER_COMMUNITY\n}\n\nenum Role {\n DESIGNER\n SOFTWARE_DEVELOPER\n DATA_SCIENTIST\n DATA_ENGINEER\n}\n\nenum Workload {\n FULL_TIME\n FRACTIONAL\n}\n\nenum AnticipatedStart {\n IMMEDIATE\n FEW_DAYS\n FEW_WEEKS\n}\n\nmodel Engagement {\n id String @id @default(uuid())\n projectId String\n title String\n description String\n durationStartDate DateTime?\n durationEndDate DateTime?\n durationWeeks Int?\n durationMonths Int?\n timeZones String[]\n countries String[]\n requiredSkills String[]\n anticipatedStart AnticipatedStart\n status EngagementStatus @default(OPEN)\n isPrivate Boolean @default(false)\n requiredMemberCount Int?\n role Role?\n workload Workload?\n compensationRange String?\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String?\n\n applications EngagementApplication[]\n assignments EngagementAssignment[]\n\n @@index([projectId])\n @@index([status])\n @@index([role])\n @@index([workload])\n}\n\nmodel EngagementApplication {\n id String @id @default(uuid())\n engagementId String\n userId String\n handle String?\n email String\n name String\n address String?\n mobileNumber String?\n coverLetter String?\n resumeUrl String?\n portfolioUrls String[]\n yearsOfExperience Int?\n availability String?\n status ApplicationStatus @default(SUBMITTED)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n updatedBy String?\n\n engagement Engagement @relation(fields: [engagementId], references: [id], onDelete: Cascade)\n\n @@unique([engagementId, userId])\n @@index([userId])\n @@index([engagementId])\n @@index([status])\n}\n\nmodel EngagementAssignment {\n id String @id @default(uuid())\n engagementId String\n memberId String\n memberHandle String\n status AssignmentStatus @default(SELECTED)\n agreementRate String?\n ratePerHour String?\n paymentCycle PaymentCycle @default(WEEKLY)\n standardHoursPerDay Float?\n /// @deprecated Use standardHoursPerDay instead.\n standardHoursPerWeek Float?\n durationMonths Int?\n otherRemarks String?\n terminationReason String?\n startDate DateTime?\n endDate DateTime?\n wiproIdEndDate DateTime?\n candidateWiproId String?\n source AssignmentSource?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n engagement Engagement @relation(fields: [engagementId], references: [id], onDelete: Restrict)\n feedback EngagementFeedback[]\n memberExperiences MemberExperience[]\n\n @@index([engagementId])\n @@index([engagementId, memberId])\n @@index([memberId])\n}\n\nmodel EngagementFeedback {\n id String @id @default(uuid())\n engagementAssignmentId String\n feedbackText String\n rating Int?\n givenByMemberId String?\n givenByHandle String?\n givenByEmail String?\n secretToken String? @unique\n secretTokenExpiresAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n assignment EngagementAssignment @relation(fields: [engagementAssignmentId], references: [id], onDelete: Cascade)\n\n @@index([engagementAssignmentId])\n @@index([givenByMemberId])\n}\n\nmodel MemberExperience {\n id String @id @default(uuid())\n engagementAssignmentId String\n experienceText String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n assignment EngagementAssignment @relation(fields: [engagementAssignmentId], references: [id], onDelete: Cascade)\n\n @@index([engagementAssignmentId])\n}\n" } config.runtimeDataModel = JSON.parse("{\"models\":{\"Engagement\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"projectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"durationStartDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"durationEndDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"durationWeeks\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"durationMonths\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"timeZones\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"countries\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"requiredSkills\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"anticipatedStart\",\"kind\":\"enum\",\"type\":\"AnticipatedStart\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"EngagementStatus\"},{\"name\":\"isPrivate\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"requiredMemberCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"Role\"},{\"name\":\"workload\",\"kind\":\"enum\",\"type\":\"Workload\"},{\"name\":\"compensationRange\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"applications\",\"kind\":\"object\",\"type\":\"EngagementApplication\",\"relationName\":\"EngagementToEngagementApplication\"},{\"name\":\"assignments\",\"kind\":\"object\",\"type\":\"EngagementAssignment\",\"relationName\":\"EngagementToEngagementAssignment\"}],\"dbName\":null},\"EngagementApplication\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"engagementId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"handle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"address\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"mobileNumber\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"coverLetter\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resumeUrl\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"portfolioUrls\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"yearsOfExperience\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"availability\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"ApplicationStatus\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"engagement\",\"kind\":\"object\",\"type\":\"Engagement\",\"relationName\":\"EngagementToEngagementApplication\"}],\"dbName\":null},\"EngagementAssignment\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"engagementId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberHandle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"AssignmentStatus\"},{\"name\":\"agreementRate\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ratePerHour\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"paymentCycle\",\"kind\":\"enum\",\"type\":\"PaymentCycle\"},{\"name\":\"standardHoursPerDay\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"standardHoursPerWeek\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"durationMonths\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"otherRemarks\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"terminationReason\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"startDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"endDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"engagement\",\"kind\":\"object\",\"type\":\"Engagement\",\"relationName\":\"EngagementToEngagementAssignment\"},{\"name\":\"feedback\",\"kind\":\"object\",\"type\":\"EngagementFeedback\",\"relationName\":\"EngagementAssignmentToEngagementFeedback\"},{\"name\":\"memberExperiences\",\"kind\":\"object\",\"type\":\"MemberExperience\",\"relationName\":\"EngagementAssignmentToMemberExperience\"}],\"dbName\":null},\"EngagementFeedback\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"engagementAssignmentId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"feedbackText\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"rating\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"givenByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"givenByHandle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"givenByEmail\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"secretToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"secretTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"assignment\",\"kind\":\"object\",\"type\":\"EngagementAssignment\",\"relationName\":\"EngagementAssignmentToEngagementFeedback\"}],\"dbName\":null},\"MemberExperience\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"engagementAssignmentId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"experienceText\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"assignment\",\"kind\":\"object\",\"type\":\"EngagementAssignment\",\"relationName\":\"EngagementAssignmentToMemberExperience\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") diff --git a/packages/engagements-prisma-client/index-browser.js b/packages/engagements-prisma-client/index-browser.js index f0831db..e1a6d58 100644 --- a/packages/engagements-prisma-client/index-browser.js +++ b/packages/engagements-prisma-client/index-browser.js @@ -270,6 +270,14 @@ exports.PaymentCycle = exports.$Enums.PaymentCycle = { MONTHLY: 'MONTHLY' }; +exports.AssignmentSource = exports.$Enums.AssignmentSource = { + DIRECT: 'DIRECT', + VENDOR: 'VENDOR', + WIPRO_REFERRAL: 'WIPRO_REFERRAL', + CUSTOMER_REFERRAL: 'CUSTOMER_REFERRAL', + TOPCODER_COMMUNITY: 'TOPCODER_COMMUNITY' +}; + exports.Prisma.ModelName = { Engagement: 'Engagement', EngagementApplication: 'EngagementApplication', diff --git a/packages/engagements-prisma-client/index.d.ts b/packages/engagements-prisma-client/index.d.ts index 9bc8c1c..64a1a70 100644 --- a/packages/engagements-prisma-client/index.d.ts +++ b/packages/engagements-prisma-client/index.d.ts @@ -86,6 +86,17 @@ export const PaymentCycle: { export type PaymentCycle = (typeof PaymentCycle)[keyof typeof PaymentCycle] +export const AssignmentSource: { + DIRECT: 'DIRECT', + VENDOR: 'VENDOR', + WIPRO_REFERRAL: 'WIPRO_REFERRAL', + CUSTOMER_REFERRAL: 'CUSTOMER_REFERRAL', + TOPCODER_COMMUNITY: 'TOPCODER_COMMUNITY' +}; + +export type AssignmentSource = (typeof AssignmentSource)[keyof typeof AssignmentSource] + + export const Role: { DESIGNER: 'DESIGNER', SOFTWARE_DEVELOPER: 'SOFTWARE_DEVELOPER', diff --git a/packages/engagements-prisma-client/index.js b/packages/engagements-prisma-client/index.js index b470628..b74e4d2 100644 --- a/packages/engagements-prisma-client/index.js +++ b/packages/engagements-prisma-client/index.js @@ -225,6 +225,14 @@ exports.PaymentCycle = exports.$Enums.PaymentCycle = { MONTHLY: 'MONTHLY' }; +exports.AssignmentSource = exports.$Enums.AssignmentSource = { + DIRECT: 'DIRECT', + VENDOR: 'VENDOR', + WIPRO_REFERRAL: 'WIPRO_REFERRAL', + CUSTOMER_REFERRAL: 'CUSTOMER_REFERRAL', + TOPCODER_COMMUNITY: 'TOPCODER_COMMUNITY' +}; + exports.Role = exports.$Enums.Role = { DESIGNER: 'DESIGNER', SOFTWARE_DEVELOPER: 'SOFTWARE_DEVELOPER', @@ -258,7 +266,7 @@ const config = { "clientVersion": "7.8.0", "engineVersion": "3c6e192761c0362d496ed980de936e2f3cebcd3a", "activeProvider": "postgresql", - "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n}\n\ngenerator externalClient {\n provider = \"prisma-client-js\"\n output = \"../packages/engagements-prisma-client\"\n binaryTargets = [\"native\", \"debian-openssl-3.0.x\"]\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nenum EngagementStatus {\n OPEN\n ACTIVE\n CANCELLED\n CLOSED\n ON_HOLD\n}\n\nenum ApplicationStatus {\n SUBMITTED\n UNDER_REVIEW\n SHORTLISTED\n SELECTED\n ACCEPTED\n REJECTED\n}\n\nenum AssignmentStatus {\n SELECTED\n OFFER_REJECTED\n ASSIGNED\n COMPLETED\n TERMINATED\n}\n\nenum PaymentCycle {\n WEEKLY\n FORTNIGHTLY\n MONTHLY\n}\n\nenum Role {\n DESIGNER\n SOFTWARE_DEVELOPER\n DATA_SCIENTIST\n DATA_ENGINEER\n}\n\nenum Workload {\n FULL_TIME\n FRACTIONAL\n}\n\nenum AnticipatedStart {\n IMMEDIATE\n FEW_DAYS\n FEW_WEEKS\n}\n\nmodel Engagement {\n id String @id @default(uuid())\n projectId String\n title String\n description String\n durationStartDate DateTime?\n durationEndDate DateTime?\n durationWeeks Int?\n durationMonths Int?\n timeZones String[]\n countries String[]\n requiredSkills String[]\n anticipatedStart AnticipatedStart\n status EngagementStatus @default(OPEN)\n isPrivate Boolean @default(false)\n requiredMemberCount Int?\n role Role?\n workload Workload?\n compensationRange String?\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String?\n\n applications EngagementApplication[]\n assignments EngagementAssignment[]\n\n @@index([projectId])\n @@index([status])\n @@index([role])\n @@index([workload])\n}\n\nmodel EngagementApplication {\n id String @id @default(uuid())\n engagementId String\n userId String\n handle String?\n email String\n name String\n address String?\n mobileNumber String?\n coverLetter String?\n resumeUrl String?\n portfolioUrls String[]\n yearsOfExperience Int?\n availability String?\n status ApplicationStatus @default(SUBMITTED)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n updatedBy String?\n\n engagement Engagement @relation(fields: [engagementId], references: [id], onDelete: Cascade)\n\n @@unique([engagementId, userId])\n @@index([userId])\n @@index([engagementId])\n @@index([status])\n}\n\nmodel EngagementAssignment {\n id String @id @default(uuid())\n engagementId String\n memberId String\n memberHandle String\n status AssignmentStatus @default(SELECTED)\n agreementRate String?\n ratePerHour String?\n paymentCycle PaymentCycle @default(WEEKLY)\n standardHoursPerDay Float?\n /// @deprecated Use standardHoursPerDay instead.\n standardHoursPerWeek Float?\n durationMonths Int?\n otherRemarks String?\n terminationReason String?\n startDate DateTime?\n endDate DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n engagement Engagement @relation(fields: [engagementId], references: [id], onDelete: Restrict)\n feedback EngagementFeedback[]\n memberExperiences MemberExperience[]\n\n @@index([engagementId])\n @@index([engagementId, memberId])\n @@index([memberId])\n}\n\nmodel EngagementFeedback {\n id String @id @default(uuid())\n engagementAssignmentId String\n feedbackText String\n rating Int?\n givenByMemberId String?\n givenByHandle String?\n givenByEmail String?\n secretToken String? @unique\n secretTokenExpiresAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n assignment EngagementAssignment @relation(fields: [engagementAssignmentId], references: [id], onDelete: Cascade)\n\n @@index([engagementAssignmentId])\n @@index([givenByMemberId])\n}\n\nmodel MemberExperience {\n id String @id @default(uuid())\n engagementAssignmentId String\n experienceText String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n assignment EngagementAssignment @relation(fields: [engagementAssignmentId], references: [id], onDelete: Cascade)\n\n @@index([engagementAssignmentId])\n}\n" + "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n}\n\ngenerator externalClient {\n provider = \"prisma-client-js\"\n output = \"../packages/engagements-prisma-client\"\n binaryTargets = [\"native\", \"debian-openssl-3.0.x\"]\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nenum EngagementStatus {\n OPEN\n ACTIVE\n CANCELLED\n CLOSED\n ON_HOLD\n}\n\nenum ApplicationStatus {\n SUBMITTED\n UNDER_REVIEW\n SHORTLISTED\n SELECTED\n ACCEPTED\n REJECTED\n}\n\nenum AssignmentStatus {\n SELECTED\n OFFER_REJECTED\n ASSIGNED\n COMPLETED\n TERMINATED\n}\n\nenum PaymentCycle {\n WEEKLY\n FORTNIGHTLY\n MONTHLY\n}\n\nenum AssignmentSource {\n DIRECT\n VENDOR\n WIPRO_REFERRAL\n CUSTOMER_REFERRAL\n TOPCODER_COMMUNITY\n}\n\nenum Role {\n DESIGNER\n SOFTWARE_DEVELOPER\n DATA_SCIENTIST\n DATA_ENGINEER\n}\n\nenum Workload {\n FULL_TIME\n FRACTIONAL\n}\n\nenum AnticipatedStart {\n IMMEDIATE\n FEW_DAYS\n FEW_WEEKS\n}\n\nmodel Engagement {\n id String @id @default(uuid())\n projectId String\n title String\n description String\n durationStartDate DateTime?\n durationEndDate DateTime?\n durationWeeks Int?\n durationMonths Int?\n timeZones String[]\n countries String[]\n requiredSkills String[]\n anticipatedStart AnticipatedStart\n status EngagementStatus @default(OPEN)\n isPrivate Boolean @default(false)\n requiredMemberCount Int?\n role Role?\n workload Workload?\n compensationRange String?\n createdAt DateTime @default(now())\n createdBy String\n updatedAt DateTime @updatedAt\n updatedBy String?\n\n applications EngagementApplication[]\n assignments EngagementAssignment[]\n\n @@index([projectId])\n @@index([status])\n @@index([role])\n @@index([workload])\n}\n\nmodel EngagementApplication {\n id String @id @default(uuid())\n engagementId String\n userId String\n handle String?\n email String\n name String\n address String?\n mobileNumber String?\n coverLetter String?\n resumeUrl String?\n portfolioUrls String[]\n yearsOfExperience Int?\n availability String?\n status ApplicationStatus @default(SUBMITTED)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n updatedBy String?\n\n engagement Engagement @relation(fields: [engagementId], references: [id], onDelete: Cascade)\n\n @@unique([engagementId, userId])\n @@index([userId])\n @@index([engagementId])\n @@index([status])\n}\n\nmodel EngagementAssignment {\n id String @id @default(uuid())\n engagementId String\n memberId String\n memberHandle String\n status AssignmentStatus @default(SELECTED)\n agreementRate String?\n ratePerHour String?\n paymentCycle PaymentCycle @default(WEEKLY)\n standardHoursPerDay Float?\n /// @deprecated Use standardHoursPerDay instead.\n standardHoursPerWeek Float?\n durationMonths Int?\n otherRemarks String?\n terminationReason String?\n startDate DateTime?\n endDate DateTime?\n wiproIdEndDate DateTime?\n candidateWiproId String?\n source AssignmentSource?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n engagement Engagement @relation(fields: [engagementId], references: [id], onDelete: Restrict)\n feedback EngagementFeedback[]\n memberExperiences MemberExperience[]\n\n @@index([engagementId])\n @@index([engagementId, memberId])\n @@index([memberId])\n}\n\nmodel EngagementFeedback {\n id String @id @default(uuid())\n engagementAssignmentId String\n feedbackText String\n rating Int?\n givenByMemberId String?\n givenByHandle String?\n givenByEmail String?\n secretToken String? @unique\n secretTokenExpiresAt DateTime?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n assignment EngagementAssignment @relation(fields: [engagementAssignmentId], references: [id], onDelete: Cascade)\n\n @@index([engagementAssignmentId])\n @@index([givenByMemberId])\n}\n\nmodel MemberExperience {\n id String @id @default(uuid())\n engagementAssignmentId String\n experienceText String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n assignment EngagementAssignment @relation(fields: [engagementAssignmentId], references: [id], onDelete: Cascade)\n\n @@index([engagementAssignmentId])\n}\n" } config.runtimeDataModel = JSON.parse("{\"models\":{\"Engagement\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"projectId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"durationStartDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"durationEndDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"durationWeeks\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"durationMonths\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"timeZones\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"countries\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"requiredSkills\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"anticipatedStart\",\"kind\":\"enum\",\"type\":\"AnticipatedStart\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"EngagementStatus\"},{\"name\":\"isPrivate\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"requiredMemberCount\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"Role\"},{\"name\":\"workload\",\"kind\":\"enum\",\"type\":\"Workload\"},{\"name\":\"compensationRange\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"applications\",\"kind\":\"object\",\"type\":\"EngagementApplication\",\"relationName\":\"EngagementToEngagementApplication\"},{\"name\":\"assignments\",\"kind\":\"object\",\"type\":\"EngagementAssignment\",\"relationName\":\"EngagementToEngagementAssignment\"}],\"dbName\":null},\"EngagementApplication\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"engagementId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"handle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"address\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"mobileNumber\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"coverLetter\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"resumeUrl\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"portfolioUrls\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"yearsOfExperience\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"availability\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"ApplicationStatus\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"engagement\",\"kind\":\"object\",\"type\":\"Engagement\",\"relationName\":\"EngagementToEngagementApplication\"}],\"dbName\":null},\"EngagementAssignment\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"engagementId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memberHandle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"AssignmentStatus\"},{\"name\":\"agreementRate\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ratePerHour\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"paymentCycle\",\"kind\":\"enum\",\"type\":\"PaymentCycle\"},{\"name\":\"standardHoursPerDay\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"standardHoursPerWeek\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"durationMonths\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"otherRemarks\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"terminationReason\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"startDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"endDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"engagement\",\"kind\":\"object\",\"type\":\"Engagement\",\"relationName\":\"EngagementToEngagementAssignment\"},{\"name\":\"feedback\",\"kind\":\"object\",\"type\":\"EngagementFeedback\",\"relationName\":\"EngagementAssignmentToEngagementFeedback\"},{\"name\":\"memberExperiences\",\"kind\":\"object\",\"type\":\"MemberExperience\",\"relationName\":\"EngagementAssignmentToMemberExperience\"}],\"dbName\":null},\"EngagementFeedback\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"engagementAssignmentId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"feedbackText\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"rating\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"givenByMemberId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"givenByHandle\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"givenByEmail\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"secretToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"secretTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"assignment\",\"kind\":\"object\",\"type\":\"EngagementAssignment\",\"relationName\":\"EngagementAssignmentToEngagementFeedback\"}],\"dbName\":null},\"MemberExperience\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"engagementAssignmentId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"experienceText\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"assignment\",\"kind\":\"object\",\"type\":\"EngagementAssignment\",\"relationName\":\"EngagementAssignmentToMemberExperience\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") diff --git a/packages/engagements-prisma-client/schema.prisma b/packages/engagements-prisma-client/schema.prisma index b2e016c..c06d96b 100644 --- a/packages/engagements-prisma-client/schema.prisma +++ b/packages/engagements-prisma-client/schema.prisma @@ -43,6 +43,14 @@ enum PaymentCycle { MONTHLY } +enum AssignmentSource { + DIRECT + VENDOR + WIPRO_REFERRAL + CUSTOMER_REFERRAL + TOPCODER_COMMUNITY +} + enum Role { DESIGNER SOFTWARE_DEVELOPER @@ -122,14 +130,14 @@ model EngagementApplication { } model EngagementAssignment { - id String @id @default(uuid()) + id String @id @default(uuid()) engagementId String memberId String memberHandle String - status AssignmentStatus @default(SELECTED) + status AssignmentStatus @default(SELECTED) agreementRate String? ratePerHour String? - paymentCycle PaymentCycle @default(WEEKLY) + paymentCycle PaymentCycle @default(WEEKLY) standardHoursPerDay Float? /// @deprecated Use standardHoursPerDay instead. standardHoursPerWeek Float? @@ -138,8 +146,11 @@ model EngagementAssignment { terminationReason String? startDate DateTime? endDate DateTime? - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + wiproIdEndDate DateTime? + candidateWiproId String? + source AssignmentSource? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt engagement Engagement @relation(fields: [engagementId], references: [id], onDelete: Restrict) feedback EngagementFeedback[] diff --git a/prisma/migrations/20260731120000_add_assignment_wipro_and_source_fields/migration.sql b/prisma/migrations/20260731120000_add_assignment_wipro_and_source_fields/migration.sql new file mode 100644 index 0000000..d4b3305 --- /dev/null +++ b/prisma/migrations/20260731120000_add_assignment_wipro_and_source_fields/migration.sql @@ -0,0 +1,14 @@ +-- CreateEnum +CREATE TYPE "AssignmentSource" AS ENUM ( + 'DIRECT', + 'VENDOR', + 'WIPRO_REFERRAL', + 'CUSTOMER_REFERRAL', + 'TOPCODER_COMMUNITY' +); + +-- AlterTable +ALTER TABLE "EngagementAssignment" +ADD COLUMN "wiproIdEndDate" TIMESTAMP(3), +ADD COLUMN "candidateWiproId" TEXT, +ADD COLUMN "source" "AssignmentSource"; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 0d5ed62..aa5bef9 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -43,6 +43,14 @@ enum PaymentCycle { MONTHLY } +enum AssignmentSource { + DIRECT + VENDOR + WIPRO_REFERRAL + CUSTOMER_REFERRAL + TOPCODER_COMMUNITY +} + enum Role { DESIGNER SOFTWARE_DEVELOPER @@ -133,14 +141,14 @@ model EngagementApplication { } model EngagementAssignment { - id String @id @default(uuid()) + id String @id @default(uuid()) engagementId String memberId String memberHandle String - status AssignmentStatus @default(SELECTED) + status AssignmentStatus @default(SELECTED) agreementRate String? ratePerHour String? - paymentCycle PaymentCycle @default(WEEKLY) + paymentCycle PaymentCycle @default(WEEKLY) standardHoursPerDay Float? /// @deprecated Use standardHoursPerDay instead. standardHoursPerWeek Float? @@ -149,8 +157,11 @@ model EngagementAssignment { terminationReason String? startDate DateTime? endDate DateTime? - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + wiproIdEndDate DateTime? + candidateWiproId String? + source AssignmentSource? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt engagement Engagement @relation(fields: [engagementId], references: [id], onDelete: Restrict) feedback EngagementFeedback[] diff --git a/src/applications/applications.service.ts b/src/applications/applications.service.ts index 3cd5964..35958b2 100644 --- a/src/applications/applications.service.ts +++ b/src/applications/applications.service.ts @@ -8,6 +8,7 @@ import { } from "@nestjs/common"; import { ApplicationStatus, + AssignmentSource, AssignmentStatus, EngagementApplication, EngagementStatus, @@ -390,6 +391,9 @@ export class ApplicationsService { standardHoursPerDay?: number; agreementRate?: string; otherRemarks?: string | null; + wiproIdEndDate?: Date; + candidateWiproId?: string; + source?: AssignmentSource; hasAny: boolean; } { const parseDate = (value?: string) => { @@ -404,6 +408,7 @@ export class ApplicationsService { }; const startDate = parseDate(details?.startDate); + const wiproIdEndDate = parseDate(details?.wiproIdEndDate); const durationMonths = details?.durationMonths; const paymentCycle = details?.paymentCycle; const ratePerHour = details?.ratePerHour; @@ -415,6 +420,11 @@ export class ApplicationsService { ); const otherRemarks = details?.otherRemarks !== undefined ? details.otherRemarks : undefined; + const candidateWiproId = + details?.candidateWiproId !== undefined + ? String(details.candidateWiproId).trim() || undefined + : undefined; + const source = details?.source; return { startDate, @@ -424,6 +434,9 @@ export class ApplicationsService { standardHoursPerDay, agreementRate, otherRemarks, + wiproIdEndDate, + candidateWiproId, + source, hasAny: startDate !== undefined || durationMonths !== undefined || @@ -431,7 +444,10 @@ export class ApplicationsService { ratePerHour !== undefined || standardHoursPerDay !== undefined || agreementRate !== undefined || - otherRemarks !== undefined, + otherRemarks !== undefined || + wiproIdEndDate !== undefined || + candidateWiproId !== undefined || + source !== undefined, }; } @@ -503,6 +519,16 @@ export class ApplicationsService { if (normalizedAssignment.otherRemarks !== undefined) { updateData.otherRemarks = normalizedAssignment.otherRemarks; } + if (normalizedAssignment.wiproIdEndDate !== undefined) { + updateData.wiproIdEndDate = normalizedAssignment.wiproIdEndDate; + } + if (normalizedAssignment.candidateWiproId !== undefined) { + updateData.candidateWiproId = + normalizedAssignment.candidateWiproId; + } + if (normalizedAssignment.source !== undefined) { + updateData.source = normalizedAssignment.source; + } updatedAssignment = await tx.engagementAssignment.update({ where: { id: existingAssignment.id }, data: updateData, @@ -576,6 +602,15 @@ export class ApplicationsService { ...(normalizedAssignment.otherRemarks !== undefined && { otherRemarks: normalizedAssignment.otherRemarks, }), + ...(normalizedAssignment.wiproIdEndDate !== undefined && { + wiproIdEndDate: normalizedAssignment.wiproIdEndDate, + }), + ...(normalizedAssignment.candidateWiproId !== undefined && { + candidateWiproId: normalizedAssignment.candidateWiproId, + }), + ...(normalizedAssignment.source !== undefined && { + source: normalizedAssignment.source, + }), }, }); @@ -778,6 +813,9 @@ export class ApplicationsService { standardHoursPerDay: number | null; agreementRate: string | null; otherRemarks: string | null; + wiproIdEndDate: Date | null; + candidateWiproId: string | null; + source: AssignmentSource | null; }, normalizedAssignment: { startDate?: Date; @@ -787,6 +825,9 @@ export class ApplicationsService { standardHoursPerDay?: number; agreementRate?: string; otherRemarks?: string | null; + wiproIdEndDate?: Date; + candidateWiproId?: string; + source?: AssignmentSource; }, ): boolean { if ( @@ -833,6 +874,29 @@ export class ApplicationsService { return true; } + if ( + normalizedAssignment.wiproIdEndDate !== undefined && + normalizedAssignment.wiproIdEndDate.getTime() !== + existingAssignment.wiproIdEndDate?.getTime() + ) { + return true; + } + + if ( + normalizedAssignment.candidateWiproId !== undefined && + normalizedAssignment.candidateWiproId !== + existingAssignment.candidateWiproId + ) { + return true; + } + + if ( + normalizedAssignment.source !== undefined && + normalizedAssignment.source !== existingAssignment.source + ) { + return true; + } + return ( normalizedAssignment.otherRemarks !== undefined && normalizedAssignment.otherRemarks !== existingAssignment.otherRemarks diff --git a/src/applications/dto/approve-application.dto.ts b/src/applications/dto/approve-application.dto.ts index 8202eb3..4ce390f 100644 --- a/src/applications/dto/approve-application.dto.ts +++ b/src/applications/dto/approve-application.dto.ts @@ -1,5 +1,5 @@ import { ApiPropertyOptional } from "@nestjs/swagger"; -import { PaymentCycle } from "@prisma/client"; +import { AssignmentSource, PaymentCycle } from "@prisma/client"; import { Transform, Type } from "class-transformer"; import { IsEnum, @@ -115,4 +115,37 @@ export class ApproveApplicationDto { @IsString() @MaxLength(2000) otherRemarks?: string; + + @ApiPropertyOptional({ + description: "Wipro ID end date", + example: "2026-12-31T12:00:00.000Z", + }) + @IsOptional() + @IsDateString() + wiproIdEndDate?: string; + + @ApiPropertyOptional({ + description: "Candidate Wipro ID", + example: "WIPRO-12345", + }) + @IsOptional() + @Transform(({ value }) => { + if (value === undefined || value === null) { + return undefined; + } + const normalized = String(value).trim(); + return normalized.length > 0 ? normalized : undefined; + }) + @IsString() + @MaxLength(255) + candidateWiproId?: string; + + @ApiPropertyOptional({ + description: "Assignment candidate source", + enum: AssignmentSource, + example: AssignmentSource.DIRECT, + }) + @IsOptional() + @IsEnum(AssignmentSource) + source?: AssignmentSource; } diff --git a/src/engagements/dto/assignment-context-response.dto.ts b/src/engagements/dto/assignment-context-response.dto.ts index fc7bd38..81d9add 100644 --- a/src/engagements/dto/assignment-context-response.dto.ts +++ b/src/engagements/dto/assignment-context-response.dto.ts @@ -1,5 +1,9 @@ import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"; -import { AssignmentStatus, PaymentCycle } from "@prisma/client"; +import { + AssignmentSource, + AssignmentStatus, + PaymentCycle, +} from "@prisma/client"; export class AssignmentContextResponseDto { @ApiProperty({ @@ -109,4 +113,23 @@ export class AssignmentContextResponseDto { example: "2025-03-01T00:00:00.000Z", }) endDate?: Date | null; + + @ApiPropertyOptional({ + description: "Wipro ID end date", + example: "2026-12-31T12:00:00.000Z", + }) + wiproIdEndDate?: Date | null; + + @ApiPropertyOptional({ + description: "Candidate Wipro ID", + example: "WIPRO-12345", + }) + candidateWiproId?: string | null; + + @ApiPropertyOptional({ + description: "Assignment candidate source", + enum: AssignmentSource, + example: AssignmentSource.DIRECT, + }) + source?: AssignmentSource | null; } diff --git a/src/engagements/dto/assignment-response.dto.ts b/src/engagements/dto/assignment-response.dto.ts index 1fe1566..3f4ba6c 100644 --- a/src/engagements/dto/assignment-response.dto.ts +++ b/src/engagements/dto/assignment-response.dto.ts @@ -1,5 +1,9 @@ import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"; -import { AssignmentStatus, PaymentCycle } from "@prisma/client"; +import { + AssignmentSource, + AssignmentStatus, + PaymentCycle, +} from "@prisma/client"; export class AssignmentResponseDto { @ApiProperty({ @@ -83,6 +87,25 @@ export class AssignmentResponseDto { }) endDate?: Date | null; + @ApiPropertyOptional({ + description: "Wipro ID end date", + example: "2026-12-31T12:00:00.000Z", + }) + wiproIdEndDate?: Date | null; + + @ApiPropertyOptional({ + description: "Candidate Wipro ID", + example: "WIPRO-12345", + }) + candidateWiproId?: string | null; + + @ApiPropertyOptional({ + description: "Assignment candidate source", + enum: AssignmentSource, + example: AssignmentSource.DIRECT, + }) + source?: AssignmentSource | null; + @ApiProperty({ description: "Reason for terminating the assignment", example: "Client request to end engagement early.", diff --git a/src/engagements/dto/create-engagement.dto.ts b/src/engagements/dto/create-engagement.dto.ts index 1db2bb7..b7db53e 100644 --- a/src/engagements/dto/create-engagement.dto.ts +++ b/src/engagements/dto/create-engagement.dto.ts @@ -24,6 +24,7 @@ import { } from "class-validator"; import { AnticipatedStart, + AssignmentSource, EngagementStatus, PaymentCycle, Role, @@ -153,6 +154,39 @@ export class AssignmentDetailsDto { @IsString() @MaxLength(2000) otherRemarks?: string; + + @ApiPropertyOptional({ + description: "Wipro ID end date", + example: "2026-12-31T12:00:00.000Z", + }) + @IsOptional() + @IsDateString() + wiproIdEndDate?: string; + + @ApiPropertyOptional({ + description: "Candidate Wipro ID", + example: "WIPRO-12345", + }) + @IsOptional() + @Transform(({ value }) => { + if (value === undefined || value === null) { + return undefined; + } + const normalized = String(value).trim(); + return normalized.length > 0 ? normalized : undefined; + }) + @IsString() + @MaxLength(255) + candidateWiproId?: string; + + @ApiPropertyOptional({ + description: "Assignment candidate source", + enum: AssignmentSource, + example: AssignmentSource.DIRECT, + }) + @IsOptional() + @IsEnum(AssignmentSource) + source?: AssignmentSource; } export class CreateEngagementDto { diff --git a/src/engagements/engagements.service.ts b/src/engagements/engagements.service.ts index 65dfaa0..17771ef 100644 --- a/src/engagements/engagements.service.ts +++ b/src/engagements/engagements.service.ts @@ -8,6 +8,7 @@ import { import { Engagement, EngagementAssignment, + AssignmentSource, AssignmentStatus, AnticipatedStart, EngagementStatus, @@ -110,6 +111,9 @@ type ResolvedAssignmentDetails = { standardHoursPerDay?: number; agreementRate?: string; otherRemarks?: string; + wiproIdEndDate?: Date; + candidateWiproId?: string; + source?: AssignmentSource; }; type PlannedAssignmentMutation = { @@ -378,6 +382,15 @@ export class EngagementsService { if (details.otherRemarks !== undefined) { assignmentData.otherRemarks = details.otherRemarks; } + if (details.wiproIdEndDate !== undefined) { + assignmentData.wiproIdEndDate = details.wiproIdEndDate; + } + if (details.candidateWiproId !== undefined) { + assignmentData.candidateWiproId = details.candidateWiproId; + } + if (details.source !== undefined) { + assignmentData.source = details.source; + } return tx.engagementAssignment.create({ data: assignmentData, }); @@ -1003,6 +1016,9 @@ export class EngagementsService { otherRemarks: assignment.otherRemarks, startDate: assignment.startDate, endDate: assignment.endDate, + wiproIdEndDate: assignment.wiproIdEndDate, + candidateWiproId: assignment.candidateWiproId, + source: assignment.source, }; } @@ -1619,6 +1635,16 @@ export class EngagementsService { if (details.otherRemarks !== undefined) { assignmentUpdateData.otherRemarks = details.otherRemarks; } + if (details.wiproIdEndDate !== undefined) { + assignmentUpdateData.wiproIdEndDate = details.wiproIdEndDate; + } + if (details.candidateWiproId !== undefined) { + assignmentUpdateData.candidateWiproId = + details.candidateWiproId; + } + if (details.source !== undefined) { + assignmentUpdateData.source = details.source; + } return tx.engagementAssignment.update({ where: { @@ -1661,6 +1687,15 @@ export class EngagementsService { if (details.otherRemarks !== undefined) { assignmentCreateData.otherRemarks = details.otherRemarks; } + if (details.wiproIdEndDate !== undefined) { + assignmentCreateData.wiproIdEndDate = details.wiproIdEndDate; + } + if (details.candidateWiproId !== undefined) { + assignmentCreateData.candidateWiproId = details.candidateWiproId; + } + if (details.source !== undefined) { + assignmentCreateData.source = details.source; + } return tx.engagementAssignment.create({ data: assignmentCreateData, @@ -2109,6 +2144,9 @@ export class EngagementsService { standardHoursPerDay?: number; agreementRate?: string; otherRemarks?: string; + wiproIdEndDate?: Date; + candidateWiproId?: string; + source?: AssignmentSource; } { const parseDate = (value?: string) => { if (value === undefined || value === null || value === "") { @@ -2122,6 +2160,7 @@ export class EngagementsService { }; const startDate = parseDate(details?.startDate); + const wiproIdEndDate = parseDate(details?.wiproIdEndDate); const durationMonths = details?.durationMonths; const paymentCycle = details?.paymentCycle ?? DEFAULT_PAYMENT_CYCLE; const ratePerHour = @@ -2140,6 +2179,10 @@ export class EngagementsService { details?.otherRemarks !== undefined ? String(details.otherRemarks).trim() : undefined; + const candidateWiproId = + details?.candidateWiproId !== undefined + ? String(details.candidateWiproId).trim() + : undefined; return { startDate, @@ -2149,6 +2192,9 @@ export class EngagementsService { standardHoursPerDay, agreementRate: agreementRate ? agreementRate : undefined, otherRemarks: otherRemarks ? otherRemarks : undefined, + wiproIdEndDate, + candidateWiproId: candidateWiproId ? candidateWiproId : undefined, + source: details?.source, }; } From 2904a3187a83ad4ad5bc6353661fb09757ae573f Mon Sep 17 00:00:00 2001 From: himaniraghav3 Date: Fri, 31 Jul 2026 14:15:08 +0530 Subject: [PATCH 7/7] Fix build --- src/engagements/engagements.service.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/engagements/engagements.service.ts b/src/engagements/engagements.service.ts index 17771ef..f0c3a95 100644 --- a/src/engagements/engagements.service.ts +++ b/src/engagements/engagements.service.ts @@ -149,6 +149,9 @@ type AssignmentContextDetail = { otherRemarks?: string | null; startDate?: Date | null; endDate?: Date | null; + wiproIdEndDate?: Date | null; + candidateWiproId?: string | null; + source?: AssignmentSource | null; }; type EngagementDetail = Engagement & {