/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKFmtcelMskmInfoTrkmCC
*   ソースファイル名：JKKFmtcelMskmInfoTrkmCC.java
*   作成者          ：富士通
*   日付            ：2012年07月03日
*＜機能概要＞
*   フェムトセル申込情報登録部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v4.00.00    2012/07/03   FJ)        新規作成
*	v4.00.00	2012/09/18   FJ)藤本    ANK-1187-00-00 SBMフェムトセル対応
*  v11.00.00    2014/11/10   FJ)伊藤    【ANK-2184-00-00】【ＮＯ．１５８４】新型フェムトセル対応
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.JKKFmtcelIdoInfAddConstCC;
import com.fujitsu.futurity.bp.custom.constant.JKKHakkoSODConstCC;
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.IRequestParameterReadOnly;
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.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 eo.common.constant.JKKStrConst;
import eo.ejb.cbs.cbsmsg.EKK0011D020CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0011D020CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0021C060CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0321B002CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0321B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0351A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0351A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0351C240CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0351C250CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0361A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0361C030CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0361C040CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0361D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg1List;

@SuppressWarnings({"unchecked"})
public class JKKFmtcelMskmInfoTrkmCC extends AbstractCommonComponent {

	//*********************************************
	//                ユーザ定義
	//*********************************************
	/** エラーメッセージ */
	private static final String ERR_MSG = "INVALID_RETURN_MESSAGE";
	
	//*********************************************
	//                サービスIF
	//*********************************************
	/** サービス契約一意照会 */
	private static final String EKK0081A010 = "EKK0081A010";
	/** 申込内容承認登録 */
	private static final String EKK0011D020 = "EKK0011D020";
	/** 申込明細照査・後続業務依頼 */
	private static final String EKK0021C060 = "EKK0021C060";
	/** オプションサービス契約<ISP>登録 */
	private static final String EKK0361D010 = "EKK0361D010";
	/** オプションサービス契約<ISP>照査締結 */
	private static final String EKK0361C030 = "EKK0361C030";
	/** オプションサービス契約<ISP>開始 */
	private static final String EKK0361C040 = "EKK0361C040";
	/** 進捗登録 */
	private static final String EKK1091D010 = "EKK1091D010";
	/** オプションサービス契約＜ISP＞一意照会 */
	private static final String EKK0361A010 = "EKK0361A010";
	/** オプションサービス契約解約 */
	private static final String EKK0351C240 = "EKK0351C240";
	/** オプションサービス契約解約確定 */
	private static final String EKK0351C250 = "EKK0351C250";
	/** 課金先一覧照会（請求契約番号/サービス契約番号） */
	private static final String EKK0321B002 = "EKK0321B002";
	/** オプションサービス契約一意照会 */
	private static final String EKK0351A010 = "EKK0351A010";
	
	//**************************************************************************/
	//** 解約種別フラグ                                                       **/
	//**************************************************************************/
	/** 解約種別フラグ(サービス契約解約)               */
	public static final String DSL_SBT_FLG_SVC_KEI_DSL      = "1";
	/** 解約種別フラグ(オプションサービス契約解約)     */
	public static final String DSL_SBT_FLG_OP_SVC_KEI_DSL   = "2";
	/** 解約種別フラグ(サブオプションサービス契約解約) */
	public static final String DSL_SBT_FLG_SBOP_SVC_KEI_DSL = "3";
	
	//******************************************
	//             機能コード
	//******************************************
	/** 機能コード  1：チェック＆登録 */
	private static final String FUNC_CD_1 = "1";
	/** 機能コード：2：チェックのみ */
	private static final String FUNC_CD_2 = "2";
	
	//******************************************
	//             ユーザ定義文字列
	//******************************************
	private String fixText = null;
	/** 申込区分 0:登録 */
	private static final String MSKM_DIV_ADD = "0";
	/** 申込区分 1:解約 */
	private static final String MSKM_DIV_DSL = "1";
	// 20141110 ANK-2184-00-00 Add Start
	/** 申込区分 2:登録（新型） */
	private static final String MSKM_DIV_ADD_NEW = "2";
	/** 申込区分 3:解約（新型） */
	private static final String MSKM_DIV_DSL_NEW = "3";
	// 20141110 ANK-2184-00-00 Add End
	/** 申込種別コード 00026:オプション申込 */
	private static final String MSKM_SBT_CD_00026 ="00026";
	/** 異動理由コード 56：その他 */
	private static final String IDO_RSN_CD_OTHER = "56";
	/** フェムトセル異動詳細コード 01：登録 */
	private static final String FMTCEL_IDO_DTL_CD_01 = "01";
	/** フェムトセル異動詳細コード 02：解約 */
	private static final String FMTCEL_IDO_DTL_CD_02 = "02";
	
