/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKMvnoSeikyKeiIchiiSearchCC
*	ソースファイル名：JKKMvnoSeikyKeiIchiiSearchCC.java
*	作成者			：FJ
*	日付			：2013年12月25日
*＜機能概要＞
*	MVNO請求契約一意照会処理の共通コンポーネント
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2013/12/25	FJ			新規作成
*	v8.00.00	2014/03/13	FJ）宇野	IT1-2014-0000086
*	v16.00.00	2015/09/10  FJ)遠藤     【ANK-2480-00-00】新電力 STEP1-2対応
*	v27.00.00	2016/08/22	FJ) 黒田	【ANK-2890-00-00】【eo電気】複数料金プラン対応
*	v45.00.00	2019/09/04	FJ) 御崎	【ANK-3551-00-00】クレカ有効性NG時の支払方法変更対応
*	v51.00.00	2020/10/29	FJ) 謝		【ANK-3927-00-00】オペレータ支援向けAPI機能変更(2020年12月中旬リリース)
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
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.JACStrConst;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0491B509CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0491B509CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECH0011B014CBSMsg;


/**
 * MVNO請求契約一意照会処理を行います。<p>
 * <BR>
 * @author 富士通
 */
public class JKKMvnoSeikyKeiIchiiSearchCC extends AbstractCommonComponent
{
	/** MVNO請求契約一意照会 */
	private static final String TEMPLATE_ID_EKK0491B509 = "EKK0491B509";
// ANK-2890-00-00 ADD START
	/** 未納債権債権ステータス一覧照会 */
	private static final String TEMPLATE_ID_ECH0011B014 = "ECH0011B014";
	
	/** 未収金額有無 (有) */
	private static final String MISH_AMNT_UM_ARI = "1";
	/** 未収金額有無 (無) */
	private static final String MISH_AMNT_UM_NASHI = "0";
// ANK-2890-00-00 ADD END

	
	/**
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return IRequestParameterReadWrite
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite getSeikyKeiIchii(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		String dataMapKey = fixedText;
// ANK-2480-00-00 MOD START
//		HashMap<String, Object> ccMsg = (HashMap<String, Object>)param.getData(dataMapKey);

		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		Object paramDataMapKey = param.getData(dataMapKey);
		// 引数がArrayList<HashMap>型であるか判定する。
		if (paramDataMapKey instanceof ArrayList)
		{
			// ArrayList<HashMap>型に変換後、ccMsglistに格納する。
			ArrayList<HashMap<String, Object>> ccMsglist = (ArrayList<HashMap<String, Object>>)paramDataMapKey;
			// ArrayListの件数分ループして処理を行う。
			for (int i = 0; ccMsglist.size() > i; i++)
			{
				// HashMapにlistのi件目を格納する。
				HashMap<String, Object> ccMsg = ccMsglist.get(i);
				//請求契約一意照会(CIS)処理を実行する。
				searchSeikyKeiIchii(ccMsg, handle, scCall, param, dataMapKey);
			}
		} 
		else
		{
			// HashMap型に変換後、ccMsgに格納する。
			HashMap<String, Object> ccMsg = (HashMap<String, Object>)paramDataMapKey;
			// 請求契約一意照会(CIS)処理を実行する。
			searchSeikyKeiIchii(ccMsg, handle, scCall, param, dataMapKey);
		}

		return param;
	}

	/**
	 * 請求契約一意照会(CIS)処理実行
	 * 
	 * @param ccMsg        識別コードマップ
	 * @param handle       セッションハンドル
	 * @param scCall       SC呼出
	 * @param param        パラメーター
	 * @param dataMapKey   データマップキー
	 * @throws Exception   例外処理
	 */
	private void searchSeikyKeiIchii(HashMap<String, Object> ccMsg,
								SessionHandle handle,
								ServiceComponentRequestInvoker scCall,
								IRequestParameterReadWrite param,
								String dataMapKey) throws Exception
	{
		/**
		 * 請求契約一覧照会（MVNO用）処理実行
		 */
		// EKK0491B509（請求契約一覧照会（MVNO用））用パラメータ作成
		// パラメータ：サービスIF_ID、機能コード、サービス契約番号
		Object[][] ekk0491B509IN = {
			{EKK0491B509CBSMsg.TEMPLATEID,     TEMPLATE_ID_EKK0491B509},
// ANK-2890-00-00 MOD START
//			{EKK0491B509CBSMsg.FUNC_CODE,      (String)ccMsg.get("func_code")},
			{EKK0491B509CBSMsg.FUNC_CODE,      JPCModelConstant.FUNC_CD_1},
// ANK-2890-00-00 MOD END
			{EKK0491B509CBSMsg.KEY_SVC_KEI_NO, (String)ccMsg.get("svc_kei_no")}
		};
		
		// EKK0491B509（請求契約一覧照会（MVNO用））実行
		CAANMsg[] ekk0491B509list 
						= callSC(handle, scCall, param, dataMapKey, ekk0491B509IN, ccMsg).getCAANMsgList(EKK0491B509CBSMsg.EKK0491B509CBSMSG1LIST);
		
		// EKK0491B509（請求契約一覧照会（MVNO用））結果をもとにマッピング
//		setInfo(ekk0491B509list, ccMsg);
		
		boolean flg = setInfo(ekk0491B509list, ccMsg);
		
		// クレジットカード名義(ローマ字)の取得結果がエラーの場合
		if(flg == false)
		{
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, "9000");
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, "システムエラー");
		}
		
