PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];
// ---------- 対象月設定 ----------
// デフォルト:先月(例: 実行日が2月なら、対象月は1月)
$targetMonth = isset($_GET['month'])
? $_GET['month']
: date('Y-m', strtotime('first day of last month'));
// 比較・表示用日付計算
// 1. レポート対象月 (例: 2025-12) -> 実績を表示
$monthCurrent = $targetMonth;
// 2. その前月 (例: 2025-11) -> 比較用
$monthPrev = date('Y-m', strtotime($targetMonth . ' -1 month'));
// 3. その翌月 (例: 2026-01) -> 予定を表示
$monthNext = date('Y-m', strtotime($targetMonth . ' +1 month'));
// 表示用ラベル
$labelThisMonth = date('Y年n月', strtotime($targetMonth . '-01'));
$labelPrevMonth = date('Y年n月', strtotime($targetMonth . ' -1 month'));
$labelNextMonth = date('Y年n月', strtotime($targetMonth . ' +1 month'));
// SQL検索用に年と月を分割(追加項目用)
$dateObj = DateTime::createFromFormat('Y-m-d', $targetMonth . '-01');
$targetYear = $dateObj->format('Y');
$targetMonthNum = $dateObj->format('n');
// ---------- 表示対象企業(順番固定) ----------
$displayCompanies = [
'株式会社フレスコ',
'三菱地所ホーム',
'OPEC',
'GENERAL',
'太平ハウス・ラボ',
'ジャーブネット',
'あさひハウジングセンター',
'住友不動産ハウジング',
'イエタス',
'ワンズ・サポート・システム',
'ITC',
'旭化成建材',
'WIT',
'福工房',
'株式会社高砂建設',
'京阪電鉄不動産',
'よかタウン',
'篠原商店'
];
// ---------- 企業ID → 企業名(ログイン用) ----------
$companyMap = [
'Fresco'=>'株式会社フレスコ',
'MJHOME'=>'三菱地所ホーム',
'OPEC'=>'OPEC',
'GENERAL'=>'GENERAL',
'houselabo'=>'太平ハウス・ラボ',
'JAHBnet'=>'ジャーブネット',
'AHC'=>'あさひハウジングセンター',
'Sumitomo-rd'=>'住友不動産ハウジング',
'YETUS'=>'イエタス',
'ONESNET'=>'ワンズ・サポート・システム',
'ITC'=>'ITC',
'AKK'=>'旭化成建材',
'WI-TOKYO'=>'WIT',
'fukukobo'=>'福工房',
'takasago'=>'株式会社高砂建設',
'KEIHAN'=>'京阪電鉄不動産',
'yoka-town'=>'よかタウン',
'SHINOHARA'=>'篠原商店'
];
// ---------- 初期化 ----------
// 追加項目のデフォルト値
$serverDisk = '取得なし';
$responseSpeed = '取得なし';
$sslDate = '取得なし';
$virusCount = 0;
$ipsCount = 0;
// 作業ログ用配列
$workHistory = []; // 実績
$workPlan = []; // 予定
// GAチャート用
$chartData = [
'Resolution'=>['labels'=>[], 'data'=>[]],
'Browser'=>['labels'=>[], 'data'=>[]],
'OS'=>['labels'=>[], 'data'=>[]],
];
$limits = ['Resolution'=>8,'Browser'=>5,'OS'=>5];
try {
$pdo = new PDO($dsn, $user, $password, $options);
// ==========================================
// 1. 追加項目の取得 (サーバ・セキュリティ等)
// ==========================================
// ① サーバ空容量 (server_disk)
$stmt = $pdo->prepare("SELECT size FROM server_disk WHERE server = 'dbs' AND year = :y AND month = :m LIMIT 1");
$stmt->execute([':y' => $targetYear, ':m' => $targetMonthNum]);
$row = $stmt->fetch();
if ($row) { $serverDisk = $row['size']; }
// ② レスポンス速度 (response_tbl)
$stmt = $pdo->prepare("SELECT response FROM response_tbl WHERE service = 'databank' AND year = :y AND month = :m LIMIT 1");
$stmt->execute([':y' => $targetYear, ':m' => $targetMonthNum]);
$row = $stmt->fetch();
if ($row) { $responseSpeed = $row['response']; }
// ③ SSL証明書期限 (ssl_tbl)
$stmt = $pdo->prepare("SELECT ssl_date FROM ssl_tbl WHERE service = 'www.databank-solution.net' LIMIT 1");
$stmt->execute();
$row = $stmt->fetch();
if ($row && !empty($row['ssl_date'])) {
$dateStr = str_replace('/', '-', $row['ssl_date']);
$timestamp = strtotime($dateStr);
if ($timestamp) {
$sslDate = date('Y年m月d日', $timestamp);
} else {
$sslDate = $row['ssl_date'];
}
}
// ④ ウイルス・不正侵入検知 (alert_tbl)
$stmt = $pdo->prepare("SELECT kind, alert_count FROM alert_tbl WHERE year = :y AND month = :m AND kind IN ('virus', 'ips')");
$stmt->execute([':y' => $targetYear, ':m' => $targetMonthNum]);
$alertRows = $stmt->fetchAll();
foreach ($alertRows as $r) {
if ($r['kind'] === 'virus') { $virusCount = $r['alert_count']; }
elseif ($r['kind'] === 'ips') { $ipsCount = $r['alert_count']; }
}
// ==========================================
// ★追加: 作業ログの取得
// ==========================================
// ① 作業実績(対象月 & status=done)
$sqlWorkHistory = "
SELECT work_date, server_name, work_content
FROM server_work_log
WHERE work_date LIKE :month
AND status = 'done'
ORDER BY work_date ASC
";
$stmt = $pdo->prepare($sqlWorkHistory);
$stmt->execute([':month' => $monthCurrent . '%']);
$workHistory = $stmt->fetchAll();
// ② 作業予定(翌月 & status=plan)
$sqlWorkPlan = "
SELECT work_date, server_name, work_content
FROM server_work_log
WHERE work_date LIKE :month
AND status = 'plan'
ORDER BY work_date ASC
";
$stmt = $pdo->prepare($sqlWorkPlan);
$stmt->execute([':month' => $monthNext . '%']);
$workPlan = $stmt->fetchAll();
// ==========================================
// 2. ディスク使用量
// ==========================================
$monthPrev2 = date('Y-m', strtotime($monthCurrent.' -2 month'));
$sqlDisk = "
SELECT
cur.company_name,
(cur.total_size_gb - IFNULL(prev.total_size_gb,0)) AS cur_size,
(cur.file_count - IFNULL(prev.file_count,0)) AS cur_files,
(prev.total_size_gb - IFNULL(prev2.total_size_gb,0)) AS prev_size,
(prev.file_count - IFNULL(prev2.file_count,0)) AS prev_files,
cur.total_size_gb AS total_size,
cur.file_count AS total_files
FROM company_file_usage cur
LEFT JOIN company_file_usage prev
ON cur.company_id = prev.company_id AND prev.target_month = :m1
LEFT JOIN company_file_usage prev2
ON cur.company_id = prev2.company_id AND prev2.target_month = :m0
WHERE cur.target_month = :m2
";
$stmt = $pdo->prepare($sqlDisk);
$stmt->execute([':m0'=>$monthPrev2,':m1'=>$monthPrev,':m2'=>$monthCurrent]);
$diskRows = $stmt->fetchAll();
$diskMap = [];
foreach ($diskRows as $r) {
$diskMap[$r['company_name']] = $r;
}
// ==========================================
// 3. ログイン回数
// ==========================================
$sqlLogin = "
SELECT
company_id,
SUM(CASE WHEN target_month=:m1 THEN login_ok_cnt ELSE 0 END) AS cur_ok,
SUM(CASE WHEN target_month=:m1 THEN login_ng_cnt ELSE 0 END) AS cur_ng,
SUM(CASE WHEN target_month=:m2 THEN login_ok_cnt ELSE 0 END) AS prev_ok,
SUM(CASE WHEN target_month=:m2 THEN login_ng_cnt ELSE 0 END) AS prev_ng
FROM company_login_stats
WHERE target_month IN (:m1,:m2)
GROUP BY company_id
";
$stmt = $pdo->prepare($sqlLogin);
$stmt->execute([':m1'=>$targetMonth,':m2'=>$monthPrev]);
$loginRows = $stmt->fetchAll();
$loginMap = [];
foreach ($displayCompanies as $companyName) {
$loginMap[$companyName] = ['cur_ok'=>0, 'cur_ng'=>0, 'prev_ok'=>0, 'prev_ng'=>0];
}
foreach ($loginRows as $r) {
if (isset($companyMap[$r['company_id']])) {
$cname = $companyMap[$r['company_id']];
$loginMap[$cname] = [
'cur_ok' => (int)$r['cur_ok'],
'cur_ng' => (int)$r['cur_ng'],
'prev_ok' => (int)$r['prev_ok'],
'prev_ng' => (int)$r['prev_ng'],
];
}
}
// ==========================================
// 4. GA (Google Analytics)
// ==========================================
$sqlGA = "
SELECT category,label,active_users
FROM ga4_monthly_report
WHERE report_month=:month
ORDER BY category,active_users DESC
";
$stmt = $pdo->prepare($sqlGA);
$stmt->execute([':month'=>$targetMonth]);
$gaRows = $stmt->fetchAll();
foreach ($gaRows as $r) {
$chartData[$r['category']]['labels'][] = $r['label'];
$chartData[$r['category']]['data'][] = $r['active_users'];
}
foreach ($limits as $k=>$v) {
if (isset($chartData[$k])) {
$chartData[$k]['labels'] = array_slice($chartData[$k]['labels'],0,$v);
$chartData[$k]['data'] = array_slice($chartData[$k]['data'],0,$v);
}
}
} catch (PDOException $e) {
exit('DB Error: '.$e->getMessage());
}
?>
= htmlspecialchars($labelThisMonth) ?> 月報
= htmlspecialchars($labelThisMonth) ?> 月報
ディスク使用量
| 企業名 |
= $labelThisMonth ?> |
= $labelPrevMonth ?> |
合計 |
| 利用量(GB) | ファイル数 |
利用量(GB) | ファイル数 |
利用量(GB) | ファイル数 |
0, 'cur_files'=>0, 'prev_size'=>0, 'prev_files'=>0, 'total_size'=>0, 'total_files'=>0
];
?>
| = htmlspecialchars($c) ?> |
= number_format($r['cur_size'],2) ?> |
= number_format($r['cur_files']) ?> |
= number_format($r['prev_size'],2) ?> |
= number_format($r['prev_files']) ?> |
= number_format($r['total_size'],2) ?> |
= number_format($r['total_files']) ?> |
ログイン回数
| 企業名 |
= $labelThisMonth ?> |
= $labelPrevMonth ?> |
| 成功 | 失敗 | 成功 | 失敗 |
| = htmlspecialchars($c) ?> |
= number_format($r['cur_ok']) ?> |
= number_format($r['cur_ng']) ?> |
= number_format($r['prev_ok']) ?> |
= number_format($r['prev_ng']) ?> |
ユーザ情報
サーバ情報
サーバ空容量 (dbs)
= htmlspecialchars($serverDisk) ?>
レスポンス速度 (databank)
= htmlspecialchars($responseSpeed) ?>
SSL証明書期限
= htmlspecialchars($sslDate) ?>
ウイルス検知
= htmlspecialchars($virusCount) ?>件
不正侵入検知
= htmlspecialchars($ipsCount) ?>件
作業報告
① = htmlspecialchars($labelThisMonth) ?> 作業実績
| 作業日 |
対象サーバ |
作業内容 |
0): ?>
| = htmlspecialchars($work['work_date']) ?> |
= htmlspecialchars($work['server_name']) ?> |
= nl2br(htmlspecialchars($work['work_content'])) ?> |
| 実績なし |
② = htmlspecialchars($labelNextMonth) ?> 作業予定
| 予定日 |
対象サーバ |
作業内容 |
0): ?>
| = htmlspecialchars($plan['work_date']) ?> |
= htmlspecialchars($plan['server_name']) ?> |
= nl2br(htmlspecialchars($plan['work_content'])) ?> |
| 予定なし |