/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUShokaishaCheckWrapperCC
*   ソースファイル名：JFUShokaishaCheckWrapperCC.java
*   作成者          ：富士通
*   日付            ：2022年2月22日
*＜機能概要＞
*   紹介コード有効性チェックコモンコンポーネント部品
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v56.00.00   2022/02/22   FJ）舘山    新規作成
*	v62.00.00	2022/11/14   FJ) 美濃原	【ANK-4294-00-00】紹介CP仕組み変更対応
*	v68.00.00	2023/10/30   FJ) 西川    ANK-4416-00-00_紹介コード、提携先企業向けエントリーコード同時入力対応
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.x21.bpm.ServiceComponentRequestInvoker;
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 com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.bp.x21.cc.exception.CCException;
import com.fujitsu.futurity.bp.x21.cc.exception.SCCallException;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.mapping.bp.common.TemplateErrorUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;
import com.fujitsu.futurity.model.common.check.HalfCharCheck;
import com.fujitsu.futurity.model.common.check.LengthCheck;
import com.fujitsu.futurity.model.common.check.MixCharCheck;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JKKStrConst;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EZM0321A010CBSMsg1List;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JFUShokaishaCheckWrapperCC extends AbstractCommonComponent
{
	/** 業務パラメータ一意照会 */
	private static final String TEMPLATE_ID_EZM0321A010 = "EZM0321A010";

	/** amazon紹介コード接頭語 */
	private static final String AMAZON_INTR_PREFIX = "AMZN";

	/** プレクラ紹介コード正規表現*/
	private static final String PRECL_INTR_MACH_CD = "[A-Z][0-9]{9}";
	
	// ---------------------------------------------------------
	// API向けの共通定数
	// ---------------------------------------------------------
	/** エラー情報マップキー*/
	private static final String KEY_ERROR_INFO = "ERROR_INFO";
	
	/** エラーコードマップキー*/
	private static final String KEY_ERR_CD = "errCode";

	/** エラーメッセージマップキー*/
	private static final String KEY_ERRMSG = "errMessage";
	
	/** 属性の種別 */
	private enum AttrType {
		NUM_ALF_1, NUM_1, ZENKAKU
	}

	/** 紹介コード */
	private static final String PARAM_INTR_CD = "intr_cd";
	/** 契約種別 */
	private static final String PARAM_KEI_SBT = "kei_sbt";
	/** 被紹介者名（姓）*/
	private static final String PARAM_HISHOKAI_NM_LAST = "hishokai_nm_last";
	/** コード識別子 */
	private static final String CD_SKBT = "cd_skbt";

	/** 処理結果 */
	private static final String PARAM_RESULT = "result";

	/** エラーコード 必須チェックエラー*/
	private static final String REQUIRED_ERROR  = "1001";
	/** エラーコード 属性チェックエラー*/
	private static final String ATTRIBUTE_ERROR = "1002";
	/** エラーコード 桁数チェックエラー*/
	private static final String LENGTH_ERROR    = "1003";
	/** エラーコード コードチェックエラー*/
	private static final String CODE_ERROR      = "1101";
	/** エラーコード 被紹介者名（姓）チェックエラー */
	private static final String HISHOKAI_ERROR    = "1102";

	/** 契約種別のコード一覧 */
	private List<String> codeCheckList = Arrays.asList("1", "2");

	/** コード識別子 */
	private List<String> cdSkbtCodeCheckList = Arrays.asList("01");

	/** ステータス */
	private static final String STATUS = "status";
	
	private static final String DUMMY_FIXED_TEXT = "FUSV035702CC";
	
	/**
	 * コンストラクタ
	 */
	public JFUShokaishaCheckWrapperCC()
	{
	}
	
	/**
	 * 紹介コード有効性チェック処理
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return
	 * @throws Exception
	 */
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText) throws Exception
	{
		/** 事前準備 */
		HashMap<String, Object> paramMap = (HashMap<String, Object>)param.getData(fixedText);

		// レスポンス用のパラメータを作成する
		HashMap<String, Object> responseParam = new HashMap<String, Object>(paramMap);

		// パラメータチェックを実行する
		ArrayList<HashMap<String, Object>> errList = getParameterErrorInfo(paramMap);
		if (errList.size() > 0)
		{
			// エラー情報を設定
			responseParam.put(KEY_ERROR_INFO, errList);
			param.setData(fixedText, responseParam);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_1000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, JKKStrConst.RETURN_MESSAGE_ZOKUSEI_CHECK_ERROR);
			return param;
		}

		try
		{
			// 分類コードの取得
			String intro_cd = (String)paramMap.get(PARAM_INTR_CD);
			String kei_sbt = (String)paramMap.get(PARAM_KEI_SBT);
			String hishokai_nm = (String)paramMap.get(PARAM_HISHOKAI_NM_LAST);
			String cd_skbt = (String)paramMap.get(CD_SKBT);
			// eoエントリーコード（有効期限あり）
			String bunrui_cd = getBunruiCd(handle, param, fixedText, intro_cd);
			String name_bunrui_cd = JFUStrConst.EMPTY;
			if (JFUBPCommon.isNull(bunrui_cd))
			{
				// 通常の紹介コード（紹介コード独自チェック対象）の結果を上書き
				name_bunrui_cd = getKkIntrcdChkTg(handle, param, paramMap);
			}
			else
			{
				name_bunrui_cd = bunrui_cd;
			}

			// 被紹介者名を取得（組合せによる設定）
			hishokai_nm = getHiShokaiName(intro_cd, kei_sbt, hishokai_nm, name_bunrui_cd, errList);
			if (hishokai_nm == null)
			{
				responseParam.put(KEY_ERROR_INFO, errList);
				param.setData(fixedText, responseParam);
				param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_1050);
				param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, JKKStrConst.RETURN_MESSAGE_SEIGO_CHECK_ERROR);
				return param;
			}

			// 共通部品の呼出し
			HashMap<String, Object> ccParam = new HashMap<String, Object>();

			if (JFUStrConst.COUPON_CD_CD_SKBTS.equals(cd_skbt))
			{
				ccParam.put("coupon_cd", intro_cd); // クーポンコード
				ccParam.put("cd_skbts", cd_skbt); // コード識別子
			}
			else
			{
				ccParam.put("intr_cd", intro_cd); // 紹介コード
			}
			ccParam.put("intr_cd", intro_cd); // 紹介コード
			ccParam.put("name_last", hishokai_nm); // 紹介名称
			ccParam.put("bunrui_cd", bunrui_cd); // 分類コード

			// 共通部品の呼出し
			JFUShokaishaCheckCC checkCC = new JFUShokaishaCheckCC();

			param.setData(DUMMY_FIXED_TEXT, ccParam);
			IRequestParameterReadWrite rParam = checkCC.chkShokaishaName(handle, param, DUMMY_FIXED_TEXT);

			HashMap<?, ?> resultMap = (HashMap<?, ?>)rParam.getData(DUMMY_FIXED_TEXT);
			Object retrunCd = resultMap.get("return_cd");

			responseParam.put(PARAM_RESULT, retrunCd); // 結果を設定
		}
		catch (Throwable e)
		{
			// 更新に失敗した場合はCCException
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_9000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, JKKStrConst.RETURN_MESSAGE_SYSTEM_ERROR);
			throw new CCException("", e);
		}

		// 返却値を設定する
		param.setData(fixedText, responseParam);

		// 結果の格納
		return param;
	}
	
	/**
	 * パラメータ入力チェックを行いエラーのリストを返す
	 * <br>
	 * @param dataMap 対象のパラメータ
	 * @return エラー情報のリスト（エラーがなければ空）
	 */
	private ArrayList<HashMap<String, Object>>  getParameterErrorInfo(HashMap<String, Object> dataMap)
	{
		ArrayList<HashMap<String, Object>> errList = new ArrayList<HashMap<String, Object>>();
		
		// 紹介コード 必須
		{
			String intr_cd = (String)dataMap.get(PARAM_INTR_CD); 
			String errCd = checkError(intr_cd, true, AttrType.NUM_ALF_1, 10, 10, null);
			if (errCd != null)
			{
				errList.add(createErrorMap(errCd, PARAM_INTR_CD, intr_cd));
				return errList;
			}
		}
		// 契約種別 必須
		{
			String kei_sbt = (String)dataMap.get(PARAM_KEI_SBT);
			String errCd = checkError(kei_sbt, true, AttrType.NUM_ALF_1, 1, 1, codeCheckList);
			if (errCd != null)
			{
				errList.add(createErrorMap(errCd, PARAM_KEI_SBT, kei_sbt));
				return errList;
			}
		}
		// 被紹介者名（姓）[任意]
		{
			String hishokai_nm_last = (String)dataMap.get(PARAM_HISHOKAI_NM_LAST);
			String errCd = checkError(hishokai_nm_last, false, AttrType.ZENKAKU, 1, 121, null);
			if (errCd != null)
			{
				errList.add(createErrorMap(errCd, PARAM_HISHOKAI_NM_LAST, hishokai_nm_last));
				return errList;
			}
		}
		// コード識別子 必須
		{
			String cdSkbt = (String)dataMap.get(CD_SKBT);
			String errCd = checkError(cdSkbt, false, AttrType.NUM_ALF_1, 2, 2, null);
			if (errCd != null)
			{
				errList.add(createErrorMap(errCd, CD_SKBT, cdSkbt));
				return errList;
			}
		}

		return errList;
	}
	
	/**
	 * エラーチェックを行い、エラーが見つかった場合、エラーコードを返す。
	 * <br>
	 * @param src	対象のオブジェクト
	 * @param required	必須チェックを行うかを指定
	 * @param attrType	属性チェックの種類を指定
	 * @param min	桁数（最小値）を指定
	 * @param max	桁数（最大値）を指定
	 * @param ref	リファレンスリスト 
	 * @return エラーが無ければnull。エラーが見つかった場合はエラーコードを返す。
	 */
	private String checkError(Object src, boolean required, AttrType attrType, int min, int max, List<String> ref)
	{
		String target = (String)src;
		
		// 必須チェック
		if (required && JKKStringUtil.isNullBlank((String)target))
		{
			return REQUIRED_ERROR;
		}
		// 属性チェックエラー(半角英数１)
		else if (AttrType.NUM_ALF_1.equals(attrType) && !JKKStringUtil.isNullBlank((String)target) && !HalfCharCheck.isEnNumber1Check(target))
		{
			return ATTRIBUTE_ERROR;
		}
		// 属性チェックエラー(半角数字１)
		else if (AttrType.NUM_1.equals(attrType) && !JKKStringUtil.isNullBlank((String)target) && !HalfCharCheck.isNumber1Check(target))
		{
			return ATTRIBUTE_ERROR;
		}
		// 属性チェックエラー(全角)
		else if (AttrType.ZENKAKU.equals(attrType) && !JKKStringUtil.isNullBlank((String)target) && !MixCharCheck.isNameAddressCheck(target))
		{
			return ATTRIBUTE_ERROR;
		}
		// 桁数チェックエラー
		else if (min == max && !JKKStringUtil.isNullBlank((String)target) && !LengthCheck.isLength1Check(target, min))
		{
			return LENGTH_ERROR;
		}
		// 桁数チェックエラー
		else if (min != max && !JKKStringUtil.isNullBlank((String)target) && !LengthCheck.isLength2Check(target, min, max))
		{
			return LENGTH_ERROR;
		}
		// コードチェックエラー
		else if (!JKKStringUtil.isNullBlank((String)target) && ref != null && !ref.contains(target))
		{
			return CODE_ERROR;
		}
		return null;
	}
	
	/**
	 * エラーマップを作成する。
	 * <br>
	 * @param cd エラーコード
	 * @param msg エラーメッセージ
	 * @return
	 */
	private HashMap<String, Object> createErrorMap(String cd, String param, String value)
	{
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put(KEY_ERR_CD, cd);
		if (param == null)
		{
			map.put(KEY_ERRMSG, "");
		}
		else
		{
			map.put(KEY_ERRMSG, param + ":" + value);
		}
		return map;
	}
	
	/**
	 * 被紹介者名を返却する。
	 * 
	 * @param intro_cd
	 * @param kei_sbt
	 * @param hishokai_nm
	 * @param bunrui_cd "1":eoエントリーコード（有効期限あり）、"2":通常の紹介コード（紹介コード独自チェック対象）
	 * @return 被紹介者名返却する。nullの場合、エラー
	 */
	private String getHiShokaiName(String intro_cd, String kei_sbt, String hishokai_nm, String bunrui_cd, ArrayList<HashMap<String, Object>> errList)
	{
		// amazon専用コード
		if (intro_cd.startsWith(AMAZON_INTR_PREFIX))
		{
			return "";
		}
		// eoエントリーコード（有効期限あり）
		else if ("1".equals(bunrui_cd))
		{
			return "";
		}
		// プレクラ用コード
		else if (intro_cd.matches(PRECL_INTR_MACH_CD))
		{
			return "";
		}
		// 通常の紹介コード（紹介コード独自チェック対象）
		else if (JFUStrConst.RED_INTRODUCE_BUNRUI_YK_TUJYO_KIGEN.equals(bunrui_cd))
		{
			return "";
		}
		// 上記以外
		else 
		{
			// 個人かつ、被紹介者名称が未設定の場合はエラー
			if ("1".equals(kei_sbt) && JKKStringUtil.isNullBlank(hishokai_nm))
			{
				// エラーリストに追加
				errList.add(createErrorMap(HISHOKAI_ERROR, null, null));
				return null;
			}
			else if ("2".equals(kei_sbt))
			{
				return "";	// 法人の場合、名称の指定なし
			}
		}
		return hishokai_nm;
	}

	/**
	 * 分類コードの取得
	 * <br>
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param intro_cd
	 * @return
	 * @throws Exception
	 */
	private String getBunruiCd(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String intro_cd) throws Exception
	{
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		Object[][] ezm0321a010IN = new Object[][] {
				{EZM0321A010CBSMsg.TEMPLATEID, TEMPLATE_ID_EZM0321A010},
				{EZM0321A010CBSMsg.FUNC_CODE, "1"},
				{EZM0321A010CBSMsg.KEY_WORK_PARAM_ID, "FU_EO_ENTRY_YK_KIGEN"},
		};
		CAANMsg[] ezm0321a010OUT = callSC(handle, scCall, param, fixedText, ezm0321a010IN).getCAANMsgList(EZM0321A010CBSMsg.EZM0321A010CBSMSG1LIST);
		if (ezm0321a010OUT != null && ezm0321a010OUT.length > 0)
		{
			String valueList = ezm0321a010OUT[0].getString(EZM0321A010CBSMsg1List.WORK_PARAM_SETTE_VALUE);
			String[] values = valueList.split(",");
			for (String one : values)
			{
				if (intro_cd.startsWith(one))
				{
					return "1";
				}
			}
		}
		
		return "";
	}
	
	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * 
	 * @param handle
	 * @param scCall
	 * @param param
	 * @param dataMapKey
	 * @param mappingData
	 * @return CAANMsg
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle,
							ServiceComponentRequestInvoker scCall,
							IRequestParameterReadWrite param,
							String dataMapKey,
							Object[][] mappingData) throws Exception
	{
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);
		
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];
		
		// リターンコード取得
		int returnCode = (Integer)result.get(JCMConstants.RET_CD_INT_KEY);
		
		int templateStatus = msg.getInt(STATUS);
		
		if (returnCode != 0)
		{
			templateStatus = 9000;
		}
		
		if (JCMAPLConstMgr.getString("RETURN_MESSAGE_" + String.format("%1$04d", templateStatus)) == null)
		{
			templateStatus = 0;
		}
		
		int bpStatus = 0;
		Object obj = param.getControlMapData(SCControlMapKeys.RETURN_CODE);
		
		if (obj == null)
		{
			bpStatus = -1;
		}
		else
		{
			bpStatus = Integer.parseInt((String)param.getControlMapData(SCControlMapKeys.RETURN_CODE));
		}
		
		if (templateStatus > bpStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format("%1$04d", templateStatus);
			String message = JCMAPLConstMgr.getString("RETURN_MESSAGE_" + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		
		setErrorInf(msg, (HashMap<String, Object>)param.getData(dataMapKey));
		
		//エラー情報のマップを取得
		ArrayList<Object> errList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if (errList == null)
		{
			errList = new ArrayList<Object>();
		}
		
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, TemplateErrorUtil.getErrorInfo(result, errList));
		
		/* ◇処理結果の判定*/
		// 取得したリターンコード、ステータスの内容を見て異常かどうかの判断をする。
		String rtnCode = result.get(JCMConstants.RET_CD_INT_KEY).toString();
		Integer status = msg.getInt(JCMConstants.STATUS_INT_KEY);
		
		// 異常の場合、SCCallExceptionを生成してスローする
		if(!("0".equals(rtnCode) && 0 == status.intValue()))
		{
			SCCallException scCallEx = new SCCallException("戻り値不正", rtnCode, status);
			throw scCallEx;
		}
		return msg;
	}

	/**
	 * エラー情報を設定します。
	 * 
	 * @param msg
	 * @param map
	 * 
	 */
	@SuppressWarnings("unchecked")
	private void setErrorInf(CAANMsg msg, HashMap<String, Object> map)
	{
		Iterator<String> msgKey = msg.getSchema().getSchemaKeySet().iterator();
		
		while (msgKey.hasNext())
		{
			String key = msgKey.next();
			
			if (key.endsWith("_err"))
			{
				if (!msg.isNull(key))
				{
					if (!map.containsKey(key))
					{
						map.put(key, msg.getString(key));
					}
				}
			}
		}
	}

	/**
	 * 共通領域のメッセージを作成します。
	 * 
	 * @param param
	 * @param mappingData
	 * @return HashMap<String, Object>
	 * @throws RequestParameterException
	 */
	private HashMap<String, Object> editInMsg(IRequestParameterReadWrite param, Object[][] mappingData) throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		
		// 【取得元：電文ヘッダ(ヘッダ)】
		// 電文ID
		paramMap.put(JCMConstants.TRANZACTION_ID_KEY, param.getTelegramID());
		// ユースケースID
		paramMap.put(JCMConstants.USECASE_ID_KEY, param.getUsecaseID());
		// オペレーションID
		paramMap.put(JCMConstants.OPERATION_ID_KEY, param.getOperationID());
		// サービス呼び出し区分
		paramMap.put(JCMConstants.CALL_TYPE_KEY, param.getCallType());
		
		// 【取得元：ユーザエリア(コントロールマップ)】
		// 依頼先ホスト名
		paramMap.put(JCMConstants.CLIENT_HOST_NAME_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTNAME));
		// 依頼元IPアドレス
		paramMap.put(JCMConstants.CLIENT_IP_ADDRESS_KEY, param.getControlMapData(SCControlMapKeys.REQ_HOSTIP));
		// 依頼元画面ID
		paramMap.put(JCMConstants.INVOKE_GAMEN_ID_KEY, param.getControlMapData(SCControlMapKeys.REQ_VIEWID));
		// オペレータID
		paramMap.put(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		
		String svcIf = (String)mappingData[0][1];
		
		CAANMsg template = new CAANMsg(String.format("eo.ejb.cbs.cbsmsg.%sCBSMsg", svcIf));
		
		// オペレータID
		template.set(JCMConstants.OPERATOR_ID_KEY, param.getControlMapData(SCControlMapKeys.OPERATOR_ID));
		// 運用日付
		template.set(JCMConstants.OPERATE_DATE_KEY, param.getControlMapData(SCControlMapKeys.OPE_DATE));
		// 運用日時
		template.set(JCMConstants.OPERATE_DATETIME_KEY, param.getControlMapData(SCControlMapKeys.OPE_TIME));
		
		for (int i = 0; i < mappingData.length; i++)
		{
			if ("".equals(mappingData[i][1]))
			{
				template.setNull((String)mappingData[i][0]);
			}
			else
			{
				template.set((String)mappingData[i][0], mappingData[i][1]);
			}
		}
		
		setNullToMsg(template);
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = template;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		return paramMap;
	}

	/**
	 * 未入力項目にnullを設定します。
	 * @param msg
	 */
	@SuppressWarnings("unchecked")
	private void setNullToMsg(CAANMsg msg)
	{
		Iterator<String> caanMsgKeys = msg.getSchema().getSchemaKeySet().iterator();
		while (caanMsgKeys.hasNext())
		{
			String key = caanMsgKeys.next();
			if (key.endsWith("_err"))
			{
				String tmpKey = key.substring(0, key.length() - 4);
				
				if (!msg.containsKeyOfMsgData(tmpKey))
				{
					msg.setNull(tmpKey);
				}
			}
		}
	}

	/**
	 * 通常の紹介コード（紹介コード独自チェック対象）かどうかを取得します。
	 * 
	 * @param handle SessionHandle
	 * @param param IRequestParameterReadWrite
	 * @param paramMap パラメータ
	 * @return "2":紹介コード独自チェック対象、その他：紹介コード独自チェック対象以外
	 * @throws Exception 
	 */
	private String getKkIntrcdChkTg(SessionHandle handle, IRequestParameterReadWrite param, HashMap<String, Object> paramMap) throws Exception
	{

		// 業務パラメータから「紹介コード独自チェック対象」を取得
		List<String> kkIntrcdChkTgList = JFUBPCommon.getWorkParamSplit(handle, param, "KK_INTRCD_CHK_TG");

		if ((kkIntrcdChkTgList == null) || (kkIntrcdChkTgList.size() == 0) || (paramMap == null) || (paramMap.size() == 0))
		{
			// 紹介コード独自チェック対象以外
			return JFUStrConst.EMPTY;
		}
		String intr_cd = (String)paramMap.get(PARAM_INTR_CD);
		for (String wCd : kkIntrcdChkTgList)
		{
			if (intr_cd.startsWith(wCd))
			{
				// 紹介コード独自チェック対象
				return JFUStrConst.RED_INTRODUCE_BUNRUI_YK_TUJYO_KIGEN;
			}
		}
		// 紹介コード独自チェック対象以外
		return JFUStrConst.EMPTY;
	}
}
