00001 #include "schedule.h"
00002
00003 #include "tools/invaliddataexception.h"
00004
00005 namespace domain
00006 {
00007
00008 struct SchedulePrivate : public QSharedData
00009 {
00010 QDateTime startDate;
00011 QDateTime dueDate;
00012 Duration duration;
00013 };
00014
00015 Schedule::Schedule(const Duration& duration, const QDateTime& startDate,
00016 const QDateTime& dueDate) : d(new SchedulePrivate())
00017 {
00018 if (isValid(duration, startDate, dueDate))
00019 {
00020 d->duration = duration;
00021 d->startDate = startDate;
00022 d->dueDate = dueDate;
00023 }
00024 else
00025 throw tools::InvalidDataException("Invalid schedule given");
00026 }
00027
00028 Schedule::Schedule(const Schedule& other) : d(other.d)
00029 {
00030 }
00031
00032 Schedule::~Schedule()
00033 {
00034 }
00035
00036 Schedule& Schedule::operator=(const Schedule& other)
00037 {
00038 if (this != &other)
00039 d = other.d;
00040
00041 return *this;
00042 }
00043
00044 bool Schedule::operator==(const Schedule& other) const
00045 {
00046 return startDate() == other.startDate() &&
00047 dueDate() == other.dueDate() &&
00048 duration() == other.duration();
00049 }
00050
00051 const QDateTime& Schedule::dueDate() const
00052 {
00053 return d->dueDate;
00054 }
00055
00056 void Schedule::setDueDate(const QDateTime& dueDate)
00057 {
00058 if (isValid(duration(), startDate(), dueDate))
00059 {
00060 d->dueDate = dueDate;
00061 }
00062 else
00063 throw tools::InvalidDataException("Invalid dueDate");
00064 }
00065
00066 const domain::Duration& Schedule::duration() const
00067 {
00068 return d->duration;
00069 }
00070
00071 void Schedule::setDuration(const domain::Duration& duration)
00072 {
00073 if (isValid(duration, startDate(), dueDate()))
00074 {
00075 d->duration = duration;
00076 }
00077 else
00078 throw tools::InvalidDataException("Invalid duration");
00079 }
00080
00081 const QDateTime& Schedule::startDate() const
00082 {
00083 return d->startDate;
00084 }
00085
00086 void Schedule::setStartDate(const QDateTime& startDate)
00087 {
00088 if (isValid(duration(), startDate, dueDate()))
00089 {
00090 d->startDate = startDate;
00091 }
00092 else
00093 throw tools::InvalidDataException("Invalid startDate");
00094 }
00095
00096 bool Schedule::isValid(const Duration& duration, const QDateTime& startDate,
00097 const QDateTime& dueDate)
00098 {
00099 if (startDate == dueDate)
00100 return false;
00101
00102 return startDate + duration <= dueDate;
00103 }
00104
00105 }