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

(-)a/C4/Reserves.pm (-28 / +115 lines)
Lines 252-258 sub AddReserve { Link Here
252
    foreach (@$bibitems) {
252
    foreach (@$bibitems) {
253
        $sth->execute($borrowernumber, $biblionumber, $resdate, $_);
253
        $sth->execute($borrowernumber, $biblionumber, $resdate, $_);
254
    }
254
    }
255
        
255
256
    return $reserve_id;
256
    return $reserve_id;
257
}
257
}
258
258
Lines 498-504 sub CanItemBeReserved{ Link Here
498
    my $dbh             = C4::Context->dbh;
498
    my $dbh             = C4::Context->dbh;
499
    my $ruleitemtype; # itemtype of the matching issuing rule
499
    my $ruleitemtype; # itemtype of the matching issuing rule
500
    my $allowedreserves = 0;
500
    my $allowedreserves = 0;
501
            
501
502
    # we retrieve borrowers and items informations #
502
    # we retrieve borrowers and items informations #
503
    # item->{itype} will come for biblioitems if necessery
503
    # item->{itype} will come for biblioitems if necessery
504
    my $item = GetItem($itemnumber);
504
    my $item = GetItem($itemnumber);
Lines 535-542 sub CanItemBeReserved{ Link Here
535
                                LEFT JOIN borrowers USING (borrowernumber)
535
                                LEFT JOIN borrowers USING (borrowernumber)
536
                            WHERE borrowernumber = ?
536
                            WHERE borrowernumber = ?
537
                                ";
537
                                ";
538
    
538
539
    
539
540
    my $branchcode   = "";
540
    my $branchcode   = "";
541
    my $branchfield  = "reserves.branchcode";
541
    my $branchfield  = "reserves.branchcode";
542
542
Lines 547-558 sub CanItemBeReserved{ Link Here
547
        $branchfield = "borrowers.branchcode";
547
        $branchfield = "borrowers.branchcode";
548
        $branchcode = $borrower->{branchcode};
548
        $branchcode = $borrower->{branchcode};
549
    }
549
    }
550
    
550
551
    # we retrieve rights 
551
    # we retrieve rights
552
    $sth->execute($borrower->{'categorycode'}, $item->{'itype'}, $branchcode);
552
    $sth->execute($borrower->{'categorycode'}, $item->{'itype'}, $branchcode);
553
    if(my $rights = $sth->fetchrow_hashref()){
553
    if(my $rights = $sth->fetchrow_hashref()){
554
        $ruleitemtype    = $rights->{itemtype};
554
        $ruleitemtype    = $rights->{itemtype};
555
        $allowedreserves = $rights->{reservesallowed}; 
555
        $allowedreserves = $rights->{reservesallowed};
556
    }else{
556
    }else{
557
        $ruleitemtype = '*';
557
        $ruleitemtype = '*';
558
    }
558
    }
Lines 560-569 sub CanItemBeReserved{ Link Here
560
    # we retrieve count
560
    # we retrieve count
561
561
562
    $querycount .= "AND $branchfield = ?";
562
    $querycount .= "AND $branchfield = ?";
563
    
563
564
    $querycount .= " AND $itemtypefield = ?" if ($ruleitemtype ne "*");
564
    $querycount .= " AND $itemtypefield = ?" if ($ruleitemtype ne "*");
565
    my $sthcount = $dbh->prepare($querycount);
565
    my $sthcount = $dbh->prepare($querycount);
566
    
566
567
    if($ruleitemtype eq "*"){
567
    if($ruleitemtype eq "*"){
568
        $sthcount->execute($borrowernumber, $branchcode);
568
        $sthcount->execute($borrowernumber, $branchcode);
569
    }else{
569
    }else{
Lines 818-825 sub GetReservesToBranch { Link Here
818
    my $dbh = C4::Context->dbh;
818
    my $dbh = C4::Context->dbh;
819
    my $sth = $dbh->prepare(
819
    my $sth = $dbh->prepare(
820
        "SELECT reserve_id,borrowernumber,reservedate,itemnumber,timestamp
820
        "SELECT reserve_id,borrowernumber,reservedate,itemnumber,timestamp
821
         FROM reserves 
821
         FROM reserves
822
         WHERE priority='0' 
822
         WHERE priority='0'
823
           AND branchcode=?"
823
           AND branchcode=?"
824
    );
824
    );
825
    $sth->execute( $frombranch );
825
    $sth->execute( $frombranch );
Lines 844-850 sub GetReservesForBranch { Link Here
844
844
845
    my $query = "
845
    my $query = "
846
        SELECT reserve_id,borrowernumber,reservedate,itemnumber,waitingdate
846
        SELECT reserve_id,borrowernumber,reservedate,itemnumber,waitingdate
847
        FROM   reserves 
847
        FROM   reserves
848
        WHERE   priority='0'
848
        WHERE   priority='0'
849
        AND found='W'
849
        AND found='W'
850
    ";
850
    ";
Lines 1102-1108 sub CancelExpiredReserves { Link Here
1102
                    manualinvoice($res->{'borrowernumber'}, $res->{'itemnumber'}, 'Hold waiting too long', 'F', $charge);
1102
                    manualinvoice($res->{'borrowernumber'}, $res->{'itemnumber'}, 'Hold waiting too long', 'F', $charge);
1103
                }
1103
                }
1104
1104
1105
                CancelReserve({ reserve_id => $res->{'reserve_id'} });
1105
                CancelReserve(
1106
                    {
1107
                        reserve_id => $res->{'reserve_id'},
1108
                        autofill   => C4::Context->preference('ExpireReservesAutoFill'),
1109
                    }
1110
                );
1106
            }
1111
            }
1107
        }
1112
        }
1108
    }
