mrprompt/Cielo

View on GitHub
src/Requisicao/AutorizacaoPortador.php

Summary

Maintainability
A
3 hrs
Test Coverage
<?php
/**
 * Cielo
 *
 * Cliente para o Web Service da Cielo.
 *
 * O Web Service permite efetuar vendas com cartões de bandeira
 * VISA e Mastercard, tanto no débito quanto em compras a vista ou parceladas.
 *
 * Licença
 * Este código fonte está sob a licença GPL-3.0+
 *
 * @category   Library
 * @package    MrPrompt\Cielo
 * @subpackage Cliente
 * @copyright  Thiago Paes <mrprompt@gmail.com> (c) 2013
 * @license    GPL-3.0+
 */
declare(strict_types = 1);

namespace MrPrompt\Cielo\Requisicao;

use MrPrompt\Cielo\Cartao;
use MrPrompt\Cielo\Autorizacao;
use MrPrompt\Cielo\Idioma\Idioma;
use MrPrompt\Cielo\Transacao;
use MrPrompt\Cielo\Cliente;

/**
 * Requisição de autorizacao de portador
 *
 * @author Thiago Paes <mrprompt@gmail.com>
 * @author Luís Otávio Cobucci Oblonczyk <lcobucci@gmail.com>
 */
class AutorizacaoPortador extends Requisicao
{
    /**
     * Identificador de chamada do tipo transacao
     *
     * @const integer
     */
    const ID = 7;

    /**
     * Cartão a ser utilizado
     *
     * @var Cartao
     */
    private $cartao;

    /**
     * Idioma a ser utilizado
     *
     * @var string
     */
    private $idioma;

    /**
     * Inicializa o objeto
     *
     * @param Autorizacao $autorizacao
     * @param Transacao   $transacao
     * @param Cartao      $cartao
     * @param Idioma      $idioma
     */
    public function __construct(
        Autorizacao $autorizacao, 
        Transacao $transacao, 
        Cartao $cartao, 
        Idioma $idioma = null
    ) {
        $this->cartao = $cartao;
        $this->idioma = $idioma ?: new Idioma\Portugues();

        parent::__construct($autorizacao, $transacao);
    }

    /**
     * {@inheritdoc}
     */
    protected function getXmlInicial(): string
    {
        return sprintf(
            '<%s id="%d" versao="%s"></%s>',
            'requisicao-autorizacao-portador',
            self::ID,
            Cliente::VERSAO,
            'requisicao-autorizacao-portador'
        );
    }

    /**
     * {@inheritdoc}
     */
    protected function configuraEnvio()
    {
        $this->adicionaCartao();
        $this->adicionaTransacao();
        $this->adicionaFormaPagamento();

        $this->getEnvio()->addChild('capturar-automaticamente', (string) $this->transacao->getCapturar());
        $this->getEnvio()->addChild('campo-livre', '');
    }

    /**
     * Adiciona os dados do cartão à requisição
     */
    protected function adicionaCartao()
    {
        $dadosCartao = $this->getEnvio()->addChild('dados-cartao', '');

        $dadosCartao->addChild('numero', (string) $this->cartao->getCartao());
        $dadosCartao->addChild('validade', (string) $this->cartao->getValidade());
        $dadosCartao->addChild('indicador', (string) $this->cartao->getIndicador());
        $dadosCartao->addChild('codigo-seguranca', (string) $this->cartao->getCodigoSeguranca());
        $dadosCartao->addChild('nome-portador', (string) $this->cartao->getNomePortador());
    }

    /**
     * Adiciona os dados da transação à requisição
     */
    protected function adicionaTransacao()
    {
        $dadosTransacao = $this->getEnvio()->addChild('dados-pedido', '');

        $dadosTransacao->addChild('numero', (string) $this->transacao->getNumero());
        $dadosTransacao->addChild('valor', (string) $this->transacao->getValor());
        $dadosTransacao->addChild('moeda', (string) $this->transacao->getMoeda());
        $dadosTransacao->addChild('data-hora', (string) $this->transacao->getDataHora()->format(\DateTime::ATOM));
        $dadosTransacao->addChild('descricao', (string) $this->transacao->getDescricao());
        $dadosTransacao->addChild('idioma', (string) $this->idioma->getIdioma());
    }

    /**
     * Adiciona os dados da forma de pagamento à requisição
     */
    protected function adicionaFormaPagamento()
    {
        $formaPgto  = $this->getEnvio()->addChild('forma-pagamento', '');

        $formaPgto->addChild('bandeira', (string) $this->cartao->getBandeira());
        $formaPgto->addChild('produto', (string) $this->transacao->getProduto());
        $formaPgto->addChild('parcelas', (string) $this->transacao->getParcelas());
    }
}