@@ -, +, @@ be issued to a new patron without staff confirmation but are instead alerted that is had been checked out to another patron! --- C4/Circulation.pm | 4 ++ installer/data/mysql/atomicupdate/bug_17171.perl | 10 ++++ installer/data/mysql/sysprefs.sql | 1 + .../en/modules/admin/preferences/circulation.pref | 6 +++ .../prog/en/modules/circ/circulation.tt | 4 ++ t/db_dependent/Circulation.t | 62 +++++++++++++++++++++- 6 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 installer/data/mysql/atomicupdate/bug_17171.perl --- a/C4/Circulation.pm +++ a/C4/Circulation.pm @@ -879,11 +879,15 @@ sub CanBookBeIssued { $issuingimpossible{RETURN_IMPOSSIBLE} = 1; $issuingimpossible{branch_to_return} = $message; } else { + if ( C4::Context->preference('AutoReturnCheckedOutItems') ) { + $alerts{RETURNED_FROM_ANOTHER} = { patron => $patron }; + } else { $needsconfirmation{ISSUED_TO_ANOTHER} = 1; $needsconfirmation{issued_firstname} = $patron->firstname; $needsconfirmation{issued_surname} = $patron->surname; $needsconfirmation{issued_cardnumber} = $patron->cardnumber; $needsconfirmation{issued_borrowernumber} = $patron->borrowernumber; + } } } --- a/installer/data/mysql/atomicupdate/bug_17171.perl +++ a/installer/data/mysql/atomicupdate/bug_17171.perl @@ -0,0 +1,10 @@ +$DBversion = 'XXX'; # will be replaced by the RM +if( CheckVersion( $DBversion ) ) { + $dbh->do(q{ + INSERT IGNORE INTO `systempreferences` (`variable`, `value`, `options`, `explanation`, `type`) VALUES + ('AutoReturnCheckedOutItems', '0', '', 'If disabled, librarian must confirm return of checked out item when checking out to another.', 'YesNo'); + }); + + SetVersion( $DBversion ); + print "Upgrade to $DBversion done (Bug 17171 - Add a syspref to allow currently issued items to be issued to a new patron without staff confirmation)\n"; +} --- a/installer/data/mysql/sysprefs.sql +++ a/installer/data/mysql/sysprefs.sql @@ -68,6 +68,7 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` ('AutoSelfCheckAllowed','0','','For corporate and special libraries which want web-based self-check available from any PC without the need for a manual staff login. Most libraries will want to leave this turned off. If on, requires self-check ID and password to be entered in AutoSelfCheckID and AutoSelfCheckPass sysprefs.','YesNo'), ('AutoSelfCheckID','','','Staff ID with circulation rights to be used for automatic web-based self-check. Only applies if AutoSelfCheckAllowed syspref is turned on.','free'), ('AutoSelfCheckPass','','','Password to be used for automatic web-based self-check. Only applies if AutoSelfCheckAllowed syspref is turned on.','free'), +('AutoReturnCheckedOutItems', '0', '', 'If disabled, librarian must confirm return of checked out item when checking out to another.', 'YesNo'), ('Babeltheque','0','','Turn ON Babeltheque content - See babeltheque.com to subscribe to this service','YesNo'), ('Babeltheque_url_js','','','Url for Babeltheque javascript (e.g. http://www.babeltheque.com/bw_XX.js)','Free'), ('Babeltheque_url_update','','','Url for Babeltheque update (E.G. http://www.babeltheque.com/.../file.csv.bz2)','Free'), --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref @@ -153,6 +153,12 @@ Circulation: Checkout Policy: - + - pref: AutoReturnCheckedOutItems + choices: + yes: Don't + no: Do + - require librarians to manually confirm a checkout where the item is already checked out to another patron. + - - pref: AllowTooManyOverride choices: yes: Allow --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt @@ -177,6 +177,10 @@ $(document).ready(function() {
High demand item. Loan period was not shortened due to override. Shortened due date would have been [% alert.HIGHHOLDS.returndate %] ([% alert.HIGHHOLDS.duration %] days).
[% END %] +[% IF alert.RETURNED_FROM_ANOTHER %] +
Item was checked out to [% alert.RETURNED_FROM_ANOTHER.patron.firstname %] [% alert.RETURNED_FROM_ANOTHER.patron.surname %] ([% alert.RETURNED_FROM_ANOTHER.patron.cardnumber %]) and was returned automatically.
+[% END %] + [% IF ( nopermission ) %]
Staff members are not allowed to discharge borrowers, nor borrowers to request a discharge.
[% END %] --- a/t/db_dependent/Circulation.t +++ a/t/db_dependent/Circulation.t @@ -17,7 +17,7 @@ use Modern::Perl; -use Test::More tests => 113; +use Test::More tests => 114; use DateTime; @@ -86,6 +86,8 @@ my $borrower = { branchcode => $library2->{branchcode} }; +t::lib::Mocks::mock_preference('AutoReturnCheckedOutItems', 0); + # No userenv, PickupLibrary t::lib::Mocks::mock_preference('IndependentBranches', '0'); t::lib::Mocks::mock_preference('CircControl', 'PickupLibrary'); @@ -1750,6 +1752,64 @@ subtest 'AddReturn + CumulativeRestrictionPeriods' => sub { is( $debarments->[0]->{expiration}, $expected_expiration ); }; +subtest 'CanBookBeIssued + AutoReturnCheckedOutItems' => sub { + plan tests => 2; + + my $library = $builder->build( { source => 'Branch' } ); + my $patron1 = $builder->build_object( + { + class => 'Koha::Patrons', + value => { + branchcode => $library->{branchcode}, + firstname => "Happy", + surname => "Gilmore", + } + } + ); + my $patron2 = $builder->build_object( + { + class => 'Koha::Patrons', + value => { + branchcode => $library->{branchcode}, + firstname => "Billy", + surname => "Madison", + } + } + ); + + C4::Context->_new_userenv('xxx'); + C4::Context->set_userenv(0,0,0,'firstname','surname', $library->{branchcode}, 'Random Library', '', '', ''); + + my $biblioitem = $builder->build( { source => 'Biblioitem' } ); + my $biblionumber = $biblioitem->{biblionumber}; + my $item = $builder->build( + { source => 'Item', + value => { + homebranch => $library->{branchcode}, + holdingbranch => $library->{branchcode}, + notforloan => 0, + itemlost => 0, + withdrawn => 0, + biblionumber => $biblionumber, + } + } + ); + + my ( $error, $question, $alerts ); + my $issue = AddIssue( $patron1->unblessed, $item->{barcode} ); + + t::lib::Mocks::mock_preference('AutoReturnCheckedOutItems', 0); + ( $error, $question, $alerts ) = CanBookBeIssued( $patron2, $item->{barcode} ); + is( $question->{ISSUED_TO_ANOTHER}, 1, 'ISSUED_TO_ANOTHER question flag should be set if AutoReturnCheckedOutItems is disabled and item is checked out to another' ); + + t::lib::Mocks::mock_preference('AutoReturnCheckedOutItems', 1); + ( $error, $question, $alerts ) = CanBookBeIssued( $patron2, $item->{barcode} ); + is( $alerts->{RETURNED_FROM_ANOTHER}->{patron}->borrowernumber, $patron1->borrowernumber, 'RETURNED_FROM_ANOTHER alert flag should be set if AutoReturnCheckedOutItems is enabled and item is checked out to another' ); + + t::lib::Mocks::mock_preference('AutoReturnCheckedOutItems', 0); +}; + + subtest 'AddReturn | is_overdue' => sub { plan tests => 5; --