/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKMemberRankInfoShokaiCC
*	ソースファイル名：JKKMemberRankInfoShokaiCC.java
*	作成者			：FJ)吉田
*	日付			：2019年02月01日
*＜機能概要＞
*	会員ランク情報登録の共通コンポーネントクラスです。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v41.00.00	2019/02/01	FJ)吉田		【ANK-3355-00-00】LINEへの契約情報連携
*	v41.00.01	2019/02/14	FJ)吉田		【IT1-2019-0000019】ランク照会レスポンスチェックで常時エラー
*	v41.00.02	2019/02/18	FJ)吉田		【IT1-2019-0000022】mineo単独の場合、返却値が変換されない
*	v41.00.03	2019/03/04	FJ)吉田		【IT1-2019-0000036】会員チェックエラー不正
*	v41.00.04	2019/03/15	FJ)吉田		【ANK-3355-10-00】LINE情報連携
*	v54.00.00	2021/06/28	FJ)杉本		【ANK-4087-00-00】LINE連携のプレクラランク返却仕様変更,
*										【ANK-4087-01-00】LINE連携のプレクラランク返却仕様変更(チケット残枚数0対応)
*	v66.00.00	2023/02/21	FJ)松永		【ANK-4307-00-00】【eo定期】プレミアムクラブリニューアル対応
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
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.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 eo.common.constant.JCKStrConst;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JKKStringUtil;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg;
import eo.ejb.cbs.cbsmsg.ECK0011A010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKKA0050001CBSMsg;
import eo.ejb.cbs.cbsmsg.EKKA0050001CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKKA0050001CBSMsg2List;
import eo.ejb.cbs.cbsmsg.EKKA0050001CBSMsg3List;
import eo.ejb.cbs.cbsmsg.EKKA0050001CBSMsg4List;

public class JKKMemberRankInfoShokaiCC extends AbstractCommonComponent
{

	// -------------
	// 作業用マップ
	// -------------
	/** 作業用マップ名 */
	private final String WORK_MAP_NAME = "JCKLineIdInfoAddCC";
	/** 作業用マップキー：ECK0011A010_お客さま一意照会 */
	private final String WORK_KEY_ECK0011A010 = "WM_ECK0011A010";
	/** 作業用マップキー：EKKA0050001_お客様ランク情報一意照会 */
	private final String WORK_KEY_EKKA0050001 = "WM_EKKA0050001";
	
	// ----------
	// TemplateID
	// ----------
	/** TamplateID：ECK0011A010_お客さま一意照会 */
	private final String TEMPLATE_ID_ECK0011A010 = "ECK0011A010";
	/** TamplateID：EKKA0050001_お客様ランク情報一意照会 */
	private final String TEMPLATE_ID_EKKA0050001 = "EKKA0050001";
	
	// ------------------------
	// CCパラメータ
	// ------------------------
	/** CCパラメータ：ボディ情報 */
	private final String CC_PARAM_BODY_INFO = "BODY_INFO";
	/** CCパラメータ：エラー情報 */
	private final String CC_PARAM_ERROR_INFO = "ERROR_INFO";
	
	// ------------------------
	// リクエストパラメータ定数
	// ------------------------
	/** リクエストパラメータ：SYSID */
	private final String REQ_PARAM_SYSID = "sysid";
	
	// ------------------------
	// レスポンスパラメータ定数
	// ------------------------
	/** レスポンスパラメータ：エラーコード */
	private final String RES_PARAM_ERRCODE = "errCode";
	/** レスポンスパラメータ：エラーメッセージ */
	private final String RES_PARAM_ERRMESSAGE = "errMessage";
	/** レスポンスパラメータ：会員種別 */
	private final String RES_PARAM_MEMBER_SBT = "member_sbt_cd";
	// ANK4307-00-00 MOD START
	// /** レスポンスパラメータ：プレミアムチケットランク */
	/** レスポンスパラメータ：プレミアムランク */
	private final String RES_PARAM_RNK_NM = "rnk_nm";
	// /** レスポンスパラメータ：チケット残枚数 */
	// private final String RES_PARAM_TIC_NUM = "tic_num";
	/** レスポンスパラメータ：通算獲得eoポイント数 */
	private final String RES_PARAM_TOTAL_PT_SU = "total_pt_su";
	/** レスポンスパラメータ：保有eoポイント数 */
	private final String RES_PARAM_HOYU_PT_SU = "hoyu_pt_su";
	// /** レスポンスパラメータ：チケット有効期限 */
	/** レスポンスパラメータ：ポイント有効期限 */
	private final String RES_PARAM_EXPIRE_DATE = "expire_date";
	/** レスポンスパラメータ：有効期限最短ポイント数 */
	private final String RES_PARAM_EXPIRE_DATE_IN_PT_SU = "expire_date_min_pt_su";
	// ANK4307-00-00 MOD END
	
	// ----------
	// エラー定数
	// ----------
	/** エラーコード */
	public static final String ERROR_CODE = "errCode";
	/** エラーメッセージ */
	public static final String ERROR_MESSAGE = "errMessage";
	/** リターンメッセージ取得キー */
	private static final String RETURN_MESSAGE_STRING = "RETURN_MESSAGE_";
	/** リターンメッセージの書式指定文字列 */
	private static final String RETURN_MESSAGE_FORMAT = "%1$04d";
	/** エラー項目接尾辞 */
	private static final String ERRITEM_SUFFIX = "_err";
	
	// ------------
	// クラス用定数
	// ------------
	/** お客様入退会コード：退会済 */
	private final String CUST_NTAIKAICD_TAIKAI = "1";
	
