From acf66f231d3a182b987dff09ff26635a2ea3cbb5 Mon Sep 17 00:00:00 2001 From: Kyle M Hall Date: Mon, 13 Jun 2022 17:57:13 +0000 Subject: [PATCH] Bug 30927: Improve formatting or iCal files for checkout due dates We got some feedback from a patron regarding the default notifications on the iCal export for the patron checkout summary in the OPAC. The notifications send 1 minute before the event (the due date), which is midnight. Test Plan: 0) Make sure your time zone in Koha is set correctly in koha-conf.xml 1) Apply this patch 2) Restart all the things! 3) Make a checkout due at 23:59 4) Make a checkout due at 11:00 5) Download the iCal file from the OPAC 6) Import this file into Calendar 7) Note the first checkout is an all day event 8) Note the second checkout is an "instantaneous" event at the date and time the item is due Signed-off-by: Owen Leonard Signed-off-by: Jonathan Druart --- opac/opac-ics.pl | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/opac/opac-ics.pl b/opac/opac-ics.pl index 62603f3a2f4..ba1f6c63298 100755 --- a/opac/opac-ics.pl +++ b/opac/opac-ics.pl @@ -47,10 +47,11 @@ my $calendar = Data::ICal->new(); my $patron = Koha::Patrons->find( $borrowernumber ); my $pending_checkouts = $patron->pending_checkouts; +my $timestamp = dt_from_string(undef,undef,"UTC"); #Get current time in UTC + while ( my $c = $pending_checkouts->next ) { my $issue = $c->unblessed_all_relateds; my $vevent = Data::ICal::Entry::Event->new(); - my $timestamp = dt_from_string(undef,undef,"UTC"); #Get current time in UTC # Send some values to the template to generate summary and description $issue->{overdue} = $c->is_overdue; $template->param( @@ -60,13 +61,15 @@ while ( my $c = $pending_checkouts->next ) { ); # Catch the result of the template and split on newline my ($summary,$description) = split /\n/, $template->output; - my $datestart; + my ( $datestart, $datestart_local ); if ($issue->{'overdue'} && $issue->{'overdue'} == 1) { # Not much use adding an event in the past for a book that is overdue # so we set datestart = now - $datestart = $timestamp; + $datestart = $timestamp->clone(); + $datestart_local = $datestart->clone(); } else { $datestart = dt_from_string($issue->{'date_due'}); + $datestart_local = $datestart->clone(); $datestart->set_time_zone('UTC'); } # Create a UID that includes the issue number and the domain @@ -80,11 +83,24 @@ while ( my $c = $pending_checkouts->next ) { } my $uid = 'issue-' . $issue->{'issue_id'} . '@' . $domain; # Create the event + + my $dtstart; + if ($issue->{'overdue'} && $issue->{'overdue'} == 1) { + # It's already overdue so make it due as an all day event today + $dtstart = [ $datestart->ymd(q{}), { VALUE => 'DATE' } ]; + } elsif ( $datestart_local->hour eq '23' && $datestart_local->minute eq '59' ) { + # Checkouts due at 23:59 are "all day events" + $dtstart = [ $datestart->ymd(q{}), { VALUE => 'DATE' } ]; + } + else { # Checkouts due any other time are instantaneous events at the date and time due + $dtstart = DateTime::Format::ICal->format_datetime($datestart); + } + $vevent->add_properties( summary => $summary, description => $description, dtstamp => DateTime::Format::ICal->format_datetime($timestamp), - dtstart => DateTime::Format::ICal->format_datetime($datestart), + dtstart => $dtstart, uid => $uid, ); # Add it to the calendar -- 2.25.1