1113
    }
Lines 1129-1135 sub AutoUnsuspendReserves { Link Here
1129
1134
1130
=head2 CancelReserve
1135
=head2 CancelReserve
1131
1136
1132
  CancelReserve({ reserve_id => $reserve_id, [ biblionumber => $biblionumber, borrowernumber => $borrrowernumber, itemnumber => $itemnumber ] });
1137
  CancelReserve({ reserve_id => $reserve_id, [ biblionumber => $biblionumber, borrowernumber => $borrrowernumber, itemnumber => $itemnumber, autofill => $autofill ] });
1133
1138
1134
Cancels a reserve.
1139
Cancels a reserve.
1135
1140
Lines 1139-1144 sub CancelReserve { Link Here
1139
    my ( $params ) = @_;
1144
    my ( $params ) = @_;
1140
1145
1141
    my $reserve_id = $params->{'reserve_id'};
1146
    my $reserve_id = $params->{'reserve_id'};
1147
    my $autofill   = $params->{autofill};
1148
1142
    $reserve_id = GetReserveId( $params ) unless ( $reserve_id );
1149
    $reserve_id = GetReserveId( $params ) unless ( $reserve_id );
1143
1150
1144
    return unless ( $reserve_id );
1151
    return unless ( $reserve_id );
Lines 1174-1179 sub CancelReserve { Link Here
1174
1181
1175
        # now fix the priority on the others....
1182
        # now fix the priority on the others....
1176
        _FixPriority({ biblionumber => $reserve->{biblionumber} });
1183
        _FixPriority({ biblionumber => $reserve->{biblionumber} });
1184
1185
        # only attempt to autofill canceled holds that were found and waiting
1186
        if ( $autofill && $reserve->{itemnumber} && $reserve->{found} && $reserve->{found} eq 'W' ) {
1187
            my ( undef, $next_hold ) = CheckReserves( $reserve->{'itemnumber'} );
1188
            if ($next_hold) {
1189
                my $is_transfer = $reserve->{branchcode} ne $next_hold->{branchcode};
1190
1191
                ModReserveAffect(
1192
                    {
1193
                        itemnumber     => $reserve->{itemnumber},
1194
                        borrowernumber => $next_hold->{borrowernumber},
1195
                        is_transfer    => $is_transfer,
1196
                        notify_library => 1,
1197
                    }
1198
                );
1199
1200
                ModItemTransfer( $reserve->{itemnumber}, $reserve->{branchcode}, $next_hold->{branchcode} )
1201
                  if $is_transfer;
1202
            }
1203
        }
1177
    }
1204
    }
1178
1205
1179
    return $reserve;
1206
    return $reserve;
Lines 1367-1373 take care of the waiting status Link Here
1367
=cut
1394
=cut
1368
1395
1369
sub ModReserveAffect {
1396
sub ModReserveAffect {
1370
    my ( $itemnumber, $borrowernumber,$transferToDo ) = @_;
1397
    my ( $params ) = @_;
1398
1399
    my $itemnumber     = $params->{itemnumber};
1400
    my $borrowernumber = $params->{borrowernumber};
1401
    my $transferToDo   = $params->{is_transfer};
1402
    my $notify_library = $params->{notify_library};
1403
1371
    my $dbh = C4::Context->dbh;
1404
    my $dbh = C4::Context->dbh;
1372
1405
1373
    # we want to attach $itemnumber to $borrowernumber, find the biblionumber
1406
    # we want to attach $itemnumber to $borrowernumber, find the biblionumber
Lines 1412-1419 sub ModReserveAffect { Link Here
1412
    }
1445
    }
1413
    $sth = $dbh->prepare($query);
1446
    $sth = $dbh->prepare($query);
1414
    $sth->execute( $itemnumber, $borrowernumber,$biblionumber);
1447
    $sth->execute( $itemnumber, $borrowernumber,$biblionumber);
1415
    _koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber ) if ( !$transferToDo && !$already_on_shelf );
1448
1449
    _koha_notify_reserve(
1450
        {
1451
            itemnumber     => $itemnumber,
1452
            borrowernumber => $borrowernumber,
1453
            biblionumber   => $biblionumber,
1454
            notify_library => $notify_library,
1455
        }
1456
    ) if ( !$transferToDo && !$already_on_shelf );
1457
1416
    _FixPriority( { biblionumber => $biblionumber } );
1458
    _FixPriority( { biblionumber => $biblionumber } );
1459
1417
    if ( C4::Context->preference("ReturnToShelvingCart") ) {
1460
    if ( C4::Context->preference("ReturnToShelvingCart") ) {
1418
      CartToShelf( $itemnumber );
1461
      CartToShelf( $itemnumber );
1419
    }
1462
    }
Lines 1458-1464 sub ModReserveMinusPriority { Link Here
1458
    my $dbh   = C4::Context->dbh;
1501
    my $dbh   = C4::Context->dbh;
1459
    my $query = "
1502
    my $query = "
1460
        UPDATE reserves
1503
        UPDATE reserves
1461
        SET    priority = 0 , itemnumber = ? 
1504
        SET    priority = 0 , itemnumber = ?
1462
        WHERE  reserve_id = ?
1505
        WHERE  reserve_id = ?
1463
    ";
1506
    ";
1464
    my $sth_upd = $dbh->prepare($query);
1507
    my $sth_upd = $dbh->prepare($query);
Lines 1673-1679 sub ToggleLowestPriority { Link Here
1673
1716
1674
    my $sth = $dbh->prepare( "UPDATE reserves SET lowestPriority = NOT lowestPriority WHERE reserve_id = ?");
1717
    my $sth = $dbh->prepare( "UPDATE reserves SET lowestPriority = NOT lowestPriority WHERE reserve_id = ?");
1675
    $sth->execute( $reserve_id );
1718
    $sth->execute( $reserve_id );
1676
    
1719
1677
    _FixPriority({ reserve_id => $reserve_id, rank => '999999' });
1720
    _FixPriority({ reserve_id => $reserve_id, rank => '999999' });
1678
}
1721
}
1679
1722
Lines 1882-1888 sub _FixPriority { Link Here
1882
            $priority[$j]->{'reserve_id'}
1925
            $priority[$j]->{'reserve_id'}
1883
        );
1926
        );
