Merge branch 'bug_10230' into 3.14-master
[koha.git] / tools / batchMod.pl
index 701d421..e416d44 100755 (executable)
@@ -34,15 +34,19 @@ use C4::ClassSource;
 use C4::Dates;
 use C4::Debug;
 use MARC::File::XML;
+use List::MoreUtils qw/uniq/;
 
 my $input = new CGI;
 my $dbh = C4::Context->dbh;
 my $error        = $input->param('error');
 my @itemnumbers  = $input->param('itemnumber');
+my $biblionumber = $input->param('biblionumber');
 my $op           = $input->param('op');
 my $del          = $input->param('del');
+my $del_records  = $input->param('del_records');
 my $completedJobID = $input->param('completedJobID');
 my $runinbackground = $input->param('runinbackground');
+my $src          = $input->param('src');
 
 
 my $template_name;
@@ -50,6 +54,7 @@ my $template_flag;
 if (!defined $op) {
     $template_name = "tools/batchMod.tmpl";
     $template_flag = { tools => '*' };
+    $op = q{};
 } else {
     $template_name = ($del) ? "tools/batchMod-del.tmpl" : "tools/batchMod-edit.tmpl";
     $template_flag = ($del) ? { tools => 'items_batchdel' }   : { tools => 'items_batchmod' };
@@ -76,8 +81,9 @@ my $items_display_hashref;
 my $frameworkcode="";
 my $tagslib = &GetMarcStructure(1,$frameworkcode);
 
-my $deleted_items = 0;     # Numbers of deleted items
-my $not_deleted_items = 0; # Numbers of items that could not be deleted
+my $deleted_items = 0;     # Number of deleted items
+my $deleted_records = 0;   # Number of deleted records ( with no items attached )
+my $not_deleted_items = 0; # Number of items that could not be deleted
 my @not_deleted;           # List of the itemnumbers that could not be deleted
 
 my %cookies = parse CGI::Cookie($cookie);
@@ -124,12 +130,10 @@ if ($op eq "action") {
        # Job size is the number of items we have to process
        my $job_size = scalar(@itemnumbers);
        my $job = undef;
-       my $callback = sub {};
 
        # If we asked for background processing
        if ($runinbackground) {
            $job = put_in_background($job_size);
-           $callback = progress_callback($job, $dbh);
        }
 
        #initializing values for updates
@@ -156,7 +160,7 @@ if ($op eq "action") {
        foreach my $itemnumber(@itemnumbers){
 
                $job->progress($i) if $runinbackground;
-               my $itemdata=GetItem($itemnumber);
+               my $itemdata = GetItem($itemnumber);
                if ($input->param("del")){
                        my $return = DelItemCheck(C4::Context->dbh, $itemdata->{'biblionumber'}, $itemdata->{'itemnumber'});
                        if ($return == 1) {
@@ -171,15 +175,24 @@ if ($op eq "action") {
                                  $return => 1
                                };
                        }
+
+                       # If there are no items left, delete the biblio
+                       if ( $del_records ) {
+                            my $itemscount = GetItemsCount($itemdata->{'biblionumber'});
+                            if ( $itemscount == 0 ) {
+                               my $error = DelBiblio($itemdata->{'biblionumber'});
+                               $deleted_records++ unless ( $error );
+                            }
+                        }
                } else {
                    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') if $item->{itemlost};
-                }
-            };
+                            if ( my $item = ModItemFromMarc( $localmarcitem, $itemdata->{biblionumber}, $itemnumber ) ) {
+                                LostItem($itemnumber, 'MARK RETURNED', 'CHARGE FEE') if $item->{itemlost};
+                            }
+                        };
                    }
                }
                $i++;
