/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：com.fujitsu.futurity.bp.custom.common
*   ソースファイル名：JCNYoshinJdgCC.java
*   作成者          ：富士通
*   日付            ：2016年10月04日
*＜機能概要＞
*   クレジットオーソリ承認処理を行います。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v28.00.00   2016/10/04   FJ)清原	【ANK-3032-00-00】AxM再構築対応
*	v58.00.00	2022/06/13   FJ)吉田	【ANK-3846-00-00】【クレカ】クリアパス→ペイジェント移行
*	v58.00.01	2022/07/12   FJ)吉田	【ANK-3846-00-00】【クレカ】クリアパス→ペイジェント移行
*	v61.00.00	2022/11/07   FJ)吉田	【OM-2022-0001130】コンテンツ テストユーザ不正
*   v65.00.00	2023/03/23   FJ)小竹	【ANK-4346-00-00】【eo定期】CCMG再構築対応
**********************************************************************/

package com.fujitsu.futurity.bp.custom.common;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;


import com.fujitsu.futurity.bp.custom.constant.JCNYoshinJdgConstCC;
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.ICommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.bp.x21.values.MessageID;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.JSYLogBase;
import com.fujitsu.futurity.common.JSYbpmLog;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.base.CAANMsg;

import eo.common.constant.JCNStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECN0101B001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0101B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECN0131B007CBSMsg;


/**
 *  与信判定処理を行います。
 * <BR>
 * @author 富士通
 */
public class JCNYoshinJdgCC extends AbstractCommonComponent implements ICommonComponent
{
	/** 共通コンポーネント名 */
	private static final String ccName = "JCNYoshinJdgCC";
	
	// v58.00.00 ANK-3846-00-00 DEL START
//	/** 共通コンポーネント名（オーソリ承認CC） */
//	private static final String ccName_authCC = "JCNCreditAuthCC";
	// v58.00.00 ANK-3846-00-00 DEL END
	
	/** テスト用IDフラグ・通常ID */
	private static final String TEST_ID_FLG_NORMAL = "0";
	
	/** テスト用IDフラグ・テスト用ID */
	private static final String TEST_ID_FLG_TEST = "1";
	
	/** テスト用IDフラグ・データなし */
	private static final String TEST_ID_FLG_NO_DATA = "9";
	
	/** 当月データフラグ・当月データあり */
	private static final String THIS_MONTH_DATA_FLG_TRUE = "1";
	
	/** 当月データフラグ・当月データなし */
	private static final String THIS_MONTH_DATA_FLG_FALSE = "0";
	
	/** データなしフラグ */
	private static final String NO_DATA_FLG = "NO_DATA_FLG";

	/** データなしフラグ・データなし */
	private static final String NO_DATA_FLG_TRUE = "1";
	
	/** データなしフラグ・データあり */
	private static final String NO_DATA_FLG_FALSE = "0";
	
	/** INVALID_RETURN_MESSAGE */
	private static final String INVALID_RETURN_MESSAGE = "INVALID_RETURN_MESSAGE";
	
	/** サービスIFリターンコード・正常 */
	private static final String SIF_RET_CD_NORMAL = "0";

	/** サービスIFステータス・正常 */
	private static final Object SIF_STATUS_NORMAL = 0;

	/** サービスIF処理結果チェック・リターンコード */
	private static final int RESULT_CHK_RET_CD = 0;

	/** サービスIF処理結果チェック・ステータス */
	private static final int RESULT_CHK_STATUS = 1;
	
	// v58.00.00 ANK-3846-00-00 ADD START
	/** オーソリ実行フラグ・預かり承認 */
	private static final String AUTHORI_RUN_FLG_AZUKARI = "1";
	
	/** オーソリ実行フラグ・決済承認 */
	private static final String AUTHORI_RUN_FLG_KESSAI = "2";
	
	/** エラーコード・オーソリ実施フラグ対象外設定値 */
	private static final String ERROR_CODE_RELATION_NOT_TARGET_ERR = "E6001";
	
	/** エラーコード・預かりオーソリ関連チェックエラー */
	private static final String ERROR_CODE_RELATION_AZUKARI_ERR = "E6002";
	
	/** エラーコード・決済オーソリ関連チェックエラー */
	private static final String ERROR_CODE_RELATION_KESSAI_ERR = "E6003";
	
	/** エラーコード・有効期限チェックエラー */
	private static final String ERROR_CODE_CARDEXP_ERR = "E6004";
	
	/** エラーコード・クレジットカードIDデータ有無エラー */
	private static final String ERROR_CODE_CRECARD_ID_NOT_FOUND_ERR = "E6005";
	
	/** エラーコード・当月データ無エラー */
	private static final String ERROR_CODE_TOGETU_DATA_NOTHING_ERR = "E6007";
	
	/** エラーメッセージ・関連チェックエラー */
	private static final String ERROR_MESSAGE_RELATION_ERR = "関連チェックエラー　";
	
	/** エラーメッセージ・有効期限チェックエラー */
	private static final String ERROR_MESSAGE_CARDEXP_ERR = "有効期限チェックエラー";
	
	/** エラーメッセージ・クレジットカードIDデータ有無エラー */
	private static final String ERROR_MESSAGE_CRECARD_ID_NOT_FOUND_ERR = "クレジットカードIDデータ有無エラー";
	
	/** エラーメッセージ・当月データ無エラー */
	private static final String ERROR_MESSAGE_TOGETU_DATA_NOTHING_ERR = "当月データ無エラー";
	// v58.00.00 ANK-3846-00-00 ADD END
	
	/**
	 * 共通コンポーネント実行
	 * @param handle セッションハンドル
	 * @param param 入力パラメータ
	 * @param fixedText
	 * @return param 返却パラメータ
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite executeYoshinJdg(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		// 入力パラメータ格納
		Map<String, Object> ccParam = (Map<String, Object>)param.getData(ccName);
		
		// 返却パラメータ格納用マップ生成
		Map<String, Object> userResult = new HashMap<String, Object>();
		
		// v58.00.00 ANK-3846-00-00 MOD START
//		//クレジットオーソリ承認実行フラグ(実行しない) を初期設定（処理途中でException発生時の対応）
//		ccParam.put(CNSV0010_CNSV0010OP_CNSV001002CC.CREDIT_AUTH_FLG, JCNStrConst.CRECARD_AUTH_CC_FLG_OFF); //クレジットオーソリ承認実行フラグ
//		
//		//支払方法がクレジットの場合
//		if(JCNStrConst.S_CONT_PAYWAY_CD_CRE.equals((String) ccParam.get(CNSV0010_CNSV0010OP_CNSV001002CC.PAYWAY)))
//		{
//			/***************************************************/
//			/** 支払方法ID設定有無判定                         */
//			/***************************************************/
//			//支払方法IDが設定されている場合
//			if(!JCNBPCommon.isNullOrBlank(ccParam.get(CNSV0010_CNSV0010OP_CNSV001002CC.PAYWAYID)))
//			{
		//クレジットオーソリ承認実行フラグ(実行しない) を初期設定（処理途中でException発生時の対応）
		ccParam.put(JCNYoshinJdgConstCC.OUTPUT_CREDIT_AUTH_FLG, JCNStrConst.CRECARD_AUTH_CC_FLG_OFF); //クレジットオーソリ承認実行フラグ
		
