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, podemos ter:
for( int i=0; i < Integer.valueOf(hash.get("B358_NUMPEFIN")); i++) { System.out.println("registro: " + hash.get("B358_DTOCORR_" + String.valueOf(i))); } |
Lembrar sempre que a correta interpretação dos registros depende da leitura atenta do layout B49C/B49L.
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,deve ser utilizado: (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… |
# 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. |
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.
<?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> |
#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
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"/> |
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> |
serIn.put("CPF", "00000000191"); |
<!-- 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"); |
<!-- 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> |
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 tipificaçã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 |
---|
Exception
throw new LayoutException("Erro preenchendo HashMap " + this.toString()); |
'Contador’ – sempre existe um atributo no XML nomeado ’counter’ como indexador dos registros |
<!-- 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> |
Resposta da Consulta
<!-- Obs.: quando counter=alguma_coisa, entao todo o bloco --> <!-- abaixo sofrerah um looping baseado nesse counter --> <saida id="B002" counter="B002_NUMREGISTROS" > <register description="Data da última alteraçãocadastral(AAAAMMDD)" type="Date" format="yyyymmdd">B002_DATAEMISS_</register> <register description="UF da emissão" type="String" format="">B002_UFEMISSOR_</register> <register description="Data de atualização do registro (AAAAMMDD)" type="Date" format="yyyymmdd">B002_DTATUALIZA_</register> <register description="Data Nascimento (AAAAMMDD)" type="Date" format="yyyymmdd">B002_DATANASC_</register> <register description="Nome da mãe" type="String" format="">B002_NOMEMAE_</register> <register description="Sexo" type="String" format="">B002_SEXO_</register> <register description="Tipo do documento" type="String" format="">B002_TIPODOC_</register> <register description="Número do documento" type="String" format="">B002_NUMDOC_</register> <register description="Órgão emissor do documento de identidade" type="String" format="">B002_ORGAOEMISS_</register> </saida> |
<!-- Obs.: quando counter=alguma_coisa, entao todo o bloco --> <!-- abaixo sofrerah um looping baseado nesse counter --> <saida id="B002" counter="5" > <register description="Data da última alteraçãocadastral(AAAAMMDD)" type="Date" format="yyyymmdd">B002_DATAEMISS_</register> <register description="UF da emissão" type="String" format="">B002_UFEMISSOR_</register> <register description="Data de atualização do registro (AAAAMMDD)" type="Date" format="yyyymmdd">B002_DTATUALIZA_</register> <register description="Data Nascimento (AAAAMMDD)" type="Date" format="yyyymmdd">B002_DATANASC_</register> <register description="Nome da mãe" type="String" format="">B002_NOMEMAE_</register> <register description="Sexo" type="String" format="">B002_SEXO_</register> <register description="Tipo do documento" type="String" format="">B002_TIPODOC_</register> <register description="Número do documento" type="String" format="">B002_NUMDOC_</register> <register description="Órgão emissor do documento de identidade" type="String" format="">B002_ORGAOEMISS_</register> </saida> |
<saida id="B280" counter="" > <register description="Descrição do Score" type="String" format="">B280_DESCSCORE</register> <register description="Pontos no Score" type="String" format="">B280_PONTSCORE</register> <register description="Range do Score" type="String" format="">B280_RANGESCORE</register> <register description="Taxa do Score" type="String" format="">B280_TAXASCORE</register> <register description="Mensagem do Score" type="String" format="">B280_MSGSCORE</register> <register description="Código da mensagem do Score" type="String" format="">B280_CODMSGSCORE</register> </saida> |
TODOS os registros seguem a mesma lógica e, o ’XML completo com todos os registros do acesso’, importado pelo Compilador, pode ser baixado aqui. |
Layouts SERASA: B49C