/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom  					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACIcjknInfoReTonyuJudge
*	ソースファイル名	：JBSbatACIcjknInfoReTonyuJudge.java
*	作成者				：富士通　
*	作成日				：2011年07月21日
*＜機能概要＞
*　一時金情報再投入判定部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/07/21   富士通		新規作成
*	v8.00.00	2013/12/13   FJ)鈴木	【ANK-1794-00-00】L2-MVNO対応（請求書電話番号表示（LC含む））
*	v16.00.00	2015/06/12   FJ)西面	【ANK-2480-00-00】新電力対応
*********************************************************************/
package eo.business.service;


import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFM041;
import eo.business.util.file.JBSbatACIFM063;
import eo.common.constant.JACStrConst;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.util.JBSbatDateUtil;


/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACIcjknInfoReTonyuJudge extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 請求年月 */
	private String skyYm = null;
	
	/** 請求月前月 */
	private String prvSkyYm = null;
	
	/** 請求月末日 */
	private String skyYmdEnd = null;
	
	/** エラーコードセット */
	private String errCdSet = null;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		

		JACbatSchdlUtil su = new JACbatSchdlUtil(commonItem);
		JACbatParamUtil pu = new JACbatParamUtil(commonItem);
		try
		{
			// 請求年月
			this.skyYm = su.getBillDate(super.opeDate, JACStrConst.EVENT_CD_RYOKIN_KEISAN_YMD);
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "請求年月：" + this.skyYm);
			
			// 請求月末日
			String[] ymd = su.getUseStrEnd(this.skyYm, JACStrConst.EVENT_CD_USE_STAYMD, JACStrConst.EVENT_CD_USE_ENDYMD);
			this.skyYmdEnd = ymd[1];
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "請求月末日：" + this.skyYmdEnd);
			
			// エラーコードセット
			this.errCdSet = pu.getGyoumuParameter(JACStrConst.WKPARA_AC_IJK_RE_TRN_ERR_CD);
		}
		finally
		{
			su.close();
			pu.close();
		}

		// 請求月前月
		this.prvSkyYm = JBSbatDateUtil.adjustMonth(this.skyYm.concat("01"), -1).substring(0, 6);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "請求月前月：" + this.prvSkyYm);
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "請求契約番号:" +
								inMap.getString(JBSbatACIFM041.SEIKY_KEI_NO));

		// エラーコード
		String errCd = inMap.getString(JBSbatACIFM041.ERR_CD);
		
		// 請求年月
		String ym = inMap.getString(JBSbatACIFM041.SEIKY_YM);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "請求年月：" + ym);
		
		// 再投入エラー判定
		if(!this.errCdSet.matches(".*".concat(errCd).concat(".*")))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "判定1 再投入対象外");
			// 一時金再投入対象ではないため一時金エラー確定情報に出力
			return(this.makeOutItem(inMap));
		}
		
		// 再投入期間判定(一時金エラー情報.請求年月がALLスペース)
		if(ym.equals(JACStrConst.SEIKY_YM_SP))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "判定2 請求年月がスペースで対象外");
			// 一時金再投入対象ではないため一時金エラー確定情報に出力
			return(this.makeOutItem(inMap));
		}
		
		// 再投入期間判定(バッチ運用日が一時金エラー情報.請求年月の料金計算日を含む以前)
		if(ym.compareTo(this.skyYm) >= 0)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint,
								"判定3 当月再投入対象 請求年月:" + ym + " < バッチ運用日:" + this.skyYm );
			// 当月再投入対象のため一時金情報（当月/翌月再投入）に出力
			return(this.makeOutItem(inMap, JACStrConst.TOGTU_NEXT_JDG_FLG_T));
		}
		
		// 再投入期間判定(バッチ運用日が一時金エラー情報.請求年月の料金計算日翌月以内)
		if(ym.equals(this.prvSkyYm))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint,"請求年月(" + ym + ") = バッチ運用年月(" + this.prvSkyYm + ")");
			if(super.opeDate.compareTo(this.skyYmdEnd) > 0)
			// バッチ運用日が一時金エラー情報.請求年月の料金計算日翌月月末を超過
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint,"再投入対象外 料金計算日翌月月末を超過");
				// 一時金再投入対象ではないため一時金エラー確定情報に出力
				return(this.makeOutItem(inMap));
			}
			else
			// バッチ運用日が一時金エラー情報.請求年月の料金計算日翌月〜月末
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint,"翌月再投入対象 料金計算日翌月〜月末");
				// 翌月再投入対象のため一時金情報（当月/翌月再投入）に出力
				return(this.makeOutItem(inMap, JACStrConst.TOGTU_NEXT_JDG_FLG_N));
			}
		}
		
		
		// バッチ運用日が一時金エラー情報.請求年月の料金計算日翌月月末を超過
		// 一時金再投入対象ではないため一時金エラー確定情報に出力
		return(this.makeOutItem(inMap));
		
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	
	/**
	 * 一時金エラー確定情報を作成
	 * 
	 * @param inMap　一時金エラー情報
	 * @return JBSbatOutputItem　一時金エラー確定情報
	 * @throws Exception　業務サービス内で発生した例外全般
	 */
	private JBSbatOutputItem makeOutItem(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		JBSbatOutputItem outItem = new JBSbatOutputItem();
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		outMap.setString(JBSbatACIFM041.ERR_CD,
				inMap.getString(JBSbatACIFM041.ERR_CD));				// エラーコード
		outMap.setString(JBSbatACIFM041.ICJKN_ADD_SEQ,
				inMap.getString(JBSbatACIFM041.ICJKN_ADD_SEQ));			// 一時金登録番号
		outMap.setString(JBSbatACIFM041.ICJKN_UPD_SEQ,
				inMap.getString(JBSbatACIFM041.ICJKN_UPD_SEQ));			// 一時金更新枝番
		outMap.setString(JBSbatACIFM041.SEIKY_KEI_NO,
				inMap.getString(JBSbatACIFM041.SEIKY_KEI_NO));			// 請求契約番号
		outMap.setString(JBSbatACIFM041.SEIKY_YM,
				inMap.getString(JBSbatACIFM041.SEIKY_YM));				// 請求年月
		outMap.setString(JBSbatACIFM041.TONYU_DIV,
				inMap.getString(JBSbatACIFM041.TONYU_DIV));				// 投入区分
		outMap.setString(JBSbatACIFM041.SVC_KEI_NO,
				inMap.getString(JBSbatACIFM041.SVC_KEI_NO));			// サービス契約番号
		outMap.setString(JBSbatACIFM041.PRC_GRP_CD,
				inMap.getString(JBSbatACIFM041.PRC_GRP_CD));			// 料金グループコード 
		outMap.setString(JBSbatACIFM041.PCRS_CD,
				inMap.getString(JBSbatACIFM041.PCRS_CD));				// 料金コースコード
		outMap.setString(JBSbatACIFM041.PRC_SVC_CD,
				inMap.getString(JBSbatACIFM041.PRC_SVC_CD));			// 料金サービスコード
		outMap.setString(JBSbatACIFM041.PRC_KMK_CD,
				inMap.getString(JBSbatACIFM041.PRC_KMK_CD));			// 料金項目コード
		outMap.setString(JBSbatACIFM041.TRGT_PCRS_CD,
				inMap.getString(JBSbatACIFM041.TRGT_PCRS_CD));			// 対象料金コースコード
		outMap.setString(JBSbatACIFM041.TRGT_PRC_SVC_CD,
				inMap.getString(JBSbatACIFM041.TRGT_PRC_SVC_CD));		// 対象料金サービスコード
		outMap.setString(JBSbatACIFM041.TRGT_PRC_KMK_CD,
				inMap.getString(JBSbatACIFM041.TRGT_PRC_KMK_CD));		// 対象料金項目コード
		outMap.setString(JBSbatACIFM041.USE_STAYMD,
				inMap.getString(JBSbatACIFM041.USE_STAYMD));			// 利用開始年月日
		outMap.setBigDecimal(JBSbatACIFM041.ICJKN_PRC,
				inMap.getBigDecimal(JBSbatACIFM041.ICJKN_PRC));			// 一時金料金
		outMap.setString(JBSbatACIFM041.ICJKN_TRKM_STAT,
				inMap.getString(JBSbatACIFM041.ICJKN_TRKM_STAT));		// 一時金取込ステータス
		outMap.setString(JBSbatACIFM041.ICJKN_TRKM_RSLT_CD,
				inMap.getString(JBSbatACIFM041.ICJKN_TRKM_RSLT_CD));		// 一時金取込結果コード
		outMap.setBigDecimal(JBSbatACIFM041.TRKM_ZUMI_AMNT,
				inMap.getBigDecimal(JBSbatACIFM041.TRKM_ZUMI_AMNT));	// 取込済額
		outMap.setBigDecimal(JBSbatACIFM041.TRKM_ZAN_AMNT,
				inMap.getBigDecimal(JBSbatACIFM041.TRKM_ZAN_AMNT));		// 取込残額
		outMap.setString(JBSbatACIFM041.SVC_DTL_SKBT_NO,
				inMap.getString(JBSbatACIFM041.SVC_DTL_SKBT_NO));	// サービス詳細識別番号
//v16.00.00 2015/06/12 Add Start
		outMap.setString(JBSbatACIFM041.TOGTU_EOELEC_USE_STAYMD,
				inMap.getString(JBSbatACIFM041.TOGTU_EOELEC_USE_STAYMD));	// 当月電気利用開始年月日
		outMap.setString(JBSbatACIFM041.TOGTU_EOELEC_USE_ENDYMD,
				inMap.getString(JBSbatACIFM041.TOGTU_EOELEC_USE_ENDYMD));	// 当月電気利用終了年月日
//v16.00.00 2015/06/12 Add End

		// 出力
		outMap.setOutFlg(true);
		
		// 登録
		outItem.addOutMapList_2(outMap);
		
		
		return(outItem);
	}
	
	
	/**
	 * 一時金情報（当月／翌月再投入）
	 * 
	 * @param inMap　一時金エラー情報
	 * @param flg　当月／翌月判定フラグ
	 * @return JBSbatOutputItem　一時金情報（当月／翌月再投入）
	 * @throws Exception　業務サービス内で発生した例外全般
	 */
	private JBSbatOutputItem makeOutItem(JBSbatServiceInterfaceMap inMap, String flg) throws Exception
	{
		JBSbatOutputItem outItem = new JBSbatOutputItem();
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		outMap.setString(JBSbatACIFM063.ICJKN_ADD_SEQ,
				inMap.getString(JBSbatACIFM041.ICJKN_ADD_SEQ));			// 一時金登録番号
		outMap.setString(JBSbatACIFM063.ICJKN_UPD_SEQ,
				inMap.getString(JBSbatACIFM041.ICJKN_UPD_SEQ));			// 一時金更新枝番
		outMap.setString(JBSbatACIFM063.SEIKY_KEI_NO,
				inMap.getString(JBSbatACIFM041.SEIKY_KEI_NO));			// 請求契約番号
		outMap.setString(JBSbatACIFM063.SEIKY_YM,
				inMap.getString(JBSbatACIFM041.SEIKY_YM));				// 請求年月
		outMap.setString(JBSbatACIFM063.TONYU_DIV,
				inMap.getString(JBSbatACIFM041.TONYU_DIV));				// 投入区分
		outMap.setString(JBSbatACIFM063.SVC_KEI_NO,
				inMap.getString(JBSbatACIFM041.SVC_KEI_NO));			// サービス契約番号
		outMap.setString(JBSbatACIFM063.PRC_GRP_CD,
				inMap.getString(JBSbatACIFM041.PRC_GRP_CD));			// 料金グループコード
		outMap.setString(JBSbatACIFM063.PCRS_CD,
				inMap.getString(JBSbatACIFM041.PCRS_CD));				// 料金コースコード
		outMap.setString(JBSbatACIFM063.PRC_SVC_CD,
				inMap.getString(JBSbatACIFM041.PRC_SVC_CD));			// 料金サービスコード
		outMap.setString(JBSbatACIFM063.PRC_KMK_CD,
				inMap.getString(JBSbatACIFM041.PRC_KMK_CD));			// 料金項目コード
		outMap.setString(JBSbatACIFM063.TRGT_PCRS_CD,
				inMap.getString(JBSbatACIFM041.TRGT_PCRS_CD));			// 対象料金コースコード
		outMap.setString(JBSbatACIFM063.TRGT_PRC_SVC_CD,
				inMap.getString(JBSbatACIFM041.TRGT_PRC_SVC_CD));		// 対象料金サービスコード
		outMap.setString(JBSbatACIFM063.TRGT_PRC_KMK_CD,
				inMap.getString(JBSbatACIFM041.TRGT_PRC_KMK_CD));		// 対象料金項目コード
		outMap.setString(JBSbatACIFM063.USE_STAYMD,
				inMap.getString(JBSbatACIFM041.USE_STAYMD));			// 利用開始年月日
		outMap.setBigDecimal(JBSbatACIFM063.ICJKN_PRC,
				inMap.getBigDecimal(JBSbatACIFM041.ICJKN_PRC));			// 一時金料金
		outMap.setString(JBSbatACIFM063.ICJKN_TRKM_STAT,
				inMap.getString(JBSbatACIFM041.ICJKN_TRKM_STAT));		// 一時金取込ステータス
		outMap.setString(JBSbatACIFM063.ICJKN_TRKM_RSLT_CD,
				inMap.getString(JBSbatACIFM041.ICJKN_TRKM_RSLT_CD));		// 一時金取込結果コード
		outMap.setBigDecimal(JBSbatACIFM063.TRKM_ZUMI_AMNT,
				inMap.getBigDecimal(JBSbatACIFM041.TRKM_ZUMI_AMNT));	// 取込済額
		outMap.setBigDecimal(JBSbatACIFM063.TRKM_ZAN_AMNT,
				inMap.getBigDecimal(JBSbatACIFM041.TRKM_ZAN_AMNT));		// 取込残額
		outMap.setString(JBSbatACIFM063.TOGTU_NEXT_JDG_FLG, flg);		// 当月／翌月判定フラグ
		outMap.setString(JBSbatACIFM063.SVC_DTL_SKBT_NO,
				inMap.getString(JBSbatACIFM041.SVC_DTL_SKBT_NO));	// サービス詳細識別番号
//v16.00.00 2015/06/12 Add Start
		outMap.setString(JBSbatACIFM063.TOGTU_EOELEC_USE_STAYMD,
				inMap.getString(JBSbatACIFM041.TOGTU_EOELEC_USE_STAYMD));	// 当月電気利用開始年月日
		outMap.setString(JBSbatACIFM063.TOGTU_EOELEC_USE_ENDYMD,
				inMap.getString(JBSbatACIFM041.TOGTU_EOELEC_USE_ENDYMD));	// 当月電気利用終了年月日
//v16.00.00 2015/06/12 Add End

		// 出力
		outMap.setOutFlg(true);
		
		// 登録
		outItem.addOutMapList(outMap);
		
		
		return(outItem);
	}
}
