/** ***************************************************************************
/* KKSV0118OPOperation.java All Rights reserved,Copyright (c) K-Opticom
/*＜プログラム内容＞
/*   システム名      ：eo顧客基幹システム
/*   モジュール名    ：サービス契約照査NGチェック部品
/*   ソースファイル名：JKKSvkeiShosaNgChkCC.java
/*   作成者          ：富士通
/*   日付            ：2011年04月01日
/*＜機能概要＞
/*   サービス契約照査チェック部品です。
/*＜修正履歴＞
/*   バージョン  修正日       修正者      修正内容
/*   v1.00.00                             新規作成
/*   v4.00.00    2012/8/1     FJ) 田原   【現行ICS指摘対応(照査チェック機能確認)：10】
/*                                         No49_審査結果補記チェック（照査NG）
/*   v5.00.00    2013/01/22   FJ）藤本   【ANK-1272-00-00】【スマートバリュー】フォロー対応
 */
/*****************************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.constant.JKKSvkeiShosaNGChkConstCC;
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.IRequestParameterReadOnly;
import com.fujitsu.futurity.bp.x21.bpm.parameter.IRequestParameterReadWrite;
import com.fujitsu.futurity.bp.x21.cc.AbstractCommonComponent;
import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.common.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.base.CAANMsg;

import eo.common.constant.JKKStrConst;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0081A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0091C013CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0101C013CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0111C013CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0121C013CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0141C013CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2441B003CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK2441B003CBSMsg1List;

/**
 * サービス契約照査NGチェック処理です。<p>
 * <br>
 * @author FJ
 */
public class JKKSvkeiShosaNgChkCC extends AbstractCommonComponent
{
	/** 起動元コード */
	public static final String KIDO_CD_ON = "01";
	
	/** 照査対象コード */
	public static final String SHOSA_TRG_CD = "shosa_trg_cd";
	
	/** 照査結果コード */
	public static final String SHOSA_RLT_CD = "shosa_rlt_cd";
	
	/** 照査結果NG */
	public static final String SHOSA_RLT_NG = "1";
	
	/** サービスコード　01：インターネット */
	public static final String SVC_CD_NET = "01";
	
	/** サービスコード　02：電話 */
	public static final String SVC_CD_TEL = "02";
	
	/** サービスコード　03：テレビ */
	public static final String SVC_CD_TV = "03";
	
	/** 料金グループコード　02：eo光ネットホームタイプ */
	public static final String PRC_GRP_CD_HOME = "02";
	
	/** 料金グループコード　03：eo光ネットメゾンタイプ */
	public static final String PRC_GRP_CD_MEZON = "03";
	
	/** 料金グループコード　04：eo光ネットマンションタイプ */
	public static final String PRC_GRP_CD_MANS = "04";
	
	/** 料金グループコード　05：eoADSL(eAccess) */
	public static final String PRC_GRP_CD_EACCESS = "05";
	
	/** 料金グループコード　06：eoADSL(フレッツ) */
	public static final String PRC_GRP_CD_FU = "06";
	
	/** 料金グループコード　07：eoモバイル(Wi-Fi) */
	public static final String PRC_GRP_CD_WIFI = "07";
	
	/** 料金グループコード　08：eoモバイル(EM) */
	public static final String PRC_GRP_CD_EM = "07";
	
	/** 料金グループコード　09：eoモバイル(UQ-WiMAX) */
	public static final String PRC_GRP_CD_WIMAX = "07";
	
	/** サービス種別コード　01：eo光ネット */
	public static final int SVC_SBT_CD_HNET = 1;
	
	/** サービス種別コード　02：eo光TV */
	public static final int SVC_SBT_CD_HTV = 2;
	
	/** サービス種別コード　03：eo光電話 */
	public static final int SVC_SBT_CD_HTEL = 3;
	
	/** サービス種別コード　04：eoモバイル */
	public static final int SVC_SBT_CD_MOBA = 4;
	
