/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：CHW01110SFLogic
 *   ソースファイル名：CHW01110SFLogic.java
 *   作成者          ：富士通
 *   日付            ：2011年11月11日
 *＜機能概要＞
 *   金庫統合登録のビューロジック部品です。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v1.00.00    2011/11/18               新規作成
 *	 v1.01.00	 2013/05/08	  FJ)大塚     メッセージ領域の背景色の設定対応
 *	 v11.00.00	 2014/11/29	  FJ)阪口     【OM-2014-0003631】金庫統合可否チェックの追加
 **********************************************************************/
package eo.web.webview.CHW01110SF;

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.JACStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.constant.JPCOnlineMessageConstant;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JACScreenConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JCHCommonServiceUtil;
import eo.web.webview.common.JCHPageTransferUtil;
import eo.web.webview.common.JCHPulldownUtil;
import eo.web.webview.mapping.CHSV0049_CHSV0049OPDBMapper;
import eo.web.webview.mapping.CHSV0050_CHSV0050OPDBMapper;

/**
 * 金庫統合登録のビューロジックを提供します。
 * <p>
 * <BR>
 * 
 * @author 富士通
 */
public class CHW01110SFLogic extends JCCWebBusinessLogic
{

	/** ユースケースID(金庫統合登録画面情報取得) */
	private static final String USECASE_ID_CHSV0049 = "CHSV0049";

	/** ユースケースID(金庫統合登録) */
	private static final String USECASE_ID_CHSV0050 = "CHSV0050";

	/** メッセージＩＤ(ＮＧワード) */
	private static final String MESSAGE_ID_NG_WORD = "EKB8580-KW";

	/** メッセージＩＤ(未納金庫情報2件未満) */
	private static final String MESSAGE_ID_EKB8120_KW = "EKB8120-KW";

	/** メッセージＩＤ(金庫統合可否チェックエラー) */
	private static final String MESSAGE_ID_EKBE177_KW = "EKBE177-KW";

	/**
	 * 金庫統合登録画面の初期表示処理を行います。 <br>
	 * 
	 * @return 実行結果
	 * @throws Exception 例外が発生した場合
	 */
	public boolean init() throws Exception
	{
		// 共有フォームBeanのアクセサを取得する
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// 遷移先画面IDを判定して画面IDに対応する初期表示処理を呼び出す
		String screenId = commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_GET_VALUE);
		if (screenId.equals(JACScreenConst.SCREEN_ID_CHW01110))
		{
			initAddScreen();
		}

