Sha256: 66499cebf876c270861f95c51e463672b1ed24a7078a82d53ff798bd767ac874

Contents?: true

Size: 872 Bytes

Versions: 2

Compression:

Stored size: 872 Bytes

Contents

require 'date'

class Plastic
  def valid_pan?
    valid_pan_length? && valid_pan_checksum?
  end

  def valid_expiration?
    return false unless valid_expiration_year? && valid_expiration_month?
    this = Time.now.utc
    if this.year == expiration_year
      (this.month..12).include?(expiration_month)
    elsif expiration_year > this.year
      true
    else
      false
    end
  end

private

  def valid_pan_length?
    pan.to_s.length >= 12
  end

  def valid_pan_checksum?
    odd = false
    sum = pan.reverse.chars.inject(0) do |checksum, d|
      d = d.to_i
      checksum + ((odd = !odd) ? d : (d * 2 > 9 ? d * 2 - 9 : d * 2))
    end
    sum % 10 == 0
  end

  def valid_expiration_month?
    (1..12).include?(expiration_month)
  end

  def valid_expiration_year?
    this = Time.now.utc
    (this.year..this.year + 20).include?(expiration_year)
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
plastic-0.2.2 lib/plastic/validations.rb
plastic-0.2.1 lib/plastic/validations.rb