tributus-engine 0.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,515 @@
1
+ from dataclasses import dataclass, field
2
+ from decimal import Decimal, ROUND_HALF_EVEN
3
+ from typing import Optional
4
+
5
+ from ...interfaces import (
6
+ IIcms00, IIcms10, IIcms20, IIcms30, IIcms51, IIcms70, IIcms90,
7
+ IIcms101, IIcms201, IIcms202_203, IIcms900
8
+ )
9
+ from .base import (
10
+ BaseIcmsProprio, BaseIcmsST, BaseReduzidaIcmsProprio, BaseReduzidaIcmsST,
11
+ ValorIcmsProprio, ValorIcmsST
12
+ )
13
+
14
+ @dataclass
15
+ class Icms00(IIcms00):
16
+ valor_produto: Decimal
17
+ valor_frete: Decimal
18
+ valor_seguro: Decimal
19
+ despesas_acessorias: Decimal
20
+ valor_ipi: Decimal
21
+ valor_desconto: Decimal
22
+ aliquota_icms_proprio: Decimal
23
+
24
+ _base_icms: BaseIcmsProprio = field(init=False)
25
+
26
+ def __post_init__(self):
27
+ self._base_icms = BaseIcmsProprio(
28
+ self.valor_produto, self.valor_frete, self.valor_seguro,
29
+ self.despesas_acessorias, self.valor_desconto, self.valor_ipi
30
+ )
31
+
32
+ def base_icms_proprio(self) -> Decimal:
33
+ return self._base_icms.calcular_base_icms_proprio()
34
+
35
+ def valor_icms_proprio(self) -> Decimal:
36
+ return ValorIcmsProprio(self.base_icms_proprio(), self.aliquota_icms_proprio).calcular_valor_icms_proprio()
37
+
38
+ @dataclass
39
+ class Icms10(IIcms10):
40
+ valor_produto: Decimal
41
+ valor_frete: Decimal
42
+ valor_seguro: Decimal
43
+ despesas_acessorias: Decimal
44
+ valor_ipi: Decimal
45
+ valor_desconto: Decimal
46
+ aliquota_icms_proprio: Decimal
47
+ aliquota_icms_st: Decimal
48
+ mva: Decimal
49
+ percentual_reducao_st: Decimal = Decimal('0')
50
+
51
+ _bc_icms_proprio: BaseIcmsProprio = field(init=False)
52
+
53
+ def __post_init__(self):
54
+ self._bc_icms_proprio = BaseIcmsProprio(
55
+ self.valor_produto, self.valor_frete, self.valor_seguro,
56
+ self.despesas_acessorias, self.valor_desconto
57
+ )
58
+
59
+ def base_icms_proprio(self) -> Decimal:
60
+ return self._bc_icms_proprio.calcular_base_icms_proprio()
61
+
62
+ def valor_icms_proprio(self) -> Decimal:
63
+ return ValorIcmsProprio(self.base_icms_proprio(), self.aliquota_icms_proprio).calcular_valor_icms_proprio()
64
+
65
+ def base_icms_st(self) -> Decimal:
66
+ if self.percentual_reducao_st == 0:
67
+ return self._base_icms_st_normal()
68
+ else:
69
+ bc_reduzida_icms_st = BaseReduzidaIcmsST(
70
+ self.base_icms_proprio(), self.mva, self.percentual_reducao_st, self.valor_ipi
71
+ )
72
+ return bc_reduzida_icms_st.calcular_base_reduzida_icms_st()
73
+
74
+ def _base_icms_st_normal(self) -> Decimal:
75
+ bc_icms_st = BaseIcmsST(self.base_icms_proprio(), self.mva, self.valor_ipi)
76
+ return bc_icms_st.calcular_base_icms_st()
77
+
78
+ def _valor_icms_st_normal(self, base_icms_st: Decimal) -> Decimal:
79
+ return ValorIcmsST(base_icms_st, self.aliquota_icms_st, self.valor_icms_proprio()).calcular_valor_icms_st()
80
+
81
+ def valor_icms_st(self) -> Decimal:
82
+ return self._valor_icms_st_normal(self.base_icms_st())
83
+
84
+ def valor_icms_st_desonerado(self) -> Decimal:
85
+ valor_icms_st_normal = self._valor_icms_st_normal(self._base_icms_st_normal())
86
+ valor_icms_st_desonerado = valor_icms_st_normal - self.valor_icms_st()
87
+ return valor_icms_st_desonerado.quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)
88
+
89
+ @dataclass
90
+ class Icms20(IIcms20):
91
+ valor_produto: Decimal
92
+ valor_frete: Decimal
93
+ valor_seguro: Decimal
94
+ despesas_acessorias: Decimal
95
+ valor_ipi: Decimal
96
+ valor_desconto: Decimal
97
+ aliquota_icms_proprio: Decimal
98
+ percentual_reducao: Decimal
99
+
100
+ _base_reduzida_icms: BaseReduzidaIcmsProprio = field(init=False)
101
+
102
+ def __post_init__(self):
103
+ self._base_reduzida_icms = BaseReduzidaIcmsProprio(
104
+ self.valor_produto, self.valor_frete, self.valor_seguro,
105
+ self.despesas_acessorias, self.valor_desconto, self.percentual_reducao, self.valor_ipi
106
+ )
107
+
108
+ def base_reduzida_icms_proprio(self) -> Decimal:
109
+ return self._base_reduzida_icms.calcular_base_reduzida_icms_proprio()
110
+
111
+ def valor_icms_proprio(self) -> Decimal:
112
+ base_reduzida_icms = self.base_reduzida_icms_proprio()
113
+ valor_icms = base_reduzida_icms * (self.aliquota_icms_proprio / 100)
114
+ return valor_icms.quantize(Decimal('0.01'))
115
+
116
+ def valor_icms_desonerado(self) -> Decimal:
117
+ icms00 = Icms00(
118
+ self.valor_produto, self.valor_frete, self.valor_seguro,
119
+ self.despesas_acessorias, self.valor_ipi, self.valor_desconto, self.aliquota_icms_proprio
120
+ )
121
+ valor_icms_normal = icms00.valor_icms_proprio()
122
+ valor_icms_desonerado = valor_icms_normal - self.valor_icms_proprio()
123
+ return valor_icms_desonerado.quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)
124
+
125
+ @dataclass
126
+ class Icms30(IIcms30):
127
+ valor_produto: Decimal
128
+ valor_frete: Decimal
129
+ valor_seguro: Decimal
130
+ despesas_acessorias: Decimal
131
+ valor_ipi: Decimal
132
+ valor_desconto: Decimal
133
+ aliq_icms_proprio: Decimal
134
+ aliq_icms_st: Decimal
135
+ mva: Decimal
136
+ percentual_reducao_st: Decimal = Decimal('0')
137
+
138
+ _bc_icms_proprio: BaseIcmsProprio = field(init=False)
139
+
140
+ def __post_init__(self):
141
+ self._bc_icms_proprio = BaseIcmsProprio(
142
+ self.valor_produto, self.valor_frete, self.valor_seguro,
143
+ self.despesas_acessorias, self.valor_desconto
144
+ )
145
+
146
+ def base_icms_proprio(self) -> Decimal:
147
+ return self._bc_icms_proprio.calcular_base_icms_proprio()
148
+
149
+ def valor_icms_proprio(self) -> Decimal:
150
+ return ValorIcmsProprio(self.base_icms_proprio(), self.aliq_icms_proprio).calcular_valor_icms_proprio()
151
+
152
+ def valor_icms_desonerado(self) -> Decimal:
153
+ return self.valor_icms_proprio()
154
+
155
+ def base_icms_st(self) -> Decimal:
156
+ if self.percentual_reducao_st == 0:
157
+ bc_icms_st = BaseIcmsST(self.base_icms_proprio(), self.mva, self.valor_ipi)
158
+ return bc_icms_st.calcular_base_icms_st()
159
+ else:
160
+ bc_reduzida_icms_st = BaseReduzidaIcmsST(
161
+ self.base_icms_proprio(), self.mva, self.percentual_reducao_st, self.valor_ipi
162
+ )
163
+ return bc_reduzida_icms_st.calcular_base_reduzida_icms_st()
164
+
165
+ def valor_icms_st(self) -> Decimal:
166
+ return ValorIcmsST(self.base_icms_st(), self.aliq_icms_st, self.valor_icms_proprio()).calcular_valor_icms_st()
167
+
168
+ @dataclass
169
+ class Icms51(IIcms51):
170
+ valor_produto: Decimal
171
+ valor_frete: Decimal
172
+ valor_seguro: Decimal
173
+ despesas_acessorias: Decimal
174
+ valor_ipi: Decimal
175
+ valor_desconto: Decimal
176
+ aliq_icms_proprio: Decimal
177
+ percentual_reducao: Decimal
178
+ percentual_diferimento: Decimal
179
+
180
+ def base_icms_proprio(self) -> Decimal:
181
+ if self.percentual_reducao == 0:
182
+ bc_icms_proprio = BaseIcmsProprio(
183
+ self.valor_produto, self.valor_frete, self.valor_seguro,
184
+ self.despesas_acessorias, self.valor_desconto, self.valor_ipi
185
+ )
186
+ return bc_icms_proprio.calcular_base_icms_proprio()
187
+ else:
188
+ bc_reduzida_icms_proprio = BaseReduzidaIcmsProprio(
189
+ self.valor_produto, self.valor_frete, self.valor_seguro,
190
+ self.despesas_acessorias, self.valor_desconto, self.percentual_reducao, self.valor_ipi
191
+ )
192
+ return bc_reduzida_icms_proprio.calcular_base_reduzida_icms_proprio()
193
+
194
+ def valor_icms_operacao(self) -> Decimal:
195
+ return ValorIcmsProprio(self.base_icms_proprio(), self.aliq_icms_proprio).calcular_valor_icms_proprio()
196
+
197
+ def valor_icms_diferido(self) -> Decimal:
198
+ valor_icms_operacao = self.valor_icms_operacao()
199
+ valor_icms_diferido = (valor_icms_operacao * (self.percentual_diferimento / 100))
200
+ return valor_icms_diferido.quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)
201
+
202
+ def valor_icms_proprio(self) -> Decimal:
203
+ valor_icms_proprio = self.valor_icms_operacao() - self.valor_icms_diferido()
204
+ return valor_icms_proprio.quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)
205
+
206
+ @dataclass
207
+ class Icms70(IIcms70):
208
+ valor_produto: Decimal
209
+ valor_frete: Decimal
210
+ valor_seguro: Decimal
211
+ despesas_acessorias: Decimal
212
+ valor_ipi: Decimal
213
+ valor_desconto: Decimal
214
+ aliquota_icms_proprio: Decimal
215
+ aliquota_icms_st: Decimal
216
+ mva: Decimal
217
+ percentual_reducao: Decimal
218
+ percentual_reducao_st: Decimal = Decimal('0')
219
+
220
+ _bc_reduzida_icms_proprio: BaseReduzidaIcmsProprio = field(init=False)
221
+
222
+ def __post_init__(self):
223
+ self._bc_reduzida_icms_proprio = BaseReduzidaIcmsProprio(
224
+ self.valor_produto, self.valor_frete, self.valor_seguro,
225
+ self.despesas_acessorias, self.valor_desconto, self.percentual_reducao
226
+ )
227
+
228
+ def base_icms_proprio(self) -> Decimal:
229
+ return self._bc_reduzida_icms_proprio.calcular_base_reduzida_icms_proprio()
230
+
231
+ def valor_icms_proprio(self) -> Decimal:
232
+ return ValorIcmsProprio(self.base_icms_proprio(), self.aliquota_icms_proprio).calcular_valor_icms_proprio()
233
+
234
+ def valor_icms_proprio_desonerado(self) -> Decimal:
235
+ icms00 = Icms00(
236
+ self.valor_produto, self.valor_frete, self.valor_seguro,
237
+ self.despesas_acessorias, Decimal('0'), self.valor_desconto, self.aliquota_icms_proprio
238
+ )
239
+ valor_icms_normal = icms00.valor_icms_proprio()
240
+ valor_icms_desonerado = valor_icms_normal - self.valor_icms_proprio()
241
+ return valor_icms_desonerado.quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)
242
+
243
+ def base_icms_st(self) -> Decimal:
244
+ if self.percentual_reducao_st == 0:
245
+ bc_icms_st = BaseIcmsST(self.base_icms_proprio(), self.mva, self.valor_ipi)
246
+ return bc_icms_st.calcular_base_icms_st()
247
+ else:
248
+ bc_reduzida_icms_st = BaseReduzidaIcmsST(
249
+ self.base_icms_proprio(), self.mva, self.percentual_reducao_st, self.valor_ipi
250
+ )
251
+ return bc_reduzida_icms_st.calcular_base_reduzida_icms_st()
252
+
253
+ def valor_icms_st(self) -> Decimal:
254
+ return ValorIcmsST(self.base_icms_st(), self.aliquota_icms_st, self.valor_icms_proprio()).calcular_valor_icms_st()
255
+
256
+ def valor_icms_st_desonerado(self) -> Decimal:
257
+ icms10 = Icms10(
258
+ self.valor_produto, self.valor_frete, self.valor_seguro,
259
+ self.despesas_acessorias, self.valor_ipi, self.valor_desconto,
260
+ self.aliquota_icms_proprio, self.aliquota_icms_st, self.mva
261
+ )
262
+ valor_icms_st_normal = icms10.valor_icms_st()
263
+ valor_icms_st_desonerado = valor_icms_st_normal - self.valor_icms_st()
264
+ return valor_icms_st_desonerado.quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)
265
+
266
+ @dataclass
267
+ class Icms90(IIcms90):
268
+ valor_produto: Decimal
269
+ valor_frete: Decimal
270
+ valor_seguro: Decimal
271
+ despesas_acessorias: Decimal
272
+ valor_desconto: Decimal
273
+ aliquota_icms_proprio: Decimal
274
+ aliquota_icms_st: Decimal
275
+ mva: Decimal
276
+ valor_ipi: Decimal = Decimal('0')
277
+ percentual_reducao: Decimal = Decimal('0')
278
+ percentual_reducao_st: Decimal = Decimal('0')
279
+
280
+ def calcular_base_icms_proprio(self) -> Decimal:
281
+ base_icms_proprio = BaseIcmsProprio(
282
+ self.valor_produto, self.valor_frete, self.valor_seguro,
283
+ self.despesas_acessorias, self.valor_desconto, self.valor_ipi
284
+ )
285
+ return base_icms_proprio.calcular_base_icms_proprio()
286
+
287
+ def calcular_base_reduzida_icms_proprio(self) -> Decimal:
288
+ bc_reduzida_icms_proprio = BaseReduzidaIcmsProprio(
289
+ self.valor_produto, self.valor_frete, self.valor_seguro,
290
+ self.despesas_acessorias, self.valor_desconto, self.percentual_reducao, self.valor_ipi
291
+ )
292
+ return bc_reduzida_icms_proprio.calcular_base_reduzida_icms_proprio()
293
+
294
+ def valor_icms_proprio(self) -> Decimal:
295
+ return ValorIcmsProprio(self.calcular_base_icms_proprio(), self.aliquota_icms_proprio).calcular_valor_icms_proprio()
296
+
297
+ def valor_icms_proprio_base_reduzida(self) -> Decimal:
298
+ return ValorIcmsProprio(self.calcular_base_reduzida_icms_proprio(), self.aliquota_icms_proprio).calcular_valor_icms_proprio()
299
+
300
+ def valor_icms_proprio_desonerado(self) -> Decimal:
301
+ icms00 = Icms00(
302
+ self.valor_produto, self.valor_frete, self.valor_seguro,
303
+ self.despesas_acessorias, self.valor_ipi, self.valor_desconto, self.aliquota_icms_proprio
304
+ )
305
+ valor_icms_normal = icms00.valor_icms_proprio()
306
+ valor_icms_desonerado = valor_icms_normal - self.valor_icms_proprio_base_reduzida()
307
+ return valor_icms_desonerado.quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)
308
+
309
+ def calcular_base_icms_st(self) -> Decimal:
310
+ bc_icms_st = BaseIcmsST(self.calcular_base_icms_proprio(), self.mva, self.valor_ipi)
311
+ return bc_icms_st.calcular_base_icms_st()
312
+
313
+ def calcular_base_reduzida_icms_st(self) -> Decimal:
314
+ bc_reduzida_icms_st = BaseReduzidaIcmsST(
315
+ self.calcular_base_icms_proprio(), self.mva, self.percentual_reducao_st, self.valor_ipi
316
+ )
317
+ return bc_reduzida_icms_st.calcular_base_reduzida_icms_st()
318
+
319
+ def valor_icms_st(self) -> Decimal:
320
+ return ValorIcmsST(self.calcular_base_icms_st(), self.aliquota_icms_st, self.valor_icms_proprio()).calcular_valor_icms_st()
321
+
322
+ def valor_icms_st_base_reduzida(self) -> Decimal:
323
+ return ValorIcmsST(self.calcular_base_reduzida_icms_st(), self.aliquota_icms_st, self.valor_icms_proprio()).calcular_valor_icms_st()
324
+
325
+ def valor_icms_st_desonerado(self) -> Decimal:
326
+ icms10 = Icms10(
327
+ self.valor_produto, self.valor_frete, self.valor_seguro,
328
+ self.despesas_acessorias, self.valor_ipi, self.valor_desconto,
329
+ self.aliquota_icms_proprio, self.aliquota_icms_st, self.mva
330
+ )
331
+ valor_icms_st_normal = icms10.valor_icms_st()
332
+ valor_icms_st_desonerado = valor_icms_st_normal - self.valor_icms_st_base_reduzida()
333
+ return valor_icms_st_desonerado.quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)
334
+
335
+ @dataclass
336
+ class Icms101(IIcms101):
337
+ valor_produto: Decimal
338
+ valor_frete: Decimal
339
+ valor_seguro: Decimal
340
+ despesas_acessorias: Decimal
341
+ valor_desconto: Decimal
342
+ percentual_credito_sn: Decimal
343
+ percentual_reducao: Decimal = Decimal('0')
344
+
345
+ def calcular_base_icms_proprio(self) -> Decimal:
346
+ if self.percentual_reducao == 0:
347
+ base_icms_proprio = BaseIcmsProprio(
348
+ self.valor_produto, self.valor_frete, self.valor_seguro,
349
+ self.despesas_acessorias, self.valor_desconto
350
+ )
351
+ return base_icms_proprio.calcular_base_icms_proprio()
352
+ else:
353
+ base_reduzida = BaseReduzidaIcmsProprio(
354
+ self.valor_produto, self.valor_frete, self.valor_seguro,
355
+ self.despesas_acessorias, self.valor_desconto, self.percentual_reducao
356
+ )
357
+ return base_reduzida.calcular_base_reduzida_icms_proprio()
358
+
359
+ def valor_credito_sn(self) -> Decimal:
360
+ valor_credito_sn = (self.calcular_base_icms_proprio() * (self.percentual_credito_sn / 100))
361
+ return valor_credito_sn.quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)
362
+
363
+ @dataclass
364
+ class Icms201(IIcms201):
365
+ valor_produto: Decimal
366
+ valor_frete: Decimal
367
+ valor_seguro: Decimal
368
+ despesas_acessorias: Decimal
369
+ valor_desconto: Decimal
370
+ aliquota_icms_proprio: Decimal
371
+ aliquota_icms_st: Decimal
372
+ mva: Decimal
373
+ percentual_credito_sn: Decimal
374
+ percentual_reducao: Decimal = Decimal('0')
375
+ percentual_reducao_st: Decimal = Decimal('0')
376
+
377
+ def calcular_base_icms_proprio(self) -> Decimal:
378
+ if self.percentual_reducao == 0:
379
+ base_icms_proprio = BaseIcmsProprio(
380
+ self.valor_produto, self.valor_frete, self.valor_seguro,
381
+ self.despesas_acessorias, self.valor_desconto
382
+ )
383
+ return base_icms_proprio.calcular_base_icms_proprio()
384
+ else:
385
+ bc_reduzida_icms_proprio = BaseReduzidaIcmsProprio(
386
+ self.valor_produto, self.valor_frete, self.valor_seguro,
387
+ self.despesas_acessorias, self.valor_desconto, self.percentual_reducao
388
+ )
389
+ return bc_reduzida_icms_proprio.calcular_base_reduzida_icms_proprio()
390
+
391
+ def valor_icms_proprio(self) -> Decimal:
392
+ return ValorIcmsProprio(self.calcular_base_icms_proprio(), self.aliquota_icms_proprio).calcular_valor_icms_proprio()
393
+
394
+ def valor_credito_sn(self) -> Decimal:
395
+ valor_credito_sn = (self.calcular_base_icms_proprio() * (self.percentual_credito_sn / 100))
396
+ return valor_credito_sn.quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)
397
+
398
+ def base_icms_st(self) -> Decimal:
399
+ if self.percentual_reducao_st == 0:
400
+ bc_icms_st = BaseIcmsST(self.calcular_base_icms_proprio(), self.mva)
401
+ return bc_icms_st.calcular_base_icms_st()
402
+ else:
403
+ bc_reduzida_icms_st = BaseReduzidaIcmsST(
404
+ self.calcular_base_icms_proprio(), self.mva, self.percentual_reducao_st
405
+ )
406
+ return bc_reduzida_icms_st.calcular_base_reduzida_icms_st()
407
+
408
+ def valor_icms_st(self) -> Decimal:
409
+ return ValorIcmsST(self.base_icms_st(), self.aliquota_icms_st, self.valor_icms_proprio()).calcular_valor_icms_st()
410
+
411
+ @dataclass
412
+ class Icms202_203(IIcms202_203):
413
+ valor_produto: Decimal
414
+ valor_frete: Decimal
415
+ valor_seguro: Decimal
416
+ despesas_acessorias: Decimal
417
+ valor_desconto: Decimal
418
+ aliquota_icms_proprio: Decimal
419
+ aliquota_icms_st: Decimal
420
+ mva: Decimal
421
+ percentual_reducao: Decimal = Decimal('0')
422
+ percentual_reducao_st: Decimal = Decimal('0')
423
+
424
+ def calcular_base_icms_proprio(self) -> Decimal:
425
+ if self.percentual_reducao == 0:
426
+ base_icms_proprio = BaseIcmsProprio(
427
+ self.valor_produto, self.valor_frete, self.valor_seguro,
428
+ self.despesas_acessorias, self.valor_desconto
429
+ )
430
+ return base_icms_proprio.calcular_base_icms_proprio()
431
+ else:
432
+ bc_reduzida_icms_proprio = BaseReduzidaIcmsProprio(
433
+ self.valor_produto, self.valor_frete, self.valor_seguro,
434
+ self.despesas_acessorias, self.valor_desconto, self.percentual_reducao
435
+ )
436
+ return bc_reduzida_icms_proprio.calcular_base_reduzida_icms_proprio()
437
+
438
+ def valor_icms_proprio(self) -> Decimal:
439
+ return ValorIcmsProprio(self.calcular_base_icms_proprio(), self.aliquota_icms_proprio).calcular_valor_icms_proprio()
440
+
441
+ def base_icms_st(self) -> Decimal:
442
+ if self.percentual_reducao_st == 0:
443
+ bc_icms_st = BaseIcmsST(self.calcular_base_icms_proprio(), self.mva)
444
+ return bc_icms_st.calcular_base_icms_st()
445
+ else:
446
+ bc_reduzida_icms_st = BaseReduzidaIcmsST(
447
+ self.calcular_base_icms_proprio(), self.mva, self.percentual_reducao_st
448
+ )
449
+ return bc_reduzida_icms_st.calcular_base_reduzida_icms_st()
450
+
451
+ def valor_icms_st(self) -> Decimal:
452
+ return ValorIcmsST(self.base_icms_st(), self.aliquota_icms_st, self.valor_icms_proprio()).calcular_valor_icms_st()
453
+
454
+ @dataclass
455
+ class Icms900(IIcms900):
456
+ valor_produto: Decimal
457
+ valor_frete: Decimal
458
+ valor_seguro: Decimal
459
+ despesas_acessorias: Decimal
460
+ valor_desconto: Decimal
461
+ aliquota_icms_proprio: Decimal
462
+ aliquota_icms_st: Decimal
463
+ mva: Decimal
464
+ percentual_credito_sn: Decimal = Decimal('0')
465
+ valor_ipi: Decimal = Decimal('0')
466
+ percentual_reducao: Decimal = Decimal('0')
467
+ percentual_reducao_st: Decimal = Decimal('0')
468
+
469
+ def calcular_base_icms_proprio(self) -> Decimal:
470
+ base_icms_proprio = BaseIcmsProprio(
471
+ self.valor_produto, self.valor_frete, self.valor_seguro,
472
+ self.despesas_acessorias, self.valor_desconto, self.valor_ipi
473
+ )
474
+ return base_icms_proprio.calcular_base_icms_proprio()
475
+
476
+ def calcular_base_reduzida_icms_proprio(self) -> Decimal:
477
+ bc_reduzida_icms_proprio = BaseReduzidaIcmsProprio(
478
+ self.valor_produto, self.valor_frete, self.valor_seguro,
479
+ self.despesas_acessorias, self.valor_desconto, self.percentual_reducao, self.valor_ipi
480
+ )
481
+ return bc_reduzida_icms_proprio.calcular_base_reduzida_icms_proprio()
482
+
483
+ def valor_icms_proprio(self) -> Decimal:
484
+ return ValorIcmsProprio(self.calcular_base_icms_proprio(), self.aliquota_icms_proprio).calcular_valor_icms_proprio()
485
+
486
+ def valor_icms_proprio_base_reduzida(self) -> Decimal:
487
+ # Note: The original C# code used Round(val, 2) here instead of Round(val, 2, MidpointRounding.ToEven) in one place,
488
+ # but mostly consistent. I'll stick to standard rounding for consistency unless tests fail.
489
+ # Actually in C# Icms900.ValorIcmsProprio used Round(val, 2) (default is ToEven in C#? No, default is ToEven in Math.Round(decimal), but here it was explicit).
490
+ # Wait, C# `decimal.Round(val, 2)` uses `MidpointRounding.ToEven` by default.
491
+ return ValorIcmsProprio(self.calcular_base_reduzida_icms_proprio(), self.aliquota_icms_proprio).calcular_valor_icms_proprio()
492
+
493
+ def valor_credito_sn(self) -> Decimal:
494
+ if self.percentual_reducao == 0:
495
+ valor_credito_sn = (self.calcular_base_icms_proprio() * (self.percentual_credito_sn / 100))
496
+ else:
497
+ valor_credito_sn = (self.calcular_base_reduzida_icms_proprio() * (self.percentual_credito_sn / 100))
498
+
499
+ return valor_credito_sn.quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)
500
+
501
+ def calcular_base_icms_st(self) -> Decimal:
502
+ bc_icms_st = BaseIcmsST(self.calcular_base_icms_proprio(), self.mva, self.valor_ipi)
503
+ return bc_icms_st.calcular_base_icms_st()
504
+
505
+ def calcular_base_reduzida_icms_st(self) -> Decimal:
506
+ bc_reduzida_icms_st = BaseReduzidaIcmsST(
507
+ self.calcular_base_icms_proprio(), self.mva, self.percentual_reducao_st, self.valor_ipi
508
+ )
509
+ return bc_reduzida_icms_st.calcular_base_reduzida_icms_st()
510
+
511
+ def valor_icms_st(self) -> Decimal:
512
+ return ValorIcmsST(self.calcular_base_icms_st(), self.aliquota_icms_st, self.valor_icms_proprio()).calcular_valor_icms_st()
513
+
514
+ def valor_icms_st_base_reduzida(self) -> Decimal:
515
+ return ValorIcmsST(self.calcular_base_reduzida_icms_st(), self.aliquota_icms_st, self.valor_icms_proprio()).calcular_valor_icms_st()
@@ -0,0 +1,36 @@
1
+ from dataclasses import dataclass
2
+ from decimal import Decimal, ROUND_HALF_EVEN
3
+
4
+ from ...interfaces import IFcp, IFcpDif, IFcpEfet, IFcpST
5
+
6
+ @dataclass
7
+ class Fcp(IFcp):
8
+ base_calculo: Decimal
9
+ aliquota_fcp: Decimal
10
+
11
+ def valor_fcp(self) -> Decimal:
12
+ return (self.aliquota_fcp / 100 * self.base_calculo).quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)
13
+
14
+ @dataclass
15
+ class FcpDiferido(IFcpDif):
16
+ valor_fcp: Decimal
17
+ aliquota_diferimento_fcp: Decimal
18
+
19
+ def valor_fcp_diferido(self) -> Decimal:
20
+ return (self.valor_fcp * self.aliquota_diferimento_fcp / 100).quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)
21
+
22
+ @dataclass
23
+ class FcpEfetivo(IFcpEfet):
24
+ valor_fcp: Decimal
25
+ valor_fcp_diferido: Decimal
26
+
27
+ def valor_fcp_efetivo(self) -> Decimal:
28
+ return (self.valor_fcp - self.valor_fcp_diferido).quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)
29
+
30
+ @dataclass
31
+ class FcpST(IFcpST):
32
+ base_calculo_st: Decimal
33
+ aliquota_fcp_st: Decimal
34
+
35
+ def valor_fcp_st(self) -> Decimal:
36
+ return (self.aliquota_fcp_st / 100 * self.base_calculo_st).quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)
@@ -0,0 +1,49 @@
1
+ from dataclasses import dataclass, field
2
+ from decimal import Decimal, ROUND_HALF_EVEN
3
+
4
+ from ..interfaces import IIpi50AdValorem, IIpiEspecifico
5
+
6
+ @dataclass
7
+ class BaseIPI:
8
+ valor_produto: Decimal
9
+ valor_frete: Decimal
10
+ valor_seguro: Decimal
11
+ despesas_acessorias: Decimal
12
+
13
+ def calcular_base_ipi(self) -> Decimal:
14
+ base_ipi = (
15
+ self.valor_produto +
16
+ self.valor_frete +
17
+ self.valor_seguro +
18
+ self.despesas_acessorias
19
+ )
20
+ return base_ipi.quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)
21
+
22
+ @dataclass
23
+ class Ipi50AdValorem(IIpi50AdValorem):
24
+ valor_produto: Decimal
25
+ valor_frete: Decimal
26
+ valor_seguro: Decimal
27
+ despesas_acessorias: Decimal
28
+ aliquota_ipi: Decimal
29
+
30
+ _base_calculo: BaseIPI = field(init=False)
31
+
32
+ def __post_init__(self):
33
+ self._base_calculo = BaseIPI(
34
+ self.valor_produto, self.valor_frete, self.valor_seguro, self.despesas_acessorias
35
+ )
36
+
37
+ def calcular_base_ipi(self) -> Decimal:
38
+ return self._base_calculo.calcular_base_ipi()
39
+
40
+ def valor_ipi(self) -> Decimal:
41
+ return (self.calcular_base_ipi() * (self.aliquota_ipi / 100)).quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)
42
+
43
+ @dataclass
44
+ class Ipi50Especifico(IIpiEspecifico):
45
+ base_calculo: Decimal
46
+ aliquota_por_unidade: Decimal
47
+
48
+ def valor_ipi(self) -> Decimal:
49
+ return (self.aliquota_por_unidade * self.base_calculo).quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)
@@ -0,0 +1,56 @@
1
+ from dataclasses import dataclass, field
2
+ from decimal import Decimal, ROUND_HALF_EVEN
3
+
4
+ from ..interfaces import IPis01_02, IPis03
5
+
6
+ @dataclass
7
+ class BasePIS:
8
+ valor_produto: Decimal
9
+ valor_frete: Decimal
10
+ valor_seguro: Decimal
11
+ despesas_acessorias: Decimal
12
+ valor_desconto: Decimal
13
+ valor_icms: Decimal = Decimal('0')
14
+
15
+ def calcular_base_pis(self) -> Decimal:
16
+ base_pis = (
17
+ self.valor_produto +
18
+ self.valor_frete +
19
+ self.valor_seguro +
20
+ self.despesas_acessorias -
21
+ self.valor_desconto
22
+ )
23
+ base_pis = base_pis - self.valor_icms
24
+ return base_pis.quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)
25
+
26
+ @dataclass
27
+ class Pis01_02(IPis01_02):
28
+ valor_produto: Decimal
29
+ valor_frete: Decimal
30
+ valor_seguro: Decimal
31
+ despesas_acessorias: Decimal
32
+ valor_desconto: Decimal
33
+ aliquota_pis: Decimal
34
+ valor_icms: Decimal = Decimal('0')
35
+
36
+ _base_pis: BasePIS = field(init=False)
37
+
38
+ def __post_init__(self):
39
+ self._base_pis = BasePIS(
40
+ self.valor_produto, self.valor_frete, self.valor_seguro,
41
+ self.despesas_acessorias, self.valor_desconto, self.valor_icms
42
+ )
43
+
44
+ def base_pis(self) -> Decimal:
45
+ return self._base_pis.calcular_base_pis()
46
+
47
+ def valor_pis(self) -> Decimal:
48
+ return (self.base_pis() * (self.aliquota_pis / 100)).quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)
49
+
50
+ @dataclass
51
+ class Pis03(IPis03):
52
+ base_calculo: Decimal
53
+ aliquota_por_unidade: Decimal
54
+
55
+ def valor_pis(self) -> Decimal:
56
+ return (self.aliquota_por_unidade * self.base_calculo).quantize(Decimal('0.01'), rounding=ROUND_HALF_EVEN)
@@ -0,0 +1,25 @@
1
+ from .protocols import (
2
+ ICbs,
3
+ ICofins01_02,
4
+ ICofins03,
5
+ IFcp,
6
+ IFcpDif,
7
+ IFcpEfet,
8
+ IFcpST,
9
+ IIbsUf,
10
+ IIcms00,
11
+ IIcms10,
12
+ IIcms101,
13
+ IIcms20,
14
+ IIcms201,
15
+ IIcms202_203,
16
+ IIcms30,
17
+ IIcms51,
18
+ IIcms70,
19
+ IIcms90,
20
+ IIcms900,
21
+ IIpi50AdValorem,
22
+ IIpiEspecifico,
23
+ IPis01_02,
24
+ IPis03,
25
+ )