diff --git a/package.json b/package.json index 36a461eda..d093b2e3d 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/src/back/models/ProjectMilestone.ts b/src/back/models/ProjectMilestone.ts index 70108125e..19daf90f0 100644 --- a/src/back/models/ProjectMilestone.ts +++ b/src/back/models/ProjectMilestone.ts @@ -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', diff --git a/src/migrations/1715085519126_create-project-milestones-table.ts b/src/migrations/1715085519126_create-project-milestones-table.ts index d5168714b..7d62adac1 100644 --- a/src/migrations/1715085519126_create-project-milestones-table.ts +++ b/src/migrations/1715085519126_create-project-milestones-table.ts @@ -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 { - pgm.createType(STATUS_TYPE, Object.values(MilestoneStatus)) + pgm.createType(STATUS_TYPE, Object.values(ProjectMilestoneStatus)) pgm.createTable(Model.tableName, { id: { type: 'TEXT', diff --git a/src/migrations/1716383233795_milestone-delivery-date.ts b/src/migrations/1716383233795_milestone-delivery-date.ts new file mode 100644 index 000000000..90901ec3b --- /dev/null +++ b/src/migrations/1716383233795_milestone-delivery-date.ts @@ -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 { + pgm.addColumns(Model.tableName, { + delivery_date: { + type: 'TIMESTAMPTZ', + notNull: true, + }, + }) +} + +export async function down(pgm: MigrationBuilder): Promise { + pgm.dropColumn(Model.tableName, 'delivery_date') +} diff --git a/src/services/ProjectService.ts b/src/services/ProjectService.ts index 62a0dbd97..203ff4c5f 100644 --- a/src/services/ProjectService.ts +++ b/src/services/ProjectService.ts @@ -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' @@ -178,6 +179,7 @@ export class ProjectService { }) await ProjectService.createPersonnel(proposal, newProject, creationDate) + await ProjectService.createMilestones(proposal, newProject, creationDate) return newProject } @@ -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) {