Skip to content

Commit

Permalink
Merge pull request #303 from mlibrary/add-monitoring-of-fine-payment
Browse files Browse the repository at this point in the history
Add monitoring of fine payment
  • Loading branch information
niquerio committed Jun 7, 2024
2 parents b63a55d + 2815e38 commit c14d3ad
Show file tree
Hide file tree
Showing 9 changed files with 48 additions and 4 deletions.
3 changes: 2 additions & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ gem "omniauth"
gem "omniauth_openid_connect"
gem "redcarpet"
gem "rackup"
# needed for when we go to ruby 3.3, but we aren't there yet
gem "canister"
gem "semantic_logger"
gem "csv" # included here because httparty uses it and ought to require it

# In order to get rspec to work for ruby 3.1. Maybe later see if it's still necessary
Expand Down
5 changes: 5 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ GEM
bigdecimal (3.1.7)
bindata (2.5.0)
byebug (11.1.3)
canister (0.9.2)
climate_control (1.2.0)
coderay (1.1.3)
concurrent-ruby (1.2.3)
Expand Down Expand Up @@ -190,6 +191,8 @@ GEM
ruby-next-core (1.0.2)
ruby-progressbar (1.13.0)
ruby2_keywords (0.0.5)
semantic_logger (4.15.0)
concurrent-ruby (~> 1.0)
simplecov (0.22.0)
docile (~> 1.1)
simplecov-html (~> 0.11)
Expand Down Expand Up @@ -266,6 +269,7 @@ PLATFORMS
DEPENDENCIES
addressable
alma_rest_client!
canister
climate_control
csv
httparty
Expand All @@ -280,6 +284,7 @@ DEPENDENCIES
rackup
redcarpet
rspec
semantic_logger
simplecov
sinatra
sinatra-contrib
Expand Down
2 changes: 2 additions & 0 deletions account.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
# Monkey patch for omniauth_openid_connect -> openid_connect -> webfinger -> httpclient SSL errors
# require_relative "./lib/monkey_httpclient"

require_relative "lib/services"

require_relative "lib/entities/entities"
require_relative "lib/entities/pages"
require_relative "lib/entities/empty_state"
Expand Down
2 changes: 1 addition & 1 deletion compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ services:
- .:/app
- gem_cache:/gems
env_file:
- .env
- env.development
- .env

nelnet-test:
build: ./nelnet_test/.
Expand Down
11 changes: 10 additions & 1 deletion lib/routes/fines_and_fees.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,18 @@
post "/pay" do
fines = Fines.for(uniqname: session[:uniqname])
total_sum = fines.total_sum.to_f
# 2024-06-06 This messages mrio when there's a fine to make it easier to determine if the fines bug is still happening.
begin
HTTParty.post(S.slack_url, headers: {"Content-type" => "application/json"}, body: {text: "Someone started a fine payment attempt in account"}.to_json)
rescue
S.logger.error("Couldn't send slack message")
end

amount = (params["pay_in_full"] == "true") ? total_sum : params["partial_amount"].to_f
if amount <= total_sum
nelnet = Nelnet.new(amount_due: amount.to_currency)
session["order_number"] = nelnet.orderNumber
session["order_number"] = nelnet.order_number
S.logger.info("Fee payment attempt: order_number: #{nelnet.order_number}")
redirect nelnet.url
else
flash[:error] = "You don't need to overpay!!!"
Expand All @@ -31,6 +39,7 @@
flash.now[:success] = "Fines successfully paid"
else
flash.now[:error] = receipt.message
S.logger.error(receipt.message)
end
erb :"fines-and-fees/receipt", locals: {receipt: receipt}
rescue
Expand Down
20 changes: 20 additions & 0 deletions lib/services.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
require "canister"
require "semantic_logger"

Services = Canister.new
S = Services

S.register(:log_stream) do
$stdout.sync = true
$stdout
end

S.register(:logger) do
SemanticLogger["account"]
end

S.register(:slack_url) do
ENV["SLACK_URL"] || "https://hooks.slack.com/services/WHATEVERELSE"
end

SemanticLogger.add_appender(io: S.log_stream, level: :info) unless ENV["APP_ENV"] == "test"
2 changes: 1 addition & 1 deletion models/fines/nelnet.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
require "securerandom"
class Nelnet
include UrlHelper
attr_reader :orderNumber
attr_reader :order_number
def initialize(amount_due:,
redirect_url: absolute_url(path: "fines-and-fees/receipt"),
order_description: "U-M Library Circulation Fines",
Expand Down
6 changes: 6 additions & 0 deletions models/fines/receipt.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,27 @@ def self.for(uniqname:, nelnet_params:, order_number:, is_valid: Nelnet.verify(n
if is_valid
payment_verification = Fines.verify_payment(uniqname: uniqname, order_number: order_number)
if payment_verification.instance_of?(AlmaError)
S.logger.error("Fine payment error: order_number: #{payment.order_number}; message: #{payment_verification.message}")
ErrorReceipt.new("There was an error in processing your payment.<br>Your payment order number is: #{payment.order_number}<br>Server error: #{payment_verification.message}</br>")
elsif payment_verification[:has_order_number]
S.logger.error("Fine payment error: order number #{order_number} is already in Alma.")
ErrorReceipt.new("Your payment order number, #{order_number}, is already in the fines database.")
elsif payment_verification[:total_sum].to_f.to_s == "0.0"
S.logger.error("Fine payment error: order number #{order_number} tried to pay $0.00")
ErrorReceipt.new("You do not have a balance. Your payment order number is: #{order_number}.")
else # has not already paid
resp = Fines.pay(uniqname: uniqname, amount: payment.amount, order_number: order_number)
if resp.code != 200
error = AlmaError.new(resp)
S.logger.error("Fine payment error: order number #{order_number}; message: #{error.message}")
ErrorReceipt.new("#{error.message}<br>Your payment order number is: #{order_number}")
else
S.logger.info("Fine payment success")
Receipt.new(payment: payment, balance: resp.parsed_response["total_sum"])
end
end
else # not valid
S.logger.error("Fine payment error: order number #{order_number} payment could not be validated.")
ErrorReceipt.new("Your payment could not be validated. Your payment order number is: #{payment.order_number}")
end
end
Expand Down
1 change: 1 addition & 0 deletions spec/requests/fines_and_fees_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
context "post /fines-and-fees/pay" do
before(:each) do
@stub = stub_alma_get_request(url: "users/tutor/fees", body: File.read("./spec/fixtures/jbister_fines.json"), query: {limit: 100, offset: 0})
stub_request(:post, S.slack_url) # Don't care about the slack url for testing purposes
end
it "for pay in full redirects to nelnet with total amountDue" do
post "/fines-and-fees/pay", {"pay_in_full" => "true", "partial_amount" => "0.00"}
Expand Down

0 comments on commit c14d3ad

Please sign in to comment.