O Plugin de integração com o Webhook tem como objetivo notificar aplicações externas, a partir de requisição HTTP REST, enviando informações referentes ao contexto do gatilho que foi disparado atráves de logs.
Acesse "Configuração > Integração > Credenciais" para adicionar novos registros de credenciais.
Ao Adicionar novo registro, deve ser preenchido os seguintes campos:
Campo | Descrição |
---|---|
Descrição | Campo que exibe a descrição que será associada ao registro da credencial |
Tipo de Autenticação | Campo que permite escolher a autenticação do registro da credencial |
Situação | Campo que permite ativar ou inativar o registro da credencial |
Exemplo:
Após a configuração das credenciais, acesse "Configuração > Integração > Plugin de Integração" e ative o card Webhooks
Clique em Configurar para acessar os campos de configuração dos gatilhos do plugin:
Nesta tela é possível editar/selecionar os seguintes campos:
Campo | Descrição |
---|---|
Gatilho | Permite selecionar qual momento será realizada a validação do registro, seja na sincronização manual ou automatica |
URL | Link de conexão ao Plugin webhook (Exemplo: http://{ip_do_servidor}:{PORTA}/webhook) |
Credencial | Campo selecionável que permite escolher qual credencial cadastrada no passo anterior será validado no plugin |
Timeout (s) | Campo que permite cadastrar o Tempo em segundos que o plugin ficará aguardando a conexão sem gerar timeout |
Protocolo | Campo selecoionável que permite escolher o modelo de retorno do protocolo, seja HTTP ou XML |
Botão Excluir | Permite excluir o regitro criado |
Depois da configuração e o acesso ao Plugin estar ativo, é possível realizar as sincronizações nos dispositivos operando com o webhook.
Após realizado a configuração dos pontos acima, no momento que o profissional finalizar o pedido via Android e o pedido for sincronizado automaticamente, é gerado uma requisição no Plugin Webhook e exibido no log.
Por exemplo:
Log exibido no Plugin:
Lembrando que a sincronização automática somente envia dados do aparelho ao servidor, atualmente. Portanto, ao finalizar um pedido e sincronizá-lo automaticamente, o sistema informa o webhook da alteração da entidade, porém, recebe a notificação de alteração do pedido para não finalizado através do módulo de notificação.
O usuário deverá sincronizar manualmente para receber os dados atualizados para o status não finalizado.
Já na sincronização manual, é realizado a validação de status e exibido no log da seguinte forma:
Caso a requisição demore um tempo acima da quantidade de segundos cadastrada no campo pluginintvinculos.int1, ou o retorno for mal sucedido, o sistema manda a mensagem de Falha no log do serviço executado.
Contexto / Gatilho:
Lógica:
Insere os seguintes registros na tabela pluginintegracao:
<changeSet author="systemScript" failOnError="false" id="" runOnChange="true"> <preConditions onError="HALT" onFail="MARK_RAN" onSqlOutput="IGNORE"> <customPrecondition className="com.wealthsystems.sim3g.dao.hibernate.api.liquibase.custom.precondition.RegisterExistsPrecondition"> <param name="table" value="pluginintegracao"/> <param name="column" value="codigo"/> <param name="value" value="'WEBHOOK'"/> </customPrecondition> </preConditions> <insert tableName="pluginintegracao"> <column name="IDPLUGININTEGRACAO" valueSequenceNext="SEQPKPLUGININTEGRACAO"/> <column name="CODIGO" valueComputed="'WEBHOOK'"/> <column name="IDNATIVO" valueComputed="0"/> <column name="IDNCUSTOMIZADO" valueComputed="0"/> </insert> </changeSet>
Contexto / Gatilho:
Lógica:
Insere os seguintes registros na tabela pedido:
<changeSet author="System (generated)" failOnError="false" id="" objectQuotingStrategy="LEGACY"> <addColumn tableName="Pedido"> <column defaultValue="0" name="idnProcessadoWebHook" type="byte"/> </addColumn> </changeSet>
Contexto / Gatilho:
Lógica:
Foi criado a tabela credencial, com os seguintes campos:
<changeSet author="systemScript" failOnError="false" id="" objectQuotingStrategy="LEGACY"> <createTable tableName="Credencial"> <column name="idCredencial" type="LONG"> <constraints nullable="false"/> </column> <column name="descricao" type="VARCHAR(80)"> <constraints nullable="false"/> </column> <column name="sgltipoautenticacao" type="VARCHAR(20)"> <constraints nullable="false"/> </column> <column name="usuario" type="VARCHAR(120)"/> <column name="senha" type="VARCHAR(200)"/> <column defaultValue="0" name="idnAtivo" type="byte"/> <column name="codigoerp" type="VARCHAR(80)"/> <column name="wsVersao" type="LONG"/> </createTable> </changeSet>
Contexto / Gatilho:
Lógica:
Foi criado a coluna sglagrupador, nullable, para servir de agrupamento de registros para mostrar em uma ou outra grid do mesmo plugin
O campo deve possuir índice, visto que será usado para pesquisas frequentes
<changeSet author="System (generated)" failOnError="false" id="" objectQuotingStrategy="LEGACY"> <addColumn tableName="PluginIntVinculos"> <column name="sglagrupador" type="varchar(20)"/> </addColumn> </changeSet>
Foi criado a coluna idcredencial, nullable, FK para tabela credencial
<changeSet author="System (generated)" failOnError="false" id="" objectQuotingStrategy="LEGACY"> <addColumn tableName="PluginIntVinculos"> <column name="idCredencial" type="long"/> </addColumn> </changeSet> <changeSet author="System (generated)" failOnError="false" id="" objectQuotingStrategy="LEGACY"> <addForeignKeyConstraint baseColumnNames="idCredencial" baseTableName="PluginIntVinculos" constraintName="" deferrable="false" initiallyDeferred="false" referencedColumnNames="idCredencial" referencedTableName="Credencial"/> </changeSet>
Foi criado colunas genéricas para receber colunas da grid, juntamente com suas descrições:
<changeSet author="" failOnError="false" id="" objectQuotingStrategy="LEGACY"> <addColumn tableName="PluginIntVinculos"> <column name="texto1" type="varchar(400)"/> <column name="descricaotexto1" type="varchar(40)"/> <column name="texto2" type="varchar(400)"/> <column name="descricaotexto2" type="varchar(40)"/> <column name="texto3" type="varchar(400)"/> <column name="descricaotexto3" type="varchar(40)"/> <column name="int1" type="LONG"/> <column name="descricaoint1" type="varchar(40)"/> <column name="int2" type="LONG"/> <column name="descricaoint2" type="varchar(40)"/> <column name="decimal1" type="decimal(18,6)"/> <column name="descricaodecimal1" type="varchar(40)"/> <column name="decimal2" type="decimal(18,6)"/> <column name="descricaodecimal2" type="varchar(40)"/> <column name="byte1" type="byte"/> <column name="descricaobyte1" type="varchar(40)"/> <column name="byte2" type="byte"/> <column name="descricaobyte2" type="varchar(40)"/> </addColumn> </changeSet>
Contexto / Gatilho:
Lógica:
Contexto / Gatilho:
Lógica:
Contexto / Gatilho:
Lógica:
Valor persistido | Gatilho |
---|---|
SYNC_AUTO_PEDIDO_PP | Sincronização automática de pedido finalizado |
SYNC_PEDIDO_PP | Sincronização manual de pedido finalizado |
select idcredencial as valor, descricao as descricao from credencial where idnativo = 1
Valor | Descrição | Padrão | Obs |
---|---|---|---|
2XX | HTTP Status 2XX - Sem conteúdo | X | |
CARTE | XML Pentaho Carte - Sem conteúdo | a URL exigida no modelo pentaho carte será no formato: http://host:8090/kettle/executeJob/?rep=COMMON_SERVICES&job=API_CALCULO_IRT_PLASTILIST |
Contexto / Gatilho:
Lógica:
Body
[ { "idpedido": 1, //pedido.idpedido "idusuario": 1, //pedido.idusuarioprofissional "idparceiro": 1, //pedido.idparceiro "idlocal": 2, //pedido.idlocal "idlocalcobranca": 3, //pedido.idlocalcobranca "idfilialvenda": 3, //pedido.idlocalfilialvenda "idfilialretira": 4, //pedido.idlocalfilialretirada "idfilialfaturamento": 5, //pedido.idlocalfilialfaturamento "idtipopedido": 4, //pedido.idtipopedido "idtipocobranca": 5, //pedido.idtipocobranca "idtabelapreco": 6, //pedido.idtabelapreco "idcondicaopagamento": 5, //pedido.idcondicaopagamento "idsegmento": 8, //pedido.idsegmento "idtipologia": 8, //pedido.idtipologia "idoperacao": 8, //pedido.idoperacao "idmoeda": 8, //pedido.idindexador "idtipoestoque": 8, //pedido.idtipoestoque "valortotalbruto": 8.00, //Campo "Valor total bruto do resumo" "valortotalliquido": 9.00, //Campo "Valor total liquido do resumo", "observacaopedido": "texto", //pedido.observacaopedido "observacaonotafiscal": "texto", //pedido.observacaonotafiscal "observacaosituacao": "texto", //pedido.observacaosituacao "observacaoexpedicao": "texto", //pedido.observacaoexpedicao "datapedido": "2020-01-01", //pedido.datapedido "horapedido": "08:21:00", //pedido.horapedido "datafinalizado": "2020-01-01", //pedido.datafinalizado "horafinalizado": "08:21:00", //pedido.horafinalizado "descontopedido": [ { "codigo": "8", //pedidotipodesconto.idtipodesconto > tipodesconto.codigo "percentual": 9.00, //pedidotipodesconto.percentual "valor": 10.00 //pedidotipodesconto.valor }, { "codigo": "8", //pedidotipodesconto.idtipodesconto > tipodesconto.codigo "percentual": 9.00, //pedidotipodesconto.percentual "valor": 10.00 //pedidotipodesconto.valor } ], "pedidoproduto": [ { "idpedidoproduto": 1, //pedidoproduto.idpedidoproduto "ordem": 1, //pedidoproduto.ordem "idproduto": 8, //pedidoproduto.idproduto "idembalagem": 10, //pedidoproduto.idembalagem, "quantidade": 9.00, //pedidoproduto.quantidade "precovenda": 10.00, //pedidoproduto.precovenda PS:Valor unitário "precotabela": 11.00, //pedidoproduto.precotabela PS:Valor unitário "precooriginal": 12.00, //pedidoproduto.precooriginal PS:Valor unitário "percentualdesconto": 13.00, //pedidoproduto.percentualdesconto "valordesconto": 13.00, //pedidoproduto.valordesconto PS:Valor unitário "percentualacrescimo": 13.00, //pedidoproduto.percentualacrescimo "valoracrescimo": 13.00, //pedidoproduto.valoracrescimo PS:Valor unitário "idtipopedido": 13.00, //pedidoproduto.idtipopedido "idtipoestoque": 14, //pedidoproduto.idtipoestoque "idtabelapreco": 15, //pedidoproduto.idtabelapreco }, { "idpedidoproduto": 2, //pedidoproduto.idpedidoproduto "ordem": 1, //pedidoproduto.ordem "idproduto": 8, //pedidoproduto.idproduto "idembalagem": 10, //pedidoproduto.idembalagem, "quantidade": 9.00, //pedidoproduto.quantidade "precovenda": 10.00, //pedidoproduto.precovenda PS:Valor unitário "precotabela": 11.00, //pedidoproduto.precotabela PS:Valor unitário "precooriginal": 12.00, //pedidoproduto.precooriginal PS:Valor unitário "percentualdesconto": 13.00, //pedidoproduto.percentualdesconto "valordesconto": 13.00, //pedidoproduto.valordesconto PS:Valor unitário "percentualacrescimo": 13.00, //pedidoproduto.percentualacrescimo "valoracrescimo": 13.00, //pedidoproduto.valoracrescimo PS:Valor unitário "idtipopedido": 13.00, //pedidoproduto.idtipopedido "idtipoestoque": 14, //pedidoproduto.idtipoestoque "idtabelapreco": 15, //pedidoproduto.idtabelapreco } ], "pedidoentrega": [ { "idpedidoentrega": 1, //pedidoentrega.idpedidoentrega "idtipofrete": 4, //pedidoentrega.idtipofrete "idtransportadora": 7, //pedidoentrega.idparceirotransportador "idparceiroentrega": 8, //pedidoentrega.idparceiroentrega "valorfrete": 5.00, //pedidoentrega.valorfrete "valordespesa": 6.00, //pedidoentrega.valordespesa "valorseguro": 7.00 //pedidoentrega.valorseguro }, { "idpedidoentrega": 2, //pedidoentrega.idpedidoentrega "idtipofrete": 4, //pedidoentrega.idtipofrete "idtransportadora": 7, //pedidoentrega.idparceirotransportador "idparceiroentrega": 8, //pedidoentrega.idparceiroentrega "valorfrete": 5.00, //pedidoentrega.valorfrete "valordespesa": 6.00, //pedidoentrega.valordespesa "valorseguro": 7.00 //pedidoentrega.valorseguro } ], "pedidoparcela": [ { "idpedidoparcela": 1, //pedidoentrega.idpedidoparcela "ordem": 1, //pedidoentrega.ordem "valor": 4, //pedidoentrega.valor "datavencimento": 7 //pedidoentrega.datavencimento }, { "idpedidoparcela": 2, //pedidoentrega.idpedidoparcela "ordem": 2, //pedidoentrega.ordem "valor": 4, //pedidoentrega.valor "datavencimento": 7 //pedidoentrega.datavencimento } ] }, { /* outro objeto com template acima */ }, { /* outro objeto com template acima */ } ]
Resposta esperada quando pluginintvinculos.texto3 = 'CARTE'
/* Considerando já o PARSE DA resposta do pentaho que é realizada de maneira assíncrona, retornando xml Na tag result.result-rows, o retorno será feito através de 2 campos: RETURN: string STATUS: int */ Quando bem sucedido: { "status": 200 "retorno": "" } Quando mal sucedido: { "status": ${<> 200, 201} "retorno": "Mensagem para ser anexada ao log do servidor" }
Resposta esperada quando pluginintvinculos.texto3 = '2XX'
Quando bem sucedido: http_status 2XX Body: No content Quando mal sucedido: http_status <> 2XX { "erro": "Mensagem para ser anexada ao log do servidor" }