From 4d07f622061cc6a7f9f7becd63a2f00359582c60 Mon Sep 17 00:00:00 2001 From: Kyle M Hall Date: Tue, 6 Nov 2012 14:00:06 -0500 Subject: [PATCH] Bug 9014 - Add time due to slips This patch modifies Koha::DateUtils::output_pref to support the new system preference TimeFormat, which defines the visual format for a time as either the 24 hour format ( default ), or the 12 hour format (HH:MM AM/PM). The patch also modifies C4::Members::IssueSlip to use output_pref rather than format_date. Test Plan: 1) Apply patch 2) Run updatedatabase.pl 3) Issue an item to a patron, verify the times are in 24 hour format. 4) Switch TimeFormat to the 12 hour format. 5) Revist the patron record you issued an item to, times should now be in a 12 hour format. 6) Print a slip for this patron, you should now see the time as well as the date. --- C4/Letters.pm | 4 +- C4/Members.pm | 4 +- Koha/DateUtils.pm | 38 +++++++++++++------ acqui/lateorders.pl | 4 +- installer/data/mysql/sysprefs.sql | 1 + installer/data/mysql/updatedatabase.pl | 7 ++++ .../en/modules/admin/preferences/i18n_l10n.pref | 8 ++++ t/DateUtils.t | 28 +++++++++------ 8 files changed, 65 insertions(+), 29 deletions(-) diff --git a/C4/Letters.pm b/C4/Letters.pm index a585ff8..78534b8 100644 --- a/C4/Letters.pm +++ b/C4/Letters.pm @@ -29,6 +29,7 @@ use C4::Branch; use C4::Log; use C4::SMS; use C4::Debug; +use Koha::DateUtils; use Date::Calc qw( Add_Delta_Days ); use Encode; use Unicode::Normalize; @@ -695,8 +696,7 @@ sub _parseletter { } if ($letter->{content} && $letter->{content} =~ /<>/) { - my @da = localtime(); - my $todaysdate = "$da[2]:$da[1] " . C4::Dates->today(); + my $todaysdate = output_pref( DateTime->now() ); $letter->{content} =~ s/<>/$todaysdate/go; } diff --git a/C4/Members.pm b/C4/Members.pm index 81b014b..3b1615f 100644 --- a/C4/Members.pm +++ b/C4/Members.pm @@ -2318,8 +2318,8 @@ sub IssueSlip { elsif ((substr $it->{'date_due'}, 0, 10) le $now) { $it->{'overdue'} = 1; } - - $it->{'date_due'}=format_date($it->{'date_due'}); + my $dt = dt_from_string( $it->{'date_due'} ); + $it->{'date_due'} = output_pref( $dt );; } my @issues = sort { $b->{'timestamp'} <=> $a->{'timestamp'} } @$issueslist; diff --git a/Koha/DateUtils.pm b/Koha/DateUtils.pm index 4ffc160..c39af94 100644 --- a/Koha/DateUtils.pm +++ b/Koha/DateUtils.pm @@ -93,7 +93,7 @@ s/(\d{4})(\d{2})(\d{2})\s+(\d{2})(\d{2})(\d{2})/$1-$2-$3T$4:$5:$6/; =head2 output_pref -$date_string = output_pref($dt, [$format] ); +$date_string = output_pref($dt, [$date_format], [$time_format] ); Returns a string containing the time & date formatted as per the C4::Context setting, or C if C was provided. @@ -101,7 +101,9 @@ or C if C was provided. A second parameter allows overriding of the syspref value. This is for testing only In usage use the DateTime objects own methods for non standard formatting -A third parameter allows to specify if the output format contains the hours and minutes. +A third parameter allows overriding of the TimeFormat syspref value + +A fourth parameter allows to specify if the output format contains the hours and minutes. If it is not defined, the default value is 0; =cut @@ -109,32 +111,38 @@ If it is not defined, the default value is 0; sub output_pref { my $dt = shift; my $force_pref = shift; # if testing we want to override Context + my $force_time = shift; my $dateonly = shift || 0; # if you don't want the hours and minutes return unless defined $dt; my $pref = defined $force_pref ? $force_pref : C4::Context->preference('dateformat'); + + my $time_format = $force_time || C4::Context->preference('TimeFormat'); + my $time = ( $time_format eq '12hr' ) ? '%I:%M %p' : '%H:%M'; + given ($pref) { when (/^iso/) { return $dateonly - ? $dt->strftime('%Y-%m-%d') - : $dt->strftime('%Y-%m-%d %H:%M'); + ? $dt->strftime("%Y-%m-%d") + : $dt->strftime("%Y-%m-%d $time"); } when (/^metric/) { return $dateonly - ? $dt->strftime('%d/%m/%Y') - : $dt->strftime('%d/%m/%Y %H:%M'); + ? $dt->strftime("%d/%m/%Y") + : $dt->strftime("%d/%m/%Y $time"); } when (/^us/) { + return $dateonly - ? $dt->strftime('%m/%d/%Y') - : $dt->strftime('%m/%d/%Y %H:%M'); + ? $dt->strftime("%m/%d/%Y") + : $dt->strftime("%m/%d/%Y $time"); } default { return $dateonly - ? $dt->strftime('%Y-%m-%d') - : $dt->strftime('%Y-%m-%d %H:%M'); + ? $dt->strftime("%Y-%m-%d") + : $dt->strftime("%Y-%m-%d $time"); } } @@ -173,11 +181,14 @@ with output_pref as it is a frequent activity in scripts sub format_sqldatetime { my $str = shift; my $force_pref = shift; # if testing we want to override Context + my $force_time = shift; + my $dateonly = shift; + if ( defined $str && $str =~ m/^\d{4}-\d{2}-\d{2}/ ) { my $dt = dt_from_string( $str, 'sql' ); return q{} unless $dt; $dt->truncate( to => 'minute' ); - return output_pref( $dt, $force_pref ); + return output_pref( $dt, $force_pref, $force_time, $dateonly ); } return q{}; } @@ -194,10 +205,13 @@ with output_pref_due as it is a frequent activity in scripts sub format_sqlduedatetime { my $str = shift; my $force_pref = shift; # if testing we want to override Context + my $force_time = shift; + my $dateonly = shift; + if ( defined $str && $str =~ m/^\d{4}-\d{2}-\d{2}/ ) { my $dt = dt_from_string( $str, 'sql' ); $dt->truncate( to => 'minute' ); - return output_pref_due( $dt, $force_pref ); + return output_pref_due( $dt, $force_pref, $force_time, $dateonly ); } return q{}; } diff --git a/acqui/lateorders.pl b/acqui/lateorders.pl index 544370d..497242f 100755 --- a/acqui/lateorders.pl +++ b/acqui/lateorders.pl @@ -86,10 +86,10 @@ my $estimateddeliverydateto_dt = $estimateddeliverydateto # Format the output of "date from" and "date to" if ($estimateddeliverydatefrom_dt) { - $estimateddeliverydatefrom = output_pref($estimateddeliverydatefrom_dt, undef, 1); + $estimateddeliverydatefrom = output_pref($estimateddeliverydatefrom_dt, undef, undef, 1); } if ($estimateddeliverydateto_dt) { - $estimateddeliverydateto = output_pref($estimateddeliverydateto_dt, undef, 1); + $estimateddeliverydateto = output_pref($estimateddeliverydateto_dt, undef, undef, 1); } my $branch = $input->param('branch'); diff --git a/installer/data/mysql/sysprefs.sql b/installer/data/mysql/sysprefs.sql index 2fb5bd4..4fa39d6 100644 --- a/installer/data/mysql/sysprefs.sql +++ b/installer/data/mysql/sysprefs.sql @@ -395,3 +395,4 @@ INSERT INTO systempreferences (`variable`, `value`, `options`, `explanation`, `t ('PatronSelfRegistrationExpireTemporaryAccountsDelay', '0', NULL, 'If PatronSelfRegistrationDefaultCategory is enabled, this system preference controls how long a patron can have a temporary status before the account is deleted automatically. It is an integer value representing a number of days to wait before deleting a temporary patron account. Setting it to 0 disables the deleting of temporary accounts.', 'Integer'), ('PatronSelfRegistrationBorrowerMandatoryField', 'surname|firstname', NULL , 'Choose the mandatory fields for a patron''s account, when registering via the OPAC.', 'free'), ('PatronSelfRegistrationBorrowerUnwantedField', '', NULL , 'Name the fields you don''t want to display when registering a new patron via the OPAC.', 'free'); +INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('TimeFormat','24hr','12hr|24hr','Defines the global time format for visual output.','Choice'); diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl index cdc53cb..22fbcdc 100755 --- a/installer/data/mysql/updatedatabase.pl +++ b/installer/data/mysql/updatedatabase.pl @@ -6285,6 +6285,13 @@ if (CheckVersion($DBversion)) { SetVersion ($DBversion); } +$DBversion = "3.11.00.XXX"; +if (C4::Context->preference("Version") < TransformToNum($DBversion)) { + $dbh->do("INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('TimeFormat','24hr','12hr|24hr','Defines the global time format for visual output.','Choice')"); + print "Upgrade to $DBversion done (Add syspref TimeFormat)\n"; + SetVersion ($DBversion); +} + =head1 FUNCTIONS =head2 TableExists($table) diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/i18n_l10n.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/i18n_l10n.pref index cc6700b..02985d3 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/i18n_l10n.pref +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/i18n_l10n.pref @@ -9,6 +9,14 @@ I18N/L10N: iso: yyyy-mm-dd - . - + - Format times in + - pref: TimeFormat + default: 24hr + choices: + 24hr: 24 hour format ( e.g. "14:18" ) + 12hr: 12 hour format ( e.g. "02:18 PM" ) + - . + - - Use - pref: CalendarFirstDayOfWeek default: Sunday diff --git a/t/DateUtils.t b/t/DateUtils.t index a55c0d9..6fc2984 100755 --- a/t/DateUtils.t +++ b/t/DateUtils.t @@ -23,32 +23,38 @@ cmp_ok( $dt->ymd(), 'eq', $testdate_iso, 'Returned object matches input' ); $dt->set_hour(12); $dt->set_minute(0); -my $date_string = output_pref( $dt, 'iso' ); +my $date_string = output_pref( $dt, 'iso', '24hr' ); cmp_ok $date_string, 'eq', '2011-06-16 12:00', 'iso output'; -my $date_string = output_pref( $dt, 'iso',1 ); +my $date_string = output_pref( $dt, 'iso', '12hr' ); +cmp_ok $date_string, 'eq', '2011-06-16 12:00 PM', 'iso output 12hr'; + +$date_string = output_pref( $dt, 'iso', undef, 1 ); cmp_ok $date_string, 'eq', '2011-06-16', 'iso output (date only)'; -$date_string = output_pref( $dt, 'us' ); +$date_string = output_pref( $dt, 'us', '24hr' ); cmp_ok $date_string, 'eq', '06/16/2011 12:00', 'us output'; -$date_string = output_pref( $dt, 'us', 1 ); +$date_string = output_pref( $dt, 'us', '12hr' ); +cmp_ok $date_string, 'eq', '06/16/2011 12:00 PM', 'us output 12hr'; + +$date_string = output_pref( $dt, 'us', undef, 1 ); cmp_ok $date_string, 'eq', '06/16/2011', 'us output (date only)'; # metric should return the French Revolutionary Calendar Really -$date_string = output_pref( $dt, 'metric' ); +$date_string = output_pref( $dt, 'metric', '24hr' ); cmp_ok $date_string, 'eq', '16/06/2011 12:00', 'metric output'; -$date_string = output_pref( $dt, 'metric',1 ); +$date_string = output_pref( $dt, 'metric', undef, 1 ); cmp_ok $date_string, 'eq', '16/06/2011', 'metric output (date only)'; -$date_string = output_pref_due( $dt, 'metric' ); +$date_string = output_pref_due( $dt, 'metric', '24hr' ); cmp_ok $date_string, 'eq', '16/06/2011 12:00', 'output_pref_due preserves non midnight HH:SS'; $dt->set_hour(23); $dt->set_minute(59); -$date_string = output_pref_due( $dt, 'metric' ); +$date_string = output_pref_due( $dt, 'metric', '24hr' ); cmp_ok $date_string, 'eq', '16/06/2011', 'output_pref_due truncates HH:SS at midnight'; @@ -87,20 +93,20 @@ cmp_ok( $dt0->ymd(), 'eq', $ymd, 'Returned object corrects iso day 0' ); $dt0 = dt_from_string( '0000-00-00', 'iso' ); is( $dt0, undef, "undefined returned for 0 iso date" ); -my $formatted = format_sqldatetime( '2011-06-16 12:00:07', 'metric' ); +my $formatted = format_sqldatetime( '2011-06-16 12:00:07', 'metric', '24hr' ); cmp_ok( $formatted, 'eq', '16/06/2011 12:00', 'format_sqldatetime conversion' ); $formatted = format_sqldatetime( undef, 'metric' ); cmp_ok( $formatted, 'eq', q{}, 'format_sqldatetime formats undef as empty string' ); -$formatted = format_sqlduedatetime( '2011-06-16 12:00:07', 'metric' ); +$formatted = format_sqlduedatetime( '2011-06-16 12:00:07', 'metric', '24hr' ); cmp_ok( $formatted, 'eq', '16/06/2011 12:00', 'format_sqlduedatetime conversion for hourly loans' ); -$formatted = format_sqlduedatetime( '2011-06-16 23:59:07', 'metric' ); +$formatted = format_sqlduedatetime( '2011-06-16 23:59:07', 'metric', '24hr' ); cmp_ok( $formatted, 'eq', '16/06/2011', 'format_sqlduedatetime conversion for daily loans' ); -- 1.7.2.5