Your IP : 216.73.216.79


Current Path : /var/www/html/ains/frontend/controllers/
Upload File :
Current File : /var/www/html/ains/frontend/controllers/ReportController.php

<?php

namespace frontend\controllers;

use Yii;
use yii\web\Controller;
use frontend\models\FrontendUser;
use yii\db\Expression;
use yii\db\Query;

class ReportController extends Controller {

    public function actionStudentLowRecord($search_state = '', $search_ppd = '', $search_school = '', $search_school_type = '', $search_school_id = '', $search_class_year = '', $search_class_name = '', $search_student_name = '', $search_start_date = '', $search_end_date = '', $search_record_max = '0') {

        if (empty($search_record_max))
            $search_record_max = 0;

        if (empty($search_start_date))
            $search_start_date = date('Y-m-01');

        if (empty($search_end_date))
            $search_end_date = date('Y-m-d');

        $query = FrontendUser::find()
                ->select(['frontend_user.*', 'COUNT(reading_record.record_id) AS sum_books'])
                ->innerjoin('school', 'school.id=frontend_user.user_school')
                ->leftJoin('reading_record',
                        'frontend_user.id=reading_record.record_student_id AND 
                         DATE(reading_record.created_at) >= :dateFrom AND DATE(reading_record.created_at) <= :dateTo',
                        [
                            ':dateFrom' => $search_start_date,
                            ':dateTo' => $search_end_date,
                        ]
                )
                ->where(['=', 'role', 'murid']);

        if (!empty($search_state)) {
            $query->andwhere(['=', 'school.state', $search_state]);
        }

        if (!empty($search_ppd)) {
            $query->andwhere(['LIKE', 'school.ppd', $search_ppd]);
        }

        if (!empty($search_school)) {
            $query->andwhere(['LIKE', 'school.name', $search_school]);
        }

        if (!empty($search_school_type)) {
            $query->andwhere(['=', 'school.type', $search_school_type]);
        }

        if (!empty($search_school_id)) {
            $query->andwhere(['=', 'frontend_user.user_school', $search_school_id]);
        }

        if (!empty($search_class_year)) {
            $query->andwhere(['=', 'frontend_user.user_class_year', $search_class_year]);
        }

        if (!empty($search_class_name)) {
            $query->andwhere(['=', 'frontend_user.user_class_name', $search_class_name]);
        }

        if (!empty($search_student_name)) {
            $query->andwhere(['LIKE', 'frontend_user.fullname', $search_student_name]);
        }

        $query->having(['<=', 'sum_books', $search_record_max]);
        $query->groupBy('frontend_user.id');
        $query->orderBy(['sum_books' => SORT_ASC]);

        $response = Yii::$app->response;
        $response->format = \yii\web\Response::FORMAT_RAW;
        $response->headers->set('Content-Type', 'text/csv; charset=UTF-8');
        $response->headers->set('Content-Disposition', 'attachment; filename="Senarai Murid Dengan Rekod Bacaan Rendah.csv"');
        $output = fopen('php://output', 'w');

        fwrite($output, "\xEF\xBB\xBF");

        fputcsv($output, [
            'NAMA',
            'ID DELIMA',
            'SEKOLAH',
            'JUMLAH REKOD'
        ]);

        $model = $query->all();
        if (!empty($model)) {
            foreach ($model as $row) {
                fputcsv($output, [
                    strtoupper(\frontend\models\FrontendUser::getName($row->id)),
                    $row->username,
                    strtoupper($row->school->name),
                    number_format($row->sum_books),
                ]);
            }
        }
        fclose($output);
        return $response;
    }

