| Current Path : /var/www/html/ains/frontend/controllers/ |
| 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;
}
}