}
-#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) = @_;
--- /dev/null
+#
+# 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;