	/** サービス種別コード　05：eoADSL */
	public static final int SVC_SBT_CD_ADSL = 5; 
	
	/** 照査エラー種別コード　申込関連エラー */
	public static final String ERR_SBT_CD_MSKM = "01";
	
	/** 照査エラー種別コード　お客様関連エラー */
	public static final String ERR_SBT_CD_CUST = "02";
	
	/** 照査エラー種別コード　請求関連エラー */
	public static final String ERR_SBT_CD_SEIKY = "03";
	
	/** 照査エラー種別コード　サービス関連エラー */
	public static final String ERR_SBT_CD_SVC = "04";
	
	/** 照査エラー種別コード　住所関連エラー */
	public static final String ERR_SBT_CD_AD = "05";
	
	/** 照査エラー種別コード　利用場所関連エラー */
	public static final String ERR_SBT_CD_PLC = "";
	
	/** 照査エラー種別コード　オプション関連エラー */
	public static final String ERR_SBT_CD_OP = "06";
	
	/** 照査エラー種別コード　機器関連エラー */
	public static final String ERR_SBT_CD_KIKI = "07";
	
	/** 照査エラー種別コード　割引関連エラー */
	public static final String ERR_SBT_CD_WRIB = "08";
	
	/** 照査エラー種別コード　その他エラー */
	public static final String ERR_SBT_CD_OTR = "99";

	// ANK-1272-00-00 【スマートバリュー】フォロー対応 2013/01/22 START
	/** 照査対象コード　仮登録スマートバリュー存在チェック */
	public static final String SHOSA_TRG_CD_SMTVL_EXISTS_CHK = "060";
	// ANK-1272-00-00 【スマートバリュー】フォロー対応 2013/01/22 END

	/** 照査OKの場合にサービスインタフェース呼び出しで使用するマッパー群 */
	private JKKSvkeiShosaChkShosaNgChkMapperCC shosaNgChkMapper = null;

	/** エラー変換テーブル */
	private HashMap<String, HashMap<String, Object>> shosaErrorChgTbl = null;
	
	
	/**
	 * マッパーを作成する処理です。
	 * 
	 * <br>
	 */
	private void createMapper()
	{
		shosaNgChkMapper = new JKKSvkeiShosaChkShosaNgChkMapperCC();
	}

