Koha/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt
Magnus Enger 290341d8db Bug 11401: Add support for Norwegian national library card
This patch makes it possible to sync patron data between Koha and the
Norwegian national patron database, in both directions.

In order to use this, the following information is necessary:
- a username/password from the Norwegian national database of libraries
  ("Base Bibliotek"), available to all Norwegian libraries
- a special key in order to decrypt and encrypt PIN-codes/passwords,
  which is only available to Norwegian library system vendors
- a norwegian library vendor username/password

See http://www.lanekortet.no/ for more information (in Norwegian).

While this is of course an implementation of a specific synchronization scheme
for borrower data, attempts have been made to prepare the ground for other sync
schemes that might be implemented later. Especially the structure of the new
borrower_sync table might be reviewed with an eye to how it might fit other
schemes.

To test:

Since the password and cryptographic key needed to use this functionality
is only available to Norwegian library system vendors, only regression testing
can be done on the submitted code. Suggested things to check:

- Apply the patch and make sure the database update is done. This should add
  the new "borrower_sync" table and five new systmpreferences under the
  "Patrons" > "Norwegian patron database" category:
  - NorwegianPatronDBEnable
  - NorwegianPatronDBEndpoint
  - NorwegianPatronDBUsername
  - NorwegianPatronDBPassword
  - NorwegianPatronDBSearchNLAfterLocalHit
- Check that patrons can be created, edited and deleted as usual, when
  NorwegianPatronDBEnable is set to "Disable"
- Check that the new tests in t/NorwegianPatronDB.pm run ok, e.g. on a
  gitified setup:
  $ sudo koha-shell -c "PERL5LIB=/path/to/kohaclone prove -v t/NorwegianPatronDB.t" instancename
- Check that all the other tests still run ok
- Check that the POD in the new files itroduced by this patch looks ok:
  - Koha/NorwegianPatronDB.pm
  - members/nl-search.pl
  - misc/cronjobs/nl-sync-from-koha.pl
  - misc/cronjobs/nl-sync-to-koha.pl
  - t/NorwegianPatronDB.t

Sponsored-by: Oslo Public Library

Update 2014-09-18:
- Rebase on master
- Split out changes to Koha::Schema
- Incorporate new way of authenticating with NL

Update 2014-10-21:
- Rebase on master
- Use Module::Load to load Koha::NorwegianPatronDB in non-NL-specific
  scripts and modules
- Fix the version number of Digest::SHA
- Fix a missing semicolon in kohastructure.sql

Signed-off-by: Chris Cormack <chrisc@catalyst.net.nz>

Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>
Signed-off-by: Tomas Cohen Arazi <tomascohen@gmail.com>
2014-11-14 09:42:23 -03:00

522 lines
21 KiB
Text

