Este tutorial mostra como impedir que serviços sejam suspensos automaticamente em domingos e feriados, utilizando um hook personalizado no WHMCS.
O sistema utiliza:
- Feriados carregados automaticamente via BrasilAPI
- Feriados manuais
Passo 1 – Criar a tabela de feriados no banco de dados
Acesse o banco de dados do WHMCS (via phpMyAdmin ou MySQL) e execute o comando abaixo:
CREATE TABLE IF NOT EXISTS tblferiados (
id INT AUTO_INCREMENT PRIMARY KEY,
data DATE NOT NULL,
nome VARCHAR(150) NOT NULL,
tipo VARCHAR(20) DEFAULT 'nacional',
ano INT NOT NULL,
criado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY unique_data (data),
INDEX idx_data (data)
);
Essa tabela armazenará os feriados importados automaticamente.
Passo 2 – Criar o arquivo do hook
Acesse o diretório do WHMCS:
/includes/hooks/
Crie um novo arquivo, por exemplo:
bloquear_suspensao_feriados.php
Passo 3 – Inserir o código do hook
Cole o código completo abaixo dentro do arquivo criado:
<?php
use WHMCS\Database\Capsule;
if (!defined("WHMCS")) {
die("This file cannot be accessed directly");
}
/*
|--------------------------------------------------------------------------
CONFIGURAÇÕES
|--------------------------------------------------------------------------
*/
$PRAZO_EXTRA_DIAS = 0;
/*
Feriados manuais
Formato MM-DD
*/
$FERIADOS_MANUAIS = [
'12-31'
];
/*
|--------------------------------------------------------------------------
CARREGAR FERIADOS DA API (1x por ano)
|--------------------------------------------------------------------------
*/
add_hook('PreCronJob', 1, function() {
$ano = date('Y');
$removidos = Capsule::table('tblferiados')
->where('ano', '<', $ano)
->delete();
if ($removidos > 0) {
logActivity("Feriados antigos removidos da tabela tblferiados");
}
$existe = Capsule::table('tblferiados')
->where('ano', $ano)
->count();
if ($existe > 0) {
return;
}
$url = "https://brasilapi.com.br/api/feriados/v1/".$ano;
$json = @file_get_contents($url);
if (!$json) {
logActivity("Erro ao consultar os feriados da BrasilAPI");
return;
}
$feriados = json_decode($json, true);
foreach ($feriados as $f) {
try {
Capsule::table('tblferiados')->insert([
'data' => $f['date'],
'nome' => $f['name'],
'tipo' => 'api',
'ano' => $ano
]);
} catch (\Exception $e) {}
}
logActivity("Feriados da BrasilAPI inseridos na tabela tblferiados para o ano de ".$ano);
});
/*
|--------------------------------------------------------------------------
BLOQUEAR SUSPENSÕES ANTES DO CRON EXECUTAR
|--------------------------------------------------------------------------
*/
add_hook('PreCronJob', 2, function() use ($PRAZO_EXTRA_DIAS, $FERIADOS_MANUAIS) {
$hoje = date('Y-m-d');
$mesDia = date('m-d');
$bloquear = false;
$motivo = '';
/*
Domingo
*/
if (date('w') == 0) {
$bloquear = true;
$motivo = "Domingo";
}
/*
Feriado manual
*/
elseif (in_array($mesDia, $FERIADOS_MANUAIS)) {
$bloquear = true;
$motivo = "Feriado Manual";
}
/*
Feriado da API
*/
else {
$feriado = Capsule::table('tblferiados')
->where('data', $hoje)
->first();
if ($feriado) {
$bloquear = true;
$motivo = "Feriado: ".$feriado->nome;
}
}
if (!$bloquear) {
return;
}
/*
Buscar serviços que seriam suspensos hoje
*/
$services = Capsule::select("
SELECT
h.id,
h.userid
FROM tblhosting h
WHERE
h.domainstatus = 'Active'
AND (
h.overideautosuspend = 0
OR h.overidesuspenduntil <= CURDATE()
)
AND h.nextduedate != '0000-00-00'
AND DATEDIFF(CURDATE(), h.nextduedate) >=
(
SELECT value
FROM tblconfiguration
WHERE setting = 'AutoSuspensionDays'
)
");
if (!$services) {
return;
}
$novaData = date('Y-m-d', strtotime("+".$PRAZO_EXTRA_DIAS." days"));
foreach ($services as $service) {
Capsule::table('tblhosting')
->where('id', $service->id)
->update([
'overideautosuspend' => 1,
'overidesuspenduntil' => $novaData
]);
logActivity("Suspensão adiada ($motivo) - Service ID: ".$service->id, $service->userid);
}
});
Passo 4 – Funcionamento automático
- O hook roda diariamente no cron do WHMCS
- Remove automaticamente feriados de anos anteriores
- Importa os feriados da BrasilAPI uma vez por ano
- Registra logs no Activity Log
- Impede suspensão automática em domingos e feriados
Configuração de Feriados Manuais
O bloco $FERIADOS_MANUAIS permite adicionar datas específicas que não estejam na lista da API.
O formato utilizado é MM-DD.
$FERIADOS_MANUAIS = [
'03-19',
'08-15'
];
Configuração opcional
Para adicionar prazo extra após feriado ou domingo, altere:
$PRAZO_EXTRA_DIAS = 0;
Resultado esperado
Serviços não serão suspensos automaticamente em domingos ou feriados e todas as ações serão registradas no Activity Log do WHMCS.
