외근
프로세스
결재(탭)
1️⃣ 필터링
- 상태
- 옵션 : 전체, 대기, 승인, 반려, 취소, 보고서 대기, 보고서 승인, 보고서 반려
- 기본 : 전체
- 기간
- 직원관리 화면의 입사일 기준으로 기간 필터링과 동일, 단 근무일 기준으로 필터링됨 2️⃣ 리스트뷰
| 사번 | 이름 | 근무일 | 외근 시간 | 장소 | 유형 | 상태 | 관리 |
|---|---|---|---|---|---|---|---|
| ADMIN003 | 홍길동 | 2026.06.23. | 4.00시간 | 거래처 | 외부 미팅 | 승인 | [보기] 버튼 |
3️⃣ [보기] 버튼
- 외근 상세 팝업 제공
① 대기 상태 일 때 '외근 상세' 팝업
- 외근신청서
- 직원 :
- 근무일 : 2026.06.23.
- 시작 시간 :
- 종료 시간 :
- 외근 시간 : {12.00} 시간
- 유형 :
- 사유 :
- 푸터 버튼
- [승인]
- 사유 입력: 불필요
- 동작
- 상태 변경되고 모든 팝업 닫힘
- 상태 : 대기 -> 승인
- 결재자, 결재 일시 기록
- 직원이 Works에서 외근 보고서 작성 가능
- [반려]
- 반려 사유 입력 팝업 제공
- title : 외근 반려
- 사유입력
- 필수 표시(
*표시) - 입력란
- placeholder : 반려사유를 입력해 주세요.
- 필수 표시(
- 버튼
- [취소] : 외근 반려 팝업만 닫힘
- [확인] 버튼
- 반려 사유를 입력해야 버튼 활성화됨
- 버튼 클릭하면 반려로 변경되고 모든 팝업 닫힘
- 반려 사유 입력 팝업 제공
- [승인]
- 외근신청서
② 반려 상태 일 때 '외근 상세' 팝업
- 외근 신청 내역과 반려 내역 제공
- 외근 신청 내역은 '외근신청서'에서 제공하는 정보와 동일
- 반려 내역에서 제공하는 정보
- 결재자 :
- 결재 일시 : 0000.00.00. 오전/오후 00:00:00
- 사유 :
③ 승인 상태일 때 '외근 상세' 팝업
- 외근 신청 내역과 승인 내역 제공
- 외근 신청 내역은 '외근신청서'에서 제공하는 정보와 동일
- 승인 내역에서 제공하는 정보
- 결재자 :
- 결재 일시 : 0000.00.00. 오전/오후 00:00:00
④ 보고서 대기 상태일 때 '외근 상세' 팝업
- 외근 신청 내역과 승인 내역 제공(승인일 때와 동일)
- 외근 보고서 대기 - 직원 : {성이름(사번)} - 근무일 : 2026.06.23. - 시작 시간 : {오전 11:59:00} - 종료 시간 : {오후 11:59:00} - 외근 시간 : {12.00} 시간 - 유형 : {평일} - 사유 :
- 푸터 버튼(외근 신청과 유사)
- [승인]
- 사유 입력: 불필요
- 동작
- 상태 변경되고 모든 팝업 닫힘
- 상태 : 보고서 대기 -> 보고서 승인
- 결재자, 결재 일시 기록
- 이때 근태 결과에 외근 내역 저장됨
- [반려]
- 반려 사유 입력 팝업 제공
- title : 외근보고서 반려
- 사유입력
- 필수 표시(
*표시) - 입력란
- placeholder : 반려사유를 입력해 주세요.
- 필수 표시(
- 버튼
- [취소] : 외근 반려 팝업만 닫힘
- [확인] 버튼
- 반려 사유를 입력해야 버튼 활성화됨
- 버튼 클릭하면 보고서 반려로 변경되고 모든 팝업 닫힘
- 반려 사유 입력 팝업 제공
- [승인]
⑤ 보고서 승인 상태일 때 '외근 상세' 팝업
- 외근 신청 내역과 승인 내역 제공(승인일 때와 동일)
- 외근 보고서 신청 내역와 보고서 승인 내역 제공
- 외근 보고서 신청 내역은 보고서 대기 상태 일 때와 동일
- 외근 보고서 승인 내역에서 제공하는 정보
- 결재자 :
- 결재 일시 :
2026.05.08. 오후 10:34:32 - 사유 : {입력한 사유} /없으면 '-' 표시
⑥ 보고서 반려 상태일 때 '외근 상세' 팝업
- 외근 신청 내역과 보고서 반려 내역 제공(승인일 때와 동일)
- 외근 보고서 신청 내역와 보고서 반려 내역 제공
- 외근 보고서 신청 내역은 보고서 대기 상태일 때 와 동일
- 외근 보고서 반려 내역에서 제공하는 정보
- 결재자 :
- 결재 일시 : 0000.00.00. 오전/오후 00:00:00
- 사유 :
⑦ 취소 상태일 때 '외근 상세' 팝업
- 외근 신청 내역(승인일 때와 동일) 제공
- 취소 내역 제공
- 직원 :
- 취소 일시 : 0000.00.00. 오전/오후 00:00:00
4️⃣ 체크박스 (일괄 결재) - 노출 조건 - 결재(탭) 에서만 제공 - 선택 가능한 행 - 대기 — 외근 신청 일괄 결재 대상 - 보고서 대기 — 외근 보고서 일괄 결재 대상 - 그 외 상태(승인, 반려, 취소, 보고서 승인, 보고서 반려, 취소 요청 중 등) — 체크박스 미표시 - 헤더 체크박스 - 표 첫 열(헤더)에 제공 - 선택 시 현재 페이지에 보이는 선택 가능 행만 전체 선택 - 상태 필터가 대기이면 대기 행만 - 상태 필터가 보고서 대기이면 보고서 대기 행만 - 상태 필터가 전체이면, 현재 페이지에 대기와 보고서 대기가 함께 있을 때는 먼저 선택된 단계와 같은 상태의 행만 전체 선택 - 해제 시 현재 선택 전체 해제 - 일괄 결재 액션 바 - 1건 이상 선택 시, 필터 영역 오른쪽에 표시 (공통정책: 필터 왼쪽 · 버튼 오른쪽) - 구성 (왼쪽부터) - {n}건 선택 - 선택 건 상태에 따른 버튼 - 대기 건만 선택된 경우 - [승인] - 사유 입력: 불필요 - 동작 - 선택한 모든 건을 대기 → 승인으로 변경 - 각 건마다 결재자·결재 일시 기록 - 직원이 Works에서 외근 보고서 작성 가능한 상태로 전환 - 처리 후 선택 해제 · 목록 새로고침 - [반려] - 외근 반려 팝업 제공 (① [보기] 반려와 동일) - title : 외근 반려 - 사유 입력: 필수 (* 표시) - placeholder : 반려사유를 입력해 주세요. - 안내: 선택한 {n}건에 동일한 반려 사유가 적용돼요. - [취소] : 반려 팝업만 닫힘 - [확인] : 사유 입력 시 활성화 · 클릭 시 모든 선택 건 반려 처리 후 팝업 닫힘 · 선택 해제 · 목록 새로고침 - 보고서 대기 건만 선택된 경우 - [보고서 승인] - 사유 입력: 불필요 - 동작 - 선택한 모든 건을 보고서 대기 → 보고서 승인으로 변경 - 각 건마다 결재자·결재 일시 기록 - 근태·급여 반영 (보고서 승인 완료 시점) - 처리 후 선택 해제 · 목록 새로고침 - [보고서 반려] - 외근보고서 반려 팝업 제공 (④ [보기] 반려와 동일) - title : 외근보고서 반려 - 사유 입력: 필수 (* 표시) - placeholder : 반려사유를 입력해 주세요. - 안내: 선택한 {n}건에 동일한 반려 사유가 적용돼요. - [취소] : 반려 팝업만 닫힘 - [확인] : 사유 입력 시 활성화 · 클릭 시 모든 선택 건 보고서 반려 처리 후 팝업 닫힘 · 선택 해제 · 목록 새로고침
유형 관리(탭)
1️⃣ 필터링
- 상태
- 옵션 : 전체, 활성, 비활성
- 기본 : 전체
2️⃣ [유형 추가] 버튼
- 리스트 뷰 위쪽에 오른쪽에 위치함
- 버튼을 누르면 '유형 추가' 팝업 제공
- 유형 추가 팝업
- title : 유형 추가
- 이름
- 입력란
- 필수입력 표시(
*표시) - placeholder : 거래처 방문
- 설명
- 입력란
- placeholder : 유형에 대한 설명을 입력해 주세요.
- 상태
- 드롭다운
- 기본 : 활성
- 옵션 : 활성, 비활성
- 비활성인 경우 Works(mobile)에서 해당 유형 보이지 않음
- 버튼
- [취소], [X]: 저장 없이 팝업만 닫힘
- [저장]
- 활성화: 이름 입력 후 버튼 활성화
- 클릭: 저장 후 팝업 닫힘 · 목록 갱신 · 추가한 행은 목록 상단으로 이동 3️⃣리스트 뷰
- [수정] 버튼
- 클릭하면 유형 수정 팝업 제공
- title:
유형 수정 - 필드는 유형 추가 팝업과 동일
- [삭제] 버튼
- 활성 상태일 때
- title:
삭제 - message:
외근 유형을 삭제할 수 없어요. 먼저 비활성 상태로 변경한 뒤 삭제할 수 있어요. - 버튼: [확인] — 팝업만 닫힘
- title:
- 상태 비활성 + 연결된 외근 내역 있음
- title:
삭제 - message:
이 유형을 사용한 외근 내역이 있어요. 삭제하면 해당 외근 내역의 유형은 **'삭제'**로 표시돼요. - 버튼
- [취소], [X]: 팝업만 닫힘
- [확인] : 유형 삭제 + 팝업 닫힘 + 해당 유형 사용한 외근 내역의 유형을 '삭제'로 표시
- title:
- 상태: 비활성 + 연결된 외근 내역 없음
- title:
삭제 - message:
{이름} 외근 유형을 삭제할까요? - 버튼
- [취소], [X]: 팝업만 닫힘
- [확인] : 유형 삭제 · 팝업 닫힘 · 목록 갱신
- title:
- 활성 상태일 때
| 이름 | 설명 | 관리 |
|---|---|---|
| 거래처 방문 | 거래처 방문일 때 사용하는 유형 | [수정][삭제] |
⚠️ 구현 현황 · 하드닝 후보 (2026-08-13)
정책 문서(위)와 실제 코드가 다른 지점이라 지식베이스 학습 시 주의가 필요해요. CODE가 진실이에요.
외근 "급여 반영" 은 실제로 급여에 반영되지 않음 [문서 수정 필요]
- 문서 기술: §결재 3️⃣④·§일괄결재 「보고서 승인」에서 "이때 근태 결과에 외근 내역 저장됨"(
working-outside.md:145), "근태·급여 반영 (보고서 승인 완료 시점)"(working-outside.md:222). - 실제 구현: 외근 보고서 승인 시
packages/api/src/routers/offsite-work.router.ts:662-671이Attendance행을 하나 저장하지만, 채우는 시간 컬럼은totalHours뿐이에요 (totalHours: Number(record.report?.actualHours ?? 0)). - 급여 미반영 이유: 연장·야간·휴일 급여 계산기는
regularHours·overtimeHours·nightHours·holidayRegularHours·holidayNightHours·weekendHours를 읽는데(packages/api/src/calculators/overtime-record.calculator.ts:172-201), 외근이 쓰는totalHours는 이 급여 버킷 중 어느 것도 아니에요.totalHours는 근태내역 시트 표시용으로만 읽혀요(sheet-rows/resolver.ts:504). 게다가 외근 라우터는AllowanceRecord/DeductionRecord를 전혀 쓰지 않아요. - 정리: 외근 승인 시 근태(Attendance) 행은 생성되지만 급여에는 0원 반영돼요. 문서의 "급여 반영"은 사용자·AI를 오도할 수 있어요.
외근 알림은 전부 결재자에게만 발송 (신청자 본인 미수신)
- 외근의 모든 알림(
신청·보고서 제출·승인·반려·취소·보고서 승인·보고서 반려)은notifyApprovers로 결재 권한자에게만 발송돼요(offsite-work.router.ts:325,415,466,515,584,684,741). 초과근무처럼 신청자 본인에게 승인/반려 결과를 알리는 경로는 없어요. (알림 문서alarm.md의 외근 표도 이와 어긋나 있어요 — 해당 문서 참고.)