| Lines 225-230
          sub filter_by_bookable {
      
      
        Link Here | 
        
          | 225 |     ); | 225 |     ); | 
        
          | 226 | } | 226 | } | 
        
          | 227 |  | 227 |  | 
            
              |  |  | 228 | sub filter_by_checked_out { | 
            
              | 229 |     my ( $self, $params ) = @_; | 
            
              | 230 |  | 
            
              | 231 |     $params //= {}; | 
            
              | 232 |     my $checkouts = Koha::Checkouts->search( | 
            
              | 233 |         { %$params, 'me.itemnumber' => [ $self->get_column('itemnumber') ], }, | 
            
              | 234 |         { | 
            
              | 235 |             columns  => ['itemnumber'], | 
            
              | 236 |             distinct => 1 | 
            
              | 237 |         } | 
            
              | 238 |     )->_resultset->as_query; | 
            
              | 239 |  | 
            
              | 240 |     return $self->search( { 'me.itemnumber' => { '-in' => $checkouts } } ); | 
            
              | 241 | } | 
            
              | 242 |  | 
            
              | 243 | sub filter_by_in_transit { | 
            
              | 244 |     my ( $self, $params ) = @_; | 
            
              | 245 |  | 
            
              | 246 |     $params //= {}; | 
            
              | 247 |     my $transfers = Koha::Item::Transfers->search( | 
            
              | 248 |         { %$params, 'me.itemnumber' => [ $self->get_column('itemnumber') ], }, | 
            
              | 249 |         { | 
            
              | 250 |             columns  => ['itemnumber'], | 
            
              | 251 |             distinct => 1 | 
            
              | 252 |         } | 
            
              | 253 |     )->_resultset->as_query; | 
            
              | 254 |  | 
            
              | 255 |     return $self->search( { 'me.itemnumber' => { '-in' => $transfers } } ); | 
            
              | 256 | } | 
            
              | 257 |  | 
            
              | 258 | sub filter_by_for_loan { | 
            
              | 259 |  | 
            
              | 260 | } | 
            
              | 261 |  | 
            
              | 262 | sub filter_by_has_holds { | 
            
              | 263 |     my ( $self, $params ) = @_; | 
            
              | 264 |  | 
            
              | 265 |     $params //= {}; | 
            
              | 266 |     my $holds = Koha::Holds->search( | 
            
              | 267 |         { %$params, 'me.itemnumber' => [ $self->get_column('itemnumber') ], }, | 
            
              | 268 |         { | 
            
              | 269 |             columns  => ['itemnumber'], | 
            
              | 270 |             distinct => 1 | 
            
              | 271 |         } | 
            
              | 272 |     )->_resultset->as_query; | 
            
              | 273 |  | 
            
              | 274 |     return $self->search( { 'me.itemnumber' => { '-in' => $holds } } ); | 
            
              | 275 | } | 
            
              | 276 |  | 
            
              | 277 | sub filter_by_has_recalls { | 
            
              | 278 |     my ( $self, $params ) = @_; | 
            
              | 279 |  | 
            
              | 280 |     $params //= {}; | 
            
              | 281 |     my $recalls = Koha::Recalls->search( | 
            
              | 282 |         { %$params, 'me.itemnumber' => [ $self->get_column('itemnumber') ], }, | 
            
              | 283 |         { | 
            
              | 284 |             columns  => ['itemnumber'], | 
            
              | 285 |             distinct => 1 | 
            
              | 286 |         } | 
            
              | 287 |     )->_resultset->as_query; | 
            
              | 288 |  | 
            
              | 289 |     return $self->search( { 'me.itemnumber' => { '-in' => $recalls } } ); | 
            
              | 290 | } | 
            
              | 291 |  | 
            
              | 292 | sub filter_by_available { | 
            
              | 293 |     my ($self) = @_; | 
            
              | 294 |  | 
            
              | 295 |     my @all_itemnumbers       = $self->get_column('itemnumber'); | 
            
              | 296 |     my @item_types_notforloan = Koha::ItemTypes->search( { notforloan => { '!=' => 0 } } )->get_column('itemtype'); | 
            
              | 297 |     my @not_available_itemnumbers; | 
            
              | 298 |     push @not_available_itemnumbers, $self->filter_by_checked_out->get_column('itemnumber'); | 
            
              | 299 |     push @not_available_itemnumbers, $self->filter_by_in_transit->get_column('itemnumber'); | 
            
              | 300 |     push @not_available_itemnumbers, $self->search( | 
            
              | 301 |         { | 
            
              | 302 |             itemlost => 0, withdrawn => 0, damaged => 0, notforloan => 0, | 
            
              | 303 |             itype => { -not_in => \@item_types_notforloan }, restricted => 0, | 
            
              | 304 |         } | 
            
              | 305 |     )->get_column('itemnumber'); | 
            
              | 306 |     push @not_available_itemnumbers, $self->filter_by_has_holds->get_column('itemnumber'); | 
            
              | 307 |     push @not_available_itemnumbers, $self->filter_by_has_recalls->get_column('itemnumber'); | 
            
              | 308 |  | 
            
              | 309 |     return Koha::Items->search( { 'me.itemnumber' => [ array_minus @all_itemnumbers, @not_available_itemnumbers ] } ); | 
            
              | 310 | } | 
            
              | 311 |  | 
        
          | 228 | =head3 move_to_biblio | 312 | =head3 move_to_biblio | 
        
          | 229 |  | 313 |  | 
        
          | 230 |  $items->move_to_biblio($to_biblio); | 314 |  $items->move_to_biblio($to_biblio); | 
  
    | Lines 498-503
          sub apply_regex {
      
      
        Link Here | 
        
          | 498 |     return $value; | 582 |     return $value; | 
        
          | 499 | } | 583 | } | 
        
          | 500 |  | 584 |  | 
            
              |  |  | 585 | sub search { | 
            
              | 586 |     my ( $self, $params, $attributes ) = @_; | 
            
              | 587 |     my $status = ( $params && ref($params) eq 'HASH' ) ? delete $params->{_status} : undef; | 
            
              | 588 |     if ($status) { | 
            
              | 589 |         if ( $status eq 'checked_out' ) { | 
            
              | 590 |             $self = $self->filter_by_checked_out( { onsite_checkout => 0 } ); | 
            
              | 591 |         } | 
            
              | 592 |         if ( $status eq 'local_use' ) { | 
            
              | 593 |             $self = $self->filter_by_checked_out( { onsite_checkout => 1 } ); | 
            
              | 594 |         } | 
            
              | 595 |         if ( $status eq 'in_transit' ) { | 
            
              | 596 |             $self = $self->filter_by_in_transit; | 
            
              | 597 |         } | 
            
              | 598 |         if ( $status eq 'lost' ) { | 
            
              | 599 |             $self = $self->search( { itemlost => { '!=' => 0 } } ); | 
            
              | 600 |         } | 
            
              | 601 |         if ( $status eq 'withdrawn' ) { | 
            
              | 602 |             $self = $self->search( { withdrawn => { '!=' => 0 } } ); | 
            
              | 603 |         } | 
            
              | 604 |         if ( $status eq 'damaged' ) { | 
            
              | 605 |             $self = $self->search( { damaged => { '!=' => 0 } } ); | 
            
              | 606 |         } | 
            
              | 607 |         if ( $status eq 'not_for_loan' ) { | 
            
              | 608 |             my @item_types_notforloan = | 
            
              | 609 |                 Koha::ItemTypes->search( { notforloan => { '!=' => 0 } } )->get_column('itemtype'); | 
            
              | 610 |             $self = $self->search( [ { notforloan => { '!=' => 0 } }, { 'me.itype' => \@item_types_notforloan } ] ); | 
            
              | 611 |         } | 
            
              | 612 |         if ( $status eq 'on_hold' ) { | 
            
              | 613 |             $self = $self->filter_by_has_holds; | 
            
              | 614 |         } | 
            
              | 615 |         if ( $status eq 'recalled' ) { | 
            
              | 616 |             $self = $self->filter_by_has_recalls; | 
            
              | 617 |         } | 
            
              | 618 |  | 
            
              | 619 |         if ( $status eq 'available' ) { | 
            
              | 620 |             $self = $self->filter_by_available; | 
            
              | 621 |         } | 
            
              | 622 |  | 
            
              | 623 |         if ( $status eq 'restricted' ) { | 
            
              | 624 |             $self = $self->search( { restricted => { '!=' => 0 } } ); | 
            
              | 625 |         } | 
            
              | 626 |     } | 
            
              | 627 |  | 
            
              | 628 |     return $self->SUPER::search( $params, $attributes ); | 
            
              | 629 | } | 
            
              | 630 |  | 
        
          | 501 | =head3 search_ordered | 631 | =head3 search_ordered | 
        
          | 502 |  | 632 |  | 
        
          | 503 |  $items->search_ordered; | 633 |  $items->search_ordered; |