summaryrefslogtreecommitdiffstats
path: root/kplato/kpttask.h
diff options
context:
space:
mode:
Diffstat (limited to 'kplato/kpttask.h')
-rw-r--r--kplato/kpttask.h306
1 files changed, 306 insertions, 0 deletions
diff --git a/kplato/kpttask.h b/kplato/kpttask.h
new file mode 100644
index 00000000..17972ee7
--- /dev/null
+++ b/kplato/kpttask.h
@@ -0,0 +1,306 @@
+/* This file is part of the KDE project
+ Copyright (C) 2001 Thomas Zander zander@kde.org
+ Copyright (C) 2004 Dag Andersen <danders@get2net.dk>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KPTTASK_H
+#define KPTTASK_H
+
+#include "kptnode.h"
+#include "kptduration.h"
+#include "kptresource.h"
+
+#include <qptrlist.h>
+
+namespace KPlato
+{
+
+class DateTime;
+
+/**
+ * A task in the scheduling software is represented by this class. A task
+ * can be anything from 'build house' to 'drill hole' It will always mean
+ * an activity.
+ */
+class Task : public Node {
+public:
+ Task(Node *parent = 0);
+ Task(Task &task, Node *parent = 0);
+ ~Task();
+
+ /// Return task type. Can be Type_Task, Type_Summarytask ot Type_Milestone.
+ virtual int type() const;
+
+ /**
+ * Returns the (previously) calculated duration.
+ * The caller must delete returned object.
+ */
+ Duration *getExpectedDuration();
+
+ /**
+ * Instead of using the expected duration, generate a random value using
+ * the Distribution of each Task. This can be used for Monte-Carlo
+ * estimation of Project duration.
+ */
+ Duration *getRandomDuration();
+
+ /**
+ * Return the resource request made to group
+ * (There should be only one)
+ */
+ ResourceGroupRequest *resourceGroupRequest(ResourceGroup *group) const;
+ void clearResourceRequests();
+ void addRequest(ResourceGroup *group, int numResources);
+ void addRequest(ResourceGroupRequest *request);
+ void takeRequest(ResourceGroupRequest *request);
+ int units() const;
+ int workUnits() const;
+ void makeAppointments();
+ /**
+ * Calculates if the assigned resource is overbooked
+ * within the duration of this task
+ */
+ void calcResourceOverbooked();
+
+ void setConstraint(Node::ConstraintType type);
+
+ /// Load from document
+ virtual bool load(QDomElement &element, Project &project);
+ /// Save to document
+ virtual void save(QDomElement &element) const;
+ /// Save appointments for schedule with id
+ virtual void saveAppointments(QDomElement &element, long id) const;
+ /**
+ * Returns a list of planned effort and cost for this task
+ * for the interval start, end inclusive
+ */
+ virtual EffortCostMap plannedEffortCostPrDay(const QDate &start, const QDate &end) const;
+
+ /// Returns the total planned effort for this task (or subtasks)
+ virtual Duration plannedEffort();
+ /// Returns the total planned effort for this task (or subtasks) on date
+ virtual Duration plannedEffort(const QDate &date);
+ /// Returns the planned effort up to and including date
+ virtual Duration plannedEffortTo(const QDate &date);
+
+ /// Returns the total actual effort for this task (or subtasks)
+ virtual Duration actualEffort();
+ /// Returns the total actual effort for this task (or subtasks) on date
+ virtual Duration actualEffort(const QDate &date);
+ /// Returns the actual effort up to and including date
+ virtual Duration actualEffortTo(const QDate &date);
+
+ /**
+ * Returns the total planned cost for this task (or subtasks)
+ */
+ virtual double plannedCost();
+ /// Planned cost on date
+ virtual double plannedCost(const QDate &/*date*/);
+ /// Planned cost up to and including date
+ virtual double plannedCostTo(const QDate &/*date*/);
+
+ /**
+ * Returns the actaually reported cost for this task (or subtasks)
+ */
+ virtual double actualCost();
+ /// Actual cost on date
+ virtual double actualCost(const QDate &/*date*/);
+ /// Actual cost up to and including date
+ virtual double actualCostTo(const QDate &/*date*/);
+
+ /// Effort based performance index
+ double effortPerformanceIndex(const QDate &date, bool *error=0);
+ /// Cost performance index
+ double costPerformanceIndex(const QDate &date, bool *error=0);
+
+ void initiateCalculation(Schedule &sch);
+ /**
+ * Sets up the lists used for calculation.
+ * This includes adding summarytasks relations to subtasks
+ * and lists for start- and endnodes.
+ */
+ void initiateCalculationLists(QPtrList<Node> &startnodes, QPtrList<Node> &endnodes, QPtrList<Node> &summarytasks);
+ /**
+ * Calculates ref m_durationForward from ref earliestStart and
+ * returns the resulting end time,
+ * which will be used as the succesors ref earliestStart.
+ *
+ * @param use Calculate using expected-, optimistic- or pessimistic estimate.
+ */
+ DateTime calculateForward(int use);
+ /**
+ * Calculates ref m_durationBackward from ref latestFinish and
+ * returns the resulting start time,
+ * which will be used as the predecessors ref latestFinish.
+ *
+ * @param use Calculate using expected-, optimistic- or pessimistic estimate.
+ */
+ DateTime calculateBackward(int use);
+ /**
+ * Schedules the task within the limits of earliestStart and latestFinish.
+ * Calculates ref m_startTime, ref m_endTime and ref m_duration,
+ * Assumes ref calculateForward() and ref calculateBackward() has been run.
+ *
+ * @param earliest The task is not scheduled to start earlier than this
+ * @param use Calculate using expected-, optimistic- or pessimistic estimate.
+ * @return The tasks endtime which can be used for scheduling the successor.
+ */
+ DateTime scheduleForward(const DateTime &earliest, int use);
+ /**
+ * Schedules the task within the limits of earliestStart and latestFinish.
+ * Calculates ref m_startTime, ref m_endTime and ref m_duration,
+ * Assumes ref calculateForward() and ref calculateBackward() has been run.
+ *
+ * @param latest The task is not scheduled to end later than this
+ * @param use Calculate using expected-, optimistic- or pessimistic estimate.
+ * @return The tasks starttime which can be used for scheduling the predeccessor.
+ */
+ DateTime scheduleBackward(const DateTime &latest, int use);
+
+ /**
+ * Summarytasks (with milestones) need special treatment because
+ * milestones are always 'glued' to their predecessors.
+ */
+ void adjustSummarytask();
+
+ /**
+ * Return the duration calculated on bases of the requested resources
+ */
+ Duration calcDuration(const DateTime &time, const Duration &effort, bool backward);
+
+ // Proxy relations are relations to/from summarytasks.
+ // These relations are distrubuted to the relevant tasks before calculation.
+ void clearProxyRelations();
+ void addParentProxyRelations(QPtrList<Relation> &list);
+ void addChildProxyRelations(QPtrList<Relation> &list);
+ void addParentProxyRelation(Node *node, const Relation *rel);
+ void addChildProxyRelation(Node *node, const Relation *rel);
+
+ /// Check if this node has any dependent child nodes.
+ bool isEndNode() const;
+ /// Check if this node has any dependent parent nodes
+ bool isStartNode() const;
+
+ /**
+ * Return the time when work can actually start on this task.
+ * This will be the time assigned resources can start work in accordance
+ * with their calendar, or if no resources have been assigned,
+ * the scheduled starttime is used.
+ */
+ virtual DateTime workStartTime() const;
+
+ /**
+ * Return the time when work can actually finish on this task.
+ * This will be the time assigned resources can end work in accordance
+ * with their calendar, or if no resources have been assigned,
+ * the scheduled endtime is used.
+ */
+ virtual DateTime workEndTime() const;
+
+ /**
+ * Return the duration that an activity's start can be delayed
+ * without affecting the project completion date.
+ * An activity with positive float is not on the critical path.
+ */
+ Duration positiveFloat();
+ /**
+ * Return the duration by which the duration of an activity or path
+ * has to be reduced in order to fullfill a timing constraint.
+ */
+ Duration negativeFloat() { return Duration(); }
+ /**
+ * Return the duration by which an activity can be delayed or extended
+ * without affecting the start of any succeeding activity.
+ */
+ Duration freeFloat() { return Duration(); }
+ /**
+ * Return the duration from Early Start to Late Start.
+ */
+ Duration startFloat() { return Duration(); }
+ /**
+ * Return the duration the task has at its finish before a successor task starts.
+ * This is the difference between the start time of the successor and
+ * the finish time of this task.
+ */
+ Duration finishFloat() { return Duration(); }
+
+ /// A task is critical if there is no positive float
+ virtual bool isCritical();
+ /// Calculate critical path
+ virtual bool calcCriticalPath(bool fromEnd);
+
+ /// Set current schedule to schedule with identity id, for me nd my children
+ virtual void setCurrentSchedule(long id);
+
+ virtual bool effortMetError() const;
+
+ struct Progress {
+ Progress() { started = finished = false; percentFinished = 0; }
+ bool operator==(struct Progress &p) {
+ return started == p.started && finished == p.finished &&
+ startTime == p.startTime && finishTime == p.finishTime &&
+ percentFinished == p.percentFinished &&
+ remainingEffort == p.remainingEffort &&
+ totalPerformed == p.totalPerformed;
+ }
+ bool operator!=(struct Progress &p) { return !(*this == p); }
+ struct Progress &operator=(struct Progress &p) {
+ started = p.started; finished = p.finished;
+ startTime = p.startTime; finishTime = p.finishTime;
+ percentFinished = p.percentFinished;
+ remainingEffort = p.remainingEffort;
+ totalPerformed = p.totalPerformed;
+ return *this;
+ }
+ bool started, finished;
+ DateTime startTime, finishTime;
+ int percentFinished;
+ Duration remainingEffort;
+ Duration totalPerformed;
+ };
+ struct Progress &progress() { return m_progress; }
+
+private:
+ DateTime calculateSuccessors(const QPtrList<Relation> &list, int use);
+ DateTime calculatePredeccessors(const QPtrList<Relation> &list, int use);
+ DateTime scheduleSuccessors(const QPtrList<Relation> &list, int use);
+ DateTime schedulePredeccessors(const QPtrList<Relation> &list, int use);
+
+ DateTime workStartAfter(const DateTime &dt);
+ DateTime workFinishBefore(const DateTime &dt);
+
+private:
+ QPtrList<ResourceGroup> m_resource;
+
+ ResourceRequestCollection *m_requests;
+
+ QPtrList<Relation> m_parentProxyRelations;
+ QPtrList<Relation> m_childProxyRelations;
+
+ struct Progress m_progress;
+
+#ifndef NDEBUG
+public:
+ void printDebug(bool children, QCString indent);
+#endif
+
+};
+
+} //KPlato namespace
+
+#endif