// ANK-2890-00-00 ADD START
		// EKK0491B509の取得件数が1件以上かつ機能コードが2の場合
		if (ekk0491B509list != null
			&& ekk0491B509list.length > 0
			&& JPCModelConstant.FUNC_CD_2.equals((String)ccMsg.get("func_code")))
		{
			// 督促ステータスがnullまたは督促なしの場合
			if(ccMsg.get("tokusoku_stat") != null
				&& !(JACStrConst.TOKUSOKU_STAT_NASHI.equals((String)ccMsg.get("tokusoku_stat"))))
			{
				// 未納債権債権ステータス一覧照会処理を実行する。
				searchMinoSaikenStatIchiran(ccMsg, handle, scCall, param, dataMapKey);
			}
			else
			{
				// 未収金額有無に無を設定する
				ccMsg.put("mish_amnt_um", MISH_AMNT_UM_NASHI);
			}
		}
//ANK-2890-00-00 ADD END
		
		// リクエストパラメータに取得情報を設定
//		param.setData("KKSV077201SC",ccMsg);
		
//		return param;
	}
// ANK-2480-00-00 MOD END
	
// ANK-2890-00-00 ADD START
	
	/**
	 * 未納債権債権ステータス一覧照会処理実行
	 * 
	 * @param ccMsg        識別コードマップ
	 * @param handle       セッションハンドル
	 * @param scCall       SC呼出
	 * @param param        パラメーター
	 * @param dataMapKey   データマップキー
	 * @throws Exception   例外処理
	 */
	private void searchMinoSaikenStatIchiran(HashMap<String, Object> ccMsg,
								SessionHandle handle,
								ServiceComponentRequestInvoker scCall,
								IRequestParameterReadWrite param,
								String dataMapKey) throws Exception
	{
		/**
		 * 未納債権債権ステータス一覧照会処理実行
		 */
		// ECH0011B014（未納債権債権ステータス一覧照会）用パラメータ作成
		// パラメータ：サービスIF_ID、機能コード、請求契約番号
		Object[][] ech0011B014IN = 
		{
			{ECH0011B014CBSMsg.TEMPLATEID,       TEMPLATE_ID_ECH0011B014},
			{ECH0011B014CBSMsg.FUNC_CODE,        JPCModelConstant.FUNC_CD_1},
			{ECH0011B014CBSMsg.KEY_SEIKY_KEI_NO, (String)ccMsg.get("seiky_kei_no")}
		};
		
		// ECH0011B014（未納債権債権ステータス一覧照会）実行
		CAANMsg[] ech0011B014list 
						= callSC(handle, scCall, param, dataMapKey, ech0011B014IN, ccMsg).getCAANMsgList(ECH0011B014CBSMsg.ECH0011B014CBSMSG1LIST);
		
		// ECH0011B014（未納債権債権ステータス一覧照会）結果をもとにマッピング
		// 未収金額有無
		if (ech0011B014list != null
			&& ech0011B014list.length > 0)
		{
			// 未収金額有無に有を設定する
			ccMsg.put("mish_amnt_um", MISH_AMNT_UM_ARI);
		}
		else
		{
			// 未収金額有無に無を設定する
			ccMsg.put("mish_amnt_um", MISH_AMNT_UM_NASHI);
		}
	}