		//支払方法がクレジットの場合
		if(JCNStrConst.S_CONT_PAYWAY_CD_CRE.equals((String) ccParam.get(JCNYoshinJdgConstCC.INPUT_PAYWAY)))
		{
			/***************************************************/
			/** 関連チェック                                   */
			/***************************************************/
			// 関連チェックでエラーが発生している場合は処理を終了する。
			if (!relationCheck(ccParam, userResult)) 
			{
				/*****************************************/
				/**●●●●●リターンコード作成●●●●●*/
				setResultUserData(param, ccName, userResult, ccParam, JCNStrConst.S_API_RTN_CD_PARAM_ERR);
				return param;
			}
			
			/***************************************************/
			/** オーソリ実行フラグ                             */
			/***************************************************/
			//決済承認の場合
			if(AUTHORI_RUN_FLG_KESSAI.equals((String) ccParam.get(JCNYoshinJdgConstCC.INPUT_AUTHORI_RUN_FLG)))
			{
				// v58.00.00 ANK-3846-00-00 MOD END
				/***************************************************/
				/** コンテンツ事業クレジットカードの取得           */
				/***************************************************/
				Map<Object,String> crecardInfMap = callCreListSc(handle, param, ccParam);
				
				//クレジット情報マップのデータなしフラグが"1"（データなし）の場合はデータなしをAPIに返却する。
				if(crecardInfMap.get(NO_DATA_FLG).equals(NO_DATA_FLG_TRUE))
				{
					// v58.00.01 ANK-3846-00-00 MOD START
//					// v58.00.00 ANK-3846-00-00 ADD START
//					userResult.put(JCNYoshinJdgConstCC.OUTPUT_ERR_CODE, ERROR_CODE_CRECARD_ID_NOT_FOUND_ERR);
//					userResult.put(JCNYoshinJdgConstCC.OUTPUT_ERR_MESSAGE, ERROR_MESSAGE_CRECARD_ID_NOT_FOUND_ERR);
//					// v58.00.00 ANK-3846-00-00 ADD END
//					setResultUserData(param, ccName, userResult, ccParam, JCNStrConst.S_API_RTN_CD_NO_DATA);
					userResult.put(JCNYoshinJdgConstCC.OUTPUT_RESPONSE_CODE, ERROR_CODE_CRECARD_ID_NOT_FOUND_ERR);
					userResult.put(JCNYoshinJdgConstCC.OUTPUT_RESPONSE_DETAIL, ERROR_MESSAGE_CRECARD_ID_NOT_FOUND_ERR);
					setResultUserData(param, ccName, userResult, ccParam, JCNStrConst.RTN_CD_AUTH_NG);
					// v58.00.01 ANK-3846-00-00 MOD END
					return param;
				}
				/***************************************************/
				/** テスト会員チェック処理                         */
				/***************************************************/
				// v58.00.00 ANK-3846-00-00 MOD START
//				String sysid = (String) ccParam.get(CNSV0010_CNSV0010OP_CNSV001002CC.SYSID);
				String sysid = (String) ccParam.get(JCNYoshinJdgConstCC.INPUT_SYSID);
				// v58.00.00 ANK-3846-00-00 MOD END
				
				String testFlg = callCkParamSc(handle, param, sysid);
				
				// v58.00.00 ANK-3846-00-00 DEL START
//				//テストIDフラグが"9"（データなし）の場合はデータなしをAPIに返却する。
//				if(testFlg.equals(TEST_ID_FLG_NO_DATA))
//				{
//					setResultUserData(param, ccName, userResult, ccParam, JCNStrConst.S_API_RTN_CD_NO_DATA);
//					return param;
//				}
				// v58.00.00 ANK-3846-00-00 DEL END
				
				//テスト会員ではない場合
				if(TEST_ID_FLG_NORMAL.equals(testFlg))
				{
					//【判定結果】テスト会員チェック処理：通常会員
					
					/***************************************************/
					/** 有効性ステータスの確認                         */
					/***************************************************/
					//当月データありかつ有効性確認結果区分が"1"(OK)の場合
					if(THIS_MONTH_DATA_FLG_TRUE.equals(crecardInfMap.get("THIS_MONTH_DATA_FLG"))
							&&JCNStrConst.S_YK_CFM_RSLT_DIV_OK.equals(crecardInfMap.get(ECN0101B001CBSMsg1List.YK_CFM_RSLT_DIV)))
					{
						//フロアリミットチェック処理、当月カード情報の判定、カード有効期限の判定を行う
						flrLmtChkJdg(handle,param, userResult, ccParam,crecardInfMap);
						
						return param;
					}
					else
					{
						//【判定結果】有効性ステータスの確認：当月データ有、有効性確認結果=1（ＯＫ）以外
						
						/***************************************************/
						/** 与信ステータスの確認                           */
						/***************************************************/
						//当月データありかつオーソリ結果区分が"1"(OK)の場合
						if(THIS_MONTH_DATA_FLG_TRUE.equals(crecardInfMap.get("THIS_MONTH_DATA_FLG"))
								&&JCNStrConst.CN0101_AUTH_OK.equals(crecardInfMap.get(ECN0101B001CBSMsg1List.AUTHORI_RSLT_DIV)))
						{
							//【判定結果】与信ステータスの確認：当月データ有、オーソリ確認結果区分=0（ＯＫ）
							
							//フロアリミットチェック処理、当月カード情報の判定、カード有効期限の判定を行う
							flrLmtChkJdg(handle,param, userResult, ccParam,crecardInfMap);
							
							return param;
						}
						else
						{
							//【判定結果】与信ステータスの確認：当月データ無、もしくはオーソリ確認結果区分=0（ＯＫ）以外
							// v58.00.00 ANK-3846-00-00 ADD START
							if(!THIS_MONTH_DATA_FLG_TRUE.equals(crecardInfMap.get("THIS_MONTH_DATA_FLG")))
							{
								//【判定結果】当月データなし
								/*****************************************/
								/**●●●●●リターンコード作成●●●●●*/
								/*****************************************/
								// v58.00.01 ANK-3846-00-00 MOD START
//								userResult.put(JCNYoshinJdgConstCC.OUTPUT_ERR_CODE, ERROR_CODE_TOGETU_DATA_NOTHING_ERR);
//								userResult.put(JCNYoshinJdgConstCC.OUTPUT_ERR_MESSAGE, ERROR_MESSAGE_TOGETU_DATA_NOTHING_ERR);
								userResult.put(JCNYoshinJdgConstCC.OUTPUT_RESPONSE_CODE, ERROR_CODE_TOGETU_DATA_NOTHING_ERR);
								userResult.put(JCNYoshinJdgConstCC.OUTPUT_RESPONSE_DETAIL, ERROR_MESSAGE_TOGETU_DATA_NOTHING_ERR);
								// v58.00.01 ANK-3846-00-00 MOD END
								setResultUserData(param, ccName, userResult, ccParam, JCNStrConst.RTN_CD_AUTH_NG);
								return param;
								//【与信判定結果】オーソリＮＧ（オーソリＣＣ実行しない）
							}
							// v58.00.00 ANK-3846-00-00 ADD END
							
							//【判定結果】与信ステータスの確認：当月データあり、もしくはオーソリ確認結果区分=0（ＯＫ）以外
							/***************************************************/
							/** カード有効期限の判定処理                       */
							/***************************************************/
							String yukuKgn = crecardInfMap.get("crecard_yk_kigen");
							if(isCardYkKgnChk(yukuKgn))
							{
								//【判定結果】カード有効期限チェック処理：カード有効期限ＯＫ
								/*****************************************/
								/**●●●●●リターンコード作成●●●●●*/
								/*****************************************/
								// v58.00.00 ANK-3846-00-00 DEL START
//								//オーソリ承認CC用パラメータの設定
//								setAuthCCparam(param, crecardInfMap, JCNStrConst.CLEAR_PASS_FLG_ON);
								// v58.00.00 ANK-3846-00-00 DEL END
								
								setResultUserData(param, ccName, userResult, ccParam, null);
								//【与信判定結果】判定未（オーソリＣＣ実行）
								
								return param;
							}
							else
							{
								//【判定結果】カード有効期限チェック処理：カード有効期限ＮＧ
								/*****************************************/
								/**●●●●●リターンコード作成●●●●●*/
								/*****************************************/
								// v58.00.01 ANK-3846-00-00 MOD START
//								// v58.00.00 ANK-3846-00-00 ADD START
//								userResult.put(JCNYoshinJdgConstCC.OUTPUT_ERR_CODE, ERROR_CODE_CARDEXP_ERR);
//								userResult.put(JCNYoshinJdgConstCC.OUTPUT_ERR_MESSAGE, ERROR_MESSAGE_CARDEXP_ERR);
//								// v58.00.00 ANK-3846-00-00 ADD END
								userResult.put(JCNYoshinJdgConstCC.OUTPUT_RESPONSE_CODE, ERROR_CODE_CARDEXP_ERR);
								userResult.put(JCNYoshinJdgConstCC.OUTPUT_RESPONSE_DETAIL, ERROR_MESSAGE_CARDEXP_ERR);
								// v58.00.01 ANK-3846-00-00 MOD END
								setResultUserData(param, ccName, userResult, ccParam, JCNStrConst.RTN_CD_AUTH_NG);
								//【与信判定結果】オーソリＮＧ（オーソリＣＣ実行しない）
								
								return param;
							}
						}
					}
				}
				else
				{
					//【判定結果】テスト会員チェック処理：テスト会員
					/*****************************************/
					/**●●●●●リターンコード作成●●●●●*/
					/*****************************************/
					// v58.00.00 ANK-3846-00-00 DEL START
//					//オーソリ承認CC用パラメータの設定
//					setAuthCCparam(param, crecardInfMap, JCNStrConst.CLEAR_PASS_FLG_ON);
					// v58.00.00 ANK-3846-00-00 DEL END
					// v61.00.00 OM-2022-0001130 DEL START
					// v58.00.00 ANK-3846-00-00 ADD START
//					if(THIS_MONTH_DATA_FLG_TRUE.equals(crecardInfMap.get("THIS_MONTH_DATA_FLG")))
//					{
					// v61.00.00 OM-2022-0001130 DEL END
						// 当月データ有無にかかわらず、オーソリを実施。
						setResultUserData(param, ccName, userResult, ccParam ,null);
						//【与信判定結果】判定未（オーソリＣＣ実行）");
					// v61.00.00 OM-2022-0001130 DEL START
//					}
//					else
//					{
//						// 当月データ無の場合
//						// v58.00.01 ANK-3846-00-00 MOD START
////						userResult.put(JCNYoshinJdgConstCC.OUTPUT_ERR_CODE, ERROR_CODE_TOGETU_DATA_NOTHING_ERR);
////						userResult.put(JCNYoshinJdgConstCC.OUTPUT_ERR_MESSAGE, ERROR_MESSAGE_TOGETU_DATA_NOTHING_ERR);
//						userResult.put(JCNYoshinJdgConstCC.OUTPUT_RESPONSE_CODE, ERROR_CODE_TOGETU_DATA_NOTHING_ERR);
//						userResult.put(JCNYoshinJdgConstCC.OUTPUT_RESPONSE_DETAIL, ERROR_MESSAGE_TOGETU_DATA_NOTHING_ERR);
//						// v58.00.01 ANK-3846-00-00 MOD END
//						setResultUserData(param, ccName, userResult, ccParam ,JCNStrConst.RTN_CD_AUTH_NG);
//						//【与信判定結果】判定ＮＧ（オーソリＣＣ実行しない）");
//					}
//					// v58.00.00 ANK-3846-00-00 ADD END
					// v61.00.00 OM-2022-0001130 DEL END
					return param;
				}
			
			}
			// 預かり承認の場合
			else
			{
				// v58.00.00 ANK-3846-00-00 MOD START
//				/***************************************************/
//				/** 業務パラメータ取得処理                         */
//				/***************************************************/
//				String workParamSetteValue = "";
//				workParamSetteValue = callWorkParamamListSc(handle, param, JCNStrConst.ZM0321_YSN_JDG_CARD_PROPER);
//				
//				/***************************************************/
//				/** カード番号妥当性処理                           */
//				/***************************************************/
//				
//				String crecardComp = (String) ccParam.get(CNSV0010_CNSV0010OP_CNSV001002CC.KDKISHACD);
//				String crecardNo = (String) ccParam.get(CNSV0010_CNSV0010OP_CNSV001002CC.KDBNGU);
//				
//				if(isCardNoProper(workParamSetteValue, crecardComp, crecardNo))
//				{
//					//【判定結果】カード番号妥当性チェック処理：ＯＫ");
//					/***************************************************/
//					/** カード有効期限の判定処理                       */
//					/***************************************************/
//					String yukuKgn = (String) ccParam.get(CNSV0010_CNSV0010OP_CNSV001002CC.YUKUKGN);
//					if(isCardYkKgnChk(yukuKgn))
//					{
//						//【判定結果】カード有効期限チェック処理：カード有効期限ＯＫ
//						/*****************************************/
//						/**●●●●●リターンコード作成●●●●●*/
//						/*****************************************/
//						setResultUserData(param, ccName, userResult, ccParam ,null);
//						//【与信判定結果】判定未（オーソリＣＣ実行）");
//						
//						return param;
//					}
//					else
//					{
//						//【判定結果】カード有効期限チェック処理：カード有効期限ＮＧ
//						/*****************************************/
//						/**●●●●●リターンコード作成●●●●●*/
//						/*****************************************/
//						setResultUserData(param, ccName, userResult, ccParam, JCNStrConst.RTN_CD_AUTH_NG);
//						//【与信判定結果】オーソリＮＧ（オーソリＣＣ実行しない）");
//						
//						return param;
//					}
//				
//				}
//				else
//				{
//					//【判定結果】カード番号妥当性チェック処理：ＮＧ
//					/*****************************************/
//					/**●●●●●リターンコード作成●●●●●*/
//					/*****************************************/
//					setResultUserData(param, ccName, userResult, ccParam,JCNStrConst.RTN_CD_AUTH_NG);
//					//【与信判定結果】オーソリＮＧ（オーソリＣＣ実行しない）
//					
//					
//					return param;
//					
//				}
				
				// 預かり承認は呼出元でチェック済みのためオーソリＣＣを実施する。
				setResultUserData(param, ccName, userResult, ccParam, null);
				
				return param;
				// v58.00.00 ANK-3846-00-00 MOD END
			}
			
		}
		else
		{
			
			/***************************************************/
			/**支払方法入力支援支払方法毎照会の実行            */
			/***************************************************/
			// v58.00.00 ANK-3846-00-00 MOD START
//			String sysid = (String) ccParam.get(CNSV0010_CNSV0010OP_CNSV001002CC.SYSID);
//			String payWay = (String) ccParam.get(CNSV0010_CNSV0010OP_CNSV001002CC.PAYWAY);
//			String payWayId = (String) ccParam.get(CNSV0010_CNSV0010OP_CNSV001002CC.PAYWAYID);
			String sysid = (String) ccParam.get(JCNYoshinJdgConstCC.INPUT_SYSID);
			String payWay = (String) ccParam.get(JCNYoshinJdgConstCC.INPUT_PAYWAY);
			String payWayId = (String) ccParam.get(JCNYoshinJdgConstCC.INPUT_PAYWAYID);
			// v58.00.00 ANK-3846-00-00 MOD END
			
			String rsltFlg = "";
			rsltFlg = callPaywayInSupportSc(handle, param, sysid, payWay, payWayId);
			
			//処理結果に応じて返却値を設定する。
			if(JCNStrConst.S_MK_FLG.equals(rsltFlg))
			{
				//【判定結果】支払方法入力支援支払方法毎照会：有効データあり
				/*****************************************/
				/**●●●●●リターンコード作成●●●●●*/
				/*****************************************/
				setResultUserData(param, ccName, userResult, ccParam,JCNStrConst.RTN_CD_AUTH_OK);
				//【与信判定結果】オーソリＯＫ（オーソリＣＣ実行しない）
				
				return param;
			}
			else
			{
				//【判定結果】支払方法入力支援支払方法毎照会：有効データなし
				/*****************************************/
				/**●●●●●リターンコード作成●●●●●*/
				/*****************************************/
				setResultUserData(param, ccName, userResult, ccParam,JCNStrConst.RTN_CD_AUTH_NG);
				//【与信判定結果】オーソリＮＧ（オーソリＣＣ実行しない）
				
				return param;
			}
		}
	}

	// v58.00.00 ANK-3846-00-00 ADD START
	/**
	 * 関連チェックを行います。
	 * 
	 * @param ccParam
	 * @param userResult 
	 * @return true: 正常 false:異常
	 */
	private boolean relationCheck(Map<String, Object> ccParam, Map<String, Object> userResult) {
		
		// オーソリ実行フラグ
		String authoirRunFlg = (String) ccParam.get(JCNYoshinJdgConstCC.INPUT_AUTHORI_RUN_FLG);
		
		// オーソリ実行フラグが"預かり承認"の場合
		if(AUTHORI_RUN_FLG_AZUKARI.equals(authoirRunFlg))
		{
			// 各種パラメータがすべて設定されているかチェックする。
			for (String key:JCNYoshinJdgConstCC.RERATION_CHK_LIST_AZUKARI)
			{
				// 設定されていないパラメータが存在する場合
				if(JCNBPCommon.isNullOrBlank(ccParam.get(key)))
				{
					// 関連チェックエラーとする。
					userResult.put(JCNYoshinJdgConstCC.OUTPUT_ERR_CODE, ERROR_CODE_RELATION_AZUKARI_ERR);
					userResult.put(JCNYoshinJdgConstCC.OUTPUT_ERR_MESSAGE, ERROR_MESSAGE_RELATION_ERR + "オーソリ実行フラグ");
					return false;
				}
			}
		}
		// オーソリ実行フラグが"決済承認"の場合
		else if(AUTHORI_RUN_FLG_KESSAI.equals(authoirRunFlg))
		{
			// 各種パラメータがすべて設定されているかチェックする。
			for (String key:JCNYoshinJdgConstCC.RERATION_CHK_LIST_KESSAI)
			{
				// 設定されていないパラメータが存在する場合
				if(JCNBPCommon.isNullOrBlank(ccParam.get(key)))
				{
					// 関連チェックエラーとする。
					userResult.put(JCNYoshinJdgConstCC.OUTPUT_ERR_CODE, ERROR_CODE_RELATION_KESSAI_ERR);
					userResult.put(JCNYoshinJdgConstCC.OUTPUT_ERR_MESSAGE, ERROR_MESSAGE_RELATION_ERR + "オーソリ実行フラグ");
					return false;
				}
			}
		}
		// オーソリ実行フラグが上記以外の場合
		else{
			// 関連チェックエラーとする。
			userResult.put(JCNYoshinJdgConstCC.OUTPUT_ERR_CODE, ERROR_CODE_RELATION_NOT_TARGET_ERR);
			userResult.put(JCNYoshinJdgConstCC.OUTPUT_ERR_MESSAGE, ERROR_MESSAGE_RELATION_ERR + "オーソリ実行フラグ");
			return false;
		}
		
		return true;
	}
	// v58.00.00 ANK-3846-00-00 ADD END

	/**支払方法入力支援支払方法毎照会SCの実行
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param sysid SYSID
	 * @param payWay 支払方法
	 * @param payWayId 支払方法ＩＤ
	 * @return 支払方法フラグ 0（有効） 1（無効）
	 * @throws Throwable
	 */
	private String callPaywayInSupportSc(SessionHandle handle,IRequestParameterReadWrite param, String sysid, String payWay, String payWayId) throws Throwable
	{
		/*************************************************************************/
		/** 支払方法入力支援支払方法毎照会SCへの上りマッピング           */
		/*************************************************************************/
		String templateId = "ECN0131B007";
		Map<Object, Object> param4serviceIf = new HashMap<Object, Object>();
		param4serviceIf.put(ECN0131B007CBSMsg.KEY_SYSID, sysid);
		param4serviceIf.put(ECN0131B007CBSMsg.KEY_PAYWAY_INPUT_SHIEN_CD, payWay);
		param4serviceIf.put(ECN0131B007CBSMsg.KEY_ISP_KSSAI_SVC_KEI_NO, payWayId);

		HashMap<String, Object> paramMap = createScParam(param, templateId, ECN0131B007CBSMsg.class , param4serviceIf, "2");

		/***************************************************/
		/** SC呼出実行                                     */
		/***************************************************/
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		Map<?, ?> creListResult = scCall.run(paramMap, handle);
		
		// 処理結果判定
		Object[] resultList = resultChkSc(creListResult);
		if (!(SIF_RET_CD_NORMAL.equals(resultList[RESULT_CHK_RET_CD]) && SIF_STATUS_NORMAL.equals(resultList[RESULT_CHK_STATUS]))) {
			printErrorLog("支払方法入力支援支払方法毎照会SCにてエラーが発生しました。");
			SCCallException scCallEx = new SCCallException(INVALID_RETURN_MESSAGE, String.valueOf(resultList[RESULT_CHK_RET_CD]), (Integer) resultList[RESULT_CHK_STATUS]);
			throw scCallEx;
		}

		// コンテンツ事業クレジットカード一覧照会結果格納
		CAANMsg[] cbsMsgList = getResultMsgList(creListResult,
				ECN0131B007CBSMsg.ECN0131B007CBSMSG1LIST);

		String payWayFlg = "1";

		if (0 != cbsMsgList.length) 
		{
			
			// 検索エラーフラグ取得
			String searchErrFlg = getResultString(creListResult, ECN0131B007CBSMsg.ECN0131B007CBSMSG1LIST + "[0]" + "." 
					+  ECN0131B007CBSMsg.SEARCH_ERR_FLG);
			
			// 支払方法入力支援支払方法毎照会の結果が0件でない場合はは支払方法フラグに0を設定する。
			if(!JPCModelConstant.SEARCH_ERR_FLG_ZERO.equals(searchErrFlg))
			
			
			payWayFlg = "0";
		}
		return payWayFlg;
	}


