From: Jason Stephenson Date: Fri, 29 Apr 2011 13:15:13 +0000 (-0400) Subject: A first (naive) attempt at adding backend support for the SIP fee X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=df0486fee063875572237e36fffe72ec6c6c9a02;p=evergreen%2Fequinox.git A first (naive) attempt at adding backend support for the SIP fee 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 --- diff --git a/Open-ILS/examples/oils_sip.xml.example b/Open-ILS/examples/oils_sip.xml.example index 3111626b32..1cbeac4b7d 100644 --- a/Open-ILS/examples/oils_sip.xml.example +++ b/Open-ILS/examples/oils_sip.xml.example @@ -81,7 +81,7 @@ - + diff --git a/Open-ILS/src/perlmods/lib/OpenILS/SIP.pm b/Open-ILS/src/perlmods/lib/OpenILS/SIP.pm index fe312ffd2f..e79f90d4be 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/SIP.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/SIP.pm @@ -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 index 0000000000..0f36b6d7c1 --- /dev/null +++ b/Open-ILS/src/perlmods/lib/OpenILS/SIP/Transaction/FeePayment.pm @@ -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;