    public function actionStudentRecord($search_state = '', $search_ppd = '', $search_school = '', $search_school_type = '', $search_school_id = '', $search_class_year = '', $search_class_name = '', $search_student_name = '', $search_start_date = '', $search_end_date = '') {

        if (empty($search_start_date))
            $search_start_date = date('Y-m-01');

        if (empty($search_end_date))
            $search_end_date = date('Y-m-d');

        $query = FrontendUser::find()
                ->select(['frontend_user.*', 'COUNT(reading_record.record_id) AS sum_books'])
                ->innerjoin('school', 'school.id=frontend_user.user_school')
                ->leftJoin('reading_record',
                        'frontend_user.id=reading_record.record_student_id AND 
                         DATE(reading_record.created_at) >= :dateFrom AND DATE(reading_record.created_at) <= :dateTo',
                        [
                            ':dateFrom' => $search_start_date,
                            ':dateTo' => $search_end_date,
                        ]
                )
                ->where(['=', 'role', 'murid']);

        if (!empty($search_state)) {
            $query->andwhere(['=', 'school.state', $search_state]);
        }

        if (!empty($search_ppd)) {
            $query->andwhere(['LIKE', 'school.ppd', $search_ppd]);
        }

        if (!empty($search_school)) {
            $query->andwhere(['LIKE', 'school.name', $search_school]);
        }

        if (!empty($search_school_type)) {
            $query->andwhere(['=', 'school.type', $search_school_type]);
        }

        if (!empty($search_school_id)) {
            $query->andwhere(['=', 'frontend_user.user_school', $search_school_id]);
        }

        if (!empty($search_class_year)) {
            $query->andwhere(['=', 'frontend_user.user_class_year', $search_class_year]);
        }

        if (!empty($search_class_name)) {
            $query->andwhere(['=', 'frontend_user.user_class_name', $search_class_name]);
        }

        if (!empty($search_student_name)) {
            $query->andwhere(['LIKE', 'frontend_user.fullname', $search_student_name]);
        }

        $query->groupBy('frontend_user.id');
        $query->orderBy(['sum_books' => SORT_DESC]);

        $response = Yii::$app->response;
        $response->format = \yii\web\Response::FORMAT_RAW;
        $response->headers->set('Content-Type', 'text/csv; charset=UTF-8');
        $response->headers->set('Content-Disposition', 'attachment; filename="Laporan Rekod Bacaan Murid.csv"');
        $output = fopen('php://output', 'w');

        fwrite($output, "\xEF\xBB\xBF");

        fputcsv($output, [
            'NAMA',
            'ID DELIMA',
            'SEKOLAH',
            'JUMLAH REKOD'
        ]);

        $model = $query->all();
        if (!empty($model)) {
            foreach ($model as $row) {
                fputcsv($output, [
                    strtoupper(\frontend\models\FrontendUser::getName($row->id)),
                    $row->username,
                    strtoupper($row->school->name),
                    number_format($row->sum_books),
                ]);
            }
        }
        fclose($output);
        return $response;
    }

    public function actionAverageRecordState($search_school_type = '', $search_state = '', $search_start_date = '', $search_end_date = '') {

        if (empty($search_start_date))
            $search_start_date = date('Y-m-01');

        if (empty($search_end_date))
            $search_end_date = date('Y-m-d');

        $studentQuery = (new Query())->select(['school_id' => 'fu.user_school', 'total_student' => new Expression('COUNT(DISTINCT fu.id)')])
                        ->from(['fu' => 'frontend_user'])->groupBy(['fu.user_school'])->where(['=', 'fu.role', 'murid']);
        $recordQuery = (new Query())->select(['school_id' => 'fu.user_school', 'total_record' => new Expression('COUNT(rr.record_id)')])
                        ->from(['rr' => 'reading_record'])->innerJoin(['fu' => 'frontend_user'], 'fu.id = rr.record_student_id');

        if (!empty($search_start_date)) {
            $recordQuery->andWhere(['>=', 'rr.created_at', $search_start_date . ' 00:00:00']);
        }

        if (!empty($search_end_date)) {
            $recordQuery->andWhere(['<=', 'rr.created_at', $search_end_date . ' 23:59:59']);
        }

        $recordQuery->groupBy(['fu.user_school']);

        $query = (new Query())->select([
                            'state_code' => 's.state',
                            'state_name' => 'r.descr',
                            'total_school' => new Expression('COUNT(DISTINCT s.id)'),
                            'total_student' => new Expression('COALESCE(SUM(st.total_student), 0)'),
                            'total_record' => new Expression('COALESCE(SUM(rd.total_record), 0)'),
                            'average_record' => new Expression(
                                    'CASE 
                                        WHEN COALESCE(SUM(st.total_student), 0) = 0 
                                        THEN 0
                                        ELSE 
                                            COALESCE(SUM(rd.total_record), 0) 
                                            / COALESCE(SUM(st.total_student), 0)
                                    END'
                            ),
                        ])->from(['s' => 'school'])
                        ->leftJoin(['r' => 'ref'], 'r.code = s.state')
                        ->leftJoin(['st' => $studentQuery], 'st.school_id = s.id')
                        ->leftJoin(['rd' => $recordQuery], 'rd.school_id = s.id')
                        ->where(['!=', 'r.code', 'Tidak Berkenaan'])->andwhere(['=', 'r.cat', 'STATE']);

        if (!empty($search_school_type)) {
            $query->andWhere(['s.type' => $search_school_type]);
        }

        if (!empty($search_state)) {
            $query->andWhere(['LIKE', 'r.descr', $search_state]);
        }

        $query->groupBy(['s.state', 'r.descr']);
        $query->orderBy(['average_record' => SORT_DESC]);

        $response = Yii::$app->response;
        $response->format = \yii\web\Response::FORMAT_RAW;
        $response->headers->set('Content-Type', 'text/csv; charset=UTF-8');
        $response->headers->set('Content-Disposition', 'attachment; filename=" Laporan Purata Bacaan Mengikut Negeri.csv"');
        $output = fopen('php://output', 'w');

        fwrite($output, "\xEF\xBB\xBF");

        fputcsv($output, [
            'NEGERI',
            'JUMLAH SEKOLAH',
            'JUMLAH MURID',
            'JUMLAH REKOD BACAAN',
            'PURATA REKOD'
        ]);

        $model = $query->all();
        if (!empty($model)) {
            foreach ($model as $row) {
                fputcsv($output, [
                    $row['state_name'],
                    number_format($row['total_school']),
                    number_format($row['total_student']),
                    number_format($row['total_record']),
                    number_format((float) $row['average_record'], 2)
                ]);
            }
        }
        fclose($output);
        return $response;
    }

