/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom  					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACWribPrcSaksei
*	ソースファイル名	：JBSbatACWribPrcSaksei.java
*	作成者				：富士通　
*	作成日				：2011年06月30日
*＜機能概要＞
*　割引料金作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/06/30   富士通		新規作成
*	v3.00		2012/08/03   FJ）冨井	【TGI-2012-0000054】ダミーレコード設定位置修正
*	v3.01		2012/10/09   FJ）岡田	【TG1-2012-0000216】長割／即割未適用対応
*	v4.00		2013/01/09   FJ）後藤   【ST3-2013-0000002】FIFOオプション追加
*	v8.00		2013/12/13   FJ) 鈴木	【ANK-1794-00-00】L2-MVNO対応（請求書電話番号表示（LC含む））
*	v8.01		2014/03/26   FJ) 後藤	【OM-2014-0001052】重複制御項目修正
*	v41.00.00	2019/01/24   FJ) 大崎   【ANK-3412-14-00】５ギガ・１０ギガコース導入対応_「高速割」の併用対応
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFI016;
import eo.business.util.file.JBSbatACIFM058;
import eo.business.util.table.JBSbatCH_M_PRC_KMK_CS_CHGE;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
@SuppressWarnings("unused")
public class JBSbatACWribPrcSaksei extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/**▼▼▼▼▼▼クラス変数追加 開始▼▼▼▼▼▼*/
	
	/** 退避キー */
	private String tmpKey1 = JACStrConst.KARA_MOJI;
	
	/** 退避．判定用割引計算方法コードリスト */
	private ArrayList<String> tmpTrgWribCalcCdList = null;
	
	/** 退避．割引額計算情報退避マップ */
	private HashMap<String, JBSbatServiceInterfaceMap> tmpInfoMap = null;
	
	/** 退避．出力単位ごとデータ格納マップ */
	private HashMap<String, ArrayList<JBSbatServiceInterfaceMap>> wbkiDataMap = null;
	// 割引額最大と判断されたレコードと一緒に出力するデータを格納するリスト

	// ANK-3412-14-00 ADD START
	/** テーブル(料金項目抽出変換)*/
	private static final String D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE = "CH_M_PRC_KMK_CS_CHGE";

	/** SQL定義キー(AC_SELECT_029)*/
	private static final String CH_M_PRC_KMK_CS_CHGE_AC_SELECT_029 = "AC_SELECT_029";

	/** テーブルアクセスクラス(料金項目抽出変換)*/
	private JBSbatSQLAccess db_CH_M_PRC_KMK_CS_CHGE = null;

	/** 退避．抽出変換マスタ(高速割判定用)*/
	private HashMap<String, String> wkCsChgeKosoku = null;

	/** 退避．抽出変換マスタ(高速割併用後用)*/
	private HashMap<String, String> wkCsChgeKosokuSet = null;

	/** 退避料金（併用用） */
	private BigDecimal amnt = BigDecimal.ZERO;

	/** 高速割の集計キー */
	private String shukTrgtKey = null;

	/** 退避．読込レコード退避マップ(高速割用) */
	private HashMap<String, ArrayList<JBSbatServiceInterfaceMap>> tmpWbkiMap = null;

	// ANK-3412-14-00 ADD END
	
	/**▲▲▲▲▲▲クラス変数追加 終了▲▲▲▲▲▲*/
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

		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 + "]");
		
		// 判定用割引計算方法コードリスト作成
		this.tmpTrgWribCalcCdList = new ArrayList<String>();
		{
			this.tmpTrgWribCalcCdList.add(JACStrConst.WRIB_CALC_CD_CW_CKN);	// 割引計算方法コード（置換割引_置換型）
			this.tmpTrgWribCalcCdList.add(JACStrConst.WRIB_CALC_CD_PW_CKN);	// 割引計算方法コード（金額割引_置換型）
			this.tmpTrgWribCalcCdList.add(JACStrConst.WRIB_CALC_CD_RW_CKN);	// 割引計算方法コード（率割引_置換型）
		}
		
		// 割引データマップ
		wbkiDataMap = new HashMap<String, ArrayList<JBSbatServiceInterfaceMap>>();
		
		// ANK-3412-14-00 ADD START
		// DBアクセスクラスを生成します
		db_CH_M_PRC_KMK_CS_CHGE = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE);

		// 業務パラメータ取得
		// パラメータ取得部品の初期処理
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);

		// 業務機能識別コード
		String workValue = paramUtil.getGyoumuParameter(JACStrConst.WKPRA_AC_WKS_WRIB_CHG_TRG);

		// パラメータ取得部品のクローズ処理
		paramUtil.close();

		// 高速割用データ抽出コードの取得
		this.wkCsChgeKosoku   = this.makeCsChgeMap(workValue, JACStrConst.CHSHT_CHG_CD_CST);
		// 変換用データ抽出コードの取得
		this.wkCsChgeKosokuSet   = this.makeCsChgeMap(workValue, JACStrConst.CHSHT_CHG_CD_CHG);

		// 割引データマップ（再判定）
		tmpWbkiMap = new HashMap<String, ArrayList<JBSbatServiceInterfaceMap>>();
		// ANK-3412-14-00 ADD END
		
		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());
		}
		
		// 読み込み中レコードのキー情報取得
		String inKey1 = getKeyInfo(inMap);
		// 「読込中レコード．割引額計算情報 ＝ NULL（最終データ）」 または 「退避キー　≠　読込中レコード．キー項目」 の場合
		if(inMap == null  || !this.tmpKey1.equals(inKey1))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "「読込中レコード．割引額計算情報 ＝ NULL（最終データ）」 または 「退避キー　≠　読込中レコード．キー項目」 の場合");
			
			// 退避．割引額計算情報退避マップ　≠　null　の場合
			if(this.tmpInfoMap != null)
			{
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][処理対象割引額計算情報=" + this.tmpInfoMap.toString() + "]");

				// 一度出力した退避．割引額計算情報を判定用として保持するリスト
				ArrayList<String> dbleList = new ArrayList<String>();
				
				// ANK-3412-14-00 ADD START
				/**▼▼▼▼▼▼「高速割」で追加▼▼▼▼▼▼*/
				// 【処理単位】に「高速割」が含まれている場合
				if(this.shukTrgtKey != null)
				{
					// 「高速割」と同一集計先のリストを取得
					ArrayList<JBSbatServiceInterfaceMap> wribTrgtList = tmpWbkiMap.get(this.shukTrgtKey);
					// リスト内データをすべて判定
					Iterator<JBSbatServiceInterfaceMap> itr2 = wribTrgtList.iterator();
					while(itr2.hasNext())
					{
						// レコードを1件読込む
						JBSbatServiceInterfaceMap recMap = itr2.next();
						String judgeKey2 = this.createJudgeKey(recMap);
						String outPrcKmkCd = wkCsChgeKosokuSet.get(judgeKey2);
						// リスト内のレコードが「併用可能」の場合
						if(outPrcKmkCd != null)
						{
							// レコードの金額、料金項目コードを置換する
							recMap.setBigDecimal(JBSbatACIFM058.PRC, recMap.getBigDecimal(JBSbatACIFM058.PRC).add(this.amnt));
							recMap.setString(JBSbatACIFM058.PRC_KMK_CD, outPrcKmkCd);
							/**
							 * 料金項目コードを置換するので割引レコード格納リストに新たに追加する
							 * 出力単位キー項目（「処理単位」＋「割引集計マスタの取得項目」＋料金コースコード＋料金サービスコード＋料金項目コード）
							 */
							String outTaniKey = createOutTaniKey(this.shukTrgtKey, recMap);
							// 割引レコード格納リストより対象キーで取得
							ArrayList<JBSbatServiceInterfaceMap> outTrgtList = wbkiDataMap.get(outTaniKey);
							if (outTrgtList == null)
							{
								// 存在しない場合には新しいリストを生成
								outTrgtList = new ArrayList<JBSbatServiceInterfaceMap>();
							}
							// リストに読込レコードを追加
							outTrgtList.add(recMap);
							// 出力単位キーごとにリスト格納
							wbkiDataMap.put(outTaniKey, outTrgtList);
						}
						// 割引額が最大のレコードを選択する
						JBSbatServiceInterfaceMap map = this.tmpInfoMap.get(this.shukTrgtKey);
						BigDecimal tmpPrc 	= map.getBigDecimal(JBSbatACIFM058.PRC);
						BigDecimal inPrc 	= recMap.getBigDecimal(JBSbatACIFM058.PRC);
						if(tmpPrc.compareTo(inPrc) > 0)
						{
							assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "退避．割引額計算情報．料金　＞　リスト内のレコード．料金　の場合");
							// 「高速割」と同一集計先の割引額が最大のレコードを更新する
							this.tmpInfoMap.put(this.shukTrgtKey, recMap);
						}
					}
				}
				/**▲▲▲▲▲▲「高速割」で追加▲▲▲▲▲▲*/
				// ANK-3412-14-00 ADD END
				// 他のキーで対象になっているレコード対象外処理
				for(Map.Entry<String, JBSbatServiceInterfaceMap> etry : tmpInfoMap.entrySet())
				{
					JBSbatServiceInterfaceMap map = etry.getValue();
					
					// 割引集計マスタより複数レコードが取得できる場合があり、重複して出力されないよう制御する
					String key =this.getKeyInfoShuk(map);
					// 重複制御リストにデータが存在しない場合に出力
					if(!dbleList.contains(key))
					{
						// 判定単位キーより出力単位キーを生成する
						String outTaniKey = createOutTaniKey(etry.getKey(), map);
						// 割引レコード格納リストより出力単位キーでリストを取得
						ArrayList<JBSbatServiceInterfaceMap> outList = wbkiDataMap.get(outTaniKey);
						// リスト内データをすべて出力
						Iterator<JBSbatServiceInterfaceMap> itr = outList.iterator();
						while(itr.hasNext())
						{
							this.makeWribPrcInfo(itr.next(), outputInItem);
						}
						// 重複制御リストに追加
						dbleList.add(key);
					}
				}
			}
			// 退避情報の初期化
			this.tmpInfoMap = null;
			this.wbkiDataMap.clear();
			// ANK-3412-14-00 ADD START
			this.tmpWbkiMap.clear();
			this.amnt = BigDecimal.ZERO;
			this.shukTrgtKey = null;
			// ANK-3412-14-00 ADD END
		
			// 最終レコードの場合
			if(inMap == null)
			{
				assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute][最終レコードの場合]");
				// 最終レコードの場合処理を抜ける
				return outputInItem;
			}
		}
		
		// 読込中レコード．割引計算方法コードが判定用割引計算方法コードリストに含まれる場合
		if(this.tmpTrgWribCalcCdList.contains(inMap.getString(JBSbatACIFM058.WRIB_CALC_WAY_CD)))
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "読込中レコード．割引計算方法コードが判定用割引計算方法コードリストに含まれる場合");
			String key = this.getKeyInfoShuk(inMap);
			
			if(this.tmpInfoMap == null)
			{
				// 初期化
				this.tmpInfoMap = new HashMap<String, JBSbatServiceInterfaceMap>();
				
				// 退避．割引額計算情報退避マップ ← 読込中レコード．割引額計算情報
				this.tmpInfoMap.put(key, inMap);
			}
			// キーが存在しない場合
			else if(!this.tmpInfoMap.containsKey(key))
			{
				// 退避．割引額計算情報退避マップ ← 読込中レコード．割引額計算情報
				this.tmpInfoMap.put(key, inMap);
			}
			else
			{
				// 割引額が最大のレコードを選択する
				JBSbatServiceInterfaceMap map = this.tmpInfoMap.get(key);
				// 退避．割引額計算情報．料金　＞　読込中レコード．料金　の場合
				BigDecimal tmpPrc 	= map.getBigDecimal(JBSbatACIFM058.PRC);
				BigDecimal inPrc 	= inMap.getBigDecimal(JBSbatACIFM058.PRC);
				if(tmpPrc.compareTo(inPrc) > 0)
				{
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "退避．割引額計算情報．料金　＞　読込中レコード．料金　の場合");
					// 退避．割引額計算情報 ← 読込中レコード．割引額計算情報
					this.tmpInfoMap.put(key, inMap);
				}
			}
			
			// 出力単位キー項目（「処理単位」＋「割引集計マスタの取得項目」＋料金コースコード＋料金サービスコード＋料金項目コード）
			String outTaniKey = createOutTaniKey(key, inMap);
			// 割引レコード格納リストより対象キーで取得
			ArrayList<JBSbatServiceInterfaceMap> outTrgtList = wbkiDataMap.get(outTaniKey);
			if (outTrgtList == null)
			{
				// 存在しない場合には新しいリストを生成
				outTrgtList = new ArrayList<JBSbatServiceInterfaceMap>();
			}
			// リストに入力レコードを追加
			outTrgtList.add(inMap);
			// 出力単位キーごとにリスト格納
			wbkiDataMap.put(outTaniKey, outTrgtList);

			// ANK-3412-14-00 ADD START
			/**▼▼▼▼▼▼「高速割」で追加▼▼▼▼▼▼*/
			/**
			 * 「処理単位」に「高速割」が存在した場合、金額と同一集計先を特定するキーを退避
			 * 割引額の最大が「高速割」の金額加算前で判定されるため、正しく判定を行うために
			 * 入力レコードを集計単位キーごとに退避する
			 */
			String judgeKey = this.createJudgeKey(inMap);
			String outPrcKmkCd = wkCsChgeKosoku.get(judgeKey);
			// 読込中のレコードが「高速割」の場合
			if(outPrcKmkCd != null)
			{
				// 「高速割」の 割引額を退避
				this.amnt = inMap.getBigDecimal(JBSbatACIFM058.PRC);
				// 「高速割」の 集計先（キー）を退避
				this.shukTrgtKey = key;
			}
			// 割引レコード再判定格納リストより集計先（「処理単位」＋「割引集計マスタの取得項目」）で取得
			ArrayList<JBSbatServiceInterfaceMap> reTrgtList = tmpWbkiMap.get(key);
			if (reTrgtList == null)
			{
				// 存在しない場合には新しいリストを生成
				reTrgtList = new ArrayList<JBSbatServiceInterfaceMap>();
			}
			// リストに入力レコードを追加
			reTrgtList.add(inMap);
			// 集計単位キーごとにリスト格納（高速割と同一集計先を取得するため）
			tmpWbkiMap.put(key, reTrgtList);
			/**▲▲▲▲▲▲「高速割」で追加▲▲▲▲▲▲*/
			// ANK-3412-14-00 ADD END
			
		}
		// 上記外の場合
		else
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "割引計算方法コード <> 置換割引");
			
			this.makeWribPrcInfo(inMap, outputInItem);
		}
		
		// キー退避
		this.tmpKey1 = inKey1;
		
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		// ANK-3412-14-00 ADD START
		// DBアクセスクラスをクローズします
		db_CH_M_PRC_KMK_CS_CHGE.close();
		// ANK-3412-14-00 ADD END
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼メソッド追加 開始▼▼▼▼▼▼*/
	
	/**
	 * キー情報を取得します。（ブレイク用）
	 * 
	 * @param inMap 入力情報
	 * @return String キー情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	
	private String getKeyInfo(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		StringBuffer rtnKey = new StringBuffer();
		if(inMap != null)
		{
			rtnKey.append(inMap.getString(JBSbatACIFM058.SEIKY_YM));		// 請求年月
			rtnKey.append(inMap.getString(JBSbatACIFM058.SEIKY_KEI_NO));	// 請求先番号
			rtnKey.append(inMap.getString(JBSbatACIFM058.SVC_NO));			// サービス番号
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "処理中のKey情報 " +
					"請求契約番号(" + inMap.getString(JBSbatACIFM058.SEIKY_KEI_NO) + ")" +
					"請求年月(" + inMap.getString(JBSbatACIFM058.SEIKY_YM) + ")"+
					"サービス番号(" + inMap.getString(JBSbatACIFM058.SVC_NO) + ")");
		}
		return rtnKey.toString();
	}
	
	/**
	 * キー情報を取得します。（集計用）
	 * 
	 * @param inMap 入力情報
	 * @return String キー情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	
	private String getKeyInfoShuk(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		StringBuffer strBuf = new StringBuffer();
		if(inMap != null)
		{
			strBuf.append(inMap.getString(JBSbatACIFM058.SEIKY_YM));		// 請求年月
			strBuf.append(inMap.getString(JBSbatACIFM058.SEIKY_KEI_NO));	// 請求先番号
			strBuf.append(inMap.getString(JBSbatACIFM058.SHUK_PCRS_CD));	// 集計料金コースコード
			strBuf.append(inMap.getString(JBSbatACIFM058.SHUK_PRC_SVC_CD));	// 集計料金サービスコード
			strBuf.append(inMap.getString(JBSbatACIFM058.SHUK_PRC_KMK_CD));	// 集計料金項目コード
				
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "処理中のKey情報 " +
				strBuf.toString() + ")");
		return strBuf.toString();
	}
	
	/**
	 * 出力単位のキーを生成します。
	 * @param key [処理単位]＋[割引集計マスタの取得項目]により生成したキー
	 * @param inMap  入力情報
	 * @return [処理単位]＋[割引集計マスタの取得項目]
	 * 　＋料金コースコード＋料金サービスコード＋料金項目コードで生成したキー
	 */
	private String createOutTaniKey(String key, JBSbatServiceInterfaceMap inMap) throws Exception
	{
		StringBuffer strBuf = new StringBuffer();
		strBuf.append(key);
		strBuf.append(inMap.getString(JBSbatACIFM058.PCRS_CD));
		strBuf.append(inMap.getString(JBSbatACIFM058.PRC_SVC_CD));
		strBuf.append(inMap.getString(JBSbatACIFM058.PRC_KMK_CD));
		return strBuf.toString();
	}
	
	/**
	 * 出力情報を設定します。
	 * 
	 * @param inMap　入力電文
	 * @param outputInItem　出力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeWribPrcInfo(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
		JBSbatServiceInterfaceMap rtnMap = new JBSbatServiceInterfaceMap();

		rtnMap.setString(JBSbatACIFI016.SEIKY_KEI_NO, 				inMap.getString(JBSbatACIFM058.SEIKY_KEI_NO)); 				// 請求先番号
		rtnMap.setString(JBSbatACIFI016.SEIKY_YM, 					inMap.getString(JBSbatACIFM058.SEIKY_YM)); 					// 請求年月
		rtnMap.setString(JBSbatACIFI016.SEIRI_NO, 					inMap.getString(JBSbatACIFM058.SEIRI_NO)); 					// 整理番号
		rtnMap.setString(JBSbatACIFI016.WRIB_SVC_KEI_NO, 			inMap.getString(JBSbatACIFM058.WRIB_SVC_KEI_NO)); 			// 割引サービス契約番号
		rtnMap.setString(JBSbatACIFI016.WRISVC_TRGT_KEI_NO,			inMap.getString(JBSbatACIFM058.WRISVC_TRGT_KEI_NO)); 		// 割引サービス対象契約番号
		rtnMap.setString(JBSbatACIFI016.SVC_NO, 					inMap.getString(JBSbatACIFM058.SVC_NO)); 					// サービス番号
		rtnMap.setString(JBSbatACIFI016.OP_SVKEI_NO, 				inMap.getString(JBSbatACIFM058.OP_SVKEI_NO)); 				// オプションサービス契約番号
		rtnMap.setString(JBSbatACIFI016.SVC_SKBT_CD, 				inMap.getString(JBSbatACIFM058.SVC_CD)); 					// サービス識別
		rtnMap.setString(JBSbatACIFI016.PRC_GRP_CD, 				inMap.getString(JBSbatACIFM058.PRC_GRP_CD)); 				// 料金グループコード
		rtnMap.setString(JBSbatACIFI016.PCRS_CD, 					inMap.getString(JBSbatACIFM058.PCRS_CD)); 					// 料金コースコード
		rtnMap.setString(JBSbatACIFI016.PRC_SVC_CD, 				inMap.getString(JBSbatACIFM058.PRC_SVC_CD)); 				// 料金サービスコード
		rtnMap.setString(JBSbatACIFI016.PRC_KMK_CD, 				inMap.getString(JBSbatACIFM058.PRC_KMK_CD)); 				// 料金項目コード
		rtnMap.setString(JBSbatACIFI016.COLLECT_PATTERN_CD, 		inMap.getString(JBSbatACIFM058.COLLECT_PATTERN_CD)); 		// 徴収パターンコード
		rtnMap.setBigDecimal(JBSbatACIFI016.PRC, 					inMap.getBigDecimal(JBSbatACIFM058.PRC)); 					// 料金
		rtnMap.setString(JBSbatACIFI016.USE_STAYMD, 				inMap.getString(JBSbatACIFM058.USE_STAYMD)); 				// 利用開始日
		rtnMap.setString(JBSbatACIFI016.USE_ENDYMD, 				inMap.getString(JBSbatACIFM058.USE_ENDYMD)); 				// 利用終了日
		rtnMap.setString(JBSbatACIFI016.SVC_STAYMD, 				inMap.getString(JBSbatACIFM058.SVC_STAYMD)); 				// サービス開始日
		rtnMap.setString(JBSbatACIFI016.FIRST_CHRG_STAYMD, 			inMap.getString(JBSbatACIFM058.FIRST_CHRG_STAYMD)); 		// 初回課金開始日
		rtnMap.setString(JBSbatACIFI016.SVC_DSL_YMD, 				inMap.getString(JBSbatACIFM058.SVC_DSL_YMD)); 				// サービス解約日
		rtnMap.setString(JBSbatACIFI016.SVC_DLRE, 					inMap.getString(JBSbatACIFM058.SVC_DLRE)); 					// サービス解約理由
		rtnMap.setString(JBSbatACIFI016.SVC_KAIHK_DAY, 				inMap.getString(JBSbatACIFM058.SVC_KAIHK_DAY)); 			// サービス回復日
		rtnMap.setBigDecimal(JBSbatACIFI016.USE_DAY_CNT, 			inMap.getBigDecimal(JBSbatACIFM058.USE_DAY_CNT)); 			// 利用日数
		rtnMap.setBigDecimal(JBSbatACIFI016.USE_FAIL_DAY_CNT, 		inMap.getBigDecimal(JBSbatACIFM058.USE_FAIL_DAY_CNT)); 		// 利用不可日数
		rtnMap.setString(JBSbatACIFI016.AIT_DIV, 					inMap.getString(JBSbatACIFM058.AIT_DIV)); 					// 相対区分
		rtnMap.setString(JBSbatACIFI016.SIME_DAY, 					inMap.getString(JBSbatACIFM058.SIME_DAY)); 					// 締め日
		rtnMap.setString(JBSbatACIFI016.USE_APLY_KH_CD, 			inMap.getString(JBSbatACIFM058.USE_FAIL_APLY_KH)); 			// 利用不可適用可否
		rtnMap.setString(JBSbatACIFI016.MAE_YUSEN_JUN, 				inMap.getString(JBSbatACIFM058.MAEUKE_SOSAI_YUSEN_JUN)); 	// 前受相殺優先順位
		rtnMap.setString(JBSbatACIFI016.WRIB_YUSEN_JUN, 			inMap.getString(JBSbatACIFM058.WRIB_YUSEN_JUN)); 			// 割引優先順位
		rtnMap.setString(JBSbatACIFI016.UPPL_JUDGE_YUSEN_JUN, 		inMap.getString(JBSbatACIFM058.UPPL_JUDGE_YUSEN_JUN)); 		// 上限判定優先順位
		rtnMap.setString(JBSbatACIFI016.WRIB_KKSHI_KH, 				inMap.getString(JBSbatACIFM058.WRIB_KKSHI_KH)); 			// 割引繰越可否
		rtnMap.setString(JBSbatACIFI016.SVC_DTL_SKBT_NO, 			inMap.getString(JBSbatACIFM058.SVC_DTL_SKBT_NO)); 			// サービス詳細識別番号
		
		rtnMap.setOutFlg(true);		// ファイル出力フラグ　＝　true
		
		// 割引料金情報に出力情報を設定
		outputInItem.addOutMapList(rtnMap);
		return;
	}
	
	/**
	 * 文字を連結します
	 * @param  string 文字
	 * @return strBuf 連結した文字列
	 */
	private String makeStr(String ...string)
	{
		StringBuffer strBuf = new StringBuffer();
		for(String str:string)
		{
			if(str == null)
			{
				strBuf.append(JACStrConst.KARA_MOJI);
			}
			else
			{
				strBuf.append(str);
			}
		}
		
		return strBuf.toString();
	}
	
	// ANK-3412-14-00 ADD START
	/**
	 * 料金項目抽出変換情報の取得を行いMAPに設定します。
	 * 
	 * @param workKinoSkbtCd		業務機能識別コード
	 * @param chshtChgCd			抽出変換コード
	 * @return HashMap<String, JBSbatCommonDBInterface> 		退避用マップ
	 * @throws Exception 	業務サービス内で発生した例外全般
	 */
	private HashMap<String, String> makeCsChgeMap(String workKinoSkbtCd, String chshtChgCd) throws Exception
	{
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeCsChgeMap]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeCsChgeMap][workKinoSkbtCd=" + workKinoSkbtCd + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeCsChgeMap][    chshtChgCd=" + chshtChgCd + "]");
		
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		
		paramList.setValue(super.systemCode);	// システムコード
		paramList.setValue(workKinoSkbtCd);		// 業務機能識別コード
		paramList.setValue(chshtChgCd);			// 抽出変換コード
		paramList.setValue(super.opeDate);		// 料金項目抽出変換適用開始年月日
		paramList.setValue(super.opeDate);		// 料金項目抽出変換適用終了年月日
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeCsChgeMap][paramList=" + paramList.getList().toString() + "]");
		
		// SQL実行
		executeCH_M_PRC_KMK_CS_CHGE_AC_SELECT_029(paramList.getList().toArray());
		JBSbatCommonDBInterface dbMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext(); 
		
		HashMap<String, String> rtnMap = new HashMap<String, String>();
		
		// 対象データが存在しない場合
		if(dbMap == null)
		{
			// DB未存在エラー
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeCsChgeMap][DB未存在エラー]");
			String[] outCntMsg = {JBSbatCH_M_PRC_KMK_CS_CHGE.TABLE_NAME, workKinoSkbtCd};
			// エラーログ出力（エラーコード："EACB0250CE"（DB未存在エラー））
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0250CE, outCntMsg);
		}

		while(dbMap != null)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeCsChgeMap][dbMap=" + dbMap.getMap().toString() + "]");
			// マップキー作成
			String mapKey = makeStr(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));
			// マップにデータを格納
			rtnMap.put(mapKey, dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.OUT_PRC_KMK_CD));
			dbMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext();
		}
		return rtnMap;
	}
	/**
	 * SQLKEY(AC_SELECT_029)で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_AC_SELECT_029(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_AC_SELECT_029);
	}
	/**
	 * 出力単位のキーを生成します。
	 * @param key [処理単位]＋[割引集計マスタの取得項目]により生成したキー
	 * @param inMap  入力情報
	 * @return [処理単位]＋[割引集計マスタの取得項目]
	 * 　＋料金コースコード＋料金サービスコード＋料金項目コードで生成したキー
	 */
	private String createJudgeKey(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		StringBuffer strBuf = new StringBuffer();
		strBuf.append(inMap.getString(JBSbatACIFM058.PCRS_CD));
		strBuf.append(inMap.getString(JBSbatACIFM058.PRC_SVC_CD));
		strBuf.append(inMap.getString(JBSbatACIFM058.PRC_KMK_CD));
		return strBuf.toString();
	}
	
	// ANK-3412-14-00 ADD END
	/**▲▲▲▲▲▲メソッド追加 終了▲▲▲▲▲▲*/
	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
