kplato

kptresource.h

00001 /* This file is part of the KDE project
00002    Copyright (C) 2001 Thomas Zander zander@kde.org
00003    Copyright (C) 2004, 2005 Dag Andersen <danders@get2net.dk>
00004 
00005    This library is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Library General Public
00007    License as published by the Free Software Foundation; either
00008    version 2 of the License, or (at your option) any later version.
00009 
00010    This library is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Library General Public License for more details.
00014 
00015    You should have received a copy of the GNU Library General Public License
00016    along with this library; see the file COPYING.LIB.  If not, write to
00017    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00018  * Boston, MA 02110-1301, USA.
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 /* IDEA; lets create a resourceGroup that has the intelligence to import PIM schedules
00061  *  from the kroupware project and use the schedules to use the factory pattern to build
00062  *  Resources (probably a derived class) which returns values on getFirstAvailableTime
00063  *  and friends based on the schedules we got from the PIM projects.
00064  *  (Thomas Zander mrt-2003 by suggestion of Shaheed)
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           //void setType(const QString &type);
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;   // unique 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; //The nodes that want resources from us
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; // unique 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; // avalable units in percent
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     //bool load(QDomElement &element, Project &project);
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 }  //KPlato namespace
00575 
00576 #endif
KDE Home | KDE Accessibility Home | Description of Access Keys