/*********************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：ACW01404SFLogic
 *	ソースファイル名：ACW01404SFLogic.java
 *	作成者			：富士通
 *	日付			：2012年02月15日
 *＜機能概要＞
 *	FTTH通信量更新画面のビューロジック部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2012/02/15	富士通		新規作成
 *	v4.00.00	2013/05/08	FJ)高川		メッセージ領域背景色対応
 *
 **********************************************************************/
package eo.web.webview.ACW01404SF;

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.JCHPageTransferUtil;
import eo.web.webview.common.JCHWebCommon;
import eo.web.webview.mapping.ACSV0025_ACSV0025OPDBMapper;
import eo.web.webview.mapping.ACSV0027_ACSV0027OPDBMapper;

/**
 * FTTH通信量更新画面のビューロジックを提供します。
 * <p>
 * <BR>
 * 
 * @author 富士通
 */
public class ACW01404SFLogic extends JCCWebBusinessLogic
{

	/** ユースケースID:FTTH通信量一覧情報取得 */
	private static final String USECASE_ID_ACSV0025 = "ACSV0025";

	/** ユースケースID:FTTH通信量更新 */
	private static final String USECASE_ID_ACSV0027 = "ACSV0027";

	/** メッセージＩＤ(検索結果:指定されたデータが存在しません。) */
	private static final String MESSAGE_ID_SSN_TRGT_NONE = "EKB0330--I";

