|
|
|
|
@ -187,7 +187,7 @@
|
|
|
|
|
<th class="op-cell b-right-0 b-bottom-0"></th>
|
|
|
|
|
<th class="b-right-0 b-bottom-0">경과년수<br/>별잔가율</th>
|
|
|
|
|
<th class="op-cell b-right-0 b-bottom-0"></th>
|
|
|
|
|
<th class="b-right-0 b-bottom-0">기초공시율</th>
|
|
|
|
|
<th class="b-right-0 b-bottom-0">기초공사율</th>
|
|
|
|
|
<th class="op-cell b-right-0 b-bottom-0"></th>
|
|
|
|
|
<th class="b-right-0 b-bottom-0">건축물<br/>과세시가</th>
|
|
|
|
|
<th class="b-bottom-0">시가표준액<br/>(1,000원미만절삭)</th>
|
|
|
|
|
@ -213,7 +213,7 @@
|
|
|
|
|
<c:forEach var="code" items="${bscsCstrnSeCdList}">
|
|
|
|
|
<option value="${code.cdId}">${code.cdNm}</option>
|
|
|
|
|
</c:forEach>
|
|
|
|
|
</select><!-- 기초공시율 -->
|
|
|
|
|
</select><!-- 기초공사율 -->
|
|
|
|
|
</td>
|
|
|
|
|
<td rowspan="2" class="op-cell b-right-0">=</td>
|
|
|
|
|
<td rowspan="2" class="b-right-0 b-bottom-0"><input type="text" class="input numericMask" id="taxableMarketPrice" readonly/><!-- 건축물과세시가 --></td>
|
|
|
|
|
@ -1168,47 +1168,166 @@
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 폼 유효성 검증
|
|
|
|
|
* 중요로직: 필수 입력 필드 및 데이터 유효성을 검증하여 저장 가능 여부를 판단합니다.
|
|
|
|
|
* @returns {boolean} 유효성 검증 결과
|
|
|
|
|
* 공통 필드 유효성 검증 함수
|
|
|
|
|
* 중요로직: 필드별 검증 규칙을 통합 관리하여 중복 코드를 제거합니다.
|
|
|
|
|
* @param {string} validationType - 검증 타입 ('save' 또는 'calculation')
|
|
|
|
|
* @returns {Object} 검증 결과 객체 { isValid: boolean, message: string, focusElement: string }
|
|
|
|
|
*/
|
|
|
|
|
validateForm: function() {
|
|
|
|
|
// 필수 필드 검증
|
|
|
|
|
if (!$('#actInfoId').val()) {
|
|
|
|
|
alert('행위정보를 선택해주세요.');
|
|
|
|
|
return false;
|
|
|
|
|
validateCommon: function(validationType) {
|
|
|
|
|
// 1. 행위정보 선택 검증 (저장 시에만)
|
|
|
|
|
if (validationType === 'save' && !$('#actInfoId').val()) {
|
|
|
|
|
return {
|
|
|
|
|
isValid: false,
|
|
|
|
|
message: '행위정보를 선택해주세요.',
|
|
|
|
|
focusElement: null
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!$('#bscsCstrnSeCd').val()) {
|
|
|
|
|
$('#bscsCstrnSeCd').focus();
|
|
|
|
|
alert('기초공사구분을 선택해주세요.');
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
// 2. 기초공사구분 검증 (저장 시에만)
|
|
|
|
|
if (validationType === 'save' && !$('#bscsCstrnSeCd').val()) {
|
|
|
|
|
return {
|
|
|
|
|
isValid: false,
|
|
|
|
|
message: '기초공사율을 선택해주세요.',
|
|
|
|
|
focusElement: '#bscsCstrnSeCd'
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 산정률2 유효성 검증
|
|
|
|
|
if (!$('#cmpttnRt2Cd').val()) {
|
|
|
|
|
alert('산정률2를 선택해주세요.');
|
|
|
|
|
$('#cmpttnRt2Cd').focus();
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
// 3. 건물기준시가액 검증 (계산 시에만)
|
|
|
|
|
if (validationType === 'calculation') {
|
|
|
|
|
var bldgNewPrcCrtrAmt = $('#bldgNewPrcCrtrAmt').inputmask('unmaskedvalue') || '0';
|
|
|
|
|
if (!bldgNewPrcCrtrAmt || parseFloat(bldgNewPrcCrtrAmt) <= 0) {
|
|
|
|
|
return {
|
|
|
|
|
isValid: false,
|
|
|
|
|
message: '건물기준시가액을 입력해주세요.',
|
|
|
|
|
focusElement: '#bldgNewPrcCrtrAmt'
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var vltnArea = parseFloat($('#vltnArea').inputmask('unmaskedvalue')) || 0;
|
|
|
|
|
if (vltnArea <= 0) {
|
|
|
|
|
alert('위반면적을 입력해주세요.');
|
|
|
|
|
$('#vltnArea').focus();
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
// 4. 구조지수 검증 (계산 시에만)
|
|
|
|
|
if (validationType === 'calculation') {
|
|
|
|
|
var strctIdx = $('#strctIdx').inputmask('unmaskedvalue') || '0';
|
|
|
|
|
if (!strctIdx || parseFloat(strctIdx) <= 0) {
|
|
|
|
|
return {
|
|
|
|
|
isValid: false,
|
|
|
|
|
message: '구조지수를 입력해주세요.',
|
|
|
|
|
focusElement: '#strctIdx'
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 5. 용도지수 검증 (계산 시에만)
|
|
|
|
|
if (validationType === 'calculation') {
|
|
|
|
|
var usgIdx = $('#usgIdx').inputmask('unmaskedvalue') || '0';
|
|
|
|
|
if (!usgIdx || parseFloat(usgIdx) <= 0) {
|
|
|
|
|
return {
|
|
|
|
|
isValid: false,
|
|
|
|
|
message: '용도지수를 입력해주세요.',
|
|
|
|
|
focusElement: '#usgIdx'
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 6. 위치지수 검증 (계산 시에만)
|
|
|
|
|
if (validationType === 'calculation') {
|
|
|
|
|
var pstnIdx = $('#pstnIdx').inputmask('unmaskedvalue') || '0';
|
|
|
|
|
if (!pstnIdx || parseFloat(pstnIdx) <= 0) {
|
|
|
|
|
return {
|
|
|
|
|
isValid: false,
|
|
|
|
|
message: '위치지수를 입력해주세요.',
|
|
|
|
|
focusElement: '#pstnIdx'
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 7. 경과년수별잔가율 검증 (계산 시에만)
|
|
|
|
|
if (validationType === 'calculation') {
|
|
|
|
|
var elpsYrRdvlrt = $('#elpsYrRdvlrt').inputmask('unmaskedvalue') || '0';
|
|
|
|
|
if (!elpsYrRdvlrt || parseFloat(elpsYrRdvlrt) <= 0) {
|
|
|
|
|
return {
|
|
|
|
|
isValid: false,
|
|
|
|
|
message: '경과년수별잔가율을 입력해주세요.',
|
|
|
|
|
focusElement: '#elpsYrRdvlrt'
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 8. 기초공사율 검증 (계산 시에만)
|
|
|
|
|
if (validationType === 'calculation') {
|
|
|
|
|
var bscsCstrnRt = $('#bscsCstrnRt').inputmask('unmaskedvalue') || '0';
|
|
|
|
|
if (!bscsCstrnRt || parseFloat(bscsCstrnRt) <= 0) {
|
|
|
|
|
return {
|
|
|
|
|
isValid: false,
|
|
|
|
|
message: '기초공사율을 선택해주세요.',
|
|
|
|
|
focusElement: '#bscsCstrnSeCd'
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 9. 위반면적 검증 (공통)
|
|
|
|
|
var vltnArea = $('#vltnArea').inputmask('unmaskedvalue') || '0';
|
|
|
|
|
if (!vltnArea || parseFloat(vltnArea) <= 0) {
|
|
|
|
|
return {
|
|
|
|
|
isValid: false,
|
|
|
|
|
message: '위반면적을 입력해주세요.',
|
|
|
|
|
focusElement: '#vltnArea'
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 10. 산정률 검증 (공통 - 계산 시 또는 저장 시 체크)
|
|
|
|
|
var cmpttnRtRate = $('#cmpttnRtRate').val();
|
|
|
|
|
if (!cmpttnRtRate || parseFloat(cmpttnRtRate) <= 0) {
|
|
|
|
|
return {
|
|
|
|
|
isValid: false,
|
|
|
|
|
message: '산정률을 선택해주세요.',
|
|
|
|
|
focusElement: '#cmpttnRtCd'
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 11. 산정률2 검증 (공통)
|
|
|
|
|
var cmpttnRt2Rate = $('#cmpttnRt2Rate').val();
|
|
|
|
|
if (!cmpttnRt2Rate || parseFloat(cmpttnRt2Rate) <= 0) {
|
|
|
|
|
return {
|
|
|
|
|
isValid: false,
|
|
|
|
|
message: '산정률2를 선택해주세요.',
|
|
|
|
|
focusElement: '#cmpttnRt2Cd'
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 12. 계산 완료 여부 검증 (저장 시에만)
|
|
|
|
|
if (validationType === 'save') {
|
|
|
|
|
var taxableMarketPrice = $("#taxableMarketPrice").val(); // 건축물과세시가
|
|
|
|
|
var standardMarketPrice = $("#standardMarketPrice").val(); // 시가표준액
|
|
|
|
|
var standardMarketPrice_bottom = $("#standardMarketPrice_bottom").val(); // 시가표준액(하단)
|
|
|
|
|
var cmpttnAmt = $("#cmpttnAmt").val(); // 산정액
|
|
|
|
|
var levyWholAmt = $("#levyWholAmt").val(); // 부과총액
|
|
|
|
|
|
|
|
|
|
if (!(taxableMarketPrice && standardMarketPrice && standardMarketPrice_bottom && cmpttnAmt && levyWholAmt)) {
|
|
|
|
|
return {
|
|
|
|
|
isValid: false,
|
|
|
|
|
message: '[계산하기] 버튼을 클릭 하여 계산을 완료하시기 바랍니다.',
|
|
|
|
|
focusElement: null
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var taxableMarketPrice = $("#taxableMarketPrice").val();
|
|
|
|
|
var standardMarketPrice = $("#standardMarketPrice").val();
|
|
|
|
|
var standardMarketPrice_bottom = $("#standardMarketPrice_bottom").val();
|
|
|
|
|
var cmpttnAmt = $("#cmpttnAmt").val();
|
|
|
|
|
var levyWholAmt = $("#levyWholAmt").val();
|
|
|
|
|
if( !(taxableMarketPrice && standardMarketPrice && standardMarketPrice_bottom && cmpttnAmt && levyWholAmt) ){
|
|
|
|
|
alert('[계산하기] 버튼을 클릭 하여 계산을 완료하시기 바랍니다.');
|
|
|
|
|
return { isValid: true }; // 모든 검증 통과
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 폼 유효성 검증 (저장용)
|
|
|
|
|
* 중요로직: 저장 시 필요한 모든 필드를 검증합니다.
|
|
|
|
|
* @returns {boolean} 유효성 검증 결과
|
|
|
|
|
*/
|
|
|
|
|
validateForm: function() {
|
|
|
|
|
var result = this.validateCommon('save'); // 공통 검증 함수 호출
|
|
|
|
|
if (!result.isValid) {
|
|
|
|
|
alert(result.message); // 오류 메시지 표시
|
|
|
|
|
if (result.focusElement) {
|
|
|
|
|
$(result.focusElement).focus(); // 문제 필드로 포커스 이동
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
@ -1425,96 +1544,12 @@
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 통합 계산 필수값 검증 함수
|
|
|
|
|
* 중요로직: 건축물과세시가 계산부터 부과총액까지 전체 계산에 필요한 모든 필수값을 검증합니다.
|
|
|
|
|
* 통합 계산 필수값 검증 함수 (계산용)
|
|
|
|
|
* 중요로직: 계산 시 필요한 모든 필드를 검증합니다.
|
|
|
|
|
* @returns {Object} 검증 결과 객체 { isValid: boolean, message: string, focusElement: string }
|
|
|
|
|
*/
|
|
|
|
|
validateCalculationInputs: function() {
|
|
|
|
|
// 1. 건축물과세시가 계산에 필요한 값들 검증
|
|
|
|
|
var bldgNewPrcCrtrAmt = $('#bldgNewPrcCrtrAmt').inputmask('unmaskedvalue') || '0'; // 건물기준시가액
|
|
|
|
|
if (!bldgNewPrcCrtrAmt || parseFloat(bldgNewPrcCrtrAmt) <= 0) {
|
|
|
|
|
return {
|
|
|
|
|
isValid: false,
|
|
|
|
|
message: '건물기준시가액을 입력해주세요.',
|
|
|
|
|
focusElement: '#bldgNewPrcCrtrAmt'
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var strctIdx = $('#strctIdx').inputmask('unmaskedvalue') || '0'; // 구조지수
|
|
|
|
|
if (!strctIdx || parseFloat(strctIdx) <= 0) {
|
|
|
|
|
return {
|
|
|
|
|
isValid: false,
|
|
|
|
|
message: '구조지수를 입력해주세요.',
|
|
|
|
|
focusElement: '#strctIdx'
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var usgIdx = $('#usgIdx').inputmask('unmaskedvalue') || '0'; // 용도지수
|
|
|
|
|
if (!usgIdx || parseFloat(usgIdx) <= 0) {
|
|
|
|
|
return {
|
|
|
|
|
isValid: false,
|
|
|
|
|
message: '용도지수를 입력해주세요.',
|
|
|
|
|
focusElement: '#usgIdx'
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var pstnIdx = $('#pstnIdx').inputmask('unmaskedvalue') || '0'; // 위치지수
|
|
|
|
|
if (!pstnIdx || parseFloat(pstnIdx) <= 0) {
|
|
|
|
|
return {
|
|
|
|
|
isValid: false,
|
|
|
|
|
message: '위치지수를 입력해주세요.',
|
|
|
|
|
focusElement: '#pstnIdx'
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var elpsYrRdvlrt = $('#elpsYrRdvlrt').inputmask('unmaskedvalue') || '0'; // 경과년수별잔가율
|
|
|
|
|
if (!elpsYrRdvlrt || parseFloat(elpsYrRdvlrt) <= 0) {
|
|
|
|
|
return {
|
|
|
|
|
isValid: false,
|
|
|
|
|
message: '경과년수별잔가율을 입력해주세요.',
|
|
|
|
|
focusElement: '#elpsYrRdvlrt'
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var bscsCstrnRt = $('#bscsCstrnRt').inputmask('unmaskedvalue') || '0'; // 기초공사율
|
|
|
|
|
if (!bscsCstrnRt || parseFloat(bscsCstrnRt) <= 0) {
|
|
|
|
|
return {
|
|
|
|
|
isValid: false,
|
|
|
|
|
message: '기초공사율을 선택해주세요.',
|
|
|
|
|
focusElement: '#bscsCstrnSeCd'
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 2. 위반면적 검증
|
|
|
|
|
var vltnArea = $('#vltnArea').inputmask('unmaskedvalue') || '0'; // 위반면적
|
|
|
|
|
if (!vltnArea || parseFloat(vltnArea) <= 0) {
|
|
|
|
|
return {
|
|
|
|
|
isValid: false,
|
|
|
|
|
message: '위반면적을 입력해주세요.',
|
|
|
|
|
focusElement: '#vltnArea'
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 3. 산정률 검증
|
|
|
|
|
var cmpttnRtRate = $('#cmpttnRtRate').val(); // 산정률 비율값
|
|
|
|
|
if (!cmpttnRtRate || parseFloat(cmpttnRtRate) <= 0) {
|
|
|
|
|
return {
|
|
|
|
|
isValid: false,
|
|
|
|
|
message: '산정률을 선택해주세요.',
|
|
|
|
|
focusElement: '#cmpttnRtCd'
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 4. 산정률2 검증
|
|
|
|
|
var cmpttnRt2Rate = $('#cmpttnRt2Rate').val(); // 산정률2 비율값
|
|
|
|
|
if (!cmpttnRt2Rate || parseFloat(cmpttnRt2Rate) <= 0) {
|
|
|
|
|
return {
|
|
|
|
|
isValid: false,
|
|
|
|
|
message: '산정률2를 선택해주세요.',
|
|
|
|
|
focusElement: '#cmpttnRt2Cd'
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return { isValid: true }; // 모든 검증 통과
|
|
|
|
|
return this.validateCommon('calculation'); // 공통 검증 함수 호출
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|