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

(-)a/C4/Letters.pm (-2 / +1 lines)
Lines 612-619 sub _parseletter { Link Here
612
    if ( $table eq 'reserves' && $values->{'waitingdate'} ) {
612
    if ( $table eq 'reserves' && $values->{'waitingdate'} ) {
613
        my @waitingdate = split /-/, $values->{'waitingdate'};
613
        my @waitingdate = split /-/, $values->{'waitingdate'};
614
614
615
        my $dt = dt_from_string();
615
        my $dt = dt_from_string($values->{maxpickupdate});
616
        $dt->add( days => C4::Context->preference('ReservesMaxPickUpDelay') );
617
        $values->{'expirationdate'} = output_pref( $dt, undef, 1 );
616
        $values->{'expirationdate'} = output_pref( $dt, undef, 1 );
618
617
619
        $values->{'waitingdate'} = output_pref( dt_from_string( $values->{'waitingdate'} ), undef, 1 );
618
        $values->{'waitingdate'} = output_pref( dt_from_string( $values->{'waitingdate'} ), undef, 1 );
(-)a/C4/Reserves.pm (-20 / +121 lines)
Lines 23-28 package C4::Reserves; Link Here
23
23
24
use strict;
24
use strict;
25
#use warnings; FIXME - Bug 2505
25
#use warnings; FIXME - Bug 2505
26
use Date::Calc qw( Add_Delta_Days );
26
use C4::Context;
27
use C4::Context;
27
use C4::Biblio;
28
use C4::Biblio;
28
use C4::Members;
29
use C4::Members;
Lines 117-123 BEGIN { Link Here
117
        
118
        
118
        &CheckReserves
119
        &CheckReserves
119
        &CanBookBeReserved
120
        &CanBookBeReserved
120
	&CanItemBeReserved
121
        &CanItemBeReserved
121
        &CancelReserve
122
        &CancelReserve
122
        &CancelExpiredReserves
123
        &CancelExpiredReserves
123
124
Lines 131-136 BEGIN { Link Here
131
        &ReserveSlip
132
        &ReserveSlip
132
        &ToggleSuspend
133
        &ToggleSuspend
133
        &SuspendAll
134
        &SuspendAll
135
        &GetReservesControlBranch
134
    );
136
    );
135
    @EXPORT_OK = qw( MergeHolds );
137
    @EXPORT_OK = qw( MergeHolds );
136
}    
138
}    
Lines 170-204 sub AddReserve { Link Here
170
        $waitingdate = $resdate;
172
        $waitingdate = $resdate;
171
    }
173
    }
172
174
175
    my $item = C4::Items::GetItem( $checkitem );
176
    my $maxpickupdate = GetMaxPickupDate( undef, $item );
177
173
    #eval {
178
    #eval {
174
    # updates take place here
179
    # updates take place here
175
    if ( $fee > 0 ) {
180
    if ( $fee > 0 ) {
176
        my $nextacctno = &getnextacctno( $borrowernumber );
181
        my $nextacctno = &getnextacctno( $borrowernumber );
177
        my $query      = qq/
182
        my $query      = q{
178
        INSERT INTO accountlines
183
        INSERT INTO accountlines
179
            (borrowernumber,accountno,date,amount,description,accounttype,amountoutstanding)
184
            (borrowernumber,accountno,date,amount,description,accounttype,amountoutstanding)
180
        VALUES
185
        VALUES
181
            (?,?,now(),?,?,'Res',?)
186
            (?,?,now(),?,?,'Res',?)
182
    /;
187
        };
183
        my $usth = $dbh->prepare($query);
188
        my $usth = $dbh->prepare($query);
184
        $usth->execute( $borrowernumber, $nextacctno, $fee,
189
        $usth->execute( $borrowernumber, $nextacctno, $fee,
185
            "Reserve Charge - $title", $fee );
190
            "Reserve Charge - $title", $fee );
186
    }
191
    }
187
192
188
    #if ($const eq 'a'){
193
    #if ($const eq 'a'){
189
    my $query = qq/
194
    my $query = q{
190
        INSERT INTO reserves
195
        INSERT INTO reserves
191
            (borrowernumber,biblionumber,reservedate,branchcode,constrainttype,
196
            (borrowernumber,biblionumber,reservedate,branchcode,constrainttype,
192
            priority,reservenotes,itemnumber,found,waitingdate,expirationdate)
197
            priority,reservenotes,itemnumber,found,waitingdate,expirationdate,maxpickupdate)
193
        VALUES
198
        VALUES
194
             (?,?,?,?,?,
199
             (?,?,?,?,?,
195
             ?,?,?,?,?,?)
200
             ?,?,?,?,?,?,?)
196
    /;
201
    };
197
    my $sth = $dbh->prepare($query);
202
    my $sth = $dbh->prepare($query);
198
    $sth->execute(
203
    $sth->execute(
199
        $borrowernumber, $biblionumber, $resdate, $branch,
204
        $borrowernumber, $biblionumber, $resdate, $branch,
200
        $const,          $priority,     $notes,   $checkitem,
205
        $const,          $priority,     $notes,   $checkitem,
201
        $found,          $waitingdate,	$expdate
206
        $found,          $waitingdate,  $expdate, $maxpickupdate
202
    );
207
    );
203
208
204
    # Send e-mail to librarian if syspref is active
209
    # Send e-mail to librarian if syspref is active