	/**
	 * 照査チェックエラーの変換テーブルを作成します。
	 * 
	 * @param kidoCd 起動元コード
	 * 
	 */
	private void createErrorChgTbl(String kidoCd)
	{
		HashMap<String, HashMap<String, Object>> wkErrorChgTbl = new HashMap<String, HashMap<String, Object>>();
		
		// ANK-1272-00-00 【スマートバリュー】フォロー対応 2013/01/22 START
		// 照査エラー変換テーブルに照査エラーメッセージレベルを追加(第5引数)
		// 申込年月日期間超過チェック
		setErrorChgTbl(wkErrorChgTbl, "001", ERR_SBT_CD_MSKM, "EKB7390-CE", "E");
		// サービス利用開始希望年月日設定チェック
		setErrorChgTbl(wkErrorChgTbl, "002", ERR_SBT_CD_SVC, "EKB7400-CE", "E");
		// 面開発案件チェック
		setErrorChgTbl(wkErrorChgTbl, "004", ERR_SBT_CD_SVC, "EKB7420-CE", "E");
		// 提供必須機器チェック
		setErrorChgTbl(wkErrorChgTbl, "005", ERR_SBT_CD_KIKI, "EKF0840-TW", "E");
		// 提供外機器存在チェック
		setErrorChgTbl(wkErrorChgTbl, "006", ERR_SBT_CD_SVC, "EKF0800-KW", "E");
		// 機器提供サービス下限チェック
		setErrorChgTbl(wkErrorChgTbl, "007", ERR_SBT_CD_KIKI, "EKF0800-KW", "E");
		// 機器提供サービス上限チェック
		setErrorChgTbl(wkErrorChgTbl, "008", ERR_SBT_CD_KIKI, "EKF0800-KW", "E");
		// 提供必須オプションチェック
		setErrorChgTbl(wkErrorChgTbl, "009", ERR_SBT_CD_OP, "EKB8800-CE", "E");
		// 提供外オプション存在チェック
		setErrorChgTbl(wkErrorChgTbl, "010", ERR_SBT_CD_OP, "EKB7430-CE", "E");
		// オプションサービス下限チェック
		setErrorChgTbl(wkErrorChgTbl, "011", ERR_SBT_CD_OP, "EKB7430-CE", "E");
		// オプションサービス上限チェック
		setErrorChgTbl(wkErrorChgTbl, "012", ERR_SBT_CD_OP, "EKB7430-CE", "E");
		// 自動登録割引存在チェック
		setErrorChgTbl(wkErrorChgTbl, "013", "", "", "W");
		// 適用外割引存在チェック
		setErrorChgTbl(wkErrorChgTbl, "014", "", "", "W");
		// 自動登録データ抽出項目存在チェック
		setErrorChgTbl(wkErrorChgTbl, "015", "", "", "W");
		// 適用外データ抽出項目存在チェック
		setErrorChgTbl(wkErrorChgTbl, "016", "", "", "W");
		// 督促状態チェック
		setErrorChgTbl(wkErrorChgTbl, "017", ERR_SBT_CD_SEIKY, "EKF0660-KW", "E");
		// お客様退会チェック
		setErrorChgTbl(wkErrorChgTbl, "018", ERR_SBT_CD_CUST, "EKF0570-KW", "E");
		// オプション引継チェック
		setErrorChgTbl(wkErrorChgTbl, "019", ERR_SBT_CD_OP, "EKB7400-CE", "E");
		// オプション引継希望チ
		setErrorChgTbl(wkErrorChgTbl, "020", ERR_SBT_CD_OP, "EKB7440-CE", "E");
		// 部屋番号重複チェック
		setErrorChgTbl(wkErrorChgTbl, "021", ERR_SBT_CD_SVC, "EKF0470-KW", "E");
		// 同番移転存在チェック
		setErrorChgTbl(wkErrorChgTbl, "022", ERR_SBT_CD_SVC, "EKB7450-CE", "E");
//		// 同番移転状態チェック
//		setErrorChgTbl(wkErrorChgTbl, "023", "", "");
		// 利用場所番地未確定チェック
		setErrorChgTbl(wkErrorChgTbl, "025", ERR_SBT_CD_AD, "EKF0640-KW", "E");
		
		if (KIDO_CD_ON.equals(kidoCd))
		{
			// オンライン
			// サービス利用開始希望年月日未来日チェック
			setErrorChgTbl(wkErrorChgTbl, "003", ERR_SBT_CD_SVC, "EKB1950-TW", "E");
			// 入居予定年月日未来日チェック
			setErrorChgTbl(wkErrorChgTbl, "024", ERR_SBT_CD_SVC, "EKB1950-TW", "E");
			
			//現行ICS指摘対応(照査チェック機能確認)：10 2012/8/1 START
			/**照査対象コード(審査結果補記チェック（照査NG）)**/
			setErrorChgTbl(wkErrorChgTbl, "041", "", "EKBC170-KW", "W");
			//現行ICS指摘対応(照査チェック機能確認)：10 2012/8/1 END
			// ANK-1272-00-00 【スマートバリュー】フォロー対応 2013/01/22 START
			// 仮登録スマートバリュー存在チェック
			setErrorChgTbl(wkErrorChgTbl, SHOSA_TRG_CD_SMTVL_EXISTS_CHK, "", "EKB8380--Q", "W");
			// ANK-1272-00-00 【スマートバリュー】フォロー対応 2013/01/22 END
			
		}
		else
		{
			// バッチ
			// サービス利用開始希望年月日未来日チェック
			setErrorChgTbl(wkErrorChgTbl, "003", ERR_SBT_CD_SVC, "EKB7390-CE", "E");
			// 入居予定年月日未来日チェック
			setErrorChgTbl(wkErrorChgTbl, "024", ERR_SBT_CD_SVC, "EKB7390-CE", "E");
		}
		// ANK-1272-00-00 【スマートバリュー】フォロー対応 2013/01/22 END

		this.shosaErrorChgTbl = wkErrorChgTbl;
	}
	