	/**
	 * フェムトセル情報取込
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return
	 * @throws Throwable
	 */
	public IRequestParameterReadWrite excuteFmtcel(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
			throws Throwable
	{
		
		fixText = fixedText;
		ArrayList<HashMap<String, Object>> userDataList = (ArrayList<HashMap<String, Object>>)param.getData(fixText);
		
		// リスト数分ループ
		for (int i=0; i < userDataList.size(); i++)
		{
			HashMap<String, Object> userData = (HashMap<String, Object>)userDataList.get(i);
//			【引継ぎ項目】
//			・事業者コード
//			・事業者使用コード
//			・申込区分
//			・申込日
//			・サービス契約番号
//			・処理年月日
			
			// 申込区分
			String mskmDiv = (String)userData.get("mskm_div");
			
			// 20141110 ANK-2184-00-00 Update Start
			//if (MSKM_DIV_ADD.equals(mskmDiv))
			if (MSKM_DIV_ADD.equals(mskmDiv) || MSKM_DIV_ADD_NEW.equals(mskmDiv))
			// 20141110 ANK-2184-00-00 Update End
			{
				// ********************************
				//   フェムトセルオプション登録
				// ********************************
				excuteAdd(handle, param, userData, fixedText);
				
			}
			// 20141110 ANK-2184-00-00 Update Start
			// else if (MSKM_DIV_DSL.equals(mskmDiv))
			else if (MSKM_DIV_DSL.equals(mskmDiv) || MSKM_DIV_DSL_NEW.equals(mskmDiv))
			// 20141110 ANK-2184-00-00 Update End
			{
				// ********************************
				//   フェムトセルオプション解約
				// ********************************
				excuteDsl(handle, param, userData, fixedText);
			}
		}
		
		// 処理終了
		return param;
	}
	
	/**
	 * フェムトセルオプション登録処理
	 * @param handle
	 * @param param
	 * @param userData
	 */
	private void excuteAdd(SessionHandle handle,
			IRequestParameterReadWrite param, HashMap<String, Object> userData, String fixedText) throws Throwable
	{
		HashMap<String, Object> resultHash = new HashMap<String, Object>();
		HashMap<String, Object> eKK0011D020 = new HashMap<String, Object>();
		HashMap<String, Object> eKK0361D010 = new HashMap<String, Object>();
		HashMap<String, Object> eKK0361C030 = new HashMap<String, Object>();
		HashMap<String, Object> eKK0361C040 = new HashMap<String, Object>();
		HashMap<String, Object> work = new HashMap<String, Object>();
		
		// サービス契約番号
		work.put("svc_kei_no", (String)userData.get("svc_kei_no"));
		work.put("svc_kei_ucwk_no", (String)userData.get("svc_kei_ucwk_no"));
		work.put("jgs_cd", (String)userData.get("jgs_cd"));
		work.put("jgs_use_cd", (String)userData.get("jgs_use_cd"));
		work.put("tran_date", (String)userData.get("tran_date"));
		work.put("mskm_day", (String)userData.get("mskm_day"));
		work.put("fmtcel_shogo_tg_cd", (String)userData.get("fmtcel_shogo_tg_cd"));
		
		// サービス契約一意照会
		callEKK0081A010SC(
				param, 
				handle, 
				work, 
				resultHash,
				userData);
		
		CAANMsg[] eKK0081A010CBSMSG1list = (CAANMsg[])resultHash.get(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
		HashMap<String, Object> eKK0081A010CBSMSG1 = eKK0081A010CBSMSG1list[0].getMsgData();
		
		// 更新日時取得
		work.put("last_upd_dtm", (String)eKK0081A010CBSMSG1.get(EKK0081A010CBSMsg1List.LAST_UPD_DTM));
		work.put("sysid", (String)eKK0081A010CBSMSG1.get(EKK0081A010CBSMsg1List.SYSID));
		
		// 課金先一覧照会（請求契約番号/サービス契約番号）
		callEKK0321B002SC(
				param, 
				handle, 
				work, 
				resultHash,
				userData);
		
		CAANMsg[] eKK0321B002CBSMSG1list = (CAANMsg[])resultHash.get(EKK0321B002CBSMsg.EKK0321B002CBSMSG1LIST);
		HashMap<String, Object> eKK0321B002CBSMSG1 = eKK0321B002CBSMSG1list[0].getMsgData();
		
		work.put("seiky_kei_no", (String)eKK0321B002CBSMSG1.get(EKK0321B002CBSMsg1List.SEIKY_KEI_NO));
		
		// 申込内容承認登録
		callEKK0011D020SC(
				param, 
				handle, 
				work, 
				eKK0011D020,
				userData);
		
		CAANMsg[] eKK0011D020CBSMSG1list = (CAANMsg[])eKK0011D020.get(EKK0011D020CBSMsg.EKK0011D020CBSMSG1LIST);
		HashMap<String, Object> eKK0011D020CBSMSG1 = eKK0011D020CBSMSG1list[0].getMsgData();
		
		work.put("mskm_upd_dtm", (String)eKK0011D020.get("upd_dtm"));
		work.put("mskm_dtl_no", (String)eKK0011D020CBSMSG1.get("mskm_dtl_no"));
		
		// 申込明細照査・後続業務依頼
		callEKK0021C060SC(
				param, 
				handle, 
				work, 
				resultHash,
				userData);
		
		// 20141110 ANK-2184-00-00 Add Start
		work.put("mskm_div", (String)userData.get("mskm_div"));
		// 20141110 ANK-2184-00-00 Add End
		
		// オプションサービス契約＜ISP＞登録
		callEKK0361D010SC(
				param, 
				handle, 
				work, 
				eKK0361D010,
				userData);
		
		work.put("op_svc_kei_no", eKK0361D010.get(EKK0361D010CBSMsg.OP_SVC_KEI_NO));
		work.put("upd_dtm", eKK0361D010.get(EKK0361D010CBSMsg.UPD_DTM));
		work.put("fmtcel_ninsho_id", eKK0361D010.get(EKK0361D010CBSMsg.FMTCEL_NINSHO_ID));
		work.put("fmtcel_ninsho_id_pwd", eKK0361D010.get(EKK0361D010CBSMsg.FMTCEL_NINSHO_ID_PWD));
		
		// オプションサービス契約＜ISP＞照査締結
		callEKK0361C030SC(
				param, 
				handle, 
				work, 
				eKK0361C030,
				userData);
		
		work.put("upd_dtm", eKK0361C030.get("upd_dtm"));
		
		// オプションサービス契約＜ISP＞開始
		callEKK0361C040SC(
				param, 
				handle, 
				work, 
				eKK0361C040,
				userData);
		
		work.put("gene_add_dtm", eKK0361C040.get("kk0351_gene_add_dtm"));
		
		// ********************************
		//           進捗登録
		// ********************************
		addPrg(param, handle, work, userData);
		
		// ********************************
		// フェムトセル異動情報登録CC呼出
		// ********************************
		callFemtcelIdoInfoAddCC(param, handle, work, FMTCEL_IDO_DTL_CD_01, fixedText);
		
		// ********************************
		//           SODCC呼出
		// ********************************
		callHakkoSodCC(param, handle, work, false);
		
		// 返却データをセット
		// サービス契約番号
		userData.put("svc_kei_no", work.get("svc_kei_no"));
		// フェムトセル認証ID
		userData.put("fmtcel_ninsho_id", work.get("fmtcel_ninsho_id"));
		// フェムトセル認証IDパスワード
		userData.put("fmtcel_ninsho_id_pwd", work.get("fmtcel_ninsho_id_pwd"));
		
	}
	
	/**
	 * フェムトセルオプション解約処理
	 * @param handle
	 * @param param
	 * @param userData
	 * @throws Throwable 
	 */
	private void excuteDsl(SessionHandle handle,
			IRequestParameterReadWrite param, HashMap<String, Object> userData, String fixedText) throws Throwable
	{
		HashMap<String, Object> resultHash = new HashMap<String, Object>();
		HashMap<String, Object> eKK0011D020 = new HashMap<String, Object>();
		HashMap<String, Object> eKK0351C240 = new HashMap<String, Object>();
		HashMap<String, Object> eKK0351C250 = new HashMap<String, Object>();
		HashMap<String, Object> work = new HashMap<String, Object>();
		
		// サービス契約番号
		work.put("svc_kei_no", (String)userData.get("svc_kei_no"));
		work.put("svc_kei_ucwk_no", (String)userData.get("svc_kei_ucwk_no"));
		work.put("jgs_cd", (String)userData.get("jgs_cd"));
		work.put("jgs_use_cd", (String)userData.get("jgs_use_cd"));
		work.put("tran_date", (String)userData.get("tran_date"));
		work.put("op_svc_kei_no", (String)userData.get("op_svc_kei_no"));

		// サービス契約一意照会
		callEKK0081A010SC(
				param, 
				handle, 
				work, 
				resultHash,
				userData);
		
		CAANMsg[] eKK0081A010CBSMSG1list = (CAANMsg[])resultHash.get(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST);
		HashMap<String, Object> eKK0081A010CBSMSG1 = eKK0081A010CBSMSG1list[0].getMsgData();
		
		// 更新日時取得
		work.put("last_upd_dtm", (String)eKK0081A010CBSMSG1.get(EKK0081A010CBSMsg1List.LAST_UPD_DTM));
		work.put("sysid", (String)eKK0081A010CBSMSG1.get(EKK0081A010CBSMsg1List.SYSID));
		
		// 申込内容承認登録
		callEKK0011D020SC(
				param, 
				handle, 
				work, 
				eKK0011D020,
				userData);
		
		CAANMsg[] eKK0011D020CBSMSG1list = (CAANMsg[])eKK0011D020.get(EKK0011D020CBSMsg.EKK0011D020CBSMSG1LIST);
		HashMap<String, Object> eKK0011D020CBSMSG1 = eKK0011D020CBSMSG1list[0].getMsgData();
		
		work.put("mskm_upd_dtm", (String)eKK0011D020.get("upd_dtm"));
		work.put("mskm_dtl_no", (String)eKK0011D020CBSMSG1.get("mskm_dtl_no"));
		
		// 申込明細照査・後続業務依頼
		callEKK0021C060SC(
				param, 
				handle, 
				work, 
				resultHash,
				userData);
		
		// オプション一意照会
		callEKK0361A010SC(
				param, 
				handle, 
				(String)work.get("op_svc_kei_no"), 
				resultHash,
				userData);
		
		// オプション契約一意照会
		callEKK0351A010SC(
				param, 
				handle, 
				(String)work.get("op_svc_kei_no"), 
				resultHash,
				userData);
		
		CAANMsg[] eKK03511A010CBSMSG1list = (CAANMsg[])resultHash.get(EKK0351A010CBSMsg.EKK0351A010CBSMSG1LIST);
		CAANMsg msgEKK0351A010 = eKK03511A010CBSMSG1list[0];
		CAANMsg msgEKK0081A010 = eKK0081A010CBSMSG1list[0];

		// ▼▼▼▼▼ 2013/09/11 OM-2013-0001096 UPD START ▼▼▼▼▼
		// ******************************************************* //
		// 非課金判定部品実行処理＜オプション＞                    //
		// ******************************************************* //
		// ※「解約時課金フラグ」について
		// 　　オプション、サブオプションごとに非課金判定部品を実行し、
		// 　　各々の解約時課金フラグを設定する。
		HashMap<String, Object> jdgHiChrgMapOpSvcKei =
			runHiChrgJdgUtil(handle, param, work, msgEKK0081A010, msgEKK0351A010, DSL_SBT_FLG_OP_SVC_KEI_DSL);
		// ▲▲▲▲▲ 2013/09/11 OM-2013-0001096 UPD E N D ▲▲▲▲▲

		// オプションサービス契約解約
		callEKK0351C240SC(
				param, 
				handle, 
				work, 
				eKK0351C240,
				userData,
				jdgHiChrgMapOpSvcKei);
		
		work.put("upd_dtm", (String)eKK0351C240.get("upd_dtm"));
		
		// オプションサービス契約解約確定
		callEKK0351C250SC(
				param, 
				handle, 
				work, 
				eKK0351C250,
				userData,
				jdgHiChrgMapOpSvcKei);
		
		work.put("gene_add_dtm", (String)eKK0351C250.get("gene_add_dtm"));
		
		// 進捗
		addPrg(param, handle, work, userData);
		
		// フェムトセル異動情報登録CC呼出
		callFemtcelIdoInfoAddCC(param, handle, work, FMTCEL_IDO_DTL_CD_02, fixedText);
		
		// SODCC
		callHakkoSodCC(param, handle, work, true);
		
		// 返却データをセット
		// サービス契約番号
		userData.put("svc_kei_no", work.get("svc_kei_no"));
		// フェムトセル認証ID
		userData.put("femtcel_ninsho_id", work.get("femtcel_ninsho_id"));
		// フェムトセル認証IDパスワード
		userData.put("femtcel_ninsho_id_pwd", work.get("femtcel_ninsho_id_pwd"));
		
	}
	
	/**
	 * フェムトセル異動情報登録CC呼出
	 * @param param
	 * @param handle
	 * @param work
	 * @throws Throwable
	 */
	private void callFemtcelIdoInfoAddCC(IRequestParameterReadWrite param,
			SessionHandle handle, HashMap<String, Object> work,
			String fmtcel_ido_dtl_cd, String fixedText) throws Throwable
	{
		HashMap<String, Object> fmtMap = new HashMap<String, Object>();
		
		// フェムトセル異動対象データマップ
		// SYSID
		fmtMap.put(JKKFmtcelIdoInfAddConstCC.SYSID, "");
		// サービス契約番号
		fmtMap.put(JKKFmtcelIdoInfAddConstCC.SVC_KEI_NO, work.get("svc_kei_no"));
		// オプションサービス契約番号
		fmtMap.put(JKKFmtcelIdoInfAddConstCC.OP_SVC_KEI_NO, work.get("op_svc_kei_no"));
		// 進捗年月日時分秒
		fmtMap.put(JKKFmtcelIdoInfAddConstCC.PRG_DTM, work.get("prg_dtm"));
		// 工事案件番号
		fmtMap.put(JKKFmtcelIdoInfAddConstCC.KOJIAK_NO, "");
		// 異動区分
		fmtMap.put(JKKFmtcelIdoInfAddConstCC.IDO_DIV, "00031");
		// フェムトセル異動詳細コード
		fmtMap.put(JKKFmtcelIdoInfAddConstCC.FMTCEL_IDO_DTL_CD, fmtcel_ido_dtl_cd);
		// フェムトセル申込年月日
		fmtMap.put(JKKFmtcelIdoInfAddConstCC.FMTCEL_MSKM_YMD, work.get("mskm_day"));
		
		param.setData("femtTrgtData", fmtMap);
		
		JKKBpCommon.addFmtcelIdoInf(handle, param, fmtMap, "femtTrgtData");
	}
	
	/**
	 * SOD発行CC呼出
	 * 
	 * @param param
	 * @param handle
	 * @param work 
	 * @param isDsl フェムトセル解約かどうか
	 * @param trgtDataList
	 * @throws Throwable 
	 */
	private void callHakkoSodCC(IRequestParameterReadWrite param, SessionHandle handle, HashMap<String, Object> work, boolean isDsl) throws Throwable
	{
		HashMap<String, Object> sodMap = new HashMap<String, Object>();
		
		ArrayList<HashMap<String, Object>> sodDataList = new ArrayList<HashMap<String, Object>>();
		// SOD対象データマップ
		HashMap<String, Object> sodTrgtData = new HashMap<String, Object>();

		// SOD基本情報
		HashMap<String, Object> sodKihonInfo = new HashMap<String, Object>();
		sodKihonInfo.put(JKKHakkoSODConstCC.INFO_SYSID, (String)work.get("sysid"));
		sodKihonInfo.put(JKKHakkoSODConstCC.INFO_IDO_DIV, "00031");
		sodMap.put(JKKHakkoSODConstCC.SOD_KIHON_INFO, sodKihonInfo);
		
		// サービス契約情報
		HashMap<String, Object> svcKeiInfo = new HashMap<String, Object>();
		
		svcKeiInfo.put(JKKHakkoSODConstCC.INFO_SVC_KEI_NO, work.get("svc_kei_no"));
		sodMap.put(JKKHakkoSODConstCC.SVC_KEI_INFO, svcKeiInfo);
		
		// サービス契約内訳情報
		HashMap<String, Object> svcKeiUcwkInfo = new HashMap<String, Object>();
		sodMap.put(JKKHakkoSODConstCC.SVC_KEI_UCWK_INFO, svcKeiUcwkInfo);
		
		// オプションサービス契約情報
		HashMap<String, Object> opSvcKeiInfo = new HashMap<String, Object>();

		// フェムトセルオプション解約の場合
		if (isDsl)
		{
			// 変更前オプションサービス契約番号
			opSvcKeiInfo.put(JKKHakkoSODConstCC.INFO_CHBF_OPSVKEI_NO, work.get("op_svc_kei_no"));
		}

		// 変更後オプションサービス契約番号
		opSvcKeiInfo.put(JKKHakkoSODConstCC.INFO_CHAF_OPSVKEI_NO, work.get("op_svc_kei_no"));
		opSvcKeiInfo.put(JKKHakkoSODConstCC.INFO_CHAF_OPSVKEI_GENE_ADD_DTM, work.get("gene_add_dtm"));
		sodMap.put(JKKHakkoSODConstCC.OPSVKEI_INFO, opSvcKeiInfo);
		
		// 機器提供サービス契約情報
		HashMap<String, Object> kktsvkeiInfo = new HashMap<String, Object>();
		sodMap.put(JKKHakkoSODConstCC.KKTSVKEI_INFO, kktsvkeiInfo);
		
		sodDataList.add(sodMap);
		
		sodTrgtData.put(JKKHakkoSODConstCC.TRGT_DATA_LIST, sodDataList);
		sodTrgtData.put(JCMConstants.FUNC_CODE_KEY, FUNC_CD_1);
		 // サービスオーダ発行CCを呼び出す
		JKKHakkoSODCC hakkoSODCC = new JKKHakkoSODCC();
		param.setData("sodTrgtData", sodTrgtData);
		hakkoSODCC.hakkoSOD(handle, param, "sodTrgtData");
	}
	
	/**
	 * 進捗登録
	 * 
	 * @param param
	 * @param handle
	 * @param paramHash
	 * @return
	 * @throws RequestParameterException
	 * @throws SCException
	 */
	private int addPrg(IRequestParameterReadWrite param, SessionHandle handle, HashMap<String, Object> work, HashMap<String, Object> userData)
			throws Throwable
	{
		int statusCode = 0;

		HashMap<String, Object> eKK1091D010Hash = new HashMap<String, Object>();
		
		callEKK1091D010SC(
					param, 
					handle, 
					eKK1091D010Hash, 
					work,
					userData);
		
		work.put("prg_dtm", eKK1091D010Hash.get("prg_dtm"));
		
		return statusCode;
	}
	
	/**
	 * サービス契約一意照会SIF呼び出し
	 * @param param
	 * @param handle
	 * @param paramMap
	 * @param resultHash
	 * @return
	 * @throws Throwable
	 */
	private int callEKK0081A010SC(IRequestParameterReadWrite param, SessionHandle handle, HashMap<String, Object> work,
			HashMap<String, Object> resultHash, HashMap<String, Object> userData) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0081A010への呼び出しパラメータ設定
		template = new CAANMsg(EKK0081A010CBSMsg.class.getName());
		mappingEKK0081A010InMsg(template, work);
		editBasicCmn(param, template);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]
		{
			template
		});

		// SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);
		// エラーマッピング
		editResultRP(sIFResult, param, userData);
		// エラーチェック処理
		errChk(sIFResult);

		// SIFの実行結果を設定
		resultHash.putAll(getWorkCAANMsg(sIFResult));

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		return status;
	}
	
	/**
	 * templateに対してEKK0081A010の条件に関する部分を設定する
	 * 
	 * @param template
	 * @param inHash
	 */
	private void mappingEKK0081A010InMsg(CAANMsg template, HashMap<String, Object> work)
	{
		// 全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0081A010CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0081A010CBSMsg.TEMPLATEID, EKK0081A010);

		// 機能コード--サービス契約一意照会
		template.set(EKK0081A010CBSMsg.FUNC_CODE, FUNC_CD_2);

		// ＫＥＹ＿サービス契約番号
		template.set(EKK0081A010CBSMsg.KEY_SVC_KEI_NO, (String)work.get("svc_kei_no"));

		// ＫＥＹ＿予約適用年月日
		template.set(EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, work.get("tran_date"));
	}
	
	/**
	 * 申込内容承認登録SIFを呼び出し
	 * 
	 * @param param
	 * @param handle
	 * @param inHash
	 * @param resultHash
	 * @return
	 * @throws RequestParameterException
	 * @throws SCException
	 */
	private int callEKK0011D020SC(IRequestParameterReadWrite param, SessionHandle handle,
			HashMap<String, Object> work, HashMap<String, Object> resultHash, HashMap<String, Object> userData) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0011D020への呼び出しパラメータ設定
		template = new CAANMsg(EKK0011D020CBSMsg.class.getName());
		mappingEKK0011D020InMsg(template, work);
		editBasicCmn(param, template);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]
		{
			template
		});

		// SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);
		// エラーマッピング
		editResultRP(sIFResult, param, userData);
		// エラーチェック処理
		errChk(sIFResult);
		// SIFの実行結果を設定
		resultHash.putAll(getWorkCAANMsg(sIFResult));

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		return status;
	}
	
	/**
	 * templateに対してEKK0011D020の条件に関する部分を設定する
	 * 
	 * @param template
	 * @param inHash
	 */
	private void mappingEKK0011D020InMsg(CAANMsg template, HashMap<String, Object> work)
	{
		// 全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0011D020CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0011D020CBSMsg.TEMPLATEID, EKK0011D020);

		// 機能コード--申込内容承認登録
		template.set(EKK0011D020CBSMsg.FUNC_CODE, FUNC_CD_1);

		// SYSID
		template.set(EKK0011D020CBSMsg.SYSID, (String)work.get("sysid"));

		// 申込種別コード（オプション申込）
		template.set(EKK0011D020CBSMsg.MSKM_SBT_CD, MSKM_SBT_CD_00026);

		// 申込受付年月日時分秒
		template.set(EKK0011D020CBSMsg.MSKM_UK_DTM, addTimeStamp((String)work.get("tran_date")));

		// 申込年月日
		template.set(EKK0011D020CBSMsg.MSKM_YMD, (String)work.get("tran_date"));

		// コンシューマ営業用申込状態識別コード(04:承認済)
		template.set(EKK0011D020CBSMsg.CONSMBSN_MSKM_STAT_SKBT_CD, "04");

		// 申込内容承認登録明細の枠を作成
		CAANMsg[] eKK0011D020CBSMSG1LIST = null;
		CAANMsg eKK0011D020CBSMSG1 = null;
		eKK0011D020CBSMSG1 = new CAANMsg(EKK0011D020CBSMsg1List.class.getName());
		fillCAANMSGNullMapping(eKK0011D020CBSMSG1, new EKK0011D020CBSMsg1List().getContents());
		eKK0011D020CBSMSG1LIST = new CAANMsg[]
		{
			eKK0011D020CBSMSG1
		};

		template.set(EKK0011D020CBSMsg.EKK0011D020CBSMSG1LIST, eKK0011D020CBSMSG1LIST);
	}
	
	/**
	 * 申込明細照査・後続業務依頼SIFを呼び出し
	 * 
	 * @param param
	 * @param handle
	 * @param inHash
	 * @param resultHash
	 * @return
	 * @throws RequestParameterException
	 * @throws SCException
	 */
	private int callEKK0021C060SC(IRequestParameterReadWrite param, SessionHandle handle,
			HashMap<String, Object> work, HashMap<String, Object> resultHash, HashMap<String, Object> userData)
			throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0021C060への呼び出しパラメータ設定
		template = new CAANMsg(EKK0021C060CBSMsg.class.getName());
		mappingEKK0021C060InMsg(template, work);
		editBasicCmn(param, template);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]
		{
			template
		});

		// SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);
		// エラーマッピング
		editResultRP(sIFResult, param, userData);
		// エラーチェック処理
		errChk(sIFResult);
		// SIFの実行結果を設定
		resultHash.putAll(getWorkCAANMsg(sIFResult));

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		return status;
	}
	
	/**
	 * templateに対してEKK0021C060の条件に関する部分を設定する
	 * 
	 * @param template
	 * @param inHash
	 */
	private void mappingEKK0021C060InMsg(CAANMsg template, HashMap<String, Object> work)
	{
		// 全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0021C060CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0021C060CBSMsg.TEMPLATEID, EKK0021C060);

		// 機能コード--申込明細照査・後続業務依頼
		template.set(EKK0021C060CBSMsg.FUNC_CODE, FUNC_CD_1);

		// 申込明細番号
		template.set(EKK0021C060CBSMsg.MSKM_DTL_NO, work.get("mskm_dtl_no"));

		// 後続業務依頼年月日
		template.set(EKK0021C060CBSMsg.KZKWRK_REQYMD, work.get("tran_date"));

		// リクエストパラメータ.運用日時 → 連絡事項登録年月日時分秒
		template.set(EKK0021C060CBSMsg.RRK_JIKO_ADD_DTM, addTimeStamp((String)work.get("tran_date")));

		// 異動区分
		template.set(EKK0021C060CBSMsg.IDO_DIV, "");

		// 更新年月日時分秒(更新前)
		template.set(EKK0021C060CBSMsg.UPD_DTM_BF, work.get("mskm_upd_dtm"));

	}
	
	/**
	 * オプションサービス契約<ISP>登録SIFを呼び出し
	 * 
	 * @param param
	 * @param handle
	 * @param inHash
	 * @param resultHash
	 * @return
	 * @throws RequestParameterException
	 * @throws SCException
	 */
	private int callEKK0361D010SC(IRequestParameterReadWrite param, SessionHandle handle,
			HashMap<String, Object> work, HashMap<String, Object> resultHash, HashMap<String, Object> userData)
			throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0361D010への呼び出しパラメータ設定
		template = new CAANMsg(EKK0361D010CBSMsg.class.getName());
		mappingEKK0361D010InMsg(template, work);
		editBasicCmn(param, template);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]
		{
			template
		});

		// SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);
		// エラーマッピング
		editResultRP(sIFResult, param, userData);
		// エラーチェック処理
		errChk(sIFResult);
		// SIFの実行結果を設定
		resultHash.putAll(getWorkCAANMsg(sIFResult));

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		return status;
	}
	
	/**
	 * templateに対してEKK0361D010の条件に関する部分を設定する
	 * 
	 * @param template
	 * @param inHash
	 */
	private void mappingEKK0361D010InMsg(CAANMsg template, HashMap<String, Object> work)
	{
		// 全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0361D010CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0361D010CBSMsg.TEMPLATEID, EKK0361D010);

		// 20141110 ANK-2184-00-00 Update Start
		// 料金コースコード
		// 申込区分＝「2:登録（新型）」の場合、"BC5"。それ以外は"B78"
		String pcrsCd = MSKM_DIV_ADD_NEW.equals((String)work.get("mskm_div")) ? JKKStrConst.CD00134_BC5 : JKKStrConst.CD00134_B78;
		// 料金プランコード
		// 申込区分＝「2:登録（新型）」の場合、"PBC501"。それ以外は"PB7801"
		String pplanCd = MSKM_DIV_ADD_NEW.equals((String)work.get("mskm_div")) ? JKKStrConst.CD00565_FMTCEL_NEW : JKKStrConst.CD00565_FMTCEL;
		// 20141110 ANK-2184-00-00 Update End
		
		
		// 機能コード--オプションサービス契約登録
		template.set(EKK0361D010CBSMsg.FUNC_CODE, FUNC_CD_1);
		// オプションサービスコード
		template.set(EKK0361D010CBSMsg.OP_SVC_CD, "B075");
		//// 料金コースコード
		// 20141110 ANK-2184-00-00 Update Start
		//template.set(EKK0361D010CBSMsg.PCRS_CD, "B78");
		//// 料金プランコード
		//template.set(EKK0361D010CBSMsg.PPLAN_CD, "PB7801");
		// 料金コースコード
		template.set(EKK0361D010CBSMsg.PCRS_CD, pcrsCd);
		// 料金プランコード
		template.set(EKK0361D010CBSMsg.PPLAN_CD, pplanCd);
		// 20141110 ANK-2184-00-00 Update End
		
		// 親契約識別コード
		template.set(EKK0361D010CBSMsg.OYA_KEI_SKBT_CD, "01");
		// サービス契約番号
		template.set(EKK0361D010CBSMsg.SVC_KEI_NO, (String)work.get("svc_kei_no"));
		// サービス契約内訳番号
		template.set(EKK0361D010CBSMsg.SVC_KEI_UCWK_NO, (String)work.get("svc_kei_ucwk_no"));
		// SYSID
		template.set(EKK0361D010CBSMsg.SYSID, (String)work.get("sysid"));
		// 申込明細番号
		template.set(EKK0361D010CBSMsg.MSKM_DTL_NO, (String)work.get("mskm_dtl_no"));
		// 2012/10/26 IT1-2012-0001688 ADD START サービス利用開始希望年月日を追加
		template.set(EKK0361D010CBSMsg.SVC_USE_STA_KIBO_YMD, JCCBPCommon.getOpeDate(null));
		// 2012/10/26 IT1-2012-0001688 ADD END サービス利用開始希望年月日を追加
		// 異動区分
		template.set(EKK0361D010CBSMsg.IDO_DIV, "00031");
		// 請求契約番号
		template.set(EKK0361D010CBSMsg.SEIKY_KEI_NO, (String)work.get("seiky_kei_no"));
		// 更新年月日時分秒(更新前)
		template.set(EKK0361D010CBSMsg.UPD_DTM_BF, (String)work.get("last_upd_dtm"));
		// フェムトセル事業者コード
		template.set(EKK0361D010CBSMsg.FMTCEL_JGS_CD, (String)work.get("jgs_cd"));
		// フェムトセル事業者使用コード
		template.set(EKK0361D010CBSMsg.FMTCEL_JGS_USE_CD, (String)work.get("jgs_use_cd"));
		// ANK-1187-00-00 SBMフェムトセル対応 2012/09/18 START
		// フェムトセル照合対象コード
		template.set(EKK0361D010CBSMsg.FMTCEL_SYOGO_TG_CD, (String)work.get("fmtcel_shogo_tg_cd"));
		// ANK-1187-00-00 SBMフェムトセル対応 2012/09/18 END
	}
	
	
	/**
	 * オプションサービス契約<ISP>照査締結SIFを呼び出し
	 * 
	 * @param param
	 * @param handle
	 * @param inHash
	 * @param resultHash
	 * @return
	 * @throws RequestParameterException
	 * @throws SCException
	 */
	private int callEKK0361C030SC(IRequestParameterReadWrite param, SessionHandle handle,
			HashMap<String, Object> work, HashMap<String, Object> resultHash, HashMap<String, Object> userData)
			throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0361C030への呼び出しパラメータ設定
		template = new CAANMsg(EKK0361C030CBSMsg.class.getName());
		mappingEKK0361C030InMsg(template, work);
		editBasicCmn(param, template);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]
		{
			template
		});

		// SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);
		// エラーマッピング
		editResultRP(sIFResult, param, userData);
		// エラーチェック処理
		errChk(sIFResult);
		// SIFの実行結果を設定
		resultHash.putAll(getWorkCAANMsg(sIFResult));

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		return status;
	}
	
	/**
	 * templateに対してEKK0361C030の条件に関する部分を設定する
	 * 
	 * @param template
	 * @param inHash
	 */
	private void mappingEKK0361C030InMsg(CAANMsg template, HashMap<String, Object> work)
	{
		// 全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0361C030CBSMsg().getContents());
		
		// テンプレートID(SIFのID)
		template.set(EKK0361C030CBSMsg.TEMPLATEID, EKK0361C030);
		
		// 機能コード--オプションサービス契約<ISP>登録
		template.set(EKK0361C030CBSMsg.FUNC_CODE, FUNC_CD_1);
		
		// オプションサービス契約番号
		template.set(EKK0361C030CBSMsg.OP_SVC_KEI_NO, (String)work.get("op_svc_kei_no"));
		
		// 異動区分
		template.set(EKK0361C030CBSMsg.IDO_DIV, "00031");
		
		// 更新年月日時分秒(更新前)
		template.set(EKK0361C030CBSMsg.UPD_DTM_BF, work.get("upd_dtm"));
		
		// 事務手数料自動適用要否
		template.set(EKK0361C030CBSMsg.RULE0059_AUTO_APLY, "0");
		
	}
	
	
	/**
	 * オプションサービス契約<ISP>開始SIFを呼び出し
	 * 
	 * @param param
	 * @param handle
	 * @param inHash
	 * @param resultHash
	 * @return
	 * @throws RequestParameterException
	 * @throws SCException
	 */
	private int callEKK0361C040SC(IRequestParameterReadWrite param, SessionHandle handle,
			HashMap<String, Object> work, HashMap<String, Object> resultHash, HashMap<String, Object> userData)
			throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0361C040への呼び出しパラメータ設定
		template = new CAANMsg(EKK0361C040CBSMsg.class.getName());
		mappingEKK0361C040InMsg(template, work);
		editBasicCmn(param, template);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]
		{
			template
		});

		// SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);
		// エラーマッピング
		editResultRP(sIFResult, param, userData);
		// エラーチェック処理
		errChk(sIFResult);
		// SIFの実行結果を設定
		resultHash.putAll(getWorkCAANMsg(sIFResult));

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		return status;
	}
	
	/**
	 * templateに対してEKK0361C040の条件に関する部分を設定する
	 * 
	 * @param template
	 * @param inHash
	 */
	private void mappingEKK0361C040InMsg(CAANMsg template, HashMap<String, Object> work)
	{
		// 全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0361C040CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0361C040CBSMsg.TEMPLATEID, EKK0361C040);
		
		// 機能コード--オプションサービス契約開始
		template.set(EKK0361C040CBSMsg.FUNC_CODE, FUNC_CD_1);
		
		// オプションサービス契約番号
		template.set(EKK0361C040CBSMsg.OP_SVC_KEI_NO, (String)work.get("op_svc_kei_no"));
		
		// 異動区分
		template.set(EKK0361C040CBSMsg.IDO_DIV, "00031");
		
		// 更新年月日時分秒(更新前)
		template.set(EKK0361C040CBSMsg.UPD_DTM_BF, work.get("upd_dtm"));
		
	}
	
	/**
	 * 進捗登録SIF呼び出し
	 * @param param
	 * @param handle
	 * @param resultHash
	 * @param work
	 * @return
	 * @throws Throwable
	 */
	private int callEKK1091D010SC(IRequestParameterReadWrite param, SessionHandle handle,
			HashMap<String, Object> resultHash, HashMap<String, Object> work, HashMap<String, Object> userData) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK1091D010への呼び出しパラメータ設定
		template = new CAANMsg(EKK1091D010CBSMsg.class.getName());
		mappingEKK1091D010InMsg(template, work);
		editBasicCmn(param, template);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]
		{
			template
		});

		// SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);
		// エラーマッピング
		editResultRP(sIFResult, param, userData);
		// エラーチェック処理
		errChk(sIFResult);

		// SIFの実行結果を設定
		resultHash.putAll(getWorkCAANMsg(sIFResult));

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		return status;
	}
	

	/**
	 * templateに対してEKK1091D010の条件に関する部分を設定する
	 * 
	 * @param template
	 * @param inHash
	 */
	private void mappingEKK1091D010InMsg(CAANMsg template, HashMap work)
	{
		// 全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK1091D010CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK1091D010CBSMsg.TEMPLATEID, EKK1091D010);

		// 機能コード--進捗登録
		template.set(EKK1091D010CBSMsg.FUNC_CODE, FUNC_CD_1);

		// 申込詳細番号
		template.set(EKK1091D010CBSMsg.MSKM_DTL_NO, (String)work.get("mskm_dtl_no"));

		// サービス契約番号
		template.set(EKK1091D010CBSMsg.SVC_KEI_NO, (String)work.get("svc_kei_no"));

		// 異動区分
		template.set(EKK1091D010CBSMsg.IDO_DIV, "00031");

		// 異動年月日時分秒
		// IT1-2013-0000039 進捗スキーマ異動年月日時分秒対応 2013/01/11 START
//		template.set(EKK1091D010CBSMsg.IDO_DTM, addTimeStamp((String)work.get("tran_date")));
		template.set(EKK1091D010CBSMsg.IDO_DTM, JCCBPCommon.getSysDateTimeStamp());
		// IT1-2013-0000039 進捗スキーマ異動年月日時分秒対応 2013/01/11 END

		// 進捗ステータス
		template.set(EKK1091D010CBSMsg.PRG_STAT, "5102");

		// 異動理由明細の枠を作成
		CAANMsg[] eKK1091D010CBSMSG1LIST = null;

		CAANMsg  eKK1091D010CBSMSG1 = new CAANMsg(EKK1091D010CBSMsg1List.class.getName());
		eKK1091D010CBSMSG1.set(EKK1091D010CBSMsg1List.IDO_RSN_CD, IDO_RSN_CD_OTHER);
		eKK1091D010CBSMSG1.setNull(EKK1091D010CBSMsg1List.IDO_RSN_MEMO);
		eKK1091D010CBSMSG1LIST = new CAANMsg[]
		{
				eKK1091D010CBSMSG1
		};
		
		template.set(EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST, eKK1091D010CBSMSG1LIST);
	}
	
	/**
	 * オプションサービス契約＜ISP＞一意照会SIF呼び出し
	 * @param param
	 * @param handle
	 * @param paramMap
	 * @param resultHash
	 * @return
	 * @throws Throwable
	 */
	private int callEKK0361A010SC(IRequestParameterReadWrite param, SessionHandle handle, String opSvcKeiNo,
			HashMap<String, Object> resultHash, HashMap<String, Object> userData) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0361A010への呼び出しパラメータ設定
		template = new CAANMsg(EKK0361A010CBSMsg.class.getName());
		mappingEKK0361A010InMsg(template, opSvcKeiNo);
		editBasicCmn(param, template);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]
		{
			template
		});

		// SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);
		// エラーマッピング
		editResultRP(sIFResult, param, userData);
		// エラーチェック処理
		errChk(sIFResult);

		// SIFの実行結果を設定
		resultHash.putAll(getWorkCAANMsg(sIFResult));

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		return status;
	}
	
	/**
	 * templateに対してEKK0361A010の条件に関する部分を設定する
	 * 
	 * @param template
	 * @param inHash
	 */
	private void mappingEKK0361A010InMsg(CAANMsg template, String op_svc_kei_no)
	{
		// 全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0361A010CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0361A010CBSMsg.TEMPLATEID, EKK0361A010);

		// 機能コード--オプションサービス契約＜ISP＞一意照会
		template.set(EKK0361A010CBSMsg.FUNC_CODE, FUNC_CD_2);

		// オプションサービス契約番号
		template.set(EKK0361A010CBSMsg.KEY_OP_SVC_KEI_NO, op_svc_kei_no);
	}
	
	/**
	 * オプションサービス契約解約SIF呼び出し
	 * @param param
	 * @param handle
	 * @param paramMap
	 * @param resultHash
	 * @param jdgHiChrgHash
	 * @return
	 * @throws Throwable
	 */
	private int callEKK0351C240SC(IRequestParameterReadWrite param, SessionHandle handle, HashMap<String, Object> work,
// 20130214 課題対応 MOD START
//			HashMap<String, Object> resultHash, HashMap<String, Object> userData) throws Throwable
			HashMap<String, Object> resultHash, HashMap<String, Object> userData,HashMap<String, Object> jdgHiChrgMapSvcKei) throws Throwable
