133 lines
5.2 KiB
PHP
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'; ?>
|