/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：CNA00401SFLogic
*   ソースファイル名：CNA00401SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年11月23日
*＜機能概要＞
*   クレジットオーソリ承認処理を行います。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/11/23   FJ          新規作成
*   v3.00		2012/08/24   FJ)小林	【ST1-2012-0000354】外部IF項目.トータル利用額小数点対応
*   v12.00.00	2015/01/13   FJ)中山	【OM-2014-0004037】名義人更新時のトータル利用額の対応
*   v20.00.00   2015/09/07   FJ)李擇臣  【ANK-2586-00-00】クレジットカード番号預かりサービス導入（Step2：売上／有効性チェック経路変更）
*   v20.00.01   2015/10/23   FJ)李擇臣  【IT1-2015-0000115】オーソリ額が30001円以上の場合、１円でオーそりされる対応
*   v28.00.00   2016/10/04   FJ)清原	【ANK-3032-00-00】AxM再構築対応
*   v28.00.01   2016/10/24   FJ)清原	【ANK-3032-00-00】AxM再構築対応（ログ出力対応）
*   v45.00.00   2019/08/06   FJ)前田	【ANK-3602-01-00】特定クレジットカード案件内仕様変更１
*   v58.00.00	2022/06/13   FJ)藤本涼	【ANK-3846-00-00】【クレカ】クリアパス→ペイジェント移行
**********************************************************************/
package eo.web.webview.CNA00401SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.common.JSYLogBase;
import com.fujitsu.futurity.common.JSYwebLog;
import com.fujitsu.futurity.model.common.check.HalfCharCheck;
import com.fujitsu.futurity.model.common.check.LengthCheck;
import com.fujitsu.futurity.web.x31.X31BWebBusinessLogic;
import com.fujitsu.futurity.web.x31.X31CMessageResult;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;

import eo.common.constant.JCNStrConst;

/**
 * クレジットオーソリ承認処理
 * @author FJ
 *
 */
@SuppressWarnings("serial")
public class CNA00401SFLogic extends X31BWebBusinessLogic
{

	
	/**
	 * 空文字
	 */
	private static final String STR_BLANK = "";
	
	/**
	 * APIリターンコード(パラメータエラー)
	 */
	private static final String S_API_RTN_CD_PARAM_ERR = JCNStrConst.S_API_RTN_CD_PARAM_ERR;
	
	/**
	 * APIリターンコード(システムエラー)
	 */
	private static final String S_API_RTN_CD_SYS_ERR = JCNStrConst.S_API_RTN_CD_SYS_ERR;
	
// v58.00.00 ANK-3846-00-00 Del Start
//	/**
//	 * APIリターンコード(正常)
//	 */
//	private static final String S_API_RTN_CD_OK = JCNStrConst.S_API_RTN_CD_OK;
// v58.00.00 ANK-3846-00-00 Del End
	
	/**
	 * クレジットオーソリサービスID
	 */
	private static final String SERVICE_ID = "CNSV0010";
	
// v58.00.00 ANK-3846-00-00 Del Start
//	/**
//	 * サービスコンポーネント名
//	 */
//	private static final String CC_NAME = "JCNCreditAuthCC";	
// v58.00.00 ANK-3846-00-00 Del End
	
//v28.00.00 ANK-3032-00-00 Add Start
	/**
	 * サービスコンポーネント名（与信判定ＣＣ）
	 */
	private static final String CC_NAME_YOSHIN_JDG = "JCNYoshinJdgCC";	
//v28.00.00 ANK-3032-00-00 Add End

//v28.00.00 ANK-3032-00-00 Del Start
//	/** AxM会員情報更新依頼サービスID */
//	private static final String axmRequestService = "CKSV9001";
//v28.00.00 ANK-3032-00-00 Del End

	
	/**
	 * APIリクエスト時
	 * 
	 * @return boolean 処理結果
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public boolean action_Init() throws Exception
	{

		DEBUG_LOG.info("action_Init Start!");

		X31SDataBeanAccess bean = getServiceFormBean();

		try
		{
			// リクエストパラメータを取得・格納
			Map<String, String> reqestMap = super.getRequestParams();
			
			DEBUG_LOG.info("テスト reqestMap= " + reqestMap.toString());
			DEBUG_LOG.info("テスト(UTF-8 GET) reqestMap= " + new String(reqestMap.toString().getBytes(), "UTF-8"));
			
			/************************
			 * パラメータチェック
			 ************************/
			if(!checkParam(reqestMap))
			{
				createErrResultParam(bean, S_API_RTN_CD_PARAM_ERR);
				return true;
			}
			
			/************************
			 * クレジットオーソリ承認
			 ************************/
			// サービス呼び出しの際の引数を生成
			HashMap paramMap = new HashMap();
			HashMap inputMap = new HashMap();
			HashMap outputMap = new HashMap();

			// サービスへのデータセット
			paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, SERVICE_ID);
			paramMap.put(X31CWebConst.TELEGRAM_INFO_OPERATION_ID, SERVICE_ID + "OP");
			
// v58.00.00 ANK-3846-00-00 Del Start
//			createServiceMap(reqestMap, inputMap);
// v58.00.00 ANK-3846-00-00 Del End
//v28.00.00 ANK-3032-00-00 Add Start
			//与信判定サービスへのパラメータマップ作成
			createServiceMap2(reqestMap, inputMap);
