/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：KKW22801SFLogic
 *   ソースファイル名	 ：KKW22801SFLogic.java
 *   作成者       ：GDC)J.Tagongtong
 *   日付         ：2024年12月18日
 *＜機能概要＞
 *   B-CASカード/ACAS番号登録画面ビューロジック
 *＜修正履歴＞
 *   バージョン   修正日       修正者                   修正内容
 *   v74.00.00   2024/12/18   GDC)J.Tagongtong     「ANK-4592-00-00」テレビ新コース（スカパー用） 
 **********************************************************************/
package eo.web.webview.KKW22801SF;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fujitsu.futurity.common.JSYwebLog;
import com.fujitsu.futurity.web.x31.X31CMessageResult;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;
import com.fujitsu.futurity.web.x31.X31SRuntimeException;

import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCModelConstant;
import eo.common.constant.JPCOnlineMessageConstant;
import eo.common.util.JKKStringUtil;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.KKW22901SF.KKW22901SFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JKKCommonConst;
import eo.web.webview.common.JKKScreenConst;
import eo.web.webview.mapping.KKSV1044_KKSV1044OPDBMapper;

/**
 * B-CASカード/ACAS番号登録画面ビューロジックです.<p>
 * <BR>
 * @author GDC)J.Tagongtong
 */
@SuppressWarnings("serial")
public class KKW22801SFLogic extends JCCWebBusinessLogic {
	
	/** 変更区分 (登録) */
	private static final String CHG_DIV_REG = "1";
	
	/** 変更区分 (削除) */
	private static final String CHG_DIV_DEL = "2";
	
	/** プロセスID (初期化) */
	private static final String PRC_ID_INIT = "0";
	
	/** プロセスID (チェック) */
	private static final String PRC_ID_CHECK = "1";
	
	/** プロセスID (登録) */
	private static final String PRC_ID_REG = "2";
	
	/** プロセスID (削除) */
	private static final String PRC_ID_DEL = "3";
	
	/** システムエラーメッセージのパラメータ (登録) */
	private static final String STR_REGISTER = "CAS番号の登録";
	
	/** システムエラーメッセージのパラメータ (削除) */
	private static final String STR_DELETE = "CAS番号の削除";

	/** スカパー鍵情報操作CC */
	private static final String SPTVKEYINFOOPERATECC = "SPTVKEYINFOOPERATECC";
	
	/**  CAS番号引継情報項目キー  */
	private static final String[] CAS_NO_LIST_KEYS =
	{
		KKW22801SFConst.FRAME_NO_01,
		KKW22801SFConst.CAS_ID_01,
		KKW22801SFConst.OP_NAIYO_01,
		KKW22801SFConst.STAT_01,
		KKW22801SFConst.CAS_NO_ADD_DAY_01,
		KKW22801SFConst.RSV_APL_YMD_01,
		KKW22801SFConst.SPTV_RNK_STAT_01,
		KKW22801SFConst.SPTV_RNK_STAT_NM_01,
		KKW22801SFConst.OPSVKEI_UM_FLG_01
	};
	
	/** CAS共通データ引き継ぎ情報項目キー */
	private static final String[] CUST_INFO_KEYS =
	{
		KKW22801SFConst.KEISHA_NM,
		KKW22801SFConst.SVC_KEI_NO,
		KKW22801SFConst.CATV_CUST_NO,
		KKW22801SFConst.KEI_SVC,
		KKW22801SFConst.PCRS,
		KKW22801SFConst.PPLAN,
		KKW22801SFConst.IDO_DIV,
		KKW22801SFConst.IDO_RSN_CD
	};

