F:/KPlato/koffice/kplato/kptresource.h

Aller à la documentation de ce fichier.
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 <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 /* 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 {
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     //void setType(const QString &type);
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;   // unique 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; //The nodes that want resources from us
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; // unique 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; // avalable units in percent
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     //bool load(QDomElement &element, Project &project);
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 }  //KPlato namespace
00632 
00633 #endif

Généré le Wed Nov 22 23:40:57 2006 pour KPlato par  doxygen 1.5.1-p1