/*******************************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************************
 *＜プログラム内容＞
 * システム名        ：eo顧客基幹システム
 * モジュール名      ：JKKCardUkInfoUpdCC
 * ソースファイル名  ：JKKCardUkInfoUpdCC.java
 * 作成者            ：富士通
 * 日付              ：2022年07月21日
 *＜機能概要＞
 * カード受付情報登録CC部品
 *＜修正履歴＞
 * バージョン    修正日      修正者      修正内容
*	v58.00.00	2022/07/12	FJ)北村		【IT1-2022-0000041】オーソリNG時、カード受付情報の登録不可事象への対応
 *
 ********************************************************************************/
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.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
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 eo.common.constant.JPCModelConstant;
import eo.common.util.JCRUtilCommon;
import eo.ejb.cbs.cbsmsg.EKK3391D010CBSMsg;

public class JKKCardUkInfoUpdCC extends AbstractCommonComponent
{
	/** テンプレートID(カード受付情報登録) */
	private static final String TEMPLATE_ID_EKK3391D010 = "EKK3391D010";

	/** エラー項目末尾辞 */
	private static final String PREFIX_ERR_ITEM = "_err";

	/** オーソリ結果 */
	public static final String AUTH_RESULT = "authRslt";

	/** オーソリ結果マップキー（サイトID) */
	public static final String PY_SITE_ID = "py_site_id";

	/** オーソリ結果マップキー（マーチャント取引ＩＤ) */
	public static final String PY_TRADING_ID = "py_trading_id";

	/** オーソリ結果マップキー（カード情報トークン) */
	public static final String PY_CARD_TOKEN = "py_card_token";

	/** オーソリ結果マップキー（決済金額) */
	public static final String PY_PAYMENT_AMOUNT = "py_payment_amount";

	/** オーソリ結果マップキー（セキュリティコード利用) */
	public static final String PY_SECURITY_CODE_USE = "py_security_code_use";

	/** オーソリ結果マップキー（処理結果コード) */
	public static final String PY_RESULTCODE = "py_resultcode";

	/** オーソリ結果マップキー（レスポンスコード) */
	public static final String PY_RESPONSE_CODE = "py_response_code";

	/** オーソリ結果マップキー（レスポンス詳細) */
	public static final String PY_RESPONSE_DETAIL = "py_response_detail";

	/** オーソリ結果マップキー（顧客カード数) */
	public static final String PY_NUM_OF_CARDS = "py_num_of_cards";

	/** オーソリ結果マップキー（決済ID) */
	public static final String PY_PAYMENT_ID = "py_payment_id";

	/** オーソリ結果マップキー（顧客カードID) */
	public static final String PY_CUSTOMER_CARD_ID = "py_customer_card_id";

	/** オーソリ結果マップキー（カード発行会社コード) */
	public static final String PY_ISSUR_ID = "py_issur_id";

	/** オーソリ結果マップキー（カード発行会社名) */
	public static final String PY_ISSUR_NAME = "py_issur_name";

	/** オーソリ結果マップキー（フィンガープリント) */
	public static final String PY_FINGERPRINT = "py_fingerprint";

	/** オーソリ結果マップキー（マスクされたカード番号) */
	public static final String PY_MASKED_CARD_NUMBER = "py_masked_card_number";

	/** オーソリ結果マップキー（FC取引有無) */
	public static final String PY_FC_AUTH_UMU = "py_fc_auth_umu";

	/** オーソリ結果マップキー（カード有効期限) */
	public static final String PY_CARD_VALID_TERM = "py_card_valid_term";

	/** オーソリ結果マップキー（カード名義人) */
	public static final String PY_CARDHOLDER_NAME = "py_cardholder_name";

	/** オーソリ結果マップキー（代行提携コード) */
	public static final String PY_DAIKO_CODE = "py_daiko_code";

	/** オーソリ結果マップキー（カード種類コード) */
	public static final String PY_CARD_SHU_CODE = "py_card_shu_code";

	/** オーソリ結果マップキー（取扱カード会社コード) */
	public static final String PY_ACQ_ID = "py_acq_id";

	/** オーソリ結果マップキー（カナカード名称) */
	public static final String PY_K_CARD_NAME = "py_k_card_name";

	/** オーソリ結果マップキー（取扱カード会社名) */
	public static final String PY_ACQ_NAME = "py_acq_name";

