/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSBatACTelnoGuideUseChrgInfoTrkmFormatChk
*	ソースファイル名	：JBSBatACTelnoGuideUseChrgInfoTrkmFormatChk.java
*	作成者				：富士通　
*   日付                ：2024年05月17日
*＜機能概要＞
*　電話番号案内利用課金情報取込フォーマットチェック部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*  v71.00.00   2024/05/17  FJ)吉田賢	【ANK-4497-00-00】電話番号案内の課金情報連携変更対応
*  v71.00.00   2024/07/02  FJ)上島      【IT1-2024-0000017】電話番号案内の課金情報連携変更対応
*********************************************************************/
package eo.business.service;

import com.fujitsu.futurity.model.common.check.HalfCharCheck;
import com.fujitsu.futurity.model.common.check.LengthCheck;

import eo.business.common.JACbatDebugLogUtil;
import eo.business.common.JBSbatBusinessService;
import eo.business.common.JKKBatCommon;
import eo.business.util.file.JBSbatACIFM366;
import eo.business.util.file.JBSbatACIFM367;
import eo.business.util.file.JBSbatACIFM368;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.common.util.JCHStringUtil;
import eo.common.util.JKKStringUtil;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;

/**
* 電話番号案内利用課金情報取込フォーマットチェック <p>
*<BR>
* @author 富士通
*/
public class JBSbatACTelnoGuideUseChrgInfoTrkmFormatChk extends JBSbatBusinessService
{
	// ==================================
	// =====ヘッダ部フォーマット情報=====
	// ==================================
	/** ヘッダ部カラム数 */
	private final int HEADER_COLUMN_CNT = 5;
	
	/** 入力ファイルインデックス(レコード区分) */
	private final int HEADER_INDEX_RECODE_KBN = 0;
	/** 入力ファイルインデックス(事業者コード) */
	private final int HEADER_INDEX_JIGYOSHA_CD = 1;
	/** 入力ファイルインデックス(データ作成日) */
	private final int HEADER_INDEX_DATA_MAKE_YMD = 2;
	/** 入力ファイルインデックス(データ作成時刻) */
	private final int HEADER_INDEX_DATA_MAKE_TIME = 3;
	/** 入力ファイルインデックス(予備) */
	private final int HEADER_INDEX_YOBI = 4;
	
	// ==================================
	// =====データ部フォーマット情報=====
	// ==================================
	/** データ部カラム数 */
	private final int DETA_COLUMN_CNT = 18;
	
	/** 入力ファイルインデックス(レコード区分) */
	private final int DETA_INDEX_RECODE_KBN = 0;
	/** 入力ファイルインデックス(事業者コード) */
	private final int DETA_INDEX_JIGYOSHA_CD = 1;
	/** 入力ファイルインデックス(データ作成日) */
	private final int DETA_INDEX_DATA_MAKE_YMD = 2;
	/** 入力ファイルインデックス(データ作成時刻) */
	private final int DETA_INDEX_DATA_MAKE_TIME = 3;
	/** 入力ファイルインデックス(レコード番号) */
	private final int DETA_INDEX_RECODE_NO = 4;
	/** 入力ファイルインデックス(発信者電話番号) */
	private final int DETA_INDEX_HASINSHA_TELNO = 5;
	/** 入力ファイルインデックス(着信電話番号) */
	private final int DETA_INDEX_INCOMING_TELNO = 6;
	/** 入力ファイルインデックス(発側エリアコード) */
	private final int DETA_INDEX_HASHIN_AREA_CD = 7;
	/** 入力ファイルインデックス(着側エリアコード) */
	private final int DETA_INDEX_INCOMING_AREA_CD = 8;
	/** 入力ファイルインデックス(課金回数) */
	private final int DETA_INDEX_CHRG_CNT = 9;
	/** 入力ファイルインデックス(発側開始日) */
	private final int DETA_INDEX_HASHIN_STA_YMD = 10;
	/** 入力ファイルインデックス(発側開始時刻) */
	private final int DETA_INDEX_HASHIN_STA_TIME = 11;
	/** 入力ファイルインデックス(発側終了日) */
	private final int DETA_INDEX_HASHIN_END_YMD = 12;
	/** 入力ファイルインデックス(発側終了時刻) */
	private final int DETA_INDEX_HASHIN_END_TIME = 13;
	/** 入力ファイルインデックス(着側開始日) */
	private final int DETA_INDEX_INCOMING_STA_YMD = 14;
	/** 入力ファイルインデックス(着側開始時刻) */
	private final int DETA_INDEX_INCOMING_STA_TIME = 15;
	/** 入力ファイルインデックス(着側終了日) */
	private final int DETA_INDEX_INCOMING_END_YMD = 16;
	/** 入力ファイルインデックス(着側終了時刻) */
	private final int DETA_INDEX_INCOMING_END_TIME = 17;
	
	// ====================================
	// =====トレーラ部フォーマット情報=====
	// ====================================
	/** トレーラ部カラム数 */
	private final int TRAILER_COLUMN_CNT = 7;
	
	/** 入力ファイルインデックス(レコード区分) */
	private final int TRAILER_INDEX_RECODE_KBN = 0;
	/** 入力ファイルインデックス(事業者コード) */
	private final int TRAILER_INDEX_JIGYOSHA_CD = 1;
	/** 入力ファイルインデックス(データ作成日) */
	private final int TRAILER_INDEX_DATA_MAKE_YMD = 2;
	/** 入力ファイルインデックス(データ作成時刻) */
	private final int TRAILER_INDEX_DATA_MAKE_TIME = 3;
	/** 入力ファイルインデックス(レコード件数) */
	private final int TRAILER_INDEX_RECODE_CNT = 4;
	/** 入力ファイルインデックス(課金回数合計) */
	private final int TRAILER_INDEX_CHRG_CNT_SUM = 5;
	/** 入力ファイルインデックス(予備) */
	private final int TRAILER_INDEX_YOBI = 6;
	
