Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

EntryPoints Insert e Update

Definição e campos da tabela

Na tabela de EntryPoint nfs_entry_point temos os seguintes campos:

  • FILE_OR_DOMAIN: Local onde o EntryPoint vai ser usado, sendo:
    • XMOVA - Utilizado para enviar dados para o mobile;
    • SYSTEM - Utilizado dentro do portal NFS;
  • ACTION: Nome do EntryPoint;
  • XMOVA_INSTALLCODE - Número do fluxo (código de instalação) para utilização com XMOVA;
  • TABELA: Tabela onde o EntryPoint vai ser executado;
  • ENTRY_NUM: Número para definir a ordem/forma de execução do EntryCode (estilo uma trigger);
  • CODE: Código do EntryPoint (PHP, SQL);
  • CODETYPE: Define o tipo de linguagem que será usado no campo CODE.

Número dos EntryPoints

Os números vão no campo ENTRY_NUM e servem para definir a forma da execução.

18 - Before Insert

Código a ser configurado para executar ANTES do INSERT na tabela correspondente. Geralmente utilizado para adicionar/complementar dados ao insert, realizar cálculos, etc.. Nas versões antigas do NFS o código utilizado era 30.

Variáveis Disponíveis

  • inputValues
  • tableName
  • tableObject

Variáveis Antigas

  • valores, outputValues -> inputValues na versão atual;
  • nomeTabela -> tableName na versão atual.

191 - After Insert (antigo 19)

Código a ser configurado para executar DEPOIS do INSERT na tabela correspondente. Geralmente utilizado para adicionar um valor em outra tabela que precisa de uma referência na tabela que o EntryPoint está executando.

Nas versões antigas do NFS o código utilizado era 19.

Variáveis Disponíveis

  • inputValues
  • lastInsertId
  • tableObject
  • tableName
  • tBO

Variáveis Antigas

  • valores -> inputValues na versão atual;
  • _lastInsertId -> lastInsertId na versão atual;
  • tabela_par -> tableName na versão atual.

20 - Before Update

Código a ser configurado para executar ANTES do UPDATE na tabela correspondente.

Variáveis

1 - inputValues:

Valores que foram enviados para update no sistema:

$this->inputValues;
/**
* Tipo: Array
* Exemplo de saída: [["SEQ_DB" => 9999, "CAMPO" => valorCampo]]
*/
2 - outputValues

Contem os mesmo valores descritos na $inputValues, caso precise modificar os valores enviados pelo formulario, esta variavel deverá ser modificada:

$this->outputValues;
/**
* Tipo: Array
* Exemplo de aplicação: $this->outputValues['CAMPO'] = novoValorCampo;
*/
3 - tableName

Nome da tabela para qual o EntryPoint foi configurado:

$this->tableName;
/**
* Tipo: String
* Exemplo de saída: "ENCARREGADO"
*/
4 - rowValues

Valores do registro no banco:

$this->rowValues;
/**
* Tipo: Array
* Exemplo de saída: [["SEQ_DB" => 9999, "CAMPO" => valorCampo]]
*/

[!WARNING] Caso a tabela seja ALERTS_USER o registro passa por tratativas antes mesmo da execução deste EntryPoint a qual ira modificar o valor da row, caso não seja este o caso, o valor do inputValues será atribuido a esta variavel.

5 - tableObject

Objeto da classe "Tabela", construido baseado na tabela do EntryPoint:


