/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKVKpKeiKnsho
*	ソースファイル名	：JBSbatKVKpKeiKnsho.java
*	作成者				：富士通　
*	作成日				：2014年06月10日
*＜機能概要＞
*　割賦契約検証部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v9.00.00	2014/06/10  富士通		新規作成
*	v9.00.01	2014/06/13  乾		    IT1-2014-0000216
*	v9.00.02	2014/06/17  乾		    IT1-2014-0000220
*   v9.00.03	2014/06/19  乾		    IT1-2014-0000224
*   v9.00.04	2014/06/25  乾		    ST4-2014-0000038
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;

import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatKVIFM038;
import eo.business.util.table.JBSbatKK_M_KAP_PLAN;
import eo.business.util.table.JBSbatKK_M_WRSV_APLY_JKN;
import eo.business.util.table.JBSbatKK_T_KAP_KEI;
import eo.business.util.table.JBSbatKK_T_KKTK_SVC_KEI;
import eo.business.util.table.JBSbatKK_T_OP_SVC_KEI;
import eo.business.util.table.JBSbatKK_T_WRIB_SVC_KEI;
import eo.common.constant.JPCBatchMessageConstant;
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;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKVKpKeiKnsho extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(割賦契約/機器提供サービス/割賦プラン/割引サービス契約)*/
	private static final String D_TBL_NAME_KK_T_KAP_KEI = "KK_T_KAP_KEI";

	/** テーブル(オプションサービス契約)*/
	private static final String D_TBL_NAME_KK_T_OP_SVC_KEI = "KK_T_OP_SVC_KEI";

	/** テーブル(割引サービス適用条件)*/
	private static final String D_TBL_NAME_KK_M_WRSV_APLY_JKN = "KK_M_WRSV_APLY_JKN";

	/** SQL定義キー(KV_SELECT_003)*/
	private static final String KK_T_KAP_KEI_KV_SELECT_003 = "KV_SELECT_003";

	/** SQL定義キー(KV_SELECT_017)*/
	private static final String KK_T_OP_SVC_KEI_KV_SELECT_017 = "KV_SELECT_017";

	/** SQL定義キー(KV_SELECT_003)*/
	private static final String KK_M_WRSV_APLY_JKN_KV_SELECT_003 = "KV_SELECT_003";

	/** テーブルアクセスクラス(割賦契約/機器提供サービス/割賦プラン)*/
	private JBSbatSQLAccess db_KK_T_KAP_KEI = null;

	/** テーブルアクセスクラス(オプションサービス契約)*/
	private JBSbatSQLAccess db_KK_T_OP_SVC_KEI = null;

	/** テーブルアクセスクラス(割引サービス適用条件)*/
	private JBSbatSQLAccess db_KK_M_WRSV_APLY_JKN = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/
	
	/** 当日異動情報.サービス契約番号 */
	public static final String KVIFM033_SVC_KEI_NO = "SVC_KEI_NO";

	/** 割賦契約ステータス(完了済)*/
	private static final String SVC_KEI_STAT_KANRYOZU = "100";
	
	/** 割賦契約ステータス(解約済)*/
	private static final String SVC_KEI_STAT_KAIYAKU = "910";
	
	/** 割賦契約ステータス(キャンゼル済)*/
	private static final String SVC_KEI_STAT_CANCEL = "920";
	
	/** オプションサービス契約ステータス(サービス提供中)*/
	private static final String OP_SVC_KEI_STAT_SVCTYU = "100";
	
	/** 割引サービス契約ステータス(キャンセル済)*/
	private static final String WRIB_SVC_KEI_STAT_CANCEL = "920";
	
	/** ヘッダ出力処理用フラグ */
	private boolean booHeaderOutputFlg = false;
	
	/** 割賦支払回数(一括)*/
	private static final String KAP_PAY_CNT_1 = "1";
	
	/** 割賦支払回数(24回払い)*/
	private static final String KAP_PAY_CNT_24 = "24";
	
	/** 割賦支払回数(36回払い)*/
	private static final String KAP_PAY_CNT_36 = "36";
	
	/** 割賦支払回数(23ヵ月後+末日)*/
	private static final int KAP_PAY_AFTER_23 = 23;
	
	/** 割賦支払回数(35ヵ月後+末日)*/
	private static final int KAP_PAY_AFTER_35 = 35;

	
	/** 調査対象区分*/
	private static final String CHO_NAIYO_KBN_01 = "割賦契約中でオプション契約なし・割賦割引あり";
	private static final String CHO_NAIYO_KBN_02 = "割賦契約中でオプション非課金・割賦割引あり";
	private static final String CHO_NAIYO_KBN_03 = "割賦契約中でオプション課金中・割賦割引なし";
	private static final String CHO_NAIYO_KBN_04 = "割賦プラン不一致";
	private static final String CHO_NAIYO_KBN_05 = "割賦割引適用期間不正";
	private static final String CHO_NAIYO_KBN_06 = "割賦契約非課金・割賦割引あり";
	private static final String CHO_NAIYO_KBN_07 = "オプション複数契約あり";
	
	/** SQLエイリアス*/
	private static final String KK0341_KKTK_SVC_KEI_NO = "KK0341_KKTK_SVC_KEI_NO";
	private static final String KK0341_SVC_CHRG_STAYMD = "KK0341_SVC_CHRG_STAYMD";
	private static final String KK0341_SVC_CHRG_ENDYMD = "KK0341_SVC_CHRG_ENDYMD";
	private static final String KK2541_ADD_UNYO_YMD = "KK2541_ADD_UNYO_YMD";
	private static final String KK2541_ADD_TRN_ID = "KK2541_ADD_TRN_ID";
	private static final String KK2541_UPD_UNYO_YMD = "KK2541_UPD_UNYO_YMD";
	private static final String KK2541_UPD_TRN_ID = "KK2541_UPD_TRN_ID";
	private static final String KK2541_DEL_UNYO_YMD = "KK2541_DEL_UNYO_YMD";
	private static final String KK2541_DEL_TRN_ID = "KK2541_DEL_TRN_ID";
	private static final String KK0481_KKTK_SVC_KEI_NO = "KK0481_KKTK_SVC_KEI_NO";
	private static final String KK0451_SVC_CHRG_STAYMD = "KK0451_SVC_CHRG_STAYMD";
	private static final String KK0451_SVC_CHRG_ENDYMD = "KK0451_SVC_CHRG_ENDYMD";
	private static final String KK0451_ADD_UNYO_YMD = "KK0451_ADD_UNYO_YMD";
	private static final String KK0451_ADD_TRN_ID = "KK0451_ADD_TRN_ID";
	private static final String KK0451_UPD_UNYO_YMD = "KK0451_UPD_UNYO_YMD";
	private static final String KK0451_UPD_TRN_ID = "KK0451_UPD_TRN_ID";
	private static final String KK0451_DEL_UNYO_YMD = "KK0451_DEL_UNYO_YMD";
	private static final String KK0451_DEL_TRN_ID = "KK0451_DEL_TRN_ID";
	
	/**
	 * 初期処理
	 * @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);
		db_KK_T_OP_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_OP_SVC_KEI);
		db_KK_M_WRSV_APLY_JKN = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_M_WRSV_APLY_JKN);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
// ST4-2014-0000038 ADD START
		try{
// ST4-2014-0000038 ADD END
		// 出力共通電文を生成
		JBSbatOutputItem outputBean = new JBSbatOutputItem();

		// 割賦契約検証結果ファイル用入出力インターフェイスオブジェクトを生成
		JBSbatServiceInterfaceMap outmap = new JBSbatServiceInterfaceMap();

		// 入力レコードに異常があった場合
		if (inMap.isInputErrorFlg()){
			// 業務エラーログ出力
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EKKB0040CW, new String[] {});
			// エラーフラグ設定
			super.commonItem.setErrFlg(true);
			return null;
		}

		// 割賦契約/機器提供サービス/割賦プランレコードセット
		JBSbatCommonDBInterface resultKapKei = null;
		// オプションサービス契約レコードセット
		JBSbatCommonDBInterface resultOpSvcKei = null;
		// 割引サービス適用条件レコードセット
		JBSbatCommonDBInterface resultWrsvAplyJkn = null;
// ST4-2014-0000038 DEL START
//		// ※初回のみ行う
//		if (!booHeaderOutputFlg)
//		{
//			// 入力レコードが無い場合、空ファイルを出力する
//			if (inMap == null){
//				super.commonItem.getOutPutFile().write("");
//
//			}else {
//				// ヘッダーを設定
//				outputBean.addOutMapList(getOutputHeaderData());
//			}
//			booHeaderOutputFlg = true;
//		}
//
// ST4-2014-0000038 DEL END		
		// 割賦契約/機器提供サービス/割賦プラン/割引サービス契約(割賦割引)を取得する
		Object[] setParamKapKei ={
				this.opeDate,this.opeDate,this.opeDate,inMap.getString(KVIFM033_SVC_KEI_NO)
				,this.opeDate,this.opeDate,this.opeDate,this.opeDate,this.opeDate
		};
		this.executeKK_T_KAP_KEI_KV_SELECT_003(setParamKapKei);
		resultKapKei = this.db_KK_T_KAP_KEI.selectNext();
		
		// 空ファイルを出力するためにマップをクリアする。
		if (resultKapKei == null){
			outputBean.clearOutMapList();
			return outputBean;
// ST4-2014-0000038 ADD START
		}else{
			// レコードが取得できた初回のみ行う
			if(!booHeaderOutputFlg){
				// ヘッダーを設定
				outputBean.addOutMapList(getOutputHeaderData());
			}
			booHeaderOutputFlg = true;
// ST4-2014-0000038 ADD END
		}

		// オプションサービス契約の件数を取得
		int opSvcKeiCnt = getOpSvcKeiCnt(inMap,resultOpSvcKei);
		// オプションサービス契約が複数件取得できた場合"TRUE"とする
		boolean opSvcKeiCntFlg = false;
		if(opSvcKeiCnt >= 2){
			opSvcKeiCntFlg = true;
		}
		
		while(resultKapKei != null){

			// オプションサービス契約を取得する
			Object[] setParamOoSvcKei ={
					this.opeDate,inMap.getString(KVIFM033_SVC_KEI_NO)
			};
			this.executeKK_T_OP_SVC_KEI_KV_SELECT_017(setParamOoSvcKei);
			
			boolean opSvcKeiiEscFlg = false;
			while(!opSvcKeiiEscFlg || opSvcKeiCnt > 0){
				opSvcKeiiEscFlg = true;
				
				resultOpSvcKei = this.db_KK_T_OP_SVC_KEI.selectNext();

				// 割引サービスコードを取得
				String wribSvcCd = resultKapKei.getString(JBSbatKK_T_WRIB_SVC_KEI.WRIB_SVC_CD);
				if(wribSvcCd == null){
					wribSvcCd = "";
				}
				
				// 割引サービス適用条件を取得する
				Object[] setWrsvAplyJkn ={
						this.opeDate,this.opeDate,wribSvcCd
				};
				this.executeKK_M_WRSV_APLY_JKN_KV_SELECT_003(setWrsvAplyJkn);
				resultWrsvAplyJkn = this.db_KK_M_WRSV_APLY_JKN.selectNext();
				
				boolean wribSvcJkn4CntFlg = false;
				if(resultWrsvAplyJkn != null){
					// 割引サービス契約適用上限値４の件数を取得する
					int wribSvcJkn4Cnt = getWribSvcJkn4Cnt(resultWrsvAplyJkn,wribSvcCd);
					// 割引サービス契約適用上限値４が複数件取得できた場合"TRUE"とする
					if(wribSvcJkn4Cnt >= 2){
						wribSvcJkn4CntFlg = true;
					}
				}else{
					// 割引サービス契約適用上限値４が取得できなかった場合"TRUE"とする
					wribSvcJkn4CntFlg = true;
				}
				// チェック
				outputBean = keiKnshoCheck(inMap,outputBean,outmap,resultKapKei,resultOpSvcKei,resultWrsvAplyJkn,opSvcKeiCntFlg,wribSvcJkn4CntFlg);
				
				// while用インデックス
				opSvcKeiCnt--;
			}
			resultKapKei = this.db_KK_T_KAP_KEI.selectNext();
		}
		return outputBean;
// ST4-2014-0000038 ADD START
		}catch(Exception e){
			return null;
		}
// ST4-2014-0000038 ADD END
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_T_KAP_KEI.close();
		db_KK_T_OP_SVC_KEI.close();
		db_KK_M_WRSV_APLY_JKN.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * SQLKEY(KV_SELECT_003)で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_KV_SELECT_003(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_KV_SELECT_003);
	}

	/**
	 * SQLKEY(KV_SELECT_017)で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_OP_SVC_KEI_KV_SELECT_017(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_T_OP_SVC_KEI.selectBySqlDefine(paramList, KK_T_OP_SVC_KEI_KV_SELECT_017);
	}

	/**
	 * SQLKEY(KV_SELECT_003)で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_WRSV_APLY_JKN_KV_SELECT_003(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_KK_M_WRSV_APLY_JKN.selectBySqlDefine(paramList, KK_M_WRSV_APLY_JKN_KV_SELECT_003);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * ファイル出力レコード取得 (割賦契約検証結果ファイル ヘッダー部)
	 * 
	 * @return              レコードオブジェクト
	 * @throws Exception    各種エラー
	 */
	private JBSbatServiceInterfaceMap getOutputHeaderData() throws Exception
	{
		// 割賦契約検証結果ファイル用入出力インターフェイスオブジェクトを生成
		JBSbatServiceInterfaceMap outmap = new JBSbatServiceInterfaceMap();

		// 01.サービス契約番号
		outmap.setString(JBSbatKVIFM038.SVC_KEI_NO,"サービス契約番号");
		// 02.料金グループコード
		outmap.setString(JBSbatKVIFM038.PRC_GRP_CD,"料金グループコード");
		// 03.機器提供サービス契約番号
		outmap.setString(JBSbatKVIFM038.KKTK_SVC_KEI_NO,"機器提供サービス契約番号");
		// 04.オプションサービス契約番号
		outmap.setString(JBSbatKVIFM038.OP_SVC_KEI_NO,"オプションサービス契約番号");
		// 05.割引サービス契約番号
		outmap.setString(JBSbatKVIFM038.WRIB_SVC_KEI_NO,"割引サービス契約番号");
		// 06.割賦契約番号
		outmap.setString(JBSbatKVIFM038.KAP_KEI_NO,"割賦契約番号");
		// 07.割賦契約ステータス
		outmap.setString(JBSbatKVIFM038.KAP_KEI_STAT,"割賦契約ステータス");
		// 08.割賦プランコード
		outmap.setString(JBSbatKVIFM038.KAP_PLAN_CD,"割賦プランコード");
		// 09.割賦支払い回数
		outmap.setString(JBSbatKVIFM038.KAP_PAY_CNT,"割賦支払い回数");
		// 10.割賦請求終了年月日
		outmap.setString(JBSbatKVIFM038.KAP_SEIKY_ENDYMD,"割賦請求終了年月日");
		// 11.割賦契約解約年月日
		outmap.setString(JBSbatKVIFM038.KAP_KEI_DSL_YMD,"割賦契約解約年月日");
		// 12.割賦契約キャンセル年月日
		outmap.setString(JBSbatKVIFM038.KAP_KEI_CANCEL_YMD,"割賦契約キャンセル年月日");
		// 13.割賦契約課金開始年月日
		outmap.setString(JBSbatKVIFM038.KAP_KEI_CHRG_STAYMD,"割賦契約課金開始年月日");
		// 14.割賦請求開始年月
		outmap.setString(JBSbatKVIFM038.KAP_SEIKY_STA_YM,"割賦請求開始年月");
		// 15.割賦支払い残回数
		outmap.setString(JBSbatKVIFM038.KAP_PAY_ZAN_CNT,"割賦支払い残回数");
		// 16.機器提供サービス契約ステータス
		outmap.setString(JBSbatKVIFM038.KKTK_SVC_KEI_STAT,"機器提供サービス契約ステータス");
		// 17.機器サービス課金開始年月日
		outmap.setString(JBSbatKVIFM038.KK_SVC_CHRG_STAYMD,"機器サービス課金開始年月日");
		// 18.機器サービス課金終了年月日
		outmap.setString(JBSbatKVIFM038.KK_SVC_CHRG_ENDYMD,"機器サービス課金終了年月日");
		// 19.宅内機器型式コード
		outmap.setString(JBSbatKVIFM038.TAKNKIKI_MODEL_CD,"宅内機器型式コード");
		// 20.オプションサービス契約ステータス
		outmap.setString(JBSbatKVIFM038.OP_SVC_KEI_STAT,"オプションサービス契約ステータス");
		// 21.オプションサービス課金開始年月日
		outmap.setString(JBSbatKVIFM038.OP_SVC_CHRG_STAYMD,"オプションサービス課金開始年月日");
		// 22.オプションサービス課金終了年月日
		outmap.setString(JBSbatKVIFM038.OP_SVC_CHRG_ENDYMD,"オプションサービス課金終了年月日");
		// 23.割引サービス課金開始年月日
		outmap.setString(JBSbatKVIFM038.WRIB_SVC_CHRG_STAYMD,"割引サービス課金開始年月日");
		// 24.割引サービス課金終了年月日
		outmap.setString(JBSbatKVIFM038.WRIB_SVC_CHRG_ENDYMD,"割引サービス課金終了年月日");
		// 25.割引サービスコード
		outmap.setString(JBSbatKVIFM038.WRIB_SVC_CD,"割引サービスコード");
		// 26.割引サービス適用条件（割賦プラン）
		outmap.setString(JBSbatKVIFM038.WRSV_APLY_JKN,"割引サービス適用条件（割賦プラン）");
		// 27.ＳＹＳＩＤ
		outmap.setString(JBSbatKVIFM038.SYSID,"ＳＹＳＩＤ");
		// 28.調査内容
		outmap.setString(JBSbatKVIFM038.TYOSA_NAIYO,"調査内容");
		// 29.割賦契約登録運用年月日
		outmap.setString(JBSbatKVIFM038.KAP_KEI_ADD_UNYO_YMD,"割賦契約登録運用年月日");
		// 30.割賦契約登録処理ＩＤ
		outmap.setString(JBSbatKVIFM038.KAP_KEI_ADD_TRN_ID,"割賦契約登録処理ＩＤ");
		// 31.割賦契約更新運用年月日
		outmap.setString(JBSbatKVIFM038.KAP_KEI_UPD_UNYO_YMD,"割賦契約更新運用年月日");
		// 32.割賦契約更新処理ＩＤ
		outmap.setString(JBSbatKVIFM038.KAP_KEI_UPD_TRN_ID,"割賦契約更新処理ＩＤ");
		// 33.割賦契約削除運用年月日
		outmap.setString(JBSbatKVIFM038.KAP_KEI_DEL_UNYO_YMD,"割賦契約削除運用年月日");
		// 34.割賦契約削除処理ＩＤ
		outmap.setString(JBSbatKVIFM038.KAP_KEI_DEL_TRN_ID,"割賦契約削除処理ＩＤ");
		// 35.オプション登録運用年月日
		outmap.setString(JBSbatKVIFM038.OP_ADD_UNYO_YMD,"オプション登録運用年月日");
		// 36.オプション登録処理ＩＤ
		outmap.setString(JBSbatKVIFM038.OP_ADD_TRN_ID,"オプション登録処理ＩＤ");
		// 37.オプション更新運用年月日
		outmap.setString(JBSbatKVIFM038.OP_UPD_UNYO_YMD,"オプション更新運用年月日");
		// 38.オプション更新処理ＩＤ
		outmap.setString(JBSbatKVIFM038.OP_UPD_TRN_ID,"オプション更新処理ＩＤ");
		// 39.オプション削除運用年月日
		outmap.setString(JBSbatKVIFM038.OP_DEL_UNYO_YMD,"オプション削除運用年月日");
		// 40.オプション削除処理ＩＤ
		outmap.setString(JBSbatKVIFM038.OP_DEL_TRN_ID,"オプション削除処理ＩＤ");
		// 41.割賦割引登録運用年月日
		outmap.setString(JBSbatKVIFM038.KAP_WRIB_ADD_UNYO_YMD,"割賦割引登録運用年月日");
		// 42.割賦割引登録処理ＩＤ
		outmap.setString(JBSbatKVIFM038.KAP_WRIB_ADD_TRN_ID,"割賦割引登録処理ＩＤ");
		// 43.割賦割引更新運用年月日
		outmap.setString(JBSbatKVIFM038.KAP_WRIB_UPD_UNYO_YMD,"割賦割引更新運用年月日");
		// 44.割賦割引更新処理ＩＤ
		outmap.setString(JBSbatKVIFM038.KAP_WRIB_UPD_TRN_ID,"割賦割引更新処理ＩＤ");
		// 45.割賦割引削除運用年月日
		outmap.setString(JBSbatKVIFM038.KAP_WRIB_DEL_UNYO_YMD,"割賦割引削除運用年月日");
		// 46.割賦割引削除処理ＩＤ
		outmap.setString(JBSbatKVIFM038.KAP_WRIB_DEL_TRN_ID,"割賦割引削除処理ＩＤ");

		// 出力フラグを設定
		outmap.setOutFlg(true);
		return outmap;
	}
	
	/**
	 * ファイル出力レコード取得 (割賦契約検証結果ファイル 明細部)
	 * @param inMap
	 * @param kresultKktkSvcKei
	 * @param resultOpSvcKei
	 * @param chosaNaiyoKbn
	 * @return
	 * @throws Exception
	 */
	private JBSbatServiceInterfaceMap getOutputDetailData(
			JBSbatServiceInterfaceMap inMap
			,JBSbatCommonDBInterface resultKapKei
			,JBSbatCommonDBInterface resultOpSvcKei
			,String wrsvAplyJknValue4
			,String chosaNaiyoKbn
			) throws Exception
	{
		// 割賦契約検証結果ファイル用入出力インターフェイスオブジェクトを生成
		JBSbatServiceInterfaceMap outmap = new JBSbatServiceInterfaceMap();

		// 入力電文(当日異動情報_ALLのレコードセット)から値を設定する。
		// 01.サービス契約番号
		outmap.setString(JBSbatKVIFM038.SVC_KEI_NO, inMap.getString(JBSbatKVIFM038.SVC_KEI_NO));
		// 02.料金グループコード
		outmap.setString(JBSbatKVIFM038.PRC_GRP_CD, inMap.getString(JBSbatKVIFM038.PRC_GRP_CD));
		
		// *** 機器提供サービス ***
		// 03.機器提供サービス契約番号
		outmap.setString(JBSbatKVIFM038.KKTK_SVC_KEI_NO,resultKapKei.getString(KK0341_KKTK_SVC_KEI_NO));
		// 16.機器提供サービス契約ステータス
		outmap.setString(JBSbatKVIFM038.KKTK_SVC_KEI_STAT,resultKapKei.getString(JBSbatKK_T_KKTK_SVC_KEI.KKTK_SVC_KEI_STAT));
		// 17.機器サービス課金開始年月日
		outmap.setString(JBSbatKVIFM038.KK_SVC_CHRG_STAYMD,resultKapKei.getString(KK0341_SVC_CHRG_STAYMD));
		// 18.機器サービス課金終了年月日
		outmap.setString(JBSbatKVIFM038.KK_SVC_CHRG_ENDYMD,resultKapKei.getString(KK0341_SVC_CHRG_ENDYMD));
		// 19.宅内機器型式コード
		outmap.setString(JBSbatKVIFM038.TAKNKIKI_MODEL_CD,resultKapKei.getString(JBSbatKK_T_KKTK_SVC_KEI.TAKNKIKI_MODEL_CD));
		// 27.ＳＹＳＩＤ
		outmap.setString(JBSbatKVIFM038.SYSID,resultKapKei.getString(JBSbatKK_T_KKTK_SVC_KEI.SYSID));
		
		// *** 割賦契約 ***
		// 06.割賦契約番号
		outmap.setString(JBSbatKVIFM038.KAP_KEI_NO,resultKapKei.getString(JBSbatKK_T_KAP_KEI.KAP_KEI_NO));
		// 07.割賦契約ステータス
		outmap.setString(JBSbatKVIFM038.KAP_KEI_STAT,resultKapKei.getString(JBSbatKK_T_KAP_KEI.KAP_KEI_STAT));
		// 08.割賦プランコード
		outmap.setString(JBSbatKVIFM038.KAP_PLAN_CD,resultKapKei.getString(JBSbatKK_T_KAP_KEI.KAP_PLAN_CD));
		// 10.割賦請求終了年月日
		outmap.setString(JBSbatKVIFM038.KAP_SEIKY_ENDYMD,resultKapKei.getString(JBSbatKK_T_KAP_KEI.KAP_SEIKY_ENDYMD));
		// 11.割賦契約解約年月日
		outmap.setString(JBSbatKVIFM038.KAP_KEI_DSL_YMD,resultKapKei.getString(JBSbatKK_T_KAP_KEI.KAP_KEI_DSL_YMD));
		// 12.割賦契約キャンセル年月日
		outmap.setString(JBSbatKVIFM038.KAP_KEI_CANCEL_YMD,resultKapKei.getString(JBSbatKK_T_KAP_KEI.KAP_KEI_CANCEL_YMD));
		// 13.割賦契約課金開始年月日
		outmap.setString(JBSbatKVIFM038.KAP_KEI_CHRG_STAYMD,resultKapKei.getString(JBSbatKK_T_KAP_KEI.KAP_KEI_CHRG_STAYMD));
		// 14.割賦請求開始年月
		outmap.setString(JBSbatKVIFM038.KAP_SEIKY_STA_YM,resultKapKei.getString(JBSbatKK_T_KAP_KEI.KAP_SEIKY_STA_YM));
		// 15.割賦支払い残回数
		outmap.setString(JBSbatKVIFM038.KAP_PAY_ZAN_CNT,resultKapKei.getString(JBSbatKK_T_KAP_KEI.KAP_PAY_ZAN_CNT));
		// 29.割賦契約登録運用年月日
		outmap.setString(JBSbatKVIFM038.KAP_KEI_ADD_UNYO_YMD,resultKapKei.getString(KK2541_ADD_UNYO_YMD));
		// 30.割賦契約登録処理ＩＤ
		outmap.setString(JBSbatKVIFM038.KAP_KEI_ADD_TRN_ID,resultKapKei.getString(KK2541_ADD_TRN_ID));
		// 31.割賦契約更新運用年月日
		outmap.setString(JBSbatKVIFM038.KAP_KEI_UPD_UNYO_YMD,resultKapKei.getString(KK2541_UPD_UNYO_YMD));
		// 32.割賦契約更新処理ＩＤ
		outmap.setString(JBSbatKVIFM038.KAP_KEI_UPD_TRN_ID,resultKapKei.getString(KK2541_UPD_TRN_ID));
		// 33.割賦契約削除運用年月日
		outmap.setString(JBSbatKVIFM038.KAP_KEI_DEL_UNYO_YMD,resultKapKei.getString(KK2541_DEL_UNYO_YMD));
		// 34.割賦契約削除処理ＩＤ
		outmap.setString(JBSbatKVIFM038.KAP_KEI_DEL_TRN_ID,resultKapKei.getString(KK2541_DEL_TRN_ID));
		
		// *** 割賦プラン ***
		// 09.割賦支払い回数
		outmap.setString(JBSbatKVIFM038.KAP_PAY_CNT,resultKapKei.getString(JBSbatKK_M_KAP_PLAN.KAP_PAY_CNT));
		
		// *** 割引サービス契約 ***
		// 05.割引サービス契約番号
		outmap.setString(JBSbatKVIFM038.WRIB_SVC_KEI_NO,resultKapKei.getString(JBSbatKK_T_WRIB_SVC_KEI.WRIB_SVC_KEI_NO));
		// 23.割引サービス課金開始年月日
		outmap.setString(JBSbatKVIFM038.WRIB_SVC_CHRG_STAYMD,resultKapKei.getString(KK0451_SVC_CHRG_STAYMD));
		// 24.割引サービス課金終了年月日
		outmap.setString(JBSbatKVIFM038.WRIB_SVC_CHRG_ENDYMD,resultKapKei.getString(KK0451_SVC_CHRG_ENDYMD));
		// 25.割引サービスコード
		outmap.setString(JBSbatKVIFM038.WRIB_SVC_CD,resultKapKei.getString(JBSbatKK_T_WRIB_SVC_KEI.WRIB_SVC_CD));
		// 41.割賦割引登録運用年月日
		outmap.setString(JBSbatKVIFM038.KAP_WRIB_ADD_UNYO_YMD,resultKapKei.getString(KK0451_ADD_UNYO_YMD));
		// 42.割賦割引登録処理ＩＤ
		outmap.setString(JBSbatKVIFM038.KAP_WRIB_ADD_TRN_ID,resultKapKei.getString(KK0451_ADD_TRN_ID));
		// 43.割賦割引更新運用年月日
		outmap.setString(JBSbatKVIFM038.KAP_WRIB_UPD_UNYO_YMD,resultKapKei.getString(KK0451_UPD_UNYO_YMD));
		// 44.割賦割引更新処理ＩＤ
		outmap.setString(JBSbatKVIFM038.KAP_WRIB_UPD_TRN_ID,resultKapKei.getString(KK0451_UPD_TRN_ID));
		// 45.割賦割引削除運用年月日
		outmap.setString(JBSbatKVIFM038.KAP_WRIB_DEL_UNYO_YMD,resultKapKei.getString(KK0451_DEL_UNYO_YMD));
		// 46.割賦割引削除処理ＩＤ
		outmap.setString(JBSbatKVIFM038.KAP_WRIB_DEL_TRN_ID,resultKapKei.getString(KK0451_DEL_TRN_ID));
		
		if(resultOpSvcKei != null){
			// *** オプションサービス ***
			// 04.オプションサービス契約番号
			outmap.setString(JBSbatKVIFM038.OP_SVC_KEI_NO,resultOpSvcKei.getString(JBSbatKK_T_OP_SVC_KEI.OP_SVC_KEI_NO));
			// 20.オプションサービス契約ステータス
			outmap.setString(JBSbatKVIFM038.OP_SVC_KEI_STAT,resultOpSvcKei.getString(JBSbatKK_T_OP_SVC_KEI.OP_SVC_KEI_STAT));
			// 21.オプションサービス課金開始年月日
			outmap.setString(JBSbatKVIFM038.OP_SVC_CHRG_STAYMD,resultOpSvcKei.getString(JBSbatKK_T_OP_SVC_KEI.SVC_CHRG_STAYMD));
			// 22.オプションサービス課金終了年月日
			outmap.setString(JBSbatKVIFM038.OP_SVC_CHRG_ENDYMD,resultOpSvcKei.getString(JBSbatKK_T_OP_SVC_KEI.SVC_CHRG_ENDYMD));
			// 35.オプション登録運用年月日
			outmap.setString(JBSbatKVIFM038.OP_ADD_UNYO_YMD,resultOpSvcKei.getString(JBSbatKK_T_OP_SVC_KEI.ADD_UNYO_YMD));
			// 36.オプション登録処理ＩＤ
			outmap.setString(JBSbatKVIFM038.OP_ADD_TRN_ID,resultOpSvcKei.getString(JBSbatKK_T_OP_SVC_KEI.ADD_TRN_ID));
			// 37.オプション更新運用年月日
			outmap.setString(JBSbatKVIFM038.OP_UPD_UNYO_YMD,resultOpSvcKei.getString(JBSbatKK_T_OP_SVC_KEI.UPD_UNYO_YMD));
			// 38.オプション更新処理ＩＤ
			outmap.setString(JBSbatKVIFM038.OP_UPD_TRN_ID,resultOpSvcKei.getString(JBSbatKK_T_OP_SVC_KEI.UPD_TRN_ID));
			// 39.オプション削除運用年月日
			outmap.setString(JBSbatKVIFM038.OP_DEL_UNYO_YMD,resultOpSvcKei.getString(JBSbatKK_T_OP_SVC_KEI.DEL_UNYO_YMD));
			// 40.オプション削除処理ＩＤ
			outmap.setString(JBSbatKVIFM038.OP_DEL_TRN_ID,resultOpSvcKei.getString(JBSbatKK_T_OP_SVC_KEI.DEL_TRN_ID));
		}
		
		if(!wrsvAplyJknValue4.equals("")){
			// 26.割引サービス適用条件（割賦プラン）
			outmap.set(JBSbatKVIFM038.WRSV_APLY_JKN,wrsvAplyJknValue4);
		}
		// 28.調査内容区分
		outmap.setString(JBSbatKVIFM038.TYOSA_NAIYO, chosaNaiyoKbn);

		// 出力フラグを設定
		outmap.setOutFlg(true);
		return outmap;
	}
	
	/**
	 * 調査内容を検証する
	 * @param inMap             共通電文
	 * @param outputBean        出力共通電文
	 * @param outmap            割賦契約検証結果ファイル用入出力インターフェイス
	 * @param kapKei            割賦契約/機器提供サービスコード/割賦プラン
	 * @param opSvcKei          オプションサービス契約
	 * @param wribSvcKei        割引サービス契約
	 * @param opSvcKeiCntFlg    オプションサービス契約複数件フラグ
	 * @param wribSvcJkn4CntFlg 割引サービス適用条件値４フラグ
	 * @return
	 */
	private JBSbatOutputItem keiKnshoCheck(JBSbatServiceInterfaceMap inMap,JBSbatOutputItem outputBean,JBSbatServiceInterfaceMap outmap
			,JBSbatCommonDBInterface kapKei,JBSbatCommonDBInterface opSvcKei,JBSbatCommonDBInterface wrsvAplyJkn
			,boolean opSvcKeiCntFlg,boolean wribSvcJkn4CntFlg
			)throws Exception
			{
		// ***判定用設定値を定義 ***
// 20140613 ADD-START
		String kapKei_kapKeiChrgStaymd = "";
		String kapKei_kapSeikyEndymd = "";
// 20140613 ADD-END
		String opSvcKei_kapKeiStat = "";
		String opSvcKei_SvcChrgStaymd = "";
		String opSvcKei_SvcChrgEndymd = "";
		String wribSvcKei_SvcChrgStaymd = "";
		String wribSvcKei_SvcChrgEndymd = "";
		String wribSvcKei_kapKeiStat = "";
		String wribSvcKei_WribSvcCd = "";
		String kapPlan_KaPayCnt = "";
		String wribsJkn_WribSvcCd = "";
		String wribsJkn_WrsvAplyJknValue4 = "";
		// 割賦契約.割賦契約課金開始年月日
// 20140613 MOD-START
//		String kapKei_kapKeiChrgStaymd = kapKei.getString(JBSbatKK_T_KAP_KEI.KAP_KEI_CHRG_STAYMD);
		if(!isBlank(kapKei.getString(JBSbatKK_T_KAP_KEI.KAP_KEI_CHRG_STAYMD))){
			kapKei_kapKeiChrgStaymd = kapKei.getString(JBSbatKK_T_KAP_KEI.KAP_KEI_CHRG_STAYMD);
		}
// 20140613 MOD-END
		// 割賦契約.割賦契約ステータス
		String kapKei_kapKeiStat = kapKei.getString(JBSbatKK_T_KAP_KEI.KAP_KEI_STAT);
		// 割賦契約.割賦プランコード
		String kapKei_kapPlanCd = kapKei.getString(JBSbatKK_T_KAP_KEI.KAP_PLAN_CD);
		// 割賦契約.割賦請求終了年月日
// 20140613 MOD-START
//		String kapKei_kapSeikyEndymd = kapKei.getString(JBSbatKK_T_KAP_KEI.KAP_SEIKY_ENDYMD);
		if(!isBlank(kapKei.getString(JBSbatKK_T_KAP_KEI.KAP_SEIKY_ENDYMD))){
			kapKei_kapSeikyEndymd = kapKei.getString(JBSbatKK_T_KAP_KEI.KAP_SEIKY_ENDYMD);
		}
// 20140613 MOD-END
		// 割賦契約(割引プラン).割賦支払回数
// 20140613 MOD-START
//		kapPlan_KaPayCnt = kapKei.getString(JBSbatKK_M_KAP_PLAN.KAP_PAY_CNT);
		if(!isBlank( kapKei.getString(JBSbatKK_M_KAP_PLAN.KAP_PAY_CNT))){
			kapPlan_KaPayCnt = kapKei.getString(JBSbatKK_M_KAP_PLAN.KAP_PAY_CNT);
		}
// 20140613 MOD-END
		if(!isBlank(kapKei.getString(KK0481_KKTK_SVC_KEI_NO))){
		// 割引サービス契約.サービス課金開始年月日
// 20140613 MOD-START
//		wribSvcKei_SvcChrgStaymd = kapKei.getString(KK0451_SVC_CHRG_STAYMD);
			if(!isBlank(kapKei.getString(KK0451_SVC_CHRG_STAYMD))){
				wribSvcKei_SvcChrgStaymd = kapKei.getString(KK0451_SVC_CHRG_STAYMD);
			}
// 20140613 MOD-END
		// 割引サービス契約.サービス課金終了年月日
// 20140613 MOD-START
//		wribSvcKei_SvcChrgEndymd = kapKei.getString(KK0451_SVC_CHRG_ENDYMD);
			if(!isBlank(kapKei.getString(KK0451_SVC_CHRG_ENDYMD))){
				wribSvcKei_SvcChrgEndymd = kapKei.getString(KK0451_SVC_CHRG_ENDYMD);
			}
// 20140613 MOD-END
		// 割引サービス契約.割引サービス契約ステータス
		wribSvcKei_kapKeiStat = kapKei.getString(JBSbatKK_T_WRIB_SVC_KEI.WRIB_SVC_KEI_STAT);
		// 割引サービス契約.割引サービスコード
		wribSvcKei_WribSvcCd = kapKei.getString(JBSbatKK_T_WRIB_SVC_KEI.WRIB_SVC_CD);
		}
		if (opSvcKei != null){
			// オプションサービス契約.オプションサービス契約ステータス
			opSvcKei_kapKeiStat = opSvcKei.getString(JBSbatKK_T_OP_SVC_KEI.OP_SVC_KEI_STAT);
			// オプションサービス契約.サービス課金開始年月日
// 20140613 MOD-START
//			opSvcKei_SvcChrgStaymd = opSvcKei.getString(JBSbatKK_T_OP_SVC_KEI.SVC_CHRG_STAYMD);
			if(!isBlank(opSvcKei.getString(JBSbatKK_T_OP_SVC_KEI.SVC_CHRG_STAYMD))){
				opSvcKei_SvcChrgStaymd = opSvcKei.getString(JBSbatKK_T_OP_SVC_KEI.SVC_CHRG_STAYMD);
			}
// 20140613 MOD-END
			// オプションサービス契約.サービス課金終了年月日
// 20140613 MOD-START
//			opSvcKei_SvcChrgEndymd = opSvcKei.getString(JBSbatKK_T_OP_SVC_KEI.SVC_CHRG_ENDYMD);
			if(!isBlank(opSvcKei.getString(JBSbatKK_T_OP_SVC_KEI.SVC_CHRG_ENDYMD))){
				opSvcKei_SvcChrgEndymd = opSvcKei.getString(JBSbatKK_T_OP_SVC_KEI.SVC_CHRG_ENDYMD);
			}
// 20140613 MOD-END
		}
		if(wrsvAplyJkn != null){
			// 割引サービス適用条件.割引サービスコード
			wribsJkn_WribSvcCd = wrsvAplyJkn.getString(JBSbatKK_M_WRSV_APLY_JKN.WRIB_SVC_CD);
			if(wribSvcJkn4CntFlg){
				//　割引サービス適用条件値4(割賦プラン)が複数取得できた場合は未設定
				wribsJkn_WrsvAplyJknValue4 = "";
			}else{
				// 割引サービス適用条件.割引サービス適用条件値4(割賦プラン)
// 20140613 MOD-START
//				wribsJkn_WrsvAplyJknValue4 = wrsvAplyJkn.getString(JBSbatKK_M_WRSV_APLY_JKN.WRSV_APLY_JKN_VALUE_4);
				if(!isBlank(wrsvAplyJkn.getString(JBSbatKK_M_WRSV_APLY_JKN.WRSV_APLY_JKN_VALUE_4))){
					wribsJkn_WrsvAplyJknValue4 = wrsvAplyJkn.getString(JBSbatKK_M_WRSV_APLY_JKN.WRSV_APLY_JKN_VALUE_4);
				}

// 20140613 MOD-END
			}
		}
		
		//******************************************
		// オプションサービスが複数件取得できた場合
		//******************************************
		if(opSvcKeiCntFlg){
			// ファイル出力 (割賦契約検証結果ファイル 明細部)
			outmap = this.getOutputDetailData(
					inMap
					,kapKei
					,opSvcKei
					,wribsJkn_WrsvAplyJknValue4
					,CHO_NAIYO_KBN_07);
			outputBean.addOutMapList(outmap);
			return outputBean;
		}

		//*****************************
		// @)割賦契約期間中のチェック
		//*****************************
		if( !SVC_KEI_STAT_KANRYOZU.equals(kapKei_kapKeiStat)
				&& !SVC_KEI_STAT_KAIYAKU.equals(kapKei_kapKeiStat)
				&& !SVC_KEI_STAT_CANCEL.equals(kapKei_kapKeiStat)
// IT1-2014-0000224 ADD START
				&& !isBlank(kapKei_kapKeiChrgStaymd)
// IT1-2014-0000224 ADD END
				&& kapKei_kapKeiChrgStaymd.compareTo(this.opeDate) <= 0)
		{
			// *** @オプションサービス契約なしで、割賦割引適用中の場合 ***
			if(opSvcKei == null
// IT1-2014-0000224 ADD START
					&& !isBlank(wribSvcKei_SvcChrgStaymd)
// IT1-2014-0000224 ADD END
					&& wribSvcKei_SvcChrgStaymd.compareTo(this.opeDate) <= 0
					&& wribSvcKei_SvcChrgEndymd.compareTo(this.opeDate) >= 0
					)
			{
				// ファイル出力 (割賦契約検証結果ファイル 明細部)
				outmap = this.getOutputDetailData(
						inMap
						,kapKei
						,opSvcKei
						,wribsJkn_WrsvAplyJknValue4
						,CHO_NAIYO_KBN_01);
				outputBean.addOutMapList(outmap);
				return outputBean;
			}
			// *** Aオプションサービスが課金対象外で、割賦割引適用中の場合 ***
			if(OP_SVC_KEI_STAT_SVCTYU.equals(opSvcKei_kapKeiStat)
					&& (opSvcKei_SvcChrgStaymd.compareTo(this.opeDate) > 0
// IT1-2014-0000224 MOD START
//							|| opSvcKei_SvcChrgEndymd.compareTo(this.opeDate) < 0 )
							|| (!isBlank(opSvcKei_SvcChrgEndymd) 
									&& opSvcKei_SvcChrgEndymd.compareTo(this.opeDate) < 0))
// IT1-2014-0000224 MOD END
					&& !WRIB_SVC_KEI_STAT_CANCEL.equals(wribSvcKei_kapKeiStat)
// IT1-2014-0000224 ADD START
					&& !isBlank(wribSvcKei_SvcChrgStaymd)
// IT1-2014-0000224 ADD END
					&& wribSvcKei_SvcChrgStaymd.compareTo(this.opeDate) <= 0
					&& wribSvcKei_SvcChrgEndymd.compareTo(this.opeDate) >= 0
					)
			{
				// ファイル出力 (割賦契約検証結果ファイル 明細部)
				outmap = this.getOutputDetailData(
						inMap
						,kapKei
						,opSvcKei
						,wribsJkn_WrsvAplyJknValue4
						,CHO_NAIYO_KBN_02);
				outputBean.addOutMapList(outmap);
				return outputBean;
			}
			// *** Bオプションサービスが課金中で、割賦割引非適用中の場合 ***
			if(OP_SVC_KEI_STAT_SVCTYU.equals(opSvcKei_kapKeiStat)
// IT1-2014-0000224 ADD START
					&& !isBlank(opSvcKei_SvcChrgStaymd)
// IT1-2014-0000224 ADD END
					&& opSvcKei_SvcChrgStaymd.compareTo(this.opeDate) <= 0
					&& opSvcKei_SvcChrgEndymd.compareTo(this.opeDate) >= 0
					&& (kapKei.getString(KK0481_KKTK_SVC_KEI_NO) == null
							|| wribSvcKei_SvcChrgStaymd.compareTo(this.opeDate) > 0
// IT1-2014-0000224 MOD START
//							|| wribSvcKei_SvcChrgEndymd.compareTo(this.opeDate) < 0
							||(!isBlank(wribSvcKei_SvcChrgEndymd) 
									&& wribSvcKei_SvcChrgEndymd.compareTo(this.opeDate) < 0)
// IT1-2014-0000224 MOD END
							)
			)
			{
				// ファイル出力 (割賦契約検証結果ファイル 明細部)
				outmap = this.getOutputDetailData(
						inMap
						,kapKei
						,opSvcKei
						,wribsJkn_WrsvAplyJknValue4
						,CHO_NAIYO_KBN_03);
				outputBean.addOutMapList(outmap);
				return outputBean;
			}
			// *** C.D割賦割引適用中***
			if(!WRIB_SVC_KEI_STAT_CANCEL.equals(wribSvcKei_kapKeiStat)
// IT1-2014-0000224 ADD START
					&& !isBlank(wribSvcKei_SvcChrgStaymd)
// IT1-2014-0000224 ADD END
					&& wribSvcKei_SvcChrgStaymd.compareTo(this.opeDate) <= 0
					&& wribSvcKei_SvcChrgEndymd.compareTo(this.opeDate) >= 0){
				
				// *** C割賦契約と割賦割引で割賦プランが一致しない場合 ***
				if(wribSvcKei_WribSvcCd.equals(wribsJkn_WribSvcCd)
						&& !kapKei_kapPlanCd.equals(wribsJkn_WrsvAplyJknValue4)){
					
					// ファイル出力 (割賦契約検証結果ファイル 明細部)
					outmap = this.getOutputDetailData(
							inMap
							,kapKei
							,opSvcKei
							,wribsJkn_WrsvAplyJknValue4
							,CHO_NAIYO_KBN_04);
					outputBean.addOutMapList(outmap);
					return outputBean;
				}
				// *** D割賦契約の支払回数に応じた割賦契約割引適用期間となっていない場合 ***
				if(!wribSvcKei_SvcChrgStaymd.equals(getLateDate(kapKei_kapKeiChrgStaymd, opSvcKei_SvcChrgStaymd))
						||((KAP_PAY_CNT_1.equals(kapPlan_KaPayCnt)|| KAP_PAY_CNT_24.equals(kapPlan_KaPayCnt)
// IT1-2014-0000220 MOD START
//								)&& wribSvcKei_SvcChrgEndymd.equals(getDate(wribSvcKei_SvcChrgStaymd,KAP_PAY_AFTER_23)))
								)&& !wribSvcKei_SvcChrgEndymd.equals(getDate(wribSvcKei_SvcChrgStaymd,KAP_PAY_AFTER_23)))
// IT1-2014-0000220 MOD END
						||(KAP_PAY_CNT_36.equals(kapPlan_KaPayCnt)
// IT1-2014-0000220 MOD START
//								&& wribSvcKei_SvcChrgEndymd.equals(getDate(wribSvcKei_SvcChrgStaymd,KAP_PAY_AFTER_35)))
								&& !wribSvcKei_SvcChrgEndymd.equals(getDate(wribSvcKei_SvcChrgStaymd,KAP_PAY_AFTER_35)))
// IT1-2014-0000220 MOD END
				)
				{
					// ファイル出力 (割賦契約検証結果ファイル 明細部)
					outmap = this.getOutputDetailData(
							inMap
							,kapKei
							,opSvcKei
							,wribsJkn_WrsvAplyJknValue4
							,CHO_NAIYO_KBN_05);
					outputBean.addOutMapList(outmap);
					return outputBean;
				}
			}
			
		//***************************************
		// A)割賦契約課金期間外の場合のチェック
		//***************************************
		}
// IT1-2014-0000224 MOD START
//		if(kapKei_kapSeikyEndymd.compareTo(this.opeDate) < 0
		if((!isBlank(kapKei_kapSeikyEndymd)
				&& kapKei_kapSeikyEndymd.compareTo(this.opeDate) < 0)
// IT1-2014-0000224 MOD END
				|| kapKei_kapKeiChrgStaymd.compareTo(this.opeDate) > 0){
			
			// *** @割賦割引適用中の場合 ***
			if(!WRIB_SVC_KEI_STAT_CANCEL.equals(wribSvcKei_kapKeiStat)
// IT1-2014-0000224 ADD START
					&& !isBlank(wribSvcKei_SvcChrgStaymd)
// IT1-2014-0000224 ADD END
					&& wribSvcKei_SvcChrgStaymd.compareTo(this.opeDate) <= 0
					&& wribSvcKei_SvcChrgEndymd.compareTo(this.opeDate) >= 0
					)
			{
				// ファイル出力 (割賦契約検証結果ファイル 明細部)
				outmap = this.getOutputDetailData(
						inMap
						,kapKei
						,opSvcKei
						,wribsJkn_WrsvAplyJknValue4
						,CHO_NAIYO_KBN_06);
				outputBean.addOutMapList(outmap);
				return outputBean;
				}
		}
		return outputBean;
	}
	
	/**
	 * 日付を比較し遅いほうの日付を返却する
	 * @param str1 比較日付１
	 * @param str2 比較日付２
	 * @throws Exception
	 */
	private String getLateDate(String str1 ,String str2) throws Exception
	{
		if(str1.compareTo(str2) >= 0){
			return str1;
		}
		else{
			return str2;
		}
	}
	
	/**
	 * Ｎヵ月後(年月)+Ｎヵ月後の末日(日)を取得する
	 * @param ymd 加算元日付
	 * @param num Ｎヵ月後
	 * @return Ｎヵ月後(年月)+Ｎヵ月後の末日(日)
	 * @throws Exception
	 */
	private String getDate(String ymd ,int num) throws Exception
	{
		// Nヶ月後の日付(YYYYMM)
		String date1 = JBSbatDateUtil.adjustMonth(ymd, num).substring(0,6);
		// Nヵ月後の末日(DD)
		String date2 = JBSbatDateUtil.getEndOfMonth(date1);
		// (YYYYMMDD)
		return date1 + date2;
	}
	
	/**
	 * 空文字の判定
	 * @param  val オブジェクト
	 * @return 判定結果(true:空文字である、false:空文字でない)
	 * @throws Exception 各種エラー
	 */
	private boolean isBlank(String val) throws Exception
	{
		if (val == null || "".equals(val))
		{
			return true;
		}
		return false;
	}
	
	/**
	 * オプションサービス契約の件数を取得
	 * @param inMap
	 * @param resultOpSvcKei
	 * @return 件数
	 * @throws Exception
	 */
	private int getOpSvcKeiCnt(
			JBSbatServiceInterfaceMap inMap
			,JBSbatCommonDBInterface resultOpSvcKei) throws Exception
	{			
		ArrayList<JBSbatCommonDBInterface> opSvcKeiList = new ArrayList<JBSbatCommonDBInterface>();
		
		// オプションサービス契約を取得する
		Object[] setParamOoSvcKei ={this.opeDate,inMap.getString(KVIFM033_SVC_KEI_NO)};
		this.executeKK_T_OP_SVC_KEI_KV_SELECT_017(setParamOoSvcKei);
		resultOpSvcKei = this.db_KK_T_OP_SVC_KEI.selectNext();
		
		while(resultOpSvcKei !=null){
			resultOpSvcKei = this.db_KK_T_OP_SVC_KEI.selectNext();
			opSvcKeiList.add(resultOpSvcKei);
			}
		return opSvcKeiList.size();
	}
	
	/**
	 * 割引サービス適用条件値４の件数を取得
	 * @param inMap
	 * @param resultOpSvcKei
	 * @return 件数
	 * @throws Exception
	 */
	private int getWribSvcJkn4Cnt(
			JBSbatCommonDBInterface resultWrsvAplyJkn,String wribSvcCd) throws Exception
	{			
		ArrayList<String> wribSvcJkn4List = new ArrayList<String>();
		
		// 割引サービス適用条件を取得する
		Object[] setWrsvAplyJkn ={
				this.opeDate,this.opeDate,wribSvcCd
		};
		this.executeKK_M_WRSV_APLY_JKN_KV_SELECT_003(setWrsvAplyJkn);
		resultWrsvAplyJkn = this.db_KK_M_WRSV_APLY_JKN.selectNext();
		
		while(resultWrsvAplyJkn != null){
			if(!isBlank(resultWrsvAplyJkn.getString(JBSbatKK_M_WRSV_APLY_JKN.WRSV_APLY_JKN_VALUE_4))){
				wribSvcJkn4List.add(resultWrsvAplyJkn.getString(JBSbatKK_M_WRSV_APLY_JKN.WRSV_APLY_JKN_VALUE_4));
			}
			resultWrsvAplyJkn = this.db_KK_M_WRSV_APLY_JKN.selectNext();
		}
		return wribSvcJkn4List.size();
	}

}
