Koha/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tt
Magnus Enger 6fec4ea0df
Bug 26170: Add protected status for patrons
This set of patches makes it possible to protect patrons from being accidetally
deleted or merged with other patrons, from the UI and from (well behaved) cron
jobs. The following subroutines are affected:
- Koha::Patron::delete
- Koha::Patron::merge_with
- Koha::Patron::safe_to_delete
- C4::Members::GetBorrowersToExpunge

Please note:
- This does not intend to protect patrons from being edited, only from being
  deleted

To test:

* Tests
- Run the affected tests:
  prove t/db_dependent/Members.t
  prove t/db_dependent/Koha/Patrons.t

* Editing protected status and manual deletion
- Add a new user, note the presence of the "Protected" field under "Library
  management", but leave it at the default "No", for now.
- Note that "Protected" is displayed in the "Library use" section of the patron
  details.
- Note that More > Delete is avaiable as an action when the patron is saved
- Edit the user and set "Protected" to "Yes"
- Note that More > Delete is now disabled, with a note that the patron is protected

* Batch patron deletion
- Go to Tools > Batch patron deletion and anonymization
- Check the box for "Verify you want to delete patrons"
- Choose the category of your protected patron for "whose patron category is"
  and click "Next" to run the actual deletion
- Check that your protected patron was not deleted

* Merging patrons
- Make sure you have two patrons with similar names or the same category, so
  you can find them with one search. One should be protected, one not.
- Search for the patrons, tick their boxes and click on "Merge selected patrons"
- Select one of the patrons as the "patron to keep".
. Click on "Merge patrons"
- "No valid patrons to merge were found" should be shown
- Repeat this with the other patron as the "patron to keep"
(A future enhancement could be to not allow a protected patron to be selected for
merging in the first place.)

* misc/cronjobs/delete_patrons.pl
- Make sure you have a protected patron, in a category with at least one more
  patron.
- Run something like this (at least in ktd):
  $ perl misc/cronjobs/delete_patrons.pl --category_code <code> -v --confirm
  (Replace <code> with the actual categorycode.)
- Make sure the borrowernumber of the protected patron is not mentioned in the
  output of the script.
- Check the protected patron was not deleted
- Check the non-protected patrons were deleted

* REST API (with ktd)
- Make sure you still have a protected patron, and note their borrowernumber
- Enable RESTBasicAuth and restart all the things
- Run these two commands from the command line on the host:
  $ curl -u koha:koha --request GET "http://localhost:8081/api/v1/patrons/54"
  $ curl -u koha:koha --request DELETE "http://localhost:8081/api/v1/patrons/54"
  (Replace 54 with the actual borrowernumber of your protected patron.)
- The first curl command should give you the patron details. The second should
  give this output:
  {"error":"Protected patrons cannot be deleted","error_code":"is_protected"}

There could be more functions/scripts where patrons are deleted that I have not
thought about. Please report them on the bug if you find any!

Update 2023-10-19: Fix "More > Delete" on patron, so link can not be clicked.
Update 2023-10-19: Rebase

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
2023-11-01 17:23:06 -03:00

774 lines
50 KiB
Text

