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 
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;   // unique 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; //The nodes that want resources from us
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; // unique 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; // avalable units in percent
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     //bool load(QDomElement &element, Project &project);
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 }  //KPlato namespace
00578 
00579 #endif
KDE Home | KDE Accessibility Home | Description of Access Keys