[Koha-patches] [PATCH] Enhancing Inventory.pl

Henri-Damien LAURENT henridamien.laurent at biblibre.com
Mon Aug 24 22:10:30 CEST 2009


---
 .../prog/en/modules/tools/inventory.tmpl           |  123 +++++++++++-------
 tools/inventory.pl                                 |  134 ++++++++++++++------
 2 files changed, 173 insertions(+), 84 deletions(-)

diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/inventory.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/inventory.tmpl
index dfb7a4c..e754918 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/inventory.tmpl
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/inventory.tmpl
@@ -2,7 +2,7 @@
 <title>Koha &rsaquo; Tools &rsaquo; Inventory</title>
 <!-- TMPL_INCLUDE NAME="doc-head-close.inc" -->
 <!-- TMPL_INCLUDE NAME="calendar.inc" -->
-<script type="text/javascript" src="<!-- TMPL_VAR name="themelang" -->/lib/jquery/plugins/jquery.checkboxes.min.js"></script>
+<script type="text/javascript" src="<!-- TMPL_VAR name="themelang" -->/lib/jquery/plugins/jquery.checkboxes.pack.js"></script>
 <script type="text/javascript">
 //<![CDATA[
 $(document).ready(function(){
@@ -42,9 +42,26 @@ $(document).ready(function(){
     <h1>Inventory/Stocktaking</h1>
 	<!-- TMPL_UNLESS name="loop" -->
 	<div class="yui-g">
-	<div class="yui-u first">
     <form method="post" action="/cgi-bin/koha/tools/inventory.pl">
         <fieldset class="rows">
+            <legend>Use a barcode file</legend>
+	 <ol>
+            <li><label for="uploadbarcodes">Barcode file: </label> <input type="file" id="uploadbarcodes" name="uploadbarcodes" /></li>
+            <li><label for="setdate">Set inventory date to:</label> <input type="text" id="setdate" name="setdate" value="<!-- TMPL_VAR name="today" -->" />
+             <img src="<!-- TMPL_VAR Name="themelang" -->/lib/calendar/cal.gif" id="setdate_button" alt="Show Calendar" />
+            <script type="text/javascript">
+            Calendar.setup(
+            {
+            inputField : "setdate",
+            ifFormat : "<!-- TMPL_VAR NAME="DHTMLcalendar_dateformat" -->",
+            button : "setdate_button"
+            }
+            );
+            </script>
+            </li>
+          </ol>
+        </fieldset>
+        <fieldset class="rows">
         <legend>Select items you want to check</legend>
         <ol><li>
         <label for="branchloop">Library</label><select id="branchloop" name="branchcode" style="width:12em;">
@@ -57,25 +74,6 @@ $(document).ready(function(){
         <!-- /TMPL_LOOP -->
         </select>
         </li>
-        <li>
-        <label for="itemtype">Item type</label>
-        <select name="itemtype" id="itemtype" style="width:12em;">
-            <option value="">Any</option>
-        <!-- TMPL_LOOP name="itemtypeloop" -->
-            <!-- TMPL_IF name="selected" -->
-                <option value="<!-- TMPL_VAR NAME="value" -->" selected="selected"><!-- TMPL_VAR NAME="description" --></option>
-            <!-- TMPL_ELSE -->
-                <option value="<!-- TMPL_VAR NAME="value" -->"><!-- TMPL_VAR NAME="description" --></option>
-            <!-- /TMPL_IF -->
-        <!-- /TMPL_LOOP -->
-        </select>
-        </li>
-        <li>
-            <label for="minlocation">Item location between: </label> 
-                <input type="text" name="minlocation" id="minlocation" value="<!-- TMPL_VAR NAME="minlocation" -->" /> (items.itemcallnumber)  </li>
-           <li><label for="maxlocation">...and: </label> 
-                <input type="text" name="maxlocation" id="maxlocation" value="<!-- TMPL_VAR NAME="maxlocation" -->" />
-        </li>
         <!-- TMPL_IF NAME="authorised_values" -->
         <li>
             <label for="locationloop">Item Location (items.location) is</label> 
@@ -90,7 +88,41 @@ $(document).ready(function(){
         <!-- /TMPL_LOOP -->
         </select>        </li>
         <!-- /TMPL_IF -->
-        <li><label for="datelastseen">Not seen since:</label>
+        <li>
+            <label for="minlocation">Item callnumber between: </label>
+                <input type="text" name="minlocation" id="minlocation" value="<!-- TMPL_VAR NAME="minlocation" -->" /> (items.itemcallnumber)  </li>
+           <li><label for="maxlocation">...and: </label>
+                <input type="text" name="maxlocation" id="maxlocation" value="<!-- TMPL_VAR NAME="maxlocation" -->" />
+        </li>
+        <!-- TMPL_IF name="statuses" -->
+            <label for="statuses" style="display: block;">Item statuses:</label>
+          <li>
+            <fieldset class="rows">
+            <div name="statuses" style="display: block;">
+                  <!-- TMPL_LOOP name="statuses" -->
+                      <!-- TMPL_IF name="values" -->
+                          <div style="float: left; padding: 5px; margin: 5px;" align="right">
+                              <strong style="text-decoration: underline;">
+                                  <!-- TMPL_VAR name="fieldname" -->
+                              </strong>
+                              <ul id="statuses-<!-- TMPL_VAR name="fieldname" -->" style="display: inline;">
+                              <!-- TMPL_LOOP name="values" -->
+                                  <li>
+                                    <strong>
+                                      <!-- TMPL_VAR name="lib" -->
+                                    </strong>
+                                    <input type="checkbox" name="status-<!-- TMPL_VAR name="fieldname" -->-<!-- TMPL_VAR name="id" -->" id="<!-- TMPL_VAR name="id" -->" />
+                                  </li>
+                              <!-- /TMPL_LOOP -->
+                              </ul>
+                          </div>
+                      <!-- /TMPL_IF -->
+                  <!-- /TMPL_LOOP -->
+                </div>
+            </fieldset>
+          </li>
+        <!-- /TMPL_IF -->
+        <li><label for="datelastseen">Inventory date:</label>
             <input type="text" id="datelastseen" name="datelastseen" value="<!-- TMPL_VAR NAME="datelastseen" -->" />
             <img src="<!-- TMPL_VAR Name="themelang" -->/lib/calendar/cal.gif" id="datelastseen_button" alt="Show Calendar" />
             <script type="text/javascript">
@@ -113,35 +145,21 @@ $(document).ready(function(){
             <input type="text" id="pagesize" name="pagesize" value="<!-- TMPL_VAR NAME="pagesize" -->" maxlength="5" size="5" /> items</li>
           <li><label for="offset">Beginning at offset: </label>
             <input type="text" id="offset" name="offset" value="<!-- TMPL_VAR NAME="offset" -->" size="5" maxlength="5" />
-        </li></ol>
+        </li>
+        <li>
+           <label for="CSVexport">Export to csv file</label>
+           <input type="checkbox" name="CSVexport" />
+        </li>
+        <li>
+            <label for="compareinv2barcd">Compare barcodes list to results</label>
+            <input type="checkbox" name="compareinv2barcd" />
+        </li>
+        </ol>
   </fieldset>
             <input type="hidden" name="op" value="do_it" />
             <fieldset class="action"><input type="submit" value="Submit" class="button" /></fieldset>
     </form>
 	</div>
-	
-	<div class="yui-u">
-    <form name="barcodefile" method="post" action="/cgi-bin/koha/tools/inventory.pl" enctype="multipart/form-data">
-        <fieldset class="rows">
-            <legend>Use a barcode file</legend>
-			<ol>
-            <li><label for="uploadbarcodes">Barcode file: </label> <input type="file" id="uploadbarcodes" name="uploadbarcodes" /></li>
-            <li><label for="setdate">Set date last seen to:</label> <input type="text" id="setdate" name="setdate" />
-             <img src="<!-- TMPL_VAR Name="themelang" -->/lib/calendar/cal.gif" id="setdate_button" alt="Show Calendar" />
-            <script type="text/javascript">
-            Calendar.setup(
-            {
-            inputField : "setdate",
-            ifFormat : "<!-- TMPL_VAR NAME="DHTMLcalendar_dateformat" -->",
-            button : "setdate_button"
-            }
-            );
-            </script>
-</li></ol>
-        </fieldset>
-            <fieldset class="action"><input type="submit" value="Submit" class="button" /></fieldset>
-    </form>
-	</div>
 	</div>
 	<!--/TMPL_UNLESS-->
     <!--TMPL_IF Name="Number" --><div class="dialog message"><!--TMPL_VAR Name="Number"--> items modified : datelastseen set to <!--TMPL_VAR Name="date"--></div><!-- /TMPL_IF-->
@@ -172,6 +190,7 @@ $(document).ready(function(){
             <th>Barcode</th>
             <th>Title</th>
             <th>Unseen since</th>
+            <th>Problems</th>
         </tr>
     <!-- TMPL_LOOP NAME="loop" -->
         <tr>
@@ -188,6 +207,15 @@ $(document).ready(function(){
             <td>
                 <p><!-- TMPL_VAR name="datelastseen" --></p>
             </td>
+            <td>
+                 <!-- TMPL_IF name="notfoundbarcode" -->
+                     <p style="background: red;">Not found among barcodes in barcodes file.</p>
+                 <!-- TMPL_ELSIF name="notfoundkoha" -->
+                     <p style="background: red;">Not found in koha.</p>
+                 <!-- TMPL_ELSE -->
+                     <p style="background: green;">None</p>
+                 <!-- /TMPL_IF -->
+            </td>
         </tr>
     <!-- /TMPL_LOOP -->
     </table>
@@ -219,10 +247,9 @@ $(document).ready(function(){
         <input type="hidden" name="op" value="do_it" />
         <input type="submit" value="Continue without Marking &gt;&gt;" class="submit" />
     </form>
+    </div>
     <!-- /TMPL_IF -->
     <!-- /TMPL_IF -->
-
-</div>
 </div>
 <div class="yui-b">
 <!-- TMPL_INCLUDE NAME="tools-menu.inc" -->
diff --git a/tools/inventory.pl b/tools/inventory.pl
index 8474d7d..f4486e3 100755
--- a/tools/inventory.pl
+++ b/tools/inventory.pl
@@ -1,6 +1,7 @@
 #!/usr/bin/perl
 
-# Copyright 2000-2002 Katipo Communications
+# Copyright 2000-2009 Biblibre S.A
+#                                         John Soros <john.soros at biblibre.com>
 #
 # This file is part of Koha.
 #
@@ -18,7 +19,13 @@
 # Suite 330, Boston, MA  02111-1307 USA
 
 use strict;
+use warnings;
+
+#need to open cgi and get the fh before anything else opens a new cgi context (see C4::Auth)
 use CGI;
+my $input = CGI->new;
+my $uploadbarcodes = $input->param('uploadbarcodes');
+
 use C4::Auth;
 use C4::Context;
 use C4::Output;
@@ -29,7 +36,6 @@ use C4::Koha;
 use C4::Branch; # GetBranches
 use C4::Circulation;
 
-my $input = new CGI;
 my $minlocation=$input->param('minlocation') || '';
 my $maxlocation=$input->param('maxlocation');
 $maxlocation=$minlocation.'Z' unless ( $maxlocation || ! $minlocation );
@@ -42,11 +48,12 @@ my $markseen = $input->param('markseen');
 $offset=0 unless $offset;
 my $pagesize = $input->param('pagesize');
 $pagesize=50 unless $pagesize;
-my $uploadbarcodes = $input->param('uploadbarcodes');
 my $branchcode = $input->param('branchcode');
 my $op = $input->param('op');
+my $res;    #contains the results loop
 # warn "uploadbarcodes : ".$uploadbarcodes;
 # use Data::Dumper; warn Dumper($input);
+
 my ($template, $borrowernumber, $cookie)
     = get_template_and_user({template_name => "tools/inventory.tmpl",
                 query => $input,
@@ -64,46 +71,59 @@ for my $branch_hash (keys %$branches) {
 	                   branchname => $branches->{$branch_hash}->{'branchname'}, 
 	                   selected => ($branch_hash eq $branchcode?1:0)};	
 }
- 
-
-my $itemtypes = GetItemTypes;
-my @itemtypesloop;
-foreach my $thisitemtype (sort keys %$itemtypes) {
-    my $selected = 1 if $thisitemtype eq $itemtype;
-    my %row =(value => $thisitemtype,
-                selected => $selected,
-                description => $itemtypes->{$thisitemtype}->{'description'},
-            );
-    push @itemtypesloop, \%row;
-}
-$template->param(itemtypeloop => \@itemtypesloop);
 
 my @authorised_value_list;
 my $authorisedvalue_categories;
 
-my $dbh=C4::Context->dbh;
-my $rqauthcategorie=$dbh->prepare("SELECT authorised_value FROM marc_subfield_structure WHERE frameworkcode=? AND kohafield='items.location'");
-my $rq=$dbh->prepare("SELECT frameworkcode FROM biblio_framework");
-$rq->execute;
-while (my ($fwkcode)=$rq->fetchrow){
-  $rqauthcategorie->execute($fwkcode);
-  while (my ($authcat)=$rqauthcategorie->fetchrow){
-    if ($authcat && $authorisedvalue_categories!~/\b$authcat\W/){
-      $authorisedvalue_categories.="$authcat ";
-      my $data=GetAuthorisedValues($authcat);
+my $frameworks = getframeworks();
+for my $fwk (keys %$frameworks){
+  my $fwkcode = $frameworks->{$fwk}->{'frameworkcode'};
+  my $authcode = GetAuthValCode('items.location', $fwkcode);
+    if ($authcode && $authorisedvalue_categories!~/\b$authcode\W/){
+      $authorisedvalue_categories.="$authcode ";
+      my $data=GetAuthorisedValues($authcode);
       foreach my $value (@$data){
         $value->{selected}=1 if ($value->{authorised_value} eq ($location));
       }      
       push @authorised_value_list,@$data;
-    }  
-  }
+    }
 }
 
+my $statuses = [];
+for my $statfield (qw/items.notforloan items.itemlost items.wthdrawn items.damaged/){
+    my $hash = {};
+    $hash->{fieldname} = $statfield;
+    $hash->{authcode} = GetAuthValCode($statfield);
+    if ($hash->{authcode}){
+        my $arr = GetAuthorisedValues($hash->{authcode});
+        $hash->{values} = $arr;
+        push @$statuses, $hash;
+    }
+}
+$template->param( statuses => $statuses );
+my $staton = {};								#authorized values that are ticked
+for my $authvfield (@$statuses) {
+    $staton->{$authvfield->{fieldname}} = [];
+    for my $authval (@{$authvfield->{values}}){
+        if ( $input->param('status-' . $authvfield->{fieldname} . '-' . $authval->{id}) eq 'on' ){
+            push @{$staton->{$authvfield->{fieldname}}}, $authval->{id};
+        }
+    }
+}
 
+my $statussth = '';
+for my $authvfield (@$statuses) {
+    if ( scalar @{$staton->{$authvfield->{fieldname}}} > 0 ){
+        my $joinedvals = join ',', @{$staton->{$authvfield->{fieldname}}};
+        $statussth .= "$authvfield->{fieldname} in ($joinedvals) and ";
+    }
+}
+$statussth =~ s, and $,,g;
  
 $template->param(branchloop => \@branch_loop,
                 authorised_values=>\@authorised_value_list,   
                 DHTMLcalendar_dateformat => C4::Dates->DHTMLcalendar(),
+                today			=>	C4::Dates->today(),
                 minlocation => $minlocation,
                 maxlocation => $maxlocation,
                 location=>$location,
@@ -113,6 +133,7 @@ $template->param(branchloop => \@branch_loop,
                 pagesize => $pagesize,
                 datelastseen => $datelastseen,
                 );
+my @brcditems;
 if ($uploadbarcodes && length($uploadbarcodes)>0){
     my $dbh=C4::Context->dbh;
     my $date = format_date_in_iso($input->param('setdate')) || C4::Dates->today('iso');
@@ -131,13 +152,17 @@ if ($uploadbarcodes && length($uploadbarcodes)>0){
             my $item = GetItem('', $barcode);
             if (defined $item && $item->{'itemnumber'}){
                 ModItem({ datelastseen => $date }, undef, $item->{'itemnumber'});
+                push @brcditems, $item;
                 $count++;
                 $qonloan->execute($barcode);
                 if ($qonloan->rows){
                     my $data = $qonloan->fetchrow_hashref;
                     my ($doreturn, $messages, $iteminformation, $borrower) =AddReturn($barcode, $data->{homebranch});
-                    if ($doreturn){push @errorloop, {'barcode'=>$barcode,'ERR_ONLOAN_RET'=>1}}
-                    else {push @errorloop, {'barcode'=>$barcode,'ERR_ONLOAN_NOT_RET'=>1}}
+                    if ($doreturn){
+                        push @errorloop, {'barcode'=>$barcode,'ERR_ONLOAN_RET'=>1}
+                    } else {
+                        push @errorloop, {'barcode'=>$barcode,'ERR_ONLOAN_NOT_RET'=>1}
+                    }
                 }
             } else {
                 push @errorloop, {'barcode'=>$barcode,'ERR_BARCODE'=>1};
@@ -149,22 +174,59 @@ if ($uploadbarcodes && length($uploadbarcodes)>0){
     $template->param(date=>format_date($date),Number=>$count);
 # 	$template->param(errorfile=>$errorfile) if ($errorfile);
     $template->param(errorloop=>\@errorloop) if (@errorloop);
-}else{
+}
+#if we want to compare the results to a list of barcodes, or we have no barcode file
+if ( ! ($uploadbarcodes && length($uploadbarcodes)>0 ) || ( $input->param('compareinv2barcd') eq 'on' && length($uploadbarcodes)>0) ) {
     if ($markseen) {
         foreach ($input->param) {
             /SEEN-(.+)/ and &ModDateLastSeen($1);
         }
     }
     if ($markseen or $op) {
-        my $res = GetItemsForInventory($minlocation,$maxlocation,$location,$itemtype,$ignoreissued,$datelastseen,$branchcode,$offset,$pagesize);
+        $res = GetItemsForInventory($minlocation,$maxlocation,$location, $ignoreissued,$datelastseen,$branchcode,$offset,$pagesize,$staton);
         $template->param(loop =>$res,
                         nextoffset => ($offset+$pagesize),
                         prevoffset => ($offset?$offset-$pagesize:0),
                         );
     }
+    if ( ( ( $input->param('compareinv2barcd') eq 'on' ) && ( scalar @brcditems != scalar @$res ) ) && length($uploadbarcodes) > 0 ){
+        if ( scalar @brcditems > scalar @$res ){
+            for my $brcditem (@brcditems) {
+                if (! grep(/$brcditem->{barcode}/, @$res) ){
+                    $brcditem->{notfoundkoha} = 1;
+                    push @$res, $brcditem;
+                }
+            }
+        } else {
+            my @notfound;
+            for my $item (@$res) {
+                if ( ! grep(/$item->{barcode}/, @brcditems) ){
+                    $item->{notfoundbarcode} = 1;
+                    push @notfound, $item;
+                }
+            }
+            $res = [@$res, @notfound];
+        }
+    }
 }
-output_html_with_http_headers $input, $cookie, $template->output;
 
-# Local Variables:
-# tab-width: 8
-# End:
+if ($input->param('CSVexport') eq 'on'){
+    eval {use Text::CSV};
+    my $csv = Text::CSV->new or
+            die Text::CSV->error_diag ();
+    print $input->header(
+        -type       => 'text/csv',
+        -attachment => 'inventory.csv',
+    );
+    for my $re (@$res){
+        my @line;
+        for my $key (keys %$re) {
+            push @line, $re->{$key};
+        }
+        $csv->combine(@line);
+        print $csv->string, "\n";
+    }
+    exit;
+}
+
+output_html_with_http_headers $input, $cookie, $template->output;
-- 
1.6.0.4




More information about the Koha-patches mailing list