warn "Updating MARC with xml\n$newxml\n";
- my $e = OpenILS::Utils::Editor->new(authtoken=>$auth, xact=>1);
+ #my $e = OpenILS::Utils::Editor->new(authtoken=>$auth, xact=>1);
+ my $e = new_editor(authtoken=>$auth, xact=>1);
- return $e->event unless $e->checkauth;
- return $e->event unless $e->allowed('CREATE_MARC');
+ return $e->die_event unless $e->checkauth;
+ return $e->die_event unless $e->allowed('CREATE_MARC');
my $rec = $e->retrieve_biblio_record_entry($recid)
- or return $e->event;
+ or return $e->die_event;
my $fixtcn = 1 if $self->api_name =~ /replace/o;
# If we're not updating the TCN, all we care about it the marcdoc
my $override = $self->api_name =~ /override/;
+
my $storage = OpenSRF::AppSession->create('open-ils.storage');
+ # XXX should .update even bother with the tcn_info if it's not going to replace it?
+ # there is the potential for returning a TCN_EXISTS event, even though no replacement happens
+
my( $tcn, $tsource, $marcdoc, $evt) =
- _find_tcn_info($e->session, $newxml, $override, $recid);
+ _find_tcn_info($storage, $newxml, $override, $recid);
return $evt if $evt;
return $evt if $evt;
}
- $logger->activity("user ".$requestor->id.
+ $logger->info("user ".$requestor->id.
" creating new biblio entry with tcn=$tcn and tcn_source $tcn_source");
my $record = Fieldmapper::biblio::record_entry->new;
# if we're overriding, try to find a different TCN to use
if( $override ) {
- $logger->activity("tcn value $tcn already exists, attempting to override");
+ # XXX Create ALLOW_ALT_TCN permission check support
+
+ $logger->info("tcn value $tcn already exists, attempting to override");
if(!$tcn) {
return (
}
-
-
-# XXX deprecated. Remove me.
-
-=head deprecated
-
-__PACKAGE__->register_method(
- method => "biblio_record_tree_retrieve",
- api_name => "open-ils.cat.biblio.record.tree.retrieve",
-);
-
-sub biblio_record_tree_retrieve {
-
- my( $self, $client, $recordid ) = @_;
-
- my $name = "open-ils.storage.direct.biblio.record_entry.retrieve";
- my $session = OpenSRF::AppSession->create( "open-ils.storage" );
- my $request = $session->request( $name, $recordid );
- my $marcxml = $request->gather(1);
-
- if(!$marcxml) {
- throw OpenSRF::EX::ERROR
- ("No record in database with id $recordid");
- }
-
- $session->disconnect();
- $session->kill_me();
-
- warn "turning into nodeset\n";
- my $nodes = OpenILS::Utils::FlatXML->new()->xml_to_nodeset( $marcxml->marc );
- warn "turning nodeset into tree\n";
- my $tree = $utils->nodeset2tree( $nodes->nodeset );
-
- $tree->owner_doc( $marcxml->id() );
-
- warn "returning tree\n";
-
- return $tree;
-}
-=cut
-
-
-=head deprecate
-__PACKAGE__->register_method(
- method => "biblio_record_xml_update",
- api_name => "open-ils.cat.biblio.record.xml.update",
- argc => 3, #(session_id, biblio_tree )
- notes => <<' NOTES');
- Updates the XML of a biblio record entry
- @param authtoken The session token for the staff updating the record
- @param docID The record entry ID to update
- @param xml The new MARCXML record
- NOTES
-
-sub biblio_record_xml_update {
-
- my( $self, $client, $user_session, $id, $xml ) = @_;
-
- my $user_obj = $apputils->check_user_session($user_session);
-
- if($apputils->check_user_perms(
- $user_obj->id, $user_obj->home_ou, "UPDATE_MARC")) {
- return OpenILS::Perm->new("UPDATE_MARC");
- }
-
- $logger->activity("user ".$user_obj->id." updating biblio record $id");
-
-
- my $session = OpenILS::Application::AppUtils->start_db_session();
-
- warn "Retrieving biblio record from storage for update\n";
-
- my $req1 = $session->request(
- "open-ils.storage.direct.biblio.record_entry.batch.retrieve", $id );
- my $biblio = $req1->gather(1);
-
- warn "retrieved doc $id\n";
-
- my $doc = XML::LibXML->new->parse_string($xml);
- throw OpenSRF::EX::ERROR ("Invalid XML in record update: $xml") unless $doc;
-
- $biblio->marc( entityize( $doc->documentElement->toString ) );
- $biblio->editor( $user_obj->id );
- $biblio->edit_date( 'now' );
-
- warn "Sending updated doc $id to db with xml ".$biblio->marc. "\n";
-
- my $req = $session->request(
- "open-ils.storage.direct.biblio.record_entry.update", $biblio );
-
- $req->wait_complete;
- my $status = $req->recv();
- if( !$status || $status->isa("Error") || ! $status->content) {
- OpenILS::Application::AppUtils->rollback_db_session($session);
- if($status->isa("Error")) { throw $status ($status); }
- throw OpenSRF::EX::ERROR ("Error updating biblio record");
- }
- $req->finish();
-
- # Send the doc to the wormer for wormizing
- warn "Starting worm session\n";
-
- my $success = 0;
- my $wresp;
-
- my $wreq = $session->request( "open-ils.worm.wormize.biblio", $id );
-
- my $w = 0;
- try {
- $w = $wreq->gather(1);
-
- } catch Error with {
- my $e = shift;
- warn "wormizing failed, rolling back\n";
- OpenILS::Application::AppUtils->rollback_db_session($session);
-
- if($e) { throw $e ($e); }
- throw OpenSRF::EX::ERROR ("Wormizing Failed for $id" );
- };
-
- warn "Committing db session...\n";
- OpenILS::Application::AppUtils->commit_db_session( $session );
-
-# $client->respond_complete($tree);
-
- warn "Done wormizing\n";
-
- #use Data::Dumper;
- #warn "Returning tree:\n";
- #warn Dumper $tree;
-
- return $biblio;
-
-}
-
-=cut
-
-
-
__PACKAGE__->register_method(
method => "biblio_record_record_metadata",
api_name => "open-ils.cat.biblio.record.metadata.retrieve",
$editor->update_asset_call_number($vol) or return $editor->event;
}
- # then delete the record this volume points to
- my $rec = $editor->retrieve_biblio_record_entry($vol->record)
- or return $editor->event;
-
- unless( $U->is_true($rec->deleted) ) {
- $rec->deleted('t');
- $rec->active('f');
- $editor->update_biblio_record_entry($rec) or return $editor->event;
- }
+ my $evt = delete_rec($editor, $vol->record);
+ return $evt if $evt;
} else {
return OpenILS::Event->new('TITLE_LAST_COPY', payload => $vol->record );
return undef;
}
+# marks a record as deleted
+sub delete_rec {
+ my( $editor, $rec_id ) = @_;
+
+ my $rec = $editor->retrieve_biblio_record_entry($rec_id)
+ or return $editor->event;
+
+ return undef if $U->is_true($rec->deleted);
+
+ $rec->deleted('t');
+ $rec->active('f');
+ $rec->editor( $editor->requestor->id );
+ $rec->edit_date('now');
+ $editor->update_biblio_record_entry($rec) or return $editor->event;
+
+ return undef;
+}
+
sub delete_copy {
my( $editor, $override, $vol, $copy ) = @_;
return OpenILS::Event->new('ITEM_BARCODE_EXISTS') if @$existing;
+ # see if the volume this copy references is marked as deleted
+ my $evol = $editor->retrieve_asset_call_number($copy->call_number)
+ or return $editor->event;
+ return OpenILS::Event->new('VOLUME_DELETED', vol => $evol->id)
+ if $U->is_true($evol->deleted);
+
my $evt;
my $org = (ref $copy->circ_lib) ? $copy->circ_lib->id : $copy->circ_lib;
return $evt if ( $evt = org_cannot_have_vols($editor, $org) );
return $evt if ( $evt = org_cannot_have_vols($editor, $vol->owning_lib) );
+ # see if the record this volume references is marked as deleted
+ my $rec = $editor->retrieve_biblio_record_entry($vol->record)
+ or return $editor->event;
+ return OpenILS::Event->new('BIB_RECORD_DELETED', rec => $rec->id)
+ if $U->is_true($rec->deleted);
+
# first lets see if there are any collisions
my $vols = $editor->search_asset_call_number( {
owning_lib => $vol->owning_lib,
my $label = undef;
if(@$vols) {
+ # we've found an exising volume
if($override) {
$label = $vol->label;
} else {
}
}
- # create a temp label so we can create the volume, then de-dup it
- $vol->label( '__SYSTEM_TMP_'.time) if $label;
+ # create a temp label so we can create the new volume,
+ # then de-dup it with the existing volume
+ $vol->label( "__SYSTEM_TMP_$$".time) if $label;
$vol->creator($editor->requestor->id);
$vol->create_date('now');
my $vols = $e->batch_retrieve_asset_call_number($vol_ids);
my @seen;
+ my @rec_ids;
+
for my $vol (@$vols) {
# if we've already looked at this volume, go to the next
# take note of the fact that we've looked at this set of volumes
push( @seen, $_->id ) for @all;
+ push( @rec_ids, $_->record ) for @all;
# for each volume, see if there are any copies that have a
# remote circ_lib (circ_lib != vol->owning_lib and != $o_lib ).
}
# Now see if any empty records need to be deleted after all of this
- for(@all) {
- $evt = remove_empty_objects($e, $override, $_);
+
+ for(@rec_ids) {
+ $logger->debug("merge: seeing if we should delete record $_...");
+ $evt = delete_rec($e, $_) if title_is_empty($e, $_);
return $evt if $evt;
- }
+ }
+
+ #for(@all) {
+ # $evt = remove_empty_objects($e, $override, $_);
+ #}
}
$logger->info("merge: transfer succeeded");
$vol->owning_lib($org_id);
$vol->label($label);
$vol->record($record_id);
- $vol->creator($e->requestor->id);
- $vol->create_date('now');
- $vol->editor($e->requestor->id);
- $vol->edit_date('now');
- $e->create_asset_call_number($vol) or return $e->die_event;
+ #$vol->creator($e->requestor->id);
+ #$vol->create_date('now');
+ #$vol->editor($e->requestor->id);
+ #$vol->edit_date('now');
+ #$e->create_asset_call_number($vol) or return $e->die_event;
+
+ my $evt = create_volume( 0, $e, $vol );
+ return $evt if $evt;
+
$e->commit;
return $vol->id;
}