/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUHikkosiNaviRelCheck
*   ソースファイル名：JFUHikkosiNaviRelCheck.java
*   作成者          ：富士通
*   日付            ：2012年06月12日
*＜機能概要＞
*   引越しナビ住所変更申込関連チェックコモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v4.00       2012/06/12   FJ）中谷    新規作成【ANK-0274-00-00】Web受付引越し受付
*   v8.00       2014/04/02   FJ）中谷    変更【OM-2014-0001340】住変確定後のプラン変更申込エラー対応
*   
**********************************************************************/
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.ejb.cbs.cbsmsg.EKK0081B025CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081B025CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0161B004CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0161B004CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK1681B001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK1681B001CBSMsg1List;

/**
 * 引越しナビ住所変更申込関連チェックコモンコンポーネント部品
 * 
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUHikkosiNaviRelCheck extends JFUBaseNetChgRelCheckCC
{
	/** IN項目:ＫＥＹ＿サービス契約番号 */
	private static final String IN_PARAM_KEY_SVC_KEI_NO = "key_svc_kei_no";
	/** IN項目:ＫＥＹ＿整理番号 */
	private static final String IN_PARAM_KEY_SEIRI_NO = "key_seiri_no";

	/** OUT項目：住所変更有無 */
	private static final String OUT_PARAM_ADCHG_UM = "addchg_um";
	
	/* ===== 同一請求番号以外支払方法変更申込予約存在チェック ===== */
	/* ■□ サービス契約一覧照会（整理番号）SC ■□ */
	/** テンプレートID(サービス契約一覧照会（整理番号）) */
	private static final String TEMPLATE_ID_1 = "EKK0081B025";
	/** テンプレートID(サービス契約一覧照会（整理番号）明細) */
	private static final String TEMPLATE_ID_1_DETAIL = EKK0081B025CBSMsg.EKK0081B025CBSMSG1LIST;
	/** IN項目リスト(サービス契約一覧照会（整理番号）) */
	private static final List<String> IN_COLUMN_LIST_1 = Arrays.asList(EKK0081B025CBSMsg.KEY_SEIRI_NO);
	/** 関連チェックエラー項目(サービス契約一覧照会（整理番号）) */
	private static final String ERROR_COLUMN_1 = EKK0081B025CBSMsg.KEY_SEIRI_NO_ERR;
	/** 関連チェックエラー項目(サービス契約一覧照会（整理番号）) */
	private static final String ERROR_COLUMN_12 = "svckei_stat_stop_err";
	/** SC実行結果取得キー(サービス契約一覧照会（整理番号）) */
	private static final String TEMP_TEMPLATE_KEY_1 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_1 + TEMP_TEMPLATE_PRIFIX_SEP + "1";

	/* ===== 料金コース変更申込中チェック(テレビ)  ===== */
	/* ■□ サービス契約内訳一覧照会SC ■□ */
	/** テンプレートID(サービス契約内訳一覧照会) */
	private static final String TEMPLATE_ID_2 = "EKK0161B004";
	/** テンプレートID(サービス契約内訳一覧照会明細) */
	private static final String TEMPLATE_ID_2_DETAIL = EKK0161B004CBSMsg.EKK0161B004CBSMSG1LIST;
	/** IN項目リスト(サービス契約内訳一覧照会) */
	private static final List<String> IN_COLUMN_LIST_2 =
			Arrays.asList(EKK0161B004CBSMsg.KEY_SVC_KEI_NO, EKK0161B004CBSMsg.KEY_PCRS_CD, EKK0161B004CBSMsg.KEY_SVC_PRD_FLG);
	/** 関連チェックエラー項目(サービス契約内訳一覧照会) */
	private static final String ERROR_COLUMN_2 = EKK0161B004CBSMsg.KEY_SVC_KEI_NO_ERR;
	/** 関連チェックエラー項目(サービス契約内訳一覧照会) */
	private static final String ERROR_COLUMN_21 = "svckei_stat_stop_err";
	/** SC実行結果取得キー(サービス契約内訳一覧照会)(プラン変更中チェック) */
	private static final String TEMP_TEMPLATE_KEY_2 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_2 + TEMP_TEMPLATE_PRIFIX_SEP;

	/* ■□ 異動予約一覧照会SC ■□ */
	/** テンプレートID(異動予約一覧照会) */
	private static final String TEMPLATE_ID_3 = "EKK1681B001";
	/** テンプレートID(異動予約一覧照会明細) */
	private static final String TEMPLATE_ID_3_DETAIL = EKK1681B001CBSMsg.EKK1681B001CBSMSG1LIST;
	/** IN項目リスト(異動予約一覧照会) */
	private static final List<String> IN_COLUMN_LIST_3 =
			Arrays.asList(EKK1681B001CBSMsg.KEY_IDO_DIV, EKK1681B001CBSMsg.KEY_IDO_RSV_DTL_CD, EKK1681B001CBSMsg.KEY_RSV_APLY_YMD,
					EKK1681B001CBSMsg.KEY_IDO_RSV_STAT_CD, EKK1681B001CBSMsg.KEY_MSKM_DTL_NO, EKK1681B001CBSMsg.KEY_SYSID,
					EKK1681B001CBSMsg.KEY_SEIKY_KEI_NO, EKK1681B001CBSMsg.KEY_SVC_KEI_NO, EKK1681B001CBSMsg.KEY_SVC_KEI_UCWK_NO,
					EKK1681B001CBSMsg.KEY_OP_SVC_KEI_NO, EKK1681B001CBSMsg.KEY_SBOP_SVC_KEI_NO, EKK1681B001CBSMsg.KEY_KKTK_SVC_KEI_NO,
					EKK1681B001CBSMsg.KEY_WRIB_SVC_KEI_NO, EKK1681B001CBSMsg.KEY_SVC_KEI_KAISEN_UCWK_NO, EKK1681B001CBSMsg.KEY_HEIGO_SK_SYSID,
					EKK1681B001CBSMsg.KEY_BUNKATSU_SK_SYSID, EKK1681B001CBSMsg.KEY_HEIGO_SK_SEIKY_KEI_NO,
					EKK1681B001CBSMsg.KEY_BUNKATSU_SK_SEIKY_KEI_NO, EKK1681B001CBSMsg.KEY_KOJIAK_NO, EKK1681B001CBSMsg.KEY_OP_HKTGI_SK_SVC_KEI_NO,
					EKK1681B001CBSMsg.KEY_SORT_ITEM_NO, EKK1681B001CBSMsg.KEY_SORT_KBN);
	/** 関連チェックエラー項目(異動予約一覧照会) */
	private static final String ERROR_COLUMN_3 = "pcrs_chg_incomp_err";
	/** SC実行結果取得キー(異動予約一覧照会)(プラン変更中チェック) */
	private static final String TEMP_TEMPLATE_KEY_3 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_3 + TEMP_TEMPLATE_PRIFIX_SEP;

	/**
	 * 引越しナビ住所変更申込関連チェック実行処理
	 * 
	 * <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);

			// IN項目:ＫＥＹ＿サービス契約番号
			String inParamSvcKeiNo = (String)inMap.get(IN_PARAM_KEY_SVC_KEI_NO);
			// IN項目:ＫＥＹ＿整理番号
			String inParamSeiriNo = (String)inMap.get(IN_PARAM_KEY_SEIRI_NO);

			/* ■□ 料金コース変更申込中チェック(ネット) ■□ */
			// 検索失敗エラーなし設定
			ignoreSearchError(param, fixedText);
			executePcrsChgIncompCheck(handle, param, fixedText);

			// ●サービス契約一覧照会（整理番号）
			// ユーザデータ初期化
			initData(param, fixedText, IN_COLUMN_LIST_1);
			// 検索エラーなし設定
			ignoreSearchError(param, fixedText);
			// 上りマッピング
			setInMapSvcKeiSeiriNoSearch(param, fixedText, inParamSeiriNo);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_1, TEMPLATE_ID_1_DETAIL, IN_COLUMN_LIST_1, ERROR_COLUMN_1);

			for (HashMap svcKeiMap : getTemplateList(inMap, TEMP_TEMPLATE_KEY_1, TEMPLATE_ID_1_DETAIL))
			{
				// サービス契約番号
				String svcKeiNo = (String)svcKeiMap.get(EKK0081B025CBSMsg1List.SVC_KEI_NO);
				// 料金グループコード
				String prcGrpCd = (String)svcKeiMap.get(EKK0081B025CBSMsg1List.PRC_GRP_CD);
				// サービス契約ステータス
				String svcKeiStat = (String)svcKeiMap.get(EKK0081B025CBSMsg1List.SVC_KEI_STAT);

				// 解約、キャンセルは対象外
				if (!JFUStrConst.CD00037_910.equals(svcKeiStat) && !JFUStrConst.CD00037_920.equals(svcKeiStat))
				{
					// eo光テレビ(K-CAT)の場合
					if (JFUStrConst.CD00133_11.equals(prcGrpCd))
					{
						/* ■□ 料金コース変更申込中チェック(テレビ) ■□ */
						// ●サービス契約内訳一覧照会
						// ユーザデータ初期化
						initData(param, fixedText, IN_COLUMN_LIST_2);
						// 検索エラーなし設定
						ignoreSearchError(param, fixedText);
						// 上りマッピング
						setInMapSvcKeiUcwkSearch(param, fixedText, svcKeiNo);
						// サービスIF実行
						executeSC(handle, param, fixedText, TEMPLATE_ID_2, TEMPLATE_ID_2_DETAIL, IN_COLUMN_LIST_2, ERROR_COLUMN_2);
						List<HashMap> svcKeiUcwkList =
								getTemplateList(inMap, getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_2), TEMPLATE_ID_2_DETAIL);

						for (HashMap svcKeiUcwkMap : svcKeiUcwkList)
						{
							// サービス契約内訳番号
							String svcKeiUcwkNo = (String)svcKeiUcwkMap.get(EKK0161B004CBSMsg1List.SVC_KEI_UCWK_NO);
							// サービス契約内訳ステータス
							String svcKeiUcwkStat = (String)svcKeiUcwkMap.get(EKK0161B004CBSMsg1List.SVC_KEI_UCWK_STAT);

							// 休止・中断中、停止中はエラー
							if (JFUStrConst.CD00037_210.equals(svcKeiUcwkStat) || JFUStrConst.CD00037_220.equals(svcKeiUcwkStat))
							{
								// 休止・中断中、停止中エラー
								setRelationErrorInfo(param, TEMPLATE_ID_2, ERROR_COLUMN_21, fixedText);
								throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)), String
										.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
							}

							// ●異動予約一覧照会
							// ユーザデータ初期化
							initData(param, fixedText, IN_COLUMN_LIST_3);
							// 検索エラーなし設定
							ignoreSearchError(param, fixedText);
							// 上りマッピング
							setInMapIdoRsvSearch(param, fixedText, svcKeiUcwkNo);
							// サービスIF実行
							executeSC(handle, param, fixedText, TEMPLATE_ID_3, TEMPLATE_ID_3_DETAIL, IN_COLUMN_LIST_3, ERROR_COLUMN_3);

							List<HashMap> idoRsvListPcrs =
									getTemplateList((HashMap)param.getData(fixedText), getMaxTempTempleteKey(inMap, TEMP_TEMPLATE_KEY_3),
											TEMPLATE_ID_3_DETAIL);

							for (HashMap idoRsvMap : idoRsvListPcrs)
							{
								String idoRsvStatCd = (String)idoRsvMap.get(EKK1681B001CBSMsg1List.IDO_RSV_STAT_CD);
								// 予約手続き中、または、未反映はエラー
								if (JFUStrConst.CD01168_00.equals(idoRsvStatCd) || JFUStrConst.CD01168_03.equals(idoRsvStatCd))
								{
									// 料金コース変更申込中エラー
									setRelationErrorInfo(param, TEMPLATE_ID_3, ERROR_COLUMN_3, fixedText);
									throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)), String
											.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
								}
							}
						}

						/* ■□ 休止・中断中、停止中チェック ■□ */
						if (JFUStrConst.CD00037_210.equals(svcKeiStat) || JFUStrConst.CD00037_220.equals(svcKeiStat))
						{
							// 休止・中断中、停止中エラー
							setRelationErrorInfo(param, TEMPLATE_ID_1, ERROR_COLUMN_12, fixedText);
							throw new SCCallException(String.valueOf(param.getControlMapData(SCControlMapKeys.RETURN_MESSAGE)), String
									.valueOf(RETURN_CODE_NORMAL), JPCModelConstant.RELATION_ERR);
						}
						break;
					}
				}
			}

			// ネットのサービス契約番号で上書き
			inMap.put(BP_SVC_KEI_NO, inParamSvcKeiNo);

			/* ■□ 住所変更有無取得 ■□ */
			String adchgChkResult = getAdChgUmA(handle, param, fixedText);
			inMap.put(OUT_PARAM_ADCHG_UM, adchgChkResult);
			
			// 住所変更中でない場合
			if (!JFUStrConst.CD00002_1.equals(adchgChkResult))
			{
				/* ■□ 工事未完了チェック ■□ */
				executeUnderConstructionCheck(handle, param, fixedText);
			}
		}
		finally
		{
			// 一時領域削除
			super.deleteTempArea(param, fixedText);
		}
		return param;
	}

	/**
	 * 上りマッピング項目設定(サービス契約一覧照会（整理番号）)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param seiriNo 整理番号
	 * @throws RequestParameterException
	 */
	private void setInMapSvcKeiSeiriNoSearch(IRequestParameterReadWrite param, String fixedText, String seiriNo) throws RequestParameterException
	{
		// 機能コード設定(1)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ＫＥＹ＿整理番号
		inMap.put(EKK0081B025CBSMsg.KEY_SEIRI_NO, seiriNo);
	}

	/**
	 * 上りマッピング項目設定(サービス契約内訳一覧照会)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param svcKeiNo サービス契約番号
	 * @throws RequestParameterException
	 */
	private void setInMapSvcKeiUcwkSearch(IRequestParameterReadWrite param, String fixedText, String svcKeiNo) throws RequestParameterException
	{
		// 機能コード設定(1)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ＫＥＹ＿サービス契約番号
		inMap.put(EKK0161B004CBSMsg.KEY_SVC_KEI_NO, svcKeiNo);
	}

	/**
	 * 上りマッピング項目設定(異動予約一覧照会)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param svcKeiUcwkNo サービス契約内訳番号
	 * @throws RequestParameterException
	 */
	private void setInMapIdoRsvSearch(IRequestParameterReadWrite param, String fixedText, String svcKeiUcwkNo) throws RequestParameterException
	{
		// 機能コード設定(1)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// ユーザデータ取得
		HashMap inMap = (HashMap)param.getData(fixedText);

		// ＫＥＹ＿サービス契約内訳番号
		inMap.put(EKK1681B001CBSMsg.KEY_SVC_KEI_UCWK_NO, svcKeiUcwkNo);
		// ＫＥＹ＿異動区分
		inMap.put(EKK1681B001CBSMsg.KEY_IDO_DIV, JFUStrConst.CD00576_00018);
		// ＫＥＹ＿異動予約詳細コード
		inMap.put(EKK1681B001CBSMsg.KEY_IDO_RSV_DTL_CD, JFUStrConst.CD01167_003);
	}
}
