/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKCASNoShokaiAddCmpDenCC
*	ソースファイル名：JKKCASNoShokaiAddCmpDenCC.java
*	作成者			：FJ
*	日付			：2024年12月20日
*＜機能概要＞ 
* CAS番号照会・登録(CMP・DEN)CC部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2024/12/20	F井上		新規作成
*
**********************************************************************/
package com.fujitsu.futurity.bp.custom.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.bp.custom.common.JKKSptvKeyInfOperateCC;
import com.fujitsu.futurity.bp.x21.bpm.db.SessionHandle;
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.x01.sc.SCControlMapKeys;
import com.fujitsu.futurity.model.common.check.HalfCharCheck;
import com.fujitsu.futurity.model.common.check.LengthCheck;

import eo.common.constant.JACStrConst;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.util.JCHStringUtil;

public class JKKCasNoShokaiAddCmpDenCC extends AbstractCommonComponent
{

	/** リクエストキー：相手システムID */
	private static final String IN_SYSTEM_ID = "OPERATOR_ID";
	/** リクエストキー：機能コード */
	public static final String IN_FUNC_CD = "funcCode";
	/** リクエストキー：サービス契約番号 */
	public static final String IN_SVC_KEI_NO = "svcKeiNo";
	/** リクエストキー：CAS番号リスト */
	public static final String IN_CAS_NO_LIST = "casNoList";
	/** リクエストキー：CAS番号 */
	public static final String IN_CAS_NO = "casNo";
	/** リクエストキー：枠番号 */
	public static final String IN_CAS_NO_ADD_WAKU = "casNoAddWaku";
	/** リクエストキー：変更区分 */
	public static final String IN_CHG_DIV = "chgDiv";
	
	/** レスポンスキー：機能コード */
	public static final String OUT_FUNC_CD = "funcCode";
	/** レスポンスキー：サービス契約番号 */
	public static final String OUT_SVC_KEI_NO = "svcKeiNo";
	/** レスポンスキー：登録結果コード */
	public static final String OUT_ADD_RSLT_CODE = "addRsltCode";
	/** レスポンスキー：サービス契約ステータス */
	public static final String OUT_SVC_KEI_STAT = "svcKeiStat";
	/** レスポンスキー：料金コース */
	public static final String OUT_PCRS_CD = "pcrsCd";
	/** レスポンスキー：料金コース */
	public static final String OUT_NEW_PCRS_CD = "newPcrsCd";
	/** レスポンスキー：CAS番号リスト */
	public static final String OUT_CAS_NO_LIST = "casNoList";
	/** レスポンスキー：CAS番号登録枠 */
	public static final String OUT_CAS_NO_ADD_WAKU = "casNoAddWaku";
	/** レスポンスキー：CAS番号 */
	public static final String OUT_CAS_NO = "casNo";
	/** リクエストキー：変更区分 */
	public static final String OUT_CHG_DIV = "chgDiv";
	/** レスポンスキー：スカパー連携ステータス */
	public static final String OUT_SPTV_RENKEI_STAT = "sptvRenkeiStat";
	/** レスポンスキー：CAS番号登録日付 */
	public static final String OUT_CAS_NO_ADD_DAY = "casNoAddDay";
	/** レスポンスキー：オプション有無フラグ */
	public static final String OUT_OP_UM_FLG = "opUmFlg";
	/** レスポンスキー：変更回数 */
	public static final String OUT_CHG_Cnt = "chgCnt";

	/** レスポンスエラーキー */
	public static final String BODY_INFO = "BODY_INFO";

	/** スカパー鍵情報操作CC(照会)マップのキー */
	private static final String SPTV_KEY_INF_OPERATE_CC_REF_MAP_KEY = "SptvKeyInfOperateCCRef";
	/** スカパー鍵情報操作CC(登録・更新・削除)マップのキー */
	private static final String SPTV_KEY_INF_OPERATE_CC_UP_MAP_KEY = "SptvKeyInfOperateCCUp";
	/** スカパー鍵情報操作CC：処理コード（1：CASカード登録・削除） */
	public static final String IN_SHORI_CD= "1";
	/** スカパー鍵情報操作CC：CASカードリスト */
	public static final String OUT_CASCD_LIST= "cascd_list";
	
	/** オプションサービス契約解約CCマップのキー */
	private static final String CAS_OP_SVC_KEI_DSL_CC_MAP_KEY = "CasOpSvcKeiDslCC";