$this->tableObject;
/**
* Tipo: Objeto(voclasses\Tabela)
* Exemplo de saída:
	voclasses\Tabela
		NOME: "ENCARREGADO"
		TABELA_REAL: "APP_ENCARREGADO"
		DESCRICAO: "Encarregado"
		UNQ: null
		DISPLAY: "LETRA,NOME"
		FILIAL_COMP: false
		LOCAL_COMP: false
		CAMPOS: array(26)
		ACTIONS: array(0)
		TIPO: "1"
		FILTRO_USER: "0"
		MOBILE_MESSAGE: "0"
		MOBILE_MESSAGE_FK: null
		MOBILE_TABLE: "0"
		ORDER_BY: "CRACHA, NOME ASC"
		ORDER_BY_OPTIONS: array(2)
		OPTIONS: ""
		OPTIONS_LOV: null
		MAX_ROWS_WO_FILTER: "100"
		MAX_ROWS_WO_FILTER_MODAL: "100"
		INDICATORS: ""
		numFKFields: 2
		hasLOVNFields: false
		hasLOVXFields: false
		hasFKXFields: false
		FK_UP: array(2)
		FK_DOWN: array(5)
		hasGpsPoint: false
		hasImageMobile: false
		recordCount: 0
		fklTables: array(3)
		fklFields: array(3)
		TABELA_CAMPO_ACTIONS: null
*/

Variáveis Antigas

  • row -> rowValues na versão atual
  • tabela_par -> tableName na versão atual

21 - After Update

Código a ser configurado para executar DEPOIS do UPDATE na tabela correspondente. Geralmente utilizado para atualizar um valor em outra tabela que referencie a que está sendo utilizada.

Variáveis Disponíveis
  • inputValues
  • return
  • rowValues
  • tableName
  • tableObject
  • tBO
  • updateValues
Variáveis Antigas
  • valores, outputValues -> inputValues na versão atual;
  • row -> rowValues na versão atual;
  • tabela_par -> tableName na versão atual.

7 e 45 Manipulação front-end:

Os ENTRY_NUM 7 e 45 podem ser utilizados em conjunto para manipular o javascript da pagina(7) e validar requisições/alterações no PHP (45).

7 - Validação FrontEnd

Utilizado com código JavaScript para realizar validações no FrontEnd ou tela do CRUD, com ele você pode:

  • Esconder/Bloquear campos
  • Criar um novo botão, por exemplo, para mostrar um popup ou para salvar uma nova informação e nesse forma é necessário usar o 45 para salvar no banco de dados.

Exemplo

7 - Validação (JavaScript)

$("#PROC_ST").find("option").css("display", "none");

$(document).ready(function () {
  $(".form-actions #enviar").after(
    '&nbsp;<button id="integrar" type="button" onclick="" data-title="Integração"  class="btn btn-lg green-nfs tooltips"><i class="fa fa-reply"></i>Integração</button>'
  );

  var procDH = $("#PROC_DH").val();
  if (procDH != "" && procDH != 0) {
    $("#integrar").addClass("hide");
    disableBtn();
  }

  $("#integrar").click(function () {
    var dataInicio = $("#INI_DH").val();
    var dataFim = $("#FIM_DH").val();

    if (dataInicio != "" && dataFim != "") {
      nfsui.windowConfirm(
        "Deseja realmente integrar? O campo Data Integração será preenchido!",
        "Sim",
        "Não",
        preencheDataIntegracao,
        cancelar,
        "",
        ""
      );
    } else {
      notify(
        "error",
        "A data inicio e fim do boletim devem ser preenchidas antes da integração!"
      );
    }
  });
});

function cancelar(valor) {
  $("#PROC_ST").val(0);
  $("#PROC_DH").val("");
  $("#PROC_DESC").val("");
}

function preencheDataIntegracao() {
  $.ajax({
    type: "POST",
    url: "/entrypoint",
    data: {
      getData: "getData",
      getDesc: "getDesc",
    },
    dataType: "json",
    success: function (data) {
      $("#PROC_ST").val(1);
      $("#PROC_DH").val(data.getData);
      $("#PROC_DESC").val(data.getDesc);
      $("#integrar").addClass("hide");
      disableBtn();
    },
    error: function () {
      notify("error", "Erro! Tente novamente mais tarde.");
    },
  });
}

function disableBtn() {
  document.getElementById("INI_DH").disabled = true;
  document.getElementById("FIM_DH").disabled = true;
}

