get('/stats-members', function($request, $response){
if(!is_admin_login_simple()){
$temp_key = isset($_GET['temp_key']) ? $_GET['temp_key'] : '';
$now = now('Y-m-d');
if(!$temp_key or _get_stats_temp_key($now)!==$temp_key){
die('The temp_key is expired. For now, if you are website staff, you can login then refresh this page to view this page.');
}
}
$type = isset($_GET['type']) ? $_GET['type'] : '';
if(!in_array($type, ['RESUME', 'JD'])){
die('invalid type');
}
$IS_TYPE_RESUME = $type=='RESUME';
$IS_TYPE_JD = $type=='JD';
$z = isset($_GET['z']) ? $_GET['z'] : '';
$ary_user_id = array();
foreach(explode(',',$z) as$v){
if((int)$v){
$ary_user_id[] = (int)$v;
}
}
$tbl = array('RESUME'=>'
', 'JD'=>'
| 發佈職缺時間 | 職缺ID | 職缺標題 | 姓名 | 學號 |
{tbody}
');
$sql = array('RESUME'=>'SELECT send_time,users.`name`,users.school_no FROM application INNER JOIN users ON users.id=application.apply_user_id WHERE apply_user_id IN ('.implode(',',$ary_user_id).') ORDER BY send_time DESC',
'JD'=>'SELECT date_post,jobs.id, job_title,company,users.name,users.school_no FROM jobs INNER JOIN users ON users.id=jobs.owener_id WHERE owener_id IN ('.implode(',',$ary_user_id).') ORDER BY date_post DESC');
$tbl = $tbl[$type];
$sql = $sql[$type];
$q = $this->get(PDO::class)->query($sql);
$tbody = '';
while($row = $q->fetch()){
if($IS_TYPE_JD){
$row['job_title'] = ''.$row['job_title'].'';
}
$tbody.='| '.implode(' | ',$row).' |
';
}
echo'';
echo str_replace('{tbody}',$tbody,$tbl);
return $response;
});
$app->get('/stats', function($request, $response){
access_internal_page_validation();
$s = '';
$staff_user_id = '28,30,32,38,163,164,170,171,256,257,258,423,427,431,466,586,590,594,613 , 421,422,450, 574';
$sql_total_member = 'SELECT * FROM `users` WHERE `id` NOT IN ('.$staff_user_id.')';
$q = $this->get(PDO::class)->query($sql_total_member);
$total_member_count = $q->rowCount();
$sql_valid_member = $sql_total_member . ' AND `status`=1';
$q = $this->get(PDO::class)->query($sql_valid_member);
$valid_member_count = $q->rowCount();
$sql_valid_school_member = $sql_valid_member . ' AND (`school_no`<>"" AND `school_no` IS NOT NULL)';
$q = $this->get(PDO::class)->query($sql_valid_school_member);
$valid_school_member_count = $q->rowCount();
$valid_not_school_member_count = $valid_member_count - $valid_school_member_count;
$valid_school_member_count_percent = round(100*$valid_school_member_count/$valid_member_count,2);
$valid_not_school_member_count_percent = round(100*$valid_not_school_member_count/$valid_member_count,2);
$s.='會員統計:
';
$s.='1. 會員總數: '.$total_member_count.'
2. 有效會員總數 (排除註冊未完成): '.$valid_member_count.' (100%)
3. 學員數: '.$valid_school_member_count.' ('.$valid_school_member_count_percent.'%)
4. 非學員數: '.$valid_not_school_member_count.' ('.$valid_not_school_member_count_percent.'%)
';
$now = now();
$now_timestamp = strtotime($now);
$datetime_before_24hours = date("Y-m-d H:i:s", strtotime('-24 hour', $now_timestamp));
$datetime_before_168hours = date("Y-m-d H:i:s", strtotime('-168 hour', $now_timestamp));
$sql = $sql_total_member . ' AND last_login_time>="'.$datetime_before_24hours.'"';
$q = $this->get(PDO::class)->query($sql);
$login_count_within_24hours = $q->rowCount();
$sql = $sql_total_member . ' AND last_login_time>="'.$datetime_before_168hours.'"';
$q = $this->get(PDO::class)->query($sql);
$login_count_within_168hours = $q->rowCount();
$s.='會員登入人數統計(今日): '.$login_count_within_24hours.'
'
.'會員登入人數統計(過去七日): '.$login_count_within_168hours.'
';
$sql_total_job = 'SELECT * FROM `jobs` WHERE `owener_id` NOT IN ('.$staff_user_id.')';
$q = $this->get(PDO::class)->query($sql_total_job);
$job_count = $q->rowCount();
$sql_visible_job = $sql_total_job . ' AND `visible`=1';
$q = $this->get(PDO::class)->query($sql_visible_job);
$visible_job_count = $q->rowCount();
$sql_wait4verify_job = $sql_total_job . ' AND `verify`=0 AND is_trash=0';
$q = $this->get(PDO::class)->query($sql_wait4verify_job);
$wait4verify_job_count = $q->rowCount();
$wait4verify_job_list = '';
while($row = $q->fetch()) {
$wait4verify_job_list .= ''.$row['company'] . ' - ' .$row['job_title'].'';
}
//201902 by SWC idea
$s.='5. members who have submitted resumes / posted JD
';
$tbl_members_who_have_submitted_resume_posted_jd = '| 班別 | 應徵過工作的人次 | 應徵過工作的人數 | 刊登過職缺的人次 | 刊登過職缺的人數 |
{tbody}
';
$date_before24hour = date('Y-m-d', strtotime('-24 hour', $now_timestamp));
$date_before168hour = date('Y-m-d', strtotime('-168 hour', $now_timestamp));
$ary_tbl = array(
array(), # <-- $START_SEND_TIME_IDX
array(), # <-- $START_SEND_TIME_IDX
array(), # <-- $START_SEND_TIME_IDX
);
$NO_SCHOOL_NUM_KEY = 'ZZZ';
$sqlwhere_invalid_school_class = ' AND (school_no IS NULL OR school_no="" OR (school_no<>"" AND school_no NOT LIKE ("AM070%")))';
foreach(array($date_before24hour, $date_before168hour, '2000-01-01') as $_IDX=>$START_SEND_TIME){
/*SELECT apply_user_id, school_no, SUBSTRING(school_no, 1,5) AS school_class FROM application INNER JOIN (
SELECT * FROM `users` WHERE `id` NOT IN (28,30,32,38,163,164,170,171,256,257,258,423,427,431,466,586,590,594,613 , 421,422,450, 574)
) u ON u.id=application.apply_user_id
WHERE send_time>='1900-01-01'*/
$sql = 'SELECT application.id, apply_user_id, school_no, SUBSTRING(school_no, 1,5) AS school_class FROM application INNER JOIN ('.$sql_total_member.') u ON u.id=application.apply_user_id WHERE send_time>="'.$START_SEND_TIME.'"'.$sqlwhere_invalid_school_class;
#echo$sql;echo'
';
$q = $this->get(PDO::class)->query($sql); # submiited resumes
while($row = $q->fetch()){
$school_class = $row['school_class']??"";
#print_r($row);echo'
';
$SCHOOL_NUM_KEY = 1===preg_match(SCHOOL_NO_PREFIX_REGEXP, $school_class)
? $school_class
: $NO_SCHOOL_NUM_KEY;
if(!isset($ary_tbl[$_IDX][$SCHOOL_NUM_KEY])){
$ary_tbl[$_IDX][$SCHOOL_NUM_KEY] = array();
}
if(!isset($ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['count_resume'])){
$ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['count_resume'] = array();
}
if(!isset($ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['ppl_resume'])){
$ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['ppl_resume'] = 0;
}
$user_id = $row['apply_user_id'];
if($user_id>0){ // valid user_id
if(!in_array($user_id, $ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['count_resume'] )){
$ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['ppl_resume']+=1;
}
$ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['count_resume'][] = $user_id;
}
#print_r($ary_tbl);echo'
';
}
/*
SELECT * FROM jobs INNER JOIN (
SELECT * FROM `users` WHERE `id` NOT IN (28,30,32,38,163,164,170,171,256,257,258,423,427,431,466,586,590,594,613 , 421,422,450, 574)
) u ON u.id=jobs.owener_id
WHERE date_post>='1900-01-01'
*/
$sql = 'SELECT jobs.id, owener_id, school_no, SUBSTRING(school_no, 1,5) AS school_class FROM jobs INNER JOIN ('.$sql_total_member.') u ON u.id=jobs.owener_id WHERE date_post>="'.$START_SEND_TIME.'"'.$sqlwhere_invalid_school_class;
#echo$sql;echo'
';
$q = $this->get(PDO::class)->query($sql); # posted JD
while($row = $q->fetch()){
$school_class = $row['school_class']??"";
$SCHOOL_NUM_KEY = 1===preg_match(SCHOOL_NO_PREFIX_REGEXP, $school_class)
? $school_class
: $NO_SCHOOL_NUM_KEY;
if(!isset($ary_tbl[$_IDX][$SCHOOL_NUM_KEY])){
$ary_tbl[$_IDX][$SCHOOL_NUM_KEY] = array();
}
if(!isset($ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['count_jd'])){
$ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['count_jd'] = array();
}
if(!isset($ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['ppl_jd'])){
$ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['ppl_jd'] = 0;
}
$user_id = $row['owener_id'];
if($user_id>0){ // valid user_id
if(!in_array($user_id, $ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['count_jd'] )){
$ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['ppl_jd']+=1;
}
$ary_tbl[$_IDX][$SCHOOL_NUM_KEY]['count_jd'][] = $user_id;
}
}
}
// starting sort AND default $tbody
foreach($ary_tbl as$idx=>$all_school_class_results){
ksort($ary_tbl[$idx]);
}
$tbody = array();
$tr_members_who_have_submitted_resume_posted_jd = '| {td_first} | {count_resume} | {ppl_resume} | {count_jd} | {ppl_jd} |
';
$ary_tmp = ['{td_first}', '{count_resume}', '{ppl_resume}', '{count_jd}', '{ppl_jd}'];
$TEMP_KEY = _get_stats_temp_key();
foreach($ary_tbl as$idx=>$all_school_class_results){
$tbody[$idx] = '';
$total_count_ppl = array('count_resume'=>0, 'ppl_resume'=>0, 'count_jd'=>0, 'ppl_jd'=>0);
foreach($all_school_class_results as $_school_class=>$_result){
$count_resume = isset($_result['count_resume']) ? count($_result['count_resume']) : 0;
$count_resume_link = $count_resume ? ''.$count_resume.'' : $count_resume;
$ppl_resume = isset($_result['ppl_resume']) ? $_result['ppl_resume'] : 0;
$count_jd = isset($_result['count_jd']) ? count($_result['count_jd']) : 0;
$count_jd_link = $count_jd ? ''.$count_jd.'' : $count_jd;
$ppl_jd = isset($_result['ppl_jd']) ? $_result['ppl_jd'] : 0;
$td_first = $_school_class===$NO_SCHOOL_NUM_KEY ? '非學員' : $_school_class;
$tbody[$idx].=str_replace($ary_tmp,
[$td_first, $count_resume_link, $ppl_resume, $count_jd_link, $ppl_jd],
$tr_members_who_have_submitted_resume_posted_jd
);
$total_count_ppl['count_resume'] += $count_resume;
$total_count_ppl['ppl_resume'] += $ppl_resume;
$total_count_ppl['count_jd'] += $count_jd;
$total_count_ppl['ppl_jd'] += $ppl_jd;
}
$tbody[$idx] = str_replace(
'{tbody}',
$tbody[$idx] . str_replace(
$ary_tmp,
['合計',
$total_count_ppl['count_resume'],
$total_count_ppl['ppl_resume'],
$total_count_ppl['count_jd'],
$total_count_ppl['ppl_jd']],
$tr_members_who_have_submitted_resume_posted_jd
),
$tbl_members_who_have_submitted_resume_posted_jd);
if(!$tbody[$idx]){
$tbody[$idx] = 'No data in this date range...';
}
}
#echo'';print_r($ary_tbl);exit; #debug
$s.='[==== 今日以來(過去24小時) ====]'
.$tbody[0]
.'[==== 七日內(過去168小時) ====]'
.$tbody[1]
.'[==== 上架以來 ====]'
.$tbody[2]
;
$s.='職缺統計:
1. 職缺總數: '.$job_count.'
2. 上架職缺總數: '.$visible_job_count.'
3. 待審職缺數: '.$wait4verify_job_count.'
'.($wait4verify_job_list ? '
'.$wait4verify_job_list.'
' : '');
$expired_list = '';
/*
foreach(array( #30,60,
90
#,120,150,
,180
#,210,240,270,300,330,360
)as$i=>$x){
${'date_after_'.$x.'days'} = date("Y-m-d", strtotime('+'.$x.' day', $now_timestamp));
$q = $this->get(PDO::class)->query(
$sql_visible_job . ' AND `date_expired`<"'.${'date_after_'.$x.'days'}.'"');
${'expired_job_count_after_'.$x.'days'} = $q->rowCount();
$expired_list.=''.(($i+1)*3).'個月內到期之職缺總數: '.${'expired_job_count_after_'.$x.'days'}.'';
}*/
$date_after_90days = date('Y-m-d', strtotime('+90 day', $now_timestamp));
$date_after_180days = date('Y-m-d', strtotime('+180 day', $now_timestamp));
$q = $this->get(PDO::class)->query($sql_visible_job . ' AND `date_expired`<"'.$date_after_90days.'"');
$expired_job_count_within_90days = $q->rowCount();
$expired_list.='3個月內到期之職缺總數: '.$expired_job_count_within_90days.'';
$q = $this->get(PDO::class)->query($sql_visible_job . ' AND `date_expired`>="'.$date_after_90days.'" AND `date_expired`<"'.$date_after_180days.'"');
$expired_job_count_between_90day_and_180day = $q->rowCount();
$expired_list.='3 ~ 6個月內到期之職缺總數: '.$expired_job_count_between_90day_and_180day.'';
$q = $this->get(PDO::class)->query($sql_visible_job . ' AND `date_expired`>="'.$date_after_180days.'"');
$expired_job_count_after_180days = $q->rowCount();
$expired_list.='超過6個月到期之職缺總數: '.$expired_job_count_after_180days.'';
$s.='4. 職缺到期統計:
'.($expired_list ? '' : '');
$q = $this->get(PDO::class)->query(str_replace('*','COUNT(`id`) AS c, `company`',$sql_visible_job).' GROUP BY `company` ORDER BY c DESC LIMIT 5');
$top_company_list = '';
while($row = $q->fetch()) {
$top_company_list.=''.$row['company'].' ('.$row['c'].')';
}
$s .= '5. 職缺數前五名公司(上架中):
';
# [==== 當日 ====]
# [==== 七日內 ====]
$q = $this->get(PDO::class)->query($sql_visible_job . ' ORDER BY browse_count DESC LIMIT 10');
$topview_job_list = '';
while($row = $q->fetch()) {
$topview_job_list .= ''.$row['company'].' - ' . $row['job_title'] . ' - ' . $row['browse_count'].'';
}
$sql_visible_job_innerjoin_jobbrowse = str_replace('`jobs`', '`jobs` INNER JOIN `job_browse` ON job_browse.job_id=jobs.id ', $sql_visible_job);
foreach(array(168, 24)as$hour){
${'date_before_'.$hour.'hour'} = date('Y-m-d', strtotime('-'.$hour.' hour', $now_timestamp));
}
foreach(array(168,24)as$hour){
$sql = str_replace('SELECT * ',
'SELECT COUNT(job_id) browse_count,job_id,company,job_title ',
$sql_visible_job_innerjoin_jobbrowse)
.' AND `datetime`>="'.${'date_before_'.$hour.'hour'}.'" GROUP BY job_id ORDER BY browse_count DESC LIMIT 10';
$q = $this->get(PDO::class)->query($sql);
${'topview_job_list_in_'.$hour.'hr'} = '';
while($row = $q->fetch()) {
${'topview_job_list_in_'.$hour.'hr'} .= ''.$row['company'].' - ' . $row['job_title'] . ' - ' . $row['browse_count'].'';
}
}
#
$q = $this->get(PDO::class)->query($sql_visible_job . ' ORDER BY submit_count DESC LIMIT 5');
$topapply_job_list = '';
while($row = $q->fetch()) {
$topapply_job_list .= ''.$row['company'].' - ' . $row['job_title'] . ' - ' . $row['submit_count'].'';
}
$sql_visible_job_innerjoin_application = str_replace('`jobs`', '`jobs` INNER JOIN `application` ON application.job_id=jobs.id ', $sql_visible_job);
foreach(array(168,24)as$hour){
$sql = str_replace('SELECT * ',
'SELECT COUNT(job_id) submit_count,job_id,company,job_title ',
$sql_visible_job_innerjoin_application)
.' AND `send_time`>="'.${'date_before_'.$hour.'hour'}.'" GROUP BY job_id ORDER BY submit_count DESC LIMIT 5';
$q = $this->get(PDO::class)->query($sql);
${'topapply_job_list_in_'.$hour.'hr'} = '';
while($row = $q->fetch()) {
${'topapply_job_list_in_'.$hour.'hr'} .= ''.$row['company'].' - ' . $row['job_title'] . ' - ' . $row['submit_count'].'';
}
}
$s.='6. 上架中(不含已過期或下架中)的職缺瀏覽人數前十名
(公司名稱) (職缺名稱) (瀏覽人數)
[==== 今日以來(過去24小時) ====]
'.($topview_job_list_in_24hr ? ''.$topview_job_list_in_24hr.'
' : '').
'[==== 七日內(過去168小時) ====]
'.($topview_job_list_in_168hr ? ''.$topview_job_list_in_168hr.'
' : '').
'[==== 上架以來 ====]
'.($topview_job_list ? '' : '').
'7. 上架中(不含已過期或下架中)的職缺履歷投送前五名
(公司名稱) (職缺名稱) (瀏覽人數)
[==== 今日以來(過去24小時) ====]
'.($topapply_job_list_in_24hr ? ''.$topapply_job_list_in_24hr.'
' : '').
'[==== 七日內(過去168小時) ====]
'.($topapply_job_list_in_168hr ? ''.$topapply_job_list_in_168hr.'
' : '').
'[==== 上架以來 ====]
'.($topapply_job_list ? '' : '');
// sending email
if(isset($_GET['debug_stats']) and IS_DEVELOPER){
echo$s;
die('debugging...');
}else{
$ary_emails = IS_DEV
? array('wei@sted.tw')
: array(
'richie.tsai@sted.tw',
'ben.wang@sted.tw',
);
$subj = '[JOBS.AIA] 每日統計 @ '.date('Y-m-d');
if($valid_member_count>=1000){
$_ = '【達成:有效會員數破1000】';
$subj .= $_;
$s = $_ .'
' . $s;
}
if($visible_job_count>=100){
$_ = '【達成:目前上架中職缺數破100】';
$subj .= $_;
$s = $_ . '
' . $s;
}
send_mail_base($ary_emails, $subj, $s);
}
return $response;
});