[CIGAM] - Alertas via Procedure
Faz algum tempo, venho comentando com alguns colegas de trabalho sobre como seria útil enviar mensagens para os usuários do CIGAM através do cadastro de alertas via rotinas do banco de dados.
Dentre as possibilidades imaginadas, poderia servir por exemplo, para informar ao usuário que seu banco de dados Oracle-XE está chegando muito próximo do seu limite de utilização de 4GB. Ou ainda que faltam X dias para a licença de demonstração do CIGAM expirar. Talvez também alguma informação de negócio, como que determinado cliente estourou seu limite de compra. Ou que o estoque mínimo de certo material foi atingido.
As possibilidades são muitas, mas hoje surgiu uma real, que motivou a implementação deste recurso. O usuário gostaria de ser informado se fosse digitado algum pedido para algum cliente que não tivésse um email cadastrado, pois agora, com a Nota Fiscal Eletrônica, esta informação é obrigatória.
A partir daí a primeira coisa que fiz foi criar a procedure que cadastra o Alerta, da seguinte forma:
CREATE OR REPLACE PROCEDURE cgpr_utl_criaalerta
(v_assunto VARCHAR2 DEFAULT 'TESTE',
v_cd_usu_aviso VARCHAR2 DEFAULT 'SQL',
v_dt_previsao_ini DATE DEFAULT trunc(SYSDATE),
v_hr_previsao_ini VARCHAR2 DEFAULT to_char(SYSDATE,'HH24MISS'),
v_dt_aviso DATE DEFAULT trunc(SYSDATE),
v_hr_aviso VARCHAR2 DEFAULT to_char(SYSDATE+10/24/60/60,'HH24MISS'), --10 segundos
v_concluido VARCHAR2 DEFAULT 'N',
v_categoria VARCHAR2 DEFAULT ' ',
v_tipo_registro VARCHAR2 DEFAULT ' ',
v_embar_pedido_oc VARCHAR2 DEFAULT ' ',
v_cont_os_lanc_nf INTEGER DEFAULT 0,
v_sequencia_item INTEGER DEFAULT 0,
v_empresa_acomp VARCHAR2 DEFAULT ' ',
v_usu_criacao VARCHAR2 DEFAULT 'SQL',
v_dt_criacao DATE DEFAULT trunc(SYSDATE),
v_hr_criacao VARCHAR2 DEFAULT to_char(SYSDATE,'HH24MISS'),
v_sessao INTEGER DEFAULT 0,
v_usu_modificacao VARCHAR2 DEFAULT ' ',
v_dt_modificacao DATE DEFAULT NULL,
v_tempo_calculado NUMBER DEFAULT 0)
IS
BEGIN
INSERT INTO gealerta
VALUES (cg_fc_ultid(' ',280),
v_dt_previsao_ini,
v_hr_previsao_ini,
v_dt_aviso,
v_hr_aviso,
v_cd_usu_aviso,
v_concluido,
v_categoria,
v_assunto,
v_tipo_registro,
v_embar_pedido_oc,
v_cont_os_lanc_nf,
v_sequencia_item,
v_empresa_acomp,
v_usu_criacao,
v_dt_criacao,
v_hr_criacao,
v_sessao,
v_usu_modificacao,
v_dt_modificacao,
v_tempo_calculado,
NULL,
NULL,
NULL,
NULL,
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
' ',
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
' ',
NULL,
0);
END cgpr_utl_criaalerta;
Depois disso precisei criar a trigger, que chama a procedure que cria o alerta, caso o cliente não possua email cadastrado. Ela ficou assim:
CREATE OR REPLACE TRIGGER cgtr_validacontatozeroped_i
BEFORE INSERT ON fapedido
FOR EACH ROW
/*CIGAM-MOVIMENTOS:
Criar trigger para que ao digitar um pedido para um cliente e o mesmo não possua
o contato zero preenchido (sem email), a trigger crie um Alerta CIGAM para o
usuário que está digitando o pedido e também para as usuárias Marlete e Angela.
Mensagem a ser usada no Alerta:
O cliente (nome do cliente) deste pedido (nr_pedido) não possui email para envio
da NF eletrônica, por favor, informe o email no ?Acompanhamento? do pedido.
O email é obrigatório para a emissão da Nota Eletrônica.
*/
DECLARE
v_temcontatozero INTEGER;
v_email vecempre.email%TYPE;
v_nomecliente geempres.nome_completo%TYPE;
v_mensagem gealerta.assunto%TYPE;
BEGIN
/*Verifico se possue contato zero */
SELECT count(sequencia_conta)
INTO v_temcontatozero
FROM vecempre
WHERE trim(cd_empresa) = trim(:new.cd_cliente)
AND sequencia_conta = 0;
/*Se tem contato zero verifico se possui email cadastrado*/
IF v_temcontatozero > 0 THEN
SELECT email
INTO v_email
FROM vecempre
WHERE trim(cd_empresa) = trim(:new.cd_cliente)
AND sequencia_conta = 0;
END IF;
/*Busco nome do cliente para informar na mensagem*/
SELECT trim(nome_completo)
INTO v_nomecliente
FROM geempres
WHERE trim(cd_empresa) = trim(:new.cd_cliente);
/*Se não tiver contato ou tiver mas o email estiver em branco...*/
IF v_temcontatozero = 0
OR (v_temcontatozero > 0
AND (v_email = ' '
OR v_email IS NULL)) THEN
/*Monta a mensagem para enviar o alerta.*/
v_mensagem := 'O Cliente '
||trim(v_nomecliente)
||' informado no pedido '
||trim(:new.cd_pedido)
||' não possui email para envio da NF eletrônica, '
||' por favor, informe o email no "Acompanhamento" do pedido.'
||' O email é obrigatório para a emissão da Nota Fiscal Eletrônica.';
/*Envia a mensagem para o usuário que está cadastrando o pedido*/
cgpr_utl_criaalerta(v_mensagem,:new.usuario_criacao);
/*Envia a mensagem aos responsáveis pelo cadastro*/
cgpr_utl_criaalerta(v_mensagem,'ANG');
cgpr_utl_criaalerta(v_mensagem,'MAR');
ELSIF v_temcontatozero > 0
AND instr(v_email,'@') <= 1 THEN
/*Se tiver contato zero, porém o email estiver inválido (mal formado)
exibe a mensagem abaixo...
*/
v_mensagem := 'O Cliente '
||trim(v_nomecliente)
||' informado no pedido '
||trim(:new.cd_pedido)
||' possui o email "'
||v_email
||'" que parece ser inválido. '
||' Por favor, informe o email correto no "Acompanhamento" do pedido.'
||' O email é obrigatório para a emissão da Nota Fiscal Eletrônica.';
/*Envia a mensagem para o usuário que está cadastrando o pedido*/
cgpr_utl_criaalerta(v_mensagem,:new.usuario_criacao);
/*Envia a mensagem aos responsáveis pelo cadastro*/
cgpr_utl_criaalerta(v_mensagem,'ANG');
cgpr_utl_criaalerta(v_mensagem,'MAR');
END IF;
END cgtr_validacontatozeroped_i;
Ao ativar esta trigger na base, cada vez que um pedido novo é criado, com um cliente que não possue e-mail informado no contato zero (0), é disparado um alerta na tela do CIGAM para o usuário informando do problema. e ainda para outros 2 usuários responsáveis pelo cadastro. Como podemos conferir abaixo:
A partir daí podemos complementar esta procedure para outras formas de envio, como para todos, para grupos, etc. E para situações como as apresentadas no começo. Vamos agora abusar deste simples mas muito útil recurso.
Estou concluindo também a procedure em versão MSSQL. Vou postá-la na sequência aqui no Blog.
Comentem e dêem suas sugestões para utilização desta rotina no CIGAM...
Comentários