$hold->clear_shelf_time;
$hold->clear_shelf_expire_time;
$hold->clear_current_shelf_lib;
-
+ $U->simplereq('open-ils.circ',
+ 'open-ils.circ.hold_reset_reason_entry.create',$e->authtoken,$hold->id,OILS_HOLD_CHECK_OUT,"Checked out to patron #".$patron->id);
return $self->bail_on_event($e->event)
unless $e->update_action_hold_request($hold);
next if ($_->{hold_type} eq 'P');
}
# So much for easy stuff, attempt a retarget!
+ $U->simplereq('open-ils.circ',
+ 'open-ils.circ.hold_reset_reason_entry.create',$self->editor->authtoken, $_->{id},OILS_HOLD_BETTER_HOLD);
my $tresult = $U->simplereq(
'open-ils.hold-targeter',
'open-ils.hold-targeter.target',
$hold->clear_expire_time;
$hold->clear_cancel_time;
$hold->clear_prev_check_time unless $hold->prev_check_time;
-
+
+ $U->simplereq('open-ils.circ',
+ 'open-ils.circ.hold_reset_reason_entry.create',$self->editor->authtoken, $hold->id, OILS_HOLD_CHECK_IN);
$self->bail_on_events($self->editor->event)
unless $self->editor->update_action_hold_request($hold);
$self->hold($hold);
my $self = shift;
$logger->info("circulator: retargeting holds @{$self->retarget} after opportunistic capture");
my $ses = OpenSRF::AppSession->create('open-ils.hold-targeter');
+ my $cses = OpenSRF::AppSession->create('open-ils.circ');
+ $cses->request('open-ils.circ.hold_reset_reason_entry.create',$self->editor->authtoken, $self->retarget,OILS_HOLD_BETTER_HOLD);
$ses->request('open-ils.hold-targeter.target', {hold => $self->retarget});
# no reason to wait for the return value
return;
$hold->clear_prev_check_time;
$hold->clear_shelf_expire_time;
$hold->clear_current_shelf_lib;
-
+ _create_reset_reason_entry($e,$hold,OILS_HOLD_UNCANCELED);
$e->update_action_hold_request($hold) or return $e->die_event;
$e->commit;
-
+
$U->simplereq('open-ils.hold-targeter',
'open-ils.hold-targeter.target', {hold => $hold_id});
-
return 1;
}
my $e = new_editor(authtoken=>$auth, xact=>1);
return $e->die_event unless $e->checkauth;
-
+
+ my $req = $e->requestor->id;
+
my $hold = $e->retrieve_action_hold_request($holdid)
or return $e->die_event;
- if( $e->requestor->id ne $hold->usr ) {
+ if( $req ne $hold->usr ) {
return $e->die_event unless $e->allowed('CANCEL_HOLDS');
}
$hold->cancel_time('now');
$hold->cancel_cause($cause);
$hold->cancel_note($note);
+ my $note_body = "";
+ if($cause){
+ my $cancel_reason = "ID $cause";
+ my $cancel_cause = $e->retrieve_action_hold_request_cancel_cause($cause);
+ if($cancel_cause){
+ $cancel_reason = $cancel_cause->label;
+ }
+ $note_body .= "Cancel Cause: $cancel_reason";
+ }
+ else{
+ $note_body .= "Cancel reason unknown";
+ }
+ $note_body .= "," unless $note_body eq "" || $note eq "";
+ $note_body .= " Cancel Note: \"$note\"" unless $note eq "";
+ _create_reset_reason_entry($e,$hold,OILS_HOLD_CANCELED,$note_body);
$e->update_action_hold_request($hold)
or return $e->die_event;
my($self, $e, $hold, $values) = @_;
my $hold_status;
my $need_retarget = 0;
+ my $reset_reason = OILS_HOLD_UPDATED;
+ my $note_body = "";
unless($hold) {
$hold = $e->retrieve_action_hold_request($values->{id})
if (defined $values->{$k} && defined $hold->$k() && $values->{$k} ne $hold->$k()) {
# Value changed? RETARGET!
$need_retarget = 1;
+ $reset_reason = OILS_HOLD_UPDATED;
+ $note_body .= "$k value changed."
} elsif (defined $hold->$k() != defined $values->{$k}) {
# Value being set or cleared? RETARGET!
$need_retarget = 1;
+ $reset_reason = OILS_HOLD_UPDATED;
+ $note_body .= "$k value cleared."
}
}
if (defined $values->{$k}) {
$hold->clear_current_copy;
}
}
-
+
if($U->is_true($hold->frozen)) {
$logger->info("clearing current_copy and check_time for frozen hold ".$hold->id);
+ _create_reset_reason_entry($e,$hold,OILS_HOLD_FROZEN,$note_body) unless $U->is_true($orig_hold->frozen);
$hold->clear_current_copy;
$hold->clear_prev_check_time;
# Clear expire_time to prevent frozen holds from expiring.
}
$e->update_action_hold_request($hold) or return $e->die_event;
+ _create_reset_reason_entry($e,$hold,$reset_reason,$note_body) if $need_retarget;
$e->commit;
-
+
if(!$U->is_true($hold->frozen) && $U->is_true($orig_hold->frozen)) {
$logger->info("Running targeter on activated hold ".$hold->id);
+ $U->simplereq('open-ils.circ',
+ 'open-ils.circ.hold_reset_reason_entry.create',$e->authtoken,$hold->id,OILS_HOLD_UNFROZEN);
$U->simplereq('open-ils.hold-targeter',
'open-ils.hold-targeter.target', {hold => $hold->id});
}
# a change to mint-condition changes the set of potential copies, so retarget the hold;
if($U->is_true($hold->mint_condition) and !$U->is_true($orig_hold->mint_condition)) {
_reset_hold($self, $e->requestor, $hold)
- } elsif($need_retarget && !defined $hold->capture_time()) { # If needed, retarget the hold due to changes
+ } elsif($need_retarget && !defined $hold->capture_time()) { # If needed, retarget the hold due to changes
$U->simplereq('open-ils.hold-targeter',
'open-ils.hold-targeter.target', {hold => $hold->id});
}
-
+
+
+
return $hold->id;
}
} else {
if($U->is_true($orig_hold->frozen)) {
$logger->info("Running targeter on activated hold ".$hold->id);
+ _create_reset_reason_entry($e,$hold,OILS_HOLD_UNFROZEN,"Running targeter on activated hold");
$U->simplereq('open-ils.hold-targeter',
'open-ils.hold-targeter.target', {hold => $hold->id});
}
return 1;
}
+__PACKAGE__->register_method(
+ method => 'create_reset_reason_entry',
+ api_name => 'open-ils.circ.hold_reset_reason_entry.create'
+);
+
+sub create_reset_reason_entry
+{
+ my($self, $conn, $auth, $hold, $reset_reason, $note) = @_;
+ my $e = new_editor(authtoken => $auth, xact => 1);
+ #checkauth to set the requestor (if available)
+ $e->checkauth;
+ my @holds;
+ if(ref $hold eq 'ARRAY'){
+ @holds = @{$hold};
+ }
+ else{
+ @holds = ($hold);
+ }
+ for my $holdid (@holds){
+ my ($hold, $evt) = $U->fetch_hold($holdid);
+ return $evt if $evt;
+ _create_reset_reason_entry($e, $hold, $reset_reason, $note);
+ }
+ $e->commit;
+ return 1;
+}
+
+sub _create_reset_reason_entry
+{
+ my($e, $hold, $reset_reason,$note) = @_;
+ my $ts = DateTime->now;
+ my $entry = Fieldmapper::action::hold_request_reset_reason_entry->new;
+ $logger->info("Creating reset reason entry for hold #" . $hold->id);
+ my $last_copy = $hold->current_copy;
+ $entry->hold($hold->id);
+ $entry->reset_reason($reset_reason);
+ $entry->reset_time('now');
+ $entry->requestor($e->requestor->id) if defined $e->requestor;
+ $entry->requestor_workstation($e->requestor->wsid) if defined $e->requestor;
+ $entry->previous_copy($last_copy);
+ $entry->note($note);
+ $e->create_action_hold_request_reset_reason_entry($entry) or return $e->die_event;
+ return 1;
+}
+
__PACKAGE__->register_method(
method => 'reset_hold_batch',
my ($self, $reqr, $hold) = @_;
my $e = new_editor(xact =>1, requestor => $reqr);
-
- $logger->info("reseting hold ".$hold->id);
-
my $hid = $hold->id;
-
+ $logger->info("reseting hold ".$hid." requestor was ".$reqr->usrname." (ID ".$reqr->id.")");
+ my $note_body = "";
if( $hold->capture_time and $hold->current_copy ) {
my $copy = $e->retrieve_asset_copy($hold->current_copy)
if( $copy->status == OILS_COPY_STATUS_ON_HOLDS_SHELF ) {
$logger->info("setting copy to status 'reshelving' on hold retarget");
+ $note_body.=" set copy to status 'reshelving'.";
$copy->status(OILS_COPY_STATUS_RESHELVING);
$copy->editor($e->requestor->id);
$copy->edit_date('now');
$logger->info("Aborting transit [$transid] on hold [$hid] reset...");
my $evt = OpenILS::Application::Circ::Transit::__abort_transit($e, $trans, $copy, 1, 1);
$logger->info("Transit abort completed with result $evt");
+ $note_body.=" Transit abort completed with result $evt.";
unless ("$evt" eq 1) {
$e->rollback;
return $evt;
}
}
+ _create_reset_reason_entry($e,$hold,OILS_HOLD_MANUAL_RESET,$note_body);
$hold->clear_capture_time;
$hold->clear_current_copy;
$hold->clear_shelf_time;
$hold->clear_current_shelf_lib;
$e->update_action_hold_request($hold) or return $e->die_event;
+
$e->commit;
-
+
$U->simplereq('open-ils.hold-targeter',
'open-ils.hold-targeter.target', {hold => $hold->id});
next if $old_hold->id eq $best_hold->id; # don't re-target the hold we want
$logger->info("circulator: clearing current_copy and prev_check_time on hold ".
$old_hold->id." after a better hold [".$best_hold->id."] was found");
+ _create_reset_reason_entry($editor,$old_hold,OILS_HOLD_BETTER_HOLD,"Old hold was reset. Last check time was ".$old_hold->prev_check_time.". a better hold [".$best_hold->id."] was found");
$old_hold->clear_current_copy;
$old_hold->clear_prev_check_time;
$editor->update_action_hold_request($old_hold)