SamDev - Interceptador

Ultima Revisão: 01/01/2020

                                                                                  Conceito

Scripts do Interceptador: São scripts que serão aplicados a tabela indicada toda vez que houver uma operação de inclusão, alteração ou exclusão de seus registros no banco de dados, ou seja, toda vez que houver uma operação de inclusão, alteração ou exclusão, antes de se consolidar a operação no banco de dados, o interceptador irá executar o script informado para a tal tabela.

Este mecanismo dá ao usuário a liberdade de, ao afetar a base de dados, realizar duas operações:

1 - Interferir nos dados: Modificar os dados do registro que está sendo incluído ou alterado, ou interromper a operação que esta sendo realizada no banco de dados.

2 - Realizar operações administrativas: Ao afetar a base de dados, realizar alguma operação administrativa como por exemplo o envio de um eMail a alguém ou lançar em alguma tabela uma dada informação.

                                                                                  Exemplo

O script abaixo irá interceptar a gravação de uma CGS0160 - Operação e, atendida a uma dada condição, irá modificar o cadastro da operação e lançar no CGS0120 - Repositório de Dados um novo lançamento com o objetivo de exibir tal lançamento no CAS0280 - Painel do usuário:

1 - Estrutura da tabela de operações (Abb10):

      Ordem   Tp     Tam   Req    Nome            Descrição                   
      1       L      9,0    S     abb10id         Identificador
      2       S      6,0    S     abb10codigo     Código
      3       S     60,0    N     abb10descr      Descrição
      4       I      2,0    N     abb10tipoCod    Tipo da operação
      5       S     20,0    N     abb10tipoDescr  Descrição do tipo da operação

2 - Estrutura da tabela de Repositório de Dados (Aba20 e Aba2001):

     Ordem   Tp     Tam   Req    Nome             Descrição                   
      1       L      9,0    S     aba20id         Identificador
      2       S     20,0    S     aba20codigo     Código
      3       S     50,0    N     aba20descr      Descrição

     Ordem   Tp     Tam   Req    Nome             Descrição                   
      1       L      9,0     S    aba2001id       Identificador
      2       L      9,0     S    aba2001rd       Repositório de dados
      3       I      4,0     S    aba2001lcto     Número do lançamento
      4       S     20,0     N    aba2001prop     Propósito
      5       L      9,0     N    aba2001user     Id do Usuário -> Aab10
      11      J      0,0     N    aba2001json     Campos livres

3 - Condição e Intervenção nos Dados: Se ao gravar uma operação, o usuário não informar o 'Tipo da Operação' o interceptador deverá arbitrar:

no 'Código do tipo da operação' o valor '01',
na 'Descrição do tipo da operação' o termo 'Interceptador'.

4  -  Realizar Operações Administrativas: Encontrar um repositório com o nome 'PAINEL', e encontrando, incluir um novo lançamento informando:

em propósito o termo 'Cadastro de Operação',
no usuário o 'Nome do usuário logado',
na mensagem o texto 'O usuário xxx em dd/mm/aaaa as hh:mm não informou o tipo da operação', e,
na data a 'Data do Sistema Operacional'.

5 - Script do interceptador: Código '.interceptor' escrito no CAS4011 - SamDev para a tabela 'Abb10 - Operação'.

package multitec.interceptor;

import java.util.List;
import br.com.multiorm.ColumnType;
import br.com.multiorm.ORMInterceptor;
import br.com.multiorm.Query;
import br.com.multiorm.Session;
import br.com.multiorm.criteria.criterion.Criterions;
import sam.model.entities.ab.Aba20;
import sam.model.entities.ab.Aba2001;
import sam.model.entities.ab.Abb10;
import sam.model.entities.aa.Aab10;
import br.com.multitec.utils.collections.TableMap;
import sam.server.samdev.utils.InterceptadorUtils;

public class Abb10Interceptador implements ORMInterceptor{

    InterceptadorUtils interceptadorUtils = new InterceptadorUtils();

    public Class getEntityClass() {
        return Abb10.class;
    }

    /**
     * Ação 1 - Ao gravar uma operação, se o usuário não informar o 'Tipo da Operação' (abb10tipoCod)
     * o interceptador irá arbitrar o código '01' e na 'Descrição do tipo da operação' (abb10tipoDescr)
     * o termo 'Interceptador'.
     *
     * Ação 2 - Encontrar um repositório com o nome (aba20codigo) 'PAINEL', e encontrando, incluir um novo
     * lançamento (aba2001lcto) informando em propósito (aba2001prop) o termo 'Cadastro de Operação', e na
     * mensagem (aba2001json, campo "texto") o texto 'O usuário nomeUsuarioLogado em dd/mm/aaaa as hh:mm não
     * informou o tipo da operação'.
     */

  
    public void prePersist(sam.model.entities.ab.Abb10 entity, Session s) {
        if(entity.getAbb10tipoCod() == null) {
            //Intervindo nos dados (Ação 1)
            entity.setAbb10tipoCod(01);
            entity.setAbb10tipoDescr("Interceptador");

            //Realizando uma operação administrativa (Ação 2). Leitura do repositório (tabela Aba20) denominado 'PAINEL'
            Aba20 aba20 = s.createCriteria(Aba20.class)
                           .addWhere(Criterions.eq("aba20codigo", "PAINEL"))
                           .get();

            if(aba20 != null) {
                 //Repositório 'PAINEL' encontrado
                 def data = new Date();
                 Aab10 aab10 = interceptadorUtils.usuario();

                 //Composição da mensagem
                def msg = "O usuário " + aab10.aab10user + " em " + data.dateString + " as " +
                           data.timeString + " não informou o tipo da operação";

             //Obter o último lançamento feito no repositório 'PAINEL'
                Query query = s.createQuery("SELECT MAX(aba2001lcto) FROM Aba2001 WHERE Aba2001rd = :idAb20");
                query.setParameter("idAb20", aba20.getAba20id());
                def lcto = query.getUniqueResult(ColumnType.INTEGER);

                //Criando um novo lançamento
                Aba2001 aba2001 = new Aba2001();
                aba2001.setAba2001rd(aba20);
                aba2001.setAba2001lcto(lcto == null ? 0 : lcto + 1);  //Lançamento
                aba2001.setAba2001prop("Cadastro de Operação");       //Propósito
                aba2001.setAba2001user(aab10);                        //Usuário

                //Campos json do novo lançamento
                TableMap mapJson = new TableMap();
                mapJson.put("texto", msg);
                mapJson.put("data", data.format("yyyyMMdd"));
                aba2001.setAba2001json(mapJson);
                s.persist(aba2001);
            }
        }
    }
    public void preDelete(List ids, Session s) {
    }
}

6 - SQL do painel:  Instruir o CAS0280 - Painel a ler no repositório de dados o código 'PAINEL' e exibir as mensagens lá contida no campo 'texto':

Usuário: Master
Mensagem: Interceptador: $1
SQL de Consulta: SELECT aba2001json ->> 'texto' FROM Aba2001 INNER JOIN Aba20 ON aba20id = aba2001rd WHERE aba20codigo = 'PAINEL' AND aba20gc $gc(aba20)$