/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKK0411C010ETDA
*	ソースファイル名：JEKK0411C010ETDA.java
*	作成者			：富士通
*	日付			：2013年02月16日
*＜機能概要＞
*	課金先請求契約変更時の副次処理を行う部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00.00	2013/02/16	FJ）藤本	ST3-2013-0000390
*
**********************************************************************/

package eo.ejb.common.db;

import com.fujitsu.futurity.common.JCMConstants;
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 com.fujitsu.futurity.model.ejb.common.fw.TemplateMainHandler;

import eo.common.util.JPCUtilCommon;
import eo.ejb.cbm.entity.KK0401ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0411C010CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.edit.JKKejbKK0401Edit;

/**
 * <p>
 * サブオプションサービス契約<ISP>変更の副次処理を行う部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEKK0411C010ETDA implements TemplateMainHandler
{

	/**
	 * DBアクセス
	 * @param inCBSMsg  処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execDBAccess(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 開始ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JEKK0411C010ETDA.execDBAccess");

		String addCapa = inCBSMsg.getString(EKK0411C010CBSMsg.ADD_CAPA);
		String opSvcKeiNo = inCBSMsg.getString(EKK0411C010CBSMsg.OP_SVC_KEI_NO);
		String sbopSvcKeiNo = inCBSMsg.getString(EKK0411C010CBSMsg.SBOP_SVC_KEI_NO);

		JKKejbKK0401Edit KK0401Edit = new JKKejbKK0401Edit();
		// 入力値.追加容量＝カレント.追加容量の場合
		if (!KK0401Edit.chgAddCapa(inCBSMsg, inContext, opSvcKeiNo, sbopSvcKeiNo, addCapa))
		{
			return;
		}

		CAANMsg inETMsgKK0401 = new CAANMsg(KK0401ETMsg.class.getName());
		inETMsgKK0401.set(KK0401ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		inETMsgKK0401.set(KK0401ETMsg.SBOP_SVC_KEI_NO, sbopSvcKeiNo);
		inETMsgKK0401.set(KK0401ETMsg.RSV_APLY_YMD, JKKModelCommon.getOpeDate(inCBSMsg));

		// サブオプションサービス契約のカレント検索
		CAANMsg ret0401 = new JKKejbKK0401DBABase().findByCurrent(inETMsgKK0401);

		// 検索結果がnullだった場合
		if (ret0401 == null)
		{
			return;
		}

		update(inCBSMsg, inContext, ret0401.getString(KK0401ETMsg.OP_SVC_KEI_NO), ret0401.getString(KK0401ETMsg.SBOP_SVC_KEI_NO), ret0401
				.getString(KK0401ETMsg.GENE_ADD_DTM));
		// 終了ログ出力
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "end:JEKK0411C010ETDA.execDBAccess");

		return;
	}

	/**
	 * <p>
	 * サブオプションサービス契約の更新を行う
	 * </p>
	 * @param inCBSMsg  処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @param sbopSvcKeiNo サブオプションサービス契約番号
	 * @param geneAddDtm 世代登録年月日時分秒
	 */
	private void update(CAANMsg inCBSMsg, AgentDispatchContext inContext, String opSvcKeiNo, String sbopSvcKeiNo, String geneAddDtm)
	{
		CAANMsg inETMsg = new CAANMsg(KK0401ETMsg.class.getName());

		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		String updDate = JPCUtilCommon.addDay(opeDate, -1);

		// オプションサービス契約番号
		inETMsg.set(KK0401ETMsg.OP_SVC_KEI_NO, opSvcKeiNo);
		// サブオプションサービス契約番号
		inETMsg.set(KK0401ETMsg.SBOP_SVC_KEI_NO, sbopSvcKeiNo);
		// 世代登録年月日時分秒
		inETMsg.set(KK0401ETMsg.GENE_ADD_DTM, geneAddDtm);
		// プラン終了年月日
		inETMsg.set(KK0401ETMsg.PLAN_ENDYMD, updDate);
		// プラン課金終了年月日
		inETMsg.set(KK0401ETMsg.PLAN_CHRG_ENDYMD, this.jdgPlanChrgEndYmd(inCBSMsg));
		// 更新年月日時分秒
		inETMsg.set(KK0401ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		// 更新オペレータアカウント
		inETMsg.set(KK0401ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));

		JKKejbDBAUtil dba = new JKKejbDBAUtil(inCBSMsg);
		dba.update(inETMsg);
	}
	
	/**
	 * <p>
	 * プラン課金終了年月日に設定する年月日を判定する。
	 * </p>
	 * @param inMsg 処理対象のメッセージキャリア
	 * @return 運用日 or カレント引継
	 */
	private String jdgPlanChrgEndYmd(CAANMsg inMsg)
	{
		// 運用日付 - 1を取得する
		String opeDate = JKKModelCommon.getOpeDate(inMsg);
		String updDate = JPCUtilCommon.addDay(opeDate, -1);

		// カレント検索用のメッセージを作成
		CAANMsg inETMsgKK0401 = new CAANMsg(KK0401ETMsg.class.getName());
		inETMsgKK0401.set(KK0401ETMsg.OP_SVC_KEI_NO, inMsg.getString(EKK0411C010CBSMsg.OP_SVC_KEI_NO));
		inETMsgKK0401.set(KK0401ETMsg.SBOP_SVC_KEI_NO, inMsg.getString(EKK0411C010CBSMsg.SBOP_SVC_KEI_NO));
		inETMsgKK0401.set(KK0401ETMsg.RSV_APLY_YMD, opeDate);

		// オプションサービス契約のカレント検索を行う
		CAANMsg retKK0401 = new JKKejbKK0401DBABase().findByCurrent(inETMsgKK0401);

		// 検索結果がnullだった場合
		if (retKK0401 == null)
		{
			return null;
		}

		// サービス課金開始年月日が未設定の場合は運用日付 - 1を返却する
		if (retKK0401.isNull(KK0401ETMsg.SVC_CHRG_STAYMD))
		{
			return updDate;
		}

		// カレントのサービス課金開始年月日が運用日付より未来日の場合
		if (JKKModelCommon.isFutureDate(retKK0401.getString(KK0401ETMsg.SVC_CHRG_STAYMD), opeDate, "0"))
		{
			return retKK0401.getString(KK0401ETMsg.PLAN_CHRG_ENDYMD);
		}
		else
		{
			return updDate;
		}
	}
}