21#include "kptresource.h"
22#include "kptappointment.h"
23#include "kptproject.h"
25#include "kptdatetime.h"
26#include "kptcalendar.h"
27#include "kpteffortcostmap.h"
28#include "kptschedule.h"
37ResourceGroup::ResourceGroup(
Project *project) {
40 m_resources.setAutoDelete(
true);
45ResourceGroup::~ResourceGroup() {
46 if (findId() ==
this) {
52bool ResourceGroup::setId(TQString
id) {
55 kdError()<<k_funcinfo<<
"id is empty"<<endl;
59 ResourceGroup *g = findId();
65 kdError()<<k_funcinfo<<
"My id '"<<m_id<<
"' already used for different group: "<<g->name()<<endl;
68 kdError()<<k_funcinfo<<
"id '"<<
id<<
"' is already used for different group: "<<findId(
id)->name()<<endl;
78void ResourceGroup::generateId() {
79 if (!m_id.isEmpty()) {
82 for (
int i=0; i<32000 ; ++i) {
83 m_id = m_id.setNum(i);
93 m_resources.append(resource);
96Resource* ResourceGroup::getResource(
int) {
100Risk* ResourceGroup::getRisk(
int) {
104void ResourceGroup::removeResource(
Resource *resource) {
105 m_resources.removeRef(resource);
109 return m_resources.take(m_resources.findRef(resource));
112void ResourceGroup::removeResource(
int) {
125bool ResourceGroup::load(TQDomElement &element) {
127 setId(element.attribute(
"id"));
128 m_name = element.attribute(
"name");
130 TQDomNodeList list = element.childNodes();
131 for (
unsigned int i=0; i<list.count(); ++i) {
132 if (list.item(i).isElement()) {
133 TQDomElement e = list.item(i).toElement();
134 if (e.tagName() ==
"resource") {
148void ResourceGroup::save(TQDomElement &element)
const {
151 TQDomElement me = element.ownerDocument().createElement(
"resource-group");
152 element.appendChild(me);
154 me.setAttribute(
"id", m_id);
155 me.setAttribute(
"name", m_name);
157 TQPtrListIterator<Resource> it(m_resources);
158 for ( ; it.current(); ++it ) {
159 it.current()->save(me);
163void ResourceGroup::initiateCalculation(
Schedule &sch) {
164 TQPtrListIterator<Resource> it(m_resources);
165 for (; it.current(); ++it) {
166 it.current()->initiateCalculation(sch);
171int ResourceGroup::units() {
173 TQPtrListIterator<Resource> it = m_resources;
174 for (; it.current(); ++it) {
175 u += it.current()->units();
180ResourceGroup *ResourceGroup::findId(
const TQString &
id)
const {
181 return m_project ? m_project->findResourceGroup(
id) : 0;
184bool ResourceGroup::removeId(
const TQString &
id) {
185 return m_project ? m_project->removeResourceGroupId(
id):
false;
188void ResourceGroup::insertId(
const TQString &
id) {
190 m_project->insertResourceGroupId(
id,
this);
193Appointment ResourceGroup::appointmentIntervals()
const {
195 TQPtrListIterator<Resource> it = m_resources;
196 for (; it.current(); ++it) {
197 a += it.current()->appointmentIntervals();
202Resource::Resource(
Project *project) : m_project(project), m_schedules(), m_workingHours() {
206 m_availableFrom = DateTime(TQDate::currentDate());
207 m_availableUntil = TQDateTime(m_availableFrom.addYears(2));
209 cost.normalRate = 100;
210 cost.overtimeRate = 200;
213 m_currentSchedule = 0;
218Resource::Resource(
Resource *resource) {
223Resource::~Resource() {
225 if (findId() ==
this) {
228 TQPtrListIterator<ResourceRequest> it = m_requests;
229 for (; it.current(); ++it) {
230 it.current()->setResource(0);
233 for (; m_requests.current(); m_requests.next()) {
234 m_requests.current()->parent()->removeResourceRequest(m_requests.current());
238bool Resource::setId(TQString
id) {
241 kdError()<<k_funcinfo<<
"id is empty"<<endl;
245 Resource *r = findId();
251 kdError()<<k_funcinfo<<
"My id '"<<m_id<<
"' already used for different resource: "<<r->name()<<endl;
254 kdError()<<k_funcinfo<<
"id '"<<
id<<
"' is already used for different resource: "<<findId(
id)->name()<<endl;
264void Resource::generateId() {
265 if (!m_id.isEmpty()) {
268 for (
int i=0; i<32000 ; ++i) {
269 m_id = m_id.setNum(i);
279void Resource::setType(
const TQString &type) {
282 else if (type ==
"Material")
283 m_type = Type_Material;
286TQString Resource::typeToString()
const {
287 if (m_type == Type_Work)
288 return TQString(
"Work");
289 else if (m_type == Type_Material)
290 return TQString(
"Material");
295void Resource::copy(
Resource *resource) {
296 m_project = resource->project();
298 m_id = resource->id();
299 m_name = resource->name();
300 m_initials = resource->initials();
301 m_email = resource->email();
302 m_availableFrom = resource->availableFrom();
303 m_availableUntil = resource->availableUntil();
304 m_workingHours.clear();
305 m_workingHours = resource->workingHours();
307 m_units = resource->units();
309 m_type = resource->type();
311 cost.normalRate = resource->normalRate();
312 cost.overtimeRate = resource->overtimeRate();
313 cost.fixed = resource->fixedCost();
315 m_calendar = resource->m_calendar;
318void Resource::addWorkingHour(TQTime from, TQTime until) {
320 m_workingHours.append(
new TQTime(from));
321 m_workingHours.append(
new TQTime(until));
325 if (!local && project() != 0 && (m_calendar == 0 || m_calendar->isDeleted())) {
326 return project()->defaultCalendar();
328 if (m_calendar && m_calendar->isDeleted()) {
338DateTime Resource::getBestAvailableTime(Duration ) {
346bool Resource::load(TQDomElement &element) {
349 setId(element.attribute(
"id"));
350 m_name = element.attribute(
"name");
351 m_initials = element.attribute(
"initials");
352 m_email = element.attribute(
"email");
353 setType(element.attribute(
"type"));
354 m_calendar = findCalendar(element.attribute(
"calendar-id"));
355 m_units = element.attribute(
"units",
"100").toInt();
356 s = element.attribute(
"available-from");
358 m_availableFrom = DateTime::fromString(s);
359 s = element.attribute(
"available-until");
361 m_availableUntil = DateTime::fromString(s);
363 cost.normalRate = TDEGlobal::locale()->readMoney(element.attribute(
"normal-rate"));
364 cost.overtimeRate = TDEGlobal::locale()->readMoney(element.attribute(
"overtime-rate"));
368void Resource::save(TQDomElement &element)
const {
370 TQDomElement me = element.ownerDocument().createElement(
"resource");
371 element.appendChild(me);
374 me.setAttribute(
"calendar-id", m_calendar->id());
375 me.setAttribute(
"id", m_id);
376 me.setAttribute(
"name", m_name);
377 me.setAttribute(
"initials", m_initials);
378 me.setAttribute(
"email", m_email);
379 me.setAttribute(
"type", typeToString());
380 me.setAttribute(
"units", m_units);
381 me.setAttribute(
"available-from", m_availableFrom.toString(TQt::ISODate));
382 me.setAttribute(
"available-until", m_availableUntil.toString(TQt::ISODate));
383 me.setAttribute(
"normal-rate", TDEGlobal::locale()->formatMoney(cost.normalRate));
384 me.setAttribute(
"overtime-rate", TDEGlobal::locale()->formatMoney(cost.overtimeRate));
387bool Resource::isAvailable(
Task *) {
400 TQPtrList<Appointment> lst;
401 if (m_currentSchedule)
402 lst = m_currentSchedule->appointments();
417 if (m_currentSchedule)
418 return m_currentSchedule->add(appointment);
423 Schedule *s = findSchedule(main.id());
425 s = createSchedule(&main);
427 appointment->setResource(s);
428 return s->
add(appointment);
433 Schedule *s = findSchedule(node->id());
435 s = createSchedule(node->parent());
440void Resource::initiateCalculation(
Schedule &sch) {
441 m_currentSchedule = createSchedule(&sch);
452 if (m_currentSchedule == schedule)
453 m_currentSchedule = 0;
454 m_schedules.take(schedule->id());
457void Resource::addSchedule(
Schedule *schedule) {
460 m_schedules.replace(schedule->id(), schedule);
463ResourceSchedule *Resource::createSchedule(TQString name,
int type,
long id) {
464 ResourceSchedule *sch =
new ResourceSchedule(
this, name, (Schedule::Type)type,
id);
470 ResourceSchedule *sch =
new ResourceSchedule(parent,
this);
476 if (!from.isValid() || !end.isValid()) {
477 kdWarning()<<k_funcinfo<<
"Invalid time"<<endl;
484 DateTime time = from;
487 if (!time.isValid() || !end.isValid()) {
488 kdWarning()<<k_funcinfo<<
"Invalid time"<<endl;
491 if (!cal->hasInterval(time, end)) {
493 kdWarning()<<k_funcinfo<<m_name<<
": Resource only partially available"<<endl;
497 TQPair<DateTime, DateTime> i = cal->firstInterval(time, end);
498 if (!i.second.isValid()) {
499 kdWarning()<<k_funcinfo<<
"Invalid interval: "<<time<<
", "<<end<<endl;
502 if (time == i.second)
506 if (!(node->workStartTime.isValid()) || i.first < node->workStartTime)
507 node->workStartTime = i.first;
508 if (!(node->workEndTime.isValid()) || i.second > node->workEndTime)
509 node->workEndTime = i.second;
514void Resource::makeAppointment(
Schedule *node) {
516 if (!node->startTime.isValid()) {
517 kdWarning()<<k_funcinfo<<m_name<<
": startTime invalid"<<endl;
520 if (!node->endTime.isValid()) {
521 kdWarning()<<k_funcinfo<<m_name<<
": endTime invalid"<<endl;
525 if (m_type == Type_Material) {
528 if (!from.isValid() || !end.isValid()) {
536 makeAppointment(node, from, end);
539 kdWarning()<<k_funcinfo<<m_name<<
": No calendar defined"<<endl;
543 DateTime time = node->startTime;
544 DateTime end = node->endTime;
546 if (!time.isValid()) {
547 kdWarning()<<k_funcinfo<<m_name<<
": Resource not available (after="<<node->startTime<<
", "<<end<<
")"<<endl;
548 node->resourceNotAvailable =
true;
552 if (!end.isValid()) {
553 kdWarning()<<k_funcinfo<<m_name<<
": Resource not available (before="<<node->endTime<<
", "<<time<<
")"<<endl;
554 node->resourceNotAvailable =
true;
558 makeAppointment(node, time, end);
567 kdWarning()<<k_funcinfo<<
"zero duration"<<endl;
572 kdWarning()<<k_funcinfo<<m_name<<
": No calendar defined"<<endl;
576 DateTime limit = start - duration;
580 e = (cal->effort(limit, t) * m_units)/100;
585 DateTime limit = start + duration;
589 e = (cal->effort(t, limit) * m_units)/100;
603 if (limit.isValid() && limit < lmt) {
609 if (type() == Type_Material) {
610 t = time > m_availableFrom ? time : m_availableFrom;
618 t = m_availableFrom > time ? m_availableFrom : time;
620 if (checkAppointments) {
633 if (limit.isValid() && limit > lmt) {
639 if (type() == Type_Material) {
640 t = time < m_availableUntil ? time : m_availableUntil;
648 if (!m_availableUntil.isValid()) {
649 kdWarning()<<k_funcinfo<<m_name<<
": availabelUntil is invalid"<<endl;
652 t = m_availableUntil < time ? m_availableUntil : time;
656 if (checkAppointments) {
663Resource *Resource::findId(
const TQString &
id)
const {
664 return m_project ? m_project->findResource(
id) : 0;
667bool Resource::removeId(
const TQString &
id) {
671void Resource::insertId(
const TQString &
id) {
673 m_project->insertResourceId(
id,
this);
676Calendar *Resource::findCalendar(
const TQString &
id)
const {
677 return (m_project ? m_project->findCalendar(
id) : 0);
680bool Resource::isOverbooked()
const {
681 return isOverbooked(DateTime(), DateTime());
684bool Resource::isOverbooked(
const TQDate &date)
const {
685 return isOverbooked(DateTime(date), DateTime(date.addDays(1)));
688bool Resource::isOverbooked(
const DateTime &start,
const DateTime &end)
const {
690 return m_currentSchedule ? m_currentSchedule->isOverbooked(start, end) :
false;
693Appointment Resource::appointmentIntervals()
const {
695 if (m_currentSchedule == 0)
697 TQPtrListIterator<Appointment> it = m_currentSchedule->appointments();
698 for (; it.current(); ++it) {
699 a += *(it.current());
704Duration Resource::plannedEffort(
const TQDate &date)
const {
718ResourceRequest::ResourceRequest(
Resource *resource,
int units)
719 : m_resource(resource),
725ResourceRequest::~ResourceRequest() {
728 m_resource->unregisterRequest(
this);
732bool ResourceRequest::load(TQDomElement &element,
Project &project) {
734 m_resource = project.resource(element.attribute(
"resource-id"));
735 if (m_resource == 0) {
736 kdWarning()<<k_funcinfo<<
"The referenced resource does not exist: resource id="<<element.attribute(
"resource-id")<<endl;
739 m_units = element.attribute(
"units").toInt();
743void ResourceRequest::save(TQDomElement &element)
const {
744 TQDomElement me = element.ownerDocument().createElement(
"resource-request");
745 element.appendChild(me);
746 me.setAttribute(
"resource-id", m_resource->id());
747 me.setAttribute(
"units", m_units);
750int ResourceRequest::units()
const {
755int ResourceRequest::workUnits()
const {
756 if (m_resource->type() == Resource::Type_Work)
763Task *ResourceRequest::task()
const {
764 return m_parent ? m_parent->task() : 0;
768ResourceGroupRequest::ResourceGroupRequest(
ResourceGroup *group,
int units)
769 : m_group(group), m_units(units) {
773 group->registerRequest(
this);
774 m_resourceRequests.setAutoDelete(
true);
777ResourceGroupRequest::~ResourceGroupRequest() {
780 m_group->unregisterRequest(
this);
781 m_resourceRequests.clear();
784void ResourceGroupRequest::addResourceRequest(ResourceRequest *request) {
786 request->setParent(
this);
787 m_resourceRequests.append(request);
788 request->registerRequest();
791ResourceRequest *ResourceGroupRequest::takeResourceRequest(ResourceRequest *request) {
793 request->unregisterRequest();
794 return m_resourceRequests.take(m_resourceRequests.findRef(request));
797ResourceRequest *ResourceGroupRequest::find(
Resource *resource)
const {
798 TQPtrListIterator<ResourceRequest> it(m_resourceRequests);
799 for (; it.current(); ++it)
800 if (it.current()->resource() == resource)
806bool ResourceGroupRequest::load(TQDomElement &element,
Project &project) {
808 m_group = project.findResourceGroup(element.attribute(
"group-id"));
813 m_group->registerRequest(
this);
815 m_units = element.attribute(
"units").toInt();
817 TQDomNodeList list = element.childNodes();
818 for (
unsigned int i=0; i<list.count(); ++i) {
819 if (list.item(i).isElement()) {
820 TQDomElement e = list.item(i).toElement();
821 if (e.tagName() ==
"resource-request") {
822 ResourceRequest *r =
new ResourceRequest();
823 if (r->load(e, project))
824 addResourceRequest(r);
826 kdError()<<k_funcinfo<<
"Failed to load resource request"<<endl;
835void ResourceGroupRequest::save(TQDomElement &element)
const {
838 TQDomElement me = element.ownerDocument().createElement(
"resourcegroup-request");
839 element.appendChild(me);
840 me.setAttribute(
"group-id", m_group->id());
841 me.setAttribute(
"units", m_units);
842 TQPtrListIterator<ResourceRequest> it(m_resourceRequests);
843 for (; it.current(); ++it)
844 it.current()->save(me);
847int ResourceGroupRequest::units()
const {
849 TQPtrListIterator<ResourceRequest> it = m_resourceRequests;
850 for (; it.current(); ++it) {
851 units += it.current()->units();
857int ResourceGroupRequest::workUnits()
const {
859 if (m_group->type() == ResourceGroup::Type_Work)
861 TQPtrListIterator<ResourceRequest> it = m_resourceRequests;
862 for (; it.current(); ++it) {
863 units += it.current()->workUnits();
870Duration ResourceGroupRequest::effort(
const DateTime &time,
const Duration &duration,
bool backward,
bool *ok)
const {
874 TQPtrListIterator<ResourceRequest> it = m_resourceRequests;
875 for (; it.current(); ++it) {
876 e += it.current()->resource()->effort(time, duration, backward, &sts);
877 if (sts && ok) *ok = sts;
884int ResourceGroupRequest::numDays(
const DateTime &time,
bool backward)
const {
885 DateTime t1, t2 = time;
887 TQPtrListIterator<ResourceRequest> it = m_resourceRequests;
888 for (; it.current(); ++it) {
889 t1 = it.current()->resource()->availableFrom();
890 if (!t2.isValid() || t2 > t1)
894 return t2.daysTo(time);
896 TQPtrListIterator<ResourceRequest> it = m_resourceRequests;
897 for (; it.current(); ++it) {
898 t1 = it.current()->resource()->availableUntil();
899 if (!t2.isValid() || t2 < t1)
903 return time.daysTo(t2);
914 DateTime start = time;
915 int inc = backward ? -1 : 1;
916 DateTime end = start;
919 int nDays = numDays(time, backward) + 1;
920 for (
int i=0; !match && i <= nDays; ++i) {
922 end = TQDateTime(end.addDays(inc));
923 e1 = effort(start, d, backward, &sts);
925 if (e + e1 < _effort) {
928 }
else if (e + e1 == _effort) {
937 d = Duration(0, 1, 0);
938 for (
int i=0; !match && i < 24; ++i) {
940 end = TQDateTime(end.addSecs(inc*60*60));
941 e1 = effort(start, d, backward, &sts);
942 if (e + e1 < _effort) {
945 }
else if (e + e1 == _effort) {
955 d = Duration(0, 0, 1);
956 for (
int i=0; !match && i < 60; ++i) {
958 end = TQDateTime(end.addSecs(inc*60));
959 e1 = effort(start, d, backward, &sts);
960 if (e + e1 < _effort) {
963 }
else if (e + e1 == _effort) {
966 }
else if (e + e1 > _effort) {
973 d = Duration(0, 0, 0, 1);
974 for (
int i=0; !match && i < 60 && sts; ++i) {
976 end = TQDateTime(end.addSecs(inc));
977 e1 = effort(start, d, backward, &sts);
978 if (e + e1 < _effort) {
981 }
else if (e + e1 == _effort) {
984 }
else if (e + e1 > _effort) {
990 d = Duration(0, 0, 0, 0, 1);
991 for (
int i=0; !match && i < 1000; ++i) {
993 end.setTime(end.time().addMSecs(inc));
994 e1 = effort(start, d, backward, &sts);
995 if (e + e1 < _effort) {
998 }
else if (e + e1 == _effort) {
1001 }
else if (e + e1 > _effort) {
1007 kdError()<<k_funcinfo<<(task()?task()->name():
"No task")<<
" "<<time<<
": Could not match effort."<<
" Want: "<<_effort.toString(Duration::Format_Day)<<
" got: "<<e.toString(Duration::Format_Day)<<
" sts="<<sts<<endl;
1011 t = backward ? availableAfter(end) : availableBefore(end);
1013 end = t.isValid() ? t : time;
1015 return (end>time?end-time:time-end);
1020 TQPtrListIterator<ResourceRequest> it = m_resourceRequests;
1021 for (; it.current(); ++it) {
1022 DateTime t = it.current()->resource()->availableAfter(time);
1023 if (t.isValid() && (!start.isValid() || t < start))
1026 if (start.isValid() && start < time)
1034 TQPtrListIterator<ResourceRequest> it = m_resourceRequests;
1035 for (; it.current(); ++it) {
1036 DateTime t = it.current()->resource()->availableBefore(time);
1037 if (t.isValid() && (!end.isValid() || t > end))
1040 if (!end.isValid() || end > time)
1046void ResourceGroupRequest::makeAppointments(
Schedule *schedule) {
1048 TQPtrListIterator<ResourceRequest> it = m_resourceRequests;
1049 for (; it.current(); ++it) {
1050 it.current()->makeAppointment(schedule);
1054void ResourceGroupRequest::reserve(
const DateTime &start,
const Duration &duration) {
1056 m_duration = duration;
1059bool ResourceGroupRequest::isEmpty()
const {
1060 return m_resourceRequests.isEmpty() && m_units == 0;
1063Task *ResourceGroupRequest::task()
const {
1064 return m_parent ? &(m_parent->task()) : 0;
1068ResourceRequestCollection::ResourceRequestCollection(
Task &task)
1070 m_requests.setAutoDelete(
true);
1073ResourceRequestCollection::~ResourceRequestCollection() {
1078ResourceGroupRequest *ResourceRequestCollection::find(
ResourceGroup *group)
const {
1079 TQPtrListIterator<ResourceGroupRequest> it(m_requests);
1080 for (; it.current(); ++it) {
1081 if (it.current()->group() == group)
1082 return it.current();
1088ResourceRequest *ResourceRequestCollection::find(
Resource *resource)
const {
1089 ResourceRequest *req = 0;
1090 TQPtrListIterator<ResourceGroupRequest> it(m_requests);
1091 for (; !req && it.current(); ++it) {
1092 req = it.current()->find(resource);
1102void ResourceRequestCollection::save(TQDomElement &element)
const {
1104 TQPtrListIterator<ResourceGroupRequest> it(m_requests);
1105 for ( ; it.current(); ++it ) {
1106 it.current()->save(element);
1110int ResourceRequestCollection::units()
const {
1113 TQPtrListIterator<ResourceGroupRequest> it = m_requests;
1114 for (; it.current(); ++it) {
1115 units += it.current()->units();
1121int ResourceRequestCollection::workUnits()
const {
1124 TQPtrListIterator<ResourceGroupRequest> it(m_requests);
1125 for (; it.current(); ++it) {
1126 units += it.current()->workUnits();
1142 int units = workUnits();
1145 TQPtrListIterator<ResourceGroupRequest> it(m_requests);
1146 for (; it.current(); ++it) {
1147 if (it.current()->isEmpty())
1149 if (it.current()->group()->type() == ResourceGroup::Type_Work) {
1150 Duration d = it.current()->duration(time, (effort*it.current()->workUnits())/units, backward);
1153 }
else if (it.current()->group()->type() == ResourceGroup::Type_Material) {
1164 TQPtrListIterator<ResourceGroupRequest> it = m_requests;
1165 for (; it.current(); ++it) {
1166 DateTime t = it.current()->availableAfter(time);
1167 if (t.isValid() && (!start.isValid() || t < start))
1170 if (start.isValid() && start < time)
1178 TQPtrListIterator<ResourceGroupRequest> it = m_requests;
1179 for (; it.current(); ++it) {
1180 DateTime t = it.current()->availableBefore(time);
1181 if (t.isValid() && (!end.isValid() ||t > end))
1184 if (!end.isValid() || end > time)
1190void ResourceRequestCollection::makeAppointments(
Schedule *schedule) {
1192 TQPtrListIterator<ResourceGroupRequest> it(m_requests);
1193 for (; it.current(); ++it) {
1194 it.current()->makeAppointments(schedule);
1198void ResourceRequestCollection::reserve(
const DateTime &start,
const Duration &duration) {
1200 TQPtrListIterator<ResourceGroupRequest> it(m_requests);
1201 for (; it.current(); ++it) {
1202 it.current()->reserve(start, duration);
1206bool ResourceRequestCollection::isEmpty()
const {
1207 TQPtrListIterator<ResourceGroupRequest> it(m_requests);
1208 for (; it.current(); ++it) {
1209 if (!it.current()->isEmpty())
1216void ResourceGroup::printDebug(TQString indent)
1218 kdDebug()<<indent<<
" + Resource group: "<<m_name<<
" id="<<m_id<<endl;
1220 TQPtrListIterator<Resource> it(m_resources);
1221 for ( ; it.current(); ++it)
1222 it.current()->printDebug(indent);
1224void Resource::printDebug(TQString indent)
1226 kdDebug()<<indent<<
" + Resource: "<<m_name<<
" id="<<m_id<<endl;
1227 TQIntDictIterator<Schedule> it(m_schedules);
1229 for (; it.current(); ++it) {
1230 it.current()->printDebug(indent);
1235void ResourceGroupRequest::printDebug(TQString indent)
1237 kdDebug()<<indent<<
" + Request to group: "<<(m_group ? m_group->name() :
"None")<<
" units="<<m_units<<
"%"<<endl;
1239 TQPtrListIterator<ResourceRequest> it(m_resourceRequests);
1240 for (; it.current(); ++it) {
1241 it.current()->printDebug(indent);
1245void ResourceRequest::printDebug(TQString indent)
1247 kdDebug()<<indent<<
" + Request to resource: "<<(m_resource ? m_resource->name() :
"None")<<
" units="<<m_units<<
"%"<<endl;
1250void ResourceRequestCollection::printDebug(TQString indent)
1252 kdDebug()<<indent<<
" + Resource requests:"<<endl;
1253 TQPtrListIterator<ResourceGroupRequest> it = m_requests;
1254 for (; it.current(); ++it) {
1255 it.current()->printDebug(indent+
" ");
A resource (Resource) can be scheduled to be used at any time, this is represented internally with Ap...
Calendar defines the working and nonworking days and hours.
DateTime firstAvailableAfter(const DateTime &time, const DateTime &limit)
Find the first available time after time before limit.
DateTime firstAvailableBefore(const DateTime &time, const DateTime &limit)
Find the first available time backwards from time.
DateTime is a TQDateTime which knows about Duration.
The duration class can be used to store a timespan in a convenient format.
static const Duration zeroDuration
This is useful for occasions where we need a zero duration.
This class represents any node in the project, a node can be a project or a subproject or any task.
Project is the main node in a project, it contains child nodes and possibly sub-projects.
bool removeResourceId(const TQString &id)
Remove the resource with identity id from the register.
This class represents a group of similar resources to be assigned to a task e.g.
void addRequiredResource(ResourceGroup *)
Manage the dependent resources.
ResourceGroup * getRequiredResource(int)
Manage the dependent resources.
void removeRequiredResource(int)
Manage the dependent resources.
void addResource(Resource *, Risk *)
Manage the resources in this list.
ResourceSchedule holds scheduling information for a resource.
Any resource that is used by a task.
void takeSchedule(const Schedule *schedule)
Take, don't delete.
TQPtrList< Appointment > appointments()
Return the list of appointments for current schedule.
Calendar * calendar(bool local=false) const
Get the calendar for this resource.
void removeSchedule(Schedule *schedule)
Take, and delete.
DateTime availableBefore(const DateTime &time, const DateTime limit=DateTime(), bool checkAppointments=false) const
Find the first available time before time, within limit.
DateTime availableAfter(const DateTime &time, const DateTime limit=DateTime(), bool checkAppointments=false) const
Find the first available time after time, within limit.
virtual bool addAppointment(Appointment *appointment)
Adds appointment to current schedule.
Risk is associated with a resource/task pairing to indicate the planner's confidence in the estimated...
The Schedule class holds data calculated during project calculation and scheduling,...
virtual bool add(Appointment *appointment)
Adds appointment to this schedule only.
virtual void addAppointment(Schedule *, DateTime &, DateTime &, double=100)
Adds appointment to both this resource schedule and node schedule.
A task in the scheduling software is represented by this class.