/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACKojiKapPrcCalc
*	ソースファイル名	：JBSbatACKojiKapPrcCalc.java
*	作成者				：FJ）鈴木　
*	作成日				：2018年02月02日
*＜機能概要＞
*　工事費割賦料金計算部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v36.00.00	2018/02/02   FJ）鈴木	【ANK-3269-00-00】新規作成
*	v36.00.01	2018/02/14   FJ）鈴木	【IT1-2018-0000025】工事費割賦料金情報（残回数）の
*															工事費分割回数の設定方法を変更
*	v36.00.02	2018/03/14   FJ）清原	【ST-2018-0000013】性能障害対応
*	v45.00.00	2019/08/23   FJ) 王		【ANK-3636-00-00】消費増税対応（8%⇒10%）
*********************************************************************/
package eo.business.service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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.util.file.JBSbatACIFI016;
import eo.business.util.file.JBSbatACIFM294;
import eo.business.util.table.JBSbatAC_M_KAP_PRC;
import eo.business.util.table.JBSbatCH_M_PRC_KMK_CS_CHGE;
import eo.business.util.table.JBSbatKK_M_KAP_PLAN;
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 富士通
*/
public class JBSbatACKojiKapPrcCalc extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(割賦料金)*/
	private static final String D_TBL_NAME_AC_M_KAP_PRC = "AC_M_KAP_PRC";
	
	/** テーブル(割賦プラン)*/
	private static final String D_TBL_NAME_KK_M_KAP_PLAN = "KK_M_KAP_PLAN";
	
	/** テーブル(料金項目抽出変換)*/
	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_KAP_PRC_AC_SELECT_001 = "AC_SELECT_001";
	
	/** SQL定義キー(AC_SELECT_001)*/
	private static final String KK_M_KAP_PLAN_AC_SELECT_001 = "AC_SELECT_001";
	
	/** SQL定義キー(AC_SELECT_028)*/
	private static final String CH_M_PRC_KMK_CS_CHGE_AC_SELECT_028 = "AC_SELECT_028";
	
	/** テーブルアクセスクラス(割賦料金)*/
	private JBSbatSQLAccess db_AC_M_KAP_PRC = null;
	
	/** テーブルアクセスクラス(割賦プラン)*/
	private JBSbatSQLAccess db_KK_M_KAP_PLAN = null;

	/** テーブルアクセスクラス(料金項目抽出変換)*/
	private JBSbatSQLAccess db_CH_M_PRC_KMK_CS_CHGE = null;

	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 割賦支払方法：１（一括支払（計算要）） */
	private static final String 	PAY_MTD_IKT_Y 	= "1";

	/** 割賦支払方法：２（一括支払） */
	private static final String 	PAY_MTD_IKT 	= "2";

	/** 割賦支払方法：３（割賦支払） */
	private static final String 	PAY_MTD_KAP 	= "3";
	
	/** 割賦対象請求月：１（初回請求月） */
	private static final String KAP_SEIKY_YM_S 	= "1";

	/** 割賦対象請求月：２（継続請求月） */
	private static final String KAP_SEIKY_YM_K 	= "2";
	
	/** 徴収パターンコード（10） */
	public static final String COLLECT_PATTERN_CD_KKAP = "10";
	
	/** 料金サービスコード桁数 */
	private static final int PRC_SVC_CD_LEN 		= JACStrConst.PRC_SVC_CD_LENGTH;
	
	/** 退避．料金サービス管理マップ */
	private HashMap<String, List<JBSbatCommonDBInterface>> tmpKapPrcMap = null;

	/**  退避．群月初日 */
	private String tmpCycFst = null;
	
	/**  退避．群月末日 */
	private String tmpCycEnd = null;
	
	// ST-2018-0000013 ADD START
	/** 割賦プランマップマップ */
	private HashMap<String, HashMap<String, Object>> kapPlanListMap = null;
	
	/** 残回数用料金項目コード */
// ANK-3636-00-00 MOD START
//	private String zPrcKmkCd = null;
	private Map<String,String> zPrcKmkCd = new HashMap<String, String>();
