/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKStbUcwkEoTvKktkSvcKeiCC
*	ソースファイル名：JKKStbUcwkEoTvKktkSvcKeiCC.java
*	作成者			：FJ
*	日付			：2011年07月28日
*＜機能概要＞
*	eo光テレビオプションチャンネル登録の共通コンポーネント
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/07/28	FJ			新規作成
*   v4.00.00	2012/10/19	FJ)辛	   【ANK-1191-00-00】対応
*   v4.01.00	2013/10/08	FJ)辛	   【OM-2013-0003014】対応
*   v5.00.00	2013/11/11	FJ)稲岡	   【OM-2013-0003779】対応
*   v6.00.00	2013/11/26	FJ)稲岡	   【OM-2013-0004305】対応
*   v6.00.01	2013/12/20	FJ)宇野	   【ANK-1672-00-00】対応
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;


import java.util.ArrayList;
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 com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.ejb.cbs.cbsmsg.ECK0011B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0161A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0161A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0341B017CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341B017CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0791A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0791A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKKA0020003CBSMsg;
import eo.ejb.cbs.cbsmsg.EKKA0020003CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKKA0020003CBSMsg2List;

/**
 * STBサービス契約内訳＜eo光TV＞機器提供サービス契約登録照査CC部品
 * <br>
 * @author 富士通
 */
public class JKKStbUcwkEoTvKktkSvcKeiCC extends AbstractCommonComponent
{
	/** 宅内機器異動コード：追加 */
	private static final String STB_IDO_DIV_ADD = "01";
	
	/** 宅内機器異動コード：交換 */
	private static final String STB_IDO_DIV_CHG = "02";
	
	/** 宅内機器異動コード：一部撤去 */
	private static final String STB_IDO_DIV_RMV = "03";
	
	private static final String KKTK_SVC_CD_STB  = "C009";
	private static final String KKTK_SVC_CD_BCAS = "C010";
	private static final String KKTK_SVC_CD_CCAS = "C011";
	private static final String KKTK_SVC_CD_VONU = "C013";
	
	/** テンプレートID(EKK0341A010) */
	private static final String TEMPLATE_ID_EKK0341A010 = "EKK0341A010";
	
	/** テンプレートID(EKK0161A010) */
	private static final String TEMPLATE_ID_EKK0161A010 = "EKK0161A010";
	
	/** テンプレートID(EKK0341B017) */
	private static final String TEMPLATE_ID_EKK0341B017 = "EKK0341B017";
	
	/** テンプレートID(EKK0791A010) */
	private static final String TEMPLATE_ID_EKK0791A010 = "EKK0791A010";
	
