/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbKK2361SecProc
*	ソースファイル名：JKKejbKK2361SecProc.java
*	作成者			：富士通
*	日付			：2012年03月27日
*＜機能概要＞
*	割引サービス契約内訳に対する副次処理を行う部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/03/27	富士通		新規作成
*	v5.00.00	2013/07/19	FJ)寺園	 	IT2-2013-0000649
*	v5.00.01	2013/09/09	FJ)寺園	 	OM-2013-0001651
*	v5.00.02	2013/09/20	FJ)沖田	 	OM-2013-0002427
*   v5.00.03    2013/09/22  FJ)寺本     OM-2013-0002427(再)
*   v5.00.04    2013/11/26  FJ)寺園     OM-2013-0002795
*   v6.00.00    2013/12/16  FJ)寺園     OM-2013-0004207
*   v20.00.00   2015/10/14  FJ)三宅     ANK-2697-00-00
*   v20.00.01   2015/11/29  FJ)三宅     OM-2015-0003097
*   v32.00.00   2017/06/22   FJ)三原    ANK-3149-20-00_新セキュリティパック導入(メールウィルスチェックの自動登録)
*   v39.00.00   2018/10/01  FJ)舘山		【ANK-3484-00-00】_端末補償サービス導入対応
********************************************************************************/

package eo.ejb.common.db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANConnectionMgr;
import com.fujitsu.futurity.model.base.CAANCreateException;
import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANJDBCUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.JSYejbConnection;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.common.constant.JKKStrConst;
import eo.common.util.JPCDateUtil;
import eo.ejb.cbm.entity.KK0011ETMsg;
import eo.ejb.cbm.entity.KK0021ETMsg;
import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK0161ETMsg;
import eo.ejb.cbm.entity.KK0351ETMsg;
import eo.ejb.cbm.entity.KK0351LE;
import eo.ejb.cbm.entity.KK0401ETMsg;
import eo.ejb.cbm.entity.KK0401LE;
import eo.ejb.cbm.entity.KK0451ETMsg;
import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbm.entity.KK2361ETMsg;
import eo.ejb.cbm.entity.KK2361LE;
import eo.ejb.cbm.entity.KK2371ETMsg;
import eo.ejb.cbm.entity.ZM0321ETMsg;
import eo.ejb.cbm.entity.ZM0321LE;
import eo.ejb.cbs.cbsmsg.EKK0451C020CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451C022CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451C050CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451C170CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451C230CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451D010CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0451D010CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0451D010CBSMsg2List;
import eo.ejb.cbs.cbsmsg.EKK0451D010CBSMsg3List;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.JKKejbBusinessException;
import eo.ejb.common.entity.JKKejbIdoRsvAccess;
import eo.ejb.common.rule.JKKejbRule0068001;
import eo.ejb.common.rule.JKKejbRule0076001;
import eo.ejb.common.rule.JKKejbRule0088001;

/**
 * <p>
 * 割引サービス契約内訳に対する副次処理部品クラスです。
 * </p>
 * @author 富士通
 *
 */
public class JKKejbKK2361SecProc extends JKKejbKK2361DBABase
{

	/**
	 * コンストラクタです。
	 */
	public JKKejbKK2361SecProc()
	{
		super();
	}

	/** メールウィルスチェック登録上限数 */
	int maxValue = 0;

	/** サブオプションサービスコード メールウィルスチェック */
	private static final String SBOPCD_VIRUSCHK = "D03";
	
	/** 料金グループコード eo光ネットホームタイプ */
	private static final String PRCGRPCD_HOME = "02";
	
	/** 料金グループコード eo光ネットメゾンタイプ */
	private static final String PRCGRPCD_MEZON = "03";
	
	/** 料金グループコード eo光ネットマンションタイプ */
	private static final String PRCGRPCD_MANS = "04";
	
	/** 料金コースコード メールウィルスチェック */
	private static final String PCRSCD_VIRUSCHK = "D03";
	
	/** 料金プランコード メールウィルスチェック　定額プラン */
	private static final String PPLANCD_VIRUSCHK_FIXED = "PD0301";
	
	/** 割引サービスコード ファミリーパック割引 */
	private static final String WRIBCD_FAMILYPACK = "W00000006";
	
	/** オプションサービスコード Ｅメール */
	private static final String OPCD_EMAIL = "B001";
	
	/** 予約適用コード 予約確定 */
	private static final String RSVCD_DECIDED = "2";

	/** 無効フラグ 有効 */
	private static final String MKFLG_VALID = "0";

	/** 有無フラグ 無 */
	private static final String UMUFLG_NONE = "0";
	
	/** 業務パラメータ ファミリーパック用Ｅメール最大値（ホームタイプ） */
	private static final String WORKID_MAX_HOME = "KK_FP_EMAILMAX_HOME";
	
	/** 業務パラメータ ファミリーパック用Ｅメール最大値（メゾンタイプ） */
	private static final String WORKID_MAX_MEZON = "KK_FP_EMAILMAX_MEZON";
	
	/** 業務パラメータ ファミリーパック用Ｅメール最大値（マンションタイプ） */
	private static final String WORKID_MAX_MANS = "KK_FP_EMAILMAX_MANS";
	
	/** オプションサービス契約ステータス 受付済 */
	private static final String OPSTAT_ACCEPTED = "010";
	
	/** オプションサービス契約ステータス 照査済 */
	private static final String OPSTAT_VERIFIED = "020";
	
	/** オプションサービス契約ステータス 締結済 */
	private static final String OPSTAT_CONCLUDED = "030";
	
	/** オプションサービス契約ステータス 休止・中断中 */
	private static final String OPSTAT_PAUSING = "210";
	
	/** オプションサービス契約ステータス 停止中 */
	private static final String OPSTAT_STOPPING = "220";
	
	/** オプションサービス契約ステータス 解約済 */
	private static final String OPSTAT_DISSOLVED = "910";
	
	/** オプションサービス契約ステータス キャンセル済 */
	private static final String OPSTAT_CANCELED = "920";
	
	/** オラクルシーケンス定義名 */
	private static final String SEQ_SBOP_SVC_KEI_NO = "SEQ_SBOP_SVC_KEI_NO";

	/** シーケンス補正桁数 */
	private static final int SEQUENCE_LENGTH = 12;
	
	/** 割引サービス契約内訳ステータス 登録済 */
	private static final String WRIBSVCKEIUCWKSTAT_ADDZUMI = "010";
	
	/** 割引サービス契約内訳ステータス 解約済 */
	private static final String WRIBSVCKEIUCWKSTAT_KAUYAKUZUMI = "910";
		
	/** 異動予約詳細コード オプション開始 */
	private static final String IDO_RSV_DTL_OPSTA = "014";
	
	/** サービスコード：インターネットサービス */
	private static final String SVC_CD_INTERNET_SRV = "01";
	
	/** サブオプションサービスコード：メールウイルスチェック */
	private static final String MAIL_VIRUS_CHK = "D03";
	
	/** 即時翌月：即時 */
	private static final String SOKUJIYOKUGETU_FLG_SOKKETU = "01";

	/** 月初 */
	public static final String GESYO = "01";

	/** 月初設定用 */
	public static final String GESYO_SETTEI = "1";

	/** 月初以外設定用 */
	public static final String GESYO_IGAI_SETTEI = "0";
	
	/** サービス課金終了年月日設定パターンコード：解約月末日 */
	public static final String CD01515_KAIYAKUDUKI_MATUJITU = "0";

	/** サービス課金終了年月日設定パターンコード：解約前月末日 */
	public static final String CD01515_KAIYAKUZENNGETU_MATUJITU = "1";

	/** サービス課金終了年月日設定パターンコード：解約日当日 */
	public static final String CD01515_KAIYAKUBI_TOUJITU = "2";

	/** 関連チェックエラーフラグ&エラー返却項目(サブオプションサービス契約 開始日確定チェック) */
	private static final String[] KRCK_SBOP_START_DECIDED_ERR = {"EH", EKK0451D010CBSMsg.SYSID_ERR};

	/** 親契約識別コード サービス契約内訳 */
	private static final String OYA_KEI_SKBT_SVCKEI_UCWK = "03";
	
	/** 料金スケジュール定義：基準日以降で直近の料金計算の請求年月 */
	private static final String AFTER_LATEST_SEIKYU_YM = "2";

	/** 接尾辞 */
	private static final String SUFFIX = "01";
	
	/** サービス課金終了年月日設定パターンコード：CP解約日 */
	public static final String CD01515_CP_KAIYAKU_DAY = "3";

	/** 割引解約キャンセル契機コード：自動設定 */
	private static final String WRIB_DSL_CNCL_OPTY_CD_AUTO = "1";

	/** 割引解約キャンセル契機コード：手動設定 */
	private static final String WRIB_DSL_CNCL_OPTY_CD_MANUAL  = "2";

