-
Notifications
You must be signed in to change notification settings - Fork 217
Expand file tree
/
Copy pathnotafiscal.py
More file actions
1292 lines (956 loc) · 36.1 KB
/
notafiscal.py
File metadata and controls
1292 lines (956 loc) · 36.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# -*- coding: utf-8 -*-
import random
from decimal import Decimal
from pynfe import get_version
# from pynfe.utils import so_numeros, memoize
from pynfe.utils import so_numeros
from pynfe.utils.flags import CODIGOS_ESTADOS, NF_STATUS
from .base import CampoDeprecated, Entidade
class NotaFiscal(Entidade):
# campos deprecados
campos_deprecados = [
CampoDeprecated(
"tipo_pagamento",
novo=None,
motivo="Por favor utilize os grupos de pagamento pela função adicionar_pagamento.",
apenas_warning=True,
),
]
status = NF_STATUS[0]
# Código numérico aleatório que compõe a chave de acesso
codigo_numerico_aleatorio = str()
# Digito verificador do codigo numerico aleatorio
dv_codigo_numerico_aleatorio = str()
# Nota Fisca eletronica
# - Modelo (formato: NN)
modelo = int()
# - Serie (obrigatorio - formato: NNN)
serie = str()
# - Numero NF (obrigatorio)
numero_nf = str()
# - Data da Emissao (obrigatorio)
data_emissao = None
# - Natureza da Operacao (obrigatorio)
natureza_operacao = str()
# - Tipo do Documento (obrigatorio - seleciona de lista) - NF_TIPOS_DOCUMENTO
tipo_documento = int()
# - Processo de emissão da NF-e (obrigatorio - seleciona de lista) - NF_PROCESSOS_EMISSAO
processo_emissao = 0
# - Versao do processo de emissão da NF-e
versao_processo_emissao = get_version()
# - Tipo impressao DANFE (obrigatorio - seleciona de lista) - NF_TIPOS_IMPRESSAO_DANFE
tipo_impressao_danfe = int()
# - Data de saida/entrada
data_saida_entrada = None
# - Forma de pagamento (obrigatorio - seleciona de lista) - NF_FORMAS_PAGAMENTO
# Removido na NF-e 4.00
# forma_pagamento = int()
# - Tipo de pagamento
"""
Obrigatório o preenchimento do Grupo Informações de Pagamento para NF-e e NFC-e.
Para as notas com finalidade de Ajuste ou Devolução o campo Forma de Pagamento
deve ser preenchido com 90=Sem Pagamento.
01=Dinheiro
02=Cheque
03=Cartão de Crédito
04=Cartão de Débito
05=Crédito Loja
10=Vale Alimentação
11=Vale Refeição
12=Vale Presente
13=Vale Combustível
14=Duplicata Mercantil
90= Sem pagamento
99=Outros
"""
tipo_pagamento = None
# - Forma de emissao (obrigatorio - seleciona de lista) - NF_FORMAS_EMISSAO
forma_emissao = str()
# - Finalidade de emissao (obrigatorio - seleciona de lista) - NF_FINALIDADES_EMISSAO
finalidade_emissao = int()
# - Indica se a nota e para consumidor final
cliente_final = int()
# - Indica se a compra foi feita presencialmente, telefone, internet, etc
"""
0=Não se aplica (por exemplo, Nota Fiscal complementar ou deajuste);
1=Operação presencial;
2=Operação não presencial, pela Internet;
3=Operação não presencial, Teleatendimento;
4=NFC-e em operação com entrega a domicílio;
5=Operação presencial, fora do estabelecimento;
9=Operação não presencial, outros.
"""
indicador_presencial = int()
# - Indicador de intermediador/marketplace
"""
0=Operação sem intermediador (em site ou plataforma própria)
1=Operação em site ou plataforma de terceiros
(intermediadores/marketplace)</xs:documentation>
"""
indicador_intermediador = int()
""" nfce suporta apenas operação interna
Identificador de local de destino da operação
1=Operação interna;2=Operação interestadual;3=Operação com exterior.
"""
indicador_destino = int()
# - UF - converter para codigos em CODIGOS_ESTADOS
uf = str()
# - Municipio de ocorrencia
municipio = str()
# - Digest value da NF-e (somente leitura)
digest_value = None
# - Valor total da nota (somente leitura)
valor_total_nota = Decimal()
# - Valor ICMS da nota (somente leitura)
valor_icms_nota = Decimal()
# - Valor ICMS ST da nota (somente leitura)
valor_icms_st_nota = Decimal()
# - Protocolo (somente leitura)
protocolo = str()
# - Data (somente leitura)
data = None
# - Notas Fiscais Referenciadas (lista 1 para * / ManyToManyField)
notas_fiscais_referenciadas = None
# - Emitente (CNPJ ???)
emitente = None
# - Destinatario/Remetente
# - Identificacao (seleciona de Clientes)
destinatario_remetente = None
# - Entrega (XXX sera possivel ter entrega e retirada ao mesmo tempo na NF?)
entrega = None
# - Retirada
retirada = None
# - Local Retirada/Entrega
# - Local de retirada diferente do emitente (Sim/Nao)
local_retirada_diferente_emitente = False
# - Local de entrega diferente do destinatario (Sim/Nao)
local_entrega_diferente_destinatario = False
# - Autorizados a baixar XML (lista 1 para * / ManyToManyField)
autorizados_baixar_xml = None
# - Produtos e Servicos (lista 1 para * / ManyToManyField)
produtos_e_servicos = None
# Totais
# - ICMS
# - Base de calculo (somente leitura)
totais_icms_base_calculo = Decimal()
# - Total do ICMS (somente leitura)
totais_icms_total = Decimal()
# - Total do ICMS Desonerado (somente leitura)
totais_icms_desonerado = Decimal()
# - Base de calculo do ICMS ST (somente leitura)
totais_icms_st_base_calculo = Decimal()
# - Total do ICMS ST (somente leitura)
totais_icms_st_total = Decimal()
# - Total dos produtos e servicos (somente leitura)
totais_icms_total_produtos_e_servicos = Decimal()
# - Total do frete (somente leitura)
totais_icms_total_frete = Decimal()
# - Total do seguro (somente leitura)
totais_icms_total_seguro = Decimal()
# - Total do desconto (somente leitura)
totais_icms_total_desconto = Decimal()
# - Total do II (somente leitura)
totais_icms_total_ii = Decimal()
# - Total do IPI (somente leitura)
totais_icms_total_ipi = Decimal()
# - Valor Total do IPI devolvido
# Deve ser informado quando preenchido o Grupo Tributos Devolvidos na emissão de nota
# finNFe=4 (devolução) nas operações com não contribuintes do IPI.
# Corresponde ao total da soma dos campos id:UA04.
totais_icms_total_ipi_dev = Decimal()
# - PIS (somente leitura)
totais_icms_pis = Decimal()
# - COFINS (somente leitura)
totais_icms_cofins = Decimal()
# - Outras despesas acessorias
totais_icms_outras_despesas_acessorias = Decimal()
# - Total da nota
totais_icms_total_nota = Decimal()
# - ISSQN
# - Base de calculo do ISS
totais_issqn_base_calculo_iss = Decimal()
# - Total do ISS
totais_issqn_total_iss = Decimal()
# - PIS sobre servicos
totais_issqn_pis = Decimal()
# - COFINS sobre servicos
totais_issqn_cofins = Decimal()
# - Total dos servicos sob nao-incidencia ou nao tributados pelo ICMS
totais_issqn_total = Decimal()
# - Retencao de Tributos
# - Valor retido de PIS
totais_retencao_valor_retido_pis = Decimal()
# - Valor retido de COFINS
totais_retencao_valor_retido_cofins = Decimal()
# - Valor retido de CSLL
totais_retencao_valor_retido_csll = Decimal()
# - Base de calculo do IRRF
totais_retencao_base_calculo_irrf = Decimal()
# - Valor retido do IRRF
totais_retencao_valor_retido_irrf = Decimal()
# - BC da ret. da Prev. Social
totais_retencao_bc_retencao_previdencia_social = Decimal()
# - Retencao da Prev. Social
totais_retencao_retencao_previdencia_social = Decimal()
# - Valor aproximado total de tributos federais, estaduais e municipais.
totais_tributos_aproximado = Decimal()
# - Valor Total do FCP (Fundo de Combate à Pobreza)
totais_fcp = Decimal()
# - Valor total do ICMS relativo Fundo de Combate à Pobreza (FCP) da UF de destino
totais_fcp_destino = Decimal()
# - Valor Total do FCP (Fundo de Combate à Pobreza) retido por substituição tributária
totais_fcp_st = Decimal()
# - Valor Total do FCP retido anteriormente por Substituição Tributária
totais_fcp_st_ret = Decimal()
# - Valor total do ICMS Interestadual para a UF de destino
totais_icms_inter_destino = Decimal()
# - Valor total do ICMS Interestadual para a UF do remetente
totais_icms_inter_remetente = Decimal()
# - Valor total do qBCMonoRet
totais_icms_q_bc_mono_ret = Decimal()
# - Valor total do vICMSMonoRet
totais_icms_v_icms_mono_ret = Decimal()
# - Valor total da quantidade tributada do ICMS monofásico próprio
totais_icms_q_bc_mono = Decimal()
# - Valor total do ICMS monofásico próprio
totais_icms_v_icms_mono = Decimal()
# - Valor total da quantidade tributada do ICMS monofásico sujeito a retenção
totais_icms_q_bc_mono_reten = Decimal()
# - Valor total do ICMS monofásico sujeito a retenção
totais_icms_v_icms_mono_reten = Decimal()
# Transporte
# - Modalidade do Frete (obrigatorio - seleciona de lista) - MODALIDADES_FRETE
# 0=Contratação do Frete por conta do Remetente (CIF);
# 1=Contratação do Frete por conta do Destinatário (FOB);
# 2=Contratação do Frete por conta de Terceiros;
# 3=Transporte Próprio por conta do Remetente;
# 4=Transporte Próprio por conta do Destinatário;
# 9=Sem Ocorrência de Transporte.
transporte_modalidade_frete = int()
# - Transportador (seleciona de Transportadoras)
transporte_transportadora = None
# - Retencao do ICMS
# - Base de calculo
transporte_retencao_icms_base_calculo = Decimal()
# - Aliquota
transporte_retencao_icms_aliquota = Decimal()
# - Valor do servico
transporte_retencao_icms_valor_servico = Decimal()
# - UF
transporte_retencao_icms_uf = str()
# - Municipio
transporte_retencao_icms_municipio = Decimal()
# - CFOP
transporte_retencao_icms_cfop = str()
# - ICMS retido
transporte_retencao_icms_retido = Decimal()
# - Veiculo
# - Placa
transporte_veiculo_placa = str()
# - RNTC
transporte_veiculo_rntc = str()
# - UF
transporte_veiculo_uf = str()
# - Reboque
# - Placa
transporte_reboque_placa = str()
# - RNTC
transporte_reboque_rntc = str()
# - UF
transporte_reboque_uf = str()
# - Volumes (lista 1 para * / ManyToManyField)
transporte_volumes = None
# Cobranca
# - Fatura
# - Numero
fatura_numero = str()
# - Valor original
fatura_valor_original = Decimal()
# - Valor do desconto
fatura_valor_desconto = Decimal()
# - Valor liquido
fatura_valor_liquido = Decimal()
# - Duplicatas (lista 1 para * / ManyToManyField)
duplicatas = None
# Informacoes Adicionais
# - Informacoes Adicionais
# - Informacoes adicionais de interesse do fisco
informacoes_adicionais_interesse_fisco = str()
# - Informacoes complementares de interesse do contribuinte
informacoes_complementares_interesse_contribuinte = str()
# - Observacoes do Contribuinte (lista 1 para * / ManyToManyField)
observacoes_contribuinte = None
# - Processo Referenciado (lista 1 para * / ManyToManyField)
processos_referenciados = None
# - pagamentos
pagamentos = list()
# valor do troco
valor_troco = Decimal()
def __init__(self, *args, **kwargs):
self.autorizados_baixar_xml = []
self.notas_fiscais_referenciadas = []
self.produtos_e_servicos = []
self.transporte_volumes = []
self.duplicatas = []
self.observacoes_contribuinte = []
self.processos_referenciados = []
self.responsavel_tecnico = []
self.pagamentos = []
super(NotaFiscal, self).__init__(*args, **kwargs)
def __str__(self):
return " ".join([str(self.modelo), self.serie, self.numero_nf])
def adicionar_pagamento(self, **kwargs):
"""Adiciona uma instancia de Responsavel Tecnico"""
obj = NotaFiscalPagamentos(**kwargs)
self.pagamentos.append(obj)
return obj
def adicionar_autorizados_baixar_xml(self, **kwargs):
obj = AutorizadosBaixarXML(**kwargs)
self.autorizados_baixar_xml.append(obj)
return obj
def adicionar_nota_fiscal_referenciada(self, **kwargs):
"""Adiciona uma instancia de Nota Fisca referenciada"""
obj = NotaFiscalReferenciada(**kwargs)
self.notas_fiscais_referenciadas.append(obj)
return obj
def adicionar_produto_servico(self, **kwargs):
"""Adiciona uma instancia de Produto"""
obj = NotaFiscalProduto(**kwargs)
self.produtos_e_servicos.append(obj)
self.totais_icms_base_calculo += obj.icms_valor_base_calculo
self.totais_icms_total += obj.icms_valor
self.totais_icms_desonerado += obj.icms_desonerado
self.totais_icms_st_base_calculo += obj.icms_st_valor_base_calculo
self.totais_icms_st_total += obj.icms_st_valor
self.totais_icms_total_produtos_e_servicos += obj.valor_total_bruto
self.totais_icms_total_frete += obj.total_frete
self.totais_icms_total_seguro += obj.total_seguro
self.totais_icms_total_desconto += obj.desconto
self.totais_icms_total_ii += obj.imposto_importacao_valor
self.totais_icms_total_ipi += obj.ipi_valor_ipi
self.totais_icms_total_ipi_dev += obj.ipi_valor_ipi_dev
self.totais_icms_pis += obj.pis_valor
self.totais_icms_cofins += obj.cofins_valor
self.totais_icms_outras_despesas_acessorias += obj.outras_despesas_acessorias
# - Valor Total do FCP (Fundo de Combate à Pobreza)
self.totais_fcp += obj.fcp_valor
self.totais_fcp_destino += obj.fcp_destino_valor
self.totais_fcp_st += obj.fcp_st_valor
self.totais_fcp_st_ret += obj.fcp_st_ret_valor
self.totais_icms_inter_destino += obj.icms_inter_destino_valor
self.totais_icms_inter_remetente += obj.icms_inter_remetente_valor
# - ICMS monofasico para combustiveis
self.totais_icms_q_bc_mono += obj.icms_q_bc_mono
self.totais_icms_v_icms_mono += obj.icms_v_icms_mono
self.totais_icms_q_bc_mono_reten += obj.icms_q_bc_mono_reten
self.totais_icms_v_icms_mono_reten += obj.icms_v_icms_mono_reten
self.totais_icms_q_bc_mono_ret += obj.icms_q_bc_mono_ret
self.totais_icms_v_icms_mono_ret += obj.icms_v_icms_mono_ret
# TODO calcular impostos aproximados
# self.totais_tributos_aproximado += obj.tributos
self.totais_icms_total_nota += (
obj.valor_total_bruto
+ obj.icms_st_valor
+ obj.fcp_st_valor
+ obj.total_frete
+ obj.total_seguro
+ obj.outras_despesas_acessorias
+ obj.imposto_importacao_valor
+ obj.ipi_valor_ipi
+ obj.ipi_valor_ipi_dev
- obj.desconto
- obj.icms_desonerado
)
return obj
def adicionar_transporte_volume(self, **kwargs):
"""Adiciona uma instancia de Volume de Transporte"""
obj = NotaFiscalTransporteVolume(**kwargs)
self.transporte_volumes.append(obj)
return obj
def adicionar_duplicata(self, **kwargs):
"""Adiciona uma instancia de Duplicata"""
obj = NotaFiscalCobrancaDuplicata(**kwargs)
self.duplicatas.append(obj)
return obj
def adicionar_observacao_contribuinte(self, **kwargs):
"""Adiciona uma instancia de Observacao do Contribuinte"""
obj = NotaFiscalObservacaoContribuinte(**kwargs)
self.observacoes_contribuinte.append(obj)
return obj
def adicionar_processo_referenciado(self, **kwargs):
"""Adiciona uma instancia de Processo Referenciado"""
obj = NotaFiscalProcessoReferenciado(**kwargs)
self.processos_referenciados.append(obj)
return obj
def adicionar_responsavel_tecnico(self, **kwargs):
"""Adiciona uma instancia de Responsavel Tecnico"""
obj = NotaFiscalResponsavelTecnico(**kwargs)
self.responsavel_tecnico.append(obj)
return obj
def _codigo_numerico_aleatorio(self):
if not self.codigo_numerico_aleatorio:
self.codigo_numerico_aleatorio = str(random.randint(0, 99999999)).zfill(8)
return self.codigo_numerico_aleatorio
def _dv_codigo_numerico(self, key):
if not len(key) == 43:
raise ValueError(
f"Chave de acesso deve ter 43 caracteres antes de calcular o DV, chave: {key}"
)
weights = [2, 3, 4, 5, 6, 7, 8, 9]
weights_size = len(weights)
key_numbers = [int(k) for k in key]
key_numbers.reverse()
key_sum = 0
for i, key_number in enumerate(key_numbers):
# cycle though weights
i = i % weights_size
key_sum += key_number * weights[i]
remainder = key_sum % 11
if remainder == 0 or remainder == 1:
self.dv_codigo_numerico_aleatorio = "0"
return "0"
self.dv_codigo_numerico_aleatorio = str(11 - remainder)
return str(self.dv_codigo_numerico_aleatorio)
@property
# @memoize
def identificador_unico(self):
# Monta 'Id' da tag raiz <infNFe>
# Ex.: NFe35080599999090910270550010000000011518005123
key = "%(uf)s%(ano)s%(mes)s%(cnpj)s%(mod)s%(serie)s%(nNF)s%(tpEmis)s%(cNF)s" % {
"uf": CODIGOS_ESTADOS[self.uf],
"ano": self.data_emissao.strftime("%y"),
"mes": self.data_emissao.strftime("%m"),
"cnpj": so_numeros(self.emitente.cnpj).zfill(14),
"mod": self.modelo,
"serie": str(self.serie).zfill(3),
"nNF": str(self.numero_nf).zfill(9),
"tpEmis": str(self.forma_emissao),
"cNF": self._codigo_numerico_aleatorio(),
}
return "NFe%(uf)s%(ano)s%(mes)s%(cnpj)s%(mod)s%(serie)s%(nNF)s%(tpEmis)s%(cNF)s%(cDV)s" % {
"uf": CODIGOS_ESTADOS[self.uf],
"ano": self.data_emissao.strftime("%y"),
"mes": self.data_emissao.strftime("%m"),
"cnpj": so_numeros(self.emitente.cnpj).zfill(14),
"mod": self.modelo,
"serie": str(self.serie).zfill(3),
"nNF": str(self.numero_nf).zfill(9),
"tpEmis": str(self.forma_emissao),
"cNF": str(self.codigo_numerico_aleatorio),
"cDV": self._dv_codigo_numerico(key),
}
class NotaFiscalReferenciada(Entidade):
# - Tipo (seleciona de lista) - NF_REFERENCIADA_TIPOS
tipo = str()
# - Nota Fiscal eletronica
# - Chave de Acesso
chave_acesso = str()
# - Nota Fiscal
# - UF
uf = str()
# - Mes e ano de emissao
mes_ano_emissao = str()
# - CNPJ
cnpj = str()
# - IE
ie = str()
# - Serie (XXX)
serie = str()
# - Numero
numero = str()
# - Modelo
modelo = str()
class NotaFiscalProduto(Entidade):
# Campos depreciados
campos_deprecados = [
CampoDeprecated("fcp_percentual", "fcp_aliquota", "Consistencia de nomes"),
CampoDeprecated("fcp_st_percentual", "fcp_st_aliquota", "Consistencia de nomes"),
]
# - Dados
# - Codigo (obrigatorio)
codigo = str()
# - Descricao (obrigatorio)
descricao = str()
# - EAN
ean = str()
# - NCM
ncm = str()
# - EX TIPI
ex_tipi = str()
# - CFOP (obrigatorio)
cfop = str()
# - Genero
genero = str()
# Número de controle da FCI (nFCI) - Ficha de Conteúdo de Importação.
nfci = str()
# - Unidade Comercial (obrigatorio)
unidade_comercial = str()
# - Quantidade Comercial (obrigatorio)
quantidade_comercial = Decimal()
# - Valor Unitario Comercial (obrigatorio)
valor_unitario_comercial = Decimal()
# - Unidade Tributavel (obrigatorio)
unidade_tributavel = str()
# - cBenef
cbenef = str()
# - Quantidade Tributavel (obrigatorio)
quantidade_tributavel = Decimal()
# - Valor Unitario Tributavel (obrigatorio)
valor_unitario_tributavel = Decimal()
# - EAN Tributavel
ean_tributavel = str()
# - Total Frete
total_frete = Decimal()
# - Total Seguro
total_seguro = Decimal()
# - Desconto
desconto = Decimal()
# - Outras despesas acessórias
outras_despesas_acessorias = Decimal()
# - Indica se valor do Item (vProd) entra no valor total da NF-e
compoe_valor_total = 1
# - Valor total bruto (obrigatorio)
valor_total_bruto = Decimal()
# - Número do Pedido de Compra
numero_pedido = str()
# - Item do Pedido de Compra
numero_item = str()
# - Produto especifico (seleciona de lista) - NF_PRODUTOS_ESPECIFICOS
produto_especifico = str()
# Grupo de informações de Combustível
# Código de produto da ANP
cProdANP = str()
# Descrição do produto conforme ANP
descANP = str()
# Percentual de Gás derivado do Petróleo
pGLP = Decimal()
# Percentual de gás natural nacional
pGNn = Decimal()
# Percentual do gás natural importado
pGNi = Decimal()
# Valor de Partida (apenas para GLP)
vPart = Decimal()
# Sigla da UF de consumo – (OBS: Deve ser a Sigla e não o Código da UF)
UFCons = str()
# Código de autorização / registro do CODI
comb_codif = str()
# Quantidade de combustível faturada à temperatura ambiente.
comb_q_temp = str()
# - Grupo de informações dos encerrantes
# Número de identificação do bico utilizado no abastecimento
comb_n_bico = int()
# Número de identificação da bomba ao qual o bico está interligado
comb_n_bomba = int()
# Número de identificação do tanque ao qual o bico está interligado
comb_n_tanque = int()
# Valor do Encerrante no início do abastecimento
comb_v_enc_ini = Decimal()
# Valor do Encerrante no final do abastecimento
comb_v_enc_fin = Decimal()
# Percentual do índice de mistura do Biodiesel (B100) no Óleo Diesel B
comb_p_bio = Decimal()
# - Tributos
# - ICMS
# - Situacao tributaria (obrigatorio - seleciona de lista) - ICMS_TIPOS_TRIBUTACAO
icms_modalidade = str()
# - Origem (obrigatorio - seleciona de lista) - ICMS_ORIGENS
icms_origem = int()
# - ICMS
# - Modalidade de determinacao da BC ICMS (seleciona de lista) - ICMS_MODALIDADES
icms_modalidade_determinacao_bc = int()
# - Percentual reducao da BC ICMS
icms_percentual_reducao_bc = Decimal()
# - Valor da base de calculo ICMS
icms_valor_base_calculo = Decimal()
# - Aliquota ICMS
icms_aliquota = Decimal()
# - Valor do ICMS
icms_valor = Decimal()
# - ICMS Desonerado
icms_desonerado = Decimal()
# - Motivo da desoneração do ICMS (seleciona de lista) - ICMS_MOTIVO_DESONERACAO
icms_motivo_desoneracao = int()
# - ICMS ST
# - Modalidade de determinacao da BC ICMS ST - ICMS_ST_MODALIDADES
icms_st_modalidade_determinacao_bc = int()
# - Percentual da margem de valor Adicionado do ICMS ST
icms_st_percentual_adicional = Decimal()
# - Percentual reducao da BC ICMS ST
icms_st_percentual_reducao_bc = Decimal()
# - Valor da base de calculo ICMS ST
icms_st_valor_base_calculo = Decimal()
# - Aliquota ICMS ST
icms_st_aliquota = Decimal()
# - Valor do ICMS ST
icms_st_valor = Decimal()
# - Fundo de Combate a Pobreza
fcp_base_calculo = Decimal()
fcp_aliquota = Decimal()
fcp_valor = Decimal()
# FCP ST
fcp_st_base_calculo = Decimal()
fcp_st_aliquota = Decimal()
fcp_st_valor = Decimal()
fcp_destino_valor = Decimal()
# FCP ST Retido
fcp_st_ret_base_calculo = Decimal()
fcp_st_ret_aliquota = Decimal()
fcp_st_ret_valor = Decimal()
icms_inter_destino_valor = Decimal()
icms_inter_remetente_valor = Decimal()
# - ICMS ST Retido
# - Valor da base de calculo
icms_st_ret_base_calculo = Decimal()
# - Aliquota
icms_st_ret_aliquota = Decimal()
# - Valor
icms_st_ret_valor = Decimal()
# - ICMS monofásico
icms_ad_rem_icms = Decimal()
icms_v_icms_mono = Decimal()
icms_q_bc_mono = Decimal()
icms_ad_rem_icms_reten = Decimal()
icms_v_icms_mono_reten = Decimal()
icms_q_bc_mono_reten = Decimal()
icms_p_red_ad_rem = Decimal()
icms_mot_red_ad_rem = int()
icms_v_icms_mono_op = Decimal()
icms_v_icms_mono_dif = Decimal()
icms_ad_rem_icms_ret = Decimal()
icms_v_icms_mono_ret = Decimal()
icms_q_bc_mono_ret = Decimal()
icms_p_dif = Decimal()
# - IPI
# - Situacao tributaria (seleciona de lista) - IPI_TIPOS_TRIBUTACAO
ipi_situacao_tributaria = str()
# - Classe de enquadramento
# - A informacao para classe de enquadramento do IPI para Cigarros e Bebidas,
# quando aplicavel, deve ser informada utilizando a codificacao prevista nos
# Atos Normativos editados pela Receita Federal
ipi_classe_enquadramento = str()
# - Codigo do enquadramento
ipi_codigo_enquadramento = str()
# - CNPJ do Produtor
ipi_cnpj_produtor = str()
# - Codigo do selo de controle
# - A informacao do codigo de selo, quando aplicavel, deve ser informada
# utilizando a codificacao prevista nos Atos Normativos editados pela Receita
# Federal
ipi_codigo_selo_controle = str()
# - Quantidade do selo de controle
ipi_quantidade_selo_controle = Decimal()
# - Tipo de calculo (seleciona de lista) - IPI_TIPOS_CALCULO
ipi_tipo_calculo = str()
# - Percentual
# - Valor da base de calculo
ipi_valor_base_calculo = Decimal()
# - Aliquota
ipi_aliquota = Decimal()
# - Em valor
# - Quantidade total unidade padrao
ipi_quantidade_total_unidade_padrao = Decimal()
# - Valor por unidade
ipi_valor_unidade = Decimal()
# - Valor do IPI
ipi_valor_ipi = Decimal()
# - Percentual Devolucao Produto
pdevol = Decimal()
# - Valor do IPI Devolvido
ipi_valor_ipi_dev = Decimal()
# - PIS
# - PIS
# - Situacao tributaria (obrigatorio - seleciona de lista) - PIS_TIPOS_TRIBUTACAO
pis_situacao_tributaria = str()
# - Tipo de calculo (seleciona de lista) - PIS_TIPOS_CALCULO
pis_tipo_calculo = str()
# - Percentual
# - Valor da base de calculo
pis_valor_base_calculo = Decimal()
# - Aliquota (percentual)
pis_aliquota_percentual = Decimal()
# - Em valor
# - Aliquota (em reais)
pis_aliquota_reais = Decimal()
# - Quantidade vendida
pis_quantidade_vendida = Decimal()
# - Valor do PIS
pis_valor = Decimal()
# - PIS ST
# - Tipo de calculo (seleciona de lista) - PIS_TIPOS_CALCULO
pis_st_tipo_calculo = str()
# - Percentual
# - Valor da base de calculo
pis_st_valor_base_calculo = Decimal()
# - Aliquota (percentual)
pis_st_aliquota_percentual = Decimal()
# - Em valor
# - Aliquota (em reais)
pis_st_aliquota_reais = Decimal()
# - Quantidade vendida
pis_st_quantidade_vendida = Decimal()
# - Valor do PIS ST
pis_st_valor = Decimal()
# - COFINS
# - COFINS
# - Situacao tributaria (obrigatorio - seleciona de lista) - COFINS_TIPOS_TRIBUTACAO
cofins_situacao_tributaria = str()
# - Tipo de calculo (seleciona de lista) - COFINS_TIPOS_CALCULO
cofins_tipo_calculo = str()
# - Percentual
# - Valor da base de calculo
cofins_valor_base_calculo = Decimal()
# - Aliquota (percentual)
cofins_aliquota_percentual = Decimal()
# - Em Valor
# - Aliquota (em reais)
cofins_aliquota_reais = Decimal()
# - Quantidade vendida
cofins_quantidade_vendida = Decimal()
# - Valor do COFINS
cofins_valor = Decimal()
# - COFINS ST
# - Tipo de calculo (seleciona de lista) - COFINS_TIPOS_CALCULO
cofins_st_tipo_calculo = str()
# - Percentual
# - Valor da base de calculo
cofins_st_valor_base_calculo = Decimal()
# - Aliquota (percentual)
cofins_st_aliquota_percentual = Decimal()
# - Em Valor
# - Aliquota (em reais)
cofins_st_aliquota_reais = Decimal()
# - Quantidade vendida
cofins_st_quantidade_vendida = Decimal()
# - Valor do COFINS ST
cofins_st_valor = Decimal()
# - ISSQN
# - Valor da base de calculo
issqn_valor_base_calculo = Decimal()
# - Aliquota
issqn_aliquota = Decimal()
# - Lista de servico (seleciona de lista)
# - Aceita somente valores maiores que 100,
# disponiveis no arquivo data/ISSQN/Lista-Servicos.txt
issqn_lista_servico = str()
# - UF
issqn_uf = str()
# - Municipio de ocorrencia
issqn_municipio = str()
# - Valor do ISSQN
issqn_valor = Decimal()
# - Imposto de Importacao
# - Valor base de calculo
imposto_importacao_valor_base_calculo = Decimal()
# - Valor despesas aduaneiras
imposto_importacao_valor_despesas_aduaneiras = Decimal()
# - Valor do IOF
imposto_importacao_valor_iof = Decimal()