/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKSvcNrkeCompleRegistration
*	ソースファイル名	：JBSbatKKSvcNrkeCompleRegistration.java
*	作成者				：富士通　
*	作成日				：2024年05月08日
*＜機能概要＞
*　サービス乗換完了登録部品です。EO2IP0210J0
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v72.00.00	2024/05/08	FJ）舘山	新規作成
*	v72.00.01	2024/07/02	FJ) 舘山	IT1-2024-0000018
*********************************************************************/
package eo.business.service;

import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatKKConst;
import eo.business.common.JCCBatCommon;
import eo.business.util.table.JBSbatKK_T_IDO_RSV;
import eo.business.util.table.JBSbatKK_T_MSKM;
import eo.business.util.table.JBSbatKK_T_MSKM_DTL;
import eo.business.util.table.JBSbatKK_T_SVC_KEI;
import eo.common.constant.JKKStrConst;
import eo.framework.application.JBSbatBusinessError;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;


/**
 * (クラスの機能概要) <p>
 *<BR>
 * @author 富士通
 */
public class JBSbatKKSvcNrkeCompleRegistration extends JBSbatBusinessService
{

	/** テーブルアクセスクラス(申込)*/
	private static final String D_TBL_NAME_KK_T_MSKM = "KK_T_MSKM";

	/** テーブルアクセスクラス(申込明細)*/
	private static final String D_TBL_NAME_KK_T_MSKM_DTL = "KK_T_MSKM_DTL";

	/** テーブルアクセスクラス(サービス契約)*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI = "KK_T_SVC_KEI";

	/** テーブルアクセスクラス(異動予約)*/
	private static final String D_TBL_NAME_KK_T_IDO_RSV = "KK_T_IDO_RSV";

	/** SQL定義キー(KK_SELECT_023)*/
	private static final String KK_T_SVC_KEI_KK_SELECT_023 = "KK_SELECT_023";

	/** SQL定義キー(KK_SELECT_109)*/
	private static final String KK_T_IDO_RSV_KK_SELECT_109 = "KK_SELECT_109";

	/** テーブルアクセスクラス(申込)*/
	private JBSbatSQLAccess db_KK_T_MSKM = null;

	/** テーブルアクセスクラス(申込明細)*/
	private JBSbatSQLAccess db_KK_T_MSKM_DTL = null;

	/** テーブルアクセスクラス(サービス契約)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI = null;
	
	/** テーブルアクセスクラス(異動予約)*/
	private JBSbatSQLAccess db_KK_T_IDO_RSV = null;

	/** 入力ファイルの項目定義*/
	private static final String NRKESAKI_SVC_KEI_NO = "SVC_KEI_NO";
	/** 入力ファイルの項目定義*/
	private static final String NRKEMT_SVKEI_NO = "NRKEMT_SVKEI_NO";
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	@Override
	public void initial(JBSbatCommonItem commonItem) throws Exception {
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_MSKM = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_MSKM);

