/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JKKejbKK2541KRCK
*   ソースファイル名：JKKejbKK2541KRCK.java
*   作成者          ：富士通
*   日付            ：2012年08月13日
*＜機能概要＞
*   割賦契約の関連制約部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2012/08/13  富士通      新規作成
*   v4.00.00    2013/01/28  FJ)坂本     IT1-2013-0000162 
*   v5.00.00    2013/11/14  FJ）寺園    OM-2013-0004058
*
**********************************************************************/

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 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.KK0341ETMsg;
import eo.ejb.cbm.entity.KK2541ETMsg;
import eo.ejb.cbm.entity.KK2541LE;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.db.JKKejbKK0081DBABase;
import eo.ejb.common.db.JKKejbKK2541DBABase;

/**
 * <p>
 * 割賦契約の関連制約部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK2541KRCK extends JKKejbKK0081DBABase
{

	/** 無効フラグ（有効） */
	private static final String MK_FLG_YUKO = "0";

	/** サービスコード(インターネットサービス) */
	private static final String SVC_CD_NET = "01";

	/**
	 * <p>
	 * 新しいJSYejbKK0081KRCKを作成します。
	 * </p>
	 */
	public JKKejbKK2541KRCK()
	{
		super();
	}

	/**
	 * <p>
	 * 割賦契約の存在チェックを行います。
	 * </p>
	 * @param kapKeiNo 割賦契約番号
	 * @param gene_add_dtm 世代登録年月日時分秒
	 * @return レコードが存在する場合はtrue。存在しない場合はfalse。
	 */
	public boolean isExists(String kapKeiNo, String gene_add_dtm)
	{
		// ETメッセージ
		CAANMsg msg = new CAANMsg(KK2541ETMsg.class.getName());
		msg.set(KK2541ETMsg.KAP_KEI_NO, kapKeiNo);
		msg.set(KK2541ETMsg.GENE_ADD_DTM, gene_add_dtm);

		// ロジカルエンティティ生成
		KK2541LE le = new KK2541LE();

		CAANMsg rsltmsg = le.findByPrimaryKey(msg);

		//存在しない場合
		if (rsltmsg == null)
		{
			return false;
		}

		//存在する場合
		return true;
	}

	/**
	 * <p>
	 * 割賦契約の存在チェックを行います。（世代登録年月日時分秒を除く有効なレコード）
	 * </p>
	 * @param kapKeiNo 割賦契約番号
	 * @return レコードが存在する場合はtrue。存在しない場合はfalse。
	 */
	public boolean isExistsNonGene(String kapKeiNo)
	{
		// ETメッセージ
		CAANMsg msg = new CAANMsg(KK2541ETMsg.class.getName());
		msg.set(KK2541ETMsg.KAP_KEI_NO, kapKeiNo);
		msg.set(KK2541ETMsg.MK_FLG, MK_FLG_YUKO);

		// ロジカルエンティティ生成
		KK2541LE le = new KK2541LE();

		try
		{
			CAANMsg[] rsltmsg = le.findByCondition(msg);

			//存在しない場合
			if (rsltmsg.length == 0)
			{
				return false;
			}

			//存在する場合
			return true;

		}
		catch (CAANException ex)
		{
			throw new CAANRuntimeException(ex);
		}
	}
	
	/**
	 * <p>
	 * 割賦契約の割賦契約番号をKEYにカレント取得し、割賦ステータスが"締結済"以外かを判定
	 * </p>
	 * @param hktgiMotoKapKeiNo 引継元割賦契約番号
	 * @param opeDate 運用日付
	 * @return true:締結済　false:締結済みでない
	 */
	public boolean isKapKeiStateChk(String hktgiMotoKapKeiNo, String opeDate)
	{
		// ETメッセージ
		CAANMsg inETMsg = new CAANMsg(KK2541ETMsg.class.getName());
		inETMsg.set(KK2541ETMsg.KAP_KEI_NO, hktgiMotoKapKeiNo);
		inETMsg.set(KK2541ETMsg.RSV_APLY_YMD, opeDate);

		CAANMsg msg = new JKKejbKK2541DBABase().findByCurrent(inETMsg);

		// 検索結果が0件の場合
		if (msg == null)
		{
			// 引継元がないということなのでエラー
			return false;
		}

		// 割賦契約ステータスが"締結済"、"完了済"以外の場合
		if (!JKKModelConst.KAP_KEI_STAT_CNC_ZM.equals(msg.getString(KK2541ETMsg.KAP_KEI_STAT)) && 
				!JKKModelConst.KAP_KEI_STAT_FIN_ZM.equals(msg.getString(KK2541ETMsg.KAP_KEI_STAT)))
		{
			return false;
		}
		return true;
	}
	
	/**
	 * 
	 * <p>
	 * サービス契約番号に紐付く割賦契約の存在チェックを行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo サービス契約番号
	 * @return サービス契約番号に紐付く割賦契約が存在している場合、true
	 *          上記以外、false
	 */
	public boolean isExistsKapKeiSvcKeiNo(CAANMsg inMsg, AgentDispatchContext inContext, Object svcKeiNo)
	{
		// 運用日付
		String opeDate = JKKModelCommon.getOpeDate(inMsg);

		// サービス契約メッセージ
		CAANMsg inETMsg = new CAANMsg(KK0081ETMsg.class.getName());
		inETMsg.set(KK0081ETMsg.SVC_KEI_NO, svcKeiNo);
		inETMsg.set(KK0081ETMsg.RSV_APLY_YMD, opeDate);

		CAANMsg outKK0081ETMsg = new JKKejbKK0081DBABase().findByCurrent(inETMsg);

		// カレントレコードが取得できない場合、falseを返却
		if (outKK0081ETMsg == null)
		{
			return false;
		}
		
		// インターネットサービス以外の場合、falseを返却
		if(!SVC_CD_NET.equals(outKK0081ETMsg.getString(KK0081ETMsg.SVC_CD))){
			return false;
		}

		// 割賦契約番号の一覧を取得する
		ArrayList<String> kapKeiNoList = getKapKeiNoListSvcKeiNo(inMsg, inContext, svcKeiNo.toString());

		// 割賦契約番号一覧が0件の場合、falseを返却する
		if (null == kapKeiNoList || kapKeiNoList.size() == 0)
		{
			return false;
		}

		// 上記以外の場合、trueを返却するｓ
		return true;
	}

	/**
	 * <p>
	 * 割賦契約番号一覧(サービス契約番号)取得処理
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo サービス契約番号
	 * @return サービス契約番号に紐付く割賦契約番号の一覧
	 */
	private ArrayList<String> getKapKeiNoListSvcKeiNo(CAANMsg inMsg, AgentDispatchContext inContext, String svcKeiNo)
	{
		// コネクション
		Connection con = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// 運用日付
		String opeDate = JKKModelCommon.getOpeDate(inMsg);
		// 返却用リスト
		ArrayList<String> retList = null;

		try
		{
			// 対象テーブルのコネクション取得
			con = JSYejbConnection.getConnection(KK0341ETMsg.getTableName());

			// SQL文
			StringBuffer sbSql = new StringBuffer();

			sbSql.append(" SELECT KK2541.KAP_KEI_NO ");
			sbSql.append("   FROM KK_T_KAP_KEI KK2541 ");
			sbSql.append("  INNER JOIN ");
			sbSql.append("    (SELECT MIN(KK0341_01.KKTK_SVC_KEI_NO) AS KKTK_SVC_KEI_NO ");
			sbSql.append("       FROM KK_T_KKTK_SVC_KEI KK0341_01 ");
			sbSql.append("      WHERE KK0341_01.SVC_KEI_NO = ? ");
			sbSql.append("        AND KK0341_01.TAKNKIKI_SBT_CD = 'P0' ");
			sbSql.append("        AND KK0341_01.OYA_KEI_SKBT_CD = '01' ");
			sbSql.append("        AND (KK0341_01.KKTK_SVC_KEI_NO, KK0341_01.RSV_APLY_YMD || KK0341_01.GENE_ADD_DTM) = ");
			sbSql.append("            (SELECT KK0341_01_GENE.KKTK_SVC_KEI_NO, MAX(KK0341_01_GENE.RSV_APLY_YMD || KK0341_01_GENE.GENE_ADD_DTM) AS MAX_GENE ");
			sbSql.append("               FROM KK_T_KKTK_SVC_KEI KK0341_01_GENE ");
			sbSql.append("              WHERE KK0341_01_GENE.KKTK_SVC_KEI_NO = KK0341_01.KKTK_SVC_KEI_NO ");
			sbSql.append("                AND KK0341_01_GENE.RSV_APLY_YMD <= ? ");
			sbSql.append("                AND KK0341_01_GENE.RSV_APLY_CD = '2' ");
			sbSql.append("                AND KK0341_01_GENE.MK_FLG = '0' ");
			sbSql.append("              GROUP BY KK0341_01_GENE.KKTK_SVC_KEI_NO) ");
			sbSql.append("    ) KK0341 ");
			sbSql.append("    ON KK0341.KKTK_SVC_KEI_NO = KK2541.KKTK_SVC_KEI_NO ");
			sbSql.append("    AND (KK2541.KAP_KEI_NO, KK2541.RSV_APLY_YMD || KK2541.GENE_ADD_DTM) = ");
			sbSql.append("        (SELECT KK2541_GENE.KAP_KEI_NO, MAX(KK2541_GENE.RSV_APLY_YMD || KK2541_GENE.GENE_ADD_DTM) AS MAX_GENE ");
			sbSql.append("           FROM KK_T_KAP_KEI KK2541_GENE ");
			sbSql.append("          WHERE KK2541_GENE.KAP_KEI_NO = KK2541.KAP_KEI_NO ");
			sbSql.append("            AND KK2541_GENE.RSV_APLY_YMD <= ? ");
			sbSql.append("            AND KK2541_GENE.RSV_APLY_CD = '2' ");
			sbSql.append("            AND KK2541_GENE.MK_FLG = '0' ");
			sbSql.append("          GROUP BY KK2541_GENE.KAP_KEI_NO) ");
			sbSql.append("    AND KK2541.TNMT_BUY_TCHISHO_OPUT_SKCD = '1' ");

			// repareStatementにSQL文をセット
			pstmt = con.prepareStatement(sbSql.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sbSql);

			// パラメータの設定(サービス契約番号を指定)
			CAANJDBCUtil.setParam(pstmt, 1, svcKeiNo);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 2, opeDate);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 3, opeDate);

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			retList = new ArrayList<String>();

			// 結果の設定
			while (rsltQuery.next())
			{
				retList.add(rsltQuery.getString(KK2541ETMsg.KAP_KEI_NO));
			}
		}
		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);
			}
		}

		return retList;
	}
}
