1 package OpenILS::Application::Trigger::Validator;
2 use strict; use warnings;
4 use DateTime::Format::ISO8601;
5 use OpenSRF::Utils qw/:datetime/;
6 use OpenSRF::Utils::Logger qw/:logger/;
7 use OpenILS::Const qw/:const/;
8 use OpenILS::Application::AppUtils;
9 sub fourty_two { return 42 }
10 sub NOOP_True { return 1 }
11 sub NOOP_False { return 0 }
13 my $U = 'OpenILS::Application::AppUtils';
19 return 0 if (defined($env->{target}->checkin_time));
21 if ($env->{params}->{min_target_age}) {
22 $env->{params}->{target_age_field} = 'xact_start';
23 return 0 if (!$self->MinPassiveTargetAge($env));
29 sub MinPassiveTargetAge {
32 my $target = $env->{target};
33 my $delay_field = $env->{params}->{target_age_field} || $env->{event}->event_def->delay_field;
35 unless($env->{params}->{min_target_age}) {
36 $logger->warn("'min_target_age' parameter required for MinPassiveTargetAge validator");
37 return 0; # no-op false
40 unless($delay_field) {
41 $logger->warn("'target_age_field' parameter or delay_field required for MinPassiveTargetAge validator");
42 return 0; # no-op false
45 my $delay_field_ts = DateTime::Format::ISO8601->new->parse_datetime(cleanse_ISO8601($target->$delay_field()));
47 # to get the minimum time that the target must have aged to, add the min age to the delay field
48 $delay_field_ts->add( seconds => interval_to_seconds( $env->{params}->{min_target_age} ) );
50 return 1 if $delay_field_ts <= DateTime->now;
57 my $circ = $env->{target};
59 return 0 if $circ->checkin_time;
60 return 0 if $circ->stop_fines and not $circ->stop_fines =~ /MAXFINES|LONGOVERDUE/;
62 if ($env->{params}->{min_target_age}) {
63 $env->{params}->{target_age_field} = 'xact_start';
64 return 0 if (!$self->MinPassiveTargetAge($env));
67 my $due_date = DateTime::Format::ISO8601->new->parse_datetime(cleanse_ISO8601($circ->due_date));
68 return 0 if $due_date > DateTime->now;
77 my $hold = $env->{target};
79 if ($env->{params}->{check_email_notify}) {
80 return 0 unless $U->is_true($hold->email_notify);
82 if ($env->{params}->{check_sms_notify}) {
83 return 0 unless $hold->sms_notify;
85 if ($env->{params}->{check_phone_notify}) {
86 return 0 unless $hold->phone_notify;
90 !$hold->cancel_time and
91 !$hold->fulfillment_time and
92 $hold->current_shelf_lib and
93 (ref $hold->current_shelf_lib ? $hold->current_shelf_lib->id : $hold->current_shelf_lib)
94 eq (ref $hold->pickup_lib ? $hold->pickup_lib->id : $hold->pickup_lib) and
95 $hold->capture_time and # redundant
96 $hold->current_copy and # redundant
97 $hold->shelf_time and # redundant
98 $hold->current_copy->status == OILS_COPY_STATUS_ON_HOLDS_SHELF; # redundant
103 sub ReservationIsAvailable {
106 my $reservation = $env->{target};
109 !$reservation->cancel_time and
110 $reservation->capture_time and
111 $reservation->current_resource;
116 sub HoldIsCancelled {
120 my $hold = $env->{target};
122 if ($env->{params}->{check_email_notify}) {
123 return 0 unless $U->is_true($hold->email_notify);
125 if ($env->{params}->{check_sms_notify}) {
126 return 0 unless $hold->sms_notify;
128 if ($env->{params}->{check_phone_notify}) {
129 return 0 unless $hold->phone_notify;
132 return ($hold->cancel_time) ? 1 : 0;
135 sub HoldNotifyCheck {
139 my $hold = $env->{target};
141 if ($env->{params}->{check_email_notify}) {
142 return 0 unless $U->is_true($hold->email_notify);
144 if ($env->{params}->{check_sms_notify}) {
145 return 0 unless $hold->sms_notify;
147 if ($env->{params}->{check_phone_notify}) {
148 return 0 unless $hold->phone_notify;