'Method not allowed']); exit(); } $data = json_decode(file_get_contents('php://input'), true); // Basic validation $required_fields = ['student_number', 'first_name', 'last_name', 'date_of_birth', 'gender', 'admission_date']; foreach ($required_fields as $field) { if (empty($data[$field])) { http_response_code(400); echo json_encode(['error' => "Missing required field: {$field}"]); exit(); } } $db->beginTransaction(); try { // 1. Create Subledger Entry $subledger_id = UUID::v4(); $student_id = UUID::v4(); // Generate student ID in advance $stmt = $db->prepare( 'INSERT INTO subledgers (id, subledger_type, reference_id) VALUES (?, ?, ?)' ); $stmt->execute([$subledger_id, 'Student', $student_id]); // 2. Create Student Entry $stmt = $db->prepare( 'INSERT INTO students (id, student_number, first_name, middle_name, last_name, date_of_birth, gender, admission_date, subledger_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)' ); $stmt->execute([ $student_id, $data['student_number'], $data['first_name'], $data['middle_name'] ?? null, $data['last_name'], $data['date_of_birth'], $data['gender'], $data['admission_date'], $subledger_id ]); $db->commit(); // Fetch the created student to return it $stmt = $db->prepare('SELECT * FROM students WHERE id = ?'); $stmt->execute([$student_id]); $student = $stmt->fetch(PDO::FETCH_ASSOC); http_response_code(201); echo json_encode($student); } catch (Exception $e) { $db->rollBack(); http_response_code(500); // Check for unique constraint violation for student_number if ($e->errorInfo[1] == 1062) { // 1062 is the MySQL error code for duplicate entry echo json_encode(['error' => 'A student with this student number already exists.', 'details' => $e->getMessage()]); } else { echo json_encode(['error' => 'Database error occurred.', 'details' => $e->getMessage()]); } }