Passed
Push — master ( 8e4667...76bd9f )
by João
01:41
created

calcCST00()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 5
c 0
b 0
f 0
dl 0
loc 7
ccs 4
cts 4
cp 1
cc 2
nc 2
nop 1
crap 2
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Gbbs\NfeCalculos;
6
7
use Exception;
8
use Gbbs\NfeCalculos\Exception\InvalidCSTException;
9
use Gbbs\NfeCalculos\Exception\NotImplementedCSTException;
10
11
class ICMS
12
{
13
    public $orig;  //  Origem da mercadoria
14
    public $CST;  // Tributação do ICMS
15
    public $modBC;  // Modalidade de determinação da BC do ICMS
16
    public $pRedBC;  // Percentual da Redução de BC
17
    public $vBC;  // Valor da BC do ICMS
18
    public $pICMS;  // Alíquota do imposto
19
    public $vICMS;  // Valor do ICMS
20
    public $modBCST;  // Modalidade de determinação da BC do ICMS ST
21
    public $pMVAST;  // Percentual da margem de valor Adicionado do ICMS ST
22
    public $pRedBCST;  // Percentual da Redução de BC do ICMS ST
23
    public $vBCST;  // Valor da BC do ICMS ST
24
    public $pICMSST;  // Alíquota do imposto do ICMS ST
25
    public $vICMSST;  // Valor do ICMS ST
26
    public $UFST;  // UF para qual é devido o ICMS ST
27
    public $pBCop;  // Percentual da BC operação própria
28
    public $vBCSTRet;  // Valor da BC do ICMS Retido Anteriormente
29
    public $vICMSSTRet;  // Valor do ICMS Retido Anteriormente
30
    public $motDesICMS;  // Motivo da desoneração do ICMS
31
    public $vBCSTDest;  // Valor da BC do ICMS ST da UF destino
32
    public $vICMSSTDest;  // Valor do ICMS ST da UF destino
33
    public $pCredSN;  // Alíquota aplicável de cálculo do crédito (Simples Nacional)
34
    public $vCredICMSSN;  // Valor crédito do ICMS que pode ser aproveitado nos termos do art. 23 da LC 123 (SIMPLES NACIONAL)
35
    public $vICMSDeson;  // Valor do ICMS da desoneração
36
    public $vICMSOp;  // Valor do ICMS da Operação
37
    public $pDif;  // percentual do diferimento
38
    public $vICMSDif;  // Valor do ICMS Diferido
39
    public $vBCFCP;  // Valor da Base de Cálculo do FCP
40
    public $pFCP;  // Percentual do FCP
41
    public $vFCP;  // Valor do FCP
42
    public $vBCFCPST;  // Valor da Base de Cálculo do FCP retido por Substituição Tributária
43
    public $pFCPST;  // Percentual do FCP retido por Substituição Tributária.
44
    public $vFCPST;  // Valor do FCP retido por Substituição Tributária
45
    public $vBCFCPSTRet;  // Valor da BC do FCP retido anteriormente por Substituição Tributária
46
    public $pFCPSTRet;  // Alíquota do FCP retido anteriormente por Substituição Tributária
47
    public $vFCPSTRet;  // Valor do FCP retido anteriormente por Substituição Tributária
48
    public $pST;  // Alíquota suportada pelo Consumidor Final
49
}
50
51
/**
52
 * @param ICMS $ICMS
53
 * @param string $ufOrigem
54
 * @param string $ufDestino
55
 * @param float $reducao
56
 * @returm ICMS
57
 * @throws NotImplementedCSTException|InvalidCSTException|Exception
58
 */
59
function calcularICMS(ICMS $ICMS, string $ufOrigem, string $ufDestino, float $reducao = null): ICMS
60
{
61
    $notImplemented = [
62 27
        '20', '30', '40', '41', '50', '51', '60', '70', '90', '101', '102', '103',
63
        '200', '201', '202', '203', '300', '400', '500', '900'
64
    ];
65 27
    if ($reducao === null) {
66 26
        $ICMS->pICMS = pICMSFromUFs($ufOrigem, $ufDestino);
67 26
        $ICMS->pICMSST = pICMSSTFromUFs($ufOrigem, $ufDestino);
68
    } else {
69 1
        $ICMS->pICMS = $reducao;
70 1
        $ICMS->pICMSST = $reducao;
71
    }
72
73 27
    if ($ICMS->CST === '00') {
74 3
        return calcCST00($ICMS);
75 24
    } elseif ($ICMS->CST === '10') {
76 3
        return calcCST10($ICMS);
77 21
    } elseif (in_array($ICMS->CST, $notImplemented, true)) {
78 20
        throw new NotImplementedCSTException($ICMS->CST);
79
    }
80 1
    throw new InvalidCSTException($ICMS->CST);
81
}
82
83
/**
84
 * Calcula o Valor do ICMS
85
 * @param $ICMS
86
 * @return float
87
 */
