/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：KKSV0358_KKSV0358OPDBMapper
*	ソースファイル名：KKSV0358_KKSV0358OPDBMapper.java
*	作成者			：Fujitsu
*	日付			：2011年12月02日
*＜機能概要＞
*	BP（契約紐付変更登録＿検索サービス）へのＤ−Ｂマッピングクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/12/02	Fujitsu		新規作成
*	v4.00.00	2012/11/07	FJ）稲岡	【TAI-2012-0000067】対応
*	v4.01.00	2012/11/28	FJ）稲岡	【IT1-2012-0002055】対応
*										【IT1-2012-0002198】対応
*	v39.00.00	2018/10/30	FJ）大崎	【ANK-3478-00-00】eo光設備卸対応(サービス開始対応)
**********************************************************************/
package eo.web.webview.mapping;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.TreeSet;

import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;

import eo.common.util.JKKStringUtil;
import eo.web.webview.KKW03601SF.KKW03601SFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JCKCommonConst;
import eo.web.webview.common.JKKCommonConst;

/**
 * DataBean-BPマッピングをする。
 * 
 */
public class KKSV0358_KKSV0358OPDBMapper
{
	/**
	 * コンストラクタ
	 */
	public KKSV0358_KKSV0358OPDBMapper(){
	}
	
	/**
	 * 上りマッピングをする
	 * @param bean　[0]：契約紐付変更登録
	 * @param outputMap
	 * @param func_code　機能コード
	 */
	@SuppressWarnings("unchecked")
	public HashMap setKKSV035801SC(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("search_type", String.valueOf("1"));
		parentMap.put("display_num", JCCWebCommon.getSearchConst("CKW00101_ROW_PER_PAGE"));
		parentMap.put("max_search_num", JCCWebCommon.getSearchConst("CKW00101_MAX_SHOW_CNT"));
		
		// 共通情報のマッピング
		parentMap.put("func_code", func_code);
		
		// eoID退避 → お客様情報一覧照会マップ.ＫＥＹ＿eoID
		parentMap.put("key_eoid", getValue(bean[0], KKW03601SFConst.BK_SK_EOID));
		
		outputMap.put("KKSV035801SC", parentMap);
		
		return outputMap;
	}

	/**
	 * 上りマッピングをする
	 * @param bean　[0]：契約紐付変更登録
	 * @param outputMap
	 * @param func_code　機能コード
	 */
	@SuppressWarnings("unchecked")
	public HashMap setKKSV035802SC(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);
		
		// SYSID退避 → お客様一意照会（SYSID）マップ.ＫＥＹ＿SYSID
		parentMap.put("key_sysid", getValue(bean[0], KKW03601SFConst.BK_SK_SYSID));
		// 運用日 → お客様一意照会（SYSID）マップ.ＫＥＹ＿予約適用年月日
		parentMap.put("key_rsv_aply_ymd", getValue(bean[0], KKW03601SFConst.OPE_DATE));
		
		outputMap.put("KKSV035802SC", parentMap);
		
