Introdução do acesso SERASA Bureau

Registros disponíveis no Credit Bureau – B49C para Pessoas Físicas. A saída atual da lib (jar file) pode vir por uma Hashtable<K,V> (Key,Value) ou uma exceção, sendo esta um erro de infraestrutura, layout, configuração, etc. Para cada registro, há uma chave de acesso para os valores equivalentes, e, no caso de múltiplos registros, acrescenta-se um sufixo sequencial “‘_N+1‘”, e.g. para acessar o valor do segundo registro de ‘B358_DTOCORR_2‘; o controle final da quantidade de registros se dará por outra chave, no caso ‘B358_NUMPEFIN‘, então, poderíamos ter:

 

 

for( int i=0; i < Integer.valueOf(hash.get("B358_NUMPEFIN")); i++) {
    System.out.println("registro: " + hash.get("B358_DTOCORR_" + String.valueOf(i)));
}

 

Configurando acesso ao SERASA PF

A configuração dos acessos externos SERASA PF/PJ deve inicialmente passar por uma indicação para a JVM do path do arquivo de properties, do certificado e do ‘log4j‘; veja abaixo o setting para a JVM (‘-D option‘):

 

-Dserasa-bureau.datadir=/home/jboss/intellector
-Dlog4j.configuration=/home/jboss/intellector
-Daccess.ssl=/home/jboss/intellector/ssl

Para o uso direto em testes, usaríamos… (e.g. /home/jboss/intellector)

 

java -jar -cp. -Dserasa-bureau.datadir=/home/jboss/intellector SerasaBureau.jar

 

 

Usando o método de execução acima, não esqueça de colocar no ’CLASSPATH’ todas as dependências; e o mesmo para JAVA_OPTS no JBoss…

 

 

 

Propriedades para o Acesso Seguro (HTTPS)

 

# Arquivo de properties para o SERASA PJ
# $Revision: 1.2 $
#

# Informações de autenticacao e certificados do serasa
user.url=sitenet07.serasa.com.br
user.root=/Homologa/consultahttps
user.jks=lVaxvlqeVH5ugq/rba5vYvSWhu8kYJqO3Q==O63WLqgqpA==
user.cert=/home/jboss/intellector-files/serasa.jks

 

 

Configurando SSL e HTTPS, leia aqui; sem Certificado ’não funciona’ e, entenda bem o conceito, leia sobre isso. Esse certificado é fornecido pela própria entidade, tipo host<->host.

 

Auditoria dos dados de Acesso

Para efeitos de auditoria, esse plugin persiste os dados da string de Envio e Retorno do acesso (dados brutos), sendo possível consultar esses dados via web service de Auditoria e verificar ou fazer uso dessas strings. O conteúdo dessa string bruta é composto pelos campos que compõe o layout de entrada e saída, especificada na documentação do SERASA.

