/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：通話明細照会メニュー
*   ソースファイル名：FUW08201SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年04月28日
*＜機能概要＞
*  通話明細照会メニューのビューロジッククラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/08/23   FJ）赤井    新規作成
*   v17.00      2015/08/04   FJ) 岡井    【ANK-2557-00-00】PMP再構築対応
*   v45.00      2019/08/20   FJ) 松原    【ANK-3699-00-00】契約譲渡時のeo光電話通話明細非表示化
*	v54.00.00	2021/08/31	 FJ) 西川 	 【ANK-4132-00-00】高リスク情報表示Web画面の2段階認証チェック機能追加
*
**********************************************************************/
package eo.web.webview.FUW08201SF;

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 eo.common.constant.JFUStrConst;
import eo.common.util.JPCUtilCommon;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.FUW08202SF.FUW08202SFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.mapping.FUSV0026_FUSV0026OPDBMapper;

/**
 * 通話明細照会メニューのビューロジッククラスです。<p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class FUW08201SFLogic extends JCCWebBusinessLogic
{
	/** 機能モード：1 */
	private static final String FUNC_CODE_1 = "1";

	/** ユースケースID（FUSV0026） */
	private static final String USECASE_ID_FUSV0026 = "FUSV0026";

	/** 年月日書式：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";

	/** CCタイトル：通話明細照会 */
	private static final String CC_TITLE_FUSV002601CC = "FUSV002601CC";
	/** Mapキー：請求年月 */
	private static final String MAP_KEY_SEIKY_YM = "seiky_ym";
	/** Mapキー：eo光電話通話合計明細 */
	private static final String MAP_KEY_CBSMSGLIST = "EAC0401A010CBSMsg1List";

	/** 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
	{
		// デバッグログ
		com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG.debug("----- init_FUW08201SFLogic Start -----");

		// サービスフォームBean保持
		X31SDataBeanAccess serviceFormBean = getServiceFormBean();
		// 共有フォームBean保持
		X31SDataBeanAccess commonInfoBean = getCommonInfoBean();
		// -------------------------------------------------
		// 共有フォームBean情報の取得
		// -------------------------------------------------
		// SSO情報情報取得
		X31SDataBeanAccess ssoInfoBean = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SSO_INFO);
		// サービス契約情報取得
		X31SDataBeanAccess svcKeiInfoBean = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SVC_KEI_INFO);
		// サービス契約内訳情報取得
		X31SDataBeanAccess svcKeiUcwkInfoBean = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SVC_KEI_UCWK_INFO);

		// サービス契約番号取得
		String svcKeiNo = ssoInfoBean.sendMessageString(CommonInfoCFConst.SVC_KEI_NO_21, GET);
		// サービス契約内訳番号取得
		String svcKeiUcwkNo = svcKeiUcwkInfoBean.sendMessageString(CommonInfoCFConst.SVC_KEI_UCWK_NO_24, GET);
		// 料金コースコード
		String pcrsCd = svcKeiInfoBean.sendMessageString(CommonInfoCFConst.PCRS_CD_23, GET);
		// 料金サービスコード
		String prcSvcCd = svcKeiInfoBean.sendMessageString(CommonInfoCFConst.PPLAN_CD_23, GET);
		// 電話番号取得
		String telNo = ssoInfoBean.sendMessageString(CommonInfoCFConst.TELNO_21, GET);
		// 譲渡年月日
		String jotoYmd = svcKeiInfoBean.sendMessageString(CommonInfoCFConst.JOTO_YMD_23, GET);

		// -------------------------------------------------
		// 対象年月の設定
		// -------------------------------------------------
		// フロント用画面表示定義ファイルから対象年月の期間を取得
		int kikan = Integer.parseInt(JFUWebCommon.getDispText(JFUScreenConst.SCREEN_ID_FUW08201, TRGT_YM_KIKAN));

		// 運用日付を取得
		String tougetu = JCCWebCommon.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 = JPCUtilCommon.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_FUSV0026);

		// 上りマッピング用にサービスフォームBeanにセット
		// サービスフォームBean.サービス契約番号
		serviceFormBean.sendMessageString(FUW08201SFConst.SVC_KEI_NO, SET, svcKeiNo);
		// サービスフォームBean.サービス契約内訳番号
		serviceFormBean.sendMessageString(FUW08201SFConst.SVC_KEI_UCWK_NO, SET, svcKeiUcwkNo);
		// サービスフォームBean.料金コースコード
		serviceFormBean.sendMessageString(FUW08201SFConst.PCRS_CD, SET, pcrsCd);
		// サービスフォームBean.料金サービスコード
		serviceFormBean.sendMessageString(FUW08201SFConst.PRC_SVC_CD, SET, rpad(prcSvcCd, PRC_SVC_CD_LEN));
		// サービスフォームBean.請求年月リスト
		X31SDataBeanAccessArray keySeikyYmList = serviceFormBean.getDataBeanArray(FUW08201SFConst.SEIKY_YM_LIST);
		for (int i = 0; i < seikyYmList.size(); i++)
		{
			X31SDataBeanAccess subbean = keySeikyYmList.addDataBean();
			String seikyYm = seikyYmList.get(i);
			// サービスフォームBean.請求年月リスト.請求年月
			subbean.sendMessageString(FUW08201SFConst.SEIKY_YM_01, SET, seikyYm);
		}
		// サービスフォームBean.電話番号
		serviceFormBean.sendMessageString(FUW08201SFConst.KAKINS_TELNO, SET, telNo);
		// サービスフォームBean.譲渡年月日
		serviceFormBean.sendMessageString(FUW08201SFConst.JOTO_YMD, SET, jotoYmd);

		// DataBean-BPマッピング
		FUSV0026_FUSV0026OPDBMapper mapper = new FUSV0026_FUSV0026OPDBMapper();
		// 上り/下りマッピング用パラメータ生成
		X31SDataBeanAccess[] serviceFormBeanArray = new X31SDataBeanAccess[] { serviceFormBean };

		// 機能コード「1」を設定
		mapper.setFUSV002601CC(serviceFormBeanArray, inputMap, FUNC_CODE_1);

		try
		{
			// サービス呼び出し
			invokeService(paramMap, inputMap, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// 業務用例外クラスをthrowする。
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
		}

		X31SDataBeanAccess[] paramBeanOut = { serviceFormBean };
		// サービスからの戻りデータをBeanにセット
		mapper.getFUSV002601CC(paramBeanOut, outputMap);

		// サービスからの情報を画面表示用に編集する
		setDispValue(serviceFormBean, outputMap.get(CC_TITLE_FUSV002601CC), seikyYmList);

		// サービスフォームBean.ｅｏ光電話通話合計リスト
		X31SDataBeanAccessArray meisaiList = serviceFormBean.getDataBeanArray(FUW08201SFConst.EOH_TEL_TW_GK_LIST);

		// サービスフォームBean.ｅｏ光電話通話合計存在フラグ
		if (meisaiList.getCount() == 0)
		{
			// サービスフォームBean.ｅｏ光電話通話合計存在フラグ、0：データなし
			serviceFormBean.sendMessageString(FUW08201SFConst.EOH_TEL_TW_GK_UM_FLG, SET, ZERO);
		}
		else
		{
			// サービスフォームBean.ｅｏ光電話通話合計存在フラグ、1：データあり
			serviceFormBean.sendMessageString(FUW08201SFConst.EOH_TEL_TW_GK_UM_FLG, SET, ONE);
		}

		// 遷移先画面ＩＤ
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, SET, JFUScreenConst.SCREEN_ID_FUW08201);
		// 遷移先画面名称
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, SET, JFUScreenConst.SCREEN_NAME_FUW08201);
		// デバッグログ
		com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG.debug("----- init_FUW08201SFLogic end -----");

		return true;
	}

	/**
	 * 通話明細照会ボタン押下処理
	 * 
	 * @return 処理結果
	 */
	public boolean shokai()
	{
		// デバッグログ
		com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG.debug("----- shokai_FUW08201SFLogic Start -----");

		// 2段階認証チェック
		if (!JFUWebCommon.isSetAuthTwoStep(this))
		{
			// 2段階認証を促すCMP側共通エラー画面にリダイレクト
			return true;
		}

		// サービスBean保持
		X31SDataBeanAccess serviceInfoBean = getServiceFormBean();

		// 引き継ぎの情報を格納するMAPを生成する。
		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// 引き継ぎを行う画面AのサービスフォームBeanの内容を項目名をキーとしてdataMapに転記する。
		// ご利用年月
		int index = Integer.parseInt(serviceInfoBean.sendMessageString(FUW08201SFConst.SEL_USE_YM, GET));
		X31SDataBeanAccessArray keySeikyYmList = serviceInfoBean.getDataBeanArray(FUW08201SFConst.SEIKY_YM_LIST);
		X31SDataBeanAccess subbean = keySeikyYmList.getDataBean(index);
		dataMap.put(FUW08202SFConst.USE_YM, subbean.sendMessageString(FUW08201SFConst.SEIKY_YM_01, GET));

		// 画面情報を設定
		JCCWebCommon.setScreenInfo(this, JFUScreenConst.SCREEN_ID_FUW08202, dataMap);

		X31SDataBeanAccess commonInfoBean = getCommonInfoBean();
		// 遷移先画面ＩＤ
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, SET, JFUScreenConst.SCREEN_ID_FUW08202);
		// 遷移先画面名称
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, SET, JFUScreenConst.SCREEN_NAME_FUW08202);
		// デバッグログ
		com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG.debug("----- shokai_FUW08201SFLogic End -----");

		return true;
	}

	/**
	 * 画面表示用データの加工編集処理
	 * <br/>
	 * サービスIFの検索結果リストを画面表示用に編集します。
	 * 
	 * @param serviceFormBean サービスフォームBean
	 * @param fusv0026CCMap サービス検索結果マップ
	 * @param seikyYmList 請求年月リスト
	 */
	private void setDispValue(X31SDataBeanAccess serviceFormBean, HashMap<String, ArrayList<HashMap<String, String>>> fusv0026CCMap,
			ArrayList<String> seikyYmList)
	{
		// デバッグログ
		com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG.debug("----- setDispValue_FUW08201SFLogic Start -----");

		// サービスフォームBean.譲渡年月日
		String jotoYmd = serviceFormBean.sendMessageString(FUW08201SFConst.JOTO_YMD, X31CWebConst.DATABEAN_GET_VALUE);

		// サービスフォームBean.明細リスト
		X31SDataBeanAccessArray meisaiList = serviceFormBean.getDataBeanArray(FUW08201SFConst.MEISAI_LIST);

		// サービスフォームBean.eo光電話通話合計リスト
		ArrayList<HashMap<String, String>> cbsMsgList = fusv0026CCMap.get(MAP_KEY_CBSMSGLIST);

		for (int i = 0; i < seikyYmList.size(); i++)
		{
			String seikyYm = seikyYmList.get(i);

			// 存在フラグ
			boolean umFlg = false;
			// 対象年月の明細データが存在したかチェック
			for (int j = 0; j < cbsMsgList.size(); j++)
			{
				// eo光電話通話合計一意照会情報
				HashMap<String, String> cbsMsg = cbsMsgList.get(j);
				if (seikyYm.equals(cbsMsg.get(MAP_KEY_SEIKY_YM)))
				{
					umFlg = true;
					break;
				}
			}
			// 譲渡年月日が設定されており、請求年月が契約譲渡月の前月以前の場合は非表示
			if(!JFUWebCommon.isNull(jotoYmd))
			{
				// 請求年月
				int seikyYmNo = Integer.parseInt(seikyYm);
				int jotoYmNo = Integer.parseInt(jotoYmd.substring(0, 6));
				if(seikyYmNo < jotoYmNo)
				{
					umFlg = false;
				}
			}
			X31SDataBeanAccess subbean = meisaiList.addDataBean();
			// サービスフォームBean.明細リスト.請求年月
			subbean.sendMessageString(FUW08201SFConst.SEIKY_YM_03, SET, seikyYm);
			// サービスフォームBean.明細リスト.通話明細照会ボタンフラグの設定
			if (umFlg)
			{
				// eo光電話通話合計情報が取得できた場合、通話明細照会ボタンフラグ：1を設定
				subbean.sendMessageString(FUW08201SFConst.PCALL_DTL_SHOKAI_BUTTON_FLG_03, SET, ONE);
			}
			else
			{
				// eoモバイル合計情報が取得できない場合、通話明細照会ボタンフラグ：0を設定
				subbean.sendMessageString(FUW08201SFConst.PCALL_DTL_SHOKAI_BUTTON_FLG_03, SET, ZERO);
			}
		}
		// デバッグログ
		com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG.debug("----- setDispValue_FUW08201SFLogic End -----");
	}

	/**
	 * 日付オブジェクトを指定された形式の文字列に編集します。
	 * <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(" ");
		}
		return sb.toString();
	}

}