/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUDialupRelCheckCC
*   ソースファイル名：JFUDialupRelCheckCC.java
*   作成者          ：富士通
*   日付            ：2012年7月20日
*＜機能概要＞
*   ダイヤルアップ接続関連チェックコモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v4.00       2012/07/20   FJ）知識    新規作成【ANK-1163-00-00】 変更系申込が可能となるタイミングについて
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JPCDateUtil;
import eo.ejb.cbs.cbsmsg.EKK0021A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0021A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0351B003CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0351B003CBSMsg1List;

/**
 * ダイヤルアップ接続関連チェックコモンコンポーネント部品
 * 
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUDialupRelCheckCC extends JFUBaseNetChgRelCheckCC
{
	/* ===== パラメータ ===== */
	/** IN項目：サービス契約番号 */
	private static final String IN_PARAM_KEY_SVC_KEI_NO = "key_svc_kei_no";
	/** OUT項目： 新規／変更／照会区分 */
	protected static final String OUT_PARAN_CHG_DIV = "chg_div";

	/** 新規／変更／照会区分 新規 */
	private static final String CHG_DIV_0 = "0";
	/** 新規／変更／照会区分 変更 */
	private static final String CHG_DIV_1 = "1";
	/** 新規／変更／照会区分 照会 */
	private static final String CHG_DIV_2 = "2";

	/* ■□ オプションサービス契約履歴一覧照会CC ■□ */
	/** テンプレートID(オプションサービス契約履歴一覧照会) */
	private static final String TEMPLATE_ID_EKK0351B003 = "EKK0351B003";
	/** テンプレートID(オプションサービス契約履歴一覧照会明細) */
	private static final String TEMPLATE_ID_EKK0351B003_DETAIL = EKK0351B003CBSMsg.EKK0351B003CBSMSG1LIST;
	/** IN項目リスト(オプションサービス契約履歴一覧照会) */
	private static final List<String> IN_COLUMN_LIST_EKK0351B003 =
			Arrays.asList(EKK0351B003CBSMsg.KEY_SVC_KEI_NO, EKK0351B003CBSMsg.KEY_SVC_KEI_UCWK_NO1, EKK0351B003CBSMsg.KEY_SVC_KEI_UCWK_NO2,
					EKK0351B003CBSMsg.KEY_SVC_KEI_UCWK_NO3, EKK0351B003CBSMsg.KEY_SVC_KEI_UCWK_NO4, EKK0351B003CBSMsg.KEY_SVC_KEI_UCWK_NO5);
	/** 関連チェックエラー項目(オプションサービス契約履歴一覧照会) */
	private static final String ERROR_COLUMN_EKK0351B003 = "op_svc_kei_no_err";
	/** SC実行結果取得キー(料金コース_オプションサービス一意照会) */
	private static final String TEMP_TEMPLATE_KEY_EKK0351B003 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_EKK0351B003 + TEMP_TEMPLATE_PRIFIX_SEP + "1";

	/* ■□ 申込明細一意照会SC ■□ */
	/** テンプレートID(申込明細一意照会) */
	private static final String TEMPLATE_ID_EKK0021A010 = "EKK0021A010";
	/** テンプレートID(申込明細一意照会明細 */
	private static final String TEMPLATE_ID_EKK0021A010_DETAIL = EKK0021A010CBSMsg.EKK0021A010CBSMSG1LIST;
	/** IN項目リスト(申込明細一意照会) */
	private static final List<String> IN_COLUMN_LIST_EKK0021A010 =
			Arrays.asList(EKK0021A010CBSMsg.KEY_MSKM_DTL_NO, EKK0021A010CBSMsg.KEY_GENE_ADD_DTM);
	/** 関連チェックエラー項目(申込明細一意照会 */
	private static final String ERROR_COLUMN_EKK0021A010 = EKK0021A010CBSMsg.KEY_MSKM_DTL_NO_ERR;
	/** SC実行結果取得キー(申込明細一意照会） */
	private static final String TEMP_TEMPLATE_KEY_EKK0021A010 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_EKK0021A010 + TEMP_TEMPLATE_PRIFIX_SEP + "1";

	/**
	 * ダイヤルアップ接続関連チェック実行処理
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception 例外
	 */
	public IRequestParameterReadWrite executeCheck(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{

		try
		{
			// ユーザデータ取得
			HashMap inMap = (HashMap)param.getData(fixedText);

			// OUT項目:新規／変更／照会区分の初期値(新規)を設定
			inMap.put(OUT_PARAN_CHG_DIV, CHG_DIV_0);

			// IN項目:サービス契約番号
			String inParamSvcKeiNo = (String)inMap.get(IN_PARAM_KEY_SVC_KEI_NO);

			// ●オプションサービス契約履歴一覧照会
			// ユーザデータ初期化
			initData(param, fixedText, IN_COLUMN_LIST_EKK0351B003);
			// 検索失敗エラーなし設定
			ignoreSearchError(param, fixedText);
			// 上りマッピング
			setInMapOpSvcKeiRirekiSearch(param, fixedText, inParamSvcKeiNo);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_EKK0351B003, TEMPLATE_ID_EKK0351B003_DETAIL, IN_COLUMN_LIST_EKK0351B003,
					ERROR_COLUMN_EKK0351B003);

			// 現在の運用日付
			String operateDate = JCCBPCommon.getOpeDate(null);

			for (HashMap mskmDtlNoMap : getTemplateList((HashMap)param.getData(fixedText), TEMP_TEMPLATE_KEY_EKK0351B003,
					TEMPLATE_ID_EKK0351B003_DETAIL))
			{
				// 予約適用コード
				String kk0351RsvAplyCd = (String)mskmDtlNoMap.get(EKK0351B003CBSMsg1List.KK0351_RSV_APLY_CD);

				// オプションサービスコードがダイヤルアップ接続以外、予約キャンセルの場合は対象外
				if (!JFUStrConst.CD00136_B020.equals(mskmDtlNoMap.get(EKK0351B003CBSMsg1List.OP_SVC_CD))
						|| JFUStrConst.CD00343_3.equals(kk0351RsvAplyCd))
				{
					continue;
				}

				// 予約適用年月日
				String rsvAplyYmd = (String)mskmDtlNoMap.get(EKK0351B003CBSMsg1List.RSV_APLY_YMD);
				// オプションサービス契約ステータス
				String opSvcKeiStat = (String)mskmDtlNoMap.get(EKK0351B003CBSMsg1List.OP_SVC_KEI_STAT);
				// 異動区分
				String idoDiv = (String)mskmDtlNoMap.get(EKK0351B003CBSMsg1List.IDO_DIV);
				// 申込明細番号
				String mskmDtlNo = (String)mskmDtlNoMap.get(EKK0351B003CBSMsg1List.MSKM_DTL_NO);

				// 予約適用コード="2"、且つ、予約適用年月日<=運用日付の場合
				if (JFUStrConst.CD00343_2.equals(kk0351RsvAplyCd) && rsvAplyYmd.compareTo(operateDate) <= 0)
				{
					// カレントのオプションサービス契約ステータス910(解約済)、または、920(キャンセル済)の場合
					if (JFUStrConst.CD00037_910.equals(opSvcKeiStat) || JFUStrConst.CD00037_920.equals(opSvcKeiStat))
					{
						// 新規モード
						break;
					}

					// カレントのサービス契約ステータスが"010"(受付済)、"210"(休止・中断中)、"220"(停止中)の場合
					if (JFUStrConst.CD00037_010.equals(opSvcKeiStat) || JFUStrConst.CD00037_210.equals(opSvcKeiStat)
							|| JFUStrConst.CD00037_220.equals(opSvcKeiStat))
					{
						// 契約状態エラー
						setRelationErrorInfo(param, TEMPLATE_ID_EKK0351B003, ERROR_COLUMN_EKK0351B003, fixedText);
						throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)), String
								.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
					}

					// 異動区分が"00031"(オプション設定)かつオプションサービス契約ステータスが
					// "020"(照査)、"030"(締結済)、"100"(サービス提供中)の場合
					if (JFUStrConst.CD00576_00031.equals(idoDiv)
							&& (JFUStrConst.CD00037_020.equals(opSvcKeiStat) || JFUStrConst.CD00037_030.equals(opSvcKeiStat) || JFUStrConst.CD00037_100
									.equals(opSvcKeiStat)))
					{
						// ●申込明細一意照会
						// ユーザデータ初期化
						initData(param, fixedText, IN_COLUMN_LIST_EKK0021A010);
						// 上りマッピング
						setInMapMskmDtlIchiShokai(param, fixedText, mskmDtlNo);
						// サービスIF実行
						executeSC(handle, param, fixedText, TEMPLATE_ID_EKK0021A010, TEMPLATE_ID_EKK0021A010_DETAIL, IN_COLUMN_LIST_EKK0021A010,
								ERROR_COLUMN_EKK0021A010);
						// 申込年月日
						String mskmYmd =
								getTemplateListValue(inMap, TEMP_TEMPLATE_KEY_EKK0021A010, TEMPLATE_ID_EKK0021A010_DETAIL,
										EKK0021A010CBSMsg1List.MSKM_YMD, 0);

						// 運用月と同月の申込みであるか判定
						if (JPCDateUtil.subtractMonth(mskmYmd, operateDate) == 0)
						{
							// 同月申込は照会モード
							inMap.put(OUT_PARAN_CHG_DIV, CHG_DIV_2);
						}
						else
						{
							// 上記以外は変更モード
							inMap.put(OUT_PARAN_CHG_DIV, CHG_DIV_1);
						}
						break;
					}
				}
				else
				{
					// 予約レコードが存在する場合は契約状態エラー
					setRelationErrorInfo(param, TEMPLATE_ID_EKK0351B003, ERROR_COLUMN_EKK0351B003, fixedText);
					throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)), String
							.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
				}
			}
		}
		finally
		{
			// 一時領域削除
			super.deleteTempArea(param, fixedText);
		}
		return param;
	}

	/**
	 * 上りマッピング項目設定(オプションサービス契約履歴一覧照会)
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param svcKeiNo サービス契約番号
	 * @throws RequestParameterException
	 */
	private void setInMapOpSvcKeiRirekiSearch(IRequestParameterReadWrite param, String fixedText, String svcKeiNo) throws RequestParameterException
	{

		// 機能コード設定(1:オプションサービス契約履歴一覧照会)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// リクエストパラメータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ＫＥＹ＿サービス契約番号
		inMap.put(EKK0351B003CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);
	}

	/**
	 * 上りマッピング項目設定(申込明細一意照会)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param mskmDtlNo 申込明細番号
	 * @throws RequestParameterException
	 */
	private void setInMapMskmDtlIchiShokai(IRequestParameterReadWrite param, String fixedText, String mskmDtlNo) throws RequestParameterException
	{

		// 機能コード設定(2:カレント)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_2);

		// リクエストパラメータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ＫＥＹ＿申込明細番号
		inMap.put(EKK0021A010CBSMsg.KEY_MSKM_DTL_NO, mskmDtlNo);
		// ＫＥＹ＿世代登録年月日時分秒
		inMap.put(EKK0021A010CBSMsg.KEY_GENE_ADD_DTM, null);
	}
}
