/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHTkskSikyInfMkMae
*	ソースファイル名	：JBSbatCHTkskSikyInfMkMae.java
*	作成者				：富士通　
*	作成日				：2013年09月10日
*＜機能概要＞
*　督促用請求情報作成前処理部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v5.00.00	2013/09/10  FJ)黒木		【OM-2013-0001830】請求方法コード編集不正対応 新規作成
*********************************************************************/
package eo.business.service;


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.JBSbatCHIFM215;
import eo.business.util.table.JBSbatCH_M_PRC_SCHDL_TEIGI;
import eo.common.constant.JACStrConst;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHTkskSikyInfMkMae extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(料金スケジュール定義)*/
	private static final String D_TBL_NAME_CH_M_PRC_SCHDL_TEIGI = "CH_M_PRC_SCHDL_TEIGI";
	
	/** テーブルアクセスクラス(料金スケジュール定義)*/
	private JBSbatSQLAccess db_CH_M_PRC_SCHDL_TEIGI = null;

	/** 料金スケジュール定義SQLバインド数（CH_SELECT_014） */
	private static final int 				SCHDL_TEIGI_014_BIND_CNT	= 16;

	/** SQL定義キー(CH_SELECT_014)*/
	private static final String CH_M_PRC_SCHDL_TEIGI_CH_SELECT_014 = "CH_SELECT_014";
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 請求年月 */
	private String sikyYm = JACStrConst.KARA_MOJI;
	
	/** 請求収納業務共通クラス */
	private JCHbatSeikyKaknoBusinessUtil chUtil = null;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CH_M_PRC_SCHDL_TEIGI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_SCHDL_TEIGI);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

		// 督促対象イベントコード 
		String[] tokusokuTrgEvntCd = null;
		
		// パラメータ取得クラス生成
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);

		try
		{
			// 業務パラメータを取得する
			tokusokuTrgEvntCd = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_CH_TOKUSOKU_EVENT_CD).split(JACStrConst.COMMA);
		}
		finally
		{
			paramUtil.close();
		}
		
		// 請求年月取得
		this.sikyYm = getTogetu(tokusokuTrgEvntCd);
		
		// 請求収納業務共通クラス生成
		chUtil = new JCHbatSeikyKaknoBusinessUtil(commonItem);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "バッチ運用日" + super.opeDate + "から取得した請求年月：" + sikyYm);
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 料金スケジュール定義より当月を取得します。
	 * 
	 * @param tokusokuTrgEvntCd 督促対象イベントコード配列
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private String getTogetu(String[] tokusokuTrgEvntCd) throws Exception
	{
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getTogetu]");
		
		// 当月
		String tmpTogetu = JACStrConst.KARA_MOJI;
		
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		
		while(paramList.getListSize() < SCHDL_TEIGI_014_BIND_CNT - 1)
		{
			for(int i = 0; i < tokusokuTrgEvntCd.length && paramList.getListSize() < SCHDL_TEIGI_014_BIND_CNT - 1; i++)
			{
				// イベントコード設定
				paramList.setValue(tokusokuTrgEvntCd[i]);
			}
		}
		
		paramList.setValue(super.opeDate); 										// バッチ運用日

		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getTogetu][paramList=" + paramList.getList().toString() + "]");
		
		executeCH_M_PRC_SCHDL_TEIGI_CH_SELECT_014(paramList.getList().toArray());
		JBSbatCommonDBInterface dbMap = db_CH_M_PRC_SCHDL_TEIGI.selectNext();

		// 請求スキーマに該当データがあるか判定
		if(dbMap != null)
		{
			// 取得した請求年月を設定
			tmpTogetu = dbMap.getString(JBSbatCH_M_PRC_SCHDL_TEIGI.SEIKY_YM); 
		}
		else
		{
			assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getTogetu][督促処理対象外]");
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getTogetu][当月=" + tmpTogetu + "]");
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getTogetu]");
		
		return tmpTogetu;
	}

	/**
	 * 主処理
	 * @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();

		// 請求方法コード決定用の引数設定
		// 判定前請求方法コード
		String seikyWayCdBf = inMap.getString(JBSbatCHIFM215.SEIKY_WAY_CD);
		// 口座ステータス
		String kozaStat = inMap.getString(JBSbatCHIFM215.KOZA_STAT);
		// クレジットカードステータス
		String crecardStat = inMap.getString(JBSbatCHIFM215.CRECARD_STAT);
		// クレジットカード無効年月
		String crecaMkYm = inMap.getString(JBSbatCHIFM215.CRECA_MK_YM);
		// 請求年月
		String seikyYm = this.sikyYm;
		// 請求方法適用調整年月日
		String seikyWayAplyAdjYmd = inMap.getString(JBSbatCHIFM215.SEIKY_WAY_APLY_ADJ_YMD);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateSeiky][請求方法判定]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateSeiky][判定前請求方法コード：" + seikyWayCdBf + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateSeiky][口座ステータス：" + kozaStat + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateSeiky][クレジットカードステータス：" + crecardStat + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateSeiky][クレジットカード無効年月：" + crecaMkYm + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateSeiky][請求年月：" + seikyYm + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateSeiky][請求方法適用調整年月日：" + seikyWayAplyAdjYmd + "]");
		
		// 請求方法コードの決定
		String seikyWayCdAf = chUtil.seikyWayJudge(seikyWayCdBf, kozaStat, crecardStat, crecaMkYm, seikyYm, seikyWayAplyAdjYmd);
		
		// 請求年月が取得できなかった場合（督促のイベント日以外）の請求方法コードの戻し
		// 判定前請求方法コード ＝　'1'（窓口）の場合
		if(JACStrConst.SEIKY_MADOGUCHI.equals(seikyWayCdBf))
		{
		}
		// 判定前請求方法コード ＝　'2'（口振）または'3'（郵振）の場合
		else if(JACStrConst.SEIKY_KHRI.equals(seikyWayCdBf) || JACStrConst.SEIKY_YUFUIRI.equals(seikyWayCdBf))
		{
			// 口座ステータス ≠　'090'（有効性ＮＧ）の場合
			if(!JACStrConst.KOZA_STAT_NG.equals(kozaStat))
			{
				// 請求年月が未設定の場合
				if (seikyWayAplyAdjYmd != null && JACStrConst.KARA_MOJI.equals(seikyYm))
				{
					// 判定後請求方法コード　←　判定前請求方法コード
					seikyWayCdAf = seikyWayCdBf;
				}
			}
		}
		// 判定前請求方法コード ＝　'4'（クレジット）の場合
		else
		{
			// クレジットカードステータス ≠　'190'（無効）の場合
			if(!JACStrConst.CRECARD_STAT_MK.equals(crecardStat))
			{
				//  請求年月が未設定の場合
				if(!JACStrConst.KARA_MOJI.equals(crecaMkYm) && JACStrConst.KARA_MOJI.equals(seikyYm))
				{
					// 判定後請求方法コード　←　判定前請求方法コード
					seikyWayCdAf = seikyWayCdBf;
				}
			}
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateSeiky][判定後請求方法コード：" + seikyWayCdAf + "]");

		// 請求方法コード
		inMap.setString(JBSbatCHIFM215.SEIKY_WAY_CD, seikyWayCdAf);
		
		// 出力フラグにtrueを設定
		inMap.setOutFlg(true);
		
		// 出力情報にレコードを設定
		outputItem.addOutMapList(inMap);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		
		chUtil.close();
		
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
		
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/

	/**
	 * SQLKEY(CH_SELECT_014)で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_014(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());
		paramList.setValue(param[9].toString());
		paramList.setValue(param[10].toString());
		paramList.setValue(param[11].toString());
		paramList.setValue(param[12].toString());
		paramList.setValue(param[13].toString());
		paramList.setValue(param[14].toString());
		paramList.setValue(param[15].toString());

		// DBアクセスを実行します
		db_CH_M_PRC_SCHDL_TEIGI.selectBySqlDefine(paramList, CH_M_PRC_SCHDL_TEIGI_CH_SELECT_014);
	}	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
