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.
- tributus_engine/__init__.py +9 -0
- tributus_engine/engine.py +623 -0
- tributus_engine/implementations/__init__.py +20 -0
- tributus_engine/implementations/cofins.py +56 -0
- tributus_engine/implementations/ibs_cbs.py +103 -0
- tributus_engine/implementations/icms/__init__.py +27 -0
- tributus_engine/implementations/icms/base.py +84 -0
- tributus_engine/implementations/icms/cst.py +515 -0
- tributus_engine/implementations/icms/fcp.py +36 -0
- tributus_engine/implementations/ipi.py +49 -0
- tributus_engine/implementations/pis.py +56 -0
- tributus_engine/interfaces/__init__.py +25 -0
- tributus_engine/interfaces/protocols.py +124 -0
- tributus_engine-0.2.0.dist-info/METADATA +186 -0
- tributus_engine-0.2.0.dist-info/RECORD +17 -0
- tributus_engine-0.2.0.dist-info/WHEEL +5 -0
- tributus_engine-0.2.0.dist-info/top_level.txt +1 -0
|
@@ -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
|
+
)
|