Bug 10599: add option to unselect on loan items on the batch item modification tool
authorJonathan Druart <jonathan.druart@biblibre.com>
Tue, 16 Jul 2013 14:43:30 +0000 (16:43 +0200)
committerGalen Charlton <gmc@esilibrary.com>
Wed, 18 Sep 2013 16:45:24 +0000 (16:45 +0000)
Sometimes when using the batch item modification tool, we would like to
automatically uncheck on loan items.

This patch also adds a new routine in C4::Circulation, IsItemIssued(),
which, when passed an itemnumber, returns whether the item is
currently on loan.

Test plan:
1/ Go to tools/batchMod.pl.
2/ Enter some barcode (at least 1 should be on loan).
3/ Click on the Continue button.
4/ Click on the "Clear on loan" link.
5/ Check that on loan items are unchecked.

Launch the unit test file:
prove t/db_dependent/Circulation/IsItemIssued.t

http://bugs.koha-community.org/show_bug.cgi?id=10572
Signed-off-by: Liz Rea <liz@catalyst.net.nz>
Works as expected, only modifies items that are checked (still). No regression noted.

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Passes koha-qa.pl, works as advertised.

Signed-off-by: Galen Charlton <gmc@esilibrary.com>
C4/Circulation.pm
koha-tmpl/intranet-tmpl/prog/en/js/pages/batchMod.js
koha-tmpl/intranet-tmpl/prog/en/modules/tools/batchMod-edit.tt
t/db_dependent/Circulation/IsItemIssued.t [new file with mode: 0644]
tools/batchMod.pl

index b775b4f..53cd309 100644 (file)
@@ -88,6 +88,7 @@ BEGIN {
                &GetOpenIssue
                &AnonymiseIssueHistory
         &CheckIfIssuedToPatron
+        &IsItemIssued
        );
 
        # subs to deal with returns
@@ -3495,6 +3496,25 @@ sub CheckIfIssuedToPatron {
     return;
 }
 
+=head2 IsItemIssued
+
+  IsItemIssued( $itemnumber )
+
+  Return 1 if the item is on loan, otherwise return 0
+
+=cut
+
+sub IsItemIssued {
+    my $itemnumber = shift;
+    my $dbh = C4::Context->dbh;
+    my $sth = $dbh->prepare(q{
+        SELECT COUNT(*)
+        FROM issues
+        WHERE itemnumber = ?
+    });
+    $sth->execute($itemnumber);
+    return $sth->fetchrow;
+}
 
 1;
 