	// ANK-4307-00-00 DEL START
	// /** ランクコード：ランク外（ｍｉｎｅｏ） */
	// ▼▼▼ IT1-2019-0000022 MOD START ▼▼▼
//	private final String RNK_NM_OUT_MINEO = "ランク外（mineo単独）";
	// private final String RNK_CD_OUT_MINEO = "90";
	// ▲▲▲ IT1-2019-0000022 MOD END ▲▲▲
	
	// /** ランク名称：レギュラー会員 */
	// ▼▼▼ IT1-2019-0000022 MOD START ▼▼▼
//	private final String RNK_NM_REGRER = "レギュラー会員";
	// private final String RNK_NM_REGRER = "レギュラーメンバー";
	// ▲▲▲ IT1-2019-0000022 MOD END ▲▲▲
	// ▼▼▼ ANK-4087-00-00 ADD START ▼▼▼
	// /** ランク名称：非会員（ご契約がｍｉｎｅｏのみのため） */
	// private static final String RNK_NM_MINEO_ONLY = "非会員（ご契約がｍｉｎｅｏのみのため）";
	
	// /** チケット残枚数：0枚 */
	// private static final String TIC_NUM_ZERO = "0";
	// ▲▲▲ ANK-4087-00-00 ADD END ▲▲▲
	// ANK-4307-00-00 DEL END
	
	/** 会員種別コード：マスター会員(個人) */
	private final String MEMBER_SBT_CD_MASTER_KOJIN = "10";
	/** 会員種別コード：マスター会員(法人) */
	private final String MEMBER_SBT_CD_MASTER_HOJIN = "20";
	
	// ANK-4307-00-00 DEL START
	// ▼▼▼ ANK-3355-10-00 ADD START ▼▼▼
	// /** チケットステータス：未使用 */
	// private final String TICKET_STATS_NOT_USE = "0";
	// ▲▲▲ ANK-3355-10-00 ADD END ▲▲▲
	// ANK-4307-00-00 DEL END
	
	// ▼▼▼ IT1-2019-0000019 DEL START ▼▼▼
//	/** リターンコード */
//	private final String RETURN_CD_SUCSES = "0000";
	// ▲▲▲ IT1-2019-0000019 DEL END ▲▲▲
	// ANK-4307-00-00 ADD START
	/** 0ポイント */
	private static final String ZERO = "0";
	// ANK-4307-00-00 ADD END
	
