/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKKojiWrisvcAutoAplyCC
*	ソースファイル名：JKKKojiWrisvcAutoAplyCC.java
*	作成者			：FJ
*	日付			：2012年03月27日
*＜機能概要＞
*	工事割引サービス自動適用コモンコンポーネント
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/03/27	FJ			新規作成
*	v5.00.00	2013/11/05	FJ) 中井	【OM-2013-0003779】対応
*	v75.00.00	2025/04/21	 FJ)柴田	【ANK-4673-00-00】テレビ新コース（スカパー用）導入対応　2025年6月フォロー案件
*	v75.01.00	2025/05/24	FJ) 星野	【ANK-4673-00-00】テレビ新コース（スカパー用）導入対応　2025年6月フォロー案件
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;

/**
 * 工事割引サービス自動適用クラス
 * @author 富士通
 */
public class JKKKojiWrisvcAutoAplyCC extends AbstractCommonComponent
{
	/** STB撤去（チェック有）*/
	private static final String STB_TEKKYO_TEKKYO = "1";
	
	/** STB撤去（チェック無）*/
	private static final String STB_TEKKYO_NASI = "0";

	/**
	 * 割引サービス自動適用CCを実施します。<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
		// ユーザデータ情報
		HashMap inMap = (HashMap)param.getData(fixedText);
		if (inMap == null)
		{
			return param;
		}
		// 作業領域の取得
		Map<Object, Object> workMap = param.getMappingWorkArea();
		// 申込番号
		inMap.put("mskm_no", (String)workMap.get("mskm_no"));
		
		// 割引サービス自動適用CC
		JKKWrisvcAutoAplyCC wrisvcAutoAplyCC = new JKKWrisvcAutoAplyCC();
		
		// サービス契約グループリスト
		ArrayList<HashMap<String, Object>> svcKeiGrpList = null;
		HashMap<String, Object> svcKeiGrpMap = null;
		
		// サービス契約リスト
		ArrayList<HashMap<String, Object>> svcKeiList = null;
		/* ++++++++++ v5.00.00 追加開始 ++++++++++ */
		String stbTekkyo = "";
		HashMap<String, Object> kojiInfMap = (HashMap)param.getData("kojiakInfoMap");
		if(kojiInfMap != null)
		{
			stbTekkyo = (String)kojiInfMap.get("stb_tekkyo");
		}
		// 判定値と比較
		if (STB_TEKKYO_TEKKYO.equals(stbTekkyo))
		{
		/* ++++++++++ v5.00.00 追加終了 ++++++++++ */
		
			// 登録
			HashMap createMap = (HashMap)param.getData("KikiInfoAddMap");
			// 機器提供サービス契約
			ArrayList createKikiList = (ArrayList)createMap.get("create_list");
			svcKeiList = setKktkSvc(createKikiList);
			svcKeiGrpMap = new HashMap<String, Object>();
			svcKeiGrpList = setSvcKeiGrpList(svcKeiGrpMap);
			if (svcKeiList.size() > 0)
			{
				// サービス契約リスト
				svcKeiGrpMap.put("svc_kei_list", svcKeiList);
				// サービス契約グループリスト
				inMap.put("svc_kei_grp_list", svcKeiGrpList);
				// 登録／変更区分
				inMap.put("add_chge_div", "01");
				// サービス解約理由コード
				inMap.put("svc_dlre_cd", "");
				// サービスキャンセル理由コード
				inMap.put("svc_cancel_rsn_cd", "");
				// 割引サービス自動適用CC実行
				wrisvcAutoAplyCC.execute(handle, param, fixedText);
			}
			// サービス契約内訳
			ArrayList createSvcUcwkList = (ArrayList)createMap.get("svc_kei_ucwk_list");
			svcKeiList = setSvcUcwk(createSvcUcwkList);
			svcKeiGrpMap = new HashMap<String, Object>();
			svcKeiGrpList = setSvcKeiGrpList(svcKeiGrpMap);
			if (svcKeiList.size() > 0)
			{
				// サービス契約リスト
				svcKeiGrpMap.put("svc_kei_list", svcKeiList);
				// サービス契約グループリスト
				inMap.put("svc_kei_grp_list", svcKeiGrpList);
				// 登録／変更区分
				inMap.put("add_chge_div", "01");
				// サービス解約理由コード
				inMap.put("svc_dlre_cd", "");
				// サービスキャンセル理由コード
				inMap.put("svc_cancel_rsn_cd", "");
				// 割引サービス自動適用CC実行
				wrisvcAutoAplyCC.execute(handle, param, fixedText);
			}
			
			// 解約、回復、キャンセル
			HashMap dataMap = (HashMap)param.getData("KojiKikiMap");
			
			// 解約
			svcKeiList = new ArrayList<HashMap<String, Object>>();
			// 機器提供サービス契約
			ArrayList dslKikiList = (ArrayList)dataMap.get("dsl_kiki_list");
			svcKeiList = setKktkSvc(dslKikiList);
			svcKeiGrpMap = new HashMap<String, Object>();
			svcKeiGrpList = setSvcKeiGrpList(svcKeiGrpMap);
			if (svcKeiList.size() > 0)
			{
				// サービス契約リスト
				svcKeiGrpMap.put("svc_kei_list", svcKeiList);
				// サービス契約グループリスト
				inMap.put("svc_kei_grp_list", svcKeiGrpList);
				// 登録／変更区分
				inMap.put("add_chge_div", "03");
				// サービス解約理由コード
				inMap.put("svc_dlre_cd", "01");
				// サービスキャンセル理由コード
				inMap.put("svc_cancel_rsn_cd", "");
				// 割引サービス自動適用CC実行
				wrisvcAutoAplyCC.execute(handle, param, fixedText);
			}
			// サービス契約内訳
			ArrayList dslSvcUcwkList = (ArrayList)dataMap.get("dsl_svc_ucwk_list");
			svcKeiList = setSvcUcwk(dslSvcUcwkList);
			svcKeiGrpMap = new HashMap<String, Object>();
			svcKeiGrpList = setSvcKeiGrpList(svcKeiGrpMap);
			if (svcKeiList.size() > 0)
			{
				// サービス契約リスト
				svcKeiGrpMap.put("svc_kei_list", svcKeiList);
				// サービス契約グループリスト
				inMap.put("svc_kei_grp_list", svcKeiGrpList);
				// 登録／変更区分
				inMap.put("add_chge_div", "03");
				// サービス解約理由コード
				inMap.put("svc_dlre_cd", "01");
				// サービスキャンセル理由コード
				inMap.put("svc_cancel_rsn_cd", "");
				// 割引サービス自動適用CC実行
				wrisvcAutoAplyCC.execute(handle, param, fixedText);
			}
			
			// 回復
			svcKeiList = new ArrayList<HashMap<String, Object>>();
			// 機器提供サービス契約
			ArrayList kaihkKikiList = (ArrayList)dataMap.get("kaihk_kiki_list");
			svcKeiList = setKktkSvc(kaihkKikiList);
			svcKeiGrpMap = new HashMap<String, Object>();
			svcKeiGrpList = setSvcKeiGrpList(svcKeiGrpMap);
			if (svcKeiList.size() > 0)
			{
				// サービス契約リスト
				svcKeiGrpMap.put("svc_kei_list", svcKeiList);
				// サービス契約グループリスト
				inMap.put("svc_kei_grp_list", svcKeiGrpList);
				// 登録／変更区分
				inMap.put("add_chge_div", "04");
				// サービス解約理由コード
				inMap.put("svc_dlre_cd", "");
				// サービスキャンセル理由コード
				inMap.put("svc_cancel_rsn_cd", "");
				// 割引サービス自動適用CC実行
				wrisvcAutoAplyCC.execute(handle, param, fixedText);
			}
			// サービス契約内訳
			ArrayList kaihkSvcUcwkList = (ArrayList)dataMap.get("kaihk_svc_ucwk_list");
			svcKeiList = setSvcUcwk(kaihkSvcUcwkList);
			svcKeiGrpMap = new HashMap<String, Object>();
			svcKeiGrpList = setSvcKeiGrpList(svcKeiGrpMap);
			if (svcKeiList.size() > 0)
			{
				// サービス契約リスト
				svcKeiGrpMap.put("svc_kei_list", svcKeiList);
				// サービス契約グループリスト
				inMap.put("svc_kei_grp_list", svcKeiGrpList);
				// 登録／変更区分
				inMap.put("add_chge_div", "04");
				// サービス解約理由コード
				inMap.put("svc_dlre_cd", "");
				// サービスキャンセル理由コード
				inMap.put("svc_cancel_rsn_cd", "");
				// 割引サービス自動適用CC実行
				wrisvcAutoAplyCC.execute(handle, param, fixedText);
			}
			
			// キャンセル
			svcKeiList = new ArrayList<HashMap<String, Object>>();
			// 機器提供サービス契約
			ArrayList cancelKikiList = (ArrayList)dataMap.get("cancel_kiki_list");
			svcKeiList = setKktkSvc(cancelKikiList);
			svcKeiGrpMap = new HashMap<String, Object>();
			svcKeiGrpList = setSvcKeiGrpList(svcKeiGrpMap);
			if (svcKeiList.size() > 0)
			{
				// サービス契約リスト
				svcKeiGrpMap.put("svc_kei_list", svcKeiList);
				// サービス契約グループリスト
				inMap.put("svc_kei_grp_list", svcKeiGrpList);
				// 登録／変更区分
				inMap.put("add_chge_div", "05");
				// サービス解約理由コード
				inMap.put("svc_dlre_cd", "");
				// サービスキャンセル理由コード
				inMap.put("svc_cancel_rsn_cd", "01");
				// 割引サービス自動適用CC実行
				wrisvcAutoAplyCC.execute(handle, param, fixedText);
			}
			// サービス契約内訳
			ArrayList cancelSvcUcwkList = (ArrayList)dataMap.get("cancel_svc_ucwk_list");
			svcKeiList = setSvcUcwk(cancelSvcUcwkList);
			svcKeiGrpMap = new HashMap<String, Object>();
			svcKeiGrpList = setSvcKeiGrpList(svcKeiGrpMap);
			if (svcKeiList.size() > 0)
			{
				// サービス契約リスト
				svcKeiGrpMap.put("svc_kei_list", svcKeiList);
				// サービス契約グループリスト
				inMap.put("svc_kei_grp_list", svcKeiGrpList);
				// 登録／変更区分
				inMap.put("add_chge_div", "05");
				// サービス解約理由コード
				inMap.put("svc_dlre_cd", "");
				// サービスキャンセル理由コード
				inMap.put("svc_cancel_rsn_cd", "01");
				// 割引サービス自動適用CC実行
				wrisvcAutoAplyCC.execute(handle, param, fixedText);
			}
		/* ++++++++++ v5.00.00 追加開始 ++++++++++ */
		}
		else if (STB_TEKKYO_NASI.equals(stbTekkyo))
		{
			// 登録
			HashMap createMap = (HashMap)param.getData("KikiInfoAddMap");
			if(createMap != null)
			{
				// サービス契約内訳
				ArrayList<Map<String, Object>> createSvcUcwkList = (ArrayList<Map<String, Object>>)createMap.get("svc_kei_ucwk_list");
				if(createSvcUcwkList != null)
				{
					svcKeiList = setSvcUcwk(createSvcUcwkList);
					svcKeiGrpMap = new HashMap<String, Object>();
					svcKeiGrpList = setSvcKeiGrpList(svcKeiGrpMap);
					if (svcKeiList.size() > 0)
					{
						// サービス契約リスト
						svcKeiGrpMap.put("svc_kei_list", svcKeiList);
						// サービス契約グループリスト
						inMap.put("svc_kei_grp_list", svcKeiGrpList);
						// 登録／変更区分
						inMap.put("add_chge_div", "16");
						// サービス解約理由コード
						inMap.put("svc_dlre_cd", "");
						// サービスキャンセル理由コード
						inMap.put("svc_cancel_rsn_cd", "");
						// 割引サービス自動適用CC実行
						wrisvcAutoAplyCC.execute(handle, param, fixedText);
					}
				}
			}
			
		}
		// ANK-4673-00-00 ADD START
		if (inMap.get("kojiakSbt")!=null && inMap.get("kojiakSbt").equals("001") 
				&& (inMap.get("ido_div").equals("00032")||inMap.get("ido_div").equals("00035"))
// ANK-4673-00-00 IT1障害対応 20250524 星野 ADD START
				// eo光TV 新設のみを対象とする（住所変更起因の新設工事は対象外）
				&& "9".equals(inMap.get("sckmct_ptn"))
// ANK-4673-00-00 IT1障害対応 20250524 星野 ADD END
		){
			// 登録
			HashMap chgTvCourseInfoMap = (HashMap)param.getData("chgTvCourseInfo");

			// 申込種別コード
			inMap.put("mskm_sbt_cd", "00001");
			
			// 登録／変更区分
			inMap.put("add_chge_div", "02");

			// サービス契約グループリスト
			ArrayList<HashMap<String, Object>> workSvcKeiArray = new ArrayList<HashMap<String, Object>>();
			HashMap<String, Object> workSvcKeiMap = new HashMap<String, Object>();
			// グループ区分
			workSvcKeiMap.put("grp_div", "00");
			// サービス契約リスト
			ArrayList<HashMap<String, Object>> workSvcKeiList = new ArrayList<HashMap<String, Object>>();
			HashMap<String, Object> workSvcKeiData = new HashMap<String, Object>();
			Boolean checkSvcKeiData = true;
			// ＳＹＳＩＤ
			workSvcKeiData.put("sysid", inMap.get("sysid"));
			// 対象契約識別コード
			workSvcKeiData.put("tg_kei_skbt_cd", "01");
			// サービス契約番号
			workSvcKeiData.put("svc_kei_no", inMap.get("svc_kei_no"));
			// サービス契約ステータス
			workSvcKeiData.put("svc_kei_stat", inMap.get("svc_kei_stat"));			
			if (chgTvCourseInfoMap.get("svc_cd") != null){
				// サービスコード
				workSvcKeiData.put("svc_cd", (String) chgTvCourseInfoMap.get("svc_cd"));
			} else {
				checkSvcKeiData = false;
			}
			if (chgTvCourseInfoMap.get("prc_grp_cd") != null){
				// 料金グループコード
				workSvcKeiData.put("prc_grp_cd", (String) chgTvCourseInfoMap.get("prc_grp_cd"));
			} else {
				checkSvcKeiData = false;
			}
			if (chgTvCourseInfoMap.get("aft_pcrs_cd") != null){
				// 料金コースコード
				workSvcKeiData.put("pcrs_cd", (String) chgTvCourseInfoMap.get("aft_pcrs_cd"));
			} else {
				checkSvcKeiData = false;
			}
			if (chgTvCourseInfoMap.get("aft_pplan_cd") != null){
				// 料金プランコード
				workSvcKeiData.put("pplan_cd", (String) chgTvCourseInfoMap.get("aft_pplan_cd"));
			} else {
				checkSvcKeiData = false;
			}
			if (chgTvCourseInfoMap.get("bfr_svc_cd") != null){
				// 変更前サービスコード
				workSvcKeiData.put("chge_bf_svc_cd", (String) chgTvCourseInfoMap.get("bfr_svc_cd"));
			} else {
				checkSvcKeiData = false;
			}
			if (chgTvCourseInfoMap.get("bfr_prc_grp_cd") != null){
				// 変更前料金グループコード
				workSvcKeiData.put("chge_bf_prc_grp_cd", (String) chgTvCourseInfoMap.get("bfr_prc_grp_cd"));
			} else {
				checkSvcKeiData = false;
			}
			if (chgTvCourseInfoMap.get("bfr_pcrs_cd") != null){
				// 変更前料金コースコード
				workSvcKeiData.put("chge_bf_pcrs_cd",(String) chgTvCourseInfoMap.get("bfr_pcrs_cd"));
			} else {
				checkSvcKeiData = false;
			}
			if (chgTvCourseInfoMap.get("bfr_pplan_cd") != null){
				// 変更前料金プランコード
				workSvcKeiData.put("chge_bf_pplan_cd", (String) chgTvCourseInfoMap.get("bfr_pplan_cd"));
			} else {
				checkSvcKeiData = false;
			}
			if (checkSvcKeiData){
				workSvcKeiList.add(workSvcKeiData);
				workSvcKeiMap.put("svc_kei_list", workSvcKeiList);
				workSvcKeiArray.add(workSvcKeiMap);
				inMap.put("svc_kei_grp_list", workSvcKeiArray);
				// 割引サービス自動適用CC実行
				wrisvcAutoAplyCC.execute(handle, param, fixedText);
			}
		}
		// ANK-4673-00-00 ADD END
		/* ++++++++++ v5.00.00 追加終了 ++++++++++ */
		return param;
	}

	/**
	 * @param svcKeiGrpMap
	 * @return svcKeiGrpList
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private ArrayList setSvcKeiGrpList(HashMap svcKeiGrpMap) throws Exception
	{
		ArrayList<HashMap<String, Object>> svcKeiGrpList = new ArrayList<HashMap<String, Object>>();
		// グループ区分
		svcKeiGrpMap.put("grp_div", "00");
		svcKeiGrpList.add(svcKeiGrpMap);
		return svcKeiGrpList;
	}

	/**
	 * @param list
	 * @return svcKeiList
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private ArrayList setSvcUcwk(ArrayList list) throws Exception
	{
		ArrayList svcKeiList = new ArrayList();
		if (list != null && list.size() > 0)
		{
			HashMap ucwkMap = null;
			HashMap svcKeiMap = null;
			for (int i = 0; i < list.size(); i++)
			{
				ucwkMap = (HashMap)list.get(i);
				svcKeiMap = new HashMap();
				// 対象契約識別コード
				svcKeiMap.put("tg_kei_skbt_cd", "03");
				// サービス契約内訳番号
				svcKeiMap.put("svc_kei_ucwk_no", (String)ucwkMap.get("svc_kei_ucwk_no"));
				// サービス契約内訳ステータス
				svcKeiMap.put("svc_kei_ucwk_stat", (String)ucwkMap.get("svc_kei_ucwk_stat"));
				// 料金コースコード
				svcKeiMap.put("pcrs_cd", (String)ucwkMap.get("pcrs_cd"));
				// 料金プランコード
				svcKeiMap.put("pplan_cd", (String)ucwkMap.get("pplan_cd"));
				svcKeiList.add(svcKeiMap);
			}
		}
		return svcKeiList;
	}

	/**
	 * @param list
	 * @return svcKeiList
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private ArrayList setKktkSvc(ArrayList list) throws Exception
	{
		ArrayList svcKeiList = new ArrayList();
		if (list != null && list.size() > 0)
		{
			HashMap kikiMap = null;
			HashMap svcKeiMap = null;
			for (int i = 0; i < list.size(); i++)
			{
				kikiMap = (HashMap)list.get(i);
				// STBのみ
				if ("C009".equals(kikiMap.get("kktk_svc_cd")))
				{
					svcKeiMap = new HashMap();
					// 対象契約識別コード
					svcKeiMap.put("tg_kei_skbt_cd", "06");
					// 機器提供サービス契約番号
					svcKeiMap.put("kktk_svc_kei_no", (String)kikiMap.get("kktk_svc_kei_no"));
					// 機器提供サービス契約ステータス
					svcKeiMap.put("kktk_svc_kei_stat", (String)kikiMap.get("kktk_svc_kei_stat"));
					// 料金コースコード
					svcKeiMap.put("pcrs_cd", (String)kikiMap.get("pcrs_cd"));
					// 料金プランコード
					svcKeiMap.put("pplan_cd", (String)kikiMap.get("pplan_cd"));
					// 機器提供サービスコード
					svcKeiMap.put("kktk_svc_cd", (String)kikiMap.get("kktk_svc_cd"));
					// 機器提供種別コード
					svcKeiMap.put("kktk_sbt_cd", (String)kikiMap.get("kktk_sbt_cd"));
					svcKeiList.add(svcKeiMap);
				}
			}
		}
		return svcKeiList;
	}
}