1884
    }
1927
    }
1885
    
1928
1886
    $sth = $dbh->prepare( "SELECT reserve_id FROM reserves WHERE lowestPriority = 1 ORDER BY priority" );
1929
    $sth = $dbh->prepare( "SELECT reserve_id FROM reserves WHERE lowestPriority = 1 ORDER BY priority" );
1887
    $sth->execute();
1930
    $sth->execute();
1888
1931
Lines 2026-2032 sub _Findgroupreserve { Link Here
2026
2069
2027
=head2 _koha_notify_reserve
2070
=head2 _koha_notify_reserve
2028
2071
2029
  _koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber );
2072
_koha_notify_reserve(
2073
    {
2074
        itemnumber     => $itemnumber,
2075
        borrowernumber => $borrowernumber,
2076
        biblionumber   => $biblionumber,
2077
        notify_library => $notify_library
2078
    }
2079
);
2030
2080
2031
Sends a notification to the patron that their hold has been filled (through
2081
Sends a notification to the patron that their hold has been filled (through
2032
ModReserveAffect, _not_ ModReserveFill)
2082
ModReserveAffect, _not_ ModReserveFill)
Lines 2034-2040 ModReserveAffect, _not_ ModReserveFill) Link Here
2034
=cut
2084
=cut
2035
2085
2036
sub _koha_notify_reserve {
2086
sub _koha_notify_reserve {
2037
    my ($itemnumber, $borrowernumber, $biblionumber) = @_;
2087
    my ( $params ) = @_;
2088
2089
    my $itemnumber     = $params->{itemnumber};
2090
    my $borrowernumber = $params->{borrowernumber};
2091
    my $biblionumber   = $params->{biblionumber};
2092
    my $notify_library = $params->{notify_library};
2038
2093
2039
    my $dbh = C4::Context->dbh;
2094
    my $dbh = C4::Context->dbh;
2040
    my $borrower = C4::Members::GetMember(borrowernumber => $borrowernumber);
2095
    my $borrower = C4::Members::GetMember(borrowernumber => $borrowernumber);
Lines 2084-2095 sub _koha_notify_reserve { Link Here
2084
            return;
2139
            return;
2085
        }
2140
        }
2086
2141
2087
        C4::Letters::EnqueueLetter( {
2142
        C4::Letters::EnqueueLetter(
2088
            letter => $letter,
2143
            {
2089
            borrowernumber => $borrowernumber,
2144
                letter                 => $letter,
2090
            from_address => $admin_email_address,
2145
                borrowernumber         => $borrowernumber,
2091
            message_transport_type => $mtt,
2146
                from_address           => $admin_email_address,
2092
        } );
2147
                message_transport_type => $mtt,
2148
            }
2149
        );
2093
    };
