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 135-137 Ihr Biblioheksteam' Link Here
135
135
136
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
136
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
137
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')
137
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
139
INSERT INTO letter(module,code,branchcode,name,is_html,title,content,message_transport_type)
140
    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>>).
141
142
            Please update the hold information for this item.
143
144
            Title: <<biblio.title>>
145
            Author: <<biblio.author>>
146
            Copy: <<items.copynumber>>
147
            Pickup location: <<branches.branchname>>', 'email');
(-)a/installer/data/mysql/en/mandatory/sample_notices.sql (+10 lines)
Lines 147-149 Your library.' Link Here
147
147
148
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
148
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
149
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')
149
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
151
INSERT INTO letter(module,code,branchcode,name,is_html,title,content,message_transport_type)
152
    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>>).
153
154
            Please update the hold information for this item.
155
156
            Title: <<biblio.title>>
157
            Author: <<biblio.author>>
158
            Copy: <<items.copynumber>>
159
            Pickup location: <<branches.branchname>>', 'email');
(-)a/installer/data/mysql/es-ES/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/fr-FR/1-Obligatoire/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/installer/data/mysql/nb-NO/1-Obligatorisk/sample_notices.sql (+10 lines)
Lines 169-171 Your library.' Link Here
169
169
170
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
170
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
171
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')
171
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
173
INSERT INTO letter(module,code,branchcode,name,is_html,title,content,message_transport_type)
174
    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>>).
