jichoi / calendar star
박정하 박정하 9 hours ago
250811 박정하 휴가 및 사용자 연차 수정
@b0d9bade9ff5e90fd51c432b38ea9f10e62aba0c
 
client/resources/api/userYryc.js (added)
+++ client/resources/api/userYryc.js
@@ -0,0 +1,6 @@
+import { apiClient } from "./index";
+
+// 사용자 연차 초과 신청 여부 조회
+export const findUserExcessReqstAtProc = () => {
+  return apiClient.get('/userYryc/findUserExcessReqstAt.json');
+}(파일 끝에 줄바꿈 문자 없음)
client/views/pages/Manager/attendance/VcatnInsert.vue
--- client/views/pages/Manager/attendance/VcatnInsert.vue
+++ client/views/pages/Manager/attendance/VcatnInsert.vue
@@ -59,6 +59,9 @@
                 <EditorComponent v-model:contents="vacationCnsul.detailCn" />
               </td>
             </tr>
+            <tr class="red" v-if="excessReqst">
+              <td colspan="2">금년도 연차 소진으로 인해 내년도 연차를 선 사용하는 휴가 신청건입니다.</td>
+            </tr>
           </tbody>
         </table>
       </div>
@@ -81,6 +84,7 @@
 import EditorComponent from '../../../component/editor/EditorComponent.vue';
 // API
 import { findVcatnKndsProc, findVcatnProc, saveVcatnProc, findLastVcatnProc, updateVcatnProc, reapplyVcatnProc } from '../../../../resources/api/vcatn';
+import { findUserExcessReqstAtProc } from '../../../../resources/api/userYryc';
 
 export default {
   name: 'VacationInsert',
@@ -129,6 +133,7 @@
       },
       vacationTypes: [],
       approvalCodes: [],
+      excessReqst: false,
     };
   },
 
@@ -158,6 +163,7 @@
     this.pageId = this.$route.query.id;
     this.pageMode = this.$route.query.type;
 
+    await this.fetchUserExcessReqstAt(); // 사용자 연차 초과 신청 여부 조회
     await this.fetchVacationTypes(); // 휴가 유형 조회
     this.approvalCodes = await this.$findChildCodes('sanctn_code'); // 결재 구분 조회
   },
@@ -169,6 +175,30 @@
   },
 
   methods: {
+    // 사용자 연차 초과 신청 여부 조회
+    async fetchUserExcessReqstAt() {
+      try {
+        const response = await findUserExcessReqstAtProc();
+        const result = response.data.data;
+
+        this.excessReqst = result.isNegativeAnnualLeave;
+        if (this.excessReqst) {
+          const chk = confirm("금년도 연차를 모두 소진하였습니다.\n내년도 연차를 미리 사용하시겠습니까?");
+          if (!chk) {
+            this.handleNavigation('list');
+          }
+        } else {
+          if (result.isTotalCntOver) {
+            alert("이미 금년도 연차 보유 수 만큼 휴가를 신청한 상태입니다.\n마이너스 이월은 기존 휴가 신청이 모두 승인된 뒤 신청 가능합니다.");
+            this.handleNavigation('list');
+          }
+        }
+      } catch (error) {
+        this.handleError(error);
+        this.handleNavigation('list');
+      }
+    },
+
     // 휴가 유형 조회
     async fetchVacationTypes() {
       try {
@@ -536,8 +566,17 @@
         endMnt: this.vacationInfo.endMnt,
         detailCn: this.vacationCnsul.detailCn,
         sanctnList: sanctnList,
+        excessReqstAt: this.excessReqst ? 'Y' : 'N',
       };
     },
   },
 };
-</script>
(파일 끝에 줄바꿈 문자 없음)
+</script>
+<style scoped>
+.red th,
+.red td {
+  text-align: center;
+  color: #fb2c36 !important;
+  background-color: #fef2f2 !important;
+}
+</style>
(파일 끝에 줄바꿈 문자 없음)
client/views/pages/Manager/attendance/VcatnList.vue
--- client/views/pages/Manager/attendance/VcatnList.vue
+++ client/views/pages/Manager/attendance/VcatnList.vue
@@ -16,11 +16,11 @@
         </div>
         <div class="boxs">
           <div class="color-boxs">
-            <div class="box" @click="handleFilterChange()">
+            <div class="box">
               <h3>전체</h3>
               <div>
-                <span>{{ totalDays }}</span>
-                <small>({{ carriedOverDays }})</small>
+                <span @click="handleFilterChange()">{{ totalDays }}</span>
+                <small @click="handleExcessReqst(usedLeaveItem.code)">({{ carriedOverDays }})</small>
               </div>
             </div>
             <div class="box" @click="handleFilterChange(usedLeaveItem.code)">
@@ -161,8 +161,20 @@
       await this.handlePageChange(1);
     },
 
+    // 마이너스 이월
+    async handleExcessReqst(vcatnKnd) {
+      this.searchParams.excessReqstAt = 'Y';
+      this.searchParams.vcatnKnd = vcatnKnd;
+      await this.handlePageChange(1);
+    },
+
     // 필터 변경 핸들러
     async handleFilterChange(vcatnKnd) {
+      if (this.$isEmpty(vcatnKnd)) {
+        this.searchParams.excessReqstAt = null;
+      } else {
+        this.searchParams.excessReqstAt = 'N';
+      }
       this.searchParams.vcatnKnd = vcatnKnd;
       await this.handlePageChange(1);
     },
client/views/pages/Manager/attendance/VcatnView.vue
--- client/views/pages/Manager/attendance/VcatnView.vue
+++ client/views/pages/Manager/attendance/VcatnView.vue
@@ -22,7 +22,7 @@
               </tr>
               <tr>
                 <th>기간</th>
-                <td colspan="3">{{ $formattedDates(vacationInfo) }}</td>
+                <td colspan="3">{{ $formattedDates(vacationInfo) }} ({{ vacationInfo.totalDays }}일)</td>
               </tr>
               <tr>
                 <th>세부사항</th>
@@ -42,9 +42,8 @@
                 <th>반려사유</th>
                 <td colspan="3">{{ getRejectionReason(vacationInfo.sanctnList) }}</td>
               </tr>
-              <!-- 붉은 색 등 하여간 눈에 띄게 표기해야 함!! -->
-              <tr>
-                <td colspan="4">금년도 연차 소진으로 내년도 연차를 선 사용하는 휴가 신청건입니다.</td>
+              <tr class="red" v-if="vacationInfo.excessReqstAt === 'Y'">
+                <td colspan="4">금년도 연차 소진으로 인해 내년도 연차를 선 사용하는 휴가 신청건입니다.</td>
               </tr>
             </tbody>
           </table>
@@ -107,6 +106,7 @@
         detailCn: null,
         confmAtNm: null,
         rgsde: null,
+        excessReqstAt: 'N',
         sanctnList: []
       },
       returnResn: null,
@@ -254,4 +254,12 @@
     },
   }
 };
-</script>
(파일 끝에 줄바꿈 문자 없음)
+</script>
+<style scoped>
+.red th,
+.red td {
+  text-align: center;
+  color: #fb2c36 !important;
+  background-color: #fef2f2 !important;
+}
+</style>
(파일 끝에 줄바꿈 문자 없음)
Add a comment
List