/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKKDelBatWorkParamUpd
*	ソースファイル名	：JBSbatKKDelBatWorkParamUpd.java
*	作成者				：富士通　
*	作成日				：2015年04月24日
*＜機能概要＞
*　削除バッチ業務パラメータ管理更新部品です。
*　　入力ファイル.業務パラメータIDの業務パラメータを入力ファイル.業務パラメータ設定値で更新します。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v14.00.00	2015/04/24	FJ)安井		IT1-2015-0000051	新規作成
*	v15.00.00	2015/08/18	FJ)安井		ST-2015-0000030 	抽出処理性能改善
*	v28.00.00	2017/01/20	FJ)原田		ANK-3141-00-00 	契約削除バッチの１日複数回走行対応
*********************************************************************/
package eo.business.service;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JKKBatCommon;
import eo.business.util.file.JBSbatKKIFM635;
import eo.common.util.JKKStringUtil;
import eo.framework.application.JBSbatBusinessError;
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>
*<BR>
* @author 富士通
*/
public class JBSbatKKDelBatWorkParamUpd extends JBSbatBusinessService
{
	
	/** フリー項目チェック（月次） */
	private static final String FREE_PRM_MONTH = "0";
	
	/** フリー項目チェック（日次） */
	private static final String FREE_PRM_DAY = "1";
	
	/** 更新対象業務パラメータID（月次） */
//ST-2015-0000030 MOD STA
//	private static final String[] updTgWkPrmId_M = {
//		"KK_CHRG_AF_DEL_PRD",
//		"KK_CHRG_BF_DSL_PRD",
//		"KK_CHRG_BF_CNCL_PRD"
//		};
	private static final String[] updTgWkPrmId_M = {
		"KK_CHRG_AF_DEL_PRD",
		"KK_CHRG_BF_DSL_PRD",
		"KK_CHRG_BF_CNCL_PRD",
		"KK_DEL_CHST_CNT"
		};
//ST-2015-0000030 MOD END
	
	/** 更新対象業務パラメータID（日次） */
	private static final String[] updTgWkPrmId_D = {
		"KK_DEL_TRN_LMT_CNT",
		// ANK-3141-00-00 MOD START
//		"KK_DEL_TRAN_TAJU_CNT",
//		"KK_DEL_RUN_UPPL_TIME",
		"KK_DEL_TRN_TAJU_CNT",
		"KK_DEL_RUNUPPL_TIME",
		// ANK-3141-00-00 MOD END
		"KK_CHRG_AF_MSKM_PRD",
		"KK_BF_CNCL_MSKM_PRD",
		"KK_BF_DSL_MSKM_PRD"
		// ANK-3141-00-00 ADD START
		// 2ver.
		,"KK_DEL_TRN_LMT_CNT2"
		,"KK_DEL_TRN_TAJU_CNT2"
		,"KK_DEL_RUNUPPL_TIME2"
		// 3ver.
		,"KK_DEL_TRN_LMT_CNT3"
		,"KK_DEL_TRN_TAJU_CNT3"
		,"KK_DEL_RUNUPPL_TIME3"
		// ANK-3141-00-00 ADD END
		};
	
	/** 年月チェック対象 */
	private static final String[] chkTgYymm = {
		"KK_CHRG_AF_DEL_PRD",
		"KK_CHRG_BF_DSL_PRD",
		"KK_CHRG_BF_CNCL_PRD",
		"KK_CHRG_AF_MSKM_PRD",
		"KK_BF_CNCL_MSKM_PRD",
		"KK_BF_DSL_MSKM_PRD"
		};
	
	/** 時分チェック対象 */
	private static final String[] chkTgHhmm = {
		// ANK-3141-00-00 MOD START
//		"KK_DEL_RUN_UPPL_TIME"
		"KK_DEL_RUNUPPL_TIME"
		// ANK-3141-00-00 MOD END
		// ANK-3141-00-00 ADD START
		// 2ver.
		,"KK_DEL_RUNUPPL_TIME2"
		// 3ver.
		,"KK_DEL_RUNUPPL_TIME3"
		// ANK-3141-00-00 ADD END
		};
	