index 73be545..38f971e 100644 (file)
@@ -102,7 +102,7 @@ function hideAllColumns(){
         "aoColumnDefs": [
             { "aTargets": [ 0 ], "bSortable": false, "bSearchable": false }
         ],
-        "bPaginate": false
+        "bPaginate": false,
     }));
     $("#selectallbutton").click(function(){
       $("#itemst").checkCheckboxes();
@@ -112,6 +112,12 @@ function hideAllColumns(){
       $("#itemst").unCheckCheckboxes();
       return false;
     });
+    $("#clearonloanbutton").click(function(){
+      $("#itemst input[name='itemnumber'][data-is-onloan='1']").each(function(){
+        $(this).attr('checked', false);
+      });
+      return false;
+    });
     $("#selections input").change(function(e){
       var num = $(this).attr("id");
       if(num == 'showall'){
index de67517..8ee771c 100644 (file)
@@ -19,16 +19,7 @@ for( x=0; x<allColumns.length; x++ ){
   allColumns[x] = Number(allColumns[x]) + 2;
 }
 $(document).ready(function(){
-  $("#selectallbutton").click(function() {
-      $("#itemst").find("input:checkbox").each(function() {
-   $(this).attr("checked", "checked");
-      });
-  });
-  $("#clearallbutton").click(function() {
-      $("#itemst").find("input:checkbox").each(function() {
-   $(this).removeAttr("checked");
-      });
-  });
+
   $("input[name='disable_input']").click(function() {
       var row = $(this).attr("id");
       row = row.replace("row","hint");
@@ -42,6 +33,7 @@ $(document).ready(function(){
           $("#"+row).html("");
       }
   });
+
 });
 //]]>
 </script>
@@ -97,7 +89,11 @@ $(document).ready(function(){
      <input type="hidden" name="src" id="src" value="[% src %]" />
 
 [% IF ( item_loop ) %]
-  [% IF ( show ) %]<div id="toolbar"><a id="selectallbutton" href="#">Select All</a> | <a id="clearallbutton" href="#">Clear All</a></div>[% ELSE %][% END %]
+  [% IF show %]
+    <div id="toolbar">
+      <a id="selectallbutton" href="#">Select all</a> | <a id="clearallbutton" href="#">Clear all</a> | <a id="clearonloanbutton" href="#">Clear on loan</a>
+    </div>
+  [% END %]
 <div id="cataloguing_additem_itemlist">
 
 <p id="selections"><strong>Show/hide columns:</strong> <span class="selected"><input type="checkbox" checked="checked" id="showall"/><label for="showall">Show all columns</label></span> <span><input type="checkbox" id="hideall"/><label for="hideall">Hide all columns</label></span> 
@@ -116,7 +112,17 @@ $(document).ready(function(){
     </tr>
       </thead>
       <tbody>
-            [% FOREACH item_loo IN item_loop %] <tr> [% IF ( show ) %][% IF ( item_loo.nomod ) %] <td class="error">Cannot Edit</td>[% ELSE %]<td><input type="checkbox" name="itemnumber" value="[% item_loo.itemnumber %]" id="row[% item_loo.itemnumber %]" checked="checked" /></td>[% END %][% ELSE %]<td>&nbsp;</td>[% END %]
+            [% FOREACH item_loo IN item_loop %]
+              <tr>
+                [% IF show %]
+                  [% IF item_loo.nomod %]
+                    <td class="error">Cannot Edit</td>
+                  [% ELSE %]
+                    <td><input type="checkbox" name="itemnumber" value="[% item_loo.itemnumber %]" id="row[% item_loo.itemnumber %]" checked="checked" data-is-onloan="[% item_loo.onloan %]" /></td>
+                  [% END %]
+                [% ELSE %]
+                  <td>&nbsp;</td>
+                [% END %]
                 <td><label for="row[% item_loo.itemnumber %]"><a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=[% item_loo.biblionumber %]">[% item_loo.title %]</a>[% IF ( item_loo.author ) %], by [% item_loo.author %][% END %]</label></td>
                 [% FOREACH item_valu IN item_loo.item_value %] <td>[% item_valu.field |html %]</td> 
         [% END %] </tr>
diff --git a/t/db_dependent/Circulation/IsItemIssued.t b/t/db_dependent/Circulation/IsItemIssued.t
new file mode 100644 (file)
index 0000000..b02dba8
--- /dev/null
@@ -0,0 +1,40 @@
+use Modern::Perl;
+use Test::More tests => 1;
+
+use C4::Biblio;
+use C4::Circulation;
+use C4::Items;
+use C4::Members;
+use Koha::DateUtils;
+
+use MARC::Record;
+
+*C4::Context::userenv = \&Mock_userenv;
+
+my $dbh = C4::Context->dbh;
+$dbh->{AutoCommit} = 0;
+$dbh->{RaiseError} = 1;
+
+my $borrowernumber = AddMember(
+    firstname =>  'my firstname',
+    surname => 'my surname',
+    categorycode => 'S',
+    branchcode => 'CPL',
+);
+
+
+my $borrower = GetMember( borrowernumber => $borrowernumber );
+my $record = MARC::Record->new();
+my ( $biblionumber, $biblioitemnumber ) = AddBiblio( $record, '' );
+
+my ( undef, undef, $itemnumber ) = AddItem( { homebranch => 'CPL', holdingbranch => 'CPL', barcode => 'i_dont_exist' }, $biblionumber );
+my $item = GetItem( $itemnumber );
+
+is ( IsItemIssued( $item->{itemnumber} ), 1, "Item is issued" );
+
+$dbh->rollback;
+
+# C4::Context->userenv
+sub Mock_userenv {
+    return { branch => 'CPL' };
+}
index 1a804d9..63d6417 100755 (executable)
@@ -545,6 +545,8 @@ sub BuildItemsData{
       $row_data{title} = $row->{title};
       $row_data{isbn} = $row->{isbn};
       $row_data{biblionumber} = $row->{biblionumber};
+      my $is_on_loan = C4::Circulation::IsItemIssued( $row->{itemnumber} );
+      $row_data{onloan} = $is_on_loan ? 1 : 0;
                        push(@item_value_loop,\%row_data);
                }
                my @header_loop=map { { header_value=> $witness{$_}} } @witnesscodessorted;