Bug 34117: Remove side effect from get_expiry_date

If get_expiry_date is passed a DateTime object as a parameter,
it modifies and returns the original object. When memberentry.pl
prefills the input fields for duplicating a patron, it passes the
enrollment date object to get_expiry_date. This causes the enrollment
date object to be modified with the expiry date value.

This patch modifies get_expiry_date to clone the DateTime object that it
receives as a parameter and return the clone, so that references to an
enrollment date object can be passed in safely.

To test:
1. Have or make a patron
2. Duplicate that patron
3. Before saving the new patron, scroll down to Registration Date and
   see that it's defaulting to a date in the future.
4. Apply patch and restart_all
5. Try duplicating a patron again
6. Registration Date should correctly set to today

Signed-off-by: Andrew Fuerste-Henry <andrewfh@dubcolib.org>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
This commit is contained in:
Emily Lamancusa 2023-07-20 13:41:15 -04:00 committed by Tomas Cohen Arazi
parent 9b1bd01a42
commit bba9feff5c
Signed by: tomascohen
GPG key ID: 0A272EA1B2F3C15F

View file

@ -106,7 +106,7 @@ sub get_expiry_date {
my ($self, $date ) = @_; my ($self, $date ) = @_;
if ( $self->enrolmentperiod ) { if ( $self->enrolmentperiod ) {
$date ||= dt_from_string; $date ||= dt_from_string;
$date = dt_from_string( $date ) unless ref $date; $date = ref $date ? $date->clone() : dt_from_string( $date );
return $date->add( months => $self->enrolmentperiod, end_of_month => 'limit' ); return $date->add( months => $self->enrolmentperiod, end_of_month => 'limit' );
} else { } else {
return $self->enrolmentperioddate; return $self->enrolmentperioddate;