Lines 572-578
C<$issuingimpossible> and C<$needsconfirmation> are some hashref.
Link Here
|
572 |
|
572 |
|
573 |
=over 4 |
573 |
=over 4 |
574 |
|
574 |
|
575 |
=item C<$borrower> hash with borrower informations (from GetMember) |
575 |
=item C<$borrower> hash with borrower informations (from Koha::Patron->unblessed) |
576 |
|
576 |
|
577 |
=item C<$barcode> is the bar code of the book being issued. |
577 |
=item C<$barcode> is the bar code of the book being issued. |
578 |
|
578 |
|
Lines 970-977
sub CanBookBeIssued {
Link Here
|
970 |
elsif ( $issue ) { |
970 |
elsif ( $issue ) { |
971 |
|
971 |
|
972 |
# issued to someone else |
972 |
# issued to someone else |
973 |
my $currborinfo = C4::Members::GetMember( borrowernumber => $issue->borrowernumber ); |
|
|
974 |
|
973 |
|
|
|
974 |
my $patron = Koha::Patrons->find( $issue->borrowernumber ); |
975 |
|
975 |
|
976 |
my ( $can_be_returned, $message ) = CanBookBeReturned( $item, C4::Context->userenv->{branch} ); |
976 |
my ( $can_be_returned, $message ) = CanBookBeReturned( $item, C4::Context->userenv->{branch} ); |
977 |
|
977 |
|
Lines 980-989
sub CanBookBeIssued {
Link Here
|
980 |
$issuingimpossible{branch_to_return} = $message; |
980 |
$issuingimpossible{branch_to_return} = $message; |
981 |
} else { |
981 |
} else { |
982 |
$needsconfirmation{ISSUED_TO_ANOTHER} = 1; |
982 |
$needsconfirmation{ISSUED_TO_ANOTHER} = 1; |
983 |
$needsconfirmation{issued_firstname} = $currborinfo->{'firstname'}; |
983 |
$needsconfirmation{issued_firstname} = $patron->firstname; |
984 |
$needsconfirmation{issued_surname} = $currborinfo->{'surname'}; |
984 |
$needsconfirmation{issued_surname} = $patron->surname; |
985 |
$needsconfirmation{issued_cardnumber} = $currborinfo->{'cardnumber'}; |
985 |
$needsconfirmation{issued_cardnumber} = $patron->cardnumber; |
986 |
$needsconfirmation{issued_borrowernumber} = $currborinfo->{'borrowernumber'}; |
986 |
$needsconfirmation{issued_borrowernumber} = $patron->borrowernumber; |
987 |
} |
987 |
} |
988 |
} |
988 |
} |
989 |
|
989 |
|
Lines 993-1020
sub CanBookBeIssued {
Link Here
|
993 |
if ($restype) { |
993 |
if ($restype) { |
994 |
my $resbor = $res->{'borrowernumber'}; |
994 |
my $resbor = $res->{'borrowernumber'}; |
995 |
if ( $resbor ne $borrower->{'borrowernumber'} ) { |
995 |
if ( $resbor ne $borrower->{'borrowernumber'} ) { |
996 |
my ( $resborrower ) = C4::Members::GetMember( borrowernumber => $resbor ); |
996 |
my $patron = Koha::Patrons->find( $resbor ); |
997 |
if ( $restype eq "Waiting" ) |
997 |
if ( $restype eq "Waiting" ) |
998 |
{ |
998 |
{ |
999 |
# The item is on reserve and waiting, but has been |
999 |
# The item is on reserve and waiting, but has been |
1000 |
# reserved by some other patron. |
1000 |
# reserved by some other patron. |
1001 |
$needsconfirmation{RESERVE_WAITING} = 1; |
1001 |
$needsconfirmation{RESERVE_WAITING} = 1; |
1002 |
$needsconfirmation{'resfirstname'} = $resborrower->{'firstname'}; |
1002 |
$needsconfirmation{'resfirstname'} = $patron->firstname; |
1003 |
$needsconfirmation{'ressurname'} = $resborrower->{'surname'}; |
1003 |
$needsconfirmation{'ressurname'} = $patron->surname; |
1004 |
$needsconfirmation{'rescardnumber'} = $resborrower->{'cardnumber'}; |
1004 |
$needsconfirmation{'rescardnumber'} = $patron->cardnumber; |
1005 |
$needsconfirmation{'resborrowernumber'} = $resborrower->{'borrowernumber'}; |
1005 |
$needsconfirmation{'resborrowernumber'} = $patron->borrowernumber; |
1006 |
$needsconfirmation{'resbranchcode'} = $res->{branchcode}; |
1006 |
$needsconfirmation{'resbranchcode'} = $res->{branchcode}; |
1007 |
$needsconfirmation{'reswaitingdate'} = $res->{'waitingdate'}; |
1007 |
$needsconfirmation{'reswaitingdate'} = $res->{'waitingdate'}; |
1008 |
} |
1008 |
} |
1009 |
elsif ( $restype eq "Reserved" ) { |
1009 |
elsif ( $restype eq "Reserved" ) { |
1010 |
# The item is on reserve for someone else. |
1010 |
# The item is on reserve for someone else. |
1011 |
$needsconfirmation{RESERVED} = 1; |
1011 |
$needsconfirmation{RESERVED} = 1; |
1012 |
$needsconfirmation{'resfirstname'} = $resborrower->{'firstname'}; |
1012 |
$needsconfirmation{'resfirstname'} = $patron->firstname; |
1013 |
$needsconfirmation{'ressurname'} = $resborrower->{'surname'}; |
1013 |
$needsconfirmation{'ressurname'} = $patron->surname; |
1014 |
$needsconfirmation{'rescardnumber'} = $resborrower->{'cardnumber'}; |
1014 |
$needsconfirmation{'rescardnumber'} = $patron->cardnumber; |
1015 |
$needsconfirmation{'resborrowernumber'} = $resborrower->{'borrowernumber'}; |
1015 |
$needsconfirmation{'resborrowernumber'} = $patron->borrowernumber; |
1016 |
$needsconfirmation{'resbranchcode'} = $res->{branchcode}; |
1016 |
$needsconfirmation{'resbranchcode'} = $patron->branchcode; |
1017 |
$needsconfirmation{'resreservedate'} = $res->{'reservedate'}; |
1017 |
$needsconfirmation{'resreservedate'} = $res->{reservedate}; |
1018 |
} |
1018 |
} |
1019 |
} |
1019 |
} |
1020 |
} |
1020 |
} |
Lines 1238-1244
Issue a book. Does no check, they are done in CanBookBeIssued. If we reach this
Link Here
|
1238 |
|
1238 |
|
1239 |
=over 4 |
1239 |
=over 4 |
1240 |
|
1240 |
|
1241 |
=item C<$borrower> is a hash with borrower informations (from GetMember). |
1241 |
=item C<$borrower> is a hash with borrower informations (from Koha::Patron->unblessed). |
1242 |
|
1242 |
|
1243 |
=item C<$barcode> is the barcode of the item being issued. |
1243 |
=item C<$barcode> is the barcode of the item being issued. |
1244 |
|
1244 |
|
Lines 1816-1822
sub AddReturn {
Link Here
|
1816 |
} |
1816 |
} |
1817 |
$branch = C4::Context->userenv->{'branch'} unless $branch; # we trust userenv to be a safe fallback/default |
1817 |
$branch = C4::Context->userenv->{'branch'} unless $branch; # we trust userenv to be a safe fallback/default |
1818 |
my $messages; |
1818 |
my $messages; |
1819 |
my $borrower; |
1819 |
my $patron; |
1820 |
my $doreturn = 1; |
1820 |
my $doreturn = 1; |
1821 |
my $validTransfert = 0; |
1821 |
my $validTransfert = 0; |
1822 |
my $stat_type = 'return'; |
1822 |
my $stat_type = 'return'; |
Lines 1835-1841
sub AddReturn {
Link Here
|
1835 |
|
1835 |
|
1836 |
my $issue = Koha::Checkouts->find( { itemnumber => $itemnumber } ); |
1836 |
my $issue = Koha::Checkouts->find( { itemnumber => $itemnumber } ); |
1837 |
if ( $issue ) { |
1837 |
if ( $issue ) { |
1838 |
$borrower = C4::Members::GetMember( borrowernumber => $issue->borrowernumber ) |
1838 |
$patron = Koha::Patrons->find( $issue->borrowernumber ) |
1839 |
or die "Data inconsistency: barcode $barcode (itemnumber:$itemnumber) claims to be issued to non-existent borrowernumber '" . $issue->borrowernumber . "'\n" |
1839 |
or die "Data inconsistency: barcode $barcode (itemnumber:$itemnumber) claims to be issued to non-existent borrowernumber '" . $issue->borrowernumber . "'\n" |
1840 |
. Dumper($issue->unblessed) . "\n"; |
1840 |
. Dumper($issue->unblessed) . "\n"; |
1841 |
} else { |
1841 |
} else { |
Lines 1868-1874
sub AddReturn {
Link Here
|
1868 |
my $returnbranch = $item->{$hbr} || $branch ; |
1868 |
my $returnbranch = $item->{$hbr} || $branch ; |
1869 |
# if $hbr was "noreturn" or any other non-item table value, then it should 'float' (i.e. stay at this branch) |
1869 |
# if $hbr was "noreturn" or any other non-item table value, then it should 'float' (i.e. stay at this branch) |
1870 |
|
1870 |
|
1871 |
my $borrowernumber = $borrower->{'borrowernumber'} || undef; # we don't know if we had a borrower or not |
1871 |
my $borrowernumber = $patron ? $patron->borrowernumber : undef; # we don't know if we had a borrower or not |
|
|
1872 |
my $patron_unblessed = $patron ? $patron->unblessed : {}; |
1872 |
|
1873 |
|
1873 |
my $yaml = C4::Context->preference('UpdateNotForLoanStatusOnCheckin'); |
1874 |
my $yaml = C4::Context->preference('UpdateNotForLoanStatusOnCheckin'); |
1874 |
if ($yaml) { |
1875 |
if ($yaml) { |
Lines 1907-1913
sub AddReturn {
Link Here
|
1907 |
Rightbranch => $message |
1908 |
Rightbranch => $message |
1908 |
}; |
1909 |
}; |
1909 |
$doreturn = 0; |
1910 |
$doreturn = 0; |
1910 |
return ( $doreturn, $messages, $issue, $borrower ); |
1911 |
return ( $doreturn, $messages, $issue, $patron_unblessed); |
1911 |
} |
1912 |
} |
1912 |
|
1913 |
|
1913 |
if ( $item->{'withdrawn'} ) { # book has been cancelled |
1914 |
if ( $item->{'withdrawn'} ) { # book has been cancelled |
Lines 1921-1948
sub AddReturn {
Link Here
|
1921 |
if ($doreturn) { |
1922 |
if ($doreturn) { |
1922 |
my $is_overdue; |
1923 |
my $is_overdue; |
1923 |
die "The item is not issed and cannot be returned" unless $issue; # Just in case... |
1924 |
die "The item is not issed and cannot be returned" unless $issue; # Just in case... |
1924 |
$borrower or warn "AddReturn without current borrower"; |
1925 |
$patron or warn "AddReturn without current borrower"; |
1925 |
my $circControlBranch; |
1926 |
my $circControlBranch; |
1926 |
if ($dropbox) { |
1927 |
if ($dropbox) { |
1927 |
# define circControlBranch only if dropbox mode is set |
1928 |
# define circControlBranch only if dropbox mode is set |
1928 |
# don't allow dropbox mode to create an invalid entry in issues (issuedate > today) |
1929 |
# don't allow dropbox mode to create an invalid entry in issues (issuedate > today) |
1929 |
# FIXME: check issuedate > returndate, factoring in holidays |
1930 |
# FIXME: check issuedate > returndate, factoring in holidays |
1930 |
|
1931 |
|
1931 |
$circControlBranch = _GetCircControlBranch($item,$borrower); |
1932 |
$circControlBranch = _GetCircControlBranch($item,$patron_unblessed); |
1932 |
$is_overdue = $issue->is_overdue( $dropboxdate ); |
1933 |
$is_overdue = $issue->is_overdue( $dropboxdate ); |
1933 |
} else { |
1934 |
} else { |
1934 |
$is_overdue = $issue->is_overdue; |
1935 |
$is_overdue = $issue->is_overdue; |
1935 |
} |
1936 |
} |
1936 |
|
1937 |
|
1937 |
if ($borrowernumber) { |
1938 |
if ($patron) { |
1938 |
eval { |
1939 |
eval { |
1939 |
my $issue_id = MarkIssueReturned( $borrowernumber, $item->{'itemnumber'}, |
1940 |
my $issue_id = MarkIssueReturned( $borrowernumber, $item->{'itemnumber'}, |
1940 |
$circControlBranch, $return_date, $borrower->{'privacy'} ); |
1941 |
$circControlBranch, $return_date, $patron->privacy ); |
1941 |
$issue->issue_id($issue_id); |
1942 |
$issue->issue_id($issue_id); |
1942 |
}; |
1943 |
}; |
1943 |
unless ( $@ ) { |
1944 |
unless ( $@ ) { |
1944 |
if ( ( C4::Context->preference('CalculateFinesOnReturn') && $is_overdue ) || $return_date ) { |
1945 |
if ( ( C4::Context->preference('CalculateFinesOnReturn') && $is_overdue ) || $return_date ) { |
1945 |
_CalculateAndUpdateFine( { issue => $issue, item => $item, borrower => $borrower, return_date => $return_date } ); |
1946 |
_CalculateAndUpdateFine( { issue => $issue, item => $item, borrower => $patron_unblessed, return_date => $return_date } ); |
1946 |
} |
1947 |
} |
1947 |
} else { |
1948 |
} else { |
1948 |
$messages->{'Wrongbranch'} = { |
1949 |
$messages->{'Wrongbranch'} = { |
Lines 1950-1956
sub AddReturn {
Link Here
|
1950 |
Rightbranch => $message |
1951 |
Rightbranch => $message |
1951 |
}; |
1952 |
}; |
1952 |
carp $@; |
1953 |
carp $@; |
1953 |
return ( 0, { WasReturned => 0 }, $issue, $borrower ); |
1954 |
return ( 0, { WasReturned => 0 }, $issue, $patron_unblessed ); |
1954 |
} |
1955 |
} |
1955 |
|
1956 |
|
1956 |
# FIXME is the "= 1" right? This could be the borrower hash. |
1957 |
# FIXME is the "= 1" right? This could be the borrower hash. |
Lines 2022-2043
sub AddReturn {
Link Here
|
2022 |
if ( $issue and $issue->is_overdue ) { |
2023 |
if ( $issue and $issue->is_overdue ) { |
2023 |
# fix fine days |
2024 |
# fix fine days |
2024 |
$today = $dropboxdate if $dropbox; |
2025 |
$today = $dropboxdate if $dropbox; |
2025 |
my ($debardate,$reminder) = _debar_user_on_return( $borrower, $item, dt_from_string($issue->date_due), $today ); |
2026 |
my ($debardate,$reminder) = _debar_user_on_return( $patron_unblessed, $item, dt_from_string($issue->date_due), $today ); |
2026 |
if ($reminder){ |
2027 |
if ($reminder){ |
2027 |
$messages->{'PrevDebarred'} = $debardate; |
2028 |
$messages->{'PrevDebarred'} = $debardate; |
2028 |
} else { |
2029 |
} else { |
2029 |
$messages->{'Debarred'} = $debardate if $debardate; |
2030 |
$messages->{'Debarred'} = $debardate if $debardate; |
2030 |
} |
2031 |
} |
2031 |
# there's no overdue on the item but borrower had been previously debarred |
2032 |
# there's no overdue on the item but borrower had been previously debarred |
2032 |
} elsif ( $issue->date_due and $borrower->{'debarred'} ) { |
2033 |
} elsif ( $issue->date_due and $patron->debarred ) { |
2033 |
if ( $borrower->{debarred} eq "9999-12-31") { |
2034 |
if ( $patron->debarred eq "9999-12-31") { |
2034 |
$messages->{'ForeverDebarred'} = $borrower->{'debarred'}; |
2035 |
$messages->{'ForeverDebarred'} = $patron->debarred; |
2035 |
} else { |
2036 |
} else { |
2036 |
my $borrower_debar_dt = dt_from_string( $borrower->{debarred} ); |
2037 |
my $borrower_debar_dt = dt_from_string( $patron->debarred ); |
2037 |
$borrower_debar_dt->truncate(to => 'day'); |
2038 |
$borrower_debar_dt->truncate(to => 'day'); |
2038 |
my $today_dt = $today->clone()->truncate(to => 'day'); |
2039 |
my $today_dt = $today->clone()->truncate(to => 'day'); |
2039 |
if ( DateTime->compare( $borrower_debar_dt, $today_dt ) != -1 ) { |
2040 |
if ( DateTime->compare( $borrower_debar_dt, $today_dt ) != -1 ) { |
2040 |
$messages->{'PrevDebarred'} = $borrower->{'debarred'}; |
2041 |
$messages->{'PrevDebarred'} = $patron->debarred; |
2041 |
} |
2042 |
} |
2042 |
} |
2043 |
} |
2043 |
} |
2044 |
} |
Lines 2063-2091
sub AddReturn {
Link Here
|
2063 |
ccode => $item->{ ccode } |
2064 |
ccode => $item->{ ccode } |
2064 |
}); |
2065 |
}); |
2065 |
|
2066 |
|
2066 |
# Send a check-in slip. # NOTE: borrower may be undef. probably shouldn't try to send messages then. |
2067 |
# Send a check-in slip. # NOTE: borrower may be undef. Do not try to send messages then. |
2067 |
my $circulation_alert = 'C4::ItemCirculationAlertPreference'; |
2068 |
if ( $patron ) { |
2068 |
my %conditions = ( |
2069 |
my $circulation_alert = 'C4::ItemCirculationAlertPreference'; |
2069 |
branchcode => $branch, |
2070 |
my %conditions = ( |
2070 |
categorycode => $borrower->{categorycode}, |
2071 |
branchcode => $branch, |
2071 |
item_type => $item->{itype}, |
2072 |
categorycode => $patron->categorycode, |
2072 |
notification => 'CHECKIN', |
2073 |
item_type => $item->{itype}, |
2073 |
); |
2074 |
notification => 'CHECKIN', |
2074 |
if ($doreturn && $circulation_alert->is_enabled_for(\%conditions)) { |
2075 |
); |
2075 |
SendCirculationAlert({ |
2076 |
if ($doreturn && $circulation_alert->is_enabled_for(\%conditions)) { |
2076 |
type => 'CHECKIN', |
2077 |
SendCirculationAlert({ |
2077 |
item => $item, |
2078 |
type => 'CHECKIN', |
2078 |
borrower => $borrower, |
2079 |
item => $item, |
2079 |
branch => $branch, |
2080 |
borrower => $patron->unblessed, |
2080 |
}); |
2081 |
branch => $branch, |
2081 |
} |
2082 |
}); |
2082 |
|
2083 |
} |
2083 |
logaction("CIRCULATION", "RETURN", $borrowernumber, $item->{'itemnumber'}) |
2084 |
|
2084 |
if C4::Context->preference("ReturnLog"); |
2085 |
logaction("CIRCULATION", "RETURN", $borrowernumber, $item->{'itemnumber'}) |
2085 |
|
2086 |
if C4::Context->preference("ReturnLog"); |
|
|
2087 |
} |
2088 |
|
2086 |
# Remove any OVERDUES related debarment if the borrower has no overdues |
2089 |
# Remove any OVERDUES related debarment if the borrower has no overdues |
2087 |
if ( $borrowernumber |
2090 |
if ( $borrowernumber |
2088 |
&& $borrower->{'debarred'} |
2091 |
&& $patron->debarred |
2089 |
&& C4::Context->preference('AutoRemoveOverduesRestrictions') |
2092 |
&& C4::Context->preference('AutoRemoveOverduesRestrictions') |
2090 |
&& !Koha::Patrons->find( $borrowernumber )->has_overdues |
2093 |
&& !Koha::Patrons->find( $borrowernumber )->has_overdues |
2091 |
&& @{ GetDebarments({ borrowernumber => $borrowernumber, type => 'OVERDUES' }) } |
2094 |
&& @{ GetDebarments({ borrowernumber => $borrowernumber, type => 'OVERDUES' }) } |
Lines 2108-2114
sub AddReturn {
Link Here
|
2108 |
} |
2111 |
} |
2109 |
} |
2112 |
} |
2110 |
|
2113 |
|
2111 |
return ( $doreturn, $messages, $issue, $borrower ); |
2114 |
return ( $doreturn, $messages, $issue, ( $patron ? $patron->unblessed : {} )); |
2112 |
} |
2115 |
} |
2113 |
|
2116 |
|
2114 |
=head2 MarkIssueReturned |
2117 |
=head2 MarkIssueReturned |
Lines 2145-2151
sub MarkIssueReturned {
Link Here
|
2145 |
# Note that a warning should appear on the about page (System information tab). |
2148 |
# Note that a warning should appear on the about page (System information tab). |
2146 |
$anonymouspatron = C4::Context->preference('AnonymousPatron'); |
2149 |
$anonymouspatron = C4::Context->preference('AnonymousPatron'); |
2147 |
die "Fatal error: the patron ($borrowernumber) has requested their circulation history be anonymized on check-in, but the AnonymousPatron system preference is empty or not set correctly." |
2150 |
die "Fatal error: the patron ($borrowernumber) has requested their circulation history be anonymized on check-in, but the AnonymousPatron system preference is empty or not set correctly." |
2148 |
unless C4::Members::GetMember( borrowernumber => $anonymouspatron ); |
2151 |
unless Koha::Patrons->find( $anonymouspatron ); |
2149 |
} |
2152 |
} |
2150 |
my $database = Koha::Database->new(); |
2153 |
my $database = Koha::Database->new(); |
2151 |
my $schema = $database->schema; |
2154 |
my $schema = $database->schema; |
Lines 2628-2634
sub CanBookBeRenewed {
Link Here
|
2628 |
return ( 0, 'onsite_checkout' ) if $issue->onsite_checkout; |
2631 |
return ( 0, 'onsite_checkout' ) if $issue->onsite_checkout; |
2629 |
|
2632 |
|
2630 |
$borrowernumber ||= $issue->borrowernumber; |
2633 |
$borrowernumber ||= $issue->borrowernumber; |
2631 |
my $borrower = C4::Members::GetMember( borrowernumber => $borrowernumber ) |
2634 |
my $patron = Koha::Patrons->find( $borrowernumber ) |
2632 |
or return; |
2635 |
or return; |
2633 |
|
2636 |
|
2634 |
my ( $resfound, $resrec, undef ) = C4::Reserves::CheckReserves($itemnumber); |
2637 |
my ( $resfound, $resrec, undef ) = C4::Reserves::CheckReserves($itemnumber); |
Lines 2682-2688
sub CanBookBeRenewed {
Link Here
|
2682 |
my $item = GetItem($i); |
2685 |
my $item = GetItem($i); |
2683 |
next if IsItemOnHoldAndFound($i); |
2686 |
next if IsItemOnHoldAndFound($i); |
2684 |
for my $b (@borrowernumbers) { |
2687 |
for my $b (@borrowernumbers) { |
2685 |
my $borr = $borrowers{$b}//= C4::Members::GetMember(borrowernumber => $b); |
2688 |
my $borr = $borrowers{$b} //= Koha::Patrons->find( $b )->unblessed; |
2686 |
next unless IsAvailableForItemLevelRequest($item, $borr); |
2689 |
next unless IsAvailableForItemLevelRequest($item, $borr); |
2687 |
next unless CanItemBeReserved($b,$i); |
2690 |
next unless CanItemBeReserved($b,$i); |
2688 |
|
2691 |
|
Lines 2700-2708
sub CanBookBeRenewed {
Link Here
|
2700 |
|
2703 |
|
2701 |
return ( 1, undef ) if $override_limit; |
2704 |
return ( 1, undef ) if $override_limit; |
2702 |
|
2705 |
|
2703 |
my $branchcode = _GetCircControlBranch( $item, $borrower ); |
2706 |
my $branchcode = _GetCircControlBranch( $item, $patron->unblessed ); |
2704 |
my $issuing_rule = Koha::IssuingRules->get_effective_issuing_rule( |
2707 |
my $issuing_rule = Koha::IssuingRules->get_effective_issuing_rule( |
2705 |
{ categorycode => $borrower->{categorycode}, |
2708 |
{ categorycode => $patron->categorycode, |
2706 |
itemtype => $item->{itype}, |
2709 |
itemtype => $item->{itype}, |
2707 |
branchcode => $branchcode |
2710 |
branchcode => $branchcode |
2708 |
} |
2711 |
} |
Lines 2713-2719
sub CanBookBeRenewed {
Link Here
|
2713 |
|
2716 |
|
2714 |
my $overduesblockrenewing = C4::Context->preference('OverduesBlockRenewing'); |
2717 |
my $overduesblockrenewing = C4::Context->preference('OverduesBlockRenewing'); |
2715 |
my $restrictionblockrenewing = C4::Context->preference('RestrictionBlockRenewing'); |
2718 |
my $restrictionblockrenewing = C4::Context->preference('RestrictionBlockRenewing'); |
2716 |
my $patron = Koha::Patrons->find($borrowernumber); |
2719 |
$patron = Koha::Patrons->find($borrowernumber); # FIXME Is this really useful? |
2717 |
my $restricted = $patron->is_debarred; |
2720 |
my $restricted = $patron->is_debarred; |
2718 |
my $hasoverdues = $patron->has_overdues; |
2721 |
my $hasoverdues = $patron->has_overdues; |
2719 |
|
2722 |
|
Lines 2747-2753
sub CanBookBeRenewed {
Link Here
|
2747 |
|
2750 |
|
2748 |
if ( C4::Context->preference('OPACFineNoRenewalsBlockAutoRenew') ) { |
2751 |
if ( C4::Context->preference('OPACFineNoRenewalsBlockAutoRenew') ) { |
2749 |
my $fine_no_renewals = C4::Context->preference("OPACFineNoRenewals"); |
2752 |
my $fine_no_renewals = C4::Context->preference("OPACFineNoRenewals"); |
2750 |
my ( $amountoutstanding ) = C4::Members::GetMemberAccountRecords($borrower->{borrowernumber}); |
2753 |
my ( $amountoutstanding ) = C4::Members::GetMemberAccountRecords($patron->borrowernumber); |
2751 |
if ( $amountoutstanding and $amountoutstanding > $fine_no_renewals ) { |
2754 |
if ( $amountoutstanding and $amountoutstanding > $fine_no_renewals ) { |
2752 |
return ( 0, "auto_too_much_oweing" ); |
2755 |
return ( 0, "auto_too_much_oweing" ); |
2753 |
} |
2756 |
} |
Lines 2839-2848
sub AddRenewal {
Link Here
|
2839 |
return; |
2842 |
return; |
2840 |
} |
2843 |
} |
2841 |
|
2844 |
|
2842 |
my $borrower = C4::Members::GetMember( borrowernumber => $borrowernumber ) or return; |
2845 |
my $patron = Koha::Patrons->find( $borrowernumber ) or return; # FIXME Should do more than just return |
|
|
2846 |
my $patron_unblessed = $patron->unblessed; |
2843 |
|
2847 |
|
2844 |
if ( C4::Context->preference('CalculateFinesOnReturn') && $issue->is_overdue ) { |
2848 |
if ( C4::Context->preference('CalculateFinesOnReturn') && $issue->is_overdue ) { |
2845 |
_CalculateAndUpdateFine( { issue => $issue, item => $item, borrower => $borrower } ); |
2849 |
_CalculateAndUpdateFine( { issue => $issue, item => $item, borrower => $patron_unblessed } ); |
2846 |
} |
2850 |
} |
2847 |
_FixOverduesOnReturn( $borrowernumber, $itemnumber ); |
2851 |
_FixOverduesOnReturn( $borrowernumber, $itemnumber ); |
2848 |
|
2852 |
|
Lines 2856-2862
sub AddRenewal {
Link Here
|
2856 |
$datedue = (C4::Context->preference('RenewalPeriodBase') eq 'date_due') ? |
2860 |
$datedue = (C4::Context->preference('RenewalPeriodBase') eq 'date_due') ? |
2857 |
dt_from_string( $issue->date_due, 'sql' ) : |
2861 |
dt_from_string( $issue->date_due, 'sql' ) : |
2858 |
DateTime->now( time_zone => C4::Context->tz()); |
2862 |
DateTime->now( time_zone => C4::Context->tz()); |
2859 |
$datedue = CalcDateDue($datedue, $itemtype, _GetCircControlBranch($item, $borrower), $borrower, 'is a renewal'); |
2863 |
$datedue = CalcDateDue($datedue, $itemtype, _GetCircControlBranch($item, $patron_unblessed), $patron_unblessed, 'is a renewal'); |
2860 |
} |
2864 |
} |
2861 |
|
2865 |
|
2862 |
# Update the issues record to have the new due date, and a new count |
2866 |
# Update the issues record to have the new due date, and a new count |
Lines 2893-2903
sub AddRenewal {
Link Here
|
2893 |
|
2897 |
|
2894 |
# Send a renewal slip according to checkout alert preferencei |
2898 |
# Send a renewal slip according to checkout alert preferencei |
2895 |
if ( C4::Context->preference('RenewalSendNotice') eq '1' ) { |
2899 |
if ( C4::Context->preference('RenewalSendNotice') eq '1' ) { |
2896 |
$borrower = C4::Members::GetMember( borrowernumber => $borrowernumber ); |
|
|
2897 |
my $circulation_alert = 'C4::ItemCirculationAlertPreference'; |
2900 |
my $circulation_alert = 'C4::ItemCirculationAlertPreference'; |
2898 |
my %conditions = ( |
2901 |
my %conditions = ( |
2899 |
branchcode => $branch, |
2902 |
branchcode => $branch, |
2900 |
categorycode => $borrower->{categorycode}, |
2903 |
categorycode => $patron->categorycode, |
2901 |
item_type => $item->{itype}, |
2904 |
item_type => $item->{itype}, |
2902 |
notification => 'CHECKOUT', |
2905 |
notification => 'CHECKOUT', |
2903 |
); |
2906 |
); |
Lines 2906-2912
sub AddRenewal {
Link Here
|
2906 |
{ |
2909 |
{ |
2907 |
type => 'RENEWAL', |
2910 |
type => 'RENEWAL', |
2908 |
item => $item, |
2911 |
item => $item, |
2909 |
borrower => $borrower, |
2912 |
borrower => $patron->unblessed, |
2910 |
branch => $branch, |
2913 |
branch => $branch, |
2911 |
} |
2914 |
} |
2912 |
); |
2915 |
); |
Lines 2914-2923
sub AddRenewal {
Link Here
|
2914 |
} |
2917 |
} |
2915 |
|
2918 |
|
2916 |
# Remove any OVERDUES related debarment if the borrower has no overdues |
2919 |
# Remove any OVERDUES related debarment if the borrower has no overdues |
2917 |
$borrower = C4::Members::GetMember( borrowernumber => $borrowernumber ); |
2920 |
if ( $patron |
2918 |
if ( $borrowernumber |
2921 |
&& $patron->is_debarred |
2919 |
&& $borrower->{'debarred'} |
2922 |
&& ! $patron->has_overdues |
2920 |
&& !Koha::Patrons->find( $borrowernumber )->has_overdues |
|
|
2921 |
&& @{ GetDebarments({ borrowernumber => $borrowernumber, type => 'OVERDUES' }) } |
2923 |
&& @{ GetDebarments({ borrowernumber => $borrowernumber, type => 'OVERDUES' }) } |
2922 |
) { |
2924 |
) { |
2923 |
DelUniqueDebarment({ borrowernumber => $borrowernumber, type => 'OVERDUES' }); |
2925 |
DelUniqueDebarment({ borrowernumber => $borrowernumber, type => 'OVERDUES' }); |
Lines 2949-2956
sub GetRenewCount {
Link Here
|
2949 |
my $renewsallowed = 0; |
2951 |
my $renewsallowed = 0; |
2950 |
my $renewsleft = 0; |
2952 |
my $renewsleft = 0; |
2951 |
|
2953 |
|
2952 |
my $borrower = C4::Members::GetMember( borrowernumber => $bornum); |
2954 |
my $patron = Koha::Patrons->find( $bornum ); |
2953 |
my $item = GetItem($itemno); |
2955 |
my $item = GetItem($itemno); |
|
|
2956 |
|
2957 |
return (0, 0, 0) unless $patron or $item; # Wrong call, no renewal allowed |
2954 |
|
2958 |
|
2955 |
# Look in the issues table for this item, lent to this borrower, |
2959 |
# Look in the issues table for this item, lent to this borrower, |
2956 |
# and not yet returned. |
2960 |
# and not yet returned. |
Lines 2965-2980
sub GetRenewCount {
Link Here
|
2965 |
my $data = $sth->fetchrow_hashref; |
2969 |
my $data = $sth->fetchrow_hashref; |
2966 |
$renewcount = $data->{'renewals'} if $data->{'renewals'}; |
2970 |
$renewcount = $data->{'renewals'} if $data->{'renewals'}; |
2967 |
# $item and $borrower should be calculated |
2971 |
# $item and $borrower should be calculated |
2968 |
my $branchcode = _GetCircControlBranch($item, $borrower); |
2972 |
my $branchcode = _GetCircControlBranch($item, $patron->unblessed); |
2969 |
|
2973 |
|
2970 |
my $issuing_rule = Koha::IssuingRules->get_effective_issuing_rule( |
2974 |
my $issuing_rule = Koha::IssuingRules->get_effective_issuing_rule( |
2971 |
{ categorycode => $borrower->{categorycode}, |
2975 |
{ categorycode => $patron->categorycode, |
2972 |
itemtype => $item->{itype}, |
2976 |
itemtype => $item->{itype}, |
2973 |
branchcode => $branchcode |
2977 |
branchcode => $branchcode |
2974 |
} |
2978 |
} |
2975 |
); |
2979 |
); |
2976 |
|
2980 |
|
2977 |
$renewsallowed = $issuing_rule ? $issuing_rule->renewalsallowed : undef; # FIXME Just replace undef with 0 to get what we expected. But what about the side-effects? TODO LATER |
2981 |
$renewsallowed = $issuing_rule ? $issuing_rule->renewalsallowed : 0; |
2978 |
$renewsleft = $renewsallowed - $renewcount; |
2982 |
$renewsleft = $renewsallowed - $renewcount; |
2979 |
if($renewsleft < 0){ $renewsleft = 0; } |
2983 |
if($renewsleft < 0){ $renewsleft = 0; } |
2980 |
return ( $renewcount, $renewsallowed, $renewsleft ); |
2984 |
return ( $renewcount, $renewsallowed, $renewsleft ); |
Lines 3008-3019
sub GetSoonestRenewDate {
Link Here
|
3008 |
my $itemissue = Koha::Checkouts->find( { itemnumber => $itemnumber } ) or return; |
3012 |
my $itemissue = Koha::Checkouts->find( { itemnumber => $itemnumber } ) or return; |
3009 |
|
3013 |
|
3010 |
$borrowernumber ||= $itemissue->borrowernumber; |
3014 |
$borrowernumber ||= $itemissue->borrowernumber; |
3011 |
my $borrower = C4::Members::GetMember( borrowernumber => $borrowernumber ) |
3015 |
my $patron = Koha::Patrons->find( $borrowernumber ) |
3012 |
or return; |
3016 |
or return; |
3013 |
|
3017 |
|
3014 |
my $branchcode = _GetCircControlBranch( $item, $borrower ); |
3018 |
my $branchcode = _GetCircControlBranch( $item, $patron->unblessed ); |
3015 |
my $issuing_rule = Koha::IssuingRules->get_effective_issuing_rule( |
3019 |
my $issuing_rule = Koha::IssuingRules->get_effective_issuing_rule( |
3016 |
{ categorycode => $borrower->{categorycode}, |
3020 |
{ categorycode => $patron->categorycode, |
3017 |
itemtype => $item->{itype}, |
3021 |
itemtype => $item->{itype}, |
3018 |
branchcode => $branchcode |
3022 |
branchcode => $branchcode |
3019 |
} |
3023 |
} |
Lines 3067-3078
sub GetLatestAutoRenewDate {
Link Here
|
3067 |
my $itemissue = Koha::Checkouts->find( { itemnumber => $itemnumber } ) or return; |
3071 |
my $itemissue = Koha::Checkouts->find( { itemnumber => $itemnumber } ) or return; |
3068 |
|
3072 |
|
3069 |
$borrowernumber ||= $itemissue->borrowernumber; |
3073 |
$borrowernumber ||= $itemissue->borrowernumber; |
3070 |
my $borrower = C4::Members::GetMember( borrowernumber => $borrowernumber ) |
3074 |
my $patron = Koha::Patrons->find( $borrowernumber ) |
3071 |
or return; |
3075 |
or return; |
3072 |
|
3076 |
|
3073 |
my $branchcode = _GetCircControlBranch( $item, $borrower ); |
3077 |
my $branchcode = _GetCircControlBranch( $item, $patron->unblessed ); |
3074 |
my $issuing_rule = Koha::IssuingRules->get_effective_issuing_rule( |
3078 |
my $issuing_rule = Koha::IssuingRules->get_effective_issuing_rule( |
3075 |
{ categorycode => $borrower->{categorycode}, |
3079 |
{ categorycode => $patron->categorycode, |
3076 |
itemtype => $item->{itype}, |
3080 |
itemtype => $item->{itype}, |
3077 |
branchcode => $branchcode |
3081 |
branchcode => $branchcode |
3078 |
} |
3082 |
} |
Lines 3616-3627
sub ReturnLostItem{
Link Here
|
3616 |
my ( $borrowernumber, $itemnum ) = @_; |
3620 |
my ( $borrowernumber, $itemnum ) = @_; |
3617 |
|
3621 |
|
3618 |
MarkIssueReturned( $borrowernumber, $itemnum ); |
3622 |
MarkIssueReturned( $borrowernumber, $itemnum ); |
3619 |
my $borrower = C4::Members::GetMember( 'borrowernumber'=>$borrowernumber ); |
3623 |
my $patron = Koha::Patrons->find( $borrowernumber ); |
3620 |
my $item = C4::Items::GetItem( $itemnum ); |
3624 |
my $item = C4::Items::GetItem( $itemnum ); |
3621 |
my $old_note = ($item->{'paidfor'} && ($item->{'paidfor'} ne q{})) ? $item->{'paidfor'}.' / ' : q{}; |
3625 |
my $old_note = ($item->{'paidfor'} && ($item->{'paidfor'} ne q{})) ? $item->{'paidfor'}.' / ' : q{}; |
3622 |
my @datearr = localtime(time); |
3626 |
my @datearr = localtime(time); |
3623 |
my $date = ( 1900 + $datearr[5] ) . "-" . ( $datearr[4] + 1 ) . "-" . $datearr[3]; |
3627 |
my $date = ( 1900 + $datearr[5] ) . "-" . ( $datearr[4] + 1 ) . "-" . $datearr[3]; |
3624 |
my $bor = "$borrower->{'firstname'} $borrower->{'surname'} $borrower->{'cardnumber'}"; |
3628 |
my $bor = $patron->firstname . ' ' . $patron->surname . ' ' . $patron->cardnumber; |
3625 |
ModItem({ paidfor => $old_note."Paid for by $bor $date" }, undef, $itemnum); |
3629 |
ModItem({ paidfor => $old_note."Paid for by $bor $date" }, undef, $itemnum); |
3626 |
} |
3630 |
} |
3627 |
|
3631 |
|
Lines 3640-3646
sub LostItem{
Link Here
|
3640 |
|
3644 |
|
3641 |
# If a borrower lost the item, add a replacement cost to the their record |
3645 |
# If a borrower lost the item, add a replacement cost to the their record |
3642 |
if ( my $borrowernumber = $issues->{borrowernumber} ){ |
3646 |
if ( my $borrowernumber = $issues->{borrowernumber} ){ |
3643 |
my $borrower = C4::Members::GetMember( borrowernumber => $borrowernumber ); |
3647 |
my $patron = Koha::Patrons->find( $borrowernumber ); |
3644 |
|
3648 |
|
3645 |
if (C4::Context->preference('WhenLostForgiveFine')){ |
3649 |
if (C4::Context->preference('WhenLostForgiveFine')){ |
3646 |
my $fix = _FixOverduesOnReturn($borrowernumber, $itemnumber, 1, 0); # 1, 0 = exemptfine, no-dropbox |
3650 |
my $fix = _FixOverduesOnReturn($borrowernumber, $itemnumber, 1, 0); # 1, 0 = exemptfine, no-dropbox |
Lines 3652-3658
sub LostItem{
Link Here
|
3652 |
#warn " $issues->{'borrowernumber'} / $itemnumber "; |
3656 |
#warn " $issues->{'borrowernumber'} / $itemnumber "; |
3653 |
} |
3657 |
} |
3654 |
|
3658 |
|
3655 |
MarkIssueReturned($borrowernumber,$itemnumber,undef,undef,$borrower->{'privacy'}) if $mark_returned; |
3659 |
MarkIssueReturned($borrowernumber,$itemnumber,undef,undef,$patron->privacy) if $mark_returned; |
3656 |
} |
3660 |
} |
3657 |
} |
3661 |
} |
3658 |
|
3662 |
|
Lines 3736-3751
sub ProcessOfflineReturn {
Link Here
|
3736 |
sub ProcessOfflineIssue { |
3740 |
sub ProcessOfflineIssue { |
3737 |
my $operation = shift; |
3741 |
my $operation = shift; |
3738 |
|
3742 |
|
3739 |
my $borrower = C4::Members::GetMember( cardnumber => $operation->{cardnumber} ); |
3743 |
my $patron = Koha::Patrons->find( { cardnumber => $operation->{cardnumber} } ); |
3740 |
|
3744 |
|
3741 |
if ( $borrower->{borrowernumber} ) { |
3745 |
if ( $patron ) { |
3742 |
my $itemnumber = C4::Items::GetItemnumberFromBarcode( $operation->{barcode} ); |
3746 |
my $itemnumber = C4::Items::GetItemnumberFromBarcode( $operation->{barcode} ); |
3743 |
unless ($itemnumber) { |
3747 |
unless ($itemnumber) { |
3744 |
return "Barcode not found."; |
3748 |
return "Barcode not found."; |
3745 |
} |
3749 |
} |
3746 |
my $issue = GetOpenIssue( $itemnumber ); |
3750 |
my $issue = GetOpenIssue( $itemnumber ); |
3747 |
|
3751 |
|
3748 |
if ( $issue and ( $issue->{borrowernumber} ne $borrower->{borrowernumber} ) ) { # Item already issued to another borrower, mark it returned |
3752 |
if ( $issue and ( $issue->{borrowernumber} ne $patron->borrowernumber ) ) { # Item already issued to another patron mark it returned |
3749 |
MarkIssueReturned( |
3753 |
MarkIssueReturned( |
3750 |
$issue->{borrowernumber}, |
3754 |
$issue->{borrowernumber}, |
3751 |
$itemnumber, |
3755 |
$itemnumber, |
Lines 3754-3760
sub ProcessOfflineIssue {
Link Here
|
3754 |
); |
3758 |
); |
3755 |
} |
3759 |
} |
3756 |
AddIssue( |
3760 |
AddIssue( |
3757 |
$borrower, |
3761 |
$patron->unblessed, |
3758 |
$operation->{'barcode'}, |
3762 |
$operation->{'barcode'}, |
3759 |
undef, |
3763 |
undef, |
3760 |
1, |
3764 |
1, |