/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKMineoSetPlanWribShosaNgMailSendCC
*   ソースファイル名：JKKMineoSetPlanWribShosaNgMailSendCC.java
*   作成者          ：富士通
*   日付            ：2018年07月04日
*＜機能概要＞
*   セット割登録画面照査NGボタン押下処理コモンコンポーネント部品
*＜修正履歴＞
*	バージョン		修正日			修正者			修正内容
*	v38.00.00		2018/07/04		FJ) 原田		【ANK-3436-00-00】eo光×eo電気×mineoセット割対応
*	v38.01.00		2018/08/03		FJ) 原田		【IT1-2018-0000137】
*	v38.01.01		2018/08/22		FJ) 和田(さ)	【IT1-2018-0000148】
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
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.CCException;
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.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.constant.JZM0171Constant;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.ECC0021D010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECC0021D010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECC0021D010CBSMsg2List;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.ECK0201B001CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0201B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0021A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0021A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0081B019CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B019CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKKA0030002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKKA0030002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EZM0171B010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0171B010CBSMsg1List;

/**
 * セット割登録画面照査NGボタン押下処理コモンコンポーネント部品です。
 * <br>
 * @author 富士通
 */

@SuppressWarnings("unchecked")
public class JKKMineoSetPlanWribShosaNgMailSendCC extends AbstractCommonComponent
{
	/** テンプレートID(連絡先一覧照会) */
	private static final String TEMPLATE_ID_ECK0201B001 = "ECK0201B001";
	
	/** テンプレートID(ｍｉｎｅｏ連絡先メールアドレス取得) */
	private static final String TEMPLATE_ID_EKKA0030002 = "EKKA0030002";
	
	/** テンプレートID(お客様一意照会) */
	private static final String TEMPLATE_ID_ECK0011A010 = "ECK0011A010";
	
	/** テンプレートID(サービス申込時サービス契約一覧照会) */
	private static final String TEMPLATE_ID_EKK0081B019 = "EKK0081B019";
	
	/** テンプレートID(サービス申込時サービス契約一覧照会) */
	private static final String TEMPLATE_ID_EKK0021A010 = "EKK0021A010";
	
	/** テンプレートID(進捗登録) **/
	private static final String TEMPLATE_ID_EKK1091D010 = "EKK1091D010";
	
	/** テンプレートID(コード名称管理一覧照会) */
	private static final String TEMPLATE_ID_EZM0171B010 = "EZM0171B010";
	
	/** メールコード 【eo光ネット】【mineo】キャンペーン適用不可のお知らせ */
	private static final String MAIL_CD_KKM1000020 = "KKM1000020";
	
	/** メールコード 【eo光ネット】【eo電気】キャンペーン適用不可のお知らせ */
	private static final String MAIL_CD_KKM1000021 = "KKM1000021";
	
	/** エラーコード（"E01":メールアドレス未存在） */
	private static final String ERR_CD_E01 = "E01";
	
	/**
	 * メイン処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Throwable 例外
	 */
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		// マッピング情報を取得
		Map<String, Object> ccMsg = (Map<String, Object>)param.getData(fixedText);
		
		Boolean sendMailTrgtEoNet = false;
		Boolean sendMailTrgtMineo = false;
		Boolean result = false;
		String sysid = "";
		String svcKeiNoNet = "";
		String wribSvckeiNo = "";
		// IT1-2018-0000148 ADD START
		String wribSysid = "";
		// IT1-2018-0000148 ADD END
		
		// 照査NGメール送信先のメールアドレスの対象を特定する
		sendMailTrgtEoNet = (Boolean)ccMsg.get("eo_ml_send1");
		sendMailTrgtMineo = (Boolean)ccMsg.get("mineo_ml_send1");
		sysid = (String)ccMsg.get("sysid");
		svcKeiNoNet = (String)ccMsg.get("svc_kei_no");
		wribSvckeiNo = (String)ccMsg.get("wrib_svc_kei_no");
		// IT1-2018-0000148 ADD START
		wribSysid = (String)ccMsg.get("wrib_sysid");
		// IT1-2018-0000148 ADD END
		
		// 編集用Map
		ArrayList<String> trgtMlad = new ArrayList<String>();
		
