/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHDbleNyukinInfBunkatsu
*	ソースファイル名	：JBSbatCHDbleNyukinInfBunkatsu.java
*	作成者				：富士通　
*	作成日				：2011年09月06日
*＜機能概要＞
*　重複入金情報分割部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/09/06   富士通		新規作成
*	v3.00		2012/05/30   FJ)山下	【ANK-0024-04-00】処理見直しによる修正
*	v3.01		2012/08/03   FJ）冨井	【TGI-2012-0000054】ダミーレコード設定位置修正
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatCHIFM068;
import eo.common.constant.JACStrConst;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;

/**
* 重複入金情報分割部品 <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHDbleNyukinInfBunkatsu extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 請求契約番号(work) */
	private String wkSeikyKeiNo = null;

	/** 入金番号(work) */
	private String wkNyukinNo = null;
	
	/** 退避．入力情報リスト */
	private ArrayList<JBSbatServiceInterfaceMap> wkInMapList = null;
	
	/** 退避．債権番号マップ */
	private ArrayList<String> wkSaikeNoList = 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, "[L][initial][opeDate=" + super.opeDate + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][freeItem=" + super.freeItem + "]");
		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;
		
		//1件目のレコードの場合
		if(!outputInItem.isOutMapList())
		{
			// ダミーレコードセット
			outputInItem.addOutMapList(new JBSbatServiceInterfaceMap());
		}
		
		// 入力情報退避
		// 入力情報 ＝ NULL の場合（最終処理）
		if(inMap == null)
		{
			// 「重複入金判定」を実施する。
			this.dbleNyukinJudge(outputInItem);
			return outputInItem;
		}
		
		// 退避．請求契約番号 ＝ NULL の場合（初回処理）
		if(this.wkSeikyKeiNo == null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][退避．請求契約番号 ＝ NULL の場合（初回処理）]");
			// 退避．請求契約番号　←　入力．請求契約番号
			// 退避．入金番号　←　入力．入金番号
			// 退避．入力情報リスト　←　入力の全情報
			this.wkNyukinNo 	= inMap.getString(JBSbatCHIFM068.NYUKIN_NO);
			this.wkSeikyKeiNo 	= inMap.getString(JBSbatCHIFM068.SEIKY_KEI_NO);
			this.wkInMapList 	= new ArrayList<JBSbatServiceInterfaceMap>(); 
			this.wkSaikeNoList = new ArrayList<String>();
			this.wkInMapList.add(inMap);
		}
		// 退避．請求契約番号 ＝ 入力．請求契約番号 の場合
		else if(this.wkSeikyKeiNo.equals(inMap.getString(JBSbatCHIFM068.SEIKY_KEI_NO)))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][退避．請求契約番号 ＝ 入力．請求契約番号 の場合]");
			// 退避．入金番号 ＝ 入力．入金番号 の場合
			if(this.wkNyukinNo.equals(inMap.getString(JBSbatCHIFM068.NYUKIN_NO)))
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][退避．入金番号 ＝ 入力．入金番号 の場合]");
				// 退避．入力情報リスト　←　入力の全情報
				this.wkInMapList.add(inMap);
			}
			// 退避．入金番号 ≠ 入力．入金番号 の場合
			else
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][退避．入金番号 ≠ 入力．入金番号 の場合]");
				// 「重複入金判定」を実施する。
				this.dbleNyukinJudge(outputInItem);
				// 退避．入金番号　←　入力．入金番号
				this.wkNyukinNo = inMap.getString(JBSbatCHIFM068.NYUKIN_NO);
				// 退避．入力情報リスト　←　入力の全情報
				this.wkInMapList.add(inMap);

			}
		}
		// 退避．請求契約番号 ≠ 入力．請求契約番号 の場合
		else
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][退避．請求契約番号 ≠ 入力．請求契約番号 の場合]");
			// 「重複入金判定」を実施する。
			this.dbleNyukinJudge(outputInItem);
			// 退避．請求契約番号　←　入力．請求契約番号
			// 退避．入金番号　　　←　入力．入金番号
			// 退避．入力情報リスト←　入力の全情報
			// 退避．債権番号マップを初期化する。
			this.wkNyukinNo 	= inMap.getString(JBSbatCHIFM068.NYUKIN_NO);
			this.wkSeikyKeiNo 	= inMap.getString(JBSbatCHIFM068.SEIKY_KEI_NO);
			this.wkInMapList.add(inMap);
			this.wkSaikeNoList.clear();

		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute][outputInItem=" + outputInItem.getOutMapList().toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 重複入金判定を行います。
	 * 
	 * @param outputBean 出力電文
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void dbleNyukinJudge(JBSbatOutputItem outputBean) throws Exception 
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][dbleNyukinJudge]");
		// 判定用フラグ
		boolean judgeFlg = false;
		// 重複入金判定
		if(judgeSvcSkbt())
		/*
		 *  入力情報リストにサービス識別が"2"のデータのみ存在する場合
		 */
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][dbleNyukinJudge][退避している全ての入力情報（サービス識別＝2（入金料金情報）となっている情報のみ）]");
			for(JBSbatServiceInterfaceMap tempMap : this.wkInMapList)
			{
				// 重複入金・未収債権情報を出力
				tempMap.setOutFlg(true);
				outputBean.addOutMapList_2(tempMap);
				assert tempMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][dbleNyukinJudge][tempMap=" + tempMap.getMap().toString() + "]") : true;
			}
		}
		else
		/*
		 *  上記以外
		 */
		{
			for(int i = 0; i < this.wkInMapList.size(); i++)
			{
				JBSbatServiceInterfaceMap inMap = this.wkInMapList.get(i);
				// 退避している全ての入力情報（サービス識別＝"1"（未収債権情報）となっている情報のみ）
				if(JACStrConst.SVC_SKBT_MISYU_SAIKEN.equals(inMap.getString(JBSbatCHIFM068.SVC_SKBT)))
				{
					
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][dbleNyukinJudge][退避している全ての入力情報（サービス識別＝1（未収債権情報）となっている情報のみ）]");
					// 退避．入力情報リスト[債権番号] が 退避．債権番号マップ に存在しているかどうかチェック
					if(this.wkSaikeNoList.contains(inMap.getString(JBSbatCHIFM068.SAIKEN_NO)))
					{
						assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][dbleNyukinJudge][退避．債権番号マップにあり]");
						// フラグ設定
						judgeFlg = true;
					}
				}
			}
			if(judgeFlg)
			{
				for(int j = 0; j < this.wkInMapList.size(); j++)
				{
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][dbleNyukinJudge][退避．債権番号マップにあり]");
					
					// 重複入金・未収債権情報を出力
					JBSbatServiceInterfaceMap inMapAri = this.wkInMapList.get(j);
					// ファイル出力する
					inMapAri.setOutFlg(true);
					outputBean.addOutMapList_2(inMapAri);
					assert inMapAri != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][dbleNyukinJudge][inMap=" + inMapAri.getMap().toString() + "]") : true;
				}
			}
			else
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][dbleNyukinJudge][退避．債権番号マップになし]");
				for(int j = 0; j < this.wkInMapList.size(); j++)
				{
					// 入金・未収債権情報（重複入金情報なし）を出力
					JBSbatServiceInterfaceMap inMapNsi = this.wkInMapList.get(j);
					// ファイル出力する
					inMapNsi.setOutFlg(true);
					outputBean.addOutMapList(inMapNsi);
					assert inMapNsi != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][dbleNyukinJudge][inMap=" + inMapNsi.getMap().toString() + "]") : true;
				}
			}
			// 債権マップ追加
			for(int i = 0; i < this.wkInMapList.size(); i++)
			{
				JBSbatServiceInterfaceMap inMap = this.wkInMapList.get(i);
				// 退避している全ての入力情報（サービス識別＝"1"（未収債権情報）となっている情報のみ）
				if(JACStrConst.SVC_SKBT_MISYU_SAIKEN.equals(inMap.getString(JBSbatCHIFM068.SVC_SKBT)))
				{
					// 退避．入力情報リスト[債権番号] を 退避．債権番号マップ へ追加する
					this.wkSaikeNoList.add(inMap.getString(JBSbatCHIFM068.SAIKEN_NO));
				}
			}
		}
		// 退避．入力情報リストを初期化
		this.wkInMapList.clear();

		return;
	}

	/**
	 * 「サービス識別≠"2"」の入力情報が退避．入力情報リストに含まれているかどうかを判定します。
	 * 
	 * @return boolean   true（退避している全ての入力情報がサービス識別＝"2"）/false（それ以外）
	 * @throws Exception 業務サービス内で発生した例外全般
	 */

	private boolean judgeSvcSkbt() throws Exception {
		boolean result = true;
		// 退避している全ての入力情報を退避リストから取得
		for(JBSbatServiceInterfaceMap tempMap : this.wkInMapList)
		{
			// サービス識別≠"2"（入金料金情報）の入力情報があった場合
			if(!JACStrConst.SVC_SKBT_NYUKIN.equals(tempMap.getString(JBSbatCHIFM068.SVC_SKBT)))
			{
				// フラグ設定
				result = false;
			}
		}
		return result;
	}
	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
		
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
