/*******************************************************************************
 *	 All Rights reserved,Copyright (c) K-Opticom 
 ********************************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JEKK0491C220ETDA
 *	ソースファイル名：JEKK0491C220ETDA.java
 *	作成者			：富士通
 *	日付			：2011年10月21日
 *＜機能概要＞
 *	請求契約予約取消の副次処理を行う部品
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	ｖ1.00.00
 *	ｖ11.00.00	2014/10/25	FJ)舩橋		【ANK-2248-00-00】対応
 *
 ********************************************************************************/

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.fw.AgentDispatchContext;

import eo.ejb.cbm.entity.KK0441ETMsg;
import eo.ejb.cbm.entity.KK0441LE;
import eo.ejb.cbm.entity.KK0491ETMsg;
import eo.ejb.cbm.entity.KK1681ETMsg;
import eo.ejb.cbm.entity.KK1681LE;
import eo.ejb.cbs.cbsmsg.EKK0441B002CBSMsg1List;
import eo.ejb.cbs.cbsmsg.EKK0491C220CBSMsg;
import eo.ejb.common.JKKModelCommon;

/**
 * <p>
 * 請求契約予約取消の副次処理を行う部品です。
 * </p>
 * @author 富士通
 */
public class JEKK0491C220ETDA
{

	/** 異動予約詳細コード：請求契約情報変更／併合／分割 */
	private static final String SEIKY_HENKO = "002";

	/** 異動予約状態コード：取消済 */
	private static final String YOYAKU_TRKS = "02";

	/** 異動予約状態コード：異動予約対象外 */
	private static final String YOYAKU_OUTSIDE = "04";

	/** 無効フラグ：有効 */
	private static final String MK_FLG_VALID = "0";
	
	/** 無効フラグ：無効 */
	private static final String MK_FLG_MUKO = "1";

	// ANK-2248-00-00 ADD START
	/** 請求オプションサービス契約 料金コースコード：NHK団体一括契約 */
	private static final String SEIOP_SVC_KEI_PCRS_CD_NHK = "E02";

	/** 請求オプションサービス契約 料金プランコード：NHK団体一括契約 */
	private static final String SEIOP_SVC_KEI_PPLAN_CD_NHK = "PE0201";

	/** 異動区分：お客様併合 */
	private static final String IDO_DIV_HEI = "00013";

	/** 異動区分：お客様分割 */
	private static final String IDO_DIV_BUN = "00014";
	// ANK-2248-00-00 ADD END

	/** 
	 * <p>
	 * 請求契約予約取消の副次処理を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 */
	public void execDBAccess(CAANMsg inCBSMsg, AgentDispatchContext inContext)
	{
		// EE対応表の条件の判定なし

		// ANK-2248-00-00 ADD START
		String wSysID = "";
		// ANK-2248-00-00 ADD END

		// 異動予約登録処理を実行
		String seikyKeiNo = inCBSMsg.getString(EKK0491C220CBSMsg.SEIKY_KEI_NO);
		CAANMsg[] updateIdoRsvNoList = getIdoRsv(seikyKeiNo, SEIKY_HENKO, YOYAKU_OUTSIDE);

		CAANMsg updateInfo = null;
		for (CAANMsg idoRsv : updateIdoRsvNoList)
		{
			//異動予約の予約適用年月日が運用日付より未来の場合、異動予約DBアクセス処理を実行
			// 予約適用年月日の設定値取得
			String rsv_aply_ymd = idoRsv.getString(KK1681ETMsg.RSV_APLY_YMD);

			if (checkJoken(inCBSMsg, inContext, rsv_aply_ymd))
			{
				String idoRsvNo = idoRsv.getString(KK1681ETMsg.IDO_RSV_NO);

				//DBアクセス処理
				updateInfo = update(inCBSMsg, inContext, idoRsvNo);

				// 出力項目の設定
				setOutputItem(inCBSMsg, updateInfo);

				// ANK-2248-00-00 ADD START
				String ido_div = idoRsv.getString(KK1681ETMsg.IDO_DIV);
				if (IDO_DIV_HEI.equals(ido_div)) {
					wSysID = idoRsv.getString(KK1681ETMsg.HEIGO_SK_SYSID);
				}
				else if (IDO_DIV_BUN.equals(ido_div)) {
					wSysID = idoRsv.getString(KK1681ETMsg.BUNKATSU_SK_SYSID);
				}
				// ANK-2248-00-00 ADD END
			}

		}
		
		// 請求契約をPK検索する
		CAANMsg kk0491Cond = new CAANMsg(KK0491ETMsg.class.getName());
		kk0491Cond.set(KK0491ETMsg.SEIKY_KEI_NO, inCBSMsg.getString(EKK0491C220CBSMsg.SEIKY_KEI_NO));
		kk0491Cond.set(KK0491ETMsg.GENE_ADD_DTM, inCBSMsg.getString(EKK0491C220CBSMsg.GENE_ADD_DTM));
		CAANMsg kk0491 = new JKKejbKK0491DBABase().findByPrimaryKey(kk0491Cond);
		
		if (null == kk0491)
		{
			// 予約レコード請求契約が存在しない場合、更新処理を終了する
			return;
		}
			
		// 請求オプションサービス契約の取消処理を実行
		String mskmDtlNo = kk0491.getString(KK0491ETMsg.MSKM_DTL_NO);
		
		// ANK-2248-00-00 MOD START
//		updateKK0441(inCBSMsg, seikyKeiNo, mskmDtlNo);
		updateKK0441(inCBSMsg, seikyKeiNo, mskmDtlNo, wSysID);
		// ANK-2248-00-00 MOD END

		return;
	}

