/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JKKejbIdoRsvDBAUtil
*	ソースファイル名：JKKejbIdoRsvDBAUtil.java
*	作成者			：富士通
*	日付			：2011年10月18日
*＜機能概要＞
*	異動予約データベースアクセス共通部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/10/18	富士通		新規作成
*	v33.00.00	2017/08/29	FJ)孫		ANK-3035-00-00 未来予約データ存在時のお客様スキーマの挙動
*
**********************************************************************/

package eo.ejb.common.db;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import com.fujitsu.futurity.common.JCCWebAddTrnId;
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.KK1681ETMsg;
import eo.ejb.cbm.entity.KK1681LE;
import eo.ejb.cbs.cbsmsg.EKK0321C020CBSMsg;
import eo.ejb.common.JKKModelCommon;
import eo.ejb.common.entity.JKKejbIdoRsvAccess;

/**
 * <p>
 * 異動予約データベースアクセス共通部品クラスです。
 * </p>
 * @author 富士通
 */
public class JKKejbIdoRsvDBAUtil
{

	/** 異動予約詳細コード_お客様情報変更／併合／分割 */
	private static final String IDO_DTLCD_CUST_MIX_SPLIT = "001";

	/** 異動予約状態コード_取消済 */
	private static final String IDO_STATCD_CANCEL = "02";
	
	// ANK-3035-00-00 2017/08/29 ADD START
	
	/**
	 * 強制解約場合のサービスID.
	 */
	public static final String SERVICE_ID_CUST_INFO_ADD_CHANGE_COMPULSION_CANCEL = "KKSV0167";
	
	/**
	 * 標準コンテンツ解約のサービスID.
	 */
	public static final String SERVICE_ID_CUST_INFO_ADD_STANDARD_CONTENTS = "CKSV9026";
	
	/**
	 * お客様情報本登録移行のサービスID.
	 */
	public static final String SERVICE_ID_CUST_INFO_ADD_INSERT_MAIN = "CKSV9024";
	
	/**
	 * お客様情報本登録マスター会員場合のサービスID.
	 */
	public static final String SERVICE_ID_CUST_INFO_ADD_INSERT_MAIN_MASTER_USER = "CKSV9023";
	
	/**
	 * お客様情報変更のサービスID.
	 */
	public static final String SERVICE_ID_CUST_INFO_MOD = "CKSV9025";
	
	// ANK-3035-00-00 2017/08/29 ADD END

	/**
	 * <p>
	 * JKKejbIdoRsvDBAUtilクラスのインスタンスを生成します。
	 * </p>
	 */
	public JKKejbIdoRsvDBAUtil()
	{
	}

	/**
	 * <p>
	 * 異動予約に存在するお客様情報変更/併合/分割の予約レコードを返却します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param sysid SYSID
	 * @param rsvAplyYmd 予約適用年月日
	 * @return 異動予約に存在するお客様の予約レコードを返却します。
	 */
	public CAANMsg[] getCustRsvInIdoRsv(CAANMsg inCBSMsg, AgentDispatchContext inContext, String sysid, String rsvAplyYmd)
	{
		
		// 運用日付取得
		String opeDate = JKKModelCommon.getOpeDate(inCBSMsg);
		
		// レコード格納用リスト
		ArrayList<CAANMsg> custRsvList = new ArrayList<CAANMsg>();
		
		if (null == sysid || null == rsvAplyYmd)
		{
			return custRsvList.toArray(new CAANMsg[0]);
		}
		
		// 対象の「お客様」の予約検索を行う
		List<CAANMsg> retList = new JKKejbIdoRsvAccess().getIdoRsvSisid(sysid, null, opeDate);
		
		for (int i = 0; i < retList.size(); i++)
		{
			// 異動予約詳細コードが"お客様情報変更／併合／分割"の場合
			if (IDO_DTLCD_CUST_MIX_SPLIT.equals(retList.get(i).getString(KK1681ETMsg.IDO_RSV_DTL_CD)))
			{
				// 異動予約.予約適用年月日が入力値.予約適用年月日より未来日の「異動予約」が予約取消対象
				if (rsvAplyYmd.compareTo(retList.get(i).getString(KK1681ETMsg.RSV_APLY_YMD)) < 0)
				{
					custRsvList.add(retList.get(i));
				}
			}
		}
		
		return custRsvList.toArray(new CAANMsg[0]);
	}

	/**
	 * <p>
	 * 異動予約に存在するお客様情報変更/併合/分割の予約レコードを取り消します。
	 * </p>
	 * @param inCBSMsg 処理対象のメッセージキャリア
	 * @param inContext Agentから渡されたAgentDispatchContext
	 * @param inMsg 更新対象メッセージ
	 */
	public void cancelCustRsvInIdoRsv(CAANMsg inCBSMsg, AgentDispatchContext inContext, CAANMsg inMsg)
	{
		// ANK-3035-00-00 2017/08/29 ADD START
		// 共通メッセージからサービス呼び出し元の区分を取得する
		HashMap<String, Object> commonMsg = JCCWebAddTrnId.get(JCMConstants.ADD_TRN_ID_MESSAGE_COMMON_MAP);
		String serviceId = (String)commonMsg.get(JCMConstants.USECASE_ID_KEY);
		
		//強制解約(KKSV0167)、お客様情報変更(CKSV9025)、お客様情報本登録移行(CKSV9024)、
		//標準コンテンツ解約(CKSV9026)、お客様情報本登録(CKSV9026)場合、実施しない
		if(!(serviceId.startsWith(SERVICE_ID_CUST_INFO_ADD_STANDARD_CONTENTS) 
				|| serviceId.startsWith(SERVICE_ID_CUST_INFO_ADD_INSERT_MAIN)
				|| serviceId.startsWith(SERVICE_ID_CUST_INFO_ADD_INSERT_MAIN_MASTER_USER)
				|| serviceId.startsWith(SERVICE_ID_CUST_INFO_ADD_CHANGE_COMPULSION_CANCEL)
				|| serviceId.startsWith(SERVICE_ID_CUST_INFO_MOD)))
		{
		// ANK-3035-00-00 2017/08/29 ADD END
			// 異動予約の更新
			inMsg.set(KK1681ETMsg.IDO_RSV_CL_YMD, JKKModelCommon.getOpeDate(inCBSMsg));
			inMsg.set(KK1681ETMsg.IDO_RSV_STAT_CD, IDO_STATCD_CANCEL);
			inMsg.set(KK1681ETMsg.UPD_DTM, inCBSMsg.getString(JCMConstants.OPERATE_DATETIME_KEY));
			inMsg.set(KK1681ETMsg.UPD_OPEACNT, inCBSMsg.getString(JCMConstants.OPERATOR_ID_KEY));

			JKKejbDBAUtil dba = new JKKejbDBAUtil(inCBSMsg);
			dba.update(inMsg);
		}
	}
}
