/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：KKSV0536_KKSV0536OPDBMapper
*	ソースファイル名：KKSV0536_KKSV0536OPDBMapper.java
*	作成者			：Fujitsu
*	日付			：2012年03月23日
*＜機能概要＞
*	BP（eo光テレビオプションチャンネル更新画面登録処理サービス）へのＤ−Ｂマッピングクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/03/23	Fujitsu		新規作成
*	v4.00.00	2012/09/26	Fujitsu		ANK-0398-00-00 対応
*	v4.01.00	2012/10/25	FJ）庭山	【IT1-2012-0001572】対応
*	v4.02.00	2012/10/31	FJ）庭山	【IT1-2012-0001835】対応
*	v4.03.00	2012/11/22	FJ）宇野	【ANK-1223-00-00】対応
*	v4.03.01	2013/01/17	FJ）庭山	【ST2-2013-0000170】対応
*   v5.00.00	2013/01/15	FJ）稲岡	【ANK-1385-00-00】対応
* 	v4.04.00	2013/03/04	FJ）稲岡	【ST1-2013-0000253】対応
* 	v4.05.00	2013/04/15	FJ）稲岡	【IT1-2013-0000921】対応
*   v4.06.00	2013/09/11	FJ）辛  	【OM-2013-0001692】対応
*	v8.00.00	2014/05/12	FJ）稲岡	【IT1-2014-0000109】対応
**********************************************************************/
package eo.web.webview.mapping;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;

import eo.common.constant.JKKStrConst;
import eo.common.util.JPCUtilCommon;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.KKW02522SF.KKW02522SFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JKKCommonConst;

/**
 * DataBean-BPマッピングをする。
 * 
 */
public class KKSV0536_KKSV0536OPDBMapper {
	
	/** 処理モード 1：更新 */
	private static final String TRAN_MODE_UPD = "1";
	
	/** 処理モード 2：解約 */
	private static final String TRAN_MODE_DSL = "2";
	
	/** キャンセル理由コード "20:取消（訂正）" */
	private static final String CANCEL_RSN_CD_CANCEL = "20";
	
	/** 申込種別コード 予約取消申込 */
	public static final String MSKM_SBT_CD_VALUE_00033 = "00033";
	
	/** 利用終了月 2:次月 */
	private static final String USE_END_YM_NEXT_MONTH = "2";
	
	/** 変更開始月 1:即時 */
	private static final String CHG_STA_YM_REAL_TIME = "1";
	
	/** 変更開始月 2:次月より */
	private static final String CHG_STA_YM_NEXT_MONTH = "2";
	
	/** 変更開始月 3:次々月より */
	private static final String CHG_STA_YM_AFTER_NEXT_MONTH = "3";
	
	/** 1日 */
	private static final String FIRST_DATE = "01";
	
	/** 即時/翌月 01:即時 */
	private static final String SKJ_YKGT_REAL_TIME = "01";
	
	/** 即時/翌月 02:翌月 */
	private static final String SKJ_YKGT_NEXT_MONTH = "02";
	
	/** 即時/翌月 03:翌々月 */
	private static final String SKJ_YKGT_AFTER_NEXT_MONTH = "03";
	
/* ++++++++++ v4.00.00 追加開始 ++++++++++ */
	/** 住所チェックレベル "0"（無し） */
	private static final String AD_CHK_LV_N = "0";
	
	/** 住所チェックレベル "1"（有り） */
	private static final String AD_CHK_LV_Y = "1";
/* ++++++++++ v4.00.00 追加終了 ++++++++++ */
	
/* ++++++++++ v4.03.00 追加開始 ++++++++++ */
	/** オプションサービス契約ステータス（受付済） */
	public static final String OPT_SVC_KEI_STAT_010 = "010";
	
	/** オプションサービス契約ステータス（照査済） */
	public static final String OPT_SVC_KEI_STAT_020 = "020";
	
	/** オプションサービス契約ステータス（締結済） */
	public static final String OPT_SVC_KEI_STAT_030 = "030";
/* ++++++++++ v4.03.00 追加終了 ++++++++++ */
	
