Targetprocess MCP Server

by aaronsb
Verified
import { GeneralEntity } from '../base/general.entity.js'; import { BaseEntityData, EntityState, Priority, Process, User, EntityReference } from '../base/base.types.js'; export interface AssignableEntityData { NumericPriority: number; Effort: number; EffortCompleted: number; EffortToDo: number; Progress: number; TimeSpent: number; TimeRemain: number; LastStateChangeDate: string; PlannedStartDate?: string; PlannedEndDate?: string; InitialEstimate: number; EntityState: EntityState; Priority: Priority; Project: { Id: number; Name: string; Process: Process; }; Owner?: User; Team?: EntityReference; ResponsibleTeam?: EntityReference; } /** * Base class for assignable entities (UserStory, Bug, Task, Feature) */ export abstract class AssignableEntity extends GeneralEntity { numericPriority: number; effort: number; effortCompleted: number; effortToDo: number; progress: number; timeSpent: number; timeRemain: number; lastStateChangeDate: Date; plannedStartDate?: Date; plannedEndDate?: Date; initialEstimate: number; entityState: EntityState; priority: Priority; project: { id: number; name: string; process: Process; }; owner?: User; team?: EntityReference; responsibleTeam?: EntityReference; constructor(baseData: BaseEntityData, assignableData: AssignableEntityData) { super(baseData); this.numericPriority = assignableData.NumericPriority; this.effort = assignableData.Effort; this.effortCompleted = assignableData.EffortCompleted; this.effortToDo = assignableData.EffortToDo; this.progress = assignableData.Progress; this.timeSpent = assignableData.TimeSpent; this.timeRemain = assignableData.TimeRemain; this.lastStateChangeDate = new Date(assignableData.LastStateChangeDate); this.plannedStartDate = assignableData.PlannedStartDate ? new Date(assignableData.PlannedStartDate) : undefined; this.plannedEndDate = assignableData.PlannedEndDate ? new Date(assignableData.PlannedEndDate) : undefined; this.initialEstimate = assignableData.InitialEstimate; this.entityState = assignableData.EntityState; this.priority = assignableData.Priority; this.project = { id: assignableData.Project.Id, name: assignableData.Project.Name, process: assignableData.Project.Process }; this.owner = assignableData.Owner; this.team = assignableData.Team; this.responsibleTeam = assignableData.ResponsibleTeam; } /** * Convert entity to API format */ toApiFormat(): Record<string, unknown> { return { ...super.toApiFormat(), NumericPriority: this.numericPriority, Effort: this.effort, EffortCompleted: this.effortCompleted, EffortToDo: this.effortToDo, Progress: this.progress, TimeSpent: this.timeSpent, TimeRemain: this.timeRemain, LastStateChangeDate: this.lastStateChangeDate.toISOString(), PlannedStartDate: this.plannedStartDate?.toISOString(), PlannedEndDate: this.plannedEndDate?.toISOString(), InitialEstimate: this.initialEstimate, EntityState: this.entityState, Priority: this.priority, Project: { Id: this.project.id, Name: this.project.name, Process: this.project.process }, Owner: this.owner, Team: this.team, ResponsibleTeam: this.responsibleTeam }; } /** * Check if entity is in a specific state */ isInState(stateName: string): boolean { return this.entityState.Name === stateName; } /** * Calculate remaining effort */ getRemainingEffort(): number { return this.initialEstimate - this.effortCompleted; } /** * Check if entity is overdue */ isOverdue(): boolean { if (!this.plannedEndDate) return false; return this.plannedEndDate < new Date(); } }