/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKVCheckSeikyOptChrgKikan
*	ソースファイル名	：JBSbatKVCheckSeikyOptChrgKikan.java
*	作成者				：富士通　
*	作成日				：2014年05月22日
*＜機能概要＞
*　契約異動検証＿請求オプション課金期間チェック部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v9.00.00	2014/05/22   富士通		新規作成
*   v9.00.01	2014/06/25   乾		    ST4-2014-0000038
*   v9.00.02	2014/07/08   米田	    OM-2014-0002432
*   v9.00.03	2014/07/20   米田	    OM-2014-0002432
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;

import eo.business.common.JBSbatBusinessService;
import eo.business.common.JBSbatKKConst;
import eo.business.util.file.JBSbatKVIFM039;
import eo.business.util.table.JBSbatCH_M_PRC_SCHDL_TEIGI;
import eo.business.util.table.JBSbatKK_T_SEIKY_KEI;
import eo.business.util.table.JBSbatKK_T_SEIOPSVC_KEI;
import eo.business.util.table.JBSbatKK_T_SVC_KEI;
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;

public class JBSbatKVCheckSeikyOptChrgKikan extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(料金スケジュール定義) */
	private static final String D_TBL_NAME_CH_M_PRC_SCHDL_TEIGI = "CH_M_PRC_SCHDL_TEIGI";
	/** テーブル(請求オプションサービス契約) */
	private static final String D_TBL_NAME_KK_T_SEIOPSVC_KEI = "KK_T_SEIOPSVC_KEI";
	/** テーブル(請求契約) */
	private static final String D_TBL_NAME_KK_T_SEIKY_KEI = "KK_T_SEIKY_KEI";
	/** テーブル(サービス契約) */
	private static final String D_TBL_NAME_KK_T_SVC_KEI = "KK_T_SVC_KEI";

	/** SQL定義キー(CH_SELECT_003) */
	private static final String CH_M_PRC_SCHDL_TEIGI_KV_SELECT_003 = "KV_SELECT_003";
	/** SQL定義キー(KV_SELECT_003) */
	private static final String KK_T_SEIOPSVC_KEI_KV_SELECT_003 = "KV_SELECT_003";
	/** SQL定義キー(KV_SELECT_001) */
	private static final String KK_T_SEIKY_KEI_KV_SELECT_001 = "KV_SELECT_001";
	/** SQL定義キー(KV_SELECT_024) */
	private static final String KK_T_SVC_KEI_KV_SELECT_024 = "KV_SELECT_024";
	/** SQL定義キー(KV_SELECT_025) */
	private static final String KK_T_SVC_KEI_KV_SELECT_025 = "KV_SELECT_025";
	
	/** テーブルアクセスクラス(料金スケジュール定義) */
	private JBSbatSQLAccess db_CH_M_PRC_SCHDL_TEIGI = null;
	/** テーブルアクセスクラス(請求オプションサービス契約) */
	private JBSbatSQLAccess db_KK_T_SEIOPSVC_KEI = null;
	/** テーブルアクセスクラス(請求契約) */
	private JBSbatSQLAccess db_KK_T_SEIKY_KEI = null;
	/** テーブルアクセスクラス(サービス契約) */
	private JBSbatSQLAccess db_KK_T_SVC_KEI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 調査内容区分メッセージ(DB不整合・請求契約なし) */
	private static final String MSG_CHOSA_NAIYO_KBN_01 = "ＤＢ不整合・請求契約なし";
	/** 調査内容区分メッセージ(請求オプション課金中・請求書発行非希望) */
	private static final String MSG_CHOSA_NAIYO_KBN_02 = "請求オプション課金中・請求書発行非希望";
	/** 調査内容区分メッセージ(請求オプション課金中・ネット系サービスなし) */
	private static final String MSG_CHOSA_NAIYO_KBN_03 = "請求オプション課金中・ネット系サービスなし";
	/** 調査内容区分メッセージ(請求オプション課金期間外・ネット系サービスあり・請求書発行希望) */
	private static final String MSG_CHOSA_NAIYO_KBN_04 = "請求オプション課金期間外・ネット系サービスあり・請求書発行希望";
	/** 調査内容区分メッセージ(無料期間に請求オプションが課金中) */
	private static final String MSG_CHOSA_NAIYO_KBN_05 = "無料期間に請求オプションが課金中";
	/** 調査内容区分メッセージ(無料期間終了後に請求オプションが非課金) */
	private static final String MSG_CHOSA_NAIYO_KBN_06 = "無料期間終了後に請求オプションが非課金";
	/** 調査内容区分メッセージ(請求オプション重複課金) */
	private static final String MSG_CHOSA_NAIYO_KBN_07 = "請求オプション重複課金";
	/** 調査内容区分メッセージ(調査対象データなし) */
	private static final String MSG_CHOSA_NAIYO_KBN_08 = "調査対象データなし";

	/** イベントコード(料金計算日) */
	private static final String PRC_CALC_DATE = "03";

	/** 要否(否)*/
	private static final String YH_HI = "0";
	/** 要否(要)*/
	private static final String YH_YO = "1";

	/** サービス契約ステータス(サービス提供中)*/
	private static final String SVC_KEI_STAT_TEIKYO = "100";
// 2014/07/08 OM-2014-0002432 ADD START
	/** サービス契約ステータス(休止・中断中)*/
	private static final String SVC_KEI_STAT_KYUSHI_CHUDAN = "210";
	/** サービス契約ステータス(停止中)*/
	private static final String SVC_KEI_STAT_TEISHI = "220";
// 2014/07/08 OM-2014-0002432 ADD END
	/** サービス契約ステータス(解約済)*/
	private static final String SVC_KEI_STAT_KAIYAKU = "910";
	/** サービス契約ステータス(キャンゼル済)*/
	private static final String SVC_KEI_STAT_CANCEL = "920";

	/** 請求オプションサービス契約ステータス(請求契約中) */
	private static final String SEIOPSVC_KEI_STAT_SEIKYU = "100";

	/** 異動区分(新規契約) */
	private static final String IDO_DIV_NEW = "00001";

	/** 日付の初期値 */
	private static final String DEFAULT_DATE = JBSbatKKConst.S_MAX_DATE;

	/** ヘッダ出力処理用フラグ */
	private boolean booHeaderOutputFlg = false;

// 2014/07/08 OM-2014-0002432 ADD START
	/** 請求年月 */
	private String seikyYm = null;

	/** 計算期間初日 */
	private String calcKikanStartDate = null;

	/** 計算期間末日 */
	private String calcKikanEndDate = null;
	
	/** 請求年月取得フラグ */
	private boolean booSeikyYmGetFlg = false;
