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