Lines 527-532 sub CanItemBeReserved{ Link Here
527
532
528
    return 1;
533
    return 1;
529
}
534
}
535
536
=head2 GetMaxPickupDate
537
538
$maxpickupdate = &GetMaxPickupDate($reserve [, $item]);
539
$reserve->{waitingdate} is a string or a DateTime.
540
541
this function returns the max pickup date (DateTime format).
542
(e.g. : the date after which the hold will be considered cancelled)
543
544
=cut
545
546
sub GetMaxPickupDate {
547
    my ( $reserve, $item ) = @_;
548
549
    if ( not defined $reserve and not defined $item->{itemnumber} ) {
550
        warn "ERROR: GetMaxPickupDate is called without reserve and without itemnumber";
551
        return;
552
    }
553
554
    if ( defined $reserve and not defined $item ) {
555
        $item = C4::Items::GetItem( $reserve->{itemnumber} );
556
    }
557
558
    unless ( defined $reserve ) {
559
        my $reserve = GetReservesFromItemnumber( $item->{itemnumber} );
560
    }
561
    return unless $reserve->{waitingdate};
562
563
    my $borrower = C4::Members::GetMember( 'borrowernumber' => $reserve->{borrowernumber} );
564
565
    my $controlbranch = GetReservesControlBranch( $borrower, $item );
566
567
    my $issuingrule = C4::Circulation::GetIssuingRule( $borrower->{categorycode}, $item->{itype}, $controlbranch );
568
569
    my $date = ref $reserve->{waitingdate} eq 'DateTime'
570
        ? $reserve->{waitingdate}
571
        : dt_from_string $reserve->{waitingdate};
572
573
    my $holdspickupdelay = 0;
574
    if ( defined($issuingrule)
575
        and defined $issuingrule->{holdspickupdelay} ) {
576
        $holdspickupdelay = $issuingrule->{holdspickupdelay}
577
    }
578
579
    $date->add( days => $holdspickupdelay );
580
581
    return $date;
582
}
583
584
=head2 GetReservesControlBranch
585
586
$branchcode = &GetReservesControlBranch($borrower, $item)
587
588
Returns the branchcode to consider to check hold rules against
589
590
=cut
591
592
sub GetReservesControlBranch {
593
    my ( $borrower, $item ) = @_;
594
    my $controlbranch = C4::Context->preference('ReservesControlBranch');
595
    my $hbr           = C4::Context->preference('HomeOrHoldingBranch') || "homebranch";
596
    my $branchcode    = "*";
597
    if ( $controlbranch eq "ItemHomeLibrary" ) {
598
        $branchcode = $item->{$hbr};
599
    } elsif ( $controlbranch eq "PatronLibrary" ) {
600
        $branchcode = $borrower->{branchcode};
601
    }
602
    return $branchcode;
603
}
604
530
#--------------------------------------------------------------------------------
605
#--------------------------------------------------------------------------------
531
=head2 GetReserveCount
606
=head2 GetReserveCount
532
607
Lines 738-747 sub GetReservesToBranch { Link Here
738
813
739
sub GetReservesForBranch {
814
sub GetReservesForBranch {
740
    my ($frombranch) = @_;
815
    my ($frombranch) = @_;
741
    my $dbh = C4::Context->dbh;
742
816
743
    my $query = "
817
    my $dbh          = C4::Context->dbh;
744
        SELECT reserve_id,borrowernumber,reservedate,itemnumber,waitingdate
818
    my $query        = "
819
        SELECT reserve_id, borrowernumber, reservedate, itemnumber, waitingdate, maxpickupdate
745
        FROM   reserves 
820
        FROM   reserves 
746
        WHERE   priority='0'
821
        WHERE   priority='0'
747
        AND found='W'
822
        AND found='W'
Lines 940-954 sub CancelExpiredReserves { Link Here
940
    while ( my $res = $sth->fetchrow_hashref() ) {
1015
    while ( my $res = $sth->fetchrow_hashref() ) {
941
        CancelReserve({ reserve_id => $res->{'reserve_id'} });
1016
        CancelReserve({ reserve_id => $res->{'reserve_id'} });
942
    }
1017
    }
943
  
1018
944
    # Cancel reserves that have been waiting too long
1019
    # Cancel reserves that have been waiting too long
945
    if ( C4::Context->preference("ExpireReservesMaxPickUpDelay") ) {
1020
    if ( C4::Context->preference("ExpireReservesMaxPickUpDelay") ) {
946
        my $max_pickup_delay = C4::Context->preference("ReservesMaxPickUpDelay");
947
        my $charge = C4::Context->preference("ExpireReservesMaxPickUpDelayCharge");
1021
        my $charge = C4::Context->preference("ExpireReservesMaxPickUpDelayCharge");
948
1022
949
        my $query = "SELECT * FROM reserves WHERE TO_DAYS( NOW() ) - TO_DAYS( waitingdate ) > ? AND found = 'W' AND priority = 0";
1023
        my $query = "SELECT * FROM reserves WHERE NOW() > maxpickupdate AND found = 'W' AND priority = 0";
950
        $sth = $dbh->prepare( $query );
1024
        $sth = $dbh->prepare( $query );
951
        $sth->execute( $max_pickup_delay );
1025
        $sth->execute();
952
1026
953
        while (my $res = $sth->fetchrow_hashref ) {
1027
        while (my $res = $sth->fetchrow_hashref ) {
954
            if ( $charge ) {
1028
            if ( $charge ) {
Lines 1215-1223 sub ModReserveStatus { Link Here
1215
    my ($itemnumber, $newstatus) = @_;
1289
    my ($itemnumber, $newstatus) = @_;
1216
    my $dbh = C4::Context->dbh;
1290
    my $dbh = C4::Context->dbh;
1217
1291
1218
    my $query = "UPDATE reserves SET found = ?, waitingdate = NOW() WHERE itemnumber = ? AND found IS NULL AND priority = 0";
1292
    my $now = dt_from_string;
1293
    my $reserve = $dbh->selectrow_hashref(q{
1294
        SELECT *
1295
        FROM reserves
1296
        WHERE itemnumber = ?
1297
            AND found IS NULL
1298
            AND priority = 0
1299
    }, {}, $itemnumber);
1300
    return unless $reserve;
1301
1302
    my $maxpickupdate = GetMaxPickupDate( $reserve );
1303
    my $query = q{
1304
        UPDATE reserves
1305
        SET found = ?,
1306
            waitingdate = ?,
1307
            maxpickupdate = ?
1308
        WHERE itemnumber = ?
1309
            AND found IS NULL
1310
            AND priority = 0
1311
    };
1219
    my $sth_set = $dbh->prepare($query);
1312
    my $sth_set = $dbh->prepare($query);
1220
    $sth_set->execute( $newstatus, $itemnumber );
1313
    $sth_set->execute( $newstatus, $now, $maxpickupdate, $itemnumber );
1221
1314
1222
    if ( C4::Context->preference("ReturnToShelvingCart") && $newstatus ) {
1315
    if ( C4::Context->preference("ReturnToShelvingCart") && $newstatus ) {
1223
      CartToShelf( $itemnumber );
1316
      CartToShelf( $itemnumber );
Lines 1265-1285 sub ModReserveAffect { Link Here
1265
        WHERE borrowernumber = ?
1358
        WHERE borrowernumber = ?
1266
          AND biblionumber = ?
1359
          AND biblionumber = ?
1267
    ";
1360
    ";
1361
        $sth = $dbh->prepare($query);
1362
        $sth->execute( $itemnumber, $borrowernumber,$biblionumber);
1268
    }
1363
    }
1269
    else {
1364
    else {
1270
    # affect the reserve to Waiting as well.
1365
    # affect the reserve to Waiting as well.
1366
        my $item = C4::Items::GetItem( $itemnumber );
1367
        my $maxpickupdate = GetMaxPickupDate( undef, $item );
1271
        $query = "
1368
        $query = "
1272
            UPDATE reserves
1369
            UPDATE reserves
1273
            SET     priority = 0,
1370
            SET     priority = 0,
1274
                    found = 'W',
1371
                    found = 'W',
1275
                    waitingdate = NOW(),
1372
                    waitingdate = NOW(),
1373
                    maxpickupdate = ?,
1276
                    itemnumber = ?
1374
                    itemnumber = ?
1277
            WHERE borrowernumber = ?
1375
            WHERE borrowernumber = ?
1278
              AND biblionumber = ?
1376
              AND biblionumber = ?
1279
        ";
1377
        ";
1378
        $sth = $dbh->prepare($query);
1379
        $sth->execute( $maxpickupdate, $itemnumber, $borrowernumber,$biblionumber);
1280
    }
1380
    }
1281
    $sth = $dbh->prepare($query);
1282
    $sth->execute( $itemnumber, $borrowernumber,$biblionumber);
1283
    _koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber ) if ( !$transferToDo && !$already_on_shelf );
1381
    _koha_notify_reserve( $itemnumber, $borrowernumber, $biblionumber ) if ( !$transferToDo && !$already_on_shelf );
1284
1382
1285
    if ( C4::Context->preference("ReturnToShelvingCart") ) {
1383
    if ( C4::Context->preference("ReturnToShelvingCart") ) {
Lines 1355-1360 sub GetReserveInfo { Link Here
1355
                   reserves.biblionumber,
1453
                   reserves.biblionumber,
1356
                   reserves.branchcode,
1454
                   reserves.branchcode,
1357
                   reserves.waitingdate,
1455
                   reserves.waitingdate,
1456
                   reserves.maxpickupdate,
1358
                   notificationdate,
1457
                   notificationdate,
1359
                   reminderdate,
1458
                   reminderdate,
1360
                   priority,
1459
                   priority,
Lines 1791-1796 sub _Findgroupreserve { Link Here
1791
               reserves.borrowernumber             AS borrowernumber,
1890
               reserves.borrowernumber             AS borrowernumber,
1792
               reserves.reservedate                AS reservedate,
1891
               reserves.reservedate                AS reservedate,
1793
               reserves.waitingdate                AS waitingdate,
1892
               reserves.waitingdate                AS waitingdate,
1893
               reserves.maxpickupdate              AS maxpickupdate,
1794
               reserves.branchcode                 AS branchcode,
1894
               reserves.branchcode                 AS branchcode,
1795
               reserves.cancellationdate           AS cancellationdate,
1895
               reserves.cancellationdate           AS cancellationdate,
1796
               reserves.found                      AS found,
1896
               reserves.found                      AS found,
Lines 2109-2115 sub RevertWaitingStatus { Link Here
2109
    SET
2209
    SET
2110
      priority = 1,
2210
      priority = 1,
2111
      found = NULL,
2211
      found = NULL,
2112
      waitingdate = NULL
2212
      waitingdate = NULL,
2213
      maxpickupdate = NULL,
2113
    WHERE
2214
    WHERE
2114
      reserve_id = ?
2215
      reserve_id = ?
2115
    ";
2216
    ";
(-)a/admin/smart-rules.pl (-6 / +7 lines)
Lines 101-109 elsif ($op eq 'delete-branch-item') { Link Here
101
# save the values entered
101
# save the values entered
102
elsif ($op eq 'add') {
102
elsif ($op eq 'add') {
103
    my $sth_search = $dbh->prepare('SELECT COUNT(*) AS total FROM issuingrules WHERE branchcode=? AND categorycode=? AND itemtype=?');
103
    my $sth_search = $dbh->prepare('SELECT COUNT(*) AS total FROM issuingrules WHERE branchcode=? AND categorycode=? AND itemtype=?');
104
    my $sth_insert = $dbh->prepare('INSERT INTO issuingrules (branchcode, categorycode, itemtype, maxissueqty, renewalsallowed, renewalperiod, reservesallowed, issuelength, lengthunit, hardduedate, hardduedatecompare, fine, finedays, firstremind, chargeperiod,rentaldiscount, overduefinescap) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)');
104
    my $sth_insert = $dbh->prepare('INSERT INTO issuingrules (branchcode, categorycode, itemtype, maxissueqty, renewalsallowed, renewalperiod, reservesallowed, holdspickupdelay, issuelength, lengthunit, hardduedate, hardduedatecompare, fine, finedays, firstremind, chargeperiod,rentaldiscount, overduefinescap) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)');
105
    my $sth_update=$dbh->prepare("UPDATE issuingrules SET fine=?, finedays=?, firstremind=?, chargeperiod=?, maxissueqty=?, renewalsallowed=?, renewalperiod=?, reservesallowed=?, issuelength=?, lengthunit = ?, hardduedate=?, hardduedatecompare=?, rentaldiscount=?, overduefinescap=?  WHERE branchcode=? AND categorycode=? AND itemtype=?");
105
    my $sth_update=$dbh->prepare("UPDATE issuingrules SET fine=?, finedays=?, firstremind=?, chargeperiod=?, maxissueqty=?, renewalsallowed=?, renewalperiod=?, reservesallowed=?, holdspickupdelay=?, issuelength=?, lengthunit = ?, hardduedate=?, hardduedatecompare=?, rentaldiscount=?, overduefinescap=?  WHERE branchcode=? AND categorycode=? AND itemtype=?");
106
    
106
107
    my $br = $branch; # branch
107
    my $br = $branch; # branch
108
    my $bor  = $input->param('categorycode'); # borrower category
108
    my $bor  = $input->param('categorycode'); # borrower category
109
    my $cat  = $input->param('itemtype');     # item type
109
    my $cat  = $input->param('itemtype');     # item type
Lines 115-120 elsif ($op eq 'add') { Link Here
115
    my $renewalsallowed  = $input->param('renewalsallowed');
115
    my $renewalsallowed  = $input->param('renewalsallowed');
116
    my $renewalperiod    = $input->param('renewalperiod');
116
    my $renewalperiod    = $input->param('renewalperiod');
117
    my $reservesallowed  = $input->param('reservesallowed');
117
    my $reservesallowed  = $input->param('reservesallowed');
118
    my $holdspickupdelay = $input->param('holdspickupdelay');
118
    $maxissueqty =~ s/\s//g;
119
    $maxissueqty =~ s/\s//g;
119
    $maxissueqty = undef if $maxissueqty !~ /^\d+/;
120
    $maxissueqty = undef if $maxissueqty !~ /^\d+/;
120
    my $issuelength  = $input->param('issuelength');
121
    my $issuelength  = $input->param('issuelength');
Lines 129-139 elsif ($op eq 'add') { Link Here
129
    $sth_search->execute($br,$bor,$cat);
130
    $sth_search->execute($br,$bor,$cat);
130
    my $res = $sth_search->fetchrow_hashref();
131
    my $res = $sth_search->fetchrow_hashref();
131
    if ($res->{total}) {
132
    if ($res->{total}) {
132
        $sth_update->execute($fine, $finedays,$firstremind, $chargeperiod, $maxissueqty, $renewalsallowed, $renewalperiod, $reservesallowed, $issuelength,$lengthunit, $hardduedate,$hardduedatecompare,$rentaldiscount,$overduefinescap, $br,$bor,$cat);
133
        $sth_update->execute($fine, $finedays,$firstremind, $chargeperiod, $maxissueqty, $renewalsallowed, $renewalperiod, $reservesallowed, $holdspickupdelay, $issuelength,$lengthunit, $hardduedate,$hardduedatecompare,$rentaldiscount,$overduefinescap, $br,$bor,$cat);
133
    } else {
134
    } else {
134
        $sth_insert->execute($br,$bor,$cat,$maxissueqty,$renewalsallowed, $renewalperiod, $reservesallowed,$issuelength,$lengthunit,$hardduedate,$hardduedatecompare,$fine,$finedays,$firstremind,$chargeperiod,$rentaldiscount,$overduefinescap);
135
        $sth_insert->execute($br,$bor,$cat,$maxissueqty,$renewalsallowed, $renewalperiod, $reservesallowed, $holdspickupdelay, $issuelength,$lengthunit,$hardduedate,$hardduedatecompare,$fine,$finedays,$firstremind,$chargeperiod,$rentaldiscount,$overduefinescap);
135
    }
136
    }
136
} 
137
}
137
elsif ($op eq "set-branch-defaults") {
138
elsif ($op eq "set-branch-defaults") {
138
    my $categorycode  = $input->param('categorycode');
139
    my $categorycode  = $input->param('categorycode');
139
    my $maxissueqty   = $input->param('maxissueqty');
140
    my $maxissueqty   = $input->param('maxissueqty');
(-)a/circ/circulation.pl (+3 lines)
Lines 405-410 if ($borrowernumber) { Link Here
405
        if ( $num_res->{'found'} && $num_res->{'found'} eq 'W' ) {
405
        if ( $num_res->{'found'} && $num_res->{'found'} eq 'W' ) {
406
            $getreserv{color}   = 'reserved';
406
            $getreserv{color}   = 'reserved';
407
            $getreserv{waiting} = 1;
407
            $getreserv{waiting} = 1;
408
            $getWaitingReserveInfo{maxpickupdate} = $num_res->{maxpickupdate};
409
            $getreserv{maxpickupdate} = $num_res->{maxpickupdate};
410
408
#     genarate information displaying only waiting reserves
411
#     genarate information displaying only waiting reserves
409
        $getWaitingReserveInfo{title}        = $getiteminfo->{'title'};
412
        $getWaitingReserveInfo{title}        = $getiteminfo->{'title'};
410
        $getWaitingReserveInfo{biblionumber} = $getiteminfo->{'biblionumber'};
413
        $getWaitingReserveInfo{biblionumber} = $getiteminfo->{'biblionumber'};
(-)a/circ/waitingreserves.pl (-31 / +25 lines)
Lines 21-43 Link Here
21
use strict;
21
use strict;
22
use warnings;
22
use warnings;
23
use CGI;
23
use CGI;
24
use DateTime;
24
use C4::Context;
25
use C4::Context;
25
use C4::Output;
26
use C4::Output;
26
use C4::Branch; # GetBranchName
27
use C4::Branch; # GetBranchName
27
use C4::Auth;
28
use C4::Auth;
28
use C4::Dates qw/format_date/;
29
use C4::Dates qw/format_date/;
29
use C4::Circulation;
30
use C4::Circulation;
31
use C4::Reserves;
30
use C4::Members;
32
use C4::Members;
31
use C4::Biblio;
33
use C4::Biblio;
32
use C4::Items;
34
use C4::Items;
33
34
use Date::Calc qw(
35
  Today
36
  Add_Delta_Days
37
  Date_to_Days
38
);
39
use C4::Reserves;
35
use C4::Reserves;
40
use C4::Koha;
36
use C4::Koha;
37
use Koha::DateUtils;
41
38
42
my $input = new CGI;
39
my $input = new CGI;
43
40
Lines 86-116 my ($reservcount, $overcount); Link Here
86
my @getreserves = $all_branches ? GetReservesForBranch() : GetReservesForBranch($default);
83
my @getreserves = $all_branches ? GetReservesForBranch() : GetReservesForBranch($default);
87
# get reserves for the branch we are logged into, or for all branches
84
# get reserves for the branch we are logged into, or for all branches
88
85
89
my $today = Date_to_Days(&Today);
86
my $today = dt_from_string;
90
foreach my $num (@getreserves) {
87
foreach my $num (@getreserves) {
91
    next unless ($num->{'waitingdate'} && $num->{'waitingdate'} ne '0000-00-00');
88
    next unless ($num->{'waitingdate'} && $num->{'waitingdate'} ne '0000-00-00');
92
89
93
    my $itemnumber = $num->{'itemnumber'};
90
    my $itemnumber = $num->{'itemnumber'};
94
    my $gettitle     = GetBiblioFromItemNumber( $itemnumber );
91
    my $gettitle     = GetBiblioFromItemNumber( $itemnumber );
95
    my $borrowernum = $num->{'borrowernumber'};
92
    my $borrowernumber = $num->{'borrowernumber'};
96
    my $holdingbranch = $gettitle->{'holdingbranch'};
93
    my $holdingbranch = $gettitle->{'holdingbranch'};
97
    my $homebranch = $gettitle->{'homebranch'};
94
    my $homebranch = $gettitle->{'homebranch'};
98
95
99
    my %getreserv = (
96
    my %getreserv = (
100
        itemnumber => $itemnumber,
97
        itemnumber => $itemnumber,
101
        borrowernum => $borrowernum,
98
        borrowernum => $borrowernumber,
102
    );
99
    );
103
100
104
    # fix up item type for display
101
    # fix up item type for display
105
    $gettitle->{'itemtype'} = C4::Context->preference('item-level_itypes') ? $gettitle->{'itype'} : $gettitle->{'itemtype'};
102
    $gettitle->{'itemtype'} = C4::Context->preference('item-level_itypes') ? $gettitle->{'itype'} : $gettitle->{'itemtype'};
106
    my $getborrower = GetMember(borrowernumber => $num->{'borrowernumber'});
103
    my $getborrower = GetMember(borrowernumber => $num->{'borrowernumber'});
107
    my $itemtypeinfo = getitemtypeinfo( $gettitle->{'itemtype'} );  # using the fixed up itype/itemtype
104
    my $itemtypeinfo = getitemtypeinfo( $gettitle->{'itemtype'} );  # using the fixed up itype/itemtype
108
    $getreserv{'waitingdate'} = format_date( $num->{'waitingdate'} );
105
109
    my ( $waiting_year, $waiting_month, $waiting_day ) = split (/-/, $num->{'waitingdate'});
106
    if ( $num->{waitingdate} ) {
110
    ( $waiting_year, $waiting_month, $waiting_day ) =
107
        my $maxpickupdate = dt_from_string($num->{maxpickupdate});
111
      Add_Delta_Days( $waiting_year, $waiting_month, $waiting_day,
108
        $getreserv{waitingdate} = $num->{waitingdate};
112
        C4::Context->preference('ReservesMaxPickUpDelay'));
109
        $getreserv{maxpickupdate} = $num->{maxpickupdate};
113
    my $calcDate = Date_to_Days( $waiting_year, $waiting_month, $waiting_day );
110
        if ( DateTime->compare( $today, $maxpickupdate ) == 1 ) {
111
            if ($cancelall) {
112
                my $res = cancel( $itemnumber, $borrowernumber, $holdingbranch, $homebranch, !$transfer_when_cancel_all );
113
                push @cancel_result, $res if $res;
114
                next;
115
            } else {
116
                push @overloop,   \%getreserv;
117
                $overcount++;
118
            }
119
        }else{
120
            push @reservloop, \%getreserv;
121
            $reservcount++;
122
        }
123
    }
114
124
115
    $getreserv{'itemtype'}       = $itemtypeinfo->{'description'};
125
    $getreserv{'itemtype'}       = $itemtypeinfo->{'description'};
116
    $getreserv{'title'}          = $gettitle->{'title'};
126
    $getreserv{'title'}          = $gettitle->{'title'};
Lines 131-151 foreach my $num (@getreserves) { Link Here
131
    if ( $getborrower->{'emailaddress'} ) {
141
    if ( $getborrower->{'emailaddress'} ) {
132
        $getreserv{'borrowermail'}  = $getborrower->{'emailaddress'};
142
        $getreserv{'borrowermail'}  = $getborrower->{'emailaddress'};
133
    }
143
    }
134
 
135
    if ($today > $calcDate) {
136
        if ($cancelall) {
137
            my $res = cancel( $itemnumber, $borrowernum, $holdingbranch, $homebranch, !$transfer_when_cancel_all );
138
            push @cancel_result, $res if $res;
139
            next;
140
        } else {
141
            push @overloop,   \%getreserv;
142
            $overcount++;
143
        }
144
    }else{
145
        push @reservloop, \%getreserv;
146
        $reservcount++;
147
    }
148
    
149
}
144
}
150
145
151
$template->param(cancel_result => \@cancel_result) if @cancel_result;
146
$template->param(cancel_result => \@cancel_result) if @cancel_result;
Lines 155-161 $template->param( Link Here
155
    overloop    => \@overloop,
150
    overloop    => \@overloop,
156
    overcount   => $overcount,
151
    overcount   => $overcount,
157
    show_date   => format_date(C4::Dates->today('iso')),
152
    show_date   => format_date(C4::Dates->today('iso')),
158
    ReservesMaxPickUpDelay => C4::Context->preference('ReservesMaxPickUpDelay')
159
);
153
);
160
154
161
if ($cancelall) {
155
if ($cancelall) {
(-)a/installer/data/mysql/kohastructure.sql (+3 lines)
Lines 1129-1134 CREATE TABLE `issuingrules` ( -- circulation and fine rules Link Here
1129
  `renewalsallowed` smallint(6) NOT NULL default "0", -- how many renewals are allowed
1129
  `renewalsallowed` smallint(6) NOT NULL default "0", -- how many renewals are allowed
1130
  `renewalperiod` int(4) default NULL, -- renewal period in the unit set in issuingrules.lengthunit
1130
  `renewalperiod` int(4) default NULL, -- renewal period in the unit set in issuingrules.lengthunit
1131
  `reservesallowed` smallint(6) NOT NULL default "0", -- how many holds are allowed
1131
  `reservesallowed` smallint(6) NOT NULL default "0", -- how many holds are allowed
1132
  `holdspickupdelay` int(11)  default NULL, -- after how many days a hold is problematic (in days)
1132
  `branchcode` varchar(10) NOT NULL default '', -- the branch this rule is for (branches.branchcode)
1133
  `branchcode` varchar(10) NOT NULL default '', -- the branch this rule is for (branches.branchcode)
1133
  overduefinescap decimal(28,6) default NULL, -- the maximum amount of an overdue fine
1134
  overduefinescap decimal(28,6) default NULL, -- the maximum amount of an overdue fine
1134
  PRIMARY KEY  (`branchcode`,`categorycode`,`itemtype`),
1135
  PRIMARY KEY  (`branchcode`,`categorycode`,`itemtype`),
Lines 1590-1595 CREATE TABLE `old_reserves` ( -- this table holds all holds/reserves that have b Link Here
1590
  `lowestPriority` tinyint(1) NOT NULL, -- has this hold been pinned to the lowest priority in the holds queue (1 for yes, 0 for no)
1591
  `lowestPriority` tinyint(1) NOT NULL, -- has this hold been pinned to the lowest priority in the holds queue (1 for yes, 0 for no)
1591
  `suspend` BOOLEAN NOT NULL DEFAULT 0, -- in this hold suspended (1 for yes, 0 for no)
1592
  `suspend` BOOLEAN NOT NULL DEFAULT 0, -- in this hold suspended (1 for yes, 0 for no)
1592
  `suspend_until` DATETIME NULL DEFAULT NULL, -- the date this hold is suspended until (NULL for infinitely)
1593
  `suspend_until` DATETIME NULL DEFAULT NULL, -- the date this hold is suspended until (NULL for infinitely)
1594
  `maxpickupdate` date NULL DEFAULT NULL, -- the max pickup date for this reserves
1593
  PRIMARY KEY (`reserve_id`),
1595
  PRIMARY KEY (`reserve_id`),
1594
  KEY `old_reserves_borrowernumber` (`borrowernumber`),
1596
  KEY `old_reserves_borrowernumber` (`borrowernumber`),
1595
  KEY `old_reserves_biblionumber` (`biblionumber`),
1597
  KEY `old_reserves_biblionumber` (`biblionumber`),
Lines 1789-1794 CREATE TABLE `reserves` ( -- information related to holds/reserves in Koha Link Here
1789
  `lowestPriority` tinyint(1) NOT NULL,
1791
  `lowestPriority` tinyint(1) NOT NULL,
1790
  `suspend` BOOLEAN NOT NULL DEFAULT 0,
1792
  `suspend` BOOLEAN NOT NULL DEFAULT 0,
1791
  `suspend_until` DATETIME NULL DEFAULT NULL,
1793
  `suspend_until` DATETIME NULL DEFAULT NULL,
1794
  `maxpickupdate` date NULL DEFAULT NULL, -- the max pickup date for this reserves
1792
  PRIMARY KEY (`reserve_id`),
1795
  PRIMARY KEY (`reserve_id`),
1793
  KEY priorityfoundidx (priority,found),
1796
  KEY priorityfoundidx (priority,found),
1794
  KEY `borrowernumber` (`borrowernumber`),
1797
  KEY `borrowernumber` (`borrowernumber`),
(-)a/installer/data/mysql/updatedatabase.pl (+27 lines)
Lines 7067-7072 if ( CheckVersion($DBversion) ) { Link Here
7067
    SetVersion($DBversion);
7067
    SetVersion($DBversion);
7068
}
7068
}
7069
7069
7070
$DBversion = "3.13.00.XXX";
7071
if ( CheckVersion($DBversion) ) {
7072
    my $maxpickupdelay = C4::Context->preference('ReservesMaxPickUpDelay') || 0;
7073
    $dbh->do(q{
7074
        DELETE FROM systempreferences WHERE variable='ReservesMaxPickUpDelay';
7075
    });
7076
    $dbh->do(qq{
7077
        ALTER TABLE issuingrules ADD COLUMN holdspickupdelay INT(11) NULL default NULL AFTER reservesallowed;
7078
    });
7079
    my $sth = $dbh->prepare(q{
7080
        UPDATE issuingrules SET holdspickupdelay = ?
7081
    });
7082
    $sth->execute( $maxpickupdelay );
7083
    $dbh->do(q{
7084
        ALTER TABLE reserves ADD COLUMN maxpickupdate DATE NULL default NULL AFTER suspend_until;
7085
    });
7086
    $sth = $dbh->prepare(q{
7087
        UPDATE reserves SET maxpickupdate = ADDDATE(waitingdate, INTERVAL ? DAY);
7088
    });
7089
    $sth->execute( $maxpickupdelay );
7090
    $dbh->do(q{
7091
        ALTER TABLE old_reserves ADD COLUMN maxpickupdate DATE NULL default NULL AFTER suspend_until;
7092
    });
7093
    print "Upgrade to $DBversion done (8367: Add colum issuingrules.holdspickupdelay and reserves.maxpickupdate. Delete the ReservesMaxPickUpDelay syspref)\n";
7094
    SetVersion($DBversion);
7095
}
7096
7070
=head1 FUNCTIONS
7097
=head1 FUNCTIONS
7071
7098
7072
=head2 TableExists($table)
7099
=head2 TableExists($table)
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref (-6 / +1 lines)
Lines 377-392 Circulation: Link Here
377
                  PatronLibrary: "patron's home library"
377
                  PatronLibrary: "patron's home library"
378
            - to see if the patron can place a hold on the item.    
378
            - to see if the patron can place a hold on the item.    
379
        -
379
        -
380
            - Mark a hold as problematic if it has been waiting for more than
381
            - pref: ReservesMaxPickUpDelay
382
              class: integer
383
            - days.
384
        -
385
            - pref: ExpireReservesMaxPickUpDelay
380
            - pref: ExpireReservesMaxPickUpDelay
386
              choices:
381
              choices:
387
                  yes: Allow
382
                  yes: Allow
388
                  no: "Don't allow"
383
                  no: "Don't allow"
389
            - "holds to expire automatically if they have not been picked by within the time period specified in ReservesMaxPickUpDelay"
384
            - "holds to expire automatically if they have not been picked by within the time period specified in hold pickup delay defined in the issuing rules"
390
        -
385
        -
391
            - If using ExpireReservesMaxPickUpDelay, charge a borrower who allows his or her waiting hold to expire a fee of
386
            - If using ExpireReservesMaxPickUpDelay, charge a borrower who allows his or her waiting hold to expire a fee of
392
            - pref: ExpireReservesMaxPickUpDelayCharge
387
            - pref: ExpireReservesMaxPickUpDelayCharge
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smart-rules.tt (-1 / +5 lines)
Lines 151-158 for="tobranch"><strong>Clone these rules to:</strong></label> <input type="hidde Link Here
151
                <th>Renewals allowed (count)</th>
151
                <th>Renewals allowed (count)</th>
152
                <th>Renewal period</th>
152
                <th>Renewal period</th>
153
                <th>Holds allowed (count)</th>
153
                <th>Holds allowed (count)</th>
154
                <th>Holds pickup delay (day)</th>
154
                <th>Rental discount (%)</th>
155
                <th>Rental discount (%)</th>
155
                <th colspan="2">&nbsp;</th>
156
                <th>&nbsp;</th>
157
                <th>&nbsp;</th>
156
            </tr>
158
            </tr>
157
            </thead>
159
            </thead>
158
            <tbody>
160
            <tbody>
Lines 208-213 for="tobranch"><strong>Clone these rules to:</strong></label> <input type="hidde Link Here
208
							<td>[% rule.renewalsallowed %]</td>
210
							<td>[% rule.renewalsallowed %]</td>
209
                            <td>[% rule.renewalperiod %]</td>
211
                            <td>[% rule.renewalperiod %]</td>
210
							<td>[% rule.reservesallowed %]</td>
212
							<td>[% rule.reservesallowed %]</td>
213
                            <td>[% rule.holdspickupdelay %]</td>
211
							<td>[% rule.rentaldiscount %]</td>
214
							<td>[% rule.rentaldiscount %]</td>
212
                            <td><a href="#" class="editrule">Edit</a></td>
215
                            <td><a href="#" class="editrule">Edit</a></td>
213
							<td>
216
							<td>
Lines 257-262 for="tobranch"><strong>Clone these rules to:</strong></label> <input type="hidde Link Here
257
                    <td><input type="text" name="renewalsallowed" id="renewalsallowed" size="2" /></td>
260
                    <td><input type="text" name="renewalsallowed" id="renewalsallowed" size="2" /></td>
258
                    <td><input type="text" name="renewalperiod" id="renewalperiod" size="3" /></td>
261
                    <td><input type="text" name="renewalperiod" id="renewalperiod" size="3" /></td>
259
                    <td><input type="text" name="reservesallowed" id="reservesallowed" size="2" /></td>
262
                    <td><input type="text" name="reservesallowed" id="reservesallowed" size="2" /></td>
263
                    <td><input type="text" name="holdspickupdelay" id="holdspickupdelay" size="2" /></td>
260
                    <td><input type="text" name="rentaldiscount" id="rentaldiscount" size="2" /></td>
264
                    <td><input type="text" name="rentaldiscount" id="rentaldiscount" size="2" /></td>
261
                    <td colspan="2">
265
                    <td colspan="2">
262
                        <input type="hidden" name="branch" value="[% current_branch %]"/>
266
                        <input type="hidden" name="branch" value="[% current_branch %]"/>
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt (-2 / +2 lines)
Lines 735-741 No patron matched <span class="ex">[% message %]</span> Link Here
735
		    <h4>Holds waiting:</h4>
735
		    <h4>Holds waiting:</h4>
736
			        [% FOREACH WaitingReserveLoo IN WaitingReserveLoop %]
736
			        [% FOREACH WaitingReserveLoo IN WaitingReserveLoop %]
737
			            <ul>
737
			            <ul>
738
			                <li> <a href="/cgi-bin/koha/reserve/request.pl?biblionumber=[% WaitingReserveLoo.biblionumber %]">[% WaitingReserveLoo.title |html %]</a> ([% WaitingReserveLoo.itemtype %]), [% IF ( WaitingReserveLoo.author ) %]by [% WaitingReserveLoo.author %][% END %] [% IF ( WaitingReserveLoo.itemcallnumber ) %][[% WaitingReserveLoo.itemcallnumber %]] [% END %]Hold placed on [% WaitingReserveLoo.reservedate %].
738
                            <li> <a href="/cgi-bin/koha/reserve/request.pl?biblionumber=[% WaitingReserveLoo.biblionumber %]">[% WaitingReserveLoo.title |html %]</a> ([% WaitingReserveLoo.itemtype %]), [% IF ( WaitingReserveLoo.author ) %]by [% WaitingReserveLoo.author %][% END %] [% IF ( WaitingReserveLoo.itemcallnumber ) %][[% WaitingReserveLoo.itemcallnumber %]] [% END %]Hold placed on [% WaitingReserveLoo.reservedate %] waiting until [% WaitingReserveLoo.maxpickupdate | $KohaDates %].
739
			            [% IF ( WaitingReserveLoo.waitingat ) %]
739
			            [% IF ( WaitingReserveLoo.waitingat ) %]
740
			                <br />[% IF ( WaitingReserveLoo.waitinghere ) %]<strong class="waitinghere">[% ELSE %]<strong>[% END %]Waiting at [% WaitingReserveLoo.waitingat %]</strong>
740
			                <br />[% IF ( WaitingReserveLoo.waitinghere ) %]<strong class="waitinghere">[% ELSE %]<strong>[% END %]Waiting at [% WaitingReserveLoo.waitingat %]</strong>
741
			            [% END %]
741
			            [% END %]
Lines 1140-1146 No patron matched <span class="ex">[% message %]</span> Link Here
1140
                    <td><a href="/cgi-bin/koha/reserve/request.pl?biblionumber=[% reservloo.biblionumber %]"><strong>[% reservloo.title |html %][% FOREACH subtitl IN reservloo.subtitle %] [% subtitl.subfield %][% END %]</strong></a>[% IF ( reservloo.author ) %], by [% reservloo.author %][% END %]</td>
1140
                    <td><a href="/cgi-bin/koha/reserve/request.pl?biblionumber=[% reservloo.biblionumber %]"><strong>[% reservloo.title |html %][% FOREACH subtitl IN reservloo.subtitle %] [% subtitl.subfield %][% END %]</strong></a>[% IF ( reservloo.author ) %], by [% reservloo.author %][% END %]</td>
1141
                    <td>[% reservloo.itemcallnumber %]</td>
1141
                    <td>[% reservloo.itemcallnumber %]</td>
1142
					<td><em>[% IF ( reservloo.barcodereserv ) %]Item [% reservloo.barcodereserv %]
1142
					<td><em>[% IF ( reservloo.barcodereserv ) %]Item [% reservloo.barcodereserv %]
1143
                        [% END %][% IF ( reservloo.waiting ) %] <strong>waiting at [% reservloo.waitingat %]</strong>
1143
                        [% END %][% IF ( reservloo.waiting ) %] <strong>waiting at [% reservloo.waitingat %][% IF reservloo.maxpickupdate %] until [% reservloo.maxpickupdate | $KohaDates %][% END %]</strong>
1144
                        [% END %]
1144
                        [% END %]
1145
                        [% IF ( reservloo.transfered ) %] <strong>in transit</strong> from
1145
                        [% IF ( reservloo.transfered ) %] <strong>in transit</strong> from
1146
                        [% reservloo.frombranch %] since [% reservloo.datesent %]
1146
                        [% reservloo.frombranch %] since [% reservloo.datesent %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/waitingreserves.tt (-5 / +6 lines)
Lines 1-3 Link Here
1
[% USE KohaDates %]
1
[% INCLUDE 'doc-head-open.inc' %]
2
[% INCLUDE 'doc-head-open.inc' %]
2
<title>Koha &rsaquo; Circulation &rsaquo; Holds awaiting pickup</title>
3
<title>Koha &rsaquo; Circulation &rsaquo; Holds awaiting pickup</title>
3
[% INCLUDE 'doc-head-close.inc' %]
4
[% INCLUDE 'doc-head-close.inc' %]
Lines 81-87 dt_add_type_uk_date(); Link Here
81
            [% IF ( reserveloop ) %]
82
            [% IF ( reserveloop ) %]
82
               <table id="holdst">
83
               <table id="holdst">
83
               <thead><tr>
84
               <thead><tr>
84
                    <th>Available since</th>
85
                    <th>Available since-until</th>
85
                    <th>Title</th>
86
                    <th>Title</th>
86
                    <th>Patron</th>
87
                    <th>Patron</th>
87
                    <th>Location</th>
88
                    <th>Location</th>
Lines 91-97 dt_add_type_uk_date(); Link Here
91
               </tr></thead>
92
               </tr></thead>
92
               <tbody>[% FOREACH reserveloo IN reserveloop %]
93
               <tbody>[% FOREACH reserveloo IN reserveloop %]
93
                <tr>
94
                <tr>
94
                    <td><p>[% reserveloo.waitingdate %]</p></td>
95
                    <td><p>[% reserveloo.waitingdate | $KohaDates %] - [% reserveloo.maxpickupdate | $KohaDates %]</p></td>
95
                    <td>[% INCLUDE 'biblio-default-view.inc' biblionumber = reserveloo.biblionumber %]
96
                    <td>[% INCLUDE 'biblio-default-view.inc' biblionumber = reserveloo.biblionumber %]
96
                        [% reserveloo.title |html %] [% reserveloo.subtitle |html %]
97
                        [% reserveloo.title |html %] [% reserveloo.subtitle |html %]
97
                        </a>
98
                        </a>
Lines 126-132 dt_add_type_uk_date(); Link Here
126
        [% END %]
127
        [% END %]
127
        </div>
128
        </div>
128
        <div id="holdsover">
129
        <div id="holdsover">
129
                <p>Holds listed here have been awaiting pickup for more than [% ReservesMaxPickUpDelay %] days.</p>
130
                <p>Holds listed here have been awaiting pickup for too many days.</p>
130
               [% IF ( overloop ) %]
131
               [% IF ( overloop ) %]
131
               <p>
132
               <p>
132
               <form name="cancelAllReserve" action="waitingreserves.pl" method="post">
133
               <form name="cancelAllReserve" action="waitingreserves.pl" method="post">
Lines 141-147 dt_add_type_uk_date(); Link Here
141
               <br/>
142
               <br/>
142
               <table id="holdso">
143
               <table id="holdso">
143
               <thead><tr>
144
               <thead><tr>
144
                    <th>Available since</th>
145
                    <th>Available since-until</th>
145
                    <th>Title</th>
146
                    <th>Title</th>
146
                    <th>Patron</th>
147
                    <th>Patron</th>
147
                    <th>Location</th>
148
                    <th>Location</th>
Lines 151-157 dt_add_type_uk_date(); Link Here
151
               </tr></thead>
152
               </tr></thead>
152
               <tbody>[% FOREACH overloo IN overloop %]
153
               <tbody>[% FOREACH overloo IN overloop %]
153
                    <tr>
154
                    <tr>
154
                        <td><p>[% overloo.waitingdate %]</p></td>
155
                        <td><p>[% overloo.waitingdate | $KohaDates %] - [% overloo.maxpickupdate | $KohaDates %]</p></td>
155
                        <td>[% INCLUDE 'biblio-default-view.inc' biblionumber = overloo.biblionumber %][% overloo.title |html %] [% overloo.subtitle |html %]
156
                        <td>[% INCLUDE 'biblio-default-view.inc' biblionumber = overloo.biblionumber %][% overloo.title |html %] [% overloo.subtitle |html %]
156
                        </a>
157
                        </a>
157
                            [% UNLESS ( item_level_itypes ) %][% IF ( overloo.itemtype ) %]&nbsp; (<b>[% overloo.itemtype %]</b>)[% END %][% END %]
158
                            [% UNLESS ( item_level_itypes ) %][% IF ( overloo.itemtype ) %]&nbsp; (<b>[% overloo.itemtype %]</b>)[% END %][% END %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/help/circ/waitingreserves.tt (-2 / +2 lines)
Lines 4-11 Link Here
4
4
5
<p>This report will show all of the holds that are waiting for patrons to pick them up.</p>
5
<p>This report will show all of the holds that are waiting for patrons to pick them up.</p>
6
6
7
<p>Items that have been on the hold shelf longer than you normally allow (based on the ReservesMaxPickUpDelay preference value) will appear on the 'Holds Over' tab, they will not automatically be cancelled unless you have set the cron job to do that for you, but you can cancel all holds using the button at the top of the list.</p>
7
<p>Items that have been on the hold shelf longer than you normally allow (based on the holds pickup delay defined in the issuing rules) will appear on the 'Holds Over' tab, they will not automatically be cancelled.</p>
8
8
9
<p><strong>See the full documentation for Holds Awaiting Pickup in the <a href="http://manual.koha-community.org/3.12/en/circreports.html#holdspickup">manual</a> (online).</strong></p>
9
<p><strong>See the full documentation for Holds Awaiting Pickup in the <a href="http://manual.koha-community.org/3.12/en/circreports.html#holdspickup">manual</a> (online).</strong></p>
10
10
11
[% INCLUDE 'help-bottom.inc' %]
11
[% INCLUDE 'help-bottom.inc' %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt (-1 / +1 lines)
Lines 637-643 function validate1(date) { Link Here
637
            </td>
637
            </td>
638
            <td>[% reservloo.itemcallnumber %]</td>
638
            <td>[% reservloo.itemcallnumber %]</td>
639
            <td>[% IF ( reservloo.waiting ) %]
639
            <td>[% IF ( reservloo.waiting ) %]
640
                <em>Item is <strong>waiting</strong></em>
640
                <em>Item is <strong>waiting</strong>[% IF reservloo.maxpickupdate %] until [% reservloo.maxpickupdate %][% END %]</em>
641
                [% END %]
641
                [% END %]
642
                [% IF ( reservloo.transfered ) %]
642
                [% IF ( reservloo.transfered ) %]
643
                <em>Item <strong>in transit</strong> from
643
                <em>Item <strong>in transit</strong> from
(-)a/koha-tmpl/opac-tmpl/prog/en/modules/opac-user.tt (-1 / +1 lines)
Lines 395-401 $.tablesorter.addParser({ Link Here
395
                    [% IF ( RESERVE.wait ) %]
395
                    [% IF ( RESERVE.wait ) %]
396
                        [% IF ( RESERVE.atdestination ) %]
396
                        [% IF ( RESERVE.atdestination ) %]
397
                            [% IF ( RESERVE.found ) %]
397
                            [% IF ( RESERVE.found ) %]
398
                            Item waiting at <b> [% RESERVE.wbrname %]</b>[% IF ( RESERVE.waitingdate ) %] since [% RESERVE.waitingdate | $KohaDates %][% END %]
398
                            Item waiting at <b> [% RESERVE.wbrname %]</b>[% IF ( RESERVE.waitingdate ) %] since [% RESERVE.waitingdate | $KohaDates %] until [% RESERVE.maxpickupdate | $KohaDates %][% END %]
399
                            <input type="hidden" name="pickup" value="[% RESERVE.wbrcd %]" />
399
                            <input type="hidden" name="pickup" value="[% RESERVE.wbrcd %]" />
400
                            [% ELSE %]
400
                            [% ELSE %]
401
                            Item waiting to be pulled from <b> [% RESERVE.wbrname %]</b>
401
                            Item waiting to be pulled from <b> [% RESERVE.wbrname %]</b>
(-)a/members/moremember.pl (+1 lines)
Lines 285-290 if ($borrowernumber) { Link Here
285
        if ( $num_res->{'found'} eq 'W' ) {
285
        if ( $num_res->{'found'} eq 'W' ) {
286
            $getreserv{color}   = 'reserved';
286
            $getreserv{color}   = 'reserved';
287
            $getreserv{waiting} = 1;
287
            $getreserv{waiting} = 1;
288
            $getreserv{maxpickupdate} = $num_res->{maxpickupdate};
288
        }
289
        }
289
290
290
        # 		check transfers with the itemnumber foud in th reservation loop
291
        # 		check transfers with the itemnumber foud in th reservation loop
(-)a/misc/cronjobs/thirdparty/TalkingTech_itiva_outbound.pl (-3 / +2 lines)
Lines 284-290 sub GetPredueIssues { Link Here
284
sub GetWaitingHolds {
284
sub GetWaitingHolds {
285
    my $query =
285
    my $query =
286
"SELECT borrowers.borrowernumber, borrowers.cardnumber, borrowers.title as patron_title, borrowers.firstname, borrowers.surname,
286
"SELECT borrowers.borrowernumber, borrowers.cardnumber, borrowers.title as patron_title, borrowers.firstname, borrowers.surname,
287
                borrowers.phone, borrowers.email, borrowers.branchcode, biblio.biblionumber, biblio.title, items.barcode, reserves.waitingdate,
287
                borrowers.phone, borrowers.email, borrowers.branchcode, biblio.biblionumber, biblio.title, items.barcode, reserves.waitingdate,reserves.maxpickupdate,
288
                reserves.branchcode AS site, branches.branchname AS site_name,
288
                reserves.branchcode AS site, branches.branchname AS site_name,
289
                TO_DAYS(NOW())-TO_DAYS(reserves.waitingdate) AS days_since_waiting
289
                TO_DAYS(NOW())-TO_DAYS(reserves.waitingdate) AS days_since_waiting
290
                FROM borrowers JOIN reserves USING (borrowernumber)
290
                FROM borrowers JOIN reserves USING (borrowernumber)
Lines 298-304 sub GetWaitingHolds { Link Here
298
                AND message_transport_type = 'phone'
298
                AND message_transport_type = 'phone'
299
                AND message_name = 'Hold_Filled'
299
                AND message_name = 'Hold_Filled'
300
                ";
300
                ";
301
    my $pickupdelay = C4::Context->preference("ReservesMaxPickUpDelay");
302
    my $sth         = $dbh->prepare($query);
301
    my $sth         = $dbh->prepare($query);
303
    $sth->execute();
302
    $sth->execute();
304
    my @results;
303
    my @results;
Lines 306-312 sub GetWaitingHolds { Link Here
306
        my @waitingdate = split( /-/, $issue->{'waitingdate'} );
305
        my @waitingdate = split( /-/, $issue->{'waitingdate'} );
307
        my @date_due =
306
        my @date_due =
308
          Add_Delta_Days( $waitingdate[0], $waitingdate[1], $waitingdate[2],
307
          Add_Delta_Days( $waitingdate[0], $waitingdate[1], $waitingdate[2],
309
            $pickupdelay );
308
            $issue->{maxpickupdate} );
310
        $issue->{'date_due'} =
309
        $issue->{'date_due'} =
311
          sprintf( "%04d-%02d-%02d", $date_due[0], $date_due[1], $date_due[2] );
310
          sprintf( "%04d-%02d-%02d", $date_due[0], $date_due[1], $date_due[2] );
312
        $issue->{'level'} = 1;   # only one level for Hold Waiting notifications
311
        $issue->{'level'} = 1;   # only one level for Hold Waiting notifications
(-)a/opac/opac-user.pl (-2 / +5 lines)
Lines 257-263 foreach my $res (@reserves) { Link Here
257
      $res->{'expirationdate'} = '';
257
      $res->{'expirationdate'} = '';
258
    }
258
    }
259
259
260
    $res->{'waiting'} = 1 if $res->{'found'} eq 'W';
260
    my $publictype = $res->{'publictype'};
261
    $res->{$publictype} = 1;
262
    if ( $res->{found} eq 'W' ) {
263
        $res->{waiting} = 1;
264
    }
261
    $res->{'branch'} = $branches->{ $res->{'branchcode'} }->{'branchname'};
265
    $res->{'branch'} = $branches->{ $res->{'branchcode'} }->{'branchname'};
262
    my $biblioData = GetBiblioData($res->{'biblionumber'});
266
    my $biblioData = GetBiblioData($res->{'biblionumber'});
263
    $res->{'reserves_title'} = $biblioData->{'title'};
267
    $res->{'reserves_title'} = $biblioData->{'title'};
264
- 

Return to bug 8367