Sem categoria

Documentação para Código Fonte Apolo 6

Spread the love

Esse documento serve como guia para o programador utilizando a linguagem de script do software da FCA Tecnologia Apolo versão 6.

Uma das principais mudanças é que o código fontes não precisa ter um método pré determinado para ser executado. Além de poder contar com variáveis públicas, ou seja, que todos os métodos acessem. No código abaixo vemos um exemplo de código que executa o método start(), e opcionalmente pode chamar outros métodos como demoDB() e utilitarios(), além de apresentar várias funções úteis:

/**************************************
Fulvio : 22/03/2020 17:53
-Este módulo vai servir de base e documentacao para como trabalhar com processos com a nova linguagem
de Script do Apolo.
-Lembrar que agora o código fontes está na tabela sys010 (tabela de módulos), no campo fontes_javax
*/

// Agora pode-se ter variáveis públicas, reconhecidas por todo o código fonte
var n = 100;
var x = 200 + n;

/**************************************
 Todo modulo é iniciado a partir do metodo start() de forma automática, ou seja, nao precisa ser chamado no script propriamente dito.
 Podemos chamar para efeito de testes o metodo start() no proprio script, porém lembrar de comentar o mesmo quando acabar os testes.
  Para eventos chamados automaticamente como beforeEdit, beforePost etc... ainda vão existir padrões, como será visto mais a frente
*/

start();
// demoDB();
// pacoteUtil();


function start() {
    
	// Podemos acessar todas as propriedades do MainLayout chamando getMain.[PROPRIEDADE OU METODO], como no exemplo abaixo para adicionar algo ao Log Atual
	
	getMain.addToLog("Essa linha do log veio Aqui do SCRIPT!!!");
	getMain.addToLog("Valor de n: " + n + ", Valor de x: " + x);
    
	// Podemos acessar todos as propriedades e metodos do modulo atual com getModulo.[PROPRIEDADE OU METODO]
	getMain.addToLog("getModulo.getCodeETitulo(): " + getModulo.getCodeETitulo());
	getMain.addToLog("getModulo.getTipo(): " + getModulo.getTipo());
	
	// Exemplo de pegar configuracao do sistema da sys000
	getMain.addToLog("getSysConfig('FILTRO_LIMITE_BETWEEN_DIAS'): " + getMain.getObjConfig().getSysConfig("FILTRO_LIMITE_BETWEEN_DIAS"));
	
	// Exemplo de pegar configuracao do usuario da sys001
	getMain.addToLog("getSysConfigUsuario('TESTE'): " + getMain.getObjConfig().getSysConfigUsuario('TESTE'));

    getMain.exibeMsg("ERRO","Atenção","Isso é uma mensagem de erro!");
    getMain.exibeMsg("INFO","Aviso","Isso é uma mensagem de Aviso!");

    // getMain.addToLog("Exemplo de ParamUrl pegando PK:" + getModulo.getParamUrl().getPk());
    getMain.addToLog("Exemplo de funcao com parâmetro dobraValor(4): " + dobraValor(4));
    
    
    // ShowInputBox pega como argumentos Titulo, Valor default no inputBox a ser exibido, e o metodo que será chamado ao clicar no Confirmar. Esse método precisa estar no mesmo modulo.
    getModulo.showInputBox("Titulo do Input Box do Script", "Valor default do inputBox do Script","pegaRetornoInputBox()",10);
    
} // fim do metodo start()

/**************************************
 Exemplo de Funcao que pega o retorno de um dialogo modal, nesse exemplo do InputBox
 *************************************/
function pegaRetornoInputBox() {
    getMain.addToLog("Retorno do InputBox: " + getModulo.getPonteiroInputBox().getValor_digitado());
}


/**************************************
 Exemplo de Funcao com parametro e retorno
 *************************************/
function dobraValor(_valor) {
    return (_valor * 2);
}

/**************************************
 Funcoes utilitarias gerais
 *************************************/