	/**
	 * CAANMsgに必要なデータのマッピング処理を行います。
	 * <br>
	 * <pre>
	 * --- データ構造（上り） ----
	 * fixedText（BP定義にて指定）
	 *      └┬ func_code ：機能コード（String）
	 *        ├ pcrs_cd   ：料金コースコード（String）
	 *        ├ svc_kei_no：サービス契約番号（String）
	 *        ├ ido_div   ：異動区分（String）
	 *        ├ kojiScope ：工事範囲コード（String）
	 *        ├ kojiak_no ：工事案件番号（String）
	 *        └ kikiList  ：機器一覧（ArrayList）
	 *               └┬ hambai_sbt_cd    ：販売種別コード（String）
	 *                 ├ hdd_capa_cd      ：HDD容量コード（String）
	 *                 ├ kktk_sbt_cd      ：機器提供種別（String）
	 *                 ├ kktk_svc_kei_no  ：機器提供サービス契約番号（String）
	 *                 ├ stb_ido_div      ：ＳＴＢ異動区分（String）
	 *                 ├ stb_sbt_cd       ：ＳＴＢ種別コード（String）
	 *                 ├ taknkiki_model_cd：宅内機器モデルコード（String）
	 *                 ├ type_number      ：型番号（String）
	 *                 └ tv_pcrs_cd       ：変更後テレビ料金コースコード（String）
	 *                 
	 * その他：ワーク領域に「mskm_dtl_no」
	 * 
	 * --- データ構造（上り） ----
	 * fixedText（BP定義にて指定）
	 *      └─ course_grp_unmatch_flg ：コースコードアンマッチフラグ（String）- （１：エラー　０：正常）
	 *      
	 * </pre>
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return パラメータマップ
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite stbUcwkEoTvKktkSvcKei(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
		throws Throwable
	{
		
		HashMap inMap = (HashMap)(param.getData(fixedText));
		if (inMap == null)
		{
			return param;
		}
		
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		inMap.put("course_grp_unmatch_flg", "0");
		
		// 関連チェック（サービスのコースと内訳のコース一致性チェック）
		
		String svcCourceCd = (String) inMap.get("pcrs_cd");
		
		// ***** EKK0791A010（機器提供サービス契約一意照会）*****
		CAANMsg ekk0791a010IN = new CAANMsg(EKK0791A010CBSMsg.class.getName());
		ekk0791a010IN.set(EKK0791A010CBSMsg.TEMPLATEID,       TEMPLATE_ID_EKK0791A010);
		ekk0791a010IN.set(EKK0791A010CBSMsg.FUNC_CODE,        "2");
		ekk0791a010IN.set(EKK0791A010CBSMsg.KEY_PCRS_CD,      svcCourceCd);
		ekk0791a010IN.set(EKK0791A010CBSMsg.KEY_RSV_APLY_YMD, JPCBPCommon.getOpeDate(null));
		CAANMsg[] ekk0791a010cbsMsg1list 
						= callSC(handle, scCall, param, fixedText, ekk0791a010IN).getCAANMsgList(EKK0791A010CBSMsg.EKK0791A010CBSMSG1LIST);
		
		String svcCourceGroupCd = ekk0791a010cbsMsg1list[0].getString(EKK0791A010CBSMsg1List.TV_COURSE_GRP_CD);
		if (svcCourceGroupCd == null)
		{
			svcCourceGroupCd = "";
		}
		
		List kikiList = (ArrayList)inMap.get("kikiList");
		// ＳＴＢ変更申込情報件数分、処理を繰り返し行う。
		for (int i = 0; i < kikiList.size(); i++)
		{
			HashMap<String, Object> stbdata = (HashMap<String, Object>) kikiList.get(i);
			String tvPcrsCd = (String) stbdata.get("tv_pcrs_cd");
			if (tvPcrsCd != null && !"".equals(tvPcrsCd))
			{
				// ***** EKK0791A010（機器提供サービス契約一意照会）*****
				CAANMsg ekk0791a010IN_STB = new CAANMsg(EKK0791A010CBSMsg.class.getName());
				ekk0791a010IN_STB.set(EKK0791A010CBSMsg.TEMPLATEID,       TEMPLATE_ID_EKK0791A010);
				ekk0791a010IN_STB.set(EKK0791A010CBSMsg.FUNC_CODE,        "2");
				ekk0791a010IN_STB.set(EKK0791A010CBSMsg.KEY_PCRS_CD,      tvPcrsCd);
				ekk0791a010IN_STB.set(EKK0791A010CBSMsg.KEY_RSV_APLY_YMD, JPCBPCommon.getOpeDate(null));
				CAANMsg[] ekk0791a010cbsMsg1list_STB 
								= callSC(handle, scCall, param, fixedText, ekk0791a010IN_STB).getCAANMsgList(EKK0791A010CBSMsg.EKK0791A010CBSMSG1LIST);
				
				if (!svcCourceGroupCd.equals(ekk0791a010cbsMsg1list_STB[0].getString(EKK0791A010CBSMsg1List.TV_COURSE_GRP_CD)))
				{
					inMap.put("course_grp_unmatch_flg", "1");
				}
			}
		}
		
		// チェックのみ（機能コード：２）の場合は、上記EKK0181D010にてサービス契約内訳番号
		// が取得できないため、入力チェックのみを実施する。
		if ("2".equals(inMap.get("func_code")))
		{
			return param;
		}
		
		Map workMap = (Map)param.getMappingWorkArea();
		if (workMap == null)
		{
			return param;
		}
		// 申込明細番号
		String mskmDtlNo = (String) workMap.get("mskm_dtl_no");
		
		HashMap tmpWorkMap = (HashMap)(param.getData("WORK"));
		
		// ***** 現在契約中の機器提供サービス契約を全て取得する。 *****
		// EKK0341B017は「サービス契約（サービス契約内訳含む）」に紐づく機器及び、回線に紐づく機器を取得する。
		
		// ***** EKK0341B017（機器提供サービス契約一意照会）*****
		CAANMsg ekk0341b017IN = new CAANMsg(EKK0341B017CBSMsg.class.getName());
		ekk0341b017IN.set(EKK0341B017CBSMsg.TEMPLATEID,          TEMPLATE_ID_EKK0341B017);
		ekk0341b017IN.set(EKK0341B017CBSMsg.FUNC_CODE,           inMap.get("func_code"));
		ekk0341b017IN.set(EKK0341B017CBSMsg.KEY_SVC_KEI_NO,      inMap.get("svc_kei_no"));
		CAANMsg[] ekk0341b017cbsMsg1list 
						= callSC(handle, scCall, param, fixedText, ekk0341b017IN).getCAANMsgList(EKK0341B017CBSMsg.EKK0341B017CBSMSG1LIST);
		
		// 現在契約中の「V-ONU」機器情報
		CAANMsg vONUdata = null;
		HashMap<String, HashMap<String, CAANMsg>> kikiXucwkMap = new HashMap<String, HashMap<String, CAANMsg>>();
		for (int i=0; i<ekk0341b017cbsMsg1list.length; i++)
		{
			String kktkSbtCd = ekk0341b017cbsMsg1list[i].getString(EKK0341B017CBSMsg1List.CUR_KKTK_SVC_CD);
			// 機器が「V-ONU」である場合
			if (KKTK_SVC_CD_VONU.equals(kktkSbtCd))
			{
				vONUdata = ekk0341b017cbsMsg1list[i];
				continue;
			}
			// 機器が「B-CAS」「C-CAS」である場合
			else if (KKTK_SVC_CD_STB.equals(kktkSbtCd) || KKTK_SVC_CD_BCAS.equals(kktkSbtCd) || KKTK_SVC_CD_CCAS.equals(kktkSbtCd))
			{
				String svcKeiUcwkNo = ekk0341b017cbsMsg1list[i].getString(EKK0341B017CBSMsg1List.CUR_SVC_KEI_UCWK_NO);
				if (!kikiXucwkMap.containsKey(svcKeiUcwkNo))
				{
					kikiXucwkMap.put(svcKeiUcwkNo, new HashMap<String, CAANMsg>());
				}
				kikiXucwkMap.get(svcKeiUcwkNo).put(kktkSbtCd, ekk0341b017cbsMsg1list[i]);
			}
		}
		
		List<HashMap<String, Object>> kikiAddchildList = new ArrayList<HashMap<String, Object>>();
		List<HashMap<String, Object>> kikiChgchildList = new ArrayList<HashMap<String, Object>>();
		List<HashMap<String, Object>> kikiRmvchildList = new ArrayList<HashMap<String, Object>>();
		
		// ＳＴＢ変更申込情報件数分、処理を繰り返し行う。
		for (int i = 0; i < kikiList.size(); i++)
		{
			HashMap<String, Object> stbdata = (HashMap<String, Object>) kikiList.get(i);
			
			String stbIdoDiv = (String) stbdata.get("stb_ido_div");
			
			// 機器追加の場合
			if (STB_IDO_DIV_ADD.equals(stbIdoDiv))
			{
				HashMap<String, Object> mp = new HashMap<String, Object>();
				mp.put("kktk_svc_cd",       KKTK_SVC_CD_STB);
				mp.put("haiso_way_cd",      "2");
				mp.put("sechi_ruta_cd",     "");	// TVのみであるため、設置ルータコードは「""(空文字）」とする。
				mp.put("taknkiki_ido_cd",   stbIdoDiv);
				mp.put("taknkiki_model_cd", stbdata.get("taknkiki_model_cd"));
				mp.put("hambai_sbt_cd",     stbdata.get("hambai_sbt_cd"));
				mp.put("stb_sbt_cd",        stbdata.get("stb_sbt_cd"));
				mp.put("hdd_capa_cd",       stbdata.get("hdd_capa_cd"));
				mp.put("tv_pcrs_cd",        stbdata.get("tv_pcrs_cd"));
				
				kikiAddchildList.add(mp);
			}
			// 機器交換の場合
			else if (STB_IDO_DIV_CHG.equals(stbIdoDiv))
			{
				// コース変更処理ではV-ONU以外の機器の交換は受け付けない
				
//				// ***** EKK0341A010（機器提供サービス契約一意照会）*****
//				CAANMsg ekk0341a010IN = new CAANMsg(EKK0341A010CBSMsg.class.getName());
//				ekk0341a010IN.set(EKK0341A010CBSMsg.TEMPLATEID,          TEMPLATE_ID_EKK0341A010);
//				ekk0341a010IN.set(EKK0341A010CBSMsg.FUNC_CODE,           "2");
//				ekk0341a010IN.set(EKK0341A010CBSMsg.KEY_KKTK_SVC_KEI_NO, stbdata.get("kktk_svc_kei_no"));
//				ekk0341a010IN.set(EKK0341A010CBSMsg.KEY_RSV_APLY_YMD,    JPCBPCommon.getOpeDate(null));
//				CAANMsg[] ekk0341a010cbsMsg1list 
//								= callSC(handle, scCall, param, fixedText, ekk0341a010IN).getCAANMsgList(EKK0341A010CBSMsg.EKK0341A010CBSMSG1LIST);
//				
//				String svcKeiUcwkNo = ekk0341a010cbsMsg1list[0].getString(EKK0341A010CBSMsg1List.SVC_KEI_UCWK_NO);
//				
//				// TVコースコードが未指定の場合は、変更前のTVコースコード（サービス契約内訳の料金コースコード）を取得する。
//				String tvCourceCd = (String) stbdata.get("tv_pcrs_cd");
//				if (tvCourceCd == null)
//				{
//					// ***** EKK0161A010（サービス契約内訳一意照会）*****
//					CAANMsg ekk0161a010IN = new CAANMsg(EKK0161A010CBSMsg.class.getName());
//					ekk0161a010IN.set(EKK0161A010CBSMsg.TEMPLATEID,          TEMPLATE_ID_EKK0161A010);
//					ekk0161a010IN.set(EKK0161A010CBSMsg.FUNC_CODE,           "2");
//					ekk0161a010IN.set(EKK0161A010CBSMsg.KEY_SVC_KEI_UCWK_NO, ekk0341a010cbsMsg1list[0].getString(EKK0341A010CBSMsg1List.SVC_KEI_UCWK_NO));
//					ekk0161a010IN.set(EKK0161A010CBSMsg.KEY_RSV_APLY_YMD,    JPCBPCommon.getOpeDate(null));
//					CAANMsg[] ekk0161a010cbsMsg1list 
//									= callSC(handle, scCall, param, fixedText, ekk0161a010IN).getCAANMsgList(EKK0161A010CBSMsg.EKK0161A010CBSMSG1LIST);
//					
//					tvCourceCd = ekk0161a010cbsMsg1list[0].getString(EKK0161A010CBSMsg1List.PCRS_CD);
//				}
//				
//				
//				// *** CCASの工事連携用情報を設定する ***
//				HashMap<String, CAANMsg> ucwkMap = kikiXucwkMap.get(svcKeiUcwkNo);
//				String kktksbt_cd = "02";
//				if (ucwkMap.containsKey(KKTK_SVC_CD_STB))
//				{
//					kktksbt_cd = ucwkMap.get(KKTK_SVC_CD_STB).getString(EKK0341B017CBSMsg1List.CUR_KKTK_SBT_CD);
//				}
//				
//				HashMap<String, Object> mp = new HashMap<String, Object>();
//				mp.put("kktk_svc_kei_no",   stbdata.get("kktk_svc_kei_no"));
//				mp.put("kktk_gene_add_dtm", ekk0341a010cbsMsg1list[0].getObject(EKK0341A010CBSMsg1List.GENE_ADD_DTM));
//				mp.put("kktk_sbt_cd",       kktksbt_cd);
//				mp.put("taknkiki_model_cd", stbdata.get("taknkiki_model_cd"));
//				mp.put("hambai_sbt_cd",     stbdata.get("hambai_sbt_cd"));
//				mp.put("stb_sbt_cd",        stbdata.get("stb_sbt_cd"));
//				mp.put("hdd_capa_cd",       stbdata.get("hdd_capa_cd"));
//				mp.put("taknkiki_ido_cd",   stbIdoDiv);
//				mp.put("pcrs_cd_tv",        tvCourceCd);
//				
//				kikiChgchildList.add(mp);
//				
//				// *** 工事の連携用情報を設定 ***
//				setKojiRenkeiKikiData(handle, param, fixedText, scCall, ekk0341a010cbsMsg1list[0], stbIdoDiv, tvCourceCd);
//				
//				if (ucwkMap.containsKey(KKTK_SVC_CD_CCAS))
//				{
//					// ***** EKK0341A010（機器提供サービス契約一意照会）*****
//					CAANMsg ekk0341a010IN_cas = new CAANMsg(EKK0341A010CBSMsg.class.getName());
//					ekk0341a010IN_cas.set(EKK0341A010CBSMsg.TEMPLATEID,          TEMPLATE_ID_EKK0341A010);
//					ekk0341a010IN_cas.set(EKK0341A010CBSMsg.FUNC_CODE,           "2");
//					ekk0341a010IN_cas.set(EKK0341A010CBSMsg.KEY_KKTK_SVC_KEI_NO, ucwkMap.get(KKTK_SVC_CD_CCAS).getString(EKK0341B017CBSMsg1List.CUR_KKTK_SVC_KEI_NO));
//					ekk0341a010IN_cas.set(EKK0341A010CBSMsg.KEY_RSV_APLY_YMD,    JPCBPCommon.getOpeDate(null));
//					CAANMsg[] ekk0341a010cbsMsg1list_cas 
//									= callSC(handle, scCall, param, fixedText, ekk0341a010IN_cas).getCAANMsgList(EKK0341A010CBSMsg.EKK0341A010CBSMSG1LIST);
//					
//					setKojiRenkeiKikiData(handle, param, fixedText, scCall, ekk0341a010cbsMsg1list_cas[0], stbIdoDiv, "");
//				}
//【ANK-1191-00-00】START=================================================================================================================================================================
//				if (ucwkMap.containsKey(KKTK_SVC_CD_BCAS))
//				{
//					// ***** EKK0341A010（機器提供サービス契約一意照会）*****
//					CAANMsg ekk0341a010IN_cas = new CAANMsg(EKK0341A010CBSMsg.class.getName());
//					ekk0341a010IN_cas.set(EKK0341A010CBSMsg.TEMPLATEID,          TEMPLATE_ID_EKK0341A010);
//					ekk0341a010IN_cas.set(EKK0341A010CBSMsg.FUNC_CODE,           "2");
//					ekk0341a010IN_cas.set(EKK0341A010CBSMsg.KEY_KKTK_SVC_KEI_NO, ucwkMap.get(KKTK_SVC_CD_BCAS).getString(EKK0341B017CBSMsg1List.CUR_KKTK_SVC_KEI_NO));
//					ekk0341a010IN_cas.set(EKK0341A010CBSMsg.KEY_RSV_APLY_YMD,    JPCBPCommon.getOpeDate(null));
//					CAANMsg[] ekk0341a010cbsMsg1list_cas 
//									= callSC(handle, scCall, param, fixedText, ekk0341a010IN_cas).getCAANMsgList(EKK0341A010CBSMsg.EKK0341A010CBSMSG1LIST);
//					
//					setKojiRenkeiKikiData(handle, param, fixedText, scCall, ekk0341a010cbsMsg1list_cas[0], stbIdoDiv, "");
//				}
//【ANK-1191-00-00】END===================================================================================================================================================================
			}
			// 一部撤去の場合
			else if (STB_IDO_DIV_RMV.equals(stbdata.get("stb_ido_div")))
			{
				// ***** EKK0341A010（機器提供サービス契約一意照会）*****
				CAANMsg ekk0341a010IN = new CAANMsg(EKK0341A010CBSMsg.class.getName());
				ekk0341a010IN.set(EKK0341A010CBSMsg.TEMPLATEID,          TEMPLATE_ID_EKK0341A010);
				ekk0341a010IN.set(EKK0341A010CBSMsg.FUNC_CODE,           "2");
				ekk0341a010IN.set(EKK0341A010CBSMsg.KEY_KKTK_SVC_KEI_NO, stbdata.get("kktk_svc_kei_no"));
				ekk0341a010IN.set(EKK0341A010CBSMsg.KEY_RSV_APLY_YMD,    JPCBPCommon.getOpeDate(null));
				CAANMsg[] ekk0341a010cbsMsg1list 
								= callSC(handle, scCall, param, fixedText, ekk0341a010IN).getCAANMsgList(EKK0341A010CBSMsg.EKK0341A010CBSMSG1LIST);
				
				// ***** EKK0161A010（サービス契約内訳一意照会）*****
				CAANMsg ekk0161a010IN = new CAANMsg(EKK0161A010CBSMsg.class.getName());
				ekk0161a010IN.set(EKK0161A010CBSMsg.TEMPLATEID,          TEMPLATE_ID_EKK0161A010);
				ekk0161a010IN.set(EKK0161A010CBSMsg.FUNC_CODE,           "2");
				ekk0161a010IN.set(EKK0161A010CBSMsg.KEY_SVC_KEI_UCWK_NO, ekk0341a010cbsMsg1list[0].getString(EKK0341A010CBSMsg1List.SVC_KEI_UCWK_NO));
				ekk0161a010IN.set(EKK0161A010CBSMsg.KEY_RSV_APLY_YMD,    JPCBPCommon.getOpeDate(null));
				CAANMsg[] ekk0161a010cbsMsg1list 
								= callSC(handle, scCall, param, fixedText, ekk0161a010IN).getCAANMsgList(EKK0161A010CBSMsg.EKK0161A010CBSMSG1LIST);
				
				String tvCourceCd = ekk0161a010cbsMsg1list[0].getString(EKK0161A010CBSMsg1List.PCRS_CD);
				
				HashMap<String, Object> mp = new HashMap<String, Object>();
				mp.put("kktk_svc_cd",            "");
				mp.put("newTaknkikiIdo",         stbdata.get("stb_ido_div"));
				mp.put("oldTaknkikiIdo",         "");
				mp.put("svc_endymd",             inMap.get("stb_tekkyo_ymd"));
				mp.put("pnlty_hassei_cd",        "");
				mp.put("ido_div",                inMap.get("ido_div"));
				mp.put("hmpin_uk_ymd",           inMap.get("stb_tekkyo_ymd"));
				mp.put("add_optnty_kei_ido_div", inMap.get("ido_div"));
				mp.put("add_optnty_kei_ido_dtm", JPCBPCommon.getOpeDateTimeStamp(null));
				mp.put("load_oya_svkei_no",      inMap.get("svc_kei_no"));
				mp.put("svc_chrg_endymd",         inMap.get("stb_tekkyo_ymd"));
				mp.put("kaihk_ymd",              JPCBPCommon.getOpeDate(null));
				mp.put("rsv_aply_ymd",           JPCBPCommon.getOpeDate(null));
				mp.put("svc_kei_ucwk_no",        ekk0341a010cbsMsg1list[0].getObject(EKK0341A010CBSMsg1List.SVC_KEI_UCWK_NO));
				mp.put("kktk_svc_kei_no",        ekk0341a010cbsMsg1list[0].getObject(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO));
				mp.put("kktk_sbt_cd",            ekk0341a010cbsMsg1list[0].getObject(EKK0341A010CBSMsg1List.KKTK_SBT_CD));
				mp.put("kiki_seizo_no",          ekk0341a010cbsMsg1list[0].getObject(EKK0341A010CBSMsg1List.KIKI_SEIZO_NO));
				mp.put("taknkiki_model",         ekk0341a010cbsMsg1list[0].getObject(EKK0341A010CBSMsg1List.TAKNKIKI_MODEL_CD));
				mp.put("taknkiki_sbt_cd",        ekk0341a010cbsMsg1list[0].getObject(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD));
				mp.put("kktk_upd_dtm",           ekk0341a010cbsMsg1list[0].getObject(EKK0341A010CBSMsg1List.UPD_DTM));
				mp.put("svc_kei_ucwk_upd_dtm",   tmpWorkMap.get("work_upd_dtm"));
				mp.put("gene_add_dtm",           ekk0341a010cbsMsg1list[0].getObject(EKK0341A010CBSMsg1List.GENE_ADD_DTM));
				mp.put("stb_id",                 inMap.get("stb_id"));
				mp.put("bcas_id",                inMap.get("bcas_id"));
				mp.put("ccas_id",                inMap.get("ccas_id"));
				
				kikiRmvchildList.add(mp);
				
				// *** 工事の連携用情報を設定 ***
				setKojiRenkeiKikiData(handle, param, fixedText, scCall, ekk0341a010cbsMsg1list[0], stbIdoDiv, tvCourceCd);
				
				// ** BCAS/CCASのデータ取得 **
				HashMap<String, CAANMsg> ucwkKikiList = kikiXucwkMap.get(ekk0341a010cbsMsg1list[0].getObject(EKK0341A010CBSMsg1List.SVC_KEI_UCWK_NO));
				if (ucwkKikiList != null)
				{
					Iterator<String> it = ucwkKikiList.keySet().iterator();
					while (it.hasNext())
					{
						String key = it.next();
						String kktkSbtCd = ucwkKikiList.get(key).getString(EKK0341B017CBSMsg1List.CUR_KKTK_SVC_CD);
						if (KKTK_SVC_CD_BCAS.equals(kktkSbtCd) || KKTK_SVC_CD_CCAS.equals(kktkSbtCd))
						{
							// ***** EKK0341A010（機器提供サービス契約一意照会）*****
							CAANMsg ekk0341a010IN_CAS = new CAANMsg(EKK0341A010CBSMsg.class.getName());
							ekk0341a010IN_CAS.set(EKK0341A010CBSMsg.TEMPLATEID,          TEMPLATE_ID_EKK0341A010);
							ekk0341a010IN_CAS.set(EKK0341A010CBSMsg.FUNC_CODE,           "1");
							ekk0341a010IN_CAS.set(EKK0341A010CBSMsg.KEY_KKTK_SVC_KEI_NO, ucwkKikiList.get(key).getString(EKK0341B017CBSMsg1List.CUR_KKTK_SVC_KEI_NO));
							ekk0341a010IN_CAS.set(EKK0341A010CBSMsg.KEY_GENE_ADD_DTM,    ucwkKikiList.get(key).getString(EKK0341B017CBSMsg1List.CUR_KK0341_GENE_ADD_DTM));
							CAANMsg[] ekk0341a010cbsMsg1list_cas
											= callSC(handle, scCall, param, fixedText, ekk0341a010IN_CAS).getCAANMsgList(EKK0341A010CBSMsg.EKK0341A010CBSMSG1LIST);
							
							HashMap<String, Object> casCardMp = new HashMap<String, Object>();
							casCardMp.put("kktk_svc_cd",            "");
							casCardMp.put("newTaknkikiIdo",         stbdata.get("stb_ido_div"));
							casCardMp.put("oldTaknkikiIdo",         "");
							casCardMp.put("svc_endymd",             inMap.get("stb_tekkyo_ymd"));
							casCardMp.put("pnlty_hassei_cd",        "");
							casCardMp.put("ido_div",                inMap.get("ido_div"));
							casCardMp.put("hmpin_uk_ymd",            inMap.get("stb_tekkyo_ymd"));
							casCardMp.put("add_optnty_kei_ido_div", inMap.get("ido_div"));
							casCardMp.put("add_optnty_kei_ido_dtm", JPCBPCommon.getOpeDateTimeStamp(null));
							casCardMp.put("load_oya_svkei_no",      inMap.get("svc_kei_no"));
							casCardMp.put("svc_chrg_endymd",        inMap.get("stb_tekkyo_ymd"));
							casCardMp.put("kaihk_ymd",              JPCBPCommon.getOpeDate(null));
							casCardMp.put("rsv_aply_ymd",           JPCBPCommon.getOpeDate(null));
							casCardMp.put("svc_kei_ucwk_no",        ekk0341a010cbsMsg1list_cas[0].getObject(EKK0341A010CBSMsg1List.SVC_KEI_UCWK_NO));
							casCardMp.put("kktk_svc_kei_no",        ekk0341a010cbsMsg1list_cas[0].getObject(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO));
							casCardMp.put("kktk_sbt_cd",            ekk0341a010cbsMsg1list_cas[0].getObject(EKK0341A010CBSMsg1List.KKTK_SBT_CD));
							casCardMp.put("kiki_seizo_no",          ekk0341a010cbsMsg1list_cas[0].getObject(EKK0341A010CBSMsg1List.KIKI_SEIZO_NO));
							casCardMp.put("taknkiki_model",         ekk0341a010cbsMsg1list_cas[0].getObject(EKK0341A010CBSMsg1List.TAKNKIKI_MODEL_CD));
							casCardMp.put("kktk_upd_dtm",           ekk0341a010cbsMsg1list_cas[0].getObject(EKK0341A010CBSMsg1List.UPD_DTM));
							casCardMp.put("taknkiki_sbt_cd",         ekk0341a010cbsMsg1list_cas[0].getObject(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD));
							casCardMp.put("svc_kei_ucwk_upd_dtm",   tmpWorkMap.get("work_upd_dtm"));
							casCardMp.put("gene_add_dtm",           ekk0341a010cbsMsg1list_cas[0].getObject(EKK0341A010CBSMsg1List.GENE_ADD_DTM));
							
							kikiRmvchildList.add(casCardMp);
							
							// *** 工事の連携用情報を設定 ***
							setKojiRenkeiKikiData(handle, param, fixedText, scCall, ekk0341a010cbsMsg1list_cas[0], stbIdoDiv, "");
						}
					}
				}
			}
		}
		
		// ******* 工事範囲のチェック *******
		// 工事範囲が「V-ONU変更」を含む場合
		if ("220".equals(inMap.get("kojiScope")) || "230".equals(inMap.get("kojiScope")))
		{
			CAANMsg[] ekk0341a010cbsMsg1list = null;
			
			if (vONUdata != null)
			{
				// ***** EKK0341A010（機器提供サービス契約一意照会）*****
				CAANMsg ekk0341a010IN = new CAANMsg(EKK0341A010CBSMsg.class.getName());
				ekk0341a010IN.set(EKK0341A010CBSMsg.TEMPLATEID,          TEMPLATE_ID_EKK0341A010);
				ekk0341a010IN.set(EKK0341A010CBSMsg.FUNC_CODE,           "1");
				ekk0341a010IN.set(EKK0341A010CBSMsg.KEY_KKTK_SVC_KEI_NO, vONUdata.getString(EKK0341B017CBSMsg1List.CUR_KKTK_SVC_KEI_NO));
				ekk0341a010IN.set(EKK0341A010CBSMsg.KEY_GENE_ADD_DTM,    vONUdata.getString(EKK0341B017CBSMsg1List.CUR_KK0341_GENE_ADD_DTM));
				ekk0341a010cbsMsg1list 
								= callSC(handle, scCall, param, fixedText, ekk0341a010IN).getCAANMsgList(EKK0341A010CBSMsg.EKK0341A010CBSMSG1LIST);
			}
			
			// ONUを取得し、機器変更CCのデータとして格納する。
			if (vONUdata != null && "100".equals(ekk0341a010cbsMsg1list[0].getString(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_STAT)))
			{
				debugLog("サービス提供中のONUが存在するため、VONUを機器変更");
				
				HashMap<String, Object> mp = new HashMap<String, Object>();
				mp.put("kktk_svc_kei_no",   ekk0341a010cbsMsg1list[0].getString(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO));
				mp.put("kktk_gene_add_dtm", ekk0341a010cbsMsg1list[0].getString(EKK0341A010CBSMsg1List.GENE_ADD_DTM));
				mp.put("kktk_sbt_cd",       ekk0341a010cbsMsg1list[0].getString(EKK0341A010CBSMsg1List.KKTK_SBT_CD));
//				【OM-2013-0003014】対応
				mp.put("course_changed",      "1");
//				【OM-2013-0003014】対応
				kikiChgchildList.add(mp);
			}
			// サービス提供中のONUが存在しない場合
			else
			{
				debugLog("サービス提供中のONUが存在しないため、VONUの機器を追加");
				
				HashMap<String, Object> mp = new HashMap<String, Object>();
				// 配送方法区分コード
				mp.put("haiso_way_cd", "2");
				// 機器提供サービスコード
				mp.put("kktk_svc_cd", KKTK_SVC_CD_VONU);
				kikiAddchildList.add(mp);
			}
		}
		
		// ******* 機器追加 *******
		if (kikiAddchildList.size() > 0)
		{
			// ** 機器追加CCの呼出 **
			debugLog("機器追加-開始");
			
			param.getMappingWorkArea().put("KK_COM_SVC_UP_DTM", tmpWorkMap.get("work_upd_dtm"));
			
			JKKKikiAddCC kikiAddCC = new JKKKikiAddCC();
			
			HashMap<String, Object> kikiAddCCMap = new HashMap<String, Object>();
			param.setData("kikiAddCC", kikiAddCCMap);
			kikiAddCCMap.put("func_code",   inMap.get("func_code"));
			kikiAddCCMap.put("kojifixtext", inMap.get("kojifixtext"));
			kikiAddCCMap.put("svc_kei_no",  inMap.get("svc_kei_no"));
			kikiAddCCMap.put("stdardymd",   JPCBPCommon.getOpeDate(null));
			kikiAddCCMap.put("ido_div",     inMap.get("ido_div"));
			kikiAddCCMap.put("kojiAkNo",    inMap.get("kojiak_no"));
			kikiAddCCMap.put("kiki_list",   kikiAddchildList);
			kikiAddCCMap.put("mskm_dtl_no", mskmDtlNo);
			
			kikiAddCC.addKikiInfo(handle, param, "kikiAddCC");
			
			HashMap<String, Object> kikimap = (HashMap<String, Object>)kikiAddchildList.get(0);
			
			// 登録された機器がSTBの場合のみ割引CC実行を実行する
			if(KKTK_SVC_CD_STB.equals((String)kikimap.get("kktk_svc_cd")))
			{
/* ++++++++++ v5.00.00 追加開始 ++++++++++ */
				// サービス契約内訳<eo光TV>登録の割引CC実行
				execWrisvcAutoAply(handle, param, inMap, (String)workMap.get("mskm_no"));
/* ++++++++++ v5.00.00 追加終了 ++++++++++ */
			}
			
			param.removeData("kikiAddCC");
			
			debugLog("機器追加-終了");
			
			tmpWorkMap.put("work_upd_dtm", param.getMappingWorkArea().get("KK_COM_SVC_UP_DTM"));
		}
		
		// ******* 機器変更 *******
		if (kikiChgchildList.size() > 0)
		{
			param.getMappingWorkArea().put("mskm_dtl_no", mskmDtlNo);
			
			// ** 機器変更CCの呼出 **
			debugLog("機器変更-開始");
			
			JKKKikiChgCC kikiChgCC = new JKKKikiChgCC();
			HashMap<String, Object> kikiChgCCMap = new HashMap<String, Object>();
			param.setData("kikiChgCC",         kikiChgCCMap);
			kikiChgCCMap.put("kojifixtext",    inMap.get("kojifixtext"));
			kikiChgCCMap.put("upd_dtm",        tmpWorkMap.get("work_upd_dtm"));
			kikiChgCCMap.put("key_svc_kei_no", inMap.get("svc_kei_no"));
			kikiChgCCMap.put("func_code",      inMap.get("func_code"));
			kikiChgCCMap.put("ido_div",        inMap.get("ido_div"));
			kikiChgCCMap.put("chg_kiki_list",  kikiChgchildList);
			
			kikiChgCC.chgKikiInfo(handle, param, "kikiChgCC");
			param.removeData("kikiChgCC");
			
			debugLog("機器変更-終了");
			
			tmpWorkMap.put("work_upd_dtm", param.getMappingWorkArea().get("KK_COM_SVC_UP_DTM"));
		}
		
		// ******* 機器撤去 *******
		if (kikiRmvchildList.size() > 0)
		{
			param.getMappingWorkArea().put("mskm_dtl_no", mskmDtlNo);
			param.getMappingWorkArea().put("KK_COM_SVC_UP_DTM", tmpWorkMap.get("work_upd_dtm"));
			
			debugLog("機器撤去-開始");
			
			JKKKojiKikiUpdCC kojiKikiUpdCC = new JKKKojiKikiUpdCC();
			HashMap<String, Object> kikiRmvCCMap = new HashMap<String, Object>();
			param.setData("kikiRmvCC", kikiRmvCCMap);
			kikiRmvCCMap.put("func_code",   inMap.get("func_code"));
			kikiRmvCCMap.put("kojifixtext", inMap.get("kojifixtext"));
			kikiRmvCCMap.put("kktkSvcList", kikiRmvchildList);
			
			kojiKikiUpdCC.updKojiKiki(handle, param, "kikiRmvCC");
			param.removeData("kikiRmvCC");
			
			// mura追加
			// 視聴制御に対する撤去オーダー
			// WCサービスＩＦが複数件に対応していないためコメントアウト
			// sendWctrTekkyoOrder(handle,param,inMap,kikiRmvchildList);
			
/* ++++++++++ v6.00.00 削除開始 ++++++++++ */
//			// 一時金設定/契約一時金の登録
//			addIchijikin(handle, param, inMap,kikiRmvchildList);
/* ++++++++++ v6.00.00 削除終了 ++++++++++ */
			
			debugLog("機器撤去-終了");
			
			tmpWorkMap.put("work_upd_dtm", param.getMappingWorkArea().get("KK_COM_SVC_UP_DTM"));
		}
		

		return param;
	}
	
	private void setKojiRenkeiKikiData(SessionHandle handle,
										IRequestParameterReadWrite param,
										String fixedText,
										ServiceComponentRequestInvoker scCall,
										CAANMsg kikiInfo,
										String stbIdoDiv,
										String tvCourceCd) throws Exception
	{
		
		HashMap<String, Object> inMap = (HashMap<String, Object>) param.getData(fixedText);
		// 工事連携データ格納用Mapキー
		// 工事連携CCで使用するMap
		HashMap<String, Object> kktkSvcOutMap = (HashMap<String, Object>)param.getData(inMap.get("kojifixtext"));
		ArrayList<Map<String, Object>> kktkSvcOutList = (ArrayList<Map<String, Object>>)kktkSvcOutMap.get("kktkSvcOutList");
		
		HashMap<String, Object> mp = new HashMap<String, Object>();
		
		mp.put("taknkiki_sbt_cd",      kikiInfo.getString(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD));
		mp.put("kktk_svc_kei_no",      kikiInfo.getString(EKK0341A010CBSMsg1List.KKTK_SVC_KEI_NO));
		mp.put("taknkiki_model_cd",    kikiInfo.getString(EKK0341A010CBSMsg1List.TAKNKIKI_MODEL_CD));
		mp.put("kiki_seizo_no",        kikiInfo.getString(EKK0341A010CBSMsg1List.KIKI_SEIZO_NO));
		mp.put("hdd_capa_cd",          kikiInfo.getString(EKK0341A010CBSMsg1List.HDD_CAPA_CD));
		mp.put("stb_kei_tv_course_cd", tvCourceCd);
		
		// ** 機器がSTBである場合のみ設定される **
		String stb_id = "";
		
		if ("C009".equals(kikiInfo.getString(EKK0341A010CBSMsg1List.KKTK_SVC_CD)))
		{
			mp.put("taknkiki_ido_cd", stbIdoDiv);
			// 宅内の照会を行い、STBIDを取得する。
			CAANMsg msgEKKA0020003 = new CAANMsg(EKKA0020003CBSMsg.class.getName());
			CAANMsg msgEKKA0020003List1 = new CAANMsg(EKKA0020003CBSMsg1List.class.getName());
			CAANMsg[] msglist = new CAANMsg[1];
			
			msgEKKA0020003.set(EKKA0020003CBSMsg.FUNC_CODE, "1");

			// 宅内機器型式コード、機器製造番号
			msgEKKA0020003List1.set(EKKA0020003CBSMsg1List.KEY_TK_MDL_CD, kikiInfo.getString(EKK0341A010CBSMsg1List.TAKNKIKI_MODEL_CD));
			msgEKKA0020003List1.set(EKKA0020003CBSMsg1List.KEY_KK_SEIZO_NO, kikiInfo.getString(EKK0341A010CBSMsg1List.KIKI_SEIZO_NO));
			msglist[0] = msgEKKA0020003List1;
			
			msgEKKA0020003.set(EKKA0020003CBSMsg.EKKA0020003CBSMSG1LIST, msglist);

			CAANMsg[] resltMsgList 
							= callSC(handle, scCall, param, fixedText, msgEKKA0020003).getCAANMsgList(EKKA0020003CBSMsg.EKKA0020003CBSMSG2LIST);
			
			if (resltMsgList.length > 0)
			{
				stb_id = resltMsgList[0].getString(EKKA0020003CBSMsg2List.STBID);
			}
			
			mp.put("stb_id", resltMsgList[0].getString(EKKA0020003CBSMsg2List.STBID));
		}
		
		if (STB_IDO_DIV_CHG.equals(stbIdoDiv))
		{
			mp.put("old_stb_id",            stb_id);
			mp.put("old_hdd_capa_cd",       kikiInfo.getString(EKK0341A010CBSMsg1List.HDD_CAPA_CD));
			mp.put("old_taknkiki_model_cd", kikiInfo.getString(EKK0341A010CBSMsg1List.TAKNKIKI_MODEL_CD));

//【ANK-1191-00-00】START==================================================================	
			// ** 「BCAS」の場合、宅内機器異動コードを"09"（異動無し）で連携 **
			if("C010".equals(kikiInfo.getString(EKK0341A010CBSMsg1List.KKTK_SVC_CD)))
			{
				mp.put("taknkiki_ido_cd", "09");
			}
//【ANK-1191-00-00】END====================================================================	
		}
//		old_stb_idには取得したSTB_IDを設定する前の情報を設定するのではないか？
//		現状は、取得した値がold_stb_idに設定される
//		if ("C009".equals(kikiInfo.getString(EKK0341A010CBSMsg1List.KKTK_SVC_CD)))
//		{
//			mp.put("taknkiki_ido_cd", stbIdoDiv);
//			// 宅内の照会を行い、STBIDを取得する。
//			CAANMsg eTN0081B030IN = new CAANMsg(ETN0081B030CBSMsg.class.getName());
//			eTN0081B030IN.set(ETN0081B030CBSMsg.FUNC_CODE, "1");
//			eTN0081B030IN.set(ETN0081B030CBSMsg.KEY_KIKI_SEIZO_NO, kikiInfo.getString(EKK0341A010CBSMsg1List.KIKI_SEIZO_NO));
//			CAANMsg[] eTN0081B030cbsMsg1list 
//							= callSC(handle, scCall, param, fixedText, eTN0081B030IN).getCAANMsgList(ETN0081B030CBSMsg.ETN0081B030CBSMSG1LIST);
//			
//			if (eTN0081B030cbsMsg1list.length > 0)
//			{
//				stb_id = eTN0081B030cbsMsg1list[0].getString(ETN0081B030CBSMsg1List.STB_ID);
//			}
//			
//			mp.put("stb_id", eTN0081B030cbsMsg1list[0].getString(ETN0081B030CBSMsg1List.STB_ID));
//		}
//		
//		if (STB_IDO_DIV_CHG.equals(stbIdoDiv))
//		{
//			mp.put("old_stb_id",            stb_id);
//			mp.put("old_hdd_capa_cd",       kikiInfo.getString(EKK0341A010CBSMsg1List.HDD_CAPA_CD));
//			mp.put("old_taknkiki_model_cd", kikiInfo.getString(EKK0341A010CBSMsg1List.TAKNKIKI_MODEL_CD));
//		}

		kktkSvcOutList.add(mp);
		
	}
	
	/**
	 * チェック処理<br>
	 * サービスコンポーネント実行用CAANMsgを返却します。<br>
	 * <br>
	 * 
	 * @param handle セッションハンドル
	 * @param param (I) 業務データ取得用I/F
	 * @param fixedText (I) ユーザ定義文字列
	 * @return サービスコンポーネント実行用CAANMsg
	 * @exception Throwableがスローされます 。
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		// エラーチェック用のHashMapを作成
		List<CAANMsg> templateList = new ArrayList<CAANMsg>();
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = (CAANMsg)templateList.get(0);
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		return paramMap;
	}

	/**
	 * サービスインターフェイス処理結果(エラー情報)の取得<br>
	 * 業務データ取得・書込用I/Fをそのまま返却します。<br>
	 * <br>
	 * @param param デルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param templates CAANMsgクラス配列
	 * @param returnCode リターンコード
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable
	 */
	public IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param, CAANMsg[] templates, int returnCode) throws Throwable
	{
		String fixedText = "";
		if (param.getData("KKSV031101CC") != null)
		{
			fixedText = "KKSV031101CC";
		}
		else
		{
			fixedText = "KKSV031211CC";
		}
		
		for (CAANMsg template : templates)
		{
			CAANMsg[] workTemplates = {template};
			// 料金プラン一覧照会
			editErrorInfoCom(param, workTemplates, returnCode, fixedText);
		}
		return param;
	}
	
	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param mappingData
	 * @return CAANMsg
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle, 
							ServiceComponentRequestInvoker scCall, 
							IRequestParameterReadWrite param, 
							String dataMapKey,
							CAANMsg inCAANMsg) throws Exception
	{
		HashMap<String, Object> paramMap = editInMsg(param, inCAANMsg);
		
		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 = templates[0].getInt(JCMConstants.STATUS_INT_KEY);

		editErrorInfoCom(param, templates, (Integer)return_code, dataMapKey);
		
		//エラー情報のマップを取得
		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,
											   CAANMsg msg) 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
		msg.set(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		// 運用日付
		msg.set(JCMConstants.OPERATE_DATE_KEY, param.getControlMapData(SCControlMapKeys.OPE_DATE));
		// 運用日時
		msg.set(JCMConstants.OPERATE_DATETIME_KEY, param.getControlMapData(SCControlMapKeys.OPE_TIME));
		
		setNullToMsg(msg);
		
		CAANMsg[] templates = new CAANMsg[]{msg};
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		return paramMap;
	}
	
	@SuppressWarnings("unchecked")
	private void setNullToMsg(CAANMsg msg)
	{
		Iterator<String> caanMsgKeys = msg.getSchema().getSchemaKeySet().iterator();
		while (caanMsgKeys.hasNext())
		{
			String key = caanMsgKeys.next();
			if (!key.endsWith("_err"))
			{
				continue;
			}
			String tmpKey = key.substring(0, key.length() - 4);
			
			if (!msg.containsKeyOfMsgData(tmpKey) || "".equals(msg.getObject(tmpKey)))
			{
				msg.setNull(tmpKey);
				continue;
			}
			Object obj = msg.getObject(tmpKey);
			if (obj instanceof CAANMsg[])
			{
				for (CAANMsg submsg : (CAANMsg[]) obj)
				{
					setNullToMsg(submsg);
				}
			}
		}
	}

	/**
	 * 
	 * @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(ECK0011B002CBSMsg.STATUS);

		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 = template.getHashMap().keySet().iterator();
		while (it.hasNext())
		{
			String key = it.next();
			if (key.endsWith("_err"))
			{
				if (!template.isNull(key))
				{
					inMap.put(key, template.getString(key));
				}
			}
		}
		
		return param;
	}
	
	private void debugLog(String str)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), str, null, null, null);
	}
	
/* ++++++++++ v5.00.01 削除開始 ++++++++++ */
//	/**
//	 * 一時金設定、契約一時金の登録を行います。
//	 * 
//	 * @param handle
//	 * @param param
//	 * @param kikiRmvchildList
//	 * @return IRequestParameterReadWrite
//	 * @throws RequestParameterException
//	 */
//	private void addIchijikin(SessionHandle handle, IRequestParameterReadWrite param, HashMap inMap,List<HashMap<String,Object>> kikiRmvchildList) throws Throwable
//	{
//
//		JKKIchijikinAddCC ichijikinAddCC = new JKKIchijikinAddCC();
//		HashMap<String, Object> ichijikinCCMap = new HashMap<String, Object>();
//
//		// STB撤去チェックがtrueでない場合
//		if((Boolean)inMap.get("stb_tekkyo") != true)
//		{
//			return;
//		}
//		
//		param.setData("ichijikinAddCC", ichijikinCCMap);
//		// 一時金リスト作成
//		ArrayList<HashMap<String, Object>> ichijikinList = new ArrayList<HashMap<String, Object>>();
//		
//		// STB撤去費用が有の場合
//		if ("1".equals(inMap.get("stb_tekkyo_hiyo")))
//		{
//			HashMap<String, Object> kikiMap = null;
//			// 運用日付
//			String stdardYm =JPCBPCommon.getOpeDate(null).substring(0, 6);
//			for (int i = 0; i < kikiRmvchildList.size(); i++)
//			{
//				kikiMap = (HashMap<String, Object>)kikiRmvchildList.get(i);
//
//				// STB以外は対象外
//				if(!kikiMap.containsKey("stb_id"))
//				{
//					continue;
//				}
//				
//				HashMap<String,Object> ichijiMap = new HashMap<String, Object>();
//				// 共通項目
//				ichijiMap.put("func_code", inMap.get("func_code"));
//				// 一時支払料金番号
//				ichijiMap.put("tmp_pay_prc_no", inMap.get("tmp_pay_prc_no"));
//				// サービス契約番号
//				ichijiMap.put("svc_kei_no", inMap.get("svc_kei_no"));
//				// サービス契約内訳番号
//				ichijiMap.put("svc_kei_ucwk_no",kikiMap.get("svc_kei_ucwk_no"));
//				
//				// 一時金設定登録.一時金設定コード
//				ichijiMap.put("icjkn_sette_cd", "02");
//				// 契約一時金登録.一時金額
//				ichijiMap.put("icjkn_amnt", inMap.get("tmp_pay_prc_amnt"));
//				// 契約一時金登録.一時金設定適用月
//				ichijiMap.put("icjkn_sette_aply_mon", stdardYm);
//				// 契約一時金登録.適用状態コード
//				ichijiMap.put("aply_stat_cd", "2");
//				
//				ichijikinList.add(ichijiMap);
//			}
//		
//			ichijikinCCMap.put("ichijikinList", ichijikinList);
//		
//			// 一時金/契約一時金の登録
//			ichijikinAddCC.addIchijikin(handle, param, "ichijikinAddCC");
//			
//		}
//
//		// お掃除
//		param.removeData("ichijikinAddCC");
//		
//	}
/* ++++++++++ v5.00.01 削除終了 ++++++++++ */
/* ++++++++++ v5.00.00 追加開始 ++++++++++ */
	/**
	 * サービス契約内訳<eo光TV>登録の割引CC呼び出し。
	 * 
	 * @param handle
	 * @param param
	 * @param kktkSvcKeiMap
	 * @param kobetsuData
	 * @param dataMapKey
	 * @param mskmNo
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	private void execWrisvcAutoAply(SessionHandle handle,
										IRequestParameterReadWrite param,
										HashMap inMap,
										String mskmNo) throws Throwable
	{
		// 機器登録CCで登録したデータを取得
		HashMap<String, Object> kikiCreateCCMap = (HashMap<String, Object>)param.getData("kikiAddCC");
		
		ArrayList<Map<String, Object>> createList = (ArrayList<Map<String, Object>>)kikiCreateCCMap.get("create_list");
		HashMap<String, Object> kktkSvcKeiMap = getKktkSvcKeiData(createList);
		
		ArrayList<Map<String, Object>> kikiAddCCUcwkList = (ArrayList<Map<String, Object>>)kikiCreateCCMap.get("svc_kei_ucwk_list");
		
		HashMap<String, Object> ucwkMap = null;
		
		// サービス契約内訳リストがnullでなく且つ、サイズが1件以上ある場合割引CCを実行
		if(kikiAddCCUcwkList != null && kikiAddCCUcwkList.size() > 0)
		{
			ucwkMap = (HashMap<String, Object>)kikiAddCCUcwkList.get(0);
			
			// パラメータ設定
			String workWrisvcAutoAplyDataKey = "WrisvcAutoAplyCC";
			param.setData(workWrisvcAutoAplyDataKey, new HashMap<String, Object>());
			
			HashMap<String, Object> outMap = (HashMap<String, Object>)param.getData(workWrisvcAutoAplyDataKey);
			
			// 登録／変更区分
			outMap.put("add_chge_div", "16");
			// ＳＹＳＩＤ
			outMap.put("sysid", kktkSvcKeiMap.get(EKK0341A010CBSMsg1List.SYSID));
			// 申込番号
			outMap.put("mskm_no", mskmNo);
			// 申込種別コード
			outMap.put("mskm_sbt_cd", "00012");
			// 異動区分
			outMap.put("ido_div", (String)inMap.get("ido_div"));
			// 機能コード
			outMap.put("func_code", (String)inMap.get("func_code"));
			// サービス契約グループリスト
			ArrayList<HashMap<String, Object>> workSvcKeiArray = new ArrayList<HashMap<String, Object>>();
			HashMap<String, Object> workSvcKeiMap = new HashMap<String, Object>();
			// グループ区分
			workSvcKeiMap.put("grp_div", "00");
			// サービス契約リスト
			ArrayList<HashMap<String, Object>> workSvcKeiList = new ArrayList<HashMap<String, Object>>();
			HashMap<String, Object> workSvcKeiData = new HashMap<String, Object>();
			// 対象契約識別コード
			workSvcKeiData.put("tg_kei_skbt_cd", "03");
			// サービス契約内訳番号
			workSvcKeiData.put("svc_kei_ucwk_no", ucwkMap.get(EKK0161A010CBSMsg1List.SVC_KEI_UCWK_NO));
			// サービス契約内訳ステータス
			workSvcKeiData.put("svc_kei_ucwk_stat", ucwkMap.get(EKK0161A010CBSMsg1List.SVC_KEI_UCWK_STAT));
			// 料金コースコード
			workSvcKeiData.put("pcrs_cd", ucwkMap.get(EKK0161A010CBSMsg1List.PCRS_CD));
			// 料金プランコード
			workSvcKeiData.put("pplan_cd", ucwkMap.get(EKK0161A010CBSMsg1List.PPLAN_CD));
			
			workSvcKeiList.add(workSvcKeiData);
			workSvcKeiMap.put("svc_kei_list", workSvcKeiList);
			workSvcKeiArray.add(workSvcKeiMap);
			outMap.put("svc_kei_grp_list", workSvcKeiArray);
			
			// 割引サービス自動適用CC実行処理
			JKKWrisvcAutoAplyCC wrisvcAutoAplyCC = new JKKWrisvcAutoAplyCC();
			wrisvcAutoAplyCC.execute(handle, param, workWrisvcAutoAplyDataKey);
			
			param.removeData(workWrisvcAutoAplyDataKey);
		}
	}
	
	/**
	 * 機器提供サービス契約登録データ取得メソッド。
	 * 
	 * @param createList
	 * @param ccMsg
	 * @return HashMap
	 */
	private HashMap<String, Object> getKktkSvcKeiData(ArrayList<Map<String, Object>> createList)
	{
		HashMap<String, Object> retMap = null;
		
		for (int i = 0; i < createList.size(); i++)
		{
			HashMap<String, Object> workMap = (HashMap<String, Object>)createList.get(i);
			
			// STBデータがある場合、STBデータを返却します。（STBの場合、B-CAS・C-CASデータが存在する）
			if(KKTK_SVC_CD_STB.equals((String)workMap.get(EKK0341A010CBSMsg1List.KKTK_SVC_CD)))
			{
				retMap = workMap;
			}
		}
		
		// STBデータがない場合、先頭レコードを返却
		if(retMap == null)
		{
			retMap = (HashMap<String, Object>)createList.get(0);
		}
		
		return retMap;
	}
	
