@ -16,7 +16,7 @@
■ 4단계 계산 프로세스 (서버에서 순차 처리)
1. 건축물과세시가(bdstTxtnMprc) 계산 - 이부분은 율 이라고 표현되지만 0.85, 1 등 이미지 % 100 처리 된 값으로 표현됨
1. 건축물과세시가(bdstTxtnMprc) 계산 - [경과년수별잔가율, 기초공사율 : 율 이라고 표현되지만 0.85, 1 등, %가 아닌 나누기 100 처리 된 값으로 표현됨]
- 공식: bldgNewPrcCrtrAmt × strctIdx × usgIdx × pstnIdx × (elpsYrRdvlrt) × (bscsCstrnRt)
- 설명: 건물기준시가액 × 구조지수 × 용도지수 × 위치지수 × 경과년수별잔가율 × 기초공사율
- 반올림: setScale(0, RoundingMode.HALF_UP) - 소수점 반올림
@ -79,6 +79,130 @@
│ - 모든 행위정보 완료 시 자동 합산 │
└─────────────────────────────────────────────────────────────────────────────┘
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■ 데이터베이스 테이블 및 컬럼 상세 정보 (쿼리 조회 기준)
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■ 1. 건물기준시가액 (bldgNewPrcCrtrAmt)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• 조회 테이블: tb_bldg_new_prc_crtr_amt (건물신축가격기준액)
• 매칭 조건:
- YR = t1.CRDN_YR (단속연도)
- NO = SUBSTRING(용도지수코드,1,1) (용도지수 첫자리 번호)
• 주요 컬럼:
- BLDG_NEW_PRC_CRTR_AMT: 건물신축가격기준액 (DECIMAL(13))
- BDST_USG: 건축물용도 (VARCHAR(60))
• 저장위치: tb_levy_info.BLDG_CRTR_MPRC_AMT / BLDG_NEW_PRC_CRTR_AMT_NO
■ 2. 구조지수 (strctIdx)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• 조회 테이블: tb_strct_idx (구조지수)
• 주요 컬럼:
- STRCT_IDX_CD: 구조지수코드 (VARCHAR(3)) [PK]
- STRCT_IDX: 구조지수값 (DECIMAL(10,2))
- STRCT_NM: 구조명 (VARCHAR(100))
- RDVLRT_CN_YR_CNT: 잔가율내용연도수 (DECIMAL(2))
- LAST_YR_RDVLRT: 최종연도잔가율 (DECIMAL(4,2))
- DPRT: 감가상각률 (DECIMAL(4,4))
• 추가 계산용 컬럼:
- BSCS_CSTRN_Y_BDST_CMPTTN_RT: 기초공사Y건축물산정비율
- BSCS_CSTRN_N_BDST_CMPTTN_RT: 기초공사N건축물산정비율
- DUP_ETBLDG_BDST_CMPTTN_RT: 복측증축건축물산정비율
• 저장위치: tb_levy_info.STRCT_IDX_CD / STRCT_IDX
■ 3. 용도지수 (usgIdx)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• 조회 테이블: tb_usg_idx (용도지수)
• 주요 컬럼:
- USG_IDX_CD: 용도지수코드 (VARCHAR(5)) [PK]
- USG_IDX: 용도지수값 (DECIMAL(10,2))
- USG_NM: 용도명 (VARCHAR(300))
- MAIN_USG_NM: 주요용도명 (VARCHAR(100))
- LWR_USG_NM: 하위용도명 (VARCHAR(100))
• 저장위치: tb_levy_info.USG_IDX_CD / USG_IDX
■ 4. 위치지수 (pstnIdx)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• 조회 테이블: tb_pstn_idx (위치지수)
• 매칭 조건: 공시지가(OALP) BETWEEN 시작가격 AND 종료가격 (범위 매칭)
• 주요 컬럼:
- PSTN_IDX_NO: 위치지수번호 (VARCHAR(2)) [PK]
- PSTN_IDX: 위치지수값 (DECIMAL(10,2))
- BLDG_ANX_LAND_BGNG_PRC: 건물부속토지시작가격 (DECIMAL)
- BLDG_ANX_LAND_END_PRC: 건물부속토지종료가격 (DECIMAL)
• 저장위치: tb_levy_info.PSTN_IDX_NO / PSTN_IDX
■ 5. 경과년수별잔가율 (elpsYrRdvlrt)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• 계산 방식: 동적 계산 (구조지수의 감가상각 정보 활용)
• 관련 테이블:
- tb_strct_idx: 감가상각률(DPRT), 잔가율내용연도수(RDVLRT_CN_YR_CNT), 최종연도잔가율(LAST_YR_RDVLRT)
- tb_act_info: 행위시작일자(ACT_BGNG_YMD)
- tb_crdn: 단속연도(CRDN_YR)
• 계산 공식:
- 경과년수 = CAST(단속연도 as SIGNED) - CAST(SUBSTRING(행위시작일자,1,4) as SIGNED)
- IF 경과년수 >= 잔가율내용연도수 THEN 최종연도잔가율
- ELSE 1 - (경과년수 × 감가상각률)
• 저장위치: tb_levy_info.ELPS_YR_RDVLRT
■ 6. 기초공사율 (bscsCstrnRt)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• 계산 방식: 구조지수 테이블의 기초공사 관련 비율 조회
• 관련 테이블: tb_strct_idx
• 계산용 컬럼:
- BSCS_CSTRN_Y_BDST_CMPTTN_RT: 기초공사 있음(Y) 건축물산정비율
- BSCS_CSTRN_N_BDST_CMPTTN_RT: 기초공사 없음(N) 건축물산정비율
- DUP_ETBLDG_BDST_CMPTTN_RT: 복측증축 건축물산정비율
• 선택 방식: 기초공사구분코드(bscsCstrnSeCd)에 따라 해당 비율 적용
• 저장위치: tb_levy_info.BSCS_CSTRN_SE_CD / BSCS_CSTRN_RT
■ 7. 가감산시행령률 (adsbmtnEnfcRt)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• 기본값: 100 (고정값)
• 관련 테이블: tb_adsbmtn_rt (가감산율)
• 주요 컬럼:
- ADSBMTN_RT_CD: 가감산율코드
- ADSBMTN_RT_SE_CD: 가감산율구분코드 ('1':가산, '2':감산)
- ADSBMTN_RT: 가감산율
• 계산 방식: (100 + 가산율 - 감산율) 형태로 적용
• 저장위치: tb_levy_info.ADSBMTN_ENFC_RT
■ 8. 산정률 (cmpttnRt)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• 조회 테이블: tb_act_type (행위유형)
• 매칭 조건: ACT_TYPE_CD = 행위정보.행위유형코드
• 주요 컬럼:
- ACT_TYPE_CD: 행위유형코드 (VARCHAR(3)) [PK]
- CMPTTN_RT: 산정률 (DECIMAL(3))
- VLTN_BDST: 위반건축물 (VARCHAR(100))
• 저장위치: tb_levy_info.CMPTTN_RT_CD / CMPTTN_RT
■ 9. 산정률2 (cmpttnRt2)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• 조회 테이블: tb_cmpttn_rt_2 (산정률2)
• 조회 조건: USE_YN = 'Y' (사용중인 항목만)
• 주요 컬럼:
- CMPTTN_RT_2_CD: 산정률2코드
- CMPTTN_RT_2: 산정률2값 (DECIMAL(3))
- VLTN_MTTR: 위반사항
- USE_YN: 사용여부
• 저장위치: tb_levy_info.CMPTTN_RT_2_CD / CMPTTN_RT_2
■ 10. 추가 관련 테이블
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
• tb_levy_info: 모든 계산 결과의 최종 저장소 (스냅샷 방식)
• tb_act_info: 행위정보 (행위시작일자, 행위유형코드, 위반면적 등)
• tb_pstn_info: 위치정보 (공시지가 OALP)
• tb_crdn: 단속정보 (단속연도, 단속번호)
■ 계산 흐름 요약
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. 기준 데이터 조회: 단속연도, 용도지수, 공시지가 기준으로 각종 마스터 테이블 JOIN
2. 동적 계산: 경과년수별잔가율만 단속연도와 행위시작연도 차이로 실시간 계산
3. 스냅샷 저장: 계산된 모든 값을 tb_levy_info에 저장하여 데이터 변경에 무관하게 복원 가능
4. 이행강제금: 모든 행위정보별 부과총액 합계로 최종 산출
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
-->
@ -187,7 +311,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 +337,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>
@ -718,23 +842,8 @@
LevyPrvntcPopup.levyInfoIdSelect = existingData.levyInfoId;
// 위반면적 설정
$('#vltnArea').val(existingData.vltnArea || '').trigger('focus');
// 산정률1 설정 (행위유형)
$('#cmpttnRtDisplay').val((existingData.cmpttnRt || '') + ' %'); // 산정률 표시 필드 (퍼센트 포함)
$('#cmpttnRtCd').val(existingData.cmpttnRtCd || ''); // 산정률 코드 설정
$('#cmpttnRt').val(existingData.cmpttnRt || ''); // 산정률 값 설정
$('#cmpttnRtRate').val(existingData.cmpttnRtRate || ''); // 계산용 비율값
// 기초공사구분 및 비율
$('#bscsCstrnSeCd').val(existingData.bscsCstrnSeCd || ''); // 기초공사구분 코드 설정
$('#bscsCstrnRt').val(existingData.bscsCstrnRt || ''); // 기초공사율 값 설정
// 건물기준시가액
$('#bldgNewPrcCrtrAmtNo').val(existingData.bldgNewPrcCrtrAmtNo || ''); // 건물기준시가액 번호 설정
$('#bldgNewPrcCrtrAmtDisplay').val(existingData.bldgNewPrcCrtrAmtDisplay || ''); // 건축물용도명
$('#bldgNewPrcCrtrAmt').val(existingData.bldgCrtrMprcAmt || '').trigger('focus'); // 건물기준시가액 값 설정
// 건축물과세시가
$('#taxableMarketPrice').val(existingData.bdstTxtnMprc || '').trigger('focus');
// 구조지수
$('#strctIdxCd').val(existingData.strctIdxCd || ''); // 구조지수 코드 설정
@ -755,11 +864,31 @@
$('#elpsYrRdvlrt_yr').val((existingData.elpsYrRdvlrtYr || '') + ' 년'); // 행위시작년도
$('#elpsYrRdvlrt').val(existingData.elpsYrRdvlrt || ''); // 경과년수별잔가율 값 설정
// 산정률2
$('#cmpttnRt2Cd').val(existingData.cmpttnRt2Cd || ''); // 산정률2 코드 설정
$('#cmpttnRt2').val(existingData.cmpttnRt2 || ''); // 산정률2 값 설정
$('#cmpttnRt2Display').val((existingData.cmpttnRt2 || '') + ' %'); // 산정률2 표시 필드 (퍼센트 포함)
$('#cmpttnRt2Rate').val(existingData.cmpttnRt2Rate || ''); // 계산용 비율값
// 기초공사구분 및 비율
$('#bscsCstrnSeCd').val(existingData.bscsCstrnSeCd || ''); // 기초공사구분 코드 설정
$('#bscsCstrnRt').val(existingData.bscsCstrnRt || ''); // 기초공사율 값 설정
// 기초공사율 계산을 위한 기준 비율들 저장 (hidden으로)
if (!$('#bscsCstrnYBdstCmpttnRt').length) {
$('<input type="hidden" id="bscsCstrnYBdstCmpttnRt">').appendTo('body');
$('<input type="hidden" id="bscsCstrnNBdstCmpttnRt">').appendTo('body');
$('<input type="hidden" id="dupEtbldgBdstCmpttnRt">').appendTo('body');
}
$('#bscsCstrnYBdstCmpttnRt').val(existingData.bscsCstrnYBdstCmpttnRt || '');
$('#bscsCstrnNBdstCmpttnRt').val(existingData.bscsCstrnNBdstCmpttnRt || '');
$('#dupEtbldgBdstCmpttnRt').val(existingData.dupEtbldgBdstCmpttnRt || '');
// 건물기준시가액
$('#bldgNewPrcCrtrAmtNo').val(existingData.bldgNewPrcCrtrAmtNo || ''); // 건물기준시가액 번호 설정
$('#bldgNewPrcCrtrAmtDisplay').val(existingData.bldgNewPrcCrtrAmtDisplay || ''); // 건축물용도명
$('#bldgNewPrcCrtrAmt').val(existingData.bldgCrtrMprcAmt || '').trigger('focus'); // 건물기준시가액 값 설정
// 시가표준액
$('#standardMarketPrice').val(existingData.mprcStdAmt || '').trigger('focus');
$('#standardMarketPrice_bottom').val(existingData.mprcStdAmt || '').trigger('focus');
// 위반면적 설정
$('#vltnArea').val(existingData.vltnArea || '').trigger('focus');
// 가감산 정보
$('#adtnRtCd').val(existingData.adtnRtCd || ''); // 가산율 코드 설정
@ -773,28 +902,6 @@
$('#adsbmtnEnfcRt').val(existingData.adsbmtnEnfcRt || '100'); // 가감산시행령률 값 설정
$('#adsbmtnEnfcRtDisplay').val((existingData.adsbmtnEnfcRt || '100') + ' %'); // 가감산시행령률 표시 필드 (퍼센트 포함)
// 산정액 및 부과총액
$('#cmpttnAmt').val(existingData.cmpttnAmt || '').trigger('focus'); // 산정액 값 설정
$('#levyWholAmt').val(existingData.levyWholAmt || ''); // 부과총액 값 설정
$('#levyWholAmtDisplay').text((existingData.levyWholAmt ? Number(existingData.levyWholAmt).toLocaleString() : '0') + ' 원');
// 시가표준액
$('#standardMarketPrice').val(existingData.mprcStdAmt || '').trigger('focus');
$('#standardMarketPrice_bottom').val(existingData.mprcStdAmt || '').trigger('focus');
// 건축물과세시가
$('#taxableMarketPrice').val(existingData.bdstTxtnMprc || '').trigger('focus');
// 기초공사율 계산을 위한 기준 비율들 저장 (hidden으로)
if (!$('#bscsCstrnYBdstCmpttnRt').length) {
$('<input type="hidden" id="bscsCstrnYBdstCmpttnRt">').appendTo('body');
$('<input type="hidden" id="bscsCstrnNBdstCmpttnRt">').appendTo('body');
$('<input type="hidden" id="dupEtbldgBdstCmpttnRt">').appendTo('body');
}
$('#bscsCstrnYBdstCmpttnRt').val(existingData.bscsCstrnYBdstCmpttnRt || '');
$('#bscsCstrnNBdstCmpttnRt').val(existingData.bscsCstrnNBdstCmpttnRt || '');
$('#dupEtbldgBdstCmpttnRt').val(existingData.dupEtbldgBdstCmpttnRt || '');
// 가감산 버튼 텍스트 업데이트
if (existingData.adtnRt && parseFloat(existingData.adtnRt) > 0) {
$('#btnOpenAddPopup').text('+ 가산 [' + existingData.adtnRt + '%]');
@ -808,6 +915,23 @@
$('#btnOpenMinusPopup').text('- 감산 [0%]');
}
// 산정률1 설정 (행위유형)
$('#cmpttnRtDisplay').val((existingData.cmpttnRt || '') + ' %'); // 산정률 표시 필드 (퍼센트 포함)
$('#cmpttnRtCd').val(existingData.cmpttnRtCd || ''); // 산정률 코드 설정
$('#cmpttnRt').val(existingData.cmpttnRt || ''); // 산정률 값 설정
$('#cmpttnRtRate').val(existingData.cmpttnRtRate || ''); // 계산용 비율값
// 산정률2
$('#cmpttnRt2Cd').val(existingData.cmpttnRt2Cd || ''); // 산정률2 코드 설정
$('#cmpttnRt2').val(existingData.cmpttnRt2 || ''); // 산정률2 값 설정
$('#cmpttnRt2Display').val((existingData.cmpttnRt2 || '') + ' %'); // 산정률2 표시 필드 (퍼센트 포함)
$('#cmpttnRt2Rate').val(existingData.cmpttnRt2Rate || ''); // 계산용 비율값
// 산정액 및 부과총액
$('#cmpttnAmt').val(existingData.cmpttnAmt || '').trigger('focus'); // 산정액 값 설정
$('#levyWholAmt').val(existingData.levyWholAmt || ''); // 부과총액 값 설정
$('#levyWholAmtDisplay').text((existingData.levyWholAmt ? Number(existingData.levyWholAmt).toLocaleString() : '0') + ' 원');
// 기존 데이터 로딩 시 계산하기 버튼 숨김 (이미 계산된 결과가 있으므로)
LevyPrvntcPopup.hideCalculateButton(); // 기존 부과정보 로드 시 계산하기 버튼 숨김
@ -822,26 +946,6 @@
*/
var setActInfoToForm = function(rowData) {
var vltnArea = rowData.calcArea; // 면적 - 조치면적 : 위반면적
$('#vltnArea').val(vltnArea).trigger('focus').trigger('change'); // 위반면적, change 이벤트 트리거
// 행위유형에 따른 산정률1 설정
$('#cmpttnRtDisplay').val(rowData.actCmpttnRt+ ' %'); // 산정률 표시 필드 (퍼센트 포함)
$('#cmpttnRtCd').val(rowData.actTypeCd); // 산정률 코드 설정
$('#cmpttnRt').val(rowData.actCmpttnRt); // 산정률 값 설정
$('#cmpttnRtRate').val(rowData.actCmpttnRtRate); // 산정률 계산용 비율값 설정
$('#bscsCstrnRt').val(''); // 기초공사율
$('#bscsCstrnSeCd').val(''); // 기초공사구분
// 기초공사율 계산을 위한 기준 비율들 초기화 (hidden으로)
if (!$('#bscsCstrnYBdstCmpttnRt').length) {
$('<input type="hidden" id="bscsCstrnYBdstCmpttnRt">').appendTo('body');
$('<input type="hidden" id="bscsCstrnNBdstCmpttnRt">').appendTo('body');
$('<input type="hidden" id="dupEtbldgBdstCmpttnRt">').appendTo('body');
}
$('#bscsCstrnYBdstCmpttnRt').val('');
$('#bscsCstrnNBdstCmpttnRt').val('');
$('#dupEtbldgBdstCmpttnRt').val('');
$('#bldgNewPrcCrtrAmtNo').val(rowData.bldgNewPrcCrtrAmtNo); // 건물기준시가액(NO)
$('#bldgNewPrcCrtrAmtDisplay').val(rowData.bdstUsg); // 건물기준시가액(건축물 용도)
@ -862,8 +966,30 @@
$('#elpsYrRdvlrt_yr').val(rowData.elpsYrRdvlrtYr+' 년'); // 경과년수별잔가율(상단)
$('#elpsYrRdvlrt').val(rowData.elpsYrRdvlrt); // 경과년수별잔가율(하단)
$('#bscsCstrnRt').val(''); // 기초공사율
$('#bscsCstrnSeCd').val(''); // 기초공사구분
// 기초공사율 계산을 위한 기준 비율들 초기화 (hidden으로)
if (!$('#bscsCstrnYBdstCmpttnRt').length) {
$('<input type="hidden" id="bscsCstrnYBdstCmpttnRt">').appendTo('body');
$('<input type="hidden" id="bscsCstrnNBdstCmpttnRt">').appendTo('body');
$('<input type="hidden" id="dupEtbldgBdstCmpttnRt">').appendTo('body');
}
$('#bscsCstrnYBdstCmpttnRt').val('');
$('#bscsCstrnNBdstCmpttnRt').val('');
$('#dupEtbldgBdstCmpttnRt').val('');
$('#bscsCstrnSeCd').trigger('change'); // 기초공사구분 변경 이벤트 트리거
$('#vltnArea').val(vltnArea).trigger('focus').trigger('change'); // 위반면적, change 이벤트 트리거
// 행위유형에 따른 산정률1 설정
$('#cmpttnRtDisplay').val(rowData.actCmpttnRt+ ' %'); // 산정률 표시 필드 (퍼센트 포함)
$('#cmpttnRtCd').val(rowData.actTypeCd); // 산정률 코드 설정
$('#cmpttnRt').val(rowData.actCmpttnRt); // 산정률 값 설정
$('#cmpttnRtRate').val(rowData.actCmpttnRtRate); // 산정률 계산용 비율값 설정
$('#cmpttnRt2Cd').val('').trigger('change'); // 산정률2 변경 이벤트 트리거
// 계산하기 버튼 표시 (값이 변경된 경우)
LevyPrvntcPopup.showCalculateButton(); // 신규 행위정보 선택 시 계산하기 버튼 표시
};
@ -1168,47 +1294,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 +1670,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'); // 공통 검증 함수 호출
},
/**