Ir para conteúdo
  • Cadastre-se

Script Cron para Calcular Juros de Mora em Faturas Vencidas no WHMCS


Posts Recomendados

Olá a todos,

Gostaria de compartilhar com vocês um script cron que desenvolvi para calcular e adicionar automaticamente juros de mora às faturas vencidas no WHMCS. Esse script pode ser útil para quem precisa automatizar essa tarefa e está disponível para personalização e melhorias conforme necessário. Sinta-se à vontade para usar e adaptar conforme suas necessidades.

Segue o código do script:
 

<?php
require_once __DIR__ . '/../init.php'; // Caminho relativo ao diretório do script juros.php

// Incluir o arquivo de configuração do WHMCS
require_once __DIR__ . '/../configuration.php'; // Ajuste o caminho conforme necessário

// Configurações do banco de dados usando as variáveis do arquivo de configuração do WHMCS
$db_host = $db_host;
$db_username = $db_username;
$db_password = $db_password;
$db_name = $db_name;

$mysqli = new mysqli($db_host, $db_username, $db_password, $db_name);

// Verificar conexão
if ($mysqli->connect_error) {
    die( error_log('Erro na conexão (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error));
}


// Obtendo faturas vencidas
$invoices = localAPI('GetInvoices', array(
    'status' => 'Unpaid',
    'dueafter' => date('Y-m-d', strtotime('-1 day')), // Faturas vencidas a mais de um dia
    'responsetype' => 'json',
));

// Convertendo o array em uma string legível para log
//$logMessage = var_export($invoices, true);

// Registrando o resultado da API no log
//error_log($logMessage);

// Verificar se a chamada à API foi bem-sucedida
if ($invoices['result'] == 'success') {
    foreach ($invoices['invoices']['invoice'] as $invoice) {
        $invoiceId = $invoice['id'];
        $clientId = $invoice['userid'];
        $dueDate = strtotime($invoice['duedate']);
        $currentDate = time();
        
        // Verificar se o item "Juros de Mora" já existe na fatura
        $interestExists = false;
        $interestItemId = null;
            
        // Calcular os juros de mora
        $daysLate = floor(($currentDate - $dueDate) / (60 * 60 * 24));
        $dailyInterestRate = 0.003; // 0,033% ao dia
        $maxInterestRate = 0.01; // Limite máximo de 1%

        if($daysLate > 0 && $daysLate <=30){
          
        // Busca ID do item Juros de Mora da Fatura no Banco
        $sql = "SELECT id FROM tblinvoiceitems WHERE invoiceid = ? AND description LIKE ('Juros de mora de 1% ao mês %')";
        $stmt = $mysqli->prepare($sql);
        $stmt->bind_param('i', $invoiceId);
        $stmt->execute();
        $stmt->store_result();

        if ($stmt->num_rows > 0) {
            $interestExists = true;
            $stmt->bind_result($interestItemId);
            $stmt->fetch();
            error_log("Item 'Juros de Mora' encontrado com o ID $interestItemId");
        }

        $stmt->close();
        
        
        error_log("Calculo Juros | Fatura ID $invoiceId: ". $daysLate * $dailyInterestRate);
        $interestAmount = (($maxInterestRate * $invoice['total']) / 30) * $daysLate ;

        error_log("Limite de Juros | Fatura ID $invoiceId: ".$interestAmount);
            
        // Arredondar o valor de $interestAmount
        $interestAmount = round($interestAmount, 2);

        // Adicionar ou atualizar o item "Juros de Mora"
        if ($interestExists) {
            // Atualizar o valor do item existente
            $result = localAPI('UpdateInvoice', array(
                'invoiceid' => $invoiceId,
                'itemdescription' => array($interestItemId => 'Juros de mora de 1% ao mês ('.$daysLate.' dias em atraso)'),
                'itemamount' => array($interestItemId => $interestAmount),
                'itemtaxed' => array($interestItemId => false), // Ajuste conforme necessário
            ));
        } else {
            // Adicionar novo item "Juros de Mora"
            $result = localAPI('UpdateInvoice', array(
                'invoiceid' => $invoiceId,
                'newitemdescription' => array($interestItemId => 'Juros de mora de 1% ao mês ('.$daysLate.' dias em atraso)'),
                'newitemamount' => array($interestItemId => $interestAmount),
                'newitemtaxed' => array($interestItemId => false), // Ajuste conforme necessário
            ));
        }

        // Verificar o resultado da operação
        if ($result['result'] != 'success') {
            // Lidar com erros ao adicionar ou atualizar o item
            error_log("Erro ao atualizar/adicionar 'Juros de Mora' para fatura ID $invoiceId: " . $result['message']);
        } else {
            // Log de sucesso ao adicionar ou atualizar o item
            if ($interestExists) {
                error_log("Item 'Juros de Mora' atualizado com sucesso para fatura ID $invoiceId - Dias de atraso: " .$daysLate);
            } else {
                error_log("Item 'Juros de Mora' adicionado com sucesso para fatura ID $invoiceId - Dias de atraso: " .$daysLate);
            }
        }
        }
    }
} else {
    // Lidar com erros ao obter as faturas vencidas
    error_log("Erro ao obter faturas vencidas: " . $invoices['message']);
}
?>


Recomendo configurar agendamento cron para uma vez ao dia.

Link para o comentário
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Infelizmente, seu conteúdo contém termos que não são permitimos. Edite seu conteúdo para remover as palavras destacadas abaixo.
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...

Informação Importante

Concorda com os nossos termos?