/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom, 2011
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKUseStpAddShijishoWrapperCC
*   ソースファイル名：JKKUseStpAddShijishoWrapperCC.java
*   作成者          ：富士通
*   日付            ：2013年04月04日
*＜機能概要＞
*   利用停止解除後指示書登録ラッピングを行う。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v10.00.00   2014/09/25   FJ）鈴木    新規作成
*   v10.01.00   2014/11/13   FJ）中山    【OM-2014-0003528】ID通知書発行識別コードの判定追加
*   v12.00.00   2015/01/13   FJ）川島    【OM-2015-0000008】契約者タイプコードの判定追加
*   v14.00.00   2015/05/22   FJ）寺村    【OM-2015-0000812】督促状態の変更に伴うAxM指示書連携不足
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;
import com.fujitsu.futurity.bp.x21.sc.exception.SCException;
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 com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.constant.JACStrConst;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECN0131B008CBSMsg;
import eo.ejb.cbs.cbsmsg.ECN0131B008CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B519CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B519CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0491A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0791A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0791A010CBSMsg1List;

/**
 * 
 * 利用停止解除後指示書登録CCラッパークラス
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JKKUseStpAddShijishoWrapperCC extends AbstractCommonComponent
{

	/** 運用日付 */
	private String oPE_DATE = "";
	
	/** 対象者SYSID */
	private static final String USE_STP_SYSID = "use_stp_sysid";
	/** 請求契約番号 */
	private static final String SEIKY_KEI_NO = "seiky_kei_no";

//v14.00.00 2015/05/22 ADD START   
	/** 契約ステータス：100(サービス提供中) **/
	public static final String SVC_KEI_STAT_100 = "100"; 
	/** 契約ステータス：220(停止中) **/
	public static final String SVC_KEI_STAT_220 = "220";
	/** 支払方法 ISP決済 */
	private static final String PAYWAY_INPUT_SHIEN_ISP = "2";
	/** 指示書CCマップのキー */
	private static final String SJISHO_MAP = "JKKAddSjishoCC";
	
	/**
	 * 利用停止解除後指示書(8:支払方法の情報)登録メソッド
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Throwable 例外時にスローします
	 */
	public IRequestParameterReadWrite useStpKaijoAddShijisho08(
			SessionHandle handle, 
			IRequestParameterReadWrite param, 
			String fixedText) throws Throwable
	{
		
		HashMap<String, Object> paramMap = null;

		//作業日の取得
		oPE_DATE = JCCBPCommon.getOpeDate(null);
		
		//リクエストパラメータ情報取得
		paramMap = (HashMap<String, Object>)param.getData(fixedText);
		//リクエストパラメータ情報削除（JKKAddSjishoCC 実行結果）
		param.removeData(SJISHO_MAP);
		
		//対象者SYSID取得
		String sysid = (String) paramMap.get(USE_STP_SYSID);
		//請求契約番号取得
		String seikyKeiNo = (String) paramMap.get(SEIKY_KEI_NO);

		printlnEjbLog("＃＃＃＃JKKUseStpAddShijishoWrapperCC.useStpKaijoAddShijisho08() sysid=" + sysid);
		printlnEjbLog("＃＃＃＃JKKUseStpAddShijishoWrapperCC.useStpKaijoAddShijisho08() seikyKeiNo=" + seikyKeiNo);

		// SYSIDが未設定の場合、請求契約情報からSYSIDを取得する
		if (JKKStringUtil.isNullBlank(sysid)) {
			sysid = getSysId(handle, param, fixedText, seikyKeiNo);
			
			if (JKKStringUtil.isNullBlank(sysid)) {
				//処理終了
				return param;
			}
		}
		
		// お客様一意照会
		HashMap<String, Object> ck0011map = getECK0011A010(handle, param, fixedText, sysid);
		
		// お客様・会員ISP決済コードを取得して、0（通常）の場合、指示書を登録する
		String mmbIspKssiCd = getMmbIspKssiCd(ck0011map);
		
		if (! "0".equals(mmbIspKssiCd)) {
			// 0（通常）以外のとき、利用停止解除の指示書は出さない
			return param;
		}
		
		// お客様・契約者タイプコードを取得して、5（マンションオーナー）以外の場合、指示書を登録する。
		String keishaTypeCd = getKeishaTypeCd(ck0011map);
		
		if(JACStrConst.KEISHA_TYPE_CD_MT_OWN.equals(keishaTypeCd))
		{
			// 5（マンションオーナー）のとき、利用停止解除の指示書は出さない
			return param;
		}
		
		// 支払い方法入力支援コードがISP決済の場合に指示書を登録する
		if (!checkPaymentInSuppurt(handle, param, fixedText, sysid)) 
		{
			return param;
		}
		
		// ID通知書発行識別コードが"発行あり"の場合に指示書を登録する
		if (!checkIdTchishoHakSkbtCd(handle, param, fixedText, sysid))
		{
			return param;
		}
		
		// リクエストパラメータに設定
		paramMap.put(USE_STP_SYSID, sysid);

		/*************************************************************************************/
		/** 利用停止解除後指示書登録ＣＣ                                                              **/
		/*************************************************************************************/
		IRequestParameterReadWrite retParam = (new JKKUseStpAddShijishoCC()).runUseStpKaijoAddShijisho08(handle, param, fixedText);

		//処理終了
		return retParam;
		
	}
