/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatAKSoteiSeikyUwPrc
*	ソースファイル名	：JBSbatAKSoteiSeikyUwPrc.java
*	作成者				：富士通　
*	作成日				：2012年07月22日
*＜機能概要＞
*　想定請求内訳情報作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v3.00.00	2012/07/22   FJ）冨井	新規作成
*	v3.01		2012/08/03   FJ）冨井	【TGI-2012-0000054】ダミーレコード設定位置修正
*	v4.00.00	2013/04/09   FJ）高橋	【ANK-1464-00-00】料金検証不具合対応 マイナス値丸め
*	v4.00.01	2013/05/14   FJ）高橋	【ANK-1464-00-00】料金検証不具合対応 即割適用、長割適用額の日割額で1円ずれ対応
*	v5.00.00	2013/06/28   FJ）高橋	【ANK-1464-00-00】料金検証不具合対応 想定請求内訳情報作成　割引相殺用の反映処理順編集処理の追加
*	v5.01.00	2013/07/24   FJ）黒木	【ANK-1464-00-00】料金検証不具合対応 集計判定条件の変更
*	v9.00.00	2014/04/25   FJ) 前田	【ANK-2054-00-00】スマートリンク端末保障対応
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatAKIFM005;
import eo.business.util.file.JBSbatAKIFM010;
import eo.business.util.file.JBSbatAKIFM062;
import eo.business.util.table.JBSbatAK_M_PRCKNS_PRCKMKHN;
import eo.business.util.table.JBSbatAK_M_SOTEI_PRC;
import eo.common.constant.JACStrConst;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.db.JBSbatSQLAccess;


