feat(WEB): 근태 설정 및 관리 시스템 개선

- AttendanceSettingsManagement: 근무시간/휴식시간 설정 API 연동
- AttendanceManagement: 출퇴근 기록 조회/수정 기능 강화
- 근태 상태 필터링 및 검색 기능 개선
- 근태 actions 공통 로직 정리
This commit is contained in:
2025-12-30 17:20:04 +09:00
parent a45ff9af28
commit 2443c0dc63
8 changed files with 150 additions and 113 deletions

View File

@@ -48,6 +48,7 @@ export default function MobileAttendancePage() {
const [viewMode, setViewMode] = useState<ViewMode>('main');
const [checkInTime, setCheckInTime] = useState<string>('');
const [checkOutTime, setCheckOutTime] = useState<string>('');
const [userId, setUserId] = useState<number | null>(null);
const [userName, setUserName] = useState(TEST_USER.name);
const [userDepartment, setUserDepartment] = useState(TEST_USER.department);
const [userPosition, setUserPosition] = useState(TEST_USER.position);
@@ -59,13 +60,13 @@ export default function MobileAttendancePage() {
setMounted(true);
}, []);
// 오늘의 근태 상태 조회
// 오늘의 근태 상태 조회 (userId가 설정된 후에 조회)
useEffect(() => {
if (!mounted) return;
if (!mounted || userId === null) return;
const fetchTodayAttendance = async () => {
try {
const result = await getTodayAttendance();
const result = await getTodayAttendance(userId);
if (result.success && result.data) {
// 이미 출근한 경우
if (result.data.checkIn) {
@@ -82,7 +83,7 @@ export default function MobileAttendancePage() {
};
fetchTodayAttendance();
}, [mounted]);
}, [mounted, userId]);
// 현재 시간 업데이트 (마운트 후에만 실행)
useEffect(() => {
@@ -117,6 +118,7 @@ export default function MobileAttendancePage() {
if (userDataStr) {
try {
const userData = JSON.parse(userDataStr);
if (userData.id) setUserId(userData.id);
if (userData.name) setUserName(userData.name);
if (userData.department) setUserDepartment(userData.department);
if (userData.position) setUserPosition(userData.position);
@@ -263,7 +265,9 @@ export default function MobileAttendancePage() {
}
// 버튼 활성화 상태
const canCheckIn = isInRange && attendanceStatus === 'not-checked-in' && !isProcessing;
// - 출근: 아직 출근 안 했거나, 퇴근한 경우 (다시 출근 가능)
// - 퇴근: 출근한 경우에만 가능
const canCheckIn = isInRange && attendanceStatus !== 'checked-in' && !isProcessing;
const canCheckOut = isInRange && attendanceStatus === 'checked-in' && !isProcessing;
return (