<?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.PayerAddrMapper">

<!-- 납부자 주소 정보 매퍼
 ========== 변경 이력 ==========
 2024-05-23	JoJH 최초 작성
 ============================ -->

    <resultMap id="payerAddrRow" type="cokr.xit.fims.payer.Payer"> <!-- 납부자 주소 -->
        <result property="rtpyrId"       column="RTPYR_ID" />        <!-- 납부자 ID -->
        <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="addr"          column="ADDR" />            <!-- 주소 -->
        <result property="dtlAddr"       column="DTL_ADDR" />        <!-- 상세 주소 -->
        <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="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 PA.RTPYR_ID          <!-- 납부자 ID -->
             , PA.ADDR_SN           <!-- 주소 일련번호 -->
             , PA.ADDR_INPT_SE_CD   <!-- 주소 입력 구분 코드 -->
             , PA.ADDR_SE_CD        <!-- 주소 구분 코드 -->
             , PA.ZIP               <!-- 우편번호 -->
             , PA.ADDR              <!-- 주소 -->
             , PA.DTL_ADDR          <!-- 상세 주소 -->
             , 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.WHOL_ADDR         <!-- 전체 주소 -->
          FROM TB_PAYER_ADDR PA
    </sql>

    <select id="selectAddrList" parameterType="map" resultType="dataobject">/* 납부자 주소 목록 조회(payerAddrMapper.selectAddrList) */
        <include refid="utility.paging-prefix" />
        <include refid="select" />
         WHERE PA.RTPYR_ID  = #{rtpyrId}
            <if test="addrSn != null">
           AND PA.ADDR_SN   = #{addrSn}
            </if>
        <include refid="utility.orderBy" />
        <include refid="utility.paging-suffix" />
    </select>

    <select id="selectAddrs" parameterType="map" resultMap="payerAddrRow">/* 납부자 주소 객체 가져오기(payerAddrMapper.selectAddrs) */
        <include refid="select" />
         WHERE PA.RTPYR_ID  = #{rtpyrId}
            <if test="addrSn != null">
           AND PA.ADDR_SN   = #{addrSn}
            </if>
        <include refid="utility.orderBy" />
    </select>

    <sql id="selectPayerAddr">
        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               <!-- 수정자 -->
             , PA.ADDR_SN           <!-- 주소 일련번호 -->
             , PA.ADDR_INPT_SE_CD   <!-- 주소 입력 구분 코드 -->
             , PA.ADDR_SE_CD        <!-- 주소 구분 코드 -->
             , PA.ZIP               <!-- 우편번호 -->
             , PA.ADDR              <!-- 주소 -->
             , PA.DTL_ADDR          <!-- 상세 주소 -->
             , 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.WHOL_ADDR         <!-- 전체 주소 -->
          FROM TB_PAYER           P
    LEFT OUTER JOIN TB_PAYER_ADDR PA ON (P.RTPYR_ID = PA.RTPYR_ID)
    </sql>

    <select id="selectPayerAddrInfo" parameterType="map" resultMap="payerAddrRow">/* 납부자 주소 객체 가져오기(payerAddrMapper.selectPayerAddrInfo) */
        <include refid="selectPayerAddr" />
         WHERE P.RTPYR_ID = #{rtpyrId}
         <choose>
             <when test="addrSn != null">AND PA.ADDR_SN = #{addrSn}</when>
             <otherwise>
                 <if test="addrInptSeCd != null">AND PA.ADDR_INPT_SE_CD = #{addrInptSeCd}</if>
                 <if test="roadNmCd != null">AND PA.ROAD_NM_CD = #{roadNmCd}</if>
                 <if test="addr != null">AND PA.ADDR = #{addr}</if>
                 <if test="dtlAddr != null">AND PA.DTL_ADDR  = #{dtlAddr}</if>
             </otherwise>
         </choose>
        <include refid="utility.orderBy" />
    </select>

    <select id="selectLastPayerAddrs" parameterType="map" resultType="dataobject">/* 납부자 주소 객체 가져오기(payerAddrMapper.selectLastPayerAddrs) */
        <include refid="selectPayerAddr" />
        <where>
        <if test="rtpyrId != null">
           AND P.RTPYR_ID   = #{rtpyrId}
           AND PA.ADDR_SN   = #{addrSn}
        </if>
        <if test="rtpyrNo != null">
           AND P.RTPYR_SE_CD= #{rtpyrSeCd}
           AND P.RTPYR_NO   = #{rtpyrNo}
        </if>
        </where>
        <include refid="utility.orderBy" />
    </select>

    <insert id="insertPayerAddr" parameterType="cokr.xit.fims.payer.Payer">/* 납부자 주소 등록(payerAddrMapper.insertPayerAddr) */
        <selectKey resultType="string" keyProperty="addrSn" keyColumn="NEW_ID" order="BEFORE">
            SELECT LPAD(CAST(IFNULL(MAX(ADDR_SN) + 1, 1) AS INT), 5, '0') AS NEW_ID
              FROM TB_PAYER_ADDR
             WHERE RTPYR_ID = #{rtpyrId}
        </selectKey>
        INSERT
          INTO TB_PAYER_ADDR (
               RTPYR_ID         <!-- 납부자 ID -->
             , ADDR_SN          <!-- 주소 일련번호 -->
             , ADDR_INPT_SE_CD  <!-- 주소 입력 구분 코드 -->
             , ADDR_SE_CD       <!-- 주소 구분 코드 -->
             , ZIP              <!-- 우편번호 -->
             , ADDR             <!-- 주소 -->
             , DTL_ADDR         <!-- 상세 주소 -->
             , ROAD_NM_CD       <!-- 도로 명 코드 -->
             , UDGD_SE_CD       <!-- 지하 구분 코드 -->
             , BMNO             <!-- 건물본번 -->
             , BSNO             <!-- 건물부번 -->
             , BLDG_MNG_NO      <!-- 건물 관리 번호 -->
             , STDG_CD          <!-- 법정동 코드 -->
             , DONG_CD          <!-- 행정동 코드 -->
             , MTN_SE_CD        <!-- 산 구분 코드 -->
             , MNO              <!-- 본번 -->
             , SNO              <!-- 부번 -->
             , SPCL_DONG        <!-- 특수 동 -->
             , SPCL_HO          <!-- 특수 호 -->
             , SPCL_ADDR        <!-- 특수 주소 -->
             , WHOL_ADDR        <!-- 전체 주소 -->
             , REG_DT           <!-- 등록 일시 -->
             , RGTR             <!-- 등록자 -->
             , MDFCN_DT         <!-- 수정 일시 -->
             , MDFR             <!-- 수정자 -->
        )
        VALUES (
               #{rtpyrId}       <!-- 납부자 ID -->
             , #{addrSn}        <!-- 주소 일련번호 -->
             , #{addrInptSeCd}  <!-- 주소 입력 구분 코드 -->
             , #{addrSeCd}      <!-- 주소 구분 코드 -->
             , #{zip}           <!-- 우편번호 -->
             , #{addr}          <!-- 주소 -->
             , #{dtlAddr}       <!-- 상세 주소 -->
             , #{roadNmCd}      <!-- 도로 명 코드 -->
             , #{udgdSeCd}      <!-- 지하 구분 코드 -->
             , #{bmno}          <!-- 건물본번 -->
             , #{bsno}          <!-- 건물부번 -->
             , #{bldgMngNo}     <!-- 건물 관리 번호 -->
             , #{stdgCd}        <!-- 법정동 코드 -->
             , #{dongCd}        <!-- 행정동 코드 -->
             , #{mtnSeCd}       <!-- 산 구분 코드 -->
             , #{mno}           <!-- 본번 -->
             , #{sno}           <!-- 부번 -->
             , #{spclDong}      <!-- 특수 동 -->
             , #{spclHo}        <!-- 특수 호 -->
             , #{spclAddr}      <!-- 특수 주소 -->
             , #{wholAddr}      <!-- 전체 주소 -->
             ,<include refid="utility.now" /> <!-- 등록 일시 -->
             , #{createdBy}     <!-- 등록자 -->
             ,<include refid="utility.now" /> <!-- 수정 일시 -->
             , #{modifiedBy}    <!-- 수정자 -->
        )
    </insert>

    <update id="updatePayerAddr" parameterType="cokr.xit.fims.payer.Payer">/* 납부자 주소 수정(payerAddrMapper.updatePayerAddr) */
        UPDATE TB_PAYER_ADDR
           SET ZIP             = #{zip}
             , ADDR            = #{addr}
             , DTL_ADDR        = #{dtlAddr}
             , WHOL_ADDR       = #{wholAddr}
             , MDFCN_DT        = <include refid="utility.now" />   <!-- 수정 일시 -->
             , MDFR            = #{modifiedBy}      <!-- 수정자 -->
         WHERE RTPYR_ID        = #{rtpyrId}
           AND ADDR_SN         = #{addrSn}
    </update>

    <sql id="selectPayerAddrHstry">
        SELECT CPAH.ADDR_HSTRY_ID   <!-- 주소 이력 ID -->
             , CPAH.CRDN_ID     <!-- 단속 ID -->
             , CPAH.RTPYR_ID    <!-- 납부자 ID -->
             , CPAH.ADDR_SN     <!-- 주소 일련번호 -->
             , CPAH.REG_DT      <!-- 등록 일시 -->
             , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = CPAH.RGTR)  AS RGTR_NM  <!-- 등록자 명 -->
             , P.RTPYR_SE_CD    <!-- 납부자 구분 코드 -->
             , (GET_CODE_NM('FIM011', P.RTPYR_SE_CD))   AS RTPYR_SE_NM  <!-- 납부자 구분 명 -->
             , P.RTPYR_NM       <!-- 납부자 명 -->
             , (GET_CODE_NM('FIM087', PA.ADDR_INPT_SE_CD)) AS ADDR_INPT_SE_NM   <!-- 주소 입력 구분 명 -->
             , (GET_CODE_NM('FIM013', PA.ADDR_SE_CD))   AS ADDR_SE_NM   <!-- 주소 구분 명 -->
             , PA.ZIP           <!-- 우편번호 -->
             , PA.ADDR          <!-- 주소 -->
             , PA.DTL_ADDR      <!-- 상세 주소 -->
             , PA.ROAD_NM_CD    <!-- 도로 명 코드 -->
             , PA.BLDG_MNG_NO   <!-- 건물 관리 번호 -->
             , PA.STDG_CD       <!-- 법정동 코드 -->
             , PA.DONG_CD       <!-- 행정동 코드 -->
             , PA.WHOL_ADDR     <!-- 전체 주소 -->
          FROM TB_CRDN_PAYER_ADDR_HSTRY CPAH
         INNER JOIN TB_PAYER            P    ON (CPAH.RTPYR_ID = P.RTPYR_ID)
         INNER JOIN TB_PAYER_ADDR       PA   ON (CPAH.RTPYR_ID = PA.RTPYR_ID AND CPAH.ADDR_SN = PA.ADDR_SN)
    </sql>

    <select id="selectPayerAddrHstrys" parameterType="map" resultType="dataobject">/* 납부자 주소 이력 대장 객체 가져오기(payerMapper.selectCrdnPayerAddrHstrys) */
        <include refid="selectPayerAddrHstry" />
        <where>
            <choose>
                <when test="addrHstryId != null">
           AND CPAH.ADDR_HSTRY_ID   = #{addrHstryId}    <!-- 주소 이력 ID -->
                </when>
                <otherwise>
                    <if test="crdnId != null">
           AND CPAH.CRDN_ID     = #{crdnId}     <!-- 단속 ID -->
                    </if>
                    <if test="rtpyrId != null">
           AND CPAH.RTPYR_ID    = #{rtpyrId}    <!-- 납부자 ID -->
                    </if>
                </otherwise>
            </choose>
        </where>
        <include refid="utility.orderBy" />
    </select>

</mapper>