//v14.00.00 2015/05/22 ADD END
	/**
	 * 利用停止解除後指示書(11:お客様の基本情報)登録を呼び出すメソッド
	 * リクエストパラメータにSYSIDが設定されていればそれを使い、
	 * なければ、請求契約番号からSYSIDを取得して指示書登録を行います。
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Throwable 例外時にスローします
	 */
	public IRequestParameterReadWrite useStpKaijoAddShijisho(
			SessionHandle handle, 
			IRequestParameterReadWrite param, 
			String fixedText) throws Throwable
	{
		
		HashMap<String, Object> paramMap = null;

		//作業日の取得
		oPE_DATE = JCCBPCommon.getOpeDate(null);
		
		//リクエストパラメータ情報取得
		paramMap = (HashMap<String, Object>)param.getData(fixedText);
//v14.00.00 2015/05/22 ADD START   
		//リクエストパラメータ情報削除（JKKAddSjishoCC 実行結果）
		param.removeData(SJISHO_MAP);
//v14.00.00 2015/05/22 ADD END   
		
		//対象者SYSID取得
		String sysid = (String) paramMap.get(USE_STP_SYSID);
		//請求契約番号取得
		String seikyKeiNo = (String) paramMap.get(SEIKY_KEI_NO);

		printlnEjbLog("＃＃＃＃JKKUseStpAddShijishoWrapperCC.useStpKaijoAddShijisho() sysid=" + sysid);
		printlnEjbLog("＃＃＃＃JKKUseStpAddShijishoWrapperCC.useStpKaijoAddShijisho() seikyKeiNo=" + seikyKeiNo);

		// SYSIDが未設定の場合、請求契約情報からSYSIDを取得する
		if (JKKStringUtil.isNullBlank(sysid)) {
			sysid = getSysId(handle, param, fixedText, seikyKeiNo);
			
			if (JKKStringUtil.isNullBlank(sysid)) {
				//処理終了
				return param;
			}
		}
		
		// お客様一意照会
		HashMap<String, Object> ck0011map = getECK0011A010(handle, param, fixedText, sysid);
		
		// お客様・会員ISP決済コードを取得して、0（通常）の場合、指示書を登録する
		String mmbIspKssiCd = getMmbIspKssiCd(ck0011map);
		
		if (! "0".equals(mmbIspKssiCd)) {
			// 0（通常）以外のとき、利用停止解除の指示書は出さない
			return param;
		}
		
		// お客様・契約者タイプコードを取得して、5（マンションオーナー）以外の場合、指示書を登録する。
		String keishaTypeCd = getKeishaTypeCd(ck0011map);
		
		if(JACStrConst.KEISHA_TYPE_CD_MT_OWN.equals(keishaTypeCd))
		{
			// 5（マンションオーナー）のとき、利用停止解除の指示書は出さない
			return param;
		}
		
		//OM-2014-0003528 ADD START
		// ID通知書発行識別コードが"発行あり"の場合に指示書を登録する
		if (!checkIdTchishoHakSkbtCd(handle, param, fixedText, sysid))
		{
			return param;
		}
		//OM-2014-0003528 ADD END
		
		// リクエストパラメータに設定
		paramMap.put(USE_STP_SYSID, sysid);

		/*************************************************************************************/
		/** 利用停止解除後指示書登録ＣＣ                                                              **/
		/*************************************************************************************/
		IRequestParameterReadWrite retParam = (new JKKUseStpAddShijishoCC()).runUseStpKaijoAddShijisho(handle, param, fixedText);

		//処理終了
		return retParam;
		
	}

