Bug 5952: Shows member relatives in issues lists
authorMatthias Meusburger <matthias.meusburger@biblibre.com>
Sat, 26 Mar 2011 08:41:55 +0000 (04:41 -0400)
committerChris Cormack <chrisc@catalyst.net.nz>
Fri, 1 Apr 2011 08:03:14 +0000 (21:03 +1300)
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@bywatersolutions.com>
Signed-off-by: Chris Cormack <chrisc@catalyst.net.nz>

C4/Members.pm
circ/circulation.pl
koha-tmpl/intranet-tmpl/prog/en/includes/checkouts-table-footer.inc
koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tmpl
koha-tmpl/intranet-tmpl/prog/en/modules/members/moremember.tmpl
members/moremember.pl

index 9fdb357..bf73e0e 100644 (file)
@@ -45,6 +45,7 @@ BEGIN {
                &Search
                &SearchMember 
                &GetMemberDetails
+        &GetMemberRelatives
                &GetMember
 
                &GetGuarantees 
@@ -582,6 +583,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
 
@@ -963,7 +1004,7 @@ sub UpdateGuarantees {
 }
 =head2 GetPendingIssues
 
-  my $issues = &GetPendingIssues($borrowernumber);
+  my $issues = &GetPendingIssues(@borrowernumber);
 
 Looks up what the patron with the given borrowernumber has borrowed.
 
@@ -976,14 +1017,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.*,
@@ -1000,16 +1049,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) {
index e521e19..5242193 100755 (executable)
@@ -42,6 +42,7 @@ use Date::Calc qw(
   Add_Delta_Days
   Date_to_Days
 );
+use List::MoreUtils qw/uniq/;
 
 
 #
@@ -403,15 +404,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'};
 
@@ -439,11 +449,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;
     }
@@ -641,6 +668,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,
index df1acbf..87d245e 100644 (file)
@@ -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">
index 4d509c3..b7e02d3 100644 (file)
@@ -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>
 
 
index 2cdc13a..d3e71ed 100644 (file)
@@ -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 -->
 
index bb593c4..9dcfa3a 100755 (executable)
@@ -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,