/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKK2961D010TPMA
*	ソースファイル名：JEKK2961D010TPMA.java
*	作成者			：富士通
*	日付			：2015年07月16日
*＜機能概要＞
*	サービス契約グループ設定登録の関連チェック部品。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*   v16.00.00   2015/07/16  FJ) 藤田  【ANK-2480-00-00】新電力対応
*   v16.00.01	2016/01/13  FJ) 鯵坂  【OT-2016-0000004】関連チェック処理不備
*   v41.00.00	2019/04/24  FJ) 上間  【ANK-3638-00-00】eo電気紐付けプルダウンリストの表示条件変更
*
**********************************************************************/

package eo.ejb.cbs.mainproc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.fujitsu.futurity.common.JCMConstants;
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 com.fujitsu.futurity.model.ejb.common.fw.TemplateMainHandler;

import eo.common.constant.JKKStrConst;
import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK2961ETMsg;
import eo.ejb.cbs.cbsmsg.EKK2961D010CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.db.JKKejbKK0081DBABase;

/**
 * <p>
 * サービス契約グループ設定登録独自処理部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEKK2961D010TPMA implements TemplateMainHandler
{

	/**
	 * <p>
	 * サービス契約グループ設定登録の顧客独自処理（関連制約）
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	*/
	public void execKRCK(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 開始ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "call:JEKK2961D010TPMA#execKRCK");

		if (getKK2961OtherLinked(inCBSMsg, inContext) > 0)
		{
			inCBSMsg.set(EKK2961D010CBSMsg.SVC_KEI_NO_ERR, "EB");
			inCBSMsg.set(EKK2961D010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			return;
		}
		
		// ▽▽ OT-2016-0000004 ADD START ▽▽
		if (getKK2961OtherLinked2(inCBSMsg, inContext) > 0)
		{
			inCBSMsg.set(EKK2961D010CBSMsg.SVKEI_GRP_SKBT_NO_ERR, "EB");
			inCBSMsg.set(EKK2961D010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			return;
		}
		// △△ OT-2016-0000004  ADD  END △△
		
		if (!isElcSvcKeiEnabled(inCBSMsg, inContext))
		{
			inCBSMsg.set(EKK2961D010CBSMsg.SVC_KEI_NO_ERR, "EC");
			inCBSMsg.set(EKK2961D010CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			return;
		}

		// 終了ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "end:JEKK2961D010TPMA#execKRCK");
	}

	/**
	 * サービス契約グループ設定紐付け済みチェック（サービス契約番号）
	 * @param inMsg
	 * @param inContext
	 * @return
	 */
	public long getKK2961OtherLinked(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// バインド変数設定値保持用領域
		ArrayList<Object> arraylist = new ArrayList<Object>();
		// PreparedStatementのパラメータカウント
		int iPCnt = 0;

		// 返却用変数
		long lDataCnt = 0L;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK2961ETMsg.getTableName());

			String svcKeiNo = inMsg.getString(EKK2961D010CBSMsg.SVC_KEI_NO);
			String opeDate = (String)JKKModelCommon.getOpeDate(inMsg, inContext);
			
			// SQL文
			StringBuffer sql_Buff = new StringBuffer();

			sql_Buff.append(" SELECT ");
			sql_Buff.append("    COUNT(*) AS CNT ");
			sql_Buff.append(" FROM KK_T_SVKEI_GRP_SETE KK2961 ");
			sql_Buff.append(" INNER JOIN KK_T_SVC_KEI KK0081 ");
			sql_Buff.append(" ON KK0081.SVC_KEI_NO = KK2961.SVC_KEI_NO ");
// ANK-3638-00-00 ADD START
			sql_Buff.append(" LEFT JOIN KK_T_KAISEN_TG_SVKEI KK0241 ");
			sql_Buff.append(" ON KK2961.SVKEI_GRP_SKBT_NO = KK0241.SVC_KEI_KAISEN_UCWK_NO ");
			sql_Buff.append(" LEFT JOIN KK_T_SVC_KEI KK0081_SUB ");
			sql_Buff.append(" ON KK0241.SVC_KEI_NO = KK0081_SUB.SVC_KEI_NO ");
// ANK-3638-00-00 ADD END
			sql_Buff.append(" WHERE  KK2961.SVC_KEI_NO = ? ");
			sql_Buff.append(" AND   (KK0081.SVC_KEI_STAT <> '910' AND KK0081.SVC_KEI_STAT <> '920') ");
			sql_Buff.append(" AND    KK2961.MK_FLG = '0' ");
			sql_Buff.append(" AND   (KK0081.SVC_KEI_NO, KK0081.RSV_APLY_YMD || KK0081.GENE_ADD_DTM) = ");
			sql_Buff.append("    (SELECT KK0081_GENE.SVC_KEI_NO, MAX(KK0081_GENE.RSV_APLY_YMD || KK0081_GENE.GENE_ADD_DTM) AS KK0081_MAX ");
			sql_Buff.append("     FROM   KK_T_SVC_KEI KK0081_GENE ");
			sql_Buff.append("     WHERE  KK0081_GENE.SVC_KEI_NO = KK0081.SVC_KEI_NO ");
			sql_Buff.append("     AND    KK0081_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("     AND    KK0081_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("     AND    KK0081_GENE.MK_FLG = '0' ");
			sql_Buff.append("     GROUP BY KK0081_GENE.SVC_KEI_NO) ");
// ANK-3638-00-00 ADD START
			sql_Buff.append(" AND    KK0241.KAISEN_UCWK_USE_STAYMD <= ? ");
			sql_Buff.append(" AND    KK0241.KAISEN_UCWK_USE_ENDYMD >= ? ");
			sql_Buff.append(" AND    KK0241.MK_FLG = '0' ");
			sql_Buff.append(" AND   (KK0081_SUB.SVC_KEI_NO, KK0081_SUB.RSV_APLY_YMD || KK0081_SUB.GENE_ADD_DTM) = ");
			sql_Buff.append("    (SELECT KK0081_SUB_GENE.SVC_KEI_NO, MAX(KK0081_SUB_GENE.RSV_APLY_YMD || KK0081_SUB_GENE.GENE_ADD_DTM) AS KK0081_SUB_MAX ");
			sql_Buff.append("     FROM   KK_T_SVC_KEI KK0081_SUB_GENE ");
			sql_Buff.append("     WHERE  KK0081_SUB_GENE.SVC_KEI_NO = KK0081_SUB.SVC_KEI_NO ");
			sql_Buff.append("     AND    KK0081_SUB_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("     AND    KK0081_SUB_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("     AND    KK0081_SUB_GENE.MK_FLG = '0' ");
			sql_Buff.append("     GROUP BY KK0081_SUB_GENE.SVC_KEI_NO) ");
			sql_Buff.append(" AND    KK0241.SVC_KEI_KAISEN_UCWK_NO IS NOT NULL ");
			sql_Buff.append(" AND    KK0081_SUB.SVC_KEI_NO IS NOT NULL ");
			sql_Buff.append(" AND    KK0081_SUB.SVC_CD = '01' ");
			sql_Buff.append(" AND    KK0081_SUB.SVC_KEI_STAT NOT IN ('910', '920') ");
// ANK-3638-00-00 ADD END
			arraylist.add(svcKeiNo);
			arraylist.add(opeDate);
// ANK-3638-00-00 ADD START
			arraylist.add(opeDate);
			arraylist.add(opeDate);
			arraylist.add(opeDate);
// ANK-3638-00-00 ADD END
			
			//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())
			{
				lDataCnt = rsltQuery.getLong("CNT");
			}

			return lDataCnt;
		}
		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);
			}
		}
	}