	/**
	 * コンストラクタ
	 */
	public KKSV0536_KKSV0536OPDBMapper(){
	}
	
/* ++++++++++ v5.00.00 追加開始 ++++++++++ */
	/**
	 * 上りマッピングをする
	 * @param bean　[0]：ｅｏ光テレビガイド誌更新
	 * @param outputMap
	 * @param osBean　[0]：ｅｏ光テレビケーブルテレビガイド誌登録　[1]：共有フォームＢｅａｎ
	 * @param oneStopFlg
	 * @param usePcAdDoitsu
	 */
	@SuppressWarnings("unchecked")
	public HashMap setEohTvGuideUpdCC(
										X31SDataBeanAccess[] bean, 
										HashMap outputMap, 
										X31SDataBeanAccess[] osBean, 
										String oneStopFlg, 
										boolean usePcAdDoitsu) throws ParseException
	{
		if(isNull(bean))
		{
			return null;
		}
		
		if(bean.length != 1)
		{
			return null;
		}
		
		if(osBean.length != 2)
		{
			return null;
		}
		
		if(isNull(oneStopFlg))
		{
			return null;
		}
		
		HashMap<String, Object> parentMap = new HashMap<String, Object>();
		
		// 顧客契約引継リスト.サービス契約番号
		String svcKeiNo = getValue(bean[0], KKW02522SFConst.CUST_KEI_HKTGI_SVC_KEI_NO);
		// 顧客契約引継リスト.SYSID
		String sysID = getValue(bean[0], KKW02522SFConst.CUST_KEI_HKTGI_SYSID);
		// 顧客契約引継リスト.異動区分
		String idoDiv = getValue(bean[0], KKW02522SFConst.CUST_KEI_HKTGI_IDO_DIV);
		// 顧客契約引継リスト.処理区分
		String hktgiTranDiv = getValue(bean[0], KKW02522SFConst.CUST_KEI_HKTGI_TRAN_DIV);
		// 顧客契約引継リスト.基準日
		String opeDate = getValue(bean[0], KKW02522SFConst.STDARDYMD);
		
		//*************************************************
		// 共通
		//*************************************************
		// サービス契約番号
		parentMap.put("svc_kei_no", svcKeiNo);
		// ＳＹＳＩＤ
		parentMap.put("sysid", sysID);
		// 異動区分
		parentMap.put("ido_div", idoDiv);
		// 基準日
		parentMap.put("ope_date", opeDate);
/* ++++++++++ v8.00.00 追加開始 ++++++++++ */
		// サービス契約ステータス（サービス契約）
		parentMap.put("svc_kei_stat", getValue(bean[0], KKW02522SFConst.KK0081_SVC_KEI_STAT));
/* ++++++++++ v8.00.00 追加終了 ++++++++++ */
		
		//*************************************************
		// eo光テレビガイド誌冊数上限チェックCC
		//*************************************************
		// 変更後ｅｏ光テレビガイド誌申込数
		parentMap.put("mskm_cnt", getValue(bean[0], KKW02522SFConst.CHG_TV_GUIDE_MSKM_CNT));
		
		//*************************************************
		// 申込内容承認登録
		//*************************************************
		// 顧客契約引継＿処理区分 = "変更"
		if(JKKCommonConst.OP_TRAN_DIV_CHGE.equals(hktgiTranDiv))
		{
			// 申込内容承認登録マップ.申込種別コード = 「契約内容変更申込」
			parentMap.put("mskm_sbt_cd", JKKCommonConst.MSKM_SBT_CD_VALUE_00027);
		}
		// 顧客契約引継＿処理区分 = "解約"
		else if(JKKCommonConst.OP_TRAN_DIV_DSL.equals(hktgiTranDiv))
		{
			// 申込内容承認登録マップ.申込種別コード = 「解約申込」
			parentMap.put("mskm_sbt_cd", JKKCommonConst.MSKM_SBT_CD_VALUE_00005);
		}
		// 顧客契約引継＿処理区分 = "回復"
		else if (JKKCommonConst.OP_TRAN_DIV_KAIHK.equals(hktgiTranDiv))
		{
			// 申込内容承認登録マップ.申込種別コード = 「回復申込」
			parentMap.put("mskm_sbt_cd", JKKCommonConst.MSKM_SBT_CD_VALUE_00004);
		}
		// 顧客契約引継＿処理区分 = "予約取消"
		else if (JKKCommonConst.OP_TRAN_DIV_RSV_CL.equals(hktgiTranDiv))
		{
			// 申込内容承認登録マップ.申込種別コード = 「予約取消申込」
			parentMap.put("mskm_sbt_cd", MSKM_SBT_CD_VALUE_00033);
		}
		
		// 基準日時分秒 → 申込内容承認登録マップ.申込受付年月日時分秒
		parentMap.put("mskm_uk_dtm", getValue(bean[0], KKW02522SFConst.STDARDYMD_DTM));
		// 基準日 → 申込内容承認登録マップ.申込年月日
		parentMap.put("mskm_ymd", opeDate);
		// 固定値"04"：承認済 → 申込内容承認登録マップ.コンシューマ営業用申込状態識別コード
		parentMap.put("consmbsn_mskm_stat_skbt_cd", "04");
		
		// 申込内容承認登録明細:EKK0011D020CBSMsg1List
		ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
		HashMap<String, Object> childMap = new HashMap<String, Object>();
		list.add(childMap);
		parentMap.put("EKK0011D020CBSMsg1List", list);
		
		//*************************************************
		// 申込明細照査・後続業務依頼
		//*************************************************
		// 基準日 → 後続業務依頼年月日
		parentMap.put("kzkwrk_reqymd", opeDate);
		// 異動区分 → 格納済
		
		//*************************************************
		// eo光テレビガイド誌申込数更新CC
		//*************************************************
		setEohTvGuideMskmCntUpdCC(bean, parentMap, usePcAdDoitsu);
		
		//*************************************************
		// 進捗登録
		//*************************************************
		setEKK1091D010(bean, parentMap, hktgiTranDiv);
		
		if("1".equals(oneStopFlg))
		{
			//*************************************************
			// ワンストップ対応履歴登録CC
			//*************************************************
			String tranMode = getValue(bean[0], KKW02522SFConst.TRAN_MODE);	// 処理モード
			setOnestopRirekiAddCC(osBean, parentMap, tranMode);
		}
		
		outputMap.put("EohTvGuideUpdCC", parentMap);
		
		return outputMap;
	}
	
	/**
	 * 上りマッピングをする
	 * @param bean　[0]：ｅｏ光テレビケーブルテレビガイド誌更新
	 * @param outputMap
	 * @param funcCode
	 * 
	 * @return outputMap
	 */
	@SuppressWarnings("unchecked")
	public HashMap setKKSV0536WORK01(X31SDataBeanAccess[] bean, HashMap outputMap, String funcCode)
	{
		if(isNull(bean))
		{
			return null;
		}
		
		if(bean.length != 1)
		{
			return null;
		}
		
		HashMap<String, Object> parentMap = new HashMap<String, Object>();
		
		// ワンストップフラグ → 作業領域マップ.ワンストップフラグ
		parentMap.put("one_stop_flg", getValue(bean[0], KKW02522SFConst.ONE_STOP_FLG));
		// 機能コード → 作業領域マップ.機能コード
		parentMap.put("func_code", funcCode);
		
		outputMap.put("KKSV0536WORK01", parentMap);
		
		return outputMap;
	}
/* ++++++++++ v5.00.00 追加終了 ++++++++++ */
	
