Pular para o conteúdo principal
O Reporter permite gerar arquivos CCS (Cadastro de Clientes do Sistema Financeiro Nacional) em formato XML, conforme definido pelo Banco Central do Brasil (BACEN). Este guia mostra como criar relatórios CCS automatizados usando o Reporter — incluindo ACCS001, ACCS005 e ACCS010 — combinando dados de CRM (titulares e aliases) com estruturas do Midaz.
Os relatórios CCS devem seguir rigorosamente os layouts definidos pelo BACEN. O Reporter permite automatizar a geração do XML, mas a responsabilidade de validar a saída e garantir a conformidade com os requisitos regulatórios permanece com a instituição.

O que é o CCS?


O CCS (Cadastro de Clientes do Sistema Financeiro Nacional) é um cadastro que mapeia relacionamentos entre clientes e instituições financeiras. Seu objetivo é permitir que reguladores e outras entidades autorizadas identifiquem onde um cliente mantém relacionamentos financeiros. As instituições devem enviar relatórios CCS em formato XML, seguindo os schemas ACCS do BACEN. Cada tipo de arquivo possui uma função específica — desde atualizações diárias até transferências de relacionamento. O Reporter torna esse processo automatizado e padronizado, garantindo que os envios CCS sejam tanto tecnicamente válidos quanto alinhados ao negócio.

ACCS001 — Arquivo de atualização diária


O que é

O ACCS001 é o arquivo de atualização diária. Ele reporta inclusões, alterações ou exclusões de relacionamentos de clientes (pessoa física ou jurídica) com a instituição. Este é o arquivo CCS mais frequente, mantendo o cadastro sincronizado com as operações diárias.

Template completo

<?xml version="1.0" encoding="UTF-8"?>
<CCSDOC xmlns="http://www.bcb.gov.br/ccs/ACCS001.xsd">
    <BCARQ>
        <IdentdEmissor>12345678</IdentdEmissor>
        <IdentdDestinatario>00000000</IdentdDestinatario>
        <NomArq>ACCS001</NomArq>
        <NumRemessaArq>12233444</NumRemessaArq>
    </BCARQ>
    <SISARQ>
        <CCSArqAtlzDiaria>
            <Repet_ACCS001_Pessoa>
{%- for alias in plugin_crm.aliases -%}
{%- for holder in plugin_crm.holders -%}
{%- if holder.document == alias.document %}
                <Grupo_ACCS001_Pessoa>
                    <TpOpCCS>I</TpOpCCS>
                    <QualifdrOpCCS>N</QualifdrOpCCS>
                    <TpPessoa>{%- if holder.type == "NATURAL_PERSON" -%}F{%- else -%}J{%- endif -%}</TpPessoa>
                    <CNPJ_CPFPessoa>{{holder.document}}</CNPJ_CPFPessoa>
                    <DtIni>{{alias.banking_details.opening_date}}</DtIni>
                    <DtFim></DtFim>
                </Grupo_ACCS001_Pessoa>
{%- endif -%}
{%- endfor %}
{%- endfor %}
            </Repet_ACCS001_Pessoa>
            <QtdOpCCS>{% count_by plugin_crm.aliases %}</QtdOpCCS>
            <DtMovto>{% date_time "YYYY-MM-DD" %}</DtMovto>
        </CCSArqAtlzDiaria>
    </SISARQ>
</CCSDOC>

Lógica aplicada

Loops aninhados fazem a referência cruzada entre plugin_crm.aliases (contas) e plugin_crm.holders (titulares), permitindo a associação precisa entre os dados das contas e seus respectivos proprietários.
  • O campo <TpPessoa> é condicional:
    • F para pessoas físicas
    • J para pessoas jurídicas
  • Valores fixos neste exemplo:
    • <TpOpCCS> = I (Inclusão) Embora definido como I neste cenário, este campo deve refletir a operação real sendo reportada.
      Os valores válidos de acordo com o Bacen são:
      • I = Inclusão (novas contas no banco de dados da instituição)
      • A = Alteração (mudanças nas informações de contas existentes)
      • E = Exclusão (o registro original deve ser desconsiderado)
    • <QualifdrOpCCS> = N (Normal) Da mesma forma, este campo deve representar o qualificador correto da conta.
      Os valores válidos incluem:
      • N = Normal
      • P = Popular
      • C = Conglomerado
  • Funções utilizadas:
    • count_by plugin_crm.aliases conta os registros de alias por conta.
    • date_time “YYYY-MM-DD” insere dinamicamente a data atual no formato especificado.

