DiploMaster/api/importar_csv.php

68 lines
2.0 KiB
PHP

<?php
header('Content-Type: application/json');
require '../includes/config.php';
if (!is_logged_in()) {
http_response_code(401);
echo json_encode(['success' => false, 'error' => 'No autenticado']);
exit;
}
$data = json_decode(file_get_contents('php://input'), true);
$alumnos = $data['alumnos'] ?? [];
if (empty($alumnos)) {
http_response_code(400);
echo json_encode(['success' => false, 'error' => 'No se enviaron alumnos']);
exit;
}
// Paso 1: Validar todos los cursos
$errores = [];
$profesorId = $_SESSION['profesor']['id'] ?? null;
foreach ($alumnos as $index => $alumno) {
$nombreCurso = trim($alumno['nombreCurso']);
$tipoCurso = trim($alumno['tipoCurso']);
$stmt = $pdo->prepare("SELECT id FROM cursos WHERE nombre = ? AND tipo = ? AND profesor_id = ?");
$stmt->execute([$nombreCurso, $tipoCurso, $profesorId]);
$curso = $stmt->fetch();
if (!$curso) {
$errores[] = "El curso \"{$nombreCurso}\" de tipo \"{$tipoCurso}\" en {$alumno['nombre']} ({$alumno['email']}) es inválido.";
} else {
$alumnos[$index]['curso_id'] = $curso['id']; // Guardamos para usar después
}
}
if (!empty($errores)) {
echo json_encode([
'success' => false,
'error' => "Error en cursos: " . count($errores) . " conflictos encontrados",
'conflicts' => $errores
]);
exit;
}
// Paso 2: Insertar alumnos
try {
$pdo->beginTransaction();
foreach ($alumnos as $a) {
$stmt = $pdo->prepare("INSERT INTO alumnos (nombre, email, telefono) VALUES (?, ?, ?)");
$stmt->execute([$a['nombre'], $a['email'], $a['telefono'] ?? null]);
$alumnoId = $pdo->lastInsertId();
$stmt = $pdo->prepare("INSERT INTO alumnos_cursos (alumno_id, curso_id, estado) VALUES (?, ?, 'cursando')");
$stmt->execute([$alumnoId, $a['curso_id']]);
}
$pdo->commit();
echo json_encode(['success' => true, 'message' => 'Todos los alumnos fueron importados correctamente.']);
} catch (PDOException $e) {
$pdo->rollBack();
http_response_code(500);
echo json_encode(['success' => false, 'error' => 'Error al guardar en la base de datos: ' . $e->getMessage()]);
}