Discussão sobre o TISSNet, Web Services e Ponto-a-ponto

[quote=dsmdanbr][quote=viniciuspadua]dsmdanbr, acho que consegui oque tava querendo!

veja abaixo!

[code]
public static void main(String[] args) throws JAXBException, FileNotFoundException {

	// Pacote onde encontra-se os schema das classes TISS
	JAXBContext jc = JAXBContext.newInstance("br.gov.ans.padroes.tiss.schemas");

	MensagemTISS mensagem = null;

	Unmarshaller unmarshaller = jc.createUnmarshaller();

	// XML do arquivo
	String arquivo = "c:/1466_2f4f7f75c65edae68496f965962337a6.xml";

	File file = new File(arquivo);

	mensagem = (MensagemTISS) unmarshaller.unmarshal(new FileInputStream(file
			.getAbsolutePath()));

	// Descomente caso necessite colocar o hash
	// mensagem.setEpilogo(new MensagemTISS.Epilogo());
	// mensagem.getEpilogo().setHash(mensagemTiss.calcularHash());

	// Mapeado
	System.out.println(mensagem.getCabecalho().getDestino().getRegistroANS());

}

[/code][/quote]

Velho, muito obrigado, vou testar aqui, qualquer dúvida já posto.[/quote]

dsmdanbr , desculpe nao ter respondido antes, fiquei sem internet em casa uns dias.

Então, é isso mesmo que o viniciuspadua te passou.
O melhor desse tópico é que todos podem ajudar.

E viniciuspadua , vc conseguiu o que queria com o webservices ?

Vou dar uma verificada no que você falou e ver o que eu fiz.
[Não estou mais na empresa onde trabalhava com o TISS, mas adoro sempre que posso poder fazer parte dele.]

Abraços

consegui ja!
so falta testar, mais estou esperando o setor de faturamento me liberar um lote!

qualquer duvida, posto!

abraços

[quote=viniciuspadua]consegui ja!
o setor de faturamento me liberar um lote!
[/quote]

Eita que eu adorava essa vida…rsrs

Ja crio os xml e envio para as operadoras e tudo funciona blz.
Estou entrando agora no mundo dos web services.
Com web services estou encontrando problemas na geração do hash. Ele é calculado de modo diferente do arquivo xml ?

[quote=viniciuspadua]Ja crio os xml e envio para as operadoras e tudo funciona blz.
Estou entrando agora no mundo dos web services.
Com web services estou encontrando problemas na geração do hash. Ele é calculado de modo diferente do arquivo xml ?[/quote]

O calculo do hash é o mesmo.
Q tipo de problemba ta tendo?

hash inválido!
e o foda é que nas outra operadoras valida!
Utilizo o mesmo método para gerar o hash!

Com Upload via página operadora:
Passos:

  1. Crio o Xml
  2. Entro no site da operado e envio

Todas funcionam sem problema, inclusive o convênio com problema no webservices.

Com WebServices:
Passos que faço:

  1. Gerar o arquivo XML (mesmo método que gera o anterior)
  2. Código Abaixo: Para converter o xml em classes a ser enviada
JAXBContext jc = JAXBContext.newInstance("br.gov.ans.padroes.tiss.schemas");

MensagemTISS mensagem = null;

Unmarshaller unmarshaller = jc.createUnmarshaller();

mensagemTISS = (MensagemTISS) unmarshaller.unmarshal(new FileInputStream(fileXML.getAbsolutePath()));
  1. Popular as informações, a ser enviada pelo web Services
WsLoteGuias loteGuias = factory.createWsLoteGuias();

loteGuias.setCabecalho(mensagemTISS.getCabecalho());
loteGuias.setLoteGuias(mensagemTISS.getPrestadorParaOperadora().getLoteGuias());

loteGuias.setHash(mensagemTISS.getEpilogo().getHash());
  1. Enviar via webServices
protocoloRecebimento = soap.tissLoteGuiasOperation(loteGuias);

Mais sempre ocorre um erro de hash! informa que o hash informado não é o do arquivo enviado.
Alguma idéia de como corrigir ?

Valeu!

Fala Vinícius,

Então, só pude testar agora o exemplo que vc respondeu no Fórum.
Tenho a seguinte dúvida:

  • Quando vc carrega um objeto File através do caminho de “arquivo”,
    esse arquivo está em branco ou já segue com algum conteúdo padrão?

