/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHFlrlmtChk
*	ソースファイル名	：JBSbatCHFlrlmtChk.java
*	作成者				：富士通　
*	作成日				：2012年05月27日
*＜機能概要＞
*　フロアリミットチェック部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v3.00		2012/05/27   FJ）冨井	【ANK-0024-04-00】処理名変更により新規作成
*	v3.01		2012/08/01   FJ）後藤	【TG1-2012-0000089】クレジットカード番号が空の場合の処理追加
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;
import java.util.ArrayList;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatCHIFM004;
import eo.business.util.file.JBSbatCHIFM167;
import eo.common.constant.JACStrConst;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHFlrlmtChk extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** フロアリミット額*/
	private BigDecimal floorLimitKingaku = null;

	
	/** 退避．クレジットカード番号（※初期値：NULL）*/
	private String tihCrecardNo = null;
	
	/** 退避．フロアリミット超過フラグ（※初期値："0"）*/
	private String tihFlorlmtOrverFlg = JACStrConst.FLOOR_LIMIT_CHOKA_FLG_IKA;
	
	/** 退避．クレジットカード番号合計金額（※初期値：0）*/
	private BigDecimal tihCrecardNoAmnt = BigDecimal.ZERO;
	
	/** 退避．入力リスト（※初期値：NULL）*/
	private ArrayList<JBSbatServiceInterfaceMap> tihInMapList = null;
	

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		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 + "]");
		
		// パラメータ取得クラス生成
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);
		
		// フロアリミット額取得（業務パラメータ管理検索）
		String floorLimit = paramUtil.getGyoumuParameter(JACStrConst.FLOOR_LIMIT_KINGAKU);
		this.floorLimitKingaku = new BigDecimal(floorLimit);
		
		// パラメータ取得クラスクローズ
		paramUtil.close();
		
		this.tihInMapList = new ArrayList<JBSbatServiceInterfaceMap>();
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @param outputInItem 入力情報
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert inMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][inMap = " + inMap.getMap().toString() + "]") : true;
		
		// キーブレイクチェック処理
		// 退避．クレジットカード番号 ≠ NULL（初回データ） の場合
		if(this.tihCrecardNo != null)
		{
			// 「入力情報 ＝ NULL（最終レコード）」 もしくは
			// 「退避．クレジットカード番号 ≠ 入力．クレジットカード番号」 の場合
			if(inMap == null || !inMap.getString(JBSbatCHIFM004.CRECARD_NO).equals(this.tihCrecardNo))
			{
				// 「1.2 フロアリミットチェック処理」を実施する。
				this.checkFloorLimit(this.tihCrecardNoAmnt);
				// 「1.3 ファイル出力処理」を実施する。
				this.makeOutPutInfoCre(outputInItem);
				
				// 入力情報 ＝ NULL（最終レコード）の場合
				if(inMap == null)
				{
					return outputInItem;
				}
				// 退避．クレジットカード番号合計金額　←　0
				// 退避．入力リスト　←　NULL
				// 退避．クレジットカード番号　←　入力．クレジットカード番号
				this.tihCrecardNoAmnt = BigDecimal.ZERO;
				this.tihInMapList = new ArrayList<JBSbatServiceInterfaceMap>();
				this.tihCrecardNo = inMap.getString(JBSbatCHIFM004.CRECARD_NO);
			}
		}
		
		// データ退避
		// 「退避．クレジットカード番号 ＝ NULL（初回レコード）」 もしくは
		// 「入力情報 ≠ NULL（最終レコード） かつ 退避．クレジットカード番号 ＝ 入力．クレジットカード番号」 の場合
		if(this.tihCrecardNo == null 
				|| (inMap != null && inMap.getString(JBSbatCHIFM004.CRECARD_NO).equals(this.tihCrecardNo)))
		{
			if(this.tihCrecardNo == null)
			{
				// ダミーレコード設定
				outputInItem.addOutMapList(new JBSbatServiceInterfaceMap());
			}
			// 退避．クレジットカード番号合計金額　←　退避．クレジットカード番号合計金額 ＋ 入力．金額
			this.tihCrecardNoAmnt = this.tihCrecardNoAmnt.add(inMap.getBigDecimal(JBSbatCHIFM004.SEIKY_AMNT));
			// 退避．入力リスト　←　入力情報
			this.tihInMapList.add(inMap);
			// 退避．クレジットカード番号　←　入力．クレジットカード番号
			this.tihCrecardNo = inMap.getString(JBSbatCHIFM004.CRECARD_NO);
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * フロアリミット超過判定を実施し、判定結果（フロアリミット超過フラグのコード値）を返します。
	 * 
	 * @param kingaku 請求内訳情報．金額
	 * @return 判定結果
	 * @throws Exception 
	 */
	private void checkFloorLimit(BigDecimal kingaku) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][checkFloorLimit]");
		if (floorLimitKingaku.compareTo(kingaku) < 0)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][checkFloorLimit][フロアリミット超過フラグ（フロアリミット超過）]");
			// フロアリミット超過
			this.tihFlorlmtOrverFlg = JACStrConst.FLOOR_LIMIT_CHOKA_FLG_CHOKA;
		}
		else
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][checkFloorLimit][フロアリミット超過フラグ（フロアリミット以下）]");
			// フロアリミット以下
			this.tihFlorlmtOrverFlg = JACStrConst.FLOOR_LIMIT_CHOKA_FLG_IKA;
		}
		
	}

	/**
	 * 請求情報（フロアリミットチェック結果付与）作成
	 * 
	 * @param outputInItem 出力共通電文
	 * @throws Exception 
	 */
	private void makeOutPutInfoCre(JBSbatOutputItem outputInItem) throws Exception
	{
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutPutInfoCre]");
		
		for(JBSbatServiceInterfaceMap inMap : tihInMapList)
		{
			// 請求情報（フロアリミットチェック結果付与）情報
			JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
			// 請求契約番号
			outMap.set(JBSbatCHIFM167.SEIKY_NO, inMap.get(JBSbatCHIFM004.SEIKY_NO));
			// フロアリミット超過フラグ
			outMap.set(JBSbatCHIFM167.FLORLMT_ORVER_FLG, this.tihFlorlmtOrverFlg);
			// 出力フラグON
			outMap.setOutFlg(true);
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutPutInfoCre][outMap=" + outMap.getMap().toString() + "]");
			
			// 出力共通電文設定
			outputInItem.addOutMapList(outMap);
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutPutInfoCre]");
		
		return;
	}
}
