Bloco C — Documentos Fiscais (NF-e / NFC-e / Energia)
Finalidade
Escriturar entradas e saídas de documentos fiscais modelos 01, 1B, 04, 55 (NF-e), 06 (Energia), 66 (Gás), incluindo itens, impostos consolidados, informações complementares e ajustes de ICMS.
Registro C100 — Nota Fiscal (Modelos 01/1B/04/55)
Filtro de Documentos
move_ids = search([
company_id,
l10n_br_numero_nota_fiscal > 0,
date >= date_ini, date <= date_fim,
move_type in ['out_invoice','in_refund','out_refund','in_invoice'],
l10n_br_tipo_documento in ['01','1B','04','55'],
state != 'draft'
])
Validações Pré-Geração
| Validação |
Condição |
Erro |
| Chave de acesso |
NF não cancelada sem chave ou chave ≠ 44 dígitos |
RedirectWarning: "Notas Fiscais sem Chave de Acesso" |
| Data |
Fatura sem invoice_date ou date |
RedirectWarning: "Notas Fiscais sem Data" |
Campos do C100
| Campo SPED |
Origem no Odoo |
Regra |
IND_OPER |
📄 TIPO_NF[move.move_type] |
0=entrada, 1=saída |
IND_EMIT |
📄 Se CNPJ da empresa está na chave → '0', senão → '1' |
🧮 |
COD_SIT |
📄 Determinado por l10n_br_cstat_nf + state — ver tabela abaixo |
🧮 |
COD_MOD |
📄 move.l10n_br_tipo_documento |
✅ Fatura → Tipo de Documento |
CHV_NFE |
📄 move.l10n_br_chave_nf |
✅ Fatura → Chave NF |
SER |
📄 move.l10n_br_serie_nf |
✅ Fatura → Série |
NUM_DOC |
📄 move.l10n_br_numero_nota_fiscal |
✅ Fatura → Número |
COD_PART |
👤 partner.id |
🔒 ID do parceiro |
DT_DOC |
📄 move.invoice_date |
✅ Fatura → Data |
DT_E_S |
📄 max(move.date, move.invoice_date) |
🧮 |
VL_DOC |
📄 move.l10n_br_total_nfe |
💰 Total NF-e |
IND_PGTO |
📄 payment_term.l10n_br_indicador ou '1' |
✅ Cond. Pagamento → Indicador |
VL_DESC |
📄 move.l10n_br_desc_valor |
💰 |
VL_MERC |
📄 move.l10n_br_prod_valor |
💰 |
IND_FRT |
📄 incoterm.l10n_br_modalidade_frete ou '9' |
✅ Fatura → Frete |
VL_FRT |
📄 move.l10n_br_frete |
💰 |
VL_SEG |
📄 move.l10n_br_seguro |
💰 |
VL_OUT_DA |
📄 move.l10n_br_despesas_acessorias |
💰 |
VL_BC_ICMS |
📄 move.l10n_br_icms_base |
💰 |
VL_ICMS |
📄 move.l10n_br_icms_valor |
💰 |
VL_BC_ICMS_ST |
📄 move.l10n_br_icmsst_base |
💰 |
VL_ICMS_ST |
📄 icmsst + substituto + retido + fcp_st |
💰 Composição |
VL_IPI |
📄 move.l10n_br_ipi_valor |
💰 |
VL_PIS |
📄 move.l10n_br_pis_valor |
💰 |
VL_COFINS |
📄 move.l10n_br_cofins_valor |
💰 |
VL_PIS_ST |
📄 move.l10n_br_pis_ret_valor |
💰 |
VL_COFINS_ST |
📄 move.l10n_br_cofins_ret_valor |
💰 |
Tabela de COD_SIT
| Condição |
COD_SIT |
Significado |
cstat_nf in [301,302,303] + emissão própria |
04 |
Denegada |
cstat_nf in [135,101] + cancel |
02 |
Cancelada |
cstat_nf in [100,135,690,501] + posted + finalidade 2 |
06 |
NF-e complementar |
cstat_nf in [100,135,690,501] + posted |
00 |
Regular |
| Emissão terceiros + CNPJ chave ≠ parceiro |
08 |
Emissão terceiros |
| Emissão terceiros |
00 |
Regular |
Registro C101 — DIFAL/FCP Destino
| Condição |
Gerado quando |
| Geração |
l10n_br_icms_dest_valor > 0 ou l10n_br_fcp_dest_valor > 0 |
| Campo |
Origem |
VL_FCP_UF_DEST |
📄 move.l10n_br_fcp_dest_valor |
VL_ICMS_UF_DEST |
📄 move.l10n_br_icms_dest_valor |
VL_ICMS_UF_REM |
🔒 0.00 |
| Campo |
Origem |
Regra |
COD_INF |
🧮 Índice sequencial (1, 2, ...) |
Automático |
TXT_COMPL |
📄 move.l10n_br_informacao_fiscal — quebrado em chunks de 200 chars |
✅ Fatura → Info Fiscal |
Alternativa: Se não tem l10n_br_informacao_fiscal mas tem referencia_ids, concatena as chaves das NF referenciadas.
Registro C113 — Documento Fiscal Referenciado
| Condição |
Para cada invoice_ref em move.referencia_ids |
|
|
| Campo |
Origem |
IND_OPER |
📄 TIPO_NF[move_ref.move_type] |
IND_EMIT |
🧮 CNPJ empresa na chave → 0, senão → 1 |
COD_PART |
👤 move_ref.partner.id |
COD_MOD |
📄 move_ref.l10n_br_tipo_documento |
SER / NUM_DOC / DT_DOC |
📄 Dados da NF referenciada |
CHV_DOCE |
📄 Chave da NF referenciada |
Registro C120 — Importação (DI)
| Condição |
move.l10n_br_tipo_pedido_entrada == 'importacao' |
|
|
| Campo |
Origem |
COD_DOC_IMP |
🔒 '0' |
NUM_DOC_IMP |
📄 di_id.name (número da DI) |
PIS_IMP |
📋 sum(pis_valor) agrupado por DI |
COFINS_IMP |
📋 sum(cofins_valor) agrupado por DI |
Registro C170 — Itens do Documento (Detalhamento)
| Condição |
Gerado somente quando IND_EMIT == '1' (emissão terceiros) |
|
|
| Campo SPED |
Origem no Odoo |
Regra |
NUM_ITEM |
📋 Sequência (1, 2, ...) |
🧮 |
COD_ITEM |
📦 product.default_code |
✅ Produto → Ref. Interna |
DESCR_COMPL |
📋 line.l10n_br_informacao_adicional |
✅ Linha → Info Adicional |
QTD |
📋 line.quantity |
✅ |
UNID |
📦 product.uom_id.l10n_br_codigo_sefaz |
✅ |
VL_ITEM |
📋 line.l10n_br_prod_valor |
💰 |
VL_DESC |
📋 line.l10n_br_desc_valor |
💰 |
IND_MOV |
⚙️ '0' se operação com estoque, '1' se sem |
✅ Operação → Movimento Estoque |
CST_ICMS |
📋 (origem ou '0') + icms_cst |
💰 |
CFOP |
📋 cfop.codigo_cfop |
✅ |
VL_BC_ICMS / ALIQ_ICMS / VL_ICMS |
📋 Campos ICMS da linha |
💰 |
VL_BC_ICMS_ST / ALIQ_ST / VL_ICMS_ST |
📋 ICMS-ST da linha (composição) |
💰 |
CST_IPI / VL_BC_IPI / ALIQ_IPI / VL_IPI |
📋 Campos IPI da linha |
💰 |
CST_PIS / VL_BC_PIS / ALIQ_PIS / VL_PIS |
📋 Campos PIS da linha |
💰 |
CST_COFINS / VL_BC_COFINS / ALIQ_COFINS / VL_COFINS |
📋 Campos COFINS da linha |
💰 |
COD_CTA |
🏦 line.account_id.code |
✅ Conta contábil |
Registro C190 — Consolidado por CST/CFOP/Alíquota
Agrupa as linhas por (origem, icms_cst, cfop, icms_aliquota).
| Campo |
Origem |
Regra |
CST_ICMS |
📋 (origem ou '0') + icms_cst |
💰 Agrupado |
CFOP |
📋 cfop.codigo_cfop |
✅ |
ALIQ_ICMS |
📋 l10n_br_icms_aliquota |
💰 |
VL_OPR |
📋 sum(l10n_br_total_nfe) |
🧮 |
VL_BC_ICMS |
📋 sum(icms_base) |
🧮 |
VL_ICMS |
📋 sum(icms_valor) |
🧮 |
VL_BC_ICMS_ST / VL_ICMS_ST / VL_IPI |
📋 Somas agrupadas |
🧮 |
VL_RED_BC |
📋 Cálculo reverso: base / (1 - redução/100) - base |
🧮 |
Efeito colateral: O C190 alimenta e110_vl_tot_debitos (saídas) e e110_vl_tot_creditos (entradas) para a apuração E110.
Efeito colateral ICMS-ST: Alimenta os models sped.fiscal.uf.icmsst (E210) por UF, classificando por CFOP:
- CFOPs 1410,1411,...,2662 → e210_vl_devol_st
- CFOPs 1603,2603 → e210_vl_ressarc_st
- Demais → e210_vl_out_cred_st (entrada) ou e210_vl_retencao_st (saída)
Registro C195 — Observações do Documento
| Fonte |
Condição |
| Mensagens fiscais |
move.invoice_line_ids.l10n_br_mensagem_fiscal_ids |
| Info fiscal |
move.l10n_br_informacao_fiscal (se sem mensagens) |
| Ajustes ICMS |
Se c197_gerar_apuracao_ajustes_icms ativo |
Registro C197 — Ajuste de Documento (Benefício / Ajuste ICMS)
Modo 1 — Código de Benefício
| Condição |
line.l10n_br_codigo_beneficio preenchido e UF ≠ SC |
|
|
| Campo |
Origem |
COD_AJ |
📋 line.l10n_br_codigo_beneficio |
COD_ITEM |
📦 product.default_code |
VL_BC_ICMS |
📋 line.l10n_br_icms_base ou icmsst_base |
ALIQ_ICMS |
📋 line.l10n_br_icms_aliquota |
VL_ICMS |
📋 line.l10n_br_icms_valor ou icmsst_valor |
VL_OUTROS |
📋 line.l10n_br_icms_valor_outros |
Modo 2 — Ajustes de Apuração ICMS
| Condição |
l10n_br_icms_ajuste_ids da linha preenchido |
|
|
| Campo |
Origem |
COD_AJ |
⚙️ icms_ajuste.l10n_br_codigo |
DESCR_COMPL_AJ |
⚙️ icms_ajuste.l10n_br_descricao |
Efeito: Se l10n_br_transf_credito → acumula em c197_vl_tot_transf_creditos + e110_vl_aj_debitos
Se l10n_br_transf_debito → acumula em c197_vl_tot_transf_debitos
Senão → e110_vl_aj_creditos
Registro C500 — Energia Elétrica / Gás (Modelos 06/66)
Estrutura similar ao C100, com campos adicionais:
| Campo Extra |
Origem |
COD_GRUPO_TENSAO |
📦 product.l10n_br_grupo_tensao |
COD_CONS |
📦 product.l10n_br_consumo_energia_gas |
TP_LIGACAO |
📦 product.l10n_br_tipo_ligacao |
IND_DEST |
👤 partner.l10n_br_indicador_ie |
COD_CTA |
🏦 journal.default_account_id.code |
VL_FORN |
📄 move.l10n_br_total_nfe |
COD_MUN_DEST |
📄 move.l10n_br_municipio_fim_id.codigo_ibge |
Registro C140/C141 — Fatura / Parcelas
| Campo |
Origem |
IND_TIT |
📄 Mapeado via payment_provider.l10n_br_meio (14→00, 02→01, 16→02, 17→03) |
NUM_TIT |
📄 payment_line.l10n_br_cobranca_nossonumero concatenados |
QTD_PARC |
📄 len(payment_line_ids) |
VL_TIT |
📄 sum(parcela.balance) |
C141 — Parcelas
| Campo |
Origem |
NUM_PARC |
📄 parcela.l10n_br_cobranca_parcela |
DT_VCTO |
📄 parcela.date_maturity |
VL_PARC |
📄 parcela.balance |
Referências