	/**
	 * 初期表示処理<br>
	 *
	 * @return 正常／異常
	 * @throws Exception 
	 */
	public boolean actionInit() throws Exception 
	{
		// (1) 引継情報の取得
		// 画面情報を取得し、サービスフォームBeanに設定
		HashMap<String, Object> map = JCCWebCommon.getScreenInfo(this);
		
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess serviceBean = super.getServiceFormBean();
		
		// ページリンク情報のクリア
		JCCWebCommon.clearPageLinkInfo(this, JKKScreenConst.SCREEN_ID_KKW22801);

		// DataBeanをログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		
		// 契約者名
		serviceBean.sendMessageString(KKW22801SFConst.KEISHA_NM, X31CWebConst.DATABEAN_SET_VALUE, map.get("契約者名").toString());
		
		// お客さまID
		serviceBean.sendMessageString(KKW22801SFConst.SVC_KEI_NO, X31CWebConst.DATABEAN_SET_VALUE, map.get("お客さまID").toString());
		
		// 異動区分
		serviceBean.sendMessageString(KKW22801SFConst.IDO_DIV, X31CWebConst.DATABEAN_SET_VALUE, map.get("異動区分").toString());
		
		// 異動理由コード
		serviceBean.sendMessageObject(KKW22801SFConst.IDO_RSN_CD, X31CWebConst.DATABEAN_SET_VALUE, map.get("異動理由コード").toString());
		
		// 契約サービス
		serviceBean.sendMessageString(KKW22801SFConst.KEI_SVC, X31CWebConst.DATABEAN_SET_VALUE, map.get("契約サービス").toString());
		
		X31SDataBeanAccess[] paramBean = {serviceBean};

		// スカパー鍵情報操作サービスを呼び出す。
		callSvc(paramBean, serviceBean, "", PRC_ID_INIT);
		
		// 選択された情報が存在すれば初期値に設定
		if(!JKKStringUtil.isNullBlank((String)map.get("枠")))
		{
			String str = "0";
			
			X31SDataBeanAccessArray casNoInfo = serviceBean.getDataBeanArray(KKW22801SFConst.CAS_NO_LIST);
			
			for(int i = 0; i < casNoInfo.getCount(); i++)
			{
				X31SDataBeanAccess childBean = casNoInfo.getDataBean(i);
				
				if (((String)map.get("枠")).equals(childBean.sendMessageString(KKW22801SFConst.FRAME_NO_01, X31CWebConst.DATABEAN_GET_VALUE)))
				{
					str = String.valueOf(i);
					break;
				}
			}
			
			// 選択
			serviceBean.sendMessageString(KKW22801SFConst.CHOICE, X31CWebConst.DATABEAN_SET_VALUE, str);
		}
		
		return true;
	}
	
