/*********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *  システム名      ：eo顧客基幹システム
 *  モジュール名    ：JKKejbKK0191KRCK
 *  ソースファイル名：JKKejbKK0191KRCK.java
 *  作成者          ：富士通
 *  日付            ：2012年10月10日
 *＜機能概要＞
 *  サービス契約内訳＜eo光電話＞の関連制約部品クラス
 *＜修正履歴＞
 *  バージョン  修正日      修正者      修正内容
 *  v4.00.00    2012/10/10  富士通      新規作成
 *  v4.00.01    2013/04/18  FJ）阿部    OT-2013-0000656
 *  v4.00.02    2013/04/24  FJ）竹内    IT1-2013-0001033
 *  v5.00.00    2013/07/04  FJ）竹内    ANK-1566-00-00
 *  v5.00.01    2013/07/22  FJ）竹内    LT-2013-0000565
 *  v5.00.02    2013/08/22  FJ）竹内    OM-2013-0000577
 *  v5.00.03    2013/09/19  FJ）寺本    OM-2013-0002238
 *  v5.00.04    2013/09/26  FJ）寺園    OM-2013-0002623
 *  v6.00.00    2013/12/25  FJ）寺園    OM-2013-0005329
 *  v6.00.01    2013/12/28  FJ）小島    OM-2013-0004237
 *  v7.00.00    2013/11/29  FJ）小島    ANK-1578-00-00
 *  v7.00.01    2013/12/17  FJ）松枝    ANK-1578-00-00
 *  v6.00.02    2013/12/29  FJ）小島    OM-2013-0004237
 *  v6.00.03    2013/12/29  FJ）小島    OM-2013-0004237
 *  v7.00.02    2014/01/16  FJ）小島    IT1-2014-0000024
 *  v7.00.03    2014/01/21  FJ）小島    ANK-1862-00-00
 *  v8.00.00	2014/04/04	FJ）宇野	OM-2014-0001009
 *  v8.00.01	2014/04/15	FJ）宇野	OM-2014-0001273
 *  v10.00.00   2014/10/01  FJ）星野    OM-2014-0003013
 *  v13.00.00   2015/05/01  FJ) 藤田	OM-2015-0000315 電話機能解約SOD発行済みチェック追加
 *  v13.01.00   2015/05/01  FJ) 藤田	OM-2015-0000834 電話機能解約SOD発行済みチェック追加
 *  v14.00.00   2015/06/15  FJ) 森脇	OM-2014-0003914
 *  v15.00.00   2015/07/31  FJ) 松岡	OM-2015-0001615
 *  v49.00.00   2020/06/04  FJ) 星野	OM-2020-0000258
 *	v61.00.00   2022/12/13  FJ) 澤田   【ANK-4315-00-00】【eo定期】 eoホームゲートウェイ導入対応】
 *  v72.00.00	2024/05/27	 FJ)寺田   【ANK-4494-00-00】【eo定期】 双方向番ポ対応
 **********************************************************************/

package eo.ejb.common.entity;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.model.base.CAANConnectionMgr;
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.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK0161ETMsg;
import eo.ejb.cbm.entity.KK0191ETMsg;
import eo.ejb.cbm.entity.KK0251ETMsg;
import eo.ejb.cbm.entity.KK0341ETMsg;
import eo.ejb.cbm.entity.KK0351ETMsg;
import eo.ejb.cbm.entity.KK1041ETMsg;
import eo.ejb.cbm.entity.KK1041LE;
import eo.ejb.cbm.entity.KK1081ETMsg;
import eo.ejb.cbm.entity.KK1081LE;
import eo.ejb.cbm.entity.KK1551ETMsg;
import eo.ejb.cbm.entity.KK1551LE;
import eo.ejb.cbm.entity.TU0071ETMsg;
import eo.ejb.cbm.entity.ZM0081ETMsg;
import eo.ejb.cbm.entity.ZM0411ETMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.JKKejbCallTypeChecker;
import eo.ejb.common.db.JKKejbKK0081DBABase;
import eo.ejb.common.db.JKKejbKK0161DBABase;
import eo.ejb.common.db.JKKejbKK0191DBABase;
import eo.ejb.common.db.JKKejbKK0251DBABase;
import eo.ejb.common.db.JKKejbKK0341DBABase;
import eo.ejb.common.db.JKKejbTU0071DBABase;
import eo.ejb.common.db.JKKejbZM0081DBABase;
import eo.ejb.common.db.JKKejbZM0411DBABase;

