<& /Elements/Header, Title => $user && $user->id != $session{CurrentUser}->id ? loc("[_1]'s Week", $user->Name) : loc("My Week") &> <& /Elements/Tabs &> <& /Elements/ListActions, actions => \@results &>
% if ( $DefaultTimeUnits ) { % } % if ( $session{CurrentUser}->HasRight( Object => $RT::System, Right => 'AdminTimesheets' )) {
% }
<&|/l&>Go to user:
<&|/l&>Week of (pick any day in week): <& /Elements/SelectDate, ShowTime => 0, Name => 'Date', Default => $date->Date(Format=>'ISO', Timezone => 'user') &>
% for my $day ( sort keys %week_worked ) {

<% $week_worked{$day}{date}->RFC2822(Time => 0, Timezone => 'user') %>

% if ( %{$week_worked{$day}{tickets}} ) {
% if ( $user->id != $session{CurrentUser}->id ) { % } % if ( $display_cf ){ % } % my $i = 1; % for my $ticket_id ( sort { $a <=> $b } keys %{$week_worked{$day}{tickets}} ) { % my $entry = $week_worked{$day}{tickets}{$ticket_id}; % my $ticket = $entry->{ticket}; % if ( $display_cf ){ % } % } # end for my $day
<&|/l&>id <&|/l&>Subject <&|/l&>Queue <&|/l&>Status <&|/l&>Owner<% $display_cf %><&|/l&>Time Worked <&|/l&>Update
<% $ticket->id %> <% $ticket->Subject %> <% $ticket->QueueObj->Name %> <% $ticket->Status %> <% $ticket->OwnerObj->Name %><% $ticket->FirstCustomFieldValue($display_cf) %><& /Ticket/Elements/ShowTime, minutes => $entry->{time_worked} &> <& /Elements/EditTimeValue, Name => 'Ticket-' . $ticket->id . "-UpdateTimeWorked", Default => '', InUnits => $DefaultTimeUnits || 'minutes', &>
<&|/l&><% $week_worked{$day}{week_name} %> Total: <& /Ticket/Elements/ShowTime, minutes => $week_worked{$day}{time_worked} &>
% }
% if ( $user->id != $session{CurrentUser}->id ) { % } <&|/l&>Add ticket: <&|/l&>Time Worked: <& /Elements/EditTimeValue, Name => "UpdateTimeWorked", Default => '', InUnits => $DefaultTimeUnits || 'minutes', &>
% }
<&|/l&>Total Time Worked: <& /Ticket/Elements/ShowTime, minutes => $total_time_worked &>
% $m->callback( CallbackName => 'End', User => $user, Date => $date, WeekWorked => \%week_worked );
<%INIT> my $user; my @results; if ( $User ) { if ( $session{CurrentUser}->HasRight( Object => $RT::System, Right => 'AdminTimesheets' ) ) { $user = RT::CurrentUser->new($session{CurrentUser}); $user->Load($User); unless ( $user->id ) { push @results, loc("Could not load user [_1]", $User); } } else { push @results, loc("Permission denied"); } } else { $user = $session{CurrentUser}; } MaybeRedirectForResults( Actions => \@results, Arguments => { Date => $Date, DefaultTimeUnits => $DefaultTimeUnits }, ); my $date_cf = RT::CustomField->new($user); $date_cf->LoadByName( Name => 'Worked Date', LookupType => 'RT::Queue-RT::Ticket-RT::Transaction'); my $actor_cf = RT::CustomField->new($user); $actor_cf->LoadByName( Name => 'Actor', LookupType => 'RT::Queue-RT::Ticket-RT::Transaction'); my %worked = ( $ARGS{id} && $ARGS{'UpdateTimeWorked'} ? ( $ARGS{id} => $ARGS{'UpdateTimeWorked'} ) : (), map { $ARGS{$_} && /^Ticket-(\d+)-UpdateTimeWorked$/ ? ( $1, $ARGS{$_} ) : () } keys %ARGS ); RT::Interface::Web::PreprocessTimeUpdates(\%ARGS); for my $id ( sort { $a <=> $b } keys %worked ) { my $ticket = RT::Ticket->new( $user ); $ticket->Load($id); if ( $ticket->id ) { my ( $val, $msg, $txn ) = $ticket->SetTimeWorked( $ticket->TimeWorked + $worked{$id} ); push( @results, "#$id: " . $msg ); $txn->UpdateCustomFields( %ARGS ) if $txn; } else { push @results, loc("Could not load ticket $ARGS{id}"); } } MaybeRedirectForResults( Actions => \@results, Arguments => { Date => $Date, DefaultTimeUnits => $DefaultTimeUnits, User => $User }, ); # 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; } } my $date = RT::Date->new($user); if ($Date) { $date->Set(Value => $Date, Format => 'unknown'); } else { $date->SetToNow; } $date->SetToMidnight( Timezone => 'user' ); my ($ret, $week_start, $first_day) = RT::Extension::TimeTracking::WeekStartDate( $user, $date, RT->Config->Get('TimeTrackingFirstDayOfWeek')); my $week_end = RT::Date->new($user); $week_end->Set( Value => $week_start->Unix ); $week_end->AddDays( 7 ); my %week_worked; my @week_names = @RT::Extension::TimeTracking::DAYS_OF_WEEK; my $day_offset = $RT::Extension::TimeTracking::WEEK_INDEX{$first_day}; if ( $day_offset ) { @week_names = @week_names[$day_offset .. $#week_names, 0 .. $day_offset -1 ]; } for my $offset ( 0 .. 6 ) { my $date = RT::Date->new($user); $date->Set( Value => $week_start->Unix ); $date->AddDays( $offset ) if $offset; my $user_hour = ($date->Localtime('user'))[2]; if ( $user_hour == 23 ) { $date->AddSeconds(3600); # to get around isuses raised by daylight saving } $week_worked{$date->ISO(Time => 0, Timezone => 'user')} = { date => $date, week_name => $week_names[$offset], tickets => {}, }; } my $txns = RT::Transactions->new($user); $txns->Limit( FIELD => 'ObjectType', VALUE => 'RT::Ticket', ); $txns->Limit( FIELD => 'Creator', VALUE => $user->id, ); $txns->Limit( FIELD => 'TimeTaken', VALUE => 0, OPERATOR => '!=', ); $txns->Limit( FIELD => 'Created', VALUE => $week_start->ISO(), OPERATOR => '>=', ); $txns->Limit( FIELD => 'Created', VALUE => $week_end->ISO(), OPERATOR => '<', ENTRYAGGREGATOR => 'AND', ); my $total_time_worked = 0; while ( my $txn = $txns->Next ) { my $ticket = $txn->Object; next if $txn->FirstCustomFieldValue('Worked Date'); # we handle this in the next part my $worked_date = $txn->CreatedObj->ISO( Time => 0, Timezone => 'user' ); next unless $week_worked{$worked_date}; $week_worked{$worked_date}{tickets}{$ticket->id} ||= { ticket => $ticket, }; $week_worked{$worked_date}{tickets}{$ticket->id}{time_worked} += $txn->TimeTaken; $week_worked{$worked_date}{time_worked} += $txn->TimeTaken; $total_time_worked += $txn->TimeTaken; } $txns = RT::Transactions->new($user); $txns->Limit( FIELD => 'ObjectType', VALUE => 'RT::Ticket', ); $txns->Limit( FIELD => 'Creator', VALUE => $user->id, ); $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 => $week_start->ISO(Time => 0), OPERATOR => '>=' ); $txns->Limit( ALIAS => $cf_alias, FIELD => 'Content', VALUE => $week_end->ISO(Time => 0), OPERATOR => '<', ENTRYAGGREGATOR => 'AND', ); while ( my $txn = $txns->Next ) { my $ticket = $txn->Object; my $worked_date = $txn->FirstCustomFieldValue('Worked Date'); next unless $week_worked{$worked_date}; $week_worked{$worked_date}{tickets}{$ticket->id} ||= { ticket => $ticket, }; $week_worked{$worked_date}{tickets}{$ticket->id}{time_worked} += $txn->TimeTaken; $week_worked{$worked_date}{time_worked} += $txn->TimeTaken; $total_time_worked += $txn->TimeTaken; } my $activity_txns = RT::Transactions->new($user); $activity_txns->Limit( FIELD => 'Creator', VALUE => $user->id ); $activity_txns->Limit( FIELD => 'ObjectType', VALUE => 'RT::Ticket' ); $activity_txns->Limit( FIELD => 'Created', OPERATOR => '>=', VALUE => $week_start->ISO ); $activity_txns->Limit( FIELD => 'Created', OPERATOR => '<', VALUE => $week_end->ISO, ENTRYAGGREGATOR => 'AND' ); $activity_txns->Limit( FIELD => 'Type', VALUE => 'Create' ); $activity_txns->Limit( FIELD => 'Type', VALUE => 'Correspond' ); $activity_txns->Limit( FIELD => 'Type', VALUE => 'Comment' ); my @ticket_ids; while ( my $txn = $activity_txns->Next ) { my $ticket = $txn->Object; my $worked_date = $txn->CreatedObj->ISO( Time => 0, Timezone => 'user' ); next unless $week_worked{$worked_date}; next if $week_worked{$worked_date}{tickets}{$ticket->id}; $week_worked{$worked_date}{tickets}{$ticket->id} = { ticket => $ticket, time_worked => 0, } } my $previous_week = RT::Date->new($user); $previous_week->Set( Value => $week_start->Unix ); $previous_week->AddDays( -7 ); <%ARGS> $Date => undef $DefaultTimeUnits => undef $User => undef