diff --git a/README.md b/README.md index ec7dc2f..1ac3664 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,10 @@ Biblioteca para geração dos arquivos do Sistema Público de Escrituração Dig * python * six + * coveralls + * pytest + * cchardet + * xlsxwriter ## Como instalar diff --git a/requeriments.txt b/requeriments.txt index 57c231d..489bb8c 100644 --- a/requeriments.txt +++ b/requeriments.txt @@ -1,3 +1,5 @@ coveralls==0.5 six==1.9.0 pytest==2.6.4 +cchardet==2.1.5 +xlsxwriter=1.2.7 diff --git a/setup.py b/setup.py index 6a89b0e..79a2e69 100644 --- a/setup.py +++ b/setup.py @@ -50,7 +50,7 @@ def run_tests(self): 'Programming Language :: Python :: 3.6', ], keywords='sped fiscal contábil contabilidade receita federal', - install_requires=['six'], + install_requires=['six','cchardet','xlsxwriter'], tests_require=['pytest'], extras_require={ 'dev': ['pylint>=1.9.1'], diff --git a/sped/__init__.py b/sped/__init__.py index 73aff5c..82dbebe 100644 --- a/sped/__init__.py +++ b/sped/__init__.py @@ -7,4 +7,4 @@ from .escrituracao import Escrituracao -__version__ = '1.0.2' +__version__ = '1.0.3' diff --git a/sped/arquivos.py b/sped/arquivos.py index a6a0ea5..982a603 100644 --- a/sped/arquivos.py +++ b/sped/arquivos.py @@ -1,12 +1,11 @@ # -*- coding: utf-8 -*- - +import re from collections import OrderedDict from io import StringIO from .registros import RegistroIndefinido - class ArquivoDigital(object): registros = None blocos = None @@ -18,30 +17,56 @@ def __init__(self): self._registro_abertura = self.registro_abertura() self._registro_encerramento = self.registro_encerramento() self._blocos = OrderedDict() - - def readfile(self, filename): - with open(filename) as spedfile: - for line in [line.rstrip('\r\n') for line in spedfile]: - self.read_registro(line.decode('utf8')) + self.leitura_completa = False + + def readfile(self, filename, codificacao=None, verbose=None): + if codificacao is None: # 'utf-8', 'latin-1', ... + codificacao = 'utf-8' + with open(filename, 'r', encoding=codificacao, errors='ignore') as spedfile: + for line in [line.strip() for line in spedfile]: + # A simple way to remove multiple spaces in a string + line = re.sub(r'\s{2,}', ' ', line) + # Em algumas EFDs foram encontrados registros digitados incorretamente em minúsculo. + # Por exemplo, o registro 'c491' deve ser corrigido para 'C491'. + line = line[:6].upper() + line[6:] # line = '|c491|...' --> '|C491|...' + self.read_registro(line) + # Verificar se o arquivo SPED foi lido até a última linha válida que contém o registro '9999'. + if self.leitura_completa: + break + if not self.leitura_completa: + raise RuntimeError(u"\nOcorreu uma falha ao ler o arquivo: '%s'.\n" % filename) + elif verbose: + print(u"O arquivo SPED '%s' foi lido com sucesso.\n" % filename) def read_registro(self, line): reg_id = line.split('|')[1] - + try: - registro_class = getattr(self.__class__.registros, - 'Registro' + reg_id) + # https://stackoverflow.com/questions/25577578/access-class-variable-from-instance + # Devo substituir 'self.__class__.registros' por 'type(self).registros' ? + registro_class = getattr(self.__class__.registros, 'Registro' + reg_id) except AttributeError: - raise RuntimeError(u"Arquivo inválido para EFD - PIS/COFINS") + raise RuntimeError(u"Arquivo inválido para EFD - PIS/COFINS. Registro: %s" % reg_id) registro = registro_class(line) + bloco_id = reg_id[0] + bloco = self._blocos[bloco_id] if registro.__class__ == self.__class__.registro_abertura: + # Atualizar o registro de abertura 0000 do SPED self._registro_abertura = registro elif registro.__class__ == self.__class__.registro_encerramento: + # Atualizar o registro de encerramento 9999 do SPED self._registro_encerramento = registro + self.leitura_completa = True + elif registro.__class__ == bloco.registro_abertura.__class__: + # Atualizar os registros de abertura dos blocos: 0001, A001, C001, ... + bloco.registro_abertura = registro + elif registro.__class__ == bloco.registro_encerramento.__class__: + # Atualizar os registros de encerramento dos blocos: 0990, A990, C990, ... + bloco.registro_encerramento = registro else: - bloco_id = reg_id[0] - bloco = self._blocos[bloco_id] + # Adicionar informações dos registros a cada linha obtida de filename bloco.add(registro) def write_to(self, buff): diff --git a/sped/blocos.py b/sped/blocos.py index 8f2d497..8da85c3 100644 --- a/sped/blocos.py +++ b/sped/blocos.py @@ -2,7 +2,6 @@ from .registros import Registro - class Bloco(object): def __init__(self, nome=''): self._nome = nome @@ -14,12 +13,10 @@ def __repr__(self): @property def abertura(self): - # Define o indicador de movimento ou dados return self.registro_abertura @property def encerramento(self): - # Define a quantidade de registros return self.registro_encerramento @property @@ -27,7 +24,4 @@ def registros(self): return [self.abertura] + self._registros + [self.encerramento] def add(self, registro): - # Não adiciona o registro de abertura e fechamento - if not registro.__class__ == self.registro_abertura.__class__ and \ - not registro.__class__ == self.registro_encerramento.__class__: - self._registros.append(registro) + self._registros.append(registro) diff --git a/sped/campos.py b/sped/campos.py index 9c9f575..1a2cd76 100644 --- a/sped/campos.py +++ b/sped/campos.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- - import re from datetime import date @@ -188,6 +187,8 @@ def get(self, registro): return datetime.strptime(valor, '%d%m%Y').date() def set(self, registro, valor): + # https://stackoverflow.com/questions/19887353/attributeerror-str-object-has-no-attribute-strftime + valor = datetime.strptime(valor, '%d%m%Y') if isinstance(valor, date): super().set(registro, valor.strftime('%d%m%Y')) elif not valor: @@ -195,6 +196,14 @@ def set(self, registro, valor): else: raise FormatoInvalidoError(registro, self.nome) + @staticmethod + def formatar(data_in): + dt = datetime.strptime(data_in, "%d%m%Y") # ddmmaaaa + #data_out = dt.isoformat('T') + #data_out = dt.strftime('%x %X') # excel date format + data_out = dt.strftime("%d/%m/%Y") + return data_out + class CampoRegex(Campo): def __init__(self, indice, nome, obrigatorio=False, regex=None): @@ -239,6 +248,16 @@ def validar(valor): return True + @staticmethod + def formatar(cnpj): + mensagem_de_validacao = '' + if len(cnpj) >= 1: + if not CampoCNPJ.validar(cnpj): + mensagem_de_validacao = ' : dígito verificador do cnpj inválido!' + if len(cnpj) == 14: + cnpj = "%s.%s.%s/%s-%s" % (cnpj[0:2],cnpj[2:5],cnpj[5:8],cnpj[8:12],cnpj[12:14]) + return cnpj + mensagem_de_validacao + class CampoCPF(Campo): @staticmethod @@ -265,6 +284,16 @@ def validar(valor): return False return True + + @staticmethod + def formatar(cpf): + mensagem_de_validacao = '' + if len(cpf) >= 1: + if not CampoCPF.validar(cpf): + mensagem_de_validacao = ' : dígito verificador do cpf inválido!' + if len(cpf) == 11: + cpf = "%s.%s.%s-%s" % (cpf[0:3],cpf[3:6],cpf[6:9],cpf[9:11]) + return cpf + mensagem_de_validacao class CampoCPFouCNPJ(Campo): @@ -275,3 +304,65 @@ def validar(valor): if len(valor) == 11: return CampoCPF.validar(valor) return False + + @staticmethod + def formatar(digt): + mensagem_de_validacao = '' + if len(digt) >= 1: + if len(digt) == 11 and not CampoCPF.validar(digt): + mensagem_de_validacao = ' : dígito verificador do cpf inválido!' + elif len(digt) == 14 and not CampoCNPJ.validar(digt): + mensagem_de_validacao = ' : dígito verificador do cnpj inválido!' + + if len(digt) == 11: + digt = "CPF %s.%s.%s-%s" % (digt[0:3],digt[3:6],digt[6:9],digt[9:11]) + elif len(digt) == 14: + digt = "CNPJ %s.%s.%s/%s-%s" % (digt[0:2],digt[2:5],digt[5:8],digt[8:12],digt[12:14]) + return digt + mensagem_de_validacao + + +# Fonte: 'NFe Manual_de_Orientacao_Contribuinte_v_6.00.pdf', pg 144. +# 5.4 Cálculo do Dígito Verificador da Chave de Acesso da NF-e +class CampoChaveEletronica(Campo): + @staticmethod + def validar(valor): + if not re.search(r'^\d{44}$', str(valor)): + return False + + chave = [int(digito) for digito in valor] + multiplicadores = [4, 3, 2] + [9, 8, 7, 6, 5, 4, 3, 2] * 5 + [0] + + soma = sum([chave[i] * multiplicadores[i] for i in range(44)]) + + resto_da_divisao = soma % 11 + digito_verificador = 11 - resto_da_divisao + + if digito_verificador >= 10: + digito_verificador = 0 + + if chave[-1] != digito_verificador: + return False + + # dentro da chave eletrônica há o CNPJ do emitente + # que também será verificado + cnpj = str(valor)[6:20] + + return CampoCNPJ.validar(cnpj) + + @staticmethod + def formatar(chave): + mensagem_de_validacao = '' + if len(chave) >= 1: + if not CampoChaveEletronica.validar(chave): + mensagem_de_validacao = ' : dígito verificador da chave inválido!' + if len(chave) == 44: + chave = "%s.%s.%s.%s.%s.%s.%s.%s-%s" % (chave[0:2],chave[2:6],chave[6:20],chave[20:22],chave[22:25],chave[25:34],chave[34:35],chave[35:43],chave[43:44]) + return chave + mensagem_de_validacao + + +class CampoNCM(Campo): + @staticmethod + def formatar(ncm): + if len(ncm) == 8: + ncm = "%s.%s.%s" % (ncm[0:4],ncm[4:6],ncm[6:8]) + return ncm \ No newline at end of file diff --git a/sped/efd/icms_ipi/registros.py b/sped/efd/icms_ipi/registros.py index 78d3032..0779484 100644 --- a/sped/efd/icms_ipi/registros.py +++ b/sped/efd/icms_ipi/registros.py @@ -5,7 +5,12 @@ from ...campos import CampoData from ...campos import CampoFixo from ...campos import CampoNumerico - +from ...campos import CampoAlfanumerico +from ...campos import CampoRegex +from ...campos import CampoCNPJ +from ...campos import CampoCPF +from ...campos import CampoCPFouCNPJ +from ...campos import CampoChaveEletronica class Registro0000(Registro): """ @@ -18,8 +23,8 @@ class Registro0000(Registro): CampoData(4, 'DT_INI'), CampoData(5, 'DT_FIN'), Campo(6, 'NOME'), - Campo(7, 'CNPJ'), - Campo(8, 'CPF'), + CampoCNPJ(7, 'CNPJ'), + CampoCPF(8, 'CPF'), Campo(9, 'UF'), Campo(10, 'IE'), Campo(11, 'COD_MUN'), @@ -29,6 +34,7 @@ class Registro0000(Registro): Campo(15, 'IND_ATIV'), ] + nivel = 0 class Registro0001(Registro): """ @@ -39,6 +45,7 @@ class Registro0001(Registro): Campo(2, 'IND_MOV'), ] + nivel = 1 class Registro0005(Registro): """ @@ -57,6 +64,7 @@ class Registro0005(Registro): Campo(10, 'EMAIL'), ] + nivel = 2 class Registro0015(Registro): """ @@ -68,6 +76,7 @@ class Registro0015(Registro): Campo(3, 'IE_ST'), ] + nivel = 2 class Registro0100(Registro): """ @@ -76,9 +85,9 @@ class Registro0100(Registro): campos = [ CampoFixo(1, 'REG', '0100'), Campo(2, 'NOME'), - Campo(3, 'CPF'), + CampoCPF(3, 'CPF'), Campo(4, 'CRC'), - Campo(5, 'CNPJ'), + CampoCNPJ(5, 'CNPJ'), Campo(6, 'CEP'), Campo(7, 'END'), Campo(8, 'NUM'), @@ -90,6 +99,7 @@ class Registro0100(Registro): Campo(14, 'COD_MUN'), ] + nivel = 2 class Registro0150(Registro): """ @@ -100,8 +110,8 @@ class Registro0150(Registro): Campo(2, 'COD_PART'), Campo(3, 'NOME'), Campo(4, 'COD_PAIS'), - Campo(5, 'CNPJ'), - Campo(6, 'CPF'), + CampoCNPJ(5, 'CNPJ'), + CampoCPF(6, 'CPF'), Campo(7, 'IE'), Campo(8, 'COD_MUN'), Campo(9, 'SUFRAMA'), @@ -111,6 +121,7 @@ class Registro0150(Registro): Campo(13, 'BAIRRO'), ] + nivel = 2 class Registro0175(Registro): """ @@ -118,11 +129,12 @@ class Registro0175(Registro): """ campos = [ CampoFixo(1, 'REG', '0175'), - Campo(2, 'DT_ALT'), + CampoData(2, 'DT_ALT'), Campo(3, 'NR_CAMPO'), Campo(4, 'CONT_ANT'), ] + nivel = 3 class Registro0190(Registro): """ @@ -134,6 +146,7 @@ class Registro0190(Registro): Campo(3, 'DESCR'), ] + nivel = 2 class Registro0200(Registro): """ @@ -155,6 +168,7 @@ class Registro0200(Registro): Campo(13, 'CEST'), ] + nivel = 2 class Registro0205(Registro): """ @@ -168,6 +182,7 @@ class Registro0205(Registro): Campo(5, 'COD_ANT_ITEM'), ] + nivel = 3 class Registro0206(Registro): """ @@ -178,6 +193,7 @@ class Registro0206(Registro): Campo(2, 'COD_COMB'), ] + nivel = 3 class Registro0210(Registro): """ @@ -190,6 +206,7 @@ class Registro0210(Registro): CampoNumerico(4, 'PERDA'), ] + nivel = 3 class Registro0220(Registro): """ @@ -201,6 +218,7 @@ class Registro0220(Registro): Campo(3, 'FAT_CONV'), ] + nivel = 3 class Registro0300(Registro): """ @@ -216,6 +234,7 @@ class Registro0300(Registro): Campo(7, 'NR_PARC'), ] + nivel = 2 class Registro0305(Registro): """ @@ -228,6 +247,7 @@ class Registro0305(Registro): Campo(4, 'VIDA_UTIL'), ] + nivel = 3 class Registro0400(Registro): """ @@ -239,6 +259,7 @@ class Registro0400(Registro): Campo(3, 'DESCR_NAT'), ] + nivel = 2 class Registro0450(Registro): """ @@ -250,6 +271,7 @@ class Registro0450(Registro): Campo(3, 'TXT'), ] + nivel = 2 class Registro0460(Registro): """ @@ -261,6 +283,7 @@ class Registro0460(Registro): Campo(3, 'TXT'), ] + nivel = 2 class Registro0500(Registro): """ @@ -268,7 +291,7 @@ class Registro0500(Registro): """ campos = [ CampoFixo(1, 'REG', '0500'), - Campo(2, 'DT_ALT'), + CampoData(2, 'DT_ALT'), Campo(3, 'COD_NAT_CC'), Campo(4, 'IND_CTA'), Campo(5, 'NÍVEL'), @@ -276,6 +299,7 @@ class Registro0500(Registro): Campo(7, 'NOME_CTA'), ] + nivel = 2 class Registro0600(Registro): """ @@ -283,11 +307,12 @@ class Registro0600(Registro): """ campos = [ CampoFixo(1, 'REG', '0600'), - Campo(2, 'DT_ALT'), + CampoData(2, 'DT_ALT'), Campo(3, 'COD_CCUS'), Campo(4, 'CCUS'), ] + nivel = 2 class Registro0990(Registro): """ @@ -298,6 +323,7 @@ class Registro0990(Registro): CampoNumerico(2, 'QTD_LIN_0'), ] + nivel = 1 class RegistroB001(Registro): """ @@ -305,9 +331,219 @@ class RegistroB001(Registro): """ campos = [ CampoFixo(1, 'REG', 'B001'), - Campo(2, 'IND_MOV', '1'), + Campo(2, 'IND_MOV'), + ] + + nivel = 1 + +class RegistroB020(Registro): + """ + NOTA FISCAL (CÓDIGO 01), NOTA FISCAL DE SERVIÇOS (CÓDIGO 03), + NOTA FISCAL DE SERVIÇOS AVULSA (CÓDIGO 3B), NOTA FISCAL DE PRODUTOR + (CÓDIGO 04), CONHECIMENTO DE TRANSPORTE RODOVIÁRIO DE CARGAS + (CÓDIGO 08), NF-e (CÓDIGO 55) e NFC-e (CÓDIGO 65). + """ + campos = [ + CampoFixo(1, 'REG', 'B020'), + Campo(2, 'IND_OPER'), + Campo(3, 'IND_EMIT'), + Campo(4, 'COD_PART'), + Campo(5, 'COD_MOD'), + Campo(6, 'COD_SIT'), + Campo(7, 'SER'), + Campo(8, 'NUM_DOC'), + CampoChaveEletronica(9, 'CHV_NFE'), + CampoData(10, 'DT_DOC'), + Campo(11, 'COD_MUN_SERV'), + CampoNumerico(12, 'VL_CONT'), + CampoNumerico(13, 'VL_MAT_TERC'), + CampoNumerico(14, 'VL_SUB'), + CampoNumerico(15, 'VL_ISNT_ISS'), + CampoNumerico(16, 'VL_DED_BC'), + CampoNumerico(17, 'VL_BC_ISS'), + CampoNumerico(18, 'VL_BC_ISS_RT'), + CampoNumerico(19, 'VL_ISS_RT'), + CampoNumerico(20, 'VL_ISS'), + Campo(21, 'COD_INF_OBS'), + ] + + nivel = 2 + +class RegistroB025(Registro): + """ + DETALHAMENTO POR COMBINAÇÃO DE ALÍQUOTA E ITEM DA + LISTA DE SERVIÇOS DA LC 116/2003) + """ + campos = [ + CampoFixo(1, 'REG', 'B025'), + CampoNumerico(2, 'VL_CONT_P'), + CampoNumerico(3, 'VL_BC_ISS_P'), + CampoNumerico(4, 'ALIQ_ISS'), + CampoNumerico(5, 'VL_ISS_P'), + CampoNumerico(6, 'VL_ISNT_ISS_P'), + Campo(7, 'COD_SERV'), + ] + + nivel = 3 + +class RegistroB030(Registro): + """ + NOTA FISCAL DE SERVIÇOS SIMPLIFICADA (CÓDIGO 3A) + """ + campos = [ + CampoFixo(1, 'REG', 'B030'), + Campo(2, 'COD_MOD'), + Campo(3, 'SER'), + CampoNumerico(4, 'NUM_DOC_INI'), + CampoNumerico(5, 'NUM_DOC_FIN'), + CampoData(6, 'DT_DOC'), + CampoNumerico(7, 'QTD_CANC'), + CampoNumerico(8, 'VL_CONT'), + CampoNumerico(9, 'VL_ISNT_ISS'), + CampoNumerico(10, 'VL_BC_ISS'), + CampoNumerico(11, 'VL_ISS'), + Campo(12, 'COD_INF_OBS'), + ] + + nivel = 2 + +class RegistroB035(Registro): + """ + DETALHAMENTO POR COMBINAÇÃO DE ALÍQUOTA E ITEM DA + LISTA DE SERVIÇOS DA LC 116/2003) + """ + campos = [ + CampoFixo(1, 'REG', 'B035'), + CampoNumerico(2, 'VL_CONT_P'), + CampoNumerico(3, 'VL_BC_ISS_P'), + Campo(4, 'ALIQ_ISS'), + CampoNumerico(5, 'VL_ISS_P'), + CampoNumerico(6, 'VL_ISNT_ISS_P'), + Campo(7, 'COD_SERV'), + ] + + nivel = 1 + +class RegistroB350(Registro): + """ + SERVIÇOS PRESTADOS POR INSTITUIÇÕES FINANCEIRAS + """ + campos = [ + CampoFixo(1, 'REG', 'B350'), + Campo(2, 'COD_CTD'), + Campo(3, 'CTA_ISS'), + Campo(4, 'CTA_COSIF'), + Campo(5, 'QTD_OCOR'), + Campo(6, 'COD_SERV'), + CampoNumerico(7, 'VL_CONT'), + CampoNumerico(8, 'VL_BC_ISS'), + Campo(9, 'ALIQ_ISS'), + CampoNumerico(10, 'VL_ISS'), + Campo(11, 'COD_INF_OBS'), + ] + + nivel = 2 + +class RegistroB420(Registro): + """ + TOTALIZAÇÃO DOS VALORES DE SERVIÇOS PRESTADOS POR + COMBINAÇÃO DE ALÍQUOTA E ITEM DA LISTA DE SERVIÇOS DA LC 116/200 + """ + campos = [ + CampoFixo(1, 'REG', 'B420'), + CampoNumerico(2, 'VL_CONT'), + CampoNumerico(3, 'VL_BC_ISS'), + Campo(4, 'ALIQ_ISS'), + CampoNumerico(5, 'VL_ISNT_ISS'), + CampoNumerico(6, 'VL_ISS'), + Campo(7, 'COD_SERV'), + ] + + nivel = 2 + +class RegistroB440(Registro): + """ + TOTALIZAÇÃO DOS VALORES RETIDOS + """ + campos = [ + CampoFixo(1, 'REG', 'B440'), + CampoNumerico(2, 'IND_OPER'), + Campo(3, 'COD_PART'), + CampoNumerico(4, 'VL_CONT_RT'), + CampoNumerico(5, 'VL_BC_ISS_RT'), + CampoNumerico(6, 'VL_ISS_RT') + ] + + nivel = 2 + +class RegistroB460(Registro): + """ + DEDUÇÕES DO ISS + """ + campos = [ + CampoFixo(1, 'REG', 'B460'), + Campo(2, 'IND_DED'), + CampoNumerico(3, 'VL_DED'), + Campo(4, 'NUM_PROC'), + Campo(5, 'IND_PROC'), + Campo(6, 'PROC'), + Campo(7, 'COD_INF_OBS'), + Campo(8, 'IND_OBR'), + ] + + nivel = 2 + +class RegistroB470(Registro): + """ + APURAÇÃO DO ISS + """ + campos = [ + CampoFixo(1, 'REG', 'B470'), + CampoNumerico(2, 'VL_CONT'), + CampoNumerico(3, 'VL_MAT_TERC'), + CampoNumerico(4, 'VL_MAT_PROP'), + CampoNumerico(5, 'VL_SUB'), + CampoNumerico(6, 'VL_ISNT'), + CampoNumerico(7, 'VL_DED_BC'), + CampoNumerico(8, 'VL_BC_ISS'), + CampoNumerico(9, 'VL_BC_ISS_RT'), + CampoNumerico(10, 'VL_ISS'), + CampoNumerico(11, 'VL_ISS_RT'), + CampoNumerico(12, 'VL_DED'), + CampoNumerico(13, 'VL_ISS_REC'), + CampoNumerico(14, 'VL_ISS_ST'), + CampoNumerico(15, 'VL_ISS_REC_UNI'), + ] + + nivel = 2 + +class RegistroB500(Registro): + """ + APURAÇÃO DO ISS SOCIEDADE UNIPROFISSIONA + """ + campos = [ + CampoFixo(1, 'REG', 'B500'), + CampoNumerico(2, 'VL_REC'), + CampoNumerico(3, 'QTD_PROF'), + CampoNumerico(4, 'VL_OR'), ] + nivel = 2 + +class RegistroB510(Registro): + """ + UNIPROFISSIONAL - EMPREGADOS E SÓCIOS + """ + campos = [ + CampoFixo(1, 'REG', 'B510'), + Campo(2, 'IND_PROF'), + Campo(3, 'IND_ESC'), + Campo(4, 'IND_SOC'), + CampoCPF(5, 'CPF'), + Campo(6, 'NOME'), + ] + + nivel = 3 class RegistroB990(Registro): """ @@ -315,9 +551,10 @@ class RegistroB990(Registro): """ campos = [ CampoFixo(1, 'REG', 'B990'), - CampoNumerico(2, 'QTD_LIN_B', 2), + CampoNumerico(2, 'QTD_LIN_B'), ] + nivel = 1 class RegistroC001(Registro): """ @@ -328,6 +565,7 @@ class RegistroC001(Registro): Campo(2, 'IND_MOV'), ] + nivel = 1 class RegistroC100(Registro): """ @@ -342,7 +580,7 @@ class RegistroC100(Registro): Campo(6, 'COD_SIT'), Campo(7, 'SER'), Campo(8, 'NUM_DOC'), - Campo(9, 'CHV_NFE'), + CampoChaveEletronica(9, 'CHV_NFE'), CampoData(10, 'DT_DOC'), CampoData(11, 'DT_E_S'), CampoNumerico(12, 'VL_DOC'), @@ -365,6 +603,7 @@ class RegistroC100(Registro): CampoNumerico(29, 'VL_COFINS_ST'), ] + nivel = 2 class RegistroC101(Registro): """ @@ -374,11 +613,12 @@ class RegistroC101(Registro): """ campos = [ CampoFixo(1, 'REG', 'C101'), - Campo(2, 'VL_FCP_UF_DEST'), - Campo(3, 'VL_ICMS_UF_DEST'), - Campo(4, 'VL_ICMS_UF_REM'), + CampoNumerico(2, 'VL_FCP_UF_DEST'), + CampoNumerico(3, 'VL_ICMS_UF_DEST'), + CampoNumerico(4, 'VL_ICMS_UF_REM'), ] + nivel = 3 class RegistroC105(Registro): """ @@ -390,6 +630,7 @@ class RegistroC105(Registro): Campo(3, 'UF'), ] + nivel = 3 class RegistroC110(Registro): """ @@ -401,6 +642,7 @@ class RegistroC110(Registro): Campo(3, 'TXT_COMPL'), ] + nivel = 3 class RegistroC111(Registro): """ @@ -412,6 +654,7 @@ class RegistroC111(Registro): Campo(3, 'IND_PROC'), ] + nivel = 4 class RegistroC112(Registro): """ @@ -423,11 +666,12 @@ class RegistroC112(Registro): Campo(3, 'UF'), Campo(4, 'NUM_DA'), Campo(5, 'COD_AUT'), - Campo(6, 'VL_DA'), - Campo(7, 'DT_VCTO'), - Campo(8, 'DT_PGTO'), + CampoNumerico(6, 'VL_DA'), + CampoData(7, 'DT_VCTO'), + CampoData(8, 'DT_PGTO'), ] + nivel = 4 class RegistroC113(Registro): """ @@ -442,9 +686,10 @@ class RegistroC113(Registro): Campo(6, 'SER'), Campo(7, 'SUB'), Campo(8, 'NUM_DOC'), - Campo(9, 'DT_DOC'), + CampoData(9, 'DT_DOC'), ] + nivel = 4 class RegistroC114(Registro): """ @@ -456,9 +701,10 @@ class RegistroC114(Registro): Campo(3, 'ECF_FAB'), Campo(4, 'ECF_CX'), Campo(5, 'NUM_DOC'), - Campo(6, 'DT_DOC'), + CampoData(6, 'DT_DOC'), ] + nivel = 4 class RegistroC115(Registro): """ @@ -467,16 +713,17 @@ class RegistroC115(Registro): campos = [ CampoFixo(1, 'REG', 'C115'), Campo(2, 'IND_CARGA'), - Campo(3, 'CNPJ_COL'), + CampoCNPJ(3, 'CNPJ_COL'), Campo(4, 'IE_COL'), - Campo(5, 'CPF_COL'), + CampoCPF(5, 'CPF_COL'), Campo(6, 'COD_MUN_COL'), - Campo(7, 'CNPJ_ENTG'), + CampoCNPJ(7, 'CNPJ_ENTG'), Campo(8, 'IE_ENTG'), - Campo(9, 'CPF_ENTG'), + CampoCPF(9, 'CPF_ENTG'), Campo(10, 'COD_MUN_ENTG'), ] + nivel = 4 class RegistroC116(Registro): """ @@ -486,11 +733,12 @@ class RegistroC116(Registro): CampoFixo(1, 'REG', 'C116'), Campo(2, 'COD_MOD'), Campo(3, 'NR_SAT'), - Campo(4, 'CHV_CFE'), + CampoChaveEletronica(4, 'CHV_CFE'), Campo(5, 'NUM_CFE'), - Campo(6, 'DT_DOC'), + CampoData(6, 'DT_DOC'), ] + nivel = 4 class RegistroC120(Registro): """ @@ -505,6 +753,7 @@ class RegistroC120(Registro): Campo(6, 'NUM_ACDRAW'), ] + nivel = 3 class RegistroC130(Registro): """ @@ -512,15 +761,16 @@ class RegistroC130(Registro): """ campos = [ CampoFixo(1, 'REG', 'C130'), - Campo(2, 'VL_SERV_NT'), - Campo(3, 'VL_BC_ISSQN'), - Campo(4, 'VL_ISSQN'), - Campo(5, 'VL_BC_IRRF'), - Campo(6, 'VL_ IRRF'), - Campo(7, 'VL_BC_PREV'), - Campo(8, 'VL_ PREV'), + CampoNumerico(2, 'VL_SERV_NT'), + CampoNumerico(3, 'VL_BC_ISSQN'), + CampoNumerico(4, 'VL_ISSQN'), + CampoNumerico(5, 'VL_BC_IRRF'), + CampoNumerico(6, 'VL_ IRRF'), + CampoNumerico(7, 'VL_BC_PREV'), + CampoNumerico(8, 'VL_ PREV'), ] + nivel = 3 class RegistroC140(Registro): """ @@ -533,9 +783,10 @@ class RegistroC140(Registro): Campo(4, 'DESC_TIT'), Campo(5, 'NUM_TIT'), Campo(6, 'QTD_PARC'), - Campo(7, 'VL_TIT'), + CampoNumerico(7, 'VL_TIT'), ] + nivel = 3 class RegistroC141(Registro): """ @@ -544,10 +795,11 @@ class RegistroC141(Registro): campos = [ CampoFixo(1, 'REG', 'C141'), Campo(2, 'NUM_PARC'), - Campo(3, 'DT_VCTO'), - Campo(4, 'VL_PARC'), + CampoData(3, 'DT_VCTO'), + CampoNumerico(4, 'VL_PARC'), ] + nivel = 4 class RegistroC160(Registro): """ @@ -563,6 +815,7 @@ class RegistroC160(Registro): Campo(7, 'UF_ID'), ] + nivel = 3 class RegistroC165(Registro): """ @@ -580,27 +833,28 @@ class RegistroC165(Registro): Campo(9, 'PESO_BRT'), Campo(10, 'PESO_LIQ'), Campo(11, 'NOM_MOT'), - Campo(12, 'CPF'), + CampoCPF(12, 'CPF'), Campo(13, 'UF_ID'), ] + nivel = 3 class RegistroC170(Registro): """ - ITENS DO DOCUMENTO + ITENS DO DOCUMENTO (CÓDIGO 01, 1B, 04 e 55) """ campos = [ CampoFixo(1, 'REG', 'C170'), - CampoNumerico(2, 'NUM_ITEM'), - Campo(3, 'COD_ITEM'), + CampoNumerico(2, 'NUM_ITEM', obrigatorio=True), + Campo(3, 'COD_ITEM', obrigatorio=True), Campo(4, 'DESCR_COMPL'), CampoNumerico(5, 'QTD'), Campo(6, 'UNID'), - CampoNumerico(7, 'VL_ITEM'), + CampoNumerico(7, 'VL_ITEM', obrigatorio=True), CampoNumerico(8, 'VL_DESC'), Campo(9, 'IND_MOV'), - Campo(10, 'CST_ICMS'), - Campo(11, 'CFOP'), + CampoNumerico(10, 'CST_ICMS'), + CampoNumerico(11, 'CFOP', obrigatorio=True), Campo(12, 'COD_NAT'), CampoNumerico(13, 'VL_BC_ICMS'), CampoNumerico(14, 'ALIQ_ICMS'), @@ -614,22 +868,23 @@ class RegistroC170(Registro): CampoNumerico(22, 'VL_BC_IPI'), CampoNumerico(23, 'ALIQ_IPI'), CampoNumerico(24, 'VL_IPI'), - Campo(25, 'CST_PIS'), + CampoNumerico(25, 'CST_PIS', obrigatorio=True), CampoNumerico(26, 'VL_BC_PIS'), CampoNumerico(27, 'ALIQ_PIS'), CampoNumerico(28, 'QUANT_BC_PIS'), - CampoNumerico(29, 'ALIQ_PIS'), + CampoNumerico(29, 'ALIQ_PIS_QUANT'), CampoNumerico(30, 'VL_PIS'), - Campo(31, 'CST_COFINS'), + CampoNumerico(31, 'CST_COFINS', obrigatorio=True), CampoNumerico(32, 'VL_BC_COFINS'), CampoNumerico(33, 'ALIQ_COFINS'), CampoNumerico(34, 'QUANT_BC_COFINS'), - CampoNumerico(35, 'ALIQ_COFINS'), + CampoNumerico(35, 'ALIQ_COFINS_QUANT'), CampoNumerico(36, 'VL_COFINS'), Campo(37, 'COD_CTA'), CampoNumerico(38, 'VL_ABAT_NT'), ] + nivel = 3 class RegistroC171(Registro): """ @@ -641,6 +896,7 @@ class RegistroC171(Registro): Campo(3, 'QTDE'), ] + nivel = 4 class RegistroC172(Registro): """ @@ -648,11 +904,12 @@ class RegistroC172(Registro): """ campos = [ CampoFixo(1, 'REG', 'C172'), - Campo(2, 'VL_BC_ISSQN'), + CampoNumerico(2, 'VL_BC_ISSQN'), Campo(3, 'ALIQ_ISSQN'), - Campo(4, 'VL_ISSQN'), + CampoNumerico(4, 'VL_ISSQN'), ] + nivel = 4 class RegistroC173(Registro): """ @@ -662,13 +919,14 @@ class RegistroC173(Registro): CampoFixo(1, 'REG', 'C173'), Campo(2, 'LOTE_MED'), Campo(3, 'QTD_ITEM'), - Campo(4, 'DT_FAB'), - Campo(5, 'DT_VAL'), + CampoData(4, 'DT_FAB'), + CampoData(5, 'DT_VAL'), Campo(6, 'IND_MED'), Campo(7, 'TP_PROD'), - Campo(8, 'VL_TAB_MAX'), + CampoNumerico(8, 'VL_TAB_MAX'), ] + nivel = 4 class RegistroC174(Registro): """ @@ -681,6 +939,7 @@ class RegistroC174(Registro): Campo(4, 'DESCR_COMPL'), ] + nivel = 4 class RegistroC175(Registro): """ @@ -689,11 +948,12 @@ class RegistroC175(Registro): campos = [ CampoFixo(1, 'REG', 'C175'), Campo(2, 'IND_VEIC_OPER'), - Campo(3, 'CNPJ'), + CampoCNPJ(3, 'CNPJ'), Campo(4, 'UF'), Campo(5, 'CHASSI_VEIC'), ] + nivel = 4 class RegistroC176(Registro): """ @@ -704,13 +964,14 @@ class RegistroC176(Registro): Campo(2, 'COD_MOD_ULT_E'), Campo(3, 'NUM_DOC_ULT_E'), Campo(4, 'SER_ULT_E'), - Campo(5, 'DT_ULT_E'), + CampoData(5, 'DT_ULT_E'), Campo(6, 'COD_PART_ULT_E'), Campo(7, 'QUANT_ULT_E'), - Campo(8, 'VL_UNIT_ULT_E'), - Campo(9, 'VL_UNIT_BC_ST'), + CampoNumerico(8, 'VL_UNIT_ULT_E'), + CampoNumerico(9, 'VL_UNIT_BC_ST'), ] + nivel = 4 class RegistroC177(Registro): """ @@ -721,7 +982,8 @@ class RegistroC177(Registro): Campo(2, 'COD_SELO_IPI'), Campo(3, 'QT_SELO_IPI'), ] - + + nivel = 4 class RegistroC178(Registro): """ @@ -730,10 +992,11 @@ class RegistroC178(Registro): campos = [ CampoFixo(1, 'REG', 'C178'), Campo(2, 'CL_ENQ'), - Campo(3, 'VL_UNID'), + CampoNumerico(3, 'VL_UNID'), Campo(4, 'QUANT_PAD'), ] + nivel = 4 class RegistroC179(Registro): """ @@ -748,6 +1011,7 @@ class RegistroC179(Registro): Campo(6, 'ICMS_RET'), ] + nivel = 4 class RegistroC190(Registro): """ @@ -758,16 +1022,30 @@ class RegistroC190(Registro): Campo(2, 'CST_ICMS'), Campo(3, 'CFOP'), Campo(4, 'ALIQ_ICMS'), - Campo(5, 'VL_OPR'), - Campo(6, 'VL_BC_ICMS'), - Campo(7, 'VL_ICMS'), - Campo(8, 'VL_BC_ICMS_ST'), - Campo(9, 'VL_ICMS_ST'), - Campo(10, 'VL_RED_BC'), - Campo(11, 'VL_IPI'), + CampoNumerico(5, 'VL_OPR'), + CampoNumerico(6, 'VL_BC_ICMS'), + CampoNumerico(7, 'VL_ICMS'), + CampoNumerico(8, 'VL_BC_ICMS_ST'), + CampoNumerico(9, 'VL_ICMS_ST'), + CampoNumerico(10, 'VL_RED_BC'), + CampoNumerico(11, 'VL_IPI'), Campo(12, 'COD_OBS'), ] + nivel = 3 + +class RegistroC191(Registro): + """ + DOCUMENTO + """ + campos = [ + CampoFixo(1, 'REG', 'C191'), + CampoNumerico(2, 'VL_FCP_OP'), + CampoNumerico(3, 'VL_FCP_ST'), + CampoNumerico(4, 'VL_FCP_RET'), + ] + + nivel = 4 class RegistroC195(Registro): """ @@ -779,6 +1057,7 @@ class RegistroC195(Registro): Campo(3, 'TXT_COMPL'), ] + nivel = 3 class RegistroC197(Registro): """ @@ -789,12 +1068,13 @@ class RegistroC197(Registro): Campo(2, 'COD_AJ'), Campo(3, 'DESCR_COMPL_AJ'), Campo(4, 'COD_ITEM'), - Campo(5, 'VL_BC_ICMS'), + CampoNumerico(5, 'VL_BC_ICMS'), Campo(6, 'ALIQ_ICMS'), - Campo(7, 'VL_ICMS'), - Campo(8, 'VL_OUTROS'), + CampoNumerico(7, 'VL_ICMS'), + CampoNumerico(8, 'VL_OUTROS'), ] + nivel = 4 class RegistroC300(Registro): """ @@ -807,13 +1087,14 @@ class RegistroC300(Registro): Campo(4, 'SUB'), Campo(5, 'NUM_DOC_INI'), Campo(6, 'NUM_DOC_FIN'), - Campo(7, 'DT_DOC'), - Campo(8, 'VL_DOC'), - Campo(9, 'VL_PIS'), - Campo(10, 'VL_COFINS'), + CampoData(7, 'DT_DOC'), + CampoNumerico(8, 'VL_DOC'), + CampoNumerico(9, 'VL_PIS'), + CampoNumerico(10, 'VL_COFINS'), Campo(11, 'COD_CTA'), ] + nivel = 2 class RegistroC310(Registro): """ @@ -824,6 +1105,7 @@ class RegistroC310(Registro): Campo(2, 'NUM_DOC_CANC'), ] + nivel = 3 class RegistroC320(Registro): """ @@ -834,13 +1116,14 @@ class RegistroC320(Registro): Campo(2, 'CST_ICMS'), Campo(3, 'CFOP'), Campo(4, 'ALIQ_ICMS'), - Campo(5, 'VL_OPR'), - Campo(6, 'VL_BC_ICMS'), - Campo(7, 'VL_ICMS'), - Campo(8, 'VL_RED_BC'), + CampoNumerico(5, 'VL_OPR'), + CampoNumerico(6, 'VL_BC_ICMS'), + CampoNumerico(7, 'VL_ICMS'), + CampoNumerico(8, 'VL_RED_BC'), Campo(9, 'COD_OBS'), ] + nivel = 3 class RegistroC321(Registro): """ @@ -851,14 +1134,15 @@ class RegistroC321(Registro): Campo(2, 'COD_ITEM'), Campo(3, 'QTD'), Campo(4, 'UNID'), - Campo(5, 'VL_ITEM'), - Campo(6, 'VL_DESC'), - Campo(7, 'VL_BC_ICMS'), - Campo(8, 'VL_ICMS'), - Campo(9, 'VL_PIS'), - Campo(10, 'VL_COFINS'), + CampoNumerico(5, 'VL_ITEM'), + CampoNumerico(6, 'VL_DESC'), + CampoNumerico(7, 'VL_BC_ICMS'), + CampoNumerico(8, 'VL_ICMS'), + CampoNumerico(9, 'VL_PIS'), + CampoNumerico(10, 'VL_COFINS'), ] + nivel = 4 class RegistroC350(Registro): """ @@ -869,15 +1153,16 @@ class RegistroC350(Registro): Campo(2, 'SER'), Campo(3, 'SUB_SER'), Campo(4, 'NUM_DOC'), - Campo(5, 'DT_DOC'), - Campo(6, 'CNPJ_CPF'), - Campo(7, 'VL_MERC'), - Campo(8, 'VL_DOC'), - Campo(9, 'VL_DESC'), - Campo(10, 'VL_PIS'), - Campo(11, 'VL_COFINS'), + CampoData(5, 'DT_DOC'), + CampoCPFouCNPJ(6, 'CNPJ_CPF'), + CampoNumerico(7, 'VL_MERC'), + CampoNumerico(8, 'VL_DOC'), + CampoNumerico(9, 'VL_DESC'), + CampoNumerico(10, 'VL_PIS'), + CampoNumerico(11, 'VL_COFINS'), ] + nivel = 2 class RegistroC370(Registro): """ @@ -889,10 +1174,11 @@ class RegistroC370(Registro): Campo(3, 'COD_ITEM'), Campo(4, 'QTD'), Campo(5, 'UNID'), - Campo(6, 'VL_ITEM'), - Campo(7, 'VL_DESC'), + CampoNumerico(6, 'VL_ITEM'), + CampoNumerico(7, 'VL_DESC'), ] + nivel = 3 class RegistroC390(Registro): """ @@ -903,13 +1189,14 @@ class RegistroC390(Registro): Campo(2, 'CST_ICMS'), Campo(3, 'CFOP'), Campo(4, 'ALIQ_ICMS'), - Campo(5, 'VL_OPR'), - Campo(6, 'VL_BC_ICMS'), - Campo(7, 'VL_ICMS'), - Campo(8, 'VL_RED_BC'), + CampoNumerico(5, 'VL_OPR'), + CampoNumerico(6, 'VL_BC_ICMS'), + CampoNumerico(7, 'VL_ICMS'), + CampoNumerico(8, 'VL_RED_BC'), Campo(9, 'COD_OBS'), ] + nivel = 3 class RegistroC400(Registro): """ @@ -923,6 +1210,7 @@ class RegistroC400(Registro): Campo(5, 'ECF_CX'), ] + nivel = 2 class RegistroC405(Registro): """ @@ -930,14 +1218,15 @@ class RegistroC405(Registro): """ campos = [ CampoFixo(1, 'REG', 'C405'), - Campo(2, 'DT_DOC'), + CampoData(2, 'DT_DOC'), Campo(3, 'CRO'), Campo(4, 'CRZ'), Campo(5, 'NUM_COO_FIN'), Campo(6, 'GT_FIN'), - Campo(7, 'VL_BRT'), + CampoNumerico(7, 'VL_BRT'), ] + nivel = 3 class RegistroC410(Registro): """ @@ -945,10 +1234,11 @@ class RegistroC410(Registro): """ campos = [ CampoFixo(1, 'REG', 'C410'), - Campo(2, 'VL_PIS'), - Campo(3, 'VL_COFINS'), + CampoNumerico(2, 'VL_PIS'), + CampoNumerico(3, 'VL_COFINS'), ] + nivel = 4 class RegistroC420(Registro): """ @@ -962,6 +1252,7 @@ class RegistroC420(Registro): Campo(5, 'DESCR_NR_TOT'), ] + nivel = 4 class RegistroC425(Registro): """ @@ -972,11 +1263,12 @@ class RegistroC425(Registro): Campo(2, 'COD_ITEM'), Campo(3, 'QTD'), Campo(4, 'UNID'), - Campo(5, 'VL_ITEM'), - Campo(6, 'VL_PIS'), - Campo(7, 'VL_COFINS'), + CampoNumerico(5, 'VL_ITEM'), + CampoNumerico(6, 'VL_PIS'), + CampoNumerico(7, 'VL_COFINS'), ] + nivel = 5 class RegistroC460(Registro): """ @@ -987,14 +1279,27 @@ class RegistroC460(Registro): Campo(2, 'COD_MOD'), Campo(3, 'COD_SIT'), Campo(4, 'NUM_DOC'), - Campo(5, 'DT_DOC'), - Campo(6, 'VL_DOC'), - Campo(7, 'VL_PIS'), - Campo(8, 'VL_COFINS'), + CampoData(5, 'DT_DOC'), + CampoNumerico(6, 'VL_DOC'), + CampoNumerico(7, 'VL_PIS'), + CampoNumerico(8, 'VL_COFINS'), Campo(9, 'CPF_CNPJ'), Campo(10, 'NOM_ADQ'), ] + nivel = 4 + +class RegistroC465(Registro): + """ + DOCUMENTO + """ + campos = [ + CampoFixo(1, 'REG', 'C465'), + CampoChaveEletronica(2, 'CHV_CFE'), + Campo(3, 'NUM_CCF'), + ] + + nivel = 5 class RegistroC470(Registro): """ @@ -1006,14 +1311,15 @@ class RegistroC470(Registro): Campo(3, 'QTD'), Campo(4, 'QTD_CANC'), Campo(5, 'UNID'), - Campo(6, 'VL_ITEM'), + CampoNumerico(6, 'VL_ITEM'), Campo(7, 'CST_ICMS'), Campo(8, 'CFOP'), Campo(9, 'ALIQ_ICMS'), - Campo(10, 'VL_PIS'), - Campo(11, 'VL_COFINS'), + CampoNumerico(10, 'VL_PIS'), + CampoNumerico(11, 'VL_COFINS'), ] + nivel = 5 class RegistroC490(Registro): """ @@ -1024,12 +1330,13 @@ class RegistroC490(Registro): Campo(2, 'CST_ICMS'), Campo(3, 'CFOP'), Campo(4, 'ALIQ_ICMS'), - Campo(5, 'VL_OPR'), - Campo(6, 'VL_BC_ICMS'), - Campo(7, 'VL_ICMS'), + CampoNumerico(5, 'VL_OPR'), + CampoNumerico(6, 'VL_BC_ICMS'), + CampoNumerico(7, 'VL_ICMS'), Campo(8, 'COD_OBS'), ] + nivel = 4 class RegistroC495(Registro): """ @@ -1042,17 +1349,18 @@ class RegistroC495(Registro): Campo(4, 'QTD'), Campo(5, 'QTD_CANC'), Campo(6, 'UNID'), - Campo(7, 'VL_ITEM'), - Campo(8, 'VL_DESC'), - Campo(9, 'VL_CANC'), - Campo(10, 'VL_ACMO'), - Campo(11, 'VL_BC_ICMS'), - Campo(12, 'VL_ICMS'), - Campo(13, 'VL_ISEN'), - Campo(14, 'VL_NT'), - Campo(15, 'VL_ICMS_ST'), + CampoNumerico(7, 'VL_ITEM'), + CampoNumerico(8, 'VL_DESC'), + CampoNumerico(9, 'VL_CANC'), + CampoNumerico(10, 'VL_ACMO'), + CampoNumerico(11, 'VL_BC_ICMS'), + CampoNumerico(12, 'VL_ICMS'), + CampoNumerico(13, 'VL_ISEN'), + CampoNumerico(14, 'VL_NT'), + CampoNumerico(15, 'VL_ICMS_ST'), ] + nivel = 2 class RegistroC500(Registro): """ @@ -1070,25 +1378,26 @@ class RegistroC500(Registro): Campo(8, 'SUB'), Campo(9, 'COD_CONS'), Campo(10, 'NUM_DOC'), - Campo(11, 'DT_DOC'), - Campo(12, 'DT_E_S'), - Campo(13, 'VL_DOC'), - Campo(14, 'VL_DESC'), - Campo(15, 'VL_FORN'), - Campo(16, 'VL_SERV_NT'), - Campo(17, 'VL_TERC'), - Campo(18, 'VL_DA'), - Campo(19, 'VL_BC_ICMS'), - Campo(20, 'VL_ICMS'), - Campo(21, 'VL_BC_ICMS_ST'), - Campo(22, 'VL_ICMS_ST'), + CampoData(11, 'DT_DOC'), + CampoData(12, 'DT_E_S'), + CampoNumerico(13, 'VL_DOC'), + CampoNumerico(14, 'VL_DESC'), + CampoNumerico(15, 'VL_FORN'), + CampoNumerico(16, 'VL_SERV_NT'), + CampoNumerico(17, 'VL_TERC'), + CampoNumerico(18, 'VL_DA'), + CampoNumerico(19, 'VL_BC_ICMS'), + CampoNumerico(20, 'VL_ICMS'), + CampoNumerico(21, 'VL_BC_ICMS_ST'), + CampoNumerico(22, 'VL_ICMS_ST'), Campo(23, 'COD_INF'), - Campo(24, 'VL_PIS'), - Campo(25, 'VL_COFINS'), + CampoNumerico(24, 'VL_PIS'), + CampoNumerico(25, 'VL_COFINS'), Campo(26, 'TP_LIGACAO'), Campo(27, 'COD_GRUPO_TENSAO'), ] + nivel = 2 class RegistroC510(Registro): """ @@ -1101,23 +1410,24 @@ class RegistroC510(Registro): Campo(4, 'COD_CLASS'), Campo(5, 'QTD'), Campo(6, 'UNID'), - Campo(7, 'VL_ITEM'), - Campo(8, 'VL_DESC'), + CampoNumerico(7, 'VL_ITEM'), + CampoNumerico(8, 'VL_DESC'), Campo(9, 'CST_ICMS'), Campo(10, 'CFOP'), - Campo(11, 'VL_BC_ICMS'), + CampoNumerico(11, 'VL_BC_ICMS'), Campo(12, 'ALIQ_ICMS'), - Campo(13, 'VL_ICMS'), - Campo(14, 'VL_BC_ICMS_ST'), + CampoNumerico(13, 'VL_ICMS'), + CampoNumerico(14, 'VL_BC_ICMS_ST'), Campo(15, 'ALIQ_ST'), - Campo(16, 'VL_ICMS_ST'), + CampoNumerico(16, 'VL_ICMS_ST'), Campo(17, 'IND_REC'), Campo(18, 'COD_PART'), - Campo(19, 'VL_PIS'), - Campo(20, 'VL_COFINS'), + CampoNumerico(19, 'VL_PIS'), + CampoNumerico(20, 'VL_COFINS'), Campo(21, 'COD_CTA'), ] + nivel = 3 class RegistroC590(Registro): """ @@ -1129,15 +1439,16 @@ class RegistroC590(Registro): Campo(2, 'CST_ICMS'), Campo(3, 'CFOP'), Campo(4, 'ALIQ_ICMS'), - Campo(5, 'VL_OPR'), - Campo(6, 'VL_BC_ICMS'), - Campo(7, 'VL_ICMS'), - Campo(8, 'VL_BC_ICMS_ST'), - Campo(9, 'VL_ICMS_ST'), - Campo(10, 'VL_RED_BC'), + CampoNumerico(5, 'VL_OPR'), + CampoNumerico(6, 'VL_BC_ICMS'), + CampoNumerico(7, 'VL_ICMS'), + CampoNumerico(8, 'VL_BC_ICMS_ST'), + CampoNumerico(9, 'VL_ICMS_ST'), + CampoNumerico(10, 'VL_RED_BC'), Campo(11, 'COD_OBS'), ] + nivel = 3 class RegistroC600(Registro): """ @@ -1153,22 +1464,23 @@ class RegistroC600(Registro): Campo(6, 'COD_CONS'), Campo(7, 'QTD_CONS'), Campo(8, 'QTD_CANC'), - Campo(9, 'DT_DOC'), - Campo(10, 'VL_DOC'), - Campo(11, 'VL_DESC'), + CampoData(9, 'DT_DOC'), + CampoNumerico(10, 'VL_DOC'), + CampoNumerico(11, 'VL_DESC'), Campo(12, 'CONS'), - Campo(13, 'VL_FORN'), - Campo(14, 'VL_SERV_NT'), - Campo(15, 'VL_TERC'), - Campo(16, 'VL_DA'), - Campo(17, 'VL_BC_ICMS'), - Campo(18, 'VL_ICMS'), - Campo(19, 'VL_BC_ICMS_ST'), - Campo(20, 'VL_ICMS_ST'), - Campo(21, 'VL_PIS'), - Campo(22, 'VL_COFINS'), + CampoNumerico(13, 'VL_FORN'), + CampoNumerico(14, 'VL_SERV_NT'), + CampoNumerico(15, 'VL_TERC'), + CampoNumerico(16, 'VL_DA'), + CampoNumerico(17, 'VL_BC_ICMS'), + CampoNumerico(18, 'VL_ICMS'), + CampoNumerico(19, 'VL_BC_ICMS_ST'), + CampoNumerico(20, 'VL_ICMS_ST'), + CampoNumerico(21, 'VL_PIS'), + CampoNumerico(22, 'VL_COFINS'), ] + nivel = 2 class RegistroC601(Registro): """ @@ -1180,6 +1492,7 @@ class RegistroC601(Registro): Campo(2, 'NUM_DOC_CANC'), ] + nivel = 3 class RegistroC610(Registro): """ @@ -1192,20 +1505,21 @@ class RegistroC610(Registro): Campo(3, 'COD_ITEM'), Campo(4, 'QTD'), Campo(5, 'UNID'), - Campo(6, 'VL_ITEM'), - Campo(7, 'VL_DESC'), + CampoNumerico(6, 'VL_ITEM'), + CampoNumerico(7, 'VL_DESC'), Campo(8, 'CST_ICMS'), Campo(9, 'CFOP'), Campo(10, 'ALIQ_ICMS'), - Campo(11, 'VL_BC_ICMS'), - Campo(12, 'VL_ICMS'), - Campo(13, 'VL_BC_ICMS_ST'), - Campo(14, 'VL_ICMS_ST'), - Campo(15, 'VL_PIS'), - Campo(16, 'VL_COFINS'), + CampoNumerico(11, 'VL_BC_ICMS'), + CampoNumerico(12, 'VL_ICMS'), + CampoNumerico(13, 'VL_BC_ICMS_ST'), + CampoNumerico(14, 'VL_ICMS_ST'), + CampoNumerico(15, 'VL_PIS'), + CampoNumerico(16, 'VL_COFINS'), Campo(17, 'COD_CTA'), ] + nivel = 3 class RegistroC690(Registro): """ @@ -1217,15 +1531,16 @@ class RegistroC690(Registro): Campo(2, 'CST_ICMS'), Campo(3, 'CFOP'), Campo(4, 'ALIQ_ICMS'), - Campo(5, 'VL_OPR'), - Campo(6, 'VL_BC_ICMS'), - Campo(7, 'VL_ICMS'), - Campo(8, 'VL_RED_BC'), - Campo(9, 'VL_BC_ICMS_ST'), - Campo(10, 'VL_ICMS_ST'), + CampoNumerico(5, 'VL_OPR'), + CampoNumerico(6, 'VL_BC_ICMS'), + CampoNumerico(7, 'VL_ICMS'), + CampoNumerico(8, 'VL_RED_BC'), + CampoNumerico(9, 'VL_BC_ICMS_ST'), + CampoNumerico(10, 'VL_ICMS_ST'), Campo(11, 'COD_OBS'), ] + nivel = 3 class RegistroC700(Registro): """ @@ -1238,11 +1553,12 @@ class RegistroC700(Registro): Campo(3, 'SER'), Campo(4, 'NRO_ORD_INI'), Campo(5, 'NRO_ORD_FIN'), - Campo(6, 'DT_DOC_INI'), - Campo(7, 'DT_DOC_FIN'), + CampoData(6, 'DT_DOC_INI'), + CampoData(7, 'DT_DOC_FIN'), Campo(8, 'NOM_MEST'), ] + nivel = 2 class RegistroC790(Registro): """ @@ -1253,15 +1569,16 @@ class RegistroC790(Registro): Campo(2, 'CST_ICMS'), Campo(3, 'CFOP'), Campo(4, 'ALIQ_ICMS'), - Campo(5, 'VL_OPR'), - Campo(6, 'VL_BC_ICMS'), - Campo(7, 'VL_ICMS'), - Campo(8, 'VL_BC_ICMS_ST'), - Campo(9, 'VL_ICMS_ST'), - Campo(10, 'VL_RED_BC'), + CampoNumerico(5, 'VL_OPR'), + CampoNumerico(6, 'VL_BC_ICMS'), + CampoNumerico(7, 'VL_ICMS'), + CampoNumerico(8, 'VL_BC_ICMS_ST'), + CampoNumerico(9, 'VL_ICMS_ST'), + CampoNumerico(10, 'VL_RED_BC'), Campo(11, 'COD_OBS'), ] + nivel = 3 class RegistroC791(Registro): """ @@ -1270,10 +1587,11 @@ class RegistroC791(Registro): campos = [ CampoFixo(1, 'REG', 'C791'), Campo(2, 'UF'), - Campo(3, 'VL_BC_ICMS_ST'), - Campo(4, 'VL_ICMS_ST'), + CampoNumerico(3, 'VL_BC_ICMS_ST'), + CampoNumerico(4, 'VL_ICMS_ST'), ] + nivel = 4 class RegistroC800(Registro): """ @@ -1284,21 +1602,22 @@ class RegistroC800(Registro): Campo(2, 'COD_MOD'), Campo(3, 'COD_SIT'), Campo(4, 'NUM_CFE'), - Campo(5, 'DT_DOC'), - Campo(6, 'VL_CFE'), - Campo(7, 'VL_PIS'), - Campo(8, 'VL_COFINS'), - Campo(9, 'CNPJ_CPF'), + CampoData(5, 'DT_DOC'), + CampoNumerico(6, 'VL_CFE'), + CampoNumerico(7, 'VL_PIS'), + CampoNumerico(8, 'VL_COFINS'), + CampoCPFouCNPJ(9, 'CNPJ_CPF'), Campo(10, 'NR_SAT'), - Campo(11, 'CHV_CFE'), - Campo(12, 'VL_DESC'), - Campo(13, 'VL_MERC'), - Campo(14, 'VL_OUT_DA'), - Campo(15, 'VL_ICMS'), - Campo(16, 'VL_PIS_ST'), - Campo(17, 'VL_COFINS_ST'), + CampoChaveEletronica(11, 'CHV_CFE'), + CampoNumerico(12, 'VL_DESC'), + CampoNumerico(13, 'VL_MERC'), + CampoNumerico(14, 'VL_OUT_DA'), + CampoNumerico(15, 'VL_ICMS'), + CampoNumerico(16, 'VL_PIS_ST'), + CampoNumerico(17, 'VL_COFINS_ST'), ] + nivel = 2 class RegistroC850(Registro): """ @@ -1309,12 +1628,13 @@ class RegistroC850(Registro): Campo(2, 'CST_ICMS'), Campo(3, 'CFOP'), Campo(4, 'ALIQ_ICMS'), - Campo(5, 'VL_OPR'), - Campo(6, 'VL_BC_ICMS'), - Campo(7, 'VL_ICMS'), + CampoNumerico(5, 'VL_OPR'), + CampoNumerico(6, 'VL_BC_ICMS'), + CampoNumerico(7, 'VL_ICMS'), Campo(8, 'COD_OBS'), ] + nivel = 3 class RegistroC860(Registro): """ @@ -1324,11 +1644,12 @@ class RegistroC860(Registro): CampoFixo(1, 'REG', 'C860'), Campo(2, 'COD_MOD'), Campo(3, 'NR_SAT'), - Campo(4, 'DT_DOC'), + CampoData(4, 'DT_DOC'), Campo(5, 'DOC_INI'), Campo(6, 'DOC_FIM'), ] + nivel = 2 class RegistroC890(Registro): """ @@ -1339,12 +1660,13 @@ class RegistroC890(Registro): Campo(2, 'CST_ICMS'), Campo(3, 'CFOP'), Campo(4, 'ALIQ_ICMS'), - Campo(5, 'VL_OPR'), - Campo(6, 'VL_BC_ICMS'), - Campo(7, 'VL_ICMS'), + CampoNumerico(5, 'VL_OPR'), + CampoNumerico(6, 'VL_BC_ICMS'), + CampoNumerico(7, 'VL_ICMS'), Campo(8, 'COD_OBS'), ] + nivel = 3 class RegistroC990(Registro): """ @@ -1355,6 +1677,7 @@ class RegistroC990(Registro): CampoNumerico(2, 'QTD_LIN_C'), ] + nivel = 1 class RegistroD001(Registro): """ @@ -1365,6 +1688,7 @@ class RegistroD001(Registro): Campo(2, 'IND_MOV'), ] + nivel = 1 class RegistroD100(Registro): """ @@ -1383,24 +1707,40 @@ class RegistroD100(Registro): Campo(7, 'SER'), Campo(8, 'SUB'), Campo(9, 'NUM_DOC'), - Campo(10, 'CHV_CTE'), - Campo(11, 'DT_DOC'), - Campo(12, 'DT_A_P'), + CampoChaveEletronica(10, 'CHV_CTE'), + CampoData(11, 'DT_DOC'), + CampoData(12, 'DT_A_P'), Campo(13, 'TP_CT-e'), - Campo(14, 'CHV_CTE_REF'), - Campo(15, 'VL_DOC'), - Campo(16, 'VL_DESC'), + CampoChaveEletronica(14, 'CHV_CTE_REF'), + CampoNumerico(15, 'VL_DOC'), + CampoNumerico(16, 'VL_DESC'), Campo(17, 'IND_FRT'), - Campo(18, 'VL_SERV'), - Campo(19, 'VL_BC_ICMS'), - Campo(20, 'VL_ICMS'), - Campo(21, 'VL_NT'), + CampoNumerico(18, 'VL_SERV'), + CampoNumerico(19, 'VL_BC_ICMS'), + CampoNumerico(20, 'VL_ICMS'), + CampoNumerico(21, 'VL_NT'), Campo(22, 'COD_INF'), Campo(23, 'COD_CTA'), Campo(24, 'COD_MUN_ORIG'), Campo(25, 'COD_MUN_DEST'), ] + nivel = 2 + +class RegistroD101(Registro): + """ + INFORMAÇÃO COMPLEMENTAR DOS DOCUMENTOS FISCAIS + QUANDO DAS PRESTAÇÕES INTERESTADUAIS DESTINADAS A CONSUMIDOR FINAL + NÃO CONTRIBUINTE EC 87/15 (CÓDIGOS 57, 63 e 67) + """ + campos = [ + CampoFixo(1, 'REG', 'D101'), + CampoNumerico(2, 'VL_FCP_UF_DEST'), + CampoNumerico(3, 'VL_ICMS_UF_DEST'), + CampoNumerico(4, 'VL_ICMS_UF_REM'), + ] + + nivel = 3 class RegistroD110(Registro): """ @@ -1410,10 +1750,11 @@ class RegistroD110(Registro): CampoFixo(1, 'REG', 'D110'), Campo(2, 'NUM_ITEM'), Campo(3, 'COD_ITEM'), - Campo(4, 'VL_SERV'), - Campo(5, 'VL_OUT'), + CampoNumerico(4, 'VL_SERV'), + CampoNumerico(5, 'VL_OUT'), ] + nivel = 3 class RegistroD120(Registro): """ @@ -1427,6 +1768,7 @@ class RegistroD120(Registro): Campo(5, 'UF_ID'), ] + nivel = 4 class RegistroD130(Registro): """ @@ -1440,15 +1782,16 @@ class RegistroD130(Registro): Campo(5, 'COD_MUN_ORIG'), Campo(6, 'COD_MUN_DEST'), Campo(7, 'VEIC_ID'), - Campo(8, 'VL_LIQ_FRT'), - Campo(9, 'VL_SEC_CAT'), - Campo(10, 'VL_DESP'), - Campo(11, 'VL_PEDG'), - Campo(12, 'VL_OUT'), - Campo(13, 'VL_FRT'), + CampoNumerico(8, 'VL_LIQ_FRT'), + CampoNumerico(9, 'VL_SEC_CAT'), + CampoNumerico(10, 'VL_DESP'), + CampoNumerico(11, 'VL_PEDG'), + CampoNumerico(12, 'VL_OUT'), + CampoNumerico(13, 'VL_FRT'), Campo(14, 'UF_ID'), ] + nivel = 3 class RegistroD140(Registro): """ @@ -1463,14 +1806,15 @@ class RegistroD140(Registro): Campo(6, 'VEIC_ID'), Campo(7, 'IND_NAV'), Campo(8, 'VIAGEM'), - Campo(9, 'VL_FRT_LIQ'), - Campo(10, 'VL_DESP_PORT'), - Campo(11, 'VL_DESP_CAR_DESC'), - Campo(12, 'VL_OUT'), - Campo(13, 'VL_FRT_BRT'), - Campo(14, 'VL_FRT_MM'), + CampoNumerico(9, 'VL_FRT_LIQ'), + CampoNumerico(10, 'VL_DESP_PORT'), + CampoNumerico(11, 'VL_DESP_CAR_DESC'), + CampoNumerico(12, 'VL_OUT'), + CampoNumerico(13, 'VL_FRT_BRT'), + CampoNumerico(14, 'VL_FRT_MM'), ] + nivel = 3 class RegistroD150(Registro): """ @@ -1483,13 +1827,14 @@ class RegistroD150(Registro): Campo(4, 'VEIC_ID'), Campo(5, 'VIAGEM'), Campo(6, 'IND_TFA'), - Campo(7, 'VL_PESO_TX'), - Campo(8, 'VL_TX_TERR'), - Campo(9, 'VL_TX_RED'), - Campo(10, 'VL_OUT'), - Campo(11, 'VL_TX_ADV'), + CampoNumerico(7, 'VL_PESO_TX'), + CampoNumerico(8, 'VL_TX_TERR'), + CampoNumerico(9, 'VL_TX_RED'), + CampoNumerico(10, 'VL_OUT'), + CampoNumerico(11, 'VL_TX_ADV'), ] + nivel = 3 class RegistroD160(Registro): """ @@ -1498,14 +1843,15 @@ class RegistroD160(Registro): campos = [ CampoFixo(1, 'REG', 'D160'), Campo(2, 'DESPACHO'), - Campo(3, 'CNPJ_CPF_REM'), + CampoCPFouCNPJ(3, 'CNPJ_CPF_REM'), Campo(4, 'IE_REM'), Campo(5, 'COD_MUN_ORI'), - Campo(6, 'CNPJ_CPF_DEST'), + CampoCPFouCNPJ(6, 'CNPJ_CPF_DEST'), Campo(7, 'IE_DEST'), Campo(8, 'COD_MUN_DEST'), ] + nivel = 3 class RegistroD161(Registro): """ @@ -1514,14 +1860,15 @@ class RegistroD161(Registro): campos = [ CampoFixo(1, 'REG', 'D161'), Campo(2, 'IND_CARGA'), - Campo(3, 'CNPJ_CPF_COL'), + CampoCPFouCNPJ(3, 'CNPJ_CPF_COL'), Campo(4, 'IE_COL'), Campo(5, 'COD_MUN_COL'), - Campo(6, 'CNPJ_CPF_ENTG'), + CampoCPFouCNPJ(6, 'CNPJ_CPF_ENTG'), Campo(7, 'IE_ENTG'), Campo(8, 'COD_MUN_ENTG'), ] + nivel = 4 class RegistroD162(Registro): """ @@ -1532,14 +1879,15 @@ class RegistroD162(Registro): Campo(2, 'COD_MOD'), Campo(3, 'SER'), Campo(4, 'NUM_DOC'), - Campo(5, 'DT_DOC'), - Campo(6, 'VL_DOC'), - Campo(7, 'VL_MERC'), + CampoData(5, 'DT_DOC'), + CampoNumerico(6, 'VL_DOC'), + CampoNumerico(7, 'VL_MERC'), Campo(8, 'QTD_VOL'), Campo(9, 'PESO_BRT'), Campo(10, 'PESO_LIQ'), ] + nivel = 4 class RegistroD170(Registro): """ @@ -1553,15 +1901,16 @@ class RegistroD170(Registro): Campo(5, 'COD_MUN_DEST'), Campo(6, 'OTM'), Campo(7, 'IND_NAT_FRT'), - Campo(8, 'VL_LIQ_FRT'), - Campo(9, 'VL_GRIS'), - Campo(10, 'VL_PDG'), - Campo(11, 'VL_OUT'), - Campo(12, 'VL_FRT'), + CampoNumerico(8, 'VL_LIQ_FRT'), + CampoNumerico(9, 'VL_GRIS'), + CampoNumerico(10, 'VL_PDG'), + CampoNumerico(11, 'VL_OUT'), + CampoNumerico(12, 'VL_FRT'), Campo(13, 'VEIC_ID'), Campo(14, 'UF_ID'), ] + nivel = 3 class RegistroD180(Registro): """ @@ -1571,11 +1920,11 @@ class RegistroD180(Registro): CampoFixo(1, 'REG', 'D180'), Campo(2, 'NUM_SEQ'), Campo(3, 'IND_EMIT'), - Campo(4, 'CNPJ_CPF_EMIT'), + CampoCPFouCNPJ(4, 'CNPJ_CPF_EMIT'), Campo(5, 'UF_EMIT'), Campo(6, 'IE_EMIT'), Campo(7, 'COD_MUN_ORIG'), - Campo(8, 'CNPJ_CPF_TOM'), + CampoCPFouCNPJ(8, 'CNPJ_CPF_TOM'), Campo(9, 'UF_TOM'), Campo(10, 'IE_TOM'), Campo(11, 'COD_MUN_DEST'), @@ -1583,10 +1932,11 @@ class RegistroD180(Registro): Campo(13, 'SER'), Campo(14, 'SUB'), Campo(15, 'NUM_DOC'), - Campo(16, 'DT_DOC'), - Campo(17, 'VL_DOC'), + CampoData(16, 'DT_DOC'), + CampoNumerico(17, 'VL_DOC'), ] + nivel = 3 class RegistroD190(Registro): """ @@ -1597,13 +1947,14 @@ class RegistroD190(Registro): Campo(2, 'CST_ICMS'), Campo(3, 'CFOP'), Campo(4, 'ALIQ_ICMS'), - Campo(5, 'VL_OPR'), - Campo(6, 'VL_BC_ICMS'), - Campo(7, 'VL_ICMS'), - Campo(8, 'VL_RED_BC'), + CampoNumerico(5, 'VL_OPR'), + CampoNumerico(6, 'VL_BC_ICMS'), + CampoNumerico(7, 'VL_ICMS'), + CampoNumerico(8, 'VL_RED_BC'), Campo(9, 'COD_OBS'), ] - + + nivel = 3 class RegistroD195(Registro): """ @@ -1615,6 +1966,7 @@ class RegistroD195(Registro): Campo(3, 'TXT_COMPL'), ] + nivel = 3 class RegistroD197(Registro): """ @@ -1625,12 +1977,13 @@ class RegistroD197(Registro): Campo(2, 'COD_AJ'), Campo(3, 'DESCR_COMPL_AJ'), Campo(4, 'COD_ITEM'), - Campo(5, 'VL_BC_ICMS'), + CampoNumerico(5, 'VL_BC_ICMS'), Campo(6, 'ALIQ_ICMS'), - Campo(7, 'VL_ICMS'), - Campo(8, 'VL_OUTROS'), + CampoNumerico(7, 'VL_ICMS'), + CampoNumerico(8, 'VL_OUTROS'), ] + nivel = 4 class RegistroD300(Registro): """ @@ -1647,19 +2000,20 @@ class RegistroD300(Registro): Campo(7, 'CST_ICMS'), Campo(8, 'CFOP'), Campo(9, 'ALIQ_ICMS'), - Campo(10, 'DT_DOC'), - Campo(11, 'VL_OPR'), - Campo(12, 'VL_DESC'), - Campo(13, 'VL_SERV'), - Campo(14, 'VL_SEG'), - Campo(15, 'VL_OUT DESP'), - Campo(16, 'VL_BC_ICMS'), - Campo(17, 'VL_ICMS'), - Campo(18, 'VL_RED_BC'), + CampoData(10, 'DT_DOC'), + CampoNumerico(11, 'VL_OPR'), + CampoNumerico(12, 'VL_DESC'), + CampoNumerico(13, 'VL_SERV'), + CampoNumerico(14, 'VL_SEG'), + CampoNumerico(15, 'VL_OUT DESP'), + CampoNumerico(16, 'VL_BC_ICMS'), + CampoNumerico(17, 'VL_ICMS'), + CampoNumerico(18, 'VL_RED_BC'), Campo(19, 'COD_OBS'), Campo(20, 'COD_CTA'), ] + nivel = 2 class RegistroD301(Registro): """ @@ -1671,6 +2025,7 @@ class RegistroD301(Registro): Campo(2, 'NUM_DOC_CANC'), ] + nivel = 3 class RegistroD310(Registro): """ @@ -1679,11 +2034,12 @@ class RegistroD310(Registro): campos = [ CampoFixo(1, 'REG', 'D310'), Campo(2, 'COD_MUN_ORIG'), - Campo(3, 'VL_SERV'), - Campo(4, 'VL_BC_ICMS'), - Campo(5, 'VL_ICMS'), + CampoNumerico(3, 'VL_SERV'), + CampoNumerico(4, 'VL_BC_ICMS'), + CampoNumerico(5, 'VL_ICMS'), ] + nivel = 3 class RegistroD350(Registro): """ @@ -1697,6 +2053,7 @@ class RegistroD350(Registro): Campo(5, 'ECF_CX'), ] + nivel = 2 class RegistroD355(Registro): """ @@ -1704,14 +2061,15 @@ class RegistroD355(Registro): """ campos = [ CampoFixo(1, 'REG', 'D355'), - Campo(2, 'DT_DOC'), + CampoData(2, 'DT_DOC'), Campo(3, 'CRO'), Campo(4, 'CRZ'), Campo(5, 'NUM_COO_FIN'), Campo(6, 'GT_FIN'), - Campo(7, 'VL_BRT'), + CampoNumerico(7, 'VL_BRT'), ] + nivel = 3 class RegistroD360(Registro): """ @@ -1719,10 +2077,11 @@ class RegistroD360(Registro): """ campos = [ CampoFixo(1, 'REG', 'D360'), - Campo(2, 'VL_PIS'), - Campo(3, 'VL_COFINS'), + CampoNumerico(2, 'VL_PIS'), + CampoNumerico(3, 'VL_COFINS'), ] + nivel = 4 class RegistroD365(Registro): """ @@ -1736,6 +2095,7 @@ class RegistroD365(Registro): Campo(5, 'DESCR_NR_TOT'), ] + nivel = 4 class RegistroD370(Registro): """ @@ -1744,12 +2104,13 @@ class RegistroD370(Registro): campos = [ CampoFixo(1, 'REG', 'D370'), Campo(2, 'COD_MUN_ORIG'), - Campo(3, 'VL_SERV'), + CampoNumerico(3, 'VL_SERV'), Campo(4, 'QTD_BILH'), - Campo(5, 'VL_BC_ICMS'), - Campo(6, 'VL_ICMS'), + CampoNumerico(5, 'VL_BC_ICMS'), + CampoNumerico(6, 'VL_ICMS'), ] + nivel = 5 class RegistroD390(Registro): """ @@ -1760,15 +2121,16 @@ class RegistroD390(Registro): Campo(2, 'CST_ICMS'), Campo(3, 'CFOP'), Campo(4, 'ALIQ_ICMS'), - Campo(5, 'VL_OPR'), - Campo(6, 'VL_BC_ISSQN'), + CampoNumerico(5, 'VL_OPR'), + CampoNumerico(6, 'VL_BC_ISSQN'), Campo(7, 'ALIQ_ISSQN'), - Campo(8, 'VL_ISSQN'), - Campo(9, 'VL_BC_ICMS'), - Campo(10, 'VL_ICMS'), + CampoNumerico(8, 'VL_ISSQN'), + CampoNumerico(9, 'VL_BC_ICMS'), + CampoNumerico(10, 'VL_ICMS'), Campo(11, 'COD_OBS'), ] + nivel = 4 class RegistroD400(Registro): """ @@ -1782,17 +2144,18 @@ class RegistroD400(Registro): Campo(5, 'SER'), Campo(6, 'SUB'), Campo(7, 'NUM_DOC'), - Campo(8, 'DT_DOC'), - Campo(9, 'VL_DOC'), - Campo(10, 'VL_DESC'), - Campo(11, 'VL_SERV'), - Campo(12, 'VL_BC_ICMS'), - Campo(13, 'VL_ICMS'), - Campo(14, 'VL_PIS'), - Campo(15, 'VL_COFINS'), + CampoData(8, 'DT_DOC'), + CampoNumerico(9, 'VL_DOC'), + CampoNumerico(10, 'VL_DESC'), + CampoNumerico(11, 'VL_SERV'), + CampoNumerico(12, 'VL_BC_ICMS'), + CampoNumerico(13, 'VL_ICMS'), + CampoNumerico(14, 'VL_PIS'), + CampoNumerico(15, 'VL_COFINS'), Campo(16, 'COD_CTA'), ] + nivel = 2 class RegistroD410(Registro): """ @@ -1805,17 +2168,18 @@ class RegistroD410(Registro): Campo(4, 'SUB'), Campo(5, 'NUM_DOC_INI'), Campo(6, 'NUM_DOC_FIN'), - Campo(7, 'DT_DOC'), + CampoData(7, 'DT_DOC'), Campo(8, 'CST_ICMS'), Campo(9, 'CFOP'), Campo(10, 'ALIQ_ICMS'), - Campo(11, 'VL_OPR'), - Campo(12, 'VL_DESC'), - Campo(13, 'VL_SERV'), - Campo(14, 'VL_BC_ICMS'), - Campo(15, 'VL_ICMS'), + CampoNumerico(11, 'VL_OPR'), + CampoNumerico(12, 'VL_DESC'), + CampoNumerico(13, 'VL_SERV'), + CampoNumerico(14, 'VL_BC_ICMS'), + CampoNumerico(15, 'VL_ICMS'), ] + nivel = 3 class RegistroD411(Registro): """ @@ -1826,6 +2190,7 @@ class RegistroD411(Registro): Campo(2, 'NUM_DOC_CANC'), ] + nivel = 4 class RegistroD420(Registro): """ @@ -1834,11 +2199,12 @@ class RegistroD420(Registro): campos = [ CampoFixo(1, 'REG', 'D420'), Campo(2, 'COD_MUN_ORIG'), - Campo(3, 'VL_SERV'), - Campo(4, 'VL_BC_ICMS'), - Campo(5, 'VL_ICMS'), + CampoNumerico(3, 'VL_SERV'), + CampoNumerico(4, 'VL_BC_ICMS'), + CampoNumerico(5, 'VL_ICMS'), ] + nivel = 3 class RegistroD500(Registro): """ @@ -1854,23 +2220,24 @@ class RegistroD500(Registro): Campo(7, 'SER'), Campo(8, 'SUB'), Campo(9, 'NUM_DOC'), - Campo(10, 'DT_DOC'), - Campo(11, 'DT_A_P'), - Campo(12, 'VL_DOC'), - Campo(13, 'VL_DESC'), - Campo(14, 'VL_SERV'), - Campo(15, 'VL_SERV_NT'), - Campo(16, 'VL_TERC'), - Campo(17, 'VL_DA'), - Campo(18, 'VL_BC_ICMS'), - Campo(19, 'VL_ICMS'), + CampoData(10, 'DT_DOC'), + CampoData(11, 'DT_A_P'), + CampoNumerico(12, 'VL_DOC'), + CampoNumerico(13, 'VL_DESC'), + CampoNumerico(14, 'VL_SERV'), + CampoNumerico(15, 'VL_SERV_NT'), + CampoNumerico(16, 'VL_TERC'), + CampoNumerico(17, 'VL_DA'), + CampoNumerico(18, 'VL_BC_ICMS'), + CampoNumerico(19, 'VL_ICMS'), Campo(20, 'COD_INF'), - Campo(21, 'VL_PIS'), - Campo(22, 'VL_COFINS'), + CampoNumerico(21, 'VL_PIS'), + CampoNumerico(22, 'VL_COFINS'), Campo(23, 'COD_CTA'), Campo(24, 'TP_ASSINANTE'), ] + nivel = 2 class RegistroD510(Registro): """ @@ -1883,22 +2250,23 @@ class RegistroD510(Registro): Campo(4, 'COD_CLASS'), Campo(5, 'QTD'), Campo(6, 'UNID'), - Campo(7, 'VL_ITEM'), - Campo(8, 'VL_DESC'), + CampoNumerico(7, 'VL_ITEM'), + CampoNumerico(8, 'VL_DESC'), Campo(9, 'CST_ICMS'), Campo(10, 'CFOP'), - Campo(11, 'VL_BC_ICMS'), + CampoNumerico(11, 'VL_BC_ICMS'), Campo(12, 'ALIQ_ICMS'), - Campo(13, 'VL_ICMS'), - Campo(14, 'VL_BC_ICMS_ST'), - Campo(15, 'VL_ICMS_ST'), + CampoNumerico(13, 'VL_ICMS'), + CampoNumerico(14, 'VL_BC_ICMS_ST'), + CampoNumerico(15, 'VL_ICMS_ST'), Campo(16, 'IND_REC'), Campo(17, 'COD_PART'), - Campo(18, 'VL_PIS'), - Campo(19, 'VL_COFINS'), + CampoNumerico(18, 'VL_PIS'), + CampoNumerico(19, 'VL_COFINS'), Campo(20, 'COD_CTA'), ] + nivel = 3 class RegistroD530(Registro): """ @@ -1907,13 +2275,14 @@ class RegistroD530(Registro): campos = [ CampoFixo(1, 'REG', 'D530'), Campo(2, 'IND_SERV'), - Campo(3, 'DT_INI_SERV'), - Campo(4, 'DT_FIN_SERV'), + CampoData(3, 'DT_INI_SERV'), + CampoData(4, 'DT_FIN_SERV'), Campo(5, 'PER_FISCAL'), Campo(6, 'COD_AREA'), Campo(7, 'TERMINAL'), ] + nivel = 3 class RegistroD590(Registro): """ @@ -1924,15 +2293,16 @@ class RegistroD590(Registro): Campo(2, 'CST_ICMS'), Campo(3, 'CFOP'), Campo(4, 'ALIQ_ICMS'), - Campo(5, 'VL_OPR'), - Campo(6, 'VL_BC_ICMS'), - Campo(7, 'VL_ICMS'), - Campo(8, 'VL_BC_ICMS_ST'), - Campo(9, 'VL_ICMS_ST'), - Campo(10, 'VL_RED_BC'), + CampoNumerico(5, 'VL_OPR'), + CampoNumerico(6, 'VL_BC_ICMS'), + CampoNumerico(7, 'VL_ICMS'), + CampoNumerico(8, 'VL_BC_ICMS_ST'), + CampoNumerico(9, 'VL_ICMS_ST'), + CampoNumerico(10, 'VL_RED_BC'), Campo(11, 'COD_OBS'), ] + nivel = 3 class RegistroD600(Registro): """ @@ -1947,19 +2317,20 @@ class RegistroD600(Registro): Campo(5, 'SUB'), Campo(6, 'COD_CONS'), Campo(7, 'QTD_CONS'), - Campo(8, 'DT_DOC'), - Campo(9, 'VL_DOC'), - Campo(10, 'VL_DESC'), - Campo(11, 'VL_SERV'), - Campo(12, 'VL_SERV_N T'), - Campo(13, 'VL_TERC'), - Campo(14, 'VL_DA'), - Campo(15, 'VL_BC_ICMS'), - Campo(16, 'VL_ICMS'), - Campo(17, 'VL_PIS'), - Campo(18, 'VL_COFINS'), + CampoData(8, 'DT_DOC'), + CampoNumerico(9, 'VL_DOC'), + CampoNumerico(10, 'VL_DESC'), + CampoNumerico(11, 'VL_SERV'), + CampoNumerico(12, 'VL_SERV_N T'), + CampoNumerico(13, 'VL_TERC'), + CampoNumerico(14, 'VL_DA'), + CampoNumerico(15, 'VL_BC_ICMS'), + CampoNumerico(16, 'VL_ICMS'), + CampoNumerico(17, 'VL_PIS'), + CampoNumerico(18, 'VL_COFINS'), ] + nivel = 2 class RegistroD610(Registro): """ @@ -1971,21 +2342,22 @@ class RegistroD610(Registro): Campo(3, 'COD_ITEM'), Campo(4, 'QTD'), Campo(5, 'UNID'), - Campo(6, 'VL_ITEM'), - Campo(7, 'VL_DESC'), + CampoNumerico(6, 'VL_ITEM'), + CampoNumerico(7, 'VL_DESC'), Campo(8, 'CST_ICMS'), Campo(9, 'CFOP'), Campo(10, 'ALIQ_ICMS'), - Campo(11, 'VL_BC_ICMS'), - Campo(12, 'VL_ICMS'), - Campo(13, 'VL_BC_ICMS _ST'), - Campo(14, 'VL_ICMS_ST'), - Campo(15, 'VL_RED_BC'), - Campo(16, 'VL_PIS'), - Campo(17, 'VL_COFINS'), + CampoNumerico(11, 'VL_BC_ICMS'), + CampoNumerico(12, 'VL_ICMS'), + CampoNumerico(13, 'VL_BC_ICMS _ST'), + CampoNumerico(14, 'VL_ICMS_ST'), + CampoNumerico(15, 'VL_RED_BC'), + CampoNumerico(16, 'VL_PIS'), + CampoNumerico(17, 'VL_COFINS'), Campo(18, 'COD_CTA'), ] + nivel = 3 class RegistroD690(Registro): """ @@ -1996,15 +2368,16 @@ class RegistroD690(Registro): Campo(2, 'CST_ICMS'), Campo(3, 'CFOP'), Campo(4, 'ALIQ_ICMS'), - Campo(5, 'VL_OPR'), - Campo(6, 'VL_BC_ICMS'), - Campo(7, 'VL_ICMS'), - Campo(8, 'VL_BC_ICMS _ST'), - Campo(9, 'VL_ICMS_ST'), - Campo(10, 'VL_RED_BC'), + CampoNumerico(5, 'VL_OPR'), + CampoNumerico(6, 'VL_BC_ICMS'), + CampoNumerico(7, 'VL_ICMS'), + CampoNumerico(8, 'VL_BC_ICMS _ST'), + CampoNumerico(9, 'VL_ICMS_ST'), + CampoNumerico(10, 'VL_RED_BC'), Campo(11, 'COD_OBS'), ] + nivel = 3 class RegistroD695(Registro): """ @@ -2017,11 +2390,12 @@ class RegistroD695(Registro): Campo(3, 'SER'), Campo(4, 'NRO_ORD_INI'), Campo(5, 'NRO_ORD_FIN'), - Campo(6, 'DT_DOC_INI'), - Campo(7, 'DT_DOC_FIN'), + CampoData(6, 'DT_DOC_INI'), + CampoData(7, 'DT_DOC_FIN'), Campo(8, 'NOM_MEST'), ] + nivel = 2 class RegistroD696(Registro): """ @@ -2032,15 +2406,16 @@ class RegistroD696(Registro): Campo(2, 'CST_ICMS'), Campo(3, 'CFOP'), Campo(4, 'ALIQ_ICMS'), - Campo(5, 'VL_OPR'), - Campo(6, 'VL_BC_ICMS'), - Campo(7, 'VL_ICMS'), - Campo(8, 'VL_BC_ICMS_ST'), - Campo(9, 'VL_ICMS_ST'), - Campo(10, 'VL_RED_BC'), + CampoNumerico(5, 'VL_OPR'), + CampoNumerico(6, 'VL_BC_ICMS'), + CampoNumerico(7, 'VL_ICMS'), + CampoNumerico(8, 'VL_BC_ICMS_ST'), + CampoNumerico(9, 'VL_ICMS_ST'), + CampoNumerico(10, 'VL_RED_BC'), Campo(11, 'COD_OBS'), ] + nivel = 3 class RegistroD697(Registro): """ @@ -2050,10 +2425,11 @@ class RegistroD697(Registro): campos = [ CampoFixo(1, 'REG', 'D697'), Campo(2, 'UF'), - Campo(3, 'VL_BC_ICMS'), - Campo(4, 'VL_ICMS'), + CampoNumerico(3, 'VL_BC_ICMS'), + CampoNumerico(4, 'VL_ICMS'), ] + nivel = 4 class RegistroD990(Registro): """ @@ -2064,6 +2440,7 @@ class RegistroD990(Registro): CampoNumerico(2, 'QTD_LIN_D'), ] + nivel = 1 class RegistroE001(Registro): """ @@ -2074,6 +2451,7 @@ class RegistroE001(Registro): Campo(2, 'IND_MOV'), ] + nivel = 1 class RegistroE100(Registro): """ @@ -2085,6 +2463,7 @@ class RegistroE100(Registro): CampoData(3, 'DT_FIN'), ] + nivel = 2 class RegistroE110(Registro): """ @@ -2092,22 +2471,23 @@ class RegistroE110(Registro): """ campos = [ CampoFixo(1, 'REG', 'E110'), - Campo(2, 'VL_TOT_DEBITOS'), - Campo(3, 'VL_AJ_DEBITOS'), - Campo(4, 'VL_TOT_AJ_DEBITOS'), - Campo(5, 'VL_ESTORNOS_CRED'), - Campo(6, 'VL_TOT_CREDITOS'), - Campo(7, 'VL_AJ_CREDITOS'), - Campo(8, 'VL_TOT_AJ_CREDITOS'), - Campo(9, 'VL_ESTORNOS_DEB'), - Campo(10, 'VL_SLD_CREDOR_ANT'), - Campo(11, 'VL_SLD_APURADO'), - Campo(12, 'VL_TOT_DED'), - Campo(13, 'VL_ICMS_RECOLHER'), - Campo(14, 'VL_SLD_CREDOR_TRANSPORTAR'), + CampoNumerico(2, 'VL_TOT_DEBITOS'), + CampoNumerico(3, 'VL_AJ_DEBITOS'), + CampoNumerico(4, 'VL_TOT_AJ_DEBITOS'), + CampoNumerico(5, 'VL_ESTORNOS_CRED'), + CampoNumerico(6, 'VL_TOT_CREDITOS'), + CampoNumerico(7, 'VL_AJ_CREDITOS'), + CampoNumerico(8, 'VL_TOT_AJ_CREDITOS'), + CampoNumerico(9, 'VL_ESTORNOS_DEB'), + CampoNumerico(10, 'VL_SLD_CREDOR_ANT'), + CampoNumerico(11, 'VL_SLD_APURADO'), + CampoNumerico(12, 'VL_TOT_DED'), + CampoNumerico(13, 'VL_ICMS_RECOLHER'), + CampoNumerico(14, 'VL_SLD_CREDOR_TRANSPORTAR'), Campo(15, 'DEB_ESP'), ] + nivel = 3 class RegistroE111(Registro): """ @@ -2117,9 +2497,10 @@ class RegistroE111(Registro): CampoFixo(1, 'REG', 'E111'), Campo(2, 'COD_AJ_APUR'), Campo(3, 'DESCR_COMPL_AJ'), - Campo(4, 'VL_AJ_APUR'), + CampoNumerico(4, 'VL_AJ_APUR'), ] + nivel = 4 class RegistroE112(Registro): """ @@ -2134,6 +2515,7 @@ class RegistroE112(Registro): Campo(6, 'TXT_COMPL'), ] + nivel = 5 class RegistroE113(Registro): """ @@ -2146,11 +2528,12 @@ class RegistroE113(Registro): Campo(4, 'SER'), Campo(5, 'SUB'), Campo(6, 'NUM_DOC'), - Campo(7, 'DT_DOC'), + CampoData(7, 'DT_DOC'), Campo(8, 'COD_ITEM'), - Campo(9, 'VL_AJ_ITEM'), + CampoNumerico(9, 'VL_AJ_ITEM'), ] + nivel = 5 class RegistroE115(Registro): """ @@ -2159,10 +2542,11 @@ class RegistroE115(Registro): campos = [ CampoFixo(1, 'REG', 'E115'), Campo(2, 'COD_INF_ADIC'), - Campo(3, 'VL_INF_ADIC'), + CampoNumerico(3, 'VL_INF_ADIC'), Campo(4, 'DESCR_COMPL_AJ'), ] + nivel = 4 class RegistroE116(Registro): """ @@ -2171,8 +2555,8 @@ class RegistroE116(Registro): campos = [ CampoFixo(1, 'REG', 'E116'), Campo(2, 'COD_OR'), - Campo(3, 'VL_OR'), - Campo(4, 'DT_VCTO'), + CampoNumerico(3, 'VL_OR'), + CampoData(4, 'DT_VCTO'), Campo(5, 'COD_REC'), Campo(6, 'NUM_PROC'), Campo(7, 'IND_PROC'), @@ -2181,6 +2565,7 @@ class RegistroE116(Registro): Campo(10, 'MES_REF'), ] + nivel = 4 class RegistroE200(Registro): """ @@ -2192,7 +2577,8 @@ class RegistroE200(Registro): CampoData(3, 'DT_INI'), CampoData(4, 'DT_FIN'), ] - + + nivel = 2 class RegistroE210(Registro): """ @@ -2201,21 +2587,22 @@ class RegistroE210(Registro): campos = [ CampoFixo(1, 'REG', 'E210'), Campo(2, 'IND_MOV_ST'), - Campo(3, 'VL_SLD_CRED_ANT_ST'), - Campo(4, 'VL_DEVOL_ST'), - Campo(5, 'VL_RESSARC_ST'), - Campo(6, 'VL_OUT_CRED_ST'), - Campo(7, 'VL_AJ_CREDITOS_ST'), - Campo(8, 'VL_RETENÇAO_ST'), - Campo(9, 'VL_OUT_DEB_ST'), - Campo(10, 'VL_AJ_DEBITOS_ST'), - Campo(11, 'VL_SLD_DEV_ANT_ST'), - Campo(12, 'VL_DEDUÇÕES_ST'), - Campo(13, 'VL_ICMS_RECOL_ST'), - Campo(14, 'VL_SLD_CRED_ST_TRAN SPORTAR'), + CampoNumerico(3, 'VL_SLD_CRED_ANT_ST'), + CampoNumerico(4, 'VL_DEVOL_ST'), + CampoNumerico(5, 'VL_RESSARC_ST'), + CampoNumerico(6, 'VL_OUT_CRED_ST'), + CampoNumerico(7, 'VL_AJ_CREDITOS_ST'), + CampoNumerico(8, 'VL_RETENÇAO_ST'), + CampoNumerico(9, 'VL_OUT_DEB_ST'), + CampoNumerico(10, 'VL_AJ_DEBITOS_ST'), + CampoNumerico(11, 'VL_SLD_DEV_ANT_ST'), + CampoNumerico(12, 'VL_DEDUÇÕES_ST'), + CampoNumerico(13, 'VL_ICMS_RECOL_ST'), + CampoNumerico(14, 'VL_SLD_CRED_ST_TRAN SPORTAR'), Campo(15, 'DEB_ESP_ST'), ] + nivel = 3 class RegistroE220(Registro): """ @@ -2225,9 +2612,10 @@ class RegistroE220(Registro): CampoFixo(1, 'REG', 'E220'), Campo(2, 'COD_AJ_APUR'), Campo(3, 'DESCR_COMPL_AJ'), - Campo(4, 'VL_AJ_APUR'), + CampoNumerico(4, 'VL_AJ_APUR'), ] + nivel = 4 class RegistroE230(Registro): """ @@ -2242,6 +2630,7 @@ class RegistroE230(Registro): Campo(6, 'TXT_COMPL'), ] + nivel = 5 class RegistroE240(Registro): """ @@ -2255,11 +2644,12 @@ class RegistroE240(Registro): Campo(4, 'SER'), Campo(5, 'SUB'), Campo(6, 'NUM_DOC'), - Campo(7, 'DT_DOC'), + CampoData(7, 'DT_DOC'), Campo(8, 'COD_ITEM'), - Campo(9, 'VL_AJ_ITEM'), + CampoNumerico(9, 'VL_AJ_ITEM'), ] + nivel = 5 class RegistroE250(Registro): """ @@ -2268,8 +2658,8 @@ class RegistroE250(Registro): campos = [ CampoFixo(1, 'REG', 'E250'), Campo(2, 'COD_OR'), - Campo(3, 'VL_OR'), - Campo(4, 'DT_VCTO'), + CampoNumerico(3, 'VL_OR'), + CampoData(4, 'DT_VCTO'), Campo(5, 'COD_REC'), Campo(6, 'NUM_PROC'), Campo(7, 'IND_PROC'), @@ -2278,6 +2668,7 @@ class RegistroE250(Registro): Campo(10, 'MES_REF'), ] + nivel = 4 class RegistroE300(Registro): """ @@ -2291,6 +2682,7 @@ class RegistroE300(Registro): CampoData(4, 'DT_FIN'), ] + nivel = 2 class RegistroE310(Registro): """ @@ -2301,28 +2693,83 @@ class RegistroE310(Registro): campos = [ CampoFixo(1, 'REG', 'E310'), Campo(2, 'IND_MOV_FCP_DIFAL'), - Campo(3, 'VL_SLD_CRED_ANT_DIFAL'), - Campo(4, 'VL_TOT_DEBITOS_DIFAL'), - Campo(5, 'VL_OUT_DEB_DIFAL'), - Campo(6, 'VL_TOT_CREDITOS_DIFAL'), - Campo(7, 'VL_OUT_CRED_DIFAL'), - Campo(8, 'VL_SLD_DEV_ANT_DIFAL'), - Campo(9, 'VL_DEDUCOES_DIFAL'), - Campo(10, 'VL_RECOL_DIFAL'), - Campo(11, 'VL_SLD_CRED_TRANSPORTAR_DIFAL'), + CampoNumerico(3, 'VL_SLD_CRED_ANT_DIFAL'), + CampoNumerico(4, 'VL_TOT_DEBITOS_DIFAL'), + CampoNumerico(5, 'VL_OUT_DEB_DIFAL'), + CampoNumerico(6, 'VL_TOT_CREDITOS_DIFAL'), + CampoNumerico(7, 'VL_OUT_CRED_DIFAL'), + CampoNumerico(8, 'VL_SLD_DEV_ANT_DIFAL'), + CampoNumerico(9, 'VL_DEDUCOES_DIFAL'), + CampoNumerico(10, 'VL_RECOL_DIFAL'), + CampoNumerico(11, 'VL_SLD_CRED_TRANSPORTAR_DIFAL'), Campo(12, 'DEB_ESP_DIFAL'), - Campo(13, 'VL_SLD_CRED_ANT_FCP'), - Campo(14, 'VL_TOT_DEB_FCP'), - Campo(15, 'VL_OUT_DEB_FCP'), - Campo(16, 'VL_TOT_CRED_FCP'), - Campo(17, 'VL_OUT_CRED_FCP'), - Campo(18, 'VL_SLD_DEV_ANT_FCP'), - Campo(19, 'VL_DEDUCOES_FCP'), - Campo(20, 'VL_RECOL_FCP'), - Campo(21, 'VL_SLD_CRED_TRANSPORTAR_FCP'), + CampoNumerico(13, 'VL_SLD_CRED_ANT_FCP'), + CampoNumerico(14, 'VL_TOT_DEB_FCP'), + CampoNumerico(15, 'VL_OUT_DEB_FCP'), + CampoNumerico(16, 'VL_TOT_CRED_FCP'), + CampoNumerico(17, 'VL_OUT_CRED_FCP'), + CampoNumerico(18, 'VL_SLD_DEV_ANT_FCP'), + CampoNumerico(19, 'VL_DEDUCOES_FCP'), + CampoNumerico(20, 'VL_RECOL_FCP'), + CampoNumerico(21, 'VL_SLD_CRED_TRANSPORTAR_FCP'), Campo(22, 'DEB_ESP_FCP'), ] + nivel = 3 + +class RegistroE311(Registro): + """ + AJUSTE/BENEFÍCIO/INCENTIVO DA APURAÇÃO DO FUNDO DE + COMBATE À POBREZA E DO ICMS DIFERENCIAL DE ALÍQUOTA UF + ORIGEM/DESTINO EC 87/15 + """ + campos = [ + CampoFixo(1, 'REG', 'E311'), + Campo(2, 'COD_AJ_APUR'), + Campo(3, 'DESCR_COMPL_AJ'), + CampoNumerico(4, 'VL_AJ_APUR'), + ] + + nivel = 4 + +class RegistroE312(Registro): + """ + REGISTRO E312: INFORMAÇÕES ADICIONAIS DOS AJUSTES DA APURAÇÃO DO + FUNDO DE COMBATE À POBREZA E DO ICMS DIFERENCIAL DE ALÍQUOTA UF + ORIGEM/DESTINO EC 87/15 + """ + campos = [ + CampoFixo(1, 'REG', 'E312'), + Campo(2, 'NUM_DA'), + Campo(3, 'NUM_PROC'), + Campo(4, 'IND_PROC'), + Campo(5, 'PROC'), + Campo(6, 'TXT_COMPL'), + ] + + nivel = 5 + +class RegistroE313(Registro): + """ + INFORMAÇÕES ADICIONAIS DOS AJUSTES DA APURAÇÃO DO + FUNDO DE COMBATE À POBREZA E DO ICMS DIFERENCIAL DE ALÍQUOTA UF + ORIGEM/DESTINO EC 87/15 - IDENTIFICAÇÃO DOS DOCUMENTOS FISCAIS + """ + campos = [ + CampoFixo(1, 'REG', 'E313'), + Campo(2, 'COD_PART'), + Campo(3, 'COD_MOD'), + Campo(4, 'SER'), + Campo(5, 'SUB'), + Campo(6, 'NUM_DOC'), + CampoChaveEletronica(7, 'CHV_DOCe'), + CampoData(8, 'DT_DOC'), + Campo(9, 'COD_ITEM'), + CampoNumerico(10, 'VL_AJ_ITEM'), + ] + + nivel = 5 + class RegistroE316(Registro): """ OBRIGAÇÕES RECOLHIDAS OU A RECOLHER – FUNDO DE @@ -2332,8 +2779,8 @@ class RegistroE316(Registro): campos = [ CampoFixo(1, 'REG', 'E316'), Campo(2, 'COD_OR'), - Campo(3, 'VL_OR'), - Campo(4, 'DT_VCTO'), + CampoNumerico(3, 'VL_OR'), + CampoData(4, 'DT_VCTO'), Campo(5, 'COD_REC'), Campo(6, 'NUM_PROC'), Campo(7, 'IND_PROC'), @@ -2342,6 +2789,7 @@ class RegistroE316(Registro): Campo(10, 'MES_REF'), ] + nivel = 4 class RegistroE500(Registro): """ @@ -2354,6 +2802,7 @@ class RegistroE500(Registro): CampoData(4, 'DT_FIN'), ] + nivel = 2 class RegistroE510(Registro): """ @@ -2363,11 +2812,12 @@ class RegistroE510(Registro): CampoFixo(1, 'REG', 'E510'), Campo(2, 'CFOP'), Campo(3, 'CST_IPI'), - Campo(4, 'VL_CONT_IPI'), - Campo(5, 'VL_BC_IPI'), - Campo(6, 'VL_IPI'), + CampoNumerico(4, 'VL_CONT_IPI'), + CampoNumerico(5, 'VL_BC_IPI'), + CampoNumerico(6, 'VL_IPI'), ] + nivel = 3 class RegistroE520(Registro): """ @@ -2375,15 +2825,16 @@ class RegistroE520(Registro): """ campos = [ CampoFixo(1, 'REG', 'E520'), - Campo(2, 'VL_SD_ANT_IPI'), - Campo(3, 'VL_DEB_IPI'), - Campo(4, 'VL_CRED_IPI'), - Campo(5, 'VL_OD_IPI'), - Campo(6, 'VL_OC_IPI'), - Campo(7, 'VL_SC_IPI'), - Campo(8, 'VL_SD_IPI'), + CampoNumerico(2, 'VL_SD_ANT_IPI'), + CampoNumerico(3, 'VL_DEB_IPI'), + CampoNumerico(4, 'VL_CRED_IPI'), + CampoNumerico(5, 'VL_OD_IPI'), + CampoNumerico(6, 'VL_OC_IPI'), + CampoNumerico(7, 'VL_SC_IPI'), + CampoNumerico(8, 'VL_SD_IPI'), ] + nivel = 3 class RegistroE530(Registro): """ @@ -2392,13 +2843,34 @@ class RegistroE530(Registro): campos = [ CampoFixo(1, 'REG', 'E530'), Campo(2, 'IND_AJ'), - Campo(3, 'VL_AJ'), + CampoNumerico(3, 'VL_AJ'), Campo(4, 'COD_AJ'), Campo(5, 'IND_DOC'), Campo(6, 'NUM_DOC'), Campo(7, 'DESCR_AJ'), ] + nivel = 4 + +class RegistroE531(Registro): + """ + INFORMAÇÕES ADICIONAIS DOS AJUSTES DA APURAÇÃO DO IPI – + IDENTIFICAÇÃO DOS DOCUMENTOS FISCAIS (01 e 55) + """ + campos = [ + CampoFixo(1, 'REG', 'E531'), + Campo(2, 'COD_PART'), + Campo(3, 'COD_MOD'), + Campo(4, 'SER'), + Campo(5, 'SUB'), + Campo(6, 'NUM_DOC'), + CampoData(7, 'DT_DOC'), + CampoNumerico(8, 'COD_ITEM'), + CampoNumerico(9, 'VL_AJ_ITEM'), + CampoChaveEletronica(10, 'CHV_NFE'), + ] + + nivel = 5 class RegistroE990(Registro): """ @@ -2409,6 +2881,7 @@ class RegistroE990(Registro): CampoNumerico(2, 'QTD_LIN_E'), ] + nivel = 1 class RegistroG001(Registro): """ @@ -2419,6 +2892,7 @@ class RegistroG001(Registro): Campo(2, 'IND_MOV'), ] + nivel = 1 class RegistroG110(Registro): """ @@ -2430,13 +2904,14 @@ class RegistroG110(Registro): CampoData(3, 'DT_FIN'), Campo(4, 'SALDO_IN_ICMS'), Campo(5, 'SOM_PARC'), - Campo(6, 'VL_TRIB_EXP'), - Campo(7, 'VL_TOTAL'), + CampoNumerico(6, 'VL_TRIB_EXP'), + CampoNumerico(7, 'VL_TOTAL'), Campo(8, 'IND_PER_SAI'), Campo(9, 'ICMS_APROP'), Campo(10, 'SOM_ICMS_OC'), ] + nivel = 2 class RegistroG125(Registro): """ @@ -2445,16 +2920,17 @@ class RegistroG125(Registro): campos = [ CampoFixo(1, 'REG', 'G125'), Campo(2, 'COD_IND_BEM'), - Campo(3, 'DT_MOV'), + CampoData(3, 'DT_MOV'), Campo(4, 'TIPO_MOV'), - Campo(5, 'VL_IMOB_ICMS_OP'), - Campo(6, 'VL_IMOB_ICMS_ST'), - Campo(7, 'VL_IMOB_ICMS_FRT'), - Campo(8, 'VL_IMOB_ICMS_DIF'), + CampoNumerico(5, 'VL_IMOB_ICMS_OP'), + CampoNumerico(6, 'VL_IMOB_ICMS_ST'), + CampoNumerico(7, 'VL_IMOB_ICMS_FRT'), + CampoNumerico(8, 'VL_IMOB_ICMS_DIF'), Campo(9, 'NUM_PARC'), - Campo(10, 'VL_PARC_PASS'), + CampoNumerico(10, 'VL_PARC_PASS'), ] + nivel = 3 class RegistroG126(Registro): """ @@ -2465,13 +2941,14 @@ class RegistroG126(Registro): CampoData(2, 'DT_INI'), CampoData(3, 'DT_FIN'), Campo(4, 'NUM_PARC'), - Campo(5, 'VL_PARC_PASS'), - Campo(6, 'VL_TRIB_OC'), - Campo(7, 'VL_TOTAL'), + CampoNumerico(5, 'VL_PARC_PASS'), + CampoNumerico(6, 'VL_TRIB_OC'), + CampoNumerico(7, 'VL_TOTAL'), Campo(8, 'IND_PER_SAI'), - Campo(9, 'VL_PARC_APRO P'), + CampoNumerico(9, 'VL_PARC_APRO P'), ] + nivel = 4 class RegistroG130(Registro): """ @@ -2484,10 +2961,11 @@ class RegistroG130(Registro): Campo(4, 'COD_MOD'), Campo(5, 'SERIE'), Campo(6, 'NUM_DOC'), - Campo(7, 'CHV_NFE_CTE'), - Campo(8, 'DT_DOC'), + CampoChaveEletronica(7, 'CHV_NFE_CTE'), + CampoData(8, 'DT_DOC'), ] + nivel = 4 class RegistroG140(Registro): """ @@ -2499,6 +2977,7 @@ class RegistroG140(Registro): Campo(3, 'COD_ITEM'), ] + nivel = 5 class RegistroG990(Registro): """ @@ -2509,6 +2988,7 @@ class RegistroG990(Registro): CampoNumerico(2, 'QTD_LIN_G'), ] + nivel = 1 class RegistroH001(Registro): """ @@ -2519,6 +2999,7 @@ class RegistroH001(Registro): Campo(2, 'IND_MOV'), ] + nivel = 1 class RegistroH005(Registro): """ @@ -2531,6 +3012,7 @@ class RegistroH005(Registro): Campo(4, 'MOT_INV'), ] + nivel = 2 class RegistroH010(Registro): """ @@ -2550,6 +3032,7 @@ class RegistroH010(Registro): CampoNumerico(11, 'VL_ITEM_IR'), ] + nivel = 3 class RegistroH020(Registro): """ @@ -2559,9 +3042,10 @@ class RegistroH020(Registro): CampoFixo(1, 'REG', 'H020'), Campo(2, 'CST_ICMS'), Campo(3, 'BC_ICMS'), - Campo(4, 'VL_ICMS'), + CampoNumerico(4, 'VL_ICMS'), ] + nivel = 4 class RegistroH990(Registro): """ @@ -2572,6 +3056,7 @@ class RegistroH990(Registro): CampoNumerico(2, 'QTD_LIN_H'), ] + nivel = 1 class RegistroK001(Registro): """ @@ -2582,6 +3067,7 @@ class RegistroK001(Registro): Campo(2, 'IND_MOV'), ] + nivel = 1 class RegistroK100(Registro): """ @@ -2593,6 +3079,7 @@ class RegistroK100(Registro): CampoData(3, 'DT_FIN'), ] + nivel = 2 class RegistroK200(Registro): """ @@ -2607,6 +3094,34 @@ class RegistroK200(Registro): Campo(6, 'COD_PART'), ] + nivel = 3 + +class RegistroK210(Registro): + """ + DESMONTAGEM DE MERCADORIAS – ITEM DE ORIGE + """ + campos = [ + CampoFixo(1, 'REG', 'K210'), + CampoData(2, 'DT_INI_OS'), + CampoData(3, 'DT_FIN_OS'), + Campo(4, 'COD_DOC_OS'), + Campo(5, 'COD_ITEM_ORI'), + CampoNumerico(6, 'QTD_ORI'), + ] + + nivel = 3 + +class RegistroK215(Registro): + """ + DESMONTAGEM DE MERCADORIAS – ITENS DE DESTINO + """ + campos = [ + CampoFixo(1, 'REG', 'K215'), + Campo(2, 'COD_ITEM_DES'), + Campo(3, 'QTD_DES'), + ] + + nivel = 4 class RegistroK220(Registro): """ @@ -2620,6 +3135,7 @@ class RegistroK220(Registro): CampoNumerico(5, 'QTD'), ] + nivel = 3 class RegistroK230(Registro): """ @@ -2634,6 +3150,7 @@ class RegistroK230(Registro): CampoNumerico(6, 'QTD_ENC'), ] + nivel = 3 class RegistroK235(Registro): """ @@ -2647,6 +3164,7 @@ class RegistroK235(Registro): Campo(5, 'COD_INS_SUBST'), ] + nivel = 4 class RegistroK250(Registro): """ @@ -2659,6 +3177,7 @@ class RegistroK250(Registro): CampoNumerico(4, 'QTD'), ] + nivel = 3 class RegistroK255(Registro): """ @@ -2672,6 +3191,161 @@ class RegistroK255(Registro): Campo(5, 'COD_INS_SUBST'), ] + nivel = 4 + +class RegistroK260(Registro): + """ + REPROCESSAMENTO/REPARO DE PRODUTO/INSUMO + """ + campos = [ + CampoFixo(1, 'REG', 'K260'), + Campo(2, 'OD_OP_OS'), + Campo(3, 'COD_ITEM'), + CampoData(4, 'DT_SAIDA'), + Campo(5, 'QTD_SAIDA'), + CampoData(6, 'DT_RET'), + Campo(7, 'QTD_RET'), + ] + + nivel = 3 + +class RegistroK265(Registro): + """ + REPROCESSAMENTO/REPARO – MERCADORIAS CONSUMIDAS E/OU + RETORNADAS + """ + campos = [ + CampoFixo(1, 'REG', 'K265'), + Campo(2, 'COD_ITEM'), + Campo(3, 'QTD_CONS'), + Campo(4, 'QTD_RET'), + ] + + nivel = 4 + +class RegistroK270(Registro): + """ + CORREÇÃO DE APONTAMENTO DOS REGISTROS K210, K220, K230, + K250, K260, K291, K292, K301 E K302 + """ + campos = [ + CampoFixo(1, 'REG', 'K270'), + CampoData(2, 'DT_INI_AP'), + CampoData(3, 'DT_FIN_AP'), + Campo(4, 'COD_OP_OS'), + Campo(5, 'COD_ITEM'), + Campo(6, 'QTD_COR_POS'), + Campo(7, 'QTD_COR_NEG'), + Campo(8, 'ORIGEM'), + ] + + nivel = 3 + +class RegistroK275(Registro): + """ + CORREÇÃO DE APONTAMENTO E RETORNO DE INSUMOS DOS + REGISTROS K215, K220, K235, K255 E K265. + """ + campos = [ + CampoFixo(1, 'REG', 'K275'), + Campo(2, 'COD_ITEM'), + Campo(3, 'QTD_COR_POS'), + Campo(4, 'QTD_COR_NEG'), + Campo(5, 'COD_INS_SUBST'), + ] + + nivel = 4 + +class RegistroK280(Registro): + """ + CORREÇÃO DE APONTAMENTO – ESTOQUE ESCRITURADO + """ + campos = [ + CampoFixo(1, 'REG', 'K280'), + CampoData(2, 'DT_EST'), + Campo(3, 'COD_ITEM'), + Campo(4, 'QTD_COR_POS'), + Campo(5, 'QTD_COR_NEG'), + Campo(6, 'IND_EST'), + Campo(7, 'COD_PART'), + ] + + nivel = 3 + +class RegistroK290(Registro): + """ + PRODUÇÃO CONJUNTA – ORDEM DE PRODUÇÃO + """ + campos = [ + CampoFixo(1, 'REG', 'K290'), + CampoData(2, 'DT_INI_OP'), + CampoData(3, 'DT_FIN_OP'), + Campo(4, 'COD_DOC_OP'), + ] + + nivel = 3 + +class RegistroK291(Registro): + """ + PRODUÇÃO CONJUNTA – ITENS PRODUZIDOS + """ + campos = [ + CampoFixo(1, 'REG', 'K291'), + Campo(2, 'COD_ITEM'), + Campo(3, 'QTD'), + ] + + nivel = 4 + +class RegistroK292(Registro): + """ + PRODUÇÃO CONJUNTA – INSUMOS CONSUMIDOS + """ + campos = [ + CampoFixo(1, 'REG', 'K292'), + Campo(2, 'COD_ITEM'), + Campo(3, 'QTD'), + ] + + nivel = 4 + +class RegistroK300(Registro): + """ + PRODUÇÃO CONJUNTA – INDUSTRIALIZAÇÃO EFETUADA POR + TERCEIROS + """ + campos = [ + CampoFixo(1, 'REG', 'K300'), + CampoData(2, 'DT_PROD'), + ] + + nivel = 3 + +class RegistroK301(Registro): + """ + PRODUÇÃO CONJUNTA – INDUSTRIALIZAÇÃO EFETUADA POR + TERCEIROS – ITENS PRODUZIDOS + """ + campos = [ + CampoFixo(1, 'REG', 'K301'), + Campo(2, 'COD_ITEM'), + Campo(3, 'QTD'), + ] + + nivel = 4 + +class RegistroK302(Registro): + """ + PRODUÇÃO CONJUNTA – INDUSTRIALIZAÇÃO EFETUADA POR + TERCEIROS – INSUMOS CONSUMIDOS + """ + campos = [ + CampoFixo(1, 'REG', 'K302'), + Campo(2, 'COD_ITEM'), + Campo(3, 'QTD'), + ] + + nivel = 4 class RegistroK990(Registro): """ @@ -2682,6 +3356,7 @@ class RegistroK990(Registro): CampoNumerico(2, 'QTD_LIN_K'), ] + nivel = 1 class Registro1001(Registro): """ @@ -2692,6 +3367,7 @@ class Registro1001(Registro): Campo(2, 'IND_MOV'), ] + nivel = 1 class Registro1010(Registro): """ @@ -2713,6 +3389,7 @@ class Registro1010(Registro): Campo(13, 'IND_GIAF4'), ] + nivel = 2 class Registro1100(Registro): """ @@ -2722,17 +3399,18 @@ class Registro1100(Registro): CampoFixo(1, 'REG', '1100'), Campo(2, 'IND_DOC'), Campo(3, 'NRO_DE'), - Campo(4, 'DT_DE'), + CampoData(4, 'DT_DE'), Campo(5, 'NAT_EXP'), Campo(6, 'NRO_RE'), - Campo(7, 'DT_RE'), + CampoData(7, 'DT_RE'), Campo(8, 'CHC_EMB'), - Campo(9, 'DT_CHC'), - Campo(10, 'DT_AVB'), + CampoData(9, 'DT_CHC'), + CampoData(10, 'DT_AVB'), Campo(11, 'TP_CHC'), Campo(12, 'PAIS'), ] + nivel = 2 class Registro1105(Registro): """ @@ -2743,11 +3421,12 @@ class Registro1105(Registro): Campo(2, 'COD_MOD'), Campo(3, 'SERIE'), Campo(4, 'NUM_DOC'), - Campo(5, 'CHV_NFE'), - Campo(6, 'DT_DOC'), + CampoChaveEletronica(5, 'CHV_NFE'), + CampoData(6, 'DT_DOC'), Campo(7, 'COD_ITEM'), ] + nivel = 3 class Registro1110(Registro): """ @@ -2759,13 +3438,14 @@ class Registro1110(Registro): Campo(3, 'COD_MOD'), Campo(4, 'SER'), Campo(5, 'NUM_DOC'), - Campo(6, 'DT_DOC'), - Campo(7, 'CHV_NFE'), + CampoData(6, 'DT_DOC'), + CampoChaveEletronica(7, 'CHV_NFE'), Campo(8, 'NR_ MEMO'), Campo(9, 'QTD'), Campo(10, 'UNID'), ] + nivel = 4 class Registro1200(Registro): """ @@ -2781,6 +3461,7 @@ class Registro1200(Registro): Campo(7, 'SLD_CRED_FIM'), ] + nivel = 2 class Registro1210(Registro): """ @@ -2792,6 +3473,7 @@ class Registro1210(Registro): Campo(3, 'NR_DOC'), ] + nivel = 3 class Registro1300(Registro): """ @@ -2800,7 +3482,7 @@ class Registro1300(Registro): campos = [ CampoFixo(1, 'REG', '1300'), Campo(2, 'COD_ITEM'), - Campo(3, 'DT_FECH'), + CampoData(3, 'DT_FECH'), Campo(4, 'ESTQ_ABERT'), Campo(5, 'VOL_ENTR'), Campo(6, 'VOL_DISP'), @@ -2811,6 +3493,7 @@ class Registro1300(Registro): Campo(11, 'FECH_FISICO'), ] + nivel = 2 class Registro1310(Registro): """ @@ -2829,6 +3512,7 @@ class Registro1310(Registro): Campo(10, 'FECH_FISICO'), ] + nivel = 3 class Registro1320(Registro): """ @@ -2840,7 +3524,7 @@ class Registro1320(Registro): Campo(3, 'NR_INTERV'), Campo(4, 'MOT_INTERV'), Campo(5, 'NOM_INTERV'), - Campo(6, 'CNPJ_INTERV'), + CampoCNPJ(6, 'CNPJ_INTERV'), Campo(7, 'CPF_INTERV'), Campo(8, 'VAL_FECHA'), Campo(9, 'VAL_ABERT'), @@ -2848,6 +3532,7 @@ class Registro1320(Registro): Campo(11, 'VOL_VENDAS'), ] + nivel = 4 class Registro1350(Registro): """ @@ -2861,6 +3546,7 @@ class Registro1350(Registro): Campo(5, 'TIPO_MEDICAO'), ] + nivel = 2 class Registro1360(Registro): """ @@ -2869,9 +3555,10 @@ class Registro1360(Registro): campos = [ CampoFixo(1, 'REG', '1360'), Campo(2, 'NUM_LACRE'), - Campo(3, 'DT_APLICACAO'), + CampoData(3, 'DT_APLICACAO'), ] + nivel = 3 class Registro1370(Registro): """ @@ -2884,6 +3571,7 @@ class Registro1370(Registro): Campo(4, 'NUM_TANQUE'), ] + nivel = 3 class Registro1390(Registro): """ @@ -2894,6 +3582,7 @@ class Registro1390(Registro): Campo(2, 'COD_PROD'), ] + nivel = 2 class Registro1391(Registro): """ @@ -2901,7 +3590,7 @@ class Registro1391(Registro): """ campos = [ CampoFixo(1, 'REG', '1391'), - Campo(2, 'DT_REGISTRO'), + CampoData(2, 'DT_REGISTRO'), Campo(3, 'QTD_MOID'), Campo(4, 'ESTQ_INI'), Campo(5, 'QTD_PRODUZ'), @@ -2919,6 +3608,7 @@ class Registro1391(Registro): Campo(17, 'OBS'), ] + nivel = 3 class Registro1400(Registro): """ @@ -2931,6 +3621,7 @@ class Registro1400(Registro): Campo(4, 'VALOR'), ] + nivel = 2 class Registro1500(Registro): """ @@ -2947,25 +3638,26 @@ class Registro1500(Registro): Campo(8, 'SUB'), Campo(9, 'COD_CONS'), Campo(10, 'NUM_DOC'), - Campo(11, 'DT_DOC'), - Campo(12, 'DT_E_S'), - Campo(13, 'VL_DOC'), - Campo(14, 'VL_DESC'), - Campo(15, 'VL_FORN'), - Campo(16, 'VL_SERV_NT'), - Campo(17, 'VL_TERC'), - Campo(18, 'VL_DA'), - Campo(19, 'VL_BC_ICMS'), - Campo(20, 'VL_ICMS'), - Campo(21, 'VL_BC_ICMS_ST'), - Campo(22, 'VL_ICMS_ST'), + CampoData(11, 'DT_DOC'), + CampoData(12, 'DT_E_S'), + CampoNumerico(13, 'VL_DOC'), + CampoNumerico(14, 'VL_DESC'), + CampoNumerico(15, 'VL_FORN'), + CampoNumerico(16, 'VL_SERV_NT'), + CampoNumerico(17, 'VL_TERC'), + CampoNumerico(18, 'VL_DA'), + CampoNumerico(19, 'VL_BC_ICMS'), + CampoNumerico(20, 'VL_ICMS'), + CampoNumerico(21, 'VL_BC_ICMS_ST'), + CampoNumerico(22, 'VL_ICMS_ST'), Campo(23, 'COD_INF'), - Campo(24, 'VL_PIS'), - Campo(25, 'VL_COFINS'), + CampoNumerico(24, 'VL_PIS'), + CampoNumerico(25, 'VL_COFINS'), Campo(26, 'TP_LIGACAO'), Campo(27, 'COD_GRUPO_TENSAO'), ] + nivel = 2 class Registro1510(Registro): """ @@ -2978,23 +3670,24 @@ class Registro1510(Registro): Campo(4, 'COD_CLASS'), Campo(5, 'QTD'), Campo(6, 'UNID'), - Campo(7, 'VL_ITEM'), - Campo(8, 'VL_DESC'), + CampoNumerico(7, 'VL_ITEM'), + CampoNumerico(8, 'VL_DESC'), Campo(9, 'CST_ICMS'), Campo(10, 'CFOP'), - Campo(11, 'VL_BC_ICMS'), + CampoNumerico(11, 'VL_BC_ICMS'), Campo(12, 'ALIQ_ICMS'), - Campo(13, 'VL_ICMS'), - Campo(14, 'VL_BC_ICMS_ST'), + CampoNumerico(13, 'VL_ICMS'), + CampoNumerico(14, 'VL_BC_ICMS_ST'), Campo(15, 'ALIQ_ST'), - Campo(16, 'VL_ICMS_ST'), + CampoNumerico(16, 'VL_ICMS_ST'), Campo(17, 'IND_REC'), Campo(18, 'COD_PART'), - Campo(19, 'VL_PIS'), - Campo(20, 'VL_COFINS'), + CampoNumerico(19, 'VL_PIS'), + CampoNumerico(20, 'VL_COFINS'), Campo(21, 'COD_CTA'), ] + nivel = 3 class Registro1600(Registro): """ @@ -3007,6 +3700,7 @@ class Registro1600(Registro): Campo(4, 'TOT_DEBITO'), ] + nivel = 2 class Registro1700(Registro): """ @@ -3023,6 +3717,7 @@ class Registro1700(Registro): Campo(8, 'NUM_AUT'), ] + nivel = 2 class Registro1710(Registro): """ @@ -3034,6 +3729,7 @@ class Registro1710(Registro): Campo(3, 'NUM_DOC_FIN'), ] + nivel = 3 class Registro1800(Registro): """ @@ -3041,17 +3737,18 @@ class Registro1800(Registro): """ campos = [ CampoFixo(1, 'REG', '1800'), - Campo(2, 'VL_CARGA'), - Campo(3, 'VL_PASS'), - Campo(4, 'VL_FAT'), + CampoNumerico(2, 'VL_CARGA'), + CampoNumerico(3, 'VL_PASS'), + CampoNumerico(4, 'VL_FAT'), Campo(5, 'IND_RAT'), - Campo(6, 'VL_ICMS_ANT'), - Campo(7, 'VL_BC_ICMS'), - Campo(8, 'VL_ICMS_APUR'), - Campo(9, 'VL_BC_ICMS_APUR'), - Campo(10, 'VL_DIF'), + CampoNumerico(6, 'VL_ICMS_ANT'), + CampoNumerico(7, 'VL_BC_ICMS'), + CampoNumerico(8, 'VL_ICMS_APUR'), + CampoNumerico(9, 'VL_BC_ICMS_APUR'), + CampoNumerico(10, 'VL_DIF'), ] + nivel = 2 class Registro1900(Registro): """ @@ -3063,6 +3760,7 @@ class Registro1900(Registro): Campo(3, 'DESCR_COMPL_OUT_APUR'), ] + nivel = 2 class Registro1910(Registro): """ @@ -3074,6 +3772,7 @@ class Registro1910(Registro): CampoData(3, 'DT_FIN'), ] + nivel = 3 class Registro1920(Registro): """ @@ -3081,20 +3780,21 @@ class Registro1920(Registro): """ campos = [ CampoFixo(1, 'REG', '1920'), - Campo(2, 'VL_TOT_TRANSF_DEBITOS_OA'), - Campo(3, 'VL_TOT_AJ_DEBITOS_OA'), - Campo(4, 'VL_ESTORNOS_CRED_OA'), - Campo(5, 'VL_TOT_TRANSF_CREDITOS_OA'), - Campo(6, 'VL_TOT_AJ_CREDITOS_OA'), - Campo(7, 'VL_ESTORNOS_DEB_OA'), - Campo(8, 'VL_SLD_CREDOR_ANT_OA'), - Campo(9, 'VL_SLD_APURADO_OA'), - Campo(10, 'VL_TOT_DED'), - Campo(11, 'VL_ICMS_RECOLHER_OA'), - Campo(12, 'VL_SLD_CREDOR_TRANSP_OA'), + CampoNumerico(2, 'VL_TOT_TRANSF_DEBITOS_OA'), + CampoNumerico(3, 'VL_TOT_AJ_DEBITOS_OA'), + CampoNumerico(4, 'VL_ESTORNOS_CRED_OA'), + CampoNumerico(5, 'VL_TOT_TRANSF_CREDITOS_OA'), + CampoNumerico(6, 'VL_TOT_AJ_CREDITOS_OA'), + CampoNumerico(7, 'VL_ESTORNOS_DEB_OA'), + CampoNumerico(8, 'VL_SLD_CREDOR_ANT_OA'), + CampoNumerico(9, 'VL_SLD_APURADO_OA'), + CampoNumerico(10, 'VL_TOT_DED'), + CampoNumerico(11, 'VL_ICMS_RECOLHER_OA'), + CampoNumerico(12, 'VL_SLD_CREDOR_TRANSP_OA'), Campo(13, 'DEB_ESP_OA'), ] + nivel = 4 class Registro1921(Registro): """ @@ -3103,9 +3803,10 @@ class Registro1921(Registro): campos = [ CampoFixo(1, 'REG', '1921'), Campo(2, 'COD_AJ_APUR'), - Campo(3, 'VL_AJ_APUR'), + CampoNumerico(3, 'VL_AJ_APUR'), ] + nivel = 5 class Registro1922(Registro): """ @@ -3120,6 +3821,7 @@ class Registro1922(Registro): Campo(6, 'TXT_COMPL'), ] + nivel = 6 class Registro1923(Registro): """ @@ -3132,11 +3834,12 @@ class Registro1923(Registro): Campo(4, 'SER'), Campo(5, 'SUB'), Campo(6, 'NUM_DOC'), - Campo(7, 'DT_DOC'), + CampoData(7, 'DT_DOC'), Campo(8, 'COD_ITEM'), - Campo(9, 'VL_AJ_ITEM'), + CampoNumerico(9, 'VL_AJ_ITEM'), ] + nivel = 6 class Registro1925(Registro): """ @@ -3145,10 +3848,11 @@ class Registro1925(Registro): campos = [ CampoFixo(1, 'REG', '1925'), Campo(2, 'COD_INF_ADIC'), - Campo(3, 'VL_INF_ADIC'), + CampoNumerico(3, 'VL_INF_ADIC'), Campo(4, 'DESCR_COMPL_AJ'), ] + nivel = 5 class Registro1926(Registro): """ @@ -3157,8 +3861,8 @@ class Registro1926(Registro): campos = [ CampoFixo(1, 'REG', '1926'), Campo(2, 'COD_OR'), - Campo(3, 'VL_OR'), - Campo(4, 'DT_VCTO'), + CampoNumerico(3, 'VL_OR'), + CampoData(4, 'DT_VCTO'), Campo(5, 'COD_REC'), Campo(6, 'NUM_PROC'), Campo(7, 'IND_PROC'), @@ -3167,6 +3871,93 @@ class Registro1926(Registro): Campo(10, 'MES_REF'), ] + nivel = 5 + +class Registro1960(Registro): + """ + GIAF 1 - GUIA DE INFORMAÇÃO E APURAÇÃO DE INCENTIVOS + FISCAIS E FINANCEIROS: INDÚSTRIA (CRÉDITO PRESUMIDO) + """ + campos = [ + CampoFixo(1, 'REG', '1960'), + Campo(2, 'IND_AP'), + CampoNumerico(3, 'G1_01'), + CampoNumerico(4, 'G1_02'), + CampoNumerico(5, 'G1_03'), + CampoNumerico(6, 'G1_04'), + CampoNumerico(7, 'G1_05'), + CampoNumerico(8, 'G1_06'), + CampoNumerico(9, 'G1_07'), + CampoNumerico(10, 'G1_08'), + CampoNumerico(11, 'G1_09'), + CampoNumerico(12, 'G1_10'), + CampoNumerico(13, 'G1_11'), + ] + + nivel = 2 + +class Registro1970(Registro): + """ + GIAF 3 - GUIA DE INFORMAÇÃO E APURAÇÃO DE INCENTIVOS + FISCAIS E FINANCEIROS: IMPORTAÇÃO (DIFERIMENTO NA ENTRADA E CRÉDITO + PRESUMIDO NA SAÍDA SUBSEQUENTE + """ + campos = [ + CampoFixo(1, 'REG', '1970'), + Campo(2, 'IND_AP'), + CampoNumerico(3, 'G3_01'), + CampoNumerico(4, 'G3_02'), + CampoNumerico(5, 'G3_03'), + CampoNumerico(6, 'G3_04'), + CampoNumerico(7, 'G3_05'), + CampoNumerico(8, 'G3_06'), + CampoNumerico(9, 'G3_07'), + CampoNumerico(10, 'G3_T'), + CampoNumerico(11, 'G3_08'), + CampoNumerico(12, 'G3_09'), + ] + + nivel = 2 + +class Registro1975(Registro): + """ + GIAF 3 - GUIA DE INFORMAÇÃO E APURAÇÃO DE INCENTIVOS + FISCAIS E FINANCEIROS: IMPORTAÇÃO (SAÍDAS INTERNAS POR FAIXA DE + ALÍQUOTA) + """ + campos = [ + CampoFixo(1, 'REG', '1975'), + CampoNumerico(2, 'ALIQ_IMP_BASE'), + CampoNumerico(3, 'G3_10'), + CampoNumerico(4, 'G3_11'), + CampoNumerico(5, 'G3_12'), + ] + + nivel = 3 + +class Registro1980(Registro): + """ + GIAF 4 GUIA DE INFORMAÇÃO E APURAÇÃO DE INCENTIVOS + FISCAIS E FINANCEIROS: CENTRAL DE DISTRIBUIÇÃO (ENTRADAS/SAÍDAS + """ + campos = [ + CampoFixo(1, 'REG', '1980'), + CampoNumerico(2, 'IND_AP'), + CampoNumerico(3, 'G4_01'), + CampoNumerico(4, 'G4_02'), + CampoNumerico(5, 'G4_03'), + CampoNumerico(6, 'G4_04'), + CampoNumerico(7, 'G4_05'), + CampoNumerico(8, 'G4_06'), + CampoNumerico(9, 'G4_07'), + CampoNumerico(10, 'G4_08'), + CampoNumerico(11, 'G4_09'), + CampoNumerico(12, 'G4_10'), + CampoNumerico(13, 'G4_11'), + CampoNumerico(14, 'G4_12'), + ] + + nivel = 2 class Registro1990(Registro): """ @@ -3177,6 +3968,7 @@ class Registro1990(Registro): CampoNumerico(2, 'QTD_LIN_1'), ] + nivel = 1 class Registro9001(Registro): """ @@ -3187,6 +3979,7 @@ class Registro9001(Registro): Campo(2, 'IND_MOV'), ] + nivel = 1 class Registro9900(Registro): """ @@ -3198,6 +3991,7 @@ class Registro9900(Registro): Campo(3, 'QTD_REG_BLC'), ] + nivel = 2 class Registro9990(Registro): """ @@ -3208,6 +4002,7 @@ class Registro9990(Registro): CampoNumerico(2, 'QTD_LIN_9'), ] + nivel = 1 class Registro9999(Registro): """ @@ -3217,3 +4012,5 @@ class Registro9999(Registro): CampoFixo(1, 'REG', '9999'), CampoNumerico(2, 'QTD_LIN'), ] + + nivel = 0 diff --git a/sped/efd/pis_cofins/blocos.py b/sped/efd/pis_cofins/blocos.py index 5246afa..5be42b7 100644 --- a/sped/efd/pis_cofins/blocos.py +++ b/sped/efd/pis_cofins/blocos.py @@ -30,7 +30,6 @@ class Bloco0(Bloco): registro_abertura = Registro0001() registro_encerramento = Registro0990() - class BlocoA(Bloco): """ Documentos Fiscais - Serviços (ISS) @@ -38,7 +37,6 @@ class BlocoA(Bloco): registro_abertura = RegistroA001() registro_encerramento = RegistroA990() - class BlocoC(Bloco): """ Documentos Fiscais I – Mercadorias (ICMS/IPI) @@ -99,5 +97,5 @@ class Bloco9(Bloco): """ Controle e Encerramento do Arquivo Digital """ - registro_abertura = Registro0001() - registro_encerramento = Registro0990() + registro_abertura = Registro9001() + registro_encerramento = Registro9990() diff --git a/sped/efd/pis_cofins/registros.py b/sped/efd/pis_cofins/registros.py index fc1762b..4011dc0 100644 --- a/sped/efd/pis_cofins/registros.py +++ b/sped/efd/pis_cofins/registros.py @@ -1,13 +1,16 @@ # -*- coding: utf-8 -*- +from ...registros import Registro from ...campos import Campo -from ...campos import CampoAlfanumerico -from ...campos import CampoCNPJ from ...campos import CampoData from ...campos import CampoFixo from ...campos import CampoNumerico +from ...campos import CampoAlfanumerico from ...campos import CampoRegex -from ...registros import Registro +from ...campos import CampoCNPJ +from ...campos import CampoCPF +from ...campos import CampoCPFouCNPJ +from ...campos import CampoChaveEletronica class Registro0000(Registro): @@ -39,7 +42,8 @@ class Registro0000(Registro): Campo(13, 'IND_NAT_PJ'), Campo(14, 'IND_ATIV', obrigatorio=True), ] - + + nivel = 0 class Registro0001(Registro): """ @@ -49,7 +53,8 @@ class Registro0001(Registro): CampoFixo(1, 'REG', '0001'), Campo(2, 'IND_MOV', obrigatorio=True) ] - + + nivel = 1 class Registro0035(Registro): """ @@ -61,7 +66,8 @@ class Registro0035(Registro): Campo(3, 'DESC_SCP', obrigatorio=True), Campo(4, 'INF_COMP', obrigatorio=True), ] - + + nivel = 2 class Registro0100(Registro): """ @@ -70,7 +76,7 @@ class Registro0100(Registro): campos = [ CampoFixo(1, 'REG', '0100'), Campo(2, 'NOME', obrigatorio=True), - Campo(3, 'CPF', obrigatorio=True), + CampoCPF(3, 'CPF', obrigatorio=True), Campo(4, 'CRC', obrigatorio=True), CampoCNPJ(5, 'CNPJ'), Campo(6, 'CEP'), @@ -83,7 +89,8 @@ class Registro0100(Registro): Campo(13, 'EMAIL'), Campo(14, 'COD_MUN'), ] - + + nivel = 2 class Registro0110(Registro): """ @@ -96,7 +103,8 @@ class Registro0110(Registro): Campo(4, 'COD_TIPO_CONT'), Campo(5, 'IND_REG_CUM'), ] - + + nivel = 2 class Registro0111(Registro): """ @@ -110,7 +118,8 @@ class Registro0111(Registro): CampoNumerico(5, 'REC_BRU_CUM', obrigatorio=True), CampoNumerico(6, 'REC_BRU_TOTAL', obrigatorio=True), ] - + + nivel = 3 class Registro0120(Registro): """ @@ -121,7 +130,8 @@ class Registro0120(Registro): Campo(2, 'MES_DISPENSA', obrigatorio=True), Campo(3, 'INF_COMP'), ] - + + nivel = 2 class Registro0140(Registro): """ @@ -138,7 +148,8 @@ class Registro0140(Registro): Campo(8, 'IM'), Campo(9, 'SUFRAMA'), ] - + + nivel = 2 class Registro0145(Registro): """ @@ -152,7 +163,8 @@ class Registro0145(Registro): CampoNumerico(5, 'VL_REC_DEMAIS_ATIV'), Campo(6, 'INFO_COMPL'), ] - + + nivel = 3 class Registro0150(Registro): """ @@ -164,7 +176,7 @@ class Registro0150(Registro): Campo(3, 'NOME', obrigatorio=True), Campo(4, 'COD_PAIS', obrigatorio=True), CampoCNPJ(5, 'CNPJ'), - Campo(6, 'CPF'), + CampoCPF(6, 'CPF'), Campo(7, 'IE'), Campo(8, 'COD_MUN'), Campo(9, 'SUFRAMA'), @@ -173,7 +185,8 @@ class Registro0150(Registro): Campo(12, 'COMPL'), Campo(13, 'BAIRRO'), ] - + + nivel = 3 class Registro0190(Registro): """ @@ -184,7 +197,8 @@ class Registro0190(Registro): Campo(2, 'UNID', obrigatorio=True), Campo(3, 'DESCR', obrigatorio=True), ] - + + nivel = 3 class Registro0200(Registro): """ @@ -204,7 +218,8 @@ class Registro0200(Registro): Campo(11, 'COD_LST'), CampoNumerico(12, 'ALIQ_ICMS'), ] - + + nivel = 3 class Registro0205(Registro): """ @@ -217,7 +232,8 @@ class Registro0205(Registro): CampoData(4, 'DT_FIM', obrigatorio=True), Campo(5, 'COD_ANT_ITEM'), ] - + + nivel = 4 class Registro0206(Registro): """ @@ -227,7 +243,8 @@ class Registro0206(Registro): CampoFixo(1, 'REG', '0206'), Campo(2, 'COD_COMB', obrigatorio=True), ] - + + nivel = 4 class Registro0208(Registro): """ @@ -239,7 +256,8 @@ class Registro0208(Registro): Campo(3, 'COD_GRU', obrigatorio=True), Campo(4, 'MARCA_COM', obrigatorio=True), ] - + + nivel = 4 class Registro0400(Registro): """ @@ -250,7 +268,8 @@ class Registro0400(Registro): Campo(2, 'COD_NAT', obrigatorio=True), Campo(3, 'DESCR_NAT', obrigatorio=True), ] - + + nivel = 3 class Registro0450(Registro): """ @@ -261,7 +280,8 @@ class Registro0450(Registro): Campo(2, 'COD_INF', obrigatorio=True), Campo(3, 'TXT', obrigatorio=True), ] - + + nivel = 3 class Registro0500(Registro): """ @@ -278,7 +298,8 @@ class Registro0500(Registro): Campo(8, 'COD_CTA_REF'), CampoCNPJ(9, 'CNPJ_EST'), ] - + + nivel = 2 class Registro0600(Registro): """ @@ -290,7 +311,32 @@ class Registro0600(Registro): Campo(3, 'COD_CCUS', obrigatorio=True), Campo(4, 'CCUS', obrigatorio=True), ] + + nivel = 2 +class Registro0900(Registro): + """ + Composição das Receitas do Período - Receita Bruta e Demais Receitas + """ + campos = [ + CampoFixo(1, 'REG', '0900'), + CampoNumerico(2, 'REC_TOTAL_BLOCO_A', obrigatorio=True), + CampoNumerico(3, 'REC_NRB_BLOCO_A'), + CampoNumerico(4, 'REC_TOTAL_BLOCO_C', obrigatorio=True), + CampoNumerico(5, 'REC_NRB_BLOCO_C'), + CampoNumerico(6, 'REC_TOTAL_BLOCO_D', obrigatorio=True), + CampoNumerico(7, 'REC_NRB_BLOCO_D'), + CampoNumerico(8, 'REC_TOTAL_BLOCO_F', obrigatorio=True), + CampoNumerico(9, 'REC_NRB_BLOCO_F'), + CampoNumerico(10, 'REC_TOTAL_BLOCO_I', obrigatorio=True), + CampoNumerico(11, 'REC_NRB_BLOCO_I'), + CampoNumerico(12, 'REC_TOTAL_BLOCO_1', obrigatorio=True), + CampoNumerico(13, 'REC_NRB_BLOCO_1'), + CampoNumerico(14, 'REC_TOTAL_PERIODO', obrigatorio=True), + CampoNumerico(15, 'REC_TOTAL_NRB_PERÍODO'), + ] + + nivel = 2 class Registro0990(Registro): """ @@ -300,7 +346,9 @@ class Registro0990(Registro): CampoFixo(1, 'REG', '0990'), CampoNumerico(2, 'QTD_LIN_0', obrigatorio=True), ] - + + nivel = 1 + class RegistroA001(Registro): """ @@ -310,7 +358,8 @@ class RegistroA001(Registro): CampoFixo(1, 'REG', 'A001'), Campo(2, 'IND_MOV', obrigatorio=True), ] - + + nivel = 1 class RegistroA010(Registro): """ @@ -320,7 +369,7 @@ class RegistroA010(Registro): CampoFixo(1, 'REG', 'A010'), CampoCNPJ(2, 'CNPJ', obrigatorio=True), ] - + nivel = 2 class RegistroA100(Registro): """ @@ -335,7 +384,7 @@ class RegistroA100(Registro): Campo(6, 'SER'), Campo(7, 'SUB'), Campo(8, 'NUM_DOC', obrigatorio=True), - Campo(9, 'CHV_NFSE'), + CampoChaveEletronica(9, 'CHV_NFSE'), CampoData(10, 'DT_DOC', obrigatorio=True), CampoData(11, 'DT_EXE_SERV', obrigatorio=True), CampoNumerico(12, 'VL_DOC'), @@ -349,7 +398,7 @@ class RegistroA100(Registro): CampoNumerico(20, 'VL_COFINS_RET'), CampoNumerico(21, 'VL_ISS'), ] - + nivel = 3 class RegistroA110(Registro): """ @@ -360,7 +409,8 @@ class RegistroA110(Registro): Campo(2, 'COD_INF', obrigatorio=True), Campo(3, 'TXT_COMPL'), ] - + + nivel = 4 class RegistroA111(Registro): """ @@ -371,7 +421,8 @@ class RegistroA111(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroA120(Registro): """ @@ -388,7 +439,8 @@ class RegistroA120(Registro): CampoData(8, 'DT_PAG_COFINS'), Campo(9, 'LOC_EXE_SERV', obrigatorio=True), ] - + + nivel = 4 class RegistroA170(Registro): """ @@ -414,7 +466,8 @@ class RegistroA170(Registro): Campo(17, 'COD_CTA'), Campo(18, 'COD_CCUS'), ] - + + nivel = 4 class RegistroA990(Registro): """ @@ -424,7 +477,8 @@ class RegistroA990(Registro): CampoFixo(1, 'REG', 'A990'), CampoNumerico(2, 'QTD_LIN_A', obrigatorio=True), ] - + + nivel = 1 class RegistroC001(Registro): """ @@ -434,7 +488,8 @@ class RegistroC001(Registro): CampoFixo(1, 'REG', 'C001'), Campo(2, 'IND_MOV', obrigatorio=True), ] - + + nivel = 1 class RegistroC010(Registro): """ @@ -445,7 +500,8 @@ class RegistroC010(Registro): CampoCNPJ(2, 'CNPJ', obrigatorio=True), Campo(3, 'IND_ESCRI'), ] - + + nivel = 2 class RegistroC100(Registro): """ @@ -457,15 +513,15 @@ class RegistroC100(Registro): Campo(2, 'IND_OPER', obrigatorio=True), Campo(3, 'IND_EMIT', obrigatorio=True), Campo(4, 'COD_PART', obrigatorio=True), - Campo(5, 'COD_MOD', obrigatorio=True), - Campo(6, 'COD_SIT;', obrigatorio=True), + Campo(5, 'COD_MOD', obrigatorio=True), + Campo(6, 'COD_SIT', obrigatorio=True), Campo(7, 'SER'), Campo(8, 'NUM_DOC', obrigatorio=True), - Campo(9, 'CHV_NFE'), - Campo(10, 'CHV_NFE', obrigatorio=True), - CampoData(11, 'DT_DOC'), - CampoData(12, 'DT_E_S', obrigatorio=True), - CampoNumerico(13, 'VL_DOC', obrigatorio=True), + CampoChaveEletronica(9, 'CHV_NFE'), + CampoData(10, 'DT_DOC', obrigatorio=True), + CampoData(11, 'DT_E_S'), + CampoNumerico(12, 'VL_DOC', obrigatorio=True), + CampoNumerico(13, 'IND_PGTO', obrigatorio=True), CampoNumerico(14, 'VL_DESC'), CampoNumerico(15, 'VL_ABAT_NT'), CampoNumerico(16, 'VL_MERC'), @@ -483,7 +539,8 @@ class RegistroC100(Registro): CampoNumerico(28, 'VL_PIS_ST'), CampoNumerico(29, 'VL_COFINS_ST'), ] - + + nivel = 3 class RegistroC110(Registro): """ @@ -494,7 +551,8 @@ class RegistroC110(Registro): Campo(2, 'COD_INF', obrigatorio=True), Campo(3, 'TXT_COMPL'), ] - + + nivel = 4 class RegistroC111(Registro): """ @@ -505,7 +563,8 @@ class RegistroC111(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroC120(Registro): """ @@ -519,7 +578,8 @@ class RegistroC120(Registro): CampoNumerico(5, 'VL_COFINS_IMP'), Campo(6, 'NUM_ACDRAW'), ] - + + nivel = 4 class RegistroC170(Registro): """ @@ -527,16 +587,16 @@ class RegistroC170(Registro): """ campos = [ CampoFixo(1, 'REG', 'C170'), - Campo(2, 'NUM_ITEM', obrigatorio=True), + CampoNumerico(2, 'NUM_ITEM', obrigatorio=True), Campo(3, 'COD_ITEM', obrigatorio=True), Campo(4, 'DESCR_COMPL'), - Campo(5, 'QTD'), + CampoNumerico(5, 'QTD'), Campo(6, 'UNID'), CampoNumerico(7, 'VL_ITEM', obrigatorio=True), CampoNumerico(8, 'VL_DESC'), Campo(9, 'IND_MOV'), - Campo(10, 'CST_ICMS'), - Campo(11, 'CFOP', obrigatorio=True), + CampoNumerico(10, 'CST_ICMS'), + CampoNumerico(11, 'CFOP', obrigatorio=True), Campo(12, 'COD_NAT'), CampoNumerico(13, 'VL_BC_ICMS'), CampoNumerico(14, 'ALIQ_ICMS'), @@ -550,21 +610,22 @@ class RegistroC170(Registro): CampoNumerico(22, 'VL_BC_IPI'), CampoNumerico(23, 'ALIQ_IPI'), CampoNumerico(24, 'VL_IPI'), - Campo(25, 'CST_PIS', obrigatorio=True), + CampoNumerico(25, 'CST_PIS', obrigatorio=True), CampoNumerico(26, 'VL_BC_PIS'), CampoNumerico(27, 'ALIQ_PIS'), - Campo(28, 'QUANT_BC_PIS'), + CampoNumerico(28, 'QUANT_BC_PIS'), CampoNumerico(29, 'ALIQ_PIS_QUANT'), CampoNumerico(30, 'VL_PIS'), - Campo(31, 'CST_COFINS', obrigatorio=True), + CampoNumerico(31, 'CST_COFINS', obrigatorio=True), CampoNumerico(32, 'VL_BC_COFINS'), CampoNumerico(33, 'ALIQ_COFINS'), - Campo(34, 'QUANT_BC_COFINS'), + CampoNumerico(34, 'QUANT_BC_COFINS'), CampoNumerico(35, 'ALIQ_COFINS_QUANT'), CampoNumerico(36, 'VL_COFINS'), Campo(37, 'COD_CTA'), ] - + + nivel = 4 class RegistroC175(Registro): """ @@ -590,7 +651,8 @@ class RegistroC175(Registro): Campo(17, 'COD_CTA'), Campo(18, 'INFO_COMPL'), ] - + + nivel = 4 class RegistroC180(Registro): """ @@ -606,7 +668,8 @@ class RegistroC180(Registro): Campo(7, 'EX_IPI'), CampoNumerico(8, 'VL_TOT_ITEM', obrigatorio=True), ] - + + nivel = 3 class RegistroC181(Registro): """ @@ -625,7 +688,8 @@ class RegistroC181(Registro): CampoNumerico(10, 'VL_PIS'), Campo(11, 'COD_CTA'), ] - + + nivel = 4 class RegistroC185(Registro): """ @@ -644,7 +708,8 @@ class RegistroC185(Registro): CampoNumerico(10, 'VL_COFINS'), Campo(11, 'COD_CTA'), ] - + + nivel = 4 class RegistroC188(Registro): """ @@ -655,7 +720,8 @@ class RegistroC188(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroC190(Registro): """ @@ -672,7 +738,8 @@ class RegistroC190(Registro): Campo(7, 'EX_IPI'), CampoNumerico(8, 'VL_TOT_ITEM', obrigatorio=True), ] - + + nivel = 3 class RegistroC191(Registro): """ @@ -681,7 +748,7 @@ class RegistroC191(Registro): """ campos = [ CampoFixo(1, 'REG', 'C191'), - Campo(2, 'CNPJ_CPF_PART', obrigatorio=True), + CampoCPFouCNPJ(2, 'CNPJ_CPF_PART', obrigatorio=True), Campo(3, 'CST_PIS', obrigatorio=True), Campo(4, 'CFOP', obrigatorio=True), CampoNumerico(5, 'VL_ITEM', obrigatorio=True), @@ -693,7 +760,8 @@ class RegistroC191(Registro): CampoNumerico(11, 'VL_PIS'), Campo(12, 'COD_CTA'), ] - + + nivel = 4 class RegistroC195(Registro): """ @@ -702,7 +770,7 @@ class RegistroC195(Registro): """ campos = [ CampoFixo(1, 'REG', 'C195'), - Campo(2, 'CNPJ_CPF_PART', obrigatorio=True), + CampoCPFouCNPJ(2, 'CNPJ_CPF_PART', obrigatorio=True), Campo(3, 'CST_COFINS', obrigatorio=True), Campo(4, 'CFOP', obrigatorio=True), CampoNumerico(5, 'VL_ITEM', obrigatorio=True), @@ -714,7 +782,8 @@ class RegistroC195(Registro): CampoNumerico(11, 'VL_COFINS'), Campo(12, 'COD_CTA'), ] - + + nivel = 4 class RegistroC198(Registro): """ @@ -725,7 +794,8 @@ class RegistroC198(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroC199(Registro): """ @@ -739,7 +809,8 @@ class RegistroC199(Registro): CampoNumerico(5, 'VL_COFINS_IMP'), Campo(6, 'NUM_ACDRAW'), ] - + + nivel = 4 class RegistroC380(Registro): """ @@ -755,7 +826,8 @@ class RegistroC380(Registro): CampoNumerico(7, 'VL_DOC', obrigatorio=True), CampoNumerico(8, 'VL_DOC_CANC', obrigatorio=True), ] - + + nivel = 3 class RegistroC381(Registro): """ @@ -773,7 +845,8 @@ class RegistroC381(Registro): CampoNumerico(9, 'VL_PIS', obrigatorio=True), Campo(10, 'COD_CTA'), ] - + + nivel = 4 class RegistroC385(Registro): """ @@ -791,7 +864,8 @@ class RegistroC385(Registro): CampoNumerico(9, 'VL_COFINS', obrigatorio=True), Campo(10, 'COD_CTA'), ] - + + nivel = 4 class RegistroC395(Registro): """ @@ -807,7 +881,8 @@ class RegistroC395(Registro): CampoData(7, 'DT_DOC', obrigatorio=True), CampoNumerico(8, 'VL_DOC', obrigatorio=True), ] - + + nivel = 3 class RegistroC396(Registro): """ @@ -829,7 +904,8 @@ class RegistroC396(Registro): CampoNumerico(13, 'VL_COFINS'), Campo(14, 'COD_CTA'), ] - + + nivel = 4 class RegistroC400(Registro): """ @@ -842,7 +918,8 @@ class RegistroC400(Registro): Campo(4, 'ECF_FAB', obrigatorio=True), Campo(5, 'ECF_CX', obrigatorio=True), ] - + + nivel = 3 class RegistroC405(Registro): """ @@ -857,7 +934,8 @@ class RegistroC405(Registro): Campo(6, 'GT_FIN', obrigatorio=True), CampoNumerico(7, 'VL_BRT', obrigatorio=True), ] - + + nivel = 4 class RegistroC481(Registro): """ @@ -875,7 +953,8 @@ class RegistroC481(Registro): Campo(9, 'COD_ITEM'), Campo(10, 'COD_CTA'), ] - + + nivel = 5 class RegistroC485(Registro): """ @@ -893,7 +972,8 @@ class RegistroC485(Registro): Campo(9, 'COD_ITEM'), Campo(10, 'COD_CTA'), ] - + + nivel = 5 class RegistroC489(Registro): """ @@ -904,7 +984,8 @@ class RegistroC489(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroC490(Registro): """ @@ -916,7 +997,8 @@ class RegistroC490(Registro): CampoData(3, 'DT_DOC_FIN', obrigatorio=True), Campo(4, 'COD_MOD', obrigatorio=True), ] - + + nivel = 3 class RegistroC491(Registro): """ @@ -935,7 +1017,8 @@ class RegistroC491(Registro): CampoNumerico(10, 'VL_PIS'), Campo(11, 'COD_CTA'), ] - + + nivel = 4 class RegistroC495(Registro): """ @@ -954,7 +1037,8 @@ class RegistroC495(Registro): CampoNumerico(10, 'VL_COFINS'), Campo(11, 'COD_CTA'), ] - + + nivel = 4 class RegistroC499(Registro): """ @@ -965,7 +1049,8 @@ class RegistroC499(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroC500(Registro): """ @@ -988,7 +1073,8 @@ class RegistroC500(Registro): CampoNumerico(13, 'VL_PIS'), CampoNumerico(14, 'VL_COFINS'), ] - + + nivel = 3 class RegistroC501(Registro): """ @@ -1004,7 +1090,8 @@ class RegistroC501(Registro): CampoNumerico(7, 'VL_PIS', obrigatorio=True), Campo(8, 'COD_CTA'), ] - + + nivel = 4 class RegistroC505(Registro): """ @@ -1020,7 +1107,8 @@ class RegistroC505(Registro): CampoNumerico(7, 'VL_COFINS', obrigatorio=True), Campo(8, 'COD_CTA'), ] - + + nivel = 4 class RegistroC509(Registro): """ @@ -1031,7 +1119,8 @@ class RegistroC509(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroC600(Registro): """ @@ -1063,7 +1152,8 @@ class RegistroC600(Registro): CampoNumerico(21, 'VL_PIS', obrigatorio=True), CampoNumerico(22, 'VL_COFINS', obrigatorio=True), ] - + + nivel = 3 class RegistroC601(Registro): """ @@ -1078,7 +1168,8 @@ class RegistroC601(Registro): CampoNumerico(6, 'VL_PIS', obrigatorio=True), Campo(7, 'COD_CTA'), ] - + + nivel = 4 class RegistroC605(Registro): """ @@ -1093,7 +1184,8 @@ class RegistroC605(Registro): CampoNumerico(6, 'VL_COFINS', obrigatorio=True), Campo(7, 'COD_CTA'), ] - + + nivel = 4 class RegistroC609(Registro): """ @@ -1104,7 +1196,8 @@ class RegistroC609(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroC800(Registro): """ @@ -1119,9 +1212,9 @@ class RegistroC800(Registro): CampoNumerico(6, 'VL_CFE', obrigatorio=True), CampoNumerico(7, 'VL_PIS'), CampoNumerico(8, 'VL_COFINS'), - Campo(9, 'CNPJ_CPF'), + CampoCPFouCNPJ(9, 'CNPJ_CPF'), Campo(10, 'NR_SAT'), - Campo(11, 'CHV_CFE'), + CampoChaveEletronica(11, 'CHV_CFE'), CampoNumerico(12, 'VL_DESC'), CampoNumerico(13, 'VL_MERC'), CampoNumerico(14, 'VL_OUT_DA'), @@ -1129,7 +1222,8 @@ class RegistroC800(Registro): CampoNumerico(16, 'VL_PIS_ST'), CampoNumerico(17, 'VL_COFINS_ST'), ] - + + nivel = 3 class RegistroC810(Registro): """ @@ -1150,7 +1244,8 @@ class RegistroC810(Registro): CampoNumerico(12, 'VL_COFINS'), Campo(13, 'COD_CTA'), ] - + + nivel = 4 class RegistroC820(Registro): """ @@ -1172,7 +1267,8 @@ class RegistroC820(Registro): CampoNumerico(12, 'VL_COFINS'), Campo(13, 'COD_CTA'), ] - + + nivel = 4 class RegistroC830(Registro): """ @@ -1183,7 +1279,8 @@ class RegistroC830(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroC860(Registro): """ @@ -1197,7 +1294,8 @@ class RegistroC860(Registro): Campo(5, 'DOC_INI'), Campo(6, 'DOC_FIM'), ] - + + nivel = 3 class RegistroC870(Registro): """ @@ -1218,7 +1316,8 @@ class RegistroC870(Registro): CampoNumerico(12, 'VL_COFINS'), Campo(13, 'COD_CTA'), ] - + + nivel = 4 class RegistroC880(Registro): """ @@ -1239,7 +1338,8 @@ class RegistroC880(Registro): CampoNumerico(12, 'VL_COFINS'), Campo(13, 'COD_CTA'), ] - + + nivel = 4 class RegistroC890(Registro): """ @@ -1250,7 +1350,8 @@ class RegistroC890(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroC990(Registro): """ @@ -1260,7 +1361,8 @@ class RegistroC990(Registro): CampoFixo(1, 'REG', 'C990'), CampoNumerico(2, 'QTD_LIN_C', obrigatorio=True), ] - + + nivel = 1 class RegistroD001(Registro): """ @@ -1270,7 +1372,8 @@ class RegistroD001(Registro): CampoFixo(1, 'REG', 'D001'), Campo(2, 'IND_MOV', obrigatorio=True), ] - + + nivel = 1 class RegistroD010(Registro): """ @@ -1280,7 +1383,8 @@ class RegistroD010(Registro): CampoFixo(1, 'REG', 'D010'), CampoCNPJ(2, 'CNPJ', obrigatorio=True), ] - + + nivel = 2 class RegistroD100(Registro): """ @@ -1296,11 +1400,11 @@ class RegistroD100(Registro): Campo(7, 'SER'), Campo(8, 'SUB'), Campo(9, 'NUM_DOC', obrigatorio=True), - Campo(10, 'CHV_CTE'), + CampoChaveEletronica(10, 'CHV_CTE'), CampoData(11, 'DT_DOC', obrigatorio=True), CampoData(12, 'DT_A_P'), Campo(13, 'TP_CT-e'), - Campo(14, 'CHV_CTE_REF'), + CampoChaveEletronica(14, 'CHV_CTE_REF'), CampoNumerico(15, 'VL_DOC', obrigatorio=True), CampoNumerico(16, 'VL_DESC'), Campo(17, 'IND_FRT', obrigatorio=True), @@ -1311,7 +1415,8 @@ class RegistroD100(Registro): Campo(22, 'COD_INF'), Campo(23, 'COD_CTA'), ] - + + nivel = 3 class RegistroD101(Registro): """ @@ -1328,7 +1433,8 @@ class RegistroD101(Registro): CampoNumerico(8, 'VL_PIS'), Campo(9, 'COD_CTA'), ] - + + nivel = 4 class RegistroD105(Registro): """ @@ -1345,7 +1451,8 @@ class RegistroD105(Registro): CampoNumerico(8, 'VL_COFINS'), Campo(9, 'COD_CTA'), ] - + + nivel = 4 class RegistroD111(Registro): """ @@ -1356,7 +1463,8 @@ class RegistroD111(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroD200(Registro): """ @@ -1375,7 +1483,8 @@ class RegistroD200(Registro): CampoNumerico(10, 'VL_DOC', obrigatorio=True), CampoNumerico(11, 'VL_DESC'), ] - + + nivel = 3 class RegistroD201(Registro): """ @@ -1390,7 +1499,8 @@ class RegistroD201(Registro): CampoNumerico(6, 'VL_PIS'), Campo(7, 'COD_CTA'), ] - + + nivel = 4 class RegistroD205(Registro): """ @@ -1405,7 +1515,8 @@ class RegistroD205(Registro): CampoNumerico(6, 'VL_COFINS'), Campo(7, 'COD_CTA'), ] - + + nivel = 4 class RegistroD209(Registro): """ @@ -1416,7 +1527,8 @@ class RegistroD209(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroD300(Registro): """ @@ -1443,7 +1555,8 @@ class RegistroD300(Registro): CampoNumerico(18, 'VL_COFINS'), Campo(19, 'COD_CTA'), ] - + + nivel = 3 class RegistroD309(Registro): """ @@ -1454,7 +1567,8 @@ class RegistroD309(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroD350(Registro): """ @@ -1485,7 +1599,8 @@ class RegistroD350(Registro): CampoNumerico(22, 'VL_COFINS'), Campo(23, 'COD_CTA'), ] - + + nivel = 3 class RegistroD359(Registro): """ @@ -1496,7 +1611,8 @@ class RegistroD359(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroD500(Registro): """ @@ -1527,7 +1643,8 @@ class RegistroD500(Registro): CampoNumerico(21, 'VL_PIS'), CampoNumerico(22, 'VL_COFINS'), ] - + + nivel = 3 class RegistroD501(Registro): """ @@ -1543,7 +1660,8 @@ class RegistroD501(Registro): CampoNumerico(7, 'VL_PIS'), Campo(8, 'COD_CTA'), ] - + + nivel = 4 class RegistroD505(Registro): """ @@ -1559,7 +1677,8 @@ class RegistroD505(Registro): CampoNumerico(7, 'VL_COFINS'), Campo(8, 'COD_CTA'), ] - + + nivel = 4 class RegistroD509(Registro): """ @@ -1570,7 +1689,8 @@ class RegistroD509(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroD600(Registro): """ @@ -1598,7 +1718,8 @@ class RegistroD600(Registro): CampoNumerico(18, 'VL_PIS'), CampoNumerico(19, 'VL_COFINS'), ] - + + nivel = 3 class RegistroD601(Registro): """ @@ -1615,7 +1736,8 @@ class RegistroD601(Registro): CampoNumerico(8, 'VL_PIS'), Campo(9, 'COD_CTA'), ] - + + nivel = 4 class RegistroD605(Registro): """ @@ -1632,7 +1754,8 @@ class RegistroD605(Registro): CampoNumerico(8, 'VL_COFINS'), Campo(9, 'COD_CTA'), ] - + + nivel = 4 class RegistroD609(Registro): """ @@ -1643,7 +1766,8 @@ class RegistroD609(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroD990(Registro): """ @@ -1653,7 +1777,8 @@ class RegistroD990(Registro): CampoFixo(1, 'REG', 'D990'), CampoNumerico(2, 'QTD_LIN_D', obrigatorio=True), ] - + + nivel = 1 class RegistroF001(Registro): """ @@ -1663,7 +1788,8 @@ class RegistroF001(Registro): CampoFixo(1, 'REG', 'F001'), Campo(2, 'IND_MOV', obrigatorio=True), ] - + + nivel = 1 class RegistroF010(Registro): """ @@ -1673,7 +1799,8 @@ class RegistroF010(Registro): CampoFixo(1, 'REG', 'F010'), CampoCNPJ(2, 'CNPJ', obrigatorio=True), ] - + + nivel = 2 class RegistroF100(Registro): """ @@ -1700,7 +1827,8 @@ class RegistroF100(Registro): Campo(18, 'COD_CCUS'), Campo(19, 'DESC_DOC_OPER'), ] - + + nivel = 3 class RegistroF111(Registro): """ @@ -1711,7 +1839,8 @@ class RegistroF111(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroF120(Registro): """ @@ -1738,7 +1867,8 @@ class RegistroF120(Registro): Campo(17, 'COD_CCUS'), Campo(18, 'DESC_BEM_IMOB'), ] - + + nivel = 3 class RegistroF129(Registro): """ @@ -1749,7 +1879,8 @@ class RegistroF129(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroF130(Registro): """ @@ -1778,7 +1909,8 @@ class RegistroF130(Registro): Campo(20, 'COD_CCUS'), Campo(21, 'DESC_BEM_IMOB'), ] - + + nivel = 3 class RegistroF139(Registro): """ @@ -1789,7 +1921,8 @@ class RegistroF139(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroF150(Registro): """ @@ -1811,7 +1944,8 @@ class RegistroF150(Registro): Campo(13, 'DESC_EST'), Campo(14, 'COD_CTA'), ] - + + nivel = 3 class RegistroF200(Registro): """ @@ -1841,7 +1975,8 @@ class RegistroF200(Registro): Campo(21, 'IND_NAT_EMP'), Campo(22, 'INF_COMP'), ] - + + nivel = 3 class RegistroF205(Registro): """ @@ -1867,7 +2002,8 @@ class RegistroF205(Registro): CampoNumerico(17, 'VL_CRED_COFINS_DESC', obrigatorio=True), CampoNumerico(18, 'VL_CRED_COFINS_DESC_FUT', obrigatorio=True), ] - + + nivel = 4 class RegistroF210(Registro): """ @@ -1886,7 +2022,8 @@ class RegistroF210(Registro): CampoNumerico(10, 'ALIQ_COFINS'), CampoNumerico(11, 'VL_CRED_COFINS_UTIL'), ] - + + nivel = 4 class RegistroF211(Registro): """ @@ -1897,7 +2034,8 @@ class RegistroF211(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroF500(Registro): """ @@ -1922,7 +2060,8 @@ class RegistroF500(Registro): Campo(15, 'COD_CTA'), Campo(16, 'INFO_COMPL'), ] - + + nivel = 3 class RegistroF509(Registro): """ @@ -1933,7 +2072,8 @@ class RegistroF509(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroF510(Registro): """ @@ -1958,7 +2098,8 @@ class RegistroF510(Registro): Campo(15, 'COD_CTA'), Campo(16, 'INFO_COMPL'), ] - + + nivel = 3 class RegistroF519(Registro): """ @@ -1969,7 +2110,8 @@ class RegistroF519(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroF525(Registro): """ @@ -1979,7 +2121,7 @@ class RegistroF525(Registro): CampoFixo(1, 'REG', 'F525'), CampoNumerico(2, 'VL_REC', obrigatorio=True), Campo(3, 'IND_REC', obrigatorio=True), - Campo(4, 'CNPJ_CPF'), + CampoCPFouCNPJ(4, 'CNPJ_CPF'), Campo(5, 'NUM_DOC'), Campo(6, 'COD_ITEM'), CampoNumerico(7, 'VL_REC_DET', obrigatorio=True), @@ -1988,7 +2130,8 @@ class RegistroF525(Registro): Campo(10, 'INFO_COMPL'), Campo(11, 'COD_CTA'), ] - + + nivel = 3 class RegistroF550(Registro): """ @@ -2013,7 +2156,8 @@ class RegistroF550(Registro): Campo(15, 'COD_CTA'), Campo(16, 'INFO_COMPL'), ] - + + nivel = 3 class RegistroF559(Registro): """ @@ -2024,7 +2168,8 @@ class RegistroF559(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroF560(Registro): """ @@ -2050,7 +2195,8 @@ class RegistroF560(Registro): Campo(15, 'COD_CTA'), Campo(16, 'INFO_COMPL'), ] - + + nivel = 3 class RegistroF569(Registro): """ @@ -2061,7 +2207,8 @@ class RegistroF569(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroF600(Registro): """ @@ -2080,7 +2227,8 @@ class RegistroF600(Registro): CampoNumerico(10, 'VL_RET_COFINS', obrigatorio=True), Campo(11, 'IND_DEC', obrigatorio=True), ] - + + nivel = 3 class RegistroF700(Registro): """ @@ -2096,7 +2244,8 @@ class RegistroF700(Registro): CampoCNPJ(7, 'CNPJ'), Campo(8, 'INF_COMP'), ] - + + nivel = 3 class RegistroF800(Registro): """ @@ -2113,7 +2262,8 @@ class RegistroF800(Registro): CampoNumerico(8, 'VL_CRED_COFINS', obrigatorio=True), Campo(9, 'PER_CRED_CIS'), ] - + + nivel = 3 class RegistroF990(Registro): """ @@ -2123,7 +2273,8 @@ class RegistroF990(Registro): CampoFixo(1, 'REG', 'F990'), CampoNumerico(2, 'QTD_LIN_F', obrigatorio=True), ] - + + nivel = 1 class RegistroI001(Registro): """ @@ -2133,7 +2284,8 @@ class RegistroI001(Registro): CampoFixo(1, 'REG', 'I001'), Campo(2, 'IND_MOV', obrigatorio=True), ] - + + nivel = 1 class RegistroI010(Registro): """ @@ -2145,7 +2297,8 @@ class RegistroI010(Registro): Campo(3, 'IND_ATIV', obrigatorio=True), Campo(4, 'INFO_COMPL'), ] - + + nivel = 2 class RegistroI100(Registro): """ @@ -2165,7 +2318,8 @@ class RegistroI100(Registro): CampoNumerico(11, 'VL_COFINS', obrigatorio=True), Campo(12, 'INFO_COMPL', obrigatorio=True), ] - + + nivel = 3 class RegistroI199(Registro): """ @@ -2176,7 +2330,8 @@ class RegistroI199(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroI200(Registro): """ @@ -2190,7 +2345,8 @@ class RegistroI200(Registro): Campo(5, 'COD_CTA', obrigatorio=True), Campo(6, 'INFO_COMPL', obrigatorio=True), ] - + + nivel = 4 class RegistroI299(Registro): """ @@ -2201,7 +2357,8 @@ class RegistroI299(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 5 class RegistroI300(Registro): """ @@ -2214,7 +2371,8 @@ class RegistroI300(Registro): Campo(4, 'COD_CTA', obrigatorio=True), Campo(5, 'INFO_COMPL', obrigatorio=True), ] - + + nivel = 5 class RegistroI399(Registro): """ @@ -2225,7 +2383,8 @@ class RegistroI399(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 6 class RegistroI990(Registro): """ @@ -2235,7 +2394,8 @@ class RegistroI990(Registro): CampoFixo(1, 'REG', 'I990'), CampoNumerico(2, 'QTD_LIN_I', obrigatorio=True), ] - + + nivel = 1 class RegistroM001(Registro): """ @@ -2245,7 +2405,7 @@ class RegistroM001(Registro): CampoFixo(1, 'REG', 'M001'), Campo(2, 'IND_MOV', obrigatorio=True), ] - + nivel = 1 class RegistroM100(Registro): """ @@ -2268,7 +2428,8 @@ class RegistroM100(Registro): CampoNumerico(14, 'VL_CRED_DESC'), Campo(15, 'SLD_CRED', obrigatorio=True), ] - + + nivel = 2 class RegistroM105(Registro): """ @@ -2286,7 +2447,8 @@ class RegistroM105(Registro): Campo(9, 'QUANT_BC_PIS'), Campo(10, 'DESC_CRED'), ] - + + nivel = 3 class RegistroM110(Registro): """ @@ -2301,7 +2463,8 @@ class RegistroM110(Registro): Campo(6, 'DESCR_AJ'), CampoData(7, 'DT_REF'), ] - + + nivel = 3 class RegistroM115(Registro): """ @@ -2318,7 +2481,8 @@ class RegistroM115(Registro): Campo(8, 'COD_CTA'), Campo(9, 'INFO_COMPL'), ] - + + nivel = 4 class RegistroM200(Registro): """ @@ -2339,7 +2503,8 @@ class RegistroM200(Registro): CampoNumerico(12, 'VL_CONT_CUM_REC', obrigatorio=True), CampoNumerico(13, 'VL_TOT_CONT_REC', obrigatorio=True), ] - + + nivel = 2 class RegistroM205(Registro): """ @@ -2351,7 +2516,8 @@ class RegistroM205(Registro): Campo(3, 'COD_REC', obrigatorio=True), CampoNumerico(4, 'VL_DEBITO', obrigatorio=True), ] - + + nivel = 3 class RegistroM210(Registro): """ @@ -2372,7 +2538,8 @@ class RegistroM210(Registro): CampoNumerico(12, 'VL_CONT_DIFER_ANT'), CampoNumerico(13, 'VL_CONT_PER', obrigatorio=True), ] - + + nivel = 3 class RegistroM211(Registro): """ @@ -2386,7 +2553,8 @@ class RegistroM211(Registro): CampoNumerico(5, 'VL_EXC_ESP_COOP'), CampoNumerico(6, 'VL_BC_CONT', obrigatorio=True), ] - + + nivel = 4 class RegistroM220(Registro): """ @@ -2401,7 +2569,8 @@ class RegistroM220(Registro): Campo(6, 'DESCR_AJ'), CampoData(7, 'DT_REF'), ] - + + nivel = 4 class RegistroM225(Registro): """ @@ -2418,7 +2587,8 @@ class RegistroM225(Registro): Campo(8, 'COD_CTA'), Campo(9, 'INFO_COMPL'), ] - + + nivel = 5 class RegistroM230(Registro): """ @@ -2433,7 +2603,8 @@ class RegistroM230(Registro): CampoNumerico(6, 'VL_CRED_DIF'), Campo(7, 'COD_CRED'), ] - + + nivel = 4 class RegistroM300(Registro): """ @@ -2449,7 +2620,8 @@ class RegistroM300(Registro): Campo(7, 'PER_APUR', obrigatorio=True), CampoData(8, 'DT_RECEB'), ] - + + nivel = 2 class RegistroM350(Registro): """ @@ -2463,7 +2635,8 @@ class RegistroM350(Registro): CampoNumerico(5, 'ALIQ_PIS_FOL', obrigatorio=True), CampoNumerico(6, 'VL_TOT_CONT_FOL', obrigatorio=True), ] - + + nivel = 2 class RegistroM400(Registro): """ @@ -2477,7 +2650,8 @@ class RegistroM400(Registro): Campo(4, 'COD_CTA'), Campo(5, 'DESC_COMPL'), ] - + + nivel = 2 class RegistroM410(Registro): """ @@ -2491,7 +2665,8 @@ class RegistroM410(Registro): Campo(4, 'COD_CTA', obrigatorio=True), Campo(5, 'DESC_COMPL', obrigatorio=True), ] - + + nivel = 3 class RegistroM500(Registro): """ @@ -2514,7 +2689,8 @@ class RegistroM500(Registro): CampoNumerico(14, 'VL_CRED_DESC'), Campo(15, 'SLD_CRED', obrigatorio=True), ] - + + nivel = 2 class RegistroM505(Registro): """ @@ -2532,7 +2708,8 @@ class RegistroM505(Registro): Campo(9, 'QUANT_BC_COFINS'), Campo(10, 'DESC_CRED'), ] - + + nivel = 3 class RegistroM510(Registro): """ @@ -2547,7 +2724,8 @@ class RegistroM510(Registro): Campo(6, 'DESCR_AJ'), CampoData(7, 'DT_REF'), ] - + + nivel = 3 class RegistroM515(Registro): """ @@ -2564,7 +2742,8 @@ class RegistroM515(Registro): Campo(8, 'COD_CTA'), Campo(9, 'INFO_COMPL'), ] - + + nivel = 4 class RegistroM600(Registro): """ @@ -2585,7 +2764,8 @@ class RegistroM600(Registro): CampoNumerico(12, 'VL_CONT_CUM_REC', obrigatorio=True), CampoNumerico(13, 'VL_TOT_CONT_REC', obrigatorio=True), ] - + + nivel = 2 class RegistroM605(Registro): """ @@ -2597,7 +2777,8 @@ class RegistroM605(Registro): Campo(3, 'COD_REC', obrigatorio=True), CampoNumerico(4, 'VL_DEBITO', obrigatorio=True), ] - + + nivel = 3 class RegistroM610(Registro): """ @@ -2618,7 +2799,8 @@ class RegistroM610(Registro): CampoNumerico(12, 'VL_CONT_DIFER_ANT'), CampoNumerico(13, 'VL_CONT_PER', obrigatorio=True), ] - + + nivel = 3 class RegistroM611(Registro): """ @@ -2632,7 +2814,8 @@ class RegistroM611(Registro): CampoNumerico(5, 'VL_EXC_ESP_COOP'), CampoNumerico(6, 'VL_BC_CONT', obrigatorio=True), ] - + + nivel = 4 class RegistroM620(Registro): """ @@ -2647,7 +2830,8 @@ class RegistroM620(Registro): Campo(6, 'DESCR_AJ'), CampoData(7, 'DT_REF'), ] - + + nivel = 4 class RegistroM625(Registro): """ @@ -2664,7 +2848,8 @@ class RegistroM625(Registro): Campo(8, 'COD_CTA'), Campo(9, 'INFO_COMPL'), ] - + + nivel = 5 class RegistroM630(Registro): """ @@ -2679,7 +2864,8 @@ class RegistroM630(Registro): CampoNumerico(6, 'VL_CRED_DIF'), Campo(7, 'COD_CRED'), ] - + + nivel = 4 class RegistroM700(Registro): """ @@ -2695,7 +2881,8 @@ class RegistroM700(Registro): Campo(7, 'PER_APUR', obrigatorio=True), CampoData(8, 'DT_RECEB'), ] - + + nivel = 2 class RegistroM800(Registro): """ @@ -2709,7 +2896,8 @@ class RegistroM800(Registro): Campo(4, 'COD_CTA'), Campo(5, 'DESC_COMPL'), ] - + + nivel = 2 class RegistroM810(Registro): """ @@ -2723,7 +2911,8 @@ class RegistroM810(Registro): Campo(4, 'COD_CTA'), Campo(5, 'DESC_COMPL'), ] - + + nivel = 3 class RegistroM990(Registro): """ @@ -2733,7 +2922,8 @@ class RegistroM990(Registro): CampoFixo(1, 'REG', 'M990'), CampoNumerico(2, 'QTD_LIN_M', obrigatorio=True), ] - + + nivel = 1 class RegistroP001(Registro): """ @@ -2743,7 +2933,8 @@ class RegistroP001(Registro): CampoFixo(1, 'REG', 'P001'), Campo(2, 'IND_MOV', obrigatorio=True), ] - + + nivel = 1 class RegistroP010(Registro): """ @@ -2753,7 +2944,8 @@ class RegistroP010(Registro): CampoFixo(1, 'REG', 'P010'), CampoCNPJ(2, 'CNPJ', obrigatorio=True), ] - + + nivel = 2 class RegistroP100(Registro): """ @@ -2773,7 +2965,8 @@ class RegistroP100(Registro): Campo(11, 'COD_CTA'), Campo(12, 'INFO_COMPL'), ] - + + nivel = 3 class RegistroP110(Registro): """ @@ -2786,7 +2979,8 @@ class RegistroP110(Registro): Campo(4, 'DET_VALOR', obrigatorio=True), Campo(5, 'INF_COMPL'), ] - + + nivel = 4 class RegistroP199(Registro): """ @@ -2797,7 +2991,8 @@ class RegistroP199(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 4 class RegistroP200(Registro): """ @@ -2812,7 +3007,8 @@ class RegistroP200(Registro): CampoNumerico(6, 'VL_TOT_CONT_DEV', obrigatorio=True), Campo(7, 'COD_REC', obrigatorio=True), ] - + + nivel = 2 class RegistroP210(Registro): """ @@ -2827,7 +3023,8 @@ class RegistroP210(Registro): Campo(6, 'DESCR_AJ'), CampoData(7, 'DT_REF'), ] - + + nivel = 3 class RegistroP990(Registro): """ @@ -2837,7 +3034,8 @@ class RegistroP990(Registro): CampoFixo(1, 'REG', 'P990'), CampoNumerico(2, 'QTD_LIN_P', obrigatorio=True), ] - + + nivel = 1 class Registro1001(Registro): """ @@ -2847,7 +3045,8 @@ class Registro1001(Registro): CampoFixo(1, 'REG', '1001'), Campo(2, 'IND_MOV', obrigatorio=True), ] - + + nivel = 1 class Registro1010(Registro): """ @@ -2862,7 +3061,43 @@ class Registro1010(Registro): Campo(6, 'DESC_DEC_JUD'), CampoData(7, 'DT_SENT_JUD'), ] + + nivel = 2 +class Registro1011(Registro): + """ + Apuração de Crédito Extemporâneo - Documentos e Operações de Períodos Anteriores – PIS/PASEP + """ + campos = [ + CampoFixo(1, 'REG', '1011'), + Campo(2, 'REG_REF'), + CampoChaveEletronica(3, 'CHAVE_DOC'), + Campo(4, 'COD_PART'), + Campo(5, 'COD_ITEM'), + CampoData(6, 'DT_OPER', obrigatorio=True), + CampoNumerico(7, 'VL_OPER', obrigatorio=True), + Campo(8, 'CST_PIS', obrigatorio=True), + CampoNumerico(9, 'VL_BC_PIS'), + CampoNumerico(10, 'ALIQ_PIS'), + CampoNumerico(11, 'VL_PIS'), + Campo(12, 'CST_COFINS', obrigatorio=True), + CampoNumerico(13, 'VL_BC_COFINS'), + CampoNumerico(14, 'ALIQ_COFINS'), + CampoNumerico(15, 'VL_COFINS'), + Campo(16, 'CST_PIS_SUSP', obrigatorio=True), + CampoNumerico(17, 'VL_BC_PIS_SUSP'), + CampoNumerico(18, 'ALIQ_PIS_SUSP'), + CampoNumerico(19, 'VL_PIS_SUSP'), + Campo(20, 'CST_COFINS_SUSP', obrigatorio=True), + CampoNumerico(21, 'VL_BC_COFINS_SUSP'), + CampoNumerico(22, 'ALIQ_COFINS_SUSP'), + CampoNumerico(23, 'VL_COFINS_SUSP'), + Campo(24, 'COD_CTA'), + Campo(25, 'COD_CCUS'), + Campo(26, 'DESC_DOC_OPER'), + ] + + nivel = 3 class Registro1020(Registro): """ @@ -2874,7 +3109,36 @@ class Registro1020(Registro): Campo(3, 'IND_NAT_ACAO', obrigatorio=True), CampoData(4, 'DT_DEC_ADM', obrigatorio=True), ] - + + nivel = 2 + +class Registro1050(Registro): + """ + Detalhamento de Ajustes de Base de Cálculo – Valores Extra Apuração + """ + campos = [ + CampoFixo(1, 'REG', '1050'), + CampoData(2, 'DT_REF'), + Campo(3, 'IND_AJ_BC'), + CampoCNPJ(4, 'CNPJ'), + CampoNumerico(5, 'VL_AJ_TOT'), + CampoNumerico(6, 'VL_AJ_CST01'), + CampoNumerico(7, 'VL_AJ_CST02'), + CampoNumerico(8, 'VL_AJ_CST03'), + CampoNumerico(9, 'VL_AJ_CST04'), + CampoNumerico(10, 'VL_AJ_CST05'), + CampoNumerico(11, 'VL_AJ_CST06'), + CampoNumerico(12, 'VL_AJ_CST07'), + CampoNumerico(13, 'VL_AJ_CST08'), + CampoNumerico(14, 'VL_AJ_CST09'), + CampoNumerico(15, 'VL_AJ_CST49'), + CampoNumerico(16, 'VL_AJ_CST99'), + Campo(17, 'IND_APROP'), + Campo(18, 'NUM_REC'), + Campo(19, 'INFO_COMPL'), + ] + + nivel = 2 class Registro1100(Registro): """ @@ -2900,7 +3164,8 @@ class Registro1100(Registro): CampoNumerico(17, 'VL_CRED_OUT'), Campo(18, 'SLD_CRED_FIM'), ] - + + nivel = 2 class Registro1101(Registro): """ @@ -2915,7 +3180,7 @@ class Registro1101(Registro): Campo(6, 'SUB_SER'), Campo(7, 'NUM_DOC'), CampoData(8, 'DT_OPER', obrigatorio=True), - Campo(9, 'CHV_NFE'), + CampoChaveEletronica(9, 'CHV_NFE'), CampoNumerico(10, 'VL_OPER', obrigatorio=True), Campo(11, 'CFOP'), Campo(12, 'NAT_BC_CRED', obrigatorio=True), @@ -2930,7 +3195,8 @@ class Registro1101(Registro): Campo(21, 'PER_ESCRIT'), CampoCNPJ(22, 'CNPJ', obrigatorio=True), ] - + + nivel = 3 class Registro1102(Registro): """ @@ -2942,7 +3208,8 @@ class Registro1102(Registro): CampoNumerico(3, 'VL_CRED_PIS_NT_MI'), CampoNumerico(4, 'VL_CRED_PIS_EXP'), ] - + + nivel = 4 class Registro1200(Registro): """ @@ -2961,7 +3228,8 @@ class Registro1200(Registro): CampoNumerico(10, 'VL_JUR'), CampoData(11, 'DT_RECOL'), ] - + + nivel = 2 class Registro1210(Registro): """ @@ -2980,7 +3248,8 @@ class Registro1210(Registro): Campo(10, 'COD_CTA'), Campo(11, 'DESC_COMPL'), ] - + + nivel = 3 class Registro1220(Registro): """ @@ -2993,7 +3262,8 @@ class Registro1220(Registro): Campo(4, 'COD_CRED', obrigatorio=True), CampoNumerico(5, 'VL_CRED', obrigatorio=True), ] - + + nivel = 3 class Registro1300(Registro): """ @@ -3009,7 +3279,8 @@ class Registro1300(Registro): CampoNumerico(7, 'VL_RET_DCOMP', obrigatorio=True), Campo(8, 'SLD_RET', obrigatorio=True), ] - + + nivel = 2 class Registro1500(Registro): """ @@ -3035,7 +3306,8 @@ class Registro1500(Registro): CampoNumerico(17, 'VL_CRED_OUT'), Campo(18, 'SLD_CRED_FIM', obrigatorio=True), ] - + + nivel = 2 class Registro1501(Registro): """ @@ -3050,7 +3322,7 @@ class Registro1501(Registro): Campo(6, 'SUB_SER'), Campo(7, 'NUM_DOC'), CampoData(8, 'DT_OPER', obrigatorio=True), - Campo(9, 'CHV_NFE'), + CampoChaveEletronica(9, 'CHV_NFE'), CampoNumerico(10, 'VL_OPER', obrigatorio=True), Campo(11, 'CFOP'), Campo(12, 'NAT_BC_CRED', obrigatorio=True), @@ -3065,7 +3337,8 @@ class Registro1501(Registro): Campo(21, 'PER_ESCRIT'), CampoCNPJ(22, 'CNPJ', obrigatorio=True), ] - + + nivel = 3 class Registro1502(Registro): """ @@ -3077,7 +3350,8 @@ class Registro1502(Registro): CampoNumerico(3, 'VL_CRED_COFINS_NT_MI'), CampoNumerico(4, 'VL_CRED_COFINS_EXP'), ] - + + nivel = 4 class Registro1600(Registro): """ @@ -3096,7 +3370,8 @@ class Registro1600(Registro): CampoNumerico(10, 'VL_JUR'), CampoData(11, 'DT_RECOL'), ] - + + nivel = 2 class Registro1610(Registro): """ @@ -3115,7 +3390,8 @@ class Registro1610(Registro): Campo(10, 'COD_CTA'), Campo(11, 'DESC_COMPL'), ] - + + nivel = 3 class Registro1620(Registro): """ @@ -3128,7 +3404,8 @@ class Registro1620(Registro): Campo(4, 'COD_CRED', obrigatorio=True), CampoNumerico(5, 'VL_CRED', obrigatorio=True), ] - + + nivel = 3 class Registro1700(Registro): """ @@ -3144,7 +3421,8 @@ class Registro1700(Registro): CampoNumerico(7, 'VL_RET_DCOMP', obrigatorio=True), Campo(8, 'SLD_RET', obrigatorio=True), ] - + + nivel = 2 class Registro1800(Registro): """ @@ -3161,7 +3439,8 @@ class Registro1800(Registro): CampoData(8, 'DT_REC_UNI'), Campo(9, 'COD_REC'), ] - + + nivel = 2 class Registro1809(Registro): """ @@ -3172,7 +3451,8 @@ class Registro1809(Registro): Campo(2, 'NUM_PROC', obrigatorio=True), Campo(3, 'IND_PROC', obrigatorio=True), ] - + + nivel = 3 class Registro1900(Registro): """ @@ -3194,7 +3474,8 @@ class Registro1900(Registro): Campo(12, 'INF_COMPL'), Campo(13, 'COD_CTA'), ] - + + nivel = 2 class Registro1990(Registro): """ @@ -3204,7 +3485,8 @@ class Registro1990(Registro): CampoFixo(1, 'REG', '1990'), CampoNumerico(2, 'QTD_LIN_1', obrigatorio=True), ] - + + nivel = 1 class Registro9001(Registro): """ @@ -3214,7 +3496,8 @@ class Registro9001(Registro): CampoFixo(1, 'REG', '9001'), Campo(2, 'IND_MOV', obrigatorio=True), ] - + + nivel = 1 class Registro9900(Registro): """ @@ -3225,7 +3508,8 @@ class Registro9900(Registro): Campo(2, 'REG_BLC', obrigatorio=True), CampoNumerico(3, 'QTD_REG_BLC', obrigatorio=True), ] - + + nivel = 2 class Registro9990(Registro): """ @@ -3235,7 +3519,8 @@ class Registro9990(Registro): CampoFixo(1, 'REG', '9990'), CampoNumerico(2, 'QTD_LIN_9', obrigatorio=True), ] - + + nivel = 1 class Registro9999(Registro): """ @@ -3245,3 +3530,5 @@ class Registro9999(Registro): CampoFixo(1, 'REG', '9999'), CampoNumerico(2, 'QTD_LIN', obrigatorio=True), ] + nivel = 0 + diff --git a/sped/registros.py b/sped/registros.py index 8a60e45..28c48bb 100644 --- a/sped/registros.py +++ b/sped/registros.py @@ -6,7 +6,7 @@ from .erros import CampoError from .erros import CampoInexistenteError from .erros import RegistroError - +import itertools class Registro(object): """ @@ -71,16 +71,24 @@ def __init__(self, line=None): for c in self.campos: if isinstance(c, CampoFixo): self._valores[c.indice] = c.valor + self._numero_da_linha = None else: - self._valores = line.split('|') + #self._valores = line.split('|') + self._valores = [valor.strip() for valor in line.split('|')] for c in self.campos: if isinstance(c, CampoFixo): if self._valores[c.indice] != c.valor: raise CampoError(self, c.nome) + # Inicializar contador na leitura do registro de abertura '0000' + # if self.__class__.__name__ == 'Registro0000': + if self._valores[1] == '0000': + Registro.contador_de_linhas = itertools.count(1) + # Informação do número da linha do arquivo sped + self._numero_da_linha = next(Registro.contador_de_linhas) @property - def campos(self): - return self.__class__.campos + def numero_da_linha(self): + return self._numero_da_linha @property def valores(self): @@ -122,7 +130,6 @@ def __str__(self): def __repr__(self): return '<%s.%s>' % (self.__class__.__module__, self.__class__.__name__) - class RegistroIndefinido(Registro): def __init__(self): super(RegistroIndefinido, self).__init__() diff --git a/sped/relatorios/__init__.py b/sped/relatorios/__init__.py new file mode 100644 index 0000000..40a96af --- /dev/null +++ b/sped/relatorios/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/sped/relatorios/efd_info.py b/sped/relatorios/efd_info.py new file mode 100644 index 0000000..fd98875 --- /dev/null +++ b/sped/relatorios/efd_info.py @@ -0,0 +1,749 @@ +# -*- coding: utf-8 -*- + +Autor = 'Claudio Fernandes de Souza Rodrigues (claudiofsr@yahoo.com)' +Data = '12 de Fevereiro de 2020 (início: 10 de Janeiro de 2020)' + +import os, re, sys, itertools, csv +import xlsxwriter # pip install xlsxwriter +from datetime import datetime +from time import time, sleep +from sped.efd.pis_cofins.arquivos import ArquivoDigital as ArquivoDigital_PIS_COFINS +from sped.efd.icms_ipi.arquivos import ArquivoDigital as ArquivoDigital_ICMS_IPI +from sped.relatorios.efd_tabelas import EFD_Tabelas +from sped.campos import CampoData, CampoCNPJ, CampoCPF, CampoCPFouCNPJ, CampoChaveEletronica, CampoNCM + +# Versão mínima exigida: python 3.6.0 +python_version = sys.version_info +if python_version < (3,6,0): + print('versão mínima exigida do python é 3.6.0') + print('versão atual', "%s.%s.%s" % (python_version[0],python_version[1],python_version[2])) + exit() + +# Python OOP: Atributos e Métodos (def, funções) +class SPED_EFD_Info: + """ + Imprimir SPED EFD Contribuições ou ICMS_IPI nos formatos .csv e .xlsx tal que + contenha todas as informações suficientes para verificar a correção dos lançamentos + ou apuração das contribuições de PIS/COFINS ou do ICMS segundo a legislação vigente. + """ + + # class or static variable + + # Python 3 Deep Dive (Part 4 - OOP)/03. Project 1/03. Project Solution - Transaction Numbers + contador_de_linhas = itertools.count(2) # 2 é o valor inicial do contador + + ### --- registros e colunas --- ### + + registros_de_data_emissao = ['DT_DOC', 'DT_DOC_INI', 'DT_REF_INI', 'DT_OPER'] # 'Data da Emissão do Documento Fiscal' + + registros_de_data_execucao = ['DT_EXE_SERV', 'DT_E_S', 'DT_ENT', 'DT_A_P', 'DT_DOC_FIN', 'DT_REF_FIN'] # 'Data da Entrada/Aquisição/Execução ou da Saída/Prestação/Conclusão' + + registros_de_data = ['DT_INI', 'DT_FIN'] + registros_de_data_emissao + registros_de_data_execucao # merge/concatenating two lists in Python + + registros_de_identificacao_do_item = ['DESCR_ITEM', 'TIPO_ITEM', 'COD_NCM'] + + registros_de_cadastro_do_participante = ['NOME_participante', 'CNPJ_participante', 'CPF_participante'] + + registros_de_plano_de_contas = ['COD_NAT_CC', 'NOME_CTA'] + + registros_de_codigo_cst = ['CST_PIS', 'CST_COFINS'] + + registros_de_chave_eletronica = ['CHV_NFE', 'CHV_CTE', 'CHV_NFSE', 'CHV_DOCe', 'CHV_CFE', 'CHV_NFE_CTE'] + + registros_de_base_de_calculo = ['VL_BC_PIS', 'VL_BC_COFINS'] + + registros_de_valor = ['VL_DOC', 'VL_BRT', 'VL_OPER', 'VL_OPR', 'VL_OPER_DEP', 'VL_BC_CRED', 'VL_BC_EST', 'VL_TOT_REC', 'VL_REC_CAIXA', 'VL_REC_COMP', 'VL_REC', 'VL_ITEM'] # adicionado 'VL_OPR' para EFD ICMS_IPI + + registros_totais = registros_de_data + registros_de_identificacao_do_item + registros_de_plano_de_contas + registros_de_codigo_cst + registros_de_chave_eletronica + registros_de_base_de_calculo + registros_de_valor + + # Imprimir as informações desta coluna, nesta ordem + colunas = ['Linhas', 'Arquivo da SPED EFD', 'Nº da Linha da EFD', 'CNPJ', 'NOME', 'Mês do Período de Apuração', 'Ano do Período de Apuração', 'Tipo de Operação', 'IND_ORIG_CRED', 'REG', 'CST Código da Situação Tributária', + 'NAT_BC_CRED', 'CFOP', 'COD_PART', *registros_de_cadastro_do_participante, 'CNPJ_CPF_PART', 'Data de Emissão', 'Data de Execução', 'COD_ITEM', *registros_de_identificacao_do_item, + 'Chave Eletrônica', 'COD_MOD', 'NUM_DOC', 'NUM_ITEM', 'COD_CTA', *registros_de_plano_de_contas, 'Valor do Item', 'Valor da Base de Cálculo', 'ALIQ_PIS', 'ALIQ_COFINS', 'CST_ICMS', 'VL_BC_ICMS', 'ALIQ_ICMS'] + + # initialize the attributes of the class + + def __init__(self, file_path=None, encoding=None, efd_tipo=None, verbose=False): + + if file_path is None or not os.path.isfile(file_path): + raise ValueError(f'O arquivo file_path = {file_path} não é válido!') + else: + self.file_path = file_path + + if encoding is None: + self.encoding = 'UTF-8' + else: + self.encoding = encoding + + if efd_tipo is None or re.search(r'PIS|COFINS|Contrib', efd_tipo, flags=re.IGNORECASE): + self.objeto_sped = ArquivoDigital_PIS_COFINS() # instanciar objeto sped_efd + self.efd_tipo = 'efd_contribuicoes' + elif re.search(r'ICMS|IPI', efd_tipo, flags=re.IGNORECASE): + self.objeto_sped = ArquivoDigital_ICMS_IPI() # instanciar objeto sped_efd + self.efd_tipo = 'efd_icms_ipi' + else: + raise ValueError(f'efd_tipo = {efd_tipo} inválido!') + + if not isinstance(verbose, bool): + raise ValueError(f'verbose deve ser uma variável boolean (True or False). verbose = {verbose} é inválido!') + else: + self.verbose = verbose + + self.basename = os.path.basename(self.file_path) + + @property + def imprimir_informacoes(self): + + self.objeto_sped.readfile(self.file_path, codificacao=self.encoding, verbose=self.verbose) + + self.info_do_participante = self.cadastro_do_participante(self.objeto_sped) + + if self.verbose: + print(f'self.info_do_participante = {self.info_do_participante} ; len(self.info_do_participante) = {len(self.info_do_participante)}\n') + + self.info_do_item = self.identificacao_do_item(self.objeto_sped) + + if self.verbose: + print(f'self.info_do_item = {self.info_do_item} ; len(self.info_do_item) = {len(self.info_do_item)}\n') + + self.info_da_conta = self.plano_de_contas_contabeis(self.objeto_sped) + + if self.verbose: + print(f'self.info_da_conta = {self.info_da_conta} ; len(self.info_da_conta) = {len(self.info_da_conta)}\n') + + self.info_de_abertura = self.obter_info_de_abertura(self.objeto_sped) + + filename, _ = os.path.splitext(self.file_path) + arquivo_csv = filename + '.csv' + arquivo_excel = filename + '.xlsx' + + # Função desabilitada + # Funçao utilizada apenas para teste + # self.imprimir_informacoes_linha_a_linha(self.objeto_sped, output_filename=arquivo_csv) + + self.imprimir_informacoes_da_efd(self.objeto_sped, output_filename=arquivo_csv) + + self.convert_csv_to_xlsx(imput_csv=arquivo_csv, output_excel=arquivo_excel) + + def __repr__(self): + # https://stackoverflow.com/questions/25577578/access-class-variable-from-instance + # Devo substituir 'self.__class__.static_var' por 'type(self).static_var' ? + return f'{type(self).__name__}(file_path={self.file_path!r}, encoding={self.encoding!r}, efd_tipo={self.efd_tipo!r}, verbose={self.verbose!r})' + + # https://radek.io/2011/07/21/static-variables-and-methods-in-python/ + @staticmethod + def natureza_da_bc_dos_creditos(cfop): + """ + http://sped.rfb.gov.br/arquivo/show/1681 + Tabela CFOP - Operações Geradoras de Créditos - Versão 1.0.0 + """ + natureza_bc = None + + # Código 01 - CFOP de 'Aquisição de Bens para Revenda' + if cfop in ['1102','1113','1117','1118','1121','1251','1403','1652','2102','2113','2117','2118','2121','2251','2403','2652','3102','3251','3652']: + natureza_bc = 1 + # Código 02 - CFOP de 'Aquisição de Bens Utilizados como Insumo' + elif cfop in ['1101','1111','1116','1120','1122','1126','1128','1401','1407','1556','1651','1653','2101','2111','2116','2120','2122','2126','2128','2401','2407','2556','2651','2653','3101','3126','3128','3556','3651','3653']: + natureza_bc = 2 + # Código 03 - CFOP de 'Aquisição de Serviços Utilizados como Insumos' + elif cfop in ['1124','1125','1933','2124','2125','2933']: + natureza_bc = 3 + # Código 12 - CFOP de 'Devolução de Vendas Sujeitas à Incidência Não-Cumulativa' + elif cfop in ['1201','1202','1203','1204','1410','1411','1660','1661','1662','2201','2202','2410','2411','2660','2661','2662']: + natureza_bc = 12 + # Código 13 - CFOP de 'Outras Operações com Direito a Crédito' + elif cfop in ['1922','2922']: + natureza_bc = 13 + + return natureza_bc + + def identidade(chave): + return chave + + def formatar_linhas(numero): + return f'{int(numero):09d}' + + def formatar_cst_contrib(codigo_cst): + try: + codigo_cst = f'{int(codigo_cst):02d}' + return f'{codigo_cst} - {EFD_Tabelas.tabela_cst_contrib[codigo_cst]}' + except: + return codigo_cst + + def formatar_cst_icms(codigo_cst): + try: + codigo_cst = f'{int(codigo_cst):03d}' + return f'{codigo_cst} - {EFD_Tabelas.tabela_cst_icms[codigo_cst]}' + except: + return codigo_cst + + def formatar_nbc(natureza_bc): + try: + natureza_bc = f'{int(natureza_bc):02d}' + return f'{natureza_bc} - {EFD_Tabelas.tabela_bc_do_credito[natureza_bc]}' + except: + return natureza_bc + + def formatar_tipo(tipo_do_item): + try: + tipo_do_item = f'{int(tipo_do_item):02d}' + return f'{tipo_do_item} - {EFD_Tabelas.tabela_tipo_do_item[tipo_do_item]}' + except: + return tipo_do_item + + def formatar_mod(doc_fiscal): + try: + return f'{doc_fiscal} - {EFD_Tabelas.tabela_modelos_documentos_fiscais[doc_fiscal]}' + except: + return doc_fiscal + + # dict[key] = funtion_key(value) ; Definido apenas uma vez ; + # Ao escolher uma chave, o dicionário aplica uma função (que depende da chave) sobre o valor ; Ordem O(1) + # Caso fossem utilizados vários if/then/else (ou select) a Ordem seria O(N), que é mais lento! + myDict = {} + for col in sorted(set(registros_totais + colunas)): + + match_linha = re.search(r'^Linhas', col, flags=re.IGNORECASE) + match_data = re.search(r'^DT_|Data', col, flags=re.IGNORECASE) + match_chave = re.search(r'^CHV_|Chave Eletrônica', col, flags=re.IGNORECASE) + match_ncm = re.search(r'COD_NCM', col, flags=re.IGNORECASE) + match_cnpj = re.search(r'CNPJ', col, flags=re.IGNORECASE) + match_cpf = re.search(r'CPF', col, flags=re.IGNORECASE) + match_nbc = re.search(r'NAT_BC_CRED', col, flags=re.IGNORECASE) + match_tipo = re.search(r'TIPO_ITEM', col, flags=re.IGNORECASE) + match_mod = re.search(r'COD_MOD', col, flags=re.IGNORECASE) + + match_cst_contib = re.search(r'^CST_(PIS|COFINS)|CST Código da Situação Tributária', col, flags=re.IGNORECASE) + match_cst_icms = re.search(r'^CST_ICMS', col, flags=re.IGNORECASE) + + myDict[col] = identidade + + # Estes vários if/elif/elif/... são executados apenas uma vez na definição da classe. + if match_linha: + myDict[col] = formatar_linhas + elif match_data: + myDict[col] = CampoData.formatar + elif match_chave: + myDict[col] = CampoChaveEletronica.formatar + elif match_ncm: + myDict[col] = CampoNCM.formatar + elif match_nbc: + myDict[col] = formatar_nbc + elif match_tipo: + myDict[col] = formatar_tipo + elif match_mod: + myDict[col] = formatar_mod + elif match_cst_contib: + myDict[col] = formatar_cst_contrib + elif match_cst_icms: + myDict[col] = formatar_cst_icms + + if match_cnpj and match_cpf: + myDict[col] = CampoCPFouCNPJ.formatar + elif match_cnpj: + myDict[col] = CampoCNPJ.formatar + elif match_cpf: + myDict[col] = CampoCPF.formatar + + if False: + for idx, key in enumerate(myDict.keys(),1): + print(f'{key:>40}: [{idx:>2}] {myDict[key]}') + + def formatar_valor(self,nome,val): + """ + Evitar n repetições de 'if condicao_j then A_j else B_j' tal que 1 <= j <= n, usar dicionário: myDict[key] = funtion_key(value) + Better optimization technique using if/else or dictionary + A series of if/else statement which receives the 'string' returns the appropriate function for it. (Around 40-50 if/else statements). + A dictionary maintaining the key-value pair. key as strings, and values as the function objects, and one main function to search and return the function object. + """ + # https://stackoverflow.com/questions/11445226/better-optimization-technique-using-if-else-or-dictionary + # https://softwareengineering.stackexchange.com/questions/182093/why-store-a-function-inside-a-python-dictionary/182095 + # https://stackoverflow.com/questions/9168340/using-a-dictionary-to-select-function-to-execute + try: + # https://stackoverflow.com/questions/25577578/access-class-variable-from-instance + # val_formated = self.__class__.myDict[nome](val) + val_formated = type(self).myDict[nome](val) + except: + val_formated = val + #print(f'nome = {nome} ; val = {val} ; val_formated = {val_formated}') + return val_formated + + # https://stackoverflow.com/questions/25577578/access-class-variable-from-instance + def cadastro_do_participante(self,sped_efd): + """ + Registro 0150: Tabela de Cadastro do Participante + Retorno desta função: + info_do_participante[codigo_do_participante][campo] = descricao + """ + blocoZero = sped_efd._blocos['0'] # Ler apenas o bloco 0. + info = {} + for registro in blocoZero.registros: + REG = registro.valores[1] + if REG != '0150': + continue + codigo_do_participante = None + for campo in registro.campos: + valor = registro.valores[campo.indice] + # Fazer distinção entre 'NOME' do Registro0000 e 'NOME' do Registro0150 + nome = campo.nome + '_participante' + if campo.nome == 'COD_PART': + codigo_do_participante = valor + info[codigo_do_participante] = {} + if nome in type(self).registros_de_cadastro_do_participante and codigo_do_participante is not None: + info[codigo_do_participante][nome] = valor + return info + + def identificacao_do_item(self,sped_efd): + """ + Registro 0200: Tabela de Identificação do Item (Produtos e Serviços) + Retorno desta função: + info_do_item[codigo_do_item][campo] = descricao + """ + blocoZero = sped_efd._blocos['0'] # Ler apenas o bloco 0. + info = {} + for registro in blocoZero.registros: + REG = registro.valores[1] + if REG != '0200': + continue + codigo_do_item = None + for campo in registro.campos: + valor = registro.valores[campo.indice] + if campo.nome == 'COD_ITEM': + codigo_do_item = valor + info[codigo_do_item] = {} + if campo.nome in type(self).registros_de_identificacao_do_item and codigo_do_item is not None: + info[codigo_do_item][campo.nome] = valor + return info + + def plano_de_contas_contabeis(self,sped_efd): + """ + Registro 0500: Plano de Contas Contábeis + Retorno desta função: + info_do_item[codigo_do_item][campo] = descricao + """ + blocoZero = sped_efd._blocos['0'] # Ler apenas o bloco 0. + info = {} + for registro in blocoZero.registros: + REG = registro.valores[1] + if REG != '0500': + continue + codigo_do_item = None + for campo in registro.campos: + valor = registro.valores[campo.indice] + if campo.nome == 'COD_CTA': + codigo_do_item = valor + info[codigo_do_item] = {} + for campo in registro.campos: + valor = registro.valores[campo.indice] + if campo.nome in type(self).registros_de_plano_de_contas and codigo_do_item is not None: + info[codigo_do_item][campo.nome] = valor + return info + + + def obter_info_de_abertura(self,sped_efd): + registro = sped_efd._registro_abertura + REG = registro.valores[1] + nivel = registro.nivel + codigo_cst = '' + valor_item = '' + valor_base = '' + + info_de_abertura = {} + + # https://www.geeksforgeeks.org/python-creating-multidimensional-dictionary/ + info_de_abertura.setdefault(nivel, {}).setdefault(codigo_cst, {}).setdefault(valor_item, {}).setdefault(valor_base, {})['Nível Hierárquico'] = nivel + + if self.verbose: + print(f'registro.as_line() = {registro.as_line()} ; REG = {REG} ; nivel = {nivel}') + print(f'info_de_abertura = {info_de_abertura}') + + for campo in registro.campos: + + valor = registro.valores[campo.indice] + + if campo.nome in type(self).colunas: + info_de_abertura[nivel][codigo_cst][valor_item][valor_base][campo.nome] = valor + if campo.nome == 'DT_INI': + ddmmaaaa = registro.valores[campo.indice] + info_de_abertura[nivel][codigo_cst][valor_item][valor_base]['Data de Emissão'] = valor + info_de_abertura[nivel][codigo_cst][valor_item][valor_base]['Mês do Período de Apuração'] = ddmmaaaa[2:4] + info_de_abertura[nivel][codigo_cst][valor_item][valor_base]['Ano do Período de Apuração'] = ddmmaaaa[4:8] + if campo.nome == 'DT_FIN': + info_de_abertura[nivel][codigo_cst][valor_item][valor_base]['Data de Execução'] = valor + if self.verbose: + valor_formatado = self.formatar_valor(nome=campo.nome, val=valor) + print(f'campo.indice = {campo.indice:>2} ; campo.nome = {campo.nome:>22} ; registro.valores[{campo.indice:>2}] = {valor:<50} ; valor_formatado = {valor_formatado}') + + print() if self.verbose else 0 + + return info_de_abertura + + def imprimir_informacoes_linha_a_linha(self,sped_efd,output_filename): + """ + Imprimir a título de aprendizagem + Observar as sequências de informações dos registros dos blocos + """ + my_regex = r'^[A-Z]' # Ler os blocos da A a Z. + + # https://docs.python.org/3/library/csv.html + with open(output_filename, 'w', newline='', encoding='utf-8', errors='ignore') as csvfile: + writer = csv.writer(csvfile, delimiter=';') + writer.writerow(type(self).colunas) # imprimir nomes das colunas + + for key in sped_efd._blocos.keys(): + + match_bloco = re.search(my_regex, key, flags=re.IGNORECASE) + if not match_bloco: + continue + + bloco = sped_efd._blocos[key] + count = 1 + + for registro in bloco.registros: + + info = {} + for coluna in type(self).colunas: + info[coluna] = '' + if coluna in self.info_de_abertura[0]['']['']: + info[coluna] = self.info_de_abertura[0][''][''][coluna] + + for campo in registro.campos: + + valor = registro.valores[campo.indice] + + if campo.nome in type(self).colunas: + info[campo.nome] = valor + if campo.nome in type(self).registros_de_valor: + info['Valor do Item'] = valor + if campo.nome in type(self).registros_de_chave_eletronica: + info['Chave Eletrônica'] = valor + if campo.nome in type(self).registros_de_base_de_calculo: + info['Valor da Base de Cálculo'] = valor + + writer.writerow( info.values() ) + + # limitar tamanho do arquivo impresso + # Imprimir apenas os 100 primeiros registro de cada Bloco + count += 1 + if self.verbose and count > 100: + break + + def adicionar_informacoes(self,dict_info): + """ + Adicionar informações em dict_info + Formatar alguns de seus campos com o uso de tabelas ou funções + """ + dict_info['Arquivo da SPED EFD'] = self.basename + dict_info['Linhas'] = next(type(self).contador_de_linhas) + + # re.search: find something anywhere in the string and return a match object. + if re.search(r'\d{1,2}', dict_info['CST Código da Situação Tributária']): # em perl: if (cst =~ /\d{1,2}/) + cst = int(dict_info['CST Código da Situação Tributária']) + if 1 <= cst <= 49: + dict_info['Tipo de Operação'] = 'Saída' + elif 50 <= cst <= 99: + dict_info['Tipo de Operação'] = 'Entrada' + + # adicionar informação de NAT_BC_CRED para os créditos (50 <= cst <= 66) quando houver informação do CFOP e NAT_BC_CRED estiver vazio. + if (len(dict_info['NAT_BC_CRED']) == 0 and re.search(r'\d{4}', dict_info['CFOP']) + #and ( re.search(r'[1-9]', dict_info['ALIQ_PIS']) or re.search(r'[1-9]', dict_info['ALIQ_COFINS']) ) # aliq_cofins > 0 + and re.search(r'\d{1,2}', dict_info['CST Código da Situação Tributária'])): + cfop = str(dict_info['CFOP']) + cst = int(dict_info['CST Código da Situação Tributária']) + if 50 <= cst <= 66: + dict_info['NAT_BC_CRED'] = type(self).natureza_da_bc_dos_creditos(cfop) + + # Índice de Origem do Crédito: Leia os comentários do 'Registro M100: Crédito de PIS/Pasep Relativo ao Período'. + # Os códigos vinculados à importação (108, 208 e 308) são obtidos através da informação de CFOP iniciado em 3 (quando existente) ou pelo campo IND_ORIG_CRED nos demais casos. + # O registro C100 possui o campo IND_OPER. IND_OPER igual a "0" (zero) indica operação de entrada. Veja os comentários do Registro C120. + indicador_de_origem = 'Mercado Interno' # Default Value: 0 - Mercado Interno ; 1 - Mercado Externo (Importação). + if len(dict_info['IND_ORIG_CRED']) == 0 and re.search(r'^3\d{3}', dict_info['CFOP']): + indicador_de_origem = 'Mercado Externo (Importação)' + dict_info['IND_ORIG_CRED'] = indicador_de_origem + + # adicionar informação de cadastro do participante obtido do Registro 0150 + # info_do_participante[codigo_do_participante][campo] = descricao + codigo_do_participante = dict_info['COD_PART'] + if codigo_do_participante != '' and codigo_do_participante in self.info_do_participante: + for campo in self.info_do_participante[codigo_do_participante]: + dict_info[campo] = self.info_do_participante[codigo_do_participante][campo] + + # adicionar informação de identificação do item obtido do Registro 0200 + # info_do_item[codigo_do_item][campo] = descricao + codigo_do_item = dict_info['COD_ITEM'] + if codigo_do_item != '' and codigo_do_item in self.info_do_item: + for campo in self.info_do_item[codigo_do_item]: + dict_info[campo] = self.info_do_item[codigo_do_item][campo] + + # adicionar informação do plano de contas obtido do Registro 0500 + codigo_da_conta = dict_info['COD_CTA'] + # info_da_conta[codigo_da_conta][campo] = descricao + if codigo_da_conta != '' and codigo_da_conta in self.info_da_conta: + for campo in self.info_da_conta[codigo_da_conta]: + val = str(self.info_da_conta[codigo_da_conta][campo]) + if campo == 'COD_NAT_CC' and re.search(r'\d{1,2}', val): + val = val.zfill(2) # val = f'{int(val):02d}' + val = val + ' - ' + EFD_Tabelas.tabela_natureza_da_conta[val] + dict_info[campo] = val + + # Ao final, formatar alguns valores dos campos + for campo in dict_info.copy(): + valor_formatado = self.formatar_valor(nome=campo, val=dict_info[campo]) + dict_info[campo] = valor_formatado + + return dict_info + + def imprimir_informacoes_da_efd(self,sped_efd,output_filename): + + my_regex = r'^[A-Z]' # Ler os blocos da A a Z. + + campos_necessarios = ['CST_PIS', 'CST_COFINS', 'VL_BC_PIS', 'VL_BC_COFINS'] + # Bastam os seguintes campos, desde que os registros de PIS/PASEP ocorram sempre anteriores aos registros de COFINS: + # campos_necessarios = ['CST_COFINS', 'VL_BC_COFINS'] + + if self.efd_tipo == 'efd_icms_ipi': + campos_necessarios = ['CST_ICMS', 'VL_BC_ICMS'] + + # https://docs.python.org/3/library/csv.html + with open(output_filename, 'w', newline='', encoding='utf-8', errors='ignore') as csvfile: + + #linha = ';'.join(str(val) for val in type(self).colunas) + #csvfile.write(linha + '\n') # imprimir nomes das colunas + + writer = csv.writer(csvfile, delimiter=';') + writer.writerow(type(self).colunas) # imprimir nomes das colunas + + for key in sped_efd._blocos.keys(): + + match_bloco = re.search(my_regex, key, flags=re.IGNORECASE) + if not match_bloco: + continue + + bloco = sped_efd._blocos[key] + count = 1 + + info = self.info_de_abertura + + for registro in bloco.registros: + + REG = registro.valores[1] + + #print(f'efd_print_info: {registro = } ; {registro.nivel = } ; {registro.__dict__ = }') + #sleep(0.1) + + try: + nivel_anterior = nivel + num_de_campos_anterior = num_de_campos + except: + nivel_anterior = registro.nivel + 1 + num_de_campos_anterior = len(registro.campos) + 1 + + nivel = registro.nivel # nível atual + num_de_campos = len(registro.campos) + + codigo_cst = '' + valor_item = '' + valor_base = '' + + for campo in registro.campos: + if campo.nome in type(self).registros_de_codigo_cst: + codigo_cst = registro.valores[campo.indice] + if campo.nome in type(self).registros_de_base_de_calculo: + valor_base = registro.valores[campo.indice] + if campo.nome in type(self).registros_de_valor: + valor_item = registro.valores[campo.indice] + + if self.verbose: + print(f'\ncount = {count:>2} ; key = {key} ; bloco = {bloco} ; REG = {REG} ; nivel_anterior = {nivel_anterior} ; nivel = {nivel} ; num_de_campos_anterior = {num_de_campos_anterior} ; num_de_campos = {num_de_campos} ; codigo_cst = {codigo_cst}') + print(f'registro.as_line() = {registro.as_line()}') + + # As informações do pai e respectivos filhos devem ser apagadas quando o nivel hierárquico regride dos filhos para pais diferentes. + if nivel < nivel_anterior or (nivel == nivel_anterior and num_de_campos < num_de_campos_anterior): + if self.verbose and nivel < nivel_anterior: + print(f'\n nivel atual: nivel = {nivel} < nivel_anterior = {nivel_anterior}; deletar informações em info a partir do nível {nivel} em diante:') + if self.verbose and nivel == nivel_anterior and num_de_campos < num_de_campos_anterior: + print(f'\n numero de campos atual: num_de_campos = {num_de_campos} < num_de_campos_anterior = {num_de_campos_anterior}; deletar informações em info a partir do nível {nivel} em diante:') + # Delete items from dictionary while iterating: https://www.geeksforgeeks.org/python-delete-items-from-dictionary-while-iterating/ + for nv in list(info): + if nv >= nivel: + del info[nv] + if self.verbose: + print(f'\t *** deletar informações do nível {nv}: del info[{nv}] ***') + print() if self.verbose else 0 + + info.setdefault(nivel, {}).setdefault(codigo_cst, {}).setdefault(valor_item, {}).setdefault(valor_base, {})['Valor do Item'] = valor_item + + for campo in registro.campos: + + try: + valor = registro.valores[campo.indice] + except: + valor = f'{REG}[{campo.indice}:{campo.nome}] sem valor definido' + print(valor) + + if self.verbose: + valor_formatado = self.formatar_valor(nome=campo.nome, val=valor) + print(f'campo.indice = {campo.indice:>2} ; campo.nome = {campo.nome:>22} ; registro.valores[{campo.indice:>2}] = {valor:<50} ; valor_formatado = {valor_formatado}') + + if campo.nome in type(self).colunas: + info[nivel][codigo_cst][valor_item][valor_base][campo.nome] = valor + + # Informar os campos em registros_de_data_emissao na coluna 'Data de Emissão'. + if campo.nome in type(self).registros_de_data_emissao: + info[nivel][codigo_cst][valor_item][valor_base]['Data de Emissão'] = valor + # Informar os campos em registros_de_data_execucao na coluna 'Data de Execução'. + if campo.nome in type(self).registros_de_data_execucao: + info[nivel][codigo_cst][valor_item][valor_base]['Data de Execução'] = valor + # Informar os campos de chave eletrônica de 44 dígitos na coluna 'Chave Eletrônica'. + if campo.nome in type(self).registros_de_chave_eletronica: + info[nivel][codigo_cst][valor_item][valor_base]['Chave Eletrônica'] = valor + # Informar os campos CST_PIS e CST_COFINS na coluna 'CST Código da Situação Tributária'. + if campo.nome in type(self).registros_de_codigo_cst: + info[nivel][codigo_cst][valor_item][valor_base][campo.nome] = valor + info[nivel][codigo_cst][valor_item][valor_base]['CST Código da Situação Tributária'] = valor + # Informar os campos VL_BC_PIS e VL_BC_COFINS na coluna 'Valor da Base de Cálculo'. + if campo.nome in type(self).registros_de_base_de_calculo: + info[nivel][codigo_cst][valor_item][valor_base][campo.nome] = valor + info[nivel][codigo_cst][valor_item][valor_base]['Valor da Base de Cálculo'] = valor + + if self.verbose: + print(f'\n-->info[nivel][codigo_cst][valor_item][valor_base] = info[{nivel}][{codigo_cst}][{valor_item}][{valor_base}] = {info[nivel][codigo_cst][valor_item][valor_base]}\n') + + #https://stackoverflow.com/questions/3931541/how-to-check-if-all-of-the-following-items-are-in-a-list + # set(['a', 'c']).issubset(['a', 'b', 'c', 'd']) or set(lista1).issubset(lista2) + + if set(campos_necessarios).issubset( info[nivel][codigo_cst][valor_item][valor_base] ): + + # Zen of Python: Flat is better than nested. + flattened_info = {} # eliminar os diversos niveis e trazer todas as informações para apenas uma dimensão. + + for coluna in type(self).colunas: + flattened_info[coluna] = '' # atribuir valor inicial para todas as colunas + + if coluna in info[nivel][codigo_cst][valor_item][valor_base]: + flattened_info[coluna] = info[nivel][codigo_cst][valor_item][valor_base][coluna] + if self.verbose: + print(f'nivel = {nivel:<10} ; codigo_cst = {codigo_cst:<2} ; valor_item = {valor_item:<15} ; coluna = {coluna:>35} = {info[nivel][codigo_cst][valor_item][valor_base][coluna]:<35} ; info[nivel][codigo_cst][valor_item][valor_base] = {info[nivel][codigo_cst][valor_item][valor_base]}') + continue + + for nv in sorted(info,reverse=True): # nível em ordem decrescente + if nv >= nivel: # informação já obtida acima + continue + if flattened_info[coluna] != '': # as informações obtidas do nível mais alto prevalecerá + break + for cst in info[nv]: + for vl_item in info[nv][cst]: + for vl_base in info[nv][cst][vl_item]: + if coluna in info[nv][cst][vl_item][vl_base]: + flattened_info[coluna] = info[nv][cst][vl_item][vl_base][coluna] + if self.verbose: + print(f'nivel = {nivel} ; nv = {nv} ; codigo_cst = {cst:<2} ; valor_item = {vl_item:<15} ; coluna = {coluna:>35} = {info[nv][cst][vl_item][vl_base][coluna]:<35} ; info[nv][cst][vl_item][vl_base] = {info[nv][cst][vl_item][vl_base]}') + + print() if self.verbose else 0 + + flattened_info['Nº da Linha da EFD'] = registro.numero_da_linha + + # Adicionar informações em flattened_info ou formatar alguns de seus campos com o uso de tabelas ou funções + flattened_info = self.adicionar_informacoes(flattened_info) + + #linha = ';'.join(str(val) for val in flattened_info.values()) + #csvfile.write(linha + '\n') + + writer.writerow( flattened_info.values() ) + + # Limitar tamanho do arquivo impresso + # Imprimir apenas os 20 primeiros registro de cada Bloco + count += 1 + if self.verbose and count > 20: + break + + print(f"Gerado o arquivo csv: '{output_filename}'.") + + + def convert_csv_to_xlsx(self, imput_csv, output_excel): + + # Create an new Excel file and add a worksheet. + workbook = xlsxwriter.Workbook(output_excel) + worksheet = workbook.add_worksheet('Itens de Docs Fiscais') + workbook.set_properties({'comments': 'Created with Python and XlsxWriter'}) + + # definindo a altura da primeira coluna, row_index == 0 + worksheet.set_row(0, 30) + + # Freeze pane on the top row. + worksheet.freeze_panes(1, 0) + + # Set up some formatting + header_format = workbook.add_format({'align':'center', 'valign':'vcenter', 'bg_color':'#C5D9F1', 'text_wrap': True, 'font_size':10}) + date_format = workbook.add_format({'num_format': 'dd/mm/yyyy'}) + center_format = workbook.add_format({'align':'center'}) + + # Add a number format for cells + numero_0d = workbook.add_format({'num_format': '0', 'align':'center'}) + numero_2d = workbook.add_format({'num_format': '#,##0.00'}) + numero_4d = workbook.add_format({'num_format': '#,##0.0000', 'align':'center'}) + + # First we find the length of the header column + largura_min = 6 + largura_max = [len(c) + largura_min for c in type(self).colunas] + + with open(imput_csv, 'r', encoding='utf-8', errors='ignore') as file: + + reader = csv.reader(file, delimiter=';') + for row_index, row in enumerate(reader): + + # nomes das colunas + if row_index == 0: + worksheet.write_row(row_index, 0, tuple(type(self).colunas), header_format) + continue + + for column_index, cell in enumerate(row): + + nome_da_coluna = type(self).colunas[column_index] + + # reter largura máxima + if len(cell) > largura_max[column_index]: + largura_max[column_index] = len(cell) + + match_valor = re.search(r'VL|Valor', nome_da_coluna, flags=re.IGNORECASE) + match_aliquota = re.search(r'Aliq', nome_da_coluna, flags=re.IGNORECASE) + match_nnatural = re.search(r'Linha|NUM_', nome_da_coluna, flags=re.IGNORECASE) + match_data = re.search(r'Data|DT_', nome_da_coluna, flags=re.IGNORECASE) + match_center = re.search(r'Período|Operação|REG', nome_da_coluna, flags=re.IGNORECASE) + + if len(cell) > 0 and (match_nnatural or match_valor or match_aliquota): + cell = cell.replace( '.', '' ) # 4.218.239,19 --> 4218239,19 + cell = cell.replace( ',', '.' ) # 4218239,19 --> 4218239.19 + + num_real = float(cell) + + if match_nnatural: + worksheet.write_number(row_index, column_index, num_real, numero_0d) + if match_valor: + worksheet.write_number(row_index, column_index, num_real, numero_2d) + if match_aliquota: + worksheet.write_number(row_index, column_index, num_real, numero_4d) + + elif len(cell) > 0 and match_data: + date_time = datetime.strptime(cell, "%d/%m/%Y") # dd/mm/aaaa + worksheet.write_datetime(row_index, column_index, date_time, date_format) + + elif len(cell) > 0 and match_center: + worksheet.write(row_index, column_index, cell, center_format) + + else: + # Write cell with row/column notation. + worksheet.write(row_index, column_index, cell) + + # Ajustar largura das colunas com os valores máximos + for i, width in enumerate(largura_max): + if width > 120: # largura máxima + width = 120 + worksheet.set_column(i, i, width) + + # Set the autofilter( $first_row, $first_col, $last_row, $last_col ) + worksheet.autofilter(0, 0, 0, len(largura_max) - 1) + + workbook.close() + + print(f"Gerado o arquivo XLSX Excel: '{output_excel}'.") diff --git a/sped/relatorios/efd_read_dir.py b/sped/relatorios/efd_read_dir.py new file mode 100755 index 0000000..b7b6079 --- /dev/null +++ b/sped/relatorios/efd_read_dir.py @@ -0,0 +1,212 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import re, os, glob, sys +import cchardet as chardet # pip3 install cchardet + +Autor = 'Claudio Fernandes de Souza Rodrigues (claudiofsr@yahoo.com)' +Data = '06 de Fevereiro de 2020 (início: 15 de Dezembro de 2020)' + +# Versão mínima exigida: python 3.6.0 +python_version = sys.version_info +if python_version < (3,6,0): + print('versão mínima exigida do python é 3.6.0') + print('versão atual', "%s.%s.%s" % (python_version[0],python_version[1],python_version[2])) + exit() + +# Python OOP: Atributos e Métodos (def, funções) +class ReadFiles: + """Retorna um dicionário com informações dos arquivos encontrados no diretório""" + recursive = True + current_dir = os.getcwd() + seen_file = set() # evitar duplicidade: Is there a more Pythonic way to prevent adding a duplicate to a list? + + def __init__(self, root_path = None, extension = None, pattern = None): + if root_path is None: + self.root_path = self.current_dir + else: + self.root_path = root_path + if extension is None: + self.extension = '*' + else: + self.extension = extension.strip('.') + if pattern is None: + self.pattern = '.' + else: + self.pattern = pattern + self.informations = {} # instance attributes, dict + + def __repr__(self): + return f'{self.__class__.__name__}(root_path = {self.root_path!r}, extension = {self.extension!r}, pattern = {self.pattern!r})' + + def get_file_extension(self,file_path): + # https://stackoverflow.com/questions/541390/extracting-extension-from-filename-in-python + _, file_extension = os.path.splitext(file_path) + return file_extension + + def get_filename(self,file_path): + # https://stackoverflow.com/questions/541390/extracting-extension-from-filename-in-python + filename = os.path.basename(file_path) + return filename + + # https://stackoverflow.com/questions/9629179/python-counting-lines-in-a-huge-10gb-file-as-fast-as-possible + def count_number_of_lines(self,file_path): + lines = 0 + try: + with open(file_path, mode='r', encoding="utf-8", errors='ignore') as filename: + for _ in filename: + lines += 1 + except FileNotFoundError: + print('O Arquivo não existe!') + return f'{lines:,}'.replace(',','.') + + # https://stackoverflow.com/questions/436220/how-to-determine-the-encoding-of-text + # https://chardet.readthedocs.io/en/latest/usage.html + # https://github.com/PyYoshi/cChardet + # iconv -f WINDOWS-1252 -t UTF-8 filename.txt # iconv - convert text from one character encoding to another + def predict_encoding(self,file_path): + '''Predict a file's encoding using cchardet''' + # import cchardet as chardet + lines = [] + my_regex = rb"^\|9999\|\d+\|" # descartar informações após a linha que contém |9999| seguido por dígitos ; b'': binary mode + with open(file_path, mode='rb') as filename: # mode 'rb': open the file as binary data + for line in filename: + match_object = re.search(my_regex, line, flags=re.IGNORECASE) + if len(lines) > 2**8 or match_object: + #print(f'{file_path = } ; {line = }') + break + lines.append(line) + rawdata = b''.join(lines) + info = chardet.detect(rawdata) # {'encoding': 'UTF-8', 'confidence': 0.9900000095367432} + encoding = info['encoding'] + if encoding is None or not re.search('UTF-8', encoding, flags=re.IGNORECASE): + encoding = 'Latin-1' + return encoding + + @property + def find_all_files(self): + # https://www.mkyong.com/python/python-how-to-list-all-files-in-a-directory/ + # https://docs.python.org/3/library/glob.html + files = [f for f in glob.glob(self.root_path + '/' + f"**/*.{self.extension}", recursive = self.recursive)] + # How to use a variable inside a regular expression? + my_regex = f"{self.pattern}" # Literal String Interpolation, "f-strings". + for file_path in files: + # path.isfile: The easiest way to check if both a file exists and if it is a file. + # seen_file: Is there a more Pythonic way to prevent adding a duplicate to a list? + if not os.path.isfile(file_path) or file_path.casefold() in self.seen_file: + continue + match_pattern = re.search(my_regex, str(file_path), flags=re.IGNORECASE) + if match_pattern: + self.seen_file.add(file_path.casefold()) + self.informations.setdefault(file_path, {})['tipo'] = 'Arquivo' + return self.informations + + @property + def find_all_efd_contrib(self): + indice = 0 + # Calling one method from another within same class in Python + return self.find_all_efd(indice) + + @property + def find_all_efd_icmsipi(self): + indice = 1 + # Calling one method from another within same class in Python + return self.find_all_efd(indice) + + def find_all_efd(self,indice=0): + if not self.informations: # How do I check if a list/dict is empty? + self.find_all_files # Calling one method from another within same class in Python + regex_efd = ["PISCOFINS", "SPED-EFD"] + efd_type = ['EFD Contribuições', 'EFD ICMS_IPI'] + idx_nome = [8,6] + idx_data = [6,4] + idx_cnpj = [9,7] + for file_path in self.informations: + encode_info = None + if not re.search(regex_efd[indice], file_path, flags=re.IGNORECASE): + continue + # Ler apenas a primeira linha para obter encode_info + with open(file_path, mode='rb') as filename: # mode 'rb': open the file as binary data + for line in filename: + info = chardet.detect(line) # {'encoding': 'UTF-8', 'confidence': 0.9900000095367432} + encode_info = info['encoding'] + #print(f'{file_path = } ; {encode_info = } ; {info = }') + break + # Ler apenas a primeira linha para obter informações do registro de abertura '0000'. + with open(file_path, mode='r', encoding=encode_info, errors='ignore') as filename: # encoding='latin-1','UTF-8' + for line in filename: + campos = line.strip().split('|') + if len(campos) <= 10: + break + campo_registro = campos[1] # A primeira linha deve conter o registro '0000' + campo_nome = campos[ idx_nome[indice] ] + campo_data = campos[ idx_data[indice] ] + campo_cnpj = campos[ idx_cnpj[indice] ] # o campo CNPJ deve conter 14 dígitos + match_regi = re.search( '0000', campo_registro) + match_cnpj = re.search(r'(\D|^)\d{14}(\D|$)', campo_cnpj) + match_data = re.search(r'(\D|^)\d{8}(\D|$)', campo_data) + if match_regi and match_cnpj and match_data: + self.informations[file_path]['tipo'] = efd_type[indice] + self.informations[file_path]['NOME'] = campo_nome + self.informations[file_path]['CNPJ'] = "%s.%s.%s/%s-%s" % (campo_cnpj[0:2],campo_cnpj[2:5],campo_cnpj[5:8],campo_cnpj[8:12],campo_cnpj[12:14]) + self.informations[file_path]['DT_INI'] = "%s/%s/%s" % (campo_data[0:2],campo_data[2:4],campo_data[4:8]) + break + # Filter a Dictionary by values in Python using dict comprehension + return {key: value for (key, value) in sorted(self.informations.items()) if value['tipo'] == efd_type[indice]} + + def get_file_info(self,file_path): + self.informations[file_path]['extensão' ] = self.get_file_extension(file_path) + self.informations[file_path]['codificação' ] = self.predict_encoding(file_path) + self.informations[file_path]['número de linhas'] = self.count_number_of_lines(file_path) + return self.informations[file_path] + +from time import time, sleep + +def Total_Execution_Time(start,end=None): + ''' + How to format elapsed time from seconds to hours, minutes, seconds and milliseconds in Python? + https://stackoverflow.com/questions/27779677/how-to-format-elapsed-time-from-seconds-to-hours-minutes-seconds-and-milliseco + https://stackoverflow.com/questions/3620943/measuring-elapsed-time-with-the-time-module/46544199 + https://blog.softhints.com/python-test-performance-and-measure-time-elapsed-in-seconds/ + ''' + if end is None: + end = time() + hours, rem = divmod(end-start, 3600) + minutes, seconds = divmod(rem, 60) + return f"{int(hours):02d}h:{int(minutes):02d}m:{seconds:07.4f}s" + + +if __name__ == '__main__': + + start = time() + + #print(f'\n{ReadFiles.__dict__ = } \n') + + lista_de_arquivos0 = ReadFiles(root_path = '.') + lista_de_arquivos1 = ReadFiles(root_path = 'EFD Contribuicoes', extension = 'txt', pattern = 'PISCOFINS') + lista_de_arquivos2 = ReadFiles(root_path = 'EFD ICMS_IPI-ADM', extension = 'txt', pattern = 'SPED-EFD' ) + + arquivos_da_efd = [lista_de_arquivos0, lista_de_arquivos1, lista_de_arquivos2] + + for lista_de_arquivos in arquivos_da_efd: + print(f'\nlista_de_arquivos = {lista_de_arquivos}:\n') + + print(f'lista_de_arquivos.find_all_files = {lista_de_arquivos.find_all_files} ; len(lista_de_arquivos.informations) = {len(lista_de_arquivos.informations)}\n') + + # SPED EFD Contrib: + for index,file_path in enumerate(lista_de_arquivos.find_all_efd_contrib,1): + print( f"{index:>6}: {file_path} ; tipo = {lista_de_arquivos.informations[file_path]['tipo']}" ) + #continue + for attribute, value in lista_de_arquivos.get_file_info(file_path).items(): + print(f'{attribute:>30}: {value}') + + # SPED EFD ICMS_IPI: + for index,file_path in enumerate(lista_de_arquivos.find_all_efd_icmsipi,1): + print( f"{index:>6}: {file_path} ; tipo = {lista_de_arquivos.informations[file_path]['tipo']}" ) + #continue + for attribute, value in lista_de_arquivos.get_file_info(file_path).items(): + print(f'{attribute:>30}: {value}') + + end = time() + print(f'\nTotal Execution Time: {Total_Execution_Time(start,end)} \n') + diff --git a/sped/relatorios/efd_relatorios.py b/sped/relatorios/efd_relatorios.py new file mode 100755 index 0000000..0b3016b --- /dev/null +++ b/sped/relatorios/efd_relatorios.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python3 + +Autor = 'Claudio Fernandes de Souza Rodrigues (claudiofsr@yahoo.com)' +Data = '12 de Fevereiro de 2020 (início: 29 de Janeiro de 2020)' + +# Instruções (no Linux): + +# Digite em seu web brawser o endereço abaixo: +# https://github.com/claudiofsr/python-sped +# Clique em 'Clone or download'. +# Em seguida, descompacte o arquivo copiado: +# > unzip python-sped-11.0.zip +# > cd python-sped-11.0 +# Para instalar o módulo do sped em seu sistema execute, como superusuário: +# python setup.py install +# Copie o arquivo 'efd_relatorios.py' de python-sped-11.0/relatorios +# para o diretório que contenha os arquivos de EFD Contribuições. +# Em seguida, execute no terminal o camando: +# > python efd_relatorios.py + +import sys, os +from time import time, sleep +from sped import __version__ +from sped.relatorios.efd_read_dir import ReadFiles, Total_Execution_Time +from sped.relatorios.efd_info import SPED_EFD_Info + +# Versão mínima exigida: python 3.6.0 +python_version = sys.version_info +if python_version < (3,6,0): + print('versão mínima exigida do python é 3.6.0') + print('versão atual', "%s.%s.%s" % (python_version[0],python_version[1],python_version[2])) + exit() + +if __name__ == '__main__': + + print(f'\nPython Sped - versão: {__version__}\n') + + dir_path = os.getcwd() # CurrentDirectory + extensao = 'txt' + + lista_de_arquivos = ReadFiles(root_path = dir_path, extension = extensao) + + arquivos_efd_contrib = list(lista_de_arquivos.find_all_efd_contrib) # SPED EFD Contrib + arquivos_efd_icms_ipi = list(lista_de_arquivos.find_all_efd_icmsipi) # SPED EFD ICMS_IPI + + arquivos_sped_efd = arquivos_efd_contrib + arquivos_efd_icms_ipi + + for index,file_path in enumerate(arquivos_sped_efd,1): + print( f"{index:>6}: {file_path}") + for attribute, value in lista_de_arquivos.get_file_info(file_path).items(): + print(f'{attribute:>25}: {value}') + + indice_do_arquivo = None + + if len(arquivos_sped_efd) > 1: + while indice_do_arquivo is None: + my_input = input(f"\nFavor, digite o número do arquivo SPED EFD (1 a {len(arquivos_sped_efd)}): ") + try: + my_input = int(my_input) + if 1 <= my_input <= len(arquivos_sped_efd): + indice_do_arquivo = my_input - 1 + except: + print(f"-->Opção incorreta: '{my_input}'.") + print(f"-->Digite um número inteiro entre 1 e {len(arquivos_sped_efd)}.") + elif len(arquivos_sped_efd) == 1: + indice_do_arquivo = 0 + else: + dir_path_exemplo = '/home/claudio/Documentos/' + print(f"A lista de arquivos de SPED EFD é obtida a partir de:\n") + print(f"\tlista_de_arquivos = ReadFiles(root_path = dir_path, extension = extensao).\n") + print(f"tal que:\n") + print(f"\tdir_path = '{dir_path}' e extensao = '{extensao}'.\n") + print(f"Nenhum arquivo de SPED EFD foi encontrado no diretório definido acima.") + print(f"Se as EFDs estão localizadas, por exemplo, no diretório '{dir_path_exemplo}',") + print(f"então altere a variável 'dir_path' para o diretório que contenha as EFDs:") + print(f"\n\tdir_path = '{dir_path_exemplo}'\n") + print(f"Outra alternativa é copiar este arquivo '{__file__}' para o diretório que contenha as EFDs.") + print(f"Em seguida, executar no terminal:\n") + print(f"\t python {__file__} \n") + exit() + + # arquivo SPED EFD + file_path = arquivos_sped_efd[indice_do_arquivo] + tipo_da_efd = lista_de_arquivos.informations[file_path]['tipo'] + codificacao = lista_de_arquivos.informations[file_path]['codificação'] + + print(f"\nFoi selecionado o arquivo {indice_do_arquivo + 1}: '{file_path}'\n") + input("Tecle Enter para gerar arquivo .csv com informações da EFD ") + print() + + start = time() + + efd = SPED_EFD_Info(file_path, encoding=codificacao, efd_tipo = tipo_da_efd, verbose=False) + + efd.imprimir_informacoes + + end = time() + + print(f'\nTotal Execution Time: {Total_Execution_Time(start,end)} \n') + diff --git a/sped/relatorios/efd_tabelas.py b/sped/relatorios/efd_tabelas.py new file mode 100644 index 0000000..c573a30 --- /dev/null +++ b/sped/relatorios/efd_tabelas.py @@ -0,0 +1,245 @@ +# -*- coding: utf-8 -*- + +Autor = 'Claudio Fernandes de Souza Rodrigues (claudiofsr@yahoo.com)' +Data = '11 de Fevereiro de 2020 (início: 10 de Janeiro de 2020)' + +class EFD_Tabelas: + """ + Tabelas utilizadas na EFD + """ + + tabela_natureza_da_conta = { + '01': 'Contas de ativo', + '02': 'Contas de passivo', + '03': 'Patrimônio líquido', + '04': 'Contas de resultado', + '05': 'Contas de compensação', + '09': 'Outras', + } + + # Tabela 4.3.7 - Tabela Código de Base de Cálculo do Crédito + tabela_bc_do_credito = { + '01': 'Aquisição de bens para revenda', + '02': 'Aquisição de bens utilizados como insumo', + '03': 'Aquisição de serviços utilizados como insumo', + '04': 'Energia elétrica e térmica, inclusive sob a forma de vapor', + '05': 'Aluguéis de prédios', + '06': 'Aluguéis de máquinas e equipamentos', + '07': 'Armazenagem de mercadoria e frete na operação de venda', + '08': 'Contraprestações de arrendamento mercantil', + '09': 'Máquinas, equipamentos e outros bens incorporados ao ativo imobilizado (crédito sobre encargos de depreciação)', + '10': 'Máquinas, equipamentos e outros bens incorporados ao ativo imobilizado (crédito com base no valor de aquisição)', + '11': 'Amortização e Depreciação de edificações e benfeitorias em imóveis', + '12': 'Devolução de Vendas Sujeitas à Incidência Não-Cumulativa', + '13': 'Outras Operações com Direito a Crédito', + '14': 'Atividade de Transporte de Cargas - Subcontratação', + '15': 'Atividade Imobiliária - Custo Incorrido de Unidade Imobiliária', + '16': 'Atividade Imobiliária - Custo Orçado de unidade não concluída', + '17': 'Atividade de Prestação de Serviços de Limpeza, Conservação e Manutenção - vale-transporte, valerefeição ou vale-alimentação, fardamento ou uniforme', + '18': 'Estoque de abertura de bens', + } + + # 4.3.3 - CÓDIGO DA SITUAÇÃO TRIBUTÁRIA REFERENTE AO PIS/PASEP e COFINS + tabela_cst_contrib = { + '01': 'Operação Tributável com Alíquota Básica', + '02': 'Operação Tributável com Alíquota Diferenciada', + '03': 'Operação Tributável com Alíquota por Unidade de Medida de Produto', + '04': 'Operação Tributável Monofásica - Revenda a Alíquota Zero', + '05': 'Operação Tributável por Substituição Tributária', + '06': 'Operação Tributável a Alíquota Zero', + '07': 'Operação Isenta da Contribuição', + '08': 'Operação sem Incidência da Contribuição', + '09': 'Operação com Suspensão da Contribuição', + '49': 'Outras Operações de Saída', + '50': 'Operação com Direito a Crédito - Vinculada Exclusivamente a Receita Tributada no Mercado Interno', + '51': 'Operação com Direito a Crédito - Vinculada Exclusivamente a Receita Não Tributada no Mercado Interno', + '52': 'Operação com Direito a Crédito - Vinculada Exclusivamente a Receita de Exportação', + '53': 'Operação com Direito a Crédito - Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno', + '54': 'Operação com Direito a Crédito - Vinculada a Receitas Tributadas no Mercado Interno e de Exportação', + '55': 'Operação com Direito a Crédito - Vinculada a Receitas Não-Tributadas no Mercado Interno e de Exportação', + '56': 'Operação com Direito a Crédito - Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno, e de Exportação', + '60': 'Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita Tributada no Mercado Interno', + '61': 'Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita Não-Tributada no Mercado Interno', + '62': 'Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita de Exportação', + '63': 'Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno', + '64': 'Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas no Mercado Interno e de Exportação', + '65': 'Crédito Presumido - Operação de Aquisição Vinculada a Receitas Não-Tributadas no Mercado Interno e de Exportação', + '66': 'Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno, e de Exportação', + '67': 'Crédito Presumido - Outras Operações', + '70': 'Operação de Aquisição sem Direito a Crédito', + '71': 'Operação de Aquisição com Isenção', + '72': 'Operação de Aquisição com Suspensão', + '73': 'Operação de Aquisição a Alíquota Zero', + '74': 'Operação de Aquisição sem Incidência da Contribuição', + '75': 'Operação de Aquisição por Substituição Tributária', + '98': 'Outras Operações de Entrada', + '99': 'Outras Operações', + } + + # Tabela Código da Situação Tributária - CST (ICMS) (Pacote: Tabelas de Situação Tributária) + # Versão 3, somente códigos vigentes. + tabela_cst_icms = { + '000': 'Nacional, exceto as indicadas nos códigos 3, 4, 5 e 8 da Tabela A - Tributada integralmente', + '010': 'Nacional, exceto as indicadas nos códigos 3, 4, 5 e 8 da Tabela A - Tributada e com cobrança do ICMS por substituição tributária', + '020': 'Nacional, exceto as indicadas nos códigos 3, 4, 5 e 8 da Tabela A - Com redução de base de cálculo', + '030': 'Nacional, exceto as indicadas nos códigos 3, 4, 5 e 8 da Tabela A - Isenta ou não tributada e com cobrança do ICMS por substituição tributária', + '040': 'Nacional, exceto as indicadas nos códigos 3, 4, 5 e 8 da Tabela A - Isenta', + '041': 'Nacional, exceto as indicadas nos códigos 3, 4, 5 e 8 da Tabela A - Não tributada', + '050': 'Nacional, exceto as indicadas nos códigos 3, 4, 5 e 8 da Tabela A - Suspensão', + '051': 'Nacional, exceto as indicadas nos códigos 3, 4, 5 e 8 da Tabela A - Diferimento', + '060': 'Nacional, exceto as indicadas nos códigos 3, 4, 5 e 8 da Tabela A - ICMS cobrado anteriormente por substituição tributária', + '070': 'Nacional, exceto as indicadas nos códigos 3, 4, 5 e 8 da Tabela A - Com redução de base de cálculo e cobrança do ICMS por substituição tributária', + '090': 'Nacional, exceto as indicadas nos códigos 3, 4, 5 e 8 da Tabela A - Outras', + '100': 'Estrangeira - Importação direta, exceto a indicada no código 6 da Tabela A - Tributada integralmente', + '101': 'Simples Nacional - Tributada pelo Simples Nacional com permissão de crédito', + '102': 'Simples Nacional - Tributada pelo Simples Nacional sem permissão de crédito', + '103': 'Simples Nacional - Isenção do ICMS no Simples Nacional para faixa de receita bruta', + '110': 'Estrangeira - Importação direta, exceto a indicada no código 6 da Tabela A - Tributada e com cobrança do ICMS por substituição tributária', + '120': 'Estrangeira - Importação direta, exceto a indicada no código 6 da Tabela A - Com redução de base de cálculo', + '130': 'Estrangeira - Importação direta, exceto a indicada no código 6 da Tabela A - Isenta ou não tributada e com cobrança do ICMS por substituição tributária', + '140': 'Estrangeira - Importação direta, exceto a indicada no código 6 da Tabela A - Isenta', + '141': 'Estrangeira - Importação direta, exceto a indicada no código 6 da Tabela A - Não tributada', + '150': 'Estrangeira - Importação direta, exceto a indicada no código 6 da Tabela A - Suspensão', + '151': 'Estrangeira - Importação direta, exceto a indicada no código 6 da Tabela A - Diferimento', + '160': 'Estrangeira - Importação direta, exceto a indicada no código 6 da Tabela A - ICMS cobrado anteriormente por substituição tributária', + '170': 'Estrangeira - Importação direta, exceto a indicada no código 6 da Tabela A - Com redução de base de cálculo e cobrança do ICMS por substituição tributária', + '190': 'Estrangeira - Importação direta, exceto a indicada no código 6 da Tabela A - Outras', + '200': 'Estrangeira - Adquirida no mercado interno, exceto a indicada no código 7 da Tabela A - Tributada integralmente', + '201': 'Simples Nacional - Tributada pelo Simples Nacional com permissão de crédito e com cobrança do ICMS por substituição tributária', + '202': 'Simples Nacional - Tributada pelo Simples Nacional sem permissão de crédito e com cobrança do ICMS por substituição tributária', + '203': 'Simples Nacional - Isenção do ICMS no Simples Nacional para faixa de receita bruta e com cobrança do ICMS por substituição tributária', + '210': 'Estrangeira - Adquirida no mercado interno, exceto a indicada no código 7 da Tabela A - Tributada e com cobrança do ICMS por substituição tributária', + '220': 'Estrangeira - Adquirida no mercado interno, exceto a indicada no código 7 da Tabela A - Com redução de base de cálculo', + '230': 'Estrangeira - Adquirida no mercado interno, exceto a indicada no código 7 da Tabela A - Isenta ou não tributada e com cobrança do ICMS por substituição tributária', + '240': 'Estrangeira - Adquirida no mercado interno, exceto a indicada no código 7 da Tabela A - Isenta', + '241': 'Estrangeira - Adquirida no mercado interno, exceto a indicada no código 7 da Tabela A - Não tributada', + '250': 'Estrangeira - Adquirida no mercado interno, exceto a indicada no código 7 da Tabela A - Suspensão', + '251': 'Estrangeira - Adquirida no mercado interno, exceto a indicada no código 7 da Tabela A - Diferimento', + '260': 'Estrangeira - Adquirida no mercado interno, exceto a indicada no código 7 da Tabela A - ICMS cobrado anteriormente por substituição tributária', + '270': 'Estrangeira - Adquirida no mercado interno, exceto a indicada no código 7 da Tabela A - Com redução de base de cálculo e cobrança do ICMS por substituição tributária', + '290': 'Estrangeira - Adquirida no mercado interno, exceto a indicada no código 7 da Tabela A - Outras', + '300': 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 40% (quarenta por cento) e inferior ou igual a 70% (setenta por cento) - Tributada integralmente', + '310': 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 40% (quarenta por cento) e inferior ou igual a 70% (setenta por cento) - Tributada e com cobrança do ICMS por substituição tributária', + '320': 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 40% (quarenta por cento) e inferior ou igual a 70% (setenta por cento) - Com redução de base de cálculo', + '330': 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 40% (quarenta por cento) e inferior ou igual a 70% (setenta por cento) - Isenta ou não tributada e com cobrança do ICMS por substituição tributária', + '340': 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 40% (quarenta por cento) e inferior ou igual a 70% (setenta por cento) - Isenta', + '341': 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 40% (quarenta por cento) e inferior ou igual a 70% (setenta por cento) - Não tributada', + '350': 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 40% (quarenta por cento) e inferior ou igual a 70% (setenta por cento) - Suspensão', + '351': 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 40% (quarenta por cento) e inferior ou igual a 70% (setenta por cento) - Diferimento', + '360': 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 40% (quarenta por cento) e inferior ou igual a 70% (setenta por cento) - ICMS cobrado anteriormente por substituição tributária', + '370': 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 40% (quarenta por cento) e inferior ou igual a 70% (setenta por cento) - Com redução de base de cálculo e cobrança do ICMS por substituição tributária', + '390': 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 40% (quarenta por cento) e inferior ou igual a 70% (setenta por cento) - Outras', + '400': 'Nacional, cuja produção tenha sido feita em conformidade com os processos produtivos básicos de que tratam o Decreto-Lei nº 288/67, e as Leis nºs 8.248/91, 8.387/91, 10.176/01 e 11.484/07 - Tributada integralmente', + '410': 'Nacional, cuja produção tenha sido feita em conformidade com os processos produtivos básicos de que tratam o Decreto-Lei nº 288/67, e as Leis nºs 8.248/91, 8.387/91, 10.176/01 e 11.484/08 - Tributada e com cobrança do ICMS por substituição tributária', + '420': 'Nacional, cuja produção tenha sido feita em conformidade com os processos produtivos básicos de que tratam o Decreto-Lei nº 288/67, e as Leis nºs 8.248/91, 8.387/91, 10.176/01 e 11.484/09 - Com redução de base de cálculo', + '430': 'Nacional, cuja produção tenha sido feita em conformidade com os processos produtivos básicos de que tratam o Decreto-Lei nº 288/67, e as Leis nºs 8.248/91, 8.387/91, 10.176/01 e 11.484/10 - Isenta ou não tributada e com cobrança do ICMS por substituição tributária', + '440': 'Nacional, cuja produção tenha sido feita em conformidade com os processos produtivos básicos de que tratam o Decreto-Lei nº 288/67, e as Leis nºs 8.248/91, 8.387/91, 10.176/01 e 11.484/11 - Isenta', + '441': 'Nacional, cuja produção tenha sido feita em conformidade com os processos produtivos básicos de que tratam o Decreto-Lei nº 288/67, e as Leis nºs 8.248/91, 8.387/91, 10.176/01 e 11.484/12 - Não tributada', + '450': 'Nacional, cuja produção tenha sido feita em conformidade com os processos produtivos básicos de que tratam o Decreto-Lei nº 288/67, e as Leis nºs 8.248/91, 8.387/91, 10.176/01 e 11.484/13 - Suspensão', + '451': 'Nacional, cuja produção tenha sido feita em conformidade com os processos produtivos básicos de que tratam o Decreto-Lei nº 288/67, e as Leis nºs 8.248/91, 8.387/91, 10.176/01 e 11.484/14 - Diferimento', + '460': 'Nacional, cuja produção tenha sido feita em conformidade com os processos produtivos básicos de que tratam o Decreto-Lei nº 288/67, e as Leis nºs 8.248/91, 8.387/91, 10.176/01 e 11.484/15 - ICMS cobrado anteriormente por substituição tributária', + '470': 'Nacional, cuja produção tenha sido feita em conformidade com os processos produtivos básicos de que tratam o Decreto-Lei nº 288/67, e as Leis nºs 8.248/91, 8.387/91, 10.176/01 e 11.484/16 - Com redução de base de cálculo e cobrança do ICMS por substituição tributária', + '490': 'Nacional, cuja produção tenha sido feita em conformidade com os processos produtivos básicos de que tratam o Decreto-Lei nº 288/67, e as Leis nºs 8.248/91, 8.387/91, 10.176/01 e 11.484/17 - Outras', + '500': 'Nacional, mercadoria ou bem com Conteúdo de Importação inferior ou igual a 40% (quarenta por cento) - Tributada integralmente', + '510': 'Nacional, mercadoria ou bem com Conteúdo de Importação inferior ou igual a 40% (quarenta por cento) - Tributada e com cobrança do ICMS por substituição tributária', + '520': 'Nacional, mercadoria ou bem com Conteúdo de Importação inferior ou igual a 40% (quarenta por cento) - Com redução de base de cálculo', + '530': 'Nacional, mercadoria ou bem com Conteúdo de Importação inferior ou igual a 40% (quarenta por cento) - Isenta ou não tributada e com cobrança do ICMS por substituição tributária', + '540': 'Nacional, mercadoria ou bem com Conteúdo de Importação inferior ou igual a 40% (quarenta por cento) - Isenta', + '541': 'Nacional, mercadoria ou bem com Conteúdo de Importação inferior ou igual a 40% (quarenta por cento) - Não tributada', + '550': 'Nacional, mercadoria ou bem com Conteúdo de Importação inferior ou igual a 40% (quarenta por cento) - Suspensão', + '551': 'Nacional, mercadoria ou bem com Conteúdo de Importação inferior ou igual a 40% (quarenta por cento) - Diferimento', + '560': 'Nacional, mercadoria ou bem com Conteúdo de Importação inferior ou igual a 40% (quarenta por cento) - ICMS cobrado anteriormente por substituição tributária', + '570': 'Nacional, mercadoria ou bem com Conteúdo de Importação inferior ou igual a 40% (quarenta por cento) - Com redução de base de cálculo e cobrança do ICMS por substituição tributária', + '590': 'Nacional, mercadoria ou bem com Conteúdo de Importação inferior ou igual a 40% (quarenta por cento) - Outras', + '600': 'Estrangeira - Importação direta, sem similar nacional, constante em lista de Resolução CAMEX - Tributada integralmente', + '610': 'Estrangeira - Importação direta, sem similar nacional, constante em lista de Resolução CAMEX - Tributada e com cobrança do ICMS por substituição tributária', + '620': 'Estrangeira - Importação direta, sem similar nacional, constante em lista de Resolução CAMEX - Com redução de base de cálculo', + '630': 'Estrangeira - Importação direta, sem similar nacional, constante em lista de Resolução CAMEX - Isenta ou não tributada e com cobrança do ICMS por substituição tributária', + '640': 'Estrangeira - Importação direta, sem similar nacional, constante em lista de Resolução CAMEX - Isenta', + '641': 'Estrangeira - Importação direta, sem similar nacional, constante em lista de Resolução CAMEX - Não tributada', + '650': 'Estrangeira - Importação direta, sem similar nacional, constante em lista de Resolução CAMEX - Suspensão', + '651': 'Estrangeira - Importação direta, sem similar nacional, constante em lista de Resolução CAMEX - Diferimento', + '660': 'Estrangeira - Importação direta, sem similar nacional, constante em lista de Resolução CAMEX - ICMS cobrado anteriormente por substituição tributária', + '670': 'Estrangeira - Importação direta, sem similar nacional, constante em lista de Resolução CAMEX - Com redução de base de cálculo e cobrança do ICMS por substituição tributária', + '690': 'Estrangeira - Importação direta, sem similar nacional, constante em lista de Resolução CAMEX - Outras', + '700': 'Estrangeira - Adquirida no mercado interno, sem similar nacional, constante em lista de Resolução CAMEX - Tributada integralmente', + '710': 'Estrangeira - Adquirida no mercado interno, sem similar nacional, constante em lista de Resolução CAMEX - Tributada e com cobrança do ICMS por substituição tributária', + '720': 'Estrangeira - Adquirida no mercado interno, sem similar nacional, constante em lista de Resolução CAMEX - Com redução de base de cálculo', + '730': 'Estrangeira - Adquirida no mercado interno, sem similar nacional, constante em lista de Resolução CAMEX - Isenta ou não tributada e com cobrança do ICMS por substituição tributária', + '740': 'Estrangeira - Adquirida no mercado interno, sem similar nacional, constante em lista de Resolução CAMEX - Isenta', + '741': 'Estrangeira - Adquirida no mercado interno, sem similar nacional, constante em lista de Resolução CAMEX - Não tributada', + '750': 'Estrangeira - Adquirida no mercado interno, sem similar nacional, constante em lista de Resolução CAMEX - Suspensão', + '751': 'Estrangeira - Adquirida no mercado interno, sem similar nacional, constante em lista de Resolução CAMEX - Diferimento', + '760': 'Estrangeira - Adquirida no mercado interno, sem similar nacional, constante em lista de Resolução CAMEX - ICMS cobrado anteriormente por substituição tributária', + '770': 'Estrangeira - Adquirida no mercado interno, sem similar nacional, constante em lista de Resolução CAMEX - Com redução de base de cálculo e cobrança do ICMS por substituição tributária', + '790': 'Estrangeira - Adquirida no mercado interno, sem similar nacional, constante em lista de Resolução CAMEX - Outras', + '800': 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 70% (setenta por cento) - Tributada integralmente', + '810': 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 70% (setenta por cento) - Tributada e com cobrança do ICMS por substituição tributária', + '820': 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 70% (setenta por cento) - Com redução de base de cálculo', + '830': 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 70% (setenta por cento) - Isenta ou não tributada e com cobrança do ICMS por substituição tributária', + '840': 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 70% (setenta por cento) - Isenta', + '841': 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 70% (setenta por cento) - Não tributada', + '850': 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 70% (setenta por cento) - Suspensão', + '851': 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 70% (setenta por cento) - Diferimento', + '860': 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 70% (setenta por cento) - ICMS cobrado anteriormente por substituição tributária', + '870': 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 70% (setenta por cento) - Com redução de base de cálculo e cobrança do ICMS por substituição tributária', + '890': 'Nacional, mercadoria ou bem com Conteúdo de Importação superior a 70% (setenta por cento) - Outras', + '900': 'Simples Nacional - Outros', + } + + tabela_tipo_do_item = { + '00': 'Mercadoria para Revenda', + '01': 'Matéria-Prima', + '02': 'Embalagem', + '03': 'Produto em Processo', + '04': 'Produto Acabado', + '05': 'Subproduto', + '06': 'Produto Intermediário', + '07': 'Material de Uso e Consumo', + '08': 'Ativo Imobilizado', + '09': 'Serviços', + '10': 'Outros insumos', + '99': 'Outras', + } + + # 4.1.1- Tabela Modelos de Documentos Fiscais + tabela_modelos_documentos_fiscais = { + '01': 'Nota Fiscal', + '1B': 'Nota Fiscal Avulsa', + '02': 'Nota Fiscal de Venda a Consumidor', + '2D': 'Cupom Fiscal emitido por ECF', + '2E': 'Bilhete de Passagem emitido por ECF', + '04': 'Nota Fiscal de Produtor', + '06': 'Nota Fiscal / Conta de Energia Elétrica', + '07': 'Nota Fiscal de Serviço de Transporte', + '08': 'Conhecimento de Transporte Rodoviário de Cargas', + '8B': 'Conhecimento de Transporte de Cargas Avulso', + '09': 'Conhecimento de Transporte Aquaviário de Cargas', + '10': 'Conhecimento Aéreo', + '11': 'Conhecimento de Transporte Ferroviário de Cargas', + '13': 'Bilhete de Passagem Rodoviário', + '14': 'Bilhete de Passagem Aquaviário', + '15': 'Bilhete de Passagem e Nota de Bagagem', + '17': 'Despacho de Transporte', + '16': 'Bilhete de Passagem Ferroviário', + '18': 'Resumo de Movimento Diário', + '20': 'Ordem de Coleta de Cargas', + '21': 'Nota Fiscal de Serviço de Comunicação', + '22': 'Nota Fiscal de Serviço de Telecomunicação', + '23': 'GNRE', + '24': 'Autorização de Carregamento e Transporte', + '25': 'Manifesto de Carga', + '26': 'Conhecimento de Transporte Multimodal de Cargas', + '27': 'Nota Fiscal de Transporte Ferroviário de Cargas', + '28': 'Nota Fiscal / Conta de Fornecimento de Gás Canalizado', + '29': 'Nota Fiscal / Conta de Fornecimento de Água Canalizada', + '30': 'Bilhete / Recibo do Passageiro', + '55': 'Nota Fiscal Eletrônica: NF-e', + '57': 'Conhecimento de Transporte Eletrônico: CT-e', + '59': 'Cupom Fiscal Eletrônico: CF-e (CF-e-SAT)', + '60': 'Cupom Fiscal Eletrônico: CF-e-ECF', + '63': 'Bilhete de Passagem Eletrônico: BP-e', + '65': 'Nota Fiscal Eletrônica ao Consumidor Final: NFC-e', + '66': 'Nota Fiscal de Energia Elétrica Eletrônica: NF3e', + '67': 'Conhecimento de Transporte Eletrônico para Outros Serviços: CT-e OS', + }