/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbTKCKCommon
*	ソースファイル名：JKKejbTKCKCommon.java
*	作成者			：富士通
*	日付			：2012年10月30日
*＜機能概要＞
*	単関連部品の共通クラス
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/10/30	富士通		新規作成
*   v4.00.00    2013/03/25  FJ)寺本     IKK-2013-0000448
*   v8.00.00    2014/05/20  FJ)中野     OM-2014-0001758
**********************************************************************/
package eo.ejb.common.itemrelation;

import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.common.util.JPCDateChecker;
import eo.common.util.JPCDateUtil;
import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK0161ETMsg;
import eo.ejb.cbm.entity.KK0351ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0341C230CBSMsg;
import eo.ejb.cbs.cbsmsg.EKK0341C231CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKejbCallTypeChecker;
import eo.ejb.common.db.JKKejbKK0081DBABase;
import eo.ejb.common.db.JKKejbKK0161DBABase;
import eo.ejb.common.db.JKKejbKK0351DBABase;

/**
 * <p>
 * 単関連部品の共通クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbTKCKCommon
{
	/** CBSMsgのオプションサービス契約番号KEY名 */
	private static final String OPT_SVC_KEI_NO = "op_svc_kei_no";

	/** 親契約識別コード(サービス契約) */
	private static final String OYA_KEI_SKBT_CD_SVC_KEI = "01";

	/** 親契約識別コード(サービス契約内訳) */
	private static final String OYA_KEI_SKBT_CD_SVC_KEI_UCWK = "03";

	/** サービスコード(インターネットサービス) */
	private static final String SVC_CD_INTERNET = "01";

	/** サービスコード(電話サービス) */
	private static final String SVC_CD_TEL = "02";
	
	/** 機器送付先住所手動入力フラグ：手動入力でない */
	private static final String KIKI_SHS_AD_MAN_INPUT_FLG_AUTO = "0";

	/**
	 * <p>
	 * オプションサービス契約番号からサービス契約のサービスコードを取得します
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return true ：サービスコードが"インターネットサービス"または"電話サービス"でない
	 *          false：サービスコードが"インターネットサービス"または"電話サービス"である
	 */
	public boolean isKK0081SvcCdIntOrTel(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// オプションサービス契約に紐付くサービス契約のサービスコードを取得
		CAANMsg kk0081Cur = getCurSvcKeiViaOpKei(inCBSMsg, inContext, inCBSMsg.getString(OPT_SVC_KEI_NO));
		String curSvcCd = kk0081Cur.getString(KK0081ETMsg.SVC_CD);

		// サービスコードが"インターネットサービス"または"電話サービス"の場合
		if (SVC_CD_INTERNET.equals(curSvcCd) || SVC_CD_TEL.equals(curSvcCd))
		{
			return false;
		}
		return true;
	}
	
	/**
	 * <p>
	 * EKK0341C230_機器提供サービス契約情報変更
	 * 単関連制約 実施条件_住所コード相関チェック(機器送付先)
	 * </p>
	 * @param inCBSMsg CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return true：実施条件を満たしている false：実施条件を満たしていない
	 */
	public boolean isAddCdSoknKikiChkEKK0341C230(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// チェック条件@：サービスの呼出元が「バッチ」以外であること
		if (JKKejbCallTypeChecker.isCallTypeBatch(inContext))
		{
			return false;
		}

		// チェック条件A：「機器送付先住所コード」が入力されている
		if (inCBSMsg.isNull(EKK0341C230CBSMsg.KIKI_SOHUS_AD_CD))
		{
			return false;
		}

		// チェック条件B：「機器送付先住所手動入力フラグ」が"0"である
		if (!KIKI_SHS_AD_MAN_INPUT_FLG_AUTO.equals(inCBSMsg.getString(EKK0341C230CBSMsg.KIKI_SHS_AD_MAN_INPUT_FLG)))
		{
			return false;
		}
		return true;
	}
	
	/**
	 * <p>
	 * EKK0341C230_機器提供サービス契約情報変更
	 * 単関連制約 実施条件_住所コード相関チェック
	 * </p>
	 * @param inCBSMsg CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return true：実施条件を満たしている false：実施条件を満たしていない
	 */
	public boolean isAddCdSoknChkEKK0341C230(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// チェック条件@：サービスの呼出元が「バッチ」以外であること
		if (JKKejbCallTypeChecker.isCallTypeBatch(inContext))
		{
			return false;
		}

		// チェック条件A：「機器設置先住所コード」が入力されている
		if (inCBSMsg.isNull(EKK0341C230CBSMsg.KIKI_STC_SAKI_AD_CD))
		{
			return false;
		}
		return true;
	}
	
	/**
	 * <p>
	 * EKK0341C231_機器提供サービス契約情報変更（契約変更中）
	 * 単関連制約 実施条件_住所コード相関チェック
	 * </p>
	 * @param inCBSMsg CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return true：実施条件を満たしている false：実施条件を満たしていない
	 */
	public boolean isAddCdSoknChkEKK0341C231(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// チェック条件@：サービスの呼出元が「バッチ」以外であること
		if (JKKejbCallTypeChecker.isCallTypeBatch(inContext))
		{
			return false;
		}

		// チェック条件A：「機器送付先住所コード」が入力されている
		if (inCBSMsg.isNull(EKK0341C231CBSMsg.KIKI_SOHUS_AD_CD))
		{
			return false;
		}
		return true;
	}

	/**
	 * <p>
	 * EKK0341C234_機器提供サービス契約情報変更（契約変更中住所更新）
	 * 単関連制約 実施条件_住所コード相関チェック
	 * </p>
	 * @param inCBSMsg CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return true：実施条件を満たしている false：実施条件を満たしていない
	 */
	public boolean isAddCdSoknChkEKK0341C234(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// チェック条件@：サービスの呼出元が「バッチ」以外であること
		if (JKKejbCallTypeChecker.isCallTypeBatch(inContext))
		{
			return false;
		}

		// チェック条件A：「機器設置先住所コード」が入力されている
		if (inCBSMsg.isNull(EKK0341C230CBSMsg.KIKI_STC_SAKI_AD_CD))
		{
			return false;
		}
		return true;
	}
	
	/**
	 * <p>
	 * オプションサービス契約に紐付くサービス契約のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return オプションサービス契約に紐付くサービス契約のカレントレコード
	 */
	private CAANMsg getCurSvcKeiViaOpKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, String opSvcKeiNo)
	{
		// オプションサービス契約のカレントレコードを取得
		CAANMsg kk0351Cur = getCurOpKei(inCBSMsg, inContext, opSvcKeiNo);

		String svcKeiNo = null;

		// 親契約識別コードがサービス契約の場合
		if (OYA_KEI_SKBT_CD_SVC_KEI.equals(kk0351Cur.getString(KK0351ETMsg.OYA_KEI_SKBT_CD)))
		{
			// サービス契約番号を使用する
			svcKeiNo = kk0351Cur.getString(KK0351ETMsg.SVC_KEI_NO);
		}
		// 親契約識別コードがサービス契約内訳の場合
		else if (OYA_KEI_SKBT_CD_SVC_KEI_UCWK.equals(kk0351Cur.getString(KK0351ETMsg.OYA_KEI_SKBT_CD)))
		{
			// サービス契約内訳番号に紐付くサービス契約内訳を取得
			CAANMsg retMsgKK0161 = getCurSvcKeiUcwk(inCBSMsg, inContext, kk0351Cur.getString(KK0351ETMsg.SVC_KEI_UCWK_NO));

			// 取得したサービス契約内訳のサービス契約番号を使用する
			svcKeiNo = retMsgKK0161.getString(KK0161ETMsg.SVC_KEI_NO);
		}

		// サービス契約カレントレコード検索
		return getCurSvcKei(inCBSMsg, inContext, svcKeiNo);
	}
	
	/**
	 * <p>
	 * オプションサービス契約のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return オプションサービス契約のカレントレコード
	 */
	private CAANMsg getCurOpKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, String opSvcKeiNo)
	{
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		CAANMsg kk0351Cond = new CAANMsg(KK0351ETMsg.class.getName());
		kk0351Cond.set(KK0351ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		kk0351Cond.set(KK0351ETMsg.RSV_APLY_YMD, opeDate);

		return new JKKejbKK0351DBABase().findByCurrent(kk0351Cond);
	}
	
	/**
	 * <p>
	 * サービス契約のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo	サービス契約番号
	 * @return サービス契約のカレントレコード
	 */
	private CAANMsg getCurSvcKei(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcKeiNo)
	{
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		
		CAANMsg kk0081Cond = new CAANMsg(KK0081ETMsg.class.getName());
		kk0081Cond.set(KK0351ETMsg.SVC_KEI_NO, svcKeiNo);
		kk0081Cond.set(KK0351ETMsg.RSV_APLY_YMD, opeDate);
		
		return new JKKejbKK0081DBABase().findByCurrent(kk0081Cond);
	}
	
	/**
	 * <p>
	 * サービス契約内訳のカレントレコードを取得します。
	 * </p>
	 * @param inCBSMsg　CBSメッセージ
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param svcKeiNo	サービス契約内訳番号
	 * @return サービス契約内訳のカレントレコード
	 */
	private CAANMsg getCurSvcKeiUcwk(CAANMsg inCBSMsg, AgentDispatchContext inContext, String svcKeiUcwkNo)
	{
		CAANMsg kk0161Cond = new CAANMsg(KK0161ETMsg.class.getName());
		kk0161Cond.set(KK0161ETMsg.SVC_KEI_UCWK_NO, svcKeiUcwkNo);
		kk0161Cond.set(KK0161ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));

		return new JKKejbKK0161DBABase().findByCurrent(kk0161Cond);
	}
	

	/**
	 * <p>
	 * 運用日に指定された月数の加算処理を行い、指定された日付と比較します。
	 * 指定された日付が、加算された運用日以前の場合trueを返却します。
	 * </p>
	 * @param inMsg     処理対象のメッセージキャリア
	 * @param context   Agentから渡されたAgentDispatchContext
	 * @param date      判定対象の日付 
	 * @param monthCount 運用日に加算する月数
	 * @return boolean 指定された日付が加算された運用日以前の場合はtrue、それ以外の場合、false
	 */
	public static boolean isPastDateAddMonthCheck(CAANMsg inMsg, AgentDispatchContext context, Object date,  Object monthCount)
	{
		try {
			String dateStr = date.toString();
			if (dateStr != null && dateStr.length() >= 8) {
				// 運用日に指定された月数を加算
				String futureDate = JPCDateUtil.addMonth((String) JKKModelCommon.getOpeDate(inMsg, context), Integer.parseInt(monthCount.toString()));
				// 過去日か判定
				return JPCDateChecker.isPastDate(dateStr.substring(0, 8), futureDate, "0");
			}
			return false;
		}
		catch (Exception e)
		{
			throw new CAANRuntimeException(e);
		}
	}
}
