/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatTUBmpHaishiSodHakTrn
*	ソースファイル名	：JBSbatTUBmpHaishiSodHakTrn.java
*	作成者				：富士通　
*	作成日				：2024年06月18日
*＜機能概要＞
*　番ポ廃止ＳＯＤ発行処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2024/06/18   富士通		新規作成
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatTUIFM012;
import eo.common.constant.JKKStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.util.JBSbatCheckUtil;
import eo.framework.util.JCCBatchEsbInterface;
import eo.framework.application.JBSbatBatchInvoker;
import eo.framework.application.JBSbatBusinessError;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatTUBmpHaishiSodHakTrn extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(サービス契約内訳)*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI_UCWK = "KK_T_SVC_KEI_UCWK";
	
	/** SQL定義キー(KK_SELECT_005)*/
	private static final String KK_T_SVC_KEI_UCWK_TU_SELECT_005 = "TU_SELECT_005";
	
	/** テーブルアクセスクラス(サービス契約内訳)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI_UCWK = null;
	
	/** サービス契約内訳＜eo光電話＞*/
	private static final String D_TBL_NAME_KK_T_SVKEIUW_EOH_TEL = "KK_T_SVKEIUW_EOH_TEL";
	
	/** SQL定義キー(KK_SELECT_001)*/
	private static final String KK_T_SVKEIUW_EOH_TEL_TU_SELECT_002 = "TU_SELECT_002";
	
	/** テーブルアクセスクラス(サービス契約内訳)*/
	private JBSbatSQLAccess db_KK_T_SVKEIUW_EOH_TEL = null;
	
	/** 電話番号*/
	private static final String D_TBL_NAME_ZM_M_TELNO = "ZM_M_TELNO";
	
	/** SQL定義キー(TU_SELECT_002)*/
	private static final String ZM_M_TELNO_TU_SELECT_002 = "TU_SELECT_002";
	
	/** テーブルアクセスクラス(電話番号)*/
	private JBSbatSQLAccess db_ZM_M_TELNO = null;
	
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** レコード読込件数*/
	private int recordCnt = 0;
	
	/** エラー回数*/
	private int errCnt = 0;
	
	/** 異動区分(ダミー値)*/
	private static final String IDO_KNUB = "09001";
	
	/** ユースケースID*/
	private static final String USECASE_ID = "TUSV0109";
	
	/** タイトル*/
	private static final String TITLE_1 = "TUSV010901SC";
	
	/** 機能コード*/
	private static final String FUNC_CODE = "func_code";
	
	/** チェック&登録*/
	private static final String CHK_ADD = "1";
	
	/**設定項目名*/
	/** 対象データリスト*/
	private static final String TRGT_DATA_LIST = "trgt_data_list";
	
	/** SOD基本情報*/
	private static final String SOD_KIHON_INFO = "sod_kihon_info";
	
	/** 異動区分*/
	private static final String IDO_DIV = "ido_div";
	
	/** サービス契約情報*/
	private static final String SVC_KEI_INFO = "svc_kei_info";
	
	/** サービス契約番号*/
	private static final String SVC_KEI_NO = "svc_kei_no";
	
	/** 電話番号*/
	private static final String TELNO = "telno";
	
	/** 電話番号*/
	private static final String LAST_UPD_DTM_BF = "last_upd_dtm_bf";
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		// DBアクセスクラスを生成します
		db_KK_T_SVC_KEI_UCWK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI_UCWK);
		db_KK_T_SVKEIUW_EOH_TEL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVKEIUW_EOH_TEL);
		db_ZM_M_TELNO = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_TELNO);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		super.logPrint.printDebugLog("execute_START：電話番号：" + inMap.getString(JBSbatTUIFM012.NTT_KEI_TEL_KAISEN_NO));
		
		// レコード件数カウントアップ
		recordCnt++;
		
		// 単項目ちぇっく
		SingleCheckTUIFM012_INF1(inMap.getMap(), null);
		
		// 削除不可チェック
		// 1-1.サービス契約内訳ステータスが「910」(解約済み)ちぇっく
		String NTT_KEI_TEL_KAISEN_NO = inMap.getString(JBSbatTUIFM012.NTT_KEI_TEL_KAISEN_NO);
		
		// サービス契約内訳ステータスを取得する。
		// サービス契約内訳テーブルのデータ取得条件を設定
		Object[] whereParamSvcKeiUcwk = new Object[2];
		// 電話番号
		whereParamSvcKeiUcwk[0] = NTT_KEI_TEL_KAISEN_NO;
		// 運用日
		whereParamSvcKeiUcwk[1] = commonItem.getOpeDate();
		
		// サービス契約内訳テーブルデータ取得
		executeKK_T_SVC_KEI_UCWK_TU_SELECT_005(whereParamSvcKeiUcwk);
		JBSbatCommonDBInterface mapSvcKeiUcwk = db_KK_T_SVC_KEI_UCWK.selectNext();
		
		// 取得したサービス契約内訳ステータスが「910」(解約済み)であること。
		if(JKKStrConst.SVC_KEI_UCWK_STAT_DSLZUMI.equals(mapSvcKeiUcwk.getString("SVC_KEI_UCWK_STAT")))
		{
			// 1-2.トーキ中ではないことのちぇっく
			// サービス契約内訳＜eo光電話＞からトーキ中データを取得する。
			// サービス契約内訳＜eo光電話＞テーブルのデータ取得条件を設定
			Object[] whereParamSvkeiuwEohTel= new Object[3];
			// 電話番号
			whereParamSvkeiuwEohTel[0] = NTT_KEI_TEL_KAISEN_NO;
			// 運用日
			whereParamSvkeiuwEohTel[1] = commonItem.getOpeDate();
			whereParamSvkeiuwEohTel[2] = commonItem.getOpeDate();
			
			// サービス契約内訳＜eo光電話＞テーブルデータ取得
			executeKK_T_SVKEIUW_EOH_TEL_TU_SELECT_002(whereParamSvkeiuwEohTel);
			JBSbatCommonDBInterface mapSvkeiuwEohTel = db_KK_T_SVKEIUW_EOH_TEL.selectNext();

			// サービス契約内訳＜eo光電話＞にデータが存在しなければ、トーキ中ではないと判定。
			if(mapSvkeiuwEohTel == null)
			{
				//電話番号テーブルから更新年月日時分秒を取得。（1-3）
				
				// 更新年月日時分秒を取得する。
				// 電話番号テーブルのデータ取得条件を設定
				Object[] whereParamTelno = new Object[1];
				
				// 電話番号
				whereParamTelno[0] = NTT_KEI_TEL_KAISEN_NO;
				
				// 電話番号テーブルデータ取得
				executeZM_M_TELNO_TU_SELECT_002(whereParamTelno);
				JBSbatCommonDBInterface mapTelno = db_ZM_M_TELNO.selectNext();
				
				// 電話番号マスタからデータを取得できなかった場合、終了して次レコードに
				if(mapTelno == null)
				{
					errCnt++;
					// 正常以外の場合 //ETUB0620CE
					super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB0010CW, 
					new String[]{"電話番号テーブルにレコードが存在しません。電話番号：" + NTT_KEI_TEL_KAISEN_NO});
					super.logPrint.printDebugLog("execute_END");
					return null;
				}
				
				// 1-1、1-2、1-3、の判定がokの時、サービス呼出を行う。
				super.logPrint.printDebugLog("サービス呼出");
				
				// ユースケースIDを格納するMAP
				HashMap<String, String> paramMap = new HashMap<String, String>();
				paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_USECASE_ID, USECASE_ID);
				
				// inputMapに設定するデータをHashMapで構築する。
				// サービスオーダ発行マップ
				HashMap<Object, Object> inputMap = new HashMap<Object, Object>();
				HashMap<Object, Object> dataMap = new HashMap<Object, Object>();
				
				// 機能コード
				dataMap.put(FUNC_CODE, CHK_ADD);
				
				// 電話番号削除用項目
				// 電話番号
				dataMap.put(TELNO, NTT_KEI_TEL_KAISEN_NO);
				// 更新年月日時分秒
				dataMap.put(LAST_UPD_DTM_BF, mapTelno.getString("UPD_DTM"));
				
				
				// SOD発行用項目
				// 対象データリスト
				ArrayList<HashMap<String, HashMap<String, String>>> trgtDataList = new ArrayList<HashMap<String, HashMap<String, String>>>();
				// SODマップ
				HashMap<String, HashMap<String, String>> sodMap = new HashMap<String, HashMap<String, String>>();
				
				// SOD基本情報
				HashMap<String, String> sodKihonInfo = new HashMap<String, String>();
				
				// 処理区分
				sodKihonInfo.put(IDO_DIV, inMap.getString(JBSbatTUIFM012.IDO_KUBUN));
				// 電話番号
				sodKihonInfo.put(TELNO, NTT_KEI_TEL_KAISEN_NO);
				
				// SOD基本情報をマップに設定
				sodMap.put(SOD_KIHON_INFO, sodKihonInfo);
				
				
				// SODサービス契約情報
				HashMap<String, String> svckeiinfo = new HashMap<String, String>();
				
				// サービス契約番号
				svckeiinfo.put(SVC_KEI_NO, mapSvcKeiUcwk.getString("SVC_KEI_NO"));
				
				// SODサービス契約情報をマップに設定
				sodMap.put(SVC_KEI_INFO, svckeiinfo);
				
				
				// SODマップを対象データリストに設定
				trgtDataList.add(sodMap);
				
				// 対象データリストをデータマップに設定
				dataMap.put(TRGT_DATA_LIST, trgtDataList);
				
				// データマップをSCのタイトルをキーとして設定する。
				inputMap.put(TITLE_1, dataMap);
				
				// サービスの処理結果が格納されるMAP
				HashMap<Object, Object> outputMap = new HashMap<Object, Object>();
				
				
				// サービス呼び出し
				JCCBatchEsbInterface.invokeService(commonItem, paramMap, inputMap, outputMap);
				
				String returnCode = JCCBatchEsbInterface.getReturnCode(outputMap);
				
				// デバッグログ出力
				super.logPrint.printDebugLog("RETURN_CODE:" + returnCode);
				
				if (!JCCBatchEsbInterface.RETURN_CODE_SUCCESS.equals(returnCode)) 
				{
					errCnt++;
					// サービスの処理結果が正常以外の場合、エラーメッセージを出力して、処理は継続
					super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ETUB0630CW, 
					new String[]{"番ポ廃止ＳＯＤ発行でエラーが発生しました (リターンコード):(レコード行):(電話番号)=" + returnCode + ":" + recordCnt + ":" + NTT_KEI_TEL_KAISEN_NO});
				} 
			}
		}		
		super.logPrint.printDebugLog("execute_END");
		return null;
		
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		
	// DBアクセスクラスをクローズします
	db_KK_T_SVC_KEI_UCWK.close();
	db_KK_T_SVKEIUW_EOH_TEL.close();
	db_ZM_M_TELNO.close();
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	
	// サービス側で一回以上エラーが発生していた場合、警告終了。
	if(errCnt > 0)
	{
		JBSbatBatchInvoker.setErrFlg(true);
		// 警告終了 「【情報】エラー対象レコード＝（%1%）」
		super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ETUB0640CI, new String[] { Integer.toString(errCnt) });
	}
	}
	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * SQLKEY(TU_SELECT_005)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	電話番号
	 *		 	運用日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @return JBSbatCommonDBInterface 検索の結果。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_SVC_KEI_UCWK_TU_SELECT_005(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_T_SVC_KEI_UCWK.selectBySqlDefine(paramList, KK_T_SVC_KEI_UCWK_TU_SELECT_005);
	}
	
	/**
	 *入力情報（番ポ廃止(ＯＰＴ受付)ＳＯＤ対象ファイル）の単項目チェックを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.単項目チェックを行います。<br>
	 * 
	 * 2.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		rsMap:(項目、値)を(key、value)として、データをrsMapに入れます
	 *		itemvalueMap:埋め込み文字の値をitemvalueMapに入れます。キーの値は、以下に説明します。
	 * </pre>
	 * <p>
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap。
	 * @param itemvalueMap エラーメッセージに関する項目値を格納されたHashMap。
	 * @throws Exception
	 */
	private void SingleCheckTUIFM012_INF1(HashMap<?, ?> rsMap, HashMap<?, ?> itemvalueMap) throws Exception 
	{
		// 単項目チェックを行います
		String strValue = null;
		
		// 1.異動区分
		strValue = (String)rsMap.get("IDO_KUBUN");
		// 必須チェック
		 if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("ETUB0360TW", new String[]{
					String.valueOf(super.commonItem.getInputCount()),
					"異動区分"});
			throw new JBSbatBusinessError();
			
		}
		// 固定値チェック(09001)以外は不正
		 if(!IDO_KNUB.equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("ETUB0520AE", new String[]{
					String.valueOf(super.commonItem.getInputCount()),
					"異動区分"});
			throw new JBSbatBusinessError();
		}
		 
		// 2.電話番号
		 strValue = (String)rsMap.get("NTT_KEI_TEL_KAISEN_NO");
		// 必須チェック
		 if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("ETUB0360TW", new String[]{
					String.valueOf(super.commonItem.getInputCount()),
					"電話番号"});
			throw new JBSbatBusinessError();
		}
		 
		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"tel2"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("ETUB0420TW", new String[]{
					String.valueOf(super.commonItem.getInputCount()),
					"電話番号"});
			throw new JBSbatBusinessError();
		}
	}

	/**
	 * SQLKEY(TU_SELECT_002)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	電話番号
	 *		 	運用日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @return JBSbatCommonDBInterface 検索の結果。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_SVKEIUW_EOH_TEL_TU_SELECT_002(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_SVKEIUW_EOH_TEL.selectBySqlDefine(paramList, KK_T_SVKEIUW_EOH_TEL_TU_SELECT_002);
	}
	
	/**
	 * SQLKEY(TU_SELECT_002)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	電話番号
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @return JBSbatCommonDBInterface 検索の結果。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_M_TELNO_TU_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_ZM_M_TELNO.selectBySqlDefine(paramList, ZM_M_TELNO_TU_SELECT_002);
	}
	
}
