jichoi / calendar star
최정임 최정임 05-12
250512 최정임
@e1bd1524c6cfaac108220447abd7a4a0e5abc439
 
client/resources/img/start-sm.png (Binary) (added)
+++ client/resources/img/start-sm.png
Binary file is not shown
 
client/resources/img/stop-sm.png (Binary) (added)
+++ client/resources/img/stop-sm.png
Binary file is not shown
 
client/resources/img/topmenuicon.png (Binary) (added)
+++ client/resources/img/topmenuicon.png
Binary file is not shown
client/resources/scss/admin/content.scss
--- client/resources/scss/admin/content.scss
+++ client/resources/scss/admin/content.scss
@@ -33,6 +33,7 @@
             }
         }
     }
+  
 }
 .sidemenu{
     width: 350px; 
@@ -151,14 +152,36 @@
              }
              .name{color: #000;}
         }
-        h2{ background: #213F9A; color: #fff; border-radius: 10px; font-size: 17px; text-align: left; padding: 10px 15px;}
+        details[open] > summary {
+         
+            background: #213F9A;
+            color: #fff;
+            
+            .icon{display: block;}
+          }
+
     }
     .menu-box{
+        summary{
+            cursor: pointer;
+            border: 1px solid #213F9A;
+            color: #000;
+            display: flex;
+            justify-content: space-between;
+            font-size: 17px;
+                text-align: left;
+                padding: 10px 15px;
+            border-radius: 10px;
+            .icon{display: none;}
+        }
+       
         margin-top: 20px;
+        ul{padding: 10px 10px 0px 10px;}
         li{
             margin-bottom: 10px;
             a{display: flex; justify-content: space-between;}
-            a:focus{outline: 0;}
+            
+            
         }
     }
     .boxs{
@@ -246,6 +269,7 @@
 .content{
     .pagination{
         margin-top: 20px;
+        margin-bottom: 5rem;
         ul {
             display: flex;
             list-style: none;
@@ -301,7 +325,7 @@
     }
     .top-content{display: flex; justify-content: space-between; gap: 40px; margin-bottom: 15px;}
     .boxs{
-        width: 550px;
+        // width: 550px;
     
         .blue-box{
             background-color: #D7DCF1;
@@ -362,16 +386,93 @@
         }
     }
     .card{
-        
+        .color-boxs{
+            display: flex;
+            justify-content: space-between;
+            gap: 10px;
+            margin-bottom: 20px;
+            .box{
+                display: block;
+                text-align: center;
+                width: calc(100% / 6);
+                background-color: #F9F9F9;
+                font-size: 30px;
+                font-weight: 700;
+                border-radius: 10px;
+                padding-bottom: 24px;
+                h3{background-color: #333333; color: #fff; border-radius: 10px;width: 100%; height: 50px;
+                    line-height: 50px;
+                    margin-bottom: 17px; font-size: 20px;}
+            }
+            .box.red{
+                background-color: #FEF3F3;
+                h3{background-color: #E92727;}
+
+            }
+            .box.green{
+                background-color: #EFF9FB;
+                h3{background-color: #3C97AB;}
+            }
+            .box.blue{
+                background-color: #E9EFF8;
+                h3{background-color: #1D75E1;}
+            }
+            .box.purple{
+                background-color: #F5EFFA;
+                h3{background-color: #A36CD4;}
+            }
+            .box.orange{
+                background-color: #FFF8F3;
+                h3{background-color: #F7941C;}
+            }
+
+        }
+        .name-box{
+            margin-bottom: 20px;
+            .img-area{
+                flex-shrink: 0;
+                margin-right: 30px;
+                width: 300px;
+                height: 150px;
+                background-color: #EFF1FA;
+                border-radius: 20px;
+                text-align: center;
+                padding: 20px;
+                .img{
+                    display: flex;
+                    justify-self: center;
+                    background-color: #fff;
+                    width: 92px;
+                    height: 110px;
+                    padding: 8px;
+                    img{object-fit: cover;     width: 100%;
+                        height: 100%;}
+                }
+            }
+            form{
+                input[readonly] {
+                    border-color: #fff;
+                    background-color: #fff !important;
+                    cursor: context-menu;
+                  }
+                  .col-12 {
+                    input{margin: 4px 10px;}
+                    label{line-height: 48px;}
+                  }
+            }
+
+        }
         .sch-form-wrap {
             justify-self: end;
-            margin: 20px 0 ;
+            margin-bottom: 20px;
             .input-group{
                 .form-select, .form-control{
                     height: 40px;
                     border-color: #C7CFE3;
                     font-size: 16px;
                 }
+                .form-control{padding-right: 30px; padding-left: 10px;}
+                .ico-sch{right: 5px;}
             }
             
           }
@@ -380,11 +481,15 @@
                 img{margin: 5px 5px 0 0;}
             }
             .input-group{width: auto; 
-                .form-control{padding-right: 30px;}
-                .ico-sch{right: 5px;}
+                
             }
         }
           .tbl-wrap{
+            table.buseo{
+                tbody{
+                    tr{cursor: pointer;}
+                }
+            }
             th,td{text-align: center !important; font-size: 16px !important;}
             .status-approved {
                 color: #1D75E1;
@@ -406,11 +511,28 @@
             img{margin-top: 9px;}
             }
         .card-body{
-           
+            .flex{display: flex; align-items: center;}
+            .flex.sb{justify-content: space-between;}
+           .card-title{            
+            margin-bottom: 20px;
+           }
+           .sub{
+            margin-right: 20px;
+            img{width: 50px; height: 50px;}
+            .date{margin-left: 10px;}
+           }
+           .sch-wrap{
+            border: 1px solid #213F9A;
+            padding: 20px;
+            border-radius: 10px;
+            margin-bottom: 20px;
+            .buttons{gap: 5px; margin-top: 0;}
+            .sch-form-wrap{margin-bottom: 0;}
+           }
             form{
-                margin-bottom:5rem;
+                
                 border: 1px solid #C7CFE3;
-            border-radius: 10px; overflow: hidden;}
+            border-radius: 10px; overflow: hidden;} 
             .col-12{
                 width: 100%;
                 display: flex;
@@ -418,9 +540,10 @@
                 label{width: 140px ;background: #EFF1FA; font-weight: 600; font-size: 16px; text-align: center; line-height: 70px; flex-shrink: 0; position: relative;}
                 p.require{
                     position: absolute;
-                    right: 44px;
-                    top: 26px;
+                    right: 37px;
+                    top: 23px;
                 }
+                .d-flex{display: flex; flex-shrink: 0;}
                select, input{margin: 15px 10px; border-color: #DDDDDD; height: var(--tk-input-h-sm);}
                .form-control[readonly]{background-color: #EFF1FA;}
                .invalid-feedback{color: #E92727; font-size: 13px;}
@@ -429,11 +552,99 @@
                 input{margin: 0;}
                 p{margin-top: 5px;}
                }
+               .approval-container{
+                display: flex;
+                 flex-direction: column;
+                    gap: 8px;
+                    margin: 15px 10px;
+                    .addapproval{
+                        gap: 5px;
+                        align-items: center;
+                        .form-control,  .form-select{margin:  0 ;}
+                        .delete-button{margin-left: 10px;}
+                    }
+               }
+             
+              
+             
+            }
+            .col-12.return{
+                .form-label{background-color: #FBC1C1;}
+                .form-control{background-color: #FFF2F2;}
             }
             .border-x{border: 0;}
-            .buttons{display: flex; gap: 10px; justify-content: end;
+            .buttons{display: flex; gap: 10px; justify-content: end; margin-top:5rem;
                 .btn-red{border-color: #E92727; color: #E92727; background-color: #EFF1FA;}
                 
+            }
+            .hyuga{
+                label{line-height: 40rem;}
+                input.textarea{min-height: 40rem;}
+              }
+              .chuljang{
+                label{line-height: 17rem;}
+                input.textarea{min-height: 17rem;}
+              }
+            .form-card{
+                position: relative;
+                border: 1px solid #CCCCCC;
+                border-radius: 10px;
+                padding: 30px;
+                h1{margin: 18px 0 48px 0; text-align: center;}
+                input[readonly] {
+                    border-color: #fff;
+                    background-color: #fff !important;
+                    cursor: context-menu;
+                  }
+                  .hyuga{
+                    label{line-height: 40rem;}
+                    input.textarea{min-height: 40rem;}
+                  }
+                  .chuljang{
+                    label{line-height: 17rem;}
+                    input.textarea{min-height: 17rem;}
+                  }
+                  .tbl2{
+                    width: 30rem;
+                    table{
+                        .thead{
+                            .th{
+                                writing-mode: vertical-rl; padding: 0; width: 50px;
+                            }
+                        }
+                    }
+                  }
+                  .approval-box{position: absolute; right: 30px; top: 30px;}
+                   
+                   
+                    
+                
+            }
+            .tbl2{
+                table{
+                    table-layout: fixed;
+                    margin-bottom: 10px;
+                    .thead{
+                        .th{background-color: #C7CFE3;  }
+                        td{background-color: #EFF1FA; height: 40px; font-weight: 700;} 
+                    } 
+                    td{padding: 0; border: 1px solid #C7CFE3; }
+
+                }
+            }
+            .datepicker-conts{
+                margin-bottom: 20px;
+                .datepicker-input{
+                    display: flex;
+                    justify-content: end;
+                    align-items: center;
+                    gap: 5px;
+                    .form-control{
+                        padding-right: 16px;
+                        border-color: #C7CFE3;
+                    }
+                    mark{background-color: transparent;}
+                }
             }
             
         }
@@ -470,4 +681,25 @@
     background: #ccc;
   }
 
-  .primary{background-color: #213F9A;}
(파일 끝에 줄바꿈 문자 없음)
+  .primary{background-color: #213F9A;}
+  a:focus{outline: 0;}
+  *:focus{outline: 0;}
+
+  .file {
+    background-color: #EFF1FA; width: 120px; border: #213F9A 1px solid ; border-radius: 10px; padding: 7px 0;
+    margin-top: 10px;
+  }
+  
+  .file-label {
+    width: inherit !important;
+    display: flex;
+    gap: 5px;
+    justify-content: center;
+    line-height: 0 !important;
+    cursor: pointer;
+    p{color: #000;}
+  }
+  
+  input[type="file"] {
+    display: none;
+  }
(파일 끝에 줄바꿈 문자 없음)
 
client/views/component/Breadcrumb.vue (added)
+++ client/views/component/Breadcrumb.vue
@@ -0,0 +1,113 @@
+<template>
+  <div v-if="breadcrumbList.length > 0" class="breadcrumb-warp">
+    <span class="home"><router-link :to="{path : this.$filters.ctxPath('/adm/main.page')}">홈</router-link> &gt; </span>
+    <span v-for="(crumb, index) in breadcrumbList" :key="index">
+      {{ crumb.menuNm }}
+      <span v-if="index < breadcrumbList.length - 1"> &gt; </span>
+    </span>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      breadcrumbList: [],
+    };
+  },
+  watch: {
+    // 페이지 이동 시 동작
+    $route: {
+      immediate: true,
+      handler() {
+        this.generateBreadcrumb();
+      }
+    },
+    // 새로고침 시 동작
+    '$store.state.menuList': {
+      immediate: true,
+      handler(val) {
+        if (val && val.length > 0) {
+          this.generateBreadcrumb();
+        }
+      }
+    },
+  },
+  methods: {
+    generateBreadcrumb() {
+      const menuState = this.$store.state;
+      const currentPath = this.$route.path;
+
+      // 관리자: childList 기반
+      const findFromTree = (menus, path, trail = []) => {
+        for (const menu of menus) {
+          const newTrail = [...trail, menu];
+          if (menu.routerUrl === path) {
+            this.$store.commit('setMenu', menu);
+            return newTrail;
+          }
+          if (menu.childList?.length) {
+            const found = findFromTree(menu.childList, path, newTrail);
+            if (found) return found;
+          }
+        }
+        return null;
+      };
+
+      // 사용자: upMenuId 기반
+      const findFromFlat = (flatMenus, path) => {
+        const findCurrent = flatMenus.find(menu => menu.routerUrl === path);
+        if (!findCurrent) return [];
+
+        this.$store.commit('setMenu', findCurrent);
+
+        const buildTrail = (menu, trail = []) => {
+          const parent = flatMenus.find(m => m.menuId === menu.upMenuId);
+          if (parent) {
+            return buildTrail(parent, [parent, ...trail]);
+          }
+          return trail;
+        };
+
+        const trail = buildTrail(findCurrent);
+        return [...trail, findCurrent];
+      };
+
+      // 메뉴 리스트 펼치기
+      const flattenMenus = (menus) => {
+        const result = [];
+
+        for (const menu of menus) {
+          result.push(menu);
+          if (menu.childList?.length) {
+            result.push(...flattenMenus(menu.childList));
+          }
+        }
+
+        return result;
+      }
+
+      let breadcrumb = [];
+
+      // 구조 판단
+      if (menuState.menuList?.length) {
+        // 사용자용
+        // const flatMenus = menuState.menuList.flatMap(menu =>
+        //   [menu, ...(menu.childList || [])]
+        // );
+        const flatMenus = flattenMenus(menuState.menuList);
+        breadcrumb = findFromFlat(flatMenus, currentPath);
+      } else if (menuState.menu?.childList?.length) {
+        // 관리자용
+        breadcrumb = findFromTree(menuState.menu.childList, currentPath);
+      }
+
+      this.breadcrumbList = breadcrumb;
+    },
+
+  },
+  mounted(){
+    // this.generateBreadcrumb();
+  }
+};
+</script>(파일 끝에 줄바꿈 문자 없음)
client/views/pages/AppRouter.js
--- client/views/pages/AppRouter.js
+++ client/views/pages/AppRouter.js
@@ -19,8 +19,20 @@
 import approvalList from '../pages/Manager/approval/approvalList.vue';
 import approvalRequest from '../pages/Manager/approval/approvalRequest.vue';
 import HyugaInsert from '../pages/Manager/approval/HyugaInsert.vue';
+import HyugaDetail from '../pages/Manager/approval/HyugaDetail.vue';
 import ChuljangInsert from '../pages/Manager/approval/ChuljangInsert.vue';
+import ChuljangDetail from '../pages/Manager/approval/ChuljangDetail.vue';
+import ChuljangPumui from '../pages/Manager/approval/ChuljangPumui.vue';
+import ChuljangPumuiDetail from '../pages/Manager/attendance/ChuljangPumuiDetail.vue';
+import ChuljangBokmyeong from '../pages/Manager/approval/ChuljangBokmyeong.vue';
+import ChuljangBokmyeongDetail from '../pages/Manager/attendance/ChuljangBokmyeongDetail.vue';
+import ChuljangDetailAll from '../pages/Manager/attendance/ChuljangDetailAll.vue';
 import attendance from '../pages/Manager/attendance/attendance.vue';
+import myAttendance from '../pages/Manager/attendance/myAttendance.vue';
+import buseoAttendance from '../pages/Manager/attendance/buseoAttendance.vue';
+import AttendanceDetail from '../pages/Manager/attendance/AttendanceDetail.vue';
+import hyugaStatue from '../pages/Manager/attendance/hyugaStatue.vue';
+import ChuljangStatue from '../pages/Manager/attendance/ChuljangStatue.vue';
 import task from '../pages/Manager/task/task.vue';
 import financial from '../pages/Manager/financial/financial.vue';
 import asset from '../pages/Manager/asset/asset.vue';
@@ -54,11 +66,29 @@
               name: 'approvalList',
               component: approvalList
             },
-            { path: '/ChuljangInsert.page', name: 'ChuljangInsert', component: ChuljangInsert },
+            { path: '/ChuljangPumui.page', name: 'ChuljangPumui', component: ChuljangPumui },
+            { path: '/ChuljangBokmyeong.page', name: 'ChuljangBokmyeong', component: ChuljangBokmyeong },
+           
+            
+        ]
+    }, //결재관리
+    { path: '/attendance-management.page', name: 'attendance', component: attendance,
+        children: [
+            { path: '/myAttendance.page', name: 'myAttendance', component: myAttendance },
+            { path: '/buseoAttendance.page', name: 'buseoAttendance', component: buseoAttendance },
+            { path: '/AttendanceDetail.page', name: 'AttendanceDetail', component: AttendanceDetail },
+            { path: '/hyugaStatue.page', name: 'hyugaStatue', component: hyugaStatue },
+            { path: '/HyugaDetail.page', name: 'HyugaDetail', component: HyugaDetail },
             { path: '/HyugaInsert.page', name: 'HyugaInsert', component: HyugaInsert },
-          ]
-     }, //결재관리
-    { path: '/attendance-management.page', name: 'attendance', component: attendance }, //근태관리
+            { path: '/ChuljangStatue.page', name: 'ChuljangStatue', component: ChuljangStatue },
+            { path: '/ChuljangDetail.page', name: 'ChuljangDetail', component: ChuljangDetail },
+            { path: '/ChuljangInsert.page', name: 'ChuljangInsert', component: ChuljangInsert },
+            { path: '/ChuljangPumuiDetail.page', name: 'ChuljangPumuiDetail', component: ChuljangPumuiDetail },
+            { path: '/ChuljangBokmyeongDetail.page', name: 'ChuljangBokmyeongDetail', component: ChuljangBokmyeongDetail },
+            { path: '/ChuljangDetailAll.page', name: 'ChuljangDetailAll', component: ChuljangDetailAll },
+
+        ]
+    }, //근태관리
     { path: '/task-management.page', name: 'task', component: task }, //업무관리
     { path: '/financial-management.page', name: 'financial', component: financial }, //재무관리
     { path: '/asset-management.page', name: 'asset', component: asset }, //자산관리
 
client/views/pages/Manager/approval/ChuljangBokmyeong.vue (added)
+++ client/views/pages/Manager/approval/ChuljangBokmyeong.vue
@@ -0,0 +1,201 @@
+<template>
+<div class="card ">
+      <div class="card-body">
+          <h2 class="card-title">승인 대기 목록</h2>
+       
+      <div class="form-card">
+        <h1>출장복명서</h1>
+        <div class="approval-box tbl-wrap tbl2">
+         <table class="tbl data">
+          <tbody>
+            <tr class="thead">
+              <td rowspan="2" class="th">승인자</td>
+              <td>과장</td>
+              <td>소장</td>
+            </tr>
+            <tr>
+              <td><p class="name">홍길동</p><p class="date">2025/05/09</p></td>
+              <td><p class="name">홍길동</p><p class="date">2025/05/09</p></td>
+            </tr>
+          </tbody>
+
+         </table>
+        </div>
+          <form class="row g-3 needs-validation "  :class="{ 'was-validated': formSubmitted }" @submit.prevent="handleRegister" novalidate>
+                <div class="col-12 ">
+                  <div class="col-12 border-x">
+                    <label for="youremail" class="form-label ">출장구분<p class="require"><img :src="require" alt=""></p></label>
+                    <input  v-model="email" type="text" name="username" class="form-control" id="youremail" readonly >
+                  </div>
+    
+                  <div class="col-12 border-x">
+                    <label for="yourPassword" class="form-label">이름</label>
+                    <input  v-model="password" type="password" name="password" class="form-control" id="yourPassword" readonly   placeholder="주식회사 테이큰 소프트"> 
+                  </div>
+               </div>
+               <div class="col-12">
+                  <div class="col-12 border-x">
+                    <label for="youremail" class="form-label">부서</label>
+                    <input  v-model="email" type="text" name="username" class="form-control" id="youremail" readonly  placeholder="과장">
+                  </div>
+    
+                  <div class="col-12 border-x">
+                    <label for="yourPassword" class="form-label">직급</label>
+                    <input  v-model="password" type="password" name="password" class="form-control" id="yourPassword" readonly  placeholder="팀장"> 
+                  </div>
+               </div>
+               <div class="col-12">
+                  <label for="yourName" class="form-label">출장지</label>
+                  <input  v-model="name" type="text" name="name" class="form-control" id="yourName" readonly>
+            </div>
+            <div class="col-12">
+                  <label for="yourName" class="form-label">출장목적</label>
+                  <input v-model="name" type="text" name="name" class="form-control " id="yourName" readonly>
+            </div>
+            <div class="col-12">
+                  <label for="yourName" class="form-label">동행자</label>
+                  <input v-model="name" type="text" name="name" class="form-control " id="yourName" readonly>
+            </div>
+            <div class="col-12 chuljang">
+                  <label for="yourName" class="form-label">복명내용</label>
+                  <input v-model="name" type="text" name="name" class="form-control textarea " id="yourName" readonly>
+            </div>
+            <div class="col-12">
+                  <label for="yourName" class="form-label">법인카드</label>
+                  <input v-model="name" type="text" name="name" class="form-control " id="yourName" readonly>
+            </div>
+            <div class="col-12">
+                  <label for="yourName" class="form-label">법인차량</label>
+                  <input v-model="name" type="text" name="name" class="form-control " id="yourName" readonly>
+            </div>
+            <div class="col-12">
+                  <label for="yourName" class="form-label">여비계산</label>
+                  <input v-model="name" type="text" name="name" class="form-control " id="yourName" readonly>
+            </div>
+            <div class="col-12 border-x">
+                  <label for="yourName" class="form-label">복명 신청일</label>
+                  <input  v-model="name" type="text" name="name" class="form-control" id="yourName" readonly   placeholder="2025-01-01">
+            </div>
+           
+                
+              </form>
+      </div>
+            <div class="buttons">
+              <button class="btn primary"  type="submit">승인</button>
+                <button class="btn btn-red "  type="submit">반려</button>
+                <button class="btn tertiary "  type="submit">목록</button>
+              </div>
+
+      </div>
+    </div>
+</template>
+
+<script>
+export default {
+  data() {
+    const today = new Date().toISOString().split('T')[0];
+    return {
+      startDate: today,
+      startTime: "09:00", // 기본 시작 시간 09:00
+      endDate: today,
+      endTime: "18:00", // 기본 종료 시간 18:00
+      category: "", 
+      dayCount: 1, 
+      reason: "", // 사유
+      listData: [
+  {
+    type: '연차',
+    approvalType: '결재',
+    applicant: '홍길동',
+    period: '2025-05-10 ~ 2025-15-03',
+    requestDate: '2025-04-25',
+    status: '대기'
+  },   {
+    type: '반차',
+    approvalType: '전결',
+    applicant: '홍길동',
+    period: '2025-05-01 ~ 2025-05-03',
+    requestDate: '2025-04-25',
+    status: '승인'
+  }],
+    };
+  },
+  computed: {
+    // Pinia Store의 상태를 가져옵니다.
+    loginUser() {
+      const authStore = useAuthStore();
+      return authStore.getLoginUser;
+    },
+  },
+  methods: {
+    // 폼 검증 메서드
+    validateForm() {
+      // 필수 입력 필드 체크
+      if (
+        this.category &&
+        this.startDate &&
+        this.startTime &&
+        this.endDate &&
+        this.endTime &&
+        this.dayCount > 0 &&
+        this.reason.trim() !== ""
+      ) {
+        this.isFormValid = true;
+      } else {
+        this.isFormValid = false;
+      }
+    },
+    calculateDayCount() {
+    const start = new Date(`${this.startDate}T${this.startTime}:00`);
+    const end = new Date(`${this.endDate}T${this.endTime}:00`);
+    
+    let totalHours = (end - start) / (1000 * 60 * 60);  // 밀리초를 시간 단위로 변환
+    
+    if (this.startDate !== this.endDate) {
+      // 시작일과 종료일이 다른경우
+      const startDateObj = new Date(this.startDate);
+      const endDateObj = new Date(this.endDate);
+      const daysDifference = (endDateObj - startDateObj) / (1000 * 60 * 60 * 24); // 두 날짜 사이의 차이를 일수로 계산
+      if (this.startTime !== "09:00" || this.endTime !== "18:00") {
+        this.dayCount = daysDifference + 0.5; // 시간 조건이 기준에서 벗어날 경우
+      } else {
+        this.dayCount = Math.ceil(daysDifference + 1); // 시간 조건이 기준에 맞을 경우
+      }
+    } else {
+      // 시작일과 종료일이 같은 경우
+      if (this.startTime !== "09:00" || this.endTime !== "18:00") {
+        this.dayCount = 0.5; // 시작 시간 또는 종료 시간이 기준과 다를 경우 0.5
+      } else {
+        this.dayCount = 1; // 기준 시간(09:00~18:00)이 맞으면 1일로 간주
+      }
+    }
+
+    this.validateForm(); // dayCount 변경 후 폼 재검증
+  },
+    handleSubmit() {
+      this.validateForm(); // 제출 시 유효성 확인
+      if (this.isFormValid) {
+        localStorage.setItem('HyugaFormData', JSON.stringify(this.$data));
+        alert("승인 요청이 완료되었습니다.");
+        // 추가 처리 로직 (API 요청 등)
+      } else {
+        alert("모든 필드를 올바르게 작성해주세요.");
+      }
+    },
+    
+    
+  },
+  mounted() {
+    // Load the saved form data when the page is loaded
+    this.loadFormData();
+  },
+  watch: {
+  startDate: 'calculateDayCount',
+  startTime: 'calculateDayCount',
+  endDate: 'calculateDayCount',
+  endTime: 'calculateDayCount',
+  reason: "validateForm",
+  category: 'category',
+  },
+};
+</script>
 
client/views/pages/Manager/approval/ChuljangDetail.vue (added)
+++ client/views/pages/Manager/approval/ChuljangDetail.vue
@@ -0,0 +1,186 @@
+<template>
+<div class="card ">
+      <div class="card-body">
+          <h2 class="card-title">승인 대기 목록</h2>
+       
+      <div class="form-card">
+        <h1>휴가신청서</h1>
+        <div class="approval-box tbl-wrap tbl2">
+         <table class="tbl data">
+          <tbody>
+            <tr class="thead">
+              <td rowspan="2" class="th">승인자</td>
+              <td>과장</td>
+              <td>소장</td>
+            </tr>
+            <tr>
+              <td><p class="name">홍길동</p><p class="date">2025/05/09</p></td>
+              <td><p class="name">홍길동</p><p class="date">2025/05/09</p></td>
+            </tr>
+          </tbody>
+
+         </table>
+        </div>
+          <form class="row g-3 needs-validation "  :class="{ 'was-validated': formSubmitted }" @submit.prevent="handleRegister" novalidate>
+                <div class="col-12 ">
+                  <div class="col-12 border-x">
+                    <label for="youremail" class="form-label ">유형<p class="require"><img :src="require" alt=""></p></label>
+                    <input  v-model="email" type="text" name="username" class="form-control" id="youremail" readonly >
+                  </div>
+    
+                  <div class="col-12 border-x">
+                    <label for="yourPassword" class="form-label">신청자</label>
+                    <input  v-model="password" type="password" name="password" class="form-control" id="yourPassword" readonly   placeholder="주식회사 테이큰 소프트"> 
+                  </div>
+               </div>
+               <div class="col-12">
+                  <div class="col-12 border-x">
+                    <label for="youremail" class="form-label">부서</label>
+                    <input  v-model="email" type="text" name="username" class="form-control" id="youremail" readonly  placeholder="과장">
+                  </div>
+    
+                  <div class="col-12 border-x">
+                    <label for="yourPassword" class="form-label">직급</label>
+                    <input  v-model="password" type="password" name="password" class="form-control" id="yourPassword" readonly  placeholder="팀장"> 
+                  </div>
+               </div>
+               <div class="col-12">
+                  <label for="yourName" class="form-label">기간</label>
+                  <input  v-model="name" type="text" name="name" class="form-control" id="yourName" readonly>
+            </div>
+            <div class="col-12 hyuga">
+                  <label for="yourName" class="form-label">세부사항</label>
+                  <input v-model="name" type="text" name="name" class="form-control textarea" id="yourName" readonly>
+            </div>
+            <div class="col-12 ">
+                  <label for="yourName" class="form-label">신청일</label>
+                  <input v-model="name" type="text" name="name" class="form-control " id="yourName" readonly>
+            </div>
+            <div class="col-12 border-x" :class="{ return: isReturned }">
+                  <label for="yourName" class="form-label ">반려사유</label>
+                  <input  v-model="name" type="text" name="name" class="form-control" id="yourName" readonly   >
+            </div>
+           
+                
+              </form>
+      </div>
+            <div class="buttons">
+              <button class="btn  btn-red"  type="submit">신청취소</button>
+                <button class="btn secondary"  type="submit">  {{ isReturned ? '재신청' : '수정' }}</button>
+                <button class="btn tertiary "  type="submit">목록</button>
+              </div>
+
+      </div>
+    </div>
+</template>
+
+<script>
+export default {
+  data() {
+    const today = new Date().toISOString().split('T')[0];
+    return {
+      isReturned: true,
+      startDate: today,
+      startTime: "09:00", // 기본 시작 시간 09:00
+      endDate: today,
+      endTime: "18:00", // 기본 종료 시간 18:00
+      category: "", 
+      dayCount: 1, 
+      reason: "", // 사유
+      listData: [
+  {
+    type: '연차',
+    approvalType: '결재',
+    applicant: '홍길동',
+    period: '2025-05-10 ~ 2025-15-03',
+    requestDate: '2025-04-25',
+    status: '대기'
+  },   {
+    type: '반차',
+    approvalType: '전결',
+    applicant: '홍길동',
+    period: '2025-05-01 ~ 2025-05-03',
+    requestDate: '2025-04-25',
+    status: '승인'
+  }],
+    };
+  },
+  computed: {
+    // Pinia Store의 상태를 가져옵니다.
+    loginUser() {
+      const authStore = useAuthStore();
+      return authStore.getLoginUser;
+    },
+  },
+  methods: {
+    // 폼 검증 메서드
+    validateForm() {
+      // 필수 입력 필드 체크
+      if (
+        this.category &&
+        this.startDate &&
+        this.startTime &&
+        this.endDate &&
+        this.endTime &&
+        this.dayCount > 0 &&
+        this.reason.trim() !== ""
+      ) {
+        this.isFormValid = true;
+      } else {
+        this.isFormValid = false;
+      }
+    },
+    calculateDayCount() {
+    const start = new Date(`${this.startDate}T${this.startTime}:00`);
+    const end = new Date(`${this.endDate}T${this.endTime}:00`);
+    
+    let totalHours = (end - start) / (1000 * 60 * 60);  // 밀리초를 시간 단위로 변환
+    
+    if (this.startDate !== this.endDate) {
+      // 시작일과 종료일이 다른경우
+      const startDateObj = new Date(this.startDate);
+      const endDateObj = new Date(this.endDate);
+      const daysDifference = (endDateObj - startDateObj) / (1000 * 60 * 60 * 24); // 두 날짜 사이의 차이를 일수로 계산
+      if (this.startTime !== "09:00" || this.endTime !== "18:00") {
+        this.dayCount = daysDifference + 0.5; // 시간 조건이 기준에서 벗어날 경우
+      } else {
+        this.dayCount = Math.ceil(daysDifference + 1); // 시간 조건이 기준에 맞을 경우
+      }
+    } else {
+      // 시작일과 종료일이 같은 경우
+      if (this.startTime !== "09:00" || this.endTime !== "18:00") {
+        this.dayCount = 0.5; // 시작 시간 또는 종료 시간이 기준과 다를 경우 0.5
+      } else {
+        this.dayCount = 1; // 기준 시간(09:00~18:00)이 맞으면 1일로 간주
+      }
+    }
+
+    this.validateForm(); // dayCount 변경 후 폼 재검증
+  },
+    handleSubmit() {
+      this.validateForm(); // 제출 시 유효성 확인
+      if (this.isFormValid) {
+        localStorage.setItem('HyugaFormData', JSON.stringify(this.$data));
+        alert("승인 요청이 완료되었습니다.");
+        // 추가 처리 로직 (API 요청 등)
+      } else {
+        alert("모든 필드를 올바르게 작성해주세요.");
+      }
+    },
+    
+    
+  },
+  mounted() {
+    // Load the saved form data when the page is loaded
+    this.loadFormData();
+  },
+  watch: {
+  startDate: 'calculateDayCount',
+  startTime: 'calculateDayCount',
+  endDate: 'calculateDayCount',
+  endTime: 'calculateDayCount',
+  reason: "validateForm",
+  category: 'category',
+  },
+};
+</script>
client/views/pages/Manager/approval/ChuljangInsert.vue
--- client/views/pages/Manager/approval/ChuljangInsert.vue
+++ client/views/pages/Manager/approval/ChuljangInsert.vue
@@ -1,106 +1,155 @@
 <template>
-  <div class="pagetitle">
-    <h2>출장신청</h2>
-  </div><!-- End Page Title -->
+  <div class="card">
+    <div class="card-body">
+      <h2 class="card-title">출장 현황</h2>
+      <!-- Multi Columns Form -->
+      <form class="row g-3 pt-3  needs-validation" @submit.prevent="handleSubmit">
 
-  <section class="section">
-    <div class="card">
-      <div class="card-body">
 
-        <!-- Multi Columns Form -->
-        <form class="row g-3 pt-3" @submit.prevent="handleSubmit">
+        <div class="col-12">
+          <label for="where" class="form-label">출장구분</label>
+          <input type="text" class="form-control" id="where" v-model="where" />
+        </div>
+        <div class="col-12">
+          <label for="where" class="form-label">출장지</label>
+          <input type="text" class="form-control" id="where" v-model="where" />
+        </div>
+        <div class="col-12">
+          <label for="where" class="form-label">출장목적</label>
+          <input type="text" class="form-control" id="where" v-model="where" />
+        </div>
+        <div class="col-12">
+          <label for="where" class="form-label">출장기간</label>
+          <input type="text" class="form-control" id="where" v-model="where" />
+        </div>
 
-          <div class="col-md-5">
-            <label for="startDate" class="form-label">시작일</label>
-            <div class="d-flex gap-1">
-              <input type="date" class="form-control" id="startDate" v-model="startDate" />
-              <select class="form-control" id="startTime" v-model="startTime">
-                <option value="09:00">09:00</option>
-                <option value="10:00">10:00</option>
-                <option value="11:00">11:00</option>
-                <option value="12:00">12:00</option>
-                <option value="13:00">13:00</option>
-                <option value="14:00">14:00</option>
-                <option value="15:00">15:00</option>
-                <option value="16:00">16:00</option>
-                <option value="17:00">17:00</option>
-                <option value="18:00">18:00</option>
+        <div class="col-12">
+          <label for="purpose" class="form-label">동행자</label>
+          <input type="text" class="form-control" id="purpose" v-model="purpose" />
+        </div>
+        <div class="col-12">
+          <label for="purpose" class="form-label">법인카드</label>
+          <input type="text" class="form-control" id="purpose" v-model="purpose" />
+        </div>
+        <div class="col-12">
+          <label for="purpose" class="form-label">법인차량</label>
+          <input type="text" class="form-control" id="purpose" v-model="purpose" />
+        </div>
+
+        <div class="col-12">
+          <label for="member" class="form-label">
+            승인자
+            <button type="button" title="추가" @click="addApproval">
+              <PlusCircleFilled />
+            </button>
+          </label>
+
+          <div class="approval-container">
+            <div v-for="(approval, index) in approvals" :key="index" class="d-flex gap-2 addapproval mb-2">
+              <select class="form-select" v-model="approval.category" style="width: 110px;">
+                <option value="결재">결재</option>
+                <option value="전결">전결</option>
+                <option value="대결">대결</option>
               </select>
-            </div>
-          </div>
 
-          <div class="col-md-5">
-            <label for="endDate" class="form-label">종료일</label>
-            <div class="d-flex gap-1">
-              <input type="date" class="form-control" id="endDate" v-model="endDate" />
-              <select class="form-control" id="endTime" v-model="endTime">
-                <option value="09:00">09:00</option>
-                <option value="10:00">10:00</option>
-                <option value="11:00">11:00</option>
-                <option value="12:00">12:00</option>
-                <option value="13:00">13:00</option>
-                <option value="14:00">14:00</option>
-                <option value="15:00">15:00</option>
-                <option value="16:00">16:00</option>
-                <option value="17:00">17:00</option>
-                <option value="18:00">18:00</option>
-              </select>
-            </div>
-          </div>
-
-          <div class="col-12">
-            <label for="where" class="form-label">출장지</label>
-            <input type="text" class="form-control" id="where" v-model="where" />
-          </div>
-
-          <div class="col-12">
-            <label for="purpose" class="form-label">출장목적</label>
-            <input type="text" class="form-control" id="purpose" v-model="purpose" />
-          </div>
-
-          <div class="col-6">
-            <label for="member" class="form-label">동행자</label>
-            <div class="search-bar d-flex gap-2">
-              <form class="search-form d-flex align-items-center" method="POST" action="#"
-                @submit.prevent="updateMember">
-                <input type="text" v-model="searchQuery" name="query" placeholder="Search" title="Enter search keyword" />
-                <button type="submit" title="Search"><PlusOutlined /></button>
+              <form class="d-flex align-items-center border-x">
+                <input type="text" class="form-control" v-model="approval.name" style="max-width: 150px;" />
+                <button type="button" @click="removeApproval(index)" class="delete-button">
+                  <CloseOutlined />
+                </button>
               </form>
-              <input type="text" class="select-member" :value="selectedMember.join(' ')" readonly />
             </div>
           </div>
+        </div>
+        <div class="col-12 chuljang">
+          <label for="prvonsh" class="form-label">복명내용</label>
+          <input type="text" class="form-control textarea" id="reason" v-model="reason" />
+        </div>
+        <div class="col-12 border-x">
+          <label for="member" class="form-label">
+            여비계산
+            <button type="button" title="추가" @click="addApproval">
+              <PlusCircleFilled />
+            </button>
+          </label>
 
-          <div class="text-end">
-            <button type="submit" class="btn primary">승인요청</button>
-            <button type="reset" class="btn secondary">취소</button>
+          <div class="approval-container">
+            <div v-for="(approval, index) in approvals" :key="index" class="d-flex gap-2 addapproval mb-2">
+              <select class="form-select" v-model="approval.category" style="width: 140px;">
+                <option value="결재">개인결제</option>
+                <option value="전결">법인결제</option>
+              </select>
+              <select class="form-select" v-model="approval.category" style="width: 110px;">
+                <option value="결재">법인</option>
+                <option value="전결">개인</option>
+              </select>
+              <select class="form-select" v-model="approval.category" style="width: 110px;">
+                <option value="결재" selected>구분</option>
+                <option value="전결">개인</option>
+              </select>
+
+                <input type="text" class="form-control" v-model="approval.name" style="max-width: 150px;" />
+                <div class="">
+    <!-- 커스텀 업로드 버튼 -->
+   <button>
+      <label for="fileUpload" >
+      영수증 첨부
+      </label>
+   </button>
+
+    <!-- 실제 파일 input (숨김 처리) -->
+    <input
+      id="fileUpload"
+      type="file"
+      @change="handleFileUpload"
+      class="hidden-file-input"
+    />
+
+    
+  </div>
+  <!-- 선택된 파일 이름 표시 -->
+  <span v-if="fileName" class="file-name">{{ fileName }}</span>
+                <button type="button" @click="removeApproval(index)" class="delete-button">
+                  <CloseOutlined />
+                </button>
+            </div>
           </div>
+        </div>
 
-        </form><!-- End Multi Columns Form -->
-
+      </form>
+      <div class="buttons">
+        <button type="submit" class="btn primary">승인요청</button>
+        <button type="reset" class="btn secondary">취소</button>
       </div>
+
     </div>
-  </section>
+  </div>
 </template>
 
 <script>
-import { PlusOutlined } from '@ant-design/icons-vue';
+import { PlusCircleFilled, CloseOutlined } from '@ant-design/icons-vue';
 
 export default {
   data() {
     const today = new Date().toISOString().split('T')[0];
     return {
+      fileName: '',
       startDate: today,
       startTime: '09:00',
       endDate: today,
       endTime: '18:00',
       where: '',
       purpose: '',
-      selectedMember: [],
-      searchQuery: '', 
+      approvals: [
+        {
+          category: '결재',
+          name: '',
+        },
+      ],
     };
   },
   components: {
-    PlusOutlined,
+    PlusCircleFilled, CloseOutlined
   },
   computed: {
     loginUser() {
@@ -110,13 +159,21 @@
   },
 
   methods: {
-    updateMember() {
-      // Add the search query to the selectedMembers array if it's not empty
-      if (this.searchQuery.trim()) {
-        this.selectedMember.push(this.searchQuery.trim());
+    handleFileUpload(event) {
+      const file = event.target.files[0];
+      if (file) {
+        this.fileName = file.name;
       }
-      // Clear the search query after adding it to selectedMembers
-      this.searchQuery = '';
+    },
+    addApproval() {
+      this.approvals.push({
+        category: '결재',
+        name: '',
+      });
+    },
+    // 승인자 삭제
+    removeApproval(index) {
+      this.approvals.splice(index, 1);
     },
     validateForm() {
       // 필수 입력 필드 체크
@@ -186,8 +243,8 @@
     startTime: 'calculateDayCount',
     endDate: 'calculateDayCount',
     endTime: 'calculateDayCount',
-    where: 'validateForm', 
-    purpose: "validateForm", 
+    where: 'validateForm',
+    purpose: "validateForm",
   },
 };
 </script>
 
client/views/pages/Manager/approval/ChuljangPumui.vue (added)
+++ client/views/pages/Manager/approval/ChuljangPumui.vue
@@ -0,0 +1,197 @@
+<template>
+<div class="card ">
+      <div class="card-body">
+          <h2 class="card-title">승인 대기 목록</h2>
+       
+      <div class="form-card">
+        <h1>출장품의서</h1>
+        <div class="approval-box tbl-wrap tbl2">
+         <table class="tbl data">
+          <tbody>
+            <tr class="thead">
+              <td rowspan="2" class="th">승인자</td>
+              <td>과장</td>
+              <td>소장</td>
+            </tr>
+            <tr>
+              <td><p class="name">홍길동</p><p class="date">2025/05/09</p></td>
+              <td><p class="name">홍길동</p><p class="date">2025/05/09</p></td>
+            </tr>
+          </tbody>
+
+         </table>
+        </div>
+          <form class="row g-3 needs-validation "  :class="{ 'was-validated': formSubmitted }" @submit.prevent="handleRegister" novalidate>
+                <div class="col-12 ">
+                  <div class="col-12 border-x">
+                    <label for="youremail" class="form-label ">출장구분<p class="require"><img :src="require" alt=""></p></label>
+                    <input  v-model="email" type="text" name="username" class="form-control" id="youremail" readonly >
+                  </div>
+    
+                  <div class="col-12 border-x">
+                    <label for="yourPassword" class="form-label">이름</label>
+                    <input  v-model="password" type="password" name="password" class="form-control" id="yourPassword" readonly   placeholder="주식회사 테이큰 소프트"> 
+                  </div>
+               </div>
+               <div class="col-12">
+                  <div class="col-12 border-x">
+                    <label for="youremail" class="form-label">부서</label>
+                    <input  v-model="email" type="text" name="username" class="form-control" id="youremail" readonly  placeholder="과장">
+                  </div>
+    
+                  <div class="col-12 border-x">
+                    <label for="yourPassword" class="form-label">직급</label>
+                    <input  v-model="password" type="password" name="password" class="form-control" id="yourPassword" readonly  placeholder="팀장"> 
+                  </div>
+               </div>
+               <div class="col-12">
+                  <label for="yourName" class="form-label">출장지</label>
+                  <input  v-model="name" type="text" name="name" class="form-control" id="yourName" readonly>
+            </div>
+            <div class="col-12">
+                  <label for="yourName" class="form-label">출장목적</label>
+                  <input v-model="name" type="text" name="name" class="form-control " id="yourName" readonly>
+            </div>
+            <div class="col-12">
+                  <label for="yourName" class="form-label">동행자</label>
+                  <input v-model="name" type="text" name="name" class="form-control " id="yourName" readonly>
+            </div>
+            <div class="col-12 chuljang">
+                  <label for="yourName" class="form-label">내용</label>
+                  <input v-model="name" type="text" name="name" class="form-control textarea " id="yourName" readonly>
+            </div>
+            <div class="col-12">
+                  <label for="yourName" class="form-label">법인카드</label>
+                  <input v-model="name" type="text" name="name" class="form-control " id="yourName" readonly>
+            </div>
+            <div class="col-12">
+                  <label for="yourName" class="form-label">법인차량</label>
+                  <input v-model="name" type="text" name="name" class="form-control " id="yourName" readonly>
+            </div>
+            <div class="col-12 border-x">
+                  <label for="yourName" class="form-label">품의 신청일</label>
+                  <input  v-model="name" type="text" name="name" class="form-control" id="yourName" readonly   placeholder="2025-01-01">
+            </div>
+           
+                
+              </form>
+      </div>
+            <div class="buttons">
+              <button class="btn primary"  type="submit">승인</button>
+                <button class="btn btn-red "  type="submit">반려</button>
+                <button class="btn tertiary "  type="submit">목록</button>
+              </div>
+
+      </div>
+    </div>
+</template>
+
+<script>
+export default {
+  data() {
+    const today = new Date().toISOString().split('T')[0];
+    return {
+      startDate: today,
+      startTime: "09:00", // 기본 시작 시간 09:00
+      endDate: today,
+      endTime: "18:00", // 기본 종료 시간 18:00
+      category: "", 
+      dayCount: 1, 
+      reason: "", // 사유
+      listData: [
+  {
+    type: '연차',
+    approvalType: '결재',
+    applicant: '홍길동',
+    period: '2025-05-10 ~ 2025-15-03',
+    requestDate: '2025-04-25',
+    status: '대기'
+  },   {
+    type: '반차',
+    approvalType: '전결',
+    applicant: '홍길동',
+    period: '2025-05-01 ~ 2025-05-03',
+    requestDate: '2025-04-25',
+    status: '승인'
+  }],
+    };
+  },
+  computed: {
+    // Pinia Store의 상태를 가져옵니다.
+    loginUser() {
+      const authStore = useAuthStore();
+      return authStore.getLoginUser;
+    },
+  },
+  methods: {
+    // 폼 검증 메서드
+    validateForm() {
+      // 필수 입력 필드 체크
+      if (
+        this.category &&
+        this.startDate &&
+        this.startTime &&
+        this.endDate &&
+        this.endTime &&
+        this.dayCount > 0 &&
+        this.reason.trim() !== ""
+      ) {
+        this.isFormValid = true;
+      } else {
+        this.isFormValid = false;
+      }
+    },
+    calculateDayCount() {
+    const start = new Date(`${this.startDate}T${this.startTime}:00`);
+    const end = new Date(`${this.endDate}T${this.endTime}:00`);
+    
+    let totalHours = (end - start) / (1000 * 60 * 60);  // 밀리초를 시간 단위로 변환
+    
+    if (this.startDate !== this.endDate) {
+      // 시작일과 종료일이 다른경우
+      const startDateObj = new Date(this.startDate);
+      const endDateObj = new Date(this.endDate);
+      const daysDifference = (endDateObj - startDateObj) / (1000 * 60 * 60 * 24); // 두 날짜 사이의 차이를 일수로 계산
+      if (this.startTime !== "09:00" || this.endTime !== "18:00") {
+        this.dayCount = daysDifference + 0.5; // 시간 조건이 기준에서 벗어날 경우
+      } else {
+        this.dayCount = Math.ceil(daysDifference + 1); // 시간 조건이 기준에 맞을 경우
+      }
+    } else {
+      // 시작일과 종료일이 같은 경우
+      if (this.startTime !== "09:00" || this.endTime !== "18:00") {
+        this.dayCount = 0.5; // 시작 시간 또는 종료 시간이 기준과 다를 경우 0.5
+      } else {
+        this.dayCount = 1; // 기준 시간(09:00~18:00)이 맞으면 1일로 간주
+      }
+    }
+
+    this.validateForm(); // dayCount 변경 후 폼 재검증
+  },
+    handleSubmit() {
+      this.validateForm(); // 제출 시 유효성 확인
+      if (this.isFormValid) {
+        localStorage.setItem('HyugaFormData', JSON.stringify(this.$data));
+        alert("승인 요청이 완료되었습니다.");
+        // 추가 처리 로직 (API 요청 등)
+      } else {
+        alert("모든 필드를 올바르게 작성해주세요.");
+      }
+    },
+    
+    
+  },
+  mounted() {
+    // Load the saved form data when the page is loaded
+    this.loadFormData();
+  },
+  watch: {
+  startDate: 'calculateDayCount',
+  startTime: 'calculateDayCount',
+  endDate: 'calculateDayCount',
+  endTime: 'calculateDayCount',
+  reason: "validateForm",
+  category: 'category',
+  },
+};
+</script>
 
client/views/pages/Manager/approval/HyugaDetail.vue (added)
+++ client/views/pages/Manager/approval/HyugaDetail.vue
@@ -0,0 +1,186 @@
+<template>
+<div class="card ">
+      <div class="card-body">
+          <h2 class="card-title">승인 대기 목록</h2>
+       
+      <div class="form-card">
+        <h1>휴가신청서</h1>
+        <div class="approval-box tbl-wrap tbl2">
+         <table class="tbl data">
+          <tbody>
+            <tr class="thead">
+              <td rowspan="2" class="th">승인자</td>
+              <td>과장</td>
+              <td>소장</td>
+            </tr>
+            <tr>
+              <td><p class="name">홍길동</p><p class="date">2025/05/09</p></td>
+              <td><p class="name">홍길동</p><p class="date">2025/05/09</p></td>
+            </tr>
+          </tbody>
+
+         </table>
+        </div>
+          <form class="row g-3 needs-validation "  :class="{ 'was-validated': formSubmitted }" @submit.prevent="handleRegister" novalidate>
+                <div class="col-12 ">
+                  <div class="col-12 border-x">
+                    <label for="youremail" class="form-label ">유형<p class="require"><img :src="require" alt=""></p></label>
+                    <input  v-model="email" type="text" name="username" class="form-control" id="youremail" readonly >
+                  </div>
+    
+                  <div class="col-12 border-x">
+                    <label for="yourPassword" class="form-label">신청자</label>
+                    <input  v-model="password" type="password" name="password" class="form-control" id="yourPassword" readonly   placeholder="주식회사 테이큰 소프트"> 
+                  </div>
+               </div>
+               <div class="col-12">
+                  <div class="col-12 border-x">
+                    <label for="youremail" class="form-label">부서</label>
+                    <input  v-model="email" type="text" name="username" class="form-control" id="youremail" readonly  placeholder="과장">
+                  </div>
+    
+                  <div class="col-12 border-x">
+                    <label for="yourPassword" class="form-label">직급</label>
+                    <input  v-model="password" type="password" name="password" class="form-control" id="yourPassword" readonly  placeholder="팀장"> 
+                  </div>
+               </div>
+               <div class="col-12">
+                  <label for="yourName" class="form-label">기간</label>
+                  <input  v-model="name" type="text" name="name" class="form-control" id="yourName" readonly>
+            </div>
+            <div class="col-12 hyuga">
+                  <label for="yourName" class="form-label">세부사항</label>
+                  <input v-model="name" type="text" name="name" class="form-control textarea" id="yourName" readonly>
+            </div>
+            <div class="col-12 ">
+                  <label for="yourName" class="form-label">신청일</label>
+                  <input v-model="name" type="text" name="name" class="form-control " id="yourName" readonly>
+            </div>
+            <div class="col-12 border-x" :class="{ return: isReturned }">
+                  <label for="yourName" class="form-label ">반려사유</label>
+                  <input  v-model="name" type="text" name="name" class="form-control" id="yourName" readonly   >
+            </div>
+           
+                
+              </form>
+      </div>
+            <div class="buttons">
+              <button class="btn  btn-red"  type="submit">신청취소</button>
+                <button class="btn secondary"  type="submit">  {{ isReturned ? '재신청' : '수정' }}</button>
+                <button class="btn tertiary "  type="submit">목록</button>
+              </div>
+
+      </div>
+    </div>
+</template>
+
+<script>
+export default {
+  data() {
+    const today = new Date().toISOString().split('T')[0];
+    return {
+      isReturned: true,
+      startDate: today,
+      startTime: "09:00", // 기본 시작 시간 09:00
+      endDate: today,
+      endTime: "18:00", // 기본 종료 시간 18:00
+      category: "", 
+      dayCount: 1, 
+      reason: "", // 사유
+      listData: [
+  {
+    type: '연차',
+    approvalType: '결재',
+    applicant: '홍길동',
+    period: '2025-05-10 ~ 2025-15-03',
+    requestDate: '2025-04-25',
+    status: '대기'
+  },   {
+    type: '반차',
+    approvalType: '전결',
+    applicant: '홍길동',
+    period: '2025-05-01 ~ 2025-05-03',
+    requestDate: '2025-04-25',
+    status: '승인'
+  }],
+    };
+  },
+  computed: {
+    // Pinia Store의 상태를 가져옵니다.
+    loginUser() {
+      const authStore = useAuthStore();
+      return authStore.getLoginUser;
+    },
+  },
+  methods: {
+    // 폼 검증 메서드
+    validateForm() {
+      // 필수 입력 필드 체크
+      if (
+        this.category &&
+        this.startDate &&
+        this.startTime &&
+        this.endDate &&
+        this.endTime &&
+        this.dayCount > 0 &&
+        this.reason.trim() !== ""
+      ) {
+        this.isFormValid = true;
+      } else {
+        this.isFormValid = false;
+      }
+    },
+    calculateDayCount() {
+    const start = new Date(`${this.startDate}T${this.startTime}:00`);
+    const end = new Date(`${this.endDate}T${this.endTime}:00`);
+    
+    let totalHours = (end - start) / (1000 * 60 * 60);  // 밀리초를 시간 단위로 변환
+    
+    if (this.startDate !== this.endDate) {
+      // 시작일과 종료일이 다른경우
+      const startDateObj = new Date(this.startDate);
+      const endDateObj = new Date(this.endDate);
+      const daysDifference = (endDateObj - startDateObj) / (1000 * 60 * 60 * 24); // 두 날짜 사이의 차이를 일수로 계산
+      if (this.startTime !== "09:00" || this.endTime !== "18:00") {
+        this.dayCount = daysDifference + 0.5; // 시간 조건이 기준에서 벗어날 경우
+      } else {
+        this.dayCount = Math.ceil(daysDifference + 1); // 시간 조건이 기준에 맞을 경우
+      }
+    } else {
+      // 시작일과 종료일이 같은 경우
+      if (this.startTime !== "09:00" || this.endTime !== "18:00") {
+        this.dayCount = 0.5; // 시작 시간 또는 종료 시간이 기준과 다를 경우 0.5
+      } else {
+        this.dayCount = 1; // 기준 시간(09:00~18:00)이 맞으면 1일로 간주
+      }
+    }
+
+    this.validateForm(); // dayCount 변경 후 폼 재검증
+  },
+    handleSubmit() {
+      this.validateForm(); // 제출 시 유효성 확인
+      if (this.isFormValid) {
+        localStorage.setItem('HyugaFormData', JSON.stringify(this.$data));
+        alert("승인 요청이 완료되었습니다.");
+        // 추가 처리 로직 (API 요청 등)
+      } else {
+        alert("모든 필드를 올바르게 작성해주세요.");
+      }
+    },
+    
+    
+  },
+  mounted() {
+    // Load the saved form data when the page is loaded
+    this.loadFormData();
+  },
+  watch: {
+  startDate: 'calculateDayCount',
+  startTime: 'calculateDayCount',
+  endDate: 'calculateDayCount',
+  endTime: 'calculateDayCount',
+  reason: "validateForm",
+  category: 'category',
+  },
+};
+</script>
client/views/pages/Manager/approval/HyugaInsert.vue
--- client/views/pages/Manager/approval/HyugaInsert.vue
+++ client/views/pages/Manager/approval/HyugaInsert.vue
@@ -1,100 +1,129 @@
 <template>
-  <div class="pagetitle">
-    <h2>휴가신청</h2>
-  </div><!-- End Page Title -->
+  <div class="card">
 
-  <section class="section">
-    <div class="card">
-      <div class="card-body">
+    <div class="card-body">
+      <h2 class="card-title">휴가 신청</h2>
+      <p class="require"><img :src="require" alt=""> 필수입력</p>
+      <!-- Multi Columns Form -->
+      <form class="row g-3  needs-validation" @submit.prevent="handleSubmit">
+        <div class="col-12">
+          <label for="inputName5" class="form-label">유형<p class="require"><img :src="require" alt=""></p></label>
+          <select id="category" class="form-select" v-model="category" style="max-width: 200px;">
+            <option selected>연차</option>
+            <option>반차</option>
+            <option>병가</option>
+            <option>경조</option>
+            <option>무급</option>
+            <option>공가</option>
+          </select>
+        </div>
 
-        <!-- Multi Columns Form -->
-        <form class="row g-3  pt-3" @submit.prevent="handleSubmit">
-          <div class="col-md-9">
-            <label for="inputName5" class="form-label">구분</label>
-            <select id="category" class="form-select" v-model="category">
-              <option selected>연차</option>
-              <option>반차</option>
-              <option>병가</option>
-              <option>경조</option>
-              <option>무급</option>
-              <option>공가</option>
+        <div class="col-12">
+          <label for="startDate" class="form-label">시작일<p class="require"><img :src="require" alt=""></p></label>
+          <div class="d-flex gap-1">
+            <input type="date" class="form-control" id="startDate" v-model="startDate" />
+            <!-- 시간 선택을 위한 select 사용 -->
+            <select class="form-control" id="startTime" v-model="startTime">
+              <option value="09:00">09:00</option>
+              <option value="10:00">10:00</option>
+              <option value="11:00">11:00</option>
+              <option value="12:00">12:00</option>
+              <option value="13:00">13:00</option>
+              <option value="14:00">14:00</option>
+              <option value="15:00">15:00</option>
+              <option value="16:00">16:00</option>
+              <option value="17:00">17:00</option>
+              <option value="18:00">18:00</option>
             </select>
           </div>
+        </div>
 
-          <div class="col-md-5">
-            <label for="startDate" class="form-label">시작일</label>
-            <div class="d-flex gap-1">
-              <input type="date" class="form-control" id="startDate" v-model="startDate" />
-              <!-- 시간 선택을 위한 select 사용 -->
-              <select class="form-control" id="startTime" v-model="startTime">
-                <option value="09:00">09:00</option>
-                <option value="10:00">10:00</option>
-                <option value="11:00">11:00</option>
-                <option value="12:00">12:00</option>
-                <option value="13:00">13:00</option>
-                <option value="14:00">14:00</option>
-                <option value="15:00">15:00</option>
-                <option value="16:00">16:00</option>
-                <option value="17:00">17:00</option>
-                <option value="18:00">18:00</option>
+        <div class="col-12">
+          <label for="endDate" class="form-label">종료일<p class="require"><img :src="require" alt=""></p></label>
+          <div class="d-flex gap-1">
+            <input type="date" class="form-control" id="endDate" v-model="endDate" />
+            <!-- 종료 시간을 위한 select 사용 -->
+            <select class="form-control" id="endTime" v-model="endTime">
+              <option value="09:00">09:00</option>
+              <option value="10:00">10:00</option>
+              <option value="11:00">11:00</option>
+              <option value="12:00">12:00</option>
+              <option value="13:00">13:00</option>
+              <option value="14:00">14:00</option>
+              <option value="15:00">15:00</option>
+              <option value="16:00">16:00</option>
+              <option value="17:00">17:00</option>
+              <option value="18:00">18:00</option>
+            </select>
+          </div>
+        </div>
+
+        <div class="col-12">
+          <label for="dayCount" class="form-label">사용 휴가일</label>
+          <input type="text" class="form-control" id="dayCount" v-model="dayCount" readonly />
+        </div>
+
+        <div class="col-12">
+          <label for="member" class="form-label">
+            승인자
+            <button type="button" title="추가" @click="addApproval">
+              <PlusCircleFilled />
+            </button>
+          </label>
+
+          <!-- 반복 렌더링되는 addapproval 항목 -->
+          <div class="approval-container">
+            <div v-for="(approval, index) in approvals" :key="index" class="d-flex gap-2 addapproval mb-2">
+              <select class="form-select" v-model="approval.category" style="width: 110px;">
+                <option value="결재">결재</option>
+                <option value="전결">전결</option>
+                <option value="대결">대결</option>
               </select>
+
+              <form class="d-flex align-items-center border-x">
+                <input type="text" class="form-control" v-model="approval.name" style="max-width: 150px;" />
+                <button type="button" @click="removeApproval(index)" class="delete-button">
+                  <CloseOutlined />
+                </button>
+              </form>
             </div>
           </div>
+        </div>
+        <div class="col-12 border-x hyuga">
+          <label for="prvonsh" class="form-label">세부사항</label>
+          <input type="text" class="form-control textarea" id="reason" v-model="reason" />
+        </div>
 
-          <div class="col-md-5">
-            <label for="endDate" class="form-label">종료일</label>
-            <div class="d-flex gap-1">
-              <input type="date" class="form-control" id="endDate" v-model="endDate" />
-              <!-- 종료 시간을 위한 select 사용 -->
-              <select class="form-control" id="endTime" v-model="endTime">
-                <option value="09:00">09:00</option>
-                <option value="10:00">10:00</option>
-                <option value="11:00">11:00</option>
-                <option value="12:00">12:00</option>
-                <option value="13:00">13:00</option>
-                <option value="14:00">14:00</option>
-                <option value="15:00">15:00</option>
-                <option value="16:00">16:00</option>
-                <option value="17:00">17:00</option>
-                <option value="18:00">18:00</option>
-              </select>
-            </div>
-          </div>
 
-          <div class="col-md-4">
-            <label for="dayCount" class="form-label">사용 휴가일</label>
-            <input type="text" class="form-control" id="dayCount" v-model="dayCount" readonly />
-          </div>
-
-          <div class="col-12">
-            <label for="prvonsh" class="form-label">사유</label>
-            <input type="text" class="form-control" id="reason" v-model="reason" />
-          </div>
-
-          <div class="text-end">
-            <button type="submit" class="btn btn-primary">승인요청</button>
-            <button type="reset" class="btn btn-secondary">취소</button>
-          </div>
-        </form><!-- End Multi Columns Form -->
-
+      </form><!-- End Multi Columns Form -->
+      <div class="buttons">
+        <button type="submit" class="btn btn-red">이전 승인자 불러오기</button>
+        <button type="submit" class="btn primary">신청</button>
+        <button type="reset" class="btn tertiary">취소</button>
       </div>
     </div>
-  </section>
+  </div>
 </template>
 
 <script>
+import { PlusCircleFilled, CloseOutlined } from '@ant-design/icons-vue';
 export default {
   data() {
     const today = new Date().toISOString().split('T')[0];
     return {
+      approvals: [],
+      require: "/client/resources/img/require.png",
       startDate: today,
       startTime: "09:00", // 기본 시작 시간 09:00
       endDate: today,
       endTime: "18:00", // 기본 종료 시간 18:00
-      category: "", 
-      dayCount: 1, 
+      category: "",
+      dayCount: 1,
       reason: "", // 사유
     };
+  },
+  components: {
+    PlusCircleFilled, CloseOutlined
   },
   computed: {
     // Pinia Store의 상태를 가져옵니다.
@@ -104,7 +133,16 @@
     },
   },
   methods: {
-    // 폼 검증 메서드
+    addApproval() {
+      this.approvals.push({
+        category: '결재',
+        name: '',
+      });
+    },
+    // 승인자 삭제
+    removeApproval(index) {
+      this.approvals.splice(index, 1);
+    },
     validateForm() {
       // 필수 입력 필드 체크
       if (
@@ -122,32 +160,32 @@
       }
     },
     calculateDayCount() {
-    const start = new Date(`${this.startDate}T${this.startTime}:00`);
-    const end = new Date(`${this.endDate}T${this.endTime}:00`);
-    
-    let totalHours = (end - start) / (1000 * 60 * 60);  // 밀리초를 시간 단위로 변환
-    
-    if (this.startDate !== this.endDate) {
-      // 시작일과 종료일이 다른경우
-      const startDateObj = new Date(this.startDate);
-      const endDateObj = new Date(this.endDate);
-      const daysDifference = (endDateObj - startDateObj) / (1000 * 60 * 60 * 24); // 두 날짜 사이의 차이를 일수로 계산
-      if (this.startTime !== "09:00" || this.endTime !== "18:00") {
-        this.dayCount = daysDifference + 0.5; // 시간 조건이 기준에서 벗어날 경우
-      } else {
-        this.dayCount = Math.ceil(daysDifference + 1); // 시간 조건이 기준에 맞을 경우
-      }
-    } else {
-      // 시작일과 종료일이 같은 경우
-      if (this.startTime !== "09:00" || this.endTime !== "18:00") {
-        this.dayCount = 0.5; // 시작 시간 또는 종료 시간이 기준과 다를 경우 0.5
-      } else {
-        this.dayCount = 1; // 기준 시간(09:00~18:00)이 맞으면 1일로 간주
-      }
-    }
+      const start = new Date(`${this.startDate}T${this.startTime}:00`);
+      const end = new Date(`${this.endDate}T${this.endTime}:00`);
 
-    this.validateForm(); // dayCount 변경 후 폼 재검증
-  },
+      let totalHours = (end - start) / (1000 * 60 * 60);  // 밀리초를 시간 단위로 변환
+
+      if (this.startDate !== this.endDate) {
+        // 시작일과 종료일이 다른경우
+        const startDateObj = new Date(this.startDate);
+        const endDateObj = new Date(this.endDate);
+        const daysDifference = (endDateObj - startDateObj) / (1000 * 60 * 60 * 24); // 두 날짜 사이의 차이를 일수로 계산
+        if (this.startTime !== "09:00" || this.endTime !== "18:00") {
+          this.dayCount = daysDifference + 0.5; // 시간 조건이 기준에서 벗어날 경우
+        } else {
+          this.dayCount = Math.ceil(daysDifference + 1); // 시간 조건이 기준에 맞을 경우
+        }
+      } else {
+        // 시작일과 종료일이 같은 경우
+        if (this.startTime !== "09:00" || this.endTime !== "18:00") {
+          this.dayCount = 0.5; // 시작 시간 또는 종료 시간이 기준과 다를 경우 0.5
+        } else {
+          this.dayCount = 1; // 기준 시간(09:00~18:00)이 맞으면 1일로 간주
+        }
+      }
+
+      this.validateForm(); // dayCount 변경 후 폼 재검증
+    },
     handleSubmit() {
       this.validateForm(); // 제출 시 유효성 확인
       if (this.isFormValid) {
@@ -158,26 +196,17 @@
         alert("모든 필드를 올바르게 작성해주세요.");
       }
     },
-    loadFormData() {
-      const savedData = localStorage.getItem('HyugaFormData');
-      if (savedData) {
-        this.$data = JSON.parse(savedData);
-      }
-      console.log(loadFormData)
-    },
-    
+
   },
   mounted() {
-    // Load the saved form data when the page is loaded
-    this.loadFormData();
   },
   watch: {
-  startDate: 'calculateDayCount',
-  startTime: 'calculateDayCount',
-  endDate: 'calculateDayCount',
-  endTime: 'calculateDayCount',
-  reason: "validateForm",
-  category: 'category',
+    startDate: 'calculateDayCount',
+    startTime: 'calculateDayCount',
+    endDate: 'calculateDayCount',
+    endTime: 'calculateDayCount',
+    reason: "validateForm",
+    category: 'category',
   },
 };
 </script>
client/views/pages/Manager/approval/approval.vue
--- client/views/pages/Manager/approval/approval.vue
+++ client/views/pages/Manager/approval/approval.vue
@@ -1,46 +1,46 @@
 <template>
   <div class="sidemenu">
     <div class="myinfo simple">
-            <div class="name-box">
-                <div class="img-area">
-                    <div><img :src="photoicon" alt="">
-                        <p class="name">OOO과장</p>
-                    </div>
-                    <div class="info">
-                        <p>솔루션 개발팀</p>
-                        <i class="fa-bars"></i>
-                        <p>팀장</p>
-                    </div>
+      <div class="name-box">
+        <div class="img-area">
+          <div><img :src="photoicon" alt="">
+            <p class="name">OOO과장</p>
+          </div>
+          <div class="info">
+            <p>솔루션 개발팀</p>
+            <i class="fa-bars"></i>
+            <p>팀장</p>
+          </div>
+        </div>
+      </div>
+
+
+      <details class="menu-box">
+          <summary><p>결재</p><div class="icon"><img :src="topmenuicon" alt=""></div></summary>
+          <ul>
+            <li> <router-link to="/approvalRequest.page" exact-active-class="active-link" v-slot="{ isExactActive }">
+                <p>결재 요청</p>
+                <div class="icon" v-if="isExactActive">
+                  <img :src="menuicon" alt="">
                 </div>
-            </div>
-           
-            <h2>결재</h2>
-            <ul class="menu-box">
-              <li>
-      <router-link to="/approvalRequest.page" exact-active-class="active-link" v-slot="{ isExactActive }">
-        <p>결재 요청</p>
-        <div class="icon" v-if="isExactActive">
-          <img :src="menuicon" alt="">
-        </div>
-      </router-link>
-      
-    </li>
-    <li>
-      <router-link to="/approvalList.page" exact-active-class="active-link" v-slot="{ isExactActive }">
-        <p>승인 대기 목록</p>
-        <div class="icon" v-if="isExactActive">
-          <img :src="menuicon" alt="">
-        </div>
-      </router-link>
-    </li>
-                </ul>
-        </div>
+              </router-link></li>
+            <li>
+              <router-link to="/approvalList.page" exact-active-class="active-link" v-slot="{ isExactActive }">
+                <p>승인 대기 목록</p>
+                <div class="icon" v-if="isExactActive">
+                  <img :src="menuicon" alt="">
+                </div>
+              </router-link>
+            </li>
+          </ul>
+      </details>
+    </div>
   </div>
   <!-- End Page Title -->
   <div class="content">
     <router-view></router-view>
 
-</div>
+  </div>
 </template>
 
 <script>
@@ -51,6 +51,7 @@
     return {
       photoicon: "/client/resources/img/photo_icon.png",
       menuicon: "/client/resources/img/menuicon.png",
+      topmenuicon: "/client/resources/img/topmenuicon.png",
       // 데이터 초기화
       years: [2023, 2024, 2025], // 연도 목록
       months: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], // 월 목록
client/views/pages/Manager/approval/approvalRequest.vue
--- client/views/pages/Manager/approval/approvalRequest.vue
+++ client/views/pages/Manager/approval/approvalRequest.vue
@@ -154,7 +154,7 @@
   if (type === '휴가') {
     this.$router.push('/HyugaInsert.page');
   } else if (type === '출장') {
-    this.$router.push('/ChuljangInsert.page');
+    this.$router.push('/ChuljangDetail.page');
   }
 },
     getStatusClass(status) {
 
client/views/pages/Manager/attendance/AttendanceDetail.vue (added)
+++ client/views/pages/Manager/attendance/AttendanceDetail.vue
@@ -0,0 +1,283 @@
+<template>
+  <div class="card ">
+    <div class="card-body">
+      <h2 class="card-title">부서별 근태현황</h2>
+        <div class="name-box flex sb simple">
+          <div class="img-area">
+            <div class="img"><img :src="photoicon" alt="">
+            </div>
+          </div>
+          <form class="row g-3 needs-validation " :class="{ 'was-validated': formSubmitted }"
+            @submit.prevent="handleRegister" novalidate>
+            <div class="col-12">
+              <label for="yourName" class="form-label">아이디</label>
+              <input v-model="name" type="text" name="name" class="form-control" id="yourName" required readonly
+                placeholder="admin">
+            </div>
+            <div class="col-12 ">
+              <div class="col-12 border-x">
+                <label for="youremail" class="form-label ">이름<p class="require"><img :src="require" alt=""></p></label>
+                <input v-model="email" type="text" name="username" class="form-control" id="youremail" required readonly>
+              </div>
+
+              <div class="col-12 border-x">
+                <label for="yourPassword" class="form-label">부서</label>
+                <input v-model="password" type="password" name="password" class="form-control" id="yourPassword"
+                  required readonly placeholder="주식회사 테이큰 소프트">
+              </div>
+            </div>
+            <div class="col-12 border-x">
+              <div class="col-12 border-x">
+                <label for="youremail" class="form-label">직급</label>
+                <input v-model="email" type="text" name="username" class="form-control" id="youremail" required readonly
+                  placeholder="과장">
+              </div>
+
+              <div class="col-12 border-x">
+                <label for="yourPassword" class="form-label">직책</label>
+                <input v-model="password" type="password" name="password" class="form-control" id="yourPassword"
+                  required readonly placeholder="팀장">
+              </div>
+            </div>
+
+
+          </form>
+        </div>
+
+      <div class="sch-form-wrap ">
+        <div class="input-group">
+          <select name="" id="" class="form-select">
+            <option value="">년도</option>
+          </select>
+          <select name="" id="" class="form-select">
+            <option value="">월</option>
+          </select>
+          <select name="" id="" class="form-select">
+            <option value="">구분</option>
+          </select>
+        </div>
+
+      </div>
+      <div class=" tbl-wrap tbl2">
+        <table class="tbl data">
+          <colgroup>
+            <col style="width: 150px;">
+            <col style="width: ">
+            <col style="width: ">
+            <col style="width: ">
+            <col style="width: ">
+            <col style="width: ">
+            <!-- 더 많은 열 설정 -->
+          </colgroup>
+          <tbody>
+            <tr class="thead">
+              <td rowspan="2" class="th">근태 현황</td>
+              <td>지각</td>
+              <td>조기퇴근</td>
+              <td>결근</td>
+              <td>출장</td>
+              <td>주말출근</td>
+            </tr>
+            <tr>
+              <td>{{ late }}</td>
+              <td>{{ earlyLeave }}</td>
+              <td>{{ absence }}</td>
+              <td>{{ businessTrip }}</td>
+              <td>{{ weekendWork }}</td>
+            </tr>
+          </tbody>
+
+        </table>
+        <table class="tbl data">
+          <colgroup>
+            <col style="width: 150px;">
+            <col span="">
+            <col style="width: ">
+            <col style="width: ">
+            <col style="width: ">
+            <!-- 더 많은 열 설정 -->
+          </colgroup>
+          <tbody>
+            <tr class="thead">
+              <td rowspan="2" class="th">휴가 현황</td>
+              <td>연차</td>
+              <td>대체휴가</td>
+              <td>공가</td>
+              <td>병가</td>
+            </tr>
+            <tr>
+              <td></td>
+              <td></td>
+              <td></td>
+              <td></td>
+            </tr>
+          </tbody>
+
+        </table>
+      </div>
+      <div class="tbl-wrap">
+        <table id="myTable" class="tbl data">
+          <colgroup>
+            <col style="width: 200px;">
+            <col style=" width: ">
+          </colgroup>
+          <thead>
+            <tr>
+              <th>연차 </th>
+              <th>내용</th>
+            </tr>
+          </thead>
+          <!-- 동적으로 <td> 생성 -->
+          <tbody>
+            <tr v-for="(item, index) in listData" :key="index">
+              <td>{{ item.type }}</td>
+              <td>{{ item.content }}</td>
+            </tr>
+          </tbody>
+        </table>
+
+      </div>
+      <div class="pagination">
+        <ul>
+          <!-- 왼쪽 화살표 (이전 페이지) -->
+          <li class="arrow" :class="{ disabled: currentPage === 1 }" @click="changePage(currentPage - 1)">
+            &lt;
+          </li>
+
+          <!-- 페이지 번호 -->
+          <li v-for="page in totalPages" :key="page" :class="{ active: currentPage === page }"
+            @click="changePage(page)">
+            {{ page }}
+          </li>
+
+          <!-- 오른쪽 화살표 (다음 페이지) -->
+          <li class="arrow" :class="{ disabled: currentPage === totalPages }" @click="changePage(currentPage + 1)">
+            &gt;
+          </li>
+        </ul>
+      </div>
+
+    </div>
+  </div>
+</template>
+
+<script>
+import { SearchOutlined } from '@ant-design/icons-vue';
+
+export default {
+  data() {
+
+    const today = new Date().toISOString().split('T')[0];
+    return {
+      photoicon: "/client/resources/img/img1.png",
+      currentPage: 1,
+      totalPages: 3,
+      late: '5', earlyLeave: '3', absence: '2', businessTrip: '1', weekendWork: '0',
+      today: new Date().toLocaleDateString('ko-KR', {
+        year: 'numeric',
+        month: '2-digit',
+        day: '2-digit',
+        weekday: 'short',
+      }),
+      dateicon: "/client/resources/img/img.png",
+      startbtn: "/client/resources/img/start-sm.png",
+      stopbtn: "/client/resources/img/stop-sm.png",
+      startDate: today,
+      startTime: "09:00", // 기본 시작 시간 09:00
+      endDate: today,
+      endTime: "18:00", // 기본 종료 시간 18:00
+      category: "",
+      dayCount: 1,
+      reason: "", // 사유
+      listData: [
+        {
+          type: '연차',
+          content: '결재',
+        }, {
+          type: '반차',
+          content: '전결',
+        }],
+    };
+  },
+  components: {
+    SearchOutlined
+  },
+  computed: {
+    // Pinia Store의 상태를 가져옵니다.
+    loginUser() {
+      const authStore = useAuthStore();
+      return authStore.getLoginUser;
+    },
+  },
+  methods: {
+    // 폼 검증 메서드
+    validateForm() {
+      // 필수 입력 필드 체크
+      if (
+        this.category &&
+        this.startDate &&
+        this.startTime &&
+        this.endDate &&
+        this.endTime &&
+        this.dayCount > 0 &&
+        this.reason.trim() !== ""
+      ) {
+        this.isFormValid = true;
+      } else {
+        this.isFormValid = false;
+      }
+    },
+    calculateDayCount() {
+      const start = new Date(`${this.startDate}T${this.startTime}:00`);
+      const end = new Date(`${this.endDate}T${this.endTime}:00`);
+
+      let totalHours = (end - start) / (1000 * 60 * 60);  // 밀리초를 시간 단위로 변환
+
+      if (this.startDate !== this.endDate) {
+        // 시작일과 종료일이 다른경우
+        const startDateObj = new Date(this.startDate);
+        const endDateObj = new Date(this.endDate);
+        const daysDifference = (endDateObj - startDateObj) / (1000 * 60 * 60 * 24); // 두 날짜 사이의 차이를 일수로 계산
+        if (this.startTime !== "09:00" || this.endTime !== "18:00") {
+          this.dayCount = daysDifference + 0.5; // 시간 조건이 기준에서 벗어날 경우
+        } else {
+          this.dayCount = Math.ceil(daysDifference + 1); // 시간 조건이 기준에 맞을 경우
+        }
+      } else {
+        // 시작일과 종료일이 같은 경우
+        if (this.startTime !== "09:00" || this.endTime !== "18:00") {
+          this.dayCount = 0.5; // 시작 시간 또는 종료 시간이 기준과 다를 경우 0.5
+        } else {
+          this.dayCount = 1; // 기준 시간(09:00~18:00)이 맞으면 1일로 간주
+        }
+      }
+
+      this.validateForm(); // dayCount 변경 후 폼 재검증
+    },
+    handleSubmit() {
+      this.validateForm(); // 제출 시 유효성 확인
+      if (this.isFormValid) {
+        localStorage.setItem('HyugaFormData', JSON.stringify(this.$data));
+        alert("승인 요청이 완료되었습니다.");
+        // 추가 처리 로직 (API 요청 등)
+      } else {
+        alert("모든 필드를 올바르게 작성해주세요.");
+      }
+    },
+
+
+  },
+  mounted() {
+    // Load the saved form data when the page is loaded
+    this.loadFormData();
+  },
+  watch: {
+    startDate: 'calculateDayCount',
+    startTime: 'calculateDayCount',
+    endDate: 'calculateDayCount',
+    endTime: 'calculateDayCount',
+    reason: "validateForm",
+    category: 'category',
+  },
+};
+</script>
 
client/views/pages/Manager/attendance/ChuljangBokmyeongDetail.vue (added)
+++ client/views/pages/Manager/attendance/ChuljangBokmyeongDetail.vue
@@ -0,0 +1,174 @@
+<template>
+<div class="card ">
+      <div class="card-body">
+          <h2 class="card-title">출장 현황</h2>
+       
+      <div class="form-card">
+        <h1>출장복명서</h1>
+        <div class="approval-box tbl-wrap tbl2">
+         <table class="tbl data">
+          <tbody>
+            <tr class="thead">
+              <td rowspan="2" class="th">승인자</td>
+              <td>과장</td>
+              <td>소장</td>
+            </tr>
+            <tr>
+              <td><p class="name">홍길동</p><p class="date">2025/05/09</p></td>
+              <td><p class="name">홍길동</p><p class="date">2025/05/09</p></td>
+            </tr>
+          </tbody>
+
+         </table>
+        </div>
+          <form class="row g-3 needs-validation "  :class="{ 'was-validated': formSubmitted }" @submit.prevent="handleRegister" novalidate>
+               
+            <div class="col-12 chuljang">
+                  <label for="yourName" class="form-label">복명내용</label>
+                  <input v-model="name" type="text" name="name" class="form-control textarea " id="yourName" readonly>
+            </div>
+            <div class="col-12">
+                  <label for="yourName" class="form-label">여비계산</label>
+                  <input v-model="name" type="text" name="name" class="form-control " id="yourName" readonly>
+            </div>
+            <div class="col-12 ">
+                  <label for="yourName" class="form-label">복명 신청일</label>
+                  <input  v-model="name" type="text" name="name" class="form-control" id="yourName" readonly   placeholder="2025-01-01">
+            </div>
+            <div class="col-12 border-x " :class="{ return: isReturned }">
+                  <label for="yourName" class="form-label">반려사유</label>
+                  <input  v-model="name" type="text" name="name" class="form-control" id="yourName" readonly   placeholder="2025-01-01">
+            </div>
+           
+                
+              </form>
+      </div>
+            <div class="buttons">
+              <button class="btn btn-red "  type="submit">신청취소</button>
+              <button class="btn secondary"  type="submit"  @click="handleButtonClick">{{ isReturned ? '재신청' : '수정' }}</button>
+                <button class="btn tertiary "  type="submit">목록</button>
+              </div>
+
+      </div>
+    </div>
+</template>
+
+<script>
+export default {
+  data() {
+    const today = new Date().toISOString().split('T')[0];
+    return {
+      isReturned: true,
+      startDate: today,
+      startTime: "09:00", // 기본 시작 시간 09:00
+      endDate: today,
+      endTime: "18:00", // 기본 종료 시간 18:00
+      category: "", 
+      dayCount: 1, 
+      reason: "", // 사유
+      listData: [
+  {
+    type: '연차',
+    approvalType: '결재',
+    applicant: '홍길동',
+    period: '2025-05-10 ~ 2025-15-03',
+    requestDate: '2025-04-25',
+    status: '대기'
+  },   {
+    type: '반차',
+    approvalType: '전결',
+    applicant: '홍길동',
+    period: '2025-05-01 ~ 2025-05-03',
+    requestDate: '2025-04-25',
+    status: '승인'
+  }],
+    };
+  },
+  computed: {
+    // Pinia Store의 상태를 가져옵니다.
+    loginUser() {
+      const authStore = useAuthStore();
+      return authStore.getLoginUser;
+    },
+  },
+  methods: {
+    // 폼 검증 메서드
+    handleButtonClick() {
+    if (this.isReturned) {
+      // If "재신청", navigate to the desired page (ChuljangInsert.page)
+      this.$router.push({ name: 'ChuljangInsert' }); // Replace with the correct route name
+    } else {
+      // Handle the "수정" behavior here
+      console.log('수정 button clicked');
+    }
+  },
+    validateForm() {
+      // 필수 입력 필드 체크
+      if (
+        this.category &&
+        this.startDate &&
+        this.startTime &&
+        this.endDate &&
+        this.endTime &&
+        this.dayCount > 0 &&
+        this.reason.trim() !== ""
+      ) {
+        this.isFormValid = true;
+      } else {
+        this.isFormValid = false;
+      }
+    },
+    calculateDayCount() {
+    const start = new Date(`${this.startDate}T${this.startTime}:00`);
+    const end = new Date(`${this.endDate}T${this.endTime}:00`);
+    
+    let totalHours = (end - start) / (1000 * 60 * 60);  // 밀리초를 시간 단위로 변환
+    
+    if (this.startDate !== this.endDate) {
+      // 시작일과 종료일이 다른경우
+      const startDateObj = new Date(this.startDate);
+      const endDateObj = new Date(this.endDate);
+      const daysDifference = (endDateObj - startDateObj) / (1000 * 60 * 60 * 24); // 두 날짜 사이의 차이를 일수로 계산
+      if (this.startTime !== "09:00" || this.endTime !== "18:00") {
+        this.dayCount = daysDifference + 0.5; // 시간 조건이 기준에서 벗어날 경우
+      } else {
+        this.dayCount = Math.ceil(daysDifference + 1); // 시간 조건이 기준에 맞을 경우
+      }
+    } else {
+      // 시작일과 종료일이 같은 경우
+      if (this.startTime !== "09:00" || this.endTime !== "18:00") {
+        this.dayCount = 0.5; // 시작 시간 또는 종료 시간이 기준과 다를 경우 0.5
+      } else {
+        this.dayCount = 1; // 기준 시간(09:00~18:00)이 맞으면 1일로 간주
+      }
+    }
+
+    this.validateForm(); // dayCount 변경 후 폼 재검증
+  },
+    handleSubmit() {
+      this.validateForm(); // 제출 시 유효성 확인
+      if (this.isFormValid) {
+        localStorage.setItem('HyugaFormData', JSON.stringify(this.$data));
+        alert("승인 요청이 완료되었습니다.");
+        // 추가 처리 로직 (API 요청 등)
+      } else {
+        alert("모든 필드를 올바르게 작성해주세요.");
+      }
+    },
+    
+    
+  },
+  mounted() {
+    // Load the saved form data when the page is loaded
+    this.loadFormData();
+  },
+  watch: {
+  startDate: 'calculateDayCount',
+  startTime: 'calculateDayCount',
+  endDate: 'calculateDayCount',
+  endTime: 'calculateDayCount',
+  reason: "validateForm",
+  category: 'category',
+  },
+};
+</script>
 
client/views/pages/Manager/attendance/ChuljangDetailAll.vue (added)
+++ client/views/pages/Manager/attendance/ChuljangDetailAll.vue
@@ -0,0 +1,232 @@
+<template>
+<div class="card ">
+      <div class="card-body">
+          <h2 class="card-title">출장 현황</h2>
+       
+      <div class="form-card" style="margin-bottom: 20px;">
+        <h1>출장품의서</h1>
+        <div class="approval-box tbl-wrap tbl2">
+         <table class="tbl data">
+          <tbody>
+            <tr class="thead">
+              <td rowspan="2" class="th">승인자</td>
+              <td>과장</td>
+              <td>소장</td>
+            </tr>
+            <tr>
+              <td><p class="name">홍길동</p><p class="date">2025/05/09</p></td>
+              <td><p class="name">홍길동</p><p class="date">2025/05/09</p></td>
+            </tr>
+          </tbody>
+
+         </table>
+        </div>
+          <form class="row g-3 needs-validation "  :class="{ 'was-validated': formSubmitted }" @submit.prevent="handleRegister" novalidate >
+                <div class="col-12 ">
+                  <div class="col-12 border-x">
+                    <label for="youremail" class="form-label ">출장구분<p class="require"><img :src="require" alt=""></p></label>
+                    <input  v-model="email" type="text" name="username" class="form-control" id="youremail" readonly >
+                  </div>
+    
+                  <div class="col-12 border-x">
+                    <label for="yourPassword" class="form-label">이름</label>
+                    <input  v-model="password" type="password" name="password" class="form-control" id="yourPassword" readonly   placeholder="주식회사 테이큰 소프트"> 
+                  </div>
+               </div>
+               <div class="col-12">
+                  <div class="col-12 border-x">
+                    <label for="youremail" class="form-label">부서</label>
+                    <input  v-model="email" type="text" name="username" class="form-control" id="youremail" readonly  placeholder="과장">
+                  </div>
+    
+                  <div class="col-12 border-x">
+                    <label for="yourPassword" class="form-label">직급</label>
+                    <input  v-model="password" type="password" name="password" class="form-control" id="yourPassword" readonly  placeholder="팀장"> 
+                  </div>
+               </div>
+               <div class="col-12">
+                  <label for="yourName" class="form-label">출장지</label>
+                  <input  v-model="name" type="text" name="name" class="form-control" id="yourName" readonly>
+            </div>
+            <div class="col-12">
+                  <label for="yourName" class="form-label">출장목적</label>
+                  <input v-model="name" type="text" name="name" class="form-control " id="yourName" readonly>
+            </div>
+            <div class="col-12">
+                  <label for="yourName" class="form-label">동행자</label>
+                  <input v-model="name" type="text" name="name" class="form-control " id="yourName" readonly>
+            </div>
+            <div class="col-12 chuljang">
+                  <label for="yourName" class="form-label">품의내용</label>
+                  <input v-model="name" type="text" name="name" class="form-control textarea " id="yourName" readonly>
+            </div>
+            <div class="col-12">
+                  <label for="yourName" class="form-label">법인카드</label>
+                  <input v-model="name" type="text" name="name" class="form-control " id="yourName" readonly>
+            </div>
+            <div class="col-12">
+                  <label for="yourName" class="form-label">법인차량</label>
+                  <input v-model="name" type="text" name="name" class="form-control " id="yourName" readonly>
+            </div>
+            <div class="col-12 border-x">
+                  <label for="yourName" class="form-label">품의 신청일</label>
+                  <input v-model="name" type="text" name="name" class="form-control " id="yourName" readonly>
+            </div>
+              </form>
+      </div>
+      <div class="form-card">
+        <h1>출장복명서</h1>
+        <div class="approval-box tbl-wrap tbl2">
+         <table class="tbl data">
+          <tbody>
+            <tr class="thead">
+              <td rowspan="2" class="th">승인자</td>
+              <td>과장</td>
+              <td>소장</td>
+            </tr>
+            <tr>
+              <td><p class="name">홍길동</p><p class="date">2025/05/09</p></td>
+              <td><p class="name">홍길동</p><p class="date">2025/05/09</p></td>
+            </tr>
+          </tbody>
+
+         </table>
+        </div>
+          <form class="row g-3 needs-validation "  :class="{ 'was-validated': formSubmitted }" @submit.prevent="handleRegister" novalidate>
+               
+            <div class="col-12 chuljang">
+                  <label for="yourName" class="form-label">복명내용</label>
+                  <input v-model="name" type="text" name="name" class="form-control textarea " id="yourName" readonly>
+            </div>
+            <div class="col-12">
+                  <label for="yourName" class="form-label">여비계산</label>
+                  <input v-model="name" type="text" name="name" class="form-control " id="yourName" readonly>
+            </div>
+            <div class="col-12 border-x">
+                  <label for="yourName" class="form-label">복명 신청일</label>
+                  <input  v-model="name" type="text" name="name" class="form-control" id="yourName" readonly   placeholder="2025-01-01">
+            </div>
+           
+                
+              </form>
+      </div>
+            <div class="buttons">
+              <button class="btn btn-red "  type="submit">신청취소</button>
+              <button class="btn secondary"  type="submit"> 수정</button>
+                <button class="btn tertiary "  type="submit">목록</button>
+              </div>
+
+      </div>
+    </div>
+</template>
+
+<script>
+export default {
+  data() {
+    const today = new Date().toISOString().split('T')[0];
+    return {
+      isReturned: true,
+      startDate: today,
+      startTime: "09:00", // 기본 시작 시간 09:00
+      endDate: today,
+      endTime: "18:00", // 기본 종료 시간 18:00
+      category: "", 
+      dayCount: 1, 
+      reason: "", // 사유
+      listData: [
+  {
+    type: '연차',
+    approvalType: '결재',
+    applicant: '홍길동',
+    period: '2025-05-10 ~ 2025-15-03',
+    requestDate: '2025-04-25',
+    status: '대기'
+  },   {
+    type: '반차',
+    approvalType: '전결',
+    applicant: '홍길동',
+    period: '2025-05-01 ~ 2025-05-03',
+    requestDate: '2025-04-25',
+    status: '승인'
+  }],
+    };
+  },
+  computed: {
+    // Pinia Store의 상태를 가져옵니다.
+    loginUser() {
+      const authStore = useAuthStore();
+      return authStore.getLoginUser;
+    },
+  },
+  methods: {
+    // 폼 검증 메서드
+    validateForm() {
+      // 필수 입력 필드 체크
+      if (
+        this.category &&
+        this.startDate &&
+        this.startTime &&
+        this.endDate &&
+        this.endTime &&
+        this.dayCount > 0 &&
+        this.reason.trim() !== ""
+      ) {
+        this.isFormValid = true;
+      } else {
+        this.isFormValid = false;
+      }
+    },
+    calculateDayCount() {
+    const start = new Date(`${this.startDate}T${this.startTime}:00`);
+    const end = new Date(`${this.endDate}T${this.endTime}:00`);
+    
+    let totalHours = (end - start) / (1000 * 60 * 60);  // 밀리초를 시간 단위로 변환
+    
+    if (this.startDate !== this.endDate) {
+      // 시작일과 종료일이 다른경우
+      const startDateObj = new Date(this.startDate);
+      const endDateObj = new Date(this.endDate);
+      const daysDifference = (endDateObj - startDateObj) / (1000 * 60 * 60 * 24); // 두 날짜 사이의 차이를 일수로 계산
+      if (this.startTime !== "09:00" || this.endTime !== "18:00") {
+        this.dayCount = daysDifference + 0.5; // 시간 조건이 기준에서 벗어날 경우
+      } else {
+        this.dayCount = Math.ceil(daysDifference + 1); // 시간 조건이 기준에 맞을 경우
+      }
+    } else {
+      // 시작일과 종료일이 같은 경우
+      if (this.startTime !== "09:00" || this.endTime !== "18:00") {
+        this.dayCount = 0.5; // 시작 시간 또는 종료 시간이 기준과 다를 경우 0.5
+      } else {
+        this.dayCount = 1; // 기준 시간(09:00~18:00)이 맞으면 1일로 간주
+      }
+    }
+
+    this.validateForm(); // dayCount 변경 후 폼 재검증
+  },
+    handleSubmit() {
+      this.validateForm(); // 제출 시 유효성 확인
+      if (this.isFormValid) {
+        localStorage.setItem('HyugaFormData', JSON.stringify(this.$data));
+        alert("승인 요청이 완료되었습니다.");
+        // 추가 처리 로직 (API 요청 등)
+      } else {
+        alert("모든 필드를 올바르게 작성해주세요.");
+      }
+    },
+    
+    
+  },
+  mounted() {
+    // Load the saved form data when the page is loaded
+    this.loadFormData();
+  },
+  watch: {
+  startDate: 'calculateDayCount',
+  startTime: 'calculateDayCount',
+  endDate: 'calculateDayCount',
+  endTime: 'calculateDayCount',
+  reason: "validateForm",
+  category: 'category',
+  },
+};
+</script>
 
client/views/pages/Manager/attendance/ChuljangPumuiDetail.vue (added)
+++ client/views/pages/Manager/attendance/ChuljangPumuiDetail.vue
@@ -0,0 +1,203 @@
+<template>
+<div class="card ">
+      <div class="card-body">
+          <h2 class="card-title">출장 현황</h2>
+       
+      <div class="form-card">
+        <h1>출장품의서</h1>
+        <div class="approval-box tbl-wrap tbl2">
+         <table class="tbl data">
+          <tbody>
+            <tr class="thead">
+              <td rowspan="2" class="th">승인자</td>
+              <td>과장</td>
+              <td>소장</td>
+            </tr>
+            <tr>
+              <td><p class="name">홍길동</p><p class="date">2025/05/09</p></td>
+              <td><p class="name">홍길동</p><p class="date">2025/05/09</p></td>
+            </tr>
+          </tbody>
+
+         </table>
+        </div>
+          <form class="row g-3 needs-validation "  :class="{ 'was-validated': formSubmitted }" @submit.prevent="handleRegister" novalidate>
+                <div class="col-12 ">
+                  <div class="col-12 border-x">
+                    <label for="youremail" class="form-label ">출장구분<p class="require"><img :src="require" alt=""></p></label>
+                    <input  v-model="email" type="text" name="username" class="form-control" id="youremail" readonly >
+                  </div>
+    
+                  <div class="col-12 border-x">
+                    <label for="yourPassword" class="form-label">이름</label>
+                    <input  v-model="password" type="password" name="password" class="form-control" id="yourPassword" readonly   placeholder="주식회사 테이큰 소프트"> 
+                  </div>
+               </div>
+               <div class="col-12">
+                  <div class="col-12 border-x">
+                    <label for="youremail" class="form-label">부서</label>
+                    <input  v-model="email" type="text" name="username" class="form-control" id="youremail" readonly  placeholder="과장">
+                  </div>
+    
+                  <div class="col-12 border-x">
+                    <label for="yourPassword" class="form-label">직급</label>
+                    <input  v-model="password" type="password" name="password" class="form-control" id="yourPassword" readonly  placeholder="팀장"> 
+                  </div>
+               </div>
+               <div class="col-12">
+                  <label for="yourName" class="form-label">출장지</label>
+                  <input  v-model="name" type="text" name="name" class="form-control" id="yourName" readonly>
+            </div>
+            <div class="col-12">
+                  <label for="yourName" class="form-label">출장목적</label>
+                  <input v-model="name" type="text" name="name" class="form-control " id="yourName" readonly>
+            </div>
+            <div class="col-12">
+                  <label for="yourName" class="form-label">동행자</label>
+                  <input v-model="name" type="text" name="name" class="form-control " id="yourName" readonly>
+            </div>
+            <div class="col-12 chuljang">
+                  <label for="yourName" class="form-label">내용</label>
+                  <input v-model="name" type="text" name="name" class="form-control textarea " id="yourName" readonly>
+            </div>
+            <div class="col-12">
+                  <label for="yourName" class="form-label">법인카드</label>
+                  <input v-model="name" type="text" name="name" class="form-control " id="yourName" readonly>
+            </div>
+            <div class="col-12">
+                  <label for="yourName" class="form-label">법인차량</label>
+                  <input v-model="name" type="text" name="name" class="form-control " id="yourName" readonly>
+            </div>
+            <div class="col-12">
+                  <label for="yourName" class="form-label">품의 신청일</label>
+                  <input v-model="name" type="text" name="name" class="form-control " id="yourName" readonly>
+            </div>
+            <div class="col-12 border-x" :class="{ return: isReturned }">
+                  <label for="yourName" class="form-label">반려사유</label>
+                  <input  v-model="name" type="text" name="name" class="form-control" id="yourName" readonly   placeholder="2025-01-01">
+            </div>
+           
+                
+              </form>
+      </div>
+            <div class="buttons">
+              <button class="btn btn-red "  type="submit">신청취소</button>
+              <button class="btn secondary"  type="submit">  {{ isReturned ? '재신청' : '수정' }}</button>
+              <button class="btn primary" type="submit" v-if="!isReturned">복명서 작성</button>
+                <button class="btn tertiary "  type="submit">목록</button>
+              </div>
+
+      </div>
+    </div>
+</template>
+
+<script>
+export default {
+  data() {
+    const today = new Date().toISOString().split('T')[0];
+    return {
+      isReturned: true,
+      startDate: today,
+      startTime: "09:00", // 기본 시작 시간 09:00
+      endDate: today,
+      endTime: "18:00", // 기본 종료 시간 18:00
+      category: "", 
+      dayCount: 1, 
+      reason: "", // 사유
+      listData: [
+  {
+    type: '연차',
+    approvalType: '결재',
+    applicant: '홍길동',
+    period: '2025-05-10 ~ 2025-15-03',
+    requestDate: '2025-04-25',
+    status: '대기'
+  },   {
+    type: '반차',
+    approvalType: '전결',
+    applicant: '홍길동',
+    period: '2025-05-01 ~ 2025-05-03',
+    requestDate: '2025-04-25',
+    status: '승인'
+  }],
+    };
+  },
+  computed: {
+    // Pinia Store의 상태를 가져옵니다.
+    loginUser() {
+      const authStore = useAuthStore();
+      return authStore.getLoginUser;
+    },
+  },
+  methods: {
+    // 폼 검증 메서드
+    validateForm() {
+      // 필수 입력 필드 체크
+      if (
+        this.category &&
+        this.startDate &&
+        this.startTime &&
+        this.endDate &&
+        this.endTime &&
+        this.dayCount > 0 &&
+        this.reason.trim() !== ""
+      ) {
+        this.isFormValid = true;
+      } else {
+        this.isFormValid = false;
+      }
+    },
+    calculateDayCount() {
+    const start = new Date(`${this.startDate}T${this.startTime}:00`);
+    const end = new Date(`${this.endDate}T${this.endTime}:00`);
+    
+    let totalHours = (end - start) / (1000 * 60 * 60);  // 밀리초를 시간 단위로 변환
+    
+    if (this.startDate !== this.endDate) {
+      // 시작일과 종료일이 다른경우
+      const startDateObj = new Date(this.startDate);
+      const endDateObj = new Date(this.endDate);
+      const daysDifference = (endDateObj - startDateObj) / (1000 * 60 * 60 * 24); // 두 날짜 사이의 차이를 일수로 계산
+      if (this.startTime !== "09:00" || this.endTime !== "18:00") {
+        this.dayCount = daysDifference + 0.5; // 시간 조건이 기준에서 벗어날 경우
+      } else {
+        this.dayCount = Math.ceil(daysDifference + 1); // 시간 조건이 기준에 맞을 경우
+      }
+    } else {
+      // 시작일과 종료일이 같은 경우
+      if (this.startTime !== "09:00" || this.endTime !== "18:00") {
+        this.dayCount = 0.5; // 시작 시간 또는 종료 시간이 기준과 다를 경우 0.5
+      } else {
+        this.dayCount = 1; // 기준 시간(09:00~18:00)이 맞으면 1일로 간주
+      }
+    }
+
+    this.validateForm(); // dayCount 변경 후 폼 재검증
+  },
+    handleSubmit() {
+      this.validateForm(); // 제출 시 유효성 확인
+      if (this.isFormValid) {
+        localStorage.setItem('HyugaFormData', JSON.stringify(this.$data));
+        alert("승인 요청이 완료되었습니다.");
+        // 추가 처리 로직 (API 요청 등)
+      } else {
+        alert("모든 필드를 올바르게 작성해주세요.");
+      }
+    },
+    
+    
+  },
+  mounted() {
+    // Load the saved form data when the page is loaded
+    this.loadFormData();
+  },
+  watch: {
+  startDate: 'calculateDayCount',
+  startTime: 'calculateDayCount',
+  endDate: 'calculateDayCount',
+  endTime: 'calculateDayCount',
+  reason: "validateForm",
+  category: 'category',
+  },
+};
+</script>
 
client/views/pages/Manager/attendance/ChuljangStatue.vue (added)
+++ client/views/pages/Manager/attendance/ChuljangStatue.vue
@@ -0,0 +1,188 @@
+<template>
+  <div class="col-lg-12">
+    <div class="card">
+      <div class="card-body">
+        <h2 class="card-title">출장 현황</h2>
+        <!-- 폼그룹 -->
+        <div class="sch-form-wrap">
+        <div class="input-group">
+          <select name="" id="" class="form-select">
+          <option value="">년도</option>
+        </select>
+          <select name="" id="" class="form-select">
+          <option value="">월</option>
+        </select>
+      </div>
+      </div>
+        <!-- Table  -->
+        <div class="tbl-wrap">
+          <table id="myTable" class="tbl data">
+            <!-- 동적으로 <th> 생성 -->
+            <thead>
+              <tr>
+                <th>출장구분 </th>
+                <th>출장지</th>
+                <th>목적</th>
+                <th>출장기간</th>
+                <th>품의서 상태</th>
+                <th>복명서 등록 여부</th>
+                <th>복명서 상태</th>
+              </tr>
+            </thead>
+            <!-- 동적으로 <td> 생성 -->
+            <tbody>
+              <tr v-for="(item, index) in listData" :key="index" :class="{ 'expired': isPastPeriod(item.period) }" >
+                <td>{{ item.type }}</td>
+                <td>{{ item.where }}</td>
+                <td>{{ item.purpose }}</td>
+                <td @click="goToPage('all')">{{ item.period }}</td>
+                <td :class="getStatusClass(item.pumuiStatue)"  @click="goToPage('품의서')">{{ item.pumuiStatue }}</td>
+                <td :class="getBokmyeongClass(item.bokmyeong)"  @click="goToPage('복명서')">{{ item.bokmyeong }}</td>
+                <td :class="getStatusClass(item.status)">{{ item.status }}</td>
+              </tr>
+            </tbody>
+          </table>
+
+        </div>
+        <div class="pagination">
+          <ul>
+            <!-- 왼쪽 화살표 (이전 페이지) -->
+            <li class="arrow" :class="{ disabled: currentPage === 1 }" @click="changePage(currentPage - 1)">
+              &lt;
+            </li>
+
+            <!-- 페이지 번호 -->
+            <li v-for="page in totalPages" :key="page" :class="{ active: currentPage === page }"
+              @click="changePage(page)">
+              {{ page }}
+            </li>
+
+            <!-- 오른쪽 화살표 (다음 페이지) -->
+            <li class="arrow" :class="{ disabled: currentPage === totalPages }" @click="changePage(currentPage + 1)">
+              &gt;
+            </li>
+          </ul>
+        </div>
+
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { ref } from 'vue';
+import { SearchOutlined } from '@ant-design/icons-vue';
+export default {
+  data() {
+    return {
+      showOptions: false,
+      currentPage: 1,
+      totalPages: 3,
+      photoicon: "/client/resources/img/photo_icon.png",
+      // 데이터 초기화
+      years: [2023, 2024, 2025], // 연도 목록
+      months: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], // 월 목록
+      selectedYear: '',
+      selectedMonth: '',
+      listData: [
+        {
+          type: '연차',
+          where: '상주시청',
+          purpose: '유지보수',
+          period: '2025-05-10 ~ 2025-05-23',
+          pumuiStatue: '대기',
+          bokmyeong: '미등록',          
+          status: '대기'
+        }, {
+          type: '연차',
+          where: '상주시청',
+          purpose: '유지보수',
+          period: '2025-05-10 ~ 2025-05-10',
+          pumuiStatue: '승인',
+          bokmyeong: '등록',          
+          status: '대기'
+        },],
+      filteredData: [],
+    };
+  },
+  components: {
+    SearchOutlined
+  },
+  computed: {
+  },
+  methods: {
+    goToAttendancePage(item) {
+      this.$router.push({ name: 'AttendanceDetail', query: { id: item.id } });
+    },
+    changePage(page) {
+      if (page < 1 || page > this.totalPages) return;
+      this.currentPage = page;
+      this.$emit('page-changed', page); // 필요 시 부모에 알림
+    },
+    async onClickSubmit() {
+      // `useMutation` 훅을 사용하여 mutation 함수 가져오기
+      const { mutate, onDone, onError } = useMutation(mygql);
+
+      try {
+        const result = await mutate();
+        console.log(result);
+      } catch (error) {
+        console.error('Mutation error:', error);
+      }
+    },
+    goToPage(type) {
+  if (type === '품의서') {
+    this.$router.push('/ChuljangPumuiDetail.page');
+  } else if (type === 'all') {
+    this.$router.push('/ChuljangDetailAll.page');
+  } else if (type === '복명서') {
+    this.$router.push('/ChuljangBokmyeongDetail.page');
+  }
+},
+
+    // 상태에 따른 클래스 반환 메소드
+    getStatusClass(status) {
+      return status === 'active' ? 'status-active' : 'status-inactive';
+    },
+    getStatusClass(status, pumuiStatue) {
+  // Check the 'status' and 'pumuiStatue' to return the correct class
+  if (pumuiStatue === '승인') return 'status-approved'; 
+  if (pumuiStatue === '대기') return 'status-pending'; 
+  // If no match, fallback to status-based class
+  if (status === '대기') return 'status-pending';
+  if (status === '승인') return 'status-approved';
+
+  // Default empty string
+  return '';
+},
+getBokmyeongClass(bokmyeong) {
+  if (bokmyeong === '등록') return 'status-approved';
+  if (bokmyeong === '미등록') return 'status-pending';
+  return '';
+},
+    isPastPeriod(period) {
+      // 예: '2025-05-01 ~ 2025-05-03' → 종료일 추출
+      const endDateStr = period.split('~')[1]?.trim();
+      if (!endDateStr) return false;
+
+      const endDate = new Date(endDateStr);
+      const today = new Date();
+
+      // 현재 날짜보다 과거면 true
+      return endDate < today;
+    }
+  },
+  created() {
+  },
+  mounted() {
+
+
+  },
+};
+</script>
+
+<style scoped>
+tr {
+  cursor: pointer;
+}
+</style>
client/views/pages/Manager/attendance/attendance.vue
--- client/views/pages/Manager/attendance/attendance.vue
+++ client/views/pages/Manager/attendance/attendance.vue
@@ -1,132 +1,178 @@
 <template>
-  <div class="pagetitle">
-    <h2>직원관리</h2>
+  <div class="sidemenu">
+    <div class="myinfo simple">
+            <div class="name-box">
+                <div class="img-area">
+                    <div><img :src="photoicon" alt="">
+                        <p class="name">OOO과장</p>
+                    </div>
+                    <div class="info">
+                        <p>솔루션 개발팀</p>
+                        <i class="fa-bars"></i>
+                        <p>팀장</p>
+                    </div>
+                </div>
+            </div>
+            <details class="menu-box">
+          <summary><p>근태현황</p><div class="icon"><img :src="topmenuicon" alt=""></div></summary>
+          <ul>
+            <li> <router-link to="/myAttendance.page" exact-active-class="active-link" v-slot="{ isExactActive }">
+                <p>나의 근태현황</p>
+                <div class="icon" v-if="isExactActive">
+                  <img :src="menuicon" alt="">
+                </div>
+              </router-link></li>
+            <li>
+              <router-link to="/buseoAttendance.page" exact-active-class="active-link" v-slot="{ isExactActive }">
+                <p>부서별 근태현황</p>
+                <div class="icon" v-if="isExactActive">
+                  <img :src="menuicon" alt="">
+                </div>
+              </router-link>
+            </li>
+          </ul>
+      </details>
+            <details class="menu-box">
+          <summary><p>휴가</p><div class="icon"><img :src="topmenuicon" alt=""></div></summary>
+          <ul>
+            <li> <router-link to="/hyugaStatue.page" exact-active-class="active-link" v-slot="{ isExactActive }">
+                <p>휴가 현황</p>
+                <div class="icon" v-if="isExactActive">
+                  <img :src="menuicon" alt="">
+                </div>
+              </router-link></li>
+            <li>
+              <router-link to="/hyugaInsert.page" exact-active-class="active-link" v-slot="{ isExactActive }">
+                <p>휴가 신청</p>
+                <div class="icon" v-if="isExactActive">
+                  <img :src="menuicon" alt="">
+                </div>
+              </router-link>
+            </li>
+          </ul>
+      </details>
+            <details class="menu-box">
+          <summary><p>출장</p><div class="icon"><img :src="topmenuicon" alt=""></div></summary>
+          <ul>
+            <li> <router-link to="/ChuljangStatue.page" exact-active-class="active-link" v-slot="{ isExactActive }">
+                <p>출장 현황</p>
+                <div class="icon" v-if="isExactActive">
+                  <img :src="menuicon" alt="">
+                </div>
+              </router-link></li>
+            <li>
+              <router-link to="/ChuljangInsert.page" exact-active-class="active-link" v-slot="{ isExactActive }">
+                <p>출장 신청</p>
+                <div class="icon" v-if="isExactActive">
+                  <img :src="menuicon" alt="">
+                </div>
+              </router-link>
+            </li>
+          </ul>
+      </details>
+        </div>
   </div>
   <!-- End Page Title -->
-  <section class="section">
-    <div class="row">
+  <div class="content">
+    <router-view></router-view>
 
-
-      <div class="col-lg-12">
-        <div class="card">
-          <div class="card-body">
-            <h5 class="card-title">직원관리</h5>
-            <div class="d-flex pb-3 justify-content-between">
-              <div class="datatable-search d-flex gap-1 ">
-                <div class="">
-                  <select class="form-select " v-model="selectedDept">
-                    <option value="" >이름</option>
-                  </select>
-                </div>
-                <div class="search-bar d-flex gap-2">
-              <form class="search-form d-flex  align-items-center" method="POST" action="#"
-                @submit.prevent="updateMember">
-                <input type="text" v-model="searchQuery" name="query" placeholder="Search" title="Enter search keyword">
-                <button type="submit" title="Search"><i class="bi bi-search"></i></button>
-              </form>
-            </div>
-                <button type="button" class="btn btn-outline-secondary"
-                  @click="filterData">조회</button>
-
-              </div>
-              <div class="d-flex justify-content-end ">
-                <!-- <button type="button" class="btn btn-outline-secondary" @click="registerLeave">
-                  등록
-                </button>
-                <button type="button" class="btn btn-outline-success" @click="saveChanges">
-                  저장
-                </button> -->
-                <button type="button" class="btn btn-outline-danger" @click="deletePending">
-                  삭제
-                </button>
-              </div>
-
-            </div>
-            <!-- Table  -->
-            <table id="myTable" class="table datatable table-hover">
-              <!-- 동적으로 <th> 생성 -->
-              <thead>
-                <tr>
-                  <th>No </th>
-                  <th>이름</th>
-                  <th>부서</th>
-                  <th>직급</th>
-                  <th>이메일</th>
-                </tr>
-              </thead>
-              <!-- 동적으로 <td> 생성 -->
-              <tbody>
-                <tr v-for="(item, index) in UserInfo" :key="index">
-                  <td>
-                    <div class="form-check">
-                      <label class="form-check-label" for="acceptTerms">{{ index + 1 }}</label>
-                      <input v-model="item.acceptTerms" class="form-check-input" type="checkbox" />
-                    </div>
-                  </td>
-                  <td>{{ item.name }}</td> <!-- 이름 -->
-                  <td>{{ item.dept }}</td> <!-- 부서 -->
-                  <td>{{ item.level }}</td> <!-- 레벨 -->
-                  <td>{{ item.email }}</td> <!-- 이메일 -->
-                </tr>
-              </tbody>
-            </table>
-
-            <!-- End Table -->
-          </div>
-        </div>
-      </div>
-    </div>
-  </section>
+</div>
 </template>
 
 <script>
+import { ref } from 'vue';
+
 export default {
   data() {
     return {
+      photoicon: "/client/resources/img/photo_icon.png",
+      menuicon: "/client/resources/img/menuicon.png",
+      topmenuicon: "/client/resources/img/topmenuicon.png",
       // 데이터 초기화
-      levels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], // 월 목록
-      selectedDept: '',
-      selectedlevel: '',
+      years: [2023, 2024, 2025], // 연도 목록
+      months: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], // 월 목록
+      selectedYear: '',
+      selectedMonth: '',
+      DeptData: [
+        { member: '', deptNM: '', acceptTerms: false },
+        // 더 많은 데이터 추가...
+      ],
       filteredData: [],
     };
   },
   computed: {
-
   },
   methods: {
-    
-   
-    deletePending() {
-    // 선택된 항목만 필터링하여 삭제
-    const selectedItems = this.UserInfoData.filter(item => item.acceptTerms);
+    async onClickSubmit() {
+      // `useMutation` 훅을 사용하여 mutation 함수 가져오기
+      const { mutate, onDone, onError } = useMutation(mygql);
 
-    // 승인된 항목이 없으면 삭제 진행
-    if (selectedItems.length > 0) {
-      this.UserInfoData = this.UserInfoData.filter(item => !item.acceptTerms);
-      alert(`${selectedItems.length}개의 항목이 삭제되었습니다.`);
-    } else {
-      alert("선택된 항목이 없습니다.");
-    }
-  },
-   
+      try {
+        const result = await mutate();
+        console.log(result);
+      } catch (error) {
+        console.error('Mutation error:', error);
+      }
+    },
+    registerLeave() {
+      console.log("등록 버튼 클릭됨");
+
+      // Vue의 반응성 문제를 피하기 위해, 새로운 객체를 추가합니다.
+      this.DeptData = [
+        ...this.DeptData,
+        { member: '', deptNM: '', acceptTerms: false }
+      ];
+
+      console.log(this.DeptData); // 배열 상태 출력
+    },
+    saveChanges() {
+      // 로컬스토리지에 DeptData 저장
+      localStorage.setItem('DeptData', JSON.stringify(this.DeptData));
+      console.log('데이터가 로컬스토리지에 저장되었습니다.');
+    },
+    deletePending() {
+      // 선택된 항목만 필터링하여 삭제
+      const selectedItems = this.DeptData.filter(item => item.acceptTerms);
+
+      // 승인된 항목이 없으면 삭제 진행
+      if (selectedItems.length > 0) {
+        this.DeptData = this.DeptData.filter(item => !item.acceptTerms);
+        alert(`${selectedItems.length}개의 항목이 삭제되었습니다.`);
+      } else {
+        alert("선택된 항목이 없습니다.");
+      }
+    },
+    // 날짜 필터 적용
+    filterData() {
+      this.filteredData = this.DeptData.filter(item => {
+        const itemYear = new Date(item.startDate).getFullYear();
+        const itemMonth = new Date(item.startDate).getMonth() + 1; // 월은 0부터 시작하므로 1을 더해줍니다.
+
+        return (
+          (!this.selectedYear || itemYear === parseInt(this.selectedYear)) &&
+          (!this.selectedMonth || itemMonth === parseInt(this.selectedMonth))
+        );
+      });
+    },
+
     // 페이지 변경
     changePage(page) {
       this.currentPage = page;
     },
   },
   created() {
-    // 로컬스토리지에서 UserInfoData 불러오기
-    const storedUserInfo = localStorage.getItem('UserInfo');
-    console.log(storedUserInfo);
-    if (storedUserInfo) {
-      // 로컬스토리지에서 데이터를 가져와 UserInfoData에 설정
-      const parsedData = JSON.parse(storedUserInfo);
-      this.UserInfo = Array.isArray(parsedData) ? parsedData : [parsedData];
-    } 
+    // 로컬스토리지에서 기존 데이터가 있으면 불러오기
+    const storedData = localStorage.getItem('DeptData');
+    console.log(storedData);
+    if (storedData) {
+      this.DeptData = JSON.parse(storedData);
+    }
   },
   mounted() {
-    
-  
+
+    // 처음에는 모든 데이터를 표시
+    this.filteredData = this.DeptData;
+
   },
 };
 </script>
 
client/views/pages/Manager/attendance/buseoAttendance.vue (added)
+++ client/views/pages/Manager/attendance/buseoAttendance.vue
@@ -0,0 +1,208 @@
+<template>
+<div class="col-lg-12">
+  <div class="card">
+    <div class="card-body">
+      <h2 class="card-title">부서별 근태현황</h2>
+      <div class="sch-form-wrap">
+        <div class="input-group">
+          <select name="" id="" class="form-select">
+          <option value="">년도</option>
+        </select>
+          <select name="" id="" class="form-select">
+          <option value="">월</option>
+        </select>
+          <select name="" id="" class="form-select">
+          <option value="">구분</option>
+        </select>
+        <div class="sch-input">
+              <input type="text" class="form-control">
+              <button class="ico-sch"><SearchOutlined /></button>
+            </div>
+        </div>
+      </div>
+     
+      <!-- Table  -->
+      <div class="tbl-wrap">
+        <table id="myTable" class="tbl data buseo">
+          <!-- 동적으로 <th> 생성 -->
+          <thead>
+            <tr>
+              <th>부서 </th>
+              <th>직급</th>
+              <th>이름</th>
+              <th>지각</th>
+              <th>조기퇴근</th>
+              <th>결근</th>
+              <th>출장</th>
+              <th>주말출근</th>
+              <th>대체휴가</th>
+              <th>휴가</th>
+              <th>공가</th>
+              <th>병가</th>
+            </tr>
+          </thead>
+          <!-- 동적으로 <td> 생성 -->
+          <tbody>
+            <tr v-for="(item, index) in listData" :key="index"  @click="goToAttendancePage(item)">
+              <td>{{ item.department }}</td>
+    <td>{{ item.position }}</td>
+    <td>{{ item.name }}</td>
+    <td>{{ item.late }}</td>
+    <td>{{ item.earlyLeave }}</td>
+    <td>{{ item.absence }}</td>
+    <td>{{ item.businessTrip }}</td>
+    <td>{{ item.weekendWork }}</td>
+    <td>{{ item.substituteHoliday }}</td>
+    <td>{{ item.vacation }}</td>
+    <td>{{ item.publicHoliday }}</td>
+    <td>{{ item.sickLeave }}</td>
+  </tr>
+          </tbody>
+        </table>
+  
+      </div>
+      <div class="pagination">
+        <ul>
+      <!-- 왼쪽 화살표 (이전 페이지) -->
+      <li 
+        class="arrow" 
+        :class="{ disabled: currentPage === 1 }" 
+        @click="changePage(currentPage - 1)"
+      >
+      &lt;
+      </li>
+
+      <!-- 페이지 번호 -->
+      <li 
+        v-for="page in totalPages" 
+        :key="page" 
+        :class="{ active: currentPage === page }" 
+        @click="changePage(page)"
+      >
+        {{ page }}
+      </li>
+
+      <!-- 오른쪽 화살표 (다음 페이지) -->
+      <li 
+        class="arrow" 
+        :class="{ disabled: currentPage === totalPages }" 
+        @click="changePage(currentPage + 1)"
+      >
+      &gt;
+      </li>
+    </ul>
+  </div>
+      
+    </div>
+  </div>
+</div>
+</template>
+
+<script>
+import { ref } from 'vue';
+import { SearchOutlined } from '@ant-design/icons-vue';
+export default {
+  data() {
+    return {
+      showOptions: false,
+      currentPage: 1,
+      totalPages: 3,
+      photoicon: "/client/resources/img/photo_icon.png",
+      // 데이터 초기화
+      years: [2023, 2024, 2025], // 연도 목록
+      months: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], // 월 목록
+      selectedYear: '',
+      selectedMonth: '',
+      listData: [
+      {
+        department: '인사팀',
+        position: '팀장',
+        name: '홍길동',
+        late: 2,
+        earlyLeave: 1,
+        absence: 0,
+        businessTrip: 1,
+        weekendWork: 0,
+        substituteHoliday: 1,
+        vacation: 5,
+        publicHoliday: 0,
+        sickLeave: 1,
+      },
+      {
+        department: '개발팀',
+        position: '사원',
+        name: '김철수',
+        late: 1,
+        earlyLeave: 0,
+        absence: 1,
+        businessTrip: 0,
+        weekendWork: 2,
+        substituteHoliday: 0,
+        vacation: 3,
+        publicHoliday: 1,
+        sickLeave: 0,
+      },
+      // 추가 데이터...
+    ],
+      filteredData: [],
+    };
+  },
+  components:{
+    SearchOutlined
+  },
+  computed: {
+  },
+  methods: {
+    goToAttendancePage(item) {
+      this.$router.push({ name: 'AttendanceDetail', query: { id: item.id } });
+    },
+    changePage(page) {
+      if (page < 1 || page > this.totalPages) return;
+      this.currentPage = page;
+      this.$emit('page-changed', page); // 필요 시 부모에 알림
+    },
+    async onClickSubmit() {
+      // `useMutation` 훅을 사용하여 mutation 함수 가져오기
+      const { mutate, onDone, onError } = useMutation(mygql);
+
+      try {
+        const result = await mutate();
+        console.log(result);
+      } catch (error) {
+        console.error('Mutation error:', error);
+      }
+    },
+    goToPage(type) {
+  if (type === '휴가') {
+    this.$router.push('/HyugaDetail.page');
+  } else if (type === '출장') {
+    this.$router.push('/ChuljangDetail.page');
+  }
+},
+    getStatusClass(status) {
+      if (status === '승인') return 'status-approved';
+      if (status === '대기') return 'status-pending';
+      return '';
+    },
+    isPastPeriod(period) {
+    // 예: '2025-05-01 ~ 2025-05-03' → 종료일 추출
+    const endDateStr = period.split('~')[1]?.trim();
+    if (!endDateStr) return false;
+
+    const endDate = new Date(endDateStr);
+    const today = new Date();
+
+    // 현재 날짜보다 과거면 true
+    return endDate < today;
+  }
+  },
+  created() {
+  },
+  mounted() {
+
+
+  },
+};
+</script>
+
+<style scoped></style>
 
client/views/pages/Manager/attendance/hyugaStatue.vue (added)
+++ client/views/pages/Manager/attendance/hyugaStatue.vue
@@ -0,0 +1,205 @@
+<template>
+<div class="col-lg-12">
+  <div class="card">
+    <div class="card-body">
+      <h2 class="card-title">휴가 현황</h2>
+     <!-- 폼그룹 -->
+<div class="form-group">
+    <div class="form-conts">
+        <div class="form-conts datepicker-conts">
+            <div class="datepicker-input">
+                <input type="date" class="form-control datepicker cal" placeholder="YYYY.MM.DD" id="cal" style="max-width: 200px;">
+                <mark>~</mark>
+                <input type="date" class="form-control datepicker cal" placeholder="YYYY.MM.DD" id="cal" style="max-width: 200px;">
+            </div>
+        </div>
+    </div>
+</div>
+<!-- //폼그룹 -->
+      <div class="boxs">
+            <div class="color-boxs">
+                <div class="box ">
+                    <h3>지각</h3>
+                    3
+                </div>
+                <div class="box blue">
+                    <h3>조기퇴근</h3>
+                    3
+                </div>
+                <div class="box red">
+                    <h3>결근</h3>
+                    3
+                </div>
+                <div class="box green">
+                    <h3>결근</h3>
+                    3
+                </div>
+                <div class="box purple">
+                    <h3>결근</h3>
+                    3
+                </div>
+                <div class="box orange">
+                    <h3>결근</h3>
+                    3
+                </div>
+            </div>
+        </div>
+      <!-- Table  -->
+      <div class="tbl-wrap">
+          <table id="myTable" class="tbl data">
+            <!-- 동적으로 <th> 생성 -->
+            <thead>
+              <tr>
+                <th>구분 </th>
+                <th>기간</th>
+                <th>승인자</th>
+                <th>신청일</th>
+                <th>상태</th>
+              </tr>
+            </thead>
+            <!-- 동적으로 <td> 생성 -->
+            <tbody>
+              <tr v-for="(item, index) in listData" :key="index"  @click="goToDetailPage(item)">
+                <td>{{ item.type }}</td>
+                <td>{{ item.period }}</td>
+                <td>{{ item.approval }}</td>
+                <td>{{ item.requestDate  }}</td>
+                <td :class="getStatusClass(item.status)">{{ item.status }}</td>
+              </tr>
+            </tbody>
+          </table>
+
+        </div>
+      <div class="pagination">
+        <ul>
+      <!-- 왼쪽 화살표 (이전 페이지) -->
+      <li 
+        class="arrow" 
+        :class="{ disabled: currentPage === 1 }" 
+        @click="changePage(currentPage - 1)"
+      >
+      &lt;
+      </li>
+
+      <!-- 페이지 번호 -->
+      <li 
+        v-for="page in totalPages" 
+        :key="page" 
+        :class="{ active: currentPage === page }" 
+        @click="changePage(page)"
+      >
+        {{ page }}
+      </li>
+
+      <!-- 오른쪽 화살표 (다음 페이지) -->
+      <li 
+        class="arrow" 
+        :class="{ disabled: currentPage === totalPages }" 
+        @click="changePage(currentPage + 1)"
+      >
+      &gt;
+      </li>
+    </ul>
+  </div>
+      
+    </div>
+  </div>
+</div>
+</template>
+
+<script>
+import { ref } from 'vue';
+import { SearchOutlined } from '@ant-design/icons-vue';
+export default {
+  data() {
+    return {
+      showOptions: false,
+      currentPage: 1,
+      totalPages: 3,
+      photoicon: "/client/resources/img/photo_icon.png",
+      // 데이터 초기화
+      years: [2023, 2024, 2025], // 연도 목록
+      months: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], // 월 목록
+      selectedYear: '',
+      selectedMonth: '',
+      listData: [
+        {
+          type: '연차',
+          period: '2025-05-10 ~ 2025-15-03',
+          approval: '홍길동',
+          requestDate: '2025-04-25',
+          status: '대기'
+        }, {
+          type: '반차',
+          period: '2025-05-01 ~ 2025-05-03',
+          approval: '홍길동',
+          requestDate: '2025-04-25',
+          status: '승인'
+        }],
+      filteredData: [],
+    };
+  },
+  components:{
+    SearchOutlined
+  },
+  computed: {
+  },
+  methods: {
+
+    goToAttendancePage(item) {
+      this.$router.push({ name: 'AttendanceDetail', query: { id: item.id } });
+    },
+    changePage(page) {
+      if (page < 1 || page > this.totalPages) return;
+      this.currentPage = page;
+      this.$emit('page-changed', page); // 필요 시 부모에 알림
+    },
+    async onClickSubmit() {
+      // `useMutation` 훅을 사용하여 mutation 함수 가져오기
+      const { mutate, onDone, onError } = useMutation(mygql);
+
+      try {
+        const result = await mutate();
+        console.log(result);
+      } catch (error) {
+        console.error('Mutation error:', error);
+      }
+    },
+    goToDetailPage(item) {
+    // item.id 또는 다른 식별자를 사용하여 URL을 구성할 수 있습니다.
+    this.$router.push({ path: `/HyugaDetail.page`, query: { id: item.id } });
+  },
+
+  // 상태에 따른 클래스 반환 메소드
+  getStatusClass(status) {
+    return status === 'active' ? 'status-active' : 'status-inactive';
+  },
+    getStatusClass(status) {
+      if (status === '승인') return 'status-approved';
+      if (status === '대기') return 'status-pending';
+      return '';
+    },
+    isPastPeriod(period) {
+    // 예: '2025-05-01 ~ 2025-05-03' → 종료일 추출
+    const endDateStr = period.split('~')[1]?.trim();
+    if (!endDateStr) return false;
+
+    const endDate = new Date(endDateStr);
+    const today = new Date();
+
+    // 현재 날짜보다 과거면 true
+    return endDate < today;
+  }
+  },
+  created() {
+  },
+  mounted() {
+
+
+  },
+};
+</script>
+
+<style scoped>
+tr{cursor: pointer;}
+</style>
 
client/views/pages/Manager/attendance/myAttendance.vue (added)
+++ client/views/pages/Manager/attendance/myAttendance.vue
@@ -0,0 +1,248 @@
+<template>
+<div class="card ">
+      <div class="card-body">
+          <h2 class="card-title">나의 근태현황</h2>
+          <div class="sch-wrap">
+            <div class="sch-form-wrap title-wrap">
+            <div class="flex">
+              <div class="sub flex"><img :src="dateicon" alt=""><p class="date">{{ today }}</p></div>
+              <div class="buttons">
+                            <button><img :src="startbtn" alt=""></button>
+                            <button><img :src="stopbtn" alt=""></button>
+                        </div>
+            </div>
+            <div class="input-group">
+              <select name="" id="" class="form-select">
+                <option value="">년도</option>
+              </select>
+              <select name="" id="" class="form-select">
+                <option value="">월</option>
+              </select>
+              <select name="" id="" class="form-select">
+                <option value="">부서</option>
+              </select>
+            </div>
+  
+          </div>
+          </div>
+        <div class=" tbl-wrap tbl2">
+         <table class="tbl data">
+          <colgroup>
+    <col style="width: 150px;">
+    <col style="width: ">
+    <col style="width: ">
+    <col style="width: ">
+    <col style="width: ">
+    <col style="width: ">
+    <!-- 더 많은 열 설정 -->
+  </colgroup>
+          <tbody>
+            <tr class="thead">
+              <td rowspan="2" class="th">근태 현황</td>
+              <td>지각</td>
+              <td>조기퇴근</td>
+              <td>결근</td>
+              <td>출장</td>
+              <td>주말출근</td>
+            </tr>
+            <tr>
+    <td>{{ late }}</td>
+    <td>{{ earlyLeave }}</td>
+    <td>{{ absence }}</td>
+    <td>{{ businessTrip }}</td>
+    <td>{{ weekendWork }}</td>
+  </tr>
+          </tbody>
+
+         </table>
+         <table class="tbl data">
+          <colgroup>
+    <col style="width: 150px;">
+    <col style="width: ">
+    <col style="width: ">
+    <col style="width: ">
+    <col style="width: ">
+    <!-- 더 많은 열 설정 -->
+  </colgroup>
+          <tbody>
+            <tr class="thead">
+              <td rowspan="2" class="th">휴가 현황</td>
+              <td>연차</td>
+              <td>대체휴가</td>
+              <td>공가</td>
+              <td>병가</td>
+            </tr>
+            <tr>
+              <td></td>
+              <td></td>
+              <td></td>
+              <td></td>
+            </tr>
+          </tbody>
+
+         </table>
+        </div>
+        <div class="tbl-wrap">
+          <table id="myTable" class="tbl data">
+            <colgroup>
+            <col  style="width: 200px;">
+            <col style=" width: "> 
+          </colgroup>
+            <thead>
+              <tr>
+                <th>연차 </th>
+                <th>내용</th>
+              </tr>
+            </thead>
+            <!-- 동적으로 <td> 생성 -->
+            <tbody>
+              <tr v-for="(item, index) in listData" :key="index" >
+                <td>{{ item.type }}</td>
+    <td>{{ item.content }}</td>
+              </tr>
+            </tbody>
+          </table>
+
+        </div>
+        <div class="pagination">
+          <ul>
+            <!-- 왼쪽 화살표 (이전 페이지) -->
+            <li class="arrow" :class="{ disabled: currentPage === 1 }" @click="changePage(currentPage - 1)">
+              &lt;
+            </li>
+
+            <!-- 페이지 번호 -->
+            <li v-for="page in totalPages" :key="page" :class="{ active: currentPage === page }"
+              @click="changePage(page)">
+              {{ page }}
+            </li>
+
+            <!-- 오른쪽 화살표 (다음 페이지) -->
+            <li class="arrow" :class="{ disabled: currentPage === totalPages }" @click="changePage(currentPage + 1)">
+              &gt;
+            </li>
+          </ul>
+        </div>
+
+      </div>
+    </div>
+</template>
+
+<script>
+import { SearchOutlined } from '@ant-design/icons-vue';
+export default {
+  data() {
+    
+    const today = new Date().toISOString().split('T')[0];
+    return {
+      currentPage: 1,
+      totalPages: 3,
+      late: '5', earlyLeave: '3', absence: '2', businessTrip: '1', weekendWork: '0' ,
+      today: new Date().toLocaleDateString('ko-KR', {
+                year: 'numeric',
+                month: '2-digit',
+                day: '2-digit',
+                weekday: 'short',
+            }),
+      dateicon: "/client/resources/img/img.png",
+            startbtn: "/client/resources/img/start-sm.png",
+            stopbtn: "/client/resources/img/stop-sm.png",
+      startDate: today,
+      startTime: "09:00", // 기본 시작 시간 09:00
+      endDate: today,
+      endTime: "18:00", // 기본 종료 시간 18:00
+      category: "", 
+      dayCount: 1, 
+      reason: "", // 사유
+      listData: [
+  {
+    type: '연차',
+    content: '결재',
+  },   {
+    type: '반차',
+    content: '전결',
+  }],
+    };
+  },
+  components:{
+    SearchOutlined
+  },
+  computed: {
+    // Pinia Store의 상태를 가져옵니다.
+    loginUser() {
+      const authStore = useAuthStore();
+      return authStore.getLoginUser;
+    },
+  },
+  methods: {
+    // 폼 검증 메서드
+    validateForm() {
+      // 필수 입력 필드 체크
+      if (
+        this.category &&
+        this.startDate &&
+        this.startTime &&
+        this.endDate &&
+        this.endTime &&
+        this.dayCount > 0 &&
+        this.reason.trim() !== ""
+      ) {
+        this.isFormValid = true;
+      } else {
+        this.isFormValid = false;
+      }
+    },
+    calculateDayCount() {
+    const start = new Date(`${this.startDate}T${this.startTime}:00`);
+    const end = new Date(`${this.endDate}T${this.endTime}:00`);
+    
+    let totalHours = (end - start) / (1000 * 60 * 60);  // 밀리초를 시간 단위로 변환
+    
+    if (this.startDate !== this.endDate) {
+      // 시작일과 종료일이 다른경우
+      const startDateObj = new Date(this.startDate);
+      const endDateObj = new Date(this.endDate);
+      const daysDifference = (endDateObj - startDateObj) / (1000 * 60 * 60 * 24); // 두 날짜 사이의 차이를 일수로 계산
+      if (this.startTime !== "09:00" || this.endTime !== "18:00") {
+        this.dayCount = daysDifference + 0.5; // 시간 조건이 기준에서 벗어날 경우
+      } else {
+        this.dayCount = Math.ceil(daysDifference + 1); // 시간 조건이 기준에 맞을 경우
+      }
+    } else {
+      // 시작일과 종료일이 같은 경우
+      if (this.startTime !== "09:00" || this.endTime !== "18:00") {
+        this.dayCount = 0.5; // 시작 시간 또는 종료 시간이 기준과 다를 경우 0.5
+      } else {
+        this.dayCount = 1; // 기준 시간(09:00~18:00)이 맞으면 1일로 간주
+      }
+    }
+
+    this.validateForm(); // dayCount 변경 후 폼 재검증
+  },
+    handleSubmit() {
+      this.validateForm(); // 제출 시 유효성 확인
+      if (this.isFormValid) {
+        localStorage.setItem('HyugaFormData', JSON.stringify(this.$data));
+        alert("승인 요청이 완료되었습니다.");
+        // 추가 처리 로직 (API 요청 등)
+      } else {
+        alert("모든 필드를 올바르게 작성해주세요.");
+      }
+    },
+    
+    
+  },
+  mounted() {
+    // Load the saved form data when the page is loaded
+    this.loadFormData();
+  },
+  watch: {
+  startDate: 'calculateDayCount',
+  startTime: 'calculateDayCount',
+  endDate: 'calculateDayCount',
+  endTime: 'calculateDayCount',
+  reason: "validateForm",
+  category: 'category',
+  },
+};
+</script>
client/views/pages/User/MyPage.vue
--- client/views/pages/User/MyPage.vue
+++ client/views/pages/User/MyPage.vue
@@ -86,8 +86,9 @@
               
             </form>
             <div class="buttons">
-                <button class="btn btn-red w-100"  type="submit">회원탈퇴</button>
-                <button class="btn secondary w-100"  type="submit">수정</button>
+                <button class="btn primary"  type="submit">반려</button>
+                <button class="btn btn-red "  type="submit">반려</button>
+                <button class="btn tertiary "  type="submit">목록</button>
               </div>
           </div>
         </div>
Add a comment
List