ProcessFactory   A
last analyzed

Complexity

Total Complexity 14

Size/Duplication

Total Lines 56
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 8

Importance

Changes 8
Bugs 0 Features 0
Metric Value
wmc 14
c 8
b 0
f 0
lcom 0
cbo 8
dl 0
loc 56
rs 10

1 Method

Rating   Name   Duplication   Size   Complexity  
C getRetorno() 0 45 14
1
<?php
2
3
namespace Umbrella\Ya\RetornoBoleto;
4
5
use Exception;
6
use InvalidArgumentException;
7
use League\Flysystem\FileNotFoundException;
8
use Umbrella\Ya\RetornoBoleto\Cnab\Cnab150\Processor\CNAB150Processor;
9
use Umbrella\Ya\RetornoBoleto\Cnab\Cnab240\Processor\CNAB240Processor;
10
use Umbrella\Ya\RetornoBoleto\Cnab\Cnab400\Convenio\Processor\CNAB400Conv6Processor;
11
use Umbrella\Ya\RetornoBoleto\Cnab\Cnab400\Convenio\Processor\CNAB400Conv7Processor;
12
use Umbrella\Ya\RetornoBoleto\Exception\DetailSectionNotFoundException;
13
use Umbrella\Ya\RetornoBoleto\Exception\HeaderSectionNotFoundException;
14
use Umbrella\Ya\RetornoBoleto\Exception\InvalidHeaderException;
15
use Umbrella\Ya\RetornoBoleto\Exception\ReturnFileNotSupportedException;
16
17
/**
18
 * Classe que identifica o tipo de arquivo de retorno sendo carregado e instancia a classe
19
 * específica para leitura do mesmo.
20
 * @author Ítalo Lelis de Vietro <[email protected]>
21
 */
22
class ProcessFactory
23
{
24
25
    /**
26
     * Instancia um objeto de uma das sub-classes de AbstractRetorno,
27
     * com base no tipo do arquivo de retorno indicado por $fileName
28
     * @param string fileName Nome do arquivo de retorno a ser identificado
29
     * para poder instancia a classe específica para leitura do mesmo.
30
     * @return AbstractProcessor Retorna um objeto de uma das sub-classes de AbstractProcessor.
31
     */
32
    public static function getRetorno($fileName)
33
    {
34
        if (!$fileName) {
35
            throw new InvalidArgumentException("Informe o nome do arquivo de retorno.");
36
        }
37
38
        $arq = fopen($fileName, "r");
39
        if (!$arq) {
40
            throw new FileNotFoundException("Não foi possível abrir o arquivo \"$fileName\".");
41
        }
42
43
        //Lê o header do arquivo
44
        $linha = fgets($arq, 500);
45
        if (!$linha) {
46
            fclose($arq);
47
            throw new HeaderSectionNotFoundException("Tipo de arquivo de retorno não identificado. Não foi possível ler o header do arquivo.");
48
        }
49
50
        $len = strlen($linha);
51
        if ($len >= 150 && $len <= 152) {
52
            return new CNAB150Processor($fileName);
53
        } elseif ($len >= 240 && $len <= 242) {
54
            return new CNAB240Processor($fileName);
55
        } elseif ($len >= 400 && $len <= 402) {
56
            if (strstr($linha, "BRADESCO")) {
57
                throw new ReturnFileNotSupportedException('Arquivo de retorno Bradesco não suportado.');
58
            }
59
60
            //Lê o primeiro registro detalhe
61
            $linha = fgets($arq, 500);
62
            if (!$linha) {
63
                throw new DetailSectionNotFoundException("Tipo de arquivo de retorno não identificado. Não foi possível ler um registro detalhe.");
64
            }
65
            switch ($linha[0]) {
66
                case CNAB400Conv6Processor::DETALHE:
67
                    return new CNAB400Conv6Processor($fileName);
68
                case CNAB400Conv7Processor::DETALHE:
69
                    return new CNAB400Conv7Processor($fileName);
70
                default:
71
                    throw new Exception("Tipo de registro detalhe desconhecido: " . $linha[0]);
72
            }
73
        } else {
74
            throw new InvalidHeaderException("Tipo de arquivo de retorno não identificado. Total de colunas do header: $len");
75
        }
76
    }
77
}
78