/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：問合せモニタ詳細ビューロジック
*   ソースファイル名：CRW05002SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年09月09日
*＜機能概要＞
*   問合せモニタ詳細画面のビューロジックです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/09/09   FJ）        新規作成
*
**********************************************************************/

package eo.web.webview.CRW10601SF;

import java.util.ArrayList;
import java.util.EventObject;
import java.util.HashMap;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.fujitsu.futurity.web.x31.X31CID;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;
import com.fujitsu.futurity.web.x33.X33SException;

import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JCRScreenConst;
import eo.web.webview.common.JCRWebCommon;
import eo.web.webview.common.JKKCommonConst;
import eo.web.webview.common.JKKScreenConst;

/**
 * ワンストップ業務選択メニュー画面ビューロジック.<p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class CRW10601SFLogic extends JCCWebBusinessLogic
{
	/**
	 * セッション格納キー
	 */
	private static final String SESSION_KEY = "CRW10601_SESSION_KEY";

	/**
	 * 画面種別：顧客契約
	 */
	private static final String SCREEN_KIND_KK = "KK";
	
	/**
	 * 権限フラグ
	 */
	private static final String AUTHORITY_FLG_ON = "1";
	
	/**
	 * ポップアップモード
	 */
	private static final String POPUP_MODE_OFF = "0";

	/**
	 * 処理区分
	 */
	private static final String TRAN_DIV_CHGE = "更新";
	private static final String TRAN_DIV_DSL = "解約";

	/** ワンストップメニュー設定ファイルの位置 */
	private static final String ONE_STOP_MENU_FILE_PATH = "CR_ONE_STOP_MENU_TEIGI_FILE_PATH";
	/** ワンストップメニュー設定ファイルの要素：分類 */
	private static final String ONE_STOP_MENU_FILE_ELEM_BNRI = "bunrui";
	/** ワンストップメニュー設定ファイルの要素：ワンストップメニュー */
	private static final String ONE_STOP_MENU_FILE_ELEM_OSMENU = "oneStopMenu";

	/** ワンストップメニュー設定ファイルの属性：表示名 */
	private static final String ONE_STOP_MENU_FILE_ATTR_DSP_NM = "dspNm";
	/** ワンストップメニュー設定ファイルの属性：eoブランドコード */
	private static final String ONE_STOP_MENU_FILE_ATTR_EO_BRAND_CD = "eoBrandCd";
	/** ワンストップメニュー設定ファイルの属性：画面ID */
	private static final String ONE_STOP_MENU_FILE_ATTR_SCREEN_ID = "screenId";
	/** ワンストップメニュー設定ファイルの属性：画面名 */
	private static final String ONE_STOP_MENU_FILE_ATTR_SCREEN_NM = "screenNm";
	/** ワンストップメニュー設定ファイルの属性：画面種別 */
	private static final String ONE_STOP_MENU_FILE_ATTR_SCREEN_KIND = "screenKind";
	/** ワンストップメニュー設定ファイルの属性：権限 */
	private static final String ONE_STOP_MENU_FILE_ATTR_AUTHORITY = "authority";
	/** ワンストップメニュー設定ファイルの属性：パラメータ1 */
	private static final String ONE_STOP_MENU_FILE_ATTR_PARAM1 = "param1";
	/** ワンストップメニュー設定ファイルの属性：パラメータ2 */
	private static final String ONE_STOP_MENU_FILE_ATTR_PARAM2 = "param2";
	/** ワンストップメニュー設定ファイルの属性：パラメータ3 */
	private static final String ONE_STOP_MENU_FILE_ATTR_PARAM3 = "param3";

	/**
	 * 親クラスX31BWebBusinessLogicのreceiveMessageWebを
	 * オーバーライドして自動生成されたメソッドです。
	 * @param arg0 (I) イベント情報
	 * @param arg1 (I) WebFWでは使用しません
	 * @param arg2 (I) WebFWでは使用しません
	 * @return 処理結果（true:正常終了、false:エラー）
	 * @throws X33SException X33SException
	 */
	@Override
	protected boolean receiveMessageWeb(X31CID arg0, Object arg1,
			EventObject arg2) throws X33SException
	{
		return false;
	}

	/**
	 * 初期表示処理.<br>
	 * 初期表示を行う。
	 * 
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean init() throws Exception
	{

		// サービスフォームBeanの内容の取得
		X31SDataBeanAccess bean = getServiceFormBean();

		// 共通フォームBeanの内容を取得
		X31SDataBeanAccess commoninfoBean = getCommonInfoBean();

		// (1)引継情報の取得
		// (a)画面情報取得部品（JCCWebCommon.getScreenInfo)を使用し、引継情報を取得する。
		JCRWebCommon.getScreenInfo(this);

		// (2)サービスフォームBeanの設定

		// 遷移元画面ID取得
		String fromScreenId = JCRWebCommon.getScreenId(this, JCRScreenConst.SCREEN_ID_CRW10601);
		// 遷移元画面がCRW02701(顧客サービス契約詳細画面)の場合
		if (JCRScreenConst.SCREEN_ID_CRW02701.equals(fromScreenId))
		{
			// (a)セッションへ格納するための引継情報(sessoinMap)を作成する。
			HashMap<String, Object> sessionMap = new HashMap<String, Object>();

			// SYSID
			sessionMap.put(CRW10601SFConst.SYSID,
					bean.sendMessageString(CRW10601SFConst.SYSID, X31CWebConst.DATABEAN_GET_VALUE));
			// サービス契約番号
			sessionMap.put(CRW10601SFConst.SVC_KEI_NO,
					bean.sendMessageString(CRW10601SFConst.SVC_KEI_NO, X31CWebConst.DATABEAN_GET_VALUE));
			// eoブランドコード
			sessionMap.put(CRW10601SFConst.EO_BRAND_CD,
					bean.sendMessageString(CRW10601SFConst.EO_BRAND_CD, X31CWebConst.DATABEAN_GET_VALUE));

			// (b)セッションへ引継情報を格納する。
			this.setSessionObject(SESSION_KEY, sessionMap);
			
			// 遷移元画面クリア
			JCRWebCommon.setScreenId(this, JCRScreenConst.SCREEN_ID_CRW10601, "");
		}
		else
		{
			// (c)セッションより引継情報を取得する。
			HashMap<String, Object> sessionMap = (HashMap<String, Object>)this.getSessionObject(SESSION_KEY);
			
			// (d)セッションより取得した引継情報をサービスフォームBeanに設定する。
			if (sessionMap != null)
			{
				HashMap<String, Object> lstMap = (HashMap<String, Object>)sessionMap.get(true);
				if (lstMap != null)
				{
					// SYSID設定
					if (lstMap.containsKey(CRW10601SFConst.SYSID))
					{
						bean.sendMessageString(CRW10601SFConst.SYSID, X31CWebConst.DATABEAN_SET_VALUE,
								(String)lstMap.get(CRW10601SFConst.SYSID));
					}
					// サービス契約番号設定
					if (lstMap.containsKey(CRW10601SFConst.SVC_KEI_NO))
					{
						bean.sendMessageString(CRW10601SFConst.SVC_KEI_NO, X31CWebConst.DATABEAN_SET_VALUE,
								(String)lstMap.get(CRW10601SFConst.SVC_KEI_NO));
					}
					// eoブランドコード設定
					if (lstMap.containsKey(CRW10601SFConst.EO_BRAND_CD))
					{
						bean.sendMessageString(CRW10601SFConst.EO_BRAND_CD, X31CWebConst.DATABEAN_SET_VALUE,
								(String)lstMap.get(CRW10601SFConst.EO_BRAND_CD));
					}
				}
			}
		}

		// (e)ワンストップメニュー定義ファイル読み込み
		loadOneStopMenu(bean);

		// (3)サービス呼出処理
		// なし。

		// (4)サービス処理結果の設定
		// なし。

		// (5)引継情報の設定
		// なし。

		// (6)共有フォームビーンの設定
		// 遷移先画面ID、名称の設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID
				, X31CWebConst.DATABEAN_SET_VALUE, JCRScreenConst.SCREEN_ID_CRW10601);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME
				, X31CWebConst.DATABEAN_SET_VALUE, JCRScreenConst.SCREEN_NAME_CRW10601);

		return true;
	}

	/**
	 * ワンストップメニューリンク押下
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean clickLinkOneStopMenu() throws Exception
	{
		// サービスフォームBeanの内容の取得
		X31SDataBeanAccess bean = getServiceFormBean();

		// 共通フォームBeanの内容を取得
		X31SDataBeanAccess commoninfoBean = getCommonInfoBean();

		// (1)引継情報の設定
		// なし。
		
		// (2)サービスフォームBeanの設定
		// なし。

		// (3)サービス呼出し処理
		// なし。

		// (4)サービス処理結果の設定
		// なし。

		// (5)引継情報の設定

		// 選択されたワンストップメニューに紐づく画面IDおよび画面名を取得
		String slctScreenId = bean.sendMessageString(CRW10601SFConst.SLCT_SCREEN_ID, X31CWebConst.DATABEAN_GET_VALUE);
		String slctScreenNm = bean.sendMessageString(CRW10601SFConst.SLCT_SCREEN_NM, X31CWebConst.DATABEAN_GET_VALUE);
		
		//(a)次画面への引継情報(dataMap)を作成する。
		HashMap<String, Object> dataMap = getHktgiDataMap(bean);

		// (b)画面情報設定部品（JCCWebCommon.setScreenInfo)を使用し、次画面への引継情報を設定する。
		// 次画面に渡す情報を設定
		JCCWebCommon.setScreenInfo(this, slctScreenId, dataMap);
		
		// (c)戻り先画面ID設定（JCCWebCommon.setScreenId)を使用し、次画面への引継情報を設定する。
		// 次画面に自画面の画面IDを設定
		JCRWebCommon.setScreenId(this, slctScreenId, JCRScreenConst.SCREEN_ID_CRW10601);
		
		// (6)共有フォームビーンの設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, slctScreenId);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, slctScreenNm);

		return true;
	}
	
	/**
	 * 定義ファイルからワンストップメニュー情報を取得します。
	 * <BR>
	 * @param bean サービスフォームBean
	 * @throws Exception
	 */
	private void loadOneStopMenu(X31SDataBeanAccess bean) throws Exception 
	{
		// 定義ファイル読み込み
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = dbf.newDocumentBuilder();
		String menuFilePath = JCCWebCommon.getApplicationConst(ONE_STOP_MENU_FILE_PATH);
		org.w3c.dom.Document root = builder.parse(menuFilePath);

		// eoブランドコード取得
		String eoBrandCdParam = bean.sendMessageString(CRW10601SFConst.EO_BRAND_CD, X31CWebConst.DATABEAN_GET_VALUE);
		
		// 分類ノードリスト取得
		NodeList bnriNodeList = root.getElementsByTagName(ONE_STOP_MENU_FILE_ELEM_BNRI);
		// 分類リスト取得
		X31SDataBeanAccessArray bnriList = bean.getDataBeanArray(CRW10601SFConst.BUNRUI_LIST);

		// 分類ノードリスト設定
		for (int i = 0; i < bnriNodeList.getLength(); i++) 
		{
			// 分類要素取得
			Element bnriElem = (Element)bnriNodeList.item(i);
			// 表示名取得
			String dpsNmBnri = getAttributeValue(bnriElem.getAttributes(), ONE_STOP_MENU_FILE_ATTR_DSP_NM);
			// eoブランドコード取得
			String eoBrandCd = getAttributeValue(bnriElem.getAttributes(), ONE_STOP_MENU_FILE_ATTR_EO_BRAND_CD);
			
			// eoブランドコードチェック
			if (!"".equals(eoBrandCd) && !eoBrandCdParam.equals(eoBrandCd))
			{
				continue;
			}

			// 分類リスト追加
			X31SDataBeanAccess bnriBean = bnriList.addDataBean();
			// 表示名設定
			bnriBean.sendMessageString(CRW10601SFConst.L0_DSP_NM_01, X31CWebConst.DATABEAN_SET_VALUE, dpsNmBnri);
			// eoブランドコード設定
			bnriBean.sendMessageString(CRW10601SFConst.L0_EO_BREAND_CD_01, X31CWebConst.DATABEAN_SET_VALUE, eoBrandCd);

			// ワンストップメニューノードリスト取得
			NodeList osmenuNodeList = bnriElem.getElementsByTagName(ONE_STOP_MENU_FILE_ELEM_OSMENU);
			// ワンストップメニューリスト取得
			X31SDataBeanAccessArray osmenuList = bnriBean.getDataBeanArray(CRW10601SFConst.ONE_STOP_MENU_LIST);

			// ワンストップメニューノードリスト設定
			for (int j = 0; j < osmenuNodeList.getLength(); j++) 
			{
				// ワンストップメニュー要素取得
				Element osmenuElem = (Element)osmenuNodeList.item(j);
				// 表示名取得
				String dspNmOsmenu = getAttributeValue(osmenuElem.getAttributes(), ONE_STOP_MENU_FILE_ATTR_DSP_NM);
				// 画面ID取得
				String screenId = getAttributeValue(osmenuElem.getAttributes(), ONE_STOP_MENU_FILE_ATTR_SCREEN_ID);
				// 画面名取得
				String screenNm = getAttributeValue(osmenuElem.getAttributes(), ONE_STOP_MENU_FILE_ATTR_SCREEN_NM); 
				// 画面種別取得
				String screenKind = getAttributeValue(osmenuElem.getAttributes(), ONE_STOP_MENU_FILE_ATTR_SCREEN_KIND); 
				// 権限取得
				String authority = getAttributeValue(osmenuElem.getAttributes(), ONE_STOP_MENU_FILE_ATTR_AUTHORITY); 
				// パラメータ1取得
				String param1 = getAttributeValue(osmenuElem.getAttributes(), ONE_STOP_MENU_FILE_ATTR_PARAM1); 
				// パラメータ2取得
				String param2 = getAttributeValue(osmenuElem.getAttributes(), ONE_STOP_MENU_FILE_ATTR_PARAM2); 
				// パラメータ3取得
				String param3 = getAttributeValue(osmenuElem.getAttributes(), ONE_STOP_MENU_FILE_ATTR_PARAM3); 
				
				// (f)権限制御の権限判定部品を使用し、ワンストップメニューを表示する権限があるかどうかを判定
				if (JCRWebCommon.existAuthority(this, authority) && !JCRWebCommon.checkAuthority(this, authority))
				{
					continue;
				}

				// ワンストップメニューリスト追加
				X31SDataBeanAccess osmenuBean = osmenuList.addDataBean();
				// 表示名設定
				osmenuBean.sendMessageString(CRW10601SFConst.L1_DSP_NM_02, X31CWebConst.DATABEAN_SET_VALUE, dspNmOsmenu);
				// 画面ID設定
				osmenuBean.sendMessageString(CRW10601SFConst.L1_SCREEN_ID_02, X31CWebConst.DATABEAN_SET_VALUE, screenId);
				// 画面名設定
				osmenuBean.sendMessageString(CRW10601SFConst.L1_SCREEN_NM_02, X31CWebConst.DATABEAN_SET_VALUE, screenNm);
				// 画面種別設定
				osmenuBean.sendMessageString(CRW10601SFConst.L1_SCREEN_KIND_02, X31CWebConst.DATABEAN_SET_VALUE, screenKind);
				// 権限設定
				osmenuBean.sendMessageString(CRW10601SFConst.L1_AUTHORITY_02, X31CWebConst.DATABEAN_SET_VALUE, authority);
				// パラメータ1設定
				osmenuBean.sendMessageString(CRW10601SFConst.L1_PARAM1_02, X31CWebConst.DATABEAN_SET_VALUE, param1);
				// パラメータ2設定
				osmenuBean.sendMessageString(CRW10601SFConst.L1_PARAM2_02, X31CWebConst.DATABEAN_SET_VALUE, param2);
				// パラメータ3設定
				osmenuBean.sendMessageString(CRW10601SFConst.L1_PARAM3_02, X31CWebConst.DATABEAN_SET_VALUE, param3);

				// (g)ワンストップメニュー毎に取得した権限有無をサービスフォームBeanに設定する
				osmenuBean.sendMessageString(CRW10601SFConst.L1_AUTHORITY_FLG_02, X31CWebConst.DATABEAN_SET_VALUE, AUTHORITY_FLG_ON);
			}
		}

	}

	/**
	 * XML 属性値を返却します。
	 * <BR>
	 * @param attMap
	 * @param attName
	 * @return String
	 */
	private String getAttributeValue(NamedNodeMap attMap, String attName) 
	{
		Node att = attMap.getNamedItem(attName);
		return att == null ? "" : att.getNodeValue();
	}

	/**
	 * 引継情報設定。
	 * <add>メソッド名：引継情報データマップ取得
	 * <add>メソッド説明：引数のサービスフォームBeanより引継情報データマップの生成を行う。
	 * <add>備考：引継情報データタイプの可変項目はString[]のみ対応。
	 * 
	 * @param bean サービスフォームbean
	 * @return HashMap<String,Object>引継情報データマップ
	 */

	private HashMap<String, Object> getHktgiDataMap(X31SDataBeanAccess bean)
	{
		HashMap<String, Object> dataMap = new HashMap<String, Object>();
		List<HashMap<String, Object>> dataList = new ArrayList<HashMap<String, Object>>();

		HashMap<String, Object> inMap = new HashMap<String, Object>();
		
		// 選択されたワンストップメニューに紐づく表示名を取得
		String slctDspNm = bean.sendMessageString(CRW10601SFConst.SLCT_DSP_NM, X31CWebConst.DATABEAN_GET_VALUE);
		// 選択されたワンストップメニューに紐づく画面IDを取得
		String slctScreenId = bean.sendMessageString(CRW10601SFConst.SLCT_SCREEN_ID, X31CWebConst.DATABEAN_GET_VALUE);
		// 選択されたワンストップメニューに紐づく画面種別を取得
		String slctScreenKind = bean.sendMessageString(CRW10601SFConst.SLCT_SCREEN_KIND, X31CWebConst.DATABEAN_GET_VALUE);
		
		// 顧客契約の画面に遷移する場合
		if (SCREEN_KIND_KK.equals(slctScreenKind))
		{
			// 引継情報：ＳＹＳＩＤ
			inMap.put(JKKCommonConst.HKTGI_SYSID, bean.sendMessageString(CRW10601SFConst.SYSID, X31CWebConst.DATABEAN_GET_VALUE));
			// 引継情報：サービス契約番号
			inMap.put(JKKCommonConst.HKTGI_SVC_KEI_NO, bean.sendMessageString(CRW10601SFConst.SVC_KEI_NO, X31CWebConst.DATABEAN_GET_VALUE));
			// 引継情報：異動区分
			inMap.put(JKKCommonConst.HKTGI_IDO_DIV, bean.sendMessageString(CRW10601SFConst.SLCT_PARAM1, X31CWebConst.DATABEAN_GET_VALUE));
			// 引継情報：異動理由コード
			inMap.put(JKKCommonConst.HKTGI_IDO_RSN_CD, bean.sendMessageString(CRW10601SFConst.SLCT_PARAM2, X31CWebConst.DATABEAN_GET_VALUE));
			// 引継情報：ポップアップモード
			inMap.put(JKKCommonConst.HKTGI_POPUP_MODE, POPUP_MODE_OFF);

			// 引継情報：処理区分
			// 選択画面IDが"KKW02522"(eo光テレビガイド誌更新)の場合
			if (JKKScreenConst.SCREEN_ID_KKW02522.equals(slctScreenId))
			{
				if (slctDspNm.indexOf(TRAN_DIV_CHGE) != -1)
				{
					// 更新の場合
					inMap.put(JKKCommonConst.HKTGI_TRAN_DIV, JKKCommonConst.OP_TRAN_DIV_CHGE);
				}
				else if (slctDspNm.indexOf(TRAN_DIV_DSL) != -1)
				{
					// 解約の場合
					inMap.put(JKKCommonConst.HKTGI_TRAN_DIV, JKKCommonConst.OP_TRAN_DIV_DSL);
				}
			}

			dataList.add(inMap);

			dataMap.put(JKKCommonConst.HKTGI_CUST_KEI_HKTGI_LIST, dataList);
		}

		return dataMap;
	}

}