Exemplo renderizado

<?xml version="1.0" encoding="UTF-8"?>
<CCSDOC xmlns="http://www.bcb.gov.br/ccs/ACCS001.xsd">
    <BCARQ>
        <IdentdEmissor>12345678</IdentdEmissor>
        <IdentdDestinatario>00000000</IdentdDestinatario>
        <NomArq>ACCS001</NomArq>
        <NumRemessaArq>12233444</NumRemessaArq>
    </BCARQ>
    <SISARQ>
        <CCSArqAtlzDiaria>
            <Repet_ACCS001_Pessoa>
                <Grupo_ACCS001_Pessoa>
                    <TpOpCCS>I</TpOpCCS>
                    <QualifdrOpCCS>N</QualifdrOpCCS>
                    <TpPessoa>F</TpPessoa>
                    <CNPJ_CPFPessoa>12345678900</CNPJ_CPFPessoa>
                    <DtIni>2025-02-01</DtIni>
                    <DtFim></DtFim>
                </Grupo_ACCS001_Pessoa>
            </Repet_ACCS001_Pessoa>
            <QtdOpCCS>1</QtdOpCCS>
            <DtMovto>2025-02-01</DtMovto>
        </CCSArqAtlzDiaria>
    </SISARQ>
</CCSDOC>

ACCS005 — Arquivo de detalhamento de relacionamento


O que é

O ACCS005 é gerado quando o BACEN solicita informações detalhadas sobre os relacionamentos dos clientes. Ele lista todos os vínculos entre um cliente e ativos financeiros (BDVs — Bens, Direitos e Valores), e pode incluir pessoas vinculadas, como sócios ou representantes legais.

Template completo

<?xml version="1.0" encoding="UTF-8"?>
<CCSDOC xmlns="<http://www.bcb.gov.br/ccs/ACCS005.xsd>">
    <BCARQ>
        <IdentdEmissor>12345678</IdentdEmissor>
        <IdentdDestinatario>00000001</IdentdDestinatario>
        <NomArq>ACCS005</NomArq>
        <NumRemessaArq>{% date_time "YYYYMMddHHmm" %}</NumRemessaArq>
    </BCARQ>
    <SISARQ>
        <CCSArqInfDettRelctPessoa>
            <CNPJBaseEntRespons>{{plugin_crm.holders.0.document|slice:':8'}}</CNPJBaseEntRespons>
            <NumCtrlCCSOr>000000</NumCtrlCCSOr>
            <Repet_CCS0005_BDV>
                {%- for account in midaz_onboarding.account %}
                {%- for alias in plugin_crm.aliases %}
                {%- if alias.account_id == account.id %}
                {%- for holder in plugin_crm.holders %}
                {%- if holder.document == alias.document %}
                <Grupo_CCS0005_BDV>
                    <SitInfDettPessoa></SitInfDettPessoa>
                    <Grupo_CCS0005_Part>
                        <CNPJBasePart>{{holder.document|slice:"0:8"}}</CNPJBasePart>
                        <TpBDV>{% if account.type == "deposit" %}1{% elif account.type == "savings" %}2{% elif account.type == "payment" %}3{% else %}6{% endif %}</TpBDV>
                        {%- if alias.banking_details.branch %}
                        <AgIF>{{alias.banking_details.branch}}</AgIF>
                        {%- endif %}
                        {%- if alias.banking_details.type == "CACC" %}
                        <CtCli>{{alias.banking_details.account}}</CtCli>
                        {%- elif alias.banking_details.type == "payment" %}
                        <CtPgto>{{alias.banking_details.account}}</CtPgto>
                        {%- endif %}
                        <TpVincBDV>1</TpVincBDV>
                        <NomPessoa>{{holder.name}}</NomPessoa>
                        <DtIni>{{alias.banking_details.opening_date}}</DtIni>
                        <DtFim></DtFim>
                        {%- if holder.type == "NATURAL_PERSON" and holder.natural_person %}
                        <Repet_CCS0005_Vincd>
                            <Grupo_CCS0005_Vincd>
                                <Grupo_CCS0005_PessoaVincd>
                                    <TpVinc>3</TpVinc>
                                    <CNPJ_CPFPessoaVincd>{{holder.document}}</CNPJ_CPFPessoaVincd>
                                    <NomPessoaVincd>{{holder.natural_person.mother_name}}</NomPessoaVincd>
                                    <DtIniVinc>{{alias.banking_details.opening_date}}</DtIniVinc>
                                    <DtFimVinc></DtFimVinc>
                                </Grupo_CCS0005_PessoaVincd>
                            </Grupo_CCS0005_Vincd>
                        </Repet_CCS0005_Vincd>
                        {%- endif %}
                    </Grupo_CCS0005_Part>
                </Grupo_CCS0005_BDV>
                {%- endif %}
                {%- endfor %}
                {%- endif %}
                {%- endfor %}
                {%- endfor %}
            </Repet_CCS0005_BDV>
            <DtMovto>{% date_time "YYYY-MM-DD" %}</DtMovto>
        </CCSArqInfDettPessoa>
    </SISARQ>
