Credit card payments working with printable receipts
authorsenator <lebbeous@esilibrary.com>
Mon, 16 May 2011 18:14:57 +0000 (14:14 -0400)
committersenator <lebbeous@esilibrary.com>
Mon, 16 May 2011 18:14:57 +0000 (14:14 -0400)
Could still use e-mailed receipts

Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader.pm
Open-ILS/src/perlmods/lib/OpenILS/WWW/EGCatLoader/Account.pm
Open-ILS/web/css/skin/default/opac/style.css
Open-ILS/web/js/ui/default/opac/simple.js
Open-ILS/web/templates/default/opac/myopac/main.tt2
Open-ILS/web/templates/default/opac/myopac/main_pay.tt2 [new file with mode: 0644]
Open-ILS/web/templates/default/opac/myopac/main_payment_form.tt2
Open-ILS/web/templates/default/opac/parts/myopac/main_base.tt2

index 328f92b..4a1811b 100644 (file)
@@ -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|;
index 61f0cc8..1e16eca 100644 (file)
@@ -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;
index 0ce3c8e..ac67524 100644 (file)
@@ -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;
index 776dfef..d71c98a 100644 (file)
@@ -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? */
+        "<html><head><title>Recipt</title></head><body></body></html>"
+    );
+    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);
+}
index 3a4bc04..1a4b1b4 100644 (file)
@@ -4,7 +4,7 @@
     myopac_page = "main";
     myopac_main_page = "main";
 %]
-<form action="[% ctx.opac_root %]/myopac/main_payment_form" method="POST">
+<form action="[% ctx.opac_root %]/myopac/main_payment_form" method="GET">
     [% IF ctx.fines.circulation.size > 0 %]
     <div id='myopac_circ_trans_div'>
         <table width='100%' class='data_grid'>
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 (file)
index 0000000..5cd7cdd
--- /dev/null
@@ -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" %]
+<div id="myopac_summary_div">
+    [% IF ctx.payment_response.textcode %]
+        <div class="payment-error">
+            <span title="[% ctx.payment_response.textcode %]">
+                [% ctx.payment_response.desc %]
+            </span><br />
+            [% ctx.payment_response.payload.error_message %]
+        </div>
+        <p>
+            <a href="[% ctx.opac_root %]/myopac/main"
+                onclick="history.go(-1); return false;">[% l('Go back') %]</a>
+            [% l('to try again or to cancel this payment attempt.') %]
+        </p>
+    [% ELSE %]
+        <p><big>[% l('Your payment has been approved.') %]</big></p>
+        [% IF ctx.printable_receipt.template_output %]
+        <p>[ <a href="javascript:void(0);"
+            onclick="try { print_node('printable-receipt'); } catch (e) { window.print(); } return false;">[% l('Print receipt') %]</a> ]</p>
+        <tt id="printable-receipt">
+            [% ctx.printable_receipt.template_output.data %]
+        </tt>
+        [% ELSE %]
+        <div class="payment-error">
+            [% l(
+                'Error creating receipt: [_1]',
+                    ctx.printable_receipt.error_output.data ||
+                    l('No receipt data returned from server')
+                ) %]
+        </div>
+        [% END %]
+    [% END %]
+</div>
+[% END %]
index b7824a8..8a57d64 100644 (file)
@@ -11,7 +11,7 @@
 </div>
 [% ELSE %]
 <div id="pay_fines_now">
-    <form action="[% ctx.opac_root %]/myopac/pay" method="POST"
+    <form action="[% ctx.opac_root %]/myopac/main_pay" method="POST"
         onsubmit="return confirm('[% l("Are you sure you are ready to charge [_1] to your credit card?", money(ctx.fines.balance_owed)) %]');">
         [% FOR xact IN CGI.param('xact') %]
         <input type="hidden" name="xact" value="[% xact | html %]" />
index 0630a10..a79141e 100644 (file)
@@ -39,7 +39,7 @@
             [% money(ctx.user_stats.fines.balance_owed) %]
         </span><br />
 
-        <form action="[% ctx.opac_root %]/myopac/main_payment_form" method="POST"><input
+        <form action="[% ctx.opac_root %]/myopac/main_payment_form" method="GET"><input
             type="image" title="[% l('Pay Fines') %]" alt="[% l('Pay Fines') %]"
             onmouseover="this.src='[% ctx.media_prefix %]/images/pay-fines-btn-hover.png';"
             onmouseout="this.src='[% ctx.media_prefix %]/images/pay-fines-btn.png';"