/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：KKSV0359_KKSV0359OPDBMapper
*	ソースファイル名：KKSV0359_KKSV0359OPDBMapper.java
*	作成者			：Fujitsu
*	日付			：2011年12月02日
*＜機能概要＞
*	BP（契約紐付変更登録＿登録確認サービス）へのＤ−Ｂマッピングクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/12/02	Fujitsu		新規作成
*	v4.00.00	2012/10/08	FJ)稲岡		【ANK-0406-00-00】対応
*	v8.00.00	2013/12/14	FJ)稲岡		【ANK-1584-00-00】対応 L2-MVNO(本体)
*	v10.00.00	2014/08/22	FJ)山下		【OM-2014-0002722】対応 
*   v10.00.01   2014/11/04	FJ)舩橋		【ANK-2273-00-00】対応
*   v11.00.00   2014/11/27	FJ)舩橋		【ANK-2250-00-00】対応
*   v26.00.00   2016/08/05	FJ)柳		【ANK-2661-00-00】未来予約データ取消し処理改善
*   v29.00.00   2017/04/21	FJ)クウン	【ANK-3132-00-00】バックヤード画面へのコンテンツ同意登録機能の追加
**********************************************************************/
package eo.web.webview.mapping;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.common.constant.JKKFamiilyPackConst;
import eo.common.util.JPCDateUtil;
import eo.web.webview.KKW03601SF.KKW03601SFConst;
import eo.web.webview.common.JKKCommonConst;

/**
 * DataBean-BPマッピングをする。
 * 
 */
public class KKSV0359_KKSV0359OPDBMapper
{
	
	/**
	 * コンストラクタ
	 */
	public KKSV0359_KKSV0359OPDBMapper(){
	}
	
	/**
	 * 上りマッピングをする
	 * @param bean　[0]：契約紐付変更登録
	 * @param outputMap
	 */
	@SuppressWarnings("unchecked")
	public HashMap setKKSV035903CC(X31SDataBeanAccess[] bean, HashMap outputMap)
	{
		if(isNull(bean))
		{
			return null;
		}
		
		if(bean.length != 1)
		{
			return null;
		}
		
		HashMap<String, Object> parentMap = new HashMap<String, Object>();
		HashMap<String, String> childMap = null;
		X31SDataBeanAccessArray list = null;
		X31SDataBeanAccess subBean = null;
		ArrayList svcKeiList = new ArrayList();		// 関連チェック用

		// ANK-2273-00-00 ADD START
		String mtSeikyNo = null;
		// ANK-2273-00-00 ADD END
		
		// 併合元＿ＳＹＳＩＤ → 契約紐付更新登録チェックマップ.併合元＿SYSID
		parentMap.put("mt_sysid", getValue(bean[0], KKW03601SFConst.MT_SYSID));
		
		// SYSID退避 → 契約紐付更新登録チェックマップ.併合先＿SYSID
		parentMap.put("sk_sysid", getValue(bean[0], KKW03601SFConst.BK_SK_SYSID));
		
		// 併合先＿請求契約番号 → 契約紐付更新登録チェックマップ.併合先＿請求契約番号
		parentMap.put("sk_seiky_kei_no", getValue(bean[0], KKW03601SFConst.SK_SEIKY_KEI_NO));
		
		// 運用日 → 契約紐付更新登録チェックマップ.ＫＥＹ＿予約適用年月日
		parentMap.put("key_rsv_aply_ymd", getValue(bean[0], KKW03601SFConst.OPE_DATE));
		
		// 割引サービスコード → 契約紐付更新登録チェックマップ.割引サービスコード
		parentMap.put("key_wrib_svc_cd", getValue(bean[0], KKW03601SFConst.WRIB_SVC_CD));
		
/* ++++++++++ v8.00.00 追加開始 ++++++++++ */
		// 遷移元判定フラグ → 契約紐付更新登録チェックマップ.遷移元判定フラグ
		parentMap.put("senimoto_flg", getValue(bean[0], KKW03601SFConst.SENIMOTO_FLG));
/* ++++++++++ v8.00.00 追加終了 ++++++++++ */
		
		// サービス契約情報一覧リスト
		list = bean[0].getDataBeanArray(KKW03601SFConst.SVC_KEI_INFO_LIST);
		for(int i=0; i<list.getCount(); i++)
		{
			subBean = list.getDataBean(i);
			
			// 併合対象のみ
			if(subBean.sendMessageBoolean(KKW03601SFConst.CHOICE_01, X31CWebConst.DATABEAN_GET_VALUE))
			{
				childMap = new HashMap<String, String>();
				
				childMap.put("svc_cd", getValue(subBean, KKW03601SFConst.L_SVC_CD_KK0081_01));								// サービスコード
				childMap.put("prc_grp_cd", getValue(subBean, KKW03601SFConst.L_PRC_GRP_CD_KK0081_01));						// 料金グループコード
				childMap.put("l_svc_kei_ucwk_no", getValue(subBean, KKW03601SFConst.L_SVC_KEI_KAISEN_UCWK_NO_KK0241_01));	// サービス契約回線内訳番号
/* ++++++++++ v8.00.00 追加開始 ++++++++++ */
				childMap.put("svc_kei_stat", getValue(subBean, KKW03601SFConst.L_SVC_KEI_STAT_01));							// サービス契約ステータス
/* ++++++++++ v8.00.00 追加終了 ++++++++++ */

				// ANK-2273-00-00 ADD START
				mtSeikyNo = getValue(subBean, KKW03601SFConst.L_MT_SEIKY_KEI_NO_01);	// 併合元＿請求契約番号
				// ANK-2273-00-00 ADD END

				// ANK-2250-00-00 ADD START
				// 併合元＿サービス契約番号
				childMap.put("svc_kei_no", getValue(subBean, KKW03601SFConst.L_SVC_KEI_NO_01));
				// ANK-2250-00-00 ADD END

				svcKeiList.add(childMap);
			}
		}
		
		// サービス契約リスト → サービス契約お客様変更マップ.サービス契約リスト
		parentMap.put("svc_kei_list", svcKeiList);

		// ANK-2273-00-00 ADD START
		// 併合元＿請求契約番号
		parentMap.put("mt_seiky_kei_no", mtSeikyNo);
		// ANK-2273-00-00 ADD END
		
		outputMap.put("KKSV035903CC", parentMap);
						
		return outputMap;
	}
	
