Payment for mostly done. Still needs:
authorsenator <lebbeous@esilibrary.com>
Wed, 11 May 2011 20:02:12 +0000 (16:02 -0400)
committersenator <lebbeous@esilibrary.com>
Wed, 11 May 2011 20:02:12 +0000 (16:02 -0400)
1) to be able to handle the upper "Pay Fines" button that will mean "all
my fines"

2) to use fixed point fine totaling math and bail on total <= 0

3) ... anything else?

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

index 18ed515..8a8bc70 100644 (file)
@@ -121,6 +121,7 @@ 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_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_main if $path =~ m|opac/myopac/main|;
     return $self->load_myopac_update_email if $path =~ m|opac/myopac/update_email|;
index f8622b5..171fa39 100644 (file)
@@ -8,10 +8,7 @@ use OpenILS::Application::AppUtils;
 use OpenSRF::Utils::JSON;
 my $U = 'OpenILS::Application::AppUtils';
 
-
-# context additions: 
-#   user : au object, fleshed
-sub load_myopac_prefs {
+sub load_extended_user_info {
     my $self = shift;
 
     $self->ctx->{user} = $self->editor->retrieve_actor_user([
@@ -19,13 +16,20 @@ sub load_myopac_prefs {
         {
             flesh => 1,
             flesh_fields => {
-                au => [qw/card home_ou addresses ident_type/]
+                au => [qw/card home_ou addresses ident_type billing_address/]
                 # ...
             }
         }
-    ]);
+    ]) or return Apache2::Const::HTTP_INTERNAL_SERVER_ERROR;
 
-    return Apache2::Const::OK;
+    return;
+}
+
+# context additions: 
+#   user : au object, fleshed
+sub load_myopac_prefs {
+    my $self = shift;
+    return $self->load_extended_user_info || Apache2::Const::OK;
 }
 
 sub load_myopac_prefs_notify {
@@ -102,22 +106,9 @@ sub update_optin_prefs {
 
 sub load_myopac_prefs_settings {
     my $self = shift;
-
-    $self->ctx->{user} = $self->editor->retrieve_actor_user([
-        $self->ctx->{user}->id,
-        {
-            flesh => 1,
-            flesh_fields => {
-                au => [qw/card home_ou addresses ident_type/]
-                # ...
-            }
-        }
-    ]);
-
-    return Apache2::Const::OK;
+    return $self->load_extended_user_info || Apache2::Const::OK;
 }
 
-
 sub fetch_user_holds {
     my $self = shift;
     my $hold_ids = shift;
@@ -567,6 +558,13 @@ sub load_myopac_hold_history {
     return Apache2::Const::OK;
 }
 
+sub load_myopac_payment_form {
+    my $self = shift;
+    my $r = $self->load_fines(undef, undef, [$self->cgi->param('xact')]);
+    return $r if $r;
+    return $self->load_extended_user_info || Apache2::Const::OK;
+}
+
 # TODO: add other filter options as params/configs/etc.
 sub load_myopac_payments {
     my $self = shift;
@@ -589,16 +587,12 @@ sub load_myopac_payments {
     return Apache2::Const::OK;
 }
 
+sub load_fines {
+    my ($self, $limit, $offset, $id_list) = @_;
 
+    # XXX TODO: check for failure after various network calls
 
-sub load_myopac_main {
-    my $self = shift;
-    my $limit = $self->cgi->param('limit') || 0;
-    my $offset = $self->cgi->param('offset') || 0;
-    my $e = $self->editor;
-    my $ctx = $self->ctx;
-
-    $ctx->{"fines"} = {
+    $self->ctx->{"fines"} = {
         "circulation" => [],
         "grocery" => [],
         "total_paid" => 0,
@@ -606,7 +600,6 @@ sub load_myopac_main {
         "balance_owed" => 0
     };
 
-
     my $cstore = OpenSRF::AppSession->create('open-ils.cstore');
 
     # TODO: This should really be a ML call, but the existing calls 
@@ -617,8 +610,9 @@ sub load_myopac_main {
     my $req = $cstore->request(
         'open-ils.cstore.direct.money.open_billable_transaction_summary.search',
         {
-            usr => $e->requestor->id,
-            balance_owed => {'!=' => 0}
+            usr => $self->editor->requestor->id,
+            balance_owed => {'!=' => 0},
+            (ref $id_list eq 'ARRAY' ? ("id" => $id_list) : ()),
         },
         {
             flesh => 4,
@@ -648,7 +642,7 @@ sub load_myopac_main {
         }
 
         # XXX TODO switch to some money-safe non-fp library for math
-        $ctx->{"fines"}->{$_} += $mobts->$_ for (
+        $self->ctx->{"fines"}->{$_} += $mobts->$_ for (
             qw/total_paid total_owed balance_owed/
         );
 
@@ -666,7 +660,7 @@ sub load_myopac_main {
         }
 
         push(
-            @{$ctx->{"fines"}->{$mobts->grocery ? "grocery" : "circulation"}},
+            @{$self->ctx->{"fines"}->{$mobts->grocery ? "grocery" : "circulation"}},
             {
                 xact => $mobts,
                 last_grocery_billing => $last_billing,
@@ -675,8 +669,16 @@ sub load_myopac_main {
         );
     }
 
-     return Apache2::Const::OK;
-}       
+     return;
+}
+
+sub load_myopac_main {
+    my $self = shift;
+    my $limit = $self->cgi->param('limit') || 0;
+    my $offset = $self->cgi->param('offset') || 0;
+
+    return $self->load_fines($limit, $offset) || Apache2::Const::OK;
+}
 
 sub load_myopac_update_email {
     my $self = shift;
index b187f0d..3a4bc04 100644 (file)
@@ -4,7 +4,7 @@
     myopac_page = "main";
     myopac_main_page = "main";
 %]
-<form action="[% ctx.opac_root %]/myopac/main_pay" method="POST">
+<form action="[% ctx.opac_root %]/myopac/main_payment_form" method="POST">
     [% IF ctx.fines.circulation.size > 0 %]
     <div id='myopac_circ_trans_div'>
         <table width='100%' class='data_grid'>
@@ -77,7 +77,8 @@
                         </strong>
                     </td>
                     <td>
-                        <input type="checkbox" name="selector" title="[% l('Pay this fine') %]" />
+                        <input type="checkbox" title="[% l('Pay this fine') %]"
+                            name="xact" value="[% f.xact.id %]" />
                     </td>
                 </tr>
                 [% END %]
                     </td>
                     <td>[% f.xact.last_billing_type %]</td>
                     <td>
-                        <input type="checkbox" name='selector' title='[% l("Pay this fine") %]'/>
+                        <input type="checkbox" title='[% l("Pay this fine") %]'
+                            name="xact" value="[% f.xact.id %]" />
                     </td>
                 </tr>
                 [% END %]
diff --git a/Open-ILS/web/templates/default/opac/myopac/main_pay.tt2 b/Open-ILS/web/templates/default/opac/myopac/main_pay.tt2
deleted file mode 100644 (file)
index ff9b512..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-[%  PROCESS "default/opac/parts/header.tt2";
-    PROCESS "default/opac/parts/misc_util.tt2";
-    WRAPPER "default/opac/parts/myopac/main_base.tt2";
-    myopac_page = "main";
-    myopac_main_page = "pay";
-
-    # XXX When we get no parameters, we're in "pay everything" mode.
-    # When we get paramters, they refer to the fines that we'll be paying
-%]
-<div id="pay_fines_now">
-    <table id='oils-selfck-cc-payment-table'>
-        <tbody>
-            <tr>
-                <td><div style="width:129px;"></div></td>
-                <td><div style="width:195px;"></div></td>
-                <td><div style="width:324px;"></div></td>
-            </tr>
-            <tr>
-                <td colspan='2'><strong>Billing Information</strong></td>
-                <td rowspan='13' valign='top'>
-                    Selected fines you are paying for:
-                    <table cellpadding="0" cellspacing="5" border="0">
-                        <thead>
-                            <tr>
-                                <td>
-                                    <strong>Name</strong>
-                                </td>
-                                <td>
-                                    <strong>Amount</strong>
-                                </td>
-                            </tr>
-                        </thead>
-                        <tbody id="selectedFines">
-                        </tbody>
-                    </table>
-                    <br />
-                    <div id='oils-selfck-cc-payment-summary'>
-                        Total amount to pay:
-                        <strong>$<span></span></strong>
-                    </div>
-                    <br />
-                    Click <strong>Cancel</strong> to go back and (un)select
-                    other fines.
-                </td>
-            </tr>
-            <tr>
-                <td>First Name</td>
-                <td><input jsId='oilsSelfckCCFName' /></td>
-            </tr>
-            <tr>
-                <td>Last Name</td>
-                <td><input jsId='oilsSelfckCCLName' /></td>
-            </tr>
-            <tr>
-                <td>Street Address</td>
-                <td><input jsId='oilsSelfckCCStreet' /></td>
-            </tr>
-            <tr>
-                <td>City</td>
-                <td><input jsId='oilsSelfckCCCity' /></td>
-            </tr>
-            <tr>
-                <td>State or Province</td>
-                <td><input jsId='oilsSelfckCCState' /></td>
-            </tr>
-            <tr>
-                <td>ZIP or Postal Code</td>
-                <td><input jsId='oilsSelfckCCZip' /></td>
-            </tr>
-            <tr>
-              <td colspan='2'><strong>Credit Card Information</strong></td>
-            </tr>
-            <!-- Technically not needed since card type is derived from the CC number
-            <tr>
-                <td>Type of Card</td>
-                <td>
-                    <select jsId='oilsSelfckCCType' required='true'>
-                        <option value='VISA'>VISA</option>
-                        <option value='MasterCard'>MasterCard</option>
-                        <option value='American Express'>American Express</option>
-                    </select>
-                </td>
-            </tr>
-            -->
-            <tr>
-                <td>Credit Card #</td>
-                <td><input jsId='oilsSelfckCCNumber' /></td>
-            </tr>
-            <tr>
-                <td>
-                    <div style="position:absolute;">
-                        <div style="position:relative;left:80px;">
-                            <a href="#"><img
-                                src="[% ctx.media_prefix %]/images/question-mark.png" /></a>
-                        </div>
-                    </div>
-                    Security Code
-                </td>
-                <td>
-                    <input jsId='oilsSelfckCCCVV' />
-                </td>
-            </tr>
-            <tr>
-                <td>Exipration Month</td>
-                <td>
-                    <select jsId='oilsSelfckCCMonth'>
-                        <option value='01' selected='selected'>January</option>
-                        <option value='02'>February</option>
-                        <option value='03'>March</option>
-                        <option value='04'>April</option>
-                        <option value='05'>May</option>
-                        <option value='06'>June</option>
-                        <option value='07'>July</option>
-                        <option value='08'>August</option>
-                        <option value='09'>September</option>
-                        <option value='10'>October</option>
-                        <option value='11'>November</option>
-                        <option value='12'>December</option>
-                    </select>
-                </td>
-            </tr>
-            <tr>
-                <td>Expiration Year</td>
-                <td>
-                  <select jsId='oilsSelfckCCYear'>
-                    <option value='2011'>2011</option>
-                    <option value='2012'>2012</option>
-                    <option value='2013'>2013</option>
-                    <option value='2014'>2014</option>
-                    <option value='2015'>2015</option>
-                    <option value='2016'>2016</option>
-                    <option value='2017'>2017</option>
-                    <option value='2018'>2018</option>
-                    <option value='2019'>2019</option>
-                  </select>
-                </td>
-            </tr>
-            <tr class="hide_me">
-                <td>Edit Billing Address</td>
-                <td>
-                    <input jsId='oilsSelfckEditDetails'/>
-                </td>
-            </tr>
-            <tr>
-                <td colspan='2' align="center">
-                    <button jsId='oilsSelfckCCSubmit'>
-                        Submit Payment
-                    </button>
-                    <button>
-                        Cancel
-                    </button>
-                </td>
-            </tr>
-            [% INCLUDE "default/opac/myopac/main_refund_policy.tt2" %]
-        </tbody>
-    </table>
-</div>
-[% 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
new file mode 100644 (file)
index 0000000..587c01b
--- /dev/null
@@ -0,0 +1,167 @@
+[%  PROCESS "default/opac/parts/header.tt2";
+    PROCESS "default/opac/parts/misc_util.tt2";
+    WRAPPER "default/opac/parts/myopac/main_base.tt2";
+    myopac_page = "main";
+    myopac_main_page = "payment_form";
+%]
+<div id="pay_fines_now">
+    <form action="[% ctx.opac_root %]/myopac/pay" method="POST">
+        [% FOR xact IN CGI.param('xact') %]
+        <input type="hidden" name="xact" value="[% xact | html %]" />
+        [% END %]
+        <table>
+            <tbody>
+                <tr>
+                    <td colspan='2'><strong>[% l('Billing Information') %]</strong></td>
+                    <td rowspan='13' valign='top'>
+                        [% l('Selected fines you are paying for:') %]
+                        <table cellpadding="0" cellspacing="5" border="0">
+                            <thead>
+                                <tr>
+                                    <th>[% l('Name') %]</th>
+                                    <th>[% l('Amount') %]</th>
+                                </tr>
+                            </thead>
+                            <tbody>
+                            [%
+                            pay_total = 0.0;
+                            FOR f IN ctx.fines.circulation;
+                                NEXT UNLESS CGI.param('xact').grep(f.xact.id).size;
+                                attrs = {marc_xml => f.marc_xml};
+                                IF f.marc_xml;
+                                    PROCESS get_marc_attrs args=attrs;
+                                ELSIF f.xact.reservation;
+                                    attrs.title = f.xact.reservation.target_resource_type.name;
+                                END;
+                                # XXX use fixed point math
+                                pay_total = pay_total + f.xact.balance_owed; %]
+                                <tr>
+                                    <td>[% attrs.title %]</td>
+                                    <td class="text-right">[% money(f.xact.balance_owed) %]</td>
+                                </tr>
+                            [%
+                            END;
+                            FOR f IN ctx.fines.grocery;
+                                NEXT UNLESS CGI.param('xact').grep(f.xact.id).size;
+                                # XXX use fixed point math
+                                pay_total = pay_total + f.xact.balance_owed; %]
+                                <tr>
+                                    <td>[% f.xact.last_billing_type %]</td>
+                                    <td class="text-right">[% money(f.xact.balance_owed) %]</td>
+                                </tr>
+                            [% END %]
+                            </tbody>
+                        </table>
+                        <br />
+                        <div>
+                            [% l('Total amount to pay:') %]
+                            [%# XXX TODO: calculate pay_total not here in the
+                            template but rather in the mod_perl, and only
+                            proceed when that number is positive %]
+                            <strong>[% money(pay_total) %]</strong>
+                        </div>
+                        <br />
+                        [% | l('<strong>', '</strong>') %]Click [_1]Cancel[_2] to go back and (un)select other fines.[% END %]
+                    </td>
+                </tr>
+                <tr>
+                    <td>[% l('First Name') %]</td>
+                    <td><input type="text" name="billing_first" value="[% ctx.user.first_given_name | html %]" /></td>
+                </tr>
+                <tr>
+                    <td>[% l('Last Name') %]</td>
+                    <td><input type="text" name="billing_last" value="[% ctx.user.family_name | html %]" /></td>
+                </tr>
+                <tr>
+                    <td>[% l('Street Address') %]</td>
+                    <td><input type="text" name="billing_address" value="[% ctx.user.billing_address.street1 _ ctx.user.billing_address.street2 | html %]" /></td>
+                </tr>
+                <tr>
+                    <td>[% l('City' )%]</td>
+                    <td><input type="text" name="billing_city" value="[% ctx.user.billing_address.city | html %]" /></td>
+                </tr>
+                <tr>
+                    <td>[% l('State or Province') %]</td>
+                    <td><input type="text" name="billing_state" value="[% ctx.user.billing_address.state | html %]" /></td>
+                </tr>
+                <tr>
+                    <td>[% l('ZIP or Postal Code') %]</td>
+                    <td><input type="text" name="billing_zip" value="[% ctx.user.billing_address.post_code | html %]" /></td>
+                </tr>
+                <tr>
+                  <td colspan='2'><strong>[% l('Credit Card Information') %]</strong></td>
+                </tr>
+                <!-- Technically not needed since card type is derived from the CC number
+                <tr>
+                    <td>Type of Card</td>
+                    <td>
+                        <select name="type">
+                            <option value='VISA'>VISA</option>
+                            <option value='MasterCard'>MasterCard</option>
+                            <option value='American Express'>American Express</option>
+                        </select>
+                    </td>
+                </tr>
+                -->
+                <tr>
+                    <td>[% l('Credit Card #') %]</td>
+                    <td><input type="text" name="number" maxlength="16" /></td>
+                </tr>
+                <tr>
+                    <td>
+                        <div style="position:absolute;">
+                            <div style="position:relative;left:80px;">
+                                <a href="#"><img
+                                    src="[% ctx.media_prefix %]/images/question-mark.png" /></a>
+                            </div>
+                        </div>
+                        [% l('Security Code') %]
+                    </td>
+                    <td>
+                        <input type="text" size="4" maxlength="5" name="cvv2" />
+                    </td>
+                </tr>
+                <tr>
+                    <td>[% l('Exipration Month') %]</td>
+                    <td>
+                        <select name="expire_month">
+                            <option value="01">[% l("January") %]</option>
+                            <option value="02">[% l("February") %]</option>
+                            <option value="03">[% l("March") %]</option>
+                            <option value="04">[% l("April") %]</option>
+                            <option value="05">[% l("May") %]</option>
+                            <option value="06">[% l("June") %]</option>
+                            <option value="07">[% l("July") %]</option>
+                            <option value="08">[% l("August") %]</option>
+                            <option value="09">[% l("September") %]</option>
+                            <option value="10">[% l("October") %]</option>
+                            <option value="11">[% l("November") %]</option>
+                            <option value="12">[% l("December") %]</option>
+                        </select>
+                    </td>
+                </tr>
+                <tr>
+                    <td>[% l('Expiration Year') %]</td>
+                    <td>
+                        <select name="expire_year">
+                        [% year = date.format(date.now, '%Y');
+                        y = year;
+                        WHILE y < year + 10; # show ten years starting now %]
+                            <option value="[% y %]">[% y %]</option>
+                        [% y = y + 1; END %]
+                        </select>
+                    </td>
+                </tr>
+                <tr>
+                    <td colspan='2' align="center">
+                        <input type="submit" value="[% l('Submit Payment') %]" />
+                        <input type="reset" value="[% l('Cancel') %]"
+                            onclick="location.history.go(-1);" />
+                    </td>
+                </tr>
+                [% INCLUDE "default/opac/myopac/main_refund_policy.tt2" %]
+            </tbody>
+        </table>
+    </form>
+</div>
+[% END %]
index da0a088..2115655 100644 (file)
@@ -36,7 +36,7 @@
             [% money(ctx.user_stats.fines.balance_owed) %]
         </span><br />
 
-        <form action="[% ctx.opac_root %]/myopac/main_pay" method="POST"><input
+        <form action="[% ctx.opac_root %]/myopac/main_payment_form" method="POST"><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';"