/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：CNW00601SFLogic
*	ソースファイル名：CNW00601SFLogic.java
*	作成者			：EK908988
*	日付			：2011年08月03日
*＜機能概要＞
*	月・日別課金照会画面のViewロジックです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	ｖ1.00.00
*	ｖ4.00.00	2012/11/08	FJ)味岡		IT2-2012-1654:検索結果0件時の検索ボタン非表示→表示対応
*	ｖ5.00.00	2012/12/05	FJ)味岡		ST1-2012-0001018:SYSDATE使用箇所を運用日付使用に置き換え
*
********************************************************************************/

package eo.web.webview.CNW00601SF;

import java.text.ParseException;
import java.util.EventObject;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import com.fujitsu.futurity.web.x31.X31CID;
import com.fujitsu.futurity.web.x31.X31CMessageResult;
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.X33CUtil;
import com.fujitsu.futurity.web.x33.X33SException;
import com.fujitsu.futurity.web.x33.X33WSessionController;

import eo.common.constant.JPCModelConstant;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CNW00501SF.CNW00501SFConst;
import eo.web.webview.CNW00602SF.CNW00602SFConst;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JCNScreenConst;
import eo.web.webview.common.JCNWebCommon;
import eo.web.webview.common.JCNWebConst;
import eo.web.webview.mapping.CNSV0014_CNSV0014OPDBMapper;

