/*********************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名         ：eo顧客基幹システム
 *	モジュール名        ：JKKejbKKA0120001SecProc
 *	ソースファイル名      ：JKKejbKKA0120001SecProc.java
 *	作成者           ：GDC)J.Hortilano 
 *	日付             ：2012年06月13日
 *＜機能概要＞
 *	オーソリ情報登録API（IVR）の副次処理部品
 *＜修正履歴＞
 *	バージョン          修正日          修正者                       修正内容
 *	v58.00.00       2022/06/14   GDC)J.Hortilano             ANK-3846-00-00_【クレカ】クリアパス→ペイジェント移行
 *	v58.00.01       2022/11/30          FJ)謝               【ANK-3846-13-00】<１２月末>【クレカ】クリアパス→ペイジェント移行／【仕変13】ＩＶＲのＳＴ時期変更
 *
 **********************************************************************/

package eo.ejb.common.db;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fujitsu.futurity.model.base.CAANConnectionMgr;
import com.fujitsu.futurity.model.base.CAANJDBCUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.JSYejbConnection;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK3381ETMsg;
import eo.ejb.cbm.entity.ZM0321ETMsg;
import eo.ejb.cbm.entity.ZM0321LE;
import eo.ejb.cbs.cbsmsg.EKKA0120001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKKA0120001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKKA0120001CBSMsg2List;
import eo.ejb.cbs.cbsmsg.EKKA0120001CBSMsg3List;
import eo.ejb.cbs.cbsmsg.EKKA0120001CBSMsg4List;
import eo.ejb.common.JCCModelCommon;
import eo.ejb.common.JKKModelCommon;

/**
 * <p>
 * オーソリ情報登録API（IVR）副次処理部品
 * </p>
 * 
 * @author GDC)J.Hortilano
 */
public class JKKejbKKA0120001SecProc
{



	/** モード取得用キー */
	private static final String IVR_MODE_KEY = "IVR_API_TEST_MODE";
	/** テストモード OFF(本番・検証) */
	private static final String TEST_MODE_OFF = "OFF";
	
	/** テストモード結果コード取得用キー */
	private static final String IVR_TEST_MODE_RESULT_CODE_KEY = "IVR_TEST_MODE_RESULT_CODE";
	/** 結果コード 正常*/
	private static final String RESULT_CODE_SUCCESS = "0";
	
	
	/** URL */
    private static final String APL_CONST_URL_KEY = "KK_IVR_AUTH_IF_ADD_URL";
    /** タイムアウト時間 */
    private static final String APL_READTIMEOUT_KEY = "KK_IVR_AUTH_IF_ADD_TIMEOUT";


    /** APIキー */
	private static final String API_KEY = "apiKey";
	/** APIパスワード */
	private static final String API_PASSWORD = "apiPassword";
    /** 利用区分 */
    private static final String USEDIVISIONCODE = "useDivisionCode";
    /** 任意項目 */
    private static final String ANYITEM = "anyItem";
    /** 任意項目名称 */
    private static final String NAME = "name";
    /** 任意項目内容 */
	private static final String VALUE = "value";
	/** ユーザーID */
    private static final String USERID = "userId";
	/** オペレータ用確認コードリスト */
    private static final String OPERATORCHECKCODELIST = "operatorCheckCodeList";
	/** お客様用確認コードリスト */
    private static final String CUSTOMERCHECKCODELIST = "customerCheckCodeList";
	/** PSP 名 */
    private static final String PAYGENT = "paygent";
	/** マーチャントID */
	private static final String MERCHANTID = "merchantId";
	/** サイトID */
    private static final String SITEID = "siteId";
	/** カード登録 */
    private static final String SAVE = "save";
	/** 顧客ID */
    private static final String CUSTOMERID = "customerId";
	/** カードブランド */
    private static final String CARDBRAND = "cardBrand";
	/** カード名義人 */
    private static final String CARDHOLDERNAME = "cardholderName";
	/** 補足情報1 */
    private static final String ADDINFO1 = "addInfo1";
	/** 補足情報2 */
    private static final String ADDINFO2 = "addInfo2";
	/** 補足情報3 */
    private static final String ADDINFO3 = "addInfo3";
	/** 補足情報4 */
    private static final String ADDINFO4 = "addInfo4";
	/** 有効性チェックフラグ */
    private static final String VALIDCHECKFLG = "validCheckFlg";