	/**
	 * チェックボタンを押すと処理が実行されます。<br>
	 * 
	 * @return 処理結果（true:正常終了、false:エラー）
	 * @throws Exception
	 */
	public boolean check() throws Exception 
	{
		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess serviceBean = super.getServiceFormBean();
		
		// 共有Bean アクセスクラスの取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		
		X31SDataBeanAccess[] paramBean = {serviceBean};
		
		// スカパー鍵情報操作サービスを呼び出す。
		if(callSvc(paramBean, serviceBean, "", PRC_ID_CHECK))
		{
			// 処理完了メッセージの出力
			JCCWebCommon.setMessageInfo(this, "EKB4390--I", new String[]{"CAS番号のチェック"} );
		}
		
		// 共有フォームBean設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
				JKKScreenConst.SCREEN_ID_KKW22801);
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
				JKKScreenConst.SCREEN_NAME_KKW22801);
		
		return true;
	}
	
	/**
	 * 登録ボタンを押すと処理が実行されます。<br>
	 * 
	 * @return 処理結果（true:正常終了、false:エラー）
	 * @throws Exception
	 */
	public boolean addCasNum() throws Exception 
	{
		// 共有Bean アクセスクラスの取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();

		// サービスフォームBean アクセスクラスの取得
		X31SDataBeanAccess svcFormBean = super.getServiceFormBean();

		// CAS番号情報
		X31SDataBeanAccessArray cas_no_info = svcFormBean.getDataBeanArray(KKW22801SFConst.CAS_NO_LIST);

		// 引継情報データマップを生成
		HashMap<String, Object> casNoDataMap = new HashMap<String, Object>();

		X31SDataBeanAccess[] paramBean = new X31SDataBeanAccess[cas_no_info.getCount()];
		
		ArrayList<X31SDataBeanAccess[]> casUpdList = new ArrayList<X31SDataBeanAccess[]>();
		
		for(int i=0; i < cas_no_info.getCount(); i++) 
		{
			X31SDataBeanAccess cas_no_subbean = cas_no_info.getDataBean(i);

			String casNoAddDay = cas_no_subbean.sendMessageString(KKW22801SFConst.CAS_NO_ADD_DAY_01, X31CWebConst.DATABEAN_GET_VALUE);
			
			if(JKKStringUtil.isNullBlank(casNoAddDay)) {
				
				// 登録するCAS-ID
				String casId = cas_no_subbean.sendMessageString(KKW22801SFConst.CAS_ID_01, X31CWebConst.DATABEAN_GET_VALUE);
				
				if(!JKKStringUtil.isNullBlank(casId))
				{
					// 登録するCASカード番号データを一覧表示する
					paramBean[i] = cas_no_info.getDataBean(i);
				}
				
			}
		}
		
		// スカパー鍵情報操作サービスに電話する
		if(!callSvc(paramBean, svcFormBean, "", PRC_ID_REG))
		{
			return false;
		}
		
		// カテゴリを登録として設定
		casNoDataMap.put("変更区分", CHG_DIV_REG);
		
		// 登録するデータのBeanを設定します。
		casUpdList.add(paramBean);
		casNoDataMap.put("データBean", casUpdList);
		
		// 登録する変更カテゴリを設定
		svcFormBean.sendMessageString(KKW22801SFConst.CHG_DIV, X31CWebConst.DATABEAN_SET_VALUE, CHG_DIV_REG);
		
		// 画面情報を設定（B-CASカードACAS番号登録確認画面）
		JCCWebCommon.setScreenInfo(this, JKKScreenConst.SCREEN_ID_KKW22802, casNoDataMap);
		JCCWebCommon.setScreenId(this, JKKScreenConst.SCREEN_ID_KKW22802, JKKScreenConst.SCREEN_ID_KKW22801);

		// 共有フォームBean設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
				JKKScreenConst.SCREEN_ID_KKW22802);
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
				JKKScreenConst.SCREEN_NAME_KKW22802);
		
		JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB0370__I, new String[] {"CAS番号の登録"});
		JCCWebCommon.setMessageAreaBackColor(this, "1"); //背景を黄色にする。
		return true;
	}
	
	/**
	 * 削除ボタンを押すと処理が実行されます。<br>
	 * 
	 * @return 処理結果（true:正常終了、false:エラー）
	 * @throws Exception
	 */
	public boolean delCasNum() throws Exception 
	{
		// 共有Bean アクセスクラスの取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();

		// サービスフォームBean アクセスクラスの取得
		X31SDataBeanAccess svcFormBean = super.getServiceFormBean();
		
		// CAS番号リスト内の選択された行の位置を取得します
		String sel = svcFormBean.sendMessageString(KKW22801SFConst.CHOICE, X31CWebConst.DATABEAN_GET_VALUE);
		
		// CAS番号情報
		X31SDataBeanAccessArray cas_no_info = svcFormBean.getDataBeanArray(KKW22801SFConst.CAS_NO_LIST);
		X31SDataBeanAccess cas_no_subbean = cas_no_info.getDataBean(Integer.parseInt(sel));
		
		// 引継情報データマップを生成
		HashMap<String, Object> casNoDataMap = new HashMap<String, Object>();
		
		X31SDataBeanAccess[] paramBean = {cas_no_subbean};
		
		// 選択したCAS番号の状態
		String inCasStat = cas_no_subbean.sendMessageString(KKW22801SFConst.SPTV_RNK_STAT_01, X31CWebConst.DATABEAN_GET_VALUE);
		
		if(JKKStringUtil.isNullBlank(inCasStat))
		{
			// 選択したCAS-IDが空白の場合
			JCCWebCommon.setMessageInfo(this, "EKBB940-JW", new String[]{"削除", "CAS番号の状態"});
			return false;
		}
		
		// 選択したCAS番号のオプションサービス契約有無フラグ
		String inOpsvkeiUmFlg = cas_no_subbean.sendMessageString(KKW22801SFConst.OPSVKEI_UM_FLG_01, X31CWebConst.DATABEAN_GET_VALUE);
		// サービス契約ステータス
		String svcKeiStat = svcFormBean.sendMessageString(KKW22801SFConst.SVC_KEI_STAT, X31CWebConst.DATABEAN_GET_VALUE);
		if(JKKStrConst.CD00037_STAT_STP.equals(svcKeiStat) && JKKStrConst.CD_DIV_UM_ARI.equals(inOpsvkeiUmFlg))
		{
			// サービス契約ステータスが停止中、かつ、オプションサービス契約有無フラグが"1"(あり)の場合
			JCCWebCommon.setMessageInfo(this, "EKBG320-KW", new String[]{"オプションサービス契約", "削除"});
			return false;
		}
		
		// スカパー鍵情報操作サービスに電話する
		if(!callSvc(paramBean, svcFormBean, "", PRC_ID_DEL))
		{
			return false;
		}
		
		ArrayList<X31SDataBeanAccess[]> casUpdList = new ArrayList<X31SDataBeanAccess[]>();
		
		// カテゴリを登録として設定
		casNoDataMap.put("変更区分", CHG_DIV_DEL);
		
		// 削除するデータのBeanを設定します
		casUpdList.add(paramBean);
		casNoDataMap.put("データBean", casUpdList);
		
		// 削除する変更カテゴリを設定
		svcFormBean.sendMessageString(KKW22801SFConst.CHG_DIV, X31CWebConst.DATABEAN_SET_VALUE, CHG_DIV_DEL);
		
		// 画面情報を設定（B-CASカードACAS番号登録確認画面）
		JCCWebCommon.setScreenInfo(this, JKKScreenConst.SCREEN_ID_KKW22802, casNoDataMap);
		JCCWebCommon.setScreenId(this, JKKScreenConst.SCREEN_ID_KKW22802, JKKScreenConst.SCREEN_ID_KKW22801);

		// 共有フォームBean設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
				JKKScreenConst.SCREEN_ID_KKW22802);
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
				JKKScreenConst.SCREEN_NAME_KKW22802);
		
		JCCWebCommon.setMessageInfo(this, JPCOnlineMessageConstant.EKB0370__I, new String[] {"CAS番号の削除"});
		JCCWebCommon.setMessageAreaBackColor(this, "1"); //背景を黄色にする。
		return true;
	}
	
	/**
	 * オプションク照会ボタンを押すと処理が実行されます。<br>
	 * 
	 * @return 処理結果（true:正常終了、false:エラー）
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public boolean optQuery() throws Exception 
	{
		// 共有Bean アクセスクラスの取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		
		// サービスフォームBean アクセスクラスの取得
		X31SDataBeanAccess svcFormBean = super.getServiceFormBean();

		// 引継情報データマップを生成
		HashMap<String, Object> casNoDataMap = new HashMap<String, Object>();
		
		// CAS番号リスト内の選択された行の位置を取得します
		String sel = svcFormBean.sendMessageString(KKW22801SFConst.CHOICE, X31CWebConst.DATABEAN_GET_VALUE);
		
		// CAS番号情報
		X31SDataBeanAccessArray cas_no_info = svcFormBean.getDataBeanArray(KKW22801SFConst.CAS_NO_LIST);
		X31SDataBeanAccess cas_no_subbean = cas_no_info.getDataBean(Integer.parseInt(sel));

		// CAS番号情報の取得
		casNoDataMap = getCasNoDataMap(cas_no_subbean, KKW22801SFConst.CAS_NO_LIST, CAS_NO_LIST_KEYS);
		
		// スカパー連携ステータス
		String sptvRnkStat = cas_no_subbean.sendMessageString(KKW22801SFConst.SPTV_RNK_STAT_01, X31CWebConst.DATABEAN_GET_VALUE);
		
		if(JKKStringUtil.isNullBlank(sptvRnkStat))
		{
			// オプション照会可否チェック
			JCCWebCommon.setMessageInfo(this, "EKBB940-JW", new String[]{"オプション照会", "CAS番号の状態"});
			return false;
		}
		
		List<Map<String, Object>> casDataList = new ArrayList<Map<String,Object>>();
		String casNoDataMapKey = casNoDataMap.keySet().iterator().next();
		casDataList.add((Map<String, Object>) casNoDataMap.get(casNoDataMapKey));
		
		HashMap<String, Object> nextScreenMap = new HashMap<String, Object>();
		nextScreenMap.put(KKW22901SFConst.QUERY_MODE_FLG, "1");
		nextScreenMap.put("casDataList", casDataList);
		
		// CAS共通データ引き継ぎ情報の取得
		getCommonData(svcFormBean, nextScreenMap, CUST_INFO_KEYS);
		
		// 画面情報を設定（CSコース用オプションチャンネル登録・更新画面）
		JCCWebCommon.setScreenInfo(this, JKKScreenConst.SCREEN_ID_KKW22901, nextScreenMap);
		JCCWebCommon.setScreenId(this, JKKScreenConst.SCREEN_ID_KKW22901, JKKScreenConst.SCREEN_ID_KKW22801);

		// 共有フォームBean設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
				JKKScreenConst.SCREEN_ID_KKW22901);
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
				JKKScreenConst.SCREEN_NAME_KKW22901);
		
		return true;
	}
	
	/**
	 * オプション設定ボタン押下時の処理
	 * 
	 * @return 正常終了:true 異常終了:false
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public boolean setOpt() throws Exception 
	{
		// 共有Bean アクセスクラスの取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();
		
		// サービスフォームBean アクセスクラスの取得
		X31SDataBeanAccess svcFormBean = super.getServiceFormBean();

		// 引継情報データマップを生成
		HashMap<String, Object> casNoDataMap = new HashMap<String, Object>();
		
		// CAS番号リスト内の選択された行の位置を取得します
		String sel = svcFormBean.sendMessageString(KKW22801SFConst.CHOICE, X31CWebConst.DATABEAN_GET_VALUE);
		
		// CAS番号情報
		X31SDataBeanAccessArray cas_no_info = svcFormBean.getDataBeanArray(KKW22801SFConst.CAS_NO_LIST);
		X31SDataBeanAccess cas_no_subbean = cas_no_info.getDataBean(Integer.parseInt(sel));

		// CAS番号情報の取得
		casNoDataMap = getCasNoDataMap(cas_no_subbean, KKW22801SFConst.CAS_NO_LIST, CAS_NO_LIST_KEYS);
		
		String sptvRnkStat = cas_no_subbean.sendMessageString(KKW22801SFConst.SPTV_RNK_STAT_01, X31CWebConst.DATABEAN_GET_VALUE);
		// スカパー連携ステータスが空白、或いは、「鍵開け済み」「契約変更中鍵開け依頼前」「契約変更中鍵開け依頼中」「契約変更中鍵開けエラー」以外の場合
		if(JKKStringUtil.isNullEmpty(sptvRnkStat)
				|| (!JKKStrConst.SPTV_RNK_STAT_KAGIAKEZUMI.equals(sptvRnkStat) && !JKKStrConst.SPTV_RNK_STAT_KEIHENCHUKAGIAKEIRAIMAE.equals(sptvRnkStat)
						&& !JKKStrConst.SPTV_RNK_STAT_KEIHENCHUKAGIAKEIRAICHU.equals(sptvRnkStat) && !JKKStrConst.SPTV_RNK_STAT_KEIHENCHUKAGIAKEERROR.equals(sptvRnkStat)))
		{
			// オプション設定可否チェック
			JCCWebCommon.setMessageInfo(this, "EKBB940-JW", new String[]{"オプション設定", "CAS番号の状態"});
			return false;
		}
		
		// サービス契約ステータス
		String svcKeiStat = svcFormBean.sendMessageString(KKW22801SFConst.SVC_KEI_STAT, X31CWebConst.DATABEAN_GET_VALUE);
		
		if(!JKKStrConst.CD00037_CNC_ZM.equals(svcKeiStat) && !JKKStrConst.CD00037_SVCTK_CHU.equals(svcKeiStat))
		{
			// サービス契約ステータスチェック
			JCCWebCommon.setMessageInfo(this, "EKBB940-JW", new String[]{"オプション設定", "サービス契約ステータス"});
			return false;
		}
		
		List<Map<String, Object>> casDataList = new ArrayList<Map<String,Object>>();
		String casNoDataMapKey = casNoDataMap.keySet().iterator().next();
		casDataList.add((Map<String, Object>) casNoDataMap.get(casNoDataMapKey));
		
		HashMap<String, Object> nextScreenMap = new HashMap<String, Object>();
		nextScreenMap.put(KKW22901SFConst.QUERY_MODE_FLG, "0");
		nextScreenMap.put("casDataList", casDataList);
		
		// CAS共通データ引き継ぎ情報データの取得
		getCommonData(svcFormBean, nextScreenMap, CUST_INFO_KEYS);
		
		// 画面情報を設定（CSコース用オプションチャンネル登録・更新画面）
		JCCWebCommon.setScreenInfo(this, JKKScreenConst.SCREEN_ID_KKW22901, nextScreenMap);
		JCCWebCommon.setScreenId(this, JKKScreenConst.SCREEN_ID_KKW22901, JKKScreenConst.SCREEN_ID_KKW22801);

		// 共有フォームBean設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
				JKKScreenConst.SCREEN_ID_KKW22901);
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
				JKKScreenConst.SCREEN_NAME_KKW22901);

		return true;
	}
	
	/**
	 * 確認ボタンを押すと処理が実行されます。<br>
	 * 
	 * @return 処理結果（true:正常終了、false:エラー）
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public boolean updCfm() throws Exception
	{
		// 画面情報を取得し、サービスフォームBeanに設定
		HashMap<String, Object> map = JCCWebCommon.getScreenInfo(this);
		
		// 共有Bean アクセスクラスの取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();

		// サービスフォームBeanのデータBeanアクセスクラスを取得。
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		// DataBeanをログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		
		// データBeanの取得
		ArrayList<X31SDataBeanAccess[]> beanList = (ArrayList<X31SDataBeanAccess[]>) map.get("データBean");
		
		X31SDataBeanAccess[] paramBean = beanList.get(0);
		
		// 変更区分
		String chgDiv = (String) map.get("変更区分");
		
		String prcId = "";
		
		if(CHG_DIV_REG.equals(chgDiv))
		{
			prcId = PRC_ID_REG;
		}
		else if(CHG_DIV_DEL.equals(chgDiv))
		{
			prcId = PRC_ID_DEL;
		}
		
		// スカパー鍵情報操作サービスを呼び出す。
		if(!callSvc(paramBean, serviceFormBean, chgDiv, prcId))
		{
			JCCWebCommon.setScreenInfo(this, JKKScreenConst.SCREEN_ID_KKW22802, map);
			JCCWebCommon.setMessageAreaBackColor(this, "1"); //背景を黄色にする。
			return false;
		}
		
		if(PRC_ID_DEL.equals(prcId))
		{
			// 削除処理完了メッセージの出力
			JCCWebCommon.setMessageInfo(this, "EKB4390--I", new String[]{"CAS番号の削除"} );
		}
		else if(PRC_ID_REG.equals(prcId))
		{
			// 登録処理完了メッセージの出力
			JCCWebCommon.setMessageInfo(this, "EKB4390--I", new String[]{"CAS番号の登録"} );
		}
		
		// 共有フォームBean設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
				JKKScreenConst.SCREEN_ID_KKW22803);
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
				JKKScreenConst.SCREEN_NAME_KKW22803);
		
		return true;
	}
	
	/**
	 * 修正ボタン押下
	 * @return
	 * @throws Exception
	 */
	public boolean modify() throws Exception
	{
		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess  commonInfoBean = super.getCommonInfoBean();
		
		// 共有フォームBean設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
				JKKScreenConst.SCREEN_ID_KKW22801);
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
				JKKScreenConst.SCREEN_NAME_KKW22801);
		
		// DataBeanログ出力
		JSYwebLog.println(JSYwebLog.DataBean_Dump, getClass(), dumpDatabean(), null, null, null);
		
		return true;	
	}
	
	/**
	 * サービスを呼び出す
	 * @return 処理結果（true:正常終了、false:エラー）
	 * @throws Exception 
	 */
	private boolean callSvc(X31SDataBeanAccess[] paramBean, X31SDataBeanAccess svcFormBean, String chgDiv, String processId) throws Exception
	{
		// 変数の定義
		HashMap<String, Object> paramMap = new HashMap<String, Object>();		// パラメタ設定用マップ;
		HashMap<String, Object> inputMap = new HashMap<String, Object>();		// データマップ
		HashMap<String, Object> outputMap = new HashMap<String, Object>();		// 結果格納用マップ
	
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, JKKCommonConst.UCID_KKSV1044);
		paramMap.put(X31CWebConst.TELEGRAM_INFO_OPERATION_ID, JKKCommonConst.OPID_KKSV1044OP);
		
		KKSV1044_KKSV1044OPDBMapper mapper = new KKSV1044_KKSV1044OPDBMapper();
		
		// システムエラー時、エラーメッセージパラメータに入力する文字列を初期化
		String strErrKeyword = "";
		// オプションサービス契約解約を判断する文字列
		if(PRC_ID_INIT.equals(processId))
		{
			// CASカードの登録と削除。
			mapper.setKKSV104401CC(paramBean, inputMap, JPCModelConstant.FUNC_CD_3);
		}
		else if(PRC_ID_CHECK.equals(processId))
		{
			// CASカードの登録と削除。
			mapper.setKKSV104402CC(paramBean, inputMap, JPCModelConstant.FUNC_CD_4, CHG_DIV_REG);
			strErrKeyword = STR_REGISTER;
		}
		else if(PRC_ID_REG.equals(processId))
		{
			if(CHG_DIV_REG.equals(chgDiv))
			{
				// CAS番号登録の更新
				mapper.setKKSV104404CC(paramBean, svcFormBean, inputMap, JPCModelConstant.FUNC_CD_1, CHG_DIV_REG);
			}
			else
			{
				// CAS番号登録照会
				mapper.setKKSV104404CC(paramBean, svcFormBean, inputMap, JPCModelConstant.FUNC_CD_2, CHG_DIV_REG);
			}
			strErrKeyword = STR_REGISTER;
		}
		else if(PRC_ID_DEL.equals(processId))
		{
			if(CHG_DIV_DEL.equals(chgDiv))
			{
				// CAS番号削除更新
				mapper.setKKSV104403CC(paramBean, svcFormBean, inputMap, JPCModelConstant.FUNC_CD_1, CHG_DIV_DEL);
				mapper.setKKSV104405CC(paramBean, svcFormBean, inputMap);
			}
			else
			{
				// CAS番号削除照会
				mapper.setKKSV104403CC(paramBean, svcFormBean, inputMap, JPCModelConstant.FUNC_CD_2, CHG_DIV_DEL);
			}
			strErrKeyword = STR_DELETE;
		}
		
		// サービス呼出処理
		X31CMessageResult msgResult = null;
		try
		{
			msgResult = invokeService(paramMap, inputMap, outputMap);
		}
		catch(Exception e)
		{
			// 上記以外はシステムエラーのため、エラーをFwに返却する。
			if(!serviceErrCdCheck(outputMap, strErrKeyword))
			{
				return false;
			}
			throw e;
		}
		
		// エラー処理
		if(msgResult != null)
		{
			JCCWebCommon.setMessageInfo(this, msgResult);
			return false;
		}
		
		// 画面上で初期値を設定する
		if(PRC_ID_INIT.equals(processId))
		{
			// 取得情報の下りマッピング
			mapper.getKKSV104401CC(paramBean, outputMap, JCCWebCommon.getOpeDate(this, null));
			
			return true;
		}
		
		// エラーコードをチェックして、メッセージを設定する。
		if(!serviceErrCdCheck(outputMap, strErrKeyword))
		{
			return false;
		}
		
		return true;
	}
	
	/**
	 * <dd>メソッド名：引継情報データマップ取得
	 * <dd>メソッド説明：引数のサービスフォームBeanより引継情報データマップの生成を行う。
	 * <dd>備考：引継情報データタイプの可変項目はString[]のみ対応。
	 * @param bean サービスフォームBean
	 * @param casNoKey 引継情報データタイプのキー
	 * @param casNoPrmKeys 引継情報データタイプの項目キーリスト
	 * @return HashMap<String, Object> 引継情報データマップ
	 */
	private HashMap<String, Object> getCasNoDataMap(X31SDataBeanAccess bean, String casNoKey, String[] casNoPrmKeys)
	{
		HashMap<String, Object> dataMap = new HashMap<String, Object>();
		HashMap<String, Object> inMap = new HashMap<String, Object>();

		for (int j = 0 ; j < casNoPrmKeys.length ; j++)
		{
			// ※try-catchをfor内で実装してるため、PGRelief時にワーニングが発生する、意図的なロジックのため問題なしとする
			try
			{
				inMap.put(casNoPrmKeys[j], bean.sendMessageObject(casNoPrmKeys[j], X31CWebConst.DATABEAN_GET_VALUE));
			}
			catch (X31SRuntimeException ex)
			{
				// 可変項目の場合(String[]のみ対応)
				int length = (Integer)bean.sendMessage(casNoPrmKeys[j], X31CWebConst.DATABEAN_GET_COUNT);
				String[] obj = new String[length];
				for (int k = 0 ; k < length ; k++)
				{
					obj[k] = bean.sendMessageString(casNoPrmKeys[j], X31CWebConst.DATABEAN_GET_VALUE, k);
				}
				inMap.put(casNoPrmKeys[j], obj);
			}
		}
		dataMap.put(casNoKey, inMap);
		
		return dataMap;
	}
	
	/**
	 * オプション照会・設定ボタン押下時の処理
	 * 
	 * @param bean サービスフォームBean
	 * @param map 引き継ぎ情報マップ
	 * @param prmKeys 項目キー一覧
	 */
	private void getCommonData(X31SDataBeanAccess bean, HashMap<String, Object> map, String[] prmKeys)
	{
		for (int i = 0 ; i < prmKeys.length ; i++)
		{
			map.put(prmKeys[i], bean.sendMessageObject(prmKeys[i], X31CWebConst.DATABEAN_GET_VALUE));
		}
	}
	/**
	 * スカパー鍵情報操作エラー処理を行う
	 * <br>
	 * @param outputMap
	 * @param strErrKeyword
	 * @return true: エラーなし、false:エラーあり
	 */
	@SuppressWarnings("unchecked")
	private boolean serviceErrCdCheck(HashMap<String, Object> outputMap, String strErrKeyword)
	{
		HashMap<String, Object> resultMap = null;
		String errCd = "";
		String errCasId = "";
		String dbleSvcKeiNo = "";
		// エラーコードを取得する
		if(outputMap != null && outputMap.containsKey(SPTVKEYINFOOPERATECC))
		{
			resultMap = (HashMap)outputMap.get(SPTVKEYINFOOPERATECC);
			if (resultMap != null)
			{
				errCd = (String) resultMap.get("err_cd");
			}
		}
		if(!JKKStringUtil.isNullBlank(errCd))
		{
			// エラーCASカード番号
			errCasId = (String)resultMap.get("err_cascd_no");
			if("02".equals(errCd))
			{
				// 重複対象
				dbleSvcKeiNo = (String)resultMap.get("dble_svc_kei_no");
				// 重複エラー
				JCCWebCommon.setMessageInfo(this, "EKBG240-JW", new String[]{errCasId, dbleSvcKeiNo});
				return false;
			}
			else if("03".equals(errCd))
			{
				// 形式エラー
				JCCWebCommon.setMessageInfo(this, "EKBG250-JW", new String[]{errCasId});
				return false;
			}
			else if("04".equals(errCd))
			{
				// 登録状態エラー
				JCCWebCommon.setMessageInfo(this, "EKBG280-JW", new String[]{errCasId});
				return false;
			}
			else if("05".equals(errCd))
			{
				// 削除状態エラー
				JCCWebCommon.setMessageInfo(this, "EKBG280-JW", new String[]{errCasId});
				return false;
			}
			else if("07".equals(errCd))
			{
				// CAS番号相違チェック
				JCCWebCommon.setMessageInfo(this, "EKBG290-JW", new String[]{errCasId});
				return false;
			}
			else if("08".equals(errCd))
			{
				// チェックディジット判定エラー
				JCCWebCommon.setMessageInfo(this, "EKBG270-JW", new String[]{errCasId});
				return false;
			}
			else if("11".equals(errCd)) 
			{
				// オプション予約存在チェック
				JCCWebCommon.setMessageInfo(this, "EKBG320-KW", new String[]{"予約中のオプションチャンネル","削除"});
				return false;
			}
			else if("99".equals(errCd)) 
			{
				// 異常
				JCCWebCommon.setMessageInfo(this, "EKBG260-JW", new String[]{strErrKeyword});
				return false;
			}
			else
			{
				// エラーコードチェック
				JCCWebCommon.setMessageInfo(this, "EKBG260-JW", new String[]{strErrKeyword});
				return false;
			}
		}
		
		return true;
	}
	
	/**
	 * 閉じるボタン押下処理
	 * <br>
	 * @return boolean 処理結果
	 * @throws Exception 例外が発生した場合
	 */
	public boolean close() throws Exception
	{
		// 共有フォームBean
		X31SDataBeanAccess commonBean = super.getCommonInfoBean();
		
		// モーダル用反映画面へ画面遷移
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, "CCW00105");
		commonBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, "モーダル用反映画面");
		
		return true;
	}

}
