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_DB | NAME | DESCRIPTION | CODE_ENTRY_POINT | EMPRESA | FILIAL | LOCAL | ATIVO | CRON_EXPRESSION | LAST_EXECUTED | EXECUTED |
---|---|---|---|---|---|---|---|---|---|---|
1 | - | - | - | 4 | 1 | 1 | 1 | 27 12 * * * | 2018-08-16 12:30:23 | 1 |
2 | - | - | - | 4 | 2 | 2 | 1 | 28 12 * * * | 2018-08-16 12:30:47 | 1 |
3 | - | - | - | 4 | 3 | 3 | 1 | 29 12 * * * | 2018-08-16 12:31:20 | 1 |
4 | - | - | - | 4 | 4 | 4 | 1 | 30 12 * * * | 2018-08-16 12:31:56 | 1 |
::: |
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);
}
}