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
00104 QPtrList<Resource> availableResources(const DateTime start, const Duration duration, int num);
00110 void addRequiredResource(ResourceGroup*);
00116 ResourceGroup* getRequiredResource(int);
00122 void removeRequiredResource(int);
00123 int numResources() const { return m_resources.count(); }
00124 QPtrList<Resource> &resources() { return m_resources; }
00125
00126 bool load(QDomElement &element);
00127 void save(QDomElement &element) const;
00128
00129 void initiateCalculation(Schedule &sch);
00130
00131 void addNode(const Node *node) { m_nodes.append(node); }
00132 void clearNodes() { m_nodes.clear(); }
00133
00134 Calendar *defaultCalendar() { return m_defaultCalendar; }
00135
00136 int units();
00137
00138 void registerRequest(ResourceGroupRequest *request)
00139 { m_requests.append(request); }
00140 void unregisterRequest(ResourceGroupRequest *request)
00141 { m_requests.removeRef(request); }
00142 const QPtrList<ResourceGroupRequest> &requests() const
00143 { return m_requests; }
00144
00145 ResourceGroup *findId() const { return findId(m_id); }
00146 ResourceGroup *findId(const QString &id) const;
00147 bool removeId() { return removeId(m_id); }
00148 bool removeId(const QString &id);
00149 void insertId(const QString &id);
00150
00151 Appointment appointmentIntervals() const;
00152
00153 #ifndef NDEBUG
00154 void printDebug(QString ident);
00155 #endif
00156
00157 private:
00158 Project *m_project;
00159 QString m_id;
00160 QString m_name;
00161 QPtrList<Resource> m_resources;
00162 QPtrList<Risk> m_risks;
00163 QPtrList<ResourceGroup> m_requires;
00164
00165 QPtrList<Node> m_nodes;
00166
00167 Calendar *m_defaultCalendar;
00168 Type m_type;
00169
00170 QPtrList<ResourceGroupRequest> m_requests;
00171
00172 };
00173
00184 class Resource {
00185 public:
00186
00187 Resource(Project *project);
00188 Resource(Resource *resource);
00189 virtual ~Resource();
00190
00191 QString id() const { return m_id; }
00192 bool setId(QString id);
00193 void generateId();
00194
00195 enum Type { Type_Work, Type_Material };
00196 void setType(Type type) { m_type = type; }
00197 void setType(const QString &type);
00198 Type type() const { return m_type; }
00199 QString typeToString() const;
00200
00201 void setName(QString n) {m_name=n;}
00202 const QString &name() const {return m_name;}
00203
00204 void setInitials(QString initials) {m_initials=initials;}
00205 const QString &initials() const {return m_initials;}
00206
00207 void setEmail(QString email) {m_email=email;}
00208 const QString &email() const {return m_email;}
00209
00210 void copy(Resource *resource);
00211
00213 void setAvailableFrom(const QDateTime &af) {m_availableFrom=af;}
00215 const DateTime &availableFrom() const {return m_availableFrom;}
00217 void setAvailableUntil(const QDateTime au) {m_availableUntil=au;}
00219 const DateTime &availableUntil() const {return m_availableUntil;}
00220
00221 void addWorkingHour(QTime from, QTime until);
00222 QPtrList<QTime> workingHours() { return m_workingHours; }
00223
00224 DateTime getFirstAvailableTime(DateTime after = DateTime());
00225 DateTime getBestAvailableTime(Duration duration);
00226 DateTime getBestAvailableTime(const DateTime after, const Duration duration);
00227
00228 bool load(QDomElement &element);
00229 void save(QDomElement &element) const;
00230
00232 QPtrList<Appointment> appointments();
00233
00234 Appointment *findAppointment(Node *node);
00236 virtual bool addAppointment(Appointment *appointment);
00238 virtual bool addAppointment(Appointment *appointment, Schedule &main);
00240 virtual void addAppointment(Schedule *node, DateTime &start, DateTime &end, double load=100);
00241
00242 void initiateCalculation(Schedule &sch);
00243 bool isAvailable(Task *task);
00244 void makeAppointment(Schedule *schedule);
00245
00246 bool isOverbooked() const;
00247 bool isOverbooked(const QDate &date) const;
00248 bool isOverbooked(const DateTime &start, const DateTime &end) const;
00249
00250 double normalRate() const { return cost.normalRate; }
00251 void setNormalRate(double rate) { cost.normalRate = rate; }
00252 double overtimeRate() const { return cost.overtimeRate; }
00253 void setOvertimeRate(double rate) { cost.overtimeRate = rate; }
00254 double fixedCost() const { return cost.fixed; }
00255 void setFixedCost(double value) { cost.fixed = value; }
00256
00260 int units() const { return m_units; }
00264 void setUnits(int units) { m_units = units; }
00265
00266 Project *project() const { return m_project; }
00267
00272 Calendar *calendar(bool local=false) const;
00273 Calendar *calendar(const QString id) const;
00274 void setCalendar(Calendar *calendar) { m_calendar = calendar; }
00275
00279 void registerRequest(const ResourceRequest *request)
00280 { m_requests.append(request); }
00281 void unregisterRequest(const ResourceRequest *request)
00282 { m_requests.removeRef(request); }
00283 const QPtrList<ResourceRequest> &requests() const
00284 { return m_requests; }
00285
00286 Duration effort(const DateTime &start, const Duration &duration, bool backward, bool *ok=0) const;
00287
00292 DateTime availableAfter(const DateTime &time, const DateTime limit=DateTime(), bool checkAppointments=false) const;
00297 DateTime availableBefore(const DateTime &time, const DateTime limit=DateTime(), bool checkAppointments=false) const;
00298
00299 Resource *findId() const { return findId(m_id); }
00300 Resource *findId(const QString &id) const;
00301 bool removeId() { return removeId(m_id); }
00302 bool removeId(const QString &id);
00303 void insertId(const QString &id);
00304
00305 Calendar *findCalendar(const QString &id) const;
00306
00307 Appointment appointmentIntervals() const;
00308 Duration plannedEffort(const QDate &date) const;
00309
00310 void setCurrentSchedule(Schedule *schedule) { m_currentSchedule = schedule; }
00311 void setCurrentSchedule(long id) { m_currentSchedule = findSchedule(id); }
00312 Schedule *currentSchedule() const { return m_currentSchedule; }
00313
00314 QIntDict<Schedule> &schedules() { return m_schedules; }
00315 Schedule *findSchedule(long id) { return m_schedules[id]; }
00317 void removeSchedule(Schedule *schedule);
00319 void takeSchedule(const Schedule *schedule);
00320 void addSchedule(Schedule *schedule);
00321 ResourceSchedule *createSchedule(QString name, int type, int id);
00322 ResourceSchedule *createSchedule(Schedule *parent);
00323
00324 protected:
00325 void makeAppointment(Schedule *node, const DateTime &from, const DateTime &end);
00326
00327 private:
00328 Project *m_project;
00329 QIntDict<Schedule> m_schedules;
00330 QString m_id;
00331 QString m_name;
00332 QString m_initials;
00333 QString m_email;
00334 DateTime m_availableFrom;
00335 DateTime m_availableUntil;
00336 QPtrList<QTime> m_workingHours;
00337
00338 int m_units;
00339
00340 Type m_type;
00341
00342 struct Cost {
00343 double normalRate;
00344 double overtimeRate;
00345 double fixed;
00346 } cost;
00347
00348 Calendar *m_calendar;
00349 QPtrList<ResourceRequest> m_requests;
00350
00351 Schedule *m_currentSchedule;
00352
00353 public:
00354 #ifndef NDEBUG
00355 void printDebug(QString ident);
00356 #endif
00357 };
00358
00359
00365 class Risk {
00366 public:
00367
00368 enum RiskType {
00369 NONE=0,
00370 LOW=1,
00371 HIGH=2
00372 };
00373
00374 Risk(Node *n, Resource *r, RiskType rt=NONE);
00375 ~Risk();
00376
00377 RiskType riskType() { return m_riskType; }
00378
00379 Node *node() { return m_node; }
00380 Resource *resource() { return m_resource; }
00381
00382 private:
00383 Node *m_node;
00384 Resource *m_resource;
00385 RiskType m_riskType;
00386 };
00387
00388 class ResourceRequest {
00389 public:
00390 ResourceRequest(Resource *resource=0, int units = 1);
00391
00392 ~ResourceRequest();
00393
00394 ResourceGroupRequest *parent() const { return m_parent; }
00395 void setParent(ResourceGroupRequest *parent) { m_parent = parent; }
00396
00397 Resource *resource() const { return m_resource; }
00398 void setResource(Resource* resource) { m_resource = resource; }
00399
00400 bool load(QDomElement &element, Project &project);
00401 void save(QDomElement &element) const;
00402
00406 int units() const;
00407
00411 int workUnits() const;
00412
00413 void registerRequest() { if (m_resource) m_resource->registerRequest(this); }
00414 void unregisterRequest() { if (m_resource) m_resource->unregisterRequest(this); }
00415
00416 void makeAppointment(Schedule *schedule) {
00417 if (m_resource)
00418 m_resource->makeAppointment(schedule);
00419 }
00420 Task *task() const;
00421
00422 private:
00423 Resource *m_resource;
00424 int m_units;
00425 ResourceGroupRequest *m_parent;
00426
00427 #ifndef NDEBUG
00428 public:
00429 void printDebug(QString ident);
00430 #endif
00431 };
00432
00433 class ResourceGroupRequest {
00434 public:
00435 ResourceGroupRequest(ResourceGroup *group=0, int units=0);
00436 ~ResourceGroupRequest();
00437
00438 void setParent(ResourceRequestCollection *parent) { m_parent = parent;}
00439 ResourceRequestCollection *parent() const { return m_parent; }
00440
00441 ResourceGroup *group() const { return m_group; }
00442 QPtrList<ResourceRequest> &resourceRequests() { return m_resourceRequests; }
00443 void addResourceRequest(ResourceRequest *request);
00444 void removeResourceRequest(ResourceRequest *request) { m_resourceRequests.removeRef(request); }
00445 ResourceRequest *takeResourceRequest(ResourceRequest *request);
00446 ResourceRequest *find(Resource *resource) const;
00447
00448 bool load(QDomElement &element, Project &project);
00449 void save(QDomElement &element) const;
00450
00454 int units() const;
00455
00459 int workUnits() const;
00460
00461 Duration effort(const DateTime &time, const Duration &duration, bool backward, bool *ok=0) const;
00462
00463 int numDays(const DateTime &time, bool backward) const;
00464
00469 Duration duration(const DateTime &start, const Duration &effort, bool backward=false);
00470
00471 DateTime availableAfter(const DateTime &time);
00472 DateTime availableBefore(const DateTime &time);
00473
00478 void makeAppointments(Schedule *schedule);
00479
00483 void reserve(const DateTime &start, const Duration &duration);
00484
00485 bool isEmpty() const;
00486
00487 Task *task() const;
00488
00489 private:
00490 ResourceGroup *m_group;
00491 int m_units;
00492 ResourceRequestCollection *m_parent;
00493
00494 QPtrList<ResourceRequest> m_resourceRequests;
00495 DateTime m_start;
00496 Duration m_duration;
00497
00498 #ifndef NDEBUG
00499 public:
00500 void printDebug(QString ident);
00501 #endif
00502 };
00503
00504 class ResourceRequestCollection {
00505 public:
00506 ResourceRequestCollection(Task &task);
00507 ~ResourceRequestCollection();
00508
00509 const QPtrList<ResourceGroupRequest> &requests() const { return m_requests; }
00510 void addRequest(ResourceGroupRequest *request) {
00511 m_requests.append(request);
00512 request->setParent(this);
00513 }
00514 void removeRequest(ResourceGroupRequest *request) { m_requests.removeRef(request); }
00515 void takeRequest(ResourceGroupRequest *request) { m_requests.take(m_requests.findRef(request)); }
00516 ResourceGroupRequest *find(ResourceGroup *resource) const;
00517 ResourceRequest *find(Resource *resource) const;
00518 bool isEmpty() const;
00519
00520
00521 void save(QDomElement &element) const;
00522
00523 void clear() { m_requests.clear(); }
00524
00528 int units() const;
00529
00533 int workUnits() const;
00534
00539 Duration duration(const DateTime &time, const Duration &effort, bool backward=false);
00540
00541 DateTime availableAfter(const DateTime &time);
00542 DateTime availableBefore(const DateTime &time);
00543
00548 void makeAppointments(Schedule *schedule);
00552 void reserve(const DateTime &start, const Duration &duration);
00553
00554 Task &task() const { return m_task; }
00555
00556 protected:
00557 struct Interval {
00558 DateTime start;
00559 DateTime end;
00560 Duration effort;
00561 };
00562
00563
00564 private:
00565 Task &m_task;
00566 QPtrList<ResourceGroupRequest> m_requests;
00567
00568 #ifndef NDEBUG
00569 public:
00570 void printDebug(QString ident);
00571 #endif
00572 };
00573
00574 }
00575
00576 #endif