/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHTgtSknNGsnYksSkMk
*	ソースファイル名	：JBSbatCHTgtSknNGsnYksSkMk.java
*	作成者				：富士通　
*	作成日				：2012年04月20日
*＜機能概要＞
*　当月債権無合算抑止請求データ作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/04/20   富士通		新規作成
*	v4.00		2013/05/28   FJ）後藤	【TG1-2013-0000325】リアル収納、仮収納を未収扱いとした不具合対応
*********************************************************************/
package eo.business.service;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCHbatSeikyKaknoBusinessUtil;
import eo.business.common.JCHbatSeikyKaknoBusinessUtil.FillType;
import eo.business.util.file.JBSbatCHIFM065;
import eo.business.util.file.JBSbatCHIFM070;
import eo.business.util.table.JBSbatCH_M_PRC_SCHDL_TEIGI;
import eo.business.util.table.JBSbatCH_T_TOKUSOKU;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
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 JBSbatCHTgtSknNGsnYksSkMk extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(料金スケジュール定義)*/
	private static final String D_TBL_NAME_CH_M_PRC_SCHDL_TEIGI = "CH_M_PRC_SCHDL_TEIGI";

	/** テーブル(債権)*/
	private static final String D_TBL_NAME_CH_T_SAIKEN = "CH_T_SAIKEN";

	/** テーブル(督促)*/
	private static final String D_TBL_NAME_CH_T_TOKUSOKU = "CH_T_TOKUSOKU";

	/** SQL定義キー(CH_SELECT_002)*/
	private static final String CH_M_PRC_SCHDL_TEIGI_CH_SELECT_002 = "CH_SELECT_002";

	/** SQL定義キー(CH_SELECT_023)*/
	private static final String CH_T_SAIKEN_CH_SELECT_023 = "CH_SELECT_023";

	/** SQL定義キー(CH_SELECT_012)*/
	private static final String CH_T_TOKUSOKU_CH_SELECT_012 = "CH_SELECT_012";

	/** テーブルアクセスクラス(料金スケジュール定義)*/
	private JBSbatSQLAccess db_CH_M_PRC_SCHDL_TEIGI = null;

	/** テーブルアクセスクラス(債権)*/
	private JBSbatSQLAccess db_CH_T_SAIKEN = null;

	/** テーブルアクセスクラス(督促)*/
	private JBSbatSQLAccess db_CH_T_TOKUSOKU = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/**▼▼▼▼▼▼クラス変数追加 開始▼▼▼▼▼▼*/
	
	/** ０（固定値） */
	private static final String ZERO = "0";
	
	/** 退避．支払期限日 */
	private String tmpPayKigenYmd = JACStrConst.KARA_MOJI;
	
	/** 退避．利用開始日 */
	private String tmpUseStaYmd = JACStrConst.KARA_MOJI;
	
	/** 退避．利用終了日 */
	private String tmpUseEndYmd = JACStrConst.KARA_MOJI;
	
	/** 桁数(同封コード) */
	private static final int DOFU_CD_LENGTH = 12;
	
	/** 請求収納業務共通クラス */
	private JCHbatSeikyKaknoBusinessUtil seikyUtil = 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);
		db_CH_T_SAIKEN = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_SAIKEN);
		db_CH_T_TOKUSOKU = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_T_TOKUSOKU);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		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 + "]");
		
		// インスタンス生成
		JCHbatSeikyKaknoBusinessUtil seikyuUtil = new JCHbatSeikyKaknoBusinessUtil(commonItem);
		
		// 請求年月取得
		
		// 請求年月
		String sikyYm = JACStrConst.KARA_MOJI;
		
		try
		{
			// バッチ運用日を基に過去最新の請求年月（請求処理日基準）を取得します。
			sikyYm = seikyuUtil.getBillYmContain(super.opeDate,		JACStrConst.EVENT_CD_SEIKY_SHORI_YMD);
		}
		finally
		{
			seikyuUtil.close();
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][sikyYm=" + sikyYm + "]");
		
		// 取得した請求年月を基に各退避情報を取得します。
		
		// 支払期限日
		this.tmpPayKigenYmd = this.getEventYmd(sikyYm,		JACStrConst.EVENT_CD_KOUZA_PAY_KIGEN_YMD);
		// 利用開始年月日
		this.tmpUseStaYmd = this.getEventYmd(sikyYm,		JACStrConst.EVENT_CD_USE_STAYMD);
		// 利用終了年月日
		this.tmpUseEndYmd = this.getEventYmd(sikyYm,		JACStrConst.EVENT_CD_USE_ENDYMD);
		
		seikyUtil = new JCHbatSeikyKaknoBusinessUtil(commonItem);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][支払期限日=" + this.tmpPayKigenYmd + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][利用開始年月日=" + this.tmpUseStaYmd + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][利用終了年月日=" + this.tmpUseEndYmd + "]");
		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();
		
		// 入力．発行抑止コード
		String inHakYoksiCd = inMap.getString(JBSbatCHIFM065.HAK_YOKSI_CD);
		
		// 入力．発行抑止コード　＝　"04"（合算請求抑止）
		// かつ、当月債権有無チェックで該当債権なしの場合
		if(JACStrConst.SEIKY_YOKSI_CD_GSN_SEIKY.equals(inHakYoksiCd)
			&& !this.isTgtSknUm(inMap))
		{
			// 出力情報設定
			this.setOutputItem(inMap, outputItem);
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_M_PRC_SCHDL_TEIGI.close();
		db_CH_T_SAIKEN.close();
		db_CH_T_TOKUSOKU.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		seikyUtil.close();
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * 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);
	}

	/**
	 * SQLKEY(CH_SELECT_023)で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_023(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アクセスを実行します
		db_CH_T_SAIKEN.selectBySqlDefine(paramList, CH_T_SAIKEN_CH_SELECT_023);
	}

	/**
	 * SQLKEY(CH_SELECT_012)で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_CH_SELECT_012(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());

		// DBアクセスを実行します
		db_CH_T_TOKUSOKU.selectBySqlDefine(paramList, CH_T_TOKUSOKU_CH_SELECT_012);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**▼▼▼▼▼▼メソッド追加 開始▼▼▼▼▼▼*/
	
	/**
	 * 引数で渡された請求年月、イベントコードを基に、
	 * 料金スケジュール定義を検索し、その結果を返却します。
	 * 
	 * @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);
	}
	
	/**
	 * 入力電文を基に債権スキーマを検索し、
	 * その存在の有無をチェックします。
	 * 
	 * @param inMap 入力電文
	 * @return boolean 検索結果（true:該当データあり、false:該当データなし）
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private boolean isTgtSknUm(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][isTgtSknUm]");
		
		// 取得結果
		boolean rslt = false;
		
		JBSbatCommonDBInterface whereParam = new JBSbatCommonDBInterface();
		
		// 請求先番号
		whereParam.setValue(inMap.getString(JBSbatCHIFM065.SEIKY_KEI_NO));
		// 請求年月
		whereParam.setValue(inMap.getString(JBSbatCHIFM065.SEIKY_YM));
		// 債権ステータス
		whereParam.setValue(JACStrConst.SAIKEN_STAT_FIX_SEIKY);
		// 債権ステータス
		whereParam.setValue(JACStrConst.SAIKEN_STAT_ICHIBU_KAKNO);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isTgtSknUm][whereParam=" + whereParam.getList().toString() + "]");
		
		// SQL実行
		this.executeCH_T_SAIKEN_CH_SELECT_023(whereParam.getList().toArray());
		
		// 検索結果取得
		JBSbatCommonDBInterface dbMap = this.db_CH_T_SAIKEN.selectNext();
		
		// 当月該当債権あり
		if(null != dbMap)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isTgtSknUm][当月該当債権あり]");
			// 処理結果にtrue（該当結果あり）を設定
			rslt = true;
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isTgtSknUm]");
		return rslt;
	}
	
	/**
	 * 入力電文を基に出力レコードを作成し、出力情報に設定します。
	 * 
	 * @param inMap 入力電文
	 * @param outputItem 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void setOutputItem(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputItem) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setOutputItem]");
		
		// 出力情報
		JBSbatServiceInterfaceMap outBean = new JBSbatServiceInterfaceMap();
		
		// 請求契約番号
		outBean.set(JBSbatCHIFM070.SEIKY_KEI_NO,				inMap.get(JBSbatCHIFM065.SEIKY_KEI_NO));
		// 請求年月
		outBean.set(JBSbatCHIFM070.SEIKY_YM,					inMap.get(JBSbatCHIFM065.SEIKY_YM));
		// 請求金額
		outBean.set(JBSbatCHIFM070.SEIKY_AMNT,					ZERO);
		// 支払期限年月日
		outBean.set(JBSbatCHIFM070.PAY_KIGEN_YMD,				this.tmpPayKigenYmd);
		// 利用開始年月日
		outBean.set(JBSbatCHIFM070.USE_STAYMD,					this.tmpUseStaYmd);
		// 利用終了年月日
		outBean.set(JBSbatCHIFM070.USE_ENDYMD,					this.tmpUseEndYmd);
		// 消費税額
		outBean.set(JBSbatCHIFM070.AMNT,						ZERO);
		// 同封コード
		outBean.set(JBSbatCHIFM070.DOFU_CD,						seikyUtil.fillString(FillType.HalfSpace, inMap.getString(JBSbatCHIFM065.SEIKY_KEI_NO), DOFU_CD_LENGTH, true));
		// 督促ステータス
		outBean.set(JBSbatCHIFM070.TOKUSOKU_STAT,				this.selectTokusoku(inMap));
		// 合算請求有無フラグ
		outBean.set(JBSbatCHIFM070.GSAN_SEIKY_UMU_FLG,			ZERO);
		// 前受け金相殺有無フラグ
		outBean.set(JBSbatCHIFM070.MAEUKKIN_SOSAI_UMU_FLG,		ZERO);
		// 領収証泣き別れ有無フラグ
		outBean.set(JBSbatCHIFM070.RECEIPT_NAKIWAKARE_UMU_FLG,	ZERO);
		
		// 出力フラグにtrueを設定
		outBean.setOutFlg(true);
		
		// 出力情報にレコードを設定
		outputItem.addOutMapList(outBean);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setOutputItem]");
	}
	
	/**
	 * 入力電文を基に督促を検索し、その結果を返却します。
	 * 
	 * @param inMap 入力電文
	 * @param outputItem 出力情報
	 * @return String 検索結果（取得ありの場合：督促．督促ステータス、なしの場合：""（空文字））
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private String selectTokusoku(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][selectTokusoku]");
		
		JBSbatCommonDBInterface whereParam = new JBSbatCommonDBInterface();
		
		// 請求先番号
		whereParam.setValue(inMap.get(JBSbatCHIFM070.SEIKY_KEI_NO));
		// 督促管理開始年月日
		whereParam.setValue(super.opeDate);
		// 督促管理終了年月日
		whereParam.setValue(super.opeDate);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][selectTokusoku][whereParam=" + whereParam.getList().toString() + "]");
		
		// SQL実行
		this.executeCH_T_TOKUSOKU_CH_SELECT_012(whereParam.getList().toArray());
		
		// 検索結果取得
		JBSbatCommonDBInterface dbMap = this.db_CH_T_TOKUSOKU.selectNext();
		
		// 返却文字列
		String tokusokuStat = JACStrConst.KARA_MOJI;
		
		// 取得結果ありの場合
		if(null != dbMap)
		{
			// 督促．督促ステータス設定
			tokusokuStat = dbMap.getString(JBSbatCH_T_TOKUSOKU.TOKUSOKU_STAT);
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][selectTokusoku][tokusokuStat=" + tokusokuStat + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][selectTokusoku]");
		return tokusokuStat;
	}
	
	/**▲▲▲▲▲▲メソッド追加 終了▲▲▲▲▲▲*/
}
