/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbKK0121NumberParts
*	ソースファイル名：JKKejbKK0121NumberParts.java
*	作成者			：富士通
*	日付			：2012年09月27日
*＜機能概要＞
*	サービス契約内訳<eoモバイル>採番部品クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/09/27	富士通		新規作成
*
**********************************************************************/

package eo.ejb.common.edit;

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.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.KK0121ETMsg;
import eo.ejb.cbm.entity.KK0341ETMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.db.JKKejbKK0081DBABase;
import eo.ejb.common.db.JKKejbKK0121DBABase;
import eo.ejb.common.db.JKKejbZM0321DBAccess;

/**
 * <p>
 * サービス契約内訳<eoモバイル>採番部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbKK0121NumberParts extends JKKejbNumberPartsBase
{
	
	/** 業務パラメータ（UQ事業者ID） */
	private static final String WORK_PARAM_UQ_JIGYOSHA_CD = "KK_UQ_JIGYOSHA_CD";

	/**
	 * コンストラクタです。
	 */
	public JKKejbKK0121NumberParts()
	{
	}
	
	/**
	 * <p>
	 * サービス契約のカレント検索を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param svcKeiNo サービス契約番号
	 * @return 検索結果のレコード
	 */
	private CAANMsg getCurrentKK0081(CAANMsg inCBSMsg, String svcKeiNo)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0081ETMsg.class.getName());
		inETMsg.set(KK0081ETMsg.SVC_KEI_NO, svcKeiNo);
		inETMsg.set(KK0081ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));

		// サービス契約のカレント検索を行う
		return new JKKejbKK0081DBABase().findByCurrent(inETMsg);
	}
	
	/**
	 * <p>
	 * サービス契約<eoモバイル>のサブタイプ検索を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param svcKeiNo サービス契約番号
	 * @param geneAddDtm 世代登録年月日時分秒
	 * @return 検索結果のレコード
	 */
	private CAANMsg getCurrentKK0121(CAANMsg inCBSMsg, String svcKeiNo, String geneAddDtm)
	{
		// サブタイプ検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0121ETMsg.class.getName());
		inETMsg.set(KK0121ETMsg.SVC_KEI_NO, svcKeiNo);
		inETMsg.set(KK0121ETMsg.GENE_ADD_DTM, geneAddDtm);

		// サービス契約内訳<eoモバイル>のサブタイプ検索を行う
		return new JKKejbKK0121DBABase().findByPrimaryKey(inETMsg);
	}
	
	/**
	 * <p>
	 * サービス契約<eoモバイル>-事業者用契約ID編集処理を行います。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo サービス契約番号
	 * @return 編集されたサービス契約<eoモバイル>の事業者用契約ID
	 */
	public Object getJigyoshaKeiIdEdit(CAANMsg inMsg, AgentDispatchContext inContext, Object svcKeiNo)
	{
		
		// 機能コードのチェック（チェックモードの場合は編集しない）
		if (isFuncMode(inMsg))
		{
			return null;
		}
		
		String value = null;
		
		// 対象のサービス契約番号でサービス契約のカレント検索を行う
		CAANMsg ret0081 = getCurrentKK0081(inMsg, svcKeiNo.toString());
		
		// サービス契約が存在しない場合
		if (null == ret0081)
		{
			return null;
		}
		
		// 対象のサービス契約<eoモバイル>のサブタイプ検索を行う
		CAANMsg ret0121 = getCurrentKK0121(inMsg, svcKeiNo.toString(), ret0081.getString(KK0081ETMsg.GENE_ADD_DTM));
		
		// サービス契約<eoモバイル>が存在しない場合
		if (null == ret0121)
		{
			return null;
		}
		
		//　事業者用契約IDが設定されている場合はカレント引継ぎ
		if (!ret0121.isNull(KK0121ETMsg.JIGYOSHA_KEI_ID))
		{
			value = ret0121.getString(KK0121ETMsg.JIGYOSHA_KEI_ID);
			return value;
		}
		
		//　サービス契約の料金コースが「A28」「A29」以外の場合は何もしない
		if (!("A28".equals(ret0081.getString(KK0081ETMsg.PCRS_CD)) ||
				"A29".equals(ret0081.getString(KK0081ETMsg.PCRS_CD))))
		{
			return null;
		}
		
		//　サービス契約の料金コースが「A28」の場合
		if ("A28".equals(ret0081.getString(KK0081ETMsg.PCRS_CD)))
		{
			//　機器提供サービス契約のチェックを行う
			if (!chkKktkSvcKei(inMsg, inContext, svcKeiNo.toString()))
			{
				return null;
			}
		}
		
		//事業者用契約IDの払出を行う
		value = getuqNinshoId(svcKeiNo.toString());
		
		return value;
	}

	/**
	 * <p>
	 * 機器提供サービス契約のチェックを行います。
	 * </p>
	 * @param inMsg	 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo サービス契約番号
	 * @return 機器提供サービス契約が存在する場合はtrue。存在しない場合はfalse。
	 */
	public boolean chkKktkSvcKei(CAANMsg inMsg, AgentDispatchContext inContext, String svcKeiNo)
	{
		// コネクション
		Connection con1 = null;
		// プリペアステートメント
		PreparedStatement pstmt = null;
		// リザルトセット
		ResultSet rsltQuery = null;

		long lDataCnt = 0L;

		try
		{
			//コネクション取得
			con1 = JSYejbConnection.getConnection(KK0341ETMsg.getTableName());

			// SQL文
			StringBuffer sql_Buff = new StringBuffer();
			sql_Buff.append(" SELECT ");
			sql_Buff.append("     COUNT(*) AS CNT ");
			sql_Buff.append(" FROM ");
			sql_Buff.append("     KK_T_KKTK_SVC_KEI KK0341 ");
			sql_Buff.append(" WHERE ");
			sql_Buff.append("     KK0341.SVC_KEI_NO = ? ");
			sql_Buff.append("     AND KK0341.TAKNKIKI_SBT_CD = 'J0' ");
			sql_Buff.append("     AND KK0341.KKTK_SBT_CD = '03' ");
			sql_Buff.append("     AND (KK0341.KKTK_SVC_KEI_NO, KK0341.RSV_APLY_YMD || KK0341.GENE_ADD_DTM) = ");
			sql_Buff.append("         (SELECT KK0341_GENE.KKTK_SVC_KEI_NO, MAX(KK0341_GENE.RSV_APLY_YMD || KK0341_GENE.GENE_ADD_DTM) AS KK0341_MAX ");
			sql_Buff.append("          FROM   KK_T_KKTK_SVC_KEI KK0341_GENE ");
			sql_Buff.append("          WHERE  KK0341_GENE.KKTK_SVC_KEI_NO = KK0341.KKTK_SVC_KEI_NO ");
			sql_Buff.append("          AND    KK0341_GENE.RSV_APLY_YMD <= ? ");
			sql_Buff.append("          AND    KK0341_GENE.RSV_APLY_CD = '2' ");
			sql_Buff.append("          AND    KK0341_GENE.MK_FLG= '0' ");
			sql_Buff.append("          GROUP BY KK0341_GENE.KKTK_SVC_KEI_NO) ");

			//prepareStatementにSQL文をセット
			pstmt = con1.prepareStatement(sql_Buff.toString());

			//ログ出力(SQL文の出力)
			JSYejbLog.outlog(inContext, JSYejbLog.DBACCESS, this.getClass(), sql_Buff);

			// パラメータの設定(サービス契約番号を指定)
			CAANJDBCUtil.setParam(pstmt, 1, svcKeiNo);
			// パラメータの設定(運用日付を指定)
			CAANJDBCUtil.setParam(pstmt, 2, JKKModelCommon.getOpeDate(inMsg));

			// ResultSetの取得
			rsltQuery = pstmt.executeQuery();

			// 件数を返却する
			if (rsltQuery.next())
			{
				lDataCnt = rsltQuery.getLong("CNT");
			}

			// 対象データが存在する場合はtrueを返却する
			if (lDataCnt > 0)
			{
				return true;
			}

		}
		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((java.sql.Connection)con1);
				}
			}
			catch(SQLException se)
			{
				throw new CAANRuntimeException(se);
			}
		}
		return false;
	}

	/**
	 * 事業者用契約ID取得処理
	 * @param svcKeiNo サービス契約番号
	 * @return 事業者用契約ID
	 */
	private String getuqNinshoId(String svcKeiNo)
	{
		// 業務パラメータより取得
		JKKejbZM0321DBAccess wkParamDba = new JKKejbZM0321DBAccess();
		return "F".concat(wkParamDba.getParamE(WORK_PARAM_UQ_JIGYOSHA_CD)).concat(svcKeiNo);
	}
}
