<?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.sndb.dao.SndngMapper">

<!-- 발송 대장 정보 매퍼
 ========== 변경 이력 ==========
 2023-08-25	JoJH 최초 작성
 ============================ -->

	<resultMap id="sndngRow" type="cokr.xit.fims.sndb.Sndng"> <!-- TB_SNDNG 발송 대장 -->
		<result property="sndngId"		 column="SNDNG_ID" />		<!-- 발송 ID -->
		<result property="sggCd"		 column="SGG_CD" />			<!-- 시군구 코드 -->
		<result property="taskSeCd"		 column="TASK_SE_CD" />		<!-- 업무 구분 코드 -->
		<result property="deptCd"		 column="DEPT_CD" />		<!-- 부서 코드 -->
		<result property="sndngRegSeCd"	 column="SNDNG_REG_SE_CD" /><!-- 발송 등록 구분 코드 -->
		<result property="sndngSeCd"	 column="SNDNG_SE_CD" />	<!-- 발송 구분 코드 -->
		<result property="vltnId"		 column="VLTN_ID" />		<!-- 위반 ID -->
		<result property="levyBgngYmd"	 column="LEVY_BGNG_YMD" />	<!-- 부과 시작 일자 -->
		<result property="levyEndYmd"	 column="LEVY_END_YMD" />	<!-- 부과 종료 일자 -->
		<result property="sndngYmd"		 column="SNDNG_YMD" />		<!-- 발송 일자 -->
		<result property="sndngEndYmd"	 column="SNDNG_END_YMD" />	<!-- 발송 종료 일자 -->
		<result property="ttlNm"		 column="TTL_NM" />			<!-- 제목 명 -->
		<result property="docNo"		 column="DOC_NO" />			<!-- 문서 번호 -->
		<result property="etcCn"		 column="ETC_CN" />			<!-- 기타 내용 -->
		<result property="tnocs"		 column="TNOCS" />			<!-- 총건수 -->
		<result property="gramt"		 column="GRAMT" />			<!-- 총금액 -->
		<result property="conKey"		 column="CON_KEY" />		<!-- 외부연계식별키 -->
		<result property="divKb"		 column="DIV_KB" />			<!-- 취급 구분 -->
		<result property="epostNoticeId" column="EPOST_NOTICE_ID" /><!-- 전자우편 안내문 ID -->
		<result property="sndngSttsCd"	 column="SNDNG_STTS_CD" />	<!-- 발송 상태 코드 -->
		<result property="rsndYn"		 column="RSND_YN" />        <!-- 재발송 여부 -->
		<result property="delYn"		 column="DEL_YN" />			<!-- 삭제 여부 -->
		<result property="createdAt"	 column="REG_DT" />			<!-- 등록 일시 -->
		<result property="createdBy"	 column="RGTR" />			<!-- 등록자 -->
		<result property="lastModified"	 column="MDFCN_DT" />		<!-- 수정 일시 -->
		<result property="modifiedBy"	 column="MDFR" />			<!-- 수정자 -->
		<result property="delDt"		 column="DEL_DT" />			<!-- 삭제 일시 -->
		<result property="dltr"			 column="DLTR" />			<!-- 삭제자 -->
		<result property="delRsn"		 column="DEL_RSN" />		<!-- 삭제 사유 -->
	</resultMap>

	<sql id="selectList">
        SELECT S.SNDNG_ID       <!-- 발송 ID -->
             , S.SGG_CD         <!-- 시군구 코드 -->
             , S.DEPT_CD        <!-- 부서 코드 -->
             , S.TASK_SE_CD     <!-- 업무 구분 코드 -->
             , (GET_CODE_NM('FIM054', S.TASK_SE_CD)) AS TASK_SE_NM  <!-- 업무 구분 명 -->
             , S.SNDNG_REG_SE_CD <!-- 발송 등록 구분 코드 -->
             , (GET_CODE_NM('FIM067', S.SNDNG_REG_SE_CD)) AS SNDNG_REG_SE_NM    <!-- 발송 등록 구분 명 -->
             , S.SNDNG_SE_CD    <!-- 발송 구분 코드 -->
             , (GET_CODE_NM('FIM047', S.SNDNG_SE_CD)) AS SNDNG_SE_NM    <!-- 발송 구분 명 -->
             , V.VLTN_ID        <!-- 위반 ID -->
             , V.VLTN_CD        <!-- 위반 코드 -->
             , V.VLTN_ARTCL     <!-- 위반 항목 -->
             , S.LEVY_BGNG_YMD  <!-- 부과 시작 일자 -->
             , S.LEVY_END_YMD   <!-- 부과 종료 일자 -->
             , S.SNDNG_YMD      <!-- 발송 일자 -->
             , S.SNDNG_END_YMD  <!-- 발송 종료 일자 -->
             , S.TTL_NM         <!-- 제목 명 -->
             , S.DOC_NO         <!-- 문서 번호 -->
             , S.ETC_CN         <!-- 기타 내용 -->
             , S.TNOCS          <!-- 총건수 -->
             , S.GRAMT          <!-- 총금액 -->
             , S.CON_KEY        <!-- 외부연계식별키 -->
             , S.DIV_KB         <!-- 취급 구분 -->
             , S.EPOST_NOTICE_ID <!-- 전자우편 안내문 ID -->
             , S.SNDNG_STTS_CD  <!-- 발송 상태 코드 -->
             , (GET_CODE_NM('FIM049', S.SNDNG_STTS_CD)) AS SNDNG_STTS_NM    <!-- 발송 상태 명 -->
             , S.RSND_YN        <!-- 재발송 여부 -->
             , S.REG_DT         <!-- 등록 일시 -->
             , S.RGTR           <!-- 등록자 -->
             , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = S.RGTR) AS RGTR_NM  <!-- 등록자 명 -->
             , S.MDFCN_DT       <!-- 수정 일시 -->
             , S.MDFR           <!-- 수정자 -->
             , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = S.MDFR) AS MDFR_NM  <!-- 수정자 명 -->
             , <include refid="utility.today" /> AS TODAY   <!-- 오늘 일자 -->
             , GET_MASK_DATE(<include refid="utility.today" />, 'K') AS TODAY_MASK  <!-- 오늘 일자 한글 마스크 -->
             , <include refid="utility.now" /> AS NOW   <!-- 현재 일시 -->
          FROM TB_SNDNG     S
    LEFT OUTER JOIN TB_VLTN V ON (S.VLTN_ID = V.VLTN_ID AND S.SGG_CD = V.SGG_CD AND S.TASK_SE_CD = V.TASK_SE_CD)
	</sql>

    <select id="selectSndngList" parameterType="map" resultType="dataobject">/* 발송 대장 목록 조회(sndngMapper.selectSndngList) */
        <include refid="utility.paging-prefix" />
        <include refid="selectList" />
        <where>
            <if test="sndngIds != null">AND S.SNDNG_ID IN (<foreach collection="sndngIds" item="sndngId" separator=",">#{sndngId}</foreach>)</if><!-- 발송 Ids -->
            <if test="sndngId != null">AND S.SNDNG_ID = #{sndngId}</if><!-- 발송 ID -->
            <if test="schSndngYmdFrom != null">AND S.SNDNG_YMD <![CDATA[>=]]> #{schSndngYmdFrom} <!-- 발송 일자 시작 --></if>
            <if test="schSndngYmdTo != null">AND S.SNDNG_YMD <![CDATA[<=]]> #{schSndngYmdTo}     <!-- 발송 일자 종료 --></if>
            <if test="schSndngRegSeCd != null">AND S.SNDNG_REG_SE_CD = #{schSndngRegSeCd} <!-- 발송 등록 구분 코드 --></if>
            <if test="schSndngSeCd != null">AND S.SNDNG_SE_CD =  #{schSndngSeCd} <!-- 발송 구분 코드 --></if>
            <if test="sndngSeCd != null">AND S.SNDNG_SE_CD =  #{sndngSeCd} <!-- 발송 구분 코드 --></if>
            <if test="sndngSeCdFrom != null">AND S.SNDNG_SE_CD <![CDATA[>=]]> #{sndngSeCdFrom}    <!-- 발송 구분 코드 시작 --></if>
            <if test="sndngSeCdTo != null">AND S.SNDNG_SE_CD <![CDATA[<=]]> #{sndngSeCdTo}      <!-- 발송 구분 코드 종료 --></if>
            <if test="sggCd != null">AND S.SGG_CD = #{sggCd}     <!-- 시군구 코드 --></if>
            <if test="taskSeCd != null">AND S.TASK_SE_CD = #{taskSeCd}  <!-- 업무 구분 코드 --></if>
           AND S.DEL_YN =  'N'          <!-- 삭제 여부 -->
            <choose>
                <when test="schRegDateOpt == 'regDt'">
                    <if test="schRegDateFrom != null">AND S.REG_DT <![CDATA[>=]]> CONCAT(#{schRegDateFrom},'000000')   <!-- 등록 일자 시작 --></if>
                    <if test="schRegDateTo != null">AND S.REG_DT <![CDATA[<=]]> CONCAT(#{schRegDateTo},'235959')     <!-- 등록 일자 종료 --></if>
                </when>
                <when test="schRegDateOpt == 'mdfcnDt'">
                    <if test="schRegDateFrom != null">AND S.MDFCN_DT <![CDATA[>=]]> CONCAT(#{schRegDateFrom},'000000') <!-- 수정 일자 시작 --></if>
                    <if test="schRegDateTo != null">AND S.MDFCN_DT <![CDATA[<=]]> CONCAT(#{schRegDateTo},'235959')   <!-- 수정 일자 종료 --></if>
                </when>
                <otherwise>
                </otherwise>
            </choose>
            <choose>
                <when test="schRgtrOpt == 'rgtr'">
                    <if test="schRgtrCd != null">AND S.RGTR =  #{schRgtrCd} <!-- 등록자 코드 --></if>
                </when>
                <when test="schRgtrOpt == 'mdfr'">
                    <if test="schRgtrCd != null">AND S.MDFR =  #{schRgtrCd} <!-- 수정자 코드 --></if>
                </when>
                <otherwise>
                </otherwise>
            </choose>
            <if test="@org.egovframe.rte.fdl.string.EgovStringUtil@isNotEmpty(by) and @org.egovframe.rte.fdl.string.EgovStringUtil@isNotEmpty(term)">
                <choose>
                    <when test="mainOption == 'codeValue' or mainOption == 'match' or mainOption == 'ymd'">
                        <include refid="dynamicSearch.start" />
                        <choose>
                            <when test="by == 'taskSeCd'"> S.TASK_SE_CD </when>
                            <when test="by == 'sndngRegSeCd'"> S.SNDNG_REG_SE_CD </when>
                            <when test="by == 'sndngSeCd'"> S.SNDNG_SE_CD </when>
                            <when test="by == 'sndngYmd'"> S.SNDNG_YMD </when>
                            <when test="by == 'dudtYmd'"> S.DUDT_YMD </when>
                            <when test="by == 'ttlNm'"> S.TTL_NM </when>
                            <when test="by == 'docNo'"> S.DOC_NO </when>
                            <when test="by == 'etcCn'"> S.ETC_CN </when>
                            <when test="by == 'tnocs'"> S.TNOCS </when>
                            <when test="by == 'gramt'"> S.GRAMT </when>
                            <when test="by == 'sndngSttsCd'"> S.SNDNG_STTS_CD </when>
                        </choose>
                        <include refid="dynamicSearch.center" />#{term}<include refid="dynamicSearch.end" />
                    </when>
                    <otherwise>
                    </otherwise>
                </choose>
            </if>
        </where>
        <include refid="utility.orderBy" />
        <include refid="utility.paging-suffix" />
    </select>

    <select id="selectSndngs" parameterType="map" resultMap="sndngRow">/* 발송 대장 객체 가져오기(sndngMapper.selectSndngs) */
        <include refid="selectList" />
        <where>
            <if test="sndngIds != null">AND S.SNDNG_ID IN (<foreach collection="sndngIds" item="sndngId" separator=",">#{sndngId}</foreach>)</if><!-- 발송 Ids -->
            <if test="sndngId != null">AND S.SNDNG_ID = #{sndngId}</if><!-- 발송 ID -->
            <choose>
                <when test="delYn != null">
           AND S.DEL_YN     =  #{delYn}     <!-- 삭제 여부 -->
                </when>
                <otherwise>
           AND S.DEL_YN     =  'N'          <!-- 삭제 여부 -->
                </otherwise>
            </choose>
        </where>
        <include refid="utility.orderBy" />
    </select>

    <sql id="selectWrngTrgt">
             , C.SGG_CD             <!-- 시군구 코드 -->
             , C.TASK_SE_CD         <!-- 업무 구분 코드 -->
             , (GET_CODE_NM('FIM054', C.TASK_SE_CD)) AS TASK_SE_NM  <!-- 업무 구분 명 -->
             , C.CRDN_REG_SE_CD     <!-- 단속 등록 구분 코드 -->
             , (GET_CODE_NM('FIM026', C.CRDN_REG_SE_CD)) AS CRDN_REG_SE_NM  <!-- 단속 등록 구분 명 -->
             , C.CRDN_INPT_SE_CD    <!-- 단속 입력 구분 코드 -->
             , (GET_CODE_NM('FIM003', C.CRDN_INPT_SE_CD)) AS CRDN_INPT_SE_NM    <!-- 단속 입력 구분 명 -->
             , C.CRDN_YMD           <!-- 단속 일자 -->
             , C.CRDN_TM            <!-- 단속 시각 -->
             , (CONCAT(C.CRDN_YMD, C.CRDN_TM)) AS CRDN_YMD_TM   <!-- 단속 일시 -->
             , (GET_MASK_DATETIME(C.CRDN_YMD, '-', C.CRDN_TM, ':')) AS CRDN_YMD_TM_MASK <!-- 단속 일시 마스크 -->
             , C.VHRNO              <!-- 차량번호 -->
             , C.CRDN_STDG_NM       <!-- 단속 법정동 명 -->
             , C.CRDN_ROAD_NM       <!-- 단속 도로 명 -->
             , C.CRDN_PLC           <!-- 단속 장소 -->
             , C.FFNLG_CRDN_AMT     <!-- 과태료 단속 금액 -->
             , C.CRDN_STTS_CD       <!-- 단속 상태 코드 -->
             , (GET_CODE_NM('FIM010', C.CRDN_STTS_CD)) AS CRDN_STTS_NM  <!-- 단속 상태 명 -->
             , C.CRDN_STTS_CHG_DT   <!-- 단속 상태 변경 일시 -->
             , CA.CRDN_SE_CD        <!-- 단속 구분 코드 -->
             , (GET_CODE_NM('FIM002', CA.CRDN_SE_CD)) AS CRDN_SE_NM <!-- 단속 구분 명 -->
             , CA.DTL_CRDN_PLC      <!-- 상세 단속 장소 -->
             , CA.CRDN_SPAREA_CD    <!-- 단속 특별구역 코드 -->
             , (GET_CODE_NM('FIM007', CA.CRDN_SPAREA_CD)) AS CRDN_SPAREA_NM <!-- 단속 특별구역 명 -->
             , CA.CRDN_BGNG_TM      <!-- 단속 시작 시각 -->
             , CA.CRDN_END_TM       <!-- 단속 종료 시각 -->
             , CA.CRDN_SN           <!-- 단속 일련번호 -->
             , CA.USE_FUEL_CD       <!-- 사용 연료 코드 -->
             , (GET_CODE_NM('LVS005', CA.USE_FUEL_CD)) AS USE_FUEL_NM   <!-- 사용 연료 명 -->
             , CA.FFNLG_CARMDL_CD   <!-- 과태료 차종 코드 -->
             , (GET_CODE_NM('FIM009', CA.FFNLG_CARMDL_CD)) AS FFNLG_CARMDL_NM   <!-- 과태료 차종 명 -->
             , CA.PRK_PSBLTY_RSLT_CD <!-- 주차 가능 결과 코드 -->
             , (GET_CODE_NM('FIM034', CA.PRK_PSBLTY_RSLT_CD)) AS PRK_PSBLTY_RSLT_NM <!-- 주차 가능 결과 명 -->
             , CA.VLTN_NMTM         <!-- 위반 횟수 -->
             , CA.OVTM_YN           <!-- 시간외 여부 -->
             , V.VLTN_ID            <!-- 위반 ID -->
             , V.VLTN_CD            <!-- 위반 코드 -->
             , V.VLTN_ARTCL         <!-- 위반 항목 -->
             , CC.CVLCPT_LINK_ID    <!-- 민원 연계 ID -->
             , CC.CVLCPT_RCPT_YMD   <!-- 민원 접수 일자 -->
             , CC.CVLCPT_APLY_NO    <!-- 민원 신청 번호 -->
             , CC.CVLCPT_RCPT_NO    <!-- 민원 접수 번호 -->
             , CC.CVLCPT_APLCNT_NM  <!-- 민원 신청인 명 -->
             , CC.CVLCPT_APLY_DT    <!-- 민원 신청 일시 -->
             , CC.CVLCPT_PRCS_PIC_NM <!-- 민원 처리 담당자 명 -->
             , CC.CVLCPT_PRCS_CD    <!-- 민원 처리 코드 -->
             , (GET_CODE_NM('FIM017', CC.CVLCPT_PRCS_CD)) AS CVLCPT_PRCS_NM <!-- 민원 처리 명 -->
             , CC.CVLCPT_PRCS_CMPTN_DT  <!-- 민원 처리 완료 일시 -->
             , P.RTPYR_ID           <!-- 납부자 ID -->
             , P.RTPYR_SE_CD        <!-- 납부자 구분 코드 -->
             , (GET_CODE_NM('FIM011', P.RTPYR_SE_CD)) AS RTPYR_SE_NM    <!-- 납부자 구분 명 -->
             , P.RTPYR_NO           <!-- 납부자 번호 -->
             , P.RTPYR_NM           <!-- 납부자 명 -->
             , P.RTPYR_BRDT         <!-- 납부자 생년월일 -->
             , (GET_BRDT_FORMAT(P.RTPYR_BRDT, '.')) AS RTPYR_BRDT_MASK  <!-- 납부자 생년월일 마스크 -->
             , PA.ZIP               <!-- 우편번호 -->
             , PA.ADDR              <!-- 주소 -->
             , PA.DTL_ADDR          <!-- 상세 주소 -->
             , LE.LEVY_EXCL_ID      <!-- 부과 제외 ID -->
             , LE.LEVY_EXCL_YMD     <!-- 부과 제외 일자 -->
             , LE.LEVY_EXCL_RSN_CD  <!-- 부과 제외 사유 코드 -->
             , (GET_CODE_NM('FIM022', LE.LEVY_EXCL_RSN_CD)) AS LEVY_EXCL_RSN_NM <!-- 부과 제외 사유 명 -->
             , LE.ETC_CN            <!-- 기타 내용 -->
             , LE.REG_DT            <!-- 등록 일시 -->
             , LE.RGTR              <!-- 등록자 -->
             , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = LE.RGTR) AS RGTR_NM <!-- 등록자 명 -->
             , LE.MDFCN_DT          <!-- 수정 일시 -->
             , LE.MDFR              <!-- 수정자 -->
             , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = LE.MDFR) AS MDFR_NM <!-- 수정자 명 -->
	</sql>

    <sql id="fromWrngTrgt">
          FROM TB_CRDN              C
         INNER JOIN TB_CRDN_ADI     CA  ON (C.CRDN_ID  = CA.CRDN_ID)
         INNER JOIN TB_VLTN         V   ON (C.VLTN_ID  = V.VLTN_ID)
    LEFT OUTER JOIN TB_CRDN_CVLCPT  CC  ON (C.CVLCPT_LINK_YN = 'Y' AND C.CVLCPT_LINK_ID = CC.CVLCPT_LINK_ID AND CC.DEL_YN = 'N')
    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)
    LEFT OUTER JOIN TB_LEVY_EXCL    LE  ON (C.CRDN_ID  = LE.CRDN_ID  AND LE.DEL_YN = 'N')
     <if test="crdnIds != null">
    WHERE C.CRDN_ID    IN (            <!-- 단속 IDs -->
         <foreach collection="crdnIds" item="crdnId" separator=","> #{crdnId} </foreach>
          )
     </if>
     <if test="crdnId != null">
    WHERE C.CRDN_ID    =  #{crdnId}    <!-- 단속 ID -->
     </if>
     <if test='crdnIds == null and crdnId == null'>
        <where>
            <if test="crdnSttsCd != null">
           AND C.CRDN_STTS_CD   =  #{crdnSttsCd}    <!-- 단속 상태 코드 -->
            </if>
            <if test="schLevyExclYmdFrom != null">
           AND LE.LEVY_EXCL_YMD <![CDATA[>=]]> #{schLevyExclYmdFrom}    <!-- 부과제외 일자 시작 -->
            </if>
            <if test="schLevyExclYmdTo != null">
           AND LE.LEVY_EXCL_YMD <![CDATA[<=]]> #{schLevyExclYmdTo}      <!-- 부과제외 일자 종료 -->
            </if>
            <if test="schLevyExclRsnCd != null">
           AND LE.LEVY_EXCL_RSN_CD  = #{schLevyExclRsnCd}   <!-- 부과제외 사유 코드 -->
            </if>
            <if test="schVltnCd != null">
           AND V.SGG_CD     = #{sggCd}      <!-- 시군구 코드 -->
           AND V.TASK_SE_CD = #{taskSeCd}   <!-- 업무 구분 코드 -->
           AND V.VLTN_CD    = #{schVltnCd}  <!-- 부과제외 사유 코드 -->
           AND V.USE_YN     = 'Y'           <!-- 사용 여부 -->
            </if>
            <if test="schCrdnYmdFrom != null">
           AND C.CRDN_YMD <![CDATA[>=]]> #{schCrdnYmdFrom}  <!-- 단속 일자 시작 -->
            </if>
            <if test="schCrdnYmdTo != null">
           AND C.CRDN_YMD <![CDATA[<=]]> #{schCrdnYmdTo}    <!-- 단속 일자 종료 -->
            </if>
            <if test="schVhrno != null">
           AND C.VHRNO      =  #{schVhrno}  <!-- 차량번호 -->
            </if>
            <if test="schRtpyrNo != null">
           AND P.RTPYR_NO   =  #{schRtpyrNo}    <!-- 납부자 번호 -->
            </if>
            <if test="schRtpyrNm != null">
           AND P.RTPYR_NM   =  #{schRtpyrNm}    <!-- 납부자 명 -->
            </if>
            <if test="sggCd != null">
           AND C.SGG_CD     =  #{sggCd}     <!-- 시군구 코드 -->
            </if>
            <if test="taskSeCd != null">
           AND C.TASK_SE_CD =  #{taskSeCd}  <!-- 업무 구분 코드 -->
            </if>
           AND C.DEL_YN     =  'N'          <!-- 삭제 여부 -->
             <choose>
                <when test="schRegDateOpt == 'regDt'">
                    <if test="schRegDateFrom != null">
           AND LE.REG_DT <![CDATA[>=]]> CONCAT(#{schRegDateFrom},'000000')      <!-- 등록 일자 시작 -->
                    </if>
                    <if test="schRegDateTo != null">
           AND LE.REG_DT <![CDATA[<=]]> CONCAT(#{schRegDateTo},'235959')        <!-- 등록 일자 종료 -->
                    </if>
                </when>
                <when test="schRegDateOpt == 'mdfcnDt'">
                    <if test="schRegDateFrom != null">
           AND LE.MDFCN_DT <![CDATA[>=]]> CONCAT(#{schRegDateFrom},'000000')    <!-- 수정 일자 시작 -->
                    </if>
                    <if test="schRegDateTo != null">
           AND LE.MDFCN_DT <![CDATA[<=]]> CONCAT(#{schRegDateTo},'235959')      <!-- 수정 일자 종료 -->
                    </if>
                </when>
                <otherwise>
                </otherwise>
            </choose>
            <choose>
                <when test="schRgtrOpt == 'rgtr'">
                    <if test="schRgtrCd != null">
           AND LE.RGTR      =  #{schRgtrCd} <!-- 등록자 코드 -->
                    </if>
                </when>
                <when test="schRgtrOpt == 'mdfr'">
                    <if test="schRgtrCd != null">
           AND LE.MDFR      =  #{schRgtrCd} <!-- 수정자 코드 -->
                    </if>
                </when>
                <otherwise>
                </otherwise>
            </choose>
            <if test="@org.egovframe.rte.fdl.string.EgovStringUtil@isNotEmpty(by) and @org.egovframe.rte.fdl.string.EgovStringUtil@isNotEmpty(term)">
                <choose>
                    <when test="mainOption == 'codeValue' or mainOption == 'match' or mainOption == 'ymd'">
                        <include refid="dynamicSearch.start" />
                        <choose>
                            <when test="by == 'crdnRegSeCd'"> C.CRDN_REG_SE_CD </when>
                            <when test="by == 'crdnInptSeCd'"> C.CRDN_INPT_SE_CD </when>
                            <when test="by == 'crdnYmd'"> C.CRDN_YMD </when>
                            <when test="by == 'vhrno'"> C.VHRNO </when>
                            <when test="by == 'crdnStdgNm'"> C.CRDN_STDG_NM </when>
                            <when test="by == 'crdnRoadNm'"> C.CRDN_ROAD_NM </when>
                            <when test="by == 'crdnPlc'"> C.CRDN_PLC </when>
                            <when test="by == 'ffnlgCrdnAmt'"> C.FFNLG_CRDN_AMT </when>
                            <when test="by == 'ffnlgAmt'"> C.FFNLG_AMT </when>
                            <when test="by == 'advntceAmt'"> C.ADVNTCE_AMT </when>
                            <when test="by == 'opnnSbmsnYn'"> C.OPNN_SBMSN_YN </when>
                            <when test="by == 'crdnSttsCd'"> C.CRDN_STTS_CD </when>
                            <when test="by == 'crdnSeCd'"> CA.CRDN_SE_CD </when>
                            <when test="by == 'dtlCrdnPlc'"> CA.DTL_CRDN_PLC </when>
                            <when test="by == 'crdnSpareaCd'"> CA.CRDN_SPAREA_CD </when>
                            <when test="by == 'crdnBgngTm'"> CA.CRDN_BGNG_TM </when>
                            <when test="by == 'crdnEndTm'"> CA.CRDN_END_TM </when>
                            <when test="by == 'crdnSn'"> CA.CRDN_SN </when>
                            <when test="by == 'useFuelCd'"> CA.USE_FUEL_CD </when>
                            <when test="by == 'ffnlgCarmdlCd'"> CA.FFNLG_CARMDL_CD </when>
                            <when test="by == 'prkPsbltyRsltCd'"> CA.PRK_PSBLTY_RSLT_CD </when>
                            <when test="by == 'vltnNmtm'"> CA.VLTN_NMTM </when>
                            <when test="by == 'ovtmYn'"> CA.OVTM_YN </when>
                            <when test="by == 'vltnArtcl'"> V.VLTN_ARTCL </when>
                            <when test="by == 'rtpyrNm'"> P.RTPYR_NM </when>
                            <when test="by == 'rtpyrNo'"> P.RTPYR_NO </when>
                            <when test="by == 'zip'"> PA.ZIP </when>
                            <when test="by == 'addr'"> PA.ADDR </when>
                            <when test="by == 'dtlAddr'"> PA.DTL_ADDR </when>
                            <when test="by == 'cvlcptAplyNo'"> CC.CVLCPT_APLY_NO </when>
                            <when test="by == 'cvlcptRcptNo'"> CC.CVLCPT_RCPT_NO </when>
                            <when test="by == 'cvlcptRcptYmd'"> CC.CVLCPT_RCPT_YMD </when>
                            <when test="by == 'cvlcptPrcsPicNm'"> CC.CVLCPT_PRCS_PIC_NM </when>
                            <when test="by == 'cvlcptPrcsCd'"> CC.CVLCPT_PRCS_CD </when>
                            <when test="by == 'cvlcptTrsmCd'"> CC.CVLCPT_TRSM_CD </when>
                            <when test="by == 'levyExclYmd'"> LE.LEVY_EXCL_YMD </when>
                            <when test="by == 'levyExclRsnCd'"> LE.LEVY_EXCL_RSN_CD </when>
                            <when test="by == 'etcCn'"> LE.ETC_CN </when>
                        </choose>
                        <include refid="dynamicSearch.center" />#{term}<include refid="dynamicSearch.end" />
                    </when>
                    <otherwise>
                    </otherwise>
                </choose>
            </if>
        </where>
        </if>
	</sql>

    <select id="selectWrngTrgtList" parameterType="map" resultType="dataobject">/* 계고장 발송 대상 목록 조회(sndngMapper.selectWrngTrgtList) */
        <include refid="utility.paging-prefix" />
        SELECT C.CRDN_ID                                <!-- 단속 ID -->
             , SUM(C.FFNLG_CRDN_AMT) OVER() AS GRAMT    <!-- 총금액 -->
        <include refid="selectWrngTrgt" />
        <include refid="fromWrngTrgt" />
        <include refid="utility.orderBy" />
        <include refid="utility.paging-suffix" />
    </select>

    <select id="selectWrngTrgts" parameterType="map" resultType="dataobject">/* 계고장 발송 대상 객체 가져오기(sndngMapper.selectWrngTrgts) */
        SELECT C.CRDN_ID        <!-- 단속 ID -->
        <include refid="selectWrngTrgt" />
        <include refid="fromWrngTrgt" />
        <include refid="utility.orderBy" />
    </select>

    <select id="selectWrngTrgtCrdnIds" parameterType="map" resultType="dataobject">/* 계고장 발송 대상 단속ID 가져오기(sndngMapper.selectWrngTrgtCrdnIds) */
        SELECT C.CRDN_ID        <!-- 단속 ID -->
        <include refid="fromWrngTrgt" />
        <include refid="utility.orderBy" />
    </select>

    <sql id="selectAdvntceTrgt">
             , C.SGG_CD         <!-- 시군구 코드 -->
             , C.TASK_SE_CD     <!-- 업무 구분 코드 -->
             , (GET_CODE_NM('FIM054', C.TASK_SE_CD)) AS TASK_SE_NM  <!-- 업무 구분 명 -->
             , C.CRDN_INPT_SE_CD <!-- 단속 입력 구분 코드 -->
             , (GET_CODE_NM('FIM003', C.CRDN_INPT_SE_CD)) AS CRDN_INPT_SE_NM    <!-- 단속 입력 구분 명 -->
             , C.CRDN_YMD       <!-- 단속 일자 -->
             , (CONCAT(C.CRDN_YMD, C.CRDN_TM)) AS CRDN_YMD_TM  <!-- 단속 일시 -->
             , C.VHRNO          <!-- 차량번호 -->
             , C.CRDN_STDG_NM   <!-- 단속 법정동 명 -->
             , C.CRDN_ROAD_NM   <!-- 단속 도로 명 -->
             , C.CRDN_PLC       <!-- 단속 장소 -->
             , C.FFNLG_CRDN_AMT <!-- 과태료 단속 금액 -->
             , C.FFNLG_AMT      <!-- 과태료 금액 -->
             , C.ADVNTCE_AMT    <!-- 사전통지 금액 -->
             , C.CRDN_STTS_CD   <!-- 단속 상태 코드 -->
             , (GET_CODE_NM('FIM010', C.CRDN_STTS_CD)) AS CRDN_STTS_NM  <!-- 단속 상태 명 -->
             , C.REG_DT         <!-- 등록 일시 -->
             , C.RGTR           <!-- 등록자 -->
             , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = C.RGTR) AS RGTR_NM  <!-- 등록자 명 -->
             , C.MDFCN_DT       <!-- 수정 일시 -->
             , C.MDFR           <!-- 수정자 -->
             , (SELECT USER_NM FROM TB_USER X WHERE X.USER_ID = C.MDFR) AS MDFR_NM  <!-- 수정자 명 -->
             , CA.CRDN_SE_CD    <!-- 단속 구분 코드 -->
             , (GET_CODE_NM('FIM002', CA.CRDN_SE_CD)) AS CRDN_SE_NM <!-- 단속 구분 명 -->
             , CA.DTL_CRDN_PLC  <!-- 상세 단속 장소 -->
             , CA.CRDN_SPAREA_CD <!-- 단속 특별구역 코드 -->
             , (GET_CODE_NM('FIM007', CA.CRDN_SPAREA_CD)) AS CRDN_SPAREA_NM <!-- 단속 특별구역 명 -->
             , CA.CRDN_BGNG_TM  <!-- 단속 시작 시각 -->
             , CA.CRDN_END_TM   <!-- 단속 종료 시각 -->
             , CA.CRDN_SN       <!-- 단속 일련번호 -->
             , CA.USE_FUEL_CD   <!-- 사용 연료 코드 -->
             , (GET_CODE_NM('LVS005', CA.USE_FUEL_CD)) AS USE_FUEL_NM   <!-- 사용 연료 명 -->
             , CA.FFNLG_CARMDL_CD   <!-- 과태료 차종 코드 -->
             , (GET_CODE_NM('FIM009', CA.FFNLG_CARMDL_CD)) AS FFNLG_CARMDL_NM   <!-- 과태료 차종 명 -->
             , CA.PRK_PSBLTY_RSLT_CD <!-- 주차 가능 결과 코드 -->
             , (GET_CODE_NM('FIM034', CA.PRK_PSBLTY_RSLT_CD)) AS PRK_PSBLTY_RSLT_NM <!-- 주차 가능 결과 명 -->
             , CA.VLTN_NMTM     <!-- 위반 횟수 -->
             , CA.OVTM_YN       <!-- 시간외 여부 -->
             , V.VLTN_ID        <!-- 위반 ID -->
             , V.VLTN_CD        <!-- 위반 코드 -->
             , V.VLTN_ARTCL     <!-- 위반 항목 -->
             , CC.CVLCPT_LINK_ID    <!-- 민원 연계 ID -->
             , CC.CVLCPT_RCPT_YMD   <!-- 민원 접수 일자 -->
             , CC.CVLCPT_APLY_NO    <!-- 민원 신청 번호 -->
             , CC.CVLCPT_RCPT_NO    <!-- 민원 접수 번호 -->
             , CC.CVLCPT_APLCNT_NM  <!-- 민원 신청인 명 -->
             , CC.CVLCPT_APLY_DT    <!-- 민원 신청 일시 -->
             , CC.CVLCPT_PRCS_PIC_NM <!-- 민원 처리 담당자 명 -->
             , CC.CVLCPT_PRCS_CD    <!-- 민원 처리 코드 -->
             , (GET_CODE_NM('FIM017', CC.CVLCPT_PRCS_CD)) AS CVLCPT_PRCS_NM <!-- 민원 처리 명 -->
             , CC.CVLCPT_PRCS_CMPTN_DT  <!-- 민원 처리 완료 일시 -->
             , P.RTPYR_ID       <!-- 납부자 ID -->
             , P.RTPYR_SE_CD    <!-- 납부자 구분 코드 -->
             , (GET_CODE_NM('FIM011', P.RTPYR_SE_CD)) AS RTPYR_SE_NM    <!-- 납부자 구분 명 -->
             , P.RTPYR_NO       <!-- 납부자 번호 -->
             , P.RTPYR_NM       <!-- 납부자 명 -->
             , P.RTPYR_BRDT     <!-- 납부자 생년월일 -->
             , (GET_BRDT_FORMAT(P.RTPYR_BRDT, '.')) AS RTPYR_BRDT_MASK  <!-- 납부자 생년월일 마스크 -->
             , PA.ADDR_SN       <!-- 주소 일련번호 -->
             , PA.ZIP           <!-- 우편번호 -->
             , PA.ADDR          <!-- 주소 -->
             , PA.DTL_ADDR      <!-- 상세 주소 -->
	</sql>

    <sql id="fromAdvntceTrgt">
          FROM TB_CRDN              C
         INNER JOIN TB_CRDN_ADI     CA  ON (C.CRDN_ID  = CA.CRDN_ID)
         INNER JOIN TB_VLTN         V   ON (C.VLTN_ID  = V.VLTN_ID AND C.SGG_CD = V.SGG_CD AND C.TASK_SE_CD = V.TASK_SE_CD)
    LEFT OUTER JOIN TB_CRDN_CVLCPT  CC  ON (C.CVLCPT_LINK_YN = 'Y' AND C.CVLCPT_LINK_ID = CC.CVLCPT_LINK_ID AND CC.DEL_YN = 'N')
    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>
            <if test="crdnIds != null">
           AND C.CRDN_ID    IN (            <!-- 단속 Ids -->
                <foreach collection="crdnIds" item="crdnId" separator=","> #{crdnId} </foreach>
                 )
            </if>
            <if test="crdnId != null">
           AND C.CRDN_ID    =  #{crdnId}    <!-- 단속 ID -->
            </if>
            <if test="crdnSttsCdFrom != null">
           AND C.CRDN_STTS_CD <![CDATA[>=]]> #{crdnSttsCdFrom}  <!-- 단속 상태 코드 시작 -->
            </if>
            <if test="crdnSttsCdTo != null">
           AND C.CRDN_STTS_CD <![CDATA[<=]]> #{crdnSttsCdTo}    <!-- 단속 상태 코드 종료 -->
            </if>
            <if test="schCrdnYmdFrom != null">
           AND C.CRDN_YMD <![CDATA[>=]]> #{schCrdnYmdFrom}  <!-- 단속 일자 시작 -->
            </if>
            <if test="schCrdnYmdTo != null">
           AND C.CRDN_YMD <![CDATA[<=]]> #{schCrdnYmdTo}    <!-- 단속 일자 종료 -->
            </if>
            <if test="schVltnCd != null">
           AND V.VLTN_CD    =  #{schVltnCd} <!-- 위반 코드 -->
            </if>
            <if test="schVhrno != null">
           AND C.VHRNO      =  #{schVhrno}  <!-- 차량번호 -->
            </if>
            <if test="schRtpyrNm != null">
           AND P.RTPYR_NM   =  #{schRtpyrNm}<!-- 납부자 명 -->
            </if>
            <if test="sggCd != null">
           AND C.SGG_CD     =  #{sggCd}     <!-- 시군구 코드 -->
            </if>
            <if test="taskSeCd != null">
           AND C.TASK_SE_CD =  #{taskSeCd}  <!-- 업무 구분 코드 -->
            </if>
           AND (CC.CVLCPT_PRCS_CD IS NULL OR CC.CVLCPT_PRCS_CD <![CDATA[ <> ]]> '00')   <!-- 민원 처리 코드 -->
           AND C.DEL_YN     =  'N'          <!-- 삭제 여부 -->
            <choose>
                <when test="schRegDateOpt == 'regDt'">
                    <if test="schRegDateFrom != null">
           AND C.REG_DT <![CDATA[>=]]> CONCAT(#{schRegDateFrom},'000000')       <!-- 등록 일자 시작 -->
                    </if>
                    <if test="schRegDateTo != null">
           AND C.REG_DT <![CDATA[<=]]> CONCAT(#{schRegDateTo},'235959')         <!-- 등록 일자 종료 -->
                    </if>
                </when>
                <when test="schRegDateOpt == 'mdfcnDt'">
                    <if test="schRegDateFrom != null">
           AND C.MDFCN_DT <![CDATA[>=]]> CONCAT(#{schRegDateFrom},'000000')     <!-- 수정 일자 시작 -->
                    </if>
                    <if test="schRegDateTo != null">
           AND C.MDFCN_DT <![CDATA[<=]]> CONCAT(#{schRegDateTo},'235959')       <!-- 수정 일자 종료 -->
                    </if>
                </when>
                <otherwise>
                </otherwise>
            </choose>
            <choose>
                <when test="schRgtrOpt == 'rgtr'">
                    <if test="schRgtrCd != null">
           AND C.RGTR       =  #{schRgtrCd} <!-- 등록자 코드 -->
                    </if>
                </when>
                <when test="schRgtrOpt == 'mdfr'">
                    <if test="schRgtrCd != null">
           AND C.MDFR       =  #{schRgtrCd} <!-- 수정자 코드 -->
                    </if>
                </when>
                <otherwise>
                </otherwise>
            </choose>
            <if test="@org.egovframe.rte.fdl.string.EgovStringUtil@isNotEmpty(by) and @org.egovframe.rte.fdl.string.EgovStringUtil@isNotEmpty(term)">
                <choose>
                    <when test="mainOption == 'codeValue' or mainOption == 'match' or mainOption == 'ymd'">
                        <include refid="dynamicSearch.start" />
                        <choose>
                            <when test="by == 'crdnRegSeCd'"> C.CRDN_REG_SE_CD </when>
                            <when test="by == 'crdnInptSeCd'"> C.CRDN_INPT_SE_CD </when>
                            <when test="by == 'crdnYmd'"> C.CRDN_YMD </when>
                            <when test="by == 'vhrno'"> C.VHRNO </when>
                            <when test="by == 'crdnStdgNm'"> C.CRDN_STDG_NM </when>
                            <when test="by == 'crdnRoadNm'"> C.CRDN_ROAD_NM </when>
                            <when test="by == 'crdnPlc'"> C.CRDN_PLC </when>
                            <when test="by == 'ffnlgCrdnAmt'"> C.FFNLG_CRDN_AMT </when>
                            <when test="by == 'ffnlgAmt'"> C.FFNLG_AMT </when>
                            <when test="by == 'advntceAmt'"> C.ADVNTCE_AMT </when>
                            <when test="by == 'opnnSbmsnYn'"> C.OPNN_SBMSN_YN </when>
                            <when test="by == 'crdnSttsCd'"> C.CRDN_STTS_CD </when>
                            <when test="by == 'crdnSeCd'"> CA.CRDN_SE_CD </when>
                            <when test="by == 'dtlCrdnPlc'"> CA.DTL_CRDN_PLC </when>
                            <when test="by == 'crdnSpareaCd'"> CA.CRDN_SPAREA_CD </when>
                            <when test="by == 'crdnBgngTm'"> CA.CRDN_BGNG_TM </when>
                            <when test="by == 'crdnEndTm'"> CA.CRDN_END_TM </when>
                            <when test="by == 'crdnSn'"> CA.CRDN_SN </when>
                            <when test="by == 'useFuelCd'"> CA.USE_FUEL_CD </when>
                            <when test="by == 'ffnlgCarmdlCd'"> CA.FFNLG_CARMDL_CD </when>
                            <when test="by == 'prkPsbltyRsltCd'"> CA.PRK_PSBLTY_RSLT_CD </when>
                            <when test="by == 'vltnNmtm'"> CA.VLTN_NMTM </when>
                            <when test="by == 'ovtmYn'"> CA.OVTM_YN </when>
                            <when test="by == 'vltnArtcl'"> V.VLTN_ARTCL </when>
                            <when test="by == 'rtpyrNm'"> P.RTPYR_NM </when>
                            <when test="by == 'rtpyrNo'"> P.RTPYR_NO </when>
                            <when test="by == 'rtpyrBrdt'"> P.RTPYR_BRDT </when>
                            <when test="by == 'zip'"> PA.ZIP </when>
                            <when test="by == 'addr'"> PA.ADDR </when>
                            <when test="by == 'dtlAddr'"> PA.DTL_ADDR </when>
                            <when test="by == 'cvlcptAplyNo'"> CC.CVLCPT_APLY_NO </when>
                            <when test="by == 'cvlcptRcptNo'"> CC.CVLCPT_RCPT_NO </when>
                            <when test="by == 'cvlcptRcptYmd'"> CC.CVLCPT_RCPT_YMD </when>
                            <when test="by == 'cvlcptPrcsPicNm'"> CC.CVLCPT_PRCS_PIC_NM </when>
                            <when test="by == 'cvlcptPrcsCd'"> CC.CVLCPT_PRCS_CD </when>
                            <when test="by == 'cvlcptTrsmCd'"> CC.CVLCPT_TRSM_CD </when>
                        </choose>
                        <include refid="dynamicSearch.center" />#{term}<include refid="dynamicSearch.end" />
                    </when>
                    <otherwise>
                    </otherwise>
                </choose>
            </if>
        </where>
    </sql>

    <select id="selectAdvntceTrgtList" parameterType="map" resultType="dataobject">/* 사전통지 발송 대상 목록 조회(sndngMapper.selectAdvntceSndngTrgtList) */
        <include refid="utility.paging-prefix" />
        SELECT C.CRDN_ID    <!-- 단속 ID -->
             , SUM(C.ADVNTCE_AMT) OVER() AS GRAMT   <!-- 사전통지 총금액 -->
        <include refid="selectAdvntceTrgt" />
        <include refid="fromAdvntceTrgt" />
        <include refid="utility.orderBy" />
        <include refid="utility.paging-suffix" />
    </select>

    <select id="selectAdvntceTrgts" parameterType="map" resultType="dataobject">/* 사전통지 발송 대상 객체 가져오기(sndngMapper.selectAdvntceSndngTrgts) */
        SELECT C.CRDN_ID    <!-- 단속 ID -->
        <include refid="selectAdvntceTrgt" />
        <include refid="fromAdvntceTrgt" />
        <include refid="utility.orderBy" />
    </select>

    <select id="selectAdvntceTrgtCrdnIds" parameterType="map" resultType="dataobject">/* 사전통지 발송 대상 단속ID 가져오기(sndngMapper.selectAdvntceTrgtCrdnIds) */
        SELECT C.CRDN_ID    <!-- 단속 ID -->
             , SUM(C.ADVNTCE_AMT) OVER() AS GRAMT   <!-- 사전통지 총금액 -->
        <include refid="fromAdvntceTrgt" />
        <include refid="utility.orderBy" />
    </select>

    <sql id="selectNhtTrgt">
             , L.SGG_CD         <!-- 시군구 코드 -->
             , L.TASK_SE_CD     <!-- 업무 구분 코드 -->
             , L.INST_CD        <!-- 기관 코드 -->
             , L.DEPT_CD        <!-- 부서 코드 -->
             , L.SPCL_BIZ_CD    <!-- 특별회계 사업 코드 -->
             , L.FYR            <!-- 회계연도 -->
             , L.ACNTG_SE_CD    <!-- 회계 구분 코드 -->
             , L.TXITM_CD       <!-- 세목 코드 -->
             , L.OPER_ITEM_CD   <!-- 운영 항목 코드 -->
             , L.LEVY_NO        <!-- 부과 번호 -->
             , L.ISPY_SN        <!-- 분납 일련번호 -->
             , C.CRDN_ID        <!-- 단속 ID -->
             , C.CRDN_INPT_SE_CD <!-- 단속 입력 구분 코드 -->
             , C.CRDN_YMD       <!-- 단속 일자 -->
             , C.CRDN_TM        <!-- 단속 시각 -->
             , C.VHRNO          <!-- 차량번호 -->
             , C.CRDN_STDG_NM   <!-- 단속 법정동 명 -->
             , C.CRDN_ROAD_NM   <!-- 단속 도로 명 -->
             , C.CRDN_PLC       <!-- 단속 장소 -->
             , C.FFNLG_CRDN_AMT <!-- 과태료 단속 금액 -->
             , C.FFNLG_AMT      <!-- 과태료 금액 -->
             , C.ADVNTCE_AMT    <!-- 사전통지 금액 -->
             , C.CRDN_STTS_CD   <!-- 단속 상태 코드 -->
             , P.RTPYR_ID       <!-- 납부자 ID -->
             , P.RTPYR_SE_CD    <!-- 납부자 구분 코드 -->
             , (GET_CODE_NM('FIM011', P.RTPYR_SE_CD)) AS RTPYR_SE_NM    <!-- 납부자 구분 명 -->
             , P.RTPYR_NO       <!-- 납부자 번호 -->
             , P.RTPYR_NM       <!-- 납부자 명 -->
             , P.RTPYR_BRDT     <!-- 납부자 생년월일 -->
             , PA.ADDR_SN       <!-- 주소 일련번호 -->
             , PA.ZIP           <!-- 우편번호 -->
             , PA.ADDR          <!-- 주소 -->
             , PA.DTL_ADDR      <!-- 상세 주소 -->
	</sql>

    <sql id="fromNhtTrgt">
          FROM TB_LEVY            L
         INNER JOIN TB_CRDN       C  ON (L.CRDN_ID  = C.CRDN_ID)
    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>
            <if test="levyIds != null">
           AND L.LEVY_ID    IN (            <!-- 부과 Ids -->
                <foreach collection="levyIds" item="levyId" separator=","> #{levyId} </foreach>
                 )
            </if>
            <if test="levyId != null">
           AND L.LEVY_ID    =  #{levyId}    <!-- 부과 ID -->
            </if>
            <if test="crdnIds != null">
           AND C.CRDN_ID    IN (            <!-- 단속 Ids -->
                <foreach collection="crdnIds" item="crdnId" separator=","> #{crdnId} </foreach>
                 )
            </if>
            <if test="crdnId != null">
           AND C.CRDN_ID    =  #{crdnId}    <!-- 단속 ID -->
            </if>
            <if test="schVltnCd != null">
           AND V.VLTN_CD    =  #{schVltnCd} <!-- 위반 코드 -->
            </if>
            <if test="schLevyYmd != null">
           AND L.LEVY_YMD   = #{schLevyYmd}  <!-- 부과 일자 -->
            </if>
            <if test="schFrstDudtYmd != null">
           AND L.FRST_DUDT_YMD  = #{schFrstDudtYmd} <!-- 최초 납기 일자 -->
            </if>
            <if test="schFyr != null">
           AND L.FYR        = #{schFyr}   <!-- 회계연도 -->
            </if>
            <if test="schLevyNoFrom != null">
           AND L.LEVY_NO <![CDATA[>=]]> #{schLevyNoFrom}    <!-- 부과 번호 시작 -->
            </if>
            <if test="schLevyNoTo != null">
           AND L.LEVY_NO <![CDATA[<=]]> #{schLevyNoTo}      <!-- 부과 번호종료 -->
            </if>
                <if test="sggCd != null">
           AND L.SGG_CD     =  #{sggCd}     <!-- 시군구 코드 -->
                </if>
                <if test="taskSeCd != null">
           AND L.TASK_SE_CD =  #{taskSeCd}  <!-- 업무 구분 코드 -->
                </if>
           AND L.DEL_YN     =  'N'          <!-- 삭제 여부 -->
           AND C.DEL_YN     =  'N'          <!-- 삭제 여부 -->
        </where>
    </sql>

    <select id="selectNhtTrgtList" parameterType="map" resultType="dataobject">/* 사전통지 발송 대상 목록 조회(sndngMapper.selectAdvntceSndngTrgtList) */
        <include refid="utility.paging-prefix" />
        SELECT L.LEVY_ID                        <!-- 부과 ID -->
             , SUM(L.LAST_AMT) OVER() AS GRAMT  <!-- 총금액 -->
        <include refid="selectNhtTrgt" />
        <include refid="fromNhtTrgt" />
        <include refid="utility.orderBy" />
        <include refid="utility.paging-suffix" />
    </select>

    <select id="selectNhtTrgts" parameterType="map" resultType="dataobject">/* 고지서 발송 대상 객체 가져오기(sndngMapper.selectAdvntceSndngTrgts) */
        SELECT L.LEVY_ID        <!-- 부과 ID -->
        <include refid="selectNhtTrgt" />
        <include refid="fromNhtTrgt" />
        <include refid="utility.orderBy" />
    </select>

    <select id="selectNhtTrgtCrdnIds" parameterType="map" resultType="dataobject">/* 고지서 발송 대상 단속ID 가져오기(sndngMapper.selectAdvntceTrgtCrdnIds) */
        SELECT L.LEVY_ID        <!-- 부과 ID -->
             , C.CRDN_ID        <!-- 단속 ID -->
             , SUM(L.LAST_AMT) OVER() AS GRAMT  <!-- 총금액 -->
        <include refid="fromNhtTrgt" />
        <include refid="utility.orderBy" />
    </select>

    <sql id="selectCrdnPayer">
        SELECT C.CRDN_ID        <!-- 단속 ID -->
             , C.SGG_CD         <!-- 시군구 코드 -->
             , C.TASK_SE_CD     <!-- 업무 구분 코드 -->
             , C.CRDN_INPT_SE_CD <!-- 단속 입력 구분 코드 -->
             , C.CRDN_YMD       <!-- 단속 일자 -->
             , C.CRDN_TM        <!-- 단속 시각 -->
             , (GET_MASK_DATETIME(C.CRDN_YMD, '-', C.CRDN_TM, ':')) AS CRDN_YMD_TM_MASK <!-- 단속 일시 마스크 -->
             , C.VHRNO          <!-- 차량번호 -->
             , C.CRDN_STDG_NM   <!-- 단속 법정동 명 -->
             , C.CRDN_ROAD_NM   <!-- 단속 도로 명 -->
             , C.CRDN_PLC       <!-- 단속 장소 -->
             , C.FFNLG_CRDN_AMT <!-- 과태료 단속 금액 -->
             , C.ADVNTCE_AMT    <!-- 사전통지 금액 -->
             , C.CRDN_STTS_CD   <!-- 단속 상태 코드 -->
             , (GET_CODE_NM('FIM010', C.CRDN_STTS_CD)) AS CRDN_STTS_NM  <!-- 단속 상태 명 -->
             , C.CRDN_STTS_CHG_DT   <!-- 단속 상태 변경 일시 -->
             , CA.CRDN_SE_CD    <!-- 단속 구분 코드 -->
             , (GET_CODE_NM('FIM002', CA.CRDN_SE_CD)) AS CRDN_SE_NM <!-- 단속 구분 명 -->
             , CA.CRDN_SPAREA_CD <!-- 단속 특별구역 코드 -->
             , (GET_CODE_NM('FIM007', CA.CRDN_SPAREA_CD)) AS CRDN_SPAREA_NM <!-- 단속 특별구역 명 -->
             , CA.PRK_PSBLTY_RSLT_CD <!-- 주차 가능 결과 코드 -->
             , (GET_CODE_NM('FIM034', CA.PRK_PSBLTY_RSLT_CD)) AS PRK_PSBLTY_RSLT_NM <!-- 주차 가능 결과 명 -->
             , V.VLTN_ID        <!-- 위반 ID -->
             , V.VLTN_CD        <!-- 위반 코드 -->
             , V.VLTN_ARTCL     <!-- 위반 항목 -->
             , V.ACNTG_SE_NM    <!-- 회계 구분 명 -->
             , V.TXITM_NM       <!-- 세목 명 -->
             , V.OPER_ITEM_NM   <!-- 운영 항목 명 -->
             , CC.CVLCPT_LINK_ID <!-- 민원 연계 ID -->
             , CC.CVLCPT_RCPT_YMD   <!-- 민원 접수 일자 -->
             , CC.CVLCPT_APLY_NO <!-- 민원 신청 번호 -->
             , CC.CVLCPT_RCPT_NO <!-- 민원 접수 번호 -->
             , CC.CVLCPT_PRCS_SMRY <!-- 민원 처리 요약 -->
             , CC.CVLCPT_PRCS_CD <!-- 민원 처리 코드 -->
             , CC.CVLCPT_PRCS_CMPTN_DT  <!-- 민원 처리 완료 일시 -->
             , CC.CVLCPT_TRSM_CD <!-- 민원 전송 코드 -->
             , CC.CVLCPT_TRSM_DT <!-- 민원 전송 일시 -->
             , P.RTPYR_ID       <!-- 납부자 ID -->
             , P.RTPYR_NO       <!-- 납부자 번호 -->
             , P.RTPYR_NM       <!-- 납부자 명 -->
             , P.RTPYR_BRDT     <!-- 납부자 생년월일 -->
             , PA.ADDR_SN       <!-- 주소 일련번호 -->
             , PA.ZIP           <!-- 우편번호 -->
             , PA.ADDR          <!-- 주소 -->
             , PA.DTL_ADDR      <!-- 상세 주소 -->
             , L.LEVY_ID        <!-- 부과 ID -->
             , L.INST_CD        <!-- 기관 코드 -->
             , L.DEPT_CD        <!-- 부서 코드 -->
             , L.FYR            <!-- 회계연도 -->
             , L.ACNTG_SE_CD    <!-- 회계 구분 코드 -->
             , L.TXITM_CD       <!-- 세목 코드 -->
             , L.OPER_ITEM_CD   <!-- 운영 항목 코드 -->
             , L.SPCL_BIZ_CD    <!-- 특별회계 사업 코드 -->
             , L.LEVY_NO        <!-- 부과 번호 -->
             , L.ISPY_SN        <!-- 분납 일련번호 -->
             , L.LEVY_SE_CD     <!-- 부과 구분 코드 -->
             , L.LEVY_YMD       <!-- 부과 일자 -->
             , L.FRST_DUDT_YMD  <!-- 최초 납기 일자 -->
             , L.DUDT_YMD       <!-- 납기 일자 -->
             , L.DUDT_AFTR_YMD  <!-- 납기 후 일자 -->
             , L.LEVY_PCPTAX    <!-- 부과 본세 -->
             , L.LEVY_ADAMT     <!-- 부과 가산금 -->
             , L.ISPY_INT       <!-- 분납 이자 -->
             , L.RCVMT_PCPTAX   <!-- 수납 본세 -->
             , L.RCVMT_ADAMT    <!-- 수납 가산금 -->
             , L.RDAMT_PCPTAX   <!-- 감액 본세 -->
             , L.RDAMT_ADAMT    <!-- 감액 가산금 -->
             , L.LAST_AMT       <!-- 최종 금액 -->
             , L.DUDT_AFTR_AMT  <!-- 납기 후 금액 -->
             , L.TXTN_THING     <!-- 과세 물건 -->
             , L.MNG_ITEM1      <!-- 관리 아이템1 -->
             , L.MNG_ITEM2      <!-- 관리 아이템2 -->
             , L.MNG_ITEM3      <!-- 관리 아이템3 -->
             , L.MNG_ITEM4      <!-- 관리 아이템4 -->
             , L.MNG_ITEM5      <!-- 관리 아이템5 -->
             , L.MNG_ITEM6      <!-- 관리 아이템6 -->
             , L.EPAYNO         <!-- 전자납부번호 -->
             , L.BANK_NM        <!-- 은행 명 -->
             , L.VR_ACTNO       <!-- 가상 계좌번호 -->
             , L.BANK_NM2       <!-- 은행 명2 -->
             , L.VR_ACTNO2      <!-- 가상 계좌번호2 -->
             , L.BANK_NM3       <!-- 은행 명3 -->
             , L.VR_ACTNO3      <!-- 가상 계좌번호3 -->
             , L.BANK_NM4       <!-- 은행 명4 -->
             , L.VR_ACTNO4      <!-- 가상 계좌번호4 -->
             , L.BANK_NM5       <!-- 은행 명5 -->
             , L.VR_ACTNO5      <!-- 가상 계좌번호5 -->
             , L.BANK_NM6       <!-- 은행 명6 -->
             , L.VR_ACTNO6      <!-- 가상 계좌번호6 -->
             , L.BANK_NM7       <!-- 은행 명7 -->
             , L.VR_ACTNO7      <!-- 가상 계좌번호7 -->
             , L.BANK_NM8       <!-- 은행 명8 -->
             , L.VR_ACTNO8      <!-- 가상 계좌번호8 -->
             , L.BANK_NM9       <!-- 은행 명9 -->
             , L.VR_ACTNO9      <!-- 가상 계좌번호9 -->
             , L.BANK_NM10      <!-- 은행 명10 -->
             , L.VR_ACTNO10     <!-- 가상 계좌번호10 -->
             , L.BANK_NM11      <!-- 은행 명11 -->
             , L.VR_ACTNO11     <!-- 가상 계좌번호11 -->
             , L.BANK_NM12      <!-- 은행 명12 -->
             , L.VR_ACTNO12     <!-- 가상 계좌번호12 -->
             , L.BANK_NM13      <!-- 은행 명13 -->
             , L.VR_ACTNO13     <!-- 가상 계좌번호13 -->
             , L.BANK_NM14      <!-- 은행 명14 -->
             , L.VR_ACTNO14     <!-- 가상 계좌번호14 -->
             , L.BANK_NM15      <!-- 은행 명15 -->
             , L.VR_ACTNO15     <!-- 가상 계좌번호15 -->
             , L.BANK_NM16      <!-- 은행 명16 -->
             , L.VR_ACTNO16     <!-- 가상 계좌번호16 -->
             , L.BANK_NM17      <!-- 은행 명17 -->
             , L.VR_ACTNO17     <!-- 가상 계좌번호17 -->
             , L.BANK_NM18      <!-- 은행 명18 -->
             , L.VR_ACTNO18     <!-- 가상 계좌번호18 -->
             , L.BANK_NM19      <!-- 은행 명19 -->
             , L.VR_ACTNO19     <!-- 가상 계좌번호19 -->
             , L.BANK_NM20      <!-- 은행 명20 -->
             , L.VR_ACTNO20     <!-- 가상 계좌번호20 -->
             , (CASE WHEN L.FFNLG_AMT IS NOT NULL THEN L.FFNLG_AMT ELSE C.FFNLG_AMT END) AS FFNLG_AMT   <!-- 과태료 금액 -->
             , L.LEVY_PCPTAX - L.RCVMT_PCPTAX - L.RDAMT_PCPTAX  AS PCPTAX   <!-- 본세 -->
             , L.LEVY_ADAMT  - L.RCVMT_ADAMT  - L.RDAMT_ADAMT   AS ADAMT    <!-- 가산금 -->
          FROM TB_CRDN              C
         INNER JOIN TB_CRDN_ADI     CA  ON (C.CRDN_ID  = CA.CRDN_ID)
         INNER JOIN TB_VLTN         V   ON (C.VLTN_ID  = V.VLTN_ID)
    LEFT OUTER JOIN TB_CRDN_CVLCPT  CC  ON (C.CVLCPT_LINK_YN = 'Y' AND C.CVLCPT_LINK_ID = CC.CVLCPT_LINK_ID AND CC.DEL_YN = 'N')
    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)
    LEFT OUTER JOIN TB_LEVY         L   ON (C.CRDN_ID  = L.CRDN_ID AND L.DEL_YN = 'N')
    </sql>

    <select id="selectCrdnPayerTrgts" parameterType="map" resultType="dataobject">/* 단속, 납부자, 부과 대장 객체 가져오기(sndngMapper.selectCrdnPayerTrgts) */
        <include refid="selectCrdnPayer" />
        <choose>
            <when test="crdnIds != null">
         WHERE C.CRDN_ID    IN (            <!-- 단속 Ids -->
                <foreach collection="crdnIds" item="crdnId" separator=","> #{crdnId} </foreach>
             )
            </when>
            <otherwise>
         WHERE C.CRDN_ID    =  #{crdnId}    <!-- 단속 ID -->
            </otherwise>
        </choose>
           AND C.DEL_YN     =  'N'          <!-- 삭제 여부 -->
        <include refid="utility.orderBy" />
    </select>

    <insert id="insertSndng" parameterType="cokr.xit.fims.sndb.Sndng">/* 발송 대장 등록(sndngMapper.insertSndng) */
        <selectKey resultType="string" keyProperty="sndngId" keyColumn="NEW_ID" order="BEFORE">
            <include refid="numbering.keyBySggAndYear">
                <property name="TABLE_NAME" value="TB_SNDNG" />
                <property name="TABLE_KEY" value="SNDNG_ID" />
                <property name="sggCd" value="#{sggCd}" />
                <property name="pad" value="20" />
            </include>
        </selectKey>
        INSERT INTO TB_SNDNG (
               SNDNG_ID         <!-- 발송 ID -->
             , SGG_CD           <!-- 시군구 코드 -->
             , TASK_SE_CD       <!-- 업무 구분 코드 -->
             , DEPT_CD          <!-- 부서 코드 -->
             , SNDNG_REG_SE_CD  <!-- 발송 등록 구분 코드 -->
             , SNDNG_SE_CD      <!-- 발송 구분 코드 -->
             , VLTN_ID          <!-- 위반 ID -->
             , LEVY_BGNG_YMD    <!-- 부과 시작 일자 -->
             , LEVY_END_YMD     <!-- 부과 종료 일자 -->
             , SNDNG_YMD        <!-- 발송 일자 -->
             , SNDNG_END_YMD    <!-- 발송 종료 일자 -->
             , TTL_NM           <!-- 제목 명 -->
             , DOC_NO           <!-- 문서 번호 -->
             , ETC_CN           <!-- 기타 내용 -->
             , TNOCS            <!-- 총건수 -->
             , GRAMT            <!-- 총금액 -->
             , CON_KEY          <!-- 외부연계식별키 -->
             , DIV_KB           <!-- 취급 구분 -->
             , EPOST_NOTICE_ID  <!-- 전자우편 안내문 ID -->
             , SNDNG_STTS_CD    <!-- 발송 상태 코드 -->
             , RSND_YN          <!-- 재발송 여부 -->
             , DEL_YN           <!-- 삭제 여부 -->
             , REG_DT           <!-- 등록 일시 -->
             , RGTR             <!-- 등록자 -->
             , MDFCN_DT         <!-- 수정 일시 -->
             , MDFR             <!-- 수정자 -->
        ) VALUES (
               #{sndngId}       <!-- 발송 ID -->
             , #{sggCd}         <!-- 시군구 코드 -->
             , #{taskSeCd}      <!-- 업무 구분 코드 -->
             , #{deptCd}        <!-- 부서 코드 -->
             , #{sndngRegSeCd}  <!-- 발송 등록 구분 코드 -->
             , #{sndngSeCd}     <!-- 발송 구분 코드 -->
             , (SELECT VLTN_ID FROM TB_VLTN
                 WHERE SGG_CD     = #{sggCd}
                   AND TASK_SE_CD = #{taskSeCd}
                   AND VLTN_CD    = #{vltnCd})  <!-- 위반 ID -->
             , #{levyBgngYmd}   <!-- 부과 시작 일자 -->
             , #{levyEndYmd}    <!-- 부과 종료 일자 -->
             , #{sndngYmd}      <!-- 발송 일자 -->
             , #{sndngEndYmd}   <!-- 발송 종료 일자 -->
             , #{ttlNm}         <!-- 제목 명 -->
             , #{docNo}         <!-- 문서 번호 -->
             , #{etcCn}         <!-- 기타 내용 -->
             , #{tnocs}         <!-- 총건수 -->
             , #{gramt}         <!-- 총금액 -->
             , #{conKey}        <!-- 외부연계식별키 -->
             , #{divKb}         <!-- 취급 구분 -->
             , #{epostNoticeId} <!-- 전자우편 안내문 ID -->
             , #{sndngSttsCd}   <!-- 발송 상태 코드 -->
             , #{rsndYn}        <!-- 재발송 여부 -->
             , #{delYn}         <!-- 삭제 여부 -->
             , <include refid="utility.now" />  <!-- 등록 일시 -->
             , #{createdBy}     <!-- 등록자 -->
             , <include refid="utility.now" />  <!-- 수정 일시 -->
             , #{modifiedBy}    <!-- 수정자 -->
        )
    </insert>

    <update id="updateSndng" parameterType="cokr.xit.fims.sndb.Sndng">/* 발송 대장 수정(sndngMapper.updateSndng) */
        UPDATE TB_SNDNG
           SET SNDNG_SE_CD      = #{sndngSeCd}  <!-- 발송 구분 코드 -->
             , LEVY_BGNG_YMD    = #{levyBgngYmd} <!-- 부과 시작 일자 -->
             , LEVY_END_YMD     = #{levyEndYmd} <!-- 부과 종료 일자 -->
             , VLTN_ID          = #{vltnId}     <!-- 위반 ID -->
             , SNDNG_YMD        = #{sndngYmd}   <!-- 발송 일자 -->
             , SNDNG_END_YMD    = #{sndngEndYmd} <!-- 납기 일자 -->
             , TTL_NM           = #{ttlNm}      <!-- 제목 명 -->
             , DOC_NO           = #{docNo}      <!-- 문서 번호 -->
             , ETC_CN           = #{etcCn}      <!-- 기타 내용 -->
             , TNOCS            = #{tnocs}      <!-- 총건수 -->
             , GRAMT            = #{gramt}      <!-- 총금액 -->
             , CON_KEY          = #{conKey}     <!-- 외부연계식별키 -->
             , DIV_KB           = #{divKb}      <!-- 취급 구분 -->
             , EPOST_NOTICE_ID  = #{epostNoticeId}<!-- 전자우편 안내문 ID -->
             , SNDNG_STTS_CD    = #{sndngSttsCd} <!-- 발송 상태 코드 -->
             , RSND_YN          = #{rsndYn}     <!-- 재발송 여부 -->
             , MDFCN_DT         = <include refid="utility.now" />   <!-- 수정 일시 -->
             , MDFR             = #{modifiedBy} <!-- 수정자 -->
         WHERE SNDNG_ID         = #{sndngId}    <!-- 발송 ID -->
           AND DEL_YN           = 'N'
    </update>

    <update id="deleteSndng" parameterType="cokr.xit.fims.sndb.Sndng">/* 발송 대장 삭제(sndngMapper.deleteSndng) */
        UPDATE TB_SNDNG
           SET DEL_YN           = 'Y'           <!-- 삭제 여부 -->
             , DEL_DT           = <include refid="utility.now" />   <!-- 삭제 일시 -->
             , DLTR             = #{modifiedBy} <!-- 삭제자 -->
             , DEL_RSN          = #{delRsn}     <!-- 삭제 사유 -->
         WHERE SNDNG_ID         = #{sndngId}    <!-- 발송 ID -->
           AND DEL_YN           = 'N'
    </update>

    <update id="updateSndngSttsCd" parameterType="cokr.xit.fims.sndb.Sndng">/* 발송 대장 정보의 발송 상태 코드를 수정(sndngMapper.updateSndngSttsCd) */
        UPDATE TB_SNDNG
           SET SNDNG_STTS_CD    = #{sndngSttsCd} <!-- 발송 상태 코드 -->
             , MDFCN_DT         = <include refid="utility.now" />   <!-- 수정 일시 -->
             , MDFR             = #{modifiedBy} <!-- 수정자 -->
         WHERE SNDNG_ID         = #{sndngId}    <!-- 발송 ID -->
           AND DEL_YN           = 'N'
    </update>

    <update id="updateEPostSndng" parameterType="map">/* 전자우편 발송 내역 수정(sndngMapper.updateEPostSndng) */
        UPDATE TB_SNDNG
           SET CON_KEY          = #{sndng.conKey}       <!-- 외부연계식별키 -->
             , DIV_KB           = #{sndng.divKb}        <!-- 취급 구분 -->
             , EPOST_NOTICE_ID  = #{sndng.epostNoticeId}<!-- 전자우편 안내문 ID -->
             , MDFCN_DT         = <include refid="utility.now" />   <!-- 수정 일시 -->
             , MDFR             = #{sndng.modifiedBy}   <!-- 수정자 -->
         WHERE SNDNG_ID         = #{sndng.sndngId}      <!-- 발송 ID -->
           AND DEL_YN           = 'N'
    </update>

</mapper>
