View | Details | Raw Unified | Return to bug 14364
Collapse All | Expand All

(-)a/C4/Reserves.pm (-27 / +116 lines)
Lines 442-448 sub CanItemBeReserved{ Link Here
442
    my $dbh             = C4::Context->dbh;
442
    my $dbh             = C4::Context->dbh;
443
    my $ruleitemtype; # itemtype of the matching issuing rule
443
    my $ruleitemtype; # itemtype of the matching issuing rule
444
    my $allowedreserves = 0;
444
    my $allowedreserves = 0;
445
            
445
446
    # we retrieve borrowers and items informations #
446
    # we retrieve borrowers and items informations #
447
    # item->{itype} will come for biblioitems if necessery
447
    # item->{itype} will come for biblioitems if necessery
448
    my $item = GetItem($itemnumber);
448
    my $item = GetItem($itemnumber);
Lines 478-485 sub CanItemBeReserved{ Link Here
478
                                LEFT JOIN borrowers USING (borrowernumber)
478
                                LEFT JOIN borrowers USING (borrowernumber)
479
                            WHERE borrowernumber = ?
479
                            WHERE borrowernumber = ?
480
                                ";
480
                                ";
481
    
481
482
    
482
483
    my $branchcode   = "";
483
    my $branchcode   = "";
484
    my $branchfield  = "reserves.branchcode";
484
    my $branchfield  = "reserves.branchcode";
485
485
Lines 490-501 sub CanItemBeReserved{ Link Here
490
        $branchfield = "borrowers.branchcode";
490
        $branchfield = "borrowers.branchcode";
491
        $branchcode = $borrower->{branchcode};
491
        $branchcode = $borrower->{branchcode};
492
    }
492
    }
493
    
493
494
    # we retrieve rights 
494
    # we retrieve rights
495
    $sth->execute($borrower->{'categorycode'}, $item->{'itype'}, $branchcode);
495
    $sth->execute($borrower->{'categorycode'}, $item->{'itype'}, $branchcode);
496
    if(my $rights = $sth->fetchrow_hashref()){
496
    if(my $rights = $sth->fetchrow_hashref()){
497
        $ruleitemtype    = $rights->{itemtype};
497
        $ruleitemtype    = $rights->{itemtype};
498
        $allowedreserves = $rights->{reservesallowed}; 
498
        $allowedreserves = $rights->{reservesallowed};
499
    }else{
499
    }else{
500
        $ruleitemtype = '*';
500
        $ruleitemtype = '*';
501
    }
501
    }
Lines 503-509 sub CanItemBeReserved{ Link Here
503
    # we retrieve count
503
    # we retrieve count
504
504
505
    $querycount .= "AND $branchfield = ?";
505
    $querycount .= "AND $branchfield = ?";
506
    
506
507
    # If using item-level itypes, fall back to the record
507
    # If using item-level itypes, fall back to the record
508
    # level itemtype if the hold has no associated item
508
    # level itemtype if the hold has no associated item
509
    $querycount .=
509
    $querycount .=
Lines 513-519 sub CanItemBeReserved{ Link Here
513
      if ( $ruleitemtype ne "*" );
513
      if ( $ruleitemtype ne "*" );
514
514
515
    my $sthcount = $dbh->prepare($querycount);
515
    my $sthcount = $dbh->prepare($querycount);
516
    
516
517
    if($ruleitemtype eq "*"){
517
    if($ruleitemtype eq "*"){
518
        $sthcount->execute($borrowernumber, $branchcode);
518
        $sthcount->execute($borrowernumber, $branchcode);
519
    }else{
519
    }else{
Lines 726-733 sub GetReservesToBranch { Link Here
726
    my $dbh = C4::Context->dbh;
726
    my $dbh = C4::Context->dbh;
727
    my $sth = $dbh->prepare(
727
    my $sth = $dbh->prepare(
728
        "SELECT reserve_id,borrowernumber,reservedate,itemnumber,timestamp
728
        "SELECT reserve_id,borrowernumber,reservedate,itemnumber,timestamp
729
         FROM reserves 
729
         FROM reserves
730
         WHERE priority='0' 
730
         WHERE priority='0'
731
           AND branchcode=?"
731
           AND branchcode=?"
732
    );
732
    );
733
    $sth->execute( $frombranch );
733
    $sth->execute( $frombranch );
Lines 752-758 sub GetReservesForBranch { Link Here
752
752
753
    my $query = "
753
    my $query = "
754
        SELECT reserve_id,borrowernumber,reservedate,itemnumber,waitingdate
754
        SELECT reserve_id,borrowernumber,reservedate,itemnumber,waitingdate
755
        FROM   reserves 
755
        FROM   reserves
756
        WHERE   priority='0'
756
        WHERE   priority='0'
757
        AND found='W'
757
        AND found='W'
758
    ";
758
    ";
Lines 1005-1011 sub CancelExpiredReserves { Link Here
1005
            }
1005
            }
1006
1006
1007
            if ( $do_cancel ) {
1007
            if ( $do_cancel ) {
1008
                CancelReserve({ reserve_id => $res->{'reserve_id'}, charge_cancel_fee => 1 });
1008
                CancelReserve(
1009
                    {
1010
                        reserve_id => $res->{'reserve_id'},
1011
                        autofill   => C4::Context->preference('ExpireReservesAutoFill'),
1012
                        charge_cancel_fee => 1,
1013
                    }
1014
                );
1009
            }
1015
            }
1010
        }
1016
        }
1011
    }
1017
    }
Lines 1032-1038 sub AutoUnsuspendReserves { Link Here
1032
1038
1033
=head2 CancelReserve
1039
=head2 CancelReserve
1034
1040
1035
  CancelReserve({ reserve_id => $reserve_id, [ biblionumber => $biblionumber, borrowernumber => $borrrowernumber, itemnumber => $itemnumber, ] [ charge_cancel_fee => 1 ] });
1041
  CancelReserve({ reserve_id => $reserve_id, [ biblionumber => $biblionumber, borrowernumber => $borrrowernumber, itemnumber => $itemnumber, charge_cancel_fee => 1, autofill => $autofill ] });
1036
1042
1037
Cancels a reserve. If C<charge_cancel_fee> is passed and the C<ExpireReservesMaxPickUpDelayCharge> syspref is set, charge that fee to the patron's account.
1043
Cancels a reserve. If C<charge_cancel_fee> is passed and the C<ExpireReservesMaxPickUpDelayCharge> syspref is set, charge that fee to the patron's account.
1038
1044
Lines 1042-1051 sub CancelReserve { Link Here
1042
    my ( $params ) = @_;
1048
    my ( $params ) = @_;
1043
1049
1044
    my $reserve_id = $params->{'reserve_id'};
1050
    my $reserve_id = $params->{'reserve_id'};
1051
    my $autofill   = $params->{autofill};
1052
1045
    # Filter out only the desired keys; this will insert undefined values for elements missing in
1053
    # Filter out only the desired keys; this will insert undefined values for elements missing in
1046
    # \%params, but GetReserveId filters them out anyway.
1054
    # \%params, but GetReserveId filters them out anyway.
1047
    $reserve_id = GetReserveId( { biblionumber => $params->{'biblionumber'}, borrowernumber => $params->{'borrowernumber'}, itemnumber => $params->{'itemnumber'} } ) unless ( $reserve_id );
1055
    $reserve_id = GetReserveId( { biblionumber => $params->{'biblionumber'}, borrowernumber => $params->{'borrowernumber'}, itemnumber => $params->{'itemnumber'} } ) unless ( $reserve_id );
1048
1056
1057
1049
    return unless ( $reserve_id );
1058
    return unless ( $reserve_id );
1050
1059
1051
    my $dbh = C4::Context->dbh;
1060
    my $dbh = C4::Context->dbh;
Lines 1085-1090 sub CancelReserve { Link Here
1085
        if ( $charge && $params->{'charge_cancel_fee'} ) {
1094
        if ( $charge && $params->{'charge_cancel_fee'} ) {
1086
            manualinvoice($reserve->{'borrowernumber'}, $reserve->{'itemnumber'}, 'Hold waiting too long', 'F', $charge);
1095
            manualinvoice($reserve->{'borrowernumber'}, $reserve->{'itemnumber'}, 'Hold waiting too long', 'F', $charge);
1087
        }
1096
        }
1097
1098
        # only attempt to autofill canceled holds that were found and waiting
1099
        if ( $autofill && $reserve->{itemnumber} && $reserve->{found} && $reserve->{found} eq 'W' ) {
1100
            my ( undef, $next_hold ) = CheckReserves( $reserve->{'itemnumber'} );
1101
            if ($next_hold) {
1102
                my $is_transfer = $reserve->{branchcode} ne $next_hold->{branchcode};
1103
1104
                ModReserveAffect(
1105
                    {
1106
                        itemnumber     => $reserve->{itemnumber},
1107
                        borrowernumber => $next_hold->{borrowernumber},
1108
                        is_transfer    => $is_transfer,
1109
                        notify_library => 1,
1110
                    }
1111
                );
1112
1113
                ModItemTransfer( $reserve->{itemnumber}, $reserve->{branchcode}, $next_hold->{branchcode} )
1114
                  if $is_transfer;
1115
            }
1116
        }
1088
    }
1117
    }
1089
1118
1090
    return $reserve;
1119
    return $reserve;
Lines 1278-1284 take care of the waiting status Link Here
1278
=cut
1307
=cut
1279
1308
1280
sub ModReserveAffect {
1309
sub ModReserveAffect {
1281
    my ( $itemnumber, $borrowernumber,$transferToDo ) = @_;
1310
    my ( $params ) = @_;
1311
1312
    my $itemnumber     = $params->{itemnumber};
1313
    my $borrowernumber = $params->{borrowernumber};
1314
    my $transferToDo   = $params->{is_transfer};
1315
    my $notify_library = $params->{notify_library};
1316
1282
    my $dbh = C4::Context->dbh;
1317
    my $dbh = C4::Context->dbh;
1283
1318
1284
    # we want to attach $itemnumber to $borrowernumber, find the biblionumber
1319
    # we want to attach $itemnumber to $borrowernumber, find the biblionumber
Lines 1323-1330 sub ModReserveAffect { Link Here
1323
    }
1358
    }
1324
    $sth = $dbh->prepare($query);
1359
    $sth = $dbh->prepare($query);
1325
    $sth->execute( $itemnumber, $borrowernumber,$biblionumber);
1360
    $sth->execute( $itemnumber, $borrowernumber,$biblionumber);
1326
    _koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber ) if ( !$transferToDo && !$already_on_shelf );
1361
1362
    _koha_notify_reserve(
1363
        {
1364
            itemnumber     => $itemnumber,
1365
            borrowernumber => $borrowernumber,
1366
            biblionumber   => $biblionumber,
1367
            notify_library => $notify_library,
1368
        }
1369
    ) if ( !$transferToDo && !$already_on_shelf );
1370
1327
    _FixPriority( { biblionumber => $biblionumber } );
1371
    _FixPriority( { biblionumber => $biblionumber } );
1372
1328
    if ( C4::Context->preference("ReturnToShelvingCart") ) {
1373
    if ( C4::Context->preference("ReturnToShelvingCart") ) {
1329
      CartToShelf( $itemnumber );
1374
      CartToShelf( $itemnumber );
1330
    }
1375
    }
Lines 1369-1375 sub ModReserveMinusPriority { Link Here
1369
    my $dbh   = C4::Context->dbh;
1414
    my $dbh   = C4::Context->dbh;
1370
    my $query = "
1415
    my $query = "
1371
        UPDATE reserves
1416
        UPDATE reserves
1372
        SET    priority = 0 , itemnumber = ? 
1417
        SET    priority = 0 , itemnumber = ?
1373
        WHERE  reserve_id = ?
1418
        WHERE  reserve_id = ?
1374
    ";
1419
    ";
1375
    my $sth_upd = $dbh->prepare($query);
1420
    my $sth_upd = $dbh->prepare($query);
Lines 1584-1590 sub ToggleLowestPriority { Link Here
1584
1629
1585
    my $sth = $dbh->prepare( "UPDATE reserves SET lowestPriority = NOT lowestPriority WHERE reserve_id = ?");
1630
    my $sth = $dbh->prepare( "UPDATE reserves SET lowestPriority = NOT lowestPriority WHERE reserve_id = ?");
1586
    $sth->execute( $reserve_id );
1631
    $sth->execute( $reserve_id );
1587
    
1632
1588
    _FixPriority({ reserve_id => $reserve_id, rank => '999999' });
1633
    _FixPriority({ reserve_id => $reserve_id, rank => '999999' });
1589
}
1634
}
1590
1635
Lines 1794-1800 sub _FixPriority { Link Here
1794
            $priority[$j]->{'reserve_id'}
1839
            $priority[$j]->{'reserve_id'}
1795
        );
1840
        );
1796
    }
1841
    }
