/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom  					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACIcjknTrkmRsltHenshu
*	ソースファイル名	：JBSbatACIcjknTrkmRsltHenshu.java
*	作成者				：富士通　
*	作成日				：2011年06月22日
*＜機能概要＞
*　一時金取込結果編集部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/06/22   富士通		新規作成
*	v8.00.00	2013/12/13   FJ)鈴木	【ANK-1794-00-00】L2-MVNO対応（請求書電話番号表示（LC含む））
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;
import java.util.ArrayList;

import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFM044;
import eo.business.util.file.JBSbatACIFM048;
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 JBSbatACIcjknTrkmRsltHenshu extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	private String saveKey = null;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem 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
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// 入力なし（＝最終処理）の場合、出力して処理を終了する。
		if(inMap == null)
		{
			// 出力フラグ←true
			setOutFlg(outputInItem);

			return outputInItem;
		}
		// 料金項目コード（下２桁）が"10"（相殺額）または"11"（相殺残額）のレコード以外は処理対象外とする
		if(!inMap.getString(JBSbatACIFM048.PRC_KMK_CD).substring(9, 11).equals(JACStrConst.PRC_KMK_CD_ZUMI) 
				&& (!inMap.getString(JBSbatACIFM048.PRC_KMK_CD).substring(9, 11).equals(JACStrConst.PRC_KMK_CD_ZAN)))
		{
			return outputInItem;
		}
		
		
		// WKキーの設定
		String inKey = this.setKey(inMap);
		
		// 退避キー = null の場合
		if(saveKey == null)
		{
			// 出力項目の設定
			this.setOutPutItem(inMap, outputInItem);
		}
		// 退避キー = WKキー の場合
		else if(saveKey.equals(inKey))
		{
			// 金額情報の設定
			this.setPrcInfo(inMap, outputInItem);
		}
		// 上記以外の場合
		else
		{
			// 出力フラグ←true
			setOutFlg(outputInItem);
			
			// 出力項目の設定
			this.setOutPutItem(inMap, outputInItem);
		}
		// 退避キー ← WKキー
		saveKey = inKey;
		
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * WKキーを設定します。
	 * @param inMap 入力情報
	 * @return String WKキー
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private String setKey(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		StringBuffer inkeyBuf = new StringBuffer();
		inkeyBuf.append(inMap.getString(JBSbatACIFM048.SEIKY_KEI_NO));					// 請求先番号
		inkeyBuf.append(inMap.getString(JBSbatACIFM048.SEIKY_YM));						// 請求年月
		inkeyBuf.append(inMap.getString(JBSbatACIFM048.SVC_NO));						// サービス番号
		inkeyBuf.append(inMap.getString(JBSbatACIFM048.SVC_DTL_SKBT_NO));				// サービス詳細識別番号
		inkeyBuf.append(inMap.getString(JBSbatACIFM048.PCRS_CD));						// 料金コースコード
		inkeyBuf.append(inMap.getString(JBSbatACIFM048.PRC_SVC_CD));					// 料金サービスコード
		inkeyBuf.append(inMap.getString(JBSbatACIFM048.PRC_KMK_CD).substring(0, 9));	// 料金項目コード（上９桁）
		
		return inkeyBuf.toString();
	}
	
	/**
	 * 出力項目を設定します。
	 * @param inMap 入力電文
	 * @param outputInItem 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void setOutPutItem(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
		
		// 料金情報を設定する
		JBSbatServiceInterfaceMap outputMap = new JBSbatServiceInterfaceMap();
		
		outputMap.setString(JBSbatACIFM044.SEIKY_KEI_NO,			inMap.getString(JBSbatACIFM048.SEIKY_KEI_NO)); 	// 請求先番号
		outputMap.setString(JBSbatACIFM044.SEIKY_YM,				inMap.getString(JBSbatACIFM048.SEIKY_YM)); 		// 請求年月
		outputMap.setString(JBSbatACIFM044.SVC_KEI_NO,			inMap.getString(JBSbatACIFM048.SVC_NO));			// サービス番号
		outputMap.setString(JBSbatACIFM044.PCRS_CD,				inMap.getString(JBSbatACIFM048.PCRS_CD));			// 料金コースコード
		outputMap.setString(JBSbatACIFM044.PRC_SVC_CD,			inMap.getString(JBSbatACIFM048.PRC_SVC_CD));		// 料金サービスコード
		outputMap.setString(JBSbatACIFM044.PRC_KMK_CD,			inMap.getString(JBSbatACIFM048.PRC_KMK_CD));		// 料金項目コード
		outputMap.setBigDecimal(JBSbatACIFM044.TRKM_ZUMI_AMNT,	new BigDecimal(0.0));								// 相殺額
		outputMap.setBigDecimal(JBSbatACIFM044.TRKM_ZAN_AMNT, 	new BigDecimal(0.0));								// 相殺残額
		outputMap.setString(JBSbatACIFM044.SVC_DTL_SKBT_NO,		inMap.getString(JBSbatACIFM048.SVC_DTL_SKBT_NO));	// サービス詳細識別番号
		
		// 出力レコード情報を設定する
		outputInItem.addOutMapList(outputMap);
		
		// 金額情報の設定
		this.setPrcInfo(inMap, outputInItem);
	}
	
	/**
	 * 金額情報を設定します。
	 * @param inMap 入力電文
	 * @param outputInItem 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void setPrcInfo(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
		// 退避リスト取得
		ArrayList<JBSbatServiceInterfaceMap> tmpList = outputInItem.getOutMapList();
		
		int tmpSize = tmpList.size();
		
		// 編集対象レコード取得
		JBSbatServiceInterfaceMap tmpMap = (JBSbatServiceInterfaceMap)tmpList.get(tmpSize - 1);
		
		// 料金項目コード(下2桁) ＝ "10"(相殺額)の場合
		if(inMap.getString(JBSbatACIFM048.PRC_KMK_CD).substring(9, 11).equals(JACStrConst.PRC_KMK_CD_ZUMI))
		{
			// 相殺額に入力．料金を設定
			tmpMap.setBigDecimal(JBSbatACIFM044.TRKM_ZUMI_AMNT, inMap.getBigDecimal(JBSbatACIFM048.PRC));
		}
		// 料金項目コード(下2桁) ＝ "11"(相殺残額)の場合
		else if(inMap.getString(JBSbatACIFM048.PRC_KMK_CD).substring(9, 11).equals(JACStrConst.PRC_KMK_CD_ZAN))
		{
			// 相殺残額に入力．料金を設定
			tmpMap.setBigDecimal(JBSbatACIFM044.TRKM_ZAN_AMNT, inMap.getBigDecimal(JBSbatACIFM048.PRC));
		}
	}
	
	/**
	 * 出力フラグをtrueにします。
	 * @param outputInItem 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void setOutFlg(JBSbatOutputItem outputInItem) throws Exception
	{
		// 出力フラグ←true
		JBSbatServiceInterfaceMap outMap = (JBSbatServiceInterfaceMap)outputInItem.getOutMapList().get(0);
		outMap.setOutFlg(true);
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
