-- ウォッチリストテーブル 変更
CREATE OR REPLACE FUNCTION f_watch_list_update(
    IN integer,

    IN integer,
    IN integer,
    IN integer,
    IN character varying,

    IN character varying,
    IN character varying,
    IN integer,

    OUT errcd integer,
    OUT errmsg character varying,
    OUT code integer) AS
$$

DECLARE
    kubun ALIAS FOR $1;                  -- 区分

    i_watchlistcd ALIAS FOR $2;          -- ウォッチリストコード
    i_usercd ALIAS FOR $3;               -- 登録ユーザーコード
    i_itemcd ALIAS FOR $4;               -- 商品コード
    i_comment ALIAS FOR $5;              -- コメント

    i_updusrnm ALIAS FOR $6;             -- 更新ユーザー名
    i_updpcnm ALIAS FOR $7;              -- 更新マシン名
    i_updcnt ALIAS FOR $8;               -- UpdCnt

    cntcheck integer;
    nowdate timestamp;
    newupdcnt integer;

BEGIN
-- 必須チェック --

    IF kubun IS NULL OR kubun NOT IN (1,2,3) THEN
        RAISE EXCEPTION '処理区分が不正です';
    END IF;

    IF i_updusrnm IS NULL THEN
        RAISE EXCEPTION '更新ユーザー名の引数は必須です';
    END IF;
    IF i_updpcnm IS NULL THEN
        RAISE EXCEPTION '更新PC名の引数は必須です';
    END IF;

    IF kubun IN (1,2) THEN
		IF i_usercd IS NULL THEN
		    RAISE EXCEPTION 'ユーザーコードの引数は必須です';
		END IF;
		IF i_itemcd IS NULL THEN
            RAISE EXCEPTION '商品コードの引数は必須です';
        END IF;
    END IF;

    IF kubun IN (2,3) THEN
	    IF i_watchlistcd IS NULL THEN
	        RAISE EXCEPTION 'ウォッチリストコードの引数は必須です';
	    END IF;
        IF i_updcnt IS NULL THEN
            RAISE EXCEPTION 'UpdCntの引数は必須です';
        END IF;
    END IF;

	-- 存在チェック
    IF kubun IN (1,2) THEN
        SELECT itemcd INTO cntcheck FROM t_item_basic_attr WHERE itemcd = i_itemcd;
	    IF NOT FOUND THEN
	        RAISE EXCEPTION '商品コードは存在しません';
    	END IF;
        SELECT membercd INTO cntcheck FROM t_member_basic_attr WHERE membercd = i_usercd;
	    IF NOT FOUND THEN
	        RAISE EXCEPTION 'ユーザーコードは存在しません';
    	END IF;
    END IF;

    IF kubun IN (2,3) THEN
        SELECT watchlistcd INTO cntcheck FROM t_watch_list WHERE watchlistcd = i_watchlistcd;
	    IF NOT FOUND THEN
	        RAISE EXCEPTION 'ウォッチリストコードは存在しません';
	    END IF;
    END IF;

    -- 更新カウンタチェック
    IF kubun IN (2,3) THEN
        SELECT updcnt INTO cntcheck FROM t_watch_list WHERE watchlistcd = i_watchlistcd AND membercd = i_usercd;
          IF NOT FOUND OR cntcheck <> i_updcnt THEN
            errcd := -11;
            errmsg := '更新カウンタが不正';
            RETURN;
          END IF;
    END IF;

    -- すでに登録されていたら追加しない
    IF kubun = 1 THEN
        SELECT watchlistcd INTO cntcheck FROM t_watch_list WHERE itemcd = i_itemcd AND membercd = i_usercd AND delflg = FALSE;
        IF FOUND THEN
            code := 1;
            RETURN;
        END IF;
    END IF;

    --- 更新処理 ---

    nowdate := 'now';              -- 現在の日時を取得
    IF kubun IN (2,3) THEN
        newupdcnt := i_updcnt+1;   -- 更新カウントを進める
    END IF;

    IF kubun = 1 THEN

        INSERT INTO t_watch_list (
            membercd,
            itemcd,
            comment,
            createdate,
            delflg,
            adddate,
            upddate,
            updusrnm,
            updpcnm,
            updcnt)
        VALUES(
            i_usercd,
            i_itemcd,
            i_comment,
            nowdate,
            FALSE,
            nowdate,
            nowdate,
            i_updusrnm,
            i_updpcnm,
            0);

    -- æ›´æ–°
    ELSIF kubun = 2 THEN
        UPDATE t_watch_list SET
            watchlistcd  = i_watchlistcd,
            membercd     = i_usercd,
            itemcd       = i_itemcd,
            comment      = i_comment,
            upddate      = nowdate,
            updusrnm     = i_updusrnm,
            updpcnm      = i_updpcnm,
            updcnt       = newupdcnt
            WHERE watchlistcd = i_watchlistcd;

    -- 削除
    ELSIF kubun = 3 THEN
        UPDATE t_watch_list SET
            delflg = TRUE,
            upddate  = nowdate,
            updusrnm = i_updusrnm,
            updpcnm  = i_updpcnm,
            updcnt   = newupdcnt
        WHERE  watchlistcd = i_watchlistcd;
    END IF;

    code := 1;

END;
$$
LANGUAGE 'plpgsql' VOLATILE;