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|;
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([
{
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 {
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;
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;
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,
"balance_owed" => 0
};
-
my $cstore = OpenSRF::AppSession->create('open-ils.cstore');
# TODO: This should really be a ML call, but the existing calls
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,
}
# 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/
);
}
push(
- @{$ctx->{"fines"}->{$mobts->grocery ? "grocery" : "circulation"}},
+ @{$self->ctx->{"fines"}->{$mobts->grocery ? "grocery" : "circulation"}},
{
xact => $mobts,
last_grocery_billing => $last_billing,
);
}
- 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;
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'>
</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 %]
+++ /dev/null
-[% 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 %]
--- /dev/null
+[% 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 %]
[% 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';"