	/**
	 * 上りマッピングをする(eo光テレビガイド誌申込数更新CC)
	 * @param bean　[0]：ｅｏ光テレビガイド誌更新
	 * @param parentMap
	 * @throws ParseException
	 */
	@SuppressWarnings("unchecked")
	private HashMap setEohTvGuideMskmCntUpdCC(X31SDataBeanAccess[] bean, HashMap parentMap, boolean usePcAdDoitsu) throws ParseException
	{
		// 処理モード
		parentMap.put("tran_mode", getValue(bean[0], KKW02522SFConst.TRAN_MODE));
		// オプションサービス契約ステータス
		parentMap.put("op_svc_kei_stat", getValue(bean[0], KKW02522SFConst.KK0351_OP_SVC_KEI_STAT));
		// オプションサービス契約番号
		parentMap.put("op_svc_kei_no", getValue(bean[0], KKW02522SFConst.CUST_KEI_HKTGI_OP_SVC_KEI_NO));
		// ＳＹＳＩＤ       → 格納済
		// サービス契約番号 → 格納済
		// 異動区分         → 格納済
		// 運用日           → 格納済
		// サービス開始年月日、サービス終了年月日
		setStaEndYMD(bean, parentMap);
		// 終了年月日
		setEndOfMonth(bean, parentMap);
		// 更新年月日時分秒(更新前)
		parentMap.put("upd_dtm_bf", getValue(bean[0], KKW02522SFConst.KK0081_LAST_UPD_DTM));
		// "B068"(ケーブルガイド誌)
		parentMap.put("key_op_svc_cd", JKKCommonConst.OP_SVC_CD_CABLE_GUIDE);
		// "01"(サービス契約)
		parentMap.put("oya_kei_skbt_cd", JKKCommonConst.OYA_KEI_SKBT_01);
		// キャンセル理由コード "20:取消（訂正） → オプションサービス契約キャンセルマップ.サービスキャンセル理由コード
		parentMap.put("svc_cancel_rsn_cd", CANCEL_RSN_CD_CANCEL);
		// 変更後ｅｏ光テレビガイド誌申込数
		parentMap.put("cable_guide_mskm_cnt", getValue(bean[0], KKW02522SFConst.CHG_TV_GUIDE_MSKM_CNT));
		
/* ++++++++++ v4.04.00 追加・変更開始 ++++++++++ */
		// 「利用場所と同じ」チェック有
		if (usePcAdDoitsu)
		{
/* ++++++++++ v4.05.00 修正開始 ++++++++++ */
			// ガイド誌送付先個別指定フラグ
			parentMap.put("guidemg_shs_ksitei_flg", "0");
/* ++++++++++ v4.05.00 修正終了 ++++++++++ */
			
			parentMap.put("guidemg_sohus_ad_cd", null);
			parentMap.put("guidemg_sohus_pcd", null);
			parentMap.put("guidemg_sohus_state_nm", null);
			parentMap.put("guidemg_sohus_city_nm", null);
			parentMap.put("guidemg_sohus_oaztsu_nm", null);
			parentMap.put("guidemg_sohus_azcho_nm", null);
			parentMap.put("guidemg_sohus_bnchigo", null);
			parentMap.put("guidemg_sohus_adrttm", null);
			parentMap.put("guidemg_sohus_adrrm", null);
			parentMap.put("guidemg_sohus_telno", null);
			parentMap.put("guidemg_sohus_nm", null);
			parentMap.put("guidemg_sohus_kana", null);
			
			// ガイド誌送付先住所手動入力フラグ
			parentMap.put("gudmg_shs_ad_man_input_flg", "0");
			// ガイド誌送付先住所チェックレベル
			parentMap.put("guidemg_sohus_ad_chk_lv", "0");
		}
		else
		{
			// ガイド誌送付先個別指定フラグ
			parentMap.put("guidemg_shs_ksitei_flg", "1");
			
			// 住所コード（更新用）
			parentMap.put("guidemg_sohus_ad_cd", getValue(bean[0], KKW02522SFConst.CHG_AD_CD));
			// 郵便番号（更新用）
			parentMap.put("guidemg_sohus_pcd", getValue(bean[0], KKW02522SFConst.CHG_PCD));
			// 都道府県（更新用）
			parentMap.put("guidemg_sohus_state_nm", getValue(bean[0], KKW02522SFConst.CHG_STATE));
			// 市区町村（更新用）
			parentMap.put("guidemg_sohus_city_nm", getValue(bean[0], KKW02522SFConst.CHG_CITY));
			// 大字通称名（更新用）
			parentMap.put("guidemg_sohus_oaztsu_nm", getValue(bean[0], KKW02522SFConst.CHG_OAZTSU));
			// 字丁目（更新用）
			parentMap.put("guidemg_sohus_azcho_nm", getValue(bean[0], KKW02522SFConst.CHG_AZCHO));
			// 番地号（更新用）
			parentMap.put("guidemg_sohus_bnchigo", getValue(bean[0], KKW02522SFConst.CHG_BNCHIGO));
			// 建物名（更新用）
			parentMap.put("guidemg_sohus_adrttm", getValue(bean[0], KKW02522SFConst.CHG_ADRTTM));
			// 部屋番号（更新用）
			parentMap.put("guidemg_sohus_adrrm", getValue(bean[0], KKW02522SFConst.CHG_ADRRM));
			// 電話番号（更新用）
			parentMap.put("guidemg_sohus_telno", getValue(bean[0], KKW02522SFConst.CHG_TELNO));
			// 送付先名（更新用）
			parentMap.put("guidemg_sohus_nm", getValue(bean[0], KKW02522SFConst.CHG_SHS_NM));
			// 送付先カナ名（更新用）
			parentMap.put("guidemg_sohus_kana", getValue(bean[0], KKW02522SFConst.CHG_SHS_KANA));
			
			// 手動入力 ON
			if(bean[0].sendMessageBoolean(KKW02522SFConst.AD_INPUT_REGAI, X31CWebConst.DATABEAN_GET_VALUE))
			{
				// 手動入力フラグ
				parentMap.put("gudmg_shs_ad_man_input_flg", JKKStrConst.CD01239_IS_MAN_INPUT);
				// 住所チェックレベル
				parentMap.put("guidemg_sohus_ad_chk_lv", AD_CHK_LV_N);
			}
			// 手動入力 OFF
			else
			{
				// 手動入力フラグ
				parentMap.put("gudmg_shs_ad_man_input_flg", JKKStrConst.CD01239_IS_NOT_MAN_INPUT);
				// 住所チェックレベル
				parentMap.put("guidemg_sohus_ad_chk_lv", AD_CHK_LV_Y);
			}
		}
/* ++++++++++ v4.04.00 追加・変更終了 ++++++++++ */
		
		// 変更開始月 選択値
		String chgCngStaYM = getValue(bean[0], KKW02522SFConst.CHG_CNGSTAYM);
		// 変更開始月:即時
		if(CHG_STA_YM_REAL_TIME.equals(chgCngStaYM))
		{
			// 即時/翌月 = 01:即時
			parentMap.put("skj_ykgt", SKJ_YKGT_REAL_TIME);
		}
		// 変更開始月:次月より
		else if(CHG_STA_YM_NEXT_MONTH.equals(chgCngStaYM))
		{
			// 即時/翌月 = 02:翌月
			parentMap.put("skj_ykgt", SKJ_YKGT_NEXT_MONTH);
		}
		// 変更開始月:次々月より
		else if(CHG_STA_YM_AFTER_NEXT_MONTH.equals(chgCngStaYM))
		{
			// 即時/翌月 03:翌々月
			parentMap.put("skj_ykgt", SKJ_YKGT_AFTER_NEXT_MONTH);
		}
		
		// ガイド誌申込フラグ
		parentMap.put("guidemg_mskm_flg", isChgGuideMskmCnt(bean[0]));
		
		return parentMap;
	}
	
