/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACEmJgshaPrcShukSvcNo
*	ソースファイル名	：JBSbatACEmJgshaPrcShukSvcNo.java
*	作成者				：富士通　
*	作成日				：2013年12月10日
*＜機能概要＞
*　ＥＭ事業者間精算料金情報サービス番号単位集計部品です。
*＜修正履歴＞
*	v6.00.00	2013/12/06  FJ)田内		【OM-2013-0002478】新規作成
*	v6.01.00	2013/12/13  FJ)黒木		【OM-2013-0002478】クローズ処理不正対応
*	v6.02.00	2013/12/14  FJ)後藤		【OM-2013-0002478】性能改善
*	v6.03.00	2013/12/21  FJ) 狭間	【OM-2013-0005343】料金の小数点以下を切り捨て
*	v8.00.00	2014/03/11  FJ）後藤	【OM-2014-0001070】税率マスタ参照条件見直し
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatRknBusinessUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JPCBatCommon;
import eo.business.util.file.JBSbatACIFM191;
import eo.common.constant.JACStrConst;
import eo.common.util.JACTaxCalcShikibetuCodeUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACEmJgshaPrcShukSvcNo extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 業務領域．キー */
	private String shukeiKey = null;
	
	/** 退避．集計キー */
	private String bkShukeiKey = null;
	
	/** 退避．請求年月 */
	private String bkSeikyYm = null;
	
	/** 退避．請求先番号 */
	private String bkSeikyKeiNo = null;
	
	/** 退避．料金コースコード */
	private String bkPcrsCd = null;
	
	/** 退避．料金サービスコード */
	private String bkPrcSvcCd = null;
	
	/** 退避．料金項目コード */
	private String bkPrcKmkCd = null;
	
	/** 退避．出力料金項目コード */
	private String bkOutPrcKmkCd = null;
	
	/** 退避．内税外税識別コード */
	private String bkUzeiSzeiSkbtCd = null;
	
	/** 退避．料金 */
	private BigDecimal bkPrc= BigDecimal.ZERO;

	/** 退避．料金(内税) */
	private BigDecimal bkUzeiPrc= BigDecimal.ZERO;

	/** 退避．料金(外税) */
	private BigDecimal bkSzeiPrc= BigDecimal.ZERO;

	/** 退避．サービス番号 */
	private String bkSvcNo = null;
	
	/** 退避．事業者コード */
	private String bkEmJgsyaCd = null;

	/** 退避．事業者契約コード */
	private String bkJigyoshaKeiCd = null;
	
	/** 料金業務共通クラスインスタンス */
	private JACbatRknBusinessUtil rknBusinessUtil = null;
	
	/** 料金業務共通クラスインスタンス */
	private JACbatSchdlUtil schdlUtil = null;

	/** 税計算識別コード管理クラス */
	private JACTaxCalcShikibetuCodeUtil jACTaxCalcShikibetuCodeUtil = null;
	
	/** 月末日 */
	private String tmpSeikyuYmEndDay = null;

	/** 税計算識別コード */
	private String taxSkbtCd = null;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		
		// 料金業務共通クラスインスタンス生成
		this.rknBusinessUtil = new JACbatRknBusinessUtil(commonItem); 
		this.schdlUtil = new JACbatSchdlUtil(commonItem);
		
		// 請求年月
		String seikyYm = JPCBatCommon.addMonth(super.opeDate, -1).substring(0, 6);
		
		// 月末日取得
		JACbatSchdlUtil schdlUtil = new JACbatSchdlUtil(commonItem);
		try
		{
			// 月初日[0] 月末日[1]
			String[] rtn = schdlUtil.getUseStrEnd(seikyYm, JACStrConst.EVENT_CD_USE_STAYMD, JACStrConst.EVENT_CD_USE_ENDYMD);
			this.tmpSeikyuYmEndDay = rtn[1];
		}
		finally
		{
			schdlUtil.close();
		}
		
		// 税計算識別コード管理クラスのインスタンス生成
		this.jACTaxCalcShikibetuCodeUtil  = new JACTaxCalcShikibetuCodeUtil(JACStrConst.CALLER_BATCH, commonItem.getConnection());
		
		// 税計算識別コード取得
		taxSkbtCd = this.jACTaxCalcShikibetuCodeUtil.getTaxSkbtCdStaMax(JACStrConst.UZEI_SZEI_SKBT_SOTO, tmpSeikyuYmEndDay);
		
		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)
		{
			// 合計金額を算出する
			calcPrcTotal();
			
			// EM利用料金情報を出力する
			outputInItem.addOutMapList(this.makeOutputInfo());

			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
			return outputInItem;
		}

		// 集計キーの生成
		this.shukeiKey = getShukeiKey(inMap);
		
		// 1レコード目の場合
		if(this.bkShukeiKey == null)
		{
			// 退避項目を設定
			setBkKmk(inMap);
			
			// ダミーレコード設定
			outputInItem.addOutMapList(new JBSbatServiceInterfaceMap());
			return outputInItem;
		}

		// 2レコード目以降の場合
		// キーブレイクした場合
		if(!this.bkShukeiKey.equals(this.shukeiKey))
		{
			// 合計金額を算出する
			calcPrcTotal();
			
			// EM利用料金情報を出力する
			outputInItem.addOutMapList(this.makeOutputInfo());
			
			// 退避項目を初期化する
			this.bkPrc = BigDecimal.ZERO;
			this.bkSzeiPrc = BigDecimal.ZERO;
			this.bkUzeiPrc = BigDecimal.ZERO;
			
			// 退避項目を設定
			setBkKmk(inMap);

		}
		// 上記以外の場合
		else
		{
			// 入力．内税外税識別コード = 内税("1")の場合
			if((inMap.getString(JBSbatACIFM191.UZEI_SZEI_SKBT_CD)).equals(JACStrConst.UZEI_SZEI_SKBT_UCHI))
			{
				this.bkUzeiPrc = this.bkUzeiPrc.add(inMap.getBigDecimal(JBSbatACIFM191.PRC).setScale(0, BigDecimal.ROUND_DOWN));
			}
			else
			// 入力．内税外税識別コード = 外税("2")の場合
			{
				this.bkSzeiPrc = this.bkSzeiPrc.add(inMap.getBigDecimal(JBSbatACIFM191.PRC).setScale(0, BigDecimal.ROUND_DOWN));
			}
		}

		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		 // クローズ処理
		 schdlUtil.close();
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	
	/**
	 * 集計キーを取得します。
	 * @param  inMap     入力電文
	 * @return String    集計キー
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private String getShukeiKey(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getShukeiKey]");
		// 集計キー
		String shukeiKey = null;

		StringBuffer keyBuf = new StringBuffer();
		if (inMap != null)
		{
			keyBuf.append(inMap.getString(JBSbatACIFM191.SVC_NO));					// サービス番号
			keyBuf.append(inMap.getString(JBSbatACIFM191.SEIKY_YM)); 				// 請求年月 
			keyBuf.append(inMap.getString(JBSbatACIFM191.OUT_PRC_KMK_CD)); 			// 出力料金項目コード 
			shukeiKey = keyBuf.toString();
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getShukeiKey][shukeiKey=" + shukeiKey + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getShukeiKey]");
	
		return shukeiKey;
	}
	
	
	/**
	 * 各々の退避項目を設定します。
	 * @param  inMap     入力電文
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void setBkKmk(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setBkKmk]");
		
		// 退避．集計キー ← 業務領域．集計キー
		this.bkShukeiKey = this.shukeiKey;
		
		// 退避．請求年月 ← 入力．請求年月
		this.bkSeikyYm = (inMap.getString(JBSbatACIFM191.SEIKY_YM));
		
		// 退避．請求先番号 ← 入力．請求先番号
		this.bkSeikyKeiNo = (inMap.getString(JBSbatACIFM191.SEIKY_KEI_NO));
		
		// 退避．料金コースコード ← 入力．料金コースコード
		this.bkPcrsCd = (inMap.getString(JBSbatACIFM191.PCRS_CD));
		
		// 退避．料金サービスコード ← 入力．料金サービスコード
		this.bkPrcSvcCd = (inMap.getString(JBSbatACIFM191.PRC_SVC_CD));
		
		// 退避．料金項目コード ← 入力．料金項目コード
		this.bkPrcKmkCd = (inMap.getString(JBSbatACIFM191.PRC_KMK_CD));
		
		// 退避．出力料金項目コード ← 入力．出力料金項目コード
		this.bkOutPrcKmkCd = (inMap.getString(JBSbatACIFM191.OUT_PRC_KMK_CD));
		
		// 退避．内税外税識別コード ← 入力．内税外税識別コード
		this.bkUzeiSzeiSkbtCd = (inMap.getString(JBSbatACIFM191.UZEI_SZEI_SKBT_CD));
		
		// 入力．内税外税識別コード = 内税("1")の場合
		if((inMap.getString(JBSbatACIFM191.UZEI_SZEI_SKBT_CD)).equals(JACStrConst.UZEI_SZEI_SKBT_UCHI))
		{
			this.bkUzeiPrc = inMap.getBigDecimal(JBSbatACIFM191.PRC).setScale(0, BigDecimal.ROUND_DOWN);
		}
		else
		// 入力．内税外税識別コード = 外税("2")の場合
		{
			this.bkSzeiPrc = inMap.getBigDecimal(JBSbatACIFM191.PRC).setScale(0, BigDecimal.ROUND_DOWN);
		}
		
		// 退避．サービス番号 ← 入力．サービス番号
		this.bkSvcNo = (inMap.getString(JBSbatACIFM191.SVC_NO));
		
		// 退避．事業者コード ← 入力．事業者コード
		this.bkEmJgsyaCd = inMap.getString(JBSbatACIFM191.JIGYOSHA_CD);

		// 退避．事業者契約コード ← 入力．事業者契約コード
		this.bkJigyoshaKeiCd = inMap.getString(JBSbatACIFM191.JIGYOSHA_KEI_CD);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setBkKmk]");
	}
	
	/**
	 * 合計金額を算出します。
	 * @param  inMap     入力電文
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void calcPrcTotal() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][calcPrcTotal]");

		// 税額
		 BigDecimal taxCharge = BigDecimal.ZERO;
		
		 // 退避．料金(外税)に値が格納されている場合
		 if(this.bkSzeiPrc != BigDecimal.ZERO)
		 {
			 // 税額を算出する 税額[0]
			 BigDecimal[] tax = this.rknBusinessUtil.calcTaxCharge(taxSkbtCd, this.bkSzeiPrc ,tmpSeikyuYmEndDay);
			 taxCharge = tax[0]; 
			 
			 // 税額を加算する
			 this.bkSzeiPrc = this.bkSzeiPrc.add(taxCharge);
		 }
		 
		 // 精算金額を算出する
		this.bkPrc = this.bkSzeiPrc.add(this.bkUzeiPrc);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][calcPrcTotal]");
	}


	
	/**
	 * EM利用料金情報の出力
	 * @param  inMap  出力情報
	 * @return outMap 出力情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	public JBSbatServiceInterfaceMap makeOutputInfo() throws Exception
	{
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputInfo]");

		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// 請求年月
		outMap.setString(JBSbatACIFM191.SEIKY_YM,			this.bkSeikyYm);
		// 請求先番号
		outMap.setString(JBSbatACIFM191.SEIKY_KEI_NO,		this.bkSeikyKeiNo);
		// サービス番号
		outMap.setString(JBSbatACIFM191.SVC_NO,				this.bkSvcNo);
		// 料金コースコード
		outMap.setString(JBSbatACIFM191.PCRS_CD,			this.bkPcrsCd);
		// 料金サービスコード
		outMap.setString(JBSbatACIFM191.PRC_SVC_CD,			this.bkPrcSvcCd);
		// 料金項目コード
		outMap.setString(JBSbatACIFM191.PRC_KMK_CD,			this.bkPrcKmkCd);
		// 出力料金項目コード
		outMap.setString(JBSbatACIFM191.OUT_PRC_KMK_CD,		this.bkOutPrcKmkCd);
		// 内税外税識別コード
		outMap.setString(JBSbatACIFM191.UZEI_SZEI_SKBT_CD,	JACStrConst.UZEI_SZEI_SKBT_UCHI);
		// 料金
		outMap.setString(JBSbatACIFM191.PRC,				(this.bkPrc).toString());
		// 事業者コード
		outMap.setString(JBSbatACIFM191.JIGYOSHA_CD,		this.bkEmJgsyaCd);
		// 事業者契約コード
		outMap.setString(JBSbatACIFM191.JIGYOSHA_KEI_CD,	this.bkJigyoshaKeiCd);

		outMap.setOutFlg(true);

		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputInfo]");

		return outMap;
	}


}
