/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKejbKK0251KRCK
*   ソースファイル名：JKKejbKK0251KRCK.java
*   作成者          ：富士通
*   日付            ：2012年09月10日
*＜機能概要＞
*   サービス契約回線内訳の関連制約部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2012/09/10  富士通      新規作成
*
**********************************************************************/

package eo.ejb.common.entity;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;

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.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK0251ETMsg;
import eo.ejb.common.db.JKKejbKK0251DBABase;

/**
 * <p>
 * サービス契約回線内訳の関連制約部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK0251KRCK extends JKKejbKK0251DBABase
{

	/**
	 * <p>
	 * 新しいJSYejbKK0251KRCKを作成します。
	 * </p>
	 */
	public JKKejbKK0251KRCK()
	{
		super();
	}

	/**
	 * <p>
	 * 部屋番号重複チェック処理
	 * </p>
	 * @param  inMsg     処理対象のメッセージキャリア
	 * @param  inContext ディスパッチコンテキスト
	 * @return 部屋番号が重複するデータが存在する場合はtrue。存在しない場合はfalse。
	 */
	public boolean chkDbleAdrrm(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 開始ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JKKejbKK0251KRCK#chkDbleAdrrm");
		
		String mansionBukkenNo = inMsg.getString(KK0251ETMsg.MANSION_BUKKEN_NO);
		String sksYoKisnPlaceAdRmNo = inMsg.getString(KK0251ETMsg.SKS_YO_KISN_PLACE_AD_RM_NO);

		if (mansionBukkenNo == null || "".equals(mansionBukkenNo) || sksYoKisnPlaceAdRmNo == null || "".equals(sksYoKisnPlaceAdRmNo))
		{
			return false;
		}

		String svcKeiKaisenUcwkNo = inMsg.getString(KK0251ETMsg.SVC_KEI_KAISEN_UCWK_NO);

		// 入力値に「サービス契約回線内訳番号」が入力されている場合
		if (null != svcKeiKaisenUcwkNo && !"".equals(svcKeiKaisenUcwkNo))
		{
			// カレントレコードの取得
			CAANMsg inETMsg = new CAANMsg(KK0251ETMsg.class.getName());
			inETMsg.set(KK0251ETMsg.SVC_KEI_KAISEN_UCWK_NO, svcKeiKaisenUcwkNo);
			CAANMsg outETMsg = findByCurrent(inETMsg);
			if (outETMsg != null)
			{
				String curSksYoKisnPlaceAdRmNo = outETMsg.getString(KK0251ETMsg.SKS_YO_KISN_PLACE_AD_RM_NO);
				// 請求書用回線場所住所部屋番号が変更されていない場合
				if (sksYoKisnPlaceAdRmNo.equals(curSksYoKisnPlaceAdRmNo))
				{
					return false;
				}
			}
		}

		HashMap<String , Object> resultMap = getSksYoKisnPlaceAdRmNo(mansionBukkenNo, sksYoKisnPlaceAdRmNo);
		
		if(null == resultMap || resultMap.size() == 0)
		{
			return false;
		}
		
		return true;
	}
	
	/**
	 * <p>
	 * 同一マンション部屋番号取得処理
	 * </p>
	 * @param mansionBukkenNo マンション物件番号
	 * @param sksYoKisnPlaceAdRmNo 請求書用回線場所住所部屋番号
	 * @return 請求書用回線場所住所部屋番号
	 */
	private HashMap<String, Object> getSksYoKisnPlaceAdRmNo(String mansionBukkenNo, String sksYoKisnPlaceAdRmNo)
	{

		// コネクション
		Connection con = null;

		// プリペアステートメント
		PreparedStatement pstmt = null;

		// リザルトセット
		ResultSet rsltQuery = null;

		// SQL文
		StringBuffer sbSql = new StringBuffer();

		sbSql.append(" SELECT KK0251.SKS_YO_KISN_PLACE_AD_RM_NO");
		sbSql.append("  FROM KK_T_SVKEI_KAISEN_UW KK0251");
		sbSql.append("  INNER JOIN KK_T_OWNR_KEI KK0871");
		sbSql.append("     ON KK0871.MANSION_BUKKEN_NO = KK0251.MANSION_BUKKEN_NO");
		sbSql.append("  INNER JOIN KK_T_KAISEN_USE_KEI KK0881");
		sbSql.append("     ON KK0881.OWNR_KEI_NO = KK0871.OWNR_KEI_NO");
		sbSql.append("  WHERE KK0881.MANSION_ID IN (SELECT KK0881_2.MANSION_ID");
		sbSql.append("                               FROM KK_T_KAISEN_USE_KEI KK0881_2");
		sbSql.append("                               INNER JOIN KK_T_OWNR_KEI KK0871_2");
		sbSql.append("                                  ON KK0871_2.OWNR_KEI_NO = KK0881_2.OWNR_KEI_NO");
		sbSql.append("                               WHERE KK0871_2.MANSION_BUKKEN_NO = ?");
		sbSql.append("                                 AND KK0871_2.MK_FLG = '0'");
		sbSql.append("                                 AND KK0881_2.MK_FLG = '0'");
		sbSql.append("                              )");
		sbSql.append("    AND KK0871.MK_FLG = '0'");
		sbSql.append("    AND KK0881.MK_FLG = '0'");
		sbSql.append("    AND KK0251.SVC_KEI_KAISEN_UCWK_STAT IN ('010','100','210')");
		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");
		sbSql.append("               )");
		sbSql.append("    AND KK0251.SKS_YO_KISN_PLACE_AD_RM_NO = ?");

		try
		{
			//コネクション取得
			con = JSYejbConnection.getConnection(KK0251ETMsg.getTableName());

			//prepareStatementにSQL文をセット
			pstmt = con.prepareStatement(sbSql.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), sbSql);

			// バインド変数設定
			CAANJDBCUtil.setParam(pstmt, 1, mansionBukkenNo);
			CAANJDBCUtil.setParam(pstmt, 2, sksYoKisnPlaceAdRmNo);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 返却用MAP
			HashMap<String, Object> retMap = new HashMap<String, Object>();

			// 結果の設定
			while (rsltQuery.next())
			{
				retMap.put(KK0251ETMsg.SKS_YO_KISN_PLACE_AD_RM_NO , rsltQuery.getString(KK0251ETMsg.SKS_YO_KISN_PLACE_AD_RM_NO));
			}

			return retMap;
		}
		catch (SQLException e)
		{
			throw new CAANRuntimeException(e);
		}
		finally
		{
			// 資源の解放
			try
			{
				if (rsltQuery != null)
				{
					rsltQuery.close();
				}
				if (pstmt != null)
				{
					pstmt.close();
				}
				if (con != null)
				{
					CAANConnectionMgr.getInstance().close(con);
				}
			}
			catch (SQLException e)
			{
				throw new CAANRuntimeException(e);
			}
		}
	}
	
	/**
	 * 請求書用回線場所住所部屋番号存在チェック
	 * <p>
	 * 回線使用契約番号に紐付くサービス契約回線内訳に、入力された請求書用回線場所住所部屋番号と同一のデータが存在するかチェックする
	 * </p>
	 * @param kaisenUseKeiNo 回線使用契約番号
	 * @param sksYoKisnPlaceAdRmNo 請求書用回線場所住所部屋番号
	 * @param onlOpeYmd オンライン運用日付
	 * @return true:請求書用回線場所住所部屋番号が重複している false:請求書用回線場所住所部屋番号が重複しない
	 */
	public boolean isSksYoKisnPlcAdNmNoIpt(String kaisenUseKeiNo, String sksYoKisnPlaceAdRmNo, String onlOpeYmd)
	{
		// コネクション
		Connection con = null;

		// プリペアステートメント
		PreparedStatement pstmt = null;

		// リザルトセット
		ResultSet rsltQuery = null;

		// SQL文
		StringBuffer sqlBuffer = new StringBuffer();

		sqlBuffer.append(" SELECT COUNT(*) AS CNT");
		sqlBuffer.append("   FROM KK_T_KAISEN_USE_KEI KK0881");
		sqlBuffer.append(" INNER JOIN KK_T_TK_HOSHIKI_KEI KK0891");
		sqlBuffer.append("     ON KK0891.KAISEN_USE_KEI_NO = KK0881.KAISEN_USE_KEI_NO");
		sqlBuffer.append(" INNER JOIN KK_T_SVC_KEI KK0081");
		sqlBuffer.append("     ON KK0081.TK_HOSHIKI_KEI_NO = KK0891.TK_HOSHIKI_KEI_NO");
		sqlBuffer.append(" INNER JOIN KK_T_KAISEN_TG_SVKEI KK0241");
		sqlBuffer.append("     ON KK0241.SVC_KEI_NO = KK0081.SVC_KEI_NO");
		sqlBuffer.append(" INNER JOIN KK_T_SVKEI_KAISEN_UW KK0251");
		sqlBuffer.append("     ON KK0251.SVC_KEI_KAISEN_UCWK_NO = KK0241.SVC_KEI_KAISEN_UCWK_NO");
		sqlBuffer.append(" WHERE KK0881.KAISEN_USE_KEI_NO = ?");
		sqlBuffer.append("   AND KK0251.SKS_YO_KISN_PLACE_AD_RM_NO = ?");
		sqlBuffer.append("   AND KK0241.MK_FLG = '0'");
		sqlBuffer.append("   AND KK0881.MK_FLG = '0'");
		sqlBuffer.append("   AND KK0891.MK_FLG = '0'");
		sqlBuffer.append("   AND (KK0251.SVC_KEI_KAISEN_UCWK_NO, KK0251.GENE_ADD_DTM) =");
		sqlBuffer.append("       (SELECT KK0251_GENE.SVC_KEI_KAISEN_UCWK_NO, MAX(KK0251_GENE.GENE_ADD_DTM)");
		sqlBuffer.append("          FROM KK_T_SVKEI_KAISEN_UW KK0251_GENE");
		sqlBuffer.append("         WHERE KK0251_GENE.SVC_KEI_KAISEN_UCWK_NO = KK0251.SVC_KEI_KAISEN_UCWK_NO");
		sqlBuffer.append("           AND KK0251_GENE.MK_FLG = '0'");
		sqlBuffer.append("      GROUP BY KK0251_GENE.SVC_KEI_KAISEN_UCWK_NO) ");
		sqlBuffer.append("   AND (KK0081.SVC_KEI_NO, KK0081.RSV_APLY_YMD || KK0081.GENE_ADD_DTM) =");
		sqlBuffer.append("       (SELECT KK0081_GENE.SVC_KEI_NO, MAX(KK0081_GENE.RSV_APLY_YMD || KK0081_GENE.GENE_ADD_DTM) ");
		sqlBuffer.append("          FROM KK_T_SVC_KEI KK0081_GENE");
		sqlBuffer.append("         WHERE KK0081_GENE.SVC_KEI_NO = KK0081.SVC_KEI_NO");
		sqlBuffer.append("           AND KK0081_GENE.RSV_APLY_YMD <= ?");
		sqlBuffer.append("           AND KK0081_GENE.RSV_APLY_CD = '2'");
		sqlBuffer.append("           AND KK0081_GENE.MK_FLG = '0'");
		sqlBuffer.append("      GROUP BY KK0081_GENE.SVC_KEI_NO) ");
		sqlBuffer.append("   AND KK0081.SVC_KEI_STAT IN ('010','020','030','100','210','220')");

		try
		{
			//コネクション取得
			con = JSYejbConnection.getConnection(KK0251ETMsg.getTableName());

			//prepareStatementにSQL文をセット
			pstmt = con.prepareStatement(sqlBuffer.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), sqlBuffer);

			// バインド変数設定
			CAANJDBCUtil.setParam(pstmt, 1, kaisenUseKeiNo);
			CAANJDBCUtil.setParam(pstmt, 2, sksYoKisnPlaceAdRmNo);
			CAANJDBCUtil.setParam(pstmt, 3, onlOpeYmd);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 結果の設定
			if (rsltQuery.next())
			{
				// 入力された請求書用回線場所住所部屋番号と一致するデータが1件以上
				if (rsltQuery.getLong("CNT") > 0L)
				{
					return true;
				}
			}
		}
		catch (SQLException e)
		{
			throw new CAANRuntimeException(e);
		}
		finally
		{
			// 資源の解放
			try
			{
				if (rsltQuery != null)
				{
					rsltQuery.close();
				}
				if (pstmt != null)
				{
					pstmt.close();
				}
				if (con != null)
				{
					CAANConnectionMgr.getInstance().close(con);
				}
			}
			catch (SQLException e)
			{
				throw new CAANRuntimeException(e);
			}
		}

		// 入力された請求書用回線場所住所部屋番号と一致しない場合
		return false;
	}

}