    public function actionAverageRecordPpd($search_school_type = '', $search_state = '', $search_ppd = '', $search_start_date = '', $search_end_date = '') {

        if (empty($search_start_date))
            $search_start_date = date('Y-m-01');

        if (empty($search_end_date))
            $search_end_date = date('Y-m-d');

        $studentQuery = (new Query())->select(['school_id' => 'fu.user_school', 'total_student' => new Expression('COUNT(DISTINCT fu.id)')])
                        ->from(['fu' => 'frontend_user'])->groupBy(['fu.user_school'])->where(['=', 'fu.role', 'murid']);
        $recordQuery = (new Query())->select(['school_id' => 'fu.user_school', 'total_record' => new Expression('COUNT(rr.record_id)')])
                        ->from(['rr' => 'reading_record'])->innerJoin(['fu' => 'frontend_user'], 'fu.id = rr.record_student_id');

        if (!empty($search_start_date)) {
            $recordQuery->andWhere(['>=', 'rr.created_at', $search_start_date . ' 00:00:00']);
        }

        if (!empty($search_end_date)) {
            $recordQuery->andWhere(['<=', 'rr.created_at', $search_end_date . ' 23:59:59']);
        }

        $recordQuery->groupBy(['fu.user_school']);

        $query = (new Query())->select([
                            'ppd_code' => 's.ppd',
                            'ppd_name' => 'r.descr',
                            'total_school' => new Expression('COUNT(DISTINCT s.id)'),
                            'total_student' => new Expression('COALESCE(SUM(st.total_student), 0)'),
                            'total_record' => new Expression('COALESCE(SUM(rd.total_record), 0)'),
                            'average_record' => new Expression(
                                    'CASE 
            WHEN COALESCE(SUM(st.total_student), 0) = 0 
            THEN 0
            ELSE 
                COALESCE(SUM(rd.total_record), 0) 
                / COALESCE(SUM(st.total_student), 0)
        END'
                            ),
                        ])->from(['s' => 'school'])
                        ->leftJoin(['r' => 'ref'], 'r.code = s.ppd')
                        ->leftJoin(['st' => $studentQuery], 'st.school_id = s.id')
                        ->leftJoin(['rd' => $recordQuery], 'rd.school_id = s.id')
                        ->where(['!=', 'r.code', 'Tidak Berkenaan'])->andwhere(['=', 'r.cat', 'PPD']);

        if (!empty($search_school_type)) {
            $query->andWhere(['s.type' => $search_school_type]);
        }

        if (!empty($search_ppd)) {
            $query->andWhere(['LIKE', 'r.descr', $search_ppd]);
        }

        if (!empty($search_state)) {
            $state_id = \backend\modules\refdynawebv2\models\Ref::getparentid($search_state, 'STATE');
            $query->andWhere(['=', 'r.param1', $state_id]);
        }

        $query->groupBy(['s.ppd', 'r.descr']);
        $query->orderBy(['average_record' => SORT_DESC]);

        $response = Yii::$app->response;
        $response->format = \yii\web\Response::FORMAT_RAW;
        $response->headers->set('Content-Type', 'text/csv; charset=UTF-8');
        $response->headers->set('Content-Disposition', 'attachment; filename=" Laporan Purata Bacaan Mengikut PPD.csv"');
        $output = fopen('php://output', 'w');

        fwrite($output, "\xEF\xBB\xBF");

        fputcsv($output, [
            'PPD',
            'JUMLAH SEKOLAH',
            'JUMLAH MURID',
            'JUMLAH REKOD BACAAN',
            'PURATA REKOD'
        ]);

        $model = $query->all();
        if (!empty($model)) {
            foreach ($model as $row) {
                fputcsv($output, [
                    $row['ppd_name'],
                    number_format($row['total_school']),
                    number_format($row['total_student']),
                    number_format($row['total_record']),
                    number_format((float) $row['average_record'], 2)
                ]);
            }
        }
        fclose($output);
        return $response;
    }

