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

(-)a/C4/Reserves.pm (-6 / +131 lines)
Lines 117-126 BEGIN { Link Here
117
        &CancelReserve
117
        &CancelReserve
118
        &CancelExpiredReserves
118
        &CancelExpiredReserves
119
119
120
        &AutoUnsuspendReserves
121
120
        &IsAvailableForItemLevelRequest
122
        &IsAvailableForItemLevelRequest
121
        
123
        
122
        &AlterPriority
124
        &AlterPriority
123
        &ToggleLowestPriority
125
        &ToggleLowestPriority
126
        &ToggleSuspend
127
        &SuspendAll
124
    );
128
    );
125
    @EXPORT_OK = qw( MergeHolds );
129
    @EXPORT_OK = qw( MergeHolds );
126
}    
130
}    
Lines 263-269 sub GetReservesFromBiblionumber { Link Here
263
                itemnumber,
267
                itemnumber,
264
                reservenotes,
268
                reservenotes,
265
                expirationdate,
269
                expirationdate,
266
                lowestPriority
270
                lowestPriority,
271
                suspend,
272
                suspend_until
267
        FROM     reserves
273
        FROM     reserves
268
        WHERE biblionumber = ? ";
274
        WHERE biblionumber = ? ";
269
    unless ( $all_dates ) {
275
    unless ( $all_dates ) {
Lines 873-878 sub CancelExpiredReserves { Link Here
873
  
879
  
874
}
880
}
875
881
882
=head2 AutoUnsuspendReserves
883
884
  AutoUnsuspendReserves();
885
886
Unsuspends all suspended reserves with a suspend_until date from before today.
887
888
=cut
889
890
sub AutoUnsuspendReserves {
891
892
    my $dbh = C4::Context->dbh;
893
    
894
    my $query = "UPDATE reserves SET suspend = 0, suspend_until = NULL WHERE DATE( suspend_until ) < DATE( CURDATE() )";
895
    my $sth = $dbh->prepare( $query );
896
    $sth->execute();
897
898
}
899
876
=head2 CancelReserve
900
=head2 CancelReserve
877
901
878
  &CancelReserve($biblionumber, $itemnumber, $borrowernumber);
902
  &CancelReserve($biblionumber, $itemnumber, $borrowernumber);
Lines 1008-1014 itemnumber and supplying itemnumber. Link Here
1008
1032
1009
sub ModReserve {
1033
sub ModReserve {
1010
    #subroutine to update a reserve
1034
    #subroutine to update a reserve
1011
    my ( $rank, $biblio, $borrower, $branch , $itemnumber) = @_;
1035
    my ( $rank, $biblio, $borrower, $branch , $itemnumber, $suspend_until) = @_;
1012
     return if $rank eq "W";
1036
     return if $rank eq "W";
1013
     return if $rank eq "n";
1037
     return if $rank eq "n";
1014
    my $dbh = C4::Context->dbh;
1038
    my $dbh = C4::Context->dbh;
Lines 1041-1054 sub ModReserve { Link Here
1041
        
1065
        
1042
    }
1066
    }
1043
    elsif ($rank =~ /^\d+/ and $rank > 0) {
1067
    elsif ($rank =~ /^\d+/ and $rank > 0) {
1044
        my $query = qq/
1068
        my $query = "
1045
        UPDATE reserves SET priority = ? ,branchcode = ?, itemnumber = ?, found = NULL, waitingdate = NULL
1069
            UPDATE reserves SET priority = ? ,branchcode = ?, itemnumber = ?, found = NULL, waitingdate = NULL
1046
            WHERE biblionumber   = ?
1070
            WHERE biblionumber   = ?
1047
             AND borrowernumber = ?
1071
            AND borrowernumber = ?
1048
        /;
1072
        ";
1049
        my $sth = $dbh->prepare($query);
1073
        my $sth = $dbh->prepare($query);
1050
        $sth->execute( $rank, $branch,$itemnumber, $biblio, $borrower);
1074
        $sth->execute( $rank, $branch,$itemnumber, $biblio, $borrower);
1051
        $sth->finish;
1075
        $sth->finish;
1076
1077
        if ( defined( $suspend_until ) ) {
1078
            if ( $suspend_until ) {
1079
                $suspend_until = C4::Dates->new( $suspend_until )->output("iso");
1080
                warn "SUSPEND UNTIL: $suspend_until";
1081
                $dbh->do("UPDATE reserves SET suspend = 1, suspend_until = ? WHERE biblionumber = ? AND borrowernumber = ?", undef, ( $suspend_until, $biblio, $borrower ) ); 
1082
            } else {
1083
                $dbh->do("UPDATE reserves SET suspend_until = NULL WHERE biblionumber = ? AND borrowernumber = ?", undef, ( $biblio, $borrower ) ); 
1084
            }
1085
        }        
1086
1052
        _FixPriority( $biblio, $borrower, $rank);
1087
        _FixPriority( $biblio, $borrower, $rank);
1053
    }
1088
    }
1054
}
1089
}
Lines 1455-1460 sub ToggleLowestPriority { Link Here
1455
    _FixPriority( $biblionumber, $borrowernumber, '999999' );
1490
    _FixPriority( $biblionumber, $borrowernumber, '999999' );
1456
}
1491
}
1457
1492
1493
=head2 ToggleSuspend
1494
1495
  ToggleSuspend( $borrowernumber, $biblionumber );