	// ANK-1272-00-00 【スマートバリュー】フォロー対応 2013/01/22 START
	// 照査エラー変換テーブルに照査エラーメッセージレベルを追加
	/**
	 * 照査エラー変換テーブルにデータを設定します。
	 * 
	 * @param wkErrorChgTbl	照査エラー変換テーブル
	 * @param shosaTrgCd	照査対象エラーコード
	 * @param shosaErrorSbtCd	照査エラー種別コード
	 * @param shosaErrorMsgId	エラーメッセージＩＤ
	 * @param shosaErrorMsgLv 照査エラーメッセージレベル（E:エラーメッセージ、W:警告）
	 */
	private void setErrorChgTbl(HashMap<String, HashMap<String, Object>> wkErrorChgTbl, 
								String shosaTrgCd,
								String shosaErrorSbtCd,
								String shosaErrorMsgId,
								String shosaErrorMsgLv
								)
	{
		HashMap<String, Object> errorChgMap = new HashMap<String, Object>();
		
		errorChgMap.put(JKKSvkeiShosaNGChkConstCC.SHOSA_ERR_SBT_CD, shosaErrorSbtCd);
		errorChgMap.put(JKKSvkeiShosaNGChkConstCC.SHOSA_ERR_MSG_ID, shosaErrorMsgId);
		errorChgMap.put(JKKSvkeiShosaNGChkConstCC.SHOSA_ERR_MSG_LV, shosaErrorMsgLv);
		wkErrorChgTbl.put(shosaTrgCd, errorChgMap);
	}
	// ANK-1272-00-00 【スマートバリュー】フォロー対応 2013/01/22 END