		if (sendMailTrgtEoNet)
		{
			trgtMlad = new ArrayList<String>();
			List<HashMap<String, Object>>eck0201b001List =  new ArrayList<HashMap<String, Object>>();
			
			// eo光契約へメール送信のチェックがオンの時
			// 連絡先一覧照会呼び出し（メールアドレス用）
			eck0201b001List = getRrksInfo(handle, param, fixedText, sysid, JPCModelConstant.FUNC_CD_1);
			
			// 取得したメールアドレスを取得する
			if (null != eck0201b001List && eck0201b001List.size() > 0)
			{
				for (int i = 0; i < eck0201b001List.size(); i++)
				{
					HashMap<String, Object> resultEck0201b001Map = new HashMap<String, Object>();
					
					resultEck0201b001Map = eck0201b001List.get(i);
					
					// IT1-2018-0000148 ADD START
					// 連絡先種別コード
					String rrksSbtCd = JKKStringUtil.nullToBlank((String)resultEck0201b001Map.get("rrks_sbt_cd"));
					// 連絡先分類コード
					String rrksBunruiCd = JKKStringUtil.nullToBlank((String)resultEck0201b001Map.get("rrks_bunrui_cd"));

					if ((JKKStrConst.CD00871_CONT_RRS.equals(rrksBunruiCd) && JKKStrConst.CD00254_HOME.equals(rrksSbtCd))
							|| (JKKStrConst.CD00871_KAISEN_RRS.equals(rrksBunruiCd) && JKKStrConst.CD00254_OTHER.equals(rrksSbtCd)))
					{
					// IT1-2018-0000148 ADD END
						String mlad = JKKStringUtil.nullToBlank((String)resultEck0201b001Map.get("mlad"));
						
						if (!JKKStringUtil.isNullBlank(mlad))
						{
							// メールアドレスを取得できた場合、送信対象とする
							trgtMlad.add(mlad);
						}
					// IT1-2018-0000148 ADD START
					}
					// IT1-2018-0000148 ADD END
				}
			}
			
			if (null != trgtMlad && trgtMlad.size() > 0)
			{
				// ----------------
				// メール送信処理
				// ----------------
				// 取得したメールアドレスの件数分、メール送信処理を呼び出す
				
				for (int j = 0; j < trgtMlad.size(); j++)
				{
					String sendTrgtMlad = "";
					
					// メール送信情報登録CCを実効
					JKKSendMailCC mailSendCC = new JKKSendMailCC();
					
					sendTrgtMlad = trgtMlad.get(j);
					
					// メール送信用マッピング処理呼び出し
					executeMapping(handle, param, fixedText, ccMsg, sendTrgtMlad);
					
					// メール送信の登録を行う
					mailSendCC.sendMailCC(handle, param, "MAIL_SEND_CC_INF");
					
					result = true;
				}
			}
			else
			{
				// 返却処理(システムエラー)
				setResponse(ccMsg, ERR_CD_E01);
			}
		}
		
		if (sendMailTrgtMineo)
		{
			trgtMlad = new ArrayList<String>();
			List<HashMap<String, Object>>ekka0030002List =  new ArrayList<HashMap<String, Object>>();
			
			// mineo契約へメール送信のチェックがオンの時
			// ｍｉｎｅｏ連絡先メールアドレス取得呼び出し
			ekka0030002List = getMineoInfo(handle, param, fixedText, wribSvckeiNo, JPCModelConstant.FUNC_CD_1);
			
			// 取得したメールアドレスを取得する
			if (null != ekka0030002List && ekka0030002List.size() > 0)
			{
				for (int i = 0; i < ekka0030002List.size(); i++)
				{
					HashMap<String, Object> resultEkka0030002Map = new HashMap<String, Object>();
					
					resultEkka0030002Map = ekka0030002List.get(i);
					
					String mlad = JKKStringUtil.nullToBlank((String)resultEkka0030002Map.get("mlad"));
					
					if (!JKKStringUtil.isNullBlank(mlad))
					{
						// メールアドレスを取得できた場合、送信対象とする
						trgtMlad.add(mlad);
					}
				}
			// IT1-2018-0000148 ADD START
			}
			
			// 連絡先を取得する
			List<HashMap<String, Object>>eck0201b001List =  new ArrayList<HashMap<String, Object>>();
			
			// 連絡先一覧照会呼び出し（mineoメールアドレス用）
			eck0201b001List = getRrksInfo(handle, param, fixedText, wribSysid, JPCModelConstant.FUNC_CD_1);
			
			// 取得したメールアドレスを取得する
			if (null != eck0201b001List && eck0201b001List.size() > 0)
			{
				for (int k = 0; k < eck0201b001List.size(); k++)
				{
					HashMap<String, Object> resultEck0201b001Map = new HashMap<String, Object>();
					
					resultEck0201b001Map = eck0201b001List.get(k);
					
					// 連絡先種別コード
					String rrksSbtCd = JKKStringUtil.nullToBlank((String)resultEck0201b001Map.get("rrks_sbt_cd"));
					// 連絡先分類コード
					String rrksBunruiCd = JKKStringUtil.nullToBlank((String)resultEck0201b001Map.get("rrks_bunrui_cd"));
					
					if (JKKStrConst.CD00871_CONT_RRS.equals(rrksBunruiCd) && JKKStrConst.CD00254_HOME.equals(rrksSbtCd))
					{
						String mlad = JKKStringUtil.nullToBlank((String)resultEck0201b001Map.get("mlad"));
						
						if (!JKKStringUtil.isNullBlank(mlad))
						{
							// メールアドレスを取得できた場合、送信対象とする
							trgtMlad.add(mlad);
						}
					}
				}
			}
			// IT1-2018-0000148 ADD END
				
			if (null != trgtMlad && trgtMlad.size() > 0)
			{
				// ----------------
				// メール送信処理
				// ----------------
				// 取得したメールアドレスの件数分、メール送信処理を呼び出す
				
				for (int j = 0; j < trgtMlad.size(); j++)
				{
					String sendTrgtMlad = "";
					
					// メール送信情報登録CCを実効
					JKKSendMailCC mailSendCC = new JKKSendMailCC();
					
					sendTrgtMlad = trgtMlad.get(j);
					
					// メール送信用マッピング処理呼び出し
					executeMapping(handle, param, fixedText, ccMsg, sendTrgtMlad);
					
					// メール送信の登録を行う
					mailSendCC.sendMailCC(handle, param, "MAIL_SEND_CC_INF");
					
					result = true;
				}
			}
		}
		// IT1-2018-0000148 DEL START
//		}
		// IT1-2018-0000148 DEL END
		