	/**
	 * 会員ランク情報照会(LINE)を行う。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @return
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite searchRankLine(SessionHandle handle,
			IRequestParameterReadWrite param, String fixedText) throws Throwable
	{
	
		// ------------
		// CCマップ取得
		// ------------
		// LINE-ID情報登録(LINE)CCマップの取得
		Map<String, Object> ccMsg = (Map<String, Object>)param.getData(fixedText);
		
		// ----------------
		// 作業用マップ取得
		// ----------------
		HashMap workmap = getCCWorkMap(param);
		
		// ------------------
		// 各種エラーチェック
		// ------------------
		// 単項目チェック
		if (!unitErrorChk(ccMsg))
		{
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
			return param;
		}
		
		// 関連チェック
		if (!parameterErrorChk(handle, param, fixedText, ccMsg))
		{
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
			return param;
		}
		
		// 会員種別
		String memberSbtCd = "";
		// プレミアムチケットランク
		String rnkNm = "";
		// ANK-4307-00-00 MOD START
		// チケット残枚数
		// String ticNum = "";
		// ポイント有効期限
		String expireDate = "";
		// 通算獲得eoポイント数
		String totalPtSu = "";
		// 合計保有eoポイント数
		String hoyuPtSu = "";
		// 有効期限最短ポイント数
		String expireDateMinPtSu = "";
		// ANK-4307-00-00 MOD END
		
		// お客様一意照会
		List<Map<String, String>> resultEck0011a010 = (List<Map<String, String>>)workmap.get(WORK_KEY_ECK0011A010);
		
		memberSbtCd = resultEck0011a010.get(0).get(ECK0011A010CBSMsg1List.MEMBER_SBT_CD);
		
		// ランク情報照会
		Map<String, Object> resultEkka0050001 = (Map<String, Object>)workmap.get(WORK_KEY_EKKA0050001);
		
		// お客様ランク情報一意照会明細
		List<Map<String, String>> ekka0050001cbsmsg1list = (List<Map<String, String>>) resultEkka0050001.get(EKKA0050001CBSMsg.EKKA0050001CBSMSG1LIST);
		Map<String, String> ekka0050001cbsmsg1Map = ekka0050001cbsmsg1list.get(0);
		rnkNm = ekka0050001cbsmsg1Map.get(EKKA0050001CBSMsg1List.RNK_NM);
		// ANK-4307-00-00 DEL START
		// ticNum = ekka0050001cbsmsg1listMap.get(EKKA0050001CBSMsg1List.TIC_NUM);
		// ▼▼▼ IT1-2019-0000022 ADD START ▼▼▼
		// String rnkCd = ekka0050001cbsmsg1listMap.get(EKKA0050001CBSMsg1List.RNK_CD);
		// ▲▲▲ IT1-2019-0000022 ADD END ▲▲▲
		
		// ランク名称がランク外(mineo単独)だった場合
		// ▼▼▼ IT1-2019-0000022 MOD START ▼▼▼
//		if (RNK_NM_OUT_MINEO.equals(rnkNm))
		// ANK-4307-00-00 DEL END
		// if (RNK_CD_OUT_MINEO.equals(rnkCd))
		// ▲▲▲ IT1-2019-0000022 MOD END ▲▲▲
		// {
			// ▼▼▼ ANK-4087-00-00 MOD START ▼▼▼
//			// レギュラーメンバーを返却する
//			rnkNm = RNK_NM_REGRER;
			// 非会員（ご契約がｍｉｎｅｏのみのため）を返却する
			// rnkNm = RNK_NM_MINEO_ONLY;
			// ▲▲▲ ANK-4087-00-00 MOD END ▲▲▲
		// }

// ANK-4307-00-00 ADD START
		// 通算獲得eoポイント数・合計保有eoポイント数
		// 「ランク名称」が返却される場合かつ、「通算獲得eoポイント数」が返却されない場合
		if (!JKKStringUtil.isNullBlank(rnkNm) && JKKStringUtil.isNullBlank(ekka0050001cbsmsg1Map.get(EKKA0050001CBSMsg1List.TOTAL_PT_SU)))
		{
			totalPtSu = ZERO;
		}
		// 「ランク名称」が返却される場合かつ、「保有eoポイント数」が返却されない場合
		if (!JKKStringUtil.isNullBlank(rnkNm) && JKKStringUtil.isNullBlank(ekka0050001cbsmsg1Map.get(EKKA0050001CBSMsg1List.TOTAL_HOYU_PT_SU)))
		{
			hoyuPtSu = ZERO;
			expireDate = "";
			expireDateMinPtSu = "";
		}
		
		// 上記以外の場合
		if (!(!JKKStringUtil.isNullBlank(rnkNm) 
				&& (JKKStringUtil.isNullBlank(ekka0050001cbsmsg1Map.get(EKKA0050001CBSMsg1List.TOTAL_HOYU_PT_SU)) 
					|| JKKStringUtil.isNullBlank(ekka0050001cbsmsg1Map.get(EKKA0050001CBSMsg1List.TOTAL_PT_SU)))))
		{
			totalPtSu = ekka0050001cbsmsg1Map.get(EKKA0050001CBSMsg1List.TOTAL_PT_SU);
			hoyuPtSu = ekka0050001cbsmsg1Map.get(EKKA0050001CBSMsg1List.TOTAL_HOYU_PT_SU);
			
			// 現在日付を取得
			String sysDate = new SimpleDateFormat("yyyyMMdd").format(new Date(System.currentTimeMillis()));

			// 保有ポイント内訳リスト
			List<Map<String, String>> ekka0050001cbsmsg3list = 
				(List<Map<String, String>>)resultEkka0050001.get(EKKA0050001CBSMsg.EKKA0050001CBSMSG3LIST);
			for (Map<String, String> ekka0050001cbsmsg3 : ekka0050001cbsmsg3list)
			{
				// ポイント有効期限(適用終了日)
				String tempExpireDate = ekka0050001cbsmsg3.get(EKKA0050001CBSMsg3List.TEKIYO_ED_YMD);
				// 現在日時より未来かつ、(ポイント有効期限の値が空または、格納されているポイント有効期限より適用終了日が早い場合)←当日含む
				if((tempExpireDate.compareTo(sysDate) >= 0) 
						&& (JKKStringUtil.isNullBlank(expireDate) || tempExpireDate.compareTo(expireDate) <= 0))
				{
					expireDate = tempExpireDate;
					// 有効期限最短ポイント数
					expireDateMinPtSu = ekka0050001cbsmsg3.get(EKKA0050001CBSMsg3List.HOYU_PT_SU);
				}
			}
		}
		// ANK-4307-00-00 ADD END
		
		// ANK-4307-00-00 DEL START
//		// チケットリスト
//		List<Map<String, String>> ekka0050001cbsmsg3list = (List<Map<String, String>>)resultEkka0050001.get(EKKA0050001CBSMsg.EKKA0050001CBSMSG3LIST);
//		// 
//		for(int i = 0; i < ekka0050001cbsmsg3list.size(); i++)
//		{
//			// チケット有効期限
//			String tmp = ekka0050001cbsmsg3list.get(i).get(EKKA0050001CBSMsg3List.EXPIRE_DATE);
//			// ▼▼▼ ANK-3355-10-00 ADD START ▼▼▼
//			// チケットステータス
//			String stat = ekka0050001cbsmsg3list.get(i).get(EKKA0050001CBSMsg3List.TIC_STS_CD);
//			
//			// チケットステータスが未使用以外の場合
//			if (!TICKET_STATS_NOT_USE.equals(stat))
//			{
//				continue;
//			}
//			// ▲▲▲ ANK-3355-10-00 ADD END ▲▲▲
//			// ▼▼▼ ANK-3355-10-00 MOD START ▼▼▼
////			if (i == 0)
//			if (JKKStringUtil.isNullBlank(expireDate))
//			// ▲▲▲ ANK-3355-10-00 MOD END ▲▲▲
//			{
//				expireDate = tmp;
//			}
//			else
//			{
//				if (expireDate.compareTo(tmp) > 0)
//				{
//					expireDate = tmp;
//				}
//			}
//		}
		// ▼▼▼ ANK-4087-01-00 ADD START ▼▼▼
		// ランク名称が値あり かつ チケット残枚数が値なしの場合
//		if (!JKKStringUtil.isNullBlank(ekka0050001cbsmsg1listMap.get(EKKA0050001CBSMsg1List.RNK_NM)) && 
//				JKKStringUtil.isNullBlank(ekka0050001cbsmsg1listMap.get(EKKA0050001CBSMsg1List.TIC_NUM)))
//		{
//			// チケット残枚数に"0"を設定
//			ticNum = TIC_NUM_ZERO;
//		}
		
		// チケット残枚数が0枚の場合
//		if (TIC_NUM_ZERO.equals(ticNum))
//		{
//			// チケット有効期限に""を設定
//			expireDate = "";
//		}
		// ▲▲▲ ANK-4087-01-00 ADD END ▲▲▲
		// ANK-4307-00-00 DEL END
		
		// body用マップ
		Map<String, Object> bodyMap = new HashMap<String, Object>();
		
		//会員種別
		bodyMap.put(RES_PARAM_MEMBER_SBT, memberSbtCd);
		// プレミアムチケットランク
		bodyMap.put(RES_PARAM_RNK_NM, JKKStringUtil.nullToBlank(rnkNm));
		// ANK-4307-00-00 MOD START
		// チケット残枚数
		// bodyMap.put(RES_PARAM_TIC_NUM, JKKStringUtil.nullToBlank(ticNum));
		// チケット有効期限
		// bodyMap.put(RES_PARAM_EXPIRE_DATE, JKKStringUtil.nullToBlank(expireDate));
		// 通算獲得eoポイント数
		bodyMap.put(RES_PARAM_TOTAL_PT_SU, JKKStringUtil.nullToBlank(totalPtSu));
		// 合計保有eoポイント数
		bodyMap.put(RES_PARAM_HOYU_PT_SU, JKKStringUtil.nullToBlank(hoyuPtSu));
		// ポイント有効期限
		bodyMap.put(RES_PARAM_EXPIRE_DATE, JKKStringUtil.nullToBlank(expireDate));
		// 有効期限最短ポイント数
		bodyMap.put(RES_PARAM_EXPIRE_DATE_IN_PT_SU, JKKStringUtil.nullToBlank(expireDateMinPtSu));
		// ANK-4307-00-00 MOD END
		
		ccMsg.put(CC_PARAM_BODY_INFO, bodyMap);
		ccMsg.put(CC_PARAM_ERROR_INFO, new ArrayList<Map<String, String>>());
		
		return param;
	}
	
	
	/**
	 * 作業項目情報の取得を行います。<br>
	 * 作業項目情報がない場合は作成します。<br>
	 * 
	 * @param workMap 作業領域
	 * @return 作業項目情報
	 */
	@SuppressWarnings("unchecked")
	private HashMap getCCWorkMap(IRequestParameterReadWrite param) throws RequestParameterException {
		Map workMap = param.getMappingWorkArea();
		if (workMap == null)
		{
			workMap = new HashMap();
			param.setMappingWorkArea(workMap);
		}
		
		HashMap clarisWorkMap = (HashMap)workMap.get(WORK_MAP_NAME);
		if (clarisWorkMap == null)
		{
			clarisWorkMap = new HashMap();
			workMap.put(WORK_MAP_NAME, clarisWorkMap);
		}
		return clarisWorkMap;
	}
	
