From: Matthias Meusburger <matthias.meusbur...@biblibre.com> MT3747, Follow-up: Adds siblings issues
MT3747, Follow-up: Shows member relatives in issues lists - Now displays patron's and relatives' issues apart MT3747, Follow-up: Shows member relatives in issues lists - Removes renewal in circulation.pl - Adds links to moremember.pl MT3747, Follow-up: Shows member relatives in issues lists - Remove unuseful warn MT3747, Follow-up: Shows member relatives in issues lists - Removes renewal in moremember.pl MT3747, Follow-up: Shows member relatives in issues lists - Adds sorting for circulation.pl --- C4/Members.pm | 64 ++++++++- circ/circulation.pl | 40 +++++- .../prog/en/includes/checkouts-table-footer.inc | 2 +- .../prog/en/modules/circ/circulation.tmpl | 100 ++++++++++++++- .../prog/en/modules/members/moremember.tmpl | 86 +++++++++++-- members/moremember.pl | 140 ++++++++++++-------- 6 files changed, 350 insertions(+), 82 deletions(-) diff --git a/C4/Members.pm b/C4/Members.pm index ace939d..5ddadd6 100644 --- a/C4/Members.pm +++ b/C4/Members.pm @@ -45,6 +45,7 @@ BEGIN { &Search &SearchMember &GetMemberDetails + &GetMemberRelatives &GetMember &GetGuarantees @@ -580,6 +581,46 @@ sub GetMember { return; } +=head2 GetMemberRelatives + + @borrowernumbers = GetMemberRelatives($borrowernumber); + + C<GetMemberRelatives> returns a borrowersnumber's list of guarantor/guarantees of the member given in parameter + +=cut +sub GetMemberRelatives { + my $borrowernumber = shift; + my $dbh = C4::Context->dbh; + my @glist; + + # Getting guarantor + my $query = "SELECT guarantorid FROM borrowers WHERE borrowernumber=?"; + my $sth = $dbh->prepare($query); + $sth->execute($borrowernumber); + my $data = $sth->fetchrow_arrayref(); + push @glist, $data->[0] if $data->[0]; + my $guarantor = $data->[0] if $data->[0]; + + # Getting guarantees + $query = "SELECT borrowernumber FROM borrowers WHERE guarantorid=?"; + $sth = $dbh->prepare($query); + $sth->execute($borrowernumber); + while ($data = $sth->fetchrow_arrayref()) { + push @glist, $data->[0]; + } + + # Getting sibling guarantees + if ($guarantor) { + $query = "SELECT borrowernumber FROM borrowers WHERE guarantorid=?"; + $sth = $dbh->prepare($query); + $sth->execute($guarantor); + while ($data = $sth->fetchrow_arrayref()) { + push @glist, $data->[0] if ($data->[0] != $borrowernumber); + } + } + + return @glist; +} =head2 IsMemberBlocked @@ -961,7 +1002,7 @@ sub UpdateGuarantees { } =head2 GetPendingIssues - my $issues = &GetPendingIssues($borrowernumber); + my $issues = &GetPendingIssues(@borrowernumber); Looks up what the patron with the given borrowernumber has borrowed. @@ -974,14 +1015,22 @@ The keys include C<biblioitems> fields except marc and marcxml. #' sub GetPendingIssues { - my ($borrowernumber) = @_; + my (@borrowernumbers) = @_; + + # Borrowers part of the query + my $bquery = ''; + for (my $i = 0; $i < @borrowernumbers; $i++) { + $bquery .= " borrowernumber = ?"; + $bquery .= " OR" if ($i < (scalar(@borrowernumbers) - 1)); + } + # must avoid biblioitems.* to prevent large marc and marcxml fields from killing performance # FIXME: namespace collision: each table has "timestamp" fields. Which one is "timestamp" ? # FIXME: circ/ciculation.pl tries to sort by timestamp! # FIXME: C4::Print::printslip tries to sort by timestamp! # FIXME: namespace collision: other collisions possible. # FIXME: most of this data isn't really being used by callers. - my $sth = C4::Context->dbh->prepare( + my $query = "SELECT issues.*, items.*, biblio.*, @@ -998,16 +1047,19 @@ sub GetPendingIssues { biblioitems.url, issues.timestamp AS timestamp, issues.renewals AS renewals, + issues.borrowernumber AS borrowernumber, items.renewals AS totalrenewals FROM issues LEFT JOIN items ON items.itemnumber = issues.itemnumber LEFT JOIN biblio ON items.biblionumber = biblio.biblionumber LEFT JOIN biblioitems ON items.biblioitemnumber = biblioitems.biblioitemnumber WHERE - borrowernumber=? + $bquery ORDER BY issues.issuedate" - ); - $sth->execute($borrowernumber); + ; + + my $sth = C4::Context->dbh->prepare($query); + $sth->execute(@borrowernumbers); my $data = $sth->fetchall_arrayref({}); my $today = C4::Dates->new->output('iso'); foreach (@$data) { diff --git a/circ/circulation.pl b/circ/circulation.pl index 1ed4afd..2ca257c 100755 --- a/circ/circulation.pl +++ b/circ/circulation.pl @@ -42,6 +42,7 @@ use Date::Calc qw( Add_Delta_Days Date_to_Days ); +use List::MoreUtils qw/uniq/; # @@ -419,15 +420,24 @@ my $todaysissues = ''; my $previssues = ''; my @todaysissues; my @previousissues; +my @relissues; +my @relprevissues; +my $displayrelissues; my $totalprice = 0; -if ($borrower) { -# get each issue of the borrower & separate them in todayissues & previous issues - my ($issueslist) = GetPendingIssues($borrower->{'borrowernumber'}); +sub build_issue_data { + my $issueslist = shift; + my $relatives = shift; + # split in 2 arrays for today & previous foreach my $it ( @$issueslist ) { my $itemtypeinfo = getitemtypeinfo( (C4::Context->preference('item-level_itypes')) ? $it->{'itype'} : $it->{'itemtype'} ); + + # Getting borrower details + my $memberdetails = GetMemberDetails($it->{'borrowernumber'}); + $it->{'borrowername'} = $memberdetails->{'firstname'} . " " . $memberdetails->{'surname'}; + # set itemtype per item-level_itype syspref - FIXME this is an ugly hack $it->{'itemtype'} = ( C4::Context->preference( 'item-level_itypes' ) ) ? $it->{'itype'} : $it->{'itemtype'}; @@ -455,11 +465,28 @@ if ($borrower) { $it->{'renew_failed'} = $renew_failed{$it->{'itemnumber'}}; if ( $todaysdate eq $it->{'issuedate'} or $todaysdate eq $it->{'lastreneweddate'} ) { - push @todaysissues, $it; + (!$relatives) ? push @todaysissues, $it : push @relissues, $it; } else { - push @previousissues, $it; + (!$relatives) ? push @previousissues, $it : push @relprevissues, $it; } } +} + +if ($borrower) { + + # Getting borrower relatives + my @relborrowernumbers = GetMemberRelatives($borrower->{'borrowernumber'}); + #push @borrowernumbers, $borrower->{'borrowernumber'}; + + # get each issue of the borrower & separate them in todayissues & previous issues + my ($issueslist) = GetPendingIssues($borrower->{'borrowernumber'}); + my ($relissueslist) = GetPendingIssues(@relborrowernumbers); + + build_issue_data($issueslist, 0); + build_issue_data($relissueslist, 1); + + $displayrelissues = scalar($relissueslist); + if ( C4::Context->preference( "todaysIssuesDefaultSortOrder" ) eq 'asc' ) { @todaysissues = sort { $a->{'timestamp'} cmp $b->{'timestamp'} } @todaysissues; } @@ -657,6 +684,9 @@ $template->param( totaldue => sprintf('%.2f', $total), todayissues => \@todaysissues, previssues => \@previousissues, + relissues => \@relissues, + relprevissues => \@relprevissues, + displayrelissues => $displayrelissues, inprocess => $inprocess, memberofinstution => $member_of_institution, CGIorganisations => $CGIorganisations, diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/checkouts-table-footer.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/checkouts-table-footer.inc index df1acbf..87d245e 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/checkouts-table-footer.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/checkouts-table-footer.inc @@ -1,6 +1,6 @@ <tfoot> <tr> - <td colspan="5" style="text-align: right; font-weight:bold;">Totals:</td> + <td colspan="5" style="text-align: right; font-weight:bold;">Totals:</td> <td><!-- TMPL_VAR NAME="totaldue" --></td> <td><!-- TMPL_VAR NAME="totalprice" --></td> <td colspan="2"> diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tmpl index dc7ed5f..3839bd0 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tmpl +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tmpl @@ -24,9 +24,19 @@ if($.cookie("holdfor") != <!-- TMPL_VAR NAME="borrowernumber" -->){ $.cookie("ho dateFormat: 'uk',<!-- /TMPL_IF --> headers: { 1: { sorter: 'articles' },5: { sorter: false },6:{sorter:false},7:{sorter:false},8:{sorter:false}} }); + $("#relissuest").tablesorter({<!-- TMPL_IF NAME="dateformat_metric" --> + dateFormat: 'uk',<!-- /TMPL_IF --> + headers: { 1: { sorter: 'articles' },5: { sorter: false },6:{sorter:false},7:{sorter:false},8:{sorter:false}} + }); + + //FIXME: Sorting does not work when there are previous checkouts only + // (It works fine when there are only checkouts of the day, or both previous and today checkouts) $("#issuest").bind("sortEnd",function() { $("#previous").parents("tr").remove(); // 'previous checkouts' header chokes table sorter }); + $("#relissuest").bind("sortEnd",function() { + $("#relprevious").parents("tr").remove(); // 'previous checkouts' header chokes table sorter + }); $("#holdst").tablesorter({<!-- TMPL_IF NAME="dateformat_metric" --> dateFormat: 'uk',<!-- /TMPL_IF --> sortList: [[0,0]], @@ -62,6 +72,25 @@ var allcheckboxes = $(".checkboxed"); $(allcheckboxes).unCheckCheckboxes(":input[name*=barcodes]"); return false; }); + $("#relrenew_all").click(function(){ + $(allcheckboxes).checkCheckboxes(":input[name*=items]"); + $(allcheckboxes).unCheckCheckboxes(":input[name*=barcodes]"); + }); + $("#relCheckAllitems").click(function(){ + $(allcheckboxes).checkCheckboxes(":input[name*=items]"); + $(allcheckboxes).unCheckCheckboxes(":input[name*=barcodes]"); return false; + }); + $("#relCheckNoitems").click(function(){ + $(allcheckboxes).unCheckCheckboxes(":input[name*=items]"); return false; + }); + $("#relCheckAllreturns").click(function(){ + $(allcheckboxes).checkCheckboxes(":input[name*=barcodes]"); + $(allcheckboxes).unCheckCheckboxes(":input[name*=items]"); return false; + }); + $("#relCheckNoreturns").click(function(){ + $(allcheckboxes).unCheckCheckboxes(":input[name*=barcodes]"); return false; + }); + <!-- TMPL_IF NAME="CAN_user_circulate_override_renewals" --> <!-- TMPL_IF NAME="AllowRenewalLimitOverride" --> $( '#override_limit' ).click( function () { @@ -659,6 +688,7 @@ No patron matched <span class="ex"><!-- TMPL_VAR name="message" --></span> <td><a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=<!-- TMPL_VAR NAME="biblionumber" -->&type=intra"><strong><!-- TMPL_VAR NAME="title" escape="html" --></strong></a><!-- TMPL_IF NAME="author" -->, by <!-- TMPL_VAR NAME="author" --><!-- /TMPL_IF --><!-- TMPL_IF NAME="itemnotes" -->- <span class="circ-hlt"><!-- TMPL_VAR name="itemnotes" --></span><!-- /TMPL_IF --> <a href="/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=<!-- TMPL_VAR NAME="biblionumber" -->&itemnumber=<!-- TMPL_VAR NAME="itemnumber" -->#item<!-- TMPL_VAR NAME="itemnumber" -->"><!-- TMPL_VAR NAME="barcode" --></a></td> <td><!-- TMPL_UNLESS NAME="noItemTypeImages" --> <!-- TMPL_IF NAME="itemtype_image" --><img src="<!-- TMPL_VAR NAME="itemtype_image" -->" alt="" /><!-- /TMPL_IF --><!-- /TMPL_UNLESS --><!-- TMPL_VAR NAME="itemtype" --></td> <td><!-- TMPL_VAR NAME="checkoutdate" --></td> + <!-- TMPL_IF NAME="multiple_borrowers" --><td><!-- TMPL_VAR NAME="borrowername" --></td><!-- /TMPL_IF --> <td><!-- TMPL_VAR NAME="itemcallnumber" --></td> <td><!-- TMPL_VAR NAME="charge" --></td> <td><!-- TMPL_VAR NAME="replacementprice" --></td> @@ -726,6 +756,7 @@ No patron matched <span class="ex"><!-- TMPL_VAR name="message" --></span> <!-- TMPL_VAR NAME="itemtype" --> </td> <td><!-- TMPL_VAR NAME="displaydate" --></td> + <!-- TMPL_IF NAME="multiple_borrowers" --><td><!-- TMPL_VAR NAME="borrowername" --></td><!-- /TMPL_IF --> <td><!-- TMPL_VAR NAME="itemcallnumber" --></td> <td><!-- TMPL_VAR NAME="charge" --></td> <td><!-- TMPL_VAR NAME="replacementprice" --></td> @@ -787,10 +818,77 @@ No patron matched <span class="ex"><!-- TMPL_VAR name="message" --></span> <input type="submit" id="renew_all" name="renew_all" value="Renew all" /> </fieldset> <!-- /TMPL_IF --> -</form> <!-- TMPL_ELSE --> <p>Patron has nothing checked out.</p> <!-- /TMPL_IF --> + + +<!-- TMPL_IF NAME="displayrelissues" --> +<h2>Relatives issues</h2> + <table id="relissuest"> + <thead> + <tr> + <th scope="col">Due date</th> + <th scope="col">Title</th> + <th scope="col">Item Type</th> + <th scope="col">Branch</th> + <th scope="col">Checked out on</th> + <th scope="col">Charge</th> + <th scope="col">Borrower</th> + <th scope="col">Material</th> + </tr> + </thead> +<!-- TMPL_IF NAME="relissues" --> <tbody> + + <!-- TMPL_LOOP NAME="relissues" --> + <!-- TMPL_IF NAME="__odd__" --> + <tr> + <!-- TMPL_ELSE --> + <tr class="highlight"> + <!-- /TMPL_IF --> + <!-- TMPL_IF NAME="overdue" --><td class="od"><!-- TMPL_ELSE --><td><!-- /TMPL_IF --> + <!-- TMPL_VAR NAME="dd" --></td> + <td><a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=<!-- TMPL_VAR NAME="biblionumber" -->&type=intra"><strong><!-- TMPL_VAR NAME="title" escape="html" --></strong></a><!-- TMPL_IF NAME="author" -->, by <!-- TMPL_VAR NAME="author" --><!-- /TMPL_IF --><!-- TMPL_IF NAME="itemnotes" -->- <span class="circ-hlt"><!-- TMPL_VAR name="itemnotes" --></span><!-- /TMPL_IF --> <a href="/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=<!-- TMPL_VAR NAME="biblionumber" -->&itemnumber=<!-- TMPL_VAR NAME="itemnumber" -->#item<!-- TMPL_VAR NAME="itemnumber" -->"><!-- TMPL_VAR NAME="barcode" --></a></td> + <td><!-- TMPL_UNLESS NAME="noItemTypeImages" --> <!-- TMPL_IF NAME="itemtype_image" --><img src="<!-- TMPL_VAR NAME="itemtype_image" -->" alt="" /><!-- /TMPL_IF --><!-- /TMPL_UNLESS --><!-- TMPL_VAR NAME="itemtype" --></td> + <td><!-- TMPL_VAR NAME="branchdisplay" --> + <!--TMPL_IF Name="itemcallnumber"-->(<!-- TMPL_VAR NAME="itemcallnumber" -->)<!--/TMPL_IF--></td> + <td><!-- TMPL_VAR NAME="displaydate" --></td> + <td><!-- TMPL_VAR NAME="charge" --></td> + <td><a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=<!-- TMPL_VAR NAME="borrowernumber" -->"><!-- TMPL_VAR NAME="borrowername" --></a></td> + <td><!-- TMPL_VAR NAME="materials" --></td> + </tr> + <!-- /TMPL_LOOP --> <!-- /loop todayissues --> + <!-- /if todayissues --><!-- /TMPL_IF --> +<!-- TMPL_IF NAME="relprevissues" --> +<tr><th class="{sorter: false}" colspan="10"><a name="relprevious" id="relprevious"></a>Previous checkouts</th></tr> + <!-- TMPL_LOOP NAME="relprevissues" --> + <!-- TMPL_IF NAME="__odd__" --> + <tr> + <!-- TMPL_ELSE --> + <tr class="highlight"> + <!-- /TMPL_IF --> + <!-- TMPL_IF NAME="overdue" --><td class="od"><!-- TMPL_ELSE --><td><!-- /TMPL_IF --> + <!-- TMPL_VAR NAME="dd" --> + </td> + <td><a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=<!-- TMPL_VAR NAME="biblionumber" -->&type=intra"><strong><!-- TMPL_VAR NAME="title" escape="html" --></strong></a><!-- TMPL_IF NAME="author" -->, by <!-- TMPL_VAR NAME="author" --><!-- /TMPL_IF --> <!-- TMPL_IF NAME="itemnotes" -->- <!-- TMPL_VAR name="itemnotes" --><!-- /TMPL_IF --> <a href="/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=<!-- TMPL_VAR NAME="biblionumber" -->&itemnumber=<!-- TMPL_VAR NAME="itemnumber" -->#item<!-- TMPL_VAR NAME="itemnumber" -->"><!-- TMPL_VAR NAME="barcode" --></a></td> + <td> + <!-- TMPL_VAR NAME="itemtype" --> + </td> + <td><!-- TMPL_VAR NAME="branchdisplay" --> + <!--TMPL_IF NAME="itemcallnumber"-->(<!-- TMPL_VAR NAME="itemcallnumber" -->)<!--/TMPL_IF--></td> + <td><!-- TMPL_VAR NAME="displaydate" --></td> + <!-- TMPL_IF NAME="multiple_borrowers" --><td><!-- TMPL_VAR NAME="borrowername" --></td><!-- /TMPL_IF --> + <td><!-- TMPL_VAR NAME="charge" --></td> + <td><a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=<!-- TMPL_VAR NAME="borrowernumber" -->"><!-- TMPL_VAR NAME="borrowername" --></a></td> + <td><!-- TMPL_VAR NAME="materials" --></td> + </tr> + <!-- /loop previssues --><!-- /TMPL_LOOP --> +<!--/if previssues --><!-- /TMPL_IF --> + </tbody> + </table> +</form> +<!-- /TMPL_IF --><!-- end displayrelissues --> + </div> diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tmpl index 2cdc13a..d3e71ed 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tmpl +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tmpl @@ -17,7 +17,11 @@ $(document).ready(function() { $.tablesorter.defaults.widgets = ['zebra']; $("#issuest").tablesorter({<!-- TMPL_IF NAME="dateformat_metric" --> dateFormat: 'uk',<!-- /TMPL_IF --> - headers: { 1: { sorter: 'articles' },5: { sorter: false },6:{sorter:false},7:{sorter:false},8:{sorter:false}} + headers: { 1: { sorter: 'articles' }} + }); + $("#relissuest").tablesorter({<!-- TMPL_IF NAME="dateformat_metric" --> + dateFormat: 'uk',<!-- /TMPL_IF --> + headers: { 1: { sorter: 'articles' }} }); $("#holdst").tablesorter({<!-- TMPL_IF NAME="dateformat_metric" --> dateFormat: 'uk',<!-- /TMPL_IF --> @@ -42,6 +46,13 @@ $(document).ready(function() { $("#CheckAllreturns").click(function(){ $(".checkboxed").checkCheckboxes(":input[name*=barcodes]"); $(".checkboxed").unCheckCheckboxes(":input[name*=items]"); return false; }); $("#CheckNoreturns" ).click(function(){ $(".checkboxed").unCheckCheckboxes(":input[name*=barcodes]"); return false; }); + $("#relrenew_all" ).click(function(){ $(".checkboxed").checkCheckboxes(":input[name*=items]" ); $(".checkboxed").unCheckCheckboxes(":input[name*=barcodes]"); }); + $("#relCheckAllitems" ).click(function(){ $(".checkboxed").checkCheckboxes(":input[name*=items]" ); $(".checkboxed").unCheckCheckboxes(":input[name*=barcodes]"); return false; }); + $("#relCheckNoitems" ).click(function(){ $(".checkboxed").unCheckCheckboxes(":input[name*=items]"); return false; }); + $("#relCheckAllreturns").click(function(){ $(".checkboxed").checkCheckboxes(":input[name*=barcodes]"); $(".checkboxed").unCheckCheckboxes(":input[name*=items]"); return false; }); + $("#relCheckNoreturns" ).click(function(){ $(".checkboxed").unCheckCheckboxes(":input[name*=barcodes]"); return false; }); + + <!-- TMPL_IF NAME="CAN_user_circulate_override_renewals" --> <!-- TMPL_IF NAME="AllowRenewalLimitOverride" --> $( '#override_limit' ).click( function () { @@ -398,11 +409,11 @@ function validate1(date) { <!-- /TMPL_IF --> </div> -<div id="checkedout"> - <!-- TMPL_IF NAME="issueloop" --> <form action="/cgi-bin/koha/reserve/renewscript.pl" method="post" class="checkboxed"> <input type="hidden" name="borrowernumber" value="<!-- TMPL_VAR NAME="borrowernumber" -->" /> <input type="hidden" name="branch" value="<!-- TMPL_VAR NAME="branch" -->" /> +<div id="checkedout"> + <!-- TMPL_IF NAME="issueloop" --> <table id="issuest"> <thead> <tr> @@ -410,7 +421,7 @@ function validate1(date) { <th scope="col">Title</th> <th scope="col">Item Type</th> <th scope="col">Checked out on</th> - <th scope="col">Call no</th> + <th scope="col">Call no</th> <th scope="col">Charge</th> <th scope="col">Price</th> <th scope="col">Renew <p class="column-tool"><a href="#" id="CheckAllitems">select all</a> | <a href="#" id="CheckNoitems">none</a></p></th> @@ -494,7 +505,58 @@ function validate1(date) { <input type="submit" name="renew_checked" value="Renew or Return checked items" /> <input type="submit" id="renew_all" name="renew_all" value="Renew all" /> </fieldset> - </form><!-- TMPL_ELSE --><p>Patron has nothing checked out.</p><!-- /TMPL_IF --> + <!-- TMPL_ELSE --><p>Patron has nothing checked out.</p> +<!-- /TMPL_IF --> + +<!-- TMPL_IF NAME="relissuecount" --> + <h2>Relatives issues</h2> + <table id="relissuest"> + <thead> + <tr> + <th scope="col">Due date</th> + <th scope="col">Title</th> + <th scope="col">Collection</th> + <th scope="col">Stock number</th> + <th scope="col">Barcode</th> + <th scope="col">Item Type</th> + <th scope="col">Checked out on</th> + <th scope="col">Borrower</th> + <th scope="col">Call no</th> + <th scope="col">Charge</th> + <th scope="col">Price</th> + </tr> + </thead> + <tbody> + <!-- TMPL_LOOP name="relissueloop" --> + + <!-- TMPL_IF name="overdue" --> + <tr class="problem"> + <!-- TMPL_ELSE --> + <tr> + <!-- /TMPL_IF --> + <td<!-- TMPL_IF NAME="red" --> class="od"<!-- /TMPL_IF -->><!-- TMPL_VAR NAME="date_due" --> + <!-- TMPL_IF NAME="itemlost" --> + <span class="lost"><!-- TMPL_VAR NAME="itemlost" --></span> + <!-- /TMPL_IF --> + <!-- TMPL_IF NAME="damaged" --> + <span class="dmg"><!-- TMPL_VAR NAME="itemdamaged" --></span> + <!-- /TMPL_IF --> +</td> + <td><a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=<!-- TMPL_VAR NAME="biblionumber" -->"><strong><!-- TMPL_VAR NAME="title" escape="html" --></strong></a><!-- TMPL_IF NAME="author" -->, by <!-- TMPL_VAR name="author" --><!-- /TMPL_IF --> <!-- TMPL_IF name="publishercode" -->; <!-- TMPL_VAR name="publishercode" --> <!-- /TMPL_IF --> <!-- TMPL_IF name="publicationyear" -->, <!-- TMPL_VAR name="publicationyear" --><!-- /TMPL_IF --></td> + <td><!-- TMPL_VAR NAME="collection" --></td> + <td><!-- TMPL_VAR NAME="stocknumber" --></td> + <td><a href="/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=<!-- TMPL_VAR NAME="biblionumber" -->&itemnumber=<!-- TMPL_VAR NAME="itemnumber" -->#item<!-- TMPL_VAR NAME="itemnumber" -->"><!-- TMPL_VAR NAME="barcode" --></a></td> +<td><!-- TMPL_UNLESS NAME="noItemTypeImages" --> <!-- TMPL_IF NAME="itemtype_image" --><img src="<!-- TMPL_VAR NAME="itemtype_image" -->" alt="" /><!-- /TMPL_IF --><!-- /TMPL_UNLESS --><!-- TMPL_VAR NAME="itemtype_description" --></td> + <td><!-- TMPL_VAR NAME="issuedate" --></td> + <td><a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=<!-- TMPL_VAR NAME="borrowernumber" -->"><!-- TMPL_VAR NAME="borrowername" --></a></td> + <td><!-- TMPL_VAR NAME="itemcallnumber" --></td> + <td><!-- TMPL_VAR NAME="charge" --></td> + <td><!-- TMPL_VAR NAME="replacementprice" --></td> + </tr> + <!-- /tmpl_loop --> + </tbody> + </table> +<!-- /TMPL_IF --> </div> <div id="onhold"> @@ -543,12 +605,14 @@ function validate1(date) { </tr> <!-- /TMPL_LOOP --></tbody> </table> - <fieldset class="action"><input type="submit" class="cancel" name="submit" value="Cancel Marked Requests" /></fieldset> - </form> - <!-- TMPL_ELSE --> - <p>Patron has nothing on hold.</p> - <!-- /TMPL_IF --> - </div> + + <fieldset class="action"> + <input type="submit" name="renew_checked" value="Renew or Return checked items" /> + <input type="submit" id="renew_all" name="renew_all" value="Renew all" /> + </fieldset> + <!-- TMPL_ELSE --><p>Patron has nothing checked out.</p><!-- /TMPL_IF --> + </div> + </div> <!-- /TMPL_IF --> <!-- unknowuser --> diff --git a/members/moremember.pl b/members/moremember.pl index bb593c4..9dcfa3a 100755 --- a/members/moremember.pl +++ b/members/moremember.pl @@ -51,6 +51,7 @@ use C4::Reserves; use C4::Branch; # GetBranchName use C4::Form::MessagingPreferences; use C4::NewsChannels; #get slip news +use List::MoreUtils qw/uniq/; #use Smart::Comments; #use Data::Dumper; @@ -239,73 +240,94 @@ if ( C4::Context->preference('OPACPrivacy') ) { # current issues # -my $issue = GetPendingIssues($borrowernumber); +my @borrowernumbers = GetMemberRelatives($borrowernumber); +my $issue = GetPendingIssues($borrowernumber); +my $relissue = GetPendingIssues(@borrowernumbers); my $issuecount = scalar(@$issue); +my $relissuecount = scalar(@$relissue); my $roaddetails = &GetRoadTypeDetails( $data->{'streettype'} ); my $today = POSIX::strftime("%Y-%m-%d", localtime); # iso format my @issuedata; +my @borrowers_with_issues; my $overdues_exist = 0; my $totalprice = 0; -for ( my $i = 0 ; $i < $issuecount ; $i++ ) { - my $datedue = $issue->[$i]{'date_due'}; - my $issuedate = $issue->[$i]{'issuedate'}; - $issue->[$i]{'date_due'} = C4::Dates->new($issue->[$i]{'date_due'}, 'iso')->output('syspref'); - $issue->[$i]{'issuedate'} = C4::Dates->new($issue->[$i]{'issuedate'},'iso')->output('syspref'); - my $biblionumber = $issue->[$i]{'biblionumber'}; - my %row = %{ $issue->[$i] }; - $totalprice += $issue->[$i]{'replacementprice'}; - $row{'replacementprice'} = $issue->[$i]{'replacementprice'}; - # item lost, damaged loops - if ($row{'itemlost'}) { - my $fw = GetFrameworkCode($issue->[$i]{'biblionumber'}); - my $category = GetAuthValCode('items.itemlost',$fw); - my $lostdbh = C4::Context->dbh; - my $sth = $lostdbh->prepare("select lib from authorised_values where category=? and authorised_value =? "); - $sth->execute($category, $row{'itemlost'}); - my $loststat = $sth->fetchrow; - if ($loststat) { - $row{'itemlost'} = $loststat; + +my @issuedata = build_issue_data($issue, $issuecount); +my @relissuedata = build_issue_data($relissue, $relissuecount); + +sub build_issue_data { + my $issue = shift; + my $issuecount = shift; + + my $localissue; + + for ( my $i = 0 ; $i < $issuecount ; $i++ ) { + # Getting borrower details + my $memberdetails = GetMemberDetails($issue->[$i]{'borrowernumber'}); + $issue->[$i]{'borrowername'} = $memberdetails->{'firstname'} . " " . $memberdetails->{'surname'}; + + my $datedue = $issue->[$i]{'date_due'}; + my $issuedate = $issue->[$i]{'issuedate'}; + $issue->[$i]{'date_due'} = C4::Dates->new($issue->[$i]{'date_due'}, 'iso')->output('syspref'); + $issue->[$i]{'issuedate'} = C4::Dates->new($issue->[$i]{'issuedate'},'iso')->output('syspref'); + my $biblionumber = $issue->[$i]{'biblionumber'}; + my %row = %{ $issue->[$i] }; + $totalprice += $issue->[$i]{'replacementprice'}; + $row{'replacementprice'} = $issue->[$i]{'replacementprice'}; + # item lost, damaged loops + if ($row{'itemlost'}) { + my $fw = GetFrameworkCode($issue->[$i]{'biblionumber'}); + my $category = GetAuthValCode('items.itemlost',$fw); + my $lostdbh = C4::Context->dbh; + my $sth = $lostdbh->prepare("select lib from authorised_values where category=? and authorised_value =? "); + $sth->execute($category, $row{'itemlost'}); + my $loststat = $sth->fetchrow; + if ($loststat) { + $row{'itemlost'} = $loststat; + } } - } - if ($row{'damaged'}) { - my $fw = GetFrameworkCode($issue->[$i]{'biblionumber'}); - my $category = GetAuthValCode('items.damaged',$fw); - my $damageddbh = C4::Context->dbh; - my $sth = $damageddbh->prepare("select lib from authorised_values where category=? and authorised_value =? "); - $sth->execute($category, $row{'damaged'}); - my $damagedstat = $sth->fetchrow; - if ($damagedstat) { - $row{'itemdamaged'} = $damagedstat; + if ($row{'damaged'}) { + my $fw = GetFrameworkCode($issue->[$i]{'biblionumber'}); + my $category = GetAuthValCode('items.damaged',$fw); + my $damageddbh = C4::Context->dbh; + my $sth = $damageddbh->prepare("select lib from authorised_values where category=? and authorised_value =? "); + $sth->execute($category, $row{'damaged'}); + my $damagedstat = $sth->fetchrow; + if ($damagedstat) { + $row{'itemdamaged'} = $damagedstat; + } } + # end lost, damaged + if ( $datedue lt $today ) { + $overdues_exist = 1; + $row{'red'} = 1; + } + if ( $issuedate eq $today ) { + $row{'today'} = 1; + } + + #find the charge for an item + my ( $charge, $itemtype ) = + GetIssuingCharges( $issue->[$i]{'itemnumber'}, $borrowernumber ); + + my $itemtypeinfo = getitemtypeinfo($itemtype); + $row{'itemtype_description'} = $itemtypeinfo->{description}; + $row{'itemtype_image'} = $itemtypeinfo->{imageurl}; + + $row{'charge'} = sprintf( "%.2f", $charge ); + + my ( $renewokay,$renewerror ) = CanBookBeRenewed( $borrowernumber, $issue->[$i]{'itemnumber'}, $override_limit ); + $row{'norenew'} = !$renewokay; + $row{'can_confirm'} = ( !$renewokay && $renewerror ne 'on_reserve' ); + $row{"norenew_reason_$renewerror"} = 1 if $renewerror; + $row{'renew_failed'} = $renew_failed{ $issue->[$i]{'itemnumber'} }; + $row{'return_failed'} = $return_failed{$issue->[$i]{'barcode'}}; + push( @$localissue, \%row ); } - # end lost, damaged - if ( $datedue lt $today ) { - $overdues_exist = 1; - $row{'red'} = 1; - } - if ( $issuedate eq $today ) { - $row{'today'} = 1; - } - - #find the charge for an item - my ( $charge, $itemtype ) = - GetIssuingCharges( $issue->[$i]{'itemnumber'}, $borrowernumber ); - - my $itemtypeinfo = getitemtypeinfo($itemtype); - $row{'itemtype_description'} = $itemtypeinfo->{description}; - $row{'itemtype_image'} = $itemtypeinfo->{imageurl}; - - $row{'charge'} = sprintf( "%.2f", $charge ); - - my ( $renewokay,$renewerror ) = CanBookBeRenewed( $borrowernumber, $issue->[$i]{'itemnumber'}, $override_limit ); - $row{'norenew'} = !$renewokay; - $row{'can_confirm'} = ( !$renewokay && $renewerror ne 'on_reserve' ); - $row{"norenew_reason_$renewerror"} = 1 if $renewerror; - $row{'renew_failed'} = $renew_failed{ $issue->[$i]{'itemnumber'} }; - $row{'return_failed'} = $return_failed{$issue->[$i]{'barcode'}}; - push( @issuedata, \%row ); + return $localissue; } + ### ############################################################################### # BUILD HTML # show all reserves of this borrower, and the position of the reservation .... @@ -437,8 +459,10 @@ $template->param( totalprice => sprintf("%.2f", $totalprice), totaldue => sprintf("%.2f", $total), totaldue_raw => $total, - issueloop => \@issuedata, - issuecount => $issuecount, + issueloop => @issuedata, + relissueloop => @relissuedata, + issuecount => $issuecount, + relissuecount => $relissuecount, overdues_exist => $overdues_exist, error => $error, $error => 1, -- 1.7.4.1 _______________________________________________ Koha-patches mailing list Koha-patches@lists.koha-community.org http://lists.koha-community.org/cgi-bin/mailman/listinfo/koha-patches website : http://www.koha-community.org/ git : http://git.koha-community.org/ bugs : http://bugs.koha-community.org/