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);
108Resource *ResourceGroup::takeResource(Resource *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) {
188void ResourceGroup::insertId(
const TQString &
id) {
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 ) {
342DateTime Resource::getBestAvailableTime(
const DateTime ,
const 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)
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);
469ResourceSchedule *Resource::createSchedule(Schedule *parent) {
470 ResourceSchedule *sch =
new ResourceSchedule(parent,
this);
475void Resource::makeAppointment(Schedule *node,
const DateTime &from,
const DateTime &end) {
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);
562Duration Resource::effort(
const DateTime &start,
const Duration &duration,
bool backward,
bool *ok)
const {
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) {
676Calendar *Resource::findCalendar(
const TQString &
id)
const {
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 {
709Risk::Risk(Node *n, Resource *r, RiskType rt) {
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);
906Duration ResourceGroupRequest::duration(
const DateTime &time,
const Duration &_effort,
bool backward) {
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);
1018DateTime ResourceGroupRequest::availableAfter(
const DateTime &time) {
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)
1032DateTime ResourceGroupRequest::availableBefore(
const DateTime &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();
1136Duration ResourceRequestCollection::duration(
const DateTime &time,
const Duration &effort,
bool backward) {
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) {
1162DateTime ResourceRequestCollection::availableAfter(
const DateTime &time) {
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)
1176DateTime ResourceRequestCollection::availableBefore(
const DateTime &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.
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.
bool removeResourceGroupId(const TQString &id)
Remove the resourcegroup with identity id from the register.
void insertResourceId(const TQString &id, const Resource *resource)
Insert the resource with identity id.
virtual Calendar * findCalendar(const TQString &id) const
Find the calendar with identity id.
void insertResourceGroupId(const TQString &id, const ResourceGroup *group)
Insert the resourcegroup with identity id.
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.
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 Duration plannedEffort() const
Returns the total planned effort for this task (or subtasks)
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.
TQPtrList< Appointment > & appointments()
Return the list of appointments.