/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：Futurity
*	モジュール名	：JBSbatKKGetCourseChgChuJdg
*	ソースファイル名：JBSbatKKGetCourseChgChuJdg.java
*	作成者			：富士通
*	日付			：2015年02月23日
*＜機能概要＞
*	コース変更中判定部品
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v12.00.00	2015/02/23	FJ)谷口		新規作成【ANK-2188-00-00】【ＮＯ．１５８８】帯域制限の解除タイミング変更依頼
*	v26.00.00	2016/08/31	FJ)藤本		【IT1-2016-0000114】コース変更中の新認証IDに対するSODに帯域制限中と設定される
*
**********************************************************************/

package eo.business.common;

import java.sql.SQLException;

import eo.business.util.table.JBSbatKK_T_OP_SVC_KEI;
import eo.business.util.table.JBSbatKK_T_SVC_KEI_UCWK;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;

/**
 * コース変更中の新認証ID側のデータかの判定処理を行います。
 * 
 * <br>
 * @author 富士通
 */
public class JBSbatKKCourseChgChuJdg
{
	/** テーブル(異動予約)*/
	private static final String D_TBL_NAME_KK_T_IDO_RSV = "KK_T_IDO_RSV";

	// IT1-2016-0000114 DEL START
//	/** テーブル(料金コース変更可能条件)*/
//	private static final String D_TBL_NAME_KK_M_PCRS_CHG_PSBJKN = "KK_M_PCRS_CHG_PSBJKN";
	// IT1-2016-0000114 DEL END

	/** テーブル(サービス契約内訳)*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI_UCWK = "KK_T_SVC_KEI_UCWK";

	/** テーブル(オプションサービス契約)*/
	private static final String D_TBL_NAME_KK_T_OP_SVC_KEI = "KK_T_OP_SVC_KEI";

	/** SQL定義キー(KK_SELECT_086)*/
	private static final String KK_T_IDO_RSV_KK_SELECT_086 = "KK_SELECT_086";

	// IT1-2016-0000114 DEL START
//	/** SQL定義キー(KK_SELECT_001)*/
//	private static final String KK_M_PCRS_CHG_PSBJKN_KK_SELECT_001 = "KK_SELECT_001";
	// IT1-2016-0000114 DEL END

	/** SQL定義キー(KK_SELECT_119)*/
	private static final String KK_T_SVC_KEI_UCWK_KK_SELECT_119 = "KK_SELECT_119";
	
