/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom  					 *
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACPntlyInfoMakeJgskn
*	ソースファイル名	：JBSbatACPntlyInfoMakeJgskn.java
*	作成者				：富士通　
*	作成日				：2013年11月14日
*＜機能概要＞
*　違約金計算（事業者間）部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v5.00.00	2013/11/14   FJ) 黒木	【OM-2013-0002478 】EM精算結果出力不正対応
*	v6.00.00	2013/11/30   FJ) 狭間	【OM-2013-0002478 】ＥＭ利用料金情報（契約解除料金）の事業者コードをセット
*	v6.00.01	2014/01/18   FJ) 垣内	【OM-2013-0005343 】違約金Mの取得結果分出力するよう修正
*********************************************************************/
package eo.business.service;


import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JACbatRknBusinessUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatInterface;
import eo.business.util.file.JBSbatACIFM057;
import eo.business.util.file.JBSbatACIFM195;
import eo.business.util.table.JBSbatAC_M_PNLTY;
import eo.business.util.table.JBSbatCH_M_PRC_KMK_CS_CHGE;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JPCDateUtil;
import eo.common.util.JPCUtilCommon;
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;
import eo.framework.util.JBSbatDateUtil;
import eo.framework.util.JBSbatStringUtil;

/**
* 違約金計算（事業者間）を行います。 <p>
*<BR>
* @author 富士通
*/
public class JBSbatACPntlyInfoMakeJgskn extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(違約金)*/
	private static final String D_TBL_NAME_AC_M_PNLTY = "AC_M_PNLTY";

	/** テーブル(料金項目抽出変換)*/
	private static final String D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE = "CH_M_PRC_KMK_CS_CHGE";

	/** SQL定義キー(AC_SELECT_001)*/
	private static final String AC_M_PNLTY_AC_SELECT_001 = "AC_SELECT_001";

	/** SQL定義キー(AC_SELECT_008)*/
	private static final String CH_M_PRC_KMK_CS_CHGE_AC_SELECT_008 = "AC_SELECT_008";

	/** テーブルアクセスクラス(違約金)*/
	private JBSbatSQLAccess db_AC_M_PNLTY = null;

	/** テーブルアクセスクラス(料金項目抽出変換)*/
	private JBSbatSQLAccess db_CH_M_PRC_KMK_CS_CHGE = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/**▼▼▼▼▼▼クラス変数追加 開始▼▼▼▼▼▼*/
	
	/** サービス解約理由（空白） */
	private static final String	SVCDSLRSN_BRANK					= JPCUtilCommon.fillHalfSpace(" ", 4, true);
	
	/** 違約金マップ */
	private HashMap <String, List<JBSbatCommonDBInterface>> pnltyPrcMap = null;
	
	/** 料金項目抽出変換マップ */
	private HashMap <String, String> prcKmkCsChgeMap = null;
	
	/** 継続期間判別フラグ */
	private boolean kzkPrdFlg = false;
	
	/** 締め日 */
	private String inSimeDay = null;
	
	/** サービス解約理由（強制解約）リスト */
	private ArrayList<String> svcDlreKsiList = null;
	
	/** 有効範囲内チェック部品引数（3:文字列（年月日）） */
	private static final String RNG_CHCK_FLG_YMD = "3";
	
	// 配列[0]:違約金発生対象開始日,配列[1]:継続期間
	String[] pnlrtStadrdInfo = new String[2];

	private HashMap<String, String> mapNextGenMonStaDay = new HashMap<String, String>();

	private HashMap<String, String[]> mapPrvGunMonStaDay = new HashMap<String, String[]>();
	
	/** 請求年月 */
	private String wk_SkyuYM 	= null;

	/** 群月初日 */
	private String wk_GunStr 	= null;
	
	/** 群締め日 */
	private String wk_GunEnd 	= null;

	/** 事業者コード（イーモバイル） */
	private String jigyoshaCdEm = null;

	/** 事業者計約コード（契約解除料） */
	private String jigyoshaKeiCdKeiKaijoRyo = null;

	/**▲▲▲▲▲▲クラス変数追加 終了▲▲▲▲▲▲*/

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_AC_M_PNLTY = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AC_M_PNLTY);
		db_CH_M_PRC_KMK_CS_CHGE = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		// 請求年月取得
		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_GunStr = rtn[0];
			this.wk_GunEnd = rtn[1];

		}
		finally
		{
			// クローズ
			schdUtil.close();
		}

		// バッチ運用日のログ出力
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "バッチ運用日：" + super.opeDate);
		// 料金項目抽出変換マップの初期化
		prcKmkCsChgeMap = new HashMap <String, String>();
		
		// 料金項目抽出マップに値を設定する（引数：システムパラメータID：料金項目コード（課金継続月数））
		setPrcKmkCsChgeMap(JACStrConst.WKPRA_AC_WKS_PLY_CHRG_MON);
		
		// 料金項目抽出マップに値を設定する（引数：システムパラメータID：料金項目コード（課金継続日数））
		setPrcKmkCsChgeMap(JACStrConst.WKPRA_AC_WKS_PLY_CHRG_DAY);
		
		// 料金項目抽出マップに値を設定する（引数：システムパラメータID：料金項目コード（サービス継続月数））
		setPrcKmkCsChgeMap(JACStrConst.WKPRA_AC_WKS_PNLTY_SVC_MON);
		
		// 料金項目抽出マップに値を設定する（引数：システムパラメータID：料金項目コード（サービス継続日数））
		setPrcKmkCsChgeMap(JACStrConst.WKPRA_AC_WKS_PNLTY_SVC_DAY);
		
		// アクセスクラスをクローズする
		db_CH_M_PRC_KMK_CS_CHGE.close();
		
		// 違約金マップの初期化
		pnltyPrcMap = new HashMap <String, List<JBSbatCommonDBInterface>>();
		
		// 違約金マップに値を設定する
		setPnltyMap();
		
		// アクセスクラスをクローズする
		db_AC_M_PNLTY.close();
		
		// パラメータ取得クラス生成
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);

		// システムパラメータ情報を取得する
		String[] svcDlreKsi = paramUtil.getGyoumuParameter(JACStrConst.WKPRA_AC_KD_KSI_DSL).split(JACStrConst.COMMA);
		
		svcDlreKsiList = new ArrayList<String>();
		
		for(String svcDlre : svcDlreKsi)
		{
			svcDlreKsiList.add(svcDlre);
		}
		
		// 業務パラメータより事業者マスタ上のEMの事業者コードを取得する
		this.jigyoshaCdEm = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_EM_JIGYOSHA_CD);
		
		// 業務パラメータよりＥＭ事業者間精算＿違約金コードを取得する
		this.jigyoshaKeiCdKeiKaijoRyo = paramUtil.getGyoumuParameter(JACStrConst.WKPRA_AC_EM_JGS_PENALTY);

		// パラメータ取得クラスクローズ
		paramUtil.close();
		
		// ログ出力
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "シスパラ．サービス解約理由（強制解約） ：" + svcDlreKsiList.toString());
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		JBSbatOutputItem outputItem = new JBSbatOutputItem(); // 出力共通電文
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "入力：" + JPCUtilCommon.convMapToString(inMap.getMap()));
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "請求契約番号：" + inMap.getString(JBSbatACIFM057.SEIKY_KEI_NO));
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "請求先月：" + inMap.getString(JBSbatACIFM057.SEIKY_YM));

		// 入力情報なしの場合
		if (inMap.getMap().isEmpty())
		{
			return null;
		}
		
		this.inSimeDay = inMap.getString(JBSbatACIFM057.SIME_DAY);	// 締め日
		
		// 群月初日のログ出力
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "群月初日:" + wk_GunStr);
		// 解約判定
		if(!this.jdgDsl(inMap, wk_GunStr)) 
		{
			// 解約判定のログ出力
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "解約データではありません。");
			return(outputItem);
		}
		// 解約判定のログ出力
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "解約データです。");
		
		// 違約金計算情報取得処理
		ArrayList<JBSbatCommonDBInterface> mstList = getPnltyCalcInfo(inMap);

		// 該当データなしの場合
		if (null == mstList)
		{
			// ログ出力
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "違約金対象外データです。");
			return outputItem;		// 違約金対象外
		}
		
		for(int i = 0; i < mstList.size(); i++)
		{
			// 取得した違約金計算情報分処理する
			JBSbatCommonDBInterface wkMstList = mstList.get(i);
			
			// 違約金対象期間終了日算出　違約金対象期間開始日（年月日）　＋　上限値（月）　−　1日
			String pnltyEndymd = JBSbatDateUtil.adjustDate(JBSbatDateUtil.adjustMonth(pnlrtStadrdInfo[0],
						Integer.parseInt(wkMstList.getString(JBSbatAC_M_PNLTY.UPPL_VALUE))) , -1);
	
			// ログ出力
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "違約金対象期間終了日:" + pnltyEndymd);
	
			// 違約金マップ．解約月徴収方法コード＝"3"(日割)　の場合
			if(JACStrConst.COLLECT_WAY_CD_HIWARI.equals(wkMstList.getString(JBSbatAC_M_PNLTY.DSL_MON_COLLECT_WAY_CD)))
			{
				// 違約金対象期間終了日が解約起算日（利用終了日＋１日）を過ぎていない場合
				if (pnltyEndymd.compareTo(JBSbatDateUtil.adjustDate(inMap.getString(JBSbatACIFM057.USE_ENDYMD), 1)) < 0)
				{
					// ログ出力
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "違約金対象外データです。");
					return outputItem;		// 違約金対象除外
				}
			}
			// 違約金計算判定
			BigDecimal pnltyPrc = null;		// 違約金
			
			// 違約金計算方法コード　＝　"1"（固定）の場合
			if (wkMstList.getString(JBSbatAC_M_PNLTY.PNLTY_CALC_WAY_CD).equals(JACStrConst.PNLTYCALCWAYCD_KOTEI))
			{
				pnltyPrc = wkMstList.getBigDecimal(JBSbatAC_M_PNLTY.PNLTY_TANKA);	// 違約金単価
				// ログ出力
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "違約金（固定）:" + wkMstList.getBigDecimal(JBSbatAC_M_PNLTY.PNLTY_TANKA));
			}
			else
			{
				// 解約基準日取得
				String dslStadardYmd = null;
				String inUseEndYmd = JBSbatDateUtil.adjustDate(inMap.getString(JBSbatACIFM057.USE_ENDYMD), 1);		// 利用終了日＋１
				// 利用終了日＋１　＜　違約金対象期間開始日の場合
				if (inUseEndYmd.compareTo(pnlrtStadrdInfo[0]) < 0)
				{
					dslStadardYmd = pnlrtStadrdInfo[0];	// 違約金対象期間開始日
					// ログ出力
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "解約基準日に違約金対象期間開始日が設定されました。");
				}
				else
				{
					dslStadardYmd = inUseEndYmd; // 利用終了日＋１
					// ログ出力
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "解約基準日に利用終了日＋１が設定されました。");
				}
				
				// 違約金算出
				pnltyPrc = getPnlty(inMap, wkMstList, dslStadardYmd, pnltyEndymd,  pnlrtStadrdInfo[1]);
				
				// 違約金対象外の場合
				if(JBSbatInterface.isNull(pnltyPrc))
				{
					// ログ出力
					assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "違約金対象外データです。");
					return outputItem;
				}
			}
			
			// 出力レコード情報を出力する
			outputItem.addOutMapList(getOutput(inMap, wkMstList, pnltyPrc));
		
		}
		
		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_AC_M_PNLTY.close();
		db_CH_M_PRC_KMK_CS_CHGE.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**▼▼▼▼▼▼メソッド追加 開始▼▼▼▼▼▼*/
	
	/**
	 * 解約判定をします。
	 * 
	 * @param inMap　入力電文
	 * @param gunMonStaDay　群月初日
	 * @return boolean true違約金対象・false対象外
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private boolean jdgDsl(JBSbatServiceInterfaceMap inMap, String gunMonStaDay) throws Exception
	{
		return true;			// 違約金対象
	}
	
	/**
	 * 料金項目抽出変換マップに値を設定します。
	 * 
	 * @param workId 業務パラメータID
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	void setPrcKmkCsChgeMap(String workId) throws Exception
	{
		JBSbatCommonDBInterface dbList = new JBSbatCommonDBInterface();
		
		// 業務パラメータ取得
		// 業務パラメータ取得用クラスインスタンス生成
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);
		// 業務パラメータ取得（引数：システムパラメータ分類コード、システムパラメータID）
		String workKinoSkbtCd = paramUtil.getGyoumuParameter(workId);
		
		// 業務パラメータ取得用クラスクローズ
		paramUtil.close();
		
		dbList.setValue(super.systemCode);								// システムコード
		dbList.setValue(workKinoSkbtCd);								// 業務識別コード
		dbList.setValue(JACStrConst.CHSHT_CHG_CD_CST);					// 抽出変換コード（抽出のみ）
		dbList.setValue(super.opeDate);									// バッチ運用日
		
		// SQL実行
		executeCH_M_PRC_KMK_CS_CHGE_AC_SELECT_008(dbList.getList().toArray());
		
		// 結果を取得
		JBSbatCommonDBInterface dbMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext();
		
		while(null != dbMap)
		{
			// 料金項目抽出変換マップに追加
			prcKmkCsChgeMap.put(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD) , workId);
			
			// 次のレコードを呼び出す
			dbMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext();
		}
		return;
	}
	
	/**
	 * 違約金マップに値を設定します。
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	void setPnltyMap() throws Exception
	{
		// 違約金マップの初期化
		pnltyPrcMap = new HashMap<String, List<JBSbatCommonDBInterface>>();
		
		// ＤＢアクセス用のパラメータ定義
		JBSbatCommonDBInterface dbList = new JBSbatCommonDBInterface();

		// 対象キーの設定
		dbList.setValue(super.systemCode); 			// システムコード
		dbList.setValue(SVCDSLRSN_BRANK);			// サービス解約理由（空白）
		dbList.setValue(this.wk_GunEnd); 			// 群締め日
		
		// SQL実行
		executeAC_M_PNLTY_AC_SELECT_001(dbList.getList().toArray());
		
		// 結果を取得
		JBSbatCommonDBInterface dbMap = db_AC_M_PNLTY.selectNext();
		
		// 検索結果0件の場合
		if(null == dbMap)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setPnltyMap]");
			return;
		}
		
		StringBuffer pnltyKeyBuf = null;
		
		// マップキー
		String pnltyKey = null;
		
		//ブレイク用Key
		StringBuffer bpnltyKeyBuf = null;
		String bpnltyKey = null;
		bpnltyKeyBuf = new StringBuffer();
		
		bpnltyKeyBuf.append(dbMap.getString(JBSbatAC_M_PNLTY.SYS_CD));				// システムコード
		bpnltyKeyBuf.append(dbMap.getString(JBSbatAC_M_PNLTY.TRGT_PCRS_CD));		// 対象料金コースコード
		bpnltyKeyBuf.append(dbMap.getString(JBSbatAC_M_PNLTY.TRGT_PRC_SVC_CD));		// 対象料金サービスコード
		bpnltyKeyBuf.append(dbMap.getString(JBSbatAC_M_PNLTY.AITAI_NO));			// 相対番号
		bpnltyKeyBuf.append(dbMap.getString(JBSbatAC_M_PNLTY.TRGT_PRC_KMK_CD));		// 対象料金項目コード

		bpnltyKey = bpnltyKeyBuf.toString();

		// 退避マップに設定するバリュー：検索結果のリスト
		ArrayList<JBSbatCommonDBInterface> pnltyList = new ArrayList<JBSbatCommonDBInterface>();
		
		//違約金マップに取得した違約金情報を格納
		while(null != dbMap)
		{
			pnltyKeyBuf = new StringBuffer();
			
			pnltyKeyBuf.append(dbMap.getString(JBSbatAC_M_PNLTY.SYS_CD));				// システムコード
			pnltyKeyBuf.append(dbMap.getString(JBSbatAC_M_PNLTY.TRGT_PCRS_CD));			// 対象料金コースコード
			pnltyKeyBuf.append(dbMap.getString(JBSbatAC_M_PNLTY.TRGT_PRC_SVC_CD));		// 対象料金サービスコード
			pnltyKeyBuf.append(dbMap.getString(JBSbatAC_M_PNLTY.AITAI_NO));				// 相対番号
			pnltyKeyBuf.append(dbMap.getString(JBSbatAC_M_PNLTY.TRGT_PRC_KMK_CD));		// 対象料金項目コード

			pnltyKey = pnltyKeyBuf.toString();		// マップキーを設定
			
			// キーと検索結果のキーが異なった場合
			if(!bpnltyKey.equals(pnltyKey))
			{
				// 違約金マップに違約金情報を設定
				this.pnltyPrcMap.put(bpnltyKey, pnltyList);
				// キーに新たな値を設定する
				bpnltyKey = pnltyKey;
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setPnltyMap]Key:" + bpnltyKey);
				// バリューをクリアー
				pnltyList = new ArrayList<JBSbatCommonDBInterface>();
			}
			// 取得結果より違約金マップを作成しリストに格納
			pnltyList.add(dbMap);
			
			// 検索結果キークリアー
			pnltyKey = null;
			
			// 次データ読込
			dbMap = db_AC_M_PNLTY.selectNext();
		}
		
		// 最後の取得結果を格納
		// 違約金マップにキーとバリューを設定する
		this.pnltyPrcMap.put(bpnltyKey, pnltyList);
		
		// アクセスクラスをクローズする
		db_AC_M_PNLTY.close();
	}
	
	/**
	 * 違約金マップから違約金計算情報を取得します。
	 * 
	 * @param inMap 利用料金情報
	 * @return mstList 違約金計算情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private ArrayList<JBSbatCommonDBInterface> getPnltyCalcInfo(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		//違約金マップから、キーに合致する項目を取得する
		// テーブルアクセスクラス格納領域
		ArrayList<JBSbatCommonDBInterface> mstList = null;
		
		// 違約金マップ検索キー
		String pnltyKey = null;
		
		// 相対識別
		String inAitai = null;
		
		// 相対識別が"2"請求先相対契約の場合
		if (inMap.getString(JBSbatACIFM057.AIT_DIV).equals(JACStrConst.AITAIKBN_SEIKYU))
		{
			inAitai = inMap.getString(JBSbatACIFM057.SEIKY_KEI_NO); // 請求先番号
			// ログ出力
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "相対番号に請求番号が設定されました。");
		}
		
		// 相対識別が"3"サービス相対契約の場合
		else if (inMap.getString(JBSbatACIFM057.AIT_DIV).equals(JACStrConst.AITAIKBN_SVC))
		{
			inAitai = inMap.getString(JBSbatACIFM057.SVC_NO); // サービス番号
			// ログ出力
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "相対番号にサービス番号が設定されました。");
		}
		
		else
		{
			// ログ出力
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "相対番号にALLスペースが設定されました。");
			inAitai = JACStrConst.AITAINO_SPACE; // 相対識別（ALLスペース）
		}
		
		// 違約金マップキー取得
		pnltyKey = getByPnltyKey(inMap , inAitai);
		
		// 違約金情報取得
		mstList = getPnltyInfo(inMap ,pnltyKey);
		
		// 相対識別が"2"請求先相対契約または相対識別が"3"サービス相対契約の場合で該当データなしの場合
		if (null == mstList && (JACStrConst.AITAIKBN_SEIKYU.equals(inMap.getString(JBSbatACIFM057.AIT_DIV)) 
				|| JACStrConst.AITAIKBN_SVC.equals(inMap.getString(JBSbatACIFM057.AIT_DIV))))
		{
			// 対象キー：相対識別の設定
			inAitai = JACStrConst.AITAINO_SPACE; // 相対識別（ALLスペース）
			
			// ログ出力
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "相対番号にALLスペースが設定されました。");
			
			// 違約金マップキー取得
			pnltyKey = getByPnltyKey(inMap , JACStrConst.AITAINO_SPACE);
			
			// 違約金計算情報取得
			mstList = getPnltyInfo(inMap ,getByPnltyKey(inMap , JACStrConst.AITAINO_SPACE));
		}
		return mstList;
	}
	
	/**
	 * 違約金マップキーを取得します。
	 * 
	 * @param inMap 利用料金情報（入力）
	 * @param inAitai 相対番号
	 * @return rtnKey 違約金マップキー
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private String getByPnltyKey(JBSbatServiceInterfaceMap inMap, String inAitai) throws Exception
	{
		// 違約金マップキー
		String rtnKey = null;
		StringBuffer keyBuf = new StringBuffer();
		
		keyBuf.append(super.systemCode);							// システムコード
		keyBuf.append(inMap.getString(JBSbatACIFM057.PCRS_CD));		// 料金コースコード
		keyBuf.append(inMap.getString(JBSbatACIFM057.PRC_SVC_CD));	// 料金サービスコード
		keyBuf.append(inAitai);										// 相対番号
		keyBuf.append(inMap.getString(JBSbatACIFM057.PRC_KMK_CD));	// 料金項目コード
		
		rtnKey = keyBuf.toString();		// 違約金マップキーを設定
		
		return rtnKey;
	}

	// 性能の改善により改修
//	/**
//	 * 翌群月初日を算出します。
//	 * 
//	 * @param trgYmd 対象年月日
//	 * @return String 翌群月初日
//	 * @throws Exception 業務サービス内で発生した例外全般
//	 */
//	private String getNextGunMonStaDay(String trgYmd) throws Exception
//	{
//		JACbatSchdlUtil su = new JACbatSchdlUtil(commonItem);
//		
//		String rtnYmd = null;
//		try
//		{
//		
//			// 対象年月日の請求年月を取得
//			String seikyYm = su.getBillDate(trgYmd, JACStrConst.EVENT_CD_RYOKIN_KEISAN_YMD);
//			
//			// 取得した請求年月を基に群月初日を取得
//			String[] staEndYmd = su.getUseStrEnd(seikyYm, JACStrConst.EVENT_CD_USE_STAYMD, JACStrConst.EVENT_CD_USE_ENDYMD);
//			
//			rtnYmd = JBSbatDateUtil.adjustDate(staEndYmd[1], 1);	// 翌群月初日
//			return rtnYmd;
//		
//		}
//		finally
//		{
//			su.close();
//		}
//	}

	/**
	 * 翌郡月初日を算出します・
	 * 
	 * @param trgYmd 対象年月日
	 * @param simeDay 締め日
	 * @return String 翌郡月初日
	 * @throws  Exception 業務サービス内で発生した例外全般
	 */
	private String getNextGunMonStaDay(String trgYmd, String simeDay) throws Exception
	{
		StringBuilder key = new StringBuilder();
		key.append(trgYmd).append(simeDay);
		if (mapNextGenMonStaDay.containsKey(key.toString()))
		{
			return mapNextGenMonStaDay.get(key.toString());
		}

		// 群締め日取得（引数：対象年月日、締め日）
		String[] staEndYmd = JBSbatInterface.getCycMonthStrEnd(trgYmd, simeDay);

		if (null == staEndYmd)
		{
			// I/Fデータ異常ログ出力
			String[] msg = new String[]{"群月初日", "対象年月", trgYmd};
			
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0430CE, msg);
		}
		String nextGunMonStaDay = JBSbatInterface.adjustDate(staEndYmd[1], 1);

		mapNextGenMonStaDay.put(key.toString(), nextGunMonStaDay);
		
		return nextGunMonStaDay;	// 翌群月初日
	}
	
	/**
	 * 違約金発生対象開始日と継続期間を算出し、継続期間の日数と月数の判定を行います。
	 * 
	 * @param inMap 利用料金情報
	 * @param mstList 違約金計算情報
	 * @return String[] 配列[0]:違約金発生対象開始日、配列[1]:継続期間
	 * @throws  Exception 業務サービス内で発生した例外全般
	 */
	private String[] getPnltyStadardInfo(JBSbatServiceInterfaceMap inMap, JBSbatCommonDBInterface mstList) throws Exception
	{

		String[] pnltyStadardInfo = new String[2];	// 配列[0]:違約金発生対象開始日,配列[1]:継続期間
		
		String pnltyStaymd = null;			// 違約金発生対象期間開始日
		BigDecimal kzkPrd = null;			// 継続期間
		
		// 期間開始日識別コード　＝　"1"（サービス開始日）の場合
		if (mstList.getString(JBSbatAC_M_PNLTY.PRD_STAYMD_SKBT_CD).equals(JACStrConst.PRDSTAYMDSKBTCD_SVCSTBI))
		{
			pnltyStaymd = inMap.getString(JBSbatACIFM057.SVC_STAYMD);	// サービス開始日
			
			// ログ出力
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "違約金発生対象開始日にサービス開始日が設定されました。");
			
			// 料金項目コード（サービス継続月数）の場合
			if (JACStrConst.WKPRA_AC_WKS_PNLTY_SVC_MON.equals(prcKmkCsChgeMap.get(inMap.getString(JBSbatACIFM057.PRC_KMK_CD))))
			{
				// 料金
				BigDecimal prc = inMap.getBigDecimal(JBSbatACIFM057.PRC);
				
				// 入力．料金 = '0'の場合
				if(prc.equals(BigDecimal.ZERO))
				{
					// 料金に'1'を設定する
					prc = BigDecimal.ONE;
				}
				
				kzkPrd = prc.add(new BigDecimal(-1)) ;						// 料金（継続月数） - 1で調整
				kzkPrdFlg = true;											// 継続月数
			}
			// 料金項目コード（サービス継続日数）
			else if (JACStrConst.WKPRA_AC_WKS_PNLTY_SVC_DAY.equals(prcKmkCsChgeMap.get(inMap.getString(JBSbatACIFM057.PRC_KMK_CD))))
			{
				kzkPrd = inMap.getBigDecimal(JBSbatACIFM057.PRC);			// 料金（継続日数）は調整なし
				kzkPrdFlg = false;											// 継続日数
			}
			// 上記以外の場合
			else
			{
				return null;
			}
		}
		
		// 期間開始日識別コード　＝　"2"（サービス開始翌月月初日）の場合
		else if (mstList.getString(JBSbatAC_M_PNLTY.PRD_STAYMD_SKBT_CD).equals(JACStrConst.PRDSTAYMDSKBTCD_SVCSTNEXTMON))
		{
			pnltyStaymd = getNextGunMonStaDay(inMap.getString(JBSbatACIFM057.SVC_STAYMD), this.inSimeDay);	//翌群月初日
			
			// 料金
			BigDecimal prc = inMap.getBigDecimal(JBSbatACIFM057.PRC);
			
			// 入力．料金 = '0'の場合
			if(prc.equals(BigDecimal.ZERO))
			{
				// 料金に'1'を設定する
				prc = BigDecimal.ONE;
			}
			
			// ログ出力
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "違約金発生対象開始日にサービス開始翌月月初日が設定されました。");
			
			// 料金項目コード（サービス継続月数）の場合
			if (JACStrConst.WKPRA_AC_WKS_PNLTY_SVC_MON.equals(prcKmkCsChgeMap.get(inMap.getString(JBSbatACIFM057.PRC_KMK_CD))))
			{
				// 違約金発生対象期間開始日　≦　利用料金情報．利用終了日＋１日 の場合
				if (pnltyStaymd.compareTo(JBSbatDateUtil.adjustDate(inMap.getString(JBSbatACIFM057.USE_ENDYMD), 1)) <= 0)
				{
					kzkPrd = prc.add(new BigDecimal(-1));		// 料金（継続月数） - 1で調整
				}
				// 上記以外の場合
				else
				{
					kzkPrd = prc;								// 料金（継続月数）は調整なし
				}
				
				kzkPrdFlg = true;																	// 継続月数
			}
			// 料金項目コード（サービス継続日数）
			else if (JACStrConst.WKPRA_AC_WKS_PNLTY_SVC_DAY.equals(prcKmkCsChgeMap.get(inMap.getString(JBSbatACIFM057.PRC_KMK_CD))))
			{
				// 継続日数の調整、料金（継続日数）　−　サービス開始調整日数で調整
				kzkPrd = inMap.getBigDecimal(JBSbatACIFM057.PRC).add(new BigDecimal(-getAdjCnt(inMap.getString(JBSbatACIFM057.SVC_STAYMD))));
				kzkPrdFlg = false;											// 継続日数
			}
			// 上記以外の場合
			else
			{
				return null;
			}
		}	
		
		// 期間開始日識別コード　＝　"3"（課金開始日）の場合
		else if (mstList.getString(JBSbatAC_M_PNLTY.PRD_STAYMD_SKBT_CD).equals(JACStrConst.PRDSTAYMDSKBTCD_KAKINSTBI))
		{
			pnltyStaymd = inMap.getString(JBSbatACIFM057.FIRST_CHRG_STAYMD);	// 初回課金開始日
			
			// ログ出力
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "違約金発生対象開始日に初回課金開始日が設定されました。");
			
			// 料金項目コード（課金継続月数）の場合
			if (JACStrConst.WKPRA_AC_WKS_PLY_CHRG_MON.equals(prcKmkCsChgeMap.get(inMap.getString(JBSbatACIFM057.PRC_KMK_CD))))
			{
				// 料金
				BigDecimal prc = inMap.getBigDecimal(JBSbatACIFM057.PRC);
				
				// 入力．料金 = '0'の場合
				if(prc.equals(BigDecimal.ZERO))
				{
					// 料金に'1'を設定する
					prc = BigDecimal.ONE;
				}
				
				kzkPrd = prc.add(new BigDecimal(-1));									// 料金（継続月数） - 1で調整
				kzkPrdFlg = true;														// 継続月数
			}
			// 料金項目コード（課金継続日数）の場合
			else if (JACStrConst.WKPRA_AC_WKS_PLY_CHRG_DAY.equals(prcKmkCsChgeMap.get(inMap.getString(JBSbatACIFM057.PRC_KMK_CD))))
			{
				kzkPrd = inMap.getBigDecimal(JBSbatACIFM057.PRC);						// 料金（継続日数）は調整なし
				kzkPrdFlg = false;														// 継続日数
			}
			// 上記以外の場合
			else
			{
				return null;
			}
		}
		
		// 期間開始日識別コード　＝　"4"（課金開始翌月月初日）の場合
		else if (mstList.getString(JBSbatAC_M_PNLTY.PRD_STAYMD_SKBT_CD).equals(JACStrConst.PRDSTAYMDSKBTCD_KKNSTNEXTMON))
		{
			pnltyStaymd = getNextGunMonStaDay(inMap.getString(JBSbatACIFM057.FIRST_CHRG_STAYMD), this.inSimeDay);	//翌群月初日
			
			// 料金
			BigDecimal prc = inMap.getBigDecimal(JBSbatACIFM057.PRC);
			
			// 入力．料金 = '0'の場合
			if(prc.equals(BigDecimal.ZERO))
			{
				// 料金に'1'を設定する
				prc = BigDecimal.ONE;
			}
			
			// ログ出力
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "違約金発生対象開始日に課金開始翌月月初日が設定されました。");
			
			// 料金項目コード（課金継続月数）の場合
			if (JACStrConst.WKPRA_AC_WKS_PLY_CHRG_MON.equals(prcKmkCsChgeMap.get(inMap.getString(JBSbatACIFM057.PRC_KMK_CD))))
			{
				// 違約金発生対象期間開始日　≦　利用料金情報．利用終了日＋１日 の場合
				if (pnltyStaymd.compareTo(JBSbatDateUtil.adjustDate(inMap.getString(JBSbatACIFM057.USE_ENDYMD), 1)) <= 0)
				{
					kzkPrd = prc.add(new BigDecimal(-1));		// 料金（継続月数） - 1で調整
					
				}
				// 上記以外の場合
				else
				{
					kzkPrd = prc;								// 料金（継続月数）は調整なし
				}

				kzkPrdFlg = true;																	// 継続月数
			}
			
			// 料金項目コード（課金継続日数）の場合
			else if (JACStrConst.WKPRA_AC_WKS_PLY_CHRG_DAY.equals(prcKmkCsChgeMap.get(inMap.getString(JBSbatACIFM057.PRC_KMK_CD))))
			{
				// 継続日数の調整、料金（継続日数）　−　初回課金開始調整日数で調整
				kzkPrd = inMap.getBigDecimal(JBSbatACIFM057.PRC).add(new BigDecimal(-getAdjCnt(inMap.getString(JBSbatACIFM057.FIRST_CHRG_STAYMD))));
				kzkPrdFlg = false;											// 継続日数
			}
			// 上記以外の場合
			else
			{
				return null;
			}
		}
		// ログ出力
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "料金:" + inMap.getBigDecimal(JBSbatACIFM057.PRC) + "継続期間:" + kzkPrd);
		
		pnltyStadardInfo[0] = pnltyStaymd;				// 違約金発生対象期間
		pnltyStadardInfo[1] = kzkPrd.toString();		// 継続期間
		
		return pnltyStadardInfo;
	}
	
	/**
	 * 調整日数を算出します。
	 * 
	 * @param trgYmd 対象年月日
	 * @return rtnYmd 調整日数
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private int getAdjCnt(String trgYmd) throws Exception
	{
		int rtnYmd = 0;			// 調整日数
				
		// 調整日数算出（対象年月の月末日　ー　対象年月の日　＋　１）
		rtnYmd = Integer.parseInt(JPCDateUtil.getEndOfMonth(trgYmd.substring(0 , 6))) - Integer.parseInt(trgYmd.substring(6 , 8)) + 1; 
		
		// ログ出力
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "調整日数:" + rtnYmd);
		
		// 調整日数が負の場合
		if (0 > rtnYmd)
		{
			// I/Fデータ異常ログ出力
			String[] msg = new String[]{"調整日数", "対象年月", trgYmd};
			
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0430CE, msg);
		}
		return rtnYmd;
		
		
	}

	/**
	 * 残余月割額を算出します。
	 * 
	 * @param mstList 違約金計算情報
	 * @param kzkPrd 継続期間
	 * @param dslStadardYmd 解約基準日
	 * @param pnltyEndymd 違約金対象期間終了日
	 * @return PnltyPrcMon 残余月割高
	 * @throws  Exception 業務サービス内で発生した例外全般
	 */
	private BigDecimal getPnltyPrcMon(JBSbatCommonDBInterface mstList, String kzkPrd,
								String dslStadardYmd, String pnltyEndymd)throws Exception
	{
		BigDecimal pnltyPrcMon = new BigDecimal(0);
		// 継続月数の場合
		if (kzkPrdFlg)
		{
			// 残余月割額 ＝ 違約金単価 * （ 上限値 − 継続月数 − 1 ）
			pnltyPrcMon = new BigDecimal(Integer.parseInt(mstList.getString(JBSbatAC_M_PNLTY.PNLTY_TANKA)) 
						* (Integer.parseInt(mstList.getString(JBSbatAC_M_PNLTY.UPPL_VALUE)) - Integer.parseInt(kzkPrd) - 1));
		
		}
		
		// 継続日数の場合
		else
		{
			
			// 残余月割高 ＝ 違約金単価 × （上限値 − 継続日数 ）
			pnltyPrcMon = new BigDecimal(Integer.parseInt(mstList.getString(JBSbatAC_M_PNLTY.PNLTY_TANKA)) *
			(Integer.parseInt(mstList.getString(JBSbatAC_M_PNLTY.UPPL_VALUE)) - Integer.parseInt(kzkPrd)));
		}
		
		return pnltyPrcMon;
	}
	
	/**
	 * 違約金を算出します。
	 * 
	 * @param inMap 利用料金情報
	 * @param mstList 違約金情報
	 * @param dslStadardYmd 解約基準年月日
	 * @param pnltyEndymd 違約金対象終了年月日
	 * @param kzkPrd 継続期間
	 * @return BigDecimal 違約金
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private BigDecimal getPnlty(JBSbatServiceInterfaceMap inMap, JBSbatCommonDBInterface mstList, 
			String dslStadardYmd , String pnltyEndymd, String kzkPrd) throws Exception
	{
		// 違約金算出
		BigDecimal pnltyPrc = null;
		
		// 違約金対象期間終了日の年月　≠　解約基準日の年月の場合
		if (!pnltyEndymd.substring(0 , 6).equals(dslStadardYmd.substring(0 , 6)))
		{
			BigDecimal pnltyPrcMon = new BigDecimal(0);				// 残余月割額
			BigDecimal dslMonPnltyPrc = null;						// 解約月違約金額
			BigDecimal endMonPnltyPrc = null;						// 終了月違約金額
			
			// 残余月割額を算出する（引数：違約金マップ、継続期間、解約基準日、違約金対象期間終了日、継続期間判別フラグ）
			pnltyPrcMon = getPnltyPrcMon(mstList, kzkPrd, dslStadardYmd, pnltyEndymd);
			
			// ログ出力
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "残余月割額:" + pnltyPrcMon);
			
			// 解約月違約金額を算出する（引数：違約金マップ、解約月徴収方法コード、解約基準日、違約金対象期間終了日、継続期間判別フラグ）
			dslMonPnltyPrc = getPnltyPrc(mstList , mstList.getString(JBSbatAC_M_PNLTY.DSL_MON_COLLECT_WAY_CD), JBSbatAC_M_PNLTY.DSL_MON_COLLECT_WAY_CD ,
					dslStadardYmd , pnltyEndymd);
			
			// ログ出力
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "解約月違約金額:" + dslMonPnltyPrc);
			
			// 終了月違約金額を算出する（引数：違約金マップ、期間終了月徴収方法コード、徴収方法コード種別、解約基準日、違約金対象期間終了日、継続期間判別フラグ）
			endMonPnltyPrc = getPnltyPrc(mstList , mstList.getString(JBSbatAC_M_PNLTY.PRD_END_MON_COLLECT_WAY_CD), JBSbatAC_M_PNLTY.PRD_END_MON_COLLECT_WAY_CD, 
					dslStadardYmd , pnltyEndymd);
			
			// ログ出力
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "終了月違約金額:" + endMonPnltyPrc);
			
			// 残余月割額　＝　0　かつ　解約月違約金額　＝　徴収なし　かつ　終了月違約金額　＝　違約金額
			if(new BigDecimal(0).equals(pnltyPrcMon) && JBSbatInterface.isNull(dslMonPnltyPrc) && JBSbatInterface.isNull(endMonPnltyPrc))
			{
				
				return null;			// 違約金対象外
			}
			
			else
			{
				// 解約月違約金　＝　徴収なしの場合
				if(JBSbatInterface.isNull(dslMonPnltyPrc))
				{
					// 0を設定
					dslMonPnltyPrc = new BigDecimal(0);
				}
				
				// 終了月　＝　徴収なしの場合
				if(JBSbatInterface.isNull(endMonPnltyPrc))
				{
					// 0を設定
					endMonPnltyPrc = new BigDecimal(0);
				}
				// 違約金　＝　残余月割高　＋　解約月違約金額　＋　終了月違約金額
				pnltyPrc = pnltyPrcMon.add(dslMonPnltyPrc).add(endMonPnltyPrc);
			}
		}
		
		// 違約金対象終了日の年月　＝　解約基準日の年月の場合
		else
		{
			// 違約金を算出する（引数：違約金マップ、期間終了月解約徴収方法コード、徴収方法コード種別、解約基準日、違約金対象終了日、継続期間判別フラグ）
			pnltyPrc = getPnltyPrc(mstList , mstList.getString(JBSbatAC_M_PNLTY.PRD_END_MON_DSL_CLCTWAY_CD), 
					JBSbatAC_M_PNLTY.PRD_END_MON_DSL_CLCTWAY_CD, dslStadardYmd, pnltyEndymd);
			
			// ログ出力
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "期間終了月解約データ違約金:" + pnltyPrc);
			
			// 違約金　＝　徴収なしの場合
			if (null == pnltyPrc)
			{
				
				return null;			// 違約金対象外
			}
		}
	
		return pnltyPrc;
	}
	
	/**
	 * 違約金を算出します。
	 * 
	 * @param mstList 違約金計算情報
	 * @param clcwayCd 徴収方法コード
	 * @param clcwayCdKind 徴収方法コード種別
	 * @param dslStadardYmd 解約基準日
	 * @param pnltyEndymd 違約金対象期間終了日
	 * @return BigDecimal 違約金
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private BigDecimal getPnltyPrc(JBSbatCommonDBInterface mstList , String clcwayCd , String clcwayCdKind,
			String dslStadardYmd , String pnltyEndymd) throws Exception
	{
		BigDecimal rtnPnltyPrc = null;		// 違約金
		
		// 徴収方法コード　＝　"0"（徴収なし）の場合
		if (clcwayCd.equals(JACStrConst.COLLECT_WAY_CD_NON))
		{
			// 処理なし
		}
		
		// 徴収方法コード　＝　"1"（無料）の場合
		else if (clcwayCd.equals(JACStrConst.COLLECT_WAY_CD_FREE))
		{
			rtnPnltyPrc = new BigDecimal(0);		// 0円
		}
		
		// 徴収方法コード　＝　"2"（全額）の場合
		else if (clcwayCd.equals(JACStrConst.COLLECT_WAY_CD_ALL))
		{
			rtnPnltyPrc = mstList.getBigDecimal(JBSbatAC_M_PNLTY.PNLTY_TANKA);	// 違約金単価
		}
		
		// 徴収方法コード　＝　"3"（日割）の場合
		else if (clcwayCd.equals(JACStrConst.COLLECT_WAY_CD_HIWARI))
		{
			BigDecimal dayCnt = new BigDecimal(0);			// 日数
			
			// 徴収方法コード　＝　解約月徴収方法コードの場合
			if (clcwayCdKind.equals(JBSbatAC_M_PNLTY.DSL_MON_COLLECT_WAY_CD))
			{
				// 解約月残日数　＝　解約基準の月末日　ー　解約基準日　＋　１
				dayCnt = new BigDecimal(Integer.parseInt(JPCDateUtil.getEndOfMonth(dslStadardYmd.substring(0 , 6)))
						- Integer.parseInt(dslStadardYmd.substring(6 , 8)) + 1);
				
				// 継続月数の場合
				if(kzkPrdFlg)
				{
					// 解約月違約金　＝　違約金単価　×　解約月残日数　÷　解約月基準日の暦日数
					rtnPnltyPrc = mstList.getBigDecimal(JBSbatAC_M_PNLTY.PNLTY_TANKA).multiply(dayCnt).
								divide(new BigDecimal(JPCDateUtil.getEndOfMonth(dslStadardYmd.substring(0 , 6))), 4, BigDecimal.ROUND_HALF_EVEN);
					
					// 桁丸め実行
					rtnPnltyPrc = JACbatRknBusinessUtil.round(mstList.getString(JBSbatAC_M_PNLTY.ROUND_WAY_CD), rtnPnltyPrc, 0);
					
				}
				
				// 継続日数の場合
				else
				{
					// 解約月違約金　＝　違約金単価　×　解約月残日数
					rtnPnltyPrc = new BigDecimal(Integer.parseInt(mstList.getString(JBSbatAC_M_PNLTY.PNLTY_TANKA))).multiply(dayCnt);
				}
			}
			
			// 徴収方法コード　＝　期間終了月徴収方法コードの場合
			else if(clcwayCdKind.equals(JBSbatAC_M_PNLTY.PRD_END_MON_COLLECT_WAY_CD))
			{
				// 継続月数の場合
				if(kzkPrdFlg)
				{
					// 終了月違約金　＝　違約金単価　×　対象期間終了日　÷　対象期間終了日の暦日数
					rtnPnltyPrc = mstList.getBigDecimal(JBSbatAC_M_PNLTY.PNLTY_TANKA).multiply(new BigDecimal(Integer.parseInt(pnltyEndymd.substring(6 , 8)))).
								divide(new BigDecimal(JPCDateUtil.getEndOfMonth(pnltyEndymd.substring(0 , 6))), 4, BigDecimal.ROUND_HALF_EVEN);
					
					// 桁丸め実行
								rtnPnltyPrc = JACbatRknBusinessUtil.round(mstList.getString(JBSbatAC_M_PNLTY.ROUND_WAY_CD), rtnPnltyPrc, 0);
					
				}
				
				// 継続日数の場合
				else
				{
					String nextGunMonStaDay = getNextGunMonStaDay(pnltyEndymd, this.inSimeDay);
					// 終了月残日数　＝　対象期間終了日　−　対象期間終了日の年月の月初日　＋　１
					dayCnt = new BigDecimal(Integer.parseInt(pnltyEndymd.substring(6 , 8)) 
							- Integer.parseInt(JBSbatDateUtil.adjustDate(nextGunMonStaDay, 1).substring(6, 8)) + 1);
					
					// 終了月違約金額　＝　違約金単価　×　終了月残日数
					rtnPnltyPrc = mstList.getBigDecimal(JBSbatAC_M_PNLTY.PNLTY_TANKA).multiply(dayCnt);
				}
			}
			
			// 徴収方法コード　＝　期間終了月解約徴収方法コードの場合
			else if(clcwayCdKind.equals(JBSbatAC_M_PNLTY.PRD_END_MON_DSL_CLCTWAY_CD))
			{
				// 日割日数　対象期間終了日　−　解約基準日　＋　１
				dayCnt = new BigDecimal(Integer.parseInt(pnltyEndymd.substring(6 , 8)) - Integer.parseInt(dslStadardYmd.substring(6 , 8)) + 1);
				
				// 継続月数の場合
				if(kzkPrdFlg)
				{
					// 違約金　＝　違約金単価　×　日割日数　÷　解約基準日の月の暦日数
					rtnPnltyPrc = mstList.getBigDecimal(JBSbatAC_M_PNLTY.PNLTY_TANKA).multiply(dayCnt).
					divide(new BigDecimal(JPCDateUtil.getEndOfMonth(dslStadardYmd.substring(0 , 6))), 4, BigDecimal.ROUND_HALF_EVEN);
					
					// 桁丸め実行
					rtnPnltyPrc = JACbatRknBusinessUtil.round(mstList.getString(JBSbatAC_M_PNLTY.ROUND_WAY_CD), rtnPnltyPrc, 0);
					
				}
				
				// 継続日数の場合
				else
				{
					// 違約金　＝　違約金単価　×　日割日数
					rtnPnltyPrc = mstList.getBigDecimal(JBSbatAC_M_PNLTY.PNLTY_TANKA).multiply(dayCnt);
				}
			}
			
		}
		return rtnPnltyPrc;
	}
	
	/**
	 * 出力内容を取得します。
	 * 
	 * @param inMap 利用料金情報
	 * @param mstList 違約金マップ
	 * @param pnltyPrc 違約金
	 * @return JBSbatServiceInterfaceMap 入出力データを格納するマップ
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	@SuppressWarnings("unchecked")
	private JBSbatServiceInterfaceMap getOutput(JBSbatServiceInterfaceMap inMap , JBSbatCommonDBInterface mstList , BigDecimal pnltyPrc) throws Exception
	{
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		outMap.getMap().putAll(inMap.getMap());
		
		outMap.setString(JBSbatACIFM057.PRC_KMK_CD,			mstList.getString(JBSbatAC_M_PNLTY.PRC_KMK_CD));		// 料金項目コード
		outMap.setBigDecimal(JBSbatACIFM057.PRC,			pnltyPrc); 												// 料金
		outMap.setString(JBSbatACIFM195.JIGYOSHA_CD,		this.jigyoshaCdEm);										// 事業者コード
		outMap.setString(JBSbatACIFM195.JIGYOSHA_KEI_CD,	this.jigyoshaKeiCdKeiKaijoRyo);							// 事業者契約コード
		
		outMap.setOutFlg(true);		// 出力フラグをtrue
		
		return outMap;

	}
	/**
	 * 違約金マップを検索し、違約金計算情報を取得します
	 * @param inMap 入力電文
	 * @return List 料金項目情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private ArrayList<JBSbatCommonDBInterface> getPnltyInfo(JBSbatServiceInterfaceMap inMap,String key) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getPnltyInfo]");

		// 取得できなかった場合
		if(!this.pnltyPrcMap.containsKey(key))
		{
			return null;
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getPnltyInfo]");
		//違約金マスタの取得
		List<JBSbatCommonDBInterface> pnltyMList = this.pnltyPrcMap.get(key);
		
		// 違約金リスト用カウンタ
		int tmpCnt = 0;
		
		// 返却違約金マスタリストの初期化
		ArrayList<JBSbatCommonDBInterface> rtnPnltyList = new ArrayList<JBSbatCommonDBInterface>();
		
		JBSbatCommonDBInterface rtnList = null;
		
		rtnList = pnltyMList.get(tmpCnt);
		
		// 違約金発生対象開始日算出/継続期間調整及び継続日数・月数の判定（違約金リスト1件目の期間開始日識別コードを使用する）
		pnlrtStadrdInfo = getPnltyStadardInfo(inMap, rtnList);

		// 違約金対象外
		if(JBSbatInterface.isNull(pnlrtStadrdInfo))
		{
			return null;
		}

		// 入力ファイルのキーに該当する違約金のリストが複数ある場合、上限値〜下限値に継続期間が合致するリストを対象とする。
		while(pnltyMList.size() > tmpCnt)
		{
			
			rtnList = pnltyMList.get(tmpCnt);

			// ログ出力
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "上限値：" + rtnList.getString(JBSbatAC_M_PNLTY.UPPL_VALUE)
					+ "下限値" + rtnList.getString(JBSbatAC_M_PNLTY.LOWL_VALUE));
			
			// 違約金対象の場合（引数：上限値、下限値、継続期間、"1"（数値））
			if (JBSbatStringUtil.rangeCheck(rtnList.getString(JBSbatAC_M_PNLTY.UPPL_VALUE) ,
					rtnList.getString(JBSbatAC_M_PNLTY.LOWL_VALUE) , String.valueOf(pnlrtStadrdInfo[1]) , "1"))
			{
				rtnPnltyList.add(rtnList);
			}
			
			tmpCnt++;
			
		}
		
		return rtnPnltyList;

	}
	
	/**▲▲▲▲▲▲メソッド追加 終了▲▲▲▲▲▲*/

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * 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_PNLTY_AC_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());

		// DBアクセスを実行します
		db_AC_M_PNLTY.selectBySqlDefine(paramList, AC_M_PNLTY_AC_SELECT_001);
	}

	/**
	 * SQLKEY(AC_SELECT_008)で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_008(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());

		// DBアクセスを実行します
		db_CH_M_PRC_KMK_CS_CHGE.selectBySqlDefine(paramList, CH_M_PRC_KMK_CS_CHGE_AC_SELECT_008);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
