/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatKVWribVrfySetWribCheck
*	ソースファイル名	：JBSbatKVWribVrfySetWribCheck.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.business.util.file.JBSbatKVIFM020;
import eo.business.util.file.JBSbatKVIFM021;
import eo.business.util.table.JBSbatKK_M_WRIB_SVC;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatAplConst;
import eo.framework.util.JBSbatStringUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatKVWribVrfySetWribCheck extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(割引サービス)*/
	private static final String D_TBL_NAME_KK_M_WRIB_SVC = "KK_M_WRIB_SVC";

	/** SQL定義キー(KV_SELECT_001)*/
	private static final String KK_M_WRIB_SVC_KV_SELECT_001 = "KV_SELECT_001";

	/** テーブルアクセスクラス(割引サービス)*/
	private JBSbatSQLAccess db_KK_M_WRIB_SVC = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** ヘッダ出力処理用フラグ */
	private boolean booHeaderOutputFlg = false; 

	/** 検証エラーメッセージ（セット割／ダミー割未適用）*/
	private static final String MSG_CHECK_RESULT_01 = "複数サービスを契約しているがセット割／ダミーセット割ともに適用されていない。";

	/** 検証エラーメッセージ（セット割／ダミー割同時適用）*/
	private static final String MSG_CHECK_RESULT_02 = "同一請求先配下に通常セット割とダミーセット割が同時に契約されている。";

	/** 通常セット割フラグ */
	private boolean boolNormalSetWribFlg = false; 
	
	/** ダミーセット割フラグ */
	private boolean boolDummySetWribFlg = false; 
	
	/** SYSID複数フラグ */
	private boolean boolSysidMultiFlg = false; 
	
	/** サービス契約回線内訳番号複数フラグ */
	private boolean boolSvcKeiMultiFlg = false; 
	
	/** 請求契約番号（コントロールブレイクキー） */
	private String strSeikyKeiNoBreakKey = ""; 
	
	/** SYSID（複数指定確認用） */
	private String strSysid = ""; 
	
	/** サービス契約回線内訳番号（複数指定確認用） */
	private String strSvcKei = ""; 
	
	/** SYSID複数指定制御用フラグ */
	private String strSysidMultiCtrlFlg = ""; 

	/** サービス契約回線内訳番号複数指定制御用フラグ */
	private String strSvcKeiMultiCtrlFlg = ""; 

	/** 初回ブレイク処理済みフラグ */
	private String strFirstFlg = ""; 

	/** 割引検証セット割情報退避領域 */
	private ArrayList<JBSbatServiceInterfaceMap> lstKeepData = new ArrayList<JBSbatServiceInterfaceMap>();

	/** フリー項目区切文字 */
	public static final String FREE_DIV = ";";
	
	/**  入力定義ファイルパス */
	public static final String KDDI_BAT_ID_IND = "IND";
	
	/** 文字コード - Shift_JIS */
	public static final String ENCODE_SJIS = "Shift_JIS";
	
	/** 文字コード - MS932 */
	public static final String ENCODE_MS932 = "MS932";
	
	/** コード種別 割引タイプコード セット割引 */
	public static final String WRIB_TYPE_SET_WRIB = "10";
	
	/** 割引適用契機コード 顧客申込 */
	public static final String CD00285_CST_MSKM = "1";
	
	/** 割引適用契機コード 自動適用 */
	public static final String CD00285_AUTO = "2";
	
	/**
	 * 初期処理
	 * @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);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		// 作業領域の初期化
		strSeikyKeiNoBreakKey = "";
		strFirstFlg = "0";
		strSysidMultiCtrlFlg = "0";
		strSvcKeiMultiCtrlFlg = "0";
		
		/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		
		// 起動パラメータ FREE より、入力ファイル名を取得します。
		String[] freeItemArray = commonItem.getFreeItem().split(FREE_DIV);
		
		// 割引検証セット割り情報集約ファイルの設定
		JBSbatInputFileUtil inFileObj = new JBSbatInputFileUtil(freeItemArray[0] + freeItemArray[1]);
		inFileObj.setEncode(ENCODE_SJIS);
		inFileObj.createReader();
		
		// ファイル項目定義
		StringBuffer defPath = new StringBuffer();
		defPath.append(JBSbatAplConst.getAplConstValue(KDDI_BAT_ID_IND));
		defPath.append(freeItemArray[2]);
		JBSbatServiceInterfaceMap retInMap = null;
		JBSbatOutputItem outputInItem = new JBSbatOutputItem();
		
		// 初回のみ処理
		if (!booHeaderOutputFlg)
		{
			this.editOutputHeaderItem(outputInItem);
			booHeaderOutputFlg = true;
		}
		
		// １件目読み込み
		String readLine = inFileObj.readLine();
		
		// ファイルがなくなるまで以下の処理を繰り返す
		try
		{
			while(readLine != null)
			{
				// encodeの形式がSHIFT-JISの場合、MS932に変換
				String enc = inFileObj.getEncode();
				if (ENCODE_SJIS.toUpperCase().equals(enc.toUpperCase()))
				{
					enc = ENCODE_MS932;
				}
				
				JBSbatDefFileUtil defUtil = new JBSbatDefFileUtil(defPath.toString(), inFileObj);
				inFileObj.setEncode(enc);
				
				// マッピング
				retInMap = defUtil.lineToObject(readLine, inFileObj, 1);
				
				// １件目処理のみ
				if (strFirstFlg.equals("0"))
				{
					// ブレイクキーの設定
					strSeikyKeiNoBreakKey = rmvDoubleQuote(retInMap.getString(JBSbatKVIFM020.SEIKY_KEI_NO));		// 請求先契約番号
					
					// 初回ブレイク処理済みフラグの設定
					strFirstFlg = "1"; 
				}
				
				// 請求先が変わった？
				if (!rmvDoubleQuote(retInMap.getString(JBSbatKVIFM020.SEIKY_KEI_NO)).equals(strSeikyKeiNoBreakKey))
				{
					// 請求先が変わった
					// セット割情報検証処理
					this.setWribInfoCheck(outputInItem);
					
					// ブレイクキーの設定
					strSeikyKeiNoBreakKey = rmvDoubleQuote(retInMap.getString(JBSbatKVIFM020.SEIKY_KEI_NO));		// 請求先契約番号
					
					// 作業領域の初期化
					boolNormalSetWribFlg = false;
					boolDummySetWribFlg = false;
					boolSysidMultiFlg = false;
					boolSvcKeiMultiFlg = false;
					strSysidMultiCtrlFlg = "0";
					strSvcKeiMultiCtrlFlg = "0";
					lstKeepData.clear();
				}

				// 割引検証セット割情報退避
				lstKeepData.add(retInMap);
				
				// 同一請求内の処理
				// サービス割引を取得
				
				Object[] setSvcWribParam = {rmvDoubleQuote(retInMap.getString(JBSbatKVIFM020.WRIB_SVC_CD)), super.opeDate};
				
				executeKK_M_WRIB_SVC_KV_SELECT_001(setSvcWribParam);
				JBSbatCommonDBInterface rcvSvcWribMap = db_KK_M_WRIB_SVC.selectNext();

				String strWribTypeCd = "";
				String strWribAplyOptntyCd = "";

				if (rcvSvcWribMap != null)
				{
					strWribTypeCd = JBSbatStringUtil.Rtrim((rcvSvcWribMap.getString(JBSbatKK_M_WRIB_SVC.WRIB_TYPE_CD)));
					strWribAplyOptntyCd = JBSbatStringUtil.Rtrim((rcvSvcWribMap.getString(JBSbatKK_M_WRIB_SVC.WRIB_APLY_OPTNTY_CD)));
				}
				
				// 通常セット割適用
				if (strWribTypeCd.equals(WRIB_TYPE_SET_WRIB) && strWribAplyOptntyCd.equals(CD00285_AUTO))
				{
					boolNormalSetWribFlg = true;
				}
				
				// ダミーセット割適用
				if (strWribTypeCd.equals(WRIB_TYPE_SET_WRIB) && strWribAplyOptntyCd.equals(CD00285_CST_MSKM))
				{
					boolDummySetWribFlg = true;
				}
				
				// SYSIDが複数存在
				// 同一請求内の１件目は何もしない
				if (strSysidMultiCtrlFlg.equals("0"))
				{
					strSysidMultiCtrlFlg = "1";
					strSysid = rmvDoubleQuote(retInMap.getString(JBSbatKVIFM020.SYSID_SVC));
				}
				else
				{
					if (!strSysid.equals(rmvDoubleQuote(retInMap.getString(JBSbatKVIFM020.SYSID_SVC))))
					{
						boolSysidMultiFlg = true;
					}
				}
				
				// モバイルでない場合
				String eoBrandCd = rmvDoubleQuote(retInMap.getString(JBSbatKVIFM020.EO_BRAND_CD));
				if (!eoBrandCd.equals("04")){
					
					// サービス契約回線内訳番号が複数存在
					// 同一請求内の１件目は何もしない
					if (strSvcKeiMultiCtrlFlg.equals("0"))
					{
						strSvcKeiMultiCtrlFlg = "1";
						strSvcKei = rmvDoubleQuote(retInMap.getString(JBSbatKVIFM020.SVC_KEI_KAISEN_UCWK_NO));
					}
					else
					{
						if (!strSvcKei.equals(rmvDoubleQuote(retInMap.getString(JBSbatKVIFM020.SVC_KEI_KAISEN_UCWK_NO))))
						{
							boolSvcKeiMultiFlg = true;
						}
					}
				}
				// ２件目以降読み込み
				readLine = inFileObj.readLine();
			}
			
			// 後始末
			// セット割情報検証処理
			this.setWribInfoCheck(outputInItem);
			
		}
		finally
		{
			if (inFileObj != null)
			{
				inFileObj.close();
			}
		}
		
		return outputInItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_KK_M_WRIB_SVC.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 * 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_M_WRIB_SVC_KV_SELECT_001(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_001);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * セット割情報の検証を行います。
	 * 
	 * @param outputInItem 出力ファイル
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void setWribInfoCheck(JBSbatOutputItem outputInItem) throws Exception
	{
		// 作業領域の初期化
		String strErrorMessage = "";
		boolean isFileOutput = false;								// 検証結果ファイルは出力しない
		
		// 通常セット割検証
		if (boolNormalSetWribFlg && !boolDummySetWribFlg)
		{
			// SYSIDが複数指定なし かつ サービス契約回線内訳番号が複数指定なし⇒正常
			if (boolSysidMultiFlg || boolSvcKeiMultiFlg)			// SYSIDが複数指定 もしくは サービス契約回線内訳番号が複数指定
			{
				isFileOutput = true;								// 検証結果ファイル出力対象
				strErrorMessage = this.strConcatenate(strErrorMessage, MSG_CHECK_RESULT_01);
			}
		}
		
		// ダミーセット割検証
		if (!boolNormalSetWribFlg && boolDummySetWribFlg)
		{
			// SYSIDが複数指定あり または サービス契約回線内訳番号が複数指定あり⇒正常
			if (!boolSysidMultiFlg && !boolSvcKeiMultiFlg)			// SYSIDが複数指定なし かつ サービス契約回線内訳番号が複数指定なし
			{
				isFileOutput = true;								// 検証結果ファイル出力対象
				strErrorMessage = this.strConcatenate(strErrorMessage, MSG_CHECK_RESULT_01);
			}
		}
		
		// セット割未適用
		if (!boolNormalSetWribFlg && !boolDummySetWribFlg)
		{
			isFileOutput = true;								// 検証結果ファイル出力対象
			strErrorMessage = this.strConcatenate(strErrorMessage, MSG_CHECK_RESULT_01);
		}
		
		// セット割同時適用
		if (boolNormalSetWribFlg && boolDummySetWribFlg)
		{
			isFileOutput = true;								// 検証結果ファイル出力対象
			strErrorMessage = this.strConcatenate(strErrorMessage, MSG_CHECK_RESULT_02);
		}
		
		// 検証結果ファイルの出力
		if (isFileOutput)
		{
			for (JBSbatServiceInterfaceMap keepData : lstKeepData)
			{
				// 入出力インタフェースオブジェクトを生成
				JBSbatServiceInterfaceMap out_map = new JBSbatServiceInterfaceMap();
				
				// 出力項目を設定する
				out_map.setString(JBSbatKVIFM021.SVC_KEI_NO , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_KEI_NO)));								// サービス契約番号
				out_map.setString(JBSbatKVIFM021.SVC_KEI_STAT , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_KEI_STAT)));							// サービス契約ステータス
				out_map.setString(JBSbatKVIFM021.SVC_KEI_STAT_NM , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_KEI_STAT_NM)));						// サービス契約ステータス名称
				out_map.setString(JBSbatKVIFM021.PCRS_CD , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.PCRS_CD_SVC )));								// 料金コースコード
				out_map.setString(JBSbatKVIFM021.PCRS_NM , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.PCRS_NM_SVC)));									// 料金コース名
				out_map.setString(JBSbatKVIFM021.PPLAN_CD , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.PPLAN_CD_SVC )));								// 料金プランコード
				out_map.setString(JBSbatKVIFM021.PPLAN_NM , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.PPLAN_NM_SVC )));								// 料金プラン名
				out_map.setString(JBSbatKVIFM021.KAKINS_NO , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.KAKINS_NO )));								// 課金先番号
				out_map.setString(JBSbatKVIFM021.SEIKY_KEI_NO , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SEIKY_KEI_NO )));							// 請求契約番号
				out_map.setString(JBSbatKVIFM021.SVC_KEI_KAISEN_UCWK_NO , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_KEI_KAISEN_UCWK_NO )));		// サービス契約回線内訳番号
				out_map.setString(JBSbatKVIFM021.PLAN_STAYMD_SVC , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.PLAN_STAYMD_SVC )));					// プラン開始年月日(サービス)
				out_map.setString(JBSbatKVIFM021.PLAN_ENDYMD_SVC , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.PLAN_ENDYMD_SVC )));					// プラン終了年月日(サービス)
				out_map.setString(JBSbatKVIFM021.PLAN_CHRG_STAYMD_SVC , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.PLAN_CHRG_STAYMD_SVC )));			// プラン課金開始年月日(サービス)
				out_map.setString(JBSbatKVIFM021.PLAN_CHRG_ENDYMD_SVC , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.PLAN_CHRG_ENDYMD_SVC )));			// プラン課金終了年月日(サービス)
				out_map.setString(JBSbatKVIFM021.SVC_CANCEL_YMD_SVC , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_CANCEL_YMD_SVC )));				// サービスキャンセル年月日(サービス)
				out_map.setString(JBSbatKVIFM021.SVC_STA_YMD_SVC , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_STA_YMD_SVC )));					// サービス開始年月日(サービス)
				out_map.setString(JBSbatKVIFM021.SVC_CHRG_STAYMD_SVC , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_CHRG_STAYMD_SVC )));			// サービス課金開始年月日(サービス)
				out_map.setString(JBSbatKVIFM021.SVC_PAUSE_YMD_SVC , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_PAUSE_YMD_SVC )));				// サービス休止年月日(サービス)
				out_map.setString(JBSbatKVIFM021.SVC_PAUSE_RLS_YMD_SVC , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_PAUSE_RLS_YMD_SVC )));		// サービス休止解除年月日(サービス)
				out_map.setString(JBSbatKVIFM021.SVC_ENDYMD_SVC , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_ENDYMD_SVC )));						// サービス終了年月日(サービス)
				out_map.setString(JBSbatKVIFM021.SVC_CHRG_ENDYMD_SVC , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_CHRG_ENDYMD_SVC )));			// サービス課金終了年月日(サービス)
				out_map.setString(JBSbatKVIFM021.SVC_DSL_KISAN_YMD_SVC , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_DSL_KISAN_YMD_SVC )));		// サービス解約起算年月日(サービス)
				out_map.setString(JBSbatKVIFM021.SVC_DSL_YMD_SVC , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_DSL_YMD_SVC )));					// サービス解約年月日(サービス)
				out_map.setString(JBSbatKVIFM021.KAIHK_YMD_SVC , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.KAIHK_YMD_SVC )));						// 回復年月日(サービス)
				out_map.setString(JBSbatKVIFM021.SVC_CANCEL_CL_YMD_SVC , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_CANCEL_CL_YMD_SVC )));		// サービスキャンセル取消年月日(サービス)
				out_map.setString(JBSbatKVIFM021.SVC_DSL_CL_YMD_SVC , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_DSL_CL_YMD_SVC )));				// サービス解約取消年月日(サービス)
				out_map.setString(JBSbatKVIFM021.WRIB_SVC_KEI_NO , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.WRIB_SVC_KEI_NO )));					// 割引サービス契約番号
				out_map.setString(JBSbatKVIFM021.WRIB_SVC_KEI_STAT , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.WRIB_SVC_KEI_STAT )));				// 割引サービス契約ステータス
				out_map.setString(JBSbatKVIFM021.WRIB_SVC_KEI_STAT_NM , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.WRIB_SVC_KEI_STAT_NM )));			// 割引サービス契約ステータス名称
				out_map.setString(JBSbatKVIFM021.SYSID , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SYSID_WRIB )));									// SYSID
				out_map.setString(JBSbatKVIFM021.WRIB_SVC_CD , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.WRIB_SVC_CD )));							// 割引サービスコード
				out_map.setString(JBSbatKVIFM021.DSP_CAMPAIGN_CD , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.DSP_CAMPAIGN_CD )));					// 表示用キャンペーンコード
				out_map.setString(JBSbatKVIFM021.WRIB_SVC_NM , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.WRIB_SVC_NM )));							// 割引サービス名
				out_map.setString(JBSbatKVIFM021.PLAN_STAYMD_WRIB , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.PLAN_STAYMD_WRIB )));					// プラン開始年月日（割引）
				out_map.setString(JBSbatKVIFM021.PLAN_ENDYMD_WRIB , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.PLAN_ENDYMD_WRIB )));					// プラン終了年月日（割引）
				out_map.setString(JBSbatKVIFM021.PLAN_CHRG_STAYMD_WRIB , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.PLAN_CHRG_STAYMD_WRIB )));		// プラン課金開始年月日（割引）
				out_map.setString(JBSbatKVIFM021.PLAN_CHRG_ENDYMD_WRIB , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.PLAN_CHRG_ENDYMD_WRIB )));		// プラン課金終了年月日（割引）
				out_map.setString(JBSbatKVIFM021.PLAN_END_SBT_CD , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.PLAN_END_SBT_CD_WRIB )));				// プラン終了種別コード
				out_map.setString(JBSbatKVIFM021.SVC_CANCEL_YMD_WRIB , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_CANCEL_YMD_WRIB )));			// サービスキャンセル年月日（割引）
				out_map.setString(JBSbatKVIFM021.SVC_CANCEL_RSN_CD , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_CANCEL_RSN_CD_WRIB )));			// サービスキャンセル理由コード
				out_map.setString(JBSbatKVIFM021.SVC_STA_YMD_WRIB , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_STA_YMD_WRIB )));					// サービス開始年月日（割引）
				out_map.setString(JBSbatKVIFM021.SVC_CHRG_STAYMD_WRIB , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_CHRG_STAYMD_WRIB )));			// サービス課金開始年月日（割引）
				out_map.setString(JBSbatKVIFM021.SVC_ENDYMD_WRIB , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_ENDYMD_WRIB )));					// サービス終了年月日（割引）
				out_map.setString(JBSbatKVIFM021.SVC_CHRG_ENDYMD_WRIB , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_CHRG_ENDYMD_WRIB )));			// サービス課金終了年月日（割引）
				out_map.setString(JBSbatKVIFM021.SVC_DSL_YMD_WRIB , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_DSL_YMD_WRIB )));					// サービス解約年月日（割引）
				out_map.setString(JBSbatKVIFM021.KAIHK_YMD_WRIB , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.KAIHK_YMD )));							// 回復年月日（割引）
				out_map.setString(JBSbatKVIFM021.SVC_CANCEL_CL_YMD_WRIB , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_CANCEL_CL_YMD )));			// サービスキャンセル取消年月日（割引）
				out_map.setString(JBSbatKVIFM021.SVC_DSL_CL_YMD_WRIB , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.SVC_DSL_CL_YMD )));					// サービス解約取消年月日（割引）
				out_map.setString(JBSbatKVIFM021.INTR_CD , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.INTR_CD_WRIB )));								// 紹介コード
				out_map.setString(JBSbatKVIFM021.MSKM_KISAN_YMD , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.MSKM_KISAN_YMD )));						// 申込起算年月日
				out_map.setString(JBSbatKVIFM021.WRIB_ADD_OPTY_CD , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.WRIB_ADD_OPTY_CD )));					// 割引登録契機コード
				out_map.setString(JBSbatKVIFM021.WRIB_DSL_CNCL_OPTY_CD , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.WRIB_DSL_CNCL_OPTY_CD )));		// 割引解約キャンセル契機コード
				out_map.setString(JBSbatKVIFM021.WRIB_AMNT_SNST_STDARDYMD , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.WRIB_AMNT_SNST_STDARDYMD )));	// 割引額算出基準年月日
				out_map.setString(JBSbatKVIFM021.WRIB_CHRG_STA_MON_STI_CD , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.WRIB_CHRG_STA_MON_STI_CD )));	// 割引課金開始月指定コード
				out_map.setString(JBSbatKVIFM021.WRIB_ADD_YMD , rmvDoubleQuote(keepData.getString(JBSbatKVIFM020.WRIB_ADD_YMD )));							// 割引登録年月日
				out_map.setString(JBSbatKVIFM021.CHECK_RESULT , strErrorMessage);																			// 検証結果
				
				//出力フラグを設定
				out_map.setOutFlg(true);
				
				//出力共通電文に入出力インターフェースを設定する。
				outputInItem.addOutMapList(out_map);
			}
		}
	}

	/**
	 * 文字列の前後のダブルクォーテーションを除去します。
	 * 
	 * @param strChar 除去前文字列
	 * @return String 除去前文字列
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private String rmvDoubleQuote(String strChar) throws Exception
	{
		// 作業領域の初期化
		String fromtChar = "";
		String backChar = "";

		// NULL文字を空文字に置き換える
		if (strChar == null)
		{
			strChar = "";
		}
		
		//文字列の先頭１文字を除去
		if (strChar.length() > 0)
		{
			fromtChar = strChar.substring(0, 1);
			
			if (fromtChar.equals("\""))
			{
				strChar = strChar.substring(1, strChar.length());
			}
		}
		
		//文字列の後ろ１文字を除去
		if (strChar.length() > 0)
		{
			backChar = strChar.substring(strChar.length() - 1, strChar.length());
			
			if (backChar.equals("\""))
			{
				strChar = strChar.substring(0, strChar.length() - 1);
			}
		}
		
		return strChar;
	}

	/**
	 * 文字列を全角カンマで結合します。
	 * 
	 * @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 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(JBSbatKVIFM021.SVC_KEI_NO, 						COLUMN_01);		// サービス契約番号
		out_map.setString(JBSbatKVIFM021.SVC_KEI_STAT, 						COLUMN_02);		// サービス契約ステータス
		out_map.setString(JBSbatKVIFM021.SVC_KEI_STAT_NM, 					COLUMN_03);		// サービス契約ステータス名称
		out_map.setString(JBSbatKVIFM021.PCRS_CD, 							COLUMN_04);		// 料金コースコード
		out_map.setString(JBSbatKVIFM021.PCRS_NM, 							COLUMN_05);		// 料金コース名
		out_map.setString(JBSbatKVIFM021.PPLAN_CD, 							COLUMN_06);		// 料金プランコード
		out_map.setString(JBSbatKVIFM021.PPLAN_NM, 							COLUMN_07);		// 料金プラン名
		out_map.setString(JBSbatKVIFM021.KAKINS_NO, 						COLUMN_08);		// 課金先番号
		out_map.setString(JBSbatKVIFM021.SEIKY_KEI_NO, 						COLUMN_09);		// 請求契約番号
		out_map.setString(JBSbatKVIFM021.SVC_KEI_KAISEN_UCWK_NO, 			COLUMN_10);		// サービス契約回線内訳番号
		out_map.setString(JBSbatKVIFM021.PLAN_STAYMD_SVC, 					COLUMN_11);		// プラン開始年月日(サービス)
		out_map.setString(JBSbatKVIFM021.PLAN_ENDYMD_SVC, 					COLUMN_12);		// プラン終了年月日(サービス)
		out_map.setString(JBSbatKVIFM021.PLAN_CHRG_STAYMD_SVC, 				COLUMN_13);		// プラン課金開始年月日(サービス)
		out_map.setString(JBSbatKVIFM021.PLAN_CHRG_ENDYMD_SVC, 				COLUMN_14);		// プラン課金終了年月日(サービス)
		out_map.setString(JBSbatKVIFM021.SVC_CANCEL_YMD_SVC, 				COLUMN_15);		// サービスキャンセル年月日(サービス)
		out_map.setString(JBSbatKVIFM021.SVC_STA_YMD_SVC, 					COLUMN_16);		// サービス開始年月日(サービス)
		out_map.setString(JBSbatKVIFM021.SVC_CHRG_STAYMD_SVC, 				COLUMN_17);		// サービス課金開始年月日(サービス)
		out_map.setString(JBSbatKVIFM021.SVC_PAUSE_YMD_SVC, 				COLUMN_18);		// サービス休止年月日(サービス)
		out_map.setString(JBSbatKVIFM021.SVC_PAUSE_RLS_YMD_SVC, 			COLUMN_19);		// サービス休止解除年月日(サービス)
		out_map.setString(JBSbatKVIFM021.SVC_ENDYMD_SVC, 					COLUMN_20);		// サービス終了年月日(サービス)
		out_map.setString(JBSbatKVIFM021.SVC_CHRG_ENDYMD_SVC, 				COLUMN_21);		// サービス課金終了年月日(サービス)
		out_map.setString(JBSbatKVIFM021.SVC_DSL_KISAN_YMD_SVC, 			COLUMN_22);		// サービス解約起算年月日(サービス)
		out_map.setString(JBSbatKVIFM021.SVC_DSL_YMD_SVC, 					COLUMN_23);		// サービス解約年月日(サービス)
		out_map.setString(JBSbatKVIFM021.KAIHK_YMD_SVC, 					COLUMN_24);		// 回復年月日(サービス)
		out_map.setString(JBSbatKVIFM021.SVC_CANCEL_CL_YMD_SVC, 			COLUMN_25);		// サービスキャンセル取消年月日(サービス)
		out_map.setString(JBSbatKVIFM021.SVC_DSL_CL_YMD_SVC, 				COLUMN_26);		// サービス解約取消年月日(サービス)
		out_map.setString(JBSbatKVIFM021.WRIB_SVC_KEI_NO, 					COLUMN_27);		// 割引サービス契約番号
		out_map.setString(JBSbatKVIFM021.WRIB_SVC_KEI_STAT, 				COLUMN_28);		// 割引サービス契約ステータス
		out_map.setString(JBSbatKVIFM021.WRIB_SVC_KEI_STAT_NM, 				COLUMN_29);		// 割引サービス契約ステータス名称
		out_map.setString(JBSbatKVIFM021.SYSID, 							COLUMN_30);		// SYSID
		out_map.setString(JBSbatKVIFM021.WRIB_SVC_CD, 						COLUMN_31);		// 割引サービスコード
		out_map.setString(JBSbatKVIFM021.DSP_CAMPAIGN_CD, 					COLUMN_32);		// 表示用キャンペーンコード
		out_map.setString(JBSbatKVIFM021.WRIB_SVC_NM, 						COLUMN_33);		// 割引サービス名
		out_map.setString(JBSbatKVIFM021.PLAN_STAYMD_WRIB, 					COLUMN_34);		// プラン開始年月日（割引）
		out_map.setString(JBSbatKVIFM021.PLAN_ENDYMD_WRIB, 					COLUMN_35);		// プラン終了年月日（割引）
		out_map.setString(JBSbatKVIFM021.PLAN_CHRG_STAYMD_WRIB, 			COLUMN_36);		// プラン課金開始年月日（割引）
		out_map.setString(JBSbatKVIFM021.PLAN_CHRG_ENDYMD_WRIB, 			COLUMN_37);		// プラン課金終了年月日（割引）
		out_map.setString(JBSbatKVIFM021.PLAN_END_SBT_CD, 					COLUMN_38);		// プラン終了種別コード
		out_map.setString(JBSbatKVIFM021.SVC_CANCEL_YMD_WRIB, 				COLUMN_39);		// サービスキャンセル年月日（割引）
		out_map.setString(JBSbatKVIFM021.SVC_CANCEL_RSN_CD, 				COLUMN_40);		// サービスキャンセル理由コード
		out_map.setString(JBSbatKVIFM021.SVC_STA_YMD_WRIB, 					COLUMN_41);		// サービス開始年月日（割引）
		out_map.setString(JBSbatKVIFM021.SVC_CHRG_STAYMD_WRIB, 				COLUMN_42);		// サービス課金開始年月日（割引）
		out_map.setString(JBSbatKVIFM021.SVC_ENDYMD_WRIB, 					COLUMN_43);		// サービス終了年月日（割引）
		out_map.setString(JBSbatKVIFM021.SVC_CHRG_ENDYMD_WRIB, 				COLUMN_44);		// サービス課金終了年月日（割引）
		out_map.setString(JBSbatKVIFM021.SVC_DSL_YMD_WRIB, 					COLUMN_45);		// サービス解約年月日（割引）
		out_map.setString(JBSbatKVIFM021.KAIHK_YMD_WRIB, 					COLUMN_46);		// 回復年月日（割引）
		out_map.setString(JBSbatKVIFM021.SVC_CANCEL_CL_YMD_WRIB, 			COLUMN_47);		// サービスキャンセル取消年月日（割引）
		out_map.setString(JBSbatKVIFM021.SVC_DSL_CL_YMD_WRIB, 				COLUMN_48);		// サービス解約取消年月日（割引）
		out_map.setString(JBSbatKVIFM021.INTR_CD, 							COLUMN_49);		// 紹介コード
		out_map.setString(JBSbatKVIFM021.MSKM_KISAN_YMD, 					COLUMN_50);		// 申込起算年月日
		out_map.setString(JBSbatKVIFM021.WRIB_ADD_OPTY_CD, 					COLUMN_51);		// 割引登録契機コード
		out_map.setString(JBSbatKVIFM021.WRIB_DSL_CNCL_OPTY_CD, 			COLUMN_52);		// 割引解約キャンセル契機コード
		out_map.setString(JBSbatKVIFM021.WRIB_AMNT_SNST_STDARDYMD, 			COLUMN_53);		// 割引額算出基準年月日
		out_map.setString(JBSbatKVIFM021.WRIB_CHRG_STA_MON_STI_CD, 			COLUMN_54);		// 割引課金開始月指定コード
		out_map.setString(JBSbatKVIFM021.WRIB_ADD_YMD, 						COLUMN_55);		// 割引登録年月日
		out_map.setString(JBSbatKVIFM021.CHECK_RESULT, 						COLUMN_56);		// 検証結果
		
		//出力フラグを設定
		out_map.setOutFlg(true);
		
		//出力共通電文に入出力インターフェースを設定する。
		outputInItem.addOutMapList(out_map);
	}
}
