Bug 5549 : GetPendingIssues now returns DateTime objects
[koha.git] / tools / batchMod.pl
index 5271d81..440e516 100755 (executable)
@@ -25,6 +25,7 @@ use C4::Auth;
 use C4::Output;
 use C4::Biblio;
 use C4::Items;
+use C4::Circulation;
 use C4::Context;
 use C4::Koha; # XXX subfield_is_koha_internal_p
 use C4::Branch; # XXX subfield_is_koha_internal_p
@@ -32,7 +33,6 @@ use C4::BackgroundJob;
 use C4::ClassSource;
 use C4::Dates;
 use C4::Debug;
-use Switch;
 use MARC::File::XML;
 
 my $input = new CGI;
@@ -90,13 +90,16 @@ if ($op eq "action") {
     my @tags      = $input->param('tag');
     my @subfields = $input->param('subfield');
     my @values    = $input->param('field_value');
+    my @disabled  = $input->param('disable_input');
     # build indicator hash.
     my @ind_tag   = $input->param('ind_tag');
     my @indicator = $input->param('indicator');
 
     # Is there something to modify ?
     # TODO : We shall use this var to warn the user in case no modification was done to the items
-    my $something_to_modify = scalar(grep {!/^$/} @values);
+    my $values_to_modify = scalar(grep {!/^$/} @values);
+    my $values_to_blank  = scalar(@disabled);
+    my $marcitem;
 
     # Once the job is done
     if ($completedJobID) {
@@ -115,8 +118,8 @@ if ($op eq "action") {
        # Calling the template
         add_saved_job_results_to_template($template, $completedJobID);
 
-    # While the job is getting done
     } else {
+    # While the job is getting done
 
        # Job size is the number of items we have to process
        my $job_size = scalar(@itemnumbers);
@@ -129,6 +132,25 @@ if ($op eq "action") {
            $callback = progress_callback($job, $dbh);
        }
 
+       #initializing values for updates
+       my (  $itemtagfield,   $itemtagsubfield) = &GetMarcFromKohaField("items.itemnumber", "");
+       if ($values_to_modify){
+           my $xml = TransformHtmlToXml(\@tags,\@subfields,\@values,\@indicator,\@ind_tag, 'ITEM');
+        utf8::encode($xml);
+           $marcitem = MARC::Record::new_from_xml($xml, 'UTF-8');
+        }
+        if ($values_to_blank){
+           foreach my $disabledsubf (@disabled){
+               if ($marcitem && $marcitem->field($itemtagfield)){
+                   $marcitem->field($itemtagfield)->update( $disabledsubf => "" );
+               }
+               else {
+                   $marcitem = MARC::Record->new();
+                   $marcitem->append_fields( MARC::Field->new( $itemtagfield, '', '', $disabledsubf => "" ) );
+               }
+           }
+        }
+
        # For each item
        my $i = 1; 
        foreach my $itemnumber(@itemnumbers){
@@ -141,16 +163,23 @@ if ($op eq "action") {
                            $deleted_items++;
                        } else {
                            $not_deleted_items++;
-                           push @not_deleted, { biblionumber => $itemdata->{'biblionumber'}, itemnumber => $itemdata->{'itemnumber'}, barcode => $itemdata->{'barcode'}, title => $itemdata->{'title'}, $return => 1 };
+                           push @not_deleted,
+                               { biblionumber => $itemdata->{'biblionumber'},
+                                 itemnumber => $itemdata->{'itemnumber'},
+                                 barcode => $itemdata->{'barcode'},
+                                 title => $itemdata->{'title'},
+                                 $return => 1
+                               };
                        }
                } else {
-                   if ($something_to_modify) {
-                       my $xml = TransformHtmlToXml(\@tags,\@subfields,\@values,\@indicator,\@ind_tag, 'ITEM');
-                       my $marcitem = MARC::Record::new_from_xml($xml, 'UTF-8');
-                       my $localitem = TransformMarcToKoha( $dbh, $marcitem, "", 'items' );
-                       my $localmarcitem=Item2Marc($itemdata);
-                       UpdateMarcWith($marcitem,$localmarcitem);
-                       eval{my ($oldbiblionumber,$oldbibnum,$oldbibitemnum) = ModItemFromMarc($localmarcitem,$itemdata->{biblionumber},$itemnumber)};
+                   if ($values_to_modify || $values_to_blank) {
+                       my $localmarcitem = Item2Marc($itemdata);
+                       UpdateMarcWith( $marcitem, $localmarcitem );
+                       eval{
+                if ( my $item = ModItemFromMarc( $localmarcitem, $itemdata->{biblionumber}, $itemnumber ) ) {
+                    LostItem($itemnumber, 'MARK RETURNED', 'CHARGE FEE') if $item->{itemlost};
+                }
+            };
                    }
                }
                $i++;
@@ -163,59 +192,58 @@ if ($op eq "action") {
 #-------------------------------------------------------------------------------
 
 if ($op eq "show"){
-       my $filefh = $input->upload('uploadfile');
-       my $filecontent = $input->param('filecontent');
-       my @notfoundbarcodes;
+    my $filefh = $input->upload('uploadfile');
+    my $filecontent = $input->param('filecontent');
+    my @notfoundbarcodes;
 
     my @contentlist;
     if ($filefh){
         while (my $content=<$filefh>){
-            chomp $content;
+            $content =~ s/[\r\n]*$//;
             push @contentlist, $content if $content;
         }
 
-       switch ($filecontent) {
-           case "barcode_file" {
-               foreach my $barcode (@contentlist) {
-
-                   my $itemnumber = GetItemnumberFromBarcode($barcode);
-                   if ($itemnumber) {
-                       push @itemnumbers,$itemnumber;
-                   } else {
-                       push @notfoundbarcodes, $barcode;
-                   }
-               }
+        if ($filecontent eq 'barcode_file') {
+            foreach my $barcode (@contentlist) {
 
-           }
-
-           case "itemid_file" {
-               @itemnumbers = @contentlist;
-           }
-       }
+                my $itemnumber = GetItemnumberFromBarcode($barcode);
+                if ($itemnumber) {
+                    push @itemnumbers,$itemnumber;
+                } else {
+                    push @notfoundbarcodes, $barcode;
+                }
+            }
+        }
+        elsif ( $filecontent eq 'itemid_file') {
+            @itemnumbers = @contentlist;
+        }
     } else {
-       if ( my $list=$input->param('barcodelist')){
-        push my @barcodelist, split(/\s\n/, $list);
+        if ( my $list=$input->param('barcodelist')){
+            push my @barcodelist, split(/\s\n/, $list);
 
-       foreach my $barcode (@barcodelist) {
+            foreach my $barcode (@barcodelist) {
 
-           my $itemnumber = GetItemnumberFromBarcode($barcode);
-           if ($itemnumber) {
-               push @itemnumbers,$itemnumber;
-           } else {
-               push @notfoundbarcodes, $barcode;
-           }
-       }
+                my $itemnumber = GetItemnumberFromBarcode($barcode);
+                if ($itemnumber) {
+                    push @itemnumbers,$itemnumber;
+                } else {
+                    push @notfoundbarcodes, $barcode;
+                }
+            }
 
+        }
     }
-}
+
+    # Flag to tell the template there are valid results, hidden or not
+    if(scalar(@itemnumbers) > 0){ $template->param("itemresults" => 1); }
     # Only display the items if there are no more than 1000
     if (scalar(@itemnumbers) <= 1000) {
-       $items_display_hashref=BuildItemsData(@itemnumbers);
+        $items_display_hashref=BuildItemsData(@itemnumbers);
     } else {
-       $template->param("too_many_items" => scalar(@itemnumbers));
-       # Even if we do not display the items, we need the itemnumbers
-       my @itemnumbers_hashref = map {{itemnumber => $_}} @itemnumbers;
-       $template->param("itemnumbers_hashref" => \@itemnumbers_hashref);
+        $template->param("too_many_items" => scalar(@itemnumbers));
+        # Even if we do not display the items, we need the itemnumbers
+        my @itemnumbers_hashref = map {{itemnumber => $_}} @itemnumbers;
+        $template->param("itemnumbers_hashref" => \@itemnumbers_hashref);
     }
 # now, build the item form for entering a new item
 my @loop_data =();
@@ -312,12 +340,13 @@ foreach my $tag (sort keys %{$tagslib}) {
           #---- "true" authorised value
       }
       else {
-          push @authorised_values, "" unless ( $tagslib->{$tag}->{$subfield}->{mandatory} );
+          push @authorised_values, ""; # unless ( $tagslib->{$tag}->{$subfield}->{mandatory} );
           $authorised_values_sth->execute( $tagslib->{$tag}->{$subfield}->{authorised_value} );
           while ( my ( $value, $lib ) = $authorised_values_sth->fetchrow_array ) {
               push @authorised_values, $value;
               $authorised_lib{$value} = $lib;
           }
+          $value="";
       }
       $subfield_data{marc_value} =CGI::scrolling_list(      # FIXME: factor out scrolling_list
           -name     => "field_value",
@@ -431,7 +460,8 @@ sub BuildItemsData{
                        my %this_row;
                        foreach my $field (grep {$_->tag() eq $itemtagfield} $itemmarc->fields()) {
                                # loop through each subfield
-                               if (my $itembranchcode=$field->subfield($branchtagsubfield) && C4::Context->preference("IndependantBranches")) {
+                               my $itembranchcode=$field->subfield($branchtagsubfield);
+                               if ($itembranchcode && C4::Context->preference("IndependantBranches")) {
                                                #verifying rights
                                                my $userenv = C4::Context->userenv();
                                                unless (($userenv->{'flags'} == 1) or (($userenv->{'branch'} eq $itembranchcode))){
@@ -458,8 +488,11 @@ sub BuildItemsData{
 
             # grab title, author, and ISBN to identify bib that the item
             # belongs to in the display
-                       my $biblio=GetBiblioData($$itemdata{biblionumber});
-            $this_row{bibinfo} = join("\n", @$biblio{qw(title author ISBN)});
+                        my $biblio=GetBiblioData($$itemdata{biblionumber});
+            $this_row{title} = $biblio->{title};
+            $this_row{author} = $biblio->{author};
+            $this_row{isbn} = $biblio->{isbn};
+            $this_row{biblionumber} = $biblio->{biblionumber};
 
                        if (%this_row) {
                                push(@big_array, \%this_row);
@@ -478,7 +511,11 @@ sub BuildItemsData{
                        $row_data{itemnumber} = $row->{itemnumber};
                        #reporting this_row values
                        $row_data{'nomod'} = $row->{'nomod'};
-            $row_data{bibinfo} = $row->{bibinfo};
+      $row_data{bibinfo} = $row->{bibinfo};
+      $row_data{author} = $row->{author};
+      $row_data{title} = $row->{title};
+      $row_data{isbn} = $row->{isbn};
+      $row_data{biblionumber} = $row->{biblionumber};
                        push(@item_value_loop,\%row_data);
                }
                my @header_loop=map { { header_value=> $witness{$_}} } @witnesscodessorted;
@@ -499,7 +536,12 @@ sub UpdateMarcWith {
        my @fields_to=$marcto->field($itemtag);
     foreach my $subfield ($fieldfrom->subfields()){
                foreach my $field_to_update (@fields_to){
-                               $field_to_update->update($$subfield[0]=>$$subfield[1]) if ($$subfield[1]);
+                   if ($subfield->[1]){
+                       $field_to_update->update($subfield->[0]=>$subfield->[1]);
+                   }
+                   else {
+                       $field_to_update->delete_subfield(code=> $subfield->[0]);
+                   }
                }
     }
   #warn "TO edited:",$marcto->as_formatted;
@@ -557,7 +599,7 @@ sub put_in_background {
 
         my $reply = CGI->new("");
         print $reply->header(-type => 'text/html');
-        print "{ jobID: '$jobID' }";
+        print '{"jobID":"' . $jobID . '"}';
         exit 0;
     } elsif (defined $pid) {
         # child