Files
sam-kd/annualleave/monthly_leave_ajax.php
hskwon aca1767eb9 초기 커밋: 5130 레거시 시스템
- URL 하드코딩 → .env APP_URL 기반 동적 URL로 변경
- DB 연결 하드코딩 → .env 기반으로 변경
- MySQL strict mode DATE 오류 수정
2025-12-10 20:14:31 +09:00

132 lines
3.6 KiB
PHP

<?php
require_once($_SERVER['DOCUMENT_ROOT'] . '/session.php');
require_once($_SERVER['DOCUMENT_ROOT'] . '/common.php'); // $DB 정의
require_once($_SERVER['DOCUMENT_ROOT'] . '/lib/mydb.php');
$pdo = db_connect();
// 입력값: 년도, 회사(필터)
$year = isset($_POST['year']) ? (int)$_POST['year'] : (int)date('Y');
$corp = isset($_POST['corp']) ? trim($_POST['corp']) : '';
// 1) eworks 테이블에서 실제 사용된 연차만 월별 집계 (author → member.name JOIN)
$sql1 = "
SELECT
m.id AS uid,
MONTH(CAST(e.al_askdatefrom AS DATE)) AS mon,
SUM(CAST(e.al_usedday AS DECIMAL(10,1))) AS used
FROM {$DB}.eworks e
JOIN {$DB}.member m
ON TRIM(e.author) = m.name
AND (m.quitDate IS NULL OR m.quitDate = '0000-00-00')
WHERE e.eworks_item = '연차'
AND e.is_deleted IS NULL
AND e.status = 'end'
AND e.done = 'done'
AND YEAR(CAST(e.al_askdatefrom AS DATE)) = :year
AND CAST(e.al_usedday AS DECIMAL(10,1)) > 0
";
if ($corp !== '') {
$sql1 .= " AND m.division LIKE :corp ";
}
$sql1 .= "
GROUP BY m.id, mon
";
$stmt1 = $pdo->prepare($sql1);
$stmt1->bindValue(':year', $year, PDO::PARAM_INT);
if ($corp !== '') {
$stmt1->bindValue(':corp', "%{$corp}%", PDO::PARAM_STR);
}
$stmt1->execute();
$rows = $stmt1->fetchAll(PDO::FETCH_ASSOC);
// Pivot: [uid][month] = used
$usageData = [];
foreach ($rows as $r) {
$uid = $r['uid'];
$mon = (int)$r['mon'];
$usageData[$uid][$mon] = ($usageData[$uid][$mon] ?? 0) + (float)$r['used'];
}
// 2) member 테이블에서 재직 중 전체 직원 조회 (퇴직자 제외, 회사 필터)
$sql2 = "
SELECT
m.id AS uid,
m.name AS name,
m.division AS corp,
m.part AS dept,
m.position AS position
FROM {$DB}.member m
WHERE (m.quitDate IS NULL OR m.quitDate = '0000-00-00')
";
if ($corp !== '') {
$sql2 .= " AND m.division LIKE :corp ";
}
$stmt2 = $pdo->prepare($sql2);
if ($corp !== '') {
$stmt2->bindValue(':corp', "%{$corp}%", PDO::PARAM_STR);
}
$stmt2->execute();
$members = $stmt2->fetchAll(PDO::FETCH_ASSOC);
// 3) 전체 직원 기준으로 초기 배열 구성
$data = [];
foreach ($members as $m) {
$data[] = [
'uid' => $m['uid'],
'corp' => $m['corp'],
'dept' => $m['dept'],
'position' => $m['position'],
'name' => $m['name'],
'months' => array_fill(1, 12, 0),
];
}
// 4) 사용량이 있는 달에만 값 채우기
foreach ($data as &$row) {
$uid = $row['uid'];
if (isset($usageData[$uid])) {
foreach ($usageData[$uid] as $mon => $used) {
$row['months'][$mon] = $used;
}
}
}
unset($row);
// 5) 결과 테이블 출력
?>
<table class="table table-bordered text-center">
<thead class="table-secondary">
<tr>
<th>번호</th>
<th>소속</th>
<th>부서</th>
<th>직위</th>
<th>이름</th>
<?php for ($m = 1; $m <= 12; $m++): ?>
<th><?= $m ?>월</th>
<?php endfor; ?>
<th>합계</th>
</tr>
</thead>
<tbody>
<?php
$no = 1;
foreach ($data as $row):
$sum = array_sum($row['months']);
?>
<tr>
<td><?= $no++ ?></td>
<td><?= htmlspecialchars($row['corp'], ENT_QUOTES) ?></td>
<td><?= htmlspecialchars($row['dept'], ENT_QUOTES) ?></td>
<td><?= htmlspecialchars($row['position'], ENT_QUOTES) ?></td>
<td><?= htmlspecialchars($row['name'], ENT_QUOTES) ?></td>
<?php foreach ($row['months'] as $v): ?>
<td><?= $v !== 0 ? $v : '' ?></td>
<?php endforeach; ?>
<td><?= $sum !== 0 ? $sum : '' ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>