	/**
	 * <p>
	 * 割引サービス契約内訳登録処理を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void createWribSvcKeiUcwk(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		
		String wribSvcCd = inCBSMsg.getString(EKK0451D010CBSMsg.WRIB_SVC_CD);
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		// 割引サービスコードに紐づく割引サービス詳細明細を取得する
		CAANMsg[] kk2371List = new JKKejbKK2371DBABase().getKK2371byWribSvc(wribSvcCd, opeDate); 
		
		ArrayList<CAANMsg> kk2361Out = new ArrayList<CAANMsg>();
		
		// 割引サービス詳細の登録数分、サービス契約内訳登録処理を繰り返し
		int cnt = 0;
		cnt = kk2371List.length;
	
		for (int i = 0 ; i < cnt ; i++)
		{
		
			CAANMsg kk2361Info = new CAANMsg(KK2361ETMsg.class.getName());

			// 登録内容共通項目設定
			setWrisvcKeiUcwk(inCBSMsg, inContext, kk2361Info, kk2371List[i]);

			// サービス契約内訳登録
			createKK2361(kk2361Info);
			kk2361Out.add(setOutKK2361(kk2361Info));

		}
		
		// 出力項目設定
		inCBSMsg.set(EKK0451D010CBSMsg.EKK0451D010CBSMSG3LIST, kk2361Out.toArray(new CAANMsg[0]));

		
		// 割引サービス対象契約の明細を取得
		// (ファミリーパック割引の場合は、入力されるサービス契約番号は1件の想定)
		CAANMsg[] wariRegistList = inCBSMsg.getCAANMsgList(EKK0451D010CBSMsg.EKK0451D010CBSMSG1LIST);
		CAANMsg wariRegist = wariRegistList[0];

		// 条件判定
		if (!isInsCondOfWari(inCBSMsg, inContext))
		{
			return;
		}
		
		String svcKeiNo = wariRegist.getString(EKK0451D010CBSMsg1List.SVC_KEI_NO);

		// 共通条件判定
		if (!isProperCommonCond(inCBSMsg, inContext, svcKeiNo))
		{
			return;
		}
		
		CAANMsg[] kk0351List = getTargetOpKei(inCBSMsg, inContext, 
								getOpKeiOfSvcKei(inCBSMsg, inContext, svcKeiNo));
		
		ArrayList<CAANMsg> alOut = new ArrayList<CAANMsg>();
		
		// メールウィルスチェック登録上限値またはオプションサービス契約の登録数分
		// メールウィルスチェック登録処理を繰り返し
		cnt = 0;
		
		// 上限値と登録対象オプションサービス契約数を比較し、小さいほうを繰り返し回数とする
		if (maxValue < kk0351List.length)
		{
			cnt = maxValue;
		}
		else
		{
			cnt = kk0351List.length;
		}
		
		for (int i = 0 ; i < cnt ; i++)
		{
			if (!isInsTarget(inCBSMsg, inContext, kk0351List[i]))
			{
				// 既にメールウィルスチェックのサブオプションサービス契約が登録されている場合、処理をスキップする
				continue;
			}
			
			CAANMsg kk0401Info = new CAANMsg(KK0401ETMsg.class.getName());
			
			// 登録内容共通項目設定
			setCommonItemMailVirusChk(inCBSMsg, inContext, kk0401Info);

			// 相関チェックルールを呼び出し用パラメータ
			String wrbSvcKeiNo = inCBSMsg.getString(EKK0451D010CBSMsg.WRIB_SVC_KEI_NO);
			String optSvcKeiNo = kk0351List[i].getString(KK0351ETMsg.OP_SVC_KEI_NO);
			
			// 登録内容個別項目設定
			setKK0401OfWari(inCBSMsg, inContext, kk0401Info, kk0351List[i], wrbSvcKeiNo, optSvcKeiNo);

			// サブオプションサービス契約登録
			new JKKejbKK0401SecProc().createMailVirusChk(inCBSMsg, inContext, kk0401Info);
			alOut.add(setOutItemOfWari(kk0401Info));
			
			// サブオプションサービス契約<ISP>登録
			new JKKejbKK0411SecProc().createMailVirusChk(inCBSMsg, inContext, kk0401Info);
			
			// 課金先登録
			new JKKejbKK0321SecProc().createMailVirusChkOfWari(inCBSMsg, inContext, kk0401Info);
		}
		
		// 出力項目設定
		inCBSMsg.set(EKK0451D010CBSMsg.EKK0451D010CBSMSG2LIST, alOut.toArray(new CAANMsg[0]));
	}
	
	/**
	 * <p>
	 * 割引サービス契約内訳の項目設定を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk2361Info 割引サービス契約内訳ETメッセージ
	 * @param kk2371Msg 割引サービス詳細ETメッセージ
	 */
	private void setWrisvcKeiUcwk(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk2361Info, CAANMsg kk2371Msg)
	{
		kk2361Info.set(KK2361ETMsg.WRIB_SVC_KEI_NO, inCBSMsg.getString(EKK0451D010CBSMsg.WRIB_SVC_KEI_NO));
		kk2361Info.set(KK2361ETMsg.WRIB_SVC_KEI_UCWK_NO, JKKModelCommon.getWribSvcKeiUcwkNoNoKK2361(inCBSMsg, inContext));
		kk2361Info.set(KK2361ETMsg.GENE_ADD_DTM, JKKModelCommon.getTransferGeneAddDtm(inCBSMsg, inContext));
		kk2361Info.set(KK2361ETMsg.WRIB_SVC_KEI_UCWK_STAT, WRIBSVCKEIUCWKSTAT_ADDZUMI);
		kk2361Info.set(KK2361ETMsg.WRIB_SVC_DTL_CD, kk2371Msg.getString(KK2371ETMsg.WRIB_SVC_DTL_CD));
		kk2361Info.set(KK2361ETMsg.WRIB_APLY_CNT, "0");
		kk2361Info.set(KK2361ETMsg.CHRG_STA_YMD_HOSEI_UM, UMUFLG_NONE);
		kk2361Info.set(KK2361ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		kk2361Info.set(KK2361ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		kk2361Info.set(KK2361ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		kk2361Info.set(KK2361ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		kk2361Info.set(KK2361ETMsg.MK_FLG, MKFLG_VALID);
	}

	/**
	 * <p>
	 * 割引サービス契約内訳の登録を行います。
	 * </p>
	 * @param inETMsg　割引サービス契約内訳のメッセージキャリア
	 */
	private void createKK2361(CAANMsg inETMsg)
	{
		try
		{
			super.create(inETMsg);
		}
		catch (CAANCreateException ce)
		{
			throw new CAANRuntimeException(ce);
		}
	}
	
	/**
	 * <p>
	 * メールウィルスチェック登録の条件判定(割引サービス契約内訳登録)を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 割引サービス契約が"ファミリーパック"の場合true、それ以外の場合falseを返却
	 */
	private boolean isInsCondOfWari(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		String wribSvcCd = inCBSMsg.getString(EKK0451D010CBSMsg.WRIB_SVC_CD);
		//ANK-3149-20-00 MOD START
		//if (!WRIBCD_FAMILYPACK.equals(wribSvcCd))
		//割引サービス契約が"ファミリーパック"または"セキュリティーパック"または"プレミアムパック"の場合true、それ以外の場合falseを返却
		if (!WRIBCD_FAMILYPACK.equals(wribSvcCd) && !JKKStrConst.WRIB_SVC_CD_SECURITY_PACK.equals(wribSvcCd) && !JKKStrConst.WRIB_SVC_SMARTLINK_PREMIUM.equals(wribSvcCd) )
		//ANK-3149-20-00 MOD END
		{
			// 登録する割引サービス契約が"ファミリーパック"以外の場合、falseを返却
			return false;
		}
		
		return true;
	}

	/**
	 * <p>
	 * メールウィルスチェック登録の共通条件判定を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo サービス契約番号
	 * @return 割引サービス契約に紐づくＥメール契約件数がファミリーパックＥメール適用数未満の場合true、
	 * 			それ以外の場合falseを返却
	 */
	private boolean isProperCommonCond(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcKeiNo)
	{
		if (null == svcKeiNo)
		{
			// サービス契約番号が設定されていない場合、falseを返却
			return false;
		}
		
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		CAANMsg kk0081CurCond = new CAANMsg(KK0081ETMsg.class.getName());
		kk0081CurCond.set(KK0081ETMsg.SVC_KEI_NO, svcKeiNo);
		kk0081CurCond.set(KK0081ETMsg.RSV_APLY_YMD, opeDate);
		
		CAANMsg kk0081Cur = new JKKejbKK0081DBABase().findByCurrent(kk0081CurCond);
		if (null == kk0081Cur)
		{
			// サービス契約のカレントレコードが存在しない場合、falseを返却
			return false;
		}
		
		String prcGrpCd = kk0081Cur.getString(KK0081ETMsg.PRC_GRP_CD);

		// サービス契約の料金グループコードを判定
		if (PRCGRPCD_HOME.equals(prcGrpCd))
		{
			// ホームタイプの場合
			maxValue = getWorkParamSetteValue(WORKID_MAX_HOME);
		}
		else if (PRCGRPCD_MEZON.equals(prcGrpCd))
		{
			// メゾンタイプの場合
			maxValue = getWorkParamSetteValue(WORKID_MAX_MEZON);
		}
		else if (PRCGRPCD_MANS.equals(prcGrpCd))
		{
			// マンションタイプの場合
			maxValue = getWorkParamSetteValue(WORKID_MAX_MANS);
		}
		else
		{
			// 料金グループコードが対象外の場合、falseを返却
			return false;
		}
		
		// 上限値との比較用に、キャンセル済と解約済以外のサービス契約番号に紐付くオプションサービス契約を取得
		CAANMsg[] kk0351List = getTargetOpKei(inCBSMsg, inContext, 
								getOpKeiOfSvcKei(inCBSMsg, inContext, svcKeiNo));
		
		// 上記のオプションサービス契約に紐付くメールウィルスチェックのサブオプションサービス契約をカウント
		int cnt = 0;
		for (CAANMsg kk0351Msg : kk0351List)
		{
			cnt += getSbopKeiOfOpKei(inCBSMsg, inContext, kk0351Msg).length;
		}
		
		if (cnt >= maxValue)
		{
			// 割引サービス契約に紐づくＥメール契約件数がファミリーパックＥメール適用数以上の場合、falseを返却
			return false;
		}
		
		return true;
	}
	
	/**
	 * <p>
	 * 業務パラメータマスタの照会を行います(返却値の型:int)。
	 * </p>
	 * @param workParamId　業務パラメータID
	 * @return 業務パラメータ設定値(該当レコードがない場合、0を返却)
	 */
	private int getWorkParamSetteValue(String workParamId)
	{
		CAANMsg zm0321Cond = new CAANMsg(ZM0321ETMsg.class.getName());
		zm0321Cond.set(ZM0321ETMsg.WORK_PARAM_ID, workParamId);
		
		CAANMsg zm0321Msg = new ZM0321LE().findByPrimaryKey(zm0321Cond);
		
		if (null == zm0321Msg)
		{
			// 該当レコードがない場合、0を返却
			return 0;
		}
		
		// 業務パラメータ設定値を返却
		return Integer.parseInt(zm0321Msg.getString(ZM0321ETMsg.WORK_PARAM_SETTE_VALUE));
	}

	/**
	 * <p>
	 * サービス契約番号に紐付くオプションサービスのカレントレコード取得を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo サービス契約番号
	 * @return サービス契約番号に紐付くオプションサービスのカレントレコードのリスト
	 */
	private CAANMsg[] getOpKeiOfSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcKeiNo)
	{
		// サービス契約番号をキーにオプションサービス契約を検索
		CAANMsg kk0351Cond = new CAANMsg(KK0351ETMsg.class.getName());
		kk0351Cond.set(KK0351ETMsg.SVC_KEI_NO, svcKeiNo);
		kk0351Cond.set(KK0351ETMsg.MK_FLG, MKFLG_VALID);
		CAANMsg[] kk0351List = null;
		
		try
		{
			kk0351List = new KK0351LE().findByCondition(kk0351Cond);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		ArrayList<CAANMsg> al = new ArrayList<CAANMsg>();
		HashMap<String, String> hm = new HashMap<String, String>();
		
		for (CAANMsg kk0351Msg : kk0351List)
		{
			
			String opSvcKeiNo = kk0351Msg.getString(KK0351ETMsg.OP_SVC_KEI_NO);
			
			if (!hm.containsKey(opSvcKeiNo))
			{
				// 集約されていないオプションサービス契約番号の場合、ハッシュマップにその番号を設定し後続処理を行う
				hm.put(opSvcKeiNo, null);
				CAANMsg kk0351CurCond = new CAANMsg(KK0351ETMsg.class.getName());
				kk0351CurCond.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
				kk0351CurCond.set(KK0351ETMsg.RSV_APLY_YMD, opeDate);
				
				// オプションサービス契約番号でカレントレコード検索
				CAANMsg kk0351Cur = new JKKejbKK0351DBABase().findByCurrent(kk0351CurCond);

				if (null != kk0351Cur)
				{
					al.add(kk0351Cur);
				}
			}
		}
		
		return al.toArray(new CAANMsg[0]);
	}
	
	/**
	 * <p>
	 * オプションサービス契約のカレントレコードリストのうち以下のレコードの取得を行います。
	 * <li>オプションサービスがEメール</li>
	 * <li>ステータスがキャンセル済、解約済以外</li>
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0351List オプションサービス契約のリスト
	 * @return キャンセル済、解約済以外のオプションサービス契約のレコードリスト
	 */
	private CAANMsg[] getTargetOpKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg[] kk0351List)
	{
		String opCd = null;
		String opStat = null;
		ArrayList<CAANMsg> al = new ArrayList<CAANMsg>();
		for (CAANMsg kk0351Msg : kk0351List)
		{
			opCd = kk0351Msg.getString(KK0351ETMsg.OP_SVC_CD);
			if (!OPCD_EMAIL.equals(opCd))
			{
				// オプションサービス契約のオプションサービスコードがEメール以外の場合、処理をスキップする
				continue;
			}

			opStat = kk0351Msg.getString(KK0351ETMsg.OP_SVC_KEI_STAT);
			if (OPSTAT_CANCELED.equals(opStat)
					|| OPSTAT_DISSOLVED.equals(opStat))
			{
				// オプションサービス契約のステータスがキャンセル済または解約済の場合、処理をスキップする
				continue;
			}
			
			al.add(kk0351Msg);
		}

		return al.toArray(new CAANMsg[0]);
	}
	
	/**
	 * <p>
	 * オプションサービスに紐付くサブオプションサービスのカレントレコードのうち、
	 * メールウィルスチェックのサブオプションサービス契約の取得を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0351Msg オプションサービス契約
	 * @return オプションサービス契約に紐付くサブオプションサービス契約のカレントレコードのうち、
	 * 			メールウィルスチェックのサブオプションサービス契約のリスト
	 */
	private CAANMsg[] getSbopKeiOfOpKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0351Msg)
	{
		ArrayList<CAANMsg> al = new ArrayList<CAANMsg>();
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		String opSvcKeiNo = kk0351Msg.getString(KK0351ETMsg.OP_SVC_KEI_NO);
		
		// オプションサービス契約番号をキーにサブオプションサービス契約を検索
		CAANMsg kk0401Cond = new CAANMsg(KK0401ETMsg.class.getName());
		kk0401Cond.set(KK0401ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		kk0401Cond.set(KK0401ETMsg.MK_FLG, MKFLG_VALID);
		CAANMsg[] kk0401List = null;
		
		try
		{
			kk0401List = new KK0401LE().findByCondition(kk0401Cond);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		HashMap<String, String> hm = new HashMap<String, String>();

		for (CAANMsg kk0401Msg : kk0401List)
		{
			String sbopSvcKeiNo = kk0401Msg.getString(KK0401ETMsg.SBOP_SVC_KEI_NO);
			
			if (!hm.containsKey(sbopSvcKeiNo))
			{
				// 集約されていないサブオプションサービス契約番号の場合、ハッシュマップにその番号を設定し後続処理を行う
				hm.put(sbopSvcKeiNo, null);
				CAANMsg kk0401CurCond = new CAANMsg(KK0401ETMsg.class.getName());
				kk0401CurCond.set(KK0401ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
				kk0401CurCond.set(KK0401ETMsg.SBOP_SVC_KEI_NO, sbopSvcKeiNo);
				kk0401CurCond.set(KK0401ETMsg.RSV_APLY_YMD, opeDate);
				
				// サブオプションサービス契約をカレントレコード検索
				CAANMsg kk0401Cur = new JKKejbKK0401DBABase().findByCurrent(kk0401CurCond);
				
				if (null == kk0401Cur)
				{
					// カレントレコードがない場合、処理をスキップする
					continue;
				}
				
				String sbopSvcCd = kk0401Cur.getString(KK0401ETMsg.SBOP_SVC_CD);
				if (!SBOPCD_VIRUSCHK.equals(sbopSvcCd))
				{
					// サブオプションサービスコードが「メールウィルスチェック」以外の場合、処理をスキップする
					continue;
				}

				// サブオプションサービス契約ステータスが「解約済」または「キャンセル済」の場合は処理をスキップする
				if (JKKModelConst.SVC_KEI_STAT_DSL_ZM.equals(kk0401Cur.getString(KK0401ETMsg.SBOP_SVC_KEI_STAT))
						|| JKKModelConst.SVC_KEI_STAT_CNCL_ZM.equals(kk0401Cur.getString(KK0401ETMsg.SBOP_SVC_KEI_STAT)))
				{
					continue;
				}
				
				// メールウィルスチェックのサブオプションサービス契約をリストに追加
				al.add(kk0401Cur);
			}
		}
		
		return al.toArray(new CAANMsg[0]);
	}
	
	/**
	 * <p>
	 * オプションサービス契約<ISP>登録メールウィルスチェック登録処理を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0351Msg オプションサービス契約
	 * @return メールウィルスチェックのサブオプションサービス契約を登録する対象である場合true、
	 * 			それ以外の場合falseを返却
	*/
	private boolean isInsTarget(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0351Msg)
	{
		CAANMsg[] kk0401List = getSbopKeiOfOpKei(inCBSMsg, inContext, kk0351Msg);
		if (0 != kk0401List.length)
		{
			// すでにメールウィルスチェックのサブオプションサービス契約が存在する場合、falseを返却
			return false;
		}
		
		return true;
	}
	
	/**
	 * <p>
	 * メールウィルスチェック登録の共通項目設定を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0401Info 共通項目を設定するサブオプションサービス契約ETメッセージ
	 */
	private void setCommonItemMailVirusChk(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0401Info)
	{
		kk0401Info.set(KK0401ETMsg.GENE_ADD_DTM, JKKModelCommon.getTransferGeneAddDtm(inCBSMsg, inContext));
		kk0401Info.set(KK0401ETMsg.SBOP_SVC_CD, SBOPCD_VIRUSCHK);
		kk0401Info.set(KK0401ETMsg.PCRS_CD, PCRSCD_VIRUSCHK);
		kk0401Info.set(KK0401ETMsg.PPLAN_CD, PPLANCD_VIRUSCHK_FIXED);
		kk0401Info.set(KK0401ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));
		kk0401Info.set(KK0401ETMsg.RSV_APLY_CD, RSVCD_DECIDED);
		kk0401Info.set(KK0401ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		kk0401Info.set(KK0401ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		kk0401Info.set(KK0401ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		kk0401Info.set(KK0401ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		kk0401Info.set(KK0401ETMsg.MK_FLG, MKFLG_VALID);
	}
	
	/**
	 * <p>
	 * サブオプションサービス契約の登録内容(割引サービス契約内訳登録)の設定を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0401Info 個別項目を設定するサブオプションサービス契約ETメッセージ
	 * @param kk0351Msg オプションサービス契約ETメッセージ
	 * @param wrbSvcKeiNo 割引サービス契約番号
	 * @param optSvcKeiNo オプションサービス契約番号
	 */
	private void setKK0401OfWari(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0401Info, CAANMsg kk0351Msg,
			String wrbSvcKeiNo, String optSvcKeiNo)
	{
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		String status = kk0351Msg.getString(KK0351ETMsg.OP_SVC_KEI_STAT);
		
		kk0401Info.set(KK0401ETMsg.OP_SVC_KEI_NO, kk0351Msg.getString(KK0351ETMsg.OP_SVC_KEI_NO));
		kk0401Info.set(KK0401ETMsg.SBOP_SVC_KEI_NO, JKKModelCommon.getFormatedNextSeq(SEQ_SBOP_SVC_KEI_NO, "", SEQUENCE_LENGTH));
		kk0401Info.set(KK0401ETMsg.SBOP_SVC_KEI_STAT, status);
		kk0401Info.set(KK0401ETMsg.MSKM_DTL_NO, inCBSMsg.getString(EKK0451D010CBSMsg.MSKM_DTL_NO));
		kk0401Info.set(KK0401ETMsg.IDO_DIV, inCBSMsg.getString(EKK0451D010CBSMsg.IDO_DIV));
		
		
		if (isShosaStatus(status))
		{
			// オプションサービス契約ステータスが"受付済"以外の場合
			kk0401Info.set(KK0401ETMsg.SHOSA_YMD, opeDate);
		}
		
		if (isTeiketsuStatus(status))
		{
			// オプションサービス契約ステータスが"受付済""照査済""キャンセル済"以外の場合
			kk0401Info.set(KK0401ETMsg.KEI_CNC_YMD, opeDate);
		}
		
		if (isTekyochuStatus(status))
		{
			// ﾌｧﾐﾊﾟ契約に伴うウイルスチェックのサブオプ契約は即時。現時点でサブオプ開始日、課金開始日の
			// ルールで即時/翌月は参照せず。
			String sokutekiFlg = SOKUJIYOKUGETU_FLG_SOKKETU;
			
			// 割引サービス契約に紐付く申込の申込受付年月日時分秒を取得し、年月日形式に変換
			// 申込明細のカレントレコードを取得
			CAANMsg kk0021Cur = getCurMskmDtl(inCBSMsg, inContext, inCBSMsg.getString(EKK0451D010CBSMsg.MSKM_DTL_NO));
			
			String mskmNo = kk0021Cur.getString(KK0021ETMsg.MSKM_NO);
			// 申込明細の申込年月日を取得
			String mskmYmd = kk0021Cur.getString(KK0021ETMsg.MSKM_YMD);

			// 申込のカレントレコードを取得
			CAANMsg kk0011Cur = getCurMskm(inCBSMsg, inContext, mskmNo);
			String mskmUkDtm = kk0011Cur.getString(KK0011ETMsg.MSKM_UK_DTM);
			String mskmUkYmd = JKKModelCommon.toYmdFromDtm(mskmUkDtm);

			// サービス開始日を取得
			String statYmd = execSokanOfStaYmd(inCBSMsg, inContext, optSvcKeiNo, wrbSvcKeiNo, sokutekiFlg, mskmUkYmd, mskmYmd);
			
			if (null == statYmd)
			{
				// 開始日を取得しなかった場合、関連チェックエラー
				setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SBOP_START_DECIDED_ERR);
				return;
			}

			// 課金開始年月日を取得
			String chargYmd = execSokanOfChrgStaYmd(inCBSMsg, inContext, optSvcKeiNo, sokutekiFlg, statYmd, mskmYmd);

			if (null == chargYmd)
			{
				// 課金開始日を取得しなかった場合、関連チェックエラー
				setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SBOP_START_DECIDED_ERR);
				return;
			}
			
			// オプションサービス契約ステータスが"受付済""照査済""締結済""キャンセル済"以外の場合
			kk0401Info.set(KK0401ETMsg.PLAN_STAYMD, statYmd);
			kk0401Info.set(KK0401ETMsg.PLAN_ENDYMD, kk0351Msg.getString(KK0351ETMsg.PLAN_ENDYMD));
			kk0401Info.set(KK0401ETMsg.PLAN_CHRG_STAYMD, chargYmd);
			kk0401Info.set(KK0401ETMsg.PLAN_CHRG_ENDYMD, kk0351Msg.getString(KK0351ETMsg.PLAN_CHRG_ENDYMD));
			kk0401Info.set(KK0401ETMsg.SVC_STAYMD, statYmd);
			kk0401Info.set(KK0401ETMsg.SVC_CHRG_STAYMD, chargYmd);
			kk0401Info.set(KK0401ETMsg.SVC_ENDYMD, kk0351Msg.getString(KK0351ETMsg.SVC_ENDYMD));
			kk0401Info.set(KK0401ETMsg.SVC_CHRG_ENDYMD, kk0351Msg.getString(KK0351ETMsg.SVC_CHRG_ENDYMD));
		}
		
		if (isCancelStatus(status))
		{
			// オプションサービス契約ステータスが"キャンセル済"の場合
			kk0401Info.set(KK0401ETMsg.SVC_CANCEL_YMD, opeDate);
		}
		
		if (isStopStatus(status))
		{
			// オプションサービス契約ステータスが"停止中"の場合
			kk0401Info.set(KK0401ETMsg.SVC_STP_YMD, opeDate);
		}
		
		if (isPauseStatus(status))
		{
			// オプションサービス契約ステータスが"休止中・中断中"の場合
			kk0401Info.set(KK0401ETMsg.PAUSE_STP_CD, kk0351Msg.getString(KK0351ETMsg.PAUSE_STP_CD));
			kk0401Info.set(KK0401ETMsg.SVC_PAUSE_YMD, opeDate);
		}
		
		if (isDissolveStatus(status))
		{
			// オプションサービス契約ステータスが"解約済"
			kk0401Info.set(KK0401ETMsg.SVC_DSL_YMD, kk0351Msg.getString(KK0351ETMsg.OP_SVC_KEI_NO));
		}
	}
	
	/**
	 * <p>
	 * オプションサービス契約ステータスが"受付済"以外かどうかを判定します。
	 * </p>
	 * @param status オプションサービス契約ステータス
	 * @return オプションサービス契約ステータスが"受付済"以外の場合true、それ以外の場合falseを返却
	 */
	private boolean isShosaStatus(String status)
	{
		if (OPSTAT_ACCEPTED.equals(status))
		{
			return false;
		}
		
		return true;
	}
	
	/**
	 * <p>
	 * オプションサービス契約ステータスが"受付済""照査済""キャンセル済"以外かどうかを判定します。
	 * </p>
	 * @param status オプションサービス契約ステータス
	 * @return オプションサービス契約ステータスが"受付済""照査済""キャンセル済"以外の場合true、それ以外の場合falseを返却
	 */
	private boolean isTeiketsuStatus(String status)
	{
		if (OPSTAT_ACCEPTED.equals(status))
		{
			return false;
		}
		
		if (OPSTAT_VERIFIED.equals(status))
		{
			return false;
		}
		
		if (OPSTAT_CANCELED.equals(status))
		{
			return false;
		}
		
		return true;
	}
	
	/**
	 * <p>
	 * オプションサービス契約ステータスが"受付済""照査済""締結済""キャンセル済"以外かどうかを判定します。
	 * </p>
	 * @param status オプションサービス契約ステータス
	 * @return オプションサービス契約ステータスが"受付済""照査済""締結済""キャンセル済"以外の場合true、それ以外の場合falseを返却
	 */
	private boolean isTekyochuStatus(String status)
	{
		if (OPSTAT_ACCEPTED.equals(status))
		{
			return false;
		}
		
		if (OPSTAT_VERIFIED.equals(status))
		{
			return false;
		}
		
		if (OPSTAT_CONCLUDED.equals(status))
		{
			return false;
		}
		
		if (OPSTAT_CANCELED.equals(status))
		{
			return false;
		}
		
		return true;
	}
	
	/**
	 * <p>
	 * オプションサービス契約ステータスが"キャンセル済"かどうかを判定します。
	 * </p>
	 * @param status オプションサービス契約ステータス
	 * @return オプションサービス契約ステータスが"キャンセル済"の場合true、それ以外の場合falseを返却
	 */
	private boolean isCancelStatus(String status)
	{
		if (!OPSTAT_CANCELED.equals(status))
		{
			return false;
		}
		
		return true;
	}
	
	/**
	 * <p>
	 * オプションサービス契約ステータスが"停止中"かどうかを判定します。
	 * </p>
	 * @param status オプションサービス契約ステータス
	 * @return オプションサービス契約ステータスが"停止中"の場合true、それ以外の場合falseを返却
	 */
	private boolean isStopStatus(String status)
	{
		if (!OPSTAT_STOPPING.equals(status))
		{
			return false;
		}
		
		return true;
	}
	
	/**
	 * <p>
	 * オプションサービス契約ステータスが"休止中・中断中"かどうかを判定します。
	 * </p>
	 * @param status オプションサービス契約ステータス
	 * @return オプションサービス契約ステータスが"休止中・中断中"の場合true、それ以外の場合falseを返却
	 */
	private boolean isPauseStatus(String status)
	{
		if (!OPSTAT_PAUSING.equals(status))
		{
			return false;
		}
		
		return true;
	}
	
	/**
	 * <p>
	 * オプションサービス契約ステータスが"解約済"かどうかを判定します。
	 * </p>
	 * @param status オプションサービス契約ステータス
	 * @return オプションサービス契約ステータスが"解約済"の場合true、それ以外の場合falseを返却
	 */
	private boolean isDissolveStatus(String status)
	{
		if (!OPSTAT_DISSOLVED.equals(status))
		{
			return false;
		}
		
		return true;
	}

	/**
	 * <p>
	 * 登録内容を用いてサブオプションサービス契約明細(割引サービス契約内訳登録)の出力項目を設定します。
	 * </p>
	 * @param kk0401Info サブオプションサービス契約の登録内容ETメッセージ
	 * @return サブオプションサービス契約明細
	 */
	private CAANMsg setOutItemOfWari(CAANMsg kk0401Info)
	{
		CAANMsg sbopMsgList = new CAANMsg(EKK0451D010CBSMsg2List.class.getName());
		sbopMsgList.set(EKK0451D010CBSMsg2List.FP_OP_SVC_KEI_NO, kk0401Info.getString(KK0401ETMsg.OP_SVC_KEI_NO));
		sbopMsgList.set(EKK0451D010CBSMsg2List.FP_SBOP_SVC_KEI_NO, kk0401Info.getString(KK0401ETMsg.SBOP_SVC_KEI_NO));
		sbopMsgList.set(EKK0451D010CBSMsg2List.FP_KK0401_GENE_ADD_DTM, kk0401Info.getString(KK0401ETMsg.GENE_ADD_DTM));
		sbopMsgList.set(EKK0451D010CBSMsg2List.FP_KK0401_UPD_DTM, kk0401Info.getString(KK0401ETMsg.UPD_DTM));
		
		return sbopMsgList;
	}

	/**
	 * <p>
	 * 登録内容を用いて割引サービス契約内訳明細の出力項目を設定します。
	 * </p>
	 * @param kk2361Info 割引サービス契約内訳の登録内容ETメッセージ
	 * @return 割引サービス契約内訳明細
	 */
	private CAANMsg setOutKK2361(CAANMsg kk2361Info)
	{
		CAANMsg kk2361MsgList = new CAANMsg(EKK0451D010CBSMsg3List.class.getName());
		kk2361MsgList.set(EKK0451D010CBSMsg3List.KK2361_WRIB_SVC_KEI_NO, kk2361Info.getString(KK2361ETMsg.WRIB_SVC_KEI_NO));
		kk2361MsgList.set(EKK0451D010CBSMsg3List.KK2361_WRIB_SVC_KEI_UCWK_NO, kk2361Info.getString(KK2361ETMsg.WRIB_SVC_KEI_UCWK_NO));
		kk2361MsgList.set(EKK0451D010CBSMsg3List.KK2361_GENE_ADD_DTM, kk2361Info.getString(KK2361ETMsg.GENE_ADD_DTM));
		kk2361MsgList.set(EKK0451D010CBSMsg3List.KK2361_WRIB_SVC_KEI_UCWK_STAT, kk2361Info.getString(KK2361ETMsg.WRIB_SVC_KEI_UCWK_STAT));
		kk2361MsgList.set(EKK0451D010CBSMsg3List.KK2361_WRIB_SVC_DTL_CD, kk2361Info.getString(KK2361ETMsg.WRIB_SVC_DTL_CD));
		kk2361MsgList.set(EKK0451D010CBSMsg3List.KK2361_WRIB_APLY_CNT, kk2361Info.getString(KK2361ETMsg.WRIB_APLY_CNT));
		kk2361MsgList.set(EKK0451D010CBSMsg3List.KK2361_CHRG_STA_YMD_HOSEI_UM, kk2361Info.getString(KK2361ETMsg.CHRG_STA_YMD_HOSEI_UM));
		
		return kk2361MsgList;
	}
	
	/**
	 * 割引サービス契約解約に伴い、割引サービス契約内訳の課金終了日の更新を行います。
	 * 
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void wariSvKeiKaiyaku(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		String wribSvcKeiNo = inCBSMsg.getString(EKK0451C020CBSMsg.WRIB_SVC_KEI_NO); // 割引サービス契約番号

		// 割引サービス契約番号で一覧検索を行います
		CAANMsg inETMsgForCondition2361 = new CAANMsg(KK2361ETMsg.class.getName());
		inETMsgForCondition2361.set(KK2361ETMsg.WRIB_SVC_KEI_NO, wribSvcKeiNo);
		inETMsgForCondition2361.set(KK2361ETMsg.MK_FLG, MKFLG_VALID);
		KK2361LE le2361 = new KK2361LE();
		CAANMsg[] retConditionETMsg2361 = null;
		
		try
		{
			retConditionETMsg2361 = le2361.findByCondition(inETMsgForCondition2361);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}
		
		// 運用日付の取得
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		
		// 割引解約キャンセル契機コードが未入力の場合
		if (inCBSMsg.isNull(EKK0451C020CBSMsg.WRIB_DSL_CNCL_OPTY_CD))
		{
			throw new JKKejbBusinessException("割引解約キャンセル契機コードが未設定です。割引サービス契約番号 = [" + wribSvcKeiNo + " ]");
		}

		// 割引解約キャンセル契機コードを取得する
		String wribDslCnclOptyCd = inCBSMsg.getString(EKK0451C020CBSMsg.WRIB_DSL_CNCL_OPTY_CD);

		// 料金スケジュール定義より料金計算日を元に請求年月を取得する
		JKKejbOtherSysDBABase jodba = new JKKejbOtherSysDBABase();
		String seikyuYm = jodba.getCH0501ByEventYmd(opeDate, AFTER_LATEST_SEIKYU_YM);

		// 請求年月が取得できなかった場合
		if (seikyuYm == null || seikyuYm.isEmpty())
		{
			throw new JKKejbBusinessException("料金スケジュール定義より請求年月が取得できませんでした。割引サービス契約番号 = [" + wribSvcKeiNo + " ]");
		}
		
		// 請求年月の前月末日を作る
		String seikyuYmd = seikyuYm.concat(SUFFIX);
		String seikyuYmdLastDay = JPCDateUtil.addDay(seikyuYmd, -1);
		
		String retWribSvcKeiUcwkNo = null;
		CAANMsg inETMsgForCurrent2361 = new CAANMsg(KK2361ETMsg.class.getName());
		CAANMsg inETMsgForCurrent2371 = new CAANMsg(KK2371ETMsg.class.getName());
		
		// 割引サービス契約内訳番号格納用マップ
		HashMap<String, String> escapeMap = new HashMap<String, String>();

		// 一覧の結果を検索します
		for (int i = 0; i < retConditionETMsg2361.length; i++)
		{
			String svcChrgEndYmd = null;
			retWribSvcKeiUcwkNo = retConditionETMsg2361[i].getString(KK2361ETMsg.WRIB_SVC_KEI_UCWK_NO);
			
			if (escapeMap.containsKey(retWribSvcKeiUcwkNo))
			{
				// 既に検索済みの場合
				continue;
			}
			// 割引サービス契約内訳番号を格納します
			escapeMap.put(retWribSvcKeiUcwkNo, retWribSvcKeiUcwkNo);
			
			// 一覧結果の割引サービス契約内訳番号でカレント検索を行います
			inETMsgForCurrent2361.set(KK2361ETMsg.WRIB_SVC_KEI_NO, wribSvcKeiNo);
			inETMsgForCurrent2361.set(KK2361ETMsg.WRIB_SVC_KEI_UCWK_NO, retWribSvcKeiUcwkNo);
			CAANMsg retCurrentETMsg2361 = new JKKejbKK2361DBABase().findByCurrent(inETMsgForCurrent2361);

			if (null == retCurrentETMsg2361)
			{
				// カレントレコードが存在しない場合
				continue;
			}

			// 適用済割引サービス契約取消の場合は入力のサービス課金終了年月日を設定する
			if ("EKK0451C230".equals(inCBSMsg.getString(JCMConstants.TEMPLATE_ID_KEY)))
			{
				setETMsgKaiyaku(inCBSMsg, inContext, retCurrentETMsg2361, inCBSMsg.getString(EKK0451C230CBSMsg.SVC_CHRG_ENDYMD));
				// 割引サービス契約内訳の更新（更新）
				updateWrbiSvcKeiUcwk2(inCBSMsg, retCurrentETMsg2361);

				continue;
			}

			// 割引サービス契約内訳のステータスが"登録済"の場合
			if (WRIBSVCKEIUCWKSTAT_ADDZUMI.equals(retCurrentETMsg2361.getString(KK2361ETMsg.WRIB_SVC_KEI_UCWK_STAT)))
			{
				// 割引サービス契約内訳のサービス課金終了年月日が未設定の場合、サービス課金開始年月日・サービス課金終了年月日は未設定とする。
				if (!retCurrentETMsg2361.isNull(KK2361ETMsg.SVC_CHRG_ENDYMD))
				{
					// 割引サービス契約内訳のサービス課金終了年月日 ＜ 運用日付の場合
					if (JKKModelCommon.isPastDate(retCurrentETMsg2361.getString(KK2361ETMsg.SVC_CHRG_ENDYMD), JKKModelCommon.getOpeDate(inCBSMsg), "0"))
					{
						// カレントのサービス課金終了年月日を設定する
						svcChrgEndYmd = retCurrentETMsg2361.getString(KK2361ETMsg.SVC_CHRG_ENDYMD);
					}
					else
					{
						// サービス課金終了年月日算出フラグが"0"の場合、入力のサービス課金終了年月日を設定する
						if ("0".equals(inCBSMsg.getString(EKK0451C020CBSMsg.SVC_CHRG_ENDYMD_FLG)))
						{
							svcChrgEndYmd = inCBSMsg.getString(EKK0451C020CBSMsg.SVC_CHRG_ENDYMD);
						}
						// サービス課金終了年月日算出フラグが"1"の場合、入力のサービス課金終了年月日を算出し設定する				
						else if ("1".equals(inCBSMsg.getString(EKK0451C020CBSMsg.SVC_CHRG_ENDYMD_FLG)))
						{
							String wribSvcDtlCd = retCurrentETMsg2361.getString(KK2361ETMsg.WRIB_SVC_DTL_CD);

							// 割引サービス詳細コードでカレント検索を行います
							inETMsgForCurrent2371.set(KK2371ETMsg.WRIB_SVC_DTL_CD, wribSvcDtlCd);
							CAANMsg retCurrentETMsg2371 = new JKKejbKK2371DBABase().findByCurrent(inETMsgForCurrent2371);

							// サービス課金終了年月日設定パターンコードによってサービス課金終了年月日の形式を変換する
							try
							{
								// 入力のサービス課金終了年月日をベースにサービス課金終了日を編集する
								svcChrgEndYmd = this.getSvcChrgEndYmd(retCurrentETMsg2371, inCBSMsg.getString(EKK0451C020CBSMsg.SVC_CHRG_ENDYMD),
										wribDslCnclOptyCd, seikyuYmdLastDay);
							}
							catch (ParseException ex)
							{
								throw new CAANRuntimeException(ex);
							}
						}
					}
				}

				setETMsgKaiyaku(inCBSMsg, inContext, retCurrentETMsg2361, svcChrgEndYmd);
				// 割引サービス契約内訳の更新（登録）
				updateWrbiSvcKeiUcwk(inCBSMsg, retCurrentETMsg2361);
			}
			else
			{
				// 割引サービス契約内訳のステータスが"登録済"以外の場合は何もしない
				continue;
			}
		}
	}
	
	/**
	 * 割引サービス契約回復に伴い、割引サービス契約内訳の課金終了日の更新を行います。
	 * 
	 * @param inCBSMsg  処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void creWribSvcKeiUcwkRecovery(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		String wribSvcKeiNo = inCBSMsg.getString(EKK0451C050CBSMsg.WRIB_SVC_KEI_NO); // 割引サービス契約番号

		// 割引サービス契約番号で一覧検索を行います
		CAANMsg inETMsgForCondition2361 = new CAANMsg(KK2361ETMsg.class.getName());
		inETMsgForCondition2361.set(KK2361ETMsg.WRIB_SVC_KEI_NO, wribSvcKeiNo);
		inETMsgForCondition2361.set(KK2361ETMsg.MK_FLG, MKFLG_VALID);
		KK2361LE le2361 = new KK2361LE();
		CAANMsg[] retConditionETMsg2361 = null;
		
		try
		{
			retConditionETMsg2361 = le2361.findByCondition(inETMsgForCondition2361);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}
		
		String retWribSvcKeiUcwkNo = null;
		CAANMsg inETMsgForCurrent2361 = new CAANMsg(KK2361ETMsg.class.getName());
		
		// 割引サービス契約内訳番号格納用マップ
		HashMap<String, String> escapeMap = new HashMap<String, String>();
		String svcChrgEndYmd = null;

		// 一覧の結果を検索します
		for (int i = 0; i < retConditionETMsg2361.length; i++)
		{
			retWribSvcKeiUcwkNo = retConditionETMsg2361[i].getString(KK2361ETMsg.WRIB_SVC_KEI_UCWK_NO);
			
			if (escapeMap.containsKey(retWribSvcKeiUcwkNo))
			{
				// 既に検索済みの場合
				continue;
			}
			// 割引サービス契約内訳番号を格納します
			escapeMap.put(retWribSvcKeiUcwkNo, retWribSvcKeiUcwkNo);
			
			// 一覧結果の割引サービス契約内訳番号でカレント検索を行います
			inETMsgForCurrent2361.set(KK2361ETMsg.WRIB_SVC_KEI_NO, wribSvcKeiNo);
			inETMsgForCurrent2361.set(KK2361ETMsg.WRIB_SVC_KEI_UCWK_NO, retWribSvcKeiUcwkNo);
			CAANMsg retCurrentETMsg2361 = new JKKejbKK2361DBABase().findByCurrent(inETMsgForCurrent2361);

			if (null == retCurrentETMsg2361)
			{
				// カレントレコードが存在しない場合
				continue;
			}

			// 割引サービス契約内訳のステータスが"解約済"の場合
			if (WRIBSVCKEIUCWKSTAT_KAUYAKUZUMI.equals(retCurrentETMsg2361.getString(KK2361ETMsg.WRIB_SVC_KEI_UCWK_STAT)))
			{
				// サービス課金終了年月日を取得します
				svcChrgEndYmd = this.getSvcChrgStaYmd(inCBSMsg, inContext, wribSvcKeiNo, retWribSvcKeiUcwkNo);

				setETMsgRecovery(inCBSMsg, inContext, retCurrentETMsg2361, svcChrgEndYmd);
				// 割引サービス契約内訳の更新
				updateWrbiSvcKeiUcwk(inCBSMsg, retCurrentETMsg2361);
			}
			else
			{
				// 割引サービス契約内訳のステータスが"解約済"以外の場合は何もしない
				continue;
			}
		}
	}
	
	/**
	 * <p>
	 * サービス課金終了年月日設定パターンコード別にサービス課金終了年月日を算出する
	 * </p>
	 * @param kk2371ETMsg 割引サービス詳細
	 * @param baseYmd     サービス課金終了年月日
	 * @param wribDslCnclOptyCd 割引解約キャンセル契機コード
	 * @param seikyuYmd 料金スケジュールから算出した請求年月の前月末日
	 * @return　サービス課金終了年月日
	 * @throws ParseException 月の加減算処理にて、例外が発生した場合
	 */
	private String getSvcChrgEndYmd(CAANMsg kk2371ETMsg, String baseYmd, String wribDslCnclOptyCd, String seikyuYmd) throws ParseException
	{

		// サービス課金終了年月日設定パターンコードがnullの場合と割引サービス詳細コードに紐づくデータが
		// 割引サービス詳細に存在しない場合
		if (kk2371ETMsg == null || kk2371ETMsg.isNull(KK2371ETMsg.WRIB_SVC_DTL_CD))
		{
			return null; 
		}

		String retChgYmd = null;

		// サービス課金終了年月日設定パターンコードを取得する
		String svcChrgEndymdSetptnCd = kk2371ETMsg.getString(KK2371ETMsg.SVC_CHRG_ENDYMD_SETPTN_CD);

		// 	サービス課金終了年月日設定パターンコードが"解約月末日"の場合
		if (CD01515_KAIYAKUDUKI_MATUJITU.equals(svcChrgEndymdSetptnCd))
		{
			String ym = baseYmd.substring(0, 6);
			String lastDay = JPCDateUtil.getEndOfMonth(ym);
			retChgYmd = ym.concat(lastDay);
		}

		// サービス課金終了年月日設定パターンコードが"解約前月末日"の場合
		if (CD01515_KAIYAKUZENNGETU_MATUJITU.equals(svcChrgEndymdSetptnCd))
		{
			String beforeYm = JPCDateUtil.addMonth(baseYmd, -1).substring(0, 6);
			String lastDay = JPCDateUtil.getEndOfMonth(beforeYm);
			retChgYmd = beforeYm.concat(lastDay);
		}

		// サービス課金終了年月日設定パターンコードが"解約日当日"の場合
		if (CD01515_KAIYAKUBI_TOUJITU.equals(svcChrgEndymdSetptnCd))
		{
			// ﾍﾞｰｽとなるサービス課金終了年月日を設定する
			retChgYmd = baseYmd;
		}
		
		// サービス課金終了年月日設定パターンコードが"CP解約日"の場合
		if (CD01515_CP_KAIYAKU_DAY.equals(svcChrgEndymdSetptnCd))
		{
			// 「割引解約キャンセル契機コード」が「1:自動設定」の場合
			if (WRIB_DSL_CNCL_OPTY_CD_AUTO.equals(wribDslCnclOptyCd))
			{
				String ym = baseYmd.substring(0, 6);
				String lastDay = JPCDateUtil.getEndOfMonth(ym);
				retChgYmd = ym.concat(lastDay);
			}
			// 「割引解約キャンセル契機コード」が「2:手動設定」の場合
			else if (WRIB_DSL_CNCL_OPTY_CD_MANUAL.equals(wribDslCnclOptyCd))
			{
				// 請求年月前月末日を設定する
				retChgYmd = seikyuYmd;
			}
		}
		return retChgYmd;
	}
	
	/**
	 * 割引サービス契約課金開始日変更に伴い、割引サービス契約内訳の課金開始日の更新を行います。
	 * 
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcChrgStaYmd サービス課金開始年月日
	 */
	public void wariSvKeiKknStymdChg(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcChrgStaYmd)
	{
		
		String wribSvcKeiNo = inCBSMsg.getString(EKK0451C170CBSMsg.WRIB_SVC_KEI_NO); // 割引サービス契約番号

		// 割引サービス契約番号で一覧検索を行います
		CAANMsg inETMsgForCondition2361 = new CAANMsg(KK2361ETMsg.class.getName());
		inETMsgForCondition2361.set(KK2361ETMsg.WRIB_SVC_KEI_NO, wribSvcKeiNo);
		inETMsgForCondition2361.set(KK2361ETMsg.MK_FLG, MKFLG_VALID);
		KK2361LE le2361 = new KK2361LE();
		CAANMsg[] retConditionETMsg2361 = null;
		
		try
		{
			retConditionETMsg2361 = le2361.findByCondition(inETMsgForCondition2361);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}
		
		String retWribSvcKeiUcwkNo = null;
		CAANMsg inETMsgForCurrent2361 = new CAANMsg(KK2361ETMsg.class.getName());
		
		// 割引サービス契約内訳番号格納用マップ
		HashMap<String, String> escapeMap = new HashMap<String, String>();

		// 一覧の結果を検索します
		for (int i = 0; i < retConditionETMsg2361.length; i++)
		{
			retWribSvcKeiUcwkNo = retConditionETMsg2361[i].getString(KK2361ETMsg.WRIB_SVC_KEI_UCWK_NO);
			
			if (escapeMap.containsKey(retWribSvcKeiUcwkNo))
			{
				// 既に検索済みの場合
				continue;
			}
			// 割引サービス契約内訳番号を格納します
			escapeMap.put(retWribSvcKeiUcwkNo, retWribSvcKeiUcwkNo);
			
			// 一覧結果の割引サービス契約内訳番号でカレント検索を行います
			inETMsgForCurrent2361.set(KK2361ETMsg.WRIB_SVC_KEI_NO, wribSvcKeiNo);
			inETMsgForCurrent2361.set(KK2361ETMsg.WRIB_SVC_KEI_UCWK_NO, retWribSvcKeiUcwkNo);
			CAANMsg retCurrentETMsg2361 = findByCurrent(inETMsgForCurrent2361);

			if (null == retCurrentETMsg2361)
			{
				// カレントレコードが存在しない場合
				continue;
			}

			// 割引サービス契約内訳の更新
			setETMsgKknStymdChg(inCBSMsg, inContext , retCurrentETMsg2361, svcChrgStaYmd);
			updateWrbiSvcKeiUcwk(inCBSMsg, retCurrentETMsg2361);
		}
	}

	/**
	 * 割引サービス契約解約時の割引サービス契約内訳更新用のETMsgを作成します。
	 * 
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param currentETMsg2361 割引サービス契約内訳のカレント検索結果ETMsg
	 * @param svcChrgEndYmd サービス課金終了年月日
	 */
	private void setETMsgKaiyaku(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg currentETMsg2361, String svcChrgEndYmd)
	{
		// 割引サービス契約内訳更新用のETMsgを作成します
		// 適用済割引サービス契約取消以外の時のみ
		if (!"EKK0451C230".equals(inCBSMsg.getString(JCMConstants.TEMPLATE_ID_KEY)))
		{
			currentETMsg2361.set(KK2361ETMsg.GENE_ADD_DTM, inCBSMsg.getString(EKK0451C020CBSMsg.GENE_ADD_DTM)); // 世代登録年月日時分秒;
		}

		// 割引サービス契約内訳ステータス更新(割引サービス契約解約及び、適用済割引サービス契約取消時のみ)
		if ("EKK0451C020".equals(inCBSMsg.getString(JCMConstants.TEMPLATE_ID_KEY)) ||
				"EKK0451C230".equals(inCBSMsg.getString(JCMConstants.TEMPLATE_ID_KEY)))
		{
			currentETMsg2361.set(KK2361ETMsg.WRIB_SVC_KEI_UCWK_STAT, WRIBSVCKEIUCWKSTAT_KAUYAKUZUMI);

			// サービス課金終了年月日が未設定の場合はサービス課金開始年月日も未設定とする
			if (svcChrgEndYmd == null)
			{
				currentETMsg2361.setNull(KK2361ETMsg.SVC_CHRG_STAYMD);
			}
			else
			{
				currentETMsg2361.set(KK2361ETMsg.SVC_CHRG_STAYMD, inCBSMsg.getString(EKK0451C020CBSMsg.SVC_CHRG_STAYMD)); // サービス課金開始年月日
			}
		}
		
		currentETMsg2361.set(KK2361ETMsg.SVC_CHRG_ENDYMD, svcChrgEndYmd); // サービス課金終了年月日
		// 適用済割引サービス契約取消以外の時のみ
		if (!"EKK0451C230".equals(inCBSMsg.getString(JCMConstants.TEMPLATE_ID_KEY)))
		{
			currentETMsg2361.set(KK2361ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
			currentETMsg2361.set(KK2361ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		}
		currentETMsg2361.set(KK2361ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		currentETMsg2361.set(KK2361ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		currentETMsg2361.setNull(KK2361ETMsg.DEL_DTM);
		currentETMsg2361.setNull(KK2361ETMsg.DEL_OPEACNT);
		currentETMsg2361.set(KK2361ETMsg.MK_FLG, MKFLG_VALID);
	}

	/**
	 * 割引サービス契約回復時の割引サービス契約内訳更新用のETMsgを作成します。
	 * 
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param currentETMsg2361 割引サービス契約内訳のカレント検索結果ETMsg
	 * @param svcChrgEndYmd サービス課金終了年月日
	 */
	private void setETMsgRecovery(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg currentETMsg2361, String svcChrgEndYmd)
	{
		// 割引サービス契約内訳更新用のETMsgを作成します
		currentETMsg2361.set(KK2361ETMsg.GENE_ADD_DTM, inCBSMsg.getString(EKK0451C050CBSMsg.GENE_ADD_DTM)); // 世代登録年月日時分秒
		currentETMsg2361.set(KK2361ETMsg.WRIB_SVC_KEI_UCWK_STAT, WRIBSVCKEIUCWKSTAT_ADDZUMI);
		currentETMsg2361.set(KK2361ETMsg.SVC_CHRG_ENDYMD, svcChrgEndYmd); // サービス課金終了年月日
		currentETMsg2361.set(KK2361ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		currentETMsg2361.set(KK2361ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		currentETMsg2361.set(KK2361ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		currentETMsg2361.set(KK2361ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		currentETMsg2361.setNull(KK2361ETMsg.DEL_DTM);
		currentETMsg2361.setNull(KK2361ETMsg.DEL_OPEACNT);
		currentETMsg2361.set(KK2361ETMsg.MK_FLG, MKFLG_VALID);
	}

	/**
	 * 割引サービス契約課金開始日変更時の割引サービス契約内訳更新用のETMsgを作成します。
	 * 
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param currentETMsg2361 割引サービス契約内訳のカレント検索結果ETMsg
	 * @param svcChrgStaYmd サービス課金開始年月日
	 */
	private void setETMsgKknStymdChg(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg currentETMsg2361, String svcChrgStaYmd)
	{
		// 割引サービス契約内訳更新用のETMsgを作成します
		currentETMsg2361.set(KK2361ETMsg.GENE_ADD_DTM, inCBSMsg.getString(EKK0451C170CBSMsg.GENE_ADD_DTM)); // 世代登録年月日時分秒;
		currentETMsg2361.set(KK2361ETMsg.SVC_CHRG_STAYMD, svcChrgStaYmd); // サービス課金開始年月日
		currentETMsg2361.set(KK2361ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		currentETMsg2361.set(KK2361ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		currentETMsg2361.set(KK2361ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		currentETMsg2361.set(KK2361ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		currentETMsg2361.setNull(KK2361ETMsg.DEL_DTM);
		currentETMsg2361.setNull(KK2361ETMsg.DEL_OPEACNT);
		currentETMsg2361.set(KK2361ETMsg.MK_FLG, MKFLG_VALID);
	}
		
	/**
	 * 割引サービス契約内訳の更新処理を行います。
	 * 
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inETMsg 登録用のETMsg
	 */
	private void updateWrbiSvcKeiUcwk(CAANMsg inCBSMsg, CAANMsg inETMsg)
	{
		String key1 = inCBSMsg.getString(EKK0451C020CBSMsg.WRIB_SVC_KEI_NO);
		String key2 = inETMsg.getString(KK2361ETMsg.WRIB_SVC_KEI_UCWK_NO);
		
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JKKejbKK2361SecProc#updateWrbiSvcKeiUcwk");
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JKKejbKK2361SecProc#wrib_svc_kei_no=" + key1);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JKKejbKK2361SecProc#wrib_svc_kei_ucwk_no=" + key2);
		
		JKKejbDBAUtil dbaUtil = new JKKejbDBAUtil(inCBSMsg);
		dbaUtil.create(inETMsg);
	}
	
	/**
	 * 割引サービス契約内訳の更新処理を行います。
	 * 
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inETMsg 登録用のETMsg
	 */
	private void updateWrbiSvcKeiUcwk2(CAANMsg inCBSMsg, CAANMsg inETMsg)
	{
		String key1 = inCBSMsg.getString(EKK0451C020CBSMsg.WRIB_SVC_KEI_NO);
		String key2 = inETMsg.getString(KK2361ETMsg.WRIB_SVC_KEI_UCWK_NO);
		
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JKKejbKK2361SecProc#updateWrbiSvcKeiUcwk");
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JKKejbKK2361SecProc#wrib_svc_kei_no=" + key1);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JKKejbKK2361SecProc#wrib_svc_kei_ucwk_no=" + key2);
		
		JKKejbDBAUtil dbaUtil = new JKKejbDBAUtil(inCBSMsg);
		dbaUtil.update(inETMsg);
	}

	/**
	 * <p>
	 * 開始日設定(割引サービス契約)相関ルールを実行します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo	オプションサービス契約番号
	 * @param wrbSvcKeiNo	割引サービス契約番号
	 * @param skjYkgt	即時/翌月(01:即時、02:翌月)
	 * @param mskmUkYmd 	申込受付年月日
	 * @param mskmYmd 	申込年月日
	 * @return 相関ルールにより取得した開始日
	 */
	private String execSokanOfStaYmd(CAANMsg inCBSMsg, AgentDispatchContext inContext,
										String opSvcKeiNo, String wrbSvcKeiNo, String skjYkgt, String mskmUkYmd, String mskmYmd)
	{
		// サブオプションサービス契約に紐付くサービス契約のサービスコードを取得
		CAANMsg kk0081Cur = getCurSvcKeiViaOpKei(inCBSMsg, inContext, opSvcKeiNo);
		
		// オプションサービス契約のサービス開始年月日を取得
		CAANMsg kk0351Cur = getCurOpKei(inCBSMsg, inContext, opSvcKeiNo);
		String svcStaYmd = kk0351Cur.getString(KK0351ETMsg.SVC_STAYMD);

		// オプションサービス契約が開始していない場合
		if (svcStaYmd == null)
		{
			// オプションサービス契約に紐付く異動予約の取得
			JKKejbIdoRsvAccess instance = new JKKejbIdoRsvAccess();
			List<CAANMsg> list = instance.getIdoRsvOpSvcKeiNo(opSvcKeiNo, JKKModelCommon.getOpeDate(inCBSMsg));

			for (CAANMsg msg : list)
			{
				// 異動予約詳細コードがオプション開始か判定
				if (IDO_RSV_DTL_OPSTA.equals(msg.getString(KK1681ETMsg.IDO_RSV_DTL_CD)))
				{
					// 異動予約の予約適用年月日を設定
					svcStaYmd = msg.getString(KK1681ETMsg.RSV_APLY_YMD);
				}
			}
		}

		// 割引サービス契約のサービス利用開始希望年月日を取得
		CAANMsg kk0451Cur = getCurWrbSvcKei(inCBSMsg, inContext, wrbSvcKeiNo);
		String svcUseStaKiboYmd = kk0451Cur.getString(KK0451ETMsg.SVC_USE_STA_KIBO_YMD);
		
		// サブオプションサービス契約に紐付くサービス契約のサービス課金開始年月日を取得
		String svcChrgStaymd = kk0081Cur.getString(KK0081ETMsg.SVC_CHRG_STAYMD);
		
		// サブオプションサービス契約に紐付くサービス契約のサービス開始年月日を取得
		String rule0088SvcStaYmd = kk0081Cur.getString(KK0081ETMsg.SVC_STA_YMD);
		
		// サービス契約のサービス開始年月日が未設定の場合
		if (rule0088SvcStaYmd == null)
		{
			// 異動予約より予約適用年月日を取得する
			JKKejbIdoRsvAccess jkIdoAc = new JKKejbIdoRsvAccess();
			List<CAANMsg> kk1681IdoList = jkIdoAc.getIdoRsvSvcKeiNo(kk0081Cur.getString(KK0081ETMsg.SVC_KEI_NO), JKKModelCommon.getOpeDate(inCBSMsg));

			for (CAANMsg msg : kk1681IdoList)
			{
				// 異動予約詳細コードがオプション開始か判定
				if (IDO_RSV_DTL_OPSTA.equals(msg.getString(KK1681ETMsg.IDO_RSV_DTL_CD)))
				{
					// 異動予約の予約適用年月日を設定
					rule0088SvcStaYmd = msg.getString(KK1681ETMsg.RSV_APLY_YMD);
				}
			}
		}

		// 申込期間を取得する
		String mskmPeriod = this.getMskmPeriod(inCBSMsg, mskmYmd, rule0088SvcStaYmd, svcChrgStaymd);
		// 申込期間が未設定または期間未定の場合はnullを返却（関連制約エラーとする）
		if (mskmPeriod == null || "0".equals(mskmPeriod))
		{
			return null;
		}
		
		// 相関ルールのパラメータを設定
		JKKejbRule0076001 rule0076001 = new JKKejbRule0076001(inCBSMsg);
		rule0076001.setSvc_cd(SVC_CD_INTERNET_SRV);
		rule0076001.setSbop_svc_cd(MAIL_VIRUS_CHK);
		rule0076001.setMskm_period(mskmPeriod);
		rule0076001.setSkj_ykjt(skjYkgt);
		rule0076001.setKk0351_svc_sta_ymd(svcStaYmd);
		rule0076001.setKk0011_mskm_uk_ymd(mskmUkYmd);
		rule0076001.setSvc_use_sta_kibo_ymd(svcUseStaKiboYmd);
// ▽▽▽ ANK-3484-00-00 ADD START
		rule0076001.setKk0081_svc_chrg_sta_ymd(svcChrgStaymd);
		rule0076001.setTmcp_mskm_ymd(null); // 端末補償のサブオプションではないため、nullを設定
// △△△ ANK-3484-00-00 ADD END

		// 開始日設定(サブオプションサービス)相関ルールを呼出
		String staYmd = rule0076001.getStaYmd();

		return staYmd;
	}
	
	/**
	 * <p>
	 * 課金開始日設定(割引サービス契約)相関ルールを実行します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo	オプションサービス契約番号
	 * @param skjYkgt	即時/翌月(01:即時、02:翌月)
	 * @param staYmd	開始日設定 相関ルールで算出した開始年月日
	 * @param mskmYmd 	申込年月日
	 * @return 相関ルールにより取得した課金開始日
	 */
	public String execSokanOfChrgStaYmd(CAANMsg inCBSMsg, AgentDispatchContext inContext, String opSvcKeiNo, 
			                              String skjYkgt, String staYmd, String mskmYmd)
	{
		// オプションサービス契約に紐付くサービス契約を取得
		CAANMsg kk0081Cur = getCurSvcKeiViaOpKei(inCBSMsg, inContext, opSvcKeiNo);
		
		// オプションサービス契約に紐付くサービス契約のサービス課金開始年月日を取得
		String svcChrgStaymd = kk0081Cur.getString(KK0081ETMsg.SVC_CHRG_STAYMD);
		
		// オプションサービス契約に紐付くサービス契約のサービス開始年月日を取得
		String rule0088SvcStaYmd = kk0081Cur.getString(KK0081ETMsg.SVC_STA_YMD);
		
		// サービス契約のサービス開始年月日が未設定の場合
		if (rule0088SvcStaYmd == null)
		{
			// 異動予約より予約適用年月日を取得する
			JKKejbIdoRsvAccess jkIdoAc = new JKKejbIdoRsvAccess();
			List<CAANMsg> kk1681IdoList = jkIdoAc.getIdoRsvSvcKeiNo(kk0081Cur.getString(KK0081ETMsg.SVC_KEI_NO), JKKModelCommon.getOpeDate(inCBSMsg));

			for (CAANMsg msg : kk1681IdoList)
			{
				// 異動予約詳細コードがオプション開始か判定
				if (IDO_RSV_DTL_OPSTA.equals(msg.getString(KK1681ETMsg.IDO_RSV_DTL_CD)))
				{
					// 異動予約の予約適用年月日を設定
					rule0088SvcStaYmd = msg.getString(KK1681ETMsg.RSV_APLY_YMD);
				}
			}
		}

		// 申込期間を取得する
		String mskmPeriod = this.getMskmPeriod(inCBSMsg, mskmYmd, rule0088SvcStaYmd, svcChrgStaymd);
		// 申込期間が未設定または期間未定の場合はnullを返却（関連制約エラーとする）
		if (mskmPeriod == null || "0".equals(mskmPeriod))
		{
			return null;
		}
		
		// オプションサービス契約に紐付くサービス契約の料金グループを取得
		String prcGrpCd = kk0081Cur.getString(KK0081ETMsg.PRC_GRP_CD);
		
		JKKejbRule0068001 rule0068001 = new JKKejbRule0068001(inCBSMsg);
		rule0068001.setSvc_cd(SVC_CD_INTERNET_SRV);
		rule0068001.setUpd_type("1"); // 更新契機(開始時)を設定
		rule0068001.setSbop_svc_cd(SBOPCD_VIRUSCHK); // サブオプションサービスコードを設定		
		rule0068001.setPrc_grp_cd(prcGrpCd);
		rule0068001.setMskm_period(mskmPeriod);
		rule0068001.setSvc_sta_ymd(staYmd);
		rule0068001.setBefor_svc_chrg_sta_ymd(svcChrgStaymd);
// ▽▽▽ ANK-3484-00-00 ADD START
		rule0068001.setBefor_svc_chrg_end_ymd(null);	// 引継元の課金終了日はnullを指定
// △△△ ANK-3484-00-00 ADD END
		// 課金開始日設定(サブオプションサービス)相関ルールを呼出
		String chrgStaYmd = rule0068001.getChrgStaYmd();

		return chrgStaYmd;
	}
	
	/**
	 * <p>
	 * オプションサービス契約に紐付くサービス契約のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return オプションサービス契約に紐付くサービス契約のカレントレコード
	 */
	private CAANMsg getCurSvcKeiViaOpKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, String opSvcKeiNo)
	{
		// オプションサービス契約のカレントレコードを取得
		CAANMsg kk0351Cur = getCurOpKei(inCBSMsg, inContext, opSvcKeiNo);

		String svcKeiNo = kk0351Cur.getString(KK0351ETMsg.SVC_KEI_NO);

		if (OYA_KEI_SKBT_SVCKEI_UCWK.equals(kk0351Cur.getString(KK0351ETMsg.OYA_KEI_SKBT_CD)))
		{
			// 親契約がサービス契約内訳の場合
			CAANMsg kk0161Cur = getCurSvcKeiUcwk(inCBSMsg, inContext, kk0351Cur.getString(KK0351ETMsg.SVC_KEI_UCWK_NO));
			svcKeiNo = kk0161Cur.getString(KK0161ETMsg.SVC_KEI_NO);
		}

		
		// サービス契約のカレントレコードを取得
		CAANMsg kk0081Cur = getCurSvcKei(inCBSMsg, inContext, svcKeiNo);
		
		return kk0081Cur;
	}
	
	/**
	 * <p>
	 * サービス契約のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo	サービス契約番号
	 * @return サービス契約のカレントレコード
	 */
	private CAANMsg getCurSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcKeiNo)
	{
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		
		CAANMsg kk0081Cond = new CAANMsg(KK0081ETMsg.class.getName());
		kk0081Cond.set(KK0081ETMsg.SVC_KEI_NO, svcKeiNo);
		kk0081Cond.set(KK0081ETMsg.RSV_APLY_YMD, opeDate);
		
		return new JKKejbKK0081DBABase().findByCurrent(kk0081Cond);
	}
	
	/**
	 * <p>
	 * 割引サービス契約のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param wrbSvcKeiNo 割引サービス契約番号
	 * @return 割引サービス契約番号のカレントレコード
	 */
	private CAANMsg getCurWrbSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, String wrbSvcKeiNo)
	{
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		CAANMsg kk0451Cur = new CAANMsg(KK0451ETMsg.class.getName());
		kk0451Cur.set(KK0451ETMsg.WRIB_SVC_KEI_NO, wrbSvcKeiNo);
		kk0451Cur.set(KK0451ETMsg.RSV_APLY_YMD, opeDate);

		return new JKKejbKK0451DBABase().findByCurrent(kk0451Cur);
	}
	
	/**
	 * <p>
	 * 申込明細のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param mskmDtlNo 申込明細番号
	 * @return 申込明細のカレントレコード
	 */
	private CAANMsg getCurMskmDtl(CAANMsg inCBSMsg, AgentDispatchContext inContext, String mskmDtlNo)
	{
		CAANMsg kk0021Cond = new CAANMsg(KK0021ETMsg.class.getName());
		kk0021Cond.set(KK0021ETMsg.MSKM_DTL_NO, mskmDtlNo);

		return new JKKejbKK0021DBABase().findByCurrent(kk0021Cond);
	}

	/**
	 * <p>
	 * オプションサービス契約のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return オプションサービス契約のカレントレコード
	 */
	private CAANMsg getCurOpKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, String opSvcKeiNo)
	{
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		CAANMsg kk0351Cond = new CAANMsg(KK0351ETMsg.class.getName());
		kk0351Cond.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		kk0351Cond.set(KK0351ETMsg.RSV_APLY_YMD, opeDate);

		return new JKKejbKK0351DBABase().findByCurrent(kk0351Cond);
	}
	
	/**
	 * <p>
	 * 申込のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param mskmNo 申込番号
	 * @return 申込のカレントレコード
	 */
	private CAANMsg getCurMskm(CAANMsg inCBSMsg, AgentDispatchContext inContext, String mskmNo)
	{
		CAANMsg kk0011Cond = new CAANMsg(KK0011ETMsg.class.getName());
		kk0011Cond.set(KK0011ETMsg.MSKM_NO, mskmNo);

		return new JKKejbKK0011DBABase().findByCurrent(kk0011Cond);
	}

	/**
	 * <p>
	 * サービス契約内訳のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiUcwkNo	サービス契約内訳番号
	 * @return サービス契約内訳のカレントレコード
	 */
	private CAANMsg getCurSvcKeiUcwk(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcKeiUcwkNo)
	{
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		
		CAANMsg kk0161Cond = new CAANMsg(KK0161ETMsg.class.getName());
		kk0161Cond.set(KK0161ETMsg.SVC_KEI_UCWK_NO, svcKeiUcwkNo);
		kk0161Cond.set(KK0161ETMsg.RSV_APLY_YMD, opeDate);
		
		return new JKKejbKK0161DBABase().findByCurrent(kk0161Cond);
	}

	/**
	 * <p>
	 * 申込期間を取得する
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param mskmYmd 申込日
	 * @param svcStaYmd サービス開始日
	 * @param svcChrgStaymd サービス課金開始日
	 * @return 申込期間
	 */
	private String getMskmPeriod(CAANMsg inCBSMsg, String mskmYmd, String svcStaYmd, String svcChrgStaymd)
	{
		// 申込期間を取得
		JKKejbRule0088001 rule0088 = new JKKejbRule0088001(inCBSMsg);
		rule0088.setMskm_ymd(mskmYmd);
		rule0088.setSvc_sta_ymd(svcStaYmd);
		rule0088.setSvc_chrg_staymd(svcChrgStaymd);
		return rule0088.getMskmPeriodDef();
	}

	/**
	 * <p>
	 * 割引サービス契約回復時のサービス課金終了年月日を取得します
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param wribSvcKeiNo 割引サービス契約番号
	 * @param wribSvcKeiUcwkNo 割引サービス契約内訳番号
	 * @return サービス課金終了年月日
	 */
	private String getSvcChrgStaYmd(CAANMsg inMsg, AgentDispatchContext inContext, String wribSvcKeiNo, String wribSvcKeiUcwkNo)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		// 返却用変数
		String svcChrgStaYmd = null;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK2361ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append("SELECT ")
					.append("    KK2361.SVC_CHRG_ENDYMD ")
					.append("FROM ")
					.append("    KK_T_WRISVC_KEI_UCWK KK2361 ")
					.append("WHERE ")
					.append("    KK2361.WRIB_SVC_KEI_NO = ? ")
					.append("    AND KK2361.WRIB_SVC_KEI_UCWK_NO = ? ")
					.append("    AND KK2361.WRIB_SVC_KEI_UCWK_STAT = '010' ")
					.append("    AND KK2361.MK_FLG = '0' ")
					.append("    ORDER BY KK2361.GENE_ADD_DTM DESC ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータの設定(割引サービス契約番号を指定)
			CAANJDBCUtil.setParam(pstmt, 1, wribSvcKeiNo);
			// パラメータの設定(割引サービス契約内訳番号を指定)
			CAANJDBCUtil.setParam(pstmt, 2, wribSvcKeiUcwkNo);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 1件目のみ取得する
			if (rsltQuery.next())
			{
				svcChrgStaYmd = rsltQuery.getString("SVC_CHRG_ENDYMD");
			}
			return svcChrgStaYmd;
		}
		catch(SQLException se)
		{
			throw new CAANRuntimeException(se);
		}
		finally
		{
			// 資源の解放
			try
			{
				if(rsltQuery != null)
				{
					rsltQuery.close();
				}
				if(pstmt != null)
				{
					pstmt.close();
				}
				if(con1 != null)
				{
					CAANConnectionMgr.getInstance().close(con1);
				}
			}
			catch(SQLException se)
			{
				throw new CAANRuntimeException(se);
			}
		}
	}

// v20.00.00 ADD START
	/**
	 * 割引サービス契約課金終了日変更に合わせて、割引サービス契約内訳の課金終了日の更新します。
	 * 
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcChrgEndymd サービス課金終了年月日
	 */
	public void updateSvcChrgEndymdChg(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcChrgEndymd)
	{
		
		String wribSvcKeiNo = inCBSMsg.getString(EKK0451C022CBSMsg.WRIB_SVC_KEI_NO); // 割引サービス契約番号

		// 割引サービス契約番号で一覧検索を行います
		CAANMsg inETMsgForCondition2361 = new CAANMsg(KK2361ETMsg.class.getName());
		inETMsgForCondition2361.set(KK2361ETMsg.WRIB_SVC_KEI_NO, wribSvcKeiNo);
		inETMsgForCondition2361.set(KK2361ETMsg.MK_FLG, MKFLG_VALID);
		KK2361LE le2361 = new KK2361LE();
		CAANMsg[] retConditionETMsg2361 = null;
		
		try
		{
			retConditionETMsg2361 = le2361.findByCondition(inETMsgForCondition2361);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}
		
		String retWribSvcKeiUcwkNo = null;
		CAANMsg inETMsgForCurrent2361 = new CAANMsg(KK2361ETMsg.class.getName());
		
		// 割引サービス契約内訳番号格納用マップ
		HashMap<String, String> escapeMap = new HashMap<String, String>();

		// 一覧の結果を検索します
		for (int i = 0; i < retConditionETMsg2361.length; i++)
		{
			retWribSvcKeiUcwkNo = retConditionETMsg2361[i].getString(KK2361ETMsg.WRIB_SVC_KEI_UCWK_NO);
			
			if (escapeMap.containsKey(retWribSvcKeiUcwkNo))
			{
				// 既に検索済みの場合
				continue;
			}
			// 割引サービス契約内訳番号を格納します
			escapeMap.put(retWribSvcKeiUcwkNo, retWribSvcKeiUcwkNo);
			
			// 一覧結果の割引サービス契約内訳番号でカレント検索を行います
			inETMsgForCurrent2361.set(KK2361ETMsg.WRIB_SVC_KEI_NO, wribSvcKeiNo);
			inETMsgForCurrent2361.set(KK2361ETMsg.WRIB_SVC_KEI_UCWK_NO, retWribSvcKeiUcwkNo);
			CAANMsg retCurrentETMsg2361 = findByCurrent(inETMsgForCurrent2361);

			if (null == retCurrentETMsg2361)
			{
				// カレントレコードが存在しない場合
				continue;
			}

			// 割引サービス契約内訳の更新
			setETMsgChrgEndymdChg(inCBSMsg, inContext , retCurrentETMsg2361, svcChrgEndymd);
			updateWrbiSvcKeiUcwk2(inCBSMsg, retCurrentETMsg2361);
		}
	}

	/**
	 * 割引サービス契約課金終了日変更時の割引サービス契約内訳更新用のETMsgを作成します。
	 * 
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param currentETMsg2361 割引サービス契約内訳のカレント検索結果ETMsg
	 * @param svcChrgEndymd サービス課金終了年月日
	 */
	private void setETMsgChrgEndymdChg(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg currentETMsg2361, String svcChrgEndymd)
	{
		// 割引サービス契約内訳更新用のETMsgを作成します
// v20.00.01 START
//		currentETMsg2361.set(KK2361ETMsg.GENE_ADD_DTM, inCBSMsg.getString(EKK0451C170CBSMsg.GENE_ADD_DTM)); // 世代登録年月日時分秒;
// v20.00.01 END
		currentETMsg2361.set(KK2361ETMsg.SVC_CHRG_ENDYMD, svcChrgEndymd); // サービス課金終了年月日
		currentETMsg2361.set(KK2361ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		currentETMsg2361.set(KK2361ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		currentETMsg2361.setNull(KK2361ETMsg.DEL_DTM);
		currentETMsg2361.setNull(KK2361ETMsg.DEL_OPEACNT);
		currentETMsg2361.set(KK2361ETMsg.MK_FLG, MKFLG_VALID);
	}
// v20.00.00 ADD END

	/**
	 * <p>
	 * エラー返却項目にエラーフラグを設定します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param status エラー時のステータス
	 * @param errInfo[] エラー情報が設定された配列 [0]:エラーフラグ [1]:エラー返却項目
	 */
	private void setErrInfo(CAANMsg inCBSMsg, int status, String[] errInfo)
	{
		inCBSMsg.set(JCMConstants.STATUS_INT_KEY, status);
		inCBSMsg.set(errInfo[1], errInfo[0]);
		return;	
	}
}
