/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatAKPtnuwKaphukaIyak
*	ソースファイル名	：JBSbatAKPtnuwKaphukaIyak.java
*	作成者				：富士通　
*	作成日				：2013年03月11日
*＜機能概要＞
*　請求パターン内訳割賦違約金割賦情報付加部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2013/03/11   富士通		新規作成
*	v4.00.00	2013/04/24   富士通		料金検証障害対応【No19】割賦違約金が不一致対応
*	v9.00.00	2014/04/25   FJ) 前田	【ANK-2054-00-00】スマートリンク端末故障対応
*   v12.00.00	2014/11/12   FJ) 中野	【OM-2014-0003607】割賦36回違約金対応
*********************************************************************/
package eo.business.service;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatKKConst;
import eo.business.common.JCHbatSeikyKaknoBusinessUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.util.JBSbatDateUtil;

import eo.business.util.file.JBSbatAKIFM004;
import eo.business.util.file.JBSbatAKIFM020;
import eo.business.util.table.JBSbatKK_T_WRIB_SVC_KEI;
import eo.business.util.table.JBSbatKK_T_KAP_KEI;
import eo.business.util.table.JBSbatKK_M_KAP_PLAN;
import eo.business.util.table.JBSbatKK_M_WRIB_SVC_TANKA;
import eo.common.constant.JACStrConst;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatAKPtnuwKaphukaIyak extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(割賦契約)*/
	private static final String D_TBL_NAME_KK_T_KAP_KEI = "KK_T_KAP_KEI";

	/** SQL定義キー(AK_SELECT_005)*/
	private static final String KK_T_KAP_KEI_AK_SELECT_005 = "AK_SELECT_005";

	/** テーブルアクセスクラス(割賦契約)*/
	private JBSbatSQLAccess db_KK_T_KAP_KEI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** CH共通部品 */
	JCHbatSeikyKaknoBusinessUtil chUtil = null;

	/** 継続月数 ゼロ */
	private static final int KEIZOKU_MONTH_ZERO = 0;
	
	/** 退避．請求年月 */
	private String tmpSeikyYm = null;
	
	/** 月末日 */
	private String tmpMonEndDay 	= null;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_T_KAP_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_KAP_KEI);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		this.chUtil = new JCHbatSeikyKaknoBusinessUtil(commonItem);

		// 料金スケジュール定義アクセス部品初期処理
		JACbatSchdlUtil schdlUtil 	= new JACbatSchdlUtil(commonItem);
		
		// 請求年月を取得する
		String seikyYm = schdlUtil.getBillDate(super.opeDate, JACStrConst.EVENT_CD_RYOKIN_KEISAN_YMD);
		this.tmpSeikyYm 	= seikyYm;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "バッチ運用日" + super.opeDate + "から取得した請求年月：" + seikyYm);
		
		// 月初日、月末日を取得する
		// 月初日[0] 月末日[1]
		String[] ymd 		= schdlUtil.getUseStrEnd(seikyYm, JACStrConst.EVENT_CD_USE_STAYMD, JACStrConst.EVENT_CD_USE_ENDYMD);
		this.tmpMonEndDay 	= ymd[1];
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "月初日：" + ymd[0]);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "月末日：" + ymd[1]);

		// 料金スケジュール定義アクセス部品クローズ
		schdlUtil.close();
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert inMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][inMap = " + inMap.getMap().toString() + "]") : true;
		
		JBSbatOutputItem outputItem = new JBSbatOutputItem();
		
		// 違約金算出元情報（端末差益割引／販売促進割引）の取得
		getPnltySnstMtInfoWri( inMap, outputItem );
		
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_KAP_KEI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(AK_SELECT_005)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	予約適用年月日
	 *		 	予約適用年月日
	 *		 	サービス契約番号
	 *		 	バッチ運用日
	 *		 	予約適用年月日
	 *		 	プラン課金開始年月日
	 *		 	バッチ運用日
	 *		 	予約適用年月日
	 *		 	割賦契約課金開始年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_KAP_KEI_AK_SELECT_005(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());
		paramList.setValue(param[4].toString());
		paramList.setValue(param[5].toString());
		paramList.setValue(param[6].toString());
		paramList.setValue(param[7].toString());
		paramList.setValue(param[8].toString());

		// DBアクセスを実行します
		db_KK_T_KAP_KEI.selectBySqlDefine(paramList, KK_T_KAP_KEI_AK_SELECT_005);
	}

	
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * 違約金算出元情報（端末差益割引／販売促進割引）を取得する。
	 * 
	 * @param inMap 入力電文
	 * @param outputItem　出力情報 
	 * @throws Exception 業務サービス内で発生した例外処理全般 
	 */

	private void getPnltySnstMtInfoWri(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputItem) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getPnltySnstMtInfoWri]");
		
		boolean pnltyHassei = false; // 違約金発生（なし)
		JBSbatCommonDBInterface dbMap = null;
		int chrgKeizokuMthCnt = KEIZOKU_MONTH_ZERO; 	// 課金継続日数
		
		
		// 割賦違約金情報（端末差益割引／販売促進割引）の検索
		dbMap = this.getKapPltyInfoWri(inMap);
		
		// 取得した情報分ループ
		while(null != dbMap)
		{
			// 違約金発生判定を呼び出し
			// （共通）違約金発生判定
			pnltyHassei = JudgePnltyHassei(inMap,dbMap);

			// 課金継続月数の算出
			chrgKeizokuMthCnt = snstChrgKeizokuMthCnt(dbMap);
			
			//		
			// 請求パターン内訳割賦契約情報の出力
			setOutputItem(outputItem,inMap,dbMap,chrgKeizokuMthCnt,pnltyHassei);
			
			// 次レコード
			dbMap = db_KK_T_KAP_KEI.selectNext();	
			
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getPnltySnstMtInfoWri]");
		
	}
	
	
	/**
	 * 課金継続月数を算出する。
	 * 
	 * @param inMap 入力電文
	 * @param outputItem　出力情報 
	 * @throws Exception 業務サービス内で発生した例外処理全般 
	 */
	private int snstChrgKeizokuMthCnt(JBSbatCommonDBInterface dbMap) throws Exception
	{

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][snstChrgKeizokuMthCnt]");

		int svcKzkMonCnt = 0;
		String kapSeikyStaYm =  dbMap.getString(JBSbatKK_T_KAP_KEI.KAP_SEIKY_STA_YM);
		
		// 割賦請求開始年月が存在する場合
		if(null != kapSeikyStaYm )
		{
			// サービス継続月数(割賦請求開始年月〜請求年月までの経過月数)を算出する
			svcKzkMonCnt = JBSbatDateUtil.monthDiff(this.tmpSeikyYm, kapSeikyStaYm, JBSbatKKConst.MONTHDIFF_1);
		}
		else
		{
			svcKzkMonCnt =0;
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][snstChrgKeizokuMthCnt][割賦請求開始年月が存在しないため課金継続月数は算出不能。");

		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][snstChrgKeizokuMthCnt][課金継続月数："+ svcKzkMonCnt + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][snstChrgKeizokuMthCnt]");
		return svcKzkMonCnt;
		
	}
		
	/**
	 *  割賦違約金情報（端末差益割引／販売促進割引）を検索する。
	 * 
	 * @param inMap 入力電文
	 * @return dbMap 割賦契約からの取得結果
	 * @throws Exception 業務サービス内で発生した例外処理全般 
	 */
	private JBSbatCommonDBInterface getKapPltyInfoWri(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getKapPltyInfoWri]");
		
		String svcKeiNo   = inMap.getString(JBSbatAKIFM004.SVC_KEI_NO);				// サービス契約番号
		
		
		JBSbatCommonDBInterface dbList = new JBSbatCommonDBInterface();
		
		// 割賦契約検索呼出
		dbList.setValue(this.tmpMonEndDay);		// 請求年月月末日
		dbList.setValue(this.tmpMonEndDay);		// 請求年月月末日
		dbList.setValue(svcKeiNo);				// 入力．サービス契約番号
		dbList.setValue(this.tmpMonEndDay);		// 請求年月月末日
		dbList.setValue(this.tmpMonEndDay);		// 請求年月月末日
		dbList.setValue(this.tmpMonEndDay);		// 請求年月月末日
		dbList.setValue(this.tmpMonEndDay);		// 請求年月月末日
		dbList.setValue(this.tmpMonEndDay);		// 請求年月月末日
		dbList.setValue(this.tmpMonEndDay);		// 請求年月月末日
		
		this.executeKK_T_KAP_KEI_AK_SELECT_005(dbList.getList().toArray());
		
		// 結果取得
		JBSbatCommonDBInterface dbMap = db_KK_T_KAP_KEI.selectNext();
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getKapPltyInfoWri]");
		
		return dbMap;
	}
	
	/**
	 * DBからの検索情報をもとに、
	 * 検索件数分の出力レコードを作成して出力情報を設定します
	 * @param outputItem　出力情報
	 * @param inMap　入力電文
	 * @param dbMap　割賦契約からの取得結果
	 * @param chrgKeizokuMthCnt 
	 * @param pnltyHassei 
	 * @throws Exception　業務サービス内で発生した例外全般
	 */
	private void setOutputItem(JBSbatOutputItem outputItem, JBSbatServiceInterfaceMap inMap , JBSbatCommonDBInterface dbMap, int chrgKeizokuMthCnt, boolean pnltyHassei ) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setOutputItem]");

		// 初期化
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// 入力電文コピー
		copyInputToOutput(inMap, outMap);
		
		// 割賦契約等の情報を設定
		copykapKeiData(dbMap, outMap);
		
		// 編集項目の設定
		
		Integer tmpMthCnt = new Integer(chrgKeizokuMthCnt);
		outMap.setString(JBSbatAKIFM020.CHRG_KEIZOKU_MON_CNT,		tmpMthCnt.toString()	 );		// 課金継続月数
		
		// 違約金発生対象でない場合
		if( false == pnltyHassei)
		{
			// 想定金額算出方法コードに空白を設定
			outMap.setString(JBSbatAKIFM020.SOTEI_AMNT_SNST_WAY_CD,		JACStrConst.PRCKNS_KEI_STAT_CD_SP );
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setHenshuKmk][違約金なし 想定金額算出方法コードに空白を設定]");
			
		}
		
		// 出力フラグを設定します
		outMap.setOutFlg(true);
		// 出力レコード1件設定します
		outputItem.addOutMapList(outMap);
		
		assert outMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][setOutputItem][outMap = " + outMap.getMap().toString() + "]") : true;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setOutputItem]");
	
	}
	
	/**
	 * 入力電文から出力電文へのコピーを行う。	
	 * @param inMap     入力電文（請求パターン内訳情報からのコピー）
	 * @param outMap    出力電文
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void copyInputToOutput(JBSbatServiceInterfaceMap inMap,  JBSbatServiceInterfaceMap outMap ) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][copyInputToOutput]");
		assert inMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputInfo][inMap=" + inMap.toString() + "]") : true;
		
		// 入力電文コピー
		outMap.setString(JBSbatAKIFM020.CHST_KEI_SKB_CD,			inMap.getString(JBSbatAKIFM004.CHST_KEI_SKB_CD));			// 抽出契約識別コード
		outMap.setString(JBSbatAKIFM020.PRC_GRP_CD, 				inMap.getString(JBSbatAKIFM004.PRC_GRP_CD));				// 料金グループコード
		outMap.setString(JBSbatAKIFM020.PCRS_CD, 					inMap.getString(JBSbatAKIFM004.PCRS_CD));					// 料金コースコード
		outMap.setString(JBSbatAKIFM020.PRC_SVC_CD, 				inMap.getString(JBSbatAKIFM004.PRC_SVC_CD));				// 料金サービスコード
		outMap.setString(JBSbatAKIFM020.SYSID,						inMap.getString(JBSbatAKIFM004.SYSID));						// SYSID
		outMap.setString(JBSbatAKIFM020.SEIRI_NO, 					inMap.getString(JBSbatAKIFM004.SEIRI_NO));					// 整理番号
		outMap.setString(JBSbatAKIFM020.SEIKY_KEI_NO, 				inMap.getString(JBSbatAKIFM004.SEIKY_KEI_NO));				// 請求契約番号
		outMap.setString(JBSbatAKIFM020.SVC_KEI_NO, 				inMap.getString(JBSbatAKIFM004.SVC_KEI_NO));				// サービス契約番号
		outMap.setString(JBSbatAKIFM020.SVC_KEI_UCWK_NO, 			inMap.getString(JBSbatAKIFM004.SVC_KEI_UCWK_NO));			// サービス契約内訳番号
		outMap.setString(JBSbatAKIFM020.OP_SVC_KEI_NO,	 			inMap.getString(JBSbatAKIFM004.OP_SVC_KEI_NO));				// オプションサービス契約番号
		outMap.setString(JBSbatAKIFM020.SBOP_SVC_KEI_NO, 			inMap.getString(JBSbatAKIFM004.SBOP_SVC_KEI_NO));			// サブオプションサービス契約番号
		outMap.setString(JBSbatAKIFM020.KKTK_SVC_KEI_NO, 			inMap.getString(JBSbatAKIFM004.KKTK_SVC_KEI_NO));			// 機器提供サービス契約番号
		outMap.setString(JBSbatAKIFM020.SEIOPSVC_KEI_NO, 			inMap.getString(JBSbatAKIFM004.SEIOPSVC_KEI_NO));			// 請求オプションサービス契約番号
		outMap.setString(JBSbatAKIFM020.WRIB_SVC_KEI_NO, 			inMap.getString(JBSbatAKIFM004.WRIB_SVC_KEI_NO));			// 割引サービス契約番号
		outMap.setString(JBSbatAKIFM020.GENE_ADD_DTM,	 			inMap.getString(JBSbatAKIFM004.GENE_ADD_DTM));				// 世代登録年月日時分秒
		outMap.setString(JBSbatAKIFM020.SVC_KEI_STAT, 				inMap.getString(JBSbatAKIFM004.SVC_KEI_STAT));				// サービス契約ステータス
		outMap.setString(JBSbatAKIFM020.RSV_APLY_YMD, 				inMap.getString(JBSbatAKIFM004.RSV_APLY_YMD));				// 予約適用年月日
		outMap.setString(JBSbatAKIFM020.PLAN_STAYMD, 				inMap.getString(JBSbatAKIFM004.PLAN_STAYMD));				// プラン開始年月日
		outMap.setString(JBSbatAKIFM020.PLAN_ENDYMD, 				inMap.getString(JBSbatAKIFM004.PLAN_ENDYMD));				// プラン終了年月日
		outMap.setString(JBSbatAKIFM020.PLAN_CHRG_STAYMD, 			inMap.getString(JBSbatAKIFM004.PLAN_CHRG_STAYMD));			// プラン課金開始年月日
		outMap.setString(JBSbatAKIFM020.PLAN_CHRG_ENDYMD, 			inMap.getString(JBSbatAKIFM004.PLAN_CHRG_ENDYMD));			// プラン課金終了年月日
		outMap.setString(JBSbatAKIFM020.PLAN_END_SBT_CD, 			inMap.getString(JBSbatAKIFM004.PLAN_END_SBT_CD));			// プラン終了種別コード
		outMap.setString(JBSbatAKIFM020.SVC_CANCEL_YMD, 			inMap.getString(JBSbatAKIFM004.SVC_CANCEL_YMD));			// サービスキャンセル年月日
		outMap.setString(JBSbatAKIFM020.SVC_STA_YMD, 				inMap.getString(JBSbatAKIFM004.SVC_STA_YMD));				// サービス開始年月日
		outMap.setString(JBSbatAKIFM020.SVC_CHRG_STAYMD, 			inMap.getString(JBSbatAKIFM004.SVC_CHRG_STAYMD));			// サービス課金開始年月日
		outMap.setString(JBSbatAKIFM020.PAUSE_STP_CD, 				inMap.getString(JBSbatAKIFM004.PAUSE_STP_CD));				// 休止中断コード
		outMap.setString(JBSbatAKIFM020.SVC_PAUSE_CHRG_STA_YMD,		inMap.getString(JBSbatAKIFM004.SVC_PAUSE_CHRG_STA_YMD));	// サービス休止課金開始年月日
		outMap.setString(JBSbatAKIFM020.SVC_PAUSE_RLS_YMD, 			inMap.getString(JBSbatAKIFM004.SVC_PAUSE_RLS_YMD));			// サービス休止解除年月日
		outMap.setString(JBSbatAKIFM020.SVC_ENDYMD, 				inMap.getString(JBSbatAKIFM004.SVC_ENDYMD));				// サービス終了年月日
		outMap.setString(JBSbatAKIFM020.SVC_CHRG_ENDYMD, 			inMap.getString(JBSbatAKIFM004.SVC_CHRG_ENDYMD));			// サービス課金終了年月日
		outMap.setString(JBSbatAKIFM020.SVC_DSL_YMD, 				inMap.getString(JBSbatAKIFM004.SVC_DSL_YMD));				// サービス解約年月日
		outMap.setString(JBSbatAKIFM020.SVC_DLRE_CD, 				inMap.getString(JBSbatAKIFM004.SVC_DLRE_CD));				// サービス解約理由コード
		outMap.setString(JBSbatAKIFM020.KAIHK_YMD, 					inMap.getString(JBSbatAKIFM004.KAIHK_YMD));					// 回復年月日
		outMap.setString(JBSbatAKIFM020.PNLTY_HASSEI_CD, 			inMap.getString(JBSbatAKIFM004.PNLTY_HASSEI_CD));			// 違約金発生コード
		outMap.setString(JBSbatAKIFM020.IDO_DIV, 					inMap.getString(JBSbatAKIFM004.IDO_DIV));					// 異動区分
		outMap.setString(JBSbatAKIFM020.BMP_UM,						inMap.getString(JBSbatAKIFM004.BMP_UM));					// 番ポ有無
		outMap.setString(JBSbatAKIFM020.SEIKY_YM,					inMap.getString(JBSbatAKIFM004.SEIKY_YM));					// 請求年月
		outMap.setString(JBSbatAKIFM020.PRCKNS_KEI_STAT_CD,			inMap.getString(JBSbatAKIFM004.PRCKNS_KEI_STAT_CD));		// 料金検証契約状態コード
		outMap.setBigDecimal(JBSbatAKIFM020.CHRG_KEIZOKU_MON_CNT,	inMap.getBigDecimal(JBSbatAKIFM004.CHRG_KEIZOKU_MON_CNT));	// 課金継続月数
		outMap.setBigDecimal(JBSbatAKIFM020.KEI_CNT,				inMap.getBigDecimal(JBSbatAKIFM004.KEI_CNT));				// 契約数
		outMap.setBigDecimal(JBSbatAKIFM020.HANTEI_DANKAI_KMK_VALUE,inMap.getBigDecimal(JBSbatAKIFM004.HANTEI_DANKAI_KMK_VALUE));// 判定用段階決定元項目値
		outMap.setString(JBSbatAKIFM020.MANSION_ID,					inMap.getString(JBSbatAKIFM004.MANSION_ID));				// マンションID
		outMap.setString(JBSbatAKIFM020.TK_HOSHIKI_KEI_NO,			inMap.getString(JBSbatAKIFM004.TK_HOSHIKI_KEI_NO));			// 提供方式契約番号
		outMap.setString(JBSbatAKIFM020.KANYU_KEI_PAY_HOSHIKI_CD,	inMap.getString(JBSbatAKIFM004.KANYU_KEI_PAY_HOSHIKI_CD));	// 加入契約支払方式コード
		outMap.setString(JBSbatAKIFM020.PAY_KEI_SKBT_CD,			inMap.getString(JBSbatAKIFM004.PAY_KEI_SKBT_CD));			// 支払契約識別コード
		outMap.setString(JBSbatAKIFM020.SEIKY_PTN_CD,				inMap.getString(JBSbatAKIFM004.SEIKY_PTN_CD));				// 請求パターンコード
		outMap.setString(JBSbatAKIFM020.UW_PRC_SVC_CD,				inMap.getString(JBSbatAKIFM004.UW_PRC_SVC_CD));				// 内訳料金サービスコード
		outMap.setString(JBSbatAKIFM020.UW_PRC_KMK_CD,				inMap.getString(JBSbatAKIFM004.UW_PRC_KMK_CD));				// 内訳料金項目コード
		outMap.setString(JBSbatAKIFM020.SONZAI_CHK_LV_CD,			inMap.getString(JBSbatAKIFM004.SONZAI_CHK_LV_CD));			// 存在チェックレベルコード
		outMap.setString(JBSbatAKIFM020.AMNT_CHK_LV_CD,				inMap.getString(JBSbatAKIFM004.AMNT_CHK_LV_CD));			// 金額チェックレベルコード
		outMap.setString(JBSbatAKIFM020.SOTEI_AMNT_SNST_WAY_CD,		inMap.getString(JBSbatAKIFM004.SOTEI_AMNT_SNST_WAY_CD));	// 想定金額算出方法コード 
		outMap.setString(JBSbatAKIFM020.DANKAI_KETEI_MOTO_KMK_DIV,	inMap.getString(JBSbatAKIFM004.DANKAI_KETEI_MOTO_KMK_DIV));	// 段階決定元項目区分
		outMap.setBigDecimal(JBSbatAKIFM020.SOTEI_AMNT,				inMap.getBigDecimal(JBSbatAKIFM004.SOTEI_AMNT));			// 想定金額

		assert outMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][copyInputToOutput][outMap = " + outMap.getMap().toString() + "]") : true;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][copyInputToOutput]");
		
		return;
	}
	
	/**
	 * スキーマ取得項目から出力電文へのコピーを行う。	
	 * @param inMap     入力電文（請求パターン内訳情報からのコピー）
	 * @param outMap    出力電文
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void copykapKeiData(JBSbatCommonDBInterface dbMap,  JBSbatServiceInterfaceMap outMap ) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][copykapKeiData]");
		assert dbMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][copykapKeiData][outMap=" + outMap.toString() + "]") : true;
		
		// 割賦契約スキーマの取得結果から項目をコピーする。
		outMap.setString(JBSbatAKIFM020.KKTK_SVC_KEI_NO,			dbMap.getString(JBSbatKK_T_KAP_KEI.KKTK_SVC_KEI_NO));			// 機器提供サービス契約番号 (上書更新)
		outMap.setString(JBSbatAKIFM020.WRIB_SVC_KEI_NO,		 	dbMap.getString(JBSbatKK_T_WRIB_SVC_KEI.WRIB_SVC_KEI_NO));		// 割引サービス契約番号
		outMap.setString(JBSbatAKIFM020.KAP_KEI_NO,		 			dbMap.getString(JBSbatKK_T_KAP_KEI.KAP_KEI_NO));				// 割賦契約番号
		outMap.setString(JBSbatAKIFM020.GENE_ADD_DTM,		 		dbMap.getString(JBSbatKK_T_KAP_KEI.GENE_ADD_DTM));				// 世代登録年月日時分秒(割賦契約スキーマより取得）
		outMap.setString(JBSbatAKIFM020.SVC_KEI_STAT,		 		dbMap.getString(JBSbatKK_T_KAP_KEI.KAP_KEI_STAT));				// サービス契約ステータス←割賦サービス契約ステータス
		outMap.setString(JBSbatAKIFM020.RSV_APLY_YMD,		 		dbMap.getString(JBSbatKK_T_KAP_KEI.RSV_APLY_YMD));				// 予約適用年月日←割賦契約．予約適用年月日
		outMap.setString(JBSbatAKIFM020.KAP_PLAN_CD, 				dbMap.getString(JBSbatKK_T_KAP_KEI.KAP_PLAN_CD));				// 割賦プランコード
		outMap.setString(JBSbatAKIFM020.KAP_GENE_ADD_DTM, 			dbMap.getString(JBSbatKK_T_KAP_KEI.GENE_ADD_DTM));				// (割賦契約)世代登録年月日時分秒
		outMap.setString(JBSbatAKIFM020.KAP_KEI_STAT, 				dbMap.getString(JBSbatKK_T_KAP_KEI.KAP_KEI_STAT));				// 割賦契約ステータス
		outMap.setString(JBSbatAKIFM020.KAP_RSV_APLY_YMD, 			dbMap.getString(JBSbatKK_T_KAP_KEI.RSV_APLY_YMD));				// (割賦契約)予約適用年月日
		outMap.setString(JBSbatAKIFM020.KAP_KEI_CNC_YMD, 			dbMap.getString(JBSbatKK_T_KAP_KEI.KAP_KEI_CNC_YMD));			// 割賦契約締結年月日
		outMap.setString(JBSbatAKIFM020.KAP_SEIKY_ENDYMD, 			dbMap.getString(JBSbatKK_T_KAP_KEI.KAP_SEIKY_ENDYMD));			// 割賦請求終了年月日
		outMap.setString(JBSbatAKIFM020.KAP_KEI_CHRG_STDARD_YMD,	dbMap.getString(JBSbatKK_T_KAP_KEI.KAP_KEI_CHRG_STDARD_YMD));	// 割賦契約課金基準年月日
		outMap.setString(JBSbatAKIFM020.KAP_KEI_CHRG_STAYMD,		dbMap.getString(JBSbatKK_T_KAP_KEI.KAP_KEI_CHRG_STAYMD));		// 割賦契約課金開始年月日
		outMap.setString(JBSbatAKIFM020.KAP_SEIKY_STA_YM,			getOutData(dbMap,JBSbatKK_T_KAP_KEI.KAP_SEIKY_STA_YM,6));		// 割賦請求開始年月
		outMap.setString(JBSbatAKIFM020.KAP_IKT_SIKY_SWCH_YM,		dbMap.getString(JBSbatKK_T_KAP_KEI.KAP_IKT_SIKY_SWCH_YM));		// 割賦一括請求切替年月
		outMap.setString(JBSbatAKIFM020.KAP_KEI_DSL_YMD,			dbMap.getString(JBSbatKK_T_KAP_KEI.KAP_KEI_DSL_YMD));			// 割賦契約解約年月日
		outMap.setString(JBSbatAKIFM020.KAP_PNLTY_HASSEI_CD,		dbMap.getString(JBSbatKK_T_KAP_KEI.PNLTY_HASSEI_CD));			// (割賦契約)違約金発生コード
		outMap.setString(JBSbatAKIFM020.KAP_PAY_ZAN_CNT,			dbMap.getString(JBSbatKK_T_KAP_KEI.KAP_PAY_ZAN_CNT));			// 割賦支払い残回数
		outMap.setString(JBSbatAKIFM020.KAP_SEIKY_ZUMI_CNT,			dbMap.getString(JBSbatKK_T_KAP_KEI.KAP_SEIKY_ZUMI_CNT));		// 割賦請求済回数
		outMap.setString(JBSbatAKIFM020.UW_PRC_SVC_CD,				dbMap.getString(JBSbatKK_M_WRIB_SVC_TANKA.WRIB_SVC_TANKA_NO));	// 内訳料金サービスコードに対して割引サービス単価番号
		
		// 割賦サービス契約スキーマの取得結果から項目をコピーする。
		outMap.setString(JBSbatAKIFM020.PLAN_STAYMD,				getOutData(dbMap,JBSbatKK_T_WRIB_SVC_KEI.PLAN_STAYMD));			// プラン開始年月日
		outMap.setString(JBSbatAKIFM020.PLAN_ENDYMD,				getOutData(dbMap,JBSbatKK_T_WRIB_SVC_KEI.PLAN_ENDYMD));			// プラン終了年月日
		outMap.setString(JBSbatAKIFM020.PLAN_CHRG_STAYMD,			getOutData(dbMap,JBSbatKK_T_WRIB_SVC_KEI.PLAN_CHRG_STAYMD,8));	// プラン課金開始年月日
		outMap.setString(JBSbatAKIFM020.PLAN_CHRG_ENDYMD,			getOutData(dbMap,JBSbatKK_T_WRIB_SVC_KEI.PLAN_CHRG_ENDYMD));	// プラン課金終了年月日
		outMap.setString(JBSbatAKIFM020.PLAN_END_SBT_CD,			getOutData(dbMap,JBSbatKK_T_WRIB_SVC_KEI.PLAN_END_SBT_CD));		// プラン終了種別コード
		outMap.setString(JBSbatAKIFM020.SVC_CANCEL_YMD,				getOutData(dbMap,JBSbatKK_T_WRIB_SVC_KEI.SVC_CANCEL_YMD));		// サービスキャンセル年月日
		outMap.setString(JBSbatAKIFM020.SVC_STA_YMD,				getOutData(dbMap,JBSbatKK_T_WRIB_SVC_KEI.SVC_STA_YMD));			// サービス開始年月日
		outMap.setString(JBSbatAKIFM020.SVC_CHRG_STAYMD,			getOutData(dbMap,JBSbatKK_T_WRIB_SVC_KEI.SVC_CHRG_STAYMD));		// サービス課金開始年月日
		outMap.setString(JBSbatAKIFM020.SVC_ENDYMD,					getOutData(dbMap,JBSbatKK_T_WRIB_SVC_KEI.SVC_ENDYMD));			// サービス終了年月日
		outMap.setString(JBSbatAKIFM020.SVC_CHRG_ENDYMD,			getOutData(dbMap,JBSbatKK_T_WRIB_SVC_KEI.SVC_CHRG_ENDYMD));		// サービス課金終了年月日
		outMap.setString(JBSbatAKIFM020.SVC_DSL_YMD,				getOutData(dbMap,JBSbatKK_T_WRIB_SVC_KEI.SVC_DSL_YMD));			// サービス解約年月日
		outMap.setString(JBSbatAKIFM020.SVC_DLRE_CD,				getOutData(dbMap,JBSbatKK_T_WRIB_SVC_KEI.SVC_DLRE_CD));			// サービス解約理由コード
		
		assert outMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][copykapKeiData][outMap = " + outMap.getMap().toString() + "]") : true;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][copykapKeiData]");

		return;
	}

	/**
	 * 違約金が発生しているかどうかの判定を行う。
	 * 
	 * @param inMap 入力電文
	 * @param dbMap 割賦契約スキーマからの取得結果
	 * @return true :　違約金発生　false 違約金なし
	 * @throws Exception 業務サービス内で発生した例外処理全般 
	 */
	private boolean JudgePnltyHassei(JBSbatServiceInterfaceMap inMap, JBSbatCommonDBInterface dbMap ) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][JudgePnltyHassei]");
		
		// 割賦販売形態コード取得
		String kapHamBaiFormCd = dbMap.getString(JBSbatKK_M_KAP_PLAN.KAP_HAMBAI_FORM_CD);	// 割賦プラン．割賦販売形態コード
		String kapIktSikySwchYm = dbMap.getString(JBSbatKK_T_KAP_KEI.KAP_IKT_SIKY_SWCH_YM);	// 割賦契約．割賦一括請求月
		String pnltyHasseiCd = inMap.getString(JBSbatAKIFM020.PNLTY_HASSEI_CD);			// 入力．違約金発生コード
		
		// 割賦契約プラン．割賦販売形態コード　　＝　一括　　または
		// （割賦契約プラン．割賦販売形態コード　＝　割賦　　かつ　割賦契約．割賦一括請求月　≦　請求年月）の場合
		// OM-2014-0003607 MOD START
		// if( ( ( null!= kapHamBaiFormCd) && JACStrConst.KAP_HAMBAI_FORM_CD_IKT.equals(kapHamBaiFormCd) ) ||
		//	( ( ( null!= kapHamBaiFormCd) && JACStrConst.KAP_HAMBAI_FORM_CD_KAP.equals(kapHamBaiFormCd) ) &&
		//	( ( null!= kapIktSikySwchYm) && this.tmpSeikyYm.compareTo(kapIktSikySwchYm) >= 0 ) ) )
		if( ( ( null!= kapHamBaiFormCd) && JACStrConst.KAP_HAMBAI_FORM_CD_IKT.equals(kapHamBaiFormCd) ) ||
			( ( ( ( null!= kapHamBaiFormCd) && JACStrConst.KAP_HAMBAI_FORM_CD_KAP.equals(kapHamBaiFormCd) ) ||
			    ( ( null!= kapHamBaiFormCd) && JACStrConst.KAP_HAMBAI_FORM_CD_KAP_36.equals(kapHamBaiFormCd) ) ) &&
			( ( null!= kapIktSikySwchYm) && this.tmpSeikyYm.compareTo(kapIktSikySwchYm) >= 0 ) ) ) 
		// OM-2014-0003607 MOD END
		{
			// 違約金発生コード　≠　０（違約金なし）
			if( !JACStrConst.PNLTY_HASSEI_CD_NON.equals( pnltyHasseiCd) )
			{
			
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][JudgePnltyHassei][違約金あり]");
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][JudgePnltyHassei]");
				// 違約金発生
				return true;
			}
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][JudgePnltyHassei][違約金なし]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][JudgePnltyHassei]");

		// 違約金なし
		return false;
	
	}

	/**
	 * 設定用データ取得処理
	 * 
	 * @param dbMap 入力電文
	 * @param String 取得キー
	 * @return String 設定用データ
	 * @throws Exception
	 */
	private String getOutData(JBSbatCommonDBInterface dbMap,String key)  throws Exception
	{
		String outData = null;
		
		if (dbMap.getString(key) == null)
		{
			
			// nullの場合は、空文字を設定する。
			outData = JACStrConst.KARA_MOJI;
		}
		else
		{
			
			// ＤＢより設定。
			outData = dbMap.getString(key);
		}
		
		return outData;
	}

	/**
	 * 設定用データ取得処理（右スペース詰）
	 * 
	 * @param dbMap 入力電文
	 * @param String 取得キー
	 * @return String 設定用データ
	 * @throws Exception
	 */
	private String getOutData(JBSbatCommonDBInterface dbMap,String key,int len)  throws Exception
	{
		String outData = null;
		
		if (dbMap.getString(key) == null || JACStrConst.KARA_MOJI.equals(dbMap.getString(key)))
		{
			
			// nullの場合は、空文字を設定する。
			outData = this.chUtil.fillString(JCHbatSeikyKaknoBusinessUtil.FillType.HalfSpace, JACStrConst.KARA_MOJI, len, true);
		}
		else
		{
			
			// ＤＢより設定。
			outData = this.chUtil.fillString(JCHbatSeikyKaknoBusinessUtil.FillType.HalfSpace, dbMap.getString(key), len, true);
		}
		
		return outData;
	}
}
