/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbKK0321SecProc
*	ソースファイル名：JKKejbKK0321SecProc.java
*	作成者			：富士通
*	日付			：2011年10月20日
*＜機能概要＞
*	課金先の副次処理を行う部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/10/20	FJ)			新規作成
*	v4.00.00	2013/04/19	FJ)寺園	 	IT2-2013-0000382
*	v4.00.01	2013/04/20	FJ)竹内	 	IT2-2013-0000382
*	v7.00.00	2013/11/30	FJ)大山	 	ANK-1578-00-00
*	v7.00.01	2013/12/13	FJ)大山	 	ANK-1578-00-00
*	v9.00.00	2014/06/18	FJ)宇野		IT1-2014-0000219
*	v10.00.00	2014/10/20	FJ)星野		OM-2014-0003268
*   v33.00.00   2017/08/25  FJ）クウン  OM-2017-0000594
*   v35.00.00	2017/12/23	FJ)岡村		OM-2017-0001164 
*   v68.00.00	2024/01/25	FJ)永井		#83846
**********************************************************************/

package eo.ejb.common.db;

import java.util.ArrayList;

import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANCreateException;
import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANFinderException;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.common.util.JPCUtilCommon;
import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK0161ETMsg;
import eo.ejb.cbm.entity.KK0251ETMsg;
import eo.ejb.cbm.entity.KK0321ETMsg;
import eo.ejb.cbm.entity.KK0321LE;
import eo.ejb.cbm.entity.KK0341ETMsg;
import eo.ejb.cbm.entity.KK0351ETMsg;
import eo.ejb.cbm.entity.KK0401ETMsg;
import eo.ejb.cbm.entity.KK0481ETMsg;
import eo.ejb.cbm.entity.KK0791ETMsg;
import eo.ejb.cbm.entity.KK2811ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0321C020CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0361D010CBSMsg;
import eo.ejb.common.JCCModelCommon;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;

