출퇴근과 휴가 신청
직원은 hereby Works에서 본인의 출퇴근과 휴가를 기록하고, 관리자는 근태 현황에서 원본·신청·집계를 구분해 확인합니다. 연장·외근의 신청 및 보고서 절차는 결재와 근무 보고서, 근무표 편성은 스케줄러에 연결됩니다.
출퇴근·휴가·외근·초과근무의 입력 조건과 처리 흐름을 설명합니다. 영상에서 실행한 조작과 추가 검증이 필요한 경로는 각 항목에 기록합니다.
대상과 진입 경로
| 사용자 | 실제 진입 | 범위와 전제 |
|---|---|---|
| 직원 | 병원 안내 주소의 직원 앱, 하단 근무 | 인증된 자기 직원. attendanceMethod=app일 때 출퇴근 버튼을 표시합니다. 사용자 정보 조회 전에는 버튼을 숨깁니다. |
| 직원 | 결재 → 신청·결재 → 휴가 | leave:create.self 등 해당 권한, 조직의 활성 휴가 유형. 특별 휴가로 설정된 유형은 신규 신청 목록에서 숨깁니다. |
| 직원 | 더보기 → 근무 시간 설정 | 조직에 활성 근무시간(Shift)이 있어야 합니다. 선택 저장은 결재 요청과 별개입니다. |
| 팀장 | 내부 결재의 대시보드, 연차/휴가, 근무 관리 | teamLeaderProcedure가 관리 직원 목록을 산출합니다. 조직 관리자 화면과 관리 범위가 다를 수 있습니다. |
| 관리자 | 관리자 앱 기본 주소의 #attendance, 근태 현황 → 근무 / 연차 → 연차현황·출근율·연차/휴가 결재 | 근태·휴가 자원의 읽기/수정/승인 권한과 조직·직원 범위가 적용됩니다. |
직원 화면에서 타인의 직원 ID를 입력해 신청하는 절차는 없습니다. 자기 신청 API가 로그인 직원 ID를 채우며 목록도 본인 ID로 조회합니다. 조직의 근태 방식, 근무 유형, 공휴일, 휴가 사유와 자기 수정 허용 설정은 조직과 접근 권한에서 관리합니다.
지원 작업
| 작업 | 절차 | 저장/조회 결과 |
|---|---|---|
| 오늘 상태 조회·새로고침 | 출퇴근 | 현재 출퇴근 시각·배정 근무시간을 다시 읽음 |
| 출근·퇴근 기록 | 출퇴근 | 누르면 Attendance 기록. 조기 퇴근·전날 시작한 근무의 퇴근만 확인 시트(취소 시 기록 없음) |
| 휴가 유형·잔여 확인, 일/시간 단위 신청, 증빙 첨부 | 휴가 신청 | LeaveRequest가 대기로 생성됨 |
| 신청 상태별 보기·상세·대기 취소 | 내역 | 원본 신청 상태 조회/취소. 승인 후에는 팀장 문의 |
| 지난 날 출퇴근 정정·기록 추가 요청 | 정정 요청 | 승인 시 그날 Attendance 수정·근무시간 재계산 |
| 관리자 원본·시간 구분 수정 | 관리자 확인 | 근태 원본 및 수동 시간 구분 변경, 감사 사유 보존 |
| 잔여 연차·부여/사용 이력 확인·조정 | 연차 원장 | 연차 원장과 잔여 재계산 |
| 전년도 출근율 조회·소정근로일수 개별/일괄 설정 | 출근율 | 직원·연도별 분모와 계산 설정 저장 |
| 조회·내보내기 | 관리자 표에 노출된 다운로드/시트 경로 | 급여 시트에 설명한 조회·내보내기 경로 사용. 직원 휴가 카드에는 내보내기 없음 |
출퇴근 기록하기
- 근무 탭 맨 위 출퇴근 카드에서 오늘 근무 형태·시간과 상태(아직 출근 전이에요 / 근무 중 / 오늘 근무를 마쳤어요)를 확인합니다. 시간 표시에는 조직 시간대를 사용합니다.
- 근무 시작 시 출근하기, 종료 시 퇴근하기를 누릅니다. 누르면 바로
quickCheckIn/quickCheckOut을 호출하고, 진행 중에는 **기록하는 중…**으로 버튼을 막습니다. 정해진 퇴근 전(조기 퇴근)이거나 전날 시작한 나이트 근무를 끝낼 때만 퇴근을 기록할까요? 시트로 한 번 더 묻고, 시트를 닫으면 기록하지 않습니다. - 성공하면 카드에 「08:52에 출근을 기록했어요」 같은 결과가 남습니다. 실패하면 사유와 함께 버튼이 다시 시도로 바뀌고, 다른 기기에서 먼저 기록된 경우는 실패가 아닌 안내로 표시합니다.
- 출근 뒤에는 경과시간이, 퇴근 뒤에는 출근–퇴근 시각과 근무시간이 요약됩니다. 완료 상태에서는 버튼이 비활성입니다.
- 아래로 당겨 새로고침하면 오늘 상태와 홈 피드(지금 할 일·근무 기록·축하·소식)를 다시 읽습니다. 재접속도 서버 기록을 기준으로 복원합니다. 화면의 경과시간은 출근 시각부터 흐른 시간이며, 최종 급여 인정시간과 동일한 값으로 취급하지 않습니다.
기록에는 실제 누른 시각과 별개로 예정 출근·퇴근 시각(기준 시각)이 함께 남습니다. 기준 시각은 ① 그날 근무표 칸의 근무 형태 ② 직원에게 배정된 근무 형태 ③ 근무 그룹만 배정된 직원이면 그날 요일에 맞는 그룹 안 형태(여럿이면 출근 시각에 가장 가까운 것) ④ 조직 기본 근무 형태 ⑤ 조직 설정의 기본 출퇴근 기준시간(비우면 09:00–18:00) 순으로 정합니다. 앱 출근·관리자 일괄 입력·지문 단말기가 같은 규칙을 씁니다.
마지막 단계는 기준 시각만 남기고 근무 형태는 비웁니다. 근무시간은 그대로 실제 출퇴근 기록으로 계산합니다. 근무 형태처럼 적용하면 근무 배정이 없는 직원의 근무시간이 09–18시 창으로 바뀌어 급여 시간이 조용히 달라지기 때문입니다. 근무 그룹 단계를 조직 기본값보다 앞에 둔 것도 같은 이유로, 근무표가 없는 날 밤에 출근한 3교대 직원이 09–18시로 잡히지 않게 합니다.
세콤·수기 등 앱 이외 방식에는 앱 출퇴근 버튼이 없습니다. 지문 단말기 방식에서는 지문 단말기로 출퇴근이 기록돼요. 안내를 따릅니다. 단말기 이벤트 수집, 시프트 매칭, 근태 확정 후 집계는 별도 과정입니다. 직원 앱은 원본 시각을 직접 수정하지 않습니다. 틀린 기록은 정정 요청으로 관리자 승인을 받아 고칩니다.
출퇴근 저장 실패는 토스트로 보여 주며 확인 화면을 유지해 재시도할 수 있습니다. 반면 loadTodayStatus의 조회 실패는 내부에서 흡수하므로 이전 화면이 남을 수 있습니다. 네트워크 오류 뒤 상태가 그대로라면 새로고침과 재진입으로 실제 기록을 확인한 후 다음 조작을 합니다.
휴가 신청하기
- 결재 → 신청·결재에서 연차현황 카드를 확인하고 결재 신청 목록의 휴가를 엽니다(예전의 「+」 새 신청 버튼은 없앴습니다). 신청서 맨 위에도 남은 연차가 보입니다. 기본 유형은 조직 목록의 첫 사용 가능 유형입니다. 유형 설정이 없으면 연차·병가·개인 사유·출산 휴가·경조 휴가가 기본 목록입니다.
- 휴가 유형을 고릅니다. 유형을 바꾸면 사용시간·시간대·증빙 선택이 초기화되고 해당 유형의 휴게/증빙 옵션을 다시 적용합니다.
- 기간의 시작일을 필수로 입력합니다. 과거 날짜는 선택·제출 단계에서 막습니다. 일 단위 신청은 종료일이 비면 시작일을 사용하며 시작일 변경 시 종료일이 앞서지 않게 맞춥니다. 하루 단위에는 시각 입력이 없습니다. 차감 0.5일 유형은 날짜 하나와 오전 반차 / 오후 반차를 선택합니다.
- 시간 단위 유형이면 종료일 입력이 사라지고 하루만 신청합니다. 사용 시간을 정하고 시작 시간은 필요한 경우 선택합니다. 시작 시각을 생략해도 사용 시간은 차감됩니다. 일반 선택지는 30분~8시간, 30분 간격입니다. 휴게 선택을 허용한 유형은 조직의 고정 사용시간 하나만 표시할 수 있습니다. 오늘은 이미 지난 시작시간을 숨기며 제출 시에도 다시 검사합니다. 예: 다음 근무일 14:00부터 120분을 선택하면 종료 16:00을 미리 보여 줍니다.
- 허용된 유형에서만 휴게 시간 포함을 선택합니다. 기본은 포함입니다. 증명 자료가 나타나면 파일을 최대 10개 선택하고 개별 첨부 삭제로 빼낼 수 있습니다. 실제 파일 업로드는 신청하기 시 실행됩니다. 현재 구현은 증빙 항목을 노출하지만 첨부가 없다는 이유만으로 제출을 반드시 막는 구조는 아닙니다.
- **사유 (선택)**를 직접 입력하거나 개인 사정·병원 진료·가족 행사·건강 회복·여행 프리셋을 누릅니다. 화면 아래 요약에서 유형·기간·계산된 차감과 남은 연차를 확인합니다.
leaveRequest.estimateDeduction이 실제 근무 요일·공휴일·휴가 정책을 대조하며 제외한 날짜 수를 표시합니다. 계산 응답을 받지 못한 때의 「최대」 추정 표시와 구분합니다. 최종 차감은 승인 처리 시 다시 계산합니다. 신청하기는 빈 칸이 있어도 눌리며, 걸린 칸으로 스크롤해 칸 아래에 이유를 보여 줍니다. 입력 검증을 통과하면 보내기 전에 확인해요에서 종류·기간·결재선을 다시 확인합니다. 돌아가기로 수정하거나 이대로 보내기로 최종 전송합니다. - 성공하면 신청서 자리에 휴가 신청을 보냈어요 결과 화면(종류·기간·사용·검토 중)이 뜨고 홈으로 / 신청 내역 보기로 나갑니다. 내 신청·잔여는 재조회합니다. 신청은 대기(화면 표기 「검토 중」)로 생성됩니다. 신청 접수와 승인 후 사용 원장 반영은 서로 다른 단계입니다.