1496
1497
This function sets the suspend field to true if is false, and false if it is true.
1498
If the reserve is currently suspended with a suspend_until date, that date will
1499
be cleared when it is unsuspended.
1500
1501
=cut
1502
1503
sub ToggleSuspend {
1504
    my ( $borrowernumber, $biblionumber ) = @_;
1505
1506
    my $dbh = C4::Context->dbh;
1507
1508
    my $sth = $dbh->prepare(
1509
        "UPDATE reserves SET suspend = NOT suspend,
1510
        suspend_until = CASE WHEN suspend = 0 THEN NULL ELSE suspend_until END
1511
        WHERE biblionumber = ?
1512
        AND borrowernumber = ?
1513
    ");
1514
    $sth->execute(
1515
        $biblionumber,
1516
        $borrowernumber,
1517
    );
1518
    $sth->finish;
1519
}
1520
1521
=head2 SuspendAll
1522
1523
  SuspendAll( 
1524
      borrowernumber   => $borrowernumber,
1525
      [ biblionumber   => $biblionumber, ]
1526
      [ suspend_until  => $suspend_until, ]
1527
      [ suspend        => $suspend ]
1528
  );
1529
1530
  This function accepts a set of hash keys as its parameters.
1531
  It requires either borrowernumber or biblionumber, or both.
1532
  
1533
  suspend_until is wholly optional.
1534
  
1535
=cut
1536
1537
sub SuspendAll {
1538
    my %params = @_;
1539
1540
    my $borrowernumber = $params{'borrowernumber'} || undef;
1541
    my $biblionumber   = $params{'biblionumber'}   || undef;
1542
    my $suspend_until  = $params{'suspend_until'}  || undef;
1543
    my $suspend        = defined( $params{'suspend'} ) ? $params{'suspend'} :  1;
1544
    
1545
    warn "C4::Reserves::SuspendAll( borrowernumber => $borrowernumber, biblionumber => $biblionumber, suspend_until => $suspend_until, suspend => $suspend )";
1546
    
1547
    $suspend_until = C4::Dates->new( $suspend_until )->output("iso") if ( defined( $suspend_until ) );
1548
1549
    return unless ( $borrowernumber || $biblionumber );
1550
1551
    my ( $query, $sth, $dbh, @query_params );
1552
1553
    $query = "UPDATE reserves SET suspend = ? ";
1554
    push( @query_params, $suspend );
1555
    if ( !$suspend ) {
1556
        $query .= ", suspend_until = NULL ";
1557
    } elsif ( $suspend_until ) {
1558
        $query .= ", suspend_until = ? ";
1559
        push( @query_params, $suspend_until );
1560
    }
1561
    $query .= " WHERE ";
1562
    if ( $borrowernumber ) {
1563
        $query .= " borrowernumber = ? ";
1564
        push( @query_params, $borrowernumber );
1565
    }
1566
    $query .= " AND " if ( $borrowernumber && $biblionumber );
1567
    if ( $biblionumber ) {
1568
        $query .= " biblionumber = ? ";
1569
        push( @query_params, $biblionumber );
1570
    }
1571
    $query .= " AND found IS NULL ";
1572
1573
    $dbh = C4::Context->dbh;
1574
    $sth = $dbh->prepare( $query );
1575
    $sth->execute( @query_params );
1576
    $sth->finish;
1577
}
1578
1579
1458
=head2 _FixPriority
1580
=head2 _FixPriority
1459
1581
1460
  &_FixPriority($biblio,$borrowernumber,$rank,$ignoreSetLowestRank);
1582
  &_FixPriority($biblio,$borrowernumber,$rank,$ignoreSetLowestRank);
Lines 1599-1604 sub _Findgroupreserve { Link Here
1599
        AND item_level_request = 1
1721
        AND item_level_request = 1
1600
        AND itemnumber = ?
1722
        AND itemnumber = ?
1601
        AND reservedate <= CURRENT_DATE()
1723
        AND reservedate <= CURRENT_DATE()
1724
        AND suspend = 0
1602
    /;
1725
    /;
1603
    my $sth = $dbh->prepare($item_level_target_query);
1726
    my $sth = $dbh->prepare($item_level_target_query);
1604
    $sth->execute($itemnumber);
1727
    $sth->execute($itemnumber);
Lines 1629-1634 sub _Findgroupreserve { Link Here
1629
        AND item_level_request = 0
1752
        AND item_level_request = 0
1630
        AND hold_fill_targets.itemnumber = ?
1753
        AND hold_fill_targets.itemnumber = ?
1631
        AND reservedate <= CURRENT_DATE()
1754
        AND reservedate <= CURRENT_DATE()
1755
        AND suspend = 0
1632
    /;
1756
    /;
1633
    $sth = $dbh->prepare($title_level_target_query);
1757
    $sth = $dbh->prepare($title_level_target_query);
1634
    $sth->execute($itemnumber);
1758
    $sth->execute($itemnumber);
Lines 1660-1665 sub _Findgroupreserve { Link Here
1660
          OR  reserves.constrainttype='a' )
1784
          OR  reserves.constrainttype='a' )
1661
          AND (reserves.itemnumber IS NULL OR reserves.itemnumber = ?)
1785
          AND (reserves.itemnumber IS NULL OR reserves.itemnumber = ?)
1662
          AND reserves.reservedate <= CURRENT_DATE()
1786
          AND reserves.reservedate <= CURRENT_DATE()
1787
          AND suspend = 0
1663
    /;
1788
    /;
1664
    $sth = $dbh->prepare($query);
1789
    $sth = $dbh->prepare($query);
1665
    $sth->execute( $biblio, $bibitem, $itemnumber );
1790
    $sth->execute( $biblio, $bibitem, $itemnumber );
(-)a/circ/circulation.pl (+5 lines)
Lines 358-363 if ($borrowernumber) { Link Here
358
        $getreserv{itemcallnumber} = $getiteminfo->{'itemcallnumber'};
358
        $getreserv{itemcallnumber} = $getiteminfo->{'itemcallnumber'};
359
        $getreserv{biblionumber}   = $getiteminfo->{'biblionumber'};
359
        $getreserv{biblionumber}   = $getiteminfo->{'biblionumber'};
360
        $getreserv{waitingat}      = GetBranchName( $num_res->{'branchcode'} );
360
        $getreserv{waitingat}      = GetBranchName( $num_res->{'branchcode'} );
361
        $getreserv{suspend}        = $num_res->{'suspend'};
362
        $getreserv{suspend_until}  = C4::Dates->new( $num_res->{'suspend_until'}, "iso")->output("syspref");
361
        #         check if we have a waiting status for reservations
363
        #         check if we have a waiting status for reservations
362
        if ( $num_res->{'found'} eq 'W' ) {
364
        if ( $num_res->{'found'} eq 'W' ) {
363
            $getreserv{color}   = 'reserved';
365
            $getreserv{color}   = 'reserved';
Lines 729-732 $template->param( Link Here
729
    DHTMLcalendar_dateformat  => C4::Dates->DHTMLcalendar(),
731
    DHTMLcalendar_dateformat  => C4::Dates->DHTMLcalendar(),
730
    canned_bor_notes_loop     => $canned_notes,
732
    canned_bor_notes_loop     => $canned_notes,
731
);
733
);
734
735
$template->param( AutoResumeSuspendedHolds => C4::Context->preference('AutoResumeSuspendedHolds') );
736
732
output_html_with_http_headers $query, $cookie, $template->output;
737
output_html_with_http_headers $query, $cookie, $template->output;
(-)a/installer/data/mysql/kohastructure.sql (+4 lines)
Lines 1400-1405 CREATE TABLE `old_reserves` ( -- this table holds all holds/reserves that have b Link Here
1400
  `waitingdate` date default NULL, -- the date the item was marked as waiting for the patron at the library
1400
  `waitingdate` date default NULL, -- the date the item was marked as waiting for the patron at the library
1401
  `expirationdate` DATE DEFAULT NULL, -- the date the hold expires (usually the date entered by the patron to say they don't need the hold after a certain date)
1401
  `expirationdate` DATE DEFAULT NULL, -- the date the hold expires (usually the date entered by the patron to say they don't need the hold after a certain date)
1402
  `lowestPriority` tinyint(1) NOT NULL,
1402
  `lowestPriority` tinyint(1) NOT NULL,
1403
  `suspend` BOOLEAN NOT NULL DEFAULT 0,
1404
  `suspend_until` DATETIME NULL DEFAULT NULL,
1403
  KEY `old_reserves_borrowernumber` (`borrowernumber`),
1405
  KEY `old_reserves_borrowernumber` (`borrowernumber`),
1404
  KEY `old_reserves_biblionumber` (`biblionumber`),
1406
  KEY `old_reserves_biblionumber` (`biblionumber`),
1405
  KEY `old_reserves_itemnumber` (`itemnumber`),
1407
  KEY `old_reserves_itemnumber` (`itemnumber`),
Lines 1593-1598 CREATE TABLE `reserves` ( -- information related to holds/reserves in Koha Link Here
1593
  `waitingdate` date default NULL, -- the date the item was marked as waiting for the patron at the library
1595
  `waitingdate` date default NULL, -- the date the item was marked as waiting for the patron at the library
1594
  `expirationdate` DATE DEFAULT NULL, -- the date the hold expires (usually the date entered by the patron to say they don't need the hold after a certain date)
1596
  `expirationdate` DATE DEFAULT NULL, -- the date the hold expires (usually the date entered by the patron to say they don't need the hold after a certain date)
1595
  `lowestPriority` tinyint(1) NOT NULL,
1597
  `lowestPriority` tinyint(1) NOT NULL,
1598
  `suspend` BOOLEAN NOT NULL DEFAULT 0,
1599
  `suspend_until` DATETIME NULL DEFAULT NULL,
1596
  KEY priorityfoundidx (priority,found),
1600
  KEY priorityfoundidx (priority,found),
1597
  KEY `borrowernumber` (`borrowernumber`),
1601
  KEY `borrowernumber` (`borrowernumber`),
1598
  KEY `biblionumber` (`biblionumber`),
1602
  KEY `biblionumber` (`biblionumber`),
(-)a/installer/data/mysql/sysprefs.sql (+1 lines)
Lines 337-339 INSERT INTO `systempreferences` (variable,value,explanation,options,type) VALUES Link Here
337
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('BorrowerRenewalPeriodBase', 'now', 'Set whether the borrower renewal date should be counted from the dateexpiry or from the current date ','dateexpiry|now','Choice');
337
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('BorrowerRenewalPeriodBase', 'now', 'Set whether the borrower renewal date should be counted from the dateexpiry or from the current date ','dateexpiry|now','Choice');
338
INSERT INTO `systempreferences` (variable,value,options,explanation,type) VALUES ('AllowItemsOnHoldCheckout',0,'Do not generate RESERVE_WAITING and RESERVED warning when checking out items reserved to someone else. This allows self checkouts for those items.','','YesNo');
338
INSERT INTO `systempreferences` (variable,value,options,explanation,type) VALUES ('AllowItemsOnHoldCheckout',0,'Do not generate RESERVE_WAITING and RESERVED warning when checking out items reserved to someone else. This allows self checkouts for those items.','','YesNo');
339
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacExportOptions','bibtex|dc|marcxml|marc8|utf8|marcstd|mods|ris','Define export options available on OPAC detail page.','','free');
339
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacExportOptions','bibtex|dc|marcxml|marc8|utf8|marcstd|mods|ris','Define export options available on OPAC detail page.','','free');
340
INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('AutoResumeSuspendedHolds',  '1', NULL ,  'Allow suspended holds to be automatically resumed by a set date.',  'YesNo');
(-)a/installer/data/mysql/updatedatabase.pl (+14 lines)
Lines 4734-4739 if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) { Link Here
4734
    SetVersion($DBversion);
4734
    SetVersion($DBversion);
4735
}
4735
}
4736
4736
4737
$DBversion = "3.07.00.XXX";
4738
if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
4739
    $dbh->do("ALTER TABLE reserves ADD suspend BOOLEAN NOT NULL DEFAULT 0");
4740
    $dbh->do("ALTER TABLE old_reserves ADD suspend BOOLEAN NOT NULL DEFAULT 0");
4741
4742
    $dbh->do("ALTER TABLE reserves ADD suspend_until DATETIME NULL DEFAULT NULL");
4743
    $dbh->do("ALTER TABLE old_reserves ADD suspend_until DATETIME NULL DEFAULT NULL");
4744
4745
    $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('AutoResumeSuspendedHolds',  '1', NULL ,  'Allow suspended holds to be automatically resumed by a set date.',  'YesNo')");
4746
    
4747
    print "Upgrade to $DBversion done (Add suspend fields to reserves table, add syspref AutoResumeSuspendedHolds)\n";
4748
    SetVersion ($DBversion);
4749
}
4750
4737
=head1 FUNCTIONS
4751
=head1 FUNCTIONS
4738
4752
4739
=head2 DropAllForeignKeys($table)
4753
=head2 DropAllForeignKeys($table)
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref (+6 lines)
Lines 329-334 Circulation: Link Here
329
                  yes: Transfer
329
                  yes: Transfer
330
                  no: "Don't transfer"
330
                  no: "Don't transfer"
331
            - items when cancelling all waiting holds.
331
            - items when cancelling all waiting holds.
332
        -
333
            - pref: AutoResumeSuspendedHolds
334
              choices:
335
                  yes: Allow
336
                  no: "Don't allow"
337
            - suspended holds to be automatically resumed by a set date.
332
    Fines Policy:
338
    Fines Policy:
333
        -
339
        -
334
            - Calculate fines based on days overdue
340
            - Calculate fines based on days overdue
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt (-2 / +57 lines)
Lines 947-955 No patron matched <span class="ex">[% message %]</span> Link Here
947
            <th>Hold date</th>
947
            <th>Hold date</th>
948
            <th>Title</th>
948
            <th>Title</th>
949
            <th>Call Number</th>
949
            <th>Call Number</th>
950
			<th>Barcode</th>
950
            <th>Barcode</th>
951
            <th>Priority</th>
951
            <th>Priority</th>
952
			<th>Delete?</th>
952
            <th>Delete?</th>
953
            <th>&nbsp;</th>
953
        </tr></thead>
954
        </tr></thead>
954
		<tbody>
955
		<tbody>
955
        [% FOREACH reservloo IN reservloop %]
956
        [% FOREACH reservloo IN reservloop %]
Lines 976-986 No patron matched <span class="ex">[% message %]</span> Link Here
976
                <input type="hidden" name="borrowernumber" value="[% borrowernumber %]" />
977
                <input type="hidden" name="borrowernumber" value="[% borrowernumber %]" />
977
                <input type="hidden" name="reservenumber" value="[% reservloo.reservenumber %]" />
978
                <input type="hidden" name="reservenumber" value="[% reservloo.reservenumber %]" />
978
            </td>
979
            </td>
980
            <td>[% IF ( reservloo.suspend ) %]Suspended [% IF ( reservloo.suspend_until ) %] until [% reservloo.suspend_until %][% END %][% END %]</td>
979
            </tr>
981
            </tr>
980
        [% END %]</tbody>
982
        [% END %]</tbody>
981
    </table>
983
    </table>
982
	        <fieldset class="action"><input type="submit" class="cancel" name="submit" value="Cancel Marked Requests" /></fieldset>
984
	        <fieldset class="action"><input type="submit" class="cancel" name="submit" value="Cancel Marked Requests" /></fieldset>
983
    </form>
985
    </form>
986
987
    <fieldset class="action">
988
        <form action="/cgi-bin/koha/reserve/modrequest_suspendall.pl" method="post">
989
            <input type="hidden" name="from" value="circ" />
990
            <input type="hidden" name="borrowernumber" value="[% borrowernumber %]" />
991
            <input type="submit" value="Suspend All Requests" />
992
993
            [% IF AutoResumeSuspendedHolds %]
994
            <label for="suspend_until">until</label>
995
            <input type="text" size="10" id="suspend_until" name="suspend_until"/>
996
            <img src="[% themelang %]/lib/calendar/cal.gif" alt="Show Calendar"  border="0" id="CalendarSuspendUntil" style="cursor: pointer;" />
997
            <span class="hint">Specify date on which to resume [% INCLUDE 'date-format.inc' %]: </span>
998
999
             <script language="JavaScript" type="text/javascript">
1000
			 //<![CDATA[
1001
                   function validate1(date) {
1002
                         var today = new Date();
1003
                         if ( date < today ) {
1004
                             return true;
1005
                          } else {
1006
                             return false;
1007
                          }
1008
                     };
1009
                     function refocus(calendar) {
1010
                        $('#barcode').focus();
1011
                        calendar.hide();
1012
                     };
1013
				//#TODO - ADD syspref (AllowPostDatedCheckouts).
1014
                     Calendar.setup(
1015
                          {
1016
                             inputField : "suspend_until",
1017
                             ifFormat : "[% DHTMLcalendar_dateformat %]",
1018
                             button : "CalendarSuspendUntil",
1019
//                           disableFunc : validate1,
1020
//                           dateStatusFunc : validate1,
1021
                             onClose : refocus
1022
                           }
1023
                        );
1024
				//]]>
1025
             </script>
1026
             [% END %]
1027
        </form>
1028
    </fieldset>
1029
1030
    <fieldset class="action">
1031
        <form action="/cgi-bin/koha/reserve/modrequest_suspendall.pl" method="post">
1032
            <input type="hidden" name="from" value="circ" />
1033
            <input type="hidden" name="borrowernumber" value="[% borrowernumber %]" />
1034
            <input type="hidden" name="suspend" value="0" />
1035
            <input type="submit" value="Resume All Suspended All Requests" />
1036
	</form>
1037
    </fieldset>
1038
984
	[% ELSE %]
1039
	[% ELSE %]
985
	<p>Patron has nothing on hold.</p>
1040
	<p>Patron has nothing on hold.</p>
986
[% END %]
1041
[% END %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt (+54 lines)
Lines 593-598 function validate1(date) { Link Here
593
			<th>Barcode</th>
593
			<th>Barcode</th>
594
			<th>Priority</th>
594
			<th>Priority</th>
595
			<th>Delete?</th>
595
			<th>Delete?</th>
596
			<th>&nbsp;</th>
596
		</tr></thead>
597
		</tr></thead>
597
		<tbody>[% FOREACH reservloo IN reservloop %]
598
		<tbody>[% FOREACH reservloo IN reservloop %]
598
		<tr class="[% reservloo.color %]">
599
		<tr class="[% reservloo.color %]">
Lines 624-635 function validate1(date) { Link Here
624
                <input type="hidden" name="biblionumber" value="[% reservloo.biblionumber %]" />
625
                <input type="hidden" name="biblionumber" value="[% reservloo.biblionumber %]" />
625
                <input type="hidden" name="borrowernumber" value="[% borrowernumber %]" />
626
                <input type="hidden" name="borrowernumber" value="[% borrowernumber %]" />
626
            </td>
627
            </td>
628
            <td>[% IF ( reservloo.suspend ) %]Suspended [% IF ( reservloo.suspend_until ) %] until [% reservloo.suspend_until %][% END %][% END %]</td>
627
        </tr>
629
        </tr>
628
		[% END %]</tbody>
630
		[% END %]</tbody>
629
    </table>
631
    </table>
630
632
631
        <fieldset class="action"><input type="submit" class="cancel" name="submit" value="Cancel Marked Requests" /></fieldset>
633
        <fieldset class="action"><input type="submit" class="cancel" name="submit" value="Cancel Marked Requests" /></fieldset>
632
    </form>
634
    </form>
635
    <fieldset class="action">
636
        <form action="/cgi-bin/koha/reserve/modrequest_suspendall.pl" method="post">
637
            <input type="hidden" name="from" value="borrower" />
638
            <input type="hidden" name="borrowernumber" value="[% borrowernumber %]" />
639
            <input type="submit" value="Suspend All Requests" />
640
641
            [% IF AutoResumeSuspendedHolds %]
642
            <label for="suspend_until">until</label>
643
            <input type="text" size="10" id="suspend_until" name="suspend_until"/>
644
            <img src="[% themelang %]/lib/calendar/cal.gif" alt="Show Calendar"  border="0" id="CalendarSuspendUntil" style="cursor: pointer;" />
645
            <span class="hint">Specify date on which to resume [% INCLUDE 'date-format.inc' %]: </span>
646
647
             <script language="JavaScript" type="text/javascript">
648
			 //<![CDATA[
649
                   function validate1(date) {
650
                         var today = new Date();
651
                         if ( date < today ) {
652
                             return true;
653
                          } else {
654
                             return false;
655
                          }
656
                     };
657
                     function refocus(calendar) {
658
                        $('#barcode').focus();
659
                        calendar.hide();
660
                     };
661
				//#TODO - ADD syspref (AllowPostDatedCheckouts).
662
                     Calendar.setup(
663
                          {
664
                             inputField : "suspend_until",
665
                             ifFormat : "[% DHTMLcalendar_dateformat %]",
666
                             button : "CalendarSuspendUntil",
667
//                           disableFunc : validate1,
668
//                           dateStatusFunc : validate1,
669
                             onClose : refocus
670
                           }
671
                        );
672
				//]]>
673
             </script>
674
            [% END %]
675
        </form>
676
    </fieldset>
677
678
    <fieldset class="action">
679
        <form action="/cgi-bin/koha/reserve/modrequest_suspendall.pl" method="post">
680
            <input type="hidden" name="from" value="borrower" />
681
            <input type="hidden" name="borrowernumber" value="[% borrowernumber %]" />
682
            <input type="hidden" name="suspend" value="0" />
683
            <input type="submit" value="Resume All Suspended All Requests" />
684
	</form>
685
    </fieldset>
686
633
    [% ELSE %]<p>Patron has nothing on hold.</p>[% END %]
687
    [% ELSE %]<p>Patron has nothing on hold.</p>[% END %]
634
	</div>
688
	</div>
635
689
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt (-1 / +40 lines)
Lines 597-602 function checkMultiHold() { Link Here
597
            <th><img src="/intranet-tmpl/[% theme %]/img/go-bottom.png" border="0" alt="Toggle Set to Lowest Priority" /></th>
597
            <th><img src="/intranet-tmpl/[% theme %]/img/go-bottom.png" border="0" alt="Toggle Set to Lowest Priority" /></th>
598
        [% END %]
598
        [% END %]
599
	<th>&nbsp;</th>
599
	<th>&nbsp;</th>
600
	<th>&nbsp;</th>
600
      </tr>
601
      </tr>
601
  [% FOREACH reserveloo IN biblioloo.reserveloop %]
602
  [% FOREACH reserveloo IN biblioloo.reserveloop %]
602
  [% UNLESS ( loop.odd ) %]<tr class="highlight">[% ELSE %]<tr>[% END %]
603
  [% UNLESS ( loop.odd ) %]<tr class="highlight">[% ELSE %]<tr>[% END %]
Lines 653-659 function checkMultiHold() { Link Here
653
        <td>
654
        <td>
654
    [% IF ( reserveloo.wait ) %]
655
    [% IF ( reserveloo.wait ) %]
655
    	[% IF ( reserveloo.atdestination ) %]
656
    	[% IF ( reserveloo.atdestination ) %]
656
                [% IF ( reserveloo.found ) %]
657
            [% IF ( reserveloo.found ) %]
657
                Item waiting at <b> [% reserveloo.wbrname %]</b> <input type="hidden" name="pickup" value="[% reserveloo.wbrcode %]" />
658
                Item waiting at <b> [% reserveloo.wbrname %]</b> <input type="hidden" name="pickup" value="[% reserveloo.wbrcode %]" />
658
            [% ELSE %]
659
            [% ELSE %]
659
                Waiting to be pulled <input type="hidden" name="pickup" value="[% reserveloo.wbrcode %]" />
660
                Waiting to be pulled <input type="hidden" name="pickup" value="[% reserveloo.wbrcode %]" />
Lines 728-733 function checkMultiHold() { Link Here
728
                </a>
729
                </a>
729
	</td>
730
	</td>
730
731
732
	<td>
733
	[% UNLESS ( reserveloo.wait ) %]
734
            <input type="button" value="[% IF ( reserveloo.suspend ) %]Unsuspend[% ELSE %]Suspend[% END %]" onclick="window.location.href='request.pl?action=toggleSuspend&amp;borrowernumber=[% reserveloo.borrowernumber %]&amp;biblionumber=[% reserveloo.biblionumber %]&amp;date=[% reserveloo.date %]'" />
735
736
            [% IF AutoResumeSuspendedHolds %]
737
	    <label for="suspend_until_[% reserveloo.borrowernumber %]">[% IF ( reserveloo.suspend ) %] on [% ELSE %] until [% END %]</label>
738
	    <input name="suspend_until" id="suspend_until_[% reserveloo.borrowernumber %]" size="10" readonly="readonly" value="[% reserveloo.suspend_until %]" />
739
	    <img src="[% themelang %]/lib/calendar/cal.gif" alt="Show Calendar" border="0" id="SuspendUntilDate_[% reserveloo.borrowernumber %]" style="cursor: pointer;" />
740
	    <script language="JavaScript" type="text/javascript">
741
		//<![CDATA[
742
		function validate1(date) {
743
			var today = new Date();
744
			if ( (date > today) ||
745
                    ( date.getDate() == today.getDate() &&
746
                      date.getMonth() == today.getMonth() &&
747
                      date.getFullYear() == today.getFullYear() ) ) {
748
				return false;
749
			} else {
750
				return true;
751
			}
752
		};
753
		Calendar.setup(
754
			{
755
				inputField : "suspend_until_[% reserveloo.borrowernumber %]",
756
				ifFormat : "[% DHTMLcalendar_dateformat %]",
757
				button : "SuspendUntilDate_[% reserveloo.borrowernumber %]",
758
				disableFunc : validate1,
759
				dateStatusFunc : validate1
760
			}
761
		);
762
		//]]>
763
	    </script>
764
	    <a href='#' onclick="document.getElementById('suspend_until_[% reserveloo.borrowernumber %]').value='';">Clear Date</a>
765
            [% END %]
766
	[% ELSE %]
767
		<input type="hidden" name="suspend_until" value="" />
768
	[% END %]
769
	</td> 
731
      </tr>
770
      </tr>
732
771
733
  [% END %] <!-- existing reserveloop -->
772
  [% END %] <!-- existing reserveloop -->
(-)a/koha-tmpl/opac-tmpl/prog/en/modules/opac-user.tt (-3 / +58 lines)
Lines 1-6 Link Here
1
[% INCLUDE 'doc-head-open.inc' %]
1
[% INCLUDE 'doc-head-open.inc' %]
2
[% IF ( LibraryNameTitle ) %][% LibraryNameTitle %][% ELSE %]Koha Online[% END %] Catalog &rsaquo; Your library home
2
[% IF ( LibraryNameTitle ) %][% LibraryNameTitle %][% ELSE %]Koha Online[% END %] Catalog &rsaquo; Your library home
3
[% INCLUDE 'doc-head-close.inc' %]
3
[% INCLUDE 'doc-head-close.inc' %]
4
[% INCLUDE 'calendar.inc' %]
4
<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.metadata.min.js"></script>
5
<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.metadata.min.js"></script>
5
<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.tablesorter.min.js"></script>
6
<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.tablesorter.min.js"></script>
6
<script type="text/JavaScript">
7
<script type="text/JavaScript">
Lines 393-400 $.tablesorter.addParser({ Link Here
393
                        [% END %]
394
                        [% END %]
394
                    [% ELSE %]
395
                    [% ELSE %]
395
                            [% IF ( RESERVE.intransit ) %]
396
                            [% IF ( RESERVE.intransit ) %]
396
                                Item in transit from <b> [% RESERVE.frombranch %]</b> since 
397
                                Item in transit from <b> [% RESERVE.frombranch %]</b> since [% RESERVE.datesent %]
397
                                [% RESERVE.datesent %]
398
			    [% ELSIF ( RESERVE.suspend ) %]
399
				Suspended [% IF ( RESERVE.suspend_until ) %] until [% RESERVE.suspend_until %] [% END %]
398
                            [% ELSE %]
400
                            [% ELSE %]
399
                                Pending
401
                                Pending
400
                            [% END %]
402
                            [% END %]
Lines 407-420 $.tablesorter.addParser({ Link Here
407
		<input type="hidden" name="reservenumber" value="[% RESERVE.reservenumber %]" />
409
		<input type="hidden" name="reservenumber" value="[% RESERVE.reservenumber %]" />
408
			<input type="submit" name="submit" class="icon delete cancel" value="Cancel" onclick="return confirmDelete('Are you sure you want to cancel this hold?');" /></form>
410
			<input type="submit" name="submit" class="icon delete cancel" value="Cancel" onclick="return confirmDelete('Are you sure you want to cancel this hold?');" /></form>
409
		[% ELSE %]
411
		[% ELSE %]
410
			&nbsp;
411
		[% END %]
412
		[% END %]
412
		</td>
413
		</td>
414
		
413
415
414
            </tr>
416
            </tr>
415
            [% END %]
417
            [% END %]
416
			</tbody>
418
			</tbody>
417
        </table>
419
        </table>
420
421
	<div>
422
            <form action="/cgi-bin/koha/opac-modrequest-suspend.pl" method="post">
423
              <input type="submit" name="submit" class="icon delete cancel" value="Suspend all holds" onclick="return confirmDelete('Are you sure you want to suspend all holds?');" />
424
              <input type="hidden" name="suspend" value="1" />
425
426
	      [% IF AutoResumeSuspendedHolds %]
427
	      <label for="suspend_until"> until </label>
428
              <input name="suspend_until" id="suspend_until" readonly="readonly" size="10">
429
              <script language="JavaScript" type="text/javascript">
430
              //<![CDATA[
431
432
              var cal_img = document.createElement('img');
433
              cal_img.src = "[% themelang %]/lib/calendar/cal.gif";
434
              cal_img.alt = "Show Calendar";
435
              cal_img.border = "0";
436
              cal_img.id = "CalendarSuspendUntil";
437
              cal_img.style.cursor = "pointer";
438
              document.getElementById("suspend_until").parentNode.appendChild( cal_img );
439
440
              function validate(date) {
441
                  var today = new Date();
442
                        if ( (date > today) ||
443
                                ( date.getDate() == today.getDate() &&
444
                                  date.getMonth() == today.getMonth() &&
445
                                  date.getFullYear() == today.getFullYear() ) ) {
446
                            return false;
447
                        } else {
448
                            return true;
449
                        }
450
              };
451
              Calendar.setup(
452
              {
453
                inputField : "suspend_until",
454
                ifFormat : "[% DHTMLcalendar_dateformat %]",
455
                button : "CalendarSuspendUntil",
456
                disableFunc : validate,
457
                dateStatusFunc : validate
458
              }
459
              );
460
              //]]>
461
              </script>
462
              <a href="#" style="font-size:85%;text-decoration:none;" onclick="document.getElementById('suspend_until').value='';return false;">Clear Date</a></p>
463
              [% END %]
464
            </form>
465
	</div>
466
	<div>
467
            <form action="/cgi-bin/koha/opac-modrequest-suspend.pl" method="post">
468
              <input type="submit" name="submit" class="icon delete cancel" value="Resume all suspended holds" onclick="return confirmDelete('Are you sure you want to resume all suspended holds?');" />
469
              <input type="hidden" name="suspend" value="0" />
470
            </form>
471
	</div>
418
    </div>
472
    </div>
419
    [% END %]
473
    [% END %]
420
    </div><!-- /opac-user views -->
474
    </div><!-- /opac-user views -->
Lines 429-431 $.tablesorter.addParser({ Link Here
429
</div>
483
</div>
430
</div>
484
</div>
431
[% INCLUDE 'opac-bottom.inc' %]
485
[% INCLUDE 'opac-bottom.inc' %]
486
(-)a/members/moremember.pl (+4 lines)
Lines 390-395 if ($borrowernumber) { Link Here
390
            $getreserv{biblionumber}  = $num_res->{'biblionumber'};	
390
            $getreserv{biblionumber}  = $num_res->{'biblionumber'};	
391
        }
391
        }
392
        $getreserv{waitingposition} = $num_res->{'priority'};
392
        $getreserv{waitingposition} = $num_res->{'priority'};
393
        $getreserv{suspend} = $num_res->{'suspend'};
394
        $getreserv{suspend_until} = C4::Dates->new( $num_res->{'suspend_until'}, "iso")->output("syspref");;
393
395
394
        push( @reservloop, \%getreserv );
396
        push( @reservloop, \%getreserv );
395
    }
397
    }
Lines 493-496 $template->param( Link Here
493
    koha_news_count => $koha_news_count
495
    koha_news_count => $koha_news_count
494
);
496
);
495
497
498
$template->param( AutoResumeSuspendedHolds => C4::Context->preference('AutoResumeSuspendedHolds') );
499
496
output_html_with_http_headers $input, $cookie, $template->output;
500
output_html_with_http_headers $input, $cookie, $template->output;
(-)a/misc/cronjobs/holds/auto_unsuspend_holds.pl (+34 lines)
Line 0 Link Here
1
#!/usr/bin/perl
2
3
# Copyright 2009-2010 Kyle Hall
4
#
5
# This file is part of Koha.
6
#
7
# Koha is free software; you can redistribute it and/or modify it under the
8
# terms of the GNU General Public License as published by the Free Software
9
# Foundation; either version 2 of the License, or (at your option) any later
10
# version.
11
#
12
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License along
17
# with Koha; if not, write to the Free Software Foundation, Inc.,
18
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20
#use strict;
21
#use warnings; FIXME - Bug 2505
22
23
BEGIN {
24
    # find Koha's Perl modules
25
    # test carefully before changing this
26
    use FindBin;
27
    eval { require "$FindBin::Bin/../kohalib.pl" };
28
}
29
30
# cancel all expired hold requests
31
32
use C4::Reserves;
33
34
AutoUnsuspendReserves();
(-)a/opac/opac-modrequest-suspend.pl (+46 lines)
Line 0 Link Here
1
#!/usr/bin/perl
2
3
# This file is part of Koha.
4
#
5
# Koha is free software; you can redistribute it and/or modify it under the
6
# terms of the GNU General Public License as published by the Free Software
7
# Foundation; either version 2 of the License, or (at your option) any later
8
# version.
9
#
10
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
11
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License along
15
# with Koha; if not, write to the Free Software Foundation, Inc.,
16
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17
18
use strict;
19
use warnings;
20
21
use CGI;
22
use C4::Output;
23
use C4::Reserves;
24
use C4::Auth;
25
my $query = new CGI;
26
my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
27
    {   
28
        template_name   => "opac-account.tmpl",
29
        query           => $query,
30
        type            => "opac",
31
        authnotrequired => 0,
32
        flagsrequired   => { borrow => 1 },
33
        debug           => 1,
34
    }
35
);
36
37
my $suspend       = $query->param('suspend');
38
my $suspend_until = $query->param('suspend_until') || undef;
39
40
SuspendAll(
41
    borrowernumber => $borrowernumber,
42
    suspend        => $suspend,
43
    suspend_until  => $suspend_until,
44
);
45
46
print $query->redirect("/cgi-bin/koha/opac-user.pl#opac-user-holds");
(-)a/opac/opac-user.pl (+4 lines)
Lines 271-276 foreach my $res (@reserves) { Link Here
271
    if ($OPACDisplayRequestPriority) {
271
    if ($OPACDisplayRequestPriority) {
272
        $res->{'priority'} = '' if $res->{'priority'} eq '0';
272
        $res->{'priority'} = '' if $res->{'priority'} eq '0';
273
    }
273
    }
274
    $res->{'suspend_until'} = C4::Dates->new( $res->{'suspend_until'}, "iso")->output("syspref") if ( $res->{'suspend_until'} );
274
}
275
}
275
276
276
# use Data::Dumper;
277
# use Data::Dumper;
Lines 369-373 $template->param( Link Here
369
    dateformat    => C4::Context->preference("dateformat"),
370
    dateformat    => C4::Context->preference("dateformat"),
370
);
371
);
371
372
373
$template->param( DHTMLcalendar_dateformat  => C4::Dates->DHTMLcalendar() );
374
$template->param( AutoResumeSuspendedHolds => C4::Context->preference('AutoResumeSuspendedHolds') );
375
372
output_html_with_http_headers $query, $cookie, $template->output;
376
output_html_with_http_headers $query, $cookie, $template->output;
373
377
(-)a/reserve/modrequest.pl (-1 / +2 lines)
Lines 46-51 my @biblionumber=$query->param('biblionumber'); Link Here
46
my @borrower=$query->param('borrowernumber');
46
my @borrower=$query->param('borrowernumber');
47
my @branch=$query->param('pickup');
47
my @branch=$query->param('pickup');
48
my @itemnumber=$query->param('itemnumber');
48
my @itemnumber=$query->param('itemnumber');
49
my @suspend_until=$query->param('suspend_until');
49
my $multi_hold = $query->param('multi_hold');
50
my $multi_hold = $query->param('multi_hold');
50
my $biblionumbers = $query->param('biblionumbers');
51
my $biblionumbers = $query->param('biblionumbers');
51
my $count=@rank;
52
my $count=@rank;
Lines 66-72 if ($CancelBorrowerNumber) { Link Here
66
else {
67
else {
67
    for (my $i=0;$i<$count;$i++){
68
    for (my $i=0;$i<$count;$i++){
68
        undef $itemnumber[$i] unless $itemnumber[$i] ne '';
69
        undef $itemnumber[$i] unless $itemnumber[$i] ne '';
69
        ModReserve($rank[$i],$biblionumber[$i],$borrower[$i],$branch[$i],$itemnumber[$i]); #from C4::Reserves
70
        ModReserve($rank[$i],$biblionumber[$i],$borrower[$i],$branch[$i],$itemnumber[$i],$suspend_until[$i]); #from C4::Reserves
70
    }
71
    }
71
}
72
}
72
my $from=$query->param('from');
73
my $from=$query->param('from');
(-)a/reserve/modrequest_suspendall.pl (+58 lines)
Line 0 Link Here
1
#!/usr/bin/perl
2
3
#script to modify reserves/requests
4
#written 2/1/00 by chris@katipo.oc.nz
5
#last update 27/1/2000 by chris@katipo.co.nz
6
7
8
# Copyright 2000-2002 Katipo Communications
9
#
10
# This file is part of Koha.
11
#
12
# Koha is free software; you can redistribute it and/or modify it under the
13
# terms of the GNU General Public License as published by the Free Software
14
# Foundation; either version 2 of the License, or (at your option) any later
15
# version.
16
#
17
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
18
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
19
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
20
#
21
# You should have received a copy of the GNU General Public License along
22
# with Koha; if not, write to the Free Software Foundation, Inc.,
23
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24
25
use strict;
26
use warnings;
27
use CGI;
28
use C4::Output;
29
use C4::Reserves;
30
use C4::Auth;
31
32
my $query = new CGI;
33
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
34
    {   
35
        template_name   => "about.tmpl",
36
        query           => $query,
37
        type            => "intranet",
38
        authnotrequired => 0,
39
        flagsrequired   => { catalogue => 1 },
40
        debug           => 1,
41
    }
42
);
43
44
my $borrowernumber = $query->param('borrowernumber');
45
my $suspend        = $query->param('suspend');
46
my $suspend_until  = $query->param('suspend_until');
47
48
SuspendAll( borrowernumber => $borrowernumber, suspend_until => $suspend_until, suspend => $suspend );
49
50
my $from = $query->param('from');
51
$from ||= q{};
52
if ( $from eq 'borrower'){
53
    print $query->redirect("/cgi-bin/koha/members/moremember.pl?borrowernumber=$borrowernumber");
54
} elsif ( $from eq 'circ'){
55
    print $query->redirect("/cgi-bin/koha/circ/circulation.pl?borrowernumber=$borrowernumber");
56
} else {
57
    print $query->redirect("/cgi-bin/koha/circ/circulation.pl?borrowernumber=$borrowernumber");
58
}
(-)a/reserve/request.pl (-2 / +8 lines)
Lines 109-114 if ( $action eq 'move' ) { Link Here
109
  my $borrowernumber = $input->param('borrowernumber');
109
  my $borrowernumber = $input->param('borrowernumber');
110
  my $biblionumber   = $input->param('biblionumber');
110
  my $biblionumber   = $input->param('biblionumber');
111
  ToggleLowestPriority( $borrowernumber, $biblionumber );
111
  ToggleLowestPriority( $borrowernumber, $biblionumber );
112
} elsif ( $action eq 'toggleSuspend' ) {
113
  my $borrowernumber = $input->param('borrowernumber');
114
  my $biblionumber   = $input->param('biblionumber');
115
  ToggleSuspend( $borrowernumber, $biblionumber );
112
}
116
}
113
117
114
if ($findborrower) {
118
if ($findborrower) {
Lines 567-573 foreach my $biblionumber (@biblionumbers) { Link Here
567
        $reserve{'lowestPriority'}    = $res->{'lowestPriority'};
571
        $reserve{'lowestPriority'}    = $res->{'lowestPriority'};
568
        $reserve{'branchloop'} = GetBranchesLoop($res->{'branchcode'});
572
        $reserve{'branchloop'} = GetBranchesLoop($res->{'branchcode'});
569
        $reserve{'optionloop'} = \@optionloop;
573
        $reserve{'optionloop'} = \@optionloop;
570
574
        $reserve{'suspend'} = $res->{'suspend'};
575
        $reserve{'suspend_until'} = C4::Dates->new( $res->{'suspend_until'}, "iso")->output("syspref");
571
        push( @reserveloop, \%reserve );
576
        push( @reserveloop, \%reserve );
572
    }
577
    }
573
578
Lines 626-630 if ( C4::Context->preference( 'AllowHoldDateInFuture' ) ) { Link Here
626
    $template->param( reserve_in_future => 1 );
631
    $template->param( reserve_in_future => 1 );
627
}
632
}
628
633
634
$template->param( AutoResumeSuspendedHolds => C4::Context->preference('AutoResumeSuspendedHolds') );
635
629
# printout the page
636
# printout the page
630
output_html_with_http_headers $input, $cookie, $template->output;
637
output_html_with_http_headers $input, $cookie, $template->output;
631
- 

Return to bug 7641