	/** SMS文字コード */
	private static final String ENCODING = "UTF-8";
	/** CONTENT_TYPE  */
	private static final String CONTENT_TYPE = "Content-Type";
	/** CONTENT_TYPE_設定値  */
	private static final String CONTENT_TYPE_VALUE = "application/json; charset=UTF-8";
	
	
    /** 結果コード */
	private static final String RESULTCODE = "resultCode";
    /** エラーメッセージ一覧 */
	private static final String ERRORMESSAGELIST = "errorMessageList";
	/** 識別ID */
	private static final String DISCERNMENTID = "discernmentId";
	/** 識別ID 有効期限 */
	private static final String DISCERNMENTIDENDDATETIME = "discernmentIdEndDatetime";
	/** 受付番号 */
	private static final String RECEIPTNO = "receiptNo";


    /**
	 * コンストラクタ.
	 */
	public JKKejbKKA0120001SecProc()
	{
		super();
	}


	/**
	 * IVRのオーソリ情報登録APIを呼出す。
	 * @param inCBSMsg オーソリ情報登録API（IVR）メッセージ
	 * @param inContext AgentDispatchContext
	 * @throws Exception 
	 */
	public void execute(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws Exception
	{
		// 開始ログ出力を実施。
		JSYejbLog.println(JSYejbLog.EXECUTION, JKKejbKKA0120001SecProc.class.getClass(), "JKKejbKKA0120001SecProc#execute START");
		
		String response = null;
		
		/** 接続先などの判定に使用
		*   OFF： 本番・検証、ON: 開発
		*/
		String mode = JCCModelCommon.getApplicationConst(IVR_MODE_KEY);

		
		
		String strUrl = "";
		
		// URL
		strUrl = JCCModelCommon.getApplicationConst(APL_CONST_URL_KEY);
		// 読取タイムアウト
		String strReadTimeout = JCCModelCommon.getApplicationConst(APL_READTIMEOUT_KEY);
		// APIキー
		String apiKey = JCCModelCommon.getApplicationConst(inCBSMsg.getString(EKKA0120001CBSMsg.APIKEY));
		// APIパスワード
		String apiPassword = JCCModelCommon.getApplicationConst(inCBSMsg.getString(EKKA0120001CBSMsg.APIPASSWORD));
		// マーチャントID
		String merchantId = getWorkParamSetteValue(inCBSMsg.getString(EKKA0120001CBSMsg.MERCHANTID));

		JSYejbLog.println(JSYejbLog.EXECUTION, JKKejbKKA0120001SecProc.class.getClass() , "JKKejbKKA0120001SecProc#Content-Type=" + CONTENT_TYPE_VALUE);
		JSYejbLog.println(JSYejbLog.EXECUTION, JKKejbKKA0120001SecProc.class.getClass() , "JKKejbKKA0120001SecProc#URL=" + strUrl);
		
		// 読取タイムアウト
		int readTimeout = Integer.parseInt(strReadTimeout);

		try
		{
			// JSON形式の文字列を作成する。
			String json = requestParamMake(inCBSMsg, inContext, apiKey, apiPassword, merchantId);
			JSYejbLog.println(JSYejbLog.EXECUTION, JKKejbKKA0120001SecProc.class.getClass(), "JKKejbKKA0120001SecProc# request=" + json);
	
			// 本番・検証
			if (TEST_MODE_OFF.equals(mode))
			{
				// APIに対してリクエストを送信する。
				response = callPost(strUrl, json, readTimeout);
				JSYejbLog.println(JSYejbLog.EXECUTION, JKKejbKKA0120001SecProc.class.getClass(), "JKKejbKKA0120001SecProc# response=" + response);
				
				// レスポンス電文を設定
				editOutMsg(inCBSMsg, response);
			
			}
			// テストモード（開発）
			else
			{
				JSYejbLog.println(JSYejbLog.EXECUTION, JKKejbKKA0120001SecProc.class.getClass(), "JKKejbKKA0120001SecProc# response=dummy");
				// ダミーレスポンス
				editDummyOutMsg(inCBSMsg, inContext);
			}
			
			
		}
		catch (Exception e)
		{
			printErrorLog(e);
			JSYejbLog.println(JSYejbLog.EXECUTION, JKKejbKKA0120001SecProc.class.getClass(),"#JECNA0110001TPMA(Exception)発生" + e.toString());
			// 結果コードを未設定として返却 エラーハンドリングは呼出元に委ねる
			inCBSMsg.set(EKKA0120001CBSMsg.RESULTCODE, "");
		}
		// 終了ログ出力を実施。
		JSYejbLog.println(JSYejbLog.EXECUTION, JKKejbKKA0120001SecProc.class.getClass(), "JKKejbKKA0120001SecProc#execute END");
	}

	/**
	 * 共通APIのレスポンス電文を設定します。
	 * <br>
	 * @param inCBSMsg 個別割引適用可否照会・変更依頼メッセージ
	 * @param resServiceMap レスポンスサービスマップ
	 * @throws IOException 
	 */
	@SuppressWarnings("unchecked")
	private void editOutMsg(CAANMsg inCBSMsg, String response) throws IOException
	{

        Map<String, Object> map = new HashMap<String, Object>();
        ObjectMapper mapper = new ObjectMapper();
	    try
	    {
	    	// convert JSON string to Map
            map = mapper.readValue(response, new TypeReference<HashMap<String, Object>>() {});

            inCBSMsg.set(EKKA0120001CBSMsg.RESULTCODE, map.get(RESULTCODE));
            List<String> errorMessageList = (List<String>) map.get(ERRORMESSAGELIST);
            if(errorMessageList != null)
            {
                List<CAANMsg> caanMsg4List = new ArrayList<CAANMsg>();
                for(String errorMessage : errorMessageList)
                {
                	CAANMsg ekka0120001CBSMsg4 = new CAANMsg(EKKA0120001CBSMsg4List.class.getName());
                	ekka0120001CBSMsg4.set(EKKA0120001CBSMsg4List.ERRORMESSAGE, errorMessage);
                	caanMsg4List.add(ekka0120001CBSMsg4);
                }
                // Listから配列に変換して設定
                inCBSMsg.set(EKKA0120001CBSMsg.EKKA0120001CBSMSG4LIST, caanMsg4List.toArray(new CAANMsg[caanMsg4List.size()]));
            }
            
			inCBSMsg.set(EKKA0120001CBSMsg.DISCERNMENTID, map.get(DISCERNMENTID));
			inCBSMsg.set(EKKA0120001CBSMsg.DISCERNMENTIDENDDATETIME, map.get(DISCERNMENTIDENDDATETIME));
			inCBSMsg.set(EKKA0120001CBSMsg.RECEIPTNO, map.get(RECEIPTNO));


	    }
        catch (IOException e)
	    {
	    	printErrorLog(e);
	    	throw e;
	    }
    
	}
	
	
	/**
	 * 共通APIのダミーレスポンスを設定します。
	 * <br>
	 * @throws IOException 
	 */
	private void editDummyOutMsg(CAANMsg inCBSMsg, AgentDispatchContext inContext) throws IOException
	{
		
		// 結果コード
        String resultCode = JCCModelCommon.getApplicationConst(IVR_TEST_MODE_RESULT_CODE_KEY);
        
		inCBSMsg.set(EKKA0120001CBSMsg.RESULTCODE, resultCode);
        
		if(RESULT_CODE_SUCCESS.equals(resultCode))
		{
			// 運用日付
			String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
			// 運用日付翌日
			String nextDate = JKKModelCommon.addDay(inCBSMsg, inContext, opeDate, 1);
			
			
	        // 識別ID IVR進捗管理 の最大値に＋１
			inCBSMsg.set(EKKA0120001CBSMsg.DISCERNMENTID, getDiscernmentId(inCBSMsg, inContext, opeDate));
			// 識別ID 有効期限 運用日翌日00:00:00
			inCBSMsg.set(EKKA0120001CBSMsg.DISCERNMENTIDENDDATETIME,
				nextDate.substring(0, 4) + "/" + nextDate.substring(4, 6) + "/" + nextDate.substring(6, 8) + " 00:00:00"
			);
			// 受付番号 IVR進捗管理 の最大値に＋１
			inCBSMsg.set(EKKA0120001CBSMsg.RECEIPTNO, getReceiptNo(inCBSMsg, inContext, opeDate));
		}
		// エラーの場合
		else
        {
	        // エラーメッセージ一覧
            List<CAANMsg> caanMsg4List = new ArrayList<CAANMsg>();
            
        	CAANMsg ekka0120001CBSMsg4 = new CAANMsg(EKKA0120001CBSMsg4List.class.getName());
        	ekka0120001CBSMsg4.set(EKKA0120001CBSMsg4List.ERRORMESSAGE, "マーチャントID が正しくありません。");
        	caanMsg4List.add(ekka0120001CBSMsg4);
        	
        	CAANMsg ekka0120001CBSMsg4_2 = new CAANMsg(EKKA0120001CBSMsg4List.class.getName());
        	ekka0120001CBSMsg4_2.set(EKKA0120001CBSMsg4List.ERRORMESSAGE, "サイトID が正しくありません。");
        	caanMsg4List.add(ekka0120001CBSMsg4_2);
        	
            // Listから配列に変換して設定
            inCBSMsg.set(EKKA0120001CBSMsg.EKKA0120001CBSMSG4LIST, caanMsg4List.toArray(new CAANMsg[caanMsg4List.size()]));
        }
	}
	
	/**
	 * JSON形式の文字列を作成する。
	 * @param inCBSMsg CAANメッセージ
	 * @param inContext コンテキスト
	 * @return SMS JSON形式のリクエストパラメータを返却する。
	 * @throws IOException JOSN形式へ変換する際のI/O例外
	 */
	private String requestParamMake(CAANMsg inCBSMsg, AgentDispatchContext inContext, String apiKey, String apiPassword, String merchantId) throws IOException
	{
		// JOSN形式へ変換するためのMAP
		Map<String, Object> requestMap = new HashMap<String, Object>();
		// 変換後文字列
		String json = "";

		// APIキー
		requestMap.put(API_KEY, apiKey);
		// APIパスワード
		requestMap.put(API_PASSWORD, apiPassword);
        // 利用区分
		requestMap.put(USEDIVISIONCODE, inCBSMsg.getString(EKKA0120001CBSMsg.USEDIVISIONCODE));
		
		// 任意項目
		CAANMsg[] ekka0120001CBSMsg1List = inCBSMsg.getCAANMsgList(EKKA0120001CBSMsg.EKKA0120001CBSMSG1LIST);
		if(ekka0120001CBSMsg1List != null)
		{
			List<Map<String, Object>> anyItemList = new ArrayList<Map<String, Object>>();
			for(CAANMsg ekka0120001CBSMsg1 : ekka0120001CBSMsg1List)
			{
				if(ekka0120001CBSMsg1 == null)
				{
					continue;
				}
				Map<String, Object> anyItemMap = new HashMap<String, Object>();
				// 任意項目名称
				anyItemMap.put(NAME, ekka0120001CBSMsg1.getString(EKKA0120001CBSMsg1List.NAME));
				// 任意項目内容
				anyItemMap.put(VALUE, ekka0120001CBSMsg1.getString(EKKA0120001CBSMsg1List.VALUE));
				
				anyItemList.add(anyItemMap);
			}
			
			requestMap.put(ANYITEM, anyItemList);
		}
		
		// ユーザーID
		requestMap.put(USERID, inCBSMsg.getString(EKKA0120001CBSMsg.USERID));
		
// ANK-3846-13-00 MOD START
//		// オペレータ用確認コードリスト
//		CAANMsg[] ekka0120001CBSMsg2List = inCBSMsg.getCAANMsgList(EKKA0120001CBSMsg.EKKA0120001CBSMSG2LIST);
//		if(ekka0120001CBSMsg2List != null)
//		{
//			List<String> operatorCheckCodeList = new ArrayList<String>();
//			for(CAANMsg ekka0120001CBSMsg2 : ekka0120001CBSMsg2List)
//			{
//				if(ekka0120001CBSMsg2==null)
//				{
//					continue;
//				}
//				operatorCheckCodeList.add(ekka0120001CBSMsg2.getString(EKKA0120001CBSMsg2List.OPERATORCHECKCODE));
//			}
//			
//			requestMap.put(OPERATORCHECKCODELIST, operatorCheckCodeList);
//		}
//		
//		// お客様用確認コードリスト
//		CAANMsg[] ekka0120001CBSMsg3List = inCBSMsg.getCAANMsgList(EKKA0120001CBSMsg.EKKA0120001CBSMSG3LIST);
//		if(ekka0120001CBSMsg3List != null)
//		{
//			List<String> customerCheckCodeList = new ArrayList<String>();
//			for(CAANMsg ekka0120001CBSMsg3 : ekka0120001CBSMsg3List)
//			{
//				if(ekka0120001CBSMsg3==null)
//				{
//					continue;
//				}
//				customerCheckCodeList.add(ekka0120001CBSMsg3.getString(EKKA0120001CBSMsg3List.CUSTOMERCHECKCODE));
//			}
//			
//			requestMap.put(CUSTOMERCHECKCODELIST, customerCheckCodeList);
//		}
		// オペレータ用確認コードリスト
		requestMap.put(OPERATORCHECKCODELIST, null);
		
		// お客様用確認コードリスト
		requestMap.put(CUSTOMERCHECKCODELIST, null);
// ANK-3846-13-00 MOD END

		Map<String, Object> paygentMap = new HashMap<String, Object>();
		// マーチャントID
		paygentMap.put(MERCHANTID, merchantId);
		// サイトID
		paygentMap.put(SITEID, inCBSMsg.getString(EKKA0120001CBSMsg.SITEID));

		Map<String, Object> saveMap = new HashMap<String, Object>();
		// 顧客ID
		saveMap.put(CUSTOMERID, inCBSMsg.getString(EKKA0120001CBSMsg.CUSTOMERID));
		// カードブランド
		saveMap.put(CARDBRAND, inCBSMsg.getString(EKKA0120001CBSMsg.CARDBRAND));
		// カード名義人
		saveMap.put(CARDHOLDERNAME, inCBSMsg.getString(EKKA0120001CBSMsg.CARDHOLDERNAME));
		// 補足情報1
		saveMap.put(ADDINFO1, inCBSMsg.getString(EKKA0120001CBSMsg.ADDINFO1));
		// 補足情報2
		saveMap.put(ADDINFO2, inCBSMsg.getString(EKKA0120001CBSMsg.ADDINFO2));
		// 補足情報3
		saveMap.put(ADDINFO3, inCBSMsg.getString(EKKA0120001CBSMsg.ADDINFO3));
		// 補足情報4
		saveMap.put(ADDINFO4, inCBSMsg.getString(EKKA0120001CBSMsg.ADDINFO4));
		// 有効性チェックフラグ
		saveMap.put(VALIDCHECKFLG, inCBSMsg.getString(EKKA0120001CBSMsg.VALIDCHECKFLG));

		// カード登録
		paygentMap.put(SAVE, saveMap);

		// PSP 名
		requestMap.put(PAYGENT, paygentMap);

		ObjectMapper mapper = new ObjectMapper();
		mapper.enable(SerializationFeature.INDENT_OUTPUT);
		try
		{
			// JOSN形式へ変換
			json = mapper.writeValueAsString(requestMap);

		} catch (IOException e)
		{
			printErrorLog(e);
			throw e;
		}
		
		return json;
	}


	/**
	 * APIに対して送信するリクエストパラメータを作成する。
	 * @param json 送信するJSON文字列
	 * @param readTimeout 読取タイムアウト
	 * @return JSONレスポンスから取得したパラメータ
	 * @throws Exception 
	 */
	private String callPost(String address, String json, int readTimeout) throws IOException
	{
		// レスポンス
		StringBuffer result = new StringBuffer();
		HttpURLConnection con = null;

		IOException ex = null;

		try
		{
			ex = null;
			URL url = new URL(address);
			con = (HttpURLConnection) url.openConnection();
			// HTTPリクエストコード
			con.setRequestMethod("POST");
			// HTTPヘッダの設定
			con.setRequestProperty(CONTENT_TYPE, CONTENT_TYPE_VALUE);

			//タイムアウト設定
			con.setReadTimeout(readTimeout);

			con.setDoOutput(true);
			OutputStreamWriter out = new OutputStreamWriter(con.getOutputStream(), ENCODING);
			out.write(json);

			out.flush();

			// 接続開始ログ
			JSYejbLog.println(JSYejbLog.EXECUTION, JKKejbKKA0120001SecProc.class.getClass(), "JKKejbKKA0120001SecProc#connect start");

			// 接続
			con.connect();

			// 接続終了ログ
			JSYejbLog.println(JSYejbLog.EXECUTION, JKKejbKKA0120001SecProc.class.getClass(), "JKKejbKKA0120001SecProc#connect end");
			
			int httpStatus = con.getResponseCode();
			// HTTPステータスをログ出力
			JSYejbLog.println(JSYejbLog.EXECUTION, JKKejbKKA0120001SecProc.class, "JKKejbKKA0120001SecProc#http_status=" + httpStatus);
			
			// 通信に成功したテキストを取得する
			final InputStream in = con.getInputStream();
			String encoding = con.getContentEncoding();
			if (null == encoding)
			{
				encoding = ENCODING;
			}

			final InputStreamReader inReader = new InputStreamReader(in, encoding);
			final BufferedReader bufReader = new BufferedReader(inReader);
			String line = null;

			while ((line = bufReader.readLine()) != null)
			{
				result.append(line);
			}
             
			bufReader.close();
			inReader.close();
			in.close();
			
			// レスポンスをログ出力
			JSYejbLog.println(JSYejbLog.EXECUTION, JKKejbKKA0120001SecProc.class.getClass() ,("JKKejbKKA0120001SecProc#response=" +
					result.toString()).replaceAll("\\s+", " "));
			
			// HTTPステータスを確認
			if( HttpURLConnection.HTTP_OK != httpStatus )
			{
				throw new IOException("HTTP Status Error:" + httpStatus);
			}

		}
		catch (IOException e)
		{
			printErrorLog(e);
			ex = e;
		}
		finally
		{
			if (con != null)
			{
				//切断処理
				con.disconnect();
				con = null;
			}
		}
	
		// 例外情報がある場合はthrowする
		if (ex != null)
		{
			throw ex;
		}
		
		return result.toString();
	}
	
	/**
	 * <p>
	 * 業務パラメータマスタの照会を行います
	 * </p>
	 * @param workParamId　業務パラメータID
	 * @return 業務パラメータ設定値(該当レコードがない場合、""を返却)
	 */
	private String getWorkParamSetteValue(String workParamId)
	{
		CAANMsg zm0321Cond = new CAANMsg(ZM0321ETMsg.class.getName());
		zm0321Cond.set(ZM0321ETMsg.WORK_PARAM_ID, workParamId);
		
		CAANMsg zm0321Msg = new ZM0321LE().findByPrimaryKey(zm0321Cond);
		
		if (null == zm0321Msg)
		{
			// 該当レコードがない場合、0を返却
			return "";
		}
		
		// 業務パラメータ設定値を返却
		return zm0321Msg.getString(ZM0321ETMsg.WORK_PARAM_SETTE_VALUE);
	}
	
	/**
	 * <p>
	 * スタブ動作用にIVR識別番号を取得する。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	 * @param knkNo 金庫番号
	 */
	private String getDiscernmentId(CAANMsg inCBSMsg, AgentDispatchContext inContext, String opeDate)
	{
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK3381ETMsg.getTableName());
			
			StringBuffer sql_Buff = new StringBuffer();
			
			sql_Buff.append("select max(KK3381.IVR_SKBT_ID) as IVR_SKBT_ID ")
			.append("      from KK_T_IVR_PRG_KANRI KK3381");
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
			
			// パラメータの設定
			// なし
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// 連番6桁 初期値0
			int ivrSkbtIdSeq = 0;
			if(rsltQuery.next())
			{
				String ivrSkbtId = CAANJDBCUtil.getString(rsltQuery, 1);
				if(ivrSkbtId != null)
				{
					try{
						ivrSkbtIdSeq = Integer.parseInt(ivrSkbtId);
					}
					catch(NumberFormatException e)
					{
					}
				}
			}
			
			// カウントアップして10桁に成形
			String nextSeq = String.format("%06d", ivrSkbtIdSeq+1);
			
			return nextSeq;
		}
		catch (SQLException e)
		{
			throw new CAANRuntimeException(e);
		}
		finally
		{
			// 資源の解放
			try
			{
				if (rsltQuery != null)
				{
					rsltQuery.close();
				}
				if (pstmt != null)
				{
					pstmt.close();
				}
				if (con1 != null)
				{
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch(SQLException e)
			{
				throw new CAANRuntimeException(e);
			}
		}
	}


	/**
	 * <p>
	 * スタブ動作用にIVR受付番号を取得する。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	 * @param knkNo 金庫番号
	 */
	private String getReceiptNo(CAANMsg inCBSMsg, AgentDispatchContext inContext, String opeDate)
	{
		// コネクション
		Connection con1 = null;
		
		// プリペアステートメント
		PreparedStatement pstmt = null;
		
		// リザルトセット
		ResultSet rsltQuery = null;
		
		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK3381ETMsg.getTableName());
			
			StringBuffer sql_Buff = new StringBuffer();
			
			sql_Buff.append("select max(KK3381.IVR_UK_NO) as IVR_UK_NO ")
			.append("      from KK_T_IVR_PRG_KANRI KK3381 ")
			.append("      where ")
			.append("      KK3381.IVR_UK_NO like ?");
			
			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());
			
			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);
			
			// パラメータの設定
			CAANJDBCUtil.setParam(pstmt, 1, opeDate+"%");
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			
			// 連番10桁 初期値0
			int ivrUkNoSeq = 0;
			if(rsltQuery.next())
			{
				String ivrUkNo = CAANJDBCUtil.getString(rsltQuery, 1);
				if(ivrUkNo != null && ivrUkNo.length() >= 18)
				{
					String ivrUkNoSeqStr = ivrUkNo.substring(8, 18);
					try{
						ivrUkNoSeq = Integer.parseInt(ivrUkNoSeqStr);
					}
					catch(NumberFormatException e)
					{
					}
				}
			}
			
			// カウントアップして10桁に成形
			String nextSeq = String.format("%010d", ivrUkNoSeq+1);
			
			// 運用日付と結合して返却
			return opeDate + nextSeq;
		}
		catch (SQLException e)
		{
			throw new CAANRuntimeException(e);
		}
		finally
		{
			// 資源の解放
			try
			{
				if (rsltQuery != null)
				{
					rsltQuery.close();
				}
				if (pstmt != null)
				{
					pstmt.close();
				}
				if (con1 != null)
				{
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch(SQLException e)
			{
				throw new CAANRuntimeException(e);
			}
		}
	}


	/**
	 * エラーログ出力
	 * @param e 発生した例外
	 */
	private void printErrorLog(Exception e)
	{
		StringBuffer sb = new StringBuffer();
		sb.append(e.getMessage()+ "\n");
		sb.append(e.getClass().getName()+ "\n");
		StackTraceElement[] steAll = e.getStackTrace();
		for (StackTraceElement ste : steAll) {
			sb.append("	at " + ste.getClassName() + "." + ste.getMethodName() + "(" + ste.getFileName() + ":" + ste.getLineNumber()+")"+ "\n");
		}
		JSYejbLog.println(JSYejbLog.ERROR, JKKejbKKA0120001SecProc.class, sb.toString());
	}

}
