static void createRequest( Task *t, Resource *r ) { ResourceGroupRequest *gr = t->requests().find( r->parentGroup() ); if ( gr == 0 ) { gr = new ResourceGroupRequest( r->parentGroup() ); } t->addRequest( gr ); ResourceRequest *rr = new ResourceRequest( r, 100 ); gr->addResourceRequest( rr ); }
void ProjectTester::team() { Project project; project.setName( "P1" ); project.setId( project.uniqueNodeId() ); project.registerNodeId( &project ); DateTime targetstart = DateTime( QDate( 2010, 5, 1 ), QTime(0,0,0) ); DateTime targetend = DateTime( targetstart.addDays( 7 ) ); project.setConstraintStartTime( targetstart ); project.setConstraintEndTime( targetend); Calendar *c = new Calendar("Test"); QTime t1(8,0,0); int length = 8*60*60*1000; // 8 hours for ( int i = 1; i <= 7; ++i ) { CalendarDay *wd1 = c->weekday(i); wd1->setState(CalendarDay::Working); wd1->addInterval(TimeInterval(t1, length)); } project.addCalendar( c ); Task *task1 = project.createTask(); task1->setName( "T1" ); project.addTask( task1, &project ); task1->estimate()->setUnit( Duration::Unit_d ); task1->estimate()->setExpectedEstimate( 2.0 ); task1->estimate()->setType( Estimate::Type_Effort ); QString s = "One team with one resource --------"; qDebug()<<endl<<"Testing:"<<s; ResourceGroup *g = new ResourceGroup(); project.addResourceGroup( g ); Resource *r1 = new Resource(); r1->setName( "R1" ); r1->setCalendar( c ); project.addResource( g, r1 ); Resource *r2 = new Resource(); r2->setName( "Team member" ); r2->setCalendar( c ); project.addResource( g, r2 ); Resource *team = new Resource(); team->setType( Resource::Type_Team ); team->setName( "Team" ); team->addTeamMemberId( r2->id() ); project.addResource( g, team ); ResourceGroupRequest *gr = new ResourceGroupRequest( g ); task1->addRequest( gr ); ResourceRequest *tr = new ResourceRequest( team, 100 ); gr->addResourceRequest( tr ); ScheduleManager *sm = project.createScheduleManager( "Team" ); project.addScheduleManager( sm ); sm->createSchedules(); { KPlatoRCPSPlugin rcps( 0, QVariantList() ); rcps.calculate( project, sm, true/*nothread*/ ); } // Debug::print( r1, s); // Debug::print( r2, s); Debug::print( team, s, false); Debug::print( &project, task1, s); // Debug::printSchedulingLog( *sm, s ); DateTime expectedEndTime = targetstart + Duration( 1, 16, 0 ); QCOMPARE( task1->endTime(), expectedEndTime ); s = "One team with one resource + one resource --------"; qDebug()<<endl<<"Testing:"<<s; ResourceRequest *rr1 = new ResourceRequest( r1, 100 ); gr->addResourceRequest( rr1 ); sm = project.createScheduleManager( "Team + Resource" ); project.addScheduleManager( sm ); sm->createSchedules(); { KPlatoRCPSPlugin rcps( 0, QVariantList() ); rcps.calculate( project, sm, true/*nothread*/ ); } // Debug::print( r1, s); // Debug::print( r2, s); Debug::print( team, s, false); Debug::print( &project, task1, s); // Debug::printSchedulingLog( *sm, s ); expectedEndTime = targetstart + Duration( 0, 16, 0 ); QCOMPARE( task1->endTime(), expectedEndTime ); s = "One team with one resource + one resource, resource available too late --------"; qDebug()<<endl<<"Testing:"<<s; r1->setAvailableFrom( targetend ); r1->setAvailableUntil( targetend.addDays( 7 ) ); sm = project.createScheduleManager( "Team + Resource not available" ); project.addScheduleManager( sm ); sm->createSchedules(); { KPlatoRCPSPlugin rcps( 0, QVariantList() ); rcps.calculate( project, sm, true/*nothread*/ ); } Debug::print( r1, s); // Debug::print( r2, s); Debug::print( team, s, false); Debug::print( &project, task1, s); Debug::printSchedulingLog( *sm, s ); expectedEndTime = targetstart + Duration( 1, 16, 0 ); QCOMPARE( task1->endTime(), expectedEndTime ); s = "One team with two resources --------"; qDebug()<<endl<<"Testing:"<<s; r1->removeRequests(); team->addTeamMemberId( r1->id() ); r1->setAvailableFrom( targetstart ); r1->setAvailableUntil( targetend ); sm = project.createScheduleManager( "Team with 2 resources" ); project.addScheduleManager( sm ); sm->createSchedules(); { KPlatoRCPSPlugin rcps( 0, QVariantList() ); rcps.calculate( project, sm, true/*nothread*/ ); } // Debug::print( r1, s); // Debug::print( r2, s); Debug::print( team, s, false); Debug::print( &project, task1, s); Debug::printSchedulingLog( *sm, s ); expectedEndTime = targetstart + Duration( 0, 16, 0 ); QCOMPARE( task1->endTime(), expectedEndTime ); s = "One team with two resources, one resource unavailable --------"; qDebug()<<endl<<"Testing:"<<s; r1->setAvailableFrom( targetend ); r1->setAvailableUntil( targetend.addDays( 2 ) ); sm = project.createScheduleManager( "Team, one unavailable resource" ); project.addScheduleManager( sm ); sm->createSchedules(); { KPlatoRCPSPlugin rcps( 0, QVariantList() ); rcps.calculate( project, sm, true/*nothread*/ ); } Debug::print( r1, s); // Debug::print( r2, s); Debug::print( team, s, false); Debug::print( &project, task1, s); Debug::printSchedulingLog( *sm, s ); expectedEndTime = targetstart + Duration( 1, 16, 0 ); QCOMPARE( task1->endTime(), expectedEndTime ); }
void ResourceModelTester::initTestCase() { m_project = new Project(); m_project->setName( "P1" ); m_project->setId( m_project->uniqueNodeId() ); m_project->registerNodeId( m_project ); DateTime targetstart = DateTime( QDate::currentDate(), QTime(0,0,0) ); DateTime targetend = DateTime( targetstart.addDays( 3 ) ); m_project->setConstraintStartTime( targetstart ); m_project->setConstraintEndTime( targetend); // standard worktime defines 8 hour day as default QVERIFY( m_project->standardWorktime() ); QCOMPARE( m_project->standardWorktime()->day(), 8.0 ); m_calendar = new Calendar( "Test" ); m_calendar->setDefault( true ); QTime t1( 9, 0, 0 ); QTime t2 ( 17, 0, 0 ); int length = t1.msecsTo( t2 ); for ( int i=1; i <= 7; ++i ) { CalendarDay *d = m_calendar->weekday( i ); d->setState( CalendarDay::Working ); d->addInterval( t1, length ); } m_project->addCalendar( m_calendar ); ResourceGroup *g = new ResourceGroup(); g->setName( "G1" ); m_project->addResourceGroup( g ); m_resource = new Resource(); m_resource->setName( "R1" ); m_resource->setCalendar( m_calendar ); m_project->addResource( g, m_resource ); m_task = m_project->createTask(); m_task->setName( "T1" ); m_project->addTask( m_task, m_project ); m_task->estimate()->setUnit( Duration::Unit_h ); m_task->estimate()->setExpectedEstimate( 8.0 ); m_task->estimate()->setType( Estimate::Type_Effort ); ResourceGroupRequest *gr = new ResourceGroupRequest( g ); gr->addResourceRequest( new ResourceRequest( m_resource, 100 ) ); m_task->addRequest( gr ); m_model.setProject( m_project ); QModelIndex idx; int rows = m_model.rowCount( idx ); QCOMPARE( rows, 1 ); idx = m_model.index( 0, 0, idx ); QCOMPARE( g->name(), m_model.data( idx ).toString() ); rows = m_model.rowCount( idx ); QCOMPARE( rows, 1 ); idx = m_model.index( 0, 0, idx ); QCOMPARE( m_resource->name(), m_model.data( idx ).toString() ); idx = m_model.parent( idx ); QCOMPARE( g->name(), m_model.data( idx ).toString() ); }
void ProjectTester::oneTask() { QDate today = QDate::fromString( "2012-02-01", Qt::ISODate ); QDate tomorrow = today.addDays( 1 ); QDate yesterday = today.addDays( -1 ); QTime t1( 9, 0, 0 ); QTime t2 ( 17, 0, 0 ); int length = t1.msecsTo( t2 ); Task *t = m_project->createTask(); t->setName( "T1" ); m_project->addTask( t, m_project ); t->estimate()->setUnit( Duration::Unit_d ); t->estimate()->setExpectedEstimate( 1.0 ); t->estimate()->setType( Estimate::Type_Duration ); ScheduleManager *sm = m_project->createScheduleManager( "Test Plan" ); m_project->addScheduleManager( sm ); QString s = "Calculate forward, Task: Fixed duration ------------------------------"; qDebug()<<s; { KPlatoRCPSPlugin rcps( 0, QVariantList() ); rcps.calculate( *m_project, sm, true/*nothread*/ ); } Debug::printSchedulingLog( *sm, s ); Debug::print( m_project, s ); Debug::print( t, s ); QCOMPARE( t->startTime(), m_project->startTime() ); QCOMPARE( t->endTime(), DateTime(t->startTime().addDays( 1 )) ); s = "Calculate forward, Task: Length --------------------------------------"; qDebug()<<s; t->estimate()->setCalendar( m_calendar ); { KPlatoRCPSPlugin rcps( 0, QVariantList() ); rcps.calculate( *m_project, sm, true/*nothread*/ ); } Debug::print( m_calendar, s ); Debug::print( m_project, s, true ); QCOMPARE( t->startTime(), m_calendar->firstAvailableAfter( m_project->startTime(), m_project->endTime() ) ); QCOMPARE( t->endTime(), DateTime( t->startTime().addMSecs( length ) ) ); s = "Calculate forward, Task: Effort --------------------------------------"; qDebug()<<s; ResourceGroup *g = new ResourceGroup(); m_project->addResourceGroup( g ); Resource *r = new Resource(); r->setAvailableFrom( QDateTime( yesterday, QTime(), Qt::LocalTime ) ); r->setCalendar( m_calendar ); m_project->addResource( g, r ); ResourceGroupRequest *gr = new ResourceGroupRequest( g ); t->addRequest( gr ); ResourceRequest *rr = new ResourceRequest( r, 100 ); gr->addResourceRequest( rr ); t->estimate()->setType( Estimate::Type_Effort ); { KPlatoRCPSPlugin rcps( 0, QVariantList() ); rcps.calculate( *m_project, sm, true/*nothread*/ ); } Debug::print( t, s ); QCOMPARE( t->startTime(), m_calendar->firstAvailableAfter( m_project->startTime(), m_project->endTime() ) ); QCOMPARE( t->endTime(), DateTime( t->startTime().addMSecs( length ) ) ); s = "Calculate forward, Task: MustStartOn --------------------------------------"; qDebug()<<s; t->setConstraint( Node::MustStartOn ); t->setConstraintStartTime( DateTime( tomorrow, t1 ) ); { KPlatoRCPSPlugin rcps( 0, QVariantList() ); rcps.calculate( *m_project, sm, true/*nothread*/ ); } Debug::print( t, s ); QCOMPARE( t->startTime(), t->constraintStartTime() ); QCOMPARE( t->endTime(), t->startTime() + Duration( 0, 8, 0 ) ); s = "Calculate backward, Task: MustStartOn --------------------------------------"; qDebug()<<s; sm->setSchedulingDirection( true ); { KPlatoRCPSPlugin rcps( 0, QVariantList() ); rcps.calculate( *m_project, sm, true/*nothread*/ ); } Debug::print( t, s ); Debug::printSchedulingLog( *sm, s ); QCOMPARE( t->startTime(), t->constraintStartTime() ); QCOMPARE( t->endTime(), t->startTime() + Duration( 0, 8, 0 ) ); s = "Calculate backward, Task: StartNotEarlier --------------------------------------"; qDebug()<<s; t->setConstraint( Node::StartNotEarlier ); { KPlatoRCPSPlugin rcps( 0, QVariantList() ); rcps.calculate( *m_project, sm, true/*nothread*/ ); } Debug::print( t, s ); QCOMPARE( t->startTime(), t->constraintStartTime() ); QCOMPARE( t->endTime(), t->startTime() + Duration( 0, 8, 0 ) ); s = "Calculate forward, Task: StartNotEarlier --------------------------------------"; qDebug()<<s; sm->setSchedulingDirection( false ); { KPlatoRCPSPlugin rcps( 0, QVariantList() ); rcps.calculate( *m_project, sm, true/*nothread*/ ); } Debug::print( t, s ); QCOMPARE( t->startTime(), t->constraintStartTime() ); QCOMPARE( t->endTime(), t->startTime() + Duration( 0, 8, 0 ) ); s = "Calculate forward, Task: MustFinishOn --------------------------------------"; qDebug()<<s; t->setConstraint( Node::MustFinishOn ); t->setConstraintEndTime( DateTime( tomorrow, t2 ) ); { KPlatoRCPSPlugin rcps( 0, QVariantList() ); rcps.calculate( *m_project, sm, true/*nothread*/ ); } Debug::print( t, s ); QCOMPARE( t->endTime(), t->constraintEndTime() ); QCOMPARE( t->endTime(), t->startTime() + Duration( 0, 8, 0 ) ); s = "Calculate backward, Task: MustFinishOn --------------------------------------"; qDebug()<<s; sm->setSchedulingDirection( true ); { KPlatoRCPSPlugin rcps( 0, QVariantList() ); rcps.calculate( *m_project, sm, true/*nothread*/ ); } Debug::print( t, s ); QCOMPARE( t->endTime(), t->constraintEndTime() ); QCOMPARE( t->endTime(), t->startTime() + Duration( 0, 8, 0 ) ); s = "Calculate backward, Task: FinishNotLater --------------------------------------"; qDebug()<<s; t->setConstraint( Node::FinishNotLater ); { KPlatoRCPSPlugin rcps( 0, QVariantList() ); rcps.calculate( *m_project, sm, true/*nothread*/ ); } Debug::print( t, s ); QCOMPARE( t->endTime(), t->constraintEndTime() ); QCOMPARE( t->endTime(), t->startTime() + Duration( 0, 8, 0 ) ); s = "Calculate forward, Task: FinishNotLater --------------------------------------"; qDebug()<<s; sm->setSchedulingDirection( false ); { KPlatoRCPSPlugin rcps( 0, QVariantList() ); rcps.calculate( *m_project, sm, true/*nothread*/ ); } Debug::print( m_project, s, true ); QVERIFY( t->endTime() <= t->constraintEndTime() ); QCOMPARE( t->endTime(), t->startTime() + Duration( 0, 8, 0 ) ); s = "Calculate forward, Task: FixedInterval --------------------------------------"; qDebug()<<s; t->setConstraint( Node ::FixedInterval ); { KPlatoRCPSPlugin rcps( 0, QVariantList() ); rcps.calculate( *m_project, sm, true/*nothread*/ ); } Debug::print( t, s ); QCOMPARE( t->startTime(), t->constraintStartTime() ); QCOMPARE( t->endTime(), t->constraintEndTime() ); s = "Calculate backward, Task: FixedInterval --------------------------------------"; qDebug()<<s; sm->setSchedulingDirection( true ); { KPlatoRCPSPlugin rcps( 0, QVariantList() ); rcps.calculate( *m_project, sm, true/*nothread*/ ); } Debug::print( t, s ); QCOMPARE( t->startTime(), t->constraintStartTime() ); QCOMPARE( t->endTime(), t->constraintEndTime() ); }
MacroCommand *RequestResourcesPanel::buildCommand() { Task *t = m_view->task(); if ( t == 0 ) { return 0; } MacroCommand *cmd = new MacroCommand( i18nc( "(qtundo-format)", "Modify resource allocations" ) ); /*Project *p = */m_view->project(); const QMap<const Resource*, ResourceRequest*> &rmap = m_view->resourceCache(); // First remove all that should be removed for( QMap<const Resource*, ResourceRequest*>::const_iterator rit = rmap.constBegin(); rit != rmap.constEnd(); ++rit ) { if ( rit.value()->units() == 0 ) { ResourceRequest *rr = t->requests().find( rit.key() ); if ( rr ) { cmd->addCommand( new RemoveResourceRequestCmd( rr->parent(), rr ) ); } } } QMap<const ResourceGroup*, ResourceGroupRequest*> groups; // Add/modify const QMap<const ResourceGroup*, ResourceGroupRequest*> &gmap = m_view->groupCache(); for( QMap<const ResourceGroup*, ResourceGroupRequest*>::const_iterator git = gmap.constBegin(); git != gmap.constEnd(); ++git ) { ResourceGroupRequest *gr = t->requests().find( git.key() ); if ( gr == 0 ) { if ( git.value()->units() > 0 ) { gr = new ResourceGroupRequest( const_cast<ResourceGroup*>( git.key() ), git.value()->units() ); cmd->addCommand( new AddResourceGroupRequestCmd( *t, gr ) ); groups[ git.key() ] = gr; } // else nothing } else { cmd->addCommand( new ModifyResourceGroupRequestUnitsCmd( gr, gr->units(), git.value()->units() ) ); } } for( QMap<const Resource*, ResourceRequest*>::const_iterator rit = rmap.constBegin(); rit != rmap.constEnd(); ++rit ) { Resource *resource = const_cast<Resource*>( rit.key() ); ResourceGroup *group = resource->parentGroup(); if ( rit.value()->units() > 0 ) { ResourceRequest *rr = t->requests().find( resource ); if ( rr == 0 ) { ResourceGroupRequest *gr = t->requests().find( group ); if ( gr == 0 ) { if ( groups.contains( group ) ) { gr = groups[ group ]; } else { gr = new ResourceGroupRequest( group, 0 ); groups[ group ] = gr; cmd->addCommand( new AddResourceGroupRequestCmd( *t, gr ) ); } } ResourceRequest *rr = new ResourceRequest( resource, rit.value()->units() ); rr->setRequiredResources( rit.value()->requiredResources() ); cmd->addCommand( new AddResourceRequestCmd( gr, rr ) ); } else { if ( rit.value()->units() != rr->units() ) { cmd->addCommand( new ModifyResourceRequestUnitsCmd( rr, rr->units(), rit.value()->units() ) ); } if ( rit.value()->requiredResources() != rr->requiredResources() ) { cmd->addCommand( new ModifyResourceRequestRequiredCmd( rr, rit.value()->requiredResources() ) ); } } } } if ( cmd->isEmpty() ) { delete cmd; return 0; } return cmd; }