//v14.00.00 2015/05/22 ADD START   
	/**
	 * 利用停止後指示書(8:支払方法の情報)登録メソッド
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Throwable 例外時にスローします
	 */
	public IRequestParameterReadWrite useStpAddShijisho08(
			SessionHandle handle, 
			IRequestParameterReadWrite param, 
			String fixedText) throws Throwable
	{
		
		HashMap<String, Object> paramMap = null;

		//作業日の取得
		oPE_DATE = JCCBPCommon.getOpeDate(null);
		
		//リクエストパラメータ情報取得
		paramMap = (HashMap<String, Object>)param.getData(fixedText);
		//リクエストパラメータ情報削除（JKKAddSjishoCC 実行結果）
		param.removeData(SJISHO_MAP);
		
		//対象者SYSID取得
		String sysid = (String) paramMap.get(USE_STP_SYSID);
		//請求契約番号取得
		String seikyKeiNo = (String) paramMap.get(SEIKY_KEI_NO);

		printlnEjbLog("＃＃＃＃JKKUseStpAddShijishoWrapperCC.useStpAddShijisho08() sysid=" + sysid);
		printlnEjbLog("＃＃＃＃JKKUseStpAddShijishoWrapperCC.useStpAddShijisho08() seikyKeiNo=" + seikyKeiNo);

		// SYSIDが未設定の場合、請求契約情報からSYSIDを取得する
		if (JKKStringUtil.isNullBlank(sysid)) {
			sysid = getSysId(handle, param, fixedText, seikyKeiNo);
			
			if (JKKStringUtil.isNullBlank(sysid)) {
				//処理終了
				return param;
			}
		}
		
		// お客様一意照会
		HashMap<String, Object> ck0011map = getECK0011A010(handle, param, fixedText, sysid);
		
		// お客様・会員ISP決済コードを取得して、1（利用停止中）の場合、指示書を登録する
		String mmbIspKssiCd = getMmbIspKssiCd(ck0011map);
		
		if (! "1".equals(mmbIspKssiCd)) {
			// 1（利用停止中）以外のとき、利用停止の指示書は出さない
			return param;
		}
		
		// お客様・契約者タイプコードを取得して、5（マンションオーナー）以外の場合、指示書を登録する。
		String keishaTypeCd = getKeishaTypeCd(ck0011map);
		
		if(JACStrConst.KEISHA_TYPE_CD_MT_OWN.equals(keishaTypeCd))
		{
			// 5（マンションオーナー）のとき、利用停止解除の指示書は出さない
			return param;
		}
		
		// 支払い方法入力支援コードがISP決済の場合に指示書を登録する
		if (!checkPaymentInSuppurt(handle, param, fixedText, sysid)) 
		{
			return param;
		}
		
		// ID通知書発行識別コードが"発行あり"の場合に指示書を登録する
		if (!checkIdTchishoHakSkbtCd2(handle, param, fixedText, sysid))
		{
			return param;
		}
		
		// リクエストパラメータに設定
		paramMap.put(USE_STP_SYSID, sysid);

		/*************************************************************************************/
		/** 利用停止後指示書登録ＣＣ                                                              **/
		/*************************************************************************************/
		IRequestParameterReadWrite retParam = (new JKKUseStpAddShijishoCC()).runUseStpAddShijisho08(handle, param, fixedText);

		//処理終了
		return retParam;
		
	}
	
	/**
	 * 利用停止後指示書(11:お客様の基本情報)登録メソッド
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Throwable 例外時にスローします
	 */
	public IRequestParameterReadWrite useStpAddShijisho(
			SessionHandle handle, 
			IRequestParameterReadWrite param, 
			String fixedText) throws Throwable
	{
		
		HashMap<String, Object> paramMap = null;

		//作業日の取得
		oPE_DATE = JCCBPCommon.getOpeDate(null);
		
		//リクエストパラメータ情報取得
		paramMap = (HashMap<String, Object>)param.getData(fixedText);
		//リクエストパラメータ情報削除（JKKAddSjishoCC 実行結果）
		param.removeData(SJISHO_MAP);
		
		//対象者SYSID取得
		String sysid = (String) paramMap.get(USE_STP_SYSID);
		//請求契約番号取得
		String seikyKeiNo = (String) paramMap.get(SEIKY_KEI_NO);

		printlnEjbLog("＃＃＃＃JKKUseStpAddShijishoWrapperCC.useStpAddShijisho() sysid=" + sysid);
		printlnEjbLog("＃＃＃＃JKKUseStpAddShijishoWrapperCC.useStpAddShijisho() seikyKeiNo=" + seikyKeiNo);

		// SYSIDが未設定の場合、請求契約情報からSYSIDを取得する
		if (JKKStringUtil.isNullBlank(sysid)) {
			sysid = getSysId(handle, param, fixedText, seikyKeiNo);
			
			if (JKKStringUtil.isNullBlank(sysid)) {
				//処理終了
				return param;
			}
		}
		
		// お客様一意照会
		HashMap<String, Object> ck0011map = getECK0011A010(handle, param, fixedText, sysid);
		
		// お客様・会員ISP決済コードを取得して、 1（利用停止中）の場合、指示書を登録する
		String mmbIspKssiCd = getMmbIspKssiCd(ck0011map);
		
		if (! "1".equals(mmbIspKssiCd)) {
			// 1（利用停止中）以外のとき、利用停止の指示書は出さない
			return param;
		}
		
		// お客様・契約者タイプコードを取得して、5（マンションオーナー）以外の場合、指示書を登録する。
		String keishaTypeCd = getKeishaTypeCd(ck0011map);
		
		if(JACStrConst.KEISHA_TYPE_CD_MT_OWN.equals(keishaTypeCd))
		{
			// 5（マンションオーナー）のとき、利用停止解除の指示書は出さない
			return param;
		}
		
		// ID通知書発行識別コードが"発行あり"の場合に指示書を登録する
		if (!checkIdTchishoHakSkbtCd2(handle, param, fixedText, sysid))
		{
			return param;
		}
		
		// リクエストパラメータに設定
		paramMap.put(USE_STP_SYSID, sysid);

		/*************************************************************************************/
		/** 利用停止後指示書登録ＣＣ                                                              **/
		/*************************************************************************************/
		IRequestParameterReadWrite retParam = (new JKKUseStpAddShijishoCC()).runUseStpAddShijisho11(handle, param, fixedText);

		//処理終了
		return retParam;
		
	}
