foodcoops/foodsoft

View on GitHub
app/lib/bank_account_information_importer.rb

Summary

Maintainability
A
3 hrs
Test Coverage
class BankAccountInformationImporter
  def initialize(bank_account)
    @bank_account = bank_account
  end

  def import!(content)
    return nil if content.empty?

    import_data! JSON.parse(content, symbolize_names: true)
  end

  def import_data!(data)
    return 0 if data.empty?

    booked = data.fetch(:transactions, {}).fetch(:booked, [])

    ret = 0
    booked.each do |t|
      amount = parse_account_information_amount t[:transactionAmount]
      entity_name = amount < 0 ? t[:creditorName] : t[:debtorName]
      entity_account = amount < 0 ? t[:creditorAccount] : t[:debtorAccount]
      reference = [t[:endToEndId], t[:remittanceInformationUnstructured]].join("\n").strip

      @bank_account.bank_transactions.where(external_id: t[:transactionId]).first_or_create.update({
                                                                                                     date: t[:bookingDate],
                                                                                                     amount: amount,
                                                                                                     iban: entity_account && entity_account[:iban],
                                                                                                     reference: reference,
                                                                                                     text: entity_name,
                                                                                                     receipt: t[:additionalInformation]
                                                                                                   })
      ret += 1
    end

    balances = (data[:balances] ? data[:balances].map { |b| [b[:balanceType], b[:balanceAmount]] } : []).to_h
    balance = balances.values.first
    %w[closingBooked expected authorised openingBooked interimAvailable forwardAvailable nonInvoiced].each do |type|
      value = balances[type]
      if value
        balance = value
        break
      end
    end

    @bank_account.balance = parse_account_information_amount(balance) || @bank_account.bank_transactions.sum(:amount)
    @bank_account.import_continuation_point = booked.first&.fetch(:entryReference, nil) unless booked.empty?
    @bank_account.last_import = Time.now
    @bank_account.save!

    ret
  end

  private

  def parse_account_information_amount(value)
    value && value[:amount].to_f
  end
end