Online Renewal - Progress on writing quipu into to db
authorTerran McCanna <tmccanna@georgialibraries.org>
Fri, 21 Oct 2022 20:30:58 +0000 (16:30 -0400)
committerTerran McCanna <tmccanna@georgialibraries.org>
Fri, 21 Oct 2022 20:30:58 +0000 (16:30 -0400)
Still to do:
* Actor.pm - failing on standing penalties line 597
* sub update_addresses - creating separate addresses works if mailing & billing are different,
   but it is not checking the right checkbox
* writing new home ou is failing on terran-test, but should work on pines data
* after update, opac page doesn't refresh
* if this is a temporary (30 day) renewal, need to pass message to quipu telling patron to come to the library
* if temp renewal, need to add alert to patron account to inform staff to get proof of identity to do full renewal
* need to test voter registration survey on pines test server since I don't have that on my test server

Signed-off-by: Terran McCanna <tmccanna@georgialibraries.org>
Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Ecard.pm

index 5fa79ce..3ae2189 100644 (file)
@@ -15,94 +15,80 @@ use Digest::MD5 qw(md5_hex);
 $Data::Dumper::Indent = 0;
 my $U = 'OpenILS::Application::AppUtils';
 
-# Check URL to see if this is a new registration or a renewal
-my $refpath = '';
-if ($ENV{'HTTP_REFERER'}) {
-    $refpath = $ENV{'HTTP_REFERER'};
-};
-
 my $update_type = 'register';
-my @api_fields;
-
-if ($refpath =~ m|opac/renew/submit|) {
-    $update_type = 'renew';
-}
 
