Lines 842-847
sub _after_item_action_hooks {
Link Here
|
842 |
} |
842 |
} |
843 |
} |
843 |
} |
844 |
|
844 |
|
|
|
845 |
=head3 recall |
846 |
|
847 |
my $recall = $item->recall; |
848 |
|
849 |
Return the relevant recall for this item |
850 |
|
851 |
=cut |
852 |
|
853 |
sub recall { |
854 |
my ( $self ) = @_; |
855 |
my $recalls = Koha::Recalls->search({ biblionumber => $self->biblionumber, old => undef }, { order_by => { -asc => 'recalldate' } }); |
856 |
foreach my $recall (@$recall_rs) { |
857 |
if ( $recall->item_level_recall and $recall->itemnumber == $self->itemnumber ){ |
858 |
return $recall; |
859 |
} |
860 |
} |
861 |
# no item-level recall to return, so return earliest biblio-level |
862 |
# FIXME: eventually this will be based on priority |
863 |
return $recalls->first; |
864 |
} |
865 |
|
866 |
=head3 can_be_recalled |
867 |
|
868 |
if ( $item->can_be_recalled({ borrower => $borrower_object }) ) # do recall |
869 |
|
870 |
Does item-level checks and returns if items can be recalled by this borrower |
871 |
|
872 |
=cut |
873 |
|
874 |
sub can_be_recalled { |
875 |
my ( $self, $params ) = @_; |
876 |
|
877 |
return 0 if !( C4::Context->preference('UseRecalls') ); |
878 |
|
879 |
my $borrower = $params->{borrower}; |
880 |
|
881 |
my $branchcode = C4::Context->userenv->{'branch'}; |
882 |
if ( $borrower ) { |
883 |
$branchcode = C4::Circulation::_GetCircControlBranch( $self->unblessed, $borrower->unblessed ); |
884 |
} |
885 |
|
886 |
# Check the circulation rule for each relevant itemtype for this item |
887 |
my $rule = Koha::CirculationRules->get_effective_rules({ |
888 |
branchcode => $branchcode, |
889 |
categorycode => $borrower ? $borrower->categorycode : undef, |
890 |
itemtype => $self->effective_itemtype, |
891 |
rules => [ |
892 |
'recalls_allowed', |
893 |
'recalls_per_record', |
894 |
'on_shelf_recalls', |
895 |
], |
896 |
}); |
897 |
|
898 |
# check recalls allowed has been set and is not zero |
899 |
return 0 if ( $rule->{recalls_allowed} == 0 || !defined($rule->{recalls_allowed}) ); |
900 |
|
901 |
if ( $borrower ) { |
902 |
# check borrower has not reached open recalls allowed limit |
903 |
return 0 if ( $borrower->recalls->count >= $rule->{recalls_allowed} ); |
904 |
|
905 |
# check borrower has not reach open recalls allowed per record limit |
906 |
return 0 if ( $borrower->recalls({ biblionumber => $self->biblionumber })->count >= $rule->{recalls_per_record} ); |
907 |
} |
908 |
|
909 |
# check item availability |
910 |
# items are unavailable for recall if they are lost, withdrawn or notforloan |
911 |
my @items = Koha::Items->search({ biblionumber => $self->biblionumber, itemlost => 0, withdrawn => 0, notforloan => 0 }); |
912 |
|
913 |
# if there are no available items at all, no recall can be placed |
914 |
return 0 if ( scalar @items == 0 ); |
915 |
|
916 |
my $checked_out_count = 0; |
917 |
foreach (@items) { |
918 |
if ( Koha::Checkouts->search({ itemnumber => $_->itemnumber })->count > 0 ){ $checked_out_count++; } |
919 |
} |
920 |
|
921 |
# can't recall if on shelf recalls only allowed when all unavailable, but items are still available for checkout |
922 |
return 0 if ( $rule->{on_shelf_recalls} == 2 && $checked_out_count < scalar @items ); |
923 |
|
924 |
# check if on shelf recalls allowed when any unavailable, but no items have been checked out |
925 |
# can't recall if no items have been checked out |
926 |
return 0 if ( $rule->{on_shelf_recalls} == 0 && $checked_out_count == 0 ); |
927 |
|
928 |
# check if on shelf recalls allowed always, but no items have been checked out |
929 |
# can't recall if no items have been checked out |
930 |
return 0 if ( $rule->{on_shelf_recalls} == 1 && $checked_out_count == 0 ); |
931 |
|
932 |
# check if this patron has already recalled this item |
933 |
return 0 if ( Koha::Recalls->search({ itemnumber => $self->itemnumber, borrowernumber => $borrower->borrowernumber, old => undef })->count > 0 ); |
934 |
|
935 |
# check if this patron has already checked out this item |
936 |
return 0 if ( Koha::Checkouts->search({ itemnumber => $self->itemnumber, borrowernumber => $borrower->borrowernumber })->count > 0 ); |
937 |
|
938 |
# check if this patron has already reserved this item |
939 |
return 0 if ( Koha::Holds->search({ itemnumber => $self->itemnumber, borrowernumber => $borrower->borrowernumber })->count > 0 ); |
940 |
|
941 |
# check if this item is not checked out - if not checked out, can't be recalled |
942 |
return 0 if ( !defined( $self->checkout ) ); |
943 |
|
944 |
# check if this item is not for loan, withdrawn or lost |
945 |
return 0 if ( $self->notforloan != 0 ); |
946 |
return 0 if ( $self->itemlost != 0 ); |
947 |
return 0 if ( $self->withdrawn != 0 ); |
948 |
|
949 |
# can recall |
950 |
return 1; |
951 |
} |
952 |
|
953 |
=head3 can_set_waiting_recall |
954 |
|
955 |
if ( $item->can_set_waiting_recall ) { # allocate item as waiting for recall |
956 |
|
957 |
Checks item type and branch of circ rules to return whether this item can be used to fill a recall. |
958 |
At this point the item has already been recalled. We are now at the checkin and set waiting stage. |
959 |
|
960 |
=cut |
961 |
|
962 |
sub can_set_waiting_recall { |
963 |
my ( $self ) = @_; |
964 |
|
965 |
return 0 if !( C4::Context->preference('UseRecalls') ); |
966 |
|
967 |
my $branchcode = $self->holdingbranch; |
968 |
if ( C4::Context->preference('CircControl') eq 'PickupLibrary' and C4::Context->userenv and C4::Context->userenv->{'branch'} ) { |
969 |
$branchcode = C4::Context->userenv->{'branch'}; |
970 |
} else { |
971 |
$branchcode = ( C4::Context->preference('HomeOrHoldingBranch') eq 'homebranch' ) ? $self->homebranch : $self->holdingbranch; |
972 |
} |
973 |
|
974 |
# Check the circulation rule for each relevant itemtype for this item |
975 |
my $rule = Koha::CirculationRules->get_effective_rules({ |
976 |
branchcode => $branchcode, |
977 |
categorycode => undef, |
978 |
itemtype => $self->effective_itemtype, |
979 |
rules => [ |
980 |
'recalls_allowed', |
981 |
], |
982 |
}); |
983 |
|
984 |
# check recalls allowed has been set and is not zero |
985 |
return 0 if ( $rule->{recalls_allowed} == 0 || !defined($rule->{recalls_allowed}) ); |
986 |
|
987 |
# check if this item is not for loan, withdrawn or lost |
988 |
return 0 if ( $self->notforloan != 0 ); |
989 |
return 0 if ( $self->itemlost != 0 ); |
990 |
return 0 if ( $self->withdrawn != 0 ); |
991 |
|
992 |
# can recall |
993 |
return 1; |
994 |
} |
845 |
=head3 _type |
995 |
=head3 _type |
846 |
|
996 |
|
847 |
=cut |
997 |
=cut |