// ANK-4346-00-00 DEL START
//	/**フロアリミットチェックSCの実行
//	 * @param handle セッションハンドル
//	 * @param param リクエストパラメータ
//	 * @param sysid SYSID
//	 * @param paywayId 支払方法ＩＤ
//	 * @param ttlRyuGk トータル利用額
//	 * @param flrLmtCkZmGk フロアリミットチェック済額
//	 * @return フロアリミット超過フラグ 1（超過）0 （未超過）
//	 * @throws Throwable
//	 */
//	private String callFlrlmtChkSc(SessionHandle handle, IRequestParameterReadWrite param, String sysid, String paywayId, String ttlRyuGk, String flrLmtCkZmGk) throws Throwable
//	{
//		/***************************************************/
//		/** パラメータチェック                             */
//		/***************************************************/
//		//フロアリミットチェック済額が未設定の場合はフロアリミット超過を返却
//		if(JCNBPCommon.isNullOrBlank(flrLmtCkZmGk))
//		{
//			return JCNStrConst.FLRLMT_CHOKA_FLG_TRUE;
//		}
//		/***************************************************/
//		/** フロアリミットチェックSCへの上りマッピング     */
//		/***************************************************/
//		String templateId = "ECN0091B002";
//		Map<Object, Object> param4serviceIf = new HashMap<Object, Object>();
//		param4serviceIf.put(ECN0091B002CBSMsg.KEY_SYSID, sysid);
//		param4serviceIf.put(ECN0091B002CBSMsg.KEY_CRECARD_ID, paywayId);
//		param4serviceIf.put(ECN0091B002CBSMsg.KEY_FLRLMTCHKZMGK, flrLmtCkZmGk);
//		param4serviceIf.put(ECN0091B002CBSMsg.KEY_TTLRYUGK, ttlRyuGk);
//		HashMap<String, Object> paramMap = createScParam(param, templateId, ECN0091B002CBSMsg.class , param4serviceIf, JPCModelConstant.FUNC_CD_1);
//
//		/***************************************************/
//		/** SC呼出実行                                     */
//		/***************************************************/
//		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
//
//		Map<?, ?> result = scCall.run(paramMap, handle);
//		// 処理結果判定
//		Object[] resultList = resultChkSc(result);
//		if (!(SIF_RET_CD_NORMAL.equals(resultList[RESULT_CHK_RET_CD]) && SIF_STATUS_NORMAL.equals(resultList[RESULT_CHK_STATUS])))
//		{
//			printErrorLog("フロアリミットチェックSCにてエラーが発生しました。" + "(KEY:SYSID=" + sysid + ")");
//			SCCallException scCallEx = new SCCallException(INVALID_RETURN_MESSAGE, String.valueOf(resultList[RESULT_CHK_RET_CD]), (Integer) resultList[RESULT_CHK_STATUS]);
//			throw scCallEx;
//		}
//		
//		// フロアリミット超過フラグ取得
//		String flrLmtChokaFlg = getResultString(result, ECN0091B002CBSMsg.ECN0091B002CBSMSGLIST + "[0]" + "." 
//				+  ECN0091B002CBSMsgList.FLRLMTCHOKAFLG);
//		
//		if(flrLmtChokaFlg == null)
//		{
//			printErrorLog("フロアリミット超過フラグが取得できませんでした。" + "(KEY:SYSID=" + sysid + ")");
//			SCCallException scCallEx = new SCCallException(INVALID_RETURN_MESSAGE, "1050", 8);
//			throw scCallEx;
//		}
//		
//		return flrLmtChokaFlg;
//	}
// ANK-4346-00-00 DEL END
	

	// v58.00.00 ANK-3846-00-00 DEL START
