/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKWribAutoAdd
*	ソースファイル名	：JBSbatKKWribAutoAdd.java
*	作成者				：富士通
*	作成日				：2018年06月20日
*＜機能概要＞
*　割引ＣＰ自動登録部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v50.00.00	2020/06/25  FJ）澤田	ANK-3754-00-00_トビラフォン対応
*	v61.00.00	2023/04/24	FJ)舘山		ANK-4315-00-00_【eo定期】eoホームゲートウェイ導入対応
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatKKIFM912;
import eo.business.util.table.JBSbatKK_M_WRIB_SVC;
import eo.business.util.table.JBSbatKK_M_WRISVC_TG_SVC;
import eo.business.util.table.JBSbatKK_T_SVC_KEI;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JKKStringUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.util.JCCBatchEsbInterface;
import eo.framework.db.JBSbatSQLAccess;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKKWribAutoAdd extends JBSbatBusinessService
{
	/** テーブル(サービス契約)*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI = "KK_T_SVC_KEI";
	
	/** テーブル(割引サービス対象サービス)*/
	private static final String D_TBL_NAME_KK_M_WRISVC_TG_SVC = "KK_M_WRISVC_TG_SVC";

	/** SQL定義キー(KK_SELECT_285)*/
	private static final String KK_T_SVC_KEI_KK_SELECT_285 = "KK_SELECT_285";
	
	/** SQL定義キー(KK_SELECT_007)*/
	private static final String KK_M_WRISVC_TG_SVC_KK_SELECT_007 = "KK_SELECT_007";
	
	/** テーブルアクセスクラス(サービス契約)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI = null;
	
	/** テーブルアクセスクラス(割引サービス対象サービス)*/
	private JBSbatSQLAccess db_KK_M_WRISVC_TG_SVC = null;
	
	/** ユースケースID(割引自動登録バッチ) */
	private static final String USECASE_ID_WRISVC_AUTO_APLY = "KKSV0948";
	
	/** CCタイトル(割引自動登録バッチ) */
	private static final String CC_TITLE_WRISVC_AUTO_APLY = "KKSV094801CC";

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI);
		db_KK_M_WRISVC_TG_SVC = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_M_WRISVC_TG_SVC);
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		String svcKeiNo = JKKStringUtil.nullToBlank(inMap.getString(JBSbatKKIFM912.SVC_KEI_NO));//サービス契約番号
		String wribSvcCd = JKKStringUtil.nullToBlank(inMap.getString(JBSbatKKIFM912.WRIB_SVC_CD));//割引サービスコード
		String dspCampaignCd = JKKStringUtil.nullToBlank(inMap.getString(JBSbatKKIFM912.DSP_CAMPAIGN_CD));//キャンペーンコード 
// ▽▽▽ ANK-4315-00-00 ADD START
		String wribChrgStaMonStiCd = JKKStringUtil.nullToBlank(inMap.getString(JBSbatKKIFM912.WRIB_CHRG_STA_MON_STI_CD));// 割引課金開始月指定コード 		
// ▲▲▲ ANK-4315-00-00 ADD END
		
		try 
		{
			// 割引サービスコードを設定されている場合
			if (JKKStringUtil.isNullBlank(wribSvcCd))
			{
				// サービス契約の存在チェックのため、サービス契約番号でサービス契約を検索
				JBSbatCommonDBInterface svcKeiInfo = getSvcKeiInfo(svcKeiNo);

				
				// キャンペーン情報を取得するため、キャンペーンコードで割引サービス・割引サービス対象サービスを取得
				ArrayList<JBSbatCommonDBInterface> wrisvcTgSvcList = getWrisvcTgSvc(dspCampaignCd);
				if(wrisvcTgSvcList.size() == 0)
				{
					// キャンペーンコードが割引サービスに存在しない
					// エラーログ出力
					commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKKB0010CW, new String[]{"キャンペーンコードが割引サービスに存在しない" +  super.commonItem.getInputCount() + "行目 サービス契約番号：" + svcKeiNo});
					
					// エラーフラグ設定
					super.commonItem.setErrFlg(true);
					return null;
				}
				
				// サービス契約の料金プランコードと一致する割引情報を取得する
				JBSbatCommonDBInterface wrisvcTgSvcInfo = null;
				for(int i = 0; i < wrisvcTgSvcList.size(); i++)
				{
					JBSbatCommonDBInterface dbMap = wrisvcTgSvcList.get(i);
					if(svcKeiInfo.getString(JBSbatKK_T_SVC_KEI.PPLAN_CD).equals(dbMap.getString(JBSbatKK_M_WRISVC_TG_SVC.PPLAN_CD)))
					{
						// 料金プランが一致
						wrisvcTgSvcInfo = dbMap;
						break;
					}
				}
		
				if(wrisvcTgSvcInfo == null)
				{
					// サービス契約の料金プランと一致する割引サービス対象サービスコードが存在しない
					// エラーログ出力
					commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKKB0010CW, new String[]{"サービス契約の料金プランと一致する割引サービス対象サービスコードが存在しない" +  super.commonItem.getInputCount() + "行目 サービス契約番号：" + svcKeiNo});
					
					// エラーフラグ設定
					super.commonItem.setErrFlg(true);
					return null;
				}
				
				wribSvcCd = wrisvcTgSvcInfo.getString(JBSbatKK_M_WRIB_SVC.WRIB_SVC_CD);	
			}

			// ユースケースIDを格納するMAPを生成します。
			HashMap<String, Object> paramMap0948 = new HashMap<String, Object>();
			paramMap0948.put(JCCBatchEsbInterface.TELEGRAM_INFO_USECASE_ID, USECASE_ID_WRISVC_AUTO_APLY);
			
			// サービスに渡す業務データを格納するMAPを生成します。
			HashMap<String, Object> inputMap0948 = new HashMap<String, Object>();
			
			// inputMap0948に設定するデータ用HashMapを生成します。
			HashMap<String, Object> dataMap0948 = new HashMap<String, Object>();
			// サービスの処理結果が格納されるMAPを生成します。
			HashMap<Object, Object> outMap0948 = new HashMap<Object, Object>();
			
			// inputMap0948にデータ用HashMapをサービスIDをKeyとして設定します。
			inputMap0948.put(CC_TITLE_WRISVC_AUTO_APLY, dataMap0948);
			
			// 機能コード
			dataMap0948.put("func_code", "1");
					
			//サービス契約番号
			dataMap0948.put("svc_kei_no", svcKeiNo);
			
			//割引サービスコード
			dataMap0948.put("wrib_svc_cd", wribSvcCd);
			
			//キャンペーンコード 
			dataMap0948.put("dsp_campaign_cd", dspCampaignCd);