// ANK-2890-00-00 ADD END
	
	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param mappingData
	 * @param ccMsg         識別コードマップ
	 * @return CAANMsg
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle, 
							ServiceComponentRequestInvoker scCall, 
							IRequestParameterReadWrite param, 
							String dataMapKey,
// ANK-2480-00-00 MOD START
//							Object[][] mappingData) throws Exception
	 						Object[][] mappingData,
	 						HashMap<String, Object> ccMsg) throws Exception
	{
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);
		
		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);
		Integer status = msg.getInt(JCMConstants.STATUS_INT_KEY);
		
//		editErrorInfoCom(param, templates, (Integer)return_code, dataMapKey, mappingData);
		editErrorInfoCom(param, templates, (Integer)return_code, mappingData, ccMsg);
// ANK-2480-00-00 MOD END
		//エラー情報のマップを取得
		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 mappingData
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param,
												Object[][] mappingData) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());
		
		// 【取得元：ユーザエリア(コントロールマップ)】
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		
		CAANMsg template = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg", (String)mappingData[0][1]));
		
		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, param.getControlMapData(SCControlMapKeys.OPE_DATE));
		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, param.getControlMapData(SCControlMapKeys.OPE_TIME));
		
		for (int i = 0; i < mappingData.length; i++)
		{
			if ("".equals(mappingData[i][1]))
			{
				template.setNull((String)mappingData[i][0]);
			}
			else
			{
				template.set((String)mappingData[i][0], mappingData[i][1]);
			}
		}
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		return paramMap;
	}

	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param mappingData
	 * @param ccMsg            識別コードマップ
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param,
														CAANMsg[] templates, 
														int returnCode,
// ANK-2480-00-00 MOD START
//														String dataMapKey,
//														Object[][] mappingData) throws RequestParameterException
														Object[][] mappingData,
														HashMap<String, Object> ccMsg) throws RequestParameterException
// ANK-2480-00-00 MOD END
	{
		// 本来はサービスインターフェイス分の処理が必要
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if (returnCode != 0)
		{
			templateStatus = 9000;
		}
		
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}
		
		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}
		
		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
// ANK-2480-00-00 MOD START
//		HashMap<String, String> inMap = null;
		HashMap<String, Object> inMap = null;
		// ユーザデータ情報
//		inMap = (HashMap<String, String>)param.getData(dataMapKey);
		inMap = ccMsg;
// ANK-2480-00-00 MOD END
		for (int i = 0; i < mappingData.length; i++)
		{
			if (!template.isNull(mappingData[i][0] + "_err"))
			{
				if (!inMap.containsKey(mappingData[i][0] + "_err"))
				{
					// ユーザ情報は「key_」がない為、「key_」を削除する。
					if (((String)mappingData[i][0]).startsWith("key_"))
					{
						String key = (String)mappingData[i][0];
						inMap.put(key.substring(4) + "_err", template.getString(mappingData[i][0] + "_err"));
					}
					else
					{
						inMap.put(mappingData[i][0] + "_err", template.getString(mappingData[i][0] + "_err"));
					}
				}
			}
		}
		return param;
	}

	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param dataMapKey
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfoCom(IRequestParameterReadWrite param,
														CAANMsg[] templates, 
														int returnCode,
														String dataMapKey) throws RequestParameterException
	{
		// 本来はサービスインターフェイス分の処理が必要
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if (returnCode != 0)
		{
			templateStatus = 9000;
		}
		
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}
		
		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		if (obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}
		
		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		HashMap<String, String> inMap = null;
		// ユーザデータ情報
		inMap = (HashMap<String, String>)param.getData(dataMapKey);
		
		Iterator<String> it = inMap.keySet().iterator();
		while (it.hasNext())
		{
			String key = it.next();
			if (key.endsWith("_err"))
			{
				if (!template.isNull(key))
				{
					if (!inMap.containsKey(key))
					{
						inMap.put(key, template.getString(key));
					}
				}
			}
		}
		return param;
	}

// ANK-2480-00-00 DEL START
	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param mappingData
	 * @param inListMsgName
	 * @param inList
	 * @return
	 * @throws Exception
	 */