	/** CC出力パラメータ：エラー情報 */
	public static final String ERROR_INFO = "ERROR_INFO";
	/** CC出力パラメータ：エラーコード */
	public static final String ERROR_CODE = "errorCode";
	/** CC出力パラメータ：エラーメッセージ */
	public static final String ERROR_MESSAGE = "errorMessage";
	/** CC出力パラメータ：エラーCAS番号登録枠 */
	public static final String ERROR_CAS_NO_ADD_WAKU = "errorCasNoAddWaku";


	/** 相手先システムID(ＣＭＰ) */
	private static final String SYSTEM_ID_CMP = "CMP1";
	/** 相手先システムID(ＤＥＮ) */
	private static final String SYSTEM_ID_DEN = "DEN1";

	/** リクエスト 機能コード：更新 */
	private static final String FUNC_CD_UPD = "2";
	/** リクエスト 変更区分：未変更 */
	private static final String CHG_DIV_NOT = "0";
	/** リクエスト 変更区分：削除 */
	private static final String CHG_DIV_DEL = "2";

	/** レスポンス 登録結果コード：正常 */
	private static final String ADD_RSLT_CODE = "0";
	/** レスポンス 登録結果コード：異常 */
	private static final String ADD_RSLT_CODE_ERR = "1";

	/** CC 機能コード：更新 */
	private static final String CC_FUNC_CD_UPD = "1";
	/** CC 機能コード：照会 */
	private static final String CC_FUNC_CD_REF = "3";
	/** CC オプション有無フラグ：有 */
	private static final String CC_OP_UM_FLG_ARI= "1";

	/** スカパー鍵情報操作CCエラーコード：01（変更回数エラー） */
	private static final String ERR_CD_01 = "01";
	/** スカパー鍵情報操作CCエラーコード：02（重複エラー） */
	private static final String ERR_CD_02 = "02";
	/** スカパー鍵情報操作CCエラーコード：03（形式エラー） */
	private static final String ERR_CD_03 = "03";
	/** スカパー鍵情報操作CCエラーコード：04（登録状態エラー） */
	private static final String ERR_CD_04 = "04";
	/** スカパー鍵情報操作CCエラーコード：05（削除状態エラー） */
	private static final String ERR_CD_05 = "05";
	/** スカパー鍵情報操作CCエラーコード：06（サービスコードエラー） */
	private static final String ERR_CD_06 = "06";
	/** スカパー鍵情報操作CCエラーコード：07（CAS番号相違エラー） */
	private static final String ERR_CD_07 = "07";
	/** スカパー鍵情報操作CCエラーコード：08（チェックディジット判定エラー） */
	private static final String ERR_CD_08 = "08";
	/** スカパー鍵情報操作CCエラーコード：10（承認状態エラー） */
	private static final String ERR_CD_10 = "10";
	/** スカパー鍵情報操作CCエラーコード：11（オプション予約存在エラー） */
	private static final String ERR_CD_11 = "11";

	/**
	 * CAS番号の情報を照会・登録する。<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return リクエストパラメータ
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	public IRequestParameterReadWrite execute(SessionHandle handle, IRequestParameterReadWrite param, String fixedText)
	throws Throwable
	{
		// ユーザデータ情報
		Map<String, Object> ccMsg = (Map<String, Object>)param.getData(fixedText);
		
		try
		{
			// データチェック
			/* 単項目チェック */
			if (!checkResult(ccMsg)) 
			{
				setErrorRes(false, ccMsg, null, param);
				return param;
			}
			
			/* 関連チェック */
			if (!checkParameter(ccMsg,param))
			{
				setErrorRes(false, ccMsg, null, param);
				return param;
			}
			
			// スカパー鍵情報操作CC(照会)マップ
			Map<String, Object> sptvKeyInfOperateRefMap = new HashMap<String, Object>();
			// 機能コード
			sptvKeyInfOperateRefMap.put("func_cd", CC_FUNC_CD_REF);
			// 処理コード
			sptvKeyInfOperateRefMap.put("shori_cd", IN_SHORI_CD);
			// サービス契約番号
			sptvKeyInfOperateRefMap.put("svc_kei_no", (String)ccMsg.get(IN_SVC_KEI_NO));
			param.setData(SPTV_KEY_INF_OPERATE_CC_REF_MAP_KEY, sptvKeyInfOperateRefMap);
			
