/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHPayYksRkuCst
*	ソースファイル名	：JBSbatCHPayYksRkuCst.java
*	作成者				：富士通　
*	作成日				：2012年01月22日
*＜機能概要＞
*　支払約束履行者抽出部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/01/22   富士通		新規作成
*	v19.00.00   2015/08/15  FJ）岡田   【OM-2015-0000330】支払約束履行者抽出不正
*	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.util.Arrays;
import java.util.List;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCHbatSeikyKaknoBusinessUtil;
import eo.business.util.file.JBSbatCHIFM134;
import eo.business.util.table.JBSbatCH_M_PRC_SCHDL_TEIGI;
import eo.business.util.table.JBSbatCH_T_SAIKEN;
import eo.business.util.table.JBSbatCH_T_TOKUSOKU;
import eo.business.util.table.JBSbatCH_T_TOKUSOKU_IDO;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JKKStringUtil;
import eo.framework.application.JBSbatBusinessException;
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 JBSbatCHPayYksRkuCst extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(債権)*/
	private static final String D_TBL_NAME_CH_T_SAIKEN = "CH_T_SAIKEN";

	/** SQL定義キー(CH_SELECT_016)*/
	private static final String CH_T_SAIKEN_CH_SELECT_016 = "CH_SELECT_016";

	/** テーブルアクセスクラス(債権)*/
	private JBSbatSQLAccess db_CH_T_SAIKEN = null;

	//v19.00.00 ADD START

	/** テーブル(督促異動)*/
	private static final String D_TBL_NAME_CH_T_TOKUSOKU_IDO = "CH_T_TOKUSOKU_IDO";

	/** SQL定義キー(CH_SELECT_007)*/
	private static final String CH_T_TOKUSOKU_IDO_CH_SELECT_007 = "CH_SELECT_007";

	/** テーブルアクセスクラス(督促異動)*/
	private JBSbatSQLAccess db_CH_T_TOKUSOKU_IDO = null;

	/** 異動イベントコード(対象) */
	private static final List<String> TAISYO_TOKUSOKU_IDO_EVENT_CD  = Arrays.asList(new String[] {"30", "31", "32", "40", "70"});
	
	//v19.00.00 ADD END
	
// 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 tmpTogetu = JACStrConst.KARA_MOJI;
// OM-2018-0000607 2018/08/31 ADD START
	/** 支払期限年月日*/
	private String tmpPayKigenYmd = JACStrConst.KARA_MOJI;
// 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);
		//v19.00.00 ADD START
		db_CH_T_TOKUSOKU_IDO = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_TOKUSOKU_IDO);
		//v19.00.00 ADD END
// 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 + "]");
		
		// 当月を取得します。
		this.getTogetu();
// OM-2018-0000607 2018/08/31 ADD START
		// 支払期限年月日を取得します。
		this.tmpPayKigenYmd = this.getEventYmd(tmpTogetu, JACStrConst.EVENT_CD_KOUZA_PAY_KIGEN_YMD);
// OM-2018-0000607 2018/08/31 ADD END
		
		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]");
		assert 	inMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][inMap=" + inMap.getMap().toString() + "]") : true;
		
		JBSbatOutputItem outputItem = new JBSbatOutputItem();
		
		// 出力情報を設定します。
		this.setOutputInf(inMap, outputItem);
		
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_T_SAIKEN.close();
		//v19.00.00 ADD START
		db_CH_T_TOKUSOKU_IDO.close();
		//v19.00.00 ADD END
