/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUAddTmcpPrgCC
*   ソースファイル名：JFUAddTmcpPrgCC.java
*   作成者          ：富士通
*   日付            ：2018年10月05日
*＜機能概要＞
*   端末補償進捗登録コモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v39.00      2018/10/05   FJ）岡   【ANK-3484-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 eo.common.constant.JFUStrConst;
import eo.ejb.cbs.cbsmsg.EKK1091D010CBSMsg;

/**
 * 端末補償進捗登録コモンコンポーネント部品
 * 
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JKKAddTmcpPrgCC extends JFUBaseNetChgCommonCC
{
	/** IN項目:進捗特記事項1 PCプラン登録 */
	private static final String IN_PARAM_PRG_TKJK_1_PC_PLAN = "prg_tkjk_1_pc_plan";
	/** IN項目:進捗特記事項1 PCワイドプラン登録 */
	private static final String IN_PARAM_PRG_TKJK_1_PC_WID_PLAN = "prg_tkjk_1_pc_wid_plan";
	/** IN項目:進捗特記事項1 TVプラン登録 */
	private static final String IN_PARAM_PRG_TKJK_1_TV_PLAN = "prg_tkjk_1_tv_plan";

	/** IN項目:進捗登録   */
	private static final String PRG_KBN_ADD = "add_";
	/** IN項目:進捗登録   */
	private static final String PRG_KBN_DSL = "dsl_";

	/** 登録用情報リスト */
	public static final String KEY_ADD_INFO_LIST = "add_info_list";
	/** 解約用情報リスト */
	public static final String KEY_DSL_INFO_LIST = "cancel_info_list";
	/** 解約用情報リスト */
	public static final String KEY_KAIHK_INFO_LIST = "kaihk_info_list";
	/** 処理結果明細リスト */
	private static final String TRAN_RESULT_LIST = "tran_result_list";

	/** 申込明細番号 */
	private static final String MSKM_DTL_NO = "mskm_dtl_no";
	/** 請求契約番号 */
	private static final String SEIKY_KEI_NO = "seiky_kei_no";
	/** サービス契約番号 */
	private static final String SVC_KEI_NO = "svc_kei_no";
	/** オプションサービス契約番号 */
	private static final String OP_SVC_KEI_NO = "op_svc_kei_no";
	/** サブオプションサービス契約番号 */
	private static final String SBOP_SVC_KEI_NO = "sbop_svc_kei_no";
	/** 割引サービス契約番号 */
	private static final String WRIB_SVC_KEI_NO = "wrib_svc_kei_no";
	/** 進捗ステータス */
	private static final String PRG_STAT = "prg_stat";
	/** 割引サービスコード */
	private static final String WRIB_SVC_CD = "wrib_svc_cd";
	/** オプションサービスコード */
	private static final String OP_SVC_CD = "op_svc_cd";
	/** サブオプションサービスコード */
	private static final String SBOP_SVC_CD = "sbop_svc_cd";
	/** 異動区分 */
	private static final String IDO_DIV = "ido_div";
	
	/** ＰＣワイドプラン登録フラグ（登録しない） */
	private static final String NASI = "0";
	/** ＰＣワイドプラン登録フラグ（登録する） */
	private static final String ARI = "1";

	/* ■□ EKK1091D010_進捗登録SC ■□ */
	/** テンプレートID(進捗登録) */
	private static final String TEMP_ID_EKK1091D010 = "EKK1091D010";
	/** テンプレートID(進捗登録明細) */
	private static final String TEMP_ID_DTL_EKK1091D010 = "EKK1091D010CBSMsg1List";
	/** IN項目リスト(進捗登録) */
	private static final List<String> IN_COL_LIST_EKK1091D010 =
			Arrays.asList(EKK1091D010CBSMsg.MSKM_DTL_NO, EKK1091D010CBSMsg.SEIKY_KEI_NO, EKK1091D010CBSMsg.SEIKY_WAY_NO_KOZA,
					EKK1091D010CBSMsg.SEIKY_WAY_NO_CRECARD, EKK1091D010CBSMsg.SVC_KEI_NO, EKK1091D010CBSMsg.SVC_KEI_UCWK_NO,
					EKK1091D010CBSMsg.SVC_KEI_KAISEN_UCWK_NO, EKK1091D010CBSMsg.KKTK_SVC_KEI_NO, EKK1091D010CBSMsg.OP_SVC_KEI_NO,
					EKK1091D010CBSMsg.SEIOPSVC_KEI_NO, EKK1091D010CBSMsg.SBOP_SVC_KEI_NO, EKK1091D010CBSMsg.WRIB_SVC_KEI_NO,
					EKK1091D010CBSMsg.IDO_DIV, EKK1091D010CBSMsg.IDO_DTM, EKK1091D010CBSMsg.PRG_STAT, EKK1091D010CBSMsg.PRG_MEMO,
					EKK1091D010CBSMsg.PRG_TKJK_1, EKK1091D010CBSMsg.PRG_TKJK_2, EKK1091D010CBSMsg.PRG_DTM_I);
	/** 関連チェックエラー項目(進捗登録) */
	private static final String ERR_COL_EKK1091D010 = null;

	/**
	 * 端末補償進捗登録処理
	 * 
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Throwable 
	 */
	public IRequestParameterReadWrite addTmpcPrg(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Throwable
	{

		try
		{
			// ユーザデータ取得
			HashMap inMap = (HashMap)param.getData(fixedText);

			String[] infoList = { KEY_ADD_INFO_LIST, KEY_DSL_INFO_LIST, KEY_KAIHK_INFO_LIST };

			String idoDtm = JFUBPCommon.getSysDateTimeStamp();

			// 登録用／解約用情報リスト
			for (int i = 0; i < infoList.length; i++)
			{
				List<HashMap<String, Object>> addList = (List<HashMap<String, Object>>)inMap.get(infoList[i]);

				if (addList != null)
				{
					for (HashMap addMap : addList)
					{
						// 処理結果明細リスト
						List<HashMap<String, Object>> tranList = (List<HashMap<String, Object>>)addMap.get(TRAN_RESULT_LIST);

						if (tranList != null)
						{
							// ＰＣワイドプラン登録フラグ
							String pcWidPlanAddFlg = NASI;
							for (HashMap judgeMap : tranList)
							{
								// ＰＣワイドプラン登録判定処理
								pcWidPlanAddFlg = pcWidPlanAddJudge(judgeMap, pcWidPlanAddFlg);
							}
							
							for (HashMap dtlMap : tranList)
							{
								// ○EKK1091D010_進捗登録
								// 上りマッピング
								setInMapEKK1091D010(param, fixedText, dtlMap, (String)inMap.get(IDO_DIV), idoDtm, pcWidPlanAddFlg, infoList[i]);
								// サービスIF実行
								JFUBPCommon.executeSC(handle, param, fixedText, TEMP_ID_EKK1091D010, TEMP_ID_DTL_EKK1091D010,
										IN_COL_LIST_EKK1091D010, ERR_COL_EKK1091D010);
							}
						}

					}
				}
			}
		}
		finally
		{
			this.deleteTempArea(param, fixedText);
		}
		return param;
	}

	/**
	 * 上りマッピング項目設定(進捗登録)
	 *
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param dataMap 処理結果データマップ
	 * @param idoDiv 異動区分
	 * @param idoDtm 異動年月日時分秒
	 * @param prgKbn 進捗登録区分
	 * @param prgAddFlg 進捗登録フラグ
	 * @throws RequestParameterException
	 */
	private void setInMapEKK1091D010(IRequestParameterReadWrite param, 
			String fixedText, HashMap dataMap, String idoDiv, String idoDtm, String pcWidPlanAddFlg, String infoListKeyName)
			throws RequestParameterException
	{
		if (ARI.equals(pcWidPlanAddFlg))
		{
			// ＰＣワイドプランが申し込まれている場合、
			// ＰＣワイドプラン、または、ＴＶプランのみ進捗に登録する。
			// ユーザデータ取得
			HashMap inMap = (HashMap)param.getData(fixedText);
			
			// 機能コード設定
			JFUBPCommon.setFuncCode(param, fixedText, getFuncCode(param, fixedText));
			
			// 申込明細番号
			inMap.put(EKK1091D010CBSMsg.MSKM_DTL_NO, dataMap.get(MSKM_DTL_NO));
			// 請求契約番号
			inMap.put(EKK1091D010CBSMsg.SEIKY_KEI_NO, dataMap.get(SEIKY_KEI_NO));
			// サービス契約番号
			inMap.put(EKK1091D010CBSMsg.SVC_KEI_NO, dataMap.get(SVC_KEI_NO));
			// オプションサービス契約番号
			inMap.put(EKK1091D010CBSMsg.OP_SVC_KEI_NO, dataMap.get(OP_SVC_KEI_NO));
			// サブオプションサービス契約番号
			inMap.put(EKK1091D010CBSMsg.SBOP_SVC_KEI_NO, dataMap.get(SBOP_SVC_KEI_NO));
			// 異動区分
			inMap.put(EKK1091D010CBSMsg.IDO_DIV, idoDiv);
			// 異動年月日時分秒
			inMap.put(EKK1091D010CBSMsg.IDO_DTM, idoDtm);
			// 進捗ステータス
			inMap.put(EKK1091D010CBSMsg.PRG_STAT, dataMap.get(PRG_STAT));
			if (KEY_ADD_INFO_LIST.equals(infoListKeyName))
			{
				// 進捗特記事項1
				if (JFUStrConst.CD00137_D12.equals(dataMap.get(SBOP_SVC_CD)))
				{
					inMap.put(EKK1091D010CBSMsg.PRG_TKJK_1, "ＰＣワイドプラン登録");
				}
				else if (JFUStrConst.CD00136_B134.equals(dataMap.get(OP_SVC_CD)))
				{
					inMap.put(EKK1091D010CBSMsg.PRG_TKJK_1, "ＴＶプラン登録");
				}
			}
			else if (KEY_DSL_INFO_LIST.equals(infoListKeyName))
			{
				// 進捗特記事項1
				if (JFUStrConst.CD00137_D12.equals(dataMap.get(SBOP_SVC_CD)))
				{
					inMap.put(EKK1091D010CBSMsg.PRG_TKJK_1, "ＰＣワイドプラン解約");
				}
				else if (JFUStrConst.CD00136_B134.equals(dataMap.get(OP_SVC_CD)))
				{
					inMap.put(EKK1091D010CBSMsg.PRG_TKJK_1, "ＴＶプラン解約");
				}
			}
			else if (KEY_KAIHK_INFO_LIST.equals(infoListKeyName))
			{
				// 進捗特記事項1
				if (JFUStrConst.CD00137_D12.equals(dataMap.get(SBOP_SVC_CD)))
				{
					inMap.put(EKK1091D010CBSMsg.PRG_TKJK_1, "ＰＣワイドプラン回復");
				}
				else if (JFUStrConst.CD00136_B134.equals(dataMap.get(OP_SVC_CD)))
				{
					inMap.put(EKK1091D010CBSMsg.PRG_TKJK_1, "ＴＶプラン回復");
				}
			}
		}
		else
		{
			// ＰＣワイドプランが申し込まれていない場合
			// ＰＣプラン、または、ＴＶプランのみ進捗に登録する。
			// ユーザデータ取得
			HashMap inMap = (HashMap)param.getData(fixedText);
			
			// 機能コード設定
			JFUBPCommon.setFuncCode(param, fixedText, getFuncCode(param, fixedText));
			
			// 申込明細番号
			inMap.put(EKK1091D010CBSMsg.MSKM_DTL_NO, dataMap.get(MSKM_DTL_NO));
			// 請求契約番号
			inMap.put(EKK1091D010CBSMsg.SEIKY_KEI_NO, dataMap.get(SEIKY_KEI_NO));
			// サービス契約番号
			inMap.put(EKK1091D010CBSMsg.SVC_KEI_NO, dataMap.get(SVC_KEI_NO));
			// オプションサービス契約番号
			inMap.put(EKK1091D010CBSMsg.OP_SVC_KEI_NO, dataMap.get(OP_SVC_KEI_NO));
			// サブオプションサービス契約番号
			inMap.put(EKK1091D010CBSMsg.SBOP_SVC_KEI_NO, dataMap.get(SBOP_SVC_KEI_NO));
			// 異動区分
			inMap.put(EKK1091D010CBSMsg.IDO_DIV, idoDiv);
			// 異動年月日時分秒
			inMap.put(EKK1091D010CBSMsg.IDO_DTM, idoDtm);
			// 進捗ステータス
			inMap.put(EKK1091D010CBSMsg.PRG_STAT, dataMap.get(PRG_STAT));
			if (KEY_ADD_INFO_LIST.equals(infoListKeyName))
			{
				// 進捗特記事項1
				if (JFUStrConst.CD00136_B133.equals(dataMap.get(OP_SVC_CD)))
				{
					inMap.put(EKK1091D010CBSMsg.PRG_TKJK_1, "ＰＣプラン登録");
				}
				else if (JFUStrConst.CD00136_B134.equals(dataMap.get(OP_SVC_CD)))
				{
					inMap.put(EKK1091D010CBSMsg.PRG_TKJK_1, "ＴＶプラン登録");
				}
			}
			else if (KEY_DSL_INFO_LIST.equals(infoListKeyName))
			{
				// 進捗特記事項1
				if (JFUStrConst.CD00136_B133.equals(dataMap.get(OP_SVC_CD)))
				{
					inMap.put(EKK1091D010CBSMsg.PRG_TKJK_1, "ＰＣプラン解約");
				}
				else if (JFUStrConst.CD00136_B134.equals(dataMap.get(OP_SVC_CD)))
				{
					inMap.put(EKK1091D010CBSMsg.PRG_TKJK_1, "ＴＶプラン解約");
				}
			}
			else if (KEY_KAIHK_INFO_LIST.equals(infoListKeyName))
			{
				// 進捗特記事項1
				if (JFUStrConst.CD00136_B133.equals(dataMap.get(OP_SVC_CD)))
				{
					inMap.put(EKK1091D010CBSMsg.PRG_TKJK_1, "ＰＣプラン回復");
				}
				else if (JFUStrConst.CD00136_B134.equals(dataMap.get(OP_SVC_CD)))
				{
					inMap.put(EKK1091D010CBSMsg.PRG_TKJK_1, "ＴＶプラン回復");
				}
			}
		}
	}
	
	/**
	 * ＰＣワイドプラン登録判定処理
	 * 
	 * <br>
	 * @param dataMap 処理結果データマップ
	 * @param prgAddFlg 進捗登録フラグ
	 * @return 進捗登録フラグ
	 * @throws Throwable 
	 */
	public String pcWidPlanAddJudge(HashMap dataMap, String pcWidPlanAddFlg) throws Throwable
	{
		if (JFUStrConst.CD00136_B133.equals(dataMap.get(OP_SVC_CD)) && JFUStrConst.CD00137_D12.equals(dataMap.get(SBOP_SVC_CD)))
		{
			// ＰＣワイドプランが申し込まれている場合
			pcWidPlanAddFlg = ARI;
		}
		return pcWidPlanAddFlg;
	}
}
