/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JEKK0081C180KRCK
*   ソースファイル名：JEKK0081C180KRCK.java
*   作成者          ：富士通
*   日付            ：2011年10月07日
*＜機能概要＞
*   サービス契約解約の関連制約部品クラス
*＜修正履歴＞
*   バージョン  修正日      修正者      修正内容
*   v1.00.00    2011/10/07  富士通      新規作成
*   v4.00.00	2013/02/19	FJ)坂本		TAI-2012-0000101
*   v4.00.01	2013/04/13	FJ)清藤		IT1-2013-0000812
*   v5.00.00    2013/07/29  FJ)寺本     LT1-2013-0000654
*   v5.00.01    2013/10/09  FJ)寺本     OM-2013-0002796
*   v5.00.02    2013/10/09  FJ)寺園     OM-2013-0003064
*   v5.00.03    2013/10/25  FJ)小島     OM-2013-0003472
*   v5.00.04    2013/10/29  FJ)沖田     OM-2013-0003804
**********************************************************************/

package eo.ejb.common.entity;

import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.ejb.common.StatusCodes;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0081C180CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.db.JKKejbKK0081DBABase;

/**
 * <p>
 * サービス契約解約の関連制約部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEKK0081C180KRCK
{

	/** サービスコード（電話サービス） */
	private static final String SVC_CD_TEL = "02";

	/** 工事なし登録チェック実施フラグ（チェックする） */
	private static final String NO_KOJI_CHK_FLG_ON = "1";
	
	/** 電話単独契約不可チェック対象外フラグ（チェックしない） */
	private static final String TEL_SNGLKEI_FAIL_CHK_FLG = "1";

	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約 サービス契約存在チェック) */
	private static final String[] KRCK_SVCKEI_EXISTS_ERR = {"EB", EKK0081C180CBSMsg.SVC_KEI_NO_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(申込明細 存在チェック) */
	private static final String[] KRCK_MSKMDTL_EXISTS_ERR = {"EA", EKK0081C180CBSMsg.MSKM_DTL_NO_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約 休止トーキ登録済みチェック) */
	private static final String[] KRCK_PAUS_TOK_ADD_WNG = {"WA", EKK0081C180CBSMsg.SVC_KEI_NO_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(工事案件 工事なし登録チェック) */
	private static final String[] KRCK_NO_KOJI_ADD_ERR = {"EC", EKK0081C180CBSMsg.SVC_KEI_NO_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(サービス契約 電話単独契約不可チェック) */
	private static final String[] KRCK_TEL_ONLY_NOT_ERR = {"ED", EKK0081C180CBSMsg.SVC_KEI_NO_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(工事案件 新規工事中チェック) */
	private static final String[] KRCK_NEW_KOJI_EXISTS_ERR = {"EE", EKK0081C180CBSMsg.SVC_KEI_NO_ERR};

	/** 状態遷移チェックエラーフラグ&エラー返却項目(サービス契約 状態チェック) */
	private static final String[] JSCK_STATUS_ERR = {"EA", EKK0081C180CBSMsg.SVC_KEI_NO_ERR};

	/** 関連チェックエラーフラグ&エラー返却項目(解約時回復不可判定) */
	private static final String[] KRCK_KIFK_FUKA_INF = {"IA", EKK0081C180CBSMsg.WARN_FLG_ERR};
	
	/**
	 * <p>
	 * 新しいJEKK0081C180KRCKを作成します。
	 * </p>
	 */
	public JEKK0081C180KRCK()
	{
	}

	/**
	 * <p>
	 * サービス契約解約の関連制約チェックを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execKRCK(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// サービス契約関連チェック部品
		JKKejbKK0081KRCK kk0081KRCK = new JKKejbKK0081KRCK();

		// サービス契約番号
		String svcKeiNo = inCBSMsg.getString(EKK0081C180CBSMsg.SVC_KEI_NO);

		// サービス契約 サービス契約存在チェック
		if (!kk0081KRCK.isExistsCurrent(inCBSMsg, svcKeiNo))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_SVCKEI_EXISTS_ERR);
			return;
		}

		// 申込明細関連チェック部品
		JKKejbKK0021KRCK kk0021KRCK = new JKKejbKK0021KRCK();

		String mskmDtlNo = inCBSMsg.getString(EKK0081C180CBSMsg.MSKM_DTL_NO);

		// 申込明細 存在チェック
		if (!kk0021KRCK.isExistsNonGene(mskmDtlNo))
		{
			setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_MSKMDTL_EXISTS_ERR);
			return;
		}

		// サービス契約のカレントレコードを取得
		CAANMsg curKK0081 = findByCurrentKK0081(inCBSMsg);

		// 休止トーキ登録済みチェック
		if (!inCBSMsg.isNull(EKK0081C180CBSMsg.SVC_KEI_NO))
		{
			if (SVC_CD_TEL.equals(curKK0081.getString(KK0081ETMsg.SVC_CD)))
			{
				// サービス契約番号が入力されていて、かつ"電話サービス"の場合のみ実施
				if (!kk0081KRCK.isPauseTokAddChk(curKK0081))
				{
					setErrInfo(inCBSMsg, StatusCodes.WARNING, KRCK_PAUS_TOK_ADD_WNG);
					return;
				}
			}
		}

		// 工事なし登録チェック
		if (!inCBSMsg.isNull(EKK0081C180CBSMsg.SVC_KEI_NO))
		{
			if (NO_KOJI_CHK_FLG_ON.equals(inCBSMsg.getString(EKK0081C180CBSMsg.NO_KOJI_CHK_FLG)))
			{
				// サービス契約番号が入力されていて、かつ工事なし登録チェック実施フラグが"チェックする"の場合のみ実施
				if (!new JKKejbKRCKCommon().isNotExistSpecKoji(inCBSMsg, inContext, svcKeiNo))
				{
					setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_NO_KOJI_ADD_ERR);
					return;
				}
			}
		}

		// 電話単独契約不可チェック
		// 「呼出先サービスが"バッチ"かつJOBIDが"強制解約"」以外かつ異動区分が"撤去(解約)"、"工事情報訂正"、"登録内容修正"以外の場合
		if (!JKKModelCommon.isBatOpeDateJobDsl() 
				&& !JKKModelConst.IDO_DIV_TEKKYO_DSL.equals(inCBSMsg.getString(EKK0081C180CBSMsg.IDO_DIV))
				&& !JKKModelConst.IDO_DIV_ADD_NAIYO_SHUSEI.equals(inCBSMsg.getString(EKK0081C180CBSMsg.IDO_DIV))
				&& !JKKModelConst.IDO_DIV_KJJH_TEISE.equals(inCBSMsg.getString(EKK0081C180CBSMsg.IDO_DIV)))
		{
			// サービス契約番号が入力されている場合のみ実施
			if (!inCBSMsg.isNull(EKK0081C180CBSMsg.SVC_KEI_NO))
			{
				// 入力．電話単独契約不可チェック対象外フラグが1（対象外）以外の場合実施
				if (!TEL_SNGLKEI_FAIL_CHK_FLG.equals(inCBSMsg.getString(EKK0081C180CBSMsg.TEL_SNGLKEI_FAIL_CHK_FLG)))
				{
					if (!kk0081KRCK.isTelSnglFailChkForNetDsl(curKK0081, inContext, inCBSMsg.getString(EKK0081C180CBSMsg.SVC_ENDYMD)))
					{
						setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_TEL_ONLY_NOT_ERR);
						return;
					}
				}
			}
		}

		// 新設工事中チェック
		// 「呼出先サービスが"バッチ"かつJOBIDが"強制解約"」以外の場合
		if (!JKKModelCommon.isBatOpeDateJobDsl())
		{
			// サービス契約番号が入力されている場合のみ実施
			if (!inCBSMsg.isNull(EKK0081C180CBSMsg.SVC_KEI_NO))
			{
				// キャンセル・解約時新設工事中チェック処理
				if (!kk0081KRCK.isNewKojiExists(inCBSMsg, inContext, svcKeiNo))
				{
					setErrInfo(inCBSMsg, StatusCodes.RELATION_ERR, KRCK_NEW_KOJI_EXISTS_ERR);
					return;
				}
			}
		}

		// サービス契約状態遷移チェック用ETメッセージ
		CAANMsg inETMsg = new CAANMsg(KK0081ETMsg.class.getName());
		inETMsg.set(JCMConstants.TEMPLATE_ID_KEY, inCBSMsg.getString(JCMConstants.TEMPLATE_ID_KEY));
		inETMsg.set(KK0081ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKK0081C180CBSMsg.SVC_KEI_NO));

		// サービス契約 状態チェック
		if (!JKKModelCommon.checkStateTransitionKK0081(inETMsg, inContext))
		{
			setErrInfo(inCBSMsg, StatusCodes.STATUSTRANS_ERR, JSCK_STATUS_ERR);
			return;
		}

		String prcGrpCd = curKK0081.getString(KK0081ETMsg.PRC_GRP_CD);
		// 解約時回復不可判定
		// 解約対象がeoモバイル契約である場合
		if (JKKModelConst.PRC_GRP_CD_EOMOBA_WIFI.equals(prcGrpCd) || JKKModelConst.PRC_GRP_CD_EOMOBA_3G.equals(prcGrpCd)
				|| JKKModelConst.PRC_GRP_CD_EOMOBA_UQ_WIMAX.equals(prcGrpCd) || JKKModelConst.PRC_GRP_CD_EO_MLAD.equals(prcGrpCd))
		{
			inCBSMsg.set(KRCK_KIFK_FUKA_INF[1], JKKModelCommon.getSeptWarnInfoFlg(KK0081ETMsg.SVC_KEI_NO_ERR, KRCK_KIFK_FUKA_INF[0]));
		}
	}

	/**
	 * <p>
	 * サービス契約のカレントレコード検索を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @return サービス契約のカレントレコードメッセージ
	 */
	private CAANMsg findByCurrentKK0081(CAANMsg inCBSMsg)
	{
		// カレントレコード検索パラメータの設定
		CAANMsg msg = new CAANMsg(KK0081ETMsg.class.getName());
		msg.set(KK0081ETMsg.SVC_KEI_NO, inCBSMsg.getString(EKK0081C180CBSMsg.SVC_KEI_NO));
		msg.set(KK0081ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));

		// カレントレコードの検索
		return new JKKejbKK0081DBABase().findByCurrent(msg);
	}

	/**
	 * <p>
	 * エラー返却項目にエラーフラグを設定します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param status エラー時のステータス
	 * @param errInfo[] エラー情報が設定された配列 [0]:エラーフラグ [1]:エラー返却項目
	 */
	private void setErrInfo(CAANMsg inCBSMsg, int status, String[] errInfo)
	{
		inCBSMsg.set(JCMConstants.STATUS_INT_KEY, status);
		inCBSMsg.set(errInfo[1], errInfo[0]);
		return;

	}
}