-- リクエストテーブル 変更
CREATE OR REPLACE FUNCTION f_request_update(
    IN integer,

    IN integer,
    IN integer,
    IN integer,
    IN integer,
    IN integer,
    IN integer,
    IN date,
    IN date,
    IN integer,
    IN integer,

    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_requestno ALIAS FOR $2;            -- リクエストコード
    i_itemcd ALIAS FOR $3;               -- 商品コード
    i_structcd ALIAS FOR $4;             -- 構成コード
    i_requestmembercd ALIAS FOR $5;      -- リクエスト者会員コード
	i_requestprice ALIAS FOR $6;         -- 希望価格
	i_requestcondition ALIAS FOR $7;     -- 希望コンディション
    i_startdate ALIAS FOR $8;            -- 開始日
    i_closedate ALIAS FOR $9;            -- 終了日
    i_requestdiv ALIAS FOR $10;          -- リクエスト区分
    i_mailinfo ALIAS FOR $11;            -- メール通知

    i_updusrnm ALIAS FOR $12;            -- 更新ユーザー名
    i_updpcnm ALIAS FOR $13;             -- 更新マシン名
    i_updcnt ALIAS FOR $14;              -- 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_itemcd IS NULL THEN
		    RAISE EXCEPTION '商品コードの引数は必須です';
		END IF;
		IF i_structcd IS NULL THEN
		    RAISE EXCEPTION '構成コードの引数は必須です';
		END IF;
		IF i_requestmembercd IS NULL THEN
		    RAISE EXCEPTION 'リクエスト者会員コードの引数は必須です';
		END IF;
		IF i_requestprice IS NULL THEN
            RAISE EXCEPTION '希望価格は必須です';
        END IF;
		IF i_requestcondition IS NULL THEN
            RAISE EXCEPTION '希望コンディションの引数は必須です';
        END IF;
		IF i_startdate IS NULL THEN
            RAISE EXCEPTION '開始日の引数は必須です';
        END IF;
		IF i_closedate IS NULL THEN
            RAISE EXCEPTION '終了日の引数は必須です';
        END IF;
		IF i_requestdiv IS NULL THEN
            RAISE EXCEPTION 'リクエスト区分の引数は必須です';
        END IF;
		IF i_mailinfo IS NULL THEN
            RAISE EXCEPTION 'メール通知の引数は必須です';
        END IF;
    END IF;

    IF kubun IN (2,3) THEN
	    IF i_requestno 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 structcd INTO cntcheck FROM t_item_struct WHERE  itemcd = i_itemcd AND structcd = i_structcd;
	    IF NOT FOUND THEN
	        RAISE EXCEPTION '商品コードと構成コードは存在しません';
    	END IF;
        SELECT membercd INTO cntcheck FROM t_member_basic_attr WHERE membercd = i_requestmembercd;
	    IF NOT FOUND THEN
	        RAISE EXCEPTION 'リクエスト者会員コードは存在しません';
    	END IF;
    END IF;

    IF kubun IN (2,3) THEN
        SELECT requestno INTO cntcheck FROM t_request WHERE requestno = i_requestno;
	    IF NOT FOUND THEN
	        RAISE EXCEPTION 'リクエストコードは存在しません';
	    END IF;
    END IF;

    -- 更新カウンタチェック
    IF kubun IN (2,3) THEN
        SELECT updcnt INTO cntcheck FROM t_request WHERE requestno = i_requestno;
          IF NOT FOUND OR cntcheck <> i_updcnt THEN
            errcd := -11;
            errmsg := '更新カウンタが不正';
            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_request (
            itemcd,
            structcd,
            requestmembercd,
            requestprice,
            requestcondition,
            startdate,
            closedate,
            requestdiv,
            mailinfo,

            delflg,
            adddate,
            upddate,
            updusrnm,
            updpcnm,
            updcnt)
        VALUES(
            i_itemcd,
            i_structcd,
            i_requestmembercd,
            i_requestprice,
            i_requestcondition,
            i_startdate,
            i_closedate,
            i_requestdiv,
            i_mailinfo,

            FALSE,
            nowdate,
            nowdate,
            i_updusrnm,
            i_updpcnm,
            0);

    -- 更新
    ELSIF kubun = 2 THEN
        UPDATE t_request SET
            itemcd           = i_itemcd,
            structcd         = i_structcd,
            requestmembercd  = i_requestmembercd,
            requestprice     = i_requestprice,
            requestcondition = i_requestcondition,
            startdate        = i_startdate,
            closedate        = i_closedate,
            requestdiv       = i_requestdiv,
            mailinfo         = i_mailinfo,
            upddate          = nowdate,
            updusrnm         = i_updusrnm,
            updpcnm          = i_updpcnm,
            updcnt           = newupdcnt
            WHERE requestno = i_requestno;

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

    code := 1;

END;
$$
LANGUAGE 'plpgsql' VOLATILE;