	/**
	 * 単項目エラーチェックを行います。
	 * 
	 * @param ccMsg 
	 * @return
	 */
	private boolean unitErrorChk(Map<String, Object> ccMsg)
	{
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
		String itemValue = null;
		
		// SYSID
		itemValue = (String)ccMsg.get(REQ_PARAM_SYSID);
		// 必須チェック
		if ( itemValue == null || "".equals(itemValue) )
		{
			// 必須チェックエラー
			errList.add(getReqErrInfMap(REQ_PARAM_SYSID));
		}
		else if (!HalfCharCheck.isEnNumber1Check(itemValue))
		{
			// 属性チェックエラー
			errList.add(getFormErrInfMap(REQ_PARAM_SYSID));
		}
		else if (!LengthCheck.isLength1Check(itemValue, 10))
		{
			// 桁数チェックエラー
			errList.add(getLenErrInfMap(REQ_PARAM_SYSID));
		}
		
		// エラーが存在する場合
		if (errList.size() > 0)
		{
			// body用マップ
			Map<String, Object> bodyMap = new HashMap<String, Object>();
			
			//会員種別
			bodyMap.put(RES_PARAM_MEMBER_SBT, "");
			// プレミアムチケットランク
			bodyMap.put(RES_PARAM_RNK_NM, "");
			// ANK-4307-00-00 MOD START
			// チケット残枚数
			// bodyMap.put(RES_PARAM_TIC_NUM, "");
			// チケット有効期限
			// bodyMap.put(RES_PARAM_EXPIRE_DATE, "");
			// 通算獲得eoポイント数
			bodyMap.put(RES_PARAM_TOTAL_PT_SU, "");
			// 保有eoポイント数
			bodyMap.put(RES_PARAM_HOYU_PT_SU, "");
			// ポイント有効期限
			bodyMap.put(RES_PARAM_EXPIRE_DATE, "");
			// 有効期限最短ポイント数
			bodyMap.put(RES_PARAM_EXPIRE_DATE_IN_PT_SU, "");
			// ANK-4307-00-00 MOD END
			
			ccMsg.put(CC_PARAM_BODY_INFO, bodyMap);
			ccMsg.put(CC_PARAM_ERROR_INFO, errList);
			return false;
		}
		
		return true;
	}
	