//	/**
//	 * 業務パラメータ一意照会SCの実行
//	 * @param handle セッションハンドル
//	 * @param param リクエストパラメータ
//	 * @param workParamId 業務パラメータID
//	 * @return 業務パラメータ設定値
//	 * @throws Throwable
//	 */
//	private String callWorkParamamListSc(SessionHandle handle, IRequestParameterReadWrite param, String workParamId) throws Throwable
//	{
//		/***************************************************/
//		/** 業務パラメータ一意照会SCへの上りマッピング     */
//		/***************************************************/
//		String templateId = "EZM0321A010";
//		Map<Object, Object> param4serviceIf = new HashMap<Object, Object>();
//		param4serviceIf.put(EZM0321A010CBSMsg.KEY_WORK_PARAM_ID, workParamId);
//		HashMap<String, Object> paramMap = createScParam(param, templateId, EZM0321A010CBSMsg.class , param4serviceIf, JPCModelConstant.FUNC_CD_1);
//
//		/***************************************************/
//		/** SC呼出実行                                     */
//		/***************************************************/
//		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
//
//		Map<?, ?> result = scCall.run(paramMap, handle);
//		// 処理結果判定
//		Object[] resultList = resultChkSc(result);
//		if (!(SIF_RET_CD_NORMAL.equals(resultList[RESULT_CHK_RET_CD]) && SIF_STATUS_NORMAL.equals(resultList[RESULT_CHK_STATUS]))) 
//		{
//			printErrorLog("業務パラメータ一意照会SCにてエラーが発生しました。" + "(KEY:WORK_PARAM_ID=" + JCNStrConst.ZM0321_YSN_JDG_CARD_PROPER + ")");
//			SCCallException scCallEx = new SCCallException(INVALID_RETURN_MESSAGE, String.valueOf(resultList[RESULT_CHK_RET_CD]), (Integer) resultList[RESULT_CHK_STATUS]);
//			throw scCallEx;
//		}
//		
//		
//		// 業務パラメータ設定値取得
//		String workParamSetteValue = getResultString(result, EZM0321A010CBSMsg.EZM0321A010CBSMSG1LIST + "[0]" + "." 
//				+  EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE);
//		
//		if(workParamSetteValue == null)
//		{
//			printErrorLog("業務パラメータ設定値が取得できませんでした。" + "(KEY:WORK_PARAM_ID=" + JCNStrConst.ZM0321_YSN_JDG_CARD_PROPER + ")");
//			SCCallException scCallEx = new SCCallException(INVALID_RETURN_MESSAGE, "1050", 8);
//			throw scCallEx;
//		}
//		
//		return workParamSetteValue;
//	}
	// v58.00.00 ANK-3846-00-00 DEL END
	
	
		
		/**
		 * お客様一意照会SCの実行
		 * @param handle セッションハンドル
		 * @param param リクエストパラメータ
		 * @param sysid SYSID
		 * @return テストIDフラグ(0:通常ID,1:テストID)
		 * @throws Throwable
		 */
		private String callCkParamSc(SessionHandle handle, IRequestParameterReadWrite param, String sysid) throws Throwable
		{
			/***************************************************/
			/** お客様一意照会SCへの上りマッピング */
			/***************************************************/
			String templateId = "ECK0011A010";
			Map<Object, Object> param4serviceIf = new HashMap<Object, Object>();
			param4serviceIf.put(ECK0011A010CBSMsg.KEY_SYSID, sysid);
			param4serviceIf.put(ECK0011A010CBSMsg.KEY_GENE_ADD_DTM, JCCBPCommon.getOpeDateTimeStamp(null));
			param4serviceIf.put(ECK0011A010CBSMsg.KEY_RSV_APLY_YMD, JCCBPCommon.getOpeDate(null));
			HashMap<String, Object> paramMap = createScParam(param, templateId, ECK0011A010CBSMsg.class , param4serviceIf, JPCModelConstant.FUNC_CD_2);

			/***************************************************/
			/** SC呼出実行                                     */
			/***************************************************/
			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

			Map<?, ?> result = scCall.run(paramMap, handle);
			// 処理結果判定
			Object[] resultList = resultChkSc(result);
			if (!(SIF_RET_CD_NORMAL.equals(resultList[RESULT_CHK_RET_CD]) && SIF_STATUS_NORMAL.equals(resultList[RESULT_CHK_STATUS])))
			{
				printErrorLog("お客様から契約者タイプコードが取得できませんでした。" + "(KEY:SYSID=" + sysid + ")");
				SCCallException scCallEx = new SCCallException(INVALID_RETURN_MESSAGE, String.valueOf(resultList[RESULT_CHK_RET_CD]), (Integer) resultList[RESULT_CHK_STATUS]);
				throw scCallEx;
			}
			
			// 契約者タイプコード取得
			String keyTypeCd = getResultString(result, ECK0011A010CBSMsg.ECK0011A010CBSMSG1LIST + "[0]" + "." 
					+  ECK0011A010CBSMsg1List.KEISHA_TYPE_CD);
			
			//テストIDフラグ格納用
			String testIdFlg = "";
			
			if(keyTypeCd == null)
			{
				//テストIDフラグにダミー値："9"（データなし）を設定して返却する。
				testIdFlg = TEST_ID_FLG_NO_DATA;
				return testIdFlg;
			}
			
			// テストID判定

			if(!JCNStrConst.KEISHA_TYPE_CD_TEST.equals(keyTypeCd))
			{
				testIdFlg = TEST_ID_FLG_NORMAL;
			}
			else
			{
				testIdFlg = TEST_ID_FLG_TEST;
			}

			return testIdFlg;
		}
		
		
		/**
		 * コンテンツ事業クレジットカード一覧照会SCの実行
		 * @param handle セッションハンドル
		 * @param param リクエストパラメータ
		 * @param ccParam CCパラメータマップ
		 * @return rsltMap 取得結果マップ
		 * @throws Throwable
		 */
		private Map<Object,String> callCreListSc(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> ccParam) throws Throwable
		{
			/*****************************************************************/
			/** コンテンツ事業クレジットカード一覧照会SCへの上りマッピング   */
			/*****************************************************************/
			String templateId = "ECN0101B001";
			Map<Object, Object> param4serviceIf = new HashMap<Object, Object>();
			// v58.00.00 ANK-3846-00-00 MOD START
//			param4serviceIf.put(ECN0101B001CBSMsg.KEY_SYSID, (String) ccParam.get(CNSV0010_CNSV0010OP_CNSV001002CC.SYSID));
//			param4serviceIf.put(ECN0101B001CBSMsg.KEY_CRECARD_ID, (String) ccParam.get(CNSV0010_CNSV0010OP_CNSV001002CC.PAYWAYID));
			param4serviceIf.put(ECN0101B001CBSMsg.KEY_SYSID, (String) ccParam.get(JCNYoshinJdgConstCC.INPUT_SYSID));
			param4serviceIf.put(ECN0101B001CBSMsg.KEY_CRECARD_ID, (String) ccParam.get(JCNYoshinJdgConstCC.INPUT_PAYWAYID));
			// v58.00.00 ANK-3846-00-00 MOD END
			param4serviceIf.put(ECN0101B001CBSMsg.KEY_MK_FLG, JCNStrConst.S_MK_FLG);
			HashMap<String, Object> paramMap = createScParam(param, templateId, ECN0101B001CBSMsg.class , param4serviceIf, JPCModelConstant.FUNC_CD_1);

			/*****************************************************************/
			/** SC呼出実行                                                   */
			/*****************************************************************/
			ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

			Map<?, ?> result = scCall.run(paramMap, handle);
			
			// 処理結果判定
			Object[] resultList = resultChkSc(result);
			CAANMsg[] cbsMsgList = getResultMsgList(result, ECN0101B001CBSMsg.ECN0101B001CBSMSG1LIST); 
			
			if(!(SIF_RET_CD_NORMAL.equals(resultList[RESULT_CHK_RET_CD]) &&SIF_STATUS_NORMAL.equals(resultList[RESULT_CHK_STATUS]))) 
			{
				printErrorLog("コンテンツ事業クレジットカード一覧照会SCにてエラーが発生しました。" + "(KEY:CRECARD_JIGYO_CD=" + JCNStrConst.S_CONT_JIGYO_CD + ")");
				SCCallException scCallEx = new SCCallException(INVALID_RETURN_MESSAGE, String.valueOf(resultList[RESULT_CHK_RET_CD]), (Integer) resultList[RESULT_CHK_STATUS]);
				throw scCallEx;
			}
			
			// 返却用クレジットカード会社一意照会実行結果格納用MAP
			Map <Object,String> rsltMap = new HashMap<Object,String>();
			
			//データが取得できなかった場合
			if(cbsMsgList.length == 0)
			{
				//取得結果マップにデータなしフラグ："1"（データなし）を設定して返却する。
				rsltMap.put(NO_DATA_FLG, NO_DATA_FLG_TRUE);	 //データなしフラグ
				return rsltMap;
			}
			
			for (int i = 0; i < cbsMsgList.length; i++) 
			{
				CAANMsg childTemplate = cbsMsgList[i];
				
				//課金対象年月取得
				int tgYm = Integer.parseInt(childTemplate.getString(ECN0101B001CBSMsg1List.CHRG_TRGT_YM));
				
				//運用年月取得
				int opeDateYm = Integer.parseInt(JCCBPCommon.getOpeDate(null).substring(0, 6));
				
				//当月データフラグ
				String thisMonthFlg = THIS_MONTH_DATA_FLG_FALSE;
				
				//取得した課金対象年月が運用年月以前の場合に返却マップを作成する
				if (tgYm <= opeDateYm) 
				{
					//後続判定処理にて必要な情報を格納する。
					rsltMap.put(ECN0101B001CBSMsg1List.AUTHORI_RSLT_DIV,	childTemplate.getString(ECN0101B001CBSMsg1List.AUTHORI_RSLT_DIV));	 //オーソリ結果区分
					rsltMap.put(ECN0101B001CBSMsg1List.YK_CFM_RSLT_DIV,	childTemplate.getString(ECN0101B001CBSMsg1List.YK_CFM_RSLT_DIV));	//有効性確認結果区分
					rsltMap.put(ECN0101B001CBSMsg1List.CRECARD_YK_KIGEN,	childTemplate.getString(ECN0101B001CBSMsg1List.CRECARD_YK_KIGEN));	//有効期限
					rsltMap.put(ECN0101B001CBSMsg1List.FLRLMT_CHK_ZUMI_AMNT,	childTemplate.getString(ECN0101B001CBSMsg1List.FLRLMT_CHK_ZUMI_AMNT));	 //フロアリミットチェック済金額
					
					//オーソリ承認CCにて必要な情報を格納する。
					rsltMap.put(ECN0101B001CBSMsg1List.CREDIT_KOKAN_CD,	childTemplate.getString(ECN0101B001CBSMsg1List.CREDIT_KOKAN_CD));	 //クレジット交換コード
					rsltMap.put(ECN0101B001CBSMsg1List.CRECARD_NO,	childTemplate.getString(ECN0101B001CBSMsg1List.CRECARD_NO));	//クレジットカード番号
					rsltMap.put(ECN0101B001CBSMsg1List.CRECARD_YK_KIGEN,	childTemplate.getString(ECN0101B001CBSMsg1List.CRECARD_YK_KIGEN));	//クレジットカード有効期限
					rsltMap.put(ECN0101B001CBSMsg1List.CUST_NM_ROMAJI,	childTemplate.getString(ECN0101B001CBSMsg1List.CUST_NM_ROMAJI));	 //お客様名（ローマ字）
					
					//データなしフラグに"1"データありを設定する。
					rsltMap.put(NO_DATA_FLG, NO_DATA_FLG_FALSE);	 //データなしフラグ
					
					if (tgYm == opeDateYm) 
					{
						//当月データが存在した場合は当月データフラグに"1"（当月データあり）を設定する。
						thisMonthFlg = THIS_MONTH_DATA_FLG_TRUE;
					}
					//当月データフラグをセット
					rsltMap.put("THIS_MONTH_DATA_FLG", thisMonthFlg);
					break;
				}
			}
			return rsltMap;
		}		
	
		// v58.00.00 ANK-3846-00-00 DEL START
