/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACWribRrkJgi
*	ソースファイル名	：JBSbatACWribRrkJgi.java
*	作成者				：富士通　
*	作成日				：2013年03月18日
*＜機能概要＞
*　割引契約履歴除外部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00.00	2013/03/28   FJ) 浜口	新規作成
*	v5.00.00	2013/07/22   FJ) 狭間	【TG1-2013-0000707】履歴除外対象か判定し、除外しない場合の処理を追加
*	v15.00.00	2015/06/26	 FJ) 岡田	【OM-2015-0001359】	置換割引の対応
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFM061;
import eo.business.util.file.JBSbatACIFM239;
import eo.business.util.table.JBSbatAC_M_PRC_COLLECT_JDG;
import eo.business.util.table.JBSbatAC_M_WRIB_PRC;
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;
import eo.framework.util.JBSbatDateUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACWribRrkJgi extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	
	/** テーブル(割引料金)*/
	private static final String D_TBL_NAME_AC_M_WRIB_PRC = "AC_M_WRIB_PRC";
	
	/** テーブル(料金徴収判定)*/
	private static final String D_TBL_NAME_AC_M_PRC_COLLECT_JDG = "AC_M_PRC_COLLECT_JDG";
	
	/** SQL定義キー(AC_SELECT_001)*/
	private static final String AC_M_WRIB_PRC_AC_SELECT_001 = "AC_SELECT_001";
	
	/** SQL定義キー(AC_SELECT_001)*/
	private static final String AC_M_PRC_COLLECT_JDG_AC_SELECT_001 = "AC_SELECT_001";
	
	/** テーブルアクセスクラス(割引料金)*/
	private JBSbatSQLAccess db_AC_M_WRIB_PRC = null;
	
	/** テーブルアクセスクラス(料金徴収判定)*/
	private JBSbatSQLAccess db_AC_M_PRC_COLLECT_JDG = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	/** 入力レコード退避リスト */
	private ArrayList<JBSbatServiceInterfaceMap>	twk_tmpList	= new ArrayList<JBSbatServiceInterfaceMap>();
	
	/** 請求年月 */
	private String wk_SkyuYM 	= null;
	
	/** 群締め日 */
	private String wk_GunEnd 	= null;
	
	/** 割引料金マップ */
	private HashMap<String, String[]> wribMap = null;
	
	/** 割引料金マップ（割引計算方法コード） */
	private static final int WRIBMAP_WRIB_CALC_WAY_CD_IDX	= 0;
	
	/** 割引料金マップ（徴収パターンコード） */
	private static final int WRIBMAP_COLLECT_PATTERN_CD_IDX	= 1;
	
	/** 料金徴収判定マップ */
	private HashMap<String, String[]> colMap = null;
	
	/** 料金徴収判定マップ（日割要否） */
	private static final int COLMAP_HIWARI_YH_IDX			= 0;
	
	/** 料金徴収判定マップ（初月解約徴収方法コード） */
	private static final int COLMAP_SHGTU_DSL_CLCTWAY_CD_IDX	= 1;
	
	/** 相対番号ALLスペース */
	private static final String AITAI_NO_ALL_SP = "          ";
	
	/** 履歴除外フラグ退避（0：履歴あり／1：除外対象） */
	private String rirekiJyogaiFlgBk	= null;
	
	/** 履歴除外フラグ履歴あり */
	private static final String RIREKI_ARI = "0";

	/** 履歴除外フラグ履歴除外対象 */
	private static final String RIREKI_NASI = "1";

	/** 履歴除外フラグ出力スキップ */
	private static final String RIREKI_SKIP = "9";
	
	//v15.00.00 ADD START
	/** 割引計算方法コード */
	private String wribCalcWayCD = null;
	//v15.00.00 ADD END

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		db_AC_M_WRIB_PRC = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AC_M_WRIB_PRC);
		db_AC_M_PRC_COLLECT_JDG = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AC_M_PRC_COLLECT_JDG);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		
		// 請求年月取得
		JACbatSchdlUtil schdUtil = new JACbatSchdlUtil(commonItem);
		
		try
		{
			// 料金スケジュール定義アクセス部品を使用する。
			this.wk_SkyuYM = schdUtil.getBillDate(super.opeDate, JACStrConst.EVENT_CD_RYOKIN_KEISAN_YMD);
			
			// 群月初日、群締め日　←　JACbatSchdlUtil.getUseStrEnd(請求年月, イベントコード("01"（利用開始日））, イベントコード（"02"（利用終了日））)
			String[] rtn = schdUtil.getUseStrEnd(this.wk_SkyuYM, JACStrConst.EVENT_CD_USE_STAYMD, JACStrConst.EVENT_CD_USE_ENDYMD);
			this.wk_GunEnd = rtn[1];
		}
		finally
		{
			// クローズ
			schdUtil.close();
		}
		
		// 割引料金マップ作成
		this.getWribPrc();
		
		// 料金徴収判定マップ作成
		this.getPrcCollect();
		
		// DBアクセスクラスをクローズします
		db_AC_M_WRIB_PRC.close();
		db_AC_M_PRC_COLLECT_JDG.close();
		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;
		
		// ■最終レコード後はここで終了
		if(inMap == null)
		{
			// 出力
			// キーブレイク時の処理
			//v15.00.00 MOD START
			//this.keyBreak(outputInItem, this.rirekiJyogaiFlgBk);
			this.keyBreak(outputInItem, this.rirekiJyogaiFlgBk, this.wribCalcWayCD);
			//v15.00.00 MOD END
			
			// 処理終了
			return outputInItem;
		}
		
		String inKey 		= null;		// 入力．キー
		String tmpKey 		= null;		// 退避．キー

		// 履歴除外対象か判定
		String rirekiJyogaiFlg	= getRirekiJyogaiChk(inMap);
		
		//v15.00.00 ADD START
		// 割引計算方法コードを取得
		String wribCalcWayCD = getCalcWay(inMap);	
		//v15.00.00 ADD END
		
		// ブレイクキー（入力）の設定
		inKey = getKeyInfo(inMap);
		
		// ■1件目（初回）はここで終了
		//   退避．キー ＝ null の場合
		if (!outputInItem.isKeyList())
		{
			// ダミーレコードの設定
			// ※最終レコード後の主処理呼び出しのため
			outputInItem.addOutMapList(new JBSbatServiceInterfaceMap());

			// キー情報設定
			outputInItem.clearKeyList(); 		// キー情報のクリア
			outputInItem.addKeyList(inKey); 	// ブレイクキー（入力）

			// 退避リストへ追加
			this.twk_tmpList.add(inMap);
			
			// 履歴除外対象フラグの退避
			this.rirekiJyogaiFlgBk = rirekiJyogaiFlg;
			//v15.00.00 ADD START
			// 割引計算方法コードを退避
			this.wribCalcWayCD = wribCalcWayCD;
			//v15.00.00 ADD END

			return outputInItem;
		}

		// ■2件目以降（退避キーが存在する場合）
		// 退避．キーの取得
		tmpKey = (String)outputInItem.getKeyList().get(0);

		// 出力情報設定
		// 入力．キー　＝　退避．キー　かつ　退避．履歴除外対象フラグ　＝　履歴除外
		if (inKey.equals(tmpKey) && RIREKI_NASI.equals(rirekiJyogaiFlgBk))
		{
			// 退避リストへ追加
			this.twk_tmpList.add(inMap);
		}
		// 入力．キー　≠　退避．キー　または　退避．履歴除外対象フラグ　≠　履歴除外
		else
		{
			// キーブレイク処理
			//v15.00.00 MOD START
			//this.keyBreak(outputInItem, this.rirekiJyogaiFlgBk);
			this.keyBreak(outputInItem, this.rirekiJyogaiFlgBk, this.wribCalcWayCD);
			//v15.00.00 MOD END
			
			// 退避クリア
			this.twk_tmpList = new ArrayList<JBSbatServiceInterfaceMap>();

			// キー情報設定
			outputInItem.clearKeyList(); 		// キー情報のクリア
			outputInItem.addKeyList(inKey); 	// ブレイクキー（入力）

			// 退避リストへ追加
			this.twk_tmpList.add(inMap);
			
			//履歴除外対象フラグの退避
			this.rirekiJyogaiFlgBk = rirekiJyogaiFlg;
			//v15.00.00 ADD START
			// 割引計算方法コードを退避
			this.wribCalcWayCD = wribCalcWayCD;
			//v15.00.00 ADD END
			
		}
		assert outputInItem != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute][outputInItem=" + outputInItem.getOutMapList().toString() + "]") : true;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputInItem;

	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");

	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * SQLKEY(AC_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 executeAC_M_WRIB_PRC_AC_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		
		// DBアクセスを実行します
		db_AC_M_WRIB_PRC.selectBySqlDefine(paramList, AC_M_WRIB_PRC_AC_SELECT_001);
	}
	
	/**
	 * SQLKEY(AC_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 executeAC_M_PRC_COLLECT_JDG_AC_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		
		// DBアクセスを実行します
		db_AC_M_PRC_COLLECT_JDG.selectBySqlDefine(paramList, AC_M_PRC_COLLECT_JDG_AC_SELECT_001);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * キー情報取得処理
	 * キー情報：請求年月 ＋ 請求先番号 ＋ サービス番号 ＋ オプションサービス契約番号 ＋ 割引サービス契約番号 ＋ 料金グループコード ＋ 料金コースコード
	 *  ＋ 料金サービスコード ＋ 集計料金項目コード ＋ 割引制御区分
	 * @return inMap キー情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private String getKeyInfo(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		StringBuffer keyBuf = new StringBuffer();
		
		// 請求年月
		keyBuf.append(inMap.getString(JBSbatACIFM061.SEIKY_YM));
		// 請求先番号
		keyBuf.append(inMap.getString(JBSbatACIFM061.SEIKY_KEI_NO));
		// 整理番号
		keyBuf.append(inMap.getString(JBSbatACIFM061.SEIRI_NO));
		// サービス番号
		keyBuf.append(inMap.getString(JBSbatACIFM061.SVC_NO));
		// オプションサービス契約番号
		keyBuf.append(inMap.getString(JBSbatACIFM061.OP_SVKEI_NO));
		// 割引サービス契約番号
		keyBuf.append(inMap.getString(JBSbatACIFM061.WRIB_SVC_KEI_NO));
		// 集計料金グループコード
		keyBuf.append(inMap.getString(JBSbatACIFM061.SHUK_PRC_GRP_CD));
		// 割引料金コースコード
		keyBuf.append(inMap.getString(JBSbatACIFM061.WRIB_PCRS_CD));
		// 割引料金サービスコード
		keyBuf.append(inMap.getString(JBSbatACIFM061.WRIB_PRC_SVC_CD));
		// 集計料金コースコード
		keyBuf.append(inMap.getString(JBSbatACIFM061.SHUK_PCRS_CD));
		// 集計料金サービスコード
		keyBuf.append(inMap.getString(JBSbatACIFM061.SHUK_PRC_SVC_CD));
		// 集計料金項目コード
		keyBuf.append(inMap.getString(JBSbatACIFM061.SHUK_PRC_KMK_CD));
		// 割引集計コード
		keyBuf.append(inMap.getString(JBSbatACIFM061.WRIB_SHUK_CD));
		// 割引制御区分
		keyBuf.append(inMap.getString(JBSbatACIFM061.WRIB_CTRL_SKBT_CD));

		return keyBuf.toString();
	}

	/**
	 * キーブレイク時の処理
	 * 1）退避リストの最終行を出力レコードへ設定する
	 * @param outputInItem 出力共通電文クラス
	 * @param  rirekiJyogaiFlg 履歴除外フラグ
	 * @throws Exception
	 */
	//v15.00.00 MOD START
	//public void keyBreak(JBSbatOutputItem outputInItem, String rirekiJyogaiFlg) throws Exception
	public void keyBreak(JBSbatOutputItem outputInItem, String rirekiJyogaiFlg, String wribCalcWayCD) throws Exception
	//v15.00.00 MOD END
	
	{
		// 判定結果がスキップなら出力しない
		if(RIREKI_SKIP.equals(rirekiJyogaiFlg))
		{
			return;
		}
			
		int lastInd = 0;	// 退避リスト最終件インデックス
		lastInd = twk_tmpList.size() - 1;
		
		if(lastInd < 0)
		{
			return;
		}
		
		// マップより（退避リストの最終件目取得）
		JBSbatServiceInterfaceMap tmpList = twk_tmpList.get(lastInd);
		//v15.00.00 MOD START
		//this.outPutRec(tmpList, outputInItem, rirekiJyogaiFlg);
		this.outPutRec(tmpList, outputInItem, rirekiJyogaiFlg, wribCalcWayCD);
		//v15.00.00 MOD END
	}

	/**
	 * 課金対象サービス契約情報レコードを出力する
	 * @param  tmpList 退避リスト
	 * @param  outputInItem 出力オブジェクト
	 * @param  rirekiJyogaiFlg 履歴除外フラグ
	 * @param  flg 利用不可日数の計算実施フラグ
	 * 
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	//v15.00.00 MOD START
	//private void outPutRec(JBSbatServiceInterfaceMap tmpList, JBSbatOutputItem outputInItem, String rirekiJyogaiFlg) throws Exception
	private void outPutRec(JBSbatServiceInterfaceMap tmpList, JBSbatOutputItem outputInItem, String rirekiJyogaiFlg, String wribCalcWayCD) throws Exception
	//v15.00.00 MOD END
	{

		// 出力レコード情報設定
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();

		// 入力情報→出力情報
		outMap.setString(JBSbatACIFM239.WRIB_PCRS_CD, 			tmpList.getString(JBSbatACIFM061.WRIB_PCRS_CD)); 			// 割引料金コースコード
		outMap.setString(JBSbatACIFM239.WRIB_PRC_SVC_CD, 		tmpList.getString(JBSbatACIFM061.WRIB_PRC_SVC_CD)); 		// 割引サービスコード
		outMap.setString(JBSbatACIFM239.WRIB_SVC_SKBT, 			tmpList.getString(JBSbatACIFM061.WRIB_SVC_SKBT)); 			// 割引サービス識別
		outMap.setString(JBSbatACIFM239.WRIB_CTRL_SKBT_CD, 		tmpList.getString(JBSbatACIFM061.WRIB_CTRL_SKBT_CD)); 		// 割引制御識別コード
		outMap.setString(JBSbatACIFM239.SHUK_TANI_CD, 			tmpList.getString(JBSbatACIFM061.SHUK_TANI_CD)); 			// 集計単位コード
		outMap.setString(JBSbatACIFM239.SHUK_KEY , 				tmpList.getString(JBSbatACIFM061.SHUK_KEY));				// 集計キー
		outMap.setString(JBSbatACIFM239.WRIB_SHUK_CD, 			tmpList.getString(JBSbatACIFM061.WRIB_SHUK_CD)); 			// 割引集計コード
		outMap.setString(JBSbatACIFM239.WRIB_FLR_CD, 			tmpList.getString(JBSbatACIFM061.WRIB_FLR_CD)); 			// 割引段階コード
		outMap.setString(JBSbatACIFM239.WRIB_YUSEN_JUN, 		tmpList.getString(JBSbatACIFM061.WRIB_YUSEN_JUN)); 			// 割引優先順位
		outMap.setString(JBSbatACIFM239.SEIKY_KEI_NO, 			tmpList.getString(JBSbatACIFM061.SEIKY_KEI_NO)); 			// 請求先番号
		outMap.setString(JBSbatACIFM239.SEIKY_YM, 				tmpList.getString(JBSbatACIFM061.SEIKY_YM)); 				// 請求年月
		outMap.setString(JBSbatACIFM239.SEIRI_NO, 				tmpList.getString(JBSbatACIFM061.SEIRI_NO)); 				// 整理番号
		outMap.setString(JBSbatACIFM239.WRIB_SVC_KEI_NO, 		tmpList.getString(JBSbatACIFM061.WRIB_SVC_KEI_NO)); 		// 割引サービス契約番号
		outMap.setString(JBSbatACIFM239.WRISVC_TRGT_KEI_NO,		tmpList.getString(JBSbatACIFM061.WRISVC_TRGT_KEI_NO)); 		// 割引サービス対象契約番号
		outMap.setString(JBSbatACIFM239.SVC_NO, 				tmpList.getString(JBSbatACIFM061.SVC_NO)); 					// サービス番号
		outMap.setString(JBSbatACIFM239.OP_SVKEI_NO, 			tmpList.getString(JBSbatACIFM061.OP_SVKEI_NO)); 			// オプションサービス契約番号
		outMap.setString(JBSbatACIFM239.SHUK_PRC_GRP_CD, 		tmpList.getString(JBSbatACIFM061.SHUK_PRC_GRP_CD)); 		// 集計料金グループコード
		outMap.setString(JBSbatACIFM239.SHUK_PCRS_CD, 			tmpList.getString(JBSbatACIFM061.SHUK_PCRS_CD)); 			// 集計料金コースコード
		outMap.setString(JBSbatACIFM239.SHUK_PRC_SVC_CD, 		tmpList.getString(JBSbatACIFM061.SHUK_PRC_SVC_CD)); 		// 集計料金サービスコード
		outMap.setString(JBSbatACIFM239.SHUK_PRC_KMK_CD, 		tmpList.getString(JBSbatACIFM061.SHUK_PRC_KMK_CD)); 		// 集計料金項目コード
		outMap.setBigDecimal(JBSbatACIFM239.PRC, 				tmpList.getBigDecimal(JBSbatACIFM061.PRC)); 				// 料金
		outMap.setString(JBSbatACIFM239.USE_STAYMD, 			tmpList.getString(JBSbatACIFM061.USE_STAYMD)); 				// 利用開始日
		outMap.setString(JBSbatACIFM239.USE_ENDYMD, 			tmpList.getString(JBSbatACIFM061.USE_ENDYMD)); 				// 利用終了日
		outMap.setString(JBSbatACIFM239.SVC_STAYMD, 			tmpList.getString(JBSbatACIFM061.SVC_STAYMD)); 				// サービス開始日
		outMap.setString(JBSbatACIFM239.FIRST_CHRG_STAYMD, 		tmpList.getString(JBSbatACIFM061.FIRST_CHRG_STAYMD)); 		// 初回課金開始日
		outMap.setString(JBSbatACIFM239.SVC_DSL_YMD, 			tmpList.getString(JBSbatACIFM061.SVC_DSL_YMD)); 			// サービス解約日
		outMap.setString(JBSbatACIFM239.SVC_DLRE, 				tmpList.getString(JBSbatACIFM061.SVC_DLRE));				// サービス解約理由
		outMap.setString(JBSbatACIFM239.SVC_KAIHK_DAY, 			tmpList.getString(JBSbatACIFM061.SVC_KAIHK_DAY)); 			// サービス回復日
		outMap.setBigDecimal(JBSbatACIFM239.USE_DAY_CNT, 		tmpList.getBigDecimal(JBSbatACIFM061.USE_DAY_CNT)); 		// 利用日数
		outMap.setBigDecimal(JBSbatACIFM239.USE_FAIL_DAY_CNT, 	tmpList.getBigDecimal(JBSbatACIFM061.USE_FAIL_DAY_CNT)); 	// 利用不可日数
		outMap.setString(JBSbatACIFM239.AIT_DIV, 				tmpList.getString(JBSbatACIFM061.AIT_DIV)); 				// 相対区分
		outMap.setString(JBSbatACIFM239.SIME_DAY, 				tmpList.getString(JBSbatACIFM061.SIME_DAY)); 				// 締め日
		outMap.setString(JBSbatACIFM239.RIREKI_JYOGAI_FLG, 		rirekiJyogaiFlg); 											// 履歴除外フラグ
		//15.00.00 ADD START
		outMap.setString(JBSbatACIFM239.WRIB_CALC_WAY_CD, 		wribCalcWayCD); 											// 割引計算方法コード
		//15.00.00 ADD END
		
		outMap.setOutFlg(true); // 出力フラグ

		//  出力レコード情報を設定する
		outputInItem.addOutMapList(outMap);
	}
	
	/**
	 * 割引料金データ取得を行います。
	 * wribMap：割引料金マップに検索結果を格納する。
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void getWribPrc() throws Exception
	{
		// ＤＢアクセス用のパラメータ定義
		JBSbatCommonDBInterface dbList = new JBSbatCommonDBInterface();

		// 割引料金 ＷＨＥＲＥ条件設定
		dbList.setValue(super.systemCode); 								// システムコード
		dbList.setValue(this.wk_GunEnd); 								// 群締め日

		// 割引料金データ取得
		executeAC_M_WRIB_PRC_AC_SELECT_001(dbList.getList().toArray());

		// レコード読み込み
		JBSbatCommonDBInterface dbMap = db_AC_M_WRIB_PRC.selectNext();
		
		wribMap = new HashMap<String, String[]>();

		// 検索結果がなくなるまで繰り返す
		while (dbMap != null)
		{
			// 請求先番号ごとハッシュマップにレコードを格納する
			String mapKey = dbMap.getString(JBSbatAC_M_WRIB_PRC.AITAI_NO)
							.concat(dbMap.getString(JBSbatAC_M_WRIB_PRC.PCRS_CD))
							.concat(dbMap.getString(JBSbatAC_M_WRIB_PRC.PRC_SVC_CD));
			
			String[] mapData = new String[2];
			mapData[WRIBMAP_WRIB_CALC_WAY_CD_IDX]	= dbMap.getString(JBSbatAC_M_WRIB_PRC.WRIB_CALC_WAY_CD);	// 割引計算方法コード
			mapData[WRIBMAP_COLLECT_PATTERN_CD_IDX]	= dbMap.getString(JBSbatAC_M_WRIB_PRC.COLLECT_PATTERN_CD);	// 徴収パターンコード
			wribMap.put(mapKey, mapData);
			
			// 次レコード取得
			dbMap = db_AC_M_WRIB_PRC.selectNext();
		}
	}
	
	/**
	 * 料金徴収判定マスタテーブルより料金徴収判定情報を取得します。
	 * 
	 * @return 料金徴収判定情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void getPrcCollect() throws Exception
	{
		// ＳＱＬキーを設定する
		JBSbatCommonDBInterface keyList = new JBSbatCommonDBInterface();

		// 対象キーの設定
		keyList.setValue(super.systemCode); 	// システムコード
		keyList.setValue(this.wk_GunEnd); 		// バッチ運用日
		
		// 料金徴収判定データ取得
		executeAC_M_PRC_COLLECT_JDG_AC_SELECT_001(keyList.getList().toArray());
		JBSbatCommonDBInterface dbMap = db_AC_M_PRC_COLLECT_JDG.selectNext();
		
		colMap = new HashMap<String, String[]>();

		// 検索結果がなくなるまで繰り返す
		while (dbMap != null)
		{
			// 請求先番号ごとハッシュマップにレコードを格納する
			String mapKey = dbMap.getString(JBSbatAC_M_PRC_COLLECT_JDG.COLLECT_PATTERN_CD)
							.concat(dbMap.getString(JBSbatAC_M_PRC_COLLECT_JDG.AITAI_NO));

			// 料金徴収判定マップにデータを格納
			String[] mapData = new String[2];
			mapData[COLMAP_HIWARI_YH_IDX]				= dbMap.getString(JBSbatAC_M_PRC_COLLECT_JDG.HIWARI_YH);			// 日割要否
			mapData[COLMAP_SHGTU_DSL_CLCTWAY_CD_IDX]	= dbMap.getString(JBSbatAC_M_PRC_COLLECT_JDG.SHGTU_DSL_CLCTWAY_CD);	// 初月解約徴収方法コード 

			colMap.put(mapKey, mapData);

			// 次レコード取得
			dbMap = db_AC_M_PRC_COLLECT_JDG.selectNext();
		}
	}

	/**
	 * 履歴除外判定を取得します。
	 * 
	 * @param  inMap 入力マップ
	 * @return 判定結果（0：履歴あり／1：除外対象）
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private String getRirekiJyogaiChk(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getRirekiJyogaiChk]");
		String retValue = RIREKI_ARI;
		
		// 履歴除外対象か判定
		String wribCalcWayCD		= null;													// 割引計算方法コード
		String collectPatternCD		= null;													// 徴収パターンコード
		String hiwariYh				= null;													// 日割要否
		String shgtuDslClctWayCD	= null;													// 初月解約徴収判定
		String pcrsCD				= inMap.getString(JBSbatACIFM061.WRIB_PCRS_CD);			// 料金コースコード
		String prcSvcCD				= inMap.getString(JBSbatACIFM061.WRIB_PRC_SVC_CD);		// 料金サービスコード
		String firstChrgStaYmd		= inMap.getString(JBSbatACIFM061.FIRST_CHRG_STAYMD);	// 初回課金開始日
		String svcKaihkDay			= inMap.getString(JBSbatACIFM061.SVC_KAIHK_DAY);		// サービス回復日
		String useEndYmd			= inMap.getString(JBSbatACIFM061.USE_ENDYMD);			// 利用終了日
		
		// 割引料金マップ検索キー作成
		String wribMapKey	= AITAI_NO_ALL_SP.concat(pcrsCD).concat(prcSvcCD);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getRirekiJyogaiChk][wribMapKey=" + wribMapKey + "]");
		
		// 割引料金マップから検索
		String[] wribMapData	= this.wribMap.get(wribMapKey);
		if(wribMapData != null)
		{
			wribCalcWayCD		= wribMapData[WRIBMAP_WRIB_CALC_WAY_CD_IDX];	// 割引計算方法コード
			collectPatternCD	= wribMapData[WRIBMAP_COLLECT_PATTERN_CD_IDX];	// 徴収パターンコード
			
			// 料金徴収判定マップ検索キー作成
			String colMapKey	= collectPatternCD.concat(AITAI_NO_ALL_SP);
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getRirekiJyogaiChk][colMapKey=" + colMapKey + "]");
					
			// 割引料金マップから検索
			String[] colMapData	= this.colMap.get(colMapKey);
			if(colMapData != null)
			{
				hiwariYh			= colMapData[COLMAP_HIWARI_YH_IDX];				// 日割要否
				shgtuDslClctWayCD	= colMapData[COLMAP_SHGTU_DSL_CLCTWAY_CD_IDX];	// 初月解約徴収方法コード
			}
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getRirekiJyogaiChk][shgtuDslClctWayCD=" + shgtuDslClctWayCD + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getRirekiJyogaiChk][svcKaihkDay=" + svcKaihkDay + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getRirekiJyogaiChk][useEndYmd=" + useEndYmd + "]");
		// 割引徴収判定
		// 初月解約徴収方法コード　＝　"0"（徴収なし）
		if(JACStrConst.COLLECT_WAY_CD_NON.equals(shgtuDslClctWayCD))
		{
			// マスタマップ．初回課金開始日　＝　請求年月
			if(firstChrgStaYmd.substring(0, 6).equals(this.wk_SkyuYM))
			{
				// サービス回復日未設定またはサービス回復日　＜　利用終了日＋１
				if(JACStrConst.KARA_MOJI.equals(svcKaihkDay)
						|| svcKaihkDay.compareTo(JBSbatDateUtil.adjustDate(useEndYmd, 1)) < 0)
				{
					// 利用終了日＋１　＜　翌軍月初日
					if(JBSbatDateUtil.adjustDate(useEndYmd, 1).compareTo(JBSbatDateUtil.adjustDate(this.wk_GunEnd, 1)) < 0)
					{
						assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getRirekiJyogaiChk][スキップ]");
						retValue = RIREKI_SKIP;
						return(retValue);
					}
				}
				
			}
		}
		// 履歴除外対象判定
		// 割引計算方法コード ＝ "1"(置換割引_置換型)または"3"(金額割引_置換型)または"5"(率割引_置換型)
		if(JACStrConst.WRIB_CALC_CD_CW_CKN.equals(wribCalcWayCD)
				|| JACStrConst.WRIB_CALC_CD_PW_CKN.equals(wribCalcWayCD)
				|| JACStrConst.WRIB_CALC_CD_RW_CKN.equals(wribCalcWayCD))
		{
			// 日割要否 ＝ 要
			if(JACStrConst.HIWARI_YH_ARI.equals(hiwariYh))
			{
				retValue = RIREKI_NASI;
			}
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getRirekiJyogaiChk][retValue=" + retValue + "]");
		return(retValue);
	}
	
	//v15.00.00 ADD START
	/**
	 * 割引計算方法コードを取得します。
	 * 
	 * @param  inMap 入力マップ
	 * @return 割引計算方法コード
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private String getCalcWay(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		
		// 履歴除外対象か判定
		String wribCalcWayCD		= null;													// 割引計算方法コード
		String pcrsCD				= inMap.getString(JBSbatACIFM061.WRIB_PCRS_CD);			// 料金コースコード
		String prcSvcCD				= inMap.getString(JBSbatACIFM061.WRIB_PRC_SVC_CD);		// 料金サービスコード
		
		// 割引料金マップ検索キー作成
		String wribMapKey	= AITAI_NO_ALL_SP.concat(pcrsCD).concat(prcSvcCD);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getRirekiJyogaiChk][wribMapKey=" + wribMapKey + "]");
		
		// 割引料金マップから検索
		String[] wribMapData	= this.wribMap.get(wribMapKey);
		if(wribMapData != null)
		{
			wribCalcWayCD		= wribMapData[WRIBMAP_WRIB_CALC_WAY_CD_IDX];	// 割引計算方法コード
			
		}
		return(wribCalcWayCD);
	}
	//v15.00.00 ADD END
}
