/*********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *  システム名		：eo顧客基幹システム
 *  モジュール名	：JKKejbEKK0401C180Edit
 *  ソースファイル名：JKKejbEKK0401C180Edit.java
 *  作成者			：EKek0053
 *  日付			：2011年11月11日
 *＜機能概要＞
 *  サブオプションサービス契約解約確定相関ルールチェック部品です。
 *＜修正履歴＞
 *  バージョン	修正日		修正者		修正内容
 *  v1.00.00    2011/11/11  富士通      新規作成
 *  v4.00.00    2013/07/16  FJ)寺本     TG1-2013-0000704
*   v39.00.00   2018/10/01  FJ)舘山		【ANK-3484-00-00】_端末補償サービス導入対応
 *
 ********************************************************************************/

package eo.ejb.common.edit;

import com.fujitsu.futurity.model.base.CAANMsg;
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.KK0351ETMsg;
import eo.ejb.cbm.entity.KK0401ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0401C180CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.db.JKKejbKK0351DBABase;
import eo.ejb.common.db.JKKejbKK0401DBABase;
import eo.ejb.common.entity.JKKejbKRCKCommon;
import eo.ejb.common.rule.JKKejbRule0068001;

/**
 * <p>
 * サブオプションサービス契約解約確定相関ルールチェック部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbEKK0401C180Edit
{
	/** 月初 */
	public static final String GESYO = "01";

	/** 月初設定用 */
	public static final String GESYO_SETTEI = "1";

	/** 月初以外設定用 */
	public static final String GESYO_IGAI_SETTEI = "0";

	/** サービス契約ステータス_締結済 */
	private static final String SVCKEI_STAT_TEIKETU = "030";

	/**
	 * <p>
	 * 新しいJKKejbEKK0401C180Editを作成します。
	 * </p>
	 */
	public JKKejbEKK0401C180Edit()
	{
	}

	/**
	 * <p>
	 * 課金開始日設定(サブオプションサービス)の相関ルールにより課金開始日を算出する。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 課金開始日
	 */
	public Object getChrgStaYmd(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JKKejbEKK0401C180Edit#getChrgStaYmd");

		// オプションサービス契約取得（オプションサービス契約カレントレコード）
		CAANMsg ret0351Msg = getCurrentKK0351(inCBSMsg);

		// サービス契約取得（サービス契約カレントレコード）
		CAANMsg ret0081Msg = new JKKejbKRCKCommon().getOyaKK0081(inCBSMsg, ret0351Msg);

		// サブオプションサービス契約取得（サブオプションサービス契約カレントレコード）
		CAANMsg ret0401Msg = getCurrentKK0401(inCBSMsg);
		
		// 存在しない場合
		if (null == ret0401Msg)
		{
			return null;
		}

		// 課金開始前／開始後を判定する
		String dslStaZengo = null;

		// 検索結果のオプションサービス契約ステータスが締結済以外の場合
		// (受付済及び照査済からはサブオプションサービス契約解約確定は呼ばれない。
		//  締結済の場合はサービス課金開始日が未設定である。）
		if (!SVCKEI_STAT_TEIKETU.equals(ret0401Msg.getString(KK0401ETMsg.SBOP_SVC_KEI_STAT)))
		{
			// サービス課金開始日とサービス課金終了年月日を取得
			String svcChrgStaymd = ret0401Msg.getString(KK0401ETMsg.SVC_CHRG_STAYMD);
			String svcChrgEndYmd = inCBSMsg.getString(EKK0401C180CBSMsg.SVC_CHRG_ENDYMD);

			// サービス課金開始年月日≦サービス課金終了日の場合
			if (JKKModelCommon.isPastDate(svcChrgStaymd, svcChrgEndYmd, "1"))
			{
				dslStaZengo = "1";
			}
			// サービス課金開始年月日＞サービス課金終了日の場合
			else
			{
				dslStaZengo = "0";
			}
		}
		else
		{
			// 課金開始前を設定
			dslStaZengo = "0";
		}

		// 開始日設定(サブオプションサービス)の相関ルール部品呼び出し
		JKKejbRule0068001 rule0068 = new JKKejbRule0068001(inCBSMsg);

		// パラメータ設定
		rule0068.setSvc_cd(ret0081Msg.getString(KK0081ETMsg.SVC_CD));
		rule0068.setUpd_type("0"); // 更新契機（解約時）を設定する
		rule0068.setDslji_chrg(inCBSMsg.getString(EKK0401C180CBSMsg.DSLJI_CHRG_FLG));
		rule0068.setDsl_sta_zengo(dslStaZengo);
		rule0068.setSvc_sta_ymd(ret0401Msg.getString(KK0401ETMsg.SVC_STAYMD));
		rule0068.setSvc_chrg_sta_ymd(ret0401Msg.getString(KK0401ETMsg.SVC_CHRG_STAYMD));
		rule0068.setSvc_end_ymd(inCBSMsg.getString(EKK0401C180CBSMsg.SVC_ENDYMD));
// ▽▽▽ ANK-3484-00-00 ADD START
		rule0068.setBefor_svc_chrg_end_ymd(null);
// △△△ ANK-3484-00-00 ADD END

		// ルールの呼び出し
		String chrgStaYmd = rule0068.getChrgStaYmd();

		// 開始年月日が取得できなかった場合、エラー処理を行う。
		if (null == chrgStaYmd || "".equals(chrgStaYmd))
		{
			return null;
		}

		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "end:JKKejbEKK0401C180Edit#getChrgStaYmd");

		return chrgStaYmd;
	}

	/**
	 * <p>
	 * オプションサービス契約のカレントレコード取得。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @return CAANMsg 検索結果
	 */
	private CAANMsg getCurrentKK0351(CAANMsg inCBSMsg)
	{
		// レコードの取得（オプションサービス契約カレントレコード）
		CAANMsg inETMsg = new CAANMsg(KK0351ETMsg.class.getName());
		inETMsg.set(KK0351ETMsg.OP_SVC_KEI_NO, inCBSMsg.getString(EKK0401C180CBSMsg.OP_SVC_KEI_NO));
		inETMsg.set(KK0351ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));

		// オプションサービス契約のカレント検索を行う
		CAANMsg outMsg = new JKKejbKK0351DBABase().findByCurrent(inETMsg);

		return outMsg;
	}

	/**
	 * <p>
	 * サブオプションサービス契約のカレントレコード取得。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @return CAANMsg 検索結果
	 */
	private CAANMsg getCurrentKK0401(CAANMsg inCBSMsg)
	{
		// レコードの取得（サブオプションサービス契約カレントレコード）
		CAANMsg inETMsg = new CAANMsg(KK0401ETMsg.class.getName());
		inETMsg.set(KK0401ETMsg.OP_SVC_KEI_NO, inCBSMsg.getString(EKK0401C180CBSMsg.OP_SVC_KEI_NO));
		inETMsg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, inCBSMsg.getString(EKK0401C180CBSMsg.SBOP_SVC_KEI_NO));
		inETMsg.set(KK0401ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));

		// サブオプションサービス契約のカレント検索を行う
		CAANMsg outMsg = new JKKejbKK0401DBABase().findByCurrent(inETMsg);

		return outMsg;
	}
}