    public function actionAverageRecordSchool($search_school_type = '', $search_state = '', $search_ppd = '', $search_school_name = '', $search_start_date = '', $search_end_date = '') {

        if (empty($search_start_date))
            $search_start_date = date('Y-m-01');

        if (empty($search_end_date))
            $search_end_date = date('Y-m-d');

        $studentQuery = (new Query())->select(['school_id' => 'fu.user_school', 'total_student' => new Expression('COUNT(DISTINCT fu.id)')])
                        ->from(['fu' => 'frontend_user'])->groupBy(['fu.user_school'])->where(['=', 'fu.role', 'murid']);

        $recordQuery = (new Query())->select(['school_id' => 'fu.user_school', 'total_record' => new Expression('COUNT(rr.record_id)')])
                        ->from(['rr' => 'reading_record'])->innerJoin(['fu' => 'frontend_user'], 'fu.id = rr.record_student_id');

        if (!empty($search_start_date)) {
            $recordQuery->andWhere(['>=', 'rr.created_at', $search_start_date . ' 00:00:00']);
        }

        if (!empty($search_end_date)) {
            $recordQuery->andWhere(['<=', 'rr.created_at', $search_end_date . ' 23:59:59']);
        }

        $recordQuery->groupBy(['fu.user_school']);

        $query = (new Query())->select([
                    'school_id' => 's.id',
                    'school_name' => 's.name',
                    'school_type' => 's.type',
                    'state' => 's.state',
                    'total_student' => new Expression('COALESCE(st.total_student,0)'),
                    'total_record' => new Expression('COALESCE(rd.total_record,0)'),
                    'average_record' => new Expression(
                            'CASE
                                WHEN COALESCE(st.total_student,0) = 0
                                THEN 0
                                ELSE
                                    COALESCE(rd.total_record,0)/st.total_student
                                END'
                    ),
                ])->from(['s' => 'school'])
                ->leftJoin(['st' => $studentQuery], 'st.school_id = s.id')
                ->leftJoin(['rd' => $recordQuery], 'rd.school_id = s.id');

        if (!empty($search_school_type)) {
            $query->andWhere(['s.type' => $search_school_type]);
        }

        if (!empty($search_school_name)) {
            $query->andWhere(['LIKE', 's.name', $search_school_name]);
        }

        if (!empty($search_ppd)) {
            $query->andWhere(['LIKE', 's.ppd', $search_ppd]);
        }

        if (!empty($search_state)) {
            $query->andWhere(['=', 's.state', $search_state]);
        }

        $query->groupBy(['s.id']);
        $query->orderBy(['average_record' => SORT_DESC]);

        $response = Yii::$app->response;
        $response->format = \yii\web\Response::FORMAT_RAW;
        $response->headers->set('Content-Type', 'text/csv; charset=UTF-8');
        $response->headers->set('Content-Disposition', 'attachment; filename=" Laporan Purata Bacaan Mengikut Sekolah.csv"');
        $output = fopen('php://output', 'w');

        fwrite($output, "\xEF\xBB\xBF");

        fputcsv($output, [
            'NAMA SEKOLAH',
            'JENIS SEKOLAH',
            'JUMLAH MURID',
            'JUMLAH REKOD BACAAN',
            'PURATA REKOD'
        ]);

        $model = $query->all();
        if (!empty($model)) {
            foreach ($model as $row) {
                fputcsv($output, [
                    $row['school_name'],
                    $row['school_type'],
                    number_format($row['total_student']),
                    number_format($row['total_record']),
                    number_format((float) $row['average_record'], 2)
                ]);
            }
        }
        fclose($output);
        return $response;
    }

