class Skala::AlephAdapter::GetUserTransactions

Public Instance Methods

call(username, options = {}) click to toggle source
# File lib/skala/aleph_adapter/get_user_transactions.rb, line 9
def call(username, options = {})
  resolved_user_id = resolve_user(username)

  patron_cash_list = @adapter.restful_api.patron(resolved_user_id).circulationActions.cash.get(view: :full)
  patron_loan_list = @adapter.restful_api.patron(resolved_user_id).circulationActions.loans.get(view: :full)

  if [patron_cash_list, patron_loan_list].any? { |_response| _response.include?("<error>") }
    return nil
  else
    transactions = []

    # regular credits/debits
    Nokogiri::XML(patron_cash_list).xpath("//cash").each do |_cash|
      credit_or_debit = {
        id: id(_cash),
        creation_date: creation_date(_cash),
        record: {
          id: record_id(_cash)
        },
        reason: reason(_cash),
        type: type(_cash),
        value: value(_cash),
        description: description(_cash)
      }

      transactions << credit_or_debit
    end

    # unentered debits from loans
    Nokogiri::XML(patron_loan_list).xpath("//loan").each do |_loan|
      if fine = _loan.at_xpath("./fine").try(:content).presence
        transactions << {
          id: nil,
          record: {
            id: record_id(_loan)
          },
          reason: :overdue_fine,
          type: :debit,
          value: fine.to_f
        }
      end
    end

    self.class::Result.new(
      transactions: transactions,
      source: [patron_cash_list, patron_loan_list]
    )
  end
end

Private Instance Methods

creation_date(cash) click to toggle source
# File lib/skala/aleph_adapter/get_user_transactions.rb, line 61
def creation_date(cash)
  if date = cash.at_xpath("./z31/z31-date").try(:content).presence
    Date.strptime(date, "%Y%m%d")
  end
end
description(cash) click to toggle source
# File lib/skala/aleph_adapter/get_user_transactions.rb, line 89
def description(cash)
  cash.at_xpath("./z31/z31-description").try(:content).presence
end
id(cash) click to toggle source
# File lib/skala/aleph_adapter/get_user_transactions.rb, line 67
def id(cash)
  cash.attr("href")[/[^\/]+\Z/][/\A[^?]+/]
end
reason(cash) click to toggle source
# File lib/skala/aleph_adapter/get_user_transactions.rb, line 75
def reason(cash)
  case cash.at_xpath("./z31/z31-type").try(:content).presence
    when /Kopierauftrag/ then :photocopy_request
    when /Überfällig/    then :overdue_fine
  end
end
record_id(element) click to toggle source
# File lib/skala/aleph_adapter/get_user_transactions.rb, line 71
def record_id(element)
  element.at_xpath("./z13/z13-doc-number").try(:content).presence
end
type(cash) click to toggle source
# File lib/skala/aleph_adapter/get_user_transactions.rb, line 82
def type(cash)
  case cash.attr("type")
    when "credit" then :credit
    when "debit"  then :debit
  end
end
value(cash) click to toggle source
# File lib/skala/aleph_adapter/get_user_transactions.rb, line 93
def value(cash)
  cash.at_xpath("./z31/z31-sum").try(:content).try(:[], /\d+.\d+/).try(:to_f)
end