From 5d52b6c4ecc0abd7fb095df2e4266a373a81adc4 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Fri, 1 Aug 2025 15:17:50 -0400 Subject: [PATCH] Update logic for Apply Credit on invoice Post --- user/post/invoice.php | 190 ++++++++++-------------------------------- 1 file changed, 45 insertions(+), 145 deletions(-) diff --git a/user/post/invoice.php b/user/post/invoice.php index 1c6c5dd2..efcd206d 100644 --- a/user/post/invoice.php +++ b/user/post/invoice.php @@ -914,152 +914,52 @@ if (isset($_POST['apply_credit'])) { //Check to see if amount entered is greater than the balance of the invoice if ($amount > $invoice_balance) { $_SESSION['alert_message'] = "Credit is more than the balance"; - header("Location: " . $_SERVER["HTTP_REFERER"]); - } else { - mysqli_query($mysqli,"UPDATE invoices SET invoice_credit_amount = $total_credit_amount WHERE invoice_id = $invoice_id"); - // Remove Amounted Credit - mysqli_query($mysqli,"INSERT INTO credits SET credit_amount = -$amount, credit_created_by = $session_user_id, credit_client_id = $client_id"); - - /* - //Add up all the payments for the invoice and get the total amount paid to the invoice - $sql_total_payments_amount = mysqli_query($mysqli,"SELECT SUM(payment_amount) AS payments_amount FROM payments WHERE payment_invoice_id = $invoice_id"); - $row = mysqli_fetch_array($sql_total_payments_amount); - $total_payments_amount = floatval($row['payments_amount']); - - //Get the invoice total - $sql = mysqli_query($mysqli,"SELECT * FROM invoices - LEFT JOIN clients ON invoice_client_id = client_id - LEFT JOIN contacts ON clients.client_id = contacts.contact_client_id AND contact_primary = 1 - WHERE invoice_id = $invoice_id" - ); - - $row = mysqli_fetch_array($sql); - $invoice_amount = floatval($row['invoice_amount']); - $invoice_prefix = sanitizeInput($row['invoice_prefix']); - $invoice_number = intval($row['invoice_number']); - $invoice_url_key = sanitizeInput($row['invoice_url_key']); - $invoice_currency_code = sanitizeInput($row['invoice_currency_code']); - $client_id = intval($row['client_id']); - $client_name = sanitizeInput($row['client_name']); - $contact_name = sanitizeInput($row['contact_name']); - $contact_email = sanitizeInput($row['contact_email']); - $contact_phone = sanitizeInput(formatPhoneNumber($row['contact_phone'], $row['contact_phone_country_code'])); - $contact_extension = preg_replace("/[^0-9]/", '',$row['contact_extension']); - $contact_mobile = sanitizeInput(formatPhoneNumber($row['contact_mobile'], $row['contact_mobile_country_code'])); - - $sql = mysqli_query($mysqli,"SELECT * FROM companies WHERE company_id = 1"); - $row = mysqli_fetch_array($sql); - - $company_name = sanitizeInput($row['company_name']); - $company_country = sanitizeInput($row['company_country']); - $company_address = sanitizeInput($row['company_address']); - $company_city = sanitizeInput($row['company_city']); - $company_state = sanitizeInput($row['company_state']); - $company_zip = sanitizeInput($row['company_zip']); - $company_phone = sanitizeInput(formatPhoneNumber($row['company_phone'], $row['company_phone_country_code'])); - $company_email = sanitizeInput($row['company_email']); - $company_website = sanitizeInput($row['company_website']); - $company_logo = sanitizeInput($row['company_logo']); - - // Sanitize Config vars from get_settings.php - $config_invoice_from_name = sanitizeInput($config_invoice_from_name); - $config_invoice_from_email = sanitizeInput($config_invoice_from_email); - - //Calculate the Invoice balance - $invoice_balance = $invoice_amount - $total_payments_amount; - - $email_data = []; - - //Determine if invoice has been paid then set the status accordingly - if ($invoice_balance == 0) { - - $invoice_status = "Paid"; - - if ($email_receipt == 1) { - - $subject = "Payment Received - Invoice $invoice_prefix$invoice_number"; - $body = "Hello $contact_name,

We have received your payment in full for the amount of " . numfmt_format_currency($currency_format, $amount, $invoice_currency_code) . " for invoice $invoice_prefix$invoice_number. Please keep this email as a receipt for your records.

Amount Paid: " . numfmt_format_currency($currency_format, $amount, $invoice_currency_code) . "
Payment Method: $payment_method
Payment Reference: $reference

Thank you for your business!


--
$company_name - Billing Department
$config_invoice_from_email
$company_phone"; - - // Queue Mail - $email = [ - 'from' => $config_invoice_from_email, - 'from_name' => $config_invoice_from_name, - 'recipient' => $contact_email, - 'recipient_name' => $contact_name, - 'subject' => $subject, - 'body' => $body - ]; - - $email_data[] = $email; - - // Add email to queue - if (!empty($email)) { - addToMailQueue($email_data); - } - - // Get Email ID for reference - $email_id = mysqli_insert_id($mysqli); - - // Email Logging - mysqli_query($mysqli,"INSERT INTO history SET history_status = 'Sent', history_description = 'Payment Receipt sent to mail queue ID: $email_id!', history_invoice_id = $invoice_id"); - logAction("Invoice", "Payment", "Payment receipt for invoice $invoice_prefix$invoice_number queued to $contact_email Email ID: $email_id", $client_id, $invoice_id); - - } - - } else { - - $invoice_status = "Partial"; - - if ($email_receipt == 1) { - - $subject = "Partial Payment Received - Invoice $invoice_prefix$invoice_number"; - $body = "Hello $contact_name,

We have received partial payment in the amount of " . numfmt_format_currency($currency_format, $amount, $invoice_currency_code) . " and it has been applied to invoice $invoice_prefix$invoice_number. Please keep this email as a receipt for your records.

Amount Paid: " . numfmt_format_currency($currency_format, $amount, $invoice_currency_code) . "
Payment Method: $payment_method
Payment Reference: $reference
Invoice Balance: " . numfmt_format_currency($currency_format, $invoice_balance, $invoice_currency_code) . "

Thank you for your business!


~
$company_name - Billing
$config_invoice_from_email
$company_phone"; - - // Queue Mail - $email = [ - 'from' => $config_invoice_from_email, - 'from_name' => $config_invoice_from_name, - 'recipient' => $contact_email, - 'recipient_name' => $contact_name, - 'subject' => $subject, - 'body' => $body - ]; - - $email_data[] = $email; - - // Add email to queue - if (!empty($email)) { - addToMailQueue($email_data); - } - - // Get Email ID for reference - $email_id = mysqli_insert_id($mysqli); - - // Email Logging - mysqli_query($mysqli,"INSERT INTO history SET history_status = 'Sent', history_description = 'Payment Receipt sent to mail queue ID: $email_id!', history_invoice_id = $invoice_id"); - logAction("Invoice", "Payment", "Payment receipt for invoice $invoice_prefix$invoice_number queued to $contact_email Email ID: $email_id", $client_id, $invoice_id); - - } - - } - - //Update Invoice Status - mysqli_query($mysqli,"UPDATE invoices SET invoice_status = '$invoice_status' WHERE invoice_id = $invoice_id"); - - */ - - //Add Payment to History - mysqli_query($mysqli,"INSERT INTO history SET history_status = '$invoice_status', history_description = 'Credit applied', history_invoice_id = $invoice_id"); - - // Logging - logAction("Invoice", "Payment", "Credit" . numfmt_format_currency($currency_format, $amount, $session_company_currency) . " added to invoice $invoice_prefix$invoice_number", $client_id, $invoice_id); - - customAction('invoice_pay', $invoice_id); - - $_SESSION['alert_message'] .= "Credit amount " . numfmt_format_currency($currency_format, $amount, $session_company_currency) . " applied"; - - header("Location: " . $_SERVER["HTTP_REFERER"]); + redirect(); } + + // Insert a new credit usage record linked to the invoice + mysqli_query($mysqli, " + INSERT INTO credits SET + credit_amount = -$amount, + credit_type = 'usage', + credit_created_by = $session_user_id, + credit_client_id = $client_id, + credit_invoice_id = $invoice_id + "); + + // Calculate updated invoice credit sum + $result = mysqli_query($mysqli, " + SELECT SUM(credit_amount) AS credit_total + FROM credits + WHERE credit_invoice_id = $invoice_id + "); + $total_credit_applied = floatval(mysqli_fetch_assoc($result)['credit_total']); + + // Get invoice amount + $invoice_amount = floatval(getFieldByID('invoices', $invoice_id, 'invoice_amount')); + + // Determine new status + $invoice_due = $invoice_amount + $total_credit_applied; + $invoice_status = ($invoice_due <= 0) ? 'Paid' : 'Partial'; + + // Update invoice status only (not invoice_credit_amount) + mysqli_query($mysqli, "UPDATE invoices SET invoice_status = '$invoice_status' WHERE invoice_id = $invoice_id"); + + // Log credit application in history + mysqli_query($mysqli, " + INSERT INTO history SET + history_status = '$invoice_status', + history_description = 'Credit applied', + history_invoice_id = $invoice_id + "); + + logAction("Invoice", "Payment", "Credit " . numfmt_format_currency($currency_format, $amount, $session_company_currency) . " applied to invoice $invoice_prefix$invoice_number", $client_id, $invoice_id); + + customAction('invoice_pay', $invoice_id); + + $_SESSION['alert_message'] .= "Credit amount " . numfmt_format_currency($currency_format, $amount, $session_company_currency) . " applied"; + + redirect(); } if (isset($_GET['add_payment_stripe'])) {