class PuntoPagosRails::TransactionService

Constants

ERROR_CODE
SUCCESS_CODE

Attributes

payable[R]
process_url[RW]

Public Class Methods

new(payable) click to toggle source
# File lib/punto_pagos_rails/transaction_service.rb, line 9
def initialize(payable)
  @payable = payable
end

Private Class Methods

complete(params) click to toggle source
# File lib/punto_pagos_rails/transaction_service.rb, line 64
def complete(params)
  transaction = processing_transaction(params[:token])
  return false unless transaction
  status = PuntoPagos::Status.new
  status.check(transaction.token, transaction.id.to_s, transaction.amount_to_s)

  if status.valid?
    complete_transaction(transaction.token)
  else
    reject_transaction(transaction.token, status.error)
  end
end
complete_transaction(token) click to toggle source
# File lib/punto_pagos_rails/transaction_service.rb, line 106
def complete_transaction(token)
  transaction = processing_transaction(token)
  return if transaction.nil?
  transaction.complete!
end
method_missing(method, *args, &block) click to toggle source
Calls superclass method
# File lib/punto_pagos_rails/transaction_service.rb, line 79
def method_missing(method, *args, &block)
  if method.to_s.ends_with?("_by_token")
    payable_class = method.to_s.chomp("_by_token")
    failed = payable_class.slice!("failed_") if method.to_s.starts_with?("failed_")
    return payable_by_token(payable_class.classify.constantize, args.first, !!failed)
  end

  super
end
notificate(params, headers) click to toggle source
# File lib/punto_pagos_rails/transaction_service.rb, line 50
def notificate(params, headers)
  notification = PuntoPagos::Notification.new
  token = params[:token]
  error = params[:error]

  if notification.valid?(headers, params)
    complete_transaction(token)
    { respuesta: SUCCESS_CODE, token: token }
  else
    reject_transaction(token, error)
    { respuesta: ERROR_CODE, error: error, token: token }
  end
end
payable_by_token(payable_class, params, with_error = false) click to toggle source
# File lib/punto_pagos_rails/transaction_service.rb, line 89
def payable_by_token(payable_class, params, with_error = false)
  payable = payable_class.by_token(params[:token])

  if payable && with_error
    payable.errors.add(:base, I18n.t("punto_pagos_rails.errors.invalid_puntopagos_payment"))
  end

  payable
end
processing_transaction(token) click to toggle source
# File lib/punto_pagos_rails/transaction_service.rb, line 99
def processing_transaction(token)
  transaction = Transaction.find_by_token(token)
  return unless transaction
  return unless transaction.pending?
  transaction
end
reject_transaction(token, error) click to toggle source
# File lib/punto_pagos_rails/transaction_service.rb, line 112
def reject_transaction(token, error)
  transaction = processing_transaction(token)
  return if transaction.nil?
  transaction.reject_with(error)
end

Public Instance Methods

create() click to toggle source
# File lib/punto_pagos_rails/transaction_service.rb, line 13
def create
  transaction = payable.transactions.create!
  response = PuntoPagos::Request.new.create(
    transaction.id.to_s, transaction.amount_to_s, payable.payment_method)

  if !response.success?
    payable.errors.add(:base, I18n.t("punto_pagos_rails.errors.invalid_puntopagos_response"))
    return false
  end

  init_transaction(transaction, response.get_token).tap do |transaction_result|
    self.process_url = response.payment_process_url if transaction_result
  end
end

Private Instance Methods

init_transaction(transaction, token) click to toggle source
# File lib/punto_pagos_rails/transaction_service.rb, line 30
def init_transaction(transaction, token)
  if token.blank?
    payable.errors.add(:base,
      I18n.t("punto_pagos_rails.errors.invalid_returned_puntopagos_token"))
    return false
  end

  if repeated_token?(token)
    payable.errors.add(:base, I18n.t("punto_pagos_rails.errors.repeated_token_given"))
    return false
  end

  transaction.update!(token: token, amount: payable.amount)
end
repeated_token?(token) click to toggle source
# File lib/punto_pagos_rails/transaction_service.rb, line 45
def repeated_token?(token)
  Transaction.where(token: token).any?
end