/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHTkskJskSksiForTrank
*	ソースファイル名	：JBSbatCHTkskJskSksiForTrank.java
*	作成者				：富士通　
*	作成日				：2016年05月06日
*＜機能概要＞
*　TRANK向け督促実績作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v26.00.00	2016/05/06  FJ）三宅	新規作成
*	v26.00.01	2016/08/25  FJ）三宅	ST-2016-0000031
*	v26.00.02	2016/09/06  FJ）三宅	IT1-2016-0000121
*********************************************************************/
package eo.business.service;

import java.util.Arrays;
import java.util.HashSet;

import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatCHIFM263;
import eo.business.util.file.JBSbatCHIFM264;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHTkskJskSksiForTrank extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 督促ステータス（利用停止済） */
	private static final String TOKUSOKU_STAT_USE_STOP = "20";
	
	/** 督促ステータス（強制解約済） */
	private static final String TOKUSOKU_STAT_KSI_DSL = "30";
	
	/** 督促ステータス（強制解約通知済） */
	private static final String TOKUSOKU_STAT_KSI_DSL_TSUCHI = "40";
	
	/** 督促ステータス（催告状通知済） */
	private static final String TOKUSOKU_STAT_SAIKOKU_TSUCHI = "41";
	
	/** 督促ステータス（法的措置・ニッテレ委託予告済） */
	private static final String TOKUSOKU_STAT_HOUTEKI_NITTERE = "50";
	
	/** 督促ステータス（法的措置対象） */
	private static final String TOKUSOKU_STAT_HOUTEKI = "60";
	
	/** 督促ステータス（ニッテレ債権委託済） */
	private static final String TOKUSOKU_STAT_NITTERE = "61";
	
	/** 督促ステータス（小額債権） */
	private static final String TOKUSOKU_STAT_SAIKEN = "62";
	
	/** 督促ステータス（貸倒登録済） */
	private static final String TOKUSOKU_STAT_KSDOR = "90";
	
	/** 処理対象督促ステータス */
	private static final String[] TRGT_TOKUSOKU_STAT= {
		TOKUSOKU_STAT_USE_STOP, 
		TOKUSOKU_STAT_KSI_DSL, 
		TOKUSOKU_STAT_KSI_DSL_TSUCHI, 
		TOKUSOKU_STAT_SAIKOKU_TSUCHI, 
		TOKUSOKU_STAT_HOUTEKI_NITTERE,
		TOKUSOKU_STAT_HOUTEKI, 
		TOKUSOKU_STAT_NITTERE, 
		TOKUSOKU_STAT_SAIKEN, 
		TOKUSOKU_STAT_KSDOR, 
	};
	
	/** 退避 請求先番号 */
	private String bkSeikySakiNo = null;
	
	/** キーブレイク用請求先番号List */
// v26.00.01 MOD START
//	private ArrayList<String> seikySakiList = null;
	HashSet<String> seikySakiSet = null;
// v26.00.01 MOD END

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		// キーブレイク用請求先番号リストを初期化
// v26.00.01 MOD START
//		seikySakiList = new ArrayList<String>();
		seikySakiSet = new HashSet<String>();
// v26.00.01 MOD END
		
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
		}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @param outputInItem 入力情報
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		String seikySakiNo    = inMap.getString(JBSbatCHIFM263.SEIKY_SAKI_NO);
		String tokusokuIdoYmd = inMap.getString(JBSbatCHIFM263.TOKUSOKU_IDO_YMD);
		String tokusokuStat   = inMap.getString(JBSbatCHIFM263.TOKUSOKU_STAT);
		
		if(this.bkSeikySakiNo == null || !this.bkSeikySakiNo.equals(seikySakiNo))
		{
			//-----------------------------
			// 初めて処理する請求先番号
			//-----------------------------
			if(tokusokuIdoYmd.compareTo(super.opeDate) < 0)
			{
				//------------------------------------------------------
				// 「督促履歴情報．督促異動年月日 < 基準日の前月1日」
				//  ※opeDateには、基準日の前月1日が設定されている）
				//------------------------------------------------------
				if(Arrays.asList(TRGT_TOKUSOKU_STAT).contains(tokusokuStat))
				{
					// レコード出力
					this.setOuptputItem(inMap, outputInItem);
				}
				// キーブレイク用請求先番号Listに追加
// v26.00.01 MOD START
//				seikySakiList.add(seikySakiNo);
				seikySakiSet.add(seikySakiNo);
// v26.00.01 MOD END
			}
			else
			{
				//------------------------------------------------------
				// 「督促履歴情報．督促異動年月日 < 基準日の前月1日」
				//  ※opeDateには、基準日の前月1日が設定されている）
				//------------------------------------------------------
				if(Arrays.asList(TRGT_TOKUSOKU_STAT).contains(tokusokuStat))
				{
					// レコード出力
					this.setOuptputItem(inMap, outputInItem);
					// キーブレイク用請求先番号Listに追加
// v26.00.01 MOD START
//					seikySakiList.add(seikySakiNo);
					seikySakiSet.add(seikySakiNo);
// v26.00.01 MOD END
				}
			}
			
			// 退避請求先番号に処理した請求先番号を設定
			this.bkSeikySakiNo = seikySakiNo;
		}
		else
		{
			//-----------------------------
			// 前回と同じ請求先番号
			//-----------------------------
			if(tokusokuIdoYmd.compareTo(super.opeDate) < 0)
			{
				// 「督促履歴情報．督促異動年月日 < 基準日の前月1日」の場合、キーブレイク用請求先番号Listに追加
// v26.00.01 MOD START
//				seikySakiList.add(seikySakiNo);
				seikySakiSet.add(seikySakiNo);
// v26.00.01 MOD END
			}
// v26.00.01 MOD START
//			if(Arrays.asList(TRGT_TOKUSOKU_STAT).contains(tokusokuStat) && !seikySakiList.contains(seikySakiNo))
			if(Arrays.asList(TRGT_TOKUSOKU_STAT).contains(tokusokuStat) && !seikySakiSet.contains(seikySakiNo))
// v26.00.01 MOD END
			{
				// 対象の督促ステータス＆出力ファイル未設定の請求先番号（出力済でない＆督促異動日が基準日の前月月初以降）
				// レコード出力
				this.setOuptputItem(inMap, outputInItem);
// v26.00.02 ADD START
				seikySakiSet.add(seikySakiNo);
// v26.00.02 ADD END
			}
		}
		
		return outputInItem;
		/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * マスタファイル情報で出力情報を設定します。
	 * 
	 * @param inMap 入力情報
	 * @param outputInItem 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void setOuptputItem(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
		JBSbatServiceInterfaceMap outputMap = new JBSbatServiceInterfaceMap(); // 出力情報
		
		outputMap.setString(JBSbatCHIFM264.SEIKY_SAKI_NO,    inMap.get(JBSbatCHIFM263.SEIKY_SAKI_NO));		// 請求先番号
		outputMap.setString(JBSbatCHIFM264.TOKUSOKU_STAT,    inMap.get(JBSbatCHIFM263.TOKUSOKU_STAT));		// 督促ステータス
		outputMap.setString(JBSbatCHIFM264.TOKUSOKU_IDO_YMD, inMap.get(JBSbatCHIFM263.TOKUSOKU_IDO_YMD));	// 督促異動年月日
		
		// 出力フラグをtrue
		outputMap.setOutFlg(true);
		
		// 出力レコード情報を設定する
		outputInItem.addOutMapList(outputMap);
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