	// ==============================
	// =====エラーメッセージ情報=====
	// ==============================
	/** エラーメッセージ(必須チェックエラー) */
	private final String ERRMSG_NULL_CHK = "必須チェックエラー";
	/** エラーメッセージ(属性チェックエラー) */
	private final String ERRMSG_ATTRIBUTE_CHK = "属性チェックエラー";
	/** エラーメッセージ(桁数チェックエラー) */
	private final String ERRMSG_LENGTH_CHK = "桁数チェックエラー";
	/** エラーメッセージ(ヘッダ部カラム数チェックエラー) */
	private final String ERRMSG_HEADER_COLUMN_CHK = "ヘッダレコードカラム数チェックエラー";
	/** エラーメッセージ(データ部カラム数チェックエラー) */
	private final String ERRMSG_DATA_COLUMN_CHK = "データレコードカラム数チェックエラー";
	/** エラーメッセージ(トレーラ部カラム数チェックエラー) */
	private final String ERRMSG_TRAILER_COLUMN_CHK = "トレーラレコードカラム数チェックエラー";
	/** エラーメッセージ(想定外レコード区分チェックエラー) */
	private final String ERRMSG_RECORD_KBN_CHK = "想定されたレコード区分ではありません。";
	/** エラーメッセージ(先頭行ヘッダチェックエラー) */
	private final String ERRMSG_TOP_RECORD_HEADER_CHK = "レコード１件目がヘッダレコードではありません。";
	/** エラーメッセージ(中間行データ／トレーラチェックエラー) */
	private final String ERRMSG_MID_RECORD_CHK = "レコード２件目以降がデータレコード、および、トレーラレコードではありません。";
	/** エラーメッセージ(最終行トレーラチェックエラー) */
	private final String ERRMSG_BOT_RECORD_TRAILER_CHK = "最終行がトレーラレコードではありません。";
	/** エラーメッセージ(ヘッダレコード複数エラー) */
	private final String ERRMSG_HEADER_DUPLICATION_CHK = "ヘッダレコードが複数行存在します。";
	/** エラーメッセージ(トレーラ部複数エラー) */
	private final String ERRMSG_TRAILER_DUPLICATION_CHK = "トレーラ部が複数行存在します。";
	/** エラーメッセージ(トレーラレコードレコード件数チェックエラー) */
	private final String ERRMSG_RECORD_CNT_SUM_CHK = "トレーラレコードのレコード件数が、ファイルのレコード全体レコード数と一致しません。";
	/** エラーメッセージ(トレーラレコード課金回数チェックエラー) */
	private final String ERRMSG_CHRG_CNT_SUM_CHK = "トレーラレコードの課金回数合計が、ファイルのデータ全体の課金回数の合計と一致しません。";
	
	// ==================
	// =====固有定数=====
	// ==================
	/** レコード区分(ヘッダ) */
	private final String CONST_RECODE_KBN_HEADER = "H";
	/** レコード区分(データ) */
	private final String CONST_RECODE_KBN_DATA = "D";
	/** レコード区分(トレーラ) */
	private final String CONST_RECODE_KBN_TRAILER = "T";
	
	
	// ======================
	// =====共通変数情報=====
	// ======================
	// 2024/07/02 IT1-2024-0000017 上島 DEL START
//	/** 初回レコード処理済みフラグ */
//	private boolean firstRecodeProcFlg = false;
	// 2024/07/02 IT1-2024-0000017 上島 DEL END
	/** ヘッダ重複フラグ */
	private boolean headerDuplicationFlg = false;
	/** トレーラ重複フラグ */
	private boolean trailerDuplicationFlg = false;
	// 2024/07/02 IT1-2024-0000017 上島 ADD START
	/** トレーラレコード合計件数比較可能 */
	private boolean recCntSumCompaFlg = true;
	/** トレーラ課金合計回数比較可能 */
	private boolean chrgCntSumCompaFlg = true;
	// 2024/07/02 IT1-2024-0000017 上島 ADD END
	/** レコード件数合計 */
	private int recodeCntSum = 0;
	/** レコード件数合計処理の開始フラグ*/
	private boolean recodeCntSumFlg = false;
	/** 課金回数合計 */
	private int chrgCntSum = 0;
	/** 課金回数合計処理の開始フラグ*/
	private boolean chrgCntSumFlg = false;
	/** フリー項目のファイル名 */
	private String[] freeFiles = null;
	/** シェルで取得したファイル行数 */
	private String inFileLine = "-1";
	/** ヘッダ出力済フラグ */
	private boolean exexcOutputHeader = false;
	
	
	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);
		
		// フリー項目を取得
		String freeItem = commonItem.getFreeItem();
		this.freeFiles = freeItem.split(JACStrConst.FREE_DIV);
		inFileLine = freeFiles[0];
		
		
		// DBアクセスクラスを生成します
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][initial]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][initial][opeDate=" + super.opeDate + "]");
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][initial]");
	/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputItem) throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute]");
		assert inMap != null ? JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][execute][inMap=" + inMap.getMap().toString() + "]"): true;
		
		String recode = inMap.getString(JBSbatACIFM366.RECODE);
		
		if(!exexcOutputHeader)
		{
			// エラーファイルにヘッダ情報を出力する
			setOutputMapErrorHeader(inMap, outputItem);
			exexcOutputHeader = true;
		}
		
		// レコード件数加算
		recodeCntSum++;
		// レコード件数合計処理の開始
		recodeCntSumFlg = true;
		
		//レコードのカラム値を取得
		String[] value = recode.split(",");
		
		// 2024/07/02 IT1-2024-0000017 上島 MOD START
