/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUAddAgntCC
*   ソースファイル名：JFUAddAgntCC.java
*   作成者          ：富士通
*   日付            ：2012年09月13日
*＜機能概要＞
*  代理店登録コモンコンポーネント部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2012/09/13   FJ）大塚    新規作成
*   v4.00.00    2013/01/17   FJ) 岩元    IT1-2013-0000015 契約新規関連対応
*                                                         申込代理店番号追加
*   v66.00.00   2023/4/8	 FJ) 西川   【ANK-4397-00-00】価格COM経由申込のフロンティア巻取り対応
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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.EKK0071D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0071E020CBSMsg;

/**
 * 代理店登録コモンコンポーネント部品です。
 *
 * <br>
 * @author 富士通
 */
@SuppressWarnings("unchecked")
public class JFUAddAgntCC extends JFUBaseCC
{
	/* ■□ 申込_代理店削除 ■□ */
	/** テンプレートID(申込_代理店削除) */
	private static final String TEMPLATE_ID_EKK0071E020 = "EKK0071E020";

	/** IN項目リスト(申込_代理店削除) */
	private static final List<String> IN_COLUMN_LIST_EKK0071E020 =
			Arrays.asList(EKK0071E020CBSMsg.MSKM_NO, EKK0071E020CBSMsg.AGNT_CD, EKK0071D010CBSMsg.MSKM_AGNT_NO, EKK0071E020CBSMsg.UPD_DTM_BF);

	/* ■□ 申込_代理店登録 ■□ */
	/** テンプレートID(申込_代理店登録) */
	private static final String TEMPLATE_ID_EKK0071D010 = "EKK0071D010";

	/** IN項目リスト(申込_代理店登録) */
	private static final List<String> IN_COLUMN_LIST_EKK0071D010 =
			Arrays.asList(EKK0071D010CBSMsg.MSKM_NO, EKK0071D010CBSMsg.AGNT_CD, EKK0071D010CBSMsg.MSKM_AGNT_NO, EKK0071D010CBSMsg.DSP_JUN);

	/** テンプレートID(申込_代理店) */
	private static final String EKK0071D010_1 = "EKK0071D010_1";

	/** テンプレートID(申込_代理店) */
	private static final String EKK0071D010_2 = "EKK0071D010_2";

	/** テンプレートID(申込_代理店) */
	private static final String EKK0071D010_3 = "EKK0071D010_3";

	/** テンプレートID(申込_代理店) */
	private static final String EKK0071D010_4 = "EKK0071D010_4";

	/** SC実行結果取得キー(申込_代理店登録) */
	private static final String TEMP_TEMPLATE_KEY_KK0071D010 = TEMP_TEMPLATE_PRIFIX + TEMPLATE_ID_EKK0071D010 + TEMP_TEMPLATE_PRIFIX_SEP;

	/** 作業マップ名 */
	private static final String CC_WORK_AREA_NAME = "JFUAddMskmSCWork";