	/**
	 * サービス契約照査NGチェック処理です。
	 * 
	 * サービス契約照査NGチェックでインプットとして必要なデータを
	 * 一意照会、一覧照会より取得してから
	 * サービス契約照査NGチェック処理をCallします。
	 * <br>
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param fixedText ユーザ任意文字列
	 * @return 業務データ取得・書込用I/F
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite chkSvkeiShosaNg(SessionHandle handle, 	IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない。
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		HashMap inMap = null;
		ArrayList<ArrayList<HashMap<String, Object>>> shosaErrorInfoList = new ArrayList<ArrayList<HashMap<String, Object>>>();
		//エラー情報のマップを取得
		ArrayList<Object> errorMapList = (ArrayList<Object>)param.getControlMapData(SCControlMapKeys.ERROR_INFO);
		if(errorMapList == null)
		{
			errorMapList = new ArrayList<Object>();
		}
	
		// マッパーを作成する
		createMapper();
		
		// ユーザデータ情報取得
		inMap = (HashMap)param.getData(JKKSvkeiShosaNGChkConstCC.TEMPLATE_ID);

		List shosaList = (List)inMap.get(JKKSvkeiShosaNGChkConstCC.SHOSA_CHK_LIST);

		HashMap svkeiData = (HashMap)shosaList.get(0);
		
		String kidoCd = (String)svkeiData.get(JKKSvkeiShosaNGChkConstCC.KIDO_CD);
		
		// 照査チェックエラー変換ＴＢＬ作成
		createErrorChgTbl(kidoCd);

		// ANK-1272-00-00 【スマートバリュー】フォロー対応 2013/01/22 START
		int userDataIndexNet = Integer.MIN_VALUE;
		int userDataIndexTel = Integer.MIN_VALUE;
		// ANK-1272-00-00 【スマートバリュー】フォロー対応 2013/01/22 END

		// ユーザデータ情報に設定されたサービス契約情報分、サービス契約照査NGチェック処理を行う
		for (int i = 0; i < shosaList.size(); i++)
		{
			ArrayList<Object> workErrorList = null;
			String svcCd = null;
			String prcGrpCd = null;
			int svcSbtCd = 0;
			
			List<CAANMsg> wkCaanMsgList = null;
			HashMap<String, Object> wkRsltMap = null;
			Map<?, ?> rsltEKK0081A010 = null;	// サービス契約一意照会
			CAANMsg[] workEKK0081A010 = null;
			Map<?, ?> rsltShosa = null;	// 照査NGチェック結果
			CAANMsg[] workRsltShosa = null;
			ArrayList<HashMap<String, Object>> shosaErrorInfo = null;
			
			// サービス契約一意照会のマッピング
			wkCaanMsgList = shosaNgChkMapper.editInMsgEKK0081A010(param, i);
			wkRsltMap = editInMsgCmn(param, wkCaanMsgList.get(0));

			// サービス契約一意照会の実行
			rsltEKK0081A010 = scCall.run(wkRsltMap, handle);

			workEKK0081A010 = getWorkData(EKK0081A010CBSMsg.EKK0081A010CBSMSG1LIST, rsltEKK0081A010);
			
			if( null != workEKK0081A010)
			{
				svcCd = workEKK0081A010[0].getString(EKK0081A010CBSMsg1List.SVC_CD);
				prcGrpCd = workEKK0081A010[0].getString(EKK0081A010CBSMsg1List.PRC_GRP_CD);
				svcSbtCd = getSvcSbtCd(svcCd, prcGrpCd);
				
				// サービス種別判定
				switch (svcSbtCd) 
				{
					case SVC_SBT_CD_HNET:
						// eo光ネット
						// サービス契約<eo光ネット>照査NGチェック
						wkCaanMsgList = shosaNgChkMapper.editInMsgEKK0091C013(param, i);
						wkRsltMap = editInMsgCmn(param, wkCaanMsgList.get(0));
	
						rsltShosa = scCall.run(wkRsltMap, handle);
						workRsltShosa = getWorkData(EKK0091C013CBSMsg.EKK0091C013CBSMSG1LIST, rsltShosa);
						workErrorList = shosaNgChkMapper.editResultRPEKK0091C013(rsltShosa, param);
						
						// ANK-1272-00-00 【スマートバリュー】フォロー対応 2013/01/22 START
						userDataIndexNet = i;
						// ANK-1272-00-00 【スマートバリュー】フォロー対応 2013/01/22 END

						break;
	
					case SVC_SBT_CD_HTV:
						// eo光テレビ
						// サービス契約<eo光TV>照査NGチェック
						wkCaanMsgList = shosaNgChkMapper.editInMsgEKK0101C013(param, i);
						wkRsltMap = editInMsgCmn(param, wkCaanMsgList.get(0));
	
						rsltShosa = scCall.run(wkRsltMap, handle);
						workRsltShosa = getWorkData(EKK0101C013CBSMsg.EKK0101C013CBSMSG1LIST, rsltShosa);
						workErrorList = shosaNgChkMapper.editResultRPEKK0101C013(rsltShosa, param);
						
						break;
	
					case SVC_SBT_CD_HTEL:
						// eo光電話
						// サービス契約<eo光電話>照査NGチェック
						wkCaanMsgList = shosaNgChkMapper.editInMsgEKK0111C013(param, i);
						wkRsltMap = editInMsgCmn(param, wkCaanMsgList.get(0));
	
						rsltShosa = scCall.run(wkRsltMap, handle);
						workRsltShosa = getWorkData(EKK0111C013CBSMsg.EKK0111C013CBSMSG1LIST, rsltShosa);
						workErrorList = shosaNgChkMapper.editResultRPEKK0111C013(rsltShosa, param);

						// ANK-1272-00-00 【スマートバリュー】フォロー対応 2013/01/22 START
						userDataIndexTel = i;
						// ANK-1272-00-00 【スマートバリュー】フォロー対応 2013/01/22 END

						break;
	
					case SVC_SBT_CD_MOBA:
						// eoモバイル
						// サービス契約<eoモバイル>照査チェック
						wkCaanMsgList = shosaNgChkMapper.editInMsgEKK0121C013(param, i);
						wkRsltMap = editInMsgCmn(param, wkCaanMsgList.get(0));
	
						rsltShosa = scCall.run(wkRsltMap, handle);
						workRsltShosa = getWorkData(EKK0121C013CBSMsg.EKK0121C013CBSMSG1LIST, rsltShosa);
						workErrorList = shosaNgChkMapper.editResultRPEKK0121C013(rsltShosa, param);
						
						break;
	
					default:
						// eoADSL
						// サービス契約<eoADSL>照査チェック
						wkCaanMsgList = shosaNgChkMapper.editInMsgEKK0141C013(param, i);
						wkRsltMap = editInMsgCmn(param, wkCaanMsgList.get(0));

						rsltShosa = scCall.run(wkRsltMap, handle);
						workRsltShosa = getWorkData(EKK0141C013CBSMsg.EKK0141C013CBSMSG1LIST, rsltShosa);
						workErrorList = shosaNgChkMapper.editResultRPEKK0141C013(rsltShosa, param);

						break;
				}

				// ANK-1272-00-00 【スマートバリュー】フォロー対応 2013/01/22 START
				// ネット・電話契約が照査NGにされている場合
				if ((SVC_SBT_CD_HNET == svcSbtCd || SVC_SBT_CD_HTEL == svcSbtCd)
					&& userDataIndexNet != Integer.MIN_VALUE && userDataIndexTel != Integer.MIN_VALUE)
				{
					// ネット契約に紐付く仮登録スマートバリュー存在チェック
					if (!chkExistsKariAddSmtvl(handle, param, userDataIndexNet, workRsltShosa, workErrorList))
					{
						// 電話契約に紐付く仮登録スマートバリュー存在チェック
						chkExistsKariAddSmtvl(handle, param, userDataIndexTel, workRsltShosa, workErrorList);
					}
				}
				// ANK-1272-00-00 【スマートバリュー】フォロー対応 2013/01/22 END

				// 照査エラーコードの変換
				shosaErrorInfo = chgErrorCd(workRsltShosa);
				shosaErrorInfoList.add(shosaErrorInfo);
			}
			
			errorMapList.addAll(workErrorList);
		}

		// 戻り値を設定
		setRsltData(param, shosaErrorInfoList);
		// コントロールマップに設定
		param.setControlMapData(SCControlMapKeys.ERROR_INFO, errorMapList);

		return param;
	}

	// ANK-1272-00-00 【スマートバリュー】フォロー対応 2013/01/22 START
	/**
	 * 申込単位の照査NGの場合に、仮登録のスマートバリューが存在するかどうかをチェックします。<br>
	 * 存在する場合は、照査NGチェック結果に仮登録スマートバリュー存在チェックのエラー情報を追加します。
	 * 
	 * @param handle セッションマネージャなどを持ったハンドル
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param userDataIndex param内のユーザデータのインデックス
	 * @param workRsltShosa 照査NGチェック結果
	 * @param workErrorList エラー情報リスト
	 * @return 仮登録スマートバリュー存在チェックのチェック結果がNGの場合はtrue、NGでない場合はfalse
	 * @throws Exception 例外は発生した場合
	 */
	private boolean chkExistsKariAddSmtvl(SessionHandle handle, IRequestParameterReadWrite param, int userDataIndex,
			CAANMsg[] workRsltShosa, ArrayList<Object> workErrorList)
	throws Exception {

		// 仮登録スマートバリュー存在チェックのチェック結果がNGかどうか
		boolean isNg = false;

		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();

		List<CAANMsg> wkCaanMsgList = shosaNgChkMapper.editInMsgEKK2441B003(param, userDataIndex);
		HashMap<String, Object> wkRsltMap = editInMsgCmn(param, wkCaanMsgList.get(0));

		Map<?, ?> rsltShokai = scCall.run(wkRsltMap, handle);
		CAANMsg[] eKK2441B003CBSMsg1List = getWorkData(EKK2441B003CBSMsg.EKK2441B003CBSMSG1LIST, rsltShokai);
		workErrorList = shosaNgChkMapper.editResultRPEKK2441B003(rsltShokai, param);
		// スマートバリューが存在する場合
		if (null != eKK2441B003CBSMsg1List && 0 < eKK2441B003CBSMsg1List.length)
		{
			String tajgsWribKeiCncYmd = eKK2441B003CBSMsg1List[0].getString(EKK2441B003CBSMsg1List.TAJGS_WRIB_KEI_CNC_YMD);
			// 他事業者割引契約締結年月日がnull、または初期値の場合
			if (null == tajgsWribKeiCncYmd || JKKStrConst.END_YMD_DEFAULT.equals(tajgsWribKeiCncYmd))
			{
				// 仮登録スマートバリュー存在チェックのエラー情報を上書き
				if (null != workRsltShosa)
				{
					for (int i = 0; i < workRsltShosa.length; i++)
					{
						String shosaTrgCd = workRsltShosa[i].getString(SHOSA_TRG_CD);
						if (SHOSA_TRG_CD_SMTVL_EXISTS_CHK.equals(shosaTrgCd))
						{
							// チェックNGとする
							workRsltShosa[i].set(SHOSA_RLT_CD, SHOSA_RLT_NG);
						}
					}
				}
				isNg = true;
			}
		}

		return isNg;
	}
	// ANK-1272-00-00 【スマートバリュー】フォロー対応 2013/01/22 END

