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