@@ -, +, @@ --- 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(-) --- a/C4/Letters.pm +++ a/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; } --- a/C4/Members.pm +++ a/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; --- a/Koha/DateUtils.pm +++ a/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{}; } --- a/acqui/lateorders.pl +++ a/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'); --- a/installer/data/mysql/sysprefs.sql +++ a/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'); --- a/installer/data/mysql/updatedatabase.pl +++ a/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) --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/i18n_l10n.pref +++ a/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 --- a/t/DateUtils.t +++ a/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' ); --