//v28.00.00 ANK-3032-00-00 Add End

			// サービスの呼出(クレジットオーソリ)
			X31CMessageResult msgResult = invokeService(paramMap, inputMap, outputMap);
			
			// エラー処理 
// v58.00.00 ANK-3846-00-00 Del Start			
//			String errFlgAuth = (String)getParamFromMap(outputMap, CC_NAME, "RETRUN_CODE");
// v58.00.00 ANK-3846-00-00 Del End
			if(msgResult != null)
			{
				createErrResultParam(bean, S_API_RTN_CD_SYS_ERR);
				DEBUG_LOG.info("クレジットオーソリサービスにてエラーが発生しました。");
				return true;
			}
// v58.00.00 ANK-3846-00-00 Del Start
//			else if(!S_API_RTN_CD_OK.equals(errFlgAuth))
//			{
//				createResultParam(bean, outputMap);
//				DEBUG_LOG.info("クレジットオーソリサービスにてエラーが発生しました。");
//				return true;
//			}
// v58.00.00 ANK-3846-00-00 Del End
			
//v28.00.00 ANK-3032-00-00 Del Start
//			/************************
//			 * AxM会員情報連携
//			 ************************/
//			HashMap paramMap4AxmReq = new HashMap();
//			HashMap inputMap4AxmReq = new HashMap();
//			HashMap outputMap4AxmReq = new HashMap();
//
//			// サービスへのデータセット
//			paramMap4AxmReq.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, axmRequestService);
//			paramMap4AxmReq.put(X31CWebConst.TELEGRAM_INFO_OPERATION_ID, axmRequestService + "OP");
//			
//			HashMap<String, Object> mapAxmCc = new HashMap<String, Object>();
//			mapAxmCc.put("upd_trgt_sysid", getParameterToString(reqestMap, "sysid"));
//			inputMap4AxmReq.put("CKSV900101CC", mapAxmCc);
//			
//			// サービスの呼出
//			X31CMessageResult msgResult4AxmReq = invokeService(paramMap4AxmReq, inputMap4AxmReq, outputMap4AxmReq);
//
//			// エラー処理
//			String errFlgAxm = (String)getParamFromMap(outputMap4AxmReq, "CKSV900101CC", "err_flg");
//			if ((msgResult4AxmReq != null)||(!"0".equals(errFlgAxm)))
//			{
//				createErrResultParam(bean, S_API_RTN_CD_SYS_ERR);
//				DEBUG_LOG.info("AxM会員情報連携サービスにてエラーが発生しました。");
//				return true;
//			}
//v28.00.00 ANK-3032-00-00 Del End
			
			
			// 返却パラメータ設定
			createResultParam(bean, outputMap);
			
		}
		catch (Exception e)
		{
			StringBuilder sb = new StringBuilder();
			StringWriter sw = new StringWriter();
			PrintWriter pw = new PrintWriter(sw);
			e.printStackTrace(pw);
			sb.append("\n" + sw.toString());
			DEBUG_LOG.info("CNA00401にてエラー(Exception)発生" + sb.toString());

			createErrResultParam(bean, S_API_RTN_CD_SYS_ERR);
		}
		DEBUG_LOG.info("action_Init End!");
		return true;
	}
	
	/**
	 * パラメータチェック処理
	 * @param bean
	 * @return boolean(true:チェックOK,false:チェックNG)
	 * @throws 処理中に発生した例外をスロー
	 */
	private static boolean checkParam(Map<String, String> reqestMap) throws Exception
	{
		String sysId = getParameterToString(reqestMap, "sysid");
//v28.00.00 ANK-3032-00-00 Add Start
		String payWay = getParameterToString(reqestMap, "payWay");
		String payWayId = getParameterToString(reqestMap, "payWayId");
//v28.00.00 ANK-3032-00-00 Add End
// v58.00.00 ANK-3846-00-00 Del Start
//		String kdKishaCd = getParameterToString(reqestMap, "kdKishaCd");
//		String kdBngu = getParameterToString(reqestMap, "kdBngu");
//		String yukuKgn = getParameterToString(reqestMap, "yukuKgn");
//		String kdMignn = getParameterToString(reqestMap, "kdMignn");
//		String ttlRyuGk = getParameterToString(reqestMap, "ttlRyuGk");
// v58.00.00 ANK-3846-00-00 Del End
//v28.00.00 ANK-3032-00-00 Del Start
//		String chkKdMignn = getParameterToString(reqestMap, "chkKdMignn");
//v28.00.00 ANK-3032-00-00 Del End
		
//v28.00.01 ANK-3032-00-00 Add Start
		//入力電文ログ出力処理
		writeDenbunLog(reqestMap,"CNIFE006 入力値：");
//v28.00.01 ANK-3032-00-00 Add End
		
		/************************
		 * パラメータチェック
		 ************************/
//v28.00.00 ANK-3032-00-00 Del Start
//		// SYSID
//		if(isNullOrBlankWithTrim(sysId) == false)
//		{
//			// 桁数チェック
//			if(sysId.length() != 10)
//			{
//				return false;
//			}
//		}
//		else
//		{
//			return false;
//		}
//
//        // カード会社コード
//		if (isNullOrBlankWithTrim(kdKishaCd)) 
//		{
//			return false;
//		}
//
//        // カード番号
//		if (isNullOrBlankWithTrim(kdBngu)) 
//		{
//			return false;
//		}
//		// 有効期限
//		if (isNullOrBlankWithTrim(yukuKgn)) 
//		{
//			return false;
//		}
//		// カード名義人
//		if (isNullOrBlank(kdMignn)) 
//		{
//			return false;
//		}
//		// トータル利用額(名義人更新フラグONの場合はチェックしない)
//		if(!JCNStrConst.MIGNN_UPD_FLG_ON.equals(chkKdMignn))
//		{
//			if (isNullOrBlankWithTrim(ttlRyuGk)) 
//			{
//				return false;
//			}
//			else if (new Double(ttlRyuGk).longValue() > 9999999)
//			{
//				return false;
//			}
//		}
//		return true;
//v28.00.00 ANK-3032-00-00 Del End

//v28.00.00 ANK-3032-00-00 Add Start

		// SYSID
		if(isNullOrBlankWithTrim(sysId))
		{
			//【必須チェックエラー】 SYSID
			return false;
		}
		else
		{
			// 桁数チェック1（10桁）
			if(!LengthCheck.isLength1Check(sysId, 10))
			{
				//【桁数チェックエラー】 SYSID
				return false;
			}
			// 形式チェック（半角英数字1）
			if(!HalfCharCheck.isEnNumber1Check(sysId))
			{
				//【形式チェックエラー】 SYSID
				return false;
			}
		}

		// 支払方法
		if (isNullOrBlankWithTrim(payWay)) 
		{
			//【必須チェックエラー】 支払方法
			return false;
		}
		
		else
		{
			// 桁数チェック1（1桁）
			if(!LengthCheck.isLength1Check(payWay, 1))
			{
				//【桁数チェックエラー】 支払方法
				return false;
			}
			// 形式チェック（半角英数字1）
			if(!HalfCharCheck.isEnNumber1Check(payWay))
			{
				//【形式チェックエラー】 支払方法
				return false;
			}
			// v58.00.00 ANK-3846-00-00 Mod Start
//			//リファレンスチェック（支払方法がクレジット、ISP決済以外の場合エラー）
//			if (!JCNStrConst.S_CONT_PAYWAY_CD_CRE.equals(payWay) && !JCNStrConst.S_CONT_PAYWAY_CD_ISP.equals(payWay))
			//リファレンスチェック（支払方法がISP決済以外の場合エラー）
			if (!JCNStrConst.S_CONT_PAYWAY_CD_ISP.equals(payWay))
			// v58.00.00 ANK-3846-00-00 Mod End
			{
				//【支払方法チェックエラー】 支払方法
				return false;
			}
		}
		//支払方法がISPの場合にチェックを実施
		if(JCNStrConst.S_CONT_PAYWAY_CD_ISP.equals(payWay))
		{
	        // 支払方法ＩＤ
			if (isNullOrBlankWithTrim(payWayId)) 
			{
				//【必須チェックエラー】 支払方法ＩＤ
				return false;
			}
			else
			{
				// 桁数チェック1（10桁）
				if(!LengthCheck.isLength1Check(payWayId, 10))
				{
					//【桁数チェックエラー】 支払方法ＩＤ（ＩＳＰ決済）
					return false;
				}
				// 形式チェック（半角英数字1）
				if(!HalfCharCheck.isEnNumber1Check(payWayId))
				{
					//【形式チェックエラー】 支払方法ＩＤ
					return false;
				}
			}
		}

// v58.00.00 ANK-3846-00-00 Del Start
//		//支払方法がクレジットカードかつ支払方法IDが設定されていない場合（新規クレジットカード）にチェックを実施
//		if(JCNStrConst.S_CONT_PAYWAY_CD_CRE.equals(payWay) && isNullOrBlankWithTrim(payWayId))
//		{
//	        // カード会社コード
//			if (isNullOrBlankWithTrim(kdKishaCd)) 
//			{
//				//【必須チェックエラー】 カード会社コード
//				return false;
//			}
//			else
//			{
//				// 桁数チェック1（5桁）
//				if(!LengthCheck.isLength1Check(kdKishaCd, 5))
//				{
//					//【桁数チェックエラー】 カード会社コード
//					return false;
//				}
//				// 形式チェック（半角英数字1）
//				if (!HalfCharCheck.isEnNumber1Check(kdKishaCd)) 
//				{
//					//【形式チェックエラー】 カード会社コード
//					return false;
//				}
//			}
//	
//	        // カード番号
//			if (isNullOrBlankWithTrim(kdBngu)) 
//			{
//				//【必須チェックエラー】 カード番号
//				return false;
//			}
//			else
//			{
//				// 桁数チェック1（16桁）
//				if(!LengthCheck.isLength1Check(kdBngu, 16))
//				{
//					//【桁数チェックエラー】 カード番号
//					return false;
//				}
//				// 形式チェック（半角英数字1）
//				if (!HalfCharCheck.isEnNumber1Check(kdBngu)) 
//				{
//					//【形式チェックエラー】 カード番号
//					return false;
//				}
//			}
//			// 有効期限
//			if (isNullOrBlankWithTrim(yukuKgn)) 
//			{
//				//必須チェックエラー】 有効期限
//				return false;
//			}
//			else
//			{
//				// 桁数チェック1（6桁）
//				if(!LengthCheck.isLength1Check(yukuKgn, 6))
//				{
//					//【桁数チェックエラー】 有効期限
//					return false;
//				}
//				// 形式チェック（年月1）
//				if (!DatetimeCheck.isYearMonthCheck(yukuKgn)) 
//				{
//					//【形式チェックエラー】 有効期限
//					return false;
//				}
//			}
//			// カード名義人
//			if (isNullOrBlank(kdMignn)) 
//			{
//				//【必須チェックエラー】 カード名義人
//				return false;
//			}
//			else
//			{
//				// 桁数チェック2（1〜80桁）
//				if(!LengthCheck.isLength2Check(kdMignn, 1, 80))
//				{
//					return false;
//				}
//				// 形式チェック（クレカ名義_ローマ字）
//				if (!HalfCharCheck.isCrecardNmRomajiCheck(kdMignn)) 
//				{
//					//【形式チェックエラー】 カード名義人
//					return false;
//				}
//			}
//		}
//		//支払方法がクレジットカードかつ支払方法IDが設定されている場合（既存クレジットカード）にチェックを実施
//		if(JCNStrConst.S_CONT_PAYWAY_CD_CRE.equals(payWay) && !isNullOrBlankWithTrim(payWayId))
//		{
//	        // 支払方法ＩＤ
//			if (isNullOrBlankWithTrim(payWayId)) 
//			{
//				//【必須チェックエラー】 支払方法ＩＤ
//				return false;
//			}
//			else
//			{
//				// 桁数チェック1（9桁）
//				if(!LengthCheck.isLength1Check(payWayId, 9))
//				{
//					//【桁数チェックエラー】 支払方法ＩＤ（クレジット）
//					return false;
//				}
//				// 形式チェック（半角英数字1）
//				if(!HalfCharCheck.isEnNumber1Check(payWayId))
//				{
//					//【形式チェックエラー】 支払方法ＩＤ
//					return false;
//				}
//			}
//			// トータル利用額
//			if (isNullOrBlank(ttlRyuGk)) 
//			{
//				//【必須チェックエラー】 トータル利用額
//				return false;
//			}
//			else
//			{
//				// 桁数チェック2（1〜9桁）※小数点を考慮して9桁に設定
//				if(!LengthCheck.isLength2Check(ttlRyuGk, 1, 9))
//				{
//					//【桁数チェックエラー】 トータル利用額
//					return false;
//				}
//				// 形式チェック（Double2）
//				if(!HalfCharCheck.isDouble2Check(ttlRyuGk))
//				{
//					//【形式チェックエラー】 トータル利用額
//					return false;
//				}
//			}
//		}
// v58.00.00 ANK-3846-00-00 Del End
		return true;
//v28.00.00 ANK-3032-00-00 Add End
	}

	/**
	 * 返却パラメータ編集処理
	 * @param bean
	 * @param outMap
	 * @return String
	 */
	private void createResultParam(X31SDataBeanAccess bean, Map<?, ?> outMap) throws Exception
	{
//v28.00.00 ANK-3032-00-00 Del Start
//		String returnCd = (String)getParamFromMap(outMap, CC_NAME, "RETRUN_CODE");
//		String authResultCd = (String)getParamFromMap(outMap, CC_NAME, "AUTH_RESULT");
//		String authNum = (String)getParamFromMap(outMap, CC_NAME, "AUTH_NUMBER");
//		String distCd = (String)getParamFromMap(outMap, CC_NAME, "DISTINATION_CODE");
//		String creCdId = (String)getParamFromMap(outMap, CC_NAME, "CREDIT_CARD_INFO");
//		
//		bean.sendMessageString(CNA00401SFConst.RETRUN_CODE, X31CWebConst.DATABEAN_SET_VALUE, returnCd);
//		bean.sendMessageString(CNA00401SFConst.AUTH_RESULT, X31CWebConst.DATABEAN_SET_VALUE, authResultCd);
//		bean.sendMessageString(CNA00401SFConst.AUTH_NUMBER, X31CWebConst.DATABEAN_SET_VALUE, authNum);
//		bean.sendMessageString(CNA00401SFConst.DISTINATION_CODE, X31CWebConst.DATABEAN_SET_VALUE, distCd);
//		bean.sendMessageString(CNA00401SFConst.CREDIT_CARD_INFO, X31CWebConst.DATABEAN_SET_VALUE, creCdId);
//v28.00.00 ANK-3032-00-00 Del End

//v28.00.00 ANK-3032-00-00 Add Start

// v58.00.00 ANK-3846-00-00 Del Start
//		//クレジットオーソリフラグによって返却パラメータを変更する。
//		String creditAuthFlg = (String)getParamFromMap(outMap, CC_NAME_YOSHIN_JDG, "CREDIT_AUTH_FLG");
// v58.00.00 ANK-3846-00-00 Del End
		
		String returnCd = "";
		String authResultCd = "";
		String payWayId = "";
		// v45.00.00 ANK-3602-01-00 2019/08/06 ADD START
		String cardType = "";
		String issuerClass = "";
		// v45.00.00 ANK-3602-01-00 2019/08/06 ADD END
		
// v58.00.00 ANK-3846-00-00 Mod Start
//		//クレジットオーソリ承認実行フラグが1（実行する）の場合はクレジットオーソリ承認CCの結果を返却する。
//		if(JCNStrConst.CRECARD_AUTH_CC_FLG_ON.equals(creditAuthFlg))
//		{
//			returnCd = (String)getParamFromMap(outMap, CC_NAME, "RETRUN_CODE");
//			authResultCd = (String)getParamFromMap(outMap, CC_NAME, "AUTH_RESULT");
//			payWayId = (String)getParamFromMap(outMap, CC_NAME, "CREDIT_CARD_INFO");
//			// v45.00.00 ANK-3602-01-00 2019/08/06 ADD START
//			cardType = (String)getParamFromMap(outMap, CC_NAME, "CARD_TYPE");
//			issuerClass = (String)getParamFromMap(outMap, CC_NAME, "ISSUER_CLASS");
//			// v45.00.00 ANK-3602-01-00 2019/08/06 ADD END
//			
//		}
//		//クレジットオーソリ承認実行フラグが0（実行しない）の場合は与信判定CCの結果を返却する。
//		else if(JCNStrConst.CRECARD_AUTH_CC_FLG_OFF.equals(creditAuthFlg))
//		{
//			returnCd = (String)getParamFromMap(outMap, CC_NAME_YOSHIN_JDG, "RETRUN_CODE");
//			authResultCd = (String)getParamFromMap(outMap, CC_NAME_YOSHIN_JDG, "AUTH_RESULT");
//			payWayId = (String)getParamFromMap(outMap, CC_NAME_YOSHIN_JDG, "PAY_WAY_ID");
//			
//		}
		returnCd = (String)getParamFromMap(outMap, CC_NAME_YOSHIN_JDG, "return_code");
		authResultCd = (String)getParamFromMap(outMap, CC_NAME_YOSHIN_JDG, "auth_result");
		payWayId = (String)getParamFromMap(outMap, CC_NAME_YOSHIN_JDG, "payWayId");
// v58.00.00 ANK-3846-00-00 Mod End
		
		bean.sendMessageString(CNA00401SFConst.RETRUN_CODE, X31CWebConst.DATABEAN_SET_VALUE, returnCd);
		bean.sendMessageString(CNA00401SFConst.AUTH_RESULT, X31CWebConst.DATABEAN_SET_VALUE, authResultCd);
		bean.sendMessageString(CNA00401SFConst.PAY_WAY_ID, X31CWebConst.DATABEAN_SET_VALUE, payWayId);
		// v45.00.00 ANK-3602-01-00 2019/08/06 ADD START
		bean.sendMessageString(CNA00401SFConst.CARD_TYPE, X31CWebConst.DATABEAN_SET_VALUE, cardType);
		bean.sendMessageString(CNA00401SFConst.ISSUER_CLASS, X31CWebConst.DATABEAN_SET_VALUE, issuerClass);
		// v45.00.00 ANK-3602-01-00 2019/08/06 ADD END
//v28.00.00 ANK-3032-00-00 Add End

//v28.00.01 ANK-3032-00-00 Add Start
		//出力電文ログ出力処理
		Map<String, String> logMap = new HashMap<String,String>();
		logMap.put("RETRUN_CODE", returnCd);
		logMap.put("AUTH_RESULT", authResultCd);
		logMap.put("PAY_WAY_ID", payWayId);
		// v45.00.00 ANK-3602-01-00 2019/08/06 ADD START
		logMap.put("CARD_TYPE", cardType);
		logMap.put("ISSUER_CLASS", issuerClass);
		// v45.00.00 ANK-3602-01-00 2019/08/06 ADD END
		
		writeDenbunLog(logMap,"CNIFE006 出力値：");
//v28.00.01 ANK-3032-00-00 Add End
	}
	
	/**
	 * View層エラー発生時返却パラメータ編集処理
	 * @param bean
	 * @return String
	 */
	private void createErrResultParam(X31SDataBeanAccess bean, String errCd) throws Exception
	{
//v28.00.01 ANK-3032-00-00 Add Start
		//出力電文ログ出力処理
		Map<String, String> logMap = new HashMap<String,String>();
		logMap.put("RETRUN_CODE", errCd);
		logMap.put("AUTH_RESULT", null);
		logMap.put("PAY_WAY_ID", null);
		// v45.00.00 ANK-3602-01-00 2019/08/06 ADD START
		logMap.put("CARD_TYPE", null);
		logMap.put("ISSUER_CLASS", null);
		// v45.00.00 ANK-3602-01-00 2019/08/06 ADD END
		
		writeDenbunLog(logMap,"CNIFE006 出力値：");
//v28.00.01 ANK-3032-00-00 Add End
		
		bean.sendMessageString(CNA00401SFConst.RETRUN_CODE, X31CWebConst.DATABEAN_SET_VALUE, errCd);
	}
	
