/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCNContDoiTgDataCst
*	ソースファイル名	：JBSbatCNContDoiTgDataCst.java
*	作成者				：富士通　
*	作成日				：2024年11月19日
*＜機能概要＞
*　コンテンツ同意対象データ抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v73.00.00	2024/11/19	FJ)丸田	【ANK-4570-00-00】コンテンツ新規同時申込み時契約仕様見直し対応
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;

import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatCNIFM021001;
import eo.business.util.file.JBSbatCNIFM021002;
import eo.business.util.table.JBSbatKK_T_CONT_MKM_INF;
import eo.business.util.table.JBSbatKK_T_MSKM_DTL;
import eo.business.util.table.JBSbatZM_M_SYS_PARAM_KNRI;
import eo.business.util.table.JBSbatZM_M_WORK_PARAM_KNRI;
import eo.common.constant.JCNStrConst;
import eo.common.util.JCNStringUtil;
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>
*申込明細・コンテンツ申込情報スキーマから取得したデータを加えて出力する。<p>
*<BR>
* @author 富士通
*/
public class JBSbatCNContDoiTgDataCst extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(業務パラメータ管理)*/
	private static final String D_TBL_NAME_ZM_M_WORK_PARAM_KNRI = "ZM_M_WORK_PARAM_KNRI";

	/** テーブル(申込明細)*/
	private static final String D_TBL_NAME_KK_T_MSKM_DTL = "KK_T_MSKM_DTL";

	/** テーブル(コンテンツ申込情報)*/
	private static final String D_TBL_NAME_KK_T_CONT_MKM_INF = "KK_T_CONT_MKM_INF";

	/** テーブル(システムパラメータ管理)*/
	private static final String D_TBL_NAME_ZM_M_SYS_PARAM_KNRI= "ZM_M_SYS_PARAM_KNRI";

	/** テーブル(NTT卸契約)*/
	private static final String D_TBL_NAME_KK_T_NTTORS_KEI= "KK_T_NTTORS_KEI";
	
	/** SQL定義キー(CN_SELECT_002)*/
	private static final String ZM_M_WORK_PARAM_KNRI_CN_SELECT_002 = "CN_SELECT_002";

	/** SQL定義キー(CN_SELECT_001)*/
	private static final String KK_T_MSKM_DTL_CN_SELECT_001 = "CN_SELECT_001";

	/** SQL定義キー(CN_SELECT_002)*/
	private static final String KK_T_CONT_MKM_INF_CN_SELECT_002 = "CN_SELECT_002";
	
	/** SQL定義キー(CN_SELECT_002)*/
	private static final String ZM_M_SYS_PARAM_KNRI_CN_SELECT_002 = "CN_SELECT_002";
	
	/** SQL定義キー(CN_SELECT_001)*/
	private static final String KK_T_NTTORS_KEI_CN_SELECT_001 = "CN_SELECT_001";

	/** テーブルアクセスクラス(業務パラメータ管理)*/
	private JBSbatSQLAccess db_ZM_M_WORK_PARAM_KNRI = null;

	/** テーブルアクセスクラス(申込明細)*/
	private JBSbatSQLAccess db_KK_T_MSKM_DTL = null;

	/** テーブルアクセスクラス(コンテンツ申込情報)*/
	private JBSbatSQLAccess db_KK_T_CONT_MKM_INF = null;

	/** テーブルアクセスクラス(システムパラメータ管理)*/
	private JBSbatSQLAccess db_ZM_M_SYS_PARAM_KNRI = null;
	
	/** テーブルアクセスクラス(NTT卸契約)*/
	private JBSbatSQLAccess db_KK_T_NTTORS_KEI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	/** 業務パラメータ管理ＩＤ：　シンプルうプラン　前方一致パラメータ*/
	private static final String KK_HTGAI_PCRS_SPP = "KK_HTGAI_PCRS_SPP_";
	
	/** 業務パラメータ管理ＩＤ：　TypeN　前方一致パラメータ*/
	private static final String KK_HTGAI_PCRS_TPN = "KK_HTGAI_PCRS_TPN_";
	
	/** システムパラメータ分類コード:開通前コンテンツ開始制度切替日 */
	private static final String SYSPARA_OPBF_CONT_SWCH_DAY = "OPBF_CONT_SWCH_DAY";
	
	/** システムパラメータID: EO */
	private static final String SYSPARA_ID_EO = "EO";
	
	/** 除外チェック対象料金コースコードリスト */
	private ArrayList<String> checkPcrsCdList = null;
	
	/** 申込年月日：開通前コンテンツ開始制度切替日 */
	private String opbfContSwchDay = "";
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_ZM_M_WORK_PARAM_KNRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_WORK_PARAM_KNRI);
		db_KK_T_MSKM_DTL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_MSKM_DTL);
		db_KK_T_CONT_MKM_INF = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_CONT_MKM_INF);
		db_ZM_M_SYS_PARAM_KNRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_SYS_PARAM_KNRI);
		db_KK_T_NTTORS_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_NTTORS_KEI);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		// 除外料金コースコードリスト（TypeN, シンプルプラン）
		checkPcrsCdList = getCheckingPrcsCd();
		// 開通前コンテンツ開始制度切替日
		opbfContSwchDay = getOpbfContSwchDay();
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// 出力共通電文を生成する。
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		
		if(inMap == null)
		{
			// 入力情報終了判定
			return outputBean;
		}
		
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// 運用日付
		String opeDate = super.opeDate;
		
		// 除外チェックする料金コースコードリストを取得する。
		String inPcrsCd = inMap.getString(JBSbatCNIFM021001.PCRS_CD);
		
		// 入力電文.料金コースコードが除外チェック対象料金コースコードリストに入っているかチェックする。
		if (checkPcrsCdList.contains(inPcrsCd))
		{
			//  入力電文.料金コースコードがホームタイプ以外のシンプルプラン・ＴｙｐｅＮの場合、処理をスキップする。
			return outputBean;
		}
		
		// 入力電文.料金コースコードが"16"(メールアドレス)の場合、NTT卸契約に入力電文.サービス契約番号の存在を確認する。
		if(JCNStrConst.PRGP_CD_SVC_CD_MLAD.equals(inMap.getString(JBSbatCNIFM021001.PRC_GRP_CD)))
		{
			String[] nttorsParam = {inMap.getString(JBSbatCNIFM021001.SVC_KEI_NO)};
			executeKK_T_NTTORS_KEI_CN_SELECT_001(nttorsParam);
			if(db_KK_T_NTTORS_KEI.selectNext() != null)
			{
				//  入力電文.料金コースコードがＴｙｐｅＮと見なして、処理をスキップする。
				return outputBean;
			}
		}
		
		// 申込明細データの抽出
		String[] mskmDtlWorkParams = {inMap.getString(JBSbatCNIFM021001.SVC_KEI_NO), opeDate, opbfContSwchDay};
		executeKK_T_MSKM_DTL_CN_SELECT_001(mskmDtlWorkParams);
		
		// 申込明細結果マップ
		JBSbatCommonDBInterface mskmDtlResult = db_KK_T_MSKM_DTL.selectNext();
		
		// コンテンツ申込番号文字列の初期化
		String strContMskmNo = JCNStrConst.S_BLANK;
		
		if(null == mskmDtlResult
				|| JCNStringUtil.isNullBlank(mskmDtlResult.getString(JBSbatKK_T_MSKM_DTL.MSKM_DTL_NO)))
		{
			// 申込明細データ・申込詳細番号の取得ができなかった場合、処理をスキップする。
			return outputBean;
		}
		else
		{
			/** コンテンツ申込番号を取得する。 */
			String[] contWorkParams = {mskmDtlResult.getString(JBSbatKK_T_MSKM_DTL.MSKM_NO)};
			// 申込明細.申込番号をキーにコンテンツ申込情報を検索する。
			executeKK_T_CONT_MKM_INF_CN_SELECT_002(contWorkParams);
			JBSbatCommonDBInterface contMkmInfResult = db_KK_T_CONT_MKM_INF.selectNext();
			
			if (contMkmInfResult == null 
					|| JCNStringUtil.isNullBlank(contMkmInfResult.getString(JBSbatKK_T_CONT_MKM_INF.CONT_MSKM_NO)))
			{
				strContMskmNo = JCNStrConst.DUMMY_CONT_MSKM_NO;
			}
			else if (contMkmInfResult != null)
			{
				// コンテンツ申込情報結果がある場合、コンテンツ申込番号を取得する。
				strContMskmNo = contMkmInfResult.getString(JBSbatKK_T_CONT_MKM_INF.CONT_MSKM_NO);
			}
		}
		
		// 出力項目設定
		outMap.setString(JBSbatCNIFM021002.SVC_KEI_NO, inMap.getString(JBSbatCNIFM021001.SVC_KEI_NO));//サービス契約番号
		outMap.setString(JBSbatCNIFM021002.SYSID, inMap.getString(JBSbatCNIFM021001.SYSID));//ＳＹＳＩＤ
		outMap.setString(JBSbatCNIFM021002.SVC_CD, inMap.getString(JBSbatCNIFM021001.SVC_CD));//サービスコード
		outMap.setString(JBSbatCNIFM021002.PCRS_CD, inMap.getString(JBSbatCNIFM021001.PCRS_CD));//料金コースコード
		outMap.setString(JBSbatCNIFM021002.MSKM_DTL_NO, mskmDtlResult.getString(JBSbatKK_T_MSKM_DTL.MSKM_DTL_NO));//申込明細番号
		outMap.setString(JBSbatCNIFM021002.MSKM_YMD, mskmDtlResult.getString(JBSbatKK_T_MSKM_DTL.MSKM_YMD));//申込年月日
		outMap.setString(JBSbatCNIFM021002.MKM_UK_SBT_CD, mskmDtlResult.getString(JBSbatKK_T_MSKM_DTL.MKM_UK_SBT_CD));//申込受付種別コード
		outMap.setString(JBSbatCNIFM021002.MEMBER_SBT_CD, inMap.getString(JBSbatCNIFM021001.MEMBER_SBT_CD));//会員種別コード
		outMap.setString(JBSbatCNIFM021002.CONT_MSKM_NO, strContMskmNo);//コンテンツ申込番号
		
		outMap.setOutFlg(true);
		
		// 出力共通電文に入出力インターフェースを設定する。
		outputBean.addOutMapList(outMap);
		
		return outputBean;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		db_ZM_M_WORK_PARAM_KNRI.close();
		db_KK_T_MSKM_DTL.close();
		db_KK_T_CONT_MKM_INF.close();
		db_ZM_M_SYS_PARAM_KNRI.close();
		db_KK_T_NTTORS_KEI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * 業務パラメータ管理SQLKEY(CN_SELECT_002)でDBアクセスを行い、料金コースコードリストを取得する。。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	業務パラメータ管理ＩＤ
	 *		 	業務パラメータ適用開始年月日
	 *		 	業務パラメータ適用終了年月日
	 * </pre>
	 * <p>
	 * @param opeDate 運用日付
	 * @return 料金コースコードリスト
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private ArrayList<String> getCheckingPrcsCd() throws Exception
	{
		ArrayList<String> resList = new ArrayList<String>();
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList1 = new JBSbatCommonDBInterface();
		paramList1.setValue(KK_HTGAI_PCRS_TPN); //TypeN
		paramList1.setValue(super.opeDate);
		paramList1.setValue(super.opeDate);
		// DBアクセスを実行します
		db_ZM_M_WORK_PARAM_KNRI.selectBySqlDefine(paramList1, ZM_M_WORK_PARAM_KNRI_CN_SELECT_002);
		
		JBSbatCommonDBInterface rrksMap = new JBSbatCommonDBInterface();
		
		while((rrksMap=db_ZM_M_WORK_PARAM_KNRI.selectNext()) != null)
		{
			// 入力電文.料金コースコードがTypeNをリストに格納する。
			resList.add(rrksMap.getString(JBSbatZM_M_WORK_PARAM_KNRI.WORK_PARAM_SETTE_VALUE));
		}
		
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList2 = new JBSbatCommonDBInterface();
		paramList2.setValue(KK_HTGAI_PCRS_SPP); // シンプルプラン
		paramList2.setValue(opeDate);
		paramList2.setValue(opeDate);
		// DBアクセスを実行します
		db_ZM_M_WORK_PARAM_KNRI.selectBySqlDefine(paramList2, ZM_M_WORK_PARAM_KNRI_CN_SELECT_002);
		
		while((rrksMap=db_ZM_M_WORK_PARAM_KNRI.selectNext()) != null)
		{
			// 入力電文.料金コースコードがシンプルプランをリストに格納する。
			resList.add(rrksMap.getString(JBSbatZM_M_WORK_PARAM_KNRI.WORK_PARAM_SETTE_VALUE));
		}
		
		return resList;
	}
	/** システムパラメータ管理から開通前コンテンツ開始制度切替日を取得する。
	 * @return システムパラメータ設定値1
	 * @throws Exception
	 */
	private String getOpbfContSwchDay() throws Exception
	{
		String[] param = {SYSPARA_OPBF_CONT_SWCH_DAY ,SYSPARA_ID_EO
							,super.opeDate, super.opeDate};
		executeZM_M_SYS_PARAM_KNRI_CN_SELECT_002(param);
		
		JBSbatCommonDBInterface resultMap = new JBSbatCommonDBInterface();
		resultMap=db_ZM_M_SYS_PARAM_KNRI.selectNext();
		return resultMap.getString(JBSbatZM_M_SYS_PARAM_KNRI.SYS_PARAM_SETTE_VALUE_1);
	}
	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * 申込明細 SQLKEY(CN_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		 	サービス契約番号
	 *		 	予約適用年月日
	 *			申込年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_MSKM_DTL_CN_SELECT_001(String[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0]);
		paramList.setValue(param[1]);
		paramList.setValue(param[2]);

		// DBアクセスを実行します
		db_KK_T_MSKM_DTL.selectBySqlDefine(paramList, KK_T_MSKM_DTL_CN_SELECT_001);
	}
	
	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * コンテンツ申込情報 SQLKEY(CN_SELECT_002)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		 	申込番号
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_CONT_MKM_INF_CN_SELECT_002(String[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0]);
		// DBアクセスを実行します
		db_KK_T_CONT_MKM_INF.selectBySqlDefine(paramList, KK_T_CONT_MKM_INF_CN_SELECT_002);
	}
	
	
	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * システムパラメータ管理 SQLKEY(CN_SELECT_002)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		 	システムパラメータ分類コード
	 *			システムパラメータID
	 *			運用日付
	 *		 	運用日付
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_M_SYS_PARAM_KNRI_CN_SELECT_002(String[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0]);
		paramList.setValue(param[1]);
		paramList.setValue(param[2]);
		paramList.setValue(param[3]);
		// DBアクセスを実行します
		db_ZM_M_SYS_PARAM_KNRI.selectBySqlDefine(paramList, ZM_M_SYS_PARAM_KNRI_CN_SELECT_002);
	}
	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * NTT卸契約 SQLKEY(CN_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		 	サービス契約番号
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_NTTORS_KEI_CN_SELECT_001(String[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0]);
		// DBアクセスを実行します
		db_KK_T_NTTORS_KEI.selectBySqlDefine(paramList, KK_T_NTTORS_KEI_CN_SELECT_001);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
}