/**
 * <p>
 * 課金先の副次処理を行うクラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK0321SecProc extends JKKejbKK0321DBABase
{

	/** 親契約識別コード（サービス契約） */
	private static final String OYA_KEI_CD_SVC = "01";

	/** 無効フラグ 有効 */
	private static final String MKFLG_VALID = "0";

	/** 日付 最大値 */
	private static final String MAX_DATE = "20991231";

	/** シーケンス定義名 */
	private static final String SEQ_KAKINS_NO = "SEQ_KAKINS_NO";

	/** 接頭語(空白) */
	private static final String PREFIX = "";

	/** 桁数 */
	private static final int KETASUU = 12;
	

	/**
	 * <p>
	 * オプションサービス契約<ISP>登録メールウィルスチェック登録を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void createMailVirusChkOfOp(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		CAANMsg kk0321Info = new CAANMsg(KK0321ETMsg.class.getName());

		// オプションサービス契約<ISP>登録に必要な項目の設定
		// 請求契約番号
		kk0321Info.set(KK0321ETMsg.SEIKY_KEI_NO, inCBSMsg.getString(EKK0361D010CBSMsg.SEIKY_KEI_NO));
		// オプションサービス契約番号
		kk0321Info.set(KK0321ETMsg.OP_SVC_KEI_NO, inCBSMsg.getString(EKK0361D010CBSMsg.OP_SVC_KEI_NO));
		// サブオプションサービス契約番号(引継データの取得)
		kk0321Info.set(KK0321ETMsg.SBOP_SVC_KEI_NO, JKKModelCommon.getSbopSvcKeiNo0401(inCBSMsg, inContext));
		// 料金項目コード
		kk0321Info.set(KK0321ETMsg.PRC_KMK_CD, inCBSMsg.getString(EKK0361D010CBSMsg.PRC_KMK_CD));
		// 課金先適用終了年月日
		kk0321Info.set(KK0321ETMsg.KAKINS_TENDYMD, MAX_DATE);

		// メールウィルスチェック登録共通項目の設定
		setCommonItemMailVirusChk(inCBSMsg, inContext, kk0321Info);

		// 課金先登録
		createKK0321(kk0321Info);

	}

	/**
	 * <p>
	 * 割引サービス契約登録メールウィルスチェック登録を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0401Info サブオプションサービス契約のメッセージキャリア(ETメッセージ)
	 */
	public void createMailVirusChkOfWari(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0401Info)
	{
		String opSvcKeiNo = kk0401Info.getString(KK0401ETMsg.OP_SVC_KEI_NO);

		// オプションサービス契約番号で課金先の一覧検索
		CAANMsg kk0321Cond = new CAANMsg(KK0321ETMsg.class.getName());
		kk0321Cond.set(KK0321ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		kk0321Cond.set(KK0321ETMsg.MK_FLG, MKFLG_VALID);
		KK0321LE le0321 = new KK0321LE();
		CAANMsg[] kk0321List = null;
		try
		{
			kk0321List = le0321.findByCondition(kk0321Cond);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		// サブオプションサービス契約の転記
		CAANMsg kk0321Info = new CAANMsg(KK0321ETMsg.class.getName());
		kk0321Info.set(KK0321ETMsg.OP_SVC_KEI_NO, opSvcKeiNo); // オプションサービス契約番号
		kk0321Info.set(KK0321ETMsg.SBOP_SVC_KEI_NO, kk0401Info.getString(KK0401ETMsg.SBOP_SVC_KEI_NO)); // サブオプションサービス契約番号
		
		// 一覧検索結果分課金先の登録を行います
		for (CAANMsg kk0321Msg : kk0321List)
		{
			// 割引サービス契約登録に必要な項目の設定
			kk0321Info.set(KK0321ETMsg.SEIKY_KEI_NO, kk0321Msg.getString(KK0321ETMsg.SEIKY_KEI_NO)); // 請求契約番号
			kk0321Info.set(KK0321ETMsg.PRC_KMK_CD, kk0321Msg.getString(KK0321ETMsg.PRC_KMK_CD)); // 料金項目コード
			kk0321Info.set(KK0321ETMsg.KAKINS_TENDYMD, kk0321Msg.getString(KK0321ETMsg.KAKINS_TENDYMD)); // 課金先適用終了年月日
			
			// メールウィルスチェック登録共通項目の設定
			setCommonItemMailVirusChk(inCBSMsg, inContext, kk0321Info);

			// 課金先登録
			createKK0321(kk0321Info);
		}
	}

	/**
	 * <p>
	 * メールウィルスチェック登録の共通項目設定を行います。
	 * </p>
	 * @param inCBSMsg　処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0321Info　課金先のメッセージキャリア
	 */
	private void setCommonItemMailVirusChk(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0321Info)
	{
		kk0321Info.set(KK0321ETMsg.KAKINS_NO, JCCModelCommon.getFormatedNextSeq(SEQ_KAKINS_NO, PREFIX, KETASUU)); // 課金先番号
		kk0321Info.set(KK0321ETMsg.KAKINS_TSTAYMD, JKKModelCommon.getOpeDate(inCBSMsg)); // 課金先適用開始年月日
		kk0321Info.set(KK0321ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY)); // 登録年月日時分秒
		kk0321Info.set(KK0321ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY)); // 登録オペレータアカウント
		kk0321Info.set(KK0321ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY)); // 更新年月日時分秒
		kk0321Info.set(KK0321ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY)); // 更新オペレータアカウント
		kk0321Info.set(KK0321ETMsg.MK_FLG, MKFLG_VALID); // 無効フラグ
	}
	
	/**
	 * <p>
	 * 課金先の登録を行います。
	 * </p>
	 * @param inMsg　課金先のメッセージキャリア
	 */
	private void createKK0321(CAANMsg inMsg)
	{
		try
		{
			super.create(inMsg);
		}
		catch (CAANCreateException ce)
		{
			throw new CAANRuntimeException(ce);
		}
	}

	/**
	 * <p>
	 * 課金先の更新を行います。
	 * </p>
	 * @param inMsg　課金先のメッセージキャリア
	 */
	private void updateKK0321(CAANMsg inMsg)
	{
		try
		{
			super.update(inMsg);
		}
		catch (CAANFinderException ce)
		{
			throw new CAANRuntimeException(ce);
		}
	}

	/**
	 * <p>
	 * 課金先請求契約変更の関連課金先変更処理を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execKanrenKakinsUpdate(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 入力値の課金先適用開始年月日が運用日付より未来日の場合、処理終了
		String startYmd = inCBSMsg.getString(EKK0321C020CBSMsg.KAKINS_TSTAYMD);
		if(JPCUtilCommon.isFutureDate(startYmd, JKKModelCommon.getOpeDate(inCBSMsg), "0"))
		{
			return;
		}
		
		// +++ サービス契約配下の契約に紐づく課金先の取得処理 +++
		// 課金先に紐づくサービス契約番号を取得
		// 課金先番号
		String kakinsNo = inCBSMsg.getString(EKK0321C020CBSMsg.KAKINS_NO);
		CAANMsg kakins = getKakins(kakinsNo);

		// 課金先がなかったら処理終了
		if (kakins == null)
		{
			return;
		}

		// サービス契約番号がなかったら処理終了
		String svc_kei_no = kakins.getString(KK0321ETMsg.SVC_KEI_NO);
		if (svc_kei_no == null)
		{
			return;
		}

		// 請求契約番号取得
		String seiky_kei_no = kakins.getString(KK0321ETMsg.SEIKY_KEI_NO);

		// 運用日付
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		
		// @該当の「サービス契約」配下の「サービス契約内訳」が指定する「課金先」を取得
		ArrayList<CAANMsg> svcKeiUcwkList = getSvcKeiUcwk(svc_kei_no, opeDate);

		// A該当の「サービス契約」配下の「機器提供サービス契約」が指定する「課金先」を取得
		ArrayList<CAANMsg> kktkSvcKeiList = getKktkSvcKei(svc_kei_no, opeDate);

		// B該当の「サービス契約」が使用する「サービス契約回線内訳」に紐づく「機器提供サービス契約」が指定する「課金先」を取得
		//---------v33.00.00 OM-2017-0000594_DEL START---------//
		//ArrayList<CAANMsg> kktkSvcKeiListForKK0251 = getKktkSvcKeiForKK0251(svc_kei_no, opeDate);
		//---------v33.00.00 OM-2017-0000594_DEL END-----------//
		//---------v33.00.00 OM-2017-0000594_ADD START---------//
		ArrayList<CAANMsg> kktkSvcKeiListForKK0251 = getKktkSvcKeiForKK0251_02(svc_kei_no, opeDate);
		//---------v33.00.00 OM-2017-0000594_ADD END-----------//
		
		// 機器提供直ルートとサービス契約回線内訳ルートを結合する
		kktkSvcKeiList.addAll(kktkSvcKeiListForKK0251);
		
		// C該当の「サービス契約」配下の「オプションサービス契約」が指定する「課金先」を取得
		ArrayList<CAANMsg> opSvcKeiList = getOpSvcKei(svc_kei_no, opeDate);

		// D該当の「サービス契約」配下の「サブオプションサービス契約」が指定する「課金先」を取得
		// ※「サブオプションサービス契約」が指定する「課金先」には、
		//   親「オプションサービス契約」のオプションサービス契約番号が設定されており、検索Cで取得済のため不要

		// E該当の「サービス契約」配下の「割引サービス契約」が指定する「課金先」を取得
		ArrayList<CAANMsg> wariSvcKeiList = getWariSvcKei(svc_kei_no, opeDate);
		// F該当の「サービス契約」配下の「機器オプション」が指定する「課金先」を取得。
		//---------v33.00.00 OM-2017-0000594_DEL START---------//
		//ArrayList<CAANMsg> kkopSvcKeiList = getKkopSvcKei(svc_kei_no, opeDate);
		//---------v33.00.00 OM-2017-0000594_DEL END-----------//
		//---------v33.00.00 OM-2017-0000594_ADD START---------//
		ArrayList<CAANMsg> kkopSvcKeiList = getKkopSvcKei_02(svc_kei_no, opeDate);
		//---------v33.00.00 OM-2017-0000594_ADD END-----------//
		
		// G該当の「サービス契約」配下の「機器オプション」が指定する「課金先」を取得。
		// ※タブレット端末補償の機器オプション用
		ArrayList<CAANMsg> kkopSvcKeiCompsList = getKkopSvcKeiCompsOpPack(svc_kei_no, opeDate);
		
		// 多機能ルータとタブレット端末補償を結合する
		kkopSvcKeiList.addAll(kkopSvcKeiCompsList);
		
		// UpdateListに入っている課金先レコードのDBアクセス処理を実行
		updateKakinsSeikyKei(inCBSMsg, inContext, svcKeiUcwkList, seiky_kei_no, "KK0161");
		updateKakinsSeikyKei(inCBSMsg, inContext, kktkSvcKeiList, seiky_kei_no, "KK0341");
		updateKakinsSeikyKei(inCBSMsg, inContext, opSvcKeiList, seiky_kei_no, "KK0351");
		updateKakinsSeikyKei(inCBSMsg, inContext, wariSvcKeiList, seiky_kei_no, "KK0481");
		updateKakinsSeikyKei(inCBSMsg, inContext, kkopSvcKeiList, seiky_kei_no, "KK2811");
	}

	/**
	 * <p>
	 * 課金先請求契約変更の関連課金先変更処理のDB更新・登録処理を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kakinsUpdateObj 処理対象の課金先レコードリスト
	 * @param seiky_kei_no サービス契約に紐づく課金先の持つ請求契約番号
	 * @param syoriKbn 処理区分（サービス契約内訳:KK0161／機器提供サービス契約:KK0341／
	 * 							オプションサービス契約:KK0351／割引サービス契約:KK0481）
	 */
	private void updateKakinsSeikyKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, ArrayList<CAANMsg> kakinsUpdateObj, String seiky_kei_no,
			String syoriKbn)
	{

		//UpdateListに入っている課金先レコードのDBアクセス処理を実行
		for (CAANMsg outMsg : kakinsUpdateObj)
		{
			//+++ 請求契約番号のチェック +++ 
			//サービス契約に紐づく課金先の請求契約番号と処理対処の請求契約番号が一致しなければ
			//なにもしない。
			if (!seiky_kei_no.equals(outMsg.getString(KK0321ETMsg.SEIKY_KEI_NO)))
			{
				continue;
			}

			//+++ create処理 +++
			CAANMsg createKK0321Data = new CAANMsg(KK0321ETMsg.class.getName());

			//課金先番号(採番)
			String kakins_no_create = JKKModelCommon.getFormatedNextSeq(SEQ_KAKINS_NO, PREFIX, KETASUU);
			createKK0321Data.set(KK0321ETMsg.KAKINS_NO, kakins_no_create);

			//請求契約番号
			createKK0321Data.set(KK0321ETMsg.SEIKY_KEI_NO, inCBSMsg.getString(EKK0321C020CBSMsg.SEIKY_KEI_NO));

			if ("KK0161".equals(syoriKbn))
			{
				//サービス契約内訳番号
				createKK0321Data.set(KK0321ETMsg.SVC_KEI_UCWK_NO, outMsg.getString(KK0321ETMsg.SVC_KEI_UCWK_NO));
			}

			else if ("KK0341".equals(syoriKbn))
			{
				//機器提供サービス契約番号
				createKK0321Data.set(KK0321ETMsg.KKTK_SVC_KEI_NO, outMsg.getString(KK0321ETMsg.KKTK_SVC_KEI_NO));
			}

			else if ("KK0351".equals(syoriKbn))
			{
				//オプションサービス契約番号
				createKK0321Data.set(KK0321ETMsg.OP_SVC_KEI_NO, outMsg.getString(KK0321ETMsg.OP_SVC_KEI_NO));

				//サービス契約に紐づくオプションサービス契約に紐づく課金先レコードで
				//サブオプションサービス契約番号が設定されているときだけ値を設定する
				if(!outMsg.isNull(KK0321ETMsg.SBOP_SVC_KEI_NO))
				{
					//サブオプションサービス契約番号
					createKK0321Data.set(KK0321ETMsg.SBOP_SVC_KEI_NO, outMsg.getString(KK0321ETMsg.SBOP_SVC_KEI_NO));
				}
			}

			else if ("KK0481".equals(syoriKbn))
			{
				//割引サービス契約番号
				createKK0321Data.set(KK0321ETMsg.WRIB_SVC_KEI_NO, outMsg.getString(KK0321ETMsg.WRIB_SVC_KEI_NO));
			}
			else if ("KK2811".equals(syoriKbn))
			{
				//機器オプションサービス契約番号
				createKK0321Data.set(KK0321ETMsg.KKOP_SVC_KEI_NO, outMsg.getString(KK2811ETMsg.KKOP_SVC_KEI_NO));
			}
			
			//料金項目コード
			createKK0321Data.set(KK0321ETMsg.PRC_KMK_CD, outMsg.getString(KK0321ETMsg.PRC_KMK_CD));
			//課金先適用開始年月日
			createKK0321Data.set(KK0321ETMsg.KAKINS_TSTAYMD, inCBSMsg.getString(EKK0321C020CBSMsg.KAKINS_TSTAYMD));
			//課金先適用終了年月日
			createKK0321Data.set(KK0321ETMsg.KAKINS_TENDYMD, JKKModelCommon.convEndYmdInit(inCBSMsg, inContext, null));

			//共通項目
			createKK0321Data.set(KK0321ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY)); // 登録年月日時分秒
			createKK0321Data.set(KK0321ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY)); // 登録オペレータアカウント
			createKK0321Data.set(KK0321ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY)); // 更新年月日時分秒
			createKK0321Data.set(KK0321ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY)); // 更新オペレータアカウント
			createKK0321Data.set(KK0321ETMsg.MK_FLG, MKFLG_VALID); // 無効フラグ

			createKK0321(createKK0321Data);

			// 入力値の課金先適用開始年月日
			String kakins_tstaymd_input = inCBSMsg.getString(EKK0321C020CBSMsg.KAKINS_TSTAYMD);
			
			//+++ update処理 +++ 
			CAANMsg updateKK0321Data = new CAANMsg(KK0321ETMsg.class.getName());
			//課金先番号
			updateKK0321Data.set(KK0321ETMsg.KAKINS_NO, outMsg.getString(KK0321ETMsg.KAKINS_NO));
			//課金適用終了年月日
			updateKK0321Data.set(KK0321ETMsg.KAKINS_TENDYMD, JKKModelCommon.addDay(kakins_tstaymd_input, -1));
			// 更新年月日時分秒
			updateKK0321Data.set(KK0321ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
			// 更新オペレータアカウント
			updateKK0321Data.set(KK0321ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));

			updateKK0321(updateKK0321Data);
		}

	}

	/**
	 * <p>
	 * 課金先レコードの検索を行います。
	 * </p>
	 * @param kakinsNo 課金先番号
	 * @return 検索結果の課金先レコード
	 */
	private CAANMsg getKakins(String kakinsNo)
	{
		// 検索パラメータの設定
		CAANMsg msg = new CAANMsg(KK0321ETMsg.class.getName());
		msg.set(KK0321ETMsg.KAKINS_NO, kakinsNo);
		msg.set(KK0321ETMsg.MK_FLG, "0");

		CAANMsg[] otETMsg = getKakins(msg);

		if (otETMsg == null || otETMsg.length == 0)
		{
			return null;
		}

		//PKが課金先番号のみなので一件しか取得しない
		return otETMsg[0];

	}

	/**
	 * <p>
	 * 課金先レコードの検索を行います。
	 * </p>
	 * @param msg 検索パラメータを設定したKK0321ETMsg
	 * @return 検索結果の課金先レコード
	 */
	private CAANMsg[] getKakins(CAANMsg msg)
	{
		KK0321LE le = new KK0321LE();
		CAANMsg[] otETMsg = null;

		try
		{
			otETMsg = le.findByCondition(msg);

			return otETMsg;

		}
		catch (CAANException e1)
		{
			throw new CAANRuntimeException(e1);
		}

	}

	/**
	 * <p>
	 * サービス契約番号に紐づくサービス契約内訳番号を取得し、
	 * 更新対象の課金先レコードの検索を行います。
	 * </p>
	 * @param svc_kei_no サービス契約番号
	 * @param ope_date 運用年月日
	 * @return 検索結果の課金先レコード
	 */
	private ArrayList<CAANMsg> getSvcKeiUcwk(String svc_kei_no, String ope_date)
	{
		//返却用メッセージオブジェクト格納変数
		ArrayList<CAANMsg> retMsgList = new ArrayList<CAANMsg>();

		// サービス契約番号に紐づく「サービス契約内訳」を取得する
		JKKejbKK0161DBABase kk0161Dba = new JKKejbKK0161DBABase();
		CAANMsg[] otETMsg = kk0161Dba.getKK0161bySvcKei(svc_kei_no, null, ope_date);

		for (CAANMsg kk0161 : otETMsg)
		{
			String svc_kei_ucwk_no = kk0161.getString(KK0161ETMsg.SVC_KEI_UCWK_NO);
			
			// サービス契約内訳番号に紐づく「課金先」を取得する
			JKKejbKK0321DBABase kk0321Dba = new JKKejbKK0321DBABase();
			CAANMsg[] retList = kk0321Dba.getKK0321byVariKei(null, svc_kei_ucwk_no, null, null, null, null, null, null, null, ope_date, "1");
			
			// 取得した課金先レコードをArrayListに積む
			for (CAANMsg retMsg : retList)
			{
				retMsgList.add(retMsg);
			}
		}

		return retMsgList;
	}

	/**
	 * <p>
	 * サービス契約番号に紐づく機器提供サービス契約番号を取得し、
	 * 更新対象の課金先レコードの検索を行います。
	 * </p>
	 * @param svc_kei_no サービス契約番号
	 * @param ope_date 運用日付
	 * @return 検索結果の課金先レコード
	 */
	private ArrayList<CAANMsg> getKktkSvcKei(String svc_kei_no, String ope_date)
	{
		//返却用メッセージオブジェクト格納変数
		ArrayList<CAANMsg> retMsgList = new ArrayList<CAANMsg>();

		// サービス契約番号に紐づく「機器提供サービス契約」を取得する
		JKKejbKK0341DBABase kk0341Dba = new JKKejbKK0341DBABase();
		CAANMsg[] kk0341ETMsg = kk0341Dba.getKK0341bySvcKei(svc_kei_no, null, ope_date, "4");

		for (CAANMsg kk0341data : kk0341ETMsg)
		{
			String kktkSvcKeiNo = kk0341data.getString(KK0341ETMsg.KKTK_SVC_KEI_NO);
			
			// 機器提供サービス契約番号に紐づく「課金先」を取得する
			JKKejbKK0321DBABase kk0321Dba = new JKKejbKK0321DBABase();
			CAANMsg[] kk0321ETMsg = kk0321Dba.getKK0321byVariKei(null, null, kktkSvcKeiNo, null, null, null, null, null, null, ope_date, "1");
			
			// 取得した課金先レコードをArrayListに積む
			for (CAANMsg retMsg : kk0321ETMsg)
			{
				retMsgList.add(retMsg);
			}
		}
		return retMsgList;
	}

	/**
	 * <p>
	 * サービス契約番号に紐づく機器提供サービス契約番号を取得し、
	 * 更新対象の課金先レコードの検索を行います。(サービス契約回線内訳ルート)
	 * </p>
	 * @param svc_kei_no サービス契約番号
	 * @param ope_date 運用日付
	 * @return 検索結果の課金先レコード
	 */
	private ArrayList<CAANMsg> getKktkSvcKeiForKK0251(String svc_kei_no, String ope_date)
	{
		//返却用メッセージオブジェクト格納変数
		ArrayList<CAANMsg> retMsgList = new ArrayList<CAANMsg>();

		/* ----------------------------------------------------------------------------------------------------
		 * 処理対象の「サービス契約」で使用する「サービス契約回線内訳」に紐づく「機器提供サービス契約」を取得する
		 * ---------------------------------------------------------------------------------------------------- */
		// サービス契約番号に紐づく「サービス契約回線内訳」を取得する
		JKKejbKK0251DBABase kk0251Dba = new JKKejbKK0251DBABase();
		CAANMsg[] kk0251ETMsg = kk0251Dba.getKK0251bySvcKei(svc_kei_no, null, ope_date, "2");
		
		// 検索結果が0件の場合
		if (kk0251ETMsg == null || kk0251ETMsg.length == 0)
		{
			return retMsgList;
		}

		// サービス契約回線内訳が特定されるのは1件のみ
		String svcKeiKaisenUcwkNo = kk0251ETMsg[0].getString(KK0251ETMsg.SVC_KEI_KAISEN_UCWK_NO);
		
		// サービス契約回線内訳番号に紐づく「機器提供サービス契約」を取得する
		JKKejbKK0341DBABase kk0341Dba = new JKKejbKK0341DBABase();
		CAANMsg[] kk0341ETMsg = kk0341Dba.getKK0341bySvcKeiKaisenUcwk(svcKeiKaisenUcwkNo, null, ope_date);


		// 処理対象の「サービス契約」の料金コースコードを取得する
		CAANMsg kk0081Msg = getCurrentKK0081(svc_kei_no, ope_date);
		String svcCd = kk0081Msg.getString(KK0081ETMsg.SVC_CD);
		
		for (CAANMsg kk0341data : kk0341ETMsg)
		{
			/* ----------------------------------------------------------------------------------------------------
			 * 処理対象の「サービス契約」で使用する「機器提供サービス契約」以外は、請求契約変更の副次処理対象外
			 * 例：電話契約の課金先請求契約変更の場合、V-ONUは請求契約変更の副次処理対象外となる。
			 * ---------------------------------------------------------------------------------------------------- */
			// 当該「機器提供サービス契約」の機器提供サービスに紐づく「料金コース_機器提供サービス」を取得する
			CAANMsg[] kk0791MsgList = new JKKejbKK0791DBABase().getKK0791byKktkSvc(kk0341data.getString(KK0341ETMsg.KKTK_SVC_CD), ope_date);
			
			// 当該「機器提供サービス契約」の機器提供サービス付加対象となる料金コースのリストを作成
			ArrayList<String> pcrsCdList = new ArrayList<String>();
			for (CAANMsg kk0791Msg : kk0791MsgList)
			{
				pcrsCdList.add(kk0791Msg.getString(KK0791ETMsg.PCRS_CD));
			}
			
			// 処理対象の「サービス契約」に対して、当該「機器提供サービス契約」が付加対象外である場合、次の「機器提供サービス契約」へ
			if (!pcrsCdList.contains(kk0081Msg.getString(KK0081ETMsg.PCRS_CD)))
			{
				continue;
			}
			
			// 回線に紐付くサービス契約に対し、ネット契約と電話契約の両方が存在する場合、ネット契約のみを対象とする
			CAANMsg sameKisnKK0081Msg = getSameKisnNetTelKei(svc_kei_no, svcCd, svcKeiKaisenUcwkNo, ope_date);
			if (!(sameKisnKK0081Msg == null) && JKKModelConst.SVC_CD_NET.equals(sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_CD)))
			{
// OM-2014-0003268対応 20141020 星野 ADD START
				// 多機能ルータの場合、ネット契約の存在のみでなくルータ機能機器オプションの存在も確認する
// #83846 MOD START
//				if(JKKModelConst.KKTK_SVC_CD_TAKINORT.equals(kk0341data.getString(KK0341ETMsg.KKTK_SVC_CD))){
				if(JKKModelConst.KKTK_SVC_CD_TAKINORT.equals(kk0341data.getString(KK0341ETMsg.KKTK_SVC_CD)) || JKKModelConst.KKTK_SVC_CD_HGW.equals(kk0341data.getString(KK0341ETMsg.KKTK_SVC_CD))){
// #83846 MOD END
					// 機器提供サービス契約番号が紐づく機器オプションサービス契約を取得する。
					JKKejbKK2811DBABase kk2811Dba = new JKKejbKK2811DBABase();
					CAANMsg[] kk2811ETMsg = kk2811Dba.getKK2811byKktk(kk0341data.getString(KK0341ETMsg.KKTK_SVC_KEI_NO), null, ope_date, "2");
					
					// ルータオプションが存在するなら、電話側では処理対象外
					if(kk2811ETMsg != null && kk2811ETMsg.length != 0) {
						continue;
					}
				}else{
// OM-2014-0003268対応 20141020 星野 ADD END
					continue;
// OM-2014-0003268対応 20141020 星野 ADD START
				}
// OM-2014-0003268対応 20141020 星野 ADD END
			}
			
			// 多機能ルータの場合、変更対象のサービス契約の機器オプションが存在しない場合は更新対象としない。
// #83846 MOD START
//			if(JKKModelConst.KKTK_SVC_CD_TAKINORT.equals(kk0341data.getString(KK0341ETMsg.KKTK_SVC_CD))) {
			if(JKKModelConst.KKTK_SVC_CD_TAKINORT.equals(kk0341data.getString(KK0341ETMsg.KKTK_SVC_CD)) || JKKModelConst.KKTK_SVC_CD_HGW.equals(kk0341data.getString(KK0341ETMsg.KKTK_SVC_CD))) {
// #83846 MOD END
				String searchPattern = "";
				
				if(JKKModelConst.SVC_CD_NET.equals(kk0081Msg.getString(KK0081ETMsg.SVC_CD))) {
					searchPattern = "2";
				} else if(JKKModelConst.SVC_CD_TEL.equals(kk0081Msg.getString(KK0081ETMsg.SVC_CD))) {
					searchPattern = "3";
					
				}
				
				if(!"".equals(searchPattern)) {
					// 機器提供サービス契約番号が紐づく機器オプションサービス契約を取得する。
					JKKejbKK2811DBABase kk2811Dba = new JKKejbKK2811DBABase();
					CAANMsg[] kk2811ETMsg = kk2811Dba.getKK2811byKktk(kk0341data.getString(KK0341ETMsg.KKTK_SVC_KEI_NO), null, ope_date, searchPattern);

					if(kk2811ETMsg == null || kk2811ETMsg.length == 0) {
						continue;
					}
				}
			}
			
			/* ----------------------------------------------------------------------------------------------------
			 * 「機器提供サービス契約」で指定する「請求契約」を、
			 * 処理対象の「サービス契約」で指定する「請求契約」と同一の「請求契約」に変更する。
			 * ---------------------------------------------------------------------------------------------------- */
			String kktkSvcKeiNo = kk0341data.getString(KK0341ETMsg.KKTK_SVC_KEI_NO);
			
			// 機器提供サービス契約番号に紐づく「課金先」を取得する
			JKKejbKK0321DBABase kk0321Dba = new JKKejbKK0321DBABase();
			CAANMsg[] kk0321ETMsg = kk0321Dba.getKK0321byVariKei(null, null, kktkSvcKeiNo, null, null, null, null, null, null, ope_date, "1");
			
			// 取得した課金先レコードをArrayListに積む
			for (CAANMsg retMsg : kk0321ETMsg)
			{
				retMsgList.add(retMsg);
			}
		}

		return retMsgList;
	}
	//---------v33.00.00 OM-2017-0000594_ADD START---------//
	/**
	 * <p>
	 * サービス契約番号に紐づく機器提供サービス契約番号を取得し、
	 * 更新対象の課金先レコードの検索を行います。(サービス契約回線内訳ルート)
	 * </p>
	 * @param svc_kei_no サービス契約番号
	 * @param ope_date 運用日付
	 * @return 検索結果の課金先レコード
	 */
	private ArrayList<CAANMsg> getKktkSvcKeiForKK0251_02(String svc_kei_no, String ope_date)
	{
		//返却用メッセージオブジェクト格納変数
		ArrayList<CAANMsg> retMsgList = new ArrayList<CAANMsg>();
		
		/* ----------------------------------------------------------------------------------------------------
		 * 処理対象の「サービス契約」で使用する「サービス契約回線内訳」に紐づく「機器提供サービス契約」を取得する
		 * ---------------------------------------------------------------------------------------------------- */
		// サービス契約番号に紐づく「サービス契約回線内訳」を取得する
		JKKejbKK0251DBABase kk0251Dba = new JKKejbKK0251DBABase();
		CAANMsg[] kk0251ETMsg = kk0251Dba.getKK0251bySvcKei(svc_kei_no, null, ope_date, "3");
		
		// 検索結果が0件の場合
		if (kk0251ETMsg == null || kk0251ETMsg.length == 0)
		{
			return retMsgList;
		}
		
		for (CAANMsg retMsg1 : kk0251ETMsg)
		{
			// サービス契約回線内訳が特定されるのは1件のみ
			String svcKeiKaisenUcwkNo = retMsg1.getString(KK0251ETMsg.SVC_KEI_KAISEN_UCWK_NO);
			
			// サービス契約回線内訳番号に紐づく「機器提供サービス契約」を取得する
			JKKejbKK0341DBABase kk0341Dba = new JKKejbKK0341DBABase();
			CAANMsg[] kk0341ETMsg = kk0341Dba.getKK0341bySvcKeiKaisenUcwk(svcKeiKaisenUcwkNo, null, ope_date);
			// 処理対象の「サービス契約」の料金コースコードを取得する
			CAANMsg kk0081Msg = getCurrentKK0081(svc_kei_no, ope_date);
			String svcCd = kk0081Msg.getString(KK0081ETMsg.SVC_CD);
			
			for (CAANMsg kk0341data : kk0341ETMsg)
			{
				/* ----------------------------------------------------------------------------------------------------
				 * 処理対象の「サービス契約」で使用する「機器提供サービス契約」以外は、請求契約変更の副次処理対象外
				 * 例：電話契約の課金先請求契約変更の場合、V-ONUは請求契約変更の副次処理対象外となる。
				 * ---------------------------------------------------------------------------------------------------- */
				// 当該「機器提供サービス契約」の機器提供サービスに紐づく「料金コース_機器提供サービス」を取得する
				CAANMsg[] kk0791MsgList = new JKKejbKK0791DBABase().getKK0791byKktkSvc(kk0341data.getString(KK0341ETMsg.KKTK_SVC_CD), ope_date);
				
				// 当該「機器提供サービス契約」の機器提供サービス付加対象となる料金コースのリストを作成
				ArrayList<String> pcrsCdList = new ArrayList<String>();
				for (CAANMsg kk0791Msg : kk0791MsgList)
				{
					pcrsCdList.add(kk0791Msg.getString(KK0791ETMsg.PCRS_CD));
				}
				
				// 処理対象の「サービス契約」に対して、当該「機器提供サービス契約」が付加対象外である場合、次の「機器提供サービス契約」へ
				if (!pcrsCdList.contains(kk0081Msg.getString(KK0081ETMsg.PCRS_CD)))
				{
					continue;
				}
				
				// 回線に紐付くサービス契約に対し、ネット契約と電話契約の両方が存在する場合、ネット契約のみを対象とする
				CAANMsg sameKisnKK0081Msg = getSameKisnNetTelKei_02(svc_kei_no, svcCd, svcKeiKaisenUcwkNo, ope_date);
				if (!(sameKisnKK0081Msg == null) && JKKModelConst.SVC_CD_NET.equals(sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_CD)))
				{
					// 多機能ルータの場合、ネット契約の存在のみでなくルータ機能機器オプションの存在も確認する
// #83846 MOD START
//					if(JKKModelConst.KKTK_SVC_CD_TAKINORT.equals(kk0341data.getString(KK0341ETMsg.KKTK_SVC_CD))){
					if(JKKModelConst.KKTK_SVC_CD_TAKINORT.equals(kk0341data.getString(KK0341ETMsg.KKTK_SVC_CD)) || JKKModelConst.KKTK_SVC_CD_HGW.equals(kk0341data.getString(KK0341ETMsg.KKTK_SVC_CD))){
// #83846 MOD END
						// 機器提供サービス契約番号が紐づく機器オプションサービス契約を取得する。
						JKKejbKK2811DBABase kk2811Dba = new JKKejbKK2811DBABase();
						CAANMsg[] kk2811ETMsg = kk2811Dba.getKK2811byKktk(kk0341data.getString(KK0341ETMsg.KKTK_SVC_KEI_NO), null, ope_date, "2");
						
						// ルータオプションが存在するなら、電話側では処理対象外
						if(kk2811ETMsg != null && kk2811ETMsg.length != 0) {
							continue;
						}
					}else{
						continue;
					}
				}
				// 多機能ルータの場合、変更対象のサービス契約の機器オプションが存在しない場合は更新対象としない。
// #83846 MOD START
//				if(JKKModelConst.KKTK_SVC_CD_TAKINORT.equals(kk0341data.getString(KK0341ETMsg.KKTK_SVC_CD))) {
				if(JKKModelConst.KKTK_SVC_CD_TAKINORT.equals(kk0341data.getString(KK0341ETMsg.KKTK_SVC_CD)) || JKKModelConst.KKTK_SVC_CD_HGW.equals(kk0341data.getString(KK0341ETMsg.KKTK_SVC_CD))) {
// #83846 MOD END
					String searchPattern = "";
					if(JKKModelConst.SVC_CD_NET.equals(kk0081Msg.getString(KK0081ETMsg.SVC_CD))) {
						searchPattern = "2";
					} else if(JKKModelConst.SVC_CD_TEL.equals(kk0081Msg.getString(KK0081ETMsg.SVC_CD))) {
						searchPattern = "3";
					}
					
					if(!"".equals(searchPattern)) {
						// 機器提供サービス契約番号が紐づく機器オプションサービス契約を取得する。
						JKKejbKK2811DBABase kk2811Dba = new JKKejbKK2811DBABase();
						CAANMsg[] kk2811ETMsg = kk2811Dba.getKK2811byKktk(kk0341data.getString(KK0341ETMsg.KKTK_SVC_KEI_NO), null, ope_date, searchPattern);
						
						if(kk2811ETMsg == null || kk2811ETMsg.length == 0) {
							continue;
						}
					}
				}
				/* ----------------------------------------------------------------------------------------------------
				 * 「機器提供サービス契約」で指定する「請求契約」を、
				 * 処理対象の「サービス契約」で指定する「請求契約」と同一の「請求契約」に変更する。
				 * ---------------------------------------------------------------------------------------------------- */
				String kktkSvcKeiNo = kk0341data.getString(KK0341ETMsg.KKTK_SVC_KEI_NO);
				
				// 機器提供サービス契約番号に紐づく「課金先」を取得する
				JKKejbKK0321DBABase kk0321Dba = new JKKejbKK0321DBABase();
				CAANMsg[] kk0321ETMsg = kk0321Dba.getKK0321byVariKei(null, null, kktkSvcKeiNo, null, null, null, null, null, null, ope_date, "1");
				
				// 取得した課金先レコードをArrayListに積む
				for (CAANMsg retMsg : kk0321ETMsg)
				{
					retMsgList.add(retMsg);
				}
			}
		}	
		return retMsgList;
	}
	//---------v33.00.00 OM-2017-0000594_ADD END-----------//
	
	
	/**
	 * <p>
	 * サービス契約番号に紐づくオプションサービス契約番号を取得し、
	 * 更新対象の課金先レコードの検索を行います。
	 * </p>
	 * @param svc_kei_no サービス契約番号
	 * @return 検索結果の課金先レコード
	 */
	private ArrayList<CAANMsg> getOpSvcKei(String svc_kei_no, String ope_date)
	{
		//返却用メッセージオブジェクト格納変数
		ArrayList<CAANMsg> retMsgList = new ArrayList<CAANMsg>();

		// サービス契約番号に紐づく「オプションサービス契約」を取得する
		JKKejbKK0351DBABase kk0351Dba = new JKKejbKK0351DBABase();
		CAANMsg[] otETMsg = kk0351Dba.getKK0351bySvcKei(svc_kei_no, null, ope_date, "3");

		for (CAANMsg kk0351Data : otETMsg)
		{
			String opSvcKeiNo = kk0351Data.getString(KK0351ETMsg.OP_SVC_KEI_NO);
			
			// オプションサービス契約番号に紐づく「課金先」を取得する
			JKKejbKK0321DBABase kk0321Dba = new JKKejbKK0321DBABase();
			CAANMsg[] retList = kk0321Dba.getKK0321byVariKei(null, null, null, opSvcKeiNo, null, null, null, null, null, ope_date, "1");
			
			// 取得した課金先レコードをArrayListに積む
			for (CAANMsg retMsg : retList)
			{
				retMsgList.add(retMsg);
			}
		}
		return retMsgList;
	}

	/**
	 * <p>
	 * サービス契約番号に紐づく割引サービス契約番号を取得し、
	 * 更新対象の課金先レコードの検索を行います。
	 * </p>
	 * @param svc_kei_no サービス契約番号
	 * @return 検索結果の課金先レコード
	 */
	private ArrayList<CAANMsg> getWariSvcKei(String svc_kei_no, String ope_date)
	{
		//返却用メッセージオブジェクト格納変数
		ArrayList<CAANMsg> retMsgList = new ArrayList<CAANMsg>();

		// サービス契約番号に紐づく「割引サービス対象契約」を取得する
		JKKejbKK0481DBABase kk0481Dba = new JKKejbKK0481DBABase();
		CAANMsg[] otETMsg = kk0481Dba.getKK0481byVariKei(OYA_KEI_CD_SVC, svc_kei_no, null, null, null, null, null, null, ope_date, "1");

		// 取得した「割引サービス対象契約」の「割引サービス契約」が他の契約に紐づいているかをチェック
		for (CAANMsg kk0481 : otETMsg)
		{
			String wbib_svc_kei_no = kk0481.getString(KK0481ETMsg.WRIB_SVC_KEI_NO);
			
			// 割引サービス契約番号に紐づく「割引サービス対象契約」を取得する
			CAANMsg[] otETMsgChk = kk0481Dba.getKK0481byWribSvcKei(wbib_svc_kei_no, null, ope_date, "1");

			boolean chkFlg = true;
			for (CAANMsg kk0481Chk : otETMsgChk)
			{
				String svc_kei_no_chk = kk0481Chk.getString(KK0481ETMsg.SVC_KEI_NO);

				// 入力のサービス契約番号と違うレコードが存在する場合は課金先変更対象にしない
				if (svc_kei_no_chk != null && !svc_kei_no.equals(svc_kei_no_chk))
				{
					chkFlg = false;
				}
			}

			if (chkFlg)
			{
				// 割引サービス契約番号に紐づく「課金先」を取得する
				JKKejbKK0321DBABase kk0321Dba = new JKKejbKK0321DBABase();
				CAANMsg[] retList = kk0321Dba.getKK0321byVariKei(null, null, null, null, null, null, wbib_svc_kei_no, null, null, ope_date, "1");

				// 取得した課金先レコードをArrayListに積む
				for (CAANMsg retMsg : retList)
				{
					retMsgList.add(retMsg);
				}
			}
		}

		return retMsgList;
	}

	/**
	 * <p>
	 * サービス契約番号に紐づく機器オプションサービス契約を取得し、
	 * 更新対象の課金先レコードの検索を行います。
	 * </p>
	 * @param svc_kei_no サービス契約番号
	 * @param ope_date 運用年月日
	 * @return 検索結果の課金先レコード
	 */
	private ArrayList<CAANMsg> getKkopSvcKei(String svc_kei_no, String ope_date)
	{
		//返却用メッセージオブジェクト格納変数
		ArrayList<CAANMsg> retMsgList = new ArrayList<CAANMsg>();
		// 検索パターン
		String searchPattern = "";
		
		/* ----------------------------------------------------------------------------------------------------
		 * 処理対象の「サービス契約」で使用する「サービス契約回線内訳」に紐づく「機器提供サービス契約」を取得する
		 * ---------------------------------------------------------------------------------------------------- */
		// サービス契約番号に紐づく「サービス契約回線内訳」を取得する
		JKKejbKK0251DBABase kk0251Dba = new JKKejbKK0251DBABase();
		CAANMsg[] kk0251ETMsg = kk0251Dba.getKK0251bySvcKei(svc_kei_no, null, ope_date, "2");
		
		// 検索結果が0件の場合
		if (kk0251ETMsg == null || kk0251ETMsg.length == 0)
		{
			return retMsgList;
		}

		// サービス契約回線内訳が特定されるのは1件のみ
		String svcKeiKaisenUcwkNo = kk0251ETMsg[0].getString(KK0251ETMsg.SVC_KEI_KAISEN_UCWK_NO);
		
		// サービス契約回線内訳番号に紐づく「機器提供サービス契約」を取得する
		JKKejbKK0341DBABase kk0341Dba = new JKKejbKK0341DBABase();
		CAANMsg[] kk0341ETMsg = kk0341Dba.getKK0341bySvcKeiKaisenUcwk(svcKeiKaisenUcwkNo, null, ope_date);


		// 処理対象の「サービス契約」の料金コースコードを取得する
		CAANMsg kk0081Msg = getCurrentKK0081(svc_kei_no, ope_date);
		String svcCd = kk0081Msg.getString(KK0081ETMsg.SVC_CD);
		
		if(JKKModelConst.SVC_CD_NET.equals(svcCd)) {
			// ネットに紐づく機器オプションサービス契約を検索する。
			searchPattern = "2";
		} else if(JKKModelConst.SVC_CD_TEL.equals(svcCd)) {
			// 電話に紐づく機器オプションサービス契約を検索する。
			searchPattern = "3";
		} else {
			return retMsgList;
		}

		for (CAANMsg kk0341data : kk0341ETMsg)
		{
			String kktkSvcKeiNo = kk0341data.getString(KK0341ETMsg.KKTK_SVC_KEI_NO);
			String kktkSvcCd = kk0341data.getString(KK0341ETMsg.KKTK_SVC_CD);

// #83846 MOD START
//			if(!JKKModelConst.KKTK_SVC_CD_TAKINORT.equals(kktkSvcCd)) {
			if(!(JKKModelConst.KKTK_SVC_CD_TAKINORT.equals(kktkSvcCd) || JKKModelConst.KKTK_SVC_CD_HGW.equals(kktkSvcCd))) {
// #83846 MOD END
				continue;
			}
			
			// 機器提供サービス契約番号が紐づく機器オプションサービス契約を取得する。
			JKKejbKK2811DBABase kk2811Dba = new JKKejbKK2811DBABase();
			CAANMsg[] kk2811ETMsg = kk2811Dba.getKK2811byKktk(kktkSvcKeiNo, null, ope_date, searchPattern);
		
			for (CAANMsg kk2811Chk : kk2811ETMsg) {
				String kkopSvcKeiNo =  kk2811Chk.getString(KK2811ETMsg.KKOP_SVC_KEI_NO);
				// 機器オプションサービス契約番号に紐づく「課金先」を取得する
				JKKejbKK0321DBABase kk0321Dba = new JKKejbKK0321DBABase();
				CAANMsg[] retList = kk0321Dba.getKK0321byVariKei(null, null, null, null, null, null, null, null, null, ope_date, "1" , kkopSvcKeiNo);
				
				// 取得した課金先レコードをArrayListに積む
				for (CAANMsg retMsg : retList)
				{
					retMsgList.add(retMsg);
				}
			}			

		}	
		return retMsgList;
	}
	//---------v33.00.00 OM-2017-0000594_ADD START---------//
	/**
	 * <p>
	 * サービス契約番号に紐づく機器オプションサービス契約を取得し、
	 * 更新対象の課金先レコードの検索を行います。
	 * </p>
	 * @param svc_kei_no サービス契約番号
	 * @param ope_date 運用年月日
	 * @return 検索結果の課金先レコード
	 */
	private ArrayList<CAANMsg> getKkopSvcKei_02(String svc_kei_no, String ope_date)
	{
		//返却用メッセージオブジェクト格納変数
		ArrayList<CAANMsg> retMsgList = new ArrayList<CAANMsg>();
		// 検索パターン
		String searchPattern = "";
		
		/* ----------------------------------------------------------------------------------------------------
		 * 処理対象の「サービス契約」で使用する「サービス契約回線内訳」に紐づく「機器提供サービス契約」を取得する
		 * ---------------------------------------------------------------------------------------------------- */
		// サービス契約番号に紐づく「サービス契約回線内訳」を取得する
		JKKejbKK0251DBABase kk0251Dba = new JKKejbKK0251DBABase();
		CAANMsg[] kk0251ETMsg = kk0251Dba.getKK0251bySvcKei(svc_kei_no, null, ope_date, "3");
		
		// 検索結果が0件の場合
		if (kk0251ETMsg == null || kk0251ETMsg.length == 0)
		{
			return retMsgList;
		}

		for (CAANMsg retMsg1 : kk0251ETMsg)
		{
			// サービス契約回線内訳が特定されるのは1件のみ
			String svcKeiKaisenUcwkNo = retMsg1.getString(KK0251ETMsg.SVC_KEI_KAISEN_UCWK_NO);
			
			// サービス契約回線内訳番号に紐づく「機器提供サービス契約」を取得する
			JKKejbKK0341DBABase kk0341Dba = new JKKejbKK0341DBABase();
			CAANMsg[] kk0341ETMsg = kk0341Dba.getKK0341bySvcKeiKaisenUcwk(svcKeiKaisenUcwkNo, null, ope_date);


			// 処理対象の「サービス契約」の料金コースコードを取得する
			CAANMsg kk0081Msg = getCurrentKK0081(svc_kei_no, ope_date);
			String svcCd = kk0081Msg.getString(KK0081ETMsg.SVC_CD);
			
			if(JKKModelConst.SVC_CD_NET.equals(svcCd)) {
				// ネットに紐づく機器オプションサービス契約を検索する。
				searchPattern = "2";
			} else if(JKKModelConst.SVC_CD_TEL.equals(svcCd)) {
				// 電話に紐づく機器オプションサービス契約を検索する。
				searchPattern = "3";
			} else {
				return retMsgList;
			}

			for (CAANMsg kk0341data : kk0341ETMsg)
			{
				String kktkSvcKeiNo = kk0341data.getString(KK0341ETMsg.KKTK_SVC_KEI_NO);
				String kktkSvcCd = kk0341data.getString(KK0341ETMsg.KKTK_SVC_CD);
				
// #83846 MOD START
//				if(!JKKModelConst.KKTK_SVC_CD_TAKINORT.equals(kktkSvcCd)) {
				//機器提供サービスコードが多機能ルータ、またはHGWでない場合はスキップする
				if(!(JKKModelConst.KKTK_SVC_CD_TAKINORT.equals(kktkSvcCd) || JKKModelConst.KKTK_SVC_CD_HGW.equals(kktkSvcCd))) {
// #83846 MOD END
					continue;
				}
				
				// 機器提供サービス契約番号が紐づく機器オプションサービス契約を取得する。
				JKKejbKK2811DBABase kk2811Dba = new JKKejbKK2811DBABase();
				// OM-2017-0001164 MOD START
//				CAANMsg[] kk2811ETMsg = kk2811Dba.getKK2811byKktk(kktkSvcKeiNo, null, ope_date, searchPattern);
				CAANMsg[] kk2811ETMsg = kk2811Dba.getKK2811byKktk2(kktkSvcKeiNo, null, ope_date, searchPattern);
				// OM-2017-0001164 MOD END
				
				for (CAANMsg kk2811Chk : kk2811ETMsg) {
					String kkopSvcKeiNo =  kk2811Chk.getString(KK2811ETMsg.KKOP_SVC_KEI_NO);
					// 機器オプションサービス契約番号に紐づく「課金先」を取得する
					JKKejbKK0321DBABase kk0321Dba = new JKKejbKK0321DBABase();
					CAANMsg[] retList = kk0321Dba.getKK0321byVariKei(null, null, null, null, null, null, null, null, null, ope_date, "1" , kkopSvcKeiNo);
					
					// 取得した課金先レコードをArrayListに積む
					for (CAANMsg retMsg : retList)
					{
						retMsgList.add(retMsg);
					}
				}
			}
		}
		return retMsgList;
	}
	//---------v33.00.00 OM-2017-0000594_ADD END-----------//

	/**
	 * <p>
	 * サービス契約のカレントを検索します。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param svcKeiNo 検索対象となるサービス契約番号
	 * @return 取得したサービス契約
	 */
	private CAANMsg getCurrentKK0081(String svcKeiNo, String opeDate)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0081ETMsg.class.getName());
		inETMsg.set(KK0081ETMsg.SVC_KEI_NO, svcKeiNo);
		inETMsg.set(KK0081ETMsg.RSV_APLY_YMD, opeDate);
		
		// サービス契約のカレント検索を行う
		return new JKKejbKK0081DBABase().findByCurrent(inETMsg);
	}

	/**
	 * <p>
	 * 処理対象のネット契約(または電話契約)と同一回線を使用する電話契約(またはネット契約)を返却します。
	 * </p>
	 * @param inSvcKeiNo 処理対象の「サービス契約」のサービス契約番号
	 * @param inSvcCd 処理対象の「サービス契約」のサービスコード
	 * @param svcKeiKaisenUcwkNo 処理対象の「サービス契約」が使用する「サービス契約回線内訳」のサービス契約回線内訳番号
	 * @param opeDate 運用日付
	 * @return 処理対象のネット契約(または電話契約)と同一回線を使用する電話契約(またはネット契約)
	 */
	private CAANMsg getSameKisnNetTelKei(String inSvcKeiNo, String inSvcCd, String svcKeiKaisenUcwkNo, String opeDate)
	{
		// 同一の「サービス契約回線内訳」を使用する「サービス契約」を取得する
		JKKejbKK0081DBABase kk0081Dba = new JKKejbKK0081DBABase();
		CAANMsg[] sameKisnKK0081MsgList = kk0081Dba.getKK0081bySvcKeiKaisenUcwk(svcKeiKaisenUcwkNo, null, opeDate, "1");
		
		// 処理対象のネット契約(または電話契約)と同一回線を使用する電話契約(またはネット契約)を返却する。
		for (CAANMsg sameKisnKK0081Msg : sameKisnKK0081MsgList)
		{
			String sameKisnSvcCd = sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_CD);
			
			// 解約・キャンセル対象の「サービス契約」は対象外
			if (inSvcKeiNo.equals(sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_KEI_NO)))
			{
				continue;
			}

			// 入力がネット契約(または電話契約)の場合、電話契約(またはネット契約)を返却
			if ((JKKModelConst.SVC_CD_NET.equals(inSvcCd) && JKKModelConst.SVC_CD_TEL.equals(sameKisnSvcCd))
					|| (JKKModelConst.SVC_CD_TEL.equals(inSvcCd) && JKKModelConst.SVC_CD_NET.equals(sameKisnSvcCd)))
			{
				return sameKisnKK0081Msg;
			}
		}

		// 処理対象のネット契約(または電話契約)と同一回線を使用する電話契約(またはネット契約)が存在しない場合
		return null;
	}
	//---------v33.00.00 OM-2017-0000594_ADD START---------//
	/**
	 * <p>
	 * 処理対象のネット契約(または電話契約)と同一回線を使用する電話契約(またはネット契約)を返却します。
	 * </p>
	 * @param inSvcKeiNo 処理対象の「サービス契約」のサービス契約番号
	 * @param inSvcCd 処理対象の「サービス契約」のサービスコード
	 * @param svcKeiKaisenUcwkNo 処理対象の「サービス契約」が使用する「サービス契約回線内訳」のサービス契約回線内訳番号
	 * @param opeDate 運用日付
	 * @return 処理対象のネット契約(または電話契約)と同一回線を使用する電話契約(またはネット契約)
	 */
	private CAANMsg getSameKisnNetTelKei_02(String inSvcKeiNo, String inSvcCd, String svcKeiKaisenUcwkNo, String opeDate)
	{
		// 同一の「サービス契約回線内訳」を使用する「サービス契約」を取得する
		JKKejbKK0081DBABase kk0081Dba = new JKKejbKK0081DBABase();
		CAANMsg[] sameKisnKK0081MsgList = kk0081Dba.getKK0081bySvcKeiKaisenUcwk(svcKeiKaisenUcwkNo, null, opeDate, "4");
		
		// 処理対象のネット契約(または電話契約)と同一回線を使用する電話契約(またはネット契約)を返却する。
		for (CAANMsg sameKisnKK0081Msg : sameKisnKK0081MsgList)
		{
			String sameKisnSvcCd = sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_CD);
			
			// 解約・キャンセル対象の「サービス契約」は対象外
			if (inSvcKeiNo.equals(sameKisnKK0081Msg.getString(KK0081ETMsg.SVC_KEI_NO)))
			{
				continue;
			}
			// 入力がネット契約(または電話契約)の場合、電話契約(またはネット契約)を返却
			if ((JKKModelConst.SVC_CD_NET.equals(inSvcCd) && JKKModelConst.SVC_CD_TEL.equals(sameKisnSvcCd))
					|| (JKKModelConst.SVC_CD_TEL.equals(inSvcCd) && JKKModelConst.SVC_CD_NET.equals(sameKisnSvcCd)))
			{
				return sameKisnKK0081Msg;
			}
		}
		// 処理対象のネット契約(または電話契約)と同一回線を使用する電話契約(またはネット契約)が存在しない場合
		return null;
	}
	//---------v33.00.00 OM-2017-0000594_ADD END-----------//

	/**
	 * <p>
	 * 処理対象の「サービス契約」の新規／解約異動時における、
	 * 「サービス契約回線内訳」に紐づく「機器提供サービス契約」の課金先請求契約変更を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inSvcKeiNo サービス契約番号
	 * @param kakinsTstaymd 変更後の「課金先」の課金先適用開始年月日
	 */
	public void kisnKikiKakinsSeikyKeiChg(CAANMsg inMsg, String inSvcKeiNo, String kakinsTstaymd)
	{
		/* ------------------------------------------------------------------------------------------------------------------------
		 * ≪背景≫「サービス契約回線内訳」に紐づく「機器提供サービス契約」のうち、
		 * ネット契約・電話契約で共有する機器(ＯＮＵなど)の「課金先」は、ネット契約が指定する「請求契約」が優先される。
		 * 
		 * 現時点では、ネット契約・電話契約で共有する機器について、ネット契約を優先するパターンのみであるため、
		 * 機器の課金先請求契約変更の副次処理は、ネット契約・電話契約に関する異動(新規／解約)の場合のみ実施する。
		 * 
		 * 例）同一回線で使用するネット契約・電話契約が指定する「請求契約」が異なる場合、
		 * @ネット契約の解約・キャンセル時    ：該当機器の「課金先」を電話契約が指定する「請求契約」に変更する。
		 * Aネット契約の回復・キャンセル取消時：該当機器の「課金先」をネット契約が指定する「請求契約」に変更する。
		 * ------------------------------------------------------------------------------------------------------------------------ */
		JKKejbKK0081DBABase kk0081Dba = new JKKejbKK0081DBABase();
		JKKejbKK0251DBABase kk0251Dba = new JKKejbKK0251DBABase();
		JKKejbKK0341DBABase kk0341Dba = new JKKejbKK0341DBABase();
		String opeDate = JKKModelCommon.getOpeDate(inMsg);

		// サービス契約のカレントレコードを取得する。
		CAANMsg kk0081Msg = kk0081Dba.getKK0081Current(inSvcKeiNo, opeDate);

		// 処理対象がネット契約・電話契約以外の場合、機器の課金先請求契約変更は不要
		String svcCd = kk0081Msg.getString(KK0081ETMsg.SVC_CD);
		if (!JKKModelConst.SVC_CD_NET.equals(svcCd) && !JKKModelConst.SVC_CD_TEL.equals(svcCd))
		{
			return;
		}

		// 該当の「サービス契約」が使用する「サービス契約回線内訳」を取得する。
		CAANMsg[] kk0251MsgList = kk0251Dba.getKK0251bySvcKei(inSvcKeiNo, null, opeDate, "2");

		for (CAANMsg kk0251Msg : kk0251MsgList)
		{
			// サービス契約回線内訳番号
			String svcKeiKaisenUcwkNo = kk0251Msg.getString(KK0251ETMsg.SVC_KEI_KAISEN_UCWK_NO);

			// ネット・電話共有の回線機器について、@ネット契約、A電話契約の優先順位により決定される変更後「請求契約」の請求契約番号
			String[] chafSeikyKeiList =  getChafSeikyKeiNoOfKktkSvcKei(svcKeiKaisenUcwkNo, opeDate);
			String chafSeikyKeiNo = chafSeikyKeiList[0];
			String serachPattern = chafSeikyKeiList[1];
			// 指定なし（該当の回線を使用するネット契約・電話契約が存在しない）の場合、機器の課金先請求契約変更は不要
			if (chafSeikyKeiNo == null || "".equals(chafSeikyKeiNo))
			{
				return;
			}

			// 該当の「サービス契約回線内訳」に紐づく「機器提供サービス契約」を取得する。
			CAANMsg[] kk0341MsgList = kk0341Dba.getKK0341bySvcKeiKaisenUcwk(svcKeiKaisenUcwkNo, null, opeDate);

			for (CAANMsg kk0341Msg : kk0341MsgList)
			{
				// 該当の回線機器が、処理対象のネット契約・電話契約で使用する機器でない場合、課金先請求契約変更は不要
				if (!isPcrsTgKktkSvc(kk0081Msg.getString(KK0081ETMsg.PCRS_CD), kk0341Msg.getString(KK0341ETMsg.KKTK_SVC_CD), opeDate))
				{
					continue;
				}
				// 機器が多機能ルータの場合、優先順の変更を行う機器オプションサービス契約が存在しない場合は、課金先請求契約の変更は不要
				String kktkSvcCd = kk0341Msg.getString(KK0341ETMsg.KKTK_SVC_CD);
// #83846 MOD START
//				if(JKKModelConst.KKTK_SVC_CD_TAKINORT.equals(kktkSvcCd)) {
				if((JKKModelConst.KKTK_SVC_CD_TAKINORT.equals(kktkSvcCd) || JKKModelConst.KKTK_SVC_CD_HGW.equals(kktkSvcCd))) {
// #83846 MOD END
					String kktkSvcKeiNo = kk0341Msg.getString(KK0341ETMsg.KKTK_SVC_KEI_NO);
					
					// 機器提供サービス契約番号が紐づく機器オプションサービス契約を取得する。
					JKKejbKK2811DBABase kk2811Dba = new JKKejbKK2811DBABase();
					CAANMsg[] kk2811ETMsg = kk2811Dba.getKK2811byKktk(kktkSvcKeiNo, null, opeDate, serachPattern);

					if(kk2811ETMsg == null || kk2811ETMsg.length == 0) {
						continue;
					}
					else {
						for(CAANMsg kk2811Msg : kk2811ETMsg) {
							
							// 該当の回線機器の機器オプションサービス契約の課金先請求契約変更
							updateKisnKkopSvcKeiKakins(kk2811Msg.getString(KK2811ETMsg.KKOP_SVC_KEI_NO), chafSeikyKeiNo, kakinsTstaymd, opeDate,
									inMsg.getString(JCMConstants.OPERATE_DATETIME_KEY),
									inMsg.getString(JCMConstants.OPERATOR_ID_KEY));
						}
					}
				}

				// 該当の回線機器の課金先請求契約変更
				updateKisnKktkSvcKeiKakins(kk0341Msg.getString(KK0341ETMsg.KKTK_SVC_KEI_NO), chafSeikyKeiNo, kakinsTstaymd, opeDate,
						inMsg.getString(JCMConstants.OPERATE_DATETIME_KEY),
						inMsg.getString(JCMConstants.OPERATOR_ID_KEY));
			}
		}
	}

	/**
	 * <p>
	 * 「サービス契約回線内訳」に紐づく「機器提供サービス契約」の課金先請求契約変更を行います。
	 * </p>
	 * @param kktkSvcKeiNo 処理対象の機器提供サービス契約番号
	 * @param chafSeikyKeiNo 変更後の「請求契約」の請求契約番号
	 * @param kakinsTstaymd 変更後の「課金先」の課金先適用開始年月日
	 * @param opeDate 運用日付
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 */
	private void updateKisnKktkSvcKeiKakins(String kktkSvcKeiNo, String chafSeikyKeiNo,
			String kakinsTstaymd, String opeDate, String updDtm, String updOpeAct)
	{
		// 該当の「機器提供サービス契約」に紐づく「課金先」を取得する。
		JKKejbKK0321DBABase kk0321Dba = new JKKejbKK0321DBABase();
		CAANMsg[] kk0321MsgList = kk0321Dba.getKK0321byVariKei(null, null,
				kktkSvcKeiNo, null, null, null, null, null, null, opeDate, "1");

		/* ------------------------------------------------------------------------------------------------------------------------
		 * ネット・電話共有の回線機器について、@ネット契約、A電話契約の優先順位により決定される変更後「請求契約」が、
		 * 変更前の「請求契約」と異なる場合、該当の回線機器の課金先請求契約変更を行う。
		 * ------------------------------------------------------------------------------------------------------------------------ */
		// 「課金先」が存在しない場合(課金が発生しない「機器提供サービス契約」のみ)
		if (kk0321MsgList.length == 0)
		{
			return;
		}
		else if (kk0321MsgList.length > 1)
		{
			throw new CAANRuntimeException("機器提供サービス契約に紐づく課金先が複数件存在します。機器提供サービス契約番号 : " + kktkSvcKeiNo);
		}

		// 処理対象の回線機器の変更前「請求契約」の請求契約番号
		String chbfSeikyKeiNo = kk0321MsgList[0].getString(KK0321ETMsg.SEIKY_KEI_NO);
		// 変更前後の「請求契約」が同一の場合、請求契約変更は不要
		if (chafSeikyKeiNo.equals(chbfSeikyKeiNo))
		{
			return;
		}

		//+++ create処理 +++
		CAANMsg createKK0321Data = new CAANMsg(KK0321ETMsg.class.getName());
		//課金先番号(採番)
		createKK0321Data.set(KK0321ETMsg.KAKINS_NO, JKKModelCommon.getFormatedNextSeq(SEQ_KAKINS_NO, PREFIX, KETASUU));
		//請求契約番号
		createKK0321Data.set(KK0321ETMsg.SEIKY_KEI_NO, chafSeikyKeiNo);
		//機器提供サービス契約番号
		createKK0321Data.set(KK0321ETMsg.KKTK_SVC_KEI_NO, kk0321MsgList[0].getString(KK0321ETMsg.KKTK_SVC_KEI_NO));
		//料金項目コード
		createKK0321Data.set(KK0321ETMsg.PRC_KMK_CD, kk0321MsgList[0].getString(KK0321ETMsg.PRC_KMK_CD));
		//課金先適用開始年月日
		createKK0321Data.set(KK0321ETMsg.KAKINS_TSTAYMD, kakinsTstaymd);
		//課金先適用終了年月日
		createKK0321Data.set(KK0321ETMsg.KAKINS_TENDYMD, JKKModelConst.DATE_MAX);
		createKK0321Data.set(KK0321ETMsg.ADD_DTM, updDtm);        // 登録年月日時分秒
		createKK0321Data.set(KK0321ETMsg.ADD_OPEACNT, updOpeAct); // 登録オペレータアカウント
		createKK0321Data.set(KK0321ETMsg.UPD_DTM, updDtm);        // 更新年月日時分秒
		createKK0321Data.set(KK0321ETMsg.UPD_OPEACNT, updOpeAct); // 更新オペレータアカウント
		createKK0321Data.set(KK0321ETMsg.MK_FLG, MKFLG_VALID);    // 無効フラグ

		createKK0321(createKK0321Data);

		//+++ update処理 +++ 
		CAANMsg updateKK0321Data = new CAANMsg(KK0321ETMsg.class.getName());
		//課金先番号
		updateKK0321Data.set(KK0321ETMsg.KAKINS_NO, kk0321MsgList[0].getString(KK0321ETMsg.KAKINS_NO));
		//課金適用終了年月日
		updateKK0321Data.set(KK0321ETMsg.KAKINS_TENDYMD, JKKModelCommon.addDay(kakinsTstaymd, -1));
		updateKK0321Data.set(KK0321ETMsg.UPD_DTM, updDtm);        // 更新年月日時分秒
		updateKK0321Data.set(KK0321ETMsg.UPD_OPEACNT, updOpeAct); // 更新オペレータアカウント

		updateKK0321(updateKK0321Data);
	}

	/**
	 * <p>
	 * 「サービス契約回線内訳」に紐づく「機器オプションサービス契約」の課金先請求契約変更を行います。
	 * </p>
	 * @param kktkSvcKeiNo 処理対象の機器オプションサービス契約番号
	 * @param chafSeikyKeiNo 変更後の「請求契約」の請求契約番号
	 * @param kakinsTstaymd 変更後の「課金先」の課金先適用開始年月日
	 * @param opeDate 運用日付
	 * @param updDtm 更新年月日時分秒
	 * @param updOpeAct 更新オペレータアカウント
	 */
	private void updateKisnKkopSvcKeiKakins(String kkopSvcKeiNo, String chafSeikyKeiNo,
			String kakinsTstaymd, String opeDate, String updDtm, String updOpeAct)
	{
		// 該当の「機器提供サービス契約」に紐づく「課金先」を取得する。
		JKKejbKK0321DBABase kk0321Dba = new JKKejbKK0321DBABase();
		CAANMsg[] kk0321MsgList = kk0321Dba.getKK0321byVariKei(null, null,
				null, null, null, null, null, null, null, opeDate, "1" , kkopSvcKeiNo);

		/* ------------------------------------------------------------------------------------------------------------------------
		 * ネット・電話共有の回線機器について、@ネット契約、A電話契約の優先順位により決定される変更後「請求契約」が、
		 * 変更前の「請求契約」と異なる場合、該当の回線機器の課金先請求契約変更を行う。
		 * ------------------------------------------------------------------------------------------------------------------------ */
		// 「課金先」が存在しない場合(課金が発生しない「機器提供サービス契約」のみ)
		if (kk0321MsgList.length == 0)
		{
			return;
		}
		else if (kk0321MsgList.length > 1)
		{
			throw new CAANRuntimeException("機器提供サービス契約に紐づく課金先が複数件存在します。機器オプションサービス契約番号 : " + kkopSvcKeiNo);
		}

		// 処理対象の回線機器の変更前「請求契約」の請求契約番号
		String chbfSeikyKeiNo = kk0321MsgList[0].getString(KK0321ETMsg.SEIKY_KEI_NO);
		// 変更前後の「請求契約」が同一の場合、請求契約変更は不要
		if (chafSeikyKeiNo.equals(chbfSeikyKeiNo))
		{
			return;
		}

		//+++ create処理 +++
		CAANMsg createKK0321Data = new CAANMsg(KK0321ETMsg.class.getName());
		//課金先番号(採番)
		createKK0321Data.set(KK0321ETMsg.KAKINS_NO, JKKModelCommon.getFormatedNextSeq(SEQ_KAKINS_NO, PREFIX, KETASUU));
		//請求契約番号
		createKK0321Data.set(KK0321ETMsg.SEIKY_KEI_NO, chafSeikyKeiNo);
		//機器オプションサービス契約番号
		createKK0321Data.set(KK0321ETMsg.KKOP_SVC_KEI_NO, kk0321MsgList[0].getString(KK0321ETMsg.KKOP_SVC_KEI_NO));
		//料金項目コード
		createKK0321Data.set(KK0321ETMsg.PRC_KMK_CD, kk0321MsgList[0].getString(KK0321ETMsg.PRC_KMK_CD));
		//課金先適用開始年月日
		createKK0321Data.set(KK0321ETMsg.KAKINS_TSTAYMD, kakinsTstaymd);
		//課金先適用終了年月日
		createKK0321Data.set(KK0321ETMsg.KAKINS_TENDYMD, JKKModelConst.DATE_MAX);
		createKK0321Data.set(KK0321ETMsg.ADD_DTM, updDtm);        // 登録年月日時分秒
		createKK0321Data.set(KK0321ETMsg.ADD_OPEACNT, updOpeAct); // 登録オペレータアカウント
		createKK0321Data.set(KK0321ETMsg.UPD_DTM, updDtm);        // 更新年月日時分秒
		createKK0321Data.set(KK0321ETMsg.UPD_OPEACNT, updOpeAct); // 更新オペレータアカウント
		createKK0321Data.set(KK0321ETMsg.MK_FLG, MKFLG_VALID);    // 無効フラグ

		createKK0321(createKK0321Data);

		//+++ update処理 +++ 
		CAANMsg updateKK0321Data = new CAANMsg(KK0321ETMsg.class.getName());
		//課金先番号
		updateKK0321Data.set(KK0321ETMsg.KAKINS_NO, kk0321MsgList[0].getString(KK0321ETMsg.KAKINS_NO));
		//課金適用終了年月日
		updateKK0321Data.set(KK0321ETMsg.KAKINS_TENDYMD, JKKModelCommon.addDay(kakinsTstaymd, -1));
		updateKK0321Data.set(KK0321ETMsg.UPD_DTM, updDtm);        // 更新年月日時分秒
		updateKK0321Data.set(KK0321ETMsg.UPD_OPEACNT, updOpeAct); // 更新オペレータアカウント

		updateKK0321(updateKK0321Data);
	}

	/**
	 * <p>
	 * ネット契約・電話契約で共有する、入力の「サービス契約回線」に紐づく「機器提供サービス契約」について、
	 * 変更後の「請求契約」の請求契約番号を取得します。
	 * ネット契約・電話契約で指定する「請求契約」のうち、@ネット契約、A電話契約の優先順位で「請求契約」を決定する。
	 * </p>
	 * @param kk0081Msg 処理対象の「サービス契約」メッセージキャリア
	 * @param opeDate 運用日付
	 * @return ネット・電話共有の回線機器について、@ネット契約、A電話契約の優先順位により決定される変更後「請求契約」の請求契約番号<br>
	 *          @が指定する「請求契約」の請求契約番号、A電話契約が指定する「請求契約」の請求契約番号、<br>
	 *          B指定なし（該当の回線を使用するネット契約・電話契約が存在しない場合、課金先請求契約変更不要）<br>
	 */
	private String[] getChafSeikyKeiNoOfKktkSvcKei(String svcKeiKaisenUcwkNo, String opeDate)
	{
		// 該当の「サービス契約回線内訳」を使用する「サービス契約」を取得する。
		JKKejbKK0081DBABase kk0081Dba = new JKKejbKK0081DBABase();
		CAANMsg[] kk0081MsgList = kk0081Dba.getKK0081bySvcKeiKaisenUcwk(svcKeiKaisenUcwkNo, null, opeDate, "1");

		// 解約済、キャンセル済を除外する
		kk0081MsgList = kk0081Dba.getKK0081OutDsLCl(kk0081MsgList);

		// ネット・電話共有の回線機器で指定する、変更後「請求契約」の請求契約番号
		String[] chafSeikyKeiNo = new String[2];
		chafSeikyKeiNo[0] = null;
		chafSeikyKeiNo[1] = null;
		
		// ネット契約が指定する「請求契約」の請求契約番号
		String netSeikyKeiNo = null;
		// 電話契約が指定する「請求契約」の請求契約番号
		String telSeikyKeiNo = null;
		for (CAANMsg kk0081Msg : kk0081MsgList)
		{
			String svcCd = kk0081Msg.getString(KK0081ETMsg.SVC_CD);
			if (JKKModelConst.SVC_CD_NET.equals(svcCd))
			{
				netSeikyKeiNo = getSeikyKeiNoOfSvcKei(kk0081Msg.getString(KK0081ETMsg.SVC_KEI_NO), opeDate);
			}
			else if (JKKModelConst.SVC_CD_TEL.equals(svcCd))
			{
				telSeikyKeiNo = getSeikyKeiNoOfSvcKei(kk0081Msg.getString(KK0081ETMsg.SVC_KEI_NO), opeDate);
			}
		}
		if (netSeikyKeiNo != null && !"".equals(netSeikyKeiNo))
		{
			// ネットの「請求契約」が優先順位１
			chafSeikyKeiNo[0] = netSeikyKeiNo;
			chafSeikyKeiNo[1] = "2";
		}
		else if (telSeikyKeiNo != null && !"".equals(telSeikyKeiNo))
		{
			// 電話の「請求契約」が優先順位２
			chafSeikyKeiNo[0] = telSeikyKeiNo;
			chafSeikyKeiNo[1] = "3";
		}

		return chafSeikyKeiNo;
	}

	/**
	 * <p>
	 * 「サービス契約」に紐づく「課金先」の請求契約番号を取得します。
	 * </p>
	 * @param svcKeiNo サービス契約番号
	 * @param opeDate 運用日付
	 * @return 請求契約番号
	 */
	private String getSeikyKeiNoOfSvcKei(String svcKeiNo, String opeDate)
	{
		// 該当の「サービス契約」に紐づく「課金先」を取得する。
		JKKejbKK0321DBABase kk0321Dba = new JKKejbKK0321DBABase();
		CAANMsg[] kk0321MsgList = kk0321Dba.getKK0321byVariKei(svcKeiNo, null, null, null, null, null, null, null, null, opeDate, "1" );

		// 「課金先」が存在しない場合(ホスティングサービスの「サービス契約」のみ)
		if (kk0321MsgList.length == 0)
		{
			return null;
		}
		else if (kk0321MsgList.length > 1)
		{
			throw new CAANRuntimeException("サービス契約に紐づく課金先が複数件存在します。サービス契約番号 : " + svcKeiNo);
		}

		return kk0321MsgList[0].getString(KK0321ETMsg.SEIKY_KEI_NO);
	}

	/**
	 * <p>
	 * 入力の「機器提供サービス」の機器が、入力の「料金コース」の契約で使用する機器かどうか判定します。
	 * </p>
	 * @param pcrsCd 料金コースコード
	 * @param kktkSvcCd 機器提供サービスコード
	 * @param opeDate 運用日付
	 * @return true[false]:該当の機器が入力の「料金コース」の契約で使用する機器である[ない]場合
	 */
	private boolean isPcrsTgKktkSvc(String pcrsCd, String kktkSvcCd, String opeDate)
	{
		// 入力の「料金コース」、「機器提供サービス」に紐づく「料金コース_機器提供サービス」を取得する。
		JKKejbKK0801DBABase kk0801Dba = new JKKejbKK0801DBABase();
		CAANMsg[] kk0801MsgList = kk0801Dba.getKK0801byPcrs_KktkSvc(pcrsCd, kktkSvcCd, opeDate);

		// 取得件数が０件の場合、該当の機器は入力の「料金コース」の契約で使用する機器でない
		if (kk0801MsgList.length == 0)
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * サービス契約番号に紐づく機器オプションサービス契約を取得し、
	 * 更新対象の課金先レコードの検索を行います。
	 * ただし機器提供サービス契約の親識別コードが「01：サービス契約」のデータのみとする
	 * タブレット端末補償用で使用します
	 * </p>
	 * @param svc_kei_no サービス契約番号
	 * @param ope_date 運用年月日
	 * @return 検索結果の課金先レコード
	 */
	private ArrayList<CAANMsg> getKkopSvcKeiCompsOpPack(String svc_kei_no, String ope_date)
	{
		//返却用メッセージオブジェクト格納変数
		ArrayList<CAANMsg> retMsgList = new ArrayList<CAANMsg>();
				
		// サービス契約番号かつ、親識別コードが「01：サービス契約」に紐づく「機器提供サービス契約」を取得する
		JKKejbKK0341DBABase kk0341Dba = new JKKejbKK0341DBABase();
		CAANMsg[] kk0341ETMsg = kk0341Dba.getKK0341bySvcKei(svc_kei_no, null, ope_date, "1");

		for (CAANMsg kk0341data : kk0341ETMsg)
		{
			String kktkSvcKeiNo = kk0341data.getString(KK0341ETMsg.KKTK_SVC_KEI_NO);
			
			// 機器提供サービス契約番号が紐づく機器オプションサービス契約を取得する。
			JKKejbKK2811DBABase kk2811Dba = new JKKejbKK2811DBABase();
			// OM-2017-0001164 MOD START
//			CAANMsg[] kk2811ETMsg = kk2811Dba.getKK2811byKktk(kktkSvcKeiNo, null, ope_date, "4");
			CAANMsg[] kk2811ETMsg = kk2811Dba.getKK2811byKktk2(kktkSvcKeiNo, null, ope_date, "4");
			// OM-2017-0001164 MOD END
			
			for (CAANMsg kk2811Chk : kk2811ETMsg) {
				String kkopSvcKeiNo =  kk2811Chk.getString(KK2811ETMsg.KKOP_SVC_KEI_NO);
				// 機器オプションサービス契約番号に紐づく「課金先」を取得する
				JKKejbKK0321DBABase kk0321Dba = new JKKejbKK0321DBABase();
				CAANMsg[] retList = kk0321Dba.getKK0321byVariKei(null, null, null, null, null, null, null, null, null, ope_date, "1" , kkopSvcKeiNo);
				
				// 取得した課金先レコードをArrayListに積む
				for (CAANMsg retMsg : retList)
				{
					retMsgList.add(retMsg);
				}
			}			

		}	
		return retMsgList;
	}
	
}