/* ++++++++++ v5.00.00 追加終了 ++++++++++ */
	
	/**
	 * 視聴制御に対する撤去オーダーを発行する。
	 * 
	 * @param handle
	 * @param param
	 * @param kikiRmvchildList
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException
	 */
	private void sendWctrTekkyoOrder(SessionHandle handle, IRequestParameterReadWrite param, HashMap inMap,List<HashMap<String,Object>> kikiRmvchildList) throws Throwable
	{

		JKKKojiWctrlOrderSendCC wctrlOrderCC = new JKKKojiWctrlOrderSendCC();
		HashMap<String, Object> wctrlOrderCCMap = new HashMap<String, Object>();
		param.setData("KojiWctrlOrderSendMap", wctrlOrderCCMap);
		HashMap<String, Object> childMap = null;
		
		// 視聴制御作成
		ArrayList<HashMap<String, Object>> wctrlOrderList = new ArrayList<HashMap<String, Object>>();
		
		// 機能コード
		wctrlOrderCCMap.put("func_code", inMap.get("func_code"));
		
		// 視聴制御依頼処理コード
		wctrlOrderCCMap.put("wctrl_req_trn_cd", "50");
		// SYSID
		wctrlOrderCCMap.put("sysid", inMap.get("sys_id"));
		// サービス契約番号
		wctrlOrderCCMap.put("svc_kei_no",inMap.get("svc_kei_no"));
		
		// STB撤去費用が有の場合
		if ("1".equals(inMap.get("stb_tekkyo_hiyo")))
		{
			// STB撤去
			for(HashMap<String,Object> kikiMap : kikiRmvchildList)
			{
				// STB以外は対象外
				if(!kikiMap.containsKey("stb_id"))
				{
					continue;
				}
				childMap = new HashMap<String, Object>();
				// ＫＥＹ＿宅内機器型式コード
				childMap.put("key_tk_mdl_cd", kikiMap.get("taknkiki_model"));
				// ＫＥＹ＿機器製造番号
				childMap.put("key_kk_seizo_no",  kikiMap.get("kiki_seizo_no"));
				// ＫＥＹ＿ＳＴＢＩＤ
				childMap.put("key_stbid",  kikiMap.get("stb_id"));
				// ＫＥＹ＿宅内機器種別コード
				childMap.put("key_tk_sbt_cd",  kikiMap.get("taknkiki_sbt_cd"));
				// サービス契約内訳番号
				childMap.put("svc_kei_ucwk_no",  kikiMap.get("svc_kei_ucwk_no"));
				// BCAS-ID
				childMap.put("bcas_card_no",  kikiMap.get("bcas_id"));
				// CCAS-ID
				childMap.put("ccas_card_no",  kikiMap.get("ccas_id"));
				wctrlOrderList.add(childMap);
			}

			wctrlOrderCCMap.put("stbTekkyoList", wctrlOrderList);
			
			// オーダー発行
			wctrlOrderCC.sendKojiWctrlOrder(handle, param, "KojiWctrlOrderSendMap");
		}

		param.removeData("KojiWctrlOrderSendMap");

	}
}
