/*********************************************************************
*  All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名			：eo顧客基幹システム
*	モジュール名		：JBSbatACEmUseFixKoInfoDataChk
*	ソースファイル名	：JBSbatACEmUseFixKoInfoDataChk.java
*	作成者				：富士通　
*	作成日				：2012年08月23日
*＜機能概要＞
*　ＥＭ利用確定呼情報データチェック部品です。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v4.00.00	2012/09/09  FJ）東海林	【ANK-0143-00-00】新規作成
*	v4.00.01	2013/04/05  FJ) 小柴	【IKK-2013-0000783】文字化け対策のため、エンコード形式の変更
*	v5.00.00	2013/07/11  FJ) 狭間	【IT1-2013-0001363】（水平展開）lineToObjectの第三引数適正化
*********************************************************************/
package eo.business.service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import eo.business.common.JBSbatBusinessService;
import eo.business.util.file.JBSbatACIFM026;
import eo.business.util.file.JBSbatACIFM027;
import eo.business.util.file.JBSbatACIFM028;
import eo.business.util.file.JBSbatACIFM029;
import eo.business.util.table.JBSbatCH_M_PRC_SCHDL_TEIGI;
import eo.business.util.table.JBSbatZM_M_WORK_PARAM_KNRI;
import eo.common.constant.JACStrConst;
import eo.common.constant.JPCBatchMessageConstant;
import eo.framework.application.JBSbatBusinessException;
import eo.framework.db.JBSbatSQLAccess;
import eo.framework.file.JBSbatDefFileUtil;
import eo.framework.file.JBSbatInputFileUtil;
import eo.framework.item.JBSbatCommonDBInterface;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.item.JBSbatOutputItem;
import eo.framework.item.JBSbatServiceInterfaceMap;
import eo.framework.util.JBSbatAplConst;
import eo.framework.util.JBSbatCheckUtil;

/**
* (クラスの機能概要) <p>
*<BR>
* @author 富士通
*/
public class JBSbatACEmUseFixKoInfoDataChk extends JBSbatBusinessService
{
	/**▼▼▼▼▼▼ツールから生成した宣言です 開始▼▼▼▼▼▼*/
	/** テーブル(業務パラメータ管理)*/
	private static final String D_TBL_NAME_ZM_M_WORK_PARAM_KNRI = "ZM_M_WORK_PARAM_KNRI";

	/** テーブル(料金スケジュール定義)*/
	private static final String D_TBL_NAME_CH_M_PRC_SCHDL_TEIGI = "CH_M_PRC_SCHDL_TEIGI";

	/** SQL定義キー(AC_SELECT_001)*/
	private static final String ZM_M_WORK_PARAM_KNRI_AC_SELECT_001 = "AC_SELECT_001";

	/** SQL定義キー(AC_SELECT_003)*/
	private static final String CH_M_PRC_SCHDL_TEIGI_AC_SELECT_003 = "AC_SELECT_003";

	/** テーブルアクセスクラス(業務パラメータ管理)*/
	private JBSbatSQLAccess db_ZM_M_WORK_PARAM_KNRI = null;

	/** テーブルアクセスクラス(料金スケジュール定義)*/
	private JBSbatSQLAccess db_CH_M_PRC_SCHDL_TEIGI = null;

	/**▲▲▲▲▲▲ツールから生成した宣言です 終了▲▲▲▲▲▲*/

	/** 業務パラメータID（当日レコード重複エラー） */
	private String dblTjtRecErrMsg = null;

	/** 業務パラメータID（月次料金計算済エラー） */
	private String monPrcCalcErrMsg = null;

	/** 料金計算月 */
	private String prcCalcMon = null;

	/** 単項目チェックで使用する項目名Map */
	private HashMap<String, String> itemValueMap = null;

	/** FREE項目を格納する配列 */
	private String[] fleeItemArray = null;

	/** 当日レコード重複を検出するためのリスト */
	private List<List<String>> tjituRecDbleChkList = null;

	/** データ部件数 */
	private int dataCnt = 0;

	/** 入力ファイルオブジェクト */
	private JBSbatInputFileUtil inFileObj = null;