// ▽▽▽ ANK-4315-00-00 ADD START
			
			// 割引課金開始月指定コード
			dataMap0948.put("wrib_chrg_sta_mon_sti_cd", wribChrgStaMonStiCd);
// ▲▲▲ ANK-4315-00-00 ADD END
			
			// 割引サービス自動適用部品CCを呼び出します。
			JCCBatchEsbInterface.invokeService(super.commonItem, paramMap0948, inputMap0948, outMap0948);
			
			// BPサービスの戻り値をチェック
			String returnCode = outMap0948.get(JCCBatchEsbInterface.RETURN_CODE).toString();
			
			if (!JCCBatchEsbInterface.RETURN_CODE_SUCCESS.equals(returnCode))
			{
				throw new Exception();
			}
		}
		catch (Exception e) 
		{
			// エラーログ出力
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EKKB0010CW, new String[]{e.getMessage() +  super.commonItem.getInputCount() + "行目 サービス契約番号：" + svcKeiNo});
			
			// エラーフラグ設定
			super.commonItem.setErrFlg(true);
		}

		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_SVC_KEI.close();
		db_KK_M_WRISVC_TG_SVC.close();
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * サービス契約番号をもとにサービス契約スキーマを検索する.
	 * 取得項目：サービス契約番号
	 *           SYSID
	 *           サービス契約ステータス
	 *           料金プランコード
	 * @param svcKeiNo
	 * @return JBSbatCommonDBInterface
	 * @throws Exception
	 */
	private JBSbatCommonDBInterface getSvcKeiInfo(String svcKeiNo) throws Exception
	{
		// サービス契約番号をもとにサービス契約スキーマを検索、その結果を返却する。
		Object[] param = {
				super.opeDate,		// サービス契約．予約適用年月日 <= 運用日
				svcKeiNo,			// サービス契約．サービス契約番号 = [サービス契約番号]
				super.opeDate		// サービス契約．予約適用年月日 <= 運用日
		};
		executeKK_T_SVC_KEI_KK_SELECT_285(param);
		return db_KK_T_SVC_KEI.selectNext();
	}
	
	/**
	 * キャンペーンコードをもとに割引サービス対象サービスマスタを検索する.
	 * 取得項目：割引サービスコード
	 *           割引タイプコード
	 *           割引サービス対象サービスコード
	 *           料金プランコード
	 * @param svcKeiNo
	 * @return dbList
	 * @throws Exception
	 */
	private ArrayList<JBSbatCommonDBInterface> getWrisvcTgSvc(String campaignCd) throws Exception
	{
		// サービス契約番号をもとにサービス契約スキーマを検索、その結果を返却する。
		Object[] param = {
				super.opeDate,		// 割引サービス対象サービス．割引サービス対象サービス適用開始年月日 <= 運用日
				super.opeDate,		// 割引サービス対象サービス．割引サービス対象サービス適用終了年月日 >= 運用日
				super.opeDate,		// 割引サービス対象サービス．予約適用年月日 <= 運用日
				campaignCd,			// 割引サービス．表示用キャンペーンコード = [キャンペーンコード]
				super.opeDate,		// 割引サービス．割引サービス適用開始年月日 <= 運用日
				super.opeDate,		// 割引サービス．割引サービス適用終了年月日 >= 運用日
				super.opeDate		// 割引サービス．予約適用年月日 <= 運用日
		};
		executeKK_M_WRISVC_TG_SVC_KK_SELECT_007(param);
		
		ArrayList<JBSbatCommonDBInterface> dbList = new ArrayList<JBSbatCommonDBInterface>();
		JBSbatCommonDBInterface dbMap = db_KK_M_WRISVC_TG_SVC.selectNext();
		while(dbMap != null)
		{
			dbList.add(dbMap);
			dbMap = db_KK_M_WRISVC_TG_SVC.selectNext();
		}
		
		return dbList;
	}
	
	/**
	 * SQLKEY(KK_SELECT_285)で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_285(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());

		// DBアクセスを実行します
		db_KK_T_SVC_KEI.selectBySqlDefine(paramList, KK_T_SVC_KEI_KK_SELECT_285);
	}
	
	/**
	 * SQLKEY(KK_SELECT_007)で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_M_WRISVC_TG_SVC_KK_SELECT_007(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());
		paramList.setValue(param[4].toString());
		paramList.setValue(param[5].toString());
		paramList.setValue(param[6].toString());

		// DBアクセスを実行します
		db_KK_M_WRISVC_TG_SVC.selectBySqlDefine(paramList, KK_M_WRISVC_TG_SVC_KK_SELECT_007);
	}

}
