import ProjectTaskModel from './project-task-model.js'; import ProjectNodeModel from './project-node-model.js'; import '../references/extensions.dist.js'; class Project { constructor(options) { const a = this; const _options = Object.assign(a.DefaultOptions, options); a.Debug = false; a.Project = _options; a.Tasks = []; } get StartDate() { const a = this; return new Date(a.Project.StartDate); } get FinishDate() { const a = this; let result = new Date(a.Project.StartDate); a.ExportTasks().forEach(e => { if (e.FinishDate == null) { return; } result = Date.max(result, e.FinishDate); }); return result; } get Duration() { const a = this; return Date.diffDays(a.StartDate, a.FinishDate); } get DefaultOptions() { return { Name: "", Description: "", StartDate: Date.today(), Tag: null, StartOfWeek: 1, // Monday WorkHours: [0, 7.5, 7.5, 7.5, 7.5, 7.5, 0] // 0 = Sunday }; } AddTask(task) { const a = this; const newTask = new ProjectTaskModel(task); const newTaskNode = new ProjectNodeModel(newTask); if ((newTaskNode.PredecessorTaskID == null) && (newTaskNode.CollatedTaskID == null)) { a.Tasks.push(newTaskNode); } else if (newTaskNode.PredecessorTaskID != null) { let node = a.FindTask(newTaskNode.PredecessorTaskID); if (node != null) { node.Tasks.push(newTaskNode); } else { a.#log("Task not found (" + newTaskNode.PredecessorTaskID + ")"); } } else if (newTaskNode.CollatedTaskID != null) { let node = a.FindTask(newTaskNode.CollatedTaskID); if (node != null) { node.Tasks.push(newTaskNode); } else { a.#log("Task not found (" + newTaskNode.CollatedTaskID + ")"); } } else { a.#log("Task not found (" + newTaskNode.ID + ")"); } } Clear() { const a = this; a.Tasks = []; } ExportTasks() { const a = this; let result = a.Tasks.copy().flatten("Tasks"); for (var i=0; i Set StartDate from Predecessor"); } } } else if (task.CollatedTaskID != null) { const groupTask = allTasks.first("ID", task.CollatedTaskID); if (groupTask != null) { if (groupTask.StartDate != null) { task.StartDate = Date.addDays(groupTask.StartDate, task.StartDelay); a.#log("> Set StartDate from Group"); } } } else { task.StartDate = Date.addDays(a.Project.StartDate, task.StartDelay); a.#log("> Set StartDate from Project"); } // if (task.IsCollated) { if (task.Tasks.length > 0) { a.#recalculateTask(allTasks, task.Tasks); a.#log("> Calc inner"); } // } if (task.StartDate != null) { if (task.IsCollated) { const childTasks = task.Tasks.select("CollatedTaskID", task.ID); if (childTasks.length <= 0) { task.FinishDate = task.StartDate; task.Duration = 0; a.#log("> Set FinishDate from Group (0)"); } else { if (!childTasks.any("FinishDate", null)) { task.FinishDate = childTasks.orderByDesc("FinishDate")[0].FinishDate; task.Duration = Date.diffDays(task.StartDate, task.FinishDate); a.#log("> Set FinishDate from Group"); } } } else { task.FinishDate = Date.addDays(task.StartDate, task.Duration); a.#log("> Set FinishDate"); } } } } #sortNode(node) { const a = this; if (Array.isEmpty(node.Tasks)) { return; } node.Tasks.orderBy("StartDelay"); const childDependentTasks = node.Tasks.notSelect("PredecessorTaskID", null); if (childDependentTasks.length > 0) { node.Tasks.removeRange(childDependentTasks); node.Tasks.addRange(childDependentTasks); } node.Tasks.forEach(e => { a.#sortNode(e); }); } } export default Project;