	/**
	 * 初期処理
	 * @param JBSbatCommonItem commonItem　バッチ共通パラメータ電文
	 * @throws Exception
	 */
	public void initial(JBSbatCommonItem commonItem) throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの初期処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した初期化のソースです 開始▼▼▼▼▼▼*/
		// 共通パラメータを設定します
		super.setCommonInfo(commonItem);

		// DBアクセスクラスを生成します
		db_ZM_M_WORK_PARAM_KNRI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_ZM_M_WORK_PARAM_KNRI);
		db_CH_M_PRC_SCHDL_TEIGI = new JBSbatSQLAccess(commonItem, D_TBL_NAME_CH_M_PRC_SCHDL_TEIGI);
		/**▲▲▲▲▲▲ツールから生成した初期化のソースです 終了▲▲▲▲▲▲*/
		// 業務パラメータID（当日レコード重複エラー）
		dblTjtRecErrMsg = getZmMWorkParamKnri(JACStrConst.WKPARA_AC_MSG_DBL_TJTRECERR);
		// 業務パラメータID（月次料金計算済エラー）
		monPrcCalcErrMsg = getZmMWorkParamKnri(JACStrConst.WKPARA_AC_MSG_MONPRCCALCERR);
		// 料金計算月の取得
		prcCalcMon = getSeikyYm();
		// 単項目チェックで使用する項目名
		itemValueMap = getItemValueMap();
		// ファイルディレクトリ(末尾にセパレータ付き);ヘッダファイル名;ヘッダファイル定義;トレーラファイル名;トレーラファイル定義
		fleeItemArray = super.freeItem.split(JACStrConst.FREE_DIV);
		// [0] : ファイルディレクトリ(末尾にセパレータ付き)
		// [1] : ヘッダファイル名
		// [2] : ヘッダファイル定義
		// ヘッダファイル取得
		JBSbatServiceInterfaceMap inMapHead = getInMap(fleeItemArray[0], fleeItemArray[1], fleeItemArray[2]);
		// レイアウトチェック(ヘッダ部単項目チェック)
		if (!isSingleCheckACIFM026(inMapHead.getMap(), itemValueMap))
		{
			// 単項目チェックでエラーが発生したため、処理を終了します。
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0500CE);
		}
		// レイアウトチェック(ファイル識別が"501"以外の場合)
		if (!inMapHead.getString(JBSbatACIFM026.FILE_SBT).equals(getZmMWorkParamKnri(JACStrConst.WKPARA_AC_EMKO_FILESBT)))
		{
			// ファイル種別エラー
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0510TH);
		}
		// レイアウトチェック(事業者識別コードが"KPT0000006"(KOPTコード)以外の場合)
		if (!inMapHead.getString(JBSbatACIFM026.JIGYOSHA_SKBT_CD).equals(getZmMWorkParamKnri(JACStrConst.WKPARA_AC_EMKO_JIGYOSKBTCD)))
		{
			// 事業者識別コードエラー
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0520TH);
		}
		/**▲▲▲▲▲▲業務サービスの初期処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 主処理
	 * @param inMap　入力電文
	 * @return JBSbatOutputItem　出力情報
	 * @throws Exception
	 */
	public JBSbatOutputItem execute(JBSbatServiceInterfaceMap inMap) throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの主処理を記述してください。▼▼▼▼▼▼*/
		// データ部件数＋１
		dataCnt++;
		// レイアウトチェック(データ部単項目チェック)
		if (!isSingleCheckACIFM027_INF1(inMap.getMap(), itemValueMap))
		{
			// 単項目チェックでエラーが発生したため、処理を終了します。
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0500CE);
		}
		// レコード重複チェックデータ
		List<String> recDbleChkData = Arrays.asList(inMap.getString(JBSbatACIFM027.EM_KEISHA_CD), inMap.getString(JBSbatACIFM027.TSUSHIN_USE_DAY));
		// 出力ファイル。
		JBSbatOutputItem outputBean = null;
		// レコード重複チェックリストがnullの場合
		if (tjituRecDbleChkList == null)
		{
			// レコード重複チェックリストを初期化
			tjituRecDbleChkList = new ArrayList<List<String>>();
		}
		// レコード重複チェックリストにレコード重複チェックデータが存在する場合。
		if (tjituRecDbleChkList.contains(recDbleChkData))
		{
			// 当日レコード重複エラー
			outputBean = getErrOutputBean(inMap, dblTjtRecErrMsg);
		}
		else
		{
			// レコード重複チェックリストにレコード重複チェックデータを追加する。
			tjituRecDbleChkList.add(recDbleChkData);
			if (prcCalcMon.compareTo(inMap.getString(JBSbatACIFM027.TSUSHIN_USE_DAY).substring(0, 6)) >= 0)
			{
				// 月次料金計算済エラー
				outputBean = getErrOutputBean(inMap, monPrcCalcErrMsg);
			}
			else
			{
				outputBean = new JBSbatOutputItem();
				JBSbatServiceInterfaceMap fileMap = new JBSbatServiceInterfaceMap();
				outputBean.addOutMapList(fileMap);
				fileMap.setOutFlg(true);
				// レコードタイプ
				fileMap.set(JBSbatACIFM027.REC_TYPE, 			inMap.getString(JBSbatACIFM027.REC_TYPE));
				// 再販事業者様管理コード（お客様ＩＤ）
				fileMap.set(JBSbatACIFM027.SIJGSHA_KANRI_CD, 	inMap.getString(JBSbatACIFM027.SIJGSHA_KANRI_CD));
				// ＭＳＩＳＤＮ
				fileMap.set(JBSbatACIFM027.MSISDN, 				inMap.getString(JBSbatACIFM027.MSISDN));
				// ＥＭ契約者コード
				fileMap.set(JBSbatACIFM027.EM_KEISHA_CD, 		inMap.getString(JBSbatACIFM027.EM_KEISHA_CD).trim());
				// 通信利用日
				fileMap.set(JBSbatACIFM027.TSUSHIN_USE_DAY, 	inMap.getString(JBSbatACIFM027.TSUSHIN_USE_DAY));
				// 利用バイト数
				fileMap.set(JBSbatACIFM027.USE_BYTE_CNT, 		inMap.getString(JBSbatACIFM027.USE_BYTE_CNT));
				// 予備
				fileMap.set(JBSbatACIFM027.YOBI, 				inMap.getString(JBSbatACIFM027.YOBI));
			}
		}

		return outputBean;
		/**▲▲▲▲▲▲業務サービスの主処理を記述してください。▲▲▲▲▲▲*/
	}

	/**
	 * 業務サービス終了処理
	 * @throws Exception
	 */
	public void terminal() throws Exception
	{
		/**▼▼▼▼▼▼業務サービスの終了処理を記述してください。▼▼▼▼▼▼*/
		/**▼▼▼▼▼▼ツールから生成した終了処理のソースです 開始▼▼▼▼▼▼*/
		// DBアクセスクラスをクローズします
		db_ZM_M_WORK_PARAM_KNRI.close();
		db_CH_M_PRC_SCHDL_TEIGI.close();
		/**▲▲▲▲▲▲ツールから生成した終了処理のソースです 終了▲▲▲▲▲▲*/
		// [0] : ファイルディレクトリ(末尾にセパレータ付き)
		// [3] : トレーラファイル名
		// [4] : トレーラファイル定義
		// トレーラファイル取得
		JBSbatServiceInterfaceMap inMapTrail = getInMap(fleeItemArray[0], fleeItemArray[3], fleeItemArray[4]);
		// レイアウトチェック(トレーラ部単項目チェック)
		if (!isSingleCheckACIFM028(inMapTrail.getMap(), itemValueMap))
		{
			// 単項目チェックでエラーが発生したため、処理を終了します。
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0500CE);
		}
		// データ件数チェック
		if (!String.valueOf(dataCnt).equals(inMapTrail.getString(JBSbatACIFM028.DATA_REC_CNT)))
		{
			throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0490TE);
		}
		/**▲▲▲▲▲▲業務サービスの終了処理を記述してください。▲▲▲▲▲▲*/
	}

	/**▼▼▼▼▼▼ツールから生成したメソッドです 開始▼▼▼▼▼▼*/
	/**
	 *入力情報（ＥＭ利用呼情報【ヘッダ部】）の単項目チェックを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.単項目チェックを行います。<br>
	 * 
	 * 2.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		rsMap:(項目、値)を(key、value)として、データをrsMapに入れます
	 *		itemvalueMap:埋め込み文字の値をitemvalueMapに入れます。キーの値は、以下に説明します。
	 *			 TXT-ACIFM026-.REC_TYPE			ＥＭ利用呼情報【ヘッダ部】.レコードタイプ
	 *			 TXT-ACIFM026-.REC_TYPE			ＥＭ利用呼情報【ヘッダ部】.レコードタイプ
	 *			 TXT-ACIFM026-.REC_TYPE			ＥＭ利用呼情報【ヘッダ部】.レコードタイプ
	 *			 TXT-ACIFM026-.FILE_SBT			ＥＭ利用呼情報【ヘッダ部】.ファイル種別
	 *			 TXT-ACIFM026-.FILE_SBT			ＥＭ利用呼情報【ヘッダ部】.ファイル種別
	 *			 TXT-ACIFM026-.FILE_SBT			ＥＭ利用呼情報【ヘッダ部】.ファイル種別
	 *			 TXT-ACIFM026-.FILE_SAKSEI_YMD			ＥＭ利用呼情報【ヘッダ部】.ファイル作成年月日
	 *			 TXT-ACIFM026-.FILE_SAKSEI_YMD			ＥＭ利用呼情報【ヘッダ部】.ファイル作成年月日
	 *			 TXT-ACIFM026-.FILE_SAKSEI_YMD			ＥＭ利用呼情報【ヘッダ部】.ファイル作成年月日
	 *			 TXT-ACIFM026-.JIGYOSHA_SKBT_CD			ＥＭ利用呼情報【ヘッダ部】.事業者識別コード
	 *			 TXT-ACIFM026-.JIGYOSHA_SKBT_CD			ＥＭ利用呼情報【ヘッダ部】.事業者識別コード
	 *			 TXT-ACIFM026-.JIGYOSHA_SKBT_CD			ＥＭ利用呼情報【ヘッダ部】.事業者識別コード
	 * </pre>
	 * <p>
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap。
	 * @param itemvalueMap エラーメッセージに関する項目値を格納されたHashMap。
	 * @return  boolean trueである場合、エラーがありません。falseである場合、エラーを発生しました。
	 */
	private boolean isSingleCheckACIFM026(HashMap rsMap, HashMap itemvalueMap)
	{
		// 単項目チェックを行います
		String strValue = null;

		// レコードタイプ項目チェック
		strValue = (String)rsMap.get("REC_TYPE");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0450CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM026-.REC_TYPE")});
			return false;
		}
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "2"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0470CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM026-.REC_TYPE")});
			return false;
		}
		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM026-.REC_TYPE")});
			return false;
		}

		// ファイル種別項目チェック
		strValue = (String)rsMap.get("FILE_SBT");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0450CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM026-.FILE_SBT")});
			return false;
		}
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "3"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0470CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM026-.FILE_SBT")});
			return false;
		}
		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM026-.FILE_SBT")});
			return false;
		}

		// ファイル作成年月日項目チェック
		strValue = (String)rsMap.get("FILE_SAKSEI_YMD");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0450CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM026-.FILE_SAKSEI_YMD")});
			return false;
		}
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "8"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0470CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM026-.FILE_SAKSEI_YMD")});
			return false;
		}
		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"year_month_day1"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0480CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM026-.FILE_SAKSEI_YMD")});
			return false;
		}

		// 事業者識別コード項目チェック
		strValue = (String)rsMap.get("JIGYOSHA_SKBT_CD");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0450CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM026-.JIGYOSHA_SKBT_CD")});
			return false;
		}
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "10"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0470CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM026-.JIGYOSHA_SKBT_CD")});
			return false;
		}
		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM026-.JIGYOSHA_SKBT_CD")});
			return false;
		}

		return true;
	}

	/**
	 *入力情報（ＥＭ利用呼情報 【データ部】）の単項目チェックを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.単項目チェックを行います。<br>
	 * 
	 * 2.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		rsMap:(項目、値)を(key、value)として、データをrsMapに入れます
	 *		itemvalueMap:埋め込み文字の値をitemvalueMapに入れます。キーの値は、以下に説明します。
	 *			 TXT-ACIFM027-INF1.REC_TYPE			ＥＭ利用呼情報 【データ部】.レコードタイプ
	 *			 TXT-ACIFM027-INF1.REC_TYPE			ＥＭ利用呼情報 【データ部】.レコードタイプ
	 *			 TXT-ACIFM027-INF1.REC_TYPE			ＥＭ利用呼情報 【データ部】.レコードタイプ
	 *			 TXT-ACIFM027-INF1.SIJGSHA_KANRI_CD			ＥＭ利用呼情報 【データ部】.再販事業者様管理コード
	 *			 TXT-ACIFM027-INF1.SIJGSHA_KANRI_CD			ＥＭ利用呼情報 【データ部】.再販事業者様管理コード
	 *			 TXT-ACIFM027-INF1.MSISDN			ＥＭ利用呼情報 【データ部】.ＭＳＩＳＤＮ
	 *			 TXT-ACIFM027-INF1.MSISDN			ＥＭ利用呼情報 【データ部】.ＭＳＩＳＤＮ
	 *			 TXT-ACIFM027-INF1.MSISDN			ＥＭ利用呼情報 【データ部】.ＭＳＩＳＤＮ
	 *			 TXT-ACIFM027-INF1.EM_KEISHA_CD			ＥＭ利用呼情報 【データ部】.ＥＭ契約者コード
	 *			 TXT-ACIFM027-INF1.EM_KEISHA_CD			ＥＭ利用呼情報 【データ部】.ＥＭ契約者コード
	 *			 TXT-ACIFM027-INF1.EM_KEISHA_CD			ＥＭ利用呼情報 【データ部】.ＥＭ契約者コード
	 *			 TXT-ACIFM027-INF1.TSUSHIN_USE_DAY			ＥＭ利用呼情報 【データ部】.通信利用日
	 *			 TXT-ACIFM027-INF1.TSUSHIN_USE_DAY			ＥＭ利用呼情報 【データ部】.通信利用日
	 *			 TXT-ACIFM027-INF1.TSUSHIN_USE_DAY			ＥＭ利用呼情報 【データ部】.通信利用日
	 *			 TXT-ACIFM027-INF1.USE_BYTE_CNT			ＥＭ利用呼情報 【データ部】.利用バイト数
	 *			 TXT-ACIFM027-INF1.USE_BYTE_CNT			ＥＭ利用呼情報 【データ部】.利用バイト数
	 *			 TXT-ACIFM027-INF1.USE_BYTE_CNT			ＥＭ利用呼情報 【データ部】.利用バイト数
	 *			 TXT-ACIFM027-INF1.YOBI			ＥＭ利用呼情報 【データ部】.予備
	 *			 TXT-ACIFM027-INF1.YOBI			ＥＭ利用呼情報 【データ部】.予備
	 * </pre>
	 * <p>
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap。
	 * @param itemvalueMap エラーメッセージに関する項目値を格納されたHashMap。
	 * @return  boolean trueである場合、エラーがありません。falseである場合、エラーを発生しました。
	 */
	private boolean isSingleCheckACIFM027_INF1(HashMap rsMap, HashMap itemvalueMap)
	{
		// 単項目チェックを行います
		String strValue = null;

		// レコードタイプ項目チェック
		strValue = (String)rsMap.get("REC_TYPE");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0450CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM027-INF1.REC_TYPE")});
			return false;
		}
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "2"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0470CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM027-INF1.REC_TYPE")});
			return false;
		}
		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM027-INF1.REC_TYPE")});
			return false;
		}

		// 再販事業者様管理コード項目チェック
		strValue = (String)rsMap.get("SIJGSHA_KANRI_CD");
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "20"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0470CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM027-INF1.SIJGSHA_KANRI_CD")});
			return false;
		}
		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM027-INF1.SIJGSHA_KANRI_CD")});
			return false;
		}

		// ＭＳＩＳＤＮ項目チェック
		strValue = (String)rsMap.get("MSISDN");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0450CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM027-INF1.MSISDN")});
			return false;
		}
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "11"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0470CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM027-INF1.MSISDN")});
			return false;
		}
		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakusuuji1"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM027-INF1.MSISDN")});
			return false;
		}

		// ＥＭ契約者コード項目チェック
		strValue = (String)rsMap.get("EM_KEISHA_CD");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0450CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM027-INF1.EM_KEISHA_CD")});
			return false;
		}
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "10"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0470CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM027-INF1.EM_KEISHA_CD")});
			return false;
		}
		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakusuuji1"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM027-INF1.EM_KEISHA_CD")});
			return false;
		}

		// 通信利用日項目チェック
		strValue = (String)rsMap.get("TSUSHIN_USE_DAY");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0450CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM027-INF1.TSUSHIN_USE_DAY")});
			return false;
		}
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "8"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0470CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM027-INF1.TSUSHIN_USE_DAY")});
			return false;
		}
		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"year_month_day1"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0480CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM027-INF1.TSUSHIN_USE_DAY")});
			return false;
		}

		// 利用バイト数項目チェック
		strValue = (String)rsMap.get("USE_BYTE_CNT");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0450CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM027-INF1.USE_BYTE_CNT")});
			return false;
		}
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "19"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0470CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM027-INF1.USE_BYTE_CNT")});
			return false;
		}
		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakusuuji1"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM027-INF1.USE_BYTE_CNT")});
			return false;
		}

		// 予備項目チェック
		strValue = (String)rsMap.get("YOBI");
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "50"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0470CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM027-INF1.YOBI")});
			return false;
		}
		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM027-INF1.YOBI")});
			return false;
		}

		return true;
	}

	/**
	 *入力情報（ＥＭ利用呼情報【トレーラ部】）の単項目チェックを行います。<br>
	 * <p>
	 * <b>処理フロー</b><br>
	 * <pre>
	 * 1.単項目チェックを行います。<br>
	 * 
	 * 2.メソッドの呼び出し方です。<br>
	 *		引数:
	 *		rsMap:(項目、値)を(key、value)として、データをrsMapに入れます
	 *		itemvalueMap:埋め込み文字の値をitemvalueMapに入れます。キーの値は、以下に説明します。
	 *			 TXT-ACIFM028-.REC_TYPE			ＥＭ利用呼情報【トレーラ部】.レコードタイプ
	 *			 TXT-ACIFM028-.REC_TYPE			ＥＭ利用呼情報【トレーラ部】.レコードタイプ
	 *			 TXT-ACIFM028-.REC_TYPE			ＥＭ利用呼情報【トレーラ部】.レコードタイプ
	 *			 TXT-ACIFM028-.DATA_REC_CNT			ＥＭ利用呼情報【トレーラ部】.データレコード件数
	 *			 TXT-ACIFM028-.DATA_REC_CNT			ＥＭ利用呼情報【トレーラ部】.データレコード件数
	 *			 TXT-ACIFM028-.DATA_REC_CNT			ＥＭ利用呼情報【トレーラ部】.データレコード件数
	 * </pre>
	 * <p>
	 * @param rsMap 入力データ（TXT又はDB）を格納されたHashMap。
	 * @param itemvalueMap エラーメッセージに関する項目値を格納されたHashMap。
	 * @return  boolean trueである場合、エラーがありません。falseである場合、エラーを発生しました。
	 */
	private boolean isSingleCheckACIFM028(HashMap rsMap, HashMap itemvalueMap)
	{
		// 単項目チェックを行います
		String strValue = null;

		// レコードタイプ項目チェック
		strValue = (String)rsMap.get("REC_TYPE");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0450CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM028-.REC_TYPE")});
			return false;
		}
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "2"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0470CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM028-.REC_TYPE")});
			return false;
		}
		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM028-.REC_TYPE")});
			return false;
		}

		// データレコード件数項目チェック
		strValue = (String)rsMap.get("DATA_REC_CNT");
		// 必須チェック
		if(strValue == null || "".equals(strValue))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0450CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM028-.DATA_REC_CNT")});
			return false;
		}
		// 桁数チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "9"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0470CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM028-.DATA_REC_CNT")});
			return false;
		}
		// 属性チェック
		if(!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakusuuji1"}))
		{
			commonItem.getLogPrint().printBusinessErrorLog("EACB0460CE", new String[]{
															(String)itemvalueMap.get("TXT-ACIFM028-.DATA_REC_CNT")});
			return false;
		}

		return true;
	}

	/**
	 * SQLKEY(AC_SELECT_001)で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 executeZM_M_WORK_PARAM_KNRI_AC_SELECT_001(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());
		paramList.setValue(param[2].toString());

		// DBアクセスを実行します
		db_ZM_M_WORK_PARAM_KNRI.selectBySqlDefine(paramList, ZM_M_WORK_PARAM_KNRI_AC_SELECT_001);
	}

	/**
	 * SQLKEY(AC_SELECT_003)で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_SCHDL_TEIGI_AC_SELECT_003(Object[] param) throws Exception
	{
		// バイント変数のリストを生成します
		JBSbatCommonDBInterface paramList = new JBSbatCommonDBInterface();
		paramList.setValue(param[0].toString());
		paramList.setValue(param[1].toString());

		// DBアクセスを実行します
		db_CH_M_PRC_SCHDL_TEIGI.selectBySqlDefine(paramList, CH_M_PRC_SCHDL_TEIGI_AC_SELECT_003);
	}
	/**▲▲▲▲▲▲ツールから生成したメソッドです 終了▲▲▲▲▲▲*/

	/**
	 * 単項目チェック用項目名Map。
	 * 
	 * @return 単項目チェックで使用する項目名Map
	 */
	private HashMap<String, String> getItemValueMap()
	{
		HashMap<String, String> retMap = new HashMap<String, String>();
		retMap.put("TXT-ACIFM026-.REC_TYPE", 				"ＥＭ利用呼情報【ヘッダ部】.レコードタイプ");
		retMap.put("TXT-ACIFM026-.FILE_SBT", 				"ＥＭ利用呼情報【ヘッダ部】.ファイル種別");
		retMap.put("TXT-ACIFM026-.FILE_SAKSEI_YMD",			"ＥＭ利用呼情報【ヘッダ部】.ファイル作成年月日");
		retMap.put("TXT-ACIFM026-.JIGYOSHA_SKBT_CD",		"ＥＭ利用呼情報【ヘッダ部】.事業者識別コード");

		retMap.put("TXT-ACIFM027-INF1.REC_TYPE", 			"ＥＭ利用呼情報 【データ部】.レコードタイプ");
		retMap.put("TXT-ACIFM027-INF1.SIJGSHA_KANRI_CD", 	"ＥＭ利用呼情報 【データ部】.再販事業者様管理コード");
		retMap.put("TXT-ACIFM027-INF1.MSISDN", 				"ＥＭ利用呼情報 【データ部】.ＭＳＩＳＤＮ");
		retMap.put("TXT-ACIFM027-INF1.EM_KEISHA_CD", 		"ＥＭ利用呼情報 【データ部】.ＥＭ契約者コード");
		retMap.put("TXT-ACIFM027-INF1.TSUSHIN_USE_DAY", 	"ＥＭ利用呼情報 【データ部】.通信利用日");
		retMap.put("TXT-ACIFM027-INF1.USE_BYTE_CNT", 		"ＥＭ利用呼情報 【データ部】.利用バイト数");
		retMap.put("TXT-ACIFM027-INF1.YOBI", 				"ＥＭ利用呼情報 【データ部】.予備");

		retMap.put("TXT-ACIFM028-.REC_TYPE", 				"ＥＭ利用呼情報【トレーラ部】.レコードタイプ");
		retMap.put("TXT-ACIFM028-.DATA_REC_CNT", 			"ＥＭ利用呼情報【トレーラ部】.データレコード件数");

		return retMap;
	}

	/**
	 * エラー時のファイル書き込み共通。
	 * 
	 * @param inMap 入力電文
	 * @param errorMessage エラーメッセージ
	 * @return 出力電文
	 * @throws Exception スローされる例外
	 */
	private JBSbatOutputItem getErrOutputBean(JBSbatServiceInterfaceMap inMap, String errorMessage) throws Exception
	{
		JBSbatOutputItem outputBean = new JBSbatOutputItem();
		JBSbatServiceInterfaceMap fileMap = new JBSbatServiceInterfaceMap();
		outputBean.addOutMapList_2(fileMap);
		fileMap.setOutFlg(true);
		// レコードタイプ
		fileMap.set(JBSbatACIFM029.REC_TYPE, 			inMap.getString(JBSbatACIFM027.REC_TYPE));
		// 再販事業者様管理コード（お客様ＩＤ）
		fileMap.set(JBSbatACIFM029.SIJGSHA_KANRI_CD, 	inMap.getString(JBSbatACIFM027.SIJGSHA_KANRI_CD));
		// ＭＳＩＳＤＮ
		fileMap.set(JBSbatACIFM029.MSISDN, 				inMap.getString(JBSbatACIFM027.MSISDN));
		// ＥＭ契約者コード
		fileMap.set(JBSbatACIFM029.EM_KEISHA_CD, 		inMap.getString(JBSbatACIFM027.EM_KEISHA_CD).trim());
		// 通信利用日
		fileMap.set(JBSbatACIFM029.TSUSHIN_USE_DAY, 	inMap.getString(JBSbatACIFM027.TSUSHIN_USE_DAY));
		// 利用バイト数
		fileMap.set(JBSbatACIFM029.USE_BYTE_CNT, 		inMap.getString(JBSbatACIFM027.USE_BYTE_CNT));
		// 予備
		fileMap.set(JBSbatACIFM029.YOBI, 				inMap.getString(JBSbatACIFM027.YOBI));
		// エラー内容
		fileMap.set(JBSbatACIFM029.ERR_NAIYO, 			errorMessage);

		return outputBean;
	}

	/**
	 * 請求年月取得。
	 * 
	 * @return 請求年月
	 * @throws Exception スローされる例外
	 */
	private String getSeikyYm() throws Exception
	{
		// 料金スケジュール定義
		executeCH_M_PRC_SCHDL_TEIGI_AC_SELECT_003(new Object[] { JACStrConst.EVENT_CD_PRC_CALC_DAY, super.opeDate });
		JBSbatCommonDBInterface record = db_CH_M_PRC_SCHDL_TEIGI.selectNext();
		if (record.getString(JBSbatCH_M_PRC_SCHDL_TEIGI.SEIKY_YM) == null)
		{
			throwJBSbatBusinessException(JBSbatCH_M_PRC_SCHDL_TEIGI.TABLE_NAME);
		}

		return record.getString(JBSbatCH_M_PRC_SCHDL_TEIGI.SEIKY_YM);
	}

	/**
	 * ファイル取得。<p>
	 * 
	 * 入力電文と同様、JBSbatServiceInterfaceMap を返す。<br>
	 * エンコードはShift-JIS、読み込み位置は1行目固定<br>
	 * ループ(主処理を含む)で使用しない。使用したファイルのクローズまで行う。
	 * 
	 * @param fileDir ディレクトリ
	 * @param fileName ファイル名
	 * @param fileDef ファイル定義
	 * @return ファイル定義型(JBSbatServiceInterfaceMap)で受け取ったファイルの一行
	 * @throws Exception スローされる例外
	 */
	private JBSbatServiceInterfaceMap getInMap(String fileDir, String fileName, String fileDef) throws Exception
	{
		inFileObj = new JBSbatInputFileUtil(fileDir + fileName);
		inFileObj.setEncode(JACStrConst.ENCODE_MS932);
		inFileObj.createReader();
		JBSbatServiceInterfaceMap retInMap = new JBSbatDefFileUtil(JBSbatAplConst.getAplConstValue("IND") + fileDef, inFileObj).lineToObject(
						inFileObj.readLine(), inFileObj, 0);
		// ファイルのクローズを行う
		if (this.inFileObj != null)
		{
			this.inFileObj.close();
			this.inFileObj = null;
		}

		return retInMap;
	}

	/**
	 * 業務パラメタ取得。
	 * 
	 * @param constParam 業務パラメタID
	 * @return 業務パラメタ設定値
	 * @throws Exception スローされる例外
	 */
	private String getZmMWorkParamKnri(String constParam) throws Exception
	{
		executeZM_M_WORK_PARAM_KNRI_AC_SELECT_001(new Object[] { constParam, super.opeDate, super.opeDate });
		JBSbatCommonDBInterface record = db_ZM_M_WORK_PARAM_KNRI.selectNext();
		if (record == null)
		{
			throwJBSbatBusinessException(JBSbatZM_M_WORK_PARAM_KNRI.TABLE_NAME);
		}

		return record.getString(JBSbatZM_M_WORK_PARAM_KNRI.WORK_PARAM_SETTE_VALUE);
	}

	/**
	 * 業務例外をスローする。
	 * 
	 * @param replaceMessage 置換文字列
	 * @throws Exception スローされる例外
	 */
	private void throwJBSbatBusinessException(String replaceMessage) throws Exception
	{
		// ｢%1%のデータが取得できないため、処理を終了します。｣
		throw new JBSbatBusinessException(JPCBatchMessageConstant.EACB0440CE, new String[] { replaceMessage });
	}
}
