Whitespace. gah.
[working/Evergreen.git] / Open-ILS / src / perlmods / OpenILS / Application / Trigger / Validator.pm
index df50636..260af53 100644 (file)
@@ -14,28 +14,38 @@ sub CircIsOpen {
     my $env = shift;
 
     return 0 if (defined($env->{target}->checkin_time));
-    return 0 if ($env->{params}->{max_delay_age} && !$self->MaxPassiveDelayAge($env));
+
+    if ($env->{params}->{min_target_age}) {
+        $env->{params}->{target_age_field} = 'xact_start';
+        return 0 if (!$self->MinPassiveTargetAge($env));
+    }
 
     return 1;
 }
 
-sub MaxPassiveDelayAge {
+sub MinPassiveTargetAge {
     my $self = shift;
     my $env = shift;
     my $target = $env->{target};
-    my $delay_field = $env->{event}->event_def->delay_field;
+    my $delay_field = $env->{params}->{target_age_field} || $env->{event}->event_def->delay_field;
 
-    my $delay_field_ts = DateTime::Format::ISO8601->new->parse_datetime(clense_ISO8601($target->$delay_field()));
+    unless($env->{params}->{min_target_age}) {
+        $logger->warn("'min_target_age' parameter required for MinPassiveTargetAge validator");
+        return 0; # no-op false
+    }
 
-    # the cutoff date is today - delay - age.  This is also true for negative delays.
-    # For example, today - "7 days" - "1 day" == 8 days ago.  For a 7-day delay, you would
-    # not validate if the date of the object is 8 or more days old.
-    my $max_date = DateTime->now;
-    $max_date->subtract( seconds => interval_to_seconds( $env->{event}->event_def->delay ) );
-    $max_date->subtract( seconds => interval_to_seconds( $env->{params}->{max_delay_age} ) );
+    unless($delay_field) {
+        $logger->warn("'target_age_field' parameter or delay_field required for MinPassiveTargetAge validator");
+        return 0; # no-op false
+    }
 
-    return 0 if $delay_field_ts <= $max_date;
-    return 1;
+    my $delay_field_ts = DateTime::Format::ISO8601->new->parse_datetime(cleanse_ISO8601($target->$delay_field()));
+
+    # to get the minimum time that the target must have aged to, add the min age to the delay field
+    $delay_field_ts->add( seconds => interval_to_seconds( $env->{params}->{min_target_age} ) );
+
+    return 1 if $delay_field_ts <= DateTime->now;
+    return 0;
 }
 
 sub CircIsOverdue {
@@ -45,9 +55,13 @@ sub CircIsOverdue {
 
     return 0 if $circ->checkin_time;
     return 0 if $circ->stop_fines and not $circ->stop_fines =~ /MAXFINES|LONGOVERDUE/;
-    return 0 if ($env->{params}->{max_delay_age} && !$self->MaxPassiveDelayAge($env));
 
-    my $due_date = DateTime::Format::ISO8601->new->parse_datetime(clense_ISO8601($circ->due_date));
+    if ($env->{params}->{min_target_age}) {
+        $env->{params}->{target_age_field} = 'xact_start';
+        return 0 if (!$self->MinPassiveTargetAge($env));
+    }
+
+    my $due_date = DateTime::Format::ISO8601->new->parse_datetime(cleanse_ISO8601($circ->due_date));
     return 0 if $due_date > DateTime->now;
 
     return 1;
@@ -68,4 +82,13 @@ sub HoldIsAvailable {
     return 0;
 }
 
+sub HoldIsCancelled {
+    my $self = shift;
+    my $env = shift;
+
+    my $hold = $env->{target};
+
+    return ($hold->cancel_time) ? 1 : 0;
+}
+
 1;