</CCSDOC>

Lógica aplicada

A lógica aplica loops aninhados para iterar por contas, aliases e titulares, permitindo a extração estruturada de todas as entidades relevantes.
  • O campo <TpBDV> usa lógica condicional para determinar o tipo de conta:
    • 1 = depósito
    • 2 = poupança
    • 3 = pagamento
    • 6 = outros
  • Para extração do CNPJ, slice:“0:8” é aplicado para recuperar apenas os 8 primeiros dígitos (base do CNPJ).
  • A tag <Repet_CCS0005_Vincd> é renderizada somente quando o titular da conta é pessoa física e possui indivíduos associados (por exemplo, um procurador ou representante legal).
Para ilustrar isso, o exemplo abaixo inclui o nome da mãe como placeholder para uma pessoa vinculada — não porque essa tag se refere à mãe em si, mas para demonstrar a funcionalidade em ação.
  • A função date_time gera dinamicamente timestamps em tempo de execução, garantindo que o relatório reflita o contexto de execução atual.

Exemplo renderizado

<?xml version="1.0" encoding="UTF-8"?>
<CCSDOC xmlns="http://www.bcb.gov.br/ccs/ACCS005.xsd">
    <BCARQ>
        <IdentdEmissor>12345678</IdentdEmissor>
        <IdentdDestinatario>00000001</IdentdDestinatario>
        <NomArq>ACCS005</NomArq>
        <NumRemessaArq>202502011230</NumRemessaArq>
    </BCARQ>
    <SISARQ>
        <CCSArqInfDettRelctPessoa>
            <CNPJBaseEntRespons>12345678</CNPJBaseEntRespons>
            <NumCtrlCCSOr>000000</NumCtrlCCSOr>
            <Repet_CCS0005_BDV>
                <Grupo_CCS0005_BDV>
                    <SitInfDettPessoa></SitInfDettPessoa>
                    <Grupo_CCS0005_Part>
                        <CNPJBasePart>12345678</CNPJBasePart>
                        <TpBDV>1</TpBDV>
                        <AgIF>001</AgIF>
                        <CtCli>12345-6</CtCli>
                        <TpVincBDV>1</TpVincBDV>
                        <NomPessoa>João Silva</NomPessoa>
                        <DtIni>2020-01-01</DtIni>
                        <DtFim></DtFim>
                        <Repet_CCS0005_Vincd>
                            <Grupo_CCS0005_Vincd>
                                <Grupo_CCS0005_PessoaVincd>
                                    <TpVinc>3</TpVinc>
                                    <CNPJ_CPFPessoaVincd>12345678900</CNPJ_CPFPessoaVincd>
                                    <NomPessoaVincd>Maria Silva</NomPessoaVincd>
                                    <DtIniVinc>2020-01-01</DtIniVinc>
                                    <DtFimVinc></DtFimVinc>
                                </Grupo_CCS0005_PessoaVincd>
                            </Grupo_CCS0005_Vincd>
                        </Repet_CCS0005_Vincd>
                    </Grupo_CCS0005_Part>
                </Grupo_CCS0005_BDV>
            </Repet_CCS0005_BDV>
            <DtMovto>2025-02-01</DtMovto>
        </CCSArqInfDettRelctPessoa>
    </SISARQ>
