/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCKDslAfSkssnsInfoUpd
*	ソースファイル名	：JBSbatCKDslAfSkssnsInfoUpd.java
*	作成者				：FJ)柳
*	作成日				：2017年06月12日
*＜機能概要＞
*　解約後請求書参照情報更新部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v33.00.00	2017/06/12	FJ)柳		【ANK-3179-00-00】解約済み契約の請求明細表示
*	v33.01.00	2017/06/29	FJ)柳		【IT1-2017-0000090】指示書登録不正対応
*	v38.00.00	2018/07/25	FJ)舘山		【OM-2018-0000641】退会後の請求書参照期間中のeoIDエイジング期間切れ
*   v38.00.01	2018/09/13	FJ)舘山		【OM-2018-0000641】eoIDが未設定の場合の考慮漏れ対応
*   v66.00.00	2023/06/09	FJ)西川		【OM#63379】消去可否チェックのエイジング未取得によるワーニング
*********************************************************************/
package eo.business.service;


import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatCKIFM010;
import eo.business.util.table.JBSbatCK_T_CUST;
import eo.business.util.table.JBSbatZM_T_AGING;
import eo.common.constant.JCKStrConst;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatAplConst;
import eo.framework.util.JBSbatDateUtil;

/**
* 解約後請求書参照情報抽出ファイルを元に、お客様スキーマと指示書スキーマに更新を行う。
*<BR>
* @author FJ)柳
*/
public class JBSbatCKDslAfSkssnsInfoUpd extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** テーブル(お客様) */
	private static final String TBL_CK_T_CUST = "CK_T_CUST";
	/** テーブル(システムパラメータ管理) */
	private static final String TBL_ZM_M_SYS_PARAM_KNRI = "ZM_M_SYS_PARAM_KNRI";
	/** テーブル(指示書) */
	private static final String TBL_CK_T_SJISHO = "CK_T_SJISHO";
	
	/** SQL定義キー(お客様　SELECT) */
	private static final String CK_T_CUST_CK_SELECT_016 = "CK_SELECT_016";
	/** SQL定義キー(お客様　UPDATE) */
	private static final String CK_T_CUST_CK_UPDATE_001 = "CK_UPDATE_001";
	/** SQL定義キー(お客様　UPDATE)*/
	private static final String CK_T_CUST_KK_UPDATE_006 = "KK_UPDATE_006";
	/** SQL定義キー(システムパラメータ管理)*/
	private static final String ZM_M_SYS_PARAM_KNRI_AC_SELECT_001 = "AC_SELECT_001";
	/** SQL定義キー(指示書) */
	private static final String CK_T_SJISHO_CK_INSERT_001 = "CK_INSERT_001";
	
	/** 入力ファイル定義 */
	private static final String PARAM_IND = "IND";
	
	/** 解約後請求書参照情報抽出ファイル */
	JBSbatInputFileUtil dslAfSkssnsInfoExtrctnFile = null;
	/** 解約後請求書参照情報抽出ファイル定義 */
	JBSbatDefFileUtil dslAfSkssnsInfoExtrctnFileDef = null;
	
	/** DBアクセスクラス(お客様) */
	private JBSbatSQLAccess db_access_cust = null;
	/** DBアクセスクラス(システムパラメータ管理) */
	private JBSbatSQLAccess db_access_sys_param_knri = null;
	/** DBアクセスクラス(指示書) */
	private JBSbatSQLAccess db_access_sjisho = null;

// ▼▼▼ OM-2018-0000641 ADD START
	/** テーブル(エイジング) */
	private static final String TBL_ZM_T_AGING = "ZM_T_AGING";

	/** SQL定義キー(エイジング　SELECT_001) */
	private static final String ZM_T_AGING_CK_SELECT_002 = "CK_SELECT_002";

	/** DBアクセスクラス(エイジング) */
	private JBSbatSQLAccess db_access_aging = null;
	
	/** エイジングステータス（エイジング中）*/
	private static final String ZM_T_AGING_STAT_300 = "300";

	/** 終了時間（23:59:59) */
	private static final String DEFALT_TM = "235959000";
