/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbEKK1071C011Edit
*	ソースファイル名：JKKejbEKK1071C011Edit.java
*	作成者			：富士通
*	日付			：2011年07月14日
*＜機能概要＞
*	住所不備サービス契約情報審査チェック部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/07/14	富士通		新規作成
*	v4.00.00	2013/03/29	FJ) 沖田	ST1-2013-0000490
*	v5.00.00	2013/06/27	FJ) 沖田	IT1-2013-0001288
*
**********************************************************************/

package eo.ejb.common.edit;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import com.fujitsu.futurity.model.base.CAANConnectionMgr;
import com.fujitsu.futurity.model.base.CAANJDBCUtil;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.JSYejbConnection;
import com.fujitsu.futurity.model.ejb.common.JSYejbLog;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK0861ETMsg;
import eo.ejb.cbm.entity.KK0861LE;
import eo.ejb.cbm.entity.KK0881ETMsg;
import eo.ejb.cbm.entity.KK0881LE;
import eo.ejb.cbm.entity.KK0891ETMsg;
import eo.ejb.cbm.entity.KK0891LE;
import eo.ejb.cbm.entity.KK1981ETMsg;
import eo.ejb.cbs.cbsmsg.EKK1071C011CBSMsg;
import eo.ejb.common.JKKModelCommon;

