diff --git a/packages/engagements-prisma-client/edge.js b/packages/engagements-prisma-client/edge.js index e7e747d..d57be11 100644 --- a/packages/engagements-prisma-client/edge.js +++ b/packages/engagements-prisma-client/edge.js @@ -199,6 +199,7 @@ exports.ApplicationStatus = exports.$Enums.ApplicationStatus = { SUBMITTED: 'SUBMITTED', UNDER_REVIEW: 'UNDER_REVIEW', SELECTED: 'SELECTED', + ACCEPTED: 'ACCEPTED', REJECTED: 'REJECTED' }; @@ -243,7 +244,7 @@ const config = { "clientVersion": "7.2.0", "engineVersion": "0c8ef2ce45c83248ab3df073180d5eda9e8be7a3", "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}\n\nenum ApplicationStatus {\n SUBMITTED\n UNDER_REVIEW\n SELECTED\n REJECTED\n}\n\nenum AssignmentStatus {\n SELECTED\n OFFER_REJECTED\n ASSIGNED\n COMPLETED\n TERMINATED\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 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: Cascade)\n feedback EngagementFeedback[]\n memberExperiences MemberExperience[]\n\n @@unique([engagementId, memberId])\n @@index([engagementId])\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}\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 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 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: Cascade)\n feedback EngagementFeedback[]\n memberExperiences MemberExperience[]\n\n @@unique([engagementId, memberId])\n @@index([engagementId])\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\":\"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 5ce284e..6a95a0e 100644 --- a/packages/engagements-prisma-client/index-browser.js +++ b/packages/engagements-prisma-client/index-browser.js @@ -245,6 +245,7 @@ exports.ApplicationStatus = exports.$Enums.ApplicationStatus = { SUBMITTED: 'SUBMITTED', UNDER_REVIEW: 'UNDER_REVIEW', 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 27cf9fb..dfa99e6 100644 --- a/packages/engagements-prisma-client/index.d.ts +++ b/packages/engagements-prisma-client/index.d.ts @@ -57,6 +57,7 @@ export const ApplicationStatus: { SUBMITTED: 'SUBMITTED', UNDER_REVIEW: 'UNDER_REVIEW', SELECTED: 'SELECTED', + ACCEPTED: 'ACCEPTED', REJECTED: 'REJECTED' }; diff --git a/packages/engagements-prisma-client/index.js b/packages/engagements-prisma-client/index.js index 295c564..7f15bd7 100644 --- a/packages/engagements-prisma-client/index.js +++ b/packages/engagements-prisma-client/index.js @@ -200,6 +200,7 @@ exports.ApplicationStatus = exports.$Enums.ApplicationStatus = { SUBMITTED: 'SUBMITTED', UNDER_REVIEW: 'UNDER_REVIEW', SELECTED: 'SELECTED', + ACCEPTED: 'ACCEPTED', REJECTED: 'REJECTED' }; @@ -244,7 +245,7 @@ const config = { "clientVersion": "7.2.0", "engineVersion": "0c8ef2ce45c83248ab3df073180d5eda9e8be7a3", "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}\n\nenum ApplicationStatus {\n SUBMITTED\n UNDER_REVIEW\n SELECTED\n REJECTED\n}\n\nenum AssignmentStatus {\n SELECTED\n OFFER_REJECTED\n ASSIGNED\n COMPLETED\n TERMINATED\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 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: Cascade)\n feedback EngagementFeedback[]\n memberExperiences MemberExperience[]\n\n @@unique([engagementId, memberId])\n @@index([engagementId])\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}\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 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 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: Cascade)\n feedback EngagementFeedback[]\n memberExperiences MemberExperience[]\n\n @@unique([engagementId, memberId])\n @@index([engagementId])\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\":\"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/package.json b/packages/engagements-prisma-client/package.json index 8544d4a..1df16f9 100644 --- a/packages/engagements-prisma-client/package.json +++ b/packages/engagements-prisma-client/package.json @@ -1,5 +1,5 @@ { - "name": "prisma-client-6fcd023f01ffe78fd740a6bd3d9d27a7f7dc61181d909be502b71ab5edc71e56", + "name": "prisma-client-7cc2936d14885ccd3be9654ca092a2ab99d72bcd4ebce0554d3be2bd63cf3888", "main": "index.js", "types": "index.d.ts", "browser": "default.js", diff --git a/packages/engagements-prisma-client/schema.prisma b/packages/engagements-prisma-client/schema.prisma index c39095a..186d122 100644 --- a/packages/engagements-prisma-client/schema.prisma +++ b/packages/engagements-prisma-client/schema.prisma @@ -23,6 +23,7 @@ enum ApplicationStatus { SUBMITTED UNDER_REVIEW SELECTED + ACCEPTED REJECTED } diff --git a/src/engagements/engagements.service.spec.ts b/src/engagements/engagements.service.spec.ts index a2f76ec..0f62af7 100644 --- a/src/engagements/engagements.service.spec.ts +++ b/src/engagements/engagements.service.spec.ts @@ -1,3 +1,4 @@ +import { AssignmentStatus } from "@prisma/client"; import { EngagementsService } from "./engagements.service"; describe("EngagementsService", () => { @@ -77,6 +78,7 @@ describe("EngagementsService", () => { afterEach(() => { jest.restoreAllMocks(); + jest.useRealTimers(); }); it("sets createdBy to system for M2M tokens", async () => { @@ -130,4 +132,140 @@ describe("EngagementsService", () => { }), ); }); + + it("sets assignment endDate to now when status is terminated", async () => { + const now = new Date("2026-02-11T12:00:00.000Z"); + jest.useFakeTimers().setSystemTime(now); + + const tx = { + engagement: { + findUnique: jest.fn().mockResolvedValue({ + id: "eng-1", + isPrivate: false, + assignments: [], + }), + }, + engagementAssignment: { + findUnique: jest.fn().mockResolvedValue({ + id: "assign-1", + engagementId: "eng-1", + status: AssignmentStatus.ASSIGNED, + }), + update: jest.fn().mockResolvedValue({ + id: "assign-1", + engagementId: "eng-1", + status: AssignmentStatus.TERMINATED, + endDate: now, + terminationReason: "Client request", + }), + }, + }; + + db.$transaction.mockImplementation((callback: any) => callback(tx)); + + await service.updateAssignmentStatus( + "eng-1", + "assign-1", + AssignmentStatus.TERMINATED, + " Client request ", + ); + + const updateArgs = tx.engagementAssignment.update.mock.calls[0][0]; + expect(updateArgs).toMatchObject({ + where: { id: "assign-1" }, + data: { + status: AssignmentStatus.TERMINATED, + terminationReason: "Client request", + }, + }); + expect(updateArgs.data.endDate).toBeInstanceOf(Date); + expect(updateArgs.data.endDate.toISOString()).toBe(now.toISOString()); + }); + + it("sets assignment endDate to now when status is completed", async () => { + const now = new Date("2026-02-11T13:00:00.000Z"); + jest.useFakeTimers().setSystemTime(now); + + const tx = { + engagement: { + findUnique: jest.fn().mockResolvedValue({ + id: "eng-1", + isPrivate: false, + assignments: [], + }), + }, + engagementAssignment: { + findUnique: jest.fn().mockResolvedValue({ + id: "assign-1", + engagementId: "eng-1", + status: AssignmentStatus.ASSIGNED, + }), + update: jest.fn().mockResolvedValue({ + id: "assign-1", + engagementId: "eng-1", + status: AssignmentStatus.COMPLETED, + endDate: now, + }), + }, + }; + + db.$transaction.mockImplementation((callback: any) => callback(tx)); + + await service.updateAssignmentStatus( + "eng-1", + "assign-1", + AssignmentStatus.COMPLETED, + ); + + const updateArgs = tx.engagementAssignment.update.mock.calls[0][0]; + expect(updateArgs).toMatchObject({ + where: { id: "assign-1" }, + data: { + status: AssignmentStatus.COMPLETED, + }, + }); + expect(updateArgs.data.endDate).toBeInstanceOf(Date); + expect(updateArgs.data.endDate.toISOString()).toBe(now.toISOString()); + }); + + it("does not set assignment endDate when status is neither completed nor terminated", async () => { + const tx = { + engagement: { + findUnique: jest.fn().mockResolvedValue({ + id: "eng-1", + isPrivate: false, + assignments: [], + }), + }, + engagementAssignment: { + findUnique: jest.fn().mockResolvedValue({ + id: "assign-1", + engagementId: "eng-1", + status: AssignmentStatus.ASSIGNED, + }), + update: jest.fn().mockResolvedValue({ + id: "assign-1", + engagementId: "eng-1", + status: AssignmentStatus.OFFER_REJECTED, + }), + }, + }; + + db.$transaction.mockImplementation((callback: any) => callback(tx)); + + await service.updateAssignmentStatus( + "eng-1", + "assign-1", + AssignmentStatus.OFFER_REJECTED, + ); + + const updateArgs = tx.engagementAssignment.update.mock.calls[0][0]; + expect(updateArgs).toMatchObject({ + where: { id: "assign-1" }, + data: { + status: AssignmentStatus.OFFER_REJECTED, + }, + }); + expect(updateArgs.data).not.toHaveProperty("endDate"); + }); }); diff --git a/src/engagements/engagements.service.ts b/src/engagements/engagements.service.ts index 7347a2a..91fcb31 100644 --- a/src/engagements/engagements.service.ts +++ b/src/engagements/engagements.service.ts @@ -234,9 +234,12 @@ export class EngagementsService { ); } - private async emitMemberAssignedEvents( - engagement: Engagement & { assignments?: EngagementAssignment[] }, - ): Promise { + private async emitMemberAssignedEvents(engagement: { + id: string; + isPrivate: boolean; + requiredSkills: string[]; + assignments?: EngagementAssignment[]; + }): Promise { if (!engagement.isPrivate || !engagement.assignments?.length) { return; } @@ -657,11 +660,8 @@ export class EngagementsService { : []; const existingAssignments = - ( - existingEngagement as Engagement & { - assignments?: EngagementAssignment[]; - } - ).assignments ?? []; + (existingEngagement as { assignments?: EngagementAssignment[] }) + .assignments ?? []; const totalAssignmentCount = existingAssignments.length; const activeAssignmentCount = existingAssignments.filter( (assignment) => @@ -887,12 +887,7 @@ export class EngagementsService { }); }); - const updatedAssignments = - ( - updatedEngagement as Engagement & { - assignments?: EngagementAssignment[]; - } - ).assignments ?? []; + const updatedAssignments = updatedEngagement.assignments ?? []; const existingMemberIds = new Set( existingAssignments.map((assignment) => String(assignment.memberId)), ); @@ -960,7 +955,7 @@ export class EngagementsService { }); } - async updateAssignmentStatus( + updateAssignmentStatus( engagementId: string, assignmentId: string, status: AssignmentStatus, @@ -1004,6 +999,12 @@ export class EngagementsService { const normalizedRemarks = typeof otherRemarks === "string" ? otherRemarks.trim() : otherRemarks; const data: Prisma.EngagementAssignmentUpdateInput = { status }; + if ( + status === AssignmentStatus.TERMINATED || + status === AssignmentStatus.COMPLETED + ) { + data.endDate = new Date(); + } if (terminationReason !== undefined) { data.terminationReason = normalizedReason || null; } @@ -1411,7 +1412,7 @@ export class EngagementsService { } private applyAssignmentFields< - T extends Engagement & { + T extends { assignments?: EngagementAssignment[]; }, >( diff --git a/src/feedback/feedback.service.ts b/src/feedback/feedback.service.ts index f0ddbd6..0f97a54 100644 --- a/src/feedback/feedback.service.ts +++ b/src/feedback/feedback.service.ts @@ -41,7 +41,7 @@ export class FeedbackService { }; } - private async createFeedbackRecord( + private createFeedbackRecord( assignmentId: string, createDto: CreateFeedbackDto, memberId?: string, diff --git a/src/integrations/assignment-offer-email.service.ts b/src/integrations/assignment-offer-email.service.ts index 32ce453..4af3c75 100644 --- a/src/integrations/assignment-offer-email.service.ts +++ b/src/integrations/assignment-offer-email.service.ts @@ -96,6 +96,7 @@ export class AssignmentOfferEmailService { month: "short", day: "2-digit", year: "numeric", + timeZone: "UTC", }) .format(date) .replace(/,/g, "");