// 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, "[S][execute]");
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * SQLKEY(CH_SELECT_016)で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_016(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_CH_T_SAIKEN.selectBySqlDefine(paramList, CH_T_SAIKEN_CH_SELECT_016);
	}
	
	//v19.00.00 ADD START
	/**
	 * SQLKEY(CH_SELECT_007)で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_TOKUSOKU_IDO_CH_SELECT_007(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_CH_T_TOKUSOKU_IDO.selectBySqlDefine(paramList, CH_T_TOKUSOKU_IDO_CH_SELECT_007);
	}
	//v19.00.00 ADD END
	
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**▼▼▼▼▼▼メソッド追加 開始▼▼▼▼▼▼*/
	
	/**
	 * バッチ運用日を基に当月を取得します。
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void getTogetu() throws Exception
	{
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getTogetu]");
		
		JCHbatSeikyKaknoBusinessUtil su = new JCHbatSeikyKaknoBusinessUtil(super.commonItem);
		
		try
		{
			// 当月　更新
			this.tmpTogetu = su.getBillYmNotContain(super.opeDate, JACStrConst.EVENT_CD_SEIKY_SHORI_YMD);
		}
		finally
		{
			su.close();
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getTogetu][tmpTogetu=" + this.tmpTogetu + "]");
		
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getTogetu]");
		
	}
	
	/**
	 * 出力情報を設定します。
	 * 
	 * @param inMap 入力情報
	 * @param outputItem 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void setOutputInf(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputItem) throws Exception
	{
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setOutputInf]");
		
		//v19.00.00 ADD START 
		
		String tokusokuIdoEventCd = inMap.getString(JBSbatCH_T_TOKUSOKU.TOKUSOKU_IDO_EVENT_CD);					// 督促.異動イベントコード取得
		
		//督促.異動イベントコードの判定
		if(!TAISYO_TOKUSOKU_IDO_EVENT_CD.contains(tokusokuIdoEventCd))
		{
			//督促異動情報を取得します。
			this.selectTokusokuIdo(inMap);
			
			JBSbatCommonDBInterface dbMap = db_CH_T_TOKUSOKU_IDO.selectNext();
			if(null == dbMap)
				return;
		}
		
		//v19.00.00 ADD END
		
// OM-2018-0000607  2018/08/31 MOD START
//// OM-2017-0000558 DEL START
////		// 当月債権状態情報を取得します。
////		this.selectTogetuSaiknStInf(inMap);
////		
////		JBSbatCommonDBInterface dbMap = db_CH_T_SAIKEN.selectNext();
////		
////		// 債権ステータス
////		String saiknStat = null;
//// OM-2017-0000558 DEL END
		// 当月債権状態情報を取得します。
		this.selectTogetuSaiknStInf(inMap);
		
		JBSbatCommonDBInterface dbMap = db_CH_T_SAIKEN.selectNext();
		
		// 債権ステータス
		String saiknStat = null;
// OM-2018-0000607  2018/08/31 MOD END
		// 出力レコード情報
		JBSbatServiceInterfaceMap outRec = null;
		
// OM-2018-0000607  2018/08/31 MOD START
//// OM-2017-0000558 DEL START
////		// 取得結果の数だけ出力情報を設定
////		if(null != dbMap)
////		{
////			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setOutputInf][dbMap=" + dbMap.getMap().toString() + "]");
////			
////			saiknStat = dbMap.getString(JBSbatCH_T_SAIKEN.SAIKEN_STAT);
////			
////			// 債権ステータス　≠　"20"（請求確定）　かつ　債権ステータス　≠　"060"（一部収納）の場合
////			if(JACStrConst.SAIKEN_STAT_FIX_SEIKY.equals(saiknStat) || JACStrConst.SAIKEN_STAT_ICHIBU_KAKNO.equals(saiknStat))
////			{
////				assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setOutputInf][当月債権が完納でない。]");
////				assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setOutputInf]");
////				return;
////			}
////		}
//// OM-2017-0000558 DEL END
		// 取得結果の数だけ出力情報、且つ、「当月の支払期限年月日 ＜ 運用日」を設定
		if(null != dbMap
			&& this.tmpPayKigenYmd.compareTo(super.opeDate) < 0)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setOutputInf][dbMap=" + dbMap.getMap().toString() + "]");
			
			saiknStat = dbMap.getString(JBSbatCH_T_SAIKEN.SAIKEN_STAT);
			
			// 債権ステータス　≠　"20"（請求確定）　かつ　債権ステータス　≠　"060"（一部収納）の場合
			if(JACStrConst.SAIKEN_STAT_FIX_SEIKY.equals(saiknStat) || JACStrConst.SAIKEN_STAT_ICHIBU_KAKNO.equals(saiknStat))
			{
				assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setOutputInf][当月債権が完納でない。]");
				assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setOutputInf]");
				return;
			}
		}
// OM-2018-0000607  2018/08/31 MOD END
		outRec = new JBSbatServiceInterfaceMap();
		
		// 出力レコード情報を設定
		
		// 支払約束履行判定日
		outRec.set(JBSbatCHIFM134.PAY_YSK_RKU_JUDGE_YMD,	inMap.get(JBSbatCH_T_TOKUSOKU_IDO.PAY_YAKUSOKU_RIKO_JDG_YMD));
		// 支払約束年月日
		outRec.set(JBSbatCHIFM134.PAY_YAKUSOKU_YMD,			inMap.get(JBSbatCH_T_TOKUSOKU_IDO.PAY_YAKUSOKU_YMD));
		// 支払約束受付日
		outRec.set(JBSbatCHIFM134.PAY_YAKUSOKU_UK_YMD,		inMap.get(JBSbatCH_T_TOKUSOKU_IDO.PAY_YAKUSOKU_UK_YMD));
		// 請求先番号
		outRec.set(JBSbatCHIFM134.SEIKY_KEI_NO,				inMap.get(JBSbatCH_T_TOKUSOKU.SEIKY_KEI_NO));
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setOutputInf][outRec=" + outRec.getMap().toString() + "]");
		
		outRec.setOutFlg(true);
		
		outputItem.addOutMapList(outRec);
		
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setOutputInf]");
	}
	
	/**
	 * 当月債権状態情報を取得します。
	 * 
	 * @param inMap 入力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void selectTogetuSaiknStInf(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getTogetuSaiknStInf]");
		
		// 条件値
		JBSbatCommonDBInterface whereParam = new JBSbatCommonDBInterface();
		
		// 請求契約番号
		whereParam.setValue(inMap.get(JBSbatCH_T_TOKUSOKU.SEIKY_KEI_NO));
		// 債権年月
		whereParam.setValue(this.tmpTogetu);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getTogetuSaiknStInf][whereParam=" + whereParam.getList().toString() + "]");
		
		// SQL実行
		executeCH_T_SAIKEN_CH_SELECT_016(whereParam.getList().toArray());
		
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getTogetuSaiknStInf]");
		
		return;
	}
	
	//v19.00.00 ADD START
	/**
	 * 督促異動情報を取得します。
	 * 
	 * @param inMap 入力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void selectTokusokuIdo(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		
		// 条件値
		JBSbatCommonDBInterface whereParam = new JBSbatCommonDBInterface();
		
		// 督促.督促番号
		whereParam.setValue(inMap.get(JBSbatCH_T_TOKUSOKU.TOKUSOKU_NO));
		// 夜間バッチ運用日
		whereParam.setValue(opeDate);
		
		// SQL実行
		executeCH_T_TOKUSOKU_IDO_CH_SELECT_007(whereParam.getList().toArray());
		
		return;
	}
	//v19.00.00 ADD END
	
	/**▲▲▲▲▲▲メソッド追加 終了▲▲▲▲▲▲*/
// 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
}
