37970-vm/bulk-upload.php
Flatlogic Bot 57a1969d5e v4
2026-01-30 14:56:15 +00:00

133 lines
5.2 KiB
PHP

<?php
require_once __DIR__ . '/db/config.php';
session_start();
// Auth Check
if (!isset($_SESSION['user_id']) || $_SESSION['role'] !== 'Admin') {
header('Location: login.php');
exit;
}
$db = db();
$school_id = $_SESSION['school_id'];
$pageTitle = 'Bulk Upload | SOMS';
$message = '';
$error = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['csv_file'])) {
$file = $_FILES['csv_file'];
if ($file['error'] !== UPLOAD_ERR_OK) {
$error = "Error uploading file.";
} else {
$handle = fopen($file['tmp_name'], 'r');
if ($handle !== FALSE) {
// Skip header row
fgetcsv($handle);
$success_count = 0;
$fail_count = 0;
$db->beginTransaction();
try {
$stmt = $db->prepare("INSERT INTO learners (full_name, grade, student_id, parent_email, school_id) VALUES (?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE full_name = VALUES(full_name), grade = VALUES(grade), parent_email = VALUES(parent_email)");
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
if (count($data) >= 3) {
$full_name = trim($data[0]);
$grade = trim($data[1]);
$student_id = trim($data[2]);
$parent_email = isset($data[3]) ? trim($data[3]) : null;
if (!empty($full_name) && !empty($grade) && !empty($student_id)) {
$stmt->execute([$full_name, $grade, $student_id, $parent_email, $school_id]);
$success_count++;
} else {
$fail_count++;
}
} else {
$fail_count++;
}
}
$db->commit();
$message = "Successfully imported $success_count learners. (Skipped/Failed: $fail_count)";
} catch (Exception $e) {
$db->rollBack();
$error = "Database error: " . $e->getMessage();
}
fclose($handle);
} else {
$error = "Could not open the uploaded file.";
}
}
}
include 'includes/header.php';
?>
<div class="container pb-5">
<div class="row mb-4">
<div class="col-12">
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="admin.php">Dashboard</a></li>
<li class="breadcrumb-item active" aria-current="page">Bulk Upload</li>
</ol>
</nav>
<h2 class="h4 mb-1">Bulk Upload Learners</h2>
<p class="text-muted small">Upload a CSV file to add multiple learners at once.</p>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="card shadow-sm border-0">
<div class="card-body">
<?php if ($message): ?>
<div class="alert alert-success small"><?= $message ?></div>
<?php endif; ?>
<?php if ($error): ?>
<div class="alert alert-danger small"><?= $error ?></div>
<?php endif; ?>
<form action="bulk-upload.php" method="POST" enctype="multipart/form-data">
<div class="mb-4">
<label class="form-label fw-bold">Select CSV File</label>
<input type="file" name="csv_file" class="form-control" accept=".csv" required>
<div class="form-text small">
Format: <code>Full Name, Grade, Student ID, Parent Email (optional)</code>.
</div>
</div>
<div class="d-grid">
<button type="submit" class="btn btn-primary">
<i class="bi bi-cloud-arrow-up me-2"></i> Upload and Process
</button>
</div>
</form>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card shadow-sm border-0 bg-light">
<div class="card-body">
<h5 class="fw-bold">CSV Template Guide</h5>
<p class="small text-muted">Your CSV file should look like this:</p>
<pre class="bg-white p-3 border rounded small">Full Name,Grade,Student ID,Parent Email
John Doe,10,SOW-101,parent@example.com
Jane Smith,11,SOW-102,jane_parent@gmail.com
Bob Brown,10,SOW-103,</pre>
<ul class="small text-muted">
<li>The first line is treated as a header and skipped.</li>
<li>Existing Student IDs will be updated.</li>
<li>Parent Email is used for automated performance notifications.</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<?php include 'includes/footer.php'; ?>