/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUWribSvcKeiAutoAddCC
*   ソースファイル名：JFUWribSvcKeiAutoAddCC.java
*   作成者          ：富士通
*   日付            ：2011年10月24日
*＜機能概要＞
*   割引サービス契約自動登録コモンコンポーネント部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/10/24   FJ）中谷    新規作成
*   v3.00       2012/05/12   FJ) 山本    サービスIF再新化（割引サービス契約登録スキーマに必須IN項目追加）
*   v4.00       2012/10/04   FJ) 岡井    【ANK-1223-00-00】 進捗補足事項編集対応
*   v4.00       2012/11/21   FJ）中谷    【IT1-2012-0001900】割引サービス契約の開始対応
*   v5.00       2013/06/12   FJ）岡井    【内部障害】進捗登録.異動年月日時分秒にシステム日付を設定するように修正
*   v5.00       2013/10/25   FJ）中谷    【OM-2013-0003633】メール送信先の不具合対応
*   v5.00       2013/10/31   FJ）中谷    【OM-2013-0003717】割引サービス契約の開始処理削除対応
*   v7.00       2013/11/28   FJ）岡井    【ANK-1578-00-00】多機能ルーター(機器追加)
*   
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

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 eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0011D020CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0011D020CBSMsg1List;
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.EKK0321D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451D010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0451D010CBSMsg2List;
import eo.ejb.cbs.cbsmsg.EKK0491A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0491A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0851B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0851B001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg1List;