/**
 * <p>
 * サービス契約内訳＜eo光電話＞の関連制約部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK0191KRCK extends JKKejbKK0191DBABase
{

	/**
	 * <p>
	 * 新しいJKKejbKK0191KRCKを作成します。
	 * </p>
	 */
	public JKKejbKK0191KRCK()
	{
		super();
	}

	/**
	 * 番ポ可能エリア存在チェック処理
	 * <p>
	 * 対象の判定局番に紐付く番ポ可能エリア対象局番が存在しているかのチェックを行う
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 指定された電話番号に紐付く番ポ可能エリア対象局番が存在する場合、true
	 *          上記以外の場合はfalse。
	 */
	public boolean isExistsBmpArea(CAANMsg inMsg, AgentDispatchContext inContext)
	{
// ANK-4494-00-00 DEL START
//		// 開始ログ出力
//		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JKKejbKK0191KRCK#isExistsBmpArea");
//
//		// 番ポ可能エリア対象局番の内部スキーマメッセージ
//		CAANMsg inTU0071ETMsg = new CAANMsg(TU0071ETMsg.class.getName());
//		inTU0071ETMsg.set(TU0071ETMsg.JUDGE_KYOKU_NO, inMsg.getString(KK0191ETMsg.TELNO).substring(0, 7));
//
//		// 番ポ可能エリア対象局番のカレントレコードを取得する
//		CAANMsg outTU0071ETMsg = new JKKejbTU0071DBABase().findByCurrent(inTU0071ETMsg);
//
//		// カレントレコードが取得できない場合、false
//		if (null == outTU0071ETMsg)
//		{
//			return false;
//		}
//		
// ANK-4494-00-00 DEL END
		// 取得できた場合、true
		return true;
	}

	/**
	 * <p>
	 * ＜eo光電話＞の緊急通報用情報の同一性チェックを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo サービス契約番号
	 * @param svcKeiUcwkNo サービス契約内訳番号
	 * @return true：すべてのサービス契約内訳＜eo光電話＞の緊急通報用情報が一致する場合、false：一致しない場合
	 */
	public boolean isEmgInfoMatch(CAANMsg inMsg, AgentDispatchContext inContext, String svcKeiNo, String svcKeiUcwkNo) {

		// コネクション
		Connection con = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// SQL文
		StringBuffer sbSql = new StringBuffer();

		try
		{
			// 対象テーブルのコネクション取得
			con = JSYejbConnection.getConnection(KK0191ETMsg.getTableName());
			
	   sbSql.append(" SELECT COUNT(*) AS CNT ")
			.append(" FROM ")
			.append("     ( ")
			.append("      SELECT KK0191.* ,")
			.append("             KK0081.SVC_KEI_NO")
			.append("      FROM   KK_T_SVC_KEI KK0081 ")
			.append("      INNER  JOIN  KK_T_SVC_KEI_UCWK KK0161 ")
			.append("      ON     KK0161.SVC_KEI_NO = KK0081.SVC_KEI_NO ")
			.append("      INNER  JOIN  KK_T_SVKEIUW_EOH_TEL KK0191 ")
			.append("      ON     KK0191.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO ")
			.append("      AND    KK0191.GENE_ADD_DTM = KK0161.GENE_ADD_DTM ")
			.append("      WHERE  KK0161.SVC_KEI_UCWK_NO = ? ")
			.append("      AND KK0161.SVC_KEI_UCWK_STAT IN ('910','920') ")
			.append("      AND   (KK0081.SVC_KEI_NO, KK0081.RSV_APLY_YMD || KK0081.GENE_ADD_DTM) = ( ")
			.append("             SELECT KK0081_GENE.SVC_KEI_NO, MAX(KK0081_GENE.RSV_APLY_YMD || KK0081_GENE.GENE_ADD_DTM) ")
			.append("             FROM   KK_T_SVC_KEI KK0081_GENE ")
			.append("             WHERE  KK0081_GENE.SVC_KEI_NO = KK0081.SVC_KEI_NO ")
			.append("             AND    KK0081_GENE.RSV_APLY_YMD <= ? ")
			.append("             AND    KK0081_GENE.RSV_APLY_CD = '2' ")
			.append("             AND    KK0081_GENE.MK_FLG = '0' ")
			.append("             GROUP BY KK0081_GENE.SVC_KEI_NO) ")
			.append("      AND   (KK0161.SVC_KEI_UCWK_NO, KK0161.RSV_APLY_YMD || KK0161.GENE_ADD_DTM) =   ")
			.append("            (SELECT KK0161_GENE.SVC_KEI_UCWK_NO, MAX(KK0161_GENE.RSV_APLY_YMD || KK0161_GENE.GENE_ADD_DTM) AS KK0161_MAX   ")
			.append("             FROM   KK_T_SVC_KEI_UCWK KK0161_GENE   ")
			.append("             WHERE  KK0161_GENE.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO   ")
			.append("             AND    KK0161_GENE.RSV_APLY_CD = '2'   ")
			.append("             AND    KK0161_GENE.RSV_APLY_YMD <= ?   ")
			.append("             AND    KK0161_GENE.MK_FLG = '0'   ")
			.append("             GROUP BY KK0161_GENE.SVC_KEI_UCWK_NO)   ")
			.append("      ) KK0191_01 ")
			.append("    ,( ")
			.append("      SELECT KK0191.* ,")
			.append("             KK0081.SVC_KEI_NO")
			.append("      FROM   KK_T_SVC_KEI KK0081 ")
			.append("      INNER  JOIN  KK_T_SVC_KEI_UCWK KK0161 ")
			.append("      ON     KK0161.SVC_KEI_NO = KK0081.SVC_KEI_NO ")
			.append("      INNER  JOIN  KK_T_SVKEIUW_EOH_TEL KK0191 ")
			.append("      ON     KK0191.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO ")
			.append("      AND    KK0191.GENE_ADD_DTM = KK0161.GENE_ADD_DTM ")
			.append("      WHERE  KK0081.SVC_KEI_NO = ? ")
			.append("      AND KK0161.SVC_KEI_UCWK_STAT IN ('020','030','100','210','220') ")
			.append("      AND KK0081.PCRS_CD = 'A31'")
			.append("      AND   (KK0081.SVC_KEI_NO, KK0081.RSV_APLY_YMD || KK0081.GENE_ADD_DTM) = ( ")
			.append("             SELECT KK0081_GENE.SVC_KEI_NO, MAX(KK0081_GENE.RSV_APLY_YMD || KK0081_GENE.GENE_ADD_DTM) ")
			.append("             FROM   KK_T_SVC_KEI KK0081_GENE ")
			.append("             WHERE  KK0081_GENE.SVC_KEI_NO = KK0081.SVC_KEI_NO ")
			.append("             AND    KK0081_GENE.RSV_APLY_YMD <= ? ")
			.append("             AND    KK0081_GENE.RSV_APLY_CD = '2' ")
			.append("             AND    KK0081_GENE.MK_FLG = '0' ")
			.append("             GROUP BY KK0081_GENE.SVC_KEI_NO) ")
			.append("      AND   (KK0161.SVC_KEI_UCWK_NO, KK0161.RSV_APLY_YMD || KK0161.GENE_ADD_DTM) =   ")
			.append("            (SELECT KK0161_GENE.SVC_KEI_UCWK_NO, MAX(KK0161_GENE.RSV_APLY_YMD || KK0161_GENE.GENE_ADD_DTM) AS KK0161_MAX   ")
			.append("             FROM   KK_T_SVC_KEI_UCWK KK0161_GENE   ")
			.append("             WHERE  KK0161_GENE.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO   ")
			.append("             AND    KK0161_GENE.RSV_APLY_CD = '2'   ")
			.append("             AND    KK0161_GENE.RSV_APLY_YMD <= ?   ")
			.append("             AND    KK0161_GENE.MK_FLG = '0'   ")
			.append("             GROUP BY KK0161_GENE.SVC_KEI_UCWK_NO)   ")
			.append("      ) KK0191_02 ")
			.append(" WHERE ")
			.append("     (KK0191_01.SVC_KEI_NO || KK0191_01.EMG_AD_CD || KK0191_01.EMG_HOSEI_PCD || KK0191_01.EMG_STATE_NM || KK0191_01.EMG_CITY_NM || KK0191_01.EMG_OAZTSU_NM || ")
			.append("      KK0191_01.EMG_AZCHO_NM || KK0191_01.EMG_BNCHIGO || KK0191_01.EMG_ADRTTM || KK0191_01.EMG_ADRRM || ")
			.append("      KK0191_01.EMG_KSH_NM || KK0191_01.EMG_KSH_KANA) != ")
			.append("     (KK0191_02.SVC_KEI_NO || KK0191_02.EMG_AD_CD || KK0191_02.EMG_HOSEI_PCD || KK0191_02.EMG_STATE_NM || KK0191_02.EMG_CITY_NM || KK0191_02.EMG_OAZTSU_NM || ")
			.append("      KK0191_02.EMG_AZCHO_NM || KK0191_02.EMG_BNCHIGO || KK0191_02.EMG_ADRTTM || KK0191_02.EMG_ADRRM || ")
			.append("      KK0191_02.EMG_KSH_NM || KK0191_02.EMG_KSH_KANA) ");

			// repareStatementにSQL文をセット
			pstmt = con.prepareStatement(sbSql.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sbSql);
			
			// パラメータの設定(サービス契約内訳番号)
			CAANJDBCUtil.setParam(pstmt, 1, svcKeiUcwkNo);
			// パラメータの設定(運用日付)
			CAANJDBCUtil.setParam(pstmt, 2, JKKModelCommon.getOpeDate(inMsg));
			// パラメータの設定(運用日付)
			CAANJDBCUtil.setParam(pstmt, 3, JKKModelCommon.getOpeDate(inMsg));
			// パラメータの設定(サービス契約番号)
			CAANJDBCUtil.setParam(pstmt, 4, svcKeiNo);
			// パラメータの設定(運用日付)
			CAANJDBCUtil.setParam(pstmt, 5, JKKModelCommon.getOpeDate(inMsg));
			// パラメータの設定(運用日付)
			CAANJDBCUtil.setParam(pstmt, 6, JKKModelCommon.getOpeDate(inMsg));
			
			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();
			if (rsltQuery.next())
			{
				if(rsltQuery.getInt("CNT") > 0)
				{
					return false;
				}
				// 取得結果が0件の場合、チェックOK
				return true;
			}
			return false;
			
		} catch(SQLException se)
		{
			throw new CAANRuntimeException(se);
		}
		finally
		{
			// 資源の解放
			try
			{
				if(rsltQuery != null)
				{
					rsltQuery.close();
				}
				if(pstmt != null)
				{
					pstmt.close();
				}
				if(con != null)
				{
					CAANConnectionMgr.getInstance().close(con);
				}
			}
			catch(SQLException se)
			{
				throw new CAANRuntimeException(se);
			}
		}
	}

	/**
	 * <p>
	 * 未返却ＶＡ解約ＳＯＤ発行チェックを行います。(サービス契約内訳＜eo光電話＞登録時チェック用)
	 * </p>
	 * 当該電話番号が以下２つの条件に合致する場合、エラーとする。<br>
	 * @過去に他の「サービス契約」(eo光電話)で当該電話番号が使用されていた。<br>
	 * A以下のSODがいずれも未発行である。<br>
	 * ・@の「サービス契約」(eo光電話)の解約に伴う、VA機器の解約(または消去)SOD<br>
	 * ・当該電話番号の光電話・番号解約に伴う、VA機器の変更(電話番号解約)SOD<br>
	 * ・当該電話番号の光電話・番号変更に伴う、VA機器の変更(電話番号変更)SOD<br>
	 * ※該当のVA機器が未返却である場合に、当該電話番号の再利用が可能となるのを防ぐため。
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo チェック対象となる「サービス契約」のサービス契約番号
	 * @param telno チェック対象となる電話番号
	 * @return false:該当の電話番号を過去に使用していた「サービス契約」(eo光電話)のVA機器に対する解約(または消去)SODが未発行である場合<br>
	 *          true:上記以外
	 */
	public boolean isMiRtnVADslSodHakForAddSvkeiuw(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcKeiNo, String telno)
	{
		// サービス契約番号、または電話番号が未設定の場合、チェック対象外
		if ((svcKeiNo == null || svcKeiNo.isEmpty()) || (telno == null || telno.isEmpty()))
		{
			return true;
		}

		// フロント以外の場合に実施する
		if (JKKejbCallTypeChecker.isCallTypeFront(inContext))
		{
			return true;
		}

		ArrayList<String> telnoList = new ArrayList<String>();
		telnoList.add(telno);

		return isMiRtnVADslSodHak(inCBSMsg, svcKeiNo, telnoList);
	}

	/**
	 * <p>
	 * 未返却ＶＡ解約ＳＯＤ発行チェックを行います。(サービス契約内訳＜eo光電話＞更新時チェック用)
	 * </p>
	 * 当該電話番号が以下２つの条件に合致する場合、エラーとする。<br>
	 * @過去に他の「サービス契約」(eo光電話)で当該電話番号が使用されていた。<br>
	 * A以下のSODがいずれも未発行である。<br>
	 * ・@の「サービス契約」(eo光電話)の解約に伴う、VA機器の解約(または消去)SOD<br>
	 * ・当該電話番号の光電話・番号解約に伴う、VA機器の変更(電話番号解約)SOD<br>
	 * ・当該電話番号の光電話・番号変更に伴う、VA機器の変更(電話番号変更)SOD<br>
	 * ※該当のVA機器が未返却である場合に、当該電話番号の再利用が可能となるのを防ぐため。
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiUcwkNo チェック対象となる「サービス契約内訳」のサービス契約内訳番号
	 * @param telno チェック対象となる電話番号
	 * @return false:該当の電話番号を過去に使用していた「サービス契約」(eo光電話)のVA機器に対する解約(または消去)SODが未発行である場合<br>
	 *          true:上記以外
	 */
	public boolean isMiRtnVADslSodHakForUpdSvkeiuw(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcKeiUcwkNo, String telno)
	{
		// サービス契約内訳番号、または電話番号が未設定の場合、チェック対象外
		if ((svcKeiUcwkNo == null || svcKeiUcwkNo.isEmpty()) || (telno == null || telno.isEmpty()))
		{
			return true;
		}

		// サービス契約内訳のカレントレコードを取得する。
		JKKejbKK0161DBABase kk0161Dba = new JKKejbKK0161DBABase();
		CAANMsg kk0161Msg = kk0161Dba.getKK0161Current(svcKeiUcwkNo, JKKModelCommon.getOpeDate(inCBSMsg));

		ArrayList<String> telnoList = new ArrayList<String>();
		telnoList.add(telno);

		return isMiRtnVADslSodHak(inCBSMsg, kk0161Msg.getString(KK0161ETMsg.SVC_KEI_NO), telnoList);
	}

	/**
	 * <p>
	 * 未返却ＶＡ解約ＳＯＤ発行チェック
	 * </p>
	 * 当該電話番号が以下２つの条件に合致する場合、エラーとする。<br>
	 * @過去に他の「サービス契約」(eo光電話)で当該電話番号が使用されていた。<br>
	 * A以下のSODがいずれも未発行である。<br>
	 * ・@の「サービス契約」(eo光電話)の解約に伴う、VA機器の解約(または消去)SOD<br>
	 * ・当該電話番号の光電話・番号解約に伴う、VA機器の変更(電話番号解約)SOD<br>
	 * ・当該電話番号の光電話・番号変更に伴う、VA機器の変更(電話番号変更)SOD<br>
	 * ※該当のVA機器が未返却である場合に、当該電話番号の再利用が可能となるのを防ぐため。
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param svcKeiNo チェック対象となる「サービス契約」のサービス契約番号
	 * @param telnoList チェック対象となる電話番号リスト
	 * @return false:該当の電話番号を過去に使用していた「サービス契約」(eo光電話)のVA機器に対する解約(または消去)SODが未発行である場合<br>
	 *          true:上記以外
	 */
	public boolean isMiRtnVADslSodHak(CAANMsg inCBSMsg, String svcKeiNo, ArrayList<String> telnoList)
	{
		// 運用日付
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		
		if (telnoList.size() == 0) 
		{
			return true;
		}
		
		// 当該電話番号に紐づく「サービス契約内訳＜eo光電話＞」のサービス契約内訳番号、サービス契約番号、VA機器変更番号(履歴世代含む)を取得する。
		// ※電話番号(サービス契約内訳番号)、VAまたは多機能ルーター機器(VA機器変更番号)単位のＮ件取得する。
		ArrayList<HashMap<String, String>> retKK0191MsgList = getVaKikiChgNo(telnoList, opeDate);
		for (HashMap<String, String> retKK0191Msg : retKK0191MsgList)
		{
			// 当該電話番号に紐づく「サービス契約」(処理対象となる電話契約含む)のサービス契約番号
			String retSvcKeiNo = retKK0191Msg.get(KK0161ETMsg.SVC_KEI_NO);

			// 過去に当該電話番号を使用していた「サービス契約」のみチェック対象とする。(処理対象となる電話契約はチェック対象外)
			if (retSvcKeiNo.equals(svcKeiNo))
			{
				continue;
			}

			// 当該電話番号に紐づく「サービス契約内訳」のサービス契約内訳番号
			String svcKeiUcwkNo = retKK0191Msg.get(KK0161ETMsg.SVC_KEI_UCWK_NO);
			
			// 未返却ＶＡ解約ＳＯＤ発行チェック実行判定の返却値がfalseの場合、チェック対象外とする
			if (!isMiRtnVADslSodHakRunChk(inCBSMsg, svcKeiUcwkNo))
			{
				continue;
			}
			
			// サービス契約内訳番号に紐づくカレントの「サービス契約内訳＜eo光電話＞」の電話番号を取得する。
			String telNo = getCurrentTelNo(svcKeiUcwkNo, opeDate);
			boolean flg = false;
			
			// カレントの電話番号が電話番号リストに存在しない場合はチェック対象外
			for (String telNoTmp: telnoList)
			{
				if (telNoTmp.equals(telNo))
				{
					flg = true;
					break;
				}
			}
			if (!flg)
			{
				continue;
			}

			// 該当の「サービス契約」、VA機器変更番号に紐づく機器の宅内機器型式コード、機器製造番号を取得する。
			ArrayList<HashMap<String, String>> retKK0341MsgList = getVaModelCdSeizoNo(retSvcKeiNo,
					(String)retKK0191Msg.get(KK0191ETMsg.VA_KIKI_CHG_NO), opeDate);
			for (HashMap<String, String> retKK0341Msg : retKK0341MsgList)
			{
				// 以下のSODがいずれも未発行である場合、チェックＮＧ
				// ・「サービス契約」(eo光電話)の解約、または機器返品などに伴う、VAまたは多機能ルーター機器の解約(または消去)SOD
				// ・当該電話番号の光電話・番号解約に伴う、VAまたは多機能ルーター機器の変更(電話番号解約)SOD
				// ・当該電話番号の光電話・番号変更に伴う、VAまたは多機能ルーター機器の変更(電話番号変更)SOD
				// OM-2015-0000315,OM-2015-0000834 電話機能解約SOD発行済みチェック追加 2015/05/01 藤田 MOD START
//				if (!isKikiDslSodHakZm(retKK0341Msg) && !isOlsSetTlnDslSodHakZm(retSvcKeiNo, svcKeiUcwkNo, retKK0341Msg, opeDate))
				// ・当該電話番号の光電話・番号変更に伴う、215 : OLS設定・解約SOD
				// ・当該電話番号の光電話・番号変更に伴う、216 : OLS設定・消去SOD
				// ・当該電話番号の光電話・番号変更に伴う、417 : 多機能ルーター設定・変更(VA機能・解約)SOD
				// ・当該電話番号の光電話・番号変更に伴う、421 : 多機能ルーター設定・解約(VA機能・解約)SOD
				// ・当該電話番号の光電話・番号変更に伴う、422 : 多機能ルーター設定・消去(VA機能・解約)SOD
				if (!isKikiDslSodHakZm(retKK0341Msg) 
				  && !isOlsSetTlnDslSodHakZm(retSvcKeiNo, svcKeiUcwkNo, retKK0341Msg, opeDate)
				  && !isTelFuncDslSodHakZm(retSvcKeiNo, retKK0341Msg, opeDate))
				// OM-2015-0000315,OM-2015-0000834 電話機能解約SOD発行済みチェック追加 2015/05/01 藤田 MOD END
				{
					return false;
				}
			}
		}

		// 上記エラー条件に該当しなかった場合、チェックＯＫ
		return true;
	}

	/**
	 * <p>
	 * 該当の電話番号に紐づく「サービス契約内訳＜eo光電話＞」のサービス契約内訳番号、サービス契約番号、VA機器変更番号(履歴世代含む)を取得します。
	 * </p>
	 * @param telnoList 電話番号リスト
	 * @param stdYmd 基準年月日
	 * @return 該当の電話番号に紐づく「サービス契約内訳＜eo光電話＞」のサービス契約内訳番号、サービス契約番号、VA機器変更番号
	 */
	private ArrayList<HashMap<String, String>> getVaKikiChgNo(ArrayList<String> telnoList, String stdYmd)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// バインド変数設定値保持用領域
		ArrayList<Object> arraylist = new ArrayList<Object>();
		// PreparedStatementのパラメータカウント
		int iPCnt = 0;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0161ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT KK0161.SVC_KEI_UCWK_NO ");
			sql_Buff.append("      , KK0161.SVC_KEI_NO ");
			sql_Buff.append("      , KK0191.VA_KIKI_CHG_NO ");
			sql_Buff.append(" FROM   KK_T_SVC_KEI_UCWK KK0161 ");
			sql_Buff.append(" INNER JOIN KK_T_SVKEIUW_EOH_TEL KK0191 ");
			sql_Buff.append(" ON     KK0191.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO ");
			sql_Buff.append(" AND    KK0191.GENE_ADD_DTM = KK0161.GENE_ADD_DTM ");
			sql_Buff.append(" WHERE  KK0191.TELNO IN ( ");
			// 電話番号リストの値をカンマ区切りで複数指定
			for (int i = 0; i < telnoList.size(); i++)
			{
				if (i > 0)
				{
					sql_Buff.append(" , ");
				}
				sql_Buff.append(" ? ");
				arraylist.add(telnoList.get(i));
			}
			sql_Buff.append(" ) ");
			sql_Buff.append(" AND    KK0191.VA_KIKI_CHG_NO IS NOT NULL ");
			sql_Buff.append(" AND    KK0161.RSV_APLY_YMD <= ? ");
			sql_Buff.append(" AND    KK0161.RSV_APLY_CD = '2' ");
			sql_Buff.append(" AND    KK0161.MK_FLG = '0' ");
			sql_Buff.append(" GROUP BY KK0161.SVC_KEI_UCWK_NO, KK0161.SVC_KEI_NO, KK0191.VA_KIKI_CHG_NO ");
			arraylist.add(stdYmd);

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// バインド変数設定
			for (int iCnt = 0; iCnt < arraylist.size(); iCnt++)
			{
				// バインド変数に設定
				CAANJDBCUtil.setParam(pstmt, ++iPCnt, arraylist.get(iCnt));
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 返却用リスト
			ArrayList<HashMap<String, String>> retArray = new ArrayList<HashMap<String, String>>();
			// 返却用サービス契約情報
			HashMap<String, String> retSvcKei = null;

			// 取得結果の設定
			while (rsltQuery.next())
			{
				retSvcKei = new HashMap<String, String>();

				retSvcKei.put(KK0161ETMsg.SVC_KEI_UCWK_NO, rsltQuery.getString(KK0161ETMsg.SVC_KEI_UCWK_NO));
				retSvcKei.put(KK0161ETMsg.SVC_KEI_NO, rsltQuery.getString(KK0161ETMsg.SVC_KEI_NO));
				retSvcKei.put(KK0191ETMsg.VA_KIKI_CHG_NO, rsltQuery.getString(KK0191ETMsg.VA_KIKI_CHG_NO));

				retArray.add(retSvcKei);
			}

			return retArray;
		}
		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);
			}
		}
	}
	
	/**
	 * <p>
	 * 該当のサービス契約内訳番号に紐づくカレントの「サービス契約内訳＜eo光電話＞」の電話番号を取得します。
	 * </p>
	 * @param svcKeiUcwkNo サービス契約内訳番号
	 * @param stdYmd 基準年月日
	 * @return 該当のサービス契約内訳番号に紐づくカレントの「サービス契約内訳＜eo光電話＞」の電話番号
	 */
	private String getCurrentTelNo(String svcKeiUcwkNo, String stdYmd)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// バインド変数設定値保持用領域
		ArrayList<Object> arraylist = new ArrayList<Object>();
		// PreparedStatementのパラメータカウント
		int iPCnt = 0;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0161ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT KK0191.TELNO ");
			sql_Buff.append(" FROM   KK_T_SVC_KEI_UCWK KK0161 ");
			sql_Buff.append(" INNER JOIN KK_T_SVKEIUW_EOH_TEL KK0191 ");
			sql_Buff.append(" ON     KK0191.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO ");
			sql_Buff.append(" AND    KK0191.GENE_ADD_DTM = KK0161.GENE_ADD_DTM ");
			sql_Buff.append(" WHERE  (KK0161.SVC_KEI_UCWK_NO, KK0161.GENE_ADD_DTM || KK0161.RSV_APLY_YMD) = ");
			sql_Buff.append("     (SELECT KK0161_GENE.SVC_KEI_UCWK_NO, MAX(KK0161_GENE.GENE_ADD_DTM || KK0161_GENE.RSV_APLY_YMD) KK0161_MAX ");
			sql_Buff.append("      FROM   KK_T_SVC_KEI_UCWK KK0161_GENE ");
			sql_Buff.append("      WHERE  KK0161_GENE.SVC_KEI_UCWK_NO = ? ");
			sql_Buff.append("      AND    KK0161_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("      AND    KK0161_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("      AND    KK0161_GENE.MK_FLG = '0' ");
			sql_Buff.append("      GROUP BY KK0161_GENE.SVC_KEI_UCWK_NO ");
			sql_Buff.append("     ) ");
			arraylist.add(svcKeiUcwkNo);
			arraylist.add(stdYmd);

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// バインド変数設定
			for (int iCnt = 0; iCnt < arraylist.size(); iCnt++)
			{
				// バインド変数に設定
				CAANJDBCUtil.setParam(pstmt, ++iPCnt, arraylist.get(iCnt));
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 取得結果の設定
			if (rsltQuery.next())
			{
				return rsltQuery.getString(KK0191ETMsg.TELNO);
			}

			return null;
		}
		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);
			}
		}
	}

	/**
	 * <p>
	 * 該当の「サービス契約」で使用する「機器提供サービス契約」(光電話用ＶＡ)の機器情報(歴代世代含む)のうち、
	 * 指定されたVA機器変更番号に紐づく機器の宅内機器型式コード、機器製造番号を取得します。
	 * </p>
	 * @param svcKeiNo サービス契約番号
	 * @param vaKikiChgNo VA機器変更番号(サービス契約内訳＜eo光電話＞.VA機器変更番号)
	 * @return 該当の「サービス契約」、VA機器変更番号に紐づく機器の宅内機器型式コード、機器製造番号
	 */
	private ArrayList<HashMap<String, String>> getVaModelCdSeizoNo(String svcKeiNo, String vaKikiChgNo, String stdYmd)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// バインド変数設定値保持用領域
		ArrayList<Object> arraylist = new ArrayList<Object>();
		// PreparedStatementのパラメータカウント
		int iPCnt = 0;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0341ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT KK0341.KKTK_SVC_KEI_NO ");
			sql_Buff.append("      , KK0341.TAKNKIKI_MODEL_CD ");
			sql_Buff.append("      , KK0341.KIKI_SEIZO_NO ");
			sql_Buff.append("      , KK0341.KKTK_SVC_CD ");
			sql_Buff.append(" FROM   KK_T_KKTK_SVC_KEI KK0341 ");
			// ANK-4315-00-00 MOD START