//v14.00.00 2015/05/22 ADD END

	/**
	 * 請求契約番号から請求契約一意照会を実行してSYSIDを取得し、返却します。
	 * SYSIDを取得できないときnullを返却します。
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param seikyKeiNo 請求契約番号
	 * @return
	 * @throws RequestParameterException
	 * @throws SCException
	 * @throws Exception
	 * @throws CCException
	 */
	private String getSysId(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			String seikyKeiNo) throws RequestParameterException,
			SCException, Exception, CCException
	{
			
		String sysid = null;
		
		if (JKKStringUtil.isNullBlank(seikyKeiNo)) {
			// 何もしない
			return null;
		}

		// EKK0491A010  請求契約一意照会
		HashMap<String, Object> ekk0491map = getEKK0491A010(handle, param, fixedText, seikyKeiNo);
		
		if (ekk0491map == null) {
			// 何もしない
			return null;
		}
		
		// SYSIDを取得
		sysid = (String)ekk0491map.get( EKK0491A010CBSMsg1List.SYSID );

		if (JKKStringUtil.isNullBlank(sysid)) {
			// 何もしない
			return null;
		}
		
		return sysid;
	}

	/**
	 * お客様一意照会情報マップより会員ISP決済状態コードを取得する。
	 * @param ck0011map
	 * @return 会員ISP決済状態コード
	 */
	private String getMmbIspKssiCd(HashMap<String, Object> ck0011map)
	{
		String mmbIspKssiCd = null;
		
		if (ck0011map == null) {
			// 何もしない
			return null;
		}
		
		// 会員ISP決済状態コードを取得
		mmbIspKssiCd = (String)ck0011map.get( ECK0011A010CBSMsg1List.MMB_ISP_KSSAI_STAT_CD );

		if (JKKStringUtil.isNullBlank(mmbIspKssiCd)) {
			// 何もしない
			return null;
		}
		
		return mmbIspKssiCd;

	}

	/**
	 * お客様一意照会情報マップより契約者タイプコードを取得する。
	 * @param ck0011map
	 * @return 契約者タイプコード
	 */
	private String getKeishaTypeCd(HashMap<String, Object> ck0011map)
	{
		String keishaTypeCd = null;
		
		if (ck0011map == null) {
			// 何もしない
			return null;
		}
		
		// 契約者タイプコードを取得
		keishaTypeCd = (String)ck0011map.get(ECK0011A010CBSMsg1List.KEISHA_TYPE_CD);

		return keishaTypeCd;

	}
	
	/**
	 * 請求契約一意照会の結果を返却します。
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param seikyKeiNo
	 * @return 請求契約一意照会の結果
	 * @throws RequestParameterException
	 * @throws SCException
	 * @throws Exception
	 * @throws CCException
	 */
	private HashMap<String, Object> getEKK0491A010(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			String seikyKeiNo) throws RequestParameterException, SCException, Exception, CCException
	{
		// 事前準備
		HashMap<String, String> condMap = new HashMap<String, String>();
		HashMap<String, Object> reqMap;
		Map<?, ?> resMap;

		// 住所情報変更初期表示情報取得コモンコンポーネント
		// マッピングクラスインスタンスを取得
		JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();
		
		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// ・EKK0491A010  請求契約一意照会
		condMap = new HashMap<String, String>();
		condMap.put( JKKAdchgMapperCC.COND_KEY_SEIKY_KEI_NO, seikyKeiNo );
		condMap.put( JKKAdchgMapperCC.COND_KEY_OPEDATE, oPE_DATE );
		reqMap = mapper.setEKK0491A010( param, fixedText, condMap );
		resMap = scCall.run( reqMap, handle );
		HashMap<String, Object> kk0491_a010_map = mapper.getEKK0491A010( param, fixedText, resMap );
		mapper.scResultCheck( param );
		
		return kk0491_a010_map;
	}
	
	/**
	 * お客様一意照会の結果を返却します。
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param sysid
	 * @return お客様一意照会の結果マップ
	 * @throws RequestParameterException
	 * @throws SCException
	 * @throws Exception
	 * @throws CCException
	 */
	private HashMap<String, Object> getECK0011A010(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String sysid)
			throws RequestParameterException, SCException, Exception, CCException
	{
		// 事前準備
		HashMap<String, String> condMap = new HashMap<String, String>();
		HashMap<String, Object> reqMap;
		Map<?, ?> resMap;

		// 住所情報変更初期表示情報取得コモンコンポーネント
		// マッピングクラスインスタンスを取得
		JKKAdchgMapperCC mapper = JKKAdchgMapperCC.getInstance();
		
		// SCリクエストInvokerを取得
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// ECK0011A010  お客様一意照会
		condMap = new HashMap<String, String>();
		condMap.put(JKKAdchgMapperCC.COND_KEY_SYSID, sysid);
		condMap.put(JKKAdchgMapperCC.COND_KEY_OPEDATE, oPE_DATE);
		reqMap = mapper.setECK0011A010(param, fixedText, condMap);
		resMap = scCall.run(reqMap, handle);
		HashMap<String, Object> ck0011_a010_map = mapper.getECK0011A010(param, fixedText, resMap);
		mapper.scResultCheck(param);
		
		return ck0011_a010_map;
	}