    public function actionStudentActiveState($search_school_type = '', $search_state = '', $search_start_date = '', $search_end_date = '') {

        if (empty($search_start_date))
            $search_start_date = date('Y-m-01');

        if (empty($search_end_date))
            $search_end_date = date('Y-m-d');

        $readingCondition = 'rr.record_student_id = fu.id';
        if (!empty($search_start_date)) {
            $readingCondition .= ' AND rr.created_at >= :startDate';
        }

        if (!empty($search_end_date)) {
            $readingCondition .= ' AND rr.created_at <= :endDate';
        }

        if ($search_school_type === 'SK') {
            $totalStudentExpression = 'COALESCE(ts.total_student_sk, 0)';
        } elseif ($search_school_type === 'SMK') {
            $totalStudentExpression = 'COALESCE(ts.total_student_smk, 0)';
        } else {
            $totalStudentExpression = 'COALESCE(ts.total_student_sk, 0) + COALESCE(ts.total_student_smk, 0)';
        }

        $query = (new Query())->select([
                    'state_code' => 'r.code',
                    'state_name' => 'r.descr',
                    'total_student' => new Expression($totalStudentExpression),
                    'total_active' => new Expression('COUNT(DISTINCT CASE WHEN rr.record_id IS NOT NULL THEN fu.id END)'),
                    'percentage_active' => new Expression('ROUND((COUNT(DISTINCT CASE WHEN rr.record_id IS NOT NULL THEN fu.id END) / NULLIF((' . $totalStudentExpression . '), 0)) * 100, 2)'),
                    'total_inactive' => new Expression('(' . $totalStudentExpression . ') - COUNT(DISTINCT CASE WHEN rr.record_id IS NOT NULL THEN fu.id END)'),
                    'percentage_inactive' => new Expression('ROUND((((' . $totalStudentExpression . ') - COUNT(DISTINCT CASE WHEN rr.record_id IS NOT NULL THEN fu.id END)) / NULLIF((' . $totalStudentExpression . '), 0)) * 100, 2)'),])
                ->from(['r' => 'ref'])
                ->leftJoin(['ts' => 'total_student'], "ts.total_state = r.code AND ts.total_type='STATE'")
                ->leftJoin(['s' => 'school'], 's.state = r.code')
                ->leftJoin(['fu' => 'frontend_user'], "fu.user_school = s.id AND fu.role='murid'")
                ->leftJoin(['rr' => 'reading_record'], $readingCondition)
                ->where(['r.cat' => 'STATE'])
                ->groupBy(['r.code', 'r.descr',]);

        if (!empty($search_school_type)) {
            $query->andWhere(['s.type' => $search_school_type]);
        } else {
            $query->andWhere(['IN', 's.type', ['SK', 'SMK']]);
        }

        if (!empty($search_state)) {
            $query->andWhere(['LIKE', 'r.descr', $search_state]);
        }

        if (!empty($search_start_date)) {
            $query->addParams([':startDate' => $search_start_date . ' 00:00:00']);
        }

        if (!empty($search_end_date)) {
            $query->addParams([':endDate' => $search_end_date . ' 23:59:59']);
        }

        $query->orderBy(['total_active' => SORT_DESC]);

        $response = Yii::$app->response;
        $response->format = \yii\web\Response::FORMAT_RAW;
        $response->headers->set('Content-Type', 'text/csv; charset=UTF-8');
        $response->headers->set('Content-Disposition', 'attachment; filename="Laporan Peratusan Murid Aktif / Tidak Aktif Mengikut Negeri.csv"');
        $output = fopen('php://output', 'w');

        fwrite($output, "\xEF\xBB\xBF");

        fputcsv($output, [
            'NEGERI',
            'JUMLAH KESELURUHAN MURID',
            'JUMLAH MURID AKTIF',
            'PERATUS MURID AKTIF (%)',
            'JUMLAH MURID TIDAK AKTIF',
            'PERATUS MURID TIDAK AKTIF (%)'
        ]);

        $model = $query->all();
        if (!empty($model)) {
            foreach ($model as $row) {
                fputcsv($output, [
                    $row['state_name'],
                    number_format($row['total_student']),
                    number_format($row['total_active']),
                    number_format((float) $row['percentage_active'], 2),
                    number_format($row['total_inactive']),
                    number_format((float) $row['percentage_inactive'], 2),
                ]);
            }
        }
        fclose($output);
        return $response;
    }