	/**
	 * 関連チェックエラーを行います。
	 * 
	 * @param ccMsg
	 * @return
	 * @throws Throwable 
	 */
	@SuppressWarnings("unchecked")
	private boolean parameterErrorChk(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, Map<String, Object> ccMsg) throws Throwable {
		
		HashMap workmap = getCCWorkMap(param);
		
		// ECK0011A010:お客さま一意照会
		execECK0011A010(handle, param, fixedText, (String)ccMsg.get(REQ_PARAM_SYSID));
		
		// お客さま一意照会の結果を取得する。
		// データリスト
		List<Map<String, String>> resultEck0011a010List = (List<Map<String, String>>)workmap.get(WORK_KEY_ECK0011A010);

		// お客さま一意照会の結果がない場合
		if(resultEck0011a010List == null || resultEck0011a010List.size() == 0)
		{
			// SYSID存在チェックエラー
			setResponse(param, ccMsg, JKKStrConst.RETURN_CD_2001, "");
			return false;
		}
		else
		{
			HashMap dataChildList = (HashMap)resultEck0011a010List.get(0);
			
			// 会員種別コード
			String memberSbtCd = (String)dataChildList.get(ECK0011A010CBSMsg1List.MEMBER_SBT_CD);
			// ▼▼▼ IT1-2019-0000036 ADD START ▼▼▼
			String orsJgsCd = (String)dataChildList.get(ECK0011A010CBSMsg1List.ORSJGS_CD);
			// ▲▲▲ IT1-2019-0000036 ADD END ▲▲▲
			// マスター会員（個人）:10、マスター会員（法人）:20でなければエラー
			// ▼▼▼ IT1-2019-0000036 MOD START ▼▼▼
//			if (memberSbtCd != null && !(MEMBER_SBT_CD_MASTER_KOJIN.equals(memberSbtCd) || MEMBER_SBT_CD_MASTER_HOJIN.equals(memberSbtCd)))
			if (memberSbtCd != null && 
					!((MEMBER_SBT_CD_MASTER_KOJIN.equals(memberSbtCd) || MEMBER_SBT_CD_MASTER_HOJIN.equals(memberSbtCd)) && JKKStringUtil.isNullBlank(orsJgsCd)))
			// ▲▲▲ IT1-2019-0000036 MOD END ▲▲▲
			{
				// 会員種別コードチェックエラー
				setResponse(param, ccMsg, JKKStrConst.RETURN_CD_2002, "");
				return false;
			}
			
			// お客様入退会コード
			String custNtaikaiCd = (String)dataChildList.get(ECK0011A010CBSMsg1List.CUST_NTAIKAI_CD);
			// お客様入退会コード:1であればエラー
			if (custNtaikaiCd != null && (CUST_NTAIKAICD_TAIKAI.equals(custNtaikaiCd)))
			{
				// 会員ステータスチェックエラー
				setResponse(param, ccMsg, JKKStrConst.RETURN_CD_2003, "");
				return false;
			}
			
			// SYSID
			String sysid = (String)ccMsg.get(REQ_PARAM_SYSID);
			
			memberSbtCd = resultEck0011a010List.get(0).get(ECK0011A010CBSMsg1List.MEMBER_SBT_CD);
			String eonetidMiikoFlg = resultEck0011a010List.get(0).get(ECK0011A010CBSMsg1List.EONETID_MI_IKO_FLG);
			
			// eonetID未移行フラグがnullの場合
			if (JKKStringUtil.isNullBlank(eonetidMiikoFlg))
			{
				// 「0:移行済」を設定
				eonetidMiikoFlg = JCKStrConst.CD00602_IKO_ZM;
			}
			
			// ▼▼▼ IT1-2019-0000019 ADD START ▼▼▼
			try
			{
			// ▲▲▲ IT1-2019-0000019 ADD END ▲▲▲
			// EKKA0050001:ランク情報照会
				execEKKA0050001(handle, param, fixedText, sysid, memberSbtCd, eonetidMiikoFlg);
				
				// ▼▼▼ IT1-2019-0000019 MOD START ▼▼▼
//				Map<String, Object> resultEkka0050001 = (Map<String, Object>)workmap.get(WORK_KEY_EKKA0050001);
//				
//				//正常終了:0000以外であればエラー
//				if (!RETURN_CD_SUCSES.equals(resultEkka0050001.get(EKKA0050001CBSMsg.STATUS)))
//				{
			}
			catch (Throwable e)
			{
			// ▲▲▲ IT1-2019-0000019 MOD END ▲▲▲
				// ランク情報照会レスポンスエラー
				setResponse(param, ccMsg, JKKStrConst.RETURN_CD_2004, "");
				return false;
			}
		}
		
		return true;
	}
	
	/**
	 * レスポンス項目を設定します。
	 * <br>
	 * @param ccMsg お客様住所情報更新受付(CMP)CCマップ
	 * @param returnCode リターンコード
	 * @param returnMessage リターンメッセージ
	 */
	private void setResponse(IRequestParameterReadWrite param,  Map<String, Object> ccMsg, String errCode, String errMessage)
	throws Exception
	{
		// エラーリスト
		List<Map<String, String>> errList = new ArrayList<Map<String, String>>();
		// body用マップ
		Map<String, Object> bodyMap = new HashMap<String, Object>();
		
		errList.add(getCommonErrInfMap(errCode, errMessage));
		
		//会員種別
		bodyMap.put(RES_PARAM_MEMBER_SBT, "");
		// プレミアムチケットランク
		bodyMap.put(RES_PARAM_RNK_NM, "");
		// ANK-4307-00-00 MOD START
		// チケット残枚数
		// bodyMap.put(RES_PARAM_TIC_NUM, "");
		// 通算獲得eoポイント数
		bodyMap.put(RES_PARAM_TOTAL_PT_SU, "");
		// 保有eoポイント数
		bodyMap.put(RES_PARAM_HOYU_PT_SU, "");
		// ポイント有効期限
		bodyMap.put(RES_PARAM_EXPIRE_DATE, "");
		// 有効期限最短ポイント数
		bodyMap.put(RES_PARAM_EXPIRE_DATE_IN_PT_SU, "");
		// ANK-4307-00-00 MOD END
		
		ccMsg.put(CC_PARAM_BODY_INFO, bodyMap);
		ccMsg.put(CC_PARAM_ERROR_INFO, errList);
	}
	
