/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：KKSV0373_KKSV0373OPDBMapper
*	ソースファイル名：KKSV0373_KKSV0373OPDBMapper.java
*	作成者			：FJ
*	日付			：2012年05月21日
*＜機能概要＞
*	BP（申込差戻）へのＤ−Ｂマッピングクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/05/21	FJ		新規作成
*   v4.00.00    2012/08/06  FJ）北浦    【ANK-0099-00-00】eoモバイルへのeo64移行用料金プラン追加
*   v5.00.00    2013/06/10  FJ）中山    【LT-2013-0000024】異動年月日時分秒をシステム年月日時分秒に修正
*   v5.01.00    2013/09/20  FJ) 中山    【OM-2013-0002313】キューBOXの量販店代理受付対応
*   v5.02.00    2013/09/27  FJ) 川島    【OM-2013-0002702】対応履歴連携のタイトル表示不備
*   v6.00.00    2013/12/24  FJ）中山    【OM-2013-0005251】最終更新年月日の取得漏れの修正
**********************************************************************/
package eo.web.webview.mapping;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.model.common.JCMAPLConstMgr;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import static eo.web.webview.common.JKKKeiNewCmnLogicUtil.*;
import eo.common.constant.JKKStrConst;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.KKW00101SF.KKW00101SFConst;
import eo.web.webview.common.JKKKeiNewCmnLogicUtil;
import eo.web.webview.common.JKKWebCommon;

/**
 * DataBean-BPマッピングをする。
 * @author FJ
 */
public class KKSV0373_KKSV0373OPDBMapper
{
	
	/** 料金グループコード(ネット) */
	private static final String[] PRC_GRP_CD_NET = {JKKStrConst.CD00133_02, JKKStrConst.CD00133_03, JKKStrConst.CD00133_04};

	/** 料金グループコード(電話) */
	private static final String[] PRC_GRP_CD_TEL = {JKKStrConst.CD00133_10};

	/** 料金グループコード(テレビ) */
	private static final String[] PRC_GRP_CD_TV = {JKKStrConst.CD00133_11, JKKStrConst.CD00133_12, JKKStrConst.CD00133_13};

	/** 料金グループコード(モバイル) */
	private static final String[] PRC_GRP_CD_MOBILE = {JKKStrConst.CD00133_07, JKKStrConst.CD00133_08, JKKStrConst.CD00133_09, JKKStrConst.CD00133_16};
	
	/** 対応履歴　対応記録内訳カテゴリーレベル */
	private static final String[] TORK_CTGR_LV = new String[] {
		TORK_TAIOKRK_UW_CTGR_LV1,
		TORK_TAIOKRK_UW_CTGR_LV2
	};
	/** 対応履歴　対応記録内訳カテゴリー名 */
	private static final String[] COPE_HISTORY_CTGR_NM = new String[] {
		TIOKR_UW_CTGR_INFO,
		TIOKR_UW_CTGR_MI_KNYSHA
	};

	/**
	 * コンストラクタ
	 */
	public KKSV0373_KKSV0373OPDBMapper()
	{
	}
	