//v14.00.00 2015/05/22 ADD START
	/**
	 * 支払い方法入力支援コードがISP決済・クレジットを判定します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザー固定文字列
	 * @param sysid SYSID
	 * @return true:ISP決済 false:ISP決済以外
	 * @throws Exception 
	 */
	private boolean checkPaymentInSuppurt(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			String sysid) throws Exception
	{
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		HashMap<String, Object> paramMap = setSCInputCommonData(param, new HashMap<String, Object>());
		Map<?, ?> reqMap = null;
		
		// ECN0131B008_支払方法入力支援一覧照会（SYSID）1
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{editInECN0131B008(param, fixedText, sysid)});
		reqMap = scCall.run(paramMap, handle);
		editRetECN0131B008(reqMap, param, fixedText);
		this.scResultCheck(param);

		CAANMsg cn0131Tmpl = ((CAANMsg[])reqMap.get(JCMConstants.TEMPLATE_LIST_KEY))[0];
		CAANMsg[] cn0131TmplArray = cn0131Tmpl.getCAANMsgList(ECN0131B008CBSMsg.ECN0131B008CBSMSG1LIST);
		// 支払方法入力支援の支払い方法入力支援コードがISP決済の場合は指示書登録対象とする
		for (CAANMsg childTemplate : cn0131TmplArray)
		{
			if (PAYWAY_INPUT_SHIEN_ISP.equals(childTemplate.getString(ECN0131B008CBSMsg1List.PAYWAY_INPUT_SHIEN_CD)))
			return true;
		}
		return false;
	}
