| Lines 196-201
          sub filter_by_bookable {
      
      
        Link Here | 
        
          | 196 |     return $self->search($params); | 196 |     return $self->search($params); | 
        
          | 197 | } | 197 | } | 
        
          | 198 |  | 198 |  | 
            
              |  |  | 199 | sub filter_by_checked_out { | 
            
              | 200 |     my ( $self, $params ) = @_; | 
            
              | 201 |  | 
            
              | 202 |     $params //= {}; | 
            
              | 203 |     my $checkouts = Koha::Checkouts->search( | 
            
              | 204 |         { %$params, 'me.itemnumber' => [ $self->get_column('itemnumber') ], }, | 
            
              | 205 |         { | 
            
              | 206 |             columns  => ['itemnumber'], | 
            
              | 207 |             distinct => 1 | 
            
              | 208 |         } | 
            
              | 209 |     )->_resultset->as_query; | 
            
              | 210 |  | 
            
              | 211 |     return $self->search( { 'me.itemnumber' => { '-in' => $checkouts } } ); | 
            
              | 212 | } | 
            
              | 213 |  | 
            
              | 214 | sub filter_by_in_transit { | 
            
              | 215 |     my ( $self, $params ) = @_; | 
            
              | 216 |  | 
            
              | 217 |     $params //= {}; | 
            
              | 218 |     my $transfers = Koha::Item::Transfers->search( | 
            
              | 219 |         { %$params, 'me.itemnumber' => [ $self->get_column('itemnumber') ], }, | 
            
              | 220 |         { | 
            
              | 221 |             columns  => ['itemnumber'], | 
            
              | 222 |             distinct => 1 | 
            
              | 223 |         } | 
            
              | 224 |     )->_resultset->as_query; | 
            
              | 225 |  | 
            
              | 226 |     return $self->search( { 'me.itemnumber' => { '-in' => $transfers } } ); | 
            
              | 227 | } | 
            
              | 228 |  | 
            
              | 229 | sub filter_by_for_loan { | 
            
              | 230 |  | 
            
              | 231 | } | 
            
              | 232 |  | 
            
              | 233 | sub filter_by_has_holds { | 
            
              | 234 |     my ( $self, $params ) = @_; | 
            
              | 235 |  | 
            
              | 236 |     $params //= {}; | 
            
              | 237 |     my $holds = Koha::Holds->search( | 
            
              | 238 |         { %$params, 'me.itemnumber' => [ $self->get_column('itemnumber') ], }, | 
            
              | 239 |         { | 
            
              | 240 |             columns  => ['itemnumber'], | 
            
              | 241 |             distinct => 1 | 
            
              | 242 |         } | 
            
              | 243 |     )->_resultset->as_query; | 
            
              | 244 |  | 
            
              | 245 |     return $self->search( { 'me.itemnumber' => { '-in' => $holds } } ); | 
            
              | 246 | } | 
            
              | 247 |  | 
            
              | 248 | sub filter_by_has_recalls { | 
            
              | 249 |     my ( $self, $params ) = @_; | 
            
              | 250 |  | 
            
              | 251 |     $params //= {}; | 
            
              | 252 |     my $recalls = Koha::Recalls->search( | 
            
              | 253 |         { %$params, 'me.itemnumber' => [ $self->get_column('itemnumber') ], }, | 
            
              | 254 |         { | 
            
              | 255 |             columns  => ['itemnumber'], | 
            
              | 256 |             distinct => 1 | 
            
              | 257 |         } | 
            
              | 258 |     )->_resultset->as_query; | 
            
              | 259 |  | 
            
              | 260 |     return $self->search( { 'me.itemnumber' => { '-in' => $recalls } } ); | 
            
              | 261 | } | 
            
              | 262 |  | 
            
              | 263 | sub filter_by_available { | 
            
              | 264 |     my ($self) = @_; | 
            
              | 265 |  | 
            
              | 266 |     my @all_itemnumbers       = $self->get_column('itemnumber'); | 
            
              | 267 |     my @item_types_notforloan = Koha::ItemTypes->search( { notforloan => { '!=' => 0 } } )->get_column('itemtype'); | 
            
              | 268 |     my @not_available_itemnumbers; | 
            
              | 269 |     push @not_available_itemnumbers, $self->filter_by_checked_out->get_column('itemnumber'); | 
            
              | 270 |     push @not_available_itemnumbers, $self->filter_by_in_transit->get_column('itemnumber'); | 
            
              | 271 |     push @not_available_itemnumbers, $self->search( | 
            
              | 272 |         { | 
            
              | 273 |             itemlost => 0, withdrawn => 0, damaged => 0, notforloan => 0, | 
            
              | 274 |             itype => { -not_in => \@item_types_notforloan }, restricted => 0, | 
            
              | 275 |         } | 
            
              | 276 |     )->get_column('itemnumber'); | 
            
              | 277 |     push @not_available_itemnumbers, $self->filter_by_has_holds->get_column('itemnumber'); | 
            
              | 278 |     push @not_available_itemnumbers, $self->filter_by_has_recalls->get_column('itemnumber'); | 
            
              | 279 |  | 
            
              | 280 |     return Koha::Items->search( { 'me.itemnumber' => [ array_minus @all_itemnumbers, @not_available_itemnumbers ] } ); | 
            
              | 281 | } | 
            
              | 282 |  | 
            
              | 283 |  | 
        
          | 199 | =head3 move_to_biblio | 284 | =head3 move_to_biblio | 
        
          | 200 |  | 285 |  | 
        
          | 201 |  $items->move_to_biblio($to_biblio); | 286 |  $items->move_to_biblio($to_biblio); | 
  
    | Lines 459-464
          sub apply_regex {
      
      
        Link Here | 
        
          | 459 |     return $value; | 544 |     return $value; | 
        
          | 460 | } | 545 | } | 
        
          | 461 |  | 546 |  | 
            
              |  |  | 547 | sub search { | 
            
              | 548 |     my ( $self, $params, $attributes ) = @_; | 
            
              | 549 |     my $status = ( $params && ref($params) eq 'HASH' ) ? delete $params->{_status} : undef; | 
            
              | 550 |     if ($status) { | 
            
              | 551 |         if ( $status eq 'checked_out' ) { | 
            
              | 552 |             $self = $self->filter_by_checked_out( { onsite_checkout => 0 } ); | 
            
              | 553 |         } | 
            
              | 554 |         if ( $status eq 'local_use' ) { | 
            
              | 555 |             $self = $self->filter_by_checked_out( { onsite_checkout => 1 } ); | 
            
              | 556 |         } | 
            
              | 557 |         if ( $status eq 'in_transit' ) { | 
            
              | 558 |             $self = $self->filter_by_in_transit; | 
            
              | 559 |         } | 
            
              | 560 |         if ( $status eq 'lost' ) { | 
            
              | 561 |             $self = $self->search( { itemlost => { '!=' => 0 } } ); | 
            
              | 562 |         } | 
            
              | 563 |         if ( $status eq 'withdrawn' ) { | 
            
              | 564 |             $self = $self->search( { withdrawn => { '!=' => 0 } } ); | 
            
              | 565 |         } | 
            
              | 566 |         if ( $status eq 'damaged' ) { | 
            
              | 567 |             $self = $self->search( { damaged => { '!=' => 0 } } ); | 
            
              | 568 |         } | 
            
              | 569 |         if ( $status eq 'not_for_loan' ) { | 
            
              | 570 |             my @item_types_notforloan = Koha::ItemTypes->search( { notforloan => { '!=' => 0 } } )->column('itemtype'); | 
            
              | 571 |             $self = $self->search( [ { notforloan => { '!=' => 0 } }, { itype => \@item_types_notforloan } ] ); | 
            
              | 572 |         } | 
            
              | 573 |         if ( $status eq 'on_hold' ) { | 
            
              | 574 |             $self = $self->filter_by_has_holds; | 
            
              | 575 |         } | 
            
              | 576 |         if ( $status eq 'recalled' ) { | 
            
              | 577 |             $self = $self->filter_by_has_recalls; | 
            
              | 578 |         } | 
            
              | 579 |  | 
            
              | 580 |         if ( $status eq 'available' ) { | 
            
              | 581 |             $self = $self->filter_by_available; | 
            
              | 582 |         } | 
            
              | 583 |  | 
            
              | 584 |         if ( $status eq 'restricted' ) { | 
            
              | 585 |             $self = $self->search( { restricted => { '!=' => 0 } } ); | 
            
              | 586 |         } | 
            
              | 587 |     } | 
            
              | 588 |  | 
            
              | 589 |     return $self->SUPER::search( $params, $attributes ); | 
            
              | 590 | } | 
            
              | 591 |  | 
        
          | 462 | =head3 search_ordered | 592 | =head3 search_ordered | 
        
          | 463 |  | 593 |  | 
        
          | 464 |  $items->search_ordered; | 594 |  $items->search_ordered; |