	/**
	 * 上りマッピングをする
	 * @param bean　[0]：申込新規登録画面　[1]：共有フォームＢｅａｎ
	 * @param outputMap
	 * @param func_code　機能コード
	 * @param mskmInfoMap
	 * @return 上りマップ
	 */
	@SuppressWarnings("unchecked")
	public HashMap setKKSV037301SC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code,
			HashMap<String, Object>mskmInfoMap)
	{
		
		if (bean == null)
		{
			return null;
		}
		
		if (bean.length != 2)
		{
			return null;
		}


		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 共通情報のマッピング
		parentMap.put("func_code", func_code);

		// 申込番号 → 申込差戻しマップ.申込番号
		parentMap.put("mskm_no", bean[0].sendMessageString("申込番号", X31CWebConst.DATABEAN_GET_VALUE));

		// コンシューマ営業用申込状態識別コード
		parentMap.put("consmbsn_mskm_stat_skbt_cd", JKKStrConst.CD00760_02);

		// 更新年月日時分秒(更新前)
		HashMap<String, Object> mskmMap = (HashMap<String, Object>)mskmInfoMap.get("KKSV007901CC");
		ArrayList<HashMap<String, Object>> mskmList = (ArrayList<HashMap<String, Object>>)mskmMap.get("mskm_svc_kei_ucwk_list");
		HashMap<String, Object> dataMap = mskmList.get(0);
		String updDtmBf = (String)dataMap.get("last_upd_dtm");
		parentMap.put("upd_dtm_bf", updDtmBf);

		outputMap.put("KKSV037301SC", parentMap);
						
		return outputMap;
	}

	/**
	 * 上りマッピングをする
	 * @param bean　[0]：申込新規登録画面　[1]：共有フォームＢｅａｎ
	 * @param outputMap
	 * @return 上りマップ
	 * @param func_code　機能コード
	 */
	@SuppressWarnings("unchecked")
	public HashMap setKKSV037302SC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code)
	{
		
		if (bean == null)
		{
			return null;
		}
		
		if (bean.length != 2)
		{
			return null;
		}


		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 共通情報のマッピング
		parentMap.put("func_code", func_code);

		// 実行フラグ
		parentMap.put("tork_flg", "1");

		// ユーザーＩＤ → キューＢＯＸＭＹＢＯＸ現在格納数一覧照会マップ.ＫＥＹ＿ユーザーＩＤ
		parentMap.put("key_user_id", bean[1].sendMessageString("ユーザーＩＤ", X31CWebConst.DATABEAN_GET_VALUE));

		outputMap.put("KKSV037302SC", parentMap);
						
		return outputMap;
	}

	/**
	 * 上りマッピングをする
	 * @param bean　[0]：申込新規登録画面　[1]：共有フォームＢｅａｎ
	 * @param outputMap
	 * @param func_code　機能コード
	 * @param mskmInfoMap
	 * @param opeDateTime
	 * @return 上りマップ
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	public HashMap setKKSV037303SC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code,
			HashMap<String, Object> mskmInfoMap, String opeDateTime) throws Exception
	{
		
		if (bean == null)
		{
			return null;
		}
		
		if (bean.length != 2)
		{
			return null;
		}


		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 共通情報のマッピング
		parentMap.put("func_code", func_code);

		// ユーザーＩＤ → 対応記録登録マップ.対応ユーザーＩＤ
		parentMap.put("taio_user_id", bean[1].sendMessageString("ユーザーＩＤ", X31CWebConst.DATABEAN_GET_VALUE));
		
		// サービス契約番号
		parentMap.put("svc_kei_no", getSvcKeiNoForCr(mskmInfoMap));
		// 問合せ客番号
		parentMap.put("proscst_no", "");
		// MYBOX格納年月日時分秒
		parentMap.put("mybox_kakno_dtm",  opeDateTime);
		// 対応開始年月日時分秒
		parentMap.put("taio_sta_dtm", opeDateTime);
		// 問合せ受付種別コード
		parentMap.put("toiawase_uk_sbt_cd", TORK_TOIAWASE_UK_SBT_CD_OTHER);
		// 簡易メモ
		parentMap.put("easy_memo", "");
		// タイトル
		parentMap.put("title", getCrTitle(mskmInfoMap, bean[0]));
		// 受付年月日時分秒
		parentMap.put("uk_dtm", opeDateTime);
		// 一時保存有無
		parentMap.put("tmp_save_um", TORK_TMP_SAVE_UM);
		// コールバック希望年月日
		parentMap.put("callbk_kibo_ymd", "");
		// コールバック希望時間
		parentMap.put("callbk_kibo_time", "");
		// コールバック時間指定タイプコード
		parentMap.put("callbk_shitei_type_cd", "");
		
		// ユーザーＩＤ → 対応記録登録マップ.ログインユーザーＩＤ
		parentMap.put("login_user_id", bean[1].sendMessageString("ユーザーＩＤ", X31CWebConst.DATABEAN_GET_VALUE));
		// ユーザー名 → 対応記録登録マップ.ログインユーザー名
		parentMap.put("login_user_nm", bean[1].sendMessageString("ユーザー名", X31CWebConst.DATABEAN_GET_VALUE));
		
		// 共通フォームBeanから権限リストを取得
		X31SDataBeanAccessArray kggrpCdList = bean[1].getDataBeanArray(CommonInfoCFConst.KGGRP_CD_LIST);
		// 権限リストの2レコード目を取得
		X31SDataBeanAccess beanKggrpCdList2 = kggrpCdList.getDataBean(1);

		// 権限リストの2レコード目から組織CDを取得
		String wkkbtOrgCd = beanKggrpCdList2.sendMessageString(CommonInfoCFConst.ORG_CD_01, X31CWebConst.DATABEAN_GET_VALUE);
		wkkbtOrgCd = shiteiSizeUmkm(wkkbtOrgCd, "0", 10);
		// 権限リストの2レコード目から組織名を取得
		String wkkbtOrgNm = beanKggrpCdList2.sendMessageString(CommonInfoCFConst.ORG_NM_01, X31CWebConst.DATABEAN_GET_VALUE);

		// 業務個別設定組織コード
		parentMap.put("wkkbt_org_cd", wkkbtOrgCd);
		// 業務個別設定組織名
		parentMap.put("wkkbt_org_nm", wkkbtOrgNm);

		outputMap.put("KKSV037303SC", parentMap);
						
		return outputMap;
	}

	/**
	 * 上りマッピングをする
	 * @param bean　[0]：申込新規登録画面　[1]：共有フォームＢｅａｎ
	 * @param outputMap
	 * @param func_code　機能コード
	 * @param mskmInfoMap
	 * @param opeDateTime
	 * @return 上りマップ
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	public HashMap setKKSV037304SC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code,
			HashMap<String, Object> mskmInfoMap, String opeDateTime) throws Exception
	{
		
		if (bean == null)
		{
			return null;
		}
		
		if (bean.length != 2)
		{
			return null;
		}


		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 共通情報のマッピング
		parentMap.put("func_code", func_code);

		// アクション開始年月日時分秒
		parentMap.put("action_sta_dtm", opeDateTime);
		// アクション完了年月日時分秒
		parentMap.put("action_fin_dtm", opeDateTime);
		// ユーザーＩＤ → 対応記録明細登録（新規登録）マップ.対応ユーザーＩＤ
		parentMap.put("taio_user_id", bean[1].sendMessageString("ユーザーＩＤ", X31CWebConst.DATABEAN_GET_VALUE));
		// ユーザーＩＤ → 対応記録明細登録（新規登録）マップ.ログインユーザーＩＤ
		parentMap.put("login_user_id", bean[1].sendMessageString("ユーザーＩＤ", X31CWebConst.DATABEAN_GET_VALUE));
		// ユーザー名 → 対応記録明細登録（新規登録）マップ.ログインユーザー名
		parentMap.put("login_user_nm", bean[1].sendMessageString("ユーザー名", X31CWebConst.DATABEAN_GET_VALUE));
		
		// 共通フォームBeanから権限リストを取得
		X31SDataBeanAccessArray kggrpCdList = bean[1].getDataBeanArray(CommonInfoCFConst.KGGRP_CD_LIST);
		// 権限リストの2レコード目を取得
		X31SDataBeanAccess beanKggrpCdList2 = kggrpCdList.getDataBean(1);

		// 権限リストの2レコード目から組織CDを取得
		String wkkbtOrgCd = beanKggrpCdList2.sendMessageString(CommonInfoCFConst.ORG_CD_01, X31CWebConst.DATABEAN_GET_VALUE);
		wkkbtOrgCd = shiteiSizeUmkm(wkkbtOrgCd, "0", 10);
		// 権限リストの2レコード目から組織名を取得
		String wkkbtOrgNm = beanKggrpCdList2.sendMessageString(CommonInfoCFConst.ORG_NM_01, X31CWebConst.DATABEAN_GET_VALUE);

		// 業務個別設定組織コード
		parentMap.put("wkkbt_org_cd", wkkbtOrgCd);
		// 業務個別設定組織名
		parentMap.put("wkkbt_org_nm", wkkbtOrgNm);
		
		// クローズ不可コード
		parentMap.put("close_fail_cd", TORK_CLOSE_FAIL_CD_FAIL);
		// サービス契約番号
		parentMap.put("svc_kei_no", getSvcKeiNoForCr(mskmInfoMap));

		outputMap.put("KKSV037304SC", parentMap);
						
		return outputMap;
	}

	/**
	 * 上りマッピングをする
	 * @param bean　[0]：申込新規登録画面　[1]：共有フォームＢｅａｎ
	 * @param outputMap
	 * @param func_code　機能コード
	 * @param opeDateTime
	 * @return 上りマップ
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	public HashMap setKKSV037305SC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code,
			String opeDateTime) throws Exception
	{
		
		if (bean == null)
		{
			return null;
		}
		
		if (bean.length != 2)
		{
			return null;
		}


		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 共通情報のマッピング
		parentMap.put("func_code", func_code);

		// 対応ユーザーID
		parentMap.put("taio_user_id", bean[1].sendMessageString("ユーザーＩＤ", X31CWebConst.DATABEAN_GET_VALUE));
		// キューBOX番号
		parentMap.put("que_box_no", getQueBoxNo(bean[0]));
		// キューBOX格納年月日時分秒
		parentMap.put("que_box_kakno_dtm", opeDateTime);
		// アクション開始年月日時分秒
		parentMap.put("action_sta_dtm", opeDateTime);
		// アクション完了年月日時分秒
		parentMap.put("action_fin_dtm", opeDateTime);
		// ユーザーＩＤ → 対応記録エスカレーション開始（キューＢＯＸ）マップ.ログインユーザーＩＤ
		parentMap.put("login_user_id", bean[1].sendMessageString("ユーザーＩＤ", X31CWebConst.DATABEAN_GET_VALUE));
		// ユーザー名 → 対応記録エスカレーション開始（キューＢＯＸ）マップ.ログインユーザー名
		parentMap.put("login_user_nm", bean[1].sendMessageString("ユーザー名", X31CWebConst.DATABEAN_GET_VALUE));
		
		// 共通フォームBeanから権限リストを取得
		X31SDataBeanAccessArray kggrpCdList = bean[1].getDataBeanArray(CommonInfoCFConst.KGGRP_CD_LIST);
		// 権限リストの2レコード目を取得
		X31SDataBeanAccess beanKggrpCdList2 = kggrpCdList.getDataBean(1);

		// 権限リストの2レコード目から組織CDを取得
		String wkkbtOrgCd = beanKggrpCdList2.sendMessageString(CommonInfoCFConst.ORG_CD_01, X31CWebConst.DATABEAN_GET_VALUE);
		wkkbtOrgCd = shiteiSizeUmkm(wkkbtOrgCd, "0", 10);
		// 権限リストの2レコード目から組織名を取得
		String wkkbtOrgNm = beanKggrpCdList2.sendMessageString(CommonInfoCFConst.ORG_NM_01, X31CWebConst.DATABEAN_GET_VALUE);

		// 業務個別設定組織コード
		parentMap.put("wkkbt_org_cd", wkkbtOrgCd);
		// 業務個別設定組織名
		parentMap.put("wkkbt_org_nm", wkkbtOrgNm);
		// エスカレーション先業務個別設定組織コード
		parentMap.put("escla_saki_wkso_cd", getEscleSakiWksoCd(bean[0]));

		outputMap.put("KKSV037305SC", parentMap);
						
		return outputMap;
	}
	
	/**
	 * 上りマッピングをする
	 * @param   bean      [0]：申込新規登録画面
	 * @param   outputMap 登録データ
	 * @param   func_code 機能コード
	 * @return  登録データ
	 * @throws Exception 業務サービス内でエラーが発生した場合
	 */
	@SuppressWarnings("unchecked")
	public HashMap setKKSV037306SC(	X31SDataBeanAccess[] bean, HashMap outputMap, String func_code) throws Exception
	{
		if (bean == null)
		{
			return null;
		}

		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 共通情報のマッピング
		parentMap.put("func_code", func_code);
		
		// ＫＥＹ＿キューBOX番号
		parentMap.put("key_que_box_no", getQueBoxNo(bean[0]));

		outputMap.put("KKSV037306SC", parentMap);
	
		return outputMap;
	}
	
	/**
	 * 上りマッピングをする
	 * @param   bean      [0]：申込新規登録画面
	 * @param   outputMap 登録データ
	 * @param   func_code 機能コード
	 * @return  登録データ
	 * @throws Exception 業務サービス内でエラーが発生した場合
	 */
	@SuppressWarnings("unchecked")
	public HashMap setKKSV037307SC(	X31SDataBeanAccess[] bean, HashMap outputMap, String func_code) throws Exception
	{
		if (bean == null)
		{
			return null;
		}

		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 共通情報のマッピング
		parentMap.put("func_code", func_code);
		
		// ＫＥＹ＿業務個別設定組織コード
		parentMap.put("key_wkkbt_org_cd", getEscleSakiWksoCd(bean[0]));

		outputMap.put("KKSV037307SC", parentMap);
	
		return outputMap;
	}
	
	/**
	 * キューBOX番号を取得します。
	 * <br/>
	 * @param bean サービスフォームBean
	 * @return キューBOX番号
	 */
	private String getQueBoxNo(X31SDataBeanAccess bean)
	{
		// 申込内訳コードによってキューBOX番号を判断する
		String mskmUcwkCD =JKKWebCommon.convertCode(bean, KKW00101SFConst.MSKM_UCWK_CD,
				KKW00101SFConst.MSKM_UCWK_CD_11, KKW00101SFConst.MSKM_UCWK_CD_LIST_11);
		if (JKKStrConst.RYOHNTN_AGENCY_UK.equals(mskmUcwkCD))
		{
			return JCMAPLConstMgr.getString(PROP_QUE_BOX_NO_INFO_RYOHAN);
		}
		
		return JCMAPLConstMgr.getString(PROP_QUE_BOX_NO_INFO);
	}
	
	/**
	 * エスカレーション先業務個別設定組織コードを取得します。
	 * <br/>
	 * @param bean サービスフォームBean
	 * @return エスカレーション先業務個別設定組織コード
	 */
	private String getEscleSakiWksoCd(X31SDataBeanAccess bean)
	{
		// 申込内訳コードによってキューBOX番号を判断する
		String mskmUcwkCD =JKKWebCommon.convertCode(bean, KKW00101SFConst.MSKM_UCWK_CD,
				KKW00101SFConst.MSKM_UCWK_CD_11, KKW00101SFConst.MSKM_UCWK_CD_LIST_11);
		if (JKKStrConst.RYOHNTN_AGENCY_UK.equals(mskmUcwkCD))
		{
			return JCMAPLConstMgr.getString(PP_ES_WKSO_CD_INFO_RYOHAN);
		}
		
		return JCMAPLConstMgr.getString(PP_ESCLA_SAKI_WKSO_CD_INFO);
	}

	/**
	 * 上りマッピングをする
	 * @param bean　[0]：申込新規登録画面　[1]：共有フォームＢｅａｎ
	 * @param outputMap
	 * @param func_code　機能コード
	 * @return 上りマップ
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	public HashMap setKKSV037301CC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code) throws Exception
	{
		
		if (bean == null)
		{
			return null;
		}
		
		if (bean.length != 2)
		{
			return null;
		}

		// 共通フォームBeanから権限リストを取得
		X31SDataBeanAccessArray kggrpCdList = bean[1].getDataBeanArray(CommonInfoCFConst.KGGRP_CD_LIST);
		// 共通フォームBeanからユーザーIDを取得
		String userId = bean[1].sendMessageString(CommonInfoCFConst.USER_ID, X31CWebConst.DATABEAN_GET_VALUE);
		// 共通フォームBeanからユーザー名を取得
		String userNm = bean[1].sendMessageString(CommonInfoCFConst.USER_NM, X31CWebConst.DATABEAN_GET_VALUE);

		// 権限リストの2レコード目を取得
		X31SDataBeanAccess beanKggrpCdList2 = kggrpCdList.getDataBean(1);

		// 権限リストの2レコード目から組織CDを取得
		String wkkbtOrgCd = beanKggrpCdList2.sendMessageString(CommonInfoCFConst.ORG_CD_01, X31CWebConst.DATABEAN_GET_VALUE);
		wkkbtOrgCd = shiteiSizeUmkm(wkkbtOrgCd, "0", 10);
		// 権限リストの2レコード目から組織名を取得
		String wkkbtOrgNm = beanKggrpCdList2.sendMessageString(CommonInfoCFConst.ORG_NM_01, X31CWebConst.DATABEAN_GET_VALUE);

		HashMap<String, Object> parentMap = new HashMap<String, Object>();

		// 共通情報のマッピング
		parentMap.put("func_code", func_code);

		ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
		HashMap<String, Object> rspCtgrListMap = new HashMap<String, Object>();

		// 対応記録内訳番号
		rspCtgrListMap.put("taio_kirok_ucwk_no", TORK_TAIO_KIROK_UCWK_NO);
		// 問合せ応対区分
		rspCtgrListMap.put("toiawase_rsp_div", TORK_TOIAWASE_RSP_DIV_TOIAWASE);
		// お客様の声
		rspCtgrListMap.put("cust_koe", "");
		// ＣＳＲの声
		rspCtgrListMap.put("csr_koe", "");
		// 表示順序
		rspCtgrListMap.put("dsp_jun", TORK_DSP_JUN);
		// 対応記録内訳抽出ワーク作成区分
		rspCtgrListMap.put("tiokr_uw_cst_wk_add_div", TORK_TIOKR_UW_CST_WK_DIV_TAIO);
		// 編集状態フラグ
		rspCtgrListMap.put("henshu_stat_flg", TORK_HENSHU_STAT_FLG_FIN);

		ArrayList<HashMap<String, Object>> uwCtgrnList = new ArrayList<HashMap<String, Object>>();

		for (int j = 0; j < TORK_CTGR_LV.length; j++)
		{
			
			HashMap<String, Object> uwCtgrnMap = new HashMap<String, Object>();

			// 対応記録内訳番号
			uwCtgrnMap.put("taio_kirok_ucwk_no", TORK_TAIO_KIROK_UCWK_NO);
			// 対応記録内訳カテゴリー → 対応記録ホットボイスマップ.応対区分リスト.カテゴリーＮレベル
			uwCtgrnMap.put("taiokrk_uw_ctgr_lv", TORK_CTGR_LV[j]);

			// 上位連結カテゴリー名
			if (TORK_TAIOKRK_UW_CTGR_LV1.equals(TORK_CTGR_LV[j]))
			{
				// レベル１の場合、業務個別設定組織コードを設定
				uwCtgrnMap.put("joi_rnkt_ctgr_nm", wkkbtOrgCd);
			}
			else
			{
				// レベル１以外の場合、前空白埋めで160バイトの固定長で上位のカテゴリー名を設定
				uwCtgrnMap.put("joi_rnkt_ctgr_nm", shiteiSizeUmkm(COPE_HISTORY_CTGR_NM[j - 1], " ", 160));
			}

			// 下位のカテゴリーが存在するか
			if (TORK_TAIOKRK_UW_CTGR_LV2.equals(TORK_CTGR_LV[j]))
			{
				// レベル２の場合、下位カテゴリーは存在しない
				uwCtgrnMap.put("kai_ctgr_um", COPE_HISTORY_KAI_CTGR_UM_OFF);
			}
			else
			{
				// 下位カテゴリーが存在する。
				uwCtgrnMap.put("kai_ctgr_um", COPE_HISTORY_KAI_CTGR_UM_ON);
			}

			// 対応記録内訳カテゴリー名
			uwCtgrnMap.put("taiokrk_uw_ctgr_nm", COPE_HISTORY_CTGR_NM[j]);
			// クローズ不可コード
			uwCtgrnMap.put("close_fail_cd", TORK_CLOSE_FAIL_CD_FAIL);
			// 編集状態フラグ
			uwCtgrnMap.put("henshu_stat_flg", TORK_HENSHU_STAT_FLG_FIN);
			// ログインユーザーID
			uwCtgrnMap.put("login_user_id", userId);
			// ログインユーザー名
			uwCtgrnMap.put("login_user_nm", userNm);
			// 業務個別設定組織コード
			uwCtgrnMap.put("wkkbt_org_cd", wkkbtOrgCd);
			// 業務個別設定組織名
			uwCtgrnMap.put("wkkbt_org_nm", wkkbtOrgNm);
			// 処理済フラグ
			uwCtgrnMap.put("syrzm_flg", COPE_HISTORY_SYRZM_FLG_MI_TRN);

			uwCtgrnList.add(uwCtgrnMap);
		}

		rspCtgrListMap.put("UW_CTGRN_List", uwCtgrnList);
		list.add(rspCtgrListMap);

		parentMap.put("RSP_CTGR_List", list);

		outputMap.put("ADDHOTVOICCC", parentMap);
						
		return outputMap;
	}

	/**
	 * 対応履歴連携用にサービス契約番号を取得します。
	 * @param mskmInfoMap
	 * @return サービス契約番号
	 */
	@SuppressWarnings("unchecked")
	private String getSvcKeiNoForCr(HashMap<String, Object> mskmInfoMap)
	{
		HashMap<String, Object> mskmMap = (HashMap<String, Object>)mskmInfoMap.get("KKSV007901CC");
		ArrayList<HashMap<String, Object>> mskmList = (ArrayList<HashMap<String, Object>>)mskmMap.get("mskm_svc_kei_ucwk_list");
		HashMap<String, Object> childMap = mskmList.get(0);
		ArrayList<HashMap<String, Object>> mskmDtlList = (ArrayList<HashMap<String, Object>>)childMap.get("mskm_dtl_list");
		
		if (mskmDtlList == null)
		{
			return null;
		}
		
		String svcKeiNo = null;
			
		// ネット
		svcKeiNo = getSvcKeiNo(PRC_GRP_CD_NET, mskmDtlList);;
		if (svcKeiNo != null)
		{
			return svcKeiNo;
		}
		
		// 電話
		svcKeiNo = getSvcKeiNo(PRC_GRP_CD_TEL, mskmDtlList);;
		if (svcKeiNo != null)
		{
			return svcKeiNo;
		}
		
		// テレビ
		svcKeiNo = getSvcKeiNo(PRC_GRP_CD_TV, mskmDtlList);;
		if (svcKeiNo != null)
		{
			return svcKeiNo;
		}
		
		// モバイル
		svcKeiNo = getSvcKeiNo(PRC_GRP_CD_MOBILE, mskmDtlList);;
		if (svcKeiNo != null)
		{
			return svcKeiNo;
		}

		return null;
	}

	/**
	 * 料金グループコードに一致するサービス契約番号を取得します。
	 * @param prcGrpCdList
	 * @param mskmDtlList
	 * @return サービス契約番号
	 */
	@SuppressWarnings("unchecked")
	private String getSvcKeiNo(String[] prcGrpCdList, ArrayList<HashMap<String, Object>> mskmDtlList)
	{
		if (prcGrpCdList == null || prcGrpCdList.length < 1)
		{
			return null;
		}
		
		String svcKeiNo = null;
		
		for (HashMap<String, Object> mskmDtlMap : mskmDtlList)
		{
			ArrayList<HashMap<String, Object>> svcKeiList = (ArrayList<HashMap<String, Object>>)mskmDtlMap.get("svc_kei_list");
			HashMap<String, Object> svcKeiMap = svcKeiList.get(0);
			String prcGrpCd = (String)svcKeiMap.get("prc_grp_cd");
			
			for (String tgPrcGrpCd : prcGrpCdList)
			{
				if (tgPrcGrpCd != null && tgPrcGrpCd.equals(prcGrpCd))
				{
					svcKeiNo = (String)svcKeiMap.get("svc_kei_no");
				}
			}
		}
		
		return svcKeiNo;
	}
	
	/**
	 * 指定されたサイズまで埋め込みを行う。
	 * <br>
	 * @param val　埋め込みを行う文字列
	 * @param umkmMozi 埋め込み文字
	 * @param byteSu　バイト数
	 * @return 出力先マップ
	 * @throws Exception
	 */
	private String shiteiSizeUmkm(String val, String umkmMozi, int byteSu) throws Exception
	{
		byte[] paraByte = null;

		String rslt = val;
		String thisUmkmMozi = umkmMozi;

		if (rslt == null)
		{
			rslt = "";
		}

		// 埋め込み文字のデフォルトは半角スペースを設定
		if (thisUmkmMozi == null
				|| "".equals(thisUmkmMozi))
		{
			thisUmkmMozi = " ";
		}

		paraByte = rslt.getBytes();

		int paraByteSize = paraByte.length;

		for (int i = paraByteSize; i < byteSu; i++)
		{
			rslt = thisUmkmMozi + rslt;
		}
		return rslt;
	}
	
	/**
	 * 対応履歴連携用にタイトルを取得します。
	 * @param mskmInfoMap 申込情報マップ
	 * @param bean 申込新規登録のDataBean
	 * @return タイトル
	 */
	@SuppressWarnings("unchecked")
	private String getCrTitle(HashMap<String, Object> mskmInfoMap, X31SDataBeanAccess bean)
	{
		String titleType = "";
		// ホームタイプ
		if(isMskmType(bean, IS_JDG_YO_MSKM_TYPE_HOME, null))
		{
			titleType = TORK_TITLE_HOME_TYPE;
		}
		// マンションタイプ
		else if(isMskmType(bean, IS_JDG_YO_MSKM_TYPE_MANSION, null))
		{
			titleType = TORK_TITLE_MANSION_TYPE;
		}
		// メゾンタイプ
		else if(isMskmType(bean, IS_JDG_YO_MSKM_TYPE_MEZON, null))
		{
			titleType = TORK_TITLE_MEZON_TYPE;
		}
		// モバイル単独は何も付与しない。
		// 電話チャネルしか申請はできないのでADSLタイプの考慮は必要ない。
		
		
		StringBuilder title = new StringBuilder();

		HashMap<String, Object> mskmMap = (HashMap<String, Object>)mskmInfoMap.get("KKSV007901CC");
		ArrayList<HashMap<String, Object>> mskmList = (ArrayList<HashMap<String, Object>>)mskmMap.get("mskm_svc_kei_ucwk_list");
		HashMap<String, Object> childMap = mskmList.get(0);
		ArrayList<HashMap<String, Object>> mskmDtlList = (ArrayList<HashMap<String, Object>>)childMap.get("mskm_dtl_list");
		
		if (getSvcKeiNo(PRC_GRP_CD_NET, mskmDtlList) != null)
		{
			title.append(TORK_TITLE_NET);
		}

		if (getSvcKeiNo(PRC_GRP_CD_TEL, mskmDtlList) != null)
		{
			if (title.length() == 0)
			{
				title.append(TORK_TITLE_TEL);
			}
			else
			{
				title.append(TORK_TITLE_CONNECT).append(TORK_TITLE_TEL);
			}
			
		}

		if (getSvcKeiNo(PRC_GRP_CD_TV, mskmDtlList) != null)
		{
			if (title.length() == 0)
			{
				title.append(TORK_TITLE_TV);
			}
			else
			{
				title.append(TORK_TITLE_CONNECT).append(TORK_TITLE_TV);
			}
			
		}

		if (getSvcKeiNo(PRC_GRP_CD_MOBILE, mskmDtlList) != null)
		{
			if (title.length() == 0)
			{
				title.append(TORK_TITLE_MOBA);
			}
			else
			{
				title.append(TORK_TITLE_CONNECT).append(TORK_TITLE_MOBA);
			}
			
		}

		title.append(TORK_TITLE_RECEIVE);
		title.append("（").append(getMskmshoNoForCr(mskmInfoMap)).append("）※差戻");
		
		// 先頭に追加
		title.insert(0, titleType);
		
		return title.toString();
	}
	
	/**
	 * 対応履歴連携用に申込書番号を取得します。
	 * @param mskmInfoMap
	 * @return 申込書番号
	 */
	@SuppressWarnings("unchecked")
	private String getMskmshoNoForCr(HashMap<String, Object> mskmInfoMap)
	{
		HashMap<String, Object> netMap = (HashMap<String, Object>)mskmInfoMap.get("KKSV007904CC");
		ArrayList<HashMap<String, Object>> netList = null;
		HashMap<String, Object> childMap = null;
		String mskmshoNoNet = null;
		if (netMap != null)
		{
			netList = (ArrayList<HashMap<String, Object>>)netMap.get("EKK0021B502CBSMsg1List");
		}
		if (netList != null && netList.size() > 0)
		{
			childMap = netList.get(0);
		}
		if (childMap != null)
		{
			mskmshoNoNet = (String)childMap.get("kk0021_mskmsho_no");
		}
		if (mskmshoNoNet != null)
		{
			return mskmshoNoNet;
		}
		
		HashMap<String, Object> telMap = (HashMap<String, Object>)mskmInfoMap.get("KKSV007905CC");
		String mskmshoNoTel = null;
		if (telMap != null)
		{
			mskmshoNoTel = (String)telMap.get("kk0021_mskmsho_no");
		}
		if (mskmshoNoTel != null)
		{
			return mskmshoNoTel;
		}
		
		HashMap<String, Object> tvMap = (HashMap<String, Object>)mskmInfoMap.get("KKSV007906CC");
		String mskmshoNoTv = null;
		if (tvMap != null)
		{
			mskmshoNoTv = (String)tvMap.get("kk0021_mskmsho_no");
		}
		if (mskmshoNoTv != null)
		{
			return mskmshoNoTv;
		}
		
		HashMap<String, Object> mobileMap = (HashMap<String, Object>)mskmInfoMap.get("KKSV007908CC");
		String mskmshoNoMobile = null;
		if (mobileMap != null)
		{
			mskmshoNoMobile = (String)mobileMap.get("mobile_mskmsho_no");
		}
		if (mskmshoNoMobile != null)
		{
			return mskmshoNoMobile;
		}

		return null;
	}

	/**
	 * 上りマッピングをする
	 * @param bean　[0]：申込新規登録画面　[1]：共有フォームＢｅａｎ
	 * @param outputMap
	 * @param func_code　機能コード
	 * @param mskmInfoMap 申込の照会
	 * @param opeDateTimeStamp YYYYMMDDhhmmssSSS
	 * @return 上りマップ
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	public HashMap setKKSV037302CC(
			X31SDataBeanAccess[] bean, HashMap outputMap, String func_code, HashMap mskmInfoMap, String opeDateTimeStamp) throws Exception
	{
		
		if (bean == null)
		{
			return null;
		}
		
		if (bean.length != 2)
		{
			return null;
		}

		HashMap<String, Object> parentMap = new HashMap<String, Object>();
		
		// 進捗登録用リスト
		ArrayList<HashMap> addPrgList = new ArrayList<HashMap>();
		parentMap.put("add_prg_list", addPrgList);
		
		ArrayList<HashMap> svcList = new ArrayList<HashMap>();
		// ネット情報の登録
		setNetInfo(mskmInfoMap, svcList);
		// 電話情報の登録
		setTelInfo(mskmInfoMap, svcList);
		// テレビ情報の登録
		setTvInfo(mskmInfoMap, svcList);
		// モバイル情報の登録
		setMobaInfo(mskmInfoMap, svcList);
		// 共通情報のマッピング
		parentMap.put("func_code", func_code);
		
		//登録されているサービスの件数分、処理を行う。
		for(HashMap svcMap : svcList)
		{
			//進捗の上りマップを作成
			addPrgList.add(getPrgMap(bean[0], opeDateTimeStamp, svcMap));
		}
		
		// 異動区分
		String mskmFlg = bean[0].sendMessageString(KKW00101SFConst.MSKM_FLG, X31CWebConst.DATABEAN_GET_VALUE);
		if (JKKKeiNewCmnLogicUtil.MSKM_FLG_SHINKI.equals(mskmFlg))
		{
			// 新規申込の場合
			parentMap.put("kk109101_ido_div", JKKStrConst.CD00576_00001); // 00001（新規契約）
		}
		else
		{
			// 新規申込以外の場合
			parentMap.put("kk109101_ido_div", JKKStrConst.CD00576_00002); // 00002（サービス追加）
		}
		
		// 異動理由明細
		parentMap.put("kk109101_EKK1091D010CBSMsg1List", getIrsnDtl());
		
		outputMap.put("KKSV037302CC", parentMap);

		return outputMap;
	}

	/**
	 * ネットの照会情報をマッピングする
	 * @param mskmInfoMap 申込の照会
	 * @param addPrgList 進捗登録用リスト
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private void setNetInfo(HashMap mskmInfoMap, ArrayList<HashMap> addPrgList) throws Exception
	{
		if (mskmInfoMap == null)
		{
			return;
		}

		HashMap netMap = (HashMap)mskmInfoMap.get("KKSV007904CC");

		if (netMap == null)
		{
			return;
		}

		// 申込明細＜ｅｏ光ネット＞一覧照会明細
		ArrayList<HashMap<String, Object>> netList = (ArrayList<HashMap<String, Object>>)netMap.get("EKK0021B502CBSMsg1List");

		if (netList == null || netList.size() == 0)
		{
			return;
		}

		HashMap<String, Object> netChildMap = netList.get(0);

		// 申込明細番号
		String mskmDtlNo = (String)netChildMap.get("kk0021_mskm_dtl_no");
		// サービス契約番号
		String svcKeiNo = (String)netChildMap.get("kk0081_svc_kei_no");

		boolean isMskmDtlNo = mskmDtlNo != null && !"".equals(mskmDtlNo);
		boolean isSvcKeiNo = svcKeiNo != null && !"".equals(svcKeiNo);

		if (isMskmDtlNo && isSvcKeiNo)
		{
			HashMap map = new HashMap();
			map.put("mskm_dtl_no", mskmDtlNo);
			map.put("svc_kei_no", svcKeiNo);
			addPrgList.add(map);
		}
	}

	/**
	 * 電話の照会情報をマッピングする
	 * @param mskmInfoMap 申込の照会
	 * @param addPrgList 進捗登録用リスト
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private void setTelInfo(HashMap mskmInfoMap, ArrayList<HashMap> addPrgList) throws Exception
	{
		if (mskmInfoMap == null)
		{
			return;
		}

		HashMap telMap = (HashMap)mskmInfoMap.get("KKSV007905CC");

		if (telMap == null)
		{
			return;
		}

		// 申込明細番号
		String mskmDtlNo = (String)telMap.get("kk0021_mskm_dtl_no");
		// サービス契約番号
		String svcKeiNo = (String)telMap.get("kk0081_svc_kei_no");

		boolean isMskmDtlNo = mskmDtlNo != null && !"".equals(mskmDtlNo);
		boolean isSvcKeiNo = svcKeiNo != null && !"".equals(svcKeiNo);

		if (isMskmDtlNo && isSvcKeiNo)
		{
			HashMap map = new HashMap();
			map.put("mskm_dtl_no", mskmDtlNo);
			map.put("svc_kei_no", svcKeiNo);
			addPrgList.add(map);
		}
	}

	/**
	 * テレビの照会情報をマッピングする
	 * @param mskmInfoMap 申込の照会
	 * @param addPrgList 進捗登録用リスト
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private void setTvInfo(HashMap mskmInfoMap, ArrayList<HashMap> addPrgList) throws Exception
	{
		if (mskmInfoMap == null)
		{
			return;
		}

		HashMap tvMap = (HashMap)mskmInfoMap.get("KKSV007906CC");

		if (tvMap == null)
		{
			return;
		}

		// 申込明細番号
		String mskmDtlNo = (String)tvMap.get("kk0021_mskm_dtl_no");
		// サービス契約番号
		String svcKeiNo = (String)tvMap.get("kk0081_svc_kei_no");

		boolean isMskmDtlNo = mskmDtlNo != null && !"".equals(mskmDtlNo);
		boolean isSvcKeiNo = svcKeiNo != null && !"".equals(svcKeiNo);

		if (isMskmDtlNo && isSvcKeiNo)
		{
			HashMap map = new HashMap();
			map.put("mskm_dtl_no", mskmDtlNo);
			map.put("svc_kei_no", svcKeiNo);
			addPrgList.add(map);
		}
	}

	/**
	 * モバイルの照会情報をマッピングする
	 * @param mskmInfoMap 申込の照会
	 * @param addPrgList 進捗登録用リスト
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private void setMobaInfo(HashMap mskmInfoMap, ArrayList<HashMap> addPrgList) throws Exception
	{
		if (mskmInfoMap == null)
		{
			return;
		}

		HashMap mobaMap = (HashMap)mskmInfoMap.get("KKSV007908CC");

		if (mobaMap == null)
		{
			return;
		}

		// 申込明細番号
		String mskmDtlNo = (String)mobaMap.get("mobile_mskm_dtl_no");
		// サービス契約番号
		String svcKeiNo = (String)mobaMap.get("mobile_svc_kei_no");

		boolean isMskmDtlNo = mskmDtlNo != null && !"".equals(mskmDtlNo);
		boolean isSvcKeiNo = svcKeiNo != null && !"".equals(svcKeiNo);

		if (isMskmDtlNo && isSvcKeiNo)
		{
			HashMap map = new HashMap();
			map.put("mskm_dtl_no", mskmDtlNo);
			map.put("svc_kei_no", svcKeiNo);
			addPrgList.add(map);
		}
	}
	
	/**
	 * 進捗情報の上りマップを作成します。
	 * @param bean
	 * @param opeDateTimeStamp
	 * @param svcMap 
	 * @return prgMap 返却マップ
	 */
	private HashMap<String, Object> getPrgMap(X31SDataBeanAccess bean, String opeDateTimeStamp, HashMap<String, Object> svcMap)
	{
		HashMap<String, Object> prgMap = new HashMap<String, Object>();
		
		//申込明細番号
		prgMap.put("kk109101_mskm_dtl_no", svcMap.get("mskm_dtl_no"));
		//サービス契約番号
		prgMap.put("kk109101_svc_kei_no", svcMap.get("svc_kei_no"));
		//進捗ステータス
		prgMap.put("kk109101_prg_stat", JKKStrConst.CD00647_MSKM_REQ_UK);
		//進捗特記事項1
		prgMap.put("kk109101_prg_tkjk_1", JKKKeiNewCmnLogicUtil.RTRN_SHINSEI_JSSI);

		return prgMap;
	}
	
	/**
	 * 異動理由明細リストを作成する。
	 * @return irsnDtl
	 */
	private ArrayList<HashMap<String, Object>> getIrsnDtl()
	{
		// 異動理由明細
		ArrayList<HashMap<String, Object>> irsnDtl = new ArrayList<HashMap<String, Object>>();
		
		HashMap<String, Object> dtlMap = new HashMap<String, Object>();
		
		irsnDtl.add(dtlMap);
		
		// 異動理由コード（その他）
		dtlMap.put("kk109101_ido_rsn_cd", JKKStrConst.CD00846_OTHER);
		
		return irsnDtl;
	}
}