/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKK0451C250ETDA
*	ソースファイル名：JEKK0451C250ETDA.java
*	作成者			：富士通
*	日付			：2018年04月24日
*＜機能概要＞
*	割引サービス契約課金開始日変更(工事費割賦)の副次処理を行う部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v37.00.00	2018/04/24	富士通		新規作成
*   v37.00.01   2018/06/01  FJ)寺園    【IT2-2018-0000047】工事費割賦請求STEP2
*   v53.00.00   2021/04/16  FJ)麻生    【ANK-3951-00-00】「競争ルールの検証に関するWG」に関するシステム対応
**********************************************************************/

package eo.ejb.common.db;

import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
import com.fujitsu.futurity.model.ejb.common.fw.AgentDispatchContext;
import com.fujitsu.futurity.model.ejb.common.fw.TemplateMainHandler;

import eo.common.constant.JKKStrConst;
import eo.common.util.JPCDateChecker;
import eo.ejb.cbm.entity.KK0451ETMsg;
import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbm.entity.KK2361ETMsg;
import eo.ejb.cbs.cbsmsg.EKK0451C250CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.JKKModelConst;
import eo.ejb.common.edit.JKKejbKK1681NumberParts;

/**
 * <p>
 * 割引サービス契約課金開始日変更(工事費割賦)の副次処理を行う部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEKK0451C250ETDA implements TemplateMainHandler
{
	/** 異動予約詳細コード：電話オプションパック割引開始 */
	private static final String TEL_OP_PACK_WRBK_STA = "027";
	
	/** 異動予約状態コード：未反映 */
	private static final String MIHANEI = "00";
	
	/** 無効フラグ(有効) **/
	private static final String MK_FLG_YUKO = "0";

	/** ｅｏ光電話パック７ */
	private static final String DATE_MAX = "20991231";
// v37.00.01 ADD START
	/** 割引サービス契約内訳ステータス 登録済 */
	private static final String WRIBSVCKEIUCWKSTAT_ADDZUMI = "010";
