Saltar al contenido principal
Esta guía muestra cómo crear reportes CCS automatizados usando Reporter — incluyendo ACCS001, ACCS005 y ACCS010 — combinando datos de CRM (titulares y alias) con las estructuras de Midaz.
Los reportes CCS deben seguir estrictamente los diseños definidos por el BACEN. Reporter te permite automatizar la generación del XML, pero tú sigues siendo responsable de validar la salida y asegurar el cumplimiento de los requisitos regulatorios.

¿Qué es CCS?

El CCS (Cadastro de Clientes do Sistema Financeiro Nacional) es un registro que mapea las relaciones entre clientes e instituciones financieras. Su propósito es permitir a los reguladores y otras entidades autorizadas identificar dónde un cliente mantiene relaciones financieras. Las instituciones deben presentar los reportes CCS en formato XML, siguiendo los esquemas ACCS del BACEN. Cada tipo de archivo tiene una función específica, desde actualizaciones diarias hasta transferencias de relaciones. Reporter hace que este proceso sea automático y estandarizado, asegurando que las presentaciones CCS sean tanto técnicamente válidas como alineadas con el negocio.

ACCS001 — Archivo de actualización diaria

¿Qué es?

El ACCS001 es el archivo de actualización diaria. Reporta las inclusiones, cambios o exclusiones de relaciones de clientes (individuales o corporativos) con la institución. Este es el archivo CCS más frecuente, manteniendo el registro sincronizado con las operaciones diarias.

Plantilla completa

<?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

Los bucles anidados realizan referencias cruzadas entre plugin_crm.aliases (cuentas) y plugin_crm.holders (titulares), lo que permite una asociación precisa entre los datos de la cuenta y sus respectivos propietarios.
  • El campo <TpPessoa> es condicional:
    • F para personas físicas
    • J para personas jurídicas
  • Valores fijos en este ejemplo:
    • <TpOpCCS> = I (Inclusión) Aunque se establece en I en este escenario, este campo debe reflejar la operación real que se está reportando. Los valores válidos según el BACEN son:
      • I = Inclusión (nuevas cuentas en la base de datos de la institución)
      • A = Actualización (cambios en la información de cuentas existentes)
      • E = Exclusión (el registro original debe ser desestimado)
    • <QualifdrOpCCS> = N (Normal) De manera similar, este campo debe representar el calificador correcto para la cuenta. Los valores válidos incluyen:
      • N = Normal
      • P = Popular
      • C = Conglomerado
  • Funciones utilizadas:
    • count_by plugin_crm.aliases cuenta los registros de alias por cuenta.
    • date_time "YYYY-MM-DD" inserta dinámicamente la fecha actual en el formato especificado.

Ejemplo 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 — Archivo de detalle de relaciones

Qué es

El ACCS005 se genera cuando el BACEN solicita información detallada sobre las relaciones con los clientes. Enumera todos los vínculos entre un cliente y los activos financieros (BDVs - Bienes, Derechos y Valores), y puede incluir personas relacionadas como socios o representantes legales.

Plantilla completa

<?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>
        </CCSArqInfDettRelctPessoa>
    </SISARQ>
</CCSDOC>

Lógica Aplicada

La lógica aplica bucles anidados para iterar sobre cuentas, alias y titulares (holders), lo que permite una extracción estructurada de todas las entidades relevantes.
  • El campo <TpBDV> utiliza lógica condicional para determinar el tipo de cuenta:
    • 1 = depósito
    • 2 = ahorro
    • 3 = pago
    • 6 = otros
  • Para la extracción del CNPJ, se aplica slice:"0:8" para obtener solo los primeros 8 dígitos (base del CNPJ).
  • La etiqueta <Repet_CCS0005_Vincd> se renderiza solo cuando el titular de la cuenta es una persona natural y tiene individuos asociados (por ejemplo, un apoderado o representante legal).
Para ejemplificar esto, el ejemplo a continuación incluye el nombre de la madre como marcador de posición para una persona vinculada — no porque esa etiqueta se refiera a la madre en sí, sino para demostrar la funcionalidad en acción.
  • La función date_time genera dinámicamente marcas de tiempo (timestamps) en tiempo de ejecución, asegurando que el reporte refleje el contexto de ejecución actual.

Ejemplo 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></DtFimVin

ACCS010 — Archivo de transferencia de relaciones

Qué es

El ACCS010 se genera cuando las relaciones con clientes son transferidas entre instituciones — algo común en ventas de carteras o fusiones. Enumera las relaciones que están siendo transferidas e identifica a la nueva institución responsable.

Plantilla completa

<?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

  • Se utilizan bucles anidados para iterar sobre aliases y holders.
  • <TpPessoa> define si el titular es persona física (F) o jurídica (J).
  • <CNPJBaseNovRespons> identifica la nueva institución responsable.
  • <QtdOpCCS> usa count_by para asegurar que el número de relaciones reportadas coincida con el dataset.
  • Las fechas (<DtIni> y <DtFim>) registran la validez de la relación.

Ejemplo 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>
Aunque Reporter provee la automatización técnica, las instituciones deben garantizar la exactitud y consistencia de los datos enviados al BACEN. Siempre valida el XML generado contra el esquema oficial antes de enviarlo e involucra a los equipos de contabilidad o cumplimiento en la revisión del proceso.
I