@@ -218,8 +231,14 @@ if ($op eq "show"){
             @itemnumbers = @contentlist;
         }
     } else {
+        if (defined $biblionumber){
+            my @all_items = GetItemsInfo( $biblionumber );
+            foreach my $itm (@all_items) {
+                push @itemnumbers, $itm->{itemnumber};
+            }
+        }
         if ( my $list=$input->param('barcodelist')){
-            push my @barcodelist, split(/\s\n/, $list);
+            push my @barcodelist, uniq( split(/\s\n/, $list) );
 
             foreach my $barcode (@barcodelist) {
 
@@ -248,7 +267,13 @@ if ($op eq "show"){
 # now, build the item form for entering a new item
 my @loop_data =();
 my $i=0;
-my $authorised_values_sth = $dbh->prepare("SELECT authorised_value,lib FROM authorised_values WHERE category=? ORDER BY lib");
+my $branch_limit = C4::Context->userenv ? C4::Context->userenv->{"branch"} : "";
+my $query = qq{SELECT authorised_value, lib FROM authorised_values};
+$query  .= qq{ LEFT JOIN authorised_values_branches ON ( id = av_id ) } if $branch_limit;
+$query  .= qq{ WHERE category = ?};
+$query  .= qq{ AND ( branchcode = ? OR branchcode IS NULL ) } if $branch_limit;
+$query  .= qq{ GROUP BY lib ORDER BY lib, lib_opac};
+my $authorised_values_sth = $dbh->prepare( $query );
 
 my $branches = GetBranchesLoop();  # build once ahead of time, instead of multiple times later.
 
@@ -340,12 +365,13 @@ foreach my $tag (sort keys %{$tagslib}) {
           #---- "true" authorised value
       }
       else {
-          push @authorised_values, "" unless ( $tagslib->{$tag}->{$subfield}->{mandatory} );
-          $authorised_values_sth->execute( $tagslib->{$tag}->{$subfield}->{authorised_value} );
+          push @authorised_values, ""; # unless ( $tagslib->{$tag}->{$subfield}->{mandatory} );
+          $authorised_values_sth->execute( $tagslib->{$tag}->{$subfield}->{authorised_value}, $branch_limit ? $branch_limit : () );
           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",
@@ -375,14 +401,14 @@ foreach my $tag (sort keys %{$tagslib}) {
                        my $temp;
             my $extended_param = plugin_parameters( $dbh, $temp, $tagslib, $subfield_data{id}, \@loop_data );
             my ( $function_name, $javascript ) = plugin_javascript( $dbh, $temp, $tagslib, $subfield_data{id}, \@loop_data );
-            $subfield_data{marc_value} = qq[<input $attributes
+            $subfield_data{marc_value} = qq[<input type="text" $attributes
                 onfocus="Focus$function_name($subfield_data{random}, '$subfield_data{id}');"
                  onblur=" Blur$function_name($subfield_data{random}, '$subfield_data{id}');" />
                 <a href="#" class="buttonDot" onclick="Clic$function_name('$subfield_data{id}'); return false;" title="Tag Editor">...</a>
                 $javascript];
         } else {
             warn "Plugin Failed: $plugin";
-            $subfield_data{marc_value} = "<input $attributes />"; # supply default input form
+            $subfield_data{marc_value} = "<input type=\"text\" $attributes />"; # supply default input form
         }
     }
     elsif ( $tag eq '' ) {       # it's an hidden field
@@ -401,13 +427,15 @@ foreach my $tag (sort keys %{$tagslib}) {
         $subfield_data{marc_value} = "<textarea $attributes_no_value>$value</textarea>\n";
     } else {
         # it's a standard field
-         $subfield_data{marc_value} = "<input $attributes />";
+         $subfield_data{marc_value} = "<input type=\"text\" $attributes />";
     }
 #   $subfield_data{marc_value}="<input type=\"text\" name=\"field_value\">";
     push (@loop_data, \%subfield_data);
     $i++
   }
 } # -- End foreach tag
+$authorised_values_sth->finish;
+
 
 
     # what's the next op ? it's what we are not in : an add if we're editing, otherwise, and edit.
@@ -422,8 +450,8 @@ foreach my $tag (sort keys %{$tagslib}) {
 $template->param(%$items_display_hashref) if $items_display_hashref;
 $template->param(
     op      => $nextop,
-    $op => 1,
 );
+$template->param( $op => 1 ) if $op;
 
 if ($op eq "action") {
 
@@ -432,13 +460,17 @@ if ($op eq "action") {
     $template->param(
        not_deleted_items => $not_deleted_items,
        deleted_items => $deleted_items,
+       delete_records => $del_records,
+       deleted_records => $deleted_records,
        not_deleted_loop => \@not_deleted 
     );
 }
 
 foreach my $error (@errors) {
-    $template->param($error => 1);
+    $template->param($error => 1) if $error;
 }
+$template->param(src => $src);
+$template->param(biblionumber => $biblionumber);
 output_html_with_http_headers $input, $cookie, $template->output;
 exit;
 
@@ -614,13 +646,5 @@ sub put_in_background {
     return $job;
 }
 
-sub progress_callback {
-    my $job = shift;
-    my $dbh = shift;
-    return sub {
-        my $progress = shift;
-        $job->progress($progress);
-    }
-}