직원 앱의 휴가 신청 화면입니다. 위 절차 2번의 유형, 3번의 기간, 6번의 사유·신청 버튼 위치를 참고하세요. 제출·취소 후 결과는 이 이미지에 포함되지 않으며 해당 조작은 아래 영상 기록에서 구분합니다.
서버는 유형, 팀·근무 유형 허용 범위와 휴가 정책을 검증합니다. 시간 단위는 같은 날 일 단위 휴가와 병용할 수 없고, 대기/승인 시간대 중복, 자정을 넘는 종료, 30분 단위 및 하루 합계 제한을 검사합니다. 공휴일 적용 여부는 조직·근무 유형 설정에 따라 달라집니다. 일반 일 단위 중복·잔여 부족 검사에는 정책 플래그가 있으므로 모든 조직에서 무조건 차단된다고 해석하지 않습니다. 오류 문구를 확인하고 날짜·유형·시간을 고쳐 같은 폼에서 다시 제출합니다.
내 신청 확인·취소하기
- 결재 → 내 신청·결재 현황에서 검토 중 / 예정 / 반려 / 전체 중 하나를 고릅니다. 신청은 종류(휴가·근무·인센티브·서류)별로 묶여 보이고, 「전체」에서만 기간·완료건만 표시 필터가 있습니다.
- 카드에는 종류·날짜·상태(검토 중·승인됨·반려됨·취소됨)만 보입니다. 카드를 누르면 신청 상세에서 진행 상황·사유·반려 사유를 확인합니다. 승인 상태에는 **취소하려면 팀장에게 문의해 주세요.**가 표시됩니다.
- 검토 중인 휴가의 상세에서 신청 취소를 누릅니다. 휴가 신청을 취소할까요? 확인창에서 신청 취소를 눌러야 API를 호출합니다. 확인창을 취소하면 기존 신청은 유지됩니다.
- 성공하면 내역·잔여가 다시 로드됩니다. 취소된 건을 편집해 재활성화하는 버튼은 없습니다. 필요한 기간으로 새 신청을 만듭니다.
목록 로더는 최근 50건을 조회하며 실패 시 빈 배열을 반환하는 경로가 있습니다. 목록이 비었다는 것만으로 접수되지 않았다고 단정하지 않습니다. 실패 직후 중복 제출하기 전에 재조회합니다. 이 페이지에는 대기 카드 취소를 문서화했으며, API의 관리자 취소 가능 범위를 직원 화면의 버튼 범위로 확대하지 않았습니다.
관리자 근태 확인·수정
- 근태 현황 → 근무의 출퇴근현황에서 기간과 소속/직원 검색 조건을 고릅니다. 사번·이름·이메일 검색은 서버 필터로 전달합니다. 내부 결재의 팀 조회는 관리 팀 범위만 반환합니다.
- 직원 관리로 이동해 대상 직원 행의 근태 관리(시계 아이콘)를 엽니다. 해당 월·날짜를 선택해 출퇴근, 소정·연장·야간·휴일 구분과 단말기 매칭을 확인합니다. 누락 기록을 급여 시트 합계만으로 보정하지 말고 원본 날짜부터 대조합니다.
- 근태 수정에서 출퇴근 시각과 시간 구분을 입력합니다. 시각은 조직 현지
HH:MM이고 비어 있는 값은 미입력입니다. 직접 입력하는 시간은 일반·연장·야간·야간연장·휴일일반·휴일연장·휴일야간·휴일야간연장·휴게이며 음수가 될 수 없습니다. 수정 사유가 필요합니다. - 저장하면 소정시간은 Attendance에, 초과시간 네 구분은 수동 OvertimeRecord에 반영됩니다. 수동 초과시간은 직원 보고서 결재를 새로 기다리지 않고 집계 대상이 됩니다. 닫기/취소로 저장하지 않은 입력을 버릴 수 있습니다.
- 연차 현황 표에서 이름 옆 경고 표시는 근무 그룹과 근무 형태가 둘 다 없어 조직 기본 소정근로시간으로 연차를 환산 중이라는 뜻입니다. 근무 그룹은 있는데 그룹 안 형태마다 시간이 달라(3교대·요일별) 기본값으로 환산하는 직원은 정상이므로 표시하지 않습니다. 표시를 누르면 그 자리에서 근무를 배정하는 창이 열립니다.
- 세콤 재계산을 실행하는 경로에서는 출입 원본과 근무시간 매칭을 다시 적용합니다. 재계산은 수동 시간 직접 입력과 다른 동작이므로 수행 후 동일 날짜 및 시트 집계를 다시 확인합니다.
로컬 예제 조직에서 직원 근태 관리 진입·시간 수정·저장·수정 내역 재조회는 실행했습니다. 월 전환·재계산·급여 시트 반영의 실행은 미확인입니다. 관리자·HR의 이중 구현에서 버튼 배치가 다를 수 있습니다. 전체 편집/정정 및 마감 시트 영향은 급여 시트, 원천 인사 정보는 인사 기록을 함께 확인합니다.
연차 원장과 관계
- 근태 현황 → 연차 → 연차현황에서 연도·소속·검색을 고르고 상세를 엽니다. 부여 규칙, 총 부여·사용·잔여, 신청 사용 내역과 조정 내역을 대조합니다. 상세의 신청 목록은 최신 100건이므로 모든 과거 신청을 무제한 표시하는 화면은 아닙니다.
- 목록 또는 상세의 조정을 누릅니다. 서버가 계산한 현재 잔여를 기본값으로 채우며 일과 시간, 필수 사유를 입력합니다. 입력은 증감량이 아니라 조정 후 목표 잔여입니다. 예: 현재 5일을 7일로 바꾸려면 2가 아니라 7일을 입력합니다.
- 일수는 정수 0~365, 시간은 정수 0 이상·해당 직원 1일 소정근로시간 미만입니다. 1일 환산은 직원 기준값을 사용하고 값이 없으면 8시간을 사용합니다. 빈 사유·범위 밖 입력·저장 중은 저장할 수 없습니다.
- 저장하면
adjustBalance가 조정 기록을 만들고 이전/이후 잔여를 알립니다. 목록과 열린 상세의 조정 내역을 다시 읽습니다. 취소는 목표값을 반영하지 않습니다. - 입사일이 없거나 실제 변경이 없는 요청은 서버가 거부할 수 있습니다. 조회 실패 시 조정 창을 열지 않고 오류를 표시하고, 저장 실패 시 값을 유지해 재시도합니다. 재조회한 원장과 실제 잔여를 확인한 뒤 중복 조정을 방지합니다.
연차 사용촉진은 여기서 시작하지만 잔여 차감과 별개이므로 연차 사용촉진을 따릅니다. 연차 부여 기준과 휴가 유형 설정은 근태 설정의 별도 관리 패널이며 조직과 접근 권한을 참고합니다.
전년도 출근율과 소정근로일수
- 근태 현황 → 연차 → 출근율을 엽니다. 산정 연도는 전년도부터 6년 전까지 선택하며 진행 중인 올해는 제외합니다. 소속·사번/이름/이메일 검색·전체/충족/미충족 조건을 맞춥니다. 표는 소정근로일수·출근일수·출근율·결과를 보여 주고 페이지당 30명입니다.
- 한 직원은 행의 수정, 여러 직원은 상단 소정근로일수 설정을 엽니다. 일괄 창에서 활성 직원 이름/사번을 검색하고 행을 선택합니다. 머리글은 현재 검색 결과 전체 선택, 모두 해제는 전체 선택 해제입니다. 정렬은 사번·이름·팀·입사일을 사용하며 기본은 입사일 오름차순입니다.
- 소정근로일수에 일·시·분을 입력합니다. 일괄 기본은 서버의 연간 소정근로일수, 시간·분은 0입니다. 개별 수정은 그 직원의 저장값을 불러옵니다. 서버 범위는 일 0~366·시 0~24·분 0~59이며 화면의 시 입력 상한은 23입니다.
- 출근율 계산 설정에서 연산 방식과 경계값 판정 단위를 고릅니다. 일괄 기본은 반올림·소수 3자리이고 허용 자릿수는 1~4입니다. 수정 사유는 선택, 최대 500자입니다. 일괄 선택 직원 전원에게 동일 값이 적용됨을 확인합니다.
- N명 적용(개별은 확인)을 누르면 선택 연도·직원별 소정근로시간을 분 단위로 환산해 저장하고 목록을 재계산합니다. 대상이 없거나 저장 중이면 실행하지 못합니다. 취소·X·Esc는 창을 닫고 미저장 입력을 버립니다.
- 저장 실패는 소정근로일수 설정을 저장하지 못했어요., 개별 로드 실패는 **소정근로일수 설정을 불러오지 못했어요.**로 알립니다. 값을 확인하고 다시 조회/저장합니다. 목록 로드는 실패 시 빈 배열을 쓰므로 빈 화면을 직원이 없다는 증거로 단정하지 않습니다.
출근율 결과의 충족 경계는 제품의 80% 판정이며 표시 정밀도/반올림 설정을 함께 읽어야 합니다. 이 설정이 단말기 출입 원본을 수정하거나 실제 휴가를 새로 승인하지 않습니다. 근로시간 마감은 상위 근로시간 마감 탭의 별도 처리이며 기간 조회·검증·마감·재개방에 연결됩니다.
팀장 승인/승인 취소는 postUseForRequest/postReversalsForRequest로 원장을 연결합니다. 근무표 확정도 승인 휴가를 생성하는 별도 공급 경로입니다. 원장과 원천 신청의 관계를 지켜야 같은 휴가를 두 번 차감하지 않습니다. 기록 변경 후 급여 계산과 법정 공제가 사용할 인정시간·급여 원천을 재확인합니다.
근거와 갱신 이력
- 화면·신청 동작: shift-tracker.ts, approval.ts, 휴가 카드와 신청 진입.
- SDK·저장: AttendanceService, LeaveRequestService, 근태 API, 휴가 API와 정책, 휴가 엔터티.
- 관리자 원장·출근율: 연차현황·출근율 UI, 소정근로일수 설정, 출근율 API, 스키마.
- 직원 가이드의 휴가 직접 취소 불가를 현재 대기 취소 절차로 정정합니다. 생성된 가이드는 source fragment에서 재생성해야 합니다.
- 다음 실행 검증: 앱 출퇴근 확인/실패/새로고침, 일·시간 단위 신청과 정책 플래그별 거절, 증빙 업로드 중 실패, 대기 취소 후 재진입, 관리자 수동 수정·재계산 및 원장/시트 결과. 해당 상태의 안전한 테스트 데이터와 번호 주석 화면이 필요합니다.
기능별 사용 영상과 실행 확인
관리자 근무 그룹·유형 설정과 근태 조회·수정에 각각 해당 조작의 번호별 영상을 추가했습니다. 기존 앱 대표 영상과 별개이며 두 절의 사용 순서 바로 앞에서 볼 수 있습니다.
- 근무 설정: 「근태 현황」 → 「근무 설정」 → 「근무 그룹 추가」에서 예제 그룹을 저장하고, 그룹의 「근무 유형」에서 이름·코드·09:00~18:00·월~금 기준을 저장한 뒤 목록의 실제 행을 확인했습니다. 스케줄러 연동 그룹의 코드 입력과 직원 근무 배정으로 이어지는 관계를 안내합니다.
- 근태 수정: 「근무」의 출퇴근 표는 조회 전용임을 코드와 화면에서 확인했습니다. 「직원 관리」 → 해당 직원의 「근태 관리」 → 날짜별 「근태 수정」에서 오전 09:00·오후 06:00과 사유를 저장하고, 다시 열어 「수정 내역」의 이전/이후 값과 사유를 확인했습니다. 이 경로에 맞춰 사용자 가이드 원본의 ‘표의 행을 열어 수정’ 설명을 정정했습니다.
- 소유 경로: 조회 표는
apps/team-manager/src/views/tabs/overview.html, 수정 진입은apps/admin/src/views/tabs/employees-content.html, 날짜별 편집은employee-attendance.html·attendance-edit.html, 저장·재조회는 관리자app.ts의saveAttendanceEdit·loadEmployeeAttendance입니다. 수정 기록은 근태 원천이며 시트의 재반영·급여 확정은 별도입니다. - 범위: 로컬 전용 예제 조직, 관리자, 1440×900,
6fbaee7f기반 문서 작업 브랜치입니다. 마감 기간 수정 거절, 권한별 분기, 급여 시트 재반영과 운영 배포는 이번 두 영상에서 실행하지 않았습니다. 전체 촬영 누락은 기능별 영상 원장에 남깁니다.
직원의 신청·취소 기능 영상
하루 연차 신청은 9월 18일·「영상 가이드 실습 연차」를 입력해 대기로 생성하고, 신청 현황에서는 대기·취소 필터와 「신청 취소」 확인창을 거쳐 취소 결과를 확인했습니다. 연장근무 신청은 9월 14일 18:00~20:00·평일 연장·「영상 가이드 실습 연장」을 저장하고 근무 탭의 대기 카드를 확인했습니다.
외근 신청은 9월 15일 13:00~15:00·예제 교육장·교육/세미나·「영상 가이드 실습 외근」을 입력했습니다. 외근 취소는 대기 카드의 취소 버튼을 누르면 별도 확인창 없이 즉시 취소되고 버튼이 사라지는 실제 동작입니다. 휴가의 확인창과 혼동하지 않도록 영상을 따로 제작했습니다. 신청은 승인이나 보고서 승인과 구분되며, 관리자·팀 관리자 결재 및 근태·급여 원천으로 이어지는 관계는 위 본문과 승인 기능 문서를 따릅니다.
모든 조작은 별도 예제 DB에서 수행했습니다. 신규 영상은 같은 이름의 JSON에 입력·결과·챕터 시각·캡처 환경을 기록하고, 과거 개요 영상으로 해당 절의 모든 조작을 검증했다고 간주하지 않습니다. 시간 단위 휴가·첨부 증빙 등 별도 분기는 영상 촬영 원장에서 구분합니다.
승인된 외근 보고서 촬영
보고서 제출에서 승인된 2026-09-08 본원 교육센터 외근의 「외근 보고서 작성」을 열고, 실제 시간 09:00–15:00과 보고 내용을 입력해 「제출」했습니다. 목록에 실제 6시간과 보고 내용이 다시 표시되는 것까지 확인했습니다. 신청 배지 「승인」과 보고서 심사 상태는 별개이므로 이 결과를 보고서 승인·근태 반영 완료로 설명하지 않습니다. 연장근무 보고서 제출·보고서 반려 후 재작성은 별도 촬영 대상입니다.
출퇴근 기록·연차 조정·승인 촬영
Codex가 격리 예제 조직의 EMP001로 다음 세 흐름을 실행하고 각각 사용자 가이드에 연결했습니다.
- 직원 출퇴근: 근무 화면의 출근 버튼, 출근 확인창의 시각, 「출근하기」를 차례로 확인했습니다. 근무 중 상태에서 퇴근 확인창을 열고 「퇴근하기」를 누른 뒤 출퇴근 시각·근무 완료·비활성 버튼을 확인했습니다. 짧은 교육용 기록이며 하루 전체 근무나 관리자 재조회·마감까지 검증한 영상은 아닙니다. 저장은
shift-tracker.ts의 확인 동작에서 근태 API로 이어집니다. - 연차 조정: 연차현황에서 김관리 검색 → 상세의 적용 규칙·사용 내역 → 조정 내역 → 조정 추가로 진입했습니다. 최종 잔여 목표 14일 0시간과 사유를 저장하고, 원장의 변경량·사유 및 목록의 14일을 확인했습니다. 이후 휴가 승인은 잔여를 다시 바꿀 수 있으므로 영상의 수치를 고정 잔여로 사용하지 않습니다. 출근율·소정근로일수 조작은 이 영상에 포함하지 않았습니다.
- 휴가 승인: 연차/휴가 결재에서 대기·김관리 필터 → 9월 22~23일 가족 여행 상세를 검토 → 승인 → 승인 필터에서 같은 상세 재조회까지 실행했습니다. 승인 버튼은 별도 확인창 없이 요청을 전송합니다. 휴가 원장·직원 잔여·스케줄러·급여 원천의 관계는 위 본문을 따르며, 이 촬영에서 모든 후속 화면의 수치를 대조한 것은 아닙니다.
관련 구현은 관리자 leave-management.html, saveLeaveAdjust, 휴가 승인 API와 직원 shift-tracker.ts입니다. 실제 UI 저장·재조회와 외부 운영 배포를 구분하며, 실패·반려·마감 기간의 재시도는 별도 촬영 대상입니다.
직원별 근로시간 마감·취소 영상
관리자 근로시간 마감을 5단계로 촬영했습니다. Codex가 마감일 2026-09-10·확정 기한 2026-09-30·직접 선택 EMP001 한 명으로 마감 건을 만들었습니다. 자동 마감과 알림 메일은 끈 상태였습니다. 저장 후 해당 행을 열고 대상자를 체크해 「근로 시간 확정」 → 확인창에서 확정했습니다. 상태 「마감」과 확정일을 확인한 뒤 다시 선택해 「확정 취소」를 수행했고 「미마감」·확정일 없음으로 돌아왔습니다. 예제 DB도 대상 한 명·unconfirmed·confirmedAt=null을 확인했습니다.
마감은 근태 원본 수정 잠금과 연결되며 급여 스냅샷 확정·명세서 공개와 다릅니다. 이 영상은 관리자 화면과 마감 저장 결과를 검증했고, 잠금 중 실제 근태 수정 거절·자동 마감 잡·확정 요청 메일은 실행하지 않았습니다. 초기 촬영에서 발생한 브라우저 평가 대기·컨텍스트 초기화는 대기 방식을 조정한 후 재촬영에 성공했으며 제품 결함으로 확정하지 않았습니다.
연장근무 신청 승인 영상
관리자 가이드의 4단계 영상은 근태 현황 → 연장근무에서 날짜 「전체」·상태 「대기」를 고르고 김관리를 검색하는 것으로 시작합니다. 2026-09-09의 18:00~20:00, 사유 「환자 기록 정리 및 인수인계」인 예제 신청을 상세 조회해 승인하고, 승인 필터에서 같은 건을 다시 열어 확인했습니다.
직원 앱에서 별도로 촬영한 9월 14일 신청은 취소 이력이 있어 이번 승인 대상과 다릅니다. 신청 승인은 수행 보고서 승인·근태 정산·급여 지급이 아닙니다. 수행 보고서 제출과 보고서 승인/반려는 남은 촬영 범위이며, 상태 필터의 실제 코드와 보고서 단계가 바뀌면 두 가이드의 설명을 함께 갱신합니다. 촬영 환경은 로컬 격리 예제 DB입니다.
휴가 유형별 추천 사유
관리자는 휴가 유형 만들기에서 문구를 추가·제거한 뒤 유형을 저장합니다. 입력은 문구당 50자, 유형당 10개이며 공백을 정리한 동일 문구는 중복 추가하지 않습니다. 입력란에 쓰기만 한 값은 추가 버튼이나 Enter로 목록에 넣어야 저장 대상이 됩니다. 전부 지워 저장하면 직원 신청의 추천 문구를 숨깁니다. 편집창을 닫는 것은 저장이 아닙니다.
직원은 휴가 신청에서 유형을 선택하고 추천 문구를 눌러 사유를 채운 뒤 직접 수정할 수 있습니다. 추천 문구 선택과 최종 신청은 별개이며 이전 신청 내용을 소급 수정하지 않습니다.
구현 원천은 organization.settings.leaveReasons[].reasonPresets입니다. 미설정은 기존 기본 목록, 빈 배열은 숨김, 값이 있는 배열은 유형별 목록이라는 세 상태를 유지합니다. 관리자 폼은 미설정 유형을 열 때 기본 목록을 채웁니다. 저장은 기존 organization.updateSettings이고 직원 쪽 판정은 approval/formatters.ts의 leaveReasonPresetOptions입니다. 두 앱의 기본 목록은 packages/core/src/constants/leave.ts를 공유합니다.
PR #795와 병합 소스를 대조했습니다. 유형 저장·직원 재진입·문구 선택·실제 제출의 새 촬영은 대기 중이며 기존 admin-leave-type, employee-leave-day 영상의 주소와 설명은 유지합니다.
출퇴근 목록 전체 다운로드
관리자 근태 가이드의 다운로드는 기간·소속·검색 조건에 맞는 전체 출퇴근 기록을 XLSX로 만듭니다. 화면의 30개 행만 내보내지 않고 attendance.list를 1,000건씩 조회합니다. 0건이면 파일을 만들지 않고, 50,000건을 넘으면 기간을 나누도록 안내합니다. 출퇴근 시각은 조직의 시간대를 사용하고 다음 날 퇴근은 익일로 표시합니다. 휴게·총 근무시간은 숫자로 내보냅니다.
입력·다운로드·결과·오류 확인은 사용자 가이드에 정리했습니다. apps/team-manager/src/attendance/export.ts, app.ts의 downloadDashAttendance, views/tabs/overview.html과 PR #764를 대조했으며 실제 파일 다운로드 재촬영은 대기 중입니다. 파일 저장은 근태 수정·승인·마감을 수행하지 않습니다.
출퇴근·외근·연장근무 통합 조회
| 대상 | 시작 위치 | 관련 화면 |
|---|---|---|
| 직원 본인 | 직원 앱 근무 홈의 근무 기록 카드 → 「근무 기록」(월별·주간별·일별) | 외근 보고서·연장근무 신청·출퇴근 정정 요청 |
| 조회 권한이 있는 담당자 | 직원 관리의 근태 관리에서 전체 근무기록 | 일별 근태표·근태 수정·결재 |
월별·주간별·일별 탭, 합계, 날짜별 막대, 「확인 필요」 사유는 직원 가이드와 관리자 가이드에 설명했습니다. work-log.service.ts가 출퇴근·외근·연장을 조합하고 work-log-bar.ts가 00:00부터 다음 날 06:00까지 표시합니다. 승인 대기 연장과 보고서 승인 전 외근은 합산하지 않습니다. 외근에서 복사된 출퇴근은 중복 집계를 피하지만 서로 겹친 별도 근무 구간 전체를 자동 차감하는 정책은 아닙니다.
근거는 PR #729와 packages/api/src/services/work-log.service.ts, apps/employee-app/src/views/modals/work-log.html입니다. 월 이동·자정 경과·빈 달·보고서 승인 전후·겹침 경고를 실제 화면으로 대조하고 촬영하는 작업은 남아 있습니다.
출퇴근 정정 요청
직원은 직원 앱 근무 기록 → 일별에서 지난 날의 출퇴근을 고쳐 달라고 요청합니다. 기록이 있는 날은 출퇴근 정정 요청(바꾼 시각만 담김), 기록이 없는 지난 날은 기록 추가 요청입니다. 사유(깜빡했어요·네트워크 문제·앱 오류·직접 입력)를 고르고 보내면 「결재 → 내 신청·결재 현황」의 근무 묶음에 파란 정정 카드가 생기며, 검토 중에는 상세의 요청 취소로 거둘 수 있습니다.
- 처리:
attendance:approve(팀 이상 범위)를 가진 관리자가 관리자 화면 근태 현황 → 정정 요청에서 승인·반려합니다. 본인 요청은 처리할 수 없습니다. 승인하면 그날 출퇴근 기록과 근무시간이 다시 계산되고 근태 수정 이력에 사유가 남으며, 결과는 요청자에게 알림으로 갑니다. - 막히는 날: 앞으로 올 날은 요청할 수 없고(오늘은 화면에 정정 버튼이 없음), 급여가 확정·지급된 기간과 근로시간 마감이 확정된 날은 요청·승인이 모두 막힙니다. 같은 날 검토 중인 요청이 있으면 새 요청 대신 기존 요청을 봅니다.
- 화면 절차: 직원 가이드의 「출퇴근 기록이 틀렸거나 빠졌을 때」, 관리자 가이드의 「직원의 출퇴근 정정 요청 처리하기」. 근거:
packages/api/src/routers/attendance-correction.router.ts,apps/employee-app/src/views/modals/attendance-correction.html.
휴가 유형 비활성화와 삭제
휴가 유형 가이드에서 활성 유형의 삭제 버튼은 먼저 비활성 변경을 확인합니다. 이 확인만으로 삭제되지 않으며, 비활성화 후 삭제를 다시 선택해야 합니다. 취소하면 기존 상태를 유지합니다. PR #759의 apps/admin/src/app.ts에 근거하며 기존 사용 내역이 있는 유형과 저장 실패 복구는 별도 촬영 대기입니다.
직원 앱의 팀 근태와 초과 연차
| 항목 | 안내 |
|---|---|
| 대상·위치 | 근태 조회가 팀/전체 범위인 직원의 더보기 → 팀 근태 |
| 하루 | 관리 팀과 하위 팀의 상태·출퇴근/외근 시각과 상태별 인원. 오늘 이후 이동 불가 |
| 한 달 | 출근·지각·휴가·승인 연장 합계 및 선택 월 말일 기준 연차 잔여. 월 말일이 오늘 이후이면 오늘 기준 |
| 후속 조작 | 결재할 문서 보기에서 실제 신청 검토. 조회 화면은 근태를 수정하지 않음 |
절차와 빈 목록·오류 대응은 직원 가이드에 설명합니다. team-attendance.service.ts와 attendance.router.ts의 권한 범위를 사용합니다. 예제 5명의 하루/월 전환과 결재 화면 이동을 촬영했으며 모든 근태 상태를 발생시키거나 실제 단말기 수집을 검증한 것은 아닙니다.
연차 부족 시 동작은 조직 정책에 따릅니다. 차단·허용·결재자 확인 후 허용을 구별하고, 확인 후 허용은 결재자가 초과 안내를 확인해야 승인할 수 있습니다. 음수 잔여 이월이 켜져 있으면 다음 부여 기간에서 지난 초과 사용량을 차감하며 동일 기간의 반복 실행에서 중복 차감하지 않도록 기록합니다. 신청 화면의 예상 잔여와 승인 후 원장을 대조해야 합니다. 이번 촬영은 반차 접수까지이며 부족 상태의 승인과 다음 연도 이월은 별도 검증 대기입니다.
연장 신청은 병원이 단일 유형을 정하면 유형 선택칸을 숨깁니다. 근무 기록의 진입 버튼과 고정 연장 안내를 확인하며, 기록 조회나 신청 접수를 실제 승인·급여 확정으로 취급하지 않습니다. 세콤은 출입 태그로 출퇴근을 판정하도록 정할 수 있지만 연동 수집과 재계산은 이번 로컬 웹 영상으로 검증하지 않았습니다.
근거: #1137, #1141, #1142, #1143, #1145.
대기 중인 연차와 기간별 시간 휴가
| 항목 | 안내 |
|---|---|
| 사용자 | 휴가 신청 직원과 결재 담당자 |
| 시작 위치 | 직원 앱 > 결재 > 휴가 신청, 관리자·내부 결재 > 연차/휴가 |
| 조건 | 조직에서 제공하는 휴가 유형과 근무일 기준이 적용됩니다. |
신청 가능 연차 = 남은 연차 − 결재 대기 중인 신청분입니다. 대기 중인 신청을 반려하거나 취소하면 예약된 분량이 풀립니다. 승인하면 대기분이 사용분으로 바뀌므로 같은 휴가를 다시 차감하지 않습니다.
시간 휴가에서는 시작일과 종료일, 하루에 사용할 시간을 고릅니다. 2일 동안 하루 2시간이면 적용되는 두 날에 각각 2시간을 신청하는 뜻입니다. 날짜 수만으로 차감량을 계산하지 말고 신청 전 안내된 적용일과 예상 차감을 확인합니다. 확정 근무표와 쉬는 날 기준에 따라 차감되지 않는 날짜가 있을 수 있습니다. 차감이 없다는 안내가 있어도 실제로 필요한 휴가인지 확인한 후 제출합니다.
취소로 신청 화면을 닫으면 새 요청을 보내지 않습니다. 제출 후에는 내 신청의 기간·시간·상태를 확인하고, 아직 대기 중이면 취소할 수 있습니다. 승인된 건의 취소는 취소 신청·결재 절차를 거칩니다. PR #1191·#1192·#1196·#1198·#1206을 대조했습니다. 예제 조직에서 이틀에 하루 2시간을 입력하고 실제 제출·접수 결과를 촬영했습니다. 모든 근무표·휴일·초과 사용 조합을 실행 검증한 것은 아닙니다.