//	@SuppressWarnings("unchecked")
//	private CAANMsg callSCArray(SessionHandle handle, 
//									ServiceComponentRequestInvoker scCall, 
//									IRequestParameterReadWrite param, 
//									String dataMapKey,
//									Object[][] mappingData,
//									String inListMsgName, 
//									ArrayList<HashMap<String, Object>> inList
//									) throws Exception
//	{
//		HashMap<String, Object> paramMap = editInArrayMsg(param, mappingData, inListMsgName, inList);
//		
//		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);
//		
//		editErrorInfoComArray(param, templates, (Integer)return_code, dataMapKey, mappingData, inListMsgName, inList);
//		
//		//エラー情報のマップを取得
//		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 mappingData
	 * @param inListMsgName
	 * @param inList
	 * @return
	 * @throws RequestParameterException
	 */
//	@SuppressWarnings("unchecked")
//	private HashMap<String, Object> editInArrayMsg(IRequestParameterReadWrite param,
//													Object[][] mappingData, 
//													String inListMsgName, 
//													ArrayList<HashMap<String, Object>> inList) throws RequestParameterException
//	{
//		HashMap<String, Object> paramMap = new HashMap<String, Object>();
//		
//		// 【取得元：電文ヘッダ(ヘッダ)】
//		// 電文ID
//		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
//		// ユースケースID
//		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
//		// オペレーションID
//		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
//		// サービス呼び出し区分
//		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());
//		
//		// 【取得元：ユーザエリア(コントロールマップ)】
//		// 依頼先ホスト名
//		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
//		// 依頼元IPアドレス
//		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
//		// 依頼元画面ID
//		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
//		// オペレータID
//		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
//		
//		String svcIf = (String)mappingData[0][1];
//		
//		CAANMsg template = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg", svcIf));
//		// オペレータID
//		template.set(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
//		// 運用日付
//		template.set(JCMConstants.OPERATE_DATE_KEY, param.getControlMapData(SCControlMapKeys.OPE_DATE));
//		// 運用日時
//		template.set(JCMConstants.OPERATE_DATETIME_KEY, param.getControlMapData(SCControlMapKeys.OPE_TIME));
//		
//		for (int i = 0; i < mappingData.length; i++)
//		{
//			if ("".equals(mappingData[i][1]))
//			{
//				template.setNull((String)mappingData[i][0]);
//			}
//			else
//			{
//				template.set((String)mappingData[i][0], mappingData[i][1]);
//			}
//		}
//		
//		CAANMsg[] templateArray = template.getCAANMsgList(inListMsgName);
//		
//		if (templateArray == null)
//		{
//			templateArray = new CAANMsg[inList.size()];
//		}
//		
//		for (int i = 0; i < inList.size(); i++)
//		{
//			HashMap childMap = (HashMap)inList.get(i);
//			CAANMsg childTemplate = templateArray[i];
//			if (childTemplate == null)
//			{
//				childTemplate = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg1List", svcIf));
//			}
//			
//			Iterator it = childMap.keySet().iterator();
//			while (it.hasNext())
//			{
//				String key = (String)it.next();
//				
//				if ("".equals(childMap.get(key)))
//				{
//					childTemplate.setNull(key);
//				}
//				else
//				{
//					childTemplate.set(key, (String)childMap.get(key));
//				}
//			}
//			templateArray[i] = childTemplate;
//		}
//		template.set(inListMsgName, templateArray);
//		CAANMsg[] templates = new CAANMsg[1];
//		templates[0] = template;
//		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
//		return paramMap;
//	}
	
	/**
	 * 
	 * @param param
	 * @param templates
	 * @param returnCode
	 * @param dataMapKey
	 * @param mappingData
	 * @param inListMsgName
	 * @param inList
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
//	@SuppressWarnings("unchecked")
//	private IRequestParameterReadWrite editErrorInfoComArray(IRequestParameterReadWrite param,
//														CAANMsg[] templates, 
//														int returnCode,
//														String dataMapKey,
//														Object[][] mappingData,
//														String inListMsgName, 
//														ArrayList<HashMap<String, Object>> inList) throws RequestParameterException
//	{
//		// 本来はサービスインターフェイス分の処理が必要
//		CAANMsg template = templates[0];
//		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
//		
//		if (returnCode != 0)
//		{
//			templateStatus = 9000;
//		}
//		
//		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
//		{
//			templateStatus = 0;
//		}
//		
//		int bpStatus = 0;
//		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
//		if (obj == null)
//		{
//			bpStatus = -1;
//		}
//		else
//		{
//			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
//		}
//		
//		if (templateStatus > bpStatus)
//		{
//			// BPにサービスコンポーネントのステータスを設定する。
//			String formatStatus = String.format("%1$04d", templateStatus);
//			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
//			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
//			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
//		}
//		
//		HashMap<String, String> inMap = (HashMap<String, String>)param.getData(dataMapKey);
//		CAANMsg[] templateArray = template.getCAANMsgList(inListMsgName);
//		
//		for (int i = 0; i < inList.size(); i++)
//		{
//			HashMap childMap = (HashMap)inList.get(i);
//			CAANMsg childTemplate = templateArray[i];
//			
//			Iterator it = childMap.keySet().iterator();
//			while (it.hasNext())
//			{
//				String key = (String)it.next();
//				if (!childTemplate.isNull(key + "_err"))
//				{
//					if (!inMap.containsKey(key + "_err"))
//					{
//						inMap.put(key + "_err", childTemplate.getString(key + "_err"));
//					}
//				}
//			}
//		}
//		if (!template.isNull(inListMsgName + "_err"))
//		{
//			if (!inMap.containsKey(inListMsgName + "_err"))
//			{
//				inMap.put(inListMsgName + "_err", template.getString(inListMsgName + "_err"));
//			}
//		}
//		return param;
//	}
// ANK-2480-00-00 DEL END

	/**
	 * チェック処理用サービスインターフェイス作成。<br>
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @return サービスコンポーネント実行用CAANMsg
	 * @exception RequestParameterExceptionがスローされます。
	 */
	@SuppressWarnings("unchecked")
	public  HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		List<CAANMsg> templates = new ArrayList<CAANMsg>();
		
		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文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));
		
		// チェック用サービスインターフェイス
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, Arrays.asList(templates));
		return paramMap;
	}

	/**
	 * IRequestParameterReadWriteにエラー情報をマッピングする。<br>
	 * <br>
	 * @param param (I) 業務データ取得・書込用I/F
	 * @param templates (I) CAANMsgクラス配列
	 * @param returnCode (I) リターンコード
	 * @param fixedText (I) ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @exception RequestParameterExceptionがスローされます。
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode, String fixedText)
	throws RequestParameterException
	{
		for (int i = 0; i < templates.length; i++)
		{
			editErrorInfoCom(param, templates, returnCode, fixedText);
		}
		return param;
	}
	

	/**
	 * サービスＩＦ処理結果をもとにマッピングする。
	 * 
	 * @param msgList
	 * @param ccMsg
	 */
	private boolean setInfo(CAANMsg[] msgList, HashMap<String, Object> ccMsg)
	{
		// データが存在する場合
		if (msgList != null && msgList.length > 0)
		{
			//クレジットカード名義(ローマ字)のチェックを行う
			String crecard_nm_romaji = msgList[0].getString(EKK0491B509CBSMsg1List.CRECARD_NM_ROMAJI);
			
			// クレジットカード名義(ローマ字)に「'（アポストロフィー）」、「半角空白」のみの場合システムエラーにする
			if (crecard_nm_romaji != null)
			{
				// 半角空白のみの場合エラー
				if ("".equals(crecard_nm_romaji.trim()))
				{
					return false;
				}
				else
				{
					// 「'（アポストロフィー）」のみの場合エラー
					if ("'".equals(crecard_nm_romaji))
					{
						return false;
					}
				}
			}
			
			
			// 請求契約番号
			ccMsg.put("seiky_kei_no", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.SEIKY_KEI_NO)));
			// 請求方法コード
			ccMsg.put("seiky_way_cd", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.SEIKY_WAY_CD)));
			// 督促ステータス
			ccMsg.put("tokusoku_stat", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.TOKUSOKU_STAT)));
			// 請求方法番号(クレジットカード)
			ccMsg.put("seiky_way_no_crecard", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.SEIKY_WAY_NO_CRECARD)));
			// クレジットカード事業コード
			ccMsg.put("crecard_jigyo_cd", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.CRECARD_JIGYO_CD)));
			// クレジットカード会社コード
			ccMsg.put("crecard_comp_cd", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.CRECARD_COMP_CD)));
			// クレジットカード会社名
			ccMsg.put("crecard_comp_nm", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.CRECARD_COMP_NM)));
			// クレジットカード番号
			ccMsg.put("crecard_no", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.CRECARD_NO)));
			// クレジットカード有効期限
			ccMsg.put("crecard_yk_kigen", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.CRECARD_YK_KIGEN)));
			// クレジットカード名義(ローマ字)
			ccMsg.put("crecard_nm_romaji", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.CRECARD_NM_ROMAJI)));
			// クレジットカード名義カナ名
			ccMsg.put("crecard_nm_kana", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.CRECARD_NM_KANA)));
			// 請求方法番号(口座)
			ccMsg.put("seiky_way_no_koza", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.SEIKY_WAY_NO_KOZA)));
			// 金融機関コード
			ccMsg.put("bank_cd", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.BANK_CD)));
			// 金融機関名
			ccMsg.put("bank_nm", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.BANK_NM)));
			// 金融機関支店コード
			ccMsg.put("bank_shiten_cd", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.BANK_SHITEN_CD)));
			// 金融機関支店名
			ccMsg.put("bank_shiten_nm", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.BANK_SHITEN_NM)));
			// 預金種目コード
			ccMsg.put("yokin_shumoku_cd", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.YOKIN_SHUMOKU_CD)));
			// 預金種目名
			ccMsg.put("yokin_shumoku_nm", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.YOKIN_SHUMOKU_CD_NM)));
			// 口座番号
			ccMsg.put("koza_no", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.KOZA_NO)));
			// 口座名義人(漢字)
			ccMsg.put("koza_meigin_kanji", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.KOZA_MEIGIN_KANJI)));
			// 口座名義人カナ名
			ccMsg.put("koza_meigin_kana", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.KOZA_MEIGIN_KANA)));
			// 通帳記号
			ccMsg.put("tsucho_symbol", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.TSUCHO_SYMBOL)));
			// 通帳番号
			ccMsg.put("tsucho_no", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.TSUCHO_NO)));
