/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：eo-netフォン通話明細照会メニュー
*   ソースファイル名：FUW08301SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年12月09日
*＜機能概要＞
*  eo-netフォン通話明細照会メニューのビューロジッククラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/12/02   FJ）垣本    新規作成
*
**********************************************************************/
package eo.web.webview.FUW08301SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.web.x00.JCCBusinessException;
import com.fujitsu.futurity.web.x00.JCCWebServiceException;
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.x31.X31SWebLog;

import eo.common.constant.JFUStrConst;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.mapping.FUSV0089_FUSV0089OPDBMapper;

/**
 * eo-netフォン通話明細照会メニューのビューロジッククラスです。<p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class FUW08301SFLogic extends JCCWebBusinessLogic
{
	/** 機能モード：1 */
	private static final String FUNC_CODE_1 = "1";

	/** ユースケースID（FUSV0089） */
	private static final String USECASE_ID_FUSV0089 = "FUSV0089";

	/** 年月日書式：yyyyMMdd */
	private static final String FMT_YMD = "yyyyMMdd";

	/** 年月日編集書式：yyyyMM */
	private static final String EDIT_YM = "yyyyMM";

	/** フロント用画面表示定義ファイル：対象年月の期間 */
	private static final String TRGT_YM_KIKAN = "trgt_ym_kikan";

	/** 文字列：0 */
	private static final String ZERO = "0";

	/** 文字列：1 */
	private static final String ONE = "1";

	/** 画面引継ぎ情報取得キー１ */
	private static final String PARAM_1 = "PARAM_1";

	/** 画面引継ぎ情報取得キー２ */
	private static final String PARAM_2 = "PARAM_2";

	/** CCタイトル：通話明細照会 */
	private static final String CC_TITLE_FUSV008901CC = "FUSV008901CC";
	/** Mapキー：請求年月 */
	private static final String MAP_KEY_SEIKY_YM = "seiky_ym";
	/** Mapキー：eo-netフォン通話合計明細 */
	private static final String MAP_KEY_CBSMSGLIST = "EAC0431A010CBSMsg1List";

	/** DataBean操作種別：項目値設定 */
	private static final String SET = X31CWebConst.DATABEAN_SET_VALUE;
	/** DataBean操作種別：項目値取得 */
	private static final String GET = X31CWebConst.DATABEAN_GET_VALUE;

	/** 料金サービスコードの桁数 */
	private static final int PRC_SVC_CD_LEN = 12;

	/**
	 * 初期表示処理
	 * 
	 * @return 処理結果
	 * @throws Exception 例外
	 */
	public boolean init() throws Exception
	{

		// サービスフォームBean保持
		X31SDataBeanAccess serviceFormBean = getServiceFormBean();
		// 共有フォームBean保持
		X31SDataBeanAccess commonInfoBean = getCommonInfoBean();

		// 共通関連チェック
		JFUWebCommon.checkCommonRelation(this, USECASE_ID_FUSV0089);

		// -------------------------------------------------
		// 共有フォームBean情報の取得
		// -------------------------------------------------
		// サービス契約情報
		X31SDataBeanAccess svcKeiInfoBean = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SVC_KEI_INFO);
		// サービス契約内訳情報
		X31SDataBeanAccess svcKeiUcwkInfoBean = svcKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_UCWK_INFO).getDataBean(0);
		// オプションサービス契約情報
		X31SDataBeanAccess opSvcKeiInfoBean = null;
		// オプションサービス契約情報（配列）
		X31SDataBeanAccessArray opSvcKeiInfoArray = svcKeiUcwkInfoBean.getDataBeanArray(CommonInfoCFConst.OP_SVC_KEI_INFO);

		for (int m = 0; m < opSvcKeiInfoArray.getCount(); m++)
		{
			// オプションサービス契約情報（作業用）
			X31SDataBeanAccess tmpOpSvcKeiInfoBean = opSvcKeiInfoArray.getDataBean(m);
			// オプションサービスコード
			String opSvCd = tmpOpSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_CD_28, GET);
			// "B014"eo-netフォンの場合
			if (JFUStrConst.CD00136_B014.equals(opSvCd))
			{
				// オプションサービス契約情報（確定）
				opSvcKeiInfoBean = tmpOpSvcKeiInfoBean;
			}
		}

		if (opSvcKeiInfoBean == null)
		{
			X31SWebLog.DEBUG_LOG.debug("【オプションサービス契約情報 未設定エラー】");
			// システムエラーをスロー
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		// サービス契約番号取得
		String svcKeiNo = svcKeiInfoBean.sendMessageString(CommonInfoCFConst.SVC_KEI_NO_23, GET);
		// 料金コースコード
		String pcrsCd = svcKeiInfoBean.sendMessageString(CommonInfoCFConst.PCRS_CD_23, GET);
		// オプションサービス契約情報取得
		String opSvcKeiNo = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_KEI_NO_28, GET);
		// 料金サービスコード
		String prcSvcCd = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.PPLAN_CD_28, GET);

		// 画面情報を取得し、サービスフォームBeanに設定
		JFUWebCommon.getScreenInfo(this);
		// サービスフォームBean.電話番号
		serviceFormBean.sendMessageString(FUW08301SFConst.KAKINS_TELNO, GET);

		// -------------------------------------------------
		// 対象年月の設定
		// -------------------------------------------------
		// フロント用画面表示定義ファイルから対象年月の期間を取得
		int kikan = Integer.parseInt(JFUWebCommon.getDispText(JFUScreenConst.SCREEN_ID_FUW08301, TRGT_YM_KIKAN));

		// 運用日付を取得
		String tougetu = JFUWebCommon.getOpeDate(this, null);

		// 請求年月リスト
		ArrayList<String> seikyYmList = new ArrayList<String>();
		// 運用日付から対象期間を設定する
		for (int i = 0; i < kikan; i++)
		{
			if (i == 0)
			{
				// 初回は、マイナスしないで運用日付を請求年月リストに追加
				seikyYmList.add(toFormatDate(tougetu, FMT_YMD, EDIT_YM));
			}
			else
			{
				// 運用日付の月からカウンタ分をマイナス
				String seikyYm = JFUWebCommon.addMonth(tougetu, -i);
				seikyYmList.add(toFormatDate(seikyYm, FMT_YMD, EDIT_YM));
			}
		}

		// -------------------------------------------------
		// サービス呼出処理
		// -------------------------------------------------
		// サービス検索条件格納用マップ
		HashMap<String, HashMap<String, String>> inputMap = new HashMap<String, HashMap<String, String>>();
		// サービス処理結果格納用マップ
		HashMap<String, HashMap<String, ArrayList<HashMap<String, String>>>> outputMap =
				new HashMap<String, HashMap<String, ArrayList<HashMap<String, String>>>>();

		// サービスパラメータ生成
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, USECASE_ID_FUSV0089);

		// 上りマッピング用にサービスフォームBeanにセット
		// サービスフォームBean.サービス契約番号
		serviceFormBean.sendMessageString(FUW08301SFConst.SVC_KEI_NO, SET, svcKeiNo);
		// サービスフォームBean.オプションサービス契約情報取得
		serviceFormBean.sendMessageString(FUW08301SFConst.OP_SVC_KEI_NO, SET, opSvcKeiNo);
		// サービスフォームBean.料金コースコード
		serviceFormBean.sendMessageString(FUW08301SFConst.PCRS_CD, SET, pcrsCd);
		// サービスフォームBean.料金サービスコード
		serviceFormBean.sendMessageString(FUW08301SFConst.PRC_SVC_CD, SET, rpad(prcSvcCd, PRC_SVC_CD_LEN));
		// サービスフォームBean.請求年月リスト
		X31SDataBeanAccessArray keySeikyYmList = serviceFormBean.getDataBeanArray(FUW08301SFConst.SEIKY_YM_LIST);
		for (int i = 0; i < seikyYmList.size(); i++)
		{
			X31SDataBeanAccess subbean = keySeikyYmList.addDataBean();
			String seikyYm = seikyYmList.get(i);
			// サービスフォームBean.請求年月リスト.請求年月
			subbean.sendMessageString(FUW08301SFConst.SEIKY_YM_01, SET, seikyYm);
		}

		// DataBean-BPマッピング
		FUSV0089_FUSV0089OPDBMapper mapper = new FUSV0089_FUSV0089OPDBMapper();
		// 上り/下りマッピング用パラメータ生成
		X31SDataBeanAccess[] serviceFormBeanArray = new X31SDataBeanAccess[] { serviceFormBean };

		// 機能コード「1」を設定
		mapper.setFUSV008901CC(serviceFormBeanArray, inputMap, FUNC_CODE_1);

		try
		{
			// サービス呼び出し
			invokeService(paramMap, inputMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			DEBUG_LOG.debug("FUW08301_callSvcFUSV0089【システムエラー】FUSV0089_JCCWebServiceException発生");
			// 業務用例外クラスをthrowする。
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		X31SDataBeanAccess[] paramBeanOut = { serviceFormBean };
		// サービスからの戻りデータをBeanにセット
		mapper.getFUSV008901CC(paramBeanOut, outputMap);

		// サービスからの情報を画面表示用に編集する
		setDispValue(serviceFormBean, outputMap.get(CC_TITLE_FUSV008901CC), seikyYmList);

		// サービスフォームBean.eo-netフォン通話合計リスト
		X31SDataBeanAccessArray meisaiList = serviceFormBean.getDataBeanArray(FUW08301SFConst.EONET_TW_GK_LIST);

		// サービスフォームBean.eo-netフォン通話合計存在フラグ
		if (meisaiList.getCount() == 0)
		{
			// サービスフォームBean.eo-netフォン通話合計存在フラグ、0：データなし
			serviceFormBean.sendMessageString(FUW08301SFConst.EONET_TW_GK_UM_FLG, SET, ZERO);
		}
		else
		{
			// サービスフォームBean.eo-netフォン通話合計存在フラグ、1：データあり
			serviceFormBean.sendMessageString(FUW08301SFConst.EONET_TW_GK_UM_FLG, SET, ONE);
		}

		// 遷移先画面ＩＤ
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, SET, JFUScreenConst.SCREEN_ID_FUW08301);
		// 遷移先画面名称
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, SET, JFUScreenConst.SCREEN_NAME_FUW08301);

		return true;
	}

	/**
	 * 通話明細照会ボタン押下処理
	 * 
	 * @return 処理結果
	 */
	public boolean shokai()
	{
		// サービスBean保持
		X31SDataBeanAccess serviceInfoBean = getServiceFormBean();

		// 引き継ぎの情報を格納するMAPを生成する。
		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// 引き継ぎを行う画面AのサービスフォームBeanの内容を項目名をキーとしてdataMapに転記する。
		ArrayList<String> targetList = new ArrayList<String>();
		// ご利用年月
		targetList.add(serviceInfoBean.sendMessageString(FUW08301SFConst.SEL_USE_YM, GET));
		// 電話番号
		targetList.add(serviceInfoBean.sendMessageString(FUW08301SFConst.KAKINS_TELNO, GET));

		// サービスフォームBean.明細リスト
		X31SDataBeanAccessArray meisaiArray = serviceInfoBean.getDataBeanArray(FUW08301SFConst.MEISAI_LIST);
		ArrayList<String> meisaiList = new ArrayList<String>();
		for (int i = 0; i < meisaiArray.getCount(); i++)
		{
			X31SDataBeanAccess meisaiBean = meisaiArray.getDataBean(i);
			String sekyYm = meisaiBean.sendMessageString(FUW08301SFConst.SEIKY_YM_03, GET);
			String buttonFlg = meisaiBean.sendMessageString(FUW08301SFConst.PCALL_DTL_SHOKAI_BUTTON_FLG_03, GET);
			meisaiList.add(sekyYm + JFUStrConst.HALF_COLON + buttonFlg);
		}

		dataMap.put(PARAM_1, targetList);
		dataMap.put(PARAM_2, meisaiList);

		// 画面情報を設定
		JFUWebCommon.setScreenInfo(this, JFUScreenConst.SCREEN_ID_FUW08302, dataMap);

		X31SDataBeanAccess commonInfoBean = getCommonInfoBean();
		// 遷移先画面ＩＤ
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, SET, JFUScreenConst.SCREEN_ID_FUW08302);
		// 遷移先画面名称
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, SET, JFUScreenConst.SCREEN_NAME_FUW08302);

		return true;
	}

	/**
	 * 戻るボタン押下時処理 <br>
	 * @return boolean true(固定)
	 * @throws Exception
	 */
	public boolean back() throws Exception
	{
		// 共有フォームBean取得
		X31SDataBeanAccess commonInfoBean = getCommonInfoBean();

		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, SET, JFUScreenConst.SCREEN_ID_FUW04902);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, SET, JFUScreenConst.SCREEN_NAME_FUW04902);

		return true;
	}

	/**
	 * 画面表示用データの加工編集処理
	 * <br/>
	 * サービスIFの検索結果リストを画面表示用に編集します。
	 *
	 * @param serviceFormBean サービスフォームBean
	 * @param fusv0089CCMap サービス検索結果マップ
	 * @param seikyYmList 請求年月リスト
	 */
	private void setDispValue(X31SDataBeanAccess serviceFormBean, HashMap<String, ArrayList<HashMap<String, String>>> fusv0089CCMap,
			ArrayList<String> seikyYmList)
	{
		// サービスフォームBean.明細リスト
		X31SDataBeanAccessArray meisaiList = serviceFormBean.getDataBeanArray(FUW08301SFConst.MEISAI_LIST);

		// サービスフォームBean.eo-netフォン通話合計リスト
		ArrayList<HashMap<String, String>> cbsMsgList = fusv0089CCMap.get(MAP_KEY_CBSMSGLIST);

		for (int i = 0; i < seikyYmList.size(); i++)
		{
			String seikyYm = seikyYmList.get(i);
			// eo-netフォン通話合計一意照会情報
			HashMap<String, String> cbsMsg = new HashMap<String, String>();
			// 存在フラグ
			boolean umFlg = false;
			// 対象年月の明細データが存在したかチェック
			for (int j = 0; j < cbsMsgList.size(); j++)
			{

				cbsMsg = cbsMsgList.get(j);
				if (seikyYm.equals(cbsMsg.get(MAP_KEY_SEIKY_YM)))
				{
					umFlg = true;
					break;
				}
			}
			X31SDataBeanAccess subbean = meisaiList.addDataBean();
			// サービスフォームBean.明細リスト.請求年月
			subbean.sendMessageString(FUW08301SFConst.SEIKY_YM_03, SET, seikyYm);
			// サービスフォームBean.明細リスト.通話明細照会ボタンフラグの設定
			if (umFlg)
			{
				// eo-netフォン通話合計情報が取得できた場合、通話明細照会ボタンフラグ：1を設定
				subbean.sendMessageString(FUW08301SFConst.PCALL_DTL_SHOKAI_BUTTON_FLG_03, SET, ONE);
			}
			else
			{
				// eoモバイル合計情報が取得できない場合、通話明細照会ボタンフラグ：0を設定
				subbean.sendMessageString(FUW08301SFConst.PCALL_DTL_SHOKAI_BUTTON_FLG_03, SET, ZERO);
			}
		}
	}

	/**
	 * 日付オブジェクトを指定された形式の文字列に編集します。
	 * <br>
	 * @param arg0 編集する日付オブジェクト
	 * @param arg1 java.util.Date型の日付書式
	 * @param arg2 編集する文字列の日付書式
	 * @return String 指定された形式に編集された文字列
	 */
	private String toFormatDate(String arg0, String arg1, String arg2)
	{
		try
		{
			SimpleDateFormat instance = new SimpleDateFormat(arg1);

			return new SimpleDateFormat(arg2).format(instance.parse(arg0));

		}
		catch (ParseException pe)
		{
			return arg0;
		}
	}

	/**
	 * 文字列をパディングします
	 * <br>
	 * @param str 文字列
	 * @param padLen パディング桁数
	 * @return パディングされた文字列
	 */
	private String rpad(String str, int padLen)
	{
		StringBuffer sb = new StringBuffer();
		sb.append(str);
		for (int i = 0; i < padLen - str.length(); i++)
		{
			sb.append(JFUStrConst.HALF_SPACE);
		}
		return sb.toString();
	}

}