/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatAKKapSeikyPtnuwskse
*	ソースファイル名	：JBSbatAKKapSeikyPtnuwskse.java
*	作成者				：富士通　
*	作成日				：2013年03月06日
*＜機能概要＞
*　割賦契約請求パターン内訳情報作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00.00	2013/03/06   富士通		新規作成
*	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.JACbatRknBusinessUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatAKIFM062;
import eo.business.util.file.JBSbatAKIFM019;
import eo.business.util.table.JBSbatAK_M_SEIKY_PTN_UW;
import eo.business.util.table.JBSbatAK_M_KAP_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 JBSbatAKKapSeikyPtnuwskse extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(割賦想定料金)*/
	private static final String D_TBL_NAME_AK_M_KAP_SOTEI_PRC = "AK_M_KAP_SOTEI_PRC";

	/** テーブル(請求パターン内訳)*/
	private static final String D_TBL_NAME_AK_M_SEIKY_PTN_UW = "AK_M_SEIKY_PTN_UW";

	/** SQL定義キー(AK_SELECT_001)*/
	private static final String AK_M_KAP_SOTEI_PRC_AK_SELECT_001 = "AK_SELECT_001";

	/** SQL定義キー(AK_SELECT_001)*/
	private static final String AK_M_SEIKY_PTN_UW_AK_SELECT_001 = "AK_SELECT_001";

	/** テーブルアクセスクラス(割賦想定料金)*/
	private JBSbatSQLAccess db_AK_M_KAP_SOTEI_PRC = null;

	/** テーブルアクセスクラス(請求パターン内訳)*/
	private JBSbatSQLAccess db_AK_M_SEIKY_PTN_UW = null;
	
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 請求パターン内訳ＭＡＰ */
	private HashMap<String, ArrayList<JBSbatCommonDBInterface>> seikyPtnUwMap = null;
	
	/** 退避．想定料金マップ */
	private HashMap<String, ArrayList<JBSbatCommonDBInterface>> tmpKapSoteiPrcMap = null;
	
	/** 退避．請求年月 */
	private String tmpSeikyYm = null;
	
	/** 退避．月初日 */
	private String tmpMonStaDay = null;
	
	/** 退避．月末日 */
	private String tmpMonEndDay = null;
	
	/** 退避．料金計算日 */
	private String tmpEventYmd = null;
	
	/** 固定値：1 */
	private static final BigDecimal ONE = new BigDecimal("1");
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_AK_M_KAP_SOTEI_PRC = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AK_M_KAP_SOTEI_PRC);
		db_AK_M_SEIKY_PTN_UW = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AK_M_SEIKY_PTN_UW);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		
		// 請求パターン内訳ＭＡＰ作成
		this.seikyPtnUwMapmake();
		
		// 割賦想定料金ＭＡＰ作成
		this.makeKapSoteiPrcMap();
		
		// 請求年月・月初日・月末日・料金計算日・暦日数取得
		this.getSchdlInfo();
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial]");


	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert inMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][inMap = " + inMap.getMap().toString() + "]") : true;
		
		JBSbatOutputItem outputItem = new JBSbatOutputItem();
		
		// 請求パターン内訳マスタ抽出
		ArrayList<JBSbatCommonDBInterface> seikyPtnUwList = seikyPtnUwMap.get(inMap.getString(JBSbatAKIFM019.SEIKY_PTN_CD));
		
		if(null != seikyPtnUwList)
		{		
			JBSbatCommonDBInterface dbMap = new JBSbatCommonDBInterface();
			for(JBSbatCommonDBInterface tmpMap : seikyPtnUwList)
			{
				dbMap.getMap().putAll(tmpMap.getMap());
				// 請求パターン内訳情報作成
				seikyPtnUwInfoMake(inMap, dbMap);

				// 想定料金算出
				BigDecimal soteiPrc = soteiPrcCalc(inMap, dbMap);

				makeOutputInfo(inMap, dbMap, soteiPrc, outputItem);
			}
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_AK_M_KAP_SOTEI_PRC.close();
		db_AK_M_SEIKY_PTN_UW.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * 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_KAP_SOTEI_PRC_AK_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_AK_M_KAP_SOTEI_PRC.selectBySqlDefine(paramList, AK_M_KAP_SOTEI_PRC_AK_SELECT_001);
	}

	/**
	 * 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_SEIKY_PTN_UW_AK_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_AK_M_SEIKY_PTN_UW.selectBySqlDefine(paramList, AK_M_SEIKY_PTN_UW_AK_SELECT_001);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * 請求パターン内訳マスタを検索して、請求パターンコード毎に請求パターン内訳ＭＡＰを作成します。
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void seikyPtnUwMapmake() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][seikyPtnUwMapmake]");
		
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		
		paramList.setValue(super.opeDate);			// バッチ運用日
		paramList.setValue(super.opeDate);			// バッチ運用日
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][seikyPtnUwMapmake][paramList=" + paramList.getList().toString() + "]");
		
		// 請求パターン内訳抽出
		executeAK_M_SEIKY_PTN_UW_AK_SELECT_001(paramList.getList().toArray());
		
		// 結果取得
		JBSbatCommonDBInterface dbMap = db_AK_M_SEIKY_PTN_UW.selectNext();
		String ptnCd = null;
		String bkPtnCd = null;
		seikyPtnUwMap = new HashMap<String, ArrayList<JBSbatCommonDBInterface>>();
		
		ArrayList<JBSbatCommonDBInterface> seikyPtnUwList = null;
		while(dbMap != null)
		{
			ptnCd = dbMap.getString(JBSbatAK_M_SEIKY_PTN_UW.SEIKY_PTN_CD);
			
			if(!ptnCd.equals(bkPtnCd))
			{
				if(bkPtnCd != null)
				{
					seikyPtnUwMap.put(bkPtnCd, seikyPtnUwList);
				}
				seikyPtnUwList = new ArrayList<JBSbatCommonDBInterface>();
				bkPtnCd = ptnCd;
			}
			
			seikyPtnUwList.add(dbMap);
			
			dbMap = db_AK_M_SEIKY_PTN_UW.selectNext();
		}
		
		seikyPtnUwMap.put(ptnCd, seikyPtnUwList);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][seikyPtnUwMapmake]");
		return;
	}
	
	/**
	 * 割賦想定料金マスタを検索して、
	 * 料金コースコード・割賦プランコード・料金項目コード毎に想定料金ＭＡＰを作成します。（下限値・上限値についてはＳＱＬにて絞り込み済み。）
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void makeKapSoteiPrcMap() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeKapSoteiPrcMap]");

		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
	
		// 想定料金適用開始・終了年月日
		paramList.setValue(super.opeDate);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeKapSoteiPrcMap][paramList=" + paramList.getList().toString() + "]");

		// SQL実行
		executeAK_M_KAP_SOTEI_PRC_AK_SELECT_001(paramList.getList().toArray());
		JBSbatCommonDBInterface dbMap = db_AK_M_KAP_SOTEI_PRC.selectNext();
		
		this.tmpKapSoteiPrcMap = new HashMap<String, ArrayList<JBSbatCommonDBInterface>>();
		ArrayList<JBSbatCommonDBInterface> dbList = new ArrayList<JBSbatCommonDBInterface>();
		
		// 取得出来た場合
		if(dbMap != null)
		{
			// KEY：料金コースコード＋割賦プランコード＋料金項目コード
			String tihKey = makeStr(dbMap.getString(JBSbatAK_M_KAP_SOTEI_PRC.PCRS_CD),dbMap.getString(JBSbatAK_M_KAP_SOTEI_PRC.KAP_PLAN_CD), dbMap.getString(JBSbatAK_M_KAP_SOTEI_PRC.PRC_KMK_CD));
			// 取得件数分処理を繰り返す
			while(dbMap != null)
			{
				String key = makeStr(dbMap.getString(JBSbatAK_M_KAP_SOTEI_PRC.PCRS_CD),dbMap.getString(JBSbatAK_M_KAP_SOTEI_PRC.KAP_PLAN_CD), dbMap.getString(JBSbatAK_M_KAP_SOTEI_PRC.PRC_KMK_CD));
				// キーが同じ場合、リストに追加
				if(key.equals(tihKey))
				{
					dbList.add(dbMap);	// リストに追加
				}
				else
				{
					this.tmpKapSoteiPrcMap.put(tihKey, dbList);			// HashMapへ設定
					tihKey = key;										// 退避キーの置き換え
					dbList = new ArrayList<JBSbatCommonDBInterface>();	// 初期化
					dbList.add(dbMap);
				}
				// 次レコード取得
				dbMap = db_AK_M_KAP_SOTEI_PRC.selectNext(); 
			}
			this.tmpKapSoteiPrcMap.put(tihKey, dbList);	// HashMapへ設定
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeKapSoteiPrcMap]");
		return;
	}
	
	/**
	 * 文字を連結します。
	 * 
	 * @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();
	}
	
	/**
	 * 料金スケジュール定義アクセス部品を使用してスケジュール情報を取得します。
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void getSchdlInfo() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getSchdlInfo]");
		
		JACbatSchdlUtil schdlUtil = new JACbatSchdlUtil(commonItem);
		try
		{
			// 請求年月
			this.tmpSeikyYm 		= schdlUtil.getBillDate(super.opeDate, JACStrConst.EVENT_CD_PRC_CALC_DAY);
			// 月初日[0] 月末日[1]
			String[] ymd 		= schdlUtil.getUseStrEnd(this.tmpSeikyYm, JACStrConst.EVENT_CD_USE_STAYMD, JACStrConst.EVENT_CD_USE_ENDYMD);
			this.tmpMonStaDay 	= ymd[0];
			this.tmpMonEndDay 	= ymd[1];
			// 料金計算日
			this.tmpEventYmd 	= schdlUtil.getUseStrEnd(this.tmpSeikyYm, JACStrConst.EVENT_CD_USE_STAYMD, JACStrConst.EVENT_CD_PRC_CALC_DAY)[1];
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getSchdlInfo][請求年月=" + this.tmpSeikyYm + "]");
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getSchdlInfo][月初日=" + this.tmpMonStaDay + "]");
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getSchdlInfo][月末日=" + this.tmpMonEndDay + "]");
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getSchdlInfo][料金計算日=" + this.tmpEventYmd + "]");
		}
		finally
		{
			schdlUtil.close();
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getSchdlInfo]");
		return;
	}
	
	/**
	 * 請求パターン内訳情報を作成します。
	 * 
	 * @param inMap 入力情報
	 * @param dbMap 請求内訳パターンマスタ
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void seikyPtnUwInfoMake(JBSbatServiceInterfaceMap inMap, JBSbatCommonDBInterface dbMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][seikyPtnUwInfoMake]");
		int dankaiKeteiMotoKmkDiv = Integer.parseInt(dbMap.getString(JBSbatAK_M_SEIKY_PTN_UW.DANKAI_KETEI_MOTO_KMK_DIV));
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][seikyPtnUwInfoMake][ 段階決定元項目区分：" + dankaiKeteiMotoKmkDiv + "]");
		
		// 請求パターン内訳の内訳料金サービスコードが空白だった場合
		if(JACStrConst.KARA_MOJI.equals(dbMap.getString(JBSbatAK_M_SEIKY_PTN_UW.UW_PRC_SVC_CD).trim()))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][seikyPtnUwInfoMake][請求パターン内訳の内訳料金サービスコードが空白のため、入力．料金サービスコードを使用");
			// 入力．料金サービスコードを設定
			dbMap.setValue(JBSbatAK_M_SEIKY_PTN_UW.UW_PRC_SVC_CD, inMap.getString(JBSbatAKIFM019.PRC_SVC_CD));
		}
		
		// 判定用段階決定元項目値を設定
		switch(dankaiKeteiMotoKmkDiv)
		{
		case 0:
			dbMap.setValue(JBSbatAKIFM062.HANTEI_DANKAI_KMK_VALUE, inMap.getBigDecimal(JBSbatAKIFM019.HANTEI_DANKAI_KMK_VALUE));
			break;
			
		case 3:
			dbMap.setValue(JBSbatAKIFM062.HANTEI_DANKAI_KMK_VALUE, inMap.getBigDecimal(JBSbatAKIFM019.CHRG_KEIZOKU_MON_CNT));
			break;
			
		case 5:
			dbMap.setValue(JBSbatAKIFM062.HANTEI_DANKAI_KMK_VALUE, inMap.getBigDecimal(JBSbatAKIFM019.KEI_CNT));
			break;
			
		case 6:
			dbMap.setValue(JBSbatAKIFM062.HANTEI_DANKAI_KMK_VALUE, inMap.getBigDecimal(JBSbatAKIFM019.KAP_PAY_ZAN_CNT));
			break;
			
		default:
			dbMap.setValue(JBSbatAKIFM062.HANTEI_DANKAI_KMK_VALUE, inMap.getBigDecimal(JBSbatAKIFM019.HANTEI_DANKAI_KMK_VALUE));
			break;
		
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][seikyPtnUwInfoMake][ 判定用段階決定元項目値：" + dbMap.getBigDecimal(JBSbatAKIFM062.HANTEI_DANKAI_KMK_VALUE) + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][seikyPtnUwInfoMake]");
		return;
	}
	
	
	/**
	 * 想定料金を算出します。
	 * 
	 * @param inMap 入力情報
	 * @param dbMap 請求内訳パターンマスタ
	 * @return tmpWkSoteiAmnt 想定料金
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private BigDecimal soteiPrcCalc(JBSbatServiceInterfaceMap inMap, JBSbatCommonDBInterface dbMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][soteiPrcCalc]");
		
		String ptnPrcUseFlg 		= dbMap.getString(JBSbatAK_M_SEIKY_PTN_UW.PTN_PRC_USE_FLG);
		String soteiAmntSnstWayCd 	= dbMap.getString(JBSbatAK_M_SEIKY_PTN_UW.SOTEI_AMNT_SNST_WAY_CD);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][soteiPrcCalc][パターン料金使用フラグ：" + ptnPrcUseFlg + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][soteiPrcCalc][想定金額算出方法コード：" + soteiAmntSnstWayCd + "]");
		BigDecimal tmpWkSoteiAmnt = BigDecimal.ZERO;;
		BigDecimal[] tmpWkKapSoteiAmnt = null;
		
		if(JACStrConst.PTN_PRC_USE_FLG_ON.equals(ptnPrcUseFlg))
		{
			// パターン料金使用
			tmpWkSoteiAmnt = ptnPrcUse(inMap, dbMap);

		}
		else if(JACStrConst.PTN_PRC_USE_FLG_OFF.equals(ptnPrcUseFlg))
		{
			if(JACStrConst.SOTEI_AMNT_SNST_WAY_CD_KAPPRC1.equals(soteiAmntSnstWayCd))
			{
				// 割賦想定料金取得
				tmpWkKapSoteiAmnt = getKapWrbkPrc(inMap, dbMap);
				// 初回想定料金を設定
				tmpWkSoteiAmnt = tmpWkKapSoteiAmnt[0];

			}
			else if(JACStrConst.SOTEI_AMNT_SNST_WAY_CD_KAPPRC2.equals(soteiAmntSnstWayCd))
			{
				// 割賦想定料金取得
				tmpWkKapSoteiAmnt = getKapWrbkPrc(inMap, dbMap);
				// 継続想定料金を設定
				tmpWkSoteiAmnt = tmpWkKapSoteiAmnt[1];

			}
			else if(JACStrConst.SOTEI_AMNT_SNST_WAY_CD_KAPIKTS.equals(soteiAmntSnstWayCd))
			{
				// 割賦想定料金取得
				tmpWkKapSoteiAmnt = getKapWrbkPrc(inMap, dbMap);
				
				//割賦一括切替時想定金額算出
				tmpWkSoteiAmnt = snstKapIktSwichSoteiAmnt(inMap, dbMap, tmpWkKapSoteiAmnt);
			}
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][soteiPrcCalc][想定算出料金：" + tmpWkSoteiAmnt + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][soteiPrcCalc]");
		return tmpWkSoteiAmnt;
	}
	

	/**
	 * パターン料金使用
	 * 
	 * @param inMap 入力情報
	 * @param dbMap 請求内訳パターンマスタ
	 * @return tmpWkSoteiAmnt 想定料金
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private BigDecimal ptnPrcUse(JBSbatServiceInterfaceMap inMap, JBSbatCommonDBInterface dbMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][ptnPrcUse]");
		
		BigDecimal tmpWkSoteiAmnt = null;
		
		// ワーク．想定金額　←　ワーク．想定料金（そのまま）
		tmpWkSoteiAmnt = dbMap.getBigDecimal(JBSbatAK_M_SEIKY_PTN_UW.PTN_PRC);

		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][ptnPrcUse][想定料金：" + tmpWkSoteiAmnt + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][ptnPrcUse]");
		return tmpWkSoteiAmnt;
	}

	/**
	 * 割賦想定料金取得
	 * 
	 * @param inMap 入力情報
	 * @param dbMap 請求内訳パターンマスタ
	 * @return tmpWkSoteiAmnt[] [0]:初回想定料金 [1]:継続想定料金
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private BigDecimal[] getKapWrbkPrc(JBSbatServiceInterfaceMap inMap, JBSbatCommonDBInterface dbMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getKapWrbkPrc]");
		BigDecimal tmpWkSoteiAmn[] = new BigDecimal[2];
		tmpWkSoteiAmn[0] = BigDecimal.ZERO;
		tmpWkSoteiAmn[1] = BigDecimal.ZERO;
		
		// 割賦想定料金マスタ検索
		// KEY：料金コースコード ＋ ワーク退避．内訳料金サービスコード ＋ ワーク退避．内訳料金科目コード
		String serchKey = makeStr(inMap.getString(JBSbatAKIFM019.PCRS_CD), dbMap.getString(JBSbatAK_M_SEIKY_PTN_UW.UW_PRC_SVC_CD).trim(), dbMap.getString(JBSbatAK_M_SEIKY_PTN_UW.UW_PRC_KMK_CD));

		if(this.tmpKapSoteiPrcMap.containsKey(serchKey))
		{
			ArrayList<JBSbatCommonDBInterface> dbList = this.tmpKapSoteiPrcMap.get(serchKey);
			
			// 該当なしを設定する。
			boolean existFlg = false;

			for(int i = 0; i <  dbList.size(); i++)	
			{
				JBSbatCommonDBInterface soteiMap = dbList.get(i);
				
				BigDecimal firstSoteiPrc = soteiMap.getBigDecimal(JBSbatAK_M_KAP_SOTEI_PRC.FIRST_SOTEI_PRC);
				BigDecimal keizokuSoteiPrc = soteiMap.getBigDecimal(JBSbatAK_M_KAP_SOTEI_PRC.KEIZOKU_SOTEI_PRC);
					// 想定料金算出
					tmpWkSoteiAmn[0] = firstSoteiPrc;
					tmpWkSoteiAmn[1] = keizokuSoteiPrc;
										
					// 該当ありの場合、trueを設定する。
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getKapWrbkPrc][該当あり]");
					existFlg = true;
			}
			
			// 該当あり、該当なしを判定し該当なしの場合
			if(!existFlg)
			{
				// 現仕様ではキーが一致した段階で、割賦想定料金スキーマのＰＫを指定した状態と同じため、0件、N件は通常あり得ない。
				// ただ、今後も考え安全のため処理を残す。
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getKapWrbkPrc][該当なし]");
				tmpWkSoteiAmn[0] = BigDecimal.ZERO;
				tmpWkSoteiAmn[1] = BigDecimal.ZERO;	
			}
		}
		else
		{
			// 割賦想定料金マスタにデータが存在しない場合
			assert JACbatDebugLogUtil.printDebugLog(super.	logPrint, "[L][getKapWrbkPrc][マスタに未存在]");
			tmpWkSoteiAmn[0] = BigDecimal.ZERO;
			tmpWkSoteiAmn[1] = BigDecimal.ZERO;

		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getKapWrbkPrc][初回想定料金：" + tmpWkSoteiAmn[0] + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getKapWrbkPrc][継続想定料金：" + tmpWkSoteiAmn[1] + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getKapWrbkPrc]");
		return tmpWkSoteiAmn;
	}

	/**
	 * 割賦一括切替時想定金額算出
	 * 
	 * @param inMap 入力情報
	 * @param dbMap 請求内訳パターンマスタ
	 * @param tmpWkKapSoteiAmnt[] [0]:初回想定料金 [1]:継続想定料金
	 * @return tmpWkSoteiAmnt 想定金額
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private BigDecimal snstKapIktSwichSoteiAmnt( JBSbatServiceInterfaceMap inMap, JBSbatCommonDBInterface dbMap,BigDecimal[] tmpWkKapSoteiAmnt) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][snstKapIktSwichSoteiAmnt]");
	
		BigDecimal tmpWkSoteiAmnt  = BigDecimal.ZERO;
				
		BigDecimal intkapSeikyZumiCnt = inMap.getBigDecimal(JBSbatAKIFM019.KAP_SEIKY_ZUMI_CNT); // 割賦請求済回数
		
		if( intkapSeikyZumiCnt.intValue() > 0 )
		{
			// 割賦支払残回数　×　継続想定料金
			tmpWkSoteiAmnt	=  inMap.getBigDecimal(JBSbatAKIFM019.KAP_PAY_ZAN_CNT).multiply(tmpWkKapSoteiAmnt[1]);
		}
		else if ( intkapSeikyZumiCnt.intValue() == 0)
		{
			// 想定金額　＝　初回想定料金　＋　(入力．割賦支払残回数 − １) 　×　継続想定料金
			tmpWkSoteiAmnt = tmpWkKapSoteiAmnt[0].add(((inMap.getBigDecimal(JBSbatAKIFM019.KAP_PAY_ZAN_CNT)).subtract(ONE)).multiply(tmpWkKapSoteiAmnt[1]));
		}
		
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][snstKapIktSwichSoteiAmnt][割賦一括切替時想定金額：" + tmpWkSoteiAmnt + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][snstKapIktSwichSoteiAmnt]");
		return tmpWkSoteiAmnt;
	}
	
	/**
	 * 割賦請求パターン内訳情報を出力します。
	 * 
	 * @param wkMap ワーク退避レコード
	 * @param dbMap 請求内訳パターンマスタ
	 * @param soteiPrc 想定料金
	 * @param outputInItem  出力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeOutputInfo(JBSbatServiceInterfaceMap wkMap, JBSbatCommonDBInterface dbMap, BigDecimal soteiPrc,  JBSbatOutputItem outputInItem) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputInfo]");
		
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// 単純移送項目
		outMap.setString(JBSbatAKIFM062.CHST_KEI_SKB_CD, 	wkMap.getString(JBSbatAKIFM019.CHST_KEI_SKB_CD));
		outMap.setString(JBSbatAKIFM062.PRC_GRP_CD, 		wkMap.getString(JBSbatAKIFM019.PRC_GRP_CD));
		outMap.setString(JBSbatAKIFM062.PCRS_CD, 			wkMap.getString(JBSbatAKIFM019.PCRS_CD));
		outMap.setString(JBSbatAKIFM062.PRC_SVC_CD, 		wkMap.getString(JBSbatAKIFM019.PRC_SVC_CD));
		outMap.setString(JBSbatAKIFM062.SYSID,			 	wkMap.getString(JBSbatAKIFM019.SYSID));
		outMap.setString(JBSbatAKIFM062.SEIRI_NO, 			wkMap.getString(JBSbatAKIFM019.SEIRI_NO));
		outMap.setString(JBSbatAKIFM062.SEIKY_KEI_NO, 		wkMap.getString(JBSbatAKIFM019.SEIKY_KEI_NO));
		outMap.setString(JBSbatAKIFM062.SVC_KEI_NO, 		wkMap.getString(JBSbatAKIFM019.SVC_KEI_NO));
		outMap.setString(JBSbatAKIFM062.SVC_KEI_UCWK_NO, 	wkMap.getString(JBSbatAKIFM019.SVC_KEI_UCWK_NO));
		outMap.setString(JBSbatAKIFM062.OP_SVC_KEI_NO,	 	wkMap.getString(JBSbatAKIFM019.OP_SVC_KEI_NO));
		outMap.setString(JBSbatAKIFM062.SBOP_SVC_KEI_NO, 	wkMap.getString(JBSbatAKIFM019.SBOP_SVC_KEI_NO));
		outMap.setString(JBSbatAKIFM062.KKTK_SVC_KEI_NO, 	wkMap.getString(JBSbatAKIFM019.KKTK_SVC_KEI_NO));
		outMap.setString(JBSbatAKIFM062.SEIOPSVC_KEI_NO, 	wkMap.getString(JBSbatAKIFM019.SEIOPSVC_KEI_NO));
		outMap.setString(JBSbatAKIFM062.WRIB_SVC_KEI_NO, 	wkMap.getString(JBSbatAKIFM019.WRIB_SVC_KEI_NO));
		outMap.setString(JBSbatAKIFM062.GENE_ADD_DTM,	 	wkMap.getString(JBSbatAKIFM019.GENE_ADD_DTM));
		outMap.setString(JBSbatAKIFM062.SVC_KEI_STAT, 		wkMap.getString(JBSbatAKIFM019.SVC_KEI_STAT));
		outMap.setString(JBSbatAKIFM062.RSV_APLY_YMD, 		wkMap.getString(JBSbatAKIFM019.RSV_APLY_YMD));
		
		
		// 編集要項目
		outMap.setString(JBSbatAKIFM062.PLAN_STAYMD, 	wkMap.getString(JBSbatAKIFM019.KAP_KEI_CNC_YMD));
		outMap.setString(JBSbatAKIFM062.PLAN_ENDYMD, 	wkMap.getString(JBSbatAKIFM019.KAP_KEI_DSL_YMD));
		
		// 割賦一括請求切替年月≠空の場合
		if(!"".equals(wkMap.getString(JBSbatAKIFM019.KAP_IKT_SIKY_SWCH_YM)))
		{
			// 割賦一括請求切替年月＋'01'
			StringBuffer wkKapIktSikySwchYm = new StringBuffer(wkMap.getString(JBSbatAKIFM019.KAP_IKT_SIKY_SWCH_YM));
			outMap.setString(JBSbatAKIFM062.PLAN_CHRG_STAYMD, 	(wkKapIktSikySwchYm.append(JACStrConst.STR_OF_MONTH)).toString());	
		}
		else
		{
			// 割賦請求開始年月＋'01'
			StringBuffer wkKapSeikyStaYm  =  new StringBuffer(wkMap.getString(JBSbatAKIFM019.KAP_SEIKY_STA_YM));
			outMap.setString(JBSbatAKIFM062.PLAN_CHRG_STAYMD, 	(wkKapSeikyStaYm.append(JACStrConst.STR_OF_MONTH)).toString());	
		}
		
		outMap.setString(JBSbatAKIFM062.PLAN_CHRG_ENDYMD,			wkMap.getString(JBSbatAKIFM019.KAP_SEIKY_ENDYMD));
		outMap.setString(JBSbatAKIFM062.SVC_STA_YMD, 				wkMap.getString(JBSbatAKIFM019.KAP_KEI_CNC_YMD));
		outMap.setString(JBSbatAKIFM062.SVC_CHRG_STAYMD,			wkMap.getString(JBSbatAKIFM019.KAP_KEI_CHRG_STAYMD));
		outMap.setString(JBSbatAKIFM062.SVC_ENDYMD, 				wkMap.getString(JBSbatAKIFM019.KAP_SEIKY_ENDYMD));
		outMap.setString(JBSbatAKIFM062.SVC_CHRG_ENDYMD,			wkMap.getString(JBSbatAKIFM019.KAP_SEIKY_ENDYMD));
		outMap.setString(JBSbatAKIFM062.SVC_DSL_YMD, 				wkMap.getString(JBSbatAKIFM019.KAP_KEI_DSL_YMD));

		outMap.setString(JBSbatAKIFM062.PNLTY_HASSEI_CD, 			wkMap.getString(JBSbatAKIFM019.PNLTY_HASSEI_CD));
		outMap.setString(JBSbatAKIFM062.IDO_DIV, 					wkMap.getString(JBSbatAKIFM019.IDO_DIV));
		outMap.setString(JBSbatAKIFM062.SEIKY_YM, 					wkMap.getString(JBSbatAKIFM019.SEIKY_YM));
		outMap.setString(JBSbatAKIFM062.PRCKNS_KEI_STAT_CD, 		wkMap.getString(JBSbatAKIFM019.PRCKNS_KEI_STAT_CD));
		outMap.setBigDecimal(JBSbatAKIFM062.CHRG_KEIZOKU_MON_CNT, 	wkMap.getBigDecimal(JBSbatAKIFM019.CHRG_KEIZOKU_MON_CNT));
		outMap.setBigDecimal(JBSbatAKIFM062.KEI_CNT, 				wkMap.getBigDecimal(JBSbatAKIFM019.KEI_CNT));
		
		outMap.setBigDecimal(JBSbatAKIFM062.HANTEI_DANKAI_KMK_VALUE,dbMap.getBigDecimal(JBSbatAKIFM062.HANTEI_DANKAI_KMK_VALUE));

		outMap.setString(JBSbatAKIFM062.MANSION_ID,					wkMap.getString(JBSbatAKIFM019.MANSION_ID));
		outMap.setString(JBSbatAKIFM062.TK_HOSHIKI_KEI_NO,			wkMap.getString(JBSbatAKIFM019.TK_HOSHIKI_KEI_NO));
		outMap.setString(JBSbatAKIFM062.KANYU_KEI_PAY_HOSHIKI_CD,	wkMap.getString(JBSbatAKIFM019.KANYU_KEI_PAY_HOSHIKI_CD));
		outMap.setString(JBSbatAKIFM062.PAY_KEI_SKBT_CD,			wkMap.getString(JBSbatAKIFM019.PAY_KEI_SKBT_CD));
		outMap.setString(JBSbatAKIFM062.SEIKY_PTN_CD,				wkMap.getString(JBSbatAKIFM019.SEIKY_PTN_CD));


		// 請求パターン内訳マスタの同項目 (空白時は前処理にて入力・料金パターンコードに置き換え済み)
		outMap.setString(JBSbatAKIFM062.UW_PRC_SVC_CD, 			dbMap.getString(JBSbatAK_M_SEIKY_PTN_UW.UW_PRC_SVC_CD));
		
		outMap.setString(JBSbatAKIFM062.UW_PRC_KMK_CD, 				dbMap.getString(JBSbatAK_M_SEIKY_PTN_UW.UW_PRC_KMK_CD));
		outMap.setString(JBSbatAKIFM062.SONZAI_CHK_LV_CD,			dbMap.getString(JBSbatAK_M_SEIKY_PTN_UW.SONZAI_CHK_LV_CD));
		outMap.setString(JBSbatAKIFM062.AMNT_CHK_LV_CD, 			dbMap.getString(JBSbatAK_M_SEIKY_PTN_UW.AMNT_CHK_LV_CD));
		outMap.setString(JBSbatAKIFM062.SOTEI_AMNT_SNST_WAY_CD, 	dbMap.getString(JBSbatAK_M_SEIKY_PTN_UW.SOTEI_AMNT_SNST_WAY_CD));
		outMap.setString(JBSbatAKIFM062.DANKAI_KETEI_MOTO_KMK_DIV, 	dbMap.getString(JBSbatAK_M_SEIKY_PTN_UW.DANKAI_KETEI_MOTO_KMK_DIV));
		outMap.setString(JBSbatAKIFM062.SOTEI_AMNT, 				soteiPrc);
		
		outMap.setString(JBSbatAKIFM062.KKOP_SVC_KEI_NO, 			JACStrConst.KKOP_SVC_KEI_NO_SP);
		
		outMap.setString(JBSbatAKIFM062.SVC_DTL_SKBT_NO, JACbatRknBusinessUtil.fillHalfSpace(wkMap.getString(JBSbatAKIFM019.KKTK_SVC_KEI_NO)
						, JACStrConst.SVC_DTL_SKBT_NO_LENGTH, true));
		
		
		// 出力フラグ設定
		outMap.setOutFlg(true);
		
		outputInItem.addOutMapList(outMap);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputInfo]");

		return;
	}



}