/**
 * 割引サービス契約自動登録コモンコンポーネント部品です。
 * 
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUWribSvcKeiAutoAddCC extends JFUBaseNetChgCommonCC
{
	/** IN項目:要求種別コード */
	private static final String IN_PARAM_YOKYU_SBT_CD = "yokyu_sbt_cd";
	/** IN項目:申込明細番号 */
	private static final String IN_PARAM_MSKM_DTL_NO = "mskm_dtl_no";
	/** IN項目:サービス契約番号 */
	private static final String IN_PARAM_KEY_SVC_KEI_NO = "key_svc_kei_no";
	/** IN項目:異動区分 */
	private static final String IN_PARAM_KEY_IDO_DIV = "ido_div";
	/** IN項目:料金コースコード */
	private static final String IN_PARAM_PCRS_CD = "pcrs_cd";
	/** IN項目:料金プランコード */
	private static final String IN_PARAM_PPLAN_CD = "pplan_cd";
	/** IN項目:進捗特記事項1 */
	private static final String PRG_TKJK_1 = "prg_tkjk_1";

	/** 機器オプションサービス契約登録リスト */
	protected static final String KKOP_ADD_LIST = "kkop_add_list";
	/** 機器オプションサービス契約番号 */
	private static final String KKOP_SVC_KEI_NO = "kkop_svc_kei_no";
	/** 変更前機器オプションサービス契約世代登録年月日 */
	private static final String BF_GENE_ADD_DTM = "bf_gene_add_dtm";
	/** 変更後機器オプションサービス契約世代登録年月日 */
	private static final String AF_GENE_ADD_DTM = "af_gene_add_dtm";

	/** SC名:申込内容承認登録 */
	private static final String SC_NAME_MSKM = "FUSV008001SC";
	/** SOD作業マップ */
	protected static final String SOD_WORK_MAP = "sod_work_map";
	/** サービスメッセージ:初期表示 */
	private static final String FIXED_TXT_INIT = "FUSV0079";
	/** サービスメッセージ:申込 */
	private static final String FIXED_TXT_MSKM = "FUSV0080";

	/* ■□ サービスオーダー発行CC ■□ */
	/** SOD(対象データリスト) */
	private static final String SOD_TRGT_DATA_LIST = "trgt_data_list";
	/** SOD(SOD基本情報) */
	private static final String SOD_SOD_KIHON_INFO = "sod_kihon_info";
	/** SOD(SYSID) */
	private static final String SOD_SYSID = "sysid";
	/** SOD(異動区分) */
	private static final String SOD_IDO_DIV = "ido_div";
	/** SOD(処理区分) */
	private static final String SOD_SHORI_DIV = "shori_div";
	/** SOD(サービス契約情報) */
	private static final String SOD_SVC_KEI_INFO = "svc_kei_info";
	/** SOD(サービス契約番号) */
	private static final String SOD_SVC_KEI_NO = "svc_kei_no";
	/** SOD(オプションサービス契約情報) */
	private static final String SOD_OPSVKEI_INFO = "opsvkei_info";
	/** SOD(機器オプションサービス契約情報) */
	private static final String SOD_KKOPSVCKEI_INFO = "kkopsvkei_info";
	/** SOD(変更後オプションサービス契約番号) */
	private static final String SOD_CHAF_OPSVKEI_NO = "chaf_opsvkei_no";
	/** SOD(変更後サブオプションサービス契約番号) */
	private static final String SOD_CHAF_SBOPSVKEI_NO = "chaf_sbopsvkei_no";
	/** SOD(変更後サブオプションサービス契約世代登録年月日時分秒) */
	private static final String SOD_CHAF_SBOPSVKEI_GENE_DTM = "chaf_sbopsvkei_gene_add_dtm";
	/** SOD(機器オプションサービス契約番号) */
	private static final String SOD_KKOP_SVC_KEI_NO = "kkop_svc_kei_no";
	/** SOD(変更前機器オプションサービス契約世代登録年月日) */
	private static final String SOD_CHBF_KKOPSVKEI_GENE_ADD_DTM = "chbf_kkopsvkei_gene_add_dtm";
	/** SOD(変更後機器オプションサービス契約世代登録年月日) */
	private static final String SOD_CHAF_KKOPSVKEI_GENE_ADD_DTM = "chaf_kkopsvkei_gene_add_dtm";
	/** SOD(処理区分：1 メール) */
	private static final String SOD_SHORI_DIV_1 = "1";
	/** SOD(処理区分：2 多機能ルーター) */
	private static final String SOD_SHORI_DIV_2 = "2";

	/* ■□ サービス契約一意照会SC ■□ */
	/** テンプレートID(サービス契約一意照会) */
	private static final String TEMPLATE_ID_1 = "EKK0081A010";
	/** テンプレートID(サービス契約一意照会明細) */
	private static final String TEMPLATE_ID_1_DETAIL = EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST;
	/** IN項目リスト(サービス契約一意照会) */
	private static final List<String> IN_COLUMN_LIST_1 =
			Arrays.asList(EKK0081A010CBSMsg.KEY_SVC_KEI_NO, EKK0081A010CBSMsg.KEY_GENE_ADD_DTM, EKK0081A010CBSMsg.KEY_RSV_APLY_YMD);
	/** 関連チェックエラー項目(サービス契約一意照会) */
	private static final String ERROR_COLUMN_1 = EKK0081A010CBSMsg.KEY_SVC_KEI_NO_ERR;
	/** SC実行結果取得キー(サービス契約一意照会) */
	private static final String TEMP_TEMPLATE_KEY_1 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_1 + TEMP_TEMPLATE_PRIFIX_SEP + "1";

	/* ■□ 課金先一覧照会（請求契約番号/サービス契約番号）SC ■□ */
	/** テンプレートID(課金先一覧照会（請求契約番号/サービス契約番号) */
	private static final String TEMPLATE_ID_2 = "EKK0321B002";
	/** テンプレートID(課金先一覧照会（請求契約番号/サービス契約番号明細) */
	private static final String TEMPLATE_ID_2_DETAIL = EKK0321B002CBSMsg.EKK0321B002CBSMSG1LIST;
	/** IN項目リスト(課金先一覧照会（請求契約番号/サービス契約番号) */
	private static final List<String> IN_COLUMN_LIST_2 = Arrays.asList(EKK0321B002CBSMsg.KEY_SVC_KEI_NO, EKK0321B002CBSMsg.KEY_SEIKY_KEI_NO);
	/** 関連チェックエラー項目(課金先一覧照会（請求契約番号/サービス契約番号) */
	private static final String ERROR_COLUMN_2 = EKK0321B002CBSMsg.KEY_SVC_KEI_NO_ERR;
	/** SC実行結果取得キー(課金先一覧照会（請求契約番号/サービス契約番号) */
	private static final String TEMP_TEMPLATE_KEY_2 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_2 + TEMP_TEMPLATE_PRIFIX_SEP + "1";

	/* ■□ 割引サービス契約登録SC ■□ */
	/** テンプレートID(割引サービス契約<月額費用割引>登録) */
	private static final String TEMPLATE_ID_3 = "EKK0451D010";
	/** テンプレートID(割引サービス契約<月額費用割引>登録明細) */
	private static final String TEMPLATE_ID_3_DETAIL = EKK0451D010CBSMsg.EKK0451D010CBSMSG1LIST;
	/** IN項目リスト(割引サービス契約<月額費用割引>登録) */
	private static final List<String> IN_COLUMN_LIST_3 =
			Arrays.asList(EKK0451D010CBSMsg.SYSID, EKK0451D010CBSMsg.WRIB_SVC_CD, EKK0451D010CBSMsg.PCRS_CD, EKK0451D010CBSMsg.PPLAN_CD,
					EKK0451D010CBSMsg.SVC_USE_STA_KIBO_YMD, EKK0451D010CBSMsg.RSV_TSTA_KIBO_YMD, EKK0451D010CBSMsg.MSKM_DTL_NO,
					EKK0451D010CBSMsg.APLY_JUN, EKK0451D010CBSMsg.PNLTY_HASSEI_CD, EKK0451D010CBSMsg.IDO_DIV, EKK0451D010CBSMsg.MSKM_KISAN_YMD,
					EKK0451D010CBSMsg.WRIB_ADD_OPTY_CD, EKK0451D010CBSMsg.UPD_DTM_BF);
	/** IN項目リスト明細(割引サービス契約<月額費用割引>登録) */
	private static final List<String> IN_COLUMN_LIST_3_DETAIL =
			Arrays.asList(EKK0451D010CBSMsg1List.TG_KEI_SKBT_CD, EKK0451D010CBSMsg1List.SVC_KEI_NO, EKK0451D010CBSMsg1List.SVC_KEI_UCWK_NO,
					EKK0451D010CBSMsg1List.OP_SVC_KEI_NO, EKK0451D010CBSMsg1List.SBOP_SVC_KEI_NO, EKK0451D010CBSMsg1List.KKTK_SVC_KEI_NO,
					EKK0451D010CBSMsg1List.WRIB_SVC_TRGT_SVC_CD, EKK0451D010CBSMsg1List.SET_ADD_YMD, EKK0451D010CBSMsg1List.WRISVC_TG_KEI_TSTAYMD,
					EKK0451D010CBSMsg1List.WRISVC_TG_KEI_TENDYMD);
	/** 関連チェックエラー項目(割引サービス契約<月額費用割引>登録) */
	private static final String ERROR_COLUMN_3 = null;
	/** SC実行結果取得キー(割引サービス契約<月額費用割引>登録) */
	private static final String TEMP_TEMPLATE_KEY_3 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_3 + TEMP_TEMPLATE_PRIFIX_SEP + "1";

	/* ■□ 課金先登録SC ■□ */
	/** テンプレートID(課金先登録) */
	private static final String TEMPLATE_ID_6 = "EKK0321D010";
	/** テンプレートID(課金先登録明細) */
	private static final String TEMPLATE_ID_6_DETAIL = null;
	/** IN項目リスト(課金先登録) */
	private static final List<String> IN_COLUMN_LIST_6 =
			Arrays.asList(EKK0321D010CBSMsg.SEIKY_KEI_NO, EKK0321D010CBSMsg.SVC_KEI_NO, EKK0321D010CBSMsg.SVC_KEI_UCWK_NO,
					EKK0321D010CBSMsg.KKTK_SVC_KEI_NO, EKK0321D010CBSMsg.OP_SVC_KEI_NO, EKK0321D010CBSMsg.SEIOPSVC_KEI_NO,
					EKK0321D010CBSMsg.SBOP_SVC_KEI_NO, EKK0321D010CBSMsg.WRIB_SVC_KEI_NO, EKK0321D010CBSMsg.OWNR_KEI_NO,
					EKK0321D010CBSMsg.PRC_KMK_CD, EKK0321D010CBSMsg.KAKINS_TSTAYMD, EKK0321D010CBSMsg.KAKINS_TENDYMD, EKK0321D010CBSMsg.UPD_DTM_BF);
	/** 関連チェックエラー項目(課金先登録) */
	private static final String ERROR_COLUMN_6 = null;

	/* ■□ 進捗登録SC ■□ */
	/** テンプレートID(進捗登録) */
	private static final String TEMPLATE_ID_7 = "EKK1091D010";
	/** テンプレートID(進捗登録明細) */
	private static final String TEMPLATE_ID_7_DETAIL = EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST;
	/** IN項目リスト(進捗登録) */
	private static final List<String> IN_COLUMN_LIST_7 =
			Arrays.asList(EKK1091D010CBSMsg.MSKM_DTL_NO, EKK1091D010CBSMsg.SEIKY_KEI_NO, EKK1091D010CBSMsg.SEIKY_WAY_NO_KOZA,
					EKK1091D010CBSMsg.SEIKY_WAY_NO_CRECARD, EKK1091D010CBSMsg.SVC_KEI_NO, EKK1091D010CBSMsg.SVC_KEI_UCWK_NO,
					EKK1091D010CBSMsg.SVC_KEI_KAISEN_UCWK_NO, EKK1091D010CBSMsg.KKTK_SVC_KEI_NO, EKK1091D010CBSMsg.OP_SVC_KEI_NO,
					EKK1091D010CBSMsg.SEIOPSVC_KEI_NO, EKK1091D010CBSMsg.SBOP_SVC_KEI_NO, EKK1091D010CBSMsg.WRIB_SVC_KEI_NO,
					EKK1091D010CBSMsg.IDO_DIV, EKK1091D010CBSMsg.PRG_STAT, EKK1091D010CBSMsg.PRG_MEMO, EKK1091D010CBSMsg.PRG_TKJK_1,
					EKK1091D010CBSMsg.PRG_TKJK_2, EKK1091D010CBSMsg.IDO_DTM);
	/** 関連チェックエラー項目(進捗登録) */
	private static final String ERROR_COLUMN_7 = null;

	/* ■□ 請求契約一意照会SC ■□ */
	/** テンプレートID(課金先一覧照会（請求契約番号/サービス契約番号) */
	private static final String TEMPLATE_ID_8 = "EKK0491A010";
	/** テンプレートID(課金先一覧照会（請求契約番号/サービス契約番号明細) */
	private static final String TEMPLATE_ID_8_DETAIL = EKK0491A010CBSMsg.EKK0491A010CBSMSG1LIST;
	/** IN項目リスト(課金先一覧照会（請求契約番号/サービス契約番号) */
	private static final List<String> IN_COLUMN_LIST_8 =
			Arrays.asList(EKK0491A010CBSMsg.KEY_SEIKY_KEI_NO, EKK0491A010CBSMsg.KEY_GENE_ADD_DTM, EKK0491A010CBSMsg.KEY_RSV_APLY_YMD);
	/** 関連チェックエラー項目(課金先一覧照会（請求契約番号/サービス契約番号) */
	private static final String ERROR_COLUMN_8 = EKK0491A010CBSMsg.KEY_SEIKY_KEI_NO_ERR;
	/** SC実行結果取得キー(課金先一覧照会（請求契約番号/サービス契約番号) */
	private static final String TEMP_TEMPLATE_KEY_8 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_8 + TEMP_TEMPLATE_PRIFIX_SEP + "1";

	/* ■□ 割引サービス対象サービス一覧照会SC ■□ */
	/** テンプレートID(割引サービス対象サービス一覧照会) */
	private static final String TEMPLATE_ID_9 = "EKK0851B001";
	/** テンプレートID(割引サービス対象サービス一覧照会明細) */
	private static final String TEMPLATE_ID_9_DETAIL = EKK0851B001CBSMsg.EKK0851B001CBSMSG1LIST;
	/** IN項目リスト(割引サービス対象サービス一覧照会) */
	private static final List<String> IN_COLUMN_LIST_9 =
			Arrays.asList(EKK0851B001CBSMsg.KEY_WRIB_SVC_CD, EKK0851B001CBSMsg.KEY_PRC_GRP_CD, EKK0851B001CBSMsg.KEY_PCRS_CD,
					EKK0851B001CBSMsg.KEY_PPLAN_CD, EKK0851B001CBSMsg.KEY_KJNYMD, EKK0851B001CBSMsg.MAX_SEARCH_NUM);
	/** 関連チェックエラー項目(割引サービス対象サービス一覧照会) */
	private static final String ERROR_COLUMN_9 = EKK0851B001CBSMsg.KEY_WRIB_SVC_CD_ERR;
	/** SC実行結果取得キー(割引サービス対象サービス一覧照会) */
	private static final String TEMP_TEMPLATE_KEY_9 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_9 + TEMP_TEMPLATE_PRIFIX_SEP + "1";

	/**
	 * 割引サービス契約自動登録処理
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception
	 */
	public IRequestParameterReadWrite addWribSvcKei(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		try
		{

			// 機能コードが設定されている場合、且つ、機能コードが"2"(チェックのみ)の場合は、登録・更新処理を実行しない。
			String funcCd = getFuncCode(param, fixedText);

			if (null != funcCd && JPCModelConstant.FUNC_CD_2.equals(funcCd))
			{
				return param;
			}

			// ユーザデータ取得
			HashMap inMap = (HashMap)param.getData(fixedText);

			// IN項目:サービス契約番号
			String inParamSvcKeiNo = (String)inMap.get(IN_PARAM_KEY_SVC_KEI_NO);
			// IN項目:申込明細番号
			String inParamMskmDetailNo = (String)inMap.get(IN_PARAM_MSKM_DTL_NO);
			// IN項目:要求種別コード
			String inParamYokyuSbtCd = (String)inMap.get(IN_PARAM_YOKYU_SBT_CD);
			// IN項目:異動区分
			String inParamIdoDiv = (String)inMap.get(IN_PARAM_KEY_IDO_DIV);
			// IN項目:料金コースコード
			String inParamPcrsCd = (String)inMap.get(IN_PARAM_PCRS_CD);
			// IN項目:料金プランコード
			String inParamPplanCd = (String)inMap.get(IN_PARAM_PPLAN_CD);
			// IN項目:進捗特記事項1
			String prgTkjk1 = (String)inMap.get(PRG_TKJK_1);

			if (null == inParamMskmDetailNo)
			{
				HashMap mskmMap = (HashMap)param.getData(SC_NAME_MSKM);
				List mskmList = (ArrayList)mskmMap.get(EKK0011D020CBSMsg.EKK0011D020CBSMSG1LIST);
				inParamMskmDetailNo = (String)((HashMap)mskmList.get(0)).get(EKK0011D020CBSMsg1List.MSKM_DTL_NO);
			}

			// ●サービス契約一意照会
			// ユーザデータ初期化
			initData(param, fixedText, IN_COLUMN_LIST_1);
			// 上りマッピング
			setInMapSvcKeiUniqueSearch(param, fixedText, inParamSvcKeiNo);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_1, TEMPLATE_ID_1_DETAIL, IN_COLUMN_LIST_1, ERROR_COLUMN_1);
			// SYSID
			String sysId = getTemplateListValue(inMap, TEMP_TEMPLATE_KEY_1, TEMPLATE_ID_1_DETAIL, EKK0081A010CBSMsg1List.SYSID, 0);
			// 更新年月日時分秒
			String updDtmSvcKei = getTemplateListValue(inMap, TEMP_TEMPLATE_KEY_1, TEMPLATE_ID_1_DETAIL, EKK0081A010CBSMsg1List.LAST_UPD_DTM, 0);
			// 料金グループコード
			String prcGrpCd = getTemplateListValue(inMap, TEMP_TEMPLATE_KEY_1, TEMPLATE_ID_1_DETAIL, EKK0081A010CBSMsg1List.PRC_GRP_CD, 0);

			// ●課金先一覧照会（請求契約番号/サービス契約番号）
			// ユーザデータ初期化
			initData(param, fixedText, IN_COLUMN_LIST_2);
			// 上りマッピング
			setInMapKakinsSearch(param, fixedText, inParamSvcKeiNo);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_2, TEMPLATE_ID_2_DETAIL, IN_COLUMN_LIST_2, ERROR_COLUMN_2);
			// 請求契約番号
			String seikyKeiNo = getTemplateListValue(inMap, TEMP_TEMPLATE_KEY_2, TEMPLATE_ID_2_DETAIL, EKK0321B002CBSMsg1List.SEIKY_KEI_NO, 0);

			// ●請求契約一意照会
			// ユーザデータ初期化
			initData(param, fixedText, IN_COLUMN_LIST_8);
			// 上りマッピング
			setInMapSeikySearch(param, fixedText, seikyKeiNo);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_8, TEMPLATE_ID_8_DETAIL, IN_COLUMN_LIST_8, ERROR_COLUMN_8);
			// 更新年月日時分秒(請求契約)
			String updDtmSeiky = getTemplateListValue(inMap, TEMP_TEMPLATE_KEY_8, TEMPLATE_ID_8_DETAIL, EKK0491A010CBSMsg1List.LAST_UPD_DTM, 0);

			// ●割引サービス対象サービス一覧照会
			// ユーザデータ初期化
			initData(param, fixedText, IN_COLUMN_LIST_9);
			// 上りマッピング
			setInMapWribSvcTrgtSearch(param, fixedText, prcGrpCd);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_9, TEMPLATE_ID_9_DETAIL, IN_COLUMN_LIST_9, ERROR_COLUMN_9);
			// 割引サービス対象サービスコード
			String wribSvcTrgtCd =
					getTemplateListValue(inMap, TEMP_TEMPLATE_KEY_9, TEMPLATE_ID_9_DETAIL, EKK0851B001CBSMsg1List.WRIB_SVC_TRGT_SVC_CD, 0);

			// ●割引サービス契約登録
			// ユーザデータ初期化
			initData(param, fixedText, IN_COLUMN_LIST_3);
			// 上りマッピング
			setInMapWribRegist(param, fixedText, sysId, wribSvcTrgtCd, inParamSvcKeiNo, inParamMskmDetailNo, inParamIdoDiv, inParamPcrsCd,
					inParamPplanCd, updDtmSvcKei);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_3, TEMPLATE_ID_3_DETAIL, IN_COLUMN_LIST_3, ERROR_COLUMN_3);
			// 処理結果取得
			HashMap wribRegistMap = (HashMap)inMap.get(TEMP_TEMPLATE_KEY_3);
			// 割引サービス契約番号
			String wribSvcKeiNo = (String)wribRegistMap.get(EKK0451D010CBSMsg.WRIB_SVC_KEI_NO);
			// 更新年月日時分秒
			updDtmSvcKei = (String)wribRegistMap.get(EKK0451D010CBSMsg.UPD_DTM);

			// ●課金先登録
			// ユーザデータ初期化
			initData(param, fixedText, IN_COLUMN_LIST_6);
			// 上りマッピング
			setInMapKakinsRegist(param, fixedText, wribSvcKeiNo, seikyKeiNo, updDtmSeiky);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_6, TEMPLATE_ID_6_DETAIL, IN_COLUMN_LIST_6, ERROR_COLUMN_6);

			// フロント・バック判定
			boolean isFront = fixedText.startsWith(FIXED_TXT_INIT) || fixedText.startsWith(FIXED_TXT_MSKM);

			// フロントで新規以外はメール送信
			if (isFront && !JFUStrConst.CD00317_02.equals(inParamYokyuSbtCd))
			{
				super.sendMail(handle, param, fixedText);
			}
			
			// 割引サービス契約番号引継ぎ
			inMap.put(EKK0451D010CBSMsg.WRIB_SVC_KEI_NO, wribSvcKeiNo);
			
			// 新規申込以外の場合のみ
			if (!JFUStrConst.CD00317_02.equals(inParamYokyuSbtCd))
			{
				// ユーザデータ初期化
				initData(param, fixedText, IN_COLUMN_LIST_7);
				// ●進捗登録
				// 上りマッピング
				setInMapPrgRegist(param, fixedText, wribSvcKeiNo, inParamSvcKeiNo, inParamMskmDetailNo, inParamIdoDiv, prgTkjk1);
				// サービスIF実行
				executeSC(handle, param, fixedText, TEMPLATE_ID_7, TEMPLATE_ID_7_DETAIL, IN_COLUMN_LIST_7, ERROR_COLUMN_7);

				// ●サービスオーダー発行CC情報マッピング
				// ※必ず全ての処理の一番最後に実行すること！！！
				sodMapping(param, fixedText, sysId, inParamIdoDiv, inParamSvcKeiNo);
			}
		}
		finally
		{
			// 一時領域の削除
			deleteTempArea(param, fixedText);
		}
		return param;
	}

	/**
	 * 上りマッピング項目設定(サービス契約一意照会)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param svcKeiNo サービス契約番号
	 * @throws RequestParameterException
	 */
	private void setInMapSvcKeiUniqueSearch(IRequestParameterReadWrite param, String fixedText, String svcKeiNo) throws RequestParameterException
	{
		// 機能コード設定(2:カレント)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);
		// 予約適用年月日
		inMap.put(EKK0081A010CBSMsg.KEY_RSV_APLY_YMD, JFUBPCommon.getOpeDate(null));
		// サービス契約番号
		inMap.put(EKK0081A010CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);

	}

	/**
	 * 上りマッピング項目設定(課金先一覧照会（請求契約番号/サービス契約番号）)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param svcKeiNo サービス契約番号
	 * @throws RequestParameterException 
	 */
	private void setInMapKakinsSearch(IRequestParameterReadWrite param, String fixedText, String svcKeiNo) throws RequestParameterException
	{
		// 機能コード設定(1)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);
		// サービス契約番号
		inMap.put(EKK0321B002CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);
	}

	/**
	 * 上りマッピング項目設定(割引サービス契約<月額費用割引>登録)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param sysId SYSID
	 * @param wribSvcTrgtSvcCd 割引サービス対象サービスコード
	 * @param svcKeiNo サービス契約番号
	 * @param mskmDtlNo 申込明細番号
	 * @param idoDiv 異動区分
	 * @param pcrsCd 料金コースコード
	 * @param pplanCd 料金プランコード
	 * @param updDtmSvcKei 更新年月日時分秒(サービス契約)
	 * @throws RequestParameterException
	 */
	private void setInMapWribRegist(IRequestParameterReadWrite param, String fixedText, String sysId, String wribSvcTrgtSvcCd, String svcKeiNo,
			String mskmDtlNo, String idoDiv, String pcrsCd, String pplanCd, String updDtmSvcKei) throws RequestParameterException
	{
		// 機能コード設定(1:チェック&登録)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// SYSID
		inMap.put(EKK0451D010CBSMsg.SYSID, sysId);
		// 割引サービスコード
		inMap.put(EKK0451D010CBSMsg.WRIB_SVC_CD, JFUStrConst.KK0841_WRIB_SVC_CD_FAMIPA);
		// 申込明細番号
		inMap.put(EKK0451D010CBSMsg.MSKM_DTL_NO, mskmDtlNo);
		// 即時適用フラグ
		inMap.put(EKK0451D010CBSMsg.APLY_JUN, JFUStrConst.CD00403_1);
		// 異動区分
		inMap.put(EKK0451D010CBSMsg.IDO_DIV, idoDiv);
		// 料金コースコード
		inMap.put(EKK0451D010CBSMsg.PCRS_CD, pcrsCd);
		// 料金プランコード
		inMap.put(EKK0451D010CBSMsg.PPLAN_CD, pplanCd);
		// 割引登録契機コード
		inMap.put(EKK0451D010CBSMsg.WRIB_ADD_OPTY_CD, JFUStrConst.CD00874_2);
		// 申込起算年月日
		inMap.put(EKK0451D010CBSMsg.MSKM_KISAN_YMD, JFUBPCommon.getOpeDate(null));
		// 
		// 更新年月日時分秒
		inMap.put(EKK0451D010CBSMsg.UPD_DTM_BF, updDtmSvcKei);

		ArrayList list = new ArrayList();
		HashMap childMap = new HashMap();

		for (String key : IN_COLUMN_LIST_3_DETAIL)
		{
			childMap.put(key, null);
		}

		// 対象契約識別コード
		childMap.put(EKK0451D010CBSMsg1List.TG_KEI_SKBT_CD, JFUStrConst.CD00804_01);
		// サービス契約番号
		childMap.put(EKK0451D010CBSMsg1List.SVC_KEI_NO, svcKeiNo);
		// 割引サービス対象サービスコード
		childMap.put(EKK0451D010CBSMsg1List.WRIB_SVC_TRGT_SVC_CD, wribSvcTrgtSvcCd);
		// 割引サービス対象契約適用開始年月日
		childMap.put(EKK0451D010CBSMsg1List.WRISVC_TG_KEI_TSTAYMD, JFUBPCommon.getOpeDate(null));
		// 割引サービス対象契約適用終了年月日
		childMap.put(EKK0451D010CBSMsg1List.WRISVC_TG_KEI_TENDYMD, JFUStrConst.DEFAULT_YYYYMMDD);
		list.add(childMap);

		inMap.put(EKK0451D010CBSMsg.EKK0451D010CBSMSG1LIST, list);
	}

	/**
	 * 上りマッピング項目設定(課金先登録)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param wribSvcKeiNo 割引サービス契約番号
	 * @param seikyKeiNo 請求契約番号
	 * @param updDtm 更新年月日時分秒
	 * @throws RequestParameterException
	 * @throws ParseException
	 */
	private void setInMapKakinsRegist(IRequestParameterReadWrite param, String fixedText, String wribSvcKeiNo, String seikyKeiNo, String updDtm)
			throws RequestParameterException, ParseException
	{
		// 機能コード設定(1:チェック&登録)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 請求契約番号
		inMap.put(EKK0321D010CBSMsg.SEIKY_KEI_NO, seikyKeiNo);
		// 割引サービス契約番号
		inMap.put(EKK0321D010CBSMsg.WRIB_SVC_KEI_NO, wribSvcKeiNo);
		// 課金先適用開始年月日
		inMap.put(EKK0321D010CBSMsg.KAKINS_TSTAYMD, JFUBPCommon.getOpeDate(null));
		// 更新年月日時分秒
		inMap.put(EKK0321D010CBSMsg.UPD_DTM_BF, updDtm);
	}

	/**
	 * 上りマッピング項目設定(進捗登録)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param wribSvcKeiNo 割引サービス契約番号
	 * @param svcKeiNo param
	 * @param mskmDtlNo 申込明細番号
	 * @param idoDiv
	 * @throws RequestParameterException
	 */
	private void setInMapPrgRegist(IRequestParameterReadWrite param, String fixedText, String wribSvcKeiNo, String svcKeiNo, String mskmDtlNo,
			String idoDiv, String prgTkjk1) throws RequestParameterException
	{
		// 機能コード設定(1:チェック&登録)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 申込明細番号
		inMap.put(EKK1091D010CBSMsg.MSKM_DTL_NO, mskmDtlNo);
		// 割引サービス契約番号
		inMap.put(EKK1091D010CBSMsg.WRIB_SVC_KEI_NO, wribSvcKeiNo);
		// サービス契約番号
		inMap.put(EKK1091D010CBSMsg.SVC_KEI_NO, svcKeiNo);
		// 進捗ステータス
		inMap.put(EKK1091D010CBSMsg.PRG_STAT, JFUStrConst.CD00647_5110);
		// 異動年月日時分秒
		inMap.put(EKK1091D010CBSMsg.IDO_DTM, JFUBPCommon.getSysDateTimeStamp());
		// 異動区分
		inMap.put(EKK1091D010CBSMsg.IDO_DIV, idoDiv);
		// 進捗特記事項1
		inMap.put(EKK1091D010CBSMsg.PRG_TKJK_1, prgTkjk1);

		ArrayList list = new ArrayList();
		HashMap childMap = new HashMap();

		// 異動理由コード
		childMap.put(EKK1091D010CBSMsg1List.IDO_RSN_CD, JFUStrConst.CD00846_F3);
		// 異動理由メモ
		childMap.put(EKK1091D010CBSMsg1List.IDO_RSN_MEMO, null);
		list.add(childMap);

		inMap.put(EKK1091D010CBSMsg.EKK1091D010CBSMSG1LIST, list);

	}

	/**
	 * サービスオーダー発行CC情報マッピング
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param sysId SYSID
	 * @param idoDiv 異動区分
	 * @param svcKeiNo サービス契約番号
	 * @throws RequestParameterException
	 */
	private void sodMapping(IRequestParameterReadWrite param, String fixedText, String sysId, String idoDiv, String svcKeiNo)
			throws RequestParameterException
	{
		// 機能コード設定(1:チェック&登録)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);
		List<HashMap> list = getTemplateList(inMap, TEMP_TEMPLATE_KEY_3, EKK0451D010CBSMsg.EKK0451D010CBSMSG2LIST);

		List trgtList = new ArrayList();

		for (HashMap map : list)
		{
			// SODマップ
			HashMap sodMap = new HashMap();

			// 処理区分
			sodMap.put(SOD_SHORI_DIV, SOD_SHORI_DIV_1);

			// SOD基本情報
			HashMap sodKihonMap = new HashMap();
			// SYSID
			sodKihonMap.put(SOD_SYSID, sysId);
			// 異動区分
			sodKihonMap.put(SOD_IDO_DIV, idoDiv);
			// SODマップへ追加
			sodMap.put(SOD_SOD_KIHON_INFO, sodKihonMap);

			// サービス契約情報
			HashMap svcKeiMap = new HashMap();
			// サービス契約番号
			svcKeiMap.put(SOD_SVC_KEI_NO, svcKeiNo);
			// SODマップへ追加
			sodMap.put(SOD_SVC_KEI_INFO, svcKeiMap);

			// オプションサービス契約情報
			HashMap opSvcKeiMap = new HashMap();
			// 変更後オプションサービス契約番号
			opSvcKeiMap.put(SOD_CHAF_OPSVKEI_NO, map.get(EKK0451D010CBSMsg2List.FP_OP_SVC_KEI_NO));
			// 変更後サブオプションサービス契約番号
			opSvcKeiMap.put(SOD_CHAF_SBOPSVKEI_NO, map.get(EKK0451D010CBSMsg2List.FP_SBOP_SVC_KEI_NO));
			// 変更後サブオプションサービス契約世代登録年月日時分秒
			opSvcKeiMap.put(SOD_CHAF_SBOPSVKEI_GENE_DTM, map.get(EKK0451D010CBSMsg2List.FP_KK0401_GENE_ADD_DTM));
			// SODマップへ追加
			sodMap.put(SOD_OPSVKEI_INFO, opSvcKeiMap);

			// 対象データリストへ追加
			trgtList.add(sodMap);
		}

		// 機器オプションサービス契約登録のSOD発行上りマッピング
		HashMap inSodMap = (HashMap)param.getData(SOD_WORK_MAP);
		if(inSodMap != null && inSodMap.size() > 0)
		{
			ArrayList<HashMap> kkopAddList = (ArrayList)inSodMap.get(KKOP_ADD_LIST);
			if(kkopAddList == null)
			{
				kkopAddList = new ArrayList<HashMap>();
			}

			for(HashMap map : kkopAddList)
			{
				// SODマップ
				HashMap sodMap = new HashMap();

				// 処理区分
				sodMap.put(SOD_SHORI_DIV, SOD_SHORI_DIV_2);

				// SOD基本情報
				HashMap sodKihonMap = new HashMap();
				// SYSID
				sodKihonMap.put(SOD_SYSID, sysId);
				// 異動区分
				sodKihonMap.put(SOD_IDO_DIV, idoDiv);
				// SODマップへ追加
				sodMap.put(SOD_SOD_KIHON_INFO, sodKihonMap);

				// サービス契約情報
				HashMap svcKeiMap = new HashMap();
				// サービス契約番号
				svcKeiMap.put(SOD_SVC_KEI_NO, svcKeiNo);
				// SODマップへ追加
				sodMap.put(SOD_SVC_KEI_INFO, svcKeiMap);

				// 機器オプションサービス契約情報
				HashMap kkopSvcKeiMap = new HashMap();
				// 機器オプションサービス契約番号
				kkopSvcKeiMap.put(SOD_KKOP_SVC_KEI_NO, (String)map.get(KKOP_SVC_KEI_NO));
				// 変更前機器オプションサービス契約世代登録年月日
				if(map.containsKey(BF_GENE_ADD_DTM) && !JFUBPCommon.isNull((String)map.get(BF_GENE_ADD_DTM)))
				{
					kkopSvcKeiMap.put(SOD_CHBF_KKOPSVKEI_GENE_ADD_DTM, (String)map.get(BF_GENE_ADD_DTM));
				}
				else
				{
					kkopSvcKeiMap.put(SOD_CHBF_KKOPSVKEI_GENE_ADD_DTM, JFUStrConst.EMPTY);
				}
				// 変更後機器オプションサービス契約世代登録年月日
				if(map.containsKey(AF_GENE_ADD_DTM) && !JFUBPCommon.isNull((String)map.get(AF_GENE_ADD_DTM)))
				{
					kkopSvcKeiMap.put(SOD_CHAF_KKOPSVKEI_GENE_ADD_DTM, (String)map.get(AF_GENE_ADD_DTM));
				}
				else
				{
					kkopSvcKeiMap.put(SOD_CHAF_KKOPSVKEI_GENE_ADD_DTM, JFUStrConst.EMPTY);
				}

				// SODマップへ追加
				sodMap.put(SOD_KKOPSVCKEI_INFO, kkopSvcKeiMap);

				// 対象データリストへ追加
				trgtList.add(sodMap);
			}
		}

		inMap.put(SOD_TRGT_DATA_LIST, trgtList);
	}

	/**
	 * 上りマッピング項目設定(請求契約一意照会)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param seikyKeiNo 請求契約番号
	 * @throws RequestParameterException
	 */
	private void setInMapSeikySearch(IRequestParameterReadWrite param, String fixedText, String seikyKeiNo) throws RequestParameterException
	{
		// 機能コード設定(2:カレント)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);
		// 請求契約番号
		inMap.put(EKK0491A010CBSMsg.KEY_SEIKY_KEI_NO, seikyKeiNo);
		// 予約適用年月日
		inMap.put(EKK0491A010CBSMsg.KEY_RSV_APLY_YMD, JFUBPCommon.getOpeDate(null));
	}

	/**
	 * 上りマッピング項目設定(割引サービス対象サービス一覧照会)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param prcGrpCd 料金グループコード
	 * @throws RequestParameterException
	 */
	private void setInMapWribSvcTrgtSearch(IRequestParameterReadWrite param, String fixedText, String prcGrpCd) throws RequestParameterException
	{
		// 機能コード設定(1)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ＫＥＹ＿割引サービスコード
		inMap.put(EKK0851B001CBSMsg.KEY_WRIB_SVC_CD, JFUStrConst.KK0841_WRIB_SVC_CD_FAMIPA);
		// ＫＥＹ＿料金グループコード
		inMap.put(EKK0851B001CBSMsg.KEY_PRC_GRP_CD, prcGrpCd);
		// ＫＥＹ＿基準年月日
		inMap.put(EKK0851B001CBSMsg.KEY_KJNYMD, JFUBPCommon.getOpeDate(null));
		// 最大件数
		inMap.put(EKK0851B001CBSMsg.MAX_SEARCH_NUM, JFUStrConst.MAX_SEARCH_NUM);

	}

	/**
	 * チェック処理
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		return null;
	}

}