	/**
	 * 上りマッピングをする(進捗登録)
	 * @param bean　[0]：ｅｏ光テレビガイド誌更新
	 * @param outputMap
	 * @param hktgiTranDiv
	 */
	@SuppressWarnings("unchecked")
	private HashMap setEKK1091D010(X31SDataBeanAccess[] bean, HashMap parentMap, String hktgiTranDiv)
	{
		// サービス契約番号 → 格納済
		// 異動区分         → 格納済
		
/* ++++++++++ v4.03.00 追加・変更開始 ++++++++++ */
		// システム日時 → 進捗登録マップ.異動年月日時分秒
		parentMap.put("ido_dtm", JCCWebCommon.getSysDateTimeStamp());
		// 進捗登録マップ.進捗ステータス = 「オプション設定完了」
//		parentMap.put("prg_stat", JKKCommonConst.PRG_STAT_CD_5102);
		//
		if (JKKCommonConst.OP_TRAN_DIV_RSV_CL.equals(hktgiTranDiv))
		{
			parentMap.put("prg_stat", JKKCommonConst.PRG_STAT_CD_9921); //「オプション変更予約取消」の場合
		}
		else
		{
			parentMap.put("prg_stat", JKKCommonConst.PRG_STAT_CD_5102);
		}
		
		StringBuilder sb = new StringBuilder();
		
		// 顧客契約引継＿処理区分 = "変更"
		if(JKKCommonConst.OP_TRAN_DIV_CHGE.equals(hktgiTranDiv))
		{
			String chg_cnt = getValue(bean[0], KKW02522SFConst.CHG_TV_GUIDE_MSKM_CNT);
			String init_cnt = getValue(bean[0], KKW02522SFConst.TV_GUIDE_MSKM_CNT);
			
			sb.append("ケーブルガイド誌情報更新　");
			
			// ガイド誌申込数が初期表示から変更されている場合
			if(!init_cnt.equals(chg_cnt))
			{
				sb.append("ケーブルガイド誌申込数：(変更前)");
				sb.append(init_cnt);
				sb.append("　変更開始月：");
				sb.append(getValue(bean[0], KKW02522SFConst.DISP_CHG_CNGSTAYM));
			}
		}
		// 顧客契約引継＿処理区分 = "解約"
		else if(JKKCommonConst.OP_TRAN_DIV_DSL.equals(hktgiTranDiv))
		{
			sb.append("ケーブルガイド誌情報解約　");
			sb.append("利用終了月：");
			sb.append(getValue(bean[0], KKW02522SFConst.DISP_USE_ENDYM));
		}
		// 顧客契約引継＿処理区分 = "回復"
		else if (JKKCommonConst.OP_TRAN_DIV_KAIHK.equals(hktgiTranDiv))
		{
		}
		// 顧客契約引継＿処理区分 = "予約取消"
		else if (JKKCommonConst.OP_TRAN_DIV_RSV_CL.equals(hktgiTranDiv))
		{
			// オプションサービス契約ステータス
			String op_svc_stat = getValue(bean[0], KKW02522SFConst.KK0351_OP_SVC_KEI_STAT);
			
			// 受付済、照査済、締結済の場合
			if (OPT_SVC_KEI_STAT_010.equals(op_svc_stat) || OPT_SVC_KEI_STAT_020.equals(op_svc_stat) || OPT_SVC_KEI_STAT_030.equals(op_svc_stat))
			{
				sb.append("ケーブルガイド誌情報登録予約取消");
			}
			else
			{
				sb.append("ケーブルガイド誌情報解約予約取消");
			}
		}
		
		parentMap.put("prg_tkjk_1", sb.toString());
		parentMap.put("prg_tkjk_2", "");
/* ++++++++++ v4.03.00 追加終了 ++++++++++ */
		
		// 異動理由明細:EKK1091D010CBSMsg1List
		ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
		HashMap<String, Object> childMap = new HashMap<String, Object>();
		
		// 顧客契約引継＿異動理由コード → 進捗登録マップ.異動理由明細.異動理由コード
		String idoRsnCd = "";
		idoRsnCd = getValue(bean[0], KKW02522SFConst.CUST_KEI_HKTGI_IDO_RSN_CD);
		if (isBlank(idoRsnCd))
		{
			// 異動理由コード（オプション契約したため）
			idoRsnCd = JKKCommonConst.IDO_RSN_CD_VALUE_F7;
		}
		childMap.put("ido_rsn_cd", idoRsnCd);
		list.add(childMap);
		parentMap.put("EKK1091D010CBSMsg1List", list);
		
		return parentMap;
	}
	
/* ++++++++++ v4.00.00 追加開始 ++++++++++ */
	/**
	 * 上りマッピングをする
	 * @param osBean　[0]：ｅｏ光テレビケーブルテレビガイド誌登録　[1]：共有フォームＢｅａｎ
	 * @param parentMap
	 * @param tranMode 処理モード
	 * @return HashMap
	 */
	@SuppressWarnings("unchecked")
	private HashMap setOnestopRirekiAddCC(X31SDataBeanAccess[] osBean, HashMap parentMap, String tranMode)
	{
		if (osBean == null)
		{
			return null;
		}
		
		if (osBean.length != 2)
		{
			return null;
		}
		
		X31SDataBeanAccess beanTemp = null;
		ArrayList list = null;
		
		// サービス契約番号 → 格納済
		
		// ユーザーＩＤ → ワンストップ対応履歴登録マップ.ユーザーＩＤ
		parentMap.put("user_id", osBean[1].sendMessageString(CommonInfoCFConst.USER_ID, X31CWebConst.DATABEAN_GET_VALUE));
		// ユーザー名 → ワンストップ対応履歴登録マップ.ユーザー名
		parentMap.put("user_nm", osBean[1].sendMessageString(CommonInfoCFConst.USER_NM, X31CWebConst.DATABEAN_GET_VALUE));
		
		beanTemp = osBean[1];
		if(beanTemp.getDataBeanArray(CommonInfoCFConst.KGGRP_CD_LIST).getCount() >= 2)
		{
			X31SDataBeanAccess kggrpCdListBean = beanTemp.getDataBeanArray(CommonInfoCFConst.KGGRP_CD_LIST).getDataBean(1);
			// 権限リスト.組織コード → ワンストップ対応履歴登録マップ.組織コード
			parentMap.put("org_cd", kggrpCdListBean.sendMessageString(CommonInfoCFConst.ORG_CD_01, X31CWebConst.DATABEAN_GET_VALUE));
			// 権限リスト.組織名 → ワンストップ対応履歴登録マップ.組織名
			parentMap.put("org_nm", kggrpCdListBean.sendMessageString(CommonInfoCFConst.ORG_NM_01, X31CWebConst.DATABEAN_GET_VALUE));
		}
		
		// タイトル
		if(TRAN_MODE_UPD.equals(tranMode))
		{
			// "KK_GUIDE_ADD_TITLE" = "ワンストップ　ガイド誌変更" → ワンストップ対応履歴登録マップ.タイトルパラメータＩＤ
			parentMap.put("title_param_id", "KK_GUIDE_CHG_TITLE");
		}
		else if(TRAN_MODE_DSL.equals(tranMode))
		{
			// "KK_GUIDE_DSL_TITLE" = "ワンストップ　ガイド誌解約" → ワンストップ対応履歴登録マップ.タイトルパラメータＩＤ
			parentMap.put("title_param_id", "KK_GUIDE_DSL_TITLE");
		}
		
		// ワンストップフラグ → ワンストップ対応履歴登録マップ.ワンストップフラグ
		parentMap.put("onestop_flg", osBean[0].sendMessageString(KKW02522SFConst.ONE_STOP_FLG, X31CWebConst.DATABEAN_GET_VALUE));
		
		// ワンストップ対応履歴登録マップ.回答内容編集リストを回答内容の行数分作成する
		list = new ArrayList();
		if(TRAN_MODE_UPD.equals(tranMode))
		{
			list = setParamModeChg(osBean, list);
		}
		else if(TRAN_MODE_DSL.equals(tranMode))
		{
			list = setParamModeDsl(osBean, list);
		}
		parentMap.put("ans_list", list);
		
		return parentMap;
	}
	
	/**
	 * パラメータ格納（変更）
	 * @param bean
	 * @param list
	 * @return ArrayList
	 */
	@SuppressWarnings("unchecked")
	private ArrayList setParamModeChg(X31SDataBeanAccess[] bean, ArrayList list)
	{
		HashMap childMap = null;
		
		// １行目「■回答内容」
		childMap = new HashMap();
		// "KK_GUIDE_ADD_NYO_01" → ワンストップ対応履歴登録マップ.回答内容編集リスト.回答内容パラメータＩＤ
		childMap.put("ans_param_id", "KK_GUIDE_CHG_NYO_01");
		list.add(childMap);
		
		// ２行目「ワンストップによるガイド誌変更」
		childMap = new HashMap();
		// "KK_GUIDE_ADD_NYO_02" → ワンストップ対応履歴登録マップ.回答内容編集リスト.回答内容パラメータＩＤ
		childMap.put("ans_param_id", "KK_GUIDE_CHG_NYO_02");
		list.add(childMap);
		
		// ３行目「申込部数：[@]」
		childMap = new HashMap();
		// "KK_GUIDE_ADD_NYO_03" → ワンストップ対応履歴登録マップ.回答内容編集リスト.回答内容パラメータＩＤ
		childMap.put("ans_param_id", "KK_GUIDE_CHG_NYO_03");
		// "@" → ワンストップ対応履歴登録マップ.回答内容編集リスト.置換前文字列１
		childMap.put("replace_mae1", "@");
		// eo光テレビガイド誌申込数 → ワンストップ対応履歴登録マップ.回答内容編集リスト.置換後文字列１
		childMap.put("replace_ato1", bean[0].sendMessageString(KKW02522SFConst.CHG_TV_GUIDE_MSKM_CNT, X31CWebConst.DATABEAN_GET_VALUE));
		list.add(childMap);
		
		// ４行目「利用開始月：[A]」
		childMap = new HashMap();
		// "KK_GUIDE_ADD_NYO_04" → ワンストップ対応履歴登録マップ.回答内容編集リスト.回答内容パラメータＩＤ
		childMap.put("ans_param_id", "KK_GUIDE_CHG_NYO_04");
		// "A" → ワンストップ対応履歴登録マップ.回答内容編集リスト.置換前文字列１
		childMap.put("replace_mae1", "A");
		// 表示＿変更開始月：“即時” or “次月より” or “次々月” → ワンストップ対応履歴登録マップ.回答内容編集リスト.置換後文字列１
		childMap.put("replace_ato1", bean[0].sendMessageString(KKW02522SFConst.DISP_CHG_CNGSTAYM, X31CWebConst.DATABEAN_GET_VALUE));
		list.add(childMap);
		
		// ５行目「[B]:[C]」
		childMap = new HashMap();
		// "KK_GUIDE_ADD_NYO_05" → ワンストップ対応履歴登録マップ.回答内容編集リスト.回答内容パラメータＩＤ
		childMap.put("ans_param_id", "KK_GUIDE_CHG_NYO_05");
		// "B" → ワンストップ対応履歴登録マップ.回答内容編集リスト.置換前文字列１
		childMap.put("replace_mae1", "B");
		// ユーザーＩＤ → ワンストップ対応履歴登録マップ.回答内容編集リスト.置換後文字列１
		childMap.put("replace_ato1", bean[1].sendMessageString("ユーザーＩＤ", X31CWebConst.DATABEAN_GET_VALUE));
		// "C" → ワンストップ対応履歴登録マップ.回答内容編集リスト.置換前文字列２
		childMap.put("replace_mae2", "C");
		// ユーザー名 → ワンストップ対応履歴登録マップ.回答内容編集リスト.置換後文字列２
		childMap.put("replace_ato2", bean[1].sendMessageString("ユーザー名", X31CWebConst.DATABEAN_GET_VALUE));
		list.add(childMap);
		
		return list;
	}
	
	/**
	 * パラメータ格納（解約）
	 * @param bean
	 * @param list
	 * @return ArrayList
	 */
	@SuppressWarnings("unchecked")
	private ArrayList setParamModeDsl(X31SDataBeanAccess[] bean, ArrayList list)
	{
		HashMap childMap = null;
		
		// １行目「■回答内容」
		childMap = new HashMap();
		// "KK_GUIDE_DSL_NYO_01" → ワンストップ対応履歴登録マップ.回答内容編集リスト.回答内容パラメータＩＤ
		childMap.put("ans_param_id", "KK_GUIDE_DSL_NYO_01");
		list.add(childMap);
		
		// ２行目「ワンストップによるガイド誌解約」
		childMap = new HashMap();
		// "KK_GUIDE_DSL_NYO_02" → ワンストップ対応履歴登録マップ.回答内容編集リスト.回答内容パラメータＩＤ
		childMap.put("ans_param_id", "KK_GUIDE_DSL_NYO_02");
		list.add(childMap);
		
		// ３行目「利用終了月：[@]」
		childMap = new HashMap();
		// "KK_GUIDE_DSL_NYO_03" → ワンストップ対応履歴登録マップ.回答内容編集リスト.回答内容パラメータＩＤ
		childMap.put("ans_param_id", "KK_GUIDE_DSL_NYO_03");
		// "@" → ワンストップ対応履歴登録マップ.回答内容編集リスト.置換前文字列１
		childMap.put("replace_mae1", "@");
		// 表示＿利用終了月：“当月” or “次月” → ワンストップ対応履歴登録マップ.回答内容編集リスト.置換後文字列１
		childMap.put("replace_ato1", bean[0].sendMessageString(KKW02522SFConst.DISP_USE_ENDYM, X31CWebConst.DATABEAN_GET_VALUE));
		list.add(childMap);
		
		// ４行目「[A]:[B]」
		childMap = new HashMap();
		// "KK_GUIDE_DSL_NYO_04" → ワンストップ対応履歴登録マップ.回答内容編集リスト.回答内容パラメータＩＤ
		childMap.put("ans_param_id", "KK_GUIDE_DSL_NYO_04");
		// "A" → ワンストップ対応履歴登録マップ.回答内容編集リスト.置換前文字列１
		childMap.put("replace_mae1", "A");
		// ユーザーＩＤ → ワンストップ対応履歴登録マップ.回答内容編集リスト.置換後文字列１
		childMap.put("replace_ato1", bean[1].sendMessageString("ユーザーＩＤ", X31CWebConst.DATABEAN_GET_VALUE));
		// "B" → ワンストップ対応履歴登録マップ.回答内容編集リスト.置換前文字列２
		childMap.put("replace_mae2", "B");
		// ユーザー名 → ワンストップ対応履歴登録マップ.回答内容編集リスト.置換後文字列２
		childMap.put("replace_ato2", bean[1].sendMessageString("ユーザー名", X31CWebConst.DATABEAN_GET_VALUE));
		list.add(childMap);
		
		return list;
	}
/* ++++++++++ v4.00.00 追加終了 ++++++++++ */
	
	/**
	 * サービス終了年月日・サービス課金終了年月日・利用開始日に条件に合った日付を格納
	 * ※【処理モード = 更新】
	 * @param bean サービスフォームBean
	 * @param parentMap
	 * @return HashMap
	 * @throws ParseException
	 */
	@SuppressWarnings("unchecked")
	public HashMap setStaEndYMD(X31SDataBeanAccess[] bean, HashMap parentMap) throws ParseException
	{
		// 変更開始月 選択値
		String chgCngStaYM = getValue(bean[0], KKW02522SFConst.CHG_CNGSTAYM);
		
		// オンライン運用日(YYYYMM)
		String opeDateYM = opeDateYM(bean);
		
		// オンライン運用日(YYYYMMDD)
		String opeDate = opeDate(bean);
		
		// 月初(格納値)
		String beginOfMonth = "";
		
		// 末日(格納値)
		String endOfMonth = "";
		
		// 即時
		if(CHG_STA_YM_REAL_TIME.equals(chgCngStaYM))
		{
			/************************************************************************************************/
			/** オプションサービス契約解約.サービス終了年月日・サービス課金終了年月日には前月末日を格納		*/
			/************************************************************************************************/
			// 運用日の前月取得
			String prevOpeDate = JPCUtilCommon.addMonth(opeDate, -1).substring(0, 6);
			
			// 末日取得
			String prevEndDay = JPCUtilCommon.getEndOfMonth(prevOpeDate);
			
			// 前月末日
			endOfMonth = editDate(prevOpeDate, prevEndDay);

			/************************************************************************************************/
			/** オプションサービス契約<TV>登録.サービス利用開始希望年月日									*/
			/** オプションサービス契約<TV>開始.サービス開始年月日											*/
			/** 当月月初を格納																				*/
			/************************************************************************************************/
			// 当月月初
			beginOfMonth = editDate(opeDateYM, FIRST_DATE);
		}
		// 次月より
		else if(CHG_STA_YM_NEXT_MONTH.equals(chgCngStaYM))
		{
			/************************************************************************************************/
			/** オプションサービス契約解約.サービス終了年月日・サービス課金終了年月日には当月末日を格納		*/
			/************************************************************************************************/
			// 末日取得
			String opeEndDay = JPCUtilCommon.getEndOfMonth(opeDate.substring(0, 6));
			
			// 当月末日
			endOfMonth = editDate(opeDateYM, opeEndDay);
			
			/************************************************************************************************/
			/** オプションサービス契約<TV>登録.サービス利用開始希望年月日									*/
			/** オプションサービス契約<TV>開始.サービス開始年月日											*/
			/** 次月月初を格納																				*/
			/************************************************************************************************/
			// 運用日の次月取得
			String nextOpeYM = JPCUtilCommon.addMonth(opeDate, 1).substring(0, 6);
			
			// 次月月初
			beginOfMonth = editDate(nextOpeYM, FIRST_DATE);
		}
		// 次々月より
		else if(CHG_STA_YM_AFTER_NEXT_MONTH.equals(chgCngStaYM))
		{
			/************************************************************************************************/
			/** オプションサービス契約解約.サービス終了年月日・サービス課金終了年月日には来月末日を格納		*/
			/************************************************************************************************/
			// 運用日の次月取得
			String nextOpeYM = JPCUtilCommon.addMonth(opeDate, 1).substring(0, 6);
			
			// 末日取得
			String nextEndDay = JPCUtilCommon.getEndOfMonth(nextOpeYM);
			
			// 次月末日
			endOfMonth = editDate(nextOpeYM, nextEndDay);
			
			/************************************************************************************************/
			/** オプションサービス契約<TV>登録.サービス利用開始希望年月日									*/
			/** オプションサービス契約<TV>開始.サービス開始年月日											*/
			/** 次々月初を格納																				*/
			/************************************************************************************************/
			// 運用日の次々月取得
			String oneAfterOpeYM = JPCUtilCommon.addMonth(opeDate, 2).substring(0, 6);
			
			// 次月月初
			beginOfMonth = editDate(oneAfterOpeYM, FIRST_DATE);
		}
		
		// サービス終了年月日
		parentMap.put("svc_endymd", endOfMonth);
		// サービス開始年月日
		parentMap.put("svc_staymd", beginOfMonth);
		
		return parentMap;
		
	}
	
