View | Details | Raw Unified | Return to bug 25723
Collapse All | Expand All

(-)a/Koha/Calendar.pm (-26 / +48 lines)
Lines 4-10 use warnings; Link Here
4
use 5.010;
4
use 5.010;
5
5
6
use DateTime;
6
use DateTime;
7
use DateTime::Set;
8
use DateTime::Duration;
7
use DateTime::Duration;
9
use C4::Context;
8
use C4::Context;
10
use Koha::Caches;
9
use Koha::Caches;
Lines 55-84 sub _init { Link Here
55
sub exception_holidays {
54
sub exception_holidays {
56
    my ( $self ) = @_;
55
    my ( $self ) = @_;
57
56
58
    my $cache  = Koha::Caches->get_instance();
57
    my $cache              = Koha::Caches->get_instance();
59
    my $cached = $cache->get_from_cache('exception_holidays');
58
    my $exception_holidays = $cache->get_from_cache('exception_holidays');
60
    return $cached if $cached;
61
59
62
    my $dbh = C4::Context->dbh;
60
    # Populate the cache is necessary
63
    my $branch = $self->{branchcode};
61
    unless ($exception_holidays) {
64
    my $exception_holidays_sth = $dbh->prepare(
62
        my $dbh = C4::Context->dbh;
65
'SELECT day, month, year FROM special_holidays WHERE branchcode = ? AND isexception = 1'
63
        $exception_holidays = {};
66
    );
64
67
    $exception_holidays_sth->execute( $branch );
65
        # Push holidays for each branch
68
    my $dates = [];
66
        my $exception_holidays_sth = $dbh->prepare(
69
    while ( my ( $day, $month, $year ) = $exception_holidays_sth->fetchrow ) {
67
'SELECT day, month, year, branchcode FROM special_holidays WHERE isexception = 1'
70
        push @{$dates},
68
        );
71
          DateTime->new(
69
        $exception_holidays_sth->execute();
72
            day       => $day,
70
        my $dates = [];
73
            month     => $month,
71
        while ( my ( $day, $month, $year, $branch ) =
74
            year      => $year,
72
            $exception_holidays_sth->fetchrow )
75
            time_zone => "floating",
73
        {
76
          )->truncate( to => 'day' );
74
            my $datestring =
75
                sprintf( "%04d", $year )
76
              . sprintf( "%02d", $month )
77
              . sprintf( "%02d", $day );
78
79
            $exception_holidays->{$branch}->{$datestring} = 1;
80
        }
81
        $cache->set_in_cache( 'exception_holidays', $exception_holidays,
82
            { expiry => 76800 } );
77
    }
83
    }
78
    $self->{exception_holidays} =
84
79
      DateTime::Set->from_datetimes( dates => $dates );
85
    return $exception_holidays->{$self->{branchcode}} // {};
80
    $cache->set_in_cache( 'exception_holidays', $self->{exception_holidays} );
86
}
81
    return $self->{exception_holidays};
87
88
sub is_exception_holiday {
89
    my ( $self, $date ) = @_;
90
91
    return 1 if ( $self->exception_holidays->{$date} );
92
    return 0;
82
}
93
}
83
94
84
sub single_holidays {
95
sub single_holidays {
Lines 127-132 sub single_holidays { Link Here
127
        $cache->set_in_cache( 'single_holidays', $single_holidays,
138
        $cache->set_in_cache( 'single_holidays', $single_holidays,
128
            { expiry => 76800 } )    #24 hrs ;
139
            { expiry => 76800 } )    #24 hrs ;
129
    }
140
    }
141
130
    my $holidays  = ( $single_holidays->{$branchcode} );
142
    my $holidays  = ( $single_holidays->{$branchcode} );
131
    for my $hols  (@$holidays ) {
143
    for my $hols  (@$holidays ) {
132
            return 1 if ( $date == $hols )   #match ymds;
144
            return 1 if ( $date == $hols )   #match ymds;
Lines 250-262 sub is_holiday { Link Here
250
    my $localdt = $dt->clone();
262
    my $localdt = $dt->clone();
251
    my $day   = $localdt->day;
263
    my $day   = $localdt->day;
252
    my $month = $localdt->month;
264
    my $month = $localdt->month;
265
    my $ymd   = $localdt->ymd('')  ;
253
266
254
    #Change timezone to "floating" before doing any calculations or comparisons
267
    #Change timezone to "floating" before doing any calculations or comparisons
255
    $localdt->set_time_zone("floating");
268
    $localdt->set_time_zone("floating");
256
    $localdt->truncate( to => 'day' );
269
    $localdt->truncate( to => 'day' );
257
270
258
271
259
    if ( $self->exception_holidays->contains($localdt) ) {
272
    if ( $self->is_exception_holiday( $ymd ) == 1 ) {
260
        # exceptions are not holidays
273
        # exceptions are not holidays
261
        return 0;
274
        return 0;
262
    }
275
    }
Lines 277-283 sub is_holiday { Link Here
277
        return 1;
290
        return 1;
278
    }
291
    }
279
292
280
    my $ymd   = $localdt->ymd('')  ;
281
    if ($self->single_holidays(  $ymd  ) == 1 ) {
293
    if ($self->single_holidays(  $ymd  ) == 1 ) {
282
        return 1;
294
        return 1;
283
    }
295
    }
Lines 484-489 my $rc = $self->single_holidays( $ymd ); Link Here
484
496
485
Passed a $date in Ymd (yyyymmdd) format -  returns 1 if date is a single_holiday, or 0 if not.
497
Passed a $date in Ymd (yyyymmdd) format -  returns 1 if date is a single_holiday, or 0 if not.
486
498
499
=head2 exception_holidays
500
501
my $exceptions = $self->exception_holidays;
502
503
Returns a hashref of exception holidays for the branch
504
505
=head2 is_exception_holiday
506
507
my $rc = $self->is_exception_holiday( $ymd );
508
509
Passed a $date in Ymd (yyyymmdd) format - returns 1 if the date is an exception_holiday, or 0 if not.
487
510
488
=head2 is_holiday
511
=head2 is_holiday
489
512
490
- 

Return to bug 25723