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:
parent
5f972e33ab
commit
01c19a265a
|
|
@ -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();
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 -->
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue