more patron info fields
authorBill Erickson <berickxx@gmail.com>
Wed, 9 Sep 2020 17:46:53 +0000 (13:46 -0400)
committerBill Erickson <berickxx@gmail.com>
Mon, 30 Nov 2020 16:38:25 +0000 (08:38 -0800)
Signed-off-by: Bill Erickson <berickxx@gmail.com>
Open-ILS/src/perlmods/lib/OpenILS/Application/SIP2.pm
Open-ILS/src/perlmods/lib/OpenILS/Application/SIP2/Common.pm
Open-ILS/src/perlmods/lib/OpenILS/Application/SIP2/Patron.pm

index 57fbbfc..e0ed21b 100644 (file)
@@ -302,6 +302,8 @@ sub patron_response_common_data {
             ]
         };
     }
+
+    my $patron = $pdetails->{patron};
  
     return {
         fixed_fields => [
@@ -309,7 +311,7 @@ sub patron_response_common_data {
             $SC->spacebool($pdetails->{renew_denied}),
             $SC->spacebool($pdetails->{recall_denied}),
             $SC->spacebool($pdetails->{holds_denied}),
-            $SC->spacebool($pdetails->{patron}->card->active eq 'f'),
+            $SC->spacebool($patron->card->active eq 'f'),
             $SC->spacebool(0), # too many charged
             $SC->spacebool($pdetails->{too_may_overdue}),
             $SC->spacebool(0), # too many renewals
@@ -327,7 +329,11 @@ sub patron_response_common_data {
             {AA => $barcode},
             {BL => $SC->sipbool(1)},            # valid patron
             {BV => $pdetails->{balance_owed}},  # fee amount
-            {CQ => $SC->sipbool($password)}     # password verified if exists
+            {CQ => $SC->sipbool($password)},    # password verified if exists
+            {PA => $SC->format_date($session, $patron->expire_date)},
+            ($patron->dob ? 
+                {PB => $SC->format_date($session, $patron->dob, 'dob')} : ()),
+            {PC => $patron->profile->name}
         ]
     };
 }
index 8fc8c01..304c647 100644 (file)
@@ -1,5 +1,6 @@
 package OpenILS::Application::SIP2::Common;
 use strict; use warnings;
+use OpenILS::Utils::DateTime qw/:datetime/;
 
 use constant SIP_DATE_FORMAT => "%Y%m%d    %H%M%S";
 
@@ -9,6 +10,46 @@ sub sipdate {
     return $date->strftime(SIP_DATE_FORMAT);
 }
 
+sub format_date {
+    my ($class, $session, $date, $type) = @_;
+    $type ||= '';
+
+    return "" unless $date;
+
+    my $dt = DateTime::Format::ISO8601->new-> parse_datetime(clean_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 $mon    = $time[4]+1;
+    my $day    = $time[3];
+    my $hour   = $time[2];
+    my $minute = $time[1];
+    my $second = $time[0];
+  
+    $date = sprintf("%04d%02d%02d", $year, $mon, $day);
+
+    # Due dates need hyphen separators and time of day as well
+    if ($type eq 'due') {
+
+        if ($session->config->{due_date_use_sip_date_format}) {
+            $date = $class->sipdate($dt);
+
+        } else {
+            $date = sprintf("%04d-%02d-%02d %02d:%02d:%02d", 
+                $year, $mon, $day, $hour, $minute, $second);
+        }
+    }
+
+    return $date;
+}
+
 # False == 'N'
 sub sipbool {
     my ($class, $bool) = @_;
index b619cf9..04ec361 100644 (file)
@@ -328,6 +328,8 @@ sub set_patron_privileges {
     my $expire = DateTime::Format::ISO8601->new
         ->parse_datetime(clean_ISO8601($patron->expire_date));
 
+    $details->{expire_date} = $SC->format_date($patron->expire_date);
+
     if ($expire < DateTime->now) {
         $logger->info("SIP2 Patron account is expired; all privileges blocked");
         $details->{charge_denied} = 1;