	/**
	 * サービス終了年月日・サービス課金終了年月日に当月／運用日の次月末日を格納
	 * ※【処理モード = 解約】
	 * @param bean サービスフォームBean
	 * @param parentMap
	 * @return HashMap
	 * @throws ParseException
	 */
	@SuppressWarnings("unchecked")
	public HashMap setEndOfMonth(X31SDataBeanAccess[] bean, HashMap parentMap) throws ParseException
	{
		// 利用終了月 選択値
		String useEndYM = getValue(bean[0], KKW02522SFConst.USE_ENDYM);
		
		// オンライン運用日(YYYYMM)
		String opeDateYM = opeDateYM(bean);
		
		// オンライン運用日(YYYYMMDD)
		String opeDate = opeDate(bean);
		
		// 末日(格納値)
		String endOfMonth = null;
		
		// 利用終了月 = 次月
		if(USE_END_YM_NEXT_MONTH.equals(useEndYM))
		{
			/************************************************************/
			/** 利用終了日・サービス課金終了日には運用日の次月末日		*/
			/************************************************************/
			/**
			 * 月数の加減算を行います。
			 * <br>
			 * @param arg0 対象日付(yyyyMMddまたはyyyyMMddHHmmss)
			 * @param arg1 加減算値
			 * @return String 加減算された日付
			 * @throws ParseException 月の加減算処理にて、例外が発生した場合
			 */
			// 運用日の次月取得
			String nextOpeDate = JPCUtilCommon.addMonth(opeDate, 1).substring(0, 6);
			
			// 末日取得
			String nextEndDay = JPCUtilCommon.getEndOfMonth(nextOpeDate);
			
			// 次月末日
			endOfMonth = editDate(nextOpeDate, nextEndDay);
		}
		else
		{
			/************************************************************/
			/** 利用終了日・サービス課金終了日には当月末日				*/
			/************************************************************/
			// 末日取得
			String endDay = JPCUtilCommon.getEndOfMonth(opeDateYM);
			
			// 当月末日
			endOfMonth = editDate(opeDateYM, endDay);
			
//			【OM-2013-0001692】対応開始
			// 利用終了月 = 当月  かつ  処理モード 2：解約時のみ
			if(TRAN_MODE_DSL.equals(getValue(bean[0], KKW02522SFConst.TRAN_MODE)))
			{
				endOfMonth = opeDate;
			}
//			【OM-2013-0001692】対応終了
		}
		
		// 終了年月日
		parentMap.put("end_ymd", endOfMonth);
		
		return parentMap;
	}
	
	/**
	 * 日付編集
	 * <br>
	 * @param	yyyymm		年月
	 * @param	dd			日
	 * @return	yyyymmdd	年月日
	 */
	private String editDate(String yyyymm, String dd)
	{
		StringBuilder date = new StringBuilder();
		date.append(yyyymm);
		date.append(dd);
		
		return date.toString();
	}
	
	/**
	 * eo光テレビガイド誌申込数の変更有無を判定
	 * <br>
	 * @param bean
	 * 
	 * @return	boolean
	 */
	private boolean isChgGuideMskmCnt(X31SDataBeanAccess bean)
	{
		// ｅｏ光テレビガイド誌申込数(変更前)
		int bfTvGuideCnt = Integer.parseInt(bean.sendMessageString(KKW02522SFConst.TV_GUIDE_MSKM_CNT, X31CWebConst.DATABEAN_GET_VALUE));
		
		// ｅｏ光テレビガイド誌申込数(変更後)
		String afTvGuideCnt = bean.sendMessageString(KKW02522SFConst.CHG_TV_GUIDE_MSKM_CNT, X31CWebConst.DATABEAN_GET_VALUE);
		
		if (afTvGuideCnt == null || afTvGuideCnt.length() == 0)
		{
			return false;
		}
		
		if (bfTvGuideCnt != Integer.parseInt(afTvGuideCnt))
		{
			return true;
		}
		
		return false;
	}
	
	/**
	 * オンライン運用日(YYYYMM)を取得します。
	 * <br>
	 * @param bean 画面情報
	 * <br>
	 * @return String 項目値
	 */
	private String opeDateYM(X31SDataBeanAccess[] bean)
	{
		return getValue(bean[0], KKW02522SFConst.STDARDYMD).substring(0, 6);
	}
	
	/**
	 * オンライン運用日(YYYYMMDD)を取得します。
	 * <br>
	 * @param bean 画面情報
	 * <br>
	 * @return String 項目値
	 */
	private String opeDate(X31SDataBeanAccess[] bean)
	{
		return getValue(bean[0], KKW02522SFConst.STDARDYMD);
	}
	
	/**
	 * データBeanから指定された項目の値を取得します。
	 * <br>
	 * @param bean 画面情報
	 * @param itemName 項目名
	 * <br>
	 * @return String 項目値
	 */
	private String getValue(X31SDataBeanAccess bean, String itemName)
	{
		return bean.sendMessageString(itemName, X31CWebConst.DATABEAN_GET_VALUE);
	}
	
	/**
	 * 引数のNULL判定を行います。
	 * @param param
	 * @return 判定結果
	 */
	private boolean isNull(Object param)
	{
		if(param == null)
		{
			return true;
		}
		return false;
	}
	
	/**
	 * 引数に値が設定されているか判定します。
	 * <br>
	 * @param	arg0	判定する引数
	 * @return	boolean	引数に値が設定されていない場合はtrue
	 */
	private boolean isBlank(String arg0)
	{
		if (arg0 == null || arg0.length() == 0) 
		{
			return true;
		}
		
		return false;
		
	}
	
}