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>
00028 #include <QList>
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 typedef QPair<QTime, QTime> TimeInterval;
00043 typedef QPair<DateTime, DateTime> DateTimeInterval;
00044
00045 class CalendarDay {
00046
00047 public:
00048 CalendarDay();
00049 CalendarDay(int state);
00050 CalendarDay(QDate date, int state=0);
00051 CalendarDay(CalendarDay *day);
00052 ~CalendarDay();
00053
00054 bool load(QDomElement &element);
00055 void save(QDomElement &element) const;
00056
00057 const QList<TimeInterval*> &workingIntervals() const { return m_workingIntervals; }
00058 void addInterval(TimeInterval *interval);
00059 void addInterval(TimeInterval interval) { addInterval(new TimeInterval(interval)); }
00060 void clearIntervals() { m_workingIntervals.clear(); }
00061 void setIntervals(QList<TimeInterval*> intervals) {
00062 m_workingIntervals.clear();
00063 m_workingIntervals = intervals;
00064 }
00065
00066 QTime startOfDay() const;
00067 QTime endOfDay() const;
00068
00069 QDate date() const { return m_date; }
00070 void setDate(QDate date) { m_date = date; }
00071 int state() const { return m_state; }
00072 void setState(int state) { m_state = state; }
00073
00074 bool operator==(const CalendarDay *day) const;
00075 bool operator==(const CalendarDay &day) const;
00076 bool operator!=(const CalendarDay *day) const;
00077 bool operator!=(const CalendarDay &day) const;
00078
00083 Duration effort(const QTime &start, const QTime &end);
00084
00090 TimeInterval interval(const QTime &start, const QTime &end) const;
00091
00092 bool hasInterval() const;
00093
00098 bool hasInterval(const QTime &start, const QTime &end) const;
00099
00100 Duration duration() const;
00101
00102 const CalendarDay ©(const CalendarDay &day);
00103
00104 private:
00105 QDate m_date;
00106 int m_state;
00107 QList<TimeInterval*> m_workingIntervals;
00108
00109 #ifndef NDEBUG
00110 public:
00111 void printDebug(QString indent="");
00112 #endif
00113 };
00114
00115 class CalendarWeekdays {
00116
00117 public:
00118 CalendarWeekdays();
00119 CalendarWeekdays(CalendarWeekdays *weekdays);
00120 ~CalendarWeekdays();
00121
00122 bool load(QDomElement &element);
00123 void save(QDomElement &element) const;
00124
00125 void addWeekday(CalendarDay *day) { m_weekdays.append(day); }
00126 const QList<CalendarDay*> &weekdays() const { return m_weekdays; }
00132 CalendarDay *weekday(int day) const;
00133 CalendarDay *weekday(const QDate &date) const { return weekday(date.dayOfWeek()-1); }
00134 CalendarDay *replace(int weekday, CalendarDay *day) {
00135 CalendarDay *d = m_weekdays.at(weekday);
00136 m_weekdays.replace(weekday, day);
00137 return d;
00138 }
00139 IntMap map();
00140
00141 void setWeekday(IntMap::iterator it, int state) { m_weekdays.at(it.key())->setState(state); }
00142
00143 int state(const QDate &date) const;
00144 int state(int weekday) const;
00145 void setState(int weekday, int state);
00146
00147 const QList<TimeInterval*> &intervals(int weekday) const;
00148 void setIntervals(int weekday, QList<TimeInterval*>intervals);
00149 void clearIntervals(int weekday);
00150
00151 bool operator==(const CalendarWeekdays *weekdays) const;
00152 bool operator!=(const CalendarWeekdays *weekdays) const;
00153
00154 Duration effort(const QDate &date, const QTime &start, const QTime &end);
00155
00162 TimeInterval interval(const QDate date, const QTime &start, const QTime &end) const;
00167 bool hasInterval(const QDate date, const QTime &start, const QTime &end) const;
00168 bool hasInterval() const;
00169
00170 Duration duration() const;
00171 Duration duration(int weekday) const;
00172
00174 QTime startOfDay(int weekday) const;
00176 QTime endOfDay(int weekday) const;
00177
00178 const CalendarWeekdays ©(const CalendarWeekdays &weekdays);
00179
00180 private:
00181 QList<CalendarDay*> m_weekdays;
00182 double m_workHours;
00183
00184 #ifndef NDEBUG
00185 public:
00186 void printDebug(QString indent="");
00187 #endif
00188 };
00189
00207 class Calendar {
00208
00209 public:
00210 Calendar();
00211 Calendar(QString name, Calendar *parent=0);
00212 Calendar(Calendar *calendar);
00213 ~Calendar();
00214
00215 QString name() const { return m_name; }
00216 void setName(QString name) { m_name = name; }
00217
00218 Calendar *parent() const { return m_parent; }
00219 void setParent(Calendar *parent) { m_parent = parent; }
00220
00221 Project *project() const { return m_project; }
00222 void setProject(Project *project);
00223
00224 bool isDeleted() const { return m_deleted; }
00225 void setDeleted(bool yes);
00226
00227 QString id() const { return m_id; }
00228 bool setId(QString id);
00229 void generateId();
00230
00231 bool load(QDomElement &element);
00232 void save(QDomElement &element) const;
00233
00238 CalendarDay *findDay(const QDate &date, bool skipUndefined=false) const;
00239 void addDay(CalendarDay *day) { m_days.insert(0, day); }
00240 void deleteDay(CalendarDay *day) {
00241 int i = m_days.indexOf(day);
00242 if (i != -1) {
00243 m_days.removeAt(i);
00244 }
00245 delete day;
00246 }
00247
00248 CalendarDay *takeDay(CalendarDay *day) {
00249 int i = m_days.indexOf(day);
00250 if (i != -1)
00251 m_days.removeAt(i);
00252 return day;
00253 }
00254 const QList<CalendarDay*> &days() const { return m_days; }
00255
00260 int parentDayState(const QDate &date) const;
00261
00262 IntMap weekdaysMap() { return m_weekdays->map(); }
00263 void setWeekday(IntMap::iterator it, int state) { m_weekdays->setWeekday(it, state); }
00264 CalendarWeekdays *weekdays() { return m_weekdays; }
00265 CalendarDay *weekday(int day) const { return m_weekdays->weekday(day); }
00266
00267 QString parentId() const { return m_parentId; }
00268 void setParentId(QString id) { m_parentId = id; }
00269
00270 bool hasParent(Calendar *cal);
00271
00276 Duration effort(const QDate &date, const QTime &start, const QTime &end) const;
00281 Duration effort(const DateTime &start, const DateTime &end) const;
00282
00289 DateTimeInterval firstInterval(const DateTime &start, const DateTime &end) const;
00290
00297 TimeInterval firstInterval(const QDate &date, const QTime &start, const QTime &end) const;
00298
00303 bool hasInterval(const DateTime &start, const DateTime &end) const;
00304
00309 bool hasInterval(const QDate &date, const QTime &start, const QTime &end) const;
00310
00315 DateTime firstAvailableAfter(const DateTime &time, const DateTime &limit);
00320 DateTime firstAvailableBefore(const DateTime &time, const DateTime &limit);
00321
00322 Calendar *findCalendar() const { return findCalendar(m_id); }
00323 Calendar *findCalendar(const QString &id) const;
00324 bool removeId() { return removeId(m_id); }
00325 bool removeId(const QString &id);
00326 void insertId(const QString &id);
00327
00328 protected:
00329 const Calendar ©(Calendar &calendar);
00330 void init();
00331
00332 private:
00333 QString m_name;
00334 Calendar *m_parent;
00335 Project *m_project;
00336 bool m_deleted;
00337 QString m_id;
00338 QString m_parentId;
00339
00340 QList<CalendarDay*> m_days;
00341 CalendarWeekdays *m_weekdays;
00342
00343 #ifndef NDEBUG
00344 public:
00345 void printDebug(QString indent="");
00346 #endif
00347 };
00348
00349 class StandardWorktime
00350 {
00351 public:
00352 StandardWorktime();
00353 StandardWorktime(StandardWorktime* worktime);
00354 ~StandardWorktime();
00355
00357 Duration durationYear() const { return m_year; }
00359 double year() const { return m_year.toDouble(Duration::Unit_h); }
00361 void setYear(const Duration year) { m_year = year; }
00363 void setYear(double hours) { m_year = Duration((qint64)(hours*60.0*60.0)); }
00364
00366 Duration durationMonth() const { return m_month; }
00368 double month() const { return m_month.toDouble(Duration::Unit_h); }
00370 void setMonth(const Duration month) { m_month = month; }
00372 void setMonth(double hours) { m_month = Duration((qint64)(hours*60.0*60.0)); }
00373
00375 Duration durationWeek() const { return m_week; }
00377 double week() const { return m_week.toDouble(Duration::Unit_h); }
00379 void setWeek(const Duration week) { m_week = week; }
00381 void setWeek(double hours) { m_week = Duration((qint64)(hours*60.0*60.0)); }
00382
00384 Duration durationDay() const { return m_day; }
00386 double day() const { return m_day.toDouble(Duration::Unit_h); }
00388 void setDay(const Duration day) { m_day = day; }
00390 void setDay(double hours) { m_day = Duration((qint64)(hours*60.0*60.0)); }
00391
00392 bool load(QDomElement &element);
00393 void save(QDomElement &element) const;
00394
00395 Calendar *calendar() const { return m_calendar; }
00396
00397 protected:
00398 void init();
00399
00400 private:
00401 Duration m_year;
00402 Duration m_month;
00403 Duration m_week;
00404 Duration m_day;
00405
00406 Calendar *m_calendar;
00407
00408 #ifndef NDEBUG
00409 public:
00410 void printDebug(QString indent="");
00411 #endif
00412 };
00413
00414 }
00415
00416 #endif