/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUWribSvcCancelCC
*   ソースファイル名：JFUWribSvcCancelCC.java
*   作成者          ：富士通
*   日付            ：2016年03月22日
*＜機能概要＞
*   割引サービスキャンセルコモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v23.00      2016/03/22   FJ)岡井     【ANK-2786-00-00】訪販フロントシステムキャンペーンの追加
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
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.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0451A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0451B005CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451B005CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0451C070CBSMsg;

/**
 * 割引サービスキャンセルコモンコンポーネント部品です。
 * 
 * <br>
 * @author 富士通
 */
public class JFUWribSvcCancelCC extends JFUBaseCC
{
	// ■割引サービス契約一覧照会（SYSID）
	/** テンプレートID */
	private static final String TEMP_EKK0451B005 = "EKK0451B005";
	/** テンプレートID(明細) */
	private static final String TEMP_DTL_EKK0451B005 = EKK0451B005CBSMsg.EKK0451B005CBSMSG1LIST;
	/** IN項目リスト */
	private static final List<String> IN_COL_LIST_EKK0451B005 = Arrays.asList(EKK0451B005CBSMsg.KEY_SYSID);
	/** 関連チェックエラー項目 */
	private static final String ERR_COL_EKK0451B005 = EKK0451B005CBSMsg.KEY_SYSID_ERR;
	/** SC実行結果取得キー(割引サービス契約一覧照会（SYSID）) */
	private static final String TEMP_GET_KEY_EKK0451B005 = TEMP_TEMPLATE_PRIFIX + TEMP_EKK0451B005 + TEMP_TEMPLATE_PRIFIX_SEP;

	// ■割引サービス契約一意照会
	/** テンプレートID */
	private static final String TEMP_EKK0451A010 = "EKK0451A010";
	/** テンプレートID(明細) */
	private static final String TEMP_DTL_EKK0451A010 = EKK0451A010CBSMsg.EKK0451A010CBSMSG1LIST;
	/** IN項目リスト */
	private static final List<String> IN_COL_LIST_EKK0451A010 = Arrays.asList(EKK0451A010CBSMsg.KEY_WRIB_SVC_KEI_NO,
			EKK0451A010CBSMsg.KEY_RSV_APLY_YMD);
	/** 関連チェックエラー項目 */
	private static final String ERR_COL_EKK0451A010 = EKK0451A010CBSMsg.KEY_WRIB_SVC_KEI_NO_ERR;
	/** SC実行結果取得キー(割引サービス契約一意照会) */
	private static final String TEMP_GET_KEY_EKK0451A010 = TEMP_TEMPLATE_PRIFIX + TEMP_EKK0451A010 + TEMP_TEMPLATE_PRIFIX_SEP;

	// ■割引サービス契約キャンセル
	/** テンプレートID */
	private static final String TEMP_EKK0451C070 = "EKK0451C070";
	/** テンプレートID(明細) */
	private static final String TEMP_DTL_EKK0451C070 = null;
	/** IN項目リスト */
	private static final List<String> IN_COL_LIST_EKK0451C070 = Arrays.asList(EKK0451C070CBSMsg.WRIB_SVC_KEI_NO,
			EKK0451C070CBSMsg.SVC_CANCEL_RSN_CD, EKK0451C070CBSMsg.IDO_DIV, EKK0451C070CBSMsg.UPD_DTM_BF,
			EKK0451C070CBSMsg.MSKM_DTL_NO);
	/** 関連チェックエラー項目 */
	private static final String ERR_COL_EKK0451C070 = EKK0451C070CBSMsg.WRIB_SVC_KEI_NO_ERR;

	// ■IN項目ID
	/** IN項目ID：SYSID */
	private static final String IN_SYSID = "in_sysid";
	/** IN項目ID：割引サービスコード(カンマ区切り) */
	private static final String IN_CANCEL_WRIB_SVC_CD = "cancel_wrib_svc_cd";
	/** IN項目ID：タブレット申込有無 */
	private static final String IN_SMLN_TABLET_MSKM_UM = "smln_tablet_mskm_um";
	/** IN項目ID：異動区分 */
	private static final String IN_IDO_DIV = "in_ido_div";
	/** IN項目ID：申込明細番号 */
	private static final String IN_MSKM_DTL_NO = "in_mskm_dtl_no";

	// ■その他
	/** 対象割引サービスステータス */
	private static final List<String> TG_WRIB_SVC_STAT = Arrays.asList(JFUStrConst.CD00055_010);