function pacoteUtil() {
    // Limpa o Log atual
    getMain.clearLog();
    
    getMain.addToLog("quoted: " + Util.quoted("teste"));
    getMain.addToLog("doubleQuoted: " + Util.doubleQuoted("teste"));
    getMain.addToLog("Agora: " + Util.agora());
    getMain.addToLog("hoje: " + Util.hoje());
    getMain.addToLog("hojeBr: " + Util.hojeBr());
    getMain.addToLog("hojeSQL: " + Util.hojeSQL());
    getMain.addToLog("randomString: " + Util.randomString(10));
    
    getMain.addToLog("ehUltimoDiaDoMes(new Date()): " + Util.ehUltimoDiaDoMes(new Date()));
    getMain.addToLog("diaDaSemana(new Date()): " + Util.diaDaSemana(new Date()));
    getMain.addToLog("addDiasData(new Date(), 3): " + Util.addDiasData(new Date(), 3));
    getMain.addToLog("isInt(a): " + Util.isInt("a"));
    getMain.addToLog("isNumber(2): " + Util.isNumber("2"));
    
    getMain.addToLog("capitalize('teste'): "+Util.capitalize("teste"));
    var _str = "Esta Frase e um exemplo";
    getMain.addToLog("_str.substring(5,11):" + _str.substring(5,11));
    getMain.addToLog("isEmailValido('suporte@fcatec.com'): " + Util.isEmailValido("suportefcatec.com"));
    
    // var _dt = new Date();
    // getMain.addToLog("new Date(): " + _dt);
    
} // Fim do metodo pacoteUtil()

/**************************************
 Funcoes utilitarias para banco de dados
*/

function demoDB() {
    // Rodando uma consulta ao banco que so retorna um campo
    var _sql = "select count(id) from sys_tempo";    
    var _retorno = getObjDb.retornaCampodaConsulta(_sql);
	getMain.addToLog("retorno do SQL: " + _sql + " foi = " + _retorno);  
	
	// Executando um update ou um insert
	_sql = "update sys_auditoria set registro = 'TESTE' where id = 1;";
    _retorno = getObjDb.execSql(_sql);
    // Se o retorno <> "" entao deu erro
    if (_retorno !== "")
        getMain.addToLog("Houve erro no SQL: " + _sql + ", com o erro: " + _retorno);
    else
        getMain.addToLog("O SQL: " + _sql + " rodou ok.");    
        
    // Trazendo um conjunto de dados num ResultSet
    _sql = "select * from sys_auditoria order by id desc limit 10";
    var _resultSet = getObjDb.query(_sql);
    
    while (_resultSet.next()) {
        getMain.addToLog("Conteudo do campo dt_movimento: " + _resultSet.getString("dt_movimento") + ", para o ID: " + _resultSet.getInt("id"));
    }
    // Importante lembrar de fechar depois de usar para chamada de um resultSet
    _resultSet.close();
} // Fim do metodo demoDB

Processos
Abaixo temos um exemplo de um processo para criar os registros da tabela tempo:

/*
  Por Fulvio em 27/03/2020
  Exemplo de processo para criar registros na tabela tempo (sys0002)
*/

start();

// O metodo start() e o padrao a ser chamado em qualquer modulo
function start() {
	// return x;
	getMain.clearLog();

	getMain.addToLog("Comecou");

    var _tipoDia = "U";
    var _diaDaSemana = "";
    var _dt = new Date();	
    var _sql2 = "";
	var _sql = "INSERT INTO sys002 ";
    _sql += " (RECORD_NUMBER,DATA, DIA, ANO, TIPO_DIA, DIA_DA_SEMANA, E_ULTIMO_DIA_MES, DATA_INTERNA, MES, CODE_EMPRESA) values(";
    
	for (x = -3650; x < 7300; x++) {
	    _dt2 = Util.addDiasData(_dt,x);
	    _sql2 = _sql + Util.quoted(x.toString())+","+Util.quoted(Util.formataData(_dt2,"yyyy-MM-dd"))+","+Util.quoted(Util.formataData(_dt2,"dd"));
	    _tipoDia = "U";
	    _diaDaSemana = Util.diaDaSemana(_dt2);
	    if (_diaDaSemana == "7-Sábado")
	        _tipoDia = "S";
	    if (_diaDaSemana == "1-Domingo")
	        _tipoDia = "D";
	        
	    _sql2 += ","+Util.quoted(Util.formataData(_dt2,"yyyy"))+","+Util.quoted(_tipoDia)+","+Util.quoted(_diaDaSemana)+","+Util.quoted(Util.ehUltimoDiaDoMes(_dt2).toString())+","+Util.quoted(Util.formataData(_dt2,"yyyy-MM-dd"));
	    _sql2 += ","+Util.quoted(Util.formataData(_dt2,"MM")) + "," + Util.quoted("*") + ");"; 
	    getMain.addToLog("sql: " + _sql2);

/*
	    var _reto = getMain.execSql(_sql2);
	    if (_reto !== "")
	        getMain.addToLog("Erro: " + _reto + ", sql: " + _sql2);
	        */
	}
	getMain.addToLog("Terminou");
	
} // fim do metodo start()