		return outputMap;
	}
	
	/**
	 * 上りマッピングをする
	 * @param bean　[0]：契約紐付変更登録
	 * @param outputMap
	 * @param func_code　機能コード
	 */
	@SuppressWarnings("unchecked")
	public HashMap setKKSV035803SC(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("search_type", String.valueOf("1"));
		parentMap.put("display_num", "100");
		parentMap.put("max_search_num", "2000");
		
		// 共通情報のマッピング
		parentMap.put("func_code", func_code);
		
		// SYSID退避 → サービス契約一覧照会（SYSID）2マップ.ＫＥＹ＿SYSID
		parentMap.put("key_sysid", getValue(bean[0], KKW03601SFConst.BK_SK_SYSID));
		
		outputMap.put("KKSV035803SC", parentMap);
		
		return outputMap;
	}
	
	/**
	 * 上りマッピングをする
	 * @param bean　[0]：契約紐付変更登録
	 * @param outputMap
	 * @param func_code　機能コード
	 */
	@SuppressWarnings("unchecked")
	public HashMap setKKSV035804SC(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);
		
		// 運用日 → 請求契約一意照会マップ.ＫＥＹ＿予約適用年月日
		parentMap.put("key_rsv_aply_ymd", getValue(bean[0], KKW03601SFConst.OPE_DATE));
		
		outputMap.put("KKSV035804SC", parentMap);
		
		return outputMap;
	}
	
	/**
	 * 上りマッピングをする
	 * @param bean　[0]：契約紐付変更登録
	 * @param outputMap
	 * @param func_code　機能コード
	 */
	@SuppressWarnings("unchecked")
	public HashMap setKKSV0358WORK01(X31SDataBeanAccess[] bean, 	HashMap<String, Object> outputMap) {
		
		if(isNull(bean))
		{
			return null;
		}
		
		if(bean.length != 1)
		{
			return null;
		}
		
		HashMap<String, Object> parentMap = new HashMap<String, Object>();
		
		// SYSID退避 → 契約紐付変更登録_検索サービス作業項目マップ01マップ.併合先＿SYSID
		parentMap.put("sk_sysid", getValue(bean[0], KKW03601SFConst.BK_SK_SYSID));
		
		outputMap.put("KKSV0358WORK01", parentMap);
		
		return outputMap;
	}
	
	/**
	 * 下りマッピング
	 * @param bean　[0]：契約紐付変更登録
	 * @param outputMap
	 */
	@SuppressWarnings("unchecked")
	public X31SDataBeanAccess[] getKKSV035801SC(X31SDataBeanAccess[] bean, HashMap outputMap)
	{
		
		HashMap parentMap = null;
		if(outputMap.containsKey("KKSV035801SC"))
		{
			parentMap = (HashMap)outputMap.get("KKSV035801SC");
		}
		
		ArrayList childList = null;
		
		if(!isNull(parentMap) && parentMap.containsKey("ECK0011B002CBSMsg1List"))
		{
			childList = (ArrayList)parentMap.get("ECK0011B002CBSMsg1List");
			
			HashMap childMap = (HashMap)childList.get(0);
			
			if (!isNull(childMap))
			{
				// SYSID退避 ← お客様情報一覧照会マップ.お客様情報一覧照会明細.SYSID
				setValue(bean[0], KKW03601SFConst.BK_SK_SYSID, (String)childMap.get("sk_sysid"));
				// 併合先＿お客様ステータス ← お客様情報一覧照会マップ.お客様情報一覧照会明細.お客様ステータス
				setValue(bean[0], KKW03601SFConst.SK_CUST_STAT, (String)childMap.get("cust_stat"));
			}
		}
		
		return bean;
	}
	
	/**
	 * 下りマッピング
	 * @param bean　[0]：契約紐付変更登録
	 * @param outputMap
	 */
	@SuppressWarnings("unchecked")
	public X31SDataBeanAccess[] getKKSV035802SC(X31SDataBeanAccess[] bean, HashMap outputMap)
	{
		HashMap parentMap = null;
		if(outputMap.containsKey("KKSV035802SC"))
		{
			parentMap = (HashMap)outputMap.get("KKSV035802SC");
		}
		
		ArrayList childList = null;
		
		childList = null;
		if(!isNull(parentMap) && parentMap.containsKey("ECK0011A010CBSMsg1List"))
		{
			childList = (ArrayList)parentMap.get("ECK0011A010CBSMsg1List");
			
			if(!isNull(childList) && childList.size() > 0)
			{
			
				HashMap childMap = (HashMap)childList.get(0);
				
				if (!isNull(childMap))
				{
					// 併合先＿お客様ステータス ← お客様一意照会（SYSID）マップ.お客様一意照会明細.お客様ステータス
					setValue(bean[0], KKW03601SFConst.SK_CUST_STAT, (String)childMap.get("cust_stat"));
					// 併合先＿契約者タイプ ← お客様一意照会（SYSID）マップ.お客様一意照会明細.契約者タイプコード
					setValue(bean[0], KKW03601SFConst.SK_KEISHA_TYPE_CD, (String)childMap.get("keisha_type_cd"));
					// 併合先＿会員種別コード ← お客様一意照会（SYSID）マップ.お客様一意照会明細.会員種別コード
					setValue(bean[0], KKW03601SFConst.SK_MEMBER_SBT_CD, (String)childMap.get("member_sbt_cd"));
					// 併合先＿お客様名 ← お客様一意照会（SYSID）マップ.お客様一意照会明細.お客様名
					setValue(bean[0], KKW03601SFConst.SK_CUST_NM, (String)childMap.get("cust_nm"));
					// 併合先＿お客様カナ名 ← お客様一意照会（SYSID）マップ.お客様一意照会明細.お客様カナ名
					setValue(bean[0], KKW03601SFConst.SK_CUST_KANA, (String)childMap.get("cust_kana"));
					// 併合先＿部屋番号 ← お客様一意照会（SYSID）マップ.お客様一意照会明細.契約者住所補記・部屋番号
					setValue(bean[0], KKW03601SFConst.SK_ADRRM, (String)childMap.get("keisha_adrrm"));
					// 併合先＿更新年月日時分秒 ← お客様一意照会（SYSID）マップ.お客様一意照会明細.契約者住所補記・最終更新年月日時分秒
					setValue(bean[0], KKW03601SFConst.SK_UPD_DTM, (String)childMap.get("last_upd_dtm"));
					// eoID退避 ← お客様一意照会（SYSID）マップ.お客様一意照会明細.eoID
					setValue(bean[0], KKW03601SFConst.BK_SK_EOID, (String)childMap.get("eoid"));
					// 検索＿併合先＿ＳＹＳＩＤ ← お客様一意照会（SYSID）マップ.お客様一意照会明細.併合先SYSID
					setValue(bean[0], KKW03601SFConst.SH_SK_SYSID, (String)childMap.get("sk_sysid"));
					// 検索＿併合先＿ｅｏＩＤ ← お客様一意照会（SYSID）マップ.お客様一意照会明細.eoID
					setValue(bean[0], KKW03601SFConst.SH_SK_EOID, (String)childMap.get("eoid"));
// ANK-3478-00-00 ADD START 
					// 併合先＿パートナー会員フラグ ← パートナー会員判定結果
					setValue(bean[0], KKW03601SFConst.SK_PTNR_MEMBER_FLG,
							setPtnrMemberFlg((String)childMap.get("member_sbt_cd"), (String)childMap.get("orsjgs_cd")));
// ANK-3478-00-00 ADD END 
				}
			}
		}
		
		return bean;
	}
	
	/* ++++++++++ v4.01.00 修正開始 ++++++++++ */
	/**
	 * 下りマッピング
	 * @param bean　[0]：契約紐付変更登録
	 * @param outputMap
	 */
	@SuppressWarnings("unchecked")
	public X31SDataBeanAccess[] getKKSV035803SC(X31SDataBeanAccess[] bean, HashMap outputMap)
	{
		HashMap parentMap = null;
		if(outputMap.containsKey("KKSV035803SC"))
		{
			parentMap = (HashMap)outputMap.get("KKSV035803SC");
		}
		
		ArrayList childList = null;
		
		// 複数請求契約判定フラグ
		boolean hukusuSeikyKeiFlg = false;
		
		String skSeikyKeiNo = "";
		
		if(!isNull(parentMap) && parentMap.containsKey("EKK0081B004CBSMsg1List"))
		{
			childList = (ArrayList)parentMap.get("EKK0081B004CBSMsg1List");
			
			if(!isNull(childList) && childList.size() > 0)
			{
				HashMap childMap = null;
				TreeSet treeSet = null;
				boolean exeflg = true;
				
				// 併合先契約者がネット契約している場合
				if(hasNetKei(childList))
				{
					// 併合先＿ネット契約有無フラグを有に設定
					setValue(bean[0], KKW03601SFConst.SK_NET_KEI_UM_FLG, "1");
				}
				
				for(int i=0; i<childList.size(); i++)
				{
					childMap = (HashMap)childList.get(i);
					if (!isNull(childMap))
					{
						// 併合先＿請求契約番号
						skSeikyKeiNo = (String)childMap.get("seiky_kei_no");
						
						// i=0
						if(exeflg)
						{
							treeSet = new TreeSet();
							treeSet.add(skSeikyKeiNo);
							exeflg = false;
						}
						// i=1 以降
						else
						{
							// 請求契約番号が複数存在する場合
							if(!treeSet.contains(skSeikyKeiNo))
							{
								// 併合先＿請求契約数判定フラグ
								hukusuSeikyKeiFlg = true;
								
								// 請求契約番号を空文字で設定
								skSeikyKeiNo = "";
								
								break;
							}
						}
					}
				}
			}
		}
		
		// 併合先＿請求契約番号 ← サービス契約一覧照会（SYSID）2マップ.サービス契約一覧照会（SYSID）2明細.請求契約番号
		setValue(bean[0], KKW03601SFConst.SK_SEIKY_KEI_NO, skSeikyKeiNo);
		
		// 併合先＿請求契約数が２レコード以上
		if(hukusuSeikyKeiFlg)
		{
			// 請求先同時併合を未選択
			bean[0].sendMessageBoolean(KKW03601SFConst.SEIKY_DOJI_HEIGO, X31CWebConst.DATABEAN_SET_VALUE, false);
			
			// 請求契約者を"複数あり"で設定
			setValue(bean[0], KKW03601SFConst.SK_SEIKY_KSH_NM, "複数あり");
			
			setValue(bean[0], KKW03601SFConst.RESULT_UM_FLG, "2");
		}
		else
		{
			setValue(bean[0], KKW03601SFConst.RESULT_UM_FLG, "1");
		}
		
		return bean;
	}
	/* ++++++++++ v4.01.00 修正終了 ++++++++++ */
	
	/**
	 * 下りマッピング
	 * @param bean　[0]：契約紐付変更登録
	 * @param outputMap
	 */
	@SuppressWarnings("unchecked")
	public X31SDataBeanAccess[] getKKSV035804SC(X31SDataBeanAccess[] bean, HashMap outputMap)
	{
		HashMap parentMap = null;
		if(outputMap.containsKey("KKSV035804SC"))
		{
			parentMap = (HashMap)outputMap.get("KKSV035804SC");
		}
		
		ArrayList childList = null;
		
		if(!isNull(parentMap) && parentMap.containsKey("EKK0491A010CBSMsg1List"))
		{
			childList = (ArrayList)parentMap.get("EKK0491A010CBSMsg1List");
			
			// 検索結果がある場合
			if(!isNull(childList) && childList.size() == 1)
			{
				HashMap childMap = (HashMap)childList.get(0);
				
				if (!isNull(childMap))
				{
					// 併合先＿請求契約者名 ← 請求契約一意照会マップ.請求契約一意照会明細.送付先名
					setValue(bean[0], KKW03601SFConst.SK_SEIKY_KSH_NM, (String)childMap.get("sohus_nm"));
					
					// 併合先請求書発行要否 ← 請求契約一意照会マップ.請求契約一意照会明細.併合先請求書発行要否
					setValue(bean[0], KKW03601SFConst.SK_SEIKYUS_HAKKO_YH, (String)childMap.get("seikyus_hakko_yh"));
					
					// 併合先＿請求契約更新年月日時分秒 ← 請求契約一意照会マップ.請求契約一意照会明細.最終更新年月日時分秒
					setValue(bean[0], KKW03601SFConst.SK_SEIKY_UPD_DTM, (String)childMap.get("last_upd_dtm"));
				}
			}
		}
		
		return bean;
	}
	
	/* ++++++++++ v4.01.00 追加開始 ++++++++++ */
	/**
	 * インターネットサービス契約有無判定を行います。
	 * <br>
	 * @param param
	 * @return 判定結果
	 */
	@SuppressWarnings("unchecked")
	private boolean hasNetKei(ArrayList childList)
	{
		HashMap childMap = null;
		for(int i=0; i<childList.size(); i++)
		{
			childMap = (HashMap)childList.get(i);
			if (!isNull(childMap))
			{
				// 併合先＿サービスコードが「インターネットサービス」の場合
				if(JKKCommonConst.SVC_CD_NET.equals((String)childMap.get("svc_cd")))
				{
					return true;
				}
			}
		}
		return false;
	}
	/* ++++++++++ v4.01.00 修正終了 ++++++++++ */
	
	/**
	 * 引数のNULL判定を行います。
	 * <br>
	 * @param param
	 * @return 判定結果
	 */
	private boolean isNull(Object param)
	{
		if(param == null)
		{
			return true;
		}
		return false;
	}
	
	/**
	 * データBeanから指定された項目の値を取得します。
	 * <br>
	 * @param bean 画面情報
	 * @param comboName コンボボックス名称
	 * <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);
	}
	
// ANK-3478-00-00 ADD START 
	/**
	 * パートナー会員か判定します。
	 * <br>
	 * @param	memberSbtCd	会員種別コード
	 * @param	orsjgsCd	卸先事業者コード
	 * @return	boolean		判定結果
	 */
	private String setPtnrMemberFlg(String memberSbtCd, String orsjgsCd)
	{
		if(JCKCommonConst.CD00039_MASTER_KOJIN.equals(memberSbtCd)
				&& !JKKStringUtil.isNullEmpty(orsjgsCd))
		{
			return "1";
		}
		
		return "0";
	}
	
// ANK-3478-00-00 ADD END 
}
