X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=C4%2FImportBatch.pm;h=028f87fb20093838d0979262c2624b0b8488426b;hb=b60c689434e5d386b81e4f7c38b2b2300c95f153;hp=05dae6719d4316cc5157359ac9b45e8442492141;hpb=983033fd59b9f30049dfb1450e773ee738c51d90;p=koha.git diff --git a/C4/ImportBatch.pm b/C4/ImportBatch.pm index 05dae6719d..028f87fb20 100644 --- a/C4/ImportBatch.pm +++ b/C4/ImportBatch.pm @@ -21,33 +21,16 @@ use strict; use C4::Context; use C4::Koha; use C4::Biblio; -use C4::Matcher; -require Exporter; - +use C4::Items; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); -# set the version for version checking -$VERSION = 3.00; - -=head1 NAME - -C4::ImportBatch - manage batches of imported MARC records - -=head1 SYNOPSIS - -=over 4 - -use C4::ImportBatch; - -=back - -=head1 FUNCTIONS - -=cut - -@ISA = qw(Exporter); -@EXPORT = qw( +BEGIN { + # set the version for version checking + $VERSION = 3.01; + require Exporter; + @ISA = qw(Exporter); + @EXPORT = qw( GetZ3950BatchId GetImportRecordMarc AddImportBatch @@ -69,13 +52,30 @@ use C4::ImportBatch; SetImportBatchStatus GetImportBatchOverlayAction SetImportBatchOverlayAction + GetImportBatchMatcher + SetImportBatchMatcher GetImportRecordOverlayStatus SetImportRecordOverlayStatus GetImportRecordStatus SetImportRecordStatus GetImportRecordMatches SetImportRecordMatches -); + ); +} + +=head1 NAME + +C4::ImportBatch - manage batches of imported MARC records + +=head1 SYNOPSIS + +=over 4 + +use C4::ImportBatch; + +=back + +=head1 FUNCTIONS =head2 GetZ3950BatchId @@ -390,12 +390,16 @@ sub BatchFindBibDuplicates { &$progress_callback($rec_num); } my $marc_record = MARC::Record->new_from_usmarc($rowref->{'marc'}); - my @matches = $matcher->get_matches($marc_record, $max_matches); + my @matches = (); + if (defined $matcher) { + @matches = $matcher->get_matches($marc_record, $max_matches); + } if (scalar(@matches) > 0) { $num_with_matches++; SetImportRecordMatches($rowref->{'import_record_id'}, @matches); SetImportRecordOverlayStatus($rowref->{'import_record_id'}, 'auto_match'); } else { + SetImportRecordMatches($rowref->{'import_record_id'}, ()); SetImportRecordOverlayStatus($rowref->{'import_record_id'}, 'no_match'); } } @@ -407,7 +411,7 @@ sub BatchFindBibDuplicates { =over 4 -my ($num_added, $num_updated, $num_items_added, $num_ignored) = +my ($num_added, $num_updated, $num_items_added, $num_items_errored, $num_ignored) = BatchCommitBibRecords($batch_id, $progress_interval, $progress_callback); =back @@ -431,13 +435,14 @@ sub BatchCommitBibRecords { my $num_added = 0; my $num_updated = 0; my $num_items_added = 0; + my $num_items_errored = 0; my $num_ignored = 0; # commit (i.e., save, all records in the batch) # FIXME biblio only at the moment SetImportBatchStatus('importing'); my $overlay_action = GetImportBatchOverlayAction($batch_id); my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare("SELECT import_record_id, status, overlay_status, marc + my $sth = $dbh->prepare("SELECT import_record_id, status, overlay_status, marc, encoding FROM import_records JOIN import_biblios USING (import_record_id) WHERE import_batch_id = ?"); @@ -451,7 +456,15 @@ sub BatchCommitBibRecords { if ($rowref->{'status'} eq 'error' or $rowref->{'status'} eq 'imported') { $num_ignored++; } + my $marc_record = MARC::Record->new_from_usmarc($rowref->{'marc'}); + + # remove any item tags - rely on BatchCommitItems + my ($item_tag,$item_subfield) = &GetMarcFromKohaField("items.itemnumber",''); + foreach my $item_field ($marc_record->field($item_tag)) { + $marc_record->delete_field($item_field); + } + if ($overlay_action eq 'create_new' or ($overlay_action eq 'replace' and $rowref->{'overlay_status'} eq 'no_match')) { $num_added++; @@ -459,35 +472,47 @@ sub BatchCommitBibRecords { my $sth = $dbh->prepare_cached("UPDATE import_biblios SET matched_biblionumber = ? WHERE import_record_id = ?"); $sth->execute($biblionumber, $rowref->{'import_record_id'}); $sth->finish(); - $num_items_added += BatchCommitItems($rowref->{'import_record_id'}, $biblionumber); + my ($bib_items_added, $bib_items_errored) = BatchCommitItems($rowref->{'import_record_id'}, $biblionumber); + $num_items_added += $bib_items_added; + $num_items_errored += $bib_items_errored; SetImportRecordStatus($rowref->{'import_record_id'}, 'imported'); } else { $num_updated++; my $biblionumber = GetBestRecordMatch($rowref->{'import_record_id'}); my ($count, $oldbiblio) = GetBiblio($biblionumber); my $oldxml = GetXmlBiblio($biblionumber); + + # remove item fields so that they don't get + # added again if record is reverted + my $old_marc = MARC::Record->new_from_xml($oldxml, 'UTF-8', $rowref->{'encoding'}); + foreach my $item_field ($old_marc->field($item_tag)) { + $old_marc->delete_field($item_field); + } + ModBiblio($marc_record, $biblionumber, $oldbiblio->{'frameworkcode'}); my $sth = $dbh->prepare_cached("UPDATE import_records SET marcxml_old = ? WHERE import_record_id = ?"); - $sth->execute($oldxml, $rowref->{'import_record_id'}); + $sth->execute($old_marc->as_xml(), $rowref->{'import_record_id'}); $sth->finish(); my $sth2 = $dbh->prepare_cached("UPDATE import_biblios SET matched_biblionumber = ? WHERE import_record_id = ?"); $sth2->execute($biblionumber, $rowref->{'import_record_id'}); $sth2->finish(); - $num_items_added += BatchCommitItems($rowref->{'import_record_id'}, $biblionumber); + my ($bib_items_added, $bib_items_errored) = BatchCommitItems($rowref->{'import_record_id'}, $biblionumber); + $num_items_added += $bib_items_added; + $num_items_errored += $bib_items_errored; SetImportRecordOverlayStatus($rowref->{'import_record_id'}, 'match_applied'); SetImportRecordStatus($rowref->{'import_record_id'}, 'imported'); } } $sth->finish(); SetImportBatchStatus($batch_id, 'imported'); - return ($num_added, $num_updated, $num_items_added, $num_ignored); + return ($num_added, $num_updated, $num_items_added, $num_items_errored, $num_ignored); } =head2 BatchCommitItems =over 4 -$num_items_added = BatchCommitItems($import_record_id, $biblionumber); +($num_items_added, $num_items_errored) = BatchCommitItems($import_record_id, $biblionumber); =back @@ -499,6 +524,7 @@ sub BatchCommitItems { my $dbh = C4::Context->dbh; my $num_items_added = 0; + my $num_items_errored = 0; my $sth = $dbh->prepare("SELECT import_items_id, import_items.marcxml, encoding FROM import_items JOIN import_records USING (import_record_id) @@ -508,17 +534,29 @@ sub BatchCommitItems { $sth->execute(); while (my $row = $sth->fetchrow_hashref()) { my $item_marc = MARC::Record->new_from_xml($row->{'marcxml'}, 'UTF-8', $row->{'encoding'}); - my ($item_biblionumber, $biblionumber, $itemnumber) = AddItem($item_marc, $biblionumber); - my $updsth = $dbh->prepare("UPDATE import_items SET status = ?, itemnumber = ? WHERE import_items_id = ?"); - $updsth->bind_param(1, 'imported'); - $updsth->bind_param(2, $itemnumber); - $updsth->bind_param(3, $row->{'import_items_id'}); - $updsth->execute(); - $updsth->finish(); - $num_items_added++; + # FIXME - duplicate barcode check needs to become part of AddItemFromMarc() + my $item = TransformMarcToKoha($dbh, $item_marc); + my $duplicate_barcode = exists($item->{'barcode'}) && GetItemnumberFromBarcode($item->{'barcode'}); + if ($duplicate_barcode) { + my $updsth = $dbh->prepare("UPDATE import_items SET status = ?, import_error = ? WHERE import_items_id = ?"); + $updsth->bind_param(1, 'error'); + $updsth->bind_param(2, 'duplicate item barcode'); + $updsth->bind_param(3, $row->{'import_items_id'}); + $updsth->execute(); + $num_items_errored++; + } else { + my ($item_biblionumber, $biblioitemnumber, $itemnumber) = AddItemFromMarc($item_marc, $biblionumber); + my $updsth = $dbh->prepare("UPDATE import_items SET status = ?, itemnumber = ? WHERE import_items_id = ?"); + $updsth->bind_param(1, 'imported'); + $updsth->bind_param(2, $itemnumber); + $updsth->bind_param(3, $row->{'import_items_id'}); + $updsth->execute(); + $updsth->finish(); + $num_items_added++; + } } $sth->finish(); - return $num_items_added; + return ($num_items_added, $num_items_errored); } =head2 BatchRevertBibRecords @@ -842,6 +880,49 @@ sub SetImportBatchOverlayAction { } +=head2 GetImportBatchMatcher + +=over 4 + +my $matcher_id = GetImportBatchMatcher($batch_id); + +=back + +=cut + +sub GetImportBatchMatcher { + my ($batch_id) = @_; + + my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare("SELECT matcher_id FROM import_batches WHERE import_batch_id = ?"); + $sth->execute($batch_id); + my ($matcher_id) = $sth->fetchrow_array(); + $sth->finish(); + return $matcher_id; + +} + + +=head2 SetImportBatchMatcher + +=over 4 + +SetImportBatchMatcher($batch_id, $new_matcher_id); + +=back + +=cut + +sub SetImportBatchMatcher { + my ($batch_id, $new_matcher_id) = @_; + + my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare("UPDATE import_batches SET matcher_id = ? WHERE import_batch_id = ?"); + $sth->execute($new_matcher_id, $batch_id); + $sth->finish(); + +} + =head2 GetImportRecordOverlayStatus =over 4 @@ -995,7 +1076,7 @@ sub SetImportRecordMatches { sub _create_import_record { my ($batch_id, $record_sequence, $marc_record, $record_type, $encoding, $z3950random) = @_; - + my $dbh = C4::Context->dbh; my $sth = $dbh->prepare("INSERT INTO import_records (import_batch_id, record_sequence, marc, marcxml, record_type, encoding, z3950random) @@ -1085,6 +1166,7 @@ sub _update_batch_record_counts { } 1; +__END__ =head1 AUTHOR