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

# Main Module
module Var

  VALID_SERVICES = [:conekta]
  @@var_classes = []

  class << self

    def valid_services
      VALID_SERVICES
    end

    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 = {})
      return { error_message: 'Service is not supported' } unless VALID_SERVICES.include? service
      return { error_message: "#{object.class} doesn't support charges" } unless object.respond_to?(:charge_with)
      charge = object.charge_with(service, options)
      charge
    end

    def conekta_webhook(params)
      payment = params[:data][:object]
      object = Var.find_charge payment[:id]
      object.update_columns(var_status: payment[:status])
      if 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
      object
    rescue Exception => exception
      puts exception
      false
    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
  end
end

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