[% USE raw %]
[% USE Asset %]
[% USE Context %]
[% USE Koha %]
[% USE Branches %]
[% USE ItemTypes %]
[% USE KohaDates %]
[% USE AuthorisedValues %]
[% USE TablesSettings %]
[% USE Price %]
[% PROCESS 'member-display-address-style.inc' %]
[% PROCESS 'member-display-alt-address-style.inc' %]
[% PROCESS 'i18n.inc' %]
[% SET footerjs = 1 %]
[% INCLUDE 'doc-head-open.inc' %]
[% Asset.css("lib/jquery/plugins/rowGroup/stylesheets/rowGroup.dataTables.min.css") | $raw %]
<title>[% FILTER collapse %]
[% UNLESS blocking_error %]
[% t("Patron details for") | html %] [% INCLUDE 'patron-title.inc' no_html = 1 %]
[% END %] &rsaquo;
[% t("Patrons") | html %] &rsaquo;
[% t("Koha") | html %]
[% END %]</title>
[% INCLUDE 'doc-head-close.inc' %]
</head>
<body id="pat_moremember" class="pat">
[% WRAPPER 'header.inc' %]
[% INCLUDE 'patron-search-header.inc' %]
[% END %]
[% WRAPPER 'sub-header.inc' %]
[% WRAPPER breadcrumbs %]
[% WRAPPER breadcrumb_item %]
<a href="/cgi-bin/koha/members/members-home.pl">Patrons</a>
[% END %]
[% UNLESS blocking_error %]
[% WRAPPER breadcrumb_item %]
<a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% patron.borrowernumber | uri %]">
[% INCLUDE 'patron-title.inc' %]
</a>
[% END %]
[% WRAPPER breadcrumb_item bc_active= 1 %]
<span>Details</span>
[% END %]
[% END %]
[% END #/ WRAPPER breadcrumbs %]
[% END #/ WRAPPER sub-header.inc %]
<div class="main container-fluid">
<div class="row">
<div class="col-sm-10 col-sm-push-2">
<main>
[% INCLUDE 'members-toolbar.inc' %]
[% IF is_anonymous %]
<div class="dialog alert">This is the anonymous patron.</div>
[% END %]
[% IF ( error ) %]
<div class="dialog alert">
[% IF ( error == 'CANT_DELETE_STAFF' ) %]
<h3>Unable to delete staff user</h3>
<p>Insufficient privileges.</p>
[% END %]
[% IF ( error == 'CANT_DELETE_YOURSELF' ) %]
<h3>Not allowed to delete own account</h3>
<p>Deleting your own account would lock you out of Koha.</p>
[% END %]
[% IF ( error == 'CANT_DELETE_OTHERLIBRARY' ) %]
<h3>Unable to delete patrons from other libraries with current settings</h3>
<p>Insufficient privileges.</p>
[% END %]
[% IF ( error == 'CANT_DELETE_ANONYMOUS_PATRON' ) %]
<h3>Unable to delete patron that is set as AnonymousPatron</h3>
<p>This patron cannot be deleted while set as AnonymousPatron in the system preferences.</p>
[% END %]
[% IF ( error == 'CANT_DELETE' ) %]
<h3>Unable to delete patron</h3>
<p>Insufficient privileges.</p>
[% END %]
</div>
[% END %]
<div class="row">
[% IF ( was_renewed ) %]
<div class="dialog message">
Patron's account has been renewed until [% patron.dateexpiry | $KohaDates %]
</div>
[% END %]
[% messages = INCLUDE 'patron_messages.inc' moremember = 1 | trim %]
[% IF messages %]
<div class="col-sm-12">
<div id="patron_messages" class="circmessage attention">
[% messages | $raw %]
</div>
</div>
[% END %]
<div class="col-sm-12">
<h1>[% INCLUDE 'patron-title.inc' no_html = 1 %]</h1>
[% IF patron.pronouns %]
<div class="patronpronouns">([% patron.pronouns | html %])</div>
[% END %]
</div>
<div class="col-sm-6">
<div id="patron-information" class="patroninfo-section">
<div class="patroninfo-heading">
<h3>Contact information</h3>
[% IF ( guarantor.borrowernumber ) %]
<a class="btn btn-default btn-xs" href="memberentry.pl?op=modify&amp;borrowernumber=[% patron.borrowernumber | html %]&amp;step=1&amp;guarantorid=[% guarantor.borrowernumber | html %]"><i class="fa-solid fa-pencil" aria-hidden="true"></i> Edit</a>
[% ELSE %]
<a class="btn btn-default btn-xs" href="memberentry.pl?op=modify&amp;borrowernumber=[% patron.borrowernumber | html %]&amp;step=1"><i class="fa-solid fa-pencil" aria-hidden="true"></i> Edit</a>
[% END %]
</div>
[% IF ( patron.othernames ) %]<div>&ldquo;[% patron.othernames | html %]&rdquo;</div>[% END %]
<div class="address">
<ul>
[% PROCESS 'display-address-style' %]
</ul>
</div>
<div class="rows">
<ol>
[% IF ( patron.phone ) %]
<li>
<span class="label">Primary phone: </span>
<a href="tel:[% patron.phone | uri %]">[% patron.phone | html %]</a>
</li>
[% END %]
[% IF ( patron.phonepro ) %]
<li>
<span class="label">Secondary phone: </span>
<a href="tel:[% patron.phonepro | uri %]">[% patron.phonepro | html %]</a>
</li>
[% END %]
[% IF ( patron.mobile ) %]
<li>
<span class="label">Other phone: </span>
<a href="tel:[% patron.mobile | uri %]">[% patron.mobile | html %]</a>
</li>
[% END %]
[% IF ( patron.fax ) %]
<li>
<span class="label">Fax: </span>
[% patron.fax | html %]
</li>
[% END %]
[% IF ( patron.email ) %]
<li class="email">
<span class="label">Primary email:</span>
<a title="[% patron.email | html %]" href="mailto:[% patron.email | url %]">[% patron.email | html %]</a>
</li>
[% END %]
[% IF ( patron.emailpro ) %]
<li class="email">
<span class="label">Secondary email: </span>
<a title="[% patron.emailpro | html %]" href="mailto:[% patron.emailpro | url %]">[% patron.emailpro | html %]</a>
</li>
[% END %]
[% UNLESS ( I ) %]
[% IF ( patron.initials ) %]
<li>
<span class="label">Initials: </span>
[% patron.initials | html %]
</li>
[% END %]
[% IF ( patron.dateofbirth ) %]
<li>
<span class="label">Date of birth:</span>
[% INCLUDE 'patron-age.inc' %]
</li>
[% END %]
[% IF ( patron.sex ) %]
<li>
<span class="label">Gender:</span>
[% IF ( patron.sex == 'F' ) %]<span class="patronsex-female">Female</span>[% ELSIF ( patron.sex == 'M' ) %]<span class="patronsex-male">Male</span>[% ELSIF (patron.sex == 'O' ) %]<span class="patronsex-other">Other</span>[% ELSE %][% patron.sex | html %][% END %]
</li>
[% END %]
[% END %]
[% IF Koha.Preference("borrowerRelationship") %]
<li id="patron-privacyguarantor">
<span class="label">Show checkouts to guarantor:</span>
[% IF patron.privacy_guarantor_checkouts %]
Yes
[% ELSE %]
No
[% END %]
</li>
<li id="patron-privacy_guarantor_fines">
<span class="label">Show charges to guarantor:</span>
[% IF patron.privacy_guarantor_fines %]
Yes
[% ELSE %]
No
[% END %]
</li>
[% END %]
[% IF guarantees %]
<li>
<span class="label">Guarantees:</span>
<ul>
[% IF guarantees_fines and guarantees_fines > 0 %]
<li class="guarantees-fines">
<span class="circ-hlt">Charges:</span>
Patron's guarantees collectively owe [% guarantees_fines | $Price %].
<a id="view_guarantees_finesandcharges" href="#guarantees_finesandcharges" >See all charges.</a>
</li>
[% END %]
[% FOREACH guarantee IN guarantees %]
[% IF logged_in_user.can_see_patron_infos( guarantee ) %]
<li><a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% guarantee.borrowernumber | uri %]">[% guarantee.firstname | html %] [% guarantee.surname | html %]</a></li>
[% ELSE %]
<li>[% guarantee.firstname | html %] [% guarantee.surname | html %]</li>
[% END %]
[% END %]
</ul>
</li>
[% ELSIF guarantor_relationships.count > 0 OR ( patron.contactfirstname OR patron.contactname ) %]
<li>
[% IF guarantor_relationships.count > 1 OR guarantor_relationships.count == 0 AND ( patron.contactfirstname OR patron.contactname ) %]
<span class="label">Guarantors:</span>
[% ELSE %]
<span class="label">Guarantor:</span>
[% END %]
<ul>
[% FOREACH gr IN guarantor_relationships %]
[% SET guarantor = gr.guarantor %]
[% IF logged_in_user.can_see_patron_infos( guarantor ) %]
<li><a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% guarantor.id | uri %]">[% guarantor.firstname | html %] [% guarantor.surname | html %][% IF gr.relationship %] ([% gr.relationship | html %])[% END %]</a></li>
[% END %]
[% END %]
[% IF patron.contactfirstname OR patron.contactname %]
<li>[% patron.contactfirstname | html %] [% patron.contactname | html %][% IF patron.relationship %] ([% patron.relationship | html %])[% END %]</li>
[% END %]
</ul>
</li>
[% END %]
[% IF ( patron.primary_contact_method ) %]
<li>
<span class="label">Main contact method: </span>
[% SWITCH patron.primary_contact_method %]
[% CASE 'phone' %]
<span>Primary phone</span>
[% CASE 'phonepro' %]
<span>Secondary phone</span>
[% CASE 'mobile' %]
<span>Other phone</span>
[% CASE 'email' %]
<span>Primary email</span>
[% CASE 'emailpro' %]
<span>Secondary email</span>
[% CASE 'fax' %]
<span>Fax</span>
[% END %]
</li>
[% END %]
</ol>
</div> [% # /div.rows %]
</div> [% # /div#patron-information %]
[% IF Koha.Preference('HouseboundModule') %]
<div id="houseboundroles" class="patroninfo-section">
[% IF ( housebound_role.housebound_chooser == 1 OR housebound_role.housebound_deliverer == 1 ) %]
<div class="patroninfo-heading">
<h3>Housebound roles</h3>
<a class="btn btn-default btn-xs" href="memberentry.pl?op=modify&amp;borrowernumber=[% patron.borrowernumber | html %]&amp;step=7"><i class="fa-solid fa-pencil" aria-hidden="true"></i> Edit</a>
</div>
<div class="rows">
<ol>
<li>
<span class="label">Chooser:</span>
[% IF ( housebound_role.housebound_chooser == 1 ) %]
Yes
[% ELSE %]
No
[% END %]
</li>
<li>
<span class="label">Deliverer:</span>
[% IF ( housebound_role.housebound_deliverer == 1 ) %]
Yes
[% ELSE %]
No
[% END %]
</li>
</ol>
</div>
[% ELSE %]
<div class="patroninfo-heading">
<h3>Housebound roles</h3>
<a class="btn btn-default btn-xs" href="memberentry.pl?op=modify&amp;borrowernumber=[% patron.borrowernumber | html %]&amp;step=7"><i class="fa fa-plus"></i> Add</a>
</div>
[% END %]
</div> [% #/ div#houseboundroles %]
[% END %]
[% IF Koha.Preference('ExtendedPatronAttributes') %]
[% UNLESS ( no_patron_attribute_types ) %]
<div id="patron-extended-attributes" class="patroninfo-section">
[% IF ( attributes_loop ) %]
<div class="patroninfo-heading">
<h3>Additional attributes and identifiers</h3>
<a class="btn btn-default btn-xs" href="memberentry.pl?op=modify&amp;borrowernumber=[% patron.borrowernumber | html %]&amp;step=4"><i class="fa-solid fa-pencil" aria-hidden="true"></i> Edit</a>
</div>
[% FOREACH attribute IN attributes_loop %]
[% IF attribute.class %]
<div id="aai_[% attribute.class | html %]" class="rows">
[% ELSE %]
<div id="aai" class="rows">
[% END %]
<h4>[% attribute.lib | html %]</h4>
<ol>
[% FOREACH item IN attribute.items %]
<li data-pa_code="[% item.type.code | replace('[^a-zA-Z0-9_-]', '') %]">
<span class="label">[% item.type.description | html %]: </span>
[% item.description | html_line_break %]
</li>
[% END %]
</ol>
</div>
[% END %]
<div class="action">
</div>
[% ELSE %]
<div class="patroninfo-heading">
<h3>Additional attributes and identifiers</h3>
<a class="btn btn-default btn-xs" href="memberentry.pl?op=modify&amp;borrowernumber=[% patron.borrowernumber | html %]&amp;step=4"><i class="fa fa-plus"></i> Add</a>
</div>
[% END %]
</div> [% # /div#patron-extended-attributes %]
[% END %]
[% END %]
[% IF ( EnhancedMessagingPreferences ) %]
<div id="patron-messaging-prefs" class="patroninfo-section">
<div class="patroninfo-heading">
<h3>Patron messaging preferences</h3>
<a class="btn btn-default btn-xs" href="memberentry.pl?op=modify&amp;borrowernumber=[% patron.borrowernumber | html %]&amp;step=5"><i class="fa-solid fa-pencil" aria-hidden="true"></i> Edit</a>
</div>
[% INCLUDE 'messaging-preference-form.inc' %]
[% IF Koha.Preference('SMSSendDriver') %]
<div class="rows">
<ol>
<li>
<span class="label">SMS number:</span>
<a href="sms:[% patron.smsalertnumber | uri %]">[% patron.smsalertnumber | html %]</a>
</li>
[% IF Koha.Preference( 'SMSSendDriver') == 'Email' %]
<li>
<span class="label">SMS provider:</span>
[% patron.sms_provider.name | html %]
</li>
[% END %]
</ol>
</div>
[% END %]
</div> [% # /div#patron-messaging-prefs %]
[% END %]
</div> <!-- /.col-sm-6 -->
<div class="col-sm-6">
<div id="patron-library-details" class="patroninfo-section">
<div class="patroninfo-heading">
<h3>Library use</h3>
<a class="btn btn-default btn-xs" href="memberentry.pl?op=modify&amp;borrowernumber=[% patron.borrowernumber | html %]&amp;step=3"><i class="fa-solid fa-pencil" aria-hidden="true"></i> Edit</a>
</div>
<div class="rows">
<ol>
<li id="patron-cardnumber">
<span class="label">Card number: </span>
[% patron.cardnumber | html %]
</li>
<li id="patron-borrowernumber">
<span class="label">Borrowernumber: </span>
[% patron.borrowernumber | html %]
</li>
<li id="patron-categorydescription">
<span class="label">Category: </span>
[% patron.category.description | html %] ([% patron.categorycode | html %])
</li>
<li id="patron-dateenrolled">
<span class="label">Registration date: </span>
[% patron.dateenrolled | $KohaDates %]
</li>
[% IF ( patron.date_renewed ) %]
<li id="patron-daterenewed">
<span class="label">Renewal date: </span>
[% patron.date_renewed | $KohaDates %]
</li>
[% END %]
<li id="patron-expirationdate">
<span class="label">Expiration date: </span>
[% IF ( was_renewed ) %]
<strong class="reregistrinfo">[% patron.dateexpiry | $KohaDates %]</strong>
[% ELSIF ( patron.is_expired ) %]
<span class="blocker">
[% patron.dateexpiry | $KohaDates %]
<strong><em>Expired</em></strong>
<a href="/cgi-bin/koha/members/setstatus.pl?borrowernumber=[% patron.borrowernumber | uri %]&amp;reregistration=y">Renew</a> or <a href="/cgi-bin/koha/members/memberentry.pl?op=modify&amp;borrowernumber=[% patron.borrowernumber | html %]">Edit details</a>
</span>
[% ELSIF ( patron.is_going_to_expire ) %]
[% patron.dateexpiry | $KohaDates %]
<strong><em>Patron expires soon</em></strong>
<a href="/cgi-bin/koha/members/setstatus.pl?borrowernumber=[% patron.borrowernumber | uri %]&amp;reregistration=y">Renew</a> or <a href="/cgi-bin/koha/members/memberentry.pl?op=modify&amp;borrowernumber=[% patron.borrowernumber | html %]">Edit details</a>
[% ELSE %]
[% patron.dateexpiry | $KohaDates %]
[% END %]
</li>
<li id="patron-branchname">
<span class="label">Library: </span>
[% Branches.GetName( patron.branchcode ) | html %]
</li>
[% IF Koha.Preference( 'OPACPrivacy') %]
<li id="patron-privacypref">
<span class="label">Privacy pref:</span>
[% IF ( patron.privacy == 0 ) %]<span>Forever</span>[% END %]
[% IF ( patron.privacy == 1 ) %]<span>Default</span>[% END %]
[% IF ( patron.privacy == 2 ) %]<span>Never</span>[% END %]
</li>
[% END %]
[% IF ( patron.sort1 ) %]
<li id="patron-sort1">
<span class="label">Sort field 1:</span>
[% AuthorisedValues.GetByCode('Bsort1', patron.sort1) | html %]
</li>
[% END %]
[% IF ( patron.sort2 ) %]
<li id="patron-sort2">
<span class="label">Sort field 2:</span>
[% AuthorisedValues.GetByCode('Bsort2', patron.sort2) | html %]
</li>
[% END %]
[% UNLESS ( patron.autorenew_checkouts ) %]
<li id="patron-autorenew_checkouts">
<span class="label">Auto-renewal:</span>
Patron has opted out
</li>
[% END %]
<li id="patron-username">
<span class="label">Username: </span>
[% patron.userid | html %]
</li>
<li id="patron-password">
<span class="label">Password: </span>
[% IF ( patron.password ) %]
*******
[% ELSE %]
<i class="fa fa-exclamation-circle problem" aria-hidden="true"></i> <a href="/cgi-bin/koha/members/member-password.pl?member=[% patron.borrowernumber | uri %]">Undefined</a>
[% END %]
</li>
[% IF CAN_user_superlibrarian %]
<li id="patron-password_expiration_date">
<span class="label">Password expires:</span>
[% IF ( patron.password_expiration_date ) %]
[% patron.password_expiration_date | $KohaDates %]
[% ELSE %]
<span>Never</span>
[% END %]
</li>
[% END %]
<li id="patron-protected">
<span class="label">Protected: </span>
[% IF ( patron.protected == 1 ) %]
Yes
[% ELSE %]
No
[% END %]
</li>
[% IF ( patron.borrowernotes ) %]
<li id="patron-borrowernotes">
<span class="label">Circulation note: </span><br />
[% patron.borrowernotes | $raw | html_line_break %]
</li>
[% END %]
[% IF ( patron.opacnote ) %]
<li id="patron-opacnote">
<span class="label">OPAC note:</span><br />
[% patron.opacnote | html | html_line_break %]
</li>
[% END %]
[% IF ( Koha.Preference('CheckPrevCheckout') == 'softyes' || Koha.Preference('CheckPrevCheckout') == 'softno' ) %]
<li id="patron-checkprev">
<span class="label">Check previous checkouts: </span>
[% IF ( patron.checkprevcheckout == 'yes' ) %]
<span>Yes</span>
[% ELSIF ( patron.checkprevcheckout == 'no' ) %]
<span>No</span>
[% ELSE %]
<span>Inherited</span>
[% END %]
</li>
[% END %]
[% IF Koha.Preference('TranslateNotices') %]
<li id="patron-translatenotices">
<span class="label">Preferred language for notices: </span>
[% translated_language | html %]
</li>
[% END %]
</ol>
</div> [% # /div.rows %]
</div> [% # /div#patron-library-details %]
<div id="patron-alternate-address" class="patroninfo-section">
[% IF ( patron.B_phone || patron.B_email || patron.contactnote || patron.B_address || patron.B_address2 || patron.B_city || patron.B_zipcode || patron.B_country ) %]
<div class="patroninfo-heading">
<h3>Alternate address</h3>
<a class="btn btn-default btn-xs" href="memberentry.pl?op=modify&amp;borrowernumber=[% patron.borrowernumber | html %]&amp;step=6"><i class="fa-solid fa-pencil" aria-hidden="true"></i> Edit</a>
</div>
<div class="address">
<ul>
[% PROCESS 'display-alt-address-style' %]
</ul>
</div>
<div class="rows">
<ol>
[% IF ( patron.B_phone ) %]
<li id="patron-bphone">
<span class="label">Phone: </span>
<a href="tel:[% patron.B_phone | uri %]">[% patron.B_phone |html %]</a>
</li>
[% END %]
[% IF ( patron.B_email ) %]
<li id="patron-bemail" class="email">
<span class="label">Email: </span>
<a title="[% patron.B_email | html %]" href="mailto:[% patron.B_email | url %]">[% patron.B_email |html %]</a>
</li>
[% END %]
[% IF ( patron.contactnote ) %]
<li id="patron-contactnote">
<span class="label">Contact note: </span>
[% patron.contactnote |html %]
</li>
[% END %]
</ol>
</div>
[% ELSE %]
<div class="patroninfo-heading">
<h3 class="inline">Alternate address</h3>
<a class="btn btn-default btn-xs" href="memberentry.pl?op=modify&amp;borrowernumber=[% patron.borrowernumber | html %]&amp;step=6"><i class="fa fa-plus"></i> Add</a>
</div>
[% END %]
</div> [% # /div#patron-alternate-address %]
<div id="patron-alternative-contact" class="patroninfo-section">
[% IF ( patron.altcontactsurname || patron.altcontactfirstname || patron.altcontactaddress1 || patron.altcontactaddress2 || patron.altcontactaddress3 || patron.altcontactstate || patron.altcontactzipcode || patron.altcontactcountry || patron.altcontactphone ) %]
<div class="patroninfo-heading">
<h3>Alternative contact</h3>
<a class="btn btn-default btn-xs" href="memberentry.pl?op=modify&amp;borrowernumber=[% patron.borrowernumber | html %]&amp;step=2"><i class="fa-solid fa-pencil" aria-hidden="true"></i> Edit</a>
</div>
<div class="rows">
<ol>
[% IF ( patron.altcontactsurname ) %]
<li id="patron-altcontactsurname">
<span class="label">Surname: </span>
[% patron.altcontactsurname | html %]
</li>
[% END %]
[% IF ( patron.altcontactfirstname ) %]
<li id="patron-altcontactfirstname">
<span class="label">First name: </span>
[% patron.altcontactfirstname | html %]
</li>
[% END %]
[% IF ( patron.altcontactaddress1 ) %]
<li id="patron-altcontactaddress1">
<span class="label">Address: </span>
[% patron.altcontactaddress1 | html %]
</li>
[% END %]
[% IF ( patron.altcontactaddress2 ) %]
<li id="patron-altcontactaddress2">
<span class="label">Address 2: </span>
[% patron.altcontactaddress2 | html %]
</li>
[% END %]
[% IF ( patron.altcontactaddress3 ) %]
<li id="patron-altcontactaddress3">
<span class="label">City: </span>
[% patron.altcontactaddress3 | html %]
</li>
[% END %]
[% IF ( patron.altcontactstate ) %]
<li id="patron-altcontactstate">
<span class="label">State: </span>
[% patron.altcontactstate | html %]
</li>
[% END %]
[% IF ( patron.altcontactzipcode ) %]
<li id="patron-altcontactzipcode">
<span class="label">ZIP/Postal code: </span>
[% patron.altcontactzipcode | html %]
</li>
[% END %]
[% IF ( patron.altcontactcountry ) %]
<li id="patron-altcontactcountry">
<span class="label">Country: </span>
[% patron.altcontactcountry | html %]
</li>
[% END %]
[% IF ( patron.altcontactphone ) %]
<li id="patron-altcontactphone">
<span class="label">Phone: </span>
<a href="tel:[% patron.altcontactphone | url %]">[% patron.altcontactphone | html %]</a>
</li>
[% END %]
</ol>
</div> [% # /div.rows %]
[% ELSE %]
<div class="patroninfo-heading">
<h3>Alternative contact</h3>
<a class="btn btn-default btn-xs" href="memberentry.pl?op=modify&amp;borrowernumber=[% patron.borrowernumber | html %]&amp;step=2"><i class="fa fa-plus"></i> Add</a>
</div>
[% END %]
</div> [% # /div#patron-alternative-contact %]
[% IF Koha.Preference('EnableBorrowerFiles') %]
<div id="patron-files" class="patroninfo-section">
<div class="patroninfo-heading">
<h3>Files</h3>
<a class="btn btn-default btn-xs" href="/cgi-bin/koha/members/files.pl?borrowernumber=[% patron.borrowernumber | uri %]"><i class="fa fa-list"></i> Manage</a>
[% IF ( files ) %]
<div class="rows">
<ol>
[% FOREACH f IN files %]
<li>
<a href="/cgi-bin/koha/members/files.pl?borrowernumber=[% patron.borrowernumber | uri %]&amp;op=download&amp;file_id=[% f.file_id | uri %]">[% f.file_name | html %]</a>
[% IF ( f.file_description ) %]
- [% f.file_description | html %]
[% END %]
</li>
[% END # /FOREACH f %]
</ol>
</div>
[% END # /IF files %]
</div> <!-- /.patroninfo-heading -->
</div> <!-- /#patron-files -->
[% END # /IF EnableBorrowerFiles %]
</div> <!-- /div.col-sm-6 -->
</div> <!-- /div.row -->
[% INCLUDE 'patron-detail-tabs.inc' patronpage = "borrower" %]
</main>
</div> <!-- /.col-sm-10.col-sm-push-2 -->
<div class="col-sm-2 col-sm-pull-10">
<aside>
[% INCLUDE 'circ-menu.inc' %]
</aside>
</div> <!-- /.col-sm-2.col-sm-pull-10 -->
</div> <!-- /.row -->
[% IF Koha.Preference('ClaimReturnedLostValue') %]
[% INCLUDE 'modals/resolve_return_claim.inc' %]
[% END %]
[% MACRO jsinclude BLOCK %]
[% INCLUDE 'datatables.inc' %]
[% Asset.js("lib/jquery/plugins/rowGroup/dataTables.rowGroup.min.js") | $raw %]
[% INCLUDE 'columns_settings.inc' %]
[% INCLUDE 'select2.inc' %]
[% PROCESS 'modal-claims-js' %]
<script>
/* Set some variable needed in circulation.js */
var logged_in_user_borrowernumber = "[% logged_in_user.borrowernumber | html %]";
var ClaimReturnedLostValue = "[% Koha.Preference('ClaimReturnedLostValue') | html %]";
var ClaimReturnedChargeFee = "[% Koha.Preference('ClaimReturnedChargeFee') | html %]";
var ClaimReturnedWarningThreshold = "[% Koha.Preference('ClaimReturnedWarningThreshold') | html %]";
var UnseenRenewals = "[% Koha.Preference('UnseenRenewals') | html %]";
var interface = "[% interface | html %]";
var theme = "[% theme | html %]";
var borrowernumber = "[% patron.borrowernumber | html %]";
var branchcode = "[% Branches.GetLoggedInBranchcode() | html %]";
var exports_enabled = "[% Koha.Preference('ExportCircHistory') | html %]";
var AllowCirculate = [% (CAN_user_circulate_circulate_remaining_permissions)? 1 : 0 | html %]
var AllowRenewalLimitOverride = [% (CAN_user_circulate_override_renewals && Koha.Preference('AllowRenewalLimitOverride') )? 1: 0 | html %];
var AllowRenewalOnHoldOverride = [% (CAN_user_circulate_override_renewals && Koha.Preference('AllowRenewalOnHoldOverride') )? 1: 0 | html %];
var script = "moremember";
var relatives_borrowernumbers = new Array();
[% FOREACH b IN relatives_borrowernumbers %]
relatives_borrowernumbers.push("[% b | html %]");
[% END %]
var SuspendHoldsIntranet = [% ( Koha.Preference('SuspendHoldsIntranet') ) ? 1 : 0 | html %];
</script>
[% Asset.js("js/pages/circulation.js") | $raw %]
[% Asset.js("js/checkouts.js") | $raw %]
[% IF Koha.Preference('ClaimReturnedLostValue') %]
[% Asset.js("js/resolve_claim_modal.js") | $raw %]
[% END %]
[% Asset.js("js/holds.js") | $raw %]
[% INCLUDE 'calendar.inc' %]
[% INCLUDE 'str/members-menu.inc' %]
[% Asset.js("js/members-menu.js") | $raw %]
[% Asset.js("js/recalls.js") | $raw %]
<script>
const LoadCheckoutsTableDelay = 0;
table_settings_issues_table = [% TablesSettings.GetTableSettings( 'members', 'moremember', 'issues-table', 'json' ) | $raw %]
table_settings_relatives_issues_table = [% TablesSettings.GetTableSettings( 'members', 'moremember', 'relatives-issues-table', 'json' ) | $raw %]
table_settings_holds_table = [% TablesSettings.GetTableSettings( 'members', 'moremember', 'holds-table', 'json' ) | $raw %]
$(document).ready(function() {
$("#info_digests").tooltip();
$("#finesholdsissues a[data-toggle='tab']").on("shown.bs.tab", function(e){
var oTable = $('div.dataTables_wrapper > table', $(e.target.hash) ).dataTable();
if ( oTable.length > 0 ) {
oTable.fnAdjustColumnSizing();
}
});
$("#view_restrictions").on("click",function(){
$('#reldebarments-tab').click();
});
$("#view_guarantees_finesandcharges").on("click",function(){
$('#guarantees_finesandcharges-tab').click();
});
});
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;
}
}
}
}
</script>
[% END %]
[% INCLUDE 'intranet-bottom.inc' %]