Lines 20-53
use warnings;
Link Here
|
20 |
use vars qw($VERSION @EXPORT); |
20 |
use vars qw($VERSION @EXPORT); |
21 |
|
21 |
|
22 |
use Carp; |
22 |
use Carp; |
23 |
use Date::Calc qw( Date_to_Days ); |
23 |
use Date::Calc qw( Date_to_Days Today); |
24 |
|
24 |
|
25 |
use C4::Context; |
25 |
use C4::Context; |
26 |
|
26 |
|
27 |
BEGIN { |
27 |
use constant ISO_DATE_FORMAT => "%04d-%02d-%02d"; |
28 |
# set the version for version checking |
|
|
29 |
$VERSION = 3.01; |
30 |
require Exporter; |
31 |
@EXPORT = qw( |
32 |
&get_week_days_holidays |
33 |
&get_day_month_holidays |
34 |
&get_exception_holidays |
35 |
&get_single_holidays |
36 |
&insert_week_day_holiday |
37 |
&insert_day_month_holiday |
38 |
&insert_single_holiday |
39 |
&insert_exception_holiday |
40 |
&ModWeekdayholiday |
41 |
&ModDaymonthholiday |
42 |
&ModSingleholiday |
43 |
&ModExceptionholiday |
44 |
&delete_holiday |
45 |
&isHoliday |
46 |
&addDate |
47 |
&daysBetween |
48 |
); |
49 |
} |
50 |
|
51 |
=head1 NAME |
28 |
=head1 NAME |
52 |
|
29 |
|
53 |
C4::Calendar::Calendar - Koha module dealing with holidays. |
30 |
C4::Calendar::Calendar - Koha module dealing with holidays. |
Lines 123-129
sub _init {
Link Here
|
123 |
$exception_holidays{"$year/$month/$day"}{title} = $title; |
100 |
$exception_holidays{"$year/$month/$day"}{title} = $title; |
124 |
$exception_holidays{"$year/$month/$day"}{description} = $description; |
101 |
$exception_holidays{"$year/$month/$day"}{description} = $description; |
125 |
$exception_holidays{"$year/$month/$day"}{date} = |
102 |
$exception_holidays{"$year/$month/$day"}{date} = |
126 |
sprintf("%04d-%02d-%02d", $year, $month, $day); |
103 |
sprintf(ISO_DATE_FORMAT, $year, $month, $day); |
127 |
} |
104 |
} |
128 |
$self->{'exception_holidays'} = \%exception_holidays; |
105 |
$self->{'exception_holidays'} = \%exception_holidays; |
129 |
|
106 |
|
Lines 133-139
sub _init {
Link Here
|
133 |
$single_holidays{"$year/$month/$day"}{title} = $title; |
110 |
$single_holidays{"$year/$month/$day"}{title} = $title; |
134 |
$single_holidays{"$year/$month/$day"}{description} = $description; |
111 |
$single_holidays{"$year/$month/$day"}{description} = $description; |
135 |
$single_holidays{"$year/$month/$day"}{date} = |
112 |
$single_holidays{"$year/$month/$day"}{date} = |
136 |
sprintf("%04d-%02d-%02d", $year, $month, $day); |
113 |
sprintf(ISO_DATE_FORMAT, $year, $month, $day); |
137 |
} |
114 |
} |
138 |
$self->{'single_holidays'} = \%single_holidays; |
115 |
$self->{'single_holidays'} = \%single_holidays; |
139 |
return $self; |
116 |
return $self; |
Lines 218-228
sub insert_week_day_holiday {
Link Here
|
218 |
my $self = shift @_; |
195 |
my $self = shift @_; |
219 |
my %options = @_; |
196 |
my %options = @_; |
220 |
|
197 |
|
|
|
198 |
my $weekday = $options{weekday} or croak "No weekday"; |
199 |
|
221 |
my $dbh = C4::Context->dbh(); |
200 |
my $dbh = C4::Context->dbh(); |
222 |
my $insertHoliday = $dbh->prepare("insert into repeatable_holidays (id,branchcode,weekday,day,month,title,description) values ( '',?,?,NULL,NULL,?,? )"); |
201 |
my $insertHoliday = $dbh->prepare("insert into repeatable_holidays (id,branchcode,weekday,day,month,title,description) values ( '',?,?,NULL,NULL,?,? )"); |
223 |
$insertHoliday->execute( $self->{branchcode}, $options{weekday},$options{title}, $options{description}); |
202 |
$insertHoliday->execute( $self->{branchcode}, $weekday, $options{title}, $options{description}); |
224 |
$self->{'week_days_holidays'}->{$options{weekday}}{title} = $options{title}; |
203 |
$self->{'week_days_holidays'}->{$weekday}{title} = $options{title}; |
225 |
$self->{'week_days_holidays'}->{$options{weekday}}{description} = $options{description}; |
204 |
$self->{'week_days_holidays'}->{$weekday}{description} = $options{description}; |
226 |
return $self; |
205 |
return $self; |
227 |
} |
206 |
} |
228 |
|
207 |
|
Lines 283-288
sub insert_single_holiday {
Link Here
|
283 |
my $self = shift @_; |
262 |
my $self = shift @_; |
284 |
my %options = @_; |
263 |
my %options = @_; |
285 |
|
264 |
|
|
|
265 |
@options{qw(year month day)} = ( $options{date} =~ m/(\d+)-(\d+)-(\d+)/o ) |
266 |
if $options{date} && !$options{day}; |
267 |
|
286 |
my $dbh = C4::Context->dbh(); |
268 |
my $dbh = C4::Context->dbh(); |
287 |
my $isexception = 0; |
269 |
my $isexception = 0; |
288 |
my $insertHoliday = $dbh->prepare("insert into special_holidays (id,branchcode,day,month,year,isexception,title,description) values ('', ?,?,?,?,?,?,?)"); |
270 |
my $insertHoliday = $dbh->prepare("insert into special_holidays (id,branchcode,day,month,year,isexception,title,description) values ('', ?,?,?,?,?,?,?)"); |
Lines 318-323
sub insert_exception_holiday {
Link Here
|
318 |
my $self = shift @_; |
300 |
my $self = shift @_; |
319 |
my %options = @_; |
301 |
my %options = @_; |
320 |
|
302 |
|
|
|
303 |
@options{qw(year month day)} = ( $options{date} =~ m/(\d+)-(\d+)-(\d+)/o ) |
304 |
if $options{date} && !$options{day}; |
305 |
|
321 |
my $dbh = C4::Context->dbh(); |
306 |
my $dbh = C4::Context->dbh(); |
322 |
my $isexception = 1; |
307 |
my $isexception = 1; |
323 |
my $insertException = $dbh->prepare("insert into special_holidays (id,branchcode,day,month,year,isexception,title,description) values ('', ?,?,?,?,?,?,?)"); |
308 |
my $insertException = $dbh->prepare("insert into special_holidays (id,branchcode,day,month,year,isexception,title,description) values ('', ?,?,?,?,?,?,?)"); |
Lines 567-572
sub isHoliday {
Link Here
|
567 |
|
552 |
|
568 |
} |
553 |
} |
569 |
|
554 |
|
|
|
555 |
=head2 copy_to_branch |
556 |
|
557 |
$calendar->copy_to_branch($target_branch) |
558 |
|
559 |
=cut |
560 |
|
561 |
sub copy_to_branch { |
562 |
my ($self, $target_branch) = @_; |
563 |
|
564 |
croak "No target_branch" unless $target_branch; |
565 |
|
566 |
my $target_calendar = C4::Calendar->new(branchcode => $target_branch); |
567 |
|
568 |
my ($y, $m, $d) = Today(); |
569 |
my $today = sprintf ISO_DATE_FORMAT, $y,$m,$d; |
570 |
|
571 |
my $wdh = $self->get_week_days_holidays; |
572 |
$target_calendar->insert_week_day_holiday( weekday => $_, %{ $wdh->{$_} } ) |
573 |
foreach keys %$wdh; |
574 |
$target_calendar->insert_day_month_holiday(%$_) |
575 |
foreach values %{ $self->get_day_month_holidays }; |
576 |
$target_calendar->insert_exception_holiday(%$_) |
577 |
foreach grep { $_->{date} gt $today } values %{ $self->get_exception_holidays }; |
578 |
$target_calendar->insert_single_holiday(%$_) |
579 |
foreach grep { $_->{date} gt $today } values %{ $self->get_single_holidays }; |
580 |
|
581 |
return 1; |
582 |
} |
583 |
|
584 |
=head2 daysBetween |
585 |
|
586 |
my $daysBetween = $calendar->daysBetween($startdate, $enddate) |
587 |
|
588 |
C<$startdate> and C<$enddate> are C4::Dates objects that define the interval. |
589 |
|
590 |
Returns the number of non-holiday days in the interval. |
591 |
useDaysMode syspref has no effect here. |
592 |
=cut |
593 |
|
594 |
sub daysBetween ($$$) { |
595 |
my $self = shift or return undef; |
596 |
my $startdate = shift or return undef; |
597 |
my $enddate = shift or return undef; |
598 |
my ($yearFrom,$monthFrom,$dayFrom) = split("-",$startdate->output('iso')); |
599 |
my ($yearTo, $monthTo, $dayTo ) = split("-", $enddate->output('iso')); |
600 |
if (Date_to_Days($yearFrom,$monthFrom,$dayFrom) > Date_to_Days($yearTo,$monthTo,$dayTo)) { |
601 |
return 0; |
602 |
# we don't go backwards ( FIXME - handle this error better ) |
603 |
} |
604 |
my $count = 0; |
605 |
while (1) { |
606 |
($yearFrom != $yearTo or $monthFrom != $monthTo or $dayFrom != $dayTo) or last; # if they all match, it's the last day |
607 |
unless ($self->isHoliday($dayFrom, $monthFrom, $yearFrom)) { |
608 |
$count++; |
609 |
} |
610 |
($yearFrom, $monthFrom, $dayFrom) = &Date::Calc::Add_Delta_Days($yearFrom, $monthFrom, $dayFrom, 1); |
611 |
} |
612 |
return($count); |
613 |
} |
614 |
|
570 |
=head2 addDate |
615 |
=head2 addDate |
571 |
|
616 |
|
572 |
my ($day, $month, $year) = $calendar->addDate($date, $offset) |
617 |
my ($day, $month, $year) = $calendar->addDate($date, $offset) |
Lines 601-607
sub addDate {
Link Here
|
601 |
} else { ## ($daysMode eq 'Days') |
646 |
} else { ## ($daysMode eq 'Days') |
602 |
($year, $month, $day) = &Date::Calc::Add_Delta_Days($year, $month, $day, $offset ); |
647 |
($year, $month, $day) = &Date::Calc::Add_Delta_Days($year, $month, $day, $offset ); |
603 |
} |
648 |
} |
604 |
return(C4::Dates->new( sprintf("%04d-%02d-%02d",$year,$month,$day),'iso')); |
649 |
return(C4::Dates->new( sprintf(ISO_DATE_FORMAT,$year,$month,$day),'iso')); |
605 |
} |
650 |
} |
606 |
|
651 |
|
607 |
=head2 daysBetween |
652 |
=head2 daysBetween |