-# Create different api_fields array if registration or renewal
-if ($update_type eq 'renew') {
-    @api_fields = (
-        {name => 'vendor_username', required => 1},
-        {name => 'vendor_password', required => 1},
-        {name => 'patron_id', required => 1}, #needed for matching
-        {name => 'email', class => 'au', required => 1},
-        {name => 'day_phone', class => 'au', required => 1},
-        {name => 'home_ou', class => 'au', required => 1},
-        {name => 'pref_first_given_name', class => 'au'},
-        {name => 'pref_second_given_name', class => 'au'},
-        {name => 'pref_family_name', class => 'au'},
-        {name => 'physical_street1', class => 'aua', required => 1},
-        {name => 'physical_street1_name'},
-        {name => 'physical_street2', class => 'aua'},
-        {name => 'physical_city', class => 'aua', required => 1},
-        {name => 'physical_post_code', class => 'aua', required => 1},
-        {name => 'physical_county', class => 'aua', required => 1},
-        {name => 'physical_state', class => 'aua', required => 1},
-        {name => 'physical_country', class => 'aua', required => 1},
-        {name => 'mailing_street1', class => 'aua', required => 1},
-        {name => 'mailing_street1_name'},
-        {name => 'mailing_street2', class => 'aua'},
-        {name => 'mailing_city', class => 'aua', required => 1},
-        {name => 'mailing_post_code', class => 'aua', required => 1},
-        {name => 'mailing_county', class => 'aua', required => 1},
-        {name => 'mailing_state', class => 'aua', required => 1},
-        {name => 'mailing_country', class => 'aua', required => 1},
-        {name => 'voter_registration', class => 'asvr', required => 1},
-        {name => 'temp_renewal'} #new boolean value
-    );
-} else {
-    @api_fields = (
-        {name => 'vendor_username', required => 1},
-        {name => 'vendor_password', required => 1},
-        {name => 'first_given_name', class => 'au', required => 1},
-        {name => 'second_given_name', class => 'au'},
-        {name => 'family_name', class => 'au', required => 1},
-        {name => 'suffix', class => 'au'},
-        {name => 'email', class => 'au', required => 1},
-        {name => 'passwd', class => 'au', required => 1},
-        {name => 'day_phone', class => 'au', required => 1},
-        {name => 'dob', class => 'au', required => 1},
-        {name => 'home_ou', class => 'au', required => 1},
-        {name => 'ident_type', class => 'au', required => 1},
-        {name => 'ident_value', class => 'au', required => 1},
-        {name => 'ident_value2',
+my @api_fields_renew = (
+    {name => 'vendor_username', required => 1},
+    {name => 'vendor_password', required => 1},
+    {name => 'email', class => 'au'},
+    {name => 'day_phone', class => 'au', required => 1},
+    {name => 'home_ou', class => 'au'},
+    {name => 'pref_first_given_name', class => 'au'},
+    {name => 'pref_second_given_name', class => 'au'},
+    {name => 'pref_family_name', class => 'au'},
+    {name => 'physical_id', class => 'aua'},
+    {name => 'physical_street1', class => 'aua'},
+    {name => 'physical_street1_name'},
+    {name => 'physical_street2', class => 'aua'},
+    {name => 'physical_city', class => 'aua'},
+    {name => 'physical_post_code', class => 'aua'},
+    {name => 'physical_county', class => 'aua'},
+    {name => 'physical_state', class => 'aua'},
+    {name => 'physical_country', class => 'aua'},
+    {name => 'mailing_id', class => 'aua'},
+    {name => 'mailing_street1', class => 'aua'},
+    {name => 'mailing_street1_name'},
+    {name => 'mailing_street2', class => 'aua'},
+    {name => 'mailing_city', class => 'aua'},
+    {name => 'mailing_post_code', class => 'aua'},
+    {name => 'mailing_county', class => 'aua'},
+    {name => 'mailing_state', class => 'aua'},
+    {name => 'mailing_country', class => 'aua'},
+    {name => 'voter_registration', class => 'asvr'},
+);
+
+my @api_fields_register = (
+    {name => 'vendor_username', required => 1},
+    {name => 'vendor_password', required => 1},
+    {name => 'first_given_name', class => 'au', required => 1},
+    {name => 'second_given_name', class => 'au'},
+    {name => 'family_name', class => 'au', required => 1},
+    {name => 'suffix', class => 'au'},
+    {name => 'email', class => 'au', required => 1},
+    {name => 'passwd', class => 'au', required => 1},
+    {name => 'day_phone', class => 'au', required => 1},
+    {name => 'dob', class => 'au', required => 1},
+    {name => 'home_ou', class => 'au', required => 1},
+    {name => 'ident_type', class => 'au', required => 1},
+    {name => 'ident_value', class => 'au', required => 1},
+    {name => 'ident_value2',
          class => 'au', 
          notes => "AKA parent/guardian",
          required_if => 'Patron is less than 18 years old'
-        },
-        {name => 'pref_first_given_name', class => 'au'},
-        {name => 'pref_second_given_name', class => 'au'},
-        {name => 'pref_family_name', class => 'au'},
-        {name => 'pref_suffix', class => 'au'},
-        {name => 'physical_street1', class => 'aua', required => 1},
-        {name => 'physical_street1_name'},
-        {name => 'physical_street2', class => 'aua'},
-        {name => 'physical_city', class => 'aua', required => 1},
-        {name => 'physical_post_code', class => 'aua', required => 1},
-        {name => 'physical_county', class => 'aua', required => 1},
-        {name => 'physical_state', class => 'aua', required => 1},
-        {name => 'physical_country', class => 'aua', required => 1},
-        {name => 'mailing_street1', class => 'aua', required => 1},
-        {name => 'mailing_street1_name'},
-        {name => 'mailing_street2', class => 'aua'},
-        {name => 'mailing_city', class => 'aua', required => 1},
-        {name => 'mailing_post_code', class => 'aua', required => 1},
-        {name => 'mailing_county', class => 'aua', required => 1},
-        {name => 'mailing_state', class => 'aua', required => 1},
-        {name => 'mailing_country', class => 'aua', required => 1},
-        {name => 'voter_registration', class => 'asvr', required => 1},
-        {name => 'in_house_registration', required => 1},
-    );
-}
+    },
+    {name => 'pref_first_given_name', class => 'au'},
+    {name => 'pref_second_given_name', class => 'au'},
+    {name => 'pref_family_name', class => 'au'},
+    {name => 'pref_suffix', class => 'au'},
+    {name => 'physical_street1', class => 'aua', required => 1},
+    {name => 'physical_street1_name'},
+    {name => 'physical_street2', class => 'aua'},
+    {name => 'physical_city', class => 'aua', required => 1},
+    {name => 'physical_post_code', class => 'aua', required => 1},
+    {name => 'physical_county', class => 'aua', required => 1},
+    {name => 'physical_state', class => 'aua', required => 1},
+    {name => 'physical_country', class => 'aua', required => 1},
+    {name => 'mailing_street1', class => 'aua', required => 1},
+    {name => 'mailing_street1_name'},
+    {name => 'mailing_street2', class => 'aua'},
+    {name => 'mailing_city', class => 'aua', required => 1},
+    {name => 'mailing_post_code', class => 'aua', required => 1},
+    {name => 'mailing_county', class => 'aua', required => 1},
+    {name => 'mailing_state', class => 'aua', required => 1},
+    {name => 'mailing_country', class => 'aua', required => 1},
+    {name => 'voter_registration', class => 'asvr', required => 1},
+    {name => 'in_house_registration', required => 1},
+);
 
 sub log_params {
     my $self = shift;
@@ -115,13 +101,8 @@ sub log_params {
         $msg .= "|" if $msg; 
         $msg .= "$p=".$cgi->param($p);
     }
-    
-    # use different log msg if reg or renew
-    if ($update_type == 'register') {
-        $logger->info("ECARD: Submit params: $msg");
-    } else {
-        $logger->info("E-RENEW: Submit params: $msg");
-    }
+    $logger->info("ECARD: Submit params: $msg");
+
 }
 
 sub handle_testmode_api {
@@ -130,7 +111,7 @@ sub handle_testmode_api {
 
     # Strip data we don't want to publish.
     my @doc_fields;
-    for my $field_info (@api_fields) {
+    for my $field_info (@api_fields_register) {
         my $doc_info = {};
         for my $info_key (keys %$field_info) {
             $doc_info->{$info_key} = $field_info->{$info_key} 
@@ -141,6 +122,7 @@ sub handle_testmode_api {
 
     $ctx->{response}->{messages} = [fields => \@doc_fields];
     $ctx->{response}->{status} = 'API_OK';
+
     return $self->compile_response;
 }
 
@@ -160,14 +142,24 @@ sub handle_datamode_api {
     }
 
     $ctx->{response}->{status} = 'DATA_OK';
+
     return $self->compile_response;
 }
 
 sub load_ecard_submit {
+
     my $self = shift;
     my $ctx = $self->ctx;
     my $cgi = $self->cgi;
 
+    #determine whether this is a new registration or a renewal
+    my $refpath = $self->apache->path_info;
+    if ($refpath =~ m|opac/renew/submit|) {
+        $update_type = 'renew';
+    } else {
+        $update_type = 'register';
+    }
+
     $self->log_params;
 
     my $testmode = $cgi->param('testmode') || '';
@@ -196,7 +188,7 @@ sub load_ecard_submit {
     return $self->handle_datamode_api($datamode) if $datamode;
 
     # Accommodate reg vs renew
-    if ($update_type == 'register') {
+    if ($update_type eq 'register') {
         return $self->compile_response unless $self->make_user;
         return $self->compile_response unless $self->add_addresses;
         return $self->compile_response unless $self->check_dupes;
@@ -218,6 +210,9 @@ sub load_ecard_submit {
     
     $ctx->{response}->{status} = 'OK';
     $ctx->{response}->{barcode} = $ctx->{user}->card->barcode;
+    if ($update_type eq 'renew') {
+        $ctx->{response}->{expire_date} = $ctx->{user}->expire_date;
+    }
 
     return $self->compile_response;
 }
@@ -262,14 +257,14 @@ sub verify_vendor_host {
 sub compile_response {
     my $self = shift;
     my $ctx = $self->ctx;
+
     $self->apache->content_type("application/json; charset=utf-8");
     $ctx->{response} = OpenSRF::Utils::JSON->perl2JSON($ctx->{response});
-    # Different log message if renew
-    if ($update_type == 'register') {
-        $logger->info("ECARD responding with " . $ctx->{response});
-    } else {
-        $logger->info("E-RENEW responding with " . $ctx->{response});
-    }
+    $logger->info("ECARD responding with " . $ctx->{response});
+
+#TERRAN TEST
+$logger->error("TERRAN response being sent to Quipu is: " . $ctx->{response});
+
     return Apache2::Const::OK;
 }
 
@@ -300,7 +295,7 @@ sub make_user {
             seconds => interval_to_seconds($grp->perm_interval))->iso8601()
     );
 
-    for my $field_info (@api_fields) {
+    for my $field_info (@api_fields_register) {
         my $field = $field_info->{name};
         next unless $field_info->{class} eq 'au';
 
@@ -333,30 +328,37 @@ sub update_user {
     my $e = $self->editor;
     my $ctx = $self->ctx;
     my $cgi = $self->cgi;
-    
+
     # Grab user id, retrieve patron info from db and create patron object
     my $patron_id = $cgi->param('patron_id');
-    
+
     my $au = $self->editor->retrieve_actor_user([$patron_id, 
         {
             flesh => 1,
             flesh_fields => {
-                au => ['billing_address', 'mailing_address', 'groups']
+                au => ['billing_address', 'mailing_address', 'groups', 'permissions', 'standing_penalties']
             }
         }
     ]);
+    #indicate that this is an update, not a new record
+    $au->isnew(0);
     
     # Replace values in patron object with new data
-    
+
     # Need to append new keyword for use in reports later
-    $au->name_keywords($au->name_keywords + ' quipu_renew');
+    my $orig_kw = $au->name_keywords;
+    if ($orig_kw ne '') {
+        $au->name_keywords("$orig_kw quipu_renew");
+    } else {
+        $au->name_keywords("quipu_renew");
+    }
 
     # Temp renewal is only 30 days, otherwise use perm_interval
     # If perm group is Homebound (53) or GLS (56), allow full renewal
     my $temp_renewal = $cgi->param('temp_renewal');
     my $perm_grp = $au->profile;
 
-    if ($temp_renewal == '1' && $perm_grp != '53' && $perm_grp != '56') {
+    if ($temp_renewal eq '1' && $perm_grp ne '53' && $perm_grp ne '56') {
         $au->expire_date(
             DateTime->now(time_zone => 'local')->add(
                 seconds => interval_to_seconds('30 days'))->iso8601()
@@ -368,9 +370,9 @@ sub update_user {
                 seconds => interval_to_seconds($grp->perm_interval))->iso8601()
         );
     }
-    
+
     # loop through fields submitted by quipu
-    for my $field_info (@api_fields) {
+    for my $field_info (@api_fields_renew) {
         my $field = $field_info->{name};
         next unless $field_info->{class} eq 'au';
 
@@ -384,6 +386,8 @@ sub update_user {
         }
 
         $val = undef if $field eq 'day_phone' && $val eq '--';
+        $val = $au->home_ou if $field eq 'home_ou' && $val eq '';
+
         $au->$field($val);
     }
 
@@ -498,7 +502,7 @@ sub add_addresses {
 
     # Confirm we have values for all of the required fields.
     # Apply values to our in-progress address object.
-    for my $field_info (@api_fields) {
+    for my $field_info (@api_fields_register) {
         my $field = $field_info->{name};
         next unless $field =~ /physical|mailing/;
         next if $field =~ /street1_/;
@@ -532,45 +536,51 @@ sub add_addresses {
     return 1;
 }
 
-# New subroutine to update existing addresses
-# Need to figure out how to update the right ones
 sub update_addresses {
     my $self = shift;
     my $cgi = $self->cgi;
     my $ctx = $self->ctx;
     my $e = $ctx->{editor};
-    my $user = $ctx->{user}; # probably need to do something else here?
-    
-    # Need to see how to pass the patron id properly here
-    # Do we need to get the ID of the existing address? 
-    # Or will it match because of the address_type?
-    my $physical_addr = Fieldmapper::actor::user_address->new; 
-    $physical_addr->isnew(0); # is this right? 
+    my $user = $ctx->{user};
+
+    my $physical_addr = Fieldmapper::actor::user_address->new;
+    $physical_addr->id($user->billing_address->id);
     $physical_addr->usr($user->id);
     $physical_addr->address_type('PHYSICAL');
     $physical_addr->within_city_limits('f');
+    $physical_addr->valid('t');
+    $physical_addr->pending('f');
 
-    my $mailing_addr = Fieldmapper::actor::user_address->new;  
-    $mailing_addr->isnew(0); # is this right?
+    my $mailing_addr = Fieldmapper::actor::user_address->new;
+    $mailing_addr->id($user->mailing_address->id);
     $mailing_addr->usr($user->id);
     $mailing_addr->address_type('MAILING');
     $mailing_addr->within_city_limits('f');
-
-   # Use as both billing and mailing via virtual ID.
-    $physical_addr->id(-1);
-    $mailing_addr->id(-2);
-    $user->billing_address(-1);
-    $user->mailing_address(-2);
+    $mailing_addr->valid('t');
+    $mailing_addr->pending('f');
 
     # Confirm we have values for all of the required fields.
     # Apply values to our in-progress address object.
-    for my $field_info (@api_fields) {
+    for my $field_info (@api_fields_renew) {
         my $field = $field_info->{name};
         next unless $field =~ /physical|mailing/;
         next if $field =~ /street1_/;
 
         my $val = $cgi->param($field);
 
+    # if the addr ids are the same, but the streets don't match, create second address
+    if ($physical_addr->id eq $mailing_addr->id && $physical_addr->street1 ne $mailing_addr->street1) {
+        $physical_addr->isnew(0);
+        $physical_addr->ischanged(1);
+        $mailing_addr->isnew(1);
+        $mailing_addr->ischanged(0);
+    } else {
+        $physical_addr->isnew(0);
+        $physical_addr->ischanged(1);
+        $mailing_addr->isnew(0);
+        $mailing_addr->ischanged(1);
+    }
+
         if ($field_info->{required} && !$val) {
             my $msg = "Value required for field: '$field'";
             $ctx->{response}->{status} = 'INVALID_PARAMS';
@@ -677,6 +687,7 @@ sub save_user {
     my $ctx = $self->ctx;
     my $cgi = $self->cgi;
     my $user = $ctx->{user};
+    my $update_type = $user->isnew;
 
     my $resp = $U->simplereq(
         'open-ils.actor',
@@ -689,15 +700,15 @@ sub save_user {
     if ($U->is_event($resp)) {
         my $msg = '';
 
-    if ($update_type == 'register') {
-        $msg = "Error creating user account: " . $resp->{textcode};
-        $logger->error("ECARD: $msg");
-        $ctx->{response}->{status} = 'CREATE_ERR';  
- } else {
-        $msg = "Error updating user account: " . $resp->{textcode};
-        $logger->error("E-RENEW: $msg"); 
-        $ctx->{response}->{status} = 'UPDATE_ERR'; # Does this work?
-    }
+        if ($update_type eq '1') {
+            $msg = "Error creating user account: " . $resp->{textcode};
+            $logger->error("ECARD: $msg");
+            $ctx->{response}->{status} = 'CREATE_ERR';
       } else {
+            $msg = "Error updating user account: " . $resp->{textcode};
+            $logger->error("E-RENEW: $msg");
+            $ctx->{response}->{status} = 'UPDATE_ERR'; # Does this work?
+        }
 
         $ctx->{response}->{messages} = [{msg => $msg, pid => $$}];