
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
<template>
<div class="card ">
<div class="card-body">
<h2 class="card-title">급여명세서 등록</h2>
<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"><p>아이디<p class="require"><img :src="require" alt=""></p></p> </label>
<input v-model="selectedid" type="text" name="name" class="form-control" required readonly
>
<input type="button" class="form-control " value="검색" @click="showPopup1 = true" />
<HrPopup v-if="showPopup1" @close="showPopup1 = false" @select="addApproval" />
</div>
<div class="col-12 ">
<div class="col-12 border-x">
<label for="youremail" class="form-label ">이름</label>
<input v-model="selectedname" type="text" class="form-control" required readonly>
</div>
<div class="col-12 border-x">
<label for="yourPassword" class="form-label">부서</label>
<input v-model="selecteddepartment" type="text" class="form-control"
required readonly >
</div>
</div>
<div class="col-12">
<div class="col-12 border-x">
<label for="youremail" class="form-label">직급</label>
<input v-model="selectedposition" type="text" class="form-control" required readonly
>
</div>
<div class="col-12 border-x">
<label for="yourPassword" class="form-label">직책</label>
<input v-model="selectedrole" type="text" class="form-control"
required readonly>
</div>
</div>
<div class="col-12 border-x">
<div class="col-12 border-x">
<label for="youremail" class="form-label"><p>월<p class="require"><img :src="require" alt=""></p></p> </label>
<select name="" id="" class="form-select">
<option value="">월</option>
</select>
</div>
<div class="col-12 border-x">
<label for="yourPassword" class="form-label"><p>지급일<p class="require"><img :src="require" alt=""></p></p> </label>
<input type="date" class="form-control"
required >
</div>
</div>
</form>
<div class="buttons" style="margin: 10px 0;">
<button type="submit" class="btn btn-red sm">지난달 정보 불러오기</button>
<button type="submit" class="btn primary sm" @click="showPopup = true">출장비 조회</button>
<ChuljangListPopup v-if="showPopup" @close="showPopup = false" @select="addApproval" />
</div>
<form class="row g-3 needs-validation" @submit.prevent="handleSubmit">
<div class="col-12 form-title">매월지급</div>
<div class="col-12">
<label for="purpose" class="form-label"><p>지급 <button type="button" title="추가" @click="addPayment">
<PlusCircleFilled />
</button><p class="require"><img :src="require" alt=""></p></p> </label>
<div class="approval-container">
<div v-for="(payment, index) in payments" :key="index" class="d-flex gap-2 addapproval mb-2">
<select class="form-select" style="width: 200px;" v-model="payment.category">
<option value="기본급">기본급</option>
<option value=""></option>
<option value=""></option>
</select>
<input type="text" class="form-control" v-model="payment.pay" />
<button type="button" @click="removePayment(index)" class="delete-button">
<CloseOutlined />
</button>
</div>
</div>
</div>
<div class="col-12 border-x">
<label for="purpose" class="form-label"><p>공제 <button type="button" title="추가" @click="addGongje">
<PlusCircleFilled />
</button><p class="require"><img :src="require" alt=""></p></p> </label>
<div class="approval-container">
<div class="d-flex addapproval">
<select class="form-select" style="width: 200px;" >
<option value="국민연금">국민연금</option>
<option value="">건강보험</option>
<option value="">고용보험</option>
<option value="">장기요양</option>
<option value="">소득세</option>
<option value="">지방소득세</option>
</select>
<input type="text" class="form-control" />
</div>
<div class="d-flex addapproval">
<select class="form-select" style="width: 200px;" >
<option value="국민연금">국민연금</option>
<option value="">건강보험</option>
<option value="">고용보험</option>
<option value="">장기요양</option>
<option value="">소득세</option>
<option value="">지방소득세</option>
</select>
<input type="text" class="form-control" />
</div>
<div class="d-flex addapproval">
<select class="form-select" style="width: 200px;" >
<option value="국민연금">국민연금</option>
<option value="">건강보험</option>
<option value="">고용보험</option>
<option value="">장기요양</option>
<option value="">소득세</option>
<option value="">지방소득세</option>
</select>
<input type="text" class="form-control" />
</div>
<div class="d-flex addapproval">
<select class="form-select" style="width: 200px;" >
<option value="국민연금">국민연금</option>
<option value="">건강보험</option>
<option value="">고용보험</option>
<option value="">장기요양</option>
<option value="">소득세</option>
<option value="">지방소득세</option>
</select>
<input type="text" class="form-control" />
</div>
<div class="d-flex addapproval">
<select class="form-select" style="width: 200px;" >
<option value="국민연금">국민연금</option>
<option value="">건강보험</option>
<option value="">고용보험</option>
<option value="">장기요양</option>
<option value="">소득세</option>
<option value="">지방소득세</option>
</select>
<input type="text" class="form-control" />
</div>
<div class="d-flex addapproval">
<select class="form-select" style="width: 200px;" >
<option value="국민연금">국민연금</option>
<option value="">건강보험</option>
<option value="">고용보험</option>
<option value="">장기요양</option>
<option value="">소득세</option>
<option value="">지방소득세</option>
</select>
<input type="text" class="form-control" />
</div>
<div v-for="(gongje, index) in gongjes" :key="index" class="d-flex addapproval">
<select class="form-select" style="width: 200px;" v-model="gongje.category">
<option value="">기본급</option>
<option value=""></option>
<option value=""></option>
</select>
<input type="text" class="form-control" v-model="gongje.pay" />
<button type="button" @click="removeGongje(index)" class="delete-button">
<CloseOutlined />
</button>
</div>
</div>
</div>
</form>
<form class="row g-3 needs-validation" @submit.prevent="handleSubmit" style="margin-top: 10px;">
<div class="col-12 form-title">격월 또는 부정기 지급</div>
<div class="col-12">
<label for="purpose" class="form-label"><p>지급 <button type="button" title="추가" @click="addPayment2">
<PlusCircleFilled />
</button><p class="require"><img :src="require" alt=""></p></p> </label>
<div class="approval-container">
<div v-for="(payment, index) in payments2" :key="index" class="d-flex gap-2 addapproval mb-2">
<select class="form-select" style="width: 200px;" v-model="payment.category">
<option value="선택">선택</option>
<option value=""></option>
<option value=""></option>
</select>
<input type="text" class="form-control" v-model="payment.pay" />
<button type="button" @click="removePayment2(index)" class="delete-button">
<CloseOutlined />
</button>
</div>
</div>
</div>
<div class="col-12 border-x">
<label for="purpose" class="form-label"><p>공제 <button type="button" title="추가" @click="addGongje2">
<PlusCircleFilled />
</button><p class="require"><img :src="require" alt=""></p></p> </label>
<div class="approval-container">
<div v-for="(gongje, index) in gongjes2" :key="index" class="d-flex addapproval">
<select class="form-select" style="width: 200px;" v-model="gongje.category">
<option value="선택">선택</option>
<option value=""></option>
<option value=""></option>
</select>
<input type="text" class="form-control" v-model="gongje.pay" />
<button type="button" @click="removeGongje2(index)" class="delete-button">
<CloseOutlined />
</button>
</div>
</div>
</div>
</form>
<form class="row g-3 needs-validation" @submit.prevent="handleSubmit" style="margin-top: 10px;">
<div class="col-12 form-title">계산방법<button type="button" title="추가" @click="addTr">
<PlusCircleFilled />
</button></div>
<div class="col-12 border-x" >
<div class="tbl-wrap tbl3">
<table class="tbl">
<thead>
<tr>
<th>지급</th>
<th>산출식 또는 산출 방법</th>
<th>지급액(원)</th>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in listData" :key="index" >
<td>
<select class="form-select" v-model="item.payType">
<option value="">선택</option>
<option value=""></option>
<option value=""></option>
</select>
</td>
<td><input type="text" class="form-control" v-model="item.formula" /></td>
<td><input type="text" class="form-control" v-model="item.amount" /></td>
</tr>
</tbody>
</table>
</div>
</div>
</form>
<form class="row g-3 needs-validation" @submit.prevent="handleSubmit" style="margin-top: 10px;">
<div class="col-12 border-x">
<label for="purpose" class="form-label">지급 </label>
<input type="text" class="form-control">
<label for="purpose" class="form-label">지급 </label>
<input type="text" class="form-control">
<label for="purpose" class="form-label">지급 </label>
<input type="text" class="form-control">
</div>
</form>
<div class="buttons">
<button type="submit" class="btn primary">등록</button>
<button type="submit" class="btn tertiary">취소</button>
</div>
</div>
</div>
</template>
<script>
import GoogleCalendar from "../../../component/GoogleCalendar.vue"
import { PlusCircleFilled, CloseOutlined } from '@ant-design/icons-vue';
import HrPopup from "../../../component/Popup/HrPopup.vue";
import ChuljangListPopup from "../../../component/Popup/ChuljangListPopup.vue";
export default {
data() {
return {
showPopup: false,
showPopup1: false,
selectedid: '',
selectedname: '',
selectedposition: '',
selectedrole: '',
selecteddepartment: '',
approvals: [],
listData: [
{ payType: '', formula: '', amount: '' }
],
payments: [ {
category: '기본급',
pay: '',
},] ,
gongjes: [ {
category: '기본급',
pay: '',
},] ,
payments2: [ {
category: '선택',
pay: '',
},] ,
gongjes2: [ {
category: '선택',
pay: '',
},] ,
require: "/client/resources/img/require.png",
photoicon: "/client/resources/img/photo_icon.png",
img1: "/client/resources/img/img.png",
icon1: "/client/resources/img/icon.png",
dateicon: "/client/resources/img/date.png",
startbtn: "/client/resources/img/start.png",
stopbtn: "/client/resources/img/stop.png",
moreicon: "/client/resources/img/more.png",
today: new Date().toLocaleDateString('ko-KR', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
weekday: 'short',
}),
time: this.getCurrentTime(),
}
},
components: {
PlusCircleFilled, CloseOutlined, HrPopup, ChuljangListPopup
},
methods: {
addApproval(selectedUser) {
this.approvals.push({
id: selectedUser.id,
name: selectedUser.name,
department: selectedUser.department,
position: selectedUser.position,
role: selectedUser.role,
});
this.selectedid = selectedUser.id; // 입력창에 표시
this.selectedname = selectedUser.name; // 입력창에 표시
this.selecteddepartment = selectedUser.department; // 입력창에 표시
this.selectedposition = selectedUser.position; // 입력창에 표시
this.selectedrole = selectedUser.role; // 입력창에 표시
this.showPopup1 = false;
},
addTr() {
this.listData.push({ payType: '', formula: '', amount: '' });
},
addPayment() {
this.payments.push({
category: '선택',
pay: '',
});
},
removePayment(index) {
this.payments.splice(index, 1);
},
addGongje() {
this.gongjes.push({
category: '선택',
pay: '',
});
},
removeGongje(index) {
this.gongjes.splice(index, 1);
},
addPayment2() {
this.payments2.push({
category: '선택',
pay: '',
});
},
removePayment2(index) {
this.payments2.splice(index, 1);
},
addGongje2() {
this.gongjes2.push({
category: '선택',
pay: '',
});
},
removeGongje2(index) {
this.gongjes2.splice(index, 1);
},
formatBudget(amount) {
return new Intl.NumberFormat().format(amount) + ' 원';
},
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;
},
getStatusClass(status) {
return status === 'active' ? 'status-active' : 'status-inactive';
},
getStatusClass(status) {
if (status === '미진행') return 'status-pending';
if (status === '진행중') return 'status-approved';
// Default empty string
return '';
},
getCurrentTime() {
const now = new Date();
const hours = String(now.getHours()).padStart(2, '0');
const minutes = String(now.getMinutes()).padStart(2, '0');
const seconds = String(now.getSeconds()).padStart(2, '0');
return `${hours}:${minutes}:${seconds}`;
},
getCategoryClass(category) {
switch (category) {
case '용역': return 'category-service';
case '내부': return 'category-internal';
case '국가과제': return 'category-government';
default: return '';
}
},
},
watch: {
},
computed: {
},
mounted() {
console.log('main mounted');
setInterval(() => {
this.time = this.getCurrentTime();
}, 1000);
}
}
</script>
<style scoped>
tr{cursor: pointer;}
.approval-container{
width: 100%;
}
.addapproval input{
width: calc(100% - 240px);
}
</style>