//			sql_Buff.append(" WHERE  KK0341.KKTK_SVC_CD IN ('C004', 'C024') ");
			sql_Buff.append(" WHERE  KK0341.KKTK_SVC_CD IN ('C004', 'C024', 'C025') ");
			// ANK-4315-00-00 MOD END
			sql_Buff.append(" AND    KK0341.TAKNKIKI_MODEL_CD IS NOT NULL ");
			sql_Buff.append(" AND    KK0341.KIKI_SEIZO_NO IS NOT NULL ");
			sql_Buff.append(" AND    KK0341.KIKI_CHG_NO = ? ");
			sql_Buff.append(" AND    KK0341.RSV_APLY_YMD <= ? ");
			sql_Buff.append(" AND    KK0341.RSV_APLY_CD = '2' ");
			sql_Buff.append(" AND    KK0341.MK_FLG = '0' ");
			sql_Buff.append(" GROUP BY KK0341.KKTK_SVC_KEI_NO, KK0341.TAKNKIKI_MODEL_CD, KK0341.KIKI_SEIZO_NO, KK0341.KKTK_SVC_CD ");
			arraylist.add(vaKikiChgNo);
			arraylist.add(stdYmd);

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// バインド変数設定
			for (int iCnt = 0; iCnt < arraylist.size(); iCnt++)
			{
				// バインド変数に設定
				CAANJDBCUtil.setParam(pstmt, ++iPCnt, arraylist.get(iCnt));
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 返却用リスト
			ArrayList<HashMap<String, String>> retArray = new ArrayList<HashMap<String, String>>();
			// 返却用サービス契約情報
			HashMap<String, String> retSvcKei = null;

			// 取得結果の設定
			while (rsltQuery.next())
			{
				retSvcKei = new HashMap<String, String>();

				retSvcKei.put(KK0341ETMsg.KKTK_SVC_KEI_NO, rsltQuery.getString(KK0341ETMsg.KKTK_SVC_KEI_NO));
				retSvcKei.put(KK0341ETMsg.TAKNKIKI_MODEL_CD, rsltQuery.getString(KK0341ETMsg.TAKNKIKI_MODEL_CD));
				retSvcKei.put(KK0341ETMsg.KIKI_SEIZO_NO, rsltQuery.getString(KK0341ETMsg.KIKI_SEIZO_NO));
				retSvcKei.put(KK0341ETMsg.KKTK_SVC_CD, rsltQuery.getString(KK0341ETMsg.KKTK_SVC_CD));

				retArray.add(retSvcKei);
			}

			return retArray;
		}
		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);
			}
		}
	}

	/**
	 * <p>
	 * 該当の機器に関する解約(または消去)SODが発行済かどうか判定します。
	 * </p>
	 * @param kk0341Msg 処理対象の機器レコード情報(「機器提供サービス契約」における機器単位の最新レコード)
	 * @return true[false]:該当の機器に関する解約(または消去)SODが発行済である[ない]場合
	 */
	private boolean isKikiDslSodHakZm(HashMap<String, String> kk0341Msg)
	{
		// 該当の機器に紐付く「オーダ設定」を取得する。
		CAANMsg condMsgKK1041 = new CAANMsg(KK1041ETMsg.class.getName());
		condMsgKK1041.set(KK1041ETMsg.KKTK_SVC_KEI_NO, (String)kk0341Msg.get(KK0341ETMsg.KKTK_SVC_KEI_NO));
		condMsgKK1041.set(KK1041ETMsg.TAKNKIKI_MODEL_CD, (String)kk0341Msg.get(KK0341ETMsg.TAKNKIKI_MODEL_CD));
		condMsgKK1041.set(KK1041ETMsg.KIKI_SEIZO_NO, (String)kk0341Msg.get(KK0341ETMsg.KIKI_SEIZO_NO));
		condMsgKK1041.set(KK1041ETMsg.MK_FLG, JKKModelConst.MK_FLG_YK);

		CAANMsg[] kk1041MsgList = null;
		try
		{
			kk1041MsgList = new KK1041LE().findByCondition(condMsgKK1041);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		// 該当の機器に紐づく「オーダ設定」が0件の場合(SOD発行前に型式／製番が変更となった場合など)、正常とみなす
		if (kk1041MsgList.length == 0)
		{
			return true;
		}
		for (CAANMsg kk1041Msg : kk1041MsgList)
		{
			
			// 最新要求種別コードが"解約"、"消去"以外の「オーダ設定」が１件でも存在する場合
			String rcntYokyuSbtCd = kk1041Msg.getString(KK1041ETMsg.RCNT_YOKYU_SBT_CD);
			if (!JKKModelConst.YOKYU_SBT_CD_DSL.equals(rcntYokyuSbtCd) && !JKKModelConst.YOKYU_SBT_CD_DEL.equals(rcntYokyuSbtCd))
			{

				String orderSbtCd = kk1041Msg.getString(KK1041ETMsg.ORDER_SBT_CD);
				String svcOrderCd = kk1041Msg.getString(KK1041ETMsg.SVC_ORDER_CD);
				
// OM-2020-0000258対応 20200604 ADD START
				// OLSと多機能以外のオーダはチェック対象外
				if( JKKModelConst.TEL_SVC_ORDER_CD_OLS.equals(svcOrderCd) || JKKModelConst.TEL_SVC_ORDER_TAKINORT.equals(svcOrderCd) )
				{
// OM-2020-0000258対応 20200604 ADD END
					String takinortKinoCd = kk1041Msg.getString(KK1041ETMsg.TAKINORT_KINO_CD);
					
					// 多機能ルーターでVA機能を利用していない場合はチェックOK
					if (!JKKModelConst.ORDER_SBT_CD_TEL.equals(orderSbtCd) || !JKKModelConst.TEL_SVC_ORDER_TAKINORT.equals(svcOrderCd) 
							|| !JKKModelConst.TAKINORT_KINO_CD_RT_ONLY.equals(takinortKinoCd))
					{
						return false;
					}
// OM-2020-0000258対応 20200604 ADD START
				}
// OM-2020-0000258対応 20200604 ADD END
			}
		}

		// 該当の機器に関する解約(または消去)SODが発行済である場合
		return true;
	}

	/**
	 * <p>
	 * 該当の機器に関する変更(電話番号解約または電話番号変更)SODが発行済かどうか判定します。
	 * </p>
	 * @param svcKeiNo 処理対象のサービス契約番号(電話契約)
	 * @param svcKeiUcwkNo 処理対象のサービス契約内訳番号(電話番号)
	 * @param kk0341Msg 処理対象の機器レコード情報(「機器提供サービス契約」における機器単位の最新レコード)
	 * @param opeDate 運用日
	 * @return true[false]:該当の機器に関する変更(電話番号解約または電話番号変更)SODが発行済である[ない]場合
	 */
	private boolean isOlsSetTlnDslSodHakZm(String svcKeiNo, String svcKeiUcwkNo, HashMap<String, String> kk0341Msg, String opeDate)
	{
		CAANMsg[] kk1551MsgList =  null;
		
		String kktkSvcCd = kk0341Msg.get(KK0341ETMsg.KKTK_SVC_CD);
		
		// 該当の機器に紐付く「オーダ発行条件」(OLS設定の変更)を取得する。
		CAANMsg[] kk1081MsgList = getKK1081forOlsSetChg(svcKeiNo, kk0341Msg, kktkSvcCd);
		for (CAANMsg kk1081Msg : kk1081MsgList)
		{
			// 送信依頼完了年月日時分秒が未設定(未送信)の場合は、スキップ
			if (kk1081Msg.isNull(KK1081ETMsg.SEND_REQ_FIN_DTM))
			{
				continue;
			}

			/* --------------------------------------------------
			 * OLS設定・電話番号解約SOD発行済チェック
			 * -------------------------------------------------- */
			// 該当の「サービス契約内訳」(電話番号)、「機器提供サービス契約」(光電話用ＶＡ)に紐付く「オーダ情報作成ワーク」(OLS設定・電話番号解約)を取得する。
			kk1551MsgList = getKK1551forOlsSetTlnDsl(kk1081Msg.getString(KK1081ETMsg.ODR_HAKKO_JOKEN_NO),
					svcKeiNo, svcKeiUcwkNo, (String)kk0341Msg.get(KK0341ETMsg.KKTK_SVC_KEI_NO), "1", kktkSvcCd);

			// 該当の機器に関する変更(電話番号解約)SODが発行済の場合、チェックＯＫ
			// ※上記SOD発行により、OLS側にて該当のVA機器で電話番号を使用不可とする設定が行われる。
			if (kk1551MsgList.length > 0)
			{
				return true;
			}

			// OM-2013-0000577 OLS設定・電話番号変更SOD発行済チェック追加 START
			/* --------------------------------------------------
			 * OLS設定・電話番号変更SOD発行済チェック
			 * -------------------------------------------------- */
			// 電話番号変更時の新電話番号の「サービス契約内訳」を取得する。
			// (該当の「サービス契約内訳」(電話番号)を継続元サービス契約内訳とする「サービス契約内訳」(電話番号)を取得する。)
			CAANMsg[] kk0161MsgNewList = new JKKejbKK0161DBABase().getKK0161byKeizkMtSvcKeiUcwk(svcKeiUcwkNo,
					null, null, JKKModelCommon.getOpeDate(kk1081Msg));

			// 新電話番号の「サービス契約内訳」が存在しない場合(電話番号変更されていない場合)
			if (kk0161MsgNewList.length == 0)
			{
				continue;
			}
// OM-2014-0003914 DEL START
//			// 新電話番号の「サービス契約内訳」が複数存在する場合
//			else if (kk0161MsgNewList.length > 1)
//			{
//				throw new CAANRuntimeException("電話番号変更後の「サービス契約内訳」が複数存在します。");
//			}
//
//			// 電話番号変更時の新電話番号の「サービス契約内訳」、「機器提供サービス契約」(光電話用ＶＡ)に紐付く
//			// 「オーダ情報作成ワーク」(OLS設定・電話番号変更)を取得する。
//			String newSvcKeiUcwkNo = kk0161MsgNewList[0].getString(KK0161ETMsg.SVC_KEI_UCWK_NO);
//			kk1551MsgList = getKK1551forOlsSetTlnDsl(kk1081Msg.getString(KK1081ETMsg.ODR_HAKKO_JOKEN_NO),
//					svcKeiNo, newSvcKeiUcwkNo, (String)kk0341Msg.get(KK0341ETMsg.KKTK_SVC_KEI_NO), "2", kktkSvcCd);
//
//			// 該当の機器に関する変更(電話番号変更)SODが発行済の場合、チェックＯＫ
//			// ※上記SOD発行により、OLS側にて該当のVA機器で電話番号を使用不可とする設定が行われる。
//			if (kk1551MsgList.length > 0)
//			{
// OM-2014-0003914 DEL END
// OM-2014-0003914 ADD START
			else
			{
				for (CAANMsg kk0161Msg : kk0161MsgNewList)
				{
					// 電話番号変更時の新電話番号の「サービス契約内訳」、「機器提供サービス契約」(光電話用ＶＡ)に紐付く
					// 「オーダ情報作成ワーク」(OLS設定・電話番号変更)を取得する。
					String newSvcKeiUcwkNo = kk0161Msg.getString(KK0161ETMsg.SVC_KEI_UCWK_NO);
					kk1551MsgList = getKK1551forOlsSetTlnDsl(kk1081Msg.getString(KK1081ETMsg.ODR_HAKKO_JOKEN_NO),
							svcKeiNo, newSvcKeiUcwkNo, (String)kk0341Msg.get(KK0341ETMsg.KKTK_SVC_KEI_NO), "2", kktkSvcCd);

					// 該当の機器に関する変更(電話番号変更)SODが発行済の場合、チェックＯＫ
					// ※上記SOD発行により、OLS側にて該当のVA機器で電話番号を使用不可とする設定が行われる。
					
					//OM-2015-0001615 DEL START
//					if (kk1551MsgList.length == 0)
//					{
//						return false;
//					}
					//OM-2015-0001615 DEL END
					//OM-2014-0001615 ADD START
					//取得した新電話番号の「サービス契約内訳」件数分の、「オーダ情報作成ワーク」(OLS設定・電話番号変更)を確認する
					//OM-2014-0003914の対応では１件でも「オーダ情報作成ワーク」(OLS設定・電話番号変更)が取得できない場合はfalseを返していた
					if(kk1551MsgList !=null && kk1551MsgList.length > 0)
					{
						return true;
					}
					//OM-2015-0001615 ADD END
				}
// OM-2014-0003914 ADD END
				//OM-2015-0001615 DEL START
//				return true;
				//OM-2015-0001615 DEL END
			}
			// OM-2013-0000577 OLS設定・電話番号変更SOD発行済チェック追加 END
		}
		
		// 該当の機器に紐付く「オーダ発行条件」でデータが取得できなかった場合（無効フラグが１などのデータ）
		if (kk1081MsgList.length == 0)
		{
			// サービス契約内訳のカレントレコードを取得する。
			JKKejbKK0161DBABase kk0161Dba = new JKKejbKK0161DBABase();
			CAANMsg kk0161Msg = kk0161Dba.getKK0161Current(svcKeiUcwkNo, opeDate);
			
			// サービス契約内訳ステータスが「キャンセル済」、「解約済」はチェックＯＫとする
			if (JKKModelConst.SVC_KEI_STAT_CNCL_ZM.equals(kk0161Msg.getString(KK0161ETMsg.SVC_KEI_UCWK_STAT)) 
					|| JKKModelConst.SVC_KEI_STAT_DSL_ZM.equals(kk0161Msg.getString(KK0161ETMsg.SVC_KEI_UCWK_STAT)))
			{
				return true;
			}

		}

		// 該当の機器に関する変更(電話番号解約または電話番号変更)SODが未発行の場合
		return false;
	}

	// OM-2015-0000315,OM-2015-0000834 電話機能解約SOD発行済みチェック追加 2015/05/01 藤田 ADD START
	/**
	 * 電話機能解約SOD発行済みチェック
	 * <br>
	 * VAまたは多機能ルーターを返却済みとするSODが発行済みである場合、trueを返します。
	 * <br>
	 * @param svcKeiNo チェック対象のサービス契約番号
	 * @param kk0341Msg 処理対象の機器レコード情報(「機器提供サービス契約」における機器単位の最新レコード)
	 * @param opeDate 運用日
	 * @return 対象データが存在する（チェックＯＫの）場合は true
	 */
	private boolean isTelFuncDslSodHakZm(String svcKeiNo, HashMap<String, String> kk0341Msg, String opeDate)
	{
		String taknKikiModelCd = (String)kk0341Msg.get(KK0341ETMsg.TAKNKIKI_MODEL_CD);
		String kikiSeizoNo = (String)kk0341Msg.get(KK0341ETMsg.KIKI_SEIZO_NO);
		
		// 該当の機器に紐付く「オーダ発行条件」を取得する。
		CAANMsg condMsgKK1081 = new CAANMsg(KK1081ETMsg.class.getName());
		condMsgKK1081.set(KK1081ETMsg.ORDER_SBT_CD, JKKModelConst.ORDER_SBT_CD_TEL);		// オーダ種別コード = "電話"
		condMsgKK1081.set(KK1081ETMsg.ODR_HAKKO_JOKEN_CD, JKKModelConst.ODR_HAKKO_JOKEN_CD_SOKU_JI_HAK);	// オーダ発行条件コード = "即時発行"
		condMsgKK1081.set(KK1081ETMsg.SVC_KEI_NO, svcKeiNo);								// サービス契約番号
		condMsgKK1081.set(KK1081ETMsg.TAKNKIKI_MODEL_CD, taknKikiModelCd);					// 宅内機器型式番号
		condMsgKK1081.set(KK1081ETMsg.KIKI_SEIZO_NO, kikiSeizoNo);							// 機器製造番号
		condMsgKK1081.set(KK1081ETMsg.MK_FLG, JKKModelConst.MK_FLG_YK);
		
		CAANMsg[] kk1081MsgList = null;
		try
		{
			kk1081MsgList = new KK1081LE().findByCondition(condMsgKK1081);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}
		
		// 取得した「オーダ発行条件」のレコードに対してチェック処理を実施
		for (CAANMsg kk1081Msg : kk1081MsgList)
		{
			// 送信依頼完了年月日時分秒が未設定(未送信)の場合は、スキップ
			if (kk1081Msg.isNull(KK1081ETMsg.SEND_REQ_FIN_DTM))
			{
				continue;
			}
			
			// オーダ発行条件に紐づくオーダ情報作成ワークを取得する
			String odrHakkoJokenNo = kk1081Msg.getString(KK1081ETMsg.ODR_HAKKO_JOKEN_NO);
			CAANMsg condMsgKK1551 = new CAANMsg(KK1551ETMsg.class.getName());
			condMsgKK1551.set(KK1551ETMsg.ODR_HAKKO_JOKEN_NO, odrHakkoJokenNo);
			condMsgKK1551.set(KK1551ETMsg.MK_FLG, JKKModelConst.MK_FLG_YK);
			CAANMsg[] kk1551MsgList = null;
			try
			{
				kk1551MsgList = new KK1551LE().findByCondition(condMsgKK1551);
				for (CAANMsg kk1551Msg : kk1551MsgList)
				{
					String odrNaiyoCd = kk1551Msg.getString(KK1551ETMsg.ODR_NAIYO_CD);
					if ( JKKModelConst.ODR_NAIYO_CD_TAKINORT_SET_VA_DSL.equals(odrNaiyoCd)
					  || JKKModelConst.ODR_NAIYO_CD_OLS_SET_DSL.equals(odrNaiyoCd)
					  || JKKModelConst.ODR_NAIYO_CD_OLS_SET_DEL.equals(odrNaiyoCd)
					  || JKKModelConst.ODR_NAIYO_CD_TAKINORT_SET_DSL.equals(odrNaiyoCd)
					  || JKKModelConst.ODR_NAIYO_CD_TAKINORT_SET_DEL.equals(odrNaiyoCd))
					{
						// 「チェックＯＫ」として処理を抜ける
						return true;
					}
				}
			}
			catch (CAANException ce)
			{
				throw new CAANRuntimeException(ce);
			}
		}
		
		return false;
	}
	// OM-2015-0000315,OM-2015-0000834 電話機能解約SOD発行済みチェック追加 2015/05/01 藤田 ADD END

	/**
	 * <p>
	 * 該当の機器に紐付く「オーダ発行条件」(OLS設定の変更、または多機能ルーター設定の変更)を取得します。
	 * </p>
	 * @param svcKeiNo 処理対象のサービス契約番号
	 * @param kk0341Msg 処理対象の機器レコード情報(「機器提供サービス契約」における機器単位の最新レコード)
	 * @param kktkSvcCd 機器提供サービスコード
	 * @return オーダ発行条件明細
	 */
	private CAANMsg[] getKK1081forOlsSetChg(String svcKeiNo, HashMap<String, String> kk0341Msg, String kktkSvcCd)
	{
		// 該当の機器に紐付く「オーダ発行条件」(OLS設定の変更)を取得する。
		CAANMsg condMsgKK1081 = new CAANMsg(KK1081ETMsg.class.getName());
		condMsgKK1081.set(KK1081ETMsg.ORDER_SBT_CD, JKKModelConst.ORDER_SBT_CD_TEL);		// オーダ種別コード = "電話"
		
		// ANK-4315-00-00 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))
		// ANK-4315-00-00 MOD END
		{
			condMsgKK1081.set(KK1081ETMsg.SVC_ORDER_CD, JKKModelConst.TEL_SVC_ORDER_TAKINORT);	// サービスオーダコード = "多機能ルーター"
		}
		else
		{
			condMsgKK1081.set(KK1081ETMsg.SVC_ORDER_CD, JKKModelConst.TEL_SVC_ORDER_CD_OLS);	// サービスオーダコード = "OLS"
		}
		
		condMsgKK1081.set(KK1081ETMsg.YOKYU_SBT_CD, JKKModelConst.YOKYU_SBT_CD_CHG);		// 要求種別コード = "変更"
		condMsgKK1081.set(KK1081ETMsg.ODR_HAKKO_JOKEN_CD, JKKModelConst.ODR_HAKKO_JOKEN_CD_SOKU_JI_HAK);	// オーダ発行条件コード = "即時発行"
		condMsgKK1081.set(KK1081ETMsg.SVC_KEI_NO, svcKeiNo);
		condMsgKK1081.set(KK1081ETMsg.TAKNKIKI_MODEL_CD, (String)kk0341Msg.get(KK0341ETMsg.TAKNKIKI_MODEL_CD));
		condMsgKK1081.set(KK1081ETMsg.KIKI_SEIZO_NO, (String)kk0341Msg.get(KK0341ETMsg.KIKI_SEIZO_NO));
		condMsgKK1081.set(KK1081ETMsg.MK_FLG, JKKModelConst.MK_FLG_YK);

		CAANMsg[] kk1081MsgList = null;
		try
		{
			kk1081MsgList = new KK1081LE().findByCondition(condMsgKK1081);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		return kk1081MsgList;
	}

	/**
	 * <p>
	 * 該当の「サービス契約内訳」(電話番号)、「機器提供サービス契約」(光電話用ＶＡ)に紐付く
	 * 「オーダ情報作成ワーク」(OLS設定・電話番号解約または多機能ルーター設定・変更(VA機能・電話番号変更))を取得します。
	 * </p>
	 * @param svcKeiNo 処理対象のサービス契約番号(電話契約)
	 * @param svcKeiUcwkNo 処理対象のサービス契約内訳番号(電話番号)
	 * @param kktkSvcKeiNo 処理対象の機器提供サービス契約番号(光電話用ＶＡ)
	 * @param chkPtn チェックパターン("1":電話番号解約/"2":電話番号変更)
	 * @param kktkSvcCd 機器提供サービスコード
	 * @return オーダ発行条件明細
	 */
	private CAANMsg[] getKK1551forOlsSetTlnDsl(String odrHakkoJokenNo, String svcKeiNo, String svcKeiUcwkNo, String kktkSvcKeiNo, String chkPtn, String kktkSvcCd)
	{
		// 該当の「サービス契約内訳」(電話番号)、「機器提供サービス契約」(光電話用ＶＡ)に紐付く
		// 「オーダ情報作成ワーク」(OLS設定・電話番号解約またはOLS設定・電話番号変更)を取得する。
		CAANMsg condMsgKK1551 = new CAANMsg(KK1551ETMsg.class.getName());
		condMsgKK1551.set(KK1551ETMsg.ODR_HAKKO_JOKEN_NO, odrHakkoJokenNo);
		if ("1".equals(chkPtn))
		{
			// ANK-4315-00-00 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))
			// ANK-4315-00-00 MOD END
			{
				// オーダ内容コード = "多機能ルーター設定・変更(VA機能・電話番号解約)"
				condMsgKK1551.set(KK1551ETMsg.ODR_NAIYO_CD, JKKModelConst.ODR_NAIYO_CD_TAKINORT_SET_TLN_DSL);	
			}
			else
			{
				// オーダ内容コード = "OLS設定・電話番号解約"
				condMsgKK1551.set(KK1551ETMsg.ODR_NAIYO_CD, JKKModelConst.ODR_NAIYO_CD_OLS_SET_TLN_DSL);				
			}
		}
		// OM-2013-0000577 OLS設定・電話番号変更SOD発行済チェック追加 START
		else if ("2".equals(chkPtn))
		{
			// ANK-4315-00-00 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))
			// ANK-4315-00-00 MOD END
			{
				// オーダ内容コード = "多機能ルーター設定・変更(VA機能・電話番号変更)"
				condMsgKK1551.set(KK1551ETMsg.ODR_NAIYO_CD, JKKModelConst.ODR_NAIYO_CD_TAKINORT_SET_TLN_CHG);	
			}
			else
			{
				// オーダ内容コード = "OLS設定・電話番号変更"
				condMsgKK1551.set(KK1551ETMsg.ODR_NAIYO_CD, JKKModelConst.ODR_NAIYO_CD_OLS_SET_TLN_CHG);
			}
		}
		// OM-2013-0000577 OLS設定・電話番号変更SOD発行済チェック追加 END
		else
		{
			throw new CAANRuntimeException("未定義のチェックパターンです。");
		}
		condMsgKK1551.set(KK1551ETMsg.SVC_KEI_NO, svcKeiNo);
		condMsgKK1551.set(KK1551ETMsg.SVC_KEI_UCWK_NO, svcKeiUcwkNo);
		condMsgKK1551.set(KK1551ETMsg.KKTK_SVC_KEI_NO, kktkSvcKeiNo);
		condMsgKK1551.set(KK1551ETMsg.MK_FLG, JKKModelConst.MK_FLG_YK);

		CAANMsg[] kk1551MsgList = null;
		try
		{
			kk1551MsgList = new KK1551LE().findByCondition(condMsgKK1551);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}

		return kk1551MsgList;
	}

	/**
	 * <p>
	 * ＶＡポート番号重複チェック
	 * </p>
	 * 電話番号を登録(または回復・解約取消・キャンセル取消)する際に、該当の電話番号で使用するＶＡポート番号が
	 * 同一の電話契約を親とする電話番号で使用されている場合、エラーとする。<br>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @return false:重複データが存在する場合<br>
	 *          true:上記以外
	 */
	public boolean isCheckTyohukuVaPortNo(CAANMsg inMsg)
	{
		JKKejbKK0081DBABase kk0081dba = new JKKejbKK0081DBABase();
		JKKejbKK0161DBABase kk0161dba = new JKKejbKK0161DBABase();
		JKKejbKK0191DBABase kk0191dba = new JKKejbKK0191DBABase();
		String opedate = JKKModelCommon.getOpeDate(inMsg);

		// チェック対象の「サービス契約内訳」カレントレコードを取得する。
		String inSvcKeiUcwkNo = inMsg.getString(KK0161ETMsg.SVC_KEI_UCWK_NO);
		CAANMsg inKK0161Msg = kk0161dba.getKK0161Current(inSvcKeiUcwkNo, opedate);

		// チェック対象の「サービス契約内訳」の親「サービス契約」カレントレコードを取得する。
		String svcKeiNo = inKK0161Msg.getString(KK0161ETMsg.SVC_KEI_NO);
		CAANMsg kk0081Msg = kk0081dba.getKK0081Current(svcKeiNo, opedate);

		// 電話契約以外の場合、チェック対象外
		if (!JKKModelConst.SVC_CD_TEL.equals(kk0081Msg.getString(KK0081ETMsg.SVC_CD)))
		{
			return true;
		}

		// チェック対象の「サービス契約内訳<eo光電話>」を取得する。
		String inGeneAddDtm = inKK0161Msg.getString(KK0161ETMsg.GENE_ADD_DTM);
		CAANMsg inKK0191Msg = kk0191dba.getKK0191Primary(inSvcKeiUcwkNo, inGeneAddDtm);

		// VAポート番号が未設定の場合、チェック対象外
		String inVaPortNo = inKK0191Msg.getString(KK0191ETMsg.VA_PORT_NO);
		if (inVaPortNo == null)
		{
			return true;
		}

		// 同一の親「サービス契約」(電話契約)配下の「サービス契約内訳」(電話番号)を取得する。
		CAANMsg[] kk0161MsgList = kk0161dba.getKK0161bySvcKei(svcKeiNo, null, opedate);

		// 解約済、キャンセル済を除外する
		kk0161MsgList = kk0161dba.getKK0161OutDsLCl(kk0161MsgList);

		for (CAANMsg kk0161Msg: kk0161MsgList)
		{
			// 他の「サービス契約内訳」(電話番号)のみ処理する
			String svcKeiUcwkNo = kk0161Msg.getString(KK0161ETMsg.SVC_KEI_UCWK_NO);
			if (inSvcKeiUcwkNo.equals(svcKeiUcwkNo))
			{
				continue;
			}

			// 「サービス契約内訳<eo光電話>」の一意検索を行う
			String geneAddDtm = kk0161Msg.getString(KK0161ETMsg.GENE_ADD_DTM);
			CAANMsg kk0191Msg = kk0191dba.getKK0191Primary(svcKeiUcwkNo, geneAddDtm);

			// 他の電話番号がチェック対象の電話番号と同一のVAポート番号を使用している場合、チェックＮＧ
			String vaPortNo = kk0191Msg.getString(KK0191ETMsg.VA_PORT_NO);
			if (inVaPortNo.equals(vaPortNo))
			{
				return false;
			}
		}

		// 他の電話番号が存在しない、または他の電話番号が別のVAポート番号を使用している場合は、チェックＯＫ
		return true;
	}

	/**
	 * <p>
	 * 対象の電話番号で指定する緊急通報用住所と、親となる電話契約の回線場所住所の同一性チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return true：緊急通報用住所と回線場所住所が一致する場合、false：一致しない場合
	 */
	public boolean isKisnPlcEmgAdMatchChk(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		JKKejbKK0081DBABase kk0081dba = new JKKejbKK0081DBABase();
		JKKejbKK0161DBABase kk0161dba = new JKKejbKK0161DBABase();
		JKKejbKK0191DBABase kk0191dba = new JKKejbKK0191DBABase();
		JKKejbKK0251DBABase kk0251dba = new JKKejbKK0251DBABase();
		String opedate = JKKModelCommon.getOpeDate(inMsg);

		// チェック対象の「サービス契約内訳」カレントレコードを取得する。
		String svcKeiUcwkNo = inMsg.getString(KK0161ETMsg.SVC_KEI_UCWK_NO);
		CAANMsg kk0161Msg = kk0161dba.getKK0161Current(svcKeiUcwkNo, opedate);

		// チェック対象の「サービス契約内訳」の親「サービス契約」カレントレコードを取得する。
		String svcKeiNo = kk0161Msg.getString(KK0161ETMsg.SVC_KEI_NO);
		CAANMsg kk0081Msg = kk0081dba.getKK0081Current(svcKeiNo, opedate);

		// 電話契約以外の場合、チェック対象外
		if (!JKKModelConst.SVC_CD_TEL.equals(kk0081Msg.getString(KK0081ETMsg.SVC_CD)))
		{
			return true;
		}

		// チェック対象の「サービス契約内訳<eo光電話>」を取得する。
		String geneAddDtm = kk0161Msg.getString(KK0161ETMsg.GENE_ADD_DTM);
		CAANMsg kk0191Msg = kk0191dba.getKK0191Primary(svcKeiUcwkNo, geneAddDtm);

		// 「サービス契約内訳<eo光電話>」の緊急通報用住所情報を取得する。
		String emgAdCd = kk0191Msg.getString(KK0191ETMsg.EMG_AD_CD);	// 緊急通報用住所コード
		StringBuffer emgAd = new StringBuffer()
				.append(kk0191Msg.getString(KK0191ETMsg.EMG_STATE_NM))	// 緊急通報用都道府県名
				.append(kk0191Msg.getString(KK0191ETMsg.EMG_CITY_NM))	// 緊急通報用市区町村名
				.append(kk0191Msg.getString(KK0191ETMsg.EMG_OAZTSU_NM))	// 緊急通報用大字通称名
				.append(kk0191Msg.getString(KK0191ETMsg.EMG_AZCHO_NM))	// 緊急通報用字丁目名
				.append(kk0191Msg.getString(KK0191ETMsg.EMG_BNCHIGO));	// 緊急通報用番地号

		// 該当の「サービス契約」(eo光電話)が使用する「サービス契約回線内訳」を取得する。
		CAANMsg[] kk0251MsgList = kk0251dba.getKK0251bySvcKei(svcKeiNo, null, opedate, "2");
		if (kk0251MsgList.length != 1)
		{
			throw new CAANRuntimeException("該当のサービス契約が使用するサービス契約回線内訳が０件、または複数件存在します。サービス契約番号:" + svcKeiNo);
		}

		// 「サービス契約回線内訳」の回線場所住所情報を取得する。
		String kaisenPlaceAdCd = kk0251MsgList[0].getString(KK0251ETMsg.KAISEN_PLACE_AD_CD);	// 回線場所住所コード
		StringBuffer kaisenPlaceAd = new StringBuffer()
				.append(kk0251MsgList[0].getString(KK0251ETMsg.KAISEN_PLACE_STATE_NM))	// 回線場所都道府県名
				.append(kk0251MsgList[0].getString(KK0251ETMsg.KAISEN_PLACE_CITY_NM))	// 回線場所市区町村名
				.append(kk0251MsgList[0].getString(KK0251ETMsg.KAISEN_PLACE_OAZTSU_NM))	// 回線場所大字通称名
				.append(kk0251MsgList[0].getString(KK0251ETMsg.KAISEN_PLACE_AZCHO_NM))	// 回線場所字丁目名
				.append(kk0251MsgList[0].getString(KK0251ETMsg.KAISEN_PLACE_BNCHIGO));	// 回線場所番地号

		// 住所コードが不一致の場合、チェックＮＧ
		if (!compareValue(emgAdCd, kaisenPlaceAdCd))
		{
			return false;
		}
		
		// 住所情報(都道府県名〜番地号)が不一致の場合、チェックＮＧ
		if (!compareValue(getRemoveMojiValue(emgAd), getRemoveMojiValue(kaisenPlaceAd)))
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * 対象の電話番号で指定する緊急通報用住所と、親となる電話契約の回線場所住所の同一性チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return true：緊急通報用住所と回線場所住所が一致する場合、false：一致しない場合
	 */
	public boolean isKisnPlcEmgAdKikanChk(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		JKKejbKK0081DBABase kk0081dba = new JKKejbKK0081DBABase();
		JKKejbKK0161DBABase kk0161dba = new JKKejbKK0161DBABase();
		JKKejbKK0191DBABase kk0191dba = new JKKejbKK0191DBABase();
		JKKejbKK0251DBABase kk0251dba = new JKKejbKK0251DBABase();
		String opedate = JKKModelCommon.getOpeDate(inMsg);

		// チェック対象の「サービス契約内訳」カレントレコードを取得する。
		String svcKeiUcwkNo = inMsg.getString(KK0161ETMsg.SVC_KEI_UCWK_NO);
		CAANMsg kk0161Msg = kk0161dba.getKK0161Current(svcKeiUcwkNo, opedate);

		// チェック対象の「サービス契約内訳」の親「サービス契約」カレントレコードを取得する。
		String svcKeiNo = kk0161Msg.getString(KK0161ETMsg.SVC_KEI_NO);
		CAANMsg kk0081Msg = kk0081dba.getKK0081Current(svcKeiNo, opedate);

		// 電話契約以外の場合、チェック対象外
		if (!JKKModelConst.SVC_CD_TEL.equals(kk0081Msg.getString(KK0081ETMsg.SVC_CD)))
		{
			return true;
		}

		// チェック対象の「サービス契約内訳<eo光電話>」を取得する。
		String geneAddDtm = kk0161Msg.getString(KK0161ETMsg.GENE_ADD_DTM);
		CAANMsg kk0191Msg = kk0191dba.getKK0191Primary(svcKeiUcwkNo, geneAddDtm);

		// 「サービス契約内訳<eo光電話>」の緊急通報用住所情報を取得する。
		String emgAdCd = kk0191Msg.getString(KK0191ETMsg.EMG_AD_CD);	// 緊急通報用住所コード

		// 該当の「サービス契約」(eo光電話)が使用する「サービス契約回線内訳」を取得する。
		CAANMsg[] kk0251MsgList = kk0251dba.getKK0251bySvcKei(svcKeiNo, null, opedate, "2");
		if (kk0251MsgList.length != 1)
		{
			throw new CAANRuntimeException("該当のサービス契約が使用するサービス契約回線内訳が０件、または複数件存在します。サービス契約番号:" + svcKeiNo);
		}
		
		// 住所情報適用有無チェック
		JKKejbZM0081DBABase zm0081 = new JKKejbZM0081DBABase();
		CAANMsg zm0081Msg = new CAANMsg(ZM0081ETMsg.class.getName());
		zm0081Msg.set(ZM0081ETMsg.AD_CD, emgAdCd);
		zm0081Msg.set(ZM0081ETMsg.RSV_APLY_YMD, opedate);
		CAANMsg outMsg = zm0081.findByCurrent(zm0081Msg);
		
		// データが取得できなかった場合、チェックＮＧ
		if (outMsg == null)
		{
			return false;
		}
		
		// 適用終了されている住所の場合、チェックＮＧ
		if (JKKModelCommon.isPastDateKRCK(inMsg, inContext, outMsg.getString(ZM0081ETMsg.AD_TENDYMD), "0"))
		{
			return false;
		}

		return true;
	}

	/**
	 * <p>
	 * 電話番号２重登録チェック
	 * </p>
	 * これから登録しようとしている電話番号が他の契約にて既に登録されている場合、エラーとする。<br>
     * @入力のサービス契約番号に紐づくＳＹＳＩＤを取得
     * A@で取得したＳＹＳＩＤ配下ではないサービス契約内訳を取得
     * B入力の電話番号をＫｅｙにAで取得した
     * 　サービス契約内訳配下の内訳＜電話＞を取得
     * B−１
　   *   データが取得できなければ正常
     * B−２
     * 　データが取得できた場合
 　  *   サービス契約内訳のステータスが010〜220以外であれば正常 
     * B−３
　   *   データが取得できた場合
     * 　サービス契約内訳のステータスが010〜220であればエラー	 
     * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo チェック対象となる「サービス契約」のサービス契約番号
	 * @param telno チェック対象となる電話番号
	 * @return false:重複する電話番号が存在する場合
	 *          true :上記以外
	 */
	public boolean isTelNoDubbleAddChk(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcKeiNo, String telNo)
	{
		// サービス契約番号、または電話番号が未設定の場合、チェック対象外
		if ((svcKeiNo == null || svcKeiNo.isEmpty()) || (telNo == null || telNo.isEmpty()))
		{
			return true;
		}
		
		// 既契約数を取得します
		long cnt = new JKKejbKK0161DBABase().getDubbleTelNoCnt(svcKeiNo, telNo, JKKModelCommon.getOpeDate(inCBSMsg));

		// 既契約数が0件以上の場合
		if (cnt > 0)
		{
			// 既に同じ電話番号で登録されている契約が存在することになるのでエラーとする
			return false;
		}
		return true;
	}

	/**
	 * <p>
	 * 電話番号２重登録チェック（サービス契約内訳番号）
	 * </p>
	 * これから登録しようとしている電話番号が他の契約にて既に登録されている場合、エラーとする。<br>
     * @入力のサービス契約内訳番号に紐づくＳＹＳＩＤを取得
     * A@で取得したＳＹＳＩＤ配下ではないサービス契約内訳を取得
     * B入力の電話番号をＫｅｙにAで取得した
     * 　サービス契約内訳配下の内訳＜電話＞を取得
     * B−１
　   *   データが取得できなければ正常
     * B−２
     * 　データが取得できた場合
 　  *   サービス契約内訳のステータスが010〜220以外であれば正常 
     * B−３
　   *   データが取得できた場合
     * 　サービス契約内訳のステータスが010〜220であればエラー	 
     * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiUcwkNo チェック対象となる「サービス契約内訳」のサービス契約内訳番号
	 * @param telno チェック対象となる電話番号
	 * @return false:重複する電話番号が存在する場合
	 *          true :上記以外
	 */
	public boolean isTelNoDubbleAddChkUcwk(CAANMsg inMsg, AgentDispatchContext inContext, String svcKeiUcwkNo, String telNo)
	{
		// サービス契約内訳番号、または電話番号が未設定の場合、チェック対象外
		if ((svcKeiUcwkNo == null || svcKeiUcwkNo.isEmpty()) || (telNo == null || telNo.isEmpty()))
		{
			return true;
		}

		// チェック対象の「サービス契約内訳」カレントレコードを取得する。
		String opedate = JKKModelCommon.getOpeDate(inMsg);
		JKKejbKK0161DBABase kk0161dba = new JKKejbKK0161DBABase();
		CAANMsg kk0161Msg = kk0161dba.getKK0161Current(svcKeiUcwkNo, opedate);
		
		// 既契約数を取得します
		long cnt = new JKKejbKK0161DBABase().getDubbleTelNoCnt(kk0161Msg.getString(KK0161ETMsg.SVC_KEI_NO), telNo, opedate);

		// 既契約数が0件以上の場合
		if (cnt > 0)
		{
			// 既に同じ電話番号で登録されている契約が存在することになるのでエラーとする
			return false;
		}
		return true;
	}
	
	/**
	 * <p>
	 * 電話番号登録VA紐付けチェック
	 * </p>
     * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo チェック対象となる「サービス契約」のサービス契約番号
	 * @param idoDiv 異動区分
	 * @param vaKikiChgNo 今回登録対象の電話番号に紐付くVA機器変更番号
	 * @return false:既存契約の電話番号が多機能ルーターで、今回登録対象の電話番号が2ポートVAの場合
	 *          true :上記以外
	 */
	public boolean isTelNoAddVaChk(CAANMsg inMsg, AgentDispatchContext inContext, String svcKeiNo, String idoDiv, String vaKikiChgNo)
	{		
		// サービス契約番号、または異動区分、またはVA機器変更番号が未設定の場合、チェック対象外
		if ((svcKeiNo == null || svcKeiNo.isEmpty()) || (idoDiv == null || idoDiv.isEmpty()) || (vaKikiChgNo == null || vaKikiChgNo.isEmpty()))
		{
			return true;
		}

		//異動区分が「光電話・番号追加」以外の場合、チェック対象外	
		if(!JKKModelConst.IDO_DIV_HIKARI_TELNO_ADD.equals(idoDiv))
		{
			return true;
		}
	
		JKKejbKK0161DBABase kk0161dba = new JKKejbKK0161DBABase();
		JKKejbKK0191DBABase kk0191dba = new JKKejbKK0191DBABase();
		JKKejbKK0341DBABase kk0341dba = new JKKejbKK0341DBABase();
		String opedate = JKKModelCommon.getOpeDate(inMsg);

		// チェック対象のサービス契約番号に紐づく「サービス契約内訳明細」を取得する。
		CAANMsg[] kk0161MsgList = kk0161dba.getKK0161bySvcKei(svcKeiNo, null, opedate);
		
		// 「サービス契約内訳明細」が取得できない場合、チェック対象外
		if (kk0161MsgList == null || kk0161MsgList.length == 0)
		{
			return true;
		}

		ArrayList<CAANMsg> kk0191MsgList = new ArrayList<CAANMsg>();
		
		for(CAANMsg kk0161Msg : kk0161MsgList)
		{
			String geneAddDtm = kk0161Msg.getString(KK0161ETMsg.GENE_ADD_DTM);
			String svcKeiUcwkNo = kk0161Msg.getString(KK0161ETMsg.SVC_KEI_UCWK_NO);
			
			// チェック対象の「サービス契約内訳<eo光電話>」を取得する。
			CAANMsg kk0191Msg = kk0191dba.getKK0191Primary(svcKeiUcwkNo, geneAddDtm);
			kk0191MsgList.add(kk0191Msg);
		}

		// 「サービス契約内訳<eo光電話>」が取得できない場合、チェック対象外
		if (kk0191MsgList == null || kk0191MsgList.isEmpty())
		{
			return true;
		}

		JKKejbKK0081DBABase kk0081dba = new JKKejbKK0081DBABase();
		
		// チェック対象のサービス契約番号に紐づくサービス契約のカレントレコードを取得する。
		CAANMsg kk0081Msg = kk0081dba.getKK0081Current(svcKeiNo, opedate);
		
		HashMap<String, String[]> searchJknMap = new HashMap<String, String[]>();
		//既存契約の電話番号に紐付く機器提供サービス契約を取得する
		CAANMsg[] retKizonTelList = kk0341dba.getKK0341FromKK0251bySvcKei(svcKeiNo, kk0081Msg.getString(KK0081ETMsg.SVC_CD), searchJknMap, opedate, "1");
		
		// 「機器提供サービス契約」が取得できない場合、チェック対象外
		if (retKizonTelList == null || retKizonTelList.length ==0)
		{
			return true;
		}
		
		int cnt= 0;
		for (CAANMsg retKizonTel : retKizonTelList)
		{
			//既存契約の電話番号に多機能ルーターが存在する場合、チェック対象
			// ANK-4315-00-00 MOD START
//			if(JKKModelConst.TAKINO_ROUTER.equals(retKizonTel.getString(KK0341ETMsg.TAKNKIKI_SBT_CD)))
			if(JKKModelConst.TAKINO_ROUTER.equals(retKizonTel.getString(KK0341ETMsg.TAKNKIKI_SBT_CD)) || JKKModelConst.HGW.equals(retKizonTel.getString(KK0341ETMsg.TAKNKIKI_SBT_CD)))
			// ANK-4315-00-00 MOD END
			{			
				break;
			}
			
			cnt++;
			
			//既存契約の電話番号に多機能ルーターが存在しない場合、チェック対象外
			if(cnt >= retKizonTelList.length)
			{
				return true;
			}
		}

		//今回登録対象の電話番号に紐付く宅内機器種別コードを取得する		
		ArrayList<HashMap<String, String>> retNewTelList = getTaknkikiSbtCdNewTel(vaKikiChgNo, opedate);

		// 「宅内機器種別コード」が取得できない場合、チェック対象外
		if (retNewTelList == null || retNewTelList.isEmpty())
		{
			return true;
		}

		for (HashMap<String, String> retNewTel : retNewTelList)
		{	
			//今回登録対象の電話番号がVAの場合、エラー
			if(JKKModelConst.EO_TEL_VA.equals(retNewTel.get(KK0341ETMsg.TAKNKIKI_SBT_CD)))
			{			
				//紐付け変更不可になるのでエラーとする
				return false;			
			}
		}

		return true;
	}	


	/**
	 * <p>
	 * 多機能ルータVAポート番号変更チェック
	 * </p>
     * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo チェック対象となる「サービス契約」のサービス契約番号
	 * @param svcKeiUcwkNo チェック対象となる「サービス契約内訳」のサービス契約内訳番号
	 * @param idoDiv 異動区分
	 * @param vaTaknkikiModelCd 今回登録対象の電話番号に紐付くVA宅内機器型式コード
	 * @return false:既存契約が2電話番号の多機能ルーターで、今回変更対象の電話番号が1ポートVAの場合
	 *          true :上記以外
	 */
	public boolean isTknrtVaPortChgChk(CAANMsg inMsg, AgentDispatchContext inContext, String svcKeiNo, String idoDiv, String vaTaknkikiModelCd)
	{
		// サービス契約番号、または異動区分、またはVA宅内機器型式コードが未設定の場合、チェック対象外
		if ((svcKeiNo == null || svcKeiNo.isEmpty()) || (idoDiv == null || idoDiv.isEmpty()) || (vaTaknkikiModelCd == null || vaTaknkikiModelCd.isEmpty()))
		{
			return true;
		}

		//異動区分が「光電話・番号変更」以外の場合、チェック対象外
		if(!JKKModelConst.IDO_DIV_HIKARI_TELNO_CHG.equals(idoDiv))
		{
			return true;
		}
	
		String opeDate = JKKModelCommon.getOpeDate(inMsg);
		
		// チェック対象のサービス契約番号に紐づく「サービス契約明細」を取得する。
		JKKejbKK0081DBABase kk0081dba = new JKKejbKK0081DBABase();
		CAANMsg kk0081Msg = kk0081dba.getKK0081Current(svcKeiNo, opeDate);
		
		//既存契約の電話番号に紐付く宅内機器種別コードを取得する
		HashMap<String, String[]> searchJknMap = new HashMap<String, String[]>();
		JKKejbKK0341DBABase kk0341dba = new JKKejbKK0341DBABase();
		CAANMsg[] retKK0341List = kk0341dba.getKK0341FromKK0251bySvcKei(svcKeiNo, kk0081Msg.getString(KK0081ETMsg.SVC_CD), searchJknMap, opeDate, "1");

		// 「機器提供サービス契約」が取得できない場合、チェック対象外
		if (retKK0341List == null)
		{
			return true;
		}
		
		for (CAANMsg retKK0341 : retKK0341List)
		{
			//既存契約の電話番号に多機能ルーターが存在するかつ
			// 料金コースコードが"電話アダプター機能（２番号）"の場合、チェック対象
			// ANK-4315-00-00 MOD START
//			if(JKKModelConst.TAKINO_ROUTER.equals(retKK0341.getString(KK0341ETMsg.TAKNKIKI_SBT_CD))
			if((JKKModelConst.TAKINO_ROUTER.equals(retKK0341.getString(KK0341ETMsg.TAKNKIKI_SBT_CD)) || 
					JKKModelConst.HGW.equals(retKK0341.getString(KK0341ETMsg.TAKNKIKI_SBT_CD)))
			// ANK-4315-00-00 MOD END
					&& JKKModelConst.PCRS_CD_TEL_ADPT_TWO.equals(retKK0341.getString(KK0341ETMsg.PCRS_CD)))
			{
				// 変更対象のVA宅内機器型式コードが1ポートVAかを宅内機器型式スキーマより判定
				CAANMsg zm0411ETMsg = new CAANMsg(ZM0411ETMsg.class.getName());
				zm0411ETMsg.set(ZM0411ETMsg.TAKNKIKI_MODEL_CD, vaTaknkikiModelCd);
				CAANMsg retZM0411Msg = new JKKejbZM0411DBABase().findByPrimaryKey(zm0411ETMsg);
				
				// 取得できない場合、チェック対象外
				if (retZM0411Msg == null 
						|| JKKModelConst.MK_FLG_MK.equals(retZM0411Msg.getString(KK0351ETMsg.MK_FLG)))
				{
					continue;
				}
				// 1ポートVAへの変更はチェックエラー
				if ("1".equals(retZM0411Msg.getString(ZM0411ETMsg.PORT_CNT)))
				{
					return false;
				}
			}
		}
		return true;
	}

	/**
	 * <p>
	 * 指定されたVA機器変更番号に紐づく「機器提供サービス契約」の宅内機器種別コードを取得します。
	 * </p>
	 * @param svcKeiNo チェック対象となる「サービス契約」のサービス契約番号
	 * @param stdYmd 基準年月日
	 * @return 指定されたVA機器変更番号に紐づく「機器提供サービス契約」の宅内機器種別コード
	 */
	private ArrayList<HashMap<String, String>> getTaknkikiSbtCdNewTel(String vaKikiChgNo, String stdYmd)
	{
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// バインド変数設定値保持用領域
		ArrayList<Object> arraylist = new ArrayList<Object>();
		// PreparedStatementのパラメータカウント
		int iPCnt = 0;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0341ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			
			sql_Buff.append(" SELECT KK0341.TAKNKIKI_SBT_CD ");
			sql_Buff.append(" FROM   KK_T_KKTK_SVC_KEI KK0341 ");
			sql_Buff.append(" WHERE  KK0341.KIKI_CHG_NO = ? ");
			sql_Buff.append(" AND   (KK0341.KKTK_SVC_KEI_NO, KK0341.RSV_APLY_YMD || KK0341.GENE_ADD_DTM) = ");
			sql_Buff.append("    (SELECT KK0341_GENE.KKTK_SVC_KEI_NO, MAX(KK0341_GENE.RSV_APLY_YMD || KK0341_GENE.GENE_ADD_DTM) AS KK0341_MAX ");
			sql_Buff.append("     FROM   KK_T_KKTK_SVC_KEI KK0341_GENE ");
			sql_Buff.append("     WHERE  KK0341_GENE.KKTK_SVC_KEI_NO = KK0341.KKTK_SVC_KEI_NO ");
			sql_Buff.append(" AND    KK0341_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append(" AND    KK0341_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append(" AND    KK0341_GENE.MK_FLG = '0' ");
			sql_Buff.append(" GROUP BY KK0341_GENE.KKTK_SVC_KEI_NO) ");
			arraylist.add(vaKikiChgNo);
			arraylist.add(stdYmd);

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// バインド変数設定
			for (int iCnt = 0; iCnt < arraylist.size(); iCnt++)
			{
				// バインド変数に設定
				CAANJDBCUtil.setParam(pstmt, ++iPCnt, arraylist.get(iCnt));
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 返却用リスト
			ArrayList<HashMap<String, String>> retArray = new ArrayList<HashMap<String, String>>();
			// 返却用サービス契約情報
			HashMap<String, String> taknkikiSbtCd = null;

			// 取得結果の設定
			while (rsltQuery.next())
			{
				taknkikiSbtCd = new HashMap<String, String>();

				taknkikiSbtCd.put(KK0341ETMsg.TAKNKIKI_SBT_CD, rsltQuery.getString(KK0341ETMsg.TAKNKIKI_SBT_CD));

				retArray.add(taknkikiSbtCd);
			}

			return retArray;
		}
		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);
			}
		}
	}

	/**
	 * <p>
	 * ２項目の設定値の差分チェックを行う。
	 * </p>
	 * @param str1 項目１
	 * @param str2 項目２
	 * @return ２項目の設定値が同じ場合はtrue。異なる場合はfalse。
	 */
	public boolean compareValue(String str1, String str2)
	{
		if (str1 == null)
		{
			if (str2 == null)
			{
				return true;
			}
		}
		else if (str1.equals(str2))
		{
			return true;
		}

		return false;
	}

	/**
	 * <p>
	 * 入力の文字列から特定の部分文字列を除去した文字列を取得します。
	 * </p>
	 * @param sb 文字列(StringBuffer)
	 * @return 文字列から特定の部分文字列した文字列(String)
	 */
	public String getRemoveMojiValue(StringBuffer sb)
	{
		if (sb == null)
		{
			return null;
		}

		// 除去文字リスト：全角空白、半角空白、全角ハイフン、半角ハイフン
		String[] removeMojiList = {"　", " ", "‐", "-"};

		for (String removeMoji : removeMojiList)
		{
			// 文字列から該当の文字を除去する。
			int i = 0;
			while (sb.indexOf(removeMoji, i) >= 0)
			{
				i = sb.indexOf(removeMoji);
				sb.deleteCharAt(i);
			}
		}

		return sb.toString();
	}
	
	/**
	 * <p>
	 * NTT契約者住所変更チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiUcwkNo サービス契約内訳番号
	 * @param nttKeishaAdCd NTT契約者住所コード
	 * @param nttKeishaPcd NTT契約者郵便番号
	 * @return NTT契約者住所が変更されている場合はtrue。変更されていない場合はfalse。
	 */
	public boolean isNttKeishaAdChk(CAANMsg inMsg, AgentDispatchContext inContext, String svcKeiUcwkNo, String nttKeishaAdCd, String nttKeishaPcd)
	{
		// NTT契約者住所コードが未設定の場合
		if (nttKeishaAdCd == null || "".equals(nttKeishaAdCd))
		{
			return false;
		}
		// NTT契約者郵便番号が未設定の場合
		if (nttKeishaPcd == null || "".equals(nttKeishaPcd))
		{
			return false;
		}
			
		// サービス契約内訳番号をKeyにサービス契約内訳＜eo光電話＞のカレントレコードを取得します
		JKKejbKK0191DBABase kk0191dba = new JKKejbKK0191DBABase();
		CAANMsg kk0191CurrentInfo = kk0191dba.getKK0191Current(svcKeiUcwkNo, JKKModelCommon.getOpeDate(inMsg));
		if (kk0191CurrentInfo == null)
		{
			return false;
		}

		// カレントレコードのNTT契約者住所と同一の場合
		if(nttKeishaAdCd.equals(kk0191CurrentInfo.getString(KK0191ETMsg.NTT_KEISHA_AD_CD)) && 
				nttKeishaPcd.equals(kk0191CurrentInfo.getString(KK0191ETMsg.NTT_KEISHA_PCD)))
		{
			return false;
		}

		return true;
	}
	
	/**
	 * <p>
	 * 未返却ＶＡ解約ＳＯＤ発行チェック実行可否判定チェック。
	 * </p>
	 * 下記の@〜Bの条件を全て満たすサービス契約内訳データはチェックを実行しないようにする
	 * @住所変更による電話番号登録の場合
	 * A該当電話番号を登録した住所変更申込にて住所変更確定が行われていない場合
	 * B住所変更に伴うサービス追加でない場合
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param svcKeiUckwNo サービス契約内訳番号
	 * @return 未返却ＶＡ解約ＳＯＤ発行チェックを実行する場合はtrue、実行しない場合はfalse
	 */
	private boolean isMiRtnVADslSodHakRunChk(CAANMsg inMsg, String svcKeiUckwNo)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0161ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append("SELECT COUNT(*) AS CNT ")
				.append(" FROM  KK_T_SVC_KEI_UCWK KK0161 ")
				.append(" WHERE KK0161.SVC_KEI_UCWK_NO = ? ")
				.append(" AND   KK0161.IDO_DIV = '00019' ")
				.append(" AND   (KK0161.SVC_KEI_UCWK_NO, KK0161.GENE_ADD_DTM) = ")
				.append("       (SELECT KK0161_GENE.SVC_KEI_UCWK_NO, MIN(KK0161_GENE.GENE_ADD_DTM) AS KK0161_MIN ")
				.append("        FROM   KK_T_SVC_KEI_UCWK KK0161_GENE ")
				.append("        WHERE  KK0161_GENE.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO ")
				.append("        AND    KK0161_GENE.MK_FLG = '0' ")
				.append("        GROUP BY KK0161_GENE.SVC_KEI_UCWK_NO) ")
				.append(" AND  NOT EXISTS ( ")
				.append("                 SELECT 1 ")
				.append("                 FROM  KK_T_ADCHG_DTL KK2101 ")
				.append("                 INNER JOIN  KK_T_ADCHG KK2091 ")
				.append("                 ON  KK2091.ADCHG_NO = KK2101.ADCHG_NO ")
				.append("                 WHERE ")
				.append("                       KK2101.CHAF_SKBT_NO = KK0161.SVC_KEI_UCWK_NO ")
				.append("                 AND   KK2101.CHBF_SKBT_NO != KK0161.SVC_KEI_UCWK_NO ")
				.append("                 AND   KK2101.ADCHG_DTL_SBT_CD = '02' ")
				.append("                 AND   KK2101.MK_FLG = '0' ")
				.append("                 AND   KK2091.ADCHG_STAT = '003' ")
				.append("                 AND   KK2091.MK_FLG = '0' ")
				.append("                ) ")
				.append(" AND  NOT EXISTS ( ")
				.append("                 SELECT 1 ")
				.append("                 FROM  KK_T_ADCHG_DTL KK2101_02 ")
				.append("                 INNER JOIN  KK_T_ADCHG_DTL KK2101_01 ")
				.append("                 ON  KK2101_01.ADCHG_NO = KK2101_02.ADCHG_NO ")
				.append("                 INNER JOIN  KK_T_SVC_KEI KK0081 ")
				.append("                 ON  KK0081.SVC_KEI_NO = KK2101_01.CHAF_SKBT_NO ")
				.append("                 INNER JOIN  KK_T_SVC_KEI_UCWK KK0161 ")
				.append("                 ON  KK0161.SVC_KEI_UCWK_NO = KK2101_02.CHAF_SKBT_NO ")
				.append("                 AND KK0161.SVC_KEI_NO = KK0081.SVC_KEI_NO ")
				.append("                 WHERE ")
				.append("                       KK2101_02.CHAF_SKBT_NO = KK0161.SVC_KEI_UCWK_NO ")
				.append("                 AND   KK2101_02.ADCHG_DTL_SBT_CD = '02' ")
				.append("                 AND   KK2101_02.CHBF_SKBT_NO IS NULL ")
				.append("                 AND   KK2101_02.MK_FLG ='0' ")
				.append("                 AND   KK2101_01.ADCHG_DTL_SBT_CD = '01' ")
				.append("                 AND   KK2101_01.CHBF_SKBT_NO IS NULL ")
				.append("                 AND   KK2101_02.MK_FLG ='0' ")
				.append("                 AND   KK0161.SVC_KEI_UCWK_NO = ? ")
				.append("                 AND  (KK0081.SVC_KEI_NO, KK0081.RSV_APLY_YMD || KK0081.GENE_ADD_DTM) = ")
				.append("                       (SELECT KK0081_GENE.SVC_KEI_NO, MAX(KK0081_GENE.RSV_APLY_YMD || KK0081_GENE.GENE_ADD_DTM) AS KK0081_MAX ")
				.append("                        FROM   KK_T_SVC_KEI KK0081_GENE ")
				.append("                        WHERE  KK0081_GENE.SVC_KEI_NO = KK0081.SVC_KEI_NO ")
				.append("                        AND    KK0081_GENE.RSV_APLY_YMD <= ? ")
				.append("                        AND    KK0081_GENE.RSV_APLY_CD = '2' ")
				.append("                        AND    KK0081_GENE.MK_FLG = '0' ")
				.append("                        GROUP BY KK0081_GENE.SVC_KEI_NO) ")
				.append("                 AND     (KK0161.SVC_KEI_UCWK_NO, KK0161.RSV_APLY_YMD || KK0161.GENE_ADD_DTM) = ")
				.append("                      (SELECT KK0161_GENE.SVC_KEI_UCWK_NO, MAX(KK0161_GENE.RSV_APLY_YMD || KK0161_GENE.GENE_ADD_DTM) AS KK0161_MAX ")
				.append("                       FROM   KK_T_SVC_KEI_UCWK KK0161_GENE ")
				.append("                       WHERE  KK0161_GENE.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO ")
				.append("                       AND    KK0161_GENE.RSV_APLY_YMD <= ? ")
				.append("                       AND    KK0161_GENE.RSV_APLY_CD = '2' ")
				.append("                       AND    KK0161_GENE.MK_FLG = '0' ")
				.append("                       GROUP BY KK0161_GENE.SVC_KEI_UCWK_NO) ")
				.append("                ) ");
			

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータの設定(サービス契約内訳番号)
			CAANJDBCUtil.setParam(pstmt, 1, svcKeiUckwNo);
			// パラメータの設定(サービス契約内訳番号)
			CAANJDBCUtil.setParam(pstmt, 2, svcKeiUckwNo);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 3, JKKModelCommon.getOpeDate(inMsg));
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 4, JKKModelCommon.getOpeDate(inMsg));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 件数を返却する
			if (rsltQuery.next())
			{
				// 取得結果がある場合false
				if(rsltQuery.getInt("CNT") > 0)
				{
					return false;
				}
			}
			return true;

		}
		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);
			}
		}
	}
	
