@@ -, +, @@ more) Bug 14717: Prevent 0000-00-00 dates in patron data (3.21.00.023) prove t/db_dependent/Circulation/dateexpiry.t prove t/db_dependent/Koha/Patrons.t --- C4/Circulation.pm | 11 ++--------- C4/Utils/DataTables/Members.pm | 3 ++- Koha/Patron.pm | 4 ++-- t/db_dependent/Circulation/dateexpiry.t | 4 ++-- t/db_dependent/Koha/Patrons.t | 8 ++------ 5 files changed, 10 insertions(+), 20 deletions(-) --- a/C4/Circulation.pm +++ a/C4/Circulation.pm @@ -736,16 +736,9 @@ sub CanBookBeIssued { $issuingimpossible{DEBARRED} = 1; } } - if ( !defined $patron->dateexpiry || $patron->dateexpiry eq '0000-00-00') { + + if ( $patron->is_expired ) { $issuingimpossible{EXPIRED} = 1; - } else { - my $expiry_dt = dt_from_string( $patron->dateexpiry, 'sql', 'floating' ); - $expiry_dt->truncate( to => 'day'); - my $today = $now->clone()->truncate(to => 'day'); - $today->set_time_zone( 'floating' ); - if ( DateTime->compare($today, $expiry_dt) == 1 ) { - $issuingimpossible{EXPIRED} = 1; - } } # --- a/C4/Utils/DataTables/Members.pm +++ a/C4/Utils/DataTables/Members.pm @@ -184,7 +184,8 @@ sub search { # FIXME Should be formatted from the template $patron->{fines} = sprintf("%.2f", $balance); - if($patron->{dateexpiry} and $patron->{dateexpiry} ne '0000-00-00') { + if( $patron->{dateexpiry} ) { + # FIXME We should not format the date here, do it in template-side instead $patron->{dateexpiry} = output_pref( { dt => dt_from_string( $patron->{dateexpiry}, 'iso'), dateonly => 1} ); } else { $patron->{dateexpiry} = ''; --- a/Koha/Patron.pm +++ a/Koha/Patron.pm @@ -297,7 +297,7 @@ Returns 1 if the patron is expired or 0; sub is_expired { my ($self) = @_; return 0 unless $self->dateexpiry; - return 0 if $self->dateexpiry eq '0000-00-00'; + return 0 if $self->dateexpiry =~ '^9999'; return 1 if dt_from_string( $self->dateexpiry ) < dt_from_string->truncate( to => 'day' ); return 0; } @@ -317,7 +317,7 @@ sub is_going_to_expire { return 0 unless $delay; return 0 unless $self->dateexpiry; - return 0 if $self->dateexpiry eq '0000-00-00'; + return 0 if $self->dateexpiry =~ '^9999'; return 1 if dt_from_string( $self->dateexpiry )->subtract( days => $delay ) < dt_from_string->truncate( to => 'day' ); return 0; } --- a/t/db_dependent/Circulation/dateexpiry.t +++ a/t/db_dependent/Circulation/dateexpiry.t @@ -65,13 +65,13 @@ sub can_book_be_issued { $patron = $builder->build_object( { class => 'Koha::Patrons', value => { - dateexpiry => '0000-00-00', + dateexpiry => undef, categorycode => $patron_category->{categorycode}, } } ); ( $issuingimpossible, $needsconfirmation ) = C4::Circulation::CanBookBeIssued( $patron, $item->{barcode} ); - is( $issuingimpossible->{EXPIRED}, 1, 'The patron should be considered as expired if dateexpiry is 0000-00-00' ); + is( not( exists $issuingimpossible->{EXPIRED} ), 1, 'The patron should not be considered as expired if dateexpiry is not set' ); my $tomorrow = dt_from_string->add_duration( DateTime::Duration->new( days => 1 ) ); $item = $builder->build( { source => 'Item' } ); --- a/t/db_dependent/Koha/Patrons.t +++ a/t/db_dependent/Koha/Patrons.t @@ -186,13 +186,11 @@ subtest 'update_password' => sub { }; subtest 'is_expired' => sub { - plan tests => 5; + plan tests => 4; my $patron = $builder->build({ source => 'Borrower' }); $patron = Koha::Patrons->find( $patron->{borrowernumber} ); $patron->dateexpiry( undef )->store->discard_changes; is( $patron->is_expired, 0, 'Patron should not be considered expired if dateexpiry is not set'); - $patron->dateexpiry( '0000-00-00' ); - is( $patron->is_expired, 0, 'Patron should not be considered expired if dateexpiry is 0000-00-00'); $patron->dateexpiry( dt_from_string )->store->discard_changes; is( $patron->is_expired, 0, 'Patron should not be considered expired if dateexpiry is today'); $patron->dateexpiry( dt_from_string->add( days => 1 ) )->store->discard_changes; @@ -204,13 +202,11 @@ subtest 'is_expired' => sub { }; subtest 'is_going_to_expire' => sub { - plan tests => 9; + plan tests => 8; my $patron = $builder->build({ source => 'Borrower' }); $patron = Koha::Patrons->find( $patron->{borrowernumber} ); $patron->dateexpiry( undef )->store->discard_changes; is( $patron->is_going_to_expire, 0, 'Patron should not be considered going to expire if dateexpiry is not set'); - $patron->dateexpiry( '0000-00-00' ); - is( $patron->is_going_to_expire, 0, 'Patron should not be considered going to expire if dateexpiry is 0000-00-00'); t::lib::Mocks::mock_preference('NotifyBorrowerDeparture', 0); $patron->dateexpiry( dt_from_string )->store->discard_changes; --