billing2/test.php

84 lines
3.9 KiB
PHP

<?php
require('../.hta_config/conf.php');
$db = new PDO("mysql:host=$mariaServer;dbname=$mariaDb", $mariaUser, $mariaPass);
$db->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 '<div class="alert alert-success">Additional Payment <strong>' . htmlspecialchars($_POST['adPaymentAmount']) . '</strong> applied successfully.</div>';
} catch(PDOException $e) {
echo '<div class="alert alert-danger">Error: ' . $e->getMessage() . '</div>';
}
// 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 '<div class="alert alert-info">Note: $' . number_format($remainingAmount, 2) . ' was not applied (no unpaid EMIs remaining)</div>';
}
} catch (PDOException $e) {
echo '<div class="alert alert-danger">Error: ' . $e->getMessage() . '</div>';
}
}
// [Rest of your existing code for handling EMI status updates and data fetching...]
?>
<!-- [Rest of your HTML and JavaScript remains the same] -->