[!WARNING] Elementos que recebem a propriedade disabled não são enviados ao realizar o submit do formulario, neste caso utilizar readOnly ao invés de disabled como no exemplo: $('#NOME_CAMPO').readOnly = true.


45 - Validação BackEnd

Utilizado com código PHP para realizar validações no BackEnd.

Para chamar o entry point 45 é necessário realizar um requisição por ajax para /entrypoint.

Exemplo

Na variável $_POST temos os parâmetros que são enviados da tela entry point 7 para o backend entry point 45, por exemplo, para o o exemplo abaixo temos duas variáveis horaInicial e horaFinal se houvesse um entry point 7 ele estaria mais ou menos dessa forma:

function preencheDataIntegracao() {
  $.ajax({
    type: "POST",
    url: "/entrypoint", // Sempre usado para passar pelo entry point 45
    data: {
      horaInicial: "10:00", // Aqui estou colocado os valores constantes, mas poderia ser uma variável
      horaFinal: "12:00",
    },
    dataType: "json",
    success: function (data) {
      $("#PROC_ST").val(1);
      $("#integrar").addClass("hide"); // esconde o botão integrar
    },
    error: function () {
      notify("error", "Erro! Tente novamente mais tarde.");
    },
  });
}

Entry Point 45:

if(isset($_POST['horaInicial']) && $_POST['horaInicial'] != '' && isset($_POST['horaFinal']) && $_POST['horaFinal'] != '') {

	$resultsInicioMaior = \core\NFSQueryBuilder::select([
		"distinct t.seq_db"
	])
	->from('turno', 't')
	->where('TIME_TO_SEC(:horaInicial) >= TIME_TO_SEC(:horaFinal)')
	->setParameters([
		'horaInicial' => $_POST['horaInicial'],
		'horaFinal' => $_POST['horaFinal'],
		])
	->get();

	$results = \core\NFSQueryBuilder::select([
		"distinct t.seq_db"
	])
	->from('turno', 't')
	->where('
		(TIME_TO_SEC(:horaInicial) BETWEEN t.HORA_INICIAL_REFEICAO AND t.HORA_FINAL_REFEICAO) or
		(TIME_TO_SEC(:horaFinal) BETWEEN t.HORA_INICIAL_REFEICAO AND t.HORA_FINAL_REFEICAO)
	')
	->andWhere('t.seq_db != :SeqDB')
	->setParameters([
		'horaInicial' => $_POST['horaInicial'],
		'horaFinal' => $_POST['horaFinal'],
		'SeqDB' => $_POST['SeqDB'],
		])
	->get();

	if(!empty($resultsInicioMaior)){
		echo 'HoraInicioMaior';
		exit;
	}

	if(!empty($results)){
		echo 'HoraInvalida';
		exit;
	}

	echo 'HoraValida';
	exit;
}

if(isset($_POST['getDataSec'])) {
	echo date('d/m/Y H:i:s');
	exit;
}

if(isset($_POST['getData']) && isset($_POST['getDesc']) ) {
	$data1 = date('d/m/Y H:i:s');
	$user = \core\xDS::getUser();
	$data2 = $user->LOGIN .'-'.$user->SEQ_DB;
	echo json_encode(['getData'=>$data1, 'getDesc'=>$data2]);
	exit;
}

[!NOTE] Retornar todos os registros de uma tabela (Não funciona para MOBILE_TABLE (APONTAMENTO OU BOLETIM))


Exemplos de funções e utilizações básicas

[!IMPORTANT]
Não usar chamadas a classe ConexaoDB! Em breve os códigos que >> tiverem essa chamada serão ignorados.

  • GET Modo padrão: Obtenção padrão de dados de 01 registro (trás as _FK)
$dadosCompletosDoEquipamento = Dao::table('EQP')->seqDb(345);
  • GET Modo lazy: Obtenção mais limpa dos dados de 01 registro (não trás as _FK)
$dadosDoEquipamento = Dao::table('EQP')->lazy()->seqDb(14,true);
  • Se precisar só de um campo da tabela (só funciona em modo lazy)
$descricaoEquipamento = Dao::table('EQP')->select(['DESCRICAO'])->seqDb(14,true);
  • Obter uma lista em um Array de registros agrupados por SEQ_DB. Muito utilizado em buscas e for's / montagem de entryPoint/Relatórios
$resultado = Dao::table('equipamento')
			->orderBy('DESCRICAO','DESC')
			->groupBy('SEQ_DB')
			->toArray()
			->get();
  • Atualizar o ponto de GPS do registro com SEQ_DB = 1 da tabela Equipamento
$resultado = Dao::table('equipamento')
			->where(1)
			->updateGpsPoint(-21.121212,-12.345678,'2020-01-01 01:21:59');
  • Mostrar o conteúdo e tipo da variável
echo '<pre>';
var_dump($variavel);
echo '</pre>';
  • Obter 30 registros agrupados pelo SEQ_DB e ordenados pela DESCRICAO (descrecente) da tabela Equipamento. Também mostra a Query resultante.
$resultado = Dao::table('equipamento')
			->orderBy('DESCRICAO','DESC')
			->groupBy('SEQ_DB')
			->limit(30)
			->echoSql()
			->get();
  • Atualizar alguns campos do registro com SEQ_DB = 1 na tabela Equipamento
$seqDb = 1;

$updateEqp = [];
$updateEqp['POSICAO'] = 1;
$updateEqp['POSICAO_PLAT'] = -22.444422;
$updateEqp['POSICAO_PLON'] = -22.33333;
$updateEqp['POSICAO_DH'] = '2020-04-10 03:01:02';

$resultado = Dao::table('equipamento')
			->where($seqDb)
			->updateRow($updateEqp);
  • Obter a DS (estrutura) de uma tabela e seus campos:
$tabelaDS = Dao::table('EQP')->getDS();
$camposTabelaDS = $tabelaDS->CAMPOS;

$camposTabelaDS = Dao::table('EQP')->getDS()->CAMPOS; //versão elegante

Exemplos de EntryPoints

XMOVA

[!WARNING]
Ao criar EntryPoints do tipo XMOVA ou XMOVALOCATION, caso não possuam o XMOVA_INSTALLCODE, utlizar o valor 9999.

SYSTEM - INSERÇÃO E MODIFICAÇÃO

18 - Before Insert

if($this->inputValues['SEQ_DB_DEVICE'] == 0 or $this->inputValues['SEQ_DB_DEVICE'] == '') {
	NfsLogger::WARN(print_r($this->inputValues,true), 'SEQ_DB_DEVICE_ZERADO');
	$this->outputValues['SEQ_DB_DEVICE'] = hexdec(uniqid());
}


if($_SESSION['LOG_SESSION']['ACTION'] == 'CRUD'){ //somente se inserido pelo painel
	NfsLogger::WARN(print_r($this->inputValues,true), 'WEB_EQP_APT_18');

	$pesquisar = false;
	$iApt = $this->inputValues['INI_DH'];
	$fApt = $this->inputValues['FIM_DH'];
	$inicioApt = Utils::convertDHSToMysql($iApt) ?? NULL;
	$fimApt = Utils::convertDHSToMysql($fApt) ?? NULL;
	$grua = $this->inputValues['EQP_SEQ_DB'] ?? NULL;

	if(!empty($this->inputValues['SEQ_DB_DEVICE_MASTER_SEQ_DB'])){
		NfsLogger::WARN('COM BOLETIM - CONFERIR', 'WEB_EQP_APT_18');

		$boletim = Dao::table('EQP_BOLETIM')->select('INI_DH', 'FIM_DH')
			->where(['SEQ_DB' => $this->inputValues['SEQ_DB_DEVICE_MASTER_SEQ_DB']])
			->get();

		$inicioBoletim = $boletim[0]['INI_DH'] ?? NULL;
		$fimBoletim = $boletim[0]['FIM_DH'] ?? NULL;

		if(!empty($inicioBoletim)){
			if(strtotime($inicioBoletim) <= strtotime($inicioApt) and (strtotime($fimBoletim) >= strtotime($fimApt) or empty($fimBoletim))){
				NfsLogger::WARN('BOLETIM CORRETO', 'WEB_EQP_APT_18');
			}
			else{
				NfsLogger::WARN('BOLETIM ERRADO', 'WEB_EQP_APT_18');
				$this->outputValues['SEQ_DB_DEVICE_MASTER_SEQ_DB'] = null;
				$pesquisar = true;
			}
		}
	}
	else{
		NfsLogger::WARN('SEM BOLETIM - PESQUISAR', 'WEB_EQP_APT_18');
		$pesquisar = true;
	}

	if($pesquisar){
		NfsLogger::WARN('PROCURAR BOLETIM FECHADO', 'WEB_EQP_APT_18');

		if(!empty($inicioApt) and !empty($fimApt) and !empty($grua)){

			$boletim = NFSQueryBuilder::select(["b.SEQ_DB"])
				->from('EQP_BOLETIM','b')
				->where("b.EQP_SEQ_DB = {$grua} AND b.INI_DH <= '{$inicioApt}' AND b.FIM_DH >= '{$fimApt}'")
				->get();

			if(!empty($boletim)){
				NfsLogger::WARN('BOLETIM ENCONTRADO: '.$boletim[0]['SEQ_DB'], 'WEB_EQP_APT_18');
				$this->outputValues['SEQ_DB_DEVICE_MASTER_SEQ_DB'] = $boletim[0]['SEQ_DB'];
			}
			else{
				NfsLogger::WARN('PROCURAR BOLETIM ABERTO', 'WEB_EQP_APT_18');

				$boletimAberto = NFSQueryBuilder::select(["b.SEQ_DB"])
					->from('EQP_BOLETIM','b')
					->where("b.EQP_SEQ_DB = {$grua} AND b.INI_DH <= '{$inicioApt}' AND b.FIM_DH IS NULL")
					->get();

				if(!empty($boletimAberto)){
					NfsLogger::WARN('BOLETIM ENCONTRADO: '.$boletimAberto[0]['SEQ_DB'], 'WEB_EQP_APT_18');
					$this->outputValues['SEQ_DB_DEVICE_MASTER_SEQ_DB'] = $boletimAberto[0]['SEQ_DB'];
				}
				else{
					NfsLogger::WARN('BOLETIM NÃO ENCONTRADO', 'WEB_EQP_APT_18');
				}
			}
		}
		else{
			NfsLogger::WARN('VERIFICAR: INÍCIO, FIM OU GRUA ESTÁ VAZIO', 'WEB_EQP_APT_18');
		}
	}

} else {
	NfsLogger::WARN('APONTAMENTO NÃO FOI INSERIDO PELO PAINEL', 'WEB_EQP_APT_18');
}

191 - After Insert

Após a inserção de um novo apontamento, o EntryPoint vai verificar se esse apontamento é uma interferência. Se sim, vai realizar o fechamento automático do mesmo.

if ($tableName == 'APONTAMENTO_MO') {
    //Busca a interferência com configuração do tipo 1
	$interferencias = Dao::table('INTERFERENCIA')
					->select(['SEQ_DB'])
					->innerJoin('i', 'CONFIGURACAO', 'cf')
					->where('cf.TIPO = 1')
					->get();

	//Verifica se o tipo do apontamento foi uma interferência
	if (isset($inputValues['INTERFERENCIA_SEQ_DB'])
	&& isset($interferencias['SEQ_DB'])
	&& $inputValues['INTERFERENCIA_SEQ_DB'] == $interferencias['SEQ_DB']) {

		//Se for interferência, atualiza os campos
		$fechamentoUpdate['FIM_DH'] = $inputValues['INI_DH'];
		$fechamentoUpdate['INI_FIM_DIFF_ST'] = -1;

		//Atualiza o $_lastInsertedId com as informações
		//para fazer o fechamento automático do apontamento
		$resultado = Dao::table('APONTAMENTO_MO')
			->where($_lastInsertId)
			->updateRow($fechamentoUpdate);
    }
}

20 - Before Update

if($tableName == 'FUNCIONARIO') {
	if (isset($rowValues['SEQ_DB'])) {
		if($inputValues['FLAG_ENCARREGADO'] == '1'){
			$tblBO = new \core\TabelaBO();
			$tabelaFuncionario = \core\xDS::getTabela('FUNCIONARIO');
			$seq = $rowValues['SEQ_DB'];
			$filtro = "SELECT f.EMPRESA, f.FILIAL, f.LOCAL, f.CRACHA, f.NOME
				from app_funcionario f
				left join app_funcao fun on f.FUNCAO_SEQ_DB = fun.SEQ_DB
				where f.SEQ_DB = {$seq} AND (f.CRACHA <> fun.CODIGO OR f.FUNCAO_SEQ_DB IS NULL);";

			$funcionarios = \core\ConexaoDB::query($filtro, $params = []);
			$tabelaFuncao = \core\xDS::getTabela('FUNCAO');
			if(!empty($funcionarios)){
				$dadosInsert['EMPRESA'] = $funcionarios[0]['EMPRESA'];
				$dadosInsert['FILIAL'] = $funcionarios[0]['FILIAL'];
				$dadosInsert['LOCAL'] =$funcionarios[0]['LOCAL'];
				$dadosInsert['CODIGO'] = $funcionarios[0]['CRACHA'];
				$dadosInsert['DESCRICAO'] = strtoupper($funcionarios[0]['NOME']);
				$fun = "SELECT fun.SEQ_DB SEQ_DB from app_funcao fun where fun.CODIGO = {$funcionarios[0]['CRACHA']};";
				$novaFuncao = \core\ConexaoDB::query($fun, $params = []);

				if (empty($novaFuncao)){
					$newFuncao = $tblBO->insert($tabelaFuncao, $dadosInsert,false);
					$seqDbFuncao = $newFuncao->lastInsertSeqDb;
					$inputValues['FUNCAO_SEQ_DB'] = $seqDbFuncao;
					$this->code['values'] = $inputValues;
				}
				else{
					$inputValues['FUNCAO_SEQ_DB'] = $novaFuncao[0]['SEQ_DB'];
					$this->code['values'] = $inputValues;
				}
			}
		}
	}
}

21 - After Update

if (isset($rowValues['SEQ_DB'])) {
	$tblBO = new \core\TabelaBO();
	$tabelaFuncionario = \core\xDS::getTabela('FUNCIONARIO');
	$seq = $rowValues['SEQ_DB'];
	$filtro = "SEQ_DB = {$seq} AND FLAG_ENCARREGADO = 1";
	$func = \core\TabelaBO::getFilteredToArray($tabelaFuncionario,'',$filtro);
	$tabelaFuncao = \core\xDS::getTabela('FUNCAO');
	$dadosInsert = [];
	if(!empty($func)){
		$dadosInsert['EMPRESA'] = $func[0]['EMPRESA'];
		$dadosInsert['FILIAL'] = $func[0]['FILIAL'];
		$dadosInsert['LOCAL'] =$func[0]['LOCAL'];
		$dadosInsert['CODIGO'] = $func[0]['CRACHA'];
		$dadosInsert['DESCRICAO'] = strtoupper($func[0]['NOME']);
		$tblBO->insert($tabelaFuncao,$dadosInsert,false);
	}
}

TabelaBO::getRow(tabela, seq_db, filtro)

[!CAUTION] Não usar ConexaoDB::getRow($sql)

$result = \core\TabelaBO::getRow("FUNCIONARIO",43453,"");

$result = \core\TabelaBO::getRow("FUNCIONARIO","","CRACHA = '11111'");