Uso

Para iniciar um gatilho você deve executar uma query, indicando qual gatilho mestre [Menu: Gatilhos > Mestre] deve ser executado, ex:

SELECT '{NFeStatus}' as "{trigger}"

No exemplo acima executaremos o Gatilho Escravo [Menu: Gatilhos > Escravos] de consulta de status da SEFAZ, que deverá conter uma query semelhante ao exemplo abaixo:

SELECT 
'' as "{/consStatServ}",
'http://www.portalfiscal.inf.br/nfe' as "{/consStatServ/xmlns}", 
'2.00' as "{/consStatServ/versao}",
'2' as "{/consStatServ/tpAmb}",
'35' as "{/consStatServ/cUF}",
'STATUS' as "{/consStatServ/xServ}"

Normalmente na aba “Ao receber da SEFAZ” você fará os primeiros tratamentos dos dados retornados pela SEFAZ, este tratamento é bem simplificado, como no exemplo abaixo:

-- executa sempre
UPDATE parametros SET valor='{/retConsStatServ/dhRecbto}' WHERE parametro='sefaz.consulta';

repro.if({/retConsStatServ/cStat}=107)
-- tudo ok
UPDATE parametros SET valor='{/retConsStatServ/cStat} - {/retConsStatServ/xMotivo}' WHERE parametro='sefaz.situacao';

repro.new(dml)
-- tudo ok + outro DML

repro.if({/retConsStatServ/cStat}=252)    
-- problema de ambiente

repro.if(else)
-- exceção

Os Gatilhos Escravos são responsáveis por fazer todos os procedimentos de manipulação de dados na sua base de dados. Nas query’s você deve descrever o XPath do XML para que seja retornado o valor do mesmo. 

Para testarmos nosso gatilho iremos em [Menu: Gatilhos > Testes], clique no botão [Iniciar Configs.] para carregar a configuração na memória e após o [OK] clique em [Inicia Processo]. Se tudo estiver correto o RePro irá lhe retornar um XML semelhante ao abaixo:

<retConsStatServ versao="2.00" xmlns="http://www.portalfiscal.inf.br/nfe">
  <tpAmb>2</tpAmb>
  <verAplic>SP_NFE_PL_006j</verAplic>
  <cStat>107</cStat>
  <xMotivo>Serviço em Operação</xMotivo>
  <cUF>35</cUF>
  <dhRecbto>2012-11-13T16:32:56</dhRecbto>
  <tMed>1</tMed>
</retConsStatServ>

E, na aba SQL Pós Gatilho:

-- executa sempre
UPDATE parametros SET valor='2012-11-13T16:41:01' WHERE parametro='sefaz.consulta';
-- tudo ok
UPDATE parametros SET valor='107 - Serviço em Operação' WHERE parametro='sefaz.situacao';

-- tudo ok + outro DML

Os Gatilhos Dinâmicos somente podem ser executados como gatilhos auxiliares dos Gatilhos Escravos dentro da aba "Query do Gatilho".

Uso de variáveis

A síntese é bem simples, consiste em criar uma variável [Menu: Ferramentas > Variáveis] e depois fazer a referência dentro da Query. No exemplo abaixo supomos que criamos duas variáveis (idNFe e CodCliente) que conterão o ID do registro dos dados da NF-e e o código do cadastro do cliente. No Gatilho Mestre executaremos o gatilho {NFeDados} que é o gatilho responsável pela criação do XML com os dados da NF-e, e, que por sua vez executará um Gatilho Dinâmico chamado {DadosCliente}:

Gatilho Mestre:

SELECT 
id_nf_saida as "{@idNFe}", 
'{NFeDados}' as "{trigger}"
FROM nome_da_tabela 
WHERE ... 

Gatilho Escravo {NFeDados}:

SELECT 
0 as "{/NFe}",
'http://www.portalfiscal.inf.br/nfe' as "{/NFe/xmlns}", 
0 as "{/NFe/infNFe}",
'2.00' as "{/NFe/infNFe/versao}",
'NFe{?NFe.ChaveNFe?}' as "{/NFe/infNFe/Id}",
0 as "{/NFe/infNFe/ide}",
'35' as "{/NFe/infNFe/ide/cUF}" , 
(...)
a.cod_cliente as "{@CodCliente}", 
'DadosCliente' as "{trigger}", 
CASE WHEN tipo_nota='A' THEN 'NFeItensAutomatico' ELSE 'NFeItensManual' END as "{trigger}", 
(...)
'' as "{/NFe/infNFe/infAdic}", 
a.observacoes_fisco as "{/NFe/infNFe/infAdic/infAdFisco}", 
a.observacoes as "{/NFe/infNFe/infAdic/infCpl}" 
FROM nf_saida a 
LEFT JOIN naturezas_operacao c ON c.cfop = a.cfop 
WHERE a.id_nf_saida={@idNFe}

Gatilho Dinâmico {DadosCliente}:

SELECT -- Destinatario
'' as "{/NFe/infNFe/dest}", /*
CASE WHEN length(cgc_cpf) = 14 THEN cgc_cpf ELSE NULL END as "{/NFe/infNFe/dest/CNPJ}", 
CASE WHEN length(cgc_cpf) = 11 THEN cgc_cpf ELSE NULL END as "{/NFe/infNFe/dest/CPF}", 
cliente as "{/NFe/infNFe/dest/xNome}", */
'99999999000191' as "{/NFe/infNFe/dest/CNPJ}", 
'NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL' as "{/NFe/infNFe/dest/xNome}",
-- Destinatario.endereco
'' as "{/NFe/infNFe/dest/enderDest}",
endereco as "{/NFe/infNFe/dest/enderDest/xLgr}",
numero as "{/NFe/infNFe/dest/enderDest/nro}",
bairro as "{/NFe/infNFe/dest/enderDest/xBairro}",
cod_ibge as "{/NFe/infNFe/dest/enderDest/cMun}",
cidade as "{/NFe/infNFe/dest/enderDest/xMun}",
uf as "{/NFe/infNFe/dest/enderDest/UF}",
replace(cep,'-','') as "{/NFe/infNFe/dest/enderDest/CEP}",
'1058' as "{/NFe/infNFe/dest/enderDest/cPais}",
'BRASIL' as "{/NFe/infNFe/dest/enderDest/xPais}",
replace(telefone_ddd || telefone,'-','') as "{/NFe/infNFe/dest/enderDest/fone}",
CASE WHEN inscr_est='' THEN 'ISENTO' ELSE replace(inscr_est,'.','') END as "{/NFe/infNFe/dest/IE}" 
FROM clientes 
WHERE cod_cliente={@CodCliente}

Qualquer dúvida entre em nossa lista de discussão, que teremos o prazer em lhe ajudar.

Last edited Nov 13, 2012 at 6:13 PM by BredRick, version 2

Comments

No comments yet.