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

(-)a/Koha/Patrons.pm (-1 / +139 lines)
Lines 136-141 sub guarantor { Link Here
136
    return Koha::Patrons->find( $self->guarantorid() );
136
    return Koha::Patrons->find( $self->guarantorid() );
137
}
137
}
138
138
139
=head3 filter
140
141
    my $patrons = Koha::Patrons->filter({});
142
143
This method returns a Koha::Patrons resultset that matches the passed filters; The primary objective of this method is 
144
to simplify the use of commonly required filters which would normally require complex joins.
145
146
Available filters (all are optional and may be used in combination):
147
148
=over 4
149
150
=item not_guarantors
151
152
Boolean stating whether to filter out guarantors
153
154
=item issued_before
155
156
DateTime denoting last time the patrons were lent to
157
158
=item has_issues
159
160
Boolean stating whether to filter out patrons with current issues
161
162
=item expired_before
163
164
DateTime denoting beggining of period before which the users have expired
165
166
=item amount_outstanding
167
168
Number (decimal) denoting the total amount outstanding a use may have before being filtered out
169
170
=item last_seen
171
172
DateTime denoting the date since which the patron has not been seen
173
174
=item branch
175
176
String OR Arrayref of strings matching patron branchcodes to filter by
177
178
=item categories
179
180
String OR Arrayref of strings matching patron categories to filter by
181
182
=item in_list
183
184
String OR Arrayref of strings matching patron list ids to filter by
185
186
=back
187
188
=cut
189
190
sub filter {
191
    my ( $class, $filters ) = @_;
192
193
    my $where = {};
194
    my $attr  = {};
195
    my $dtf   = Koha::Database->new->schema->storage->datetime_parser;
196
197
    # Track joins to prevent unrequired double joins
198
    my $joined_issues = 0;
199
200
    # Filter out all guarantors
201
    if ( $filters->{not_guarantors} ) {
202
        my $guarantorList = Koha::Patrons->search(
203
            { guarantorid => [ { '!=' => 0 }, { '!=' => undef } ] },
204
            { select      => ['borrowernumber'] } )->_resultset->as_query;
205
206
        push @{ $where->{'-and'} },
207
          { 'me.borrowernumber' => { '-not_in' => $guarantorList } };
208
    }
209
210
    # Limit to patrons not issued to for at least X days
211
    if ( $filters->{issued_before} ) {
212
        push @{ $attr->{'join'} }, ( 'issues', 'old_issues' );
213
        push @{ $attr->{'+select'} },
214
          { max => 'old_issues.timestamp', '-as' => 'lastissue' };
215
        push @{ $attr->{'+as'} }, 'lastissue';
216
        push @{ $attr->{'having'}->{'-and'} },
217
          { 'lastissue' =>
218
              { '<' => $dtf->format_datetime( $filters->{issued_before} ) } };
219
        $joined_issues++;
220
    }
221
222
    # Limit to patrons without any current issues
223
    if ( defined( $filters->{has_issues} ) && !$filters->{has_issues} ) {
224
        push @{ $attr->{'join'} }, ('issues') unless $joined_issues;
225
        push @{ $attr->{'+select'} },
226
          { max => 'issues.timestamp', '-as' => 'currentissue' };
227
        push @{ $attr->{'+as'} }, 'currentissue';
228
        push @{ $attr->{'having'}->{'-and'} }, { 'currentissue' => undef };
229
    }
230
231
    # Limit to patrons expired more than X days
232
    if ( $filters->{expired_before} ) {
233
        push @{ $where->{'-and'} },
234
          { 'dateexpiry' =>
235
              { '<' => $dtf->format_datetime( $filters->{expired_before} ) } };
236
    }
237
238
    # Limit to patrons not owing more than X in fines
239
    if ( defined( $filters->{amount_outstanding} ) ) {
240
        push @{ $attr->{'join'} }, 'accountlines';
241
        push @{ $attr->{'+select'} },
242
          { sum => 'accountlines.amountoutstanding', '-as' => 'outstanding' };
243
        push @{ $attr->{'+as'} }, 'outstanding';
244
        push @{ $attr->{'having'}->{'-and'} },
245
          { outstanding => { '<=' => $filters->{amount_outstanding} } };
246
    }
247
248
    # Limit to patrons not seen for at least X days
249
    if ( $filters->{last_seen} ) {
250
        push @{ $where->{'-and'} },
251
          { lastseen =>
252
              { '<' => $dtf->format_datetime( $filters->{last_seen} ) } };
253
    }
254
255
    # Limit to patrons enrolled at branch X
256
    if ( $filters->{branch} ) {
257
        push @{ $where->{'-and'} }, { branchcode => $filters->{branch} };
258
    }
259
260
    # Limit to patrons belonging to categories specified
261
    if ( @{ $filters->{categories} } ) {
262
        push @{ $where->{'-and'} }, { categorycode => $filters->{categories} };
263
    }
264
265
    # Limit to patrons on patron list X
266
    if ( $filters->{in_list} ) {
267
        push @{ $attr->{'join'} }, 'patron_list_patrons';
268
        push @{ $where->{'-and'} },
269
          { 'patron_list_patrons.patron_list_id' => $filters->{in_list} };
270
    }
271
272
    # Group by borrowernumber
273
    $attr->{group_by} = 'me.borrowernumber';
274
275
    return $class->search( $where, $attr );
276
}
277
139
=head3 search_patrons_to_anonymise
278
=head3 search_patrons_to_anonymise
140
279
141
    my $patrons = Koha::Patrons->search_patrons_to_anonymise( { before => $older_than_date, [ library => $library ] } );
280
    my $patrons = Koha::Patrons->search_patrons_to_anonymise( { before => $older_than_date, [ library => $library ] } );
142
- 

Return to bug 11983