	/**
	 * <p>
	 * 異動予約登録処理の条件チェックを行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext ディスパッチコンテキスト
	 * @param rsv_aply_ymd 予約適用年月日
	 * @return チェック結果(OK:true, NG:false)
	 */
	private boolean checkJoken(CAANMsg inCBSMsg, AgentDispatchContext inContext, String rsv_aply_ymd)
	{
		if (rsv_aply_ymd != null && rsv_aply_ymd.compareTo(JKKModelCommon.getOpeDate(inCBSMsg)) > 0)
		{
			return true;
		}

		return false;
	}

	/**
	 * <p>
	 * 異動予約のDBアクセス処理を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param ido_rsv_no 更新対象の異動予約番号
	 * @return 異動予約
	 */
	private CAANMsg update(CAANMsg inCBSMsg, AgentDispatchContext inContext, String ido_rsv_no)
	{
		// ETMsgの作成
		CAANMsg inETMsg = new CAANMsg(KK1681ETMsg.class.getName());

		// 異動予約番号	IDO_RSV_NO
		inETMsg.set(KK1681ETMsg.IDO_RSV_NO, ido_rsv_no);

		// 異動予約取消年月日	IDO_RSV_CL_YMD
		inETMsg.set(KK1681ETMsg.IDO_RSV_CL_YMD, JKKModelCommon.getOpeDate(inCBSMsg));

		// 異動予約状態コード	IDO_RSV_STAT_CD
		inETMsg.set(KK1681ETMsg.IDO_RSV_STAT_CD, YOYAKU_TRKS);

		// 更新年月日時分秒	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));

		// 異動予約番号の更新
		JKKejbDBAUtil dba = new JKKejbDBAUtil(inCBSMsg);
		dba.update(inETMsg);

		return inETMsg;
	}

	/**
	 * <p>
	 * 下記項目を条件に異動予約を取得します。
	 * <br>・請求契約番号
	 * <br>・異動予約詳細コード
	 * <br>・異動予約状態コード
	 * </p>
	 * @param seikyKeiNo 検索する請求契約番号
	 * @param idoRsvDtlCd 検索する異動予約詳細コード
	 * @param idoRsvStatCd 検索する異動予約状態コード
	 * @return 条件に該当する異動予約
	 *          条件に該当する異動予約がない場合、nullを返却
	 */
	private CAANMsg[] getIdoRsv(String seikyKeiNo, String idoRsvDtlCd, String idoRsvStatCd)
	{
		// 条件を設定
		KK1681LE le = new KK1681LE();
		CAANMsg conditionETMsg = new CAANMsg(KK1681ETMsg.class.getName());
		conditionETMsg.set(KK1681ETMsg.SEIKY_KEI_NO, seikyKeiNo);
		conditionETMsg.set(KK1681ETMsg.IDO_RSV_DTL_CD, idoRsvDtlCd);
		conditionETMsg.set(KK1681ETMsg.IDO_RSV_STAT_CD, idoRsvStatCd);
		conditionETMsg.set(KK1681ETMsg.MK_FLG, MK_FLG_VALID);

		CAANMsg[] resultMsg = null;

		try
		{
			resultMsg = le.findByCondition(conditionETMsg);
		}
		catch (CAANException ce)
		{
			// エラーが発生した場合、nullを返却
			return null;
		}

		// 検索結果の1件目(1件のみ取得する想定)の異動予約を返却
		return resultMsg;
	}