		// DBアクセスクラスを生成します
		db_KK_T_MSKM_DTL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_MSKM_DTL);

		// DBアクセスクラスを生成します
		db_KK_T_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI);

		// DBアクセスクラスを生成します
		db_KK_T_IDO_RSV = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_IDO_RSV);

	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		
		// 乗り換え元及び、撤去(解約)の検索
		executeKK_T_IDO_RSV_KK_SELECT_109(new Object[]{inMap.getString(NRKEMT_SVKEI_NO), super.opeDate});
		JBSbatCommonDBInterface dbNrkeMoto = db_KK_T_IDO_RSV.selectNext();
		
		// 乗り換え先の検索
		executeKK_T_SVC_KEI_KK_SELECT_023(new Object[]{inMap.getString(NRKESAKI_SVC_KEI_NO), super.opeDate});
		JBSbatCommonDBInterface dbNrkeSaki = db_KK_T_SVC_KEI.selectNext();
		
		// 乗り換え元あり、乗り換え先あり、異動予約あり
		if (dbNrkeMoto != null && dbNrkeSaki != null)
		{
			// 撤去解約の異動予約番号
			String idoRsvNo = dbNrkeMoto.getString(JBSbatKK_T_IDO_RSV.IDO_RSV_NO);
			
			// 解約起算日（乗換先のサービス開始日）
			String dslKisanYmd = dbNrkeSaki.getString(JBSbatKK_T_SVC_KEI.SVC_STA_YMD);
			
			if (dslKisanYmd == null || dslKisanYmd.equals(""))
			{
				// マイナーエラー（スキップ）「%1%情報が取得できませんでした。 %2%」
				super.logPrint.printBusinessErrorLog("EKKB1470KW", new String[]{"乗り換え先の開始", inMap.getString(NRKESAKI_SVC_KEI_NO)});
				throw new JBSbatBusinessError();
			}
			
			// 異動予約のチェック（当日に処理されない）
			if (JBSbatKKConst.CD01168_IDO_RSV_STAT_CD_03.equals(dbNrkeMoto.getString(JBSbatKK_T_IDO_RSV.IDO_RSV_STAT_CD)))
			{
				// 取消
				HashMap<String,String> updateMap = new HashMap<String, String>();
// IT1-2024-0000018 Modify START
//				updateMap.put(JBSbatKK_T_IDO_RSV.IDO_RSV_CL_YMD, super.opeDate); 								// 予約取消年月日
//				updateMap.put(JBSbatKK_T_IDO_RSV.IDO_RSV_STAT_CD, JBSbatKKConst.CD01168_IDO_RSV_STAT_CD_02);	// 異動予約状態コード
				updateMap.put(JBSbatKK_T_IDO_RSV.RSV_APLY_YMD, dslKisanYmd); 									// 予約適用年月日
				updateMap.put(JBSbatKK_T_IDO_RSV.IDO_RSV_STAT_CD, JBSbatKKConst.CD01168_IDO_RSV_STAT_CD_00);	// 異動予約状態コード
// IT1-2024-0000018 Modify START
				
				executeKK_T_IDO_RSV_PKUPDATE(updateMap, new String[]{idoRsvNo});
				
// IT1-2024-0000018 DEL START
//				// 解約登録
//				insertDslReserve(dbNrkeMoto.getString(JBSbatKK_T_SVC_KEI.SYSID), dbNrkeMoto.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_NO), dslKisanYmd);
// IT1-2024-0000018 DEL END
			}
			// 解約起算日チェック（解約起算日が乗り換え先のサービス開始日と一致しない）
			else if (!dslKisanYmd.equals(dbNrkeMoto.getString(JBSbatKK_T_IDO_RSV.RSV_APLY_YMD)))
			{
				// 変更
				HashMap<String,String> updateMap = new HashMap<String, String>();
				updateMap.put(JBSbatKK_T_IDO_RSV.RSV_APLY_YMD, dslKisanYmd); 									// 予約適用年月日
				updateMap.put(JBSbatKK_T_IDO_RSV.IDO_RSV_STAT_CD, JBSbatKKConst.CD01168_IDO_RSV_STAT_CD_00);	// 異動予約状態コード
				
				executeKK_T_IDO_RSV_PKUPDATE(updateMap, new String[]{idoRsvNo});
			}
		}
		else 
		{
			// マイナーエラー（スキップ）「%1%情報が取得できませんでした。 %2%」
			super.logPrint.printBusinessErrorLog("EKKB1470KW", new String[]{"乗り換え", inMap.getString(NRKESAKI_SVC_KEI_NO) + "⇒" + inMap.getString(NRKEMT_SVKEI_NO)});
			throw new JBSbatBusinessError();
		}
		
		return null;
	}
	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	@Override
	public void terminal() throws Exception {
		
		// DBアクセスクラスをクローズします
		db_KK_T_MSKM.close();

		// DBアクセスクラスをクローズします
		db_KK_T_MSKM_DTL.close();

		// DBアクセスクラスをクローズします
		db_KK_T_SVC_KEI.close();

		// DBアクセスクラスをクローズします
		db_KK_T_IDO_RSV.close();
	}

	/**
	 * SQLKEY(KK_SELECT_023)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	サービス契約番号
	 *		 	予約適用年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_SVC_KEI_KK_SELECT_023(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_T_SVC_KEI.selectBySqlDefine(paramList, KK_T_SVC_KEI_KK_SELECT_023);
	}

	/**
	 * SQLKEY(KK_SELECT_109)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	サービス契約番号
	 *		 	運用日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_IDO_RSV_KK_SELECT_109(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_T_IDO_RSV.selectBySqlDefine(paramList, KK_T_IDO_RSV_KK_SELECT_109);
	}
	
	/**
	 * PK(ＰＫ　更新)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.引数で条件マップを作ります。<br>
	 *
	 * 3.DBアクセスを実行します。<br>
	 * 
	 * 4.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに設定する。
	 *		whereParam:PK項目の値を格納された配列です。PK項目は以下に説明します。
	 *		 	異動予約番号	IDO_RSV_NO
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値のマップ。
	 * @param whereParam 条件項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_IDO_RSV_PKUPDATE(HashMap<String, String> setParam, Object[] whereParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		appendDBInterface(setMap, setParam);
	
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("IDO_RSV_NO", whereParam[0]);

		// DBアクセスを実行します
		db_KK_T_IDO_RSV.updateByPrimaryKeys(whereMap, setMap);
	}
	
// IT1-2024-0000018 DEL START
//	/**
//	 * 解約の異動予約を登録する。
//	 * <br>
//	 * @param sysid			乗り換え元のSYSID
//	 * @param svcKeiNo		乗り換え元のサービス契約番号（解約対象）
//	 * @param dslKisanYmd	解約起算日
//	 * @throws Exception
//	 */
//	private void insertDslReserve(String sysid, String svcKeiNo, String dslKisanYmd) throws Exception
//	{
//		String mskmNo = JCCBatCommon.getFormatedNextSeq(commonItem, "SEQ_MSKM_NO", "", 12);
//		String mskmDtlNo = JCCBatCommon.getFormatedNextSeq(commonItem, "SEQ_MSKM_DTL_NO", "", 12);
//		String geneAddDtm = JCCBatCommon.getSysDateTimeStamp();
//		
//		{
//			// 申込
//			HashMap<String, String> mskmMap = new HashMap<String, String>();
//			mskmMap.put(JBSbatKK_T_MSKM.MSKM_NO, mskmNo); 					// 申込番号
//			mskmMap.put(JBSbatKK_T_MSKM.GENE_ADD_DTM, geneAddDtm); 			// 世代登録年月日時分秒
//			mskmMap.put(JBSbatKK_T_MSKM.MSKM_STAT, "130");					// 申込ステータス
//			mskmMap.put(JBSbatKK_T_MSKM.SYSID, sysid);						// SYSID
//			mskmMap.put(JBSbatKK_T_MSKM.MSKM_SBT_CD, "00005");				// 申込種別コード
//			mskmMap.put(JBSbatKK_T_MSKM.MSKM_UK_DTM, geneAddDtm);			// 申込受付年月日時分秒
//			// mskmMap.put(JBSbatKK_T_MSKM.MSKM_UK_TNT_USER_ID, null);		// 申込受付担当ユーザーID
//			mskmMap.put(JBSbatKK_T_MSKM.MSKM_YMD, super.opeDate);			// 申込年月日
//			mskmMap.put(JBSbatKK_T_MSKM.CONSMBSN_MSKM_STAT_SKBT_CD, "04");	// コンシューマ営業用申込状態識別コード
//			
//			executeKK_T_MSKM_PKINSERT(mskmMap);
//		}
//		{
//			// 申込明細
//			HashMap<String, String> mskmDtlMap = new HashMap<String, String>();
//			mskmDtlMap.put(JBSbatKK_T_MSKM_DTL.MSKM_DTL_NO, mskmDtlNo);			// 申込明細番号
//			mskmDtlMap.put(JBSbatKK_T_MSKM_DTL.GENE_ADD_DTM, geneAddDtm);		// 世代登録年月日時分秒
//			mskmDtlMap.put(JBSbatKK_T_MSKM_DTL.MSKM_DTL_STAT, "100");			// 申込明細ステータス
//			mskmDtlMap.put(JBSbatKK_T_MSKM_DTL.MSKM_NO, mskmNo);				// 申込番号
//			mskmDtlMap.put(JBSbatKK_T_MSKM_DTL.MSKM_YMD, super.opeDate);		// 申込年月日
//			mskmDtlMap.put(JBSbatKK_T_MSKM_DTL.SYSID, sysid);					// SYSID
//			mskmDtlMap.put(JBSbatKK_T_MSKM_DTL.MSKM_DTL_SHOSA_DTM, geneAddDtm);	// 申込明細照査年月日時分秒
//			mskmDtlMap.put(JBSbatKK_T_MSKM_DTL.KZKWRK_REQYMD, super.opeDate);	// 後続業務依頼年月日
//			mskmDtlMap.put(JBSbatKK_T_MSKM_DTL.OP_SVC_HKTGI_UM, "0");			// オプションサービス引継有無
//	
//			executeKK_T_MSKM_DTL_PKINSERT(mskmDtlMap);
//		}
//		{
//			// 異動予約
//			HashMap<String, String> idoRsvMap = new HashMap<String, String>();
//			idoRsvMap.put(JBSbatKK_T_IDO_RSV.IDO_RSV_NO, JCCBatCommon.getFormatedNextSeq(commonItem, JKKStrConst.SEQ_IDO_RSV_NO, "", 15));	//異動予約番号
//			idoRsvMap.put(JBSbatKK_T_IDO_RSV.IDO_DIV, JBSbatKKConst.CD00576_IDO_DIV_00005);					//異動区分
//			idoRsvMap.put(JBSbatKK_T_IDO_RSV.IDO_RSV_DTL_CD, JBSbatKKConst.CD01167_IDO_RSV_DTL_CD_007);		// 異動予約詳細コード
//			idoRsvMap.put(JBSbatKK_T_IDO_RSV.RSV_APLY_YMD, dslKisanYmd);									// 予約適用年月日
//			idoRsvMap.put(JBSbatKK_T_IDO_RSV.IDO_RSV_STAT_CD, JBSbatKKConst.CD01168_IDO_RSV_STAT_CD_00);	// 異動予約状態コード
//			idoRsvMap.put(JBSbatKK_T_IDO_RSV.MSKM_DTL_NO, mskmDtlNo);										// 申込明細番号
//			idoRsvMap.put(JBSbatKK_T_IDO_RSV.SVC_KEI_NO, svcKeiNo);											// サービス契約番号
//			idoRsvMap.put(JBSbatKK_T_IDO_RSV.PNLTY_HASSEI_CD, JBSbatKKConst.CD01375_PNLTY_HASSEI_CD_1);		// 違約金発生コード
//			
//			executeKK_T_IDO_RSV_PKINSERT(idoRsvMap);
//		}
//
//	}
//	
//	/**
//	 * 申込登録
//	 * <br>
//	 * @param mskmMap	登録内容
//	 * @throws Exception
//	 */
//	private void executeKK_T_MSKM_PKINSERT(HashMap<String, String> mskmMap) throws Exception
//	{
//		// 設定値のマップを作成します
//		JBSbatCommonDBInterface inMap = new JBSbatCommonDBInterface();
//		
//		appendDBInterface(inMap, mskmMap);
//		
//		db_KK_T_MSKM.insertByPrimaryKeys(inMap);
//	}
//
//	/**
//	 * 申込明細登録
//	 * <br>
//	 * @param mskmDtlMap	登録内容
//	 * @throws Exception
//	 */
//	private void executeKK_T_MSKM_DTL_PKINSERT(HashMap<String, String> mskmDtlMap) throws Exception
//	{
//		// 設定値のマップを作成します
//		JBSbatCommonDBInterface inMap = new JBSbatCommonDBInterface();
//
//		appendDBInterface(inMap, mskmDtlMap);
//		
//		db_KK_T_MSKM_DTL.insertByPrimaryKeys(inMap);
//	}
// IT1-2024-0000018 DEL END

	/**
	 * 異動予約登録
	 * <br>
	 * @param idoRsvMap		登録内容
	 * @throws Exception
	 */
	private void executeKK_T_IDO_RSV_PKINSERT(HashMap<String, String> idoRsvMap) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface inMap = new JBSbatCommonDBInterface();

		appendDBInterface(inMap, idoRsvMap);
		
		// DBアクセスを実行します
		db_KK_T_IDO_RSV.insertByPrimaryKeys(inMap);
	}
	
	/**
	 * DBインタフェースの項目値を追加する。
	 * <br>
	 * @param setMap
	 * @param inMap
	 * @throws Exception
	 */
	private void appendDBInterface(JBSbatCommonDBInterface setMap, HashMap<String, String> inMap) throws Exception
	{
		for (String key : inMap.keySet())
		{
			setMap.setValue(key, inMap.get(key));
		}
	}
	
}
