@@ -, +, @@ Add a test if $dt is really a DateTime before calling method ymd. Preventing a crash like: Can't locate object method "ymd" via package "dateonly" Change [2] fixes a specific call where this went wrong, but this test may still catch one or two other occurrences in the code. Scalarize the return value of dt_from_string as a hash parameter for output_pref. Like: { dt => scalar dt_from_string( $date ), dateonly => 1 } If the sub would return undef (without adding scalar), the hash would have an odd number of elements. (A warning is suppressed in C4/Search.) For a value of 0000-00-00 in item.onloan, this resolves an internal server error on a search with this item in the results. (Make 952 $q visible and just enter some text in it.) in a crash. (Plack will just say: Internal server error.) --- C4/Search.pm | 2 +- Koha/DateUtils.pm | 2 +- t/DateUtils.t | 9 ++++++++- 3 files changed, 10 insertions(+), 3 deletions(-) --- a/C4/Search.pm +++ a/C4/Search.pm @@ -2082,7 +2082,7 @@ sub searchResults { { $onloan_count++; my $key = $prefix . $item->{onloan} . $item->{barcode}; - $onloan_items->{$key}->{due_date} = output_pref( { dt => dt_from_string( $item->{onloan} ), dateonly => 1 } ); + $onloan_items->{$key}->{due_date} = output_pref( { dt => scalar dt_from_string( $item->{onloan} ), dateonly => 1 } ); $onloan_items->{$key}->{count}++ if $item->{$hbranch}; $onloan_items->{$key}->{branchname} = $item->{branchname}; $onloan_items->{$key}->{location} = $shelflocations->{ $item->{location} }; --- a/Koha/DateUtils.pm +++ a/Koha/DateUtils.pm @@ -219,7 +219,7 @@ sub output_pref { carp "Invalid date '$str' passed to output_pref\n" if $@; } - return unless defined $dt; + return unless defined $dt && ref($dt) eq 'DateTime'; # FIXME: see bug 13242 => no TZ for dates 'infinite' if ( $dt->ymd !~ /^9999/ ) { --- a/t/DateUtils.t +++ a/t/DateUtils.t @@ -4,7 +4,7 @@ use DateTime::TimeZone; use C4::Context; -use Test::More tests => 60; +use Test::More tests => 63; use Test::MockModule; use Test::Warn; @@ -219,6 +219,13 @@ is( output_pref( { dt => $dt, dateonly => 1 } ), '01/01/1900', 'dt_from_string s $dt = dt_from_string('2015-01-31 01:02:03'); is( output_pref( {dt => $dt} ), '31/01/2015 01:02', 'dt_from_string should fallback to sql format' ); +# output_pref with no parameters, single parameter (no hash) +is( output_pref(), undef, 'output_pref without parameters' ); +is( output_pref( 'no_dt' ), undef, 'Passed single invalid dt to output_pref' ); + +# pass invalid dt via hash +is( output_pref({ dt => 'no_dt' }), undef, 'Passed invalid dt in hash to output_pref' ); + # output_pref with str parameter is( output_pref( { 'str' => $testdate_iso, dateformat => 'iso', dateonly => 1 } ), $testdate_iso, 'output_pref should handle correctly the iso parameter' ); my $output_for_invalid_date; --