setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $customerId = $_GET['customerId']; $invoiceId = $_GET['invoiceId']; // Handle Additional Payment if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['additional-payment'])){ $adPaymentAmount = floatval($_POST['adPaymentAmount']); $adPaymentDate = $_POST['adPaymentDate']; $adPaymentSource = $_POST['adPaymentSource']; $adPaymentTran = $_POST['adPaymentTran']; $adPaymentRemarks = $_POST['adPaymentRemarks']; // Insert additional payment record try { $stmt3 = $db->prepare("INSERT INTO emi (customerId, invoiceId, adPaymentAmount, adPaymentDate, adPaymentSource, adPaymentTran, adPaymentRemarks, payStatus) VALUES (:customerId, :invoiceId, :adPaymentAmount, :adPaymentDate, :adPaymentSource, :adPaymentTran, :adPaymentRemarks, 1)"); $stmt3->bindParam(':customerId', $customerId); $stmt3->bindParam(':invoiceId', $invoiceId); $stmt3->bindParam(':adPaymentAmount', $adPaymentAmount); $stmt3->bindParam(':adPaymentDate', $adPaymentDate); $stmt3->bindParam(':adPaymentSource', $adPaymentSource); $stmt3->bindParam(':adPaymentTran', $adPaymentTran); $stmt3->bindParam(':adPaymentRemarks', $adPaymentRemarks); $stmt3->execute(); echo '
Additional Payment ' . htmlspecialchars($_POST['adPaymentAmount']) . ' applied successfully.
'; } catch(PDOException $e) { echo '
Error: ' . $e->getMessage() . '
'; } // Apply additional payment to EMIs (starting from furthest future EMI) try { // Get all unpaid EMIs ordered by date DESC (furthest future first) $stmt = $db->prepare("SELECT * FROM emi WHERE customerId = :customerId AND invoiceId = :invoiceId AND emiAmount > 0 AND payStatus = 0 ORDER BY emiDate DESC"); $stmt->bindParam(':customerId', $customerId); $stmt->bindParam(':invoiceId', $invoiceId); $stmt->execute(); $emiRecords = $stmt->fetchAll(PDO::FETCH_ASSOC); $remainingAmount = $adPaymentAmount; foreach ($emiRecords as $emi) { if ($remainingAmount <= 0) break; $emiId = $emi['id']; $emiAmount = floatval($emi['emiAmount']); if ($remainingAmount >= $emiAmount) { // Full payment $remainingAmount -= $emiAmount; $newEmiAmount = 0; $payStatus = 1; } else { // Partial payment $newEmiAmount = $emiAmount - $remainingAmount; $remainingAmount = 0; $payStatus = 0; // Still partially unpaid } // Update EMI $updateStmt = $db->prepare("UPDATE emi SET emiAmount = :newEmiAmount, payStatus = :payStatus, paymentDate = CASE WHEN :payStatus = 1 THEN :paymentDate ELSE paymentDate END WHERE id = :emiId"); $updateStmt->bindParam(':newEmiAmount', $newEmiAmount); $updateStmt->bindParam(':payStatus', $payStatus); $updateStmt->bindParam(':paymentDate', $adPaymentDate); $updateStmt->bindParam(':emiId', $emiId); $updateStmt->execute(); } // If there's remaining amount after processing all unpaid EMIs if ($remainingAmount > 0) { echo '
Note: $' . number_format($remainingAmount, 2) . ' was not applied (no unpaid EMIs remaining)
'; } } catch (PDOException $e) { echo '
Error: ' . $e->getMessage() . '
'; } } // [Rest of your existing code for handling EMI status updates and data fetching...] ?>