LP1794588 Web client edit single call number changes all when multiple items attached
authorJason Etheridge <jason@EquinoxInitiative.org>
Wed, 16 Jan 2019 13:57:26 +0000 (08:57 -0500)
committerJason Stephenson <jason@sigio.com>
Fri, 8 Mar 2019 18:22:44 +0000 (13:22 -0500)
This patch tweaks the behavior Cat.pm's fleshed_volume_update, aka
open-ils.cat.asset.volume.fleshed.batch.update

Previously, if a volume label was edited, all items attached to that
volume would be essentially affected.  Now, if only a sub-set of items
for the original volume being edited are being edited along with the
volume, then a new volume is potentially created instead, leaving the
original volume (and its unedited copies) untouched.  If no copies are
being edited along with a volume, then the volume itself is edited.

Auto-merging of volumes may still happen in all of these scenarios.

Signed-off-by: Jason Etheridge <jason@EquinoxInitiative.org>
Signed-off-by: Janet Schrader <jschrader@cwmars.org>
Signed-off-by: Jason Stephenson <jason@sigio.com>

Open-ILS/src/perlmods/lib/OpenILS/Application/Cat.pm

index dd8c730..3fcd255 100644 (file)
@@ -1176,9 +1176,50 @@ sub fleshed_volume_update {
 
         } elsif( $vol->ischanged ) {
             $logger->info("vol-update: update volume");
-            my $resp = update_volume($vol, $editor, ($oargs->{all} or grep { $_ eq 'VOLUME_LABEL_EXISTS' } @{$oargs->{events}} or $auto_merge_vols));
-            return $resp->{evt} if $resp->{evt};
-            $vol = $resp->{merge_vol} if $resp->{merge_vol};
+
+            # Three cases here:
+            #   1) We're editing a volume, and not its copies.
+            #   2) We're editing a volume, and a subset of its copies.
+            #   3) We're editing a volume, and all of its copies.
+            #
+            # For 1) and 3), we definitely want to edit the volume
+            # itself (and possibly auto-merge), but for 2), we want
+            # to create a new volume (and possibly auto-merge).
+
+            if (scalar(@$copies) == 0) { # case 1
+
+                my $resp = update_volume($vol, $editor, ($oargs->{all} or grep { $_ eq 'VOLUME_LABEL_EXISTS' } @{$oargs->{events}} or $auto_merge_vols));
+                return $resp->{evt} if $resp->{evt};
+                $vol = $resp->{merge_vol} if $resp->{merge_vol};
+
+            } else {
+
+                my $resp = $editor->json_query({
+                  select => {
+                    acp => [
+                      {transform => 'count', aggregate => 1, column => 'id', alias => 'count'}
+                    ]
+                  },
+                  from => 'acp',
+                  where => {
+                    call_number => $vol->id,
+                    deleted => 'f',
+                    id => {'not in' => [ map { $_->id } @$copies ]}
+                  }
+                });
+                if ($resp->[0]->{count} && $resp->[0]->{count} > 0) { # case 2
+
+                    ($vol,$evt) = $assetcom->create_volume( $auto_merge_vols ? { all => 1} : $oargs, $editor, $vol );
+                    return $evt if $evt;
+
+                } else { # case 3
+
+                    my $resp = update_volume($vol, $editor, ($oargs->{all} or grep { $_ eq 'VOLUME_LABEL_EXISTS' } @{$oargs->{events}} or $auto_merge_vols));
+                    return $resp->{evt} if $resp->{evt};
+                    $vol = $resp->{merge_vol} if $resp->{merge_vol};
+                }
+
+            }
         }
 
         # now update any attached copies