// △△△ OM-2018-0000641 ADD END

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		// フリー項目より以下を取得
		// ・入力ファイルパス
		// ・入力ファイル定義
		String[] freeParam = commonItem.getFreeItem().split(";");
		String inputFilePath = freeParam[0];
		String inputDef = freeParam[1];
		
		// 入力ファイルオブジェクトの生成
		dslAfSkssnsInfoExtrctnFile = new JBSbatInputFileUtil(inputFilePath);
		// 入力定義ファイルオブジェクトの生成
		String dslAfSkssnsInfoExtrctnFileDefNm = JBSbatAplConst.getAplConstValue(PARAM_IND) + inputDef;
		dslAfSkssnsInfoExtrctnFileDef = new JBSbatDefFileUtil(dslAfSkssnsInfoExtrctnFileDefNm, dslAfSkssnsInfoExtrctnFile);
		
		dslAfSkssnsInfoExtrctnFile.createReader();
		
		// DBアクセスクラス生成
		db_access_cust = new JBSbatSQLAccess(commonItem, TBL_CK_T_CUST);
		db_access_sys_param_knri = new JBSbatSQLAccess(commonItem, TBL_ZM_M_SYS_PARAM_KNRI);
		db_access_sjisho = new JBSbatSQLAccess(commonItem, TBL_CK_T_SJISHO);
// ▼▼▼ OM-2018-0000641 ADD START
		db_access_aging = new JBSbatSQLAccess(commonItem, TBL_ZM_T_AGING);
// △△△ OM-2018-0000641 ADD END
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// 分割コミット数
		String commitRcrdCnt = "";
		
		// システムパラメータ管理テーブル検索用パラメータ
		String[] sysParamParam = {"COMMIT_CNT"
							, commonItem.getJobid()
							, commonItem.getOpeDate()
							, commonItem.getOpeDate()};
		
		// システムパラメータ管理テーブル検索
		executeZM_M_SYS_PARAM_KNRI_AC_SELECT_001(sysParamParam);
		
		JBSbatCommonDBInterface resMap = new JBSbatCommonDBInterface();
		
		// システムパラメータより取得した値を設定する
		while((resMap = db_access_sys_param_knri.selectNext()) != null)
		{
			commitRcrdCnt = resMap.getString("SYS_PARAM_SETTE_VALUE_1");
		}
		
		int cnt = 0;
		
		while (dslAfSkssnsInfoExtrctnFile.ready())
		{
			// 1レコードを取得
			JBSbatServiceInterfaceMap dslAfSkssnsInfoExtrctnFileLine =
					dslAfSkssnsInfoExtrctnFileDef.lineToObject(dslAfSkssnsInfoExtrctnFile.readLine(), dslAfSkssnsInfoExtrctnFile, 0);
			
			/** (1)対象データ取得 */
			// SYSID
			String sysid = dslAfSkssnsInfoExtrctnFileLine.getString(JBSbatCKIFM010.SYSID);
			// 会員種別コード
			String memberSbtCd = dslAfSkssnsInfoExtrctnFileLine.getString(JBSbatCKIFM010.MEMBER_SBT_CD);
			
			// 運用日
			String opeDate = commonItem.getOpeDate();
			
			/** (2)お客様スキーマ更新 */
			// パラメタを設定する
			JBSbatCommonDBInterface custSelectParamList = new JBSbatCommonDBInterface();
			custSelectParamList.setValue(sysid);
			custSelectParamList.setValue(opeDate);
			
			// SELECT文を実行
			// (対象行をロックする)
			db_access_cust.selectBySqlDefine(custSelectParamList, CK_T_CUST_CK_SELECT_016);
// ▼▼▼ OM-2018-0000641 ADD START
			// 検索結果を取得する。（エイジング更新で利用）
			JBSbatCommonDBInterface custInfo = db_access_cust.selectNext();
// △△△ OM-2018-0000641 ADD END
			
			// パラメタを設定する
			JBSbatCommonDBInterface custUpdateParamList = new JBSbatCommonDBInterface();
			custUpdateParamList.setValue(sysid);
			custUpdateParamList.setValue(opeDate);
			
			// UPDATE文を実行
			db_access_cust.executeBySqlDefine(custUpdateParamList, CK_T_CUST_CK_UPDATE_001);
			
			/** (3)指示書スキーマ登録・エイジング更新・お客様スキーマ.サービス提供物消去処理実施年月日時分秒の設定 */
			// 会員種別コードが"10"(マスター会員（個人）)または"20"(マスター会員（法人）)である場合
			if (JCKStrConst.CD00039_MASTER_KOJIN.equals(memberSbtCd) || JCKStrConst.CD00039_MASTER_HOJIN.equals(memberSbtCd))
			{
				// パラメタを設定する
				JBSbatCommonDBInterface sjishoParamList = new JBSbatCommonDBInterface();
				sjishoParamList.setValue(opeDate);
				sjishoParamList.setValue(sysid);
// IT1-2017-0000090 2017/06/29 MOD START
//				sjishoParamList.setValue(JBSbatDateUtil.getSystemDate());
				sjishoParamList.setValue(JBSbatDateUtil.getSystemDateTimeStamp());
// IT1-2017-0000090 2017/06/29 MOD END
				
				// INSERT文を実行
				db_access_sjisho.executeBySqlDefine(sjishoParamList, CK_T_SJISHO_CK_INSERT_001);
// ▼▼▼ OM-2018-0000641 ADD START
				// 指示書への登録に連動して、エイジングのステータスを更新する。
				updateAgingInfoAt(custInfo.getString(JBSbatCK_T_CUST.EOID),
								  custInfo.getString(JBSbatCK_T_CUST.NKNAME), 
								  opeDate);
// △△△ OM-2018-0000641 ADD END
// OM#63379 ADD START
				// eoIDのエイジングステータスを「300：エージング中」に変更したことに伴い
				// お客様スキーマ.サービス提供物消去処理実施年月日時分秒にシステム年月日時分秒を設定する更新を行う。
				JBSbatCommonDBInterface custParamList = new JBSbatCommonDBInterface();
				custParamList.setValue(JBSbatDateUtil.getSystemDateTimeStamp());
				custParamList.setValue(sysid);
				custParamList.setValue(sysid);

				// サービス提供物消去処理実施年月日時分秒の更新処理（設定）を実行します
				db_access_cust.executeBySqlDefine(custParamList, CK_T_CUST_KK_UPDATE_006);
// OM#63379 ADD END
			}
			
			if ((cnt != 0) && ((cnt + 1) % Integer.parseInt(commitRcrdCnt) == 0))
			{
				// 分割コミット
				super.commit();
			}
			
			cnt++;
		}
		
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		
		// ファイルクローズ
		dslAfSkssnsInfoExtrctnFile.close();
		
		// DBアクセスクラス解放
		db_access_cust.close();
		db_access_sys_param_knri.close();
		db_access_sjisho.close();
