00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef KPTRESOURCE_H
00022 #define KPTRESOURCE_H
00023
00024 #include "kptduration.h"
00025 #include "kptdatetime.h"
00026
00027 #include <qdom.h>
00028 #include <qintdict.h>
00029 #include <qstring.h>
00030 #include <qptrlist.h>
00031
00032 #include <kdebug.h>
00033
00034 class QTime;
00035
00036 namespace KPlato
00037 {
00038
00039 class Risk;
00040 class Effort;
00041 class Appointment;
00042 class Task;
00043 class Node;
00044 class Project;
00045 class Resource;
00046 class ResourceRequest;
00047 class ResourceGroupRequest;
00048 class Calendar;
00049 class ResourceRequestCollection;
00050 class EffortCostMap;
00051 class Schedule;
00052 class ResourceSchedule;
00053 class Schedule;
00054
00060
00061
00062
00063
00064
00065
00066 class ResourceGroup {
00067 public:
00068 ResourceGroup(Project *project);
00069 ~ResourceGroup();
00070
00071 enum Type { Type_Work, Type_Material };
00072
00073 QString id() const { return m_id; }
00074 bool setId(QString id);
00075 void generateId();
00076
00077 Project *project() { return m_project; }
00078
00079 void setName(QString n) {m_name=n;}
00080 const QString &name() const {return m_name;}
00081 void setType(Type type) { m_type = type; }
00082
00083 Type type() const { return m_type; }
00084
00092 void addResource(Resource*, Risk*);
00093 void insertResource( unsigned int index, Resource *resource );
00094 void removeResource( Resource *resource );
00095 Resource *takeResource( Resource *resource );
00096 void removeResource(int);
00097
00098 Resource* getResource(int);
00099 Risk* getRisk(int);
00100
00107 QPtrList<Resource> availableResources(const DateTime start, const Duration duration, int num);
00113 void addRequiredResource(ResourceGroup*);
00119 ResourceGroup* getRequiredResource(int);
00125 void removeRequiredResource(int);
00126 int numResources() const { return m_resources.count(); }
00127 QPtrList<Resource> &resources() { return m_resources; }
00128
00129 bool load(QDomElement &element);
00130 void save(QDomElement &element) const;
00131
00132 void initiateCalculation(Schedule &sch);
00133
00134 void addNode(const Node *node) { m_nodes.append(node); }
00135 void clearNodes() { m_nodes.clear(); }
00136
00137 Calendar *defaultCalendar() { return m_defaultCalendar; }
00138
00139 int units();
00140
00141 void registerRequest(ResourceGroupRequest *request)
00142 { m_requests.append(request); }
00143 void unregisterRequest(ResourceGroupRequest *request)
00144 { m_requests.removeRef(request); }
00145 const QPtrList<ResourceGroupRequest> &requests() const
00146 { return m_requests; }
00147
00148 ResourceGroup *findId() const { return findId(m_id); }
00149 ResourceGroup *findId(const QString &id) const;
00150 bool removeId() { return removeId(m_id); }
00151 bool removeId(const QString &id);
00152 void insertId(const QString &id);
00153
00154 Appointment appointmentIntervals() const;
00155
00156 #ifndef NDEBUG
00157 void printDebug(QString ident);
00158 #endif
00159
00160 private:
00161 Project *m_project;
00162 QString m_id;
00163 QString m_name;
00164 QPtrList<Resource> m_resources;
00165 QPtrList<Risk> m_risks;
00166 QPtrList<ResourceGroup> m_requires;
00167
00168 QPtrList<Node> m_nodes;
00169
00170 Calendar *m_defaultCalendar;
00171 Type m_type;
00172
00173 QPtrList<ResourceGroupRequest> m_requests;
00174
00175 };
00176
00187 class Resource {
00188 public:
00189
00190 Resource(Project *project);
00191 Resource(Resource *resource);
00192 virtual ~Resource();
00193
00194 QString id() const { return m_id; }
00195 bool setId(QString id);
00196 void generateId();
00197
00198 enum Type { Type_Work, Type_Material };
00199 void setType(Type type) { m_type = type; }
00200 void setType(const QString &type);
00201 Type type() const { return m_type; }
00202 QString typeToString() const;
00203
00204 void setName(QString n) {m_name=n;}
00205 const QString &name() const {return m_name;}
00206
00207 void setInitials(QString initials) {m_initials=initials;}
00208 const QString &initials() const {return m_initials;}
00209
00210 void setEmail(QString email) {m_email=email;}
00211 const QString &email() const {return m_email;}
00212
00213 void copy(Resource *resource);
00214
00216 void setAvailableFrom(const QDateTime &af) {m_availableFrom=af;}
00218 const DateTime &availableFrom() const {return m_availableFrom;}
00220 void setAvailableUntil(const QDateTime au) {m_availableUntil=au;}
00222 const DateTime &availableUntil() const {return m_availableUntil;}
00223
00224 void addWorkingHour(QTime from, QTime until);
00225 QPtrList<QTime> workingHours() { return m_workingHours; }
00226
00227 DateTime getFirstAvailableTime(DateTime after = DateTime());
00228 DateTime getBestAvailableTime(Duration duration);
00229 DateTime getBestAvailableTime(const DateTime after, const Duration duration);
00230
00231 bool load(QDomElement &element);
00232 void save(QDomElement &element) const;
00233
00235 QPtrList<Appointment> appointments();
00236
00237 Appointment *findAppointment(Node *node);
00239 virtual bool addAppointment(Appointment *appointment);
00241 virtual bool addAppointment(Appointment *appointment, Schedule &main);
00243 virtual void addAppointment(Schedule *node, DateTime &start, DateTime &end, double load=100);
00244
00245 void initiateCalculation(Schedule &sch);
00246 bool isAvailable(Task *task);
00247 void makeAppointment(Schedule *schedule);
00248
00249 bool isOverbooked() const;
00250 bool isOverbooked(const QDate &date) const;
00251 bool isOverbooked(const DateTime &start, const DateTime &end) const;
00252
00253 double normalRate() const { return cost.normalRate; }
00254 void setNormalRate(double rate) { cost.normalRate = rate; }
00255 double overtimeRate() const { return cost.overtimeRate; }
00256 void setOvertimeRate(double rate) { cost.overtimeRate = rate; }
00257 double fixedCost() const { return cost.fixed; }
00258 void setFixedCost(double value) { cost.fixed = value; }
00259
00263 int units() const { return m_units; }
00267 void setUnits(int units) { m_units = units; }
00268
00269 Project *project() const { return m_project; }
00270
00275 Calendar *calendar(bool local=false) const;
00276 Calendar *calendar(const QString id) const;
00277 void setCalendar(Calendar *calendar) { m_calendar = calendar; }
00278
00282 void registerRequest(const ResourceRequest *request)
00283 { m_requests.append(request); }
00284 void unregisterRequest(const ResourceRequest *request)
00285 { m_requests.removeRef(request); }
00286 const QPtrList<ResourceRequest> &requests() const
00287 { return m_requests; }
00288
00289 Duration effort(const DateTime &start, const Duration &duration, bool backward, bool *ok=0) const;
00290
00295 DateTime availableAfter(const DateTime &time, const DateTime limit=DateTime(), bool checkAppointments=false) const;
00300 DateTime availableBefore(const DateTime &time, const DateTime limit=DateTime(), bool checkAppointments=false) const;
00301
00302 Resource *findId() const { return findId(m_id); }
00303 Resource *findId(const QString &id) const;
00304 bool removeId() { return removeId(m_id); }
00305 bool removeId(const QString &id);
00306 void insertId(const QString &id);
00307
00308 Calendar *findCalendar(const QString &id) const;
00309
00310 Appointment appointmentIntervals() const;
00311 Duration plannedEffort(const QDate &date) const;
00312
00313 void setCurrentSchedule(Schedule *schedule) { m_currentSchedule = schedule; }
00314 void setCurrentSchedule(long id) { m_currentSchedule = findSchedule(id); }
00315 Schedule *currentSchedule() const { return m_currentSchedule; }
00316
00317 QIntDict<Schedule> &schedules() { return m_schedules; }
00318 Schedule *findSchedule(long id) { return m_schedules[id]; }
00320 void removeSchedule(Schedule *schedule);
00322 void takeSchedule(const Schedule *schedule);
00323 void addSchedule(Schedule *schedule);
00324 ResourceSchedule *createSchedule(QString name, int type, long id);
00325 ResourceSchedule *createSchedule(Schedule *parent);
00326
00327 protected:
00328 void makeAppointment(Schedule *node, const DateTime &from, const DateTime &end);
00329
00330 private:
00331 Project *m_project;
00332 QIntDict<Schedule> m_schedules;
00333 QString m_id;
00334 QString m_name;
00335 QString m_initials;
00336 QString m_email;
00337 DateTime m_availableFrom;
00338 DateTime m_availableUntil;
00339 QPtrList<QTime> m_workingHours;
00340
00341 int m_units;
00342
00343 Type m_type;
00344
00345 struct Cost {
00346 double normalRate;
00347 double overtimeRate;
00348 double fixed;
00349 } cost;
00350
00351 Calendar *m_calendar;
00352 QPtrList<ResourceRequest> m_requests;
00353
00354 Schedule *m_currentSchedule;
00355
00356 public:
00357 #ifndef NDEBUG
00358 void printDebug(QString ident);
00359 #endif
00360 };
00361
00362
00368 class Risk {
00369 public:
00370
00371 enum RiskType {
00372 NONE=0,
00373 LOW=1,
00374 HIGH=2
00375 };
00376
00377 Risk(Node *n, Resource *r, RiskType rt=NONE);
00378 ~Risk();
00379
00380 RiskType riskType() { return m_riskType; }
00381
00382 Node *node() { return m_node; }
00383 Resource *resource() { return m_resource; }
00384
00385 private:
00386 Node *m_node;
00387 Resource *m_resource;
00388 RiskType m_riskType;
00389 };
00390
00391 class ResourceRequest {
00392 public:
00393 ResourceRequest(Resource *resource=0, int units = 1);
00394
00395 ~ResourceRequest();
00396
00397 ResourceGroupRequest *parent() const { return m_parent; }
00398 void setParent(ResourceGroupRequest *parent) { m_parent = parent; }
00399
00400 Resource *resource() const { return m_resource; }
00401 void setResource(Resource* resource) { m_resource = resource; }
00402
00403 bool load(QDomElement &element, Project &project);
00404 void save(QDomElement &element) const;
00405
00409 int units() const;
00410
00414 int workUnits() const;
00415
00416 void registerRequest() { if (m_resource) m_resource->registerRequest(this); }
00417 void unregisterRequest() { if (m_resource) m_resource->unregisterRequest(this); }
00418
00419 void makeAppointment(Schedule *schedule) {
00420 if (m_resource)
00421 m_resource->makeAppointment(schedule);
00422 }
00423 Task *task() const;
00424
00425 private:
00426 Resource *m_resource;
00427 int m_units;
00428 ResourceGroupRequest *m_parent;
00429
00430 #ifndef NDEBUG
00431 public:
00432 void printDebug(QString ident);
00433 #endif
00434 };
00435
00436 class ResourceGroupRequest {
00437 public:
00438 ResourceGroupRequest(ResourceGroup *group=0, int units=0);
00439 ~ResourceGroupRequest();
00440
00441 void setParent(ResourceRequestCollection *parent) { m_parent = parent;}
00442 ResourceRequestCollection *parent() const { return m_parent; }
00443
00444 ResourceGroup *group() const { return m_group; }
00445 QPtrList<ResourceRequest> &resourceRequests() { return m_resourceRequests; }
00446 void addResourceRequest(ResourceRequest *request);
00447 void removeResourceRequest(ResourceRequest *request) { m_resourceRequests.removeRef(request); }
00448 ResourceRequest *takeResourceRequest(ResourceRequest *request);
00449 ResourceRequest *find(Resource *resource) const;
00450
00451 bool load(QDomElement &element, Project &project);
00452 void save(QDomElement &element) const;
00453
00457 int units() const;
00458
00462 int workUnits() const;
00463
00464 Duration effort(const DateTime &time, const Duration &duration, bool backward, bool *ok=0) const;
00465
00466 int numDays(const DateTime &time, bool backward) const;
00467
00472 Duration duration(const DateTime &start, const Duration &effort, bool backward=false);
00473
00474 DateTime availableAfter(const DateTime &time);
00475 DateTime availableBefore(const DateTime &time);
00476
00481 void makeAppointments(Schedule *schedule);
00482
00486 void reserve(const DateTime &start, const Duration &duration);
00487
00488 bool isEmpty() const;
00489
00490 Task *task() const;
00491
00492 private:
00493 ResourceGroup *m_group;
00494 int m_units;
00495 ResourceRequestCollection *m_parent;
00496
00497 QPtrList<ResourceRequest> m_resourceRequests;
00498 DateTime m_start;
00499 Duration m_duration;
00500
00501 #ifndef NDEBUG
00502 public:
00503 void printDebug(QString ident);
00504 #endif
00505 };
00506
00507 class ResourceRequestCollection {
00508 public:
00509 ResourceRequestCollection(Task &task);
00510 ~ResourceRequestCollection();
00511
00512 const QPtrList<ResourceGroupRequest> &requests() const { return m_requests; }
00513 void addRequest(ResourceGroupRequest *request) {
00514 m_requests.append(request);
00515 request->setParent(this);
00516 }
00517 void removeRequest(ResourceGroupRequest *request) { m_requests.removeRef(request); }
00518 void takeRequest(ResourceGroupRequest *request) { m_requests.take(m_requests.findRef(request)); }
00519 ResourceGroupRequest *find(ResourceGroup *resource) const;
00520 ResourceRequest *find(Resource *resource) const;
00521 bool isEmpty() const;
00522
00523
00524 void save(QDomElement &element) const;
00525
00526 void clear() { m_requests.clear(); }
00527
00531 int units() const;
00532
00536 int workUnits() const;
00537
00542 Duration duration(const DateTime &time, const Duration &effort, bool backward=false);
00543
00544 DateTime availableAfter(const DateTime &time);
00545 DateTime availableBefore(const DateTime &time);
00546
00551 void makeAppointments(Schedule *schedule);
00555 void reserve(const DateTime &start, const Duration &duration);
00556
00557 Task &task() const { return m_task; }
00558
00559 protected:
00560 struct Interval {
00561 DateTime start;
00562 DateTime end;
00563 Duration effort;
00564 };
00565
00566
00567 private:
00568 Task &m_task;
00569 QPtrList<ResourceGroupRequest> m_requests;
00570
00571 #ifndef NDEBUG
00572 public:
00573 void printDebug(QString ident);
00574 #endif
00575 };
00576
00577 }
00578
00579 #endif