From 5e35339e8dec5603ff5a8b69141b7e894c81f2fa Mon Sep 17 00:00:00 2001 From: senator Date: Mon, 16 May 2011 14:14:57 -0400 Subject: [PATCH] Credit card payments working with printable receipts Could still use e-mailed receipts --- .../perlmods/lib/OpenILS/WWW/EGCatLoader.pm | 2 +- .../lib/OpenILS/WWW/EGCatLoader/Account.pm | 53 +++++++++++++++---- Open-ILS/web/css/skin/default/opac/style.css | 4 ++ Open-ILS/web/js/ui/default/opac/simple.js | 21 ++++++++ .../templates/default/opac/myopac/main.tt2 | 2 +- .../default/opac/myopac/main_pay.tt2 | 38 +++++++++++++ .../default/opac/myopac/main_payment_form.tt2 | 2 +- .../default/opac/parts/myopac/main_base.tt2 | 2 +- 8 files changed, 110 insertions(+), 14 deletions(-) create mode 100644 Open-ILS/web/templates/default/opac/myopac/main_pay.tt2 diff --git a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm index 328f92b394..4a1811b711 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm @@ -121,9 +121,9 @@ sub load { return $self->load_place_hold if $path =~ m|opac/place_hold|; return $self->load_myopac_holds if $path =~ m|opac/myopac/holds|; return $self->load_myopac_circs if $path =~ m|opac/myopac/circs|; - return $self->load_myopac_pay if $path =~ m|opac/myopac/pay|; return $self->load_myopac_payment_form if $path =~ m|opac/myopac/main_payment_form|; return $self->load_myopac_payments if $path =~ m|opac/myopac/main_payments|; + return $self->load_myopac_pay if $path =~ m|opac/myopac/main_pay|; return $self->load_myopac_main if $path =~ m|opac/myopac/main|; return $self->load_myopac_update_email if $path =~ m|opac/myopac/update_email|; return $self->load_myopac_update_password if $path =~ m|opac/myopac/update_password|; diff --git a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm index 61f0cc82e2..1e16eca9fe 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm @@ -6,6 +6,8 @@ use OpenILS::Utils::CStoreEditor qw/:funcs/; use OpenILS::Utils::Fieldmapper; use OpenILS::Application::AppUtils; use OpenSRF::Utils::JSON; +#use Data::Dumper; +#$Data::Dumper::Indent = 0; my $U = 'OpenILS::Application::AppUtils'; sub prepare_extended_user_info { @@ -594,16 +596,21 @@ sub load_myopac_pay { my $self = shift; my $r; - $r = $self->prepare_fines and return $r; + $r = $self->prepare_fines(undef, undef, [$self->cgi->param('xact')]) and + return $r; # balance_owed is computed specifically from the fines we're trying # to pay in this case. - return Apache2::Const::HTTP_INTERNAL_SERVER_ERROR if - $self->ctx->{fines}->{balance_owed} <= 0; + if ($self->ctx->{fines}->{balance_owed} <= 0) { + $self->apache->log->info( + sprintf("Can't pay non-positive balance. xacts selected: (%s)", + join(", ", map(int, $self->cgi->param("xact")))) + ); + return Apache2::Const::HTTP_INTERNAL_SERVER_ERROR; + } + + my $cc_args = {"where_process" => 1}; - my $cc_args = { - "where_process" => 1, - }; $cc_args->{$_} = $self->cgi->param($_) for (qw/ number cvv2 expire_year expire_month billing_first billing_last billing_address billing_city billing_state @@ -613,15 +620,24 @@ sub load_myopac_pay { my $args = { "cc_args" => $cc_args, "userid" => $self->ctx->{user}->id, - "payment_type": "credit_card_payment", - "payments" => [$self->cgi->param('xact')] # should be safe after self->prepare_fines + "payment_type" => "credit_card_payment", + "payments" => $self->prepare_fines_for_payment # should be safe after self->prepare_fines }; - $U->simplereq("open-ils.circ", "open-ils.circ.money.payment", + my $resp = $U->simplereq("open-ils.circ", "open-ils.circ.money.payment", $self->editor->authtoken, $args, $self->ctx->{user}->last_xact_id ); - # XXX FINISH ME: indicate success/fail, redirect to page with layout + $self->ctx->{"payment_response"} = $resp; + + unless ($resp->{"textcode"}) { + $self->ctx->{printable_receipt} = $U->simplereq( + "open-ils.circ", "open-ils.circ.money.payment_receipt.print", + $self->editor->authtoken, $resp->{payments} + ); + } + + return Apache2::Const::OK; } sub prepare_fines { @@ -629,6 +645,8 @@ sub prepare_fines { # XXX TODO: check for failure after various network calls + # It may be unclear, but this result structure lumps circulation and + # reservation fines together, and keeps grocery fines separate. $self->ctx->{"fines"} = { "circulation" => [], "grocery" => [], @@ -713,6 +731,21 @@ sub prepare_fines { return; } +sub prepare_fines_for_payment { + # This assumes $self->prepare_fines has already been run + my ($self) = @_; + + my @results = (); + if ($self->ctx->{fines}) { + push @results, [$_->{xact}->id, $_->{xact}->balance_owed] foreach ( + @{$self->ctx->{fines}->{circulation}}, + @{$self->ctx->{fines}->{grocery}} + ); + } + + return \@results; +} + sub load_myopac_main { my $self = shift; my $limit = $self->cgi->param('limit') || 0; diff --git a/Open-ILS/web/css/skin/default/opac/style.css b/Open-ILS/web/css/skin/default/opac/style.css index 0ce3c8e5df..ac67524ff5 100644 --- a/Open-ILS/web/css/skin/default/opac/style.css +++ b/Open-ILS/web/css/skin/default/opac/style.css @@ -877,6 +877,10 @@ div.select-wrapper:hover { } #myopac_payments_table th { text-align: left; } +.payment-error { + font-weight: bold; color: red; + padding: 10px; border: 1px solid #888; +} #adv_search_parent { margin-bottom:0px; diff --git a/Open-ILS/web/js/ui/default/opac/simple.js b/Open-ILS/web/js/ui/default/opac/simple.js index 776dfef1bd..d71c98a68d 100644 --- a/Open-ILS/web/js/ui/default/opac/simple.js +++ b/Open-ILS/web/js/ui/default/opac/simple.js @@ -27,3 +27,24 @@ function addSearchRow() { $("adv_global_addrow") ); } +function print_node(node_id) { + var iframe = document.createElement("iframe"); + var source_node = document.getElementById(node_id); + source_node.parentNode.appendChild(iframe); + + var iwin = iframe.contentWindow; + + /* These next three statements are only needed by IE, but they don't + * hurt FF/Chrome. */ + iwin.document.open(); + iwin.document.write( /* XXX make better/customizable? */ + "Recipt" + ); + iwin.document.close(); + + iwin.document.body.innerHTML = source_node.innerHTML; + iframe.focus(); + + try { iframe.print(); } catch (e) { iwin.print(); } + setTimeout(function() { iframe.style.display = "none"; }, 3500); +} diff --git a/Open-ILS/web/templates/default/opac/myopac/main.tt2 b/Open-ILS/web/templates/default/opac/myopac/main.tt2 index 3a4bc04137..1a4b1b423e 100644 --- a/Open-ILS/web/templates/default/opac/myopac/main.tt2 +++ b/Open-ILS/web/templates/default/opac/myopac/main.tt2 @@ -4,7 +4,7 @@ myopac_page = "main"; myopac_main_page = "main"; %] -
+ [% IF ctx.fines.circulation.size > 0 %]
diff --git a/Open-ILS/web/templates/default/opac/myopac/main_pay.tt2 b/Open-ILS/web/templates/default/opac/myopac/main_pay.tt2 new file mode 100644 index 0000000000..5cd7cdd00f --- /dev/null +++ b/Open-ILS/web/templates/default/opac/myopac/main_pay.tt2 @@ -0,0 +1,38 @@ +[% PROCESS "default/opac/parts/header.tt2"; + PROCESS "default/opac/parts/misc_util.tt2"; + WRAPPER "default/opac/parts/myopac/base.tt2"; + myopac_page = "main"; + myopac_main_page = "pay" %] +
+ [% IF ctx.payment_response.textcode %] +
+ + [% ctx.payment_response.desc %] +
+ [% ctx.payment_response.payload.error_message %] +
+

+ [% l('Go back') %] + [% l('to try again or to cancel this payment attempt.') %] +

+ [% ELSE %] +

[% l('Your payment has been approved.') %]

+ [% IF ctx.printable_receipt.template_output %] +

[ [% l('Print receipt') %] ]

+ + [% ctx.printable_receipt.template_output.data %] + + [% ELSE %] +
+ [% l( + 'Error creating receipt: [_1]', + ctx.printable_receipt.error_output.data || + l('No receipt data returned from server') + ) %] +
+ [% END %] + [% END %] +
+[% END %] diff --git a/Open-ILS/web/templates/default/opac/myopac/main_payment_form.tt2 b/Open-ILS/web/templates/default/opac/myopac/main_payment_form.tt2 index b7824a84ce..8a57d64021 100644 --- a/Open-ILS/web/templates/default/opac/myopac/main_payment_form.tt2 +++ b/Open-ILS/web/templates/default/opac/myopac/main_payment_form.tt2 @@ -11,7 +11,7 @@ [% ELSE %]
- [% FOR xact IN CGI.param('xact') %] diff --git a/Open-ILS/web/templates/default/opac/parts/myopac/main_base.tt2 b/Open-ILS/web/templates/default/opac/parts/myopac/main_base.tt2 index 0630a10660..a79141ec05 100644 --- a/Open-ILS/web/templates/default/opac/parts/myopac/main_base.tt2 +++ b/Open-ILS/web/templates/default/opac/parts/myopac/main_base.tt2 @@ -39,7 +39,7 @@ [% money(ctx.user_stats.fines.balance_owed) %]
-