/*********************************************************************
 *  All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名			：eo顧客基幹システム
 *	モジュール名		：JBSbatKVWribVrfyChokiInfo
 *	ソースファイル名	：JBSbatKVWribVrfyChokiInfo.java
 *	作成者				：富士通　
 *	作成日				：2013年05月29日
 *＜機能概要＞
 *　割引検証長期利用割引（通常割）／即割部品です。
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2013/05/29   富士通		新規作成
 *********************************************************************/
package eo.business.service;

import java.util.ArrayList;

import eo.business.common.JBSbatBusinessService;
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.business.common.JBSbatMatchServiceInterface;

import eo.business.util.file.JBSbatKVIFM016;
import eo.business.util.file.JBSbatKVIFM017;
import eo.business.util.file.JBSbatKVIFM019;
import eo.business.util.table.JBSbatKK_M_WRIB_SVC;
import eo.common.constant.JKKStrConst;

/**
 * (クラスの機能概要)
 * <p>
 *<BR>
 * 
 * @author 富士通
 */
public class JBSbatKVWribVrfyChokiInfo extends JBSbatBusinessService implements
		JBSbatMatchServiceInterface {
	/** ▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼ */
	/** テーブル(割引サービス) */
	private static final String D_TBL_NAME_KK_M_WRIB_SVC = "KK_M_WRIB_SVC";

	/** テーブル(割引サービス対象サービス) */
	private static final String D_TBL_NAME_KK_M_WRISVC_TG_SVC = "KK_M_WRISVC_TG_SVC";

	/** SQL定義キー(KV_SELECT_002) */
	private static final String KK_M_WRIB_SVC_KV_SELECT_004 = "KV_SELECT_004";

	/** SQL定義キー(KV_SELECT_002) */
	private static final String KK_M_WRISVC_TG_SVC_KV_SELECT_002 = "KV_SELECT_002";

	/** テーブルアクセスクラス(割引サービス) */
	private JBSbatSQLAccess db_KK_M_WRIB_SVC = null;

	/** テーブルアクセスクラス(割引サービス対象サービス) */
	private JBSbatSQLAccess db_KK_M_WRISVC_TG_SVC = null;

	/** キーマッチ処理フラグ */
	private boolean matchProcFlg;

	/** マスタファイル処理フラグ */
	private boolean mastProcFlg;

	/** トランファイル処理フラグ */
	private boolean tranProcFlg;
	/** ▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲ */

	/** 検証エラーメッセージ（長期利用割引（通常割）／即割両方適用） */
	private static final String MSG_CHECK_RESULT_01 = "長期利用割引（通常割）／即割が、適用されない料金プランに適用されている。";

	/** 検証エラーメッセージ（長期利用割引（通常割）／即割未適用） */
	private static final String MSG_CHECK_RESULT_02 = "長期利用割引（通常割）／即割の両方が適用されている。";

	/** 検証エラーメッセージ（長期利用割引（通常割）／即割不適用） */
	private static final String MSG_CHECK_RESULT_03 = "長期利用継続割引が、適用されない料金プランに適用されている。";

	/** 検証エラーメッセージ（長期継続利用割引不適用） */
	private static final String MSG_CHECK_RESULT_04 = "割引サービス契約．割引額算出基準年月日が、インターネットサービス契約のサービス開始年月日と異なる。";

	/** 長期利用割引（通常割）フラグ */
	private boolean boolChokiUseWribFlg = false;

	/** 即割フラグ */
	private boolean boolSokuWribFlg = false;

	/** 割引検証長期割情報退避領域 */
	private ArrayList<JBSbatServiceInterfaceMap> lstKeepData = new ArrayList<JBSbatServiceInterfaceMap>();

	/** 検証結果エラーメッセージ退避領域 */
	private ArrayList<String> lstErrMessageData = new ArrayList<String>();

	/** ヘッダ出力処理用フラグ */
	private boolean booHeaderOutputFlg = false;

	/**
	 * 初期処理
	 * 
	 * @param JBSbatCommonItem
	 *            commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception {
		/** ▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼ */
		/** ▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼ */
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_KK_M_WRIB_SVC = new JBSbatSQLAccess(commonItem,
			D_TBL_NAME_KK_M_WRIB_SVC);
		db_KK_M_WRISVC_TG_SVC = new JBSbatSQLAccess(commonItem,
			D_TBL_NAME_KK_M_WRISVC_TG_SVC);
		/** ▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲ */

		/** ▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲ */
	}

	/**
	 * 主処理
	 * 
	 * @param mastMap
	 *            　入力電文
	 * @param tranMap
	 *            　入力電文
	 * @param outputInItem
	 *            入力情報
	 * @return JBSbatOutputItem 出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap svcMap,
			JBSbatServiceInterfaceMap wribMap, JBSbatOutputItem outputInItem)
			throws Exception {
		/** ▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼ */
		super.logPrint.printDebugLog("execute_START");

		// 初回のみ処理
		if (!booHeaderOutputFlg) {
			this.editOutputHeaderItem(outputInItem);
			booHeaderOutputFlg = true;
		}

		// 出力行から、長期利用割引の妥当性を検証する

		if (svcMap == null && wribMap != null) {
			// 入力Ｍのみnullの場合
			this.setTranProcFlg(true);
			super.logPrint.printDebugLog("execute_END");
			return outputInItem;

		} else if (svcMap != null && wribMap == null) {
			// 入力Ｔのみnullの場合

			// 後始末を行う
			// 長期割検証処理
			this.setChokiWribCheck(outputInItem, svcMap);

			this.setMastProcFlg(true);
			super.logPrint.printDebugLog("execute_END");
			return outputInItem;
		// 2013/09/09 add start
		} else if (svcMap.getString(JBSbatKVIFM016.SVC_KEI_STAT).equals("010")) {
			// 検証対象外
			super.logPrint.printDebugLog("検証対象外：" + svcMap.getString(JBSbatKVIFM016.SVC_KEI_NO));
			this.setMastProcFlg(true);
			super.logPrint.printDebugLog("execute_END");
			return outputInItem;

		} else if (!wribMap.getString(JBSbatKVIFM017.WRIB_SVC_KEI_STAT).equals("100")) {
			// 検証対象外
			super.logPrint.printDebugLog("検証対象外：" + wribMap.getString(JBSbatKVIFM017.SVC_KEI_NO)
				+ "、" + wribMap.getString(JBSbatKVIFM017.WRIB_SVC_KEI_NO));
			this.setTranProcFlg(true);
			super.logPrint.printDebugLog("execute_END");
			return outputInItem;
		// 2013/09/09 add end
		} else {
			// サービス契約コードを主キーにする
			String strMastData = svcMap.getString(JBSbatKVIFM016.SVC_KEI_NO);
			String strTranData = wribMap.getString(JBSbatKVIFM017.SVC_KEI_NO);
			super.logPrint.printDebugLog("入力Ｍ：" + strMastData);
			super.logPrint.printDebugLog("入力Ｔ：" + strTranData);

			int intRsrt = strMastData.compareTo(strTranData);

			if (intRsrt == 0) {
				super.logPrint.printDebugLog("入力Ｍ＝入力Ｔ");

				// 割引検証長期割情報退避
				lstKeepData.add(wribMap);

				// 適用可能フラグ
				boolean enableFlg;

				// 割引サービスコードをキーにして割引サービス対象サービスマスタを参照し、
				// 料金グループコード、料金プランコードを取得する。
				String[] param0 = new String[6];
				param0[0] = wribMap.getString(JBSbatKVIFM017.WRIB_SVC_CD);
				param0[1] = svcMap.getString(JBSbatKVIFM016.SVC_CD);
				param0[2] = svcMap.getString(JBSbatKVIFM016.PRC_GRP_CD);
				param0[3] = svcMap.getString(JBSbatKVIFM016.PCRS_CD);
				param0[4] = svcMap.getString(JBSbatKVIFM016.PPLAN_CD);
				param0[5] = super.opeDate;

				executeKK_M_WRISVC_TG_SVC_KV_SELECT_002(param0);
				JBSbatCommonDBInterface db_map0 = db_KK_M_WRISVC_TG_SVC
					.selectNext();

				String strWribTypeCd = "";
				String strErrorMessage = "";

				if (db_map0 == null) {
					enableFlg = false;
				} else {
					enableFlg = true;
				}

				// 割引サービスマスタから割引タイプコードを取得する。
				String[] param1 = new String[2];
				param1[0] = wribMap.getString(JBSbatKVIFM017.WRIB_SVC_CD);
				param1[1] = super.opeDate;
				executeKK_M_WRIB_SVC_KV_SELECT_004(param1);
				JBSbatCommonDBInterface db_map1 = db_KK_M_WRIB_SVC.selectNext();

				if (db_map1 != null) {
					strWribTypeCd = db_map1
						.getString(JBSbatKK_M_WRIB_SVC.WRIB_TYPE_CD);

					if (enableFlg) {
						// 対象の割引が適用できる場合
						if (JKKStrConst.WRIB_TYPE_SOKU_WRIB.equals(strWribTypeCd)) {
							
							boolSokuWribFlg = true;
							
						} else {
							
							if (!(svcMap.getString(JBSbatKVIFM016.SVC_KEI_STAT).equals("010")
									|| svcMap.getString(JBSbatKVIFM016.SVC_KEI_STAT).equals("020")
									|| svcMap.getString(JBSbatKVIFM016.SVC_KEI_STAT).equals("030")
									|| svcMap.getString(JBSbatKVIFM016.SVC_KEI_STAT).equals("920"))) {

								// 即割以外の場合は割引額算出基準年月日検証
								strErrorMessage = strConcatenate(
									strErrorMessage,
									chkAmntSnstStdardymd(
										wribMap.getString(JBSbatKVIFM017.WRIB_AMNT_SNST_STDARDYMD),
										svcMap.getString(JBSbatKVIFM016.SVC_STA_YMD)));
							}
							
							if (JKKStrConst.WRIB_TYPE_CHOKI_USE_WRIB
								.equals(strWribTypeCd)) {
								boolChokiUseWribFlg = true;
							}
						}
					} else {
						// 対象の割引が適用できない場合
						if (JKKStrConst.WRIB_TYPE_CHOKI_KEIZK_USE_WRIB
							.equals(strWribTypeCd)) {
							strErrorMessage = this.strConcatenate(
								strErrorMessage, MSG_CHECK_RESULT_03);
						} else {
							strErrorMessage = this.strConcatenate(
								strErrorMessage, MSG_CHECK_RESULT_01);
						}
					}
				}
				// エラーメッセージ退避
				lstErrMessageData.add(strErrorMessage);

				// 入力Ｔのみ次のデータを読み込む
				this.setMastProcFlg(false);
				this.setTranProcFlg(true);
			} else if (intRsrt < 0) {
				// 後始末を行う
				// 長期割検証処理
				this.setChokiWribCheck(outputInItem, svcMap);

				// 入力Ｍのみ次のデータを読み込む
				this.setMastProcFlg(true);
				this.setTranProcFlg(false);
			} else {
				// 入力Ｔのみ次のデータを読み込む
				this.setMastProcFlg(false);
				this.setTranProcFlg(true);
			}
		}

		super.logPrint.printDebugLog("execute_END");
		return outputInItem;
		/** ▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲ */
	}

	/**
	 * 業務サービス終了処理
	 * 
	 * @throws Exception
	 */
	public void terminal() throws Exception {
		/** ▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼ */
		/** ▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼ */
		// DBアクセスクラスをクローズします
		db_KK_M_WRIB_SVC.close();
		db_KK_M_WRISVC_TG_SVC.close();
		/** ▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲ */
		/** ▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲ */
	}

	/** ▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼ */
	/**
	 * @return mastProcFlg を戻します。
	 */
	public boolean isMastProcFlg() {
		return mastProcFlg;
	}

	/**
	 * @return matchProcFlg を戻します。
	 */
	public boolean isMatchProcFlg() {
		return matchProcFlg;
	}

	/**
	 * @return tranProcFlg を戻します。
	 */
	public boolean isTranProcFlg() {
		return tranProcFlg;
	}

	/**
	 * @param mast_ProcFlg
	 *            設定する mastProcFlg。
	 */
	public void setMastProcFlg(boolean mast_ProcFlg) {
		this.mastProcFlg = mast_ProcFlg;
	}

	/**
	 * @param match_ProcFlg
	 *            設定する matchProcFlg。
	 */
	public void setMatchProcFlg(boolean match_ProcFlg) {
		this.matchProcFlg = match_ProcFlg;
	}

	/**
	 * @param tran_ProcFlg
	 *            設定する tranProcFlg。
	 */
	public void setTranProcFlg(boolean tran_ProcFlg) {
		this.tranProcFlg = tran_ProcFlg;
	}

	/**
	 * SQLKEY(KV_SELECT_002)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * 
	 * <pre>
	 * 1.引数でバイント変数を設定します。&lt;br&gt;
	 * 
	 * 2.DBアクセスを実行します。&lt;br&gt;
	 * 
	 * 3.メソッドの呼び出し方です。&lt;br&gt;
	 * 	引数:
	 * 	param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 * 	 	割引サービスコード
	 * 	 	予約適用年月日
	 * </pre>
	 * <p>
	 * 
	 * @param param
	 *            バイント変数の値配列。
	 * @throws Exception
	 *             業務サービス内で発生した例外全般。
	 */
	private void executeKK_M_WRIB_SVC_KV_SELECT_004(Object[] param)
			throws Exception {
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_KK_M_WRIB_SVC.selectBySqlDefine(paramList,
			KK_M_WRIB_SVC_KV_SELECT_004);
	}

	/**
	 * SQLKEY(KV_SELECT_002)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * 
	 * <pre>
	 * 1.引数でバイント変数を設定します。&lt;br&gt;
	 * 
	 * 2.DBアクセスを実行します。&lt;br&gt;
	 * 
	 * 3.メソッドの呼び出し方です。&lt;br&gt;
	 * 	引数:
	 * 	param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 * 	 	割引サービスコード
	 * 	 	予約適用年月日
	 * </pre>
	 * <p>
	 * 
	 * @param param
	 *            バイント変数の値配列。
	 * @throws Exception
	 *             業務サービス内で発生した例外全般。
	 */
	private void executeKK_M_WRISVC_TG_SVC_KV_SELECT_002(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());

		// DBアクセスを実行します
		db_KK_M_WRISVC_TG_SVC.selectBySqlDefine(paramList,
			KK_M_WRISVC_TG_SVC_KV_SELECT_002);
	}

	/** ▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲ */

	/**
	 * 長期割情報の検証を行います。
	 * 
	 * @param outputInItem
	 *            出力ファイル
	 * @param svcMap
	 *            入力マスタファイル
	 * @throws Exception
	 *             業務サービス内で発生した例外全般。
	 */
	private void setChokiWribCheck(JBSbatOutputItem outputInItem,
			JBSbatServiceInterfaceMap svcMap) throws Exception {
		// 退避領域が存在しない場合は何もしない
		if (lstKeepData == null) {
			return;
		}

		// 作業領域の初期化
		String strErrorMessage = "";

		// 長期利用割引（通常割）・即割同時検証
		if (boolChokiUseWribFlg && boolSokuWribFlg) {
			strErrorMessage = MSG_CHECK_RESULT_02;
		}

		int i = 0;
		String strRecordErrorMessage = "";
		// 検証結果ファイルの出力
		for (JBSbatServiceInterfaceMap keepData : lstKeepData) {
			strRecordErrorMessage = lstErrMessageData.get(i);

			// レコードエラーか同時検証エラーの場合
			if ((strRecordErrorMessage.length() > 0)
					|| (strErrorMessage.length() > 0)) {
				// 入出力インタフェースオブジェクトを生成
				JBSbatServiceInterfaceMap out_map = new JBSbatServiceInterfaceMap();

				// 出力項目を設定する
				out_map.setString(JBSbatKVIFM019.SVC_KEI_NO, svcMap
					.getString(JBSbatKVIFM016.SVC_KEI_NO)); // サービス契約番号
				out_map.setString(JBSbatKVIFM019.SVC_KEI_STAT, svcMap
					.getString(JBSbatKVIFM016.SVC_KEI_STAT)); // サービス契約ステータス
				out_map.setString(JBSbatKVIFM019.SVC_KEI_STAT_NM, svcMap
					.getString(JBSbatKVIFM016.SVC_KEI_STAT_NM)); // サービス契約ステータス名称
				out_map.setString(JBSbatKVIFM019.PCRS_CD, svcMap
					.getString(JBSbatKVIFM016.PCRS_CD)); // 料金コースコード
				out_map.setString(JBSbatKVIFM019.PCRS_NM, svcMap
					.getString(JBSbatKVIFM016.PCRS_NM)); // 料金コース名
				out_map.setString(JBSbatKVIFM019.PPLAN_CD, svcMap
					.getString(JBSbatKVIFM016.PPLAN_CD)); // 料金プランコード
				out_map.setString(JBSbatKVIFM019.PPLAN_NM, svcMap
					.getString(JBSbatKVIFM016.PPLAN_NM)); // 料金プラン名
				out_map.setString(JBSbatKVIFM019.KAKINS_NO, svcMap
					.getString(JBSbatKVIFM016.KAKINS_NO)); // 課金先番号
				out_map.setString(JBSbatKVIFM019.SEIKY_KEI_NO, svcMap
					.getString(JBSbatKVIFM016.SEIKY_KEI_NO)); // 請求契約番号
				out_map.setString(JBSbatKVIFM019.SVC_KEI_KAISEN_UCWK_NO, svcMap
					.getString(JBSbatKVIFM016.SVC_KEI_KAISEN_UCWK_NO)); // サービス契約回線内訳番号
				out_map.setString(JBSbatKVIFM019.PLAN_STAYMD_SVC, svcMap
					.getString(JBSbatKVIFM016.PLAN_STAYMD)); // プラン開始年月日（サービス）
				out_map.setString(JBSbatKVIFM019.PLAN_ENDYMD_SVC, svcMap
					.getString(JBSbatKVIFM016.PLAN_ENDYMD)); // プラン終了年月日（サービス）
				out_map.setString(JBSbatKVIFM019.PLAN_CHRG_STAYMD_SVC, svcMap
					.getString(JBSbatKVIFM016.PLAN_CHRG_STAYMD)); // プラン課金開始年月日（サービス）
				out_map.setString(JBSbatKVIFM019.PLAN_CHRG_ENDYMD_SVC, svcMap
					.getString(JBSbatKVIFM016.PLAN_CHRG_ENDYMD)); // プラン課金終了年月日（サービス）
				out_map.setString(JBSbatKVIFM019.SVC_CANCEL_YMD_SVC, svcMap
					.getString(JBSbatKVIFM016.SVC_CANCEL_YMD)); // サービスキャンセル年月日（サービス）
				out_map.setString(JBSbatKVIFM019.SVC_STA_YMD_SVC, svcMap
					.getString(JBSbatKVIFM016.SVC_STA_YMD)); // サービス開始年月日（サービス）
				out_map.setString(JBSbatKVIFM019.SVC_CHRG_STAYMD_SVC, svcMap
					.getString(JBSbatKVIFM016.SVC_CHRG_STAYMD)); // サービス課金開始年月日（サービス）
				out_map.setString(JBSbatKVIFM019.SVC_PAUSE_YMD_SVC, svcMap
					.getString(JBSbatKVIFM016.SVC_PAUSE_YMD)); // サービス休止年月日（サービス）
				out_map.setString(JBSbatKVIFM019.SVC_PAUSE_RLS_YMD_SVC, svcMap
					.getString(JBSbatKVIFM016.SVC_PAUSE_RLS_YMD)); // サービス休止解除年月日（サービス）
				out_map.setString(JBSbatKVIFM019.SVC_ENDYMD_SVC, svcMap
					.getString(JBSbatKVIFM016.SVC_ENDYMD)); // サービス終了年月日（サービス）
				out_map.setString(JBSbatKVIFM019.SVC_CHRG_ENDYMD_SVC, svcMap
					.getString(JBSbatKVIFM016.SVC_CHRG_ENDYMD)); // サービス課金終了年月日（サービス）
				out_map.setString(JBSbatKVIFM019.SVC_DSL_KISAN_YMD_SVC, svcMap
					.getString(JBSbatKVIFM016.SVC_DSL_KISAN_YMD)); // サービス解約起算年月日（サービス）
				out_map.setString(JBSbatKVIFM019.SVC_DSL_YMD_SVC, svcMap
					.getString(JBSbatKVIFM016.SVC_DSL_YMD)); // サービス解約年月日（サービス）
				out_map.setString(JBSbatKVIFM019.KAIHK_YMD_SVC, svcMap
					.getString(JBSbatKVIFM016.KAIHK_YMD)); // 回復年月日（サービス）
				out_map.setString(JBSbatKVIFM019.SVC_CANCEL_CL_YMD_SVC, svcMap
					.getString(JBSbatKVIFM016.SVC_CANCEL_CL_YMD)); // サービスキャンセル取消年月日（サービス）
				out_map.setString(JBSbatKVIFM019.SVC_DSL_CL_YMD_SVC, svcMap
					.getString(JBSbatKVIFM016.SVC_DSL_CL_YMD)); // サービス解約取消年月日（サービス）
				out_map.setString(JBSbatKVIFM019.WRIB_SVC_KEI_NO, keepData
					.getString(JBSbatKVIFM017.WRIB_SVC_KEI_NO)); // 割引サービス契約番号
				out_map.setString(JBSbatKVIFM019.WRIB_SVC_KEI_STAT, keepData
					.getString(JBSbatKVIFM017.WRIB_SVC_KEI_STAT)); // 割引サービスステータス
				out_map.setString(JBSbatKVIFM019.WRIB_SVC_KEI_STAT_NM, keepData
					.getString(JBSbatKVIFM017.WRIB_SVC_KEI_STAT_NM)); // 割引サービスステータス名称
				out_map.setString(JBSbatKVIFM019.SYSID, keepData
					.getString(JBSbatKVIFM017.SYSID)); // ＳＹＳＩＤ
				out_map.setString(JBSbatKVIFM019.WRIB_SVC_CD, keepData
					.getString(JBSbatKVIFM017.WRIB_SVC_CD)); // 割引サービスコード
				out_map.setString(JBSbatKVIFM019.DSP_CAMPAIGN_CD, keepData
					.getString(JBSbatKVIFM017.DSP_CAMPAIGN_CD)); // 表示用キャンペーンコード
				out_map.setString(JBSbatKVIFM019.WRIB_SVC_NM, keepData
					.getString(JBSbatKVIFM017.WRIB_SVC_NM)); // 割引サービス名
				out_map.setString(JBSbatKVIFM019.PLAN_STAYMD_WRIB, keepData
					.getString(JBSbatKVIFM017.PLAN_STAYMD)); // プラン開始年月日（割引）
				out_map.setString(JBSbatKVIFM019.PLAN_ENDYMD_WRIB, keepData
					.getString(JBSbatKVIFM017.PLAN_ENDYMD)); // プラン終了年月日（割引）
				out_map.setString(JBSbatKVIFM019.PLAN_CHRG_STAYMD_WRIB,
					keepData.getString(JBSbatKVIFM017.PLAN_CHRG_STAYMD)); // プラン課金開始年月日（割引）
				out_map.setString(JBSbatKVIFM019.PLAN_CHRG_ENDYMD_WRIB,
					keepData.getString(JBSbatKVIFM017.PLAN_CHRG_ENDYMD)); // プラン課金終了年月日（割引）
				out_map.setString(JBSbatKVIFM019.PLAN_END_SBT_CD, keepData
					.getString(JBSbatKVIFM017.PLAN_END_SBT_CD)); // プラン終了種別コード
				out_map.setString(JBSbatKVIFM019.SVC_CANCEL_YMD_WRIB, keepData
					.getString(JBSbatKVIFM017.SVC_CANCEL_YMD)); // サービスキャンセル年月日（割引）
				out_map.setString(JBSbatKVIFM019.SVC_CANCEL_RSN_CD, keepData
					.getString(JBSbatKVIFM017.SVC_CANCEL_RSN_CD)); // サービスキャンセル理由コード
				out_map.setString(JBSbatKVIFM019.SVC_STA_YMD_WRIB, keepData
					.getString(JBSbatKVIFM017.SVC_STA_YMD)); // サービス開始年月日（割引）
				out_map.setString(JBSbatKVIFM019.SVC_CHRG_STAYMD_WRIB, keepData
					.getString(JBSbatKVIFM017.SVC_CHRG_STAYMD)); // サービス課金開始年月日（割引）
				out_map.setString(JBSbatKVIFM019.SVC_ENDYMD_WRIB, keepData
					.getString(JBSbatKVIFM017.SVC_ENDYMD)); // サービス終了年月日（割引）
				out_map.setString(JBSbatKVIFM019.SVC_CHRG_ENDYMD_WRIB, keepData
					.getString(JBSbatKVIFM017.SVC_CHRG_ENDYMD)); // サービス課金終了年月日（割引）
				out_map.setString(JBSbatKVIFM019.SVC_DSL_YMD_WRIB, keepData
					.getString(JBSbatKVIFM017.SVC_DSL_YMD)); // サービス解約年月日（割引）
				out_map.setString(JBSbatKVIFM019.KAIHK_YMD_WRIB, keepData
					.getString(JBSbatKVIFM017.KAIHK_YMD)); // 回復年月日（割引）
				out_map.setString(JBSbatKVIFM019.SVC_CANCEL_CL_YMD_WRIB,
					keepData.getString(JBSbatKVIFM017.SVC_CANCEL_CL_YMD)); // サービスキャンセル取消年月日（割引）
				out_map.setString(JBSbatKVIFM019.SVC_DSL_CL_YMD_WRIB, keepData
					.getString(JBSbatKVIFM017.SVC_DSL_CL_YMD)); // サービス解約取消年月日（割引）
				out_map.setString(JBSbatKVIFM019.INTR_CD, keepData
					.getString(JBSbatKVIFM017.INTR_CD)); // 紹介コード
				out_map.setString(JBSbatKVIFM019.MSKM_KISAN_YMD, keepData
					.getString(JBSbatKVIFM017.MSKM_KISAN_YMD)); // 申込起算年月日
				out_map.setString(JBSbatKVIFM019.WRIB_ADD_OPTY_CD, keepData
					.getString(JBSbatKVIFM017.WRIB_ADD_OPTY_CD)); // 割引登録契機コード
				out_map.setString(JBSbatKVIFM019.WRIB_DSL_CNCL_OPTY_CD,
					keepData.getString(JBSbatKVIFM017.WRIB_DSL_CNCL_OPTY_CD)); // 割引解約キャンセル契機コード
				out_map
					.setString(JBSbatKVIFM019.WRIB_AMNT_SNST_STDARDYMD,
						keepData
							.getString(JBSbatKVIFM017.WRIB_AMNT_SNST_STDARDYMD)); // 割引額算出基準年月日
				out_map
					.setString(JBSbatKVIFM019.WRIB_CHRG_STA_MON_STI_CD,
						keepData
							.getString(JBSbatKVIFM017.WRIB_CHRG_STA_MON_STI_CD)); // 割引課金開始月指定コード
				out_map.setString(JBSbatKVIFM019.WRIB_ADD_YMD, keepData
					.getString(JBSbatKVIFM017.WRIB_ADD_YMD)); // 割引登録年月日
				out_map.setString(JBSbatKVIFM019.CHECK_RESULT, this
					.strConcatenate(strRecordErrorMessage, strErrorMessage)); // 検証結果

				// 出力フラグを設定
				out_map.setOutFlg(true);

				// 出力共通電文に入出力インターフェースを設定する。
				outputInItem.addOutMapList(out_map);
			}

			i++;
		}

		// 作業領域の初期化
		boolChokiUseWribFlg = false;
		boolSokuWribFlg = false;
		lstKeepData.clear();
		lstErrMessageData.clear();
	}

	/**
	 * 文字列を全角カンマで結合します。
	 * 
	 * @param strChar
	 *            文字列
	 * @param strInChar
	 *            結合文字列
	 * @return String 結合結果
	 * @throws Exception
	 *             業務サービス内で発生した例外全般。
	 */
	private String strConcatenate(String strChar, String strInChar)
			throws Exception {
		// 作業領域の初期化
		String resultChar = "";

		if (strChar.length() == 0) {
			resultChar = strInChar;
		} else if (strInChar.length() == 0) {
			resultChar = strChar;
		} else {
			resultChar = strChar + "，" + strInChar;
		}
		return resultChar;
	}

	/**
	 * 割引額算出基準年月日の検証を行います。
	 * 
	 * @param strAmntSnstStdardymd
	 *            割引額算出基準年月日
	 * @param strSvcStaYmd
	 *            サービス開始年月日
	 * @return String エラーメッセージ
	 * @throws Exception
	 *             業務サービス内で発生した例外全般。
	 */
	private String chkAmntSnstStdardymd(String strAmntSnstStdardymd,
			String strSvcStaYmd) throws Exception {
		// 作業領域の初期化
		String resultMessage = "";

		// 割引額算出基準年月日とサービス開始年月日が不一致
		if (!strAmntSnstStdardymd.equals(strSvcStaYmd)) {
			resultMessage = MSG_CHECK_RESULT_04;
		}

		return resultMessage;
	}

	/**
	 * 検証結果ファイル（ヘッダ）を編集します。
	 * 
	 * @param outputInItem
	 *            出力ファイル
	 * @throws Exception
	 *             業務サービス内で発生した例外全般。
	 */
	private void editOutputHeaderItem(JBSbatOutputItem outputInItem)
			throws Exception {
		// ヘッダ項目の変数を指定する
		String COLUMN_01 = "サービス契約番号";
		String COLUMN_02 = "サービス契約ステータス";
		String COLUMN_03 = "サービス契約ステータス名称";
		String COLUMN_04 = "料金コースコード";
		String COLUMN_05 = "料金コース名";
		String COLUMN_06 = "料金プランコード";
		String COLUMN_07 = "料金プラン名";
		String COLUMN_08 = "課金先番号";
		String COLUMN_09 = "請求契約番号";
		String COLUMN_10 = "サービス契約回線内訳番号";
		String COLUMN_11 = "プラン開始年月日(サービス)";
		String COLUMN_12 = "プラン終了年月日(サービス)";
		String COLUMN_13 = "プラン課金開始年月日(サービス)";
		String COLUMN_14 = "プラン課金終了年月日(サービス)";
		String COLUMN_15 = "サービスキャンセル年月日(サービス)";
		String COLUMN_16 = "サービス開始年月日(サービス)";
		String COLUMN_17 = "サービス課金開始年月日(サービス)";
		String COLUMN_18 = "サービス休止年月日(サービス)";
		String COLUMN_19 = "サービス休止解除年月日(サービス)";
		String COLUMN_20 = "サービス終了年月日(サービス)";
		String COLUMN_21 = "サービス課金終了年月日(サービス)";
		String COLUMN_22 = "サービス解約起算年月日(サービス)";
		String COLUMN_23 = "サービス解約年月日(サービス)";
		String COLUMN_24 = "回復年月日(サービス)";
		String COLUMN_25 = "サービスキャンセル取消年月日(サービス)";
		String COLUMN_26 = "サービス解約取消年月日(サービス)";
		String COLUMN_27 = "割引サービス契約番号";
		String COLUMN_28 = "割引サービス契約ステータス";
		String COLUMN_29 = "割引サービス契約ステータス名称";
		String COLUMN_30 = "SYSID";
		String COLUMN_31 = "割引サービスコード";
		String COLUMN_32 = "表示用キャンペーンコード";
		String COLUMN_33 = "割引サービス名";
		String COLUMN_34 = "プラン開始年月日（割引）";
		String COLUMN_35 = "プラン終了年月日（割引）";
		String COLUMN_36 = "プラン課金開始年月日（割引）";
		String COLUMN_37 = "プラン課金終了年月日（割引）";
		String COLUMN_38 = "プラン終了種別コード";
		String COLUMN_39 = "サービスキャンセル年月日（割引）";
		String COLUMN_40 = "サービスキャンセル理由コード";
		String COLUMN_41 = "サービス開始年月日（割引）";
		String COLUMN_42 = "サービス課金開始年月日（割引）";
		String COLUMN_43 = "サービス終了年月日（割引）";
		String COLUMN_44 = "サービス課金終了年月日（割引）";
		String COLUMN_45 = "サービス解約年月日（割引）";
		String COLUMN_46 = "回復年月日（割引）";
		String COLUMN_47 = "サービスキャンセル取消年月日（割引）";
		String COLUMN_48 = "サービス解約取消年月日（割引）";
		String COLUMN_49 = "紹介コード";
		String COLUMN_50 = "申込起算年月日";
		String COLUMN_51 = "割引登録契機コード";
		String COLUMN_52 = "割引解約キャンセル契機コード";
		String COLUMN_53 = "割引額算出基準年月日";
		String COLUMN_54 = "割引課金開始月指定コード";
		String COLUMN_55 = "割引登録年月日";
		String COLUMN_56 = "検証結果";

		// 入出力インタフェースオブジェクトを生成
		JBSbatServiceInterfaceMap out_map = new JBSbatServiceInterfaceMap();

		// 出力項目を設定する
		out_map.setString(JBSbatKVIFM019.SVC_KEI_NO, COLUMN_01); // サービス契約番号
		out_map.setString(JBSbatKVIFM019.SVC_KEI_STAT, COLUMN_02); // サービス契約ステータス
		out_map.setString(JBSbatKVIFM019.SVC_KEI_STAT_NM, COLUMN_03); // サービス契約ステータス名称
		out_map.setString(JBSbatKVIFM019.PCRS_CD, COLUMN_04); // 料金コースコード
		out_map.setString(JBSbatKVIFM019.PCRS_NM, COLUMN_05); // 料金コース名
		out_map.setString(JBSbatKVIFM019.PPLAN_CD, COLUMN_06); // 料金プランコード
		out_map.setString(JBSbatKVIFM019.PPLAN_NM, COLUMN_07); // 料金プラン名
		out_map.setString(JBSbatKVIFM019.KAKINS_NO, COLUMN_08); // 課金先番号
		out_map.setString(JBSbatKVIFM019.SEIKY_KEI_NO, COLUMN_09); // 請求契約番号
		out_map.setString(JBSbatKVIFM019.SVC_KEI_KAISEN_UCWK_NO, COLUMN_10); // サービス契約回線内訳番号
		out_map.setString(JBSbatKVIFM019.PLAN_STAYMD_SVC, COLUMN_11); // プラン開始年月日(サービス)
		out_map.setString(JBSbatKVIFM019.PLAN_ENDYMD_SVC, COLUMN_12); // プラン終了年月日(サービス)
		out_map.setString(JBSbatKVIFM019.PLAN_CHRG_STAYMD_SVC, COLUMN_13); // プラン課金開始年月日(サービス)
		out_map.setString(JBSbatKVIFM019.PLAN_CHRG_ENDYMD_SVC, COLUMN_14); // プラン課金終了年月日(サービス)
		out_map.setString(JBSbatKVIFM019.SVC_CANCEL_YMD_SVC, COLUMN_15); // サービスキャンセル年月日(サービス)
		out_map.setString(JBSbatKVIFM019.SVC_STA_YMD_SVC, COLUMN_16); // サービス開始年月日(サービス)
		out_map.setString(JBSbatKVIFM019.SVC_CHRG_STAYMD_SVC, COLUMN_17); // サービス課金開始年月日(サービス)
		out_map.setString(JBSbatKVIFM019.SVC_PAUSE_YMD_SVC, COLUMN_18); // サービス休止年月日(サービス)
		out_map.setString(JBSbatKVIFM019.SVC_PAUSE_RLS_YMD_SVC, COLUMN_19); // サービス休止解除年月日(サービス)
		out_map.setString(JBSbatKVIFM019.SVC_ENDYMD_SVC, COLUMN_20); // サービス終了年月日(サービス)
		out_map.setString(JBSbatKVIFM019.SVC_CHRG_ENDYMD_SVC, COLUMN_21); // サービス課金終了年月日(サービス)
		out_map.setString(JBSbatKVIFM019.SVC_DSL_KISAN_YMD_SVC, COLUMN_22); // サービス解約起算年月日(サービス)
		out_map.setString(JBSbatKVIFM019.SVC_DSL_YMD_SVC, COLUMN_23); // サービス解約年月日(サービス)
		out_map.setString(JBSbatKVIFM019.KAIHK_YMD_SVC, COLUMN_24); // 回復年月日(サービス)
		out_map.setString(JBSbatKVIFM019.SVC_CANCEL_CL_YMD_SVC, COLUMN_25); // サービスキャンセル取消年月日(サービス)
		out_map.setString(JBSbatKVIFM019.SVC_DSL_CL_YMD_SVC, COLUMN_26); // サービス解約取消年月日(サービス)
		out_map.setString(JBSbatKVIFM019.WRIB_SVC_KEI_NO, COLUMN_27); // 割引サービス契約番号
		out_map.setString(JBSbatKVIFM019.WRIB_SVC_KEI_STAT, COLUMN_28); // 割引サービス契約ステータス
		out_map.setString(JBSbatKVIFM019.WRIB_SVC_KEI_STAT_NM, COLUMN_29); // 割引サービス契約ステータス名称
		out_map.setString(JBSbatKVIFM019.SYSID, COLUMN_30); // SYSID
		out_map.setString(JBSbatKVIFM019.WRIB_SVC_CD, COLUMN_31); // 割引サービスコード
		out_map.setString(JBSbatKVIFM019.DSP_CAMPAIGN_CD, COLUMN_32); // 表示用キャンペーンコード
		out_map.setString(JBSbatKVIFM019.WRIB_SVC_NM, COLUMN_33); // 割引サービス名
		out_map.setString(JBSbatKVIFM019.PLAN_STAYMD_WRIB, COLUMN_34); // プラン開始年月日（割引）
		out_map.setString(JBSbatKVIFM019.PLAN_ENDYMD_WRIB, COLUMN_35); // プラン終了年月日（割引）
		out_map.setString(JBSbatKVIFM019.PLAN_CHRG_STAYMD_WRIB, COLUMN_36); // プラン課金開始年月日（割引）
		out_map.setString(JBSbatKVIFM019.PLAN_CHRG_ENDYMD_WRIB, COLUMN_37); // プラン課金終了年月日（割引）
		out_map.setString(JBSbatKVIFM019.PLAN_END_SBT_CD, COLUMN_38); // プラン終了種別コード
		out_map.setString(JBSbatKVIFM019.SVC_CANCEL_YMD_WRIB, COLUMN_39); // サービスキャンセル年月日（割引）
		out_map.setString(JBSbatKVIFM019.SVC_CANCEL_RSN_CD, COLUMN_40); // サービスキャンセル理由コード
		out_map.setString(JBSbatKVIFM019.SVC_STA_YMD_WRIB, COLUMN_41); // サービス開始年月日（割引）
		out_map.setString(JBSbatKVIFM019.SVC_CHRG_STAYMD_WRIB, COLUMN_42); // サービス課金開始年月日（割引）
		out_map.setString(JBSbatKVIFM019.SVC_ENDYMD_WRIB, COLUMN_43); // サービス終了年月日（割引）
		out_map.setString(JBSbatKVIFM019.SVC_CHRG_ENDYMD_WRIB, COLUMN_44); // サービス課金終了年月日（割引）
		out_map.setString(JBSbatKVIFM019.SVC_DSL_YMD_WRIB, COLUMN_45); // サービス解約年月日（割引）
		out_map.setString(JBSbatKVIFM019.KAIHK_YMD_WRIB, COLUMN_46); // 回復年月日（割引）
		out_map.setString(JBSbatKVIFM019.SVC_CANCEL_CL_YMD_WRIB, COLUMN_47); // サービスキャンセル取消年月日（割引）
		out_map.setString(JBSbatKVIFM019.SVC_DSL_CL_YMD_WRIB, COLUMN_48); // サービス解約取消年月日（割引）
		out_map.setString(JBSbatKVIFM019.INTR_CD, COLUMN_49); // 紹介コード
		out_map.setString(JBSbatKVIFM019.MSKM_KISAN_YMD, COLUMN_50); // 申込起算年月日
		out_map.setString(JBSbatKVIFM019.WRIB_ADD_OPTY_CD, COLUMN_51); // 割引登録契機コード
		out_map.setString(JBSbatKVIFM019.WRIB_DSL_CNCL_OPTY_CD, COLUMN_52); // 割引解約キャンセル契機コード
		out_map.setString(JBSbatKVIFM019.WRIB_AMNT_SNST_STDARDYMD, COLUMN_53); // 割引額算出基準年月日
		out_map.setString(JBSbatKVIFM019.WRIB_CHRG_STA_MON_STI_CD, COLUMN_54); // 割引課金開始月指定コード
		out_map.setString(JBSbatKVIFM019.WRIB_ADD_YMD, COLUMN_55); // 割引登録年月日
		out_map.setString(JBSbatKVIFM019.CHECK_RESULT, COLUMN_56); // 検証結果

		// 出力フラグを設定
		out_map.setOutFlg(true);

		// 出力共通電文に入出力インターフェースを設定する。
		outputInItem.addOutMapList(out_map);
	}
}
