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(
' <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'");