Eventos em Scripts

São métodos com nomes padrão, disparados em determinados módulos, em determinados momentos, por exemplo:
a) Módulo do Tipo Consulta : beforeDelete() – Antes de deletar um registro, beforeInsert() – Antes de inserir um registro, beforeEdit() – Antes de editar um registro.
b) Módulo do Tipo Edição : beforePost() – Antes de salvar um registro.
Notar que esses métodos são chamados, apenas se eles existirem no código do script. Vejamos alguns códigos de exemplo:

/* 
Por Fulvio em 31/03/2020
Exemplo de Manipulação de eventos
em módulos de consulta/edição
*/

// Executado antes de confirmar insert ou update em banco de dados, apenas em módulos quando estão editando
function beforePost() {
    // getMain.clearLog();
    
    getMain.addToLog("Rodou o Before Post, dataSet State:" + getModulo.getEstadoDataSet());
    
    if (!Util.isEmailValido(getModulo.getValorCampoPorNome("LOGIN"))) {
        getModulo.setCodeRetornoScript("1"); // Para ser erro precisa ser <> 0
        getModulo.setMsgRetornoScript("O email fornecido " + getModulo.getValorCampoPorNome("LOGIN") + ", não é válido! Favor verificar!");
        return;
    }
    
    // Se esta incluindo o usuario, faz algumas rotinas padrao
    if (Util.compareStr(getModulo.getEstadoDataSet(),"INSERT")) {    
        var _sql = "select count(id)+1 from sg005 where code_empresa = " + Util.quoted(getMain.getObjConfig().getCode_empresa()) +" AND PERFIL <> " + Util.quoted("FCA");
        // getMain.addToLog("Vai inserir e o codigo sql é: " + _sql);    
        var _retorno = getObjDb.retornaCampodaConsulta(_sql);
        // getMain.addToLog("resultado do SQL: " + getMain.retornaCampodaConsulta(_sql));
        var _novocode = getMain.getObjConfig().getCode_empresa()+"."+ _retorno;
        getMain.addToLog("_novocode: " + _novocode);
        getModulo.setCampoUIPorNome("CODE_USUARIO",_novocode);
        getModulo.setCampoUIPorNome("SENHA",_novocode);
        getModulo.setCampoUIPorNome("ALTERA_SENHA","S");
        getMain.exibeMsg("INFO","Aviso","No primeiro login o usuário " + getModulo.getValorCampoPorNome("LOGIN") + " deverá entrar com a senha " + _novocode + " e criar uma nova senha pessoal !") ;
    }
    
    // Se for desabilitar no atendimento, desabilita também na gestão
    if (Util.compareStr(getModulo.getValorCampoPorNome("ATIVO"),"N")) { // Desativar também o acesso à gestão
                       
        var cUsuario = getMain.retornaCampodaConsulta("select usuario from sys_usuario where usuario = " + Util.quoted(getModulo.getValorCampoPorNome("LOGIN")));
        if (Util.compareStr(cUsuario,getModulo.getValorCampoPorNome("LOGIN"))) { // Se achou na sys_usuario
            var cSQL = "update sys_usuario set ativo = " + Util.quoted("N") + " WHERE usuario = " + Util.quoted(cUsuario);
            getObjDb.execSql(cSQL);
            getMain.exibeMsg("INFO","Aviso","O acesso ao sistema de gestão para o usuário " + cUsuario + " também foi desabilitado!");
        }
    }    
    
}  // Fim do Metodo beforePost()

