Jump to content

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


Recommended Posts

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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

Do you agree with our terms?