88
function calcvICMS(ICMS $ICMS): float
89
{
90 4
    return $ICMS->vBC * ($ICMS->pICMS / 100);
91
}
92
93
/**
94
 * Calcula o Valor do ICMSST
95
 * @param $ICMS
96
 * @return float
97
 */
98
function calcvICMSST(ICMS $ICMS): float
99
{
100 2
    if ($ICMS->pMVAST === 0.0) {
101 1
        return 0.0;
102
    }
103
104 1
    $ICMS->vICMS = calcvICMS($ICMS);
105 1
    $ICMS->vBCST = $ICMS->vBCST * (1 + ($ICMS->pMVAST / 100)); // VERIFICAR AQUI O QUE ESTÃO ACONTECENDO
106 1
    return ((($ICMS->vBCST - ($ICMS->vBCST * ($ICMS->pRedBCST / 100)))) * ($ICMS->pICMSST / 100)) - $ICMS->vICMS;
107
}
108
109
/**
110
 * Calcula a redução na base de culculo do ICMSST
111
 * @param $ICMS
112
 * @return float
113
 */
114
function calcRedBCST(ICMS $ICMS): float
115
{
116 2
    return $ICMS->vBCST - ($ICMS->vBCST * ($ICMS->pRedBCST / 100));
117
}
118
119
/**
120
 * @param $ICMS
121
 * @return ICMS
122
 * @throws Exception
123
 */
124
function calcCST00(ICMS $ICMS): ICMS
125
{
126 3
    if ($ICMS->modBC === 0) {
127 2
        $ICMS->vICMS = calcvICMS($ICMS);
128 2
        return $ICMS;
129
    } else {
130 1
        throw new Exception('modBC ' . $ICMS->modBC . ' not implemented');
131
    }
132
}
133
134
/**
135
 * @param $ICMS
136
 * @return ICMS
137
 * @throws Exception
138
 */
139
function calcCST10(ICMS $ICMS): ICMS
140
{
141 3
    if ($ICMS->modBCST === 4) {
142 2
        $ICMS->vBCST = calcRedBCST($ICMS);
143 2
        $ICMS->vICMS = calcvICMS($ICMS);
144 2
        $ICMS->vICMSST = calcvICMSST($ICMS);
145 2
        return $ICMS;
146
    } else {
147 1
        throw new Exception('modBCST ' . $ICMS->modBCST . ' not implemented');
148
    }
149
}
150
151
/**
152
 * @param string $ufOrigem
153
 * @param string $ufDestino
154
 * @throws Exception
155
 * @return float
156
 */
157
function pICMSFromUFs(string $ufOrigem, string $ufDestino): float
158
{
159 27
    $path = realpath(__DIR__ . '/../storage') . '/';
160 27
    $picmsFile = file_get_contents($path . 'picms.json');
161 27
    $picmsList = json_decode($picmsFile, true);
162 27
    foreach ($picmsList as $picms) {
163 27
        if ($picms['uf'] === $ufOrigem) {
164 27
            return (float) $picms['uf' . $ufDestino];
165
        }
166
    }
167 1
    throw new Exception('UF inexistente: ' . $ufOrigem . ' - ' . $ufDestino);
168
}
169
170
/**
171
 * @param string $ufOrigem
172
 * @param string $ufDestino
173
 * @throws Exception
174
 * @return float
175
 */
176
function pICMSSTFromUFs(string $ufOrigem, string $ufDestino): float
177
{
178 27
    $path = realpath(__DIR__ . '/../storage') . '/';
179 27
    $picmsstFile = file_get_contents($path . 'picmsst.json');
180 27
    $picmsstList = json_decode($picmsstFile, true);
181 27
    foreach ($picmsstList as $picmsst) {
182 27
        if ($picmsst['uf'] === $ufOrigem) {
183 27
            return (float) $picmsst['uf' . $ufDestino];
184
        }
185
    }
186 1
    throw new Exception('UF inexistente: ' . $ufOrigem . ' - ' . $ufDestino);
187
}
188