/**
 * <p>
 * 住所不備サービス契約情報審査チェック部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbEKK1071C011Edit
{

	/** 異動区分（新規契約） */
	private static final String IDO_IDV_NEW = "00001";

	/** 異動区分（サービス追加） */
	private static final String IDO_IDV_ADD = "00002";

	/** 回線場所住所未確定フラグ（未確定） */
	private static final String MI_FIX_FLG_MI = "1";

	/** 処理結果OK */
	private static final Object CHECK_OK = "00";

	/** 処理結果WG */
	private static final Object CHECK_WG = "02";

	/** 住所コード存在判定エラー */
	private static final String NG_ADCD = "01";
	
	/** 郵便番号存在判定エラー */
	private static final String NG_PCD = "02";
	
	/** 住所名称一致判定エラー */
	private static final String NG_MEISHO = "03";

	/** 都道府県名判定エラー */
	private static final String NG_STATE = "030";
	
	/** 市区町村名一致判定エラー */
	private static final String NG_CITY = "031";
	
	/** 番地号一致判定エラー */
	private static final String NG_BNCHIGO = "032";
	
	/** 設備番号入力判定エラー */
	private static final String NG_SETUBI = "04";
	
	/** 住所マスタ最下層チェックワーニング */
	private static final String WG_AD_KASO = "06";
	
	/** 請求書用部屋番号重複判定エラー */
	private static final String NG_SKROOMDUP = "07";

	/** 審査詳細種別コード(利用場所住所不備チェック) */
	private static final String JGE_DTL_SBT_CD_AD_HBI = "002";
	
	/** 審査対象画面タブコード : 利用場所情報 */
	private static final String JUDGE_TG_SCREEN_TAB_CD_AD_HBI = "02";

	/** 審査対象画面項目コード : ご利用場所 */
	private static final String UDGE_TG_SCREEN_KMK_CD_AD_HBI = "002";
	
	/** 審査詳細メッセージID(利用場所住所不備チェック) */
	private static final String JDG_DTL_MSG_ID_AD_HBI = "EKB0720-KW";

	/** 審査詳細メッセージID(利用場所住所不備チェック) */
	private static final String JDG_DTL_MSG_ID_AD_HBI2 = "EKB5400-KW";

	/** 審査詳細メッセージID(利用場所住所不備チェックエラー) */
	private static final String JDG_DTL_MSG_ID_SETUBI_HBI = "EKB7400-CE";

	/** 審査詳細メッセージID(利用場所住所不備チェックワーニング) */
	private static final String JDG_DTL_MSG_ID_SETUBI_HBI_WG = "EKBD290--Q";
	
	/** 審査詳細メッセージID(利用場所住所不備チェックワーニング) */
	private static final String JDG_DTL_MSG_ID_SEIKYU_ROOM_NO_DUP = "EKB8030--I";
	
	/** メッセージ埋込み文字(利用場所住所不備チェック) */
	private static final String MSG_UMKM_MOJI_ADCD_HBI = "住所マスタ,利用場所住所";
	
	/** メッセージ埋込み文字(利用場所住所不備チェック) */
	private static final String MSG_UMKM_MOJI_PCD_HBI = "郵便番号";

	/** メッセージ埋込み文字(利用場所住所不備チェック) */
	private static final String MSG_UMKM_MOJI_STATE_HBI = "都道府県";

	/** メッセージ埋込み文字(利用場所住所不備チェック) */
	private static final String MSG_UMKM_MOJI_CITY_HBI = "市区町村";
	
	/** メッセージ埋込み文字(利用場所住所不備チェック) */
	private static final String MSG_UMKM_MOJI_BNCHIGO_HBI = "番地号";
	
	/** メッセージ埋込み文字(利用場所住所不備チェック) */
	private static final String MSG_UMKM_MOJI_SETUBI_HBI = "請求書用部屋番号";
	
	/** メッセージ埋込み文字(利用場所住所不備チェック) */
	private static final String MSG_UMKM_MOJI_AD_KASOU_WORNING = "利用場所住所";

	/** メッセージ埋込み文字(請求書用部屋番号重複判定) */
	private static final String MSG_UMKM_MOJI_SEIKYU_ROOM_NO_DUP_ERROR = "請求書用部屋番号";

	/** マンション物件コード（マンション） */
	private static final String MANSION = "001";
	
	/** 加入契約支払方式コード（ﾍﾞｰｽ） */
	private static final String KANYU_KEI_PAY_HOSHIKI_CD_BASE = "001";

	/** 加入契約支払方式コード（全戸一括） */
	private static final String KANYU_KEI_PAY_HOSHIKI_CD_ZENTOIKKATU = "003";

	/** 加入契約支払方式コード（居住者一括） */
	private static final String KANYU_KEI_PAY_HOSHIKI_CD_KYOJYUSYAIKKATU = "004";
	
	/** 住所チェックレベル（1：全て） */
	private static final String AD_CHK_LV_ONE = "1";

	/**
	 * コンストラクタです。
	 */
	public JKKejbEKK1071C011Edit()
	{
	}

	/**
	 * <p>
	 * 住所不備サービス契約情報審査チェック処理。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 審査チェック処理の結果
	 */
	public Object getAdHbiOkForSvcKeiChkRslt(CAANMsg inMsg, AgentDispatchContext inContext)
	{

		// 審査チェック処理部品
		JKKejbKK1071Edit kk1071 = new JKKejbKK1071Edit();
		
		// 審査詳細実施制御の結果からチェックの実施判定を行う
		String errResult = kk1071.getErrRsltKK1831(inMsg, inMsg.getString(EKK1071C011CBSMsg.JDG_JSSI_KINO_SKBT_CD), JGE_DTL_SBT_CD_AD_HBI);
		if(errResult == null)
		{
			return CHECK_OK;
		}
			
		// 引数設定
		String adCd = inMsg.getString(EKK1071C011CBSMsg.KAISEN_PLACE_AD_CD);
		String pcd = inMsg.getString(EKK1071C011CBSMsg.KAISEN_PLACE_PCD);
		String stateNm = inMsg.getString(EKK1071C011CBSMsg.KAISEN_PLACE_STATE_NM);
		String cityNm = inMsg.getString(EKK1071C011CBSMsg.KAISEN_PLACE_CITY_NM);
		String oaztsuNm = inMsg.getString(EKK1071C011CBSMsg.KAISEN_PLACE_OAZTSU_NM);
		String azchoNm = inMsg.getString(EKK1071C011CBSMsg.KAISEN_PLACE_AZCHO_NM);
		String banchiGo = inMsg.getString(EKK1071C011CBSMsg.KAISEN_PLACE_BNCHIGO);
		String idoDiv = inMsg.getString(EKK1071C011CBSMsg.IDO_DIV);
		String kaisenPlaceAdChkLv = inMsg.getString(EKK1071C011CBSMsg.KAISEN_PLACE_AD_CHK_LV);
		

		// 異動区分が「新規契約」、「サービス追加」以外の場合チェック処理部品を呼ばない。
		if (!IDO_IDV_NEW.equals(idoDiv) && !IDO_IDV_ADD.equals(idoDiv))
		{
			return CHECK_OK;
		}

		// 審査チェック処理部品を呼び出す。
		Object result = kk1071.adHbiCheck(inMsg, adCd, pcd, stateNm, cityNm, oaztsuNm, azchoNm, banchiGo);

		
		// 設備番号入力判定を行う
		if (CHECK_OK.equals(result))
		{
			// 引数設定
			String mansionBkNo = inMsg.getString(EKK1071C011CBSMsg.MANSION_BUKKEN_NO);
			String sksyoKisnPlaceAdRmNo = inMsg.getString(EKK1071C011CBSMsg.SKS_YO_KISN_PLACE_AD_RM_NO);
			String tkHoshikiKeiNo = inMsg.getString(EKK1071C011CBSMsg.TK_HOSHIKI_KEI_NO);

			// 設備番号入力判定を行う
			result = this.setubiBangoCheck(inMsg, inContext, mansionBkNo, sksyoKisnPlaceAdRmNo, tkHoshikiKeiNo);
		}
		
		// 住所コード最下層チェックを行う
		if (CHECK_OK.equals(result))
		{
			// サービス契約回線内訳_回線場所住所チェックレベルが"1"(全て)の場合、住所最下層チェックを実施する
			if (AD_CHK_LV_ONE.equals(kaisenPlaceAdChkLv))
			{
				result = adCdMostBottomPri(inMsg, adCd, pcd);
			}
		}

		if(CHECK_OK.equals(result))
		{
			return CHECK_OK;
		}
		else
		{
			String umkmMsg = null;
			String jdgDtlMsgId = null;
			if(NG_ADCD.equals(result) || NG_MEISHO.equals(result))
			{
				umkmMsg = MSG_UMKM_MOJI_ADCD_HBI;
				jdgDtlMsgId = JDG_DTL_MSG_ID_AD_HBI;
			}
			else if(NG_PCD.equals(result))
			{
				umkmMsg = MSG_UMKM_MOJI_PCD_HBI;
				jdgDtlMsgId = JDG_DTL_MSG_ID_AD_HBI2;
			}
			else if(NG_STATE.equals(result))
			{
				umkmMsg = MSG_UMKM_MOJI_STATE_HBI;
				jdgDtlMsgId = JDG_DTL_MSG_ID_AD_HBI2;
			}
			else if(NG_CITY.equals(result))
			{
				umkmMsg = MSG_UMKM_MOJI_CITY_HBI;
				jdgDtlMsgId = JDG_DTL_MSG_ID_AD_HBI2;
			}
			else if(NG_BNCHIGO.equals(result))
			{
				umkmMsg = MSG_UMKM_MOJI_BNCHIGO_HBI;
				jdgDtlMsgId = JDG_DTL_MSG_ID_AD_HBI2;
			}
			else if (NG_SETUBI.equals(result))
			{
				umkmMsg = MSG_UMKM_MOJI_SETUBI_HBI;
				jdgDtlMsgId = JDG_DTL_MSG_ID_SETUBI_HBI;
			}
			else if (WG_AD_KASO.equals(result))
			{
				umkmMsg = MSG_UMKM_MOJI_AD_KASOU_WORNING;
				jdgDtlMsgId = JDG_DTL_MSG_ID_SETUBI_HBI_WG;
				errResult = CHECK_WG.toString();
			}
			else if (NG_SKROOMDUP.equals(result))
			{
				umkmMsg = MSG_UMKM_MOJI_SEIKYU_ROOM_NO_DUP_ERROR;
				jdgDtlMsgId = JDG_DTL_MSG_ID_SEIKYU_ROOM_NO_DUP;
				errResult = CHECK_WG.toString();
			}

			createisAdHbiOkForSvcKei(inMsg, inContext, errResult, jdgDtlMsgId, umkmMsg);
			return errResult;
		}
	}
	
	/**
	 * <p>
	 * 住所コード最下層チェックを行う。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param adCd  住所コード
	 * @param pcd   都道府県名
	 * @return 住所コード最下層チェック結果
	 */
	private Object adCdMostBottomPri(CAANMsg inMsg, String adCd, String pcd)
	{
		// サービス契約回線内訳_回線場所住所未確定フラグが"1"（未確定）の場合、チェック結果OKを返却する
		if (MI_FIX_FLG_MI.equals(inMsg.getString(EKK1071C011CBSMsg.KISN_PLC_AD_MI_FIX_FLG)))
		{
			return CHECK_OK;
		}

		// サービス契約回線内訳_回線場所字丁目名が設定されている場合、チェック結果OKを返却する
		if (!inMsg.isNull(EKK1071C011CBSMsg.KAISEN_PLACE_AZCHO_NM))
		{
			return CHECK_OK;
		}
		
		// 審査チェック処理部品
		JKKejbKK1071Edit kk1071 = new JKKejbKK1071Edit();
		String resultBtm = kk1071.adCdMostBottom(inMsg, adCd, pcd);

		// チェック結果が警告の場合は住所マスタ最下層チェックワーニングを返却
		if (CHECK_WG.equals(resultBtm))
		{
			return WG_AD_KASO;
		}
		return CHECK_OK;
	}

	/**
	 * <p>
	 * 審査詳細の登録を行います（利用場所住所不備チェック）。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param errRsltCd エラー結果コード
	 * @param jdgDtlMsgId メッセージID
	 * @param msgUmkmMoji メッセージ埋め込み文字
	 */
	public void createisAdHbiOkForSvcKei(CAANMsg inMsg, AgentDispatchContext inContext, String errRsltCd, String jdgDtlMsgId, String msgUmkmMoji)
	{
		// 審査詳細の登録用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK1981ETMsg.class.getName());
		
		inETMsg.set(KK1981ETMsg.JUDGE_NO, inMsg.getString(EKK1071C011CBSMsg.JUDGE_NO));
		inETMsg.set(KK1981ETMsg.JDG_DTL_SBT_CD, JGE_DTL_SBT_CD_AD_HBI);
		inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_TAB_CD, JUDGE_TG_SCREEN_TAB_CD_AD_HBI);
		inETMsg.set(KK1981ETMsg.JUDGE_TG_SCREEN_KMK_CD, UDGE_TG_SCREEN_KMK_CD_AD_HBI);
		inETMsg.set(KK1981ETMsg.JUDGE_YMD, JKKModelCommon.getOpeDate(inMsg));
		inETMsg.set(KK1981ETMsg.JUDGE_JUDGE_RSLT_CD, errRsltCd);
		inETMsg.set(KK1981ETMsg.JDG_DTL_MSG_ID, jdgDtlMsgId);
		inETMsg.set(KK1981ETMsg.MSG_UMKM_MOJI, msgUmkmMoji);


		// 登録処理の実施
		boolean createFlg = new JKKejbKK1071Edit().createJudgeDtl(inMsg, inETMsg);

		// PKが重複していた場合は関連制約エラーとする
		if (!createFlg)
		{
			inMsg.set(EKK1071C011CBSMsg.JUDGE_NO_ERR, "EB");
			inMsg.set(EKK1071C011CBSMsg.STATUS, StatusCodes.RELATION_ERR);
		}

	}
	
	/**
	 * <p>
	 * 設備番号入力判定を行います
	 * </p>
	 * @param inCBSMsg              処理対象のメッセージキャリア
	 * @param inContext             Agentから渡されたAgentDispatchContext
	 * @param mansionBkNo           マンション物件番号
	 * @param sksyoKisnPlaceAdRmNo  請求書用回線場所住所部屋番号
	 * @param tkHoshikiKeiNo        提供方式契約番号
	 * @return チェック結果(OK:"00", NG:"01")
	 */
	private Object setubiBangoCheck(CAANMsg inCBSMsg, AgentDispatchContext inContext, String mansionBkNo, String sksyoKisnPlaceAdRmNo, String tkHoshikiKeiNo)
	{
		// マンション物件番号がnullの場合、チェックOKを返却します
		if(mansionBkNo == null) {
			
			return CHECK_OK;
		}
		
		// マンション物件よりマンション物件番号を元にプライマリ検索を行う。
		CAANMsg msInfo = this.kk0861PrimarySearch(mansionBkNo);
		
		// 検索結果が0件の場合またはマンション物件コードが"001"(マンション)以外の場合
		if(msInfo == null || !msInfo.getString(KK0861ETMsg.MANSION_BUKKEN_CD).equals(MANSION)) {
			return CHECK_OK;
		}
		
		// 提供方式契約番号がnullの場合
		if (tkHoshikiKeiNo == null)
		{
			return CHECK_OK;
		}
		
		// 提供方式契約より提供方式契約番号を元にプライマリ検索を行う
		CAANMsg tkInfo = this.kk0891PrimarySearch(tkHoshikiKeiNo);
		
		// 検索結果が0件の場合
		if (tkInfo == null)
		{
			return CHECK_OK;
		}
		
		// 加入契約支払方式コード取得
		String anyuKeiPayHoshikiCd = tkInfo.getString(KK0891ETMsg.KANYU_KEI_PAY_HOSHIKI_CD);
		
		// マンションかつ加入契約支払方式コードが"001"(ﾍﾞｰｽ),003(全戸一括),004(居住者一括)の場合、請求書用回線場所住所部屋番号がnullの場合エラーとする
		if (anyuKeiPayHoshikiCd != null && isKnyuKeiPayHoshikiCd(anyuKeiPayHoshikiCd))
		{
			if(sksyoKisnPlaceAdRmNo == null) {
				return NG_SETUBI;
			}
		}
		
		// 請求書用部屋番号重複判定を行う
		if (!this.isSeikyuRoomNoDup(inCBSMsg, inContext, tkInfo.getString(KK0891ETMsg.KAISEN_USE_KEI_NO)))
		{
			return NG_SKROOMDUP;
		}
		
		return CHECK_OK;
	}
	
	/**
	 * <p>
	 * 請求書用部屋番号重複判定を行います
	 * </p>
	 * @param inCBSMsg　　　　処理対象のメッセージキャリア
	 * @param inContext　　　 Agentから渡されたAgentDispatchContext
	 * @param kaisenUseKeiNo  回線使用契約番号
	 * @return true：正常　false：エラー
	 */
	private boolean isSeikyuRoomNoDup(CAANMsg inCBSMsg, AgentDispatchContext inContext, String kaisenUseKeiNo)
	{
		// 提供方式契約.回線使用契約番号をキーに回線使用契約からマンションIDを取得する
		String mansionId = this.getMansionId(kaisenUseKeiNo);
		
		// 検索結果0件の場合
		if (mansionId == null)
		{
			// 正常
			return true;
		}
		
		// 回線使用契約.マンションIDをキーに請求書用回線場所住所部屋番号を取得する
		ArrayList<String> skprnList = this.getSeikyuKaisenPlRmNo(inCBSMsg, inContext, mansionId);
		
		// 検索結果が0件の場合
		if (skprnList == null)
		{
			// 正常
			return true;
		}
		
		// サービス契約回線内訳_請求書用回線場所住所部屋番号が未設定の場合
		if (inCBSMsg.isNull(EKK1071C011CBSMsg.SKS_YO_KISN_PLACE_AD_RM_NO))
		{
			// 正常
			return true;
		}

		// サービス契約回線内訳_請求書用回線場所住所部屋番を取得する
		String sksYoKisnPlaceAdRmNo = inCBSMsg.getString(EKK1071C011CBSMsg.SKS_YO_KISN_PLACE_AD_RM_NO);

		// 請求書用部屋番号の中にS-IF値．_請求書用回線場所住所部屋番号と一致するものが存在した場合エラー
		if(skprnList.contains(sksYoKisnPlaceAdRmNo)) {
			return false;
		}
		return true;
	}
	
	
	/**
	 * <p>
	 * 回線使用契約.マンションIDをキーに請求書用回線場所住所部屋番号を取得する
	 * </p>
	 * @param inMsg     処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param mansionId マンションID
	 * @return 請求書用回線場所住所部屋番号
	 */
	private ArrayList<String> getSeikyuKaisenPlRmNo(CAANMsg inMsg, AgentDispatchContext inContext, String mansionId)
	{
		// 返却メッセージ
		ArrayList<String> retMsgList = new ArrayList<String>();
		// コネクション
		Connection con = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// SQL文
		StringBuffer sbSql = new StringBuffer();
		// PreparedStatementのパラメータカウント
		int iPCnt = 0;

		try
		{
			// 対象テーブルのコネクション取得
			con = JSYejbConnection.getConnection(KK0881ETMsg.getTableName());

			sbSql.append("SELECT ");
			sbSql.append("    KK0251.SKS_YO_KISN_PLACE_AD_RM_NO ");
			sbSql.append("FROM ");
			sbSql.append("    KK_T_KAISEN_USE_KEI KK0881 ");
			sbSql.append("    INNER JOIN KK_T_TK_HOSHIKI_KEI KK0891 ");
			sbSql.append("    ON KK0891.KAISEN_USE_KEI_NO = KK0881.KAISEN_USE_KEI_NO ");
			sbSql.append("    INNER JOIN KK_T_SVC_KEI KK0081 ");
			sbSql.append("    ON KK0081.TK_HOSHIKI_KEI_NO = KK0891.TK_HOSHIKI_KEI_NO ");
			sbSql.append("    INNER JOIN KK_T_KAISEN_TG_SVKEI KK0241 ");
			sbSql.append("    ON KK0241.SVC_KEI_NO = KK0081.SVC_KEI_NO ");
			sbSql.append("    INNER JOIN KK_T_SVKEI_KAISEN_UW KK0251 ");
			sbSql.append("    ON KK0251.SVC_KEI_KAISEN_UCWK_NO = KK0241.SVC_KEI_KAISEN_UCWK_NO ");
			sbSql.append("WHERE ");
			sbSql.append("    KK0881.MANSION_ID = ? ");
			sbSql.append("    AND KK0881.MK_FLG = '0' ");
			sbSql.append("    AND KK0891.MK_FLG = '0' ");
			sbSql.append("    AND KK0241.MK_FLG = '0' ");
			sbSql.append("    AND (KK0081.SVC_KEI_NO, KK0081.RSV_APLY_YMD || KK0081.GENE_ADD_DTM) = ");
			sbSql.append("        (SELECT KK0081_GENE.SVC_KEI_NO, MAX(KK0081_GENE.RSV_APLY_YMD || KK0081_GENE.GENE_ADD_DTM) AS KK0081_MAX ");
			sbSql.append("         FROM   KK_T_SVC_KEI KK0081_GENE ");
			sbSql.append("         WHERE  KK0081_GENE.SVC_KEI_NO = KK0081.SVC_KEI_NO ");
			sbSql.append("         AND    KK0081_GENE.RSV_APLY_YMD <= ? ");
			sbSql.append("         AND    KK0081_GENE.RSV_APLY_CD = '2' ");
			sbSql.append("         AND    KK0081_GENE.MK_FLG= '0' ");
			sbSql.append("       GROUP BY KK0081_GENE.SVC_KEI_NO) ");
			if(!inMsg.isNull(EKK1071C011CBSMsg.SVC_KEI_KAISEN_UCWK_NO))
			{
				sbSql.append("    AND KK0251.SVC_KEI_KAISEN_UCWK_NO <> ? ");
			}
			sbSql.append("    AND (KK0251.SVC_KEI_KAISEN_UCWK_NO, KK0251.GENE_ADD_DTM) = ");
			sbSql.append("        (SELECT KK0251_GENE.SVC_KEI_KAISEN_UCWK_NO, MAX(KK0251_GENE.GENE_ADD_DTM) AS KK0251_MAX ");
			sbSql.append("         FROM   KK_T_SVKEI_KAISEN_UW KK0251_GENE ");
			sbSql.append("         WHERE  KK0251_GENE.SVC_KEI_KAISEN_UCWK_NO = KK0251.SVC_KEI_KAISEN_UCWK_NO ");
			sbSql.append("         AND    KK0251_GENE.MK_FLG= '0' ");
			sbSql.append("       GROUP BY KK0251_GENE.SVC_KEI_KAISEN_UCWK_NO) ");

			// repareStatementにSQL文をセット
			pstmt = con.prepareStatement(sbSql.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sbSql);

			// パラメータの設定(マンションID)
			CAANJDBCUtil.setParam(pstmt, ++iPCnt, mansionId);
			// パラメータの設定(運用日付)
			CAANJDBCUtil.setParam(pstmt, ++iPCnt, JKKModelCommon.getOpeDate(inMsg));
			// パラメータの設定(サービス契約回線内訳番号)
			if(!inMsg.isNull(EKK1071C011CBSMsg.SVC_KEI_KAISEN_UCWK_NO))
			{
				CAANJDBCUtil.setParam(pstmt, ++iPCnt, inMsg.getString(EKK1071C011CBSMsg.SVC_KEI_KAISEN_UCWK_NO));
			}

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 取得結果をメッセージキャリアに格納
			while (rsltQuery.next())
			{
				retMsgList.add(rsltQuery.getString(1));  // 請求書用回線場所住所部屋番号
			}

			return retMsgList;
		}
		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>
	 * 回線使用契約の検索（プライマリ検索）を行います。
	 * </p>
	 * @param   kaisenUseKeiNo  回線使用契約番号
	 * @return  マンションID
	 */
	private String getMansionId(String kaisenUseKeiNo)
	{
		// プライマリ検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0881ETMsg.class.getName());
		inETMsg.set(KK0881ETMsg.KAISEN_USE_KEI_NO, kaisenUseKeiNo);

		// 作成したメッセージを使用してプライマリ検索を行う
		CAANMsg otETMsg = new KK0881LE().findByPrimaryKey(inETMsg);

		// 検索結果０件の場合
		if (otETMsg == null)
		{
			return null;
		}
		return otETMsg.getString(KK0881ETMsg.MANSION_ID);
	}
	
	/**
	 * <p>
	 * マンション物件の検索（プライマリ検索）を行います。
	 * </p>
	 * @param  mansionBkNo  マンション物件番号
	 * @return マンション物件コードに一致する有効なマンション物件のレコード配列
	 */
	private CAANMsg kk0861PrimarySearch(String mansionBkNo)
	{
		// プライマリ検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0861ETMsg.class.getName());
		inETMsg.set(KK0861ETMsg.MANSION_BUKKEN_NO, mansionBkNo);

		// 作成したメッセージを使用してプライマリ検索を行う
		CAANMsg otETMsg = null;

		otETMsg = new KK0861LE().findByPrimaryKey(inETMsg);

		return otETMsg;

	}
	
	/**
	 * <p>
	 * 提供方式契約の検索（プライマリ検索）を行います。
	 * </p>
	 * @param  tkHoshikiKeiNo  提供方式契約番号
	 * @return マンション物件コードに一致する有効なマンション物件のレコード配列
	 */
	private CAANMsg kk0891PrimarySearch(String tkHoshikiKeiNo)
	{
		// プライマリ検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0891ETMsg.class.getName());
		inETMsg.set(KK0891ETMsg.TK_HOSHIKI_KEI_NO, tkHoshikiKeiNo);

		// 作成したメッセージを使用してプライマリ検索を行う
		CAANMsg otETMsg = null;

		otETMsg = new KK0891LE().findByPrimaryKey(inETMsg);

		return otETMsg;

	}
	
	/**
	 * <p>
	 * 加入契約支払方式コードの種類を判定します
	 * </p>
	 * @param  anyuKeiPayHoshikiCd  加入契約支払方式コード
	 * @return true：002(個人)以外  false：002(個人)
	 */
	private boolean isKnyuKeiPayHoshikiCd(String anyuKeiPayHoshikiCd)
	{
		if (anyuKeiPayHoshikiCd.equals(KANYU_KEI_PAY_HOSHIKI_CD_BASE) || 
			anyuKeiPayHoshikiCd.equals(KANYU_KEI_PAY_HOSHIKI_CD_ZENTOIKKATU) || 
			anyuKeiPayHoshikiCd.equals(KANYU_KEI_PAY_HOSHIKI_CD_KYOJYUSYAIKKATU))
		{
			return true;
		}	
		return false;
	}
}