175
176
Please update the hold information for this item.
177
178
Title: <<biblio.title>>
179
Author: <<biblio.author>>
180
Copy: <<items.copynumber>>
181
Pickup location: <<branches.branchname>>', 'email');
(-)a/installer/data/mysql/pl-PL/mandatory/sample_notices.sql (+10 lines)
Lines 146-148 Your library.' Link Here
146
146
147
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
147
INSERT INTO letter(module, code, branchcode, name, title, content, message_transport_type)
148
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')
148
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')
149
150
INSERT INTO letter(module,code,branchcode,name,is_html,title,content,message_transport_type)
151
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>>).
152
153
Please update the hold information for this item.
154
155
Title: <<biblio.title>>
156
Author: <<biblio.author>>
157
Copy: <<items.copynumber>>
158
Pickup location: <<branches.branchname>>', 'email');
(-)a/installer/data/mysql/ru-RU/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/installer/data/mysql/sysprefs.sql (+2 lines)
Lines 122-127 INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` Link Here
122
('EnableSearchHistory','0','','Enable or disable search history','YesNo'),
122
('EnableSearchHistory','0','','Enable or disable search history','YesNo'),
123
('EnhancedMessagingPreferences','0','','If ON, allows patrons to select to receive additional messages about items due or nearly due.','YesNo'),
123
('EnhancedMessagingPreferences','0','','If ON, allows patrons to select to receive additional messages about items due or nearly due.','YesNo'),
124
('expandedSearchOption','0',NULL,'If ON, set advanced search to be expanded by default','YesNo'),
124
('expandedSearchOption','0',NULL,'If ON, set advanced search to be expanded by default','YesNo'),
125
('ExpireReservesAutoFill','0',NULL,'Automatically fill the next hold with a automatically canceled expired waiting hold.','YesNo'),
126
('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'),
125
('ExpireReservesMaxPickUpDelay','0','','Enabling this allows holds to expire automatically if they have not been picked by within the time period specified in ReservesMaxPickUpDelay','YesNo'),
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'),
126
('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'),
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'),
127
('ExpireReservesOnHolidays', '1', NULL, 'If false, reserves at a library will not be canceled on days the library is not open.', 'YesNo'),
129
('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 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/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref (+10 lines)
Lines 474-479 Circulation: Link Here
474
                  no: "Don't allow"
474
                  no: "Don't allow"
475
            - "holds to expire automatically if they have not been picked by within the time period specified in ReservesMaxPickUpDelay"
475
            - "holds to expire automatically if they have not been picked by within the time period specified in ReservesMaxPickUpDelay"
476
        -
476
        -
477
            - pref: ExpireReservesAutoFill
478
              choices:
479
                  yes: "Do"
480
                  no: "Don't"
481
            - 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.
482
        -
483
            - Send email notification of the new hold filled with a canceled item to
484
            - pref: ExpireReservesAutoFillEmail
485
            - . 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.
486
        -
477
            - If using ExpireReservesMaxPickUpDelay, charge a borrower who allows his or her waiting hold to expire a fee of
487
            - If using ExpireReservesMaxPickUpDelay, charge a borrower who allows his or her waiting hold to expire a fee of
478
            - pref: ExpireReservesMaxPickUpDelayCharge
488
            - pref: ExpireReservesMaxPickUpDelayCharge
479
              class: currency
489
              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 231-237 AddReserve('FPL', $requesters{'FPL'}, $bibnum2, Link Here
231
AddReserve('CPL',  $requesters{'CPL'}, $bibnum2,
231
AddReserve('CPL',  $requesters{'CPL'}, $bibnum2,
232
           $constraint, $bibitems,  3, $resdate, $expdate, $notes,
232
           $constraint, $bibitems,  3, $resdate, $expdate, $notes,
233
           $title,      $checkitem, $found);
233
           $title,      $checkitem, $found);
234
ModReserveAffect($itemnum_cpl, $requesters{'RPL'}, 0);
234
ModReserveAffect( { itemnumber => $itemnum_cpl, borrowernumber => $requesters{'RPL'}, is_transfer => 0 } );
235
235
236
# Now it should have different priorities.
236
# Now it should have different priorities.
237
my $title_reserves = GetReservesFromBiblionumber({biblionumber => $bibnum2});
237
my $title_reserves = GetReservesFromBiblionumber({biblionumber => $bibnum2});
Lines 343-354 is(exists $messages->{ResFound}?1:0, 1, 'AddReturn considers future reserve with Link Here
343
343
344
# test marking a hold as captured
344
# test marking a hold as captured
345
my $hold_notice_count = count_hold_print_messages();
345
my $hold_notice_count = count_hold_print_messages();
346
ModReserveAffect($itemnumber, $requesters{'CPL'}, 0);
346
ModReserveAffect( { itemnumber => $itemnumber, borrowernumber => $requesters{'CPL'}, is_transfer => 0 } );
347
my $new_count = count_hold_print_messages();
347
my $new_count = count_hold_print_messages();
348
is($new_count, $hold_notice_count + 1, 'patron notified when item set to waiting');
348
is($new_count, $hold_notice_count + 1, 'patron notified when item set to waiting');
349
349
350
# test that duplicate notices aren't generated
350
# test that duplicate notices aren't generated
351
ModReserveAffect($itemnumber, $requesters{'CPL'}, 0);
351
ModReserveAffect( { itemnumber => $itemnumber, borrowernumber => $requesters{'CPL'}, is_transfer => 0 } );
352
$new_count = count_hold_print_messages();
352
$new_count = count_hold_print_messages();
353
is($new_count, $hold_notice_count + 1, 'patron not notified a second time (bug 11445)');
353
is($new_count, $hold_notice_count + 1, 'patron not notified a second time (bug 11445)');
354
354
Lines 384-390 AddReserve('CPL', $requesters{'CPL'}, $bibnum, Link Here
384
@results= GetReservesFromItemnumber($itemnumber);
384
@results= GetReservesFromItemnumber($itemnumber);
385
is(defined $results[3]?1:0, 0, 'GetReservesFromItemnumber does not return a future item level hold');
385
is(defined $results[3]?1:0, 0, 'GetReservesFromItemnumber does not return a future item level hold');
386
# 9788c: GetReservesFromItemnumber returns future wait (confirmed future hold)
386
# 9788c: GetReservesFromItemnumber returns future wait (confirmed future hold)
387
ModReserveAffect( $itemnumber,  $requesters{'CPL'} , 0); #confirm hold
387
ModReserveAffect( { itemnumber => $itemnumber, borrowernumber => $requesters{'CPL'}, is_transfer => 0 } ); #confirm hold
388
@results= GetReservesFromItemnumber($itemnumber);
388
@results= GetReservesFromItemnumber($itemnumber);
389
is(defined $results[3]?1:0, 1, 'GetReservesFromItemnumber returns a future wait (confirmed future hold)');
389
is(defined $results[3]?1:0, 1, 'GetReservesFromItemnumber returns a future wait (confirmed future hold)');
390
# End of tests for bug 9788
390
# End of tests for bug 9788
Lines 408-414 AddReserve('CPL', $requesters{'CPL'}, $bibnum, Link Here
408
           $title,      $itemnumber, $found);
408
           $title,      $itemnumber, $found);
409
$p = C4::Reserves::CalculatePriority($bibnum);
409
$p = C4::Reserves::CalculatePriority($bibnum);
410
is($p, 2, 'CalculatePriority should now return priority 2');
410
is($p, 2, 'CalculatePriority should now return priority 2');
411
ModReserveAffect( $itemnumber,  $requesters{'CPL'} , 0);
411
ModReserveAffect( { itemnumber => $itemnumber, borrowernumber => $requesters{'CPL'}, is_transfer => 0 } );
412
$p = C4::Reserves::CalculatePriority($bibnum);
412
$p = C4::Reserves::CalculatePriority($bibnum);
413
is($p, 1, 'CalculatePriority should now return priority 1');
413
is($p, 1, 'CalculatePriority should now return priority 1');
414
#add another biblio hold, no resdate
414
#add another biblio hold, no resdate
Lines 458-464 is($cancancel, 1, 'Can user cancel its own reserve'); Link Here
458
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'FPL'});
458
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'FPL'});
459
is($cancancel, 0, 'Other user cant cancel reserve');
459
is($cancancel, 0, 'Other user cant cancel reserve');
460
460
461
ModReserveAffect($itemnumber, $requesters{'CPL'}, 1);
461
ModReserveAffect( { itemnumber => $itemnumber, borrowernumber => $requesters{'CPL'}, is_transfer => 1 } );
462
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'CPL'});
462
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'CPL'});
463
is($cancancel, 0, 'Reserve in transfer status cant be canceled');
463
is($cancancel, 0, 'Reserve in transfer status cant be canceled');
464
464
Lines 468-474 AddReserve('CPL', $requesters{'CPL'}, $item_bibnum, Link Here
468
           $title,      $checkitem, '');
468
           $title,      $checkitem, '');
469
(undef, $canres, undef) = CheckReserves($itemnumber);
469
(undef, $canres, undef) = CheckReserves($itemnumber);
470
470
471
ModReserveAffect($itemnumber, $requesters{'CPL'}, 0);
471
ModReserveAffect( { itemnumber => $itemnumber, borrowernumber => $requesters{'CPL'}, is_transfer => 0 } );
472
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'CPL'});
472
$cancancel = CanReserveBeCanceledFromOpac($canres->{reserve_id}, $requesters{'CPL'});
473
is($cancancel, 0, 'Reserve in waiting status cant be canceled');
473
is($cancancel, 0, 'Reserve in waiting status cant be canceled');
474
474
475
- 

Return to bug 14364