fabiolnm/cieloz

View on GitHub
lib/cieloz/requisicao_transacao/forma_pagamento.rb

Summary

Maintainability
A
0 mins
Test Coverage
class Cieloz::RequisicaoTransacao
  class FormaPagamento
    DEBITO          = "A"
    CREDITO         = 1
    PARCELADO_LOJA  = 2
    PARCELADO_ADM   = 3

    BANDEIRAS_DEBITO = [ Cieloz::Bandeiras::VISA, Cieloz::Bandeiras::MASTERCARD ]
    SUPORTAM_AUTENTICACAO = BANDEIRAS_DEBITO

    BANDEIRAS_PARCELAMENTO = Cieloz::Bandeiras::ALL - [Cieloz::Bandeiras::DISCOVER]

    include Cieloz::Helpers

    attr_reader :bandeira, :produto, :parcelas

    validates :bandeira, :produto, :parcelas, presence: true

    validates :parcelas, numericality: {
      only_integer: true, greater_than: 0,
      less_than_or_equal_to: Cieloz::Configuracao.max_parcelas
    }, if: -> { produto == PARCELADO_LOJA }

    validates :parcelas, numericality: {
      only_integer: true,
      greater_than: Cieloz::Configuracao.max_parcelas,
      less_than_or_equal_to: Cieloz::Configuracao.max_adm_parcelas
    }, if: -> { produto == PARCELADO_ADM }

    validates :bandeira, inclusion: { in: BANDEIRAS_DEBITO }, if: -> { @produto == DEBITO }
    validates :bandeira, inclusion: { in: Cieloz::Bandeiras::ALL }, if: -> { @produto == CREDITO }
    validates :bandeira, inclusion: { in: BANDEIRAS_PARCELAMENTO },
      if: -> { [ PARCELADO_LOJA, PARCELADO_ADM ].include? @produto }


    def self.map_debito(source, opts={})
      bandeira = attrs_from source, opts, :bandeira
      new(source: source, opts: opts).debito bandeira
    end

    def self.map_credito(source, opts={})
      bandeira = attrs_from source, opts, :bandeira
      new(source: source, opts: opts).credito bandeira
    end

    def self.map_parcelado source, opts={}
      bandeira, parcelas = attrs_from source, opts, :bandeira, :parcelas
      new(source: source, opts: opts).parcelado bandeira, parcelas
    end

    def attributes
      {
        bandeira: @bandeira,
        produto:  @produto,
        parcelas: @parcelas
      }
    end

    def suporta_autenticacao?
      SUPORTAM_AUTENTICACAO.include? @bandeira
    end

    def debito bandeira
      set_attrs bandeira, DEBITO, 1
    end

    def debito?
      @produto == DEBITO
    end

    def credito bandeira
      set_attrs bandeira, CREDITO, 1
    end

    def parcelado bandeira, parcelas
      max, max_adm = Cieloz::Configuracao.max_parcelas, Cieloz::Configuracao.max_adm_parcelas
      produto = case parcelas
                when (1..max)         then PARCELADO_LOJA
                when (max+1..max_adm) then PARCELADO_ADM
                end
      parcelar bandeira, produto, parcelas
    end

    def metodo_autorizacao
      @metodo_autorizacao || :autorizacao_direta
    end

    private
    def set_attrs bandeira, produto, parcelas
      @metodo_autorizacao = Cieloz::Bandeiras.operacao bandeira
      @bandeira = bandeira
      @produto  = produto
      @parcelas = parcelas
      self
    end

    def parcelar bandeira, produto, parcelas
      if parcelas == 1
        credito bandeira
      else
        set_attrs bandeira, produto, parcelas
      end
    end
  end
end