paulosscruz / senior-g5-php
Gerador de classes para utilizar o Web Service G5 do ERP Senior.
Requires
- php: ^7.2
- ext-json: *
- ext-soap: *
- wsdl2phpgenerator/wsdl2phpgenerator: ^3.4
Requires (Dev)
None
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Esta biblioteca mapeia os serviços da tecnologia G5 da Senior em um conjunto de classes PHP.
Instalação
Adicione senior-g5-php no seu projeto via Composer:
composer require paulosscruz/senior-g5-php
Suporte
Atualmente, esta biblioteca suporta todos os serviços da tecnologia G5 disponíveis na documentação oficial da Senior.
| Versão | Sistema | Suporte |
|---|---|---|
| 5.8.10 | ERP Senior | SIM |
| 5.8.11 | ERP Senior | SIM |
| 5.10.1 | ERP Senior | SIM |
| 6.2.33 | VetoRH | SIM |
| 6.2.34 | VetoRH | SIM |
| 6.2.35 | VetoRH | SIM |
Como funciona
Após o mapear o WSDL do serviço, será gerada uma classe principal que conterá um método para cada porta disponível, juntamente com um conjunto auxiliar de classes que mapeia todos os atributos de entrada e saída de suas respectivas portas.
Para isso, é necessário obter o WSDL do serviço que sera mapeado, você pode encontra-lo na documentação oficial da Senior.
Você utilizará o comando generator via prompt para mapear o WSDL, abaixo a lista de argumentos disponíveis:
| Argumento | Descrição | Obrigatório? |
|---|---|---|
--wsdl |
URL WSDL do serviço (Disponível na documentação oficial da Senior). | SIM |
--serviceName |
Nome do serviço (Este será o nome da classe principal). | SIM |
--outputDir |
Diretório onde as classes geradas serão armazenadas (Por padrão, será criado um diretório adional a partir daqui para cada serviço mapeado). | SIM |
--operationNames |
Alguns serviços possuem muitas portas diferentes ou versões de uma mesma porta, portanto, aqui você pode especificar quais dessas portas você deseja mapear. | NÃO |
--namespace |
Especificar o namespace das classes que serão geradas, se não for informado as classes não terão um namespace. | NÃO |
Neste exemplo, vamos utilizar o serviço com.senior.g5.co.ger.cad.clientes que possue várias portas, entre elas obterCliente que é capaz de obter o cadastro de um cliente especifico.
Mapeando o WSDL
# php vendor/paulosscruz/senior-g5-php/bin/generator --wsdl http://example.com/g5-senior-services/sapiens_Synccom_senior_g5_co_ger_cad_clientes?wsdl --serviceName Clientes --outputDir senior/services
ATENÇÃO: Lembre-se de executar este comando na raiz do seu projeto.
As classes serão geradas no diretório senior/services/Clientes, lembrando que a biblioteca sempre cria um diretório adicional a partir de outputDir, para separar as classes por serviço e evitar problemas de duplicidade.
Neste caso, teremos a classe Clientes.php com todos os métodos que representam as portas disponíveis neste serviço. O método obterClientes possui a seguinte assinatura:
/** * @param string $user * @param string $password * @param int $encryption * @param clientesobterClienteIn $parameters * @return clientesobterClienteOut */ public function obterCliente($user, $password, $encryption, clientesobterClienteIn $parameters) { // }
As classes
clientesobterClienteIneclientesobterClienteOutsão geradas automaticamente para mapear os atributos de entrada e saída da requisição.
Observação: Essas classes são nomeadas de acordo com o Stub dos Web Services da Senior, portanto, muitas vezes seu nome pode ser pouco conveniente ou longo demais. Estou trabalhando para melhorar isso.
Agora, basta utilizar a classe principal para acessar o Web Service G5 da Senior, como no exemplo abaixo:
require_once ('./senior/services/Clientes/autoload.php'); $usuarioErp = 'teste'; $senhaErp = '123456'; $tipoCriptografia = 0; $parametros = new clientesobterClienteIn(); $parametros->setCodigoEmpresa(1) ->setCodigoFilial(1) ->setCodigoCliente(10); $cliente = new Clientes(); $retorno = $cliente->obterCliente($usuarioErp, $senhaErp, $tipoCriptografia, $parametros); /* O retorno é um objeto do tipo clientesobterClienteOut conforme assinatura do método */ echo $cliente->getNomeCliente(); echo $cliente->getSaldoDuplicatas();
Observação: Cada serviço terá em seu diretório um arquivo
autoload.phpresponsável por mapear e incluir a classe principal e as auxiliares automaticamente.
Mapeando portas especificas do WSDL
Alguns serviços possuem muitas portas diferentes ou versões de uma mesma porta. Utilizando o argumento --operationNames ao mapear o WSDL, você pode filtrar as portas que deseja mapear e evitar trabalho e código desnecessário.
# php vendor/paulosscruz/senior-g5-php/bin/generator --wsdl http://example.com/g5-senior-services/sapiens_Synccom_senior_g5_co_ger_cad_clientes?wsdl --serviceName Clientes --outputDir senior/services --operationNames obterCliente
Para mapear mais de uma porta, basta passar uma lista com todas separadas por uma vírgula e entre aspas.
# php vendor/paulosscruz/senior-g5-php/bin/generator --wsdl http://example.com/g5-senior-services/sapiens_Synccom_senior_g5_co_ger_cad_clientes?wsdl --serviceName Clientes --outputDir senior/services --operationNames "obterCliente, ExcluirClientes, GravarClientes_5"
Trabalhando com namespaces
Para especificar o namespace das classes que serão geradas, você deve utilizar o argumento --namespace ao mapear o WSDL.
# php vendor/paulosscruz/senior-g5-php/bin/generator --wsdl http://example.com/g5-senior-services/sapiens_Synccom_senior_g5_co_ger_cad_clientes?wsdl --serviceName Clientes --outputDir senior/services --namespace Senior\Services\Clientes
Agora, você pode trabalhar utilizando os namespaces do PHP.
require_once ('./services/Clientes/autoload.php'); use Senior\Services\Clientes\Clientes; use Senior\Services\Clientes\clientesobterClienteIn as ObterClientesIn; use Senior\Services\Clientes\clientesobterClienteOut as ObterClientesOut; $usuarioErp = 'teste'; $senhaErp = '123456'; $tipoCriptografia = 0; $parametros = (new ObterClientesIn()) ->setCodigoEmpresa(1) ->setCodigoFilial(1) ->setCodigoCliente(10); $cliente = (new Clientes()) ->obterCliente($usuarioErp, $senhaErp, $tipoCriptografia, $parametros); /* O retorno é um objeto do tipo clientesobterClienteOut conforme assinatura do método */ echo $cliente->getNomeCliente(); echo $cliente->getSaldoDuplicatas();
Observação: Considere criar namespaces indepentes para cada serviço, evitando problemas com duplicidade.
Limitações
Por padrão a classe principal mantém o endereço do Web Service fixo em sua implementação, portanto, sempre que você houver alterações no endereço onde o seu servidor de aplicação (Glassfish) fica hospedado, você deverá mapear novamente todos os serviços utilizados.
Alternativa
Se você reparar na implementação da classe principal, vai ver que o seu construtor possui alguns parâmetros que podem ser passados opcionalmente.
/** * @param array $options A array of config values * @param string $wsdl The wsdl file to use */ public function __construct(array $options = array(), $wsdl = null) { // }
Sugiro que você realize uma implementação adicional em sua aplicação e crie uma configuração baseada em arquivo ou classe para armazenar o endereço de todos os serviços utilizados.
Após isso, basta passar o endereço sempre que a classe principal for instanciada.
require_once ('./senior/services/Clientes/autoload.php'); $usuarioErp = 'teste'; $senhaErp = '123456'; $tipoCriptografia = 0; $parametros = new clientesobterClienteIn(); $parametros->setCodigoEmpresa(1) ->setCodigoFilial(1) ->setCodigoCliente(10); $cliente = new Clientes([], WSDL::CLIENTES); $retorno = $cliente->obterCliente($usuarioErp, $senhaErp, $tipoCriptografia, $parametros); /* O retorno é um objeto do tipo clientesobterClienteOut conforme assinatura do método */ echo $cliente->getNomeCliente(); echo $cliente->getSaldoDuplicatas();
Créditos
Licença
senior-g5-php está licenciado sob a MIT License.