Ir para conteúdo

Featured Replies

Postado

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.


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.
Nota: Sua postagem exigirá aprovação do moderador antes de ficar visível.

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

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Informação Importante

Concorda com os nossos termos?