summaryrefslogtreecommitdiff
path: root/httemplate/search/rt_transaction.html
blob: aace4e9b23b1185d2f9598041dfaed7a0147eedb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
<& elements/search.html,
             'title'         => 'Time worked',
             'name_singular' => 'transaction',
             'query'         => $query,
             'count_query'   => $count_query,
             'count_addl'    => [ $format_seconds_sub, 
                                  $applied_time ? $format_seconds_sub : () ],
             'header'        => [ 'Ticket #',
                                  'Ticket',
                                  'Date',
                                  'Time',
                                  $applied_time ? 'Applied' : (),
                                ],
             'fields'        => [ 'ticketid',
                                  sub { encode_entities(shift->get('subject')) },
                                  'created',
                                  sub { my $seconds = shift->get('transaction_time');
                                        &{ $format_seconds_sub }( $seconds );
                                      },
                                  ($applied_time ? 
                                    sub { my $seconds = shift->get('applied_time');
                                        &{ $format_seconds_sub }( $seconds );
                                      } : () ),
                                ],
             'links'         => [
                                  $link,
                                  $link,
                                  '',
                                  '',
                                  '',
                                ],
&>
<%once>

my $format_seconds_sub = sub {
  my $seconds = shift;
  #(($seconds < 0) ? '-' : '') . concise(duration($seconds));
  (($seconds < 0) ? '-' : '' ). int(abs($seconds)/3600)."h".sprintf("%02d",(abs(
$seconds)%3600)/60)."m";
};

</%once>
<%init>

die "access denied"
  unless $FS::CurrentUser::CurrentUser->access_right('List rating data');

local $FS::Record::nowarn_classload = 1;
#some amount of false laziness w/timeworked.html...

my @select = (
  'Transactions.*',
  'Tickets.Id AS ticketid',
  'Tickets.Subject',
  'Users.name AS otaker',
);
my @select_total = ( 'COUNT(*)' );

my $transaction_time;
my $applied_time = '';
my $join = 'JOIN Tickets ON Transactions.ObjectId = Tickets.Id '.
           'JOIN Users   ON Transactions.Creator = Users.Id '.
           "LEFT JOIN (
               SELECT DISTINCT ON (ObjectId)
                 ObjectId, Content
               FROM ObjectCustomFieldValues
                 JOIN CustomFields
                   ON (ObjectCustomFieldValues.CustomField = CustomFields.Id)
               WHERE CustomFields.Name = 'TimeType'
                 AND ObjectCustomFieldValues.ObjectType = 'RT::Ticket'
                 AND ObjectCustomFieldValues.Disabled = 0
               ORDER BY ObjectId ASC, ObjectCustomFieldValues.LastUpdated DESC
               ) AS ocfv_TimeType ON (Tickets.Id = ocfv_TimeType.ObjectId)
           ";

my $where = "WHERE Transactions.ObjectType = 'RT::Ticket'";

# the intrinsic TimeWorked/TimeTaken fields
$transaction_time = "CASE Transactions.Type when 'Set'
    THEN (to_number(NewValue,'999999')-to_number(OldValue, '999999')) * 60
    ELSE TimeTaken*60
  END";

my $applied = ''; 
if ( $cgi->param('svcnum') =~ /^\s*(\d+)\s*$/ ) {
  $where .= " AND EXISTS( SELECT 1 FROM acct_rt_transaction WHERE acct_rt_transaction.transaction_id = Transactions.id AND svcnum = $1 )";
  $applied = "AND svcnum = $1";
}

$applied_time = "( SELECT SUM(support) from acct_rt_transaction where transaction_id = Transactions.id $applied )";

$where .= "
  AND (    ( Transactions.Type = 'Set'
             AND Transactions.Field = 'TimeWorked'
             AND Transactions.NewValue != Transactions.OldValue )
        OR ( ( Transactions.Type='Create' OR Transactions.Type='Comment' OR Transactions.Type='Correspond' OR Transactions.Type='Touch' )
             AND Transactions.TimeTaken > 0
           )
      )
";

if ( $cgi->param('category') =~ /^(\w+)$/ ) {
  $where .= " AND ocfv_TimeType.Content = '$1'";
}

push @select, "($transaction_time) AS transaction_time";
push @select_total, "SUM($transaction_time)";
if ( $applied_time ) {
  push @select, "($applied_time) AS applied_time";
  push @select_total, "SUM($applied_time)";
}

my($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi);
# TIMESTAMP is Pg-specific... ?
if ( $beginning > 0 ) {
  $beginning = "TIMESTAMP '". time2str('%Y-%m-%d %X', $beginning). "'";
  $where .= " AND Transactions.Created >= $beginning ";
}
if ( $ending < 4294967295 ) {
  $ending =    "TIMESTAMP '". time2str('%Y-%m-%d %X', $ending).    "'";
  $where .= " AND Transactions.Created <= $ending    ";
}

if ( $cgi->param('otaker') && $cgi->param('otaker') =~ /^([\w\.\-]+)$/ ) {
  $where .= " AND Users.name = '$1' ";
}

if ( $cgi->param('ticketid') =~ /^\s*(\d+)\s*$/ ) {
  $where .= " AND Tickets.Id = $1";
}

my $query = {
  'select'    => join(', ', @select),
  'table'     => 'transactions', #Pg-ism
  #'table'     => 'Transactions',
  'addl_from' => $join,
  'extra_sql' => $where,
  'order by'  => 'ORDER BY Created',
};

my $count_query = 'SELECT '.join(', ', @select_total). " FROM Transactions $join $where";

my $link = [ "${p}rt/Ticket/Display.html?id=", sub { shift->get('ticketid'); } ];

</%init>