var.rb 1.74 KB
require 'var/version'
require 'conekta'
require 'paypal-sdk-rest'
require 'acts_as_chargeable'

# Main Module
module Var
  VALID_SERVICES = [:conekta].freeze
  @@var_classes = []

  class << self
    def var_classes
      @@var_classes
    end

    def add_var_class(class_name)
      @@var_classes << class_name unless @@var_classes.include? class_name
    end

    def create_charge(service, object, options = {})
      raise 'Service is not supported' unless supported_service? service
      raise "#{object.class} doesn't support charges" unless object.respond_to? :charge_with
      object.charge_with(service, options)
    end

    def conekta_webhook(params)
      payment = params[:data][:object]
      object = Var.find_charge payment[:id]
      update_object_var_data(object, payment)
      object
    # rescue Exception => exception
    #   puts exception
    #   false
    end
    
    def update_object_var_data(object, data)
      payment = data
      object.update_columns(var_status: payment[:status])
      return object unless object.var_payed?
      time = Time.strptime payment[:paid_at].to_s, '%s'
      amount = payment[:amount].to_f / 100.0
      fee = payment[:fee].to_f / 100.0
      object.update(var_fee: fee, var_paid_amount: amount,
                    var_payment_method: payment[:payment_method][:object],
                    var_payment_at: time)
    end

    def find_charge(id)
      Rails.application.eager_load! if Rails.env.development?
      @@var_classes.map do |class_name|
        class_name.where(var_id: id)
      end.flatten.first
    end
    
    private

    def supported_service?(service)
      VALID_SERVICES.include? service
    end

  end
end

if defined? ActiveRecord::Base
  ActiveRecord::Base.send(:include, ActsAsChargeable)
end