//		//最終行で、かつ、トレーラレコードではない場合はエラー
//		if(recodeCntSum == Integer.parseInt(inFileLine) && 
//				!CONST_RECODE_KBN_TRAILER.equals(value[0])){
//			
//			// エラーログ:ファイル形式チェックエラー
//			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][checkTrailer][ファイル形式チェックエラー]");
//			// エラーを出力
//			setOutputMapError(inMap, outputItem, new String[DETA_COLUMN_CNT], ERRMSG_BOT_RECORD_TRAILER_CHK);
//			
//			// エラーフラグをtrueに設定
//			commonItem.setErrFlg(true);
//		}
//		
		boolean recKbnErrFlg = false;
		//先頭行で、かつ、ヘッダレコードではない場合エラー
		if (recodeCntSum == 1){
			if(!CONST_RECODE_KBN_HEADER.equals(value[0])){
				recKbnErrFlg = true;
				// エラーを出力
				setOutputMapError(inMap, outputItem, new String[DETA_COLUMN_CNT], ERRMSG_TOP_RECORD_HEADER_CHK);
			}
			//1行目にトレーラが存在した場合
			if(CONST_RECODE_KBN_TRAILER.equals(value[0])){
				//トレーラ部の合計比較検証不可能
				recCntSumCompaFlg = false;
				chrgCntSumCompaFlg = false;
			}
		}
		//最終行で、かつ、トレーラレコードではない場合はエラー
		else if(recodeCntSum == Integer.parseInt(inFileLine)){
			if(!CONST_RECODE_KBN_TRAILER.equals(value[0])){
				recKbnErrFlg = true;
				// エラーを出力
				setOutputMapError(inMap, outputItem, new String[DETA_COLUMN_CNT], ERRMSG_BOT_RECORD_TRAILER_CHK);
				//合計検証はトレーラが最終行にあることが前提のため
				//トレーラ部の合計比較検証不可能
				recCntSumCompaFlg = false;
				chrgCntSumCompaFlg = false;
			}
		}
		//それ以外はデータレコードでない場合エラー
		else {
			if(!CONST_RECODE_KBN_DATA.equals(value[0])){
				recKbnErrFlg = true;
				// エラーを出力
				setOutputMapError(inMap, outputItem, new String[DETA_COLUMN_CNT], ERRMSG_MID_RECORD_CHK + "（ファイル："+recodeCntSum+"行目）");
			}
			//レコード中盤でトレーラが存在した場合
			if(CONST_RECODE_KBN_TRAILER.equals(value[0])){
				//トレーラ部の合計比較検証不可能
				recCntSumCompaFlg = false;
				chrgCntSumCompaFlg = false;
			}
		}
		if(recKbnErrFlg){
			// エラーログ:ファイル形式チェックエラー
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][checkTrailer][ファイル形式チェックエラー]");
			// エラーフラグをtrueに設定
			commonItem.setErrFlg(true);
			// 警告終了 「【警告】エラー対象レコード＝（%1%）」
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB1000CI, new String[] {recode});
			
		}
		// 2024/07/02 IT1-2024-0000017 上島 MOD END
		
		// レコード区分でチェック内容を判断する
		// レコード区分がヘッダの場合
		if(CONST_RECODE_KBN_HEADER.equals(value[0]))
		{
			// ヘッダ部チェックを行う
			if(checkHeader(inMap, outputItem, value))
			{
				// ファイルに出力しない
			}
			else
			{
				// エラーフラグをtrueに設定
				commonItem.setErrFlg(true);
				// 警告終了 「【警告】エラー対象レコード＝（%1%）」
				super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB1000CI, new String[] {recode});
			}
			
			// ヘッダ重複フラグを立てる
			headerDuplicationFlg = true;
		}
		// レコード区分がデータの場合
		else if (CONST_RECODE_KBN_DATA.equals(value[0]))
		{
			// データ部チェックを行う
			if(checkData(inMap, outputItem, value))
			{
				// データ部チェックで問題なければファイルに出力する
				setOutputMapSucsess(inMap, outputItem, value);
				
				// トレーラレコードチェック用に課金回数を計算する
				chrgCntSum += Integer.parseInt(value[DETA_INDEX_CHRG_CNT]);
				// 課金回数合計処理の開始
				chrgCntSumFlg = true;
			}
			else
			{
				// エラーフラグをtrueに設定
				commonItem.setErrFlg(true);
				// 警告終了 「【警告】エラー対象レコード＝（%1%）」
				super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB1000CI, new String[] {recode});
			}
			
		}
		// レコード区分がトレーラの場合
		else if (CONST_RECODE_KBN_TRAILER.equals(value[0]))
		{
			if(checkTrailer(inMap, outputItem, value))
			{
				// ファイルに出力しない
			}
			else
			{
				// エラーフラグをtrueに設定
				commonItem.setErrFlg(true);
				// 警告終了 「【警告】エラー対象レコード＝（%1%）」
				super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB1000CI, new String[] {recode});
			}
			
			// トレーラ重複フラグを立てる
			trailerDuplicationFlg = true;
		}
		// 上記以外の場合
		else
		{
			// エラーログ:ファイル形式チェックエラー
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][checkTrailer][ファイル形式チェックエラー]");
			// エラーを出力
			setOutputMapError(inMap, outputItem, new String[DETA_COLUMN_CNT], ERRMSG_RECORD_KBN_CHK);
			
			// エラーフラグをtrueに設定
			commonItem.setErrFlg(true);
			// 警告終了 「【警告】エラー対象レコード＝（%1%）」
			super.logPrint.printBusinessErrorLog(JPCBatchMessageConstant.EACB1000CI, new String[] {recode});
			return outputItem;
		}
		
		// 2024/07/02 IT1-2024-0000017 上島 DEL START