	/**
	 * 上りマッピングをする
	 * @param bean　[0]：契約紐付変更登録
	 * @param outputMap
	 * @param func_code　機能コード
	 */
	@SuppressWarnings("unchecked")
	public HashMap setKKSV035904SC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code)
	{
		if(isNull(bean))
		{
			return null;
		}
		
		if(bean.length != 1)
		{
			return null;
		}
		
		HashMap<String, Object> parentMap = new HashMap<String, Object>();
		
		// 共通情報のマッピング
		parentMap.put("func_code", func_code);
		
		// 2016/08/08 ANK-2661-00-00 ADD START
		// 運用日 → 契約紐付更新登録チェックマップ.ＫＥＹ＿予約適用年月日
		// 運用日＜予約適用年月日という条件に合わせるため、運用日＋1日
		parentMap.put("key_rsv_aply_ymd", JPCDateUtil.addDay(getValue(bean[0], KKW03601SFConst.OPE_DATE), 1));
		// 2016/08/08 ANK-2661-00-00 ADD END
		
		// 併合元＿ＳＹＳＩＤ → 契約紐付更新登録チェックマップ.ＫＥＹ＿ＳＹＳＩＤ
		parentMap.put("key_sysid", getValue(bean[0], KKW03601SFConst.MT_SYSID));
		
		// 2016/08/08 ANK-2661-00-00 MOD START
//		// OM-2014-0002722 ADD START
//		// "00"(未反映) , "03"(予約手続中)→ 契約紐付更新登録チェックマップ.ＫＥＹ＿異動予約状態コード
//		parentMap.put("key_ido_rsv_stat_cd", JKKFamiilyPackConst.CD01168_00 + "," + JKKFamiilyPackConst.CD01168_03);
//		// OM-2014-0002722 ADD END
		// "00"(未反映) , "03"(予約手続中) , "04"(異動予約対象外)→ 契約紐付更新登録チェックマップ.ＫＥＹ＿異動予約状態コード
		parentMap.put("key_ido_rsv_stat_cd", JKKFamiilyPackConst.CD01168_00 + "," + JKKFamiilyPackConst.CD01168_03 + ","  + JKKFamiilyPackConst.CD01168_04);
		// 2016/08/08 ANK-2661-00-00 MOD END
		
		outputMap.put("KKSV035904SC", parentMap);
						
		return outputMap;
	}
	
	/**
	 * 上りマッピングをする
	 * @param bean　[0]：契約紐付変更登録
	 * @param outputMap
	 * @param func_code　機能コード
	 */
	@SuppressWarnings("unchecked")
	public HashMap setKKSV035905SC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code)
	{
		if(isNull(bean))
		{
			return null;
		}
		
		if(bean.length != 1)
		{
			return null;
		}
		
		HashMap<String, Object> parentMap = new HashMap<String, Object>();
		
		// 共通情報のマッピング
		parentMap.put("func_code", func_code);
		
		// 2016/08/08 ANK-2661-00-00 ADD START
		// 運用日 → 契約紐付更新登録チェックマップ.ＫＥＹ＿予約適用年月日
		// 運用日＜予約適用年月日という条件に合わせるため、運用日＋1日
		parentMap.put("key_rsv_aply_ymd", JPCDateUtil.addDay(getValue(bean[0], KKW03601SFConst.OPE_DATE), 1));
		// 2016/08/08 ANK-2661-00-00 ADD END
		
		// SYSID退避 → 契約紐付更新登録チェックマップ.ＫＥＹ＿ＳＹＳＩＤ
		parentMap.put("key_sysid", getValue(bean[0], KKW03601SFConst.BK_SK_SYSID));
		
		// 2016/08/08 ANK-2661-00-00 MOD START
//		// OM-2014-0002722 ADD START
//		// "00"(未反映) , "03"(予約手続中) → 契約紐付更新登録チェックマップ.ＫＥＹ＿異動予約状態コード
//		parentMap.put("key_ido_rsv_stat_cd", JKKFamiilyPackConst.CD01168_00 + "," + JKKFamiilyPackConst.CD01168_03);
//		// OM-2014-0002722 ADD END
		// "00"(未反映) , "03"(予約手続中) , "04"(異動予約対象外)→ 契約紐付更新登録チェックマップ.ＫＥＹ＿異動予約状態コード
		parentMap.put("key_ido_rsv_stat_cd", JKKFamiilyPackConst.CD01168_00 + "," + JKKFamiilyPackConst.CD01168_03 + ","  + JKKFamiilyPackConst.CD01168_04);
		// 2016/08/08 ANK-2661-00-00 MOD END
		
		outputMap.put("KKSV035905SC", parentMap);
						
		return outputMap;
	}
	
	/* ++++++++++ v4.00.00 追加開始 ++++++++++ */
	/**
	 * 上りマッピングをする
	 * @param bean　[0]：お客様情報登録
	 * @param outputMap
	 * @param func_code　機能コード
	 * 
	 * @return outputMap ワーニングフラグ
	 */
	@SuppressWarnings("unchecked")
	public HashMap setCustKapInfoChkCC(X31SDataBeanAccess[] bean, HashMap outputMap, String func_code) {
		
		if(bean == null){
			return null;
		}
		
		if(bean.length != 1){
			return null;
		}
		
		HashMap<String, Object> parentMap = new HashMap<String, Object>();
		
		// 共通情報のマッピング
		parentMap.put("func_code", func_code);
		
		// 併合元＿ＳＹＳＩＤ → ＫＥＹ＿SYSID
		parentMap.put("key_sysid", getValue(bean[0], KKW03601SFConst.MT_SYSID));
		// 運用日 → ＫＥＹ＿予約適用年月日
		parentMap.put("key_rsv_aply_ymd", getValue(bean[0], KKW03601SFConst.OPE_DATE));
		
		// 選択サービス契約
		X31SDataBeanAccessArray list2 = bean[0].getDataBeanArray(KKW03601SFConst.SVC_KEI_INFO_LIST2);
		X31SDataBeanAccess subBean = null;
		HashMap childMap = null;
		ArrayList svcKeiList = new ArrayList();
		
		for(int i=0; i<list2.getCount(); i++)
		{
			subBean = list2.getDataBean(i);
			
			childMap = new HashMap<String, String>();
			
			// 共通情報のマッピング
			childMap.put("func_code", func_code);
			
			// サービス契約番号
			childMap.put("key_svc_kei_no", getValue(subBean, KKW03601SFConst.L_SVC_KEI_NO_02));
			
			svcKeiList.add(childMap);
		}
		
		parentMap.put("svc_kei_list", svcKeiList);
		
		outputMap.put("CustKapInfoChkCC", parentMap);
		
		return outputMap;
	}
	/* ++++++++++ v4.00.00 追加終了 ++++++++++ */
	
	/**
	 * 上りマッピングをする
	 * @param bean　[0]：契約紐付変更登録
	 * @param outputMap
	 */
	@SuppressWarnings("unchecked")
	public void setKKSV0359WORK01(X31SDataBeanAccess[] bean, HashMap outputMap)
	{
		HashMap<String, Object> parentMap = new HashMap<String, Object>();
		
		// 請求先同時併合が選択されている場合
		if(bean[0].sendMessageBoolean(KKW03601SFConst.SEIKY_DOJI_HEIGO, X31CWebConst.DATABEAN_GET_VALUE)){
			parentMap.put("seiky_doji_heigo", "ON");
		}
		else
		{
			parentMap.put("seiky_doji_heigo", "");
		}
		
		outputMap.put("KKSV0359WORK01", parentMap);
	}
	
	/**
	 * 下りマッピング
	 * @param bean　[0]：契約紐付変更登録
	 * @param outputMap
	 */
	@SuppressWarnings("unchecked")
	public X31SDataBeanAccess[] getKKSV035904SC(X31SDataBeanAccess[] bean, HashMap outputMap) {
		
		// ANK-2661-00-00 2016/08/05 MOD START
		// // 予約データ有無フラグの取得
		// String rsvUmFlg = getValue(bean[0], KKW03601SFConst.RSV_UM_FLG);
		// お客様併合元予約有無フラグの取得
		String rsvUmFlg = getValue(bean[0], KKW03601SFConst.CUST_HEIGO_MT_RSV_UM_FLG);
		// ANK-2661-00-00 2016/08/05 MOD END
		
		HashMap parentMap = null;
		if(outputMap.containsKey("KKSV035904SC"))
		{
			parentMap = (HashMap)outputMap.get("KKSV035904SC");
		}
		
		// 予約データ有無判定
		if(hasRsvData(parentMap, getValue(bean[0], KKW03601SFConst.TSTA)))
		{
			rsvUmFlg = "1";
		}
		else
		{
			rsvUmFlg = "0";
		}

		// ANK-2661-00-00 2016/08/05 MOD START
		// // 予約データ有無フラグ ← 予約データ有無判定結果
		// setValue(bean[0], KKW03601SFConst.RSV_UM_FLG, rsvUmFlg);
		// お客様併合元予約有無フラグ ← 予約データ有無判定結果
		setValue(bean[0], KKW03601SFConst.CUST_HEIGO_MT_RSV_UM_FLG, rsvUmFlg);
		// ANK-2661-00-00 2016/08/05 MOD END
		
		return bean;
	}
	
	/**
	 * 下りマッピング
	 * @param bean　[0]：契約紐付変更登録
	 * @param outputMap
	 */
	@SuppressWarnings("unchecked")
	public X31SDataBeanAccess[] getKKSV035905SC(X31SDataBeanAccess[] bean, HashMap outputMap)
	{
		// ANK-2661-00-00 2016/08/05 MOD START
		// // 予約データ有無フラグの取得
		// String rsvUmFlg = getValue(bean[0], KKW03601SFConst.RSV_UM_FLG);
		// お客様併合先予約有無フラグの取得
		String rsvUmFlg = getValue(bean[0], KKW03601SFConst.CUST_HEIGO_SK_RSV_UM_FLG);
		
		// // 予約データが存在する場合は処理を中断
		// if("1".equals(rsvUmFlg))
		// {
		// 	return bean;
		// }
		// ANK-2661-00-00 2016/08/05 MOD END
		
		HashMap parentMap = null;
		if(outputMap.containsKey("KKSV035905SC"))
		{
			parentMap = (HashMap)outputMap.get("KKSV035905SC");
		}
		
		// 予約データ有無判定
		if(hasRsvData(parentMap, getValue(bean[0], KKW03601SFConst.TSTA)))
		{
			rsvUmFlg = "1";
		}
		// ANK-2661-00-00 2016/08/05 MOD START
		else
		{
			rsvUmFlg = "0";
		}
		
		// // 予約データ有無フラグ ← 予約データ有無判定結果
		// setValue(bean[0], KKW03601SFConst.RSV_UM_FLG, rsvUmFlg);
		// お客様併合先予約有無フラグ ← 予約データ有無判定結果
		setValue(bean[0], KKW03601SFConst.CUST_HEIGO_SK_RSV_UM_FLG, rsvUmFlg);
		// ANK-2661-00-00 2016/08/05 MOD END
		
		return bean;
	}
	
	/**
	 * 入力した適用日より未来日の予約データ有無を判定します。
	 * @param parentMap
	 * @param tsta：適用開始日
	 */
	@SuppressWarnings("unchecked")
	private boolean hasRsvData(HashMap parentMap, String tsta)
	{
		ArrayList childList = null;
		
		if(parentMap != null && parentMap.containsKey("EKK1681B001CBSMsg1List"))
		{
			childList = (ArrayList)parentMap.get("EKK1681B001CBSMsg1List");
			
			if(childList != null && childList.size() > 0)
			{
				HashMap childMap = null;
				int iTsta = Integer.parseInt(tsta);
				String sTsta = null;
				for(int i = 0; i < childList.size(); i++)
				{
					 childMap = (HashMap)childList.get(i);
					if (childMap != null)
					{
						// 異動予約情報の予約適用年月日の取得
						sTsta = (String)childMap.get("rsv_aply_ymd");
						if(sTsta != null && sTsta.length() == 8)
						{
							// 未来日の予約データが存在する場合
							if(iTsta < Integer.parseInt(sTsta))
							{
								// 予約データ有
								return true;
							}
						}
					}
				}
			}
		}
		
		return false;
	}
	
	/**
	 * 引数のNULL判定を行います。
	 * @param param
	 * @return 判定結果
	 */
	private boolean isNull(Object param)
	{
		if(param == null)
		{
			return true;
		}
		return false;
	}
	
	/**
	 * データBeanから指定された項目の値を取得します。
	 * <br>
	 * @param bean 画面情報
	 * @param itemName 項目名
	 * <br>
	 * @return String 指定された項目名の値
	 */
	private String getValue(X31SDataBeanAccess bean, String itemName)
	{
		return bean.sendMessageString(itemName, X31CWebConst.DATABEAN_GET_VALUE);
	}
	
	/**
	 * データBeanに指定された項目の値を設定します。
	 * <br>
	 * @param bean 画面情報
	 * @param comboName 項目名
	 * @param value 設定値
	 */
	private void setValue(X31SDataBeanAccess bean, String itemName, String value)
	{
		bean.sendMessageString(itemName, X31CWebConst.DATABEAN_SET_VALUE, value);
	}

	//---------v29.00.00 ANK-3132-00-00 ADD START---------//
	/**
	 * 上りマッピングをする
	 * @param bean　[0]：mineo譲渡可否情報取得
	 * @param outputMap
	 */
	@SuppressWarnings("unchecked")
	public HashMap setMineoJotoKahiGetCC(X31SDataBeanAccess[] bean, HashMap outputMap)
	{
		if(isNull(bean))
		{
			return null;
		}
		
		if(bean.length != 1)
		{
			return null;
		}
		
		HashMap<String, Object> parentMap = new HashMap<String, Object>();
		HashMap<String, String> childMap = null;
		X31SDataBeanAccessArray list = null;
		X31SDataBeanAccess subBean = null;
		ArrayList jotoKahiList = new ArrayList();		// 関連チェック用
		
		// 併合元_SYSID
		String sysID = getValue(bean[0], KKW03601SFConst.MT_SYSID);

		// サービス契約情報一覧リスト
		list = bean[0].getDataBeanArray(KKW03601SFConst.SVC_KEI_INFO_LIST);
		for(int i=0; i<list.getCount(); i++)
		{
			subBean = list.getDataBean(i);
			
			// 併合対象のみ
			if(subBean.sendMessageBoolean(KKW03601SFConst.CHOICE_01, X31CWebConst.DATABEAN_GET_VALUE))
			{
				childMap = new HashMap<String, String>();
				if (JKKCommonConst.PRC_GRP_CD_51.equals(getValue(subBean, KKW03601SFConst.L_PRC_GRP_CD_KK0081_01))){
					childMap.put("key_svc_kei_no", getValue(subBean, KKW03601SFConst.L_SVC_KEI_NO_01));
					childMap.put("key_sysid", sysID);
					jotoKahiList.add(childMap);
				}
			}
		}
		// サービス契約リスト → サービス契約お客様変更マップ.サービス契約リスト
		parentMap.put("joto_kahi_list", jotoKahiList);
		
		outputMap.put("MineoJotoKahiGetCC", parentMap);
						
		return outputMap;
		//---------v29.00.00 ANK-3132-00-00 ADD END-----------//
	}	
}
