|
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 |