/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUCngSvcKeiTv01CC
*   ソースファイル名：JFUCngSvcKeiTv01CC.java
*   作成者          ：富士通
*   日付            ：2011年09月29日
*＜機能概要＞
*   eo光テレビ登録(コース変更)コンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/09/29   FJ）川端    新規作成
*   v4.00       2012/09/12   FJ) 美濃原 【IT1-2012-0001537】 即時/翌月のパラメータ追加
*   v4.00       2012/11/20   FJ）知識    変更【IT1-2012-0001900】キャンペーン登録時の「割引サービス契約＜値引型＞開始」呼び出し
*   v5.00       2013/02/14   FJ）文元   【ST2-2013-0000685】 サービス契約内訳料金プラン変更IFのパラメータ(プラン課金開始年月日、等)を追加
*   v5.00       2013/03/05   FJ）中谷   【OT-2013-0000276】サービス契約内訳プラン変更の工事有無の指定漏れ対応。
*   v5.00       2013/05/23   FJ）文元   【ANK-1523-00-00】〔現行システム対応〕フロントＳテレビキャンペーン対応
*   v5.00       2013/09/09   FJ）谷本   【OM-2013-0001423】テレビのコース変更の予約適用開始年月日の修正
*   
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.text.ParseException;
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.exception.RequestParameterException;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.ejb.cbs.cbsmsg.EKK0011D020CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0161C110CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0161C120CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341D010CBSMsg;