	/** SQL定義キー(KK_SELECT_116)*/
	private static final String KK_T_OP_SVC_KEI_KK_SELECT_116 = "KK_SELECT_116";

	
	
	
	/**
	 * コース変更中の新認証ID側のデータか判定処理です。
	 * 
	 * @param cmnItem 業務共通電文
	 * @param svcKeiNo サービス契約番号
	 * @param svcKeiUcwkNo サービス契約内訳番号
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @return true:コース変更中の新認証ID側 false:コース変更中の新認証ID側でない
	 * @throws Exception 例外が発生した場合
	 */
	public static boolean isCourseChgChuNewNinshoIdJdg(JBSbatCommonItem cmnItem, String svcKeiNo, String svcKeiUcwkNo, String opSvcKeiNo) throws Exception
	{
		// 入力パラメータチェック
		chkInput(cmnItem, svcKeiNo, svcKeiUcwkNo, opSvcKeiNo);
		
		boolean newNinshoIdJdgFlg = false;
		
		try
		{
			// 異動予約からコース変更中の旧料金コースコード、新料金コースコードを取得
			JBSbatSQLAccess idoRsv = new JBSbatSQLAccess(cmnItem, D_TBL_NAME_KK_T_IDO_RSV);
			
			// 検索キーを設定する
			JBSbatCommonDBInterface idoRsvList = new JBSbatCommonDBInterface();
			idoRsvList.setValue(svcKeiNo);					// サービス契約番号
			idoRsv.selectBySqlDefine(idoRsvList,KK_T_IDO_RSV_KK_SELECT_086);
			
			JBSbatCommonDBInterface idoRsvResult = new JBSbatCommonDBInterface();
			idoRsvResult = idoRsv.selectNext();
			
			if(null != idoRsvResult)
			{
				// IT1-2016-0000114 DEL START
				// 認証ID統一化案件(ANK-2765-00-00)のリリースをまたぐコース変更が正しく判定できないケースがあるため、
				// 料金コース変更可能条件スキーマの認証ID変更有無は参照しないようにする
//				String chgBfPcrsCd = idoRsvResult.getString(JBSbatKK_T_IDO_RSV.OLD_PCRS_CD);
//				String chgAfPcrsCd = idoRsvResult.getString(JBSbatKK_T_IDO_RSV.NEW_PCRS_CD);
//				
//				JBSbatSQLAccess pcrsChgPsbJkn = new JBSbatSQLAccess(cmnItem, D_TBL_NAME_KK_M_PCRS_CHG_PSBJKN);
//				
//				// 検索キーを設定する
//				JBSbatCommonDBInterface pcrsChgPsbJknList = new JBSbatCommonDBInterface();
//				pcrsChgPsbJknList.setValue(chgBfPcrsCd);					// 変更前料金コースコード
//				pcrsChgPsbJknList.setValue(chgAfPcrsCd);					// 変更後料金コースコード
//				pcrsChgPsbJknList.setValue(cmnItem.getOpeDate());			// バッチ運用日
//				pcrsChgPsbJkn.selectBySqlDefine(pcrsChgPsbJknList,KK_M_PCRS_CHG_PSBJKN_KK_SELECT_001);
//				
//				JBSbatCommonDBInterface pcrsChgPsbJknResult = new JBSbatCommonDBInterface();
//				pcrsChgPsbJknResult = pcrsChgPsbJkn.selectNext();
//				
//				if(null != pcrsChgPsbJknResult)
//				{
//					String ninshoIdChgUm = pcrsChgPsbJknResult.getString(JBSbatKK_M_PCRS_CHG_PSBJKN.NINSHO_ID_CHG_UM);
//					// 認証ID変更が伴うコース変の場合
//					if (JKKStrConst.CD_DIV_UM_ARI.equals(ninshoIdChgUm))
//					{
				// IT1-2016-0000114 DEL END
						if (null != svcKeiUcwkNo)
						{
							// サービス契約内訳
							JBSbatSQLAccess svKeiUw = new JBSbatSQLAccess(cmnItem, D_TBL_NAME_KK_T_SVC_KEI_UCWK);
							// 検索キーを設定し、SQLを実行
							JBSbatCommonDBInterface svKeiUwList = new JBSbatCommonDBInterface();
							svKeiUwList.setValue(svcKeiNo);					// サービス契約番号
							svKeiUwList.setValue(cmnItem.getOpeDate());		// バッチ運用日
							svKeiUw.selectBySqlDefine(svKeiUwList,KK_T_SVC_KEI_UCWK_KK_SELECT_119);
							
							JBSbatCommonDBInterface svKeiUwResult = new JBSbatCommonDBInterface();
							String newSvkeiUwNo = "";
							// IT1-2016-0000114 ADD START
							int countSvcKeiUcwk = 0;
							// IT1-2016-0000114 ADD END
							// 認証ID変更が伴うコース変の為サービス契約内訳番号は必ず複数取得される
							while (null != (svKeiUwResult = svKeiUw.selectNext()))
							{
								// IT1-2016-0000114 ADD START
								countSvcKeiUcwk++;
								// IT1-2016-0000114 ADD END
								// サービス契約内訳番号
								String wkSvKeiUwNo = svKeiUwResult.getString(JBSbatKK_T_SVC_KEI_UCWK.SVC_KEI_UCWK_NO);
								// サービス契約内訳番号が大きい方を設定する。
								if (newSvkeiUwNo.compareTo(wkSvKeiUwNo) < 0)
								{
									newSvkeiUwNo = wkSvKeiUwNo;
								}
								
							}
							// サービス契約番号に紐づくサービス契約内訳番号(サービス契約内訳番号が大きい方)とIN.サービス契約内訳番号が
							// 一致した場合true(認証ID変更が伴うコース変更中)を返す。
							// IT1-2016-0000114 MOD START
//							if(newSvkeiUwNo.equals(svcKeiUcwkNo))
							if (1 < countSvcKeiUcwk && newSvkeiUwNo.equals(svcKeiUcwkNo))
							// IT1-2016-0000114 MOD END
							{
								// 認証ID変更が伴うコース変更中(新認証ID側)
								newNinshoIdJdgFlg = true;
								cmnItem.getLogPrint().printDebugLog("サービス契約番号:" + svcKeiNo + "サービス契約内訳番号:" + svcKeiUcwkNo + "-新認証ID側(サービス契約内訳番号)");
							}
							// 新認証IDでない場合
							else
							{
								// コース変更中(旧認証ID側)
								cmnItem.getLogPrint().printDebugLog("サービス契約番号:" + svcKeiNo + "サービス契約内訳番号:" + svcKeiUcwkNo + "-旧認証ID側(サービス契約内訳番号)");
							}
						}
						else if(null == svcKeiUcwkNo && null != opSvcKeiNo)
						{
							// オプションサービス契約
							JBSbatSQLAccess opSvKei = new JBSbatSQLAccess(cmnItem, D_TBL_NAME_KK_T_OP_SVC_KEI);
							// 検索キーを設定する
							JBSbatCommonDBInterface opSvKeiList = new JBSbatCommonDBInterface();
							opSvKeiList.setValue(svcKeiNo);					// サービス契約番号
							opSvKeiList.setValue(opSvcKeiNo);				// オプションサービス契約番号
							opSvKeiList.setValue(cmnItem.getOpeDate());		// バッチ運用日
							opSvKeiList.setValue(cmnItem.getOpeDate());		// バッチ運用日
							opSvKei.selectBySqlDefine(opSvKeiList,KK_T_OP_SVC_KEI_KK_SELECT_116);
							
							JBSbatCommonDBInterface opSvKeiResult = new JBSbatCommonDBInterface();
							String newOpSvkeiNo = "";
							// IT1-2016-0000114 ADD START
							int countOpSvcKei = 0;
							// IT1-2016-0000114 ADD END
							// 認証ID変更が伴うコース変の為オプションサービス契約番号は必ず複数取得される
							while (null != (opSvKeiResult = opSvKei.selectNext()))
							{
								// IT1-2016-0000114 ADD START
								countOpSvcKei++;
								// IT1-2016-0000114 ADD END
								// オプションサービス契約番号
								String wkOpSvKeiNo = opSvKeiResult.getString(JBSbatKK_T_OP_SVC_KEI.OP_SVC_KEI_NO);
								// オプションサービス契約番号が大きい方を設定する。
								if (newOpSvkeiNo.compareTo(wkOpSvKeiNo) < 0)
								{
									newOpSvkeiNo = wkOpSvKeiNo;
								}
							}
							// サービス契約番号に紐づくオプションサービス契約番号(オプションサービス契約番号が大きい方)と
							// IN.オプションサービス契約番号が一致した場合true(認証ID変更が伴うコース変更中)を返す。
							// IT1-2016-0000114 MOD START
//							if(newOpSvkeiNo.equals(opSvcKeiNo))
							if (1 < countOpSvcKei && newOpSvkeiNo.equals(opSvcKeiNo))
							// IT1-2016-0000114 MOD END
							{
								// 認証ID変更が伴うコース変更中(新認証ID側)
								newNinshoIdJdgFlg = true;
								cmnItem.getLogPrint().printDebugLog("サービス契約番号:" + svcKeiNo + "オプションサービス契約番号:" + opSvcKeiNo + "-新認証ID側(オプションサービス契約番号)");
							}
							// 新認証IDでない場合
							else
							{
								// コース変更中(旧認証ID側)
								cmnItem.getLogPrint().printDebugLog("サービス契約番号:" + svcKeiNo + "オプションサービス契約番号:" + opSvcKeiNo + "-旧認証ID側(オプションサービス契約番号)");
							}
						}
						else
						{
							// サービス契約内訳番号、オプションサービス契約番号共にNULL
							// 入力パラメータのチェックの時点でエラーとする為ありえない
						}
			// IT1-2016-0000114 DEL START
//					}
//					// 認証ID変更がないコース変更
//					else
//					{
//						// 認証ID変更が伴わないコース変更中
//						// 認証ID変更が伴わないコース変はオーダが何もでない(ありえない)
//					}
//				}
//				// 料金コース変更可能条件に一致するレコードが無い場合
//				else
//				{
//					// 料金コース変更可能条件に一致しないコース変更中(ありえない)
//				}
			// IT1-2016-0000114 DEL END
			}
			// 異動予約にコース変更の異動がない場合
			else
			{
				// コース変更中で無い
				cmnItem.getLogPrint().printDebugLog("サービス契約番号:" + svcKeiNo + "-コース変更中でない");
			}
		}
		catch (SQLException e)
		{
			throw new Exception( "コース変更中判定処理で例外が発生しました。");
		}
		return newNinshoIdJdgFlg;

	}

