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