/**
 * eo光テレビ登録(コース変更)コンポーネント部品
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUCngSvcKeiTv01CC extends JFUBaseTvChgCommonCC
{

	/** コース変更用リスト */
	private static final String DATE_HASHMAP_CHILDMAP = "cclist_pcrs_cng";

	/* ■□ サービス契約内訳料金プラン変更SC ■□ */
	/** テンプレートID(サービス契約<eo光TV>料金プラン変更) */
	private static final String TEMPLATE_ID_PPLAN_CHG = "EKK0161C110";
	/** IN項目リスト(サービス契約<eo光TV>料金プラン変更) */
	private static final List<String> IN_COLUMN_LIST_PPLAN_CHG =
			Arrays.asList(EKK0161C110CBSMsg.SVC_KEI_UCWK_NO, EKK0161C110CBSMsg.MSKM_DTL_NO, EKK0161C110CBSMsg.PCRS_CD, EKK0161C110CBSMsg.PPLAN_CD,
					EKK0161C110CBSMsg.TK_HOSHIKI_KEI_NO, EKK0161C110CBSMsg.RSV_APLY_YMD, EKK0161C110CBSMsg.PNLTY_HASSEI_CD,
					EKK0161C110CBSMsg.IDO_DIV, EKK0161C110CBSMsg.UPD_DTM_BF, EKK0161C110CBSMsg.PLAN_CHRG_STAYMD, EKK0161C110CBSMsg.PLAN_CHRG_ENDYMD,
					EKK0161C110CBSMsg.SKJ_YKGT, EKK0161C110CBSMsg.KOJI_UM);

	/* ■□ サービス契約内訳料金プラン変更確定SC ■□ */
	/** テンプレートID(サービス契約内訳料金プラン変更確定) */
	private static final String TEMPLATE_ID_PPLAN_FIX = "EKK0161C120";
	/** IN項目リスト(サービス契約内訳料金プラン変更確定) */
	private static final List<String> IN_COLUMN_LIST_PPLAN_FIX =
			Arrays.asList(EKK0161C120CBSMsg.SVC_KEI_UCWK_NO, EKK0161C120CBSMsg.RSV_APLY_YMD, EKK0161C120CBSMsg.PLAN_CHRG_STAYMD,
					EKK0161C120CBSMsg.UPD_DTM_BF, EKK0161C120CBSMsg.KKSHKA_UM, EKK0161C120CBSMsg.KOJI_UM, EKK0161C120CBSMsg.PLAN_CHRG_ENDYMD,
					EKK0161C120CBSMsg.SKJ_YKGT);

	/** 排他テーブル用更新年月日時分秒（サービス契約） */
	protected static final String SVC_KEI_UPD_DTM = "svc_kei_upd_dtm";

	/** 有 */
	protected static final String ARI = "1";

	/** 無 */
	protected static final String NASI = "0";

	/**
	 * eo光テレビ登録(コース変更)実行処理<br>
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception 例外
	 */
	public IRequestParameterReadWrite cngTvTrk(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{

		HashMap<String, Object> inMap_FUSV012701SC = (HashMap<String, Object>)(param.getData("FUSV012701SC"));
		ArrayList<Object> workLst_FUSV012701SC = (ArrayList<Object>)inMap_FUSV012701SC.get("EKK0011D020CBSMsg1List");
		HashMap<String, Object> workMap_FUSV012701SC = (HashMap<String, Object>)workLst_FUSV012701SC.get(0);

		// 申込明細番号
		String mskmDtlNo = (String)workMap_FUSV012701SC.get(EKK0011D020CBSMsg1List.MSKM_DTL_NO);

		// 機能コード取得
		String funcCode = getFuncCode(param, fixedText);

		HashMap<String, Object> inMap = (HashMap<String, Object>)(param.getData(fixedText));
		ArrayList<Object> workLst = (ArrayList<Object>)inMap.get(DATE_HASHMAP_CHILDMAP);

		// 更新年月日時分秒
		String updDtmBf = (String)inMap.get("kk0081_upd_dtm_bf");

		inMap.put(SVC_KEI_UPD_DTM, updDtmBf);

		// 運用日付を取得
		String opeDate = JFUBPCommon.getOpeDate(null);
		// 予約適用年月日(初期値：翌月月初)
		String rsvAplyYmd = JFUBPCommon.getBeginOfNextMonthOnlineDate(opeDate);
		// 即時/翌月(初期値：翌月)
		String skjYkgt = JFUStrConst.SKJ_YKGT_YKGT;

		int tvCnt = workLst.size();
		for (int i = 0; i < tvCnt; i++)
		{
			HashMap<String, Object> workMap = (HashMap<String, Object>)workLst.get(i);
			workMap.put(EKK0341D010CBSMsg.MSKM_DTL_NO, mskmDtlNo);

			//変更前料金プランコードと変更後料金プランコードが異なる場合以後の処理を行う
			if (workMap.get("prv_pplan_cd").equals(workMap.get("bac_pplan_cd")))
			{
				continue;
			}

			// ●サービス契約内訳料金プラン変更
			// 上りマッピング
			setInMapPplanChg(param, fixedText, i, rsvAplyYmd, skjYkgt);
			//検索エラーなし設定
			ignoreSearchError(param, fixedText);
			// サービスIF実行
			executeSC(handle, param, fixedText, TEMPLATE_ID_PPLAN_CHG, BLANK, IN_COLUMN_LIST_PPLAN_CHG, BLANK);
			// 下りマッピング
			setOutMapPplanChg(param, fixedText, i, funcCode);

			// 実行判定
			// 機能コードが"1"(チェック＆登録)の場合
			if (JPCModelConstant.FUNC_CD_1.equals(funcCode))
			{
				// ●サービス契約内訳料金プラン変更確定
				// 上りマッピング
				setInMapPplanFix(param, fixedText, i, opeDate, rsvAplyYmd, skjYkgt);
				//検索エラーなし設定
				ignoreSearchError(param, fixedText);
				// サービスIF実行
				executeSC(handle, param, fixedText, TEMPLATE_ID_PPLAN_FIX, BLANK, IN_COLUMN_LIST_PPLAN_FIX, BLANK);
				// 下りマッピング
				setOutMapPplanFix(param, fixedText, i);
			}

		}

		return param;
	}

	/**
	 * 上りマッピング項目設定(サービス契約内訳料金プラン変更)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param cnt カウント
	 * @param rsvAplyYmd 予約適用日
	 * @param skjYkgt 即時/翌月 
	 * @throws RequestParameterException
	 * @throws ParseException 
	 */
	private void setInMapPplanChg(IRequestParameterReadWrite param, String fixedText, int cnt, String rsvAplyYmd, String skjYkgt)
			throws RequestParameterException, ParseException
	{
		// ユーザデータ取得
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		ArrayList<Object> inMapLst = (ArrayList<Object>)inMap.get(DATE_HASHMAP_CHILDMAP);
		HashMap<String, Object> workMapLst = (HashMap<String, Object>)inMapLst.get(cnt);

		// サービス契約内訳番号
		inMap.put(EKK0161C110CBSMsg.SVC_KEI_UCWK_NO, workMapLst.get("kk0161_svc_kei_ucwk_no"));
		// 料金コースコード
		inMap.put(EKK0161C110CBSMsg.PCRS_CD, workMapLst.get("kk0161_pcrs_cd"));
		// 料金プランコード
		inMap.put(EKK0161C110CBSMsg.PPLAN_CD, workMapLst.get("kk0161_pplan_cd"));
		// 提供方式契約番号
		inMap.put(EKK0161C110CBSMsg.TK_HOSHIKI_KEI_NO, inMap.get("tk_hoshiki_kei_no"));
		// 予約適用年月日
		inMap.put(EKK0161C110CBSMsg.RSV_APLY_YMD, rsvAplyYmd);
		// 違約金発生コード
		inMap.put(EKK0161C110CBSMsg.PNLTY_HASSEI_CD, "");
		// 異動区分
		inMap.put(EKK0161C110CBSMsg.IDO_DIV, JFUStrConst.CD00576_00068);
		// 更新年月日時分秒(更新前)
		inMap.put(EKK0161C110CBSMsg.UPD_DTM_BF, inMap.get(SVC_KEI_UPD_DTM));
		// プラン課金開始年月日
		inMap.put(EKK0161C110CBSMsg.PLAN_CHRG_STAYMD, rsvAplyYmd);
		// プラン課金終了年月日
		inMap.put(EKK0161C110CBSMsg.PLAN_CHRG_ENDYMD, JFUBPCommon.addSubtractDay(rsvAplyYmd, -1));
		// 即時/翌月
		inMap.put(EKK0161C110CBSMsg.SKJ_YKGT, skjYkgt);
		// 工事有無
		inMap.put(EKK0161C110CBSMsg.KOJI_UM, JFUStrConst.CD00002_0);

		//申込明細番号
		HashMap<String, Object> inMap_FUSV012701SC = (HashMap<String, Object>)(param.getData("FUSV012701SC"));
		ArrayList<Object> workLst_FUSV012701SC = (ArrayList<Object>)inMap_FUSV012701SC.get("EKK0011D020CBSMsg1List");
		HashMap<String, Object> workMap_FUSV012701SC = (HashMap<String, Object>)workLst_FUSV012701SC.get(0);
		inMap.put(EKK0161C110CBSMsg.MSKM_DTL_NO, workMap_FUSV012701SC.get(EKK0011D020CBSMsg1List.MSKM_DTL_NO));
	}

	/**
	 * 下りマッピング項目設定(サービス契約内訳料金プラン変更)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param cnt カウント
	 * @throws RequestParameterException
	 * @throws ParseException 
	 */
	private void setOutMapPplanChg(IRequestParameterReadWrite param, String fixedText, int cnt, String funcCode) throws RequestParameterException,
			ParseException
	{
		// ユーザデータ取得
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		ArrayList<Object> inMapLst = (ArrayList<Object>)inMap.get(DATE_HASHMAP_CHILDMAP);
		HashMap<String, Object> workMapLst = (HashMap<String, Object>)inMapLst.get(cnt);

		// 登録年月日時分秒
		workMapLst.put(EKK0161C110CBSMsg.ADD_DTM, inMap.get(EKK0161C110CBSMsg.ADD_DTM));
		// 登録オペレータアカウント
		workMapLst.put(EKK0161C110CBSMsg.ADD_OPEACNT, inMap.get(EKK0161C110CBSMsg.ADD_OPEACNT));
		// 更新年月日時分秒
		workMapLst.put(EKK0161C110CBSMsg.UPD_DTM, inMap.get(EKK0161C110CBSMsg.UPD_DTM));
		// 更新オペレータアカウント
		workMapLst.put(EKK0161C110CBSMsg.UPD_OPEACNT, inMap.get(EKK0161C110CBSMsg.UPD_OPEACNT));
		// 無効フラグ
		workMapLst.put(EKK0161C110CBSMsg.MK_FLG, inMap.get(EKK0161C110CBSMsg.MK_FLG));

		if ("1".equals(funcCode))
		{
			// 排他テーブル用更新年月日時分秒（サービス契約）
			inMap.put(SVC_KEI_UPD_DTM, inMap.get(EKK0161C110CBSMsg.UPD_DTM));
		}

		// 排他テーブル用更新年月日時分秒（サービス契約）

	}

	/**
	 * 上りマッピング項目設定(サービス契約内訳料金プラン変更確定)
	 * 
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param cnt カウント
	 * @param opeDate 運用日付
	 * @param rsvAplyYmd 予約適用日
	 * @param skjYkgt 即時/翌月
	 * @throws RequestParameterException
	 * @throws ParseException 
	 */
	private void setInMapPplanFix(IRequestParameterReadWrite param, String fixedText, int cnt, String opeDate, String rsvAplyYmd, String skjYkgt)
			throws RequestParameterException, ParseException
	{
		// ユーザデータ取得
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		ArrayList<Object> inMapLst = (ArrayList<Object>)inMap.get(DATE_HASHMAP_CHILDMAP);
		HashMap<String, Object> workMapLst = (HashMap<String, Object>)inMapLst.get(cnt);

		// サービス契約内訳番号
		inMap.put(EKK0161C120CBSMsg.SVC_KEI_UCWK_NO, workMapLst.get("kk0161_svc_kei_ucwk_no"));
		// 予約適用年月日
		inMap.put(EKK0161C120CBSMsg.RSV_APLY_YMD, rsvAplyYmd);
		// プラン課金開始年月日
		inMap.put(EKK0161C120CBSMsg.PLAN_CHRG_STAYMD, rsvAplyYmd);
		// プラン課金終了年月日
		inMap.put(EKK0161C120CBSMsg.PLAN_CHRG_ENDYMD, JFUBPCommon.addSubtractDay(rsvAplyYmd, -1));
		// 更新年月日時分秒(更新前)
		inMap.put(EKK0161C120CBSMsg.UPD_DTM_BF, inMap.get(SVC_KEI_UPD_DTM));
		// 機器出荷有無
		inMap.put(EKK0161C120CBSMsg.KKSHKA_UM, NASI);
		// 工事有無
		inMap.put(EKK0161C120CBSMsg.KOJI_UM, NASI);
		// 即時/翌月
		inMap.put(EKK0161C120CBSMsg.SKJ_YKGT, skjYkgt);

	}

	/**
	* 下りマッピング項目設定(サービス契約内訳料金プラン変更確定)
	* 
	* <br>
	* @param param リクエストパラメータ
	* @param fixedText サービスメッセージ
	* @param cnt カウント
	* @throws RequestParameterException
	* @throws ParseException 
	*/
	private void setOutMapPplanFix(IRequestParameterReadWrite param, String fixedText, int cnt) throws RequestParameterException, ParseException
	{
		// ユーザデータ取得
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);
		ArrayList<Object> inMapLst = (ArrayList<Object>)inMap.get(DATE_HASHMAP_CHILDMAP);
		HashMap<String, Object> workMapLst = (HashMap<String, Object>)inMapLst.get(cnt);

		// 世代登録年月日時分秒
		workMapLst.put(EKK0161C120CBSMsg.GENE_ADD_DTM, inMap.get(EKK0161C120CBSMsg.GENE_ADD_DTM));
		// 更新年月日時分秒
		workMapLst.put(EKK0161C120CBSMsg.UPD_DTM, inMap.get(EKK0161C120CBSMsg.UPD_DTM));
		// 更新オペレータアカウント
		workMapLst.put(EKK0161C120CBSMsg.UPD_OPEACNT, inMap.get(EKK0161C120CBSMsg.UPD_OPEACNT));

		// 排他テーブル用更新年月日時分秒（サービス契約）
		inMap.put(SVC_KEI_UPD_DTM, inMap.get(EKK0161C120CBSMsg.UPD_DTM));
	}

	/**
	 * チェック処理
	 * 
	 * <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;
	}
}