1797
    
1842
1798
    $sth = $dbh->prepare( "SELECT reserve_id FROM reserves WHERE lowestPriority = 1 ORDER BY priority" );
1843
    $sth = $dbh->prepare( "SELECT reserve_id FROM reserves WHERE lowestPriority = 1 ORDER BY priority" );
1799
    $sth->execute();
1844
    $sth->execute();
1800
1845
Lines 1929-1935 sub _Findgroupreserve { Link Here
1929
1974
1930
=head2 _koha_notify_reserve
1975
=head2 _koha_notify_reserve
1931
1976
1932
  _koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber );
1977
_koha_notify_reserve(
1978
    {
1979
        itemnumber     => $itemnumber,
1980
        borrowernumber => $borrowernumber,
1981
        biblionumber   => $biblionumber,
1982
        notify_library => $notify_library
1983
    }
1984
);
1933
1985
1934
Sends a notification to the patron that their hold has been filled (through
1986
Sends a notification to the patron that their hold has been filled (through
1935
ModReserveAffect, _not_ ModReserveFill)
1987
ModReserveAffect, _not_ ModReserveFill)
Lines 1937-1943 ModReserveAffect, _not_ ModReserveFill) Link Here
1937
=cut
1989
=cut
1938
1990
1939
sub _koha_notify_reserve {
1991
sub _koha_notify_reserve {
1940
    my ($itemnumber, $borrowernumber, $biblionumber) = @_;
1992
    my ( $params ) = @_;
1993
1994
    my $itemnumber     = $params->{itemnumber};
1995
    my $borrowernumber = $params->{borrowernumber};
1996
    my $biblionumber   = $params->{biblionumber};
1997
    my $notify_library = $params->{notify_library};
1941
1998
1942
    my $dbh = C4::Context->dbh;
1999
    my $dbh = C4::Context->dbh;
1943
    my $borrower = C4::Members::GetMember(borrowernumber => $borrowernumber);
2000
    my $borrower = C4::Members::GetMember(borrowernumber => $borrowernumber);
Lines 1987-1998 sub _koha_notify_reserve { Link Here
1987
            return;
2044
            return;
1988
        }
2045
        }
1989
2046
1990
        C4::Letters::EnqueueLetter( {
2047
        C4::Letters::EnqueueLetter(
1991
            letter => $letter,
2048
            {
1992
            borrowernumber => $borrowernumber,
2049
                letter                 => $letter,
1993
            from_address => $admin_email_address,
2050
                borrowernumber         => $borrowernumber,
1994
            message_transport_type => $mtt,
2051
                from_address           => $admin_email_address,
1995
        } );
2052
                message_transport_type => $mtt,
2053
            }
2054
        );
1996
    };