// v37.00.01 ADD END
	
	
	/**
	 * <p>
	 * 割引サービス契約課金開始日変更(工事費割賦)の副次処理を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	*/
	public void execDBAccess(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 運用日付の取得
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		
		// サービス開始年月日の取得
		String svcStaYmd = inCBSMsg.getString(EKK0451C250CBSMsg.SVC_STA_YMD);
		
		// 割引サービス契約のカレントレコードを取得します。
		CAANMsg inMsg = new CAANMsg(KK0451ETMsg.class.getName());
		inMsg.set(KK0451ETMsg.WRIB_SVC_KEI_NO, inCBSMsg.getString(EKK0451C250CBSMsg.WRIB_SVC_KEI_NO));
		inMsg.set(KK0451ETMsg.RSV_APLY_YMD, opeDate);
		CAANMsg kk0451Cur =  new JKKejbKK0451DBABase().findByCurrent(inMsg);
		
		CAANMsg kk0451ETMsg = null;
		CAANMsg kk1681ETMsg = null;

		// 割引サービス契約に振舞う場合
		if (JPCDateChecker.isPastDate(svcStaYmd, opeDate, "1"))
		{
			// 割引サービス契約のETMsgを作成
			kk0451ETMsg = makeKK0451ETMsg(inCBSMsg, inContext, kk0451Cur, svcStaYmd);

			// 割引サービス契約のDB登録
			create(inCBSMsg, kk0451ETMsg);
			
			// 割引サービス契約内訳を取得
			CAANMsg[] kk2361CurList = new JKKejbKK2361DBABase().getKK2361byWribSvcKei(
					inCBSMsg.getString(EKK0451C250CBSMsg.WRIB_SVC_KEI_NO), null, opeDate);
			
			for (CAANMsg kk2361Cur : kk2361CurList)
			{
				// 割引サービス契約内訳のメッセージを作成
				CAANMsg kk2361Msg = makeKK2361ETMsg(inCBSMsg, inContext, kk2361Cur, kk0451ETMsg);

				// 割引サービス契約内訳のDB登録
				create(inCBSMsg, kk2361Msg);
			}
			
			// 出力項目の設定
			setOutputItem(inCBSMsg, kk0451ETMsg);
		}
		// 異動予約に振舞う場合
		else
		{
			// 異動予約のETMsgを作成
			kk1681ETMsg = makeKK1681ETMsg(inCBSMsg, inContext, kk0451Cur, svcStaYmd);

			// 異動予約のDB登録
			create(inCBSMsg, kk1681ETMsg);

			// 出力項目の設定
			setOutputItem(inCBSMsg, kk1681ETMsg);
		}
	}
	
	/**
	 * <p>
	 * 割引サービス契約の登録を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inETMsg 割引サービス契約のカレントレコード
	 * @return 割引サービス契約に設定する内容が設定されたETメッセージ
	 */
	private CAANMsg makeKK0451ETMsg(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg inETMsg, String svcStaYmd)
	{
		String svcChrgYmd = null;
		
		try
		{
			// v53.00.00 MOD START
//			// サービス開始日の翌月初日をサービス課金開始年月日として設定する
//			svcChrgYmd = JKKModelCommon.addMonth(svcStaYmd, 1).substring(0, 6).concat("01");
			
			// キャンペーンが標準工事費相当額割引CP（一括）（電話用）の場合
			if (JKKStrConst.WRIB_SVC_KOJIHI_KAP_CP_TEL_IKT.equals(inETMsg.getString(KK0451ETMsg.WRIB_SVC_CD)))
			{
				// サービス開始日をサービス課金開始年月日として設定する
				svcChrgYmd = svcStaYmd;
			}
			// 上記以外の場合
			else
			{
				// サービス開始日の翌月初日をサービス課金開始年月日として設定する
				svcChrgYmd = JKKModelCommon.addMonth(svcStaYmd, 1).substring(0, 6).concat("01");
			}
			// v53.00.00 MOD END
		}
		catch (java.text.ParseException pe)
		{
			throw new CAANRuntimeException(pe);
		}
		
		// 世代登録年月日時分秒
		inETMsg.set(KK0451ETMsg.GENE_ADD_DTM, (String)JKKModelCommon.getTransferGeneAddDtm(inCBSMsg, inContext));
		
		// 割引サービス契約ステータス
		inETMsg.set(KK0451ETMsg.WRIB_SVC_KEI_STAT, JKKModelConst.WRIB_SVC_KEI_STAT_SVCTK_CHU);
		
		// サービス利用開始希望年月日が20991231の場合
		if (DATE_MAX.equals(inETMsg.getString(KK0451ETMsg.SVC_USE_STA_KIBO_YMD)))
		{
			// サービス利用開始希望年月日
			inETMsg.set(KK0451ETMsg.SVC_USE_STA_KIBO_YMD, svcStaYmd);
		}
		
		// 予約適用年月日
		inETMsg.set(KK0451ETMsg.RSV_APLY_YMD, svcStaYmd);
		
		// 予約適用コード
		inETMsg.set(KK0451ETMsg.RSV_APLY_CD, JKKModelConst.RSV_APLY_CD_RSV_FIX);
		
		// プラン開始年月日
		inETMsg.set(KK0451ETMsg.PLAN_STAYMD, svcStaYmd);
		
		// プラン終了年月日
		inETMsg.set(KK0451ETMsg.PLAN_ENDYMD, DATE_MAX);
		
		// プラン課金開始年月日
		inETMsg.set(KK0451ETMsg.PLAN_CHRG_STAYMD, svcChrgYmd);
		
		// プラン課金終了年月日
		inETMsg.set(KK0451ETMsg.PLAN_CHRG_ENDYMD, DATE_MAX);
		
		// サービス開始年月日
		inETMsg.set(KK0451ETMsg.SVC_STA_YMD, svcStaYmd);
		
		// サービス課金開始年月日
		inETMsg.set(KK0451ETMsg.SVC_CHRG_STAYMD, svcChrgYmd);
		
		// サービス終了年月日
		inETMsg.set(KK0451ETMsg.SVC_ENDYMD, DATE_MAX);
		
		// サービス課金終了年月日
		inETMsg.set(KK0451ETMsg.SVC_CHRG_ENDYMD, DATE_MAX);
		
		// 異動区分
		inETMsg.set(KK0451ETMsg.IDO_DIV, inCBSMsg.getString(EKK0451C250CBSMsg.IDO_DIV));
		
		// 登録年月日時分秒	ADD_DTM
		inETMsg.set(KK0451ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		
		// 登録オペレータアカウント	ADD_OPEACNT
		inETMsg.set(KK0451ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		
		// 更新年月日時分秒	UPD_DTM
		inETMsg.set(KK0451ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		
		// 更新オペレータアカウント	UPD_OPEACNT
		inETMsg.set(KK0451ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		
		// 無効フラグ MK_FLG
		inETMsg.set(KK0451ETMsg.MK_FLG, MK_FLG_YUKO);
		
		// 返却項目メッセージ生成
		inCBSMsg.set(EKK0451C250CBSMsg.GENE_ADD_DTM, inETMsg.getString(KK0451ETMsg.GENE_ADD_DTM));
		inCBSMsg.set(EKK0451C250CBSMsg.WRIB_SVC_KEI_STAT, inETMsg.getString(KK0451ETMsg.WRIB_SVC_KEI_STAT));
		inCBSMsg.set(EKK0451C250CBSMsg.RSV_APLY_YMD, inETMsg.getString(KK0451ETMsg.RSV_APLY_YMD));
		inCBSMsg.set(EKK0451C250CBSMsg.RSV_APLY_CD, inETMsg.getString(KK0451ETMsg.RSV_APLY_CD));
		inCBSMsg.set(EKK0451C250CBSMsg.PLAN_STAYMD, inETMsg.getString(KK0451ETMsg.PLAN_STAYMD));
		inCBSMsg.set(EKK0451C250CBSMsg.PLAN_ENDYMD, inETMsg.getString(KK0451ETMsg.PLAN_ENDYMD));
		inCBSMsg.set(EKK0451C250CBSMsg.PLAN_CHRG_STAYMD, inETMsg.getString(KK0451ETMsg.PLAN_CHRG_STAYMD));
		inCBSMsg.set(EKK0451C250CBSMsg.PLAN_CHRG_ENDYMD, inETMsg.getString(KK0451ETMsg.PLAN_CHRG_ENDYMD));
		inCBSMsg.set(EKK0451C250CBSMsg.SVC_CHRG_STAYMD, inETMsg.getString(KK0451ETMsg.SVC_CHRG_STAYMD));
		inCBSMsg.set(EKK0451C250CBSMsg.SVC_ENDYMD, inETMsg.getString(KK0451ETMsg.SVC_ENDYMD));
		inCBSMsg.set(EKK0451C250CBSMsg.SVC_CHRG_ENDYMD, inETMsg.getString(KK0451ETMsg.SVC_CHRG_ENDYMD));
				
		return inETMsg;
	}
	
	/**
	 * <p>
	 * 割引サービス契約内訳の登録メッセージの作成を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inETMsg 割引サービス契約内訳のカレントレコード
	 * @param KK0451ETMsg 割引サービス契約に登録したETメッセージ
	 * @return 割引サービス契約内訳に設定する内容が設定されたETメッセージ
	 */
	private CAANMsg makeKK2361ETMsg(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg inETMsg, CAANMsg kk0451Msg)
	{
		
		// 世代登録年月日時分秒
		inETMsg.set(KK2361ETMsg.GENE_ADD_DTM, (String)JKKModelCommon.getTransferGeneAddDtm(inCBSMsg, inContext));
		
		// 割引サービス契約内訳ステータス
// v37.00.01 MOD START
//		inETMsg.set(KK2361ETMsg.WRIB_SVC_KEI_UCWK_STAT, JKKModelConst.WRIB_SVC_KEI_STAT_SVCTK_CHU);
		inETMsg.set(KK2361ETMsg.WRIB_SVC_KEI_UCWK_STAT, WRIBSVCKEIUCWKSTAT_ADDZUMI);
// v37.00.01 MOD END
		
		// サービス課金開始年月日
		inETMsg.set(KK2361ETMsg.SVC_CHRG_STAYMD, kk0451Msg.getString(KK0451ETMsg.SVC_CHRG_STAYMD));
		
		// サービス課金終了年月日
		inETMsg.set(KK2361ETMsg.SVC_CHRG_ENDYMD, DATE_MAX);
		
		// 登録年月日時分秒	ADD_DTM
		inETMsg.set(KK0451ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		
		// 登録オペレータアカウント	ADD_OPEACNT
		inETMsg.set(KK0451ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		
		// 更新年月日時分秒	UPD_DTM
		inETMsg.set(KK0451ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		
		// 更新オペレータアカウント	UPD_OPEACNT
		inETMsg.set(KK0451ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		
		// 無効フラグ MK_FLG
		inETMsg.set(KK0451ETMsg.MK_FLG, MK_FLG_YUKO);
		
		// 割引適用回数
		inETMsg.set(KK2361ETMsg.WRIB_APLY_CNT, inCBSMsg.getString(EKK0451C250CBSMsg.WRIB_APLY_CNT));
				
		return inETMsg;
	}
	
	/**
	 * <p>
	 * 異動予約更新処理のDBアクセス処理を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	*/
	private CAANMsg makeKK1681ETMsg(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg curKK0451, String svcStaYmd)
	{
		// ETMsgの作成
		CAANMsg inETMsg = new CAANMsg(KK1681ETMsg.class.getName());
		
		// 採番処理
		JKKejbKK1681NumberParts numberParts = new JKKejbKK1681NumberParts();
		String ido_rsv_no = numberParts.getIdoRsvNo(inCBSMsg, inContext);
		
		// 異動予約番号	IDO_RSV_NO
		inETMsg.set(KK1681ETMsg.IDO_RSV_NO, ido_rsv_no);
		
		// 異動区分	IDO_DIV
		inETMsg.set(KK1681ETMsg.IDO_DIV, inCBSMsg.getString(EKK0451C250CBSMsg.IDO_DIV));

		// 異動予約詳細コード	IDO_RSV_DTL_CD
		inETMsg.set(KK1681ETMsg.IDO_RSV_DTL_CD, TEL_OP_PACK_WRBK_STA);
		
		// 予約適用年月日	RSV_APLY_YMD
		inETMsg.set(KK1681ETMsg.RSV_APLY_YMD, svcStaYmd);
		
		// 異動予約状態コード	IDO_RSV_STAT_CD
		inETMsg.set(KK1681ETMsg.IDO_RSV_STAT_CD, MIHANEI);
		
		// 申込明細番号	MSKM_DTL_NO
		inETMsg.set(KK1681ETMsg.MSKM_DTL_NO, curKK0451.getString(KK0451ETMsg.MSKM_DTL_NO));
		
		// 割引サービス契約番号	WRIB_SVC_KEI_NO
		inETMsg.set(KK1681ETMsg.WRIB_SVC_KEI_NO, inCBSMsg.getString(EKK0451C250CBSMsg.WRIB_SVC_KEI_NO));
		
		// 登録年月日時分秒	ADD_DTM
		inETMsg.set(KK1681ETMsg.ADD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		
		// 登録オペレータアカウント	ADD_OPEACNT
		inETMsg.set(KK1681ETMsg.ADD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		
		// 更新年月日時分秒	UPD_DTM
		inETMsg.set(KK1681ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		
		// 更新オペレータアカウント	UPD_OPEACNT
		inETMsg.set(KK1681ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		
		// 無効フラグ MK_FLG
		inETMsg.set(KK1681ETMsg.MK_FLG, MK_FLG_YUKO);
		
		// 返却項目メッセージ生成
		inCBSMsg.set(EKK0451C250CBSMsg.RSV_APLY_YMD, inETMsg.getString(KK1681ETMsg.RSV_APLY_YMD));
				
		return inETMsg;
	}
	
	/**
	 * <p>
	 * データベースへの登録を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inETMsg 処理対象のメッセージキャリア(ETメッセージ)
	 */
	private void create(CAANMsg inCBSMsg, CAANMsg inETMsg)
	{
		JKKejbDBAUtil dba = new JKKejbDBAUtil(inCBSMsg);
		
		// レコード登録
		dba.create(inETMsg);
	}
	
	/**
	 * <p>
	 * CBSメッセージの出力項目に値を設定します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inETMsg DBに設定した内容を持っているETメッセージ
	 */
	private void setOutputItem(CAANMsg inCBSMsg, CAANMsg inETMsg)
	{
		inCBSMsg.set(EKK0451C250CBSMsg.ADD_DTM, inETMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		inCBSMsg.set(EKK0451C250CBSMsg.ADD_OPEACNT, inETMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		inCBSMsg.set(EKK0451C250CBSMsg.UPD_DTM, inETMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		inCBSMsg.set(EKK0451C250CBSMsg.UPD_OPEACNT, inETMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		inCBSMsg.set(EKK0451C250CBSMsg.MK_FLG, JKKModelConst.MK_FLG_YK);
	}
}
