/*******************************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKK0191C130TPMA
*	ソースファイル名：JEKK0191C130TPMA.java
*	作成者			：富士通
*	日付			：2015年10月07日
*＜機能概要＞
*	サービス契約内訳＜eo光電話＞二重発番チェック処理を呼び出す部品。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v19.00.00	2015/10/07	FJ)森脇    【OM-2015-0002295】2重発番チェックの仕様再確認
*
********************************************************************************/

package eo.ejb.cbs.mainproc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;

import com.fujitsu.futurity.common.JCCSuperComExecUtil;
import com.fujitsu.futurity.common.JCCSyslogFormat;
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.common.JCMAPLConstMgr;
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.ejb.cbm.entity.KK0161ETMsg;
import eo.ejb.cbm.entity.KK0191ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0191C130CBSMsg;
import eo.ejb.common.JKKModelCommon;

/**
 * <p>
 * サービス契約内訳＜eo光電話＞二重発番チェック関連チェック顧客独自処理部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEKK0191C130TPMA implements TemplateMainHandler
{
	/**
	 * <p>
	 * 二重発番チェック
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void nijuHtbChk(CAANMsg inMsg, AgentDispatchContext inContext)
	{
		// 開始ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "call:JEKK0191C130TPMA#nijuHtbChk");

		// 判定条件
		String svcKeiNo = inMsg.getString(EKK0191C130CBSMsg.SVC_KEI_NO);
		String telno = inMsg.getString(EKK0191C130CBSMsg.TELNO);
		if(!isTelNoDubbleAddChk(inMsg, inContext, svcKeiNo, telno))
		{
			inMsg.set(EKK0191C130CBSMsg.TELNO_ERR, "EA");
			inMsg.set(JCMConstants.STATUS_INT_KEY, StatusCodes.RELATION_ERR);
		}
		// 終了ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "end:JEKK0191C130TPMA#nijuHtbChk");
	}

	/**
	 * <p>
	 * 電話番号２重登録チェック
	 * </p>
	 * これから登録しようとしている電話番号が他の契約にて既に登録されている場合、エラーとする。<br>
     * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo チェック対象となる「サービス契約」のサービス契約番号
	 * @param telno チェック対象となる電話番号
	 * @return false:重複する電話番号が存在する場合
	 *          true :上記以外
	 */
	public boolean isTelNoDubbleAddChk(CAANMsg inMsg, AgentDispatchContext inContext, String svcKeiNo, String telNo)
	{
		// 既契約数を取得します
		long cnt = 0;

		// 電話番号が未設定の場合、チェック対象外
		if (telNo == null || telNo.isEmpty())
		{
			return true;
		}
		// サービス契約番号が未設定の場合
		if (svcKeiNo == null || svcKeiNo.isEmpty())
		{
			cnt = getDubbleTelNoCntTelno(telNo, JKKModelCommon.getOpeDate(inMsg));
		}
		else 
		{
			cnt = getDubbleTelNoCntSvcKeiNo(svcKeiNo, telNo, JKKModelCommon.getOpeDate(inMsg));
		}
		// 既契約数が0件以上の場合
		if (cnt > 0)
		{
			// 既に同じ電話番号で登録されている契約が存在することになるのでエラーとする
			return false;
		}
		return true;
	}

	/**
	 * <p>
	 * 電話番号２重登録チェック（電話番号 ＋ サービス契約番号）
	 * パラメータの電話番号が他の契約で既に登録されているかを検索する。
	 * </p>
	 * @param svcKeiNo サービス契約番号
	 * @param telNo    電話番号
	 * @param stdYmd   基準年月日
	 * @return 既契約数
	 */
	public long getDubbleTelNoCntSvcKeiNo(String svcKeiNo, String telNo, String stdYmd)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// バインド変数設定値保持用領域
		ArrayList<Object> arraylist = new ArrayList<Object>();
		// PreparedStatementのパラメータカウント
		int iPCnt = 0;
		
		long retCnt = 0l;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0161ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT COUNT(*) AS CNT ");
			sql_Buff.append(" FROM   KK_T_SVC_KEI KK0081, ");
			sql_Buff.append("        (SELECT KK0081_01.SYSID ");
			sql_Buff.append("                FROM   KK_T_SVC_KEI KK0081_01 ");
			sql_Buff.append("                WHERE  KK0081_01.SVC_KEI_NO = ? ");
			arraylist.add(svcKeiNo);
			sql_Buff.append("                AND   (KK0081_01.SVC_KEI_NO, KK0081_01.RSV_APLY_YMD || KK0081_01.GENE_ADD_DTM) =  ");
			sql_Buff.append("                        (SELECT   KK0081_01_GENE.SVC_KEI_NO, MAX(KK0081_01_GENE.RSV_APLY_YMD || KK0081_01_GENE.GENE_ADD_DTM) AS KK0081_01_MAX  ");
			sql_Buff.append("                         FROM     KK_T_SVC_KEI KK0081_01_GENE  ");
			sql_Buff.append("                         WHERE    KK0081_01_GENE.SVC_KEI_NO = KK0081_01.SVC_KEI_NO  ");
			sql_Buff.append("                         AND      KK0081_01_GENE.RSV_APLY_YMD <= ?  ");
			arraylist.add(stdYmd);
			sql_Buff.append("                         AND      KK0081_01_GENE.RSV_APLY_CD = '2'  ");
			sql_Buff.append("                         AND      KK0081_01_GENE.MK_FLG = '0'  ");
			sql_Buff.append("                         GROUP BY KK0081_01_GENE.SVC_KEI_NO)) KK0081_01 ");
			sql_Buff.append(" WHERE KK0081.SYSID <> KK0081_01.SYSID ");
			sql_Buff.append(" AND   EXISTS (SELECT 1  ");
			sql_Buff.append("               FROM KK_T_SVC_KEI_UCWK KK0161 ");
			sql_Buff.append("               INNER JOIN KK_T_SVKEIUW_EOH_TEL KK0191 ");
			sql_Buff.append("               ON KK0161.SVC_KEI_UCWK_NO = KK0191.SVC_KEI_UCWK_NO ");
			sql_Buff.append("               AND KK0161.GENE_ADD_DTM = KK0191.GENE_ADD_DTM ");
			sql_Buff.append("               WHERE KK0081.SVC_KEI_NO = KK0161.SVC_KEI_NO ");
			sql_Buff.append("               AND   KK0191.TELNO = ? ");
			arraylist.add(telNo);
			sql_Buff.append("               AND   KK0161.SVC_KEI_UCWK_STAT NOT IN ('910', '920') ");
			sql_Buff.append("               AND  (KK0161.SVC_KEI_UCWK_NO, KK0161.RSV_APLY_YMD || KK0161.GENE_ADD_DTM) =  ");
			sql_Buff.append("                      (SELECT   KK0161_GENE.SVC_KEI_UCWK_NO, MAX(KK0161_GENE.RSV_APLY_YMD || KK0161_GENE.GENE_ADD_DTM) AS KK0161_MAX  ");
			sql_Buff.append("                       FROM     KK_T_SVC_KEI_UCWK KK0161_GENE  ");
			sql_Buff.append("                       WHERE    KK0161_GENE.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO  ");
			sql_Buff.append("                       AND      KK0161_GENE.RSV_APLY_YMD <= ?  ");
			arraylist.add(stdYmd);
			sql_Buff.append("                       AND      KK0161_GENE.RSV_APLY_CD = '2'  ");
			sql_Buff.append("                       AND      KK0161_GENE.MK_FLG = '0'  ");
			sql_Buff.append("                       GROUP BY KK0161_GENE.SVC_KEI_UCWK_NO)) ");
			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_YMD <= ?  ");
			arraylist.add(stdYmd);
			sql_Buff.append("          AND      KK0081_GENE.RSV_APLY_CD = '2'  ");
			sql_Buff.append("          AND      KK0081_GENE.MK_FLG = '0'  ");
			sql_Buff.append("          GROUP BY KK0081_GENE.SVC_KEI_NO) ");

			//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())
			{
				retCnt = rsltQuery.getLong("CNT");
			}

			return retCnt;
		}
		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);
			}
		}
	}

	/**
	 * <p>
	 * 電話番号２重登録チェック（電話番号）
	 * パラメータの電話番号が他の契約で既に登録されているかを検索する。
	 * </p>
	 * @param telNo    電話番号
	 * @param stdYmd   基準年月日
	 * @return 既契約数
	 */
	public long getDubbleTelNoCntTelno(String telNo, String stdYmd)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;
		// バインド変数設定値保持用領域
		ArrayList<Object> arraylist = new ArrayList<Object>();
		// PreparedStatementのパラメータカウント
		int iPCnt = 0;
		
		long retCnt = 0l;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0161ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append("               SELECT COUNT(*) AS CNT  ");
			sql_Buff.append("               FROM KK_T_SVC_KEI_UCWK KK0161 ");
			sql_Buff.append("               INNER JOIN KK_T_SVKEIUW_EOH_TEL KK0191 ");
			sql_Buff.append("               ON KK0161.SVC_KEI_UCWK_NO = KK0191.SVC_KEI_UCWK_NO ");
			sql_Buff.append("               AND KK0161.GENE_ADD_DTM = KK0191.GENE_ADD_DTM ");
			sql_Buff.append("               WHERE KK0191.TELNO = ? ");
			arraylist.add(telNo);
			sql_Buff.append("               AND   KK0161.SVC_KEI_UCWK_STAT NOT IN ('910', '920') ");
			sql_Buff.append("               AND  (KK0161.SVC_KEI_UCWK_NO, KK0161.RSV_APLY_YMD || KK0161.GENE_ADD_DTM) =  ");
			sql_Buff.append("                      (SELECT   KK0161_GENE.SVC_KEI_UCWK_NO, MAX(KK0161_GENE.RSV_APLY_YMD || KK0161_GENE.GENE_ADD_DTM) AS KK0161_MAX  ");
			sql_Buff.append("                       FROM     KK_T_SVC_KEI_UCWK KK0161_GENE  ");
			sql_Buff.append("                       WHERE    KK0161_GENE.SVC_KEI_UCWK_NO = KK0161.SVC_KEI_UCWK_NO  ");
			sql_Buff.append("                       AND      KK0161_GENE.RSV_APLY_YMD <= ?  ");
			arraylist.add(stdYmd);
			sql_Buff.append("                       AND      KK0161_GENE.RSV_APLY_CD = '2'  ");
			sql_Buff.append("                       AND      KK0161_GENE.MK_FLG = '0'  ");
			sql_Buff.append("                       GROUP BY KK0161_GENE.SVC_KEI_UCWK_NO) ");

			//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())
			{
				retCnt = rsltQuery.getLong("CNT");
			}

			return retCnt;
		}
		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);
			}
		}
	}
}
