Skip to content

Commit

Permalink
feat: create project milestones from proposal data (#1808)
Browse files Browse the repository at this point in the history
  • Loading branch information
andyesp committed May 27, 2024
1 parent 6ea384c commit 31b66e6
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 5 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"build": "npm run build:server",
"build:server": "tsc -p .",
"format": "prettier --write \"**/*.{js,jsx,json,md,ts,tsx}\"",
"start": "concurrently -c blue,green -n SERVER,FRONT 'npm run serve' 'npm run develop'",
"start": "concurrently -c blue -n SERVER 'npm run serve'",
"serve": "DOTENV_CONFIG_PATH=.env.development nodemon --watch src/entities --watch src/back --watch src/clients --watch src/services --watch src/server.ts --watch static/api.yaml -e ts,json --exec 'ts-node -r dotenv/config' src/server",
"version": "tsc -p .",
"migrate": "DOTENV_CONFIG_PATH=.env.development ts-node -r dotenv/config.js ./node_modules/node-pg-migrate/bin/node-pg-migrate -j ts -m src/migrations -d CONNECTION_STRING",
Expand Down
5 changes: 3 additions & 2 deletions src/back/models/ProjectMilestone.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,15 @@ export type ProjectMilestone = {
project_id: string
title: string
description: string
status: MilestoneStatus
delivery_date: Date
status: ProjectMilestoneStatus
updated_by?: string
updated_at?: Date
created_by: string
created_at: Date
}

export enum MilestoneStatus {
export enum ProjectMilestoneStatus {
Pending = 'pending',
InProgress = 'in_progress',
Done = 'done',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { MigrationBuilder } from "node-pg-migrate"
import ProjectModel from "../back/models/Project"
import Model, { MilestoneStatus } from "../back/models/ProjectMilestone"
import Model, { ProjectMilestoneStatus } from "../back/models/ProjectMilestone"

const STATUS_TYPE = 'project_milestone_status_type'


export async function up(pgm: MigrationBuilder): Promise<void> {
pgm.createType(STATUS_TYPE, Object.values(MilestoneStatus))
pgm.createType(STATUS_TYPE, Object.values(ProjectMilestoneStatus))
pgm.createTable(Model.tableName, {
id: {
type: 'TEXT',
Expand Down
18 changes: 18 additions & 0 deletions src/migrations/1716383233795_milestone-delivery-date.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { ColumnDefinitions, MigrationBuilder } from 'node-pg-migrate'

import Model from '../back/models/ProjectMilestone'

export const shorthands: ColumnDefinitions | undefined = undefined

export async function up(pgm: MigrationBuilder): Promise<void> {
pgm.addColumns(Model.tableName, {
delivery_date: {
type: 'TIMESTAMPTZ',
notNull: true,
},
})
}

export async function down(pgm: MigrationBuilder): Promise<void> {
pgm.dropColumn(Model.tableName, 'delivery_date')
}
24 changes: 24 additions & 0 deletions src/services/ProjectService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import crypto from 'crypto'

import PersonnelModel, { PersonnelAttributes } from '../back/models/Personnel'
import ProjectModel, { ProjectAttributes } from '../back/models/Project'
import ProjectMilestoneModel, { ProjectMilestone, ProjectMilestoneStatus } from '../back/models/ProjectMilestone'
import { TransparencyVesting } from '../clients/Transparency'
import UnpublishedBidModel from '../entities/Bid/model'
import { BidProposalConfiguration } from '../entities/Bid/types'
Expand Down Expand Up @@ -178,6 +179,7 @@ export class ProjectService {
})

await ProjectService.createPersonnel(proposal, newProject, creationDate)
await ProjectService.createMilestones(proposal, newProject, creationDate)

return newProject
}
Expand All @@ -202,6 +204,28 @@ export class ProjectService {
await PersonnelModel.createMany(newPersonnel)
}

private static async createMilestones(proposal: ProposalWithOutcome, project: ProjectAttributes, creationDate: Date) {
const newMilestones: ProjectMilestone[] = []
const config =
proposal.type === ProposalType.Grant
? (proposal.configuration as GrantProposalConfiguration)
: (proposal.configuration as BidProposalConfiguration)

config.milestones?.forEach((milestone) => {
newMilestones.push({
id: crypto.randomUUID(),
project_id: project.id,
created_at: creationDate,
title: milestone.title,
description: milestone.tasks,
delivery_date: new Date(milestone.delivery_date),
status: ProjectMilestoneStatus.Pending,
created_by: proposal.user,
})
})
await ProjectMilestoneModel.createMany(newMilestones)
}

static async getProject(id: string) {
const project = await ProjectModel.getProject(id)
if (!project) {
Expand Down

0 comments on commit 31b66e6

Please sign in to comment.