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)
committerJason Stephenson <jstephenson@cwmars.org>
Tue, 29 Nov 2022 19:48:26 +0000 (14:48 -0500)
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 2bd5518..729e483 100644 (file)
@@ -15,94 +15,81 @@ 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';
-}
+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 => 0},
+    {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 => 'guardian',
+        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 => 0},
+    {name => 'in_house_registration', required => 0},
+);
 
-# 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 => 0},
-        {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 => 'guardian',
-             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 => 0},
-        {name => 'in_house_registration', required => 0},
-    );
-}
 sub load_ecard_form {
     my $self = shift;
     my $ctx = $self->ctx;
@@ -210,6 +197,51 @@ sub load_ecard_form {
 #
 #    return;
 #}
+=======
+
+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},
+);
+>>>>>>> feabaad6b0... Online Renewal - Progress on writing quipu into to db
 
 sub log_params {
     my $self = shift;
@@ -222,13 +254,8 @@ sub log_params {
         $msg .= "|" if $msg;
         $msg .= "$p=".$cgi->param($p);
     }
+    $logger->info("ECARD: Submit params: $msg");
 
-    # 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");
-    }
 }
 
 sub handle_testmode_api {
@@ -237,7 +264,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}
@@ -248,6 +275,7 @@ sub handle_testmode_api {
 
     $ctx->{response}->{messages} = [fields => \@doc_fields];
     $ctx->{response}->{status} = 'API_OK';
+
     return $self->compile_response;
 }
 
@@ -267,14 +295,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') || '';
@@ -303,7 +341,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;
@@ -387,14 +425,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;
 }
 
@@ -423,7 +461,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';
 
@@ -462,22 +500,29 @@ sub update_user {
         {
             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()
@@ -491,7 +536,7 @@ sub update_user {
     }
 
     # 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';
 
@@ -505,6 +550,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);
     }
 
@@ -636,7 +683,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_/;
@@ -670,46 +717,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?
+    my $user = $ctx->{user};
 
-    # 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?
+    $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?
+    $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';
@@ -860,6 +912,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',
@@ -872,15 +925,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 => $$}];