A first (naive) attempt at adding backend support for the SIP fee
authorJason Stephenson <jstephenson@mvlc.org>
Fri, 29 Apr 2011 13:15:13 +0000 (09:15 -0400)
committerJason Stephenson <jstephenson@mvlc.org>
Thu, 12 May 2011 19:05:56 +0000 (15:05 -0400)
paid message (37/38 message/response pair) to Open-ILS.

This is, at present, untested code. There are no guarantees that it
runs, never mind that it does the right thing.

Signed-off-by: Jason Stephenson <jstephenson@mvlc.org>

Open-ILS/examples/oils_sip.xml.example
Open-ILS/src/perlmods/lib/OpenILS/SIP.pm
Open-ILS/src/perlmods/lib/OpenILS/SIP/Transaction/FeePayment.pm [new file with mode: 0644]

index 3111626..1cbeac4 100644 (file)
@@ -81,7 +81,7 @@
                                        <item name='login' value='true'/>
                                        <item name='patron information' value='true'/>
                                        <item name='end patron session' value='true'/>
-                                       <item name='fee paid' value='false'/>
+                                       <item name='fee paid' value='true'/>
                                        <item name='item information' value='true'/>
                                        <item name='item status update' value='false'/>
                                        <item name='patron enable' value='false'/>
index fe312ff..e79f90d 100644 (file)
@@ -408,23 +408,34 @@ sub end_patron_session {
 }
 
 
-#sub pay_fee {
-#    my ($self, $patron_id, $patron_pwd, $fee_amt, $fee_type,
-#      $pay_type, $fee_id, $trans_id, $currency) = @_;
-#    my $trans;
-#    my $patron;
-#
-#    $trans = new ILS::Transaction::FeePayment;
-#
-#    $patron = new ILS::Patron $patron_id;
-#
-#    $trans->transaction_id($trans_id);
-#    $trans->patron($patron);
-#    $trans->ok(1);
-#
-#    return $trans;
-#}
-#
+sub pay_fee {
+    my ($self, $patron_id, $patron_pwd, $fee_amt, $fee_type,
+       $pay_type, $fee_id, $trans_id, $currency) = @_;
+
+    my $xact = OpenILS::SIP::Transaction::FeePayment->new(authtoken => $self->authtoken);
+    my $patron = $self->find_patron($patron_id);
+
+    if (!$patron) {
+       $xact->screen_msg("Invalid Patron Barcode '$patron_id'");
+       $xact->ok(0);
+       return $xact;
+    }
+
+    $xact->patron($patron);
+    $xact->sip_currency($currency);
+    $xact->fee_amount($fee_amt);
+    $xact->sip_fee_type($fee_type);
+    $xact->transaction_id($trans_id);
+    # We don't presently use these, but we might in the future.
+    $xact->patron_password($patron_pwd);
+    $xact->fee_id($fee_id);
+    $xact->sip_payment_type($pay_type);
+
+    $xact->do_fee_payment();
+
+    return $xact;
+}
+
 #sub add_hold {
 #    my ($self, $patron_id, $patron_pwd, $item_id, $title_id,
 #      $expiry_date, $pickup_location, $hold_type, $fee_ack) = @_;
diff --git a/Open-ILS/src/perlmods/lib/OpenILS/SIP/Transaction/FeePayment.pm b/Open-ILS/src/perlmods/lib/OpenILS/SIP/Transaction/FeePayment.pm
new file mode 100644 (file)
index 0000000..0f36b6d
--- /dev/null
@@ -0,0 +1,99 @@
+#
+# An object to handle fee payment
+#
+
+package OpenILS::SIP::Transaction::FeePayment;
+
+use warnings;
+use strict;
+
+use POSIX qw(strftime);
+
+use OpenILS::SIP;
+use OpenILS::SIP::Transaction;
+use OpenILS::SIP::Msg qw/:const/;
+use Sys::Syslog qw(syslog);
+
+use OpenILS::Application::AppUtils;
+my $U = 'OpenILS::Application::AppUtils';
+
+
+our @ISA = qw(OpenILS::SIP::Transaction);
+
+# Most fields are handled by the Transaction superclass
+my %fields = (
+    sip_payment_type => undef,
+    fee_id => 0,
+    patron_password => undef,
+    );
+
+sub new {
+    my $class = shift;
+
+    my $self = $class->SUPER::new(@_);
+
+    my $element;
+
+    foreach $element (keys %fields) {
+       $self->{_permitted}->{$element} = $fields{$element};
+    }
+
+    @{$self}{keys %fields} = values %fields;
+    return bless $self, $class;
+}
+
+sub do_fee_payment {
+    my $self = shift;
+    my $results = $U->simplereq('open-ils.actor', 'open-ils.actor.user.transactions.history.have_balance', $self->{authtoken}, $self->patron->id);
+    if (ref $results eq 'ARRAY') {
+       my $bill;
+       my $payment = $self->fee_amount;
+       foreach $bill (@{$results}) {
+           if (!$self->transaction_id) {
+               if ($bill->balance_owed >= $payment) {
+                   $self->pay_bill($bill->id, $payment);
+                   $payment = 0;
+               }
+               else {
+                   $self->pay_bill($bill->id, $bill->balance_owed);
+                   $payment -= $bill->balance_owed;
+               }
+               last unless ($payment);
+           }
+           elsif ($self->transaction_id == $bill->id) {
+               $self->pay_bill($bill->id, $payment);
+               $payment = 0;
+               last;
+           }
+       }
+       if ($payment == $self->fee_amount) {
+           $self->ok(0);
+           if (!$self->transaction_id) {
+               $self->screen_msg("Payment failed: you have no bills.");
+           }
+           else {
+               $self->screen_msg("Payment failed: transaction " + $self->transaction_id + " not found.");
+           }
+       }
+       else {
+           $self->ok(1);
+       }
+    }
+    else {
+       $self->ok(0);
+       $self->screen_msg($results->{descr});
+    }
+}
+
+sub pay_bill
+{
+    my ($bill, $amount) = @_;
+    my $user = $self->patron;
+    my $r = $U->simplereq('open-ils.circ', 'open-ils.circ.money.payment', $self->{authtoken},
+                         { payment_type => "cash_payment", userid => $user->id, note => "via SIP2",
+                           payments => [[$bill, $amount ]]}, $user->last_xact_id);
+    $self->patron->last_xact_id($r->last_xact_id) if ($r->last_xact_id);
+}
+
+
+1;