//v14.00.00 2015/05/22 ADD END

	/**
	 * <dl>
	 * <dt>処理概要：
	 * <dd>デバッグログを出力します<BR>
	 * <dt>処理補足：
	 * <dd>
	 * </dl>
	 * 
	 * @param dumpObj 出力するオブジェクト
	 */
	private void printlnEjbLog(Object dumpObj) {
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), dumpObj, null, null, null);
	}
	
	//OM-2014-0003528 ADD START
	
	/**
	 * ID通知書発行識別コードの発行有無を判定します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザー固定文字列
	 * @param sysid SYSID
	 * @return true:ID通知書発行識別コード発行あり false:発行なし
	 * @throws Exception 
	 */
	private boolean checkIdTchishoHakSkbtCd(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			String sysid) throws Exception
	{
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		HashMap<String, Object> paramMap = setSCInputCommonData(param, new HashMap<String, Object>());
		Map<?, ?> reqMap = null;
		
		// EKK0081B519_サービス契約一覧照会（SYSID）3
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{editInEKK0081B519(param, fixedText, sysid)});
		reqMap = scCall.run(paramMap, handle);
		editRetEKK0081B519(reqMap, param, fixedText);
		this.scResultCheck(param);

		CAANMsg kk0081Tmpl = ((CAANMsg[])reqMap.get(JCMConstants.TEMPLATE_LIST_KEY))[0];
		CAANMsg[] kk0081TmplArray = kk0081Tmpl.getCAANMsgList(EKK0081B519CBSMsg.EKK0081B519CBSMSG1LIST);

		// サービス提供中のサービス契約の料金コースのID通知書発行識別コードに"発行あり"が存在した場合は指示書登録対象とする
		for (CAANMsg childTemplate : kk0081TmplArray)
		{

//v14.00.00 2015/05/22 MOD START
//			// サービス提供中のみを対象にする
//			if (!JKKStrConst.CD00037_SVCTK_CHU.equals(childTemplate.getString(EKK0081B519CBSMsg1List.SVC_KEI_STAT)))
//			{
//				continue;
//			}
			// サービス提供中のみを対象にする
			if (!SVC_KEI_STAT_100.equals(childTemplate.getString(EKK0081B519CBSMsg1List.SVC_KEI_STAT)))
			{
				continue;
			}
//v14.00.00 2015/05/22 MOD END
			
			// mineoのサービス契約は例外的に指示書登録対象とする
			if (JKKStrConst.CD00130_51.equals(childTemplate.getString(EKK0081B519CBSMsg1List.SVC_CD)))
			{
				return true;
			}
			
			// EKK0791A010_料金コース一意照会
			paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{editInEKK0791A010(param, fixedText,
					childTemplate.getString(EKK0081B519CBSMsg1List.PCRS_CD))});
			reqMap = scCall.run(paramMap, handle);
			editRetEKK0791A010(reqMap, param, fixedText);
			this.scResultCheck(param);
			
			CAANMsg kk0791Tmpl = ((CAANMsg[])reqMap.get(JCMConstants.TEMPLATE_LIST_KEY))[0];
			CAANMsg[] kk0791TmplArray = kk0791Tmpl.getCAANMsgList(EKK0791A010CBSMsg.EKK0791A010CBSMSG1LIST);
			
			// （万が一）取得できなかったときは指示書対象外
			if (kk0791TmplArray == null || kk0791TmplArray.length == 0) {
				continue;
			}
			
			// ID通知書発行識別コード"発行あり系"（発行なし以外）が存在したら、指示書登録対象
			if (!JKKStrConst.CD01493_HAKKO_NASHI.equals(kk0791TmplArray[0].getString(
					EKK0791A010CBSMsg1List.ID_TCHISHO_HAK_SKBT_CD)))
			{
				return true;
			}
		}
		
		return false;
	}

//v14.00.00 2015/05/22 ADD START
	/**
	 * ID通知書発行識別コードの発行有無を判定します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザー固定文字列
	 * @param sysid SYSID
	 * @return true:ID通知書発行識別コード発行あり false:発行なし
	 * @throws Exception 
	 */
	private boolean checkIdTchishoHakSkbtCd2(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			String sysid) throws Exception
	{
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		HashMap<String, Object> paramMap = setSCInputCommonData(param, new HashMap<String, Object>());
		Map<?, ?> reqMap = null;
		
		// EKK0081B519_サービス契約一覧照会（SYSID）3
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{editInEKK0081B519(param, fixedText, sysid)});
		reqMap = scCall.run(paramMap, handle);
		editRetEKK0081B519(reqMap, param, fixedText);
		this.scResultCheck(param);

		CAANMsg kk0081Tmpl = ((CAANMsg[])reqMap.get(JCMConstants.TEMPLATE_LIST_KEY))[0];
		CAANMsg[] kk0081TmplArray = kk0081Tmpl.getCAANMsgList(EKK0081B519CBSMsg.EKK0081B519CBSMSG1LIST);

		// 停止中サービス提供中のサービス契約の料金コースのID通知書発行識別コードに"発行あり"が存在した場合は指示書登録対象とする
		for (CAANMsg childTemplate : kk0081TmplArray)
		{

			// 停止中のみを対象にする
			if (!SVC_KEI_STAT_220.equals(childTemplate.getString(EKK0081B519CBSMsg1List.SVC_KEI_STAT)))
			{
				continue;
			}
			
			// mineoのサービス契約は例外的に指示書登録対象とする
			if (JKKStrConst.CD00130_51.equals(childTemplate.getString(EKK0081B519CBSMsg1List.SVC_CD)))
			{
				return true;
			}
			
			// EKK0791A010_料金コース一意照会
			paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]{editInEKK0791A010(param, fixedText,
					childTemplate.getString(EKK0081B519CBSMsg1List.PCRS_CD))});
			reqMap = scCall.run(paramMap, handle);
			editRetEKK0791A010(reqMap, param, fixedText);
			this.scResultCheck(param);
			
			CAANMsg kk0791Tmpl = ((CAANMsg[])reqMap.get(JCMConstants.TEMPLATE_LIST_KEY))[0];
			CAANMsg[] kk0791TmplArray = kk0791Tmpl.getCAANMsgList(EKK0791A010CBSMsg.EKK0791A010CBSMSG1LIST);
			
			// （万が一）取得できなかったときは指示書対象外
			if (kk0791TmplArray == null || kk0791TmplArray.length == 0) {
				continue;
			}
			
			// ID通知書発行識別コード"発行あり系"（発行なし以外）が存在したら、指示書登録対象
			if (!JKKStrConst.CD01493_HAKKO_NASHI.equals(kk0791TmplArray[0].getString(
					EKK0791A010CBSMsg1List.ID_TCHISHO_HAK_SKBT_CD)))
			{
				return true;
			}
		}
		
		return false;
	}