	/**
	 * 入力パラメータのチェックを行います。<br>
	 * 
	 * @param cmnItem 業務共通電文
	 * @param svcKeiNo サービス契約番号
	 * @param svcKeiUcwkNo サービス契約内訳番号
	 * @param opSvcKeiNo オプションサービス契約番号
	 * @throws Exception 例外が発生した場合
	 */
	private static void chkInput(JBSbatCommonItem cmnItem, String svcKeiNo,  String svcKeiUcwkNo, String opSvcKeiNo) throws Exception
	{
		// 業務共通電文チェック
		if (cmnItem == null)
		{
			throw new Exception("バッチ共通電文がnullです。");
		}

		// バッチ運用日チェック
		String opeDate = cmnItem.getOpeDate();
		if (opeDate == null || opeDate.length() == 0)
		{
			cmnItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKKB0060TE, new String[]{"バッチ運用日"});
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0060TE, new String[]{"バッチ運用日"});
		}

		// サービス契約番号
		if (svcKeiNo == null || svcKeiNo.length() == 0)
		{
			cmnItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKKB0060TE, new String[]{"サービス契約番号"});
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0060TE, new String[]{"サービス契約番号"});
		}

		// サービス契約内訳番号、オプションサービス契約番号共に値が設定されていない場合
		if ((svcKeiUcwkNo == null || svcKeiUcwkNo.length() == 0) && (opSvcKeiNo == null || opSvcKeiNo.length() == 0))
		{
			cmnItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKKB0060TE, new String[]{"サービス契約内訳番号、オプションサービス契約番号"});
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EKKB0060TE, new String[]{"サービス契約内訳番号、オプションサービス契約番号"});
		}
	}

}
