/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACWribTrgGaiInfoAdd
*	ソースファイル名	：JBSbatACWribTrgGaiInfoAdd.java
*	作成者				：富士通　
*	作成日				：2011年05月31日
*＜機能概要＞
*　割引対象外情報追加部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/05/31   富士通		新規作成
*	v3.00.00	2012/08/06   FJ)田辺	【IT2-2012-0001516】UI残No.830対応
*	v5.00.00	2013/05/10   FJ)小柴	【SG1-2013-0000082】ファイル区分１、２の両レコードが存在する場合に、常に区分１のデータを出力するように修正
*********************************************************************/
package eo.business.service;

import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFM059;
import eo.business.util.file.JBSbatACIFM060;
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 JBSbatACWribTrgGaiInfoAdd extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/**▼▼▼▼▼▼クラス変数追加 開始▼▼▼▼▼▼*/
	
	/** 退避．キー */
	private String tmpKey = null;

	/** ワーク．キー */
	private String wkKey = null;
	
	/** 退避．請求契約番号 */
	private String tmpSeikyKeiNo = "";	

	/** 退避．請求年月 */
	private String tmpSeikyYm = "";	
	
	/** 出力フラグ  */
	private boolean outFlg = false;

	
	/**▲▲▲▲▲▲クラス変数追加 終了▲▲▲▲▲▲*/

	/**
	 * 初期処理
	 * @param commonItem バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap 入力電文
	 * @param outputInItem 入力情報
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/

		JBSbatServiceInterfaceMap outrecMap = null; 	// 出力レコード電文

		// ワークキーを設定する
		wkKey = getWkKey(inMap);
	
		//初回読み込み時
		if (tmpKey == null)
		{
			tmpKey = wkKey;
			// 出力情報を設定(ダミーレコード)
			outrecMap = getWribPrcInfo_trn(tmpSeikyKeiNo,tmpSeikyYm);
			outrecMap.setOutFlg(false);
			outputInItem.addOutMapList(outrecMap);
		}
		// 最終読み込み時処理
		if (inMap == null)
		{
			// 出力レコードが存在する場合
			if (outputInItem != null)
			{
				int listLen = outputInItem.getOutMapList().size();
				for (int i = 1; i < listLen; i++)
				{
					outrecMap = (JBSbatServiceInterfaceMap)outputInItem.getOutMapList().get(i);
					// 出力情報を設定
					outrecMap.setOutFlg(true);
					outFlg = true;
				}
			}
			// 請求契約番号単位でファイル区分が"1"の出力レコードが存在しない場合
			if(!outFlg)
			{
				// 出力情報を設定
				outrecMap = getWribPrcInfo_trn(tmpSeikyKeiNo,tmpSeikyYm);
				outrecMap.setOutFlg(true);
				outputInItem.addOutMapList(outrecMap);
			}
			return outputInItem;
		}

		// 退避．キー　≠　WKキーの場合
		if (!tmpKey.equals(wkKey))
		{
			// 出力レコード（先頭）が存在する場合
			if (outputInItem != null)
			{
				int listLen = outputInItem.getOutMapList().size();
				for (int i = 1 ; i < listLen; i++)
				{
					outrecMap = (JBSbatServiceInterfaceMap)outputInItem.getOutMapList().get(i);
					// 出力情報を設定
					outrecMap.setOutFlg(true);
				}
				if (listLen > 1)
				{
					outFlg = true;
				}
			}
			// 請求契約番号でブレークした場合
			if(!tmpSeikyKeiNo.equals(inMap.getString(JBSbatACIFM060.SEIKY_KEI_NO)))
			{
				// 請求契約番号単位でファイル区分が"1"の出力レコードが存在しない場合
				if(!outFlg)
				{
					// 出力情報を設定
					outrecMap = getWribPrcInfo_trn(tmpSeikyKeiNo,tmpSeikyYm);
					outrecMap.setOutFlg(true);
					outputInItem.addOutMapList(outrecMap);
				}
			}
		}

		// ファイル区分　＝　"1"（マスタ）の場合
		if (JACStrConst.FILE_DIV_MST.equals(inMap.getString(JBSbatACIFM060.FILE_DIV)))
		{
			// 料金が0円でない場合、出力レコード電文に設定する
			if(0 !=  inMap.getBigDecimal(JBSbatACIFM060.PRC).intValue()){
				// 出力情報を設定
				outrecMap = getWribPrcInfo(inMap);
				outrecMap.setOutFlg(false);
				outputInItem.addOutMapList(outrecMap);
			}
		}
		// ファイル区分　＝　"2"（トラン）の場合
		if (JACStrConst.FILE_DIV_TRN.equals(inMap.getString(JBSbatACIFM060.FILE_DIV)))
		{
			// 請求契約番号でブレークした場合
			if(!tmpSeikyKeiNo.equals(inMap.getString(JBSbatACIFM060.SEIKY_KEI_NO)))
			{
				// 出力フラグをfalse
				outFlg = false;
			}
			// 請求年月を退避する
			tmpSeikyYm = inMap.getString(JBSbatACIFM060.SEIKY_YM);
		}
		
		// キー退避
		tmpKey = wkKey;
		// 請求契約番号を退避する
		tmpSeikyKeiNo = inMap.getString(JBSbatACIFM060.SEIKY_KEI_NO);

		
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼メソッド追加 開始▼▼▼▼▼▼*/

	/**
	 * 割引料金情報（割引対象外含む）に出力情報を取得する。
	 * 
	 * @param inMap 入力情報
	 * @return JBSbatServiceInterfaceMap 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private JBSbatServiceInterfaceMap getWribPrcInfo(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		outMap.setString(JBSbatACIFM059.SEIKY_KEI_NO, 			inMap.get(JBSbatACIFM060.SEIKY_KEI_NO));		// 請求先番号
		outMap.setString(JBSbatACIFM059.SEIKY_YM, 				inMap.get(JBSbatACIFM060.SEIKY_YM));			// 請求年月
		outMap.setString(JBSbatACIFM059.WRIB_SVC_KEI_NO, 		inMap.get(JBSbatACIFM060.WRIB_SVC_KEI_NO));		// 割引サービス契約番号
		outMap.setString(JBSbatACIFM059.WRISVC_TRGT_KEI_NO, 	inMap.get(JBSbatACIFM060.WRISVC_TRGT_KEI_NO));	// 割引サービス対象契約番号
		outMap.setString(JBSbatACIFM059.SVC_NO,					inMap.get(JBSbatACIFM060.SVC_NO));				// サービス番号
		outMap.setString(JBSbatACIFM059.SVC_CD,					inMap.get(JBSbatACIFM060.SVC_CD));				// サービス識別
		outMap.setString(JBSbatACIFM059.PCRS_CD,				inMap.get(JBSbatACIFM060.PCRS_CD));				// 料金コースコード
		outMap.setString(JBSbatACIFM059.PRC_SVC_CD,				inMap.get(JBSbatACIFM060.PRC_SVC_CD));			// 料金サービスコード
		outMap.setString(JBSbatACIFM059.PRC_KMK_CD,				inMap.get(JBSbatACIFM060.PRC_KMK_CD));			// 料金項目コード
		outMap.setBigDecimal(JBSbatACIFM059.PRC,				inMap.get(JBSbatACIFM060.PRC));					// 料金
		outMap.setString(JBSbatACIFM059.USE_STAYMD,				inMap.get(JBSbatACIFM060.USE_STAYMD));			// 利用開始日
		outMap.setString(JBSbatACIFM059.USE_ENDYMD,				inMap.get(JBSbatACIFM060.USE_ENDYMD));			// 利用終了日
		outMap.setString(JBSbatACIFM059.AIT_DIV,				inMap.get(JBSbatACIFM060.AIT_DIV));				// 相対区分
		outMap.setString(JBSbatACIFM059.SIME_DAY,				inMap.get(JBSbatACIFM060.SIME_DAY));			// 締め日

		return outMap;
	}

	/**
	 * 割引料金情報（割引対象外含む）に出力情報を取得する。
	 * 
	 * @param inMap 入力情報
	 * @return JBSbatServiceInterfaceMap 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private JBSbatServiceInterfaceMap getWribPrcInfo_trn(String SeikyKeiNo, String SeikyYm) throws Exception
	{
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		outMap.setString(JBSbatACIFM059.SEIKY_KEI_NO, 				SeikyKeiNo);		// 請求先番号
		outMap.setString(JBSbatACIFM059.SEIKY_YM, 					SeikyYm);			// 請求年月
				
		return outMap;
	}

	/**
	 * ワークキーを取得します
	 * 
	 * @param inMap 入力電文
	 * @return String 集計キー
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private String getWkKey(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		String rtnKey = null;
		
		// 入力レコードが存在する場合
		if (inMap != null)
		{
			StringBuffer keyBuf = new StringBuffer();
			
			keyBuf.append(inMap.getString(JBSbatACIFM060.SEIKY_KEI_NO)); 		// 請求契約番号
			keyBuf.append(inMap.getString(JBSbatACIFM060.SVC_NO)); 				// サービス番号
			keyBuf.append(inMap.getString(JBSbatACIFM060.PCRS_CD)); 			// 料金コースコード
			keyBuf.append(inMap.getString(JBSbatACIFM060.PRC_SVC_CD)); 			// 料金サービスコード
			
			// 集計キー生成
			rtnKey = keyBuf.toString();
		}
		// 入力ファイルの最終ブレイクレコードの場合
		else
		{
			// 空を設定する
			rtnKey = "";
		}
		return rtnKey;
	}

	/**▲▲▲▲▲▲メソッド追加 終了▲▲▲▲▲▲*/
	

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
