/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHPayYksFuRkuCst
*	ソースファイル名	：JBSbatCHPayYksFuRkuCst.java
*	作成者				：富士通　
*	作成日				：2012年01月23日
*＜機能概要＞
*　支払約束不履行者抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/01/23   富士通		新規作成
*	v36.00.00	2018/04/05   FJ)森脇	【OM-2017-0000558】支払約束履行者リスト不正出力
*	v38.00.00	2018/08/31   FJ)河邊	【OM-2018-0000607】支払約束履行者リスト
*********************************************************************/
package eo.business.service;


import java.math.BigDecimal;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCHbatSeikyKaknoBusinessUtil;
import eo.business.util.file.JBSbatCHIFM135;
import eo.business.util.table.JBSbatCH_M_PRC_SCHDL_TEIGI;
import eo.business.util.table.JBSbatCH_T_SAIKEN_UCWK;
import eo.business.util.table.JBSbatCH_T_TOKUSOKU;
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.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHPayYksFuRkuCst extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(債権)*/
	private static final String D_TBL_NAME_CH_T_SAIKEN = "CH_T_SAIKEN";

	/** SQL定義キー(CH_SELECT_017)*/
	private static final String CH_T_SAIKEN_CH_SELECT_017 = "CH_SELECT_017";

	/** テーブルアクセスクラス(債権)*/
	private JBSbatSQLAccess db_CH_T_SAIKEN = null;
// OM-2018-0000607 2018/08/31 ADD START
	/** テーブル(料金スケジュール定義)*/
	private static final String D_TBL_NAME_CH_M_PRC_SCHDL_TEIGI = "CH_M_PRC_SCHDL_TEIGI";
	
	/** SQL定義キー(CH_SELECT_002)*/
	private static final String CH_M_PRC_SCHDL_TEIGI_CH_SELECT_002 = "CH_SELECT_002";
	
	/** テーブルアクセスクラス(料金スケジュール定義)*/
	private JBSbatSQLAccess db_CH_M_PRC_SCHDL_TEIGI = null;
// OM-2018-0000607 2018/08/31 ADD END	
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 退避．請求年月（当月）*/
	private String tihSikyYm 			= null;
	
	/** 退避．未収金額*/
	private String tihMisyuKingaku 	= null;
// OM-2018-0000607 2018/08/31 ADD START
	/** 退避．支払期限年月日*/
	private String tihPayKigenYmd		= null;
