/*******************************************************************************
*	 All Rights reserved,Copyright (c) K-Opticom 
********************************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKK0191C014KRCK
*	ソースファイル名：JKK0191C014KRCK.java
*	作成者			：EK911024
*	日付			：2013年04月07日
*＜機能概要＞
*	番ポ情報登録可否チェックの関連チェック部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00.00   2013/04/07   FJ）寺本    OT-2013-0000577
*   v5.00.00   2013/06/21   FJ) 沖田    IT2-2013-0000551
*   v72.00.00  2024/04/16   FJ）大路    ANK-4494-00-00
*
********************************************************************************/

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.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 eo.ejb.cbm.entity.KK0191ETMsg;
import eo.ejb.cbm.entity.ZM0121ETMsg;
import eo.ejb.cbm.entity.ZM0301ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0191C014CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.db.JKKejbZM0091DBABase;
import eo.ejb.common.db.JKKejbZM0301DBABase;

/**
 * <p>
 * 番ポ情報登録可否チェック関連チェック処理です。
 * ＜メソッド一覧＞
 * execKRCK
 * execEKK0191C014_KR1
 * execEKK0191C014_KR2
 * </p>
 * @author 富士通
 */

public class JEKK0191C014KRCK
{
	/**
	 * コンストラクタ
	 */

	public JEKK0191C014KRCK()
	{
	}

	/**
	 * 番ポ情報登録可否チェック関連チェックを行います。
	 * 
	 * @param inCBSMsg エンティティ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execKRCK(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "call:JKK0191C014KRCK.execKRCK");

		// ステータス
		int rtn = 0;

// ANK-4494-00-00 DEL START
//		rtn = execEKK0191C014_KR1(inCBSMsg, inContext, "EF");
// ANK-4494-00-00 DEL END

// ANK-4494-00-00 MOD START
//		if (rtn <= StatusCodes.WARNING)
//		{
//			rtn = execEKK0191C014_KR2(inCBSMsg, inContext, "EG");
//		}
		rtn = execEKK0191C014_KR2(inCBSMsg, inContext, "EG");
// ANK-4494-00-00 MOD END
		
		JSYejbLog.println(JSYejbLog.DEBUG, getClass(), "end:JKK0191C014KRCK.execKRCK");
	}

// ANK-4494-00-00 DEL START
//	/**
//	 * <p>
//	 * EKK0191C014_制約ＮＯ1（関連）チェック
//	 * </p>
//	 * @param  inMsg  チェック対象のCBSMsg
//	 * @param  inContext Agentから渡されたAgentDispatchContext
//	 * @param  errFlg   ERRフラグ
//	 * @return result    チェック結果
//	 */
//	private int execEKK0191C014_KR1(CAANMsg inMsg, AgentDispatchContext inContext, String errFlg)
//	{
//		// ステータス
//		int result = 0;
//
//		// 電話番号がnullの場合、チェック実施せず
//		if (inMsg.isNull(EKK0191C014CBSMsg.TELNO))
//		{
//			return result;
//		}
//
//		// サービス契約内訳<eo光電話>制約部品に渡す値を作成する
//		CAANMsg inETMsg = new CAANMsg(KK0191ETMsg.class.getName());
//		inETMsg.set(KK0191ETMsg.TELNO, inMsg.getString(EKK0191C014CBSMsg.TELNO));
//
//		JKKejbKK0191KRCK kk0191KRCK = new JKKejbKK0191KRCK();
//
//		// 番ポ可能エリアが存在しない場合、エラー
//		if (!kk0191KRCK.isExistsBmpArea(inETMsg, inContext))
//		{
//			return setError(inMsg, errFlg);
//		}
//		return result;
//	}
// ANK-4494-00-00 DEL END