	/**
	 * ECK0011A010:お客さま一意照会 を呼び出す。
	 * 上りマッピング、実行、下りマッピングまで行います。
	 * 実行結果はworkmapに格納されます。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param ccMsg 
	 * @param ccMsg 
	 * @param campaign_cd
	 * @return
	 * @throws Throwable
	 */
	private void execECK0011A010(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String sysid)throws Throwable
	{
		
		// 上りマッピング
		Object[][] eck0011a010In = {
				  {ECK0011A010CBSMsg.TEMPLATEID, TEMPLATE_ID_ECK0011A010}
				, {ECK0011A010CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_2}
				, {ECK0011A010CBSMsg.KEY_SYSID, sysid}
				, {ECK0011A010CBSMsg.KEY_RSV_APLY_YMD, JCCBPCommon.getOpeDate(null)}
		};
		
		// SC実行
		CAANMsg[] eck0011a010MsgList = callSC(handle,  param, eck0011a010In,
				fixedText, new ECK0011A010CBSMsg().getContents()).getCAANMsgList(ECK0011A010CBSMsg.ECK0011A010CBSMSG1LIST);
		
		// 下りマッピング
		String[] eck0011a010Out = {
				  ECK0011A010CBSMsg1List.MEMBER_SBT_CD
				, ECK0011A010CBSMsg1List.CUST_NTAIKAI_CD
				, ECK0011A010CBSMsg1List.EONETID_MI_IKO_FLG
				// ▼▼▼ IT1-2019-0000036 ADD START ▼▼▼
				, ECK0011A010CBSMsg1List.ORSJGS_CD
				// ▲▲▲ IT1-2019-0000036 ADD END ▲▲▲
		};
		
		// 下りマッピング
		createOutMap(param, eck0011a010MsgList, eck0011a010Out, WORK_KEY_ECK0011A010);
	}
	
	/**
	 * EKKA0050001：お客様ランク情報一意照会 を呼び出す。
	 * 上りマッピング、実行、下りマッピングまで行います。
	 * 実行結果はworkmapに格納されます。
	 * 
	 * @param handle
	 * @param param
	 * @param fixedText
	 * @param campaign_cd
	 * @return
	 * @throws Throwable
	 */
	@SuppressWarnings("unchecked")
	private void execEKKA0050001(SessionHandle handle, IRequestParameterReadWrite param, String fixedText, String sysid, String kaiinSbtCd, String eonetidMiikoFlg)throws Throwable
	{
		HashMap workmap = getCCWorkMap(param);
		// 上りマッピング
		Object[][] ekka0050001In = {
				  {EKKA0050001CBSMsg.TEMPLATEID, TEMPLATE_ID_EKKA0050001}
				, {EKKA0050001CBSMsg.FUNC_CODE, JPCModelConstant.FUNC_CD_1}
				, {EKKA0050001CBSMsg.KEY_SYSID, sysid}
				, {EKKA0050001CBSMsg.KEY_KAIIN_SBT_CD, kaiinSbtCd}
				, {EKKA0050001CBSMsg.KEY_EONETID_MIIKO_FLG, JKKStringUtil.nullToBlank(eonetidMiikoFlg)}
		};
		
		// SC実行
		CAANMsg ekka0050001MsgList = callSC(handle,  param, ekka0050001In,
				fixedText, new EKKA0050001CBSMsg().getContents());
		
		// 下りマッピング
		// 結果が取得できた場合
		if (ekka0050001MsgList != null)
		{
			Map resultMap = new HashMap<String, Object>();
			
			// お客様ランク情報一意照会明細
			CAANMsg[] ekka0050001Msg1List = ekka0050001MsgList.getCAANMsgList(EKKA0050001CBSMsg.EKKA0050001CBSMSG1LIST);
			// 抽出用項目リスト
			String[] ekka0050001Msg1ListOut = {
					  EKKA0050001CBSMsg1List.SYSID
					, EKKA0050001CBSMsg1List.KAIIN_SBT_CD
					, EKKA0050001CBSMsg1List.EONETID_MIIKO_FLG
					, EKKA0050001CBSMsg1List.RNK_CD
					, EKKA0050001CBSMsg1List.RNK_NM
					, EKKA0050001CBSMsg1List.PRESUP_KISAN_DATE
					, EKKA0050001CBSMsg1List.KEI_YEARS
					, EKKA0050001CBSMsg1List.KEI_YEARS_STR
					// ANK-4307-00-00 MOD START
					// , EKKA0050001CBSMsg1List.TIC_NUM
					, EKKA0050001CBSMsg1List.TOTAL_PT_SU
					, EKKA0050001CBSMsg1List.TOTAL_HOYU_PT_SU
					// ANK-4307-00-00 MOD END
			};
			List ekka0050001ChildList1 =  new ArrayList<HashMap<String, String>>();
			ekka0050001ChildList1 = createResultList(param, ekka0050001Msg1List, ekka0050001Msg1ListOut);
			
			
			// 契約情報リスト
			CAANMsg[] ekka0050001Msg2List = ekka0050001MsgList.getCAANMsgList(EKKA0050001CBSMsg.EKKA0050001CBSMSG2LIST);
			// 抽出用項目リスト
			String[] ekka0050001Msg2ListOut = {
					  EKKA0050001CBSMsg2List.SRV_KEI_NM
					, EKKA0050001CBSMsg2List.KEI_UM_FLG
			};
			List ekka0050001ChildList2 = new ArrayList<HashMap<String, String>>();
			ekka0050001ChildList2 = createResultList(param, ekka0050001Msg2List, ekka0050001Msg2ListOut);
			
			// ポイント内訳リスト
			CAANMsg[] ekka0050001Msg3List = ekka0050001MsgList.getCAANMsgList(EKKA0050001CBSMsg.EKKA0050001CBSMSG3LIST);
			// 抽出用項目リスト
			String[] ekka0050001Msg3ListOut = {
					// ANK-4307-00-00 MOD START
					//  EKKA0050001CBSMsg3List.TIC_STS_CD
					// , EKKA0050001CBSMsg3List.TIC_STS_CD_NM
					// , EKKA0050001CBSMsg3List.SISK_CD
					// , EKKA0050001CBSMsg3List.SISK_NM
					// , EKKA0050001CBSMsg3List.EXPIRE_DATE
					  EKKA0050001CBSMsg3List.TEKIYO_ED_YMD
					, EKKA0050001CBSMsg3List.HOYU_PT_SU
					// ANK-4307-00-00 MOD END
			};
			List ekka0050001ChildList3 = new ArrayList<HashMap<String, String>>();
			ekka0050001ChildList3 = createResultList(param, ekka0050001Msg3List, ekka0050001Msg3ListOut);
			
			
			// ランクアップ条件
			CAANMsg[] ekka0050001Msg4List = ekka0050001MsgList.getCAANMsgList(EKKA0050001CBSMsg.EKKA0050001CBSMSG4LIST);
			// 抽出用項目リスト
			String[] ekka0050001Msg4ListOut = {
					  EKKA0050001CBSMsg4List.RNKUP_TEXT
			};
			List ekka0050001ChildList4 = new ArrayList<HashMap<String, String>>();
			ekka0050001ChildList4 = createResultList(param, ekka0050001Msg4List, ekka0050001Msg4ListOut);
			
			resultMap.put(EKKA0050001CBSMsg.EKKA0050001CBSMSG1LIST, ekka0050001ChildList1);
			resultMap.put(EKKA0050001CBSMsg.EKKA0050001CBSMSG2LIST, ekka0050001ChildList2);
			resultMap.put(EKKA0050001CBSMsg.EKKA0050001CBSMSG3LIST, ekka0050001ChildList3);
			resultMap.put(EKKA0050001CBSMsg.EKKA0050001CBSMSG4LIST, ekka0050001ChildList4);
			
			// 作業マップに追加
			workmap.put(WORK_KEY_EKKA0050001, resultMap);
		};
	}
	
