ProcessHandler::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 4
Bugs 0 Features 0
Metric Value
c 4
b 0
f 0
dl 0
loc 5
rs 9.4285
cc 1
eloc 3
nc 1
nop 1
1
<?php
2
3
namespace Umbrella\Ya\RetornoBoleto;
4
5
use Stringy\Stringy;
6
use Symfony\Component\EventDispatcher\EventDispatcher;
7
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
8
use Umbrella\Ya\RetornoBoleto\Event\OnDetailRegisterEvent;
9
10
/**
11
 * Classe que implementa o design pattern Strategy,
12
 * para leitura de arquivos de retorno de cobranças dos bancos brasileiros,
13
 * vincular uma classe para processamento de uma carteira específica
14
 * de arquivo de retorno, e criando uma interface única
15
 * para a execução do processamento do arquivo.<br/>
16
 * @author Ítalo Lelis de Vietro <[email protected]>
17
 */
18
class ProcessHandler
19
{
20
    /**
21
     * @property AbstractProcessor $processor
22
     * Atributo que deve ser um objeto de uma classe que estenda a classe AbstractRetorno
23
     */
24
    protected $processor;
25
    protected $dispatcher;
26
27
    /**
28
     * Construtor da classe
29
     * @param AbstractProcessor $retorno Objeto de uma sub-classe de AbstractRetorno,
30
     * que implementa a leitura de arquivo de retorno para uma determinada carteira
31
     * de um banco específico.
32
     */
33
    public function __construct(AbstractProcessor $retorno)
34
    {
35
        $this->processor = $retorno;
36
        $this->dispatcher = new EventDispatcher();
37
    }
38
39
    /**
40
     * Recupera o dispatcher para o EventDispatcher.
41
     * @return EventDispatcherInterface
42
     */
43
    public function getDispatcher()
44
    {
45
        return $this->dispatcher;
46
    }
47
48
    private function createLote(RetornoInterface $retorno)
49
    {
50
        $lote = new Lote(); //Lote padrão
51
        $retorno->addLote($lote);
52
        return $lote;
53
    }
54
55
    /**
56
     * Executa o processamento de todo o arquivo, linha a linha.
57
     * @return RetornoInterface
58
     */
59
    public function processar()
60
    {
61
        $retorno = new Retorno();
62
        $lote = null;
63
64
        $lines = file($this->processor->getNomeArquivo(), FILE_IGNORE_NEW_LINES);
65
        foreach ($lines as $lineNumber => $lineContent) {
66
            $string = new Stringy(rtrim($lineContent, "\r\n"));
67
            $composable = $this->processor->processarLinha($lineNumber, $string);
68
69
            if ($this->processor->needToCreateLote()) {
70
                $lote = $this->createLote($retorno);
71
            }
72
73
            $this->processor->processCnab($retorno, $composable, $lote);
74
75
            $event = new OnDetailRegisterEvent($this->processor, $lineNumber, $composable);
76
            $this->dispatcher->dispatch(RetornoEvents::ON_DETAIL_REGISTER, $event);
77
        }
78
79
        return $retorno;
80
    }
81
}
82