	/**
	 * 照査NGチェック結果を設定します。
	 * <br>
	 * @param param モデルグループ、コントロールマップを含むパラメータオブジェクト
	 * @param errorInfoList エラー情報
	 * @return void
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private void setRsltData(IRequestParameterReadWrite param, ArrayList<ArrayList<HashMap<String, Object>>> errorInfoList)
	throws Throwable
	{
		// ユーザデータ情報
		HashMap<String, Object> inMap = (HashMap)param.getData(JKKSvkeiShosaNGChkConstCC.TEMPLATE_ID);
		
		List shosaList = (List)inMap.get(JKKSvkeiShosaNGChkConstCC.SHOSA_CHK_LIST);

		for (int i = 0; i < shosaList.size(); i++)
		{
			HashMap<String, Object> svkeiData = (HashMap)shosaList.get(i);
			
			ArrayList<HashMap<String, Object>> rsltData = errorInfoList.get(i);
			svkeiData.put(JKKSvkeiShosaNGChkConstCC.RSLT_SHOSA_CHK_LIST, rsltData);
		}
	}

	/**
	 * 業務データの取得処理です。
	 * <br>
	 * @param workMapKey 業務データのマップキー
	 * @param rsltShokai 一意照会、一覧照会の結果データ
	 * @return 業務データ
	 */
	private CAANMsg[] getWorkData(String workMapKey, Map<?, ?> rsltShokai)
	{
		CAANMsg[] templateArray = null;
		CAANMsg[] templates = (CAANMsg[])rsltShokai.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg parentTemplate = templates[0];

		templateArray = parentTemplate.getCAANMsgList(workMapKey);
		
		return templateArray;
	}

