X7ROOT File Manager
Current Path:
/home/u126090504/domains/oca.org.in/public_html/admin
home
/
u126090504
/
domains
/
oca.org.in
/
public_html
/
admin
/
📁
..
📄
achievers.php
(13.81 KB)
📄
admissions.php
(5.67 KB)
📄
banners.php
(7.18 KB)
📄
change_password.php
(3.54 KB)
📄
contacts.php
(3.83 KB)
📄
dashboard.php
(9.73 KB)
📄
downloads.php
(4.91 KB)
📄
export_franchise.php
(930 B)
📄
faculty.php
(13.27 KB)
📄
forgot_password.php
(6.52 KB)
📄
franchise.php
(7.28 KB)
📄
gallery.php
(3.08 KB)
📄
governing-body-manage.php
(9.12 KB)
📄
grievance-update.php
(1003 B)
📄
grievance-view.php
(5.32 KB)
📄
grievances.php
(5.79 KB)
📁
includes
📄
index.php
(82 B)
📄
login.php
(6.59 KB)
📄
logout.php
(102 B)
📄
manage_albums.php
(2.28 KB)
📄
manage_media.php
(3.02 KB)
📄
manage_photos.php
(5.66 KB)
📄
manage_videos.php
(3.62 KB)
📄
new_password.php
(3.9 KB)
📄
notice.php
(16.36 KB)
📄
notices.php
(8.24 KB)
📄
payments.php
(15.23 KB)
📁
phpmailer
📄
popup.php
(10.68 KB)
📄
reset_password.php
(2.27 KB)
📄
secure_session.php
(1000 B)
📄
settings.php
(5.21 KB)
📄
submit-grievance.php
(4.97 KB)
📄
testimonials.php
(10.25 KB)
📄
update_status.php
(1.29 KB)
📄
upi_settings.php
(1.52 KB)
Editing: payments.php
<?php include '../config.php'; $result = $conn->query("SELECT * FROM payments ORDER BY id DESC"); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Payment Records</title> <meta name="viewport" content="width=device-width, initial-scale=1" /> <!-- Bootstrap + DataTables --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"> <link rel="stylesheet" href="https://cdn.datatables.net/1.13.7/css/dataTables.bootstrap5.min.css"> <link rel="stylesheet" href="https://cdn.datatables.net/buttons/2.4.2/css/buttons.bootstrap5.min.css"> <style> :root{ --brand:#08057A; } body{ background: linear-gradient(180deg,#f8f9ff 0%,#eef3ff 40%,#f8f9fa 100%); font-family: system-ui,-apple-system,"Segoe UI",Roboto,Inter,"Helvetica Neue",Arial; } .card{ border:0;border-radius:18px;box-shadow:0 8px 24px rgba(15,23,42,.08); } .card-header{ border-top-left-radius:18px!important;border-top-right-radius:18px!important; background:var(--brand);padding:18px 20px;color:#fff; } .brand-title{font-weight:700;letter-spacing:.2px;margin:0;color:#fff} .btn-light-soft{background:#fff;border:1px solid rgba(99,102,241,.15)} .table>thead.table-dark th{background:#0b1220!important;border-color:#0b1220!important} .table td,.table th{vertical-align:middle} /* Summary cards – brand color + white text */ .metric{ border-radius:16px;background:var(--brand); border:1px solid rgba(15,23,42,.06); box-shadow:0 6px 16px rgba(15,23,42,.06); color:#fff; } .metric h6{margin:0;font-weight:600;color:#e0e7ff;font-size:.9rem} .metric .value{font-size:1.4rem;font-weight:800;color:#fff} /* Status select pills */ .status-dropdown{border:0;font-weight:600;border-radius:999px!important;padding:.25rem .75rem!important;width:130px;text-align:center;margin:0 auto} .status-pending{background:#ff9800;color:#fff} .status-paid{background:#2e7d32;color:#fff} .status-failed{background:#d32f2f;color:#fff} .status-cancelled{background:#616161;color:#fff} /* Filters row */ thead .filters th{ background:var(--brand); } thead .filters th input, thead .filters th select{ width:100%;height:36px;padding:4px 8px;border:1px solid #e2e8f0;border-radius:8px;font-size:.9rem } .dt-buttons{margin-bottom:14px} /* Date range bar */ .range-bar{ background:#ffffff;border:1px solid rgba(15,23,42,.08); border-radius:12px;padding:10px 12px;margin-bottom:10px; box-shadow:0 4px 12px rgba(15,23,42,.06); } .range-bar label{font-weight:600;color:#334155;margin-right:6px} .range-bar input{height:36px} </style> </head> <body> <div class="container py-5"> <div class="card"> <div class="card-header d-flex justify-content-between align-items-center"> <h3 class="brand-title">Payment Records</h3> <a href="dashboard.php" class="btn btn-light btn-sm btn-light-soft">← Go to Dashboard</a> </div> <div class="card-body"> <?php if (!empty($_GET['updated'])): ?> <div class="alert alert-success alert-dismissible fade show text-center" role="alert"> ✅ Payment updated successfully! <button type="button" class="btn-close" data-bs-dismiss="alert"></button> </div> <?php endif; ?> <!-- Summary Metrics --> <div class="row g-3 mb-3"> <div class="col-12 col-md-4"> <div class="p-3 metric d-flex justify-content-between align-items-center"> <h6>Total Students (visible)</h6> <div id="m-students" class="value">0</div> </div> </div> <div class="col-12 col-md-4"> <div class="p-3 metric d-flex justify-content-between align-items-center"> <h6>Paid Amount (visible)</h6> <div id="m-amount" class="value">₹0.00</div> </div> </div> <div class="col-12 col-md-4"> <div class="p-3 metric d-flex justify-content-between align-items-center"> <h6>Records (visible)</h6> <div id="m-records" class="value">0</div> </div> </div> </div> <!-- Date range filter --> <div class="range-bar d-flex flex-wrap align-items-center gap-2"> <label>From:</label> <input type="date" id="fromDate" class="form-control" style="max-width:190px"> <label class="ms-2">To:</label> <input type="date" id="toDate" class="form-control" style="max-width:190px"> <button id="clearRange" class="btn btn-outline-secondary btn-sm ms-2">Clear</button> </div> <div class="table-responsive"> <table id="paymentsTable" class="table table-bordered table-striped table-hover align-middle w-100"> <thead class="table-dark text-center"> <tr> <th>ID</th> <th>Student Name</th> <th>Father's Name</th> <th>DOB</th> <th>Age</th> <th>School/College</th> <th>Course</th> <th>Mobile</th> <th>Address</th> <th>Roll No</th> <th>Payment Type</th> <th>Amount</th> <th>Status</th> <th>Transaction ID</th> <th>Payment Mode</th> <th>Date</th> </tr> <!-- Header filters --> <tr class="filters"> <th><input type="text" placeholder="Search ID"></th> <th><input type="text" placeholder="Search Student"></th> <th><input type="text" placeholder="Search Father"></th> <th><input type="text" placeholder="YYYY-MM-DD"></th> <th><input type="text" placeholder="Age"></th> <th><input type="text" placeholder="Search School"></th> <th><input type="text" placeholder="Search Course"></th> <th><input type="text" placeholder="Search Mobile"></th> <th><input type="text" placeholder="Search Address"></th> <th><input type="text" placeholder="Search Roll"></th> <th> <select> <option value="">All</option> <option>Admission Fee</option> <option>Installment</option> </select> </th> <th><input type="text" placeholder="e.g. 1000"></th> <th> <select> <option value="">All</option> <option>Pending</option> <option>Paid</option> <option>Failed</option> <option>Cancelled</option> </select> </th> <th><input type="text" placeholder="Search Txn"></th> <th> <select> <option value="">All</option> <option>UPI</option> <option>Paytm</option> <option>Cash</option> <option>Card</option> </select> </th> <th><input type="text" placeholder="YYYY-MM-DD"></th> </tr> </thead> <tbody> <?php while($row = $result->fetch_assoc()): ?> <?php // Normalize status: anything invalid/missing => Pending $allowed = ['Pending','Paid','Failed','Cancelled']; $status = in_array($row['status'], $allowed, true) ? $row['status'] : 'Pending'; // Pick pill class $sClass = 'status-pending'; if ($status==='Paid') $sClass='status-paid'; elseif ($status==='Failed') $sClass='status-failed'; elseif ($status==='Cancelled') $sClass='status-cancelled'; ?> <!-- Keep numeric amount & normalized status in data-* for robust totals --> <tr data-amount="<?= (float)$row['amount'] ?>" data-status="<?= htmlspecialchars($status) ?>"> <td><?= (int)$row['id'] ?></td> <td><?= htmlspecialchars($row['student_name']) ?></td> <td><?= htmlspecialchars($row['father_name']) ?></td> <td><?= htmlspecialchars($row['dob']) ?></td> <td><?= htmlspecialchars($row['age']) ?></td> <td><?= htmlspecialchars($row['school']) ?></td> <td><?= htmlspecialchars($row['course']) ?></td> <td><?= htmlspecialchars($row['mobile']) ?></td> <td><?= htmlspecialchars($row['address']) ?></td> <td><?= htmlspecialchars($row['rollno']) ?></td> <td><?= htmlspecialchars($row['payment_type']) ?></td> <td class="text-success fw-bold">₹<?= htmlspecialchars($row['amount']) ?></td> <td class="text-center"> <select class="form-select form-select-sm status-dropdown <?= $sClass ?>" data-id="<?= (int)$row['id'] ?>"> <option value="Pending" <?= $status=='Pending'?'selected':'' ?>>Pending</option> <option value="Paid" <?= $status=='Paid'?'selected':'' ?>>Paid</option> <option value="Failed" <?= $status=='Failed'?'selected':'' ?>>Failed</option> <option value="Cancelled" <?= $status=='Cancelled'?'selected':'' ?>>Cancelled</option> </select> </td> <td><?= htmlspecialchars($row['transaction_id']) ?></td> <td><?= htmlspecialchars($row['payment_mode']) ?></td> <td><?= htmlspecialchars($row['created_at']) ?></td> </tr> <?php endwhile; ?> </tbody> </table> </div> </div> </div> </div> <!-- Scripts --> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script> <script src="https://code.jquery.com/jquery-3.7.0.min.js"></script> <script src="https://cdn.datatables.net/1.13.7/js/jquery.dataTables.min.js"></script> <script src="https://cdn.datatables.net/1.13.7/js/dataTables.bootstrap5.min.js"></script> <script src="https://cdn.datatables.net/buttons/2.4.2/js/dataTables.buttons.min.js"></script> <script src="https://cdn.datatables.net/buttons/2.4.2/js/buttons.bootstrap5.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/pdfmake.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/vfs_fonts.js"></script> <script src="https://cdn.datatables.net/buttons/2.4.2/js/buttons.html5.min.js"></script> <script src="https://cdn.datatables.net/buttons/2.4.2/js/buttons.print.min.js"></script> <script> $(function(){ const currencyIN = new Intl.NumberFormat('en-IN', { style: 'currency', currency: 'INR' }); const table = $('#paymentsTable').DataTable({ order: [[0,'desc']], dom: 'Bfrtip', buttons: [ { extend:'excelHtml5', title:'Payments_Report', exportOptions:{columns:':visible'} }, { extend:'pdfHtml5', title:'Payments_Report', orientation:'landscape', pageSize:'A4', exportOptions:{columns:':visible'}, messageTop: function () { const m = getMetrics(); return 'Summary (visible): Total Students = ' + m.students + ' | Paid Amount = ' + currencyIN.format(m.paidAmount); } }, { extend:'print', title:'Payments Report', exportOptions:{columns:':visible'}, messageTop: function(){ const m = getMetrics(); return 'Summary (visible): Total Students = ' + m.students + ' | Paid Amount = ' + currencyIN.format(m.paidAmount); } }, { extend:'csvHtml5', title:'Payments_Report', exportOptions:{columns:':visible'} } ] }); // -------- Date range filter (all pages) -------- $.fn.dataTable.ext.search.push(function(settings, data, dataIndex){ const from = $('#fromDate').val(); const to = $('#toDate').val(); if(!from && !to) return true; // date column text (last col) const rowNode = table.row(dataIndex).node(); const dateText = $('td:last', rowNode).text().trim(); // "YYYY-MM-DD HH:MM:SS" if(!dateText) return false; const parts = dateText.split(' '); const d = (parts[0] || '').split('-').map(Number); const t = (parts[1] || '00:00:00').split(':').map(Number); const rowDate = new Date(d[0], (d[1]||1)-1, d[2]||1, t[0]||0, t[1]||0, t[2]||0); const fromD = from ? new Date(from+'T00:00:00') : null; const toD = to ? new Date(to+'T23:59:59') : null; if (fromD && rowDate < fromD) return false; if (toD && rowDate > toD) return false; return true; }); $('#fromDate, #toDate').on('change', function(){ table.draw(); refreshMetricsUI(); }); $('#clearRange').on('click', function(){ $('#fromDate').val(''); $('#toDate').val(''); table.draw(); refreshMetricsUI(); }); // -------- Header filters -------- $('#paymentsTable thead tr.filters th').each(function(i){ const input = $('input, select', this); if (!input.length) return; $(input).on('keyup change', function(){ table.column(i).search(this.value).draw(); }); }); // -------- Status AJAX update + pill color + metrics refresh -------- $(document).on('change','.status-dropdown',function(){ const id = $(this).data('id'); const status = $(this).val(); const el = $(this); $.post('update_status.php',{id:id, status:status},function(){ el.removeClass('status-pending status-paid status-failed status-cancelled'); if (status==='Paid') el.addClass('status-paid'); else if (status==='Failed') el.addClass('status-failed'); else if (status==='Cancelled') el.addClass('status-cancelled'); else el.addClass('status-pending'); // update the row's data-status for correct totals const row = el.closest('tr').get(0); if (row) row.dataset.status = status; table.draw(false); // re-run filters -> metrics refreshMetricsUI(); }).fail(function(){ alert('❌ Error updating status'); }); }); // -------- Metrics (ALL filtered rows across pages) -------- function getMetrics(){ const idxes = table.rows({search:'applied'}).indexes(); // all filtered rows (all pages) let paidAmount = 0; idxes.each(function(idx){ const node = table.row(idx).node(); const status = (node.dataset.status || '').trim(); const amt = parseFloat(node.dataset.amount || '0'); if (status === 'Paid' && !isNaN(amt)) paidAmount += amt; }); const records = idxes.length; const students = table.column(1,{search:'applied'}).data().count(); return { paidAmount, records, students }; } function refreshMetricsUI(){ const m = getMetrics(); $('#m-amount').text(currencyIN.format(m.paidAmount)); $('#m-records').text(m.records); $('#m-students').text(m.students); } table.on('draw', refreshMetricsUI); refreshMetricsUI(); }); </script> </body> </html>
Upload File
Create Folder