	/**
	 * 割引サービスキャンセル処理です。
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// ユーザデータ
		HashMap inMap = (HashMap)param.getData(fixedText);

		// 実行判定
		if(inMap == null || inMap.size() == 0)
		{
			outDebugLog("情報が設定されていない為、実行しない。");
			return param;
		}

		// IN項目チェック
		if(!chkInParams(inMap))
		{
			outDebugLog("IN項目値不正、または、実行不要の為、実行しない。");
			return param;
		}

		// 割引サービス契約一覧照会
		List wribSvcKeiList = getWribSvcKeiList(handle, param, fixedText);

		// 割引サービス契約一覧照会結果チェック
		if(wribSvcKeiList == null || wribSvcKeiList.size() == 0)
		{
			outDebugLog("キャンセル対象の割引サービス契約が存在しない為、処理を終了する。");
			return param;
		}

		// ●割引サービス契約キャンセル
		cancelWribSvcKei(handle, param, fixedText, wribSvcKeiList);

		return param;
	}

	/**
	 * チェック処理です。
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return チェック処理用マップ
	 * @throws Exception 
	 */
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		return null;
	}

	/**
	 * IN項目の値をチェックします。
	 * 
	 * <br>
	 * @param inParamMap ユーザデータ
	 * @return true:OK / false:NG
	 */
	@SuppressWarnings("unchecked")
	private boolean chkInParams(HashMap inMap)
	{
		boolean result = true;

		// 値チェック
		// SYSID
		if(JFUBPCommon.isNull((String)inMap.get(IN_SYSID)))
		{
			// 値が未設定
			result = false;
		}

		// 割引サービスコード(カンマ区切り)
		if(JFUBPCommon.isNull((String)inMap.get(IN_CANCEL_WRIB_SVC_CD)))
		{
			// 値が未設定
			result = false;
		}

		// 実行判定チェック
		// スマートリンクタブレット申込有無
		if(JFUBPCommon.isNull((String)inMap.get(IN_SMLN_TABLET_MSKM_UM))
			|| !JFUStrConst.CD00002_0.equals((String)inMap.get(IN_SMLN_TABLET_MSKM_UM)))
		{
			// 値が未設定、または、無以外
			result = false;
		}

		return result;
	}

	/**
	 * 割引サービス契約一覧照会処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private List getWribSvcKeiList(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// ユーザデータ
		HashMap inMap = (HashMap)param.getData(fixedText);
		// 結果リスト
		ArrayList wribSvcList = new ArrayList();

		// ●割引サービス契約一覧照会（SYSID）
		// ユーザデータ初期化
		initData(param, fixedText, IN_COL_LIST_EKK0451B005);
		// 上りマッピング
		setEKK0451B005(param, fixedText, inMap);
		// サービスIF実行
		executeSC(handle, param, fixedText, TEMP_EKK0451B005, TEMP_DTL_EKK0451B005, IN_COL_LIST_EKK0451B005, ERR_COL_EKK0451B005);
		// 明細取得
		List eKK0451B005List = getTemplateList(inMap, getMaxTempTempleteKey(inMap, TEMP_GET_KEY_EKK0451B005), TEMP_DTL_EKK0451B005);

		// 割引サービス契約一覧照会結果無しで終了
		if(eKK0451B005List == null || eKK0451B005List.size() == 0)
		{
			return wribSvcList;
		}

		// 無効なステータスを除外する
		for (int i = 0; i < eKK0451B005List.size(); i++)
		{
			HashMap childMap = (HashMap)eKK0451B005List.get(i);
			if(childMap == null || childMap.size() == 0)
			{
				continue;
			}

			String wribSvcStat = (String)childMap.get(EKK0451B005CBSMsg1List.WRIB_SVC_KEI_STAT);
			if(JFUBPCommon.isNull(wribSvcStat) || !TG_WRIB_SVC_STAT.contains(wribSvcStat))
			{
				outDebugLog("対象外ステータス割引サービス契約番号：" + (String)childMap.get(EKK0451B005CBSMsg1List.WRIB_SVC_KEI_NO));
				continue;
			}

			// 除外しない割引サービス情報を格納
			wribSvcList.add(childMap);
		}

		return wribSvcList;
	}

	/**
	 * 割引サービス契約キャンセル処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	private void cancelWribSvcKei(SessionHandle handle, IRequestParameterReadWrite param, String fixedText,
			List wribSvcKeiList) throws Exception
	{
		// ユーザデータ
		HashMap inMap = (HashMap)param.getData(fixedText);

		// キャンセル対象の割引サービスコードをリストに格納
		List<String> cancelWribsvcCdList = new ArrayList<String>();
		if(((String)inMap.get(IN_CANCEL_WRIB_SVC_CD)).contains(JFUStrConst.COMMA))
		{
			// カンマ区切りである場合、配列からリストに格納する
			String[] cancelList = ((String)inMap.get(IN_CANCEL_WRIB_SVC_CD)).split(JFUStrConst.COMMA);
			for (int i = 0; i < cancelList.length; i++)
			{
				String val = cancelList[i];
				if(!JFUBPCommon.isNull(val))
				{
					cancelWribsvcCdList.add(val);
				}
			}
		}
		else
		{
			// カンマ区切りでない場合、直でリストに格納する
			cancelWribsvcCdList.add((String)inMap.get(IN_CANCEL_WRIB_SVC_CD));
		}

		outDebugLog("キャンセル割引サービスコードリスト：" + cancelWribsvcCdList);

		// キャンセル対象が存在しない場合、処理を終了
		if(cancelWribsvcCdList == null || cancelWribsvcCdList.size() == 0)
		{
			return;
		}

		// キャンセル処理
		for (int i = 0; i < wribSvcKeiList.size(); i++)
		{
			HashMap childMap = (HashMap)wribSvcKeiList.get(i);

			// 割引サービスコードで判定
			String wribSvcCd = (String)childMap.get(EKK0451B005CBSMsg1List.WRIB_SVC_CD);
			if(JFUBPCommon.isNull(wribSvcCd) || !cancelWribsvcCdList.contains(wribSvcCd))
			{
				// キャンセル対象でない場合、処理しない
				outDebugLog("対象外割引サービス契約番号：" + (String)childMap.get(EKK0451B005CBSMsg1List.WRIB_SVC_KEI_NO));
				continue;
			}

			// 割引サービス契約番号
			String wribSvcKeiNo = (String)childMap.get(EKK0451B005CBSMsg1List.WRIB_SVC_KEI_NO);

			// ●割引サービス契約一意照会
			// ユーザデータ初期化
			initData(param, fixedText, IN_COL_LIST_EKK0451A010);
			// 上りマッピング
			setEKK0451A010(param, fixedText, inMap, wribSvcKeiNo);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMP_EKK0451A010, TEMP_DTL_EKK0451A010, IN_COL_LIST_EKK0451A010, ERR_COL_EKK0451A010);

			// 最終更新年月日時分秒を取得(カレント取得の為、1件目のデータを使用)
			String lastUpdDtmBf = getTemplateListValue(inMap, getMaxTempTempleteKey(inMap, TEMP_GET_KEY_EKK0451A010), TEMP_DTL_EKK0451A010,
					EKK0451A010CBSMsg1List.LAST_UPD_DTM, 0);

			outDebugLog("最終更新年月日時分秒：" + lastUpdDtmBf);

			if(JFUBPCommon.isNull(lastUpdDtmBf))
			{
				// データが取得できない場合、次の処理へ
				continue;
			}

			// ●割引サービス契約キャンセル
			// ユーザデータ初期化
			initData(param, fixedText, IN_COL_LIST_EKK0451C070);
			// 上りマッピング
			setEKK0451C070(param, fixedText, inMap, wribSvcKeiNo, lastUpdDtmBf);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMP_EKK0451C070, TEMP_DTL_EKK0451C070, IN_COL_LIST_EKK0451C070, ERR_COL_EKK0451C070);
		}
	}

	/**
	 * 割引サービス契約一覧照会（SYSID）の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param resultMap 結果マップ
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	private void setEKK0451B005(IRequestParameterReadWrite param, String fixedText, HashMap inMap) throws Exception
	{
		// 機能コード
		inMap.put(EKK0451B005CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);
		// 検索エラーなし
		inMap.put(IGNORE_SEARCH_ERR, true);
		// KEY_SYSID
		inMap.put(EKK0451B005CBSMsg.KEY_SYSID, inMap.get(IN_SYSID));
	}

	/**
	 * 割引サービス契約一意照会の上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param resultMap 結果マップ
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	private void setEKK0451A010(IRequestParameterReadWrite param, String fixedText, HashMap inMap, String wribSvcKeiNo) throws Exception
	{
		// 機能コード
		inMap.put(EKK0451A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2);
		// 検索エラーなし
		inMap.put(IGNORE_SEARCH_ERR, true);
		// ＫＥＹ＿割引サービス契約番号
		inMap.put(EKK0451A010CBSMsg.KEY_WRIB_SVC_KEI_NO, wribSvcKeiNo);
		// ＫＥＹ＿予約適用年月日
		inMap.put(EKK0451A010CBSMsg.KEY_RSV_APLY_YMD, JFUBPCommon.getOpeDate(null));
	}

	/**
	 * 割引サービス契約キャンセルの上りマッピング処理です。
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ文字列
	 * @param svcKeiNo サービス契約番号
	 * @throws Exception 例外
	 */
	@SuppressWarnings("unchecked")
	private void setEKK0451C070(IRequestParameterReadWrite param, String fixedText, HashMap inMap, String wribSvcKeiNo,
			String updDtmBf) throws Exception
	{
		// 機能コード
		inMap.put(EKK0451C070CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1);
		// 検索エラーなし
		inMap.put(IGNORE_SEARCH_ERR, true);
		// 割引サービス契約番号
		inMap.put(EKK0451C070CBSMsg.WRIB_SVC_KEI_NO, wribSvcKeiNo);
		// 申込明細番号
		inMap.put(EKK0451C070CBSMsg.MSKM_DTL_NO, inMap.get(IN_MSKM_DTL_NO));
		// サービスキャンセル理由コード
		inMap.put(EKK0451C070CBSMsg.SVC_CANCEL_RSN_CD, JFUStrConst.CD01390_05);
		// 異動区分
		inMap.put(EKK0451C070CBSMsg.IDO_DIV, inMap.get(IN_IDO_DIV));
		// 更新年月日時分秒(更新前)
		inMap.put(EKK0451C070CBSMsg.UPD_DTM_BF, updDtmBf);
	}

	/**
	 * デバッグログを出力します。
	 * 
	 * @param dumpObj 出力するオブジェクト
	 */
	private void outDebugLog(Object dumpObj)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), dumpObj, null, null, null);
	}
}