//		/**
//		 * カード番号妥当性判定処理
//		 * @param workParamSetteValue 業務パラメータ設定値
//		 * @param crecard_comp クレジットカード会社
//		 * @param crecard_no クレジットカード番号
//		 * @return true（判定OK） false（判定NG）
//		 * @throws SCCallException 
//		 * 	（業務パラメータの設定値の例）「99661:35,99663:4,99663:5」
//		 */
//		private boolean isCardNoProper(String workParamSetteValue, String crecard_comp, String crecard_no) throws SCCallException {
//			
//			//業務パラメータ取得値を","で分割して配列に設定する。
//			String[] judge = workParamSetteValue.split(",");
//			
//			//業務パラメータに設定されている組合せ分判定を行う。
//			for (int i = 0; i < judge.length; i++) 
//			{
//				//処理用変数
//				String[] str = judge[i].split(":");
//				
//				//クレジットカード会社コードとクレジットカード番号の開始値が業務パラメータ取得値と一致するか判定を行う。
//				if (str[0].equals(crecard_comp) && str[1].equals(crecard_no.substring(0, str[1].length())))
//				{
//					//一致した場合は処理を終了する。
//					return true;
//				}
//			}
//			return false;
//		}
		// v58.00.00 ANK-3846-00-00 DEL END
		
		/**
		 * カード有効期限判定処理
		 * @param yukuKgn クレジットカード有効期限
		 * @return true（判定OK） false（判定NG）
		 */
		private boolean isCardYkKgnChk(String yukuKgn) {
			
			int opeDateYm = Integer.parseInt(JCCBPCommon.getOpeDate(null).substring(0, 6));
			int judYukuKgn = Integer.parseInt(yukuKgn);
			
			//入力.有効期限 >= 運用年月の場合判定OK
			if(judYukuKgn >= opeDateYm)
			{
				return true;
			}
			else
			{
				return false;
			}
		}
		/**
		 * フロアリミットチェック処理及び後続の判定処理を行う。
		 * @param handle セッションハンドル
		 * @param param リクエストパラメータ
		 * @param userResult 返却パラメータ格納用マップ
		 * @param ccParam CCパラメータマップ
		 * @param crecardInfMap
		 * @return param 返却パラメータ
		 * @throws Throwable
		 */
		private IRequestParameterReadWrite flrLmtChkJdg(SessionHandle handle, IRequestParameterReadWrite param, Map<String, Object> userResult, Map<String, Object> ccParam, Map<Object, String> crecardInfMap) throws Throwable{
		
		
		/***************************************************/
		/** フロアリミットチェック処理                     */
		/***************************************************/
		// v58.00.00 ANK-3846-00-00 MOD START
//		String sysid = (String) ccParam.get(CNSV0010_CNSV0010OP_CNSV001002CC.SYSID);
//		String paywayId = (String) ccParam.get(CNSV0010_CNSV0010OP_CNSV001002CC.PAYWAYID);
//		String ttlRyuGk = (String) ccParam.get(CNSV0010_CNSV0010OP_CNSV001002CC.TTLRYUGK);
		// ANK-4346-00-00 DEL START
//		String sysid = (String) ccParam.get(JCNYoshinJdgConstCC.INPUT_SYSID);
//		String paywayId = (String) ccParam.get(JCNYoshinJdgConstCC.INPUT_PAYWAYID);
		// ANK-4346-00-00 DEL END
		String ttlRyuGk = (String) ccParam.get(JCNYoshinJdgConstCC.INPUT_CR_AMOUNT);
		// v58.00.00 ANK-3846-00-00 MOD END
		String flrLmtCkZmGk = crecardInfMap.get(ECN0101B001CBSMsg1List.FLRLMT_CHK_ZUMI_AMNT);
		String flrLmtChkRslt = "";
		
		// ANK-4346-00-00 DEL START
//		flrLmtChkRslt = callFlrlmtChkSc(handle, param, sysid, paywayId, ttlRyuGk, flrLmtCkZmGk);
		// ANK-4346-00-00 DEL END

		// ANK-4346-00-00 ADD START
		double dblflrLmtCkZmG = Double.parseDouble(flrLmtCkZmGk);
		double dblttlRyuGk = Double.parseDouble(ttlRyuGk);
		// フロアリミット額 ≧ 決済金額(未請求額)
		if (dblflrLmtCkZmG >= dblttlRyuGk)
		{
			// フロアリミット未超過を設定
			flrLmtChkRslt = JCNStrConst.FLRLMT_CHOKA_FLG_FALSE;
		}
		else
		{
			// フロアリミット超過を設定
			flrLmtChkRslt = JCNStrConst.FLRLMT_CHOKA_FLG_TRUE;
		}
		// ANK-4346-00-00 ADD END
		
		if (JCNStrConst.FLRLMT_CHOKA_FLG_TRUE.equals(flrLmtChkRslt))
		{
			//【判定結果】フロアリミットチェック処理：フロアリミット超過
			
			/***************************************************/
			/** カード有効期限の判定処理                       */
			/***************************************************/
			String yukuKgn = crecardInfMap.get("crecard_yk_kigen");
			if(isCardYkKgnChk(yukuKgn))
			{
				//【判定結果】カード有効期限チェック処理：カード有効期限ＯＫ
				/*****************************************/
				/**●●●●●リターンコード作成●●●●●*/
				/*****************************************/
				// v58.00.00 ANK-3846-00-00 DEL START
//				//オーソリ承認CC用パラメータの設定
//				setAuthCCparam(param, crecardInfMap, JCNStrConst.CLEAR_PASS_FLG_ON);
				// v58.00.00 ANK-3846-00-00 DEL END
				
				setResultUserData(param, ccName, userResult, ccParam, null);
				//【与信判定結果】判定未（オーソリＣＣ実行）");
				
				return param;
			}
			else
			{
				//【判定結果】カード有効期限チェック処理：カード有効期限ＮＧ");
				/*****************************************/
				/**●●●●●リターンコード作成●●●●●*/
				/*****************************************/
				// v58.00.01 ANK-3846-00-00 MOD START
//				// v58.00.00 ANK-3846-00-00 ADD START
//				userResult.put(JCNYoshinJdgConstCC.OUTPUT_ERR_CODE, ERROR_CODE_CARDEXP_ERR);
//				userResult.put(JCNYoshinJdgConstCC.OUTPUT_ERR_MESSAGE, ERROR_MESSAGE_CARDEXP_ERR);
//				// v58.00.00 ANK-3846-00-00 ADD END
				userResult.put(JCNYoshinJdgConstCC.OUTPUT_RESPONSE_CODE, ERROR_CODE_CARDEXP_ERR);
				userResult.put(JCNYoshinJdgConstCC.OUTPUT_RESPONSE_DETAIL, ERROR_MESSAGE_CARDEXP_ERR);
				// v58.00.01 ANK-3846-00-00 MOD END
				setResultUserData(param, ccName, userResult, ccParam, JCNStrConst.RTN_CD_AUTH_NG);
				//【与信判定結果】オーソリＮＧ（オーソリＣＣ実行しない）");
				
				return param;
			}
		}
		else
		{
			//【判定結果】フロアリミットチェック処理：フロアリミット未超過");
			/***************************************************/
			/** 当月カード情報の判定処理                       */
			/***************************************************/
			
			// v58.00.00 ANK-3846-00-00 DEL START (デッドロジック削除)
//			if(THIS_MONTH_DATA_FLG_TRUE.equals(crecardInfMap.get("THIS_MONTH_DATA_FLG")))
//			{
				//【判定結果】当月カード情報の判定：当月データあり
				// v58.00.00 ANK-3846-00-00 DEL END (デッドロジック削除)
				
				/*****************************************/
				/**●●●●●リターンコード作成●●●●●*/
				/*****************************************/
				setResultUserData(param, ccName, userResult, ccParam, JCNStrConst.RTN_CD_AUTH_OK);
				//【与信判定結果】オーソリＯＫ（オーソリＣＣ実行しない）
				
				
				return param;
				// v58.00.00 ANK-3846-00-00 DEL START (デッドロジック削除)
//			}
//			else
//			{
//				/*****************************************/
//				/**●●●●●リターンコード作成●●●●●*/
//				/*****************************************/
//				//オーソリ承認CC用パラメータの設定
//				setAuthCCparam(param, crecardInfMap, JCNStrConst.CLEAR_PASS_FLG_OFF);
//				setResultUserData(param, ccName, userResult, ccParam, null);
//				//【与信判定結果】判定未（オーソリＣＣ実行・クリアパス実行しない）
//				
//				return param;
//			}
		}
		// v58.00.00 ANK-3846-00-00 DEL END (デッドロジック削除)
		}
		
		
		/**
		 * SC呼出用のパラメータを作成します。
		 * @param param リクエストパラメータ
		 * @param templateId テンプレートID
		 * @param cbsMsgClass CBSMsgクラス
		 * @param param4serviceIf サービスインターフェイス用パラメータ
		 * @param funcCode 機能コード
		 * @return SC呼出用パラメータ
		 * @throws RequestParameterException
		 */
		@SuppressWarnings("unchecked")
		private static HashMap<String, Object> createScParam(IRequestParameterReadOnly param,
				String templateId, Class<?> cbsMsgClass , Map param4serviceIf, String funcCode) throws RequestParameterException
		{

			// 受け取ったリクエストパラメータを元に、ＳＣ呼出用の上りマップを生成する。
			HashMap<String, Object> paramMap = new HashMap<String, Object>();

			CAANMsg[] templates = new CAANMsg[1];

			CAANMsg template = new CAANMsg(cbsMsgClass.getName());

			// **********************************************
			// 【取得元：電文ヘッダ(ヘッダ)】
			// **********************************************
			// 電文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());

			// **********************************************
			// 【取得元：ユーザエリア(コントロールマップ)】
			// **********************************************
			// 依頼先ホスト名
			Object clientHostName = param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME);
			paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, clientHostName);

			// 依頼元IPアドレス
			Object clientIPAddress = param.getControlMapData(SCControlMapKeys.REQ_HOSTIP);
			paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, clientIPAddress);

			// 依頼元画面ID
			Object clientViewId = param.getControlMapData(SCControlMapKeys.REQ_VIEWID);
			paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, clientViewId);

			// オペレータID
			Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
			paramMap.put(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);

			// **********************************************
			// 【取得元：ユーザデータ
			// **********************************************

			// テンプレートIDのセット
			paramMap.put(JCMConstants.TEMPLATE_ID_KEY, templateId);
			template.set(JCMConstants.TEMPLATE_ID_KEY, templateId);
			template.set(JCMConstants.FUNC_CODE_KEY, funcCode);
			
			setNullOtherColumn(cbsMsgClass, param4serviceIf);
			
			// 入力パラメータのセット
			template.setMsgDataOfAll((HashMap)param4serviceIf);
			templates[0] = template;

			paramMap.put("templates", templates);

			return paramMap;
		}
		
		/**
		 * 入力パラメータ値の指定がない項目にnullをセットする。<br/>
		 * @param cbsMsgClass CBSMsgクラス
		 * @param param4serviceIf サービスインターフェイス用パラメータ
		 */
		@SuppressWarnings("unchecked")
		private static void setNullOtherColumn(Class<?> cbsMsgClass, Map param4serviceIf) 
		{

			try 
			{
				java.lang.reflect.Field fieldContents = cbsMsgClass.getDeclaredField("CONTENTS");
				fieldContents.setAccessible(true);
				Object[][] contents = (Object[][])fieldContents.get(cbsMsgClass);

				// サービスインターフェイスの列情報を取得
				Map<String, String> colInfo = new HashMap<String, String>();
				for (int i = 0; i < contents.length; i++) 
				{
					Object[] obj = contents[i];
					colInfo.put(obj[0].toString(), obj[1].toString());
				}

				/* エラーフィールド(項目末尾が"_err"の項目)の定義されている項目を入力項目と見なし
				   当該フィールドについて、パラメータ値の指定がない場合は項nullをセットする */
				for (int i = 0; i < contents.length; i++) 
				{
					Object[] obj = contents[i];
					String errFieldName = obj[0].toString();
					if (errFieldName.matches(".*_err$"))
					{
						String fieldName = errFieldName.replaceAll("_err$", "");
						String colDataType = colInfo.get(fieldName);
						if (("String".equals(colDataType))||("Long".equals(colDataType))) 
						{
							// 指定がない項目にnullをセット
							if (!param4serviceIf.containsKey(fieldName))
							{
								param4serviceIf.put(fieldName, null);
							}
						}
					}
				}
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
		}
		
		/**
		 * SCの返却情報からCAANMsgリストを取得する。
		 * @param result SCの返却情報
		 * @param listName リスト名
		 * @return CAANMsgリスト
		 */
		private static CAANMsg[] getResultMsgList(Map<?, ?> result, String listName)
		{
			CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
			CAANMsg parentTemplate = templates[0];
			CAANMsg[] templateArray = parentTemplate.getCAANMsgList(listName);
			if (templateArray == null)
			{
				templateArray = new CAANMsg[]{};
			}
			return templateArray;
		}
		
		/**
		 * SCの返却情報から任意の項目のデータを文字列で取得する。
		 * @param result SCの返却情報
		 * @param columnName 項目名
		 * @return 対象項目のデータ
		 */
		private static String getResultString(Map<?, ?> result, String columnName)
		{
			String strVal = null;

			CAANMsg[] templates = (CAANMsg[]) result.get(JCMConstants.TEMPLATE_LIST_KEY);
			CAANMsg caanMsg = templates[0];
			String[] colNames = columnName.split("\\.");
			for (int i = 0; i < colNames.length; i++) 
			{
				String tmpColName = colNames[i];
				if (tmpColName.matches(".+\\[[0-9]+\\]$")) 
				{
					String listName = tmpColName.replaceAll("\\[[0-9]+\\]", "");
					String indexStr = tmpColName.replace(listName, "").replaceAll("(\\[|\\])", "");
					int index = Integer.parseInt(indexStr);
					if (caanMsg != null)
					{
						CAANMsg[] listData = caanMsg.getCAANMsgList(listName);
						if (listData == null)
						{
							break;
						}
						else if ((listData.length - 1) >= index)
						{
							caanMsg = listData[index];
						}
						else
						{
							break;
						}
					}
				} 
				else
				{
					if (i == (colNames.length - 1))
					{
						if (caanMsg != null)
						{
							strVal = caanMsg.getString(tmpColName);
						}
					}
					else
					{
						if (caanMsg != null)
						{
							caanMsg = caanMsg.getCAANMsg(tmpColName);
						}
					}
				}
			}
			return strVal;
		}
		
		/**
		 * 下りユーザデータマップのセット。
		 * @param param リクエストパラメータ
		 * @param scMapkey SCのID
		 * @param userData 追加でセットするユーザデータ
		 * @param ccParam CCパラメータ
		 * @param authResult オーソリ承認結果
		 * @throws Throwable
		 */
		@SuppressWarnings("unchecked")
		private static void setResultUserData(IRequestParameterReadWrite param, String scMapkey, Map userData, Map<String, Object> ccParam, String authResult) throws Throwable
		{
			/***************************************************/
			/** 返却パラメータ作成処理                         */
			/***************************************************/
			
			// 与信にてオーソリ結果が判明しなかった場合(オーソリ承認CCの呼出が必要な場合)
			if(authResult == null)
			{
				// v58.00.00 ANK-3846-00-00 MOD START
//				userData.put(CNSV0010_CNSV0010OP_CNSV001002CC.RETRUN_CODE, null); //戻りコード
//				userData.put(CNSV0010_CNSV0010OP_CNSV001002CC.AUTH_RESULT, null); //オーソリ承認結果
//				userData.put(CNSV0010_CNSV0010OP_CNSV001002CC.PAY_WAY_ID, ccParam.get(CNSV0010_CNSV0010OP_CNSV001002CC.PAYWAYID)); //支払方法ID
//				userData.put(CNSV0010_CNSV0010OP_CNSV001002CC.CREDIT_AUTH_FLG, JCNStrConst.CRECARD_AUTH_CC_FLG_ON); //クレジットオーソリ承認実行フラグ
				userData.put(JCNYoshinJdgConstCC.OUTPUT_RETURN_CODE, null); //戻りコード
				userData.put(JCNYoshinJdgConstCC.OUTPUT_ERR_CODE, null); //エラーコード
				userData.put(JCNYoshinJdgConstCC.OUTPUT_ERR_MESSAGE, null); //エラーメッセージ
				userData.put(JCNYoshinJdgConstCC.OUTPUT_AUTH_RESULT, null); //オーソリ承認結果
				userData.put(JCNYoshinJdgConstCC.OUTPUT_PAYWAYID, ccParam.get(JCNYoshinJdgConstCC.INPUT_PAYWAYID)); //支払方法ID
				userData.put(JCNYoshinJdgConstCC.OUTPUT_TRADING_ID, ccParam.get(JCNYoshinJdgConstCC.INPUT_TRADING_ID)); //マーチャント取引ID
				userData.put(JCNYoshinJdgConstCC.OUTPUT_CREDIT_AUTH_FLG, JCNStrConst.CRECARD_AUTH_CC_FLG_ON); //クレジットオーソリ承認実行フラグ
				// v58.00.00 ANK-3846-00-00 MOD END
			}
			// 与信でエラーが発生した場合
			// v58.00.00 ANK-3846-00-00 MOD START
//			else if(JCNStrConst.S_API_RTN_CD_NO_DATA.equals(authResult))
			else if(!JCNStrConst.RTN_CD_AUTH_OK.equals(authResult) &&!JCNStrConst.RTN_CD_AUTH_NG.equals(authResult))
			// v58.00.00 ANK-3846-00-00 MOD END
			{
				// v58.00.00 ANK-3846-00-00 MOD START
//				userData.put(CNSV0010_CNSV0010OP_CNSV001002CC.RETRUN_CODE, JCNStrConst.S_API_RTN_CD_NO_DATA); //戻りコード
//				userData.put(CNSV0010_CNSV0010OP_CNSV001002CC.AUTH_RESULT, JCNStrConst.RTN_CD_AUTH_NG); //オーソリ承認結果
//				userData.put(CNSV0010_CNSV0010OP_CNSV001002CC.PAY_WAY_ID, ccParam.get(CNSV0010_CNSV0010OP_CNSV001002CC.PAYWAYID)); //支払方法ID
				userData.put(JCNYoshinJdgConstCC.OUTPUT_RETURN_CODE, authResult); //戻りコード
				//エラーコードは呼出元で設定する
				//エラーメッセージは呼出元で設定する
				//処理結果コードは返却しない
				userData.put(JCNYoshinJdgConstCC.OUTPUT_AUTH_RESULT, JCNStrConst.RTN_CD_AUTH_NG); //オーソリ承認結果
				userData.put(JCNYoshinJdgConstCC.OUTPUT_PAYWAYID, ccParam.get(JCNYoshinJdgConstCC.INPUT_PAYWAYID)); //支払方法ID
				userData.put(JCNYoshinJdgConstCC.OUTPUT_TRADING_ID, ccParam.get(JCNYoshinJdgConstCC.INPUT_TRADING_ID)); //マーチャント取引ID
			
				// v58.00.00 ANK-3846-00-00 MOD END
			}
			// v58.00.01 ANK-3846-00-00 ADD START
			// 与信にてオーソリ結果がＮＧと判明した場合
			else if(JCNStrConst.RTN_CD_AUTH_NG.equals(authResult))
			{
				userData.put(JCNYoshinJdgConstCC.OUTPUT_RETURN_CODE, JCNStrConst.S_API_RTN_CD_OK); //戻りコード
				userData.put(JCNYoshinJdgConstCC.OUTPUT_CR_RESULTCODE, JCNStrConst.S_AUTH_EO_ERR);//処理結果コード
				//レスポンスコードは呼出元で設定する(必要があれば)
				//レスポンス明細コードは呼出元で設定する(必要があれば)
				userData.put(JCNYoshinJdgConstCC.OUTPUT_AUTH_RESULT, authResult); //オーソリ承認結果
				userData.put(JCNYoshinJdgConstCC.OUTPUT_PAYWAYID, ccParam.get(JCNYoshinJdgConstCC.INPUT_PAYWAYID)); //支払方法ID
				userData.put(JCNYoshinJdgConstCC.OUTPUT_TRADING_ID, ccParam.get(JCNYoshinJdgConstCC.INPUT_TRADING_ID)); //マーチャント取引ID
			}
			// v58.00.01 ANK-3846-00-00 ADD END
			// 与信にてオーソリ結果がＯＫと判明した場合
			else
			{
				// v58.00.00 ANK-3846-00-00 MOD START
//				userData.put(CNSV0010_CNSV0010OP_CNSV001002CC.RETRUN_CODE, JCNStrConst.S_API_RTN_CD_OK); //戻りコード
//				userData.put(CNSV0010_CNSV0010OP_CNSV001002CC.AUTH_RESULT, authResult); //オーソリ承認結果
//				userData.put(CNSV0010_CNSV0010OP_CNSV001002CC.PAY_WAY_ID, ccParam.get(CNSV0010_CNSV0010OP_CNSV001002CC.PAYWAYID)); //支払方法ID
				userData.put(JCNYoshinJdgConstCC.OUTPUT_RETURN_CODE, JCNStrConst.S_API_RTN_CD_OK); //戻りコード
				userData.put(JCNYoshinJdgConstCC.OUTPUT_CR_RESULTCODE, JCNStrConst.S_AUTH_NOMAL);//処理結果コード
				userData.put(JCNYoshinJdgConstCC.OUTPUT_AUTH_RESULT, authResult); //オーソリ承認結果
				userData.put(JCNYoshinJdgConstCC.OUTPUT_PAYWAYID, ccParam.get(JCNYoshinJdgConstCC.INPUT_PAYWAYID)); //支払方法ID
				userData.put(JCNYoshinJdgConstCC.OUTPUT_TRADING_ID, ccParam.get(JCNYoshinJdgConstCC.INPUT_TRADING_ID)); //マーチャント取引ID
				// v58.00.00 ANK-3846-00-00 MOD END
			}
			
			// SCから取得したデータのセット
			if (userData != null)
			{
				Map<String, Object> userDataRef = (Map<String, Object>)param.getData(scMapkey);
				Iterator iterator = userData.keySet().iterator();
				while (iterator.hasNext()) 
				{
					String mapKey = (String)iterator.next();
					Object mapVal = userData.get(mapKey);
					userDataRef.put(mapKey, mapVal);
				}
			}
		}
		
		// v58.00.00 ANK-3846-00-00 DEL START
//		/**
//		 * オーソリ承認CC用パラメータのセット。
//		 * @param param リクエストパラメータ
//		 * @param crecardInfMap クレジットカード情報マップ
//		 * @param creaPass クリアパス実行フラグ
//		 * @throws Throwable
//		 */
//		@SuppressWarnings("unchecked")
//		private static void setAuthCCparam(IRequestParameterReadWrite param, Map crecardInfMap, String creaPass) throws Throwable
//		{
//			/***************************************************/
//			/** オーソリ承認CC用パラメータ作成処理             */
//			/***************************************************/
//			
//			// 入力パラメータ格納
//			Map<String, Object> ccParam = (Map<String, Object>)param.getData(ccName_authCC);
//			
//			ccParam.put(CNSV0010_CNSV0010OP_CNSV001001CC.KDKISHACD, crecardInfMap.get(ECN0101B001CBSMsg1List.CREDIT_KOKAN_CD)); //カード会社コード
//			ccParam.put(CNSV0010_CNSV0010OP_CNSV001001CC.KDBNGU, crecardInfMap.get(ECN0101B001CBSMsg1List.CRECARD_NO)); //カード番号
//			ccParam.put(CNSV0010_CNSV0010OP_CNSV001001CC.YUKUKGN, crecardInfMap.get(ECN0101B001CBSMsg1List.CRECARD_YK_KIGEN)); //有効期限
//			ccParam.put(CNSV0010_CNSV0010OP_CNSV001001CC.KDMIGNN, crecardInfMap.get(ECN0101B001CBSMsg1List.CUST_NM_ROMAJI)); //カード名義人
//			ccParam.put(CNSV0010_CNSV0010OP_CNSV001001CC.CLEARPASS, creaPass); //クリアパス実行フラグ
//			
//		}
		// v58.00.00 ANK-3846-00-00 DEL END
		
		
		/**
		 * SC処理結果取得
		 * @param result オブジェクト名
		 * @return 
		 * @return boolean(true:正常,false:エラー)
		 */
		private Object[] resultChkSc(Map<?, ?> result)
		{
			Object[] list = new Object[2];
			
			list[RESULT_CHK_RET_CD] = result.get(JCMConstants.RET_CD_INT_KEY).toString();
			CAANMsg[] templates = (CAANMsg[]) result.get(JCMConstants.TEMPLATE_LIST_KEY);
			CAANMsg msg = templates[0];
			list[RESULT_CHK_STATUS] = msg.getInt(JCMConstants.STATUS_INT_KEY);
		return list;
		}
		
		
		/**
		 * エラーログ出力
		 * @param errMsg エラーメッセージ
		 */
		private void printErrorLog(String errMsg)
		{
			StackTraceElement[] steAll = Thread.currentThread().getStackTrace();
			String errorInfo = "";
			if (steAll.length >= 3) 
			{
				StackTraceElement ste = steAll[2];
				errorInfo = JCNStrConst.S_LINE_SEPARAOR_LF + "	at " + ste.getClassName() + "." + ste.getMethodName() + 
				"(" + ste.getFileName() + ":" + ste.getLineNumber()+")"+ JCNStrConst.S_LINE_SEPARAOR_LF;
			}
			JSYbpmLog.println(JSYLogBase.ERROR, this.getClass() , errorInfo, MessageID.DEB_X21_DEBUG_MSG,  
					new String[]{"### CCでエラー発生 ###", errMsg } , "");
		}
	
}
