From 32e2ccadb373bbbb2795adc79352777e2b8f214d Mon Sep 17 00:00:00 2001 From: Terran McCanna Date: Fri, 21 Oct 2022 16:30:58 -0400 Subject: [PATCH] Online Renewal - Progress on writing quipu into to db 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 --- .../perlmods/lib/OpenILS/WWW/EGCatLoader/Ecard.pm | 281 +++++++++++---------- 1 file changed, 146 insertions(+), 135 deletions(-) diff --git a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Ecard.pm b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Ecard.pm index 5fa79cecfd..3ae2189411 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Ecard.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Ecard.pm @@ -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 => $$}]; -- 2.11.0