Pular para conteúdo

Visão Geral — Arquitetura SPED

Mecanismo Central de Geração

Todas as obrigações SPED seguem o mesmo padrão arquitetural:

def gerar_sped(self):
    _arq = ArquivoDigital()          # 1. Cria arquivo digital
    self.enviar_registro_XXXX(_arq)  # 2. Gera registros
    _arq.getstring()                 # 3. Serializa como TXT
    base64.b64encode(...)            # 4. Salva como campo Binary

ArquivoDigital

Obrigação Import Módulo
EFD ICMS/IPI sped.efd.icms_ipi.arquivos ArquivoDigital
EFD Contribuições sped.efd.pis_cofins.arquivos ArquivoDigital
ECD sped.ecd.arquivos ArquivoDigital
ECF sped.ecf.arquivos ArquivoDigital
DCTF sped.dctf.arquivos ArquivoDigital
DIME/SC Arquivo texto plano (sem lib) Geração direta

Controle de Registros: _registro_em_uso()

Todo registro verificável segue este padrão:

def enviar_registro_XXXX(self, _arq):
    if not self._registro_em_uso('XXXX'):
        return  # registro não habilitado → não gera
    # ... lógica de geração
Obrigação Campo de configuração Tabela
EFD ICMS/IPI company.l10n_br_sped_fiscal_registros l10n_br_ciel_it_account.sped.registro
EFD Contribuições company.l10n_br_sped_contribuicao_registros l10n_br_ciel_it_account.sped.registro

📍 Onde configurar: Definições → Empresa → aba Localização BR → seção "Registros SPED Fiscal" ou "Registros SPED Contribuições"


Ordem de Geração (EFD ICMS/IPI)

A ordem de geração NÃO é numérica. Blocos de dados (B/C/D) são gerados primeiro para acumular listas de participantes, produtos e CFOPs usados depois no Bloco 0:

flowchart LR
    B["B001/B990"] --> C["C001/C100-C500/C990"]
    C --> D["D001/D100-D500/D990"]
    D --> E["E001/E100-E520/E990"]
    E --> G["G001/G990"]
    G --> H["H001/H005/H990"]
    H --> K["K001-K230/K990"]
    K --> B1["1001-1900/1990"]
    B1 --> B0["0000-0600/0990"]
    B0 --> B9["9001/9900/9990"]

    C -.->|"acumula partner_ids"| B0
    C -.->|"acumula product_ids"| B0
    C -.->|"acumula cfop_ids"| B0
    C -.->|"acumula e110_debitos/creditos"| E

Variáveis Globais Acumuladas

Variável Populada em Usada em
partner_ids_list C100, C140, C500, D100, D500 0150 (Participantes)
product_ids_list C100, C500, D500 0190, 0200, H005, K200/K230
cfop_ids_list C100, C500, D100, D500 0400 (CFOP)
qtd_cod_inf C100 (informações adicionais) 0450
e110_vl_tot_debitos C190, C590, D190, D590 E110
e110_vl_tot_creditos C190, C590, D190, D590 E110

Models Auxiliares

SPED Fiscal — AccountSpedFiscal

Fields de Apuração E110 (ICMS):

Campo Tipo Descrição Preenchido por
e110_vl_tot_debitos Float Soma débitos ICMS C190/C590/D190/D590 (auto)
e110_vl_aj_debitos Float Ajustes débito por documento C197 (auto)
e110_vl_tot_aj_debitos Float Ajustes débito apuração E111 (manual)
e110_vl_estornos_cred Float Estornos de créditos Manual
e110_vl_tot_creditos Float Soma créditos ICMS C190/C590/D190/D590 (auto)
e110_vl_aj_creditos Float Ajustes crédito por documento C197 (auto)
e110_vl_tot_aj_creditos Float Ajustes crédito apuração E111 (manual)
e110_vl_estornos_deb Float Estornos de débitos Manual
e110_vl_sld_credor_ant Float Saldo credor anterior 🧮 computed → busca mês anterior
e110_vl_sld_apurado Float Saldo devedor 🧮 computed
e110_vl_tot_ded Float Deduções Manual
e110_vl_icms_recolher Float ICMS a recolher 🧮 computed
e110_vl_sld_credor_transportar Float Saldo credor a transportar 🧮 computed
e110_deb_esp Float Valores extra-apuração Manual

Fórmulas E110:

Débitos = vl_tot_debitos + vl_aj_debitos + vl_tot_aj_debitos + vl_estornos_cred
Créditos = vl_tot_creditos + vl_aj_creditos + vl_tot_aj_creditos + vl_estornos_deb + vl_sld_credor_ant

Se Débitos > Créditos:
    vl_sld_apurado = Débitos - Créditos
    vl_icms_recolher = max(vl_sld_apurado - vl_tot_ded, 0)
    vl_sld_credor_transportar = 0
Senão:
    vl_sld_apurado = 0
    vl_icms_recolher = 0
    vl_sld_credor_transportar = abs(Débitos - Créditos)

Fields de Apuração E520 (IPI):

Campo Tipo Descrição Preenchido por
e520_vl_sd_ant_ipi Float Saldo credor IPI anterior 🧮 computed → mês anterior
e520_vl_deb_ipi Float Débitos IPI C190 (auto)
e520_vl_cred_ipi Float Créditos IPI C190 (auto)
e520_vl_od_ipi Float Outros débitos Manual
e520_vl_oc_ipi Float Outros créditos Manual
e520_vl_sc_ipi Float Saldo credor 🧮 computed
e520_vl_sd_ipi Float Saldo devedor 🧮 computed

