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 <QHash>
00029 #include <QString>
00030 #include <QList>
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 {
00068 public:
00069 ResourceGroup( Project *project );
00070 ~ResourceGroup();
00071
00072 enum Type { Type_Work, Type_Material };
00073
00074 QString id() const { return m_id; }
00075 bool setId( QString id );
00076 void generateId();
00077
00078 Project *project() { return m_project; }
00079
00080 void setName( QString n ) {m_name = n;}
00081 const QString &name() const { return m_name;}
00082 void setType( Type type ) { m_type = type; }
00083
00084 Type type() const { return m_type; }
00085
00093 void addResource( Resource*, Risk* );
00094 void insertResource( unsigned int index, Resource *resource );
00095 void deleteResource( Resource *resource );
00096 Resource *takeResource( Resource *resource );
00097 void deleteResource( int );
00098
00099 Resource* getResource( int );
00100 Risk* getRisk( int );
00101
00108 QList<Resource> availableResources( const DateTime start, const Duration duration, int num );
00114 void addRequiredResource( ResourceGroup* );
00120 ResourceGroup* getRequiredResource( int );
00126 void deleteRequiredResource( int );
00127 int numResources() const { return m_resources.count(); }
00128 QList<Resource*> &resources() { return m_resources; }
00129
00130 bool load( QDomElement &element );
00131 void save( QDomElement &element ) const;
00132
00133 void initiateCalculation( Schedule &sch );
00134
00135 void addNode( Node *node ) { m_nodes.append( node ); }
00136 void clearNodes() { m_nodes.clear(); }
00137
00138 Calendar *defaultCalendar() { return m_defaultCalendar; }
00139
00140 int units();
00141
00142 void registerRequest( ResourceGroupRequest *request )
00143 { m_requests.append( request ); }
00144 void unregisterRequest( ResourceGroupRequest *request )
00145 {
00146 int i = m_requests.indexOf( request );
00147 if ( i != -1 )
00148 m_requests.removeAt( i );
00149 }
00150 const QList<ResourceGroupRequest*> &requests() const
00151 { return m_requests; }
00152
00153 ResourceGroup *findId() const { return findId( m_id ); }
00154 ResourceGroup *findId( const QString &id ) const;
00155 bool removeId() { return removeId( m_id ); }
00156 bool removeId( const QString &id );
00157 void insertId( const QString &id );
00158
00159 Appointment appointmentIntervals() const;
00160
00161 #ifndef NDEBUG
00162
00163 void printDebug( QString ident );
00164 #endif
00165
00166 private:
00167 Project *m_project;
00168 QString m_id;
00169 QString m_name;
00170 QList<Resource*> m_resources;
00171 QList<Risk*> m_risks;
00172 QList<ResourceGroup*> m_requires;
00173
00174 QList<Node*> m_nodes;
00175
00176 Calendar *m_defaultCalendar;
00177 Type m_type;
00178
00179 QList<ResourceGroupRequest*> m_requests;
00180
00181 };
00182
00193 class Resource
00194 {
00195 public:
00196
00197 Resource( Project *project );
00198 Resource( Resource *resource );
00199 virtual ~Resource();
00200
00201 QString id() const { return m_id; }
00202 bool setId( QString id );
00203 void generateId();
00204
00205 enum Type { Type_Work, Type_Material };
00206 void setType( Type type ) { m_type = type; }
00207 void setType( const QString &type );
00208 Type type() const { return m_type; }
00209 QString typeToString() const;
00210
00211 void setName( QString n ) {m_name = n;}
00212 const QString &name() const { return m_name;}
00213
00214 void setInitials( QString initials ) {m_initials = initials;}
00215 const QString &initials() const { return m_initials;}
00216
00217 void setEmail( QString email ) {m_email = email;}
00218 const QString &email() const { return m_email;}
00219
00220 void copy( Resource *resource );
00221
00223 void setAvailableFrom( const QDateTime &af ) {m_availableFrom = af;}
00225 const DateTime &availableFrom() const { return m_availableFrom;}
00227 void setAvailableUntil( const QDateTime au ) {m_availableUntil = au;}
00229 const DateTime &availableUntil() const { return m_availableUntil;}
00230
00231 void addWorkingHour( QTime from, QTime until );
00232 QList<QTime*> workingHours() { return m_workingHours; }
00233
00234 DateTime getFirstAvailableTime( DateTime after = DateTime() );
00235 DateTime getBestAvailableTime( Duration duration );
00236 DateTime getBestAvailableTime( const DateTime after, const Duration duration );
00237
00238 bool load( QDomElement &element );
00239 void save( QDomElement &element ) const;
00240
00242 QList<Appointment*> appointments();
00243
00244 Appointment *findAppointment( Node *node );
00246 virtual bool addAppointment( Appointment *appointment );
00248 virtual bool addAppointment( Appointment *appointment, Schedule &main );
00250 virtual void addAppointment( Schedule *node, DateTime &start, DateTime &end, double load = 100 );
00251
00252 void initiateCalculation( Schedule &sch );
00253 bool isAvailable( Task *task );
00254 void makeAppointment( Schedule *schedule );
00255
00256 bool isOverbooked() const;
00257 bool isOverbooked( const QDate &date ) const;
00258 bool isOverbooked( const DateTime &start, const DateTime &end ) const;
00259
00260 double normalRate() const { return cost.normalRate; }
00261 void setNormalRate( double rate ) { cost.normalRate = rate; }
00262 double overtimeRate() const { return cost.overtimeRate; }
00263 void setOvertimeRate( double rate ) { cost.overtimeRate = rate; }
00264 double fixedCost() const { return cost.fixed; }
00265 void setFixedCost( double value ) { cost.fixed = value; }
00266
00270 int units() const { return m_units; }
00274 void setUnits( int units ) { m_units = units; }
00275
00276 Project *project() const { return m_project; }
00277
00282 Calendar *calendar( bool local = false ) const;
00283 Calendar *calendar( const QString id ) const;
00284 void setCalendar( Calendar *calendar ) { m_calendar = calendar; }
00285
00289 void registerRequest( ResourceRequest *request )
00290 { m_requests.append( request ); }
00291 void unregisterRequest( ResourceRequest *request )
00292 {
00293 int i = m_requests.indexOf( request );
00294 if ( i != -1 )
00295 m_requests.removeAt( i );
00296 }
00297 const QList<ResourceRequest*> &requests() const
00298 { return m_requests; }
00299
00300 Duration effort( const DateTime &start, const Duration &duration, bool backward, bool *ok = 0 ) const;
00301
00306 DateTime availableAfter( const DateTime &time, const DateTime limit = DateTime(), bool checkAppointments = false ) const;
00311 DateTime availableBefore( const DateTime &time, const DateTime limit = DateTime(), bool checkAppointments = false ) const;
00312
00313 Resource *findId() const { return findId( m_id ); }
00314 Resource *findId( const QString &id ) const;
00315 bool removeId() { return removeId( m_id ); }
00316 bool removeId( const QString &id );
00317 void insertId( const QString &id );
00318
00319 Calendar *findCalendar( const QString &id ) const;
00320
00321 Appointment appointmentIntervals() const;
00322 Duration plannedEffort( const QDate &date ) const;
00323
00324 void setCurrentSchedule( Schedule *schedule ) { m_currentSchedule = schedule; }
00325 void setCurrentSchedule( long id ) { m_currentSchedule = findSchedule( id ); }
00326 Schedule *currentSchedule() const { return m_currentSchedule; }
00327
00328 QHash<long, Schedule*> &schedules() { return m_schedules; }
00329 Schedule *findSchedule( long id )
00330 {
00331 if ( m_schedules.contains( id ) )
00332 return m_schedules[ id ];
00333 return 0;
00334 }
00336 void deleteSchedule( Schedule *schedule );
00338 void takeSchedule( const Schedule *schedule );
00339 void addSchedule( Schedule *schedule );
00340 ResourceSchedule *createSchedule( QString name, int type, long id );
00341 ResourceSchedule *createSchedule( Schedule *parent );
00342
00343 protected:
00344 void makeAppointment( Schedule *node, const DateTime &from, const DateTime &end );
00345
00346 private:
00347 Project *m_project;
00348 QHash<long, Schedule*> m_schedules;
00349 QString m_id;
00350 QString m_name;
00351 QString m_initials;
00352 QString m_email;
00353 DateTime m_availableFrom;
00354 DateTime m_availableUntil;
00355 QList<QTime*> m_workingHours;
00356
00357 int m_units;
00358
00359 Type m_type;
00360
00361 struct Cost
00362 {
00363 double normalRate;
00364 double overtimeRate;
00365 double fixed ;
00366 }
00367 cost;
00368
00369 Calendar *m_calendar;
00370 QList<ResourceRequest*>
00371 m_requests;
00372
00373 Schedule *m_currentSchedule;
00374
00375 #ifndef NDEBUG
00376 public:
00377 void printDebug( QString ident );
00378 #endif
00379 };
00380
00381
00387 class Risk
00388 {
00389 public:
00390
00391 enum RiskType {
00392 NONE = 0,
00393 LOW = 1,
00394 HIGH = 2
00395 };
00396
00397 Risk( Node *n, Resource *r, RiskType rt = NONE );
00398 ~Risk();
00399
00400 RiskType riskType() { return m_riskType; }
00401
00402 Node *node() { return m_node; }
00403 Resource *resource() { return m_resource; }
00404
00405 private:
00406 Node *m_node;
00407 Resource *m_resource;
00408 RiskType m_riskType;
00409 };
00410
00411 class ResourceRequest
00412 {
00413 public:
00414 ResourceRequest( Resource *resource = 0, int units = 1 );
00415
00416 ~ResourceRequest();
00417
00418 ResourceGroupRequest *parent() const { return m_parent; }
00419 void setParent( ResourceGroupRequest *parent ) { m_parent = parent; }
00420
00421 Resource *resource() const { return m_resource; }
00422 void setResource( Resource* resource ) { m_resource = resource; }
00423
00424 bool load( QDomElement &element, Project &project );
00425 void save( QDomElement &element ) const;
00426
00430 int units() const;
00431
00435 int workUnits() const;
00436
00437 void registerRequest()
00438 {
00439 if ( m_resource )
00440 m_resource->registerRequest( this );
00441 }
00442 void unregisterRequest()
00443 {
00444 if ( m_resource )
00445 m_resource->unregisterRequest( this );
00446 }
00447
00448 void makeAppointment( Schedule *schedule )
00449 {
00450 if ( m_resource )
00451 m_resource->makeAppointment( schedule );
00452 }
00453 Task *task() const;
00454
00455 private:
00456 Resource *m_resource;
00457 int m_units;
00458 ResourceGroupRequest *m_parent;
00459
00460 #ifndef NDEBUG
00461 public:
00462 void printDebug( QString ident );
00463 #endif
00464 };
00465
00466 class ResourceGroupRequest
00467 {
00468 public:
00469 ResourceGroupRequest( ResourceGroup *group = 0, int units = 0 );
00470 ~ResourceGroupRequest();
00471
00472 void setParent( ResourceRequestCollection *parent ) { m_parent = parent;}
00473 ResourceRequestCollection *parent() const { return m_parent; }
00474
00475 ResourceGroup *group() const { return m_group; }
00476 QList<ResourceRequest*> &resourceRequests() { return m_resourceRequests; }
00477 void addResourceRequest( ResourceRequest *request );
00478 void deleteResourceRequest( ResourceRequest *request )
00479 {
00480 int i = m_resourceRequests.indexOf( request );
00481 if ( i != -1 )
00482 m_resourceRequests.removeAt( i );
00483 delete request;
00484 }
00485
00486 ResourceRequest *takeResourceRequest( ResourceRequest *request );
00487 ResourceRequest *find( Resource *resource );
00488
00489 bool load( QDomElement &element, Project &project );
00490 void save( QDomElement &element ) const;
00491
00495 int units() const;
00496
00500 int workUnits() const;
00501
00502 Duration effort( const DateTime &time, const Duration &duration, bool backward, bool *ok = 0 ) const;
00503
00504 int numDays( const DateTime &time, bool backward ) const;
00505
00510 Duration duration( const DateTime &start, const Duration &effort, bool backward = false );
00511
00512 DateTime availableAfter( const DateTime &time );
00513 DateTime availableBefore( const DateTime &time );
00514
00519 void makeAppointments( Schedule *schedule );
00520
00524 void reserve( const DateTime &start, const Duration &duration );
00525
00526 bool isEmpty() const;
00527
00528 Task *task() const;
00529
00530 private:
00531 ResourceGroup *m_group;
00532 int m_units;
00533 ResourceRequestCollection *m_parent;
00534
00535 QList<ResourceRequest*> m_resourceRequests;
00536 DateTime m_start;
00537 Duration m_duration;
00538
00539 #ifndef NDEBUG
00540 public:
00541 void printDebug( QString ident );
00542 #endif
00543 };
00544
00545 class ResourceRequestCollection
00546 {
00547 public:
00548 ResourceRequestCollection( Task &task );
00549 ~ResourceRequestCollection();
00550
00551 const QList<ResourceGroupRequest*> &requests() const { return m_requests; }
00552 void addRequest( ResourceGroupRequest *request )
00553 {
00554 m_requests.append( request );
00555 request->setParent( this );
00556 }
00557 void deleteRequest( ResourceGroupRequest *request )
00558 {
00559 int i = m_requests.indexOf( request );
00560 if ( i != -1 )
00561 m_requests.removeAt( i );
00562 delete request;
00563 }
00564
00565 void takeRequest( ResourceGroupRequest *request )
00566 {
00567 int i = m_requests.indexOf( request );
00568 if ( i != -1 )
00569 m_requests.removeAt( i );
00570 }
00571
00572 ResourceGroupRequest *find( ResourceGroup *resource ) const;
00573 ResourceRequest *find( Resource *resource ) const;
00574 bool isEmpty() const;
00575
00576
00577 void save( QDomElement &element ) const;
00578
00579 void clear() { m_requests.clear(); }
00580
00584 int units() const;
00585
00589 int workUnits() const;
00590
00595 Duration duration( const DateTime &time, const Duration &effort, bool backward = false );
00596
00597 DateTime availableAfter( const DateTime &time );
00598 DateTime availableBefore( const DateTime &time );
00599
00604 void makeAppointments( Schedule *schedule );
00608 void reserve( const DateTime &start, const Duration &duration );
00609
00610 Task &task() const { return m_task; }
00611
00612 protected:
00613 struct Interval
00614 {
00615 DateTime start;
00616 DateTime end;
00617 Duration effort;
00618 };
00619
00620
00621 private:
00622 Task &m_task;
00623 QList<ResourceGroupRequest*> m_requests;
00624
00625 #ifndef NDEBUG
00626 public:
00627 void printDebug( QString ident );
00628 #endif
00629 };
00630
00631 }
00632
00633 #endif