			// JKKSptvKeyInfOperateCC実行(照会)
			JKKSptvKeyInfOperateCC JKKSptvKeyInfOperateCC = new JKKSptvKeyInfOperateCC();
			JKKSptvKeyInfOperateCC.execute(handle, param, SPTV_KEY_INF_OPERATE_CC_REF_MAP_KEY);
			Map<String, Object> SptvKeyInfOperateREFResult = (Map<String, Object>)param.getData(SPTV_KEY_INF_OPERATE_CC_REF_MAP_KEY);
			
			// エラーチェック
			if (SptvKeyInfOperateREFResult.get("err_cd") != null) 
			{
				setErrorRes(true, ccMsg, SptvKeyInfOperateREFResult, param);
				throw new CCException("", new Exception());
			}
			
			// CASカードリスト
			ArrayList<HashMap<String, Object>> casNoList = (ArrayList<HashMap<String, Object>>)SptvKeyInfOperateREFResult.get("cascd_list");
			
			/* 機能コード判定 */
			if (FUNC_CD_UPD.equals((String)ccMsg.get(IN_FUNC_CD)))
			{
				
				//更新の場合
				
				// CAS番号リスト
				ArrayList<HashMap<String, Object>> inCasNoList = (ArrayList<HashMap<String, Object>>)ccMsg.get(IN_CAS_NO_LIST);
				// オプションサービス契約解約対象リスト
				ArrayList<HashMap<String, Object>> dataList = new ArrayList();
				// オプションサービス契約解約対象リストの作成
				for (int x = 0; x < inCasNoList.size(); x++){
					
					// CASカード番号
					String cascdNoUp = (String)inCasNoList.get(x).get(IN_CAS_NO);
					// 変更区分
					String chgDiv = (String)inCasNoList.get(x).get(IN_CHG_DIV);
					
					for (int y = 0; y < casNoList.size(); y++){
						
						// CASカード番号
						String cascdNo = (String)casNoList.get(y).get("cascd_no");
						// オプション有無フラグ
						String opUmFlg = (String)casNoList.get(y).get("op_um_flg");
						
						/* 変更区分：削除かつオプション契約あり */
						if (cascdNoUp != null && cascdNoUp.equals(cascdNo) && CHG_DIV_DEL.equals(chgDiv) && CC_OP_UM_FLG_ARI.equals(opUmFlg))
						{
							//オプションサービス契約解約対象リストへ追加
							HashMap<String, Object> data = new HashMap<String, Object>();
							data.put("cascd_no", cascdNo);
							dataList.add(data);
						}
					}
				}
				
				if(dataList.size() > 0){
					// オプションサービス契約解約対象が存在する場合
					
					// オプションサービス契約解約マップ
					Map<String, Object> casOpSvcKeiDslMap = new HashMap<String, Object>();
					// サービス契約番号
					casOpSvcKeiDslMap.put("svc_kei_no", (String)ccMsg.get(IN_SVC_KEI_NO));
					// オプションサービス契約解約対象リスト
					casOpSvcKeiDslMap.put("cas_op_list", dataList);
					param.setData(CAS_OP_SVC_KEI_DSL_CC_MAP_KEY, casOpSvcKeiDslMap);
					// 異動理由明細
					ArrayList<HashMap<String, Object>> idoRsnCdList = new ArrayList();
					HashMap<String, Object> idoRsnCd = new HashMap<String, Object>();
					// 異動理由コード
					idoRsnCd.put("ido_rsn_cd", JKKStrConst.CD00846_OTHER);
					idoRsnCdList.add(idoRsnCd);
					casOpSvcKeiDslMap.put("ido_rsn_dtl", idoRsnCdList);
					
					// 対象のオプションを解除
					JKKCasOpSvcKeiDslCC JKKCasOpSvcKeiDslCC = new JKKCasOpSvcKeiDslCC();
					JKKCasOpSvcKeiDslCC.dslOpSvcKei(handle, param, CAS_OP_SVC_KEI_DSL_CC_MAP_KEY);
				}
				
				// スカパー鍵情報操作CC(登録・更新・削除)マップ
				Map<String, Object> sptvKeyInfOperateUpMap = new HashMap<String, Object>();
				// 機能コード
				sptvKeyInfOperateUpMap.put("func_cd", CC_FUNC_CD_UPD);
				// 処理コード
				sptvKeyInfOperateUpMap.put("shori_cd", IN_SHORI_CD);
				// サービス契約番号
				sptvKeyInfOperateUpMap.put("svc_kei_no", (String)ccMsg.get(IN_SVC_KEI_NO));
				// 相手システムID
				sptvKeyInfOperateUpMap.put("aite_sysid", setSystemIdCd((String)param.getControlMapData(IN_SYSTEM_ID)));
				// CAS更新リスト
				ArrayList<HashMap<String, Object>> casNoUpList = new ArrayList<HashMap<String, Object>>();
				// オプションサービス契約解約対象リストの作成
				for (int x = 0; x < inCasNoList.size(); x++){
					// 変更区分：未変更は対象外
					if(!CHG_DIV_NOT.equals((String)inCasNoList.get(x).get(IN_CHG_DIV))){
						HashMap<String, Object> casNoUp = new HashMap<String, Object>();
						// CASカード番号
						casNoUp.put("cascd_no", (String)inCasNoList.get(x).get(IN_CAS_NO));
						// 枠番号
						casNoUp.put("frame_no", (String)inCasNoList.get(x).get(IN_CAS_NO_ADD_WAKU));
						// 変更区分
						casNoUp.put("chg_div", (String)inCasNoList.get(x).get(IN_CHG_DIV));
						
						casNoUpList.add(casNoUp);
					}
				}
				sptvKeyInfOperateUpMap.put("cas_upd_list", casNoUpList);
				param.setData(SPTV_KEY_INF_OPERATE_CC_UP_MAP_KEY, sptvKeyInfOperateUpMap);
				
				// JKKSptvKeyInfOperateCC実行(登録・更新・削除)
				JKKSptvKeyInfOperateCC.execute(handle, param, SPTV_KEY_INF_OPERATE_CC_UP_MAP_KEY);
				Map<String, Object> SptvKeyInfOperateUPResult = (Map<String, Object>)param.getData(SPTV_KEY_INF_OPERATE_CC_UP_MAP_KEY);
				
				// エラーチェック
				if (SptvKeyInfOperateUPResult.get("err_cd") != null) 
				{
					setErrorRes(true, ccMsg, SptvKeyInfOperateUPResult, param);
					throw new CCException("", new Exception());
				}
				
				// JKKSptvKeyInfOperateCC実行(照会) 更新後
				JKKSptvKeyInfOperateCC.execute(handle, param, SPTV_KEY_INF_OPERATE_CC_REF_MAP_KEY);
				SptvKeyInfOperateREFResult = (Map<String, Object>)param.getData(SPTV_KEY_INF_OPERATE_CC_REF_MAP_KEY);
				
				// エラーチェック
				if (SptvKeyInfOperateREFResult.get("err_cd") != null) 
				{
					setErrorRes(true, ccMsg, SptvKeyInfOperateREFResult, param);
					throw new CCException("", new Exception());
				}
				
			}
			
