/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACKcatJgskanOpMshSksi
*	ソースファイル名	：JBSbatACKcatJgskanOpMshSksi.java
*	作成者				：富士通　
*	作成日				：2012年01月18日
*＜機能概要＞
*　ＫＣＡＴ事業者間精算オプション明細表作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/01/18   富士通		新規作成
*	v3.00		2012/08/03   FJ）冨井	【TGI-2012-0000054】ダミーレコード設定位置修正
*	v3.01		2012/09/12   FJ）冨井	【ST1-2012-0000530】オプションサービス契約、料金項目出力名称検索 修正　ＤＢ未存在処理（KK_T_OP_SVC_KEI_AC_SELECT_004） 削除
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;

import eo.business.common.JACBatCommon;
import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JACbatSchdlUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.util.file.JBSbatACIFM111;
import eo.business.util.file.JBSbatACIFM118;
import eo.business.util.table.JBSbatCH_M_PRC_KMK_CS_CHGE;
import eo.business.util.table.JBSbatCH_M_PRC_KMK_OPUT_NM;
import eo.business.util.table.JBSbatKK_T_OP_SVC_KEI;
import eo.business.util.table.JBSbatKK_T_SVC_KEI;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JPCFomatString;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.util.JBSbatBusinessFileUtil;


/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACKcatJgskanOpMshSksi extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(料金項目出力名称)*/
	private static final String D_TBL_NAME_CH_M_PRC_KMK_OPUT_NM = "CH_M_PRC_KMK_OPUT_NM";

	/** テーブル(オプションサービス契約)*/
	private static final String D_TBL_NAME_KK_T_OP_SVC_KEI = "KK_T_OP_SVC_KEI";

	/** SQL定義キー(AC_SELECT_009)*/
	private static final String CH_M_PRC_KMK_OPUT_NM_AC_SELECT_009 = "AC_SELECT_009";

	/** SQL定義キー(AC_SELECT_004)*/
	private static final String KK_T_OP_SVC_KEI_AC_SELECT_004 = "AC_SELECT_004";

	/** テーブルアクセスクラス(料金項目出力名称)*/
	private JBSbatSQLAccess db_CH_M_PRC_KMK_OPUT_NM = null;

	/** テーブルアクセスクラス(オプションサービス契約)*/
	private JBSbatSQLAccess db_KK_T_OP_SVC_KEI = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 退避．オプションチャンネル名称マップ */
	private HashMap<String, String>tihOpChannelNmMap = null;
	
	/** 請求年月 */
	private String sikyYm 			= JACStrConst.KARA_MOJI;
	
	/** ファイル名（フルパス） */
	private String fileNm 			= JACStrConst.KARA_MOJI;
	
	/** ファイルインスタンス */
	private JBSbatBusinessFileUtil outFileObj = null;
	
	/** 前回キー（縦位置＋精算項目コード） */
	private String prvKey = JACStrConst.KARA_MOJI;
	
	/** ファイル識別判定変更フラグ */
	private String fileSkbtChgFlg = JACStrConst.KARA_MOJI;
	
	/** 出力情報 */
	private HashMap<String, Object> tmpOutputInf = null;
	
	/** 出力件数 */
	private int outputCnt = 0;
	
	/** 出力情報設定キーリスト */
	private ArrayList<String>outputKeyList = null;
	
	/** 検索キー */
	private String tmpKey = JACStrConst.KARA_MOJI;
	
	/** 業務機能識別コード：オプションチャンネル明細 */
	private String wkOptChMs = null;
	
	/** KCAT事業者間精算オプション情報マップ */
	private HashMap<String, HashMap<String, String>> kcatJgskOptInfoMap = null;
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_CH_M_PRC_KMK_OPUT_NM = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_KMK_OPUT_NM);
		db_KK_T_OP_SVC_KEI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_KK_T_OP_SVC_KEI);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][opeDate=" + super.opeDate + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][freeItem=" + super.freeItem + "]");
		
		// 外部パラメータを分割します。
		String[] freeItems = super.freeItem.split(JACStrConst.SEMI_COLON);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][freeItems=" + freeItems[0] + ", " + freeItems[1] + "]");
		
		// ファイル名・ファイルインスタンス取得
		// ファイルID取得
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);
		String fileId = JACStrConst.KARA_MOJI;
		try
		{
			// 業務機能識別コード(オプションチャンネル明細)取得
			this.wkOptChMs 		= paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_WKS_OP_CHNEL_DTL);
			// ファイルID取得
			fileId 				= paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_KCAT_OP_DTL_FID);
		}
		finally
		{
			paramUtil.close();
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][wkOptChMs=" + this.wkOptChMs + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][fileId=" + fileId + "]");
		// オプションチャンネル名称取得
		makeOpChannelNmMap();
		
		// 請求年月を取得します。
		getSikyYm();
		
		// ファイル生成します。
		// （引数：バッチ共通パラメータ, ファイルID, ファイル分割有無, ファイル連番, 請求年月, 自由設定, 文字コード, 変換前改行コード）
		ArrayList<Object> fileInf = JACBatCommon.geneFile(commonItem,
														fileId,
														freeItems[0],
														freeItems[1],
														this.sikyYm,
														JACStrConst.KARA_MOJI,
														JACStrConst.KARA_MOJI,
														JACStrConst.KARA_MOJI,
														JACStrConst.LINE_CRLF);
		
		this.fileNm 		= (String)fileInf.get(0);						// ファイル名（フルパス）
		this.outFileObj 	= (JBSbatBusinessFileUtil)fileInf.get(2);		// ファイルインスタンス
		
		// 出力情報設定キーリストを作成します。
		this.makeOutputKeyList();
		
		this.tmpOutputInf = new HashMap<String, Object>();
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][fileNm=" + this.fileNm + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
		
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * オプションチャンネル名称マップを作成します。
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeOpChannelNmMap() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOpChannelNmMap]");
		
		JBSbatCommonDBInterface whereParam = new JBSbatCommonDBInterface();
		whereParam.setValue(super.systemCode); 								// システムコード
		whereParam.setValue(this.wkOptChMs); 								// 業務機能識別コード(オプションチャンネル明細)
		whereParam.setValue(JACStrConst.CHSHT_CHG_CD_1); 					// 抽出変換コード：1
		whereParam.setValue(super.opeDate); 								// 予約適用年月日
		whereParam.setValue(super.opeDate); 								// 料金項目抽出変換適用開始年月日
		whereParam.setValue(super.opeDate); 								// 料金項目抽出変換適用終了年月日
		whereParam.setValue(JACStrConst.PRC_KMK_NM_SBT_CD_JGSYA_KMK_NM); 	// 料金項目名称種別コード
		whereParam.setValue(super.opeDate); 								// 予約適用年月日
		whereParam.setValue(super.opeDate); 								// 料金項目出力名称適用開始年月日
		whereParam.setValue(super.opeDate); 								// 料金項目出力名称適用終了年月日
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOpChannelNmMap][whereParam=" + whereParam.getList().toString() + "]");
		
		// 料金コーススキーマを検索します。
		executeCH_M_PRC_KMK_OPUT_NM_AC_SELECT_009(whereParam.getList().toArray());
		
		JBSbatCommonDBInterface dbMap = db_CH_M_PRC_KMK_OPUT_NM.selectNext();
		
		// 取得できなかった場合
		if(null == dbMap)
		{
			// 該当データなし
			String[] msgParam = new String[]
			{ JBSbatCH_M_PRC_KMK_OPUT_NM.TABLE_NAME, whereParam.getList().toString() };
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0240CW, msgParam);
		}
		
		this.tihOpChannelNmMap = new HashMap<String, String>();
		
		while(null != dbMap)
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOpChannelNmMap][dbMap=" + dbMap.getMap().toString() + "]");

			// 値をマップに設定（KEY:料金コースコード ＋ 料金サービスコード、VALUE:料金項目名称） サービスコード空白がはいるためトリムして格納
			this.tihOpChannelNmMap.put(this.makeStr(dbMap.getString(JBSbatCH_M_PRC_KMK_OPUT_NM.PCRS_CD), dbMap.getString(JBSbatCH_M_PRC_KMK_OPUT_NM.PRC_SVC_CD).trim()),
														dbMap.getString(JBSbatCH_M_PRC_KMK_OPUT_NM.PRC_KMK_NM));
			
			dbMap = db_CH_M_PRC_KMK_OPUT_NM.selectNext();
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOpChannelNmMap]");
	}
	
	/**
	 * 請求年月を取得します。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void getSikyYm() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getSikyYm]");
		
		JACbatSchdlUtil su = new JACbatSchdlUtil(commonItem);
		try
		{
			// 請求年月取得
			this.sikyYm = su.getBillDate(super.opeDate, JACStrConst.EVENT_CD_RYOKIN_KEISAN_YMD);
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getSikyYm][sikyYm=" + this.sikyYm + "]");
		}
		finally
		{
			su.close();
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getSikyYm]");
		return;
	}
	
	/**
	 * 出力情報設定キーリストを作成します。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeOutputKeyList() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputKeyList]");
		
		this.outputKeyList = new ArrayList<String>(10);
		
		this.outputKeyList.add(JBSbatACIFM111.SVC_KEI_NO);				// サービス契約番号
		this.outputKeyList.add(JBSbatACIFM111.SEIKY_KEI_NO);			// 請求契約番号
		this.outputKeyList.add(JBSbatACIFM111.OP_CD);					// オプションコード
		this.outputKeyList.add(JBSbatACIFM111.OP_CHANNEL_NM);			// オプションチャンネル名称
		this.outputKeyList.add(JBSbatACIFM111.CHRG_STA_YMD);			// 課金開始日
		this.outputKeyList.add(JBSbatACIFM111.KOJI_FIN_YMD);			// 工事完了日
		this.outputKeyList.add(JBSbatACIFM111.DSL_KISAN_YMD);			// 解約起算日
		this.outputKeyList.add(JBSbatACIFM111.OP_USE_PRC);				// オプション利用料
		this.outputKeyList.add(JBSbatACIFM111.OP_USE_PRC_GENGAKU_CP);	// オプション利用料減額（ＣＰ）
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutputKeyList][=" + this.outputKeyList.toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputKeyList]");
	}
	
	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @param outputInItem 入力情報
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputInItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert 	inMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][inMap=" + inMap.getMap().toString() + "]") : true;
		
		//1件目のレコードの場合
		if(!outputInItem.isOutMapList())
		{
			// ダミーレコードセット
			outputInItem.addOutMapList(new JBSbatServiceInterfaceMap());
		}
		
		// ＫＣＡＴ事業者間精算オプション明細表作成
		// 退避．前回キー ≠ WKキー（入力情報．縦位置　＋　入力情報．精算項目コード）の場合
		// 入力情報＝nullの場合
		if(null == inMap)
		{
			// 出力されていない情報が存在している場合
			if(!this.tmpOutputInf.isEmpty())
			{
				// ファイル出力処理
				this.outputRecord();
			}
			
			String[] outCntMsg = {JACStrConst.LOG_MSG_EXECUTE, String.valueOf(this.outputCnt)};
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0560AI, outCntMsg);
			
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
			return outputInItem;
		}
		
		String fileSkbtFlg = inMap.getString(JBSbatACIFM118.FILE_SKBT_FLG);		// ファイル識別フラグ
		
		// WKキー（サービス契約番号＋料金コースコード＋縦位置＋精算項目コード）
		String wkKey = this.makeStr(inMap.getString(JBSbatACIFM118.SVKEI_NO),
									inMap.getString(JBSbatACIFM118.PCRS_CD),
									inMap.getString(JBSbatACIFM118.LENGTH_POSITION),
									inMap.getString(JBSbatACIFM118.SSN_KMK_CD));
		
		
		// ファイル識別フラグ＝ヘッダの場合
		if(JACStrConst.OUTDATASKBT_HEADER.equals(fileSkbtFlg))
		{
			assert this.prvKey != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][prvKey=" + this.prvKey + "]") : true;
			assert wkKey != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][wkKey=" + wkKey + "]") : true;
			
			// 前回キー≠WKキーの場合
			if(!this.prvKey.equals(wkKey))
			{
				// 前回キー＝""（空）の場合
				if(JACStrConst.KARA_MOJI.equals(this.prvKey))
				{
					// ファイル識別変更フラグ　退避
					this.fileSkbtChgFlg = fileSkbtFlg;
				}
				
				// 出力されていない情報が存在している場合
				if(!this.tmpOutputInf.isEmpty())
				{
					// ファイル出力処理
					this.outputRecord();
				}
				// キー退避
				this.prvKey = wkKey;
			}
			// ヘッダ情報作成処理を行います。
			this.makeHedderInf(inMap);
		}
		
		// ファイル識別フラグ＝明細の場合
		else if(JACStrConst.OUTDATASKBT_DTL.equals(fileSkbtFlg))
		{
			// 退避．ファイル識別変更フラグ　≠　入力．ファイル識別フラグ
			if(!this.fileSkbtChgFlg.equals(fileSkbtFlg))
			{
				// ファイル出力処理
				this.outputRecord();
				
				// ファイル識別変更フラグ　退避
				this.fileSkbtChgFlg = fileSkbtFlg;
				
				// 前回キー　初期化
				this.prvKey = JACStrConst.KARA_MOJI;
			}
			
			// 退避．検索キー ≠ 入力情報．サービス契約番号の場合
			// キー作成
			String key = makeStr(inMap.getString(JBSbatACIFM118.SVKEI_NO), inMap.getString(JBSbatACIFM118.PCRS_CD));
		
			if(!this.tmpKey.equals(key))
			{
				// オプションサービス契約よりオプション情報取得
				this.selectOpSvcKei(inMap);
			}
			
			assert this.prvKey != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][prvKey=" + this.prvKey + "]") : true;
			assert wkKey != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][execute][wkKey=" + wkKey + "]") : true;
			
			// 前回キー≠WKキーの場合
			if(!this.prvKey.equals(wkKey))
			{
				// 前回キー≠""（空）の場合
				if(!JACStrConst.KARA_MOJI.equals(this.prvKey))
				{
					// ファイル出力処理
					this.outputRecord();
				}
				
				// キー退避
				this.prvKey = wkKey;
			}
			// 明細情報作成処理を行います。
			this.makeDtlInf(inMap);
		}
	
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputInItem;
		

	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * ファイルを出力します。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void outputRecord() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][outputRecord]");
		
		// ファイル出力を行う
		JCCBatCommon.printBusinessFileUtil(this.outFileObj, this.chgMapToList());
		
		this.outputCnt++; 			// 出力件数カウントアップ
		this.tmpOutputInf.clear(); 	// 出力情報クリア
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][outputRecord]");
	}
	
	/**
	 * マップをリストに詰め替えます。
	 * @return ArrayList 出力情報（リスト）
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private ArrayList<Object> chgMapToList() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][chgMapToList]");
		
		ArrayList<Object> outList = new ArrayList<Object>(10);
		
		int size = this.outputKeyList.size();
		
		for(int i = 0; i < size; i++)
		{
			// 出力情報キーリスト．VALUEが出力情報のキーに含まれる場合
			if(this.tmpOutputInf.containsKey(this.outputKeyList.get(i)))
			{
				Object value = this.tmpOutputInf.get(this.outputKeyList.get(i));
				
				// 出力情報の値がnullの場合
				if(value == null)
				{
					outList.add(JACStrConst.KARA_MOJI);		// 空文字
				}
				// 上記以外の場合
				else
				{
					outList.add(value);						// 取得した値
				}
			}
			else
			{
				outList.add(JACStrConst.KARA_MOJI);		// 空文字
			}
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][chgMapToList][outList=" + outList.toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][chgMapToList]");
		return outList;
	}
	
	
	/**
	 * 文字を連結します
	 * @param string　文字
	 * @return strBuf　連結した文字列
	 */
	private String makeStr(String ...string)
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeStr]");
		
		StringBuffer strBuf = new StringBuffer();
		for(String str:string){
			strBuf.append(str);
		}
		assert strBuf != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeStr][outputItem = " + strBuf.toString() + "]") : true;
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeStr]");
		
		return strBuf.toString();
	}
	
	/**
	 * 項目編集識別コードを判定して、結果を返します。
	 * @param kmkHenshuSkbtCd 項目編集識別コード
	 * @param str             編集する値
	 * @return String         カンマ区切りを行った結果を返却。
	 * @throws Exception      業務サービス内で発生した例外全般。
	 */
	private String makeOutputStr(String kmkHenshuSkbtCd, String str) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeStr]");
		
		// 入力．項目編集識別コード　＝　"1"（数値桁区切り）の場合
		if(JACStrConst.KMK_HENSHU_SKBT_CD_DIGIT.equals(kmkHenshuSkbtCd))
		{
			// カンマ区切りを行う
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputStr]");
			return JPCFomatString.formatNumber(str);
		}
		// 上記以外の場合
		else
		{
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputStr]");
			return str;	
		}
	}
	
	/**
	 * ヘッダ情報を作成します。
	 * 
	 * @param inMap 入力電文
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeHedderInf(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeHedderInf]");
		
		// 出力情報が存在していない場合
		if(null == this.tmpOutputInf)
		{
			// 出力情報生成
			this.tmpOutputInf = new HashMap<String, Object>();
		}
		
		// 横位置
		int sidePosition = Integer.parseInt(inMap.getString(JBSbatACIFM118.SIDE_POSITION));
		
		// 横位置　≦　退避．出力情報設定キーリストのサイズの場合
		if(sidePosition <= this.outputKeyList.size() && sidePosition > 0)
		{
			this.tmpOutputInf.put(this.outputKeyList.get(sidePosition - 1),
									makeOutputStr(inMap.getString(JBSbatACIFM118.KMK_HENSHU_SKBT_CD), inMap.getString(JBSbatACIFM118.OUTPUT_KMK)));		// 出力値
		}

		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeHedderInf]");
	}
	
	/**
	 * オプションサービス契約を検索します。
	 * @param inMap 入力電文
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void selectOpSvcKei(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][selectOpSvcKei]");
		
		JBSbatCommonDBInterface whereParam = new JBSbatCommonDBInterface();
		// KCAT事業者間精算オプション情報マップを初期化
		this.kcatJgskOptInfoMap = new HashMap<String, HashMap<String, String>>();

		// 入力.サービス契約番号
		String svcKeiNo 	= inMap.getString(JBSbatACIFM118.SVKEI_NO);
		// 入力.料金コースコード
		String pcrsCd 		= inMap.getString(JBSbatACIFM118.PCRS_CD);
		
		whereParam.setValue(super.systemCode);			 	// システムコード
		whereParam.setValue(this.wkOptChMs);			 	// 業務機能識別コード(オプションチャンネル明細)
		whereParam.setValue(JACStrConst.CHSHT_CHG_CD_1); 	// 抽出変換コード：1
		whereParam.setValue(super.opeDate);					// 予約適用年月日
		whereParam.setValue(super.opeDate);					// 料金項目抽出変換適用開始年月日
		whereParam.setValue(super.opeDate);					// 料金項目抽出変換適用終了年月日
		whereParam.setValue(svcKeiNo);						// サービス契約番号
		whereParam.setValue(super.opeDate);					// 予約適用年月日
		whereParam.setValue(svcKeiNo);						// サービス契約番号
		whereParam.setValue(super.opeDate);					// 予約適用年月日
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][selectOpSvcKei][whereParam=" + whereParam.getList().toString() + "]");
		
		// サービス契約スキーマを検索します。
		executeKK_T_OP_SVC_KEI_AC_SELECT_004(whereParam.getList().toArray());
		
		JBSbatCommonDBInterface dbMap = db_KK_T_OP_SVC_KEI.selectNext();
		
		// 取得件数分マップに格納
		while(dbMap != null)
		{
			// KCAT事業者間精算オプション情報マップにキーと値を設定：キー：料金項目コード 値：取得結果格納マップ
			this.kcatJgskOptInfoMap.put(dbMap.getString(JBSbatCH_M_PRC_KMK_CS_CHGE.PRC_KMK_CD), makeDBMap(dbMap));
			dbMap = db_KK_T_OP_SVC_KEI.selectNext();
		}

		// 検索キーに入力情報．サービス契約番号を設定
		this.tmpKey 	= makeStr(svcKeiNo, pcrsCd);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][selectSvcKei]");
	}
	
	/**
	 * 取得結果格納処理
	 * @param  dbMap
	 * @return tempMap
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private HashMap<String, String> makeDBMap(JBSbatCommonDBInterface dbMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeDBMap]");
		HashMap<String, String> tempMap = new HashMap<String, String>();
		tempMap.put(JBSbatKK_T_OP_SVC_KEI.PPLAN_CD, 		dbMap.getString(JBSbatKK_T_OP_SVC_KEI.PPLAN_CD)); 			// 料金プランコード
		tempMap.put(JBSbatKK_T_OP_SVC_KEI.OP_SVC_CD, 		dbMap.getString(JBSbatKK_T_OP_SVC_KEI.OP_SVC_CD)); 			// オプションサービスコード
		tempMap.put(JBSbatKK_T_OP_SVC_KEI.SVC_CHRG_STAYMD, 	dbMap.getString(JBSbatKK_T_OP_SVC_KEI.SVC_CHRG_STAYMD)); 	// サービス課金開始年月日
		tempMap.put(JBSbatKK_T_OP_SVC_KEI.SVC_CHRG_ENDYMD, 	dbMap.getString(JBSbatKK_T_OP_SVC_KEI.SVC_CHRG_ENDYMD)); 	// サービス課金終了年月日
		tempMap.put(JBSbatKK_T_OP_SVC_KEI.SVC_STAYMD, 		dbMap.getString(JBSbatKK_T_OP_SVC_KEI.SVC_STAYMD)); 		// サービス開始年月日
		
		// 料金コースコード ＋ 料金プランコードをキーにオプションチャンネル名称マップを検索
		String key = this.makeStr(dbMap.getString(JBSbatKK_T_SVC_KEI.PCRS_CD), dbMap.getString(JBSbatKK_T_OP_SVC_KEI.PPLAN_CD));
		if(this.tihOpChannelNmMap.containsKey(key))
		{
			// 該当データありの場合、オプションチャンネル名称マップより値を取得しマップに格納
			tempMap.put(JBSbatACIFM111.OP_CHANNEL_NM, 	this.tihOpChannelNmMap.get(key)); 	// オプションチャンネル名称
		}
		else
		{
			// 該当データなしの場合、未設定
			tempMap.put(JBSbatACIFM111.OP_CHANNEL_NM, 	JACStrConst.KARA_MOJI); // オプションチャンネル名称
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeDBMap]");
		return tempMap;
	}

	/**
	 * 明細情報を作成します。
	 * @param inMap  入力電文
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeDtlInf(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeDtlInf]");
		// 精算項目コード
		String ssnKmkCd 		= inMap.getString(JBSbatACIFM118.SSN_KMK_CD);
		// 項目編集識別コード
		String kmkHenshuSkbtCd 	= inMap.getString(JBSbatACIFM118.KMK_HENSHU_SKBT_CD);
		// 横位置
		int sidePosition 		= Integer.parseInt(inMap.getString(JBSbatACIFM118.SIDE_POSITION));
		
		// 出力情報が存在していない場合
		if(null == this.tmpOutputInf)
		{
			// 出力情報生成
			this.tmpOutputInf = new HashMap<String, Object>();
		}
		
		// 横位置　≦　退避．出力情報設定キーリストのサイズ　かつ　横位置　＞　0の場合
		if(sidePosition <= this.outputKeyList.size() && sidePosition > 0)
		{
			// 未設定の場合
			if(!this.tmpOutputInf.containsKey(sidePosition - 1))
			{
				switch(sidePosition)
				{
				case 3:
					// 入力情報．精算項目コードが退避．KCAT事業者間精算オプション情報マップのキーに含まれる場合
					if(this.kcatJgskOptInfoMap.containsKey(ssnKmkCd))
					{
						// KCAT事業者間精算オプション情報マップの該当データよりオプションサービスコードを取得
						String opCd = this.kcatJgskOptInfoMap.get(ssnKmkCd).get(JBSbatKK_T_OP_SVC_KEI.OP_SVC_CD);
						// オプションコード　設定
						this.tmpOutputInf.put(JBSbatACIFM111.OP_CD,	makeOutputStr(kmkHenshuSkbtCd, opCd));
					}
					break;
				case 4:
					// 入力情報．精算項目コードが退避．KCAT事業者間精算オプション情報マップのキーに含まれる場合
					if(this.kcatJgskOptInfoMap.containsKey(ssnKmkCd))
					{
						// KCAT事業者間精算オプション情報マップの該当データよりオプションチャンネル名称を取得
						String optchNM = this.kcatJgskOptInfoMap.get(ssnKmkCd).get(JBSbatACIFM111.OP_CHANNEL_NM);
						// オプションチャンネル名称　設定
						this.tmpOutputInf.put(JBSbatACIFM111.OP_CHANNEL_NM,	makeOutputStr(kmkHenshuSkbtCd, optchNM));
					}
					break;
				case 5:
					// 入力情報．精算項目コードが退避．KCAT事業者間精算オプション情報マップのキーに含まれる場合
					if(this.kcatJgskOptInfoMap.containsKey(ssnKmkCd))
					{
						// KCAT事業者間精算オプション情報マップの該当データよりサービス課金開始年月日を取得
						String chgeStaYMD = this.kcatJgskOptInfoMap.get(ssnKmkCd).get(JBSbatKK_T_OP_SVC_KEI.SVC_CHRG_STAYMD);
						// 課金開始日　設定
						this.tmpOutputInf.put(JBSbatACIFM111.CHRG_STA_YMD,	makeOutputStr(kmkHenshuSkbtCd, chgeStaYMD));
					}
					break;
				case 6:
					// 入力情報．精算項目コードが退避．KCAT事業者間精算オプション情報マップのキーに含まれる場合
					if(this.kcatJgskOptInfoMap.containsKey(ssnKmkCd))
					{
						// KCAT事業者間精算オプション情報マップの該当データよりサービス開始年月日を取得
						String kojiFinYMD = this.kcatJgskOptInfoMap.get(ssnKmkCd).get(JBSbatKK_T_OP_SVC_KEI.SVC_STAYMD);
						// 工事完了日　設定
						this.tmpOutputInf.put(JBSbatACIFM111.KOJI_FIN_YMD,	makeOutputStr(kmkHenshuSkbtCd, kojiFinYMD));
					}
					break;
				case 7:
					// 入力情報．精算項目コードが退避．KCAT事業者間精算オプション情報マップのキーに含まれる場合かつ
					if(this.kcatJgskOptInfoMap.containsKey(ssnKmkCd))
					{
						// KCAT事業者間精算オプション情報マップの該当データよりサービス課金終了年月日を取得
						String dslKisanYMD = this.kcatJgskOptInfoMap.get(ssnKmkCd).get(JBSbatKK_T_OP_SVC_KEI.SVC_CHRG_ENDYMD);
						// 解約起算日　設定
						this.tmpOutputInf.put(JBSbatACIFM111.DSL_KISAN_YMD,	makeOutputStr(kmkHenshuSkbtCd, dslKisanYMD));
					}
					break;
				case 8:
					// 入力情報．精算項目コードの下2けた ＝ "01"(料金)の場合
					if(JACStrConst.PRC_KMK_CD_PRC.equals(ssnKmkCd.substring(9, 11)))
					{
						this.tmpOutputInf.put(JBSbatACIFM111.OP_USE_PRC,	makeOutputStr(kmkHenshuSkbtCd, inMap.getString(JBSbatACIFM118.OUTPUT_KMK)));
					}
					break;
				case 9:
					// 入力情報．精算項目コードの下2けた ＝ "15"(減額)の場合
					if(JACStrConst.PRC_KMK_CD_GENGAKU.equals(ssnKmkCd.substring(9, 11)))
					{
						this.tmpOutputInf.put(JBSbatACIFM111.OP_USE_PRC_GENGAKU_CP,	makeOutputStr(kmkHenshuSkbtCd, inMap.getString(JBSbatACIFM118.OUTPUT_KMK)));
					}
					break;
				default:
					// カンマ区切りを行う
					this.tmpOutputInf.put(this.outputKeyList.get(sidePosition - 1),
											makeOutputStr(kmkHenshuSkbtCd, inMap.getString(JBSbatACIFM118.OUTPUT_KMK)));	// 出力値
				}
			}
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeDtlInf][tmpOutputInf=" + tmpOutputInf.toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeDtlInf]");
	}
	
	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_CH_M_PRC_KMK_OPUT_NM.close();
		db_KK_T_OP_SVC_KEI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		
		// ファイルインスタンスがNULLでない場合
		if(null != this.outFileObj)
		{
			// ファイルクローズ
			JCCBatCommon.closeBusinessFileUtil(this.outFileObj);
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	
	/**
	 * SQLKEY(AC_SELECT_009)で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_KMK_OPUT_NM_AC_SELECT_009(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());
		paramList.setValue(param[4].toString());
		paramList.setValue(param[5].toString());
		paramList.setValue(param[6].toString());
		paramList.setValue(param[7].toString());
		paramList.setValue(param[8].toString());
		paramList.setValue(param[9].toString());

		// DBアクセスを実行します
		db_CH_M_PRC_KMK_OPUT_NM.selectBySqlDefine(paramList, CH_M_PRC_KMK_OPUT_NM_AC_SELECT_009);
	}

	/**
	 * SQLKEY(AC_SELECT_004)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	システムコード
	 *		 	業務機能識別コード
	 *		 	抽出変換コード
	 *		 	予約適用年月日
	 *		 	料金項目抽出変換適用開始年月日
	 *		 	料金項目抽出変換適用終了年月日
	 *		 	サービス契約番号
	 *		 	予約適用年月日
	 *		 	サービス契約番号
	 *		 	予約適用年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeKK_T_OP_SVC_KEI_AC_SELECT_004(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());
		paramList.setValue(param[3].toString());
		paramList.setValue(param[4].toString());
		paramList.setValue(param[5].toString());
		paramList.setValue(param[6].toString());
		paramList.setValue(param[7].toString());
		paramList.setValue(param[8].toString());
		paramList.setValue(param[9].toString());

		// DBアクセスを実行します
		db_KK_T_OP_SVC_KEI.selectBySqlDefine(paramList, KK_T_OP_SVC_KEI_AC_SELECT_004);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
}
