use DateTime::Set;
use DateTime::Duration;
use C4::Context;
-use Koha::Cache;
+use Koha::Caches;
use Carp;
sub new {
return;
}
-
-# FIXME: use of package-level variables for caching the holiday
-# lists breaks persistance engines. As of 2013-12-10, the RM
-# is allowing this with the expectation that prior to release of
-# 3.16, bug 8089 will be fixed and we can switch the caching over
-# to Koha::Cache.
-
-our $exception_holidays;
-
sub exception_holidays {
my ( $self ) = @_;
+
+ my $cache = Koha::Caches->get_instance();
+ my $cached = $cache->get_from_cache('exception_holidays');
+ return $cached if $cached;
+
my $dbh = C4::Context->dbh;
my $branch = $self->{branchcode};
- if ( $exception_holidays ) {
- $self->{exception_holidays} = $exception_holidays;
- return $exception_holidays;
- }
my $exception_holidays_sth = $dbh->prepare(
'SELECT day, month, year FROM special_holidays WHERE branchcode = ? AND isexception = 1'
);
day => $day,
month => $month,
year => $year,
- time_zone => C4::Context->tz()
+ time_zone => "floating",
)->truncate( to => 'day' );
}
$self->{exception_holidays} =
DateTime::Set->from_datetimes( dates => $dates );
- $exception_holidays = $self->{exception_holidays};
- return $exception_holidays;
+ $cache->set_in_cache( 'exception_holidays', $self->{exception_holidays} );
+ return $self->{exception_holidays};
}
sub single_holidays {
my ( $self, $date ) = @_;
my $branchcode = $self->{branchcode};
- my $cache = Koha::Cache->get_instance();
+ my $cache = Koha::Caches->get_instance();
my $single_holidays = $cache->get_from_cache('single_holidays');
# $single_holidays looks like:
day => $day,
month => $month,
year => $year,
- time_zone => C4::Context->tz()
+ time_zone => 'floating',
)->truncate( to => 'day' );
push @ymd_arr, $dt->ymd('');
}
$single_holidays->{$br} = \@ymd_arr;
} # br
$cache->set_in_cache( 'single_holidays', $single_holidays,
- 76800 ) #24 hrs ;
+ { expiry => 76800 } ) #24 hrs ;
}
my $holidays = ( $single_holidays->{$branchcode} );
for my $hols (@$holidays ) {
my $day = $localdt->day;
my $month = $localdt->month;
+ #Change timezone to "floating" before doing any calculations or comparisons
+ $localdt->set_time_zone("floating");
$localdt->truncate( to => 'day' );
return $base_date;
}
+sub days_forward {
+ my $self = shift;
+ my $start_dt = shift;
+ my $num_days = shift;
+
+ return $start_dt unless $num_days > 0;
+
+ my $base_dt = $start_dt->clone();
+
+ while ($num_days--) {
+ $base_dt = $self->next_open_day($base_dt);
+ }
+
+ return $base_dt;
+}
+
sub days_between {
my $self = shift;
my $start_dt = shift;
# start and end should not be closed days
my $days = $start_dt->delta_days($end_dt)->delta_days;
- for (my $dt = $start_dt->clone();
+ for (my $dt = $start_dt->clone()->set_time_zone('floating');
$dt <= $end_dt;
$dt->add(days => 1)
) {
# take into account open/close times then it would be a duration
# of library open hours
my $skipped_days = 0;
- for (my $dt = $start_dt->clone();
+ for (my $dt = $start_dt->clone()->set_time_zone('floating');
$dt <= $end_dt;
$dt->add(days => 1)
) {