// ▽▽▽ OT-2016-0000004 ADD START ▽▽▽
	/**
	 * サービス契約グループ設定紐付け済みチェック（サービス契約グループ識別番号）
	 * @param inMsg
	 * @param inContext
	 * @return
	 */
	public long getKK2961OtherLinked2(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// バインド変数設定値保持用領域
		ArrayList<Object> arraylist = new ArrayList<Object>();
		// PreparedStatementのパラメータカウント
		int iPCnt = 0;

		// 返却用変数
		long lDataCnt = 0L;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK2961ETMsg.getTableName());

			String svcKeiGrpSkbtNo = inMsg.getString(EKK2961D010CBSMsg.SVKEI_GRP_SKBT_NO);
			String opeDate = (String)JKKModelCommon.getOpeDate(inMsg, inContext);
			
			// SQL文
			StringBuffer sql_Buff = new StringBuffer();

			sql_Buff.append(" SELECT ");
			sql_Buff.append("    COUNT(*) AS CNT ");
			sql_Buff.append(" FROM KK_T_SVKEI_GRP_SETE KK2961 ");
			sql_Buff.append(" INNER JOIN KK_T_SVC_KEI KK0081 ");
			sql_Buff.append(" ON KK0081.SVC_KEI_NO = KK2961.SVC_KEI_NO ");
			sql_Buff.append(" WHERE  KK2961.SVKEI_GRP_SKBT_NO = ? ");
			sql_Buff.append(" AND   (KK0081.SVC_KEI_STAT <> '910' AND KK0081.SVC_KEI_STAT <> '920') ");
			sql_Buff.append(" AND    KK2961.MK_FLG = '0' ");
			sql_Buff.append(" AND   (KK0081.SVC_KEI_NO, KK0081.RSV_APLY_YMD || KK0081.GENE_ADD_DTM) = ");
			sql_Buff.append("    (SELECT KK0081_GENE.SVC_KEI_NO, MAX(KK0081_GENE.RSV_APLY_YMD || KK0081_GENE.GENE_ADD_DTM) AS KK0081_MAX ");
			sql_Buff.append("     FROM   KK_T_SVC_KEI KK0081_GENE ");
			sql_Buff.append("     WHERE  KK0081_GENE.SVC_KEI_NO = KK0081.SVC_KEI_NO ");
			sql_Buff.append("     AND    KK0081_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("     AND    KK0081_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("     AND    KK0081_GENE.MK_FLG = '0' ");
			sql_Buff.append("     GROUP BY KK0081_GENE.SVC_KEI_NO) ");
			arraylist.add(svcKeiGrpSkbtNo);
			arraylist.add(opeDate);
			
			//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())
			{
				lDataCnt = rsltQuery.getLong("CNT");
			}

			return lDataCnt;
		}
		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);
			}
		}
	}
// △△△ OT-2016-0000004  ADD  END △△△

	/**
	 * <p>
	 * サービス契約のステータスチェック
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 予約レコードが存在する場合はtrue。存在しない場合はfalse。
	 */
	public boolean isElcSvcKeiEnabled(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 該当の「サービス契約」カレントレコードを取得する。
		String svcKeiNo = inMsg.getString(EKK2961D010CBSMsg.SVC_KEI_NO);
		CAANMsg kk0081Msg = new JKKejbKK0081DBABase().getKK0081Current(svcKeiNo, JKKModelCommon.getOpeDate(inMsg));
		String svcKeiStat = kk0081Msg.getString(KK0081ETMsg.SVC_KEI_STAT);
		
		if (JKKStrConst.CD00037_DSL_ZM.equals(svcKeiStat) || JKKStrConst.CD00037_CANCEL_ZM.equals(svcKeiStat))
		{
			return false;
		}

		return true;
	}


}