// ANK-3636-00-00 MOD END
	// ST-2018-0000013 ADD END
	
	/**
	 * 
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_AC_M_KAP_PRC = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AC_M_KAP_PRC);
		// DBアクセスクラスを生成します
		db_KK_M_KAP_PLAN = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_M_KAP_PLAN);
		// DBアクセスクラスを生成します
		db_CH_M_PRC_KMK_CS_CHGE = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_KMK_CS_CHGE);
		
		
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		// 料金スケジュール定義アクセス部品初期処理
		JACbatSchdlUtil schdlUtil = new JACbatSchdlUtil(commonItem);
		
		try
		{
			// 請求年月を取得する
			String seikyYm = schdlUtil.getBillDate(super.opeDate, JACStrConst.EVENT_CD_RYOKIN_KEISAN_YMD);
			
			// 請求年月から、利用開始終了日取得
			String[] strEndYmd = schdlUtil.getUseStrEnd(seikyYm, JACStrConst.EVENT_CD_USE_STAYMD, JACStrConst.EVENT_CD_USE_ENDYMD);
			
			this.tmpCycFst = strEndYmd[0];	// 群月初日
			this.tmpCycEnd = strEndYmd[1];	// 群月末日
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][群月初日：" + tmpCycFst + "]");
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][群月末日：" + tmpCycEnd + "]");
		}
		finally
		{
			// 料金スケジュール定義アクセス部品クローズ
			schdlUtil.close();
		}
		
		// 割賦料金マップを作成
		this.makeKapPrcMap();
		
		// ST-2018-0000013 ADD START
		// 割賦プラン情報を取得する
		this.getKapPlanInfo();
		
		// 残回数用料金項目コード取得
		this.getPrcKmkCd();
		// ST-2018-0000013 ADD END
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		// 割賦料金計算処理

		// 利用料金情報（割賦料金）出力用
		JBSbatOutputItem outputInItem = new JBSbatOutputItem();

		//割賦料金マスタの取得
		List<JBSbatCommonDBInterface> kapMList = getPrcInfo(inMap);
		if (kapMList == null)
		{
			// 処理を終了する
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][割賦料金マスタ対象無し]");
			return outputInItem;
		}
		// ST-2018-0000013 DEL START
//		// IT1-2018-0000025 ADD START
//		//割賦プランマスタの取得
//		JBSbatCommonDBInterface kapPlan = getKapPlanInfo(inMap);
//		// IT1-2018-0000025 ADD END
		// ST-2018-0000013 DEL END

		// IT1-2018-0000025 MOD START
		// 一括／割賦判定
		//String kapPayMtd = this.getKapPayMtd(inMap);
		// ST-2018-0000013 MOD START
		//String kapPayMtd = this.getKapPayMtd(kapPlan,inMap);
		String kapPayMtd = this.getKapPayMtd(inMap);
		// ST-2018-0000013 MOD END
		// IT1-2018-0000025 MOD END
		
		// 初回／継続判定
		String kapSeikyYM = this.getKapSeikyYM(inMap);
		
		// ST-2018-0000013 DEL START
//		// 残回数用料金項目コード取得
//		String zPrcKmkCd = this.getPrcKmkCd(inMap);
		// ST-2018-0000013 DEL END
		
		// 割賦料金リスト用カウンタ
		int tmpCnt = 0;
		
		// 割賦料金のリスト分、繰り返し行う。
		while(kapMList.size() > tmpCnt)
		{
			// 計算処理
			BigDecimal kapPrc = this.getKapPrc(inMap, kapPayMtd, kapSeikyYM, kapMList.get(tmpCnt));
			
			// 利用料金情報（割賦料金）の出力
			
			JBSbatCommonDBInterface kapMListMei = kapMList.get(tmpCnt);
			
			String prcKmkCd1 = "";
			String chosyuPtCd1 = "";
			
			// 料金項目コード
			if (PAY_MTD_IKT_Y.equals(kapPayMtd))
			{	// 一括支払（要計算）の場合、割賦料金スキーマ．一括請求切替料金項目コードを設定
				prcKmkCd1 = kapMListMei.getString(JBSbatAC_M_KAP_PRC.IKT_SIKY_SWCH_PRC_KMK_CD);
			}
			else
			{	// 割賦料金スキーマ.料金項目コードを設定
				prcKmkCd1 = kapMListMei.getString(JBSbatAC_M_KAP_PRC.PRC_KMK_CD);
			}
			
			// 徴収パターンコード
			if (KAP_SEIKY_YM_S.equals(kapSeikyYM))
			{	// 初回請求月の場合、割賦料金スキーマ．初回徴収パターンコードを設定
				chosyuPtCd1 = kapMListMei.getString(JBSbatAC_M_KAP_PRC.FIRST_COLLECT_PATTERN_CD);
			}
			else
			{	// 割賦料金スキーマ．継続徴収パターンコードを設定
				chosyuPtCd1 = kapMListMei.getString(JBSbatAC_M_KAP_PRC.KEIZOKU_COLLECT_PATTERN_CD);
			}
			
			// 上記で取得した値を渡す
			this.makeOutputInfo(inMap, prcKmkCd1, chosyuPtCd1, kapPrc, kapMList.get(tmpCnt), outputInItem);
			
			// 残回数用利用料金情報の出力
			// 料金項目コード , 徴収パターンコード
			if (PAY_MTD_KAP.equals(kapPayMtd))
			{	// 支払方法が割賦の場合、残回数表示用料金項目コードを設定
				// ST-2018-0000013 MOD START
				//String zanPrcKmkCd = zPrcKmkCd;
// ANK-3636-00-00 MOD START
//				String zanPrcKmkCd = this.zPrcKmkCd;
				String zanPrcKmkCd = this.zPrcKmkCd.get(prcKmkCd1.substring(0, 1));
// ANK-3636-00-00 MOD END
				// ST-2018-0000013 MOD END
				// 徴収パターンコード：10（固定）
				String zanChosyuPtCd = JACStrConst.COLLECT_PATTERN_CD_KKAP;
				// IT1-2018-0000025_MOD START
				// // 料金：割賦請求済回数 + 1
				// BigDecimal zankapPrc = inMap.getBigDecimal(JBSbatACIFM294.KAP_SEIKY_ZUMI_CNT).add(BigDecimal.ONE);
				// ST-2018-0000013 MOD START
				//BigDecimal kapPayCnt = kapPlan.getBigDecimal(JBSbatKK_M_KAP_PLAN.KAP_PAY_CNT);
				BigDecimal kapPayCnt = getKapPayCnt(inMap);
				// ST-2018-0000013 MOD END
				// 料金：(割賦プラン.割賦支払い回数−課金対象工事費割賦情報.割賦支払い残回数 )＋ 1
				BigDecimal zankapPrc = kapPayCnt.subtract(inMap.getBigDecimal(JBSbatACIFM294.KAP_PAY_ZAN_CNT)).add(BigDecimal.ONE);
				// IT1-2018-0000025_MOD END
				
				// 残回数用にした値をを渡す
				this.makeOutputInfo(inMap, zanPrcKmkCd, zanChosyuPtCd, zankapPrc, kapMList.get(tmpCnt), outputInItem);
			}
			
			tmpCnt++;
			
		}
		
		return outputInItem;
		
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_AC_M_KAP_PRC.close();
		db_KK_M_KAP_PLAN.close();
		db_CH_M_PRC_KMK_CS_CHGE.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * 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_KAP_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_KAP_PRC.selectBySqlDefine(paramList, AC_M_KAP_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 executeKK_M_KAP_PLAN_AC_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		// ST-2018-0000013 DEL START
		//paramList.setValue(param[1].toString());
		// ST-2018-0000013 DEL END

		// DBアクセスを実行します
		db_KK_M_KAP_PLAN.selectBySqlDefine(paramList, KK_M_KAP_PLAN_AC_SELECT_001);
	}
	
	
	/**
	 * SQLKEY(CH_M_PRC_KMK_CS_CHGE_AC_SELECT_028)で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_028(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_CH_M_PRC_KMK_CS_CHGE.selectBySqlDefine(paramList, CH_M_PRC_KMK_CS_CHGE_AC_SELECT_028);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * 文字を連結します
	 * @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();
	}
	
	/**
	 * 割賦料金マスタより、料金コース、料金サービス毎の料金項目情報を取得し、退避．割賦料金マップに保持する
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void makeKapPrcMap() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeKapPrcMap]");

		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		
		// システムコード
		paramList.setValue(super.systemCode);
		// 群月末日
		paramList.setValue(this.tmpCycEnd);
		
		// SQL実行
		executeAC_M_KAP_PRC_AC_SELECT_001(paramList.getList().toArray());
		
		JBSbatCommonDBInterface dbMap = db_AC_M_KAP_PRC.selectNext();
		
		this.tmpKapPrcMap = new HashMap<String, List<JBSbatCommonDBInterface>>();
		
		// 検索結果0件の場合
		if(null == dbMap)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeKapPrcMap]");
			return;
		}
			
		//ブレイク用Key
		String bKey = makeStr(dbMap.getString(JBSbatAC_M_KAP_PRC.PCRS_CD), dbMap.getString(JBSbatAC_M_KAP_PRC.PRC_SVC_CD));
		
		// 退避マップに設定するバリュー：検索結果のリスト
		ArrayList<JBSbatCommonDBInterface> kapList = new ArrayList<JBSbatCommonDBInterface>();
		// 取得出来た場合
		while(dbMap != null)
		{
			
			// KEY：料金コースコード ＋ 料金サービスコード
			String key = makeStr(dbMap.getString(JBSbatAC_M_KAP_PRC.PCRS_CD), dbMap.getString(JBSbatAC_M_KAP_PRC.PRC_SVC_CD));
		
			// キーと検索結果のキーが異なった場合
			if(!bKey.equals(key))
			{
				// 割賦料金マップにキーとバリューを設定する
				this.tmpKapPrcMap.put(bKey, kapList);
				// キーに新たな値を設定する
				bKey = key;
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeKapPrcMap]Key:" + bKey);
				// バリューをクリアー
				kapList = new ArrayList<JBSbatCommonDBInterface>();
			}
			// 取得結果より割賦料金マップを作成しリストに格納
			kapList.add(dbMap);
			
			// 検索結果キークリアー
			key = null;
			
			dbMap =  db_AC_M_KAP_PRC.selectNext();
		}
		
		// 最後の取得結果を格納
		// 割賦料金マップにキーとバリューを設定する
		this.tmpKapPrcMap.put(bKey, kapList);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeKapPrcMap]");
		return;
	}
	
	/**
	 * 割賦料金マップを検索し、料金項目情報を取得します
	 * @param inMap 入力電文
	 * @return List 料金項目情報
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private List<JBSbatCommonDBInterface> getPrcInfo(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getPrcInfo]");
		
		// KEY：料金コース + 割賦プランコード
		String key = makeStr(inMap.getString(JBSbatACIFM294.PCRS_CD),
					JACbatRknBusinessUtil.fillHalfSpace(inMap.getString(JBSbatACIFM294.KAP_PLAN_CD), PRC_SVC_CD_LEN, true));
		
		// 取得できなかった場合
		if(!this.tmpKapPrcMap.containsKey(key))
		{
			return null;
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getPrcInfo]");
		
		return this.tmpKapPrcMap.get(key);
	}
	
	// IT1-2018-0000025 ADD START
	/**
	 * 割賦プランを検索し、割賦プラン情報を取得します
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	// ST-2018-0000013 MOD START
	//private JBSbatCommonDBInterface getKapPlanInfo(JBSbatServiceInterfaceMap inMap) throws Exception
	private void getKapPlanInfo() throws Exception
	// ST-2018-0000013 MOD END
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getKapPlanInfo]");
		
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		
// ST-2018-0000013 DEL START
//		// 入力値取得
//		String kapPlan = inMap.getString(JBSbatACIFM294.KAP_PLAN_CD);	// 割賦プランコード
//		
//		// 割賦プラン
//		paramList.setValue(kapPlan);
// ST-2018-0000013 DEL END
		
		// ST-2018-0000013 ADD START
		// 割賦プランマップマップ
		this.kapPlanListMap = new HashMap<String, HashMap<String, Object>>();
		
		// 割賦プランリスト（
		HashMap<String, Object> kapPlanList = new HashMap<String,Object>();
		// ST-2018-0000013 ADD END
		
		// 群月末日
		paramList.setValue(this.tmpCycEnd);
		
		// 割賦販売形態コード･割賦支払い回数取得
		// SQL実行
		executeKK_M_KAP_PLAN_AC_SELECT_001(paramList.getList().toArray());
		JBSbatCommonDBInterface dbMap = db_KK_M_KAP_PLAN.selectNext();
		
		if (dbMap == null)
		{
			// DB未存在エラー
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getKapPlanInfo][DB未存在エラー]");
			// ST-2018-0000013 MOD START
			//String[] outCntMsg = {JBSbatKK_M_KAP_PLAN.TABLE_NAME,kapPlan};
			String[] outCntMsg = {JBSbatKK_M_KAP_PLAN.TABLE_NAME, JACStrConst.KARA_MOJI};
			// ST-2018-0000013 MOD END
			// エラーログ出力（エラーコード："EACB0250CE"（DB未存在エラー））
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0250CE, outCntMsg);
		}
		
		// ST-2018-0000013 ADD START
		while(dbMap != null)
		{
			kapPlanList = new HashMap<String,Object>();
			
			// 割賦販売形態コード
			kapPlanList.put(JBSbatKK_M_KAP_PLAN.KAP_HAMBAI_FORM_CD, dbMap.getString(JBSbatKK_M_KAP_PLAN.KAP_HAMBAI_FORM_CD));
			// 割賦支払い回数
			kapPlanList.put(JBSbatKK_M_KAP_PLAN.KAP_PAY_CNT,		dbMap.getBigDecimal(JBSbatKK_M_KAP_PLAN.KAP_PAY_CNT));
			
			kapPlanListMap.put(dbMap.getString(JBSbatKK_M_KAP_PLAN.KAP_PLAN_CD), kapPlanList);
			
			dbMap = db_KK_M_KAP_PLAN.selectNext();
		}
		// ST-2018-0000013 ADD END

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getKapPlanInfo]");
		
		// ST-2018-0000013 MOD START
		//return dbMap;
		return;
		// ST-2018-0000013 MOD END
	}
	// IT1-2018-0000025 ADD END
	
	/**
	 * 割賦支払方法を決定します
	 * @param inMap 入力電文
	 * @return String :支払方法
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	// IT1-2018-0000025 MOD START
	//private String getKapPayMtd(JBSbatServiceInterfaceMap inMap) throws Exception
	// ST-2018-0000013 MOD START
	//private String getKapPayMtd(JBSbatCommonDBInterface kapPlan , JBSbatServiceInterfaceMap inMap) throws Exception
	private String getKapPayMtd(JBSbatServiceInterfaceMap inMap) throws Exception
	// ST-2018-0000013 MOD END
	// IT1-2018-0000025 MOD END
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getKapPayMtd]");
		
		// IT1-2018-0000025 DEL START
//		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		// IT1-2018-0000025 DEL END
		
		String kapPayMtd = "";
		
		// 入力値取得
		// IT1-2018-0000025 DEL START
//		String kapPlan = inMap.getString(JBSbatACIFM294.KAP_PLAN_CD);	// 割賦プランコード
		// IT1-2018-0000025 DEL END
		String kapIktSikySwchYm = inMap.getString(JBSbatACIFM294.KAP_IKT_SIKY_SWCH_YM);	// 割賦一括請求切替年月
		String seikyYm = inMap.getString(JBSbatACIFM294.SEIKY_YM);						// 請求年月

		// IT1-2018-0000025 DEL START
//		// 割賦プラン
//		paramList.setValue(kapPlan);
//		// 群月末日
//		paramList.setValue(this.tmpCycEnd);
//		
//		// 割賦販売形態コード取得
//		// SQL実行
//		executeKK_M_KAP_PLAN_AC_SELECT_001(paramList.getList().toArray());
//		JBSbatCommonDBInterface dbMap = db_KK_M_KAP_PLAN.selectNext();
//				
//		// 取得できた場合
//		if(null != dbMap)
//		{
		// IT1-2018-0000025 DEL END
		
		// 一括／割賦判定

		// 入力．割賦一括請求切替年月　＝　入力．請求年月　の場合
		if (kapIktSikySwchYm.equals(seikyYm))
		{ 
			kapPayMtd = PAY_MTD_IKT_Y ;	//一括支払い（計算要）
		}
		else 
		{
			// 入力．割賦販売形態コード　＝　"01"（一括）　の場合
			// ST-2018-0000013 MOD START
			//if (JACStrConst.KAP_HAMBAI_FORM_CD_IKT.equals(kapPlan.getString(JBSbatKK_M_KAP_PLAN.KAP_HAMBAI_FORM_CD)))
			if (isKapIkt(inMap))
			// ST-2018-0000013 MOD END
			{	
				kapPayMtd = PAY_MTD_IKT;	//一括支払い
			}
			// 入力．割賦販売形態コード　＝　"01"（一括）　以外の場合
			else
			{
				kapPayMtd = PAY_MTD_KAP;	//割賦支払
			}
		}
		// IT1-2018-0000025 DEL START
//		}
//		 // 対象データが存在しない場合
//		else
//		{
//			// DB未存在エラー
//			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getKapPayMtd][DB未存在エラー]");
//			String[] outCntMsg = {JBSbatKK_M_KAP_PLAN.TABLE_NAME, kapPlan};
//			// エラーログ出力（エラーコード："EACB0250CE"（DB未存在エラー））
//			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0250CE, outCntMsg);
//		}
		// IT1-2018-0000025 DEL END
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getKapPayMtd]");
		
		return kapPayMtd;
	}
	
	/**
	 * 割賦対象請求月を決定します
	 * @param inMap 入力電文
	 * @return String 割賦対象請求月
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private String getKapSeikyYM(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getKapSeikyYM]");
		
		String kapSeikyYM = "";
		
		// 入力値取得
		String wKapSeikyYM = inMap.getString(JBSbatACIFM294.KAP_SEIKY_STA_YM);	// 割賦請求開始年月

		// 初回／継続判定

		// 入力．割賦開始請求年月　＝　未設定　の場合
		if (JACStrConst.KARA_MOJI.equals(wKapSeikyYM))
		{ 
			kapSeikyYM = KAP_SEIKY_YM_S;	//初回請求月
		}
		else 
		{
			kapSeikyYM = KAP_SEIKY_YM_K;	//継続請求月
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getKapSeikyYM]kapSeikyYM:" + kapSeikyYM);
		
		return kapSeikyYM;
	}
	
	/**
	 * 残回数表示用料金項目コードを取得
	 * @throws Exception
	 */
	// ST-2018-0000013 MOD START
