class StripeIIFToQBO::Converter

Public Class Methods

new( options={} ) click to toggle source
# File lib/stripe-iiftoqbo.rb, line 7
def initialize( options={} )
  @account_id = options[:account_id] if options[:account_id]
  @iif_file = options[:iif_file] if options[:iif_file]
  @payments_file = options[:payments_file] if options[:payments_file]
  @transfers_file = options[:transfers_file] if options[:transfers_file]
  @server_time = options[:server_time] || Date.today

  load_payments_file(@payments_file)
  load_transfers_file(@transfers_file)
  load_iif_file(@iif_file)
end

Public Instance Methods

convert_iif_entry_to_ofx(iif_entry) click to toggle source
# File lib/stripe-iiftoqbo.rb, line 56
def convert_iif_entry_to_ofx(iif_entry)
  ofx_entry = {}
  
  ofx_entry[:date] = iif_entry.date
  ofx_entry[:fitid] = iif_entry.memo
  ofx_entry[:accnt] = iif_entry.accnt
  ofx_entry[:trnstype] = iif_entry.trnstype
  ofx_entry[:memo] = iif_entry.memo

  case iif_entry.accnt

  when "Stripe Third-party Account"
    ofx_entry[:amount] = -iif_entry.amount
    ofx_entry[:name] = iif_entry.name

    ofx_entry[:memo] =~ /Transfer from Stripe: (\S+)/
    transfer_id = $1

    if @transfers[transfer_id]
      ofx_entry[:memo] = "#{@transfers[transfer_id]} #{iif_entry.memo}"
    end

  when "Stripe Payment Processing Fees"
    ofx_entry[:amount] = -iif_entry.amount
    ofx_entry[:name] = "Stripe"

  when "Stripe Checking Account"
    ofx_entry[:amount] = -iif_entry.amount
    ofx_entry[:name] = "Transfer to #{iif_entry.accnt}"

 when "Stripe Sales"
    ofx_entry[:amount] = -iif_entry.amount
    
    if iif_entry.memo =~ /Stripe Connect fee/
      ofx_entry[:name] = "Stripe Connect Charge"
    elsif iif_entry.memo =~ /Charge/
      ofx_entry[:name] = "Credit Card Charge"
    else
      ofx_entry[:name] = iif_entry.accnt
    end
    
    ofx_entry[:memo] =~ /Charge ID: (\S+)/
    charge_id = $1

    if @payments[charge_id]
      ofx_entry[:memo] = "#{@payments[charge_id]} Charge ID: #{charge_id}"
      ofx_entry[:fitid] = charge_id
    end

  when "Stripe Returns"
    ofx_entry[:amount] = -iif_entry.amount
    ofx_entry[:name] = "Credit Card Refund"

    ofx_entry[:memo] =~ /Refund of charge (\S+)/
    charge_id = $1

    if @payments[charge_id]
      ofx_entry[:memo] = "#{@payments[charge_id]} Refund of Charge ID: #{charge_id}"
    end

  when "Stripe Account"
    return nil
  end

  return ofx_entry
end
load_iif_file(iif_file) click to toggle source
# File lib/stripe-iiftoqbo.rb, line 39
def load_iif_file(iif_file)
  @ofx_entries = []
      
  if iif_file
    IIF(iif_file) do |iif|
      iif.transactions.each do |transaction|
        transaction.entries.each do |iif_entry|
          ofx_entry = convert_iif_entry_to_ofx(iif_entry)
          if ofx_entry
            @ofx_entries.push( ofx_entry )
          end
        end
      end
    end
  end
end
load_payments_file(payments_file) click to toggle source
# File lib/stripe-iiftoqbo.rb, line 19
def load_payments_file(payments_file)
  @payments = {}
  
  if payments_file
    CSV.foreach(payments_file, :headers => true, :encoding => 'windows-1251:utf-8') do |row|
      @payments[row["id"]] = row["Description"] || ""
    end
  end
end
load_transfers_file(transfers_file) click to toggle source
# File lib/stripe-iiftoqbo.rb, line 29
def load_transfers_file(transfers_file)
  @transfers = {}
  
  if transfers_file
    CSV.foreach(transfers_file, :headers => true, :encoding => 'windows-1251:utf-8') do |row|
      @transfers[row["ID"]] = row["Description"] || ""
    end
  end
end
to_csv() click to toggle source
# File lib/stripe-iiftoqbo.rb, line 123
def to_csv
  rows = []
  rows.push(["Date", "Name", "Account", "Memo", "Amount"].to_csv)
  @ofx_entries.each do |ofx_entry|
    rows.push([ ofx_entry[:date].strftime("%m/%d/%Y"), ofx_entry[:name], ofx_entry[:accnt], "#{ofx_entry[:trnstype]} #{ofx_entry[:memo]}", ofx_entry[:amount].to_s('F') ].to_csv)
  end
  return rows.join
end
to_qbo() click to toggle source
# File lib/stripe-iiftoqbo.rb, line 132
def to_qbo
  min_date = nil
  max_date = nil
  
  @ofx_entries.each do |e|
    if e[:date]
      min_date = e[:date] if min_date.nil? or e[:date] < min_date
      max_date = e[:date] if max_date.nil? or e[:date] > max_date
    end
  end
  
  ofx_builder = OFX::Builder.new do |ofx|
    ofx.dtserver = @server_time
    ofx.fi_org = "Stripe"
    ofx.fi_fid = "0"
    ofx.bank_id = "123456789"
    ofx.acct_id = @account_id
    ofx.acct_type = "CHECKING"
    ofx.dtstart = min_date
    ofx.dtend = max_date
    ofx.bal_amt = 0
    ofx.dtasof = max_date
  end
  
  @ofx_entries.each do |ofx_entry|
    ofx_builder.transaction do |ofx_tr|
      ofx_tr.dtposted = ofx_entry[:date]
      ofx_tr.trnamt = ofx_entry[:amount]
      ofx_tr.fitid = ofx_entry[:fitid]
      ofx_tr.name = ofx_entry[:name]
      ofx_tr.memo = ofx_entry[:memo]
    end
  end
  
  return ofx_builder.to_ofx
end