2150
    };
2094
2151
2095
    while ( my ( $mtt, $letter_code ) = each %{ $messagingprefs->{transports} } ) {
2152
    while ( my ( $mtt, $letter_code ) = each %{ $messagingprefs->{transports} } ) {
Lines 2106-2112 sub _koha_notify_reserve { Link Here
2106
    if (! $notification_sent) {
2163
    if (! $notification_sent) {
2107
        &$send_notification('print', 'HOLD');
2164
        &$send_notification('print', 'HOLD');
2108
    }
2165
    }
2109
    
2166
2167
    if ($notify_library) {
2168
        my $letter = C4::Letters::GetPreparedLetter(
2169
            module      => 'reserves',
2170
            letter_code => 'HOLD_CHANGED',
2171
            branchcode  => $reserve->{branchcode},
2172
            substitute  => { today => C4::Dates->new()->output() },
2173
            tables      => {
2174
                'branches'  => $branch_details,
2175
                'borrowers' => $borrower,
2176
                'biblio'    => $biblionumber,
2177
                'reserves'  => $reserve,
2178
                'items'     => $reserve->{'itemnumber'},
2179
            },
2180
        );
2181
2182
        my $email =
2183
             C4::Context->preference('ExpireReservesAutoFillEmail')
2184
          || $branch_details->{'branchemail'}
2185
          || C4::Context->preference('KohaAdminEmailAddress');
2186
2187
        C4::Letters::EnqueueLetter(
2188
            {
2189
                letter                 => $letter,
2190
                borrowernumber         => $borrowernumber,
2191
                message_transport_type => 'email',
2192
                from_address           => $email,
2193
                to_address             => $email,
2194
            }
2195
        );
2196
    }
2110
}
2197
}
2111
2198
2112
=head2 _ShiftPriorityByDateAndPriority
2199
=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 (-1 / +1 lines)
Lines 149-155 if ( $query->param('resbarcode') ) { Link Here
149
    my $diffBranchSend = ($userenv_branch ne $diffBranchReturned) ? $diffBranchReturned : undef;
149
    my $diffBranchSend = ($userenv_branch ne $diffBranchReturned) ? $diffBranchReturned : undef;
150
# diffBranchSend tells ModReserveAffect whether document is expected in this library or not,
150
# diffBranchSend tells ModReserveAffect whether document is expected in this library or not,
151
# i.e., whether to apply waiting status
151
# i.e., whether to apply waiting status
152
    ModReserveAffect( $item, $borrowernumber, $diffBranchSend);
152
    ModReserveAffect( { itemnumber => $item, borrowernumber => $borrowernumber, is_transfer => $diffBranchSend } );
153
#   check if we have other reserves for this document, if we have a return send the message of transfer
153
#   check if we have other reserves for this document, if we have a return send the message of transfer
154
    my ( $messages, $nextreservinfo ) = GetOtherReserves($item);
154
    my ( $messages, $nextreservinfo ) = GetOtherReserves($item);
155
155
(-)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 136-138 Ihr Biblioheksteam' Link Here
136
136
137
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
137
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
138
VALUES ('acquisition', 'ACQ_NOTIF_ON_RECEIV', '', 'Benachrichtigung bei Zugang', 'Bestelltes Medium ist eingetroffen', 'Liebe/r <<borrowers.firstname>> <<borrowers.surname>>,\n\nDie Bestellung <<aqorders.ordernumber>> (<<biblio.title>>) ist eingetroffen und wird bearbeitet.\n\nIhr Bibliotheksteam', 'email')
138
VALUES ('acquisition', 'ACQ_NOTIF_ON_RECEIV', '', 'Benachrichtigung bei Zugang', 'Bestelltes Medium ist eingetroffen', 'Liebe/r <<borrowers.firstname>> <<borrowers.surname>>,\n\nDie Bestellung <<aqorders.ordernumber>> (<<biblio.title>>) ist eingetroffen und wird bearbeitet.\n\nIhr Bibliotheksteam', 'email')
139
140
INSERT INTO letter(module,code,branchcode,name,is_html,title,content,message_transport_type)
141
    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>>).
142
143
            Please update the hold information for this item.
144
145
            Title: <<biblio.title>>
146
            Author: <<biblio.author>>
147
            Copy: <<items.copynumber>>
148
            Pickup location: <<branches.branchname>>', 'email');
(-)a/installer/data/mysql/en/mandatory/sample_notices.sql (+10 lines)
Lines 155-157 Your library.' Link Here
155
155
156
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
156
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
157
VALUES ('acquisition', 'ACQ_NOTIF_ON_RECEIV', '', 'Notification on receiving', 'Order received', 'Dear <<borrowers.firstname>> <<borrowers.surname>>,\n\n The order <<aqorders.ordernumber>> (<<biblio.title>>) has been received.\n\nYour library.', 'email')
157
VALUES ('acquisition', 'ACQ_NOTIF_ON_RECEIV', '', 'Notification on receiving', 'Order received', 'Dear <<borrowers.firstname>> <<borrowers.surname>>,\n\n The order <<aqorders.ordernumber>> (<<biblio.title>>) has been received.\n\nYour library.', 'email')
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/es-ES/mandatory/sample_notices.sql (+10 lines)
Lines 150-152 Your library.' Link Here
150
150
151
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
151
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
152
VALUES ('acquisition', 'ACQ_NOTIF_ON_RECEIV', '', 'Notification on receiving', 'Order received', 'Dear <<borrowers.firstname>> <<borrowers.surname>>,\n\n The order <<aqorders.ordernumber>> (<<biblio.title>>) has been received.\n\nYour library.', 'email')
152
VALUES ('acquisition', 'ACQ_NOTIF_ON_RECEIV', '', 'Notification on receiving', 'Order received', 'Dear <<borrowers.firstname>> <<borrowers.surname>>,\n\n The order <<aqorders.ordernumber>> (<<biblio.title>>) has been received.\n\nYour library.', 'email')
153
154
INSERT INTO letter(module,code,branchcode,name,is_html,title,content,message_transport_type)
155
    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>>).
