|
Lines 59-94
sub search_limited {
Link Here
|
| 59 |
my @restricted_branchcodes; |
59 |
my @restricted_branchcodes; |
| 60 |
if ( $userenv and $userenv->{number} ) { |
60 |
if ( $userenv and $userenv->{number} ) { |
| 61 |
my $logged_in_user = Koha::Patrons->find( $userenv->{number} ); |
61 |
my $logged_in_user = Koha::Patrons->find( $userenv->{number} ); |
| 62 |
@restricted_branchcodes = $logged_in_user->libraries_where_can_see_patrons; |
62 |
@restricted_branchcodes = |
|
|
63 |
$logged_in_user->libraries_where_can_see_patrons; |
| 63 |
} |
64 |
} |
| 64 |
$params->{'me.branchcode'} = { -in => \@restricted_branchcodes } if @restricted_branchcodes; |
65 |
$params->{'me.branchcode'} = { -in => \@restricted_branchcodes } |
|
|
66 |
if @restricted_branchcodes; |
| 65 |
return $self->search( $params, $attributes ); |
67 |
return $self->search( $params, $attributes ); |
| 66 |
} |
68 |
} |
| 67 |
|
69 |
|
| 68 |
=head3 filter_by_is_guarantor |
70 |
=head3 filter_by_is_guarantor |
| 69 |
|
71 |
|
| 70 |
Koha::Patrons->filter_by_is_guarantor(1); |
72 |
$guarantors = Koha::Patrons->filter_by_is_guarantor; |
|
|
73 |
$guarantors = Koha::Patrons->filter_by_is_guarantor($enabled); |
| 71 |
|
74 |
|
| 72 |
Returns patrons filtered by whether they have a guarantor, are a guarantor or are not a guarantor. |
75 |
Returns patrons that are guarantors. |
| 73 |
|
76 |
|
| 74 |
=head4 options |
77 |
=head4 options |
| 75 |
|
78 |
|
| 76 |
=over 4 |
79 |
=over 4 |
| 77 |
|
80 |
|
| 78 |
=item undef - do not apply filter |
81 |
=item 0 - boolean to disable the filter |
| 79 |
|
82 |
|
| 80 |
=item 1 - boolean to limit to NOT guarantors |
83 |
=item 1 - boolean to enable the filter (default) |
| 81 |
|
84 |
|
| 82 |
=item 0 - boolean limit to ONLY guarantors |
|
|
| 83 |
|
| 84 |
=back |
85 |
=back |
| 85 |
|
86 |
|
| 86 |
=cut |
87 |
=cut |
| 87 |
|
88 |
|
| 88 |
sub filter_by_is_guarantor { |
89 |
sub filter_by_is_guarantor { |
| 89 |
my ( $self, $option ) = @_; |
90 |
my ( $self, $enabled ) = @_; |
| 90 |
|
91 |
|
| 91 |
return $self unless defined($option); |
92 |
# Noop if explicitly disabled by param |
|
|
93 |
return $self if ( defined($enabled) && !$enabled ); |
| 92 |
|
94 |
|
| 93 |
my $guarantorList = Koha::Patron::Relationships->search( |
95 |
my $guarantorList = Koha::Patron::Relationships->search( |
| 94 |
{}, |
96 |
{}, |
|
Lines 100-137
sub filter_by_is_guarantor {
Link Here
|
| 100 |
|
102 |
|
| 101 |
# Patrons who are guarantors |
103 |
# Patrons who are guarantors |
| 102 |
return $self->search( |
104 |
return $self->search( |
| 103 |
{ 'me.borrowernumber' => { '-in' => $guarantorList } } ) |
105 |
{ 'me.borrowernumber' => { '-in' => $guarantorList } } ); |
| 104 |
if $option; |
|
|
| 105 |
|
106 |
|
| 106 |
# Patrons who are not guarantors |
|
|
| 107 |
return $self->search( |
| 108 |
{ 'me.borrowernumber' => { '-not_in' => $guarantorList } } ); |
| 109 |
} |
107 |
} |
| 110 |
|
108 |
|
| 111 |
=head3 filter_by_has_guarantor |
109 |
=head3 filter_by_is_not_guarantor |
| 112 |
|
110 |
|
| 113 |
Koha::Patrons->filter_by_has_guarantor(1); |
111 |
$non_guarantors = Koha::Patrons->filter_by_is_not_guarantor; |
|
|
112 |
$non_guarantors = Koha::Patrons->filter_by_is_not_guarantor($enabled); |
| 114 |
|
113 |
|
| 115 |
Returns patrons filtered by whether they have a guarantor, are a guarantor or are not a guarantor. |
114 |
Returns patrons that are not guarantors. |
| 116 |
|
115 |
|
| 117 |
=head4 options |
116 |
=head4 options |
| 118 |
|
117 |
|
| 119 |
=over 4 |
118 |
=over 4 |
| 120 |
|
119 |
|
| 121 |
=item undef - do not apply filter |
120 |
=item 0 - boolean to disable the filter |
|
|
121 |
|
| 122 |
=item 1 - boolean to enable the filter (default) |
| 123 |
|
| 124 |
=back |
| 125 |
|
| 126 |
=cut |
| 127 |
|
| 128 |
sub filter_by_is_not_guarantor { |
| 129 |
my ( $self, $enabled ) = @_; |
| 130 |
|
| 131 |
# Noop if explicitly disabled by param |
| 132 |
return $self if ( defined($enabled) && !$enabled ); |
| 133 |
|
| 134 |
my $guarantorList = Koha::Patron::Relationships->search( |
| 135 |
{}, |
| 136 |
{ |
| 137 |
columns => ['guarantor_id'], |
| 138 |
distinct => 1 |
| 139 |
} |
| 140 |
)->_resultset->as_query; |
| 141 |
|
| 142 |
# Patrons who are not guarantors |
| 143 |
return $self->search( |
| 144 |
{ 'me.borrowernumber' => { '-not_in' => $guarantorList } } ); |
| 145 |
} |
| 146 |
|
| 147 |
=head3 filter_by_is_guarantee |
| 122 |
|
148 |
|
| 123 |
=item 1 - boolean to limit to users who have a guarantor |
149 |
$guarantees = Koha::Patrons->filter_by_is_guarantee; |
|
|
150 |
$guarantees = Koha::Patrons->filter_by_is_guarantee($enabled); |
| 124 |
|
151 |
|
| 125 |
=item 0 - boolean to limit to users who do not have a guarantor |
152 |
Returns patrons that are guaranteed, have a guarantor. |
| 126 |
|
153 |
|
|
|
154 |
=head4 options |
| 155 |
|
| 156 |
=over 4 |
| 157 |
|
| 158 |
=item 0 - boolean to disable the filter |
| 159 |
|
| 160 |
=item 1 - boolean to enable the filter (default) |
| 161 |
|
| 127 |
=back |
162 |
=back |
| 128 |
|
163 |
|
| 129 |
=cut |
164 |
=cut |
| 130 |
|
165 |
|
| 131 |
sub filter_by_has_guarantor { |
166 |
sub filter_by_is_guarantee { |
| 132 |
my ( $self, $option ) = @_; |
167 |
my ( $self, $enabled ) = @_; |
| 133 |
|
168 |
|
| 134 |
return $self unless defined($option); |
169 |
# Noop if explicitly disabled by param |
|
|
170 |
return $self if ( defined($enabled) && !$enabled ); |
| 135 |
|
171 |
|
| 136 |
my $guaranteeList = Koha::Patron::Relationships->search( |
172 |
my $guaranteeList = Koha::Patron::Relationships->search( |
| 137 |
{}, |
173 |
{}, |
|
Lines 143-161
sub filter_by_has_guarantor {
Link Here
|
| 143 |
|
179 |
|
| 144 |
# Patrons who have guarantors |
180 |
# Patrons who have guarantors |
| 145 |
return $self->search( |
181 |
return $self->search( |
| 146 |
{ 'me.borrowernumber' => { '-in' => $guaranteeList } } ) |
182 |
{ 'me.borrowernumber' => { '-in' => $guaranteeList } } ); |
| 147 |
if $option; |
183 |
} |
|
|
184 |
|
| 185 |
=head3 filter_by_is_not_guarantee |
| 186 |
|
| 187 |
$non_guarantees = Koha::Patrons->filter_by_is_not_guarantee; |
| 188 |
$non_guarantees = Koha::Patrons->filter_by_is_not_guarantee($enabled); |
| 189 |
|
| 190 |
Returns patrons that are not guaranteed, do not have a guarantor. |
| 191 |
|
| 192 |
=head4 options |
| 193 |
|
| 194 |
=over 4 |
| 195 |
|
| 196 |
=item 0 - boolean to disable the filter |
| 197 |
|
| 198 |
=item 1 - boolean to enable the filter (default) |
| 199 |
|
| 200 |
=back |
| 201 |
|
| 202 |
=cut |
| 203 |
|
| 204 |
sub filter_by_is_not_guarantee { |
| 205 |
my ( $self, $enabled ) = @_; |
| 206 |
|
| 207 |
# Noop if explicitly disabled by param |
| 208 |
return $self if ( defined($enabled) && !$enabled ); |
| 209 |
|
| 210 |
my $guaranteeList = Koha::Patron::Relationships->search( |
| 211 |
{}, |
| 212 |
{ |
| 213 |
columns => ['guarantee_id'], |
| 214 |
distinct => 1 |
| 215 |
} |
| 216 |
)->_resultset->as_query; |
| 148 |
|
217 |
|
| 149 |
# Patrons who do not have guarantors |
218 |
# Patrons who do not have guarantors |
| 150 |
return $self->search( |
219 |
return $self->search( |
| 151 |
{ 'me.borrowernumber' => { '-not_in' => $guaranteeList } } ); |
220 |
{ 'me.borrowernumber' => { '-not_in' => $guaranteeList } } ); |
| 152 |
} |
221 |
} |
| 153 |
|
222 |
|
| 154 |
=head3 filter_by_last_issued |
223 |
=head3 filter_by_date_last_checkout |
| 155 |
|
224 |
|
| 156 |
Koha::Patrons->filter_by_last_issued( { after => DateTime, before => DateTime } ); |
225 |
Koha::Patrons->filter_by_date_last_checkout( { after => DateTime, before => DateTime } ); |
| 157 |
|
226 |
|
| 158 |
Returns patrons filtered by whether their last issue falls betwen the passed limits. |
227 |
Returns patrons filtered by when their last issue date falls. |
| 159 |
|
228 |
|
| 160 |
=head4 arguments hashref |
229 |
=head4 arguments hashref |
| 161 |
|
230 |
|
|
Lines 169-175
Returns patrons filtered by whether their last issue falls betwen the passed lim
Link Here
|
| 169 |
|
238 |
|
| 170 |
=cut |
239 |
=cut |
| 171 |
|
240 |
|
| 172 |
sub filter_by_last_issued { |
241 |
sub filter_by_date_last_checkout { |
| 173 |
my ( $self, $options ) = @_; |
242 |
my ( $self, $options ) = @_; |
| 174 |
|
243 |
|
| 175 |
return $self |
244 |
return $self |
|
Lines 177-183
sub filter_by_last_issued {
Link Here
|
| 177 |
&& ( $options->{before} || $options->{after} ) ); |
246 |
&& ( $options->{before} || $options->{after} ) ); |
| 178 |
|
247 |
|
| 179 |
my $where = {}; |
248 |
my $where = {}; |
| 180 |
my $group_by = [ map { 'me.' . $_ } $self->_resultset->result_source->columns ]; |
249 |
my $group_by = |
|
|
250 |
[ map { 'me.' . $_ } $self->_resultset->result_source->columns ]; |
| 181 |
my $attrs = { |
251 |
my $attrs = { |
| 182 |
join => 'old_issues', |
252 |
join => 'old_issues', |
| 183 |
group_by => $group_by, |
253 |
group_by => $group_by, |
|
Lines 227-257
sub filter_by_last_issued {
Link Here
|
| 227 |
# return $self->search( $where, $attrs ); |
297 |
# return $self->search( $where, $attrs ); |
| 228 |
#} |
298 |
#} |
| 229 |
|
299 |
|
| 230 |
=head3 filter_by_has_issues |
300 |
=head3 filter_by_has_pending_checkouts |
| 231 |
|
301 |
|
| 232 |
Koha::Patrons->filter_by_has_issues(1); |
302 |
$patrons_with_checkouts = Koha::Patrons->filter_by_has_pending_checkout; |
| 233 |
|
303 |
|
| 234 |
Returns patrons filtered by whether they have current issues or not. |
304 |
Returns patrons filtered by whether they have one or more current checkouts. |
| 235 |
|
305 |
|
| 236 |
=head4 options |
306 |
=head4 options |
| 237 |
|
307 |
|
| 238 |
=over 4 |
308 |
=over 4 |
| 239 |
|
309 |
|
| 240 |
=item undef - do not apply filter |
310 |
=item 0 - boolean to disable the filter |
|
|
311 |
|
| 312 |
=item 1 - boolean to enable the filter (default) |
| 313 |
|
| 314 |
=back |
| 315 |
|
| 316 |
=cut |
| 317 |
|
| 318 |
sub filter_by_has_pending_checkouts { |
| 319 |
my ( $self, $enabled ) = @_; |
| 320 |
|
| 321 |
# Noop if explicitly disabled by param |
| 322 |
return $self if ( defined($enabled) && !$enabled ); |
| 323 |
|
| 324 |
my $issueList = Koha::Checkouts->search( |
| 325 |
{}, |
| 326 |
{ |
| 327 |
columns => ['borrowernumber'], |
| 328 |
distinct => 1 |
| 329 |
} |
| 330 |
)->_resultset->as_query; |
| 241 |
|
331 |
|
| 242 |
=item 0 - limit to patrons WITHOUT current issues |
332 |
# Patrons who have current issues |
|
|
333 |
return $self->search( { 'me.borrowernumber' => { '-in' => $issueList } } ); |
| 334 |
} |
| 335 |
|
| 336 |
=head3 filter_by_has_no_pending_checkouts |
| 337 |
|
| 338 |
Koha::Patrons->filter_by_has_no_ending_checkout(1); |
| 243 |
|
339 |
|
| 244 |
=item 1 - limit to patrons WITH current issues |
340 |
Returns patrons filtered to those who do not have any current checkouts. |
| 245 |
|
341 |
|
|
|
342 |
=head4 options |
| 343 |
|
| 344 |
=over 4 |
| 345 |
|
| 346 |
=item 0 - boolean to disable the filter |
| 347 |
|
| 348 |
=item 1 - boolean to enable the filter (default) |
| 349 |
|
| 246 |
=back |
350 |
=back |
| 247 |
|
351 |
|
| 248 |
=cut |
352 |
=cut |
| 249 |
|
353 |
|
| 250 |
sub filter_by_has_issues { |
354 |
sub filter_by_has_no_pending_checkouts { |
| 251 |
my ( $self, $option ) = @_; |
355 |
my ( $self, $enabled ) = @_; |
| 252 |
|
356 |
|
| 253 |
return $self |
357 |
# Noop if explicitly disabled by param |
| 254 |
unless defined($option); |
358 |
return $self if ( defined($enabled) && !$enabled ); |
| 255 |
|
359 |
|
| 256 |
my $issueList = Koha::Checkouts->search( |
360 |
my $issueList = Koha::Checkouts->search( |
| 257 |
{}, |
361 |
{}, |
|
Lines 261-270
sub filter_by_has_issues {
Link Here
|
| 261 |
} |
365 |
} |
| 262 |
)->_resultset->as_query; |
366 |
)->_resultset->as_query; |
| 263 |
|
367 |
|
| 264 |
# Patrons who have current issues |
|
|
| 265 |
return $self->search( { 'me.borrowernumber' => { '-in' => $issueList } } ) |
| 266 |
if $option; |
| 267 |
|
| 268 |
# Patrons who do not have current issues |
368 |
# Patrons who do not have current issues |
| 269 |
return $self->search( |
369 |
return $self->search( |
| 270 |
{ 'me.borrowernumber' => { '-not_in' => $issueList } } ); |
370 |
{ 'me.borrowernumber' => { '-not_in' => $issueList } } ); |
|
Lines 300-308
sub filter_by_has_issues {
Link Here
|
| 300 |
# return $self->search($where,$attrs); |
400 |
# return $self->search($where,$attrs); |
| 301 |
#} |
401 |
#} |
| 302 |
|
402 |
|
| 303 |
=head3 filter_by_when_expired |
403 |
=head3 filter_by_date_expired |
| 304 |
|
404 |
|
| 305 |
Koha::Patrons->filter_by_when_expired( { after => DateTime, before => DateTime ); |
405 |
Koha::Patrons->filter_by_date_expired( { after => DateTime, before => DateTime ); |
| 306 |
|
406 |
|
| 307 |
Returns patrons filtered by whether their accounts expired between between the passed limits. |
407 |
Returns patrons filtered by whether their accounts expired between between the passed limits. |
| 308 |
|
408 |
|
|
Lines 318-324
Returns patrons filtered by whether their accounts expired between between the p
Link Here
|
| 318 |
|
418 |
|
| 319 |
=cut |
419 |
=cut |
| 320 |
|
420 |
|
| 321 |
sub filter_by_when_expired { |
421 |
sub filter_by_date_expired { |
| 322 |
my ( $self, $options ) = @_; |
422 |
my ( $self, $options ) = @_; |
| 323 |
|
423 |
|
| 324 |
return $self |
424 |
return $self |
|
Lines 350-356
sub filter_by_when_expired {
Link Here
|
| 350 |
return $self->search( $where, $attrs ); |
450 |
return $self->search( $where, $attrs ); |
| 351 |
} |
451 |
} |
| 352 |
|
452 |
|
| 353 |
|
|
|
| 354 |
=head3 filter_by_amount_owed |
453 |
=head3 filter_by_amount_owed |
| 355 |
|
454 |
|
| 356 |
Koha::Patrons->filter_by_amount_owed( { less_than => '2.00', more_than => '0.50' } ); |
455 |
Koha::Patrons->filter_by_amount_owed( { less_than => '2.00', more_than => '0.50' } ); |
|
Lines 418-424
sub filter_by_amount_owed {
Link Here
|
| 418 |
&& ( $options->{less_than} || $options->{more_than} ) ); |
517 |
&& ( $options->{less_than} || $options->{more_than} ) ); |
| 419 |
|
518 |
|
| 420 |
my $where = {}; |
519 |
my $where = {}; |
| 421 |
my $group_by = [ map { 'me.' . $_ } $self->_resultset->result_source->columns ]; |
520 |
my $group_by = |
|
|
521 |
[ map { 'me.' . $_ } $self->_resultset->result_source->columns ]; |
| 522 |
|
| 422 |
#push @{$group_by}, 'outstanding'; |
523 |
#push @{$group_by}, 'outstanding'; |
| 423 |
my $attrs = { |
524 |
my $attrs = { |
| 424 |
join => 'accountlines', |
525 |
join => 'accountlines', |
|
Lines 514-524
Returns all Patrons which are Housebound choosers.
Link Here
|
| 514 |
=cut |
615 |
=cut |
| 515 |
|
616 |
|
| 516 |
sub search_housebound_choosers { |
617 |
sub search_housebound_choosers { |
| 517 |
my ( $self ) = @_; |
618 |
my ($self) = @_; |
| 518 |
my $cho = $self->_resultset |
619 |
my $cho = $self->_resultset->search_related( |
| 519 |
->search_related('housebound_role', { |
620 |
'housebound_role', |
|
|
621 |
{ |
| 520 |
housebound_chooser => 1, |
622 |
housebound_chooser => 1, |
| 521 |
})->search_related('borrowernumber'); |
623 |
} |
|
|
624 |
)->search_related('borrowernumber'); |
| 522 |
return Koha::Patrons->_new_from_dbic($cho); |
625 |
return Koha::Patrons->_new_from_dbic($cho); |
| 523 |
} |
626 |
} |
| 524 |
|
627 |
|
|
Lines 529-539
Returns all Patrons which are Housebound deliverers.
Link Here
|
| 529 |
=cut |
632 |
=cut |
| 530 |
|
633 |
|
| 531 |
sub search_housebound_deliverers { |
634 |
sub search_housebound_deliverers { |
| 532 |
my ( $self ) = @_; |
635 |
my ($self) = @_; |
| 533 |
my $del = $self->_resultset |
636 |
my $del = $self->_resultset->search_related( |
| 534 |
->search_related('housebound_role', { |
637 |
'housebound_role', |
|
|
638 |
{ |
| 535 |
housebound_deliverer => 1, |
639 |
housebound_deliverer => 1, |
| 536 |
})->search_related('borrowernumber'); |
640 |
} |
|
|
641 |
)->search_related('borrowernumber'); |
| 537 |
return Koha::Patrons->_new_from_dbic($del); |
642 |
return Koha::Patrons->_new_from_dbic($del); |
| 538 |
} |
643 |
} |
| 539 |
|
644 |
|
|
Lines 551-572
from 12 to 17 days.
Link Here
|
| 551 |
sub search_upcoming_membership_expires { |
656 |
sub search_upcoming_membership_expires { |
| 552 |
my ( $self, $params ) = @_; |
657 |
my ( $self, $params ) = @_; |
| 553 |
my $before = $params->{before} || 0; |
658 |
my $before = $params->{before} || 0; |
| 554 |
my $after = $params->{after} || 0; |
659 |
my $after = $params->{after} || 0; |
| 555 |
delete $params->{before}; |
660 |
delete $params->{before}; |
| 556 |
delete $params->{after}; |
661 |
delete $params->{after}; |
| 557 |
|
662 |
|
| 558 |
my $days = C4::Context->preference("MembershipExpiryDaysNotice") || 0; |
663 |
my $days = C4::Context->preference("MembershipExpiryDaysNotice") || 0; |
| 559 |
my $date_before = dt_from_string->add( days => $days - $before ); |
664 |
my $date_before = dt_from_string->add( days => $days - $before ); |
| 560 |
my $date_after = dt_from_string->add( days => $days + $after ); |
665 |
my $date_after = dt_from_string->add( days => $days + $after ); |
| 561 |
my $dtf = Koha::Database->new->schema->storage->datetime_parser; |
666 |
my $dtf = Koha::Database->new->schema->storage->datetime_parser; |
| 562 |
|
667 |
|
| 563 |
$params->{dateexpiry} = { |
668 |
$params->{dateexpiry} = { |
| 564 |
">=" => $dtf->format_date( $date_before ), |
669 |
">=" => $dtf->format_date($date_before), |
| 565 |
"<=" => $dtf->format_date( $date_after ), |
670 |
"<=" => $dtf->format_date($date_after), |
| 566 |
}; |
671 |
}; |
| 567 |
return $self->SUPER::search( |
672 |
return $self->SUPER::search( $params, |
| 568 |
$params, { join => ['branchcode', 'categorycode'] } |
673 |
{ join => [ 'branchcode', 'categorycode' ] } ); |
| 569 |
); |
|
|
| 570 |
} |
674 |
} |
| 571 |
|
675 |
|
| 572 |
=head3 search_patrons_to_anonymise |
676 |
=head3 search_patrons_to_anonymise |
|
Lines 581-602
sub search_patrons_to_anonymise {
Link Here
|
| 581 |
my ( $class, $params ) = @_; |
685 |
my ( $class, $params ) = @_; |
| 582 |
my $older_than_date = $params->{before}; |
686 |
my $older_than_date = $params->{before}; |
| 583 |
my $library = $params->{library}; |
687 |
my $library = $params->{library}; |
| 584 |
$older_than_date = $older_than_date ? dt_from_string($older_than_date) : dt_from_string; |
688 |
$older_than_date = |
|
|
689 |
$older_than_date ? dt_from_string($older_than_date) : dt_from_string; |
| 585 |
$library ||= |
690 |
$library ||= |
| 586 |
( C4::Context->preference('IndependentBranches') && C4::Context->userenv && !C4::Context->IsSuperLibrarian() && C4::Context->userenv->{branch} ) |
691 |
( C4::Context->preference('IndependentBranches') |
|
|
692 |
&& C4::Context->userenv |
| 693 |
&& !C4::Context->IsSuperLibrarian() |
| 694 |
&& C4::Context->userenv->{branch} ) |
| 587 |
? C4::Context->userenv->{branch} |
695 |
? C4::Context->userenv->{branch} |
| 588 |
: undef; |
696 |
: undef; |
| 589 |
my $anonymous_patron = C4::Context->preference('AnonymousPatron') || undef; |
697 |
my $anonymous_patron = C4::Context->preference('AnonymousPatron') || undef; |
| 590 |
|
698 |
|
| 591 |
my $dtf = Koha::Database->new->schema->storage->datetime_parser; |
699 |
my $dtf = Koha::Database->new->schema->storage->datetime_parser; |
| 592 |
my $rs = $class->_resultset->search( |
700 |
my $rs = $class->_resultset->search( |
| 593 |
{ returndate => { '<' => $dtf->format_datetime($older_than_date), }, |
701 |
{ |
|
|
702 |
returndate => { '<' => $dtf->format_datetime($older_than_date), }, |
| 594 |
'old_issues.borrowernumber' => { 'not' => undef }, |
703 |
'old_issues.borrowernumber' => { 'not' => undef }, |
| 595 |
privacy => { '<>' => 0 }, # Keep forever |
704 |
privacy => { '<>' => 0 }, # Keep forever |
| 596 |
( $library ? ( 'old_issues.branchcode' => $library ) : () ), |
705 |
( $library ? ( 'old_issues.branchcode' => $library ) : () ), |
| 597 |
( $anonymous_patron ? ( 'old_issues.borrowernumber' => { '!=' => $anonymous_patron } ) : () ), |
706 |
( |
|
|
707 |
$anonymous_patron |
| 708 |
? ( 'old_issues.borrowernumber' => |
| 709 |
{ '!=' => $anonymous_patron } ) |
| 710 |
: () |
| 711 |
), |
| 598 |
}, |
712 |
}, |
| 599 |
{ join => ["old_issues"], |
713 |
{ |
|
|
714 |
join => ["old_issues"], |
| 600 |
distinct => 1, |
715 |
distinct => 1, |
| 601 |
} |
716 |
} |
| 602 |
); |
717 |
); |
|
Lines 620-643
sub anonymise_issue_history {
Link Here
|
| 620 |
|
735 |
|
| 621 |
$older_than_date = dt_from_string $older_than_date if $older_than_date; |
736 |
$older_than_date = dt_from_string $older_than_date if $older_than_date; |
| 622 |
|
737 |
|
| 623 |
# The default of 0 does not work due to foreign key constraints |
738 |
# The default of 0 does not work due to foreign key constraints |
| 624 |
# The anonymisation should not fail quietly if AnonymousPatron is not a valid entry |
739 |
# The anonymisation should not fail quietly if AnonymousPatron is not a valid entry |
| 625 |
# Set it to undef (NULL) |
740 |
# Set it to undef (NULL) |
| 626 |
my $dtf = Koha::Database->new->schema->storage->datetime_parser; |
741 |
my $dtf = Koha::Database->new->schema->storage->datetime_parser; |
| 627 |
my $nb_rows = 0; |
742 |
my $nb_rows = 0; |
| 628 |
while ( my $patron = $self->next ) { |
743 |
while ( my $patron = $self->next ) { |
| 629 |
my $old_issues_to_anonymise = $patron->old_checkouts->search( |
744 |
my $old_issues_to_anonymise = $patron->old_checkouts->search( |
| 630 |
{ |
745 |
{ |
| 631 |
( |
746 |
( |
| 632 |
$older_than_date |
747 |
$older_than_date |
| 633 |
? ( returndate => |
748 |
? ( returndate => |
| 634 |
{ '<' => $dtf->format_datetime($older_than_date) } ) |
749 |
{ '<' => $dtf->format_datetime($older_than_date) } ) |
| 635 |
: () |
750 |
: () |
| 636 |
) |
751 |
) |
| 637 |
} |
752 |
} |
| 638 |
); |
753 |
); |
| 639 |
my $anonymous_patron = C4::Context->preference('AnonymousPatron') || undef; |
754 |
my $anonymous_patron = |
| 640 |
$nb_rows += $old_issues_to_anonymise->update( { 'old_issues.borrowernumber' => $anonymous_patron } ); |
755 |
C4::Context->preference('AnonymousPatron') || undef; |
|
|
756 |
$nb_rows += $old_issues_to_anonymise->update( |
| 757 |
{ 'old_issues.borrowernumber' => $anonymous_patron } ); |
| 641 |
} |
758 |
} |
| 642 |
return $nb_rows; |
759 |
return $nb_rows; |
| 643 |
} |
760 |
} |
|
Lines 659-677
sub anonymise_issue_history {
Link Here
|
| 659 |
sub delete { |
776 |
sub delete { |
| 660 |
my ( $self, $params ) = @_; |
777 |
my ( $self, $params ) = @_; |
| 661 |
my $patrons_deleted; |
778 |
my $patrons_deleted; |
| 662 |
$self->_resultset->result_source->schema->txn_do( sub { |
779 |
$self->_resultset->result_source->schema->txn_do( |
| 663 |
my ( $set, $params ) = @_; |
780 |
sub { |
| 664 |
my $count = $set->count; |
781 |
my ( $set, $params ) = @_; |
| 665 |
while ( my $patron = $set->next ) { |
782 |
my $count = $set->count; |
|
|
783 |
while ( my $patron = $set->next ) { |
| 666 |
|
784 |
|
| 667 |
next unless $patron->in_storage; |
785 |
next unless $patron->in_storage; |
| 668 |
|
786 |
|
| 669 |
$patron->move_to_deleted if $params->{move}; |
787 |
$patron->move_to_deleted if $params->{move}; |
| 670 |
$patron->delete; |
788 |
$patron->delete; |
| 671 |
|
789 |
|
| 672 |
$patrons_deleted++; |
790 |
$patrons_deleted++; |
| 673 |
} |
791 |
} |
| 674 |
}, $self, $params ); |
792 |
}, |
|
|
793 |
$self, |
| 794 |
$params |
| 795 |
); |
| 675 |
return $patrons_deleted; |
796 |
return $patrons_deleted; |
| 676 |
} |
797 |
} |
| 677 |
|
798 |
|
|
Lines 686-707
sub delete {
Link Here
|
| 686 |
=cut |
807 |
=cut |
| 687 |
|
808 |
|
| 688 |
sub search_unsubscribed { |
809 |
sub search_unsubscribed { |
| 689 |
my ( $class ) = @_; |
810 |
my ($class) = @_; |
| 690 |
|
811 |
|
| 691 |
my $delay = C4::Context->preference('UnsubscribeReflectionDelay'); |
812 |
my $delay = C4::Context->preference('UnsubscribeReflectionDelay'); |
| 692 |
if( !defined($delay) || $delay eq q{} ) { |
813 |
if ( !defined($delay) || $delay eq q{} ) { |
|
|
814 |
|
| 693 |
# return empty set |
815 |
# return empty set |
| 694 |
return $class->search({ borrowernumber => undef }); |
816 |
return $class->search( { borrowernumber => undef } ); |
| 695 |
} |
817 |
} |
| 696 |
my $parser = Koha::Database->new->schema->storage->datetime_parser; |
818 |
my $parser = Koha::Database->new->schema->storage->datetime_parser; |
| 697 |
my $dt = dt_from_string()->subtract( days => $delay ); |
819 |
my $dt = dt_from_string()->subtract( days => $delay ); |
| 698 |
my $str = $parser->format_datetime($dt); |
820 |
my $str = $parser->format_datetime($dt); |
| 699 |
my $fails = C4::Context->preference('FailedLoginAttempts') || 0; |
821 |
my $fails = C4::Context->preference('FailedLoginAttempts') || 0; |
| 700 |
my $cond = [ undef, 0, 1..$fails-1 ]; # NULL, 0, 1..fails-1 (if fails>0) |
822 |
my $cond = [ undef, 0, 1 .. $fails - 1 ]; # NULL, 0, 1..fails-1 (if fails>0) |
| 701 |
return $class->search( |
823 |
return $class->search( |
| 702 |
{ |
824 |
{ |
| 703 |
'patron_consents.refused_on' => { '<=' => $str }, |
825 |
'patron_consents.refused_on' => { '<=' => $str }, |
| 704 |
'login_attempts' => $cond, |
826 |
'login_attempts' => $cond, |
| 705 |
}, |
827 |
}, |
| 706 |
{ join => 'patron_consents' }, |
828 |
{ join => 'patron_consents' }, |
| 707 |
); |
829 |
); |
|
Lines 721-741
sub search_anonymize_candidates {
Link Here
|
| 721 |
my ( $class, $params ) = @_; |
843 |
my ( $class, $params ) = @_; |
| 722 |
|
844 |
|
| 723 |
my $delay = C4::Context->preference('PatronAnonymizeDelay'); |
845 |
my $delay = C4::Context->preference('PatronAnonymizeDelay'); |
| 724 |
if( !defined($delay) || $delay eq q{} ) { |
846 |
if ( !defined($delay) || $delay eq q{} ) { |
|
|
847 |
|
| 725 |
# return empty set |
848 |
# return empty set |
| 726 |
return $class->search({ borrowernumber => undef }); |
849 |
return $class->search( { borrowernumber => undef } ); |
| 727 |
} |
850 |
} |
| 728 |
my $cond = {}; |
851 |
my $cond = {}; |
| 729 |
my $parser = Koha::Database->new->schema->storage->datetime_parser; |
852 |
my $parser = Koha::Database->new->schema->storage->datetime_parser; |
| 730 |
my $dt = dt_from_string()->subtract( days => $delay ); |
853 |
my $dt = dt_from_string()->subtract( days => $delay ); |
| 731 |
my $str = $parser->format_datetime($dt); |
854 |
my $str = $parser->format_datetime($dt); |
| 732 |
$cond->{dateexpiry} = { '<=' => $str }; |
855 |
$cond->{dateexpiry} = { '<=' => $str }; |
| 733 |
$cond->{anonymized} = 0; # not yet done |
856 |
$cond->{anonymized} = 0; # not yet done |
| 734 |
if( $params->{locked} ) { |
857 |
if ( $params->{locked} ) { |
| 735 |
my $fails = C4::Context->preference('FailedLoginAttempts') || 0; |
858 |
my $fails = C4::Context->preference('FailedLoginAttempts') || 0; |
| 736 |
$cond->{login_attempts} = [ -and => { '!=' => undef }, { -not_in => [0, 1..$fails-1 ] } ]; # -not_in does not like undef |
859 |
$cond->{login_attempts} = |
|
|
860 |
[ -and => { '!=' => undef }, { -not_in => [ 0, 1 .. $fails - 1 ] } ] |
| 861 |
; # -not_in does not like undef |
| 737 |
} |
862 |
} |
| 738 |
return $class->search( $cond ); |
863 |
return $class->search($cond); |
| 739 |
} |
864 |
} |
| 740 |
|
865 |
|
| 741 |
=head3 search_anonymized |
866 |
=head3 search_anonymized |
|
Lines 749-768
sub search_anonymize_candidates {
Link Here
|
| 749 |
=cut |
874 |
=cut |
| 750 |
|
875 |
|
| 751 |
sub search_anonymized { |
876 |
sub search_anonymized { |
| 752 |
my ( $class ) = @_; |
877 |
my ($class) = @_; |
| 753 |
|
878 |
|
| 754 |
my $delay = C4::Context->preference('PatronRemovalDelay'); |
879 |
my $delay = C4::Context->preference('PatronRemovalDelay'); |
| 755 |
if( !defined($delay) || $delay eq q{} ) { |
880 |
if ( !defined($delay) || $delay eq q{} ) { |
|
|
881 |
|
| 756 |
# return empty set |
882 |
# return empty set |
| 757 |
return $class->search({ borrowernumber => undef }); |
883 |
return $class->search( { borrowernumber => undef } ); |
| 758 |
} |
884 |
} |
| 759 |
my $cond = {}; |
885 |
my $cond = {}; |
| 760 |
my $parser = Koha::Database->new->schema->storage->datetime_parser; |
886 |
my $parser = Koha::Database->new->schema->storage->datetime_parser; |
| 761 |
my $dt = dt_from_string()->subtract( days => $delay ); |
887 |
my $dt = dt_from_string()->subtract( days => $delay ); |
| 762 |
my $str = $parser->format_datetime($dt); |
888 |
my $str = $parser->format_datetime($dt); |
| 763 |
$cond->{dateexpiry} = { '<=' => $str }; |
889 |
$cond->{dateexpiry} = { '<=' => $str }; |
| 764 |
$cond->{anonymized} = 1; |
890 |
$cond->{anonymized} = 1; |
| 765 |
return $class->search( $cond ); |
891 |
return $class->search($cond); |
| 766 |
} |
892 |
} |
| 767 |
|
893 |
|
| 768 |
=head3 lock |
894 |
=head3 lock |
|
Lines 777-783
sub search_anonymized {
Link Here
|
| 777 |
sub lock { |
903 |
sub lock { |
| 778 |
my ( $self, $params ) = @_; |
904 |
my ( $self, $params ) = @_; |
| 779 |
my $count = $self->count; |
905 |
my $count = $self->count; |
| 780 |
while( my $patron = $self->next ) { |
906 |
while ( my $patron = $self->next ) { |
| 781 |
$patron->lock($params); |
907 |
$patron->lock($params); |
| 782 |
} |
908 |
} |
| 783 |
} |
909 |
} |
|
Lines 792-800
sub lock {
Link Here
|
| 792 |
=cut |
918 |
=cut |
| 793 |
|
919 |
|
| 794 |
sub anonymize { |
920 |
sub anonymize { |
| 795 |
my ( $self ) = @_; |
921 |
my ($self) = @_; |
| 796 |
my $count = $self->count; |
922 |
my $count = $self->count; |
| 797 |
while( my $patron = $self->next ) { |
923 |
while ( my $patron = $self->next ) { |
| 798 |
$patron->anonymize; |
924 |
$patron->anonymize; |
| 799 |
} |
925 |
} |
| 800 |
} |
926 |
} |
|
Lines 824-850
sub search_patrons_to_update_category {
Link Here
|
| 824 |
my %query; |
950 |
my %query; |
| 825 |
my $search_params; |
951 |
my $search_params; |
| 826 |
|
952 |
|
| 827 |
my $cat_from = Koha::Patron::Categories->find($params->{from}); |
953 |
my $cat_from = Koha::Patron::Categories->find( $params->{from} ); |
| 828 |
$search_params->{categorycode}=$params->{from}; |
954 |
$search_params->{categorycode} = $params->{from}; |
| 829 |
if ($params->{too_young} || $params->{too_old}){ |
955 |
if ( $params->{too_young} || $params->{too_old} ) { |
| 830 |
my $dtf = Koha::Database->new->schema->storage->datetime_parser; |
956 |
my $dtf = Koha::Database->new->schema->storage->datetime_parser; |
| 831 |
if( $cat_from->dateofbirthrequired && $params->{too_young} ) { |
957 |
if ( $cat_from->dateofbirthrequired && $params->{too_young} ) { |
| 832 |
my $date_after = dt_from_string()->subtract( years => $cat_from->dateofbirthrequired); |
958 |
my $date_after = dt_from_string() |
| 833 |
$search_params->{dateofbirth}{'>'} = $dtf->format_datetime( $date_after ); |
959 |
->subtract( years => $cat_from->dateofbirthrequired ); |
|
|
960 |
$search_params->{dateofbirth}{'>'} = |
| 961 |
$dtf->format_datetime($date_after); |
| 834 |
} |
962 |
} |
| 835 |
if( $cat_from->upperagelimit && $params->{too_old} ) { |
963 |
if ( $cat_from->upperagelimit && $params->{too_old} ) { |
| 836 |
my $date_before = dt_from_string()->subtract( years => $cat_from->upperagelimit); |
964 |
my $date_before = |
| 837 |
$search_params->{dateofbirth}{'<'} = $dtf->format_datetime( $date_before ); |
965 |
dt_from_string()->subtract( years => $cat_from->upperagelimit ); |
|
|
966 |
$search_params->{dateofbirth}{'<'} = |
| 967 |
$dtf->format_datetime($date_before); |
| 838 |
} |
968 |
} |
| 839 |
} |
969 |
} |
| 840 |
if ($params->{fine_min} || $params->{fine_max}) { |
970 |
if ( $params->{fine_min} || $params->{fine_max} ) { |
| 841 |
$query{join} = ["accountlines"]; |
971 |
$query{join} = ["accountlines"]; |
| 842 |
$query{columns} = ["borrowernumber"]; |
972 |
$query{columns} = ["borrowernumber"]; |
| 843 |
$query{group_by} = ["borrowernumber"]; |
973 |
$query{group_by} = ["borrowernumber"]; |
| 844 |
$query{having} = \['COALESCE(sum(accountlines.amountoutstanding),0) <= ?',$params->{fine_max}] if defined $params->{fine_max}; |
974 |
$query{having} = \[ |
| 845 |
$query{having} = \['COALESCE(sum(accountlines.amountoutstanding),0) >= ?',$params->{fine_min}] if defined $params->{fine_min}; |
975 |
'COALESCE(sum(accountlines.amountoutstanding),0) <= ?', |
|
|
976 |
$params->{fine_max} |
| 977 |
] |
| 978 |
if defined $params->{fine_max}; |
| 979 |
$query{having} = \[ |
| 980 |
'COALESCE(sum(accountlines.amountoutstanding),0) >= ?', |
| 981 |
$params->{fine_min} |
| 982 |
] |
| 983 |
if defined $params->{fine_min}; |
| 846 |
} |
984 |
} |
| 847 |
return $self->search($search_params,\%query); |
985 |
return $self->search( $search_params, \%query ); |
| 848 |
} |
986 |
} |
| 849 |
|
987 |
|
| 850 |
=head3 update_category_to |
988 |
=head3 update_category_to |
|
Lines 862-870
call search_patrons_to_update to filter the Koha::Patrons set
Link Here
|
| 862 |
sub update_category_to { |
1000 |
sub update_category_to { |
| 863 |
my ( $self, $params ) = @_; |
1001 |
my ( $self, $params ) = @_; |
| 864 |
my $counter = 0; |
1002 |
my $counter = 0; |
| 865 |
while( my $patron = $self->next ) { |
1003 |
while ( my $patron = $self->next ) { |
| 866 |
$counter++; |
1004 |
$counter++; |
| 867 |
$patron->categorycode($params->{category})->store(); |
1005 |
$patron->categorycode( $params->{category} )->store(); |
| 868 |
} |
1006 |
} |
| 869 |
return $counter; |
1007 |
return $counter; |
| 870 |
} |
1008 |
} |
|
Lines 904-910
sub filter_by_attribute_value {
Link Here
|
| 904 |
return Koha::Patrons->_new_from_dbic($rs); |
1042 |
return Koha::Patrons->_new_from_dbic($rs); |
| 905 |
} |
1043 |
} |
| 906 |
|
1044 |
|
| 907 |
|
|
|
| 908 |
=head3 _type |
1045 |
=head3 _type |
| 909 |
|
1046 |
|
| 910 |
=cut |
1047 |
=cut |