/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JEKK0451C240ETDA
*	ソースファイル名：JEKK0451C240ETDA.java
*	作成者			：富士通
*	日付			：2016年11月24日
*＜機能概要＞
*	割引サービス契約課金終了日更新（セット割）の副次処理を行う部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*   v28.00.00   2016/11/24  FJ) 寺園    【ANK-3047-00-00  】【OM-2016-2038】事象F セット割パターンNo29の改修対応
**********************************************************************/

package eo.ejb.common.db;

import com.fujitsu.futurity.common.JCMConstants;
import com.fujitsu.futurity.model.base.CAANException;
import com.fujitsu.futurity.model.base.CAANMsg;
import com.fujitsu.futurity.model.base.CAANRuntimeException;
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.constant.JKKStrConst;
import eo.common.util.JPCUtilCommon;
import eo.ejb.cbm.entity.KK0451ETMsg;
import eo.ejb.cbm.entity.KK2361ETMsg;
import eo.ejb.cbm.entity.KK2361LE;
import eo.ejb.cbs.cbsmsg.EKK0451C240CBSMsg;
import eo.ejb.common.JKKModelCommon;
import java.text.ParseException;
import java.util.HashMap;

/**
 * <p>
 * 割引サービス契約課金終了日更新（セット割）の副次処理を行う部品クラスです。
 * </p>
 * @author 富士通
 */
public class JEKK0451C240ETDA implements TemplateMainHandler
{
	/** コード種別 異動区分 お客様併合 */
	private static final String CD00576_CUST_HEIGO = "00013";
	
	/** コード種別 異動区分 お客様分割 */
	private static final String CD00576_CUST_BNKT = "00014";
	
	/** コード種別 異動区分 請求先情報併合 */
	private static final String CD00576_SEIKY_HEIGO = "00016";
	
	/** コード種別 異動区分 請求先情報分割 */
	private static final String CD00576_SEIKY_BNKT = "00017";
	
	/**
	 * <p>
	 * 割引サービス契約課金終了日更新（セット割）の副次処理を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	*/
	public void execDBAccess(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// 異動区分の取得
		String idoDiv = inCBSMsg.getString(EKK0451C240CBSMsg.IDO_DIV);
		// お客様併合、お客様分割、請求先情報併合、請求先情報分割以外の場合は処理終了
		if (!(CD00576_CUST_HEIGO.equals(idoDiv) ||
				CD00576_CUST_BNKT.equals(idoDiv) ||
				CD00576_SEIKY_HEIGO.equals(idoDiv) ||
				CD00576_SEIKY_BNKT.equals(idoDiv)))
		{
			return;
		}

		// サービスコードの取得
		String svcCd = inCBSMsg.getString(EKK0451C240CBSMsg.SVC_CD);
		// インターネットサービス、電話サービス、テレビサービス以外の場合は処理終了
		if (!(JKKStrConst.CD00130_01.equals(svcCd) ||
				JKKStrConst.CD00130_02.equals(svcCd) ||
				JKKStrConst.CD00130_03.equals(svcCd)))
		{
			return;
		}

		JKKejbKK0451SecProc instance451 = new JKKejbKK0451SecProc();

		// 運用日付の取得
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);

		// 請求年月を取得
		String seikyYM = instance451.getSeikyYm(inCBSMsg, inContext, opeDate);
		
		// 対象の割引サービス契約を取得
		CAANMsg[] kk0451_1 = instance451.getKaiSetWribSvcKei1(inCBSMsg.getString(EKK0451C240CBSMsg.SVC_KEI_NO), opeDate);
		