// v58.00.00 ANK-3846-00-00 Del Start
//	/**
//	 * サービスへのパラメータを作成する
//	 * @param inputMap 入力マップ
//	 * @throws Exception
//	 */
//	private void createServiceMap(Map<String, String> reqestMap, Map<String, Object> inputMap) throws Exception
//	{
////OM-2014-0004037 DEL START
////		/************************
////		 * パラメータ置換
////		 ************************/
////		long ttlRyuGk = new Double(getParameterToString(reqestMap, "ttlRyuGk")).longValue();
////		
////		String chkKdMignn = getParameterToString(reqestMap, "chkKdMignn");
////		// トータル利用額が0の場合は"1"を設定する) 
////		if(!JCNStrConst.MIGNN_UPD_FLG_ON.equals(chkKdMignn))
////		{
////			if (ttlRyuGk == 0) {
////				ttlRyuGk = 1;
////			}
////		}
////OM-2014-0004037 DEL END
//		
////v28.00.00 ANK-3032-00-00 Mod Start
////		String clearPass = getParameterToString(reqestMap, "clearPass");
//		//AxM再構築対応にてリクエストパラメータにクリアパス実行フラグが連携されなくなったため固定で"1"(クリアパス実行)を設定
//		String clearPass = JCNStrConst.CLEAR_PASS_FLG_ON; //クリアパス実行フラグ："1"(クリアパス実行)
////v28.00.00 ANK-3032-00-00 Mod End
//
////v28.00.00 ANK-3032-00-00 Del Start
////		// クリアパス実行フラグ(値の設定が無い場合は"1"(クリアパス実行)に設定する) 
////		if (isNullOrBlank(clearPass)) {
////			clearPass = "1";
////		}
////v28.00.00 ANK-3032-00-00 Del End
//		
//		HashMap<String, Object> mapCc = new HashMap<String, Object>();
//		
//		mapCc.put("sysid", getParameterToString(reqestMap, "sysid"));
//		mapCc.put("kdKishaCd", getParameterToString(reqestMap, "kdKishaCd"));
//		mapCc.put("kdBngu", getParameterToString(reqestMap, "kdBngu"));
//		mapCc.put("yukuKgn", getParameterToString(reqestMap, "yukuKgn"));
//		mapCc.put("kdMignn", getParameterToString(reqestMap, "kdMignn"));
//		
////v28.00.00 ANK-3032-00-00 Del Start
//////OM-2014-0004037 MOD START
//////		mapCc.put("ttlRyuGk", String.valueOf(ttlRyuGk));
////		String chkKdMignn = getParameterToString(reqestMap, "chkKdMignn");
////		if(!JCNStrConst.MIGNN_UPD_FLG_ON.equals(chkKdMignn))
////		{
////			long ttlRyuGk = new Double(getParameterToString(reqestMap, "ttlRyuGk")).longValue();
////			// ANK-2586-00-00 MOD START
////			// トータル利用額が0の場合は"1"を設定する) 
////			//if (ttlRyuGk == 0) {
////			//	ttlRyuGk = 1;
////			//}
////			// IT1-2015-0000115 DEL START
//////			// 初回オーソリ時(初回支払方法登録（ＡｘＭから0円でオーソリ依頼があった場合）、または、ＡｘＭから連携されたクレジットカードIDの設定がない場合)には、
//////			if (isNullOrBlankWithTrim(getParameterToString(reqestMap, "krztKdId"))) 
//////			{
//////				DEBUG_LOG.info("ＡｘＭから連携されたクレジットカードIDの設定がないです。");
//////			}
//////			if (ttlRyuGk == 0 || isNullOrBlankWithTrim(getParameterToString(reqestMap, "krztKdId"))) {
//////				ttlRyuGk = 1;
//////				DEBUG_LOG.info("トータル利用額の値：" + ttlRyuGk);
//////			}
////			// IT1-2015-0000115 DEL END
////			// IT1-2015-0000115 ADD START
////			if (ttlRyuGk <= 30000) 
////			{
////				DEBUG_LOG.info("決済金額 <= 30000");
////			}
////			else
////			{
////				DEBUG_LOG.info("決済金額 > 30000");
////			}
////			// 初回オーソリ時(初回支払方法登録（ＡｘＭから0円でオーソリ依頼があった場合）、または、決済額が30000以下の場合は、オーソリ金額は１円で行う。
////			if (ttlRyuGk == 0 || ttlRyuGk <= 30000) 
////			{
////				ttlRyuGk = 1;
////			}
////			DEBUG_LOG.info("トータル利用額の値：" + ttlRyuGk);
////			// IT1-2015-0000115 ADD END
////			// ANK-2586-00-00 MOD END
////			mapCc.put("ttlRyuGk", String.valueOf(ttlRyuGk));
////		}
//////OM-2014-0004037 MOD END
////v28.00.00 ANK-3032-00-00 Del End
//
////v28.00.00 ANK-3032-00-00 Add Start
//
//			//トータル利用額
//			int ttlRyuGk = 0;
//			
//			//トータル利用額が連携された場合にトータル利用額を上書きする。
//			if(!isNullOrBlankWithTrim(getParameterToString(reqestMap, "ttlRyuGk")))
//			{
//				ttlRyuGk = (int) new Double(getParameterToString(reqestMap, "ttlRyuGk")).doubleValue();
//			}
//			
//			if (ttlRyuGk <= 30000) 
//			{
//				DEBUG_LOG.info("決済金額 <= 30000");
//			}
//			else
//			{
//				DEBUG_LOG.info("決済金額 > 30000");
//			}
//			// 初回オーソリ時(初回支払方法登録（ＣＭＰ／ ＣＣＭＧから0円でオーソリ依頼があった場合）、または、決済額が30000円以下の場合は、オーソリ金額は1円で行う。
//			if (ttlRyuGk == 0 || ttlRyuGk <= 30000) 
//			{
//				ttlRyuGk = 1;
//			}
//			DEBUG_LOG.info("トータル利用額の値：" + ttlRyuGk);
//			mapCc.put("ttlRyuGk", String.valueOf(ttlRyuGk));
////v28.00.00 ANK-3032-00-00 Add End
//		
//		mapCc.put("clearPass", clearPass);
////v28.00.00 ANK-3032-00-00 Mod Start
////		mapCc.put("krztKdId", getParameterToString(reqestMap, "krztKdId"));
//		mapCc.put("krztKdId", getParameterToString(reqestMap, "payWayId"));
////v28.00.00 ANK-3032-00-00 Mod End
//	
////v28.00.00 ANK-3032-00-00 Mod Start
////		mapCc.put("chkKdMignn", chkKdMignn);
//		//AxM再構築対応にてリクエストパラメータに名義人更新フラグが連携されなくなったため固定で"0"(更新しない)を設定
//		mapCc.put("chkKdMignn", JCNStrConst.MIGNN_UPD_FLG_OFF);
////v28.00.00 ANK-3032-00-00 Mod End
//
//		inputMap.put(CC_NAME, mapCc);
//
//	}
// v58.00.00 ANK-3846-00-00 Del End

