/*********************************************************************
*   All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbEKK0401C110Edit
*	ソースファイル名：JKKejbEKK0401C110Edit.java
*	作成者			：EKek0053
*	日付			：2011年11月11日
*＜機能概要＞
*	サブオプションサービス契約料金プラン変更確定相関ルールチェック部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00    2011/11/11  富士通      新規作成
*   v39.00.00   2018/10/01  FJ)舘山		【ANK-3484-00-00】_端末補償サービス導入対応
*
********************************************************************************/

package eo.ejb.common.edit;

import java.util.List;

import com.fujitsu.futurity.model.base.CAANMsg;
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.common.util.JPCDateUtil;
import eo.ejb.cbm.entity.KK0011ETMsg;
import eo.ejb.cbm.entity.KK0021ETMsg;
import eo.ejb.cbm.entity.KK0081ETMsg;
import eo.ejb.cbm.entity.KK0351ETMsg;
import eo.ejb.cbm.entity.KK0401ETMsg;
import eo.ejb.cbm.entity.KK0411ETMsg;
import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0401C110CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.db.JKKejbKK0011DBABase;
import eo.ejb.common.db.JKKejbKK0021DBABase;
import eo.ejb.common.db.JKKejbKK0351DBABase;
import eo.ejb.common.db.JKKejbKK0401DBABase;
import eo.ejb.common.db.JKKejbKK0411DBABase;
import eo.ejb.common.entity.JKKejbIdoRsvAccess;
import eo.ejb.common.entity.JKKejbKRCKCommon;
import eo.ejb.common.rule.JKKejbRule0068001;
import eo.ejb.common.rule.JKKejbRule0076001;
import eo.ejb.common.rule.JKKejbRule0088001;

