X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=tools%2FbatchMod.pl;h=3ba93a8ec4153bd8aacd5a88983b3ff148afeec3;hb=2b3ab13c3db25f583ac537ab234e825a8ad94e09;hp=b2007bcc2a5b7940318125f540ce1be8943c2481;hpb=836e0d2c03c74daed967f191bdb1ccde75376ad8;p=koha.git diff --git a/tools/batchMod.pl b/tools/batchMod.pl index b2007bcc2a..3ba93a8ec4 100755 --- a/tools/batchMod.pl +++ b/tools/batchMod.pl @@ -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 @@ -38,10 +39,13 @@ 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; @@ -75,8 +79,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); @@ -89,13 +94,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) { @@ -114,42 +122,75 @@ 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); 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 + 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){ $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) { $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 + }; } + + # 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 ($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++; @@ -188,6 +229,12 @@ 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); @@ -310,12 +357,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", @@ -402,6 +450,8 @@ 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 ); } @@ -409,6 +459,7 @@ if ($op eq "action") { foreach my $error (@errors) { $template->param($error => 1); } +$template->param(src => $src); output_html_with_http_headers $input, $cookie, $template->output; exit; @@ -429,7 +480,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))){ @@ -456,8 +508,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); @@ -476,7 +531,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; @@ -497,7 +556,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; @@ -555,7 +619,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 @@ -571,13 +635,5 @@ sub put_in_background { return $job; } -sub progress_callback { - my $job = shift; - my $dbh = shift; - return sub { - my $progress = shift; - $job->progress($progress); - } -}