Pular para conteúdo

Exemplos

Receitas curtas e autocontidas para tarefas comuns. Cada uma se sustenta sozinha — copie e ajuste.

Veja também: Uso para o básico · Referência da API para cada símbolo público.


Receita: gerar o arquivo XML mínimo do Perfil Mensal

O menor documento válido: um cabeçalho e uma linha com apenas os campos obrigatórios.

from filings_cvm.submission import (
    ClientCount,
    DocumentHeader,
    PerfilMensal,
    PerfilMensalDocument,
    PerfilMensalRow,
)

clientes = ClientCount(
    nr_pf_priv_bank=0, nr_pf_varj=0,
    nr_pj_n_financ_priv_bank=0, nr_pj_n_financ_varj=0,
    nr_bnc_comerc=0, nr_pj_corr_dist=0, nr_pj_outr_financ=0,
    nr_inv_n_res=0, nr_ent_ab_prev_compl=0, nr_ent_fc_prev_compl=0,
    nr_reg_prev_serv_pub=0, nr_soc_seg_reseg=0,
    nr_soc_captlz_arrendm_merc=0, nr_fdos_club_inv=0,
    nr_cotst_distr_fdo=0, nr_outros_n_relac=0,
)

doc = PerfilMensalDocument(
    header=DocumentHeader(dt_compt="01/2025", dt_gerac_arq="15/01/2025"),
    rows=[
        PerfilMensalRow(
            cnpj_fdo="11222333000181",
            nr_client=clientes,
            total_recurs_exter="0",
            total_recurs_br="0",
            tot_ativos_p_relac="0",
            tot_ativos_cred_priv="0",
        )
    ],
)

xml = PerfilMensal().to_xml(doc)
print(xml)

Receita: escrever direto em disco (codificação da CVM)

Quando output_path é informado, o arquivo é gravado em windows-1252 — a codificação que a CVM espera — e o método retorna None.

# doc: PerfilMensalDocument já montado (veja a receita anterior)
PerfilMensal().to_xml(doc, output_path="perfil_202501.xml")
# o arquivo perfil_202501.xml está pronto para envio à CVM

Receita: truncamento de casas decimais (nunca arredonda para cima)

Valores com precisão excedente são cortados em direção a zero (ROUND_DOWN), garantindo que um valor reportado nunca ultrapasse o que o padrão permite. TOTAL_RECURS_BR usa duas casas:

# ... total_recurs_br="10.999" na linha ...
xml = PerfilMensal().to_xml(doc)
assert "<TOTAL_RECURS_BR>10,99</TOTAL_RECURS_BR>" in xml   # 10,99 — não 11,00

Repare também no separador decimal por vírgula (10,99), exigido pelo padrão CVM.


Receita: várias classes de fundo em um só documento

rows aceita uma lista — cada item vira um bloco <ROW_PERFIL>.

doc = PerfilMensalDocument(
    header=DocumentHeader(dt_compt="01/2025", dt_gerac_arq="15/01/2025"),
    rows=[
        PerfilMensalRow(cnpj_fdo="11222333000181", nr_client=clientes,
                        total_recurs_exter="0", total_recurs_br="0",
                        tot_ativos_p_relac="0", tot_ativos_cred_priv="0"),
        PerfilMensalRow(cnpj_fdo="11444777000161", nr_client=clientes,
                        total_recurs_exter="0", total_recurs_br="0",
                        tot_ativos_p_relac="0", tot_ativos_cred_priv="0"),
    ],
)

Receita: tratar a rejeição de CNPJ inválido

Um CNPJ com dígitos verificadores incorretos levanta ValidationError já na construção do modelo — falhe cedo, antes de gerar qualquer XML.

from pydantic import ValidationError
from filings_cvm.submission import PerfilMensalRow

try:
    PerfilMensalRow(
        cnpj_fdo="12345678000100",   # dígitos verificadores inválidos
        nr_client=clientes,
        total_recurs_exter="0", total_recurs_br="0",
        tot_ativos_p_relac="0", tot_ativos_cred_priv="0",
    )
except ValidationError as exc:
    print("CNPJ recusado:", exc)