/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACKaisenWariRtrnPrcCalc
*	ソースファイル名	：JBSbatACKaisenWariRtrnPrcCalc.java
*	作成者				：富士通　
*	作成日				：2012年11月27日
*＜機能概要＞
*　回線利用料の割り戻し料計算部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00.00	2012/11/27  FJ)垣内		【ANK-0141-00-00】新規作成
*	v4.00.01	2013/02/19  FJ)早崎		【ST2-2013-0000612】対応　出力項目追加
*	v4.00.02	2013/02/25  FJ)垣内		【ST2-2013-0000612】追加対応　精算料金項目コード追加
*	v5.00.00	2013/07/11  FJ)岡田		【TG1-2013-0000662】マスタ参照基準日水平展開対応
*	v5.01.00	2013/07/18  FJ)小柴		【TG1-2013-0000662】マスタ参照基準日取得を修正
*	v5.02.00	2013/07/25  FJ)小柴		【TG1-2013-0000662】v5.00、v5.01の対応が不要であったため、v4.00.02時点のソースにロールバック
*	v5.03.00	2013/10/25  FJ)黒木		【OM-2013-0002478】 個別プラン適用判定時の比較コードの空白除去対応
*	v6.00.00	2013/12/24  FJ)黒木		【OM-2013-0005343】 事業者間精算料率検索条件不正対応
*	v7.00.00	2014/03/08  FJ)狭間		【OM-2013-0001070】EM事業者間精算減額処理修正
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;
import java.util.HashSet;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JACbatRknBusinessUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.util.JBSbatDateUtil;
import eo.business.common.JBSbatMatchServiceInterface;
import eo.business.util.file.JBSbatACIFI016;
import eo.business.util.file.JBSbatACIFM057;
import eo.business.util.file.JBSbatACIFM195;
import eo.business.util.table.JBSbatCH_M_JGSHAKSSN_RYORT;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JPCUtilCommon;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACKaisenWariRtrnPrcCalc extends JBSbatBusinessService implements JBSbatMatchServiceInterface
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(事業者間精算料率)*/
	private static final String D_TBL_NAME_CH_M_JGSHAKSSN_RYORT = "CH_M_JGSHAKSSN_RYORT";

	/** SQL定義キー(AC_SELECT_005)*/
	private static final String CH_M_JGSHAKSSN_RYORT_AC_SELECT_005 = "AC_SELECT_005";

	/** テーブルアクセスクラス(事業者間精算料率)*/
	private JBSbatSQLAccess db_CH_M_JGSHAKSSN_RYORT = null;

	/** キーマッチ処理フラグ*/
	private boolean matchProcFlg;

	/** マスタファイル処理フラグ*/
	private boolean mastProcFlg;

	/** トランファイル処理フラグ*/
	private boolean tranProcFlg;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** エラーログ出力用(回線数取得不可)*/
	private static final String ERR_KAISEN = "回線数";

	/** 事業者コード */
	private String jigyoshaCd = JACStrConst.KARA_MOJI;
	
	/** 事業者契約コード(回線利用料の割り戻し料率契約(全体)) */
	private String jgKeiCdAll = JACStrConst.KARA_MOJI;
	
	/** 事業者契約コード(回線利用料の割り戻し料率契約(個別プラン)) */
	private String jgKeiCdKbt = JACStrConst.KARA_MOJI;
	
	/** 出力事業者契約コード */
	private String outPutJigyoshaKeiCd = JACStrConst.KARA_MOJI;
	
	/** 精算料金項目コード（回線数）＿個人 */
	private String ssnPrcKmkCdKsKjn = JACStrConst.KARA_MOJI;
	
	/** 精算料金項目コード（回線数）＿法人 */
	private String ssnPrcKmkCdKsHjn = JACStrConst.KARA_MOJI;
	
	/** 精算料金項目コード（回線数） */
	private String thSsnPrcKmkCd = JACStrConst.KARA_MOJI;
	
	/** 回線利用料金の算出元の精算料金項目コード（月額利用料金）＿個人 */
	private String ssnPrcKmkCdMonPrcKjn = JACStrConst.KARA_MOJI;
	
	/** 回線利用料金の算出元の精算料金項目コード（月額利用料金）＿法人 */
	private String ssnPrcKmkCdMonPrcHjn = JACStrConst.KARA_MOJI;
	
	/** 回線利用料金の算出元の精算料金項目コード（通信料）＿個人 */
	private String ssnPrcKmkCdTushinKjn = JACStrConst.KARA_MOJI;

	/** 回線利用料金の算出元の精算料金項目コード（通信料）＿法人 */
	private String ssnPrcKmkCdTushinHjn = JACStrConst.KARA_MOJI;

	/** 個別プランを適用する料金コースコード＋料金サービスコードセット */
	private HashSet<String> prcCrsSvcSet = null ;
	
	/** 退避．回線数法人 */
	private BigDecimal thKaisenHjin = BigDecimal.ZERO;
	
	/** 退避．回線数個人 */
	private BigDecimal thKaisenKjin = BigDecimal.ZERO;
	
	/** 退避．検索キー */
	private String thSearchKey = JACStrConst.KARA_MOJI;
	
	/** 退避．料率 */
	private BigDecimal ryort = BigDecimal.ZERO;

	/** 退避．出力料金項目コード */
	private String outPrcKmkCd = null;

	/** 固定値　BigDecimal 「100」*/
	private static final BigDecimal BIGDECIMAL_100 = new BigDecimal("100");
	
	/** 回線数取得判定フラグ*/
	private boolean kaisenFlg = false;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CH_M_JGSHAKSSN_RYORT = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_JGSHAKSSN_RYORT);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);
		
		// 業務パラメータより取得
		// 事業者コード(EM事業者コード)
		jigyoshaCd = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_EM_JIGYOSHA_CD);
		
		// 事業者契約コード(回線利用料の割り戻し料率契約(全体))
		jgKeiCdAll = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_KSEN_USE_WARI_ALL);
		
		// 事業者契約コード(回線利用料の割り戻し料率契約(個別プラン))
		jgKeiCdKbt = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_KSEN_USE_WARI_KBT);
		
		// 精算料金項目コード(回線数)＿個人
		ssnPrcKmkCdKsKjn = paramUtil.getGyoumuParameter(JACStrConst.WKPRA_AC_SSN_PRC_KMK_KS_K);

		// 精算料金項目コード(回線数)＿法人
		ssnPrcKmkCdKsHjn = paramUtil.getGyoumuParameter(JACStrConst.WKPRA_AC_SSN_PRC_KMK_KS_H);
		
		// 精算料金項目コード（月額利用料金）＿個人
		ssnPrcKmkCdMonPrcKjn = paramUtil.getGyoumuParameter(JACStrConst.WKPRA_AC_SSN_KMK_MON_KJN);
		
		// 精算料金項目コード（月額利用料金）＿法人
		ssnPrcKmkCdMonPrcHjn = paramUtil.getGyoumuParameter(JACStrConst.WKPRA_AC_SSN_KMK_MON_HJN);
		
		// 精算料金項目コード（通信料）＿個人
		ssnPrcKmkCdTushinKjn = paramUtil.getGyoumuParameter(JACStrConst.WKPRA_AC_SSN_KMK_TSN_KJN);
		
		// 精算料金項目コード（通信料）＿法人
		ssnPrcKmkCdTushinHjn = paramUtil.getGyoumuParameter(JACStrConst.WKPRA_AC_SSN_KMK_TSN_HJN);
		
		// 個別プランを適用する料金コースコード・料金サービスコード
		prcCrsSvcSet = new HashSet<String>();
		String[] kbtCdList = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_KBT_PLAN_CRS_SVC).split(",");
		for(int i=0 ; i < kbtCdList.length; i++)
		{
			prcCrsSvcSet.add(JPCUtilCommon.trim(kbtCdList[i]));

		}

		// パラメータ取得クラスクローズ
		paramUtil.close();

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
		/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param mastMap　入力電文
	 * @param tranMap　入力電文
	 * @param outputInItem  入力情報
	 * @return JBSbatOutputItem 出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap mastMap, JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert mastMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][mastMap=" + mastMap.getMap().toString() + "]") : true;
		assert tranMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][tranMap=" + tranMap.getMap().toString() + "]") : true;
		
		// 入力Ｍ(EM利用料金情報(契約料金項目))から回線数を取得
		if(mastMap != null)
		{
			// 料金項目コードが精算料金項目コード（回線数_個人）と一致する場合
			if(this.ssnPrcKmkCdKsKjn.equals(mastMap.getString(JBSbatACIFM057.PRC_KMK_CD)))
			{
				// 退避項目個人に回線数を格納
				this.thKaisenKjin = mastMap.getBigDecimal(JBSbatACIFM057.PRC);
				
				// 回線数取得判定フラグ ← true
				kaisenFlg = true;
			}
			// 料金項目コードが精算料金項目コード（回線数_法人）と一致する場合
			else if(this.ssnPrcKmkCdKsHjn.equals(mastMap.getString(JBSbatACIFM057.PRC_KMK_CD)))
			{
				// 退避項目法人に回線数を格納
				this.thKaisenHjin = mastMap.getBigDecimal(JBSbatACIFM057.PRC);
				
				// 回線数取得判定フラグ ← true
				kaisenFlg = true;
			}

			// フラグ．マスタ ← true
			this.setMastProcFlg(true);

			
			return outputInItem;
		}
		
		// 回線数が取得できなかった場合
		if(mastMap == null && !kaisenFlg)
		{
			// エラーログを出力し、異常終了する
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0440CE, new String[] {ERR_KAISEN});
		}

		if(tranMap != null && kaisenFlg)
		{
			// EM利用料金情報(定額料金・通信料金)．料金項目コード
			String tranPrcKmkCd = tranMap.getString(JBSbatACIFI016.PRC_KMK_CD);
			if(tranPrcKmkCd.equals(this.ssnPrcKmkCdMonPrcKjn) || tranPrcKmkCd.equals(this.ssnPrcKmkCdMonPrcHjn)
					|| tranPrcKmkCd.equals(this.ssnPrcKmkCdTushinKjn) || tranPrcKmkCd.equals(this.ssnPrcKmkCdTushinHjn))
			{
				// 作業領域．検索キーの設定
				String pcrsCd = JPCUtilCommon.trim(tranMap.getString(JBSbatACIFI016.PCRS_CD));
				String prcSvcCd = JPCUtilCommon.trim(tranMap.getString(JBSbatACIFI016.PRC_SVC_CD));
				String wkSearchKey = this.makeStr(pcrsCd, prcSvcCd);
				
				// 退避．検索キー　＝　null (1レコード目) または 退避．検索キー　≠　作業領域．検索キー
				if((this.thSearchKey == null || JACStrConst.KARA_MOJI.equals(thSearchKey)) || !thSearchKey.equals(wkSearchKey))
				{
					// 退避項目の初期化
					this.ryort = null;
					this.outPrcKmkCd = null;
					
					// 退避．検索キーへ格納
					this.thSearchKey = wkSearchKey;
					
					// 料金コースコード・料金サービスコードが個別プランを適用するコードの場合
					String jgsKeiCd = JACStrConst.KARA_MOJI;
					
					if(this.prcCrsSvcSet.contains(wkSearchKey))
					{
						// 検索．事業者契約コードに事業者契約コード(個別プラン)を設定
						jgsKeiCd = this.jgKeiCdKbt;
						
					}
					else
					{
						// 検索．事業者契約コードに事業者契約コード(全体)を設定
						jgsKeiCd = this.jgKeiCdAll;
					}	
					
					// 出力事業者契約コードに該当の事業者契約コードを格納する
					this.outPutJigyoshaKeiCd = jgsKeiCd;

					// 事業者間精算料率より料率・料金項目コード取得
					this.getJgshakssnRyort(jgsKeiCd, tranMap);
					
				}
				// 退避．検索キー　＝　作業領域．検索キー
				else
				{
					// 退避．料率　＝　nullの場合
					if(this.ryort == null)
					{
						// 料金コースコード・料金サービスコードが個別プランを適用するコードの場合
						String jgsKeiCd = JACStrConst.KARA_MOJI;
						

						if(this.prcCrsSvcSet.contains(wkSearchKey))
						{
							// 検索．事業者契約コードに事業者契約コード(個別プラン)を設定
							jgsKeiCd = this.jgKeiCdKbt;
						}
						else
						{
							// 検索．事業者契約コードに事業者契約コード(全体)を設定
								jgsKeiCd = this.jgKeiCdAll;
						}	
						
						// 出力事業者契約コードに該当の事業者契約コードを格納する
						this.outPutJigyoshaKeiCd = jgsKeiCd;

						// 事業者間精算料率より料率・料金項目コード取得
						this.getJgshakssnRyort(jgsKeiCd, tranMap);
					}
				}
				
				// 回線利用料割戻料情報作成
				this.makeOutputKsWariRtnPrcInfo(tranMap, outputInItem);
			}
			// フラグ．トラン ← true
			this.setTranProcFlg(true);
		}
		
		if (mastMap != null && tranMap == null)
		{
			// フラグ．マスタ ← true
			this.setMastProcFlg(true);
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_M_JGSHAKSSN_RYORT.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * @return mastProcFlg を戻します。
	 */
	public boolean isMastProcFlg()
	{
		return mastProcFlg;
	}

	/**
	 * @return matchProcFlg を戻します。
	 */
	public boolean isMatchProcFlg()
	{
		return matchProcFlg;
	}

	/**
	 * @return tranProcFlg を戻します。
	 */
	public boolean isTranProcFlg()
	{
		return tranProcFlg;
	}

	/**
	 * @param mast_ProcFlg 設定する mastProcFlg。
	 */
	public void setMastProcFlg(boolean mast_ProcFlg)
	{
		this.mastProcFlg = mast_ProcFlg;
	}

	/**
	 * @param match_ProcFlg 設定する matchProcFlg。
	 */
	public void setMatchProcFlg(boolean match_ProcFlg)
	{
		this.matchProcFlg = match_ProcFlg;
	}

	/**
	 * @param tran_ProcFlg 設定する tranProcFlg。
	 */
	public void setTranProcFlg(boolean tran_ProcFlg)
	{
		this.tranProcFlg = tran_ProcFlg;
	}

	/**
	 * SQLKEY(AC_SELECT_005)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	事業者コード
	 *		 	事業者契約コード
	 *		 	精算料金項目コード
	 *		 	継続月数
	 *		 	運用日前月末日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeCH_M_JGSHAKSSN_RYORT_AC_SELECT_005(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());
		paramList.setValue(param[4].toString());

		// DBアクセスを実行します
		db_CH_M_JGSHAKSSN_RYORT.selectBySqlDefine(paramList, CH_M_JGSHAKSSN_RYORT_AC_SELECT_005);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * 文字を連結します
	 * @param  string 文字
	 * @return strBuf 連結した文字列
	 */
	private String makeStr(String ...string)
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeStr]");
		
		StringBuffer strBuf = new StringBuffer();
		for(String str:string)
		{
			if(str == null)
			{
				strBuf.append(JACStrConst.KARA_MOJI);
			}
			else
			{
				strBuf.append(str);
			}
		}
		
		assert strBuf != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][strBuf][strBuf = " + strBuf.toString() + "]") : true;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeStr]");
		
		return strBuf.toString();
	}

	/**
	 * 事業者間積算料率データ取得を行います。
	 * 
	 * @param jgKeiCd 事業者契約コード
	 * @param tranMap EM利用料金情報（契約項目）
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void getJgshakssnRyort(String jgsKeiCd, JBSbatServiceInterfaceMap tranMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getByJgshakssnPrc]");
		
		// 退避．回線数
		BigDecimal thKaisen = BigDecimal.ZERO;

		// 退避．料金項目コード
		String tranPrcKmkCd = tranMap.getString(JBSbatACIFI016.PRC_KMK_CD);

		// 退避．料金項目コードが個人の場合
		if(tranPrcKmkCd.equals(this.ssnPrcKmkCdMonPrcKjn) || tranPrcKmkCd.equals(this.ssnPrcKmkCdTushinKjn))
		{
			this.thSsnPrcKmkCd = this.ssnPrcKmkCdKsKjn;
			thKaisen = this.thKaisenKjin;
		}
		// 退避．料金項目コードが法人の場合
		else
		{
			this.thSsnPrcKmkCd = this.ssnPrcKmkCdKsHjn;
			thKaisen = this.thKaisenHjin;
		}
		
		String opeDateYm = super.opeDate.substring(0, 6);
		String opeMonEnd = JBSbatInterface.getEndOfMonth(opeDateYm);
		String opePrevMonEnd = JBSbatDateUtil.adjustMonth(opeDateYm + opeMonEnd, -1);
		// ＤＢアクセス用のパラメータ定義
		JBSbatCommonDBInterface dbList = new JBSbatCommonDBInterface();

		String strprcKmkCd = JPCUtilCommon.fillHalfSpace(this.thSsnPrcKmkCd, JACStrConst.PRC_KMK_CD_LENGTH, true);
		// 事業者間積算料率 ＷＨＥＲＥ条件設定
		dbList.setValue(this.jigyoshaCd); 										// 事業者コード
		dbList.setValue(jgsKeiCd); 												// 事業者契約コード
		dbList.setValue(strprcKmkCd); 											// 料金項目コード
		dbList.setValue(thKaisen.toString());							 		// 料金
		dbList.setValue(opePrevMonEnd); 										// 運用日前月末日
		
		assert dbList != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getByJgshakssnPrc][dbList=" + dbList.getList().toString() + "]") : true;

		// 事業者間積算料金データ取得
		executeCH_M_JGSHAKSSN_RYORT_AC_SELECT_005(dbList.getList().toArray());

		// レコード読み込み
		JBSbatCommonDBInterface dbMap = db_CH_M_JGSHAKSSN_RYORT.selectNext();

		// 取得できた場合
		if(dbMap != null)
		{
			assert dbMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getByJgshakssnPrc][dbMap=" + dbMap.getMap().toString() + "]") : true;
			
			this.ryort         = dbMap.getBigDecimal(JBSbatCH_M_JGSHAKSSN_RYORT.SSN_RYORT);
			this.outPrcKmkCd   = dbMap.getString(JBSbatCH_M_JGSHAKSSN_RYORT.OUT_PRC_KMK_CD);
		}
		else
		{
			// DB未存在エラー
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeInfo][DB未存在エラー]");
			String[] outCntMsg = {JBSbatCH_M_JGSHAKSSN_RYORT.TABLE_NAME, dbList.getList().toString()};
			// エラーログ出力（エラーコード："EACB0250CE"（DB未存在エラー））
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0250CE, outCntMsg);
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getByJgshakssnPrc]");
		return;
	}

	/**
	 * 回線利用料割戻料情報を出力します。
	 * 
	 * @param tranMap 入力電文（EM利用料金情報（定額精算料金））
	 * @param outputInItem  出力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeOutputKsWariRtnPrcInfo(JBSbatServiceInterfaceMap tranMap, JBSbatOutputItem outputInItem) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputInfo]");
		assert tranMap.getBigDecimal(JBSbatACIFI016.PRC) != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutputKkIjiKnrhInfo][トラン・料金=" + tranMap.getBigDecimal(JBSbatACIFI016.PRC).toString() + "]") : true;
		assert this.ryort != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutputKkIjiKnrhInfo][料率=" + this.ryort.toString() + "]") : true;
		
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// 回線利用料割戻料算出
		// まずは料金を丸め処理
		BigDecimal ksWariRtnPrc = JACbatRknBusinessUtil.round(JACStrConst.ROUND_DOWN, tranMap.getBigDecimal(JBSbatACIFI016.PRC), 0);
		
		// 丸めた料金に料率を掛ける
		ksWariRtnPrc = ksWariRtnPrc.multiply(this.ryort).divide(BIGDECIMAL_100);

		assert ksWariRtnPrc != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutputKkIjiKnrhInfo][金額計算（丸め処理前）=" + ksWariRtnPrc.toString() + "]") : true;
		
		// 結果を更に丸め処理
		ksWariRtnPrc = JACbatRknBusinessUtil.round(JACStrConst.ROUND_DOWN, ksWariRtnPrc, 0);

		// トランの情報をコピー
		outMap.setMap(tranMap.getMap());
		// 請求先番号
		outMap.set(JBSbatACIFM195.SEIKY_KEI_NO, 			tranMap.get(JBSbatACIFI016.SEIKY_KEI_NO));
		// 請求年月
		outMap.set(JBSbatACIFM195.SEIKY_YM, 				tranMap.get(JBSbatACIFI016.SEIKY_YM));
		// 整理番号
		outMap.set(JBSbatACIFM195.SEIRI_NO, 				tranMap.get(JBSbatACIFI016.SEIRI_NO));
		// 割引サービス契約番号
		outMap.set(JBSbatACIFM195.WRIB_SVC_KEI_NO, 			tranMap.get(JBSbatACIFI016.WRIB_SVC_KEI_NO));
		// 割引サービス対象契約番号
		outMap.set(JBSbatACIFM195.WRISVC_TRGT_KEI_NO, 		tranMap.get(JBSbatACIFI016.WRISVC_TRGT_KEI_NO));
		// サービス番号
		outMap.set(JBSbatACIFM195.SVC_NO,					tranMap.get(JBSbatACIFI016.SVC_NO));
		// オプションサービス契約番号
		outMap.set(JBSbatACIFM195.OP_SVKEI_NO,				tranMap.get(JBSbatACIFI016.OP_SVKEI_NO));
		// 料金サービス識別コード
		outMap.set(JBSbatACIFM195.SVC_SKBT_CD, 				tranMap.get(JBSbatACIFI016.SVC_SKBT_CD));
		// 料金グループコード
		outMap.set(JBSbatACIFM195.PRC_GRP_CD, 				tranMap.get(JBSbatACIFI016.PRC_GRP_CD));
		// 料金コースコード
		outMap.set(JBSbatACIFM195.PCRS_CD, 					tranMap.get(JBSbatACIFI016.PCRS_CD));
		// 料金サービスコード
		outMap.set(JBSbatACIFM195.PRC_SVC_CD, 				tranMap.get(JBSbatACIFI016.PRC_SVC_CD));
		// 料金項目コード
		outMap.set(JBSbatACIFM195.PRC_KMK_CD, 				this.outPrcKmkCd);
		// 徴収パターンコード
		outMap.set(JBSbatACIFM195.COLLECT_PATTERN_CD, 		tranMap.get(JBSbatACIFI016.COLLECT_PATTERN_CD));
		// 料金
		outMap.set(JBSbatACIFM195.PRC, 						ksWariRtnPrc.toString());
		// 利用開始日
		outMap.set(JBSbatACIFM195.USE_STAYMD, 				tranMap.get(JBSbatACIFI016.USE_STAYMD));
		// 利用終了日
		outMap.set(JBSbatACIFM195.USE_ENDYMD, 				tranMap.get(JBSbatACIFI016.USE_ENDYMD));
		// サービス開始日
		outMap.set(JBSbatACIFM195.SVC_STAYMD, 				tranMap.get(JBSbatACIFI016.SVC_STAYMD));
		// 初回課金開始日
		outMap.set(JBSbatACIFM195.FIRST_CHRG_STAYMD, 		tranMap.get(JBSbatACIFI016.FIRST_CHRG_STAYMD));
		// サービス解約日
		outMap.set(JBSbatACIFM195.SVC_DSL_YMD, 				tranMap.get(JBSbatACIFI016.SVC_DSL_YMD));
		// サービス解約理由
		outMap.set(JBSbatACIFM195.SVC_DLRE, 				tranMap.get(JBSbatACIFI016.SVC_DLRE));
		// サービス回復日
		outMap.set(JBSbatACIFM195.SVC_KAIHK_DAY, 			tranMap.get(JBSbatACIFI016.SVC_KAIHK_DAY));
		// 利用日数
		outMap.set(JBSbatACIFM195.USE_DAY_CNT, 				tranMap.get(JBSbatACIFI016.USE_DAY_CNT));
		// 利用不可日数
		outMap.set(JBSbatACIFM195.USE_FAIL_DAY_CNT, 		tranMap.get(JBSbatACIFI016.USE_FAIL_DAY_CNT));
		// 相対区分
		outMap.set(JBSbatACIFM195.AIT_DIV, 					tranMap.get(JBSbatACIFI016.AIT_DIV));
		// 締め日
		outMap.set(JBSbatACIFM195.SIME_DAY, 				tranMap.get(JBSbatACIFI016.SIME_DAY));
		// 利用不可適用可否
		outMap.set(JBSbatACIFM195.USE_APLY_KH_CD, 			tranMap.get(JBSbatACIFI016.USE_APLY_KH_CD));
		// 前受相殺優先順位
		outMap.set(JBSbatACIFM195.MAE_YUSEN_JUN, 			tranMap.get(JBSbatACIFI016.MAE_YUSEN_JUN));
		// 割引優先順位
		outMap.set(JBSbatACIFM195.WRIB_YUSEN_JUN, 			tranMap.get(JBSbatACIFI016.WRIB_YUSEN_JUN));
		// 上限判定優先順位
		outMap.set(JBSbatACIFM195.UPPL_JUDGE_YUSEN_JUN, 	tranMap.get(JBSbatACIFI016.UPPL_JUDGE_YUSEN_JUN));
		// 割引繰越可否
		outMap.set(JBSbatACIFM195.WRIB_KKSHI_KH, 			tranMap.get(JBSbatACIFI016.WRIB_KKSHI_KH));
		// 事業者コード
		outMap.set(JBSbatACIFM195.JIGYOSHA_CD, 				this.jigyoshaCd);
		// 事業者契約コード
		outMap.set(JBSbatACIFM195.JIGYOSHA_KEI_CD, 			this.outPutJigyoshaKeiCd);

		
		// 出力フラグ設定
		outMap.setOutFlg(true);
		
		outputInItem.addOutMapList(outMap);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputInfo]");

		return;
	}
}
