Passed
Push — master ( a02b45...db15de )
by João
02:19 queued 26s
created

IPI::setPIPI()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 11
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 5.0342

Importance

Changes 0
Metric Value
cc 5
eloc 8
nc 5
nop 1
dl 0
loc 11
ccs 8
cts 9
cp 0.8889
crap 5.0342
rs 9.6111
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Gbbs\NfeCalculos;
6
7
use Gbbs\NfeCalculos\Exception\InvalidCSTException;
8
use Gbbs\NfeCalculos\Exception\NotImplementedCSTException;
9
use \Exception;
10
11
class IPI
12
{
13
    private $CNPJProd;
14
    private $cSelo;
15
    private $qSelo;
16
    private $cEnq;
17
    private $CST;
18
    private $vBC;
19
    private $pIPI;
20
    private $vIPI;
21
    private $qUnid;
22
    private $vUnid;
23
24
    /**
25
     * @param self $IPI
26
     * @throws NotImplementedCSTException|InvalidCSTException
27
     */
28 15
    public static function calcular(self $IPI, string $ncm): void
29
    {
30 15
        $IPI->setPIPI($ncm);
31 15
        if ($IPI->getCST() === '00') {
32
            /* ENTRADA COM RECUPERAÇÃO DE CRÉDITO */
33 1
            throw new NotImplementedCSTException($IPI->getCST());
34
//            self::calcAliquotaAdValoren($IPI);
35 14
        } elseif ($IPI->getCST() === '01') {
36
            /* 01 ENTRADA TRIBUTADA COM ALICOTA ZERO */
37 1
            throw new NotImplementedCSTException($IPI->getCST());
38
//            self::calcIsento($IPI);
39 13
        } elseif ($IPI->getCST() === '02') {
40
            /* ENTRADA ISENTA */
41 1
            throw new NotImplementedCSTException($IPI->getCST());
42
//            self::calcIsento($IPI);
43 12
        } elseif ($IPI->getCST() === '03') {
44
            /* ENTRADA NÃO TRIBUTADA */
45 1
            throw new NotImplementedCSTException($IPI->getCST());
46
//            self::calcIsento($IPI);
47 11
        } elseif ($IPI->getCST() === '04') {
48
            /* ENTRADA IMUNE */
49 1
            throw new NotImplementedCSTException($IPI->getCST());
50
//            self::calcIsento($IPI);
51 10
        } elseif ($IPI->getCST() === '05') {
52
            /* ENTRADA COM SUSPENSAO */
53 1
            throw new NotImplementedCSTException($IPI->getCST());
54
//            self::calcIsento($IPI);
55 9
        } elseif ($IPI->getCST() === '49') {
56
            /* OUTRAS ENTRADAS */
57 1
            throw new NotImplementedCSTException($IPI->getCST());
58
//            self::calcRetornoIsentoValorOutros($IPI);
59 8
        } elseif ($IPI->getCST() === '50') {
60
            /* SAÍDA TRIBUTADA */
61 1
            self::calcAliquotaAdValoren($IPI);
62 7
        } elseif ($IPI->getCST() === '51') {
63
            /* SAÍDA TRIBUTADA COM ALICOTA ZERO */
64 1
            self::calcIsento($IPI);
65 6
        } elseif ($IPI->getCST() === '52') {
66
            /* SAÍDA ISENTA */
67 1
            throw new NotImplementedCSTException($IPI->getCST());
68
//            self::calcIsento($IPI);
69 5
        } elseif ($IPI->getCST() === '53') {
70
            /* SAÍDA NÃO-TRIBUTADA */
71 1
            throw new NotImplementedCSTException($IPI->getCST());
72
//            self::calcIsento($IPI);
73 4
        } elseif ($IPI->getCST() === '54') {
74
            /* SAÍDA IMUNE */
75 1
            throw new NotImplementedCSTException($IPI->getCST());
76
//            self::calcIsento($IPI);
77 3
        } elseif ($IPI->getCST() === '55') {
78
            /* SAÍDA COM SUSPENSAO */
79 1
            throw new NotImplementedCSTException($IPI->getCST());
80
//            self::calcIsento($IPI);
81 2
        } elseif ($IPI->getCST() === '99') {
82
            /* OUTRAS SAÍDAS */
83 1
            throw new NotImplementedCSTException($IPI->getCST());
84
//            self::calcAliquotaAdValoren($IPI);
85
        } else {
86 1
            throw new InvalidCSTException($IPI->getCST());
87
        }
88 2
    }
89
90
    /**
91
     * ISENTO
92
     * @param self $IPI
93
     */
94 1
    private static function calcIsento(self $IPI): void
95
    {
96 1
        $IPI->setVIPI(0.0);
97 1
        $IPI->setVBC(0.0);
98 1
        $IPI->pIPI = 0.0;
99 1
        $IPI->setQUnid(null);
100 1
        $IPI->setVUnid(null);
101 1
    }
102
103
    /**
104
     * Calcula o Valor IPI Ad Valoren
105
     * @param self $IPI
106
     */
107 1
    private static function calcAliquotaAdValoren(self $IPI): void
108
    {
109 1
        $IPI->setVIPI($IPI->getVBC() * ($IPI->getPIPI() / 100));
110 1
    }
111
112
//    private static function calcRetornoIsentoValorOutros($IPI)
113
//    {
114
//        if ($IPI->CSTNotaRef === '00' || $IPI->CSTNotaRef === '50' || $IPI->CSTNotaRef === '99') {
115
//            $IPI->vIPI = ($IPI->vBC * ($IPI->pIPI / 100));
116
//            $IPI->pIPI = 0;
117
//        } else {
118
//            self::calcIsento($IPI);
119
//        }
120
//    }
121
122
    /**
123
     * @return string
124
     */
125 1
    public function getCNPJProd(): string
126
    {
127 1
        return $this->CNPJProd;
128
    }
129
130
    /**
131
     * @param string $CNPJProd
132
     */
133 1
    public function setCNPJProd(string $CNPJProd): void
134
    {
135 1
        $this->CNPJProd = $CNPJProd;
136 1
    }
137
138
    /**
139
     * @return string
140
     */
141 1
    public function getCSelo(): string
142
    {
143 1
        return $this->cSelo;
144
    }
145
146
    /**
147
     * @param string $cSelo
148
     */
149 1
    public function setCSelo(string $cSelo): void
150
    {
151 1
        $this->cSelo = $cSelo;
152 1
    }
153
154
    /**
155
     * @return float
156
     */
157 1
    public function getQSelo(): float
158
    {
159 1
        return $this->qSelo;
160
    }
161
162
    /**
163
     * @param float $qSelo
164
     */
165 1
    public function setQSelo(float $qSelo): void
166
    {
167 1
        $this->qSelo = $qSelo;
168 1
    }
169
170
    /**
171
     * @return string
172
     */
173 1
    public function getCEnq(): string
174
    {
175 1
        return $this->cEnq;
176
    }
177
178
    /**
179
     * @param string $cEnq
180
     */
181 1
    public function setCEnq(string $cEnq): void
182
    {
183 1
        $this->cEnq = $cEnq;
184 1
    }
185
186
    /**
187
     * @return string
188
     */
189 16
    public function getCST(): string
190
    {
191 16
        return $this->CST;
192
    }
193
194
    /**
195
     * @param string $CST
196
     */
197 16
    public function setCST(string $CST): void
198
    {
199 16
        $this->CST = $CST;
200 16
    }
201
202
    /**
203
     * @return float
204
     */
205 2
    public function getVBC(): float
206
    {
207 2
        return $this->vBC;
208
    }
209
210
    /**
211
     * @param float $vBC
212
     */
213 3
    public function setVBC(float $vBC): void
214
    {
215 3
        $this->vBC = $vBC;
216 3
    }
217
218
    /**
219
     * @return float
220
     */
221 1
    public function getPIPI(): float
222
    {
223 1
        return $this->pIPI;
224
    }
225
226
    /**
227
     * @param string $ncm
228
     * @throws Exception
229
     */
230 15
    public function setPIPI(string $ncm): void
231
    {
232 15
        $path = realpath(__DIR__ . '/../storage') . '/';
233 15
        $tipiFile = file_get_contents($path . 'tipi.json');
234 15
        if ($tipiFile === false) {
235
            throw new Exception('File tipi.json not found.');
236
        }
237 15
        $tipiList = json_decode($tipiFile, true);
238 15
        foreach ($tipiList as $tipi) {
239 15
            if ($tipi['NCMNum'] === $ncm) {
240 15
                $this->pIPI = (float) ($tipi['NCMAli'] === 'NT'? 0 : $tipi['NCMAli']);
241
            }
242
        }
243 15
    }
244
245
    /**
246
     * @return float
247
     */
248 1
    public function getVIPI(): float
249
    {
250 1
        return $this->vIPI;
251
    }
252
253
    /**
254
     * @param float $vIPI
255
     */
256 3
    public function setVIPI(float $vIPI): void
257
    {
258 3
        $this->vIPI = $vIPI;
259 3
    }
260
261
    /**
262
     * @return float
263
     */
264 1
    public function getQUnid(): float
265
    {
266 1
        return $this->qUnid;
267
    }
268
269
    /**
270
     * @param float $qUnid
271
     */
272 2
    public function setQUnid(?float $qUnid): void
273
    {
274 2
        $this->qUnid = $qUnid;
275 2
    }
276
277
    /**
278
     * @return float
279
     */
280 1
    public function getVUnid(): float
281
    {
282 1
        return $this->vUnid;
283
    }
284
285
    /**
286
     * @param float $vUnid
287
     */
288 2
    public function setVUnid(?float $vUnid): void
289
    {
290 2
        $this->vUnid = $vUnid;
291 2
    }
292
}
293