156
157
Please update the hold information for this item.
158
159
Title: <<biblio.title>>
160
Author: <<biblio.author>>
161
Copy: <<items.copynumber>>
162
Pickup location: <<branches.branchname>>', 'email');
(-)a/installer/data/mysql/fr-FR/1-Obligatoire/sample_notices.sql (+10 lines)
Lines 151-153 Your library.' Link Here
151
151
152
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
152
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
153
VALUES ('acquisition', 'ACQ_NOTIF_ON_RECEIV', '', 'Notification on receiving', 'Order received', 'Dear <<borrowers.firstname>> <<borrowers.surname>>,\n\n The order <<aqorders.ordernumber>> (<<biblio.title>>) has been received.\n\nYour library.', 'email')
153
VALUES ('acquisition', 'ACQ_NOTIF_ON_RECEIV', '', 'Notification on receiving', 'Order received', 'Dear <<borrowers.firstname>> <<borrowers.surname>>,\n\n The order <<aqorders.ordernumber>> (<<biblio.title>>) has been received.\n\nYour library.', 'email')
154
155
INSERT INTO letter(module,code,branchcode,name,is_html,title,content,message_transport_type)
156
    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>>).
157
158
Please update the hold information for this item.
159
160
Title: <<biblio.title>>
161
Author: <<biblio.author>>
162
Copy: <<items.copynumber>>
163
Pickup location: <<branches.branchname>>', 'email');
(-)a/installer/data/mysql/nb-NO/1-Obligatorisk/sample_notices.sql (+10 lines)
Lines 170-172 Your library.' Link Here
170
170
171
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
171
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
172
VALUES ('acquisition', 'ACQ_NOTIF_ON_RECEIV', '', 'Notification on receiving', 'Order received', 'Dear <<borrowers.firstname>> <<borrowers.surname>>,\n\n The order <<aqorders.ordernumber>> (<<biblio.title>>) has been received.\n\nYour library.', 'email')
172
VALUES ('acquisition', 'ACQ_NOTIF_ON_RECEIV', '', 'Notification on receiving', 'Order received', 'Dear <<borrowers.firstname>> <<borrowers.surname>>,\n\n The order <<aqorders.ordernumber>> (<<biblio.title>>) has been received.\n\nYour library.', 'email')
173
174
INSERT INTO letter(module,code,branchcode,name,is_html,title,content,message_transport_type)
175
    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>>).