		return true;
	}

	/**
	 * 金庫統合登録確認画面に遷移します。 <br>
	 * 
	 * @return 実行結果
	 * @throws Exception 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	public boolean addCfm() throws Exception
	{
		// 共有フォームBeanのアクセサを取得する
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// サービスフォームBeanのアクセサを取得する
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// サービスフォームBeanのアクセサを配列化する
		X31SDataBeanAccess[] paramBeans = { bean, commoninfoBean };

		// 選択されたプルダウンの名称を取得
		String knkStatCdNm = JCHPulldownUtil.getSelectedValue(paramBeans, CHW01110SFConst.KNK_STAT_INFO, CHW01110SFConst.KNK_STAT_NM_LIST_02, CHW01110SFConst.KNK_STAT_SEL_02);
		// 選択されたプルダウンの名称を設定
		paramBeans[0].sendMessageString(CHW01110SFConst.OUT_KNK_PRC_KMK_CD_NM, X31CWebConst.DATABEAN_SET_VALUE, knkStatCdNm);

		// ユースケースID格納用マップを生成。
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_CHSV0050);

		// サービスに渡すMapを生成する
		HashMap<String, Object> inDataMap = new HashMap<String, Object>();
		CHSV0050_CHSV0050OPDBMapper mapper = new CHSV0050_CHSV0050OPDBMapper();

		mapper.setKNKTGKHCHKCC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_2);					// KNKTGKHCHKCC : 金庫統合可否チェック用CC
		mapper.setCHSV005001SC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_2);					// ECH0191C030 : 金庫統合
		mapper.setTAIOKIROKADDCC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_2, this);			// TAIOKIROKADDCC : 顧客対応記録登録CC
		mapper.setADDHOTVOICCC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_2, this); 			// ADDHOTVOICCC : ホットボイスCC
		mapper.setPRCTAIOKIROKADDCC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_2, this);		// PRCTAIOKIROKADDCC : 料金対応記録登録CC

		// NGワードチェックフラグを設定
		((HashMap)inDataMap.get(JACStrConst.PRCTAIOKIROKADDCC_MAP_ID)).put(JACStrConst.KEY_NGWORD_CHECK_FLG, "1");

		// 結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// サービスの呼び出し
		invokeService(paramMap, inDataMap, outputMap);

		// 金庫統合可否チェック判定
		if (!this.chkKnkTgkh(outputMap, paramBeans))
		{
			// エラー行が存在していた場合、処理を終了する。
			return true;
		}

		//ＮＧワードチェック
		ArrayList<String> ngWordList = JCHCommonServiceUtil.getNgWordList(outputMap);

		// NGワードが存在する場合、警告メッセージ表示
		if (!ngWordList.isEmpty())
		{
			for (int i = 0; i < ngWordList.size(); i++)
			{
				JCCWebCommon.setMessageInfo(this, MESSAGE_ID_NG_WORD, new String[] { CHW01110SFConst.KIJI, ngWordList.get(i) });
			}
			return true;
		}

		mapper.getCHSV005001SC(paramBeans, outputMap);

		// 金庫統合登録確認情報の制御値
		this.setCtrlValueInCfmTogoAddIcrn(paramBeans);
		
		// メッセージ領域の背景色の設定
		JCCWebCommon.setMessageAreaBackColor(this, "1");

		// メッセージの設定
		JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB0370__I, new String[] {"登録"});

		// 遷移先画面を設定する 
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JACScreenConst.SCREEN_ID_CHW01111);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JACScreenConst.SCREEN_NAME_CHW01111);

		return true;
	}

	/**
	 * 確定完了を処理します。 <br>
	 * 
	 * @return 実行結果
	 * @throws Exception 例外が発生した場合
	 */
	public boolean fixFin() throws Exception
	{
		// 共有フォームBeanのアクセサを取得する
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// サービスフォームBeanのアクセサを取得する
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// サービスフォームBeanのアクセサを配列化する
		X31SDataBeanAccess[] paramBeans = { bean, commoninfoBean };

		// ユースケースID格納用マップを生成。
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_CHSV0050);

		// サービスに渡すMapを生成する
		HashMap<String, Object> inDataMap = new HashMap<String, Object>();
		CHSV0050_CHSV0050OPDBMapper mapper = new CHSV0050_CHSV0050OPDBMapper();

		mapper.setKNKTGKHCHKCC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_2);					// KNKTGKHCHKCC : 金庫統合可否チェック用CC(※機能コードは"2")
		mapper.setCHSV005001SC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_1);					// ECH0191C030 : 金庫統合
		mapper.setTAIOKIROKADDCC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_1, this);			// TAIOKIROKADDCC : 顧客対応記録登録CC
		mapper.setADDHOTVOICCC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_1, this); 			// ADDHOTVOICCC : ホットボイスCC
		mapper.setPRCTAIOKIROKADDCC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_1, this);		// PRCTAIOKIROKADDCC : 料金対応記録登録CC

		// 結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// サービスの呼び出し
		invokeService(paramMap, inDataMap, outputMap);

		// 金庫統合可否チェック判定
		if (!this.chkKnkTgkh(outputMap, paramBeans))
		{
			// エラー行が存在していた場合、処理を終了する。
			return true;
		}

		// 閉じる処理の呼出し
		this.close();

		return true;
	}

	/**
	 * 修正を処理します。 <br>
	 * 
	 * @return 実行結果
	 * @throws Exception 例外が発生した場合
	 * 
	 */
	public boolean shusei() throws Exception
	{
		// サービスフォームBeanのアクセサを取得する
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// サービスフォームBeanのアクセサを配列化する
		X31SDataBeanAccess[] paramBeans = { bean };

		// 金庫統合登録情報の制御値
		this.setCtrlValueInTogoAddIcrn(paramBeans);

		// 共有フォームBeanのアクセサを取得する
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();
		// 遷移先画面を設定する
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JACScreenConst.SCREEN_ID_CHW01110);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JACScreenConst.SCREEN_NAME_CHW01110);

		return true;
	}

	/**
	 * モーダル反映画面に遷移して画面を閉じます。 <br>
	 * 
	 * @return 実行結果
	 * @throws Exception 例外が発生した場合
	 */
	public boolean close() throws Exception
	{
		// 遷移先画面IDを取得し、子画面を閉じる共通処理を呼出す
		return JCHPageTransferUtil.closeTransfer(this, JCCWebCommon.getScreenId(this));
	}

	/**
	 * 金庫統合登録画面の初期表示処理を行います。 <br>
	 * 
	 * @throws Exception 例外が発生した場合
	 */
	private void initAddScreen() throws Exception
	{
		// 画面間引継情報を設定する
		JCCWebCommon.getScreenInfo(this);

		// サービスフォームBeanのアクセサを取得する
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// サービスフォームBeanのアクセサを配列化する
		X31SDataBeanAccess[] paramBeans = { bean };

		// ユースケースID格納用マップを生成。
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_CHSV0049);

		// サービスに渡すMapを生成する
		HashMap<String, Object> inDataMap = new HashMap<String, Object>();
		CHSV0049_CHSV0049OPDBMapper mapper = new CHSV0049_CHSV0049OPDBMapper();
		mapper.setCHSV004901SC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_1);		// ECH0191B011 : 未処理金金庫一覧照会
		mapper.setCHSV004902SC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_1);		// EZM0171B030 : 金庫ステータスコード名称一覧照会

		// 検索結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// サービスの呼び出し
		invokeService(paramMap, inDataMap, outputMap);

		// 下りマッピング
		mapper.getCHSV004901SC(paramBeans, outputMap);
		mapper.getCHSV004902SC(paramBeans, outputMap);

		// 統合金庫情報明細の件数を取得する
		X31SDataBeanAccessArray miTrnKnkInfo = paramBeans[0].getDataBeanArray(CHW01110SFConst.MI_TRN_KNK_INFO);
		paramBeans[0].sendMessageString(CHW01110SFConst.MI_TRN_KNK_INFO_CNT, X31CWebConst.DATABEAN_SET_VALUE, miTrnKnkInfo.getCount().toString());

		// 金庫ステータスコード名称選択
		X31SDataBeanAccess knkStatSbtInfo = paramBeans[0].getDataBeanArray(CHW01110SFConst.KNK_STAT_INFO).getDataBean(0);
		knkStatSbtInfo.sendMessageString(CHW01110SFConst.KNK_STAT_SEL_02, X31CWebConst.DATABEAN_SET_VALUE, "0");

		// 金庫統合登録情報の制御値
		this.setCtrlValueInTogoAddIcrn(paramBeans);

		// 制御値(金庫一覧情報による画面制御)
		this.setDisabledCntrlValueOfKnkIcrnInfo(paramBeans);

		return;
	}

	/**
	 * 未処理金金庫情報の有無により各ボタンの制御値を設定します。 <br>
	 * 
	 * @param bean 料金変更Bean
	 */
	private void setDisabledCntrlValueOfKnkIcrnInfo(X31SDataBeanAccess[] bean)
	{
		String jsfDisabledCntrlValue = JACStrConst.CTL_VALUE_TRUE;

		X31SDataBeanAccessArray miTrnKnkInfo = bean[0].getDataBeanArray(CHW01110SFConst.MI_TRN_KNK_INFO);
		if (miTrnKnkInfo.getCount().intValue() > 1)
		{
			jsfDisabledCntrlValue = JACStrConst.CTL_VALUE_FALSE;
		}
		else
		{
			// 検索結果2件未満のエラーメッセージを設定
			JCCWebCommon.setMessageInfo(this, MESSAGE_ID_EKB8120_KW);
		}

		// 記事
		bean[0].sendMessageString(CHW01110SFConst.READ_CTL_JSF_KIJI, X31CWebConst.DATABEAN_SET_VALUE, jsfDisabledCntrlValue);

		// 対応履歴表示非活性制御値
		bean[0].sendMessageString(CHW01110SFConst.DSBL_CTL_JSF_TAIO_RIREKI, X31CWebConst.DATABEAN_SET_VALUE, jsfDisabledCntrlValue);

		// 登録確認ボタン
		bean[0].sendMessageString(CHW01110SFConst.DSBL_CTL_JSF_BTN_ADDCFM, X31CWebConst.DATABEAN_SET_VALUE, jsfDisabledCntrlValue);
	}

	/**
	 * 未処理金金庫情報の制御値を設定します。 <br>
	 * 
	 * @param bean 金庫統合登録Bean
	 */
	private void setCtrlValueInTogoAddIcrn(X31SDataBeanAccess[] bean)
	{
		// 金庫統合登録画面情報
		X31SDataBeanAccessArray TogoAddIcrnInfo = bean[0].getDataBeanArray(CHW01110SFConst.MI_TRN_KNK_INFO);
		for (int idx = 0; idx < TogoAddIcrnInfo.getCount().intValue(); idx++)
		{
			X31SDataBeanAccess subBean = TogoAddIcrnInfo.getDataBean(idx);
			// 表示制御値
			String dspCntrlValue = JACStrConst.DSP_BG_COLOR_EVEN;
			if (idx % 2 == 0)
			{
				dspCntrlValue = JACStrConst.DSP_BG_COLOR_ODD;
			}
			subBean.sendMessageString(CHW01110SFConst.DSP_CNTRL_VALUE_01, X31CWebConst.DATABEAN_SET_VALUE, dspCntrlValue);
		}
	}

	/**
	 * 未処理金金庫情報の制御値を設定します。 <br>
	 * 
	 * @param bean 金庫統合登録確認Bean
	 */
	private void setCtrlValueInCfmTogoAddIcrn(X31SDataBeanAccess[] bean)
	{
		// 金庫統合登録確認画面情報
		X31SDataBeanAccessArray CfmTogoAddIcrnInfo = bean[0].getDataBeanArray(CHW01110SFConst.MI_TRN_KNK_INFO);

		int idxK = 0;
		for (int idx = 0; idx < CfmTogoAddIcrnInfo.getCount().intValue(); idx++)
		{
			X31SDataBeanAccess subBean = CfmTogoAddIcrnInfo.getDataBean(idx);
			// 未処理金金庫情報.未処理金金庫情報選択
			boolean choice = subBean.sendMessageBoolean(CHW01110SFConst.MI_TRN_KNK_ICRN_SEL_01, X31CWebConst.DATABEAN_GET_VALUE);

			// 選択されている情報のみをマッピングする
			if (choice)
			{
				// 表示制御値
				String dspCntrlValue = JACStrConst.DSP_BG_COLOR_EVEN;
				if (idxK % 2 == 0)
				{
					dspCntrlValue = JACStrConst.DSP_BG_COLOR_ODD;
				}
				idxK++;
				subBean.sendMessageString(CHW01110SFConst.DSP_CNTRL_VALUE_01, X31CWebConst.DATABEAN_SET_VALUE, dspCntrlValue);
			}
		}
	}

	/**
	 * 金庫統合可否チェックの判定を行います。 <br>
	 * 
	 * @param outputMap サービス処理結果Map
	 */
	private boolean chkKnkTgkh(HashMap<String, Object> outputMap, X31SDataBeanAccess[] bean)
	{
		// 金庫統合可否チェックCC要Mapの取得
		HashMap<String, Object> knkTgKhChkCCMap =  (HashMap<String, Object>) outputMap.get(JACStrConst.KNKTGKHCHKCC_MAP_ID);
		// 移動元料金項目コードリスト取得
		ArrayList<HashMap<String, Object>> idomotoKnkPrcKmkCdList = (ArrayList<HashMap<String, Object>>) knkTgKhChkCCMap.get("idomoto_knk_prc_kmk_cd_list");

		String errFlg = "";
		String idx = "";
		
		X31SDataBeanAccessArray arraybean = null;
		X31SDataBeanAccess beanTemp = null;
		
		// 統合先の金庫ステータス名称を取得
		X31SDataBeanAccess knkStatInfo = bean[0].getDataBeanArray(CHW01110SFConst.KNK_STAT_INFO).getDataBean(0);
		String knkStatInfoIndex = knkStatInfo.sendMessageString(CHW01110SFConst.KNK_STAT_SEL_02, X31CWebConst.DATABEAN_GET_VALUE);
		String sakiKnkStatName = knkStatInfo.sendMessageString(CHW01110SFConst.KNK_STAT_NM_LIST_02, X31CWebConst.DATABEAN_GET_VALUE, Integer.parseInt(knkStatInfoIndex));
		
		// 選択された統合対象金庫情報の行数分処理する
		for (int i = 0; i < idomotoKnkPrcKmkCdList.size(); i++)
		{
			HashMap<String, Object> idomotoKnkPrcKmkCdMap = (HashMap<String, Object>) idomotoKnkPrcKmkCdList.get(i);
			
			// エラーフラグを取得する
			errFlg = (String) idomotoKnkPrcKmkCdMap.get("err_flg");
			
			if ("E".equals(errFlg))
			{
				// 金庫統合可否チェックがエラーである場合、エラーとなった統合元情報の行番号を取得する
				idx = (String) idomotoKnkPrcKmkCdMap.get("tg_knk_info_idx");
				
				beanTemp = bean[0];
				arraybean = beanTemp.getDataBeanArray("未処理金金庫情報");
				if (arraybean != null && arraybean.getCount() > 0)
				{
					X31SDataBeanAccess subBean = arraybean.getDataBean(Integer.parseInt(idx));
					
					// エラーとなった金庫料金項目コードの金庫ステータス名を取得する
					String motoKnkStatName = subBean.sendMessageString(CHW01110SFConst.TG_KNK_PRC_KMK_CD_NM_01, X31CWebConst.DATABEAN_GET_VALUE);
					
					// エラーメッセージを設定し、返却する
					JCCWebCommon.setMessageInfo(this, MESSAGE_ID_EKBE177_KW, new String[] {motoKnkStatName,  sakiKnkStatName});
					return false;
				}
			}
		}
		// エラーが無い場合、処理続行
		return true;
	}
}
