From a4289723f17d793ce3aa3a46dc974a5178e1258d Mon Sep 17 00:00:00 2001 From: Christophe Croullebois <christophe.croullebois@biblibre.com> Date: Sat, 4 Feb 2012 16:43:51 +0100 Subject: [PATCH] [SIGN OFF]Bug 7351 : feature that allows to delete a range of dates Four new options, one for single holidays, one for the repeatable holidays. One to create exceptions on a range of dates, one to delete exceptions in a range of dates. Note that the exceptions are not deleted if you delete a range of repeatable dates. But if you delete a range of single holidays the exeptions inside will be deleted. Signed-off-by: Stephane Delaye <stephane.delaye@biblibre.com> --- C4/Calendar.pm | 73 +++++++++++++++++++ .../prog/en/modules/tools/holidays.tt | 41 +++++++++-- tools/exceptionHolidays.pl | 75 ++++++++++++++++++- tools/newHolidays.pl | 76 +++++++++----------- 4 files changed, 216 insertions(+), 49 deletions(-) diff --git a/C4/Calendar.pm b/C4/Calendar.pm index a9d39dc..2349f18 100644 --- a/C4/Calendar.pm +++ b/C4/Calendar.pm @@ -515,6 +515,79 @@ sub delete_holiday { return $self; } +=head2 delete_holiday_range + + delete_holiday_range(day => $day, + month => $month, + year => $year); + +Delete a holiday range of dates for $self->{branchcode}. + +C<$day> Is the day month to make the date to delete. + +C<$month> Is month to make the date to delete. + +C<$year> Is year to make the date to delete. + +=cut + +sub delete_holiday_range { + my $self = shift; + my %options = @_; + + 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}); +} + +=head2 delete_holiday_range_repeatable + + delete_holiday_range_repeatable(day => $day, + month => $month); + +Delete a holiday for $self->{branchcode}. + +C<$day> Is the day month to make the date to delete. + +C<$month> Is month to make the date to delete. + +=cut + +sub delete_holiday_range_repeatable { + my $self = shift; + my %options = @_; + + my $dbh = C4::Context->dbh(); + my $sth = $dbh->prepare("DELETE FROM repeatable_holidays WHERE (branchcode = ?) AND (day = ?) AND (month = ?)"); + $sth->execute($self->{branchcode}, $options{day}, $options{month}); +} + +=head2 delete_exception_holiday_range + + delete_exception_holiday_range(weekday => $weekday + day => $day, + month => $month, + year => $year); + +Delete a holiday for $self->{branchcode}. + +C<$day> Is the day month to make the date to delete. + +C<$month> Is month to make the date to delete. + +C<$year> Is year to make the date to delete. + +=cut + +sub delete_exception_holiday_range { + my $self = shift; + my %options = @_; + + 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}); +} + =head2 isHoliday $isHoliday = isHoliday($day, $month $year); diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/holidays.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/holidays.tt index f597f82..1f7b0ab 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/holidays.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/holidays.tt @@ -83,8 +83,8 @@ function Help() { newin=window.open("/cgi-bin/koha/help.pl","KohaHelp",'width=600,height=600,toolbar=false,scrollbars=yes'); } - $(document).ready(function() { + $(document).ready(function() { [% IF ( dateformat_metric ) %] $.tablesorter.addParser({ // http://tablesorter.com/docs/example-parsers.html id: 'shortDates', is: function(s){ @@ -129,6 +129,7 @@ $(this).parent().find(".hint").toggle(); return false; }); $("#dateofrange").each(function () { this.value = "" }); + $("#datecancelrange").each(function () { this.value = "" }); }); //]]> </script> @@ -185,7 +186,7 @@ <input type="hidden" id="showBranchName" name="showBranchName" /> </li> <li> - <strong>Date:</strong> + <strong>From Date:</strong> <span id="showDaynameOutput"></span>, [% IF ( dateformat_us ) %]<span id="showMonthOutput"></span>/<span id="showDayOutput"></span>/<span id="showYearOutput"></span>[% ELSIF ( dateformat_metric ) %]<span id="showDayOutput"></span>/<span id="showMonthOutput"></span>/<span id="showYearOutput"></span>[% ELSE %]<span id="showYearOutput"></span>/<span id="showMonthOutput"></span>/<span id="showDayOutput"></span>[% END %] @@ -196,6 +197,20 @@ <input type="hidden" id="showMonth" name="showMonth" /> <input type="hidden" id="showYear" name="showYear" /> </li> + <li class="dateinsert"> + <b>To Date : </b> + <input type="text" id="datecancelrange" name="datecancelrange" size="20" value="[% datecancelrange %]" /> + <img src="[% themelang %]/lib/calendar/cal.gif" id="datecancelrange_button" alt="Show Calendar" /> + <script language="JavaScript" type="text/javascript"> + Calendar.setup( + { + inputField : "datecancelrange", + ifFormat : "[% DHTMLcalendar_dateformat %]", + button : "datecancelrange_button" + } + ); + </script> + </li> <li><label for="showTitle">Title: </label><input type="text" name="showTitle" id="showTitle" size="35" /></li> <!-- showTitle is necessary for exception radio button to work properly --> <label for="showDescription">Description:</label> @@ -206,13 +221,29 @@ <a href="#" class="helptext">[?]</a> <div class="hint">You can make an exception for this holiday rule. This means that you will be able to say that for a repeatable holiday there is one day which is going to be an exception.</div> </div></li> + <li class="radio"><input type="radio" name="showOperation" id="showOperationExcRange" value="exceptionrange" /> + <label for="newOperationFieldException">Generate exceptions on a range of dates.</label>. + <a href="#" class="helptext">[?]</a> + <div class="hint">You can make an exception on a range of dates repeated yearly.</div> + </li> <li class="radio"><input type="radio" name="showOperation" id="showOperationDel" value="delete" /> <label for="showOperationDel" id="showOperationDelLabel">Delete this holiday</label> <a href="#" class="helptext">[?]</a> <div class="hint">This will delete this holiday rule. If it is a repeatable holiday, this option checks for posible exceptions. If an exception exists, this option will remove the exception and set the date to a regular holiday.</div></li> + <li class="radio"><input type="radio" name="showOperation" id="showOperationDelRange" value="deleterange" /><label for="showOperationDelRange" id="showOperationDelLabelRange">Delete the single holidays on a range</label>. + <a href="#" class="helptext">[?]</a> + <div class="hint">This will delete the single holidays rules only. The repeatable holidays and exceptions will not be deleted</div> + </li> + <li class="radio"><input type="radio" name="showOperation" id="showOperationDelRangeRepeat" value="deleterangerepeat" /><label for="showOperationDelRangeRepeat" id="showOperationDelLabelRangeRepeat">Delete the repeated holidays on a range</label>. + <a href="#" class="helptext">[?]</a> + <div class="hint">This will delete the repeated holidays rules only. The repeatable holidays will be deleted but not exceptions</div> + </li> + <li class="radio"><input type="radio" name="showOperation" id="showOperationDelRangeRepeatExcept" value="deleterangerepeatexcept" /><label for="showOperationDelRangeRepeatExcept" id="showOperationDelLabelRangeRepeatExcept">Delete the exceptions on a range</label>. + <a href="#" class="helptext">[?]</a> + <div class="hint">This will delete the exceptions inside a given range. Be carefull about your scope range if it is oversized you could slow down koha</div> + </li> <li class="radio"><input type="radio" name="showOperation" id="showOperationEdit" value="edit" checked="checked" /> <label for="showOperationEdit">Edit this holiday</label> - <a href="#" class="helptext">[?]</a> - <div class="hint">This will save changes to the holiday's title and description. If the information for a repeatable holiday is modified, it affects all of the dates on which the holiday is repeated.</div></li> - + <a href="#" class="helptext">[?]</a> + <div class="hint">This will save changes to the holiday's title and description. If the information for a repeatable holiday is modified, it affects all of the dates on which the holiday is repeated.</div></li> </ol> <fieldset class="action"> <input type="submit" name="submit" value="Save" /> diff --git a/tools/exceptionHolidays.pl b/tools/exceptionHolidays.pl index 64a4860..3774742 100755 --- a/tools/exceptionHolidays.pl +++ b/tools/exceptionHolidays.pl @@ -7,7 +7,7 @@ use CGI; use C4::Auth; use C4::Output; - +use DateTime; use C4::Calendar; @@ -19,10 +19,13 @@ my $weekday = $input->param('showWeekday'); my $day = $input->param('showDay'); my $month = $input->param('showMonth'); my $year = $input->param('showYear'); +my $day1; +my $month1; +my $year1; my $title = $input->param('showTitle'); my $description = $input->param('showDescription'); my $holidaytype = $input->param('showHolidayType'); - +my $datecancelrange = $input->param('datecancelrange'); my $calendardate = sprintf("%04d-%02d-%02d", $year, $month, $day); my $isodate = C4::Dates->new($calendardate, 'iso'); $calendardate = $isodate->output('syspref'); @@ -35,14 +38,54 @@ if ($description) { $description =~ s/\n/\\n/g; } else { $description = ''; -} +} +# We format the date +my @dateend = split(/[\/-]/, $datecancelrange); +if (C4::Context->preference("dateformat") eq "metric") { + $day1 = $dateend[0]; + $month1 = $dateend[1]; + $year1 = $dateend[2]; +}elsif (C4::Context->preference("dateformat") eq "us") { + $month1 = $dateend[0]; + $day1 = $dateend[1]; + $year1 = $dateend[2]; +} else { + $year1 = $dateend[0]; + $month1 = $dateend[1]; + $day1 = $dateend[2]; +} +# We make an array with holiday's days +my @holiday_list; +if ($year1 && $month1 && $day1){ + my $first_dt = DateTime->new(year => $year, month => $month, day => $day); + my $end_dt = DateTime->new(year => $year1, month => $month1, day => $day1); + + for (my $dt = $first_dt->clone(); + $dt <= $end_dt; + $dt->add(days => 1) ) + { + push @holiday_list, $dt->clone(); + } +} if ($input->param('showOperation') eq 'exception') { $calendar->insert_exception_holiday(day => $day, month => $month, year => $year, title => $title, description => $description); +} elsif ($input->param('showOperation') eq 'exceptionrange' ) { + if (@holiday_list){ + foreach my $date (@holiday_list){ + $calendar->insert_exception_holiday( + day => $date->{local_c}->{day}, + month => $date->{local_c}->{month}, + year => $date->{local_c}->{year}, + title => $title, + description => $description + ); + } + } } elsif ($input->param('showOperation') eq 'edit') { if($holidaytype eq 'weekday') { $calendar->ModWeekdayholiday(weekday => $weekday, @@ -71,5 +114,31 @@ if ($input->param('showOperation') eq 'exception') { day => $day, month => $month, year => $year); +}elsif ($input->param('showOperation') eq 'deleterange') { + if (@holiday_list){ + foreach my $date (@holiday_list){ + $calendar->delete_holiday_range(weekday => $weekday, + day => $date->{local_c}->{day}, + month => $date->{local_c}->{month}, + year => $date->{local_c}->{year}); + } + } +}elsif ($input->param('showOperation') eq 'deleterangerepeat') { + if (@holiday_list){ + foreach my $date (@holiday_list){ + $calendar->delete_holiday_range_repeatable(weekday => $weekday, + day => $date->{local_c}->{day}, + month => $date->{local_c}->{month}); + } + } +}elsif ($input->param('showOperation') eq 'deleterangerepeatexcept') { + if (@holiday_list){ + foreach my $date (@holiday_list){ + $calendar->delete_exception_holiday_range(weekday => $weekday, + day => $date->{local_c}->{day}, + month => $date->{local_c}->{month}, + year => $date->{local_c}->{year}); + } + } } print $input->redirect("/cgi-bin/koha/tools/holidays.pl?branch=$branchcode&calendardate=$calendardate"); diff --git a/tools/newHolidays.pl b/tools/newHolidays.pl index c36d328..ffe99a3 100755 --- a/tools/newHolidays.pl +++ b/tools/newHolidays.pl @@ -56,6 +56,20 @@ if ($description) { $description = ''; } +# We make an array with holiday's days +my @holiday_list; +if ($year1 && $month1 && $day1){ + my $first_dt = DateTime->new(year => $year, month => $month, day => $day); + my $end_dt = DateTime->new(year => $year1, month => $month1, day => $day1); + + for (my $dt = $first_dt->clone(); + $dt <= $end_dt; + $dt->add(days => 1) ) + { + push @holiday_list, $dt->clone(); + } +} + if($allbranches) { my $branch; my @branchcodes = split(/\|/, $input->param('branchCodes')); @@ -100,50 +114,30 @@ sub add_holiday { } } elsif ( $newoperation eq 'holidayrange' ) { - #Make an array with holiday's days - my $first_dt = DateTime->new(year => $year, month => $month, day => $day); - my $end_dt = DateTime->new(year => $year1, month => $month1, day => $day1); - my @holiday_list = (); - - for (my $dt = $first_dt->clone(); - $dt <= $end_dt; - $dt->add(days => 1) ) - { - push @holiday_list, $dt->clone(); - } - - foreach my $date (@holiday_list){ - unless ( $calendar->isHoliday( $date->{local_c}->{day}, $date->{local_c}->{month}, $date->{local_c}->{year} ) ) { - $calendar->insert_single_holiday( - day => $date->{local_c}->{day}, - month => $date->{local_c}->{month}, - year => $date->{local_c}->{year}, - title => $title, - description => $description - ); + if (@holiday_list){ + foreach my $date (@holiday_list){ + unless ( $calendar->isHoliday( $date->{local_c}->{day}, $date->{local_c}->{month}, $date->{local_c}->{year} ) ) { + $calendar->insert_single_holiday( + day => $date->{local_c}->{day}, + month => $date->{local_c}->{month}, + year => $date->{local_c}->{year}, + title => $title, + description => $description + ); + } } } } elsif ( $newoperation eq 'holidayrangerepeat' ) { - #Make an array with holiday's days - my $first_dt = DateTime->new(year => $year, month => $month, day => $day); - my $end_dt = DateTime->new(year => $year1, month => $month1, day => $day1); - my @holiday_list = (); - - for (my $dt = $first_dt->clone(); - $dt <= $end_dt; - $dt->add(days => 1) ) - { - push @holiday_list, $dt->clone(); - } - - foreach my $date (@holiday_list){ - unless ( $calendar->isHoliday( $date->{local_c}->{day}, $date->{local_c}->{month}, $date->{local_c}->{year} ) ) { - $calendar->insert_day_month_holiday( - day => $date->{local_c}->{day}, - month => $date->{local_c}->{month}, - title => $title, - description => $description - ); + if (@holiday_list){ + foreach my $date (@holiday_list){ + unless ( $calendar->isHoliday( $date->{local_c}->{day}, $date->{local_c}->{month}, $date->{local_c}->{year} ) ) { + $calendar->insert_day_month_holiday( + day => $date->{local_c}->{day}, + month => $date->{local_c}->{month}, + title => $title, + description => $description + ); + } } } } -- 1.7.2.5