	/** オーソリ結果マップキー（ACS支払人認証要求Html) */
	public static final String PY_OUT_ACS_HTML = "py_out_acs_html";

	/** オーソリ結果マップキー（顧客ID) */
	public static final String PY_CUSTOMER_ID = "py_customer_id";

	/** オーソリ結果マップキー（デビット・プリペイド判定結果) */
	public static final String PY_DEBIT_PREPAID_TYPE = "py_debit_prepaid_type";

	/** オーソリ結果マップキー（Attempt区分) */
	public static final String PY_ATTEMPT_KBN = "py_attempt_kbn";

	/** オーソリ結果マップキー（イシュア区分) */
	public static final String PY_ISSUR_CLASS = "py_issur_class";

	/** オーソリ結果マップキー（カードブランド) */
	public static final String PY_CARD_BRAND = "py_card_brand";

	/** オーソリ結果マップキー（承認番号) */
	public static final String PY_SHONIN_NO = "py_shonin_no";

	/** オーソリ実施区分名 */
	public static final String AUTH_JSSI_DIV = "authJssiDiv";

	/** 処理結果 正常 */
	private final static String RESULT_OK = "0";

	/** 処理結果 異常 */
	private final static String RESULT_NG = "1";

	/** オーソリ実施区分:1(預かりオーソリ) */
	public static final String AUTH_JSSI_DIV_AZ = "1";

	/** オーソリ実施区分:2(有効性チェック) */
	public static final String AUTH_JSSI_DIV_YK = "2";

	/** メール送信状態コード:0(未送信) */
	public static final String MAIL_SEND_STAT_CD_MISOSIN = "0";

	/** デビット・プリペイド判定結果（other：その他） */
	private final static String DEBIT_PREPAID_TYPE_OTHER = "other";

	/** デビット・プリペイド判定結果（debit：デビットカード） */
	private final static String DEBIT_PREPAID_TYPE_DEBIT = "debit";

	/** デビット・プリペイド判定結果（prepaid：プリペイドカード） */
	private final static String DEBIT_PREPAID_TYPE_PREPAID = "prepaid";

	/** デビット・プリペイド判定結果コード（other：その他） */
	private final static String DEBIT_PREPAID_TYPE_OTHER_CD = "0";

	/** デビット・プリペイド判定結果コード（debit：デビットカード　） */
	private final static String DEBIT_PREPAID_TYPE_DEBIT_CD = "1";

	/** デビット・プリペイド判定結果コード（prepaid：プリペイドカード） */
	private final static String DEBIT_PREPAID_TYPE_PREPAID_CD = "2";

	/** カードブランド（JCB） */
	private final static String CARD_BRAND_JCB = "JCB";

	/** カードブランド（VISA） */
	private final static String CARD_BRAND_VISA = "VISA";

	/** カードブランド（MASTER） */
	private final static String CARD_BRAND_MASTER = "MASTER";

	/** カードブランド（HOUSE） */
	private final static String CARD_BRAND_HOUSE = "HOUSE";

	/** カードブランド（DINERS） */
	private final static String CARD_BRAND_DINERS = "DINERS";

	/** カードブランド（AMEX） */
	private final static String CARD_BRAND_AMEX = "AMEX";

	/** カードブランドコード（JCB） */
	private final static String CARD_BRAND_JCB_CD = "00001";

	/** カードブランドコード（VISA） */
	private final static String CARD_BRAND_VISA_CD = "00002";

	/** カードブランドコード（MASTER） */
	private final static String CARD_BRAND_MASTER_CD = "00003";

	/** カードブランド（イオンクレジット） */
	private final static String CARD_BRAND_HOUSE_CD = "00006";

	/** カードブランドコード（DINERS） */
	private final static String CARD_BRAND_DINERS_CD = "00012";

	/** カードブランドコード（AMEX） */
	private final static String CARD_BRAND_AMEX_CD = "00013";

