From 92a5a8d9938615c2acd5273c53e74abec2b34257 Mon Sep 17 00:00:00 2001 From: "Carlos R. Silveira" Date: Thu, 15 Nov 2018 11:01:24 -0200 Subject: [PATCH 01/17] Incluido os registros C101 e E --- sped/efd/icms_ipi/arquivos.py | 25 +++++++++++ sped/efd/icms_ipi/registros.py | 79 ++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) diff --git a/sped/efd/icms_ipi/arquivos.py b/sped/efd/icms_ipi/arquivos.py index 3751792..599376d 100644 --- a/sped/efd/icms_ipi/arquivos.py +++ b/sped/efd/icms_ipi/arquivos.py @@ -13,6 +13,7 @@ from .blocos import Bloco1 from .blocos import Bloco9 from .registros import Registro0000 +from .registros import Registro9900 from .registros import Registro9999 @@ -33,3 +34,27 @@ def __init__(self): self._blocos['K'] = BlocoK() self._blocos['1'] = Bloco1() self._blocos['9'] = Bloco9() + + def prepare(self): + bloco_9 = self._blocos['9'] = Bloco9() + + for bloco in self._blocos.values(): + regs = {} + for reg in bloco.registros: + if reg.REG not in regs: + regs[reg.REG] = 0 + regs[reg.REG] += 1 + if bloco == self._blocos['0']: + regs['0000'] = 1 + if bloco == bloco_9: + regs['9999'] = 1 + regs['9900'] += len(regs.keys()) + for reg in regs.keys(): + registro = Registro9900() + registro.REG_BLC = reg + registro.QTD_REG_BLC = str(regs[reg]) + bloco_9.add(registro) + + reg_count = 2 + for bloco in self._blocos.values(): + reg_count += len(bloco.registros) diff --git a/sped/efd/icms_ipi/registros.py b/sped/efd/icms_ipi/registros.py index 6cb1ef6..a47d73c 100644 --- a/sped/efd/icms_ipi/registros.py +++ b/sped/efd/icms_ipi/registros.py @@ -334,6 +334,20 @@ class RegistroC100(Registro): ] +class RegistroC101(Registro): + """ + INFORMAÇÃO COMPLEMENTAR DOS DOCUMENTOS FISCAIS + QUANDO DAS OPERAÇÕES INTERESTADUAIS DESTINADAS A CONSUMIDOR FINAL + NÃO CONTRIBUINTE EC 87/15 (CÓDIGO 55) + """ + campos = [ + CampoFixo(1, 'REG', 'C101'), + Campo(2, 'VL_FCP_UF_DEST'), + Campo(3, 'VL_ICMS_UF_DEST'), + Campo(4, 'VL_ICMS_UF_REM'), + ] + + class RegistroC105(Registro): """ OPERAÇÕES COM ICMS ST RECOLHIDO PARA UF DIVERSA DO DESTINATÁRIO DO DOCUMENTO FISCAL (CÓDIGO 55) @@ -1350,6 +1364,8 @@ class RegistroD100(Registro): Campo(21, 'VL_NT'), Campo(22, 'COD_INF'), Campo(23, 'COD_CTA'), + Campo(24, 'COD_MUN_ORIG'), + Campo(25, 'COD_MUN_DEST'), ] @@ -2230,6 +2246,69 @@ class RegistroE250(Registro): ] +class RegistroE300(Registro): + """ + PERÍODO DE APURAÇÃO DO FUNDO DE COMBATE À POBREZA E + DO ICMS DIFERENCIAL DE ALÍQUOTA – UF ORIGEM/DESTINO EC 87/15 + """ + campos = [ + CampoFixo(1, 'REG', 'E300'), + Campo(2, 'UF'), + Campo(3, 'DT_INI'), + Campo(4, 'DT_FIM'), + ] + + +class RegistroE310(Registro): + """ + APURAÇÃO DO FUNDO DE COMBATE À POBREZA E DO ICMS + DIFERENCIAL DE ALÍQUOTA – UF ORIGEM/DESTINO EC 87/15. + (VÁLIDO A PARTIR DE 01/01/2017) + """ + 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'), + 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'), + Campo(22, 'DEB_ESP_FCP'), + ] + +class RegistroE316(Registro): + """ + OBRIGAÇÕES RECOLHIDAS OU A RECOLHER – FUNDO DE + COMBATE À POBREZA E ICMS DIFERENCIAL DE ALÍQUOTA UF ORIGEM/DESTINO + EC 87/15. + """ + campos = [ + CampoFixo(1, 'REG', 'E316'), + Campo(2, 'COD_OR'), + Campo(3, 'VL_OR'), + Campo(4, 'DT_VCTO'), + Campo(5, 'COD_REC'), + Campo(6, 'NUM_PROC'), + Campo(7, 'IND_PROC'), + Campo(8, 'PROC'), + Campo(9, 'TXT_COMPL'), + Campo(10, 'MES_REF'), + ] + class RegistroE500(Registro): """ PERÍODO DE APURAÇÃO DO IPI From ff4c5b770b22234e790a4f2565283231b6e49570 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Valyi?= Date: Wed, 28 Nov 2018 12:01:24 -0200 Subject: [PATCH 02/17] =?UTF-8?q?campo=20DATA=5F*=20=C3=A9=20tipo=20data.?= =?UTF-8?q?=20Ex:=20DATA=5FINI=5FEMP=20no=20ECD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sped/escrituracao.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sped/escrituracao.py b/sped/escrituracao.py index d64bcbf..634651e 100644 --- a/sped/escrituracao.py +++ b/sped/escrituracao.py @@ -102,18 +102,18 @@ def __init__(self, tipo: str, ano_calendario: int): regras = campo['regras'] tipo = campo['tipo'] obrigatorio = campo['obrigatorio'] - + # Campos Fixo m = re.match(r'"([a-z0-9]+)"', valores, re.IGNORECASE) if m: campos.append(CampoFixo(indice, nome, m.group(1))) continue - + m = re.match(r'\[([a-z0-9]+)\]', valores, re.IGNORECASE) if m: campos.append(CampoFixo(indice, nome, m.group(1))) continue - + # Campos Regex m = re.match(r'\[([^\]]+)\]', valores) if m: @@ -124,12 +124,12 @@ def __init__(self, tipo: str, ano_calendario: int): else: campos.append(CampoRegex(indice, nome, obrigatorio=obrigatorio, regex='|'.join(valoresValidos))) continue - + # Campos Data - if nome.startswith('DT_'): + if nome.startswith('DT_') or nome.startswith('DATA_'): campos.append(CampoData(indice, nome, obrigatorio=obrigatorio)) continue - + # Campo CNPJ ou CPF if 'REGRA_VALIDA_CNPJ' in regras and 'REGRA_VALIDA_CPF' in regras or nome == 'IDENT_CPF_CNPJ' or nome == 'CPF_CNPJ': campos.append(CampoCPFouCNPJ(indice, nome, obrigatorio=obrigatorio)) From 82171ed10efb023d72bfeaa208b2f78fd29d2432 Mon Sep 17 00:00:00 2001 From: Sergio Garcia Date: Mon, 17 Dec 2018 12:58:52 +0000 Subject: [PATCH 03/17] Corrigido quebra de compatibilidade na classe Bloco --- sped/blocos.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sped/blocos.py b/sped/blocos.py index 920843f..d54d773 100644 --- a/sped/blocos.py +++ b/sped/blocos.py @@ -4,7 +4,7 @@ class Bloco(object): - def __init__(self, nome): + def __init__(self, nome=''): self._nome = nome self._registros = [] self.registro_abertura = Registro() From f31d8055d0d9775e4d70f717d296773d998b132b Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Thu, 14 Feb 2019 18:28:43 -0200 Subject: [PATCH 04/17] [FIX] Fixes to generate ECD --- sped/blocos.py | 9 --------- sped/ecd/arquivos.py | 26 ++++++++++++++++++++------ sped/ecd/blocos.py | 16 ++++++++-------- sped/ecd/registros.py | 15 ++++++++------- sped/registros.py | 4 ++++ 5 files changed, 40 insertions(+), 30 deletions(-) diff --git a/sped/blocos.py b/sped/blocos.py index d54d773..138c439 100644 --- a/sped/blocos.py +++ b/sped/blocos.py @@ -7,8 +7,6 @@ class Bloco(object): def __init__(self, nome=''): self._nome = nome self._registros = [] - self.registro_abertura = Registro() - self.registro_encerramento = Registro() def __repr__(self): return f'<{self.__class__.__module__}.{self.__class__.__name__}({self._nome})>' @@ -16,18 +14,11 @@ def __repr__(self): @property def abertura(self): # Define o indicador de movimento ou dados - self.registro_abertura[2] = '0' if self._registros else '1' - print(self.registro_abertura) - print(self.registro_abertura[2]) return self.registro_abertura @property def encerramento(self): # Define a quantidade de registros - if self.registro_abertura.REG[0] == '0' or self.registro_abertura.REG[0] == '9': - self.registro_encerramento[2] = len(self._registros) + 3 - else: - self.registro_encerramento[2] = len(self._registros) + 2 return self.registro_encerramento @property diff --git a/sped/ecd/arquivos.py b/sped/ecd/arquivos.py index a97de61..65746e2 100644 --- a/sped/ecd/arquivos.py +++ b/sped/ecd/arquivos.py @@ -20,13 +20,13 @@ class ArquivoDigital(arquivos.ArquivoDigital): def __init__(self): super(ArquivoDigital, self).__init__() - self._blocos['0'] = Bloco0() - self._blocos['I'] = BlocoI() - self._blocos['J'] = BlocoJ() - self._blocos['9'] = Bloco9() + self._blocos['0'] = Bloco0('0') + self._blocos['I'] = BlocoI('I') + self._blocos['J'] = BlocoJ('J') + self._blocos['9'] = Bloco9('9') def prepare(self): - bloco_9 = self._blocos['9'] = Bloco9() + bloco_9 = self._blocos['9'] = Bloco9('9') for bloco in self._blocos.values(): regs = {} @@ -35,7 +35,15 @@ def prepare(self): regs[reg.REG] = 0 regs[reg.REG] += 1 if bloco == self._blocos['0']: + bloco.registro_encerramento.QTD_LIN_0 = sum( + [x for x in regs.values()]) + 1 regs['0000'] = 1 + if bloco == self._blocos['I']: + bloco.registro_encerramento.QTD_LIN_I = sum( + [x for x in regs.values()]) + if bloco == self._blocos['J']: + bloco.registro_encerramento.QTD_LIN_J = sum( + [x for x in regs.values()]) if bloco == bloco_9: regs['9999'] = 1 regs['9900'] += len(regs.keys()) @@ -45,8 +53,14 @@ def prepare(self): registro.QTD_REG_BLC = regs[reg] bloco_9.add(registro) + if bloco == self._blocos['9']: + bloco.registro_encerramento.QTD_LIN_9 = sum( + [x for x in regs.values()]) + reg_count = 2 for bloco in self._blocos.values(): reg_count += len(bloco.registros) - self._registro_encerramento[2] = reg_count + self._blocos['I'].registros[2].QTD_LIN = reg_count + self._blocos['J'].registros[1].QTD_LIN = reg_count + self._registro_encerramento.QTD_LIN = reg_count diff --git a/sped/ecd/blocos.py b/sped/ecd/blocos.py index cc0b7db..f38e255 100644 --- a/sped/ecd/blocos.py +++ b/sped/ecd/blocos.py @@ -15,8 +15,8 @@ class Bloco0(Bloco): """ Abertura, Identificação e Referências """ - registro_abertura = Registro0001 - registro_encerramento = Registro0990 + registro_abertura = Registro0001() + registro_encerramento = Registro0990() @property def fechamento(self): @@ -29,24 +29,24 @@ class BlocoI(Bloco): """ Lançamentos Contábeis """ - registro_abertura = RegistroI001 - registro_encerramento = RegistroI990 + registro_abertura = RegistroI001() + registro_encerramento = RegistroI990() class BlocoJ(Bloco): """ Demonstrações Contábeis """ - registro_abertura = RegistroJ001 - registro_encerramento = RegistroJ990 + registro_abertura = RegistroJ001() + registro_encerramento = RegistroJ990() class Bloco9(Bloco): """ Controle e Encerramento do Arquivo Digital """ - registro_abertura = Registro9001 - registro_encerramento = Registro9990 + registro_abertura = Registro9001() + registro_encerramento = Registro9990() @property def fechamento(self): diff --git a/sped/ecd/registros.py b/sped/ecd/registros.py index c6b3d0a..19ee236 100644 --- a/sped/ecd/registros.py +++ b/sped/ecd/registros.py @@ -29,11 +29,11 @@ class Registro0000(Registro): Campo(13, 'IND_NIRE'), Campo(14, 'IND_FIN_ESC'), Campo(15, 'COD_HASH_SUB'), - Campo(16, 'NIRE_SUBST'), - Campo(17, 'IND_GRANDE_PORTE'), - Campo(18, 'TIP_ECD'), - Campo(19, 'COD_SCP'), - Campo(20, 'IDENT_MF') + Campo(16, 'IND_GRANDE_PORTE'), + Campo(17, 'TIP_ECD'), + Campo(18, 'COD_SCP'), + Campo(19, 'IDENT_MF'), + Campo(20, 'IND_ESC_CONS') ] @@ -509,7 +509,7 @@ class RegistroJ930(Registro): campos = [ CampoFixo(1, 'REG', 'J930'), CampoAlfanumerico(2, 'IDENT_NOM'), - CampoAlfanumerico(3, 'IDENT_CPF', tamanho=11), + CampoAlfanumerico(3, 'IDENT_CPF_CNPJ', tamanho=14), CampoAlfanumerico(4, 'IDENT_QUALIF'), CampoAlfanumerico(5, 'COD_ASSIN', tamanho=3), CampoAlfanumerico(6, 'IND_CRC'), @@ -517,7 +517,8 @@ class RegistroJ930(Registro): CampoAlfanumerico(8, 'FONE'), CampoAlfanumerico(9, 'UF_CRC'), CampoAlfanumerico(10, 'NUM_SEQ_CRC'), - CampoData(11, 'DT_CRC') + CampoData(11, 'DT_CRC'), + CampoAlfanumerico(12, 'IND_RESP_LEGAL') ] diff --git a/sped/registros.py b/sped/registros.py index 29d5f25..920b2a5 100644 --- a/sped/registros.py +++ b/sped/registros.py @@ -78,6 +78,10 @@ def __init__(self, line=None): if self._valores[c.indice] != c.valor: raise CampoError(self, c.nome) + @property + def campos(self): + return self.__class__.campos + @property def valores(self): return self._valores From 977e8d59585b68c2a2dfa4094ec13add07e78a13 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Wed, 27 Feb 2019 13:44:38 -0300 Subject: [PATCH 05/17] [IMP] Melhoria na contagem de registros no prepare --- sped/ecd/arquivos.py | 13 +++++++++++-- sped/ecd/registros.py | 2 ++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/sped/ecd/arquivos.py b/sped/ecd/arquivos.py index 65746e2..0a58bb2 100644 --- a/sped/ecd/arquivos.py +++ b/sped/ecd/arquivos.py @@ -10,6 +10,8 @@ from .registros import Registro0000 from .registros import Registro9900 from .registros import Registro9999 +from .registros import RegistroI030 +from .registros import RegistroJ900 class ArquivoDigital(arquivos.ArquivoDigital): @@ -61,6 +63,13 @@ def prepare(self): for bloco in self._blocos.values(): reg_count += len(bloco.registros) - self._blocos['I'].registros[2].QTD_LIN = reg_count - self._blocos['J'].registros[1].QTD_LIN = reg_count + encerramentoI = [x for x in self._blocos['I'].registros + if isinstance(x, RegistroI030)] + encerramentoI[0].QTD_LIN = reg_count + + encerramentoJ = [x for x in self._blocos['J'].registros + if isinstance(x, RegistroJ900)] + encerramentoJ[0].QTD_LIN = reg_count + + # self._blocos['J'].registros[1].QTD_LIN = reg_count self._registro_encerramento.QTD_LIN = reg_count diff --git a/sped/ecd/registros.py b/sped/ecd/registros.py index 19ee236..9285857 100644 --- a/sped/ecd/registros.py +++ b/sped/ecd/registros.py @@ -456,6 +456,7 @@ class RegistroJ100(Registro): Campo(7, 'IND_DC_BAL'), CampoNumerico(8, 'VL_CTA_INI', precisao=2), Campo(9, 'IND_DC_BAL_INI'), + Campo(10, 'NOTA_EXP_REF'), ] @@ -472,6 +473,7 @@ class RegistroJ150(Registro): Campo(6, 'IND_VL'), CampoNumerico(7, 'VL_CTA_ULT_DRE', precisao=2), Campo(8, 'IND_VL_ULT_DRE'), + Campo(9, 'NOTA_EXP_REF'), ] From f634af26a488093466abbf327a6c0d50922454ff Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Tue, 30 Apr 2019 01:05:24 -0300 Subject: [PATCH 06/17] =?UTF-8?q?[FIX]=20Ajusta=20lib=20para=20emiss=C3=A3?= =?UTF-8?q?o=20de=20ICMS-IPI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sped/efd/icms_ipi/blocos.py | 37 +++++++++++++------------- sped/efd/pis_cofins/blocos.py | 50 ++++++++++++++--------------------- 2 files changed, 38 insertions(+), 49 deletions(-) diff --git a/sped/efd/icms_ipi/blocos.py b/sped/efd/icms_ipi/blocos.py index a94b1e2..e0c1a52 100644 --- a/sped/efd/icms_ipi/blocos.py +++ b/sped/efd/icms_ipi/blocos.py @@ -25,8 +25,8 @@ class Bloco0(Bloco): """ Abertura, Identificação e Referências """ - registro_abertura = Registro0001 - registro_encerramento = Registro0990 + registro_abertura = Registro0001() + registro_encerramento = Registro0990() @property def fechamento(self): @@ -40,64 +40,64 @@ class BlocoC(Bloco): """ Documentos Fiscais I – Mercadorias (ICMS/IPI) """ - registro_abertura = RegistroC001 - registro_encerramento = RegistroC990 + registro_abertura = RegistroC001() + registro_encerramento = RegistroC990() class BlocoD(Bloco): """ Documentos Fiscais II – Serviços (ICMS) """ - registro_abertura = RegistroD001 - registro_encerramento = RegistroD990 + registro_abertura = RegistroD001() + registro_encerramento = RegistroD990() class BlocoE(Bloco): """ Apuração do ICMS e do IPI """ - registro_abertura = RegistroE001 - registro_encerramento = RegistroE990 + registro_abertura = RegistroE001() + registro_encerramento = RegistroE990() class BlocoG(Bloco): """ Controle do Crédito de ICMS do Ativo Permanente – CIAP """ - registro_abertura = RegistroG001 - registro_encerramento = RegistroG990 + registro_abertura = RegistroG001() + registro_encerramento = RegistroG990() class BlocoH(Bloco): """ Inventário Físico """ - registro_abertura = RegistroH001 - registro_encerramento = RegistroH990 + registro_abertura = RegistroH001() + registro_encerramento = RegistroH990() class BlocoK(Bloco): """ Controle da Produção e do Estoque """ - registro_abertura = RegistroK001 - registro_encerramento = RegistroK990 + registro_abertura = RegistroK001() + registro_encerramento = RegistroK990() class Bloco1(Bloco): """ Outras Informações """ - registro_abertura = Registro1001 - registro_encerramento = Registro1990 + registro_abertura = Registro1001() + registro_encerramento = Registro1990() class Bloco9(Bloco): """ Controle e Encerramento do Arquivo Digital """ - registro_abertura = Registro9001 - registro_encerramento = Registro9990 + registro_abertura = Registro9001() + registro_encerramento = Registro9990() @property def fechamento(self): @@ -105,4 +105,3 @@ def fechamento(self): # Define a quantidade de registros registro[2] = len(self._registros) + 3 return registro - diff --git a/sped/efd/pis_cofins/blocos.py b/sped/efd/pis_cofins/blocos.py index 3b69c1e..5246afa 100644 --- a/sped/efd/pis_cofins/blocos.py +++ b/sped/efd/pis_cofins/blocos.py @@ -27,87 +27,77 @@ class Bloco0(Bloco): """ Abertura, Identificação e Referências """ - def __init__(self): - self._registro_abertura = Registro0001() - self._registro_encerramento = Registro0990() + registro_abertura = Registro0001() + registro_encerramento = Registro0990() class BlocoA(Bloco): """ Documentos Fiscais - Serviços (ISS) """ - def __init__(self): - self._registro_abertura = RegistroA001() - self._registro_encerramento = RegistroA990() + registro_abertura = RegistroA001() + registro_encerramento = RegistroA990() class BlocoC(Bloco): """ Documentos Fiscais I – Mercadorias (ICMS/IPI) """ - def __init__(self): - self._registro_abertura = RegistroC001() - self._registro_encerramento = RegistroC990() + registro_abertura = RegistroC001() + registro_encerramento = RegistroC990() class BlocoD(Bloco): """ Documentos Fiscais II – Serviços (ICMS) """ - def __init__(self): - self._registro_abertura = RegistroD001() - self._registro_encerramento = RegistroD990() + registro_abertura = RegistroD001() + registro_encerramento = RegistroD990() class BlocoF(Bloco): """ Demais Documentos e Operações """ - def __init__(self): - self._registro_abertura = RegistroF001() - self._registro_encerramento = RegistroF990() + registro_abertura = RegistroF001() + registro_encerramento = RegistroF990() class BlocoI(Bloco): """ Operações das Instituições Financeiras e Assemelhadas, Seguradoras, Entidades de Previdência Privada e Operadoras de Planos de Assistência à Saúde (*) """ - def __init__(self): - self._registro_abertura = RegistroI001() - self._registro_encerramento = RegistroI990() + registro_abertura = RegistroI001() + registro_encerramento = RegistroI990() class BlocoM(Bloco): """ Apuração da Contribuição e Crédito de PIS/PASEP e da COFINS """ - def __init__(self): - self._registro_abertura = RegistroM001() - self._registro_encerramento = RegistroM990() + registro_abertura = RegistroM001() + registro_encerramento = RegistroM990() class BlocoP(Bloco): """ Apuração da Contribuição Previdenciária sobre a Receita Bruta """ - def __init__(self): - self._registro_abertura = RegistroP001() - self._registro_encerramento = RegistroP990() + registro_abertura = RegistroP001() + registro_encerramento = RegistroP990() class Bloco1(Bloco): """ Complemento da Escrituração – Controle de Saldos de Créditos e de Retenções, Operações Extemporâneas e Outras Informações """ - def __init__(self): - self._registro_abertura = Registro1001() - self._registro_encerramento = Registro1990() + registro_abertura = Registro1001() + registro_encerramento = Registro1990() class Bloco9(Bloco): """ Controle e Encerramento do Arquivo Digital """ - def __init__(self): - self._registro_abertura = Registro0001() - self._registro_encerramento = Registro0990() + registro_abertura = Registro0001() + registro_encerramento = Registro0990() From b0335c24dff550d81ea3baea57333e970bcc7f55 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Tue, 30 Apr 2019 01:13:45 -0300 Subject: [PATCH 07/17] [DEP] Adding deploy to our pypi account --- .travis.yml | 21 ++++++++++----------- README.md | 7 +++---- setup.py | 6 +++--- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/.travis.yml b/.travis.yml index 85761d4..0763e96 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,20 +3,19 @@ python: - '3.4' - '2.7' install: - - pip install six - - pip install pytest - - pip install coveralls +- pip install six +- pip install pytest +- pip install coveralls script: - - coverage run --source=sped setup.py test - - python test/fci_test.py +- coverage run --source=sped setup.py test +- python test/fci_test.py deploy: provider: pypi - user: ginx + user: danimaribeiro password: - secure: "TAjKq1M0eWjMq/ZJ2tuBOYbcLY1v0mwKqRUsrpBJUOgam+4YLQhblPcHLZ3yOV5FzqBxHU/WBByZMloW3Cx5+FYL0MRDmktJTqsM0OjdIqmS5m9+yWIQul8nc/54Aa5lMhXgmDHFrqVV+Noe7nYZ//EetN02DHwx7HN/3lva/Is=" - distributions: "sdist bdist_wheel" + secure: PDqIGKOTaUWpM4R8HDqV9cumPUlbLBH/IpFpkGfy79E4UsR6cY4eb0WfoNwBXIlH0lBqVIJizgHcqD3yo0GeHFmOrnjOIZdSZyo3QG7W+nlzIohrwvgQ+pG//nBOgRJn/K5FVV9f2HM+QgKpNXgVU14ZIu+iR8mv/uanuMFoIZu9zmTUJk7mBYGRJteBsr7i+2AaTODQp4G1kXdnWQhj5R+cCVgd2uMFEtErXrqUs+KJ5hxT+OvDQQgEeZao7CVm8fS7Y+OJXBAciXnvtN/dmXlIWXJTtplnnzjGnuwj3c5hnpaX5N3PzJQwXy0ParrwyMoKRFr4ESgZWrlxHnxaPNe0TQjqQs2MFprFVoYgDKfaOzdcwI+bdKaiDztcvOmHPi17L8LdryTT97zSuTMFcKXkhxbr/W/kyL4VClIVrp3AVHyu4K9ih9rjgM+AZjIK28B2GKLCvaZpQy/lFmi21TyNZ92lodWKXJX76i7HhdkExasBiWk3CprC3cuL4wDPJnp9Rb9oO0R0qBV11UC4MsPvtR+6RSJZt/eus3iyNWcq4nbMlFe//yvk265n8nJlxP4qcCthi5+zthbGWoH7+TOMHVE0Svla7EKY0TpPtlixh9Jj0Reqk8sJqbo8RuvrI37nsJG1F5QAmme2TYtn4CryekbCpQLCvq8eZBGCk/4= on: - tags: true - repo: sped-br/python-sped + branch: 11.0 + distributions: bdist_wheel after_success: - - coveralls +- coveralls diff --git a/README.md b/README.md index f0d6df8..ec7dc2f 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,7 @@ # SPED para python -[![Build Status](https://travis-ci.org/sped-br/python-sped.svg "Build Status")](https://travis-ci.org/sped-br/python-sped) -[![Coverage Status](https://coveralls.io/repos/sped-br/python-sped/badge.svg)](https://coveralls.io/r/sped-br/python-sped) -[![Code Health](https://landscape.io/github/sped-br/python-sped/master/landscape.svg?style=flat)](https://landscape.io/github/sped-br/python-sped/master) +[![Build Status](https://travis-ci.org/Trust-Code/python-sped.svg?branch=11.0)](https://travis-ci.org/Trust-Code/python-sped) +[![Coverage Status](https://coveralls.io/repos/github/Trust-Code/python-sped/badge.svg?branch=11.0)](https://coveralls.io/github/Trust-Code/python-sped?branch=11.0) Biblioteca para geração dos arquivos do Sistema Público de Escrituração Digital (SPED) para Python. @@ -15,7 +14,7 @@ Biblioteca para geração dos arquivos do Sistema Público de Escrituração Dig ## Como instalar - $ pip install sped + $ pip install python-sped ## Objetivos do Projeto diff --git a/setup.py b/setup.py index a1e2ad8..6a89b0e 100644 --- a/setup.py +++ b/setup.py @@ -27,7 +27,7 @@ def run_tests(self): setup( - name='sped', + name='python-sped', packages=find_packages(exclude=['contrib', 'docs', 'test*']), include_package_data=True, package_data={ @@ -39,8 +39,8 @@ def run_tests(self): 'Python.', author='Sergio Garcia', author_email='sergio@ginx.com.br', - url='https://github.com/sped-br/python-sped', - download_url='https://github.com/sped-br/python-sped/releases', + url='https://github.com/Trust-Code/python-sped', + download_url='https://github.com/Trust-Code/python-sped/releases', license='MIT', classifiers=[ 'Development Status :: 3 - Alpha', From 75192580bb201e13b53c57e1cd4d980b89319f81 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Tue, 30 Apr 2019 01:18:57 -0300 Subject: [PATCH 08/17] =?UTF-8?q?[FIX]=20Ajusta=20apenas=20build=20para=20?= =?UTF-8?q?vers=C3=A3o=203.6=20do=20python?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0763e96..f5256f1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ language: python python: -- '3.4' -- '2.7' +- '3.6' install: - pip install six - pip install pytest From 1dd7fd37877022046f614be4ff0e0dd6ff32caa8 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Tue, 30 Apr 2019 01:25:34 -0300 Subject: [PATCH 09/17] =?UTF-8?q?[FIX]=20Remove=20os=20testes=20unit=C3=A1?= =?UTF-8?q?rios=20de=20FCI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .travis.yml | 1 - sped/fci/blocos.py | 26 +++++++++++--------------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/.travis.yml b/.travis.yml index f5256f1..53a33ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,6 @@ install: - pip install coveralls script: - coverage run --source=sped setup.py test -- python test/fci_test.py deploy: provider: pypi user: danimaribeiro diff --git a/sped/fci/blocos.py b/sped/fci/blocos.py index dfa2e89..c9399cc 100644 --- a/sped/fci/blocos.py +++ b/sped/fci/blocos.py @@ -14,43 +14,39 @@ class Bloco0(Bloco): """ Cabeçalho da FCI: Identificação do contribuinte """ - registro_abertura = Registro0001 - registro_encerramento = Registro0990 + registro_abertura = Registro0001() + registro_encerramento = Registro0990() @property def abertura(self): - registro = self.__class__.registro_abertura() - return registro + return self.registro_abertura @property def fechamento(self): - registro = self.__class__.registro_encerramento() # Define a quantidade de registros - registro[2] = len(self._registros) + 3 - return registro + self.registro_encerramento[2] = len(self._registros) + 3 + return self.registro_encerramento def add(self, registro): self._registros.append(registro) class Bloco5(Bloco): - registro_abertura = Registro5001 - registro_encerramento = Registro5990 + registro_abertura = Registro5001() + registro_encerramento = Registro5990() @property def abertura(self): - registro = self.__class__.registro_abertura() - return registro + return self.registro_abertura class Bloco9(Bloco): """ Controle e Encerramento do Arquivo Digital """ - registro_abertura = Registro9001 - registro_encerramento = Registro9990 + registro_abertura = Registro9001() + registro_encerramento = Registro9990() @property def abertura(self): - registro = self.__class__.registro_abertura() - return registro + return self.registro_abertura From 20768d5a298f6598c691e8b6f57fd8228c6a0c12 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Tue, 30 Apr 2019 10:54:30 -0300 Subject: [PATCH 10/17] [FIX] Ajuste de campos para Sped ICMS --- sped/efd/icms_ipi/registros.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/sped/efd/icms_ipi/registros.py b/sped/efd/icms_ipi/registros.py index a47d73c..43ef32c 100644 --- a/sped/efd/icms_ipi/registros.py +++ b/sped/efd/icms_ipi/registros.py @@ -2262,7 +2262,7 @@ class RegistroE300(Registro): class RegistroE310(Registro): """ APURAÇÃO DO FUNDO DE COMBATE À POBREZA E DO ICMS - DIFERENCIAL DE ALÍQUOTA – UF ORIGEM/DESTINO EC 87/15. + DIFERENCIAL DE ALÍQUOTA – UF ORIGEM/DESTINO EC 87/15. (VÁLIDO A PARTIR DE 01/01/2017) """ campos = [ @@ -2482,7 +2482,7 @@ class RegistroH001(Registro): """ campos = [ CampoFixo(1, 'REG', 'H001'), - Campo(2, 'IND_MO V'), + Campo(2, 'IND_MOV'), ] @@ -2492,8 +2492,8 @@ class RegistroH005(Registro): """ campos = [ CampoFixo(1, 'REG', 'H005'), - Campo(2, 'DT_INV'), - Campo(3, 'VL_INV'), + CampoData(2, 'DT_INV'), + CampoNumerico(3, 'VL_INV'), Campo(4, 'MOT_INV'), ] @@ -2506,9 +2506,9 @@ class RegistroH010(Registro): CampoFixo(1, 'REG', 'H010'), Campo(2, 'COD_ITEM'), Campo(3, 'UNID'), - Campo(4, 'QTD'), - Campo(5, 'VL_UNIT'), - Campo(6, 'VL_ITEM'), + CampoNumerico(4, 'QTD'), + CampoNumerico(5, 'VL_UNIT'), + CampoNumerico(6, 'VL_ITEM'), Campo(7, 'IND_PROP'), Campo(8, 'COD_PART'), Campo(9, 'TXT_COMPL'), @@ -2567,7 +2567,7 @@ class RegistroK200(Registro): CampoFixo(1, 'REG', 'K200'), CampoData(2, 'DT_EST'), Campo(3, 'COD_ITEM'), - Campo(4, 'QTD'), + CampoNumerico(4, 'QTD'), Campo(5, 'IND_EST'), Campo(6, 'COD_PART'), ] @@ -2582,7 +2582,7 @@ class RegistroK220(Registro): CampoData(2, 'DT_MOV'), Campo(3, 'COD_ITEM_ORI'), Campo(4, 'COD_ITEM_DEST'), - Campo(5, 'QTD'), + CampoNumerico(5, 'QTD'), ] @@ -2596,7 +2596,7 @@ class RegistroK230(Registro): CampoData(3, 'DT_FIN_OP'), Campo(4, 'COD_DOC_OP'), Campo(5, 'COD_ITEM'), - Campo(6, 'QTD_ENC'), + CampoNumerico(6, 'QTD_ENC'), ] @@ -2606,9 +2606,9 @@ class RegistroK235(Registro): """ campos = [ CampoFixo(1, 'REG', 'K235'), - CampoData(2, 'DT_SAÍDA'), + CampoData(2, 'DT_SAIDA'), Campo(3, 'COD_ITEM'), - Campo(4, 'QTD'), + CampoNumerico(4, 'QTD'), Campo(5, 'COD_INS_SUBST'), ] @@ -2621,7 +2621,7 @@ class RegistroK250(Registro): CampoFixo(1, 'REG', 'K250'), CampoData(2, 'DT_PROD'), Campo(3, 'COD_ITEM'), - Campo(4, 'QTD'), + CampoNumerico(4, 'QTD'), ] @@ -2633,7 +2633,7 @@ class RegistroK255(Registro): CampoFixo(1, 'REG', 'K255'), CampoData(2, 'DT_CONS'), Campo(3, 'COD_ITEM'), - Campo(4, 'QTD'), + CampoNumerico(4, 'QTD'), Campo(5, 'COD_INS_SUBST'), ] From dc08f0af2e50f856e832f2c0a7db3d009086392b Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Tue, 30 Apr 2019 15:00:07 -0300 Subject: [PATCH 11/17] [FIX] Corrigindo campos para o EFD ICMS --- sped/efd/icms_ipi/arquivos.py | 28 +++++-- sped/efd/icms_ipi/blocos.py | 10 +++ sped/efd/icms_ipi/registros.py | 146 +++++++++++++++++++-------------- 3 files changed, 119 insertions(+), 65 deletions(-) diff --git a/sped/efd/icms_ipi/arquivos.py b/sped/efd/icms_ipi/arquivos.py index 599376d..fb66e3e 100644 --- a/sped/efd/icms_ipi/arquivos.py +++ b/sped/efd/icms_ipi/arquivos.py @@ -4,6 +4,7 @@ from . import blocos from . import registros from .blocos import Bloco0 +from .blocos import BlocoB from .blocos import BlocoC from .blocos import BlocoD from .blocos import BlocoE @@ -26,6 +27,7 @@ class ArquivoDigital(arquivos.ArquivoDigital): def __init__(self): super(ArquivoDigital, self).__init__() self._blocos['0'] = Bloco0() + self._blocos['B'] = BlocoB() self._blocos['C'] = BlocoC() self._blocos['D'] = BlocoD() self._blocos['E'] = BlocoE() @@ -37,15 +39,35 @@ def __init__(self): def prepare(self): bloco_9 = self._blocos['9'] = Bloco9() - for bloco in self._blocos.values(): regs = {} for reg in bloco.registros: if reg.REG not in regs: regs[reg.REG] = 0 regs[reg.REG] += 1 + total = sum([x for x in regs.values()]) + bloco.registro_abertura.IND_MOV = '1' if total <= 2 else '0' if bloco == self._blocos['0']: + bloco.registro_encerramento.QTD_LIN_0 = total + 1 regs['0000'] = 1 + if bloco == self._blocos['B']: + bloco.registro_encerramento.QTD_LIN_B = total + if bloco == self._blocos['C']: + bloco.registro_encerramento.QTD_LIN_C = total + if bloco == self._blocos['D']: + bloco.registro_encerramento.QTD_LIN_D = total + if bloco == self._blocos['E']: + bloco.registro_encerramento.QTD_LIN_E = total + if bloco == self._blocos['G']: + bloco.registro_encerramento.QTD_LIN_G = total + if bloco == self._blocos['H']: + bloco.registro_encerramento.QTD_LIN_H = total + if bloco == self._blocos['K']: + bloco.registro_encerramento.QTD_LIN_K = total + if bloco == self._blocos['1']: + bloco.registro_encerramento.QTD_LIN_1 = total + if bloco == self._blocos['9']: + bloco.registro_encerramento.QTD_LIN_9 = total + 5 if bloco == bloco_9: regs['9999'] = 1 regs['9900'] += len(regs.keys()) @@ -54,7 +76,3 @@ def prepare(self): registro.REG_BLC = reg registro.QTD_REG_BLC = str(regs[reg]) bloco_9.add(registro) - - reg_count = 2 - for bloco in self._blocos.values(): - reg_count += len(bloco.registros) diff --git a/sped/efd/icms_ipi/blocos.py b/sped/efd/icms_ipi/blocos.py index e0c1a52..e755e61 100644 --- a/sped/efd/icms_ipi/blocos.py +++ b/sped/efd/icms_ipi/blocos.py @@ -3,6 +3,8 @@ from ...blocos import Bloco from .registros import Registro0001 from .registros import Registro0990 +from .registros import RegistroB001 +from .registros import RegistroB990 from .registros import RegistroC001 from .registros import RegistroC990 from .registros import RegistroD001 @@ -36,6 +38,14 @@ def fechamento(self): return registro +class BlocoB(Bloco): + """ + Apuração de ISS – Mercadorias (ICMS/IPI) + """ + registro_abertura = RegistroB001() + registro_encerramento = RegistroB990() + + class BlocoC(Bloco): """ Documentos Fiscais I – Mercadorias (ICMS/IPI) diff --git a/sped/efd/icms_ipi/registros.py b/sped/efd/icms_ipi/registros.py index 43ef32c..b89ccd4 100644 --- a/sped/efd/icms_ipi/registros.py +++ b/sped/efd/icms_ipi/registros.py @@ -15,8 +15,8 @@ class Registro0000(Registro): CampoFixo(1, 'REG', '0000'), Campo(2, 'COD_VER'), Campo(3, 'COD_FIN'), - Campo(4, 'DT_INI'), - Campo(5, 'DT_FIN'), + CampoData(4, 'DT_INI'), + CampoData(5, 'DT_FIN'), Campo(6, 'NOME'), Campo(7, 'CNPJ'), Campo(8, 'CPF'), @@ -163,8 +163,8 @@ class Registro0205(Registro): campos = [ CampoFixo(1, 'REG', '0205'), Campo(2, 'DESCR_ANT_ITEM'), - Campo(3, 'DT_INI'), - Campo(4, 'DT_FIM'), + CampoData(3, 'DT_INI'), + CampoData(4, 'DT_FIM'), Campo(5, 'COD_ANT_ITEM'), ] @@ -287,6 +287,26 @@ class Registro0990(Registro): ] +class RegistroB001(Registro): + """ + ABERTURA DO BLOCO B + """ + campos = [ + CampoFixo(1, 'REG', 'B001'), + Campo(2, 'IND_MOV', '1'), + ] + + +class RegistroB990(Registro): + """ + ENCERRAMENTO DO BLOCO B + """ + campos = [ + CampoFixo(1, 'REG', 'B990'), + CampoNumerico(2, 'QTD_LIN_B', 2), + ] + + class RegistroC001(Registro): """ ABERTURA DO BLOCO C @@ -311,26 +331,26 @@ class RegistroC100(Registro): Campo(7, 'SER'), Campo(8, 'NUM_DOC'), Campo(9, 'CHV_NFE'), - Campo(10, 'DT_DOC'), - Campo(11, 'DT_E_S'), - Campo(12, 'VL_DOC'), + CampoData(10, 'DT_DOC'), + CampoData(11, 'DT_E_S'), + CampoNumerico(12, 'VL_DOC'), Campo(13, 'IND_PGTO'), - Campo(14, 'VL_DESC'), - Campo(15, 'VL_ABAT_NT'), - Campo(16, 'VL_MERC'), + CampoNumerico(14, 'VL_DESC'), + CampoNumerico(15, 'VL_ABAT_NT'), + CampoNumerico(16, 'VL_MERC'), Campo(17, 'IND_FRT'), - Campo(18, 'VL_FRT'), - Campo(19, 'VL_SEG'), - Campo(20, 'VL_OUT_DA'), - Campo(21, 'VL_BC_ICMS'), - Campo(22, 'VL_ICMS'), - Campo(23, 'VL_BC_ICMS_ST'), - Campo(24, 'VL_ICMS_ST'), - Campo(25, 'VL_IPI'), - Campo(26, 'VL_PIS'), - Campo(27, 'VL_COFINS'), - Campo(28, 'VL_PIS_ST'), - Campo(29, 'VL_COFINS_ST'), + CampoNumerico(18, 'VL_FRT'), + CampoNumerico(19, 'VL_SEG'), + CampoNumerico(20, 'VL_OUT_DA'), + CampoNumerico(21, 'VL_BC_ICMS'), + CampoNumerico(22, 'VL_ICMS'), + CampoNumerico(23, 'VL_BC_ICMS_ST'), + CampoNumerico(24, 'VL_ICMS_ST'), + CampoNumerico(25, 'VL_IPI'), + CampoNumerico(26, 'VL_PIS'), + CampoNumerico(27, 'VL_COFINS'), + CampoNumerico(28, 'VL_PIS_ST'), + CampoNumerico(29, 'VL_COFINS_ST'), ] @@ -559,42 +579,43 @@ class RegistroC170(Registro): """ campos = [ CampoFixo(1, 'REG', 'C170'), - Campo(2, 'NUM_ITEM'), + CampoNumerico(2, 'NUM_ITEM'), Campo(3, 'COD_ITEM'), Campo(4, 'DESCR_COMPL'), - Campo(5, 'QTD'), + CampoNumerico(5, 'QTD'), Campo(6, 'UNID'), - Campo(7, 'VL_ITEM'), - Campo(8, 'VL_DESC'), + CampoNumerico(7, 'VL_ITEM'), + CampoNumerico(8, 'VL_DESC'), Campo(9, 'IND_MOV'), Campo(10, 'CST_ICMS'), Campo(11, 'CFOP'), Campo(12, 'COD_NAT'), - Campo(13, 'VL_BC_ICMS'), - Campo(14, 'ALIQ_ICMS'), - Campo(15, 'VL_ICMS'), - Campo(16, 'VL_BC_ICMS_ST'), - Campo(17, 'ALIQ_ST'), - Campo(18, 'VL_ICMS_ST'), + CampoNumerico(13, 'VL_BC_ICMS'), + CampoNumerico(14, 'ALIQ_ICMS'), + CampoNumerico(15, 'VL_ICMS'), + CampoNumerico(16, 'VL_BC_ICMS_ST'), + CampoNumerico(17, 'ALIQ_ST'), + CampoNumerico(18, 'VL_ICMS_ST'), Campo(19, 'IND_APUR'), Campo(20, 'CST_IPI'), Campo(21, 'COD_ENQ'), - Campo(22, 'VL_BC_IPI'), - Campo(23, 'ALIQ_IPI'), - Campo(24, 'VL_IPI'), + CampoNumerico(22, 'VL_BC_IPI'), + CampoNumerico(23, 'ALIQ_IPI'), + CampoNumerico(24, 'VL_IPI'), Campo(25, 'CST_PIS'), - Campo(26, 'VL_BC_PIS'), - Campo(27, 'ALIQ_PIS'), - Campo(28, 'QUANT_BC_PIS'), - Campo(29, 'ALIQ_PIS'), - Campo(30, 'VL_PIS'), + CampoNumerico(26, 'VL_BC_PIS'), + CampoNumerico(27, 'ALIQ_PIS'), + CampoNumerico(28, 'QUANT_BC_PIS'), + CampoNumerico(29, 'ALIQ_PIS'), + CampoNumerico(30, 'VL_PIS'), Campo(31, 'CST_COFINS'), - Campo(32, 'VL_BC_COFINS'), - Campo(33, 'ALIQ_COFINS'), - Campo(34, 'QUANT_BC_COFINS'), - Campo(35, 'ALIQ_COFINS'), - Campo(36, 'VL_COFINS'), + CampoNumerico(32, 'VL_BC_COFINS'), + CampoNumerico(33, 'ALIQ_COFINS'), + CampoNumerico(34, 'QUANT_BC_COFINS'), + CampoNumerico(35, 'ALIQ_COFINS'), + CampoNumerico(36, 'VL_COFINS'), Campo(37, 'COD_CTA'), + CampoNumerico(38, 'VL_ABAT_NT'), ] @@ -2048,8 +2069,8 @@ class RegistroE100(Registro): """ campos = [ CampoFixo(1, 'REG', 'E100'), - Campo(2, 'DT_INI'), - Campo(3, 'DT_FIN'), + CampoData(2, 'DT_INI'), + CampoData(3, 'DT_FIN'), ] @@ -2156,8 +2177,8 @@ class RegistroE200(Registro): campos = [ CampoFixo(1, 'REG', 'E200'), Campo(2, 'UF'), - Campo(3, 'DT_INI'), - Campo(4, 'DT_FIN'), + CampoData(3, 'DT_INI'), + CampoData(4, 'DT_FIN'), ] @@ -2254,8 +2275,8 @@ class RegistroE300(Registro): campos = [ CampoFixo(1, 'REG', 'E300'), Campo(2, 'UF'), - Campo(3, 'DT_INI'), - Campo(4, 'DT_FIM'), + CampoData(3, 'DT_INI'), + CampoData(4, 'DT_FIN'), ] @@ -2309,6 +2330,7 @@ class RegistroE316(Registro): Campo(10, 'MES_REF'), ] + class RegistroE500(Registro): """ PERÍODO DE APURAÇÃO DO IPI @@ -2316,8 +2338,8 @@ class RegistroE500(Registro): campos = [ CampoFixo(1, 'REG', 'E500'), Campo(2, 'IND_APUR'), - Campo(3, 'DT_INI'), - Campo(4, 'DT_FIN'), + CampoData(3, 'DT_INI'), + CampoData(4, 'DT_FIN'), ] @@ -2382,7 +2404,7 @@ class RegistroG001(Registro): """ campos = [ CampoFixo(1, 'REG', 'G001'), - Campo(2, 'IND_MO V'), + Campo(2, 'IND_MOV'), ] @@ -2392,8 +2414,8 @@ class RegistroG110(Registro): """ campos = [ CampoFixo(1, 'REG', 'G110'), - Campo(2, 'DT_INI'), - Campo(3, 'DT_FIN'), + CampoData(2, 'DT_INI'), + CampoData(3, 'DT_FIN'), Campo(4, 'SALDO_IN_ICMS'), Campo(5, 'SOM_PARC'), Campo(6, 'VL_TRIB_EXP'), @@ -2428,8 +2450,8 @@ class RegistroG126(Registro): """ campos = [ CampoFixo(1, 'REG', 'G126'), - Campo(2, 'DT_INI'), - Campo(3, 'DT_FIM'), + CampoData(2, 'DT_INI'), + CampoData(3, 'DT_FIN'), Campo(4, 'NUM_PARC'), Campo(5, 'VL_PARC_PASS'), Campo(6, 'VL_TRIB_OC'), @@ -2513,6 +2535,7 @@ class RegistroH010(Registro): Campo(8, 'COD_PART'), Campo(9, 'TXT_COMPL'), Campo(10, 'COD_CTA'), + CampoNumerico(11, 'VL_ITEM_IR'), ] @@ -2673,6 +2696,9 @@ class Registro1010(Registro): Campo(8, 'IND_CART'), Campo(9, 'IND_FORM'), Campo(10, 'IND_AER'), + Campo(11, 'IND_GIAF1'), + Campo(12, 'IND_GIAF3'), + Campo(13, 'IND_GIAF4'), ] @@ -3032,8 +3058,8 @@ class Registro1910(Registro): """ campos = [ CampoFixo(1, 'REG', '1910'), - Campo(2, 'DT_INI'), - Campo(3, 'DT_FIN'), + CampoData(2, 'DT_INI'), + CampoData(3, 'DT_FIN'), ] From 58ace07571a5fd175a5e467a1130685ab6bd1745 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Tue, 30 Apr 2019 17:33:28 -0300 Subject: [PATCH 12/17] [VER] New version --- sped/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sped/__init__.py b/sped/__init__.py index 884c667..a2c6035 100644 --- a/sped/__init__.py +++ b/sped/__init__.py @@ -7,4 +7,4 @@ from .escrituracao import Escrituracao -__version__ = '1.0.0' +__version__ = '1.0.1' From 0770c5c5e054068bd6e2f33eb1e2b7fdbdfd1698 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Mon, 24 Jun 2019 17:09:54 -0300 Subject: [PATCH 13/17] [FIX] Fix for python 3.5 --- .travis.yml | 1 + sped/blocos.py | 3 ++- sped/campos.py | 8 +++++--- sped/escrituracao.py | 15 ++++++++++----- sped/leiaute.py | 10 +++++----- sped/registros.py | 2 +- 6 files changed, 24 insertions(+), 15 deletions(-) diff --git a/.travis.yml b/.travis.yml index 53a33ee..8544798 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,6 @@ language: python python: +- '3.5' - '3.6' install: - pip install six diff --git a/sped/blocos.py b/sped/blocos.py index 138c439..8f2d497 100644 --- a/sped/blocos.py +++ b/sped/blocos.py @@ -9,7 +9,8 @@ def __init__(self, nome=''): self._registros = [] def __repr__(self): - return f'<{self.__class__.__module__}.{self.__class__.__name__}({self._nome})>' + return '<%s.%s(%s)>' % (self.__class__.__module__, + self.__class__.__name__, self._nome) @property def abertura(self): diff --git a/sped/campos.py b/sped/campos.py index 1c0b7a3..9c9f575 100644 --- a/sped/campos.py +++ b/sped/campos.py @@ -32,7 +32,9 @@ def __init__(self, indice, nome, obrigatorio=False): self._obrigatorio = obrigatorio def __repr__(self): - return f'<{self.__class__.__module__}.{self.__class__.__name__}({self._indice}, {self._nome})>' + return '<%s.%s(%s, %s)>' % (self.__class__.__module__, + self.__class__.__name__, + self._indice, self._nome) @property def indice(self): @@ -207,8 +209,8 @@ def set(self, registro, valor): else: raise FormatoInvalidoError(registro, str(self)) - def __repr__(self): - return f'{self.__class__.__name__}({self.indice}, {self.nome}, {self._obrigatorio}, {self._regex})' + # def __repr__(self): + # return '' f'{self.__class__.__name__}({self.indice}, {self.nome}, {self._obrigatorio}, {self._regex})' class CampoCNPJ(Campo): diff --git a/sped/escrituracao.py b/sped/escrituracao.py index 634651e..6aa2e8c 100644 --- a/sped/escrituracao.py +++ b/sped/escrituracao.py @@ -84,7 +84,10 @@ def __init__(self, tipo: str, ano_calendario: int): self._add_registro(self._registro_escrituracao) sped_path = Path(__file__).parent - leiaute_ecd = Path(sped_path / 'leiautes' / f'{self._tipo}_{self._ano_calendario}.json') + + leiaute_path = '%s/leiautes/%s_%s.json' % (sped_path, self._tipo, + self._ano_calendario) + leiaute_ecd = Path(leiaute_path) with leiaute_ecd.open(encoding='utf-8', newline='\n') as f: p = json.load(f) @@ -226,19 +229,21 @@ def prepare(self): self.registro_encerramento[2] = reg_count def write_to(self, buff): - buff.write(f'{self.registro_abertura}\r\n') + buff.write('%s\r\n' % self.registro_abertura) reg_count = 2 for bloco in self._blocos.values(): reg_count += len(bloco.registros) for registro in bloco.registros: - buff.write(f'{registro}\r\n') + buff.write('%s\r\n' % registro) self.registro_encerramento[2] = reg_count - buff.write(f'{self.registro_encerramento}\r\n') + buff.write('%s\r\n' % self.registro_encerramento) def add(self, registro: Registro): pass def __repr__(self): - return f'<{self.__class__.__module__}.{self.__class__.__name__}({self._tipo}, {self._ano_calendario})>' + return '<%s.%s(%s, %s)>' % (self.__class__.__module__, + self.__class__.__name__, + self._tipo, self._ano_calendario) diff --git a/sped/leiaute.py b/sped/leiaute.py index d8a8711..e329ba4 100644 --- a/sped/leiaute.py +++ b/sped/leiaute.py @@ -44,7 +44,7 @@ def __init__(self, nome, descricao): self.descricao = descricao def __repr__(self): - return f'' + return '' % (self.nome, self.descricao) class Registro(object): @@ -58,7 +58,7 @@ def __init__(self, codigo, nome, regras, nivel, ocorrencia, campos_chave): self.campos = [] def __repr__(self): - return f'' + return '' % (self.codigo, self.nome) class Campo(object): @@ -70,12 +70,12 @@ def __init__(self, indice, nome, descricao, tipo, tamanho, decimal, valores, obr self.nome = nome self.descricao = descricao self.tipo = tipo - + try: self.tamanho = int(tamanho) except: self.tamanho = None - + try: self.decimal = int(decimal) except: @@ -86,4 +86,4 @@ def __init__(self, indice, nome, descricao, tipo, tamanho, decimal, valores, obr self.regras = regras def __repr__(self): - return f'' + return '' % (self.indice, self.nome) diff --git a/sped/registros.py b/sped/registros.py index 920b2a5..8a60e45 100644 --- a/sped/registros.py +++ b/sped/registros.py @@ -120,7 +120,7 @@ def __str__(self): return '|'.join(self._valores) def __repr__(self): - return f'<{self.__class__.__module__}.{self.__class__.__name__}>' + return '<%s.%s>' % (self.__class__.__module__, self.__class__.__name__) class RegistroIndefinido(Registro): From db009db809e48be71efad9c19dae233ac261ea28 Mon Sep 17 00:00:00 2001 From: Danimar Ribeiro Date: Tue, 25 Jun 2019 09:38:25 -0300 Subject: [PATCH 14/17] [VER] New version released --- sped/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sped/__init__.py b/sped/__init__.py index a2c6035..73aff5c 100644 --- a/sped/__init__.py +++ b/sped/__init__.py @@ -7,4 +7,4 @@ from .escrituracao import Escrituracao -__version__ = '1.0.1' +__version__ = '1.0.2' From 36810f1afdc828c280dfc2ab824c93ff1902891b Mon Sep 17 00:00:00 2001 From: marcelsavegnago Date: Sun, 6 Oct 2019 18:10:20 -0300 Subject: [PATCH 15/17] [ADD] Adicionado registro 0210 --- sped/efd/icms_ipi/registros.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/sped/efd/icms_ipi/registros.py b/sped/efd/icms_ipi/registros.py index b89ccd4..78d3032 100644 --- a/sped/efd/icms_ipi/registros.py +++ b/sped/efd/icms_ipi/registros.py @@ -177,6 +177,18 @@ class Registro0206(Registro): CampoFixo(1, 'REG', '0206'), Campo(2, 'COD_COMB'), ] + + +class Registro0210(Registro): + """ + CONSUMO ESPECÍFICO PADRONIZADO + """ + campos = [ + CampoFixo(1, 'REG', '0210'), + Campo(2, 'COD_ITEM_COMP'), + CampoNumerico(3, 'QTD_COMP'), + CampoNumerico(4, 'PERDA'), + ] class Registro0220(Registro): From db2bbbbb8c24edf7cbc6f54db9fdca3eabe74e29 Mon Sep 17 00:00:00 2001 From: Sergio Garcia Date: Wed, 19 Aug 2020 23:28:35 -0300 Subject: [PATCH 16/17] That's All Folks! --- README.md | 46 ++++++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index ec7dc2f..a96b584 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,29 @@ # SPED para python -[![Build Status](https://travis-ci.org/Trust-Code/python-sped.svg?branch=11.0)](https://travis-ci.org/Trust-Code/python-sped) -[![Coverage Status](https://coveralls.io/repos/github/Trust-Code/python-sped/badge.svg?branch=11.0)](https://coveralls.io/github/Trust-Code/python-sped?branch=11.0) - Biblioteca para geração dos arquivos do Sistema Público de Escrituração Digital (SPED) para Python. > This software is coded and documented in portuguese only as it is intended to be used to generate the necessary files for the brazilian government regarding to digital bookkeeping. +``` +!!! Aviso importante !!! + +O SPED necessita de atualizações constantes para continuar se adequando a legislação vigente e eu como desenvolvedor inicial desta biblioteca não consigo mais mante-la e portanto estou arquivando este repositório. + +Nos anos que mantive este projeto público, o uso foi mínimo ou inexistente. + +Comumente recebo emails, por ser o mantenedor dela, sempre de alguém procurando uma solução simples e barata para a geração dos arquivos do SPED, porém estes são muito mais complexos que os necessários a NF-e, a título de comparação. + +Caso você possua recursos e disponibilidade para manter este projeto ou você faça uso dele e deseja assumir a administração da organização no GitHub e PyPI, você é bem vindo para tal desde que demostre real interesse nisso com contribuições (Pull Requests) a este repositório. + +Ao termino de 1 ano deste comunicado, este repositório e os pacotes PyPI serão removidos de forma definitiva. + +A licença de uso (MIT) permite que qualquer um use o código fonte aqui disponibilizado como bem queira, sem a necessidade de minha autorização para tal. +``` + ## Requisitos - * python - * six +- python +- six ## Como instalar @@ -31,22 +44,23 @@ Outras linguagens de programação poderão ter versões especificas conforme mi ## Contribuições para o Projeto Contribuições são bem vindas ao projeto, exemplos de como você pode contribuir: - * usando o projeto e [apontando bugs](https://github.com/sped-br/python-sped/issues) - * [sugestões de melhoria](https://github.com/sped-br/python-sped/issues) - * enviando [pull requests](https://github.com/sped-br/python-sped/pulls) - * auxiliando na [documentação](https://github.com/sped-br/python-sped/wiki) + +- usando o projeto e [apontando bugs](https://github.com/sped-br/python-sped/issues) +- [sugestões de melhoria](https://github.com/sped-br/python-sped/issues) +- enviando [pull requests](https://github.com/sped-br/python-sped/pulls) +- auxiliando na [documentação](https://github.com/sped-br/python-sped/wiki) ## Status do Projeto O projeto está em fase inicial de desenvolvimento e **não deve** ser usado em produção. -| Módulo | Status | -|----------------|:-------------:| -| ECD | Funcional | -| ECF | Funcional | -| EFD-PIS/COFINS | Funcional | -| EFD-ICMS/IPI | Funcional | -| FCI | Funcional | +| Módulo | Status | +| -------------- | :-------: | +| ECD | Funcional | +| ECF | Funcional | +| EFD-PIS/COFINS | Funcional | +| EFD-ICMS/IPI | Funcional | +| FCI | Funcional | ### ECD From 665db2176a561b882e8d64a7972db3fdb826be7f Mon Sep 17 00:00:00 2001 From: Sergio Garcia Date: Tue, 15 Aug 2023 03:06:56 -0300 Subject: [PATCH 17/17] Added files for LCDPR --- sped/lcdpr/__init__.py | 1 + sped/lcdpr/arquivos.py | 35 +++++++++ sped/lcdpr/blocos.py | 44 ++++++++++++ sped/lcdpr/registros.py | 155 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 235 insertions(+) create mode 100755 sped/lcdpr/__init__.py create mode 100755 sped/lcdpr/arquivos.py create mode 100755 sped/lcdpr/blocos.py create mode 100755 sped/lcdpr/registros.py diff --git a/sped/lcdpr/__init__.py b/sped/lcdpr/__init__.py new file mode 100755 index 0000000..40a96af --- /dev/null +++ b/sped/lcdpr/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/sped/lcdpr/arquivos.py b/sped/lcdpr/arquivos.py new file mode 100755 index 0000000..2ba1304 --- /dev/null +++ b/sped/lcdpr/arquivos.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- + +from sped import arquivos +from sped.lcdpr import blocos +from sped.lcdpr import registros +from sped.lcdpr.blocos import Bloco0 +from sped.lcdpr.blocos import BlocoQ +from sped.lcdpr.blocos import Bloco9 +from sped.lcdpr.registros import Registro0000 +from sped.lcdpr.registros import Registro9999 + + +class ArquivoDigital(arquivos.ArquivoDigital): + registro_abertura = Registro0000 + registro_encerramento = Registro9999 + registros = registros + blocos = blocos + + def __init__(self): + super(ArquivoDigital, self).__init__() + self._blocos['0'] = Bloco0() + self._blocos['Q'] = BlocoQ() + self._blocos['9'] = Bloco9() + + def prepare(self): + reg_count = 0 + + for bloco in self._blocos.values(): + reg_count += len(bloco.registros) + + self.registro_encerramento._numero_linhas = reg_count + +if __name__ == "__main__": + import doctest + doctest.testmod() diff --git a/sped/lcdpr/blocos.py b/sped/lcdpr/blocos.py new file mode 100755 index 0000000..67bb170 --- /dev/null +++ b/sped/lcdpr/blocos.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +from ..blocos import Bloco +from .registros import RegistroQ100 +from .registros import RegistroQ200 + +class Bloco0(Bloco): + """ + Abertura e Identificação + """ + registro_abertura = None + registro_encerramento = None + + +class BlocoQ(Bloco): + """ + Demonstrativo do Resultado da Atividade Rural + """ + registro_abertura = None + registro_encerramento = None + + @property + def registros(self): + regs = [] + + if self.abertura is not None: + regs.append(self.abertura) + + regs = regs + [r for r in self._registros if isinstance(r, RegistroQ100)] + regs = regs + [r for r in self._registros if isinstance(r, RegistroQ200)] + + if self.encerramento is not None: + regs.append(self.encerramento) + + return regs + + +class Bloco9(Bloco): + """ + Identificação do Contador e Encerramento do Arquivo Digital + """ + registro_abertura = None + registro_encerramento = None + diff --git a/sped/lcdpr/registros.py b/sped/lcdpr/registros.py new file mode 100755 index 0000000..abe84ad --- /dev/null +++ b/sped/lcdpr/registros.py @@ -0,0 +1,155 @@ +# -*- coding: utf-8 -*- + +from ..campos import * +from ..registros import Registro +from ..registros import RegistroAbertura +from ..registros import RegistroEncerramento + + +class Registro0000(RegistroAbertura): + """ + ABERTURA DO ARQUIVO DIGITAL E IDENTIFICAÇÃO DA PESSOA FÍSICA + """ + campos = [ + CampoFixo(1, 'REG', '0000'), + CampoFixo(2, 'NOME_ESC', 'LCDPR'), + CampoAlfanumerico(3, 'COD_VER', obrigatorio=True, tamanho=4), + CampoCPF(4, 'CPF', obrigatorio=True), + CampoAlfanumerico(5, 'NOME', obrigatorio=True), + CampoRegex(6, 'IND_SIT_INI_PER', obrigatorio=True, regex='[0-2]'), + CampoRegex(7, 'SIT_ESPECIAL', obrigatorio=True, regex='[0-3]'), + CampoData(8, 'DT_SIT_ESP'), + CampoData(9, 'DT_INI', obrigatorio=True), + CampoData(10, 'DT_FIN', obrigatorio=True), + ] + + +class Registro0010(Registro): + """ + PARÂMETROS DE TRIBUTAÇÃO + """ + campos = [ + CampoFixo(1, 'REG', '0010'), + CampoRegex(2, 'FORMA_APUR', obrigatorio=True, regex='[1-2]'), + ] + +class Registro0030(Registro): + """ + DADOS CADASTRAIS DO CONTRIBUINTE + """ + campos = [ + CampoFixo(1, 'REG', '0030'), + Campo(2, 'ENDERECO'), + Campo(3, 'NUM'), + Campo(4, 'COMPL'), + Campo(5, 'BAIRRO'), + Campo(6, 'UF'), + Campo(7, 'COD_MUN'), + Campo(8, 'CEP'), + Campo(9, 'NUM_TEL'), + Campo(10, 'EMAIL'), + ] + + +class Registro0040(Registro): + """ + CADASTRO DOS IMÓVEIS RURAIS + """ + campos = [ + CampoFixo(1, 'REG', '0040'), + Campo(2, 'COD_IMÓVEL'), + Campo(3, 'PAIS'), + Campo(4, 'MOEDA'), + Campo(5, 'CAD_ITR'), + Campo(6, 'CAEPF'), + Campo(7, 'INSCR_ESTADUAL'), + Campo(8, 'NOME_IMÓVEL'), + Campo(9, 'ENDERECO'), + Campo(10, 'NUM'), + Campo(11, 'COMPL'), + Campo(12, 'BAIRRO'), + Campo(13, 'UF'), + Campo(14, 'COD_MUN'), + Campo(15, 'CEP'), + Campo(16, 'TIPO_EXPLORAÇÃO'), + Campo(17, 'PARTICIPAÇÃO'), + ] + + +class Registro0045(Registro): + """ + CADASTRO DE TERCEIROS + """ + campos = [ + CampoFixo(1, 'REG', '0045'), + Campo(2, 'COD_IMÓVEL'), + Campo(3, 'TIPO_CONTRAPARTE'), + Campo(4, 'ID_CONTRAPARTE'), + Campo(5, 'NOME_CONTRAPARTE'), + Campo(6, 'PERC_CONTRAPARTE'), + ] + + +class Registro0050(Registro): + """ + CADASTRO DAS CONTAS BANCÁRIAS DO PRODUTOR RURAL + """ + campos = [ + CampoFixo(1, 'REG', '0050'), + Campo(2, 'COD_CONTA'), + Campo(3, 'PAIS_CTA'), + Campo(4, 'BANCO'), + Campo(5, 'NOME_BANCO'), + Campo(6, 'AGENCIA'), + Campo(7, 'NUM_CONTA'), + ] + + +class RegistroQ100(Registro): + """ + DEMONSTRATIVO DO RESULTADO DA ATIVIDADE RURAL + """ + campos = [ + CampoFixo(1, 'REG', 'Q100'), + CampoData(2, 'DATA'), + Campo(3, 'COD_IMÓVEL'), + Campo(4, 'COD_CONTA'), + Campo(5, 'NUM_DOC'), + Campo(6, 'TIPO_DOC'), + Campo(7, 'HIST'), + Campo(8, 'ID_PARTIC'), + Campo(9, 'TIPO_LANC'), + CampoNumerico2(10, 'VL_ENTRADA', precisao=19), + CampoNumerico2(11, 'VL_SAIDA', precisao=19), + CampoNumerico2(12, 'SLD_FIN', precisao=19), + Campo(13, 'NAT_SLD_FIN'), + ] + + +class RegistroQ200(Registro): + """ + RESUMO MENSAL DO DEMONSTRATIVO DO RESULTADO DA ATIVIDADE RURAL + """ + campos = [ + CampoFixo(1, 'REG', 'Q200'), + Campo(2, 'MÊS'), + CampoNumerico2(3, 'VL_ENTRADA'), + CampoNumerico2(4, 'VL_SAIDA'), + CampoNumerico2(5, 'SLD_FIN'), + Campo(6, 'NAT_SLD_FIN'), + ] + + +class Registro9999(RegistroEncerramento): + """ + Encerramento do Arquivo Digital + """ + campos = [ + CampoFixo(1, 'REG', '9999'), + Campo(2, 'IDENT_NOM'), + Campo(3, 'IDENT_CPF_CNPJ'), + Campo(4, 'IND_CRC'), + Campo(5, 'EMAIL'), + Campo(6, 'FONE'), + CampoNumerico(7, 'QTD_LIN'), + ]