    public function actionStudentActivePpd($search_school_type = '', $search_state = '', $search_ppd = '', $search_start_date = '', $search_end_date = '') {
        if (empty($search_start_date))
            $search_start_date = date('Y-m-01');

        if (empty($search_end_date))
            $search_end_date = date('Y-m-d');

        $readingCondition = 'rr.record_student_id = fu.id';
        if (!empty($search_start_date)) {
            $readingCondition .= ' AND rr.created_at >= :startDate';
        }

        if (!empty($search_end_date)) {
            $readingCondition .= ' AND rr.created_at <= :endDate';
        }

        if ($search_school_type === 'SK') {
            $totalStudentExpression = 'COALESCE(ts.total_student_sk, 0)';
        } elseif ($search_school_type === 'SMK') {
            $totalStudentExpression = 'COALESCE(ts.total_student_smk, 0)';
        } else {
            $totalStudentExpression = 'COALESCE(ts.total_student_sk, 0) + COALESCE(ts.total_student_smk, 0)';
        }

        $query = (new Query())->select([
                    'ppd_code' => 'r.code',
                    'ppd_name' => 'r.descr',
                    'total_student' => new Expression($totalStudentExpression),
                    'total_active' => new Expression('COUNT(DISTINCT CASE WHEN rr.record_id IS NOT NULL THEN fu.id END)'),
                    'percentage_active' => new Expression('ROUND((COUNT(DISTINCT CASE WHEN rr.record_id IS NOT NULL THEN fu.id END) / NULLIF((' . $totalStudentExpression . '), 0)) * 100, 2)'),
                    'total_inactive' => new Expression('(' . $totalStudentExpression . ') - COUNT(DISTINCT CASE WHEN rr.record_id IS NOT NULL THEN fu.id END)'),
                    'percentage_inactive' => new Expression('ROUND((((' . $totalStudentExpression . ') - COUNT(DISTINCT CASE WHEN rr.record_id IS NOT NULL THEN fu.id END)) / NULLIF((' . $totalStudentExpression . '), 0)) * 100, 2)'),])
                ->from(['r' => 'ref'])
                ->leftJoin(['ts' => 'total_student'], "ts.total_ppd = r.code AND ts.total_type='PPD'")
                ->leftJoin(['s' => 'school'], 's.ppd = r.code')
                ->leftJoin(['fu' => 'frontend_user'], "fu.user_school = s.id AND fu.role='murid'")
                ->leftJoin(['rr' => 'reading_record'], $readingCondition)
                ->where(['r.cat' => 'PPD'])
                ->groupBy(['r.code', 'r.descr',]);

        if (!empty($search_school_type)) {
            $query->andWhere(['s.type' => $search_school_type]);
        } else {
            $query->andWhere(['IN', 's.type', ['SK', 'SMK']]);
        }

        if (!empty($search_ppd)) {
            $query->andWhere(['LIKE', 'r.descr', $search_ppd]);
        }

        if (!empty($search_state)) {
            $state_id = \backend\modules\refdynawebv2\models\Ref::getparentid($search_state, 'STATE');
            $query->andWhere(['=', 'r.param1', $state_id]);
        }

        if (!empty($search_start_date)) {
            $query->addParams([':startDate' => $search_start_date . ' 00:00:00']);
        }

        if (!empty($search_end_date)) {
            $query->addParams([':endDate' => $search_end_date . ' 23:59:59']);
        }
        
        $query->orderBy(['total_active' => SORT_DESC]);

        $response = Yii::$app->response;
        $response->format = \yii\web\Response::FORMAT_RAW;
        $response->headers->set('Content-Type', 'text/csv; charset=UTF-8');
        $response->headers->set('Content-Disposition', 'attachment; filename="Laporan Peratusan Murid Aktif / Tidak Aktif Mengikut PPD.csv"');
        $output = fopen('php://output', 'w');

        fwrite($output, "\xEF\xBB\xBF");

        fputcsv($output, [
            'PPD',
            'JUMLAH KESELURUHAN MURID',
            'JUMLAH MURID AKTIF',
            'PERATUS MURID AKTIF (%)',
            'JUMLAH MURID TIDAK AKTIF',
            'PERATUS MURID TIDAK AKTIF (%)'
        ]);

        $model = $query->all();
        if (!empty($model)) {
            foreach ($model as $row) {
                fputcsv($output, [
                    $row['ppd_name'],
                    number_format($row['total_student']),
                    number_format($row['total_active']),
                    number_format((float) $row['percentage_active'], 2),
                    number_format($row['total_inactive']),
                    number_format((float) $row['percentage_inactive'], 2),
                ]);
            }
        }
        fclose($output);
        return $response;
        
    }
}