//v28.00.00 ANK-3032-00-00 Add Start

	/**
	 * 与信判定サービスへのパラメータを作成する
	 * @param inputMap 入力マップ
	 * @throws Exception
	 */
	private void createServiceMap2(Map<String, String> reqestMap, Map<String, Object> inputMap) throws Exception
	{
		//トータル利用額
		int ttlRyuGk = 0;
		//トータル利用額が連携されなかった場合は0を設定する。
		if(!isNullOrBlankWithTrim(getParameterToString(reqestMap, "ttlRyuGk")))
		{
			ttlRyuGk = (int) new Double(getParameterToString(reqestMap, "ttlRyuGk")).doubleValue();
		}
		
		HashMap<String, Object> mapCc = new HashMap<String, Object>();
		
		mapCc.put("sysid", getParameterToString(reqestMap, "sysid"));
		mapCc.put("payWay", getParameterToString(reqestMap, "payWay"));
		mapCc.put("payWayId", getParameterToString(reqestMap, "payWayId"));
		mapCc.put("kdKishaCd", getParameterToString(reqestMap, "kdKishaCd"));
		mapCc.put("kdBngu", getParameterToString(reqestMap, "kdBngu"));
		mapCc.put("yukuKgn", getParameterToString(reqestMap, "yukuKgn"));
		mapCc.put("kdMignn", getParameterToString(reqestMap, "kdMignn"));
		mapCc.put("ttlRyuGk", String.valueOf(ttlRyuGk));
		
		inputMap.put(CC_NAME_YOSHIN_JDG, mapCc);

	}