//	private String getPrcKmkCd(JBSbatServiceInterfaceMap inMap) throws Exception
	private void getPrcKmkCd() throws Exception
	// ST-2018-0000013 MOD END
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getPrcKmkCd]");
		
		String prcKmkCd = "";
		
		// パラメータ取得部品の初期処理
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);
		// パラメータ取得部品(業務パラメータ)を使用し、以下を取得
		String gyomuPara = paramUtil.getGyoumuParameter(JACStrConst.CH_KKAP_ZANSUPRCKMK);
		
		// パラメータ取得部品のクローズ処理
		paramUtil.close();

		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
				
		// システムコード
		paramList.setValue(JACStrConst.SYS_CD_CH);
		// 業務機能識別コード
		paramList.setValue(gyomuPara);
		// 群月末日
		paramList.setValue(this.tmpCycEnd);

		// SQL実行
		executeCH_M_PRC_KMK_CS_CHGE_AC_SELECT_028(paramList.getList().toArray());
		JBSbatCommonDBInterface dbMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext();
		
		// 取得できた場合
		if (dbMap != null)
		{
// ANK-3636-00-00 MOD START
//			prcKmkCd = dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD);
			while (dbMap != null)
			{
				this.zPrcKmkCd.put(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD).substring(0, 1),
						dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD));
				
				dbMap = db_CH_M_PRC_KMK_CS_CHGE.selectNext();
			}