	/** 数値チェック対象 */
//ST-2015-0000030 MOD STA
//	private static final String[] chkTgNum = {
//		"KK_DEL_TRN_LMT_CNT",
//		"KK_DEL_TRAN_TAJU_CNT"
//		};
	private static final String[] chkTgNum = {
		"KK_DEL_TRN_LMT_CNT",
		// ANK-3141-00-00 MOD START
//		"KK_DEL_TRAN_TAJU_CNT",
		"KK_DEL_TRN_TAJU_CNT",
		// ANK-3141-00-00 MOD END
		"KK_DEL_CHST_CNT"
		// ANK-3141-00-00 ADD START
		// 2ver.
		,"KK_DEL_TRN_LMT_CNT2"
		,"KK_DEL_TRN_TAJU_CNT2"
		// 3ver.
		,"KK_DEL_TRN_LMT_CNT3"
		,"KK_DEL_TRN_TAJU_CNT3"
		// ANK-3141-00-00 ADD END
		};
//ST-2015-0000030 MOD END
	
	/** 業務パラメータID(削除処理制限数) */
	private static final String WORK_PARAM_ID_KK_DEL_TRN_LMT_CNT = "KK_DEL_TRN_LMT_CNT";
	
	// ANK-3141-00-00 ADD START
	/** 業務パラメータID(削除処理制限数（2）) */
	private static final String WORK_PARAM_ID_KK_DEL_TRN_LMT_CNT2 = "KK_DEL_TRN_LMT_CNT2";
	
	/** 業務パラメータID(削除処理制限数3) */
	private static final String WORK_PARAM_ID_KK_DEL_TRN_LMT_CNT3 = "KK_DEL_TRN_LMT_CNT3";
	// ANK-3141-00-00 ADD END
	
	/** 業務パラメータID(削除処理多重数) */
	// ANK-3141-00-00 MOD START
//	private static final String WORK_PARAM_ID_KK_DEL_TRAN_TAJU_CNT = "KK_DEL_TRAN_TAJU_CNT";
	private static final String WORK_PARAM_ID_KK_DEL_TRN_TAJU_CNT = "KK_DEL_TRN_TAJU_CNT";
	// ANK-3141-00-00 MOD END
	
	/** フリー項目 */
	private String freePrm = "";
	
	/** 更新対象業務パラメータID */
	private String[] updTgWkPrmId = {};
	
	/** 業務パラメータ設定値チェックエラーフラグ */
	private boolean WkPrmStValChkErrFlg = false;
	
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(個人情報削除判定ワーク)*/
	private static final String D_TBL_NAME_ZM_M_WORK_PARAM_KNRI = "ZM_M_WORK_PARAM_KNRI";

	/** SQL定義キー(KK_UPDATE_001)*/
	private static final String ZM_M_WORK_PARAM_KNRI_KK_UPDATE_001 = "KK_UPDATE_001";

