<?
php
// approve_transactions.php
Ini_set(‘display_errors’, 1);
Ini_set(‘display_startup_errors’, 1);
Error_reporting(E_ALL);
// --- Standard Includes ---
Include(‘config/[Link]’);
Include(‘config/[Link]’);
//
==============================================
================================
// --- AJAX HANDLERS FOR “ADD MISSING PAYMENT” MODAL ---
//
==============================================
================================
If (isset($_GET[‘ajax_action’])) {
Header(‘Content-Type: application/json’);
If ($_GET[‘ajax_action’] === ‘get_office_members’) {
$office = $_GET[‘office’] ?? ‘’;
// If there is no specific office, fetch all approved members
If (empty($office) || $office === ‘N/A’) {
$stmt = $conn->prepare(“SELECT membership_id,
CONCAT(lastname, ‘, ‘, firstname) as name FROM membership WHERE status
= ‘Approved’ ORDER BY lastname”);
} else {
$stmt = $conn->prepare(“SELECT membership_id,
CONCAT(lastname, ‘, ‘, firstname) as name FROM membership WHERE office
= ? AND status = ‘Approved’ ORDER BY lastname”);
$stmt->bind_param(“s”, $office);
$stmt->execute();
$res = $stmt->get_result();
$members =[];
While($row = $res->fetch_assoc()) {
$members[] = $row;
Echo json_encode($members);
Exit;
If ($_GET[‘ajax_action’] === ‘get_member_accounts’) {
$member_id = (int)$_GET[‘member_id’];
$type = $_GET[‘type’] ?? ‘deposit’;
$or_number = $_GET[‘or_number’] ?? ‘’;
$accounts =[];
If ($type === ‘deposit’) {
// ONLY SHOW ACCOUNTS THE MEMBER HAS NOT PAID YET IN THIS
OR BATCH
$stmt = $conn->prepare(“
SELECT account_id, account as name
FROM account
WHERE amount_type = ‘credit’
AND account IN (‘SHARE CAPITAL’, ‘SAVINGS’, ‘MORTUARY FUND’,
‘HEALTH CARE FUND’, ‘OTHER INCOME’)
AND account NOT IN (
SELECT account FROM account_history WHERE or_number = ?
AND member_id = ?
“);
$stmt->bind_param(“si”, $or_number, $member_id);
$stmt->execute();
$res = $stmt->get_result();
While($row = $res->fetch_assoc()) $accounts[] = [‘id’ =>
$row[‘account_id’], ‘name’ => $row[‘name’]];
$stmt->close();
} else {
// ONLY SHOW LOANS THE MEMBER HAS NOT PAID YET IN THIS OR
BATCH
$stmt = $conn->prepare(“
SELECT loan_id as id, account as name, balance
FROM loan
WHERE member_id = ? AND status = ‘Active’
AND loan_id NOT IN (
SELECT loan_id FROM account_transaction WHERE or_number
= ? AND member_id = ? AND loan_id IS NOT NULL
“);
$stmt->bind_param(“isi”, $member_id, $or_number, $member_id);
$stmt->execute();
$res = $stmt->get_result();
While($row = $res->fetch_assoc()) $accounts[] =[‘id’ => $row[‘id’],
‘name’ => $row[‘name’] . ‘ (Bal: ₱’ . number_format($row[‘balance’], 2) . ‘)’];
$stmt->close();
Echo json_encode($accounts);
Exit;
//
==============================================
================================
$alert_message = ‘’;
$alert_type = ‘info’;
// --- HANDLE POST REQUEST (APPROVE / REJECT / ADD MISSING PAYMENT) ---
If ($_SERVER[‘REQUEST_METHOD’] === ‘POST’ && isset($_POST[‘action’])) {
$action = $_POST[‘action’];
$admin_user_id = $_SESSION[‘user_id’] ?? null;
If (is_null($admin_user_id)) {
$_SESSION[‘error_message’] = “Your session has expired. Please log in
again.”;
Header(‘Location: approve_transactions.php’);
Exit;
}
$conn->begin_transaction();
Try {
If ($action === ‘approve’) {
$or_number = $_POST[‘or_number’];
// --- APPROVAL LOGIC ---
$stmt_approve_trans = $conn->prepare(“UPDATE
account_transaction SET status = ‘Approved’, approved_by = ?, approved_at
= NOW() WHERE or_number = ? AND status = ‘Pending’”);
$stmt_approve_trans->bind_param(“is”, $admin_user_id,
$or_number);
$stmt_approve_trans->execute();
$stmt_approve_trans->close();
$stmt_approve_hist = $conn->prepare(“UPDATE account_history SET
status = ‘Approved’, approved_by = ?, approved_at = NOW() WHERE
or_number = ? AND status = ‘Pending’”);
$stmt_approve_hist->bind_param(“is”, $admin_user_id, $or_number);
$stmt_approve_hist->execute();
$stmt_approve_hist->close();
$_SESSION[‘success_message’] = “Transaction batch #{$or_number}
has been successfully approved.”;
} elseif ($action === ‘reject’) {
$or_number = $_POST[‘or_number’];
// --- REJECTION LOGIC (REVERSAL) ---
// 1. Reverse Loan Payments
$stmt_get_loan_payments = $conn->prepare(“SELECT loan_id,
principal FROM account_transaction WHERE or_number = ? AND status =
‘Pending’ AND principal > 0”);
$stmt_get_loan_payments->bind_param(“s”, $or_number);
$stmt_get_loan_payments->execute();
$loan_payments_to_reverse = $stmt_get_loan_payments-
>get_result();
$stmt_reverse_loan = $conn->prepare(“UPDATE loan SET balance =
balance + ?, status = ‘Active’ WHERE loan_id = ?”);
While ($payment = $loan_payments_to_reverse->fetch_assoc()) {
$stmt_reverse_loan->bind_param(“di”, $payment[‘principal’],
$payment[‘loan_id’]);
$stmt_reverse_loan->execute();
$stmt_get_loan_payments->close();
$stmt_reverse_loan->close();
// 2. Reverse Deposits
$stmt_get_deposits = $conn->prepare(“SELECT member_id, account,
amount FROM account_history WHERE or_number = ? AND status =
‘Pending’ AND type = ‘Credit’”);
$stmt_get_deposits->bind_param(“s”, $or_number);
$stmt_get_deposits->execute();
$deposits_to_reverse = $stmt_get_deposits->get_result();
$account_to_membership_column_map =[‘SHARE CAPITAL’ =>
‘share_capital_balance’, ‘HEALTH CARE FUND’ =>
‘health_care_fund_balance’, ‘SAVINGS’ => ‘savings_balance’, ‘MORTUARY
FUND’ => ‘mortuary_fund_balance’];
$prepared_reversal_stmts =[];
While ($deposit = $deposits_to_reverse->fetch_assoc()) {
If
(isset($account_to_membership_column_map[$deposit[‘account’]])) {
$column_name =
$account_to_membership_column_map[$deposit[‘account’]];
If (!isset($prepared_reversal_stmts[$column_name])) {
$sql = “UPDATE membership SET {$column_name} =
{$column_name} - ? WHERE membership_id = ?”;
$prepared_reversal_stmts[$column_name] = $conn-
>prepare($sql);
$prepared_reversal_stmts[$column_name]->bind_param(“di”,
$deposit[‘amount’], $deposit[‘member_id’]);
$prepared_reversal_stmts[$column_name]->execute();
Foreach($prepared_reversal_stmts as $stmt) { $stmt->close(); }
$stmt_get_deposits->close();
// 3. Mark transactions as Rejected
$stmt_reject_trans = $conn->prepare(“UPDATE account_transaction
SET status = ‘Rejected’, approved_by = ?, approved_at = NOW() WHERE
or_number = ? AND status = ‘Pending’”);
$stmt_reject_trans->bind_param(“is”, $admin_user_id, $or_number);
$stmt_reject_trans->execute();
$stmt_reject_trans->close();
$stmt_reject_hist = $conn->prepare(“UPDATE account_history SET
status = ‘Rejected’, approved_by = ?, approved_at = NOW() WHERE
or_number = ? AND status = ‘Pending’”);
$stmt_reject_hist->bind_param(“is”, $admin_user_id, $or_number);
$stmt_reject_hist->execute();
$stmt_reject_hist->close();
$_SESSION[‘success_message’] = “Transaction batch #{$or_number}
has been rejected and financial entries have been reversed.”;
} elseif ($action === ‘add_missing_payment’) {
// --- ADD MISSING PAYMENT LOGIC ---
$target_or = $_POST[‘target_or’];
$member_id = (int)$_POST[‘member_id’];
$payment_type = $_POST[‘payment_type’]; // ‘deposit’ or ‘loan’
$target_id = (int)$_POST[‘target_id’]; // account_id or loan_id
If ($payment_type === ‘deposit’) {
$amount = (float)$_POST[‘deposit_amount’];
If ($amount > 0) {
// Get account name
$stmt_acc = $conn->prepare(“SELECT account FROM account
WHERE account_id = ?”);
$stmt_acc->bind_param(“I”, $target_id);
$stmt_acc->execute();
$acc_name = $stmt_acc->get_result()->fetch_assoc()
[‘account’];
$stmt_acc->close();
// DOUBLE CHECK TO PREVENT DUPLICATES
$stmt_check = $conn->prepare(“SELECT 1 FROM
account_history WHERE or_number = ? AND member_id = ? AND account
= ?”);
$stmt_check->bind_param(“sis”, $target_or, $member_id,
$acc_name);
$stmt_check->execute();
If ($stmt_check->get_result()->num_rows > 0) {
Throw new Exception(“This member already has a
{$acc_name} deposit in this batch. Modifications are not allowed to avoid
corruption.”);
$stmt_check->close();
// Update membership balance
$col_map =[‘SHARE CAPITAL’ => ‘share_capital_balance’,
‘SAVINGS’ => ‘savings_balance’, ‘HEALTH CARE FUND’ =>
‘health_care_fund_balance’, ‘MORTUARY FUND’ =>
‘mortuary_fund_balance’];
If (isset($col_map[$acc_name])) {
$col = $col_map[$acc_name];
$conn->query(“UPDATE membership SET $col = $col +
$amount WHERE membership_id = $member_id”);
// Get current balance for history
$bal_query = $conn->query(“SELECT “ .
($col_map[$acc_name] ?? “0”) . “ FROM membership WHERE membership_id
= $member_id”);
$curr_bal = $bal_query ? (float)$bal_query->fetch_row()[0] :
$amount;
// Ensure a base transaction exists for this OR
$stmt_tx = $conn->prepare(“SELECT transaction_id FROM
account_transaction WHERE or_number = ? AND member_id = ? LIMIT 1”);
$stmt_tx->bind_param(“si”, $target_or, $member_id);
$stmt_tx->execute();
$tx_res = $stmt_tx->get_result()->fetch_assoc();
If ($tx_res) {
$tx_id = $tx_res[‘transaction_id’];
} else {
$conn->query(“INSERT INTO account_transaction
(member_id, or_number, method, amount, datetime, user_id, status) VALUES
($member_id, ‘$target_or’, ‘Check’, 0, NOW(), $admin_user_id, ‘Pending’)”);
$tx_id = $conn->insert_id;
$stmt_tx->close();
$stmt_hist = $conn->prepare(“INSERT INTO account_history
(transaction_id, account, type, member_id, or_number, amount, balance,
user_id, datetime, status) VALUES (?, ?, ‘Credit’, ?, ?, ?, ?, ?, NOW(),
‘Pending’)”);
$stmt_hist->bind_param(“isissddi”, $tx_id, $acc_name,
$member_id, $target_or, $amount, $curr_bal, $admin_user_id);
$stmt_hist->execute();
$stmt_hist->close();
}
} elseif ($payment_type === ‘loan’) {
$principal = (float)$_POST[‘loan_principal’];
$interest = (float)$_POST[‘loan_interest’];
$total = $principal + $interest;
If ($total > 0) {
// DOUBLE CHECK TO PREVENT DUPLICATES
$stmt_check = $conn->prepare(“SELECT 1 FROM
account_transaction WHERE or_number = ? AND member_id = ? AND loan_id
= ?”);
$stmt_check->bind_param(“sii”, $target_or, $member_id,
$target_id);
$stmt_check->execute();
If ($stmt_check->get_result()->num_rows > 0) {
Throw new Exception(“This member already has a payment
for this loan in this batch. Modifications are not allowed to avoid
corruption.”);
$stmt_check->close();
// Update loan balance
$conn->query(“UPDATE loan SET balance = balance - $principal
WHERE loan_id = $target_id”);
$conn->query(“UPDATE loan SET status = ‘Paid’ WHERE loan_id
= $target_id AND balance <= 0.005”);
$bal_query = $conn->query(“SELECT balance FROM loan
WHERE loan_id = $target_id”);
$curr_bal = (float)$bal_query->fetch_row()[0];
// Insert account_transaction
$stmt_tx = $conn->prepare(“INSERT INTO account_transaction
(member_id, loan_id, or_number, method, amount, principal, interest,
balance, datetime, user_id, status) VALUES (?, ?, ?, ‘Check’, ?, ?, ?, ?,
NOW(), ?, ‘Pending’)”);
$stmt_tx->bind_param(“iissddddi”, $member_id, $target_id,
$target_or, $total, $principal, $interest, $curr_bal, $admin_user_id);
$stmt_tx->execute();
$stmt_tx->close();
$_SESSION[‘success_message’] = “Missing payment successfully
added to batch #{$target_or}.”;
If (!$conn->commit()) throw new Exception(“Transaction commit
failed.”);
Header(‘Location: approve_transactions.php’);
Exit;
} catch (Exception $e) {
$conn->rollback();
Error_log(“ACTION ERROR for OR# {$_POST[‘or_number’] ?? ‘Unknown’}
by User {$admin_user_id}: “ . $e->getMessage());
$_SESSION[‘error_message’] = “An error occurred: “ . $e-
>getMessage();
Header(‘Location: approve_transactions.php’);
Exit;
}
// --- FETCH PENDING TRANSACTIONS FOR DISPLAY ---
$pending_batches =[];
Try {
$sql = “
SELECT ‘transaction’ as source, at.or_number, [Link], [Link],
COALESCE(CONCAT([Link], ‘, ‘, [Link]), ‘N/A’) as member_name,
COALESCE([Link], ‘Zero-Amount Transaction’) as account_name,
[Link], [Link], [Link], [Link] as processed_by
FROM account_transaction at
JOIN membership m ON at.member_id = m.membership_id
JOIN users u ON at.user_id = u.user_id
LEFT JOIN loan l ON at.loan_id = l.loan_id
WHERE [Link] = ‘Pending’
UNION ALL
SELECT ‘history’ as source, ah.or_number, [Link], [Link],
COALESCE(CONCAT([Link], ‘, ‘, [Link]), ‘N/A’) as member_name,
[Link] as account_name, [Link], NULL as principal, NULL as
interest, [Link] as processed_by
FROM account_history ah
JOIN membership m ON ah.member_id = m.membership_id
JOIN users u ON ah.user_id = u.user_id
WHERE [Link] = ‘Pending’
ORDER BY or_number, datetime DESC
“;
$result = $conn->query($sql);
If ($result) {
While ($row = $result->fetch_assoc()) {
$or_number = $row[‘or_number’];
If (!isset($pending_batches[$or_number])) {
$pending_batches[$or_number] =[
‘details’ => [
‘office’ => $row[‘office’],
‘datetime’ => $row[‘datetime’],
‘processed_by’ => $row[‘processed_by’],
‘total_amount’ => 0,
],
‘items’ =>[]
];
$pending_batches[$or_number][‘details’][‘total_amount’] += (float)
$row[‘amount’];
$pending_batches[$or_number][‘items’][] = $row;
} else {
Throw new Exception(“Failed to fetch pending transactions: “ . $conn-
>error);
} catch (Exception $e) {
$alert_message = “Error fetching data: “ . $e->getMessage();
$alert_type = ‘danger’;
If (isset($_SESSION[‘error_message’])) {
$alert_message = $_SESSION[‘error_message’];
$alert_type = ‘danger’;
Unset($_SESSION[‘error_message’]);
} elseif (isset($_SESSION[‘success_message’])) {
$alert_message = $_SESSION[‘success_message’];
$alert_type = ‘success’;
Unset($_SESSION[‘success_message’]);
$conn->close();
?>
<!DOCTYPE html>
<html>
<head>
<meta charset=”utf-8”>
<title>Approve Pending Transactions – SPEMC</title>
<link rel=”apple-touch-icon” sizes=”180x180”
href=”vendors/images/[Link]”>
<link rel=”icon” type=”image/png” sizes=”32x32”
href=”vendors/images/[Link]”>
<link rel=”icon” type=”image/png” sizes=”16x16”
href=”vendors/images/[Link]”>
<meta name=”viewport” content=”width=device-width, initial-
scale=1, maximum-scale=1”>
<link href=[Link]
family=Inter:wght@300;400;500;600;700;800&display=swap
rel=”stylesheet”>
<link rel=”stylesheet” type=”text/css”
href=”vendors/styles/[Link]”>
<link rel=”stylesheet” type=”text/css” href=”vendors/styles/icon-
[Link]”>
<link rel=”stylesheet” type=”text/css”
href=”vendors/styles/[Link]”>
<link
href=[Link]
rel=”stylesheet” />
<style>
.batch-card { border-left: 5px solid #ffab00; }
.batch-card .card-header { background-color: #fffaf0; }
.batch-details-list { font-size: 0.9rem; }
.action-buttons .btn { margin-left: 5px; }
.details-table th, .details-table td { padding: 0.5rem; }
</style>
</head>
<body>
<?php
Include(“widgets/[Link]”);
Include(“widgets/[Link]”);
Include(“widgets/[Link]”);
Include(“widgets/[Link]”);
?>
<div class=”main-container”>
<div class=”pd-ltr-20 xs-pd-20-10”>
<div class=”min-height-200px”>
<div class=”page-header”>
<div class=”row”>
<div class=”col-md-12 col-sm-12”>
<div class=”title”><h4>Pending Transaction
Approvals</h4></div>
<nav aria-label=”breadcrumb” role=”navigation”>
<ol class=”breadcrumb”>
<li class=”breadcrumb-item”><a
href=”[Link]”>Dashboard</a></li>
<li class=”breadcrumb-item active” aria-
current=”page”>Approvals</li>
</ol>
</nav>
</div>
</div>
</div>
<?php if (!empty($alert_message)): ?>
<div class=”alert alert-<?= htmlspecialchars($alert_type) ?>
alert-dismissible fade show” role=”alert”>
<?= $alert_message ?>
<button type=”button” class=”close” data-dismiss=”alert”
aria-label=”Close”><span aria-hidden=”true”>×</span></button>
</div>
<?php endif; ?>
<div class=”pd-20 card-box mb-30”>
<div class=”clearfix mb-2”>
<div class=”pull-left”>
<h4 class=”text-blue h4”>Transaction Batches Awaiting
Approval</h4>
<p class=”mb-0 text-muted”>Review the details. Expand
the OR number to review items, edit, or add missing entries.</p>
</div>
</div>
<hr>
<?php if (empty($pending_batches)): ?>
<div class=”alert alert-success text-center”>
<h5 class=”alert-heading”>All Clear!</h5>
<p>There are no pending transactions that require your
approval at this time.</p>
</div>
<?php else: ?>
<div class=”accordion” id=”approvalAccordion”>
<?php foreach ($pending_batches as $or_number =>
$batch): ?>
<div class=”card batch-card mb-3”>
<!—Accordion Header
<div class=”card-header” id=”heading_<?=
htmlspecialchars($or_number) ?>”>
<h5 class=”mb-0 d-flex justify-content-between
align-items-center”>
<button class=”btn btn-link text-left flex-grow-1”
type=”button” data-toggle=”collapse” data-target=”#collapse_<?=
htmlspecialchars($or_number) ?>” aria-expanded=”true” aria-
controls=”collapse_<?= htmlspecialchars($or_number) ?>”>
<strong>OR #:</strong> <?=
htmlspecialchars($or_number) ?> |
<strong>Office:</strong> <?=
htmlspecialchars($batch[‘details’][‘office’] ?? ‘N/A’) ?> |
<strong>Total:</strong> ₱<?=
number_format($batch[‘details’][‘total_amount’], 2) ?>
</button>
<!—Approve / Reject Buttons stay on the outside
<div class=”action-buttons”>
<form method=”POST”
action=”approve_transactions.php” class=”d-inline”>
<input type=”hidden” name=”or_number”
value=”<?= htmlspecialchars($or_number) ?>”>
<button type=”submit” name=”action”
value=”approve” class=”btn btn-sm btn-success”><I class=”dw dw-
check”></i> Approve</button>
<button type=”submit” name=”action”
value=”reject” class=”btn btn-sm btn-danger” onclick=”return confirm(‘Are
you sure you want to REJECT this entire batch? This will reverse all financial
entries and cannot be undone.’)”><I class=”dw dw-cancel”></i>
Reject</button>
</form>
</div>
</h5>
</div>
<!—Expanded Card Body
<div id=”collapse_<?= htmlspecialchars($or_number)
?>” class=”collapse” aria-labelledby=”heading_<?=
htmlspecialchars($or_number) ?>” data-parent=”#approvalAccordion”>
<div class=”card-body”>
<!—MOVED THE ADD PAYMENT BUTTON HERE
<div class=”row align-items-center mb-3”>
<div class=”col-md-4 mb-2”>
<strong>Date Submitted:</strong> <br>
<?= date(‘F j, Y, g:I a’,
strtotime($batch[‘details’][‘datetime’])) ?>
</div>
<div class=”col-md-4 mb-2”>
<strong>Submitted By:</strong> <br>
<?= htmlspecialchars($batch[‘details’]
[‘processed_by’] ?? ‘N/A’) ?>
</div>
<div class=”col-md-4 mb-2 text-right”>
<!—HIGHLY VISIBLE “ADD MISSING
PAYMENT” BUTTON
<button type=”button” class=”btn btn-info”
onclick=”openAddPaymentModal(‘<?= htmlspecialchars($or_number) ?>’,
‘<?= htmlspecialchars($batch[‘details’][‘office’] ?? ‘’) ?>’)”>
<I class=”dw dw-edit2”></i> Edit / Add
Missing Payment
</button>
</div>
</div>
<hr>
<h6 class=”mb-2”>Batch Items:</h6>
<div class=”table-responsive”>
<table class=”table table-sm table-bordered
details-table”>
<thead>
<tr>
<th>Member</th>
<th>Account</th>
<th>Type</th>
<th class=”text-right”>Amount</th>
</tr>
</thead>
<tbody>
<?php foreach ($batch[‘items’] as $item):
?>
<?php if ($item[‘amount’] > 0): ?>
<tr>
<td><?=
htmlspecialchars($item[‘member_name’] ?? ‘N/A’) ?></td>
<td><?=
htmlspecialchars($item[‘account_name’] ?? ‘’) ?></td>
<td>
<?php if ($item[‘source’] ===
‘transaction’): ?>
<span class=”badge badge-
info”>Loan Payment</span>
<?php else: ?>
<span class=”badge badge-
secondary”><?= htmlspecialchars($item[‘account_name’] ?? ‘’) ?></span>
<?php endif; ?>
</td>
<td class=”text-right”>₱<?=
number_format($item[‘amount’], 2) ?></td>
</tr>
<?php endif; ?>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
</div>
</div>
<?php include(“widgets/[Link]”); ?>
</div>
</div>
<!—MODAL: ADD MISSING PAYMENT
<div class=”modal fade” id=”addPaymentModal” tabindex=”-1”
role=”dialog” aria-labelledby=”addPaymentModalLabel” aria-
hidden=”true”>
<div class=”modal-dialog” role=”document”>
<div class=”modal-content”>
<form method=”POST” action=”approve_transactions.php”>
<input type=”hidden” name=”action”
value=”add_missing_payment”>
<input type=”hidden” name=”target_or” id=”target_or_input”>
<div class=”modal-header bg-info text-white”>
<h5 class=”modal-title text-white”
id=”addPaymentModalLabel”>Edit / Add Missing Payment</h5>
<button type=”button” class=”close text-white” data-
dismiss=”modal” aria-label=”Close”>
<span aria-hidden=”true”>×</span>
</button>
</div>
<div class=”modal-body”>
<div class=”alert alert-warning small”>
Adding a payment here will immediately deduct from the
member’s balance and inject the record into the Pending batch: <strong
id=”display_target_or”></strong>.
<br><br><strong>Note:</strong> You cannot modify a
deposit/loan that the member has already paid in this batch.
</div>
<div class=”form-group”>
<label>Select Member <span
class=”text-danger”>*</span></label>
<select name=”member_id” id=”modal_member_select”
class=”form-control custom-select2” required>
<option value=””>Loading members…</option>
</select>
</div>
<div class=”form-group”>
<label>Payment Category <span class=”text-
danger”>*</span></label>
<select name=”payment_type” id=”modal_payment_type”
class=”form-control” required>
<option value=”deposit”>Deposit / Fund</option>
<option value=”loan”>Loan Payment</option>
</select>
</div>
<div class=”form-group”>
<label>Select Account/Loan <span class=”text-
danger”>*</span></label>
<select name=”target_id” id=”modal_target_account”
class=”form-control custom-select2” required>
<option value=””>Select a member first…</option>
</select>
</div>
<!—Deposit Fields
<div id=”modal_deposit_fields”>
<div class=”form-group”>
<label>Amount (₱) <span
class=”text-danger”>*</span></label>
<input type=”number” name=”deposit_amount”
id=”modal_deposit_amount” class=”form-control” step=”0.01”
min=”0.01”>
</div>
</div>
<!—Loan Fields
<div id=”modal_loan_fields” style=”display: none;”>
<div class=”row”>
<div class=”col-6”>
<div class=”form-group”>
<label>Principal (₱) <span class=”text-
danger”>*</span></label>
<input type=”number” name=”loan_principal”
id=”modal_loan_principal” class=”form-control” step=”0.01” min=”0”
value=”0.00”>
</div>
</div>
<div class=”col-6”>
<div class=”form-group”>
<label>Interest (₱) <span class=”text-
danger”>*</span></label>
<input type=”number” name=”loan_interest”
id=”modal_loan_interest” class=”form-control” step=”0.01” min=”0”
value=”0.00”>
</div>
</div>
</div>
</div>
</div>
<div class=”modal-footer”>
<button type=”button” class=”btn btn-secondary” data-
dismiss=”modal”>Cancel</button>
<button type=”submit” class=”btn btn-info”><I class=”dw
dw-add”></i> Save Payment to Batch</button>
</div>
</form>
</div>
</div>
</div>
<!—JS
<script src=”vendors/scripts/[Link]”></script>
<script src=”vendors/scripts/[Link]”></script>
<script src=”vendors/scripts/[Link]”></script>
<script src=”vendors/scripts/[Link]”></script>
<script
src=[Link]
script>
<script>
$(document).ready(function() {
$(‘.custom-select2’).select2({ width: ‘100%’, dropdownParent: $
(‘#addPaymentModal’) });
// Toggle fields based on payment category
$(‘#modal_payment_type’).change(function() {
Var type = $(this).val();
If (type === ‘deposit’) {
$(‘#modal_deposit_fields’).show();
$(‘#modal_deposit_amount’).prop(‘required’, true);
$(‘#modal_loan_fields’).hide();
$(‘#modal_loan_principal’).prop(‘required’, false);
$(‘#modal_loan_interest’).prop(‘required’, false);
} else {
$(‘#modal_deposit_fields’).hide();
$(‘#modal_deposit_amount’).prop(‘required’, false);
$(‘#modal_loan_fields’).show();
$(‘#modal_loan_principal’).prop(‘required’, true);
$(‘#modal_loan_interest’).prop(‘required’, true);
// Refresh the accounts dropdown if a member is already selected
If ($(‘#modal_member_select’).val()) {
$(‘#modal_member_select’).trigger(‘change’);
});
// Load accounts when member is selected, FILTERING OUT accounts
already paid in this batch
$(‘#modal_member_select’).change(function() {
Var member_id = $(this).val();
Var type = $(‘#modal_payment_type’).val();
Var or_number = $(‘#target_or_input’).val(); // Get OR number to
filter
Var targetSelect = $(‘#modal_target_account’);
[Link]().append(‘<option
value=””>Loading…</option>’);
if (member_id) {
$.getJSON(‘approve_transactions.php’, { ajax_action:
‘get_member_accounts’, member_id: member_id, type: type, or_number:
or_number }, function(data) {
[Link]();
if ([Link] === 0) {
[Link](‘<option value=””>No available items
to add</option>’);
} else {
[Link](‘<option value=””>-- Select
--</option>’);
$.each(data, function(index, item) {
[Link](‘<option value=”’ + [Link] + ‘”>’
+ [Link] + ‘</option>’);
});
});
});
});
// Function called when “Add Missing Payment” button is clicked
Function openAddPaymentModal(orNumber, officeName) {
$(‘#target_or_input’).val(orNumber);
$(‘#display_target_or’).text(orNumber);
Var memberSelect = $(‘#modal_member_select’);
[Link]().append(‘<option value=””>Loading
members…</option>’);
$.getJSON(‘approve_transactions.php’, { ajax_action:
‘get_office_members’, office: officeName }, function(data) {
[Link]().append(‘<option value=””>-- Select
Member --</option>’);
$.each(data, function(index, member) {
[Link](‘<option value=”’ +
member.membership_id + ‘”>’ + [Link] + ‘</option>’);
});
});
$(‘#modal_payment_type’).val(‘deposit’).trigger(‘change’);
$(‘#modal_target_account’).empty().append(‘<option
value=””>Select a member first…</option>’);
$(‘#modal_deposit_amount’).val(‘’);
$(‘#modal_loan_principal’).val(‘0.00’);
$(‘#modal_loan_interest’).val(‘0.00’);
$(‘#addPaymentModal’).modal(‘show’);
</script>
</body>
</html>