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

Scheduler

Criar tabela nfs_core_scheduler

Verificar se existe a tabela nfs_core_scheduler, caso não exista pode ser inserido pelo create table abaixo:

CREATE TABLE `nfs_core_scheduler` (
  `SEQ_DB` bigint(20) NOT NULL AUTO_INCREMENT,
  `NAME` varchar(100) NOT NULL,
  `DESCRIPTION` varchar(300) DEFAULT NULL,
  `CODE_ENTRY_POINT` text,
  `EMPRESA` int(11) DEFAULT NULL,
  `FILIAL` int(11) DEFAULT NULL,
  `LOCAL` int(11) DEFAULT NULL,
  `ATIVO` int(11) DEFAULT NULL,
  `CRON_EXPRESSION` varchar(20) DEFAULT NULL,
  `LAST_EXECUTED` datetime DEFAULT NULL,
  `EXECUTED` int(11) DEFAULT '1'  NOT NULL,
  KEY `nfs_core_scheduler` (`SEQ_DB`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

Com a tabela criada a configura se baseia nos seguintes campos:

  • NAME: O nome do agendamento;
  • DESCRIPTION: Um descrição para o agendamento, esse campo é opcional;
  • CODE_ENTRY_POINT: O Código responsável por realizar a ação do agendamento;
  • EMPRESA: A empresa que deseja ser realizar as ações;
  • FILIAL: A filial que deseja ser realizar as ações;
  • LOCAL: A local que deseja ser realizar as ações;
  • ATIVO: Caso não deseje mais usar um agendamento basta marcar o ativo igual a 0 e vice-versa.
  • CRON_EXPRESSION: Expressão com o CRON de quando será executada a ação, recomendamos a utilização do Crontab-Guru ou Crontab-Generator para gerar a expressão cron a ser inserida nesse campo;
  • LAST_EXECUTED: Guarda a data da última execução e usada pelo scheduler verificar se o mesmo foi executado no horário correto.
  • EXECUTED: O seu controle é feito pelo core, representa uma flag para controlar se o entry_point foi executado com sucesso. O valor 0 representa código começou a executar mas não terminou e 1 que foi executado.

Exemplo para enviar um e-mail simples

:::danger ATENÇÃO Para configuração e envio com sucesso para mais de uma filial/local é necessário deixar-los com no mínimo um minuto de diferença para cada agendamento na coluna CRON_EXPRESSION. Exemplo:

SEQ_DBNAMEDESCRIPTIONCODE_ENTRY_POINTEMPRESAFILIALLOCALATIVOCRON_EXPRESSIONLAST_EXECUTEDEXECUTED
1---411127 12 * * *2018-08-16 12:30:231
2---422128 12 * * *2018-08-16 12:30:471
3---433129 12 * * *2018-08-16 12:31:201
4---444130 12 * * *2018-08-16 12:31:561
:::

Colunas com os seguintes valores:

NAME: ENVIAR_EMAIL
DESCRIPTION: Enviar simples email
EMPRESA: 1 
FILIAL: 1
LOCAL: 1
ATIVO: 1
CRON_EXPRESSION: 0 12 * * * // Roda todo dia às 12 horas e 0 minutos

CODE_ENTRY_POINT (Remover comentários ao utilizar o e-mail):

use scheduler\services\EmailHtmlService;
use voclasses\Usuario;
 
$typeSchedule = "email_erros_operacionais";
 
// Consulta para obter os e-mails
$resultEmails = Dao::table('usuario', 'us')
	->select(['us.EMAIL'])
	->innerJoin('us','usuario_tipo_agendamento', 'ut', 'ut.USUARIO_SEQ_DB = us.SEQ_DB')
	->innerJoin('ut', 'tipo_agendamento', 't', ' t.SEQ_DB = ut.TIPO_AGENDAMENTO_SEQ_DB')
	->where(['t.CODIGO' => $typeSchedule, 't.ATIVO' => true, 'ut.ATIVO' => true])
	->get();

	if (!empty($resultEmails)){
		$emails = [];
		foreach ($resultEmails as $value) {
		  $emails[] = $value['EMAIL'];
		}
 
		EmailHtmlService::setContainer($cli->getContainer());
		EmailHtmlService::setUser($user);
 
		$params = [];
		$params['inicio'] = date('d/m/Y');
		$params['format'] = 'html';
 
        /** getPdfReport:
        *    1) Nome do relatório no exemplo: relatorio_inconsistencia
        *    2) Parametros do relatório
        *    3) Sempre $subdomain, é uma variável da scheduler   
        * 
        *  Retorna um html do relatório.
        */
		$html = EmailHtmlService::getHtmlReport("relatorio_inconsistencia", $params, $subdomain);
 
		if($html === false){
			$html = '<i> Não houve inconsistências nesse dia! </i>';
		}
		if (isset($emails) && sizeof($emails) > 0) {
            /**
            * sendEmail:
            *  1) array de emails
            *  2) Assunto do email
            *  3) Html do relatório
            */
			EmailHtmlService::sendEmail($emails, "Relatório de Inconsistência", $html);
		}
}