// Executado antes de rodar o delete em uma tela de consulta
function beforeDelete() {
    getModulo.setCodeRetornoScript("1"); // Para ser erro precisa ser <> 0
    getModulo.setMsgRetornoScript("Foi detectado em erro ao deletar o registro! Valor PK: " + getModulo.getValue_pk());
} // Fim do Metodo beforeDelete()

// Este metodo so e carregado quando executado o modulo do tipo EDICAO
function afterLoad() {
    // 
    getMain.addToLog("Rodou o afterLoad, getModulo.getDataSetState(): " + getModulo.getEstadoDataSet());
    // getMain.exibeMsg("INFO","Aviso","Teste de atualizacao de cache!");
    
    if (getModulo.getEstadoDataSet() === "EDIT") 
        getModulo.getCampoUIPorNome("LOGIN").setEnabled(false);
    else
        getModulo.getCampoUIPorNome("LOGIN").setEnabled(true);

} // Fim do Metodo afterLoad()

// Funcao que gera o texto do email enviado aos que usam o modulo de atendimento
function geraTextoEmail() {
    var _sql = "select LOGIN, SENHA, NOME from sg005 where ID = " + Util.quoted(getModulo.getValue_pk()) + " and ativo = " + Util.quoted("S");

    
    // Trazendo um conjunto de dados num ResultSet
    var _resultSet = getObjDb.resultSet(_sql);
    // getMain.addToLog("Sql Texto Email: " + _sql + ", linhas ResultSet " + getMain.linhasResultSet(_resultSet));
    
    if (getMain.linhasResultSet(_resultSet) == 0) {
          // app.exibeMsg("E-mail de cadastro não foi encontrado!", "ERRO");
          getModulo.setCodeRetornoScript("1"); // Para ser erro precisa ser <> 01
          getModulo.setMsgRetornoScript("O usuário selecionado, não foi encontrado, ou não está ativo! Favor verificar!");          
          return;
    }        
        
    _resultSet.first();
        //getMain.addToLog("Conteudo do campo dt_movimento: " + _resultSet.getString("dt_movimento") + ", para o ID: " + _resultSet.getInt("id"));
    var cLOGIN = _resultSet.getString("LOGIN");
    var cSENHA = _resultSet.getString("SENHA");
    var cNOME = _resultSet.getString("NOME");
    
    // Importante lembrar de fechar depois de usar para chamada de um resultSet
    _resultSet.close();    
    
    var cTexto = "Prezado(a) " + cNOME + ";<BR>";
    cTexto = cTexto + " Cadastramos o seu usuário para acesso ao FIFO - Fila Fácil Online. " + "<BR>";    
    cTexto = cTexto + " Copie o link abaixo ou clique para ter acesso ao sistema: <BR>";
    cTexto = cTexto + " https://app.fcatec.com/fifo2?ambiente=fifo&amp;login=" + "<BR>";
    cTexto = cTexto + " Seu usuário é: " + cLOGIN + "<BR>";
    cTexto = cTexto + " Sua senha inicial é: (CONSULTE SEU GESTOR)" + "<BR>";
    cTexto = cTexto + " Você pode salvar este link em seus favoritos para facilitar o acesso no futuro.<BR>";
    cTexto = cTexto + " Após o primeiro login será solicitado uma nova senha para cadastro. <BR>";
    cTexto = cTexto + " Após efetuar o procedimento da troca, acesse novamente o mesmo link acima, agora informando a nova senha. <BR><BR>";
    cTexto = cTexto + " Atenciosamente...<BR><BR>";
    cTexto = cTexto + " Equipe do Suporte Técnico do FiFO<BR>";
    cTexto = cTexto + " http://www.fcatec.com/fifo - suporte@fcatec.com - (81)3265-0332/97100-1500<BR>";
  
    getMain.exibeMsg("INFO","Copie e Envie o Texto abaixo",cTexto);   
} // fi