/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：FUW12402SFLogic
*   ソースファイル名：FUW12402SFLogic.java
*   作成者          ：富士通
*   日付            ：2024年12月18日
*＜機能概要＞
*   eo光テレビオプションチャンネル追加確認（ＣＳコース） ビューロジックです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v74.00      2024/12/18   FJ）美濃原 【ANK-4592-00-00】テレビ新コース（スカパー用）導入対応
**********************************************************************/
package eo.web.webview.FUW12402SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.util.HashMap;
import java.util.Map;

import com.fujitsu.futurity.web.x00.JCCBusinessException;
import com.fujitsu.futurity.web.x00.JCCWebServiceException;
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.X31CMessageResult.X31CMessageMoreInfo;

import eo.common.constant.JFUStrConst;
import eo.common.constant.JPCModelConstant;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.FUW12401SF.FUW12401SFConst;
import eo.web.webview.common.JFUScreenConst;
import eo.web.webview.common.JFUWebCommon;
import eo.web.webview.mapping.FUSV0381_FUSV0381OPDBMapper;

/**
 * eo光テレビオプションチャンネル追加（ＣＳコース）画面サービスフォームBeanビューロジッククラスです。
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class FUW12402SFLogic extends JCCWebBusinessLogic
{

	/** サービス:FUSV0381:eo光テレビオプションチャンネル追加(申込) */
	private static final String FUSV_ID = "FUSV0381";

	/** 申込区分("2"：来月から視聴) */
	private static final String MSKM_DIV_RAIGETSU = "2";

	/** ハイフン */
	private static final String HYHUN = "-";

	/** テンプレートID(オプションサービス契約登録) */
	private static final String TEMPLATE_ID_OP_SVC_KEI_ADD = "EKK0381D010";

	/** テンプレートID(料金コース_オプションサービス一意照会) */
	private static final String TEMPLATE_ID_PRCS_OP_SVC = "EKK0811A010";

	/** アイテムID(svc_kei_no) */
	private static final String ITEM_ID_SVC_KEI_NO = "svc_kei_no";

	/** アイテムID(op_svc_kei_ucwk_no) */
	private static final String ITEM_ID_SVC_KEI_UCWK_NO = "svc_kei_ucwk_no";

	/** アイテムID(op_svc_cd) */
	private static final String ITEM_ID_OP_SVC_CD = "op_svc_cd";

	/** アイテムID(upd_dtm_bf) */
	private static final String ITEM_ID_UPD_DTM_BF = "upd_dtm_bf";

	/** アイテムID(ido_div) */
	private static final String ITEM_ID_IDO_DIV = "ido_div";

	/** 即日／翌月("01":即日) */
	private static final String SKJ_YKGT_SKJ = "01";

	/** 即日／翌月("02":翌月) */
	private static final String SKJ_YKGT_YKGT = "02";

	/**
	 * 初期処理を行います。
	 * 
	 * @return 処理結果
	 * @throws Exception 例外
	 */
	public boolean init() throws Exception
	{
		DEBUG_LOG.info("----- FUW12402 Start init -----");

		// 画面情報を取得し、サービスフォームBeanに設定
		JFUWebCommon.getScreenInfo(this);

		// 現顧客契約リフレッシュ判定処理
		JFUWebCommon.refreshGenCustKei(this);

		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();

		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		// 共有フォームBeanより値を取得
		getCommonFormBean(commonInfoBean, serviceFormBean);

		// 共通関連チェック
		JFUWebCommon.checkCommonRelation(this, FUSV_ID);

		// 契約状態チェック
		String kiki_seizo_no = serviceFormBean.sendMessageString(FUW12401SFConst.KIKI_SEIZO_NO, X31CWebConst.DATABEAN_GET_VALUE);
		checkKeistatus(commonInfoBean, kiki_seizo_no);

		//***********************************//
		// サービスフォームBeanへ値を設定
		//***********************************//

		// サービスフォームBeanのC-CASカード番号をハイフン編集
		String kikiSeizoNoDisp = editKikiSeizoNo(serviceFormBean.sendMessageString(FUW12401SFConst.KIKI_SEIZO_NO, X31CWebConst.DATABEAN_GET_VALUE));

		// ハイフン編集したC-CASカード番号をサービスフォームBeanに設定
		serviceFormBean.sendMessageString(FUW12402SFConst.KIKI_SEIZO_NO_DISP, X31CWebConst.DATABEAN_SET_VALUE, kikiSeizoNoDisp);

		// 視聴制御依頼処理コード
		serviceFormBean.sendMessageString(FUW12402SFConst.WCTRL_REQ_TRN_CD, X31CWebConst.DATABEAN_SET_VALUE, JFUStrConst.CD00365_30);

		// 申込登録明細情報作成
		// サービスフォームBeanの申込登録明細取得
		X31SDataBeanAccess mskmAddList = JFUWebCommon.createAndGetDataBeanTypeByPath(serviceFormBean, FUW12402SFConst.MSKM_ADD_LIST);

		// 申込登録明細.申込形態コードに"01"(WEBを)設定
		JFUWebCommon.setDataBeanItemByPath(mskmAddList, FUW12402SFConst.MSKM_FORM_CD_02, JFUStrConst.CD00591_01);

		// 異同理由明細情報作成
		// サービスフォームBeanの異同理由明細取得
		X31SDataBeanAccess idoRiyuList = JFUWebCommon.createAndGetDataBeanTypeByPath(serviceFormBean, FUW12402SFConst.IDO_RIYU_LIST);

		// 異同理由明細.異同理由コードに値"56"(その他)を設定
		JFUWebCommon.setDataBeanItemByPath(idoRiyuList, FUW12402SFConst.IDO_RSN_CD_03, JFUStrConst.CD00846_56);

		// サービス利用開始年月日を設定
		// オンライン運用日付を取得
		String opeDate = JFUWebCommon.getOpeDate(this, null);
		String svcUseStaYmd = opeDate;

		// 即日／翌月に"01"(即日)を設定
		serviceFormBean.sendMessageString(FUW12402SFConst.SKJ_YKGT, X31CWebConst.DATABEAN_SET_VALUE, SKJ_YKGT_SKJ);

		// 申込区分が2(来月から視聴)の場合
		if (MSKM_DIV_RAIGETSU.equals(serviceFormBean.sendMessageString(FUW12402SFConst.MSKM_DIV, X31CWebConst.DATABEAN_GET_VALUE)))
		{
			// 翌月の1日を取得
			svcUseStaYmd = JFUWebCommon.getBeginOfNextMonthDate(svcUseStaYmd);

			// 即日／翌月に"02"(翌月)を設定
			serviceFormBean.sendMessageString(FUW12402SFConst.SKJ_YKGT, X31CWebConst.DATABEAN_SET_VALUE, SKJ_YKGT_YKGT);
		}

		serviceFormBean.sendMessageString(FUW12402SFConst.SVC_USE_STA_YMD, X31CWebConst.DATABEAN_SET_VALUE, svcUseStaYmd);

		//**********************************//
		// サービス処理
		//**********************************//

		// サービスIDをparamにセット
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, FUSV_ID);

		// DataBean-BPマッピング
		FUSV0381_FUSV0381OPDBMapper mapper = new FUSV0381_FUSV0381OPDBMapper();

		HashMap<String, Map<String, String>> inputMap = new HashMap<String, Map<String, String>>();
		HashMap<String, String> outputMap = new HashMap<String, String>();

		X31SDataBeanAccess[] paramBean = { serviceFormBean };
		mapper.setFUSV038101SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setFUSV038102SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setFUSV038103SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setFUSV038104SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setFUSV038105SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setFUSV038106SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);

		mapper.setFUSV038107SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setFUSV038108SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setFUSV038111SC(paramBean, inputMap);
		mapper.setFUSV038112CC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2, opeDate);

		try
		{
			// サービス呼び出し
			invokeService(paramMap, inputMap, outputMap);
			mapper.getFUSV038101SC(paramBean, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// 例外判定
			setError(se);
		}

		//**********************************//
		// サービス処理結果判定
		//**********************************//
		// オプションサービス契約リスト契約状態判定
		chkOpSvcKeiListCount(serviceFormBean);

		// オプションチャンネルの契約状態判定
		chkOpSvcKeiStats(serviceFormBean);

		String err_cd = mapper.getFUSV038112CC(paramBean, outputMap);
		if (!JFUWebCommon.isNull(err_cd))
		{
			// 業務共通例外クラス："0201"（お客様情報変更エラー）
			DEBUG_LOG.info("■■■FUW12402 CSコース用オプションチャンネル情報操作CC(共通部品エラー)err_cd：" + err_cd + "");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}

		//**********************************//
		// 画面遷移
		//**********************************//

		// eo光テレビオプションチャンネル追加画面へ遷移
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW12402);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW12402);

		DEBUG_LOG.info("----- FUW12402 End init -----");

		return true;
	}

	/**
	 * 申し込むボタン押下処理を行います。
	 * 
	 * @return 処理結果
	 * @throws Exception 例外
	 */
	public boolean mskm() throws Exception
	{
		DEBUG_LOG.info("----- FUW12402 Start mskm -----");

		// 現顧客契約リフレッシュ判定処理
		JFUWebCommon.refreshGenCustKei(this);

		// 共有フォームBeanのアクセスクラスを取得
		X31SDataBeanAccess commonInfoBean = super.getCommonInfoBean();

		// サービスフォームBeanのデータBeanアクセスクラスを取得
		X31SDataBeanAccess serviceFormBean = super.getServiceFormBean();

		// 共通関連チェック
		JFUWebCommon.checkCommonRelation(this, FUSV_ID);

		// 契約状態チェック
		String kiki_seizo_no = serviceFormBean.sendMessageString(FUW12401SFConst.KIKI_SEIZO_NO, X31CWebConst.DATABEAN_GET_VALUE);
		checkKeistatus(commonInfoBean, kiki_seizo_no);

		// オプションサービス契約状態一覧のデータを削除
		X31SDataBeanAccessArray opChanelKeiStatList = serviceFormBean.getDataBeanArray(FUW12402SFConst.OP_CHANELL_KEI_STAT_LIST);
		opChanelKeiStatList.clearArray();

		//***********************************//
		// サービスフォームBeanへ値を設定
		//***********************************//

		// サービス利用開始年月日を設定
		// オンライン運用日付を取得
		String opeDate = JFUWebCommon.getOpeDate(this, null);
		String svcUseStaYmd = opeDate;

		// 申込区分が2(来月から視聴)の場合
		if (MSKM_DIV_RAIGETSU.equals(serviceFormBean.sendMessageString(FUW12402SFConst.MSKM_DIV, X31CWebConst.DATABEAN_GET_VALUE)))
		{
			// 翌月の1日を取得
			svcUseStaYmd = JFUWebCommon.getBeginOfNextMonthDate(svcUseStaYmd);
		}
		serviceFormBean.sendMessageString(FUW12402SFConst.SVC_USE_STA_YMD, X31CWebConst.DATABEAN_SET_VALUE, svcUseStaYmd);

		//**********************************//
		// サービス処理
		//**********************************//

		// サービスIDをparamにセット
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, FUSV_ID);

		// DataBean-BPマッピング
		FUSV0381_FUSV0381OPDBMapper mapper = new FUSV0381_FUSV0381OPDBMapper();

		HashMap<String, Map<String, String>> inputMap = new HashMap<String, Map<String, String>>();
		HashMap<String, String> outputMap = new HashMap<String, String>();

		X31SDataBeanAccess[] paramBean = { serviceFormBean };
		mapper.setFUSV038101SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setFUSV038102SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setFUSV038103SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_2);
		mapper.setFUSV038104SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setFUSV038105SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setFUSV038106SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setFUSV038107SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setFUSV038108SC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1);
		mapper.setFUSV038111SC(paramBean, inputMap);
		mapper.setFUSV038112CC(paramBean, inputMap, JPCModelConstant.FUNC_CD_1, opeDate);

		try
		{
			// サービス呼び出し
			invokeService(paramMap, inputMap, outputMap);
			mapper.getFUSV038101SC(paramBean, outputMap);
		}
		catch (JCCWebServiceException se)
		{
			// 例外判定
			setError(se);
		}

		// STB機器の契約状態判定
		chkOpSvcKeiListCount(serviceFormBean);

		// オプションチャンネルの契約状態判定
		chkOpSvcKeiStats(serviceFormBean);

		//**********************************//
		// 画面遷移
		//**********************************//

		// eo光テレビオプションチャンネル追加画面へ遷移
		// 遷移先画面IDを設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_ID_FUW12403);
		// 遷移先画面名を設定
		commonInfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, JFUScreenConst.SCREEN_NAME_FUW12403);

		DEBUG_LOG.info("----- FUW12402 End mskm -----");

		return true;
	}

	/**
	 * 共有フォームBean設定値取得処理を行います。
	 * 
	 * @param commonInfoBean			共有フォームBean
	 * @param serviceFormBean			サービスフォームBean
	 * @throws JCCBusinessException	例外
	 */
	private void getCommonFormBean(X31SDataBeanAccess commonInfoBean, X31SDataBeanAccess serviceFormBean) throws JCCBusinessException
	{
		DEBUG_LOG.info("----- FUW12402 Start getCommonFormBean -----");

		// 共有フォームBeanより値を取得しサービスフォームBeanに設定

		//**********************************//
		// ＳＳＯ情報
		//**********************************//

		// ＳＳＯ情報を取得
		X31SDataBeanAccess ssoInfo = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SSO_INFO);

		// ＳＳＯ情報.SYSIDを取得しサービスフォームBeanに設定
		serviceFormBean.sendMessageString(FUW12402SFConst.SYSID, X31CWebConst.DATABEAN_SET_VALUE, JFUWebCommon.getDataBeanItemByPath(ssoInfo,
				CommonInfoCFConst.SYSID_21));

		// ＳＳＯ情報.サービス契約番号を取得しサービスフォームBeanに設定
		serviceFormBean.sendMessageString(FUW12402SFConst.SVC_KEI_NO, X31CWebConst.DATABEAN_SET_VALUE, JFUWebCommon.getDataBeanItemByPath(ssoInfo,
				CommonInfoCFConst.SVC_KEI_NO_21));

		//**********************************//
		// サービス契約情報
		//**********************************//

		// サービス契約情報を取得
		X31SDataBeanAccess svcKeiInfo = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SVC_KEI_INFO);

		// サービス契約情報.最終更新年月日時分秒を取得しサービスフォームBeanに設定
		serviceFormBean.sendMessageString(FUW12402SFConst.LAST_UPD_DTM, X31CWebConst.DATABEAN_SET_VALUE, JFUWebCommon.getDataBeanItemByPath(
				svcKeiInfo, CommonInfoCFConst.LAST_UPD_DTM_23));

		// サービス契約情報.サービス契約料金コースコードを取得しサービスフォームBeanに設定
		serviceFormBean.sendMessageString(FUW12402SFConst.SVCKEI_PCRS_CD, X31CWebConst.DATABEAN_SET_VALUE, JFUWebCommon.getDataBeanItemByPath(
				svcKeiInfo, CommonInfoCFConst.PCRS_CD_23));

		//**********************************//
		// 請求契約情報
		//**********************************//

		// 請求契約情報の取得
		X31SDataBeanAccess seikyKeiInfo = JFUWebCommon.getDataBeanTypeByPath(commonInfoBean, JFUWebCommon.SEIKY_KEI_INFO);

		// 請求契約情報.請求契約番号を取得しサービスフォームBeanに設定
		serviceFormBean.sendMessageString(FUW12402SFConst.SEIKY_KEI_NO, X31CWebConst.DATABEAN_SET_VALUE, JFUWebCommon.getDataBeanItemByPath(
				seikyKeiInfo, CommonInfoCFConst.SEIKY_KEI_NO_32));

		DEBUG_LOG.info("----- FUW12402 End getCommonFormBean -----");
	}

	/**
	 * オプションチャンネル契約状態一覧件数チェック処理を行います。
	 * 
	 * @param serviceFormBean			サービスフォームBean
	 */
	private void chkOpSvcKeiListCount(X31SDataBeanAccess serviceFormBean)
	{
		DEBUG_LOG.info("----- FUW12402 Start chkOpSvcKeiListCount -----");

		// サービスフォームBeanを操作するデータBeanアクセスクラスを取得
		X31SDataBeanAccessArray opChannelKeiList = serviceFormBean.getDataBeanArray(FUW12402SFConst.OP_CHANELL_KEI_STAT_LIST);

		// オプションサービス契約リストにデータがない場合
		if (opChannelKeiList.getCount() == 0)
		{
			DEBUG_LOG.info("■■■FUW12402 (1)オプションチャンネル契約状態一覧：契約状態エラー■■■");
			// 業務共通例外クラス："0102"（契約状態エラー）
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}

		DEBUG_LOG.info("----- FUW12402 Start chkOpSvcKeiListCount -----");
	}

	/**
	 * オプションチャンネル契約状態チェック処理を行います。
	 * 
	 * @param serviceFormBean			サービスフォームBean
	 */
	private void chkOpSvcKeiStats(X31SDataBeanAccess serviceFormBean)
	{
		DEBUG_LOG.info("----- FUW12402 Start chkOpSvcKeiStats -----");

		// サービスフォームBeanを操作するデータBeanアクセスクラスを取得
		X31SDataBeanAccessArray opChannelKeiList = serviceFormBean.getDataBeanArray(FUW12402SFConst.OP_CHANELL_KEI_STAT_LIST);

		// オプションチャンネルの契約状態判定
		for (int i = 0; i < opChannelKeiList.getCount(); ++i)
		{
			// チャンネル情報を取得
			X31SDataBeanAccess channelBean = opChannelKeiList.getDataBean(i);

			// 申込対象のオプションサービスコードとリストのオプションサービスコードが同じ場合
			if (serviceFormBean.sendMessageString(FUW12402SFConst.OP_SVC_CD, X31CWebConst.DATABEAN_GET_VALUE).equals(
					channelBean.sendMessageString(FUW12402SFConst.OP_SVC_CD_01, X31CWebConst.DATABEAN_GET_VALUE)))
			{
				// オプションサービス契約ステータスが""(空白)または"910"(解約済)以外の場合
				if (!JFUStrConst.EMPTY.equals(channelBean.sendMessageString(FUW12402SFConst.OP_SVC_KEI_STAT_01, X31CWebConst.DATABEAN_GET_VALUE))
						&& !JFUStrConst.CD00037_910.equals(channelBean.sendMessageString(FUW12402SFConst.OP_SVC_KEI_STAT_01,
								X31CWebConst.DATABEAN_GET_VALUE)))
				{
					// 業務共通例外クラス："0201"（お客様情報変更エラー）
					DEBUG_LOG.info("■■■FUW12402 (2)オプションチャンネルの契約状態判定エラー(お客様情報変更エラー)(オプションサービス契約ステータス："
							+ channelBean.sendMessageString(FUW12402SFConst.OP_SVC_KEI_STAT_01, X31CWebConst.DATABEAN_GET_VALUE) + ")");
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0201);
				}
			}
		}

		DEBUG_LOG.info("----- FUW12402 End chkOpSvcKeiStats -----");
	}

	/**
	 * C-CASカード番号のハイフン編集処理を行います。
	 * <br>
	 * @param arg0 	C-CASカード番号
	 * @return String 編集されたC-CASカード番号
	 */
	private static String editKikiSeizoNo(String arg0)
	{
		StringBuffer strBuf = new StringBuffer();

		// C-CASカード番号の文字数を取得
		int length = arg0.length();

		for (int i = 0; i < length; i++)
		{
			// C-CASカード番号の4桁目、8桁目、12桁目、16桁目にハイフンを設定
			if (4 == length - i || 8 == length - i || 12 == length - i || 16 == length - i)
			{
				strBuf.append(HYHUN);
			}

			strBuf.append(arg0.substring(i, i + 1));
		}

		return strBuf.toString();
	}

	/**
	 * 例外情報処理を行います。
	 * 
	 * @param se	JCCWebServiceException
	 */
	private void setError(JCCWebServiceException se)
	{
		DEBUG_LOG.info("----- FUW12402 Start setError -----");

		// 例外情報を取得
		X31CMessageResult msgResult = se.getMessageList();
		X31CMessageMoreInfo[] moreInfo = msgResult.getMessageMoreInfoList();
		X31CMessageMoreInfo info = moreInfo[0];// 関連チェック系は必ずエラーが1つのため0番目から取得する。
		String templateid = info.getTemplateId();
		String itemid = info.getItemId();
		String status = info.getStatus();
		String errFlg = info.getItemCheckErr();

		// ステータスが"1100"（内部スキーマ関連チェックエラーの場合
		if (String.valueOf(JPCModelConstant.RELATION_ERR).equals(status))
		{
			// テンプレートIDが"EKK0381D010"(オプションサービス契約登録)の場合
			if (TEMPLATE_ID_OP_SVC_KEI_ADD.equals(templateid))
			{
				// 関連チェックエラーフラグが"EA"または"EB"の場合
				if (JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) || JFUStrConst.RELATION_CHECK_ERR_EB.equals(errFlg))
				{
					// アイテムIDが"svc_kei_no"(サービス契約番号)、または"svc_kei_ucwk_no"(サービス契約内訳番号)の場合
					if (ITEM_ID_SVC_KEI_NO.equals(itemid) || ITEM_ID_SVC_KEI_UCWK_NO.equals(itemid))
					{
						// 業務共通例外クラス："0102"(契約状態エラー)
						DEBUG_LOG.info("■■■FUW12402 (3)サービスIF実行エラー(EKK0381D010)");
						throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
					}
				}
			}

			/* ++++++++++ v3.00 修正開始 ++++++++++ */
			// テンプレートIDが"EKK0811A010"(料金コース_オプションサービス一意照会)の場合
			if (TEMPLATE_ID_PRCS_OP_SVC.equals(templateid))
			{
				// 関連チェックエラーフラグが"EA"の場合
				if (JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg))
				{
					// アイテムIDが"op_svc_cd"(オプションサービスコード)の場合
					if (ITEM_ID_OP_SVC_CD.equals(itemid))
					{
						// 業務共通例外クラス："0201"(お客様情報変更エラー)
						DEBUG_LOG.info("■■■FUW12402 (4)サービスIF実行エラー(EKK0821B002) --オプションチャンネル重複チェックエラー");
						throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0201);
					}
				}
			}
			/* ++++++++++ v3.00 修正終了 ++++++++++ */
			
			// アイテムIDが"upd_dtm_bf"(更新年月日時分秒(更新前))の場合
			if (JFUStrConst.RELATION_CHECK_ERR_EA.equals(errFlg) && ITEM_ID_UPD_DTM_BF.equals(itemid))
			{
				// 業務共通例外クラス："0201"（お客様情報変更エラー）
				DEBUG_LOG.info("■■■FUW12402 (5)サービスIF実行エラー(排他チェックエラー)");
				throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0201);
			}

			// ステータスが"1300"(外部スキーマの相関チェックエラー)の場合
			if (String.valueOf(JPCModelConstant.TEMPLATE_CORRELATION_ERR).equals(status))
			{
				// アイテムIDが"ido_div"(異動区分)の場合
				if (ITEM_ID_IDO_DIV.equals(itemid))
				{
					// 業務共通例外クラス："0102"（契約状態エラー）
					DEBUG_LOG.info("■■■FUW12402 (6)サービスIF実行エラー(異動予約エラー)");
					throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
				}
			}
			// 業務共通例外クラス："0102"（契約状態エラー）
			DEBUG_LOG.info("■■■FUW12402 (7)サービスIF実行エラー(関連チェックエラー)");
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}

		// 業務共通例外クラス："0002"（システムエラー）
		DEBUG_LOG.info("■■■FUW12402 (10)サービスIF実行エラー(システムエラー)");
		throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002);
	}

	/**
	 * 契約状態チェック
	 * @param commonInfoBean 共通フォームBean
	 * @param inCascdNo  CASカード番号
	 */
	private void checkKeistatus(X31SDataBeanAccess commonInfoBean, String inCascdNo)
	{
		if (!JFUWebCommon.isTvCsOpchSptvRnkStatOk(commonInfoBean, inCascdNo))
		{
			// 業務共通例外クラス："0102"（契約状態エラー）
			throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102);
		}
	}

}