@ -128,7 +128,7 @@
<div class="tabels cols2 no-info">
<table class="display">
<tr>
<th rowspan="3 " style="width: 100px;">이행강제금산출</th>
<th rowspan="4 " style="width: 100px;">이행강제금산출</th>
<th style="border-right: 0; border-bottom: 0;">시가표준액</th>
<th style="width: 23px; border-right: 0; border-bottom: 0;"></th>
<th style="border-right: 0; border-bottom: 0;">위반면적</th>
@ -142,27 +142,55 @@
<th style="border-bottom: 0;">산정액</th>
</tr>
<tr>
<td style="border-right: 0; border-bottom: 0;"><input type="text" class="input" value=""/></td>
<td style="width: 23px; border-right: 0; border-bottom: 0;">X</td>
<td style="border-right: 0; border-bottom: 0;"><input type="text" class="input" value=""/></td>
<td style="width: 23px; border-right: 0; border-bottom: 0;">X</td>
<td style="border-right: 0; border-bottom: 0;"><input type="text" class="input" value=""/></td>
<td style="width: 23px; border-right: 0; border-bottom: 0;">X</td>
<td style="border-right: 0; border-bottom: 0;"><input type="text" class="input" value=""/></td>
<td style="width: 23px; border-right: 0; border-bottom: 0;">X</td>
<td style="border-right: 0; border-bottom: 0;"><input type="text" class="input" value=""/></td>
<td style="width: 23px; border-right: 0; border-bottom: 0;">=</td>
<td style="border-bottom: 0;"><input type="text" class="input" value=""/></td>
<td rowspan="2" style="border-right: 0; border-bottom: 0;">
<input type="text" class="input numericMask" id="standardMarketPrice_top" readonly/>
</td>
<td rowspan="2" style="width: 23px; border-right: 0; border-bottom: 0;">X</td>
<td rowspan="2" style="border-right: 0; border-bottom: 0;">
<input type="text" id="vltnArea" class="input decimalMask" value=""/>
</td>
<td rowspan="2" style="width: 23px; border-right: 0; border-bottom: 0;">X</td>
<td style="border-right: 0; border-bottom: 0; padding: 0 !important;">
<button type="button" id="" class="newbtn bg2-1" style="width: 93px; padding: 5px 5px;">+ 가산 [100%]</button>
<button type="button" id="" class="newbtn bg6" style="width: 90px;padding: 5px 5px;">- 감산 [100%]</button>
</td>
<td rowspan="2" style="width: 23px; border-right: 0; border-bottom: 0;">X</td>
<td rowspan="2" style="border-right: 0; border-bottom: 0;">
<input type="text" class="input" id="cmpttnRt" value="" style="text-align: right;" readonly/>
<input type="hidden" class="input" id="cmpttnRtRate" value="" readonly/>
</td>
<td rowspan="2" style="width: 23px; border-right: 0; border-bottom: 0;">X</td>
<td style="border-right: 0; border-bottom: 0;">
<select id="cmpttnRt2Cd" class="input">
<option value="">선택하세요.</option>
<c:forEach var="code" items="${crdnCmpttnRt2List}">
<option value="${code.cmpttnRt2Cd}" rateValueAttribute="${code.cmpttnRt2} %" rateValueAttribute2="${code.cmpttnRt2Rate}" >
${code.vltnMttr}
</option>
</c:forEach>
</select>
</td>
<td rowspan="2" style="width: 23px; border-right: 0; border-bottom: 0;">=</td>
<td rowspan="2" style="border-bottom: 0;"><input type="text" class="input" value=""/></td>
</tr>
<tr>
<td colspan="12"><strong>부과총액 = 결과값</strong></td>
<td style="border-top: 0; border-right: 0; border-bottom: 0;">
<input type="text" class="input" id="" value="" readonly/>
</td>
<td style="border-top: 0; border-right: 0; border-bottom: 0;">
<input type="text" id="actCmpttnRt" class="input" style="text-align: right;" value="" readonly/>
</td>
</tr>
<tr>
<td colspan="12" style="border-top: 0;"><strong>부과총액 = 결과값 계산로직 진행 중</strong></td>
</tr>
</table>
</div>
</div>
<%-- 해당년도 시가표준액 계산 --%>
<div class="containers">
<div class="tabels cols2 no-info">
<table class="display">
<table class="display" id="calculationTable" >
<tr>
<th rowspan="3" style="width: 100px;">${crdnData.crdnYr} 년도</th>
<th style="border-right: 0; border-bottom: 0;">건물<br/>기준시가액</th>
@ -181,28 +209,18 @@
<th style="border-bottom: 0;">시가표준액<br/>(1,000원미만절삭)</th>
</tr>
<tr>
<td style="border-right: 0; border-bottom: 0;">
<input type="text" class="input" value="" readonly/>
</td>
<td style="border-right: 0; border-bottom: 0;"><input type="text" class="input numericMask" id="bldgNewPrcCrtrAmt_nm" readonly/></td>
<td rowspan="2" style="width: 23px; border-right: 0;">X</td>
<td style="border-right: 0; border-bottom: 0;">
<input type="text" class="input" value="" readonly/>
</td>
<td style="border-right: 0; border-bottom: 0;"><input type="text" class="input" id="strctIdx_nm" readonly/></td>
<td rowspan="2" style="width: 23px; border-right: 0;">X</td>
<td style="border-right: 0; border-bottom: 0;">
<input type="text" class="input" value="" readonly/>
</td>
<td style="border-right: 0; border-bottom: 0;"><input type="text" class="input" id="usgIdx_nm" readonly/></td>
<td rowspan="2" style="width: 23px; border-right: 0;">X</td>
<td style="border-right: 0; border-bottom: 0;">
<input type="text" class="input" value="" readonly/>
</td>
<td style="border-right: 0; border-bottom: 0;"><input type="text" class="input numericMask" id="pstnIdx_nm" readonly/></td>
<td rowspan="2" style="width: 23px; border-right: 0;">X</td>
<td style="border-right: 0; border-bottom: 0;">
<input type="text" class="input" value="" readonly/>
</td>
<td style="border-right: 0; border-bottom: 0;"><input type="text" class="input" style="text-align: right;" id="elpsYrRdvlrt_yr" readonly/></td>
<td rowspan="2" style="width: 23px; border-right: 0;">X</td>
<td style="border-right: 0; border-bottom: 0;">
<select id="bscsCstrnSeCd" name="bscsCstrnSeCd" class="input" style="width: 180px;" validation-check="required">
<select id="bscsCstrnSeCd" name="bscsCstrnSeCd" class="input" validation-check="required">
<option value="">선택하세요</option>
<c:forEach var="code" items="${bscsCstrnSeCdList}">
<option value="${code.cdId}">${code.cdNm}</option>
@ -210,16 +228,16 @@
</select>
</td>
<td rowspan="2" style="width: 23px; border-right: 0;">=</td>
<td rowspan="2" style="border-right: 0; border-bottom: 0;"><input type="text" class="input" value="" /></td>
<td rowspan="2" style="border-bottom: 0;"><input type="text" class="input" value="" /></td>
<td rowspan="2" style="border-right: 0; border-bottom: 0;"><input type="text" class="input numericMask" id="taxableMarketPrice" readonly /></td>
<td rowspan="2" style="border-bottom: 0;"><input type="text" class="input numericMask" id="standardMarketPrice" readonly /></td>
</tr>
<tr>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input" value="" /></td>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input" value="" /></td>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input" value="" /></td>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input" value="" /></td>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input" value="" /></td>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input" value="" /></td>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input numericMask" id="bldgNewPrcCrtrAmt" readonly /></td>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input decimalMask" id="strctIdx" readonly /></td>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input decimalMask" id="usgIdx" readonly /></td>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input decimalMask" id="pstnIdx" readonly /></td>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input numericMask" id="elpsYrRdvlrt" readonly /></td>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input decimalMask" id="bscsCstrnRt" readonly /></td>
</tr>
</table>
</div>
@ -248,7 +266,7 @@
(function(window, $) {
'use strict';
var ImpltTask Popup = {
var LevyPrvntc Popup = {
// 팝업 모드 및 기본 정보
mode: '${mode}',
crdnYr: '${crdnYr}',
@ -297,6 +315,7 @@
var self = this;
return [
{ header: '행위유형코드', name: 'actTypeCd', align: 'center', width: 60, hidden: true},
{ header: '행위유형산정률1', name: 'actCmpttnRt', align: 'center', width: 60, hidden: true},
{ header: '행위유형명', name: 'actTypeCdNm', align: 'center', width: 180},
{ header: '위반법규코드', name: 'vltnLwrgCd1', align: 'center', width: 60, hidden: true},
{ header: '위반법', name: 'vltnLaw1', align: 'center', width: 130},
@ -312,6 +331,11 @@
return e.value ? parseFloat(e.value).toFixed(2) : '-';
}
},
{ header: '조치면적', name: 'actnArea', align: 'right', width: 100, formatter: function(e){
//return e.value != null ? Number(e.value).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) : '';
return e.value ? parseFloat(e.value).toFixed(2) : '0';
}
},
{ header: '우편번호', name: 'zip', align: 'center', width: 90, hidden: true },
{ header: '지번 전체주소', name: 'lotnoWholAddr', align: 'left', width: 300, hidden: true },
{ header: '지번', name: 'lotnoMSno', align: 'center', width: 80, hidden: true, formatter: function(row, col, cellValue, item, rowIndex) {
@ -327,8 +351,10 @@
}
},
{ header: '구조지수코드', name: 'strctIdxCd', align: 'center', width: 60, hidden: true},
{ header: '구조지수', name: 'strctIdx', align: 'right', width: 150, formatter: function(e){ return e.value != null ? Number(e.value).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) : ''; } },
{ header: '구조지수명', name: 'strctIdxCdNm', align: 'left', width: 150},
{ header: '용도지수코드', name: 'usgIdxCd', align: 'center', width: 60, hidden: true},
{ header: '용도지수', name: 'usgIdx', align: 'right', formatter: function(e){ return e.value != null ? Number(e.value).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) : ''; } },
{ header: '용도지수명', name: 'usgIdxCdNm', align: 'left'},
{ header: '건물신축가격기준액NO', name: 'no', hidden: true },
{ header: '건물신축가격기준액', name: 'bldgNewPrcCrtrAmt', align: 'right', width: 140, formatter: function(e){ return e.value != null ? Number(e.value).toLocaleString() : ''; } },
@ -360,7 +386,7 @@
initialRequest: false, // 초기 데이터 요청 여부
serializer: function(params) {
var defaultParams = $.param(params);
var extra = $.param({ "crdnYr": ImpltTaskPopup.crdnYr, "crdnNo": ImpltTask Popup.crdnNo, "impltInfoId": $("#impltInfoId").val() });
var extra = $.param({ "crdnYr": LevyPrvntcPopup.crdnYr, "crdnNo": LevyPrvntc Popup.crdnNo, "impltInfoId": $("#impltInfoId").val() });
return defaultParams + '&' + extra;
}
};
@ -389,7 +415,6 @@
// 데이터 로딩 완료 이벤트
this.instance.on('successResponse', function(ev) {
var responseObj = JSON.parse(ev.xhr.response);
console.log(responseObj);
if( responseObj && responseObj.data ){
// 총 개수 업데이트
$('#totalCount').text('총 ' + responseObj.data.contents.length + '건');
@ -398,18 +423,52 @@
// 렌더링완료 후 check box
this.instance.on('onGridUpdated', function() {
var allRows = self.instance.getData();
var rowKey = null;
allRows.forEach(function(row) {
if (row.selected) {
rowKey = row.rowKey
}
// 1. 체크박스 선택
self.instance.check(rowKey);
});
});
/**
* 중요로직: 행 선택 시 공통 처리 함수
* rowData를 통해 actInfoId 설정 및 다른 그리드 새로고침
* @param {Object} rowData - 선택된 행의 데이터
*/
var handleRowSelection = function(rowData) {
if (!rowData) return;
var vltnArea = rowData.calcArea; // 면적 - 조치면적 : 위반면적
$('#vltnArea').val(vltnArea); // 위반면적
// 행위유형에 따른 산정률1 설정
$('#cmpttnRt').val(rowData.actCmpttnRt+ ' %');
$('#cmpttnRtRate').val(rowData.actCmpttnRtRate);
$('#bscsCstrnRt').val(''); // 기초공사율
$('#bscsCstrnSeCd').val(''); // 기초공사구분
$('#bldgNewPrcCrtrAmt_nm').val(rowData.bldgNewPrcCrtrAmt).trigger('focus'); // 건물기준시가액(상단)
$('#bldgNewPrcCrtrAmt').val(rowData.bldgNewPrcCrtrAmt).trigger('focus'); // 건물기준시가액(하단)
$('#strctIdx_nm').val(rowData.strctIdxCdNm); // 구조지수(상단)
$('#strctIdx').val(rowData.strctIdx); // 구조지수(하단)
$('#usgIdx_nm').val(rowData.usgIdxCdNm); // 용도지수(상단)
$('#usgIdx').val(rowData.usgIdx); // 용도지수(하단)
$('#pstnIdx_nm').val(rowData.oalp).trigger('focus'); // 위치지수(상단)
$('#pstnIdx').val(rowData.pstnIdx); // 위치지수(하단)
$('#elpsYrRdvlrt_yr').val(rowData.elpsYrRdvlrtYr+' 년'); // 경과년수별잔가율(상단)
$('#elpsYrRdvlrt').val(rowData.elpsYrRdvlrt); // 경과년수별잔가율(하단)
$('#bscsCstrnSeCd').trigger('change'); // 기초공사구분 변경 이벤트 트리거
};
this.instance.on('focusChange', function(ev) {
if (ev.rowKey !== undefined && ev.rowKey !== null) {
var rowData = self.instance.getRow(ev.rowKey);
handleRowSelection(rowData);
}
});
},
},
@ -447,6 +506,41 @@
e.preventDefault();
self.cancel();
});
$('#bscsCstrnSeCd').on('change', function() { // 기초공사구분 변경 시
var focusedCell = self.grid.instance.getFocusedCell();
if (focusedCell && focusedCell.rowKey !== null) {
var rowData = self.grid.instance.getRow(focusedCell.rowKey);
if (rowData) {
var selectedValue = $(this).val();
var rate = 0;
if (selectedValue === '1') {
rate = rowData.bscsCstrnYBdstCmpttnRt;
} else if (selectedValue === '2') {
rate = rowData.bscsCstrnNBdstCmpttnRt;
} else if (selectedValue === '3') {
rate = rowData.dupEtbldgBdstCmpttnRt;
} else {
rate = "";
}
$('#bscsCstrnRt').val(rate).trigger('focus'); // 기초공사율 설정
// 자동계산 함수 호출
calculateAuto();
}
}
});
// 산정률2 선택 시 산정률2 input에 값 설정
$('#cmpttnRt2Cd').on('change', function() {
var selectedOption = $(this).find('option:selected');
var rateValue = selectedOption.attr('rateValueAttribute');
$('#actCmpttnRt').val(rateValue || '').trigger('focus');
});
// 계산에 사용되는 입력 필드 변경 시 자동 계산 호출
var calculationInputs = '#bldgNewPrcCrtrAmt, #strctIdx, #usgIdx, #pstnIdx, #elpsYrRdvlrt';
$(document).on('change', calculationInputs, calculateAuto);
},
/**
@ -530,42 +624,6 @@
};
},
/**
* 그리드에서 선택된 이행 대상자 정보 수집
* 중요한 로직 주석: 체크박스가 선택된 행의 데이터를 수집하여 이행 대상자 정보 배열을 생성합니다.
*/
collectSelectedTrprInfo: function() {
var selectedTrprInfoList = [];
var checkedRowKeys = this.grid.instance.getCheckedRowKeys();
if (checkedRowKeys && checkedRowKeys.length > 0) {
for (var i = 0; i < checkedRowKeys.length; i++) {
var rowKey = checkedRowKeys[i];
var rowData = this.grid.instance.getRow(rowKey);
if (rowData) {
// 이행 대상자 정보 객체 생성
var trprInfo = {
ownrActrInfoId: rowData.ownrActrInfoId,
impltTrprSeCd: rowData.impltTrprSeCd || '1', // 1:소유자, 2:행위자 (기본값: 소유자)
impltTrprFlnm: rowData.impltTrprFlnm,
impltTrprZip: rowData.impltTrprZip,
impltTrprAddr: rowData.impltTrprAddr,
impltTrprDaddr: rowData.impltTrprDaddr,
actNo: rowData.actNo,
actTypeCd: rowData.actTypeCd,
lotnoMno: rowData.lotnoMno,
lotnoSno: rowData.lotnoSno
};
selectedTrprInfoList.push(trprInfo);
}
}
}
return selectedTrprInfoList;
},
/**
* 폼 유효성 검증
*/
@ -593,6 +651,68 @@
};
/**
* 자동 계산 (서버 API 호출)
* @description 각 항목의 값을 서버로 보내 건축물과세시가를 계산하고, 그 결과를 받아 시가표준액을 계산합니다.
* - 건축물과세시가 = 서버 API를 통해 계산
* - 시가표준액 = 건축물과세시가에서 1,000원 미만 절사
*/
function calculateAuto() {
var bldgNewPrcCrtrAmt = $('#bldgNewPrcCrtrAmt').inputmask('unmaskedvalue') || '0'; // 건물기준시가액
var strctIdx = $('#strctIdx').inputmask('unmaskedvalue') || '0'; // 구조지수
var usgIdx = $('#usgIdx').inputmask('unmaskedvalue') || '0'; // 용도지수
var pstnIdx = $('#pstnIdx').inputmask('unmaskedvalue') || '0'; // 위치지수
var elpsYrRdvlrt = $('#elpsYrRdvlrt').inputmask('unmaskedvalue') || '0'; // 경과년수별잔가율
var bscsCstrnRt = $('#bscsCstrnRt').inputmask('unmaskedvalue') || '0'; // 기초공사율
// 기초공사율이 선택되지 않았으면 계산을 수행하지 않고 필드를 초기화합니다.
if (!bscsCstrnRt || parseFloat(bscsCstrnRt) === 0) {
$('#taxableMarketPrice').val('').trigger('focus'); // 건축물과세시가
$('#standardMarketPrice').val('').trigger('focus'); // 시가표준액
$('#standardMarketPrice_top').val('').trigger('focus'); // 시가표준액(상단)
return;
}
var params = {
bldgNewPrcCrtrAmt: bldgNewPrcCrtrAmt,
strctIdx: strctIdx,
usgIdx: usgIdx,
pstnIdx: pstnIdx,
elpsYrRdvlrt: elpsYrRdvlrt,
bscsCstrnRt: bscsCstrnRt
};
$.ajax({
url: '<c:url value="/crdn/crndRegistAndView/crdnLevyPrvntc/calculateTaxableMarketPrice.ajax"/>',
type: 'POST',
data: params,
success: function(response) {
if (response && response.data && response.success) {
var taxableMarketPrice = parseFloat(response.data.taxableMarketPrice) || 0;
// 시가표준액 계산: 1,000원 미만 절사
var standardMarketPrice = Math.floor(taxableMarketPrice / 1000) * 1000;
// 계산된 값을 input 필드에 설정
$('#taxableMarketPrice').val(taxableMarketPrice).trigger('focus'); // 건축물과세시가
$('#standardMarketPrice').val(standardMarketPrice).trigger('focus'); // 시가표준액
$('#standardMarketPrice_top').val(standardMarketPrice).trigger('focus'); // 시가표준액(상단)
} else {
alert(response.message || '계산 중 오류가 발생했습니다.');
$('#taxableMarketPrice').val('').trigger('focus'); // 건축물과세시가
$('#standardMarketPrice').val('').trigger('focus'); // 시가표준액
$('#standardMarketPrice_top').val('').trigger('focus'); // 시가표준액(상단)
}
},
error: function() {
alert('서버와 통신 중 오류가 발생했습니다.');
$('#taxableMarketPrice').val('').trigger('focus'); // 건축물과세시가
$('#standardMarketPrice').val('').trigger('focus'); // 시가표준액
$('#standardMarketPrice_top').val('').trigger('focus'); // 시가표준액(상단)
}
});
}
/**
* 행정처분 간격일 자동 계산 함수
* 중요한 로직 주석: 시작일과 종료일 입력시 자동으로 간격일을 계산한다.
@ -618,8 +738,11 @@
// 초기화 실행
$(document).ready(function() {
ImpltTask Popup.init();
LevyPrvntc Popup.init();
});
// 전역 네임스페이스에 모듈 노출
window.LevyPrvntcPopup = LevyPrvntcPopup;
})(window, jQuery);
</script>