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; }
00128 CalendarDay *weekday(int day) const;
00129 CalendarDay *weekday(const QDate &date) const { return weekday(date.dayOfWeek()-1); }
00130 CalendarDay *replace(int weekday, CalendarDay *day) {
00131 CalendarDay *d = m_weekdays.at(weekday);
00132 m_weekdays.replace(weekday, day);
00133 return d;
00134 }
00135 IntMap map();
00136
00137 void setWeekday(IntMap::iterator it, int state) { m_weekdays.at(it.key())->setState(state); }
00138
00139 int state(const QDate &date) const;
00140 int state(int weekday) const;
00141 void setState(int weekday, int state);
00142
00143 const QPtrList<QPair<QTime, QTime> > &intervals(int weekday) const;
00144 void setIntervals(int weekday, QPtrList<QPair<QTime, QTime> >intervals);
00145 void clearIntervals(int weekday);
00146
00147 bool operator==(const CalendarWeekdays *weekdays) const;
00148 bool operator!=(const CalendarWeekdays *weekdays) const;
00149
00150 Duration effort(const QDate &date, const QTime &start, const QTime &end);
00151
00158 QPair<QTime, QTime> interval(const QDate date, const QTime &start, const QTime &end) const;
00163 bool hasInterval(const QDate date, const QTime &start, const QTime &end) const;
00164 bool hasInterval() const;
00165
00166 Duration duration() const;
00167 Duration duration(int weekday) const;
00168
00170 QTime startOfDay(int weekday) const;
00172 QTime endOfDay(int weekday) const;
00173
00174 const CalendarWeekdays ©(const CalendarWeekdays &weekdays);
00175
00176 private:
00177 QPtrList<CalendarDay> m_weekdays;
00178 double m_workHours;
00179
00180 #ifndef NDEBUG
00181 public:
00182 void printDebug(QCString indent="");
00183 #endif
00184 };
00185
00203 class Calendar {
00204
00205 public:
00206 Calendar();
00207 Calendar(QString name, Calendar *parent=0);
00208 Calendar(Calendar *calendar);
00209 ~Calendar();
00210
00211 QString name() const { return m_name; }
00212 void setName(QString name) { m_name = name; }
00213
00214 Calendar *parent() const { return m_parent; }
00215 void setParent(Calendar *parent) { m_parent = parent; }
00216
00217 Project *project() const { return m_project; }
00218 void setProject(Project *project);
00219
00220 bool isDeleted() const { return m_deleted; }
00221 void setDeleted(bool yes);
00222
00223 QString id() const { return m_id; }
00224 bool setId(QString id);
00225 void generateId();
00226
00227 bool load(QDomElement &element);
00228 void save(QDomElement &element) const;
00229
00234 CalendarDay *findDay(const QDate &date, bool skipUndefined=false) const;
00235 bool addDay(CalendarDay *day) { return m_days.insert(0, day); }
00236 bool removeDay(CalendarDay *day) { return m_days.removeRef(day); }
00237 CalendarDay *takeDay(CalendarDay *day) { return m_days.take(m_days.find(day)); }
00238 const QPtrList<CalendarDay> &days() const { return m_days; }
00239
00244 int parentDayState(const QDate &date) const;
00245
00246 IntMap weekdaysMap() { return m_weekdays->map(); }
00247 void setWeekday(IntMap::iterator it, int state) { m_weekdays->setWeekday(it, state); }
00248 CalendarWeekdays *weekdays() { return m_weekdays; }
00249 CalendarDay *weekday(int day) const { return m_weekdays->weekday(day); }
00250
00251 QString parentId() const { return m_parentId; }
00252 void setParentId(QString id) { m_parentId = id; }
00253
00254 bool hasParent(Calendar *cal);
00255
00260 Duration effort(const QDate &date, const QTime &start, const QTime &end) const;
00265 Duration effort(const DateTime &start, const DateTime &end) const;
00266
00273 QPair<DateTime, DateTime> firstInterval(const DateTime &start, const DateTime &end) const;
00274
00281 QPair<QTime, QTime> firstInterval(const QDate &date, const QTime &start, const QTime &end) const;
00282
00287 bool hasInterval(const DateTime &start, const DateTime &end) const;
00288
00293 bool hasInterval(const QDate &date, const QTime &start, const QTime &end) const;
00294
00299 DateTime firstAvailableAfter(const DateTime &time, const DateTime &limit);
00304 DateTime firstAvailableBefore(const DateTime &time, const DateTime &limit);
00305
00306 Calendar *findCalendar() const { return findCalendar(m_id); }
00307 Calendar *findCalendar(const QString &id) const;
00308 bool removeId() { return removeId(m_id); }
00309 bool removeId(const QString &id);
00310 void insertId(const QString &id);
00311
00312 protected:
00313 const Calendar ©(Calendar &calendar);
00314 void init();
00315
00316 private:
00317 QString m_name;
00318 Calendar *m_parent;
00319 Project *m_project;
00320 bool m_deleted;
00321 QString m_id;
00322 QString m_parentId;
00323
00324 QPtrList<CalendarDay> m_days;
00325 CalendarWeekdays *m_weekdays;
00326
00327 #ifndef NDEBUG
00328 public:
00329 void printDebug(QCString indent="");
00330 #endif
00331 };
00332
00333 class StandardWorktime
00334 {
00335 public:
00336 StandardWorktime();
00337 StandardWorktime(StandardWorktime* worktime);
00338 ~StandardWorktime();
00339
00341 Duration durationYear() const { return m_year; }
00343 double year() const { return m_year.toDouble(Duration::Unit_h); }
00345 void setYear(const Duration year) { m_year = year; }
00347 void setYear(double hours) { m_year = Duration((Q_INT64)(hours*60.0*60.0)); }
00348
00350 Duration durationMonth() const { return m_month; }
00352 double month() const { return m_month.toDouble(Duration::Unit_h); }
00354 void setMonth(const Duration month) { m_month = month; }
00356 void setMonth(double hours) { m_month = Duration((Q_INT64)(hours*60.0*60.0)); }
00357
00359 Duration durationWeek() const { return m_week; }
00361 double week() const { return m_week.toDouble(Duration::Unit_h); }
00363 void setWeek(const Duration week) { m_week = week; }
00365 void setWeek(double hours) { m_week = Duration((Q_INT64)(hours*60.0*60.0)); }
00366
00368 Duration durationDay() const { return m_day; }
00370 double day() const { return m_day.toDouble(Duration::Unit_h); }
00372 void setDay(const Duration day) { m_day = day; }
00374 void setDay(double hours) { m_day = Duration((Q_INT64)(hours*60.0*60.0)); }
00375
00376 bool load(QDomElement &element);
00377 void save(QDomElement &element) const;
00378
00379 protected:
00380 void init();
00381
00382 private:
00383 Duration m_year;
00384 Duration m_month;
00385 Duration m_week;
00386 Duration m_day;
00387
00388 #ifndef NDEBUG
00389 public:
00390 void printDebug(QCString indent="");
00391 #endif
00392 };
00393
00394 }
00395
00396 #endif