/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatAKSoteiSeikyUwPrc extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(料金検証料金項目反映)*/
	private static final String D_TBL_NAME_AK_M_PRCKNS_PRCKMKHN = "AK_M_PRCKNS_PRCKMKHN";

	/** テーブル(想定料金)*/
	private static final String D_TBL_NAME_AK_M_SOTEI_PRC = "AK_M_SOTEI_PRC";

	/** SQL定義キー(AK_SELECT_001)*/
	private static final String AK_M_PRCKNS_PRCKMKHN_AK_SELECT_001 = "AK_SELECT_001";

	/** SQL定義キー(AK_SELECT_005)*/
	private static final String AK_M_SOTEI_PRC_AK_SELECT_005 = "AK_SELECT_005";

	/** テーブルアクセスクラス(料金検証料金項目反映)*/
	private JBSbatSQLAccess db_AK_M_PRCKNS_PRCKMKHN = null;

	/** テーブルアクセスクラス(想定料金)*/
	private JBSbatSQLAccess db_AK_M_SOTEI_PRC = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 退避．料金検証料金項目反映マップ */
	private HashMap<String, ArrayList<JBSbatCommonDBInterface>> tmpPrcknsPrckmkhnMap = null;
	
	/** 退避．想定料金マップ */
	private HashMap<String, ArrayList<JBSbatCommonDBInterface>> tmpSoteiPrcMap = null;
	
	/** 退避．KEY */
	private String tmpKey = null;
	
	/** 退避．退避レコード */
	private JBSbatServiceInterfaceMap tmpInMap = null;
	
	/** 退避．判定用段階決定元項目値 */
	private BigDecimal tmpHanteiDankaiKmkVl = BigDecimal.ZERO;
	
	/** 退避．想定金額算出方法コード */
	private String tmpSoteAmntSnstWayCd = JACStrConst.KARA_MOJI;

	/** ワーク．集計金額 */
	private BigDecimal tmpWkShukAmnt = BigDecimal.ZERO;
	
	/** 反映処理順(割引相殺用) */
	private static final BigDecimal WRIB_SOSAI_HANEI_TRN_JUN = new BigDecimal(5000);

	/** 反映処理順(反映処理順の上限値) */
	private static final BigDecimal HANEI_TRN_JUN_MAX_VALUE = new BigDecimal(10000);
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_AK_M_PRCKNS_PRCKMKHN = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AK_M_PRCKNS_PRCKMKHN);
		db_AK_M_SOTEI_PRC = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AK_M_SOTEI_PRC);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][opeDate=" + super.opeDate + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][freeItem=" + super.freeItem + "]");
		
		// バッチ外部パラメータを取得して（ＦＲＥＥパラメータ）、反映処理区分として保持
		String haneiTrnDiv = super.freeItem;
		
		// 料金検証料金項目反映マップ作成
		this.makePrcknsPrckmkhnMap(haneiTrnDiv);
		
		// 想定料金ＭＡＰ作成
		this.makeSoteiPrcMap();
		
		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]");
		assert inMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][inMap = " + inMap.getMap().toString() + "]") : true;
		
		//1件目のレコードの場合
		if(!outputInItem.isOutMapList())
		{
			// ダミーレコードセット
			outputInItem.addOutMapList(new JBSbatServiceInterfaceMap());
		}
		
		// 退避．KEY ≠ NULL（初回データ） の場合
		if(this.tmpKey != null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][退避．KEY ≠ NULL（初回データ） の場合]");
			// 「入力情報 ＝ NULL（最終レコード）」 もしくは
			// 「退避．KEY ≠ 入力．KEY」 の場合
			if(inMap == null || isKeyBreak(inMap))
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][入力情報 ＝ NULL（最終レコード） または 退避．KEY ≠ 入力．KEYの場合]");
				
				// (c) 退避レコード．集計キー ≠ ワークキー の場合
				// @集計金額の編集
				this.setShukAmntEdit();
				// A想定請求内訳情報出力
				this.makeOutputInfo(outputInItem);
				// B投入用想定請求内訳情報作成を実施
				this.makeOutputTonyuInfo(outputInItem);
				// 最終レコードの場合
				if(inMap == null)
				{
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][最終レコードの場合]");
					return outputInItem;
				}
				// 集計金額クリア
				this.tmpWkShukAmnt = inMap.getBigDecimal(JBSbatAKIFM062.SOTEI_AMNT);
				// 入力レコード退避
				this.makeWkRecodeMap(inMap);
			}
		}
		// 「退避．KEY ＝ NULL（初回レコード）」 もしくは
		// 「入力情報 ≠ NULL（最終レコードではない） かつ 退避．KEY ＝ 入力．KEY」 の場合
		if(this.tmpKey == null 
				|| (inMap != null && !isKeyBreak(inMap)))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint,
				"[L][execute][退避．KEY ＝ NULL（初回レコード） または 入力情報 ≠ NULL（最終レコード） かつ 退避．KEY ＝ 入力．KEYの場合]");

			// 「退避．KEY ＝ NULL（初回レコード）」
			if(this.tmpKey == null)
			{
				// (1) 想定金額集計
				// 集計金額クリア
				this.tmpWkShukAmnt = inMap.getBigDecimal(JBSbatAKIFM062.SOTEI_AMNT);
				// 入力レコード退避
				this.makeWkRecodeMap(inMap);
			}
			// ワーク退避．想定金額算出方法コード ≠ "12"（非集計定額料金）
			else if (!JACStrConst.SOTEI_AMNT_SNST_WAY_CD_HISYKTEGAK.equals(this.tmpSoteAmntSnstWayCd))
			{
				// ワーク．集計金額 ← ワーク．集計金額 ＋ 入力．想定金額
				this.tmpWkShukAmnt = this.tmpWkShukAmnt.add(inMap.getBigDecimal(JBSbatAKIFM062.SOTEI_AMNT));
			}
			
		}
		
		this.tmpKey = this.makeStr(inMap.getString(JBSbatAKIFM062.SEIKY_KEI_NO), inMap.getString(JBSbatAKIFM062.SEIRI_NO)
						, inMap.getString(JBSbatAKIFM062.PRC_GRP_CD), inMap.getString(JBSbatAKIFM062.SVC_KEI_NO)
						, inMap.getString(JBSbatAKIFM062.SVC_DTL_SKBT_NO), inMap.getString(JBSbatAKIFM062.PCRS_CD)
						, inMap.getString(JBSbatAKIFM062.UW_PRC_SVC_CD)
						, inMap.getString(JBSbatAKIFM062.UW_PRC_KMK_CD));
		
		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_AK_M_PRCKNS_PRCKMKHN.close();
		db_AK_M_SOTEI_PRC.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * SQLKEY(AK_SELECT_001)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	反映処理区分
	 *		 	料金検証料金項目反映適用開始年月日
	 *		 	料金検証料金項目反映適用終了年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeAK_M_PRCKNS_PRCKMKHN_AK_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());

		// DBアクセスを実行します
		db_AK_M_PRCKNS_PRCKMKHN.selectBySqlDefine(paramList, AK_M_PRCKNS_PRCKMKHN_AK_SELECT_001);
	}
	
	/**
	 * SQLKEY(AK_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 executeAK_M_SOTEI_PRC_AK_SELECT_005(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_AK_M_SOTEI_PRC.selectBySqlDefine(paramList, AK_M_SOTEI_PRC_AK_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 haneiTrnDiv 反映処理区分
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void makePrcknsPrckmkhnMap(String haneiTrnDiv) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makePrcknsPrckmkhnMap]");

		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
	
		// 反映処理区分
		paramList.setValue(haneiTrnDiv);
		// 料金検証料金項目反映適用開始年月日
		paramList.setValue(super.opeDate);
		// 料金検証料金項目反映適用終了年月日
		paramList.setValue(super.opeDate);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makePrcknsPrckmkhnMap][paramList=" + paramList.getList().toString() + "]");

		// SQL実行
		executeAK_M_PRCKNS_PRCKMKHN_AK_SELECT_001(paramList.getList().toArray());
		JBSbatCommonDBInterface dbMap = db_AK_M_PRCKNS_PRCKMKHN.selectNext();
		
		this.tmpPrcknsPrckmkhnMap = new HashMap<String, ArrayList<JBSbatCommonDBInterface>>();
		ArrayList<JBSbatCommonDBInterface> dbList = new ArrayList<JBSbatCommonDBInterface>();

		// 取得出来た場合
		if(dbMap != null)
		{
			// KEY：投入料金項目コード
			String tihKey = dbMap.getString(JBSbatAK_M_PRCKNS_PRCKMKHN.TONYU_PRC_KMK_CD);
			// 取得件数分処理を繰り返す
			while(dbMap != null)
			{
				String key = dbMap.getString(JBSbatAK_M_PRCKNS_PRCKMKHN.TONYU_PRC_KMK_CD);
				// キーが同じ場合、限りリストに追加
				if(key.equals(tihKey))
				{
					dbList.add(dbMap);	// リストに追加
				}
				else
				{
					this.tmpPrcknsPrckmkhnMap.put(tihKey, dbList);		// HashMapへ設定
					tihKey = key;										// 退避キーの置き換え
					dbList = new ArrayList<JBSbatCommonDBInterface>();	// 初期化
					dbList.add(dbMap);
				}
				// 次レコード取得
				dbMap = db_AK_M_PRCKNS_PRCKMKHN.selectNext(); 
			}
			this.tmpPrcknsPrckmkhnMap.put(tihKey, dbList);	// HashMapへ設定
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makePrcknsPrckmkhnMap]");
		return;
	}
	
	/**
	 * 想定料金マスタを検索して、
	 * 料金コースコード・料金サービスコード・料金項目コード・支払契約識別コード・下限値・上限値毎に想定料金ＭＡＰを作成します。
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void makeSoteiPrcMap() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeSoteiPrcMap]");

		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
	
		// 想定料金適用開始年月日
		paramList.setValue(super.opeDate);
		// 想定料金適用終了年月日
		paramList.setValue(super.opeDate);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeSoteiPrcMap][paramList=" + paramList.getList().toString() + "]");

		// SQL実行
		executeAK_M_SOTEI_PRC_AK_SELECT_005(paramList.getList().toArray());
		JBSbatCommonDBInterface dbMap = db_AK_M_SOTEI_PRC.selectNext();
		
		this.tmpSoteiPrcMap = new HashMap<String, ArrayList<JBSbatCommonDBInterface>>();
		ArrayList<JBSbatCommonDBInterface> dbList = new ArrayList<JBSbatCommonDBInterface>();
		
		// 取得出来た場合
		if(dbMap != null)
		{
			// KEY：料金コースコード＋料金サービスコード＋料金項目コード＋ 加入契約支払方式コード＋支払契約識別コード
			String tihKey = makeStr(dbMap.getString(JBSbatAK_M_SOTEI_PRC.PCRS_CD), 
									dbMap.getString(JBSbatAK_M_SOTEI_PRC.PRC_SVC_CD), dbMap.getString(JBSbatAK_M_SOTEI_PRC.PRC_KMK_CD),
									dbMap.getString(JBSbatAK_M_SOTEI_PRC.KANYU_KEI_PAY_HOSHIKI_CD), dbMap.getString(JBSbatAK_M_SOTEI_PRC.PAY_KEI_SKBT_CD));
			// 取得件数分処理を繰り返す
			while(dbMap != null)
			{
				String key = makeStr(dbMap.getString(JBSbatAK_M_SOTEI_PRC.PCRS_CD),
									dbMap.getString(JBSbatAK_M_SOTEI_PRC.PRC_SVC_CD), dbMap.getString(JBSbatAK_M_SOTEI_PRC.PRC_KMK_CD)
						, dbMap.getString(JBSbatAK_M_SOTEI_PRC.KANYU_KEI_PAY_HOSHIKI_CD), dbMap.getString(JBSbatAK_M_SOTEI_PRC.PAY_KEI_SKBT_CD));
				// キーが同じ場合、リストに追加
				if(key.equals(tihKey))
				{
					dbList.add(dbMap);	// リストに追加
				}
				else
				{
					this.tmpSoteiPrcMap.put(tihKey, dbList);			// HashMapへ設定
					tihKey = key;										// 退避キーの置き換え
					dbList = new ArrayList<JBSbatCommonDBInterface>();	// 初期化
					dbList.add(dbMap);
				}
				// 次レコード取得
				dbMap = db_AK_M_SOTEI_PRC.selectNext(); 
			}
			this.tmpSoteiPrcMap.put(tihKey, dbList);	// HashMapへ設定
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeSoteiPrcMap]");
		return;
	}
	
	
	/**
	 * 入力の請求パターン内訳情報を元に、退避レコード（想定請求内訳情報フォーマット）を編集する。
	 * @param inMap     入力電文
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeWkRecodeMap(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeWkRecodeMap]");
		// 請求パターン内訳情報．請求契約番号 ＋ 請求パターン内訳情報．整理番号
		// ワーク退避レコード ← 入力電文
		// 退避レコード．料金サービスコード ← 請求パターン内訳情報．内訳料金サービスコード
		// 退避レコード．料金項目コード     ← 請求パターン内訳情報．内訳料金項目コード
		// ワーク退避．判定用段階決定元項目値 ← 請求パターン内訳情報．判定用段階決定元項目値
		// ワーク退避．想定金額算出方法コード ← 請求パターン内訳情報．想定金額算出方法コード

		this.tmpInMap = new JBSbatServiceInterfaceMap();
		this.tmpInMap.getMap().putAll(inMap.getMap());
		this.tmpInMap.set(JBSbatAKIFM062.PRC_SVC_CD,		inMap.getString(JBSbatAKIFM062.UW_PRC_SVC_CD));
		this.tmpInMap.set(JBSbatAKIFM005.PRC_KMK_CD, 		inMap.getString(JBSbatAKIFM062.UW_PRC_KMK_CD));
		this.tmpHanteiDankaiKmkVl = inMap.getBigDecimal(JBSbatAKIFM062.HANTEI_DANKAI_KMK_VALUE);
		this.tmpSoteAmntSnstWayCd = inMap.getString(JBSbatAKIFM062.SOTEI_AMNT_SNST_WAY_CD);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeWkRecodeMap]");
		return;
	}
	
	/**
	 * キーブレイクチェックを行います。
	 * @param inMap　入力電文
	 * @return boolean true：キーブレイクあり false：キーブレイクなし
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private boolean isKeyBreak(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][isKeyBreak]");
		
		boolean jdgFlg = false;
		// 請求パターン内訳情報．請求契約番号 ＋ 請求パターン内訳情報．整理番号
		// ＋ 請求パターン内訳情報．料金グループコード ＋ 請求パターン内訳情報．サービス契約番号
		// ＋ 請求パターン内訳情報．サービス詳細識別番号 ＋ 請求パターン内訳情報．料金コースコード
		// ＋ 請求パターン内訳情報．内訳料金サービスコード ＋ 請求パターン内訳情報．内訳料金項目コード
		String inKey = this.makeStr(inMap.getString(JBSbatAKIFM062.SEIKY_KEI_NO), inMap.getString(JBSbatAKIFM062.SEIRI_NO)
				, inMap.getString(JBSbatAKIFM062.PRC_GRP_CD), inMap.getString(JBSbatAKIFM062.SVC_KEI_NO)
				, inMap.getString(JBSbatAKIFM062.SVC_DTL_SKBT_NO), inMap.getString(JBSbatAKIFM062.PCRS_CD)
				, inMap.getString(JBSbatAKIFM062.UW_PRC_SVC_CD), inMap.getString(JBSbatAKIFM062.UW_PRC_KMK_CD));
		// キーブレイクチェックを行う。（ 「退避．KEY ≠ NULL」 かつ 「退避．KEY ≠ 入力．KEY」 の場合）
		if(!inKey.equals(this.tmpKey))
		{
			jdgFlg = true;
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isKeyBreak][返却値 = " + jdgFlg + "]");
		
		return jdgFlg;
	}
	
	/**
	 * 集計金額の編集を行います。
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void setShukAmntEdit() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setShukAmntEdit]");
		
		// 退避レコード．想定金額 ← ワーク．集計金額
		this.tmpInMap.set(JBSbatAKIFM062.SOTEI_AMNT, this.tmpWkShukAmnt);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setShukAmntEdit]");
		return;
	}
	
	/**
	 * 想定請求内訳情報出力します。
	 * @param outputInItem  出力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeOutputInfo(JBSbatOutputItem outputInItem) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputInfo]");
		
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		// 入力電文コピー
		outMap.getMap().putAll(this.tmpInMap.getMap());

		// 加入契約支払方式コード
		if(JACStrConst.KANYU_KEI_PAY_HSHK_CD_ZERO.equals(tmpInMap.getString(JBSbatAKIFM062.KANYU_KEI_PAY_HOSHIKI_CD)))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutputTonyuInfo][加入者計約支払方法コード＝000 のため、空を設定]");
			outMap.setString(JBSbatAKIFM005.KANYU_KEI_PAY_HOSHIKI_CD, JACStrConst.KARA_MOJI);
		}
		// 出力フラグ設定
		outMap.setOutFlg(true);
		
		outputInItem.addOutMapList(outMap);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputInfo]");

		return;
	}
	
	/**
	 * 反映処理順上書き処理
	 * 
	 * @param inputhaneiTranJun 入力反映処理順
	 * @param tmpMap            退避レコード
	 * @return addHaneiTrnJun 加算後の反映処理順
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	
	private BigDecimal updateHaneiTrnJun(BigDecimal inputhaneiTranJun, JBSbatServiceInterfaceMap tmpMap) throws Exception
	{
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][updateHaneiTrnJun]");
		
		BigDecimal workHaneiTrnJun = inputhaneiTranJun; //入力時の反映処理順を退避

		// @想定料金マスタ検索
		// KEY：料金コースコード ＋ ワーク退避．料金サービスコード ＋ ワーク退避．料金項目コード 
		// ＋ ワーク退避． 加入契約支払方式コード ＋ 支払契約識別コード（マンション定額以外の場合の固定値）
		String serchKey = makeStr(tmpMap.getString(JBSbatAKIFM062.PCRS_CD), tmpMap.getString(JBSbatAKIFM062.PRC_SVC_CD)
							, tmpMap.getString(JBSbatAKIFM005.PRC_KMK_CD), JACStrConst.KANYU_KEI_PAY_HSHK_CD_ZERO, JACStrConst.PAY_KEI_SKBT_CD_OTHER);
		
		if(this.tmpSoteiPrcMap.containsKey(serchKey))
		{
			ArrayList<JBSbatCommonDBInterface> dbList = this.tmpSoteiPrcMap.get(serchKey);
			// 判定条件取得
			BigDecimal hanteiDankaiKmkValue = this.tmpHanteiDankaiKmkVl;	// ワーク退避．判定用段階決定元項目値
		
			// 該当なしを設定する。
			boolean existFlg = false;
		
			for(int i = 0; i <  dbList.size(); i++)
			{
				JBSbatCommonDBInterface soteiMap = dbList.get(i);
				// 配列情報[]．下限値 ≦ ワーク退避．判定用段階決定元項目値 
				// かつ 配列情報[]．上限値 ＞ ワーク退避．判定用段階決定元項目値
				// 判定条件取得
				BigDecimal lowlValue = soteiMap.getBigDecimal(JBSbatAK_M_SOTEI_PRC.LOWL_VALUE);		// 配列情報[]．下限値
				BigDecimal upplValue = soteiMap.getBigDecimal(JBSbatAK_M_SOTEI_PRC.UPPL_VALUE);		// 配列情報[]．上限値
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateHaneiTrnJun][下限値：" + lowlValue + "]");
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateHaneiTrnJun][上限値：" + upplValue + "]");
				
				if(lowlValue.compareTo(hanteiDankaiKmkValue) <= 0
						&& upplValue.compareTo(hanteiDankaiKmkValue) > 0)
				{
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateHaneiTrnJun][該当あり]");
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateHaneiTrnJun][反映処理順[" + workHaneiTrnJun
							+ "]に割引相殺順[" + soteiMap.getBigDecimal(JBSbatAK_M_SOTEI_PRC.WRIB_SOSAI_JUN) + "]を加算");
					
					// 割引相殺額(数値型)がnullでない場合
					if(null != soteiMap.getBigDecimal(JBSbatAK_M_SOTEI_PRC.WRIB_SOSAI_JUN))
					{
						// 検証結果料金項目反映[n]．反映処理順  ←  検証結果料金項目反映[n]．反映処理順  +  想定料金ＭＡＰ．割引相殺順
						workHaneiTrnJun = workHaneiTrnJun.add(soteiMap.getBigDecimal(JBSbatAK_M_SOTEI_PRC.WRIB_SOSAI_JUN));
						assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateHaneiTrnJun][(加算後)反映処理順[" + workHaneiTrnJun + "]");
					}
				}
			}
		}
		else
		{
			// 該当あり、該当なしを判定し該当なしの場合は何もしない
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][updateHaneiTrnJun][マスタに未存在]");
		}
		
		if(workHaneiTrnJun.compareTo(HANEI_TRN_JUN_MAX_VALUE) >= 0)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint,
						"[L][updateHaneiTrnJun][(加算後)反映処理順が上限値(10000)以上のため、入力時の反映処理順に置換]");
			workHaneiTrnJun = inputhaneiTranJun;
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][updateHaneiTrnJun]");
		return workHaneiTrnJun;
	}
	
	
	/**
	 * 退避レコード．料金項目コードを投入用料金項目コードとして料金検証料金項目反映ＭＡＰを検索する。
	 * 反映先料金項目コードの設定がある場合（複数設定可）、取得した反映制御情報を付加した退避レコード（想定請求内訳情報）を、
	 * 投入用想定請求内訳情報としてマスタ設定分増幅・出力する。
	 * @param outputInItem  出力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeOutputTonyuInfo(JBSbatOutputItem outputInItem) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputTonyuInfo]");
		
		String serchKey = this.tmpInMap.getString(JBSbatAKIFM005.PRC_KMK_CD);	// 料金項目コード
		
		if(this.tmpPrcknsPrckmkhnMap.containsKey(serchKey))
		{
			ArrayList<JBSbatCommonDBInterface> dbList = this.tmpPrcknsPrckmkhnMap.get(serchKey);
			// 取得したレコード分、投入用想定請求内訳情報の編集・出力を繰り返す。
			for(int i = 0; i <  dbList.size(); i++)
			{
				JBSbatCommonDBInterface dbMap = dbList.get(i);
				
				JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
				// 入力電文コピー
				outMap.getMap().putAll(this.tmpInMap.getMap());
				
				//反映処理順の取得
				BigDecimal tmpHaneiTranJun = dbMap.getBigDecimal(JBSbatAK_M_PRCKNS_PRCKMKHN.HANEI_TRN_JUN);
				
				// 反映処理順が割引相殺用のコードであった場合
				if(WRIB_SOSAI_HANEI_TRN_JUN.equals(tmpHaneiTranJun))
				{
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutputTonyuInfo][反映処理順の上書き編集処理呼び出し]");
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutputTonyuInfo][（上書き編集前）反映処理順：" + tmpHaneiTranJun + "]");
					
					//反映処理順の上書き編集処理呼び出し
					tmpHaneiTranJun = updateHaneiTrnJun(tmpHaneiTranJun, this.tmpInMap);
					
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutputTonyuInfo][（上書き編集後）反映処理順：" + tmpHaneiTranJun + "]");
				}
				
				// 加入契約支払方式コード
				if(JACStrConst.KANYU_KEI_PAY_HSHK_CD_ZERO.equals(tmpInMap.getString(JBSbatAKIFM062.KANYU_KEI_PAY_HOSHIKI_CD)))
				{
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutputTonyuInfo][加入者計約支払方法コード＝000 のため、空を設定]");
					outMap.setString(JBSbatAKIFM010.KANYU_KEI_PAY_HOSHIKI_CD, JACStrConst.KARA_MOJI);
				}
				
				// 反映先料金項目コード
				outMap.set(JBSbatAKIFM010.HANEI_SAKI_PRC_KMK_CD,		dbMap.getString(JBSbatAK_M_PRCKNS_PRCKMKHN.HANEI_SAKI_PRC_KMK_CD));
				// 反映処理順
				outMap.set(JBSbatAKIFM010.HANEI_TRN_JUN, 				tmpHaneiTranJun);
				// 反映先作成可否
				outMap.set(JBSbatAKIFM010.HANEI_SAKI_SKSI_KH, 			dbMap.getString(JBSbatAK_M_PRCKNS_PRCKMKHN.HANEI_SAKI_SKSI_KH));
				// 料金項目反映方法コード
				outMap.set(JBSbatAKIFM010.PRC_KMK_HANEI_WAY_CD, 		dbMap.getString(JBSbatAK_M_PRCKNS_PRCKMKHN.PRC_KMK_HANEI_WAY_CD));
				// 結果料金項目コード
				outMap.set(JBSbatAKIFM010.RSLT_PRC_KMK_CD, 				dbMap.getString(JBSbatAK_M_PRCKNS_PRCKMKHN.RSLT_PRC_KMK_CD));
				// 結果存在チェックレベルコード
				outMap.set(JBSbatAKIFM010.RSLT_SONZAI_CHK_LV_CD, 		dbMap.getString(JBSbatAK_M_PRCKNS_PRCKMKHN.RSLT_SONZAI_CHK_LV_CD));
				// 結果金額チェックレベルコード
				outMap.set(JBSbatAKIFM010.RSLT_AMNT_CHK_LV_CD, 			dbMap.getString(JBSbatAK_M_PRCKNS_PRCKMKHN.RSLT_AMNT_CHK_LV_CD));
				// 金額反映方法コード
				outMap.set(JBSbatAKIFM010.AMNT_HANEI_WAY_CD, 			dbMap.getString(JBSbatAK_M_PRCKNS_PRCKMKHN.AMNT_HANEI_WAY_CD));
				// 結果０円時計算方法コード
				outMap.set(JBSbatAKIFM010.RSLT_0_YEN_JI_CALC_WAY_CD, 	dbMap.getString(JBSbatAK_M_PRCKNS_PRCKMKHN.RSLT_0_YEN_JI_CALC_WAY_CD));
				// 反映限度額
				outMap.set(JBSbatAKIFM010.HANEI_GEND_AMNT, 				dbMap.getString(JBSbatAK_M_PRCKNS_PRCKMKHN.HANEI_GEND_AMNT));
				// 結果出力方法コード
				outMap.set(JBSbatAKIFM010.RSLT_OPUT_WAY_CD, 			dbMap.getString(JBSbatAK_M_PRCKNS_PRCKMKHN.RSLT_OPUT_WAY_CD));
				// 結果丸め方法コード
				outMap.set(JBSbatAKIFM010.RSLT_ROUND_WAY_CD, 			dbMap.getString(JBSbatAK_M_PRCKNS_PRCKMKHN.RSLT_ROUND_WAY_CD));
				// 出力フラグ設定
				outMap.setOutFlg(true);
				
				outputInItem.addOutMapList_2(outMap);
			}
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputTonyuInfo]");
		return;
	}
}
