<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> 

<mapper namespace="kr.co.i2talk.push">
<!-- 1. 추가  쿼리 메소드 작성 -->
    <select id="kr.co.i2talk.push.listReceived"
        parameterType="Map"
        resultType="i2c.cmm.base.CommonResultMap">
    /* kr.co.i2talk.push.listReceived */
SELECT
    *
FROM
(
    SELECT
        count(*) over() total_cnt,
        row_number() over(order by snd_dttm desc) rn,
        'received' message_scope,
        msg_box_id,
        sndr_id,
        FN_GET_USR_NM(sndr_id) sndr_nm,
        FN_GET_USR_DEPT_NM(a.sndr_id) sndr_dept_nm,
        (SELECT pos_nm FROM sns_user it WHERE it.usr_id = a.sndr_id) sndr_pos_nm,
        FN_GET_USR_PHOTO(sndr_id) sndr_photo_path,
        FN_GET_USR_ORIGIN_PHOTO(sndr_id) sndr_photo_img,
        rcvr_id,
        FN_GET_USR_NM(rcvr_id) rcvr_nm,
        FN_GET_USR_DEPT_NM(a.rcvr_id) rcvr_dept_nm,
        (SELECT pos_nm FROM sns_user it WHERE it.usr_id = a.rcvr_id) rcvr_pos_nm,
        FN_GET_USR_PHOTO(rcvr_id) rcvr_photo_path,
        FN_GET_USR_ORIGIN_PHOTO(rcvr_id) rcvr_photo_img,
        rcvr_grp_msg_box_id,
        msg_cntn,
        snd_dttm,
        recv_dttm,
        keep_yn,
        noti_recv_dttm,
        (
            select max(snd_dttm) reply_dttm from sns_message_box it where it.rply_grp_msg_box_id = a.rply_grp_msg_box_id and it.msg_scope = 'SEND' and it.snd_dttm >= a.snd_dttm and it.sndr_id = a.rcvr_id
        ) rply_dttm
    FROM
        sns_message_box a
    WHERE
        msg_scope = 'RECEIVED'
        and IFNULL(a.keep_yn, 'N') != 'Y'
        and rcvr_id = #{rcvr_id}
        <if test="@i2c.cmm.util.StringUtil@isNotEmpty(search_type) and @i2c.cmm.util.StringUtil@isNotEmpty(search_word)">
            <if test='search_type == "contents"'>
                and a.msg_cntn like '%' || #{search_word} || '%'
            </if>
            <if test='search_type == "sender"'>
                and a.sndr_id in (select usr_id from sns_user where usr_nm like '%' || #{search_word} || '%')
            </if>
        </if>
    ORDER BY
        snd_dttm desc
)
WHERE
    RN BETWEEN ((#{page} - 1) * #{limit}) + 1 AND (#{page} * #{limit})
    </select>

    <select id="kr.co.i2talk.push.listSend"
        parameterType="Map"
        resultType="i2c.cmm.base.CommonResultMap">
    /* kr.co.i2talk.push.listSend */
SELECT
    *
FROM
(
    SELECT
        count(*) over() total_cnt,
        row_number() over(order by snd_dttm desc) rn,
        'send' message_scope,
        iv1.*,
        FN_GET_USR_NM(iv1.sndr_id) sndr_nm,
        FN_GET_USR_DEPT_NM(iv1.sndr_id) sndr_dept_nm,
        (SELECT pos_nm FROM sns_user it WHERE it.usr_id = iv1.sndr_id) sndr_pos_nm,
        FN_GET_USR_PHOTO(iv1.sndr_id) sndr_photo_path,
        FN_GET_USR_ORIGIN_PHOTO(iv1.sndr_id) sndr_photo_img,
        FN_GET_USR_NM(iv1.rcvr_id) rcvr_nm,
        FN_GET_USR_DEPT_NM(iv1.rcvr_id) rcvr_dept_nm,
        (SELECT pos_nm FROM sns_user it WHERE it.usr_id = iv1.rcvr_id) rcvr_pos_nm,
        FN_GET_USR_PHOTO(iv1.rcvr_id) rcvr_photo_path,
        FN_GET_USR_ORIGIN_PHOTO(iv1.rcvr_id) rcvr_photo_img,
        (select recv_dttm from sns_message_box where rcvr_grp_msg_box_id = iv1.msg_box_id and msg_scope = 'RECEIVED' and rownum = 1) conf_dttm,
        (select count(*) from sns_message_box where rcvr_grp_msg_box_id = iv1.msg_box_id and msg_scope = 'RECEIVED') conf_cnt,
        (select count(*) from sns_message_box where rcvr_grp_msg_box_id = iv1.msg_box_id and msg_scope = 'RECEIVED' and recv_dttm is null) conf_cpl_cnt
    FROM
    (
            SELECT
                    msg_box_id,
                    sndr_id,
                    rcvr_grp_msg_box_id,
                    msg_cntn,
                    snd_dttm,
                    recv_dttm,
                    keep_yn,
                    noti_recv_dttm,
                    (
                        select count(*) - 1 from sns_message_box it where it.rcvr_grp_msg_box_id = a.msg_box_id and rcvr_id != #{sndr_id}
                    ) rcvr_cnt,
                    IFNULL((
                        select rcvr_id from sns_message_box it where it.rcvr_grp_msg_box_id = a.msg_box_id and rcvr_id != #{sndr_id} and rownum = 1 
                    ), a.rcvr_id) rcvr_id
            FROM
                    sns_message_box a
            WHERE
                    msg_scope = 'SEND'
                    and sndr_id = #{sndr_id}
                    and IFNULL(a.keep_yn, 'N') != 'Y'
             <if test="@i2c.cmm.util.StringUtil@isNotEmpty(search_type) and @i2c.cmm.util.StringUtil@isNotEmpty(search_word)">
                <if test='search_type == "contents"'>
                    and a.msg_cntn like '%' || #{search_word} || '%'
                </if>
                <if test='search_type == "receiver"'>
                    and a.rcvr_grp_msg_box_id in 
                    (
                        select rcvr_grp_msg_box_id from sns_message_box it where it.rcvr_grp_msg_box_id = a.rcvr_grp_msg_box_id and it.rcvr_id in 
                        (
                            select usr_id from sns_user where usr_nm like '%' || #{search_word} || '%'
                        )
                    )
                </if>
            </if>
    ) iv1
    ORDER BY
            snd_dttm desc
)
WHERE
    RN BETWEEN ((#{page} - 1) * #{limit}) + 1 AND (#{page} * #{limit})
    </select>
    
    <select id="kr.co.i2talk.push.listKeep"
        parameterType="Map"
        resultType="i2c.cmm.base.CommonResultMap">
    /* kr.co.i2talk.push.listKeep */
SELECT
    *
FROM
(
    SELECT
        count(*) over() total_cnt,
        row_number() over(order by snd_dttm desc) rn,
        iv2.*
    FROM
    (
            SELECT
                    'received' message_scope,
                    msg_box_id,
                    sndr_id,
                    rcvr_grp_msg_box_id,
                    msg_cntn,
                    snd_dttm,
                    recv_dttm,
                    keep_yn,
                    noti_recv_dttm,
                    0 rcvr_cnt,
                    rcvr_id,
                    FN_GET_USR_NM(sndr_id) sndr_nm,
                    FN_GET_USR_DEPT_NM(a.sndr_id) sndr_dept_nm,
                    (SELECT pos_nm FROM sns_user it WHERE it.usr_id = a.sndr_id) sndr_pos_nm,
                    FN_GET_USR_PHOTO(sndr_id) sndr_photo_path,
                    FN_GET_USR_ORIGIN_PHOTO(sndr_id) sndr_photo_img,
                    fn_get_usr_nm(rcvr_id) rcvr_nm,
                    FN_GET_USR_DEPT_NM(a.rcvr_id) rcvr_dept_nm,
                    (SELECT pos_nm FROM sns_user it WHERE it.usr_id = a.rcvr_id) rcvr_pos_nm,
                    FN_GET_USR_PHOTO(rcvr_id) rcvr_photo_path,
                    FN_GET_USR_ORIGIN_PHOTO(rcvr_id) rcvr_photo_img
            FROM
                    sns_message_box a
            WHERE
                    msg_scope = 'RECEIVED'
                    and rcvr_id =  #{usr_id}
                    and keep_yn = 'Y'
             <if test="@i2c.cmm.util.StringUtil@isNotEmpty(search_type) and @i2c.cmm.util.StringUtil@isNotEmpty(search_word)">
                <if test='search_type == "contents"'>
                    and a.msg_cntn like '%' || #{search_word} || '%'
                </if>
                <if test='search_type == "sender"'>
                    and a.sndr_id in (select usr_id from sns_user where usr_nm like '%' || #{search_word} || '%')
                </if>
                <if test='search_type == "receiver"'>
                    /* 보관인 경우 수신자가 넘어오면 자기 자신이 아닌 경우 검색결과가 없어야 한다. */
                    and a.rcvr_id in /* 검색 결과 없음. */
                    (
                        select usr_id from sns_user where usr_nm like '%' || #{search_word} || '%'
                    )
                </if>
            </if>
            UNION ALL
            SELECT
                    'send' message_scope,
                    iv1.msg_box_id,
                    iv1.sndr_id,
                    iv1.rcvr_grp_msg_box_id,
                    iv1.msg_cntn,
                    iv1.snd_dttm,
                    iv1.recv_dttm,
                    iv1.keep_yn,
                    iv1.noti_recv_dttm,
                    iv1.rcvr_cnt,
                    iv1.rcvr_id,
                    fn_get_usr_nm(iv1.sndr_id) sndr_nm,
                    FN_GET_USR_DEPT_NM(iv1.sndr_id) sndr_dept_nm,
                    (SELECT pos_nm FROM sns_user it WHERE it.usr_id = iv1.sndr_id) sndr_pos_nm,
                    FN_GET_USR_PHOTO(iv1.sndr_id) sndr_photo_path,
                    FN_GET_USR_ORIGIN_PHOTO(iv1.sndr_id) sndr_photo_img,
                    FN_GET_USR_NM(iv1.rcvr_id) rcvr_nm,
                    FN_GET_USR_DEPT_NM(iv1.rcvr_id) rcvr_dept_nm,
                    (SELECT pos_nm FROM sns_user it WHERE it.usr_id = iv1.rcvr_id) rcvr_pos_nm,
                    FN_GET_USR_PHOTO(iv1.rcvr_id) rcvr_photo_path,
                    FN_GET_USR_ORIGIN_PHOTO(iv1.rcvr_id) rcvr_photo_img
            FROM
            (
                    SELECT
                            msg_box_id,
                            sndr_id,
                            rcvr_grp_msg_box_id,
                            msg_cntn,
                            snd_dttm,
                            recv_dttm,
                            keep_yn,
                            noti_recv_dttm,
                            (
                                    SELECT count(*) - 1 FROM sns_message_box it WHERE it.rcvr_grp_msg_box_id = a.msg_box_id AND rcvr_id !=  #{usr_id} 
                            ) rcvr_cnt,
                            IFNULL((
                                    SELECT rcvr_id FROM sns_message_box it WHERE it.rcvr_grp_msg_box_id = a.msg_box_id AND rcvr_id !=  #{usr_id}  and rownum = 1
                            ), a.rcvr_id) rcvr_id
                    FROM
                            sns_message_box a
                    WHERE
                            msg_scope = 'SEND'
                            and sndr_id =  #{usr_id} 
                            and keep_yn = 'Y'
                     <if test="@i2c.cmm.util.StringUtil@isNotEmpty(search_type) and @i2c.cmm.util.StringUtil@isNotEmpty(search_word)">
                        <if test='search_type == "contents"'>
                            and a.msg_cntn like '%' || #{search_word} || '%'
                        </if>
                        <if test='search_type == "sender"'>
                            /* 검색결과 없음 */
                            and a.sndr_id in (select usr_id from sns_user where usr_nm like '%' || #{search_word} || '%')
                        </if>
                        <if test='search_type == "receiver"'>
                            and a.rcvr_grp_msg_box_id in 
                            (
                                select rcvr_grp_msg_box_id from sns_message_box it where it.rcvr_grp_msg_box_id = a.rcvr_grp_msg_box_id and it.rcvr_id in 
                                (
                                    select usr_id from sns_user where usr_nm like '%' || #{search_word} || '%'
                                )
                            )
                        </if>
                    </if>
            ) iv1
    ) iv2
    ORDER BY
            snd_dttm desc
)
WHERE
    RN BETWEEN ((#{page} - 1) * #{limit}) + 1 AND (#{page} * #{limit})
    </select>
    
    <select id="kr.co.i2talk.push.viewSnsMessageBox"
        parameterType="Map"
        resultType="i2c.cmm.base.CommonResultMap">
    /* kr.co.i2talk.push.viewSnsMessageBox */
SELECT 
    msg_box_id,
    sndr_id,
    rcvr_id,
    rcvr_grp_msg_box_id,
    msg_cntn,
    snd_dttm,
    recv_dttm,
    keep_yn,
    rcvr_grp_msg_box_id,
    rply_grp_msg_box_id,
    msg_scope,
    FN_GET_USR_NM(sndr_id) sndr_nm,
    FN_GET_USR_DEPT_NM(a.sndr_id) sndr_dept_nm,
    (SELECT pos_nm FROM sns_user it WHERE it.usr_id = a.sndr_id) sndr_pos_nm,
    FN_GET_USR_PHOTO(sndr_id) sndr_photo_path,
    FN_GET_USR_ORIGIN_PHOTO(sndr_id) sndr_photo_img,
    FN_GET_USR_NM(rcvr_id) rcvr_nm,
    FN_GET_USR_DEPT_NM(a.rcvr_id) rcvr_dept_nm,
    (SELECT pos_nm FROM sns_user it WHERE it.usr_id = a.rcvr_id) rcvr_pos_nm,
    FN_GET_USR_PHOTO(rcvr_id) rcvr_photo_path,
    FN_GET_USR_ORIGIN_PHOTO(rcvr_id) rcvr_photo_img
FROM
    sns_message_box a
WHERE
    msg_box_id = #{msg_box_id}
    </select>

    <insert id="kr.co.i2talk.push.sendSnsMessageBox"
        parameterType="Map">
/* kr.co.i2talk.push.sendSnsMessageBox */
INSERT INTO sns_message_box (
    msg_box_id, sndr_id, rcvr_id, msg_cntn, snd_dttm, recv_dttm, keep_yn, rcvr_grp_msg_box_id, rply_grp_msg_box_id, msg_scope
) VALUES (
    #{msg_box_id}, #{sndr_id}, #{rcvr_id}, #{msg_cntn}, #{snd_dttm}, #{recv_dttm}, #{keep_yn}, #{rcvr_grp_msg_box_id}, #{rply_grp_msg_box_id}, #{msg_scope}
)
    </insert>

    <delete id="kr.co.i2talk.push.deleteSnsMessageBox"
        parameterType="Map">
/* kr.co.i2talk.push.deleteSnsMessageBox */
DELETE FROM sns_message_box WHERE
    msg_box_id = #{msg_box_id}
    </delete>
    
    <update id="kr.co.i2talk.push.keepSnsMessageBox"
        parameterType="Map">
/* kr.co.i2talk.push.keepSnsMessageBox */
UPDATE sns_message_box SET
    keep_yn = 'Y'
WHERE
    msg_box_id = #{msg_box_id}
    </update>
    
    <update id="kr.co.i2talk.push.cancelKeep"
        parameterType="Map">
/* kr.co.i2talk.push.cancelKeep */
UPDATE sns_message_box SET
    keep_yn = NULL
WHERE
    msg_box_id = #{msg_box_id}
    </update>
    
    <update id="kr.co.i2talk.push.receivedConfirm"
        parameterType="Map">
/* kr.co.i2talk.push.receivedConfirm */
UPDATE sns_message_box SET
    recv_dttm = #{recv_dttm}
WHERE
    msg_box_id = #{msg_box_id}
    and recv_dttm is null
    </update>
    
    <select id="kr.co.i2talk.push.listRelation"
        parameterType="Map"
        resultType="i2c.cmm.base.CommonResultMap">
    /* kr.co.i2talk.push.listRelation */
SELECT
    msg_box_id,
    sndr_id,
    rcvr_id,
    rcvr_grp_msg_box_id,
    msg_cntn,
    snd_dttm,
    recv_dttm,
    keep_yn,
    noti_recv_dttm,
    rcvr_grp_msg_box_id,
    rply_grp_msg_box_id,
    msg_scope,
    FN_GET_USR_NM(sndr_id) sndr_nm,
    FN_GET_USR_DEPT_NM(a.sndr_id) sndr_dept_nm,
    (SELECT pos_nm FROM sns_user it WHERE it.usr_id = a.sndr_id) sndr_pos_nm,
    FN_GET_USR_PHOTO(sndr_id) sndr_photo_path,
    FN_GET_USR_ORIGIN_PHOTO(sndr_id) sndr_photo_img,
    FN_GET_USR_NM(rcvr_id) rcvr_nm,
    FN_GET_USR_DEPT_NM(a.rcvr_id) rcvr_dept_nm,
    (SELECT pos_nm FROM sns_user it WHERE it.usr_id = a.rcvr_id) rcvr_pos_nm,
    FN_GET_USR_PHOTO(rcvr_id) rcvr_photo_path,
    FN_GET_USR_ORIGIN_PHOTO(rcvr_id) rcvr_photo_img
FROM
    sns_message_box a
WHERE
    rply_grp_msg_box_id = (SELECT rply_grp_msg_box_id FROM sns_message_box WHERE msg_box_id = #{msg_box_id})
    and ((msg_scope = 'SEND' and sndr_id = #{usr_id}) or (msg_scope = 'RECEIVED' and rcvr_id = #{usr_id}))
ORDER BY
    snd_dttm, recv_dttm
    </select>
    
    <update id="kr.co.i2talk.push.updateReplyGroup"
        parameterType="Map">
/* kr.co.i2talk.push.updateReplyGroup */
UPDATE sns_message_box SET
    rply_grp_msg_box_id = #{rply_grp_msg_box_id}
WHERE
    msg_box_id = #{msg_box_id}
    and rply_grp_msg_box_id is null
    </update>
    
    <select id="kr.co.i2talk.push.listReceiver"
        parameterType="Map"
        resultType="i2c.cmm.base.CommonResultMap">
    /* kr.co.i2talk.push.listReceiver */
SELECT
    msg_box_id,
    msg_scope,
    rcvr_id,
    recv_dttm,
    rcvr_grp_msg_box_id,
    FN_GET_USR_NM(rcvr_id) rcvr_nm,
    FN_GET_USR_DEPT_NM(a.rcvr_id) rcvr_dept_nm,
    (SELECT pos_nm FROM sns_user it WHERE it.usr_id = a.rcvr_id) rcvr_pos_nm,
    FN_GET_USR_PHOTO(rcvr_id) rcvr_photo_path,
    FN_GET_USR_ORIGIN_PHOTO(rcvr_id) rcvr_photo_img
FROM
    sns_message_box a
WHERE
    msg_scope = 'RECEIVED'
    and rcvr_grp_msg_box_id = (SELECT rcvr_grp_msg_box_id FROM sns_message_box WHERE msg_box_id = #{msg_box_id})
ORDER BY
    snd_dttm, recv_dttm
    </select>
    
    <update id="kr.co.i2talk.push.confirmNotification"
        parameterType="Map">
/* kr.co.i2talk.push.confirmNotification */
UPDATE sns_message_box SET
    noti_recv_dttm = #{noti_recv_dttm}
WHERE
    msg_box_id = #{msg_box_id}
    and noti_recv_dttm is null
    </update>
    
    <select id="kr.co.i2talk.push.viewUnreadMessageBoxCount"
        parameterType="Map"
        resultType="i2c.cmm.base.CommonResultMap">
    /* kr.co.i2talk.push.viewUnreadMessageBoxCount */
SELECT 
    count(*) cnt 
FROM sns_message_box
WHERE 1=1
    and msg_scope = 'RECEIVED'
    and rcvr_id = #{rcvr_id}
    and recv_dttm is null
    </select>
    
    <select id="kr.co.i2talk.push.recvConfYn"
        parameterType="Map"
        resultType="i2c.cmm.base.CommonResultMap">
    /* kr.co.i2talk.push.recvConfYn */
SELECT
    msg_box_id,
    msg_cntn,
    msg_scope,
    rcvr_id,
    recv_dttm,
    rcvr_grp_msg_box_id,
    FN_GET_USR_NM(rcvr_id) rcvr_nm,
    FN_GET_USR_DEPT_NM(a.rcvr_id) rcvr_dept_nm,
    (SELECT pos_nm FROM sns_user it WHERE it.usr_id = a.rcvr_id) rcvr_pos_nm,
    FN_GET_USR_PHOTO(rcvr_id) rcvr_photo_path,
    FN_GET_USR_ORIGIN_PHOTO(rcvr_id) rcvr_photo_img
FROM
    sns_message_box a
WHERE
    msg_scope = 'RECEIVED'
    and rcvr_grp_msg_box_id = #{msg_box_id}
ORDER BY
    snd_dttm, recv_dttm
    </select>
    
</mapper>
