File Coverage

blib/lib/Date/Holidays/SK.pm
Criterion Covered Total %
statement 43 47 91.4
branch 20 22 90.9
condition n/a
subroutine 7 8 87.5
pod 3 3 100.0
total 73 80 91.2


line stmt bran cond sub pod time code
1             package Date::Holidays::SK;
2              
3 1     1   109371 use strict;
  1         3  
  1         60  
4 1     1   6 use warnings;
  1         2  
  1         65  
5              
6             our $VERSION = '0.02';
7              
8 1     1   758 use Date::Simple;
  1         6912  
  1         60  
9 1     1   666 use Date::Easter;
  1         4393  
  1         110  
10              
11 1     1   11 use Exporter qw(import);
  1         2  
  1         678  
12             our @EXPORT_OK = qw(
13             is_sk_holiday
14             is_sk_holiday_today
15             sk_holidays
16             );
17              
18             # Fixed-date holidays {'MMDD' => 'NAME'}
19             my $FIX = {
20             '0101' => 'Deň vzniku Slovenskej republiky',
21             '0106' => 'Zjavenie Pána (Traja králi)',
22             '0501' => 'Sviatok práce',
23             '0508' => 'Deň víťazstva nad fašizmom',
24             '0705' => 'Sviatok svätého Cyrila a Metoda',
25             '0829' => 'Výročie SNP',
26             '0901' => 'Deň Ústavy Slovenskej republiky',
27             '0915' => 'Sedembolestná Panna Mária',
28             '1101' => 'Sviatok všetkých svätých',
29             '1117' => 'Deň boja za slobodu a demokraciu',
30             '1224' => 'Štedrý deň',
31             '1225' => 'Prvý sviatok vianočný',
32             '1226' => 'Druhý sviatok vianočný',
33             };
34              
35             # The only variable-date holiday is Easter Monday and Easter Friday -- we deal with that separately
36             my $EF = 'Veľkonočný piatok';
37             my $EM = 'Veľkonočný pondelok';
38              
39             sub is_sk_holiday {
40 4     4 1 268 my ($year, $month, $day) = @_;
41              
42 4         16 my $k = sprintf "%02d%02d", $month, $day;
43              
44             # for fixed dates
45 4 100       20 return $FIX->{$k}
46             if exists $FIX->{$k};
47              
48 3         22 my $diff = Date::Simple->new($year, $month, $day) - Date::Simple->new($year, easter($year));
49             # Easter Sunday +1 -> Easter Monday.
50 3 100       265 return $EM if ( $diff == 1 );
51             # Easter Sunday -2 -> Easter Friday.
52 2 100       34 return $EF if ( $diff == -2 );
53              
54 1         6 return 0;
55             }
56              
57             sub sk_holidays {
58              
59 6     6 1 2422 my ($year, $month, $day) = @_;
60              
61 6         18 my $easter = Date::Simple->new($year, easter($year));
62             # Easter Monday is the day after Easter
63 6         221 my $em = $easter + 1;
64             # Easter Friday is 2 days before Easter
65 6         171 my $ef = $easter - 2;
66              
67             # Easter Key ($ek) is a string in the form 'MMDD'
68 6         102 my $emk = sprintf "%02d%02d", $em->month, $em->day;
69 6         18 my $efk = sprintf "%02d%02d", $ef->month, $ef->day;
70              
71             # $h is a reference to a hash containing the results
72 6         7 my $h;
73              
74 6 100       21 if ( ! $month ) {
    100          
75              
76             #print "DEBUG: only year given\n";
77 1         14 $h = {%$FIX};
78 1         4 $h->{$emk} = $EM;
79 1         3 $h->{$efk} = $EF;
80              
81             } elsif ( ! $day ) {
82              
83             #print "DEBUG: only year and month given\n";
84 3         7 my $m = sprintf "%02d", $month;
85 3         17 foreach my $k (keys %$FIX) {
86 39 100       166 $h->{$k} = $FIX->{$k} if $k =~ m/\A$m/;
87             }
88 3 100       29 $h->{$emk} = $EM if $emk =~ m/\A$m/;
89 3 100       25 $h->{$efk} = $EF if $efk =~ m/\A$m/;
90              
91             } else {
92              
93             #print "DEBUG: year, month, and day given\n";
94 2         5 my $k = sprintf "%02d%02d", $month, $day;
95 2 50       6 $h->{$k} = $FIX->{$k} if exists $FIX->{$k};
96 2 50       8 $h->{$emk} = $EM if $emk == $k;
97 2 100       7 $h->{$efk} = $EF if $efk == $k;
98              
99             }
100              
101 6         21 return $h;
102             }
103              
104             sub is_sk_holiday_today {
105 0     0 1   my ($year, $month, $day) = (localtime)[ 5, 4, 3 ];
106 0           $year += 1900;
107 0           $month += 1;
108 0           return is_sk_holiday( $year, $month, $day );
109             }
110              
111             1;
112              
113             __END__