	/**
	 * 代理店登録処理
	 *
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ管理クラス
	 * @throws Exception
	 */
	public IRequestParameterReadWrite addAgntCd(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		// ユーザデータ取得

		// 申込_代理店削除
		HashMap<String, Object> agntDelMap = (HashMap<String, Object>)param.getData(TEMPLATE_ID_EKK0071E020);

		// 申込_代理店登録(1-1)
		HashMap<String, Object> agnt1_1Map = (HashMap<String, Object>)param.getData(EKK0071D010_1);

		// 申込_代理店登録(1-2または2-1)
		HashMap<String, Object> agnt1_2Map = (HashMap<String, Object>)param.getData(EKK0071D010_2);

		// 申込_代理店登録(2-1または2-2)
		HashMap<String, Object> agnt2_1Map = (HashMap<String, Object>)param.getData(EKK0071D010_3);

		// 申込_代理店登録(2-2)
		HashMap<String, Object> agnt2_2Map = (HashMap<String, Object>)param.getData(EKK0071D010_4);

		Boolean delFlg = true; // true:マップあり

		if ((agntDelMap == null) || (agntDelMap.isEmpty()))
		{
			// 申込_代理店削除マップが存在しない場合は、削除は行わない。
			delFlg = false;
		}
		else
		{
			// 上りマッピング
			this.setInMapAgntDel(param, TEMPLATE_ID_EKK0071E020, agntDelMap);
			// サービスIF実行
			executeSC(handle, param, TEMPLATE_ID_EKK0071E020, TEMPLATE_ID_EKK0071E020, BLANK, IN_COLUMN_LIST_EKK0071E020, BLANK);
		}

		// 申込＿代理店削除マップが存在しない場合は、初期登録の場合のみ
		String mskm_no = "";
		if (!delFlg)
		{
			// ---申込番号---
			if (getWorkMapValue(param, "mskm_no", CC_WORK_AREA_NAME) != null)
			{
				mskm_no = getWorkMapValue(param, "mskm_no", CC_WORK_AREA_NAME);
			}
		}

		if ((agnt1_1Map == null) || (agnt1_1Map.isEmpty()))
		{
			// 申込_代理店登録(1-1)マップが存在しない場合は、処理しない
			return param;
		}

		// 上りマッピング
		this.setInMapAgntCd(param, EKK0071D010_1, agnt1_1Map, mskm_no);
		// サービスIF実行
		executeSC(handle, param, EKK0071D010_1, TEMPLATE_ID_EKK0071D010, BLANK, IN_COLUMN_LIST_EKK0071D010, BLANK);
		// 下りマッピング
		this.setOutMapAgntCd(param, EKK0071D010_1);

		// 申込_代理店  2本目登録
		if ((agnt1_2Map == null) || (agnt1_2Map.isEmpty()))
		{
			// 申込_代理店登録(2-1または1-2)マップが存在しない場合は、処理しない
			return param;
		}

		// 上りマッピング
		this.setInMapAgntCd(param, EKK0071D010_2, agnt1_2Map, mskm_no);
		// サービスIF実行
		executeSC(handle, param, EKK0071D010_2, TEMPLATE_ID_EKK0071D010, BLANK, IN_COLUMN_LIST_EKK0071D010, BLANK);
		// 下りマッピング
		this.setOutMapAgntCd(param, EKK0071D010_2);

		// 申込_代理店  3本目登録
		if ((agnt2_1Map == null) || (agnt2_1Map.isEmpty()))
		{
			// 申込_代理店登録(2-1または2-2)マップが存在しない場合は、処理しない
			return param;
		}

		// 上りマッピング
		this.setInMapAgntCd(param, EKK0071D010_3, agnt2_1Map, mskm_no);
		// サービスIF実行
		executeSC(handle, param, EKK0071D010_3, TEMPLATE_ID_EKK0071D010, BLANK, IN_COLUMN_LIST_EKK0071D010, BLANK);
		// 下りマッピング
		this.setOutMapAgntCd(param, EKK0071D010_3);

		// 申込_代理店  4本目登録
		if ((agnt2_2Map == null) || (agnt2_2Map.isEmpty()))
		{
			// 申込_代理店登録(2-2)マップが存在しない場合は、処理しない
			return param;
		}

		// 上りマッピング
		this.setInMapAgntCd(param, EKK0071D010_4, agnt2_2Map, mskm_no);
		// サービスIF実行
		executeSC(handle, param, EKK0071D010_4, TEMPLATE_ID_EKK0071D010, BLANK, IN_COLUMN_LIST_EKK0071D010, BLANK);
		// 下りマッピング
		this.setOutMapAgntCd(param, EKK0071D010_4);

		return param;
	}

	/**
	 * 上りマッピング項目設定(申込_代理店削除)
	 *
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ccMap
	 * @throws RequestParameterException
	 */
	private void setInMapAgntDel(IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> ccMap) throws RequestParameterException
	{
		// 機能コード設定(1:チェック&更新)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// 検索エラーなし設定
		ignoreSearchError(param, fixedText);

		// ユーザデータ取得
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// 申込番号
		inMap.put(EKK0071E020CBSMsg.MSKM_NO, ccMap.get(EKK0071E020CBSMsg.MSKM_NO));
		// 代理店コード
		inMap.put(EKK0071E020CBSMsg.AGNT_CD, ccMap.get(EKK0071E020CBSMsg.AGNT_CD));
		// IT1-2013-0000015 契約新規関連対応 2013/01/07 h.iwamoto START
		// 申込_代理店番号
		inMap.put(EKK0071E020CBSMsg.MSKM_AGNT_NO, "001");
		// IT1-2013-0000015 契約新規関連対応 2013/01/07 h.iwamoto END
		// 更新年月日時分秒(更新前)
		inMap.put(EKK0071E020CBSMsg.UPD_DTM_BF, ccMap.get(EKK0071E020CBSMsg.UPD_DTM_BF));
	}