// 20130214 課題対応 MOD END
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0351C240への呼び出しパラメータ設定
		template = new CAANMsg(EKK0351C240CBSMsg.class.getName());
		// 20120214 内部課題 MOD START
		//mappingEKK0351C240InMsg(template, work);
		mappingEKK0351C240InMsg(template, work,jdgHiChrgMapSvcKei);
		// 20120214 内部課題 MOD END
		editBasicCmn(param, template);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]
		{
			template
		});

		// SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);
		// エラーマッピング
		editResultRP(sIFResult, param, userData);
		// エラーチェック処理
		errChk(sIFResult);

		// SIFの実行結果を設定
		resultHash.putAll(getWorkCAANMsg(sIFResult));

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		return status;
	}
	
	/**
	 * templateに対してEKK0351C240の条件に関する部分を設定する
	 * 
	 * @param template
	 * @param inHash
	 * @param inHash2
	 */
// 20120214 内部課題 MOD START
	//private void mappingEKK0351C240InMsg(CAANMsg template, HashMap<String, Object> work)
	private void mappingEKK0351C240InMsg(CAANMsg template, HashMap<String, Object> work, HashMap<String, Object> jdgHiChrgMapSvcKei)
// 20120214 内部課題 MOD END
	{
		// 全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0351C240CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0351C240CBSMsg.TEMPLATEID, EKK0351C240);

		// 機能コード--オプションサービス契約解約
		template.set(EKK0351C240CBSMsg.FUNC_CODE, FUNC_CD_1);

		// オプションサービス契約番号
		template.set(EKK0351C240CBSMsg.OP_SVC_KEI_NO, (String)work.get("op_svc_kei_no"));

		template.set(EKK0351C240CBSMsg.MSKM_DTL_NO, (String)work.get("mskm_dtl_no"));
		
		template.set(EKK0351C240CBSMsg.SVC_ENDYMD, (String)work.get("tran_date"));

		template.set(EKK0351C240CBSMsg.SVC_CHRG_ENDYMD, (String)work.get("tran_date"));

		// 異動区分
		template.set(EKK0351C240CBSMsg.IDO_DIV, "00031");
		
		// 更新年月日時分秒(更新前)
		template.set(EKK0351C240CBSMsg.UPD_DTM_BF, (String)work.get("last_upd_dtm"));
		
		// 20120214 内部課題 ADD START
		String operateDate = JCCBPCommon.getOpeDate(null);
		
		if(jdgHiChrgMapSvcKei == null)
		{
			template.set(EKK0351C240CBSMsg.SVC_CHRG_ENDYMD, (String) operateDate);
		}else{
			template.set(EKK0351C240CBSMsg.SVC_CHRG_ENDYMD, jdgHiChrgMapSvcKei.get("svcChrgEndYmd"));
		}
		// 20120214 内部課題 ADD END
		
		// 20131218 OM-2013-0005104 ADD START
		// サービス解約理由コード ← 通常解約
		template.set(EKK0351C240CBSMsg.SVC_DLRE_CD, "01");
		// 20131218 OM-2013-0005104 ADD END
	}
	
	/**
	 * オプションサービス契約解約確定SIF呼び出し
	 * @param param
	 * @param handle
	 * @param paramMap
	 * @param resultHash
	 * @param jdgHiChrgHash
	 * @return
	 * @throws Throwable
	 */
	private int callEKK0351C250SC(IRequestParameterReadWrite param, SessionHandle handle, HashMap<String, Object> work,
			// 20130214 課題対応 MOD START
			//HashMap<String, Object> resultHash, HashMap<String, Object> userData) throws Throwable
			HashMap<String, Object> resultHash, HashMap<String, Object> userData, HashMap<String, Object> jdgHiChrgMapSvcKei) throws Throwable
			// 20130214 課題対応 MOD END
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0351C250への呼び出しパラメータ設定
		template = new CAANMsg(EKK0351C250CBSMsg.class.getName());
		// 20120214 内部課題 MOD START
		//mappingEKK0351C250InMsg(template, work);
		mappingEKK0351C250InMsg(template, work, jdgHiChrgMapSvcKei);
		// 20120214 内部課題 MOD END
		editBasicCmn(param, template);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]
		{
			template
		});

		// SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);
		// エラーマッピング
		editResultRP(sIFResult, param, userData);
		// エラーチェック処理
		errChk(sIFResult);

		// SIFの実行結果を設定
		resultHash.putAll(getWorkCAANMsg(sIFResult));

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		return status;
	}
	
	/**
	 * templateに対してEKK0351C250の条件に関する部分を設定する
	 * 
	 * @param template
	 * @param inHash
	 *  @param inHash2
	 */
	// 20120214 内部課題 MOD START
	//private void mappingEKK0351C250InMsg(CAANMsg template, HashMap<String, Object> work)
	private void mappingEKK0351C250InMsg(CAANMsg template, HashMap<String, Object> work, HashMap<String, Object>jdgHiChrgMapSvcKei)
	// 20120214 内部課題 MOD END
	{
		// 全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0351C250CBSMsg().getContents());
		
		// テンプレートID(SIFのID)
		template.set(EKK0351C250CBSMsg.TEMPLATEID, EKK0351C250);
		
		// 機能コード--オプションサービス契約解約
		template.set(EKK0351C250CBSMsg.FUNC_CODE, FUNC_CD_1);
		
		// オプションサービス契約番号
		template.set(EKK0351C250CBSMsg.OP_SVC_KEI_NO, (String)work.get("op_svc_kei_no"));
		
		// サービス終了年月日
		template.set(EKK0351C250CBSMsg.SVC_ENDYMD, (String)work.get("tran_date"));
		
		// サービス課金終了年月日
		// 20120214 内部課題 MOD START
		//template.set(EKK0351C250CBSMsg.SVC_CHRG_ENDYMD, (String)work.get("tran_date"));
		String operateDate = JCCBPCommon.getOpeDate(null);
		if(jdgHiChrgMapSvcKei == null)
		{
			template.set(EKK0351C250CBSMsg.SVC_CHRG_ENDYMD, getDayOfBefore((String)operateDate));
		}
		// SEP-0020-00-00 現行ICS指摘対応：337 ADD START
		else
		{
			//OM-2013-0000699 CHG START 2013/8/24
//			template.set(EKK0351C250CBSMsg.SVC_CHRG_ENDYMD, getDayOfBefore((String)jdgHiChrgMapSvcKei.get("svcChrgEndYmd")));
			template.set(EKK0351C250CBSMsg.SVC_CHRG_ENDYMD, jdgHiChrgMapSvcKei.get("svcChrgEndYmd"));
			//OM-2013-0000699 CHG END 2013/8/24
		}
		
		String chrgFlg = "0";
		if(jdgHiChrgMapSvcKei != null)
		{
			chrgFlg = (String)jdgHiChrgMapSvcKei.get("chrgFlg");
		}
		
		// 解約時課金フラグ
		template.set(EKK0351C250CBSMsg.DSLJI_CHRG_FLG, chrgFlg);

		// 20120214 内部課題 MOD END
		
		// 異動区分
		template.set(EKK0351C250CBSMsg.IDO_DIV, "00031");
		
		// 更新年月日時分秒(更新前)
		template.set(EKK0351C250CBSMsg.UPD_DTM_BF, (String)work.get("upd_dtm"));
		
		// 20131218 OM-2013-0005104 ADD START
		// サービス解約理由コード ← 通常解約
		template.set(EKK0351C250CBSMsg.SVC_DLRE_CD, "01");
		// 20131218 OM-2013-0005104 ADD END
		
	}
	
	/**
	 * 課金先一覧照会（請求契約番号/サービス契約番号）SIF呼び出し
	 * @param param
	 * @param handle
	 * @param paramMap
	 * @param resultHash
	 * @return
	 * @throws Throwable
	 */
	private int callEKK0321B002SC(IRequestParameterReadWrite param, SessionHandle handle, HashMap<String, Object> work,
			HashMap<String, Object> resultHash, HashMap<String, Object> userData) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0321B002への呼び出しパラメータ設定
		template = new CAANMsg(EKK0321B002CBSMsg.class.getName());
		mappingEKK0321B002InMsg(template, work);
		editBasicCmn(param, template);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]
		{
			template
		});

		// SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);
		// エラーマッピング
		editResultRP(sIFResult, param, userData);
		// エラーチェック処理
		errChk(sIFResult);

		// SIFの実行結果を設定
		resultHash.putAll(getWorkCAANMsg(sIFResult));

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		return status;
	}
	
	/**
	 * templateに対してEKK0321B002の条件に関する部分を設定する
	 * 
	 * @param template
	 * @param inHash
	 */
	private void mappingEKK0321B002InMsg(CAANMsg template, HashMap<String, Object> work)
	{
		// 全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0321B002CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0321B002CBSMsg.TEMPLATEID, EKK0321B002);

		// 機能コード--サービス契約一意照会
		template.set(EKK0321B002CBSMsg.FUNC_CODE, FUNC_CD_1);

		// ＫＥＹ＿サービス契約番号
		template.set(EKK0321B002CBSMsg.KEY_SVC_KEI_NO, (String)work.get("svc_kei_no"));

	}
	
	/**
	 * チェック処理<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> map = new HashMap<String, Object>();
		// SCインプット共通データ
		// **********************************************
		// 【取得元：電文ヘッダ(ヘッダ)】
		// **********************************************
		// 電文ID
		map.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		map.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		map.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		map.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());

		// **********************************************
		// 【取得元：ユーザエリア(コントロールマップ)】
		// **********************************************
		// 依頼先ホスト名
		map.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		map.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		map.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		map.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));

		map.put(JCMConstants.TEMPLATE_LIST_KEY, null);

		return map;
	}
	
	/**
	 * サービスインターフェイス処理結果(エラー情報)の取得<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
	{
		return param;
	}
	
	/**
	 * 業務データの取得処理です。
	 * 
	 * @param rslt SVIFの実行結果データ
	 * @return 業務データ
	 */
	private HashMap<String, Object> getWorkCAANMsg(Map<?, ?> rslt)
	{
		CAANMsg[] templates = (CAANMsg[])rslt.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];

		return parentTemplate.getMsgData();
	}
	
	/**
	 * Nullマッピングで埋める
	 * @param msg 対象クラス
	 * @param contents 対応クラスのフィールド列挙
	 */
	private void fillCAANMSGNullMapping(CAANMsg msg, Object[][] contents)
	{
		
		//要素ごとのループ
		for(int i = 0 ; i < contents.length ; i++)
		{
			
			Object element = null;
			
			//キーに該当する箇所の取得
			element = contents[i][0];

			//Nullでマッピング
			msg.setNull((String)element);
			
		}
		
	}
	
	/**
	 * 条件部の共通する項目の設定
	 * @param param リクエストパラメータ
	 * @param template template 条件の設定先
	 * @throws RequestParameterException
	 */
	public void editBasicCmn(IRequestParameterReadOnly param, CAANMsg template)
	throws RequestParameterException
	{
		
		// オペレータ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);
		
	}
	
	/**
	 * サービスI/F実行用の共通部を設定します<br>
	 * <br>
	 * 
	 * @param param (I) 業務データ取得用I/F
	 * @param msg データ登録内容
	 * @return オプションサービス契約作成数
	 * @throws RequestParameterException
	 * @exception RequestParameterExceptionがスローされます 。
	 */
	private HashMap<String, Object> editInMsgCmn(IRequestParameterReadOnly param) 
	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));
				
		return paramMap;
		
	}
	
	/**
	 * 値がnullか空白かのチェック
	 * @param arg
	 * @return 値がnullまたは空白の場合true
	 */
	private boolean isNullorEmpty(String arg)
	{
		if (arg == null || "".equals(arg))
		{
			return true;
		}
		
		return false;
	}
	
	/**
	 * エラーチェック処理です。 <br>
	 * 
	 * @param msgList サービスインタフェース実行結果
	 * @return void
	 * @throws SCCallException
	 */
	private void errChk(Map<?, ?> msgList) throws SCCallException
	{
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Integer returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);

		// ステータス取得
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);

		if ((0 != returnCode.intValue()) || (0 != templateStatus))
		{
			String errMsg = ERR_MSG;
			throw new SCCallException(errMsg, String.valueOf(returnCode), templateStatus);
		}
	}
	
	/**
	 * <pre>
	 * サービスコンポーネント実行後に、IRequestParameterReadWriteに必要なデータをマッピングする
	 * 
	 * @param msgList CAANMsgクラス
	 * @param param 業務データ取得・書込用I/F
	 * @param fixedText ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable
	 */
	public IRequestParameterReadWrite editResultRP(Map<?, ?> msgList, IRequestParameterReadWrite param, HashMap<String, Object> inMap)
			throws Throwable
	{
		// SCからの戻り値からCAANMsgを取得する。
		CAANMsg[] templates = (CAANMsg[])msgList.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg template = templates[0];

		// リターンコード取得
		Integer returnCode = (Integer)msgList.get(JCMConstants.RET_CD_INT_KEY);

		// テンプレートID、ステータス取得
		String templateId = template.getString(JCMConstants.TEMPLATE_ID_KEY);
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);

		if (returnCode.intValue() != 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 inMap = (HashMap)param.getData(fixText);
		
		// ユーザデータ情報にエラー情報をマッピング
		Object[][] contents = null;
		
		if (EKK0081A010.equals(templateId))
		{
			contents = new EKK0081A010CBSMsg().getContents();
		}
		else if (EKK0021C060.equals(templateId))
		{
			contents = new EKK0021C060CBSMsg().getContents();
		}
		else if (EKK0361D010.equals(templateId))
		{
			contents = new EKK0361D010CBSMsg().getContents();
		}
		else if (EKK0361C030.equals(templateId))
		{
			contents = new EKK0361C030CBSMsg().getContents();
		}
		else if (EKK0361C040.equals(templateId))
		{
			contents = new EKK0361C040CBSMsg().getContents();
		}
		else if (EKK1091D010.equals(templateId))
		{
			contents = new EKK1091D010CBSMsg().getContents();
		}
		else if (EKK0361A010.equals(templateId))
		{
			contents = new EKK0361A010CBSMsg().getContents();
		}
		else if (EKK0351C240.equals(templateId))
		{
			contents = new EKK0351C240CBSMsg().getContents();
		}
		else if (EKK0351C250.equals(templateId))
		{
			contents = new EKK0351C250CBSMsg().getContents();
		}
		else if (EKK0321B002.equals(templateId))
		{
			contents = new EKK0321B002CBSMsg().getContents();
		}
		// 20130214 内部課題 ADD START
		else if (EKK0351A010.equals(templateId))
		{
			contents = new EKK0351A010CBSMsg().getContents();
		}
		// 20130214 内部課題 ADD END
		for (int i = 0; contents != null && i < contents.length; i++)
		{
			String element = null;
			element = (String)contents[i][0];
			if (element.indexOf("_err") > 0)
			{
				if (!template.isNull(element))
				{
					if (!inMap.containsKey(element))
					{
						inMap.put(element, template.getString(element));
					}
				}
			}
		}

		// エラー情報のマップを取得
		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;
	}

	/**
	 * 指定された年月日に時分秒を付加します。
	 * 
	 * @param arg0 年月日
	 * @return YYYYMMDDhhmmssSSS形式の運用日時
	 */
	private String addTimeStamp(String arg0)
	{
		String opeTime = JCCBPCommon.getSysDateTimeStamp();
		return arg0 + opeTime.substring(8, 17);
	}

	// 20130214 内部課題対応 ADD START
	/**
	 * 非課金判定部品実行処理
	 * 
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param inMap 入力パラメータ
	 * @param msgEKK0081A010 サービス契約一意照会結果
	 * @param msgEKK0351A010 オプションサービス契約一意照会結果
	 * @param dslSbtFlg 解約種別フラグ
	 * @throws Throwable 
	 */
	private HashMap<String, Object> runHiChrgJdgUtil(
			SessionHandle handle,
			IRequestParameterReadWrite param,
			HashMap<String, Object> inMap,
			CAANMsg msgEKK0081A010,
			CAANMsg msgEKK0351A010,
			String dslSbtFlg
	) throws Throwable
	{
		// 引数チェック
		if(dslSbtFlg == null)
		{
			throw new IllegalArgumentException("解約種別フラグが設定されていません");
		}
		else if(msgEKK0081A010 == null)
		{
			throw new IllegalArgumentException("サービス契約一意照会結果が設定されていません");
		}
		// サポート外の解約種別フラグを選択された場合、エラー
		else if(!DSL_SBT_FLG_SVC_KEI_DSL.equals(dslSbtFlg) && !DSL_SBT_FLG_OP_SVC_KEI_DSL.equals(dslSbtFlg) && !DSL_SBT_FLG_SBOP_SVC_KEI_DSL.equals(dslSbtFlg))
		{
			throw new IllegalArgumentException("不正な解約種別フラグが選択されました。");
		}
		// 指定した解約種別フラグに対応した結果オブジェクトが設定されていない場合、エラー
		else if(
				(DSL_SBT_FLG_OP_SVC_KEI_DSL.equals(dslSbtFlg) && (msgEKK0351A010 == null))
		)
		{
			throw new IllegalArgumentException("指定した解約種別フラグに応じた結果オブジェクトが設定されていません");
		}

		// ワーク領域に存在する場合、ワーク領域から削除する
		if(getWorkjdgHiChrgJdgUtil(param) != null)
		{
			delWorkJdgHiChrgJdgUtil(param);
		}

		HashMap<String, Object> trgtData = null;
		HashMap<String, Object> resultMap = null;

		// 必要な情報をマッピングする
		trgtData = editMapHiChrgJdgUtil(inMap, msgEKK0081A010, msgEKK0351A010,  dslSbtFlg);

		// マッピングがNULLの場合は実行しない
		if(trgtData != null)
		{
			// ▼▼▼▼▼ 2013/09/11 OM-2013-0001096 UPD START ▼▼▼▼▼
			resultMap = JKKBpCommon.jdgHiChrgKK(handle, param, trgtData, dslSbtFlg);
			// ▲▲▲▲▲ 2013/09/11 OM-2013-0001096 UPD E N D ▲▲▲▲▲

			// 結果をワーク領域に保持する
			if(resultMap != null)
			{
				setWorkJdgHiChrgJdgUtil(param, resultMap);
			}
		}

		return resultMap;
	}
	
	/**
	 * 非課金判定部品実行結果登録処理
	 * 
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param inMap 入力パラメータ
	 * @param HiChrgJdgResultMap 非課金判定部品実行結果
	 * @throws RequestParameterException 
	 * @throws Throwable 
	 */
	private void setWorkJdgHiChrgJdgUtil(IRequestParameterReadWrite param, HashMap<String, Object> jdgHiChrgJdgResultMap) throws RequestParameterException
	{
		param.setData("jdgHiChrgJdgMap", jdgHiChrgJdgResultMap);
	}
	
	/**
	 * 非課金判定部品実行結果取得処理
	 * 
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @return 非課金判定部品実行結果
	 * @throws RequestParameterException 
	 * @throws Throwable 
	 */
	private Object getWorkjdgHiChrgJdgUtil(IRequestParameterReadWrite param) throws RequestParameterException
	{
		return param.getData("jdgHiChrgJdgMap");
	}
	
	/**
	 * 非課金判定部品実行結果削除処理
	 * 
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param inMap 入力パラメータ
	 * @param HiChrgJdgResultMap 非課金判定部品実行結果
	 * @throws RequestParameterException 
	 * @throws Throwable 
	 */
	private void delWorkJdgHiChrgJdgUtil(IRequestParameterReadWrite param) throws RequestParameterException
	{
		param.removeData("jdgHiChrgJdgMap");
	}

	/**
	 *<DL>
	 *<DT>処理概要:非課金判定部品のマッピング処理
	 *<DD>サービスコンポーネント実行前に、CAANMsgに必要なデータをマッピングする
	 *<DT>入力パラメータ説明:
	 *<DD>特になし
	 *<DT>入力パラメータ説明：
	 *<DD>特になし
	 *<DT>出力パラメータ説明:
	 *<DD>特になし
	 *</DL>
	 * @param	inMap			業務情報を保持するマップ
	 * @param	msgEKK0081A010	サービス契約一意照会結果
	 * @param	msgEKK0351A010	オプションサービス契約一意照会結果
	 * @param	dslSbtFlg		解約種別フラグ
	 * @throws	RequestParameterException
	 * @since	2013.02.14
	 */
	public HashMap<String, Object> editMapHiChrgJdgUtil(
			HashMap<String, Object> inMap,
			CAANMsg msgEKK0081A010,
			CAANMsg msgEKK0351A010,
			String dslSbtFlg
	) throws RequestParameterException 
	{
		HashMap<String, Object> workMap = new HashMap<String, Object>();


		// オプションサービス契約サービス利用終了日
		if (inMap == null || inMap.get("svc_endymd") == null || "".equals(inMap.get("svc_endymd")))
		{
			workMap.put("opSvcUseEndYmd", JCCBPCommon.getOpeDate(null));
		}
		else
		{
			workMap.put("opSvcUseEndYmd", inMap.get("svc_endymd"));
		}

		return editMapHiChrgJdgUtil(
				inMap,
				msgEKK0081A010,
				msgEKK0351A010,
				dslSbtFlg,
				workMap
		);
	}

	/**
	 *<DL>
	 *<DT>処理概要:非課金判定部品のマッピング処理
	 *<DD>サービスコンポーネント実行前に、CAANMsgに必要なデータをマッピングする
	 *<DT>入力パラメータ説明:
	 *<DD>特になし
	 *<DT>入力パラメータ説明：
	 *<DD>特になし
	 *<DT>出力パラメータ説明:
	 *<DD>特になし
	 *</DL>
	 * @param	inMap			業務情報を保持するマップ
	 * @param	msgEKK0081A010	サービス契約一意照会結果
	 * @param	msgEKK0351A010	オプションサービス契約一意照会結果
	 * @param	dslSbtFlg		解約種別フラグ
	 * @param	workMap			ワークマップ
	 * @throws	RequestParameterException
	 * @since	2013.02.14
	 */
	public HashMap<String, Object> editMapHiChrgJdgUtil(
			HashMap<String, Object> inMap,
			Object msgEKK0081A010,
			Object msgEKK0351A010,
			String dslSbtFlg,
			HashMap<String, Object> workMap
	) throws RequestParameterException 
	{
		HashMap<String, Object> jdgHiChrgMap = new HashMap<String, Object>();

		// ▼▼▼▼▼ 2013/09/11 OM-2013-0001096 UPD START ▼▼▼▼▼
		// サービス契約番号の取得
		String svcKeiNo = getDataAtObject(msgEKK0081A010, EKK0081A010CBSMsg1List.SVC_KEI_NO);

		// サービス契約番号セット
		jdgHiChrgMap.put("svc_kei_no", svcKeiNo);
		// ▲▲▲▲▲ 2013/09/11 OM-2013-0001096 UPD E N D ▲▲▲▲▲

		String opSvcKeiStat = getDataAtObject(msgEKK0351A010, EKK0351A010CBSMsg1List.OP_SVC_KEI_STAT);

		if(doRunHiChrgJdgUtilStat(opSvcKeiStat))
		{
			// 解約種別フラグ
			jdgHiChrgMap.put("dslSbtFlg", dslSbtFlg);

			// サービス契約サービス課金開始日
			jdgHiChrgMap.put("svcKeiChrgStaYmd", getDataAtObject(msgEKK0081A010, EKK0081A010CBSMsg1List.SVC_CHRG_STAYMD));

			// オプションサービスコード
			jdgHiChrgMap.put("opSvcCd",          getDataAtObject(msgEKK0351A010, EKK0351A010CBSMsg1List.OP_SVC_CD));

			// オプションサービス契約サービス利用開始日
			jdgHiChrgMap.put("opSvcUseStaYmd",   getDataAtObject(msgEKK0351A010, EKK0351A010CBSMsg1List.SVC_STAYMD));

			// オプションサービス契約サービス利用終了日
			jdgHiChrgMap.put("opSvcUseEndYmd",   workMap.get("opSvcUseEndYmd"));
		}
		else
		{
			// 非課金判定部品を実行しなくていい場合は、nullを返却
			jdgHiChrgMap = null;
		}

		return jdgHiChrgMap;
	}

	/**
	 * 
	 * @param	msgObject
	 * @param	key
	 * @return
	 */
	private String getDataAtObject(Object msgObject, String key)
	{
		if (msgObject instanceof CAANMsg)
		{
			return ((CAANMsg)msgObject).getString(key);
		}
		else if (msgObject instanceof HashMap)
		{
			return (String)((HashMap<String, Object>)msgObject).get(key);
		}
		else
		{
			return null;
		}
	}
	
	/**
	 * 非課金判定部品実行可否の取得
	 * 
	 * @param	svcKeiStat	サービス契約ステータス
	 * @return	boolean		非課金判定部品実行可否
	 */
	private boolean doRunHiChrgJdgUtilStat(String svcKeiStat)
	{
		boolean doRun = false;

		// サービス提供中 or 休止・中断中 or 停止中の場合は、非課金判定部品を実行する
		if(
				JKKDslRun.STAT_SVCTK_CHU.equals(svcKeiStat)
				|| JKKDslRun.STAT_PAUSECHU.equals(svcKeiStat)
				|| JKKDslRun.STAT_STP_CHU.equals(svcKeiStat)
		)
		{
			doRun = true;
		}

		return doRun;
	}
	
	/**
	 * オプションサービス契約一意照会SIF呼び出し
	 * @param param
	 * @param handle
	 * @param paramMap
	 * @param resultHash
	 * @return
	 * @throws Throwable
	 */
	private int callEKK0351A010SC(IRequestParameterReadWrite param, SessionHandle handle, String opSvcKeiNo,
			HashMap<String, Object> resultHash, HashMap<String, Object> userData) throws Throwable
	{
		HashMap<String, Object> sIFRequest = null;
		CAANMsg template = null;
		ServiceComponentRequestInvoker scCall = null;
		Map<?, ?> sIFResult = null;
		int status = 0;

		// サービスIF共通の情報を設定
		sIFRequest = editInMsgCmn(param);

		// EKK0351A010への呼び出しパラメータ設定
		template = new CAANMsg(EKK0351A010CBSMsg.class.getName());
		mappingEKK0351A010InMsg(template, opSvcKeiNo);
		editBasicCmn(param, template);

		// リクエスト用クラスの設定
		sIFRequest.put(JCMConstants.TEMPLATE_LIST_KEY, new CAANMsg[]
		{
			template
		});

		// SC呼び出しクラスの生成
		scCall = new ServiceComponentRequestInvoker();

		// SIFの呼び出し
		sIFResult = scCall.run(sIFRequest, handle);
		// エラーマッピング
		editResultRP(sIFResult, param, userData);
		// エラーチェック処理
		errChk(sIFResult);

		// SIFの実行結果を設定
		resultHash.putAll(getWorkCAANMsg(sIFResult));

		// ステータスコードの取得
		status = template.getInt(JCMConstants.STATUS_INT_KEY);

		return status;
	}
	
	/**
	 * templateに対してEKK0351A010の条件に関する部分を設定する
	 * 
	 * @param template
	 * @param inHash
	 */
	private void mappingEKK0351A010InMsg(CAANMsg template, String op_svc_kei_no)
	{
		// 全条件のNullマッピング
		fillCAANMSGNullMapping(template, new EKK0351A010CBSMsg().getContents());

		// テンプレートID(SIFのID)
		template.set(EKK0351A010CBSMsg.TEMPLATEID, EKK0351A010);

		// 機能コード--オプションサービス契約一意照会
		template.set(EKK0351A010CBSMsg.FUNC_CODE, FUNC_CD_2);

		// オプションサービス契約番号
		template.set(EKK0351A010CBSMsg.KEY_OP_SVC_KEI_NO, op_svc_kei_no);
		
		String operateDate = JCCBPCommon.getOpeDate(null);
		
		// 予約適用年月日
		template.set(EKK0351A010CBSMsg.KEY_RSV_APLY_YMD, operateDate);

	}

	/**
	 * 前日取得処理
	 * @param ymd 日付(yyyyMMdd形式)
	 * @return インプットの前日(yyyyMMdd形式)
	 */
	private String getDayOfBefore(String ymd)
	{
		// 年月日の抽出
		int year = Integer.parseInt(ymd.substring(0, 4));
		int month = Integer.parseInt(ymd.substring(4, 6));
		int day = Integer.parseInt(ymd.substring(6, 8));
		
		Calendar cal = Calendar.getInstance();
		cal.set(year, month - 1, day);
		// 前日を算出
		cal.add(Calendar.DATE, -1);
		
		return String.format("%tY%tm%td", cal, cal, cal);
	}

	// 20130214 内部課題対応 ADD END

}
