/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACFmtcelSsnShukSaksei
*	ソースファイル名	：JBSbatACFmtcelSsnShukSaksei.java
*	作成者				：富士通　
*	作成日				：2012年11月20日
*＜機能概要＞
*　フェムトセル精算集計表作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00.00	2012/11/20  FJ) 垣内	【ANK-0035-00-00】新規作成
*	v11.00.00	2014/12/08  FJ) 古田	【ANK-2184-00-00】新型フェムトセル対応
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JACBatCommon;
import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatRknBusinessUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFM171;
import eo.business.util.file.JBSbatACIFM173;
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 JBSbatACFmtcelSsnShukSaksei extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 退避．事業者コード */
	private String thJigyoshaCd = null;
	
	/** 入力．事業者コード */
	private String inJigyoshaCd = null;
	
//	/** 退避．単価 */
//	private BigDecimal tanka = BigDecimal.ZERO;
	
//	/** 退避．件数 */
//	private int cnt = 0;
//	
//	/** 退避．金額 */
//	private BigDecimal amnt = BigDecimal.ZERO;
	
	/* ++++++++++ v11.00.00 追加開始 ++++++++++ */
//	/** 退避．料金コースコード */
//	private String thPcrsCd = null;
//	
//	/** 入力．料金コースコード */
//	private String inPcrsCd = null;
//	
//	/** 退避．料金コース名 */
//	private String thPcrsNm = null;
	
	/** 合計行リスト */
	private ArrayList<HashMap<String, String>> ssnShukGoukeiList = null;
	
	/** 件数マップ */
	private HashMap<String, String> countMap = null;
	
	/** 件数マップキー（料金コースコード） */
	private static final String PCRS_CD = "PCRS_CD";
	/* ++++++++++ v11.00.00 追加完了 ++++++++++ */
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		
		/* ++++++++++ v11.00.00 追加開始 ++++++++++ */
		ssnShukGoukeiList = new ArrayList<HashMap<String, String>>();
		countMap = new HashMap<String, String>();
		/* ++++++++++ v11.00.00 追加完了 ++++++++++ */
		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]");

		if(inMap != null)
		{
			// 退避．事業者コードがnullの場合（1レコード目）
			if(this.thJigyoshaCd == null)
			{
				// ブレイクキー項目の退避
				this.thJigyoshaCd = inMap.getString(JBSbatACIFM171.JIGYOSHA_CD);
//				// 単価
//				this.tanka        = inMap.getBigDecimal(JBSbatACIFM171.PRC);
				
				// 精算対象の場合
				if(checkTrgtFlg(inMap))
				{
					/* ++++++++++ v11.00.00 変更開始 ++++++++++ */
//					this.cnt = 1;
					setCountMap(inMap.getString(JBSbatACIFM171.JIGYOSHA_CD), inMap.getString(JBSbatACIFM171.PCRS_CD));
					/* ++++++++++ v11.00.00 変更完了 ++++++++++ */
				}
				
				/* ++++++++++ v11.00.00 追加開始 ++++++++++ */
				// 合計行リスト格納
				setSsnMsaiGoukeiList(thJigyoshaCd, inMap.getString(JBSbatACIFM171.PCRS_CD), inMap);
				/* ++++++++++ v11.00.00 追加完了 ++++++++++ */
				
				// ダミーレコード設定
				outputInItem.addOutMapList(new JBSbatServiceInterfaceMap());
				return outputInItem;
			}
			
			// 事業者コード
			this.inJigyoshaCd = inMap.getString(JBSbatACIFM171.JIGYOSHA_CD);
			
			/* ++++++++++ v11.00.00 追加開始 ++++++++++ */
			
			// 精算対象の場合
			if(checkTrgtFlg(inMap))
			{
				setCountMap(inJigyoshaCd, inMap.getString(JBSbatACIFM171.PCRS_CD));
			}
			/* ++++++++++ v11.00.00 追加完了 ++++++++++ */
			
			// 合計行リスト格納
			setSsnMsaiGoukeiList(inJigyoshaCd, inMap.getString(JBSbatACIFM171.PCRS_CD), inMap);
			
			/* ++++++++++ v11.00.00 削除開始 ++++++++++ */
//			// 退避．事業者コード　＝　入力．事業者コード
//			if(this.thJigyoshaCd.equals(this.inJigyoshaCd))
//			{
//
//				// 精算対象の場合
//				if(checkTrgtFlg(inMap))
//				{
//					this.cnt++;
//				}
//				return outputInItem;
//			}
//			// 退避．事業者コード　≠　入力．事業者コード
//			else
//			{
//				// フェムトセル精算集計表の出力
//				outputInItem.addOutMapList(this.makeOutputShuk());
//
//				// 退避項目の初期化
//				this.cnt = 0;
//				this.amnt = BigDecimal.ZERO;
//				
//				// 退避項目設定
//				this.thJigyoshaCd = this.inJigyoshaCd;
//				this.tanka = inMap.getBigDecimal(JBSbatACIFM171.PRC);
//				
//				// 精算対象の場合
//				if(checkTrgtFlg(inMap))
//				{
//					this.cnt = 1;
//				}
//
//				// 退避項目設定
//				this.thJigyoshaCd = this.inJigyoshaCd;
//			}
			/* ++++++++++ v11.00.00 削除完了 ++++++++++ */
		}
		// 最終レコードの場合
		else
		{
			/* ++++++++++ v11.00.00 変更開始 ++++++++++ */
//			// フェムトセル精算集計表の出力
//			outputInItem.addOutMapList(this.makeOutputShuk());
			getGoukeiGyoOut(outputInItem);
			
			/* ++++++++++ v11.00.00 変更完了 ++++++++++ */

		}

		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  inMap     入力電文
	 * @return Boolean    集計キー
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private Boolean checkTrgtFlg(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][checkTrgtFlg]");
		// 精算対象フラグ
		String ssnTrgtFlg = inMap.getString(JBSbatACIFM171.SSN_TRGT_FLG);

		// 休止中フラグ
		String pauseFlg = inMap.getString(JBSbatACIFM171.PAUSE_FLG);

		Boolean rtnValue = false;
		if (JACStrConst.SSN_TRGT_FLG_ON.equals(ssnTrgtFlg) && JACStrConst.PAUSE_FLG_OFF.equals(pauseFlg))
		{
			rtnValue = true;
		}
		else
		
		{
			rtnValue = false;
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][checkTrgtFlg]");
		return rtnValue;
	}

	/**
	 *  フェムトセル精算集計表を作成します。
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private JBSbatServiceInterfaceMap makeOutputShuk(HashMap<String, String> goukeiMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputShuk]");
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		String jigyoshaCd = goukeiMap.get(JBSbatACIFM173.JIGYOSHA_CD);
		String pcrsCd = goukeiMap.get(PCRS_CD);
		
		BigDecimal tanka = new BigDecimal(getNullToZero(goukeiMap.get(JBSbatACIFM173.TANKA)));

		// 金額集計処理
		BigDecimal ssnCnt = new BigDecimal(getNullToZero(countMap.get(jigyoshaCd + pcrsCd)));
		BigDecimal amnt = tanka.multiply(ssnCnt);
		amnt = JACbatRknBusinessUtil.round(JACStrConst.ROUND_DOWN, amnt, 0);

		// 事業者コード
		outMap.setString(JBSbatACIFM173.JIGYOSHA_CD,	goukeiMap.get(JBSbatACIFM173.JIGYOSHA_CD));
		// 単価
		outMap.setString(JBSbatACIFM173.TANKA,			tanka.toString());
		// 精算対象件数
		outMap.setString(JBSbatACIFM173.SSN_TRGT_CNT,	String.valueOf(ssnCnt));
		// 金額
		outMap.setString(JBSbatACIFM173.AMNT,			amnt.toString());
		
		// 料金コース名
		outMap.setString(JBSbatACIFM173.PCRS_NM,			goukeiMap.get(JBSbatACIFM173.PCRS_NM));
		
		outMap.setMap(JACBatCommon.quote(outMap.getMap(), JACStrConst.DOUBLE_QUOTE, JACStrConst.DOUBLE_QUOTE));
		outMap.setOutFlg(true);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputShuk]");
		return outMap;
	}
	
	/* ++++++++++ v11.00.00 追加開始 ++++++++++ */
	/**
	 * <p>
	 * 合計行設定メソッド
	 * ソートが事業者コード、お客様ID、料金コースとなっているため新旧料金コースがはなれて取得される
	 * </p>
	 * @param pInJigyoshaCd
	 * @param pInPcrsCd
	 * @throws Exception 
	 */
	private void setSsnMsaiGoukeiList(String pInJigyoshaCd, String pInPcrsCd, JBSbatServiceInterfaceMap inMap) throws Exception
	{
		
		boolean addFlg = false;
		
		for(int i=0;i<ssnShukGoukeiList.size();i++)
		{
			HashMap<String, String> workMap = ssnShukGoukeiList.get(i);
			
			String jigyshaCd = workMap.get(JBSbatACIFM173.JIGYOSHA_CD);
			String pcrsCd = workMap.get(PCRS_CD);
			
			if(jigyshaCd.equals(pInJigyoshaCd) && pcrsCd.equals(pInPcrsCd))
			{
				// すでに設定済みの場合セットしません。
				addFlg = true;
			}
		}
		
		if(addFlg == false)
		{
			ssnShukGoukeiList.add(getGoukeiMap(pInJigyoshaCd, pInPcrsCd, inMap));
		}
		
	}
	
	
	/**
	 * <p>
	 * 合計マップ取得メソッド
	 * 
	 * </p>
	 * @param pInJigyoshaCd
	 * @param pInPcrsCd
	 * @throws Exception 
	 */
	private HashMap<String, String> getGoukeiMap(String pInJigyoshaCd, String pInPcrsCd, JBSbatServiceInterfaceMap inMap) throws Exception
	{
		
		HashMap<String, String> outMap = new HashMap<String, String>();
	
		// 事業者コード
		outMap.put(JBSbatACIFM173.JIGYOSHA_CD, pInJigyoshaCd);
		// 単価
		outMap.put(JBSbatACIFM173.TANKA, inMap.getBigDecimal(JBSbatACIFM171.PRC).toString());
		// 精算対象件数
		outMap.put(JBSbatACIFM173.SSN_TRGT_CNT, "0");
		// 金額
		outMap.put(JBSbatACIFM173.AMNT, "0");
		// 料金コース名
		outMap.put(JBSbatACIFM173.PCRS_NM, inMap.getString(JBSbatACIFM171.PCRS_NM));
		// 料金コースコード
		outMap.put(PCRS_CD, pInPcrsCd);
		

		return outMap;
	}
	
	/**
	 * <p>
	 * 件数設定メソッド
	 * </p>
	 * @param pInJigyoshaCd
	 * @param pInPcrsCd
	 */
	private void setCountMap(String pInJigyoshaCd, String pInPcrsCd)
	{
		
		String key = pInJigyoshaCd + pInPcrsCd;
		
		if(countMap.containsKey(key))
		{
			int intCount = Integer.parseInt(countMap.get(key));
			intCount++;
			countMap.put(key, String.valueOf(intCount));
			
		}
		else
		{
			countMap.put(key, "1");
		}
	}

	/**
	 * <p>
	 * 合計マップ取得メソッド
	 * 
	 * </p>
	 * @param outputInItem
	 * @param pJigyoshaCd
	 * @throws Exception 
	 */
	private void getGoukeiGyoOut(JBSbatOutputItem outputInItem) throws Exception
	{
		
		for(int i=0;i<ssnShukGoukeiList.size();i++)
		{
			HashMap<String, String> goukeiMap = ssnShukGoukeiList.get(i);

			outputInItem.addOutMapList(makeOutputShuk(goukeiMap));
		}
	}
	
	/**
	 * <p>
	 * Nullをゼロに変換
	 * 
	 * </p>
	 * @param str
	 */
	private String getNullToZero(String str)
	{
		
		if(str == null || "".equals(str))
		{
			return "0";
		}
		
		return str;
	}
	
	
	/* ++++++++++ v11.00.00 追加完了 ++++++++++ */

}