	/**
	 * 上りマッピング項目設定(申込_代理店登録)
	 *
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ccMap
	 * @param mskm_no
	 * @throws RequestParameterException
	 */
	private void setInMapAgntCd(IRequestParameterReadWrite param, String fixedText, HashMap<String, Object> ccMap, String mskm_no)
			throws RequestParameterException
	{
		// 機能コード設定(1:チェック&更新)
		setFuncCode(param, fixedText, JPCModelConstant.FUNC_CD_1);

		// 検索エラーなし設定
		ignoreSearchError(param, fixedText);

		// ユーザデータ取得
		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// 申込番号
		if ("".equals(mskm_no))
		{
			inMap.put(EKK0071D010CBSMsg.MSKM_NO, ccMap.get(EKK0071D010CBSMsg.MSKM_NO));
		}
		else
		{
			inMap.put(EKK0071D010CBSMsg.MSKM_NO, mskm_no);
		}
		// 代理店コード
		inMap.put(EKK0071D010CBSMsg.AGNT_CD, ccMap.get(EKK0071D010CBSMsg.AGNT_CD));
		// IT1-2013-0000015 契約新規関連対応 2013/01/07 h.iwamoto START
		// 申込_代理店番号
		String dsp_jun = (String)ccMap.get(EKK0071D010CBSMsg.DSP_JUN);
		String mskm_agnt_no = "000";
		if (dsp_jun != null || !JFUStrConst.EMPTY.equals(dsp_jun))
		{
			// 値が設定されている場合、3桁になるようゼロ埋め
			mskm_agnt_no = String.format("%1$03d", Integer.valueOf(dsp_jun));
		}
		inMap.put(EKK0071D010CBSMsg.MSKM_AGNT_NO, mskm_agnt_no);
		// IT1-2013-0000015 契約新規関連対応 2013/01/07 h.iwamoto START
		// 表示順
		inMap.put(EKK0071D010CBSMsg.DSP_JUN, ccMap.get(EKK0071D010CBSMsg.DSP_JUN));
	}

	/**
	 * 下りマッピング項目設定(申込_代理店登録)
	 *
	 * <br>
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @param ccMap CCマップ
	 * @throws RequestParameterException
	 */
	private void setOutMapAgntCd(IRequestParameterReadWrite param, String fixedText) throws RequestParameterException
	{
		// 作業領域のマップを取得
		Map workMap = param.getMappingWorkArea();
		if (workMap == null)
		{
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}

		HashMap<String, Object> inMap = (HashMap<String, Object>)param.getData(fixedText);

		// 更新年月日時分秒
		inMap.put(EKK0071D010CBSMsg.UPD_DTM, inMap.get(EKK0071D010CBSMsg.UPD_DTM));
	}

	/**
	 * チェック処理
	 *
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText サービスメッセージ
	 * @return リクエストパラメータ
	 * @throws Exception
	 */
	@Override
	public HashMap<String, Object> getInvokeCBS(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		return null;
	}

	/**
	 * 作業エリア
	 */
	@SuppressWarnings("null")
	private String getWorkMapValue(IRequestParameterReadWrite param, String key, String fixText) throws RequestParameterException
	{
		// 作業領域の取得
		Map workMap = param.getMappingWorkArea();

		HashMap inMap = null;
		/* 作業項目情報 */
		if (workMap != null)
		{
			inMap = (HashMap)workMap.get(fixText);
		}
		else
		{
			inMap = null;
		}

		String result = null;
		if (inMap != null)
		{
			result = (String)inMap.get(key);
		}

		if ("".equals(result))
		{
			result = null;
		}

		return result;
	}
}