Layouts para o Acesso

 

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- layout_p002.xml - Registro P002 - Outras Opcoes de Consulta Pessoa Fisica -->
<serasa_bureau>
    <field>
    <!-- Tipo de registro TIPO-REG -->
        <name>P002</name>
        <size>4</size>
        <type>S</type>
    </field>
    <field>
    <!-- codigo da 1a opcao para consultar outro produto, feature ou base (ver tabela 30 -->
        <name>IP20</name>
        <size>4</size>
        <type>S</type>
    </field>
    <field>
    <!-- chave de acesso para consultar a 1a opcao se necessario -->
        <name>Q</name>
        <size>21</size>
        <type>S</type>
    </field>
    <field>
    <!-- codigo da 2a opcao para consultar outro produto, feature ou base (ver tabela 30 -->
        <name> </name>
        <size>4</size>
        <type>S</type>
    </field>
    <field>
    <!-- chave de acesso para consultar a 2a opcao se necessario -->
        <name> </name>
        <size>21</size>
        <type>S</type>
    </field>
    <field>
    <!-- codigo da 3a opcao para consultar outro produto, feature ou base (ver tabela 30 -->
        <name> </name>
        <size>4</size>
        <type>S</type>
    </field>
    <field>
    <!-- chave de acesso para consultar a 3a opcao se necessario -->
        <name> </name>
        <size>21</size>
        <type>S</type>
    </field>
  
    <field>
    <!-- codigo da 4a opcao para consultar outro produto, feature ou base (ver tabela 30 -->
        <name> </name>
        <size>4</size>
        <type>S</type>
    </field>
    <field>
    <!-- chave de acesso para consultar a 4a opcao se necessario -->
        <name> </name>
        <size>21</size>
        <type>S</type>
    </field>
    <field>
    <!-- filler de COMPLEMENTO do registro P002 -->
        <name> </name>
        <size>11</size>
        <type>S</type>
    </field>
</serasa_bureau>

 

 

 

<?xml version="1.0" encoding="ISO-8859-1"?>
<serasapf>
    <field>
    <!-- Layout de consulta P006: trata-se de uma sequencia de S/N, para cada registro -->
    <!-- para uma melhor visualizacao e configuracao, verificar o layout de consulta do P006 -->
        <name>P006SNSSS9999SSSSSSSN NNNSN</name>
        <size>27</size>
        <type>S</type>
    </field>
    <field>
    <!-- filler (7): filler de COMPLEMENTO do registro P006 -->
        <name> </name>
        <size>88</size>
        <type>S</type>
    </field>
</serasapf>

 

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Layout PF B49C -->
<serasapf>
    <field>
        <!-- header Credit Bureau -->
        <name>B49C</name>
        <size>4</size>
        <type>S</type>
    </field>
    <field>
        <!-- Filler -->
        <name> </name>
        <size>6</size>
        <type>S</type>
    </field>
    <field>
        <!-- NUM_DOC=CPF; está neste XML ilustrando, pois o mesmo é tratado numa -->
        <!-- tag de entrada, serve como referencia pra substituicao do real CPF -->
        <name>cpf</name>
        <size>15</size>
        <type>N</type>
    </field>
    <field>
    <!-- Tipo Pessoa F=pessoa fisica; J=pessoa juridica -->
        <name>F</name>
        <size>1</size>
        <type>S</type>
    </field>
    <field>
        <!-- Base de consulta -->
        <name>C</name>
        <size>6</size>
        <type>S</type>
    </field>
    <field>
    <!-- Modalidade -->
        <name>FI</name>
        <size>2</size>
        <type>S</type>
    </field>
    <field>
    <!-- valor da consulta -->
        <name>8888888</name>
        <size>7</size>
        <type>N</type>
    </field>
    <field>
    <!-- Centro de custo -->
        <name> </name>
        <size>12</size>
        <type>S</type>
    </field>
    <field>
    <!-- Codificado (S/N) -->
        <name>N</name>
        <size>1</size>
        <type>S</type>
    </field>
    <field>
    <!-- quantidade de registros por transmissao de dados -->
        <name>99</name>
        <size>2</size>
        <type>N</type>
    </field>
    <field>
    <!-- Deseja dialogo de comunicacao (S/N) -->
        <name>S</name>
        <size>1</size>
        <type>S</type>
    </field>
    <field>
    <!-- Funcao: INI,CON,ENC,ERR,TMD,FIM -->
        <name>INI</name>
        <size>3</size>
        <type>S</type>
    </field>
    <field>
    <!-- Tipo de consulta -->
        <name>A</name>
        <size>1</size>>
        <type>S</type>
    </field>
    <field>
    <!-- atualiza dados enviados (S/N) -->
        <name>N</name>
        <size>1</size>
        <type>S</type>
    </field>
    <field>
    <!-- Filler (2) -->
        <name> </name>
        <size>42</size>
        <type>S</type>
    </field>
    <field>
    <!-- quantidade de cheques sequenciais -->
        <name>00</name>
        <size>2</size>
        <type>N</type>
    </field>
    <field>
    <!-- endereço + telefone -->
        <name>N</name>
        <size>1</size>
        <type>S</type>
    </field>
    <field>
    <!-- filler (3) -->
        <name> </name>
        <size>8</size>
        <type>S</type>
    </field>
    <field>
    <!-- conta corrente -->
        <name>0000000000</name>
        <size>10</size>
        <type>N</type>
    </field>
    <field>
    <!-- digito da conta corrente -->
        <name>0</name>
        <size>1</size>
        <type>N</type>
    </field>
    <field>
    <!-- agencia -->
        <name>0000</name>
        <size>4</size>
        <type>N</type>
    </field>
    <field>
    <!-- filler (4) -->
        <name> </name>
        <size>61</size>
        <type>N</type>
    </field>
    <field>
    <!-- quantidade de compromisso encontrados -->
        <name> </name> 
        <size>2</size>
        <type>N</type>
    </field>
    <field>
    <!-- tem anotacoes negativas (S/N/B) -->
        <name> </name>
        <size>1</size>
        <type>S</type>
    </field>
    <field>
    <!-- anotacoes de cheques (S/N/B) -->
        <name> </name>
        <size>1</size>
        <type>S</type>
    </field>
    <field>
    <!-- data da consulta -->
        <name> </name>
        <size>8</size>
        <type>S</type>
    </field>
    <field>
    <!-- hora da consulta -->
        <name> </name>
        <size>6</size>
        <type>S</type>
    </field>
    <field>
    <!-- total de registros -->
        <name> </name>
        <size>4</size>
        <type>S</type>
    </field>
    <field>
    <!-- quantidade de registros enviados por transmissao -->
        <name> </name>
        <size>4</size>
        <type>N</type>
    </field>
    <field>
    <!-- numero de controle de atualizacao das tabelas -->
        <name> </name>
        <size>4</size>
        <type>S</type>
    </field>
    <field>
    <!-- filler (5) -->
        <name> </name>
        <size>176</size>
        <type>S</type>
    </field>
    <field>
    <!-- acessou recheque online (S/N) -->
        <name>N</name>
        <size>1</size>
        <type>S</type>
    </field>
    <field>
    <!-- tem ocorrencia de Recheque ultimo ano (S/N) -->
        <name>N</name>
        <size>1</size>
        <type>S</type>
    </field>
    <field>
    <!-- filler (6) -->
        <name> </name>
        <size>1</size>
        <type>S</type>
    </field>
</serasapf>

 

Propriedades Configuráveis do Acesso

 

#Arquivo de properties para o SERASA PF
# $Revision: 1.2 $
#
# type S=string, N=numeric
#
# Informaçoes de Login no SERASA
serasa.login=00186487
serasa.login_size=8
serasa.login_type=N
serasa.password=11003344   
serasa.pass_size=8
serasa.pass_type=S
serasa.newpass= 
serasa.npass_size=8
serasa.npass_type=S


Preenchimento da HashMap de Entrada

  • Método de acesso no XML

Esse será o método usado pelo reflection da politica

<
!-- metodo de acesso para ser carregado no acesso       -->
<code name="br.com.tools.acessos.serasa.SerasaPF"/>

 

  • Sufixo para as variáveis internas da política

Será usada apenas pelo cliente e pela politica, mas deve ser informado.

 

<!-- esse deverah ser sufixo para ser acrescentado ao nome   -->
<!-- vindo da politica, entao irei buscar na hash da politica    -->
<!-- hash.getKey(cpf_serasa); um de/para para os elementos   -->
<nome_acesso>serasapf</nome_acesso>
  • ‘Somente com P006‘ – Opções de Consulta Cadastro Sintético (mínimo)
    1. Registros chave para ser informado na hashtable de entrada
      1. ‘CPF‘ – contém o CPF para consulta, sem “.” (ponto) ou “-” (hífen)

e.g. java code

 

 

serIn.put("CPF", "00000000191");

 

  • Arquivo XML

 

<!-- posso testar pelo valor obrigatorio dentro de cada     -->
<!-- acesso,  ele dever ser "CPF"                -->
<field description="CPF a ser consultado" type="String" format="">CPF</field>

 

Chave na ‘HashMap‘ (default=false)

 

// deve ser informado; ele avisa true/false para a consulta ao P005
serIn.put("P005", "false");

 

    1. Registros chave para ser informado na hashtable de entrada
      1. ‘CMC7‘ (30 bytes) – contém o CMC7 do cheque
      2. ‘VLR_CHEQUE‘ – valor do cheque
      3. ‘VENC_CHEQUE‘ – data de vencimento do cheque
      4. ‘TIPO_MOV‘ – tipo de movimento (“I”=incluir cheque; “B”=baixar cheque; “E”=baixar cheque que terá novo cheque incluido na sequência; “C”=consultar cheque)
  • ‘xml‘ 
<!-- contem os dados necessarios para entrada no serasa PF       -->
<entrada>
    <!-- posso testar pelo valor obrigatorio dentro de cada     -->
    <!-- acesso,  ele dever ser "CPF"                            -->
    <field description="CPF a ser consultado" type="String" format="">CPF</field>
    <!-- no caso de ser "CPF", pode-se optar pelo protocolo  -->
    <!-- P005, entao  verifico se o dado abaixo(CMC7?) existe    -->
    <!-- como "true" ou "false", soh entao ele usa os dados      -->
    <field description="Indicação de uso da consulta P005: true/false" type="Boolean" format="">P005</field>
    <field description="CMC7" type="String" format="">CMC7</field>
    <field description="Valor de cheque consultado" type="Double" format="">VLR_CHEQUE</field>
    <!-- Data de vencimento do cheque; deverah vir AAAAMMDD      -->
    <field description="Data de vencimento do cheque; deverá ser AAAAMMDD" type="Date" format="yyyymmdd">VENC_CHEQUE</field>
    <!-- Tipo de movimento sao:                              -->
    <!-- "I"=incluir cheque;"B"=baixar cheque;"E"=baixar cheque -->
    <!-- que terah novo cheque incluido na sequencia;            -->
    <!-- "C"=consultar cheque                                    -->
    <!-- como defensive programing                               -->
    <field description="Tipo de movimento: I/B/E/C" type="String" format="">TIPO_MOV</field>
</entrada>

 

  • Exception‘ 

throw new LayoutException("Erro preenchendo HashMap " + this.toString());

 

 

Curiosidade: o CMC7 é composto pelas seguintes sequências:

a) código de compensação do banco

b) número da agência bancária

c) dígito módulo 10 dos campos

d) código da câmera de compensação

e) número do cheque

f) código de tipicação do documento (5, 6, 7 e 8)

g) digito módulo 10 dos campos banco e agência

h) número da conta corrente i) dígito módulo 10 do campo conta

 

 

'Contador’ – sempre existe um atributo no XML nomeado ’counter’ como indexador dos registros