/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatZMAgingDel
*	ソースファイル名	：JBSbatZMAgingDel.java
*	作成者				：富士通　
*	作成日				：2011年08月23日
*＜機能概要＞
*　エイジング期間経過データ削除部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v2.00.00	2011/08/23	FJ）日野	新規作成
*   v4.00.00	2012/11/14	FJ) 伊藤	【TAI-2012-0000140】品質強化対策
*   v72.00.00	2024/07/26	GDC)J.Tagongtong	ANK-4494-00-00 【eo定期】 双方向番ポ対応
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JZMBatCommon;
import eo.business.common.JZMBatConst;
import eo.business.util.table.JBSbatZM_T_AGING;
import eo.common.constant.JCKStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessError;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.util.JCCBatchEsbInterface;

/**
* エイジング期間経過データ削除クラスです。 <p>
*<BR>
* @author 富士通
*/
public class JBSbatZMAgingDel 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_ZM_T_AGING = "ZM_T_AGING";
	
	// ANK-4494-00-00 ADD START	
	/** テーブル(サービス契約内訳)*/
	private static final String D_TBL_NAME_KK_T_SVC_KEI_UCWK = "KK_T_SVC_KEI_UCWK";
	// ANK-4494-00-00 ADD END	

	/** SQL定義キー(ZM_SELECT_002)*/
	private static final String ZM_M_WORK_PARAM_KNRI_ZM_SELECT_002 = "ZM_SELECT_002";

	/** SQL定義キー(ZM_DELETE_001)*/
	private static final String ZM_T_AGING_ZM_DELETE_001 = "ZM_DELETE_001";
	
	// ANK-4494-00-00 ADD START	
	/** SQL定義キー(ZM_DELETE_002)*/
	private static final String ZM_T_AGING_ZM_DELETE_002 = "ZM_DELETE_002";
		
	/** SQL定義キー(ZM_SELECT_001)*/
	private static final String ZM_T_AGING_ZM_SELECT_001 = "ZM_SELECT_001";
	
	/** SQL定義キー(ZM_SELECT_001)*/
	private static final String KK_T_SVC_KEI_UCWK_ZM_SELECT_001 = "ZM_SELECT_001";
	// ANK-4494-00-00 ADD END	

	/** テーブルアクセスクラス(業務パラメータ管理)*/
	private JBSbatSQLAccess db_ZM_M_WORK_PARAM_KNRI = null;

	/** テーブルアクセスクラス(エイジング)*/
	private JBSbatSQLAccess db_ZM_T_AGING = null;
	
	// ANK-4494-00-00 ADD START	
	/** テーブルアクセスクラス(サービス契約内訳)*/
	private JBSbatSQLAccess db_KK_T_SVC_KEI_UCWK = null;
	// ANK-4494-00-00 ADD END
	
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/* ++++++++++ v1.0.0 追加開始 ++++++++++ */
	
	/** 業務パラメータID*/
	private static final String WORK_PARAM_ID = "WORK_PARAM_ID";
	
	/** 業務パラメータ設定値*/
	private static final String WORK_PARAM_SETTE_VALUE = "WORK_PARAM_SETTE_VALUE";
	
	/** エイジング種別コード*/
	private static final String AGING_SBT_CD = "AGING_SBT_CD";
	
	/** エイジング期間*/
	private static final String AGING_PRD = "AGING_PRD";
	
	// ANK-4494-00-00 ADD START	
	/** 電話番号状態判定マップKEY：電話番号 */
	public static final String TELNO = "key_telno";
	
	/** 電話番号状態判定リスト */
	public static final String TELNOSTATJUDGECC_LIST = "TELNOSTATJUDGECC_LIST";
	
	/** CCメソッドパラメータ */
	public static final String TELNOSTATJUDGECC = "TELNOSTATJUDGECC";
	
	/** ポートアウト(番ポ廃止含む)状態有無 */
	public static final String PORTOUTSTATUM = "portOutStatUm";
	// ANK-4494-00-00 ADD END	
	
	/** 数値の正規表現*/
	private static final String NUMBER_REG = "[0-9]+";
	
	/** システムエラーDB_置換文字列*/
	private static final String ERR_DB_WORKPARAM = "業務パラメータ管理";
	
	/** システムエラー項目_置換文字列*/
	private static final String ERR_ITEM_PARAM = "パラメータID下3桁および値";

	/** 時分秒ALL9 */
	private static final String HMS_ALL9 = "999999999";

	/* ++++++++++ v1.0.0 追加終了 ++++++++++ */
	
	/**
	 * 初期処理
	 * @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_ZM_T_AGING = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_T_AGING);
	// ANK-4494-00-00 ADD START
		db_KK_T_SVC_KEI_UCWK = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI_UCWK);
	// ANK-4494-00-00 ADD END
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		/* ++++++++++ v1.0.0 追加開始 ++++++++++ */
		
		// バッチ運用日付
		String opeDate = commonItem.getOpeDate();
		
		// 業務パラメータ管理_エイジング期間取得処理
		executeZM_M_WORK_PARAM_KNRI_ZM_SELECT_002(new Object[]{opeDate, opeDate});
		
		// SELECTされたデータのList取得
		List<HashMap<Object, String>> selectedDataList = getSelectedDataList(db_ZM_M_WORK_PARAM_KNRI);
		
		// Listデータがあるか判定
		if(selectedDataList != null)
		{
			
			// エイジング_エイジング削除基準日以前のデータ物理削除処理
			deleteAgingData(selectedDataList);
		}
		else
		{
			
			// システムエラー
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EZMB0080CW, new String[]{ERR_DB_WORKPARAM});
		}
		
		/* ++++++++++ v1.0.0 追加終了 ++++++++++ */
		
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_ZM_M_WORK_PARAM_KNRI.close();
		db_ZM_T_AGING.close();
	// ANK-4494-00-00 ADD START	
		db_KK_T_SVC_KEI_UCWK.close();
	// ANK-4494-00-00 ADD END	
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(ZM_SELECT_002)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	バッチ運用日付
	 *		 	バッチ運用日付
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_M_WORK_PARAM_KNRI_ZM_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_ZM_M_WORK_PARAM_KNRI.selectBySqlDefine(paramList, ZM_M_WORK_PARAM_KNRI_ZM_SELECT_002);
	}

	/**
	 * SQLKEY(ZM_DELETE_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	エイジング種別コード
	 *		 	エイジング削除基準日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_T_AGING_ZM_DELETE_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_ZM_T_AGING.executeBySqlDefine(paramList, ZM_T_AGING_ZM_DELETE_001);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	// ANK-4494-00-00 ADD START	
	/**
	 * SQLKEY(ZM_DELETE_002)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	エイジング種別コード
	 *			エイジング対象値
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_T_AGING_ZM_DELETE_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_ZM_T_AGING.executeBySqlDefine(paramList, ZM_T_AGING_ZM_DELETE_002);
	}
	
	/**
	 * SQLKEY(ZM_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	エイジング種別コード
	 *			エイジング削除基準日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_T_AGING_ZM_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_ZM_T_AGING.selectBySqlDefine(paramList, ZM_T_AGING_ZM_SELECT_001);
	}

	/**
	 * SQLKEY(ZM_SELECT_001)で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_UCWK_ZM_SELECT_001(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_ZM_SELECT_001);
	}
	// ANK-4494-00-00 ADD END
	
	/* ++++++++++ v1.0.0 追加開始 ++++++++++ */
	
	/**
	 * SELECTされたデータのListを取得します。
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.JBSbatSQLAccessオブジェクトのselectNext()で1行分のデータを取得します。<br>
	 *
	 * 2.データが存在する場合、戻り値のListに追加します。<br>
	 * 
	 * ※ 1,2を繰り返して結果を返します。データが無ければnullを返します。<br>
	 * </pre>
	 * <p>
	 * @param tableObject JBSbatSQLAccessオブジェクト
	 * @return 取得結果データのList<HashMap<Object, String>>
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private List<HashMap<Object, String>> getSelectedDataList(JBSbatSQLAccess tableObject)  throws Exception
	{
		
		// 戻り値のList
		List<HashMap<Object, String>> selectedDataList = new ArrayList<HashMap<Object, String>>();
		
		// 引数チェック
		if (tableObject != null)
		{
			
			// データ1行の取得
			JBSbatCommonDBInterface selectedData = tableObject.selectNext();
			while (selectedData != null)
			{
				
				HashMap<Object, String> dateMap = new HashMap<Object, String>();
				
				String paramId = selectedData.getString(WORK_PARAM_ID);
				
				// 業務パラメータの下3桁を取得
				String agingSbtCd = paramId.substring(paramId.length() - 3, paramId.length());
				String agingPrd = selectedData.getString(WORK_PARAM_SETTE_VALUE); 
				
				// エイジング期間がブランクまたはnullの場合、"0"を設定
				if(JZMBatConst.BLANK.equals(agingPrd) || agingPrd == null)
				{
					agingPrd = JZMBatConst.ZERO;
				}
				
				// 取得データ（エイジング期間、エイジング種別）が数値か判定
				if(agingSbtCd.matches(NUMBER_REG) && agingPrd.matches(NUMBER_REG))
				{
					
					// HashMapに設定
					dateMap.put(AGING_SBT_CD, agingSbtCd);
					dateMap.put(AGING_PRD, agingPrd);
				}
				else
				{
					
					// システムエラー
					throw new JBSbatBusinessException(JPCBatchMessageConstant.EZMB0070CW, new String[]{ERR_ITEM_PARAM, paramId, agingPrd});
				}
				
				
				selectedDataList.add(dateMap);
				
				// データ1行の取得
				selectedData = tableObject.selectNext();
			}
		}
		
		return selectedDataList.size() == 0 ? null : selectedDataList;
	}
	
	/**
	 * 取得したエイジング期間からエイジング削除基準日を算出し、
	 * 使用終了年月日時分秒からエイジング削除基準日以前のデータ物理削除を行います。
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.Listから1件分のデータを取得します。<br>
	 * 
	 * 2.エイジング削除基準日を算出します。<br>
	 *
	 * 3.DBアクセスを実行します。<br>
	 * 
	 * ※ 1〜3を繰り返します。<br>
	 * </pre>
	 * <p>
	 * @param selectedDataList List<HashMap<Object, String>>オブジェクト
	 * @return boolean 業務エラー判定（エラー有:true、エラー無:false）
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void deleteAgingData(List<HashMap<Object, String>> selectedDataList)  throws Exception
	{
		
		HashMap<Object, String> agingPrdData =  new HashMap<Object, String>();
		
		// 引数チェック
		if (selectedDataList != null)
		{
			
			for(int i = 0; i < selectedDataList.size(); i++)
			{
				
				// データ1件取得
				agingPrdData = selectedDataList.get(i);
				
				String agingSbtCd = agingPrdData.get(AGING_SBT_CD);
				String agingPrd = agingPrdData.get(AGING_PRD); 
				
				// バッチ運用日付からエイジング期間日を引いた日付の算出（エイジング削除基準日）
				String delStdardYmd = JZMBatCommon.addDay(commonItem.getOpeDate(), (-1 * Integer.parseInt(agingPrd))) + HMS_ALL9;
				
			// ANK-4494-00-00 ADD START
				if(agingSbtCd.equals(JCKStrConst.CD00412_TELNO)) {
					// エージング電話値の取得
					executeZM_T_AGING_ZM_SELECT_001(new Object[]{JCKStrConst.CD00412_TELNO, delStdardYmd});
					
					JBSbatCommonDBInterface agingTelNoMap = new JBSbatCommonDBInterface();
					
					// データ1行の取得
					while((agingTelNoMap = db_ZM_T_AGING.selectNext()) != null)
					{
						String agingTelNo = agingTelNoMap.getString(JBSbatZM_T_AGING.AGING_TG_VALUE); 
						
						// 解約した電話番号の確認
						executeKK_T_SVC_KEI_UCWK_ZM_SELECT_001(new Object[]{agingTelNo, commonItem.getOpeDate()});
						
						JBSbatCommonDBInterface svcKeiUcwkMap = db_KK_T_SVC_KEI_UCWK.selectNext();
						
						StringBuilder sb = new StringBuilder();
						
						if (svcKeiUcwkMap != null)
						{
							// マイナーアラームを出力する。
							super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EZMB0310KW, new String[] {agingTelNo});
							continue;
						}
						
						HashMap<Object, Object>  paramMap = new HashMap<Object, Object>();
						paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_USECASE_ID, "ZMSV0135");
						paramMap.put(JCCBatchEsbInterface.TELEGRAM_INFO_OPERATION_ID, "ZMSV0135OP");
						
						// サービスに渡す業務データを格納するMAP
						HashMap<String, Object> inputMap = new HashMap<String, Object>();
						
						// inputMapに設定するデータをHashMapで構築する。
						HashMap<String, Object>  ZMSV0135DataMap = new HashMap<String, Object>();
						
						// 電話番号
						ZMSV0135DataMap.put(TELNO, agingTelNo);

						inputMap.put(TELNOSTATJUDGECC, ZMSV0135DataMap);
						
						// サービスの処理結果が格納されるMAP
						HashMap<Object, Object> outputMap = new HashMap<Object, Object>();
						
						// サービスの実行
						try
						{
							JCCBatchEsbInterface.invokeService(super.commonItem, paramMap, inputMap, outputMap);
						}
						catch (Exception ex)
						{
							super.logPrint.printBusinessErrorLog((String) outputMap.get(JCCBatchEsbInterface.RETURN_CODE));
							super.commonItem.setErrFlg(true);
						}
						
						HashMap<Object, Object> resultMap = (HashMap<Object, Object>)outputMap.get(TELNOSTATJUDGECC);
						ArrayList resultData = (ArrayList)resultMap.get(TELNOSTATJUDGECC_LIST);
						
						boolean isPortOut = false;
						String returnCode = (String) outputMap.get(JCCBatchEsbInterface.RETURN_CODE);
						
						if (!JCCBatchEsbInterface.RETURN_CODE_SUCCESS.equals(returnCode)) 
						{
							throw new JBSbatBusinessError();
						} 
						
						HashMap<String, String> dataMap = (HashMap<String, String>) resultData.get(0);
						
						String portOutStat = dataMap.get(PORTOUTSTATUM);
						
						// ポートアウト中でないかをチェックする。
						if(portOutStat != null && portOutStat.equals("1")) {
							isPortOut = true;
							
							// マイナーアラームを出力する。
							super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EZMB0320KW, new String[] {agingTelNo});
						}
						
						if(!isPortOut &&  svcKeiUcwkMap == null) {
							sb.append("/エイジング種別:")
							.append(agingSbtCd)
							.append("/電話番号:")
							.append(agingTelNo)
							.append("/エイジング期間:")
							.append(agingPrd)
							.append("/エイジング削除基準日:")
							.append(delStdardYmd);
			
							super.logPrint.printDebugLog(sb.toString());
					
							// 特定の経過期間データの削除
							executeZM_T_AGING_ZM_DELETE_002(new Object[]{agingSbtCd, agingTelNo});
						}		
					}
					
					continue;	
				}		
			// ANK-4494-00-00 ADD END
				
				StringBuilder sb = new StringBuilder();
				
				sb.append("/エイジング種別:")
						.append(agingSbtCd)
						.append("/エイジング期間:")
						.append(agingPrd)
						.append("/エイジング削除基準日:")
						.append(delStdardYmd);
				
				super.logPrint.printDebugLog(sb.toString());
				
				// エイジング_物理削除
				executeZM_T_AGING_ZM_DELETE_001(new Object[]{agingSbtCd, delStdardYmd});
				
			}
		}
	}
	
	/* ++++++++++ v1.0.0 追加終了 ++++++++++ */
}