// ANK-3636-00-00 MOD END
		}
		// 対象データが存在しない場合
		else 
		{
            // DB未存在エラー
            assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getPrcKmkCd][DB未存在エラー]");
            String[] outCntMsg = {JBSbatCH_M_PRC_KMK_CS_CHGE.TABLE_NAME, gyomuPara};
            // エラーログ出力（エラーコード："EACB0250CE"（DB未存在エラー））
            throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0250CE, outCntMsg);
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getPrcKmkCd]");
		
// ANK-3636-00-00 DEL START
//		// ST-2018-0000013 ADD START
//		this.zPrcKmkCd = prcKmkCd;
//		// ST-2018-0000013 ADD END
// ANK-3636-00-00 DEL END
		
		// ST-2018-0000013 MOD START
		//return prcKmkCd;
		return;
		// ST-2018-0000013 MOD END
	}
	
	/**
	 * 利用料金を算出をします
	 * @param inMap 入力電文
	 * @param kapPayMtd 割賦支払方法
	 * @param kapSeikyYM 割賦対象請求月
	 * @param kapMListMei 割賦料金リスト
	 * @return BigDecimal 料金
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private BigDecimal getKapPrc(JBSbatServiceInterfaceMap inMap, String kapPayMtd 
									, String kapSeikyYM 
									, JBSbatCommonDBInterface kapMListMei) throws Exception
	{
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getKapPrc]");
		
		BigDecimal kapPrc = BigDecimal.ZERO;
		
		// 料金取得

		// ワーク．割賦支払方法　　＝　一括支払い
		if (PAY_MTD_IKT.equals(kapPayMtd))
		{
			// かつ、割賦対象請求月　＝　初回請求月　の場合
			if (KAP_SEIKY_YM_S.equals(kapSeikyYM))
			{
				// 算出料金　←　割賦料金．初回料金
				kapPrc = kapMListMei.getBigDecimal(JBSbatAC_M_KAP_PRC.FIRST_PRC);
			}

		}
		// ワーク．割賦支払方法　　＝　割賦支払
		else if (PAY_MTD_KAP.equals(kapPayMtd))
		{
			// かつ、割賦対象請求月　＝　初回請求月　の場合
			if (KAP_SEIKY_YM_S.equals(kapSeikyYM))
			{
				// 算出料金　←　割賦料金．初回料金
				kapPrc = kapMListMei.getBigDecimal(JBSbatAC_M_KAP_PRC.FIRST_PRC);
			}
			// かつ、割賦対象請求月　＝　継続請求月　の場合
			else
			{
				// 算出料金　←　割賦料金．継続料金
				kapPrc = kapMListMei.getBigDecimal(JBSbatAC_M_KAP_PRC.KEIZOKU_PRC);
			}
		}
		// ワーク．割賦支払方法　　＝　一括支払（要計算）
		else
		{
			// かつ、割賦対象請求月　＝　初回請求月　の場合
			if (KAP_SEIKY_YM_S.equals(kapSeikyYM))
			{
				// 算出料金　←　割賦料金．初回料金　＋（割賦料金．継続料金　×　（割賦対象．残回数　−　１））
				kapPrc = kapMListMei.getBigDecimal(JBSbatAC_M_KAP_PRC.FIRST_PRC)
													.add(kapMListMei.getBigDecimal(JBSbatAC_M_KAP_PRC.KEIZOKU_PRC)
														.multiply(inMap.getBigDecimal(JBSbatACIFM294.KAP_PAY_ZAN_CNT).subtract(BigDecimal.ONE)));
			}
			// かつ、割賦対象請求月　＝　継続料金　の場合
			else
			{
				// 算出料金　←　割賦料金．継続料金　×　割賦対象．残回数
				kapPrc = kapMListMei.getBigDecimal(JBSbatAC_M_KAP_PRC.KEIZOKU_PRC)
							.multiply(inMap.getBigDecimal(JBSbatACIFM294.KAP_PAY_ZAN_CNT));
			}
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getKapPrc]kapPrc:" + kapPrc);
		
		return kapPrc;
	}
	
	
	/**
	 * 利用料金情報（割賦料金）を出力します
	 * 
	 * @param inMap 入力電文
	 * @param prcKmkCd1 料金項目コード
	 * @param chosyuPtCd1 徴収パターンコード
	 * @param kapPrc 利用料金
	 * @param kapMListMei 割賦請料金リスト
	 * @param outputInItem  出力情報
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeOutputInfo(JBSbatServiceInterfaceMap inMap 
									, String prcKmkCd1
									, String chosyuPtCd1 
									, BigDecimal kapPrc 
									, JBSbatCommonDBInterface kapMListMei 
									, JBSbatOutputItem outputInItem) throws Exception
	{
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputInfo]");
		
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// 請求先番号
		outMap.setString(JBSbatACIFI016.SEIKY_KEI_NO, 				inMap.getString(JBSbatACIFM294.SEIKY_KEI_NO));
		
		// 請求年月
		outMap.setString(JBSbatACIFI016.SEIKY_YM, 					inMap.getString(JBSbatACIFM294.SEIKY_YM));

		// 整理番号
		outMap.setString(JBSbatACIFI016.SEIRI_NO, 					inMap.getString(JBSbatACIFM294.SEIRI_NO));

		// 割引サービス契約番号
		outMap.setString(JBSbatACIFI016.WRIB_SVC_KEI_NO, 			inMap.getString(JBSbatACIFM294.WRIB_SVC_KEI_NO));

		// 割引サービス対象契約番号
		outMap.setString(JBSbatACIFI016.WRISVC_TRGT_KEI_NO, 		inMap.getString(JBSbatACIFM294.WRISVC_TRGT_KEI_NO));

		// サービス番号
		outMap.setString(JBSbatACIFI016.SVC_NO, 					inMap.getString(JBSbatACIFM294.SVC_NO));

		// オプションサービス契約番号
		outMap.setString(JBSbatACIFI016.OP_SVKEI_NO,				inMap.getString(JBSbatACIFM294.OP_SVC_KEI_NO));
		
		// 料金サービス識別コード
		outMap.setString(JBSbatACIFI016.SVC_SKBT_CD, 				inMap.getString(JBSbatACIFM294.SVC_SKBT_CD));

		// 料金グループコード
		outMap.setString(JBSbatACIFI016.PRC_GRP_CD, 				inMap.getString(JBSbatACIFM294.PRC_GRP_CD));

		// 料金コースコード
		outMap.setString(JBSbatACIFI016.PCRS_CD, 					inMap.getString(JBSbatACIFM294.PCRS_CD));

		// 料金サービスコード
		outMap.setString(JBSbatACIFI016.PRC_SVC_CD, 				inMap.getString(JBSbatACIFM294.PRC_SVC_CD));

		// 料金項目コード
		outMap.setString(JBSbatACIFI016.PRC_KMK_CD, 				prcKmkCd1);

		// 徴収パターンコード
		outMap.setString(JBSbatACIFI016.COLLECT_PATTERN_CD, 		chosyuPtCd1);

		// 料金
		outMap.setBigDecimal(JBSbatACIFI016.PRC, 					kapPrc);
		
		// 利用開始日
		outMap.setString(JBSbatACIFI016.USE_STAYMD, 				inMap.getString(JBSbatACIFM294.USE_STAYMD));

		// 利用終了日
		outMap.setString(JBSbatACIFI016.USE_ENDYMD, 				inMap.getString(JBSbatACIFM294.USE_ENDYMD));

		// サービス開始日
		outMap.setString(JBSbatACIFI016.SVC_STAYMD, 				inMap.getString(JBSbatACIFM294.SVC_STAYMD));

		// 初回課金開始
		outMap.setString(JBSbatACIFI016.FIRST_CHRG_STAYMD, 			inMap.getString(JBSbatACIFM294.FIRST_CHRG_STAYMD));

		// サービス解約
		outMap.setString(JBSbatACIFI016.SVC_DSL_YMD, 				inMap.getString(JBSbatACIFM294.SVC_DSL_YMD));

		// サービス解約理由
		outMap.setString(JBSbatACIFI016.SVC_DLRE, 					inMap.getString(JBSbatACIFM294.SVC_DLRE));

		// サービス回復日
		outMap.setString(JBSbatACIFI016.SVC_KAIHK_DAY, 				inMap.getString(JBSbatACIFM294.SVC_KAIHK_DAY));

		// 利用日数
		outMap.setBigDecimal(JBSbatACIFI016.USE_DAY_CNT, 			inMap.getBigDecimal(JBSbatACIFM294.USE_DAY_CNT));

		// 利用不可日数
		outMap.setBigDecimal(JBSbatACIFI016.USE_FAIL_DAY_CNT, 		inMap.getBigDecimal(JBSbatACIFM294.USE_FAIL_DAY_CNT));

		// 相対区分
		outMap.setString(JBSbatACIFI016.AIT_DIV, 					inMap.getString(JBSbatACIFM294.AIT_DIV));

		// 締め日
		outMap.setString(JBSbatACIFI016.SIME_DAY, 					inMap.getString(JBSbatACIFM294.SIME_DAY));

		// 利用不可適用可否
		outMap.setString(JBSbatACIFI016.USE_APLY_KH_CD, 			JACStrConst.USE_NG_TKY_N);

		// 前受相殺優先順位
		outMap.setString(JBSbatACIFI016.MAE_YUSEN_JUN, 				JACStrConst.MAE_YUSEN_JUN_0);

		// 割引優先順位
		outMap.setString(JBSbatACIFI016.WRIB_YUSEN_JUN, 			JACStrConst.WRIB_YUSEN_JUN_0);

		// 上限判定優先順位
		outMap.setString(JBSbatACIFI016.UPPL_JUDGE_YUSEN_JUN, 		JACStrConst.UPPL_YUSEN_JUN_0);

		// 割引繰越可否
		outMap.setString(JBSbatACIFI016.WRIB_KKSHI_KH, 				JACStrConst.WRIB_TKY_H);
		
		// サービス詳細識別番号
		outMap.setString(JBSbatACIFI016.SVC_DTL_SKBT_NO, 			inMap.getString(JBSbatACIFM294.SVC_DTL_SKBT_NO));
		
		// 出力フラグ設定
		outMap.setOutFlg(true);
		
		outputInItem.addOutMapList(outMap);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputInfo]");

		return;
	}
	// ST-2018-0000013 ADD START

	/**
	 * 割賦プランコードに紐づく割賦販売形態コードが一括か否か返却します
	 * @param inMap 入力電文
	 * @return true:一括 false:分割
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private boolean isKapIkt(JBSbatServiceInterfaceMap inMap) throws Exception 
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][isKapIkt]");
		
		// 割賦プランコードに該当するマップを取得する
		HashMap<String, Object> childMap = kapPlanListMap.get(inMap.getString(JBSbatACIFM294.KAP_PLAN_CD));
		
		// 取得したマップから割賦販売方法コードを取得する
		String kapHambaiFormCd = (String) childMap.get(JBSbatKK_M_KAP_PLAN.KAP_HAMBAI_FORM_CD);

		// 割賦販売方法コードが取得できない場合
		if((kapHambaiFormCd == null || "".equals(kapHambaiFormCd)))
		{
			// DB未存在エラー
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][isKapIkt][DB未存在エラー]");
			String[] outCntMsg = {JBSbatKK_M_KAP_PLAN.TABLE_NAME, inMap.getString(JBSbatACIFM294.KAP_PLAN_CD)};
			// エラーログ出力（エラーコード："EACB0250CE"（DB未存在エラー））
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0250CE, outCntMsg);
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][isKapIkt]");
		
		// 割賦販売方法コードが一括の場合、trueを返却
		if(JACStrConst.KAP_HAMBAI_FORM_CD_IKT.equals(kapHambaiFormCd))
		{
			return true;
		}
		//割賦販売方法コードが一括以外の場合、falseを返却
		else
		{
			return false;
		}
	}

	/**
	 * 割賦プランコードに紐づく割賦支払い回数を返却します
	 * @param inMap 入力電文
	 * @return BigDecimal 割賦支払い回数
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private BigDecimal getKapPayCnt(JBSbatServiceInterfaceMap inMap) throws Exception 
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getKapPayCnt]");
		
		// 割賦プランコードに該当するマップを取得する
		HashMap<String, Object> childMap = kapPlanListMap.get(inMap.getString(JBSbatACIFM294.KAP_PLAN_CD));
		
		// 取得したマップから割賦支払い回数を取得する
		BigDecimal kapPayCnd = (BigDecimal) childMap.get(JBSbatKK_M_KAP_PLAN.KAP_PAY_CNT);
		
		// 割賦支払い回数が取得できない場合
		if((kapPayCnd == null || "".equals(kapPayCnd)))
		{
			// DB未存在エラー
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getKapPayCnt][DB未存在エラー]");
			String[] outCntMsg = {JBSbatKK_M_KAP_PLAN.TABLE_NAME, inMap.getString(JBSbatACIFM294.KAP_PLAN_CD)};
			// エラーログ出力（エラーコード："EACB0250CE"（DB未存在エラー））
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0250CE, outCntMsg);
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getKapPayCnt]");
		
		return kapPayCnd;
	}
	// ST-2018-0000013 ADD END
}