//v14.00.00 2015/05/22 ADD END

	/**
	 * サービス契約一覧照会（SYSID）3の上りマッピング処理を行います。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザー固定文字
	 * @param sysid SYSID
	 * @return CAANMsg
	 * @throws RequestParameterException
	 */
	private CAANMsg editInEKK0081B519(IRequestParameterReadWrite param, String fixedText, String sysid) throws RequestParameterException
	{
		CAANMsg template = new CAANMsg(EKK0081B519CBSMsg.class.getName());

		// テンプレートID
		template.set(EKK0081B519CBSMsg.TEMPLATEID, "EKK0081B519");

		// 機能コード
		template.set(EKK0081B519CBSMsg.FUNC_CODE, "1");

		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);

		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);

		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);

		// ＫＥＹ＿SYSID
		template.set(EKK0081B519CBSMsg.KEY_SYSID, sysid);

		return template;
	}

	/**
	 * サービス契約一覧照会（SYSID）3の下りマッピング処理を行います。
	 * <br>
	 * @param msgList メッセージリスト
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザー固定文字列
	 * @return リクエストパラメータ
	 * @throws Exception
	 */
	private IRequestParameterReadWrite editRetEKK0081B519(Map<?, ?> msgList, IRequestParameterReadWrite param, String fixedText)
			throws Exception
	{
		CAANMsg template = ((CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY))[0];
		
		// エラー情報の設定
		editErrInfoEKK0081B519(param, template, (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY), fixedText);

		// エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return param;
	}

	/**
	 * サービス契約一覧照会（SYSID）3のエラー情報マッピング処理を行います。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param template CAANMsg
	 * @param returnCode リターンコード
	 * @param fixedText ユーザー固定文字列
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	private IRequestParameterReadWrite editErrInfoEKK0081B519(IRequestParameterReadWrite param, CAANMsg template, int returnCode, String fixedText)
			throws RequestParameterException
	{
		return setControlMapErrInfo(param, template.getInt(EKK0081B519CBSMsg.STATUS), returnCode);
	}

	/**
	 * 料金コース一意照会の上りマッピング処理を行います。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザー固定文字
	 * @param pcrsCd 料金コースコード
	 * @return CAANMsg
	 * @throws RequestParameterException
	 */
	private CAANMsg editInEKK0791A010(IRequestParameterReadWrite param, String fixedText, String pcrsCd) throws RequestParameterException
	{
		CAANMsg template = new CAANMsg(EKK0791A010CBSMsg.class.getName());

		// テンプレートID
		template.set(EKK0791A010CBSMsg.TEMPLATEID, "EKK0791A010");

		// 機能コード
		template.set(EKK0791A010CBSMsg.FUNC_CODE, "2");

		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);

		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);

		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);

		// ＫＥＹ＿料金コースコード
		template.set(EKK0791A010CBSMsg.KEY_PCRS_CD, pcrsCd);
	
		// ＫＥＹ＿予約適用年月日
		template.set(EKK0791A010CBSMsg.KEY_RSV_APLY_YMD, oPE_DATE);

		return template;
	}

	/**
	 * 料金コース一意照会の下りマッピング処理を行います。
	 * <br>
	 * @param msgList メッセージリスト
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザー固定文字列
	 * @return リクエストパラメータ
	 * @throws Exception
	 */
	private IRequestParameterReadWrite editRetEKK0791A010(Map<?, ?> msgList, IRequestParameterReadWrite param, String fixedText)
			throws Exception
	{
		CAANMsg template = ((CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY))[0];
		
		// エラー情報の設定
		editErrInfoEKK0791A010(param, template, (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY), fixedText);

		// エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return param;
	}

	/**
	 * 料金コース一意照会のエラー情報マッピング処理を行います。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param template CAANMsg
	 * @param returnCode リターンコード
	 * @param fixedText ユーザー固定文字列
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	private IRequestParameterReadWrite editErrInfoEKK0791A010(IRequestParameterReadWrite param, CAANMsg template, int returnCode, String fixedText)
			throws RequestParameterException
	{
		return setControlMapErrInfo(param, template.getInt(EKK0791A010CBSMsg.STATUS), returnCode);
	}

//v14.00.00 2015/05/22 ADD START
	/**
	 * 支払方法入力支援一覧照会の上りマッピング処理を行います。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザー固定文字
	 * @param pcrsCd 料金コースコード
	 * @return CAANMsg
	 * @throws RequestParameterException
	 */
	private CAANMsg editInECN0131B008(IRequestParameterReadWrite param, String fixedText, String sysCd) throws RequestParameterException
	{
		CAANMsg template = new CAANMsg(ECN0131B008CBSMsg.class.getName());

		// テンプレートID
		template.set(ECN0131B008CBSMsg.TEMPLATEID, "ECN0131B008");

		// 機能コード
		template.set(ECN0131B008CBSMsg.FUNC_CODE, "1");

		// オペレータID
		Object operatorId = param.getControlMapData(SCControlMapKeys.OPERATOR_ID);
		template.set(JCMConstants.OPERATOR_ID_KEY, operatorId);

		// 運用日付
		Object operateDate = param.getControlMapData(SCControlMapKeys.OPE_DATE);
		template.set(JCMConstants.OPERATE_DATE_KEY, operateDate);

		// 運用日時
		Object operateDateTime = param.getControlMapData(SCControlMapKeys.OPE_TIME);
		template.set(JCMConstants.OPERATE_DATETIME_KEY, operateDateTime);

		// ＫＥＹ＿ＳＹＳＩＤ
		template.set(ECN0131B008CBSMsg.KEY_SYSID, sysCd);

		return template;
	}

	/**
	 * 支払方法入力支援一覧照会の下りマッピング処理を行います。
	 * <br>
	 * @param msgList メッセージリスト
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザー固定文字列
	 * @return リクエストパラメータ
	 * @throws Exception
	 */
	private IRequestParameterReadWrite editRetECN0131B008(Map<?, ?> msgList, IRequestParameterReadWrite param, String fixedText)
			throws Exception
	{
		CAANMsg template = ((CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY))[0];
		
		// エラー情報の設定
		editErrInfoECN0131B008(param, template, (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY), fixedText);

		// エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}

		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(msgList, errList));

		return param;
	}

	/**
	 * 支払方法入力支援一覧照会のエラー情報マッピング処理を行います。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param template CAANMsg
	 * @param returnCode リターンコード
	 * @param fixedText ユーザー固定文字列
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	private IRequestParameterReadWrite editErrInfoECN0131B008(IRequestParameterReadWrite param, CAANMsg template, int returnCode, String fixedText)
			throws RequestParameterException
	{
		return setControlMapErrInfo(param, template.getInt(ECN0131B008CBSMsg.STATUS), returnCode);
	}	
//v14.00.00 2015/05/22 ADD END

	/**
	 * SCインプット共通データ設定処理を行います。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param paramMap パラメータマップ
	 * @return パラメータマップ
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> setSCInputCommonData(IRequestParameterReadWrite param, HashMap<String, Object> paramMap)
			throws RequestParameterException
	{
		/* SCインプット共通データ */
		// **********************************************
		// 【取得元：電文ヘッダ(ヘッダ)】
		// **********************************************
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());

		// **********************************************
		// 【取得元：ユーザエリア(コントロールマップ)】
		// **********************************************
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		return paramMap;
	}

	/**
	 * コントロールマップエラー情報格納処理を行います。
	 * <br>
	 * @param param リクエストパラメータ
	 * @param itemplateStatus SCの実行ステータス
	 * @param returnCode リターンコード
	 * @return リクエストパラメータ
	 * @throws RequestParameterException
	 */
	private IRequestParameterReadWrite setControlMapErrInfo(IRequestParameterReadWrite param, int itemplateStatus, int returnCode)
			throws RequestParameterException
	{
		int templateStatus = itemplateStatus;

		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)
		{
			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);
		}
		return param;
	}

	/**
	 * サービスコンポーネントの実行結果を確認します。
	 * <br>
	 * @param reqParam モデルグループ、コントロールマップを含むリクエストパラメータ
	 * @throws Exception 例外が発生した場合
	 */
	public void scResultCheck(IRequestParameterReadWrite reqParam) throws Exception
	{
		int scReturnCode = Integer.parseInt(reqParam.getControlMapData(SCControlMapKeys.RETURN_CODE).toString());

		// サービスコンポーネントの実行結果に単項目以上のエラーがある場合、例外とする
		if (scReturnCode >= JPCModelConstant.SINGLEDATA_ERR)
		{
			throw new CCException("サービスコンポーネントの実行結果にエラーがあります", new Exception());
		}
	}
	//OM-2014-0003528 ADD END

}
