<& /Elements/Header, Title => loc("Time Search") &> <& /Elements/Tabs &> <& /Elements/ListActions, actions => \@results &> <%INIT> my @results; my $user = $session{CurrentUser}; my $start_date = RT::Date->new( $user ); if ( $StartDate ) { $start_date->Set( Value => $StartDate, Format => 'unknown' ); } else { $start_date->SetToNow; my ( $ret, $week_start_date ) = RT::Extension::TimeTracking::WeekStartDate( $user, $start_date, RT->Config->Get( 'TimeTrackingFirstDayOfWeek' ) ); $start_date = $week_start_date if $ret; } $start_date->SetToMidnight( Timezone => 'user' ); my $end_date = RT::Date->new( $user ); if ( $EndDate ) { $end_date->Set( Value => $EndDate, Format => 'unknown' ); } else { $end_date->SetToNow; } $end_date->SetToMidnight( Timezone => 'user' ); my $exclusive_end_date = RT::Date->new( $user ); $exclusive_end_date->Set( Value => $end_date->Unix, Format => 'Unix' ); $exclusive_end_date->AddDays( 1 ); my %ticket_worked; my $total_time_worked = 0; # Do we need to load a CF for display? my $display_cf; if ( $display_cf = RT->Config->Get( 'TimeTrackingDisplayCF' ) ) { my $confirm_cf = RT::CustomField->new( RT->SystemUser ); my ( $ret, $msg ) = $confirm_cf->Load( $display_cf ); if ( not $ret ) { RT::Logger->error( "Unable to load custom field $display_cf " . "defined via config option TimeTrackingDisplayCF: $msg" ); undef $display_cf; } } if ( $ARGS{DoSearch} ) { my $tickets = RT::Tickets->new( $user ); if ( $Query ) { my ( $ret, $msg ) = $tickets->FromSQL( $Query ); push @results, $msg unless $ret; } else { push @results, loc( 'No query' ); } MaybeRedirectForResults( Actions => \@results, Arguments => { StartDate => $StartDate, EndDate => $EndDate, Query => $Query }, ); my @tickets = map { $_, $IncludeChildren ? ( RT::Extension::TimeTracking->AllChildren( $_ ) ) : () } @{ $tickets->ItemsArrayRef }; my @ticket_ids = List::MoreUtils::uniq( map { $_->id } @tickets ); my $txns = RT::Transactions->new( $user ); $txns->Limit( FIELD => 'ObjectType', VALUE => 'RT::Ticket', ); $txns->Limit( FIELD => 'ObjectID', VALUE => \@ticket_ids, OPERATOR => 'IN', ); $txns->Limit( FIELD => 'TimeTaken', VALUE => 0, OPERATOR => '!=', ); $txns->Limit( FIELD => 'Created', VALUE => $start_date->ISO(), OPERATOR => '>=', ); $txns->Limit( FIELD => 'Created', VALUE => $exclusive_end_date->ISO(), OPERATOR => '<', ENTRYAGGREGATOR => 'AND', ); while ( my $txn = $txns->Next ) { my $ticket = $txn->Object; next if $txn->FirstCustomFieldValue( 'Worked Date' ); # we handle this in the next part $ticket_worked{ $ticket->id } ||= { ticket => $ticket, }; $ticket_worked{ $ticket->id }{time_worked} += $txn->TimeTaken; $total_time_worked += $txn->TimeTaken; } $txns = RT::Transactions->new( $user ); $txns->Limit( FIELD => 'ObjectType', VALUE => 'RT::Ticket', ); $txns->Limit( FIELD => 'ObjectID', VALUE => \@ticket_ids, OPERATOR => 'IN', ); $txns->Limit( FIELD => 'TimeTaken', VALUE => 0, OPERATOR => '!=', ); my $cf = RT::CustomField->new( $user ); $cf->Load( 'Worked Date' ); my $cf_alias = $txns->Join( ALIAS1 => 'main', FIELD1 => 'id', TABLE2 => 'ObjectCustomFieldValues', FIELD2 => 'ObjectId' ); $txns->Limit( ALIAS => $cf_alias, FIELD => 'CustomField', VALUE => $cf->id ); $txns->Limit( ALIAS => $cf_alias, FIELD => 'ObjectType', VALUE => 'RT::Transaction' ); $txns->Limit( ALIAS => $cf_alias, FIELD => 'Content', VALUE => $start_date->ISO( Time => 0, Timezone => 'user' ), OPERATOR => '>=' ); $txns->Limit( ALIAS => $cf_alias, FIELD => 'Content', VALUE => $exclusive_end_date->ISO( Time => 0, Timezone => 'user' ), OPERATOR => '<', ENTRYAGGREGATOR => 'AND', ); while ( my $txn = $txns->Next ) { my $ticket = $txn->Object; $ticket_worked{ $ticket->id } ||= { ticket => $ticket, }; $ticket_worked{ $ticket->id }{time_worked} += $txn->TimeTaken; $total_time_worked += $txn->TimeTaken; } } <%ARGS> $Query => undef $StartDate => undef $EndDate => undef $IncludeChildren => 1