DBPixel Posted August 6 Share Posted August 6 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. 1 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.