176
177
Please update the hold information for this item.
178
179
Title: <<biblio.title>>
180
Author: <<biblio.author>>
181
Copy: <<items.copynumber>>
182
Pickup location: <<branches.branchname>>', 'email');
(-)a/installer/data/mysql/pl-PL/mandatory/sample_notices.sql (+10 lines)
Lines 148-150 Your library.' Link Here
148
148
149
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
149
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
150
VALUES ('acquisition', 'ACQ_NOTIF_ON_RECEIV', '', 'Notification on receiving', 'Order received', 'Dear <<borrowers.firstname>> <<borrowers.surname>>,\n\n The order <<aqorders.ordernumber>> (<<biblio.title>>) has been received.\n\nYour library.', 'email')
150
VALUES ('acquisition', 'ACQ_NOTIF_ON_RECEIV', '', 'Notification on receiving', 'Order received', 'Dear <<borrowers.firstname>> <<borrowers.surname>>,\n\n The order <<aqorders.ordernumber>> (<<biblio.title>>) has been received.\n\nYour library.', 'email')
151
152
INSERT INTO letter(module,code,branchcode,name,is_html,title,content,message_transport_type)
153
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>>).
154
155
Please update the hold information for this item.
156
157
Title: <<biblio.title>>
158
Author: <<biblio.author>>
159
Copy: <<items.copynumber>>
160
Pickup location: <<branches.branchname>>', 'email');
(-)a/installer/data/mysql/ru-RU/mandatory/sample_notices.sql (+10 lines)
Lines 150-152 Your library.' Link Here
150
150
151
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
151
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
152
VALUES ('acquisition', 'ACQ_NOTIF_ON_RECEIV', '', 'Notification on receiving', 'Order received', 'Dear <<borrowers.firstname>> <<borrowers.surname>>,\n\n The order <<aqorders.ordernumber>> (<<biblio.title>>) has been received.\n\nYour library.', 'email')
152
VALUES ('acquisition', 'ACQ_NOTIF_ON_RECEIV', '', 'Notification on receiving', 'Order received', 'Dear <<borrowers.firstname>> <<borrowers.surname>>,\n\n The order <<aqorders.ordernumber>> (<<biblio.title>>) has been received.\n\nYour library.', 'email')
153
154
INSERT INTO letter(module,code,branchcode,name,is_html,title,content,message_transport_type)
155
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>>).
156
157
Please update the hold information for this item.
158
159
Title: <<biblio.title>>
160
Author: <<biblio.author>>
161
Copy: <<items.copynumber>>
162
Pickup location: <<branches.branchname>>', 'email');
(-)a/installer/data/mysql/sysprefs.sql (+2 lines)
Lines 124-129 INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` Link Here
124
('EnableSearchHistory','0','','Enable or disable search history','YesNo'),
124
('EnableSearchHistory','0','','Enable or disable search history','YesNo'),
125
('EnhancedMessagingPreferences','0','','If ON, allows patrons to select to receive additional messages about items due or nearly due.','YesNo'),
125
('EnhancedMessagingPreferences','0','','If ON, allows patrons to select to receive additional messages about items due or nearly due.','YesNo'),
126
('expandedSearchOption','0',NULL,'If ON, set advanced search to be expanded by default','YesNo'),
126
('expandedSearchOption','0',NULL,'If ON, set advanced search to be expanded by default','YesNo'),
127
('ExpireReservesAutoFill','0',NULL,'Automatically fill the next hold with a automatically canceled expired waiting hold.','YesNo'),
128
('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'),
127
('ExpireReservesMaxPickUpDelay','0','','Enabling this allows holds to expire automatically if they have not been picked by within the time period specified in ReservesMaxPickUpDelay','YesNo'),
129
('ExpireReservesMaxPickUpDelay','0','','Enabling this allows holds to expire automatically if they have not been picked by within the time period specified in ReservesMaxPickUpDelay','YesNo'),
128
('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'),
130
('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'),
129
('ExpireReservesOnHolidays', '1', NULL, 'If false, reserves at a library will not be canceled on days the library is not open.', 'YesNo'),
131
('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 149-151 Your library.' Link Here
149
149
150
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
150
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
151
VALUES ('acquisition', 'ACQ_NOTIF_ON_RECEIV', '', 'Notification on receiving', 'Order received', 'Dear <<borrowers.firstname>> <<borrowers.surname>>,\n\n The order <<aqorders.ordernumber>> (<<biblio.title>>) has been received.\n\nYour library.', 'email')
151
VALUES ('acquisition', 'ACQ_NOTIF_ON_RECEIV', '', 'Notification on receiving', 'Order received', 'Dear <<borrowers.firstname>> <<borrowers.surname>>,\n\n The order <<aqorders.ordernumber>> (<<biblio.title>>) has been received.\n\nYour library.', 'email')
152
153
INSERT INTO letter(module,code,branchcode,name,is_html,title,content,message_transport_type)
154
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>>).
155
156
Please update the hold information for this item.
157
158
Title: <<biblio.title>>
159
Author: <<biblio.author>>
160
Copy: <<items.copynumber>>
161
Pickup location: <<branches.branchname>>', 'email');
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref (+10 lines)
Lines 467-472 Circulation: Link Here
467
                  no: "Don't allow"
467
                  no: "Don't allow"
468
            - "holds to expire automatically if they have not been picked by within the time period specified in ReservesMaxPickUpDelay"
468
            - "holds to expire automatically if they have not been picked by within the time period specified in ReservesMaxPickUpDelay"
469
        -
469
        -
470
            - pref: ExpireReservesAutoFill
471
              choices:
472
                  yes: "Do"
473
                  no: "Don't"
474
            - 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.
475
        -
476
            - Send email notification of the new hold filled with a canceled item to
477
            - pref: ExpireReservesAutoFillEmail
478
            - . 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.
479
        -
470
            - If using ExpireReservesMaxPickUpDelay, charge a borrower who allows his or her waiting hold to expire a fee of
480
            - If using ExpireReservesMaxPickUpDelay, charge a borrower who allows his or her waiting hold to expire a fee of
471
            - pref: ExpireReservesMaxPickUpDelayCharge
481
            - pref: ExpireReservesMaxPickUpDelayCharge
472
              class: currency
482
              class: currency
(-)a/t/db_dependent/Holds/RevertWaitingStatus.t (-1 / +1 lines)
Lines 79-85 foreach my $borrowernumber (@borrowernumbers) { Link Here
79
    );
79
    );
80
}
80
}
81
81
82
ModReserveAffect( $itemnumber, $borrowernumbers[0] );
82
ModReserveAffect( { itemnumber => $itemnumber, borrowernumber => $borrowernumbers[0] } );
83
C4::Circulation::AddIssue( GetMember( borrowernumber => $borrowernumbers[1] ),
83
C4::Circulation::AddIssue( GetMember( borrowernumber => $borrowernumbers[1] ),
84
    $item_barcode, my $datedue, my $cancelreserve = 'revert' );
84
    $item_barcode, my $datedue, my $cancelreserve = 'revert' );
85
85
(-)a/t/db_dependent/Reserves.t (-8 / +7 lines)
Lines 232-238 AddReserve('FPL', $requesters{'FPL'}, $bibnum2, Link Here
232
AddReserve('CPL',  $requesters{'CPL'}, $bibnum2,
232
AddReserve('CPL',  $requesters{'CPL'}, $bibnum2,
233
           $constraint, $bibitems,  3, $resdate, $expdate, $notes,
233
           $constraint, $bibitems,  3, $resdate, $expdate, $notes,
234
           $title,      $checkitem, $found);
234
           $title,      $checkitem, $found);
235
ModReserveAffect($itemnum_cpl, $requesters{'RPL'}, 0);
235
ModReserveAffect( { itemnumber => $itemnum_cpl, borrowernumber => $requesters{'RPL'}, is_transfer => 0 } );
236
236
237
# Now it should have different priorities.
237
# Now it should have different priorities.
238
my $title_reserves = GetReservesFromBiblionumber({biblionumber => $bibnum2});
238
my $title_reserves = GetReservesFromBiblionumber({biblionumber => $bibnum2});
Lines 348-359 is(exists $messages->{ResFound}?1:0, 1, 'AddReturn considers future reserve with Link Here
348
348
349
# test marking a hold as captured
349
# test marking a hold as captured
350
my $hold_notice_count = count_hold_print_messages();
350
my $hold_notice_count = count_hold_print_messages();
351
ModReserveAffect($itemnumber, $requesters{'CPL'}, 0);
351
ModReserveAffect( { itemnumber => $itemnumber, borrowernumber => $requesters{'CPL'}, is_transfer => 0 } );
352
my $new_count = count_hold_print_messages();
352
my $new_count = count_hold_print_messages();
353
is($new_count, $hold_notice_count + 1, 'patron notified when item set to waiting');
353
is($new_count, $hold_notice_count + 1, 'patron notified when item set to waiting');
354
354
355
# test that duplicate notices aren't generated
355
# test that duplicate notices aren't generated
356
ModReserveAffect($itemnumber, $requesters{'CPL'}, 0);
356
ModReserveAffect( { itemnumber => $itemnumber, borrowernumber => $requesters{'CPL'}, is_transfer => 0 } );
357
$new_count = count_hold_print_messages();
357
$new_count = count_hold_print_messages();
358
is($new_count, $hold_notice_count + 1, 'patron not notified a second time (bug 11445)');
358
is($new_count, $hold_notice_count + 1, 'patron not notified a second time (bug 11445)');
359
359
Lines 389-395 AddReserve('CPL', $requesters{'CPL'}, $bibnum, Link Here
389
@results= GetReservesFromItemnumber($itemnumber);
389
@results= GetReservesFromItemnumber($itemnumber);
390
is(defined $results[3]?1:0, 0, 'GetReservesFromItemnumber does not return a future item level hold');
390
is(defined $results[3]?1:0, 0, 'GetReservesFromItemnumber does not return a future item level hold');
391
# 9788c: GetReservesFromItemnumber returns future wait (confirmed future hold)
391
# 9788c: GetReservesFromItemnumber returns future wait (confirmed future hold)
392
ModReserveAffect( $itemnumber,  $requesters{'CPL'} , 0); #confirm hold
392
ModReserveAffect( { itemnumber => $itemnumber, borrowernumber => $requesters{'CPL'}, is_transfer => 0 } ); #confirm hold
393
@results= GetReservesFromItemnumber($itemnumber);
393
@results= GetReservesFromItemnumber($itemnumber);
394
is(defined $results[3]?1:0, 1, 'GetReservesFromItemnumber returns a future wait (confirmed future hold)');
394
is(defined $results[3]?1:0, 1, 'GetReservesFromItemnumber returns a future wait (confirmed future hold)');
395
# End of tests for bug 9788
395
# End of tests for bug 9788
Lines 413-419 AddReserve('CPL', $requesters{'CPL'}, $bibnum, Link Here
413
           $title,      $itemnumber, $found);
413
           $title,      $itemnumber, $found);
414
$p = C4::Reserves::CalculatePriority($bibnum);
414
$p = C4::Reserves::CalculatePriority($bibnum);
415
is($p, 2, 'CalculatePriority should now return priority 2');
415
is($p, 2, 'CalculatePriority should now return priority 2');
416
ModReserveAffect( $itemnumber,  $requesters{'CPL'} , 0);
416
ModReserveAffect( { itemnumber => $itemnumber, borrowernumber => $requesters{'CPL'}, is_transfer => 0 } );
417
$p = C4::Reserves::CalculatePriority($bibnum);
417
$p = C4::Reserves::CalculatePriority($bibnum);
418
is($p, 1, 'CalculatePriority should now return priority 1');
418
is($p, 1, 'CalculatePriority should now return priority 1');
419
#add another biblio hold, no resdate
419
#add another biblio hold, no resdate
Lines 463-469 is($cancancel, 1, 'Can user cancel its own reserve'); Link Here
463
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'FPL'});
463
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'FPL'});
464
is($cancancel, 0, 'Other user cant cancel reserve');
464
is($cancancel, 0, 'Other user cant cancel reserve');
465
465
466
ModReserveAffect($itemnumber, $requesters{'CPL'}, 1);
466
ModReserveAffect( { itemnumber => $itemnumber, borrowernumber => $requesters{'CPL'}, is_transfer => 1 } );
467
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'CPL'});
467
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'CPL'});
468
is($cancancel, 0, 'Reserve in transfer status cant be canceled');
468
is($cancancel, 0, 'Reserve in transfer status cant be canceled');
469
469
Lines 473-479 AddReserve('CPL', $requesters{'CPL'}, $item_bibnum, Link Here
473
           $title,      $checkitem, '');
473
           $title,      $checkitem, '');
474
(undef, $canres, undef) = CheckReserves($itemnumber);
474
(undef, $canres, undef) = CheckReserves($itemnumber);
475
475
476
ModReserveAffect($itemnumber, $requesters{'CPL'}, 0);
476
ModReserveAffect( { itemnumber => $itemnumber, borrowernumber => $requesters{'CPL'}, is_transfer => 0 } );
477
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'CPL'});
477
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'CPL'});
478
is($cancancel, 0, 'Reserve in waiting status cant be canceled');
478
is($cancancel, 0, 'Reserve in waiting status cant be canceled');
479
479
480
- 

Return to bug 14364