/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHPayKigenUpd
*	ソースファイル名	：JBSbatCHPayKigenUpd.java
*	作成者				：富士通　
*	作成日				：2013年01月16日
*＜機能概要＞
*　支払期限日更新部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00		2013/01/13  FJ）後藤	新規作成
*********************************************************************/
package eo.business.service;

import java.util.HashMap;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCHbatSeikyKaknoBusinessUtil;
import eo.business.util.file.JBSbatCHIFM101;
import eo.business.util.table.JBSbatCH_T_SAIKEN;
import eo.business.util.table.JBSbatCH_T_SEIKY;
import eo.common.constant.JACStrConst;
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;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHPayKigenUpd extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(債権)*/
	private static final String D_TBL_NAME_CH_T_SAIKEN = "CH_T_SAIKEN";

	/** テーブル(請求)*/
	private static final String D_TBL_NAME_CH_T_SEIKY = "CH_T_SEIKY";

	/** SQL定義キー(CH_UPDATE_002)*/
	private static final String CH_T_SAIKEN_CH_UPDATE_002 = "CH_UPDATE_002";

	/** SQL定義キー(CH_UPDATE_004)*/
	private static final String CH_T_SAIKEN_CH_UPDATE_004 = "CH_UPDATE_004";

	/** テーブルアクセスクラス(債権)*/
	private JBSbatSQLAccess db_CH_T_SAIKEN = null;

	/** テーブルアクセスクラス(請求)*/
	private JBSbatSQLAccess db_CH_T_SEIKY = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 請求収納業務共通クラス */
	private JCHbatSeikyKaknoBusinessUtil chUtil = null;
	
	/** 料金スケジュール定義マップ */ 
	private HashMap<String, String> scdlMapl = null;
	
	/** 債権年月 */ 
	private String saikenYm = null;
	
	/** 請求更新件数 */
	private int seikyUpdCnt = 0;
	
	/** 債権更新件数 */
	private int saikenUpdCnt = 0;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CH_T_SAIKEN = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_SAIKEN);
		db_CH_T_SEIKY = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_SEIKY);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial][opeDate=" + super.opeDate + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial][freeItem=" + super.freeItem + "]");
		
		chUtil = new JCHbatSeikyKaknoBusinessUtil(commonItem);
		scdlMapl = new HashMap<String, String>();
		
		saikenYm = chUtil.getBillYmContain(super.opeDate, JACStrConst.EVENT_CD_SEIKY_SHORI_YMD);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][saikenYm=" + saikenYm + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		
		String key = inMap.getString(JBSbatCHIFM101.SEIKY_YM).concat(inMap.getString(JBSbatCHIFM101.PAY_KIGEN_EVENT_CD));
		// 料金スケジュール定義マップから支払期限日取得
		String payKigenYmd = scdlMapl.get(key);
		// マップから取得できない場合
		if(payKigenYmd == null)
		{
			// 料金スケジュール定義から支払期限日取得
			payKigenYmd = chUtil.getPayKigenDay(inMap.getString(JBSbatCHIFM101.SEIKY_YM), inMap.getString(JBSbatCHIFM101.PAY_KIGEN_EVENT_CD));
			// マップに格納
			scdlMapl.put(key, payKigenYmd);
		}
		
		// 請求更新
		seikyUpd(inMap.getString(JBSbatCHIFM101.SEIKY_NO), payKigenYmd );
		
		// 債権更新（当月分）
		saikenUpd(inMap.getString(JBSbatCHIFM101.SEIKY_NO), payKigenYmd);
		
		// 債権更新（過去分）
		saikenUpdKako(inMap.getString(JBSbatCHIFM101.SEIKY_NO), payKigenYmd);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_T_SAIKEN.close();
		db_CH_T_SEIKY.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		chUtil.close();
		
		// 出力件数（請求債権関連）をログ出力
		super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECHB1190AI,
				new String[] {JBSbatCH_T_SEIKY.TABLE_NAME, String.valueOf(seikyUpdCnt)});

		// 出力件数（請求債権関連）をログ出力
		super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECHB1190AI,
				new String[] {JBSbatCH_T_SAIKEN.TABLE_NAME, String.valueOf(saikenUpdCnt)});
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * 請求．支払期限日を更新します。
	 * 
	 * @param seikyNo 請求番号
	 * @param payKigenYmd 支払期限日
	 * @throws Exception
	 */
	private void seikyUpd(String seikyNo, String payKigenYmd) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][seikyUpd]");
		
		// PK項目
		Object[] whereParam =  {seikyNo};
		// 更新項目
		Object[] setparam =  {payKigenYmd};
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][seikyUpd][whereParam="+ seikyNo +"]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][seikyUpd][setparam="+ payKigenYmd +"]");
		int cnt = executeCH_T_SEIKY_PKUPDATE(setparam, whereParam);
		
		// 更新件数＝0件　の場合
		if(cnt == 0)
		{
			// 更新対象なしのためワーニング
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.ECHB0300CW, new String[] {JBSbatCH_T_SEIKY.TABLE_NAME, seikyNo});
		}
		else
		{
			seikyUpdCnt += cnt;
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][seikyUpd]");
	}
	
	/**
	 * 債権（当月分）．支払期限日を更新します。
	 * 
	 * @param seikyNo 請求番号
	 * @param payKigenYmd 支払期限日
	 * @throws Exception
	 */
	private void saikenUpd(String seikyNo, String payKigenYmd) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][saikenUpd]");
		// バインド変数
		Object[] param =  {payKigenYmd, seikyNo, saikenYm, JACStrConst.SIKYSHBTS_TEIGK_SEIKY};

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][seikyUpd][payKigenYmd="+ payKigenYmd +"]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][seikyUpd][seikyKeiNo="+ seikyNo +"]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][seikyUpd][saikenYm="+ saikenYm +"]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][seikyUpd][SIKYSHBTS_TEIGK_SEIKY="+ JACStrConst.SIKYSHBTS_TEIGK_SEIKY +"]");
		int cnt = executeCH_T_SAIKEN_CH_UPDATE_002(param);
		
		saikenUpdCnt += cnt;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][saikenUpd]");
	}
	
	/**
	 * 債権（過去分）．変更支払期限日を更新します。
	 * 
	 * @param seikyNo 請求番号
	 * @param payKigenYmd 支払期限日
	 * @throws Exception
	 */
	private void saikenUpdKako(String seikyNo, String payKigenYmd) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][saikenUpdKako]");
		// バインド変数
		Object[] param =  {payKigenYmd, seikyNo, saikenYm, JACStrConst.SIKYSHBTS_TEIGK_SEIKY};

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][seikyUpd][payKigenYmd="+ payKigenYmd +"]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][seikyUpd][seikyKeiNo="+ seikyNo +"]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][seikyUpd][saikenYm="+ saikenYm +"]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][seikyUpd][SIKYSHBTS_TEIGK_SEIKY="+ JACStrConst.SIKYSHBTS_TEIGK_SEIKY +"]");
		int cnt = executeCH_T_SAIKEN_CH_UPDATE_004(param);
		
		saikenUpdCnt += cnt;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][saikenUpdKako]");
	}
	
	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * 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 int executeCH_T_SAIKEN_CH_UPDATE_002(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アクセスを実行します
		return db_CH_T_SAIKEN.executeBySqlDefine(paramList, CH_T_SAIKEN_CH_UPDATE_002);
	}

	/**
	 * SQLKEY(CH_UPDATE_004)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	支払期限日
	 *		 	請求契約番号
	 *		 	債権年月
	 *		 	請求種別コード
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private int executeCH_T_SAIKEN_CH_UPDATE_004(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アクセスを実行します
		return db_CH_T_SAIKEN.executeBySqlDefine(paramList, CH_T_SAIKEN_CH_UPDATE_004);
	}

	/**
	 * PK(ＰＫ　更新)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数で設定項目マップを作ります。<br>
	 *
	 * 2.引数で条件マップを作ります。<br>
	 *
	 * 3.DBアクセスを実行します。<br>
	 * 
	 * 4.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		setParam:設定したい項目の(項目、値)を(key、value)として、setParamマップに入れます。項目キーは以下に説明します。
	 *		 	支払期限年月日				PAY_KIGEN_YMD
	 *		whereParam:PK項目の(項目、値)を(key、value)として,格納された配列です。PK項目は以下に説明します。
	 *		 	SEIKY_NO
	 * </pre>
	 * <p>
	 * @param setParam 設定項目の値。
	 * @param whereParam 条件項目の値。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private int executeCH_T_SEIKY_PKUPDATE(Object[] setParam, Object[] whereParam) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][executeCH_T_SEIKY_PKUPDATE]");
		// 設定値のマップを作成します
		JBSbatCommonDBInterface setMap = new JBSbatCommonDBInterface();
		setMap.setValue("PAY_KIGEN_YMD", setParam[0]);
	
		// 条件のマップを作成します
		JBSbatCommonDBInterface whereMap = new JBSbatCommonDBInterface();
		whereMap.setValue("SEIKY_NO", whereParam[0]);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][executeCH_T_SEIKY_PKUPDATE][setparam="+ setParam[0] +"]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][executeCH_T_SEIKY_PKUPDATE][whereParam="+ whereParam[0] +"]");

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][executeCH_T_SEIKY_PKUPDATE]");
		// DBアクセスを実行します
		return db_CH_T_SEIKY.updateByPrimaryKeys(whereMap, setMap);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
