diff --git a/apps/st/src/components/statistics/review/SewerageFinanceRvw.tsx b/apps/st/src/components/statistics/review/SewerageFinanceRvw.tsx
new file mode 100644
index 000000000..436834bb6
--- /dev/null
+++ b/apps/st/src/components/statistics/review/SewerageFinanceRvw.tsx
@@ -0,0 +1,50 @@
+import SearchForm from "@/components/module/SearchForm";
+import TabDataGrid from "@/components/module/TabDataGrid";
+import SaveButton from "@/components/button/SaveButton";
+import ApproveButton from "@/components/button/ApproveButton";
+import ReviewOpinionButton from "@/components/button/ReviewOpinionButton";
+import ReturnButton from "@/components/button/ReturnButton";
+
+import { SewerageFinanceInfoListRvw } from "@/components/util/column/SewerageFinanceColumnRvw";
+
+
+const SewerageFinanceRvw = () => {
+
+ const approveFunc = () => {
+ console.log('approveFunc');
+ // 승인 로직
+ };
+
+ const saveFunc = () => {
+ console.log('submit');
+ // 저장 로직
+ };
+
+ const reviewOpinionFunc = () => {
+ console.log('reviewOpinionFunc');
+ // 검토의견 작성
+ };
+
+ const returnFunc = () => {
+ console.log('returnFunc');
+ // 반려
+ };
+
+
+ return (
+ <>
+
+
+
+
+ >
+ );
+};
+
+
+export default SewerageFinanceRvw;
\ No newline at end of file
diff --git a/apps/st/src/components/util/column/SewerageFinanceColumnRvw.ts b/apps/st/src/components/util/column/SewerageFinanceColumnRvw.ts
new file mode 100644
index 000000000..c0beeae20
--- /dev/null
+++ b/apps/st/src/components/util/column/SewerageFinanceColumnRvw.ts
@@ -0,0 +1,301 @@
+export const SewerageFinanceInfoListRvw= [
+ {
+ tabKey: 'a',
+ tabLabel: '하수도재정 결산',
+ rowStartNum: 3, // 3단 헤더 구조 반영
+ fixedColumns: 1, // 순번, 시도, 시군구, 행정코드, 구분까지 고정
+ columns: [
+ /* 1. 기본 정보 (Band: Left) */
+ { name: 'SIDO', fieldName: 'SIDO', header: { text: '시도' } },
+ { name: 'GUGUN', fieldName: 'GUGUN', header: { text: '시군구' } },
+
+ /* 2. 재정별 사업비 (수입/재원) */
+ { name: 'FNANC_WCT_SM', fieldName: 'FNANC_WCT_SM', header: { text: '계' } },
+ { name: 'NTNXPN', fieldName: 'NTNXPN', header: { text: '중앙정부\n지원액' } },
+ { name: 'LCLEXPNS', fieldName: 'LCLEXPNS', header: { text: '특․광역시, 도' } },
+ { name: 'LCLTY_CT', fieldName: 'LCLTY_CT', header: { text: '시,군,구 지자체' } },
+ { name: 'SEWER_RNTFEE', fieldName: 'SEWER_RNTFEE', header: { text: '하수도\n사용료' } },
+ { name: 'AMNTBRNCSR', fieldName: 'AMNTBRNCSR', header: { text: '원인자\n부담금' } },
+ { name: 'ETC_INCME', fieldName: 'ETC_INCME', header: { text: '기타\n잡수입' } },
+ { name: 'CYFD_AMOUNT', fieldName: 'CYFD_AMOUNT', header: { text: '이월액' } },
+
+ /* 3. 부채액 */
+ { name: 'DEBT_AMOUNT', fieldName: 'DEBT_AMOUNT', header: { text: '부채액\n(백만원)' } },
+
+ /* 4. 용도별 사업비 (지출) */
+ { name: 'PRPOS_WCT_SM', fieldName: 'PRPOS_WCT_SM', header: { text: '계' } },
+
+ // 처리장 상세
+ { name: 'PRCPLT_SM', fieldName: 'PRCPLT_SM', header: { text: '소계' } },
+ { name: 'PRCPLT_FCLTY', fieldName: 'PRCPLT_FCLTY', header: { text: '시설비' } },
+ { name: 'PRCPLT_RPAIR', fieldName: 'PRCPLT_RPAIR', header: { text: '개보수비' } },
+ { name: 'PRCPLT_ORPNS', fieldName: 'PRCPLT_ORPNS', header: { text: '운영\n유지비' } },
+ { name: 'PRCPLT_ETC', fieldName: 'PRCPLT_ETC', header: { text: '기타' } },
+
+ // 하수관로 상세
+ { name: 'SEWAGE_SM', fieldName: 'SEWAGE_SM', header: { text: '소계' } },
+ { name: 'SEWAGE_FCLTY', fieldName: 'SEWAGE_FCLTY', header: { text: '시설비' } },
+ { name: 'SEWAGE_RPAIR', fieldName: 'SEWAGE_RPAIR', header: { text: '개보수비' } },
+ { name: 'SEWAGE_ORPNS', fieldName: 'SEWAGE_ORPNS', header: { text: '운영\n유지비' } },
+ { name: 'SEWAGE_ETC', fieldName: 'SEWAGE_ETC', header: { text: '기타' } },
+
+ // 유수지 및 배수펌프장 상세
+ { name: 'SWGE_STRGE_SM', fieldName: 'SWGE_STRGE_SM', header: { text: '소계' } },
+ { name: 'SWGE_STRGE_FCLTY', fieldName: 'SWGE_STRGE_FCLTY', header: { text: '시설비' } },
+ { name: 'SWGE_STRGE_RPAIR', fieldName: 'SWGE_STRGE_RPAIR', header: { text: '개보수비' } },
+ { name: 'SWGE_STRGE_ORPNS', fieldName: 'SWGE_STRGE_ORPNS', header: { text: '운영\n유지비' } },
+ { name: 'SWGE_STRGE_ETC', fieldName: 'SWGE_STRGE_ETC', header: { text: '기타' } },
+
+ // 기타 지출
+ { name: 'ETC_SM', fieldName: 'ETC_SM', header: { text: '소계' } },
+ { name: 'ACDNT_CYFD_AMOUNT', fieldName: 'ACDNT_CYFD_AMOUNT', header: { text: '사고\n이월액' } },
+ { name: 'UNRCIV_AMOUNT', fieldName: 'UNRCIV_AMOUNT', header: { text: '미수납액' } },
+ { name: 'ETC_AMOUNT', fieldName: 'ETC_AMOUNT', header: { text: '기타' } },
+
+ /* 5. 비고 및 의견 */
+ { name: 'RMK', fieldName: 'RMK', header: { text: '비고' } },
+ ],
+ columnLayout: [
+ { name: 'addrGroup', header: { text: '행정구역' }, items: ['SIDO', 'GUGUN'] },
+ {
+ name: 'financeGroup',
+ header: { text: '재정별 사업비(백만원)' },
+ items: [
+ 'FNANC_WCT_SM', 'NTNXPN',
+ { name: 'localGroup', header: { text: '지방비' }, items: ['LCLEXPNS', 'LCLTY_CT'] },
+ 'SEWER_RNTFEE', 'AMNTBRNCSR', 'ETC_INCME', 'CYFD_AMOUNT'
+ ]
+ },
+ 'DEBT_AMOUNT',
+ {
+ name: 'usageGroup',
+ header: { text: '용도별사업비(백만원)' },
+ items: [
+ 'PRPOS_WCT_SM',
+ { name: 'plantGroup', header: { text: '처리장' }, items: ['PRCPLT_SM', 'PRCPLT_FCLTY', 'PRCPLT_RPAIR', 'PRCPLT_ORPNS', 'PRCPLT_ETC'] },
+ { name: 'pipeGroup', header: { text: '하수관로' }, items: ['SEWAGE_SM', 'SEWAGE_FCLTY', 'SEWAGE_RPAIR', 'SEWAGE_ORPNS', 'SEWAGE_ETC'] },
+ { name: 'storageGroup', header: { text: '하수저류시설' }, items: ['SWGE_STRGE_SM', 'SWGE_STRGE_FCLTY', 'SWGE_STRGE_RPAIR', 'SWGE_STRGE_ORPNS', 'SWGE_STRGE_ETC'] },
+ { name: 'etcUsageGroup', header: { text: '기타' }, items: ['ETC_SM', 'ACDNT_CYFD_AMOUNT', 'UNRCIV_AMOUNT', 'ETC_AMOUNT'] }
+ ]
+ },
+ 'RMK'
+ ]
+ },
+ {
+ tabKey: 'b',
+ tabLabel: '하수도 요금',
+ rowStartNum: 2, // 2단 헤더 구조 반영
+ fixedColumns: 1, // 순번, 시도, 시군구, 행정코드까지 고정
+ columns: [
+ /* 1. 행정 및 기본 정보 (Band: Left) */
+ { name: 'SIDO', fieldName: 'SIDO', header: { text: '시도' } },
+ { name: 'GUGUN', fieldName: 'GUGUN', header: { text: '시군구' } },
+ /* 2. 요금 분석 데이터 */
+ {
+ name: 'FYER_LEVY_QY',
+ fieldName: 'FYER_LEVY_QY',
+ header: { text: '연간조정량\n(㎥)\n(A)' }
+ },
+ {
+ name: 'LEVY_AMOUNT',
+ fieldName: 'LEVY_AMOUNT',
+ header: { text: '하수도사용료수익\n(원)\n(B)' }
+ },
+ {
+ name: 'AVRG_UNTPC',
+ fieldName: 'AVRG_UNTPC',
+ header: { text: '㎥당요금(원/㎥)\nC=(B/A)' }
+ },
+ {
+ name: 'SMRIZE_PRMPC',
+ fieldName: 'SMRIZE_PRMPC',
+ header: { text: '총괄원가(원)\n(D)' }
+ },
+ {
+ name: 'SMRIZE_UNIT_PRMPC',
+ fieldName: 'SMRIZE_UNIT_PRMPC',
+ header: { text: '㎥당원가(원/㎥)\nE=(D/A)' }
+ },
+ {
+ name: 'RLTY_RT',
+ fieldName: 'RLTY_RT',
+ header: { text: '요금현실화율(%)\nF=(C/E*100)' }
+ },
+
+ /* 3. 기타 및 의견 */
+ { name: 'RMK', fieldName: 'RMK', header: { text: '비고' } }
+ ],
+ columnLayout: [
+ {
+ name: 'addrGroup',
+ header: { text: '행정구역' },
+ items: ['SIDO', 'GUGUN'],
+ },
+ 'FYER_LEVY_QY',
+ 'LEVY_AMOUNT',
+ 'AVRG_UNTPC',
+ 'SMRIZE_PRMPC',
+ 'SMRIZE_UNIT_PRMPC',
+ 'RLTY_RT',
+ 'RMK'
+ ]
+},
+{
+ tabKey: 'c',
+ tabLabel: '하수도 사용료',
+ rowStartNum: 2,
+ fixedColumns: 1,
+ columns: [
+ /* 1. 기본 정보 */
+ { name: 'SIDO', fieldName: 'SIDO', header: { text: '시도' } },
+ { name: 'GUGUN', fieldName: 'GUGUN', header: { text: '시군구' } },
+
+ /* 2. 데이터 필드 정의 (header 필수 포함) */
+ { name: 'LEVY_AMOUNT', fieldName: 'LEVY_AMOUNT', header: { text: '부과액' } },
+ { name: 'LEVY_QY', fieldName: 'LEVY_QY', header: { text: '부과량' } },
+ { name: 'HOME_LEVY_AMOUNT', fieldName: 'HOME_LEVY_AMOUNT', header: { text: '부과액' } },
+ { name: 'HOME_LEVY_QY', fieldName: 'HOME_LEVY_QY', header: { text: '부과량' } },
+ { name: 'HOME_UNTPC', fieldName: 'HOME_UNTPC', header: { text: '단가' } },
+ { name: 'JOB_LEVY_AMOUNT', fieldName: 'JOB_LEVY_AMOUNT', header: { text: '부과액' } },
+ { name: 'JOB_LEVY_QY', fieldName: 'JOB_LEVY_QY', header: { text: '부과량' } },
+ { name: 'JOB_UNTPC', fieldName: 'JOB_UNTPC', header: { text: '단가' } },
+ { name: 'BSN_LEVY_AMOUNT', fieldName: 'BSN_LEVY_AMOUNT', header: { text: '부과액' } },
+ { name: 'BSN_LEVY_QY', fieldName: 'BSN_LEVY_QY', header: { text: '부과량' } },
+ { name: 'BSN_UNTPC', fieldName: 'BSN_UNTPC', header: { text: '단가' } },
+ { name: 'BATHS1_LEVY_AMOUNT', fieldName: 'BATHS1_LEVY_AMOUNT', header: { text: '부과액' } },
+ { name: 'BATHS1_LEVY_QY', fieldName: 'BATHS1_LEVY_QY', header: { text: '부과량' } },
+ { name: 'BATHS1_UNTPC', fieldName: 'BATHS1_UNTPC', header: { text: '단가' } },
+ { name: 'BATHS2_LEVY_AMOUNT', fieldName: 'BATHS2_LEVY_AMOUNT', header: { text: '부과액' } },
+ { name: 'BATHS2_LEVY_QY', fieldName: 'BATHS2_LEVY_QY', header: { text: '부과량' } },
+ { name: 'BATHS2_UNTPC', fieldName: 'BATHS2_UNTPC', header: { text: '단가' } },
+ { name: 'INDUST_LEVY_AMOUNT', fieldName: 'INDUST_LEVY_AMOUNT', header: { text: '부과액' } },
+ { name: 'INDUST_LEVY_QY', fieldName: 'INDUST_LEVY_QY', header: { text: '부과량' } },
+ { name: 'INDUST_UNTPC', fieldName: 'INDUST_UNTPC', header: { text: '단가' } },
+ { name: 'ETC_LEVY_AMOUNT', fieldName: 'ETC_LEVY_AMOUNT', header: { text: '부과액' } },
+ { name: 'ETC_LEVY_QY', fieldName: 'ETC_LEVY_QY', header: { text: '부과량' } },
+ { name: 'ETC_UNTPC', fieldName: 'ETC_UNTPC', header: { text: '단가' } },
+ { name: 'RMK', fieldName: 'RMK', header: { text: '비고' } },
+ ],
+ columnLayout: [
+ { name: 'addrGroup', header: { text: '행정구역' }, items: ['SIDO', 'GUGUN'] },
+ {
+ name: 'totalGroup', header: { text: '총계' },
+ items: [
+ { name: 'tAmtUnit', header: { text: '부과액\n(백만원)' }, items: ['LEVY_AMOUNT'] }, // fieldName 제거, items 사용
+ { name: 'tQyUnit', header: { text: '부과량\n(천톤)' }, items: ['LEVY_QY'] }
+ ]
+ },
+ {
+ name: 'homeGroup', header: { text: '가 정 용' },
+ items: [
+ { name: 'hAmtUnit', header: { text: '부과액\n(백만원)' }, items: ['HOME_LEVY_AMOUNT'] },
+ { name: 'hQyUnit', header: { text: '부과량\n(천톤)' }, items: ['HOME_LEVY_QY'] },
+ { name: 'hUntUnit', header: { text: '단가\n(원/톤)' }, items: ['HOME_UNTPC'] }
+ ]
+ },
+ {
+ name: 'jobGroup', header: { text: '업 무 용' },
+ items: [
+ { name: 'jAmtUnit', header: { text: '부과액\n(백만원)' }, items: ['JOB_LEVY_AMOUNT'] },
+ { name: 'jQyUnit', header: { text: '부과량\n(천톤)' }, items: ['JOB_LEVY_QY'] },
+ { name: 'jUntUnit', header: { text: '단가\n(원/톤)' }, items: ['JOB_UNTPC'] }
+ ]
+ },
+ {
+ name: 'bsnGroup', header: { text: '영 업 용(일 반 용)' },
+ items: [
+ { name: 'bAmtUnit', header: { text: '부과액\n(백만원)' }, items: ['BSN_LEVY_AMOUNT'] },
+ { name: 'bQyUnit', header: { text: '부과량\n(천톤)' }, items: ['BSN_LEVY_QY'] },
+ { name: 'bUntUnit', header: { text: '단가\n(원/톤)' }, items: ['BSN_UNTPC'] }
+ ]
+ },
+ {
+ name: 'bath1Group', header: { text: '욕 탕 1종(대중탕용)' },
+ items: [
+ { name: 'bt1AmtUnit', header: { text: '부과액\n(백만원)' }, items: ['BATHS1_LEVY_AMOUNT'] },
+ { name: 'bt1QyUnit', header: { text: '부과량\n(천톤)' }, items: ['BATHS1_LEVY_QY'] },
+ { name: 'bt1UntUnit', header: { text: '단가\n(원/톤)' }, items: ['BATHS1_UNTPC'] }
+ ]
+ },
+ {
+ name: 'bath2Group', header: { text: '욕 탕 2종' },
+ items: [
+ { name: 'bt2AmtUnit', header: { text: '부과액\n(백만원)' }, items: ['BATHS2_LEVY_AMOUNT'] },
+ { name: 'bt2QyUnit', header: { text: '부과량\n(천톤)' }, items: ['BATHS2_LEVY_QY'] },
+ { name: 'bt2UntUnit', header: { text: '단가\n(원/톤)' }, items: ['BATHS2_UNTPC'] }
+ ]
+ },
+ {
+ name: 'industGroup', header: { text: '산업용 및 공업용' },
+ items: [
+ { name: 'iAmtUnit', header: { text: '부과액\n(백만원)' }, items: ['INDUST_LEVY_AMOUNT'] },
+ { name: 'iQyUnit', header: { text: '부과량\n(천톤)' }, items: ['INDUST_LEVY_QY'] },
+ { name: 'iUntUnit', header: { text: '단가\n(원/톤)' }, items: ['INDUST_UNTPC'] }
+ ]
+ },
+ {
+ name: 'etcGroup', header: { text: '기타' },
+ items: [
+ { name: 'eAmtUnit', header: { text: '부과액\n(백만원)' }, items: ['ETC_LEVY_AMOUNT'] },
+ { name: 'eQyUnit', header: { text: '부과량\n(천톤)' }, items: ['ETC_LEVY_QY'] },
+ { name: 'eUntUnit', header: { text: '단가\n(원/톤)' }, items: ['ETC_UNTPC'] }
+ ]
+ },
+ 'RMK'
+ ]
+},
+{
+ tabKey: 'd',
+ tabLabel: '원인자부담금',
+ rowStartNum: 3, // 이미지처럼 3단 헤더이므로 데이터는 3행부터 시작
+ fixedColumns: 2,
+ columns: [
+ /* 1. 기본 정보 (header 필수 포함) */
+ { name: 'SIDO', fieldName: 'SIDO', header: { text: '시도' } },
+ { name: 'GUGUN', fieldName: 'GUGUN', header: { text: '시군구' } },
+ { name: 'YR_GBN', fieldName: 'YR_GBN', header: { text: '구분' } },
+
+ /* 2. 데이터 필드 정의 (최하단 3행에 표시될 텍스트) */
+ { name: 'LEVY_CO', fieldName: 'LEVY_CO', header: { text: '건수' } },
+ { name: 'LEVY_AMOUNT', fieldName: 'LEVY_AMOUNT', header: { text: '금액(백만원)' } },
+ { name: 'TRGET_LEV_STTUS_CO', fieldName: 'TRGET_LEV_STTUS_CO', header: { text: '건수' } },
+ { name: 'TRGET_LEV_STTUS_AMOUNT', fieldName: 'TRGET_LEV_STTUS_AMOUNT', header: { text: '금액(백만원)' } },
+ { name: 'DRNG_EQP_CO', fieldName: 'DRNG_EQP_CO', header: { text: '건수' } },
+ { name: 'DRNG_EQP_AMOUNT', fieldName: 'DRNG_EQP_AMOUNT', header: { text: '금액(백만원)' } },
+ { name: 'CNTRWK_CO', fieldName: 'CNTRWK_CO', header: { text: '건수' } },
+ { name: 'CNTRWK_AMOUNT', fieldName: 'CNTRWK_AMOUNT', header: { text: '금액(백만원)' } },
+ { name: 'RMK', fieldName: 'RMK', header: { text: '비고' } },
+ ],
+ columnLayout: [
+ { name: 'addrGroup', header: { text: '행정구역' }, items: ['SIDO', 'GUGUN'] },
+ 'YR_GBN',
+ {
+ name: 'levyMainGroup',
+ header: { text: '부과액' },
+ items: ['LEVY_CO', 'LEVY_AMOUNT'] // 1단(부과액) > 2단(건수, 금액)
+ },
+ {
+ name: 'collectGroup',
+ header: { text: '대상별 징수현황' },
+ items: [
+ {
+ name: 'collectTotal',
+ header: { text: '계' },
+ items: ['TRGET_LEV_STTUS_CO', 'TRGET_LEV_STTUS_AMOUNT']
+ },
+ {
+ name: 'contractorGroup',
+ header: { text: '배수설비설치자\n(하수도법 제61조 제1항)' },
+ items: ['DRNG_EQP_CO', 'DRNG_EQP_AMOUNT']
+ },
+ {
+ name: 'otherGroup',
+ header: { text: '타공사·타행위자\n(하수도법 제61조 제2항)' },
+ items: ['CNTRWK_CO', 'CNTRWK_AMOUNT']
+ }
+ ]
+ },
+ 'RMK'
+ ]
+}
+];
\ No newline at end of file