DBPixel Postado Agosto 6 Compartilhar Postado Agosto 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados
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.