	/** 預かりオーソリ時の設定内容 */
	private static final String[] EKK3391D010AZ_LIST = {
		EKK3391D010CBSMsg.AUTHORI_JSSI_DIV,
		EKK3391D010CBSMsg.MAIL_SEND_STAT_CD,
		EKK3391D010CBSMsg.SITE_ID,
		EKK3391D010CBSMsg.CARD_INFO_TOKEN,
		EKK3391D010CBSMsg.SECURITY_CD_USE,
		EKK3391D010CBSMsg.TRN_RSLT,
		EKK3391D010CBSMsg.AUTH_RSLT_RSP_CD,
		EKK3391D010CBSMsg.AUTH_RSLT_RSP_DTL,
		EKK3391D010CBSMsg.CUST_CARD_NUM,
		EKK3391D010CBSMsg.CUST_CARD_ID,
		EKK3391D010CBSMsg.CARD_HAKKO_COMP_CD,
		EKK3391D010CBSMsg.CARD_HAKKO_COMP_NM,
		EKK3391D010CBSMsg.FINGERPRINT,
		EKK3391D010CBSMsg.MASKZM_CARD_NO,
		EKK3391D010CBSMsg.CARD_YK_KIGEN,
		EKK3391D010CBSMsg.CARD_MEIGIN,
		EKK3391D010CBSMsg.SHIKOSAKI_CARD_COMP_CD,
		EKK3391D010CBSMsg.SHIKOSAKI_CARD_COMP_NM,
		EKK3391D010CBSMsg.CARD_AZKRI_ID,
		EKK3391D010CBSMsg.CARD_SBT,
		EKK3391D010CBSMsg.ISSUER_DIV,
		EKK3391D010CBSMsg.CARD_BRAND
	};

	
	/** 有効性チェック時の設定内容 */
	private static final String[] EKK3391D010YK_LIST = {
		EKK3391D010CBSMsg.AUTHORI_JSSI_DIV,
		EKK3391D010CBSMsg.SITE_ID,
		EKK3391D010CBSMsg.MERCHANT_DEAL_ID,
		EKK3391D010CBSMsg.KSSAI_AMNT,
		EKK3391D010CBSMsg.CARD_AZKRI_ID,
		EKK3391D010CBSMsg.TRN_RSLT,
		EKK3391D010CBSMsg.AUTH_RSLT_RSP_CD,
		EKK3391D010CBSMsg.AUTH_RSLT_RSP_DTL,
		EKK3391D010CBSMsg.KSSAI_ID,
		EKK3391D010CBSMsg.ISSUER_DIV,
		EKK3391D010CBSMsg.SHIKOSAKI_CARD_COMP_CD,
		EKK3391D010CBSMsg.SHIKOSAKI_CARD_COMP_NM,
		EKK3391D010CBSMsg.CARD_HAKKO_COMP_NM,
		EKK3391D010CBSMsg.ACSPAYER_NINSHO_YOKYU_HTML,
		EKK3391D010CBSMsg.CARD_HAKKO_COMP_CD,
		EKK3391D010CBSMsg.ATTEMPT_DIV,
		EKK3391D010CBSMsg.FINGERPRINT,
		EKK3391D010CBSMsg.MASKZM_CARD_NO,
		EKK3391D010CBSMsg.CARD_YK_KIGEN,
		EKK3391D010CBSMsg.SHONIN_NO,
		EKK3391D010CBSMsg.CARD_SBT,
		EKK3391D010CBSMsg.CARD_BRAND,
	};

