/*********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom  					 *
 **********************************************************************
 *＜プログラム内容＞
 *	システム名			：eo顧客基幹システム
 *	モジュール名		：JBSbatCHStatUpd
 *	ソースファイル名	：JBSbatCHStatUpd.java
 *	作成者				：富士通　
 *	作成日				：2011年07月04日
 *＜機能概要＞
 *　ステータス更新部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2011/07/04   富士通		新規作成
 *	v4.00		2012/12/25   FJ）清水	【ST4-2012-0000202】性能改善
 *	v4.01		2013/01/31   FJ）後藤	【ST4-2012-0000377】性能改善
 *	v5.00		2013/10/04   FJ）伊藤	【OM-2013-0002317】債権確定年月日が空の時、更新を行わないように修正
 *********************************************************************/
package eo.business.service;

import java.util.Map;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCHbatSeikyKaknoBusinessUtil;
import eo.common.constant.JACStrConst;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;

/**
 * ステータス更新 <p>
 *<BR>
 * @author 富士通
 */
public class JBSbatCHStatUpd extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(請求)*/
	private static final String D_TBL_NAME_CH_T_SEIKY = "CH_T_SEIKY";

	/** テーブル(債権)*/
	private static final String D_TBL_NAME_CH_T_SAIKEN = "CH_T_SAIKEN";

	/** SQL定義キー(CH_UPDATE_002)*/
	private static final String CH_T_SEIKY_CH_UPDATE_002 = "CH_UPDATE_002";

	/** SQL定義キー(CH_UPDATE_001)*/
	private static final String CH_T_SAIKEN_CH_UPDATE_001 = "CH_UPDATE_001";

	/** テーブルアクセスクラス(請求)*/
	private JBSbatSQLAccess db_CH_T_SEIKY = null;

	/** テーブルアクセスクラス(債権)*/
	private JBSbatSQLAccess db_CH_T_SAIKEN = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 請求テーブル更新件数 */
	private int seikyCnt = 0;

	/** 債権テーブル更新件数 */
	private int saikenCnt = 0;

	/** 当月*/
	private String togetsu = null;

	/** 更新請求ステータスマップ*/
	private Map<String, String[]> seikyUpdateStatMap = null;

	/** 更新債権ステータスマップ*/
	private Map<String, String[]> saikenUpdateStatMap = null;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CH_T_SEIKY = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_SEIKY);
		db_CH_T_SAIKEN = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_SAIKEN);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][opeDate=" + super.opeDate + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][freeItem=" + super.freeItem + "]");

		JCHbatSeikyKaknoBusinessUtil seikyKaknoBusinessUtil = new JCHbatSeikyKaknoBusinessUtil(commonItem);

		// 当月（請求年月）取得
		togetsu = (seikyKaknoBusinessUtil).getSeikyYm(super.opeDate);

		// 処理タイミングコード取得
		String shoriTimingCd = seikyKaknoBusinessUtil.getShoriTimingCd(super.opeDate);

		// 更新ステータス取得（請求ステータス）
		seikyUpdateStatMap = seikyKaknoBusinessUtil.getSeikySaikenUpdStat(JACStrConst.SHORI_CD_SEIKYU, shoriTimingCd, togetsu);

		// 第二引数（処理タイミングコード）は、先に共通部品にて取得した処理タイミングコードを設定
		saikenUpdateStatMap = seikyKaknoBusinessUtil.getSeikySaikenUpdStat(JACStrConst.SHORI_CD_SAIKEN, shoriTimingCd, togetsu);

		seikyKaknoBusinessUtil.close();

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");

	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");

		// 請求テーブル更新
		executeCH_T_SEIKY_CH_UPDATE_002();

		// 債権テーブル更新
		executeCH_T_SAIKEN_CH_UPDATE_001();

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][seikyCnt=" + seikyCnt + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][saikenCnt=" + saikenCnt + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");

		return null;

	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_T_SEIKY.close();
		db_CH_T_SAIKEN.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 請求テーブルを更新します。
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	public void updateSeiky() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][updateSeiky]");

		// 更新実行
		executeCH_T_SEIKY_CH_UPDATE_002();

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][updateSeiky]");
	}

	/**
	 * 債権テーブルを更新します。
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	public void updateSaiken() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][updateSaiken]");

		// 更新実行
		executeCH_T_SAIKEN_CH_UPDATE_001();

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][updateSaiken]");
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(CH_UPDATE_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 executeCH_T_SEIKY_CH_UPDATE_002() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][executeCH_T_SEIKY_CH_UPDATE_002]");
		// 請求方法コードの件数分ループ処理
		for (String key : seikyUpdateStatMap.keySet())
		{
			// 更新請求ステータスリスト
			String[] updTrgtStatList = seikyUpdateStatMap.get(key);
			// 更新対象請求ステータスコード
			String updTrgtStat 	= updTrgtStatList[0];
			// 更新請求ステータスコード
			String chskStat 	= updTrgtStatList[1];

			// バイント変数のリストを生成します
			JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
			paramList.setValue(chskStat);			// 更新請求ステータスコード
			paramList.setValue(togetsu);			// 請求年月
			paramList.setValue(updTrgtStat);		// 請求ステータス
			paramList.setValue(key);				// 請求方法コード
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][executeCH_T_SEIKY_CH_UPDATE_002][paramList:" + paramList.getList().toString() + "]");

			if(!updTrgtStat.equals(chskStat))
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][executeCH_T_SEIKY_CH_UPDATE_002][RUN UPDATE]");
				
				// DBアクセスを実行します
				int updateCnt = db_CH_T_SEIKY.executeBySqlDefine(paramList, CH_T_SEIKY_CH_UPDATE_002);
				seikyCnt = seikyCnt + updateCnt;
			}
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][executeCH_T_SEIKY_CH_UPDATE_002]");
	}

	/**
	 * SQLKEY(CH_UPDATE_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 executeCH_T_SAIKEN_CH_UPDATE_001() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][executeCH_T_SAIKEN_CH_UPDATE_001]");
		// 請求方法コードの件数分ループ処理
		for (String key : saikenUpdateStatMap.keySet())
		{
			// 更新債権ステータスリスト
			String[] updTrgtStatList = saikenUpdateStatMap.get(key);
			// 更新対象債権ステータスコード
			String updTrgtStat 	= updTrgtStatList[0];
			// 更新債権ステータスコード
			String chskStat 	= updTrgtStatList[1];
			// 更新債権日付
			String updSaiYmd 	= updTrgtStatList[2];
			
			// バイント変数のリストを生成します
			JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
			paramList.setValue(chskStat);			// 更新債権ステータスコード　→　債権ステータスコード
			paramList.setValue(updSaiYmd);			// 更新債権日付　→　債権確定年月日
			paramList.setValue(togetsu);			// 請求年月
			paramList.setValue(updTrgtStat);		// 債権ステータス
			paramList.setValue(key);				// 請求方法コード
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][executeCH_T_SAIKEN_CH_UPDATE_001][paramList:" + paramList.getList().toString() + "]");

			// 更新債権日付が設定されている場合
			if(updSaiYmd != null && !updSaiYmd.equals(JACStrConst.KARA_MOJI))
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][executeCH_T_SAIKEN_CH_UPDATE_001][RUN UPDATE]");
				
				// DBアクセスを実行します
				int updateCnt = db_CH_T_SAIKEN.executeBySqlDefine(paramList, CH_T_SAIKEN_CH_UPDATE_001);
				saikenCnt = saikenCnt + updateCnt;
			}
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][executeCH_T_SAIKEN_CH_UPDATE_001]");
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