	/**
	 * <p>
	 * EKK0191C014_制約ＮＯ2（関連）チェック
	 * チェック内容は以下のとおり。<br>
	 * ・ルーティング番号存在チェック<br>
	 * ・番ポ申込事業所番号存在チェック
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param errFlg エラーフラグ
	 * @return result  チェック結果
	 */
	public int execEKK0191C014_KR2(CAANMsg inMsg, AgentDispatchContext inContext, String errFlg)
	{
		// ステータス
		int result = 0;
		
		// 運用日付の取得
		String opeDate = JKKModelCommon.getOpeDate(inMsg);

		// 電話番号
		String telNo = inMsg.getString(EKK0191C014CBSMsg.TELNO);
		// NTT契約者住所コード
		String nttKeishaAdCd = inMsg.getString(EKK0191C014CBSMsg.NTT_KEISHA_AD_CD);
		
		// 電話番号がNullの場合、エラーを返却する
		if (telNo == null || "".equals(telNo) || telNo.length() < 6)
		{
			return setError(inMsg, errFlg);
		}
		
		// ANK-4494-00-00 ADD START
		// 電話番号マスタ及び通信事業者マスタから、対象の電話番号をKeyに
		// 取得し、自社電話番号の場合はチェックをしない。

		Connection con = JSYejbConnection.getConnection(ZM0121ETMsg.getTableName());

		PreparedStatement pstmtQuery = null;
		ResultSet rsltQuery = null;
		StringBuffer sqlQuery = new StringBuffer();

		try {

			// ＳＱＬ文の組み立て
			sqlQuery.append(" SELECT ")
					.append("      TE.TELNO ")
					.append("     ,TE.SHK_KOJIN_HOJIN_TLN_TAI_CD ")
					.append("     ,CD8.CD_DIV_NM AS SHK_KOJIN_HOJIN_TLN_TAI_CD_NM ")
					.append("     ,TE.KOJIN_HOJIN_TLN_TAI_CD ")
					.append("     ,CD4.CD_DIV_NM AS KOJIN_HOJIN_TLN_TAI_CD_NM ")
					.append("     ,TE.TLN_STKU_TSJGS_CD ")
					.append("     ,TJ3.TSJGS_NM AS TLN_STKU_TSJGS_CD_NM ")
					.append("     ,TJ3.JISHA_TASHA_FLG AS TLN_STKU_TSJGS_JISHA_TASHA_FLG ")
					.append("     ,TE.ITNM_TSJGS_CD ")
					.append("     ,TJ4.TSJGS_NM AS ITNM_TSJGS_CD_NM ")
					.append("     ,TJ4.JISHA_TASHA_FLG AS ITNM_TSJGS_JISHA_TASHA_FLG ")
					.append("     ,TE.ITNS_TSJGS_CD ")
					.append("     ,TJ5.TSJGS_NM AS ITNS_TSJGS_CD_NM ")
					.append("     ,TJ5.JISHA_TASHA_FLG AS ITNS_TSJGS_JISHA_TASHA_FLG ")
					.append(" FROM ")
					.append("     ZM_M_TELNO TE ")
					.append(" LEFT OUTER JOIN ")
					.append("     ZM_M_CD_NM_KANRI CD4 ")
					.append(" ON  CD4.CD_SBT_CD = 'CD00410' ")
					.append(" AND CD4.CD_DIV = TE.KOJIN_HOJIN_TLN_TAI_CD ")
					.append(" AND CD4.CD_TSTAYMD <= SUBSTR(TE.UPD_DTM,0,8) ")
					.append(" AND CD4.CD_TENDYMD >= SUBSTR(TE.UPD_DTM,0,8) ")
					.append(" AND CD4.MK_FLG = '0' ")
					.append(" LEFT OUTER JOIN ")
					.append("     ZM_M_CD_NM_KANRI CD8 ")
					.append(" ON  CD8.CD_SBT_CD = 'CD00410' ")
					.append(" AND CD8.CD_DIV = TE.SHK_KOJIN_HOJIN_TLN_TAI_CD ")
					.append(" AND CD8.CD_TSTAYMD <= SUBSTR(TE.UPD_DTM,0,8) ")
					.append(" AND CD8.CD_TENDYMD >= SUBSTR(TE.UPD_DTM,0,8) ")
					.append(" AND CD8.MK_FLG = '0' ")
					.append(" LEFT OUTER JOIN ")
					.append("     TU_M_TUSHIN_JGYOSHA TJ3 ")
					.append(" ON  TJ3.TSJGS_CD = TE.TLN_STKU_TSJGS_CD ")
					.append(" AND TJ3.TSJGS_TSTAYMD <= SUBSTR(TE.UPD_DTM,0,8) ")
					.append(" AND TJ3.TSJGS_TENDYMD >= SUBSTR(TE.UPD_DTM,0,8) ")
					.append(" AND TJ3.MK_FLG = '0' ")
					.append(" LEFT OUTER JOIN ")
					.append("     TU_M_TUSHIN_JGYOSHA TJ4 ")
					.append(" ON  TJ4.TSJGS_CD = TE.ITNM_TSJGS_CD ")
					.append(" AND TJ4.TSJGS_TSTAYMD <= SUBSTR(TE.UPD_DTM,0,8) ")
					.append(" AND TJ4.TSJGS_TENDYMD >= SUBSTR(TE.UPD_DTM,0,8) ")
					.append(" AND TJ4.MK_FLG = '0' ")
					.append(" LEFT OUTER JOIN ")
					.append("     TU_M_TUSHIN_JGYOSHA TJ5 ")
					.append(" ON  TJ5.TSJGS_CD = TE.ITNS_TSJGS_CD ")
					.append(" AND TJ5.TSJGS_TSTAYMD <= SUBSTR(TE.UPD_DTM,0,8) ")
					.append(" AND TJ5.TSJGS_TENDYMD >= SUBSTR(TE.UPD_DTM,0,8) ")
					.append(" AND TJ5.MK_FLG = '0' ")
					.append(" WHERE ")
					.append("     TE.TELNO = ? ")
					.append(" AND TE.MK_FLG = '0' ");
			
			// ＳＱＬ文の解析
			pstmtQuery = con.prepareStatement(sqlQuery.toString());

			int para_idx = 1;
			CAANJDBCUtil.setParam(pstmtQuery, para_idx++, telNo);

			// ＳＱＬ文の実行
			rsltQuery = pstmtQuery.executeQuery();

			while (rsltQuery.next()) {
				// 判定条件
				String value = rsltQuery.getString("TLN_STKU_TSJGS_JISHA_TASHA_FLG");

				if ("1".equals(value)) {
					// 電話番号取得事業者コードの自社フラグが自社：1の場合、チェックしない。
					// 1以外 他事業者の2や、電話番号取得事業者コードがNULLで自社フラグがNULLの場合は他事業者として判定し
					// 後続のチェックを行う。
					return result;
				}
			}
		}
		catch (SQLException e) {
			inMsg.set(ZM0121ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
			throw new CAANRuntimeException(e);
		}
		finally {
			// このメソッドで確保した資源の解放
			try {
				if (rsltQuery != null) {
					rsltQuery.close();
				}
				if (pstmtQuery != null) {
					pstmtQuery.close();
				}
				if (con != null) {
					CAANConnectionMgr.getInstance().close(con);
				}
			}
			catch (SQLException e) {
				inMsg.set(ZM0121ETMsg.STATUS, StatusCodes.FIND_DB_ERR);
				throw new CAANRuntimeException(e);
			}
		}
		// ANK-4494-00-00 ADD END
		
		// -------------------------------------
		// ルーティング番号存在チェック
		// -------------------------------------
		// 電話番号上6桁に紐づく「局番」を取得する
		JKKejbZM0301DBABase zm0301Dba = new JKKejbZM0301DBABase();
		CAANMsg[] zm0301MsgList = zm0301Dba.getZM0301byKyoku(telNo.substring(0, 6), null, opeDate, "1");

		// レコードが取得できない場合、エラー
		if (zm0301MsgList.length == 0)
		{
			return setError(inMsg, errFlg);
		}
		
		// 局番.個人用ＮＲＮ番号が未設定の場合、エラー
		String kojinNrnNo = zm0301MsgList[0].getString(ZM0301ETMsg.KOJIN_NRN_NO);
		if (kojinNrnNo == null || "".equals(kojinNrnNo))
		{
			return setError(inMsg, errFlg);
		}

		// 局番.番号区画コード
		String noKukakucd = zm0301MsgList[0].getString(ZM0301ETMsg.NO_KUKAKU_CD);

		// -------------------------------------
		// 番ポ申込事業所番号存在チェック
		// -------------------------------------
		// NTT契約者住所コード、および電話番号が指定する「局番」の番号区画コードに紐づく「住所対象番号区画」を取得する
		JKKejbZM0091DBABase zm0091Dba = new JKKejbZM0091DBABase();
		CAANMsg[] zm0091MsgList = zm0091Dba.getZM0091byAd_NoKukaku(nttKeishaAdCd, noKukakucd, null, opeDate, "1");

		// レコードが取得できない場合、エラー
		if (zm0091MsgList.length == 0)
		{
			return setError(inMsg, errFlg);
		}
		
		return result;
	}

	/**
	 * <p>
	 * エラー処理を行います。
	 * </p>
	 * 
	 * @param inMsg チェック対象のCBSMsg(EKK0191C014CBSMsg)
	 * @param errFlg エラーフラグ
	 * @return エラーステータス
	 */
	private int setError(CAANMsg inMsg, String errFlg)
	{
		// ステータス
		int result = 0;

		// エラー処理
		inMsg.set(EKK0191C014CBSMsg.TELNO_ERR, errFlg);
		if ("W".equals(errFlg.substring(0, 1)))
		{
			result = StatusCodes.WARNING;
		}
		else
		{
			result = StatusCodes.RELATION_ERR;
		}
		// ステータスのセット
		if (result > inMsg.getInt(JCMConstants.STATUS_INT_KEY))
		{
			inMsg.set(JCMConstants.STATUS_INT_KEY, result);
		}
		return result;
	}
}