// ANK-3927-00-00 ADD START
			// 請求書発行要否
			ccMsg.put("seikyus_hakko_yh", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.SEIKYUS_HAKKO_YH)));
			// 請求書発行要否名称
			ccMsg.put("seikyus_hakko_yh_nm", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.SEIKYUS_HAKKO_YH_NM)));
			// 送付先郵便番号
			ccMsg.put("sohus_pcd", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.SOHUS_PCD)));
			// 送付先住所コード
			ccMsg.put("sohus_ad_cd", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.SOHUS_AD_CD)));
			// 都道府県名
			ccMsg.put("sohus_state_nm", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.SOHUS_STATE_NM)));
			// 送付先市区町村名
			ccMsg.put("sohus_city_nm", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.SOHUS_CITY_NM)));
			// 送付先大字通称名
			ccMsg.put("sohus_oaztsu_nm", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.SOHUS_OAZTSU_NM)));
			// 送付先字丁目名
			ccMsg.put("sohus_azcho_nm", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.SOHUS_AZCHO_NM)));
			// 送付先番地号
			ccMsg.put("sohus_bnchigo", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.SOHUS_BNCHIGO)));
			// 送付先住所補記・建物名
			ccMsg.put("sohus_adrttm", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.SOHUS_ADRTTM)));
			// 送付先住所補記・部屋番号
			ccMsg.put("sohus_adrrm", getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.SOHUS_ADRRM)));