	/**
	 * サービス種別コードの取得処理です。
	 * サービスコード、料金グループコードからサービスを判定する。
	 * <br>
	 * @param svcCd サービスコード
	 * @param prcGrpCd 料金グループコード
	 * @return サービス種別コード
	 */
	private int getSvcSbtCd(String svcCd, String prcGrpCd)
	{
		int svcSbtCd = SVC_SBT_CD_HNET;
		
		if (svcCd.equals(SVC_CD_NET))
		{
			if (prcGrpCd.equals(PRC_GRP_CD_HOME) ||
				prcGrpCd.equals(PRC_GRP_CD_MEZON) ||
				prcGrpCd.equals(PRC_GRP_CD_MANS))
			{
				// eo光ネット
				svcSbtCd = SVC_SBT_CD_HNET;
			}
			else if (prcGrpCd.equals(PRC_GRP_CD_EACCESS) ||
				prcGrpCd.equals(PRC_GRP_CD_FU))
			{
				// eoADSL
				svcSbtCd = SVC_SBT_CD_ADSL;
			}
			else
			{
				// eoモバイル
				svcSbtCd = SVC_SBT_CD_MOBA;
			}
		}
		else if (svcCd.equals(SVC_CD_TEL))
		{
			// eo光電話
			svcSbtCd = SVC_SBT_CD_HTEL;
		}
		else
		{
			// eo光TV
			svcSbtCd = SVC_SBT_CD_HTV;
		}
		
		return svcSbtCd;
	}