// 2014/07/08 OM-2014-0002432 ADD END

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
		/** ▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼ */
		/** ▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼ */
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CH_M_PRC_SCHDL_TEIGI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_SCHDL_TEIGI);
		db_KK_T_SEIOPSVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SEIOPSVC_KEI);
		db_KK_T_SEIKY_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SEIKY_KEI);
		db_KK_T_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_SVC_KEI);
		/** ▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲ */
		/** ▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲ */
	}

	/**
	 * 主処理
	 * @param inMap　入力電文 (請求オプションサービスのレコードセット)
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
// ST4-2014-0000038 ADD START
		try{
// ST4-2014-0000038 ADD END
		// 請求契約レコードセット
		JBSbatCommonDBInterface resultSeiky = null;

		// サービス契約レコードセット
		JBSbatCommonDBInterface resultSvc = null;

		// サービス契約レコードセット(1レコード目のみ)
		JBSbatCommonDBInterface recSvc = null;

		// 請求オプション課金期間チェック結果ファイル用入出力インターフェイスオブジェクトを生成
		JBSbatServiceInterfaceMap mapKVIFM039 = new JBSbatServiceInterfaceMap();

		// 出力共通電文を生成する。
		JBSbatOutputItem outputBean = new JBSbatOutputItem();

		// 課金期間中フラグ
		boolean kakinKikanFlg = false;

// 2014/07/08 OM-2014-0002432 DEL START
//		// 請求年月
//		String seikyYm = null;
//
//		// 計算期間初日
//		String calcKikanStartDate = null;
//
//		// 計算期間末日
//		String calcKikanEndDate = null;
// 2014/07/08 OM-2014-0002432 DEL END

		// ファイル出力 (請求オプション課金期間チェック結果ファイル ヘッダー部
		// ※初回のみ行う
		if (!booHeaderOutputFlg)
		{
			// ファイル出力 (請求オプション課金期間チェック結果ファイル ヘッダー部)
			mapKVIFM039 = this.getOutputHeaderData();
			outputBean.addOutMapList(mapKVIFM039);
			booHeaderOutputFlg = true;
		}

		// 請求オプションサービス契約_サービス課金開始年月日
		String seiop_svcChrgStaYmd = inMap.getString(JBSbatKK_T_SEIOPSVC_KEI.SVC_CHRG_STAYMD);

		// 請求オプションサービス契約_サービス課金終了年月日
		String seiop_svcChrgEndYmd = inMap.getString(JBSbatKK_T_SEIOPSVC_KEI.SVC_CHRG_ENDYMD);

		//******************************************************
		// (A) 夜間バッチ運用日時点での料金計算対象の年月を取得
		//******************************************************
// 2014/07/08 OM-2014-0002432 ADD START
		// ※初回のみ行う
		if (!booSeikyYmGetFlg)
		{
// 2014/07/08 OM-2014-0002432 ADD END
		//「料金スケジュール定義」のイベントコードに「03:料金計算日」を指定し、
		// イベント年月日が夜間バッチ運用日の直近となるレコードの請求年月を取得する。
		Object[] setParamPrc = {PRC_CALC_DATE, this.opeDate};
		this.executeCH_M_PRC_SCHDL_TEIGI_KV_SELECT_003(setParamPrc);
		JBSbatCommonDBInterface resultPrc = this.db_CH_M_PRC_SCHDL_TEIGI.selectNext();
		if (resultPrc != null)
		{
			seikyYm = resultPrc.getString(JBSbatCH_M_PRC_SCHDL_TEIGI.SEIKY_YM);
		}
		else
		{
			// レコードが取得できなかった場合は処理を終了する。
			// ※基本的には該当するレコードは存在する。
			return outputBean;
		}

		// 請求年月から計算期間初日を取得する。
		calcKikanStartDate = seikyYm + "01";

		// 請求年月から計算期間末日を取得する。
		calcKikanEndDate = seikyYm + JBSbatDateUtil.getEndOfMonth(seikyYm);
// 2014/07/08 OM-2014-0002432 ADD START
		booSeikyYmGetFlg = true;
		}
// 2014/07/08 OM-2014-0002432 ADD END

		//********************************
		// (B).(a) 課金対象／対象外の判定
		//********************************
		// 課金期間中かどうかを判定する。
		if (SEIOPSVC_KEI_STAT_SEIKYU.equals(inMap.getString(JBSbatKK_T_SEIOPSVC_KEI.SEIOPSVC_KEI_STAT)) &&
			!isBlank(seiop_svcChrgStaYmd) &&
			!isBlank(seiop_svcChrgEndYmd) &&
			seiop_svcChrgStaYmd.compareTo(calcKikanStartDate) <= 0 &&
			seiop_svcChrgEndYmd.compareTo(calcKikanEndDate) >= 0)
		{
			kakinKikanFlg = true;
		}
		else
		{
			kakinKikanFlg = false;
		}

		//************************
		// (B).(b) 請求契約の取得
		//************************
		// 請求オプションサービスに紐付く請求契約を取得する。
		Object[] setParamSeiky = 
			{inMap.getString(JBSbatKK_T_SEIOPSVC_KEI.SEIKY_KEI_NO), this.opeDate};
		this.executeKK_T_SEIKY_KEI_KV_SELECT_001(setParamSeiky);
		resultSeiky = this.db_KK_T_SEIKY_KEI.selectNext();

		// 請求契約が取得できない場合は、調査内容を「DB不整合・請求契約なし」として
		// チェック結果を出力する。
		if (resultSeiky == null)
		{
			// ファイル出力 (請求オプション課金期間チェック結果ファイル 明細部)
			mapKVIFM039 = this.getOutputDetailData(inMap, null, null, MSG_CHOSA_NAIYO_KBN_01);
			outputBean.addOutMapList(mapKVIFM039);
			return outputBean;
		}

		//**************************************
		// (B).(c) サービス契約(ネット系)の取得
		//**************************************
		// 請求契約番号をもとに「課金先」より同一請求契約番号に紐付くネット系サービスの
		// サービス契約を取得する。
		Object[] setParamSvc = {this.opeDate, this.opeDate, this.opeDate,
				resultSeiky.getString(JBSbatKK_T_SEIKY_KEI.SEIKY_KEI_NO)};
		this.executeKK_T_SVC_KEI_KV_SELECT_024(setParamSvc);
		resultSvc = this.db_KK_T_SVC_KEI.selectNext();

		// 取得したサービス契約情報をリストへ一時保持
		ArrayList<JBSbatCommonDBInterface> svcList = new ArrayList<JBSbatCommonDBInterface>();
		while(resultSvc != null)
		{
			svcList.add(resultSvc);
			resultSvc = this.db_KK_T_SVC_KEI.selectNext();
		}

		// サービス契約情報の1レコード目を取得
		if (svcList.size() > 0)
		{
			recSvc = svcList.get(0);
// 2014/07/08 OM-2014-0002432 ADD START
			// サービス契約ステータスが以下のコード以外のレコードを取得する。
			//・解約済
			//・キャンセル済み
			for(JBSbatCommonDBInterface svcMap : svcList)
			{
				if (!SVC_KEI_STAT_KAIYAKU.equals(svcMap.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_STAT)) &&
					!SVC_KEI_STAT_CANCEL.equals(svcMap.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_STAT)))
				{
					recSvc = svcMap;
					break;
				}
			}
// 2014/07/08 OM-2014-0002432 ADD END
		}

		//********************************************************
		// (B).(d) 請求書発行要否／ネット系サービスの存在チェック
		//********************************************************
		// 課金期間中かどうかで処理を切り分ける。
		if (kakinKikanFlg)
		{
			//-----------------------------
			// 課金期間中 (料金計算の対象)
			//-----------------------------
			// 請求書発行要否の判定
			if (YH_HI.equals(resultSeiky.getString(JBSbatKK_T_SEIKY_KEI.SEIKYUS_HAKKO_YH)))
			{
				//--------------------------------
				// 請求書発行要否が「0:否」の場合
				//--------------------------------
				// 調査内容を「請求オプション課金中・請求書発行非希望」として、
				// チェック結果を出力する。
				mapKVIFM039 = this.getOutputDetailData(
						inMap, resultSeiky, recSvc, MSG_CHOSA_NAIYO_KBN_02);
				outputBean.addOutMapList(mapKVIFM039);
				return outputBean;
			}
			else
			{
				//--------------------------------
				// 請求書発行要否が「1:要」の場合
				//--------------------------------
				// サービス契約が存在するかの判定
				if (svcList.size() == 0)
				{
					//------------------------------
					// サービス契約が存在しない場合
					//------------------------------
					// 調査内容を「請求オプション課金中・ネット系サービスなし」として、
					// チェック結果を出力する。
					mapKVIFM039 = this.getOutputDetailData(
							inMap, resultSeiky, null, MSG_CHOSA_NAIYO_KBN_03);
					outputBean.addOutMapList(mapKVIFM039);
					return outputBean;
				}
				else
				{
					//----------------------------
					// サービス契約が存在する場合
					//----------------------------
					boolean kaiyakuCancelFlg = true;
					
					// サービス契約ステータスに以下のコードのみが存在するかを判定する。
					// ・910:解約済
					// ・920:キャンセル済
					for(JBSbatCommonDBInterface svcMap : svcList)
					{
						if (!SVC_KEI_STAT_KAIYAKU.equals(svcMap.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_STAT)) &&
							!SVC_KEI_STAT_CANCEL.equals(svcMap.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_STAT)))
						{
							kaiyakuCancelFlg = false;
							break;
						}
					}
					if (kaiyakuCancelFlg)
					{
						// サービス契約ステータスが「解約済」「キャンセル済」のみ存在する場合は、
						// 調査内容を「請求オプション課金中・ネット系サービスなし」として、
						// チェック結果を出力する。
						mapKVIFM039 = this.getOutputDetailData(
								inMap, resultSeiky, recSvc, MSG_CHOSA_NAIYO_KBN_03);
						outputBean.addOutMapList(mapKVIFM039);
						return outputBean;
					}
				}
			}
		}

		//******************************************************
		// (B).(e) ネット系サービス課金開始時の無料期間チェック
		//******************************************************
		// 請求書発行要否の判定
		if (YH_YO.equals(resultSeiky.getString(JBSbatKK_T_SEIKY_KEI.SEIKYUS_HAKKO_YH)))
		{
			//----------------------------------------------------------
			// 請求書発行要否が「1:要」の場合のみ無料期間チェックを行う
			//----------------------------------------------------------
			// 初回請求月
			String firstSeikyYm = resultSeiky.getString(JBSbatKK_T_SEIKY_KEI.FIRST_SEIKY_YM);

			// サービス契約_サービス課金開始年月日
			String svc_svcChrgStaYmd = null;
// 2014/07/08 OM-2014-0002432 ADD START
			// サービス契約_サービス開始年月日
			String svc_svcStaYmd = null;
// 2014/07/08 OM-2014-0002432 ADD START
			if (recSvc != null)
			{
				svc_svcChrgStaYmd = recSvc.getString(JBSbatKK_T_SVC_KEI.SVC_CHRG_STAYMD);
// 2014/07/08 OM-2014-0002432 ADD START
				svc_svcStaYmd = recSvc.getString(JBSbatKK_T_SVC_KEI.SVC_STA_YMD);
// 2014/07/08 OM-2014-0002432 ADD END
			}

			// 異動区分
			String idoDiv = null;

			// サービス契約の異動区分を取得する。
			// ※世代登録年月日時分秒が最小のレコードが対象。
			if (recSvc != null)
			{
				Object[] setParamIdo = {recSvc.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_NO)};
				this.executeKK_T_SVC_KEI_KV_SELECT_025(setParamIdo);
				JBSbatCommonDBInterface resultIdo = this.db_KK_T_SVC_KEI.selectNext();
				if (resultIdo != null)
				{
					idoDiv = resultIdo.getString(JBSbatKK_T_SVC_KEI.IDO_DIV);
				}
			}

			// 課金期間中かどうかで処理を切り分ける。
			if (kakinKikanFlg)
			{
				//--------------------------------------------------------------
				// (B).(e).(i) 請求オプションが課金期間中(料金計算の対象)の場合
				//--------------------------------------------------------------
// 2014/07/08 OM-2014-0002432 ADD START
				// 当月から課金開始となる請求オプションサービス契約(※1)をチェック対象とする(以外はチェック対象外)。
				// (※1)請求オプションサービス契約.サービス課金開始年月日(年月)＝料金スケジュール定義.請求年月
				if (seiop_svcChrgStaYmd.substring(0,6).equals(seikyYm))
				{
// 2014/07/08 OM-2014-0002432 ADD END
				// 以下の何れかのオブジェクトが初期値もしくは未設定かどうかを判定する。
				// ・サービス契約_サービス課金開始年月日
				if (isBlank(svc_svcChrgStaYmd) || DEFAULT_DATE.equals(svc_svcChrgStaYmd))
				{
					// 上記の何れかのオブジェクトが初期値もしくは未設定の場合は、
					// 調査内容を「無料期間に請求オプションが課金中」として、
					// チェック結果を出力する。
					mapKVIFM039 = this.getOutputDetailData(
							inMap, resultSeiky, recSvc, MSG_CHOSA_NAIYO_KBN_05);
					outputBean.addOutMapList(mapKVIFM039);
					return outputBean;
				}
				else
				{
					// 初回請求月 と サービス契約_サービス課金開始年月日(年月) の大小判定
// 2014/07/08 OM-2014-0002432 MOD START
//					if (!isBlank(firstSeikyYm) &&
//						firstSeikyYm.compareTo(svc_svcChrgStaYmd.substring(0,6)) > 0)
					if (!isBlank(firstSeikyYm) &&
						firstSeikyYm.compareTo(svc_svcChrgStaYmd.substring(0,6)) >= 0)
// 2014/07/08 OM-2014-0002432 MOD END
					{
						//-------------------------------------------------------------
						// 初回請求月(設定あり) ＞ サービス課金開始年月日(年月) の場合
						//-------------------------------------------------------------
						// 初回請求月＋4ヵ月後の年月の01日 を取得
						String adjust4MonthDate = JBSbatDateUtil.adjustMonth(firstSeikyYm + "01", 4);

						// 請求オプションサービス契約_サービス課金開始年月日 と
						// 初回請求月＋4ヵ月後の年月の01日 の大小判定
						if (!isBlank(seiop_svcChrgStaYmd) && 
								seiop_svcChrgStaYmd.compareTo(adjust4MonthDate) < 0)
						{
							// 請求オプションサービス契約_サービス課金開始年月日 ＜ 
							// 						初回請求月＋4ヵ月後の年月の01日場合は、
							// 調査内容を「無料期間に請求オプションが課金中」として、
							// チェック結果を出力する。
							mapKVIFM039 = this.getOutputDetailData(
									inMap, resultSeiky, recSvc, MSG_CHOSA_NAIYO_KBN_05);
							outputBean.addOutMapList(mapKVIFM039);
							return outputBean;
						}
					}
					else
					{
						//-------------------------------------------------------------
						// 初回請求月 ≦ サービス課金開始年月日(年月) の場合
						// (初回請求月が未設定の場合も同様)
						//-------------------------------------------------------------
						// 異動区分の判定
						if (IDO_DIV_NEW.equals(idoDiv))
						{
							//------------------------------------
							// 異動区分が「00001:新規契約」の場合
							//------------------------------------
// 2014/07/08 OM-2014-0002432 MOD START
//							// サービス契約_サービス課金開始年月日(年月)＋4ヵ月後の01日 を取得
//							String adjust4MonthDate = 
//								JBSbatDateUtil.adjustMonth(svc_svcChrgStaYmd.substring(0, 6) + "01", 4);
							// サービス契約_サービス開始年月日(年月)＋4ヵ月後の01日 を取得
							String adjust4MonthDate = 
								JBSbatDateUtil.adjustMonth(svc_svcStaYmd.substring(0, 6) + "01", 4);
// 2014/07/08 OM-2014-0002432 MOD END
							
							// 請求オプションサービス契約_サービス課金開始年月日 と
							// サービス契約_サービス課金開始年月日(年月)＋4ヵ月後の年月の01日 の大小判定
							if (!isBlank(seiop_svcChrgStaYmd) &&
									seiop_svcChrgStaYmd.compareTo(adjust4MonthDate) < 0)
							{
								// 請求オプションサービス契約_サービス課金開始年月日 ＜ 
								// 		サービス契約_サービス課金開始年月日(年月)＋4ヵ月後の01日 の場合は、
								// 調査内容を「無料期間に請求オプションが課金中」として、
								// チェック結果を出力する。
								mapKVIFM039 = this.getOutputDetailData(
										inMap, resultSeiky, recSvc, MSG_CHOSA_NAIYO_KBN_05);
								outputBean.addOutMapList(mapKVIFM039);
								return outputBean;
							}
						}
						else
						{
							//----------------------------------------
							// 異動区分が「00001:新規契約」以外の場合
							//----------------------------------------
							// サービス契約_サービス課金開始年月日(日) と
							// 計算期間初日(1日) が同じかどうかを判定する。
							if (svc_svcChrgStaYmd.substring(6,8).equals(calcKikanStartDate.substring(6,8)))
							{
								//-------------------------------------------
								// サービス契約_サービス課金開始年月日(日)が
								// 計算期間初日(1日) の場合
								//-------------------------------------------
// 2014/07/08 OM-2014-0002432 MOD START
//								// サービス契約_サービス課金開始年月日(年月)＋4ヵ月後の01日 を取得
//								String adjust4MonthDate = 
//									JBSbatDateUtil.adjustMonth(svc_svcChrgStaYmd.substring(0, 6) + "01", 4);
								// サービス契約_サービス開始年月日(年月)＋4ヵ月後の01日 を取得
								String adjust4MonthDate = 
									JBSbatDateUtil.adjustMonth(svc_svcStaYmd.substring(0, 6) + "01", 4);
// 2014/07/08 OM-2014-0002432 MOD END

								// 請求オプションサービス契約_サービス課金開始年月日 と
								// サービス契約_サービス課金開始年月日(年月)＋4ヵ月後の年月の01日 の大小判定
								if (!isBlank(seiop_svcChrgStaYmd) &&
										seiop_svcChrgStaYmd.compareTo(adjust4MonthDate) < 0)
								{
									// 請求オプションサービス契約_サービス課金開始年月日 ＜ 
									// 		サービス契約_サービス課金開始年月日(年月)＋4ヵ月後の01日 の場合は、
									// 調査内容を「無料期間に請求オプションが課金中」として、
									// チェック結果を出力する。
									mapKVIFM039 = this.getOutputDetailData(
											inMap, resultSeiky, recSvc, MSG_CHOSA_NAIYO_KBN_05);
									outputBean.addOutMapList(mapKVIFM039);
									return outputBean;
								}
							}
							else
							{
								//-------------------------------------------
								// サービス契約_サービス課金開始年月日(日)が
								// 計算期間初日以外(1日以外) の場合
								//-------------------------------------------
// 2014/07/08 OM-2014-0002432 MOD START
//								// サービス契約_サービス課金開始年月日(年月)＋5ヵ月後の年月の01日 を取得
//								String adjust5MonthDate = 
//									JBSbatDateUtil.adjustMonth(svc_svcChrgStaYmd.substring(0, 6) + "01", 5);
								// サービス契約_サービス開始年月日(年月)＋5ヵ月後の年月の01日 を取得
								String adjust5MonthDate = 
									JBSbatDateUtil.adjustMonth(svc_svcStaYmd.substring(0, 6) + "01", 5);
// 2014/07/08 OM-2014-0002432 MOD START

								// 請求オプションサービス契約_サービス課金開始年月日 と
								// サービス契約_サービス課金開始年月日(年月)＋5ヵ月後の年月の01日 の大小判定
								if (!isBlank(seiop_svcChrgStaYmd) &&
										seiop_svcChrgStaYmd.compareTo(adjust5MonthDate) < 0)
								{
									// 請求オプションサービス契約_サービス課金開始年月日 ＜ 
									// 		サービス契約_サービス課金開始年月日(年月)＋5ヵ月後の01日 の場合は、
									// 調査内容を「無料期間に請求オプションが課金中」として、
									// チェック結果を出力する。
									mapKVIFM039 = this.getOutputDetailData(
											inMap, resultSeiky, recSvc, MSG_CHOSA_NAIYO_KBN_05);
									outputBean.addOutMapList(mapKVIFM039);
									return outputBean;
								}
							}
						}
					}
				}
// 2014/07/08 OM-2014-0002432 ADD START
				}
// 2014/07/08 OM-2014-0002432 ADD END
			}
			else
			{
				//-----------------------------------------------------------------
				// (B).(e).(ii) 請求オプションが課金期間外(料金計算の対象外)の場合
				//-----------------------------------------------------------------
// 2014/07/08 OM-2014-0002432 ADD START
				// 請求オプションサービス契約に対して、取得済のネット系サービス契約のサービス契約ステータスが
				// 「サービス提供中」「休止・中断中」「停止中」の何れかである場合のみチェック対象とする。
				if (SVC_KEI_STAT_TEIKYO.equals(recSvc.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_STAT)) ||
					SVC_KEI_STAT_KYUSHI_CHUDAN.equals(recSvc.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_STAT)) ||
					SVC_KEI_STAT_TEISHI.equals(recSvc.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_STAT)))
				{
// 2014/07/08 OM-2014-0002432 ADD END
				// 以下の条件に該当する場合のみは、無料期間チェックを行う
				// ・サービス契約_サービス課金開始年月日に初期値以外の値が設定されている。
				if (!(isBlank(svc_svcChrgStaYmd) || DEFAULT_DATE.equals(svc_svcChrgStaYmd)))
				{
					// 上記の何れのオブジェクトにも初期値以外の値が設定されている場合は、
					// 以降の処理を行う。

					// 初回請求月 と サービス契約_サービス課金開始年月日(年月) の大小判定
// 2014/07/08 OM-2014-0002432 MOD START
//					if (!isBlank(firstSeikyYm) &&
//						firstSeikyYm.compareTo(svc_svcChrgStaYmd.substring(0,6)) > 0)
					if (!isBlank(firstSeikyYm) &&
							firstSeikyYm.compareTo(svc_svcChrgStaYmd.substring(0,6)) >= 0)
// 2014/07/08 OM-2014-0002432 MOD END
					{
						//-------------------------------------------------------------
						// 初回請求月(設定あり) ＞ サービス課金開始年月日(年月) の場合
						//-------------------------------------------------------------
						// 初回請求月＋4ヵ月後の年月の01日 を取得
						String adjust4MonthDate = JBSbatDateUtil.adjustMonth(firstSeikyYm + "01", 4);

						// 初回請求月＋4ヵ月後の年月の01日 と 計算期間初日 の大小判定
						if (adjust4MonthDate.compareTo(calcKikanStartDate) <= 0)
						{
							// 初回請求月＋4ヵ月後の年月の01日 ≦ 計算期間初日 の場合は、
							// 調査内容を「無料期間終了後に請求オプションが非課金」として、
							// チェック結果を出力する。
							mapKVIFM039 = this.getOutputDetailData(
									inMap, resultSeiky, recSvc, MSG_CHOSA_NAIYO_KBN_06);
							outputBean.addOutMapList(mapKVIFM039);
							return outputBean;
						}
					}
					else
					{
						//-------------------------------------------------------------
						// 初回請求月 ≦ サービス課金開始年月日(年月) の場合
						// (初回請求月が未設定の場合も同様)
						//-------------------------------------------------------------
						// 異動区分の判定
						if (IDO_DIV_NEW.equals(idoDiv))
						{
							//------------------------------------
							// 異動区分が「00001:新規契約」の場合
							//------------------------------------
// 2014/07/08 OM-2014-0002432 MOD START
//							// サービス契約_サービス課金開始年月日(年月)＋4ヵ月後の01日 を取得
//							String adjust4MonthDate = 
//								JBSbatDateUtil.adjustMonth(svc_svcChrgStaYmd.substring(0, 6) + "01", 4);
							// サービス契約_サービス開始年月日(年月)＋4ヵ月後の01日 を取得
							String adjust4MonthDate = 
								JBSbatDateUtil.adjustMonth(svc_svcStaYmd.substring(0, 6) + "01", 4);
// 2014/07/08 OM-2014-0002432 MOD END

							// サービス契約_サービス課金開始年月日(年月)＋4ヵ月後の01日 と 
							// 計算期間初日 の大小判定
							if (adjust4MonthDate.compareTo(calcKikanStartDate) <= 0)
							{
								// サービス契約_サービス課金開始年月日(年月)＋4ヵ月後の01日 ≦ 
								// 						計算期間初日 の場合は、
								// 調査内容を「無料期間終了後に請求オプションが非課金」として、
								// チェック結果を出力する。
								mapKVIFM039 = this.getOutputDetailData(
										inMap, resultSeiky, recSvc, MSG_CHOSA_NAIYO_KBN_06);
								outputBean.addOutMapList(mapKVIFM039);
								return outputBean;
							}
						}
						else
						{
							//----------------------------------------
							// 異動区分が「00001:新規契約」以外の場合
							//----------------------------------------
							// サービス契約_サービス課金開始年月日(日) と
							// 計算期間初日(1日) が同じかどうかを判定する。
							if (svc_svcChrgStaYmd.substring(6,8).equals(calcKikanStartDate.substring(6,8)))
							{
								//-------------------------------------------
								// サービス契約_サービス課金開始年月日(日)が
								// 計算期間初日(1日) の場合
								//-------------------------------------------
// 2014/07/08 OM-2014-0002432 MOD START
//								// サービス契約_サービス課金開始年月日(年月)＋4ヵ月後の01日 を取得
//								String adjust4MonthDate = 
//									JBSbatDateUtil.adjustMonth(svc_svcChrgStaYmd.substring(0, 6) + "01", 4);
								// サービス契約_サービス開始年月日(年月)＋4ヵ月後の01日 を取得
								String adjust4MonthDate = 
									JBSbatDateUtil.adjustMonth(svc_svcStaYmd.substring(0, 6) + "01", 4);
// 2014/07/08 OM-2014-0002432 MOD END

								// サービス契約_サービス課金開始年月日(年月)＋4ヵ月後の01日 と 
								// 計算期間初日 の大小判定
								if (adjust4MonthDate.compareTo(calcKikanStartDate) <= 0)
								{
									// サービス契約_サービス課金開始年月日(年月)＋4ヵ月後の年月の01日 ≦
									// 						計算期間初日 の場合は、
									// 調査内容を「無料期間終了後に請求オプションが非課金」として、
									// チェック結果を出力する。
									mapKVIFM039 = this.getOutputDetailData(
											inMap, resultSeiky, recSvc, MSG_CHOSA_NAIYO_KBN_06);
									outputBean.addOutMapList(mapKVIFM039);
									return outputBean;
								}
							}
							else
							{
								//-------------------------------------------
								// サービス契約_サービス課金開始年月日(日)が
								// 計算期間初日以外(1日以外) の場合
								//-------------------------------------------
// 2014/07/08 OM-2014-0002432 MOD START
//								// サービス契約_サービス課金開始年月日(年月)＋5ヵ月後の01日 を取得
//								String adjust5MonthDate = 
//									JBSbatDateUtil.adjustMonth(svc_svcChrgStaYmd.substring(0, 6) + "01", 5);
								// サービス契約_サービス開始年月日(年月)＋5ヵ月後の01日 を取得
								String adjust5MonthDate = 
									JBSbatDateUtil.adjustMonth(svc_svcStaYmd.substring(0, 6) + "01", 5);
// 2014/07/08 OM-2014-0002432 MOD END

								// サービス契約_サービス課金開始年月日(年月)＋5ヵ月後の01日 と 
								// 計算期間初日 の大小判定
								if (adjust5MonthDate.compareTo(calcKikanStartDate) <= 0)
								{
									// サービス契約_サービス課金開始年月日(年月)＋5ヵ月後の01日 ≦ 
									// 						計算期間初日 の場合は、
									// 調査内容を「無料期間終了後に請求オプションが非課金」として、
									// チェック結果を出力する。
									mapKVIFM039 = this.getOutputDetailData(
											inMap, resultSeiky, recSvc, MSG_CHOSA_NAIYO_KBN_06);
									outputBean.addOutMapList(mapKVIFM039);
									return outputBean;
								}
							}
						}
					}
				}
// 2014/07/08 OM-2014-0002432 ADD START
				}
// 2014/07/08 OM-2014-0002432 ADD END
			}
		}

		//************************************
		// (B).(f) 請求オプション重複課金検証
		//************************************
		if (kakinKikanFlg)
		{
			// 請求契約番号に紐付く自分自身以外の請求オプションサービスを取得する。
// 2014/07/08 OM-2014-0002432 MOD START
//			Object[] setParam = {inMap.getString(JBSbatKK_T_SEIOPSVC_KEI.SEIOPSVC_KEI_NO),
//					resultSeiky.getString(JBSbatKK_T_SEIKY_KEI.SEIKY_KEI_NO), this.opeDate};
			Object[] setParam = {inMap.getString(JBSbatKK_T_SEIOPSVC_KEI.SEIOPSVC_KEI_NO),
					resultSeiky.getString(JBSbatKK_T_SEIKY_KEI.SEIKY_KEI_NO), seikyYm, seikyYm, this.opeDate};
// 2014/07/08 OM-2014-0002432 MOD END
			this.executeKK_T_SEIOPSVC_KEI_KV_SELECT_003(setParam);
			JBSbatCommonDBInterface result = this.db_KK_T_SEIOPSVC_KEI.selectNext();

			// 請求オプションサービスが取得できた場合は、
			// 調査内容を「請求オプション重複課金」として、チェック結果を出力する。
			if (result != null)
			{
				// ファイル出力 (請求オプション課金期間チェック結果ファイル 明細部)
				mapKVIFM039 = this.getOutputDetailData(
						inMap, resultSeiky, recSvc, MSG_CHOSA_NAIYO_KBN_07);
				outputBean.addOutMapList(mapKVIFM039);
				return outputBean;
			}
		}

		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_CH_M_PRC_SCHDL_TEIGI.close();
		db_KK_T_SEIOPSVC_KEI.close();
		db_KK_T_SEIKY_KEI.close();
		db_KK_T_SVC_KEI.close();
		/** ▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲ */
		/** ▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲ */
	}

	/**
	 * SQLKEY(CH_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 executeCH_M_PRC_SCHDL_TEIGI_KV_SELECT_003(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_CH_M_PRC_SCHDL_TEIGI.selectBySqlDefine(paramList, CH_M_PRC_SCHDL_TEIGI_KV_SELECT_003);
	}

	/**
	 * 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_SEIOPSVC_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());
// 2014/07/08 OM-2014-0002432 ADD START
		paramList.setValue(param[3].toString());
		paramList.setValue(param[4].toString());
// 2014/07/08 OM-2014-0002432 ADD END

		// DBアクセスを実行します
		db_KK_T_SEIOPSVC_KEI.selectBySqlDefine(paramList, KK_T_SEIOPSVC_KEI_KV_SELECT_003);
	}

	/**
	 * SQLKEY(KV_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_T_SEIKY_KEI_KV_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_T_SEIKY_KEI.selectBySqlDefine(paramList, KK_T_SEIKY_KEI_KV_SELECT_001);
	}

	/**
	 * SQLKEY(KV_SELECT_024)で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_SVC_KEI_KV_SELECT_024(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());

		// DBアクセスを実行します
		db_KK_T_SVC_KEI.selectBySqlDefine(paramList, KK_T_SVC_KEI_KV_SELECT_024);
	}

	/**
	 * SQLKEY(KV_SELECT_025)で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_SVC_KEI_KV_SELECT_025(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());

		// DBアクセスを実行します
		db_KK_T_SVC_KEI.selectBySqlDefine(paramList, KK_T_SVC_KEI_KV_SELECT_025);
	}

	/**
	 * ファイル出力レコード取得 (請求オプション課金期間チェック結果ファイル ヘッダー部)
	 * 
	 * @return              レコードオブジェクト
	 * @throws Exception    各種エラー
	 */
	private JBSbatServiceInterfaceMap getOutputHeaderData() throws Exception
	{
		// 請求オプション課金期間チェック結果ファイル用入出力インターフェイスオブジェクトを生成
		JBSbatServiceInterfaceMap mapKVIFM039 = new JBSbatServiceInterfaceMap();

		// 01.サービス契約番号
		mapKVIFM039.setString(JBSbatKVIFM039.SVC_KEI_NO, "サービス契約番号");
		// 02.SYSID
		mapKVIFM039.setString(JBSbatKVIFM039.SYSID, "SYSID");
		// 03.請求契約番号
		mapKVIFM039.setString(JBSbatKVIFM039.SEIKY_KEI_NO, "請求契約番号");
		// 04.請求オプション契約番号
		mapKVIFM039.setString(JBSbatKVIFM039.SEIOP_KEI_NO, "請求オプション契約番号");
		// 05.請求オプションステータス
		mapKVIFM039.setString(JBSbatKVIFM039.SEIOP_STAT, "請求オプションステータス");
		// 06.オプション課金開始年月日
		mapKVIFM039.setString(JBSbatKVIFM039.OP_CHRG_STAYMD, "オプション課金開始年月日");
		// 07.オプション課金終了年月日
		mapKVIFM039.setString(JBSbatKVIFM039.OP_CHRG_ENDYMD, "オプション課金終了年月日");
		// 08.請求書発行要否
		mapKVIFM039.setString(JBSbatKVIFM039.SEIKYUS_HAKKO_YH, "請求書発行要否");
		// 09.初回請求年月
		mapKVIFM039.setString(JBSbatKVIFM039.FIRST_SEIKY_YM, "初回請求年月");
		// 10.サービス契約ステータス
		mapKVIFM039.setString(JBSbatKVIFM039.SVC_KEI_STAT, "サービス契約ステータス");
// 2014/07/08 OM-2014-0002432 ADD START
		// 10-1.サービス開始日
		mapKVIFM039.setString(JBSbatKVIFM039.SVC_STA_YMD, "サービス開始日");
// 2014/07/08 OM-2014-0002432 ADD END
		// 11.サービス課金開始日
		mapKVIFM039.setString(JBSbatKVIFM039.SVC_CHRG_STAYMD, "サービス課金開始日");
		// 12.サービス課金終了日
		mapKVIFM039.setString(JBSbatKVIFM039.SVC_CHRG_ENDYMD, "サービス課金終了日");
		// 13.調査内容区分
		mapKVIFM039.setString(JBSbatKVIFM039.CHOSA_NAIYO_KBN, "調査内容区分");
		// 14.サービス契約登録運用年月日
		mapKVIFM039.setString(JBSbatKVIFM039.SVC_ADD_UNYO_YMD, "サービス契約登録運用年月日");
		// 15.サービス契約登録処理ID
		mapKVIFM039.setString(JBSbatKVIFM039.SVC_ADD_TRN_ID, "サービス契約登録処理ID");
		// 16.サービス契約更新運用年月日
		mapKVIFM039.setString(JBSbatKVIFM039.SVC_UPD_UNYO_YMD, "サービス契約更新運用年月日");
		// 17.サービス契約更新処理ID
		mapKVIFM039.setString(JBSbatKVIFM039.SVC_UPD_TRN_ID, "サービス契約更新処理ID");
		// 18.サービス契約削除運用年月日
		mapKVIFM039.setString(JBSbatKVIFM039.SVC_DEL_UNYO_YMD, "サービス契約削除運用年月日");
		// 19.サービス契約削除処理ID
		mapKVIFM039.setString(JBSbatKVIFM039.SVC_DEL_TRN_ID, "サービス契約削除処理ID");
		// 20.請求契約登録運用年月日
		mapKVIFM039.setString(JBSbatKVIFM039.SEIKY_ADD_UNYO_YMD, "請求契約登録運用年月日");
		// 21.請求契約登録処理ID
		mapKVIFM039.setString(JBSbatKVIFM039.SEIKY_ADD_TRN_ID, "請求契約登録処理ID");
		// 22.請求契約更新運用年月日
		mapKVIFM039.setString(JBSbatKVIFM039.SEIKY_UPD_UNYO_YMD, "請求契約更新運用年月日");
		// 23.請求契約更新処理ID
		mapKVIFM039.setString(JBSbatKVIFM039.SEIKY_UPD_TRN_ID, "請求契約更新処理ID");
		// 24.請求契約削除運用年月日
		mapKVIFM039.setString(JBSbatKVIFM039.SEIKY_DEL_UNYO_YMD, "請求契約削除運用年月日");
		// 25.請求契約削除処理ID
		mapKVIFM039.setString(JBSbatKVIFM039.SEIKY_DEL_TRN_ID, "請求契約削除処理ID");
		// 26.請求ＯＰ登録運用年月日
		mapKVIFM039.setString(JBSbatKVIFM039.SEIOP_ADD_UNYO_YMD, "請求ＯＰ登録運用年月日");
		// 27.請求ＯＰ契約登録処理ID
		mapKVIFM039.setString(JBSbatKVIFM039.SEIOP_ADD_TRN_ID, "請求ＯＰ登録処理ID");
		// 28.請求ＯＰ契約更新運用年月日
		mapKVIFM039.setString(JBSbatKVIFM039.SEIOP_UPD_UNYO_YMD, "請求ＯＰ更新運用年月日");
		// 29.請求ＯＰ契約更新処理ID
		mapKVIFM039.setString(JBSbatKVIFM039.SEIOP_UPD_TRN_ID, "請求ＯＰ更新処理ID");
		// 30.請求ＯＰ契約削除運用年月日
		mapKVIFM039.setString(JBSbatKVIFM039.SEIOP_DEL_UNYO_YMD, "請求ＯＰ削除運用年月日");
		// 31.請求ＯＰ契約削除処理ID
		mapKVIFM039.setString(JBSbatKVIFM039.SEIOP_DEL_TRN_ID, "請求ＯＰ削除処理ID");

		// 出力フラグを設定
		mapKVIFM039.setOutFlg(true);

		return mapKVIFM039;
	}

	/**
	 * ファイル出力レコード取得 (請求オプション課金期間チェック結果ファイル 明細部)
	 * 
	 * @param inMap         入力電文(請求オプションサービスのレコードセット)
	 * @param resultSeiky   請求契約レコードセット
	 * @param resultSvc     サービス契約レコードセット
	 * @param chosaNaiyoKbn 調査内容区分
	 * @return              レコードオブジェクト
	 * @throws Exception    各種エラー
	 */
	private JBSbatServiceInterfaceMap getOutputDetailData(
			JBSbatServiceInterfaceMap inMap, JBSbatCommonDBInterface resultSeiky,
			JBSbatCommonDBInterface resultSvc, String chosaNaiyoKbn) throws Exception
	{
		// 請求オプション課金期間チェック結果ファイル用入出力インターフェイスオブジェクトを生成
		JBSbatServiceInterfaceMap mapKVIFM039 = new JBSbatServiceInterfaceMap();

		// 入力電文(請求オプションサービスのレコードセット)から値を設定する。
		// 03.請求契約番号
		mapKVIFM039.setString(JBSbatKVIFM039.SEIKY_KEI_NO, inMap.getString(JBSbatKK_T_SEIOPSVC_KEI.SEIKY_KEI_NO));
		// 04.請求オプション契約番号
		mapKVIFM039.setString(JBSbatKVIFM039.SEIOP_KEI_NO, inMap.getString(JBSbatKK_T_SEIOPSVC_KEI.SEIOPSVC_KEI_NO));
		// 05.請求オプションステータス
		mapKVIFM039.setString(JBSbatKVIFM039.SEIOP_STAT, inMap.getString(JBSbatKK_T_SEIOPSVC_KEI.SEIOPSVC_KEI_STAT));
		// 06.オプション課金開始年月日
		mapKVIFM039.setString(JBSbatKVIFM039.OP_CHRG_STAYMD, inMap.getString(JBSbatKK_T_SEIOPSVC_KEI.SVC_CHRG_STAYMD));
		// 07.オプション課金終了年月日
		mapKVIFM039.setString(JBSbatKVIFM039.OP_CHRG_ENDYMD, inMap.getString(JBSbatKK_T_SEIOPSVC_KEI.SVC_CHRG_ENDYMD));
		// 26.請求ＯＰ登録運用年月日
		mapKVIFM039.setString(JBSbatKVIFM039.SEIOP_ADD_UNYO_YMD, inMap.getString(JBSbatKK_T_SEIOPSVC_KEI.ADD_UNYO_YMD));
		// 27.請求ＯＰ契約登録処理ID
		mapKVIFM039.setString(JBSbatKVIFM039.SEIOP_ADD_TRN_ID, inMap.getString(JBSbatKK_T_SEIOPSVC_KEI.ADD_TRN_ID));
		// 28.請求ＯＰ契約更新運用年月日
		mapKVIFM039.setString(JBSbatKVIFM039.SEIOP_UPD_UNYO_YMD, inMap.getString(JBSbatKK_T_SEIOPSVC_KEI.UPD_UNYO_YMD));
		// 29.請求ＯＰ契約更新処理ID
		mapKVIFM039.setString(JBSbatKVIFM039.SEIOP_UPD_TRN_ID, inMap.getString(JBSbatKK_T_SEIOPSVC_KEI.UPD_TRN_ID));
		// 30.請求ＯＰ契約削除運用年月日
		mapKVIFM039.setString(JBSbatKVIFM039.SEIOP_DEL_UNYO_YMD, inMap.getString(JBSbatKK_T_SEIOPSVC_KEI.DEL_UNYO_YMD));
		// 31.請求ＯＰ契約削除処理ID
		mapKVIFM039.setString(JBSbatKVIFM039.SEIOP_DEL_TRN_ID, inMap.getString(JBSbatKK_T_SEIOPSVC_KEI.DEL_TRN_ID));

		// 請求契約レコードセットから値を設定する。
		if (resultSeiky != null)
		{
			// 08.請求書発行要否
			mapKVIFM039.setString(JBSbatKVIFM039.SEIKYUS_HAKKO_YH, resultSeiky.getString(JBSbatKK_T_SEIKY_KEI.SEIKYUS_HAKKO_YH));
			// 09.初回請求年月
			mapKVIFM039.setString(JBSbatKVIFM039.FIRST_SEIKY_YM, resultSeiky.getString(JBSbatKK_T_SEIKY_KEI.FIRST_SEIKY_YM));
			// 20.請求契約登録運用年月日
			mapKVIFM039.setString(JBSbatKVIFM039.SEIKY_ADD_UNYO_YMD, resultSeiky.getString(JBSbatKK_T_SEIKY_KEI.ADD_UNYO_YMD));
			// 21.請求契約登録処理ID
			mapKVIFM039.setString(JBSbatKVIFM039.SEIKY_ADD_TRN_ID, resultSeiky.getString(JBSbatKK_T_SEIKY_KEI.ADD_TRN_ID));
			// 22.請求契約更新運用年月日
			mapKVIFM039.setString(JBSbatKVIFM039.SEIKY_UPD_UNYO_YMD, resultSeiky.getString(JBSbatKK_T_SEIKY_KEI.UPD_UNYO_YMD));
			// 23.請求契約更新処理ID
			mapKVIFM039.setString(JBSbatKVIFM039.SEIKY_UPD_TRN_ID, resultSeiky.getString(JBSbatKK_T_SEIKY_KEI.UPD_TRN_ID));
			// 24.請求契約削除運用年月日
			mapKVIFM039.setString(JBSbatKVIFM039.SEIKY_DEL_UNYO_YMD, resultSeiky.getString(JBSbatKK_T_SEIKY_KEI.DEL_UNYO_YMD));
			// 25.請求契約削除処理ID
			mapKVIFM039.setString(JBSbatKVIFM039.SEIKY_DEL_TRN_ID, resultSeiky.getString(JBSbatKK_T_SEIKY_KEI.DEL_TRN_ID));
		}

		// サービス契約レコードセットから値を設定する。
		if (resultSvc != null)
		{
			// 01.サービス契約番号
			mapKVIFM039.setString(JBSbatKVIFM039.SVC_KEI_NO, resultSvc.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_NO));
			// 02.SYSID
			mapKVIFM039.setString(JBSbatKVIFM039.SYSID, resultSvc.getString(JBSbatKK_T_SVC_KEI.SYSID));
			// 10.サービス契約ステータス
			mapKVIFM039.setString(JBSbatKVIFM039.SVC_KEI_STAT, resultSvc.getString(JBSbatKK_T_SVC_KEI.SVC_KEI_STAT));
// 2014/07/08 OM-2014-0002432 ADD START
			// 10-1.サービス開始日
			mapKVIFM039.setString(JBSbatKVIFM039.SVC_STA_YMD, resultSvc.getString(JBSbatKK_T_SVC_KEI.SVC_STA_YMD));
// 2014/07/08 OM-2014-0002432 ADD END
			// 11.サービス課金開始日
			mapKVIFM039.setString(JBSbatKVIFM039.SVC_CHRG_STAYMD, resultSvc.getString(JBSbatKK_T_SVC_KEI.SVC_CHRG_STAYMD));
			// 12.サービス課金終了日
			mapKVIFM039.setString(JBSbatKVIFM039.SVC_CHRG_ENDYMD, resultSvc.getString(JBSbatKK_T_SVC_KEI.SVC_CHRG_ENDYMD));
			// 14.サービス契約登録運用年月日
			mapKVIFM039.setString(JBSbatKVIFM039.SVC_ADD_UNYO_YMD, resultSvc.getString(JBSbatKK_T_SVC_KEI.ADD_UNYO_YMD));
			// 15.サービス契約登録処理ID
			mapKVIFM039.setString(JBSbatKVIFM039.SVC_ADD_TRN_ID, resultSvc.getString(JBSbatKK_T_SVC_KEI.ADD_TRN_ID));
			// 16.サービス契約更新運用年月日
			mapKVIFM039.setString(JBSbatKVIFM039.SVC_UPD_UNYO_YMD, resultSvc.getString(JBSbatKK_T_SVC_KEI.UPD_UNYO_YMD));
			// 17.サービス契約更新処理ID
			mapKVIFM039.setString(JBSbatKVIFM039.SVC_UPD_TRN_ID, resultSvc.getString(JBSbatKK_T_SVC_KEI.UPD_TRN_ID));
			// 18.サービス契約削除運用年月日
			mapKVIFM039.setString(JBSbatKVIFM039.SVC_DEL_UNYO_YMD, resultSvc.getString(JBSbatKK_T_SVC_KEI.DEL_UNYO_YMD));
			// 19.サービス契約削除処理ID
			mapKVIFM039.setString(JBSbatKVIFM039.SVC_DEL_TRN_ID, resultSvc.getString(JBSbatKK_T_SVC_KEI.DEL_TRN_ID));
		}

		// 13.調査内容区分
		mapKVIFM039.setString(JBSbatKVIFM039.CHOSA_NAIYO_KBN, chosaNaiyoKbn);

		// 出力フラグを設定
		mapKVIFM039.setOutFlg(true);

		return mapKVIFM039;
	}

	/**
	 * 空文字の判定
	 * 
	 * @param  val オブジェクト
	 * @return 判定結果(true:空文字である、false:空文字でない)
	 * @throws Exception 各種エラー
	 */
	private boolean isBlank(String val) throws Exception
	{
		if (val == null || "".equals(val))
		{
			return true;
		}
		return false;
	}
}
