jhernandes/ipag-sdk-php

View on GitHub
src/Ipag/Classes/Payment.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace Ipag\Classes;

use Ipag\Classes\Contracts\Emptiable;
use Ipag\Classes\Contracts\ObjectSerializable;
use Ipag\Classes\Traits\EmptiableTrait;

final class Payment implements Emptiable, ObjectSerializable
{
    use EmptiableTrait;

    /**
     * @var string
     */
    private $method;

    /**
     * @var CreditCard
     */
    private $creditCard;

    /**
     * @var array
     */
    private $instructions = [];

    /**
     * @var array
     */
    private $splitRules = [];

    /**
     * @var string
     */
    private $softDescriptor;

    /**
     * @var string
     */
    private $pixExpiresIn;

    /**
     * @return string
     */
    public function getMethod()
    {
        return $this->method;
    }

    /**
     * @return CreditCard
     */
    public function getCreditCard()
    {
        if (is_null($this->creditCard)) {
            $this->creditCard = new CreditCard();
        }

        return $this->creditCard;
    }

    /**
     * @param string $method
     */
    public function setMethod($method)
    {
        $this->method = $method;

        return $this;
    }

    /**
     * @param CreditCard $creditCard
     */
    public function setCreditCard(CreditCard $creditCard)
    {
        $this->creditCard = $creditCard;

        return $this;
    }

    /**
     * @return array
     */
    public function getInstructions()
    {
        return $this->instructions;
    }

    /**
     * @param string $instructions
     */
    public function setInstructions($instructions)
    {
        if ($this->instructionsAreNotFull()) {
            $this->instructions[] = substr($instructions, 0, 80);
        }

        return $this;
    }

    /**
     * @return string
     */
    public function getSoftDescriptor()
    {
        return $this->softDescriptor;
    }

    /**
     * @param string $softDescriptor
     */
    public function setSoftDescriptor($softDescriptor)
    {
        $this->softDescriptor = substr($softDescriptor, 0, 22);

        return $this;
    }

    /**
     * @return int
     */
    public function getPixExpiresIn()
    {
        return $this->pixExpiresIn;
    }

    /**
     * @param int $pixExpiresIn
     */
    public function setPixExpiresIn($pixExpiresIn)
    {
        $this->pixExpiresIn = (int) $pixExpiresIn;

        return $this;
    }

    /**
     * @return array
     */
    public function getSplitRules()
    {
        return $this->splitRules;
    }

    /**
     * @param SplitRule $splitRule
     *
     * @return self
     */
    public function addSplitRule(SplitRule $splitRule)
    {
        $this->splitRules[] = $splitRule;

        return $this;
    }

    private function instructionsAreNotFull()
    {
        return (bool) (count($this->instructions) < 3);
    }

    public function serialize()
    {
        if ($this->isEmpty()) {
            throw new \Exception('É necessário informar os dados do Pagamento (Payment)');
        }

        return array_merge(
            [
                'metodo' => urlencode((string) $this->getMethod()),
            ],
            $this->serializeInstructions(),
            $this->serializeSoftDescriptor(),
            $this->serializePixExpiresIn(),
            $this->serializeSplitRules(),
            $this->getCreditCard()->serialize()
        );
    }

    private function serializeSplitRules()
    {
        $_splitRules = [];
        foreach ($this->getSplitRules() as $key => $splitRule) {
            $_splitRules["split[{$key}][seller_id]"] = urlencode((string) $splitRule->getSellerId());
            $_splitRules["split[{$key}][percentage]"] = urlencode((string) $splitRule->getPercentage());
            $_splitRules["split[{$key}][amount]"] = urlencode((string) $splitRule->getAmount());
            $_splitRules["split[{$key}][liable]"] = urlencode((string) $splitRule->getLiable());
            $_splitRules["split[{$key}][charge_processing_fee]"] = urlencode((string) $splitRule->getChargeProcessingFee());
            $_splitRules["split[{$key}][hold_receivables]"] = urlencode((string) $splitRule->getHoldReceivables());
        }

        return $_splitRules;
    }

    private function serializeInstructions()
    {
        $_instructions = [];
        foreach ($this->getInstructions() as $key => $instruction) {
            $_instructions["instrucoes[{$key}]"] = urlencode((string) $instruction);
        }

        return $_instructions;
    }

    private function serializeSoftDescriptor()
    {
        $_softDescriptor = [];
        $softDescriptor = $this->getSoftDescriptor();

        if (!empty($softDescriptor)) {
            $_softDescriptor['softdescriptor'] = urlencode((string) $softDescriptor);
        }

        return $_softDescriptor;
    }

    private function serializePixExpiresIn()
    {
        $_pixExpiresIn = [];
        $pixExpiresIn = $this->getPixExpiresIn();

        if (!empty($pixExpiresIn)) {
            $_pixExpiresIn['pix_expires_in'] = urlencode((string) $pixExpiresIn);
        }

        return $_pixExpiresIn;
    }
}