my $self = shift;
my $branch = $self->{branchcode};
my $dbh = C4::Context->dbh();
- my $repeat_sth = $dbh->prepare(
-'SELECT * from repeatable_holidays WHERE branchcode = ? AND ISNULL(weekday) = ?'
+ my $weekly_closed_days_sth = $dbh->prepare(
+'SELECT weekday FROM repeatable_holidays WHERE branchcode = ? AND weekday IS NOT NULL'
);
- $repeat_sth->execute( $branch, 0 );
+ $weekly_closed_days_sth->execute( $branch );
$self->{weekly_closed_days} = [ 0, 0, 0, 0, 0, 0, 0 ];
Readonly::Scalar my $sunday => 7;
- while ( my $tuple = $repeat_sth->fetchrow_hashref ) {
+ while ( my $tuple = $weekly_closed_days_sth->fetchrow_hashref ) {
$self->{weekly_closed_days}->[ $tuple->{weekday} ] = 1;
}
- $repeat_sth->execute( $branch, 1 );
+ my $day_month_closed_days_sth = $dbh->prepare(
+'SELECT day, month FROM repeatable_holidays WHERE branchcode = ? AND weekday IS NULL'
+ );
+ $day_month_closed_days_sth->execute( $branch );
$self->{day_month_closed_days} = {};
- while ( my $tuple = $repeat_sth->fetchrow_hashref ) {
+ while ( my $tuple = $day_month_closed_days_sth->fetchrow_hashref ) {
$self->{day_month_closed_days}->{ $tuple->{month} }->{ $tuple->{day} } =
1;
}
- my $special = $dbh->prepare(
-'SELECT day, month, year FROM special_holidays WHERE branchcode = ? AND isexception = ?'
+ my $exception_holidays_sth = $dbh->prepare(
+'SELECT day, month, year FROM special_holidays WHERE branchcode = ? AND isexception = 1'
);
- $special->execute( $branch, 1 );
+ $exception_holidays_sth->execute( $branch );
my $dates = [];
- while ( my ( $day, $month, $year ) = $special->fetchrow ) {
+ while ( my ( $day, $month, $year ) = $exception_holidays_sth->fetchrow ) {
push @{$dates},
DateTime->new(
day => $day,
$self->{exception_holidays} =
DateTime::Set->from_datetimes( dates => $dates );
- $special->execute( $branch, 0 );
+ my $single_holidays_sth = $dbh->prepare(
+'SELECT day, month, year FROM special_holidays WHERE branchcode = ? AND isexception = 0'
+ );
+ $single_holidays_sth->execute( $branch );
$dates = [];
- while ( my ( $day, $month, $year ) = $special->fetchrow ) {
+ while ( my ( $day, $month, $year ) = $single_holidays_sth->fetchrow ) {
push @{$dates},
DateTime->new(
day => $day,
sub is_holiday {
my ( $self, $dt ) = @_;
my $localdt = $dt->clone();
+ my $day = $localdt->day;
+ my $month = $localdt->month;
+
+ $localdt->truncate( to => 'day' );
+
+ if ( $self->{exception_holidays}->contains($localdt) ) {
+ # exceptions are not holidays
+ return 0;
+ }
+
my $dow = $localdt->day_of_week;
+ # Representation fix
+ # TODO: Shouldn't we shift the rest of the $dow also?
if ( $dow == 7 ) {
$dow = 0;
}
+
if ( $self->{weekly_closed_days}->[$dow] == 1 ) {
return 1;
}
- $localdt->truncate( to => 'day' );
- my $day = $localdt->day;
- my $month = $localdt->month;
+
if ( exists $self->{day_month_closed_days}->{$month}->{$day} ) {
return 1;
}
- if ( $self->{exception_holidays}->contains($localdt) ) {
- return 1;
- }
+
if ( $self->{single_holidays}->contains($localdt) ) {
return 1;
}
my $start_dt = shift;
my $end_dt = shift;
+ if ( $start_dt->compare($end_dt) > 0 ) {
+ # swap dates
+ my $int_dt = $end_dt;
+ $end_dt = $start_dt;
+ $start_dt = $int_dt;
+ }
+
# start and end should not be closed days
my $days = $start_dt->delta_days($end_dt)->delta_days;
sub add_holiday {
my $self = shift;
my $new_dt = shift;
- my @dt = $self->{exception_holidays}->as_list;
+ my @dt = $self->{single_holidays}->as_list;
push @dt, $new_dt;
- $self->{exception_holidays} =
+ $self->{single_holidays} =
DateTime::Set->from_datetimes( dates => \@dt );
return;