	-- F_YOYAKU
	--  ※引数
	--     i_sm_date     年月日時間秒(YYYYMMDDhi24miss) 14桁
	--     i_sm_no       年月日時間秒(YYYYMMDDhi24miss) 14桁
	--     i_hanasho_cd  
	--     i_rsv_cnt     
	--  ※返値   
	--     o_ymdhms 分
	--  
	--  (i_left - i_right ) の計算結果を分で返す 24時間形式で送る必要あり
	--  
	--      
	--  

CREATE OR REPLACE FUNCTION F_YOYAKU (
	   i_sm_date          IN    INTEGER
	  ,i_sm_no            IN    INTEGER
	  ,i_hanasho_cd       IN    INTEGER
	  ,i_rsv_cnt          IN    INTEGER
 )
	RETURNS setof ProcReturnsMsg
AS '
declare
	retMsg                      ProcReturnsMsg;				-- 返り値用変数
	zansu                       INTEGER;
	o_rsv_no                    t_yoyaku.rsv_no%TYPE;
	cur_t_shuka                 t_shuka%ROWTYPE;
	o_shuka_no                  varchar(100);
	i_InpChk                    boolean;
	
	
BEGIN
	o_shuka_no := ''出荷No '' || i_sm_date || ''-'' || lpad(i_sm_no,5,''0'');
	
	-- 出荷データの取得
	SELECT * INTO cur_t_shuka 
	FROM t_shuka 
	 WHERE sm_date = i_sm_date
	 AND   sm_no   = i_sm_no
	 AND   sm_kbn  = 0;

	IF cur_t_shuka.sm_date IS NULL THEN
		retMsg.v_code  := 10001;
		retMsg.v_msg   := o_shuka_no || ''出荷データが存在しません'';
		return next retMsg;
		return;
	END IF;
	
	-- 残数オーバーのチェック
	SELECT COALESCE(sum(rsv_cnt),0) INTO zansu 
	FROM t_yoyaku
	 WHERE sm_date = i_sm_date
	 AND   sm_no   = i_sm_no;
	
	RAISE NOTICE ''総数    ====[%]'',cur_t_shuka.sou_cnt;
	RAISE NOTICE ''残数    ====[%]'',zansu;
	RAISE NOTICE ''予約数  ====[%]'',i_rsv_cnt;
	IF (cur_t_shuka.sou_cnt - zansu - i_rsv_cnt) < 0 THEN
		retMsg.v_code  := 10002;
		retMsg.v_msg   := o_shuka_no || ''：出荷残数を超える予約数は入力できません。'';
		return next retMsg;
		return;
	END IF;
	
	SELECT COUNT(*) + 1 into o_rsv_no 
	FROM t_yoyaku a
	WHERE a.sm_date = i_sm_date
	AND a.sm_no = i_sm_no;
	
	insert into t_yoyaku
	(
		 sm_date
		,sm_no
		,rsv_no
		,seisan_cd
		,hanasho_cd
		,rsv_cnt
		,add_ymd
		,add_usr)
	values(
		 cur_t_shuka.sm_date
		,cur_t_shuka.sm_no
		,o_rsv_no
		,cur_t_shuka.user_cd
		,i_hanasho_cd
		,i_rsv_cnt
		,current_timestamp
		,i_hanasho_cd
	);
	
	-- ここまで来たらOK
	retMsg.v_code  := 0;
	retMsg.v_msg   := o_shuka_no || ''：予約完了しました。'';
	retMsg.v_query := o_rsv_no;
	return next retMsg;
	return ;
EXCEPTION
	WHEN division_by_zero THEN
		RAISE NOTICE ''caught division_by_zero'';
		retMsg.v_code  := 99999;
		retMsg.v_msg   := o_shuka_no || ''：未知なるエラーで処理が中断されました。'';
		retMsg.v_query := NULL;
		return next retMsg;
		return;
END
'
language 'plpgsql';