2055
    };
1997
2056
1998
    while ( my ( $mtt, $letter_code ) = each %{ $messagingprefs->{transports} } ) {
2057
    while ( my ( $mtt, $letter_code ) = each %{ $messagingprefs->{transports} } ) {
Lines 2009-2015 sub _koha_notify_reserve { Link Here
2009
    if (! $notification_sent) {
2068
    if (! $notification_sent) {
2010
        &$send_notification('print', 'HOLD');
2069
        &$send_notification('print', 'HOLD');
2011
    }
2070
    }
2012
    
2071
2072
    if ($notify_library) {
2073
        my $letter = C4::Letters::GetPreparedLetter(
2074
            module      => 'reserves',
2075
            letter_code => 'HOLD_CHANGED',
2076
            branchcode  => $reserve->{branchcode},
2077
            substitute  => { today => C4::Dates->new()->output() },
2078
            tables      => {
2079
                'branches'  => $branch_details,
2080
                'borrowers' => $borrower,
2081
                'biblio'    => $biblionumber,
2082
                'reserves'  => $reserve,
2083
                'items'     => $reserve->{'itemnumber'},
2084
            },
2085
        );
2086
2087
        my $email =
2088
             C4::Context->preference('ExpireReservesAutoFillEmail')
2089
          || $branch_details->{'branchemail'}
2090
          || C4::Context->preference('KohaAdminEmailAddress');
2091
2092
        C4::Letters::EnqueueLetter(
2093
            {
2094
                letter                 => $letter,
2095
                borrowernumber         => $borrowernumber,
2096
                message_transport_type => 'email',
2097
                from_address           => $email,
2098
                to_address             => $email,
2099
            }
2100
        );
2101
    }
2013
}
2102
}
2014
2103
2015
=head2 _ShiftPriorityByDateAndPriority
2104
=head2 _ShiftPriorityByDateAndPriority
(-)a/C4/SIP/ILS/Transaction/Checkin.pm (-4 / +14 lines)
Lines 99-111 sub do_checkin { Link Here
99
        $self->hold($messages->{ResFound});
99
        $self->hold($messages->{ResFound});
100
        if ($branch eq $messages->{ResFound}->{branchcode}) {
100
        if ($branch eq $messages->{ResFound}->{branchcode}) {
101
            $self->alert_type('01');
101
            $self->alert_type('01');
102
            ModReserveAffect( $messages->{ResFound}->{itemnumber},
102
            ModReserveAffect(
103
                $messages->{ResFound}->{borrowernumber}, 0);
103
                {
104
                    itemnumber     => $messages->{ResFound}->{itemnumber},
105
                    borrowernumber => $messages->{ResFound}->{borrowernumber},
106
                    is_transfer    => 0,
107
                }
108
            );
104
109
105
        } else {
110
        } else {
106
            $self->alert_type('02');
111
            $self->alert_type('02');
107
            ModReserveAffect( $messages->{ResFound}->{itemnumber},
112
            ModReserveAffect(
108
                $messages->{ResFound}->{borrowernumber}, 1);
113
                {
114
                    itemnumber     => $messages->{ResFound}->{itemnumber},
115
                    borrowernumber => $messages->{ResFound}->{borrowernumber},
116
                    is_transfer    => 1,
117
                }
118
            );
109
            ModItemTransfer( $messages->{ResFound}->{itemnumber},
119
            ModItemTransfer( $messages->{ResFound}->{itemnumber},
110
                $branch,
120
                $branch,
111
                $messages->{ResFound}->{branchcode}
121
                $messages->{ResFound}->{branchcode}
(-)a/circ/branchtransfers.pl (-1 / +1 lines)
Lines 89-95 if ( $request eq "KillWaiting" ) { Link Here
89
}
89
}
90
elsif ( $request eq "SetWaiting" ) {
90
elsif ( $request eq "SetWaiting" ) {
91
    my $item = $query->param('itemnumber');
91
    my $item = $query->param('itemnumber');
92
    ModReserveAffect( $item, $borrowernumber );
92
    ModReserveAffect( { itemnumber => $item, borrowernumber => $borrowernumber } );
93
    $ignoreRs    = 1;
93
    $ignoreRs    = 1;
94
    $setwaiting  = 1;
94
    $setwaiting  = 1;
95
    $reqmessage  = 1;
95
    $reqmessage  = 1;
(-)a/circ/returns.pl (-2 / +3 lines)
Lines 158-166 if ( $query->param('resbarcode') ) { Link Here
158
        my $diffBranchSend = ($userenv_branch ne $diffBranchReturned) ? $diffBranchReturned : undef;
158
        my $diffBranchSend = ($userenv_branch ne $diffBranchReturned) ? $diffBranchReturned : undef;
159
        # diffBranchSend tells ModReserveAffect whether document is expected in this library or not,
159
        # diffBranchSend tells ModReserveAffect whether document is expected in this library or not,
160
        # i.e., whether to apply waiting status
160
        # i.e., whether to apply waiting status
161
        ModReserveAffect( $item, $borrowernumber, $diffBranchSend);
161
        ModReserveAffect( { itemnumber => $item, borrowernumber => $borrowernumber, is_transfer => $diffBranchSend } );
162
    }
162
    }
163
#   check if we have other reserves for this document, if we have a return send the message of transfer
163
164
    # check if we have other reserves for this document, if we have a return send the message of transfer
164
    my ( $messages, $nextreservinfo ) = GetOtherReserves($item);
165
    my ( $messages, $nextreservinfo ) = GetOtherReserves($item);
165
166
166
    my ($borr) = GetMemberDetails( $nextreservinfo, 0 );
167
    my ($borr) = GetMemberDetails( $nextreservinfo, 0 );
(-)a/installer/data/mysql/atomicupdate/bug_14364.sql (+13 lines)
Line 0 Link Here
1
INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
2
('ExpireReservesAutoFill','0',NULL,'Automatically fill the next hold with a automatically canceled expired waiting hold.','YesNo'),
3
('ExpireReservesAutoFillEmail','', NULL,'If ExpireReservesAutoFill and an email is defined here, the email notification for the change in the hold will be sent to this address.','Free');
4
5
INSERT INTO letter(module,code,branchcode,name,is_html,title,content,message_transport_type)
6
VALUES ( 'reserves', 'HOLD_CHANGED', '', 'Canceled Hold Available for Different Patron', '0', 'Canceled Hold Available for Different Patron', 'The patron picking up <<biblio.title>> (<<items.barcode>>) has changed to <<borrowers.firstname>> <<borrowers.surname>> (<<borrowers.cardnumber>>).
7
8
Please update the hold information for this item.
9
10
Title: <<biblio.title>>
11
Author: <<biblio.author>>
12
Copy: <<items.copynumber>>
13
Pickup location: <<branches.branchname>>', 'email');
(-)a/installer/data/mysql/de-DE/mandatory/sample_notices.sql (+10 lines)
Lines 143-145 VALUES ( 'circulation', 'OVERDUES_SLIP', '', 'Überfälligkeiten (Quittung)', '0 Link Here
143
143
144
<item>"<<biblio.title>>" von <<biblio.author>>, <<items.itemcallnumber>>, Barcode: <<items.barcode>> Gebühr: <<items.fine>></item>
144
<item>"<<biblio.title>>" von <<biblio.author>>, <<items.itemcallnumber>>, Barcode: <<items.barcode>> Gebühr: <<items.fine>></item>
145
', 'print' );
145
', 'print' );
146
147
INSERT INTO letter(module,code,branchcode,name,is_html,title,content,message_transport_type)
148
    VALUES ( 'reserves', 'HOLD_CHANGED', '', 'Canceled Hold Available for Different Patron', '0', 'Canceled Hold Available for Different Patron', 'The patron picking up <<biblio.title>> (<<items.barcode>>) has changed to <<borrowers.firstname>> <<borrowers.surname>> (<<borrowers.cardnumber>>).
149
150
            Please update the hold information for this item.
151
152
            Title: <<biblio.title>>
153
            Author: <<biblio.author>>
154
            Copy: <<items.copynumber>>
155
            Pickup location: <<branches.branchname>>', 'email');
(-)a/installer/data/mysql/en/mandatory/sample_notices.sql (+10 lines)
Lines 162-164 VALUES ( 'circulation', 'OVERDUES_SLIP', '', 'Overdues Slip', '0', 'OVERDUES_SLI Link Here
162
162
163
<item>"<<biblio.title>>" by <<biblio.author>>, <<items.itemcallnumber>>, Barcode: <<items.barcode>> Fine: <<items.fine>></item>
163
<item>"<<biblio.title>>" by <<biblio.author>>, <<items.itemcallnumber>>, Barcode: <<items.barcode>> Fine: <<items.fine>></item>
164
', 'print' );
164
', 'print' );
165
166
INSERT INTO letter(module,code,branchcode,name,is_html,title,content,message_transport_type)
167
    VALUES ( 'reserves', 'HOLD_CHANGED', '', 'Canceled Hold Available for Different Patron', '0', 'Canceled Hold Available for Different Patron', 'The patron picking up <<biblio.title>> (<<items.barcode>>) has changed to <<borrowers.firstname>> <<borrowers.surname>> (<<borrowers.cardnumber>>).
168
169
            Please update the hold information for this item.
170
171
            Title: <<biblio.title>>
172
            Author: <<biblio.author>>
173
            Copy: <<items.copynumber>>
174
            Pickup location: <<branches.branchname>>', 'email');
(-)a/installer/data/mysql/es-ES/mandatory/sample_notices.sql (+10 lines)
Lines 157-159 VALUES ( 'circulation', 'OVERDUES_SLIP', '', 'Overdues Slip', '0', 'OVERDUES_SLI Link Here
157
157
158
<item>"<<biblio.title>>" by <<biblio.author>>, <<items.itemcallnumber>>, Barcode: <<items.barcode>> Fine: <<items.fine>></item>
158
<item>"<<biblio.title>>" by <<biblio.author>>, <<items.itemcallnumber>>, Barcode: <<items.barcode>> Fine: <<items.fine>></item>
159
', 'print' );
159
', 'print' );
160
161
INSERT INTO letter(module,code,branchcode,name,is_html,title,content,message_transport_type)
162
    VALUES ( 'reserves', 'HOLD_CHANGED', '', 'Canceled Hold Available for Different Patron', '0', 'Canceled Hold Available for Different Patron', 'The patron picking up <<biblio.title>> (<<items.barcode>>) has changed to <<borrowers.firstname>> <<borrowers.surname>> (<<borrowers.cardnumber>>).
163
164
Please update the hold information for this item.
165
166
Title: <<biblio.title>>
167
Author: <<biblio.author>>
168
Copy: <<items.copynumber>>
169
Pickup location: <<branches.branchname>>', 'email');
(-)a/installer/data/mysql/fr-FR/1-Obligatoire/sample_notices.sql (+10 lines)
Lines 158-160 VALUES ( 'circulation', 'OVERDUES_SLIP', '', 'Overdues Slip', '0', 'OVERDUES_SLI Link Here
158
158
159
<item>"<<biblio.title>>" by <<biblio.author>>, <<items.itemcallnumber>>, Barcode: <<items.barcode>> Fine: <<items.fine>></item>
159
<item>"<<biblio.title>>" by <<biblio.author>>, <<items.itemcallnumber>>, Barcode: <<items.barcode>> Fine: <<items.fine>></item>
160
', 'print' );
160
', 'print' );
161
162
INSERT INTO letter(module,code,branchcode,name,is_html,title,content,message_transport_type)
163
    VALUES ( 'reserves', 'HOLD_CHANGED', '', 'Canceled Hold Available for Different Patron', '0', 'Canceled Hold Available for Different Patron', 'The patron picking up <<biblio.title>> (<<items.barcode>>) has changed to <<borrowers.firstname>> <<borrowers.surname>> (<<borrowers.cardnumber>>).
164
165
Please update the hold information for this item.
166
167
Title: <<biblio.title>>
168
Author: <<biblio.author>>
169
Copy: <<items.copynumber>>
170
Pickup location: <<branches.branchname>>', 'email');
(-)a/installer/data/mysql/nb-NO/1-Obligatorisk/sample_notices.sql (+10 lines)
Lines 177-179 VALUES ( 'circulation', 'OVERDUES_SLIP', '', 'Overdues Slip', '0', 'OVERDUES_SLI Link Here
177
177
178
<item>"<<biblio.title>>" by <<biblio.author>>, <<items.itemcallnumber>>, Barcode: <<items.barcode>> Fine: <<items.fine>></item>
178
<item>"<<biblio.title>>" by <<biblio.author>>, <<items.itemcallnumber>>, Barcode: <<items.barcode>> Fine: <<items.fine>></item>
179
', 'print' );
179
', 'print' );
180
181
INSERT INTO letter(module,code,branchcode,name,is_html,title,content,message_transport_type)
182
    VALUES ( 'reserves', 'HOLD_CHANGED', '', 'Canceled Hold Available for Different Patron', '0', 'Canceled Hold Available for Different Patron', 'The patron picking up <<biblio.title>> (<<items.barcode>>) has changed to <<borrowers.firstname>> <<borrowers.surname>> (<<borrowers.cardnumber>>).
183
184
Please update the hold information for this item.
185
186
Title: <<biblio.title>>
187
Author: <<biblio.author>>
188
Copy: <<items.copynumber>>
189
Pickup location: <<branches.branchname>>', 'email');
(-)a/installer/data/mysql/pl-PL/mandatory/sample_notices.sql (+10 lines)
Lines 155-157 VALUES ( 'circulation', 'OVERDUES_SLIP', '', 'Overdues Slip', '0', 'OVERDUES_SLI Link Here
155
155
156
<item>"<<biblio.title>>" by <<biblio.author>>, <<items.itemcallnumber>>, Barcode: <<items.barcode>> Fine: <<items.fine>></item>
156
<item>"<<biblio.title>>" by <<biblio.author>>, <<items.itemcallnumber>>, Barcode: <<items.barcode>> Fine: <<items.fine>></item>
157
', 'print' );
157
', 'print' );
158
159
INSERT INTO letter(module,code,branchcode,name,is_html,title,content,message_transport_type)
160
VALUES ( 'reserves', 'HOLD_CHANGED', '', 'Canceled Hold Available for Different Patron', '0', 'Canceled Hold Available for Different Patron', 'The patron picking up <<biblio.title>> (<<items.barcode>>) has changed to <<borrowers.firstname>> <<borrowers.surname>> (<<borrowers.cardnumber>>).
161
162
Please update the hold information for this item.
163
164
Title: <<biblio.title>>
165
Author: <<biblio.author>>
166
Copy: <<items.copynumber>>
167
Pickup location: <<branches.branchname>>', 'email');
(-)a/installer/data/mysql/ru-RU/mandatory/sample_notices.sql (+10 lines)
Lines 157-159 VALUES ( 'circulation', 'OVERDUES_SLIP', '', 'Overdues Slip', '0', 'OVERDUES_SLI Link Here
157
157
158
<item>"<<biblio.title>>" by <<biblio.author>>, <<items.itemcallnumber>>, Barcode: <<items.barcode>> Fine: <<items.fine>></item>
158
<item>"<<biblio.title>>" by <<biblio.author>>, <<items.itemcallnumber>>, Barcode: <<items.barcode>> Fine: <<items.fine>></item>
159
', 'print' );
159
', 'print' );
160
161
INSERT INTO letter(module,code,branchcode,name,is_html,title,content,message_transport_type)
162
VALUES ( 'reserves', 'HOLD_CHANGED', '', 'Canceled Hold Available for Different Patron', '0', 'Canceled Hold Available for Different Patron', 'The patron picking up <<biblio.title>> (<<items.barcode>>) has changed to <<borrowers.firstname>> <<borrowers.surname>> (<<borrowers.cardnumber>>).
163
164
Please update the hold information for this item.
165
166
Title: <<biblio.title>>
167
Author: <<biblio.author>>
168
Copy: <<items.copynumber>>
169
Pickup location: <<branches.branchname>>', 'email');
(-)a/installer/data/mysql/sysprefs.sql (+2 lines)
Lines 130-135 INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` Link Here
130
('EnableSearchHistory','0','','Enable or disable search history','YesNo'),
130
('EnableSearchHistory','0','','Enable or disable search history','YesNo'),
131
('EnhancedMessagingPreferences','0','','If ON, allows patrons to select to receive additional messages about items due or nearly due.','YesNo'),
131
('EnhancedMessagingPreferences','0','','If ON, allows patrons to select to receive additional messages about items due or nearly due.','YesNo'),
132
('expandedSearchOption','0',NULL,'If ON, set advanced search to be expanded by default','YesNo'),
132
('expandedSearchOption','0',NULL,'If ON, set advanced search to be expanded by default','YesNo'),
133
('ExpireReservesAutoFill','0',NULL,'Automatically fill the next hold with a automatically canceled expired waiting hold.','YesNo'),
134
('ExpireReservesAutoFillEmail','', NULL,'If ExpireReservesAutoFill and an email is defined here, the email notification for the change in the hold will be sent to this address.','Free'),
133
('ExpireReservesMaxPickUpDelay','0','','Enabling this allows holds to expire automatically if they have not been picked by within the time period specified in ReservesMaxPickUpDelay','YesNo'),
135
('ExpireReservesMaxPickUpDelay','0','','Enabling this allows holds to expire automatically if they have not been picked by within the time period specified in ReservesMaxPickUpDelay','YesNo'),
134
('ExpireReservesMaxPickUpDelayCharge','0',NULL,'If ExpireReservesMaxPickUpDelay is enabled, and this field has a non-zero value, than a borrower whose waiting hold has expired will be charged this amount.','free'),
136
('ExpireReservesMaxPickUpDelayCharge','0',NULL,'If ExpireReservesMaxPickUpDelay is enabled, and this field has a non-zero value, than a borrower whose waiting hold has expired will be charged this amount.','free'),
135
('ExpireReservesOnHolidays', '1', NULL, 'If false, reserves at a library will not be canceled on days the library is not open.', 'YesNo'),
137
('ExpireReservesOnHolidays', '1', NULL, 'If false, reserves at a library will not be canceled on days the library is not open.', 'YesNo'),
(-)a/installer/data/mysql/uk-UA/mandatory/sample_notices.sql (+10 lines)
Lines 156-158 VALUES ( 'circulation', 'OVERDUES_SLIP', '', 'Overdues Slip', '0', 'OVERDUES_SLI Link Here
156
156
157
<item>"<<biblio.title>>" by <<biblio.author>>, <<items.itemcallnumber>>, Barcode: <<items.barcode>> Fine: <<items.fine>></item>
157
<item>"<<biblio.title>>" by <<biblio.author>>, <<items.itemcallnumber>>, Barcode: <<items.barcode>> Fine: <<items.fine>></item>
158
', 'print' );
158
', 'print' );
159
160
INSERT INTO letter(module,code,branchcode,name,is_html,title,content,message_transport_type)
161
VALUES ( 'reserves', 'HOLD_CHANGED', '', 'Canceled Hold Available for Different Patron', '0', 'Canceled Hold Available for Different Patron', 'The patron picking up <<biblio.title>> (<<items.barcode>>) has changed to <<borrowers.firstname>> <<borrowers.surname>> (<<borrowers.cardnumber>>).
162
163
Please update the hold information for this item.
164
165
Title: <<biblio.title>>
166
Author: <<biblio.author>>
167
Copy: <<items.copynumber>>
168
Pickup location: <<branches.branchname>>', 'email');
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref (+10 lines)
Lines 484-489 Circulation: Link Here
484
                  no: "Don't allow"
484
                  no: "Don't allow"
485
            - "holds to expire automatically if they have not been picked by within the time period specified in ReservesMaxPickUpDelay"
485
            - "holds to expire automatically if they have not been picked by within the time period specified in ReservesMaxPickUpDelay"
486
        -
486
        -
487
            - pref: ExpireReservesAutoFill
488
              choices:
489
                  yes: "Do"
490
                  no: "Don't"
491
            - automatically fill the next hold using the item. If enabled, an email notification will be sent to either the email address defined in ExpireReservesAutoFillEmail, the item's holding library's email address, or the email address defined in KohaAdminEmailAddress in that order.
492
        -
493
            - Send email notification of the new hold filled with a canceled item to
494
            - pref: ExpireReservesAutoFillEmail
495
            - . If no address is defined here, the email will be sent to either the item's holding library or the email address defined in KohaAdminEmailAddress in that order.
496
        -
487
            - If using ExpireReservesMaxPickUpDelay, charge a borrower who allows his or her waiting hold to expire a fee of
497
            - If using ExpireReservesMaxPickUpDelay, charge a borrower who allows his or her waiting hold to expire a fee of
488
            - pref: ExpireReservesMaxPickUpDelayCharge
498
            - pref: ExpireReservesMaxPickUpDelayCharge
489
              class: currency
499
              class: currency
(-)a/t/db_dependent/Holds/RevertWaitingStatus.t (-1 / +1 lines)
Lines 81-87 foreach my $borrowernumber (@borrowernumbers) { Link Here
81
    );
81
    );
82
}
82
}
83
83
84
ModReserveAffect( $itemnumber, $borrowernumbers[0] );
84
ModReserveAffect( { itemnumber => $itemnumber, borrowernumber => $borrowernumbers[0] } );
85
C4::Circulation::AddIssue( GetMember( borrowernumber => $borrowernumbers[1] ),
85
C4::Circulation::AddIssue( GetMember( borrowernumber => $borrowernumbers[1] ),
86
    $item_barcode, my $datedue, my $cancelreserve = 'revert' );
86
    $item_barcode, my $datedue, my $cancelreserve = 'revert' );
87
87
(-)a/t/db_dependent/Reserves.t (-8 / +7 lines)
Lines 239-245 AddReserve('FPL', $requesters{'FPL'}, $bibnum2, Link Here
239
AddReserve('CPL',  $requesters{'CPL'}, $bibnum2,
239
AddReserve('CPL',  $requesters{'CPL'}, $bibnum2,
240
           $bibitems,  3, $resdate, $expdate, $notes,
240
           $bibitems,  3, $resdate, $expdate, $notes,
241
           $title,      $checkitem, $found);
241
           $title,      $checkitem, $found);
242
ModReserveAffect($itemnum_cpl, $requesters{'RPL'}, 0);
242
ModReserveAffect( { itemnumber => $itemnum_cpl, borrowernumber => $requesters{'RPL'}, is_transfer => 0 } );
243
243
244
# Now it should have different priorities.
244
# Now it should have different priorities.
245
my $title_reserves = GetReservesFromBiblionumber({biblionumber => $bibnum2});
245
my $title_reserves = GetReservesFromBiblionumber({biblionumber => $bibnum2});
Lines 355-366 is(exists $messages->{ResFound}?1:0, 1, 'AddReturn considers future reserve with Link Here
355
355
356
# test marking a hold as captured
356
# test marking a hold as captured
357
my $hold_notice_count = count_hold_print_messages();
357
my $hold_notice_count = count_hold_print_messages();
358
ModReserveAffect($itemnumber, $requesters{'CPL'}, 0);
358
ModReserveAffect( { itemnumber => $itemnumber, borrowernumber => $requesters{'CPL'}, is_transfer => 0 } );
359
my $new_count = count_hold_print_messages();
359
my $new_count = count_hold_print_messages();
360
is($new_count, $hold_notice_count + 1, 'patron notified when item set to waiting');
360
is($new_count, $hold_notice_count + 1, 'patron notified when item set to waiting');
361
361
362
# test that duplicate notices aren't generated
362
# test that duplicate notices aren't generated
363
ModReserveAffect($itemnumber, $requesters{'CPL'}, 0);
363
ModReserveAffect( { itemnumber => $itemnumber, borrowernumber => $requesters{'CPL'}, is_transfer => 0 } );
364
$new_count = count_hold_print_messages();
364
$new_count = count_hold_print_messages();
365
is($new_count, $hold_notice_count + 1, 'patron not notified a second time (bug 11445)');
365
is($new_count, $hold_notice_count + 1, 'patron not notified a second time (bug 11445)');
366
366
Lines 396-402 AddReserve('CPL', $requesters{'CPL'}, $bibnum, Link Here
396
@results= GetReservesFromItemnumber($itemnumber);
396
@results= GetReservesFromItemnumber($itemnumber);
397
is(defined $results[3]?1:0, 0, 'GetReservesFromItemnumber does not return a future item level hold');
397
is(defined $results[3]?1:0, 0, 'GetReservesFromItemnumber does not return a future item level hold');
398
# 9788c: GetReservesFromItemnumber returns future wait (confirmed future hold)
398
# 9788c: GetReservesFromItemnumber returns future wait (confirmed future hold)
399
ModReserveAffect( $itemnumber,  $requesters{'CPL'} , 0); #confirm hold
399
ModReserveAffect( { itemnumber => $itemnumber, borrowernumber => $requesters{'CPL'}, is_transfer => 0 } ); #confirm hold
400
@results= GetReservesFromItemnumber($itemnumber);
400
@results= GetReservesFromItemnumber($itemnumber);
401
is(defined $results[3]?1:0, 1, 'GetReservesFromItemnumber returns a future wait (confirmed future hold)');
401
is(defined $results[3]?1:0, 1, 'GetReservesFromItemnumber returns a future wait (confirmed future hold)');
402
# End of tests for bug 9788
402
# End of tests for bug 9788
Lines 421-427 AddReserve('CPL', $requesters{'CPL'}, $bibnum, Link Here
421
           $title,      $itemnumber, $found);
421
           $title,      $itemnumber, $found);
422
$p = C4::Reserves::CalculatePriority($bibnum);
422
$p = C4::Reserves::CalculatePriority($bibnum);
423
is($p, 2, 'CalculatePriority should now return priority 2');
423
is($p, 2, 'CalculatePriority should now return priority 2');
424
ModReserveAffect( $itemnumber,  $requesters{'CPL'} , 0);
424
ModReserveAffect( { itemnumber => $itemnumber, borrowernumber => $requesters{'CPL'}, is_transfer => 0 } );
425
$p = C4::Reserves::CalculatePriority($bibnum);
425
$p = C4::Reserves::CalculatePriority($bibnum);
426
is($p, 1, 'CalculatePriority should now return priority 1');
426
is($p, 1, 'CalculatePriority should now return priority 1');
427
#add another biblio hold, no resdate
427
#add another biblio hold, no resdate
Lines 479-485 is($cancancel, 1, 'Can user cancel its own reserve'); Link Here
479
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'FPL'});
479
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'FPL'});
480
is($cancancel, 0, 'Other user cant cancel reserve');
480
is($cancancel, 0, 'Other user cant cancel reserve');
481
481
482
ModReserveAffect($itemnumber, $requesters{'CPL'}, 1);
482
ModReserveAffect( { itemnumber => $itemnumber, borrowernumber => $requesters{'CPL'}, is_transfer => 1 } );
483
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'CPL'});
483
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'CPL'});
484
is($cancancel, 0, 'Reserve in transfer status cant be canceled');
484
is($cancancel, 0, 'Reserve in transfer status cant be canceled');
485
485
Lines 489-495 AddReserve('CPL', $requesters{'CPL'}, $item_bibnum, Link Here
489
           $title,      $checkitem, '');
489
           $title,      $checkitem, '');
490
(undef, $canres, undef) = CheckReserves($itemnumber);
490
(undef, $canres, undef) = CheckReserves($itemnumber);
491
491
492
ModReserveAffect($itemnumber, $requesters{'CPL'}, 0);
492
ModReserveAffect( { itemnumber => $itemnumber, borrowernumber => $requesters{'CPL'}, is_transfer => 0 } );
493
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'CPL'});
493
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'CPL'});
494
is($cancancel, 0, 'Reserve in waiting status cant be canceled');
494
is($cancancel, 0, 'Reserve in waiting status cant be canceled');
495
495
496
- 

Return to bug 14364