// ANK-3927-00-00 ADD END
			
		// ANK-3551-00-00 ADD START
			
			// 預金口座振替、郵便自動振込、クレジット、各支払方法毎のNG判定を行い、以下のNG判定に該当した場合、その支払方法は不可とし、請求方法を「1:窓口支払い」とする。各項目にはNULLを設定。

			// 指定された支払方法がNGであるかどうか(true⇒NGである）
			boolean flgNG = false;
			
			// [預金口座振替]口座.支払い審査結果コードが"21"（口座振替申請ＮＧ）の時、NGとする。
			if(JKKStrConst.SEIKY_WAY_CD_YOKIN.equals(getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.SEIKY_WAY_CD))) &&
					JKKStrConst.PAY_SKEKKA_CD_KHRI_SHINSEI_NG.equals(getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.PAY_SKEKKA_CD)))){
				flgNG = true;
			}
			
			// [郵便自動振込]口座.支払い審査結果コードが"31"（郵便自動振込申請ＮＧ）の時、NGとする。
			if(JKKStrConst.SEIKY_WAY_CD_YUCHO.equals(getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.SEIKY_WAY_CD))) &&
					JKKStrConst.PAY_SKEKKA_CD_YJHRI_SHINSEI_NG.equals(getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.PAY_SKEKKA_CD)))){
				flgNG = true;
			}
			
			// [クレジット]
			if(JKKStrConst.SEIKY_WAY_CD_CREDIT.equals(getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.SEIKY_WAY_CD)))) {
				
				// A.クレジットカード．クレジットカードステータスが"100"（審査済）
				//    且つ クレジットカード．無効年月が設定されている　
				//    且つ クレジットカード．無効年月が未来月でない(既に到来している）時NGとする。　（運用日付の年月と比較し、未来判定を行う。）
				if(JKKStrConst.CRECARD_STAT_JDG_ZUMI.equals(getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.CRECARD_STAT)))) {
					
					// クレジットカード無効年月
					String ym1 = getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.CRECA_MK_YM));
					
					// 運用日付
					String opeDate = JCCBPCommon.getOpeDate(null);
					
					// 無効年月が到来しているかどうか判定する
					if(ym1.length() > 0 && compYm(ym1, opeDate)){
						flgNG = true;
					}
				}
				// B.クレジットカード．クレジットカードステータスが"190"（無効）　の時、NGとする。　
				if(JKKStrConst.CRECARD_STAT_MK.equals(getNullToStr(msgList[0].getString(EKK0491B509CBSMsg1List.CRECARD_STAT)))){
					flgNG = true;
				}
				
			}
			
			// 指定されている支払方法がNGである場合
			if(flgNG){
				
				// 請求方法コード
				ccMsg.put("seiky_way_cd", JKKStrConst.SEIKY_WAY_CD_MADOGUCHI);
				// 請求方法番号(クレジットカード)
				ccMsg.put("seiky_way_no_crecard", "");
				// クレジットカード事業コード
				ccMsg.put("crecard_jigyo_cd", "");
				// クレジットカード会社コード
				ccMsg.put("crecard_comp_cd", "");
				// クレジットカード会社名
				ccMsg.put("crecard_comp_nm", "");
				// クレジットカード番号
				ccMsg.put("crecard_no", "");
				// クレジットカード有効期限
				ccMsg.put("crecard_yk_kigen", "");
				// クレジットカード名義(ローマ字)
				ccMsg.put("crecard_nm_romaji", "");
				// クレジットカード名義カナ名
				ccMsg.put("crecard_nm_kana", "");
				// 請求方法番号(口座)
				ccMsg.put("seiky_way_no_koza", "");
				// 金融機関コード
				ccMsg.put("bank_cd", "");
				// 金融機関名
				ccMsg.put("bank_nm", "");
				// 金融機関支店コード
				ccMsg.put("bank_shiten_cd", "");
				// 金融機関支店名
				ccMsg.put("bank_shiten_nm", "");
				// 預金種目コード
				ccMsg.put("yokin_shumoku_cd", "");
				// 預金種目名
				ccMsg.put("yokin_shumoku_nm", "");
				// 口座番号
				ccMsg.put("koza_no", "");
				// 口座名義人(漢字)
				ccMsg.put("koza_meigin_kanji", "");
				// 口座名義人カナ名
				ccMsg.put("koza_meigin_kana", "");
				// 通帳記号
				ccMsg.put("tsucho_symbol", "");
				// 通帳番号
				ccMsg.put("tsucho_no", "");
				
			}
			
		// ANK-3551-00-00 ADD END
			
		}
		return true;
	}

	/**
	 * パラメタがNullの場合空白を返却します。
	 * @param str 文字列
	 * @return str
	 */
	private String getNullToStr(String str)
	{
		if (str == null || "".equals(str.trim()))
		{
			return "";
		}
		return str;
	}
	
	// ANK-3551-00-00 ADD START
	/**
	 * YYYYMM形式の文字列を年月比較します。
	 * @param ym1 クレジットカード無効年月:YYYYMM(6桁)
	 * @param ym2 運用日付:YYYYMMDD(8桁)
	 * @return ym1 <= ym2:無効月が到来している場合trueを返却する
	 */
	private boolean compYm(String ym1, String ym2) {
		
		if (("".equals(ym1) || ym1.isEmpty()) || ("".equals(ym2) || ym2.isEmpty() || ym2.length() != 8)) {
			return false;
		}
		String opeYm = ym2.substring(0, 6);
		
		int res = ym1.compareTo(opeYm);
		
		if(res <= 0) {
			return true;
		}
		
		return false;
	}
	// ANK-3551-00-00 ADD END
}
