fruivita/corporativo

View on GitHub
src/Corporativo.php

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
<?php

namespace FruiVita\Corporativo;

use FruiVita\Corporativo\Contracts\IImportavel;
use FruiVita\Corporativo\Exceptions\FileNotReadableException;
use FruiVita\Corporativo\Exceptions\UnsupportedFileTypeException;
use FruiVita\Corporativo\Importadores\ImportadorCargo;
use FruiVita\Corporativo\Importadores\ImportadorFuncaoConfianca;
use FruiVita\Corporativo\Importadores\ImportadorLotacao;
use FruiVita\Corporativo\Importadores\ImportadorUsuario;
use FruiVita\Corporativo\Trait\Logavel;
use Illuminate\Support\Facades\Log;

class Corporativo implements IImportavel
{
    use Logavel;

    /**
     * Caminho completo para o arquivo XML com a estrutura coporativa que será
     * importado.
     *
     * @var string
     */
    protected $arquivo;

    /**
     * Mime types suportados.
     *
     * @var string[]
     */
    protected $mime_types = ['application/xml', 'text/xml'];

    /**
     * {@inheritdoc}
     */
    public function importar(string $arquivo)
    {
        throw_if(!$this->podeSerLido($arquivo), FileNotReadableException::class);
        throw_if(!$this->mimeTypePermitido($arquivo), UnsupportedFileTypeException::class);

        $this
            ->setPathArquivo($arquivo)
            ->tratativasIniciais()
            ->executar()
            ->tratativasFinais();
    }

    /**
     * Verifica se o arquivo informado existe e pode ser lido.
     *
     * @param  string  $arquivo caminho completo para o arquivo
     * @return bool
     */
    private function podeSerLido(string $arquivo)
    {
        $pode_ser_lido = is_readable($arquivo);

        clearstatcache();

        return $pode_ser_lido;
    }

    /**
     * Verifica se o mime type do arquivo é permitido.
     *
     * @param  string  $arquivo caminho completo
     * @return bool
     */
    private function mimeTypePermitido(string $arquivo)
    {
        return in_array(
            needle: mime_content_type($arquivo),
            haystack: $this->mime_types
        );
    }

    /**
     * Define o caminho completo do arquivo que será importado.
     *
     * @param  string  $arquivo caminho completo
     * @return static
     */
    private function setPathArquivo(string $arquivo)
    {
        $this->arquivo = $arquivo;

        return $this;
    }

    /**
     * Tratativas iniciais para a importação.
     *
     * @return static
     */
    private function tratativasIniciais()
    {
        if ($this->registrarLog()) {
            Log::log(
                level: $this->level,
                message: __('Início da importação da estrutura corporativa'),
                context: [
                    'arquivo' => $this->arquivo,
                ]
            );
        }

        return $this;
    }

    /**
     * Executa a importação.
     *
     * @return static
     */
    private function executar()
    {
        ImportadorCargo::make()->importar($this->arquivo);
        ImportadorFuncaoConfianca::make()->importar($this->arquivo);
        ImportadorLotacao::make()->importar($this->arquivo);
        ImportadorUsuario::make()->importar($this->arquivo);

        return $this;
    }

    /**
     * Tratativas finais da importação.
     *
     * @return static
     */
    private function tratativasFinais()
    {
        if ($this->registrarLog()) {
            Log::log(
                level: $this->level,
                message: __('Fim da importação da estrutura corporativa'),
                context: [
                    'arquivo' => $this->arquivo,
                ]
            );
        }

        return $this;
    }
}