[Koha-patches] [PATCH] [SIGNED-OFF] Bug 5952: Shows member relatives in issues lists

Nicole C. Engard nengard at bywatersolutions.com
Sat Mar 26 09:41:55 CET 2011


From: Matthias Meusburger <matthias.meusburger at biblibre.com>

Duplicate of '[PATCH] MT3747: Shows member relatives in issueslists' : Subject was wrong

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

Signed-off-by: Nicole C. Engard <nengard at bywatersolutions.com>
---
 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" -->&amp;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" -->&amp;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" -->&amp;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" -->&amp;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" -->&amp;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" -->&amp;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" -->&amp;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.2.3



More information about the Koha-patches mailing list