[% USE Koha %]
[% USE KohaDates %]
[% IF Koha.Preference('ExportRemoveFields') OR Koha.Preference('ExportWithCsvProfile') %]
[% SET exports_enabled = 1 %]
[% END %]
[% INCLUDE 'doc-head-open.inc' %]
<title>Koha &rsaquo; Patrons &rsaquo;
[% IF ( unknowuser ) %]
Patron does not exist
[% ELSE %]
Patron details for [% INCLUDE 'patron-title.inc' %]
[% END %]
</title>
[% INCLUDE 'doc-head-close.inc' %]
[% INCLUDE 'calendar.inc' %]
<link rel="stylesheet" type="text/css" href="[% interface %]/[% theme %]/en/css/datatables.css" />
[% INCLUDE 'datatables.inc' %]
[% INCLUDE 'strings.inc' %]
<script type="text/javascript" src="[% interface %]/lib/jquery/plugins/jquery.checkboxes.min.js"></script>
<script type="text/javascript" src="[% interface %]/lib/jquery/plugins/jquery-ui-timepicker-addon.min.js"></script>
[% INCLUDE 'timepicker.inc' %]
<script type="text/javascript" src="[% interface %]/lib/jquery/plugins/jquery.dataTables.rowGrouping.js"></script>
<script type="text/javascript" src="[% themelang %]/js/pages/circulation.js"></script>
<script type="text/javascript" src="[% themelang %]/js/checkouts.js"></script>
<script type="text/javascript" src="[% themelang %]/js/holds.js"></script>
<script type="text/JavaScript">
//<![CDATA[
/* Set some variable needed in circulation.js */
var interface = "[% interface %]";
var theme = "[% theme %]";
var borrowernumber = "[% borrowernumber %]";
var branchcode = "[% branch %]";
var exports_enabled = "[% exports_enabled %]";
var AllowRenewalLimitOverride = [% (CAN_user_circulate_override_renewals && AllowRenewalLimitOverride)? 1: 0 %];
var script = "moremember";
var relatives_borrowernumbers = new Array();
[% FOREACH b IN relatives_borrowernumbers %]
relatives_borrowernumbers.push("[% b %]");
[% END %]
var MSG_ADD_MESSAGE = _("Add a new message");
var MSG_EXPORT_SELECT_CHECKOUTS = _("You must select checkout(s) to export");
$(document).ready(function() {
$('#finesholdsissues').tabs({
// Correct table sizing for tables hidden in tabs
// http://www.datatables.net/examples/api/tabs_and_scrolling.html
"show": function(event, ui) {
var oTable = $('div.dataTables_wrapper>table', ui.panel).dataTable();
if ( oTable.length > 0 ) {
oTable.fnAdjustColumnSizing();
}
},
"activate": function( event, ui ) {
$('#'+ui.newTab.context.id).click();
}
} );
$("#holdst").dataTable($.extend(true, {}, dataTablesDefaults, {
"sDom": 't',
"aoColumnDefs": [
{ "aTargets": [ -1,-2 ], "bSortable": false, "bSearchable": false }
],
"aoColumns": [
{ "sType": "title-string" },{ "sType": "anti-the" },null,null,null,null,null,null
],
"bPaginate": false
}));
[% IF ( picture ) %]
// new YAHOO.widget.Button("delpicture"); // FIXME: formatting mismatch between YUI and normal button
$('#delpicture').click(function(){
return confirm(_("Are you sure you want to delete this patron image? This cannot be undone."));
});
$('#manage-patron-image').find("input[value*=Upload]").click(function(){
if($("#uploadfile").val() == ""){
alert(_("Please choose a file to upload"));
return false;
}
return confirm(_("Are you sure you want to replace the current patron image? This cannot be undone."));
});[% END %]
$("#suspend_until").datepicker({ minDate: 1 }); // require that hold suspended until date is after today
$("#newduedate").datetimepicker({
minDate: 1, // require that renewal date is after today
hour: 23,
minute: 59
});
});
function uncheck_sibling(me){
nodename=me.getAttribute("name");
if (nodename =="barcodes[]"){
var Node=me.parentNode.previousSibling;
while (Node.nodeName!="TD"){Node=Node.previousSibling}
var Nodes=Node.childNodes;
for (var i=0;i < Nodes.length;i++){
if (Nodes[i].nodeName=="INPUT" && Nodes[i].getAttribute("type")=="checkbox"){
Nodes[i].checked=false;
}
}
}else {
var Node=me.parentNode.nextSibling;
while (Node.nodeName!="TD"){Node=Node.nextSibling}
var Nodes=Node.childNodes;
for (var i=0;i<Nodes.length;i++){
if (Nodes[i].nodeName=="INPUT" && Nodes[i].getAttribute("type")=="checkbox"){
Nodes[i].checked=false;
}
}
}
}
function validate1(date) {
var today = new Date();
if ( date < today ) {
return true;
} else {
return false;
}
};
//]]>
</script>
</head>
<body id="pat_moremember" class="pat">
[% INCLUDE 'header.inc' %]
[% INCLUDE 'patron-search.inc' %]
<div id="breadcrumbs">
<a href="/cgi-bin/koha/mainpage.pl">Home</a>
&rsaquo; <a href="/cgi-bin/koha/members/members-home.pl">Patrons</a>
&rsaquo; [% IF ( unknowuser ) %]Patron does not exist[% ELSE %]Patron details for [% INCLUDE 'patron-title.inc' %][% END %]
</div>
<div id="doc3" class="yui-t1">
<div id="bd">
<div id="yui-main">
<div class="yui-b">
[% INCLUDE 'members-toolbar.inc' %]
[% IF ( error ) %]
<div class="dialog alert">
[% IF ( AUTH_UPDATE_FAILED ) %]
<h3>Userid / Password update failed</h3>
<strong>Insufficient privileges.</strong>
<p>Other fields updated.</p>
[% END %]
[% IF ( CANT_DELETE_STAFF ) %]
<h3>Unable to delete staff user</h3>
<p>Insufficient privileges.</p>
[% END %]
[% IF ( CANT_DELETE_OTHERLIBRARY ) %]
<h3>Unable to delete patrons from other libraries with current settings</h3>
<p>Insufficient privileges.</p>
[% END %]
[% IF ( CANT_DELETE ) %]
<h3>Unable to delete patron</h3>
<p>Insufficient privileges.</p>
[% END %]
</div>
[% END %]
<div class="yui-g">
[% IF ( unknowuser ) %]
<div class="dialog message">This patron does not exist.</div>
[% ELSE %]
[% IF ( was_renewed ) %]<div class="dialog message">Patron's account has been renewed until [% dateexpiry %]</div>[% END %]
[% IF ( flagged ) %]
<div id="circmessages" class="circmessage attention">
<ul>
[% IF ( userdebarred ) %]
<li class="blocker">Patron is restricted[% IF ( userdebarreddate ) %] until [% userdebarreddate%] [% IF (debarredcomment ) %]([% debarredcomment %])[% END %][% END %]
<a href="#reldebarments" onclick="$('#debarments-tab-link').click()">View restrictions</a>
</li>
[% END %]
[% IF ( gonenoaddress ) %]<li class="blocker">Patron's address is in doubt.</li>[% END %]
[% IF ( lost ) %]<li class="blocker">Patron's card has been reported lost.</li>[% END %]
</ul>
</div>
[% END %]
<h3>[% UNLESS ( I ) %]
[% title %] [% firstname %] [% END %] [% surname %] ([% cardnumber %])</h3>
<div class="yui-u first">
<div id="patron-information" style="padding : .5em;">
[% UNLESS ( I ) %][% IF ( othernames ) %]&ldquo;[% othernames %]&rdquo;[% END %]
<p class="address">
[% address %]<br />
[% IF ( address2 ) %][% address2 %]<br />[% END %]
[% IF ( city ) %][% city %][% END %]
[% IF ( state ) %][% state %][% END %]
[% IF ( zipcode ) %][% zipcode %]<br />[% END %]
[% IF ( country ) %][% country %][% END %]</p>
<div class="rows">
<ol>
[% IF ( I ) %]
[% IF ( phonepro ) %]<li><span class="label">Organization phone: </span>[% phonepro %]</li>[% END %]
[% IF ( emailpro ) %]<li><span class="label">Organization email: </span>[% emailpro %]</li>[% END %]
[% ELSE %]
[% IF ( phone ) %]<li><span class="label">Primary phone: </span>[% phone %]</li>[% END %]
[% IF ( phonepro ) %]<li><span class="label">Secondary phone: </span>[% phonepro %]</li>[% END %]
[% IF ( mobile ) %]<li><span class="label">Mobile phone: </span>[% mobile %]</li>[% END %]
[% END %]
[% IF ( P ) %]
[% IF ( phone ) %]<li><span class="label">Primary phone: </span>[% phone %]</li>[% END %]
[% IF ( mobile ) %]<li><span class="label">Mobile phone: </span>[% mobile %]</li>[% END %]
[% END %]
[% IF ( fax ) %]<li><span class="label">Fax: </span>[% fax %]</li>[% END %]
[% UNLESS ( I ) %]
[% IF ( email ) %]<li><span class="label">Primary email:</span><a href="mailto:[% email %]">[% email %]</a></li>[% END %]
[% IF ( emailpro ) %]<li><span class="label">Secondary email: </span><a href="mailto:[% emailpro %]">[% emailpro %]</a></li>[% END %]
[% END %]
[% IF ( initials ) %]<li><span class="label">Initials: </span>[% initials %]</li>[% END %]
[% IF ( dateofbirth ) %]<li><span class="label">Date of birth:</span>[% dateofbirth %]</li>[% END %]
[% IF ( sex ) %]<li><span class="label">Gender:</span>
[% IF ( sex == 'F' ) %]Female[% ELSIF ( sex == 'M' ) %]Male[% ELSE %][% sex %][% END %]
</li>[% END %][% END %]
[% IF ( printethnicityline ) %]
<li><span class="label">Ethnicity:</span>[% ethnicity %]</li>
<li><span class="label">Ethnicity notes: </span>[% ethnotes %]</li>
[% END %]
[% IF ( isguarantee ) %]
[% IF ( guaranteeloop ) %]
<li><span class="label">Guarantees:</span><ul>[% FOREACH guaranteeloo IN guaranteeloop %]<li><a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% guaranteeloo.borrowernumber %]">[% guaranteeloo.name %] </a></li>[% END %]</ul></li>
[% END %]
[% ELSE %]
[% IF ( guarantorborrowernumber ) %]
<li><span class="label">Guarantor:</span><a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% guarantorborrowernumber %]">[% guarantorsurname %], [% guarantorfirstname %]</a></li>
[% END %]
[% END %]
</ol>
</div>
<div class="action">
[% IF ( guarantorborrowernumber ) %]
<a href="memberentry.pl?op=modify&amp;borrowernumber=[% borrowernumber %]&amp;step=1&amp;guarantorid=[% guarantorborrowernumber %]">Edit</a>
[% ELSE %]
<a href="memberentry.pl?op=modify&amp;borrowernumber=[% borrowernumber %]&amp;step=1">Edit</a>
[% END %]</div>
</div>
<!-- Begin Upload Patron Image Section -->
<div id="manage-patron-image">
[% IF ( patronimages ) %]
[% IF ( CAN_user_tools_batch_upload_patron_images ) %]
<form method="post" action="/cgi-bin/koha/tools/picture-upload.pl" enctype="multipart/form-data">
<fieldset class="brief">
[% IF ( picture ) %]
<legend>Manage Patron Image</legend>
<div class="hint">To update the image for [% title %] [% surname %], select a new image file and click 'Upload.' <br />Click the 'Delete' button to remove the current image.
[% ELSE %]
<legend>Upload Patron Image</legend>
<div class="hint">[% title %] [% firstname %] [% surname %] does not currently have an image available. To import an image for [% title %] [% surname %], enter the name of an image file to upload.
[% END %]
<br />Only PNG, GIF, JPEG, XPM formats are supported.
</div>
<input type="hidden" id="image" name="filetype" value="image" />
<input type="hidden" id="cardnumber" name="cardnumber" value="[% cardnumber %]" />
<input type="hidden" name="borrowernumber" value="[% borrowernumber %]" />
<ol>
<li>
<label for="uploadfile">Select the file to upload: </label><input type="file" id="uploadfile" name="uploadfile" />
</li>
</ol>
<fieldset class="action">
<input type="submit" value="Upload" class="submit" />
<input name="op" type="hidden" value="Upload" />
[% IF ( picture ) %]<a id="delpicture" href="/cgi-bin/koha/tools/picture-upload.pl?op=Delete&amp;cardnumber=[% cardnumber %]&amp;borrowernumber=[% borrowernumber %]" class="delete">Delete</a>[% END %]
</fieldset>
</fieldset>
</form>
[% END %]
[% END %]
</div>
<!-- End Upload Patron Image Section -->
[% IF ( ExtendedPatronAttributes ) %]
[% UNLESS ( no_patron_attribute_types ) %]
<div id="patron-extended-attributes" style="padding-top: 1em;">
<h3>Additional attributes and identifiers</h3>
[% FOREACH attribute IN attributes_loop %]
[% IF attribute.class %]
<div id="aai_[% attribute.class %]" class="rows">
[% ELSE %]
<div id="aai" class="rows">
[% END %]
<h4>[% attribute.lib %]</h4>
<ol>
[% FOREACH item IN attribute.items %]
<li>
<span class="label">[% item.description %]: </span>
[% IF ( item.value_description ) %]
[% item.value_description %]
[% ELSE %]
[% item.value| html_line_break %]
[% END %]
</li>
[% END %]
</ol>
</div>
[% END %]
</div>
<div class="action"><a href="memberentry.pl?op=modify&amp;borrowernumber=[% borrowernumber %]&amp;step=4">Edit</a></div>
[% END %]
[% END %]
[% IF ( EnhancedMessagingPreferences ) %]
<div id="patron-messaging-prefs" style="padding-top: 1em;">
<h3>Patron messaging preferences</h3>
[% INCLUDE 'messaging-preference-form.inc' %]
[% IF ( SMSSendDriver ) %]
<div class="rows"> <ol><li><span class="label">SMS number:</span>[% SMSnumber %]
</li></ol></div>
[% END %]
</div>
<div class="action"><a href="memberentry.pl?op=modify&amp;borrowernumber=[% borrowernumber %]&amp;step=5">Edit</a></div>
[% END %]
</div>
<div class="yui-u">
<div id="patron-library-details">
<h3>Library use</h3>
<div class="rows">
<ol>
<li><span class="label">Card number: </span>[% cardnumber %]</li>
<li><span class="label">Borrowernumber: </span> [% borrowernumber %]</li>
<li><span class="label">Category: </span>[% description %] ([% categorycode %])</li>
<li><span class="label">Registration date: </span>[% dateenrolled %]</li>
<li><span class="label">Expiration date: </span>
[% IF ( was_renewed ) %]
<strong class="reregistrinfo">[% dateexpiry %]</strong>
[% ELSE %]
[% dateexpiry %]
[% END %]
</li>
<li><span class="label">Library: </span>[% branchname %]</li>
[% IF ( OPACPrivacy ) %]<li><span class="label">Privacy Pref:</span>
[% IF ( privacy0 ) %]Forever[% END %]
[% IF ( privacy1 ) %]Default[% END %]
[% IF ( privacy2 ) %]Never[% END %]
</li>[% END %]
[% IF ( sort1 ) %]<li><span class="label">Sort field 1:</span>[% lib1 %]</li>[% END %]
[% IF ( sort2 ) %]<li><span class="label">Sort field 2:</span>[% lib2 %]</li>[% END %]
<li><span class="label">Username: </span>[% userid %]</li>
<li><span class="label">Password: </span>
[% IF ( password ) %]
*******
[% ELSE %]
<span class="problem"><a href="/cgi-bin/koha/members/member-password.pl?member=[% borrowernumber %]">Undefined</a></span>
[% END %]
</li>
[% IF ( borrowernotes ) %]<li><span class="label">Circulation note: </span>[% borrowernotes %]</li>[% END %]
[% IF ( opacnote ) %]<li><span class="label">OPAC note:</span>[% opacnote %]</li>[% END %]
[% IF Koha.Preference( 'NorwegianPatronDBEnable' ) == 1 %]
[% IF ( sync == 1 ) %]
<li><span class="label">Activate sync: </span>Yes</li>
[% IF ( syncstatus ) %]<li><span class="label">Sync status: </span>[% syncstatus %]</li>[% END %]
[% IF ( lastsync ) %]<li><span class="label">Last sync: </span>[% lastsync | $KohaDates %]</li>[% END %]
[% ELSE %]
<li><span class="label">Activate sync: </span>No</li>
[% END %]
[% END %]
</ol>
</div>
</div>
<div class="action"><a href="memberentry.pl?op=modify&amp;borrowernumber=[% borrowernumber %]&amp;step=3">Edit</a></div>
[% UNLESS ( I ) %]
<div id="patron-alternate-address" style="padding-top: 1em;">
<h3>Alternate address</h3>
<div class="rows"> <ol><li><span class="label">Address: </span>[% B_address %]</li>
<li><span class="label">Address 2: </span>[% B_address2 %]</li>
<li><span class="label">City: </span>[% B_city %]</li>
[% IF ( B_state ) %]<li><span class="label">State: </span>[% B_state %]</li>[% END %]
<li><span class="label">Zip/Postal code: </span>[% B_zipcode %]</li>
[% IF ( B_country ) %]<li><span class="label">Country: </span>[% B_country %]</li>[% END %]
[% IF ( B_phone ) %]<li><span class="label">Phone: </span>[% B_phone %]</li>[% END %]
[% IF ( B_email ) %]<li><span class="label">Email: </span><a href="mailto:[% B_email %]">[% B_email %]</a></li>[% END %]
[% IF ( contactnote ) %]<li><span class="label">Contact note: </span> [% contactnote %]</li>[% END %]
</ol>
</div>
</div>
<div class="action"><a href="memberentry.pl?op=modify&amp;borrowernumber=[% borrowernumber %]&amp;step=6">Edit</a></div>
[% END %]
<div id="patron-alternative-contact" style="padding-top: 1em;">
<h3>Alternative contact</h3>
<div class="rows"> <ol><li><span class="label">Surname: </span>[% altcontactsurname %]</li>
<li><span class="label">First name: </span>[% altcontactfirstname %]</li>
<li><span class="label">Address: </span>[% altcontactaddress1 %]</li>
<li><span class="label">Address 2: </span>[% altcontactaddress2 %]</li>
<li><span class="label">City: </span>[% altcontactaddress3 %]</li>
[% IF ( altcontactstate ) %]<li><span class="label">State: </span>[% altcontactstate %]</li>[% END %]
<li><span class="label">Zip/Postal code: </span>[% altcontactzipcode %]</li>
[% IF ( altcontactcountry ) %]<li><span class="label">Country: </span>[% altcontactcountry %]</li>[% END %]
[% IF ( altcontactphone ) %]<li><span class="label">Phone: </span>[% altcontactphone %]</li>[% END %]
</ol></div>
</div>
<div class="action"><a href="memberentry.pl?op=modify&amp;borrowernumber=[% borrowernumber %]&amp;step=2">Edit</a></div>
</div>
</div>
<div id="finesholdsissues" class="toptabs">
<ul>
<li><a href="#checkouts">[% issuecount %] Checkout(s)</a></li>
[% IF relatives_issues_count %]
<li><a href="#relatives-issues" id="relatives-issues-tab">Relatives' checkouts</a></li>
[% END %]
<li><a href="#finesandcharges">Fines &amp; Charges</a></li>
<li>
[% IF ( holds_count ) %]
<a href="#reserves" id="holds-tab">[% holds_count %] Hold(s)</a>
[% ELSE %]
<a href="#reserves" id="holds-tab">0 Holds</a>
[% END %]
</li>
<li><a id="debarments-tab-link" href="#reldebarments">[% debarments.size %] Restrictions</a></li>
</ul>
[% INCLUDE "checkouts-table.inc" %]
[% IF ( relatives_issues_count ) %]
<div id="relatives-issues">
<table id="relatives-issues-table" style="width: 100% !Important;">
<thead>
<tr>
<th scope="col">Due date</th>
<th scope="col">Title</th>
<th scope="col">Item type</th>
<th scope="col">Checked out on</th>
<th scope="col">Checked out from</th>
<th scope="col">Call no</th>
<th scope="col">Charge</th>
<th scope="col">Price</th>
<th scope="col">Patron</th>
</tr>
</thead>
</table>
</div>
[% END %]
<div id="finesandcharges">
[% IF ( totaldue_raw ) %]
<p>Total due: [% totaldue %]</p>
[% ELSE %]
<p>No outstanding charges</p>
[% END %]
</div>
[% INCLUDE borrower_debarments.inc %]
<div id="reserves">
[% IF ( holds_count ) %]
<form action="/cgi-bin/koha/reserve/modrequest.pl" method="post">
<input type="hidden" name="from" value="circ" />
<table id="holds-table" style="width: 100% !Important;">
<thead>
<tr>
<th>Hold date</th>
<th>Title</th>
<th>Call number</th>
<th>Barcode</th>
<th>Expiration</th>
<th>Priority</th>
<th>Delete?</th>
</tr>
</thead>
</table>
<fieldset class="action">
<input type="submit" class="cancel" name="submit" value="Cancel marked holds" />
</fieldset>
</form>
[% IF SuspendHoldsIntranet %]
<fieldset class="action">
<form action="/cgi-bin/koha/reserve/modrequest_suspendall.pl" method="post">
<input type="hidden" name="from" value="borrower" />
<input type="hidden" name="borrowernumber" value="[% borrowernumber %]" />
<input type="submit" value="Suspend all holds" />
[% IF AutoResumeSuspendedHolds %]
<label for="suspend_until">until</label>
<input type="text" size="10" id="suspend_until" name="suspend_until"/>
<span class="hint">Specify date on which to resume [% INCLUDE 'date-format.inc' %]: </span>
[% END %]
</form>
</fieldset>
<fieldset class="action">
<form action="/cgi-bin/koha/reserve/modrequest_suspendall.pl" method="post">
<input type="hidden" name="from" value="borrower" />
<input type="hidden" name="borrowernumber" value="[% borrowernumber %]" />
<input type="hidden" name="suspend" value="0" />
<input type="submit" value="Resume all suspended holds" />
</form>
</fieldset>
[% END # IF SuspendHoldsIntranet %]
[% ELSE %]<p>Patron has nothing on hold.</p>[% END %]
</div>
</div>
[% END %] <!-- unknowuser -->
</div>
</div>
<div class="yui-b">
[% INCLUDE 'circ-menu.inc' %]
</div>
</div>
[% INCLUDE 'intranet-bottom.inc' %]