/**
 * <p>
 * サブオプションサービス契約料金プラン変更確定相関ルールチェック部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbEKK0401C110Edit
{
	/** 月初 */
	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 IDO_RSV_DTL_OPSTA = "014";

	/**
	 * <p>
	 * 新しいJKKejbEKK0401C110Editを作成します。
	 * </p>
	 */
	public JKKejbEKK0401C110Edit()
	{
	}

	/**
	 * <p>
	 * 開始日設定(サブオプションサービス)の相関ルールにより開始日を算出する。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 開始日
	 */
	public Object getStaYmd(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JKKejbEKK0401C110Edit#getStaYmd");

		// オプションサービス契約取得（オプションサービス契約カレントレコード）
		CAANMsg ret0351Msg = getCurrentKK0351(inCBSMsg);

		// サービス契約取得（サービス契約カレントレコード）
		CAANMsg ret0081Msg = new JKKejbKRCKCommon().getOyaKK0081(inCBSMsg, ret0351Msg);

		// サブオプションサービス契約取得（サブオプションサービス契約プライマリレコード）
		CAANMsg ret0401Msg = getPrimaryKK0401(inCBSMsg);
		
		// 存在しない場合
		if (null == ret0401Msg)
		{
			return null;
		}
		
		// サブオプションサービス契約に紐付くサービス契約のサービス課金開始年月日を取得
		String svcChrgStaymd = ret0081Msg.getString(KK0081ETMsg.SVC_CHRG_STAYMD);
		
		// サブオプションサービス契約に紐付くサービス契約のサービス開始年月日を取得
		String rule0088SvcStaYmd = ret0081Msg.getString(KK0081ETMsg.SVC_STA_YMD);
		
		// サービス契約のサービス開始年月日が未設定の場合
		if (rule0088SvcStaYmd == null)
		{
			// 異動予約より予約適用年月日を取得する
			JKKejbIdoRsvAccess jkIdoAc = new JKKejbIdoRsvAccess();
			List<CAANMsg> kk1681IdoList = jkIdoAc.getIdoRsvSvcKeiNo(ret0081Msg.getString(KK0081ETMsg.SVC_KEI_NO), JKKModelCommon.getOpeDate(inCBSMsg));

			for (CAANMsg msg : kk1681IdoList)
			{
				// 異動予約詳細コードがオプション開始か判定
				if (IDO_RSV_DTL_OPSTA.equals(msg.getString(KK1681ETMsg.IDO_RSV_DTL_CD)))
				{
					// 異動予約の予約適用年月日を設定
					rule0088SvcStaYmd = msg.getString(KK1681ETMsg.RSV_APLY_YMD);
				}
			}
		}

		// 申込明細の申込年月日を取得
		CAANMsg KK0021Cur = this.getCurrentKK0021(inCBSMsg, ret0401Msg.getString(KK0401ETMsg.MSKM_DTL_NO));
		String mskmYmd = KK0021Cur.getString(KK0021ETMsg.MSKM_YMD);

		// 申込期間を取得する
		String mskmPeriod = this.getMskmPeriod(inCBSMsg, mskmYmd, rule0088SvcStaYmd, svcChrgStaymd);
		// 申込期間が未設定または期間未定の場合はnullを返却（関連制約エラーとする）
		if (mskmPeriod == null || mskmPeriod.equals("0"))
		{
			// 相関エラーのステータスを設定
			inCBSMsg.set(EKK0401C110CBSMsg.SBOP_SVC_KEI_NO_ERR, "EB");
			inCBSMsg.set(EKK0401C110CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			return null;
		}

// ▽▽▽ ANK-3484-00-00 ADD START
		// 端末補償の申込年月日を設定
		String tmcpMskmYmd = null;

		CAANMsg kk0411Cur = getCurrentKK0411(inCBSMsg);
		if (kk0411Cur != null)
		{
			tmcpMskmYmd = kk0411Cur.getString(KK0411ETMsg.TMCP_MSKM_YMD);
		}
// △△△ ANK-3484-00-00 ADD END

		// 開始日設定(サブオプションサービス)の相関ルール部品呼び出し
		JKKejbRule0076001 rule0076 = new JKKejbRule0076001(inCBSMsg);
		// パラメータ設定
		rule0076.setSvc_cd(ret0081Msg.getString(KK0081ETMsg.SVC_CD));
		rule0076.setSbop_svc_cd(ret0401Msg.getString(KK0401ETMsg.SBOP_SVC_CD));
		rule0076.setMskm_period(mskmPeriod);
		rule0076.setSkj_ykjt(inCBSMsg.getString(EKK0401C110CBSMsg.SKJ_YKJT));
		rule0076.setKk0351_svc_sta_ymd(ret0351Msg.getString(KK0351ETMsg.SVC_STAYMD));
		rule0076.setKk0011_mskm_uk_ymd(getMskmYmd(ret0401Msg.getString(KK0401ETMsg.MSKM_DTL_NO)));
		rule0076.setSvc_use_sta_kibo_ymd(ret0401Msg.getString(KK0401ETMsg.SVC_USE_STA_KIBO_YMD));
// ▽▽▽ ANK-3484-00-00 ADD START
		rule0076.setKk0081_svc_chrg_sta_ymd(svcChrgStaymd);
		rule0076.setTmcp_mskm_ymd(tmcpMskmYmd);
// △△△ ANK-3484-00-00 ADD END

		// ルールの呼び出し
		String staYmd = rule0076.getStaYmd();

		// 開始年月日が取得できなかった場合、エラー処理を行う。
		if (null == staYmd || "".equals(staYmd))
		{
			// 相関エラーのステータスを設定
			inCBSMsg.set(EKK0401C110CBSMsg.SBOP_SVC_KEI_NO_ERR, "EB");
			inCBSMsg.set(EKK0401C110CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			return null;
		}

		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "end:JKKejbEKK0401C110Edit#getStaYmd");

		return staYmd;
	}

	/**
	 * <p>
	 * プラン終了年月日を算出する。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return プラン終了年月日
	 */
	public Object getEndYmd(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JKKejbEKK0401C110Edit#getEndYmd");

		// 開始年月日を取得
		String planStaYmd = (String)getStaYmd(inCBSMsg, inContext);
		
		// 開始年月日が取得できなかった場合、nullを返却する。
		if(null == planStaYmd)
		{
			return null;
		}

		// 開始年月日から1日前の日付を設定する		
		planStaYmd = JPCDateUtil.addDay(planStaYmd, -1);

		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "end:JKKejbEKK0401C110Edit#getEndYmd");

		return planStaYmd;
	}

	/**
	 * <p>
	 * 課金開始日設定(サブオプションサービス)の相関ルールにより課金開始日を算出する。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return 課金開始日
	 */
	public Object getChrgStaYmd(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JKKejbEKK0401C110Edit#getChrgStaYmd");

		// オプションサービス契約取得（オプションサービス契約カレントレコード）
		CAANMsg ret0351Msg = getCurrentKK0351(inCBSMsg);

		// サービス契約取得（サービス契約カレントレコード）
		CAANMsg ret0081Msg = new JKKejbKRCKCommon().getOyaKK0081(inCBSMsg, ret0351Msg);

		// サブオプションサービス契約取得（サブオプションサービス契約カレントレコード）
		CAANMsg ret0401Msg = getCurrentKK0401(inCBSMsg);
		// サブオプションサービスコードを取得する
		String sbopSvcCd = ret0401Msg.getString(KK0401ETMsg.SBOP_SVC_CD);
		
		// 存在しない場合
		if (null == ret0401Msg)
		{
			return null;
		}

		// 申込明細の申込年月日を取得
		CAANMsg KK0021Cur = this.getCurrentKK0021(inCBSMsg, ret0401Msg.getString(KK0401ETMsg.MSKM_DTL_NO));
		String mskmYmd = KK0021Cur.getString(KK0021ETMsg.MSKM_YMD);

		// サブオプションサービス契約に紐付くサービス契約のサービス課金開始年月日を取得
		String svcChrgStaymd = ret0081Msg.getString(KK0081ETMsg.SVC_CHRG_STAYMD);

		// サブオプションサービス契約に紐付くサービス契約のサービス開始年月日を取得
		String rule0088SvcStaYmd = ret0081Msg.getString(KK0081ETMsg.SVC_STA_YMD);
		
		// サービス契約のサービス開始年月日が未設定の場合
		if (rule0088SvcStaYmd == null)
		{
			// 異動予約より予約適用年月日を取得する
			JKKejbIdoRsvAccess jkIdoAc = new JKKejbIdoRsvAccess();
			List<CAANMsg> kk1681IdoList = jkIdoAc.getIdoRsvSvcKeiNo(ret0081Msg.getString(KK0081ETMsg.SVC_KEI_NO), JKKModelCommon.getOpeDate(inCBSMsg));

			for (CAANMsg msg : kk1681IdoList)
			{
				// 異動予約詳細コードがオプション開始か判定
				if (IDO_RSV_DTL_OPSTA.equals(msg.getString(KK1681ETMsg.IDO_RSV_DTL_CD)))
				{
					// 異動予約の予約適用年月日を設定
					rule0088SvcStaYmd = msg.getString(KK1681ETMsg.RSV_APLY_YMD);
				}
			}
		}

		// 申込期間を取得する
		String mskmPeriod = this.getMskmPeriod(inCBSMsg, mskmYmd, rule0088SvcStaYmd, svcChrgStaymd);
		// 申込期間が未設定または期間未定の場合はnullを返却（関連制約エラーとする）
		if (mskmPeriod == null || mskmPeriod.equals("0"))
		{
			// 相関エラーのステータスを設定
			inCBSMsg.set(EKK0401C110CBSMsg.SBOP_SVC_KEI_NO_ERR, "EB");
			inCBSMsg.set(EKK0401C110CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			return null;
		}
		
		// オプションサービス契約に紐付くサービス契約の料金グループを取得
		String prcGrpCd = ret0081Msg.getString(KK0081ETMsg.PRC_GRP_CD);
		
		
		// 開始日設定(サブオプションサービス)の相関ルール部品呼び出し
		JKKejbRule0068001 rule0068 = new JKKejbRule0068001(inCBSMsg);

		// パラメータ設定
		rule0068.setSvc_cd(ret0081Msg.getString(KK0081ETMsg.SVC_CD));
		rule0068.setUpd_type("1"); // 更新契機（開始時）を設定する
		rule0068.setSbop_svc_cd(sbopSvcCd); // サブオプションサービスコードを設定する
		rule0068.setBefor_svc_chrg_sta_ymd(svcChrgStaymd);
		rule0068.setPrc_grp_cd(prcGrpCd);
		rule0068.setMskm_period(mskmPeriod);
// ▽▽▽ ANK-3484-00-00 ADD START
		rule0068.setBefor_svc_chrg_end_ymd(null);
// △△△ ANK-3484-00-00 ADD END
		Object staYmd = getStaYmd(inCBSMsg,inContext);
		
		if(null == staYmd)
		{
			return null;
		}
		
		rule0068.setSvc_sta_ymd((staYmd).toString());
		
		// ルールの呼び出し
		String chrgStaYmd = rule0068.getChrgStaYmd();

		// 開始年月日が取得できなかった場合、エラー処理を行う。
		if (null == chrgStaYmd || "".equals(chrgStaYmd))
		{
			// 相関エラーのステータスを設定
			inCBSMsg.set(EKK0401C110CBSMsg.SBOP_SVC_KEI_NO_ERR, "EB");
			inCBSMsg.set(EKK0401C110CBSMsg.STATUS, StatusCodes.RELATION_ERR);
			return null;

		}

		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "end:JKKejbEKK0401C110Edit#getChrgStaYmd");

		return chrgStaYmd;
	}

	/**
	 * <p>
	 * プラン課金終了年月日を算出する。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @return プラン課金終了年月日
	 */
	public Object getChrgEndYmd(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JKKejbEKK0401C110Edit#getChrgEndYmd");

		// 課金開始年月日を取得
		String planChrgStaYmd = (String)getChrgStaYmd(inCBSMsg, inContext);

		// 課金開始年月日が取得できなかった場合、nullを返却する。
		if(null == planChrgStaYmd)
		{
			return null;
		}

		// 課金開始年月日から1日前の日付を設定する		
		planChrgStaYmd = JPCDateUtil.addDay(planChrgStaYmd, -1);

		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "end:JKKejbEKK0401C110Edit#getChrgEndYmd");

		return planChrgStaYmd;
	}

	/**
	 * <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(EKK0401C110CBSMsg.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 getPrimaryKK0401(CAANMsg inCBSMsg)
	{
		// レコードの取得（サブオプションサービス契約プライマリレコード）
		CAANMsg inETMsg = new CAANMsg(KK0401ETMsg.class.getName());
		inETMsg.set(KK0401ETMsg.OP_SVC_KEI_NO, inCBSMsg.getString(EKK0401C110CBSMsg.OP_SVC_KEI_NO));
		inETMsg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, inCBSMsg.getString(EKK0401C110CBSMsg.SBOP_SVC_KEI_NO));
		inETMsg.set(KK0401ETMsg.GENE_ADD_DTM, inCBSMsg.getString(EKK0401C110CBSMsg.GENE_ADD_DTM));

		// 一意照会を行い、結果を返却する
		CAANMsg outMsg = new JKKejbKK0401DBABase().findByPrimaryKey(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(EKK0401C110CBSMsg.OP_SVC_KEI_NO));
		inETMsg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, inCBSMsg.getString(EKK0401C110CBSMsg.SBOP_SVC_KEI_NO));
		inETMsg.set(KK0401ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));

		// サブオプションサービス契約のカレント検索を行う
		CAANMsg outMsg = new JKKejbKK0401DBABase().findByCurrent(inETMsg);

		return outMsg;
	}

	/**
	 * <p>
	 * 申込明細番号から申込の申込受付年月日時分秒を取得し年月日に編集。
	 * </p>
	 * @param mskmDtlNo 申込明細番号
	 * @return CAANMsg 申込受付年月日時分秒を編集した年月日
	 */
	private String getMskmYmd(String mskmDtlNo)
	{
		// レコードの取得（申込カレントレコード）
		CAANMsg inETMsgKK0011 = new CAANMsg(KK0011ETMsg.class.getName());
		inETMsgKK0011.set(KK0011ETMsg.MSKM_NO, getMskmNo(mskmDtlNo));

		CAANMsg outMsgKK0011 = new JKKejbKK0011DBABase().findByCurrent(inETMsgKK0011);

		// 申込受付年月日時分秒を取得
		String mskmdtl = outMsgKK0011.getString(KK0011ETMsg.MSKM_UK_DTM);

		// 年月日に編集する
		return JKKModelCommon.toYmdFromDtm(mskmdtl);
	}

	/**
	 * <p>
	 * 申込明細番号から申込番号を取得。
	 * </p>
	 * @param mskmDtlNo 申込明細番号
	 * @return CAANMsg 申込受付年月日時分秒を編集した年月日
	 */
	private String getMskmNo(String mskmDtlNo)
	{
		// レコードの取得（申込明細カレントレコード）
		CAANMsg inETMsgKK0021 = new CAANMsg(KK0021ETMsg.class.getName());
		inETMsgKK0021.set(KK0021ETMsg.MSKM_DTL_NO, mskmDtlNo);

		CAANMsg outMsgKK0021 = new JKKejbKK0021DBABase().findByCurrent(inETMsgKK0021);

		// レコードの取得（申込カレントレコード）
		return outMsgKK0021.getString(KK0021ETMsg.MSKM_NO);

	}

	/**
	 * <p>
	 * 申込明細のカレント検索を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param mskmDtlNo 申込明細番号
	 * @return 検索結果のレコード
	 */
	private CAANMsg getCurrentKK0021(CAANMsg inCBSMsg, String mskmDtlNo)
	{
		// カレント検索用のメッセージを作成
		CAANMsg inETMsg = new CAANMsg(KK0021ETMsg.class.getName());
		inETMsg.set(KK0021ETMsg.MSKM_DTL_NO, mskmDtlNo);

		// 申込明細のカレント検索を行う
		return new JKKejbKK0021DBABase().findByCurrent(inETMsg);
	}

	/**
	 * <p>
	 * 申込期間を取得する
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param mskmYmd 申込日
	 * @param svcStaYmd サービス開始日
	 * @param svcChrgStaymd サービス課金開始日
	 * @return 申込期間
	 */
	private String getMskmPeriod(CAANMsg inCBSMsg, String mskmYmd, String svcStaYmd, String svcChrgStaymd)
	{
		// 申込期間を取得
		JKKejbRule0088001 rule0088 = new JKKejbRule0088001(inCBSMsg);
		rule0088.setMskm_ymd(mskmYmd);
		rule0088.setSvc_sta_ymd(svcStaYmd);
		rule0088.setSvc_chrg_staymd(svcChrgStaymd);
		return rule0088.getMskmPeriodDef();
	}
// ▽▽▽
	/**
	 * <p>
	 * サブオプションサービス契約のカレントレコード取得。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @return CAANMsg 検索結果
	 */
	private CAANMsg getCurrentKK0411(CAANMsg inCBSMsg)
	{
		// レコードの取得（サブオプションサービス契約カレントレコード）
		CAANMsg inETMsg = new CAANMsg(KK0411ETMsg.class.getName());
		inETMsg.set(KK0411ETMsg.OP_SVC_KEI_NO, inCBSMsg.getString(EKK0401C110CBSMsg.OP_SVC_KEI_NO));
		inETMsg.set(KK0411ETMsg.SBOP_SVC_KEI_NO, inCBSMsg.getString(EKK0401C110CBSMsg.SBOP_SVC_KEI_NO));

		// サブオプションサービス契約のカレント検索を行う
		CAANMsg outMsg = new JKKejbKK0411DBABase().findByCurrent(inETMsg);

		return outMsg;
	}
// △△△
}
