Bug 5547: Hide Lost Items dev
authorIan Walls <ian.walls@bywatersolutions.com>
Mon, 28 Mar 2011 14:21:02 +0000 (10:21 -0400)
committerChris Cormack <chrisc@catalyst.net.nz>
Wed, 30 Mar 2011 07:20:05 +0000 (20:20 +1300)
Adds a Hide Lost Items option to the staff client, as detailed in the enhancement request
at http://wiki.koha-community.org/wiki/Hidelostitems_option_for_the_staff_client_RFC

Minor edits: Whitespace

Signed-off-by: Owen Leonard <oleonard@myacpl.org>
Signed-off-by: Chris Cormack <chrisc@catalyst.net.nz>
12 files changed:
C4/Members.pm
C4/Search.pm
admin/categorie.pl
catalogue/detail.pl
catalogue/moredetail.pl
installer/data/mysql/kohastructure.sql
installer/data/mysql/updatedatabase.pl
koha-tmpl/intranet-tmpl/prog/en/modules/admin/categorie.tmpl
koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tmpl
koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tmpl
koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tmpl
reserve/request.pl

index ace939d..9fdb357 100644 (file)
@@ -70,6 +70,8 @@ BEGIN {
     &PutPatronImage
     &RmPatronImage
 
+                &GetHideLostItemsPreference
+
                &IsMemberBlocked
                &GetMemberAccountRecords
                &GetBorNotifyAcctRecord
@@ -1807,6 +1809,25 @@ sub RmPatronImage {
     return $dberror;
 }
 
+=head2 GetHideLostItemsPreference
+
+  $hidelostitemspref = &GetHideLostItemsPreference($borrowernumber);
+
+Returns the HideLostItems preference for the patron category of the supplied borrowernumber
+C<&$hidelostitemspref>return value of function, 0 or 1
+
+=cut
+
+sub GetHideLostItemsPreference {
+    my ($borrowernumber) = @_;
+    my $dbh = C4::Context->dbh;
+    my $query = "SELECT hidelostitems FROM borrowers,categories WHERE borrowers.categorycode = categories.categorycode AND borrowernumber = ?";
+    my $sth = $dbh->prepare($query);
+    $sth->execute($borrowernumber);
+    my $hidelostitems = $sth->fetchrow;    
+    return $hidelostitems;    
+}
+
 =head2 GetRoadTypeDetails (OUEST-PROVENCE)
 
   ($roadtype) = &GetRoadTypeDetails($roadtypeid);
index f970caf..35f0166 100644 (file)
@@ -25,6 +25,7 @@ use Lingua::Stem;
 use C4::Search::PazPar2;
 use XML::Simple;
 use C4::Dates qw(format_date);
+use C4::Members qw(GetHideLostItemsPreference);
 use C4::XSLT;
 use C4::Branch;
 use C4::Reserves;    # CheckReserves
@@ -1593,7 +1594,8 @@ sub searchResults {
 
                        my $prefix = $item->{$hbranch} . '--' . $item->{location} . $item->{itype} . $item->{itemcallnumber};
 # For each grouping of items (onloan, available, unavailable), we build a key to store relevant info about that item
-            if ( $item->{onloan} ) {
+            my $userenv = C4::Context->userenv;
+            if ( $item->{onloan} && !(C4::Members::GetHideLostItemsPreference($userenv->{'number'}) && $item->{itemlost}) ) {
                 $onloan_count++;
                                my $key = $prefix . $item->{onloan} . $item->{barcode};
                                $onloan_items->{$key}->{due_date} = format_date($item->{onloan});
index 4a5d683..d0211fd 100755 (executable)
@@ -92,7 +92,7 @@ if ($op eq 'add_form') {
        my $data;
        if ($categorycode) {
                my $dbh = C4::Context->dbh;
-               my $sth=$dbh->prepare("select categorycode,description,enrolmentperiod,enrolmentperioddate,upperagelimit,dateofbirthrequired,enrolmentfee,issuelimit,reservefee,overduenoticerequired,category_type from categories where categorycode=?");
+               my $sth=$dbh->prepare("select categorycode,description,enrolmentperiod,enrolmentperioddate,upperagelimit,dateofbirthrequired,enrolmentfee,issuelimit,reservefee,hidelostitems,overduenoticerequired,category_type from categories where categorycode=?");
                $sth->execute($categorycode);
                $data=$sth->fetchrow_hashref;
                $sth->finish;
@@ -109,6 +109,7 @@ if ($op eq 'add_form') {
                                overduenoticerequired   => $data->{'overduenoticerequired'},
                                issuelimit              => $data->{'issuelimit'},
                                reservefee              => sprintf("%.2f",$data->{'reservefee'}),
+                                hidelostitems           => $data->{'hidelostitems'},
                                category_type           => $data->{'category_type'},
                                DHTMLcalendar_dateformat => C4::Dates->DHTMLcalendar(),
                                "type_".$data->{'category_type'} => 1,
@@ -128,12 +129,12 @@ if ($op eq 'add_form') {
        }
        
        if ($is_a_modif) {
-            my $sth=$dbh->prepare("UPDATE categories SET description=?,enrolmentperiod=?, enrolmentperioddate=?,upperagelimit=?,dateofbirthrequired=?,enrolmentfee=?,reservefee=?,overduenoticerequired=?,category_type=? WHERE categorycode=?");
-            $sth->execute(map { $input->param($_) } ('description','enrolmentperiod','enrolmentperioddate','upperagelimit','dateofbirthrequired','enrolmentfee','reservefee','overduenoticerequired','category_type','categorycode'));
+            my $sth=$dbh->prepare("UPDATE categories SET description=?,enrolmentperiod=?, enrolmentperioddate=?,upperagelimit=?,dateofbirthrequired=?,enrolmentfee=?,reservefee=?,hidelostitems=?,overduenoticerequired=?,category_type=? WHERE categorycode=?");
+            $sth->execute(map { $input->param($_) } ('description','enrolmentperiod','enrolmentperioddate','upperagelimit','dateofbirthrequired','enrolmentfee','reservefee','hidelostitems','overduenoticerequired','category_type','categorycode'));
             $sth->finish;
         } else {
-            my $sth=$dbh->prepare("INSERT INTO categories  (categorycode,description,enrolmentperiod,enrolmentperioddate,upperagelimit,dateofbirthrequired,enrolmentfee,reservefee,overduenoticerequired,category_type) values (?,?,?,?,?,?,?,?,?,?)");
-            $sth->execute(map { $input->param($_) } ('categorycode','description','enrolmentperiod','enrolmentperioddate','upperagelimit','dateofbirthrequired','enrolmentfee','reservefee','overduenoticerequired','category_type'));
+            my $sth=$dbh->prepare("INSERT INTO categories  (categorycode,description,enrolmentperiod,enrolmentperioddate,upperagelimit,dateofbirthrequired,enrolmentfee,reservefee,hidelostitems,overduenoticerequired,category_type) values (?,?,?,?,?,?,?,?,?,?)");
+            $sth->execute(map { $input->param($_) } ('categorycode','description','enrolmentperiod','enrolmentperioddate','upperagelimit','dateofbirthrequired','enrolmentfee','reservefee','hidelostitems','overduenoticerequired','category_type'));
             $sth->finish;
         }
     if (C4::Context->preference('EnhancedMessagingPreferences')) {
@@ -156,7 +157,7 @@ if ($op eq 'add_form') {
        $sth->finish;
        $template->param(total => $total->{'total'});
        
-       my $sth2=$dbh->prepare("select categorycode,description,enrolmentperiod,enrolmentperioddate,upperagelimit,dateofbirthrequired,enrolmentfee,issuelimit,reservefee,overduenoticerequired,category_type from categories where categorycode=?");
+       my $sth2=$dbh->prepare("select categorycode,description,enrolmentperiod,enrolmentperioddate,upperagelimit,dateofbirthrequired,enrolmentfee,issuelimit,reservefee,hidelostitems,overduenoticerequired,category_type from categories where categorycode=?");
        $sth2->execute($categorycode);
        my $data=$sth2->fetchrow_hashref;
        $sth2->finish;
@@ -173,6 +174,7 @@ if ($op eq 'add_form') {
                                 overduenoticerequired   => $data->{'overduenoticerequired'},
                                 issuelimit              => $data->{'issuelimit'},
                                 reservefee              =>  sprintf("%.2f",$data->{'reservefee'}),
+                                hidelostitems           => $data->{'hidelostitems'},
                                 category_type           => $data->{'category_type'},
                                 );
                                                                                                        # END $OP eq DELETE_CONFIRM
@@ -205,6 +207,7 @@ if ($op eq 'add_form') {
                                overduenoticerequired   => $results->[$i]{'overduenoticerequired'},
                                issuelimit              => $results->[$i]{'issuelimit'},
                                reservefee              => sprintf("%.2f",$results->[$i]{'reservefee'}),
+                                hidelostitems           => $results->[$i]{'hidelostitems'},
                                category_type           => $results->[$i]{'category_type'},
                                "type_".$results->[$i]{'category_type'} => 1);
         if (C4::Context->preference('EnhancedMessagingPreferences')) {
index 3d42326..5542163 100755 (executable)
@@ -64,6 +64,8 @@ if($query->cookie("holdfor")){
 my $biblionumber = $query->param('biblionumber');
 my $fw = GetFrameworkCode($biblionumber);
 
+my $showallitems = $query->param('showallitems');
+
 ## get notes and subjects from MARC record
 my $marcflavour      = C4::Context->preference("marcflavour");
 my $record           = GetMarcBiblio($biblionumber);
@@ -109,8 +111,12 @@ my $branches = GetBranches();
 my $itemtypes = GetItemTypes();
 my $dbh = C4::Context->dbh;
 
-# change back when ive fixed request.pl
-my @items = &GetItemsInfo( $biblionumber, 'intra' );
+# 'intra' param included, even though it's not respected in GetItemsInfo currently
+my @all_items= GetItemsInfo($biblionumber, 'intra');
+my @items;
+for my $itm (@all_items) {
+    push @items, $itm unless ( $itm->{itemlost} && GetHideLostItemsPreference($borrowernumber) && !$showallitems);
+}
 my $dat = &GetBiblioData($biblionumber);
 
 # get count of holds
@@ -141,7 +147,11 @@ foreach my $subscription (@subscriptions) {
 if ( defined $dat->{'itemtype'} ) {
     $dat->{imageurl} = getitemtypeimagelocation( 'intranet', $itemtypes->{ $dat->{itemtype} }{imageurl} );
 }
-$dat->{'count'} = scalar @items;
+
+$dat->{'count'} = scalar @all_items;
+$dat->{'showncount'} = scalar @items;
+$dat->{'hiddencount'} = scalar @all_items - scalar @items;
+
 my $shelflocations = GetKohaAuthorisedValues('items.location', $fw);
 my $collections    = GetKohaAuthorisedValues('items.ccode'   , $fw);
 my (@itemloop, %itemfields);
index 054229f..d848188 100755 (executable)
@@ -34,6 +34,7 @@ use C4::Dates qw/format_date/;
 use C4::Circulation;  # to use itemissues
 use C4::Members; # to use GetMember
 use C4::Search;                # enabled_staff_search_views
+use C4::Members qw/GetHideLostItemsPreference/;
 
 my $query=new CGI;
 
@@ -66,8 +67,10 @@ my $biblionumber=$query->param('biblionumber');
 my $title=$query->param('title');
 my $bi=$query->param('bi');
 $bi = $biblionumber unless $bi;
+my $itemnumber = $query->param('itemnumber');
 my $data=GetBiblioData($biblionumber);
 my $dewey = $data->{'dewey'};
+my $showallitems = $query->param('showallitems');
 
 #coping with subscriptions
 my $subscriptionsnumber = CountSubscriptionFromBiblionumber($biblionumber);
@@ -85,16 +88,27 @@ my $subscriptionsnumber = CountSubscriptionFromBiblionumber($biblionumber);
 
 my @results;
 my $fw = GetFrameworkCode($biblionumber);
-my @items= GetItemsInfo($biblionumber);
-my $count=@items;
-$data->{'count'}=$count;
+my @all_items= GetItemsInfo($biblionumber);
+my @items;
+for my $itm (@all_items) {
+    push @items, $itm unless ( $itm->{itemlost} && 
+                               GetHideLostItemsPreference($loggedinuser) &&
+                               !$showallitems && 
+                               ($itemnumber != $itm->{itemnumber}));
+}
+
+my $totalcount=@all_items;
+my $showncount=@items;
+my $hiddencount = $totalcount - $showncount;
+$data->{'count'}=$totalcount;
+$data->{'showncount'}=$showncount;
+$data->{'hiddencount'}=$hiddencount;  # can be zero
 
 my $ccodes= GetKohaAuthorisedValues('items.ccode',$fw);
 my $itemtypes = GetItemTypes;
 
 $data->{'itemtypename'} = $itemtypes->{$data->{'itemtype'}}->{'description'};
 $results[0]=$data;
-my $itemnumber;
 ($itemnumber) and @items = (grep {$_->{'itemnumber'} == $itemnumber} @items);
 foreach my $item (@items){
     $item->{itemlostloop}= GetAuthorisedValues(GetAuthValCode('items.itemlost',$fw),$item->{itemlost}) if GetAuthValCode('items.itemlost',$fw);
@@ -144,7 +158,7 @@ $template->param(loggedinuser => $loggedinuser);
 $template->param(biblionumber => $biblionumber);
 $template->param(biblioitemnumber => $bi);
 $template->param(itemnumber => $itemnumber);
-$template->param(ONLY_ONE => 1) if ( $itemnumber && $count != @items );
+$template->param(ONLY_ONE => 1) if ( $itemnumber && $showncount != @items );
 $template->param(z3950_search_params => C4::Search::z3950_search_args(GetBiblioData($biblionumber)));
 
 output_html_with_http_headers $query, $cookie, $template->output;
index a62e07c..b9e4df6 100644 (file)
@@ -420,6 +420,7 @@ CREATE TABLE `categories` (
   `overduenoticerequired` tinyint(1) default NULL,
   `issuelimit` smallint(6) default NULL,
   `reservefee` decimal(28,6) default NULL,
+  `hidelostitems` tinyint(1) NOT NULL default '0' 
   `category_type` varchar(1) NOT NULL default 'A',
   PRIMARY KEY  (`categorycode`),
   UNIQUE KEY `categorycode` (`categorycode`)
index 6528a2a..bace139 100755 (executable)
@@ -4141,6 +4141,13 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
     SetVersion ($DBversion);
 }
 
+$DBversion = '3.03.00.XXX';
+if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
+    $dbh->do("ALTER TABLE `categories` ADD `hidelostitems` tinyint(1) NOT NULL default '0' AFTER `reservefee`");
+    print "Upgrade to $DBversion done (Add hidelostitems preference to borrower categories)\n";
+    SetVersion ($DBversion);
+}
+
 =head1 FUNCTIONS
 
 =head2 DropAllForeignKeys($table)
index ba9e468..52e8657 100644 (file)
                                                <option value="1">Yes</option>
                        <!-- /TMPL_IF -->
                                        </select></li>
+       <li><label for="hidelostitems">Lost items in staff client</label> &nbsp; <select name="hidelostitems" id="hidelostitems">
+                       <!-- TMPL_IF NAME="hidelostitems" -->
+                                               <option value="0">Shown</option>
+                                               <option value="1" selected="selected">Hidden by default</option>
+                       <!-- TMPL_ELSE -->
+                                               <option value="0" selected="selected">Shown</option>
+                                               <option value="1">Hidden by default</option>
+                       <!-- /TMPL_IF -->
+                                       </select></li>
        <li><label for="reservefee">Hold fee: </label><input type="text" name="reservefee" id="reservefee" size="6" value="<!-- TMPL_VAR NAME="reservefee" -->" /></li>
        <li><label for="category_type">Category type: </label> &nbsp; <select name="category_type" id="category_type">
                                                <!-- TMPL_IF NAME="type_n" --><option value="" selected="selected">Select a Category type</option><!-- TMPL_ELSE --><option value="">Select a Category type</option><!-- /TMPL_IF -->
@@ -208,6 +217,7 @@ Confirm Deletion of Category <!-- TMPL_VAR NAME="categorycode" escape="html" -->
        <tr><th scope="row">Upperage limit: </th><td><!-- TMPL_VAR NAME="upperagelimit" --> years</td></tr>
        <tr><th scope="row">Enrollment fee: </th><td><!-- TMPL_VAR NAME="enrolmentfee" --></td></tr>
        <tr><th scope="row">Receives overdue notices: </th><td><!-- TMPL_IF NAME="overduenoticerequired" -->Yes<!-- TMPL_ELSE -->No<!-- /TMPL_IF --></td></tr>
+       <tr><th scope="row">Lost items in staff client</th><td><!-- TMPL_IF NAME="hidelostitems" -->Hidden by default<!-- TMPL_ELSE -->Shown<!-- /TMPL_IF --></td></tr>
        <tr><th scope="row">Hold fee: </th><td><!-- TMPL_VAR NAME="reservefee" --></td></tr>
 </table>
                <fieldset class="action"><!-- TMPL_IF NAME="totalgtzero" -->
@@ -282,6 +292,7 @@ Confirm Deletion of Category <!-- TMPL_VAR NAME="categorycode" escape="html" -->
                        <th scope="col">Upper age limit</th>
                        <th scope="col">Enrollment fee</th>
                        <th scope="col">Overdue</th>
+                       <th scope="col">Lost Items</th>
                        <th scope="col">Hold fee</th>
             <!-- TMPL_IF NAME="EnhancedMessagingPreferences" -->
             <th scope="col">Messaging</th>
@@ -318,6 +329,7 @@ Confirm Deletion of Category <!-- TMPL_VAR NAME="categorycode" escape="html" -->
                        <td><!-- TMPL_VAR NAME="upperagelimit" --> years</td>
                         <td><!-- TMPL_VAR NAME="enrolmentfee" --></td>
                         <td><!-- TMPL_IF NAME="overduenoticerequired" -->Yes<!-- TMPL_ELSE -->No<!-- /TMPL_IF --></td>
+                        <td><!-- TMPL_IF NAME="hidelostitems" -->Hidden<!-- TMPL_ELSE -->Shown<!-- /TMPL_IF --></td>
                         <td><!-- TMPL_VAR NAME="reservefee" --></td>
                         <!-- TMPL_IF NAME="EnhancedMessagingPreferences" -->
                         <td>
index e3b0a8f..a939b42 100644 (file)
@@ -217,6 +217,7 @@ function verify_images() {
 
 <div id="holdings">
 <!-- TMPL_IF name="count" -->
+    <!-- TMPL_IF name="showncount" -->
         <table>
             <tr>
                 <!-- TMPL_IF NAME="item_level_itypes" --><th>Item type</th><!-- /TMPL_IF -->
@@ -364,6 +365,10 @@ function verify_images() {
                 </tr>
             <!-- /TMPL_LOOP -->
         </table>
+        <!-- /TMPL_IF -->
+                <!-- TMPL_IF NAME="hiddencount" -->
+                   <p><a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=<!-- TMPL_VAR NAME="biblionumber" -->&showallitems=1">Show all items (<!-- TMPL_VAR NAME="hiddencount" --> hidden)</a>
+                <!-- /TMPL_IF -->              
                <!-- TMPL_IF NAME="debug_display" -->
                <br /><br />
                <table>
@@ -371,7 +376,7 @@ function verify_images() {
                        <tr><td>itemdata_copynumber</td><td><!-- TMPL_VAR NAME="itemdata_copynumber" --></td></tr>
                        <tr><td>serial</td><td><!-- TMPL_VAR NAME="serial" --></td></tr>
                </table>
-               <!-- /TMPL_IF -->
+                <!-- /TMPL_IF -->
 <!-- TMPL_ELSE -->
     <p>No physical items for this record</p>
 <!-- /TMPL_IF -->
index c8c0c06..16c2c5b 100644 (file)
@@ -32,7 +32,8 @@
         <!-- TMPL_IF NAME="volumeddesc" --><li><span class="label">Volume:</span> <!-- TMPL_VAR NAME="volumeddesc" --></li><!-- /TMPL_IF -->
         <li><span class="label">Physical Details:</span> <!-- TMPL_VAR NAME="pages" --> <!-- TMPL_VAR NAME="illus" --> <!-- TMPL_VAR NAME="size" -->&nbsp;</li>
         <!-- TMPL_IF NAME="bnotes" --><li><span class="label">Notes:</span> <!-- TMPL_VAR NAME="bnotes" --></li><!-- /TMPL_IF -->
-        <li><span class="label">No. of Items:</span> <!-- TMPL_VAR NAME="count" -->&nbsp;</li>
+        <li><span class="label">No. of Items:</span> <!-- TMPL_VAR NAME="count" -->&nbsp;<!-- TMPL_IF NAME="hiddencount" -->total (<!-- TMPL_VAR NAME="showncount" --> shown / <!-- TMPL_VAR NAME="hiddencount" --> hidden) 
+<a href="/cgi-bin/koha/catalogue/moredetail.pl?biblionumber=<!-- TMPL_VAR NAME="biblionumber" -->&showallitems=1">Show all items</a><!-- /TMPL_IF --></li>
     </ol>
     <!-- /TMPL_LOOP -->
     <br clear="all" />
index 53ff7b7..1001d8e 100644 (file)
@@ -391,6 +391,7 @@ function checkMultiHold() {
             <th>Information</th>
         </tr>
     <!-- TMPL_LOOP Name="itemloop" -->
+        <!-- TMPL_UNLESS NAME="hide"-->
         <tr class="<!-- TMPL_VAR NAME="backgroundcolor" -->">
             <td>
             <!-- TMPL_IF NAME="available" -->
@@ -458,9 +459,14 @@ function checkMultiHold() {
             <!-- /TMPL_IF -->
             </td>
         </tr>
+      <!-- /TMPL_UNLESS --> <!--UNLESS item hide-->
     <!-- /TMPL_LOOP --> <!-- itemloop -->
         </table>
-
+    <!-- TMPL_IF NAME=hiddencount -->
+        <form>
+        <p class="hiddencount"><a href="request.pl?biblionumber=<!-- TMPL_VAR NAME="biblionumber"-->&cardnumber=<!-- TMPL_VAR NAME="cardnumber" -->&showallitems=1">Show all items (<!--TMPL_VAR NAME="hiddencount" --> hidden)</a></p>
+        </form>
+    <!-- /TMPL_IF --> <!-- hiddencount -->
     <!-- /TMPL_LOOP --> <!-- bibitemloop -->
 
   <!-- TMPL_ELSE --><!-- UNLESS multi_hold -->
index 7e51364..a047f4d 100755 (executable)
@@ -57,6 +57,7 @@ my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
 
 my $multihold = $input->param('multi_hold');
 $template->param(multi_hold => $multihold);
+my $showallitems = $input->param('showallitems');
 
 # get Branches and Itemtypes
 my $branches = GetBranches();
@@ -319,6 +320,7 @@ foreach my $biblionumber (@biblionumbers) {
         my $biblioitem = $biblioiteminfos_of->{$biblioitemnumber};
         my $num_available = 0;
         my $num_override  = 0;
+        my $hiddencount   = 0;
         
         $biblioitem->{description} =
           $itemtypes->{ $biblioitem->{itemtype} }{description};
@@ -376,7 +378,7 @@ foreach my $biblionumber (@biblionumbers) {
                 $item->{notforloanvalue} =
                   $notforloan_label_of->{ $item->{notforloan} };
             }
-            
+     
             # Management of lost or long overdue items
             if ( $item->{itemlost} ) {
                 
@@ -386,6 +388,10 @@ foreach my $biblionumber (@biblionumbers) {
                     : $item->{itemlost} == 2 ? "(long overdue)"
                       : "";
                 $item->{backgroundcolor} = 'other';
+                if (GetHideLostItemsPreference($borrowernumber) && !$showallitems) {
+                    $item->{hide} = 1;
+                    $hiddencount++;
+                }
             }
             
             # Check the transit status
@@ -458,6 +464,7 @@ foreach my $biblionumber (@biblionumbers) {
             $biblioloopiter{warn} = 1;
             $biblioloopiter{none_avail} = 1;
         }
+        $template->param( hiddencount => $hiddencount);
         
         push @bibitemloop, $biblioitem;
     }