</CCSDOC>

ACCS010 — Arquivo de transferência de relacionamento


O que é

O ACCS010 é gerado quando relacionamentos de clientes são transferidos entre instituições — situação comum em vendas de carteiras ou fusões. Ele lista os relacionamentos sendo transferidos e identifica a nova instituição responsável.

Template completo

<?xml version="1.0" encoding="UTF-8"?>
<CCSDOC xmlns="<http://www.bcb.gov.br/ccs/ACCS010.xsd>">
    <BCARQ>
        <IdentdEmissor>12345678</IdentdEmissor>
        <IdentdDestinatario>00000000</IdentdDestinatario>
        <NomArq>ACCS010</NomArq>
        <NumRemessaArq>{% date_time "yyyymmdd" %}0001</NumRemessaArq>
    </BCARQ>
    <SISARQ>
        <CCSArqTransRelac>
            <CNPJBaseNovRespons>12345679</CNPJBaseNovRespons>
            {%- for alias in plugin_crm.aliases %}
            {%- for holder in plugin_crm.holders %}
            {%- if alias.holder_id == holder._id and (holder.type == "legal_person" or holder.type == "natural_person") %}
            <Repet_ACCS010_Pessoa>
                <CNPJBasePart></CNPJBasePart>
                <TpPessoa>{% if holder.type == "natural_person" %}F{% else %}J{% endif %}</TpPessoa>
                <CNPJ_CPFPessoa>{{holder.document}}</CNPJ_CPFPessoa>
                <DtIni>{{alias.banking_details.opening_date}}</DtIni>
                <DtFim></DtFim>
            </Repet_ACCS010_Pessoa>
            {%- endif %}
            {%- endfor %}
            {%- endfor %}
            <QtdOpCCS>{% count_by plugin_crm.aliases %}</QtdOpCCS>
        </CCSArqTransRelac>
    </SISARQ>
</CCSDOC>

Lógica aplicada

  • Loops duplos iteram por aliases e titulares.
  • <TpPessoa> define se o titular é pessoa física (F) ou jurídica (J).
  • <CNPJBaseNovRespons> identifica a nova instituição responsável.
  • <QtdOpCCS> usa count_by para garantir que o número de relacionamentos reportados corresponda ao conjunto de dados.
  • As datas (<DtIni> e <DtFim>) rastreiam a validade do relacionamento.

Exemplo renderizado

<?xml version="1.0" encoding="UTF-8"?>
<CCSDOC xmlns="http://www.bcb.gov.br/ccs/ACCS010.xsd">
    <BCARQ>
        <IdentdEmissor>12345678</IdentdEmissor>
        <IdentdDestinatario>00000000</IdentdDestinatario>
        <NomArq>ACCS010</NomArq>
        <NumRemessaArq>202502010001</NumRemessaArq>
    </BCARQ>
    <SISARQ>
        <CCSArqTransRelac>
            <CNPJBaseNovRespons>87654321</CNPJBaseNovRespons>
            <Repet_ACCS010_Pessoa>
                <CNPJBasePart>12345678</CNPJBasePart>
                <TpPessoa>F</TpPessoa>
                <CNPJ_CPFPessoa>12345678900</CNPJ_CPFPessoa>
                <DtIni>2019-05-10</DtIni>
                <DtFim></DtFim>
            </Repet_ACCS010_Pessoa>
            <QtdOpCCS>1</QtdOpCCS>
        </CCSArqTransRelac>
    </SISARQ>
</CCSDOC>
Embora o Reporter forneça a automação técnica, as instituições devem garantir a precisão e consistência dos dados enviados ao BACEN. Sempre valide o XML renderizado contra o schema oficial antes do envio, e envolva as equipes de contabilidade ou compliance no processo de revisão.