		if (result)
		{
			// ----------------
			// 進捗登録処理
			// ----------------
			// 進捗登録呼び出し
			addPrg(handle, param, fixedText, svcKeiNoNet, JPCModelConstant.FUNC_CD_1);
		}
		
		return param;
	}
	
	/**
	 * 連絡先一覧照会
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param sysid SYSID
	 * @param funcCd 機能コード
	 * @throws Throwable 
	 */
	private ArrayList<HashMap<String, Object>> getRrksInfo(SessionHandle handle
														, IRequestParameterReadWrite param
														, String fixedText
														, String sysid
														, String funcCd
														) throws Throwable
	{
		ArrayList<HashMap<String, Object>> eck0201b001List = new ArrayList<HashMap<String, Object>>();
		HashMap<String, Object> eck0201b001Map = new HashMap<String, Object>();
		
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// ------------------------------
		// 連絡先一覧照会
		// ------------------------------
		// 連絡先一覧照会の上りマッピング
		Object[][] eck0201b001In = {
							  {ECK0201B001CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0201B001}
							, {ECK0201B001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
							, {ECK0201B001CBSMsg.KEY_SYSID, sysid}
							, {ECK0201B001CBSMsg.KEY_RRK_WAY_CD, "001"}
							};
		
		// サービスIF実行
		CAANMsg[] eck0201b001Msg1List = callSC(handle, scCall, param, eck0201b001In,
				fixedText, new ECK0201B001CBSMsg().getContents()).getCAANMsgList(ECK0201B001CBSMsg.ECK0201B001CBSMSG1LIST);
		
		if (null != eck0201b001Msg1List)
		{
			for (CAANMsg eck0201b001Msg : eck0201b001Msg1List)
			{
				// IT1-2018-0000137 ADD START
				eck0201b001Map = new HashMap<String, Object>();
				// IT1-2018-0000137 ADD END
				eck0201b001Map.put("mlad", eck0201b001Msg.getString(ECK0201B001CBSMsg1List.MLAD));
				// IT1-2018-0000148 ADD START
				eck0201b001Map.put("rrks_bunrui_cd", eck0201b001Msg.getString(ECK0201B001CBSMsg1List.RRKS_BUNRUI_CD));
				eck0201b001Map.put("rrks_sbt_cd", eck0201b001Msg.getString(ECK0201B001CBSMsg1List.RRKS_SBT_CD));
				// IT1-2018-0000148 ADD END
				eck0201b001List.add(eck0201b001Map);
			}
		}
		
		return eck0201b001List;
	}
	
	/**
	 * ｍｉｎｅｏ連絡先メールアドレス取得
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param svcKeiNoMineo サービス契約番号（mineo）
	 * @param funcCd 機能コード
	 * @throws Throwable 
	 */
	private ArrayList<HashMap<String, Object>> getMineoInfo(SessionHandle handle
														, IRequestParameterReadWrite param
														, String fixedText
														, String svcKeiNoMineo
														, String funcCd
														) throws Throwable
	{
		ArrayList<HashMap<String, Object>> ekka0030002List = new ArrayList<HashMap<String, Object>>();
		HashMap<String, Object> ekka0030002Map = new HashMap<String, Object>();
		
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// ------------------------------------
		// ｍｉｎｅｏ連絡先メールアドレス取得
		// ------------------------------------
		// ｍｉｎｅｏ連絡先メールアドレス取得の上りマッピング
		Object[][] ekka0030002In = {
							  {EKKA0030002CBSMsg.TEMPLATEID, TEMPLATE_ID_EKKA0030002}
							, {EKKA0030002CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
							, {EKKA0030002CBSMsg.KEY_SVC_KEI_NO, svcKeiNoMineo}
							};
		
		// サービスIF実行
		CAANMsg[] ekka0030002Msg1List = callSC(handle, scCall, param, ekka0030002In,
				fixedText, new EKKA0030002CBSMsg().getContents()).getCAANMsgList(EKKA0030002CBSMsg.EKKA0030002CBSMSG1LIST);
		
		if (null != ekka0030002Msg1List)
		{
			for (CAANMsg ekka0030002Msg : ekka0030002Msg1List)
			{
				// IT1-2018-0000137 ADD START
				ekka0030002Map = new HashMap<String, Object>();
				// IT1-2018-0000137 ADD END
				ekka0030002Map.put("mlad", ekka0030002Msg.getString(EKKA0030002CBSMsg1List.MINEOMAILADDRESS));
				
				ekka0030002List.add(ekka0030002Map);
			}
		}
		
		return ekka0030002List;
	}
	
	/**
	 * コード名称管理一覧照会
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param funcCd 機能コード
	 * @throws Throwable 
	 */
	private ArrayList<HashMap<String, Object>> getEzm0171b010(SessionHandle handle
														, IRequestParameterReadWrite param
														, String fixedText
														, String cdSbtCd
														, String funcCd
														) throws Throwable
	{
		ArrayList<HashMap<String, Object>> ezm0171b010List = new ArrayList<HashMap<String, Object>>();
		HashMap<String, Object> ezm0171b010Map = new HashMap<String, Object>();
		
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// ---------------
		// お客様一意照会
		// ---------------
		// お客様一意照会の上りマッピング
		Object[][] ezm0171b010In = {
							  {EZM0171B010CBSMsg.TEMPLATEID, TEMPLATE_ID_EZM0171B010}
							, {EZM0171B010CBSMsg.FUNC_CODE, funcCd}
							, {EZM0171B010CBSMsg.KEY_CD_SBT_CD, JZM0171Constant.CD01731}
							};
		
		// サービスIF実行
		CAANMsg[] ezm0171b010Msg1List = callSC(handle, scCall, param, ezm0171b010In,
				fixedText, new EZM0171B010CBSMsg().getContents()).getCAANMsgList(EZM0171B010CBSMsg.EZM0171B010CBSMSG1LIST);
		
		if (null != ezm0171b010Msg1List)
		{
			for (CAANMsg ezm0171b010Msg : ezm0171b010Msg1List)
			{
				ezm0171b010Map = new HashMap<String, Object>();
				
				ezm0171b010Map.put("cd_div", ezm0171b010Msg.getString(EZM0171B010CBSMsg1List.CD_DIV));
				ezm0171b010Map.put("cd_div_nm", ezm0171b010Msg.getString(EZM0171B010CBSMsg1List.CD_DIV_NM));
				
				ezm0171b010List.add(ezm0171b010Map);
			}
		}
		
		return ezm0171b010List;
	}
	
	/**
	 * お客様一意照会
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param svcKeiNoMineo サービス契約番号（mineo）
	 * @param funcCd 機能コード
	 * @throws Throwable 
	 */
	private ArrayList<HashMap<String, Object>> getEck0011a010(SessionHandle handle
														, IRequestParameterReadWrite param
														, String fixedText
														, String sysid
														, String funcCd
														) throws Throwable
	{
		ArrayList<HashMap<String, Object>> eck0011a010List = new ArrayList<HashMap<String, Object>>();
		HashMap<String, Object> eck0011a010Map = new HashMap<String, Object>();
		
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// ---------------
		// お客様一意照会
		// ---------------
		// お客様一意照会の上りマッピング
		Object[][] eck0011a010In = {
							  {ECK0011A010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0011A010}
							, {ECK0011A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2}
							, {ECK0011A010CBSMsg.KEY_SYSID, sysid}
							, {ECK0011A010CBSMsg.KEY_RSV_APLY_YMD, JPCBPCommon.getOpeDate(null)}
							};
		
		// サービスIF実行
		CAANMsg[] eck0011a010Msg1List = callSC(handle, scCall, param, eck0011a010In,
				fixedText, new ECK0011A010CBSMsg().getContents()).getCAANMsgList(ECK0011A010CBSMsg.ECK0011A010CBSMSG1LIST);
		
		if (null != eck0011a010Msg1List)
		{
			for (CAANMsg eck0011a010Msg : eck0011a010Msg1List)
			{
				// IT1-2018-0000137 ADD START
				eck0011a010Map = new HashMap<String, Object>();
				// IT1-2018-0000137 ADD END
				eck0011a010Map.put("cust_nm", eck0011a010Msg.getString(ECK0011A010CBSMsg1List.CUST_NM));
				
				eck0011a010List.add(eck0011a010Map);
			}
		}
		
		return eck0011a010List;
	}
	
	/**
	 * サービス申込時サービス契約一覧照会を行うサービスインターフェイスを実行します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param svcKeiNo サービス契約番号
	 * @param func_cd 機能コード
	 * @return 結果
	 * @throws Throwable 例外が発生した場合
	 */
	private String callEkk0081b019(SessionHandle handle
										, IRequestParameterReadWrite param
										, String fixedText
										, String svcKeiNo
										, String func_cd)throws Throwable
	{
		// サービス申込時サービス契約一覧照照会結果.申込明細番号
		String mskmDtlNo = "";

		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		// サービス申込時サービス契約一覧照会の上りマッピング
		Object[][] eKK0081B019In = {
						{EKK0081B019CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0081B019}
						, {EKK0081B019CBSMsg.FUNC_CODE, func_cd}
						, {EKK0081B019CBSMsg.KEY_SVC_KEI_NO, svcKeiNo}
						};
		
		// サービスIF実行
		CAANMsg[] eKK0081B019Msg1List = callSC(handle, scCall, param, eKK0081B019In,
				fixedText, new EKK0081B019CBSMsg().getContents()).getCAANMsgList(EKK0081B019CBSMsg.EKK0081B019CBSMSG1LIST);
		
		if (null != eKK0081B019Msg1List)
		{
			for (CAANMsg eKK0081B019Msg : eKK0081B019Msg1List)
			{
				mskmDtlNo = eKK0081B019Msg.getString(EKK0081B019CBSMsg1List.MSKM_DTL_NO);
			}
		}
		return mskmDtlNo;
	}
	
	/**
	 * 申込明細一意照会を行うサービスインターフェイスを実行します。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param MskmDtlNo 申込明細番号
	 * @param func_cd 機能コード
	 * @return 結果
	 * @throws Throwable 例外が発生した場合
	 */
	private List<HashMap<String, Object>> getMskmDtlNoIti(SessionHandle handle
															, IRequestParameterReadWrite param
															, String fixedText
															, String MskmDtlNo
															, String func_cd)throws Throwable
	{
		// 申込明細一意照会
		List<HashMap<String, Object>> eKK0021A010List = new ArrayList<HashMap<String, Object>>();
		
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// 申込明細一意照会の上りマッピング
		Object[][] EKK0021A010In = {
							{EKK0021A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK0021A010}
							, {EKK0021A010CBSMsg.FUNC_CODE, func_cd}
							, {EKK0021A010CBSMsg.KEY_MSKM_DTL_NO, MskmDtlNo}
							};
		
		// サービスIF実行
		CAANMsg[] EKK0021A010Msg1List = callSC(handle, scCall, param, EKK0021A010In,
				fixedText, new EKK0021A010CBSMsg().getContents()).getCAANMsgList(EKK0021A010CBSMsg.EKK0021A010CBSMSG1LIST);
		
		if (null != EKK0021A010Msg1List)
		{
			for (CAANMsg EKK0021A010Msg : EKK0021A010Msg1List)
			{
				HashMap<String, Object> eKK0021A010Map = new HashMap<String, Object>();
				eKK0021A010Map.put(EKK0021A010CBSMsg1List.MSKMSHO_NO, EKK0021A010Msg.getString(EKK0021A010CBSMsg1List.MSKMSHO_NO));
				eKK0021A010List.add(eKK0021A010Map);
			}
		}
		return eKK0021A010List;
	}
	
	/**
	 * 進捗登録
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param svcKeiNoMineo サービス契約番号（mineo）
	 * @param funcCd 機能コード
	 * @throws Throwable 
	 */
	private ArrayList<HashMap<String, Object>> addPrg(SessionHandle handle
														, IRequestParameterReadWrite param
														, String fixedText
														, String svcKeiNo
														, String funcCd
														) throws Throwable
	{
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		ArrayList<HashMap<String, Object>> ekk1091d010List = new ArrayList<HashMap<String, Object>>();
		
		// ---------------
		// 進捗登録EKK1091D010
		// ---------------
		// 進捗登録の上りマッピング
		
		// 異動理由明細の枠を作成
		CAANMsg[] eKK1091D010CBSMSG1LIST = null;
		CAANMsg  eKK1091D010CBSMSG1 = new CAANMsg(EKK1091D010CBSMsg1List.class.getName());
		eKK1091D010CBSMSG1.set(EKK1091D010CBSMsg1List.IDO_RSN_CD, "56");
		eKK1091D010CBSMSG1.setNull(EKK1091D010CBSMsg1List.IDO_RSN_MEMO);
		eKK1091D010CBSMSG1LIST = new CAANMsg[]
		{
				eKK1091D010CBSMSG1
		};
		
		Object[][] ekk1091d010In = {
							  {EKK1091D010CBSMsg.TEMPLATEID, TEMPLATE_ID_EKK1091D010}
							, {EKK1091D010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
							, {EKK1091D010CBSMsg.SVC_KEI_NO, svcKeiNo}
							, {EKK1091D010CBSMsg.IDO_DIV, JKKStrConst.CD00576_WRIB_INF_ADD}
							, {EKK1091D010CBSMsg.IDO_DTM, JCCBPCommon.getSysDateTimeStamp()}
							, {EKK1091D010CBSMsg.PRG_STAT, "I003"}
							, {EKK1091D010CBSMsg.PRG_TKJK_1, "セット割を照査ＮＧにしました"}
							, {EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST, eKK1091D010CBSMSG1LIST}
							};
		
		// サービスIF実行
		CAANMsg[] ekk1091d010Msg1List = callSC(handle, scCall, param, ekk1091d010In,
				fixedText, new EKK1091D010CBSMsg().getContents()).getCAANMsgList(EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST);
		
		return ekk1091d010List;
	}
	
	
	/**
	 * メール送信用にマッピング処理を行う。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @param ccMsg 個別割引適用可否照会・変更依頼CCマップ
	 * @param scCall SC呼び出し部品
	 * @param inputMap 入力マップ
	 * @throws Throwable 例外が発生した場合
	 */
	private void executeMapping(SessionHandle handle
									, IRequestParameterReadWrite param
									, String fixedText
									, Map<String, Object> ccMsg
									, String sendTrgtMlad
									) throws Throwable
	{
		// 初期設定
		HashMap targetMap = null;
		
		String sysid = "";
		String searchTrgt = "";
		String sendMailCd = "";
		String svcKeiNoNet = "";
		String cmpNm = "";
		String searchKey = "";
		String custNm = "";
		String searchTrgtNm = "";
		String mskmshoNo = "";
		
		// 照査NGメール送信先のメールアドレスの対象を特定する
		sysid = (String)ccMsg.get("sysid");
		searchTrgt = (String)ccMsg.get("search_trgt");
		svcKeiNoNet = (String)ccMsg.get("svc_kei_no");
		cmpNm = (String)ccMsg.get("wrib_campaign_cd_nm");
		searchKey = (String)ccMsg.get("search_key");
		
		// コード名称管理一覧照会EZM0171B010
		List<HashMap<String, Object>> ezm0171b010List =  new ArrayList<HashMap<String, Object>>();
		ezm0171b010List = getEzm0171b010(handle, param, fixedText, JZM0171Constant.CD01731, JPCModelConstant.FUNC_CD_1);
		
		if (null != ezm0171b010List && ezm0171b010List.size() > 0)
		{
			for (int i = 0; i < ezm0171b010List.size(); i++)
			{
				HashMap<String, Object> cd01731Map = new HashMap<String, Object>();
				
				cd01731Map = ezm0171b010List.get(i);
				String cdSbtCd = JKKStringUtil.nullToBlank((String)cd01731Map.get("cd_div"));
				
				if (cdSbtCd.equals(searchTrgt))
				{
					// 画面で選択した、コード区分と一致した場合、コード区分名称を取得
					searchTrgtNm = (String)cd01731Map.get("cd_div_nm");
					
					break;
				}
			}
		}
		
		
		// 画面で選択した検索対象からmineoかeo電気でどちらを対象としているかを判定
		if ("1".equals(searchTrgt) || "2".equals(searchTrgt))
		{
			sendMailCd = MAIL_CD_KKM1000020;
		}
		else if ("3".equals(searchTrgt))
		{
			sendMailCd = MAIL_CD_KKM1000021;
		}
		
		// --------------------------------------
		// メール送信に必要な入力情報の取得処理
		// --------------------------------------
		// お客様一意照会
		List<HashMap<String, Object>> eck0011a010List =  new ArrayList<HashMap<String, Object>>();
		HashMap<String, Object> eck0011a010Map = new HashMap<String, Object>();
		eck0011a010List = getEck0011a010(handle, param, fixedText, sysid, JPCModelConstant.FUNC_CD_1);
		
		if (null != eck0011a010List && eck0011a010List.size() > 0)
		{
			eck0011a010Map = eck0011a010List.get(0);
		}
		
		custNm = (String)eck0011a010Map.get("cust_nm");
		
		
		// サービス申込時サービス契約一覧照会
		String firstMskmDtlNo = callEkk0081b019(handle, param, fixedText, svcKeiNoNet, JPCModelConstant.FUNC_CD_1);
		
		// サービス申込時サービス契約一覧照会で申込明細番号
		List<HashMap<String, Object>> eKK0021A010List = new ArrayList<HashMap<String, Object>>();
		if (!JKKStringUtil.isNullBlank(firstMskmDtlNo))
		{
			//申込明細一意照会
			eKK0021A010List = getMskmDtlNoIti(handle, param, fixedText, firstMskmDtlNo, JPCModelConstant.FUNC_CD_2);
		}
		
		if (null != eKK0021A010List && eKK0021A010List.size() > 0)
		{
			HashMap<String,Object> eKK0021A010Map = (HashMap<String,Object>)eKK0021A010List.get(0);
			mskmshoNo = JKKStringUtil.nullToBlank((String)eKK0021A010Map.get(EKK0021A010CBSMsg1List.MSKMSHO_NO));
		}
		
		// --------------------------------------
		// メール送信情報のマッピング処理
		// --------------------------------------
		// ユーザデータ情報
		targetMap = (HashMap)param.getData("MAIL_SEND_CC_INF");
		if (null == targetMap)
		{
			targetMap = new HashMap<String, Object>();
			param.setData("MAIL_SEND_CC_INF", targetMap);
		}
		else
		{
			targetMap.clear();
		}
		
		ArrayList<HashMap> ecc0021D010List1 = new ArrayList<HashMap>();
		ArrayList<HashMap> ecc0021D010List2 = new ArrayList<HashMap>();
		ArrayList<HashMap> ecc0021D010List3 = new ArrayList<HashMap>();
		ArrayList<HashMap> ecc0021D010List4 = new ArrayList<HashMap>();
		ArrayList<HashMap> ecc0021D010List5 = new ArrayList<HashMap>();
		
		HashMap list1Map = new HashMap();
		
		/** 第１層　共通パラメータ **/
		// メール送信情報登録マップ.メールコード
		targetMap.put(ECC0021D010CBSMsg.MAIL_CD, sendMailCd);
		// メール送信パターンコード　01:リアルタイム
		targetMap.put(ECC0021D010CBSMsg.MAIL_SEND_PATTERN_CD, "01");
		// メール機能パターンコード　1:リアルタイム　登録＆送信
		targetMap.put(ECC0021D010CBSMsg.FUNC_CODE, "1");
		
		/** 第２層　送信先一覧明細 **/
		// メールアドレスの設定を行う
		list1Map.put(ECC0021D010CBSMsg1List.MLAD, sendTrgtMlad);
		// メール設定フィールドコード　01:to
		list1Map.put(ECC0021D010CBSMsg1List.MLAD_SET_FIELD_CD, "01");
		ecc0021D010List1.add(list1Map);
		targetMap.put(ECC0021D010CBSMsg.ECC0021D010CBSMSG1LIST, ecc0021D010List1);
		
		/** 第２層　非定型文字列一覧明細 **/
		HashMap list3Map = new HashMap();
		HashMap list4Map = new HashMap();
		HashMap list5Map = new HashMap();
		HashMap list6Map = new HashMap();
		
		// list3Mapにお客様名を設定
		list3Map.put(ECC0021D010CBSMsg2List.TEXT_HTK_CKAM_MOJI, custNm);
		ecc0021D010List2.add(list3Map);
		
		// IT1-2018-0000137 DEL START
		//if ("1".equals(searchTrgt) || "2".equals(searchTrgt))
		//{
		// IT1-2018-0000137 DEL END
			// list4Mapにキャンペーン名称を設定
			list4Map.put(ECC0021D010CBSMsg2List.TEXT_HTK_CKAM_MOJI, cmpNm);
			ecc0021D010List2.add(list4Map);
			
			// list5Mapにeo光ネットの受付番号を設定
			list5Map.put(ECC0021D010CBSMsg2List.TEXT_HTK_CKAM_MOJI, mskmshoNo);
			ecc0021D010List2.add(list5Map);
		// IT1-2018-0000137 DEL START
		//}
		// IT1-2018-0000137 DEL END
		
		// list6Mapに画面で入力した検索対象情報を設定
		list6Map.put(ECC0021D010CBSMsg2List.TEXT_HTK_CKAM_MOJI, searchTrgtNm + "：" + searchKey);
		ecc0021D010List2.add(list6Map);
		
		/** 第２層　非定型文字列一覧明細 **/
		targetMap.put(ECC0021D010CBSMsg.ECC0021D010CBSMSG2LIST, ecc0021D010List2);
		/** 第２層　電子ファイル一覧明細（デフォルト／設定値なし） **/
		targetMap.put(ECC0021D010CBSMsg.ECC0021D010CBSMSG3LIST, ecc0021D010List3);
		/** 第２層　メール明細一覧明細（デフォルト／設定値なし） **/
		targetMap.put(ECC0021D010CBSMsg.ECC0021D010CBSMSG4LIST, ecc0021D010List4);
		/** 第２層　メールヘッダー一覧明細（デフォルト／設定値なし） **/
		targetMap.put(ECC0021D010CBSMsg.ECC0021D010CBSMSG5LIST, ecc0021D010List5);
		
	}
	
	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param mappingData マッピングデータ
	 * @param fixedText ユーザ定義文字列
	 * @param contents CAANMsgのコンテンツ
	 * @return CAANMsg
	 * @throws Throwable 例外が発生した場合
	 */
	private CAANMsg callSC(SessionHandle handle, ServiceComponentRequestInvoker scCall, 
			IRequestParameterReadWrite param, Object[][] mappingData,
			String fixedText, Object[][] contents) throws Throwable
	{
		// 上りマッピング処理
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);
		
		// サービスI/F呼出し実行
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		// SCからの戻り値からCAANMsgを取得
		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];
		
		// リターンコード取得
		Object returnCode = result.get(JCMConstants.RET_CD_INT_KEY);
		// ステータス取得
		int status = msg.getInt(JCMConstants.STATUS_INT_KEY);
		
		// エラー情報の設定
		editErrorInfo(param, templates, (Integer)returnCode, fixedText, contents);
		
		// エラー情報のマップを取得
		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));
		
		// 異常の場合、CCExceptionを生成してスローする
		if(!("0".equals(returnCode.toString()) && 0 == status))
		{
			throw new CCException("サービスコンポーネントエラー", new Exception());
		}
		
		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));
		
		// サービスインターフェイス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 (mappingData[i][1] instanceof CAANMsg[])
			{
				template.set((String)mappingData[i][0], (CAANMsg[])mappingData[i][1]);
			}
			else
			{
				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 CAANMsgクラス
	 * @param returnCode リターンコード
	 * @param fixedText ユーザ定義文字列
	 * @param contents CAANMsgのコンテンツ
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException リクエストパラメータの操作でエラーが発生した場合
	 */
	private IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param,
			CAANMsg[] templates, int returnCode, String fixedText, Object[][] contents) 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 (bpStatus < templateStatus)
		{
			// 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(fixedText);
		
		for (int i = 0; null != contents && i < contents.length ; i++)
		{
			String itemNm = (String)contents[i][0];
			if (itemNm.endsWith("_err"))
			{
				String errCd = (String)template.getString(itemNm);
				if (!JKKStringUtil.isNullBlank(errCd))
				{
					inMap.put(itemNm, errCd);
				}
			}
		}
		
		return param;
	}
	
	/**
	 * レスポンス項目を設定します。
	 * <br>
	 * @param ccMsg 個別割引適用可否照会・変更依頼CCマップ
	 * @param rsltCd 処理結果コード
	 */
	private void setResponse(Map<String, Object> ccMsg, String rsltCd)
	{
		// 処理結果コード
		ccMsg.put("rslt_cd", rsltCd);
	}

}
