O BrERP WSC facilita muito as requisições SOAP para os webservices do BrERP em sua aplicação java. Com uma arquitetura model oriented, não é necessário tratar o XML de request e response na mão. Com essa biblioteca podemos fazer coisas como:
- CRUD em qualquer tabela do sistema
- Trazer informações de views
- Executar o "ação do documento" em qualquer documento do BrERP
- Execução de processo
- Compatível com Android
O brerpwsc está disponível nos mais utilizados gerenciadores de dependências, e sua versão Java está publicada no sonatype, de forma que pode ser importado em qualquer projeto Maven apenas adicionando o plugin e invocando o plugin de resolução de dependencias no pom.xml:
<repositories>
<repository>
<id>oss-sonatype</id>
<name>oss-sonatype</name>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories><artifactItem>
<groupId>br.com.devcoffee</groupId>
<artifactId>brerpwsc</artifactId>
</artifactItem>Exemplo de arquivo pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.brerp</groupId>
<artifactId>exampleProject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>exampleProject</name>
<url>http://maven.apache.org</url>
<repositories>
<repository>
<id>oss-sonatype</id>
<name>oss-sonatype</name>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>br.com.devcoffee</groupId>
<artifactId>brerpwsc</artifactId>
<version>1.0.7-SNAPSHOT</version>
</artifactItem>
</artifactItems>
<outputDirectory>lib</outputDirectory>
<stripVersion>true</stripVersion>
<overWriteReleases>true</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>Dentro do pacote de testes deste repositório existe uma classe chamada CreateBPartner. Como o nome sugere, ela cria um parceiro de negócios no BrERP via webservice. Basta que você troque as informações do seu servidor/login e que configure os webservices no sistema. Abaixo, segue abaixo as configurações feitas na base de desenvolvimento, basta adaptar para sua empresa:
public class CreateBPartner {
/**
* Seta os parâmetros para login (autenticação)
* @return
*/
public static LoginRequest getLogin() {
LoginRequest login = new LoginRequest();
/**
* Substituir com as informações da sua base de dados
*/
login.setUser("superuser @ brerp.com.br");
login.setPass("developer");
login.setClientID(1000000);
login.setRoleID(1000000);
login.setWarehouseID(1000002);
login.setOrgID(1000001);
return login;
}
/**
* @return String com a url do servidor
*/
public static String getUrlBase() {
//Sbustituir com o link da sua base de dados
return "http://atemoia.devcoffee.com.br:5700";
}
/**
* Seta as configurações da conexão
* @return classe contendo os parâmetros da conexão
*/
public static WebServiceConnection getClient() {
WebServiceConnection client = new WebServiceConnection();
client.setAttempts(3);
client.setTimeout(5000);
client.setAttemptsTimeout(5000);
client.setUrl(getUrlBase());
client.setAppName("Atualizando parceiro de negócio");
return client;
}
public static void main(String[] args) {
//Cria uma operação do tipo create (vamos inserir um BP no sistema)
CreateDataRequest createBpartner = new CreateDataRequest();
createBpartner.setWebServiceType("CreateBPartner");
//Pega as informações de login
createBpartner.setLogin(getLogin());
//Passa os dados do registro a ser inserido
DataRow data = new DataRow();
data.addField("Value", "TESTING");
data.addField("Name", "Leonardo Antunes Coelho");
data.addField("Name2", "antunesleo");
data.addField("Description", "Criado por brerpwsc: " + System.currentTimeMillis());
createBpartner.setDataRow(data);
// Pega as inforamções da conexão
WebServiceConnection client = getClient();
try {
//Envia a operação, que nesse caso é um criar, e armazena a resposta enviada pelo server
StandardResponse response = client.sendRequest(createBpartner);
System.out.println("XML ENVIADO AO SERVIDOR");
client.writeRequest(System.out);
System.out.println();
System.out.println("XML DE RESPOSTA DO SERVIDOR");
client.writeResponse(System.out);
System.out.println();
// Verifica se ocorreu algum erro ao executar a operação e exibe o erro
if (response.getStatus() == WebServiceResponseStatus.Error) {
System.out.println(response.getErrorMessage());
}
System.out.println("--------------------------");
System.out.println("Web Service: CreateBPartner");
System.out.println("Attempts: " + client.getAttemptsRequest());
System.out.println("Time: " + client.getTimeRequest());
System.out.println("--------------------------");
} catch (Exception e) {
e.printStackTrace();
}
}
}XML ENVIADO AO SERVIDOR
<soapenv:Envelope xmlns:_0="http://idempiere.org/ADInterface/1_0" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<_0:createData>
<_0:ModelCRUDRequest>
<_0:ModelCRUD>
<_0:serviceType>CreateBPartner</_0:serviceType>
<_0:DataRow>
<_0:field column="Value">
<_0:val>TESTING</_0:val>
</_0:field>
<_0:field column="Name">
<_0:val>Leonardo Antunes Coelho</_0:val>
</_0:field>
<_0:field column="Name2">
<_0:val>antunesleo</_0:val>
</_0:field>
<_0:field column="Description">
<_0:val>Criado por brerpwsc: 1493050349793</_0:val>
</_0:field>
</_0:DataRow>
</_0:ModelCRUD>
<_0:ADLoginRequest>
<_0:user>superuser @ brerp.com.br</_0:user>
<_0:pass>developer</_0:pass>
<_0:ClientID>1000000</_0:ClientID>
<_0:RoleID>1000000</_0:RoleID>
<_0:OrgID>1000001</_0:OrgID>
<_0:WarehouseID>1000002</_0:WarehouseID>
</_0:ADLoginRequest>
</_0:ModelCRUDRequest>
</_0:createData>
</soapenv:Body>
</soapenv:Envelope>
XML DE RESPOSTA DO SERVIDOR
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns1:createDataResponse xmlns:ns1="http://idempiere.org/ADInterface/1_0">
<StandardResponse xmlns="http://idempiere.org/ADInterface/1_0" RecordID="5008267"/>
</ns1:createDataResponse>
</soap:Body>
</soap:Envelope>
--------------------------
Web Service: CreateBPartner
Attempts: 1
Time: 1093
--------------------------A biblioteca também é compatível para projetos nativos android. A pasta sandbox_android contem um simples projeto no android studio para demonstrar a funcionalidade, e você mesmo pode rodar! Não esquecer de configurar os webservices na sua base do BrERP! :)
Para expor os dados do brerp, nenhum código precisa ser feito. Basta que sejam feitas as configurações na janela de Segurança de Serviços Web.
Quando dizemos que os webservices são model oriented, isso quer dizer que eles são orientados a classes de modelo, então podemos entender que são orientados a tabelas do banco de dados. É claro que é possível também expor processos, que não estão vinculados a nenhuma tabela no sistema, mas na maioria das situações será seguido esse padrão. Vamos imaginar que iremos expor os dados da tabela de parceiro de negócios, para que seja uma consulta igual a demonstrado no aplicativo da seção à cima. Na janela de Serviços de Segurança Web então, devemos selecionar no campo Serviço Web que se trata de um "Model Oriented Web Services". No método de serviço web, é onde selecionamos qual a operação que queremos fazer, se é uma query (fazer uma pesquisar), insert, update, delete, rodar um processo (runProcess), etc.No nosso caso, ficaremos com a opção "Query". No campo tabela, deve ser selecionada qual a tabela a ser exposta
A janela parâmetros de Serviço Web, é uma aba filha do serviços de segurança web. Obrigatóriamente para o funcionamento do Web Service Type, eu precisso declarar três parâmetros:
- TableName, que é um tipo de parâmetro constante e atribuimos o nome da tabela do banco dados no seu valor constante
- RecordID, que é um tipo de parâmetro free, ou seja, pode ser passado qualquer valor na requisição
- Action, que é constante e contem o nome da operação. Como vamos fazer uma Query, o valor da constant é "Query". Se fosse update, seria update.
É onde passamos qual informação (coluna) será levada na requisição. Será os campos filtros da query.
São as colunas que são retornadas da operação, no nosso exemplo, as colunas que serão retornadas da query
São os perfis que tem permissão para fazer essa requisição. Lembrando que, no BrERP, toda requisição necessita ser autenticada (Login)
Segue abaixo, o print do web service configurado:
Mundo do Café S/A Admin
Na janela Segurança de Serviços web, existe um campo chamado Serviço Web, que pode ser CompositeInterface ou Model Oriented Web Services. Os model Oriented Web Services, são as requisições de fato, são o mesmo tipo do exempo à cima. O CompositeInterface serve apenas para agrupar multiplas requisições e enviar ao servidor tudo de uma vez. Ao fazer uma requisição do tipo CompositeInterface, tudo já está dentro de uma transação, estão não precisamos nos preocupar com isso. Vamos imaginar o cenário onde além de cadastrar o parceiro de negócios, gostaria de cadastrar um endereço para ele. Basta que o cliente agrupe as duas requisições dentro de um composite e siga adiante! (Temos um exemplo parecido com parceiro de negócio + imagem usando o composite dentro do projeto android aqui do repositório)
- O composite não precisa de parâmetros, não precisa de tabela, apenas libere o acesso de serviço Web para o perfil na aba e está pronto para uso!