// v10.00.00 OM-2014-0003013対応 20141001 ADD START
	/**
	 * <p>
	 * 電話番号休止・解約トーキ利用中チェック（登録ＩＦ用）
	 * </p>
	 * 登録する電話番号が、過去に別の内訳で休止・解約トーキの転送元となっている場合、エラーとする。<br>
     * @−１　対象電話番号が登録された自分以外の内訳を取得
     * 　サービス契約内訳＜電話＞．電話番号 ＝ 登録する電話番号
     * 　※サービス契約内訳ごとのカレントデータを取得する。
     * 
     * @−２　上記で取得した内訳がトーキの転送元であるかを確認
     * 　・解約・休止トーキ種別コードが空白の場合⇒ＯＫ
     * 　・解約・休止トーキ種別コードが設定値あり かつ 解約・休止トーキ終了年月日が空白の場合⇒ＮＧ
     * 　・解約・休止トーキ種別コードが設定値あり かつ 解約・休止トーキ終了年月日 ＞ 運用日の場合⇒ＮＧ
     * 　・解約・休止トーキ種別コードが設定値あり かつ 解約・休止トーキ終了年月日 ＜＝ 運用日の場合⇒ＯＫ
     * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param telno チェック対象となる電話番号
	 * @return false:重複する電話番号が存在する場合
	 *          true :上記以外
	 */
	public boolean isTelnoAddDslPauseTokiChuChk(CAANMsg inCBSMsg, AgentDispatchContext inContext, String telNo)
	{
		// 電話番号が未設定の場合、チェック対象外
		if ((telNo == null || telNo.trim().isEmpty()))
		{
			return true;
		}
		
		// 既契約数を取得します
		// （登録時は内訳番号は未採番のため設定しない）
		long cnt = new JKKejbKK0161DBABase().getTelnoDslPauseTokiChuCnt(telNo, null, JKKModelCommon.getOpeDate(inCBSMsg));

		// 既契約数が0件以上の場合
		if (cnt > 0)
		{
			// 登録する電話番号が、過去に別の内訳で休止・解約トーキの転送元となっていることになるのでエラーとする
			return false;
		}
		return true;
	}
	
	/**
	 * <p>
	 * 電話番号休止・解約トーキ利用中チェック（更新ＩＦ用）
	 * </p>
	 * 登録する電話番号が、過去に別の内訳で休止・解約トーキの転送元となっている場合、エラーとする。<br>
     * @−１　対象電話番号が登録された自分以外の内訳を取得
     * 　サービス契約内訳＜電話＞．電話番号 ＝ 登録する電話番号
     * 　※サービス契約内訳ごとのカレントデータを取得する。
     * 
     * @−２　上記で取得した内訳がトーキの転送元であるかを確認
     * 　・解約・休止トーキ種別コードが空白の場合⇒ＯＫ
     * 　・解約・休止トーキ種別コードが設定値あり かつ 解約・休止トーキ終了年月日が空白の場合⇒ＮＧ
     * 　・解約・休止トーキ種別コードが設定値あり かつ 解約・休止トーキ終了年月日 ＞ 運用日の場合⇒ＮＧ
     * 　・解約・休止トーキ種別コードが設定値あり かつ 解約・休止トーキ終了年月日 ＜＝ 運用日の場合⇒ＯＫ
     * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param telno チェック対象となる電話番号
	 * @param svcKeiUcwkNo チェック対象となるサービス契約内訳番号
	 * @return false:重複する電話番号が存在する場合
	 *          true :上記以外
	 */
	public boolean isTelnoUpdDslPauseTokiChuChk(CAANMsg inCBSMsg, AgentDispatchContext inContext, String telNo, String svcKeiUcwkNo)
	{
		// 電話番号が未設定の場合、チェック対象外
		if ((telNo == null || telNo.trim().isEmpty()) || (svcKeiUcwkNo == null || svcKeiUcwkNo.trim().isEmpty()))
		{
			return true;
		}
		
		// 既契約数を取得します
		long cnt = new JKKejbKK0161DBABase().getTelnoDslPauseTokiChuCnt(telNo, svcKeiUcwkNo, JKKModelCommon.getOpeDate(inCBSMsg));

		// 既契約数が0件以上の場合
		if (cnt > 0)
		{
			// 登録する電話番号が、過去に別の内訳で休止・解約トーキの転送元となっていることになるのでエラーとする
			return false;
		}
		return true;
	}
	
	/**
	 * <p>
	 * 電話番号移転先開通後トーキ利用中チェック（登録ＩＦ用）
	 * </p>
	 * 登録する電話番号が、過去に別の内訳で移転先開通後トーキの転送元となっている場合、エラーとする。<br>
     * @−１　対象電話番号が登録された自分以外の内訳を取得
     * 　サービス契約内訳＜電話＞．電話番号 ＝ 登録する電話番号
     * 　※サービス契約内訳ごとのカレントデータを取得する。
     * 
     * @−２　上記で取得した内訳がトーキの転送元であるかを確認
     * 　・移転先開通後トーキ種別コードが空白の場合⇒ＯＫ
     * 　・移転先開通後トーキ種別コードが設定値あり かつ 移転先開通後トーキ終了年月日が空白の場合⇒ＮＧ
     * 　・移転先開通後トーキ種別コードが設定値あり かつ 移転先開通後トーキ終了年月日 ＞ 運用日の場合⇒ＮＧ
     * 　・移転先開通後トーキ種別コードが設定値あり かつ 移転先開通後トーキ終了年月日 ＜＝ 運用日の場合⇒ＯＫ
     * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param telno チェック対象となる電話番号
	 * @return false:重複する電話番号が存在する場合
	 *          true :上記以外
	 */
	public boolean isTelnoAddItnsOpafTokiChuChk(CAANMsg inCBSMsg, AgentDispatchContext inContext, String telNo)
	{
		// 電話番号が未設定の場合、チェック対象外
		if ((telNo == null || telNo.trim().isEmpty()))
		{
			return true;
		}
		
		// 既契約数を取得します
		// （登録時は内訳番号は未採番のため設定しない）
		long cnt = new JKKejbKK0161DBABase().getTelnoItnsOpafTokiChuCnt(telNo, null, JKKModelCommon.getOpeDate(inCBSMsg));

		// 既契約数が0件以上の場合
		if (cnt > 0)
		{
			// 登録する電話番号が、過去に別の内訳で休止・解約トーキの転送元となっていることになるのでエラーとする
			return false;
		}
		return true;
	}
	
	/**
	 * <p>
	 * 電話番号移転先開通後トーキ利用中チェック（更新ＩＦ用）
	 * </p>
	 * 登録する電話番号が、過去に別の内訳で移転先開通後トーキの転送元となっている場合、エラーとする。<br>
     * @−１　対象電話番号が登録された自分以外の内訳を取得
     * 　サービス契約内訳＜電話＞．電話番号 ＝ 登録する電話番号
     * 　※サービス契約内訳ごとのカレントデータを取得する。
     * 
     * @−２　上記で取得した内訳がトーキの転送元であるかを確認
     * 　・移転先開通後トーキ種別コードが空白の場合⇒ＯＫ
     * 　・移転先開通後トーキ種別コードが設定値あり かつ 移転先開通後トーキ終了年月日が空白の場合⇒ＮＧ
     * 　・移転先開通後トーキ種別コードが設定値あり かつ 移転先開通後トーキ終了年月日 ＞ 運用日の場合⇒ＮＧ
     * 　・移転先開通後トーキ種別コードが設定値あり かつ 移転先開通後トーキ終了年月日 ＜＝ 運用日の場合⇒ＯＫ
     * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param telno チェック対象となる電話番号
	 * @param svcKeiUcwkNo チェック対象となるサービス契約内訳番号
	 * @return false:重複する電話番号が存在する場合
	 *          true :上記以外
	 */
	public boolean isTelnoUpdItnsOpafTokiChuChk(CAANMsg inCBSMsg, AgentDispatchContext inContext, String telNo, String svcKeiUcwkNo)
	{
		// 電話番号が未設定の場合、チェック対象外
		if ((telNo == null || telNo.trim().isEmpty()) || (svcKeiUcwkNo == null || svcKeiUcwkNo.trim().isEmpty()))
		{
			return true;
		}
		
		// 既契約数を取得します
		// （登録時は内訳番号は未採番のため設定しない）
		long cnt = new JKKejbKK0161DBABase().getTelnoItnsOpafTokiChuCnt(telNo, svcKeiUcwkNo, JKKModelCommon.getOpeDate(inCBSMsg));

		// 既契約数が0件以上の場合
		if (cnt > 0)
		{
			// 登録する電話番号が、過去に別の内訳で休止・解約トーキの転送元となっていることになるのでエラーとする
			return false;
		}
		return true;
	}
// v10.00.00 OM-2014-0003013対応 20141001 ADD END
}
