src/Cartao.php
<?php
/**
* Cartao
*
* Representação do cartão de crédito a ser utilizado nas transações do cliente.
*
* Licença
* Este código fonte está sob a licença GPL-3.0+
*
* @category Library
* @package MrPrompt\Cielo
* @subpackage Cartao
* @copyright Thiago Paes <mrprompt@gmail.com> (c) 2010
* @license GPL-3.0+
*/
declare(strict_types = 1);
namespace MrPrompt\Cielo;
use Respect\Validation\Validator as v;
use InvalidArgumentException;
/**
* Class Cartao
* @author Thiago Paes <mrprompt@gmail.com>
*/
class Cartao
{
/**
* Número do cartão.
*
* @var integer
*/
private $cartao;
/**
* Bandeira do cartão
*
* sempre minúsculo
*
* @var string
*/
private $bandeira;
/**
* Indicador do código de segurança:
*
* 0 (não informado)
* 1 (informado)
* 2 (ilegível)
* 9 (inexistente)
*
* @var integer
*/
private $indicador = 0;
/**
* Código de segurança do cartão, obrigatório se o indicador for 1
*
* @var string
*/
private $codigoSeguranca;
/**
* Nome impresso no cartão.
*
* @var string
*/
private $nomePortador;
/**
* Validade do cartão no formato aaaamm.
* Exemplos: 201212 (dez 2012).
*
* @var integer
*/
private $validade;
/**
* Token que liga o cartão ao estabelecimento
*
* @var string
*/
private $token = null;
/**
* Bandeiras válidas
*
* @var array
*/
private $bandeiras = array(
'visa',
'mastercard',
'diners',
'discover',
'elo',
'amex',
'jcb',
'aura',
);
/**
* Retorna o número do cartão
*
* @access public
* @return integer
*/
public function getCartao()
{
return $this->cartao;
}
/**
* Configura o número do cartão
*
* @access public
* @param string $cartao
* @return Cartao
*/
public function setCartao($cartao)
{
if (!v::notEmpty()->creditCard()->validate($cartao)) {
throw new InvalidArgumentException('O número do cartão deve ser válido.');
}
$this->cartao = filter_var($cartao, FILTER_SANITIZE_NUMBER_INT);
return $this;
}
/**
* Retorna o indicador do código de segurança setado
*
* @access public
* @return string
*/
public function getIndicador(): string
{
return (string) $this->indicador;
}
/**
* Indicador do código de segurança:
*
* 0 (não informado)
* 1 (informado)
* 2 (ilegível)
* 9 (inexistente)
*
* @var integer
* @return Cartao
*/
public function setIndicador($indicador)
{
if (!v::in(array(0, 1, 2, 9), true)->validate($indicador)) {
throw new InvalidArgumentException('Indicador de código de segurança inválido.');
}
$this->indicador = (int) $indicador;
return $this;
}
/**
* Retorna o código de segurança configurado para cartão
*
* @access public
* @return string
*/
public function getCodigoSeguranca(): string
{
return (string) $this->codigoSeguranca;
}
/**
* Seta o código de segurança do cartão
*
* @access public
* @param string $codigo
* @return Cartao
*/
public function setCodigoSeguranca($codigo)
{
if (!v::digit()->notEmpty()->noWhitespace()->validate($codigo)) {
throw new InvalidArgumentException('Código de segurança inválido.');
}
$this->codigoSeguranca = filter_var($codigo, FILTER_SANITIZE_STRING);
return $this;
}
/**
* Retorna o nome do portador do cartão
*
* @access public
* @return string
*/
public function getNomePortador(): string
{
return (string) $this->nomePortador;
}
/**
* Seta o nome do portador do cartão
*
* @access public
* @param string $nomePortador
* @return Cartao
*/
public function setNomePortador($nomePortador)
{
if (!v::alnum()->notEmpty()->validate($nomePortador)) {
throw new InvalidArgumentException('Caracteres inválidos no nome do portador.');
}
$this->nomePortador = substr($nomePortador, 0, 50);
return $this;
}
/**
* Retorna a data de validade setada para o cartão
*
* @access public
* @return integer
*/
public function getValidade()
{
return $this->validade;
}
/**
* Configura a data de validade do cartão
*
* @access public
* @param integer $validade AAAAMM
* @param integer $referencia
* @return Cartao
*/
public function setValidade($validade, $referencia = null)
{
if (!v::digit()->notEmpty()->noWhitespace()->length(6)->validate($validade)) {
throw new InvalidArgumentException('Data de validade inválida.');
}
$referencia = $referencia ?: date('Ym');
if ($validade < $referencia) {
throw new InvalidArgumentException('Cartão com validade ultrapassada.');
}
$this->validade = $validade;
return $this;
}
/**
* Retorna a bandeira do cartão
*
* @access public
* @return string
*/
public function getBandeira()
{
return $this->bandeira;
}
/**
* Configura a bandeira do cartão
*
* Obs.: A bandeira do cartão aceita somente caracteres minúsculos.
*
* @access public
* @param string $bandeira
* @return Cartao
*/
public function setBandeira($bandeira)
{
$regras = v::stringType()->notEmpty()
->in($this->bandeiras)
->lowercase()
->alnum();
if (!$regras->validate($bandeira)) {
throw new InvalidArgumentException('Bandeira inválida.');
}
$this->bandeira = $bandeira;
return $this;
}
/**
* Recupera as bandeiras permitidas.
*
* @return array
*/
public function getBandeiras()
{
return $this->bandeiras;
}
/**
* Recupera o token.
*
* @return string
*/
public function getToken(): string
{
return (string) $this->token;
}
/**
* Configura o token.
*
* @return string
*/
public function setToken($token)
{
$this->token = $token;
return $token;
}
/**
* Verifica se o token está configurado.
*
* @return boolean
*/
public function hasToken(): bool
{
return ! empty($this->token);
}
}