	/** テーブルアクセスクラス(個人情報削除判定ワーク)*/
	private JBSbatSQLAccess db_ZM_M_WORK_PARAM_KNRI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/**
	 * 初期処理
	 * @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);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		// フリー項目取得(0:月次、1:日時)
		freePrm = super.freeItem;
		if(FREE_PRM_MONTH.equals(freePrm))
		{
			// 月次処理の場合
			updTgWkPrmId = updTgWkPrmId_M;
		}
		else if(FREE_PRM_DAY.equals(freePrm))
		{
			// 日時処理の場合
			updTgWkPrmId = updTgWkPrmId_D;
		}
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/

		super.logPrint.printDebugLog("execute start");
		
		// 入力ファイル.業務パラメータID
		String wkPrmId = inMap.getString(JBSbatKKIFM635.WORK_PARAM_ID);
		// 入力ファイル.業務パラメータ設定値
		String wkPrmStVal = inMap.getString(JBSbatKKIFM635.WORK_PARAM_SETTE_VALUE);
		
		// 入力チェック(業務パラメータID)
		if(!chkWkPrmId(wkPrmId))
		{
			// 更新対象でない場合、警告出力でレコードスキップ
			super.logPrint.printBusinessErrorLog("EKKB0890CW", new String[]{"業務パラメータID:" + wkPrmId});
			throw new JBSbatBusinessError();
		}
		
		// 入力チェック(業務パラメータ設定値)
		if(!chkWkPrmStVal(wkPrmId, wkPrmStVal))
		{
			// 入力値不正の場合
			// 業務パラメータ設定値チェックエラーフラグをtrueに変更
			WkPrmStValChkErrFlg = true;
			// 警告出力でレコードスキップ
			super.logPrint.printBusinessErrorLog("EKKB0310JW", new String[]{"業務パラメータID:" + wkPrmId, "業務パラメータ設定値", "業務パラメータ設定値:" + wkPrmStVal});
			if(FREE_PRM_DAY.equals(freePrm))
			{
				// 削除処理制限数を0件に更新
				updWkPrmKnr(WORK_PARAM_ID_KK_DEL_TRN_LMT_CNT, "0");
				
				// ANK-3141-00-00 ADD START
				// 削除処理制限数（2）を0件に更新
				updWkPrmKnr(WORK_PARAM_ID_KK_DEL_TRN_LMT_CNT2, "0");
				
				// 削除処理制限数（3）を0件に更新
				updWkPrmKnr(WORK_PARAM_ID_KK_DEL_TRN_LMT_CNT3, "0");
				// ANK-3141-00-00 ADD END
			}
			throw new JBSbatBusinessError();
		}
		
		// 業務パラメータ設定値チェックエラーかつ削除処理制限数の場合、更新処理を行わない
		// ANK-3141-00-00 MOD START
		//if(WkPrmStValChkErrFlg && WORK_PARAM_ID_KK_DEL_TRN_LMT_CNT.equals(wkPrmId))
		if(WkPrmStValChkErrFlg && !JKKStringUtil.isNullEmpty(wkPrmId) && wkPrmId.startsWith(WORK_PARAM_ID_KK_DEL_TRN_LMT_CNT))
		// ANK-3141-00-00 MOD END
		{
			return null;
		}
		
		// 業務パラメータ管理更新処理
		updWkPrmKnr(wkPrmId, wkPrmStVal);
		
		super.logPrint.printDebugLog("execute end");
		
		return null;

	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_ZM_M_WORK_PARAM_KNRI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * PK(ＰＫ　更新)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.引数で条件マップを作ります。<br>
	 *
	 * 3.DBアクセスを実行します。<br>
	 * 
	 * 4.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	業務パラメータ設定値		WORK_PARAM_SETTE_VALUE
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	WORK_PARAM_ID
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @param whereParam 条件項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeZM_M_WORK_PARAM_KNRI_PKUPDATE(Object[] setParam, Object[] whereParam) throws Exception
	{
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("WORK_PARAM_SETTE_VALUE", setParam[0]);
	
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("WORK_PARAM_ID", whereParam[0]);

		// DBアクセスを実行します
		db_ZM_M_WORK_PARAM_KNRI.updateByPrimaryKeys(whereMap, setMap);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * 配列内存在チェック
	 * <BR>
	 * @param strAry チェック対象配列
	 * @param strTg チェック対象文字列
	 * @return boolean true:有 false:無
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private boolean chkStrInAry(String[] strAry, String strTg) throws Exception
	{
		for(int i = 0;i<strAry.length;i++)
		{
			if(strAry[i].equals(strTg))
			{
				return true;
			}
		}
		return false;
	}

	/**
	 * 入力チェック(業務パラメータID)
	 * <BR>
	 * @param wkPrmId 業務パラメータID
	 * @return boolean true:処理対象 false:処理対象以外
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private boolean chkWkPrmId(String wkPrmId) throws Exception
	{
		// 業務パラメータIDが処理対象の場合、trueを返却
		return chkStrInAry(updTgWkPrmId, wkPrmId);
	}

	/**
	 * 入力チェック(業務パラメータ設定値)
	 * <BR>
	 * @param wkPrmId 業務パラメータID
	 * @param wkPrmStVal 業務パラメータ設定値
	 * @return boolean true:OK false:NG
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private boolean chkWkPrmStVal(String wkPrmId, String wkPrmStVal) throws Exception
	{
		// 共通チェック(NULLチェック)
		if(null == wkPrmStVal || wkPrmStVal.length() == 0)
		{
			// NULLはNG
			return false;
		}
		
		// 共通チェック(数字チェック)
		if(!JKKBatCommon.isHannkakuSuuji1(wkPrmStVal))
		{
			// 半角数字以外はNG
			return false;
		}
		
		// 時分チェック
		if(chkStrInAry(chkTgHhmm, wkPrmId))
		{
			if(wkPrmStVal.length() != 4)
			{
				// 4桁でない場合はNG
				return false;
			}
			int hh = Integer.parseInt(wkPrmStVal.substring(0, 2));
			int mm = Integer.parseInt(wkPrmStVal.substring(2, 4));
			// 時チェック(00〜23まで設定可)
			if(hh < 0 || 23 < hh)
			{
				return false;
			}
			// 分チェック(00〜59まで設定可)
			if(mm < 0 || 59 < mm)
			{
				return false;
			}
		}
		
		// 年月チェック
		if(chkStrInAry(chkTgYymm, wkPrmId))
		{
			if(wkPrmStVal.length() != 4)
			{
				// 4桁でない場合はNG
				return false;
			}
			int yy = Integer.parseInt(wkPrmStVal.substring(0, 2));
			int mm = Integer.parseInt(wkPrmStVal.substring(2, 4));
			// 年チェック(00〜99まで設定可)
			if(yy < 0 || 99 < yy)
			{
				return false;
			}
			// 月チェック(00〜11まで設定可)
			if(mm < 0 || 11 < mm)
			{
				return false;
			}
		}
		
		// 数値チェック
		if(chkStrInAry(chkTgNum, wkPrmId))
		{
			if(!wkPrmStVal.equals(String.valueOf(Integer.parseInt(wkPrmStVal))))
			{
				// 数値でない場合はNG
				return false;
			}
		}
		
		// ANK-3141-00-00 MOD START
		// 業務パラメータIDがKK_DEL_TRN_TAJU_CNTと前方一致しているかチェック
		//// 個別チェック(削除処理多重数)
		//if(WORK_PARAM_ID_KK_DEL_TRAN_TAJU_CNT.equals(wkPrmId))
		if(!JKKStringUtil.isNullEmpty(wkPrmId) && wkPrmId.startsWith(WORK_PARAM_ID_KK_DEL_TRN_TAJU_CNT))
		// ANK-3141-00-00 MOD END
		{
			if(Integer.parseInt(wkPrmStVal) <= 0)
			{
				// 0以下の場合はNG
				return false;
			}
		}
		
		return true;
	}

	/**
	 * 業務パラメータ管理更新
	 * <BR>
	 * @param wkPrmId 業務パラメータID
	 * @param wkPrmStVal 業務パラメータ設定値
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void updWkPrmKnr(String wkPrmId, String wkPrmStVal) throws Exception
	{
		// パラメータ設定
		Object[] setParam = {
			wkPrmStVal
			};
		Object[] whereParam = {
			wkPrmId
			};
		// 更新実行
		executeZM_M_WORK_PARAM_KNRI_PKUPDATE(setParam, whereParam);
		// ログ出力
		super.logPrint.printBusinessErrorLog("EKKB1200AI", new String[]{"業務パラメータ管理を更新しました。業務パラメータID:" + wkPrmId + " 業務パラメータ設定値:" + wkPrmStVal});
	}

}