//		firstRecodeProcFlg = true;
		// 2024/07/02 IT1-2024-0000017 上島 DEL END
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][execute]");
		return outputItem;
	/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
	/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][terminal]");
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][terminal]");
	/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}
	
	/**
	 * ヘッダレコードのチェックを行います。
	 * 
	 * @param inMap 入力電文
	 * @param outputItem 出力電文
	 * @throws Exception 
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private boolean checkHeader(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputItem, String[] recode) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][checkTrailer]");
		
		// ============================
		// === フォーマットチェック ===
		// ============================
		
		boolean formatErrFlg = true;
		
		// ヘッダレコードカラム数が異なる場合はエラー
		if(recode.length != HEADER_COLUMN_CNT)
		{
			// エラーログ:ファイル形式チェックエラー
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][checkTrailer][ファイル形式チェックエラー]");
			// エラーを出力
			// recodeのカラム数が正しくないため、正しいカラム数の空配列を作成してエラーメッセージを出力する
			setOutputMapError(inMap, outputItem, new String[DETA_COLUMN_CNT], ERRMSG_HEADER_COLUMN_CHK);
			formatErrFlg = false;
		}
		
		// 2024/07/02 IT1-2024-0000017 上島 DEL START
//		// 最初のレコードではない場合はエラー
//		if(firstRecodeProcFlg)
//		{
//			// エラーログ:ファイル形式チェックエラー
//			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][checkTrailer][ファイル形式チェックエラー]");
//			// エラーを出力
//			// recodeのカラム数が正しくないため、正しいカラム数の空配列を作成してエラーメッセージを出力する
//			setOutputMapError(inMap, outputItem, new String[DETA_COLUMN_CNT], ERRMSG_MID_RECORD_CHK);
//			formatErrFlg = false;
//		}
		// 2024/07/02 IT1-2024-0000017 上島 DEL END
		
		// 既にヘッダレコードを処理済みの場合
		if(headerDuplicationFlg)
		{
			// エラーログ:ファイル形式チェックエラー
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][checkTrailer][ファイル形式チェックエラー]");
			// エラーを出力
			// recodeのカラム数が正しくないため、正しいカラム数の空配列を作成してエラーメッセージを出力する
			setOutputMapError(inMap, outputItem, new String[DETA_COLUMN_CNT], ERRMSG_HEADER_DUPLICATION_CHK);
			formatErrFlg = false;
		}
		//エラーが存在する場合にはfalse
		if(!formatErrFlg){
			return false;
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][checkTrailer]");
		return true;
	}
	
	/**
	 * データレコードのチェックを行います。
	 * 
	 * @param inMap 入力電文
	 * @param outputItem 出力電文
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private boolean checkData(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputItem, String[] recode) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][dataCheck]");
		
		// ============================
		// === フォーマットチェック ===
		// ============================
		// データ部カラム数が異なる場合はエラー
		if(recode.length != DETA_COLUMN_CNT)
		{
			// エラーログ:ファイル形式チェックエラー
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][dataCheck][ファイル形式チェックエラー]");
			// エラーを出力
			// recodeのカラム数が正しくないため、正しいカラム数の空配列を作成してエラーメッセージを出力する
			setOutputMapError(inMap, outputItem, new String[DETA_COLUMN_CNT], ERRMSG_DATA_COLUMN_CHK);
			
			// 2024/07/02 IT1-2024-0000017 上島 ADD START
			//トレーラ部の合計比較検証不可能
			recCntSumCompaFlg = false;
			chrgCntSumCompaFlg = false;
			// 2024/07/02 IT1-2024-0000017 上島 ADD END
			
			return false;
		}
		
		// 2024/07/02 IT1-2024-0000017 上島 DEL START
//		// 最初のレコードの場合はエラー
//		if(!firstRecodeProcFlg)
//		{
//			// エラーログ:ファイル形式チェックエラー
//			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][dataCheck][ファイル形式チェックエラー]");
//			// エラーを出力
//			setOutputMapError(inMap, outputItem, recode, ERRMSG_TOP_RECORD_HEADER_CHK);
//			return false;
//		}
		// 2024/07/02 IT1-2024-0000017 上島 DEL END
		
		// データ部のフォーマットチェックでエラー
		if(!checkDataFormat(inMap, outputItem, recode))
		{
			// エラーログ:フォーマットチェックエラー
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][dataCheck][フォーマットチェックエラー]");
			// エラーはチェック先で出力済み
			return false;
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][dataCheck]");
		return true;
	}
	
	/**
	 * トレーラレコードのチェックを行います。
	 * 
	 * @param inMap 入力電文
	 * @param outputItem 出力電文
	 * @throws Exception 
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private boolean checkTrailer(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputItem, String[] recode) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][checkTrailer]");
		
		// ============================
		// === フォーマットチェック ===
		// ============================
		boolean formatErrFlg = true;
		
		// トレーラ部カラム数が異なる場合はエラー
		if(recode.length != TRAILER_COLUMN_CNT)
		{
			// エラーログ:ファイル形式チェックエラー
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][checkTrailer][ファイル形式チェックエラー]");
			// エラーを出力
			// recodeのカラム数が正しくないため、正しいカラム数の空配列を作成してエラーメッセージを出力する
			setOutputMapError(inMap, outputItem, new String[DETA_COLUMN_CNT], ERRMSG_TRAILER_COLUMN_CHK);
			formatErrFlg = false;
			// 2024/07/02 IT1-2024-0000017 上島 ADD START
			//トレーラ部の合計比較検証不可能
			recCntSumCompaFlg = false;
			chrgCntSumCompaFlg = false;
			// 2024/07/02 IT1-2024-0000017 上島 ADD END
		}
		
		// 2024/07/02 IT1-2024-0000017 上島 DEL START
//		// 最初のレコードの場合はエラー
//		if(!firstRecodeProcFlg)
//		{
//			// エラーログ:ファイル形式チェックエラー
//			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][checkTrailer][ファイル形式チェックエラー]");
//			// エラーを出力
//			setOutputMapError(inMap, outputItem, new String[DETA_COLUMN_CNT], ERRMSG_TOP_RECORD_HEADER_CHK);
//			formatErrFlg = false;
//			//トレーラ部の合計比較検証不可能
//			recCntSumCompaFlg = false;
//			chrgCntSumCompaFlg = false;
//		}
		// 2024/07/02 IT1-2024-0000017 上島 DEL END
		
		// 既にトレーラレコードを処理済みの場合
		if(trailerDuplicationFlg)
		{
			// エラーログ:ファイル形式チェックエラー
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][checkTrailer][ファイル形式チェックエラー]");
			// エラーを出力
			setOutputMapError(inMap, outputItem, new String[DETA_COLUMN_CNT], ERRMSG_TRAILER_DUPLICATION_CHK);
			formatErrFlg = false;
			// 2024/07/02 IT1-2024-0000017 上島 ADD START
			//トレーラ部の合計比較検証不可能
			recCntSumCompaFlg = false;
			chrgCntSumCompaFlg = false;
			// 2024/07/02 IT1-2024-0000017 上島 ADD END
		}
		// トレーラ部のフォーマットチェックでエラー
		if(!checkTrailerFormat(inMap, outputItem, recode))
		{
			// エラーログ:フォーマットチェックエラー
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][dataCheck][フォーマットチェックエラー]");
			// エラーはチェック先で出力済み
			formatErrFlg = false;
			// 2024/07/02 IT1-2024-0000017 上島 ADD START
			//トレーラ部の合計比較検証不可能
			recCntSumCompaFlg = false;
			chrgCntSumCompaFlg = false;
			// 2024/07/02 IT1-2024-0000017 上島 ADD END
		}
		// 2024/07/02 IT1-2024-0000017 上島 MOD START
//		// レコード合計サマリ処理が開始されており、かつ、レコード合計件数が、データレコードの件数の合計と異なる場合はエラー
//		if(recodeCntSumFlg && Integer.parseInt(recode[TRAILER_INDEX_RECODE_CNT]) != recodeCntSum)
//		{
//			// エラーログ:レコード件数チェックエラー
//			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][checkTrailer][ファイル形式チェックエラー]");
//			// エラーを出力
//			setOutputMapError(inMap, outputItem, new String[DETA_COLUMN_CNT], ERRMSG_RECORD_CNT_SUM_CHK);
//			formatErrFlg = false;
//		}
//		
//		// 課金合計サマリ処理が開始されており、かつ、課金合計回数が、データレコードの課金回数の合計と異なる場合はエラー
//		if(chrgCntSumFlg && Integer.parseInt(recode[TRAILER_INDEX_CHRG_CNT_SUM]) != chrgCntSum)
//		{
//			// エラーログ:課金合計回数チェックエラー
//			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][checkTrailer][ファイル形式チェックエラー]");
//			// エラーを出力
//			setOutputMapError(inMap, outputItem, new String[DETA_COLUMN_CNT], ERRMSG_CHRG_CNT_SUM_CHK);
//			formatErrFlg = false;
//		}
		// レコード合計サマリ処理が開始されており、かつ、レコード合計件数が、データレコードの件数の合計と異なる場合はエラー
		// かつ、レコード合計件数が比較可能な状態の場合
		if(recodeCntSumFlg && Integer.parseInt(recode[TRAILER_INDEX_RECODE_CNT]) != recodeCntSum && recCntSumCompaFlg )
		{
			// エラーログ:レコード件数チェックエラー
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][checkTrailer][ファイル形式チェックエラー]");
			// エラーを出力
			setOutputMapError(inMap, outputItem, new String[DETA_COLUMN_CNT], ERRMSG_RECORD_CNT_SUM_CHK);
			formatErrFlg = false;
		}
		
		// 課金合計サマリ処理が開始されており、かつ、課金合計回数が、データレコードの課金回数の合計と異なる場合はエラー
		// かつ、課金合計回数が比較可能な状態の場合
		if(chrgCntSumFlg && Integer.parseInt(recode[TRAILER_INDEX_CHRG_CNT_SUM]) != chrgCntSum && chrgCntSumCompaFlg )
		{
			// エラーログ:課金合計回数チェックエラー
			assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[L][checkTrailer][ファイル形式チェックエラー]");
			// エラーを出力
			setOutputMapError(inMap, outputItem, new String[DETA_COLUMN_CNT], ERRMSG_CHRG_CNT_SUM_CHK);
			formatErrFlg = false;
		}
		// 2024/07/02 IT1-2024-0000017 上島 MOD END
		//エラーが存在する場合にはfalse
		if(!formatErrFlg){
			return false;
		}
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][checkTrailer]");
		return true;
	}
	
	/**
	 * データ部の単項目チェックを行います
	 * 
	 * @return true:正常終了 false:異常終了
	 * @throws Exception 
	 */
	private boolean checkDataFormat(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputItem, String[] value) throws Exception
	{
		// 設定値格納用
		String itemValue;
		// 項目名格納用
		String itemName;
		
		// レコード区分 
		itemValue = value[DETA_INDEX_RECODE_KBN];
		itemName = "レコード区分";
		
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 設定値無しはエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_NULL_CHK);
			return false;
		}
		else if (!HalfCharCheck.isEn1Check(itemValue))
		{
			// 属性チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_ATTRIBUTE_CHK);
			return false;
		}
		else if (!LengthCheck.isLength1Check(itemValue, 1))
		{
			// 桁数チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_LENGTH_CHK);
			return false;
		}
		
		// 事業者コード
		itemValue = value[DETA_INDEX_JIGYOSHA_CD];
		itemName = "事業者コード";
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 設定値無しはエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_NULL_CHK);
			return false;
		}
		else if (!HalfCharCheck.isNumber1Check(itemValue))
		{
			// 属性チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_ATTRIBUTE_CHK);
			return false;
		}
		else if (!LengthCheck.isLength1Check(itemValue, 4))
		{
			// 桁数チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_LENGTH_CHK);
			return false;
		}
		
		// データ作成日
		itemValue = value[DETA_INDEX_DATA_MAKE_YMD];
		itemName = "データ作成日";
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 設定値無しはエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_NULL_CHK);
			return false;
		}
		else if (!HalfCharCheck.isNumber1Check(itemValue))
		{
			// 属性チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_ATTRIBUTE_CHK);
			return false;
		}
		else if (!LengthCheck.isLength1Check(itemValue, 8))
		{
			// 桁数チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_LENGTH_CHK);
			return false;
		}
		
		// データ作成時刻
		itemValue = value[DETA_INDEX_DATA_MAKE_TIME];
		itemName = "データ作成時刻";
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 設定値無しはエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_NULL_CHK);
			return false;
		}
		else if (!HalfCharCheck.isNumber1Check(itemValue))
		{
			// 属性チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_ATTRIBUTE_CHK);
			return false;
		}
		else if (!LengthCheck.isLength1Check(itemValue, 6))
		{
			// 桁数チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_LENGTH_CHK);
			return false;
		}
		
		// レコード番号
		itemValue = value[DETA_INDEX_RECODE_NO];
		itemName = "レコード番号";
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 設定値無しはエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_NULL_CHK);
			return false;
		}
		else if (!HalfCharCheck.isNumber1Check(itemValue))
		{
			// 属性チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_ATTRIBUTE_CHK);
			return false;
		}
		else if (!LengthCheck.isLength1Check(itemValue, 8))
		{
			// 桁数チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_LENGTH_CHK);
			return false;
		}
		
		// 発信者電話番号
		itemValue = value[DETA_INDEX_HASINSHA_TELNO];
		itemName = "発信者電話番号";
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 設定値無しはエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_NULL_CHK);
			return false;
		}
		else if (!HalfCharCheck.isNumber1Check(itemValue))
		{
			// 属性チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_ATTRIBUTE_CHK);
			return false;
		}
		else if (!LengthCheck.isLength1Check(itemValue, 11))
		{
			// 桁数チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_LENGTH_CHK);
			return false;
		}
		
		// 着信電話番号
		itemValue = value[DETA_INDEX_INCOMING_TELNO];
		itemName = "着信電話番号";
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 設定値無しはエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_NULL_CHK);
			return false;
		}
		else if (!HalfCharCheck.isNumber2Check(itemValue))
		{
			// 属性チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_ATTRIBUTE_CHK);
			return false;
		}
		else if (!LengthCheck.isLength1Check(itemValue, 11))
		{
			// 桁数チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_LENGTH_CHK);
			return false;
		}
		
		// 発側エリアコード
		itemValue = value[DETA_INDEX_HASHIN_AREA_CD];
		itemName = "発側エリアコード";
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 設定値無しはエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_NULL_CHK);
			return false;
		}
		else if (!HalfCharCheck.isNumber1Check(itemValue))
		{
			// 属性チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_ATTRIBUTE_CHK);
			return false;
		}
		else if (!LengthCheck.isLength1Check(itemValue, 5))
		{
			// 桁数チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_LENGTH_CHK);
			return false;
		}
		
		// 着側エリアコード
		itemValue = value[DETA_INDEX_INCOMING_AREA_CD];
		itemName = "着側エリアコード";
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 設定値無しはエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_NULL_CHK);
			return false;
		}
		else if (!HalfCharCheck.isNumber1Check(itemValue))
		{
			// 属性チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_ATTRIBUTE_CHK);
			return false;
		}
		else if (!LengthCheck.isLength1Check(itemValue, 5))
		{
			// 桁数チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_LENGTH_CHK);
			return false;
		}
		
		// 課金回数
		itemValue = value[DETA_INDEX_CHRG_CNT];
		itemName = "課金回数";
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 設定値無しはエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_NULL_CHK);
			// 2024/07/02 IT1-2024-0000017 上島 ADD START
			//トレーラ部の合計比較検証不可能(課金合計数)
			chrgCntSumCompaFlg = false;
			// 2024/07/02 IT1-2024-0000017 上島 ADD END
			return false;
		}
		else if (!HalfCharCheck.isNumber1Check(itemValue))
		{
			// 属性チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_ATTRIBUTE_CHK);
			// 2024/07/02 IT1-2024-0000017 上島 ADD START
			//トレーラ部の合計比較検証不可能(課金合計数)
			chrgCntSumCompaFlg = false;
			// 2024/07/02 IT1-2024-0000017 上島 ADD END
			return false;
		}
		else if (!LengthCheck.isLength1Check(itemValue, 3))
		{
			// 桁数チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_LENGTH_CHK);
			// 2024/07/02 IT1-2024-0000017 上島 ADD START
			//トレーラ部の合計比較検証不可能(課金合計数)
			chrgCntSumCompaFlg = false;
			// 2024/07/02 IT1-2024-0000017 上島 ADD END
			return false;
		}
		
		// 発側開始日
		itemValue = value[DETA_INDEX_HASHIN_STA_YMD];
		itemName = "発側開始日";
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 設定値無しはエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_NULL_CHK);
			return false;
		}
		else if (!HalfCharCheck.isNumber1Check(itemValue))
		{
			// 属性チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_ATTRIBUTE_CHK);
			return false;
		}
		else if (!LengthCheck.isLength1Check(itemValue, 8))
		{
			// 桁数チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_LENGTH_CHK);
			return false;
		}
		
		// 発側開始時刻
		itemValue = value[DETA_INDEX_HASHIN_STA_TIME];
		itemName = "発側開始時刻";
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 設定値無しはエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_NULL_CHK);
			return false;
		}
		else if (!HalfCharCheck.isEnNumber2Check(itemValue))
		{
			// 属性チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_ATTRIBUTE_CHK);
			return false;
		}
		else if (!LengthCheck.isLength1Check(itemValue, 8))
		{
			// 桁数チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_LENGTH_CHK);
			return false;
		}
		
		// 発側終了日
		itemValue = value[DETA_INDEX_HASHIN_END_YMD];
		itemName = "発側終了日";
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 設定値無しはエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_NULL_CHK);
			return false;
		}
		else if (!HalfCharCheck.isNumber1Check(itemValue))
		{
			// 属性チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_ATTRIBUTE_CHK);
			return false;
		}
		else if (!LengthCheck.isLength1Check(itemValue, 8))
		{
			// 桁数チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_LENGTH_CHK);
			return false;
		}
		
		// 発側終了時刻
		itemValue = value[DETA_INDEX_HASHIN_END_TIME];
		itemName = "発側終了時刻";
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 設定値無しはエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_NULL_CHK);
			return false;
		}
		else if (!HalfCharCheck.isEnNumber2Check(itemValue))
		{
			// 属性チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_ATTRIBUTE_CHK);
			return false;
		}
		else if (!LengthCheck.isLength1Check(itemValue, 8))
		{
			// 桁数チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_LENGTH_CHK);
			return false;
		}
		
		// 着側開始日
		itemValue = value[DETA_INDEX_INCOMING_STA_YMD];
		itemName = "着側開始日";
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 設定値無しはエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_NULL_CHK);
			return false;
		}
		else if (!HalfCharCheck.isNumber1Check(itemValue))
		{
			// 属性チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_ATTRIBUTE_CHK);
			return false;
		}
		else if (!LengthCheck.isLength1Check(itemValue, 8))
		{
			// 桁数チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_LENGTH_CHK);
			return false;
		}
		
		// 着側開始時刻
		itemValue = value[DETA_INDEX_INCOMING_STA_TIME];
		itemName = "着側開始時刻";
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 設定値無しはエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_NULL_CHK);
			return false;
		}
		else if (!HalfCharCheck.isEnNumber2Check(itemValue))
		{
			// 属性チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_ATTRIBUTE_CHK);
			return false;
		}
		else if (!LengthCheck.isLength1Check(itemValue, 8))
		{
			// 桁数チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_LENGTH_CHK);
			return false;
		}
		
		// 着側終了日
		itemValue = value[DETA_INDEX_INCOMING_END_YMD];
		itemName = "着側終了日";
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 設定値無しはエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_NULL_CHK);
			return false;
		}
		else if (!HalfCharCheck.isNumber1Check(itemValue))
		{
			// 属性チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_ATTRIBUTE_CHK);
			return false;
		}
		else if (!LengthCheck.isLength1Check(itemValue, 8))
		{
			// 桁数チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_LENGTH_CHK);
			return false;
		}
		
		// 着側終了時刻
		itemValue = value[DETA_INDEX_INCOMING_END_TIME];
		itemName = "着側終了時刻";
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 設定値無しはエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_NULL_CHK);
			return false;
		}
		else if (!HalfCharCheck.isEnNumber2Check(itemValue))
		{
			// 属性チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_ATTRIBUTE_CHK);
			return false;
		}
		else if (!LengthCheck.isLength1Check(itemValue, 8))
		{
			// 桁数チェックエラー
			setOutputMapError(inMap, outputItem, value, itemName + ERRMSG_LENGTH_CHK);
			return false;
		}
		
		return true;
	}

	/**
	 * トレーラ部の単項目チェックを行います
	 * （本来すべてチェックするべきであるが、不要との事のため、最低限使用する項目のみチェックする）
	 * 
	 * @return true:正常終了 false:異常終了
	 * @throws Exception 
	 */
	private boolean checkTrailerFormat(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputItem, String[] value) throws Exception
	{
		// 設定値格納用
		String itemValue;
		// 項目名格納用
		String itemName;
		
		// レコード件数
		itemValue = value[TRAILER_INDEX_RECODE_CNT];
		itemName = "レコード件数";
		
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 設定値無しはエラー
			setOutputMapError(inMap, outputItem, new String[DETA_COLUMN_CNT], itemName + ERRMSG_NULL_CHK);
			return false;
		}
		else if (!HalfCharCheck.isNumber1Check(itemValue))
		{
			// 属性チェックエラー
			setOutputMapError(inMap, outputItem, new String[DETA_COLUMN_CNT], itemName + ERRMSG_ATTRIBUTE_CHK);
			return false;
		}
		else if (!LengthCheck.isLength1Check(itemValue, 8))
		{
			// 桁数チェックエラー
			setOutputMapError(inMap, outputItem, new String[DETA_COLUMN_CNT], itemName + ERRMSG_LENGTH_CHK);
			return false;
		}
		
		// 課金回数合計
		itemValue = value[TRAILER_INDEX_CHRG_CNT_SUM];
		itemName = "課金回数合計";
		if (JCHStringUtil.isNullBlank(itemValue))
		{
			// 設定値無しはエラー
			setOutputMapError(inMap, outputItem, new String[DETA_COLUMN_CNT], itemName + ERRMSG_NULL_CHK);
			return false;
		}
		else if (!HalfCharCheck.isNumber1Check(itemValue))
		{
			// 属性チェックエラー
			setOutputMapError(inMap, outputItem, new String[DETA_COLUMN_CNT], itemName + ERRMSG_ATTRIBUTE_CHK);
			return false;
		}
		else if (!LengthCheck.isLength1Check(itemValue, 10))
		{
			// 桁数チェックエラー
			setOutputMapError(inMap, outputItem, new String[DETA_COLUMN_CNT], itemName + ERRMSG_LENGTH_CHK);
			return false;
		}
		
		return true;
	}

	/**
	 * チェックで正常と判断したデータをファイルに出力します。
	 * 
	 * @param inMap 入力電文
	 * @param outputItem 出力電文
	 * @param value レコード
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void setOutputMapSucsess(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputItem, String[] value) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setOutputMapSucsess]");
		
		JBSbatServiceInterfaceMap outMap = new JBSbatServiceInterfaceMap();
		
		// システム年月日時分秒を取得
		String sys_date = JKKBatCommon.getSysDateTimeStamp();
		
		outMap.setString(JBSbatACIFM368.RECODE_KBN				, value[DETA_INDEX_RECODE_KBN]);			// レコード区分
		outMap.setString(JBSbatACIFM368.JIGYOSHA_CD				, value[DETA_INDEX_JIGYOSHA_CD]);			// 事業者コード
		outMap.setString(JBSbatACIFM368.DATA_MAKE_YMD			, value[DETA_INDEX_DATA_MAKE_YMD]);			// データ作成日
		outMap.setString(JBSbatACIFM368.DATA_MAKE_TIME			, value[DETA_INDEX_DATA_MAKE_TIME]);		// データ作成時刻
		outMap.setString(JBSbatACIFM368.RECODE_NO				, value[DETA_INDEX_RECODE_NO]);				// レコード番号
		outMap.setString(JBSbatACIFM368.HASINSHA_TELNO			, value[DETA_INDEX_HASINSHA_TELNO]);		// 発信者電話番号
		outMap.setString(JBSbatACIFM368.INCOMING_TELNO			, value[DETA_INDEX_INCOMING_TELNO]);		// 着信電話番号
		outMap.setString(JBSbatACIFM368.HASHIN_AREA_CD			, value[DETA_INDEX_HASHIN_AREA_CD]);		// 発側エリアコード
		outMap.setString(JBSbatACIFM368.INCOMING_AREA_CD		, value[DETA_INDEX_INCOMING_AREA_CD]);		// 着側エリアコード
		outMap.setString(JBSbatACIFM368.CHRG_CNT				, value[DETA_INDEX_CHRG_CNT]);				// 課金回数
		outMap.setString(JBSbatACIFM368.HASHIN_STA_YMD			, value[DETA_INDEX_HASHIN_STA_YMD]);		// 発側開始日
		outMap.setString(JBSbatACIFM368.HASHIN_STA_TIME			, value[DETA_INDEX_HASHIN_STA_TIME]);		// 発側開始時刻
		outMap.setString(JBSbatACIFM368.HASHIN_END_YMD			, value[DETA_INDEX_HASHIN_END_YMD]);		// 発側終了日
		outMap.setString(JBSbatACIFM368.HASHIN_END_TIME			, value[DETA_INDEX_HASHIN_END_TIME]);		// 発側終了時刻
		outMap.setString(JBSbatACIFM368.INCOMING_STA_YMD		, value[DETA_INDEX_INCOMING_STA_YMD]);		// 着側開始日
		outMap.setString(JBSbatACIFM368.INCOMING_STA_TIME		, value[DETA_INDEX_INCOMING_STA_TIME]);		// 着側開始時刻
		outMap.setString(JBSbatACIFM368.INCOMING_END_YMD		, value[DETA_INDEX_INCOMING_END_YMD]);		// 着側終了日
		outMap.setString(JBSbatACIFM368.INCOMING_END_TIME		, value[DETA_INDEX_INCOMING_END_TIME]);		// 着側終了時刻
		outMap.setString(JBSbatACIFM368.TELNO					, JACStrConst.KARA_MOJI);					// 電話番号
		outMap.setString(JBSbatACIFM368.KOJIN_HOJIN_TLN_TAI_CD	, JACStrConst.KARA_MOJI);					// 個人法人電話番号帯コード
		outMap.setString(JBSbatACIFM368.SVC_KEI_NO				, JACStrConst.KARA_MOJI);					// サービス契約
		outMap.setString(JBSbatACIFM368.SVC_STA_YMD				, JACStrConst.KARA_MOJI);					// サービス開始日
		outMap.setString(JBSbatACIFM368.SVC_END_YMD				, JACStrConst.KARA_MOJI);					// サービス終了日
		
		// 出力フラグ ← true
		outMap.setOutFlg(true);
		
		outputItem.addOutMapList(outMap);
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setOutputMapSucsess]");
	}
	
	/**
	 * チェックで異常と判断したデータをファイルに出力します。
	 * 
	 * @param errCd エラーコード
	 * @param errMsg エラー内容
	 * @param outputItem 出力電文
	 * @param seiky_kei_no 請求契約番号
	 * @param receipt_ymd 収納年月日
	 * @param nyukin_amnt 入金額
	 * @param sknksitkcm_cd 債権回収委託会社コード
	 * @param kiji 記事
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void setOutputMapError(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputItem, String[] value, String errMessage) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setOutputMapError]");
		JBSbatServiceInterfaceMap errMap = new JBSbatServiceInterfaceMap();
		
		errMap.setString(JBSbatACIFM367.SVC_KEI_NO			, JACStrConst.KARA_MOJI);											// サービス契約番号
		errMap.setString(JBSbatACIFM367.RECODE_NO			, JKKStringUtil.nullToBlank(value[DETA_INDEX_RECODE_NO]));			// レコード番号
		errMap.setString(JBSbatACIFM367.HASINSHA_TELNO		, JKKStringUtil.nullToBlank(value[DETA_INDEX_HASINSHA_TELNO]));		// 発信者電話番号
		errMap.setString(JBSbatACIFM367.CHRG_CNT			, JKKStringUtil.nullToBlank(value[DETA_INDEX_CHRG_CNT]));			// 課金回数
		errMap.setString(JBSbatACIFM367.HASHIN_STA_YMD		, JKKStringUtil.nullToBlank(value[DETA_INDEX_HASHIN_STA_YMD]));		// 発側開始日
		errMap.setString(JBSbatACIFM367.ERR_NAIYO			, errMessage);														// エラー内容
		
		// 出力フラグ ← true
		errMap.setOutFlg(true);
		
		outputItem.addOutMapList_2(errMap);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setOutputMapError]");
	}
	
	/**
	 * エラーファイルのヘッダ情報をファイルに出力します。
	 * 
	 * @param inMap 入力電文
	 * @param outputItem 出力電文
	 * @throws Exception 業務サービス内で発生した例外全般
	 */
	private void setOutputMapErrorHeader(JBSbatServiceInterfaceMap inMap, JBSbatOutputItem outputItem) throws Exception
	{
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[S][setOutputMapError]");
		JBSbatServiceInterfaceMap errMap = new JBSbatServiceInterfaceMap();
		
		errMap.setString(JBSbatACIFM367.SVC_KEI_NO			, "サービス契約番号");		// サービス契約番号
		errMap.setString(JBSbatACIFM367.RECODE_NO			, "レコード番号");			// レコード番号
		errMap.setString(JBSbatACIFM367.HASINSHA_TELNO		, "発信者電話番号");		// 発信者電話番号
		errMap.setString(JBSbatACIFM367.CHRG_CNT			, "課金回数");				// 課金回数
		errMap.setString(JBSbatACIFM367.HASHIN_STA_YMD		, "発側開始日");			// 発側開始日
		errMap.setString(JBSbatACIFM367.ERR_NAIYO			, "エラー内容");			// エラー内容
		
		// 出力フラグ ← true
		errMap.setOutFlg(true);
		
		outputItem.addOutMapList_2(errMap);
		
		assert JACbatDebugLogUtil.printDebugLog(super.logPrint, "[E][setOutputMapError]");
	}
}
