/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatAC050ApKoInfInputChk
*	ソースファイル名	：JBSbatAC050ApKoInfInputChk.java
*	作成者				：富士通　
*	作成日				：2013年02月26日
*＜機能概要＞
*　０５０アプリ呼情報入力チェック部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v5.00.00	2013/02/26  FJ) 垣内	【ANK-1419-00-00】新規作成
*	v5.01.00	2013/03/26  FJ) 小柴	【内部管理番号-0000613】ファイル出力オブジェクト生成時のエンコード設定ずれ防止対応
*	v5.02.00	2013/04/05  FJ) 小柴	【IKK-2013-0000783】文字化け対策のため、エンコード形式の変更
*	v5.03.00	2013/06/19  FJ)岡田		【IKK-2013-0001199】エラーファイル有件出力時に警告終了とするよう修正
*	v5.04.00	2013/07/11  FJ) 狭間	【IT1-2013-0001363】（水平展開）lineToObjectの第三引数適正化
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import eo.business.common.JACBatCommon;
import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JACbatParamUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JCCBatCommon;
import eo.business.util.file.JBSbatACIFM075;
import eo.business.util.file.JBSbatACIFM076;
import eo.business.util.file.JBSbatACIFM077;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.file.JBSbatOutputFileUtil;
import eo.framework.util.JBSbatAplConst;
import eo.framework.util.JBSbatBusinessFileUtil;
import eo.framework.util.JBSbatCheckUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatAC050ApKoInfInputChk extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** ファイル定義 */
	private static final String PARAM_IND = "IND";

	/** ファイル定義 */
	private static final String PARAM_OTD = "OTD";

	/** ヘッダーレコード種別 */
	private static final String HEADER_REC_SBT = "0";

	/** データレコード種別 */
	private static final String DATA_REC_SBT = "1";

	/** トレーラレコード種別 */
	private static final String TRAILER_REC_SBT = "8";

	/** エンドレコード種別 */
	private static final String END_REC_SBT = "9";

	/** 前種別 */
	private static final String BF_SBT = "前種別；";

	/** 現種別 */
	private static final String NOW_SBT = "現種別；";

	/** 未来日の呼チェックフラグ */
	private static final String FUTURE_CHK_FLG_1 = "1";

	/** 埋め込み文字列を格納する配列 */
	private HashMap<String, String> itemValueMap = null;

	/** システム時分秒（オンライン運用日＋システム時間） */
	private String sysWkTime = null;

	/** 050アプリサービス区分 */
	private String wk050AppSvcCd = null;

	/** 未来日呼エラー */
	private String msgFutureDayErr = null;

	/** フリー項目情報格納用配列 */
	private String[] fleeItemArray = null;

	/** 前回通番 */
	private int znkiSeq = 0;

	/** 通番 */
	private int seq = 0;

	/** 前回レコード種別 */
	private String znkiRecSbt = null;

	/** レコード種別 */
	private String recSbt = null;

	/** トレーラ部レコード件数 */
	private int trailerRecCnt = 0;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");

		// 埋め込み文字の初期化
		itemValueMap = new HashMap<String, String>();
		itemValueMap.put("TXT-ACIFE002-.REC_SBT", "ｅｏ光電話利用呼情報データファイル.レコード種別");
		itemValueMap.put("TXT-ACIFM075-.FILE_SEQ", "ｅｏ光電話利用呼情報データファイル（ヘッダ）.ファイル通番");
		itemValueMap.put("TXT-ACIFM076-.KAKINS_TELNO", "ｅｏ光電話利用呼情報データファイル（データ）.課金電話番号");
		itemValueMap.put("TXT-ACIFM076-.HASHIN_TELNO", "ｅｏ光電話利用呼情報データファイル（データ）.発信元電話番号");
		itemValueMap.put("TXT-ACIFM076-.INCOMING_TELNO", "ｅｏ光電話利用呼情報データファイル（データ）.着信先電話番号");
		itemValueMap.put("TXT-ACIFM076-.PCALL_STAYMD", "ｅｏ光電話利用呼情報データファイル（データ）.通話開始日");
		itemValueMap.put("TXT-ACIFM076-.PCALL_STA_HMS", "ｅｏ光電話利用呼情報データファイル（データ）.通話開始時刻");
		itemValueMap.put("TXT-ACIFM076-.PCALL_ENDYMD", "ｅｏ光電話利用呼情報データファイル（データ）.通話終了日");
		itemValueMap.put("TXT-ACIFM076-.PCALL_END_HMS", "ｅｏ光電話利用呼情報データファイル（データ）.通話終了時刻");
		itemValueMap.put("TXT-ACIFM076-.PCALL_SEC_CNT", "ｅｏ光電話利用呼情報データファイル（データ）.通話秒数");
		itemValueMap.put("TXT-ACIFM076-.PCALL_DOSU", "ｅｏ光電話利用呼情報データファイル（データ）.通話度数");
		itemValueMap.put("TXT-ACIFM076-.PCALL_TANKA", "ｅｏ光電話利用呼情報データファイル（データ）.通話単価");
		itemValueMap.put("TXT-ACIFM076-.PCALL_PRC", "ｅｏ光電話利用呼情報データファイル（データ）.通話料金");
		itemValueMap.put("TXT-ACIFM076-.PCALL_SBT", "ｅｏ光電話利用呼情報データファイル（データ）.通話種別");
		itemValueMap.put("TXT-ACIFM076-.PCALL_SVC_DIV", "ｅｏ光電話利用呼情報データファイル（データ）.サービス区分");
		itemValueMap.put("TXT-ACIFM076-.CUT_RSN_DIV_SIP", "ｅｏ光電話利用呼情報データファイル（データ）.切断理由−ＳＩＰ");
		itemValueMap.put("TXT-ACIFM076-.CUT_RSN_DIV_ISUP", "ｅｏ光電話利用呼情報データファイル（データ）.切断理由−ＩＳＵＰ");
		itemValueMap.put("TXT-ACIFM076-.CUT_RSN_DIV", "ｅｏ光電話利用呼情報データファイル（データ）.切断理由区分");
		itemValueMap.put("TXT-ACIFM076-.CUT_DTAIL_INFO_DKMK_IDX_NO", "ｅｏ光電話利用呼情報データファイル（データ）.切断詳細情報−大項目番号");
		itemValueMap.put("TXT-ACIFM076-.CUT_DTAIL_INFO_CKMK_IDX_NO", "ｅｏ光電話利用呼情報データファイル（データ）.切断詳細情報−中項目番号");
		itemValueMap.put("TXT-ACIFM076-.CUT_DTAIL_INFO_HTCK_SBT_CD", "ｅｏ光電話利用呼情報データファイル（データ）.切断詳細情報−発着種別");
		itemValueMap.put("TXT-ACIFM076-.CHRG_DSP_CD", "ｅｏ光電話利用呼情報データファイル（データ）.課金表示");
		itemValueMap.put("TXT-ACIFM076-.EMG_KO_FLG", "ｅｏ光電話利用呼情報データファイル（データ）.緊急通報呼フラグ");
		itemValueMap.put("TXT-ACIFM076-.CHG_SIGNAL_RCV_CNT", "ｅｏ光電話利用呼情報データファイル（データ）.ＣＨＧ信号受信回数");
		itemValueMap.put("TXT-ACIFM076-.TENSO_JI_HASHIN_TELNO", "ｅｏ光電話利用呼情報データファイル（データ）.転送時発信元番号");
		itemValueMap.put("TXT-ACIFM076-.COUNTRY_NM", "ｅｏ光電話利用呼情報データファイル（データ）.国名");
		itemValueMap.put("TXT-ACIFM077-.DATA_REC_CNT", "ｅｏ光電話利用呼情報データファイル（トレーラ）.データレコード件数");

		// システム時間の取得
		String sysdate = JCCBatCommon.getSysDateTimeStamp();
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial]super.onlineOpeDate[オンライン運用日]：" + super.onlineOpeDate);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial]JCCBatCommon.getSysDateTimeStamp()[システム日時]：" + sysdate);
		sysWkTime = super.onlineOpeDate.concat(sysdate.substring(8, 15));

		// 業務パラメータ取得
		// パラメータ取得部品の初期処理
		JACbatParamUtil paramUtil = new JACbatParamUtil(commonItem);

		// 050アプリサービス区分
		wk050AppSvcCd = paramUtil.getGyoumuParameter(JACStrConst.WKPRA_AC_050_APP_SVC_CD);
		// 未来日呼エラー
		msgFutureDayErr = paramUtil.getGyoumuParameter(JACStrConst.WKPARA_AC_MSG_FUTURE_DAYERR);

		// パラメータ取得部品のクローズ処理
		paramUtil.close();

		// フリー項目情報を取得
		fleeItemArray = super.freeItem.split(JACStrConst.FREE_DIV);

		// 前回分レコードの通番を取得
		znkiSeq = getZnkiSeq(fleeItemArray[0], fleeItemArray[2], fleeItemArray[6]);

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
		/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");

		// 出力データ格納用リストを初期化
		ArrayList<ArrayList<String>> outData = new ArrayList<ArrayList<String>>();
		ArrayList<ArrayList<String>> outErrData = new ArrayList<ArrayList<String>>();
		JBSbatInputFileUtil inFileObj = null;
		try
		{
			// ファイル読み込み
			inFileObj = new JBSbatInputFileUtil(fleeItemArray[0] + fleeItemArray[1]);

			// レコード件数
			int recCnt = 1;
			// データレコード件数
			int dataRecCnt = 0;
			// 行文字列
			String sLine = null;

			JBSbatServiceInterfaceMap retInMap = null;

			JBSbatDefFileUtil headerDefFile = new JBSbatDefFileUtil(JBSbatAplConst.getAplConstValue(PARAM_IND) + fleeItemArray[6], inFileObj);

			JBSbatDefFileUtil detailDefFile = new JBSbatDefFileUtil(JBSbatAplConst.getAplConstValue(PARAM_IND) + fleeItemArray[7], inFileObj);

			JBSbatDefFileUtil trailerDefFile = new JBSbatDefFileUtil(JBSbatAplConst.getAplConstValue(PARAM_IND) + fleeItemArray[8], inFileObj);

			inFileObj.setEncode(JACStrConst.ENCODE_MS932);
			inFileObj.createReader();

			// 入力ファイルのレコード件数分繰り返す
			while (true)
			{
				// 行文字列を取得
				sLine = inFileObj.readLine();

				// レコード存在判定
				if (sLine == null)
				{
					// ループを抜ける
					break;
				}

				// ヘッダーレコードの処理
				if (recCnt == 1)
				{
					// ヘッダレコードとして再取得
					JBSbatServiceInterfaceMap headerRetInMap = headerDefFile.lineToObject(sLine, inFileObj, 0);

					// 単項目チェック
					if (!isSingleCheckACIFM075(headerRetInMap.getMap(), itemValueMap))
					{
						// エラーの場合

						// エラー処理
						throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0500CE);
					}

					// 前回分通番の存在判定
					if (znkiSeq != -1)
					{
						// 通番の取得
						seq = Integer.parseInt(headerRetInMap.getString(JBSbatACIFM075.FILE_SEQ));

						// 重複ファイルチェック
						if (!(seq == 0 && znkiSeq == 9999) && seq != (znkiSeq + 1))
						{
							// エラー処理
							throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0700CE, new String[] { String.valueOf(znkiSeq),
											String.valueOf(seq) });
						}
					}
				}

				// レコードシーケンスチェック
				// レコード種別を取得
				recSbt = sLine.substring(0, 1);

				// 1件目のレコード判定
				if (recCnt == 1)
				{
					// ヘッダのレコードチェック
					if (!HEADER_REC_SBT.equals(recSbt))
					{
						// エラー処理
						throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0570CE);
					}
				}
				// 2件目のレコード判定
				else if (recCnt == 2)
				{
					// データ・トレーラのレコードチェック
					if (!(DATA_REC_SBT.equals(recSbt) || TRAILER_REC_SBT.equals(recSbt)))
					{
						// エラー処理
						throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0580CE,
										new String[] { String.valueOf(seq), znkiRecSbt, recSbt });
					}
				}
				// 3件目以降のレコード判定
				else if (recCnt >= 3)
				{
					// データ・トレーラ・エンドのレコードチェック
					if (!(DATA_REC_SBT.equals(recSbt) || TRAILER_REC_SBT.equals(recSbt) || END_REC_SBT.equals(recSbt)))
					{
						// エラー処理
						throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0590CE, new String[] { String.valueOf(recCnt),
										String.valueOf(seq),
										BF_SBT.concat(znkiRecSbt).concat(JACStrConst.FULL_SPACE_1).concat(NOW_SBT).concat(recSbt) });
					}
				}

				// トレーラの次がエンドのレコードかをチェック
				if (END_REC_SBT.equals(recSbt) && !TRAILER_REC_SBT.equals(znkiRecSbt))
				{
					// エラー処理
					throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0600CE, new String[] { String.valueOf(seq), znkiRecSbt, recSbt });
				}

				// データレコードの処理
				if (DATA_REC_SBT.equals(recSbt))
				{
					dataRecCnt++;

					// データレコードとして再取得
					retInMap = detailDefFile.lineToObject(sLine, inFileObj, 0);

					// サービス区分
					String pcallSvcDiv = retInMap.getString(JBSbatACIFM076.PCALL_SVC_DIV);

					// サービス区分が050アプリの場合、入力チェックを行う
					if (pcallSvcDiv.equals(this.wk050AppSvcCd))
					{
						// 単項目チェック
						if (!isSingleCheckACIFM076(retInMap.getMap(), itemValueMap))
						{
							// エラーの場合
							// エラー処理
							throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0500CE);
						}

						// 通話開始
						String staYmd = retInMap.getString(JBSbatACIFM076.PCALL_STAYMD);
						String staHms = retInMap.getString(JBSbatACIFM076.PCALL_STA_HMS);

						// 未来日の呼チェックフラグが"1"の場合のみ、チェックを行う
						if (FUTURE_CHK_FLG_1.equals(fleeItemArray[11]))
						{
							// 未来日呼チェック
							if (!checkFutureData(staYmd, staHms, recCnt))
							{
								// エラーデータ出力
								outErrData.add(createErrData(retInMap, JACStrConst.WKPARA_AC_MSG_FUTURE_DAYERR, msgFutureDayErr));

								// 次のレコードの処理へ
								continue;
							}
						}
						// データ出力
						outData.add(createData(retInMap));
					}
				}

				// トレーラレコードの処理
				if (TRAILER_REC_SBT.equals(recSbt))
				{
					// トレーラレコードとして再取得
					retInMap = trailerDefFile.lineToObject(sLine, inFileObj, 0);

					// 単項目チェック
					if (!isSingleCheckACIFM077(retInMap.getMap(), itemValueMap))
					{
						// エラーの場合
						// エラー処理
						throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0500CE);
					}

					// 件数を取得
					trailerRecCnt = Integer.parseInt(retInMap.getString(JBSbatACIFM077.DATA_REC_CNT));
				}

				// 前回レコード種別の設定
				znkiRecSbt = recSbt;

				// レコード件数のカウント
				recCnt++;
			}

			// 最終レコードチェック
			if (!END_REC_SBT.equals(recSbt))
			{
				// エラー処理
				throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0610CE, new String[] { String.valueOf(seq), recSbt });
			}

			// 件数チェック
			int dataCnt = dataRecCnt;
			if (trailerRecCnt != dataCnt)
			{
				// エラー処理
				throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0620CE, new String[] { String.valueOf(seq), String.valueOf(dataCnt),
								String.valueOf(trailerRecCnt) });
			}
		}
		finally
		{
			// ファイルをクローズ
			inFileObj.close();
		}

		// 050アプリ利用履歴情報データファイルの出力
		outputFile(fleeItemArray[0], fleeItemArray[3], fleeItemArray[9], outData);

		// 050アプリ利用呼情報エラー情報ファイルの出力
		outputFile(fleeItemArray[0], fleeItemArray[4], fleeItemArray[10], outErrData);

		if (!outErrData.isEmpty())
		{
			// 050アプリ利用呼情報エラー情報(入力)ファイルが有件である場合
			// 警告終了 「【警告】エラー対象レコード＝（%1%）」
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB0340CW, new String[] { Integer.toString(outErrData.size()) });
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return null;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 *入力情報（ｅｏ光電話利用呼情報データファイル（ヘッダ））の単項目チェックを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.単項目チェックを行います。<br>
	 * 
	 * 2.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		rsMap:(項目、値)を(key、value)として、データをrsMapに入れます
	 *		itemvalueMap:埋め込み文字の値をitemvalueMapに入れます。キーの値は、以下に説明します。
	 *			 TXT-ACIFM075-.FILE_SEQ			ｅｏ光電話利用呼情報データファイル（ヘッダ）.ファイル通番
	 * </pre>
	 * <p>
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap。
	 * @param itemvalueMap エラーメッセージに関する項目値を格納されたHashMap。
	 * @return  boolean trueである場合、エラーがありません。falseである場合、エラーを発生しました。
	 */
	private boolean isSingleCheckACIFM075(HashMap rsMap, HashMap itemvalueMap)
	{
		// 単項目チェックを行います
		String strValue = null;

		// ファイル通番項目チェック
		strValue = (String)rsMap.get("FILE_SEQ");
		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakusuuji1" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[] { (String)itemvalueMap.get("TXT-ACIFM075-.FILE_SEQ") });
			return false;
		}

		return true;
	}

	/**
	 *入力情報（ｅｏ光電話利用呼情報データファイル（データ））の単項目チェックを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.単項目チェックを行います。<br>
	 * 
	 * 2.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		rsMap:(項目、値)を(key、value)として、データをrsMapに入れます
	 *		itemvalueMap:埋め込み文字の値をitemvalueMapに入れます。キーの値は、以下に説明します。
	 *			 TXT-ACIFM076-.KAKINS_TELNO			ｅｏ光電話利用呼情報データファイル（データ）.課金電話番号
	 *			 TXT-ACIFM076-.HASHIN_TELNO			ｅｏ光電話利用呼情報データファイル（データ）.発信元電話番号
	 *			 TXT-ACIFM076-.INCOMING_TELNO			ｅｏ光電話利用呼情報データファイル（データ）.着信先電話番号
	 *			 TXT-ACIFM076-.PCALL_STAYMD			ｅｏ光電話利用呼情報データファイル（データ）.通話開始日
	 *			 TXT-ACIFM076-.PCALL_STA_HMS			ｅｏ光電話利用呼情報データファイル（データ）.通話開始時刻
	 *			 TXT-ACIFM076-.PCALL_ENDYMD			ｅｏ光電話利用呼情報データファイル（データ）.通話終了日
	 *			 TXT-ACIFM076-.PCALL_END_HMS			ｅｏ光電話利用呼情報データファイル（データ）.通話終了時刻
	 *			 TXT-ACIFM076-.PCALL_SEC_CNT			ｅｏ光電話利用呼情報データファイル（データ）.通話秒数
	 *			 TXT-ACIFM076-.PCALL_DOSU			ｅｏ光電話利用呼情報データファイル（データ）.通話度数
	 *			 TXT-ACIFM076-.PCALL_TANKA			ｅｏ光電話利用呼情報データファイル（データ）.通話単価
	 *			 TXT-ACIFM076-.PCALL_PRC			ｅｏ光電話利用呼情報データファイル（データ）.通話料金
	 *			 TXT-ACIFM076-.PCALL_SBT			ｅｏ光電話利用呼情報データファイル（データ）.通話種別
	 *			 TXT-ACIFM076-.PCALL_SVC_DIV			ｅｏ光電話利用呼情報データファイル（データ）.サービス区分
	 *			 TXT-ACIFM076-.CUT_RSN_DIV_SIP			ｅｏ光電話利用呼情報データファイル（データ）.切断理由−ＳＩＰ
	 *			 TXT-ACIFM076-.CUT_RSN_DIV_ISUP			ｅｏ光電話利用呼情報データファイル（データ）.切断理由−ＩＳＵＰ
	 *			 TXT-ACIFM076-.CUT_RSN_DIV			ｅｏ光電話利用呼情報データファイル（データ）.切断理由区分
	 *			 TXT-ACIFM076-.CUT_DTAIL_INFO_DKMK_IDX_NO			ｅｏ光電話利用呼情報データファイル（データ）.切断詳細情報−大項目番号
	 *			 TXT-ACIFM076-.CUT_DTAIL_INFO_CKMK_IDX_NO			ｅｏ光電話利用呼情報データファイル（データ）.切断詳細情報−中項目番号
	 *			 TXT-ACIFM076-.CUT_DTAIL_INFO_HTCK_SBT_CD			ｅｏ光電話利用呼情報データファイル（データ）.切断詳細情報−発着種別
	 *			 TXT-ACIFM076-.CHRG_DSP_CD			ｅｏ光電話利用呼情報データファイル（データ）.課金表示
	 *			 TXT-ACIFM076-.EMG_KO_FLG			ｅｏ光電話利用呼情報データファイル（データ）.緊急通報呼フラグ
	 *			 TXT-ACIFM076-.CHG_SIGNAL_RCV_CNT			ｅｏ光電話利用呼情報データファイル（データ）.ＣＨＧ信号受信回数
	 *			 TXT-ACIFM076-.TENSO_JI_HASHIN_TELNO			ｅｏ光電話利用呼情報データファイル（データ）.転送時発信元番号
	 *			 TXT-ACIFM076-.COUNTRY_NM			ｅｏ光電話利用呼情報データファイル（データ）.国名
	 * </pre>
	 * <p>
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap。
	 * @param itemvalueMap エラーメッセージに関する項目値を格納されたHashMap。
	 * @return  boolean trueである場合、エラーがありません。falseである場合、エラーを発生しました。
	 */
	private boolean isSingleCheckACIFM076(HashMap rsMap, HashMap itemvalueMap)
	{
		// 単項目チェックを行います
		String strValue = null;

		// レコード種別項目チェック
		strValue = (String)rsMap.get("REC_SBT");
		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakuesuuji1" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[] { (String)itemvalueMap.get("TXT-ACIFE002-.REC_SBT") });
			return false;
		}

		// 課金電話番号項目チェック
		strValue = (String)rsMap.get("KAKINS_TELNO");
		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakuesuuji2" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.KAKINS_TELNO") });
			return false;
		}

		// 発信元電話番号項目チェック
		strValue = (String)rsMap.get("HASHIN_TELNO");
		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakuesuuji2" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.HASHIN_TELNO") });
			return false;
		}

		// 着信先電話番号項目チェック
		strValue = (String)rsMap.get("INCOMING_TELNO");
		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakuesuuji2" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.INCOMING_TELNO") });
			return false;
		}

		// 通話開始日項目チェック
		strValue = (String)rsMap.get("PCALL_STAYMD");
		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "year_month_day1" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.PCALL_STAYMD") });
			return false;
		}

		// 通話開始時刻項目チェック
		strValue = (String)rsMap.get("PCALL_STA_HMS");
		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hour_min_sec3" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.PCALL_STA_HMS") });
			return false;
		}

		// 通話終了日項目チェック
		strValue = (String)rsMap.get("PCALL_ENDYMD");
		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "year_month_day1" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.PCALL_ENDYMD") });
			return false;
		}

		// 通話終了時刻項目チェック
		strValue = (String)rsMap.get("PCALL_END_HMS");
		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hour_min_sec3" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.PCALL_END_HMS") });
			return false;
		}

		// 通話秒数項目チェック
		strValue = (String)rsMap.get("PCALL_SEC_CNT");
		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakusuuji1" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.PCALL_SEC_CNT") });
			return false;
		}

		// 通話度数項目チェック
		strValue = (String)rsMap.get("PCALL_DOSU");
		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakusuuji1" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.PCALL_DOSU") });
			return false;
		}

		// 通話単価項目チェック
		strValue = (String)rsMap.get("PCALL_TANKA");
		if (strValue != null)
		{
			// 属性チェック前に空白削除を行う
			strValue = strValue.trim();
		}

		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakuesuuji6" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.PCALL_TANKA") });
			return false;
		}

		// 通話料金項目チェック
		strValue = (String)rsMap.get("PCALL_PRC");
		if (strValue != null)
		{
			// 属性チェック前に空白削除を行う
			strValue = strValue.trim();
		}

		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakuesuuji6" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.PCALL_PRC") });
			return false;
		}

		// 通話種別項目チェック
		strValue = (String)rsMap.get("PCALL_SBT");
		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakuesuuji1" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.PCALL_SBT") });
			return false;
		}

		// サービス区分項目チェック
		strValue = (String)rsMap.get("PCALL_SVC_DIV");
		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakuesuuji1" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.PCALL_SVC_DIV") });
			return false;
		}

		// 切断理由−ＳＩＰ項目チェック
		strValue = (String)rsMap.get("CUT_RSN_DIV_SIP");
		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakusuuji1" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.CUT_RSN_DIV_SIP") });
			return false;
		}

		// 切断理由−ＩＳＵＰ項目チェック
		strValue = (String)rsMap.get("CUT_RSN_DIV_ISUP");
		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakusuuji1" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.CUT_RSN_DIV_ISUP") });
			return false;
		}

		// 切断理由区分項目チェック
		strValue = (String)rsMap.get("CUT_RSN_DIV");
		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakuesuuji1" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.CUT_RSN_DIV") });
			return false;
		}

		// 切断詳細情報−大項目番号項目チェック
		strValue = (String)rsMap.get("CUT_DTAIL_INFO_DKMK_IDX_NO");
		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakusuuji1" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE",
							new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.CUT_DTAIL_INFO_DKMK_IDX_NO") });
			return false;
		}

		// 切断詳細情報−中項目番号項目チェック
		strValue = (String)rsMap.get("CUT_DTAIL_INFO_CKMK_IDX_NO");
		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakusuuji1" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE",
							new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.CUT_DTAIL_INFO_CKMK_IDX_NO") });
			return false;
		}

		// 切断詳細情報−発着種別項目チェック
		strValue = (String)rsMap.get("CUT_DTAIL_INFO_HTCK_SBT_CD");
		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakuesuuji1" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE",
							new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.CUT_DTAIL_INFO_HTCK_SBT_CD") });
			return false;
		}

		// 課金表示項目チェック
		strValue = (String)rsMap.get("CHRG_DSP_CD");
		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakuesuuji1" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.CHRG_DSP_CD") });
			return false;
		}

		// 緊急通報呼フラグ項目チェック
		strValue = (String)rsMap.get("EMG_KO_FLG");
		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakuesuuji1" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.EMG_KO_FLG") });
			return false;
		}

		// ＣＨＧ信号受信回数項目チェック
		strValue = (String)rsMap.get("CHG_SIGNAL_RCV_CNT");
		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakusuuji1" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE",
							new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.CHG_SIGNAL_RCV_CNT") });
			return false;
		}

		// 転送時発信元番号項目チェック
		strValue = (String)rsMap.get("TENSO_JI_HASHIN_TELNO");
		if (strValue != null)
		{
			// 属性チェック前に空白削除を行う
			strValue = strValue.trim();
		}

		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakuesuuji2" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE",
							new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.TENSO_JI_HASHIN_TELNO") });
			return false;
		}

		// 国名項目チェック
		strValue = ((String)rsMap.get("COUNTRY_NM"));
		if (strValue != null)
		{
			// 属性チェック前に空白削除を行う
			strValue = strValue.trim();
		}

		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakuesuuji2" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[] { (String)itemvalueMap.get("TXT-ACIFM076-.COUNTRY_NM") });
			return false;
		}

		return true;
	}

	/**
	 *入力情報（ｅｏ光電話利用呼情報データファイル（トレーラ））の単項目チェックを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.単項目チェックを行います。<br>
	 * 
	 * 2.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		rsMap:(項目、値)を(key、value)として、データをrsMapに入れます
	 *		itemvalueMap:埋め込み文字の値をitemvalueMapに入れます。キーの値は、以下に説明します。
	 *			 TXT-ACIFM077-.DATA_REC_CNT			ｅｏ光電話利用呼情報データファイル（トレーラ）.データレコード件数
	 * </pre>
	 * <p>
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap。
	 * @param itemvalueMap エラーメッセージに関する項目値を格納されたHashMap。
	 * @return  boolean trueである場合、エラーがありません。falseである場合、エラーを発生しました。
	 */
	private boolean isSingleCheckACIFM077(HashMap rsMap, HashMap itemvalueMap)
	{
		// 単項目チェックを行います
		String strValue = null;

		// データレコード件数項目チェック
		strValue = (String)rsMap.get("DATA_REC_CNT");
		// 属性チェック
		if (!JBSbatCheckUtil.invoke(strValue, new String[] { "hannkakusuuji1" }))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[] { (String)itemvalueMap.get("TXT-ACIFM077-.DATA_REC_CNT") });
			return false;
		}

		return true;
	}

	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * 前回分の通番を取得
	 * 
	 * @param fileDir ディレクトリ
	 * @param fileName ファイル名
	 * @param fileDef ファイル定義
	 * @return 前回通番
	 * @throws Exception スローされる例外
	 */
	private int getZnkiSeq(String fileDir, String fileName, String fileDef) throws Exception
	{
		// ファイル読み込み
		String filePath = fileDir + fileName;
		if (filePath != null)
		{
			JBSbatInputFileUtil inFileObj = new JBSbatInputFileUtil(fileDir + fileName);
			inFileObj.setEncode(JACStrConst.ENCODE_MS932);
			inFileObj.createReader();
			JBSbatServiceInterfaceMap retInMap = getRecMap(inFileObj, inFileObj.readLine(), fileDef);
			inFileObj.close();

			// 前回通番を返却
			return Integer.parseInt(retInMap.getString(JBSbatACIFM075.FILE_SEQ));
		}
		else
		{
			return -1;
		}
	}

	/**
	 * ファイルからレコードを取得
	 * 
	 * @param inFileObj 入力ファイルオブジェクト
	 * @param sLine 行文字列
	 * @param fileDef ファイル定義名
	 * @return レコードマップ
	 * @throws Exception スローされる例外
	 */
	private JBSbatServiceInterfaceMap getRecMap(JBSbatInputFileUtil inFileObj, String sLine, String fileDef) throws Exception
	{
		String enc = inFileObj.getEncode();

		// encodeの形式がSHIFT-JISの場合、MS932に変換
		if (JACStrConst.ENCODE_SJIS.toUpperCase().equals(enc.toUpperCase()))
		{
			enc = JACStrConst.ENCODE_MS932;
		}

		JBSbatDefFileUtil defUtil = new JBSbatDefFileUtil(JBSbatAplConst.getAplConstValue(PARAM_IND) + fileDef, inFileObj);
		inFileObj.setEncode(enc);

		return defUtil.lineToObject(sLine, inFileObj, 0);
	}

	/**
	 * 未来日チェックを行う
	 * <BR>
	 * @param staYmd 開始年月日
	 * @param staHms システム時分秒
	 * @param row 行数
	 * @return	true:正常、false:エラー
	 * @throws Exception
	 */
	private boolean checkFutureData(String staYmd, String staHms, int row) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][checkFutureData]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][checkFutureData]sysYmdhms[システム年月日時分秒]" + sysWkTime
						+ ", staYmd + staHms[通話開始年月日時分秒]" + staYmd + staHms);

		// オンライン運用日＋システム時間　＜　通話開始年月日＋時刻 の場合
		if (Long.parseLong(sysWkTime) < Long.parseLong(staYmd + staHms))
		{
			// ログ出力
			commonItem.getLogPrint().printBusinessErrorLog(JPCBatchMessageConstant.EACB0630NW, new String[] { String.valueOf(row) });

			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][checkFutureData]エラー");

			return false;
		}

		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][checkFutureData]正常");

		return true;
	}

	/**
	 * 050アプリ利用履歴情報データを生成する
	 * <BR>
	 * @param inMap 入力データ
	 * @return 出力データ
	 * @throws Exception 
	 * 
	 */
	private ArrayList<String> createData(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		// データのインスタンスを生成
		ArrayList<String> data = new ArrayList<String>();

		// 値を設定
		data.add(inMap.getString(JBSbatACIFM076.KAKINS_TELNO).trim());
		data.add(inMap.getString(JBSbatACIFM076.HASHIN_TELNO).trim());
		data.add(inMap.getString(JBSbatACIFM076.INCOMING_TELNO));
		data.add(inMap.getString(JBSbatACIFM076.PCALL_STAYMD));
		data.add(inMap.getString(JBSbatACIFM076.PCALL_STA_HMS));
		data.add(inMap.getString(JBSbatACIFM076.PCALL_ENDYMD));
		data.add(inMap.getString(JBSbatACIFM076.PCALL_END_HMS));
		data.add(inMap.getString(JBSbatACIFM076.PCALL_SEC_CNT));
		data.add(inMap.getString(JBSbatACIFM076.PCALL_DOSU));
		data.add(inMap.getString(JBSbatACIFM076.PCALL_TANKA));
		data.add(inMap.getString(JBSbatACIFM076.PCALL_PRC));
		data.add(inMap.getString(JBSbatACIFM076.PCALL_SBT));
		data.add(inMap.getString(JBSbatACIFM076.PCALL_SVC_DIV));
		data.add(inMap.getString(JBSbatACIFM076.CUT_RSN_DIV_SIP));
		data.add(inMap.getString(JBSbatACIFM076.CUT_RSN_DIV_ISUP));
		data.add(inMap.getString(JBSbatACIFM076.CUT_RSN_DIV));
		data.add(inMap.getString(JBSbatACIFM076.CUT_DTAIL_INFO_DKMK_IDX_NO));
		data.add(inMap.getString(JBSbatACIFM076.CUT_DTAIL_INFO_CKMK_IDX_NO));
		data.add(inMap.getString(JBSbatACIFM076.CUT_DTAIL_INFO_HTCK_SBT_CD));
		data.add(inMap.getString(JBSbatACIFM076.CHRG_DSP_CD));
		data.add(inMap.getString(JBSbatACIFM076.EMG_KO_FLG));
		data.add(inMap.getString(JBSbatACIFM076.CHG_SIGNAL_RCV_CNT));
		data.add(inMap.getString(JBSbatACIFM076.TENSO_JI_HASHIN_TELNO));
		data.add(inMap.getString(JBSbatACIFM076.COUNTRY_NM).trim());

		// データを返却
		return data;
	}

	/**
	 * 050アプリ利用呼情報エラー情報データを生成する
	 * <BR>
	 * @param inMap 入力データ
	 * @param errCd エラーコード
	 * @param errMsg エラーメッセージ
	 * @return 出力データ
	 * @throws Exception 
	 * 
	 */
	private ArrayList<String> createErrData(JBSbatServiceInterfaceMap inMap, String errCd, String errMsg) throws Exception
	{
		// データのインスタンスを生成
		ArrayList<String> data = new ArrayList<String>();

		// 値を設定
		data.add(inMap.getString(JBSbatACIFM076.KAKINS_TELNO).trim());
		data.add(inMap.getString(JBSbatACIFM076.HASHIN_TELNO).trim());
		data.add(inMap.getString(JBSbatACIFM076.INCOMING_TELNO));
		data.add(inMap.getString(JBSbatACIFM076.PCALL_STAYMD));
		data.add(inMap.getString(JBSbatACIFM076.PCALL_STA_HMS));
		data.add(inMap.getString(JBSbatACIFM076.PCALL_ENDYMD));
		data.add(inMap.getString(JBSbatACIFM076.PCALL_END_HMS));
		data.add(addDecimalPoint(inMap.getString(JBSbatACIFM076.PCALL_SEC_CNT), JACStrConst.PCALL_SEC_CNT_DEC_LENGTH));
		data.add(inMap.getString(JBSbatACIFM076.PCALL_DOSU));
		data.add(addDecimalPoint(inMap.getString(JBSbatACIFM076.PCALL_TANKA), JACStrConst.PCALL_TANKA_DEC_LENGTH));
		data.add(addDecimalPoint(inMap.getString(JBSbatACIFM076.PCALL_PRC), JACStrConst.PCALL_PRC_DEC_LENGTH));
		data.add(inMap.getString(JBSbatACIFM076.PCALL_SBT));
		data.add(inMap.getString(JBSbatACIFM076.PCALL_SVC_DIV));
		data.add(inMap.getString(JBSbatACIFM076.CUT_RSN_DIV_SIP));
		data.add(inMap.getString(JBSbatACIFM076.CUT_RSN_DIV_ISUP));
		data.add(inMap.getString(JBSbatACIFM076.CUT_RSN_DIV));
		data.add(inMap.getString(JBSbatACIFM076.CUT_DTAIL_INFO_DKMK_IDX_NO));
		data.add(inMap.getString(JBSbatACIFM076.CUT_DTAIL_INFO_CKMK_IDX_NO));
		data.add(inMap.getString(JBSbatACIFM076.CUT_DTAIL_INFO_HTCK_SBT_CD));
		data.add(inMap.getString(JBSbatACIFM076.CHRG_DSP_CD));
		data.add(inMap.getString(JBSbatACIFM076.EMG_KO_FLG));
		data.add(inMap.getString(JBSbatACIFM076.CHG_SIGNAL_RCV_CNT));
		data.add(inMap.getString(JBSbatACIFM076.TENSO_JI_HASHIN_TELNO));
		data.add(inMap.getString(JBSbatACIFM076.COUNTRY_NM).trim());
		data.add(errCd);
		data.add(errMsg);

		// データを返却
		return data;
	}

	/**
	 * 文字列の右から 指定された桁数の位置に小数点を付与する
	 * <BR>
	 * @param baseNumValue	付与元文字列
	 * @param decNum	小数点以下桁数
	 * @return	double	小数点付与後文字列
	 * @throws Exception
	 */
	private String addDecimalPoint(String baseNumValue, int decNum) throws Exception
	{
		StringBuffer numValue = new StringBuffer(baseNumValue);

		// 指定位置に小数点を付与して返却
		return numValue.insert(baseNumValue.length() - decNum, JACStrConst.DECIMAL_POINT).toString();
	}

	/**
	 * ファイル出力
	 * <BR>
	 * @param outDir 出力ディレクトリ
	 * @param outFileName 出力ファイル名
	 * @param defFileName 定義ファイル名
	 * @param arrayList 出力データを格納した配列
	 * @throws Exception スローされる例外
	 */
	private void outputFile(String outDir, String outFileName, String defFileName, ArrayList<ArrayList<String>> arrayList) throws Exception
	{
		String outFilePath = outDir + outFileName;
		String outFileDefPath = JBSbatAplConst.getAplConstValue(PARAM_OTD) + defFileName;
		JBSbatOutputFileUtil dataFile = new JBSbatOutputFileUtil(outFilePath);
		JBSbatDefFileUtil dataFileDef = new JBSbatDefFileUtil(outFileDefPath, dataFile);

		// encodeの形式がSHIFT-JISの場合、MS932に変換
		String encode = dataFile.getEncode();
		if (JACStrConst.ENCODE_SJIS.toUpperCase().equals(encode.toUpperCase()))
		{
			encode = JACStrConst.ENCODE_MS932;
		}

		// ファイルの生成
		JBSbatBusinessFileUtil fileUtil = JCCBatCommon.createBusinessFileUtil(outFilePath, encode, JACBatCommon.chgKaigyo(dataFile.getLine()),
						dataFileDef.getDelimiter());
		Iterator<ArrayList<String>> it = arrayList.iterator();

		// データ数分繰り返し
		while (it.hasNext())
		{
			// データを取得
			ArrayList<String> data = it.next();

			// ファイルに書き込み
			JCCBatCommon.printBusinessFileUtil(fileUtil, data);
		}

		// ファイルを閉じる
		JCCBatCommon.closeBusinessFileUtil(fileUtil);
	}
}