	/**
	 * FTTH通信量更新画面の初期表示処理を行います。 <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_ACW01404))
		{
			initScreen();
		}

		return true;
	}

	/**
	 * FTTH通信量更新確認画面へ遷移を行います。 <br>
	 * 
	 * @return 実行結果
	 * @throws Exception 例外が発生した場合
	 */
	public boolean updateCfm() throws Exception
	{
		// 共有フォームBeanのアクセサを取得する
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// サービスフォームBeanのアクセサを取得する
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// サービスフォームBeanのアクセサを配列化する
		X31SDataBeanAccess[] paramBeans = { bean };

		// FTTH通信量更新サービス実行
		this.execACSV0027(paramBeans, JPCModelConstant.FUNC_CD_2); // チェックのみ

		// メッセージ領域の背景色の設定
		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_ACW01405);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JACScreenConst.SCREEN_NAME_ACW01405);

		return true;
	}

	/**
	 * 戻るボタンを押下した場合、FTTH通信量一覧画面へ遷移し再検索を行います。<br>
	 * 
	 * @return 実行結果
	 * @throws Exception 例外が発生した場合
	 */
	public boolean back() throws Exception
	{
		// 遷移先画面IDを取得し、戻り遷移共通処理を呼出す
		return JCHPageTransferUtil.backTransfer(this, JCCWebCommon.getScreenId(this));
	}

	/**
	 * 確定完了ボタン押下した場合、FTTH通信量更新処理を行います。 <br>
	 * 
	 * @return 実行結果
	 * @throws Exception 例外が発生した場合
	 */
	public boolean fixFin() throws Exception
	{
		// サービスフォームBeanのアクセサを取得する
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// サービスフォームBeanのアクセサを配列化する
		X31SDataBeanAccess[] paramBeans = { bean };

		// FTTH通信量更新サービス実行
		this.execACSV0027(paramBeans, JPCModelConstant.FUNC_CD_1); // チェック＆登録

		// 明細インデックスをクリア
		paramBeans[0].sendMessageString(ACW01404SFConst.DETAIL_ICRN_SEL_INDEX, X31CWebConst.DATABEAN_SET_VALUE, JACStrConst.KARA_MOJI);

		// 遷移先画面を設定する
		this.back();

		return true;
	}

	/**
	 * 修正ボタン押下した場合、入力した内容を破棄してFTTH通信量更新画面に遷移します。 <br>
	 * 
	 * @return 実行結果
	 * @throws Exception 例外が発生した場合
	 */
	public boolean shusei() throws Exception
	{
		// サービスフォームBeanのアクセサを取得する
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// サービスフォームBeanのアクセサを配列化する
		X31SDataBeanAccess[] paramBeans = { bean };

		// 明細一覧情報の初期化
		paramBeans[0].getDataBeanArray(ACW01404SFConst.DETAIL_INFO).clearArray();

		// FTTH通信量一覧情報取得サービス実行
		this.execACSV0025(paramBeans);

		// 共有フォームBeanのアクセサを取得する
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// 遷移先画面を設定する
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JACScreenConst.SCREEN_ID_ACW01404);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JACScreenConst.SCREEN_NAME_ACW01404);

		return true;
	}

	/**
	 * FTTH通信量更新画面の初期表示処理を行います。 <br>
	 */
	private void initScreen()
	{
		// 画面間引継情報を設定する
		JCCWebCommon.getScreenInfo(this);

		// サービスフォームBeanのアクセサを取得する
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// サービスフォームBeanのアクセサを配列化する
		X31SDataBeanAccess[] paramBeans = { bean };

		// FTTH通信量一覧情報取得サービス実行
		this.execACSV0025(paramBeans);
	}

	/**
	 * FTTH通信量更新画面初期表示サービスを実行します。 <br>
	 * 
	 * @param paramBeans FTTH通信量更新画面サービスフォームBean
	 */
	private void execACSV0025(X31SDataBeanAccess[] paramBeans)
	{
		// ユースケースID格納用マップを生成。
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_ACSV0025);

		// サービスに渡すMapを生成する
		HashMap<String, Object> inDataMap = new HashMap<String, Object>();
		ACSV0025_ACSV0025OPDBMapper mapper = new ACSV0025_ACSV0025OPDBMapper();

		mapper.setACSV002501SC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_1); // EAC0591B010:通信量検索情報照会
		mapper.setACSV002502SC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_1); // EAC0601B030:通信量合計利用年月一覧照会
		mapper.setACSV002503SC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_1); // EAC0591B020:通信量明細一覧照会
		mapper.setACSV002504SC(paramBeans, inDataMap, JPCModelConstant.FUNC_CD_1); // EAC0601B020:通信量合計情報照会

		// 検索結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();
		// サービスの呼び出し
		invokeService(paramMap, inDataMap, outputMap);

		// 下りマッピング
		mapper.getACSV002501SC(paramBeans, outputMap);
		mapper.getACSV002503SC(paramBeans, outputMap);
		mapper.getACSV002504SC(paramBeans, outputMap);

		// 背景色の設定
		this.setDspCtrlValue(paramBeans);

		// ボタン制御値の設定
		this.setDisabledCntrlValue(paramBeans);

		// エラーメッセージの設定
		this.setErrorMessage(paramBeans);
	}

	/**
	 * FTTH通信量更新サービスを実行します。 <br>
	 * 
	 * @param paramBeans FTTH通信量更新画面サービスフォームBean
	 * @param funcCd 機能コード
	 */
	private void execACSV0027(X31SDataBeanAccess[] paramBeans, String funcCd)
	{
		// ユースケースID格納用マップを生成。
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_ACSV0027);

		// サービスに渡すMapを生成する
		HashMap<String, Object> inDataMap = new HashMap<String, Object>();
		ACSV0027_ACSV0027OPDBMapper mapper = new ACSV0027_ACSV0027OPDBMapper();

		mapper.setACSV002701SC(paramBeans, inDataMap, funcCd); // EAC0591C011:通信量情報明細更新
		mapper.setACSV002702SC(paramBeans, inDataMap, funcCd); // EAC0601C010:通信量情報合計更新

		// 検索結果格納用マップを生成。
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// サービスの呼び出し
		invokeService(paramMap, inDataMap, outputMap);

		if (JPCModelConstant.FUNC_CD_2.equals(funcCd))
		{
			// 下りマッピング
			mapper.getACSV002701SC(paramBeans, outputMap);

			// 補正通信量合計の再計算
			this.reCalcGokeiInfo(paramBeans);

			// 背景色の設定
			this.setDspCtrlValue(paramBeans);
		}
	}

	/**
	 * エラーメッセージ設定処理。 <br>
	 * 
	 * @param bean FTTH通信量更新画面Bean
	 */
	private void setErrorMessage(X31SDataBeanAccess[] bean)
	{
		if (isExistDetailInfo(bean) == false)
		{
			JCCWebCommon.setMessageInfo(this, MESSAGE_ID_SSN_TRGT_NONE);
		}
	}

	/**
	 * 明細一覧情報の存在を判定します。 <br>
	 * 
	 * @param bean FTTH通信量更新画面Bean
	 */
	private boolean isExistDetailInfo(X31SDataBeanAccess[] bean)
	{
		boolean isExist = false;

		X31SDataBeanAccessArray detailInfo = bean[0].getDataBeanArray(ACW01404SFConst.DETAIL_INFO);
		if (detailInfo.getCount().intValue() > 0)
		{
			isExist = true;
		}

		return isExist;
	}

	/**
	 * 明細一覧情報の背景色を設定します。 <br>
	 * 
	 * @param bean FTTH通信量更新画面Bean
	 */
	private void setDspCtrlValue(X31SDataBeanAccess[] bean)
	{
		X31SDataBeanAccessArray detailInfo = bean[0].getDataBeanArray(ACW01404SFConst.DETAIL_INFO);
		for (int i = 0; i < detailInfo.getCount().intValue(); i++)
		{
			X31SDataBeanAccess subBean = detailInfo.getDataBean(i);

			// 表示制御値
			String dspCntrlValue = JACStrConst.DSP_BG_COLOR_EVEN;
			if (i % 2 == 0)
			{
				dspCntrlValue = JACStrConst.DSP_BG_COLOR_ODD;
			}
			subBean.sendMessageString(ACW01404SFConst.DSP_CNTRL_VALUE_01, X31CWebConst.DATABEAN_SET_VALUE, dspCntrlValue);

			// 選択されている利用日を設定
			int selIdx = Integer.valueOf(bean[0].sendMessageString(ACW01404SFConst.DETAIL_ICRN_SEL_INDEX, X31CWebConst.DATABEAN_GET_VALUE));
			if (i == selIdx)
			{
				String useYmd = subBean.sendMessageString(ACW01404SFConst.USE_YMD_01, X31CWebConst.DATABEAN_GET_VALUE);
				String useDay = useYmd.substring(6, 8);

				bean[0].sendMessageString(ACW01404SFConst.INPUT_USE_HI, X31CWebConst.DATABEAN_SET_VALUE, useDay);
			}
		}
	}

	/**
	 * 明細一覧情報の有無により各ボタンの制御値を設定します。 <br>
	 * 
	 * @param bean FTTH通信量更新画面Bean
	 */
	private void setDisabledCntrlValue(X31SDataBeanAccess[] bean)
	{
		String jsfDisabledCntrlValue = JACStrConst.CTL_VALUE_TRUE;
		String htmlDisabledCntrlValue = JACStrConst.CTL_VALUE_DISABLED;

		// 利用日非活性制御値
		bean[0].sendMessageString(ACW01404SFConst.DSBL_CTL_JSF_USE_HI, X31CWebConst.DATABEAN_SET_VALUE, jsfDisabledCntrlValue);

		// 明細一覧が1件以上かつ利用月が当月の場合
		X31SDataBeanAccessArray detailInfo = bean[0].getDataBeanArray(ACW01404SFConst.DETAIL_INFO);
		if (0 < detailInfo.getCount().intValue())
		{
			jsfDisabledCntrlValue = JACStrConst.CTL_VALUE_FALSE;
			htmlDisabledCntrlValue = JACStrConst.KARA_MOJI;
		}

		// ラジオボタン非活性制御値
		bean[0].sendMessageString(ACW01404SFConst.DSBL_CTL_HTML_RADIO_BTN, X31CWebConst.DATABEAN_SET_VALUE, htmlDisabledCntrlValue);

		// 補正通信量非活性制御値
		bean[0].sendMessageString(ACW01404SFConst.DSBL_CTL_JSF_HOSEI_TSRYO, X31CWebConst.DATABEAN_SET_VALUE, jsfDisabledCntrlValue);

	}

	/**
	 * 合計情報の再計算を行います。 <br>
	 * 
	 * @param bean FTTH通信量更新画面Bean
	 */
	private void reCalcGokeiInfo(X31SDataBeanAccess[] bean)
	{
		X31SDataBeanAccessArray gokeiInfo = bean[0].getDataBeanArray(ACW01404SFConst.GOKEI_INFO);

		if (gokeiInfo.getCount().intValue() > 0)
		{
			String hoseiGk = null;

			// 選択されている補正通信量
			X31SDataBeanAccessArray detailInfo = bean[0].getDataBeanArray(ACW01404SFConst.DETAIL_INFO);
			// 明細一覧情報Beanよりリストを作成
			for (int i = 0; i < detailInfo.getCount().intValue(); i++)
			{
				X31SDataBeanAccess detailBean = detailInfo.getDataBean(i);
				String hoseiTsryo = detailBean.sendMessageString(ACW01404SFConst.HOSEI_TSRYO_01, X31CWebConst.DATABEAN_GET_VALUE);
				// 補正通信量合計 + 補正通信量(入力値)を加算
				hoseiGk = JCHWebCommon.calcAdd(hoseiGk, hoseiTsryo, true);
			}

			X31SDataBeanAccess subBean = gokeiInfo.getDataBean(0);
			// 加算結果の小数点以下切り上げ
			String hoseiTsryoGk = JCHWebCommon.calcDivide_ROUND_UP(hoseiGk, "1", 0, true);
			// 補正通信量合計に計算結果をセット
			subBean.sendMessageString(ACW01404SFConst.HOSEI_TSRYO_GOKEI_02, X31CWebConst.DATABEAN_SET_VALUE, hoseiTsryoGk);

			String useGk = subBean.sendMessageString(ACW01404SFConst.USE_TSRYO_GOKEI_02, X31CWebConst.DATABEAN_GET_VALUE);
			// 利用通信量合計 + 補正通信量合計を加算
			String gokei = JCHWebCommon.calcAdd(useGk, hoseiTsryoGk, true);
			// 合計に計算結果をセット(利用通信量合計 + 補正通信量合計)
			subBean.sendMessageString(ACW01404SFConst.GOKEI_TSRYO_GOKEI_02, X31CWebConst.DATABEAN_SET_VALUE, gokei);

			String mryoTsryo = subBean.sendMessageString(ACW01404SFConst.MRYO_TSRYO_02, X31CWebConst.DATABEAN_GET_VALUE);
			// 合計 - 無料通信量を減算
			String seikyTg = JCHWebCommon.calcSubtract(gokei, mryoTsryo, true);
			// 請求対象に計算結果をセット(合計 - 無料通信量)
			subBean.sendMessageString(ACW01404SFConst.SEIKY_TG_TSRYO_02, X31CWebConst.DATABEAN_SET_VALUE, seikyTg);
		}
	}

}
