/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKClrAzkriSnnReqCC
*	ソースファイル名：JKKClrAzkriSnnReqCC.java
*	作成者			：FJ
*	日付			：2022年04月18日
*＜機能概要＞
*	Claris預かり承認依頼CC部品
*＜修正履歴＞
*	バージョン	修正日		修正者			修正内容
*   v58.00.00	2022/04/18	FJ) 藤本涼		【ANK-3846-00-00】【クレカ】クリアパス→ペイジェント移行
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadOnly;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.ErrorInfoMapKeys;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;
import com.fujitsu.futurity.model.common.check.HalfCharCheck;
import com.fujitsu.futurity.model.common.check.LengthCheck;




import eo.ejb.cbs.cbsmsg.EKKA0010003CBSMsg;


public class JKKClrAzkriSnnReqCC extends AbstractCommonComponent{
	
	/** リクエストキー：機能コード */
	private static final String IN_FUNC_CODE = "func_code";
	/** リクエストキー：サイトID */
	private static final String IN_SITE_ID = "site_id";
	/** リクエストキー：カード情報トークン */
	private static final String IN_CARD_TOKEN = "card_token";
	/** リクエストキー：有効期限 */
	private static final String IN_CARDEXP = "cardexp";
	/** リクエストキー：セキュリティコード利用 */
	private static final String IN_SECURITY_CODE_USE = "security_code_use";
	
	/** レスポンスキー：処理結果コード */
	private static final String OUT_CR_RESULTCODE = "cr_resultcode";
	/** レスポンスキー：レスポンスコード */
	private static final String OUT_RESPONSE_CODE = "response_code";
	/** レスポンスキー：レスポンス詳細 */
	private static final String OUT_RESPONSE_DETAIL = "response_detail";
	/** レスポンスキー：ハッシュタグ */
	private static final String OUT_HASHTAG = "hashtag";
	/** レスポンスキー：カード番号 */
	private static final String OUT_CR_CARDNUMBER = "cr_cardnumber";
	/** レスポンスキー：カード有効期限 */
	private static final String OUT_CARD_VALID_TERM = "card_valid_term";
	/** レスポンスキー：カード名義人 */
	private static final String OUT_CARDHOLDER_NAME = "cardholder_name";
	/** レスポンスキー：仕向先カード会社コード */
	private static final String OUT_CR_BRANDCODE = "cr_brandcode";
	/** レスポンスキー：カード預りID */
	private static final String OUT_SAVE_ID = "save_id";
	/** レスポンスキー：カード種別 */
	private static final String OUT_CARD_TYPE = "card_type";
	/** レスポンスキー：イシュア区分 */
	private static final String OUT_ISSUER_CLASS = "issuer_class";
	/** レスポンスキー：カードブランド */
	private static final String OUT_CARD_BRAND_OPTCD = "card_brand_optcd";
	
	/** 取引年月日 */
	private static final String CR_ORDERDATE = "cr_orderdate";
	/** 取引時間 */
	private static final String CR_ORDERTIME = "cr_ordertime";
	
	/** リターンメッセージ */
	private static final String RETURN_MESSAGE_STRING = "RETURN_MESSAGE_";
	/** リターンメッセージ */
	private static final String RETURN_MESSAGE_FORMAT = "%1$04d";
	/** リターンコード(正常)  */
	private static final int RETURN_CODE_NORMAL = 0;
	/** エラー項目文字列 */
	private static final String STR_ERR = "_err";

	/** エラー用 */
	private static final String SC_ERROR_STRING = "サービスコンポーネントエラー";
	
	/** APIエラーコード_E1：必須チェックエラー */
	private static final String RES_KEY_ERROR_CODE_E1 = "E1";
	/** APIエラーコード_E2：属性チェックエラー */
	private static final String RES_KEY_ERROR_CODE_E2 = "E2";
	/** APIエラーコード_E3：桁数チェックエラー */
	private static final String RES_KEY_ERROR_CODE_E3 = "E3";
	/** APIエラーコード_EA：有効期限チェックエラー */
	private static final String RES_KEY_ERROR_CODE_EA = "EA";
	
	/** リターンコード_1000：単項目チェック */
	private static final int RES_RETURN_CODE_1000 = 1000;
	/** リターンコード_1100：関連チェック */
	private static final int RES_RETURN_CODE_1100 = 1100;
	
	/**預かりオーソリ依頼 */
	private static final String SC_NAME_EKKA0010003 = "EKKA0010003";
	
