]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/perlmods/lib/OpenILS/Application/Trigger/Validator.pm
Merge branch 'master' of git.evergreen-ils.org:Evergreen-DocBook into doc_consolidati...
[working/Evergreen.git] / Open-ILS / src / perlmods / lib / OpenILS / Application / Trigger / Validator.pm
1 package OpenILS::Application::Trigger::Validator;
2 use strict; use warnings;
3 use DateTime;
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 }
12
13 my $U = 'OpenILS::Application::AppUtils';
14
15 sub CircIsOpen {
16     my $self = shift;
17     my $env = shift;
18
19     return 0 if (defined($env->{target}->checkin_time));
20
21     if ($env->{params}->{min_target_age}) {
22         $env->{params}->{target_age_field} = 'xact_start';
23         return 0 if (!$self->MinPassiveTargetAge($env));
24     }
25
26     return 1;
27 }
28
29 sub MinPassiveTargetAge {
30     my $self = shift;
31     my $env = shift;
32     my $target = $env->{target};
33     my $delay_field = $env->{params}->{target_age_field} || $env->{event}->event_def->delay_field;
34
35     unless($env->{params}->{min_target_age}) {
36         $logger->warn("'min_target_age' parameter required for MinPassiveTargetAge validator");
37         return 0; # no-op false
38     }
39
40     unless($delay_field) {
41         $logger->warn("'target_age_field' parameter or delay_field required for MinPassiveTargetAge validator");
42         return 0; # no-op false
43     }
44
45     my $delay_field_ts = DateTime::Format::ISO8601->new->parse_datetime(cleanse_ISO8601($target->$delay_field()));
46
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} ) );
49
50     return 1 if $delay_field_ts <= DateTime->now;
51     return 0;
52 }
53
54 sub CircIsOverdue {
55     my $self = shift;
56     my $env = shift;
57     my $circ = $env->{target};
58
59     return 0 if $circ->checkin_time;
60     return 0 if $circ->stop_fines and not $circ->stop_fines =~ /MAXFINES|LONGOVERDUE/;
61
62     if ($env->{params}->{min_target_age}) {
63         $env->{params}->{target_age_field} = 'xact_start';
64         return 0 if (!$self->MinPassiveTargetAge($env));
65     }
66
67     my $due_date = DateTime::Format::ISO8601->new->parse_datetime(cleanse_ISO8601($circ->due_date));
68     return 0 if $due_date > DateTime->now;
69
70     return 1;
71 }
72
73 sub HoldIsAvailable {
74     my $self = shift;
75     my $env = shift;
76
77     my $hold = $env->{target};
78
79     if ($env->{params}->{check_email_notify}) {
80         return 0 unless $U->is_true($hold->email_notify);
81     }
82     if ($env->{params}->{check_sms_notify}) {
83         return 0 unless $hold->sms_notify;
84     }
85     if ($env->{params}->{check_phone_notify}) {
86         return 0 unless $hold->phone_notify;
87     }
88
89     return 1 if 
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
99
100     return 0;
101 }
102
103 sub ReservationIsAvailable {
104     my $self = shift;
105     my $env = shift;
106     my $reservation = $env->{target};
107
108     return 1 if
109         !$reservation->cancel_time and
110         $reservation->capture_time and
111         $reservation->current_resource;
112
113     return 0;
114 }
115
116 sub HoldIsCancelled {
117     my $self = shift;
118     my $env = shift;
119
120     my $hold = $env->{target};
121
122     if ($env->{params}->{check_email_notify}) {
123         return 0 unless $U->is_true($hold->email_notify);
124     }
125     if ($env->{params}->{check_sms_notify}) {
126         return 0 unless $hold->sms_notify;
127     }
128     if ($env->{params}->{check_phone_notify}) {
129         return 0 unless $hold->phone_notify;
130     }
131
132     return ($hold->cancel_time) ? 1 : 0;
133 }
134
135 sub HoldNotifyCheck {
136     my $self = shift;
137     my $env = shift;
138
139     my $hold = $env->{target};
140
141     if ($env->{params}->{check_email_notify}) {
142         return 0 unless $U->is_true($hold->email_notify);
143     }
144     if ($env->{params}->{check_sms_notify}) {
145         return 0 unless $hold->sms_notify;
146     }
147     if ($env->{params}->{check_phone_notify}) {
148         return 0 unless $hold->phone_notify;
149     }
150
151     return 1;
152 }
153
154 1;