Merge remote-tracking branch 'kc/new/awaiting_qa/bug_6316' into kcmaster
[srvgit] / tools / batchMod.pl
index 1139c0f..4910dbd 100755 (executable)
@@ -32,8 +32,6 @@ use C4::BackgroundJob;
 use C4::ClassSource;
 use C4::Dates;
 use C4::Debug;
-use YAML;
-use Switch;
 use MARC::File::XML;
 
 my $input = new CGI;
@@ -83,7 +81,6 @@ my @not_deleted;           # List of the itemnumbers that could not be deleted
 
 my %cookies = parse CGI::Cookie($cookie);
 my $sessionID = $cookies{'CGISESSID'}->value;
-my $dbh = C4::Context->dbh;
 
 
 #--- ----------------------------------------------------------------------------
@@ -107,7 +104,7 @@ if ($op eq "action") {
            $items_display_hashref=BuildItemsData(@itemnumbers);
        } else {
            # Else, we only display the barcode
-           my @simple_items_display = map {{ itemnumber => $_, barcode => GetBarcodeFromItemnumber($_), biblionumber => GetBiblionumberFromItemnumber($_) }} @itemnumbers;
+           my @simple_items_display = map {{ itemnumber => $_, barcode => (GetBarcodeFromItemnumber($_) or ""), biblionumber => (GetBiblionumberFromItemnumber($_) or "") }} @itemnumbers;
            $template->param("simple_items_display" => \@simple_items_display);
        }
 
@@ -123,7 +120,6 @@ if ($op eq "action") {
        # Job size is the number of items we have to process
        my $job_size = scalar(@itemnumbers);
        my $job = undef;
-       $dbh->{AutoCommit} = 0;
        my $callback = sub {};
 
        # If we asked for background processing
@@ -166,59 +162,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) {
+        if ($filecontent eq 'barcode_file') {
+            foreach my $barcode (@contentlist) {
 
-                   my $itemnumber = GetItemnumberFromBarcode($barcode);
-                   if ($itemnumber) {
-                       push @itemnumbers,$itemnumber;
-                   } else {
-                       push @notfoundbarcodes, $barcode;
-                   }
-               }
-
-           }
-
-           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 =();
@@ -228,8 +223,8 @@ my $authorised_values_sth = $dbh->prepare("SELECT authorised_value,lib FROM auth
 my $branches = GetBranchesLoop();  # build once ahead of time, instead of multiple times later.
 
 # Adding a default choice, in case the user does not want to modify the branch
-my @nochange_branch = { branchname => '', value => '', selected => 1 };
-unshift (@$branches, @nochange_branch);
+my $nochange_branch = { branchname => '', value => '', selected => 1 };
+unshift (@$branches, $nochange_branch);
 
 my $pref_itemcallnumber = C4::Context->preference('itemcallnumber');
 
@@ -282,17 +277,18 @@ foreach my $tag (sort keys %{$tagslib}) {
            foreach my $thisbranch (@$branches) {
                push @authorised_values, $thisbranch->{value};
                $authorised_lib{$thisbranch->{value}} = $thisbranch->{branchname};
-               $value = $thisbranch->{value} if $thisbranch->{selected};
            }
+        $value = "";
        }
        elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "itemtypes" ) {
-           push @authorised_values, "" unless ( $tagslib->{$tag}->{$subfield}->{mandatory} );
+           push @authorised_values, "";
            my $sth = $dbh->prepare("select itemtype,description from itemtypes order by description");
            $sth->execute;
            while ( my ( $itemtype, $description ) = $sth->fetchrow_array ) {
                push @authorised_values, $itemtype;
                $authorised_lib{$itemtype} = $description;
            }
+        $value = "";
 
           #---- class_sources
       }
@@ -309,7 +305,7 @@ foreach my $tag (sort keys %{$tagslib}) {
               push @authorised_values, $class_source;
               $authorised_lib{$class_source} = $class_sources->{$class_source}->{'description'};
           }
-                 $value = $default_source unless ($value);
+                 $value = '';
 
           #---- "true" authorised value
       }
@@ -433,7 +429,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))){
@@ -460,8 +457,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);
@@ -480,7 +480,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;
@@ -493,7 +497,7 @@ sub BuildItemsData{
 # Where subfield is not repeated
 # And where we are sure that field should correspond
 # And $tag>10
-sub UpdateMarcWith($$){
+sub UpdateMarcWith {
   my ($marcfrom,$marcto)=@_;
   #warn "FROM :",$marcfrom->as_formatted;
        my (  $itemtag,   $itemtagsubfield) = &GetMarcFromKohaField("items.itemnumber", "");
@@ -501,7 +505,7 @@ 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]);
+                               $field_to_update->update($$subfield[0]=>$$subfield[1]) if ($$subfield[1] != '' or $$subfield[1] == '0');
                }
     }
   #warn "TO edited:",$marcto->as_formatted;
@@ -559,7 +563,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
@@ -581,7 +585,6 @@ sub progress_callback {
     return sub {
         my $progress = shift;
         $job->progress($progress);
-        $dbh->commit();
     }
 }