	/**
	 * カード受付情報更新チェック処理.<br>
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle
			, IRequestParameterReadWrite param, String fixedText) throws RequestParameterException 
	{
		
		// 入力データ情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		// オーソリ結果
		HashMap<String, Object> authRsltMap = (HashMap<String, Object>)inMap.get(AUTH_RESULT);
		// オーソリ実施区分
		String authJssiDiv = (String)inMap.get(AUTH_JSSI_DIV);

		// カード受付情報更新用メッセージ設定処理
		HashMap<String, Object> paramMap = null;
		if (AUTH_JSSI_DIV_AZ.equals(authJssiDiv)) 
		{
			// 預かりオーソリのInmapを作成する。
			paramMap = updParamCreateAz(param, authRsltMap, authJssiDiv);
		}
		else if (AUTH_JSSI_DIV_YK.equals(authJssiDiv))
		{
			// 有効性チェックのInmapを作成する。
			paramMap = updParamCreateYk(param, authRsltMap, authJssiDiv);
		}

		return paramMap;
	}

	/**
	 * カード受付情報更新実行処理.<br>
	 * 
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception Exception
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite updCardUkInfo(SessionHandle handle, 
			IRequestParameterReadWrite param, String fixedText) throws Exception {
		// 入力データ情報
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// 上りマッピングの処理結果を取得するためのマップを生成
		// リクエストパラメータを引数に上りマッピング処理メソッドを実行
		HashMap<String, Object> paramAddMap = null;

		// オーソリ結果
		HashMap<String, Object> authRsltMap = (HashMap<String, Object>)inMap.get(AUTH_RESULT);
		// オーソリ実施区分
		String authJssiDiv = (String)inMap.get(AUTH_JSSI_DIV);

		if (AUTH_JSSI_DIV_AZ.equals(authJssiDiv)) 
		{
			// 預かりオーソリのInmapを作成する。
			paramAddMap = updParamCreateAz(param, authRsltMap, authJssiDiv);
		}
		else if (AUTH_JSSI_DIV_YK.equals(authJssiDiv))
		{
			// 有効性チェックのInmapを作成する。
			paramAddMap = updParamCreateYk(param, authRsltMap, authJssiDiv);
		}
		else
		{
			// オーソリ実施区分が預かりオーソリ、有効性チェック以外の場合、登録処理を実施しない。
			return param;
		}

		if (paramAddMap != null)
		{
			/* ◇ＳＣ呼出実行 */
			// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない。
			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
			// SC呼び出し
			callSC(handle, scCall, param, fixedText, paramAddMap);
		}

		return param;
	}

	/**
	 * EKK3391D010カード受付情報登録_預かりオーソリ処理時の上り電文作成処理
	 * <br>
	 * @param param リクエストパラメータ
	 * @param authRsltMap オーソリ結果マップ
	 * @param authJssiDiv オーソリ実施区分

	 * @return Object[][] 上り電文
	 * @throws RequestParameterException 
	 */
	private HashMap<String, Object> updParamCreateAz(IRequestParameterReadWrite param, HashMap<String, Object> authRsltMap, String authJssiDiv) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		/* SCインプット共通データ */
		// **********************************************
		// 【取得元：電文ヘッダ(ヘッダ)】
		// **********************************************
		// 電文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));

		CAANMsg template = new CAANMsg(EKK3391D010CBSMsg.class.getName());
		ArrayList<CAANMsg> lstTemplate = new ArrayList<CAANMsg>();

		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);

		// テンプレートID
		template.set(EKK3391D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3391D010);

		// 機能コード
		template.set(EKK3391D010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);

		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);

		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);

		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);

		// メール送信状態コード
		template.set(EKK3391D010CBSMsg.MAIL_SEND_STAT_CD, MAIL_SEND_STAT_CD_MISOSIN);

		// オーソリ実施区分
		template.set(EKK3391D010CBSMsg.AUTHORI_JSSI_DIV, authJssiDiv);

		// オーソリ結果マップ.サイトID → サイトID
		template.set(EKK3391D010CBSMsg.SITE_ID, authRsltMap.get(PY_SITE_ID).toString());

		// オーソリ結果マップ.カード情報トークン → カード情報トークン
		template.set(EKK3391D010CBSMsg.CARD_INFO_TOKEN, authRsltMap.get(PY_CARD_TOKEN).toString());

		// オーソリ結果マップ.セキュリティコード利用 → セキュリティコード利用
		template.set(EKK3391D010CBSMsg.SECURITY_CD_USE, authRsltMap.get(PY_SECURITY_CODE_USE).toString());

		// オーソリ結果マップ.処理結果コード → 処理結果コード
		template.set(EKK3391D010CBSMsg.TRN_RSLT, convertResultCd(authRsltMap.get(PY_RESULTCODE).toString()));

		// オーソリ結果マップ.レスポンスコード → オーソリ結果応答コード
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_RESPONSE_CODE).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.AUTH_RSLT_RSP_CD);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.AUTH_RSLT_RSP_CD, authRsltMap.get(PY_RESPONSE_CODE).toString());
		}

		// オーソリ結果マップ.レスポンス詳細 → オーソリ結果応答詳細
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_RESPONSE_DETAIL).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.AUTH_RSLT_RSP_DTL);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.AUTH_RSLT_RSP_DTL, authRsltMap.get(PY_RESPONSE_DETAIL).toString());
		}

		// オーソリ結果マップ.顧客カード数 → 顧客カード数
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_NUM_OF_CARDS).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.CUST_CARD_NUM);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.CUST_CARD_NUM, authRsltMap.get(PY_NUM_OF_CARDS).toString());
		}

		// オーソリ結果マップ.顧客カードID → 顧客カードID
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_CUSTOMER_CARD_ID).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.CUST_CARD_ID);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.CUST_CARD_ID, authRsltMap.get(PY_CUSTOMER_CARD_ID).toString());
		}

		// オーソリ結果マップ.カード発行会社コード → カード発行会社コード
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_ISSUR_ID).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.CARD_HAKKO_COMP_CD);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.CARD_HAKKO_COMP_CD, authRsltMap.get(PY_ISSUR_ID).toString());
		}

		// オーソリ結果マップ.カード発行会社名 → カード発行会社名
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_ISSUR_NAME).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.CARD_HAKKO_COMP_NM);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.CARD_HAKKO_COMP_NM, authRsltMap.get(PY_ISSUR_NAME).toString());
		}

		// オーソリ結果マップ.フィンガープリント → フィンガープリント
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_FINGERPRINT).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.FINGERPRINT);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.FINGERPRINT, authRsltMap.get(PY_FINGERPRINT).toString());
		}

		// オーソリ結果マップ.マスクされたカード番号 → マスク済カード番号
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_MASKED_CARD_NUMBER).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.MASKZM_CARD_NO);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.MASKZM_CARD_NO, authRsltMap.get(PY_MASKED_CARD_NUMBER).toString());
		}

		// オーソリ結果マップ.カード有効期限 → カード有効期限
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_CARD_VALID_TERM).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.CARD_YK_KIGEN);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.CARD_YK_KIGEN, convertCardValidTerm(authRsltMap.get(PY_CARD_VALID_TERM).toString()));
		}

		// オーソリ結果マップ.カード名義人 → カード名義人
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_CARDHOLDER_NAME).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.CARD_MEIGIN);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.CARD_MEIGIN, authRsltMap.get(PY_CARDHOLDER_NAME).toString());
		}

		// オーソリ結果マップ.取扱カード会社コード → 仕向先カード会社コード
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_ACQ_ID).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.SHIKOSAKI_CARD_COMP_CD);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.SHIKOSAKI_CARD_COMP_CD, authRsltMap.get(PY_ACQ_ID).toString());
		}

		// オーソリ結果マップ.取扱カード会社名 → 仕向先カード会社名
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_ACQ_NAME).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.SHIKOSAKI_CARD_COMP_NM);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.SHIKOSAKI_CARD_COMP_NM, authRsltMap.get(PY_ACQ_NAME).toString());
		}

		// オーソリ結果マップ.顧客ID → カード預かりID
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_CUSTOMER_ID).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.CARD_AZKRI_ID);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.CARD_AZKRI_ID, authRsltMap.get(PY_CUSTOMER_ID).toString());
		}

		// オーソリ結果マップ.デビット・プリペイド判定結果 → カード種別
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_DEBIT_PREPAID_TYPE).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.CARD_SBT);
		}
		else
		{
			// デビット・プリペイド判定結果を変換した値を設定する。
			template.set(EKK3391D010CBSMsg.CARD_SBT, chgCardSbt(authRsltMap.get(PY_DEBIT_PREPAID_TYPE).toString()));
		}

		// オーソリ結果マップ.イシュア区分 → イシュア区分
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_ISSUR_CLASS).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.ISSUER_DIV);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.ISSUER_DIV, authRsltMap.get(PY_ISSUR_CLASS).toString());
		}

		// オーソリ結果マップ.カードブランド → カードブランド
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_CARD_BRAND).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.CARD_BRAND);
		}
		else
		{
			// カードブランドを変換した値を設定する。
			template.set(EKK3391D010CBSMsg.CARD_BRAND, chgCardBrand(authRsltMap.get(PY_CARD_BRAND).toString()));
		}

		lstTemplate.add(template);
		CAANMsg[] templates = lstTemplate.toArray(new CAANMsg[lstTemplate.size()]);
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}


	/**
	 * EKK3391D010カード受付情報登録_有効性チェック処理時の上り電文作成処理
	 * <br>
	 * @param param リクエストパラメータ
	 * @param authRsltMap オーソリ結果マップ
	 * @param authJssiDiv オーソリ実施区分

	 * @return Object[][] 上り電文
	 * @throws RequestParameterException 
	 */
	private HashMap<String, Object> updParamCreateYk(IRequestParameterReadWrite param, HashMap<String, Object> authRsltMap, String authJssiDiv) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		/* SCインプット共通データ */
		// **********************************************
		// 【取得元：電文ヘッダ(ヘッダ)】
		// **********************************************
		// 電文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));

		CAANMsg template = new CAANMsg(EKK3391D010CBSMsg.class.getName());
		ArrayList<CAANMsg> lstTemplate = new ArrayList<CAANMsg>();

		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);

		// テンプレートID
		template.set(EKK3391D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK3391D010);

		// 機能コード
		template.set(EKK3391D010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);

		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);

		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);

		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);

		// メール送信状態コード(有効性の為、NULLを設定
		template.setNull(EKK3391D010CBSMsg.MAIL_SEND_STAT_CD);

		// オーソリ実施区分
		template.set(EKK3391D010CBSMsg.AUTHORI_JSSI_DIV, authJssiDiv);

		// オーソリ結果マップ.サイトID → サイトID
		template.set(EKK3391D010CBSMsg.SITE_ID, authRsltMap.get(PY_SITE_ID).toString());

		// オーソリ結果マップ.マーチャント取引ＩＤ → マーチャント取引ＩＤ
		template.set(EKK3391D010CBSMsg.MERCHANT_DEAL_ID, authRsltMap.get(PY_TRADING_ID).toString());

		// オーソリ結果マップ.決済金額 → 決済金額
		template.set(EKK3391D010CBSMsg.KSSAI_AMNT, authRsltMap.get(PY_PAYMENT_AMOUNT).toString());

		// オーソリ結果マップ.顧客ID → 顧客ID
		template.set(EKK3391D010CBSMsg.CARD_AZKRI_ID, authRsltMap.get(PY_CUSTOMER_ID).toString());

		// オーソリ結果マップ.処理結果コード → 処理結果コード
		template.set(EKK3391D010CBSMsg.TRN_RSLT, convertResultCd(authRsltMap.get(PY_RESULTCODE).toString()));

		// オーソリ結果マップ.レスポンスコード → オーソリ結果応答コード
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_RESPONSE_CODE).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.AUTH_RSLT_RSP_CD);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.AUTH_RSLT_RSP_CD, authRsltMap.get(PY_RESPONSE_CODE).toString());
		}

		// オーソリ結果マップ.レスポンス詳細 → オーソリ結果応答詳細
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_RESPONSE_DETAIL).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.AUTH_RSLT_RSP_DTL);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.AUTH_RSLT_RSP_DTL, authRsltMap.get(PY_RESPONSE_DETAIL).toString());
		}

		// オーソリ結果マップ.決済ID → 決済ID
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_PAYMENT_ID).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.KSSAI_ID);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.KSSAI_ID, authRsltMap.get(PY_PAYMENT_ID).toString());
		}

		// オーソリ結果マップ.イシュア区分 → イシュア区分
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_ISSUR_CLASS).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.ISSUER_DIV);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.ISSUER_DIV, authRsltMap.get(PY_ISSUR_CLASS).toString());
		}

		// オーソリ結果マップ.取扱カード会社コード → 取扱カード会社コード
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_ACQ_ID).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.SHIKOSAKI_CARD_COMP_CD);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.SHIKOSAKI_CARD_COMP_CD, authRsltMap.get(PY_ACQ_ID).toString());
		}

		// オーソリ結果マップ.取扱カード会社名 → 取扱カード会社名
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_ACQ_NAME).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.SHIKOSAKI_CARD_COMP_NM);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.SHIKOSAKI_CARD_COMP_NM, authRsltMap.get(PY_ACQ_NAME).toString());
		}

		// オーソリ結果マップ.カード発行会社名 → カード発行会社名
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_ISSUR_NAME).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.CARD_HAKKO_COMP_NM);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.CARD_HAKKO_COMP_NM, authRsltMap.get(PY_ISSUR_NAME).toString());
		}

		// オーソリ結果マップ.ACS支払人認証要求Html → ACS支払人認証要求Html
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_OUT_ACS_HTML).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.ACSPAYER_NINSHO_YOKYU_HTML);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.ACSPAYER_NINSHO_YOKYU_HTML, authRsltMap.get(PY_OUT_ACS_HTML).toString());
		}

		// オーソリ結果マップ.カード発行会社コード → カード発行会社コード
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_ISSUR_ID).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.CARD_HAKKO_COMP_CD);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.CARD_HAKKO_COMP_CD, authRsltMap.get(PY_ISSUR_ID).toString());
		}

		// オーソリ結果マップ.Attempt区分 → Attempt区分
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_ATTEMPT_KBN).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.ATTEMPT_DIV);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.ATTEMPT_DIV, authRsltMap.get(PY_ATTEMPT_KBN).toString());
		}

		// オーソリ結果マップ.フィンガープリント → フィンガープリント
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_FINGERPRINT).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.FINGERPRINT);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.FINGERPRINT, authRsltMap.get(PY_FINGERPRINT).toString());
		}

		// オーソリ結果マップ.マスクされたカード番号 → マスクされたカード番号
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_MASKED_CARD_NUMBER).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.MASKZM_CARD_NO);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.MASKZM_CARD_NO, authRsltMap.get(PY_MASKED_CARD_NUMBER).toString());
		}

		// オーソリ結果マップ.カード有効期限 → カード有効期限
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_CARD_VALID_TERM).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.CARD_YK_KIGEN);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.CARD_YK_KIGEN, convertCardValidTerm(authRsltMap.get(PY_CARD_VALID_TERM).toString()));
		}

		// オーソリ結果マップ.承認番号 → 承認番号
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_SHONIN_NO).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.SHONIN_NO);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.SHONIN_NO, authRsltMap.get(PY_SHONIN_NO).toString());
		}

		// オーソリ結果マップ.デビット・プリペイド判定結果 → デビット・プリペイド判定結果
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_DEBIT_PREPAID_TYPE).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.CARD_SBT);
		}
		else
		{
			template.set(EKK3391D010CBSMsg.CARD_SBT, chgCardSbt(authRsltMap.get(PY_DEBIT_PREPAID_TYPE).toString()));
		}

		// オーソリ結果マップ.カードブランド → カードブランド
		if (JCRUtilCommon.isNull(authRsltMap.get(PY_CARD_BRAND).toString()))
		{
			template.setNull(EKK3391D010CBSMsg.CARD_BRAND);
		}
		else
		{
			// カードブランドを変換した値を設定する。
			template.set(EKK3391D010CBSMsg.CARD_BRAND, chgCardBrand(authRsltMap.get(PY_CARD_BRAND).toString()));
		}

		lstTemplate.add(template);
		CAANMsg[] templates = lstTemplate.toArray(new CAANMsg[lstTemplate.size()]);
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);

		return paramMap;
	}

	/**
	 * 処理結果コード変換処理
	 * 引数として渡された処理結果コードより
	 * 正常または異常の処理結果を返却する。
	 * 
	 * @param resultCd 処理結果コード
	 * @return 処理結果
	 */
	public String convertResultCd(String resultCd)
	{
		String result = "";
		// 処理結果コードの1文字目が0(正常）の場合、正常を設定する。
		if (RESULT_OK.equals(resultCd.substring(0,1))) {
			result = RESULT_OK;
		} else {
			// 正常ではない場合、異常を設定
			result = RESULT_NG;
		}
		return result;
	}

	/**
	 * オーソリ結果.デビット・プリペイド判定結果を
	 * ペイジェントより受け取り時の値に変換し、返却する
	 * @param debit_prepaid_type デビット・プリペイド判定結果
	 * @return 変換値
	 */
	private String chgCardSbt(String debit_prepaid_type) {
		// 変換後
		String af_debit_prepaid_type = "";

		// 取得結果を比較しコード値に変換する
		if (DEBIT_PREPAID_TYPE_DEBIT_CD.equals(debit_prepaid_type)) {
			// デビットカードの場合
			af_debit_prepaid_type = DEBIT_PREPAID_TYPE_DEBIT;

		} else if(DEBIT_PREPAID_TYPE_PREPAID_CD.equals(debit_prepaid_type)) {
			// プリペイドカードの場合
			af_debit_prepaid_type = DEBIT_PREPAID_TYPE_PREPAID;

		} else if(DEBIT_PREPAID_TYPE_OTHER_CD.equals(debit_prepaid_type)){
			// その他の場合
			af_debit_prepaid_type = DEBIT_PREPAID_TYPE_OTHER;
		}

		return af_debit_prepaid_type;
	}

	/**
	 * オーソリ結果.カードブランドを
	 * ペイジェントより受け取り時の値に変換し、返却する
	 * @param card_brand カードブランド
	 * @return 変換値
	 */
	private String chgCardBrand(String card_brand) {

		// 変換後
		String af_card_brand = "";

		// 取得結果を比較しコード値に変換する
		if (CARD_BRAND_JCB_CD.equals(card_brand)) {
			// JCBの場合
			af_card_brand = CARD_BRAND_JCB;

		} else if(CARD_BRAND_VISA_CD.equals(card_brand)) {
			// VISAの場合
			af_card_brand = CARD_BRAND_VISA;

		} else if(CARD_BRAND_MASTER_CD.equals(card_brand)){
			// MASTERの場合
			af_card_brand = CARD_BRAND_MASTER;

		} else if(CARD_BRAND_DINERS_CD.equals(card_brand)){
			// DINERSの場合
			af_card_brand = CARD_BRAND_DINERS;

		} else if(CARD_BRAND_AMEX_CD.equals(card_brand)){
			// AMEXの場合
			af_card_brand = CARD_BRAND_AMEX;

		} else if(CARD_BRAND_HOUSE_CD.equals(card_brand)){
			// HOUSEの場合
			af_card_brand = CARD_BRAND_HOUSE;

		}

		return af_card_brand;
	}

	/**
	 * カード有効期限形式変換
	 * カード有効期限の形式を変換し、返却する
	 * YYMM → MMYY
	 * @param card_valid_term カード有効期限
	 * @return カード有効期限
	 */
	public String convertCardValidTerm(String card_valid_term)
	{
		// カード有効期限の形式を変換する
		String YY = card_valid_term.substring(0,2);
		String MM = card_valid_term.substring(2,4);

		return MM + YY;
	}
	
	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param fixedText
	 * @param paramMap	カード受付情報登録マップ
	 * @return CAANMsg
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle,
			ServiceComponentRequestInvoker scCall,
			IRequestParameterReadWrite param,
			String fixedText,
			HashMap<String, Object> paramMap) throws Exception
	{

		Map<?, ?> result = scCall.run(paramMap, handle);
		
		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];
		
		// リターンコード取得
		Object return_code = result.get(JCMConstants.RET_CD_INT_KEY);
		int status = msg.getInt(JCMConstants.STATUS_INT_KEY);
		
		editErrorInfoCom(param, templates, (Integer)return_code, fixedText);
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		
		/* エラー情報のマップないとき、新しいエラー情報をイニシャライズする*/
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));
		
		/* 異常の場合、SCCallExceptionを生成してスローする */
		if (!("0".equals(return_code.toString()) && 0 == status))
		{
			throw new SCCallException("戻り値不正", return_code.toString(), status);
		}
		return msg;
	}

	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param,
														CAANMsg[] templates,
														int returnCode,
														String fixedText) throws RequestParameterException
	{
		// 本来はサービスインターフェイス分の処理が必要
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);

		/* 0以外のとき */
		if (returnCode != 0)
		{
			templateStatus = 9000;
		}

		/* nullのとき */
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}

		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		/* nullの場合 */
		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);
		}

		HashMap<String, String> inMap = null;

		// オーソリ結果情報
		inMap = (HashMap<String, String>)param.getData(fixedText);
		// オーソリ実施区分
		String authJssiDiv = (String)inMap.get(AUTH_JSSI_DIV);

		String[] mappingData = null;
		if (AUTH_JSSI_DIV_AZ.equals(authJssiDiv)) 
		{
			// 預かりオーソリのチェック項目を設定する。
			mappingData = EKK3391D010AZ_LIST;
		}
		else if (AUTH_JSSI_DIV_YK.equals(authJssiDiv))
		{
			// 有効性チェックのチェック項目を設定する。
			mappingData = EKK3391D010YK_LIST;
		}

		for (int i = 0; i < mappingData.length; i++)
		{
			/* nullチェック　*/
			if (!template.isNull(mappingData[i] + PREFIX_ERR_ITEM))
			{
				/* ユーザデータ情報にエラーを確認する　*/
				if (!inMap.containsKey(mappingData[i] + PREFIX_ERR_ITEM))
				{
					inMap.put(mappingData[i] + PREFIX_ERR_ITEM, template.getString(mappingData[i] + PREFIX_ERR_ITEM));
				}
			}
		}
		return param;
	}
}

