/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACKcatJsKmkhSksi
*	ソースファイル名	：JBSbatACKcatJsKmkhSksi.java
*	作成者				：富士通　
*	作成日				：2012年01月20日
*＜機能概要＞
*　ＫＣＡＴ事業者間精算項目表作成部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2012/01/20   富士通		新規作成
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

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.JBSbatACIFM107;
import eo.business.util.file.JBSbatACIFM110;
import eo.business.util.table.JBSbatAC_M_FILE_OPUT_CTRL;
import eo.business.util.table.JBSbatCH_M_PRC_KMK_OPUT_NM;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JPCFomatString;
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.JBSbatBusinessFileUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACKcatJsKmkhSksi extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(ファイル出力制御)*/
	private static final String D_TBL_NAME_AC_M_FILE_OPUT_CTRL = "AC_M_FILE_OPUT_CTRL";

	/** テーブル(料金項目出力名称)*/
	private static final String D_TBL_NAME_CH_M_PRC_KMK_OPUT_NM = "CH_M_PRC_KMK_OPUT_NM";

	/** SQL定義キー(AC_SELECT_006)*/
	private static final String AC_M_FILE_OPUT_CTRL_AC_SELECT_006 = "AC_SELECT_006";

	/** SQL定義キー(AC_SELECT_006)*/
	private static final String CH_M_PRC_KMK_OPUT_NM_AC_SELECT_006 = "AC_SELECT_006";

	/** テーブルアクセスクラス(ファイル出力制御)*/
	private JBSbatSQLAccess db_AC_M_FILE_OPUT_CTRL = null;

	/** テーブルアクセスクラス(料金項目出力名称)*/
	private JBSbatSQLAccess db_CH_M_PRC_KMK_OPUT_NM = null;
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 出力元項目コード："0" */
	private static final String OUT_MT_KMK_CD_ZERO  			= "0";
	/** 項目編集識別："1" */
	private static final String KMK_HENSHU_SKBT_CD_ONE 		= "1";
	/** 名称識別コード："1" */
	private static final String NM_SKBT_CD_ONE 				= "1";

	/** 横位置：１ */
	private static final String SIDE_1 						= "1";
	/** 横位置：３ */
	private static final String SIDE_3 						= "3";
	/** 横位置：４ */
	private static final String SIDE_4 						= "4";
	/** 横位置：５ */
	private static final String SIDE_5 						= "5";
	/** 横位置：６ */
	private static final String SIDE_6 						= "6";
	/** 横位置：７ */
	private static final String SIDE_7 						= "7";
	/** 横位置：８ */
	private static final String SIDE_8 						= "8";
	/** 横位置：９ */
	private static final String SIDE_9 						= "9";

	/** 退避.KCAT精算項目票ファイルID */
	private String  kcatSsnKmkFileID					= null;
	/** 退避.支払 */
	private String  payFileID							= null;
	/** 退避.支払合計 */
	private String  paySummaryFileID					= null;
	/** 退避.請求_基本料金 */
	private String  seikyNormalFileID					= null;
	/** 退避.請求_役務工事費 */
	private String  seikyYkmKojiFileID					= null;
	/** 退避.請求_コール・収納・販売業務 */
	private String  seikyClSynGymFileID			= null;
	/** 退避.請求_オプションチャンネルキャンペーン審査業務 */
	private String  seikyOpChChJdgFileID				= null;
	/** 退避.請求_工事代理店業務 */
	private String  seikyKojiDairiFileID				= null;
	/** 退避.請求_STB保守業務 */
	private String  seikyStbHsyFileID					= null;
	/** 退避.請求_STB運用業務 */
	private String  seikyStbUnyFileID					= null;
	/** 退避.請求合計 */
	private String  seikySummaryFileID					= null;

	/** 料金スケジュール定義アクセス部品 */
	private JACbatSchdlUtil schdlUtil 					= null;
	/** 退避.請求年月 */
	private String seikyYM 							= null;
	/** ヘッダ情報リスト */
	private List<JBSbatServiceInterfaceMap> headerInfoList 						= new ArrayList<JBSbatServiceInterfaceMap>();
	/** 明細情報リストマップ */
	private HashMap<String, List<JBSbatServiceInterfaceMap>> meisaiInfoListMap 	= new HashMap<String, List<JBSbatServiceInterfaceMap>>();
	/** 退避.料金項目名称マップ */
	private HashMap<String, String> prcKmkNmMap 									= new HashMap<String, String>();
	/** 退避.料金項目名称取得キー */
	private ArrayList<String> prcKmkKey 											= null;
	/** 退避.前回縦位置 */
	private String bfLenPs 							= null;
	
	/** 出力情報 */
	private JBSbatServiceInterfaceMap 	tmpOutputInf 		= null;
	/** 出力情報設定キーリスト */
	private ArrayList<String>outputKeyList = null;
	/** 出力件数 */
	private int outputCnt = 0;
	/** ファイル名（フルパス） */
	private String fileNm = JACStrConst.KARA_MOJI;
	/** ファイルインスタンス */
	private JBSbatBusinessFileUtil outFileObj = null;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_AC_M_FILE_OPUT_CTRL = new JBSbatSQLAccess(commonItem, D_TBL_NAME_AC_M_FILE_OPUT_CTRL);
		db_CH_M_PRC_KMK_OPUT_NM = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_KMK_OPUT_NM);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		
		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 + "]");
		
		// パラメータ取得クラス生成
		JACbatParamUtil paramUtil 	= new JACbatParamUtil(commonItem);
		// KCAT精算項目票ファイルID
		this.kcatSsnKmkFileID			= paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_KCAT_KMKHYO_FID);
		// 退避.支払
		this.payFileID					= paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_KCAT_KMK_PY_FID);
		// 退避.支払合計
		this.paySummaryFileID			= paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_KCAT_KMK_PG_FID);
		// 退避.請求_基本料金
		this.seikyNormalFileID			= paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_KCAT_KMK_KP_FID);
		// 退避.請求_役務工事費
		this.seikyYkmKojiFileID			= paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_KCAT_KMK_YK_FID);
		// 退避.請求_コール・収納・販売業務
		this.seikyClSynGymFileID		= paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_KCAT_KMK_CS_FID);
		// 退避.請求_オプションチャンネルキャンペーン審査業務
		this.seikyOpChChJdgFileID		= paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_KCAT_KMK_OK_FID);
		// 退避.請求_工事代理店業務
		this.seikyKojiDairiFileID		= paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_KCAT_KMK_KD_FID);
		// 退避.請求_STB保守業務
		this.seikyStbHsyFileID			= paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_KCAT_KMK_SH_FID);
		// 退避.請求_STB運用業務
		this.seikyStbUnyFileID			= paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_KCAT_KMK_SU_FID);
		// 退避.請求合計
		this.seikySummaryFileID			= paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_KCAT_KMK_SG_FID);
		
		paramUtil.close();

		// 料金スケジュール定義アクセス部品初期処理
		schdlUtil = new JACbatSchdlUtil(commonItem);
		// 請求年月取得
		this.seikyYM = schdlUtil.getBillDate(super.opeDate, JACStrConst.EVENT_CD_PRC_CALC_DAY);
		schdlUtil.close();
		
		// 外部パラメータを分割します。
		String[] freeItems = super.freeItem.split(JACStrConst.SEMI_COLON);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][freeItems=" + freeItems[0] + ", " + freeItems[1] + "]");
		
		// ファイル生成します。
		// （引数：バッチ共通パラメータ, ファイルID, ファイル分割有無, ファイル連番, 請求年月, 自由設定, 文字コード, 変換前改行コード）
		ArrayList<Object> fileInf = JACBatCommon.geneFile(commonItem, this.kcatSsnKmkFileID, freeItems[0], freeItems[1], this.seikyYM, JACStrConst.KARA_MOJI, JACStrConst.KARA_MOJI, JACStrConst.KARA_MOJI, JACStrConst.LINE_CRLF);
		
		this.fileNm = (String)fileInf.get(0);							// ファイル名（フルパス）
		this.outFileObj = (JBSbatBusinessFileUtil)fileInf.get(2);		// ファイルインスタンス
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][fileNm=" + this.fileNm + "]");
		
		// 出力情報設定キーリストを作成します。
		this.makeOutputKeyList();
		
		// ヘッダ情報リスト作成
		this.headerInfoList = makeInfo(this.kcatSsnKmkFileID, JACStrConst.OUTDATASKBT_HEADER);
		// ヘッダ情報編集・出力
		outHeaderInfo();
		// 料金項目名称取得
		makePrcKmkNm();
		// 明細・合計情報取得
		getMeisaiSummaryInfo();
		
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");

	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert 	inMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][inMap=" + inMap.getMap().toString() + "]") : true;
		// 明細情報リストマップ≠null
		if(this.meisaiInfoListMap != null)
		{
			// 出力情報格納用マップ
			JBSbatServiceInterfaceMap tmpMap 			= new JBSbatServiceInterfaceMap();
			// 明細情報リスト
			List<JBSbatServiceInterfaceMap> meisaiList 	= new ArrayList<JBSbatServiceInterfaceMap>();
			// 明細情報
			JBSbatServiceInterfaceMap meisaiInfo 		= new JBSbatServiceInterfaceMap();
			// 退避.前回明細_縦位置
			String bfMeiLenPs = null;

			// 入力情報リスト
			ArrayList<String> inMapList 	= null;
			// 設定値
			String setteiValue 				= null;
			// 横位置
			String sidePs 					= null;

			int i = 0;

			// 明細情報リストマップを入力情報.料金項目コードで検索した結果がtrue
			if(this.meisaiInfoListMap.containsKey(inMap.get(JBSbatACIFM107.PRC_KMK_CD)))
			{
				//明細情報リストマップより明細情報リストを取得
				meisaiList = this.meisaiInfoListMap.get(inMap.get(JBSbatACIFM107.PRC_KMK_CD));
				// リストのサイズ分、処理を継続
				while(meisaiList.size() > i)
				{
					meisaiInfo 		= new JBSbatServiceInterfaceMap();
					// 明細情報リストより明細情報を取得
					meisaiInfo = meisaiList.get(i);
					// 退避.前回明細_縦位置≠明細情報.縦位置の場合
					if(!meisaiInfo.get(JBSbatAC_M_FILE_OPUT_CTRL.LENGTH_POSITION).equals(bfMeiLenPs))
					{
						// 退避.前回明細_縦位置≠nullでない場合
						if(bfMeiLenPs != null)
						{
							// 請求年月設定
							tmpMap.set(JBSbatACIFM110.SSN_YM, this.seikyYM);
							// 出力情報退避
							this.tmpOutputInf = tmpMap;
							// ファイル出力
							outputRecord();
							// 出力情報格納用マップを初期化
							tmpMap = new JBSbatServiceInterfaceMap();
						}
						// 退避.前回明細_縦位置に縦位置を格納
						bfMeiLenPs = meisaiInfo.getString(JBSbatAC_M_FILE_OPUT_CTRL.LENGTH_POSITION);
					}
					// ファイル出力制御情報.出力元項目コード＝"0"の場合
					if(OUT_MT_KMK_CD_ZERO.equals(meisaiInfo.getString(JBSbatAC_M_FILE_OPUT_CTRL.OUTPUT_MT_KMK_CD)))
					{
						setteiValue = meisaiInfo.getString(JBSbatAC_M_FILE_OPUT_CTRL.OUTPUT_KMK);
					}
					// ファイル出力制御情報.出力元項目コード≠"0"の場合
					else
					{
						inMapList 	= new ArrayList<String>();
						// 入力情報リスト作成
						inMapList = makeInMapList(inMap);
						setteiValue = inMapList.get(Integer.parseInt(meisaiInfo.getString(JBSbatAC_M_FILE_OPUT_CTRL.OUTPUT_MT_KMK_CD)) - 1);
					}
					// 項目編集識別コード＝"1"の場合
					if(KMK_HENSHU_SKBT_CD_ONE.equals(meisaiInfo.get(JBSbatAC_M_FILE_OPUT_CTRL.KMK_HENSHU_SKBT_CD)))
					{
						// 設定値をカンマ区切り編集
						setteiValue = JPCFomatString.formatNumber(setteiValue);
					}
					sidePs = meisaiInfo.get(JBSbatAC_M_FILE_OPUT_CTRL.SIDE_POSITION).toString();
					// 明細情報作成処理
					tmpMap = makeOutInfo(tmpMap, setteiValue, sidePs);
					i++;
				}
				if(!tmpMap.getMap().isEmpty())
				{
					// 請求年月設定
					tmpMap.set(JBSbatACIFM110.SSN_YM, this.seikyYM);
					// 出力情報退避
					this.tmpOutputInf = tmpMap;
					// ファイル出力
					outputRecord();
				}
			}
		}
		
		// 最終レコードの場合
		if(super.commonItem.isEndRecordFlg())
		{
			// 出力されていない情報が存在している場合
			if(this.tmpOutputInf!= null && !this.tmpOutputInf.getMap().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 null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_AC_M_FILE_OPUT_CTRL.close();
		db_CH_M_PRC_KMK_OPUT_NM.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		
		// ファイルインスタンスがNULLでない場合
		if(null != this.outFileObj)
		{
			// ファイルクローズ
			JCCBatCommon.closeBusinessFileUtil(this.outFileObj);
		}
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/

	/**
	 * SQLKEY(AC_SELECT_006)でDBアクセスを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.引数でバイント変数を設定します。<br>
	 *
	 * 2.DBアクセスを実行します。<br>
	 * 
	 * 3.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		param:順にバイント変数の値をparam配列に入れます。バイント変数は以下に説明します。
	 *		 	システムコード
	 *		 	ファイルID
	 *		 	出力データ識別コード
	 *		 	ファイル出力制御適用開始年月日
	 *		 	ファイル出力制御適用終了年月日
	 *		 	予約適用年月日
	 * </pre>
	 * <p>
	 * @param param バイント変数の値配列。
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void executeAC_M_FILE_OPUT_CTRL_AC_SELECT_006(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_AC_M_FILE_OPUT_CTRL.selectBySqlDefine(paramList, AC_M_FILE_OPUT_CTRL_AC_SELECT_006);
	}

	/**
	 * SQLKEY(AC_SELECT_006)で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_006(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_CH_M_PRC_KMK_OPUT_NM.selectBySqlDefine(paramList, CH_M_PRC_KMK_OPUT_NM_AC_SELECT_006);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/
	
	/**
	 * ファイルを出力します。
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void outputRecord() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][outputRecord]");
		
		// ファイル出力を行う
		JCCBatCommon.printBusinessFileUtil(this.outFileObj, this.chgMapToList());
		
		this.outputCnt++;		// 出力件数カウントアップ
		
		this.tmpOutputInf.getMap().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>(25);
		
		int size = this.outputKeyList.size();
		
		for(int i = 0; i < size; i++)
		{
			// 出力情報キーリスト．VALUEが出力情報のキーに含まれる場合
			if(this.tmpOutputInf.getMap().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;
	}
	
	/**
	 * 出力情報設定キーリストを作成します。
	 * 
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeOutputKeyList() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutputKeyList]");
		
		this.outputKeyList = new ArrayList<String>(25);
		
		this.outputKeyList.add(JBSbatACIFM110.CHOHYO_DIV);			// 帳票区分
		this.outputKeyList.add(JBSbatACIFM110.SSN_YM);				// 精算年月
		this.outputKeyList.add(JBSbatACIFM110.SORT_KEY);			// ソートキー
		this.outputKeyList.add(JBSbatACIFM110.SSN_NAIYO);			// 精算内容
		this.outputKeyList.add(JBSbatACIFM110.SSN_KMK_CD);			// 精算項目コード
		this.outputKeyList.add(JBSbatACIFM110.SSN_KMK);				// 精算項目
		this.outputKeyList.add(JBSbatACIFM110.LENGTH_PST);			// 縦位置
		this.outputKeyList.add(JBSbatACIFM110.SIDE_PST);			// 横位置
		this.outputKeyList.add(JBSbatACIFM110.SSN_TRG_AMNT);		// 出力値
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeOutputKeyList][=" + this.outputKeyList.toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutputKeyList]");
	}
	
	/**
	 * ヘッダ情報編集・出力
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void outHeaderInfo() throws Exception
	{
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][outHeaderInfo]");

		int i = 0;
		
		// 出力情報格納用マップ
		JBSbatServiceInterfaceMap tmpMap 		= new JBSbatServiceInterfaceMap();
		// ヘッダ情報
		JBSbatServiceInterfaceMap headerInfo 	= new JBSbatServiceInterfaceMap();
		// ヘッダ情報リスト≠nullの場合
		if(this.headerInfoList != null)
		{
			while(this.headerInfoList.size() > i)
			{
				headerInfo = new JBSbatServiceInterfaceMap();
				// ヘッダ情報リストよりヘッダ情報を取得
				headerInfo = this.headerInfoList.get(i);
				// 退避.前回縦位置≠退避.ファイル出力制御_ヘッダ情報リスト.縦位置の場合
				if(!headerInfo.get(JBSbatAC_M_FILE_OPUT_CTRL.LENGTH_POSITION).equals(this.bfLenPs))
				{
					// 退避.前回縦位置≠未設定の場合
					if(this.bfLenPs != null)
					{
						// 請求年月設定
						tmpMap.set(JBSbatACIFM110.SSN_YM, this.seikyYM);
						// 出力情報退避
						this.tmpOutputInf = tmpMap;
						// ファイル出力
						outputRecord();
						// 出力情報格納マップをクリア
						tmpMap = new JBSbatServiceInterfaceMap();
					}
					// 縦位置再設定
					this.bfLenPs = headerInfo.getString(JBSbatAC_M_FILE_OPUT_CTRL.LENGTH_POSITION);
				}
				// 出力情報作成処理
				tmpMap = makeOutInfo(tmpMap
									, headerInfo.getString(JBSbatAC_M_FILE_OPUT_CTRL.OUTPUT_KMK)
									, headerInfo.getString(JBSbatAC_M_FILE_OPUT_CTRL.SIDE_POSITION));
				i++;
			}
			if(!tmpMap.getMap().isEmpty())
			{
				// 請求年月設定
				tmpMap.set(JBSbatACIFM110.SSN_YM, this.seikyYM);
				// 出力情報退避
				this.tmpOutputInf = tmpMap;
				// ファイル出力
				outputRecord();
			}
		}
		
		// ログ出力
		String[] outCntMsg = {JACStrConst.LOG_MSG_INITIAL, String.valueOf(this.outputCnt)};
		super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0560AI, outCntMsg);
		// 退避．出力件数クリア
		this.outputCnt = 0;
		
		assert 	JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][outHeaderInfo]");
	}

	/**
	 * 出力情報作成処理
	 * @param  outMap      出力情報
	 * @param  setteiValue 設定値
	 * @param  sidePs      横位置
	 * @return outMap      出力情報
	 * @throws Exception   業務サービス内で発生した例外全般。
	 */
	private JBSbatServiceInterfaceMap makeOutInfo(JBSbatServiceInterfaceMap outMap
														, String setteiValue
														, String sidePs) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeOutInfo]");
		// 横位置：１
		if(SIDE_1.equals(sidePs))
		{
			outMap.set(JBSbatACIFM110.CHOHYO_DIV, 		setteiValue);	// 帳票区分
		}
		// 横位置：３
		if(SIDE_3.equals(sidePs))
		{
			outMap.set(JBSbatACIFM110.SORT_KEY, 		setteiValue);	// ソートキー
		}
		// 横位置：４
		if(SIDE_4.equals(sidePs))
		{
			outMap.set(JBSbatACIFM110.SSN_NAIYO, 		setteiValue);	// 精算内容
		}
		// 横位置：５
		if(SIDE_5.equals(sidePs))
		{
			outMap.set(JBSbatACIFM110.SSN_KMK_CD, 		setteiValue);	// 精算項目コード
		}
		// 横位置：６
		if(SIDE_6.equals(sidePs))
		{
			outMap.set(JBSbatACIFM110.SSN_KMK, 			setteiValue);	// 精算項目
		}
		// 横位置：７
		if(SIDE_7.equals(sidePs))
		{
			outMap.set(JBSbatACIFM110.LENGTH_PST, 		setteiValue);	// 縦位置
		}
		// 横位置：８
		if(SIDE_8.equals(sidePs))
		{
			outMap.set(JBSbatACIFM110.SIDE_PST, 		setteiValue);	// 横位置
		}
		// 横位置：９
		if(SIDE_9.equals(sidePs))
		{
			outMap.set(JBSbatACIFM110.SSN_TRG_AMNT, 	setteiValue);	// 出力値
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeOutInfo]");
		return outMap;
	}

	/**
	 * 料金項目名称マップ作成
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makePrcKmkNm() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getPrcKmkNm]");
		JBSbatCommonDBInterface paramList		 	= new JBSbatCommonDBInterface();


		// 退避.料金項目コード
		String prcKmkCd 	= null;
		
		paramList.setValue(JACStrConst.PRC_KMK_NM_SBT_CD_JGSYA_KMK_NM);	// 料金項目名称種別コード
		paramList.setValue(super.opeDate);								// バッチ運用日
		paramList.setValue(super.opeDate);								// バッチ運用日
		paramList.setValue(super.opeDate);								// バッチ運用日
		// SQL実行
		executeCH_M_PRC_KMK_OPUT_NM_AC_SELECT_006(paramList.getList().toArray());
		JBSbatCommonDBInterface dbMap = db_CH_M_PRC_KMK_OPUT_NM.selectNext();
		// 料金項目名称マップ作成
			// 結果取得
		if(dbMap != null)
		{
			while(dbMap != null)
			{
				// 料金項目名称マップに値を格納する。料金項目コード：キー 料金項目名称：値
				this.prcKmkNmMap.put(dbMap.getString(JBSbatCH_M_PRC_KMK_OPUT_NM.PRC_KMK_CD), dbMap.getString(JBSbatCH_M_PRC_KMK_OPUT_NM.PRC_KMK_NM));
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getPrcKmkNm][prcKmkCd=" + prcKmkCd + "]");
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint
														, "[L][getPrcKmkNm][PRC_KMK_NM=" + dbMap.getString(JBSbatCH_M_PRC_KMK_OPUT_NM.PRC_KMK_NM) + "]");
				dbMap = db_CH_M_PRC_KMK_OPUT_NM.selectNext();
			}
		}
		else
		{
			// DB未存在エラー
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][getPrcKmkNm][DB未存在エラー]");
			String[] outCntMsg = {JBSbatCH_M_PRC_KMK_OPUT_NM.TABLE_NAME, paramList.getList().toString()};
			// エラーログ出力（エラーコード："EACB0240CW"（DB未存在エラー））
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0240CW, outCntMsg);
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getPrcKmkNm]");
	}

	/**
	 * 明細情報リスト作成
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void getMeisaiSummaryInfo() throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][getMeisaiSummaryInfo]");

		// 退避.料金項目名称取得キーを初期化
		this.prcKmkKey = new ArrayList<String>();
		// 明細情報リストマップ作成 支払
		makeMeisaiInfoListMap(makeInfo(this.payFileID, 					JACStrConst.OUTDATASKBT_DTL));
		// 明細情報リストマップ作成 支払合計
		makeMeisaiInfoListMap(makeInfo(this.paySummaryFileID, 			JACStrConst.OUTDATASKBT_DTL));
		// 明細情報リストマップ作成 請求_基本料金
		makeMeisaiInfoListMap(makeInfo(this.seikyNormalFileID, 			JACStrConst.OUTDATASKBT_DTL));
		// 明細情報リストマップ作成 請求_役務工事費
		makeMeisaiInfoListMap(makeInfo(this.seikyYkmKojiFileID, 		JACStrConst.OUTDATASKBT_DTL));
		// 明細情報リストマップ作成 請求_コール・収納・販売業務
		makeMeisaiInfoListMap(makeInfo(this.seikyClSynGymFileID, 	JACStrConst.OUTDATASKBT_DTL));
		// 明細情報リストマップ作成 請求_オプションチャンネルキャンペーン審査業務
		makeMeisaiInfoListMap(makeInfo(this.seikyOpChChJdgFileID, 	JACStrConst.OUTDATASKBT_DTL));
		// 明細情報リストマップ作成 請求_工事代理店業務
		makeMeisaiInfoListMap(makeInfo(this.seikyKojiDairiFileID, 		JACStrConst.OUTDATASKBT_DTL));
		// 明細情報リストマップ作成 請求_STB保守業務
		makeMeisaiInfoListMap(makeInfo(this.seikyStbHsyFileID, 			JACStrConst.OUTDATASKBT_DTL));
		// 明細情報リストマップ作成 請求_STB運用業務
		makeMeisaiInfoListMap(makeInfo(this.seikyStbUnyFileID, 			JACStrConst.OUTDATASKBT_DTL));
		// 明細情報リストマップ作成 請求合計
		makeMeisaiInfoListMap(makeInfo(this.seikySummaryFileID, 		JACStrConst.OUTDATASKBT_DTL));
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][getMeisaiSummaryInfo]");
	}

	/**
	 * 情報リスト作成処理
	 * @param  gyoParaID   ファイルID
	 * @param  outDataSkbt 出力データ識別コード
	 * @return infoList    情報リスt
	 * @throws Exception   業務サービス内で発生した例外全般。
	 */
	private List<JBSbatServiceInterfaceMap> makeInfo(String gyoParaID, String outDataSkbt) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeInfo]");
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		
		paramList.setValue(super.systemCode);	// システムコード
		paramList.setValue(gyoParaID);			// ファイルID
		paramList.setValue(outDataSkbt);		// 出力データ識別コード
		paramList.setValue(super.opeDate);		// バッチ運用日
		paramList.setValue(super.opeDate);		// バッチ運用日
		paramList.setValue(super.opeDate);		// バッチ運用日
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeInfo][paramList=" + paramList.getList().toString() + "]");

		// SQL実行
		executeAC_M_FILE_OPUT_CTRL_AC_SELECT_006(paramList.getList().toArray());
		JBSbatCommonDBInterface dbMap = db_AC_M_FILE_OPUT_CTRL.selectNext();
		// ファイル出力情報用リスト
		ArrayList<JBSbatServiceInterfaceMap> infoList = null;
		// 結果取得
		if(dbMap != null)
		{
			// ファイル出力情報用リスト
			infoList = new ArrayList<JBSbatServiceInterfaceMap>();
			while (dbMap != null)
			{
				JBSbatServiceInterfaceMap tmpMap = new JBSbatServiceInterfaceMap();
				tmpMap.set(JBSbatAC_M_FILE_OPUT_CTRL.PRC_KMK_CD, 			dbMap.getString(JBSbatAC_M_FILE_OPUT_CTRL.PRC_KMK_CD)); 		// 料金項目コード
				tmpMap.set(JBSbatAC_M_FILE_OPUT_CTRL.LENGTH_POSITION, 		dbMap.getString(JBSbatAC_M_FILE_OPUT_CTRL.LENGTH_POSITION));	// 縦位置
				tmpMap.set(JBSbatAC_M_FILE_OPUT_CTRL.SIDE_POSITION, 		dbMap.getString(JBSbatAC_M_FILE_OPUT_CTRL.SIDE_POSITION));		// 横位置
				tmpMap.set(JBSbatAC_M_FILE_OPUT_CTRL.OUTPUT_MT_KMK_CD, 		dbMap.getString(JBSbatAC_M_FILE_OPUT_CTRL.OUTPUT_MT_KMK_CD));	// 出力元項目コード
				tmpMap.set(JBSbatAC_M_FILE_OPUT_CTRL.KMK_HENSHU_SKBT_CD, 	dbMap.getString(JBSbatAC_M_FILE_OPUT_CTRL.KMK_HENSHU_SKBT_CD));	// 項目編集識別コード
				tmpMap.set(JBSbatAC_M_FILE_OPUT_CTRL.NM_SKBT_CD, 			dbMap.getString(JBSbatAC_M_FILE_OPUT_CTRL.NM_SKBT_CD));			// 名称識別コード
				if(NM_SKBT_CD_ONE.equals(tmpMap.getString(JBSbatAC_M_FILE_OPUT_CTRL.NM_SKBT_CD)))
				{
					tmpMap.set(JBSbatAC_M_FILE_OPUT_CTRL.OUTPUT_KMK, 			this.prcKmkNmMap.get(tmpMap.getString(JBSbatAC_M_FILE_OPUT_CTRL.PRC_KMK_CD)));
				}
				else
				{
					tmpMap.set(JBSbatAC_M_FILE_OPUT_CTRL.OUTPUT_KMK, 			dbMap.getString(JBSbatAC_M_FILE_OPUT_CTRL.OUTPUT_KMK));			// 出力項目
				}
				// リストにマップを格納
				infoList.add(tmpMap);
				assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeInfo][tmpMap=" + tmpMap.getMap().toString() + "]");
				tmpMap = null;
				dbMap = db_AC_M_FILE_OPUT_CTRL.selectNext();
			}
		}
		else
		{
			// DB未存在エラー
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeInfo][DB未存在エラー]");
			String[] outCntMsg = {JBSbatAC_M_FILE_OPUT_CTRL.TABLE_NAME, paramList.getList().toString()};
			// エラーログ出力（エラーコード："EACB0240CW"（DB未存在エラー））
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0240CW, outCntMsg);
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeInfo]");
		return infoList;
	}

	/**
	 * 明細情報リストマップ作成
	 * @param  tmpList   明細情報リスト
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private void makeMeisaiInfoListMap(List<JBSbatServiceInterfaceMap> tmpList) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeMeisaiInfoListMap]");
		// 明細情報リスト≠nullの場合
		if(tmpList != null)
		{
			// 明細リスト
			List<JBSbatServiceInterfaceMap> meisaiList 	= new ArrayList<JBSbatServiceInterfaceMap>();
			// 退避.料金項目コード
			String prcKmkCd 							= null;
			// 明細情報カウンタ
			int tmpCnt 									= 0;

			// 取得結果がある限り処理を続ける
			while(tmpList.size() > tmpCnt)
			{
				// 明細情報.料金項目コード≠退避.料金項目コードの場合
				if(!tmpList.get(tmpCnt).getString(JBSbatAC_M_FILE_OPUT_CTRL.PRC_KMK_CD).equals(prcKmkCd))
				{
					// 退避.料金項目コード≠nullの場合
					if(prcKmkCd != null)
					{
						// 明細情報リストを明細情報リストマップに格納
						this.meisaiInfoListMap.put(prcKmkCd, meisaiList);
						// 退避.料金項目名称取得キーに情報マップ.料金項目コードを格納
						this.prcKmkKey.add(prcKmkCd);
						// 明細情報リストを初期化
						meisaiList = new ArrayList<JBSbatServiceInterfaceMap>();
					}
					// 明細情報.料金項目コードを退避.料金項目コードに格納
					prcKmkCd = tmpList.get(tmpCnt).getString(JBSbatAC_M_FILE_OPUT_CTRL.PRC_KMK_CD);
				}
				// 明細リストに取得結果した情報マップを格納
				meisaiList.add(tmpList.get(tmpCnt));
				tmpCnt++;
			}
			// 退避.料金項目コード≠nullの場合
			if(prcKmkCd != null)
			{
				// 明細情報リストマップにキーと値を格納
				this.meisaiInfoListMap.put(prcKmkCd, meisaiList);
				// 退避.料金項目名称取得キーに情報マップ.料金項目コードを格納
				this.prcKmkKey.add(prcKmkCd);
			}
		}
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeMeisaiInfoListMap]");
	}

	/**
	 * 入力情報リスト作成
	 * @param  inMap     入力電文
	 * @return inMapList 入力情報リスト
	 * @throws Exception 業務サービス内で発生した例外全般。
	 */
	private ArrayList<String> makeInMapList(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][makeInMapList]");
		// 入力情報リスト
		ArrayList<String> inMapList = new ArrayList<String>();
		
		inMapList.add(inMap.getString(JBSbatACIFM107.SEIKY_KEI_NO));	//  1.請求先番号
		inMapList.add(inMap.getString(JBSbatACIFM107.SEIKY_YM));		//  2.請求年月
		inMapList.add(inMap.getString(JBSbatACIFM107.SVC_NO));			//  3.サービス番号
		inMapList.add(inMap.getString(JBSbatACIFM107.SVC_SKBT_CD));		//  4.料金サービス識別コード
		inMapList.add(inMap.getString(JBSbatACIFM107.PCRS_CD));			//  5.料金コースコード
		inMapList.add(inMap.getString(JBSbatACIFM107.PRC_SVC_CD));		//  6.料金サービスコード
		inMapList.add(inMap.getString(JBSbatACIFM107.PRC_KMK_CD));		//  7.料金項目コード
		inMapList.add(inMap.getString(JBSbatACIFM107.JIGYOSHA_CD));		//  8.事業者コード
		inMapList.add(inMap.getString(JBSbatACIFM107.JIGYOSHA_KEI_CD));	//  9.事業者契約コード
		inMapList.add(inMap.getBigDecimal(JBSbatACIFM107.PRC).toString());				// 10.料金
		inMapList.add(inMap.getBigDecimal(JBSbatACIFM107.SSN_CNT).toString());			// 11.精算項目件数
		inMapList.add(inMap.getString(JBSbatACIFM107.USE_STAYMD));		// 12.利用開始日
		inMapList.add(inMap.getString(JBSbatACIFM107.USE_ENDYMD));		// 13.利用終了日
		inMapList.add(inMap.getString(JBSbatACIFM107.AIT_DIV));			// 14.相対区分
		inMapList.add(inMap.getString(JBSbatACIFM107.SIME_DAY));		// 15.締め日
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][makeInMapList][inMapList=" + inMapList.toString() + "]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][makeInMapList]");
		return inMapList;
	}

}