		for (CAANMsg wribSvcKei_1: kk0451_1)
		{

			// 更新対象の割引サービス契約履歴を取得
			CAANMsg[] kk0451_2 = instance451.getKaiSetWribSvcKei2(wribSvcKei_1.getString(KK0451ETMsg.WRIB_SVC_KEI_NO), opeDate);
			
			for (CAANMsg wribSvcKei_2: kk0451_2)
			{
				// 解約済以外の場合は処理を終了する
				if (!(JKKStrConst.CD00055_DSLZM.equals(wribSvcKei_2.getString(KK0451ETMsg.WRIB_SVC_KEI_STAT))))
				{
					break;
				}
				// サービス課金終了年月日の年月が運用年月または請求年月以外の場合は処理しない
				if (!(opeDate.substring(0, 6).equals(wribSvcKei_2.getString(KK0451ETMsg.SVC_CHRG_ENDYMD).substring(0, 6)) ||
						seikyYM.equals(wribSvcKei_2.getString(KK0451ETMsg.SVC_CHRG_ENDYMD).substring(0, 6))))
				{
					continue;
				}
				try {
					// サービス課金終了年月日の前月末日を取得
					String retSvcChrgEndymd;
					retSvcChrgEndymd = JPCUtilCommon.addMonth(wribSvcKei_2.getString(KK0451ETMsg.SVC_CHRG_ENDYMD), -1).substring(0, 6);
					retSvcChrgEndymd = retSvcChrgEndymd + JPCUtilCommon.getEndOfMonth(retSvcChrgEndymd);

					// 割引サービス契約のサービス課金終了年月日、サービス課金終了年月日をサービス課金終了年月日の前月末日で更新する。
					updateKK0451(inCBSMsg, inContext, wribSvcKei_2, retSvcChrgEndymd);

					// 更新対象の割引サービス契約がカレントの場合、割引サービス契約内訳のサービス課金終了年月日を更新する。
					if (wribSvcKei_1.getString(KK0451ETMsg.GENE_ADD_DTM).equals(wribSvcKei_2.getString(KK0451ETMsg.GENE_ADD_DTM)))
					{
						updateSvcChrgEndymdChg(inCBSMsg, inContext, wribSvcKei_2.getString(KK0451ETMsg.WRIB_SVC_KEI_NO), retSvcChrgEndymd);
					}
				} catch (ParseException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * <p>
	 * 割引サービス契約の課金終了年月日を更新します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param kk0451Msg 更新対象の割引サービス契約
	 * @param svcChrgEndYmd サービス課金終了年月日
	 */
	private void updateKK0451(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg kk0451Msg, String svcChrgEndymd)
	{
		CAANMsg inETMsg = new CAANMsg(KK0451ETMsg.class.getName());
		String updDtm = inCBSMsg.getString(EKK0451C240CBSMsg.OPERATEDATETIME);
		String updOpeAct = inCBSMsg.getString(EKK0451C240CBSMsg.OPERATORID);

		inETMsg.set(KK0451ETMsg.WRIB_SVC_KEI_NO, kk0451Msg.getString(KK0451ETMsg.WRIB_SVC_KEI_NO));
		inETMsg.set(KK0451ETMsg.GENE_ADD_DTM, kk0451Msg.getString(KK0451ETMsg.GENE_ADD_DTM));
		inETMsg.set(KK0451ETMsg.PLAN_CHRG_ENDYMD, svcChrgEndymd);
		inETMsg.set(KK0451ETMsg.SVC_CHRG_ENDYMD, svcChrgEndymd);
		inETMsg.set(KK0451ETMsg.UPD_DTM, updDtm);
		inETMsg.set(KK0451ETMsg.UPD_OPEACNT, updOpeAct);
		
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JEKK0451C240ETDA#updateKK0451");
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JEKK0451C240ETDA#wrib_svc_kei_no=" + kk0451Msg.getString(KK0451ETMsg.WRIB_SVC_KEI_NO));
		
		// 更新を行う
		JKKejbDBAUtil dbaUtil = new JKKejbDBAUtil(inETMsg);
		dbaUtil.update(inETMsg);

		inCBSMsg.set(EKK0451C240CBSMsg.SVC_CHRG_ENDYMD, svcChrgEndymd);
		inCBSMsg.set(EKK0451C240CBSMsg.UPD_DTM, updDtm);
		inCBSMsg.set(EKK0451C240CBSMsg.UPD_OPEACNT, updOpeAct);
	}
	
	/**
	 * 割引サービス契約課金終了日変更に合わせて、割引サービス契約内訳の課金終了日の更新します。
	 * 
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param wribSvcKeiNo 割引サービス契約番号
	 * @param svcChrgEndymd サービス課金終了年月日
	 */
	public void updateSvcChrgEndymdChg(CAANMsg inCBSMsg, AgentDispatchContext inContext, String wribSvcKeiNo, String svcChrgEndymd)
	{
		
		// 割引サービス契約番号で一覧検索を行います
		CAANMsg inETMsgForCondition2361 = new CAANMsg(KK2361ETMsg.class.getName());
		inETMsgForCondition2361.set(KK2361ETMsg.WRIB_SVC_KEI_NO, wribSvcKeiNo);
		inETMsgForCondition2361.set(KK2361ETMsg.MK_FLG, JKKStrConst.CD00016_0);
		KK2361LE le2361 = new KK2361LE();
		CAANMsg[] retConditionETMsg2361 = null;
		
		try
		{
			retConditionETMsg2361 = le2361.findByCondition(inETMsgForCondition2361);
		}
		catch (CAANException ce)
		{
			throw new CAANRuntimeException(ce);
		}
		
		String retWribSvcKeiUcwkNo = null;
		CAANMsg inETMsgForCurrent2361 = new CAANMsg(KK2361ETMsg.class.getName());
		
		// 割引サービス契約内訳番号格納用マップ
		HashMap<String, String> escapeMap = new HashMap<String, String>();

		// 一覧の結果を検索します
		for (int i = 0; i < retConditionETMsg2361.length; i++)
		{
			retWribSvcKeiUcwkNo = retConditionETMsg2361[i].getString(KK2361ETMsg.WRIB_SVC_KEI_UCWK_NO);
			
			if (escapeMap.containsKey(retWribSvcKeiUcwkNo))
			{
				// 既に検索済みの場合
				continue;
			}
			// 割引サービス契約内訳番号を格納します
			escapeMap.put(retWribSvcKeiUcwkNo, retWribSvcKeiUcwkNo);
			
			// 一覧結果の割引サービス契約内訳番号でカレント検索を行います
			inETMsgForCurrent2361.set(KK2361ETMsg.WRIB_SVC_KEI_NO, wribSvcKeiNo);
			inETMsgForCurrent2361.set(KK2361ETMsg.WRIB_SVC_KEI_UCWK_NO, retWribSvcKeiUcwkNo);
			CAANMsg retCurrentETMsg2361 = new JKKejbKK2361DBABase().findByCurrent(inETMsgForCurrent2361);

			if (null == retCurrentETMsg2361)
			{
				// カレントレコードが存在しない場合
				continue;
			}

			// 割引サービス契約内訳の更新
			setETMsgChrgEndymdChg(inCBSMsg, inContext , retCurrentETMsg2361, svcChrgEndymd);
			updateWrbiSvcKeiUcwk(inCBSMsg, retCurrentETMsg2361);
		}
	}

	/**
	 * 割引サービス契約課金終了日変更時の割引サービス契約内訳更新用のETMsgを作成します。
	 * 
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param currentETMsg2361 割引サービス契約内訳のカレント検索結果ETMsg
	 * @param svcChrgEndymd サービス課金終了年月日
	 */
	private void setETMsgChrgEndymdChg(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg currentETMsg2361, String svcChrgEndymd)
	{
		// 割引サービス契約内訳更新用のETMsgを作成します
		currentETMsg2361.set(KK2361ETMsg.SVC_CHRG_ENDYMD, svcChrgEndymd); // サービス課金終了年月日
		currentETMsg2361.set(KK2361ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		currentETMsg2361.set(KK2361ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
		currentETMsg2361.setNull(KK2361ETMsg.DEL_DTM);
		currentETMsg2361.setNull(KK2361ETMsg.DEL_OPEACNT);
		currentETMsg2361.set(KK2361ETMsg.MK_FLG, JKKStrConst.CD00016_0);
	}
	
	/**
	 * 割引サービス契約内訳の更新処理を行います。
	 * 
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inETMsg 登録用のETMsg
	 */
	private void updateWrbiSvcKeiUcwk(CAANMsg inCBSMsg, CAANMsg inETMsg)
	{
		String key1 = inETMsg.getString(KK2361ETMsg.WRIB_SVC_KEI_NO);
		String key2 = inETMsg.getString(KK2361ETMsg.WRIB_SVC_KEI_UCWK_NO);
		
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JEKK0451C240ETDA#updateWrbiSvcKeiUcwk");
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JEKK0451C240ETDA#wrib_svc_kei_no=" + key1);
		JSYejbLog.println(JSYejbLog.DEBUG, this.getClass(), "call:JEKK0451C240ETDA#wrib_svc_kei_ucwk_no=" + key2);
		
		JKKejbDBAUtil dbaUtil = new JKKejbDBAUtil(inCBSMsg);
		dbaUtil.update(inETMsg);
	}
}
