Calculator   A
last analyzed

Complexity

Total Complexity 20

Size/Duplication

Total Lines 192
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 0

Importance

Changes 5
Bugs 1 Features 0
Metric Value
wmc 20
c 5
b 1
f 0
lcom 0
cbo 0
dl 0
loc 192
rs 10

7 Methods

Rating   Name   Duplication   Size   Complexity  
A formataNumero() 0 9 2
A formataValor() 0 13 2
A calculaModulo11SemDV0() 0 14 3
A calculaModulo11() 0 21 3
A calculaModulo10() 0 18 3
B getResultadoSomaModulo10() 0 31 4
A getResultadoSomaModulo11() 0 23 3
1
<?php
2
namespace CbCaio\Boletos\Calculators;
3
4
abstract class Calculator
5
{
6
    /**
7
     * Calcula o modulo de 11, porem em alguns casos o DV Geral nao pode ser 0, entao esta funcao trata isso da
8
     * seguinte forma:
9
     *  SE RESULTADO = 0  OU RESULTADO > 9 ENTAO DV = 1
10
     *
11
     * @param $numero
12
     * @return int
13
     */
14
    public static function calculaModulo11SemDV0($numero)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
15
    {
16
        $soma_resultados = Calculator::getResultadoSomaModulo11($numero);
17
        $resto_divisao   = $soma_resultados % 11;
18
        $valor_final     = 11 - $resto_divisao;
19
20
        if ($valor_final <= 0 || $valor_final > 9)
21
        {
22
            return 1;
23
        } else
24
        {
25
            return $valor_final;
26
        }
27
    }
28
29
    /**
30
     * Calcula o modulo de 11, neste caso fazendo:
31
     * SE RESULTADO > 9 ENTÃO DV = 0
32
     *
33
     * @param $numero
34
     * @return int
35
     */
36
    public static function calculaModulo11($numero)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
37
    {
38
        $soma_resultados = Calculator::getResultadoSomaModulo11($numero);
39
40
        if ($soma_resultados < 11)
41
        {
42
            return 11 - $soma_resultados;
43
        } else
44
        {
45
            $resto_divisao = $soma_resultados % 11;
46
            $valor_final   = 11 - $resto_divisao;
47
48
            if ($valor_final > 9)
49
            {
50
                return 0;
51
            } else
52
            {
53
                return $valor_final;
54
            }
55
        }
56
    }
57
58
    /**
59
     * * Calcula o modulo de 10, neste caso fazendo:
60
     * Quando o resultado da multiplica��o for um n�mero com 2 d�gitos, somar os 2 algarismos
61
     * Se o Total da Soma for inferior a 10, o DV corresponde � diferen�a entre 10 e o Total da Soma
62
     * Se o resto da divis�o for 0 (zero), o DV ser� 0 (zero)
63
     *
64
     * @param $numero
65
     * @return int
66
     */
67
    public static function calculaModulo10($numero)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
68
    {
69
        $soma_resultados = Calculator::getResultadoSomaModulo10($numero);
70
        if ($soma_resultados < 10)
71
        {
72
            return 10 - $soma_resultados;
73
        } else
74
        {
75
            $resto_divisao = $soma_resultados % 10;
76
77
            if ($resto_divisao === 0)
78
            {
79
                return $resto_divisao;
80
            }
81
82
            return 10 - $resto_divisao;
83
        }
84
    }
85
86
    /**
87
     * Formata um número inserindo o valor desejado a esquerda até que o tamanho seja igual a quantidade informada
88
     *
89
     * @param string $numero
90
     * @param string $tamanho
91
     * @param string $insere
92
     * @return string
93
     */
94
    public static function formataNumero($numero, $tamanho, $insere)
95
    {
96
        while (strlen($numero) < $tamanho)
97
        {
98
            $numero = $insere . $numero;
99
        }
100
101
        return $numero;
102
    }
103
104
    /**
105
     * Formata um número colocando virgulas nos decimais e zeros.
106
     *
107
     * @param $numero
108
     * @return string
109
     */
110
    public static function formataValor($numero)
111
    {
112
        $tamanho       = strlen($numero);
113
        $parte_decimal = substr($numero, $tamanho - 2, 2);
114
        $parte_inteira = substr($numero, 0, $tamanho - 2);
115
116
        if ($parte_inteira == '')
117
        {
118
            $parte_inteira = '0';
119
        }
120
121
        return $parte_inteira . ',' . $parte_decimal;
122
    }
123
124
    /**
125
     * Funcaoo auxiliar para calculo do modulo de 10, faz a soma dos digitos dado os pesos.
126
     *
127
     * @param string $numero
128
     * @param int    $peso_superior
129
     * @param int    $peso_inferior
130
     * @return number
131
     */
132
    public static function getResultadoSomaModulo10($numero, $peso_superior = 2, $peso_inferior = 1)
133
    {
134
        $numero_array                  = str_split($numero, 1);
135
        $tamanho_numero_array          = count($numero_array);
136
        $resultado_multiplicacao_array = [];
137
138
        $multiplicador = $peso_superior;
139
        for ($i = $tamanho_numero_array - 1; $i >= 0; $i--)
140
        {
141
            $res_multiplicacao = $numero_array[ $i ] * $multiplicador;
142
143
            if ($res_multiplicacao >= 10)
144
            {
145
                $resultado_array   = str_split($res_multiplicacao, 1);
146
                $digito_dezena     = $resultado_array[0];
147
                $digito_unidade    = $resultado_array[1];
148
                $res_multiplicacao = (int)$digito_dezena + (int)$digito_unidade;
149
            }
150
            $resultado_multiplicacao_array[ $i ] = $res_multiplicacao;
151
152
            if ($multiplicador <= $peso_inferior)
153
            {
154
                $multiplicador = $peso_superior;
155
            } else
156
            {
157
                $multiplicador--;
158
            }
159
        }
160
161
        return array_sum($resultado_multiplicacao_array);
162
    }
163
164
    /**
165
     * Funcaoo auxiliar para calculo do modulo de 11, faz a soma dos digitos dado os pesos.
166
     *
167
     * @param string $numero
168
     * @param int    $peso_inferior
169
     * @param int    $peso_superior
170
     * @return number
171
     */
172
    public static function getResultadoSomaModulo11($numero, $peso_inferior = 2, $peso_superior = 9)
173
    {
174
        $numero_array         = str_split($numero, 1);
175
        $tamanho_numero_array = count($numero_array);
176
177
        $resultado_multiplicacao_array = [];
178
179
        $multiplicador = $peso_inferior;
180
        for ($i = $tamanho_numero_array - 1; $i >= 0; $i--)
181
        {
182
            $res_multiplicacao                   = $numero_array[ $i ] * $multiplicador;
183
            $resultado_multiplicacao_array[ $i ] = $res_multiplicacao;
184
            if ($multiplicador >= $peso_superior)
185
            {
186
                $multiplicador = $peso_inferior;
187
            } else
188
            {
189
                $multiplicador++;
190
            }
191
        }
192
193
        return array_sum($resultado_multiplicacao_array);
194
    }
195
}