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

(-)a/Koha/Calendar.pm (-99 / +21 lines)
Lines 51-145 sub _init { Link Here
51
    return;
51
    return;
52
}
52
}
53
53
54
sub exception_holidays {
54
sub _holidays {
55
    my ($self) = @_;
55
    my ($self) = @_;
56
56
57
    my $cache              = Koha::Caches->get_instance();
57
    my $key      = $self->{branchcode} . "_holidays";
58
    my $exception_holidays = $cache->get_from_cache('exception_holidays');
58
    my $cache    = Koha::Caches->get_instance();
59
    my $holidays = $cache->get_from_cache($key);
59
60
60
    # Populate the cache is necessary
61
    # $holidays looks like:
61
    unless ($exception_holidays) {
62
        my $dbh = C4::Context->dbh;
63
        $exception_holidays = {};
64
65
        # Push holidays for each branch
66
        my $exception_holidays_sth = $dbh->prepare(
67
'SELECT day, month, year, branchcode FROM special_holidays WHERE isexception = 1'
68
        );
69
        $exception_holidays_sth->execute();
70
        my $dates = [];
71
        while ( my ( $day, $month, $year, $branch ) =
72
            $exception_holidays_sth->fetchrow )
73
        {
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 } );
83
    }
84
85
    return $exception_holidays->{ $self->{branchcode} } // {};
86
}
87
88
sub is_exception_holiday {
89
    my ( $self, $date ) = @_;
90
91
    return 1 if ( $self->exception_holidays->{$date} );
92
    return 0;
93
}
94
95
sub single_holidays {
96
    my ($self) = @_;
97
98
    my $cache           = Koha::Caches->get_instance();
99
    my $single_holidays = $cache->get_from_cache('single_holidays');
100
101
    # $single_holidays looks like:
102
    # {
62
    # {
103
    #   CPL =>  [
63
    #    20131122 => 1, # single_holiday
104
    #        [0] 20131122,
64
    #    20131123 => 0, # exception_holiday
105
    #         ...
65
    #    ...
106
    #    ],
107
    #   ...
108
    # }
66
    # }
109
67
110
    # Populate the cache if necessary
68
    # Populate the cache if necessary
111
    unless ($single_holidays) {
69
    unless ($holidays) {
112
        my $dbh = C4::Context->dbh;
70
        my $dbh = C4::Context->dbh;
113
        $single_holidays = {};
71
        $holidays = {};
114
72
115
        # Push holidays for each branch
73
        # Add holidays for each branch
116
        my $single_holidays_sth = $dbh->prepare(
74
        my $holidays_sth = $dbh->prepare(
117
'SELECT day, month, year, branchcode FROM special_holidays WHERE isexception = 0'
75
'SELECT day, month, year, isexception FROM special_holidays WHERE branchcode = ?'
118
        );
76
        );
119
        $single_holidays_sth->execute();
77
        $holidays_sth->execute($self->{branchcode});
120
78
121
        while ( my ( $day, $month, $year, $branch ) =
79
        while ( my ( $day, $month, $year, $exception ) =
122
            $single_holidays_sth->fetchrow )
80
            $holidays_sth->fetchrow )
123
        {
81
        {
124
            my $datestring =
82
            my $datestring =
125
                sprintf( "%04d", $year )
83
                sprintf( "%04d", $year )
126
              . sprintf( "%02d", $month )
84
              . sprintf( "%02d", $month )
127
              . sprintf( "%02d", $day );
85
              . sprintf( "%02d", $day );
128
86
129
            $single_holidays->{$branch}->{$datestring} = 1;
87
            $holidays->{$datestring} = !$exception;
130
        }
88
        }
131
        $cache->set_in_cache( 'single_holidays', $single_holidays,
89
        $cache->set_in_cache( $key, $holidays, { expiry => 76800 } );
132
            { expiry => 76800 } );
133
    }
90
    }
134
91
135
    return $single_holidays->{ $self->{branchcode} } // {};
92
    return $holidays // {};
136
}
137
138
sub is_single_holiday {
139
    my ( $self, $date ) = @_;
140
141
    return 1 if ( $self->single_holidays->{$date} );
142
    return 0;
143
}
93
}
144
94
145
sub addDate {
95
sub addDate {
Lines 258-274 sub is_holiday { Link Here
258
    my $localdt = $dt->clone();
208
    my $localdt = $dt->clone();
259
    my $day   = $localdt->day;
209
    my $day   = $localdt->day;
260
    my $month = $localdt->month;
210
    my $month = $localdt->month;
261
    my $ymd   = $localdt->ymd('')  ;
211
    my $ymd   = $localdt->ymd('');
262
212
263
    #Change timezone to "floating" before doing any calculations or comparisons
213
    #Change timezone to "floating" before doing any calculations or comparisons
264
    $localdt->set_time_zone("floating");
214
    $localdt->set_time_zone("floating");
265
    $localdt->truncate( to => 'day' );
215
    $localdt->truncate( to => 'day' );
266
216
267
217
    return $self->_holidays->{$ymd} if defined($self->_holidays->{$ymd});
268
    if ( $self->is_exception_holiday( $ymd ) == 1 ) {
269
        # exceptions are not holidays
270
        return 0;
271
    }
272
218
273
    my $dow = $localdt->day_of_week;
219
    my $dow = $localdt->day_of_week;
274
    # Representation fix
220
    # Representation fix
Lines 286-295 sub is_holiday { Link Here
286
        return 1;
232
        return 1;
287
    }
233
    }
288
234
289
    if ($self->is_single_holiday(  $ymd  ) == 1 ) {
290
        return 1;
291
    }
292
293
    # damn have to go to work after all
235
    # damn have to go to work after all
294
    return 0;
236
    return 0;
295
}
237
}
Lines 485-509 C<$unit> is a string value 'days' or 'hours' toflag granularity of duration Link Here
485
Currently unit is only used to invoke Staffs return Monday at 10 am rule this
427
Currently unit is only used to invoke Staffs return Monday at 10 am rule this
486
parameter will be removed when issuingrules properly cope with that
428
parameter will be removed when issuingrules properly cope with that
487
429
488
489
=head2 single_holidays
490
491
my $rc = $self->single_holidays(  $ymd  );
492
493
Passed a $date in Ymd (yyyymmdd) format -  returns 1 if date is a single_holiday, or 0 if not.
494
495
=head2 exception_holidays
496
497
my $exceptions = $self->exception_holidays;
498
499
Returns a hashref of exception holidays for the branch
500
501
=head2 is_exception_holiday
502
503
my $rc = $self->is_exception_holiday( $ymd );
504
505
Passed a $date in Ymd (yyyymmdd) format - returns 1 if the date is an exception_holiday, or 0 if not.
506
507
=head2 is_holiday
430
=head2 is_holiday
508
431
509
$yesno = $calendar->is_holiday($dt);
432
$yesno = $calendar->is_holiday($dt);
510
- 

Return to bug 25723