	/**
	 * サービスI/F実行用の共通部を設定します<br>
	 * <br>
	 * 
	 * @param param (I) 業務データ取得用I/F
	 * @param msg データ登録内容
	 * @return オプションサービス契約作成数
	 * @throws RequestParameterException
	 * @exception RequestParameterExceptionがスローされます 。
	 */
	private HashMap<String, Object> editInMsgCmn(IRequestParameterReadOnly param, CAANMsg msg) 
	throws RequestParameterException
	{
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		/* SCインプット共通データ */
		// **********************************************
		// 【取得元：電文ヘッダ(ヘッダ)】
		// **********************************************
		// 電文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));
		
		CAANMsg[] templates = new CAANMsg[1];
		templates[0] = msg;
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
		
	}
	
	/**
	 * 照査NGチェックでエラーが発生した場合、<br>
	 * エラー情報を生成します。<br>
	 * <br>
	 * 
	 * @param workData 業務データ
	 * @return エラー情報
	 */
	private ArrayList<HashMap<String, Object>> chgErrorCd(CAANMsg[] workData)
	{
		ArrayList<HashMap<String, Object>> errorInfoList = new ArrayList<HashMap<String, Object>>();
		if ( null != workData ){
			for (int i = 0; i < workData.length; i++)
			{
				HashMap<String, Object> errorInfo = new HashMap<String, Object>();
				String shosaTrgCd = workData[i].getString(SHOSA_TRG_CD);		// 照査対象コード
				String shosaRltCd = workData[i].getString(SHOSA_RLT_CD);		// 照査結果コード
				
				if(shosaRltCd.equals(SHOSA_RLT_NG))
				{
					HashMap<String, Object> wkShosaErrorChgData = this.shosaErrorChgTbl.get(shosaTrgCd);
					errorInfo.put(JKKSvkeiShosaNGChkConstCC.SHOSA_ERR_SBT_CD, wkShosaErrorChgData.get(JKKSvkeiShosaNGChkConstCC.SHOSA_ERR_SBT_CD));
					errorInfo.put(JKKSvkeiShosaNGChkConstCC.SHOSA_ERR_MSG_ID, wkShosaErrorChgData.get(JKKSvkeiShosaNGChkConstCC.SHOSA_ERR_MSG_ID));
					// ANK-1272-00-00 【スマートバリュー】フォロー対応 2013/01/22 START
					errorInfo.put(JKKSvkeiShosaNGChkConstCC.SHOSA_CHK_TRGT_CD, shosaTrgCd);
					errorInfo.put(JKKSvkeiShosaNGChkConstCC.SHOSA_ERR_MSG_LV, wkShosaErrorChgData.get(JKKSvkeiShosaNGChkConstCC.SHOSA_ERR_MSG_LV));
					// ANK-1272-00-00 【スマートバリュー】フォロー対応 2013/01/22 END
					errorInfoList.add(errorInfo);
				}
			}
		}
		
		return errorInfoList;
	}

}
