require 'active_merchant/billing/gateways/sage/sage_bankcard'
require 'active_merchant/billing/gateways/sage/sage_virtual_check'
require 'active_merchant/billing/gateways/sage/sage_vault'
module ActiveMerchant #:nodoc:
module Billing #:nodoc:
class SageGateway < Gateway
self.supported_countries = SageBankcardGateway.supported_countries
self.supported_cardtypes = SageBankcardGateway.supported_cardtypes
self.abstract_class = true
# Creates a new SageGateway
#
# The gateway requires that a valid login and password be passed
# in the +options+ hash.
#
# ==== Options
#
# * :login - The Sage Payment Solutions Merchant ID Number.
# * :password - The Sage Payment Solutions Merchant Key Number.
def initialize(options = {})
requires!(options, :login, :password)
super
end
# Performs an authorization transaction
#
# ==== Parameters
# * money - The amount to be authorized as an integer value in cents.
# * credit_card - The CreditCard object to be used as the funding source for the transaction.
# * options - A hash of optional parameters.
# * :order_id - A unique reference for this order. (maximum of 20 characters).
# * :email - The customer's email address
# * :customer - The Customer Number for Purchase Card Level II Transactions
# * :billing_address - The customer's billing address as a hash of address information.
# * :address1 - The billing address street
# * :city - The billing address city
# * :state - The billing address state
# * :country - The 2 digit ISO billing address country code
# * :zip - The billing address zip code
# * :phone - The billing address phone number
# * :fax - The billing address fax number
# * :shipping_address - The customer's shipping address as a hash of address information.
# * :name - The name at the shipping address
# * :address1 - The shipping address street
# * :city - The shipping address city
# * :state - The shipping address state code
# * :country - The 2 digit ISO shipping address country code
# * :zip - The shipping address zip code
# * :tax - The tax amount for the transaction as an Integer value in cents. Maps to Sage T_tax.
# * :shipping - The shipping amount for the transaction as an Integer value in cents. Maps to Sage T_shipping.
def authorize(money, credit_card, options = {})
bankcard.authorize(money, credit_card, options)
end
# Performs a purchase, which is essentially an authorization and capture in a single operation.
#
# ==== Parameters
#
# * money - The amount to be authorized as an integer value in cents.
# * source - The CreditCard or Check object to be used as the funding source for the transaction.
# * options - A hash of optional parameters.
# * :order_id - A unique reference for this order. (maximum of 20 characters).
# * :email - The customer's email address
# * :customer - The Customer Number for Purchase Card Level II Transactions
# * :billing_address - The customer's billing address as a hash of address information.
# * :address1 - The billing address street
# * :city - The billing address city
# * :state - The billing address state
# * :country - The 2 digit ISO billing address country code
# * :zip - The billing address zip code
# * :phone - The billing address phone number
# * :fax - The billing address fax number
# * :shipping_address - The customer's shipping address as a hash of address information.
# * :name - The name at the shipping address
# * :address1 - The shipping address street
# * :city - The shipping address city
# * :state - The shipping address state code
# * :country - The 2 digit ISO shipping address country code
# * :zip - The shipping address zip code
# * :tax - The tax amount for the transaction as an integer value in cents. Maps to Sage T_tax.
# * :shipping - The shipping amount for the transaction as an integer value in cents. Maps to Sage T_shipping.
#
# ==== Additional options in the +options+ hash for when using a Check as the funding source
# * :originator_id - 10 digit originator. If not provided, Sage will use the default Originator ID for the specific customer type.
# * :addenda - Transaction addenda.
# * :ssn - The customer's Social Security Number.
# * :drivers_license_state - The customer's drivers license state code.
# * :drivers_license_number - The customer's drivers license number.
# * :date_of_birth - The customer's date of birth as a Time or Date object or a string in the format mm/dd/yyyy.
def purchase(money, source, options = {})
if card_brand(source) == "check"
virtual_check.purchase(money, source, options)
else
bankcard.purchase(money, source, options)
end
end
# Captures authorized funds.
#
# ==== Parameters
#
# * money - The amount to be authorized as an integer value in cents. Sage doesn't support changing the capture amount, so the full amount of the initial transaction will be captured.
# * reference - The authorization reference string returned by the original transaction's Response#authorization.
def capture(money, reference, options = {})
bankcard.capture(money, reference, options)
end
# Voids a prior transaction. Works for both CreditCard and Check transactions.
#
# ==== Parameters
#
# * reference - The authorization reference string returned by the original transaction's Response#authorization.
def void(reference, options = {})
if reference.split(";").last == "virtual_check"
virtual_check.void(reference, options)
else
bankcard.void(reference, options)
end
end
#
# ==== Parameters
#
# * money - The amount to be authorized as an integer value in cents.
# * source - The CreditCard or Check object to be used as the target for the credit.
def credit(money, source, options = {})
if card_brand(source) == "check"
virtual_check.credit(money, source, options)
else
bankcard.credit(money, source, options)
end
end
def refund(money, reference, options={})
bankcard.refund(money, reference, options)
end
# Stores a credit card in the Sage vault.
#
# ==== Parameters
#
# * credit_card - The CreditCard object to be stored.
def store(credit_card, options = {})
vault.store(credit_card, options)
end
# Deletes a stored card from the Sage vault.
#
# ==== Parameters
#
# * identification - The 'GUID' identifying the stored card.
def unstore(identification, options = {})
vault.unstore(identification, options)
end
private
def bankcard
@bankcard ||= SageBankcardGateway.new(@options)
end
def virtual_check
@virtual_check ||= SageVirtualCheckGateway.new(@options)
end
def vault
@vault ||= SageVaultGateway.new(@options)
end
end
end
end