00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef KPTCALENDAR_H
00021 #define KPTCALENDAR_H
00022
00023 #include "kptmap.h"
00024 #include "kptduration.h"
00025
00026 #include <qdatetime.h>
00027 #include <qpair.h>
00028 #include <qptrlist.h>
00029
00030 class QDomElement;
00031 class QDateTime;
00032 class QTime;
00033 class QDate;
00034 class QString;
00035
00036 namespace KPlato
00037 {
00038
00039 class DateTime;
00040 class Project;
00041
00042 class CalendarDay {
00043
00044 public:
00045 CalendarDay();
00046 CalendarDay(int state);
00047 CalendarDay(QDate date, int state=0);
00048 CalendarDay(CalendarDay *day);
00049 ~CalendarDay();
00050
00051 bool load(QDomElement &element);
00052 void save(QDomElement &element) const;
00053
00054 const QPtrList<QPair<QTime, QTime> > &workingIntervals() const { return m_workingIntervals; }
00055 void addInterval(QPair<QTime, QTime> *interval);
00056 void addInterval(QPair<QTime, QTime> interval) { addInterval(new QPair<QTime, QTime>(interval)); }
00057 void clearIntervals() { m_workingIntervals.clear(); }
00058 void setIntervals(QPtrList<QPair<QTime, QTime> > intervals) {
00059 m_workingIntervals.clear();
00060 m_workingIntervals = intervals;
00061 }
00062
00063 QTime startOfDay() const;
00064 QTime endOfDay() const;
00065
00066 QDate date() const { return m_date; }
00067 void setDate(QDate date) { m_date = date; }
00068 int state() const { return m_state; }
00069 void setState(int state) { m_state = state; }
00070
00071 bool operator==(const CalendarDay *day) const;
00072 bool operator==(const CalendarDay &day) const;
00073 bool operator!=(const CalendarDay *day) const;
00074 bool operator!=(const CalendarDay &day) const;
00075
00080 Duration effort(const QTime &start, const QTime &end);
00081
00087 QPair<QTime, QTime> interval(const QTime &start, const QTime &end) const;
00088
00089 bool hasInterval() const;
00090
00095 bool hasInterval(const QTime &start, const QTime &end) const;
00096
00097 Duration duration() const;
00098
00099 const CalendarDay ©(const CalendarDay &day);
00100
00101 private:
00102 QDate m_date;
00103 int m_state;
00104 QPtrList<QPair<QTime, QTime> > m_workingIntervals;
00105
00106 #ifndef NDEBUG
00107 public:
00108 void printDebug(QCString indent="");
00109 #endif
00110 };
00111
00112 class CalendarWeekdays {
00113
00114 public:
00115 CalendarWeekdays();
00116 CalendarWeekdays(CalendarWeekdays *weekdays);
00117 ~CalendarWeekdays();
00118
00119 bool load(QDomElement &element);
00120 void save(QDomElement &element) const;
00121
00122 void addWeekday(CalendarDay *day) { m_weekdays.append(day); }
00123 const QPtrList<CalendarDay> &weekdays() const { return m_weekdays; }
00129 CalendarDay *weekday(int day) const;
00130 CalendarDay *weekday(const QDate &date) const { return weekday(date.dayOfWeek()-1); }
00131 CalendarDay *replace(int weekday, CalendarDay *day) {
00132 CalendarDay *d = m_weekdays.at(weekday);
00133 m_weekdays.replace(weekday, day);
00134 return d;
00135 }
00136 IntMap map();
00137
00138 void setWeekday(IntMap::iterator it, int state) { m_weekdays.at(it.key())->setState(state); }
00139
00140 int state(const QDate &date) const;
00141 int state(int weekday) const;
00142 void setState(int weekday, int state);
00143
00144 const QPtrList<QPair<QTime, QTime> > &intervals(int weekday) const;
00145 void setIntervals(int weekday, QPtrList<QPair<QTime, QTime> >intervals);
00146 void clearIntervals(int weekday);
00147
00148 bool operator==(const CalendarWeekdays *weekdays) const;
00149 bool operator!=(const CalendarWeekdays *weekdays) const;
00150
00151 Duration effort(const QDate &date, const QTime &start, const QTime &end);
00152
00159 QPair<QTime, QTime> interval(const QDate date, const QTime &start, const QTime &end) const;
00164 bool hasInterval(const QDate date, const QTime &start, const QTime &end) const;
00165 bool hasInterval() const;
00166
00167 Duration duration() const;
00168 Duration duration(int weekday) const;
00169
00171 QTime startOfDay(int weekday) const;
00173 QTime endOfDay(int weekday) const;
00174
00175 const CalendarWeekdays ©(const CalendarWeekdays &weekdays);
00176
00177 private:
00178 QPtrList<CalendarDay> m_weekdays;
00179 double m_workHours;
00180
00181 #ifndef NDEBUG
00182 public:
00183 void printDebug(QCString indent="");
00184 #endif
00185 };
00186
00204 class Calendar {
00205
00206 public:
00207 Calendar();
00208 Calendar(QString name, Calendar *parent=0);
00209 Calendar(Calendar *calendar);
00210 ~Calendar();
00211
00212 QString name() const { return m_name; }
00213 void setName(QString name) { m_name = name; }
00214
00215 Calendar *parent() const { return m_parent; }
00216 void setParent(Calendar *parent) { m_parent = parent; }
00217
00218 Project *project() const { return m_project; }
00219 void setProject(Project *project);
00220
00221 bool isDeleted() const { return m_deleted; }
00222 void setDeleted(bool yes);
00223
00224 QString id() const { return m_id; }
00225 bool setId(QString id);
00226 void generateId();
00227
00228 bool load(QDomElement &element);
00229 void save(QDomElement &element) const;
00230
00235 CalendarDay *findDay(const QDate &date, bool skipUndefined=false) const;
00236 bool addDay(CalendarDay *day) { return m_days.insert(0, day); }
00237 bool removeDay(CalendarDay *day) { return m_days.removeRef(day); }
00238 CalendarDay *takeDay(CalendarDay *day) { return m_days.take(m_days.find(day)); }
00239 const QPtrList<CalendarDay> &days() const { return m_days; }
00240
00245 int parentDayState(const QDate &date) const;
00246
00247 IntMap weekdaysMap() { return m_weekdays->map(); }
00248 void setWeekday(IntMap::iterator it, int state) { m_weekdays->setWeekday(it, state); }
00249 CalendarWeekdays *weekdays() { return m_weekdays; }
00250 CalendarDay *weekday(int day) const { return m_weekdays->weekday(day); }
00251
00252 QString parentId() const { return m_parentId; }
00253 void setParentId(QString id) { m_parentId = id; }
00254
00255 bool hasParent(Calendar *cal);
00256
00261 Duration effort(const QDate &date, const QTime &start, const QTime &end) const;
00266 Duration effort(const DateTime &start, const DateTime &end) const;
00267
00274 QPair<DateTime, DateTime> firstInterval(const DateTime &start, const DateTime &end) const;
00275
00282 QPair<QTime, QTime> firstInterval(const QDate &date, const QTime &start, const QTime &end) const;
00283
00288 bool hasInterval(const DateTime &start, const DateTime &end) const;
00289
00294 bool hasInterval(const QDate &date, const QTime &start, const QTime &end) const;
00295
00300 DateTime firstAvailableAfter(const DateTime &time, const DateTime &limit);
00305 DateTime firstAvailableBefore(const DateTime &time, const DateTime &limit);
00306
00307 Calendar *findCalendar() const { return findCalendar(m_id); }
00308 Calendar *findCalendar(const QString &id) const;
00309 bool removeId() { return removeId(m_id); }
00310 bool removeId(const QString &id);
00311 void insertId(const QString &id);
00312
00313 protected:
00314 const Calendar ©(Calendar &calendar);
00315 void init();
00316
00317 private:
00318 QString m_name;
00319 Calendar *m_parent;
00320 Project *m_project;
00321 bool m_deleted;
00322 QString m_id;
00323 QString m_parentId;
00324
00325 QPtrList<CalendarDay> m_days;
00326 CalendarWeekdays *m_weekdays;
00327
00328 #ifndef NDEBUG
00329 public:
00330 void printDebug(QCString indent="");
00331 #endif
00332 };
00333
00334 class StandardWorktime
00335 {
00336 public:
00337 StandardWorktime();
00338 StandardWorktime(StandardWorktime* worktime);
00339 ~StandardWorktime();
00340
00342 Duration durationYear() const { return m_year; }
00344 double year() const { return m_year.toDouble(Duration::Unit_h); }
00346 void setYear(const Duration year) { m_year = year; }
00348 void setYear(double hours) { m_year = Duration((Q_INT64)(hours*60.0*60.0)); }
00349
00351 Duration durationMonth() const { return m_month; }
00353 double month() const { return m_month.toDouble(Duration::Unit_h); }
00355 void setMonth(const Duration month) { m_month = month; }
00357 void setMonth(double hours) { m_month = Duration((Q_INT64)(hours*60.0*60.0)); }
00358
00360 Duration durationWeek() const { return m_week; }
00362 double week() const { return m_week.toDouble(Duration::Unit_h); }
00364 void setWeek(const Duration week) { m_week = week; }
00366 void setWeek(double hours) { m_week = Duration((Q_INT64)(hours*60.0*60.0)); }
00367
00369 Duration durationDay() const { return m_day; }
00371 double day() const { return m_day.toDouble(Duration::Unit_h); }
00373 void setDay(const Duration day) { m_day = day; }
00375 void setDay(double hours) { m_day = Duration((Q_INT64)(hours*60.0*60.0)); }
00376
00377 bool load(QDomElement &element);
00378 void save(QDomElement &element) const;
00379
00380 Calendar *calendar() const { return m_calendar; }
00381
00382 protected:
00383 void init();
00384
00385 private:
00386 Duration m_year;
00387 Duration m_month;
00388 Duration m_week;
00389 Duration m_day;
00390
00391 Calendar *m_calendar;
00392
00393 #ifndef NDEBUG
00394 public:
00395 void printDebug(QCString indent="");
00396 #endif
00397 };
00398
00399 }
00400
00401 #endif