var.rb 2.57 KB
# frozen_string_literal: true
require 'var/version'
require 'conekta'
require 'paypal-sdk-rest'
require 'acts_as_chargeable'
require 'conekta_handler'
require 'conekta_oxxo_handler'
require 'conekta_card_handler'
require 'conekta_spei_handler'
require 'conekta_payout_handler'

# 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(event)
      raise "Hash expected, received #{event.class}" unless event.class == Hash
      raise 'Malformed hash received' unless (event[:data] &&
                                             event[:data][:object]) ||
                                             event[:object]
      if event.keys[0] == :object
        ConektaPayoutHandler.analyze(event)
      else
        payment_type = event[:data][:object][:payment_method][:object]
        case payment_type
        when 'cash_payment'
          ConektaOxxoHandler.analyze(event)
        when 'card_payment'
          ConektaCardHandler.analyze(event)
        when 'bank_transfer_payment'
          ConektaSpeiHandler.analyze(event)
        end
      end
      # payment = event[:data][:object]
      # object = Var.find_charge payment[:id]
      # # object.handle_conekta_event
      # update_object_var_data(object, payment)
      # object
    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