//v28.00.00 ANK-3032-00-00 Add End

	/**
	 * パラメータマップを解析し、キーに一致する値を返却する。
	 * @param requestParamMap
	 * @param keyName
	 * @return String
	 * @throws 処理中に発生した例外をスロー
	 */
	private static String getParameterToString(Map<String, String> requestParamMap, String keyName) throws Exception
	{
		String value = "";
		
		Iterator<?> keyIterator = requestParamMap.keySet().iterator();
		
		while(keyIterator.hasNext())
		{
			String key = (String)keyIterator.next();
			
			if(key.equals(keyName) ||  key.matches(keyName + "\\[[0-9]*\\]"))
			{
				value = requestParamMap.get(key);
			}
			
		}
		return new String(value.getBytes(), "UTF-8");
	}
	
	/**
	 * マップから指定されたキーの値を取得する。
	 * (使用例）<BR/>
	 *     getParamFromXml("LKA11020_RECEIVE", "PROCESS_DIV");<BR/>
	 * 
	 * @param map マップ
	 * @param allKeys キー名
	 * @return 値
	 */
	@SuppressWarnings("unchecked")
	public static Object getParamFromMap(Map map, String...allKeys)
	{

		Map nowMap = map;
		Object returnVal = null;
		for (int i = 0; i < allKeys.length; i++)
		{
			String key = allKeys[i];
			int idx = -1;
			if (key.matches("[a-zA-Z0-9_\\-]+\\[[0-9]+\\]"))
			{
				idx = new Integer(key.replaceFirst("^[a-zA-Z0-9_\\-]+\\[", "").replace("]", ""));
				key = key.replaceFirst("\\[[0-9]+\\]", "");
			}
			if (nowMap.containsKey(key))
			{
				Object val = nowMap.get(key);
				if ((val instanceof List) && (idx >= 0))
				{
					List nowList = (List)val;
					val = nowList.get(idx);
				}
				if (val instanceof Map)
				{
					nowMap = (Map)val;
				}
				if (i == allKeys.length - 1)
				{
					returnVal = val;
				}
			}
			else
			{
				return null;
			}
		}

		return returnVal;
	}
	
	/**
	 * メソッド名  ：null、空白文字（半角空白、全角空白）判定
	 * メソッド説明：
	 * 備考： 半角トリムを行う。
	 * @param strCheck 対象文字列
	 * @return true :対象文字列がnullもしくは空白文字（半角空白、全角空白）
	 *          false:上記以外
	 */
	private static boolean isNullOrBlankWithTrim(String strCheck)
	{
		// null文字置換、半角トリムを行い、
		// null、空文字、空白文字（半角空白、全角空白）判定結果を返す
		return isNullOrBlanks(replaceNullToBlank(strCheck).trim());
	}
	
	/**
	 * メソッド名  ：null文字→空文字変換
	 * メソッド説明：対象文字列がnull文字の場合、空文字に変換して返す
	 * 備考    
	 * @param base 対象文字列
	 * @return 変換後文字列
	 */
	private static String replaceNullToBlank(String base)
	{
    	
    	// 引数の対象文字列がnullの場合
        if(base == null)
        {
        	// 空文字を返す
            return STR_BLANK;
        }
        
        // 引数の対象文字列がnullでない場合、そのまま返す
        return base;
    }
	/**
	 * メソッド名  ：null、空文字、空白文字（半角空白、全角空白）判定
	 * メソッド説明：：null、空文字、
	 *                     空白文字（半角空白、全角空白）の判定を行う
	 * 備考：
	 * @param strCheck　対象文字列
	 * @return true :対象文字列がnullもしくは空白文字（半角空白、全角空白）のみ
	 *          false:上記以外
	 */
    private static boolean isNullOrBlanks(String strCheck)
    {
		// 対象文字列が対象文字列がnullもしくは空文字の場合
    	if(isNullOrBlank(strCheck))
    	{
    		// trueを返す
        	return true;
        }
    	
    	// 全半角空白を空文字に置換
        String strRepTemp = strCheck.replaceAll(" ", "");
        String strRep = strRepTemp.replaceAll("　", "");
        
        // 空文字以外が存在する場合
        if(strRep.length() > 0)
        {
        	// falseを返す
        	return false;
        }
        
        // 空文字のみの場合、trueを返す
        return true;
	}
    /**
     * メソッド名  ：null、空文字判定
     * メソッド説明：nullもしくは空文字の判定を行う
     * 備考：
     * @param strCheck 対象文字列
     * @return true :対象文字列がnullもしくは空文字
     *          false:上記以外
     */
	private static boolean isNullOrBlank(String strCheck)
	{
		
		// 対象文字列が対象文字列がnullもしくは空文字の場合、trueを返す
    	return strCheck == null || STR_BLANK.equals(strCheck);
	}

	//v28.00.01 ANK-3032-00-00 Add Start

	/**
	 * 電文データの内容を、業務ログに出力する。
	 * @param writeData 出力データ
	 * @param msg 接頭辞メッセージ電文
	 */
	private static void writeDenbunLog(Map<String, String> writeData , String msg) {
		if(writeData == null)
		{
			return;
		}
		
		Iterator<?> keyList = writeData.keySet().iterator();
		StringBuffer buslog = new StringBuffer(msg);
		
		int i = 0;
		// セットする項目とスキーマとのチェック・格納処理
		while (keyList.hasNext()) 
		{
			String key = (String)keyList.next();
			String dataobject = writeData.get(key);
			if(i != 0) {
				buslog.append(",");
			}
			
			if(dataobject != null) 
			{
				if("kdBngu".equals(key)) 
				{
					dataobject = createMaskCardNo(dataobject);
				}
			}
			buslog.append(key + "=" + dataobject);
			
			i++;
		}
		
		JSYwebLog.println(JSYLogBase.EXECUTION, CNA00401SFLogic.class ,
				buslog.toString(), "",  new String[]{"", ""}, "");
	}
	

	/**
	     * メソッド名  ：マスクカード番号作成
	     * メソッド説明：ログ出力用にマスク化を行う
	     * 備考：
	     * @param kdBngu カード番号
	     * @return マスク化したカード番号
	     */
	private static String createMaskCardNo(String kdBngu)
	{
	
		//入力パラメータがNullまたは2桁以下の場合はそのまま返却する。
		if (isNullOrBlank(kdBngu) || kdBngu.length() <= 2)
		{
			return kdBngu;
		}
		
		//入力パラメータが2桁以上の場合は3桁目以降をマスク文字に置き換える。
		StringBuffer str = new StringBuffer();
		
		str.append(kdBngu.substring(0, 2));
		
		for (int i = 3; kdBngu.length() >= i; i++)
		{
			str.append("*");
		}
		
		return str.toString();
	}
//v28.00.01 ANK-3032-00-00 Add End
}
