Como bloquear a suspensão automática em Domingos e Feriados no WHMCS

Escrito por Jefferson André Voigt
Atualizado em 09/03/2026

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.

Este artigo foi útil? 1 usuários acharam isso útil