df506367047541aae88165edd0b00d81e7c5fade
[working/Evergreen.git] / Open-ILS / src / perlmods / 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 sub fourty_two { return 42 }
9 sub NOOP_True { return 1 }
10 sub NOOP_False { return 0 }
11
12 sub CircIsOpen {
13     my $self = shift;
14     my $env = shift;
15
16     return 0 if (defined($env->{target}->checkin_time));
17     return 0 if ($env->{params}->{max_delay_age} && !$self->MaxPassiveDelayAge($env));
18
19     return 1;
20 }
21
22 sub MaxPassiveDelayAge {
23     my $self = shift;
24     my $env = shift;
25     my $target = $env->{target};
26     my $delay_field = $env->{event}->event_def->delay_field;
27
28     my $delay_field_ts = DateTime::Format::ISO8601->new->parse_datetime(clense_ISO8601($target->$delay_field()));
29
30     # the cutoff date is today - delay - age.  This is also true for negative delays.
31     # For example, today - "7 days" - "1 day" == 8 days ago.  For a 7-day delay, you would
32     # not validate if the date of the object is 8 or more days old.
33     my $max_date = DateTime->now;
34     $max_date->subtract( seconds => interval_to_seconds( $env->{event}->event_def->delay ) );
35     $max_date->subtract( seconds => interval_to_seconds( $env->{params}->{max_delay_age} ) );
36
37     return 0 if $delay_field_ts <= $max_date;
38     return 1;
39 }
40
41 sub CircIsOverdue {
42     my $self = shift;
43     my $env = shift;
44     my $circ = $env->{target};
45
46     return 0 if $circ->checkin_time;
47     return 0 if $circ->stop_fines and not $circ->stop_fines =~ /MAXFINES|LONGOVERDUE/;
48     return 0 if ($env->{params}->{max_delay_age} && !$self->MaxPassiveDelayAge($env));
49
50     my $due_date = DateTime::Format::ISO8601->new->parse_datetime(clense_ISO8601($circ->due_date));
51     return 0 if $due_date > DateTime->now;
52
53     return 1;
54 }
55
56 sub HoldIsAvailable {
57     my $self = shift;
58     my $env = shift;
59
60     my $hold = $env->{target};
61
62     return 1 if 
63         !$hold->cancel_time and
64         $hold->capture_time and 
65         $hold->current_copy and
66         $hold->current_copy->status == OILS_COPY_STATUS_ON_HOLDS_SHELF;
67
68     return 0;
69 }
70
71 1;