	/**
	 * 下りマップを作成し、CCにセットします。
	 * SC実行結果がない場合は、nullでセットされます。
	 * @param param 
	 * 
	 * @param result
	 * @param ccSetKey
	 * @throws RequestParameterException 
	 */
	@SuppressWarnings("unchecked")
	private void createOutMap(IRequestParameterReadWrite param, CAANMsg[] result, String[] outKeyList, String wmKey) throws RequestParameterException
	{
		HashMap workmap = getCCWorkMap(param);
		
		// 作業マップのキー情報を初期化
		workmap.put(wmKey, null);
		
		// データが取得できた場合
		if (null != result && 0 < result.length)
		{
			// 作業マップに追加
			workmap.put(wmKey, createResultList(param, result, outKeyList));
		}
	}
	
	/**
	 * 返却値をリストにします。
	 * 
	 * @param param
	 * @param result
	 * @param outKeyList
	 * @return
	 */
	private List<Map<String, String>> createResultList(IRequestParameterReadWrite param, CAANMsg[] result, String[] outKeyList)
	{
		List<Map<String, String>> resultList = new ArrayList<Map<String, String>>();
		// 取得した件数分データを取得する
		for (int i = 0; i < result.length; i++)
		{
			resultList.add(createResultMap(param, result[i], outKeyList));
		}
		return resultList;
	}
	
