Bugzilla – Attachment 118273 Details for
Bug 19532
Recalls for Koha
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 19532: Recalls on OPAC
Bug-19532-Recalls-on-OPAC.patch (text/plain), 51.95 KB, created by
Aleisha Amohia
on 2021-03-16 02:19:32 UTC
(
hide
)
Description:
Bug 19532: Recalls on OPAC
Filename:
MIME Type:
Creator:
Aleisha Amohia
Created:
2021-03-16 02:19:32 UTC
Size:
51.95 KB
patch
obsolete
>From 933b3d8c3ced9f77ff72b59460be3b6cd474b3d2 Mon Sep 17 00:00:00 2001 >From: Aleisha Amohia <aleishaamohia@hotmail.com> >Date: Mon, 11 May 2020 23:52:52 +0000 >Subject: [PATCH] Bug 19532: Recalls on OPAC > >- place a biblio-level or item-level recall via the biblio detail page, OPAC search results, or course reserves >- view or cancel your active recalls from 'your summary' recalls tab >- view all active and inactive (and cancel active) recalls from 'your recall history' >- stopped from placing a reserve on an item that the patron has already recalled > >Signed-off-by: David Nind <david@davidnind.com> >--- > .../bootstrap/en/includes/item-status.inc | 1 + > .../bootstrap/en/includes/opac-detail-sidebar.inc | 5 + > .../bootstrap/en/includes/title-actions-menu.inc | 4 + > .../opac-tmpl/bootstrap/en/includes/usermenu.inc | 9 + > .../bootstrap/en/modules/opac-course-details.tt | 2 +- > .../opac-tmpl/bootstrap/en/modules/opac-recall.tt | 199 +++++++++++++++++++++ > .../opac-tmpl/bootstrap/en/modules/opac-recalls.tt | 151 ++++++++++++++++ > .../opac-tmpl/bootstrap/en/modules/opac-reserve.tt | 2 + > .../opac-tmpl/bootstrap/en/modules/opac-results.tt | 1 + > .../opac-tmpl/bootstrap/en/modules/opac-user.tt | 85 +++++++++ > opac/opac-course-details.pl | 7 + > opac/opac-detail.pl | 7 +- > opac/opac-recall.pl | 141 +++++++++++++++ > opac/opac-recalls.pl | 42 +++++ > opac/opac-reserve.pl | 4 + > opac/opac-user.pl | 10 ++ > 16 files changed, 666 insertions(+), 4 deletions(-) > create mode 100644 koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-recall.tt > create mode 100644 koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-recalls.tt > create mode 100755 opac/opac-recall.pl > create mode 100755 opac/opac-recalls.pl > >diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/includes/item-status.inc b/koha-tmpl/opac-tmpl/bootstrap/en/includes/item-status.inc >index cd04f9f4a5..a0374c408b 100644 >--- a/koha-tmpl/opac-tmpl/bootstrap/en/includes/item-status.inc >+++ b/koha-tmpl/opac-tmpl/bootstrap/en/includes/item-status.inc >@@ -39,6 +39,7 @@ > <span class="item-status checkedout">Checked out</span> > [% END %] > [% END %] >+ [% IF item.avail_for_recall %]<a href="/cgi-bin/koha/opac-recall.pl?biblionumber=[% item.biblionumber | uri %]" class="btn btn-default btn-xs">Recall</a>[% END %] > [% END %] > > [% IF NOT ( item.isa('Koha::Item') ) AND item.transfertwhen %] [%# transfertwhen is set in C4::Search, do not have it for course reserves %] >diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-detail-sidebar.inc b/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-detail-sidebar.inc >index a110d73a2a..6e45dd4048 100644 >--- a/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-detail-sidebar.inc >+++ b/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-detail-sidebar.inc >@@ -11,6 +11,11 @@ > [% END %] > [% END %] > >+ [% IF Koha.Preference('UseRecalls') %] >+ <li><a class="recall btn btn-link btn-lg" href="/cgi-bin/koha/opac-recall.pl?biblionumber=[% biblio.biblionumber | html %]"><i class="fa fa-fw fa-bookmark-o"></i> >+ Place recall</a></li> >+ [% END %] >+ > <li><a class="print-large btn btn-link btn-lg" href="#"><i class="fa fa-fw fa-print" aria-hidden="true"></i> Print</a></li> > > [% IF Koha.Preference( 'opacuserlogin' ) == 1 %] >diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/includes/title-actions-menu.inc b/koha-tmpl/opac-tmpl/bootstrap/en/includes/title-actions-menu.inc >index 55ff553370..e3225ab4c8 100644 >--- a/koha-tmpl/opac-tmpl/bootstrap/en/includes/title-actions-menu.inc >+++ b/koha-tmpl/opac-tmpl/bootstrap/en/includes/title-actions-menu.inc >@@ -17,6 +17,10 @@ > [% END # / UNLESS items.norequests %] > [% END # / RequestOnOpac %] > >+ [% IF Koha.Preference('UseRecalls') %] >+ <span class="actions"><a class="btn btn-link recall" href="/cgi-bin/koha/opac-recall.pl?biblionumber=[% items.biblionumber | html %]"><i class="fa fa-fw fa-bookmark-o" aria-hidden="true"></i> Place recall</a></span> >+ [% END %] >+ > [% IF ( Koha.Preference( 'opacuserlogin' ) == 1 ) %] > [% IF items.artreqpossible %] > <span class="actions"><a href="/cgi-bin/koha/opac-request-article.pl?biblionumber=[% items.biblionumber | uri %]" class="btn btn-link btn-sm"><i class="fa fa-file-text" aria-hidden="true"></i> Request article</a></span> >diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/includes/usermenu.inc b/koha-tmpl/opac-tmpl/bootstrap/en/includes/usermenu.inc >index b426065ed6..65b788cd5e 100644 >--- a/koha-tmpl/opac-tmpl/bootstrap/en/includes/usermenu.inc >+++ b/koha-tmpl/opac-tmpl/bootstrap/en/includes/usermenu.inc >@@ -139,6 +139,15 @@ > <a href="/cgi-bin/koha/opac-illrequests.pl">your interlibrary loan requests</a></li> > [% END %] > >+ [% IF Koha.Preference('UseRecalls') %] >+ [% IF ( recallsview ) %] >+ <li class="active"> >+ [% ELSE %] >+ <li> >+ [% END %] >+ <a href="/cgi-bin/koha/opac-recalls.pl">your recalls history</a> >+ [% END %] >+ > </ul> > </div> > [% END %] >diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-course-details.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-course-details.tt >index d90c1fa2e8..53314a2566 100644 >--- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-course-details.tt >+++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-course-details.tt >@@ -85,7 +85,7 @@ > <td>[% AuthorisedValues.GetDescriptionByKohaField( kohafield => 'items.ccode', authorised_value => cr.item.ccode, opac => 1 ) | html %]</td> > <td>[% cr.item.itemcallnumber | html %]</td> > <td>[% cr.item.copynumber | html %]</td> >- <td>[% INCLUDE 'item-status.inc' item=cr.item issue=cr.issue %]</td> >+ <td>[% INCLUDE 'item-status.inc' item=cr.course_item issue=cr.issue %]</td> > <td><span title="[% cr.issue.date_due | html %]">[% cr.issue.date_due | $KohaDates as_due_date => 1 %]</span></td> > <td>[% IF ( cr.public_note ) %] > [% cr.public_note | $raw %] >diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-recall.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-recall.tt >new file mode 100644 >index 0000000000..63c4a0f240 >--- /dev/null >+++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-recall.tt >@@ -0,0 +1,199 @@ >+[% USE Koha %] >+[% USE KohaDates %] >+[% USE Branches %] >+[% USE ItemTypes %] >+[% USE AuthorisedValues %] >+[% SET footerjs = 1 %] >+[% INCLUDE 'doc-head-open.inc' %] >+<title>[% IF ( LibraryNameTitle ) %][% LibraryNameTitle | html %][% ELSE %]Koha online[% END %] catalog › Recall</title> >+[% INCLUDE 'doc-head-close.inc' %] >+[% BLOCK cssinclude %][% END %] >+</head> >+<body id="opac-recall" class="scrollto"> >+[% INCLUDE 'masthead.inc' %] >+ >+<div class="main"> >+ <ul class="breadcrumb"> >+ <li><a href="/cgi-bin/koha/opac-main.pl">Home</a> <span class="divider">›</span></li> >+ <li><a href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% biblio.biblionumber | uri %]">Details for: [% biblio.title | html %]</a> <span class="divider">›</span></li> >+ <li><a href="/cgi-bin/koha/opac-recall.pl?biblionumber=[% biblio.biblionumber | uri %]">Place recall</a></li> >+ </ul> >+ >+ <div class="container-fluid"> >+ <div class="row-fluid"> >+ <div class="span2"> >+ <div id="navigation"> >+ [% INCLUDE 'navigation.inc' IsPatronPage=1 %] >+ </div> >+ </div> >+ <div class="span10"> >+ <div id="recall" class="maincontent"> >+ <h1>Confirm recalls for: [% INCLUDE 'patron-title.inc' patron = logged_in_user %] ([% logged_in_user.cardnumber | html %])</h1> >+ [% IF nosyspref %] >+ Recalls have not been enabled. Please contact your library. >+ [% ELSIF error == 'unavailable' %] >+ There are no items available for recall. >+ <a href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% biblio.biblionumber | uri %]">Return to [% biblio.title | html %]</a> >+ [% ELSE %] >+ [% IF error %] >+ <div class="dialog alert"> >+ [% IF error == 'duplicate' %] >+ You have reached the maximum number of recalls on this record. >+ [% ELSIF error == 'unavailable' %] >+ There are no items available for recall. >+ [% ELSIF error == 'cannot' %] >+ You cannot place a recall on this item. >+ [% ELSE %] >+ An error has occurred while attempting to place a recall. Please contact your library. >+ [% END %] >+ </div> >+ [% END %] >+ >+ [% IF success %] >+ <p>Your recall has been placed. The patron the item is currently checked out to has been asked to return the item within [% due_interval | html %] days, by [% due_date | $KohaDates %].</p> >+ <p>You will be notified when your item is waiting to be picked up at the library.</p> >+ [% ELSIF not error %] >+ <p>All borrowable material is subject to recall if checked out and needed by someone else. We will ask the person who has checked out this item to return it so you may use it.</p> >+ [% IF logged_in_user %] >+ <div class="dialog"> >+ >+ <form id="recallform" action="/cgi-bin/koha/opac-recall.pl" method="get"> >+ <fieldset class="rows" id="options"> >+ <legend>Place a recall on <b>[% biblio.title | html %]</b> ([% biblio.author | html %])?</legend> >+ <ul> >+ >+ [% UNLESS ( single_branch_mode ) %]<li> >+ <label for="pickup">Pick up location:</label> >+ <select name="pickup" id="pickup"> >+ [% FOREACH branch IN branches %] >+ [% IF branch.branchcode == logged_in_user.branchcode %] >+ <option value="[% branch.branchcode | html %]" selected>[% Branches.GetName( branch.branchcode ) | html %]</option> >+ [% ELSE %] >+ <option value="[% branch.branchcode | html %]">[% Branches.GetName( branch.branchcode ) | html %]</option> >+ [% END %] >+ [% END %] >+ </select> >+ </li>[% END %] >+ >+ <li><label for="expirationdate">Recall not needed after:</label> <input type="text" name="expirationdate" id="expirationdate" size="20"> <a id="cleartext" style="display:none;">Clear text</a><span id="expiration-hint">[% INCLUDE 'date-format.inc' %]</span></li> >+ <li class="level-option" style="display:none;"><label for="bibliolevel">Recall next available item</label> <input type="radio" name="type" id="bibliolevel" value="bibliolevel" checked></li> >+ <li class="level-option" style="display:none;"><label for="itemlevel">Recall a specific item</label> <input type="radio" name="type" id="itemlevel" value="itemlevel"></li> >+ >+ <table class="table table-bordered table-striped" id="items"> >+ <caption>Select a specific item:</caption> >+ <tr> >+ <th> </th> >+ <th>Item type</th> >+ <th>Barcode</th> >+ [% UNLESS ( single_branch_mode ) %] >+ <th>Home library</th> >+ <th>Last location</th> >+ [% END %] >+ <th>Collection</th> >+ <th>Call number</th> >+ <th>Copy number</th> >+ <th>Vol info</th> >+ <th>Information</th> >+ </tr> >+ [% FOREACH item IN items %]<tr> >+ <td> >+ [% IF item.can_be_recalled( patron => logged_in_user ) %] >+ <input type="radio" class="itemnumber" name="itemnumber" value="[% item.itemnumber | html %]"> >+ [% ELSE %] >+ <input disabled="disabled" type="radio" class="itemnumber" name="itemnumber" value="[% item.itemnumber | html %]" style="display:none;" /> >+ <img src="[% interface | html %]/lib/famfamfam/cross.png" alt="Cannot be recalled" title="Cannot be recalled" /> >+ [% END %] >+ </td> >+ <td>[% ItemTypes.GetDescription( item.effective_itemtype ) | html %]</td> >+ <td>[% item.barcode | html %]</td> >+ [% UNLESS ( single_branch_mode ) %] >+ <td>[% Branches.GetName( item.homebranch ) | html %]</td> >+ <td>[% Branches.GetName( item.holdingbranch) | html %]</td> >+ [% END %] >+ <td>[% AuthorisedValues.GetByCode( 'CCODE', item.ccode, 1 ) | html %]</td> >+ <td>[% item.itemcallnumber | html %]</td> >+ <td>[% item.copynumber | html %]</td> >+ <td>[% item.enumchron | html %]</td> >+ <td> >+ [% IF ( item.checkout ) %] >+ <span class="checkedout">Due [% item.checkout.date_due | $KohaDates %]</span> >+ [% ELSIF ( item.get_transfer ) %] >+ <span class="intransit">In transit from [% Branches.GetName( item.get_transfer.frombranch ) | html %] to [% Branches.GetName( item.get_transfer.tobranch ) | html %] since [% item.get_transfer.datesent | $KohaDates %]</span> >+ [% END %] >+ [% IF ( item.itemlost || item.withdrawn ) %] >+ <span class="lost">Unavailable (lost or missing)</span> >+ [% END %] >+ [% IF ( item.notforloan ) %] >+ <span class="notforloan">Not for loan ([% item.notforloan | html %])</span> >+ [% END %] >+ [% hold = item.current_holds.next %] >+ [% IF ( item.recall ) %] >+ <span class="waiting"> >+ [% IF ( item.recall.waitingdate ) %] >+ Waiting for patron at [% Branches.GetName( item.recall.branchcode ) | html %] since [% item.recall.waitingdate | $KohaDates %]. >+ [% ELSE %] >+ Recalled by patron expected at [% Branches.GetName( item.recall.branchcode ) | html %] since [% item.recall.recalldate | $KohaDates %]. >+ [% END %] >+ </span> >+ [% ELSIF ( hold.waitingdate ) %] >+ <span class="waiting"> >+ Waiting for patron at [% Branches.GetName( hold.branchcode ) | html %] since [% hold.waitingdate | $KohaDates %]. >+ </span> >+ [% ELSIF ( hold.borrowernumber == logged_in_user.borrowernumber ) %] >+ <span class="waiting"> >+ You have already placed a <a href="/cgi-bin/koha/opac-user.pl#opac-user-holds">reserve</a> on this item. >+ </span> >+ [% END # / IF ( item.recall or hold ) %] >+ </td> >+ </tr>[% END %] >+ </table> >+ </fieldset> >+ <fieldset class="action"> >+ <input type="hidden" name="op" value="request"> >+ <input type="hidden" name="biblionumber" value="[% biblio.biblionumber | html %]"> >+ <input type="submit" class="btn" value="Confirm"> >+ <a href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% biblio.biblionumber | uri %]" class="cancel">Cancel</a> >+ </fieldset> >+ </form> >+ >+ </div> >+ [% ELSE %] >+ <div class="dialog alert">You must be logged in to place a recall.</div> >+ [% END %] >+ [% END %] >+ [% END %] <!-- norecalls --> >+ </div> <!-- / #recall --> >+ </div> <!-- / .span10 --> >+ </div> <!-- / .row-fluid --> >+ </div> <!-- / .container-fluid --> >+</div> <!-- / .main --> >+ >+[% INCLUDE 'opac-bottom.inc' %] >+[% BLOCK jsinclude %] >+[% INCLUDE 'calendar.inc' %] >+<script> >+ $(document).ready(function(){ >+ $(".level-option").show(); >+ $("#cleartext").show(); >+ $("#items").hide(); >+ $("#expiration-hint").hide(); >+ $("#cleartext").click(function(){ >+ $(this).siblings("input").val(""); >+ }); >+ $("#itemlevel").click(function(){ >+ if ( $("#itemlevel").is(':checked') ){ >+ $("#items").show(); >+ $("input:radio[name='itemnumber']:not(:disabled)").first().attr("checked", "checked"); // selects first item in table >+ } >+ }); >+ $("#bibliolevel").click(function(){ >+ if ( $("#bibliolevel").is(':checked') ){ >+ $("#items").hide(); >+ } >+ }); >+ $("#expirationdate").datepicker({ >+ minDate: 0, >+ }); >+ }); >+</script> >+[% END %] >diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-recalls.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-recalls.tt >new file mode 100644 >index 0000000000..b434185fe9 >--- /dev/null >+++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-recalls.tt >@@ -0,0 +1,151 @@ >+[% USE Koha %] >+[% USE KohaDates %] >+[% INCLUDE 'doc-head-open.inc' %] >+<title>[% IF ( LibraryNameTitle ) %][% LibraryNameTitle | html %][% ELSE %]Koha online[% END %] catalog › Your recalls history</title> >+[% INCLUDE 'doc-head-close.inc' %] >+[% BLOCK cssinclude %][% END %] >+</head> >+[% INCLUDE 'bodytag.inc' bodyid='opac-recalls' bodyclass='scrollto' %] >+[% INCLUDE 'masthead.inc' %] >+<div class="main"> >+ <ul class="breadcrumb"> >+ <li><a href="/cgi-bin/koha/opac-main.pl">Home</a> <span class="divider">›</span></li> >+ <li><a href="#">Your recalls history</a></li> >+ </ul> >+ <div class="container-fluid"> >+ <div class="row-fluid"> >+ <div class="span2"> >+ <div id="navigation"> >+ [% INCLUDE 'navigation.inc' IsPatronPage=1 %] >+ </div> >+ </div> >+ <div class="span10"> >+ <div id="recalls" class="maincontent"> >+ <h2>Recalls history</h2> >+ [% IF Koha.Preference('UseRecalls') %] >+ [% IF RECALLS.count %] >+ <div id="opac-user-recalls"> >+ <table id="recalls-table" class="table table-bordered table-striped"> >+ <thead> >+ <tr> >+ <th class="anti-the">Title</th> >+ <th class="psort title-string">Placed on</th> >+ <th class="title-string">Expires on</th> >+ <th>Pickup location</th> >+ <th>Status</th> >+ <th>Due date</th> >+ <th class="nosort"> </th> >+ </tr> >+ </thead> >+ <tbody> >+ [% FOREACH RECALL IN RECALLS %] >+ <tr> >+ <td class="title"> >+ <a class="title" href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% RECALL.biblionumber | html %]"> >+ [% RECALL.biblio.title | html %] >+ [% FOREACH s IN RECALL.biblio.subtitle %] >+ [% s | html %] >+ [% END %] >+ </a> >+ [% RECALL.biblio.author | html %] >+ </td> >+ <td class="recalldate"> >+ <span title="[% RECALL.recalldate | html %]"> >+ <span class="tdlabel">Recall date:</span> >+ [% RECALL.recalldate | $KohaDates %] >+ </span> >+ </td> >+ <td class="expirationdate"> >+ [% IF ( RECALL.expirationdate ) %] >+ <span title="[% RECALL.expirationdate | html %]"> >+ <span class="tdlabel">Expiration:</span> >+ [% RECALL.expirationdate | $KohaDates %] >+ </span> >+ [% ELSIF ( !RECALL.old ) %] >+ <span title="0000-00-00"> >+ <span class="tdlabel">Expiration:</span> >+ Never expires >+ </span> >+ [% ELSE %] >+ <span title="0000-00-00">-</span> >+ [% END %] >+ </td> >+ <td class="branch"> >+ <span class="tdlabel">Pick up location:</span> >+ [% RECALL.library.branchname | html %] >+ </td> >+ <td class="status"> >+ <span class="tdlabel">Status:</span> >+ [% IF ( RECALL.in_transit ) %] >+ In transit to [% RECALL.library.branchname | html %] >+ [% ELSIF ( RECALL.waiting ) %] >+ Ready for pickup >+ [% ELSIF ( RECALL.overdue ) %] >+ Overdue to be returned >+ [% ELSIF ( RECALL.expired ) %] >+ Expired on [% RECALL.expirationdate | $KohaDates %] >+ [% ELSIF ( RECALL.cancelled ) %] >+ Cancelled on [% RECALL.cancellationdate | $KohaDates %] >+ [% ELSIF ( RECALL.finished ) %] >+ Fulfilled >+ [% ELSE %] >+ Requested >+ [% END %] >+ </td> >+ <td class="due_date"> >+ <span class="tdlabel">Due date</span> >+ [% IF ( RECALL.requested ) %] >+ Due to be returned by [% RECALL.checkout.date_due | $KohaDates %] >+ [% ELSIF ( RECALL.waiting and RECALL.expirationdate ) %] >+ Pick up by [% RECALL.expirationdate | $KohaDates %] >+ [% ELSE %] >+ - >+ [% END %] >+ </td> >+ >+ <td class="cancelrecall"> >+ [% IF ( RECALL.requested or RECALL.overdue ) %] >+ <form action="/cgi-bin/koha/opac-recall.pl" method="post"> >+ <input type="hidden" name="op" value="cancel"> >+ <input type="hidden" name="recall_id" value="[% RECALL.recall_id | html %]"> >+ <input type="hidden" name="biblionumber" value="[% RECALL.biblionumber | html %]"> >+ <input type="submit" name="submit" class="btn btn-danger cancel_recall" value="Cancel"> >+ </form> >+ [% END %] >+ </td> >+ [% END %] >+ </tr> >+ </tbody> >+ <table> >+ </div> >+ [% ELSE %] >+ No recalls have been made. >+ [% END # / # RECALLS.count %] >+ [% ELSE %] >+ Recalls have not been enabled. Please contact your library. >+ [% END %] >+ </div> <!-- /#recalls --> >+ </div> <!-- /.span10 --> >+ </div> <!-- /.row-fluid --> >+ </div> <!-- /.container-fluid --> >+</div> <!-- /#main --> >+ >+[% INCLUDE 'opac-bottom.inc' %] >+[% BLOCK jsinclude %] >+ [% INCLUDE 'datatables.inc' %] >+ <script type="text/JavaScript"> >+ //<![CDATA[ >+ $(document).ready(function(){ >+ $(".cancel_recall").click(function(){ >+ return confirmDelete(_("Are you sure you want to remove this recall?")); >+ }); >+ $("#recalls-table").dataTable($.extend(true, {}, dataTablesDefaults, { >+ "aoColumnDefs": [ >+ { "aTargets": [ "nosort" ],"bSortable": false,"bSearchable": false }, >+ { "sType": "anti-the", "aTargets" : [ "anti-the" ] }, >+ { "sType": "title-string", "aTargets" : [ "title-string" ] } >+ ] >+ })); >+ }); >+ </script> >+[% END %] >diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-reserve.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-reserve.tt >index ec4aaf5b03..6aa3382aa7 100644 >--- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-reserve.tt >+++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-reserve.tt >@@ -199,6 +199,8 @@ > [% END %] > [% IF ( bibitemloo.already_reserved ) %] > <div class="alert alert-warning">You have already requested this title.</div> >+ [% ELSIF ( bibitemloo.recall ) %] >+ <div class="alert alert-warning">You have already placed a recall on this title.</div> > [% ELSE %] > [% IF ( bibitemloo.already_patron_possession ) %] > <div class="alert alert-warning">This title cannot be requested because it's already in your possession.</div> >diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-results.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-results.tt >index ad91bbbba6..585dbd3a8b 100644 >--- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-results.tt >+++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-results.tt >@@ -533,6 +533,7 @@ > [% UNLESS ( SEARCH_RESULT.hidelostitems ) %][% IF ( SEARCH_RESULT.itemlostcount ) %] Lost ([% SEARCH_RESULT.itemlostcount | html %]),[% END %][% END %] > [% IF ( SEARCH_RESULT.damagedcount ) %] Damaged ([% SEARCH_RESULT.damagedcount | html %]),[% END %] > [% IF ( SEARCH_RESULT.orderedcount ) %] On order ([% SEARCH_RESULT.orderedcount | html %]),[% END %] >+ [% IF ( SEARCH_RESULT.recalledcount ) %] Recalled ([% SEARCH_RESULT.recalledcount | html %]),[% END %] > [% IF ( SEARCH_RESULT.onholdcount ) %] On hold ([% SEARCH_RESULT.onholdcount | html %]),[% END %] > [% IF ( SEARCH_RESULT.intransitcount ) %] In transit ([% SEARCH_RESULT.intransitcount | html %]),[% END %] > </span> >diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-user.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-user.tt >index 5d4206a0c6..1e105b0ffc 100644 >--- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-user.tt >+++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-user.tt >@@ -214,6 +214,7 @@ > [% END %] > > [% IF ( RESERVES.count ) %]<li><a href="#opac-user-holds">Holds ([% RESERVES.count | html %])</a></li>[% END %] >+ [% IF Koha.Preference('UseRecalls') && RECALLS.count %]<li><a href="#opac-user-recalls">Recalls ([% RECALLS.count | html %])</a></li>[% END %] > [% IF Koha.Preference('ArticleRequests') && logged_in_user.article_requests_current %]<li><a href="#opac-user-article-requests">Article requests ([% logged_in_user.article_requests_current.count | html %])</a></li>[% END %] > [% IF ( OverDriveCirculation ) %] > <li><a href="#opac-user-overdrive">OverDrive Account</a></li> >@@ -315,6 +316,8 @@ > [% IF ( Koha.Preference('OpacStarRatings') == 'all' ) %] > [% INCLUDE 'user-star-ratings.inc' item=ISSUE %] > [% END %] >+ >+ [% IF ( ISSUE.recall ) %]<br><i>This item has been recalled. Please return by the new due date.</i>[% END %] > </td> > > <td class="author">[% ISSUE.author | html %]</td> >@@ -707,6 +710,84 @@ > > [% PROCESS 'holds-table.inc' HOLDS = RESERVES, SuspendHoldsOpac = SuspendHoldsOpac, showpriority = showpriority, AutoResumeSuspendedHolds = AutoResumeSuspendedHolds %] > >+ [% IF Koha.Preference('UseRecalls') && RECALLS.count %] >+ <div id="opac-user-recalls"> >+ <table id="recalls-table" class="table table-bordered table-striped"> >+ <caption>Recalls <span class="count">([% RECALLS.count | html %])</span></caption> >+ <thead> >+ <tr> >+ <th class="anti-the">Title</th> >+ <th class="psort title-string">Placed on</th> >+ <th class="title-string">Expires on</th> >+ <th>Pickup location</th> >+ <th>Status</th> >+ <th class="nosort"> </th> >+ </tr> >+ </thead> >+ <tbody> >+ [% FOREACH RECALL IN RECALLS %] >+ <tr> >+ <td class="title"> >+ <a class="title" href="/cgi-bin/koha/opac-detail.pl?biblionumber=[% RECALL.biblionumber | html %]"> >+ [% RECALL.biblio.title | html %] >+ [% FOREACH s IN RECALL.biblio.subtitle %] >+ [% s | html %] >+ [% END %] >+ </a> >+ [% RECALL.biblio.author | html %] >+ </td> >+ <td class="recalldate"> >+ <span title="[% RECALL.recalldate | html %]"> >+ <span class="tdlabel">Recall date:</span> >+ [% RECALL.recalldate | $KohaDates %] >+ </span> >+ </td> >+ <td class="expirationdate"> >+ [% IF ( RECALL.expirationdate ) %] >+ <span title="[% RECALL.expirationdate | html %]"> >+ <span class="tdlabel">Expiration:</span> >+ [% RECALL.expirationdate | $KohaDates %] >+ </span> >+ [% ELSE %] >+ <span title="0000-00-00"> >+ <span class="tdlabel">Expiration:</span> >+ Never expires >+ </span> >+ [% END %] >+ </td> >+ <td class="branch"> >+ <span class="tdlabel">Pick up location:</span> >+ [% RECALL.library.branchname | html %] >+ </td> >+ <td class="status"> >+ <span class="tdlabel">Status:</span> >+ [% IF ( RECALL.requested ) %] >+ Requested >+ [% ELSIF ( RECALL.overdue ) %] >+ Overdue to be returned >+ [% ELSIF ( RECALL.in_transit ) %] >+ In transit to [% RECALL.library.branchname | html %] >+ [% ELSIF ( RECALL.waiting ) %] >+ Ready for pickup >+ [% END %] >+ </td> >+ <td class="cancelrecall"> >+ [% IF ( RECALL.requested or RECALL.overdue ) %] >+ <form action="/cgi-bin/koha/opac-recall.pl" method="post"> >+ <input type="hidden" name="op" value="cancel"> >+ <input type="hidden" name="recall_id" value="[% RECALL.recall_id | html %]"> >+ <input type="hidden" name="biblionumber" value="[% RECALL.biblionumber | html %]"> >+ <button type="submit" name="submit" class="btn btn-sm btn-danger" id="cancel_recall"><i class="icon-remove icon-white"></i> Cancel</button> >+ </form> >+ [% END %] >+ </td> >+ [% END %] >+ </tr> >+ </tbody> >+ </table> >+ </div> >+ [% END # / # RECALLS.count %] >+ > [% IF Koha.Preference('ArticleRequests') %] > <div id="opac-user-article-requests"> > [% IF logged_in_user.article_requests_current.count %] >@@ -1044,6 +1125,10 @@ > $('#opac-user-clubs').load('/cgi-bin/koha/clubs/clubs-tab.pl?borrowernumber=[% borrowernumber | html %]'); > }); > } >+ >+ $("#cancel_recall").click(function(e){ >+ return confirmDelete(_("Are you sure you want to remove this recall?")); >+ }); > }); > > var borrowernumber = "[% borrowernumber | html %]"; >diff --git a/opac/opac-course-details.pl b/opac/opac-course-details.pl >index c7fe920b5a..7027b24173 100755 >--- a/opac/opac-course-details.pl >+++ b/opac/opac-course-details.pl >@@ -46,6 +46,13 @@ die("No course_id given") unless ($course_id); > my $course = GetCourse($course_id); > my $course_reserves = GetCourseReserves( course_id => $course_id, include_items => 1, include_count => 1 ); > >+foreach my $cr ( @$course_reserves ) { >+ if ( $cr->{issue}->{date_due} and $cr->{issue}->{borrowernumber} and $borrowernumber != $cr->{issue}->{borrowernumber} and C4::Context->preference('UseRecalls') ) { >+ $cr->{course_item}->{avail_for_recall} = 1; >+ $cr->{course_item}->{biblionumber} = Koha::Items->find( $cr->{itemnumber} )->biblionumber; >+ } >+} >+ > $template->param( > course => $course, > course_reserves => $course_reserves, >diff --git a/opac/opac-detail.pl b/opac/opac-detail.pl >index e4e4a8341d..7e19bda8dd 100755 >--- a/opac/opac-detail.pl >+++ b/opac/opac-detail.pl >@@ -747,16 +747,17 @@ if ( not $viewallitems and @items > $max_items_to_display ) { > } > > my $reserve_status = C4::Reserves::GetReserveStatus($itm->{itemnumber}); >- if( $reserve_status eq "Waiting"){ $itm->{'waiting'} = 1; } >+ my $recall_status = Koha::Recalls->search({ itemnumber => $itm->{itemnumber}, status => 'W', old => undef }); >+ if( $reserve_status eq "Waiting" or $recall_status->count ){ $itm->{'waiting'} = 1; } > if( $reserve_status eq "Reserved"){ $itm->{'onhold'} = 1; } >- >+ > my ( $transfertwhen, $transfertfrom, $transfertto ) = GetTransfers($itm->{itemnumber}); > if ( defined( $transfertwhen ) && $transfertwhen ne '' ) { > $itm->{transfertwhen} = $transfertwhen; > $itm->{transfertfrom} = $transfertfrom; > $itm->{transfertto} = $transfertto; > } >- >+ > if ( C4::Context->preference('OPACAcquisitionDetails') ) { > $itm->{on_order} = 1 > if grep { $_ eq $itm->{itemnumber} } @itemnumbers_on_order; >diff --git a/opac/opac-recall.pl b/opac/opac-recall.pl >new file mode 100755 >index 0000000000..bca72115c2 >--- /dev/null >+++ b/opac/opac-recall.pl >@@ -0,0 +1,141 @@ >+#!/usr/bin/perl >+ >+# This file is part of Koha. >+# >+# Copyright 2020 Aleisha Amohia <aleisha@catalyst.net.nz> >+# >+# Koha is free software; you can redistribute it and/or modify it >+# under the terms of the GNU General Public License as published by >+# the Free Software Foundation; either version 3 of the License, or >+# (at your option) any later version. >+# >+# Koha is distributed in the hope that it will be useful, but >+# WITHOUT ANY WARRANTY; without even the implied warranty of >+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >+# GNU General Public License for more details. >+# >+# You should have received a copy of the GNU General Public License >+# along with Koha; if not, see <http://www.gnu.org/licenses>. >+ >+use Modern::Perl; >+use CGI qw ( -utf8 ); >+use C4::Auth; >+use C4::Output; >+use C4::Context; >+ >+my $query = new CGI; >+my ( $template, $borrowernumber, $cookie ) = get_template_and_user( >+ { >+ template_name => "opac-recall.tt", >+ query => $query, >+ type => "opac", >+ authnotrequired => 0, >+ } >+); >+ >+my $op = $query->param('op') || ''; >+my $biblionumber = $query->param('biblionumber'); >+my $biblio = Koha::Biblios->find( $biblionumber ); >+ >+if ( C4::Context->preference('UseRecalls') ) { >+ >+ my $patron = Koha::Patrons->find( $borrowernumber ); >+ my $error; >+ >+ unless ( $biblio->can_be_recalled({ patron => $patron }) ) { $error = 'unavailable'; } >+ >+ my $items = Koha::Items->search({ biblionumber => $biblionumber }); >+ >+ # check if already recalled >+ my $recalled = scalar $biblio->recalls; >+ if ( defined $recalled and $recalled > 0 ) { >+ my $recalls_per_record = Koha::CirculationRules->get_effective_rule({ >+ categorycode => $patron->categorycode, >+ branchcode => undef, >+ itemtype => undef, >+ rule_name => 'recalls_per_record' >+ }); >+ if ( defined $recalls_per_record and $recalls_per_record->rule_value and $recalled >= $recalls_per_record->rule_value ){ >+ $error = 'duplicate'; >+ } >+ } >+ >+ # submitting recall request >+ if ($op eq 'request'){ >+ >+ if ( defined $error and $error eq 'unavailable' ){ >+ # no items available for recall >+ print $query->redirect("/cgi-bin/koha/opac-recall.pl?biblionumber=$biblionumber&error=unavailable"); >+ >+ } elsif ( !defined $error ){ >+ # can recall >+ >+ my $level = $query->param('type'); >+ my $pickuploc = $query->param('pickup'); >+ my $expdate = $query->param('expirationdate'); >+ my $itemnumber = $query->param('itemnumber'); >+ >+ my ( $recall, $due_interval, $due_date ); >+ if ( $level eq 'itemlevel' and defined $itemnumber ) { >+ my $item = Koha::Items->find( $itemnumber ); >+ if ( $item->can_be_recalled({ patron => $patron }) ) { >+ ( $recall, $due_interval, $due_date ) = Koha::Recalls->add_recall({ >+ patron => $patron, >+ biblio => $biblio, >+ branchcode => $pickuploc, >+ item => $item, >+ expirationdate => $expdate, >+ interface => 'OPAC', >+ }); >+ } else { >+ $error = 'cannot'; >+ } >+ } else { >+ if ( $biblio->can_be_recalled({ patron => $patron }) ) { >+ ( $recall, $due_interval, $due_date ) = Koha::Recalls->add_recall({ >+ patron => $patron, >+ biblio => $biblio, >+ branchcode => $pickuploc, >+ expirationdate => $expdate, >+ interface => 'OPAC', >+ }); >+ } else { >+ $error = 'cannot'; >+ } >+ } >+ if ( defined $recall ) { >+ $template->param( >+ success => 1, >+ due_interval => $due_interval, >+ due_date => $due_date, >+ ); >+ } else { >+ $error = 'failed'; >+ } >+ } >+ } elsif ($op eq 'cancel'){ >+ my $recall_id = $query->param('recall_id'); >+ Koha::Recalls->find( $recall_id )->set_cancelled; >+ print $query->redirect('/cgi-bin/koha/opac-user.pl'); >+ } >+ >+ my $branches = Koha::Libraries->search(); >+ my $single_branch_mode = $branches->count == 1; >+ >+ $template->param( >+ biblio => $biblio, >+ error => $error, >+ items => $items, >+ single_branch_mode => $single_branch_mode, >+ branches => $branches, >+ ); >+ >+} else { >+ # UseRecalls disabled >+ $template->param( >+ nosyspref => 1, >+ biblio => $biblio, >+ ); >+} >+ >+output_with_http_headers $query, $cookie, $template->output, 'html'; >diff --git a/opac/opac-recalls.pl b/opac/opac-recalls.pl >new file mode 100755 >index 0000000000..a54469ef37 >--- /dev/null >+++ b/opac/opac-recalls.pl >@@ -0,0 +1,42 @@ >+#!/usr/bin/perl >+ >+# Copyright 2020 Aleisha Amohia <aleisha@catalyst.net.nz> >+# >+# This file is part of Koha. >+# Koha is free software; you can redistribute it and/or modify it >+# under the terms of the GNU General Public License as published by >+# the Free Software Foundation; either version 3 of the License, or >+# (at your option) any later version. >+ >+# Koha is distributed in the hope that it will be useful, but >+# WITHOUT ANY WARRANTY; without even the implied warranty of >+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >+# GNU General Public License for more details. >+ >+# You should have received a copy of the GNU General Public License >+# along with Koha; if not, see <http://www.gnu.org/licenses>. >+ >+use Modern::Perl; >+use CGI qw ( -utf8 ); >+use Encode qw( encode ); >+use C4::Auth; # get_template_and_user >+use C4::Output; >+use Koha::Recalls; >+ >+my $input = new CGI; >+my ( $template, $borrowernumber, $cookie ) = get_template_and_user( >+ { >+ template_name => "opac-recalls.tt", >+ query => $input, >+ type => "opac", >+ authnotrequired => 0, >+ } >+); >+ >+my $recalls = Koha::Recalls->search({ borrowernumber => $borrowernumber }, { order_by => { -desc => 'recalldate' } }); >+$template->param( >+ RECALLS => $recalls, >+ recallsview => 1 >+); >+ >+output_html_with_http_headers $input, $cookie, $template->output; >diff --git a/opac/opac-reserve.pl b/opac/opac-reserve.pl >index 9b7680759d..0efe0ac8d7 100755 >--- a/opac/opac-reserve.pl >+++ b/opac/opac-reserve.pl >@@ -626,6 +626,10 @@ foreach my $biblioNum (@biblionumbers) { > $biblioLoopIter{holdable} &&= $status eq 'OK'; > $biblioLoopIter{already_patron_possession} = $status eq 'alreadypossession'; > >+ if ( CanBookBeReserved( $borrowernumber, $biblioNum )->{status} eq 'recall' ){ >+ $biblioLoopIter{recall} = 1; >+ } >+ > # For multiple holds per record, if a patron has previously placed a hold, > # the patron can only place more holds of the same type. That is, if the > # patron placed a record level hold, all the holds the patron places must >diff --git a/opac/opac-user.pl b/opac/opac-user.pl >index 7a9c774d67..a34d2b0f6b 100755 >--- a/opac/opac-user.pl >+++ b/opac/opac-user.pl >@@ -306,6 +306,14 @@ if ( $pending_checkouts->count ) { # Useless test > $issue->{biblionumber} ? $my_summary_html =~ s/{BIBLIONUMBER}/$issue->{biblionumber}/g : $my_summary_html =~ s/{BIBLIONUMBER}//g; > $issue->{MySummaryHTML} = $my_summary_html; > } >+ >+ my @maybe_recalls = Koha::Recalls->search({ biblionumber => $issue->{biblionumber}, itemnumber => [ undef, $issue->{itemnumber} ], old => undef }); >+ foreach my $recall ( @maybe_recalls ) { >+ if ( $recall->checkout and $recall->checkout->issue_id == $issue->{issue_id} ) { >+ $issue->{recall} = 1; >+ last; >+ } >+ } > } > } > my $overduesblockrenewing = C4::Context->preference('OverduesBlockRenewing'); >@@ -327,10 +335,12 @@ $template->param( show_barcode => 1 ) if $show_barcode; > > # now the reserved items.... > my $reserves = Koha::Holds->search( { borrowernumber => $borrowernumber } ); >+my $recalls = Koha::Recalls->search({ borrowernumber => $borrowernumber, old => undef }); > > $template->param( > RESERVES => $reserves, > showpriority => $show_priority, >+ RECALLS => $recalls, > ); > > if (C4::Context->preference('BakerTaylorEnabled')) { >-- >2.11.0
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 19532
:
68569
|
68570
|
68571
|
68572
|
68642
|
68643
|
68644
|
68645
|
68653
|
69100
|
69102
|
69147
|
69148
|
69149
|
69170
|
69172
|
69221
|
69222
|
69223
|
69322
|
69353
|
69354
|
69405
|
69409
|
69410
|
69411
|
69841
|
69872
|
69873
|
69874
|
69875
|
69876
|
69877
|
69878
|
69879
|
69880
|
69881
|
69882
|
69883
|
69884
|
69885
|
69886
|
69887
|
69888
|
69889
|
69890
|
69986
|
70093
|
71409
|
71574
|
71575
|
71576
|
71577
|
71578
|
71579
|
71580
|
71581
|
71582
|
71583
|
71584
|
71585
|
71586
|
71587
|
71588
|
71589
|
71590
|
71591
|
71592
|
72244
|
72311
|
72312
|
72313
|
72314
|
72315
|
72316
|
72317
|
72318
|
72319
|
72320
|
72321
|
72322
|
72323
|
72324
|
72325
|
72326
|
72327
|
72328
|
72329
|
72330
|
72331
|
72332
|
72333
|
72334
|
72335
|
72336
|
72337
|
72338
|
72527
|
76817
|
76818
|
76819
|
76820
|
76821
|
76822
|
76823
|
76824
|
76825
|
76826
|
76827
|
76828
|
76829
|
76830
|
76831
|
76832
|
76833
|
76834
|
76835
|
76836
|
76837
|
76838
|
76839
|
76840
|
76841
|
76842
|
76843
|
76844
|
76845
|
76846
|
76847
|
77177
|
77178
|
77179
|
78755
|
78757
|
78759
|
78761
|
78763
|
78765
|
78766
|
78768
|
78770
|
78772
|
78773
|
78774
|
78775
|
78776
|
78777
|
78778
|
78780
|
78782
|
78785
|
78787
|
78789
|
78790
|
78792
|
78794
|
78797
|
78800
|
78801
|
78802
|
78803
|
78804
|
78805
|
78806
|
78807
|
78808
|
80763
|
80764
|
80765
|
80766
|
80767
|
80768
|
80769
|
80770
|
80771
|
80772
|
80773
|
80774
|
80775
|
80776
|
80777
|
80778
|
80779
|
80780
|
80781
|
80782
|
80783
|
80784
|
80785
|
80786
|
80787
|
80788
|
80789
|
80793
|
80878
|
81204
|
81205
|
81206
|
81207
|
81208
|
81209
|
81210
|
81211
|
81212
|
81213
|
81214
|
81215
|
81216
|
81217
|
81218
|
81219
|
81220
|
81221
|
81222
|
81223
|
81224
|
81225
|
81226
|
81227
|
81228
|
81229
|
81230
|
81231
|
81232
|
81233
|
81234
|
81235
|
81236
|
81237
|
81238
|
81239
|
81240
|
81241
|
81242
|
81243
|
81244
|
81245
|
81246
|
81247
|
81547
|
81548
|
81549
|
81550
|
81551
|
81552
|
81553
|
81554
|
81555
|
81556
|
81557
|
81558
|
81559
|
81560
|
81561
|
81562
|
81563
|
81564
|
81565
|
81566
|
81567
|
81568
|
81569
|
81583
|
81584
|
81585
|
81586
|
81587
|
81588
|
81595
|
81618
|
81652
|
81653
|
81654
|
81655
|
81656
|
81657
|
81658
|
81659
|
81660
|
81661
|
81662
|
81663
|
81664
|
81665
|
81666
|
81667
|
81668
|
81669
|
81670
|
81671
|
81672
|
81673
|
81674
|
81675
|
81676
|
81677
|
81678
|
81679
|
81680
|
81681
|
81682
|
81683
|
103887
|
103888
|
103890
|
103899
|
103900
|
103901
|
103999
|
104000
|
104001
|
104002
|
104005
|
104006
|
104007
|
104066
|
104067
|
104068
|
104069
|
104070
|
104071
|
104246
|
104247
|
104248
|
104249
|
104250
|
104322
|
104323
|
104324
|
104325
|
104326
|
104327
|
104328
|
104329
|
104330
|
104331
|
104332
|
104333
|
104334
|
104335
|
104336
|
104391
|
104392
|
104393
|
104394
|
104395
|
104396
|
104397
|
104398
|
104474
|
104475
|
104476
|
104477
|
104478
|
104479
|
104480
|
104481
|
104545
|
104546
|
104547
|
104548
|
104549
|
104550
|
104551
|
104552
|
104646
|
104647
|
104648
|
104649
|
104650
|
104651
|
104652
|
104653
|
104722
|
104723
|
104724
|
104725
|
104726
|
104727
|
104728
|
104729
|
104806
|
104807
|
104808
|
104809
|
104810
|
104811
|
104812
|
104813
|
104814
|
104815
|
104816
|
104817
|
104818
|
104819
|
104820
|
104821
|
104863
|
104864
|
104865
|
104866
|
104867
|
104868
|
104869
|
104870
|
104902
|
104903
|
104904
|
104905
|
104906
|
104907
|
104908
|
104909
|
104910
|
104913
|
104914
|
104915
|
104916
|
104917
|
104918
|
104919
|
104920
|
104988
|
104989
|
104990
|
104991
|
104992
|
106268
|
106269
|
106371
|
106372
|
106373
|
106374
|
106375
|
106376
|
106377
|
106378
|
106810
|
106811
|
106812
|
106813
|
106814
|
106815
|
106816
|
106817
|
106857
|
107198
|
107199
|
107200
|
107201
|
107202
|
107203
|
107204
|
107205
|
107807
|
107808
|
107809
|
107810
|
107811
|
107812
|
107813
|
107814
|
107918
|
107919
|
107920
|
107921
|
107922
|
107923
|
107924
|
107925
|
108222
|
108223
|
108224
|
108225
|
108226
|
108227
|
108228
|
108229
|
108980
|
108981
|
108982
|
109306
|
109307
|
109308
|
109309
|
109310
|
109311
|
109312
|
109313
|
109314
|
109315
|
109316
|
109317
|
109318
|
109463
|
109464
|
109465
|
109466
|
109467
|
109468
|
109469
|
109775
|
109776
|
109777
|
109778
|
109779
|
109780
|
109781
|
109782
|
109783
|
109784
|
109785
|
111199
|
111200
|
111201
|
111202
|
111203
|
111204
|
111205
|
111206
|
112316
|
112317
|
112321
|
112322
|
112323
|
112324
|
112325
|
112326
|
112346
|
112472
|
112491
|
112540
|
112612
|
112613
|
112614
|
112615
|
112616
|
112617
|
112618
|
112619
|
112620
|
112621
|
112622
|
113195
|
113196
|
113197
|
113198
|
113199
|
113200
|
113201
|
113202
|
113203
|
113204
|
113205
|
113286
|
113287
|
113288
|
113289
|
113290
|
113291
|
113292
|
113293
|
113294
|
113295
|
113296
|
113297
|
113298
|
113335
|
113351
|
113352
|
113353
|
113354
|
113355
|
113356
|
113357
|
113358
|
113359
|
113361
|
113362
|
113363
|
113364
|
113365
|
113430
|
113431
|
113432
|
113433
|
113434
|
113435
|
113436
|
113437
|
113438
|
113439
|
113440
|
113441
|
113442
|
113443
|
113444
|
113445
|
116121
|
116122
|
116123
|
116124
|
116125
|
116126
|
116127
|
116128
|
116129
|
116130
|
116131
|
116132
|
116133
|
116134
|
118267
|
118268
|
118269
|
118270
|
118271
|
118272
|
118273
|
118274
|
118275
|
118276
|
118277
|
118278
|
118279
|
118280
|
122993
|
122994
|
122995
|
122996
|
122997
|
122998
|
122999
|
123000
|
123001
|
123002
|
123003
|
123004
|
123005
|
126244
|
126245
|
126246
|
126247
|
126248
|
126249
|
126250
|
126251
|
126252
|
126253
|
126254
|
126255
|
126256
|
126257
|
126453
|
126454
|
126455
|
126456
|
126457
|
126458
|
126459
|
126460
|
126469
|
126470
|
126565
|
126566
|
126568
|
126569
|
126570
|
126571
|
126572
|
126573
|
126574
|
126575
|
126576
|
126577
|
126578
|
126579
|
126580
|
129305
|
129306
|
129307
|
129308
|
129309
|
129310
|
129311
|
129312
|
129313
|
129314
|
129315
|
129316
|
129317
|
129318
|
129319
|
130641
|
130642
|
130643
|
130644
|
130645
|
130646
|
130647
|
130648
|
130649
|
130650
|
130651
|
130652
|
130653
|
130654
|
130655
|
130656
|
131108
|
131156
|
131157
|
131158
|
131159
|
131160
|
131193
|
131213
|
131257
|
131260
|
131261
|
131262
|
131263
|
131264
|
131265
|
131266
|
131267
|
131268
|
131269
|
131270
|
131271
|
131272
|
131273
|
131274
|
131275
|
131276
|
131277
|
131278
|
131279
|
131280
|
131281
|
131282
|
131330
|
131629
|
131630
|
131631
|
131664
|
131665
|
131666
|
131701
|
132332