	/** マーチャントＩＤ */
	private static final String PAYGENT_MERCHANT_ID = "PAYGENT_MERCHANT_ID";	
	/** 接続ID */
	private static final String PAYGENT_CONNECT_ID = "PAYGENT_CONNECT_ID";	
	/** 接続パスワード */
	private static final String PAYGENT_CONNECT_PASSWORD = "PAYGENT_CONNECT_PASSWORD";	
	/** 電文バージョン番号 */
	private static final String PAYGENT_TELEGRAM_VERSION = "PAYGENT_TELEGRAM_VERSION";	
	
	public IRequestParameterReadWrite getClrAzkriSnnReq(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable{
		
		// ユーザデータ取得
		HashMap<String, Object> userData =(HashMap<String, Object>)param.getData(fixedText);
		// オーソリ結果格納マップ
		HashMap<String, Object> authRslt = new HashMap<String, Object>();
		
		// 取引年月日:当該オーソリを依頼した時点のeo顧客基幹システムのシステム日時の年月日(yyyyMMdd)を設定
		String orderdate = com.fujitsu.futurity.bp.custom.common.JFUBPCommon.getSysDateTime().substring(0, 8);
		// 取引時間:当該オーソリを依頼した時点のeo顧客基幹システムにおけるシステム日時の時分秒(HHmmss)
		String ordertime = com.fujitsu.futurity.bp.custom.common.JFUBPCommon.getSysDateTime().substring(8, 14);
		
		// 単項目・関連チェック
		if (!checkUnitParam(param, userData, orderdate))
		{
			// 例外をスロー
			throw new CCException(SC_ERROR_STRING, new Exception());
		}
		
		//預かりオーソリ依頼
		callEKKA0010003SC(param, handle, authRslt, userData, orderdate, ordertime);

		param.setData(fixedText, authRslt);

		// 結果を返却する。
		return param;
	}	
	
	/**
	 * 単項目・関連チェック
	 * 
	 * @param userData
	 * @return チェックの判定
	 * @throws Exception
	 */
	private boolean checkUnitParam(IRequestParameterReadWrite param, HashMap<String, Object> userData, String date) throws Exception
	{
		// エラーリスト
		ArrayList<Object> errList = new ArrayList<Object>();
		HashMap<String, Object> errorMap = new HashMap<String, Object>();
		HashMap<String, String> errorMapChild = new HashMap<String, String>();
		
		String itemName = null;
		String itemValue = null;
		int cardexpValue = 0;
		// エラーチェックフラグ
		boolean errExists = false;
		
		// サイトID
		itemName = IN_SITE_ID;
		itemValue = (String)userData.get(itemName);
		// 必須チェック
		if ( itemValue == null || "".equals(itemValue) )
		{
			// 必須チェックエラー
			errExists = true;
			userData.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E1);
			errorMapChild.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E1);
		}
		else if (!HalfCharCheck.isEnNumber1Check(itemValue))
		{
			// 形式チェックエラー
			errExists = true;
			userData.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E2);
			errorMapChild.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E2);
		}
		else if (!LengthCheck.isLength1Check(itemValue, 4))
		{
			// 桁数チェックエラー
			errExists = true;
			userData.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E3);
			errorMapChild.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E3);
		}
		
		// カード情報トークン
		itemName = IN_CARD_TOKEN;
		itemValue = (String)userData.get(itemName);
		// 必須チェック
		if ( itemValue == null || "".equals(itemValue) )
		{
			// 必須チェックエラー
			errExists = true;
			userData.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E1);
			errorMapChild.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E1);
		}
		else if (!HalfCharCheck.isEnNumber2Check(itemValue))
		{
			// 形式チェックエラー
			errExists = true;
			userData.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E2);
			errorMapChild.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E2);
		}
		else if (!LengthCheck.isLength1Check(itemValue, 30))
		{
			// 桁数チェックエラー
			errExists = true;
			userData.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E3);
			errorMapChild.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E3);
		}
		
		// 有効期限
		itemName = IN_CARDEXP;
		itemValue = (String)userData.get(itemName);
		// 必須チェック
		if ( itemValue == null || "".equals(itemValue) )
		{
			// 必須チェックエラー
			errExists = true;
			userData.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E1);
			errorMapChild.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E1);
		}
		else if (!HalfCharCheck.isNumber1Check(itemValue))
		{
			// 形式チェックエラー
			errExists = true;
			userData.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E2);
			errorMapChild.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E2);
		}
		else if (!LengthCheck.isLength1Check(itemValue, 4))
		{
			// 桁数チェックエラー
			errExists = true;
			userData.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E3);
			errorMapChild.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E3);
		}
		
		// セキュリティコード利用
		itemName = IN_SECURITY_CODE_USE;
		itemValue = (String)userData.get(itemName);
		// 必須チェック
		if ( itemValue == null || "".equals(itemValue) )
		{
			// 必須チェックエラー
			errExists = true;
			userData.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E1);
			errorMapChild.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E1);
		}
		else if (!HalfCharCheck.isNumber1Check(itemValue))
		{
			// 形式チェックエラー
			errExists = true;
			userData.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E2);
			errorMapChild.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E2);
		}
		else if (!LengthCheck.isLength1Check(itemValue, 1))
		{
			// 桁数チェックエラー
			errExists = true;
			userData.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E3);
			errorMapChild.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_E3);
		}
		
		// 単項目チェックエラーが発生している場合、結果を返却
		if (errExists)
		{
			String formatStatus = String.format(RETURN_MESSAGE_FORMAT, RES_RETURN_CODE_1000);
			String message = JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);

			errorMap.put(ErrorInfoMapKeys.RETURN_CODE, RETURN_CODE_NORMAL);
			errorMap.put(ErrorInfoMapKeys.TEMPLATE_ID, SC_NAME_EKKA0010003);
			errorMap.put(ErrorInfoMapKeys.STATUS, RES_RETURN_CODE_1000);
			errorMap.put(ErrorInfoMapKeys.ITEM_CHECK_ERRORS, errorMapChild);
			errList.add(errorMap);

			param.setControlMapData(SCControlMapKeys.ERROR_INFO, errList);
			
			return false;
		}
		
		// 単項目チェックエラーが発生していない場合、関連チェック実行
		if (!errExists)
		{
			// 有効期限チェック
			itemName = IN_CARDEXP;
			itemValue = (String)userData.get(itemName);
			cardexpValue = Integer.parseInt(itemValue);
			// システム日付を取得
			String orderdate = date.substring(2, 6);
			int odate = Integer.parseInt(orderdate);
			
			if ( cardexpValue < odate )
			{
				// 有効期限チェックエラー
				errExists = true;
				userData.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_EA);
				errorMapChild.put(itemName + STR_ERR, RES_KEY_ERROR_CODE_EA);
			}
			
			// 関連チェックエラーが発生した場合
			if (errExists)
			{
				String formatStatus = String.format(RETURN_MESSAGE_FORMAT, RES_RETURN_CODE_1100);
				String message = JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + formatStatus);
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
				
				errorMap.put(ErrorInfoMapKeys.RETURN_CODE, RETURN_CODE_NORMAL);
				errorMap.put(ErrorInfoMapKeys.TEMPLATE_ID, SC_NAME_EKKA0010003);
				errorMap.put(ErrorInfoMapKeys.STATUS, RES_RETURN_CODE_1100);
				errorMap.put(ErrorInfoMapKeys.ITEM_CHECK_ERRORS, errorMapChild);
				errList.add(errorMap);

				param.setControlMapData(SCControlMapKeys.ERROR_INFO, errList);
				
				return false;
			}
		}
		
		return true;
	}
	
	/**
	 * 預かりオーソリ依頼SIF呼び出し
	 * @param param
	 * @param handle
	 * @param paramMap
	 * @param resultHash
	 * @return,u8
	 * @throws Throwable
	 */
	private int callEKKA0010003SC(IRequestParameterReadWrite param, SessionHandle handle, HashMap<String, Object> authori,
			 HashMap<String, Object> userData, String orderdate, String ordertime) throws Throwable
		{
			HashMap<String, Object> sIFRequest = null;
			CAANMsg template = null;
			ServiceComponentRequestInvoker scCall = null;
			Map<?, ?> sIFResult = null;
			int status = 0;

			// サービスIF共通の情報を設定
			sIFRequest = editInMsgCmn(param);

			// EKKA0010003への呼び出しパラメータ設定
			template = new CAANMsg(EKKA0010003CBSMsg.class.getName());
			mappingEKKA0010003InMsg(template,userData,param);
			editBasicCmn(param, template);

			// リクエスト用クラスの設定
			sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{template});

			// SC呼び出しクラスの生成
			scCall = new ServiceComponentRequestInvoker();

			// SIFの呼び出し
			sIFResult = scCall.run(sIFRequest, handle);

			// エラーマッピング
			editResultRP(sIFResult, param, userData);
			
			//下りマッピング
			setClarisData(sIFResult,authori,userData,orderdate,ordertime);
			
			// ステータスコードの取得
			status = template.getInt(JCMConstants.STATUS_INT_KEY);

			return status;
		}
	/**
	 * サービスI/F実行用の共通部を設定します<br>
	 * <br>
	 * 
	 * @param param (I) 業務データ取得用I/F
	 * @param msg データ登録内容
	 * @return オプションサービス契約作成数
	 * @throws RequestParameterException
	 * @exception RequestParameterExceptionがスローされます 。
	 */
	private HashMap<String, Object> editInMsgCmn(IRequestParameterReadOnly param) 
	throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		//電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		
		//ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		
		//オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		
		//サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());
		
		//依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		
		//依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		
		//依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		
		//オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
				
		return paramMap;
		
	}
	
	/**
	 * templateに対してEKKA0010003の条件に関する部分を設定する
	 * 
	 * @param template
	 * @param param 
	 * @param inHash
	 * @throws RequestParameterException 
	 */
	private void mappingEKKA0010003InMsg(CAANMsg template,HashMap<String, Object> userData, IRequestParameterReadWrite param) throws RequestParameterException
	{
	
		// 全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKKA0010003CBSMsg().getContents());

		// テンプレートID
		template.set(EKKA0010003CBSMsg.TEMPLATEID, "EKKA0010003");
		// 機能コード
		template.set(EKKA0010003CBSMsg.FUNC_CODE, "1");
		// マーチャントＩＤ(後続処理でパラメータ取得用のキー情報)
		template.set(EKKA0010003CBSMsg.PY_MERCHANT_ID, PAYGENT_MERCHANT_ID);
		// 接続ID(後続処理でパラメータ取得用のキー情報)
		template.set(EKKA0010003CBSMsg.PY_CONNECT_ID, PAYGENT_CONNECT_ID);
		// 接続パスワード(後続処理でパラメータ取得用のキー情報)
		template.set(EKKA0010003CBSMsg.PY_CONNECT_PASSWORD, PAYGENT_CONNECT_PASSWORD);
		// 電文バージョン番号(後続処理でパラメータ取得用のキー情報)
		template.set(EKKA0010003CBSMsg.PY_TELEGRAM_VERSION, PAYGENT_TELEGRAM_VERSION);
		// サイトID
		template.set(EKKA0010003CBSMsg.PY_SITE_ID, (String)userData.get(IN_SITE_ID));
		// カード情報トークン
		template.set(EKKA0010003CBSMsg.PY_CARD_TOKEN, (String)userData.get(IN_CARD_TOKEN));
		// セキュリティコード利用
		template.set(EKKA0010003CBSMsg.PY_SECURITY_CODE_USE, (String)userData.get(IN_SECURITY_CODE_USE));
		
	}
	/**
	 * 条件部の共通する項目の設定
	 * @param param リクエストパラメータ
	 * @param template template 条件の設定先
	 * @throws RequestParameterException
	 */
	public void editBasicCmn(IRequestParameterReadOnly param, CAANMsg template)
	throws RequestParameterException
	{
		
		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);
		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);
		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);
	}

	/**
	 * <pre>
	 * サービスコンポーネント実行後に、IRequestParameterReadWriteに必要なデータをマッピングする
	 * 
	 * @param msgList CAANMsgクラス
	 * @param param 業務データ取得・書込用I/F
	 * @param fixedText ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable
	 */
	public IRequestParameterReadWrite editResultRP(Map<?, ?> msgList, IRequestParameterReadWrite param, HashMap<String, Object> inMap)
			throws Throwable
	{
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Integer returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);
		
		// テンプレートID、ステータス取得
		String templateId = template.getString(JCMConstants.TEMPLATE_ID_KEY);
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);

		if (returnCode.intValue() != 0)
		{
			templateStatus = 9000;
		}
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}

		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		
		// ユーザデータ情報にエラー情報をマッピング
		Object[][] contents = null;
		
		if (SC_NAME_EKKA0010003.equals(templateId))
		{
			contents = new EKKA0010003CBSMsg().getContents();
		}
	
		for (int i = 0; contents != null && i < contents.length; i++)
		{
			String element = null;
			element = (String)contents[i][0];
			if (element.indexOf("_err") > 0)
			{
				if (!template.isNull(element))
				{
					if (!inMap.containsKey(element))
					{
						inMap.put(element, template.getString(element));
					}
				}
			}
		}

		// エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));
		
		/* ◇処理結果の判定 */
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		String rtnCode = returnCode.toString();
		int status = template.getInt(JCMConstants.STATUS_INT_KEY);

		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status))
		{
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
			throw scCallEx;
		}
		
		
		return param;
	}
	
	
	/**
	 * Nullマッピングで埋める
	 * @param msg 対象クラス
	 * @param contents 対応クラスのフィールド列挙
	 */
	private void fillCAANMSGNullMapping(CAANMsg msg, Object[][] contents)
	{
		
		//要素ごとのループ
		for(int i = 0 ; i < contents.length ; i++)
		{
			
			Object element = null;
			
			//キーに該当する箇所の取得
			element = contents[i][0];

			//Nullでマッピング
			msg.setNull((String)element);
			
		}
		
	}
	
	/**
	 * Clarisへ返却するレスポンスデータを設定する
	 * @param sIFResult
	 * @param authori
	 * @param userData
	 * @throws RequestParameterException
	 */
	private void setClarisData(Map<?, ?> sIFResult,HashMap<String, Object> authRslt, HashMap<String, Object> userData, String orderdate, String ordertime) throws RequestParameterException 
	{

		CAANMsg[] templates = (CAANMsg[])sIFResult.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];
		
		// 機能コード
		authRslt.put(IN_FUNC_CODE, (String)userData.get(IN_FUNC_CODE));
		// サイトID
		authRslt.put(IN_SITE_ID, template.getString(EKKA0010003CBSMsg.PY_SITE_ID));
		// カード情報トークン
		authRslt.put(IN_CARD_TOKEN, template.getString(EKKA0010003CBSMsg.PY_CARD_TOKEN));
		// 有効期限
		authRslt.put(IN_CARDEXP, (String)userData.get(IN_CARDEXP));
		// セキュリティコード利用
		authRslt.put(IN_SECURITY_CODE_USE, (String)userData.get(IN_SECURITY_CODE_USE));
		// 処理結果コード
		authRslt.put(OUT_CR_RESULTCODE, template.getString(EKKA0010003CBSMsg.PY_RESULTCODE));
		// レスポンスコード
		authRslt.put(OUT_RESPONSE_CODE, template.getString(EKKA0010003CBSMsg.PY_RESPONSE_CODE));
		// レスポンス詳細
		authRslt.put(OUT_RESPONSE_DETAIL, template.getString(EKKA0010003CBSMsg.PY_RESPONSE_DETAIL));
		// ハッシュタグ
		authRslt.put(OUT_HASHTAG, template.getString(EKKA0010003CBSMsg.PY_FINGERPRINT));
		// カード番号
		authRslt.put(OUT_CR_CARDNUMBER, template.getString(EKKA0010003CBSMsg.PY_MASKED_CARD_NUMBER));
		// カード有効期限
		authRslt.put(OUT_CARD_VALID_TERM, template.getString(EKKA0010003CBSMsg.PY_CARD_VALID_TERM));
		// カード名義人
		authRslt.put(OUT_CARDHOLDER_NAME, template.getString(EKKA0010003CBSMsg.PY_CARDHOLDER_NAME));
		// 仕向先カード会社コード
		authRslt.put(OUT_CR_BRANDCODE, template.getString(EKKA0010003CBSMsg.PY_ACQ_ID));
		// カード預りID
		authRslt.put(OUT_SAVE_ID, template.getString(EKKA0010003CBSMsg.PY_CUSTOMER_ID));
		// カード種別
		authRslt.put(OUT_CARD_TYPE, template.getString(EKKA0010003CBSMsg.PY_DEBIT_PREPAID_TYPE));
		// イシュア区分
		authRslt.put(OUT_ISSUER_CLASS, template.getString(EKKA0010003CBSMsg.PY_ISSUR_CLASS));
		// カードブランド
		authRslt.put(OUT_CARD_BRAND_OPTCD, template.getString(EKKA0010003CBSMsg.PY_CARD_BRAND));
		// 取引年月日
		authRslt.put(CR_ORDERDATE, orderdate);
		// 取引時間
		authRslt.put(CR_ORDERTIME, ordertime);
	
	}
	
}