Fórmulas E520:

Resultado = (vl_deb_ipi + vl_od_ipi) - (vl_sd_ant_ipi + vl_cred_ipi + vl_oc_ipi)
Se Resultado > 0 → vl_sd_ipi = Resultado, vl_sc_ipi = 0
Se Resultado < 0 → vl_sc_ipi = abs(Resultado), vl_sd_ipi = 0

ICMS-ST por UF — AccountSpedFiscalUfICMSST

Model l10n_br_ciel_it_account.sped.fiscal.uf.icmsst — Uma linha por UF com débitos/créditos de ICMS-ST:

Campo Tipo Preenchimento
e210_vl_sld_cred_ant_st Float 🧮 Busca mês anterior, mesma UF
e210_vl_retencao_st Float Acumulado por C190 (auto)
e210_vl_devol_st / e210_vl_ressarc_st Float Manual
e210_vl_out_cred_st / e210_vl_aj_creditos_st Float Manual
e210_vl_out_deb_st / e210_vl_aj_debitos_st Float Manual
e210_vl_sld_dev_ant_st Float 🧮 Computed
e210_vl_deducoes_st Float Manual
e210_vl_icms_recol_st Float 🧮 max(sld_dev - deducoes, 0)
e210_vl_sld_cred_st_transportar Float 🧮 abs(saldo) se negativo
e210_deb_esp_st Float Manual

DIFAL/FCP por UF — AccountSpedFiscalUfDIFALFCP

Model l10n_br_ciel_it_account.sped.fiscal.uf.difal.fcp — Duas apurações por UF (DIFAL + FCP), cada uma com:

Campos DIFAL Campos FCP
e310_vl_sld_cred_ant_difal e310_vl_sld_cred_ant_fcp
e310_vl_tot_debitos_difal e310_vl_tot_deb_fcp
e310_vl_out_deb_difal e310_vl_out_deb_fcp
e310_vl_tot_creditos_difal e310_vl_tot_cred_fcp
e310_vl_out_cred_difal e310_vl_out_cred_fcp
e310_vl_sld_dev_ant_difal (🧮) e310_vl_sld_dev_ant_fcp (🧮)
e310_vl_deducoes_difal e310_vl_deducoes_fcp
e310_vl_recol_difal (🧮) e310_vl_recol_fcp (🧮)
e310_vl_sld_cred_transportar_difal (🧮) e310_vl_sld_cred_transportar_fcp (🧮)
e310_deb_esp_difal e310_deb_esp_fcp

Ajustes de Apuração — AccountSpedFiscalE111

Campo Tipo
cod_aj_apur Char — Código do ajuste
descr_compl_aj Char — Descrição
vl_aj_apur Float — Valor

Ajustes 1921 — AccountSpedFiscal1921

Mesma estrutura do E111, para ajustes da outra apuração (Bloco 1):

Campo Tipo
cod_aj_apur Char
descr_compl_aj Char
vl_aj_apur Float

Campos C197 (Ajustes ICMS por Documento)

Campo Tipo Descrição
c197_gerar_apuracao_ajustes_icms Boolean Ativar geração de ajustes
c197_vl_tot_transf_creditos Float Total transferências de créditos
c197_vl_tot_transf_debitos Float Total transferências de débitos
c197_move_ids Many2many → account.move Faturas com ajustes C197
x1900_indicador_apuracao Selection Tipo da outra apuração (3-8)
x1900_vl_sld_credor_transp Float Saldo credor da outra apuração
x1900_vl_sld_credor_ant Float 🧮 Saldo credor anterior (mês-1)

Pré-requisitos Comuns

Pré-requisito Obrigação Validação
CNPJ da empresa Todas
UF / Município / IE Todas
Contador (l10n_br_contador_partner_id) Todas exceto DIME RedirectWarning
Registros habilitados EFD / Contribuições _registro_em_uso()
Faturas postadas no período Todas Filtro de busca
Chave NF-e com 44 dígitos EFD / Contribuições RedirectWarning
Lançamentos contábeis ECD account.move postados
SPED Fiscal do período DIME/SC UserError

Fluxo de Dados entre Obrigações

flowchart TD
    INV["Faturas (account.move)"]
    OP["Operação Fiscal"]
    MF["Motor Fiscal"]
    SPED_F["EFD ICMS/IPI"]
    SPED_C["EFD Contribuições"]
    ECD["ECD"]
    DCTF["DCTF"]
    DIME["DIME/SC"]
    ECF["ECF"]

    OP -->|"CST, CFOP, alíquotas"| MF
    MF -->|"Cálculo automático"| INV
    INV -->|"ICMS, IPI"| SPED_F
    INV -->|"PIS, COFINS"| SPED_C
    INV -->|"IRPJ, PIS, COFINS, IPI"| DCTF
    INV -->|"Lançamentos contábeis"| ECD
    SPED_F -->|"c197_move_ids, ajustes, saldos"| DIME
    ECD -->|"Saldos contábeis"| ECF

SQL Constraints

Obrigação Constraint Erro
EFD ICMS/IPI UNIQUE(company_id, date_ini, date_fim) "O período já foi processado!"
EFD Contribuições UNIQUE(company_id, date_ini, date_fim) "O período já foi processado!"

GRUPO_DE_CONTA (Referência Contábil)

Usado no registro 0500 (Plano de Contas):

account.account_type Código
asset 01
expense 02
liability 02
equity 03
income 04
off_balance 09

Referências