// OM-2018-0000607 2018/08/31 ADD END
	
	/**
	 * 初期処理
	 * @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);
// OM-2018-0000607 2018/08/31 ADD START
		db_CH_M_PRC_SCHDL_TEIGI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_SCHDL_TEIGI);
// OM-2018-0000607 2018/08/31 ADD END
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		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 + "]");
		
		// パラメータ取得部品の初期処理を行う。（パラメータ取得部品．コンストラクタ使用）
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);
		
		try
		{
			// 料金項目コード（未収金額）（シスパラ）
			this.tihMisyuKingaku = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_CH_WKS_MISYU_KINGAKU);
		}
		finally
		{
			// パラメータ取得部品のクローズ処理を行う。（パラメータ取得部品．クローズ使用）
			paramUtil.close();
		}
		// 当月取得
		getSikyYm();
// OM-2018-0000607 2018/08/31 ADD START
		// 支払期限年月日取得
		this.tihPayKigenYmd = this.getEventYmd(tihSikyYm, JACStrConst.EVENT_CD_KOUZA_PAY_KIGEN_YMD);
// OM-2018-0000607 2018/08/31 ADD END
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][tihSikyYm=" + this.tihSikyYm + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 請求年月を取得します。
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void getSikyYm() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getSikyYm]");
		
		JCHbatSeikyKaknoBusinessUtil su = new JCHbatSeikyKaknoBusinessUtil(commonItem);
		try
		{
			// 請求年月取得
			this.tihSikyYm = su.getBillYmNotContain(super.opeDate, JACStrConst.EVENT_CD_SIKY_TRN_DAY);
		}
		finally
		{
			su.close();
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getSikyYm]");
		return;
	}
	
	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert inMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][inMap=" + inMap.getMap().toString() + "]") : true;
		
		
		JBSbatOutputItem outputItem = new JBSbatOutputItem();
		
// OM-2018-0000607 2018/08/31 MOD START
//// OM-2017-0000558 DEL START
////		// 債権情報の取得
////		JBSbatCommonDBInterface dbMap = getSaikenInfo(inMap);
//// OM-2017-0000558 DEL END
		// 債権情報の取得
		JBSbatCommonDBInterface dbMap = getSaikenInfo(inMap);
// OM-2018-0000607 2018/08/31 MOD END

		// 支払約束不履行者情報ファイル出力判定処理（当月以前）-- // OM-2018-0000607 2018/08/31 MOD
		BigDecimal minoGokeiAmnt = BigDecimal.ZERO;
// OM-2017-0000558 DEL START
//		// 債権情報の取得結果が1件以上ある場合
//		if(dbMap != null)
// OM-2017-0000558 DEL END
		// OM-2017-0000558 ADD START
		// 前月以前未納金額がある場合
		minoGokeiAmnt = inMap.getBigDecimal(JBSbatCH_T_TOKUSOKU.TOKUSOKU_AMNT);
// OM-2018-0000607 2018/08/31 DEL START
//		if (BigDecimal.ZERO.compareTo(minoGokeiAmnt) < 0 )
//		// OM-2017-0000558 ADD END
//		{
//// OM-2017-0000558 DEL START
////			while(dbMap != null)
////			{
////				// 退避．未納合計金額　←　取得した債権内訳．金額の合計
////				minoGokeiAmnt = minoGokeiAmnt.add(dbMap.getBigDecimal(JBSbatCH_T_SAIKEN_UCWK.AMNT));
////				dbMap = db_CH_T_SAIKEN.selectNext();
////			}
//// OM-2017-0000558 DEL END
//			makeOutputInfo(outputItem, inMap, minoGokeiAmnt.toString());
//		}
// OM-2018-0000607 2018/08/31 DEL END
// OM-2018-0000607 2018/08/31 ADD START
		// 支払約束不履行者情報ファイル出力判定処理(当月分)
		// 債権情報の取得結果が1件以上、且つ、「当月の支払期限年月日 ＜ 運用日」の場合
		if(dbMap != null 
			&& this.tihPayKigenYmd.compareTo(super.opeDate) < 0)
		{
			while(dbMap != null)
			{
				// 退避．未納合計金額　←　取得した債権内訳．金額の合計
				minoGokeiAmnt = minoGokeiAmnt.add(dbMap.getBigDecimal(JBSbatCH_T_SAIKEN_UCWK.AMNT));
				dbMap = db_CH_T_SAIKEN.selectNext();
			}
		}
		
		if (BigDecimal.ZERO.compareTo(minoGokeiAmnt) < 0 )
		{
			// 支払約束不履行者情報ファイル作成
			makeOutputInfo(outputItem, inMap, minoGokeiAmnt.toString());
		}
// OM-2018-0000607 2018/08/31 ADD END
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * 支払約束不履行者情報ファイルを作成します
	 * @param outputInItem　出力情報
	 * @param inMap　入力電文
	 * @param minoGokeiAmnt　未納合計金額
	 * @throws Exception
	 */
	private void makeOutputInfo(JBSbatOutputItem outputInItem, JBSbatServiceInterfaceMap inMap, String minoGokeiAmnt) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputInfo]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputInfo][inMap=" + inMap.getMap().toString() + "]");
		
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();

		// 履行判定日
		outMap.set(JBSbatCHIFM135.RIKOU_JUDGE_YMD,		inMap.getString(JBSbatCH_T_TOKUSOKU.PAY_YAKUSOKU_RIKO_JDG_YMD));
		// 支払約束年月日
		outMap.set(JBSbatCHIFM135.PAY_YAKUSOKU_YMD,		inMap.getString(JBSbatCH_T_TOKUSOKU.PAY_YAKUSOKU_YMD));
		// 支払約束受付日
		outMap.set(JBSbatCHIFM135.PAY_YAKUSOKU_UK_YMD,	inMap.getString(JBSbatCH_T_TOKUSOKU.PAY_YAKUSOKU_UK_YMD));
		// 請求先番号
		outMap.set(JBSbatCHIFM135.SEIKY_KEI_NO,			inMap.getString(JBSbatCH_T_TOKUSOKU.SEIKY_KEI_NO));
		// 未納合計金額
		outMap.set(JBSbatCHIFM135.MINO_GOKEI_AMNT,		minoGokeiAmnt);
		// 督促ステータス
		outMap.set(JBSbatCHIFM135.TOKUSOKU_STAT,		inMap.getString(JBSbatCH_T_TOKUSOKU.TOKUSOKU_STAT));
		
		// 出力フラグ設定
		outMap.setOutFlg(true);
		
		// 出力処理
		outputInItem.addOutMapList(outMap);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutputInfo][outputItem = " + outMap.getMap().toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputInfo]");
	}
	
	/**
	 * 債権情報を取得して、結果を返却します。
	 * 
	 * @param inMap　入力電文
	 * @return JBSbatCommonDBInterface レコード
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private JBSbatCommonDBInterface getSaikenInfo(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getSaikenInfo]");
		
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		
		paramList.setValue(super.systemCode);									// システムコード（'CH' ）
		paramList.setValue(this.tihMisyuKingaku);								// 業務機能識別コード（退避．未収金額）
		paramList.setValue(JACStrConst.CHSHT_CHG_CD_CST);						// 抽出変換コード（'1'）
		paramList.setValue(super.opeDate);										// 料金項目抽出変換適用開始年月日（バッチ運用日）
		paramList.setValue(super.opeDate);										// 料金項目抽出変換適用終了年月日（バッチ運用日）
		paramList.setValue(inMap.getString(JBSbatCH_T_TOKUSOKU.SEIKY_KEI_NO));	// 請求契約番号（督促．請求契約番号）
		paramList.setValue(JACStrConst.SAIKEN_STAT_FIX_SEIKY); 					// 督促ステータス
		paramList.setValue(JACStrConst.SAIKEN_STAT_ICHIBU_KAKNO); 				// 督促ステータス
		paramList.setValue(this.tihSikyYm);										//債権年月（退避．当月 ）
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getSaikenInfo][paramList=" + paramList.getList().toString() + "]");
		
		// SQL実行
		executeCH_T_SAIKEN_CH_SELECT_017(paramList.getList().toArray());
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getSaikenInfo]");
		return db_CH_T_SAIKEN.selectNext();
	}
	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_T_SAIKEN.close();
// OM-2018-0000607 2018/08/31 ADD START
		db_CH_M_PRC_SCHDL_TEIGI.close();
// OM-2018-0000607 2018/08/31 ADD END
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * SQLKEY(CH_SELECT_017)で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_SELECT_017(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());
		paramList.setValue(param[4].toString());
		paramList.setValue(param[5].toString());
		paramList.setValue(param[6].toString());
		paramList.setValue(param[7].toString());
		paramList.setValue(param[8].toString());

		// DBアクセスを実行します
		db_CH_T_SAIKEN.selectBySqlDefine(paramList, CH_T_SAIKEN_CH_SELECT_017);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
// OM-2018-0000607 2018/08/31 ADD START
	/**
	 * 引数で渡された請求年月、イベントコードを基に、
	 * 料金スケジュール定義を検索し、その結果を返却します。
	 * 
	 * @param sikyYm 請求年月
	 * @param eventCd イベントコード
	 * @return String 取得した請求年月
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private String getEventYmd(String sikyYm, String eventCd) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getEventYmd]");
		
		JBSbatCommonDBInterface whereParam = new JBSbatCommonDBInterface();
		
		// 請求年月
		whereParam.setValue(sikyYm);
		// イベントコード
		whereParam.setValue(eventCd);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getEventYmd][whereParam=" + whereParam.getList().toString() + "]");
		
		// SQL実行
		this.executeCH_M_PRC_SCHDL_TEIGI_CH_SELECT_002(whereParam.getList().toArray());
		
		// 検索結果取得
		JBSbatCommonDBInterface dbMap = this.db_CH_M_PRC_SCHDL_TEIGI.selectNext();
		
		// 取得結果なしの場合
		if(null == dbMap)
		{
			// 異常終了
			String[] msgParam = new String[]
			{ JBSbatCH_M_PRC_SCHDL_TEIGI.TABLE_NAME, whereParam.getList().toString() };
			throw new JBSbatBusinessException(JPCBatchMessageConstant.ECHB0270CH, msgParam);
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getEventYmd][eventYmd=" + dbMap.getMap().toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getEventYmd]");
		
		// イベント年月日を返却
		return dbMap.getString(JBSbatCH_M_PRC_SCHDL_TEIGI.EVENT_YMD);
	}
	
	/**
	 * SQLKEY(CH_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 executeCH_M_PRC_SCHDL_TEIGI_CH_SELECT_002(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_CH_M_PRC_SCHDL_TEIGI.selectBySqlDefine(paramList, CH_M_PRC_SCHDL_TEIGI_CH_SELECT_002);
	}
// OM-2018-0000607 2018/08/31 ADD END
}