/**
 * 月･日別課金照会のViewロジック<p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class CNW00601SFLogic extends JCCWebBusinessLogic
{

	/** サービスID */
	private static final String USECASE_ID_CNSV0014 = "CNSV0014";
	/** オペレーションID */
	private static final String OPERATION_ID_CNSV0014 = "CNSV0014OP";

	/** GS明細一覧照会(月別合計照会)ＳＣ */
	private static final String SC_TITLE_CNSV001401 = "CNSV001401SC";

	/** 空文字 */
	private static final String EMPTY = "";
	/** 前月日付算用の日 */
	private static final String DAY_ONE = "01";

	/**
	 * 親クラス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 処理結果（true:正常終了、false:エラー）
	 * @throws Exception
	 */
	public boolean action_init() throws Exception
	{

		// 共通Bean取得
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// 親画面のBean取得
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// パラメータ情報を取得する
		HashMap<String, Object> param = JCCWebCommon.getScreenInfo(this);
		String chrgTrgtYm = null;
		if (param == null)
		{
			// TODO：TIまでプロパティより取得する
			// リクエスト情報取得
			X33WSessionController sc = X33CUtil.getSession(this.getSessionId());
			HttpServletRequest req = sc.getServletRequest();
			Map<String, Object> reqMap = getRequestParams();
			String contKeiNo = (String)reqMap.get("contKeiNo");
			String eoId = (String)reqMap.get("eoId");
			bean.sendMessageString(CNW00601SFConst.CONT_KEI_NO, X31CWebConst.DATABEAN_SET_VALUE, contKeiNo);
			bean.sendMessageString(CNW00601SFConst.EOID, X31CWebConst.DATABEAN_SET_VALUE, eoId);
			chrgTrgtYm = (String)reqMap.get("trgt_ym");
		}
		else
		{
			bean.sendMessageString(CNW00601SFConst.CONT_KEI_NO, X31CWebConst.DATABEAN_SET_VALUE, (String)param.get(CNW00601SFConst.CONT_KEI_NO));
			bean.sendMessageString(CNW00601SFConst.EOID, X31CWebConst.DATABEAN_SET_VALUE, (String)param.get(CNW00601SFConst.EOID));
			chrgTrgtYm = (String)param.get(CNW00601SFConst.TRGT_YM);
		}

		String beforeScreenId = JCCWebCommon.getScreenId(this);

		// ST1-2012-0001018 2012/12/05 n.ajioka START
		// システム日付を取得する。
//		String sysDate = JCCWebCommon.getSysDate();
		// システム日付を取得する。
		String strOpeDate = JCCWebCommon.getOpeDate(this, null);
		// ST1-2012-0001018 2012/12/05 n.ajioka END

		// 前画面引き継ぎの利用年月が取得できない場合は、デフォルトとして運用日付を設定
		if(chrgTrgtYm == null || "".equals(chrgTrgtYm))
		{
			chrgTrgtYm = strOpeDate.substring(0, 6);
		}
		
		// ご利用年月を取得する。
		String useStaYm = null;
		if (JCNScreenConst.SCREEN_ID_CNW00501.equals(beforeScreenId))
		{
			// ST1-2012-0001018 2012/12/05 n.ajioka START
//			useStaYm = getUseStaYm(chrgTrgtYm, sysDate, -1);
			useStaYm = getUseStaYm(chrgTrgtYm, strOpeDate, -1);
			// ST1-2012-0001018 2012/12/05 n.ajioka END
		}
		else
		{
			// ご利用年月を取得する。
			// ST1-2012-0001018 2012/12/05 n.ajioka START
//			useStaYm = getUseStaYm(chrgTrgtYm, sysDate, 0);
			useStaYm = getUseStaYm(chrgTrgtYm, strOpeDate, 0);
			// ST1-2012-0001018 2012/12/05 n.ajioka END
		}

		// 対象年月を設定
		bean.sendMessageString(CNW00601SFConst.TRGT_YM, X31CWebConst.DATABEAN_SET_VALUE, useStaYm);

		// ●サービス呼び出し処理
		// コンテンツ契約照会(初期表示)サービスの呼び出しを行う。
		// ユースケースID格納用マップを生成。
		HashMap<String, String> paramMap = new HashMap<String, String>(16);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_CNSV0014);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_OPERATION_ID, OPERATION_ID_CNSV0014);

		// マッピングクラスのインスタンス作成
		CNSV0014_CNSV0014OPDBMapper mapper = new CNSV0014_CNSV0014OPDBMapper();

		X31SDataBeanAccess[] paramBean = { bean };
		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		mapper.setCNSV001401SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		mapper.setCNSV001402SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		mapper.setCNSV001403SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1, strOpeDate);

		// 検索結果格納用マップを生成。
		HashMap<Object, Object> outputMap = new HashMap<Object, Object>();

		// サービスの呼び出しを行う。
		X31CMessageResult msgResult = invokeService(paramMap, dataMap, outputMap);
		if (msgResult != null)
		{
			JCCWebCommon.setMessageInfo(this, msgResult);
			return true;
		}

		// 各一覧リストの初期化
		X31SDataBeanAccessArray tkbt_chrg_list = bean.getDataBeanArray(CNW00601SFConst.TKBT_CHRG_LIST);
		X31SDataBeanAccessArray hibt_chrg_Array = bean.getDataBeanArray(CNW00601SFConst.HIBT_CHRG_LIST);
		tkbt_chrg_list.clearArray();
		hibt_chrg_Array.clearArray();

		// 検索エラーフラグの取得
		String monthSearchError = JCCWebCommon.getSearchErrFlg(SC_TITLE_CNSV001401, outputMap);
		if (JPCModelConstant.SEARCH_ERR_FLG_ZERO.equals(monthSearchError))
		{
			tkbt_chrg_list.addDataBean();
			hibt_chrg_Array.addDataBean();

			// 検索結果０件
			JCCWebCommon.setMessageInfo(this, JCNWebConst.SEARCH_ERR_MESSAGE_ZERO);
		}
		else
		{
			// 検索結果の取り出し
			mapper.getCNSV001401SC(paramBean, outputMap);
		}

		// 利用年月リストを設定(利用年月プルダウン部分)
		JCNWebCommon.setPullDownBeforYm(paramBean, CNW00601SFConst.RIYO_YM_LIST, CNW00601SFConst.RIYO_YM_01, CNW00601SFConst.TRGT_YM_01,
				JCNWebConst.MONTH_DAY_USE_MONTH_NM, strOpeDate);

		// 選択値を設定
		X31SDataBeanAccessArray riyoYmList = bean.getDataBeanArray(CNW00601SFConst.RIYO_YM_LIST);
		X31SDataBeanAccess subbean = riyoYmList.getDataBean(0);
		for (int i = 0; i < 7; i++)
		{
			String listTargetYm = subbean.sendMessageString(CNW00601SFConst.TRGT_YM_01, X31CWebConst.DATABEAN_GET_VALUE, i);
			if (useStaYm.equals(listTargetYm))
			{
				bean.sendMessageString(CNW00601SFConst.SELECT_VALUE, X31CWebConst.DATABEAN_SET_VALUE, String.valueOf(i));
				break;
			}
		}

		// 遷移先の画面IDを共有フォームBeanの項目に設定する。
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JCNScreenConst.SCREEN_ID_CNW00601);

		// 遷移先の画面名を共有フォームBeanの項目に設定する。
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JCNScreenConst.SCREEN_NAME_CNW00601);

		return true;
	}

	/**
	 * 利用年月選択時処理を行います。<br>
	 * 
	 * @return 処理結果（true:正常終了、false:エラー）
	 * @throws Exception
	 */
	public boolean action_search() throws Exception
	{

		// 共通Bean取得
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// 親画面のBean取得
		X31SDataBeanAccess bean = super.getServiceFormBean();

		String selectValue = bean.sendMessageString(CNW00601SFConst.SELECT_VALUE, X31CWebConst.DATABEAN_GET_VALUE);

		// 選択値を設定
		X31SDataBeanAccessArray riyoYmList = bean.getDataBeanArray(CNW00601SFConst.RIYO_YM_LIST);
		X31SDataBeanAccess subbean = riyoYmList.getDataBean(0);
		String useStaYm = subbean.sendMessageString(CNW00601SFConst.TRGT_YM_01, X31CWebConst.DATABEAN_GET_VALUE, Integer.parseInt(selectValue));

		// 対象年月を設定
		bean.sendMessageString(CNW00601SFConst.TRGT_YM, X31CWebConst.DATABEAN_SET_VALUE, useStaYm);

		// ●サービス呼び出し処理
		// コンテンツ契約照会(初期表示)サービスの呼び出しを行う。
		// ユースケースID格納用マップを生成。
		HashMap<String, String> paramMap = new HashMap<String, String>(16);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_CNSV0014);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_OPERATION_ID, OPERATION_ID_CNSV0014);

		// マッピングクラスのインスタンス作成
		CNSV0014_CNSV0014OPDBMapper mapper = new CNSV0014_CNSV0014OPDBMapper();

		X31SDataBeanAccess[] paramBean = { bean };
		HashMap<String, Object> dataMap = new HashMap<String, Object>();
		
		String strOpeDate = JCCWebCommon.getOpeDate(this, null);
		
		mapper.setCNSV001401SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		mapper.setCNSV001402SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		mapper.setCNSV001403SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1, strOpeDate);

		// 検索結果格納用マップを生成。
		HashMap<Object, Object> outputMap = new HashMap<Object, Object>();

		// サービスの呼び出しを行う。
		X31CMessageResult msgResult = invokeService(paramMap, dataMap, outputMap);
		if (msgResult != null)
		{
			JCCWebCommon.setMessageInfo(this, msgResult);
			return true;
		}

		// 各一覧リストの初期化
		X31SDataBeanAccessArray tkbt_chrg_list = bean.getDataBeanArray(CNW00601SFConst.TKBT_CHRG_LIST);
		X31SDataBeanAccessArray hibt_chrg_Array = bean.getDataBeanArray(CNW00601SFConst.HIBT_CHRG_LIST);
		tkbt_chrg_list.clearArray();
		hibt_chrg_Array.clearArray();

		// 検索エラーフラグの取得
		String monthSearchError = JCCWebCommon.getSearchErrFlg(SC_TITLE_CNSV001401, outputMap);
		if (JPCModelConstant.SEARCH_ERR_FLG_ZERO.equals(monthSearchError))
		{
			tkbt_chrg_list.addDataBean();
			hibt_chrg_Array.addDataBean();

			// 検索結果０件
			JCCWebCommon.setMessageInfo(this, JCNWebConst.SEARCH_ERR_MESSAGE_ZERO);
		}
		else
		{
			// 検索結果の取り出し
			mapper.getCNSV001401SC(paramBean, outputMap);
		}

		// 遷移先の画面IDを共有フォームBeanの項目に設定する。
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JCNScreenConst.SCREEN_ID_CNW00601);

		// 遷移先の画面名を共有フォームBeanの項目に設定する。
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JCNScreenConst.SCREEN_NAME_CNW00601);

		return true;
	}

	/**
	 * 利用日付リンク押下.<br>
	 * 日次別課金明細照会画面に遷移する。
	 * 
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean clickLinkGsMesisai() throws Exception
	{

		// 共通Bean取得
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// 親画面のBean取得
		X31SDataBeanAccess bean = super.getServiceFormBean();

		// 子画面に渡す情報用HashMap
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		String selectYmdValue = bean.sendMessageString(CNW00601SFConst.SELECT_YMD_VALUE, X31CWebConst.DATABEAN_GET_VALUE);

		// 遷移先画面に渡す情報をHashMapに設定する
		paramMap.put(CNW00602SFConst.EOID, bean.sendMessageString(CNW00601SFConst.EOID, X31CWebConst.DATABEAN_GET_VALUE));
		paramMap.put(CNW00602SFConst.CONT_KEI_NO, bean.sendMessageString(CNW00601SFConst.CONT_KEI_NO, X31CWebConst.DATABEAN_GET_VALUE));
		paramMap.put(CNW00602SFConst.USE_YMD, selectYmdValue);

		X31SDataBeanAccessArray tkbt_chrg_list = bean.getDataBeanArray(CNW00601SFConst.TKBT_CHRG_LIST);
		X31SDataBeanAccess subbean = tkbt_chrg_list.getDataBean(0);
		paramMap.put(CNW00602SFConst.TAX_RT, subbean.sendMessageString(CNW00601SFConst.TAX_RT_02, X31CWebConst.DATABEAN_GET_VALUE));

		// 遷移先画面に渡す情報を設定
		JCCWebCommon.setScreenInfo(this, JCNScreenConst.SCREEN_ID_CNW00602, paramMap);

		// 遷移先画面に親画面の画面IDを設定
		JCCWebCommon.setScreenId(this, JCNScreenConst.SCREEN_ID_CNW00602, JCNScreenConst.SCREEN_ID_CNW00601);

		// 遷移先画面ID、名称の設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, 
				X31CWebConst.DATABEAN_SET_VALUE, JCNScreenConst.SCREEN_ID_CNW00602);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, 
				X31CWebConst.DATABEAN_SET_VALUE, JCNScreenConst.SCREEN_NAME_CNW00602);

		return true;
	}

	/**
	 * 戻るボタン押下.<br>
	 * コンテンツ契約照会画面に遷移する。
	 * 
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean action_back() throws Exception
	{
		// サービスフォームBeanの内容の取得
		X31SDataBeanAccess bean = getServiceFormBean();

		// 共通Bean取得
		X31SDataBeanAccess commoninfoBean = super.getCommonInfoBean();

		// 子画面に渡す情報用HashMap
		HashMap<String, Object> paramMap = new HashMap<String, Object>();

		// 遷移先画面に渡す情報をHashMapに設定する
		paramMap.put(CNW00501SFConst.CONT_KEI_NO, bean.sendMessageString(CNW00601SFConst.CONT_KEI_NO, X31CWebConst.DATABEAN_GET_VALUE));
		paramMap.put(CNW00501SFConst.EOID, bean.sendMessageString(CNW00601SFConst.EOID, X31CWebConst.DATABEAN_GET_VALUE));
		paramMap.put(CNW00501SFConst.CUST_KANA_NM, bean.sendMessageString(CNW00601SFConst.CUST_KANA_NM, X31CWebConst.DATABEAN_GET_VALUE));

		// 遷移先画面に渡す情報を設定
		JCCWebCommon.setScreenInfo(this, JCNScreenConst.SCREEN_ID_CNW00501, paramMap);
		JCCWebCommon.setScreenId(this, JCNScreenConst.SCREEN_ID_CNW00501, JCNScreenConst.SCREEN_ID_CNW00601);

		// 遷移先の画面IDを共有フォームBeanの項目に設定する。
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JCNScreenConst.SCREEN_ID_CNW00501);

		// 遷移先の画面名を共有フォームBeanの項目に設定する。
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JCNScreenConst.SCREEN_NAME_CNW00501);

		return true;
	}

	/**
	 * 対象年月取得
	 * 
	 * <br>
	 * @param targetYm 対象年月
	 * @param nowDate 現在年月
	 * @param num 加減算値
	 * @return 課金対象年月-1ヶ月 or 現在年月
	 * @throws ParseException
	 */
	private static String getUseStaYm(String targetYm, String nowDate, int num) throws ParseException
	{
		// 現在年月
		String toYm = nowDate.substring(0, 6);
		if (isNull(targetYm) || 6 > targetYm.length())
		{
			// 現在年月を返却する。
			return toYm;
		}

		// ご利用年月
		String useStaYm = 0 == num ? targetYm : JCCWebCommon.addMonth(targetYm + DAY_ONE, num).substring(0, 6);
		// 開始年月
		String fromYm = JCCWebCommon.addMonth(nowDate, -7).substring(0, 6);

		int useStaYmInt = Integer.parseInt(useStaYm);
		int fromYmInt = Integer.parseInt(fromYm);
		int toYmInt = Integer.parseInt(toYm);

		// 現在年月-7ケ月 ≦ 課金対象年月-1ヶ月 ≦ 現在年月の場合
		// 課金対象年月-1ヶ月を利用年月を返却する。それ以外の場合は現在年月を返却する。
		return (fromYmInt <= useStaYmInt && useStaYmInt <= toYmInt) ? useStaYm : toYm;
	}

	/**
	 * オブジェクトに値が設定されているか判定します。
	 * <br>
	 * @param arg0 判定するオブジェクト
	 * @return オブジェクトに値が設定されていない場合はtrue
	 */
	private static boolean isNull(Object arg0)
	{
		return null == arg0 || EMPTY.equals(arg0);
	}
}
