/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKejbKK0101KRCK
*   ソースファイル名：JKKejbKK0101KRCK.java
*   作成者          ：富士通
*   日付            ：2011年04月21日
*＜機能概要＞
*   申込明細の関連制約部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/04/21  富士通      新規作成
*   v75.00.00	2025/04/21	 FJ)柴田	【ANK-4673-00-00】テレビ新コース（スカパー用）導入対応　2025年6月フォロー案件
*
**********************************************************************/

package eo.ejb.common.entity;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

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.KK0101ETMsg;
import eo.ejb.cbm.entity.KK0101LE;
import eo.ejb.cbm.entity.KU0011ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0101C050CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.db.JKKejbKK0101DBABase;
import eo.ejb.common.db.JKKejbKU0011DBABase;

/**
 * <p>
 * サービス契約＜eo光TV＞の関連制約部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK0101KRCK extends JKKejbKK0101DBABase
{

	/** 無効フラグ（有効） */
	private static final String MK_FLG_YUKO = "0";

	/**
	 * <p>
	 * 新しいJKKejbKK0021KRCKを作成します。
	 * </p>
	 */
	public JKKejbKK0101KRCK()
	{
		super();
	}

	
	/**
	 * <p>
	 * サービス契約＜eo光TV＞の存在チェックを行います。
	 * </p>
	 * @param svcKeiNo サービス契約番号
	 * @param gene_add_dtm 世代登録年月日時分秒
	 * @return レコードが存在する場合はtrue。存在しない場合はfalse。
	 */
	public boolean isExists(String svcKeiNo, String gene_add_dtm)
	{
		if( svcKeiNo == null || "".equals(svcKeiNo) || 
				gene_add_dtm == null || "".equals(gene_add_dtm)	)
		{
			return true;
		}

		// ETメッセージ
		CAANMsg msg = new CAANMsg(KK0101ETMsg.class.getName());
		msg.set(KK0101ETMsg.SVC_KEI_NO, svcKeiNo);
		msg.set(KK0101ETMsg.GENE_ADD_DTM,gene_add_dtm);

		// ロジカルエンティティ生成
		KK0101LE le = new KK0101LE();

		CAANMsg rsltmsg = le.findByPrimaryKey(msg);

		//存在しない場合
		if (rsltmsg == null)
		{
			return false;
		}

		//存在する場合
		return true;
	}

	/**
	 * <p>
	 * サービス契約＜eo光TV＞の未存在チェックを行います。
	 * </p>
	 * @param svcKeiNo サービス契約番号
	 * @param gene_add_dtm 世代登録年月日時分秒
	 * @return PK検索でレコードが存在しない場合はtrue。存在する場合はfalse。
	 */
	public boolean isNonExists(String svcKeiNo, String gene_add_dtm)
	{
		// ETメッセージ
		CAANMsg msg = new CAANMsg(KK0101ETMsg.class.getName());
		msg.set(KK0101ETMsg.SVC_KEI_NO, svcKeiNo);
		msg.set(KK0101ETMsg.GENE_ADD_DTM,gene_add_dtm);

		// ロジカルエンティティ生成
		KK0101LE le = new KK0101LE();

		CAANMsg rsltmsg = le.findByPrimaryKey(msg);

		//存在しない場合
		if (rsltmsg == null)
		{
			return true;
		}

		//存在する場合
		return false;
	}

	/**
	 * <p>
	 * サービス契約＜eo光TV＞の存在チェックを行います。（世代登録年月日時分秒を除く有効なレコード）
	 * </p>
	 * @param svcKeiNo サービス契約番号
	 * @return レコードが存在する場合はtrue。存在しない場合はfalse。
	 */
	public boolean isExistsNonGene(String svcKeiNo)
	{
		// ETメッセージ
		CAANMsg msg = new CAANMsg(KK0101ETMsg.class.getName());
		msg.set(KK0101ETMsg.SVC_KEI_NO, svcKeiNo);
		msg.set(KK0101ETMsg.MK_FLG, MK_FLG_YUKO);

		// ロジカルエンティティ生成
		KK0101LE le = new KK0101LE();

		try
		{
			CAANMsg[] rsltList = le.findByCondition(msg);

			//存在しない場合
			if (rsltList.length == 0)
			{
				return false;
			}

			//存在する場合
			return true;
		}
		catch (CAANException ex)
		{
			throw new CAANRuntimeException(ex);
		}
	}

	/**
	 * <p>
	 * サービス契約<eo光TV>の存在チェックを行います。（有効なレコード）
	 * </p>
	 * @param svcKeiNo サービス契約番号
	 * @param gene_add_dtm 世代登録年月日時分秒
	 * @return レコードが存在する場合はtrue。存在しない場合はfalse。
	 */
	public boolean isExistsYuko(String svcKeiNo, String gene_add_dtm)
	{
		if( svcKeiNo == null || "".equals(svcKeiNo) || 
				gene_add_dtm == null || "".equals(gene_add_dtm)	)
		{
			return true;
		}
		// ETメッセージ
		CAANMsg msg = new CAANMsg(KK0101ETMsg.class.getName());
		msg.set(KK0101ETMsg.SVC_KEI_NO, svcKeiNo);
		msg.set(KK0101ETMsg.GENE_ADD_DTM, gene_add_dtm);
		msg.set(KK0101ETMsg.MK_FLG, MK_FLG_YUKO);

		// ロジカルエンティティ生成
		KK0101LE le = new KK0101LE();

		try
		{
			CAANMsg[] rsltList = le.findByCondition(msg);

			//存在しない場合
			if (rsltList.length == 0)
			{
				return false;
			}

			//存在する場合
			return true;
		}
		catch (CAANException ex)
		{
			throw new CAANRuntimeException(ex);
		}
	}
	// ANK-4673-00-00 ADD START
	/**
	 * <p>
	 * 開通前コース変更状態チェックを行います（新設工事）（機器変更あり）。
	 * </p>
	 * @param  inMsg 処理対象のメッセージキャリア
	 * @param  inContext Agentから渡されたAgentDispatchContext
	 * @param pcrsCd 
	 * @param exPcrsCd 
	 * @return サービス契約番号に紐付く新設の工事で配送データが作成済みの場合はfalse。それ以外はtrue。
	 */
	public boolean isCrsCngValidNew1(CAANMsg inMsg, AgentDispatchContext inContext, String exPcrsCd, String pcrsCd)
	{
		if (("AC0".equals(exPcrsCd) && "A39".equals(pcrsCd))
				||("AC1".equals(exPcrsCd) && "A39".equals(pcrsCd))
				||("A39".equals(exPcrsCd) && "AC0".equals(pcrsCd))
				||("A39".equals(exPcrsCd) && "AC1".equals(pcrsCd))){
			// サービス契約番号に紐付く新設の工事案件の件数を取得する
			Long lData = getKU0011PlusDK0021New(inMsg, inContext);
			// 新設でかつ配送データ作成済みの場合
			if (lData > 0 )
			{
				return false;
			}
		}
		return true;
	}
	/**
	 * <p>
	 * サービス契約番号に紐付く、工事案件と配送を取得します（新設工事）。
	 * </p>
	 * @param  inMsg     処理対象のメッセージキャリア
	 * @param  inContext ディスパッチコンテキスト
	 * @return 取得したデータ件数
	 */
	private Long getKU0011PlusDK0021New(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// コネクション
		Connection con = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		// 返却用データ件数
		Long lDateCnt = 0L;

		try
		{
			// 対象テーブルのコネクション取得
			con = JSYejbConnection.getConnection(KU0011ETMsg.getTableName());

			// SQL文
			StringBuffer sbSql = new StringBuffer();

			sbSql.append(" SELECT ");
			sbSql.append("     COUNT(*) AS CNT ");
			sbSql.append(" FROM ");
			sbSql.append("     KU_T_SVKEI_KOJIAK KU0081 ");
			sbSql.append("     INNER JOIN KU_T_KOJIAK KU0011 ");
			sbSql.append("     ON KU0011.KOJIAK_NO = KU0081.KOJIAK_NO ");
			sbSql.append("     INNER JOIN DK_T_HAISO_TG_BPIN DK0021 ");
			sbSql.append("     ON DK0021.KOJIAK_NO = KU0081.KOJIAK_NO ");
			sbSql.append("     INNER JOIN DK_T_HAISO DK0011 ");
			sbSql.append("     ON DK0011.HAISO_NO = DK0021.HAISO_NO ");
			sbSql.append(" WHERE ");
			sbSql.append("     KU0081.SVC_KEI_NO = ? ");
			sbSql.append("     AND KU0081.SVKEI_KOJIAK_TSTAYMD <= ? ");
			sbSql.append("     AND KU0081.SVKEI_KOJIAK_TENDYMD >= ? ");
			sbSql.append("     AND KU0011.KOJIAK_STAT IN ('110', '130', '140', '150', '160', '170', '180', '190') ");
			sbSql.append("     AND KU0011.KOJIAK_SBT_CD = '001' ");
			sbSql.append("     AND KU0081.MK_FLG = '0' ");
			sbSql.append("     AND KU0011.MK_FLG = '0' ");
			sbSql.append("     AND DK0021.MK_FLG = '0' ");
			sbSql.append("     AND DK0011.MK_FLG = '0' ");

			// repareStatementにSQL文をセット
			pstmt = con.prepareStatement(sbSql.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sbSql);

			// パラメータの設定(サービス契約番号を指定)
			CAANJDBCUtil.setParam(pstmt, 1, inMsg.getString(KK0101ETMsg.SVC_KEI_NO));
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 2, JKKModelCommon.getOpeDate(inMsg));
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 3, JKKModelCommon.getOpeDate(inMsg));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 結果の設定
			if (rsltQuery.next())
			{
				lDateCnt = rsltQuery.getLong("CNT");
			}

			return lDateCnt;
		}
		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);
			}
		}
	}
	// ANK-4673-00-00 ADD END
}
