- $copy->status($stat);
- $copy->edit_date('now');
- $copy->editor($e->requestor->id);
-
- $e->update_asset_copy($copy) or return $e->die_event;
+ # Copy status checks.
+ if ($copy->status->id() == OILS_COPY_STATUS_CHECKED_OUT) {
+ # Items must be checked in before any attempt is made to change its status.
+ if ($args->{handle_checkin}) {
+ $evt = try_checkin($auth, $copy_id);
+ } else {
+ $evt = OpenILS::Event->new('ITEM_TO_MARK_CHECKED_OUT');
+ }
+ } elsif ($copy->status->id() == OILS_COPY_STATUS_IN_TRANSIT) {
+ # Items in transit need to have the transit aborted before being marked.
+ if ($args->{handle_transit}) {
+ $evt = try_abort_transit($auth, $copy_id);
+ } else {
+ $evt = OpenILS::Event->new('ITEM_TO_MARK_IN_TRANSIT');
+ }
+ } elsif ($U->is_true($copy->status->restrict_copy_delete()) && $self->api_name =~ /discard/) {
+ # Items with restrict_copy_delete status require the
+ # COPY_DELETE_WARNING.override permission to be marked for
+ # discard.
+ if ($args->{handle_copy_delete_warning}) {
+ $evt = $e->event unless $e->allowed(['COPY_DELETE_WARNING.override'], $owning_lib);
+ } else {
+ $evt = OpenILS::Event->new('COPY_DELETE_WARNING');
+ }
+ }
+ return $evt if $evt;