View | Details | Raw Unified | Return to bug 20750
Collapse All | Expand All

(-)a/Koha/Illrequest.pm (-22 / +102 lines)
Lines 32-37 use Koha::Exceptions::Ill; Link Here
32
use Koha::Illcomments;
32
use Koha::Illcomments;
33
use Koha::Illrequestattributes;
33
use Koha::Illrequestattributes;
34
use Koha::AuthorisedValue;
34
use Koha::AuthorisedValue;
35
use Koha::Illrequest::Logger;
35
use Koha::Patron;
36
use Koha::Patron;
36
use Koha::AuthorisedValues;
37
use Koha::AuthorisedValues;
37
38
Lines 157-162 sub illcomments { Link Here
157
    );
158
    );
158
}
159
}
159
160
161
=head3 logs
162
163
=cut
164
165
sub logs {
166
    my ( $self ) = @_;
167
    my $logger = Koha::Illrequest::Logger->new;
168
    return $logger->get_request_logs($self);
169
}
170
160
=head3 patron
171
=head3 patron
161
172
162
=cut
173
=cut
Lines 169-183 sub patron { Link Here
169
}
180
}
170
181
171
=head3 status_alias
182
=head3 status_alias
183
184
    $Illrequest->status_alias(143);
185
172
Overloaded getter/setter for status_alias,
186
Overloaded getter/setter for status_alias,
173
that only returns authorised values from the
187
that only returns authorised values from the
174
correct category
188
correct category and records the fact that the status has changed
175
189
176
=cut
190
=cut
177
191
178
sub status_alias {
192
sub status_alias {
179
    my ($self, $newval) = @_;
193
    my ($self, $new_status_alias) = @_;
180
    if ($newval) {
194
195
    my $current_status_alias = $self->SUPER::status_alias;
196
197
    if ($new_status_alias) {
198
        # Keep a record of the previous status before we change it,
199
        # we might need it
200
        $self->{previous_status} = $current_status_alias ?
201
            $current_status_alias :
202
            scalar $self->status;
181
        # This is hackery to enable us to undefine
203
        # This is hackery to enable us to undefine
182
        # status_alias, since we need to have an overloaded
204
        # status_alias, since we need to have an overloaded
183
        # status_alias method to get us around the problem described
205
        # status_alias method to get us around the problem described
Lines 185-197 sub status_alias { Link Here
185
        # https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=20581#c156
207
        # https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=20581#c156
186
        # We need a way of accepting implied undef, so we can nullify
208
        # We need a way of accepting implied undef, so we can nullify
187
        # the status_alias column, when called from $self->status
209
        # the status_alias column, when called from $self->status
188
        my $val = $newval eq "-1" ? undef : $newval;
210
        my $val = $new_status_alias eq "-1" ? undef : $new_status_alias;
189
        my $newval = $self->SUPER::status_alias($val);
211
        my $ret = $self->SUPER::status_alias($val);
190
        if ($newval) {
212
        my $val_to_log = $val ? $new_status_alias : scalar $self->status;
191
            return $newval;
213
        if ($ret) {
214
            my $logger = Koha::Illrequest::Logger->new;
215
            $logger->log_status_change({
216
                request => $self,
217
                value   => $val_to_log
218
            });
192
        } else {
219
        } else {
193
            return;
220
            delete $self->{previous_status};
194
        }
221
        }
222
        return $ret;
195
    }
223
    }
196
    # We can't know which result is the right one if there are multiple
224
    # We can't know which result is the right one if there are multiple
197
    # ILLSTATUS authorised values with the same authorised_value column value
225
    # ILLSTATUS authorised values with the same authorised_value column value
Lines 210-234 sub status_alias { Link Here
210
238
211
=head3 status
239
=head3 status
212
240
241
    $Illrequest->status('CANREQ');
242
213
Overloaded getter/setter for request status,
243
Overloaded getter/setter for request status,
214
also nullifies status_alias
244
also nullifies status_alias and records the fact that the status has changed
215
245
216
=cut
246
=cut
217
247
218
sub status {
248
sub status {
219
    my ( $self, $newval) = @_;
249
    my ( $self, $new_status) = @_;
220
    if ($newval) {
250
221
        # This is hackery to enable us to undefine
251
    my $current_status = $self->SUPER::status;
222
        # status_alias, since we need to have an overloaded
252
    my $current_status_alias = $self->SUPER::status_alias;
223
        # status_alias method to get us around the problem described
253
224
        # here:
254
    if ($new_status) {
225
        # https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=20581#c156
255
        # Keep a record of the previous status before we change it,
226
        # We need a way of passing implied undef to nullify status_alias
256
        # we might need it
227
        # so we pass -1, which is special cased in the overloaded setter
257
        $self->{previous_status} = $current_status_alias ?
228
        $self->status_alias("-1");
258
            $current_status_alias :
229
        return $self->SUPER::status($newval);
259
            $current_status;
260
        my $ret = $self->SUPER::status($new_status)->store;
261
        if ($current_status_alias) {
262
            # This is hackery to enable us to undefine
263
            # status_alias, since we need to have an overloaded
264
            # status_alias method to get us around the problem described
265
            # here:
266
            # https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=20581#c156
267
            # We need a way of passing implied undef to nullify status_alias
268
            # so we pass -1, which is special cased in the overloaded setter
269
            $self->status_alias("-1");
270
        } else {
271
            my $logger = Koha::Illrequest::Logger->new;
272
            $logger->log_status_change({
273
                request => $self,
274
                value   => $new_status
275
            });
276
        }
277
        delete $self->{previous_status};
278
        return $ret;
279
    } else {
280
        return $current_status;
230
    }
281
    }
231
    return $self->SUPER::status;
232
}
282
}
233
283
234
=head3 load_backend
284
=head3 load_backend
Lines 252-258 sub load_backend { Link Here
252
    my $location = join "/", @raw, $backend_name, "Base.pm";    # File to load
302
    my $location = join "/", @raw, $backend_name, "Base.pm";    # File to load
253
    my $backend_class = join "::", @raw, $backend_name, "Base"; # Package name
303
    my $backend_class = join "::", @raw, $backend_name, "Base"; # Package name
254
    require $location;
304
    require $location;
255
    $self->{_my_backend} = $backend_class->new({ config => $self->_config });
305
    $self->{_my_backend} = $backend_class->new({
306
        config => $self->_config,
307
        logger => Koha::Illrequest::Logger->new
308
    });
256
    return $self;
309
    return $self;
257
}
310
}
258
311
Lines 1107-1112 sub _censor { Link Here
1107
    return $params;
1160
    return $params;
1108
}
1161
}
1109
1162
1163
=head3 store
1164
1165
    $Illrequest->store;
1166
1167
Overloaded I<store> method that, in addition to performing the 'store',
1168
possibly records the fact that something happened
1169
1170
=cut
1171
1172
sub store {
1173
    my ( $self, $attrs ) = @_;
1174
1175
    my $ret = $self->SUPER::store;
1176
1177
    $attrs->{log_origin} = 'core';
1178
1179
    if ($ret && defined $attrs) {
1180
        my $logger = Koha::Illrequest::Logger->new;
1181
        $logger->log_maybe({
1182
            request => $self,
1183
            attrs   => $attrs
1184
        });
1185
    }
1186
1187
    return $ret;
1188
}
1189
1110
=head3 TO_JSON
1190
=head3 TO_JSON
1111
1191
1112
    $json = $illrequest->TO_JSON
1192
    $json = $illrequest->TO_JSON
(-)a/Koha/Illrequest/Logger.pm (+237 lines)
Line 0 Link Here
1
package Koha::Illrequest::Logger;
2
3
# Copyright 2018 PTFS Europe Ltd
4
#
5
# This file is part of Koha.
6
#
7
# Koha is free software; you can redistribute it and/or modify it under the
8
# terms of the GNU General Public License as published by the Free Software
9
# Foundation; either version 3 of the License, or (at your option) any later
10
# version.
11
#
12
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License along
17
# with Koha; if not, write to the Free Software Foundation, Inc.,
18
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20
use Modern::Perl;
21
use JSON qw( to_json from_json );
22
use Time::Local;
23
24
use C4::Koha;
25
use C4::Context;
26
use C4::Templates;
27
use C4::Log qw( logaction );
28
use Koha::ActionLogs;
29
30
=head1 NAME
31
32
Koha::Illrequest::Logger - Koha ILL Action / Event logger
33
34
=head1 SYNOPSIS
35
36
Object-oriented class that provides event logging functionality for
37
ILL requests
38
39
=head1 DESCRIPTION
40
41
This class provides the ability to log arbitrary actions or events
42
relating to Illrequest to the action log.
43
44
=head1 API
45
46
=head2 Class Methods
47
48
=head3 new
49
50
    my $config = Koha::Illrequest::Logger->new();
51
52
Create a new Koha::Illrequest::Logger object.
53
We also set up what can be logged, how to do it and how to display
54
log entries we get back out
55
56
=cut
57
58
sub new {
59
    my ( $class ) = @_;
60
    my $self  = {};
61
62
    $self->{loggers} = {
63
        status => sub {
64
            $self->log_status_change(@_);
65
        }
66
    };
67
68
    my ( $htdocs, $theme, $lang, $base ) =
69
        C4::Templates::_get_template_file('ill/log/', 'intranet');
70
71
    $self->{templates} = {
72
        STATUS_CHANGE => $base . 'status_change.tt'
73
    };
74
75
    bless $self, $class;
76
77
    return $self;
78
}
79
80
=head3 log_maybe
81
82
    Koha::IllRequest::Logger->log_maybe($params);
83
84
Receive params hashref, containing a request object and an attrs
85
hashref (which may or may not be defined) If the attrs hashref contains
86
a key matching our "loggers" hashref then we want to log it
87
88
=cut
89
90
sub log_maybe {
91
    my ($self, $params) = @_;
92
93
    if (defined $params->{request} && defined $params->{attrs}) {
94
        foreach my $key (keys %{ $params->{attrs} }) {
95
            if (defined($self->{loggers}->{$key})) {
96
                $self->{loggers}->{$key}(
97
                    $params->{request},
98
                    $params->{attrs}->{$key}
99
                );
100
            }
101
        }
102
    }
103
}
104
105
=head3 log_status_change
106
107
    Koha::IllRequest::Logger->log_status_change($params);
108
109
Receive a hashref containing a request object and a status to log,
110
and log it
111
112
=cut
113
114
sub log_status_change {
115
    my ( $self, $params ) = @_;
116
117
    if (defined $params->{request} && defined $params->{value}) {
118
        $self->log_something({
119
            modulename   => 'ILL',
120
            actionname   => 'STATUS_CHANGE',
121
            objectnumber => $params->{request}->id,
122
            infos        => to_json({
123
                log_origin    => 'core',
124
                status_before => $params->{request}->{previous_status},
125
                status_after  => $params->{value}
126
            })
127
        });
128
    }
129
}
130
131
=head3 log_something
132
133
    Koha::IllRequest::Logger->log_something({
134
        modulename   => 'ILL',
135
        actionname   => 'STATUS_CHANGE',
136
        objectnumber => $req->id,
137
        infos        => to_json({
138
            log_origin    => 'core',
139
            status_before => $req->{previous_status},
140
            status_after  => $new_status
141
        })
142
    });
143
144
If we have the required data passed, log an action
145
146
=cut
147
148
sub log_something {
149
    my ( $self, $to_log ) = @_;
150
151
    if (
152
        defined $to_log->{modulename} &&
153
        defined $to_log->{actionname} &&
154
        defined $to_log->{objectnumber} &&
155
        defined $to_log->{infos} &&
156
        C4::Context->preference("IllLog")
157
    ) {
158
        logaction(
159
            $to_log->{modulename},
160
            $to_log->{actionname},
161
            $to_log->{objectnumber},
162
            $to_log->{infos}
163
        );
164
    }
165
}
166
167
=head3 get_log_template
168
169
    $template_path = get_log_template($params);
170
171
Given a log's origin and action, get the appropriate display template
172
173
=cut
174
175
sub get_log_template {
176
    my ($self, $params) = @_;
177
178
    my $origin = $params->{origin};
179
    my $action = $params->{action};
180
181
    if ($origin eq 'core') {
182
        # It's a core log, so we can just get the template path from
183
        # the hashref above
184
        return $self->{templates}->{$action};
185
    } else {
186
        # It's probably a backend log, so we need to get the path to the
187
        # template from the backend
188
        my $backend =$params->{request}->{_my_backend};
189
        return $backend->get_log_template_path($action);
190
    }
191
}
192
193
=head3 get_request_logs
194
195
    $requestlogs = Koha::IllRequest::Logger->get_request_logs($request_id);
196
197
Get all logged actions for a given request
198
199
=cut
200
201
sub get_request_logs {
202
    my ( $self, $request ) = @_;
203
204
    my $logs = Koha::ActionLogs->search(
205
        {
206
            module => 'ILL',
207
            object => $request->id
208
        },
209
        { order_by => { -desc => "timestamp" } }
210
    )->unblessed;
211
212
    # Populate a lookup table for status aliases
213
    my $aliases = GetAuthorisedValues('ILLSTATUS');
214
    my $alias_hash;
215
    foreach my $alias(@{$aliases}) {
216
        $alias_hash->{$alias->{authorised_value}} = $alias;
217
    }
218
    foreach my $log(@{$logs}) {
219
        $log->{aliases} = $alias_hash;
220
        $log->{info} = from_json($log->{info});
221
        $log->{template} = $self->get_log_template({
222
            request => $request,
223
            origin => $log->{info}->{log_origin},
224
            action => $log->{action}
225
        });
226
    }
227
228
    return $logs;
229
}
230
231
=head1 AUTHOR
232
233
Andrew Isherwood <andrew.isherwood@ptfs-europe.com>
234
235
=cut
236
237
1;
(-)a/installer/data/mysql/atomicupdate/bug_20750-add_illlog_preference.perl (+7 lines)
Line 0 Link Here
1
$DBversion = 'XXX';  # will be replaced by the RM
2
if( CheckVersion( $DBversion ) ) {
3
    $dbh->do( "INSERT IGNORE INTO systempreferences (variable, value, explanation, type) VALUES ('IllLog', 0, 'If ON, log information about ILL requests', 'YesNo')" );
4
5
    SetVersion( $DBversion );
6
    print "Upgrade to $DBversion done (Bug 20750 - Allow timestamped auditing of ILL request events)\n";
7
}
(-)a/installer/data/mysql/sysprefs.sql (+1 lines)
Lines 216-221 INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` Link Here
216
('IDreamBooksResults','0','','Display IDreamBooks.com rating in search results','YesNo'),
216
('IDreamBooksResults','0','','Display IDreamBooks.com rating in search results','YesNo'),
217
('IDreamBooksReviews','0','','Display book review snippets from IDreamBooks.com','YesNo'),
217
('IDreamBooksReviews','0','','Display book review snippets from IDreamBooks.com','YesNo'),
218
('IdRef','0','','Disable/enable the IdRef webservice from the OPAC detail page.','YesNo'),
218
('IdRef','0','','Disable/enable the IdRef webservice from the OPAC detail page.','YesNo'),
219
('IllLog', 0, '', 'If ON, log information about ILL requests', 'YesNo'),
219
('ILLModule','0','If ON, enables the interlibrary loans module.','','YesNo'),
220
('ILLModule','0','If ON, enables the interlibrary loans module.','','YesNo'),
220
('ILLModuleCopyrightClearance','','70|10','Enter text to enable the copyright clearance stage of request creation. Text will be displayed','Textarea'),
221
('ILLModuleCopyrightClearance','','70|10','Enter text to enable the copyright clearance stage of request creation. Text will be displayed','Textarea'),
221
('ILLOpacbackends',NULL,NULL,'ILL backends to enabled for OPAC initiated requests','multiple'),
222
('ILLOpacbackends',NULL,NULL,'ILL backends to enabled for OPAC initiated requests','multiple'),
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/logs.pref (+6 lines)
Lines 37-42 Logging: Link Here
37
                  off: "Don't log"
37
                  off: "Don't log"
38
            - any actions on holds (create, cancel, suspend, resume, etc).
38
            - any actions on holds (create, cancel, suspend, resume, etc).
39
        -
39
        -
40
            - pref: IllLog
41
              choices:
42
                  on: Log
43
                  off: "Don't log"
44
            - when changes to ILL requests take place
45
        -
40
            - pref: IssueLog
46
            - pref: IssueLog
41
              choices:
47
              choices:
42
                  on: Log
48
                  on: Log
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/ill/ill-requests.tt (-1 / +35 lines)
Lines 319-324 Link Here
319
                            <span class="fa fa-eye"></span>
319
                            <span class="fa fa-eye"></span>
320
                            Display supplier metadata
320
                            Display supplier metadata
321
                        </a>
321
                        </a>
322
                        <a title="ILL request log" id="ill-request-display-log" class="btn btn-sm btn-default pull-right" href="#">
323
                            <span class="fa fa-calendar"></span>
324
                            ILL request log
325
                        </a>
322
                    </div>
326
                    </div>
323
                    <div class="ill-view-panel panel panel-default">
327
                    <div class="ill-view-panel panel panel-default">
324
                        <div class="panel-heading">
328
                        <div class="panel-heading">
Lines 429-434 Link Here
429
                        </div>
433
                        </div>
430
                    </div>
434
                    </div>
431
435
436
                    <div id="requestLog" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="dataPreviewLabel" aria-hidden="true">
437
                        <div class="modal-dialog">
438
                            <div class="modal-content">
439
                                <div class="modal-header">
440
                                    <button type="button" class="closebtn" data-dismiss="modal" aria-hidden="true">×</button>
441
                                    <h3 id="requestLogLabel"> Request log</h3>
442
                                </div>
443
                                <div class="modal-body">
444
                                [% IF request.logs.size > 0 %]
445
                                    [% FOREACH log IN request.logs %]
446
                                        [% tpl = log.template %]
447
                                        [% INCLUDE $tpl log=log %]
448
                                    [% END %]
449
                                [% ELSE %]
450
                                    There are no recorded logs for this request
451
                                [% END %]
452
                                </div>
453
                                <div class="modal-footer">
454
                                    <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">Close</button>
455
                                </div>
456
                            </div>
457
                        </div>
458
                    </div>
459
432
                    <div class="ill-view-panel panel panel-default">
460
                    <div class="ill-view-panel panel panel-default">
433
                        <div class="panel-heading">
461
                        <div class="panel-heading">
434
                            <h3>[% request.illcomments.count | html %] comments</h3>
462
                            <h3>[% request.illcomments.count | html %] comments</h3>
Lines 467-473 Link Here
467
                                        </form>
495
                                        </form>
468
                                    </div>
496
                                    </div>
469
                                </div>
497
                                </div>
470
                            </div>
498
                        </div>
471
                    </div>
499
                    </div>
472
500
473
                [% ELSIF query_type == 'illlist' %]
501
                [% ELSIF query_type == 'illlist' %]
Lines 835-840 Link Here
835
                }
863
                }
836
            };
864
            };
837
865
866
            // Display the modal containing request supplier metadata
867
            $('#ill-request-display-log').on('click', function(e) {
868
                e.preventDefault();
869
                $('#requestLog').modal({show:true});
870
            });
871
838
            // Toggle request attributes in Illview
872
            // Toggle request attributes in Illview
839
            $('#toggle_requestattributes').on('click', function(e) {
873
            $('#toggle_requestattributes').on('click', function(e) {
840
                e.preventDefault();
874
                e.preventDefault();
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/ill/log/status_change.tt (+11 lines)
Line 0 Link Here
1
<p>
2
[% log.timestamp | $KohaDates with_hours => 1 %] : <b>Status changed</b>
3
[% IF log.info.status_before %]
4
[% before = log.info.status_before %]
5
[% display_before = log.aliases.$before ? log.aliases.$before.lib : request.capabilities.$before.name %]
6
from &quot;[% display_before | html %]&quot;
7
[% END %]
8
[% after = log.info.status_after %]
9
[% display_after = log.aliases.$after ? log.aliases.$after.lib : request.capabilities.$after.name %]
10
to &quot;[% display_after | html %]&quot;
11
</p>
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/viewlog.tt (-1 / +3 lines)
Lines 29-34 Link Here
29
[%        CASE 'ACQUISITIONS' %]Acquisitions
29
[%        CASE 'ACQUISITIONS' %]Acquisitions
30
[%        CASE 'SERIAL'       %]Serials
30
[%        CASE 'SERIAL'       %]Serials
31
[%        CASE 'HOLDS'        %]Holds
31
[%        CASE 'HOLDS'        %]Holds
32
[%        CASE 'ILL'          %]Interlibrary loans
32
[%        CASE 'CIRCULATION'  %]Circulation
33
[%        CASE 'CIRCULATION'  %]Circulation
33
[%        CASE 'LETTER'       %]Letter
34
[%        CASE 'LETTER'       %]Letter
34
[%        CASE 'FINES'        %]Fines
35
[%        CASE 'FINES'        %]Fines
Lines 54-59 Link Here
54
[%        CASE 'CHANGE PASS' %]Change password
55
[%        CASE 'CHANGE PASS' %]Change password
55
[%        CASE 'ADDCIRCMESSAGE' %]Add circulation message
56
[%        CASE 'ADDCIRCMESSAGE' %]Add circulation message
56
[%        CASE 'DELCIRCMESSAGE' %]Delete circulation message
57
[%        CASE 'DELCIRCMESSAGE' %]Delete circulation message
58
[%        CASE 'STATUS_CHANGE'  %]Change ILL request status
57
[%        CASE 'Run'    %]Run
59
[%        CASE 'Run'    %]Run
58
[%        CASE %][% action | html %]
60
[%        CASE %][% action | html %]
59
[%    END %]
61
[%    END %]
Lines 103-109 Link Here
103
                                    [% ELSE %]
105
                                    [% ELSE %]
104
                                        <option value="">All</option>
106
                                        <option value="">All</option>
105
                                    [% END %]
107
                                    [% END %]
106
                                    [% FOREACH modx IN [ 'CATALOGUING' 'AUTHORITIES' 'MEMBERS' 'ACQUISITIONS' 'SERIAL' 'HOLDS' 'CIRCULATION' 'LETTER' 'FINES' 'SYSTEMPREFERENCE' 'CRONJOBS', 'REPORTS' ] %]
108
                                    [% FOREACH modx IN [ 'CATALOGUING' 'AUTHORITIES' 'MEMBERS' 'ACQUISITIONS' 'SERIAL' 'HOLDS' 'ILL' 'CIRCULATION' 'LETTER' 'FINES' 'SYSTEMPREFERENCE' 'CRONJOBS', 'REPORTS' ] %]
107
                                        [% IF modules.grep(modx).size %]
109
                                        [% IF modules.grep(modx).size %]
108
                                            <option value="[% modx | html %]" selected="selected">[% PROCESS translate_log_module module=modx %]</option>
110
                                            <option value="[% modx | html %]" selected="selected">[% PROCESS translate_log_module module=modx %]</option>
109
                                        [% ELSE %]
111
                                        [% ELSE %]
(-)a/t/db_dependent/Illrequests.t (-2 / +3 lines)
Lines 39-45 use_ok('Koha::Illrequests'); Link Here
39
39
40
subtest 'Basic object tests' => sub {
40
subtest 'Basic object tests' => sub {
41
41
42
    plan tests => 24;
42
    plan tests => 25;
43
43
44
    $schema->storage->txn_begin;
44
    $schema->storage->txn_begin;
45
45
Lines 62-67 subtest 'Basic object tests' => sub { Link Here
62
       "Branchcode getter works.");
62
       "Branchcode getter works.");
63
    is($illrq_obj->status, $illrq->{status},
63
    is($illrq_obj->status, $illrq->{status},
64
       "Status getter works.");
64
       "Status getter works.");
65
    is($illrq_obj->status_alias, $illrq->{status_alias},
66
       "Status_alias getter works.");
65
    is($illrq_obj->placed, $illrq->{placed},
67
    is($illrq_obj->placed, $illrq->{placed},
66
       "Placed getter works.");
68
       "Placed getter works.");
67
    is($illrq_obj->replied, $illrq->{replied},
69
    is($illrq_obj->replied, $illrq->{replied},
68
- 

Return to bug 20750