LP#1516757: ensure that SIP2 returns DOB correctly
authorBill Erickson <berickxx@gmail.com>
Mon, 16 Nov 2015 19:48:23 +0000 (14:48 -0500)
committerGalen Charlton <gmc@esilibrary.com>
Wed, 2 Mar 2016 20:39:53 +0000 (15:39 -0500)
Parse dates of birth using the local timezone to ensure that the date in
the database will match what is sent to SIP clients.  Otherwise, the
date will be parsed as UTC and may result in the DoB value being offset
by one day in the SIP response.

To test
-------
[1] Fire up a SIP client of some sort and retrieve a patron record;
    verify that the patron's date of birth is correct, and not
    offset by one day.

Signed-off-by: Bill Erickson <berickxx@gmail.com>
Signed-off-by: Galen Charlton <gmc@esilibrary.com>
Open-ILS/src/perlmods/lib/OpenILS/SIP.pm
Open-ILS/src/perlmods/lib/OpenILS/SIP/Patron.pm

index bd11e19..cf98f33 100644 (file)
@@ -186,12 +186,19 @@ sub patron_barcode_from_id {
 sub format_date {
     my $class = shift;
     my $date = shift;
 sub format_date {
     my $class = shift;
     my $date = shift;
-    my $type = shift || 'dob';
+    my $type = shift || '';
 
     return "" unless $date;
 
     my $dt = DateTime::Format::ISO8601->new->
         parse_datetime(OpenSRF::Utils::cleanse_ISO8601($date));
 
     return "" unless $date;
 
     my $dt = DateTime::Format::ISO8601->new->
         parse_datetime(OpenSRF::Utils::cleanse_ISO8601($date));
+
+    # actor.usr.dob stores dates without time/timezone, which causes
+    # DateTime to assume the date is stored as UTC.  Tell DateTime
+    # to use the local time zone, instead.
+    # Other dates will have time zones and should be parsed as-is.
+    $dt->set_time_zone('local') if $type eq 'dob';
+
     my @time = localtime($dt->epoch);
 
     my $year   = $time[5]+1900;
     my @time = localtime($dt->epoch);
 
     my $year   = $time[5]+1900;
index 16f2563..130d9bf 100644 (file)
@@ -299,7 +299,7 @@ sub home_phone {
 
 sub sip_birthdate {
     my $self = shift;
 
 sub sip_birthdate {
     my $self = shift;
-    my $dob = OpenILS::SIP->format_date($self->{user}->dob);
+    my $dob = OpenILS::SIP->format_date($self->{user}->dob, 'dob');
     syslog('LOG_DEBUG', "OILS: Patron DOB = $dob");
     return $dob;
 }
     syslog('LOG_DEBUG', "OILS: Patron DOB = $dob");
     return $dob;
 }