X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FCalendar.pm;h=257119c8e32f01669bb69eed94001ce41be0b6ad;hb=9d9ecdc49b4cb71aba99a7d7ca8bc89d426f7ca1;hp=1e687db7aa247c39decf1f304c5aa10315df21dd;hpb=65be03846d064dd6d9e7159550a269a352054b65;p=koha-ffzg.git diff --git a/C4/Calendar.pm b/C4/Calendar.pm index 1e687db7aa..257119c8e3 100644 --- a/C4/Calendar.pm +++ b/C4/Calendar.pm @@ -2,29 +2,31 @@ package C4::Calendar; # This file is part of Koha. # -# Koha is free software; you can redistribute it and/or modify it under the -# terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. # -# Koha is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR -# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # -# You should have received a copy of the GNU General Public License along with -# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place, -# Suite 330, Boston, MA 02111-1307 USA +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . use strict; use warnings; -use vars qw($VERSION @EXPORT); +use vars qw(@EXPORT); -use Carp; -use Date::Calc qw( Date_to_Days Today); +use Carp qw( croak ); +use Date::Calc qw( Today ); use C4::Context; +use Koha::Caches; use constant ISO_DATE_FORMAT => "%04d-%02d-%02d"; + =head1 NAME C4::Calendar::Calendar - Koha module dealing with holidays. @@ -165,7 +167,7 @@ sub get_exception_holidays { $single_holidays = $calendar->get_single_holidays(); Returns a hash reference to single holidays. This kind of holidays are those which -happend just one time. +happened just one time. =cut @@ -199,7 +201,7 @@ sub insert_week_day_holiday { croak "Invalid weekday $weekday" unless $weekday =~ m/^[0-6]$/; my $dbh = C4::Context->dbh(); - my $insertHoliday = $dbh->prepare("insert into repeatable_holidays (id,branchcode,weekday,day,month,title,description) values ( '',?,?,NULL,NULL,?,? )"); + my $insertHoliday = $dbh->prepare("insert into repeatable_holidays (branchcode,weekday,day,month,title,description) values ( ?,?,NULL,NULL,?,? )"); $insertHoliday->execute( $self->{branchcode}, $weekday, $options{title}, $options{description}); $self->{'week_days_holidays'}->{$weekday}{title} = $options{title}; $self->{'week_days_holidays'}->{$weekday}{description} = $options{description}; @@ -230,7 +232,7 @@ sub insert_day_month_holiday { my %options = @_; my $dbh = C4::Context->dbh(); - my $insertHoliday = $dbh->prepare("insert into repeatable_holidays (id,branchcode,weekday,day,month,title,description) values ('', ?, NULL, ?, ?, ?,? )"); + my $insertHoliday = $dbh->prepare("insert into repeatable_holidays (branchcode,weekday,day,month,title,description) values (?, NULL, ?, ?, ?,? )"); $insertHoliday->execute( $self->{branchcode}, $options{day},$options{month},$options{title}, $options{description}); $self->{'day_month_holidays'}->{"$options{month}/$options{day}"}{title} = $options{title}; $self->{'day_month_holidays'}->{"$options{month}/$options{day}"}{description} = $options{description}; @@ -262,17 +264,24 @@ C<$description> Is the description to store for the holiday formed by $year/$mon sub insert_single_holiday { my $self = shift @_; my %options = @_; - @options{qw(year month day)} = ( $options{date} =~ m/(\d+)-(\d+)-(\d+)/o ) if $options{date} && !$options{day}; my $dbh = C4::Context->dbh(); my $isexception = 0; - my $insertHoliday = $dbh->prepare("insert into special_holidays (id,branchcode,day,month,year,isexception,title,description) values ('', ?,?,?,?,?,?,?)"); + my $insertHoliday = $dbh->prepare("insert into special_holidays (branchcode,day,month,year,isexception,title,description) values (?,?,?,?,?,?,?)"); $insertHoliday->execute( $self->{branchcode}, $options{day},$options{month},$options{year}, $isexception, $options{title}, $options{description}); $self->{'single_holidays'}->{"$options{year}/$options{month}/$options{day}"}{title} = $options{title}; $self->{'single_holidays'}->{"$options{year}/$options{month}/$options{day}"}{description} = $options{description}; + + + # changed the 'single_holidays' table, lets force/reset its cache + my $cache = Koha::Caches->get_instance(); + my $key = $self->{branchcode} . "_holidays"; + $cache->clear_from_cache($key); + return $self; + } =head2 insert_exception_holiday @@ -306,10 +315,16 @@ sub insert_exception_holiday { my $dbh = C4::Context->dbh(); my $isexception = 1; - my $insertException = $dbh->prepare("insert into special_holidays (id,branchcode,day,month,year,isexception,title,description) values ('', ?,?,?,?,?,?,?)"); + my $insertException = $dbh->prepare("insert into special_holidays (branchcode,day,month,year,isexception,title,description) values (?,?,?,?,?,?,?)"); $insertException->execute( $self->{branchcode}, $options{day},$options{month},$options{year}, $isexception, $options{title}, $options{description}); $self->{'exception_holidays'}->{"$options{year}/$options{month}/$options{day}"}{title} = $options{title}; $self->{'exception_holidays'}->{"$options{year}/$options{month}/$options{day}"}{description} = $options{description}; + + # changed the 'single_holidays' table, lets force/reset its cache + my $cache = Koha::Caches->get_instance(); + my $key = $self->{branchcode} . "_holidays"; + $cache->clear_from_cache($key); + return $self; } @@ -398,10 +413,19 @@ sub ModSingleholiday { my $dbh = C4::Context->dbh(); my $isexception = 0; - my $updateHoliday = $dbh->prepare("UPDATE special_holidays SET title = ?, description = ? WHERE day = ? AND month = ? AND year = ? AND branchcode = ? AND isexception = ?"); + + my $updateHoliday = $dbh->prepare(" +UPDATE special_holidays SET title = ?, description = ? + WHERE day = ? AND month = ? AND year = ? AND branchcode = ? AND isexception = ?"); $updateHoliday->execute($options{title},$options{description},$options{day},$options{month},$options{year},$self->{branchcode},$isexception); $self->{'single_holidays'}->{"$options{year}/$options{month}/$options{day}"}{title} = $options{title}; $self->{'single_holidays'}->{"$options{year}/$options{month}/$options{day}"}{description} = $options{description}; + + # changed the 'single_holidays' table, lets force/reset its cache + my $cache = Koha::Caches->get_instance(); + my $key = $self->{branchcode} . "_holidays"; + $cache->clear_from_cache($key); + return $self; } @@ -433,10 +457,18 @@ sub ModExceptionholiday { my $dbh = C4::Context->dbh(); my $isexception = 1; - my $updateHoliday = $dbh->prepare("UPDATE special_holidays SET title = ?, description = ? WHERE day = ? AND month = ? AND year = ? AND branchcode = ? AND isexception = ?"); - $updateHoliday->execute($options{title},$options{description},$options{day},$options{month},$options{year},$self->{branchcode},$isexception); + my $updateHoliday = $dbh->prepare(" +UPDATE special_holidays SET title = ?, description = ? + WHERE day = ? AND month = ? AND year = ? AND branchcode = ? AND isexception = ?"); + $updateHoliday->execute($options{title},$options{description},$options{day},$options{month},$options{year},$self->{branchcode},$isexception); $self->{'exception_holidays'}->{"$options{year}/$options{month}/$options{day}"}{title} = $options{title}; $self->{'exception_holidays'}->{"$options{year}/$options{month}/$options{day}"}{description} = $options{description}; + + # changed the 'single_holidays' table, lets force/reset its cache + my $cache = Koha::Caches->get_instance(); + my $key = $self->{branchcode} . "_holidays"; + $cache->clear_from_cache($key); + return $self; } @@ -465,7 +497,7 @@ sub delete_holiday { # Verify what kind of holiday that day is. For example, if it is # a repeatable holiday, this should check if there are some exception - # for that holiday rule. Otherwise, if it is a regular holiday, it´s + # for that holiday rule. Otherwise, if it is a regular holiday, it´s # ok just deleting it. my $dbh = C4::Context->dbh(); @@ -512,6 +544,12 @@ sub delete_holiday { } } } + + # changed the 'single_holidays' table, lets force/reset its cache + my $cache = Koha::Caches->get_instance(); + my $key = $self->{branchcode} . "_holidays"; + $cache->clear_from_cache($key); + return $self; } =head2 delete_holiday_range @@ -537,6 +575,12 @@ sub delete_holiday_range { my $dbh = C4::Context->dbh(); my $sth = $dbh->prepare("DELETE FROM special_holidays WHERE (branchcode = ?) AND (day = ?) AND (month = ?) AND (year = ?)"); $sth->execute($self->{branchcode}, $options{day}, $options{month}, $options{year}); + + # changed the 'single_holidays' table, lets force/reset its cache + my $cache = Koha::Caches->get_instance(); + my $key = $self->{branchcode} . "_holidays"; + $cache->clear_from_cache($key); + } =head2 delete_holiday_range_repeatable @@ -585,6 +629,11 @@ sub delete_exception_holiday_range { my $dbh = C4::Context->dbh(); my $sth = $dbh->prepare("DELETE FROM special_holidays WHERE (branchcode = ?) AND (isexception = 1) AND (day = ?) AND (month = ?) AND (year = ?)"); $sth->execute($self->{branchcode}, $options{day}, $options{month}, $options{year}); + + # changed the 'single_holidays' table, lets force/reset its cache + my $cache = Koha::Caches->get_instance(); + my $key = $self->{branchcode} . "_holidays"; + $cache->clear_from_cache($key); } =head2 isHoliday @@ -602,11 +651,10 @@ C<$year> Is the year to check whether if is a holiday or not. sub isHoliday { my ($self, $day, $month, $year) = @_; # FIXME - date strings are stored in non-padded metric format. should change to iso. - # FIXME - should change arguments to accept C4::Dates object $month=$month+0; $year=$year+0; $day=$day+0; - my $weekday = &Date::Calc::Day_of_Week($year, $month, $day) % 7; + my $weekday = &Date::Calc::Day_of_Week($year, $month, $day) % 7; my $weekDays = $self->get_week_days_holidays(); my $dayMonths = $self->get_day_month_holidays(); my $exceptions = $self->get_exception_holidays(); @@ -617,7 +665,7 @@ sub isHoliday { if ((exists($weekDays->{$weekday})) || (exists($dayMonths->{"$month/$day"})) || (exists($singles->{"$year/$month/$day"}))) { - return 1; + return 1; } else { return 0; } @@ -642,84 +690,38 @@ sub copy_to_branch { my $today = sprintf ISO_DATE_FORMAT, $y,$m,$d; my $wdh = $self->get_week_days_holidays; - $target_calendar->insert_week_day_holiday( weekday => $_, %{ $wdh->{$_} } ) - foreach keys %$wdh; - $target_calendar->insert_day_month_holiday(%$_) - foreach values %{ $self->get_day_month_holidays }; - $target_calendar->insert_exception_holiday(%$_) - foreach grep { $_->{date} gt $today } values %{ $self->get_exception_holidays }; - $target_calendar->insert_single_holiday(%$_) - foreach grep { $_->{date} gt $today } values %{ $self->get_single_holidays }; - - return 1; -} - -=head2 addDate - - my ($day, $month, $year) = $calendar->addDate($date, $offset) - -C<$date> is a C4::Dates object representing the starting date of the interval. - -C<$offset> Is the number of days that this function has to count from $date. - -=cut - -sub addDate { - my ($self, $startdate, $offset) = @_; - my ($year,$month,$day) = split("-",$startdate->output('iso')); - my $daystep = 1; - if ($offset < 0) { # In case $offset is negative - # $offset = $offset*(-1); - $daystep = -1; - } - my $daysMode = C4::Context->preference('useDaysMode'); - if ($daysMode eq 'Datedue') { - ($year, $month, $day) = &Date::Calc::Add_Delta_Days($year, $month, $day, $offset ); - while ($self->isHoliday($day, $month, $year)) { - ($year, $month, $day) = &Date::Calc::Add_Delta_Days($year, $month, $day, $daystep); - } - } elsif($daysMode eq 'Calendar') { - while ($offset != 0) { - ($year, $month, $day) = &Date::Calc::Add_Delta_Days($year, $month, $day, $daystep); - if (!($self->isHoliday($day, $month, $year))) { - $offset = $offset - $daystep; - } + my $target_wdh = $target_calendar->get_week_days_holidays; + foreach my $key (keys %$wdh) { + unless (grep { $_ eq $key } keys %$target_wdh) { + $target_calendar->insert_week_day_holiday( weekday => $key, %{ $wdh->{$key} } ) } - } else { ## ($daysMode eq 'Days') - ($year, $month, $day) = &Date::Calc::Add_Delta_Days($year, $month, $day, $offset ); } - return(C4::Dates->new( sprintf(ISO_DATE_FORMAT,$year,$month,$day),'iso')); -} - -=head2 daysBetween - - my $daysBetween = $calendar->daysBetween($startdate, $enddate) -C<$startdate> and C<$enddate> are C4::Dates objects that define the interval. - -Returns the number of non-holiday days in the interval. -useDaysMode syspref has no effect here. -=cut + my $dmh = $self->get_day_month_holidays; + my $target_dmh = $target_calendar->get_day_month_holidays; + foreach my $values (values %$dmh) { + unless (grep { $_->{day} eq $values->{day} && $_->{month} eq $values->{month} } values %$target_dmh) { + $target_calendar->insert_day_month_holiday(%{ $values }); + } + } -sub daysBetween { - my $self = shift or return; - my $startdate = shift or return; - my $enddate = shift or return; - my ($yearFrom,$monthFrom,$dayFrom) = split("-",$startdate->output('iso')); - my ($yearTo, $monthTo, $dayTo ) = split("-", $enddate->output('iso')); - if (Date_to_Days($yearFrom,$monthFrom,$dayFrom) > Date_to_Days($yearTo,$monthTo,$dayTo)) { - return 0; - # we don't go backwards ( FIXME - handle this error better ) + my $exception_holidays = $self->get_exception_holidays; + my $target_exceptions = $target_calendar->get_exception_holidays; + foreach my $values ( grep {$_->{date} gt $today} values %{ $exception_holidays }) { + unless ( grep { $_->{date} eq $values->{date} } values %$target_exceptions) { + $target_calendar->insert_exception_holiday(%{ $values }); + } } - my $count = 0; - while (1) { - ($yearFrom != $yearTo or $monthFrom != $monthTo or $dayFrom != $dayTo) or last; # if they all match, it's the last day - unless ($self->isHoliday($dayFrom, $monthFrom, $yearFrom)) { - $count++; + + my $single_holidays = $self->get_single_holidays; + my $target_singles = $target_calendar->get_single_holidays; + foreach my $values ( grep {$_->{date} gt $today} values %{ $single_holidays }) { + unless ( grep { $_->{date} eq $values->{date} } values %$target_singles){ + $target_calendar->insert_single_holiday(%{ $values }); } - ($yearFrom, $monthFrom, $dayFrom) = &Date::Calc::Add_Delta_Days($yearFrom, $monthFrom, $dayFrom, 1); } - return($count); + + return 1; } 1; @@ -731,3 +733,4 @@ __END__ Koha Physics Library UNLP =cut +