	/**
	 * 返却値をマップにします。
	 * 
	 * @param param
	 * @param result
	 * @param outKeyList
	 * @return
	 */
	private Map<String, String> createResultMap(IRequestParameterReadWrite param, CAANMsg result, String[] outKeyList)
	{
		Map<String, String> resultMap = new HashMap<String, String>();
		// 取得キーに設定した値を取得
		for (int j = 0; j < outKeyList.length; j++)
		{
			resultMap.put(outKeyList[j], result.getString(outKeyList[j]));
		}
		return resultMap;
	}
	
	
	/**
	 * SC(サービスインターフェイス）を呼び出す。
	 * @param handle セッションハンドル
	 * @param scCall SC呼び出し部品
	 * @param param リクエストパラメータ
	 * @param mappingData マッピングデータ
	 * @param fixedText ユーザ定義文字列
	 * @param contents CAANMsgのコンテンツ
	 * @return CAANMsg
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	private CAANMsg callSC(SessionHandle handle,
			IRequestParameterReadWrite param, Object[][] mappingData,
			String fixedText, Object[][] contents) throws Throwable
	{
		// 上りマッピング処理
		HashMap<String, Object> paramMap = editInMsg(param, mappingData);
		
		// SC呼び出し部品のインスタンス生成（引数にはログに出力するクラス名を渡す。空文字を設定した場合はログに出力されない）
		ServiceComponentRequestInvoker scCall = new ServiceComponentRequestInvoker();
		
		// サービスI/F呼出し実行
		Map<?, ?> result = scCall.run(paramMap, handle);
		
		// SCからの戻り値からCAANMsgを取得
		CAANMsg[] templates = (CAANMsg[])result.get(JCMConstants.TEMPLATE_LIST_KEY);
		CAANMsg msg = templates[0];
		
		// リターンコード取得
		Object returnCode = result.get(JCMConstants.RET_CD_INT_KEY);
		// ステータス取得
		int status = msg.getInt(JCMConstants.STATUS_INT_KEY);
		
		// エラー情報の設定
		editErrorInfo(param, templates, (Integer)returnCode, fixedText, contents);
		
		// エラー情報のマップを取得
		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));
		
		// 異常の場合、CCExceptionを生成してスローする
		if(!("0".equals(returnCode.toString()) && 0 == status))
		{
			throw new CCException("サービスコンポーネントエラー", new Exception());
		}
		
		return msg;
	}
	
	/**
	 * 共通項目のメッセージを作成します。
	 * @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));
		
		// サービスインターフェイス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 (mappingData[i][1] instanceof CAANMsg[])
			{
				template.set((String)mappingData[i][0], (CAANMsg[])mappingData[i][1]);
			}
			else
			{
				if ("".equals(mappingData[i][1]))
				{
					template.setNull((String)mappingData[i][0]);
				}
				else
				{
					template.set((String)mappingData[i][0], mappingData[i][1]);
				}
			}
		}
		
		CAANMsg[] templates = new CAANMsg[1];
		
		templates[0] = template;
		
		paramMap.put(JCMConstants.TEMPLATE_LIST_KEY, templates);
		
		return paramMap;
	}
	
	/**
	 * エラー情報を設定します。
	 * @param param リクエストパラメータ
	 * @param templates CAANMsgクラス
	 * @param returnCode リターンコード
	 * @param fixedText ユーザ定義文字列
	 * @param contents CAANMsgのコンテンツ
	 * @return IRequestParameterReadWrite
	 * @throws RequestParameterException リクエストパラメータの操作でエラーが発生した場合
	 */
	@SuppressWarnings("unchecked")
	private IRequestParameterReadWrite editErrorInfo(IRequestParameterReadWrite param,
			CAANMsg[] templates, int returnCode, String fixedText, Object[][] contents) throws RequestParameterException
	{
		CAANMsg template = templates[0];
		int templateStatus = template.getInt(JCMConstants.STATUS_INT_KEY);
		
		if (returnCode != 0)
		{
			templateStatus = 9000;
		}
		
		if (JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + String.format(RETURN_MESSAGE_FORMAT, 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 (bpStatus < templateStatus)
		{
			// BPにサービスコンポーネントのステータスを設定する。
			String formatStatus = String.format(RETURN_MESSAGE_FORMAT, templateStatus);
			String message = JCMAPLConstMgr.getString(RETURN_MESSAGE_STRING + formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, formatStatus);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, message);
		}
		
		// ユーザデータ情報
		HashMap<String, String> inMap = (HashMap<String, String>)param.getData(fixedText);
		
		for (int i = 0; null != contents && i < contents.length ; i++)
		{
			String itemNm = (String)contents[i][0];
			if (itemNm.endsWith(ERRITEM_SUFFIX))
			{
				String errCd = (String)template.getString(itemNm);
				if (!JKKStringUtil.isNullBlank(errCd))
				{
					inMap.put(itemNm, errCd);
				}
			}
		}
		
		return param;
	}
	
	/**
	 * 単項目チェックの必須エラーマップ作成メソッドです。
	 * 
	 * @param itemName 項目名
	 * @return
	 */
	public Map<String, String> getReqErrInfMap(String itemName)
	{
		String errorCode = JKKStrConst.RETURN_CD_1001;
		String errorMessage = "";
		
		return getCommonErrInfMap(errorCode, errorMessage);
	}
	
	/**
	 * 単項目チェックの属性エラーマップ作成メソッドです。
	 * 
	 * @param itemName 項目名
	 * @return
	 */
	public Map<String, String> getFormErrInfMap(String itemName)
	{
		String errorCode = JKKStrConst.RETURN_CD_1002;
		String errorMessage = "";
		
		return getCommonErrInfMap(errorCode, errorMessage);
	}
	
	/**
	 * 単項目チェックの桁数エラーマップ作成メソッドです。
	 * 
	 * @param itemName 項目名
	 * @return
	 */
	public Map<String, String> getLenErrInfMap(String itemName)
	{
		String errorCode = JKKStrConst.RETURN_CD_1003;
		String errorMessage = "";
		
		return getCommonErrInfMap(errorCode, errorMessage);
	}
	
	/**
	 * 各業務エラーチェックのエラーマップ作成メソッド
	 * 
	 * @param return_cd
	 * @param errorMessage
	 * @return
	 */
	private Map<String, String> getCommonErrInfMap(String return_cd, String errorMessage)
	{
		Map<String, String> returnMap = new HashMap<String, String>();
		
		returnMap.put(RES_PARAM_ERRCODE, return_cd);
		returnMap.put(RES_PARAM_ERRMESSAGE, errorMessage);
		
		return returnMap;
	}
}
