<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cokr.xit.fims.payer.dao.PayerMapper">

<!-- 납부자 대장 정보 매퍼
 ========== 변경 이력 ==========
 2024-05-23	JoJH   납부자, 주소 테이블 분리
 2023-08-18	mjkhan 최초 작성
 ============================ -->

    <resultMap id="payerRow" type="cokr.xit.fims.payer.Payer"> <!-- 납부자 대장 -->
        <result property="rtpyrId"        column="RTPYR_ID" />         <!-- 납부자 ID -->
        <result property="sggCd"          column="SGG_CD" />           <!-- 시군구 코드 -->
        <result property="rtpyrInptSeCd"  column="RTPYR_INPT_SE_CD" /> <!-- 납부자 입력 구분 코드 -->
        <result property="rtpyrSeCd"      column="RTPYR_SE_CD" />      <!-- 납부자 구분 코드 -->
        <result property="rtpyrNo"        column="RTPYR_NO" />         <!-- 납부자 번호 -->
        <result property="rtpyrNm"        column="RTPYR_NM" />         <!-- 납부자 명 -->
        <result property="rtpyrTelno"     column="RTPYR_TELNO" />      <!-- 납부자 전화번호 -->
        <result property="rtpyrMblTelno"  column="RTPYR_MBL_TELNO" />  <!-- 납부자 휴대 전화번호 -->
        <result property="rtpyrEml"       column="RTPYR_EML" />        <!-- 납부자 이메일 -->
        <result property="rtpyrBrdt"      column="RTPYR_BRDT" />       <!-- 납부자 생년월일 -->
        <result property="rtpyrSttsCd"    column="RTPYR_STTS_CD" />    <!-- 납부자 상태 코드 -->
        <result property="addrSn"         column="ADDR_SN" />          <!-- 주소 일련번호 -->
        <result property="addrInptSeCd"   column="ADDR_INPT_SE_CD" />  <!-- 주소 입력 구분 코드 -->
        <result property="addrSeCd"       column="ADDR_SE_CD" />       <!-- 주소 구분 코드 -->
        <result property="zip"            column="ZIP" />              <!-- 우편번호 -->
        <result property="roadNmCd"       column="ROAD_NM_CD" />       <!-- 도로 명 코드 -->
        <result property="udgdSeCd"       column="UDGD_SE_CD" />       <!-- 지하 구분 코드 -->
        <result property="bmno"           column="BMNO" />             <!-- 건물본번 -->
        <result property="bsno"           column="BSNO" />             <!-- 건물부번 -->
        <result property="bldgMngNo"      column="BLDG_MNG_NO" />      <!-- 건물 관리 번호 -->
        <result property="stdgCd"         column="STDG_CD" />          <!-- 법정동 코드 -->
        <result property="dongCd"         column="DONG_CD" />          <!-- 행정동 코드 -->
        <result property="mtnSeCd"        column="MTN_SE_CD" />        <!-- 산 구분 코드 -->
        <result property="mno"            column="MNO" />              <!-- 본번 -->
        <result property="sno"            column="SNO" />              <!-- 부번 -->
        <result property="spclDong"       column="SPCL_DONG" />        <!-- 특수 동 -->
        <result property="spclHo"         column="SPCL_HO" />          <!-- 특수 호 -->
        <result property="spclAddr"       column="SPCL_ADDR" />        <!-- 특수 주소 -->
        <result property="addr"           column="ADDR" />             <!-- 주소 -->
        <result property="dtlAddr"        column="DTL_ADDR" />         <!-- 상세 주소 -->
        <result property="wholAddr"       column="WHOL_ADDR" />        <!-- 전체 주소 -->
        <result property="createdAt"      column="REG_DT" />           <!-- 등록 일시 -->
        <result property="createdBy"      column="RGTR" />             <!-- 등록자 -->
        <result property="lastModified"   column="MDFCN_DT" />         <!-- 수정 일시 -->
        <result property="modifiedBy"     column="MDFR" />             <!-- 수정자 -->
    </resultMap>

    <sql id="select">
        SELECT P.RTPYR_ID           <!-- 납부자 ID -->
             , P.SGG_CD             <!-- 시군구 코드 -->
             , P.RTPYR_INPT_SE_CD   <!-- 납부자 입력 구분 코드 -->
             , P.RTPYR_SE_CD        <!-- 납부자 구분 코드 -->
             , P.RTPYR_NO           <!-- 납부자 번호 -->
             , P.RTPYR_NM           <!-- 납부자 명 -->
             , P.RTPYR_TELNO        <!-- 납부자 전화번호 -->
             , P.RTPYR_MBL_TELNO    <!-- 납부자 휴대 전화번호 -->
             , P.RTPYR_EML          <!-- 납부자 이메일 -->
             , P.RTPYR_BRDT         <!-- 납부자 생년월일 -->
             , P.RTPYR_STTS_CD      <!-- 납부자 상태 코드 -->
             , P.REG_DT             <!-- 등록 일시 -->
             , P.RGTR               <!-- 등록자 -->
             , P.MDFCN_DT           <!-- 수정 일시 -->
             , P.MDFR               <!-- 수정자 -->
          FROM TB_PAYER     P
    </sql>

    <select id="selectPayerList" parameterType="map" resultType="dataobject">/* 납부자 대장 목록 조회(payerMapper.selectPayerList) */
        <include refid="utility.paging-prefix" />
        <include refid="select" />
        <where>
           AND P.RTPYR_ID IN (<foreach collection="rtpyrIds" item="rtpyrId" separator=",">#{rtpyrId}</foreach>)
        </where>
        <include refid="utility.orderBy" />
        <include refid="utility.paging-suffix" />
    </select>

    <select id="selectPayers" parameterType="map" resultMap="payerRow">/* 납부자 대장 객체 가져오기(payerMapper.selectPayers) */
        <include refid="select" />
        <where>
            <choose>
                <when test="rtpyrIds != null">
           AND P.RTPYR_ID    IN (<foreach collection="rtpyrIds" item="rtpyrId" separator=",">#{rtpyrId}</foreach>)
                </when>
                <when test="rtpyrId != null">
           AND P.RTPYR_ID    = #{rtpyrId}   <!-- 납부자 ID -->
                </when>
                <otherwise>
           AND P.RTPYR_SE_CD = #{rtpyrSeCd} <!-- 납부자 구분 코드 -->
           AND P.RTPYR_NO    = #{rtpyrNo}   <!-- 납부자 번호 -->
                </otherwise>
            </choose>
        </where>
        <include refid="utility.orderBy" />
    </select>

    <insert id="insertPayer" parameterType="map">/* 납부자 대장 등록(payerMapper.insertPayer) */
        <selectKey resultType="string" keyProperty="payer.rtpyrId" keyColumn="NEW_ID" order="BEFORE">
            <include refid="numbering.keyByYear">
                <property name="TABLE_NAME" value="TB_PAYER" />
                <property name="TABLE_KEY"  value="RTPYR_ID" />
                <property name="pad"        value="20" />
            </include>
        </selectKey>
        INSERT
          INTO TB_PAYER (
               RTPYR_ID         <!-- 납부자 ID -->
             , SGG_CD           <!-- 시군구 코드 -->
             , RTPYR_INPT_SE_CD <!-- 납부자 입력 구분 코드 -->
             , RTPYR_SE_CD      <!-- 납부자 구분 코드 -->
             , RTPYR_NO         <!-- 납부자 번호 -->
             , RTPYR_NM         <!-- 납부자 명 -->
             , RTPYR_TELNO      <!-- 납부자 전화번호 -->
             , RTPYR_MBL_TELNO  <!-- 납부자 휴대 전화번호 -->
             , RTPYR_EML        <!-- 납부자 이메일 -->
             , RTPYR_BRDT       <!-- 납부자 생년월일 -->
             , RTPYR_STTS_CD    <!-- 납부자 상태 코드 -->
             , REG_DT           <!-- 등록 일시 -->
             , RGTR             <!-- 등록자 -->
             , MDFCN_DT         <!-- 수정 일시 -->
             , MDFR             <!-- 수정자 -->
        )
        SELECT #{payer.rtpyrId}       <!-- 납부자 ID -->
             , #{payer.sggCd}         <!-- 시군구 코드 -->
             , #{payer.rtpyrInptSeCd} <!-- 납부자 입력 구분 코드 -->
             , #{payer.rtpyrSeCd}     <!-- 납부자 구분 코드 -->
             , #{payer.rtpyrNo}       <!-- 납부자 번호 -->
             , #{payer.rtpyrNm}       <!-- 납부자 명 -->
             , #{payer.rtpyrTelno}    <!-- 납부자 전화번호 -->
             , #{payer.rtpyrMblTelno} <!-- 납부자 휴대 전화번호 -->
             , #{payer.rtpyrEml}      <!-- 납부자 이메일 -->
             , #{payer.rtpyrBrdt}     <!-- 납부자 생년월일 -->
             , #{payer.rtpyrSttsCd}   <!-- 납부자 상태 코드 -->
             , <include refid="utility.now" />  <!-- 등록 일시 -->
             , #{payer.createdBy}     <!-- 등록자 -->
             , <include refid="utility.now" />  <!-- 수정 일시 -->
             , #{payer.modifiedBy}    <!-- 수정자 -->
          FROM DUAL
         WHERE NOT EXISTS (
               SELECT *
                 FROM TB_PAYER B
                WHERE RTPYR_NO    = #{payer.rtpyrNo}
                  AND RTPYR_SE_CD = #{payer.rtpyrSeCd}
                  AND SGG_CD      = #{payer.sggCd}
         )
    </insert>

    <update id="updatePayer" parameterType="cokr.xit.fims.payer.Payer">/* 납부자 대장 수정(payerMapper.updatePayer) */
        UPDATE TB_PAYER
           SET RTPYR_NM         = #{payer.rtpyrNm}       <!-- 납부자 명 -->
            <if test="payer.rtpyrInptSeCd != null">
             , RTPYR_INPT_SE_CD = #{payer.rtpyrInptSeCd} <!-- 납부자 입력 구분 코드 -->
            </if>
            <if test="payer.rtpyrTelno != null">
             , RTPYR_TELNO      = #{payer.rtpyrTelno}    <!-- 납부자 전화번호 -->
            </if>
            <if test="payer.rtpyrMblTelno != null">
             , RTPYR_MBL_TELNO  = #{payer.rtpyrMblTelno} <!-- 납부자 휴대 전화번호 -->
            </if>
            <if test="payer.rtpyrEml != null">
             , RTPYR_EML        = #{payer.rtpyrEml}      <!-- 납부자 이메일 -->
            </if>
            <if test="payer.rtpyrSttsCd != null">
             , RTPYR_STTS_CD    = #{payer.rtpyrSttsCd}   <!-- 납부자 상태 코드 -->
            </if>
             , MDFCN_DT         = <include refid="utility.now" /> <!-- 수정 일시 -->
             , MDFR             = #{payer.modifiedBy}    <!-- 수정자 -->
         WHERE RTPYR_ID         = #{payer.rtpyrId}
            <if test="payer.rtpyrSeCd != null">
           AND RTPYR_SE_CD      = #{payer.rtpyrSeCd}     <!-- 납부자 구분 코드 -->
            </if>
    </update>

    <select id="selectAddrInfo" parameterType="map" resultType="dataobject">/* 우편번호, 건물관리번호 조회(payerMapper.selectAddrInfo) */
        SELECT ZIP
             , BLDG_MNG_NO
             , STDG_CD
             , DONG_CD
             , CTPV_NM
             , SGG_NM
             , STDG_NM
             , STDG_LI_NM
             , ROAD_NM
          FROM TB_ROAD_ADDR
         WHERE ROAD_NM_CD   = #{roadNmCd}
           AND UDGD_SE_CD   = #{udgdSeCd}
           AND BMNO         = #{bmno}
           AND BSNO         = #{bsno}
         LIMIT 1
    </select>

	<sql id="selectCrdnPayer">
        SELECT C.CRDN_ID            <!-- 단속 ID -->
             , C.SGG_CD             <!-- 시군구 코드 -->
             , C.TASK_SE_CD         <!-- 업무 구분 코드 -->
             , C.CRDN_YMD           <!-- 단속 일자 -->
             , (CONCAT(C.CRDN_YMD, C.CRDN_TM)) AS CRDN_YMD_TM   <!-- 단속 일시 -->
             , C.VHRNO              <!-- 차량번호 -->
             , C.CRDN_STTS_CD       <!-- 단속 상태 코드 -->
             , (GET_CODE_NM('FIM010', C.CRDN_STTS_CD)) AS CRDN_STTS_NM  <!-- 단속 상태 명 -->
             , C.CRDN_STTS_CHG_DT   <!-- 단속 상태 변경 일시 -->
             , P.RTPYR_ID           <!-- 납부자 ID -->
             , P.RTPYR_INPT_SE_CD   <!-- 납부자 입력 구분 코드 -->
             , (GET_CODE_NM('FIM015', P.RTPYR_INPT_SE_CD)) AS RTPYR_INPT_SE_NM  <!-- 납부자 입력 구분 명 -->
             , P.RTPYR_SE_CD        <!-- 납부자 구분 코드 -->
             , (GET_CODE_NM('FIM011', P.RTPYR_SE_CD)) AS RTPYR_SE_NM    <!-- 납부자 구분 명 -->
             , P.RTPYR_NO           <!-- 납부자 번호 -->
             , P.RTPYR_NM           <!-- 납부자 명 -->
             , P.RTPYR_TELNO        <!-- 납부자 전화번호 -->
             , P.RTPYR_MBL_TELNO    <!-- 납부자 휴대 전화번호 -->
             , P.RTPYR_EML          <!-- 납부자 이메일 -->
             , P.RTPYR_BRDT         <!-- 납부자 생년월일 -->
             , P.RTPYR_STTS_CD      <!-- 납부자 상태 코드 -->
             , (GET_CODE_NM('FIM014', P.RTPYR_STTS_CD)) AS RTPYR_STTS_NM    <!-- 납부자 상태 명 -->
             , P.REG_DT             <!-- 등록 일시 -->
             , P.RGTR               <!-- 등록자 -->
             , P.MDFCN_DT           <!-- 수정 일시 -->
             , P.MDFR               <!-- 수정자 -->
             , PA.ADDR_SN           <!-- 주소 일련번호' -->
             , PA.ADDR_SE_CD        <!-- 주소 구분 코드 -->
             , PA.ADDR_INPT_SE_CD   <!-- 주소 입력 구분 코드 -->
             , PA.ZIP               <!-- 우편번호 -->
             , PA.ROAD_NM_CD        <!-- 도로 명 코드 -->
             , PA.UDGD_SE_CD        <!-- 지하 구분 코드 -->
             , PA.BMNO              <!-- 건물본번 -->
             , PA.BSNO              <!-- 건물부번 -->
             , PA.BLDG_MNG_NO       <!-- 건물 관리 번호 -->
             , PA.STDG_CD           <!-- 법정동 코드 -->
             , PA.DONG_CD           <!-- 행정동 코드 -->
             , PA.MTN_SE_CD         <!-- 산 구분 코드 -->
             , PA.MNO               <!-- 본번 -->
             , PA.SNO               <!-- 부번 -->
             , PA.SPCL_DONG         <!-- 특수 동 -->
             , PA.SPCL_HO           <!-- 특수 호 -->
             , PA.SPCL_ADDR         <!-- 특수 주소 -->
             , PA.ADDR              <!-- 주소 -->
             , PA.DTL_ADDR          <!-- 상세 주소 -->
             , PA.WHOL_ADDR         <!-- 전체 주소 -->
          FROM TB_CRDN            C
    LEFT OUTER JOIN TB_PAYER      P  ON (C.RTPYR_ID = P.RTPYR_ID)
    LEFT OUTER JOIN TB_PAYER_ADDR PA ON (C.RTPYR_ID = PA.RTPYR_ID AND C.ADDR_SN = PA.ADDR_SN)
	</sql>

	<select id="selectCrdnPayers" parameterType="map" resultType="dataobject">/* 납부자 대장 객체 가져오기(payerMapper.selectCrdnPayers) */
        <include refid="selectCrdnPayer" />
        <where>
            <if test="rtpyrId != null">
           AND P.RTPYR_ID = #{rtpyrId}  <!-- 납부자 ID -->
            </if>
            <if test="crdnId != null">
           AND C.CRDN_ID  = #{crdnId}   <!-- 단속 ID -->
           AND C.DEL_YN   = 'N'
            </if>
        </where>
        <include refid="utility.orderBy" />
	</select>

	<select id="selectCrdn" parameterType="map" resultType="dataobject">/* 단속 대장 객체 가져오기(payerMapper.selectCrdn) */
        SELECT C.CRDN_ID        <!-- 단속 ID -->
             , C.SGG_CD         <!-- 시군구 코드 -->
             , C.TASK_SE_CD     <!-- 업무 구분 코드 -->
             , C.RTPYR_ID       <!-- 납부자 ID -->
             , C.ADDR_SN        <!-- 주소 일련번호 -->
             , C.CRDN_YMD       <!-- 단속 일자 -->
             , (CONCAT(C.CRDN_YMD, C.CRDN_TM)) AS CRDN_YMD_TM   <!-- 단속 일시 -->
             , C.VHRNO          <!-- 차량번호 -->
             , C.CRDN_STTS_CD   <!-- 단속 상태 코드 -->
             , (GET_CODE_NM('FIM010', C.CRDN_STTS_CD)) AS CRDN_STTS_NM  <!-- 단속 상태 명 -->
             , C.CRDN_STTS_CHG_DT   <!-- 단속 상태 변경 일시 -->
             , P.RTPYR_NO       <!-- 납부자 번호 -->
             , PA.ADDR_INPT_SE_CD <!-- 주소 입력 구분 코드 -->
             , PA.ZIP           <!-- 우편번호 -->
             , PA.ADDR          <!-- 주소 -->
             , PA.DTL_ADDR      <!-- 상세 주소 -->
             , PA.ROAD_NM_CD    <!-- 도로 명 코드 -->
             , PA.STDG_CD       <!-- 법정동 코드 -->
          FROM TB_CRDN            C
    LEFT OUTER JOIN TB_PAYER      P  ON (C.RTPYR_ID = P.RTPYR_ID)
    LEFT OUTER JOIN TB_PAYER_ADDR PA ON (C.RTPYR_ID = PA.RTPYR_ID AND C.ADDR_SN = PA.ADDR_SN)
         WHERE C.CRDN_ID     = #{crdnId}    <!-- 단속 ID -->
           AND C.DEL_YN      = 'N'
	</select>

    <sql id="selectPayerHstry">
        SELECT CPAH.ADDR_HSTRY_ID   <!-- 변경 이력 ID -->
             , CPAH.CRDN_ID         <!-- 단속 ID -->
             , CPAH.RTPYR_ID        <!-- 납부자 ID -->
             , CPAH.REG_DT          <!-- 등록 일시 -->
             , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = CPAH.RGTR) AS RGTR_NM   <!-- 등록자 명 -->
             , P.RTPYR_INPT_SE_CD   <!-- 납부자 입력 구분 코드 -->
             , (GET_CODE_NM('FIM015', P.RTPYR_INPT_SE_CD)) AS RTPYR_INPT_SE_NM  <!-- 납부자 입력 구분 명 -->
             , P.RTPYR_SE_CD        <!-- 납부자 구분 코드 -->
             , (GET_CODE_NM('FIM011', P.RTPYR_SE_CD)) AS RTPYR_SE_NM    <!-- 납부자 구분 명 -->
             , P.RTPYR_NO           <!-- 납부자 번호 -->
             , P.RTPYR_NM           <!-- 납부자 명 -->
             , P.RTPYR_TELNO        <!-- 납부자 전화번호 -->
             , P.RTPYR_MBL_TELNO    <!-- 납부자 휴대 전화번호 -->
             , P.RTPYR_EML          <!-- 납부자 이메일 -->
             , P.RTPYR_BRDT         <!-- 납부자 생년월일 -->
             , P.RTPYR_STTS_CD      <!-- 납부자 상태 코드 -->
          FROM TB_CRDN_PAYER_ADDR_HSTRY CPAH
         INNER JOIN TB_PAYER            P   ON (CPAH.RTPYR_ID = P.RTPYR_ID)
    </sql>

    <select id="selectPayerHstrys" parameterType="map" resultType="dataobject">/* 납부자 이력 대장 객체 가져오기(payerMapper.selectPayerHstrys) */
        <include refid="selectPayerHstry" />
         WHERE CPH.CRDN_ID = #{crdnId}  <!-- 단속 ID -->
        <include refid="utility.orderBy" />
    </select>

</mapper>
