vol.owning_lib(orgId);
vol.ischanged(true);
+ vol._propagate_owning_lib = true;
// Move the vol node away from its previous org node and append
// it to the children list of the target node.
targetOrgNode.children.push(volNode);
- // If configured to do so, also update the circ_lib for any
- // copies linked to this call number in this edit session.
- if (this.volcopy.defaults.values.circ_lib_mod_with_owning_lib) {
- volNode.children.forEach(copyNode => {
- const copy = copyNode.target;
- if (copy.circ_lib() !== orgId) {
- copy.circ_lib(orgId);
- copy.ischanged(true);
- }
- });
- }
-
this.emitSaveChange();
}
this.context.volNodes().forEach(volNode => {
const newVol = this.idl.clone(volNode.target);
+
+ // idl.clone() does not copy ephemeral fields
+ newVol._propagate_owning_lib = volNode.target._propagate_owning_lib;
+
const copies: IdlObject[] = [];
volNode.children.forEach(copyNode => {
{ auto_merge_vols: true,
create_parts: true,
return_copy_ids: true,
- force_delete_copies: true
+ force_delete_copies: true,
+ propagate_owning_lib:
+ volumes.filter(v => v._propagate_owning_lib).map(v => v.id())
}
).toPromise().then(copyIds => {
my $editor = new_editor( requestor => $reqr, xact => 1 );
my $retarget_holds = [];
my $auto_merge_vols = $options->{auto_merge_vols};
+
+ # List of call number IDs whose owning lib should be propagated
+ # to all of its pre-merge copies.
+ my $propagate_owning_lib = $options->{propagate_owning_lib} || [];
+
my $create_parts = $options->{create_parts};
my $copy_ids = [];
for my $vol (@$volumes) {
- $logger->info("vol-update: investigating volume ".$vol->id);
+ $logger->info("vol-update: investigating volume " . $vol->id);
+
$vol->editor($reqr->id);
$vol->edit_date('now');
- my $copies = $vol->copies;
+ my $copies = $vol->copies || [];
$vol->clear_copies;
+ if (grep {$_ == $vol->id} @$propagate_owning_lib) {
+ # When propagating owning lib changes to linked copies,
+ # it covers all copies, even those not included in the
+ # current edit session. Grab others as needed and
+ # propagate to circ_lib as needed.
+
+ my $copy_ids = [map {$_->id} @$copies];
+
+ # Avoid in-empty-list
+ my @copy_filter = @$copy_ids ? (id => {'not in' => $copy_ids}) : ();
+
+ my $addl_copies = $editor->search_asset_copy(
+ { call_number => $vol->id,
+ @copy_filter,
+ circ_lib => {'<>' => $vol->owning_lib},
+ deleted => 'f'
+ }, {substream => 1} # could be many
+ );
+
+ $copies = [@$copies, @$addl_copies];
+
+ for (@$copies) {
+ if ($_->circ_lib != $vol->owning_lib) {
+ $_->circ_lib($vol->owning_lib);
+ $_->ischanged(1) unless ($_->isdeleted || $_->isnew);
+ }
+ }
+ }
+
$vol->editor($editor->requestor->id);
$vol->edit_date('now');