batch import rework: added suport for loading and dropping items

Signed-off-by: Chris Cormack <crc@liblime.com>
Signed-off-by: Joshua Ferraro <jmf@liblime.com>
This commit is contained in:
Galen Charlton 2007-10-30 19:18:06 -05:00 committed by Joshua Ferraro
parent 5f972e33ab
commit 01c19a265a
5 changed files with 169 additions and 14 deletions

View File

@ -227,19 +227,21 @@ sub ModBiblioInBatch {
=over 4
($batch_id, $num_records, @invalid_records) = BatchStageMarcRecords($marc_flavor, $marc_records, $file_name,
$comments, $branch_code, $leave_as_staging);
($batch_id, $num_records, $num_items, @invalid_records) = BatchStageMarcRecords($marc_flavor, $marc_records, $file_name,
$comments, $branch_code, $parse_items,
$leave_as_staging);
=back
=cut
sub BatchStageMarcRecords {
my ($marc_flavor, $marc_records, $file_name, $comments, $branch_code, $leave_as_staging) = @_;
my ($marc_flavor, $marc_records, $file_name, $comments, $branch_code, $parse_items, $leave_as_staging) = @_;
my $batch_id = AddImportBatch('create_new', 'staging', 'batch', $file_name, $comments);
my @invalid_records = ();
my $num_valid = 0;
my $num_items = 0;
# FIXME - for now, we're dealing only with bibs
my $rec_num = 0;
foreach my $marc_blob (split(/\x1D/, $marc_records)) {
@ -251,6 +253,10 @@ sub BatchStageMarcRecords {
} else {
$num_valid++;
$import_record_id = AddBiblioToBatch($batch_id, $rec_num, $marc_record, $marc_flavor, int(rand(99999)), 0);
if ($parse_items) {
my @import_items_ids = AddItemsToImportBiblio($batch_id, $import_record_id, $marc_record, 0);
$num_items += scalar(@import_items_ids);
}
}
}
unless ($leave_as_staging) {
@ -258,7 +264,48 @@ sub BatchStageMarcRecords {
}
# FIXME branch_code, number of bibs, number of items
_update_batch_record_counts($batch_id);
return ($batch_id, $num_valid, @invalid_records);
return ($batch_id, $num_valid, $num_items, @invalid_records);
}
=head2 AddItemsToImportBiblio
=over 4
my @import_items_ids = AddItemsToImportBiblio($batch_id, $import_record_id, $marc_record, $update_counts);
=back
=cut
sub AddItemsToImportBiblio {
my $batch_id = shift;
my $import_record_id = shift;
my $marc_record = shift;
my $update_counts = @_ ? shift : 0;
my @import_items_ids = ();
my $dbh = C4::Context->dbh;
my ($item_tag,$item_subfield) = &GetMarcFromKohaField("items.itemnumber",'');
foreach my $item_field ($marc_record->field($item_tag)) {
my $item_marc = MARC::Record->new();
$item_marc->append_fields($item_field);
$marc_record->delete_field($item_field);
my $sth = $dbh->prepare_cached("INSERT INTO import_items (import_record_id, status, marcxml)
VALUES (?, ?, ?)");
$sth->bind_param(1, $import_record_id);
$sth->bind_param(2, 'staged');
$sth->bind_param(3, $item_marc->as_xml());
$sth->execute();
push @import_items_ids, $dbh->{'mysql_insertid'};
$sth->finish();
}
if ($#import_items_ids > -1) {
_update_batch_record_counts($batch_id) if $update_counts;
_update_import_record_marc($import_record_id, $marc_record);
}
return @import_items_ids;
}
=head2 BatchFindBibDuplicates
@ -315,7 +362,7 @@ sub BatchFindBibDuplicates {
=over 4
my ($num_added, $num_updated, $num_ignored) = BatchCommitBibRecords($batch_id);
my ($num_added, $num_updated, $num_items_added, $num_ignored) = BatchCommitBibRecords($batch_id);
=back
@ -326,6 +373,7 @@ sub BatchCommitBibRecords {
my $num_added = 0;
my $num_updated = 0;
my $num_items_added = 0;
my $num_ignored = 0;
# commit (i.e., save, all records in the batch)
# FIXME biblio only at the moment
@ -349,6 +397,7 @@ 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);
SetImportRecordStatus($rowref->{'import_record_id'}, 'imported');
} else {
$num_updated++;
@ -362,20 +411,59 @@ sub BatchCommitBibRecords {
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);
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_ignored);
return ($num_added, $num_updated, $num_items_added, $num_ignored);
}
=head2 BatchCommitItems
=over 4
$num_items_added = BatchCommitItems($import_record_id, $biblionumber);
=back
=cut
sub BatchCommitItems {
my ($import_record_id, $biblionumber) = @_;
my $dbh = C4::Context->dbh;
my $num_items_added = 0;
my $sth = $dbh->prepare("SELECT import_items_id, import_items.marcxml, encoding
FROM import_items
JOIN import_records USING (import_record_id)
WHERE import_record_id = ?
ORDER BY import_items_id");
$sth->bind_param(1, $import_record_id);
$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++;
}
$sth->finish();
return $num_items_added;
}
=head2 BatchRevertBibRecords
=over 4
my ($num_deleted, $num_errors, $num_reverted, $num_ignored) = BatchRevertBibRecords($batch_id);
my ($num_deleted, $num_errors, $num_reverted, $num_items_deleted, $num_ignored) = BatchRevertBibRecords($batch_id);
=back
@ -387,6 +475,7 @@ sub BatchRevertBibRecords {
my $num_deleted = 0;
my $num_errors = 0;
my $num_reverted = 0;
my $num_items_deleted = 0;
my $num_ignored = 0;
# commit (i.e., save, all records in the batch)
# FIXME biblio only at the moment
@ -404,6 +493,7 @@ sub BatchRevertBibRecords {
}
if ($overlay_action eq 'create_new' or
($overlay_action eq 'replace' and $rowref->{'overlay_status'} eq 'no_match')) {
$num_items_deleted += BatchRevertItems($rowref->{'import_record_id'}, $rowref->{'matched_biblionumber'});
my $error = DelBiblio($rowref->{'matched_biblionumber'});
if (defined $error) {
$num_errors++;
@ -416,13 +506,48 @@ sub BatchRevertBibRecords {
my $old_record = MARC::Record->new_from_xml($rowref->{'marcxml_old'}, 'UTF-8', $rowref->{'encoding'});
my $biblionumber = $rowref->{'matched_biblionumber'};
my ($count, $oldbiblio) = GetBiblio($biblionumber);
$num_items_deleted += BatchRevertItems($rowref->{'import_record_id'}, $rowref->{'matched_biblionumber'});
ModBiblio($old_record, $biblionumber, $oldbiblio->{'frameworkcode'});
SetImportRecordStatus($rowref->{'import_record_id'}, 'reverted');
}
}
$sth->finish();
SetImportBatchStatus($batch_id, 'reverted');
return ($num_deleted, $num_errors, $num_reverted, $num_ignored);
return ($num_deleted, $num_errors, $num_reverted, $num_items_deleted, $num_ignored);
}
=head2 BatchRevertItems
=over 4
my $num_items_deleted = BatchRevertItems($import_record_id, $biblionumber);
=back
=cut
sub BatchRevertItems {
my ($import_record_id, $biblionumber) = @_;
my $dbh = C4::Context->dbh;
my $num_items_deleted = 0;
my $sth = $dbh->prepare_cached("SELECT import_items_id, itemnumber
FROM import_items
WHERE import_record_id = ?");
$sth->bind_param(1, $import_record_id);
$sth->execute();
while (my $row = $sth->fetchrow_hashref()) {
DelItem($dbh, $biblionumber, $row->{'itemnumber'});
my $updsth = $dbh->prepare("UPDATE import_items SET status = ? WHERE import_items_id = ?");
$updsth->bind_param(1, 'reverted');
$updsth->bind_param(2, $row->{'import_items_id'});
$updsth->execute();
$updsth->finish();
$num_items_deleted++;
}
$sth->finish();
return $num_items_deleted;
}
=head2 GetImportBatchRangeDesc
@ -854,6 +979,16 @@ sub _update_batch_record_counts {
$sth->bind_param(1, $batch_id);
$sth->execute();
$sth->finish();
$sth = $dbh->prepare_cached("UPDATE import_batches SET num_items = (
SELECT COUNT(*)
FROM import_records
JOIN import_items USING (import_record_id)
WHERE import_batch_id = import_batches.import_batch_id
AND record_type = 'biblio')
WHERE import_batch_id = ?");
$sth->bind_param(1, $batch_id);
$sth->execute();
$sth->finish();
}

View File

@ -58,6 +58,7 @@
<table>
<tr><td>Number of records added</td><td><!-- TMPL_VAR name="num_added" --></td></tr>
<tr><td>Number of records updated</td><td><!-- TMPL_VAR name="num_updated" --></td></tr>
<tr><td>Number of items added</td><td><!-- TMPL_VAR name="num_items_added" --></td></tr>
<tr><td>Number of records ignored</td><td><!-- TMPL_VAR name="num_ignored" --></td></tr>
</table>
<!-- /TMPL_IF -->
@ -65,6 +66,7 @@
<p><span class="problem">Undid import of records</span></p>
<table>
<tr><td>Number of records deleted</td><td><!-- TMPL_VAR name="num_deleted" --></td></tr>
<tr><td>Number of items deleted</td><td><!-- TMPL_VAR name="num_items_deleted" --></td></tr>
<tr><td>Number of records not deleted due to items on loan</td><td><!-- TMPL_VAR name="num_errors" --></td></tr>
<tr><td>Number of records changed back</td><td><!-- TMPL_VAR name="num_reverted" --></td></tr>
<tr><td>Number of records ignored</td><td><!-- TMPL_VAR name="num_ignored" --></td></tr>

View File

@ -27,6 +27,7 @@
<!-- TMPL_ELSE -->
<li>Did not check for matches with existing records in catalogue</li>
<!-- /TMPL_IF -->
<li><!-- TMPL_VAR name="num_items" --> item records found and staged</li>
<li><a href="/cgi-bin/koha/tools/manage-marc-import.pl?import_batch_id=<!-- TMPL_VAR name="import_batch_id" -->">Manage staged records</a></li>
<li><a href="/cgi-bin/koha/tools/tools-home.pl">Back</a></li>
</ul>
@ -63,7 +64,21 @@
<input type="radio" id="check_for_matchesno" name="check_for_matches" value="0" checked="checked" /><label for="check_for_matchesno">Do not look for matching records (using ISBN)</label></li>
<li class="radio">
<input type="radio" id="check_for_matchesyes" name="check_for_matches" value="1" /><label for="check_for_matchesyes">Look for matching records</label>
</li></ol></fieldset><input type="submit" value="Import" />
</li></ol></fieldset>
<fieldset class="rows">
<legend>Check for embedded item record data?</legend>
<ol>
<li class="radio">
<input type="radio" id="parse_itemsyes" name="parse_items" value="1" checked="checked" />
<label for="parse_itemsyes">Yes</label>
</li>
<li class="radio">
<input type="radio" id="parse_itemsno" name="parse_items" value="0" />
<label for="parse_itemsno">No</label>
</li>
</ol>
</fieldset>
<input type="submit" value="Stage for import" />
</form>
<!-- /TMPL_IF -->

View File

@ -106,18 +106,20 @@ sub import_batches_list {
sub commit_batch {
my ($template, $import_batch_id) = @_;
my ($num_added, $num_updated, $num_ignored) = BatchCommitBibRecords($import_batch_id);
my ($num_added, $num_updated, $num_items_added, $num_ignored) = BatchCommitBibRecords($import_batch_id);
$template->param(did_commit => 1);
$template->param(num_added => $num_added);
$template->param(num_updated => $num_updated);
$template->param(num_items_added => $num_items_added);
$template->param(num_ignored => $num_ignored);
}
sub revert_batch {
my ($template, $import_batch_id) = @_;
my ($num_deleted, $num_errors, $num_reverted, $num_ignored) = BatchRevertBibRecords($import_batch_id);
my ($num_deleted, $num_errors, $num_reverted, $num_items_deleted, $num_ignored) = BatchRevertBibRecords($import_batch_id);
$template->param(did_revert => 1);
$template->param(num_deleted => $num_deleted);
$template->param(num_items_deleted => $num_items_deleted);
$template->param(num_errors => $num_errors);
$template->param(num_reverted => $num_reverted);
$template->param(num_ignored => $num_ignored);

View File

@ -60,6 +60,7 @@ my $dbh = C4::Context->dbh;
my $uploadmarc=$input->param('uploadmarc');
my $check_for_matches = $input->param('check_for_matches');
my $parse_items = $input->param('parse_items');
my $comments = $input->param('comments');
my $syntax = $input->param('syntax');
my ($template, $loggedinuser, $cookie)
@ -81,7 +82,8 @@ if ($uploadmarc && length($uploadmarc)>0) {
}
# FIXME branch code
my ($batch_id, $num_valid, @import_errors) = BatchStageMarcRecords($syntax, $marcrecord, $filename, $comments, '', 0);
my ($batch_id, $num_valid, $num_items, @import_errors) = BatchStageMarcRecords($syntax, $marcrecord, $filename,
$comments, '', $parse_items, 0);
my $matcher = C4::Matcher->new('biblio');
$matcher->add_matchpoint("020", "a", '', 'isbn', 1000);
my $num_with_matches = 0;
@ -90,11 +92,10 @@ if ($uploadmarc && length($uploadmarc)>0) {
$checked_matches = 1;
$num_with_matches = BatchFindBibDuplicates($batch_id, $matcher);
}
# FIXME we're not committing now
# my ($num_added, $num_updated, $num_ignored) = BatchCommitBibRecords($batch_id);
$template->param(staged => $num_valid,
matched => $num_with_matches,
num_items => $num_items,
import_errors => scalar(@import_errors),
total => $num_valid + scalar(@import_errors),
checked_matches => $checked_matches,