			// レスポンス用のパラメータを作成する
			// 登録結果コード
			ccMsg.put(OUT_ADD_RSLT_CODE, ADD_RSLT_CODE);
			// サービス契約番号
			ccMsg.put(OUT_SVC_KEI_NO, SptvKeyInfOperateREFResult.get("svc_kei_no"));
			// サービス契約ステータス
			ccMsg.put(OUT_SVC_KEI_STAT, SptvKeyInfOperateREFResult.get("svc_kei_stat"));
			// 料金コース
			ccMsg.put(OUT_PCRS_CD, SptvKeyInfOperateREFResult.get("pcrs"));
			// 新料金コース
			ccMsg.put(OUT_NEW_PCRS_CD, SptvKeyInfOperateREFResult.get("new_pcrs"));
			// CASカードリスト
			casNoList = (ArrayList<HashMap<String, Object>>)SptvKeyInfOperateREFResult.get("cascd_list");
			ArrayList<HashMap<String, Object>> returnCasNoList = casNoListMap(casNoList,(String)ccMsg.get(IN_FUNC_CD), ccMsg);
			ccMsg.put(OUT_CAS_NO_LIST, returnCasNoList);
			
			// 正常終了
			param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_0000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
		}
		// サービスインターフェース呼び出しでエラーが発生した場合
		catch (SCCallException scCallEx)
		{
			
			// システムエラーを設定する
			param.setControlMapData("RETURN_CODE", JKKStrConst.RETURN_CD_9000);
			param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, JKKStrConst.RETURN_MESSAGE_SYSTEM_ERROR);
			
			// 結果を返却する
			throw new CCException("", scCallEx);
			
		}
		catch (Throwable e)
		{
			// その他理由で登録に失敗した場合
			param.setControlMapData("RETURN_CODE", JKKStrConst.RETURN_CD_9000);
			throw new CCException("", e);
		}
		
		// 結果を返却する。
		return param;
	}

	/**
	 * 業務チェックを行います。<br>
	 * <br>
	 * @param ccMsg
	 * @return true:異常なし false:異常あり
	 * @throws Exception 例外が発生した場合
	 */
	private boolean checkResult(Map<String, Object> ccMsg)
	throws Throwable
	{
		// 出力用設定値:エラーリスト
		ArrayList<HashMap<String, String>> errList = new ArrayList<HashMap<String, String>>();
		
		String itemValue = null;
		String errorMessage = null;
		
		// 機能コード
		itemValue = (String)ccMsg.get(IN_FUNC_CD);
		errorMessage = IN_FUNC_CD + JACStrConst.COLON + itemValue;
		if (JCHStringUtil.isNullBlank(itemValue) )
		{
			// 必須チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1001, errorMessage, ""));
		}
		else if (!HalfCharCheck.isNumber1Check(itemValue))
		{
			// 属性チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1002, errorMessage, ""));
		}
		else if (!LengthCheck.isLength1Check(itemValue, 1))
		{
			// 桁数チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1003, errorMessage, ""));
		}
		
		// エラーが存在する場合
		if (errList.size() > 0)
		{
			ccMsg.put(ERROR_INFO, errList);
			return false;
		}
		
		// サービス契約番号
		itemValue = (String)ccMsg.get(IN_SVC_KEI_NO);
		errorMessage = IN_SVC_KEI_NO + JACStrConst.COLON + itemValue;
		// 必須チェック
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 必須チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1001, errorMessage, ""));
		}
		else if (!HalfCharCheck.isEnNumber1Check(itemValue))
		{
			// 属性チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1002, errorMessage, ""));
		}
		else if (!LengthCheck.isLength1Check(itemValue, 10))
		{
			// 桁数チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1003, errorMessage, ""));
		}
		
		// エラーが存在する場合
		if (errList.size() > 0)
		{
			ccMsg.put(ERROR_INFO, errList);
			return false;
		}
		
		return true;
	}

	/**
	 * 関連チェックを行います。<br>
	 * <br>
	 * @param ccMsg
	 * @return true:異常なし false:異常あり
	 * @throws Throwable 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	private boolean checkParameter(Map<String, Object> ccMsg, IRequestParameterReadWrite param)
	throws Throwable
	{
		// 返却用設定値:エラーリスト
		ArrayList<HashMap<String, String>> errList = new ArrayList<HashMap<String, String>>();
		
		// 機能コード
		String funcCd = (String)ccMsg.get(IN_FUNC_CD);
		// CAS番号リスト
		ArrayList<HashMap<String, Object>> casNoList = (ArrayList<HashMap<String, Object>>)ccMsg.get(IN_CAS_NO_LIST);
		
		//  ＝＝＝コード値の組み合わせチェック＝＝＝/
		// 「機能コード」が"2"(更新) かつ 「CAS番号リスト」なし
		if (JPCModelConstant.FUNC_CD_2.equals(funcCd) && (casNoList == null || casNoList.size() == 0)){
			
			// コード値の組み合わせチェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1004, IN_FUNC_CD + JACStrConst.COLON + funcCd, ""));
			ccMsg.put(ERROR_INFO, errList);
			return false;
		}
		
		//  ＝＝＝存在チェック＝＝＝
		String systemId = null;
		// ユーザデータ情報
		systemId = (String)param.getControlMapData(IN_SYSTEM_ID);
		
		// 相手システムIDが存在しない("CMP"、"DEN"以外)コード値の場合、エラー
		if (!(SYSTEM_ID_CMP.contains(systemId) ||SYSTEM_ID_DEN.contains(systemId)) )
		{
			
			// 存在チェックエラー
			errList.add(getErrorInfoMap(JKKStrConst.RETURN_CD_1005, IN_SYSTEM_ID + JACStrConst.COLON + systemId, ""));
			ccMsg.put(ERROR_INFO, errList);
			return false;
		}
		
		return true;
	}

	/**
	 * 出力：エラーコードとエラーメッセージをセットした業務エラーマップを返却する。<br>
	 * <br>
	 * @return returnMap
	 */
	public static HashMap<String, String> getErrorInfoMap(String errorCode, String errorMessage,String errorCasNoAddWaku)
	{
		HashMap<String, String> returnMap = new HashMap<String, String>();
		
		returnMap.put(ERROR_CODE, errorCode);
		returnMap.put(ERROR_MESSAGE, errorMessage);
		returnMap.put(ERROR_CAS_NO_ADD_WAKU, errorCasNoAddWaku);
		
		return returnMap;
	}

	/**
	 * レスポンスのCASカードリストへのマッピングを行います。<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return true:異常なし false:異常あり
	 * @throws Exception 例外が発生した場合
	 */
	@SuppressWarnings("unchecked")
	private ArrayList<HashMap<String, Object>> casNoListMap(ArrayList<HashMap<String, Object>> casNoList, String funcCd,Map<String, Object> ccMsg)
	throws Throwable
	{
		ArrayList<HashMap<String, Object>> returnCasNoList = new ArrayList<HashMap<String, Object>>();
		for(int x = 0; x < casNoList.size(); x++){
			HashMap<String, Object> returnCasNo = new HashMap<String, Object>();
			
			//CAS番号登録枠
			returnCasNo.put(OUT_CAS_NO_ADD_WAKU, casNoList.get(x).get("frame_no"));
			//CAS番号
			returnCasNo.put(OUT_CAS_NO, casNoList.get(x).get("cascd_no"));
			//変更区分
			if (FUNC_CD_UPD.equals(funcCd)){
				
				// IN_CAS番号リスト
				ArrayList<HashMap<String, Object>> inCasNoList = (ArrayList<HashMap<String, Object>>)ccMsg.get(IN_CAS_NO_LIST);
				
				for (int y = 0; y < inCasNoList.size(); y++){
					
					if ((String)inCasNoList.get(y).get(IN_CAS_NO_ADD_WAKU) != null && ((String)inCasNoList.get(y).get(IN_CAS_NO_ADD_WAKU)).equals((String)casNoList.get(x).get("frame_no")))
					{
						returnCasNo.put(OUT_CHG_DIV, inCasNoList.get(y).get(IN_CHG_DIV));
					}
				}
				
			}
			//スカパー連携ステータス
			returnCasNo.put(OUT_SPTV_RENKEI_STAT, casNoList.get(x).get("sptv_rnk_stat"));
			//CAS番号登録日付
			returnCasNo.put(OUT_CAS_NO_ADD_DAY, casNoList.get(x).get("cas_no_add_ymd"));
			//オプション有無フラグ
			returnCasNo.put(OUT_OP_UM_FLG, casNoList.get(x).get("op_um_flg"));
			//変更回数
			returnCasNo.put(OUT_CHG_Cnt, casNoList.get(x).get("chg_cnt"));
			
			returnCasNoList.add(returnCasNo);
		}
		
		return returnCasNoList;
	}

	/**
	 * エラー時のレスポンス作成を行います。<br>
	 * <br>
	 * @param handle セッションハンドル
	 * @param param リクエストパラメータ
	 * @param fixedText ユーザ定義文字列
	 * @return true:異常なし false:異常あり
	 * @throws Exception 例外が発生した場合
	 */
	private void setErrorRes(boolean errorInfoFlg, Map<String, Object> ccMsg, Map<String, Object> SptvKeyInfOperateResult, IRequestParameterReadWrite param)
	throws Throwable
	{
		// レスポンス用のパラメータを作成する
		Map<String, Object> bodyMap = new HashMap<String, Object>();
		// 機能コード
		bodyMap.put(OUT_FUNC_CD, ccMsg.get(IN_FUNC_CD)); 
		// サービス契約番号
		bodyMap.put(OUT_SVC_KEI_NO, ccMsg.get(IN_SVC_KEI_NO));
		// 登録結果コード
		bodyMap.put(OUT_ADD_RSLT_CODE, ADD_RSLT_CODE_ERR);
		if(ccMsg.get(IN_CAS_NO_LIST) != null){
			// CAS番号リスト
			bodyMap.put(OUT_CAS_NO_LIST, ccMsg.get(IN_CAS_NO_LIST));
		}
		ccMsg.put(BODY_INFO, bodyMap);
		
		// エラーリストの生成
		if(errorInfoFlg){
			// 返却用設定値:エラーリスト
			ArrayList<HashMap<String, String>> errList = new ArrayList<HashMap<String, String>>();
			errList.add(setErrorList((String)SptvKeyInfOperateResult.get("err_cd"), (String)SptvKeyInfOperateResult.get("err_frame_no")));
			ccMsg.put(ERROR_INFO, errList);
			
		}
		param.setControlMapData(SCControlMapKeys.RETURN_CODE, JKKStrConst.RETURN_CD_5000);
		param.setControlMapData(SCControlMapKeys.RETURN_MESSAGE, null);
	}

	/**
	 * エラーリスト設定<br>
	 * <br>
	 * @param errCd 
	 * @param errFrameNo 
	 */
	private HashMap<String, String> setErrorList(String errCd, String errFrameNo)
	{

		// 変更回数エラー
		if (ERR_CD_01.equals(errCd))
		{
			return (getErrorInfoMap(JKKStrConst.RETURN_CD_2001, "変更回数が上限に達したため変更できません", errFrameNo));
		}
		// 重複エラー
		else if (ERR_CD_02.equals(errCd))
		{
			return (getErrorInfoMap(JKKStrConst.RETURN_CD_2002, "CAS番号が既に登録されています", errFrameNo));
		}
		// 形式エラー
		else if (ERR_CD_03.equals(errCd))
		{
			return (getErrorInfoMap(JKKStrConst.RETURN_CD_2003, "登録できない形式のCAS番号です", errFrameNo));
		}
		// 登録状態エラー
		else if (ERR_CD_04.equals(errCd))
		{
			return (getErrorInfoMap(JKKStrConst.RETURN_CD_2004, "登録可能な状態ではありません", errFrameNo));
		}
		// 削除状態エラー
		else if (ERR_CD_05.equals(errCd))
		{
			return (getErrorInfoMap(JKKStrConst.RETURN_CD_2005, "削除可能な状態ではありません", errFrameNo));
		}
		// サービスコードエラー
		else if (ERR_CD_06.equals(errCd))
		{
			return (getErrorInfoMap(JKKStrConst.RETURN_CD_2006, "テレビのサービスではありません", errFrameNo));
		}
		// CAS番号相違エラー
		else if (ERR_CD_07.equals(errCd))
		{
			return (getErrorInfoMap(JKKStrConst.RETURN_CD_2007, "枠番号に対するCAS番号が一致しません", errFrameNo));
		}
		// チェックディジット判定エラー
		else if (ERR_CD_08.equals(errCd))
		{
			return (getErrorInfoMap(JKKStrConst.RETURN_CD_2008, "CAS番号の入力内容が不正です", errFrameNo));
		}
		// 承認状態エラー
		else if (ERR_CD_10.equals(errCd))
		{
			return (getErrorInfoMap(JKKStrConst.RETURN_CD_2009, "承認可能な状態ではありません", errFrameNo));
		}
		// オプション予約存在エラー
		else if (ERR_CD_11.equals(errCd))
		{
			return (getErrorInfoMap(JKKStrConst.RETURN_CD_2010, "予約中のオプションが存在するため削除できません。", errFrameNo));
		}
		// 想定外エラー
		else
		{
			return (getErrorInfoMap(JKKStrConst.RETURN_CD_3001, "システムエラー", errFrameNo));
		}
	}

	/**
	 * 相手システムID設定<br>
	 * <br>
	 * @param systemId
	 * @return 1:CMP 2:DEN
	 */
	private String setSystemIdCd(String systemId)
	{
		// 戻り値 相手システムIDコード
		String systemIdCd = "";
		
		// 相手システムIDが"CMP"の場合
		if (SYSTEM_ID_CMP.equals(systemId))
		{
			systemIdCd = "1";
		
		// 相手システムIDが"DEN"の場合
		}else if (SYSTEM_ID_DEN.equals(systemId) )
		{
			systemIdCd = "2";
		}
		
		return systemIdCd;
	}
}