	/**
	 * <p>
	 * CBSメッセージの出力項目に値を設定します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア(CBSメッセージ)
	 * @param inETMsg DBに設定した内容を持っているETメッセージ
	 */
	private void setOutputItem(CAANMsg inCBSMsg, CAANMsg inETMsg)
	{
		inCBSMsg.set(EKK0491C220CBSMsg.UPD_DTM, inETMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
		inCBSMsg.set(EKK0491C220CBSMsg.UPD_OPEACNT, inETMsg.getString(JCMConstants.OPERATOR_ID_KEY));
	}

	/**
	 * <p>
	 * 請求オプションサービス契約のDBアクセス処理を行います。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param seikyKeiNo 請求契約番号
	 * @param mskmDtlNo 申込明細番号
	 * @param HBsysID 併合先/分割先YSYID
	 */
	// ANK-2248-00-00 MOD START
	private void updateKK0441(CAANMsg inCBSMsg, String seikyKeiNo, String mskmDtlNo, String HBsysID)
	// ANK-2248-00-00 MOD END
	{
		// 更新した請求契約の項目をキーに請求契約オプションサービス契約の全件検索を行う
		CAANMsg kk0441Cond = new CAANMsg(KK0441ETMsg.class.getName());
		kk0441Cond.set(KK0441ETMsg.SEIKY_KEI_NO, seikyKeiNo);
		kk0441Cond.set(KK0441ETMsg.MSKM_DTL_NO, mskmDtlNo);
		kk0441Cond.set(KK0441ETMsg.MK_FLG, MK_FLG_VALID);

		CAANMsg[] kk0441List = null;
		
		// 全件検索を行い、検索項目に紐づくレコードを抽出
		KK0441LE le = new KK0441LE();
		try
		{
			kk0441List = le.findByCondition(kk0441Cond);

		}
		catch (CAANException e1)
		{
			throw new CAANRuntimeException(e1);
		}
		
		
		if (null == kk0441List || 0 == kk0441List.length)
		{
			// 検索キーに紐づく請求オプションサービス契約が存在しない場合、更新処理を終了する
			return;
		}
		
		// 取得したレコードが運用日より未来日のレコードのみ更新を行う。
		for(int i = 0; i < kk0441List.length; i++)
		{
			if(0 < kk0441List[i].getString(KK0441ETMsg.RSV_APLY_YMD).compareTo(JKKModelCommon.getOpeDate(inCBSMsg)))
			{
				// 更新用ETMsgの作成
				CAANMsg kk0441Info = new CAANMsg(KK0441ETMsg.class.getName());

				// ANK-2248-00-00 MOD START
//				// 請求オプションサービス契約番号	SEIOPSVC_KEI_NO
//				kk0441Info.set(KK0441ETMsg.SEIOPSVC_KEI_NO, kk0441List[i].getString(KK0441ETMsg.SEIOPSVC_KEI_NO));
//				// 世代登録年月日時分秒	GENE_ADD_DTM
//				kk0441Info.set(KK0441ETMsg.GENE_ADD_DTM, kk0441List[i].getString(KK0441ETMsg.GENE_ADD_DTM));
//				// 更新年月日時分秒	UPD_DTM
//				kk0441Info.set(KK0441ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
//				// 更新オペレータアカウント	UPD_OPEACNT
//				kk0441Info.set(KK0441ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
//				// 無効フラグ	MK_FLG
//				kk0441Info.set(KK0441ETMsg.MK_FLG, MK_FLG_MUKO);

				String seiopsvcKeiPcrs = kk0441List[i].getString(KK0441ETMsg.PCRS_CD);
				String seiopsvcKeiPplan = kk0441List[i].getString(KK0441ETMsg.PPLAN_CD);

				// 料金コースコードと料金プランコードがNHK団体一括契約はSYSIDのみ変更
				if(SEIOP_SVC_KEI_PCRS_CD_NHK.equals(seiopsvcKeiPcrs) && SEIOP_SVC_KEI_PPLAN_CD_NHK.equals(seiopsvcKeiPplan)) {
					// SYSID	SYSID
					kk0441Info.set(KK0441ETMsg.SYSID, HBsysID);
				}
				else {
					// 無効フラグ	MK_FLG
					kk0441Info.set(KK0441ETMsg.MK_FLG, MK_FLG_MUKO);
				}
				
				// 請求オプションサービス契約番号	SEIOPSVC_KEI_NO
				kk0441Info.set(KK0441ETMsg.SEIOPSVC_KEI_NO, kk0441List[i].getString(KK0441ETMsg.SEIOPSVC_KEI_NO));
				// 世代登録年月日時分秒	GENE_ADD_DTM
				kk0441Info.set(KK0441ETMsg.GENE_ADD_DTM, kk0441List[i].getString(KK0441ETMsg.GENE_ADD_DTM));
				// 更新年月日時分秒	UPD_DTM
				kk0441Info.set(KK0441ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
				// 更新オペレータアカウント	UPD_OPEACNT
				kk0441Info.set(KK0441ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));
				// ANK-2248-00-00 MOD END
	
				// 更新処理
				JKKejbDBAUtil dba = new JKKejbDBAUtil(inCBSMsg);
				dba.update(kk0441Info);
			}
		}
	}
}
