/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatCHPrcKmkAddCkan
*	ソースファイル名	：JBSbatCHPrcKmkAddCkan.java
*	作成者				：富士通　
*	作成日				：2012年07月13日
*＜機能概要＞
*　料金項目追加置換部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v3.00		2012/07/13   FJ）冨井	【IT2-2012-0001331】新規作成
*	v3.01		2012/08/03   FJ）冨井	【TGI-2012-0000054】ダミーレコード設定位置修正
*	v3.02		2012/08/09   FJ）冨井	【TGI-2012-0000090】性能改善
*	v3.03		2013/05/02   FJ）後藤	【TGI-2013-0000154】置換判定・処理のマスタ設定方法変更に伴う修正
*	v3.03		2013/05/15   FJ）後藤	置換処理時のマスタ使用方法変更
*	v8.00.00	2013/12/13   FJ) 北端	【ANK-1794-00-00】L2-MVNO対応（請求書電話番号表示（LC含む））
*	v8.01		2014/01/21   FJ) 伊藤	【IT1-2014-0000066】料金項目抽出変換マスタの参照日を請求年月末日へ
*********************************************************************/
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.JACbatParamUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatCHIFI005;
import eo.business.util.table.JBSbatCH_M_PRC_KMK_CS_CHGE;
import eo.common.constant.JACStrConst;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatCHPrcKmkAddCkan extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(料金項目抽出変換)*/
	private static final String D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE = "CH_M_PRC_KMK_CS_CHGE";

	/** SQL定義キー(CH_SELECT_016)*/
	private static final String CH_M_PRC_KMK_CS_CHGE_CH_SELECT_016 = "CH_SELECT_016";

	/** SQL定義キー(CH_SELECT_005)*/
	private static final String CH_M_PRC_KMK_CS_CHGE_CH_SELECT_005 = "CH_SELECT_005";

	/** テーブルアクセスクラス(料金項目抽出変換)*/
	private JBSbatSQLAccess db_CH_M_PRC_KMK_CS_CHGE = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 退避．料金項目抽出リスト（請求書固定明細追加用） */
	private ArrayList<JBSbatCommonDBInterface> tmpPrcKmkCsChgeSkKtAddList = null;
	
	/** 退避．料金項目抽出マップ（置換処理） */
	private HashMap<String, JBSbatCommonDBInterface> tmpPrcKmkCsChgeCkanTrnMap = null;
	
	/** 退避．料金項目抽出リスト（置換判定） */
	private ArrayList<JBSbatCommonDBInterface> tmpPrcKmkCsChgeCkanJdgList = null;
	
	/** 退避．料金項目抽出リスト（置換判定対象のみ） */
	private ArrayList<JBSbatCommonDBInterface> tmpPrcKmkCsChgeCkanTrnTgList = null;
	
	/** 退避．置換料金項目リスト */
	private ArrayList<HashMap<String, String>> tmpCkanPrcKmkCsChgeList = null;
	
	/** 退避．請求内訳差分情報リスト */
	private ArrayList<JBSbatServiceInterfaceMap> tmpSeikyUcwkInfoList = null;
	
	/** 退避．請求内訳差分情報リスト（請求書固定明細追加用） */
	private ArrayList<JBSbatServiceInterfaceMap> tmpSeikyUcwkInfoDtlAddList = null;
	
	/** 退避．KEY（請求契約番号＋請求年月＋整理番号＋サービス契約番号） */
	private String tmpKey = null;
	
	/** 退避．検索位置１ */
	private int searchCnt1 = 0;
	
	/** 退避．検索位置２ */
	private int searchCnt2 = 0;
	
	/** 退避．処理判定リスト */
	private ArrayList<String> tmpTrnJdgList = null;
	
	/** 退避．請求年月末日 */
	private String seikyEndYmd 		= null;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CH_M_PRC_KMK_CS_CHGE = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial][opeDate=" + super.opeDate + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial][freeItem=" + super.freeItem + "]");
		
		// 請求年月末日を取得する
		JACbatSchdlUtil schdlUtil = new JACbatSchdlUtil(commonItem);
		String seikyYm = schdlUtil.getBillDate(super.opeDate, JACStrConst.EVENT_CD_RYOKIN_KEISAN_YMD);
		String[] gunStartEndDate = schdlUtil.getUseStrEnd(seikyYm, JACStrConst.EVENT_CD_USE_STAYMD, JACStrConst.EVENT_CD_USE_ENDYMD);
		seikyEndYmd = gunStartEndDate[1];
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial]バッチ運用日から取得した請求年月：" + seikyYm);
		
		// 業務機能識別コード取得
		// パラメータ取得クラス生成
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);
		
		// 業務機能識別コードの取得
		String wkSkKtAdd 	= paramUtil.getGyoumuParameter(JACStrConst.WKPRA_CH_WKS_SK_KT_ADD);		// 請求書固定明細追加
		String wkCkanJudg 	= paramUtil.getGyoumuParameter(JACStrConst.WKPRA_CH_WKS_CKAN_JUDG);		// 置換判定
		String wkCkanTran 	= paramUtil.getGyoumuParameter(JACStrConst.WKPRA_CH_WKS_CKAN_TRAN);		// 置換処理
		
		paramUtil.close();
		
		// 退避．処理判定リストの初期化
		this.tmpTrnJdgList = new ArrayList<String>();
		
		// 各種料金項目コード取得
		// 料金項目コード取得（業務機能識別コード＿請求書固定明細追加）
		this.tmpPrcKmkCsChgeSkKtAddList 	= this.makePrcKmkCsChgeSkKtAddList(wkSkKtAdd);
		this.tmpPrcKmkCsChgeCkanJdgList 	= this.makePrcKmkCsChgeList(wkCkanJudg);
		this.makePrcKmkCsChgeMap(wkCkanTran);
		
		this.tmpSeikyUcwkInfoList 			= new ArrayList<JBSbatServiceInterfaceMap>();
		this.tmpSeikyUcwkInfoDtlAddList 	= new ArrayList<JBSbatServiceInterfaceMap>();
		this.tmpCkanPrcKmkCsChgeList 		= new ArrayList<HashMap<String, String>>();
		this.tmpPrcKmkCsChgeCkanTrnTgList	= new ArrayList<JBSbatCommonDBInterface>();
		
		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の場合]");
				// 「請求書固定明細追加処理」を行う。
				this.setSeikyDtlAddTrn();
				// 「請求書特定料金項目置換処理」を行う。
				this.setSeikyCkanTrn();
				// 「ファイル出力処理」を行う。
				this.makeOutputInfo(outputInItem);
				
				// 最終レコードの場合
				if(inMap == null)
				{
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][最終レコードの場合]");
					return outputInItem;
				}
				
				// 初期化を行う。
				this.initInfo();
			}
		}
		// データ退避
		{
			if(this.tmpKey == null)
			{
				// 退避．KEY　←　入力．KEY
				this.tmpKey = makeStr(inMap.getString(JBSbatCHIFI005.SEIKY_KEI_NO), inMap.getString(JBSbatCHIFI005.SEIKY_YM)
								, inMap.getString(JBSbatCHIFI005.SEIRI_NO), inMap.getString(JBSbatCHIFI005.SVC_NO));
			}
			
			inMap.setOutFlg(true);
			
			// 退避．処理判定リストに入力．料金項目コードが含まれる場合
			if(this.tmpTrnJdgList.contains(inMap.getString(JBSbatCHIFI005.PRC_KMK_CD)))
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][退避．処理判定リストあり]");
				// 退避．請求内訳差分情報リスト ← 入力電文
				this.tmpSeikyUcwkInfoList.add(inMap);
			}
			else
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][退避．処理判定リストなし]");
				// 単純転送
				outputInItem.addOutMapList(inMap);
			}
			
		}
		
		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_PRC_KMK_CS_CHGE.close();
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * SQLKEY(CH_SELECT_016)で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_PRC_KMK_CS_CHGE_CH_SELECT_016(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_PRC_KMK_CS_CHGE.selectBySqlDefine(paramList, CH_M_PRC_KMK_CS_CHGE_CH_SELECT_016);
	}

	/**
	 * SQLKEY(CH_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_PRC_KMK_CS_CHGE_CH_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_PRC_KMK_CS_CHGE.selectBySqlDefine(paramList, CH_M_PRC_KMK_CS_CHGE_CH_SELECT_005);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * 料金項目抽出変換スキーマから料金項目を取得し、取得した料金項目を退避する。（請求書固定明細追加用）
	 * @param workKinoSkbtCd 業務機能識別コード
	 * @return ArrayList<JBSbatCommonDBInterface> 検索結果を追加したリスト
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private ArrayList<JBSbatCommonDBInterface> makePrcKmkCsChgeSkKtAddList(String workKinoSkbtCd) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makePrcKmkCsChgeDtlAddList][workKinoSkbtCd=" + workKinoSkbtCd + "]");

		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
	
		// システムコード
		paramList.setValue(super.systemCode);
		// 業務機能識別コード
		paramList.setValue(workKinoSkbtCd);
		// 抽出変換コード
		paramList.setValue(JACStrConst.CHSHT_CHG_CD_CHG);
		// 料金項目抽出変換適用開始年月日
		paramList.setValue(seikyEndYmd);
		// 料金項目抽出変換適用終了年月日
		paramList.setValue(seikyEndYmd);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makePrcKmkCsChgeDtlAddList][paramList=" + paramList.getList().toString() + "]");

		// SQL実行
		executeCH_M_PRC_KMK_CS_CHGE_CH_SELECT_016(paramList.getList().toArray());
		JBSbatCommonDBInterface dbMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext();
		
		ArrayList<JBSbatCommonDBInterface> dbList = new ArrayList<JBSbatCommonDBInterface>();
		
		// 取得件数分処理を繰り返す
		while (dbMap != null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makePrcKmkCsChgeDtlAddList][dbMap=" + dbMap.getMap().toString() + "]");
			// 取得した情報を追加
			dbList.add(dbMap);
			
			// 退避．処理判定リスト ← 料金項目コード
			// 退避．処理判定リスト ← 出力料金項目コード
			this.tmpTrnJdgList.add(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD));
			this.tmpTrnJdgList.add(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUT_PRC_KMK_CD));
			
			dbMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext();
			
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makePrcKmkCsChgeDtlAddList]");
		
		return dbList;
	}

	/**
	 * 料金項目抽出変換スキーマから料金項目を取得し、取得した料金項目を退避する。
	 * @param workKinoSkbtCd 業務機能識別コード
	 * @return ArrayList<JBSbatCommonDBInterface> 料金項目を退避したリスト
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void makePrcKmkCsChgeMap(String workKinoSkbtCd) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makePrcKmkCsChgeMap][workKinoSkbtCd=" + workKinoSkbtCd + "]");

		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
	
		// システムコード
		paramList.setValue(super.systemCode);
		// 業務機能識別コード
		paramList.setValue(workKinoSkbtCd);
		// 抽出変換コード
		paramList.setValue(JACStrConst.CHSHT_CHG_CD_CHG);
		// 料金項目抽出変換適用開始年月日
		paramList.setValue(seikyEndYmd);
		// 料金項目抽出変換適用終了年月日
		paramList.setValue(seikyEndYmd);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makePrcKmkCsChgeMap][paramList=" + paramList.getList().toString() + "]");

		// SQL実行
		executeCH_M_PRC_KMK_CS_CHGE_CH_SELECT_005(paramList.getList().toArray());
		JBSbatCommonDBInterface dbMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext();
		
		tmpPrcKmkCsChgeCkanTrnMap = new HashMap<String, JBSbatCommonDBInterface>();
		
		// 取得件数分処理を繰り返す
		while (dbMap != null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makePrcKmkCsChgeMap][dbMap=" + dbMap.getMap().toString() + "]");
			// 取得した情報を追加
			String mapKey = makeStr(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_GRP_CD), dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PCRS_CD)
					, dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_SVC_CD), dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD));
			
			tmpPrcKmkCsChgeCkanTrnMap.put(mapKey, dbMap);
			
			// 退避．処理判定リスト ← 料金項目コード
			// 退避．処理判定リスト ← 出力料金項目コード
			this.tmpTrnJdgList.add(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD));
			this.tmpTrnJdgList.add(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUT_PRC_KMK_CD));
			
			dbMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext();
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makePrcKmkCsChgeMap]");
		
	}

	/**
	 * 料金項目抽出変換スキーマから料金項目を取得し、取得した料金項目を退避する。（置換判定用）
	 * @param workKinoSkbtCd 業務機能識別コード
	 * @return ArrayList<JBSbatCommonDBInterface> 料金項目を退避したリスト
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private ArrayList<JBSbatCommonDBInterface> makePrcKmkCsChgeList(String workKinoSkbtCd) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makePrcKmkCsChgeList][workKinoSkbtCd=" + workKinoSkbtCd + "]");

		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
	
		// システムコード
		paramList.setValue(super.systemCode);
		// 業務機能識別コード
		paramList.setValue(workKinoSkbtCd);
		// 抽出変換コード
		paramList.setValue(JACStrConst.CHSHT_CHG_CD_CHG);
		// 料金項目抽出変換適用開始年月日
		paramList.setValue(seikyEndYmd);
		// 料金項目抽出変換適用終了年月日
		paramList.setValue(seikyEndYmd);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makePrcKmkCsChgeList][paramList=" + paramList.getList().toString() + "]");

		// SQL実行
		executeCH_M_PRC_KMK_CS_CHGE_CH_SELECT_005(paramList.getList().toArray());
		JBSbatCommonDBInterface dbMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext();
		
		ArrayList<JBSbatCommonDBInterface> dbList = new ArrayList<JBSbatCommonDBInterface>();
		
		// 取得件数分処理を繰り返す
		while (dbMap != null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makePrcKmkCsChgeList][dbMap=" + dbMap.getMap().toString() + "]");
			// 取得した情報を追加
			dbList.add(dbMap);
			
			// 退避．処理判定リスト ← 料金項目コード
			// 退避．処理判定リスト ← 出力料金項目コード
			this.tmpTrnJdgList.add(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD));
			this.tmpTrnJdgList.add(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUT_PRC_KMK_CD));
			
			dbMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext();
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makePrcKmkCsChgeList]");
		
		return dbList;
	}
	
	/**
	 * 文字を連結します
	 * @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();
	}
	
	/**
	 * 請求書固定明細追加処理を行います。（0円明細）
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void setSeikyDtlAddTrn() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setSeikyDtlAddTrn]");
		
		// 退避．請求内訳差分情報リストチェック
		for(this.searchCnt1 = 0; this.searchCnt1 < this.tmpSeikyUcwkInfoList.size(); this.searchCnt1++)
		{
			JBSbatServiceInterfaceMap outMap = this.tmpSeikyUcwkInfoList.get(this.searchCnt1);
			// 追加判定料金項目の判定
			// 退避．料金項目抽出リスト（請求書固定明細追加用）チェック
			if(!this.isPrcSeikyDtlAddList(outMap))
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setSeikyDtlAddTrn][退避．料金項目抽出リスト（請求書固定明細追加用）チェック　存在なし]");
				// 存在していない場合
				continue;
				
			}
			
			// 退避．料金項目抽出リスト（請求書固定明細追加対象）設定
			ArrayList<JBSbatCommonDBInterface> tmpPrcKmkCsChgeTgList = this.getPrcSeikyDtlAddList();
			
			// 追加対象料金項目の退避
			// 明細追加情報にて下記項目と同一料金項目が、退避．請求内訳差分情報リスト（請求書固定明細追加用）に存在しているかどうかチェックする。
			for(JBSbatCommonDBInterface prcKmkCsChgeMap : tmpPrcKmkCsChgeTgList)
			{
				if(!this.isSeikySeikyDtlAddOutList(prcKmkCsChgeMap))
				{
					this.tmpSeikyUcwkInfoDtlAddList.add(this.makeUcwkInfoSabun(this.tmpSeikyUcwkInfoList.get(this.searchCnt1)
											, prcKmkCsChgeMap
											, BigDecimal.ZERO));
				}
			}
		}
		
		// 明細追加処理
		// 退避．請求内訳差分情報リスト（請求書固定明細追加用）チェック（存在チェック）
		for(this.searchCnt1 = 0; this.searchCnt1 < this.tmpSeikyUcwkInfoDtlAddList.size(); this.searchCnt1++)
		{
			JBSbatServiceInterfaceMap outMap = this.tmpSeikyUcwkInfoDtlAddList.get(this.searchCnt1);
			if(!isSeikySeikyDtlAddList(outMap))
			{
				// 存在していない場合
				this.tmpSeikyUcwkInfoList.add(outMap);
			}
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setSeikyDtlAddTrn]");
		
		return;
	}
	
	/**
	 * 請求書特定料金項目置換処理を行います。（置換）
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void setSeikyCkanTrn() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setSeikyCkanTrn]");
		
		for(this.searchCnt1 = 0; this.searchCnt1 < this.tmpSeikyUcwkInfoList.size(); this.searchCnt1++)
		{
			// 置換対象料金項目検索
			JBSbatServiceInterfaceMap outMap = this.tmpSeikyUcwkInfoList.get(this.searchCnt1);

			// 置換判定用料金項目設定
			// 退避．料金項目抽出マップ（置換判定対象のみ）の設定・チェック
			if(!this.isCkanPrcKmkCsChgeList(outMap))
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setSeikyCkanTrn][退避．料金項目抽出マップ（置換判定対象のみ）の設定・チェック　存在なし]");
				// 存在していない場合
				continue;
			}
			
			// 料金項目置換
			this.prcKmkCkan();
			
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setSeikyCkanTrn]");
		
		return;
	}
	
	/**
	 * 退避．料金項目抽出リスト（請求書固定明細追加用）チェックを行います。
	 * @param outMap 請求内訳差分情報
	 * @return boolean true：検索結果あり false：検索結果なし
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private boolean isPrcSeikyDtlAddList(JBSbatServiceInterfaceMap outMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][isPrcSeikyDtlAddList]");
		for(searchCnt2 = 0; searchCnt2 < this.tmpPrcKmkCsChgeSkKtAddList.size(); searchCnt2++)
		{
			JBSbatCommonDBInterface dbMap = tmpPrcKmkCsChgeSkKtAddList.get(searchCnt2); 
			
			// 料金グループコード
			// 退避．料金項目抽出リスト（請求書固定明細追加用）[検索位置２][料金グループコード] ≠ ＡＬＬ空白
			// または、退避．料金項目抽出リスト（請求書固定明細追加用）[検索位置２][料金グループコード]
			//         ≠ 退避．請求内訳差分情報リスト[検索位置１][料金グループコード] の場合
			if(!(JACStrConst.PRC_GRP_CD_SP.equals(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_GRP_CD))
					|| outMap.getString(JBSbatCHIFI005.PRC_GRP_CD).equals(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_GRP_CD))))
			{
				continue;
			}
			// 料金コースコード
			// 退避．料金項目抽出リスト（請求書固定明細追加用）[検索位置２][料金コースコード] ≠ ＡＬＬ空白
			// または、退避．料金項目抽出リスト（請求書固定明細追加用）[検索位置２][料金コースコード]
			//         ≠ 退避．請求内訳差分情報リスト[検索位置１][料金コースコード] の場合
			if(!(JACStrConst.PCRS_CD_SP.equals(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PCRS_CD))
					|| outMap.getString(JBSbatCHIFI005.PCRS_CD).equals(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PCRS_CD))))
			{
				continue;
			}
			
			// 料金サービスコード
			// 退避．料金項目抽出リスト（請求書固定明細追加用）[検索位置２][料金サービスコード] ≠ ＡＬＬ空白
			// または、退避．料金項目抽出リスト（請求書固定明細追加用）[検索位置２][料金サービスコード]
			//         ≠ 退避．請求内訳差分情報リスト[検索位置１][料金サービスコード] の場合
			if(!(JACStrConst.PRC_SVC_CD_SP.equals(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_SVC_CD))
					|| outMap.getString(JBSbatCHIFI005.PRC_SVC_CD).equals(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_SVC_CD))))
			{
				continue;
			}
			
			// 料金項目コード
			// 退避．料金項目抽出リスト（請求書固定明細追加用）[検索位置２][料金項目コード]
			//         ≠ 退避．請求内訳差分情報リスト[検索位置１][料金項目コード] の場合
			if(!outMap.getString(JBSbatCHIFI005.PRC_KMK_CD).equals(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD)))
			{
				continue;
			}
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isPrcSeikyDtlAddList][検索結果あり]");
			return true;
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isPrcSeikyDtlAddList][検索結果なし]");
		
		return false;
	}
	
	/**
	 * 退避．請求内訳差分情報リスト（請求書固定明細追加用）チェックを行います。（出力項目）
	 * @param prcKmkCsChgeMap 退避．請求内訳差分情報（請求書固定明細追加用）
	 * @return boolean true：検索結果あり false：検索結果なし
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private boolean isSeikySeikyDtlAddOutList(JBSbatCommonDBInterface prcKmkCsChgeMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][isSeikySeikyDtlAddOutList]");
		
		// 明細追加情報にて下記項目と同一料金項目が、退避．請求内訳差分情報リスト（請求書固定明細追加用）に存在しているかどうかチェックする。
		// 退避．料金項目抽出リスト（請求書固定明細追加対象）[x][出力料金グループコード]
		// 退避．料金項目抽出リスト（請求書固定明細追加対象）[x][出力料金コースコード]
		// 退避．料金項目抽出リスト（請求書固定明細追加対象）[x][出力料金サービスコード]
		// 退避．料金項目抽出リスト（請求書固定明細追加対象）[x][出力料金項目コード]
		
		String prcKey = makeStr(prcKmkCsChgeMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUTPUT_PRC_GRP_CD), prcKmkCsChgeMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUT_PCRS_CD)
								, prcKmkCsChgeMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUT_PRC_SVC_CD), prcKmkCsChgeMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUT_PRC_KMK_CD));
		
		for(int i = 0; i < this.tmpSeikyUcwkInfoDtlAddList.size(); i++)
		{
			JBSbatServiceInterfaceMap dbMap = this.tmpSeikyUcwkInfoDtlAddList.get(i); 
			String seikyKey = makeStr(dbMap.getString(JBSbatCHIFI005.PRC_GRP_CD), dbMap.getString(JBSbatCHIFI005.PCRS_CD)
								, dbMap.getString(JBSbatCHIFI005.PRC_SVC_CD), dbMap.getString(JBSbatCHIFI005.PRC_KMK_CD));
			if(prcKey.equals(seikyKey))
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isSeikySeikyDtlAddOutList][検索結果あり]");
				// 存在している場合
				return true;
			}
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isSeikySeikyDtlAddOutList][検索結果なし]");
		
		return false;
	}
	
	/**
	 * 退避．請求内訳差分情報リスト内に明細追加情報が存在するかチェックを行います。
	 * @param tmpOutMap 出力情報
	 * @return boolean true：検索結果あり false：検索結果なし
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private boolean isSeikySeikyDtlAddList(JBSbatServiceInterfaceMap tmpOutMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][isSeikySeikyDtlAddList]");
		
		// 明細追加情報にて下記項目と同一料金項目が、退避．請求内訳差分情報リスト（請求書固定明細追加用）に存在しているかどうかチェックする。
		// 退避．請求内訳差分情報リスト（請求書固定明細追加用）[検索位置１][料金グループコード]
		// 退避．請求内訳差分情報リスト（請求書固定明細追加用）[検索位置１][料金コースコード]
		// 退避．請求内訳差分情報リスト（請求書固定明細追加用）[検索位置１][料金サービスコード]
		// 退避．請求内訳差分情報リスト（請求書固定明細追加用）[検索位置１][料金項目コード]
		
		String tmpOutKey = makeStr(tmpOutMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_GRP_CD), tmpOutMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PCRS_CD)
								, tmpOutMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_SVC_CD), tmpOutMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD));
		
		for(int i = 0; i < this.tmpSeikyUcwkInfoList.size(); i++)
		{
			JBSbatServiceInterfaceMap outMap = this.tmpSeikyUcwkInfoList.get(i); 
			String outKey = makeStr(outMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_GRP_CD), outMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PCRS_CD)
								, outMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_SVC_CD), outMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD));
			
			if(outKey.equals(tmpOutKey))
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isSeikySeikyDtlAddList][検索結果あり]");
				// 存在している場合
				return true;
			}
			
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isSeikySeikyDtlAddList][検索結果なし]");
		
		return false;
	}
	
	/**
	 * 退避．置換料金項目リストのチェックを行います。
	 * @return boolean true：検索結果あり false：検索結果なし
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private boolean isCkanPrcKmkCsChgeList(JBSbatServiceInterfaceMap outMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][isCkanPrcKmkCsChgeList]");
		
		boolean jdgFlg = false;
		
		// 退避．置換料金項目リスト
		String ckanKey = makeStr(outMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_GRP_CD), outMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PCRS_CD)
				, outMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_SVC_CD), outMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD));
		
		// 退避．料金項目抽出リスト（置換判定）の全件に対し、下記条件が成立するレコードを検索する。
		for(int i = 0; i < this.tmpPrcKmkCsChgeCkanJdgList.size(); i++)
		{
			JBSbatCommonDBInterface dbMap = this.tmpPrcKmkCsChgeCkanJdgList.get(i);
			
//			String prcKey = makeStr(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUTPUT_PRC_GRP_CD), dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUT_PCRS_CD)
//					, dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUT_PRC_SVC_CD), dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUT_PRC_KMK_CD));
			String prcKey = makeStr(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_GRP_CD), dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PCRS_CD)
					, dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_SVC_CD), dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD));
			
			// 存在チェック
			if(ckanKey.equals(prcKey))
			{
				jdgFlg = true;
				this.tmpPrcKmkCsChgeCkanTrnTgList.add(dbMap); //shita
			}
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isCkanPrcKmkCsChgeList][検索結果なし]");
		
		return jdgFlg;
	}
	
	/**
	 * 料金項目コードを置換します。
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void prcKmkCkan() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][prcKmkCkan]");
		
		for(searchCnt2 = 0; searchCnt2 < this.tmpSeikyUcwkInfoList.size(); searchCnt2++)
		{
			JBSbatServiceInterfaceMap outMap = this.tmpSeikyUcwkInfoList.get(searchCnt2);
			
			// 退避．置換料金項目リスト
			String outKey = makeStr(outMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_GRP_CD), outMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PCRS_CD)
								, outMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_SVC_CD), outMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD));
			// 退避．料金項目抽出リスト（置換判定対象のみ）の全件に対し、下記条件が成立するレコードを検索する。
			for(int i = 0; i < this.tmpPrcKmkCsChgeCkanTrnTgList.size(); i++)
			{
				JBSbatCommonDBInterface dbMap = this.tmpPrcKmkCsChgeCkanTrnTgList.get(i);
				
//				String prcKey = makeStr(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_GRP_CD), dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PCRS_CD)
//									, dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_SVC_CD), dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD));
				String prcKey = makeStr(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUTPUT_PRC_GRP_CD), dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUT_PCRS_CD)
				, dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUT_PRC_SVC_CD), dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUT_PRC_KMK_CD));
				
				// 存在チェック
				if(outKey.equals(prcKey))
				{
					String mapKey = makeStr(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_GRP_CD), dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PCRS_CD)
							, dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_SVC_CD), dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD));
					
					JBSbatCommonDBInterface ckanMap = tmpPrcKmkCsChgeCkanTrnMap.get(mapKey);
					
					outMap.setString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_GRP_CD, ckanMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUTPUT_PRC_GRP_CD));
					outMap.setString(JBSbatCH_M_PRC_KMK_CS_CHGE.PCRS_CD, ckanMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUT_PCRS_CD));
					outMap.setString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_SVC_CD, ckanMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUT_PRC_SVC_CD));
					outMap.setString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD, ckanMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUT_PRC_KMK_CD));
					
					break;
				}
			}
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][prcKmkCkan]");
	}
	
	/**
	 * 内訳情報差分を作成します。
	 * 
	 * @param outputInItem 出力共通電文
	 * @throws Exception 
	 */
	private void makeOutputInfo(JBSbatOutputItem outputInItem) throws Exception
	{
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputInfo]");
		for (JBSbatServiceInterfaceMap outMap:this.tmpSeikyUcwkInfoList)
		{
			// 出力共通電文に入出力インターフェースを設定する
			outputInItem.addOutMapList(outMap);
			
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputInfo]");
	}
	
	/**
	 * 退避項目の初期化を行う。
	 */
	private void initInfo() 
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initInfo]");
		// 退避．料金項目抽出リスト（置換判定対象のみ）
		this.tmpPrcKmkCsChgeCkanTrnTgList.clear();
		// 退避．置換料金項目リスト
		this.tmpCkanPrcKmkCsChgeList.clear();
		// 退避．請求内訳差分情報リスト
		this.tmpSeikyUcwkInfoList.clear();
		// 退避．請求内訳差分情報リスト（請求書固定明細追加用）
		this.tmpSeikyUcwkInfoDtlAddList.clear();
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initInfo]");
	}
	
	/**
	 * キーブレイクチェックを行います。
	 * @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 = makeStr(inMap.getString(JBSbatCHIFI005.SEIKY_KEI_NO), inMap.getString(JBSbatCHIFI005.SEIKY_YM)
				, inMap.getString(JBSbatCHIFI005.SEIRI_NO), inMap.getString(JBSbatCHIFI005.SVC_NO));
		// キーブレイクチェックを行う。（ 「退避．KEY ≠ NULL」 かつ 「退避．KEY ≠ 入力．KEY」 の場合）
		if(!this.tmpKey.equals(inKey))
		{
			jdgFlg = true;
		}
		
		// キー退避を行う。
		this.tmpKey = inKey;
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isKeyBreak][返却値 = " + jdgFlg + "]");
		
		return jdgFlg;
	}

	/**
	 * 退避．料金項目抽出リスト（請求書固定明細追加用）チェックを行い、対象の退避．料金項目抽出（請求書固定明細追加用対象）を返却します。
	 * @return ArrayList<JBSbatCommonDBInterface> 退避．料金項目抽出（請求書固定明細追加用対象）
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private ArrayList<JBSbatCommonDBInterface> getPrcSeikyDtlAddList() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getPrcSeikyDtlAddList]");
		
		// 返却リスト生成
		ArrayList<JBSbatCommonDBInterface> tmpPrcKmkCsChgeTgList = new ArrayList<JBSbatCommonDBInterface>();
		// 比較対象のマップ取得
		JBSbatCommonDBInterface prcKmkCsChgeMap = tmpPrcKmkCsChgeSkKtAddList.get(searchCnt2); 
		
		// 比較対象元のキー作成
		String tmpPrcKey = makeStr(prcKmkCsChgeMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_GRP_CD), prcKmkCsChgeMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PCRS_CD)
				, prcKmkCsChgeMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_SVC_CD), prcKmkCsChgeMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD));
		// 追加対象料金項目の判定
		for(int searchCnt3 = searchCnt2; searchCnt3 < this.tmpPrcKmkCsChgeSkKtAddList.size(); searchCnt3++)
		{
			JBSbatCommonDBInterface dbMap = this.tmpPrcKmkCsChgeSkKtAddList.get(searchCnt3); 
			
			// 退避．料金項目抽出リスト（請求書固定明細追加用） のキー作成
			String prcKey = makeStr(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_GRP_CD), dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PCRS_CD)
								, dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_SVC_CD), dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD));
			// 存在チェック
			if(tmpPrcKey.equals(prcKey))
			{
				// 退避．料金項目抽出リスト（請求書固定明細追加対象のみ）へ退避
				tmpPrcKmkCsChgeTgList.add(dbMap);
			}
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getPrcSeikyDtlAddList]");
		
		return tmpPrcKmkCsChgeTgList;
	}
	
	/**
	 * 請求内訳情報差分を作成する。
	 * @param seikyMap 請求内訳差分情報リスト[検索位置１][請求契約番号]
	 * @param prcMap 退避．料金項目抽出リスト（請求書固定明細追加用）
	 * @param amnt 金額
	 * @return JBSbatServiceInterfaceMap 出力情報
	 * @throws Exception 
	 */
	private JBSbatServiceInterfaceMap makeUcwkInfoSabun(JBSbatServiceInterfaceMap seikyMap, JBSbatCommonDBInterface prcMap, BigDecimal amnt) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeUcwkInfoSabun]");
		
		JBSbatServiceInterfaceMap ucwkInfoSabunMap = new JBSbatServiceInterfaceMap();
		
		// 請求契約番号
		ucwkInfoSabunMap.set(JBSbatCHIFI005.SEIKY_KEI_NO, 	seikyMap.get(JBSbatCHIFI005.SEIKY_KEI_NO));
		// 請求年月
		ucwkInfoSabunMap.set(JBSbatCHIFI005.SEIKY_YM, 		seikyMap.get(JBSbatCHIFI005.SEIKY_YM));
		// 整理番号
		ucwkInfoSabunMap.set(JBSbatCHIFI005.SEIRI_NO, 		seikyMap.get(JBSbatCHIFI005.SEIRI_NO));
		// サービス契約番号
		ucwkInfoSabunMap.set(JBSbatCHIFI005.SVC_NO, 		seikyMap.get(JBSbatCHIFI005.SVC_NO));
		// 料金グループコード
		ucwkInfoSabunMap.set(JBSbatCHIFI005.PRC_GRP_CD, 	prcMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUTPUT_PRC_GRP_CD));
		// 料金コースコード
		ucwkInfoSabunMap.set(JBSbatCHIFI005.PCRS_CD, 		prcMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUT_PCRS_CD));
		// 料金サービスコード
		ucwkInfoSabunMap.set(JBSbatCHIFI005.PRC_SVC_CD, 	prcMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUT_PRC_SVC_CD));
		// 料金項目コード
		ucwkInfoSabunMap.set(JBSbatCHIFI005.PRC_KMK_CD, 	prcMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUT_PRC_KMK_CD));
		// 利用期間開始年月日
		ucwkInfoSabunMap.set(JBSbatCHIFI005.USE_STA_YMD, 	seikyMap.get(JBSbatCHIFI005.USE_STA_YMD));
		// 利用期間終了年月日
		ucwkInfoSabunMap.set(JBSbatCHIFI005.USE_END_YMD, 	seikyMap.get(JBSbatCHIFI005.USE_END_YMD));
		// 金額
		ucwkInfoSabunMap.set(JBSbatCHIFI005.AMNT, 			amnt);
		// サービス詳細識別番号
		ucwkInfoSabunMap.set(JBSbatCHIFI005.SVC_DTL_SKBT_NO, 	seikyMap.get(JBSbatCHIFI005.SVC_DTL_SKBT_NO));

		// 出力フラグを設定
		ucwkInfoSabunMap.setOutFlg(true);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeUcwkInfoSabun]");
		
		return ucwkInfoSabunMap;
	}
}
