From 2395f781fde622e5b9219a2a1b2e2f4d0904450e 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 Signed-off-by: Tomas Cohen Arazi --- 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 62603f3a2f..ba1f6c6329 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.20.1