String arquivo = “c:/1466_2f4f7f75c65edae68496f965962337a6.xml”;
File file = new File(arquivo);

  • Vi a estrutura da classe MensagemTiss na documentação, no caso, como gostaria de adicionar a partir dela
    Guias de SP/SADT, teria que setar “prestadorParaOperadora”, dentro do objeto MensagemTISS.PrestadorParaOperadora
    teria que setar “loteGuias”, dentro do objeto CtLoteGuias teria que setar “guias”, …, até setar as guias campo por campo.
    Alguém teria algum exemplo de um código setando várias guias?
    Além de setar o Hash, o que mais eu devo ficar atento?

Obrigado!!!

[quote=viniciuspadua]dsmdanbr, acho que consegui oque tava querendo!

veja abaixo!

[code]
public static void main(String[] args) throws JAXBException, FileNotFoundException {

	// Pacote onde encontra-se os schema das classes TISS
	JAXBContext jc = JAXBContext.newInstance("br.gov.ans.padroes.tiss.schemas");

	MensagemTISS mensagem = null;

	Unmarshaller unmarshaller = jc.createUnmarshaller();

	// XML do arquivo
	String arquivo = "c:/1466_2f4f7f75c65edae68496f965962337a6.xml";

	File file = new File(arquivo);

	mensagem = (MensagemTISS) unmarshaller.unmarshal(new FileInputStream(file
			.getAbsolutePath()));

	// Descomente caso necessite colocar o hash
	// mensagem.setEpilogo(new MensagemTISS.Epilogo());
	// mensagem.getEpilogo().setHash(mensagemTiss.calcularHash());

	// Mapeado
	System.out.println(mensagem.getCabecalho().getDestino().getRegistroANS());

}

[/code][/quote]

ja passo o arquivo xml com todos os dados.
e o JAXB ja faz os get set na classe!

se conseguir enviar para algum web services e não der problema de hash me avise!

[quote=viniciuspadua]ja passo o arquivo xml com todos os dados.
e o JAXB ja faz os get set na classe!

se conseguir enviar para algum web services e não der problema de hash me avise![/quote]

Vinicius e pessoal do fórum,

Consegui gerar o arquivo xml, e calcular o hash, desculpa ai pelas perguntas simples,
é que não deu tempo estudar bem o material passado pela ANS, tive que tentar fazer
natoralmente… hehehehehe. Mais a ajuda do fórum foi essencial.

Estou com dúvida agora como colocar o prefixo da ans no arquivo xml.

Olha como ficou o arquivo xml:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> ENVIO_LOTE_GUIAS 1 V2_02_01 124578 995739 1642028023161906 Arthur Alves Oliveira Unimed 40610681000886 40616682000186 Teste Nome Empresa Av. Juracy Magalhães 1200 293330 Vitória da Conquista BA 45.100-000 1770545 Juscilene Silva Leao CRM 12834 E CID-10 R43 Outros a77b013c5a940786e76be63b2bc8c1bc

Está sem o prefixo da ANS!!!

Desde já obrigado.

colocar o prefixo vai depender da sua codificação: para mim fiz assim:

import org.dom4j.Element;
import org.dom4j.Namespace;

...

private final Namespace ansNameSpace = new Namespace("ans","http://www.ans.gov.br/padroes/tiss/schemas");

...

Element epilogo = pai.addElement(new QName("epilogo", namespace));
Element hash = epilogo.addElement(new QName("hash", namespace));

com isso ao gerar o xml ja vai com o namespace!

[quote=viniciuspadua]colocar o prefixo vai depender da sua codificação: para mim fiz assim:

import org.dom4j.Element;
import org.dom4j.Namespace;

...

private final Namespace ansNameSpace = new Namespace("ans","http://www.ans.gov.br/padroes/tiss/schemas");

...

Element epilogo = pai.addElement(new QName("epilogo", namespace));
Element hash = epilogo.addElement(new QName("hash", namespace));

com isso ao gerar o xml ja vai com o namespace![/quote]

Então, no caso isso seria caso tivesse gerado o xml item por item não é isso?
Porque eu instanciei um objeto MensagemTISS setei os campos e salvei ele em XML
através da JAXB.

Olha como ficou o código de teste:

ObjectFactory objFactory = new ObjectFactory();
MensagemTISS mensagem = new MensagemTISS();
mensagem.setCabecalho(new CabecalhoTransacao());
mensagem.getCabecalho().setVersaoPadrao(“2.02.01”);
mensagem.getCabecalho().setIdentificacaoTransacao(new CabecalhoTransacao.IdentificacaoTransacao());
mensagem.getCabecalho().getIdentificacaoTransacao().setTipoTransacao(StTipoTransacao.ENVIO_LOTE_GUIAS);
mensagem.getCabecalho().getIdentificacaoTransacao().setSequencialTransacao(new BigInteger(“1”));
mensagem.setPrestadorParaOperadora(new MensagemTISS.PrestadorParaOperadora());
mensagem.getPrestadorParaOperadora().setLoteGuias(ctLoteGuias);

    //mensagem.setCabecalho(new CabecalhoTransacao());
    mensagem.setEpilogo(objFactory.createMensagemTISSEpilogo());
    mensagem.getEpilogo().setHash("0");

    MensagemTiss mTiss = new MensagemTiss();
    try {
        mTiss.setDocumentoMensagem(mensagem);
    } catch (Exception e) {
        e.printStackTrace();
    }
    mensagem.getEpilogo().setHash(mTiss.getHashCalculado());

    try {
        JAXBContext jc = JAXBContext.newInstance("br.gov.ans.padroes.tiss.schemas.v20201");
        Marshaller m = jc.createMarshaller();
        m.setProperty(m.JAXB_ENCODING, "ISO-8859-1");
        m.setProperty(m.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        m.marshal(mensagem, new FileOutputStream("d:/a.xml"));

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File file = new File("d:/a.xml");
        mensagem = (MensagemTISS) unmarshaller.unmarshal(new FileInputStream(file.getAbsolutePath()));

        String mensagemTxt = security.log.util.LogUtil.readFile(file).replace("http://www.ans.gov.br/padroes/tiss/schemas/v20201", "http://www.ans.gov.br/padroes/tiss/schemas");
        file.createNewFile();
        FileWriter output = new FileWriter(file);
        BufferedWriter bufOutput = new BufferedWriter(output);
        bufOutput.write(mensagemTxt);
        bufOutput.close();

        MensagemTiss mensagemTiss = new MensagemTiss(file.getAbsolutePath());
        System.out.println(mensagemTiss.getHashCalculado());

    } catch (JAXBException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }

Entendeu? Não teria como eu setar o prefixo através da JAXB?

Obrigado.

[quote=dsmdanbr][quote=viniciuspadua]colocar o prefixo vai depender da sua codificação: para mim fiz assim:

import org.dom4j.Element;
import org.dom4j.Namespace;

...

private final Namespace ansNameSpace = new Namespace("ans","http://www.ans.gov.br/padroes/tiss/schemas");

...

Element epilogo = pai.addElement(new QName("epilogo", namespace));
Element hash = epilogo.addElement(new QName("hash", namespace));

com isso ao gerar o xml ja vai com o namespace![/quote]

Então, no caso isso seria caso tivesse gerado o xml item por item não é isso?
Porque eu instanciei um objeto MensagemTISS setei os campos e salvei ele em XML
através da JAXB.

Olha como ficou o código de teste:

ObjectFactory objFactory = new ObjectFactory();
MensagemTISS mensagem = new MensagemTISS();
mensagem.setCabecalho(new CabecalhoTransacao());
mensagem.getCabecalho().setVersaoPadrao(“2.02.01”);
mensagem.getCabecalho().setIdentificacaoTransacao(new CabecalhoTransacao.IdentificacaoTransacao());
mensagem.getCabecalho().getIdentificacaoTransacao().setTipoTransacao(StTipoTransacao.ENVIO_LOTE_GUIAS);
mensagem.getCabecalho().getIdentificacaoTransacao().setSequencialTransacao(new BigInteger(“1”));
mensagem.setPrestadorParaOperadora(new MensagemTISS.PrestadorParaOperadora());
mensagem.getPrestadorParaOperadora().setLoteGuias(ctLoteGuias);

    //mensagem.setCabecalho(new CabecalhoTransacao());
    mensagem.setEpilogo(objFactory.createMensagemTISSEpilogo());
    mensagem.getEpilogo().setHash("0");

    MensagemTiss mTiss = new MensagemTiss();
    try {
        mTiss.setDocumentoMensagem(mensagem);
    } catch (Exception e) {
        e.printStackTrace();
    }
    mensagem.getEpilogo().setHash(mTiss.getHashCalculado());

    try {
        JAXBContext jc = JAXBContext.newInstance("br.gov.ans.padroes.tiss.schemas.v20201");
        Marshaller m = jc.createMarshaller();
        m.setProperty(m.JAXB_ENCODING, "ISO-8859-1");
        m.setProperty(m.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        m.marshal(mensagem, new FileOutputStream("d:/a.xml"));

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File file = new File("d:/a.xml");
        mensagem = (MensagemTISS) unmarshaller.unmarshal(new FileInputStream(file.getAbsolutePath()));

        String mensagemTxt = security.log.util.LogUtil.readFile(file).replace("http://www.ans.gov.br/padroes/tiss/schemas/v20201", "http://www.ans.gov.br/padroes/tiss/schemas");
        file.createNewFile();
        FileWriter output = new FileWriter(file);
        BufferedWriter bufOutput = new BufferedWriter(output);
        bufOutput.write(mensagemTxt);
        bufOutput.close();

        MensagemTiss mensagemTiss = new MensagemTiss(file.getAbsolutePath());
        System.out.println(mensagemTiss.getHashCalculado());

    } catch (JAXBException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }

Entendeu? Não teria como eu setar o prefixo através da JAXB?

Obrigado.[/quote]

Consegui colocar o prefixo, tem até um exemplo na página 6.

import com.sun.xml.bind.marshaller.NamespacePrefixMapper;

public class ANSPrefixMapper extends NamespacePrefixMapper {

    public static final String PREFIXO_ANS = "ans";

    @Override
    public String getPreferredPrefix(String arg0, String arg1, boolean arg2) {
        return PREFIXO_ANS;
    }
}
            Marshaller m = jc.createMarshaller();
            m.setProperty("com.sun.xml.bind.namespacePrefixMapper", new ANSPrefixMapper());

Referência: http://www.j2ee.me/webservices/docs/2.0/jaxb/vendorProperties.html

Obrigado.

Alguém sabe como criar um XMLGregorianCalendar que gere a data no formato 22/10/2009?

Estou tendo o seguinte problema:

mensagem.getCabecalho().getIdentificacaoTransacao().setDataRegistroTransacao(DatatypeFactory.newInstance().newXMLGregorianCalendarDate(2009, 11, 22, DatatypeConstants.FIELD_UNDEFINED));

Error: cvc-pattern-valid: Value ‘2009-10-22’ is not facet-valid with respect to pattern ‘[0-9]{2}/[0-9]{2}/[0-9]{4}’ for type ‘st_data’.

Porque a data está saindo no XML assim ‘2009-10-22’.

Parece que não tem como mudar esse padrão no XMLGregorianCalendar.
A saída padrão seria: 1976-12-22T00:00:00.000+01:00
Só tem como ocultar alguns campos.
http://blog.jonasbandi.net/2009/05/jaxb-quicktip-xmlgregoriancalendar.html

Bom dia, estou com problemas quando vou criar o objeto atraves do xml

Simplesmente demora muito e ocorre um erro de transmissão… fui debugando… e é exatamente nesta linha

jaxbContext = JAXBContext.newInstance(“br.gov.ans.padroes.tiss.schemas.v20102”);

O que pode ser?

Desde já agradeço

esse é todo o código

public br.gov.ans.padroes.tiss.schemas.v20102.MensagemTISS toObjetoEsquemaTISSV20102() {
if ( this.getDocumentoMensagem() == null )
return null;
JAXBContext jaxbContext;
br.gov.ans.padroes.tiss.schemas.v20102.MensagemTISS w_resp = null;
try {
jaxbContext = JAXBContext.newInstance(“br.gov.ans.padroes.tiss.schemas.v20102”);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
w_resp = (br.gov.ans.padroes.tiss.schemas.v20102.MensagemTISS) unmarshaller.unmarshal( this.documentoMensagem );
} catch (JAXBException ex) {
ex.printStackTrace();
return null;
}
return w_resp;
}

mostra a execption que ocorre!

Baixei a nova versão… 5.0

estou fazendo as mudanças necessarias… assim que fizer um teste se repetir o erro… comunico a voces

muito obrigado

Resolvido este problema baixando a nova versao…

agora estou com outro… preciso usar o endorsed… pra fazer um teste via socket… mas
to encontrando este erro

[color=red]
Exception in thread “TissNetServer” java.lang.LinkageError: JAXB 2.0 API is being loaded from the bootstrap classloader, but this RI (from jar:file:/D:/BACKUP_ARQUIVOS/TISS/TissNet5.0/lib/webservices-rt.jar!/com/sun/xml/bind/v2/model/impl/ModelBuilder.class) needs 2.1 API. Use the endorsed directory mechanism to place jaxb-api.jar in the bootstrap classloader. (See http://java.sun.com/j2se/1.5.0/docs/guide/standards/)
[/color]

se puderem ajudar, agradeço!!

baixei uma nova API e nada…

baixei a jaxb 2.1… e nao funfa… o que será que é?