// ▼▼▼ OM-2018-0000641 ADD START
		db_access_aging.close();
// △△△ OM-2018-0000641 ADD END
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * SQLKEY(AC_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	システムパラメータ分類コード
	 *		 	システムパラメータID
	 *		 	システムパラメータ適用開始年月日
	 *		 	システムパラメータ適用終了年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_M_SYS_PARAM_KNRI_AC_SELECT_001(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());

		// DBアクセスを実行します
		db_access_sys_param_knri.selectBySqlDefine(paramList, ZM_M_SYS_PARAM_KNRI_AC_SELECT_001);
	}
	
// ▼▼▼ OM-2018-0000641 ADD START	
	/**
	 * お客様情報の中でエイジング管理を行っているeoID及びニックネームを取得し、ステータスを更新する。
	 * <br>
	 * @param pEoID eoID
	 * @param pNkNm ニックネーム
	 * @param pOpeDate 運用日
	 * @throws Exception 
	 */
	private void updateAgingInfoAt(String pEoID, String pNkNm, String pOpeDate) throws Exception
	{
		// eoIDが設定されていて、初期eoIDと異なる場合
// ▽▽▽ OM-2018-0000641 2018.09.13 Modify START
//		if ((pEoID != null && pEoID.length() > 0) || (pNkNm == null && pNkNm.length() > 0))
		if ((pEoID != null && pEoID.length() > 0) || (pNkNm != null && pNkNm.length() > 0))
// △△△ OM-2018-0000641 2018.09.13 Modify END
		{
			
			// エイジングを照会する
			executeZM_T_AGING_CK_SELECT_002(new String[] {pEoID, pNkNm});
			
			JBSbatCommonDBInterface target = null;
	
			// 一致したエイジングに対してエージングステータスを"エージング中"に更新する
			while((target = db_access_aging.selectNext()) != null)
			{
				JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
				JBSbatCommonDBInterface valueMap = new JBSbatCommonDBInterface();
	
				// キー条件
				whereMap.setValue(JBSbatZM_T_AGING.AGING_NO, target.getString(JBSbatZM_T_AGING.AGING_NO));
	
				// 更新条件
				valueMap.setValue(JBSbatZM_T_AGING.USE_END_DTM, pOpeDate + DEFALT_TM);	// 使用終了年月日時分秒
				valueMap.setValue(JBSbatZM_T_AGING.AGING_STAT, ZM_T_AGING_STAT_300);	// エージングステータス
				
				// エージングの更新
				db_access_aging.updateByPrimaryKeys(whereMap, valueMap);
			}
			
		}
	}
	
	/**
	 * eoIDとニックネームのエージングを検索する
	 * <br>
	 * @param param 検索パラメータ
	 * @throws Exception
	 */
	private void executeZM_T_AGING_CK_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0]);
		paramList.setValue(param[1]);

		// DBアクセスを実行します
		db_access_aging.selectBySqlDefine(paramList, ZM_T_AGING_CK_SELECT_002);
		
	}
// △△△ OM-2018-0000641 ADD END
}
